From d3e97485cbde5df96c4295a261957b15035326cc Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:12:06 +0100 Subject: [PATCH 001/254] feat: Create LeftHanded.lean --- .../Relativity/Fermions/Weyl/LeftHanded.lean | 166 ++++++++++++++++++ .../Tensors/ComplexTensor/Weyl/Basic.lean | 77 -------- .../Tensors/ComplexTensor/Weyl/Modules.lean | 52 ------ 3 files changed, 166 insertions(+), 129 deletions(-) create mode 100644 Physlib/Relativity/Fermions/Weyl/LeftHanded.lean diff --git a/Physlib/Relativity/Fermions/Weyl/LeftHanded.lean b/Physlib/Relativity/Fermions/Weyl/LeftHanded.lean new file mode 100644 index 000000000..f324e55b5 --- /dev/null +++ b/Physlib/Relativity/Fermions/Weyl/LeftHanded.lean @@ -0,0 +1,166 @@ +/- +Copyright (c) 2026 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 Mathlib.Analysis.Complex.Basic +public import Physlib.Meta.TODO.Basic +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Meta.Informal.Basic +public import Physlib.Meta.TODO.Basic +/-! + +## Left handed Weyl fermions + + +In this file we define Left handed Weyl fermions. +These sit in the fundamental repsentation of `SL(2,ℂ)`, +and we consider them to have up indices `ψ^α` with `α = 1,2`. + +-/ + +@[expose] public section + +namespace Fermion +noncomputable section + +section LeftHanded + +/-- The module in which left handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ +structure LeftHandedWeyl where + /-- The underlying value in `Fin 2 → ℂ`. -/ + val : Fin 2 → ℂ + +namespace LeftHandedWeyl +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct + +/-! + +## Underlying module structure + +-/ + +/-- The equivalence between `LeftHandedWeyl` and `Fin 2 → ℂ`. -/ +def toFin2ℂFun : LeftHandedWeyl ≃ (Fin 2 → ℂ) where + toFun v := v.val + invFun f := ⟨f⟩ + left_inv _ := rfl + right_inv _ := rfl + +/-- The instance of `AddCommMonoid` on `LeftHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommMonoid LeftHandedWeyl := Equiv.addCommMonoid toFin2ℂFun + +/-- The instance of `AddCommGroup` on `LeftHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommGroup LeftHandedWeyl := Equiv.addCommGroup toFin2ℂFun + +/-- The instance of `Module` on `LeftHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : Module ℂ LeftHandedWeyl := Equiv.module ℂ toFin2ℂFun + +/-- The linear equivalence between `LeftHandedWeyl` and `(Fin 2 → ℂ)`. -/ +@[simps!] +def toFin2ℂEquiv : LeftHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where + toFun := toFin2ℂFun + map_add' := fun _ _ => rfl + map_smul' := fun _ _ => rfl + invFun := toFin2ℂFun.symm + left_inv := fun _ => rfl + right_inv := fun _ => rfl + +/-- The underlying element of `Fin 2 → ℂ` of a element in `LeftHandedWeyl` defined + through the linear equivalence `toFin2ℂEquiv`. -/ +abbrev toFin2ℂ (ψ : LeftHandedWeyl) := toFin2ℂEquiv ψ + +lemma toFin2ℂ_eq_val (ψ : LeftHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl + +/-! + +## Basis + +-/ + +/-- The standard basis on left-handed Weyl fermions. -/ +def basis : Basis (Fin 2) ℂ LeftHandedWeyl := Basis.ofEquivFun + (Equiv.linearEquiv ℂ LeftHandedWeyl.toFin2ℂFun) + +lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by + simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, + EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, + LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, + Equiv.addEquiv_symm_apply] + change Pi.single i 1 j = _ + simp [Pi.single_apply] + +lemma eq_sum_basis (ψ : LeftHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by + conv_lhs => rw [← basis.sum_repr ψ] + rfl + +lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by + ext j + simp [basis_apply, Pi.single_apply] + +/-! + +## Representation + +-/ + +/-- The vector space ℂ^2 carrying the fundamental representation of SL(2,C). + In index notation corresponds to a Weyl fermion with indices ψ^a. -/ +def rep : Representation ℂ SL(2,ℂ) LeftHandedWeyl where + toFun := fun M => { + toFun := fun (ψ : LeftHandedWeyl) => + LeftHandedWeyl.toFin2ℂEquiv.symm (M.1 *ᵥ ψ.toFin2ℂ), + map_add' := by + intro ψ ψ' + simp [mulVec_add] + map_smul' := by + intro r ψ + simp [mulVec_smul]} + map_one' := by + ext i + simp + map_mul' := fun M N => by + simp only [SpecialLinearGroup.coe_mul] + ext1 x + simp only [LinearMap.coe_mk, AddHom.coe_mk, Module.End.mul_apply, LinearEquiv.apply_symm_apply, + mulVec_mulVec] + +lemma rep_apply (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : rep M ψ = ⟨M.1 *ᵥ ψ.1⟩ := rfl + +lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : + rep M ψ = ∑ i, (∑ j, M.1 i j * ψ.1 j) • basis i := by + rw [eq_sum_basis (rep M ψ)] + rfl + +lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : + rep M (basis i) = ∑ j, M.1 j i • basis j := by + rw [rep_apply_eq_sum_basis] + congr + funext j + simp [basis_apply] + +lemma rep_toMatrix (M : SL(2,ℂ)) : (LinearMap.toMatrix basis basis) (rep M) = M.1 := by + ext i j + rw [LinearMap.toMatrix_apply] + simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] + change (M.1 *ᵥ (Pi.single j 1)) i = _ + simp + +lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : + basis.repr (rep M (basis i)) j = M.1 j i := by + fin_cases j <;> simp [rep_apply_basis] + +end LeftHandedWeyl + +end LeftHanded + +end +end Fermion diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean index c8f4007b6..b9ba08b6b 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean @@ -28,83 +28,6 @@ open MatrixGroups open Complex open TensorProduct -/-! - -## Left-handed Weyl fermions - --/ - -namespace LeftHandedWeyl - -/-- The standard basis on left-handed Weyl fermions. -/ -def basis : Basis (Fin 2) ℂ LeftHandedWeyl := Basis.ofEquivFun - (Equiv.linearEquiv ℂ LeftHandedWeyl.toFin2ℂFun) - -lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by - simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, - EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, - LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, - Equiv.addEquiv_symm_apply] - change Pi.single i 1 j = _ - simp [Pi.single_apply] - -lemma eq_sum_basis (ψ : LeftHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by - conv_lhs => rw [← basis.sum_repr ψ] - rfl - -lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by - ext j - simp [basis_apply, Pi.single_apply] - -/-- The vector space ℂ^2 carrying the fundamental representation of SL(2,C). - In index notation corresponds to a Weyl fermion with indices ψ^a. -/ -def rep : Representation ℂ SL(2,ℂ) LeftHandedWeyl where - toFun := fun M => { - toFun := fun (ψ : LeftHandedWeyl) => - LeftHandedWeyl.toFin2ℂEquiv.symm (M.1 *ᵥ ψ.toFin2ℂ), - map_add' := by - intro ψ ψ' - simp [mulVec_add] - map_smul' := by - intro r ψ - simp [mulVec_smul]} - map_one' := by - ext i - simp - map_mul' := fun M N => by - simp only [SpecialLinearGroup.coe_mul] - ext1 x - simp only [LinearMap.coe_mk, AddHom.coe_mk, Module.End.mul_apply, LinearEquiv.apply_symm_apply, - mulVec_mulVec] - -lemma rep_apply (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : rep M ψ = ⟨M.1 *ᵥ ψ.1⟩ := rfl - -lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : - rep M ψ = ∑ i, (∑ j, M.1 i j * ψ.1 j) • basis i := by - rw [eq_sum_basis (rep M ψ)] - rfl - -lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : - rep M (basis i) = ∑ j, M.1 j i • basis j := by - rw [rep_apply_eq_sum_basis] - congr - funext j - simp [basis_apply] - -lemma rep_toMatrix (M : SL(2,ℂ)) : (LinearMap.toMatrix basis basis) (rep M) = M.1 := by - ext i j - rw [LinearMap.toMatrix_apply] - simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] - change (M.1 *ᵥ (Pi.single j 1)) i = _ - simp - -lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : - basis.repr (rep M (basis i)) j = M.1 j i := by - fin_cases j <;> simp [rep_apply_basis] - -end LeftHandedWeyl - - /-! ## Dual Left-handed Weyl fermions diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean index 3ff1a9408..8e789994e 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean @@ -26,58 +26,6 @@ types of fermions. namespace Fermion noncomputable section -TODO "Make a directory in ./Physlib/Relativity called Fermions for these files. - Make this file (currently ..../Modules.lean) the Basic file, and include the basic module - definitions for the different types of Weyl fermions." - -section LeftHanded - -/-- The module in which left handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ -structure LeftHandedWeyl where - /-- The underlying value in `Fin 2 → ℂ`. -/ - val : Fin 2 → ℂ - -namespace LeftHandedWeyl - -/-- The equivalence between `LeftHandedWeyl` and `Fin 2 → ℂ`. -/ -def toFin2ℂFun : LeftHandedWeyl ≃ (Fin 2 → ℂ) where - toFun v := v.val - invFun f := ⟨f⟩ - left_inv _ := rfl - right_inv _ := rfl - -/-- The instance of `AddCommMonoid` on `LeftHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommMonoid LeftHandedWeyl := Equiv.addCommMonoid toFin2ℂFun - -/-- The instance of `AddCommGroup` on `LeftHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommGroup LeftHandedWeyl := Equiv.addCommGroup toFin2ℂFun - -/-- The instance of `Module` on `LeftHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : Module ℂ LeftHandedWeyl := Equiv.module ℂ toFin2ℂFun - -/-- The linear equivalence between `LeftHandedWeyl` and `(Fin 2 → ℂ)`. -/ -@[simps!] -def toFin2ℂEquiv : LeftHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where - toFun := toFin2ℂFun - map_add' := fun _ _ => rfl - map_smul' := fun _ _ => rfl - invFun := toFin2ℂFun.symm - left_inv := fun _ => rfl - right_inv := fun _ => rfl - -/-- The underlying element of `Fin 2 → ℂ` of a element in `LeftHandedWeyl` defined - through the linear equivalence `toFin2ℂEquiv`. -/ -abbrev toFin2ℂ (ψ : LeftHandedWeyl) := toFin2ℂEquiv ψ - -lemma toFin2ℂ_eq_val (ψ : LeftHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl - -end LeftHandedWeyl - -end LeftHanded - /-- The module in which dual-left handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ structure DualLeftHandedWeyl where /-- The underlying value in `Fin 2 → ℂ`. -/ From 9323e93b03c2006f9f36a4f95ab1681a6c4a7694 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:15:10 +0100 Subject: [PATCH 002/254] feat: Create DualLeftHanded.lean --- .../Fermions/Weyl/DualLeftHanded.lean | 162 ++++++++++++++++++ .../Tensors/ComplexTensor/Weyl/Basic.lean | 76 -------- .../Tensors/ComplexTensor/Weyl/Modules.lean | 44 ----- 3 files changed, 162 insertions(+), 120 deletions(-) create mode 100644 Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean diff --git a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean new file mode 100644 index 000000000..9298ccec7 --- /dev/null +++ b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 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 Mathlib.Analysis.Complex.Basic +public import Physlib.Meta.TODO.Basic +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Meta.Informal.Basic +public import Physlib.Meta.TODO.Basic +/-! + +## Dual left handed Weyl fermions + + +In this file we define dual Left handed Weyl fermions. +These sit in the dual of the fundamental repsentation of `SL(2,ℂ)`, +and we consider them to have down indices `ψ_α` with `α = 1,2`. + +-/ + +@[expose] public section + +namespace Fermion +noncomputable section + +/-- The module in which dual-left handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ +structure DualLeftHandedWeyl where + /-- The underlying value in `Fin 2 → ℂ`. -/ + val : Fin 2 → ℂ + +namespace DualLeftHandedWeyl +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct + +/-! + +## Underlying module structure + +-/ + +/-- The equivalence between `DualLeftHandedWeyl` and `Fin 2 → ℂ`. -/ +def toFin2ℂFun : DualLeftHandedWeyl ≃ (Fin 2 → ℂ) where + toFun v := v.val + invFun f := ⟨f⟩ + left_inv _ := rfl + right_inv _ := rfl + +/-- The instance of `AddCommMonoid` on `DualLeftHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommMonoid DualLeftHandedWeyl := Equiv.addCommMonoid toFin2ℂFun + +/-- The instance of `AddCommGroup` on `DualLeftHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommGroup DualLeftHandedWeyl := Equiv.addCommGroup toFin2ℂFun + +/-- The instance of `Module` on `DualLeftHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : Module ℂ DualLeftHandedWeyl := Equiv.module ℂ toFin2ℂFun + +/-- The linear equivalence between `DualLeftHandedWeyl` and `(Fin 2 → ℂ)`. -/ +@[simps!] +def toFin2ℂEquiv : DualLeftHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where + toFun := toFin2ℂFun + map_add' := fun _ _ => rfl + map_smul' := fun _ _ => rfl + invFun := toFin2ℂFun.symm + left_inv := fun _ => rfl + right_inv := fun _ => rfl + +/-- The underlying element of `Fin 2 → ℂ` of a element in `DualLeftHandedWeyl` defined + through the linear equivalence `toFin2ℂEquiv`. -/ +abbrev toFin2ℂ (ψ : DualLeftHandedWeyl) := toFin2ℂEquiv ψ + +lemma toFin2ℂ_eq_val (ψ : DualLeftHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl + +/-! + +## Basis + +-/ + +/-- The standard basis on dual-left-handed Weyl fermions. -/ +def basis : Basis (Fin 2) ℂ DualLeftHandedWeyl := Basis.ofEquivFun + (Equiv.linearEquiv ℂ DualLeftHandedWeyl.toFin2ℂFun) + +lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by + simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, + EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, + LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, + Equiv.addEquiv_symm_apply] + change Pi.single i 1 j = _ + simp [Pi.single_apply] + +lemma eq_sum_basis (ψ : DualLeftHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by + conv_lhs => rw [← basis.sum_repr ψ] + rfl + +lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by + ext j + simp [basis_apply, Pi.single_apply] + +/-! + +## Representation + +-/ + +/-- The vector space ℂ^2 carrying the representation of SL(2,C) given by + M → (M⁻¹)ᵀ. In index notation corresponds to a left-handed Weyl fermion with indices ψ_a. -/ +def rep : Representation ℂ SL(2,ℂ) DualLeftHandedWeyl where + toFun := fun M => { + toFun := fun (ψ : DualLeftHandedWeyl) => + DualLeftHandedWeyl.toFin2ℂEquiv.symm ((M.1⁻¹)ᵀ *ᵥ ψ.toFin2ℂ), + map_add' := by + intro ψ ψ' + simp [mulVec_add] + map_smul' := by + intro r ψ + simp [mulVec_smul]} + map_one' := by + ext i + simp + map_mul' := fun M N => by + ext1 x + simp only [SpecialLinearGroup.coe_mul, LinearMap.coe_mk, AddHom.coe_mk, Module.End.mul_apply, + LinearEquiv.apply_symm_apply, mulVec_mulVec, EmbeddingLike.apply_eq_iff_eq] + refine (congrFun (congrArg _ ?_) _) + rw [Matrix.mul_inv_rev] + exact transpose_mul _ _ + +lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : DualLeftHandedWeyl) : + rep M ψ = ∑ i, (∑ j, M.1⁻¹ j i * ψ.1 j) • basis i := by + rw [eq_sum_basis (rep M ψ)] + rfl + +lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : + rep M (basis i) = ∑ j, M.1⁻¹ i j • basis j := by + rw [rep_apply_eq_sum_basis] + congr + funext j + simp [basis_apply] + +lemma rep_toMatrix (M : SL(2,ℂ)) : (LinearMap.toMatrix basis basis) (rep M) = (M.1⁻¹)ᵀ := by + ext i j + rw [LinearMap.toMatrix_apply] + simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] + change ((M.1⁻¹)ᵀ *ᵥ (Pi.single j 1)) i = _ + simp + +lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : + basis.repr (rep M (basis i)) j = M.1⁻¹ i j := by + fin_cases j <;> simp [rep_apply_basis] + +end DualLeftHandedWeyl + +end +end Fermion diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean index b9ba08b6b..941d93c9d 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean @@ -30,82 +30,6 @@ open TensorProduct /-! -## Dual Left-handed Weyl fermions - --/ - -namespace DualLeftHandedWeyl - -/-- The standard basis on dual-left-handed Weyl fermions. -/ -def basis : Basis (Fin 2) ℂ DualLeftHandedWeyl := Basis.ofEquivFun - (Equiv.linearEquiv ℂ DualLeftHandedWeyl.toFin2ℂFun) - -lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by - simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, - EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, - LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, - Equiv.addEquiv_symm_apply] - change Pi.single i 1 j = _ - simp [Pi.single_apply] - -lemma eq_sum_basis (ψ : DualLeftHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by - conv_lhs => rw [← basis.sum_repr ψ] - rfl - -lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by - ext j - simp [basis_apply, Pi.single_apply] - -/-- The vector space ℂ^2 carrying the representation of SL(2,C) given by - M → (M⁻¹)ᵀ. In index notation corresponds to a left-handed Weyl fermion with indices ψ_a. -/ -def rep : Representation ℂ SL(2,ℂ) DualLeftHandedWeyl where - toFun := fun M => { - toFun := fun (ψ : DualLeftHandedWeyl) => - DualLeftHandedWeyl.toFin2ℂEquiv.symm ((M.1⁻¹)ᵀ *ᵥ ψ.toFin2ℂ), - map_add' := by - intro ψ ψ' - simp [mulVec_add] - map_smul' := by - intro r ψ - simp [mulVec_smul]} - map_one' := by - ext i - simp - map_mul' := fun M N => by - ext1 x - simp only [SpecialLinearGroup.coe_mul, LinearMap.coe_mk, AddHom.coe_mk, Module.End.mul_apply, - LinearEquiv.apply_symm_apply, mulVec_mulVec, EmbeddingLike.apply_eq_iff_eq] - refine (congrFun (congrArg _ ?_) _) - rw [Matrix.mul_inv_rev] - exact transpose_mul _ _ - -lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : DualLeftHandedWeyl) : - rep M ψ = ∑ i, (∑ j, M.1⁻¹ j i * ψ.1 j) • basis i := by - rw [eq_sum_basis (rep M ψ)] - rfl - -lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : - rep M (basis i) = ∑ j, M.1⁻¹ i j • basis j := by - rw [rep_apply_eq_sum_basis] - congr - funext j - simp [basis_apply] - -lemma rep_toMatrix (M : SL(2,ℂ)) : (LinearMap.toMatrix basis basis) (rep M) = (M.1⁻¹)ᵀ := by - ext i j - rw [LinearMap.toMatrix_apply] - simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] - change ((M.1⁻¹)ᵀ *ᵥ (Pi.single j 1)) i = _ - simp - -lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : - basis.repr (rep M (basis i)) j = M.1⁻¹ i j := by - fin_cases j <;> simp [rep_apply_basis] - -end DualLeftHandedWeyl - -/-! - ## Right-handed Weyl fermions -/ diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean index 8e789994e..8db5346a5 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean @@ -26,50 +26,6 @@ types of fermions. namespace Fermion noncomputable section -/-- The module in which dual-left handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ -structure DualLeftHandedWeyl where - /-- The underlying value in `Fin 2 → ℂ`. -/ - val : Fin 2 → ℂ - -namespace DualLeftHandedWeyl - -/-- The equivalence between `DualLeftHandedWeyl` and `Fin 2 → ℂ`. -/ -def toFin2ℂFun : DualLeftHandedWeyl ≃ (Fin 2 → ℂ) where - toFun v := v.val - invFun f := ⟨f⟩ - left_inv _ := rfl - right_inv _ := rfl - -/-- The instance of `AddCommMonoid` on `DualLeftHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommMonoid DualLeftHandedWeyl := Equiv.addCommMonoid toFin2ℂFun - -/-- The instance of `AddCommGroup` on `DualLeftHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommGroup DualLeftHandedWeyl := Equiv.addCommGroup toFin2ℂFun - -/-- The instance of `Module` on `DualLeftHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : Module ℂ DualLeftHandedWeyl := Equiv.module ℂ toFin2ℂFun - -/-- The linear equivalence between `DualLeftHandedWeyl` and `(Fin 2 → ℂ)`. -/ -@[simps!] -def toFin2ℂEquiv : DualLeftHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where - toFun := toFin2ℂFun - map_add' := fun _ _ => rfl - map_smul' := fun _ _ => rfl - invFun := toFin2ℂFun.symm - left_inv := fun _ => rfl - right_inv := fun _ => rfl - -/-- The underlying element of `Fin 2 → ℂ` of a element in `DualLeftHandedWeyl` defined - through the linear equivalence `toFin2ℂEquiv`. -/ -abbrev toFin2ℂ (ψ : DualLeftHandedWeyl) := toFin2ℂEquiv ψ - -lemma toFin2ℂ_eq_val (ψ : DualLeftHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl - -end DualLeftHandedWeyl - section RightHanded From 21e4c48d141642bc7c91555c7a7dd64ac8baa6b4 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:18:21 +0100 Subject: [PATCH 003/254] feat: Create RightHanded.lean --- .../Relativity/Fermions/Weyl/RightHanded.lean | 162 ++++++++++++++++++ .../Tensors/ComplexTensor/Weyl/Basic.lean | 75 -------- .../Tensors/ComplexTensor/Weyl/Modules.lean | 49 ------ 3 files changed, 162 insertions(+), 124 deletions(-) create mode 100644 Physlib/Relativity/Fermions/Weyl/RightHanded.lean diff --git a/Physlib/Relativity/Fermions/Weyl/RightHanded.lean b/Physlib/Relativity/Fermions/Weyl/RightHanded.lean new file mode 100644 index 000000000..bf8ec86aa --- /dev/null +++ b/Physlib/Relativity/Fermions/Weyl/RightHanded.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 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 Mathlib.Analysis.Complex.Basic +public import Physlib.Meta.TODO.Basic +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Meta.Informal.Basic +public import Physlib.Meta.TODO.Basic +/-! + +## Right handed Weyl fermions + + +In this file we define Right handed Weyl fermions. +These sit in the fundamental repsentation of `SL(2,ℂ)`, +and we consider them to have up indices `ψ^{\dot α}` with `α = 1,2`. + +-/ + +@[expose] public section + +namespace Fermion +noncomputable section + +/-- The module in which right handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ +structure RightHandedWeyl where + /-- The underlying value in `Fin 2 → ℂ`. -/ + val : Fin 2 → ℂ + +namespace RightHandedWeyl +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct + +/-! + +## Underlying module structure + +-/ + +/-- The equivalence between `RightHandedWeyl` and `Fin 2 → ℂ`. -/ +def toFin2ℂFun : RightHandedWeyl ≃ (Fin 2 → ℂ) where + toFun v := v.val + invFun f := ⟨f⟩ + left_inv _ := rfl + right_inv _ := rfl + +/-- The instance of `AddCommMonoid` on `RightHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommMonoid RightHandedWeyl := Equiv.addCommMonoid toFin2ℂFun + +/-- The instance of `AddCommGroup` on `RightHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommGroup RightHandedWeyl := Equiv.addCommGroup toFin2ℂFun + +/-- The instance of `Module` on `RightHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : Module ℂ RightHandedWeyl := Equiv.module ℂ toFin2ℂFun + +/-- The linear equivalence between `RightHandedWeyl` and `(Fin 2 → ℂ)`. -/ +@[simps!] +def toFin2ℂEquiv : RightHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where + toFun := toFin2ℂFun + map_add' := fun _ _ => rfl + map_smul' := fun _ _ => rfl + invFun := toFin2ℂFun.symm + left_inv := fun _ => rfl + right_inv := fun _ => rfl + +/-- The underlying element of `Fin 2 → ℂ` of a element in `RightHandedWeyl` defined + through the linear equivalence `toFin2ℂEquiv`. -/ +abbrev toFin2ℂ (ψ : RightHandedWeyl) := toFin2ℂEquiv ψ + +lemma toFin2ℂ_eq_val (ψ : RightHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl + +/-! + +## Basis + +-/ + +/-- The standard basis on right-handed Weyl fermions. -/ +def basis : Basis (Fin 2) ℂ RightHandedWeyl := Basis.ofEquivFun + (Equiv.linearEquiv ℂ RightHandedWeyl.toFin2ℂFun) + +lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by + simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, + EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, + LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, + Equiv.addEquiv_symm_apply] + change Pi.single i 1 j = _ + simp [Pi.single_apply] + +lemma eq_sum_basis (ψ : RightHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by + conv_lhs => rw [← basis.sum_repr ψ] + rfl + +lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by + ext j + simp [basis_apply, Pi.single_apply] + +/-! + +## Representation + +-/ + +/-- The vector space ℂ^2 carrying the conjugate representation of SL(2,C). + In index notation corresponds to a Weyl fermion with indices ψ^{dot a}. -/ +def rep : Representation ℂ SL(2,ℂ) RightHandedWeyl where + toFun := fun M => { + toFun := fun (ψ : RightHandedWeyl) => + RightHandedWeyl.toFin2ℂEquiv.symm (M.1.map star *ᵥ ψ.toFin2ℂ), + map_add' := by + intro ψ ψ' + simp [mulVec_add] + map_smul' := by + intro r ψ + simp [mulVec_smul]} + map_one' := by + ext i + simp + map_mul' := fun M N => by + ext1 x + simp only [SpecialLinearGroup.coe_mul, RCLike.star_def, Matrix.map_mul, LinearMap.coe_mk, + AddHom.coe_mk, Module.End.mul_apply, LinearEquiv.apply_symm_apply, mulVec_mulVec] + +lemma rep_apply (M : SL(2,ℂ)) (ψ : RightHandedWeyl) : rep M ψ = ⟨M.1.map star *ᵥ ψ.1⟩ := rfl + +lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : RightHandedWeyl) : + rep M ψ = ∑ i, (∑ j, M.1.map star i j * ψ.1 j) • basis i := by + rw [eq_sum_basis (rep M ψ)] + rfl + +lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : + rep M (basis i) = ∑ j, M.1.map star j i • basis j := by + rw [rep_apply_eq_sum_basis] + congr + funext j + simp [basis_apply] + +lemma rep_toMatrix (M : SL(2,ℂ)) : (LinearMap.toMatrix basis basis) (rep M) = M.1.map star := by + ext i j + rw [LinearMap.toMatrix_apply] + simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] + change (M.1.map star *ᵥ (Pi.single j 1)) i = _ + simp + +lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : + basis.repr (rep M (basis i)) j = star (M.1 j i) := by + fin_cases j <;> simp [rep_apply_basis] + + +end RightHandedWeyl + +end +end Fermion diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean index 941d93c9d..33d2f2ffc 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean @@ -30,81 +30,6 @@ open TensorProduct /-! -## Right-handed Weyl fermions - --/ - -namespace RightHandedWeyl - -/-- The standard basis on right-handed Weyl fermions. -/ -def basis : Basis (Fin 2) ℂ RightHandedWeyl := Basis.ofEquivFun - (Equiv.linearEquiv ℂ RightHandedWeyl.toFin2ℂFun) - -lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by - simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, - EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, - LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, - Equiv.addEquiv_symm_apply] - change Pi.single i 1 j = _ - simp [Pi.single_apply] - -lemma eq_sum_basis (ψ : RightHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by - conv_lhs => rw [← basis.sum_repr ψ] - rfl - -lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by - ext j - simp [basis_apply, Pi.single_apply] - -/-- The vector space ℂ^2 carrying the conjugate representation of SL(2,C). - In index notation corresponds to a Weyl fermion with indices ψ^{dot a}. -/ -def rep : Representation ℂ SL(2,ℂ) RightHandedWeyl where - toFun := fun M => { - toFun := fun (ψ : RightHandedWeyl) => - RightHandedWeyl.toFin2ℂEquiv.symm (M.1.map star *ᵥ ψ.toFin2ℂ), - map_add' := by - intro ψ ψ' - simp [mulVec_add] - map_smul' := by - intro r ψ - simp [mulVec_smul]} - map_one' := by - ext i - simp - map_mul' := fun M N => by - ext1 x - simp only [SpecialLinearGroup.coe_mul, RCLike.star_def, Matrix.map_mul, LinearMap.coe_mk, - AddHom.coe_mk, Module.End.mul_apply, LinearEquiv.apply_symm_apply, mulVec_mulVec] - -lemma rep_apply (M : SL(2,ℂ)) (ψ : RightHandedWeyl) : rep M ψ = ⟨M.1.map star *ᵥ ψ.1⟩ := rfl - -lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : RightHandedWeyl) : - rep M ψ = ∑ i, (∑ j, M.1.map star i j * ψ.1 j) • basis i := by - rw [eq_sum_basis (rep M ψ)] - rfl - -lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : - rep M (basis i) = ∑ j, M.1.map star j i • basis j := by - rw [rep_apply_eq_sum_basis] - congr - funext j - simp [basis_apply] - -lemma rep_toMatrix (M : SL(2,ℂ)) : (LinearMap.toMatrix basis basis) (rep M) = M.1.map star := by - ext i j - rw [LinearMap.toMatrix_apply] - simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] - change (M.1.map star *ᵥ (Pi.single j 1)) i = _ - simp - -lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : - basis.repr (rep M (basis i)) j = star (M.1 j i) := by - fin_cases j <;> simp [rep_apply_basis] - -end RightHandedWeyl - -/-! - ## Dual Right-handed Weyl fermions -/ diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean index 8db5346a5..247619538 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean @@ -26,55 +26,6 @@ types of fermions. namespace Fermion noncomputable section - -section RightHanded - -/-- The module in which right handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ -structure RightHandedWeyl where - /-- The underlying value in `Fin 2 → ℂ`. -/ - val : Fin 2 → ℂ - -namespace RightHandedWeyl - -/-- The equivalence between `RightHandedWeyl` and `Fin 2 → ℂ`. -/ -def toFin2ℂFun : RightHandedWeyl ≃ (Fin 2 → ℂ) where - toFun v := v.val - invFun f := ⟨f⟩ - left_inv _ := rfl - right_inv _ := rfl - -/-- The instance of `AddCommMonoid` on `RightHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommMonoid RightHandedWeyl := Equiv.addCommMonoid toFin2ℂFun - -/-- The instance of `AddCommGroup` on `RightHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommGroup RightHandedWeyl := Equiv.addCommGroup toFin2ℂFun - -/-- The instance of `Module` on `RightHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : Module ℂ RightHandedWeyl := Equiv.module ℂ toFin2ℂFun - -/-- The linear equivalence between `RightHandedWeyl` and `(Fin 2 → ℂ)`. -/ -@[simps!] -def toFin2ℂEquiv : RightHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where - toFun := toFin2ℂFun - map_add' := fun _ _ => rfl - map_smul' := fun _ _ => rfl - invFun := toFin2ℂFun.symm - left_inv := fun _ => rfl - right_inv := fun _ => rfl - -/-- The underlying element of `Fin 2 → ℂ` of a element in `RightHandedWeyl` defined - through the linear equivalence `toFin2ℂEquiv`. -/ -abbrev toFin2ℂ (ψ : RightHandedWeyl) := toFin2ℂEquiv ψ - -lemma toFin2ℂ_eq_val (ψ : RightHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl - -end RightHandedWeyl - -end RightHanded - section DualRightHanded /-- The module in which dual-right handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ From d15f09db30979808ab72d3bce7399244988c57e8 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:21:33 +0100 Subject: [PATCH 004/254] feat: Create DualRightHanded.lean --- .../Fermions/Weyl/DualRightHanded.lean | 169 ++++++++++++++++++ .../Tensors/ComplexTensor/Weyl/Basic.lean | 71 -------- .../Tensors/ComplexTensor/Weyl/Modules.lean | 48 ----- 3 files changed, 169 insertions(+), 119 deletions(-) create mode 100644 Physlib/Relativity/Fermions/Weyl/DualRightHanded.lean diff --git a/Physlib/Relativity/Fermions/Weyl/DualRightHanded.lean b/Physlib/Relativity/Fermions/Weyl/DualRightHanded.lean new file mode 100644 index 000000000..277ce9bc0 --- /dev/null +++ b/Physlib/Relativity/Fermions/Weyl/DualRightHanded.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 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 Mathlib.Analysis.Complex.Basic +public import Physlib.Meta.TODO.Basic +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Meta.Informal.Basic +public import Physlib.Meta.TODO.Basic +/-! + +## Dual right handed Weyl fermions + + +In this file we define dual right handed Weyl fermions. +These sit in the dual-conjugate representation of `SL(2,ℂ)`, +and we consider them to have down indices `ψ_\dot α}` with `α = 1,2`. + +-/ + +@[expose] public section + +namespace Fermion +noncomputable section + +/-- The module in which dual-right handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ +structure DualRightHandedWeyl where + /-- The underlying value in `Fin 2 → ℂ`. -/ + val : Fin 2 → ℂ + +namespace DualRightHandedWeyl +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct + +/-! + +## Underlying module structure + +-/ + +/-- The equivalence between `DualRightHandedWeyl` and `Fin 2 → ℂ`. -/ +def toFin2ℂFun : DualRightHandedWeyl ≃ (Fin 2 → ℂ) where + toFun v := v.val + invFun f := ⟨f⟩ + left_inv _ := rfl + right_inv _ := rfl + +/-- The instance of `AddCommMonoid` on `DualRightHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommMonoid DualRightHandedWeyl := Equiv.addCommMonoid toFin2ℂFun + +/-- The instance of `AddCommGroup` on `DualRightHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : AddCommGroup DualRightHandedWeyl := Equiv.addCommGroup toFin2ℂFun + +/-- The instance of `Module` on `DualRightHandedWeyl` defined via its equivalence + with `Fin 2 → ℂ`. -/ +instance : Module ℂ DualRightHandedWeyl := Equiv.module ℂ toFin2ℂFun + +/-- The linear equivalence between `DualRightHandedWeyl` and `(Fin 2 → ℂ)`. -/ +@[simps!] +def toFin2ℂEquiv : DualRightHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where + toFun := toFin2ℂFun + map_add' := fun _ _ => rfl + map_smul' := fun _ _ => rfl + invFun := toFin2ℂFun.symm + left_inv := fun _ => rfl + right_inv := fun _ => rfl + +/-- The underlying element of `Fin 2 → ℂ` of a element in `DualRightHandedWeyl` defined + through the linear equivalence `toFin2ℂEquiv`. -/ +abbrev toFin2ℂ (ψ : DualRightHandedWeyl) := toFin2ℂEquiv ψ + +lemma toFin2ℂ_eq_val (ψ : DualRightHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl + +/-! + +## Basis + +-/ + + +/-- The standard basis on dual-right-handed Weyl fermions. -/ +def basis : Basis (Fin 2) ℂ DualRightHandedWeyl := Basis.ofEquivFun + (Equiv.linearEquiv ℂ DualRightHandedWeyl.toFin2ℂFun) + + +lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by + simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, + EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, + LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, + Equiv.addEquiv_symm_apply] + change Pi.single i 1 j = _ + simp [Pi.single_apply] + +lemma eq_sum_basis (ψ : DualRightHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by + conv_lhs => rw [← basis.sum_repr ψ] + rfl + +lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by + ext j + simp [basis_apply, Pi.single_apply] + +/-! + +## Representation + +-/ + + +/-- The vector space ℂ^2 carrying the representation of SL(2,C) given by + M → (M⁻¹)^†. + In index notation this corresponds to a Weyl fermion with index `ψ_{dot a}`. -/ +def rep : Representation ℂ SL(2,ℂ) DualRightHandedWeyl where + toFun := fun M => { + toFun := fun (ψ : DualRightHandedWeyl) => + DualRightHandedWeyl.toFin2ℂEquiv.symm ((M.1⁻¹).conjTranspose *ᵥ ψ.toFin2ℂ), + map_add' := by + intro ψ ψ' + simp [mulVec_add] + map_smul' := by + intro r ψ + simp [mulVec_smul]} + map_one' := by + ext i + simp + map_mul' := fun M N => by + ext1 x + simp only [SpecialLinearGroup.coe_mul, LinearMap.coe_mk, AddHom.coe_mk, Module.End.mul_apply, + LinearEquiv.apply_symm_apply, mulVec_mulVec, EmbeddingLike.apply_eq_iff_eq] + refine (congrFun (congrArg _ ?_) _) + rw [Matrix.mul_inv_rev] + exact conjTranspose_mul _ _ + +lemma rep_apply (M : SL(2,ℂ)) (ψ : DualRightHandedWeyl) : + rep M ψ = ⟨(M.1⁻¹).conjTranspose *ᵥ ψ.1⟩ := rfl + +lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : DualRightHandedWeyl) : + rep M ψ = ∑ i, (∑ j, (M.1⁻¹).conjTranspose i j * ψ.1 j) • basis i := by + rw [eq_sum_basis (rep M ψ)] + rfl + +lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : + rep M (basis i) = ∑ j, (M.1⁻¹).conjTranspose j i • basis j := by + rw [rep_apply_eq_sum_basis] + congr + funext j + simp [basis_apply] + +lemma rep_toMatrix (M : SL(2,ℂ)) : + (LinearMap.toMatrix basis basis) (rep M) = (M.1⁻¹).conjTranspose := by + ext i j + rw [LinearMap.toMatrix_apply] + simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] + change ((M.1⁻¹).conjTranspose *ᵥ (Pi.single j 1)) i = _ + simp + +lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : + basis.repr (rep M (basis i)) j = star (M.1⁻¹ i j) := by + fin_cases j <;> simp [rep_apply_basis] + +end DualRightHandedWeyl +end +end Fermion diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean index 33d2f2ffc..44baa15b9 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean @@ -36,77 +36,6 @@ open TensorProduct namespace DualRightHandedWeyl -/-- The standard basis on dual-right-handed Weyl fermions. -/ -def basis : Basis (Fin 2) ℂ DualRightHandedWeyl := Basis.ofEquivFun - (Equiv.linearEquiv ℂ DualRightHandedWeyl.toFin2ℂFun) - - -lemma basis_apply (i j : Fin 2) : (basis i).1 j = if j = i then 1 else 0 := by - simp only [basis, Equiv.linearEquiv, AddEquiv.toEquiv_eq_coe, Equiv.toFun_as_coe, - EquivLike.coe_coe, Equiv.invFun_as_coe, AddEquiv.coe_toEquiv_symm, Basis.coe_ofEquivFun, - LinearEquiv.symm_mk, LinearMap.coe_mk, AddHom.coe_mk, LinearEquiv.coe_mk, - Equiv.addEquiv_symm_apply] - change Pi.single i 1 j = _ - simp [Pi.single_apply] - -lemma eq_sum_basis (ψ : DualRightHandedWeyl) : ψ = ∑ i, ψ.1 i • basis i := by - conv_lhs => rw [← basis.sum_repr ψ] - rfl - -lemma basis_val (i : Fin 2) : (basis i).val = Pi.single i 1 := by - ext j - simp [basis_apply, Pi.single_apply] -/-- The vector space ℂ^2 carrying the representation of SL(2,C) given by - M → (M⁻¹)^†. - In index notation this corresponds to a Weyl fermion with index `ψ_{dot a}`. -/ -def rep : Representation ℂ SL(2,ℂ) DualRightHandedWeyl where - toFun := fun M => { - toFun := fun (ψ : DualRightHandedWeyl) => - DualRightHandedWeyl.toFin2ℂEquiv.symm ((M.1⁻¹).conjTranspose *ᵥ ψ.toFin2ℂ), - map_add' := by - intro ψ ψ' - simp [mulVec_add] - map_smul' := by - intro r ψ - simp [mulVec_smul]} - map_one' := by - ext i - simp - map_mul' := fun M N => by - ext1 x - simp only [SpecialLinearGroup.coe_mul, LinearMap.coe_mk, AddHom.coe_mk, Module.End.mul_apply, - LinearEquiv.apply_symm_apply, mulVec_mulVec, EmbeddingLike.apply_eq_iff_eq] - refine (congrFun (congrArg _ ?_) _) - rw [Matrix.mul_inv_rev] - exact conjTranspose_mul _ _ - -lemma rep_apply (M : SL(2,ℂ)) (ψ : DualRightHandedWeyl) : - rep M ψ = ⟨(M.1⁻¹).conjTranspose *ᵥ ψ.1⟩ := rfl - -lemma rep_apply_eq_sum_basis (M : SL(2,ℂ)) (ψ : DualRightHandedWeyl) : - rep M ψ = ∑ i, (∑ j, (M.1⁻¹).conjTranspose i j * ψ.1 j) • basis i := by - rw [eq_sum_basis (rep M ψ)] - rfl - -lemma rep_apply_basis (M : SL(2,ℂ)) (i : Fin 2) : - rep M (basis i) = ∑ j, (M.1⁻¹).conjTranspose j i • basis j := by - rw [rep_apply_eq_sum_basis] - congr - funext j - simp [basis_apply] - -lemma rep_toMatrix (M : SL(2,ℂ)) : - (LinearMap.toMatrix basis basis) (rep M) = (M.1⁻¹).conjTranspose := by - ext i j - rw [LinearMap.toMatrix_apply] - simp only [basis, Basis.coe_ofEquivFun, Basis.ofEquivFun_repr_apply] - change ((M.1⁻¹).conjTranspose *ᵥ (Pi.single j 1)) i = _ - simp - -lemma rep_apply_basis_repr (M : SL(2,ℂ)) (i j : Fin 2) : - basis.repr (rep M (basis i)) j = star (M.1⁻¹ i j) := by - fin_cases j <;> simp [rep_apply_basis] - end DualRightHandedWeyl /-! diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean index 247619538..72d1459f0 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean @@ -26,53 +26,5 @@ types of fermions. namespace Fermion noncomputable section -section DualRightHanded - -/-- The module in which dual-right handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ -structure DualRightHandedWeyl where - /-- The underlying value in `Fin 2 → ℂ`. -/ - val : Fin 2 → ℂ - -namespace DualRightHandedWeyl - -/-- The equivalence between `DualRightHandedWeyl` and `Fin 2 → ℂ`. -/ -def toFin2ℂFun : DualRightHandedWeyl ≃ (Fin 2 → ℂ) where - toFun v := v.val - invFun f := ⟨f⟩ - left_inv _ := rfl - right_inv _ := rfl - -/-- The instance of `AddCommMonoid` on `DualRightHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommMonoid DualRightHandedWeyl := Equiv.addCommMonoid toFin2ℂFun - -/-- The instance of `AddCommGroup` on `DualRightHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : AddCommGroup DualRightHandedWeyl := Equiv.addCommGroup toFin2ℂFun - -/-- The instance of `Module` on `DualRightHandedWeyl` defined via its equivalence - with `Fin 2 → ℂ`. -/ -instance : Module ℂ DualRightHandedWeyl := Equiv.module ℂ toFin2ℂFun - -/-- The linear equivalence between `DualRightHandedWeyl` and `(Fin 2 → ℂ)`. -/ -@[simps!] -def toFin2ℂEquiv : DualRightHandedWeyl ≃ₗ[ℂ] (Fin 2 → ℂ) where - toFun := toFin2ℂFun - map_add' := fun _ _ => rfl - map_smul' := fun _ _ => rfl - invFun := toFin2ℂFun.symm - left_inv := fun _ => rfl - right_inv := fun _ => rfl - -/-- The underlying element of `Fin 2 → ℂ` of a element in `DualRightHandedWeyl` defined - through the linear equivalence `toFin2ℂEquiv`. -/ -abbrev toFin2ℂ (ψ : DualRightHandedWeyl) := toFin2ℂEquiv ψ - -lemma toFin2ℂ_eq_val (ψ : DualRightHandedWeyl) : ψ.toFin2ℂ = ψ.val := rfl - -end DualRightHandedWeyl - -end DualRightHanded - end end Fermion From 6557ded78a1bb0139c22857f1ecdfde99faa7963 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:21:42 +0100 Subject: [PATCH 005/254] fix: Documentation --- Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean | 2 +- Physlib/Relativity/Fermions/Weyl/LeftHanded.lean | 2 +- Physlib/Relativity/Fermions/Weyl/RightHanded.lean | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean index 9298ccec7..0687b6cb5 100644 --- a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean +++ b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean @@ -16,7 +16,7 @@ public import Physlib.Meta.TODO.Basic In this file we define dual Left handed Weyl fermions. -These sit in the dual of the fundamental repsentation of `SL(2,ℂ)`, +These sit in the dual of the fundamental representation of `SL(2,ℂ)`, and we consider them to have down indices `ψ_α` with `α = 1,2`. -/ diff --git a/Physlib/Relativity/Fermions/Weyl/LeftHanded.lean b/Physlib/Relativity/Fermions/Weyl/LeftHanded.lean index f324e55b5..c7136388c 100644 --- a/Physlib/Relativity/Fermions/Weyl/LeftHanded.lean +++ b/Physlib/Relativity/Fermions/Weyl/LeftHanded.lean @@ -16,7 +16,7 @@ public import Physlib.Meta.TODO.Basic In this file we define Left handed Weyl fermions. -These sit in the fundamental repsentation of `SL(2,ℂ)`, +These sit in the fundamental representation of `SL(2,ℂ)`, and we consider them to have up indices `ψ^α` with `α = 1,2`. -/ diff --git a/Physlib/Relativity/Fermions/Weyl/RightHanded.lean b/Physlib/Relativity/Fermions/Weyl/RightHanded.lean index bf8ec86aa..6a3f1eaf9 100644 --- a/Physlib/Relativity/Fermions/Weyl/RightHanded.lean +++ b/Physlib/Relativity/Fermions/Weyl/RightHanded.lean @@ -16,7 +16,7 @@ public import Physlib.Meta.TODO.Basic In this file we define Right handed Weyl fermions. -These sit in the fundamental repsentation of `SL(2,ℂ)`, +These sit in the conjugate representation of `SL(2,ℂ)`, and we consider them to have up indices `ψ^{\dot α}` with `α = 1,2`. -/ From cb9e25ffcddf19c775b35b8bc9d4b41e0ce6330c Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:22:53 +0100 Subject: [PATCH 006/254] docs: Add reference --- Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean index 0687b6cb5..6884f71db 100644 --- a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean +++ b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean @@ -19,6 +19,12 @@ In this file we define dual Left handed Weyl fermions. These sit in the dual of the fundamental representation of `SL(2,ℂ)`, and we consider them to have down indices `ψ_α` with `α = 1,2`. +### References + +A good reference for the material in this file is: +https://particle.physics.ucdavis.edu/modernsusy/slides/slideimages/spinorfeynrules.pdf +Although a different index convention is used there. + -/ @[expose] public section From 1e17593e48c18010e01017b993831515931dec13 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:24:36 +0100 Subject: [PATCH 007/254] feat: Create Duals.lean --- Physlib/Relativity/Fermions/Weyl/Duals.lean | 149 ++++++++++++++++++ .../Tensors/ComplexTensor/Weyl/Basic.lean | 128 --------------- 2 files changed, 149 insertions(+), 128 deletions(-) create mode 100644 Physlib/Relativity/Fermions/Weyl/Duals.lean diff --git a/Physlib/Relativity/Fermions/Weyl/Duals.lean b/Physlib/Relativity/Fermions/Weyl/Duals.lean new file mode 100644 index 000000000..8189a6197 --- /dev/null +++ b/Physlib/Relativity/Fermions/Weyl/Duals.lean @@ -0,0 +1,149 @@ +/- +Copyright (c) 2026 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.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded +public import Physlib.Relativity.Fermions.Weyl.DualRightHanded +/-! + +# Duals for fermions + +In this file we give the relationship between Weyl fermions +and their duals. + +-/ + +@[expose] public section + +namespace Fermion +noncomputable section + +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct + +/-! + +## Duals of Weyl fermions + +The dual of `LeftHandedWeyl` is `DualLeftHandedWeyl`, and the dual of `RightHandedWeyl` is +`DualRightHandedWeyl`. + +-/ + +/-- The morphism between the representation `leftHanded` and the representation + `dualLeftHanded` defined by multiplying an element of + `leftHanded` by the matrix `εᵃ⁰ᵃ¹ = !![0, 1; -1, 0]]`. -/ +def LeftHandedWeyl.dual : LeftHandedWeyl.rep.IntertwiningMap DualLeftHandedWeyl.rep where + toFun := fun ψ => DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ ψ.toFin2ℂ) + map_add' := by + intro ψ ψ' + simp only [mulVec_add, LinearEquiv.map_add] + map_smul' := by + intro a ψ + simp only [mulVec_smul, LinearEquiv.map_smul] + rfl + isIntertwining' := by + intro M + refine LinearMap.ext (fun ψ => ?_) + change DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ M.1 *ᵥ ψ.val) = + DualLeftHandedWeyl.toFin2ℂEquiv.symm ((M.1⁻¹)ᵀ *ᵥ !![0, 1; -1, 0] *ᵥ ψ.val) + apply congrArg + rw [mulVec_mulVec, mulVec_mulVec, Lorentz.SL2C.inverse_coe, eta_fin_two M.1] + refine congrFun (congrArg _ ?_) _ + rw [SpecialLinearGroup.coe_inv, Matrix.adjugate_fin_two, + Matrix.mul_fin_two, eta_fin_two !![M.1 1 1, -M.1 0 1; -M.1 1 0, M.1 0 0]ᵀ] + simp + +lemma LeftHandedWeyl.dual_hom_apply (ψ : LeftHandedWeyl) : + LeftHandedWeyl.dual ψ = + DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ ψ.toFin2ℂ) := rfl + +/-- The morphism from `dualLeftHanded` to + `leftHanded` defined by multiplying an element of + DualLeftHandedWeyl by the matrix `εₐ₁ₐ₂ = !![0, -1; 1, 0]`. -/ +def DualLeftHandedWeyl.dual : DualLeftHandedWeyl.rep.IntertwiningMap LeftHandedWeyl.rep where + toFun := fun ψ => + LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ ψ.toFin2ℂ) + map_add' := by + intro ψ ψ' + simp only [map_add] + rw [mulVec_add, LinearEquiv.map_add] + map_smul' := by + intro a ψ + simp only [LinearEquiv.map_smul] + rw [mulVec_smul, LinearEquiv.map_smul] + rfl + isIntertwining' := by + intro M + refine LinearMap.ext (fun ψ => ?_) + change LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ (M.1⁻¹)ᵀ *ᵥ ψ.val) = + LeftHandedWeyl.toFin2ℂEquiv.symm (M.1 *ᵥ !![0, -1; 1, 0] *ᵥ ψ.val) + rw [EquivLike.apply_eq_iff_eq, mulVec_mulVec, mulVec_mulVec, Lorentz.SL2C.inverse_coe, + eta_fin_two M.1] + refine congrFun (congrArg _ ?_) _ + rw [SpecialLinearGroup.coe_inv, Matrix.adjugate_fin_two, + Matrix.mul_fin_two, eta_fin_two !![M.1 1 1, -M.1 0 1; -M.1 1 0, M.1 0 0]ᵀ] + simp + +lemma DualLeftHandedWeyl.dual_hom_apply (ψ : DualLeftHandedWeyl) : + DualLeftHandedWeyl.dual ψ = + LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ ψ.toFin2ℂ) := rfl + +/-- The equivalence between the representation `leftHanded` and the representation + `dualLeftHanded` defined by multiplying an element of + `leftHanded` by the matrix `εᵃ⁰ᵃ¹ = !![0, 1; -1, 0]]`. -/ +def LeftHandedWeyl.dualEquiv : LeftHandedWeyl.rep.Equiv DualLeftHandedWeyl.rep := by + refine Representation.Equiv.mk' LeftHandedWeyl.dual DualLeftHandedWeyl.dual ?_ ?_ + · intro x + simp only [AddHom.toFun_eq_coe, LinearMap.coe_toAddHom, + Representation.IntertwiningMap.coe_toLinearMap] + rw [DualLeftHandedWeyl.dual_hom_apply, LeftHandedWeyl.dual_hom_apply] + rw [DualLeftHandedWeyl.toFin2ℂ, LinearEquiv.apply_symm_apply, mulVec_mulVec] + rw [show (!![0, -1; (1 : ℂ), 0] * !![0, 1; -1, 0]) = 1 by simpa using Eq.symm one_fin_two] + rw [one_mulVec] + rfl + · intro ψ + simp only [AddHom.toFun_eq_coe, LinearMap.coe_toAddHom, + Representation.IntertwiningMap.coe_toLinearMap] + rw [DualLeftHandedWeyl.dual_hom_apply, LeftHandedWeyl.dual_hom_apply, LeftHandedWeyl.toFin2ℂ, + LinearEquiv.apply_symm_apply, mulVec_mulVec] + rw [show (!![0, (1 : ℂ); -1, 0] * !![0, -1; 1, 0]) = 1 by simpa using Eq.symm one_fin_two] + rw [one_mulVec] + rfl + +/-- `leftHandedDualEquiv` acting on an element `ψ : leftHanded` corresponds + to multiplying `ψ` by the matrix `!![0, 1; -1, 0]`. -/ +lemma LeftHandedWeyl.dualEquiv_hom_hom_apply (ψ : LeftHandedWeyl) : + LeftHandedWeyl.dualEquiv ψ = + DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ ψ.toFin2ℂ) := rfl + +/-- The inverse of `leftHandedDualEquiv` acting on an element`ψ : dualLeftHanded` corresponds + to multiplying `ψ` by the matrix `!![0, -1; 1, 0]`. -/ +lemma LeftHandedWeyl.dualEquiv_inv_hom_apply (ψ : DualLeftHandedWeyl) : + LeftHandedWeyl.dualEquiv.symm ψ = + LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ ψ.toFin2ℂ) := rfl + +/-- The linear equivalence between `rightHandedWeyl` and `DualRightHandedWeyl` given by multiplying +an element of `rightHandedWeyl` by the matrix `εᵃ⁰ᵃ¹ = !![0, 1; -1, 0]]`. +-/ +informal_definition RightHandedWeyl.dualEquiv where + deps := [``RightHandedWeyl, ``DualRightHandedWeyl] + tag := "6VZR4" + +/-- The linear equivalence `rightHandedWeylDualEquiv` is equivariant with respect to the action of +`SL(2,C)` on `rightHandedWeyl` and `DualRightHandedWeyl`. +-/ +informal_lemma RightHandedWeyl.dualEquiv_equivariant where + deps := [``RightHandedWeyl.dualEquiv] + tag := "6VZSG" + +end + +end Fermion diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean index 44baa15b9..e010ca8c9 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean @@ -28,132 +28,4 @@ open MatrixGroups open Complex open TensorProduct -/-! - -## Dual Right-handed Weyl fermions - --/ - -namespace DualRightHandedWeyl - -end DualRightHandedWeyl - -/-! - -## Duals of Weyl fermions - -The dual of `LeftHandedWeyl` is `DualLeftHandedWeyl`, and the dual of `RightHandedWeyl` is -`DualRightHandedWeyl`. - --/ - -/-- The morphism between the representation `leftHanded` and the representation - `dualLeftHanded` defined by multiplying an element of - `leftHanded` by the matrix `εᵃ⁰ᵃ¹ = !![0, 1; -1, 0]]`. -/ -def LeftHandedWeyl.dual : LeftHandedWeyl.rep.IntertwiningMap DualLeftHandedWeyl.rep where - toFun := fun ψ => DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ ψ.toFin2ℂ) - map_add' := by - intro ψ ψ' - simp only [mulVec_add, LinearEquiv.map_add] - map_smul' := by - intro a ψ - simp only [mulVec_smul, LinearEquiv.map_smul] - rfl - isIntertwining' := by - intro M - refine LinearMap.ext (fun ψ => ?_) - change DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ M.1 *ᵥ ψ.val) = - DualLeftHandedWeyl.toFin2ℂEquiv.symm ((M.1⁻¹)ᵀ *ᵥ !![0, 1; -1, 0] *ᵥ ψ.val) - apply congrArg - rw [mulVec_mulVec, mulVec_mulVec, Lorentz.SL2C.inverse_coe, eta_fin_two M.1] - refine congrFun (congrArg _ ?_) _ - rw [SpecialLinearGroup.coe_inv, Matrix.adjugate_fin_two, - Matrix.mul_fin_two, eta_fin_two !![M.1 1 1, -M.1 0 1; -M.1 1 0, M.1 0 0]ᵀ] - simp - -lemma LeftHandedWeyl.dual_hom_apply (ψ : LeftHandedWeyl) : - LeftHandedWeyl.dual ψ = - DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ ψ.toFin2ℂ) := rfl - -/-- The morphism from `dualLeftHanded` to - `leftHanded` defined by multiplying an element of - DualLeftHandedWeyl by the matrix `εₐ₁ₐ₂ = !![0, -1; 1, 0]`. -/ -def DualLeftHandedWeyl.dual : DualLeftHandedWeyl.rep.IntertwiningMap LeftHandedWeyl.rep where - toFun := fun ψ => - LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ ψ.toFin2ℂ) - map_add' := by - intro ψ ψ' - simp only [map_add] - rw [mulVec_add, LinearEquiv.map_add] - map_smul' := by - intro a ψ - simp only [LinearEquiv.map_smul] - rw [mulVec_smul, LinearEquiv.map_smul] - rfl - isIntertwining' := by - intro M - refine LinearMap.ext (fun ψ => ?_) - change LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ (M.1⁻¹)ᵀ *ᵥ ψ.val) = - LeftHandedWeyl.toFin2ℂEquiv.symm (M.1 *ᵥ !![0, -1; 1, 0] *ᵥ ψ.val) - rw [EquivLike.apply_eq_iff_eq, mulVec_mulVec, mulVec_mulVec, Lorentz.SL2C.inverse_coe, - eta_fin_two M.1] - refine congrFun (congrArg _ ?_) _ - rw [SpecialLinearGroup.coe_inv, Matrix.adjugate_fin_two, - Matrix.mul_fin_two, eta_fin_two !![M.1 1 1, -M.1 0 1; -M.1 1 0, M.1 0 0]ᵀ] - simp - -lemma DualLeftHandedWeyl.dual_hom_apply (ψ : DualLeftHandedWeyl) : - DualLeftHandedWeyl.dual ψ = - LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ ψ.toFin2ℂ) := rfl - -/-- The equivalence between the representation `leftHanded` and the representation - `dualLeftHanded` defined by multiplying an element of - `leftHanded` by the matrix `εᵃ⁰ᵃ¹ = !![0, 1; -1, 0]]`. -/ -def LeftHandedWeyl.dualEquiv : LeftHandedWeyl.rep.Equiv DualLeftHandedWeyl.rep := by - refine Representation.Equiv.mk' LeftHandedWeyl.dual DualLeftHandedWeyl.dual ?_ ?_ - · intro x - simp only [AddHom.toFun_eq_coe, LinearMap.coe_toAddHom, - Representation.IntertwiningMap.coe_toLinearMap] - rw [DualLeftHandedWeyl.dual_hom_apply, LeftHandedWeyl.dual_hom_apply] - rw [DualLeftHandedWeyl.toFin2ℂ, LinearEquiv.apply_symm_apply, mulVec_mulVec] - rw [show (!![0, -1; (1 : ℂ), 0] * !![0, 1; -1, 0]) = 1 by simpa using Eq.symm one_fin_two] - rw [one_mulVec] - rfl - · intro ψ - simp only [AddHom.toFun_eq_coe, LinearMap.coe_toAddHom, - Representation.IntertwiningMap.coe_toLinearMap] - rw [DualLeftHandedWeyl.dual_hom_apply, LeftHandedWeyl.dual_hom_apply, LeftHandedWeyl.toFin2ℂ, - LinearEquiv.apply_symm_apply, mulVec_mulVec] - rw [show (!![0, (1 : ℂ); -1, 0] * !![0, -1; 1, 0]) = 1 by simpa using Eq.symm one_fin_two] - rw [one_mulVec] - rfl - -/-- `leftHandedDualEquiv` acting on an element `ψ : leftHanded` corresponds - to multiplying `ψ` by the matrix `!![0, 1; -1, 0]`. -/ -lemma LeftHandedWeyl.dualEquiv_hom_hom_apply (ψ : LeftHandedWeyl) : - LeftHandedWeyl.dualEquiv ψ = - DualLeftHandedWeyl.toFin2ℂEquiv.symm (!![0, 1; -1, 0] *ᵥ ψ.toFin2ℂ) := rfl - -/-- The inverse of `leftHandedDualEquiv` acting on an element`ψ : dualLeftHanded` corresponds - to multiplying `ψ` by the matrix `!![0, -1; 1, 0]`. -/ -lemma LeftHandedWeyl.dualEquiv_inv_hom_apply (ψ : DualLeftHandedWeyl) : - LeftHandedWeyl.dualEquiv.symm ψ = - LeftHandedWeyl.toFin2ℂEquiv.symm (!![0, -1; 1, 0] *ᵥ ψ.toFin2ℂ) := rfl - -/-- The linear equivalence between `rightHandedWeyl` and `DualRightHandedWeyl` given by multiplying -an element of `rightHandedWeyl` by the matrix `εᵃ⁰ᵃ¹ = !![0, 1; -1, 0]]`. --/ -informal_definition RightHandedWeyl.dualEquiv where - deps := [``RightHandedWeyl, ``DualRightHandedWeyl] - tag := "6VZR4" - -/-- The linear equivalence `rightHandedWeylDualEquiv` is equivariant with respect to the action of -`SL(2,C)` on `rightHandedWeyl` and `DualRightHandedWeyl`. --/ -informal_lemma RightHandedWeyl.dualEquiv_equivariant where - deps := [``RightHandedWeyl.dualEquiv] - tag := "6VZSG" - -end - end Fermion From 852e4202c4dab3958f15e1323ed2804b1bd3c3ac Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:25:03 +0100 Subject: [PATCH 008/254] feat: Delete now empty files --- .../Tensors/ComplexTensor/Weyl/Basic.lean | 31 ------------------- .../Tensors/ComplexTensor/Weyl/Modules.lean | 30 ------------------ 2 files changed, 61 deletions(-) delete mode 100644 Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean delete mode 100644 Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean deleted file mode 100644 index e010ca8c9..000000000 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Basic.lean +++ /dev/null @@ -1,31 +0,0 @@ -/- -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.Tensors.ComplexTensor.Weyl.Modules -public import Physlib.Relativity.SL2C.Basic -public import Physlib.Meta.Informal.Basic -public import Physlib.Meta.TODO.Basic -/-! - -# Weyl fermions - -A good reference for the material in this file is: -https://particle.physics.ucdavis.edu/modernsusy/slides/slideimages/spinorfeynrules.pdf - --/ - -@[expose] public section - -namespace Fermion -noncomputable section - -open Module Matrix -open MatrixGroups -open Complex -open TensorProduct - -end Fermion diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean b/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean deleted file mode 100644 index 72d1459f0..000000000 --- a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Modules.lean +++ /dev/null @@ -1,30 +0,0 @@ -/- -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 Mathlib.Analysis.Complex.Basic -public import Physlib.Meta.TODO.Basic -/-! - -## Modules associated with Fermions - -Weyl fermions live in the vector space `ℂ^2`, defined here as `Fin 2 → ℂ`. -However if we simply define the Module of Weyl fermions as `Fin 2 → ℂ` we get casting problems, -where e.g. left-handed fermions can be cast to right-handed fermions etc. -To overcome this, for each type of Weyl fermion we define a structure that wraps `Fin 2 → ℂ`, -and these structures we define the instance of a module. This prevents casting between different -types of fermions. - - --/ - -@[expose] public section - -namespace Fermion -noncomputable section - -end -end Fermion From 6a299a87bbb884a34971f20de3af29cafdf84d15 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:25:33 +0100 Subject: [PATCH 009/254] feat: Move auxillary files --- .../{Tensors/ComplexTensor => Fermions}/Weyl/Contraction.lean | 0 .../{Tensors/ComplexTensor => Fermions}/Weyl/Metric.lean | 0 .../Relativity/{Tensors/ComplexTensor => Fermions}/Weyl/Two.lean | 0 .../Relativity/{Tensors/ComplexTensor => Fermions}/Weyl/Unit.lean | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename Physlib/Relativity/{Tensors/ComplexTensor => Fermions}/Weyl/Contraction.lean (100%) rename Physlib/Relativity/{Tensors/ComplexTensor => Fermions}/Weyl/Metric.lean (100%) rename Physlib/Relativity/{Tensors/ComplexTensor => Fermions}/Weyl/Two.lean (100%) rename Physlib/Relativity/{Tensors/ComplexTensor => Fermions}/Weyl/Unit.lean (100%) diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Contraction.lean b/Physlib/Relativity/Fermions/Weyl/Contraction.lean similarity index 100% rename from Physlib/Relativity/Tensors/ComplexTensor/Weyl/Contraction.lean rename to Physlib/Relativity/Fermions/Weyl/Contraction.lean diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Metric.lean b/Physlib/Relativity/Fermions/Weyl/Metric.lean similarity index 100% rename from Physlib/Relativity/Tensors/ComplexTensor/Weyl/Metric.lean rename to Physlib/Relativity/Fermions/Weyl/Metric.lean diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Two.lean b/Physlib/Relativity/Fermions/Weyl/Two.lean similarity index 100% rename from Physlib/Relativity/Tensors/ComplexTensor/Weyl/Two.lean rename to Physlib/Relativity/Fermions/Weyl/Two.lean diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Weyl/Unit.lean b/Physlib/Relativity/Fermions/Weyl/Unit.lean similarity index 100% rename from Physlib/Relativity/Tensors/ComplexTensor/Weyl/Unit.lean rename to Physlib/Relativity/Fermions/Weyl/Unit.lean From c9c10026fee9bfb98cd939a9ed17ed5e1b0164bb Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:30:21 +0100 Subject: [PATCH 010/254] feat: Update imports --- Physlib.lean | 14 ++++++++------ .../StandardModel/Fermions/QuarkDoublet.lean | 5 ++++- Physlib/Relativity/Fermions/Weyl/Contraction.lean | 5 ++++- Physlib/Relativity/Fermions/Weyl/Metric.lean | 2 +- Physlib/Relativity/Fermions/Weyl/Two.lean | 5 ++++- Physlib/Relativity/Fermions/Weyl/Unit.lean | 4 ++-- Physlib/Relativity/PauliMatrices/AsTensor.lean | 2 +- .../Relativity/Tensors/ComplexTensor/Basic.lean | 2 +- 8 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Physlib.lean b/Physlib.lean index 8ac15a401..2187dc782 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -359,12 +359,14 @@ public import Physlib.Relativity.Tensors.ComplexTensor.Units.Symm public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Contraction public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Modules -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Basic -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Contraction -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Metric -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Modules -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Two -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Unit +public import Physlib.Relativity.Fermions.Weyl.Contraction +public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded +public import Physlib.Relativity.Fermions.Weyl.DualRightHanded +public import Physlib.Relativity.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.Metric +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.Fermions.Weyl.Two +public import Physlib.Relativity.Fermions.Weyl.Unit public import Physlib.Relativity.Tensors.ComponentIdx.Basic public import Physlib.Relativity.Tensors.ComponentIdx.Contraction public import Physlib.Relativity.Tensors.ComponentIdx.Product diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean index 3363a4380..b8f620937 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean @@ -6,7 +6,10 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Basic +public import Physlib.Relativity.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded +public import Physlib.Relativity.Fermions.Weyl.DualRightHanded /-! # The type corresponding to quark doublets diff --git a/Physlib/Relativity/Fermions/Weyl/Contraction.lean b/Physlib/Relativity/Fermions/Weyl/Contraction.lean index e1b9cc659..bf2001a74 100644 --- a/Physlib/Relativity/Fermions/Weyl/Contraction.lean +++ b/Physlib/Relativity/Fermions/Weyl/Contraction.lean @@ -5,7 +5,10 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Basic +public import Physlib.Relativity.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded +public import Physlib.Relativity.Fermions.Weyl.DualRightHanded /-! # Contraction of Weyl fermions diff --git a/Physlib/Relativity/Fermions/Weyl/Metric.lean b/Physlib/Relativity/Fermions/Weyl/Metric.lean index ea042b91e..6e6ae5df8 100644 --- a/Physlib/Relativity/Fermions/Weyl/Metric.lean +++ b/Physlib/Relativity/Fermions/Weyl/Metric.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Unit +public import Physlib.Relativity.Fermions.Weyl.Unit /-! # Metrics of Weyl fermions diff --git a/Physlib/Relativity/Fermions/Weyl/Two.lean b/Physlib/Relativity/Fermions/Weyl/Two.lean index 1d0d5a982..ca8e4636d 100644 --- a/Physlib/Relativity/Fermions/Weyl/Two.lean +++ b/Physlib/Relativity/Fermions/Weyl/Two.lean @@ -5,7 +5,10 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Basic +public import Physlib.Relativity.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded +public import Physlib.Relativity.Fermions.Weyl.DualRightHanded /-! # Tensor product of two Weyl fermion diff --git a/Physlib/Relativity/Fermions/Weyl/Unit.lean b/Physlib/Relativity/Fermions/Weyl/Unit.lean index 38f5c77b8..70786f175 100644 --- a/Physlib/Relativity/Fermions/Weyl/Unit.lean +++ b/Physlib/Relativity/Fermions/Weyl/Unit.lean @@ -5,8 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Two -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Contraction +public import Physlib.Relativity.Fermions.Weyl.Two +public import Physlib.Relativity.Fermions.Weyl.Contraction /-! # Units of Weyl fermions diff --git a/Physlib/Relativity/PauliMatrices/AsTensor.lean b/Physlib/Relativity/PauliMatrices/AsTensor.lean index 9c29bc6d8..c2d84e1f4 100644 --- a/Physlib/Relativity/PauliMatrices/AsTensor.lean +++ b/Physlib/Relativity/PauliMatrices/AsTensor.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Two +public import Physlib.Relativity.Fermions.Weyl.Two public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic /-! diff --git a/Physlib/Relativity/Tensors/ComplexTensor/Basic.lean b/Physlib/Relativity/Tensors/ComplexTensor/Basic.lean index 472983f5f..73cda373e 100644 --- a/Physlib/Relativity/Tensors/ComplexTensor/Basic.lean +++ b/Physlib/Relativity/Tensors/ComplexTensor/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith, Nikolai Kashcheev module public import Physlib.Relativity.Tensors.ComplexTensor.Metrics.Pre -public import Physlib.Relativity.Tensors.ComplexTensor.Weyl.Metric +public import Physlib.Relativity.Fermions.Weyl.Metric /-! ## Complex Lorentz tensors From 102686d69c5b30f320123661717208c404f3fb1e Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:00:12 +0100 Subject: [PATCH 011/254] refactor: Sort Physlib.lean --- Physlib.lean | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Physlib.lean b/Physlib.lean index 2187dc782..b8b4d91db 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -320,6 +320,14 @@ public import Physlib.QuantumMechanics.OneDimension.ReflectionlessPotential.Basi public import Physlib.QuantumMechanics.PlanckConstant public import Physlib.Relativity.Bispinors.Basic public import Physlib.Relativity.CliffordAlgebra +public import Physlib.Relativity.Fermions.Weyl.Contraction +public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded +public import Physlib.Relativity.Fermions.Weyl.DualRightHanded +public import Physlib.Relativity.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.Metric +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.Fermions.Weyl.Two +public import Physlib.Relativity.Fermions.Weyl.Unit public import Physlib.Relativity.LorentzAlgebra.Basic public import Physlib.Relativity.LorentzAlgebra.Basis public import Physlib.Relativity.LorentzAlgebra.ExponentialMap @@ -359,14 +367,6 @@ public import Physlib.Relativity.Tensors.ComplexTensor.Units.Symm public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Contraction public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Modules -public import Physlib.Relativity.Fermions.Weyl.Contraction -public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded -public import Physlib.Relativity.Fermions.Weyl.DualRightHanded -public import Physlib.Relativity.Fermions.Weyl.LeftHanded -public import Physlib.Relativity.Fermions.Weyl.Metric -public import Physlib.Relativity.Fermions.Weyl.RightHanded -public import Physlib.Relativity.Fermions.Weyl.Two -public import Physlib.Relativity.Fermions.Weyl.Unit public import Physlib.Relativity.Tensors.ComponentIdx.Basic public import Physlib.Relativity.Tensors.ComponentIdx.Contraction public import Physlib.Relativity.Tensors.ComponentIdx.Product From 1feb79c2f2fd48d779d98c18347e420f7f4b7ef9 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:43:12 +0100 Subject: [PATCH 012/254] Add import for Duals in Physlib.lean --- Physlib.lean | 1 + 1 file changed, 1 insertion(+) diff --git a/Physlib.lean b/Physlib.lean index b8b4d91db..65a000eb1 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -323,6 +323,7 @@ public import Physlib.Relativity.CliffordAlgebra public import Physlib.Relativity.Fermions.Weyl.Contraction public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded public import Physlib.Relativity.Fermions.Weyl.DualRightHanded +public import Physlib.Relativity.Fermions.Weyl.Duals public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.Metric public import Physlib.Relativity.Fermions.Weyl.RightHanded From 434114661dbf448559aa5744f057fb3dceb8f9ca Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:26:03 +0100 Subject: [PATCH 013/254] feat: Claudes first attempt (I gave it some starters) Prompt: I want you to: 1. Fill out the sorries in this file. 2. Define a instance of a `Star` on `potentialAlgebra` defined by conjugating Left and Right weyl fermions, and using CliffordAlgebra.reverse 3. Define a representation of the Lorentz group on potentialAlgebra. 4. Define the majorana mass for a LeftHandedWeyl. 5. Show it is Lorentz invariant. Co-Authored-By: Claude --- Physlib.lean | 1 + Physlib/Relativity/Fermions/Weyl/Metric.lean | 7 + .../Fermions/Weyl/PotentialAlgebra.lean | 592 ++++++++++++++++++ 3 files changed, 600 insertions(+) create mode 100644 Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean diff --git a/Physlib.lean b/Physlib.lean index 65a000eb1..3142dc696 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -326,6 +326,7 @@ public import Physlib.Relativity.Fermions.Weyl.DualRightHanded public import Physlib.Relativity.Fermions.Weyl.Duals public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.Metric +public import Physlib.Relativity.Fermions.Weyl.PotentialAlgebra public import Physlib.Relativity.Fermions.Weyl.RightHanded public import Physlib.Relativity.Fermions.Weyl.Two public import Physlib.Relativity.Fermions.Weyl.Unit diff --git a/Physlib/Relativity/Fermions/Weyl/Metric.lean b/Physlib/Relativity/Fermions/Weyl/Metric.lean index 6e6ae5df8..cf6b3ea46 100644 --- a/Physlib/Relativity/Fermions/Weyl/Metric.lean +++ b/Physlib/Relativity/Fermions/Weyl/Metric.lean @@ -118,6 +118,13 @@ lemma leftMetric_apply_one : leftMetric (1 : ℂ) = leftMetricVal := by change (1 : ℂ) • leftMetricVal = leftMetricVal simp only [one_smul] +/-- The metric `εᵃᵃ` is invariant under the action of `SL(2,ℂ)`. -/ +lemma leftMetricVal_rep (M : SL(2,ℂ)) : + TensorProduct.map (LeftHandedWeyl.rep M) (LeftHandedWeyl.rep M) leftMetricVal = + leftMetricVal := by + have h := LinearMap.congr_fun (leftMetric.isIntertwining' M) (1 : ℂ) + simpa [leftMetric_apply_one, Representation.tprod_apply] using h.symm + /-- The metric `εₐₐ` as an element of `(dualLeftHanded ⊗ dualLeftHanded).V`. -/ def dualLeftMetricVal : (DualLeftHandedWeyl ⊗[ℂ] DualLeftHandedWeyl) := dualLeftdualLeftToMatrix.symm metricRaw diff --git a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean new file mode 100644 index 000000000..4b7581e72 --- /dev/null +++ b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean @@ -0,0 +1,592 @@ +/- +Copyright (c) 2026 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.Fermions.Weyl.Metric +public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +public import Mathlib.LinearAlgebra.ExteriorAlgebra.OfAlternating +/-! + +# The potential algebra of Weyl fermions + +## i. Overview + +Fermions anticommute. Thus a potential built out of a Weyl fermion is not a polynomial in the +components of that fermion, but an element of the exterior (Grassmann) algebra generated by them. + +In this file we consider a single left-handed Weyl fermion `ψ^α` together with its conjugate, +the right-handed Weyl fermion `ψ̄^{\dot α}`. The `potentialAlgebra` is the exterior algebra +generated by the components of these two fields. It carries a `Star` operation, which conjugates +the fermions and reverses the order of the generators, and an action of `SL(2,ℂ)`, the double +cover of the Lorentz group. + +As an example we define the Majorana mass term of the left-handed Weyl fermion, and show that it +is invariant under the action of `SL(2,ℂ)` and fixed by the `Star` operation. + +## ii. Key results + +- `Fermion.LeftHandedWeyl.conjugate` : the conjugate of a left-handed Weyl fermion. +- `Fermion.potentialAlgebra` : the exterior algebra generated by `ψ^α` and `ψ̄^{\dot α}`. +- `Fermion.potentialAlgebra.instStarRing` : the star operation on the potential algebra. +- `Fermion.potentialAlgebra.rep` : the action of `SL(2,ℂ)` on the potential algebra. +- `Fermion.potentialAlgebra.majoranaMass` : the Majorana mass term of `ψ^α`. +- `Fermion.potentialAlgebra.rep_majoranaMass` : the Majorana mass term is Lorentz invariant. +- `Fermion.potentialAlgebra.star_majoranaMass` : the Majorana mass term is real. + +## iii. Table of contents + +- A. Conjugation of Weyl fermions + - A.1. The conjugate of a right-handed Weyl fermion + - A.2. The conjugate of a left-handed Weyl fermion + - A.3. Conjugation of the Weyl fermion generators +- B. The action of `SL(2,ℂ)` on the Weyl fermion generators +- C. The conjugate of a `ℂ`-algebra +- D. The potential algebra + - D.1. Basic instances on the potential algebra + - D.2. The generators of the potential algebra +- E. The star operation on the potential algebra +- F. The action of `SL(2,ℂ)` on the potential algebra +- G. The Majorana mass term + +## iv. References + +- Dreiner, Haber and Martin, *Two-component spinor techniques and Feynman rules for quantum field + theory and supersymmetry*, https://arxiv.org/abs/0812.1594 + +-/ + +@[expose] public section + +namespace Fermion +noncomputable section + +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct +open CategoryTheory.MonoidalCategory + +/-! + +## A. Conjugation of Weyl fermions + +Complex conjugation of the components of a Weyl fermion exchanges left- and right-handed +Weyl fermions. It is a conjugate-linear map, that is, a semilinear map with respect to +`starRingEnd ℂ`. + +-/ + +/-! + +### A.1. The conjugate of a right-handed Weyl fermion + +-/ + +namespace RightHandedWeyl + +/-- The conjugate `ψ̄^α` of a right-handed Weyl fermion `ψ^{\dot α}`, defined by complex + conjugating each component. It is a left-handed Weyl fermion. -/ +def conjugate : RightHandedWeyl →ₛₗ[starRingEnd ℂ] LeftHandedWeyl where + toFun ψ := ⟨fun i => star (ψ.val i)⟩ + map_add' ψ1 ψ2 := by + apply LeftHandedWeyl.toFin2ℂFun.injective + funext i + exact star_add _ _ + map_smul' c ψ := by + apply LeftHandedWeyl.toFin2ℂFun.injective + funext i + exact star_mul' c (ψ.val i) + +@[simp] +lemma conjugate_val (ψ : RightHandedWeyl) (i : Fin 2) : (conjugate ψ).val i = star (ψ.val i) := rfl + +/-- Conjugation intertwines the representation of `SL(2,ℂ)` on right-handed Weyl fermions with + the representation on left-handed Weyl fermions. -/ +lemma conjugate_rep (M : SL(2,ℂ)) (ψ : RightHandedWeyl) : + conjugate (rep M ψ) = LeftHandedWeyl.rep M (conjugate ψ) := by + apply LeftHandedWeyl.toFin2ℂFun.injective + funext i + change star ((M.1.map star *ᵥ ψ.val) i) = (M.1 *ᵥ fun j => star (ψ.val j)) i + simp [mulVec, dotProduct, star_mul'] + +end RightHandedWeyl + +/-! + +### A.2. The conjugate of a left-handed Weyl fermion + +-/ + +namespace LeftHandedWeyl + +/-- The conjugate `ψ̄^{\dot α}` of a left-handed Weyl fermion `ψ^α`, defined by complex + conjugating each component. It is a right-handed Weyl fermion. -/ +def conjugate : LeftHandedWeyl →ₛₗ[starRingEnd ℂ] RightHandedWeyl where + toFun ψ := ⟨fun i => star (ψ.val i)⟩ + map_add' ψ1 ψ2 := by + apply RightHandedWeyl.toFin2ℂFun.injective + funext i + exact star_add _ _ + map_smul' c ψ := by + apply RightHandedWeyl.toFin2ℂFun.injective + funext i + exact star_mul' c (ψ.val i) + +@[simp] +lemma conjugate_val (ψ : LeftHandedWeyl) (i : Fin 2) : (conjugate ψ).val i = star (ψ.val i) := rfl + +@[simp] +lemma conjugate_conjugate (ψ : LeftHandedWeyl) : + RightHandedWeyl.conjugate (conjugate ψ) = ψ := by + apply toFin2ℂFun.injective + funext i + exact star_star (ψ.val i) + +/-- Conjugation intertwines the representation of `SL(2,ℂ)` on left-handed Weyl fermions with + the representation on right-handed Weyl fermions. -/ +lemma conjugate_rep (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : + conjugate (rep M ψ) = RightHandedWeyl.rep M (conjugate ψ) := by + apply RightHandedWeyl.toFin2ℂFun.injective + funext i + change star ((M.1 *ᵥ ψ.val) i) = (M.1.map star *ᵥ fun j => star (ψ.val j)) i + simp [mulVec, dotProduct, star_mul'] + +end LeftHandedWeyl + +@[simp] +lemma RightHandedWeyl.conjugate_conjugate (ψ : RightHandedWeyl) : + LeftHandedWeyl.conjugate (conjugate ψ) = ψ := by + apply toFin2ℂFun.injective + funext i + exact star_star (ψ.val i) + +/-! + +### A.3. Conjugation of the Weyl fermion generators + +The generators of the potential algebra of a left-handed Weyl fermion `ψ^α` are the components +of `ψ^α` together with the components of its conjugate `ψ̄^{\dot α}`. They therefore live in +`LeftHandedWeyl × RightHandedWeyl`, on which conjugation acts by exchanging the two factors. + +-/ + +/-- Conjugation of the pair `(ψ^α, ψ̄^{\dot α})` of Weyl fermion generators, exchanging the + left-handed and the right-handed fermion. -/ +def conjugateFields : + LeftHandedWeyl × RightHandedWeyl →ₛₗ[starRingEnd ℂ] LeftHandedWeyl × RightHandedWeyl where + toFun ψ := (RightHandedWeyl.conjugate ψ.2, LeftHandedWeyl.conjugate ψ.1) + map_add' ψ φ := by simp + map_smul' c ψ := by simp + +@[simp] +lemma conjugateFields_apply (ψ : LeftHandedWeyl × RightHandedWeyl) : + conjugateFields ψ = (RightHandedWeyl.conjugate ψ.2, LeftHandedWeyl.conjugate ψ.1) := rfl + +@[simp] +lemma conjugateFields_conjugateFields (ψ : LeftHandedWeyl × RightHandedWeyl) : + conjugateFields (conjugateFields ψ) = ψ := by + simp + +/-! + +## B. The action of `SL(2,ℂ)` on the Weyl fermion generators + +-/ + +/-- The representation of `SL(2,ℂ)` on the Weyl fermion generators `(ψ^α, ψ̄^{\dot α})`, + acting by the fundamental representation on the left-handed fermion and by the conjugate + representation on the right-handed fermion. -/ +def repFields : Representation ℂ SL(2,ℂ) (LeftHandedWeyl × RightHandedWeyl) where + toFun M := (LeftHandedWeyl.rep M).prodMap (RightHandedWeyl.rep M) + map_one' := by + refine LinearMap.ext fun ψ => ?_ + simp + map_mul' M N := by + refine LinearMap.ext fun ψ => ?_ + simp [Module.End.mul_apply] + +@[simp] +lemma repFields_apply (M : SL(2,ℂ)) (ψ : LeftHandedWeyl × RightHandedWeyl) : + repFields M ψ = (LeftHandedWeyl.rep M ψ.1, RightHandedWeyl.rep M ψ.2) := rfl + +/-- Conjugation of the Weyl fermion generators commutes with the action of `SL(2,ℂ)`. -/ +lemma conjugateFields_repFields (M : SL(2,ℂ)) (ψ : LeftHandedWeyl × RightHandedWeyl) : + conjugateFields (repFields M ψ) = repFields M (conjugateFields ψ) := by + simp [RightHandedWeyl.conjugate_rep, LeftHandedWeyl.conjugate_rep] + +/-! + +## C. The conjugate of a `ℂ`-algebra + +To define a conjugate-linear algebra map out of an exterior algebra we use its universal property, +which produces `ℂ`-algebra maps. A conjugate-linear algebra map `A → A` is precisely a +`ℂ`-algebra map `A →ₐ[ℂ] ConjAlg A`, where `ConjAlg A` is `A` with the `ℂ`-action twisted by +complex conjugation. + +-/ + +TODO "The construction `ConjAlg` of the conjugate of a `ℂ`-algebra is not specific to fermions. + It should be generalised to an arbitrary star ring of scalars and moved to a mathematics file." + +/-- The `ℂ`-algebra `A` with its `ℂ`-algebra structure twisted by complex conjugation. + A conjugate-linear algebra map `A → A` is the same thing as a `ℂ`-algebra map + `A →ₐ[ℂ] ConjAlg A`. -/ +def ConjAlg (A : Type) : Type := A + +namespace ConjAlg + +variable {A : Type} + +/-- The identity map from a `ℂ`-algebra to its conjugate. -/ +def of (x : A) : ConjAlg A := x + +/-- The identity map from the conjugate of a `ℂ`-algebra back to that algebra. -/ +def val (x : ConjAlg A) : A := x + +@[simp] +lemma val_of (x : A) : val (of x) = x := rfl + +variable [Ring A] + +instance : Ring (ConjAlg A) := inferInstanceAs (Ring A) + +@[simp] +lemma val_add (x y : ConjAlg A) : val (x + y) = val x + val y := rfl + +@[simp] +lemma val_mul (x y : ConjAlg A) : val (x * y) = val x * val y := rfl + +variable [Algebra ℂ A] + +instance : Algebra ℂ (ConjAlg A) := + RingHom.toAlgebra' ((algebraMap ℂ A).comp (starRingEnd ℂ) : ℂ →+* ConjAlg A) + fun c x => Algebra.commutes ((starRingEnd ℂ) c) (val x) + +@[simp] +lemma val_algebraMap (c : ℂ) : + val (algebraMap ℂ (ConjAlg A) c) = algebraMap ℂ A ((starRingEnd ℂ) c) := rfl + +lemma smul_of (c : ℂ) (x : A) : c • of x = of ((starRingEnd ℂ) c • x) := by + rw [Algebra.smul_def, Algebra.smul_def] + rfl + +end ConjAlg + +/-! + +## D. The potential algebra + +-/ + +/-- The potential algebra of a left-handed Weyl fermion `ψ^α`: the exterior (Grassmann) algebra + generated by the components of `ψ^α` and of its conjugate `ψ̄^{\dot α}`. + The potential of a theory of a single Weyl fermion is an element of this algebra. -/ +def potentialAlgebra : Type := ExteriorAlgebra ℂ (LeftHandedWeyl × RightHandedWeyl) + +namespace potentialAlgebra + +/-! + +### D.1. Basic instances on the potential algebra + +-/ + +instance : Ring potentialAlgebra := + inferInstanceAs (Ring (ExteriorAlgebra ℂ (LeftHandedWeyl × RightHandedWeyl))) + +instance : Algebra ℂ potentialAlgebra := + inferInstanceAs (Algebra ℂ (ExteriorAlgebra ℂ (LeftHandedWeyl × RightHandedWeyl))) + +/-! + +### D.2. The generators of the potential algebra + +-/ + +/-- The inclusion of the Weyl fermion generators `(ψ^α, ψ̄^{\dot α})` into the potential + algebra. -/ +def ι : LeftHandedWeyl × RightHandedWeyl →ₗ[ℂ] potentialAlgebra := ExteriorAlgebra.ι ℂ + +lemma ι_sq_zero (ψ : LeftHandedWeyl × RightHandedWeyl) : ι ψ * ι ψ = 0 := + ExteriorAlgebra.ι_sq_zero ψ + +/-- The generators of the potential algebra anticommute, corresponding to the fact that + fermions anticommute. -/ +lemma ι_mul_ι_swap (ψ φ : LeftHandedWeyl × RightHandedWeyl) : ι ψ * ι φ = - (ι φ * ι ψ) := by + have h := CliffordAlgebra.ι_mul_ι_add_swap + (Q := (0 : QuadraticForm ℂ (LeftHandedWeyl × RightHandedWeyl))) ψ φ + simp only [QuadraticMap.polar, QuadraticMap.zero_apply, sub_zero, map_zero] at h + exact eq_neg_of_add_eq_zero_left h + +/-- The generators of the potential algebra coming from the left-handed Weyl fermion `ψ^α`. -/ +def ιLeft : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra := ι ∘ₗ LinearMap.inl ℂ _ _ + +/-- The generators of the potential algebra coming from the right-handed Weyl + fermion `ψ̄^{\dot α}`. -/ +def ιRight : RightHandedWeyl →ₗ[ℂ] potentialAlgebra := ι ∘ₗ LinearMap.inr ℂ _ _ + +lemma ιLeft_apply (ψ : LeftHandedWeyl) : ιLeft ψ = ι (ψ, 0) := rfl + +lemma ιRight_apply (ψ : RightHandedWeyl) : ιRight ψ = ι (0, ψ) := rfl + +/-- The potential algebra is generated, as an algebra, by the image of `ι`. -/ +@[elab_as_elim] +lemma induction {C : potentialAlgebra → Prop} + (algebraMap : ∀ c : ℂ, C (algebraMap ℂ potentialAlgebra c)) + (ι : ∀ ψ, C (potentialAlgebra.ι ψ)) + (mul : ∀ a b, C a → C b → C (a * b)) + (add : ∀ a b, C a → C b → C (a + b)) (x : potentialAlgebra) : C x := + ExteriorAlgebra.induction algebraMap ι mul add x + +/-! + +## E. The star operation on the potential algebra + +The star operation on the potential algebra conjugates the Weyl fermions, exchanging `ψ^α` and +`ψ̄^{\dot α}`, and reverses the order of the Grassmann generators. The reversal is +`CliffordAlgebra.reverse`, and makes the star operation into an anti-automorphism. + +-/ + +/-- Reversal of the order of the Grassmann generators in the potential algebra. -/ +def reverse : potentialAlgebra →ₗ[ℂ] potentialAlgebra := CliffordAlgebra.reverse + +@[simp] +lemma reverse_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : reverse (ι ψ) = ι ψ := + CliffordAlgebra.reverse_ι ψ + +@[simp] +lemma reverse_algebraMap (c : ℂ) : + reverse (algebraMap ℂ potentialAlgebra c) = algebraMap ℂ potentialAlgebra c := + CliffordAlgebra.reverse.commutes c + +@[simp] +lemma reverse_mul (x y : potentialAlgebra) : reverse (x * y) = reverse y * reverse x := + CliffordAlgebra.reverse.map_mul x y + +/-- Conjugation of the Weyl fermions, as a `ℂ`-algebra map from the potential algebra to its + conjugate algebra. Equivalently, a conjugate-linear algebra map on the potential algebra. -/ +def conjHom : potentialAlgebra →ₐ[ℂ] ConjAlg potentialAlgebra := + ExteriorAlgebra.lift ℂ ⟨{ + toFun := fun ψ => ConjAlg.of (ι (conjugateFields ψ)) + map_add' := fun ψ φ => by + rw [map_add, map_add] + rfl + map_smul' := fun c ψ => by + rw [map_smulₛₗ, map_smul, RingHom.id_apply, ConjAlg.smul_of] }, + fun ψ => ι_sq_zero _⟩ + +@[simp] +lemma conjHom_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : + conjHom (ι ψ) = ConjAlg.of (ι (conjugateFields ψ)) := + ExteriorAlgebra.lift_ι_apply _ _ _ ψ + +/-- The conjugation of an element of the potential algebra: conjugate the Weyl fermions and + reverse the order of the Grassmann generators. -/ +def conjugate (x : potentialAlgebra) : potentialAlgebra := reverse (ConjAlg.val (conjHom x)) + +lemma conjugate_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : + conjugate (ι ψ) = ι (conjugateFields ψ) := by + show reverse (ConjAlg.val (conjHom (ι ψ))) = _ + rw [conjHom_ι, ConjAlg.val_of, reverse_ι] + +lemma conjugate_algebraMap (c : ℂ) : + conjugate (algebraMap ℂ potentialAlgebra c) = + algebraMap ℂ potentialAlgebra ((starRingEnd ℂ) c) := by + show reverse (ConjAlg.val (conjHom (algebraMap ℂ potentialAlgebra c))) = _ + rw [AlgHom.commutes, ConjAlg.val_algebraMap, reverse_algebraMap] + +lemma conjugate_mul (x y : potentialAlgebra) : + conjugate (x * y) = conjugate y * conjugate x := by + show reverse (ConjAlg.val (conjHom (x * y))) = _ + rw [map_mul, ConjAlg.val_mul, reverse_mul] + rfl + +lemma conjugate_add (x y : potentialAlgebra) : + conjugate (x + y) = conjugate x + conjugate y := by + show reverse (ConjAlg.val (conjHom (x + y))) = _ + rw [map_add, ConjAlg.val_add, map_add] + rfl + +lemma conjugate_conjugate (x : potentialAlgebra) : conjugate (conjugate x) = x := by + induction x using potentialAlgebra.induction with + | algebraMap c => rw [conjugate_algebraMap, conjugate_algebraMap, starRingEnd_self_apply] + | ι ψ => rw [conjugate_ι, conjugate_ι, conjugateFields_conjugateFields] + | mul a b ha hb => rw [conjugate_mul, conjugate_mul, ha, hb] + | add a b ha hb => rw [conjugate_add, conjugate_add, ha, hb] + +instance instStarRing : StarRing potentialAlgebra where + star := conjugate + star_involutive := conjugate_conjugate + star_mul := conjugate_mul + star_add := conjugate_add + +lemma star_def (x : potentialAlgebra) : star x = conjugate x := rfl + +@[simp] +lemma star_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : star (ι ψ) = ι (conjugateFields ψ) := + conjugate_ι ψ + +@[simp] +lemma star_ιLeft (ψ : LeftHandedWeyl) : star (ιLeft ψ) = ιRight (LeftHandedWeyl.conjugate ψ) := by + rw [ιLeft_apply, star_ι, ιRight_apply] + simp + +@[simp] +lemma star_ιRight (ψ : RightHandedWeyl) : star (ιRight ψ) = ιLeft (RightHandedWeyl.conjugate ψ) := by + rw [ιRight_apply, star_ι, ιLeft_apply] + simp + +@[simp] +lemma star_algebraMap (c : ℂ) : + star (algebraMap ℂ potentialAlgebra c) = algebraMap ℂ potentialAlgebra ((starRingEnd ℂ) c) := + conjugate_algebraMap c + +/-- The star operation on the potential algebra is conjugate-linear. -/ +instance : StarModule ℂ potentialAlgebra where + star_smul c x := by + rw [Algebra.smul_def, star_mul, star_algebraMap, ← Algebra.commutes, ← Algebra.smul_def] + rfl + +/-! + +## F. The action of `SL(2,ℂ)` on the potential algebra + +-/ + +/-- The representation of `SL(2,ℂ)`, the double cover of the Lorentz group, on the potential + algebra, induced by its action on the Weyl fermion generators. -/ +def rep : Representation ℂ SL(2,ℂ) potentialAlgebra where + toFun M := (ExteriorAlgebra.map (repFields M)).toLinearMap + map_one' := by + refine LinearMap.ext fun x => ?_ + rw [map_one] + simp [Module.End.one_eq_id] + rfl + map_mul' M N := by + refine LinearMap.ext fun x => ?_ + rw [map_mul] + exact (AlgHom.congr_fun (ExteriorAlgebra.map_comp_map _ _) x).symm + +@[simp] +lemma rep_ι (M : SL(2,ℂ)) (ψ : LeftHandedWeyl × RightHandedWeyl) : + rep M (ι ψ) = ι (repFields M ψ) := + ExteriorAlgebra.map_apply_ι _ _ + +@[simp] +lemma rep_mul (M : SL(2,ℂ)) (x y : potentialAlgebra) : rep M (x * y) = rep M x * rep M y := + map_mul (ExteriorAlgebra.map (repFields M)) x y + +@[simp] +lemma rep_algebraMap (M : SL(2,ℂ)) (c : ℂ) : + rep M (algebraMap ℂ potentialAlgebra c) = algebraMap ℂ potentialAlgebra c := + AlgHom.commutes (ExteriorAlgebra.map (repFields M)) c + +@[simp] +lemma rep_ιLeft (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : + rep M (ιLeft ψ) = ιLeft (LeftHandedWeyl.rep M ψ) := by + rw [ιLeft_apply, rep_ι, ιLeft_apply] + simp + +/-- The star operation on the potential algebra commutes with the action of `SL(2,ℂ)`. -/ +lemma rep_star (M : SL(2,ℂ)) (x : potentialAlgebra) : rep M (star x) = star (rep M x) := by + induction x using potentialAlgebra.induction with + | algebraMap c => rw [star_algebraMap, rep_algebraMap, rep_algebraMap, star_algebraMap] + | ι ψ => rw [star_ι, rep_ι, rep_ι, star_ι, conjugateFields_repFields] + | mul a b ha hb => rw [star_mul, rep_mul, rep_mul, ha, hb, star_mul] + | add a b ha hb => rw [star_add, map_add, map_add, ha, hb, star_add] + +/-! + +## G. The Majorana mass term + +The Majorana mass term of a left-handed Weyl fermion is `m ε_{αβ} ψ^α ψ^β` plus its conjugate. +Since the generators anticommute, this bilinear does not vanish, and it is Lorentz invariant +because the metric `ε` is. + +-/ + +/-- The multiplication of two left-handed generators, as a linear map on + `LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl`. -/ +def leftWedge : LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl →ₗ[ℂ] potentialAlgebra := + TensorProduct.lift (((LinearMap.mul ℂ potentialAlgebra).comp ιLeft).compl₂ ιLeft) + +@[simp] +lemma leftWedge_tmul (ψ φ : LeftHandedWeyl) : leftWedge (ψ ⊗ₜ[ℂ] φ) = ιLeft ψ * ιLeft φ := rfl + +lemma rep_leftWedge (M : SL(2,ℂ)) (x : LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl) : + rep M (leftWedge x) = + leftWedge (TensorProduct.map (LeftHandedWeyl.rep M) (LeftHandedWeyl.rep M) x) := by + induction x with + | zero => simp + | tmul ψ φ => simp + | add a b ha hb => simp [ha, hb] + +/-- The Lorentz invariant bilinear `ε_{αβ} ψ^α ψ^β` of a left-handed Weyl fermion, as an element + of the potential algebra. -/ +def leftBilinear : potentialAlgebra := leftWedge leftMetricVal + +/-- The bilinear `ε_{αβ} ψ^α ψ^β` is invariant under the action of `SL(2,ℂ)`. -/ +lemma rep_leftBilinear (M : SL(2,ℂ)) : rep M leftBilinear = leftBilinear := by + rw [leftBilinear, rep_leftWedge, leftMetricVal_rep] + +/-- In terms of the basis, the bilinear `ε_{αβ} ψ^α ψ^β` is `- 2 ψ^1 ψ^2`. It is non-zero + precisely because the generators anticommute. -/ +lemma leftBilinear_eq_smul : leftBilinear = + (-2 : ℂ) • (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := by + have h : ιLeft (LeftHandedWeyl.basis 1) * ιLeft (LeftHandedWeyl.basis 0) = + - (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := + ι_mul_ι_swap _ _ + rw [leftBilinear, leftMetricVal_expand_tmul, map_add, map_neg, leftWedge_tmul, leftWedge_tmul, h] + module + +/-- The bilinear `ε_{αβ} ψ^α ψ^β` is non-zero. For a commuting field the same expression would + vanish by the antisymmetry of `ε`. -/ +lemma leftBilinear_ne_zero : leftBilinear ≠ 0 := by + /- The alternating form `(v, w) ↦ det ![v.1, w.1]` on the generators lifts to a linear + functional on the potential algebra which is non-zero on `leftBilinear`. -/ + let form : (LeftHandedWeyl × RightHandedWeyl) [⋀^Fin 2]→ₗ[ℂ] ℂ := + Matrix.detRowAlternating.compLinearMap + (LeftHandedWeyl.toFin2ℂEquiv.toLinearMap ∘ₗ LinearMap.fst ℂ LeftHandedWeyl RightHandedWeyl) + let f : ∀ i, (LeftHandedWeyl × RightHandedWeyl) [⋀^Fin i]→ₗ[ℂ] ℂ := + Function.update (fun _ => 0) 2 form + have hprod : ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1) = + ExteriorAlgebra.ιMulti ℂ 2 + ![(LeftHandedWeyl.basis 0, 0), (LeftHandedWeyl.basis 1, 0)] := by + rw [ExteriorAlgebra.ιMulti_apply] + simp [ιLeft_apply, ι] + rfl + let F : potentialAlgebra →ₗ[ℂ] ℂ := ExteriorAlgebra.liftAlternating f + have hmulti : F (ExteriorAlgebra.ιMulti ℂ 2 + ![(LeftHandedWeyl.basis 0, 0), (LeftHandedWeyl.basis 1, 0)]) = 1 := by + show ExteriorAlgebra.liftAlternating f _ = 1 + rw [ExteriorAlgebra.liftAlternating_apply_ιMulti] + simp only [f, Function.update_self, form, AlternatingMap.compLinearMap_apply] + show Matrix.det _ = 1 + simp [Matrix.det_fin_two, LeftHandedWeyl.toFin2ℂFun, LeftHandedWeyl.basis_apply] + have hF : F leftBilinear = -2 := by + rw [leftBilinear_eq_smul, map_smul, hprod, hmulti, smul_eq_mul, mul_one] + intro h + rw [h, map_zero] at hF + norm_num at hF + +/-- The Majorana mass term, of complex mass `m`, of a left-handed Weyl fermion. It is the sum of + the bilinear `m ε_{αβ} ψ^α ψ^β` and its conjugate. -/ +def majoranaMass (m : ℂ) : potentialAlgebra := m • leftBilinear + star (m • leftBilinear) + +/-- The Majorana mass term is real, that is, it is fixed by the star operation. -/ +lemma star_majoranaMass (m : ℂ) : star (majoranaMass m) = majoranaMass m := by + rw [majoranaMass, star_add, star_star, add_comm] + +/-- The Majorana mass term is invariant under the action of `SL(2,ℂ)`, that is, + it is Lorentz invariant. -/ +lemma rep_majoranaMass (M : SL(2,ℂ)) (m : ℂ) : rep M (majoranaMass m) = majoranaMass m := by + rw [majoranaMass, map_add, rep_star, map_smul, rep_leftBilinear] + +end potentialAlgebra +end +end Fermion From 5fa0d6cb372140d0efb4925263c8de55972ed10c Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:36:44 +0100 Subject: [PATCH 014/254] attempt2 : not much better Your definition of majoranaMass is wrong. In particular it does not even take in a fermion as an argument. I wouldn't not define leftBilinear as it does not make any sense - again also no fermions there. > Really you should be using contractions. and the dual maps Co-Authored-By: Claude --- .../Fermions/Weyl/PotentialAlgebra.lean | 151 +++++++++++------- 1 file changed, 97 insertions(+), 54 deletions(-) diff --git a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean index 4b7581e72..65f3a0ea5 100644 --- a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean +++ b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean @@ -18,14 +18,14 @@ public import Mathlib.LinearAlgebra.ExteriorAlgebra.OfAlternating Fermions anticommute. Thus a potential built out of a Weyl fermion is not a polynomial in the components of that fermion, but an element of the exterior (Grassmann) algebra generated by them. -In this file we consider a single left-handed Weyl fermion `ψ^α` together with its conjugate, -the right-handed Weyl fermion `ψ̄^{\dot α}`. The `potentialAlgebra` is the exterior algebra -generated by the components of these two fields. It carries a `Star` operation, which conjugates -the fermions and reverses the order of the generators, and an action of `SL(2,ℂ)`, the double -cover of the Lorentz group. +The `potentialAlgebra` is the exterior algebra generated by a left-handed Weyl fermion `ψ^α` +together with its conjugate, the right-handed Weyl fermion `ψ̄^{\dot α}`. It carries a `Star` +operation, which conjugates the fermions and reverses the order of the generators, and an action +of `SL(2,ℂ)`, the double cover of the Lorentz group. -As an example we define the Majorana mass term of the left-handed Weyl fermion, and show that it -is invariant under the action of `SL(2,ℂ)` and fixed by the `Star` operation. +A left-handed Weyl fermion of such a theory is a linear map +`LeftHandedWeyl →ₗ[ℂ] potentialAlgebra`. As an example we define the Majorana mass term of such a +fermion, and show that it is Lorentz invariant and fixed by the `Star` operation. ## ii. Key results @@ -33,7 +33,7 @@ is invariant under the action of `SL(2,ℂ)` and fixed by the `Star` operation. - `Fermion.potentialAlgebra` : the exterior algebra generated by `ψ^α` and `ψ̄^{\dot α}`. - `Fermion.potentialAlgebra.instStarRing` : the star operation on the potential algebra. - `Fermion.potentialAlgebra.rep` : the action of `SL(2,ℂ)` on the potential algebra. -- `Fermion.potentialAlgebra.majoranaMass` : the Majorana mass term of `ψ^α`. +- `Fermion.potentialAlgebra.majoranaMass` : the Majorana mass term of a left-handed Weyl fermion. - `Fermion.potentialAlgebra.rep_majoranaMass` : the Majorana mass term is Lorentz invariant. - `Fermion.potentialAlgebra.star_majoranaMass` : the Majorana mass term is real. @@ -50,7 +50,8 @@ is invariant under the action of `SL(2,ℂ)` and fixed by the `Star` operation. - D.2. The generators of the potential algebra - E. The star operation on the potential algebra - F. The action of `SL(2,ℂ)` on the potential algebra -- G. The Majorana mass term +- G. Left-handed Weyl fermions of the theory +- H. The Majorana mass term ## iv. References @@ -502,53 +503,86 @@ lemma rep_star (M : SL(2,ℂ)) (x : potentialAlgebra) : rep M (star x) = star (r /-! -## G. The Majorana mass term +## G. Left-handed Weyl fermions of the theory -The Majorana mass term of a left-handed Weyl fermion is `m ε_{αβ} ψ^α ψ^β` plus its conjugate. -Since the generators anticommute, this bilinear does not vanish, and it is Lorentz invariant -because the metric `ε` is. +A left-handed Weyl fermion of a theory whose potentials live in `potentialAlgebra` is a linear +map `ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra`, taking each spinor direction to a Grassmann-odd +element of the potential algebra. Such fermions carry the representation +`LeftHandedWeyl.rep.linHom rep` of `SL(2,ℂ)`. The tautological fermion is `ιLeft`, whose +components are the left-handed generators of the potential algebra. -/ -/-- The multiplication of two left-handed generators, as a linear map on - `LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl`. -/ -def leftWedge : LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl →ₗ[ℂ] potentialAlgebra := - TensorProduct.lift (((LinearMap.mul ℂ potentialAlgebra).comp ιLeft).compl₂ ιLeft) +/-- The representation of `SL(2,ℂ)` on the left-handed Weyl fermions of the theory. -/ +def repFermionLeft : Representation ℂ SL(2,ℂ) (LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) := + LeftHandedWeyl.rep.linHom rep -@[simp] -lemma leftWedge_tmul (ψ φ : LeftHandedWeyl) : leftWedge (ψ ⊗ₜ[ℂ] φ) = ιLeft ψ * ιLeft φ := rfl - -lemma rep_leftWedge (M : SL(2,ℂ)) (x : LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl) : - rep M (leftWedge x) = - leftWedge (TensorProduct.map (LeftHandedWeyl.rep M) (LeftHandedWeyl.rep M) x) := by - induction x with - | zero => simp - | tmul ψ φ => simp - | add a b ha hb => simp [ha, hb] - -/-- The Lorentz invariant bilinear `ε_{αβ} ψ^α ψ^β` of a left-handed Weyl fermion, as an element - of the potential algebra. -/ -def leftBilinear : potentialAlgebra := leftWedge leftMetricVal - -/-- The bilinear `ε_{αβ} ψ^α ψ^β` is invariant under the action of `SL(2,ℂ)`. -/ -lemma rep_leftBilinear (M : SL(2,ℂ)) : rep M leftBilinear = leftBilinear := by - rw [leftBilinear, rep_leftWedge, leftMetricVal_rep] - -/-- In terms of the basis, the bilinear `ε_{αβ} ψ^α ψ^β` is `- 2 ψ^1 ψ^2`. It is non-zero - precisely because the generators anticommute. -/ -lemma leftBilinear_eq_smul : leftBilinear = +lemma repFermionLeft_apply (M : SL(2,ℂ)) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : + repFermionLeft M ψ = (rep M) ∘ₗ ψ ∘ₗ LeftHandedWeyl.rep M⁻¹ := rfl + +/-- The tautological left-handed Weyl fermion, whose components are the left-handed generators + of the potential algebra, is invariant under `SL(2,ℂ)`. -/ +lemma repFermionLeft_ιLeft (M : SL(2,ℂ)) : repFermionLeft M ιLeft = ιLeft := by + refine LinearMap.ext fun ψ => ?_ + rw [repFermionLeft_apply] + simp only [LinearMap.comp_apply, rep_ιLeft, ← Module.End.mul_apply, ← map_mul, + mul_inv_cancel, map_one, Module.End.one_apply] + +/-! + +## H. The Majorana mass term + +The Majorana mass term of a left-handed Weyl fermion `ψ` is `m ε^{αβ} ψ_α ψ_β` plus its +conjugate. It is obtained by contracting the metric `ε` with two copies of `ψ` and multiplying +the resulting elements of the potential algebra. Since the components of `ψ` anticommute, the +bilinear does not vanish, and it is Lorentz invariant because the metric is. + +-/ + +/-- The bilinear `ε^{αβ} ψ_α φ_β` of two left-handed Weyl fermions, obtained by contracting the + metric `leftMetricVal` with `ψ` and `φ`, and multiplying the results in the potential + algebra. -/ +def leftBilinear (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : potentialAlgebra := + LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ψ φ leftMetricVal) + +lemma leftBilinear_eq (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : + leftBilinear ψ φ = - (ψ (LeftHandedWeyl.basis 0) * φ (LeftHandedWeyl.basis 1)) + + ψ (LeftHandedWeyl.basis 1) * φ (LeftHandedWeyl.basis 0) := by + rw [leftBilinear, leftMetricVal_expand_tmul] + simp + +/-- Acting with `SL(2,ℂ)` on the potential algebra can be moved through the bilinear. -/ +lemma rep_leftBilinear (M : SL(2,ℂ)) (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : + rep M (leftBilinear ψ φ) = leftBilinear ((rep M) ∘ₗ ψ) ((rep M) ∘ₗ φ) := by + simp [leftBilinear_eq, map_add, map_neg] + +/-- Acting with `SL(2,ℂ)` on the spinor index of both fermions leaves the bilinear unchanged, + since the metric `ε` is invariant. -/ +lemma leftBilinear_comp_rep (M : SL(2,ℂ)) (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : + leftBilinear (ψ ∘ₗ LeftHandedWeyl.rep M) (φ ∘ₗ LeftHandedWeyl.rep M) = leftBilinear ψ φ := by + rw [leftBilinear, leftBilinear, TensorProduct.map_comp, LinearMap.comp_apply, leftMetricVal_rep] + +/-- The bilinear of two left-handed Weyl fermions transforms as a scalar of the potential + algebra under `SL(2,ℂ)`. -/ +lemma leftBilinear_repFermionLeft (M : SL(2,ℂ)) (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : + leftBilinear (repFermionLeft M ψ) (repFermionLeft M φ) = rep M (leftBilinear ψ φ) := by + rw [repFermionLeft_apply, repFermionLeft_apply, ← rep_leftBilinear, leftBilinear_comp_rep] + +/-- In terms of the basis, the bilinear of the tautological fermion with itself is + `- 2 ψ^1 ψ^2`. It is non-zero precisely because the components of `ψ` anticommute. -/ +lemma leftBilinear_ιLeft_eq_smul : leftBilinear ιLeft ιLeft = (-2 : ℂ) • (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := by have h : ιLeft (LeftHandedWeyl.basis 1) * ιLeft (LeftHandedWeyl.basis 0) = - (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := ι_mul_ι_swap _ _ - rw [leftBilinear, leftMetricVal_expand_tmul, map_add, map_neg, leftWedge_tmul, leftWedge_tmul, h] + rw [leftBilinear_eq, h] module -/-- The bilinear `ε_{αβ} ψ^α ψ^β` is non-zero. For a commuting field the same expression would - vanish by the antisymmetry of `ε`. -/ -lemma leftBilinear_ne_zero : leftBilinear ≠ 0 := by +/-- The bilinear of the tautological fermion with itself is non-zero. For a commuting field the + same expression would vanish by the antisymmetry of `ε`. -/ +lemma leftBilinear_ιLeft_ne_zero : leftBilinear ιLeft ιLeft ≠ 0 := by /- The alternating form `(v, w) ↦ det ![v.1, w.1]` on the generators lifts to a linear - functional on the potential algebra which is non-zero on `leftBilinear`. -/ + functional on the potential algebra which is non-zero on the bilinear. -/ let form : (LeftHandedWeyl × RightHandedWeyl) [⋀^Fin 2]→ₗ[ℂ] ℂ := Matrix.detRowAlternating.compLinearMap (LeftHandedWeyl.toFin2ℂEquiv.toLinearMap ∘ₗ LinearMap.fst ℂ LeftHandedWeyl RightHandedWeyl) @@ -568,24 +602,33 @@ lemma leftBilinear_ne_zero : leftBilinear ≠ 0 := by simp only [f, Function.update_self, form, AlternatingMap.compLinearMap_apply] show Matrix.det _ = 1 simp [Matrix.det_fin_two, LeftHandedWeyl.toFin2ℂFun, LeftHandedWeyl.basis_apply] - have hF : F leftBilinear = -2 := by - rw [leftBilinear_eq_smul, map_smul, hprod, hmulti, smul_eq_mul, mul_one] + have hF : F (leftBilinear ιLeft ιLeft) = -2 := by + rw [leftBilinear_ιLeft_eq_smul, map_smul, hprod, hmulti, smul_eq_mul, mul_one] intro h rw [h, map_zero] at hF norm_num at hF -/-- The Majorana mass term, of complex mass `m`, of a left-handed Weyl fermion. It is the sum of - the bilinear `m ε_{αβ} ψ^α ψ^β` and its conjugate. -/ -def majoranaMass (m : ℂ) : potentialAlgebra := m • leftBilinear + star (m • leftBilinear) +/-- The Majorana mass term, of complex mass `m`, of a left-handed Weyl fermion `ψ`. It is the sum + of the bilinear `m ε^{αβ} ψ_α ψ_β` and its conjugate. -/ +def majoranaMass (m : ℂ) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : potentialAlgebra := + m • leftBilinear ψ ψ + star (m • leftBilinear ψ ψ) /-- The Majorana mass term is real, that is, it is fixed by the star operation. -/ -lemma star_majoranaMass (m : ℂ) : star (majoranaMass m) = majoranaMass m := by +lemma star_majoranaMass (m : ℂ) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : + star (majoranaMass m ψ) = majoranaMass m ψ := by rw [majoranaMass, star_add, star_star, add_comm] -/-- The Majorana mass term is invariant under the action of `SL(2,ℂ)`, that is, - it is Lorentz invariant. -/ -lemma rep_majoranaMass (M : SL(2,ℂ)) (m : ℂ) : rep M (majoranaMass m) = majoranaMass m := by - rw [majoranaMass, map_add, rep_star, map_smul, rep_leftBilinear] +/-- The Majorana mass term is Lorentz invariant: transforming the fermion by `M` is the same as + transforming the resulting element of the potential algebra by `M`. -/ +lemma rep_majoranaMass (M : SL(2,ℂ)) (m : ℂ) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : + majoranaMass m (repFermionLeft M ψ) = rep M (majoranaMass m ψ) := by + rw [majoranaMass, majoranaMass, leftBilinear_repFermionLeft, map_add, rep_star, map_smul] + +/-- The Majorana mass term of the tautological left-handed Weyl fermion is invariant under the + action of `SL(2,ℂ)` on the potential algebra. -/ +lemma rep_majoranaMass_ιLeft (M : SL(2,ℂ)) (m : ℂ) : + rep M (majoranaMass m ιLeft) = majoranaMass m ιLeft := by + rw [← rep_majoranaMass, repFermionLeft_ιLeft] end potentialAlgebra end From 9d7f6ec566fc66228f56e7a04fe9d120f55288e5 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 10 Jul 2026 15:27:56 +0100 Subject: [PATCH 015/254] More additions Co-Authored-By: Claude --- .../Fermions/Weyl/PotentialAlgebra.lean | 225 ++++++++++-------- 1 file changed, 132 insertions(+), 93 deletions(-) diff --git a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean index 65f3a0ea5..c6198c68e 100644 --- a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean +++ b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean @@ -23,9 +23,10 @@ together with its conjugate, the right-handed Weyl fermion `ψ̄^{\dot α}`. It operation, which conjugates the fermions and reverses the order of the generators, and an action of `SL(2,ℂ)`, the double cover of the Lorentz group. -A left-handed Weyl fermion of such a theory is a linear map -`LeftHandedWeyl →ₗ[ℂ] potentialAlgebra`. As an example we define the Majorana mass term of such a -fermion, and show that it is Lorentz invariant and fixed by the `Star` operation. +The components of the fermion field `ψ^α` are the Grassmann-odd generators of the potential +algebra itself, and a potential is an element of the algebra. As an example we define the +Majorana mass term of the left-handed fermion field, and show that it is Lorentz invariant and +fixed by the `Star` operation. ## ii. Key results @@ -33,7 +34,8 @@ fermion, and show that it is Lorentz invariant and fixed by the `Star` operation - `Fermion.potentialAlgebra` : the exterior algebra generated by `ψ^α` and `ψ̄^{\dot α}`. - `Fermion.potentialAlgebra.instStarRing` : the star operation on the potential algebra. - `Fermion.potentialAlgebra.rep` : the action of `SL(2,ℂ)` on the potential algebra. -- `Fermion.potentialAlgebra.majoranaMass` : the Majorana mass term of a left-handed Weyl fermion. +- `Fermion.potentialAlgebra.leftSelfContract` : the self contraction `ψψ` of the fermion field. +- `Fermion.potentialAlgebra.majoranaMass` : the Majorana mass term of the fermion field. - `Fermion.potentialAlgebra.rep_majoranaMass` : the Majorana mass term is Lorentz invariant. - `Fermion.potentialAlgebra.star_majoranaMass` : the Majorana mass term is real. @@ -48,10 +50,10 @@ fermion, and show that it is Lorentz invariant and fixed by the `Star` operation - D. The potential algebra - D.1. Basic instances on the potential algebra - D.2. The generators of the potential algebra + - D.3. The left- and right-handed field subspaces - E. The star operation on the potential algebra - F. The action of `SL(2,ℂ)` on the potential algebra -- G. Left-handed Weyl fermions of the theory -- H. The Majorana mass term +- G. Majorana masses ## iv. References @@ -345,6 +347,50 @@ lemma induction {C : potentialAlgebra → Prop} /-! +### D.3. The left- and right-handed field subspaces + +The elements of the potential algebra containing exactly one factor of a left-handed +generator `θ_α`, that is, the image of `ιLeft`, form a submodule canonically isomorphic to +`LeftHandedWeyl`. This subspace carries the two Grassmann-odd degrees of freedom of the +left-handed fermion field. Similarly for the right-handed field. + +-/ + +/-- The subspace of the potential algebra spanned by the left-handed generators `θ_α`. It + carries the two Grassmann-odd degrees of freedom of the left-handed fermion field. -/ +def leftFields : Submodule ℂ potentialAlgebra := LinearMap.range ιLeft + +/-- The subspace of the potential algebra spanned by the right-handed generators + `θ̄_{\dot α}`. It carries the two Grassmann-odd degrees of freedom of the right-handed + fermion field. -/ +def rightFields : Submodule ℂ potentialAlgebra := LinearMap.range ιRight + +lemma ιLeft_injective : Function.Injective ιLeft := + ExteriorAlgebra.ι_leftInverse.injective.comp LinearMap.inl_injective + +lemma ιRight_injective : Function.Injective ιRight := + ExteriorAlgebra.ι_leftInverse.injective.comp LinearMap.inr_injective + +/-- The linear equivalence between `LeftHandedWeyl` and the subspace of the potential algebra + carrying the degrees of freedom of the left-handed fermion field. -/ +def leftFieldsEquiv : LeftHandedWeyl ≃ₗ[ℂ] leftFields := + LinearEquiv.ofInjective ιLeft ιLeft_injective + +/-- The linear equivalence between `RightHandedWeyl` and the subspace of the potential algebra + carrying the degrees of freedom of the right-handed fermion field. -/ +def rightFieldsEquiv : RightHandedWeyl ≃ₗ[ℂ] rightFields := + LinearEquiv.ofInjective ιRight ιRight_injective + +/-- Members of the left-handed field subspace anticommute. -/ +lemma mul_swap_of_mem_leftFields {x y : potentialAlgebra} + (hx : x ∈ leftFields) (hy : y ∈ leftFields) : x * y = - (y * x) := by + obtain ⟨ψ, rfl⟩ := hx + obtain ⟨φ, rfl⟩ := hy + rw [ιLeft_apply, ιLeft_apply] + exact ι_mul_ι_swap _ _ + +/-! + ## E. The star operation on the potential algebra The star operation on the potential algebra conjugates the Weyl fermions, exchanging `ψ^α` and @@ -438,7 +484,8 @@ lemma star_ιLeft (ψ : LeftHandedWeyl) : star (ιLeft ψ) = ιRight (LeftHanded simp @[simp] -lemma star_ιRight (ψ : RightHandedWeyl) : star (ιRight ψ) = ιLeft (RightHandedWeyl.conjugate ψ) := by +lemma star_ιRight (ψ : RightHandedWeyl) : + star (ιRight ψ) = ιLeft (RightHandedWeyl.conjugate ψ) := by rw [ιRight_apply, star_ι, ιLeft_apply] simp @@ -493,6 +540,19 @@ lemma rep_ιLeft (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : rw [ιLeft_apply, rep_ι, ιLeft_apply] simp +/-- The star operation exchanges the left- and right-handed field subspaces. -/ +lemma star_mem_rightFields {x : potentialAlgebra} (hx : x ∈ leftFields) : + star x ∈ rightFields := by + obtain ⟨ψ, rfl⟩ := hx + exact ⟨LeftHandedWeyl.conjugate ψ, (star_ιLeft ψ).symm⟩ + +/-- The action of `SL(2,ℂ)` preserves the left-handed field subspace: the field transforms + into itself under the Lorentz group. -/ +lemma rep_mem_leftFields (M : SL(2,ℂ)) {x : potentialAlgebra} (hx : x ∈ leftFields) : + rep M x ∈ leftFields := by + obtain ⟨ψ, rfl⟩ := hx + exact ⟨LeftHandedWeyl.rep M ψ, (rep_ιLeft M ψ).symm⟩ + /-- The star operation on the potential algebra commutes with the action of `SL(2,ℂ)`. -/ lemma rep_star (M : SL(2,ℂ)) (x : potentialAlgebra) : rep M (star x) = star (rep M x) := by induction x using potentialAlgebra.induction with @@ -503,86 +563,73 @@ lemma rep_star (M : SL(2,ℂ)) (x : potentialAlgebra) : rep M (star x) = star (r /-! -## G. Left-handed Weyl fermions of the theory +## G. Majorana masses -A left-handed Weyl fermion of a theory whose potentials live in `potentialAlgebra` is a linear -map `ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra`, taking each spinor direction to a Grassmann-odd -element of the potential algebra. Such fermions carry the representation -`LeftHandedWeyl.rep.linHom rep` of `SL(2,ℂ)`. The tautological fermion is `ιLeft`, whose -components are the left-handed generators of the potential algebra. - --/ +In the potential-algebra formalism the components of the fermion field `ψ^α` are the +Grassmann-odd generators `ιLeft (LeftHandedWeyl.basis α)` of the potential algebra itself. +A potential is a function of the field, that is, an element of the algebra; it does not take +a value of the field as an argument. Indeed, the contraction of the metric with two copies of +a commuting (c-number) spinor vanishes identically, since `ε` is antisymmetric while products +of commuting components are symmetric. -/-- The representation of `SL(2,ℂ)` on the left-handed Weyl fermions of the theory. -/ -def repFermionLeft : Representation ℂ SL(2,ℂ) (LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) := - LeftHandedWeyl.rep.linHom rep +The self contraction `ψψ = ε_{αβ} ψ^α ψ^β` of the fermion field is obtained by contracting +the metric with two copies of the field and multiplying the results in the potential algebra. +It is non-zero precisely because the components of the field anticommute, and it is invariant +under `SL(2,ℂ)` because the metric is. -lemma repFermionLeft_apply (M : SL(2,ℂ)) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : - repFermionLeft M ψ = (rep M) ∘ₗ ψ ∘ₗ LeftHandedWeyl.rep M⁻¹ := rfl - -/-- The tautological left-handed Weyl fermion, whose components are the left-handed generators - of the potential algebra, is invariant under `SL(2,ℂ)`. -/ -lemma repFermionLeft_ιLeft (M : SL(2,ℂ)) : repFermionLeft M ιLeft = ιLeft := by - refine LinearMap.ext fun ψ => ?_ - rw [repFermionLeft_apply] - simp only [LinearMap.comp_apply, rep_ιLeft, ← Module.End.mul_apply, ← map_mul, - mul_inv_cancel, map_one, Module.End.one_apply] - -/-! - -## H. The Majorana mass term - -The Majorana mass term of a left-handed Weyl fermion `ψ` is `m ε^{αβ} ψ_α ψ_β` plus its -conjugate. It is obtained by contracting the metric `ε` with two copies of `ψ` and multiplying -the resulting elements of the potential algebra. Since the components of `ψ` anticommute, the -bilinear does not vanish, and it is Lorentz invariant because the metric is. +The Majorana mass term of mass `m` is `m ψψ` together with its conjugate, which makes it real. -/ -/-- The bilinear `ε^{αβ} ψ_α φ_β` of two left-handed Weyl fermions, obtained by contracting the - metric `leftMetricVal` with `ψ` and `φ`, and multiplying the results in the potential - algebra. -/ -def leftBilinear (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : potentialAlgebra := - LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ψ φ leftMetricVal) - -lemma leftBilinear_eq (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : - leftBilinear ψ φ = - (ψ (LeftHandedWeyl.basis 0) * φ (LeftHandedWeyl.basis 1)) - + ψ (LeftHandedWeyl.basis 1) * φ (LeftHandedWeyl.basis 0) := by - rw [leftBilinear, leftMetricVal_expand_tmul] - simp - -/-- Acting with `SL(2,ℂ)` on the potential algebra can be moved through the bilinear. -/ -lemma rep_leftBilinear (M : SL(2,ℂ)) (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : - rep M (leftBilinear ψ φ) = leftBilinear ((rep M) ∘ₗ ψ) ((rep M) ∘ₗ φ) := by - simp [leftBilinear_eq, map_add, map_neg] - -/-- Acting with `SL(2,ℂ)` on the spinor index of both fermions leaves the bilinear unchanged, - since the metric `ε` is invariant. -/ -lemma leftBilinear_comp_rep (M : SL(2,ℂ)) (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : - leftBilinear (ψ ∘ₗ LeftHandedWeyl.rep M) (φ ∘ₗ LeftHandedWeyl.rep M) = leftBilinear ψ φ := by - rw [leftBilinear, leftBilinear, TensorProduct.map_comp, LinearMap.comp_apply, leftMetricVal_rep] - -/-- The bilinear of two left-handed Weyl fermions transforms as a scalar of the potential - algebra under `SL(2,ℂ)`. -/ -lemma leftBilinear_repFermionLeft (M : SL(2,ℂ)) (ψ φ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : - leftBilinear (repFermionLeft M ψ) (repFermionLeft M φ) = rep M (leftBilinear ψ φ) := by - rw [repFermionLeft_apply, repFermionLeft_apply, ← rep_leftBilinear, leftBilinear_comp_rep] - -/-- In terms of the basis, the bilinear of the tautological fermion with itself is - `- 2 ψ^1 ψ^2`. It is non-zero precisely because the components of `ψ` anticommute. -/ -lemma leftBilinear_ιLeft_eq_smul : leftBilinear ιLeft ιLeft = +/-- The contraction of the metric with two copies of a commuting spinor vanishes: a Majorana + mass cannot be built from a c-number left-handed Weyl fermion. -/ +lemma metricRaw_contract_comm_eq_zero (ψ : LeftHandedWeyl) : + ∑ α, ∑ β, metricRaw α β * ψ.val α * ψ.val β = 0 := by + simp only [metricRaw, Fin.sum_univ_two, of_apply, cons_val', cons_val_zero, cons_val_one, + empty_val', cons_val_fin_one] + ring + +/-- The self contraction `ψψ = ε_{αβ} ψ^α ψ^β` of the left-handed fermion field, obtained by + contracting the metric `leftMetricVal` with two copies of the field `ιLeft`, and multiplying + the resulting elements of the potential algebra. -/ +def leftSelfContract : potentialAlgebra := + LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ιLeft ιLeft leftMetricVal) + +/-- The self contraction expanded as a sum over components of the metric. -/ +lemma leftSelfContract_eq_sum : leftSelfContract = + ∑ α, ∑ β, (- metricRaw α β) • + (ιLeft (LeftHandedWeyl.basis α) * ιLeft (LeftHandedWeyl.basis β)) := by + rw [leftSelfContract, leftMetricVal_expand_tmul] + simp [metricRaw, Fin.sum_univ_two] + +/-- The self contraction of the left-handed fermion field is invariant under the action of + `SL(2,ℂ)`, that is, it is Lorentz invariant. -/ +lemma rep_leftSelfContract (M : SL(2,ℂ)) : rep M leftSelfContract = leftSelfContract := by + have h (x : LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl) : + rep M (LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ιLeft ιLeft x)) = + LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ιLeft ιLeft + (TensorProduct.map (LeftHandedWeyl.rep M) (LeftHandedWeyl.rep M) x)) := by + induction x with + | zero => simp + | tmul ψ φ => simp + | add a b ha hb => simp [ha, hb] + rw [leftSelfContract, h, leftMetricVal_rep] + +/-- In terms of the basis, the self contraction of the fermion field is `- 2 ψ^1 ψ^2`. -/ +lemma leftSelfContract_eq_smul : leftSelfContract = (-2 : ℂ) • (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := by have h : ιLeft (LeftHandedWeyl.basis 1) * ιLeft (LeftHandedWeyl.basis 0) = - (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := ι_mul_ι_swap _ _ - rw [leftBilinear_eq, h] + rw [leftSelfContract, leftMetricVal_expand_tmul] + simp only [map_add, map_neg, TensorProduct.map_tmul, LinearMap.mul'_apply, h] module -/-- The bilinear of the tautological fermion with itself is non-zero. For a commuting field the - same expression would vanish by the antisymmetry of `ε`. -/ -lemma leftBilinear_ιLeft_ne_zero : leftBilinear ιLeft ιLeft ≠ 0 := by +/-- The self contraction of the fermion field is non-zero. It would vanish if the components + of the field commuted, by the antisymmetry of `ε`. -/ +lemma leftSelfContract_ne_zero : leftSelfContract ≠ 0 := by /- The alternating form `(v, w) ↦ det ![v.1, w.1]` on the generators lifts to a linear - functional on the potential algebra which is non-zero on the bilinear. -/ + functional on the potential algebra which is non-zero on the self contraction. -/ let form : (LeftHandedWeyl × RightHandedWeyl) [⋀^Fin 2]→ₗ[ℂ] ℂ := Matrix.detRowAlternating.compLinearMap (LeftHandedWeyl.toFin2ℂEquiv.toLinearMap ∘ₗ LinearMap.fst ℂ LeftHandedWeyl RightHandedWeyl) @@ -602,33 +649,25 @@ lemma leftBilinear_ιLeft_ne_zero : leftBilinear ιLeft ιLeft ≠ 0 := by simp only [f, Function.update_self, form, AlternatingMap.compLinearMap_apply] show Matrix.det _ = 1 simp [Matrix.det_fin_two, LeftHandedWeyl.toFin2ℂFun, LeftHandedWeyl.basis_apply] - have hF : F (leftBilinear ιLeft ιLeft) = -2 := by - rw [leftBilinear_ιLeft_eq_smul, map_smul, hprod, hmulti, smul_eq_mul, mul_one] + have hF : F leftSelfContract = -2 := by + rw [leftSelfContract_eq_smul, map_smul, hprod, hmulti, smul_eq_mul, mul_one] intro h rw [h, map_zero] at hF norm_num at hF -/-- The Majorana mass term, of complex mass `m`, of a left-handed Weyl fermion `ψ`. It is the sum - of the bilinear `m ε^{αβ} ψ_α ψ_β` and its conjugate. -/ -def majoranaMass (m : ℂ) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : potentialAlgebra := - m • leftBilinear ψ ψ + star (m • leftBilinear ψ ψ) +/-- The Majorana mass term, of complex mass `m`, of the left-handed fermion field. It is the + sum of the self contraction `m ψψ` and its conjugate. -/ +def majoranaMass (m : ℂ) : potentialAlgebra := + m • leftSelfContract + star (m • leftSelfContract) /-- The Majorana mass term is real, that is, it is fixed by the star operation. -/ -lemma star_majoranaMass (m : ℂ) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : - star (majoranaMass m ψ) = majoranaMass m ψ := by +lemma star_majoranaMass (m : ℂ) : star (majoranaMass m) = majoranaMass m := by rw [majoranaMass, star_add, star_star, add_comm] -/-- The Majorana mass term is Lorentz invariant: transforming the fermion by `M` is the same as - transforming the resulting element of the potential algebra by `M`. -/ -lemma rep_majoranaMass (M : SL(2,ℂ)) (m : ℂ) (ψ : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra) : - majoranaMass m (repFermionLeft M ψ) = rep M (majoranaMass m ψ) := by - rw [majoranaMass, majoranaMass, leftBilinear_repFermionLeft, map_add, rep_star, map_smul] - -/-- The Majorana mass term of the tautological left-handed Weyl fermion is invariant under the - action of `SL(2,ℂ)` on the potential algebra. -/ -lemma rep_majoranaMass_ιLeft (M : SL(2,ℂ)) (m : ℂ) : - rep M (majoranaMass m ιLeft) = majoranaMass m ιLeft := by - rw [← rep_majoranaMass, repFermionLeft_ιLeft] +/-- The Majorana mass term is invariant under the action of `SL(2,ℂ)`, that is, + it is Lorentz invariant. -/ +lemma rep_majoranaMass (M : SL(2,ℂ)) (m : ℂ) : rep M (majoranaMass m) = majoranaMass m := by + rw [majoranaMass, map_add, rep_star, map_smul, rep_leftSelfContract] end potentialAlgebra end From 2c20b5d7472448e6299a5030a7ef613eba45e850 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:58:09 +0100 Subject: [PATCH 016/254] feat: Major rewrite of the file (human driven) Co-Authored-By: Claude --- .../Fermions/Weyl/PotentialAlgebra.lean | 837 ++++++------------ 1 file changed, 250 insertions(+), 587 deletions(-) diff --git a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean index c6198c68e..04f2085b3 100644 --- a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean +++ b/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean @@ -8,57 +8,35 @@ module public import Physlib.Relativity.Fermions.Weyl.Metric public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic -public import Mathlib.LinearAlgebra.ExteriorAlgebra.OfAlternating +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis /-! # The potential algebra of Weyl fermions ## i. Overview -Fermions anticommute. Thus a potential built out of a Weyl fermion is not a polynomial in the -components of that fermion, but an element of the exterior (Grassmann) algebra generated by them. - -The `potentialAlgebra` is the exterior algebra generated by a left-handed Weyl fermion `ψ^α` -together with its conjugate, the right-handed Weyl fermion `ψ̄^{\dot α}`. It carries a `Star` -operation, which conjugates the fermions and reverses the order of the generators, and an action -of `SL(2,ℂ)`, the double cover of the Lorentz group. - -The components of the fermion field `ψ^α` are the Grassmann-odd generators of the potential -algebra itself, and a potential is an element of the algebra. As an example we define the -Majorana mass term of the left-handed fermion field, and show that it is Lorentz invariant and -fixed by the `Star` operation. - -## ii. Key results - -- `Fermion.LeftHandedWeyl.conjugate` : the conjugate of a left-handed Weyl fermion. -- `Fermion.potentialAlgebra` : the exterior algebra generated by `ψ^α` and `ψ̄^{\dot α}`. -- `Fermion.potentialAlgebra.instStarRing` : the star operation on the potential algebra. -- `Fermion.potentialAlgebra.rep` : the action of `SL(2,ℂ)` on the potential algebra. -- `Fermion.potentialAlgebra.leftSelfContract` : the self contraction `ψψ` of the fermion field. -- `Fermion.potentialAlgebra.majoranaMass` : the Majorana mass term of the fermion field. -- `Fermion.potentialAlgebra.rep_majoranaMass` : the Majorana mass term is Lorentz invariant. -- `Fermion.potentialAlgebra.star_majoranaMass` : the Majorana mass term is real. - -## iii. Table of contents - -- A. Conjugation of Weyl fermions - - A.1. The conjugate of a right-handed Weyl fermion - - A.2. The conjugate of a left-handed Weyl fermion - - A.3. Conjugation of the Weyl fermion generators -- B. The action of `SL(2,ℂ)` on the Weyl fermion generators -- C. The conjugate of a `ℂ`-algebra -- D. The potential algebra - - D.1. Basic instances on the potential algebra - - D.2. The generators of the potential algebra - - D.3. The left- and right-handed field subspaces -- E. The star operation on the potential algebra -- F. The action of `SL(2,ℂ)` on the potential algebra -- G. Majorana masses - -## iv. References - -- Dreiner, Haber and Martin, *Two-component spinor techniques and Feynman rules for quantum field - theory and supersymmetry*, https://arxiv.org/abs/0812.1594 +In this file are primary objective is to look at the potential +of a single left-handed Weyl fermion, correctly taking account +of the anti-commuting nature of the fermion. + +Two facts about the potential, which we take as a given, are that: +1. It is written in terms of the components of the left-handed Weyl fermion and its conjugate. +2. Within the potential the components anti-commute. +The first of these, tells us that we should be working with the dual of the left-handed Weyl fermion +and its conjugate (since the duals are the linear functionals which pick +out the components of the fermion). The second of these tells us that we should be working with an +exterior algebra. + +Thus, the type in which the potential lives is +`ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl)`. We call this type +`PotentialAlgebra` and define it and its properties in this file. + +On `PotentialAlgebra` we define a representation of the Lorentz group, and prove that that +if the potential is invariant under the Lorentz group it must be of the form +`c + m1 * ψ 0 * ψ 1 + m2 * barψ 0 * barψ 1 + λ * ψ 0 * ψ 1 * barψ 0 * barψ 1`, +which is true to all orders. + +There is as of yet no reality condition on this potential. This is a TODO. -/ @@ -75,600 +53,285 @@ open CategoryTheory.MonoidalCategory /-! -## A. Conjugation of Weyl fermions - -Complex conjugation of the components of a Weyl fermion exchanges left- and right-handed -Weyl fermions. It is a conjugate-linear map, that is, a semilinear map with respect to -`starRingEnd ℂ`. - --/ - -/-! - -### A.1. The conjugate of a right-handed Weyl fermion - --/ - -namespace RightHandedWeyl - -/-- The conjugate `ψ̄^α` of a right-handed Weyl fermion `ψ^{\dot α}`, defined by complex - conjugating each component. It is a left-handed Weyl fermion. -/ -def conjugate : RightHandedWeyl →ₛₗ[starRingEnd ℂ] LeftHandedWeyl where - toFun ψ := ⟨fun i => star (ψ.val i)⟩ - map_add' ψ1 ψ2 := by - apply LeftHandedWeyl.toFin2ℂFun.injective - funext i - exact star_add _ _ - map_smul' c ψ := by - apply LeftHandedWeyl.toFin2ℂFun.injective - funext i - exact star_mul' c (ψ.val i) - -@[simp] -lemma conjugate_val (ψ : RightHandedWeyl) (i : Fin 2) : (conjugate ψ).val i = star (ψ.val i) := rfl - -/-- Conjugation intertwines the representation of `SL(2,ℂ)` on right-handed Weyl fermions with - the representation on left-handed Weyl fermions. -/ -lemma conjugate_rep (M : SL(2,ℂ)) (ψ : RightHandedWeyl) : - conjugate (rep M ψ) = LeftHandedWeyl.rep M (conjugate ψ) := by - apply LeftHandedWeyl.toFin2ℂFun.injective - funext i - change star ((M.1.map star *ᵥ ψ.val) i) = (M.1 *ᵥ fun j => star (ψ.val j)) i - simp [mulVec, dotProduct, star_mul'] - -end RightHandedWeyl - -/-! - -### A.2. The conjugate of a left-handed Weyl fermion - --/ - -namespace LeftHandedWeyl - -/-- The conjugate `ψ̄^{\dot α}` of a left-handed Weyl fermion `ψ^α`, defined by complex - conjugating each component. It is a right-handed Weyl fermion. -/ -def conjugate : LeftHandedWeyl →ₛₗ[starRingEnd ℂ] RightHandedWeyl where - toFun ψ := ⟨fun i => star (ψ.val i)⟩ - map_add' ψ1 ψ2 := by - apply RightHandedWeyl.toFin2ℂFun.injective - funext i - exact star_add _ _ - map_smul' c ψ := by - apply RightHandedWeyl.toFin2ℂFun.injective - funext i - exact star_mul' c (ψ.val i) - -@[simp] -lemma conjugate_val (ψ : LeftHandedWeyl) (i : Fin 2) : (conjugate ψ).val i = star (ψ.val i) := rfl - -@[simp] -lemma conjugate_conjugate (ψ : LeftHandedWeyl) : - RightHandedWeyl.conjugate (conjugate ψ) = ψ := by - apply toFin2ℂFun.injective - funext i - exact star_star (ψ.val i) - -/-- Conjugation intertwines the representation of `SL(2,ℂ)` on left-handed Weyl fermions with - the representation on right-handed Weyl fermions. -/ -lemma conjugate_rep (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : - conjugate (rep M ψ) = RightHandedWeyl.rep M (conjugate ψ) := by - apply RightHandedWeyl.toFin2ℂFun.injective - funext i - change star ((M.1 *ᵥ ψ.val) i) = (M.1.map star *ᵥ fun j => star (ψ.val j)) i - simp [mulVec, dotProduct, star_mul'] - -end LeftHandedWeyl - -@[simp] -lemma RightHandedWeyl.conjugate_conjugate (ψ : RightHandedWeyl) : - LeftHandedWeyl.conjugate (conjugate ψ) = ψ := by - apply toFin2ℂFun.injective - funext i - exact star_star (ψ.val i) - -/-! - -### A.3. Conjugation of the Weyl fermion generators - -The generators of the potential algebra of a left-handed Weyl fermion `ψ^α` are the components -of `ψ^α` together with the components of its conjugate `ψ̄^{\dot α}`. They therefore live in -`LeftHandedWeyl × RightHandedWeyl`, on which conjugation acts by exchanging the two factors. - --/ - -/-- Conjugation of the pair `(ψ^α, ψ̄^{\dot α})` of Weyl fermion generators, exchanging the - left-handed and the right-handed fermion. -/ -def conjugateFields : - LeftHandedWeyl × RightHandedWeyl →ₛₗ[starRingEnd ℂ] LeftHandedWeyl × RightHandedWeyl where - toFun ψ := (RightHandedWeyl.conjugate ψ.2, LeftHandedWeyl.conjugate ψ.1) - map_add' ψ φ := by simp - map_smul' c ψ := by simp - -@[simp] -lemma conjugateFields_apply (ψ : LeftHandedWeyl × RightHandedWeyl) : - conjugateFields ψ = (RightHandedWeyl.conjugate ψ.2, LeftHandedWeyl.conjugate ψ.1) := rfl - -@[simp] -lemma conjugateFields_conjugateFields (ψ : LeftHandedWeyl × RightHandedWeyl) : - conjugateFields (conjugateFields ψ) = ψ := by - simp - -/-! - -## B. The action of `SL(2,ℂ)` on the Weyl fermion generators +## A. The Potential algebra for Weyl fermions -/ -/-- The representation of `SL(2,ℂ)` on the Weyl fermion generators `(ψ^α, ψ̄^{\dot α})`, - acting by the fundamental representation on the left-handed fermion and by the conjugate - representation on the right-handed fermion. -/ -def repFields : Representation ℂ SL(2,ℂ) (LeftHandedWeyl × RightHandedWeyl) where - toFun M := (LeftHandedWeyl.rep M).prodMap (RightHandedWeyl.rep M) - map_one' := by - refine LinearMap.ext fun ψ => ?_ - simp - map_mul' M N := by - refine LinearMap.ext fun ψ => ?_ - simp [Module.End.mul_apply] - -@[simp] -lemma repFields_apply (M : SL(2,ℂ)) (ψ : LeftHandedWeyl × RightHandedWeyl) : - repFields M ψ = (LeftHandedWeyl.rep M ψ.1, RightHandedWeyl.rep M ψ.2) := rfl +abbrev PotentialAlgebra : Type := ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl) -/-- Conjugation of the Weyl fermion generators commutes with the action of `SL(2,ℂ)`. -/ -lemma conjugateFields_repFields (M : SL(2,ℂ)) (ψ : LeftHandedWeyl × RightHandedWeyl) : - conjugateFields (repFields M ψ) = repFields M (conjugateFields ψ) := by - simp [RightHandedWeyl.conjugate_rep, LeftHandedWeyl.conjugate_rep] +namespace PotentialAlgebra /-! -## C. The conjugate of a `ℂ`-algebra - -To define a conjugate-linear algebra map out of an exterior algebra we use its universal property, -which produces `ℂ`-algebra maps. A conjugate-linear algebra map `A → A` is precisely a -`ℂ`-algebra map `A →ₐ[ℂ] ConjAlg A`, where `ConjAlg A` is `A` with the `ℂ`-action twisted by -complex conjugation. +### A.1. The coordinate elements of the potential algebra -/ -TODO "The construction `ConjAlg` of the conjugate of a `ℂ`-algebra is not specific to fermions. - It should be generalised to an arbitrary star ring of scalars and moved to a mathematics file." - -/-- The `ℂ`-algebra `A` with its `ℂ`-algebra structure twisted by complex conjugation. - A conjugate-linear algebra map `A → A` is the same thing as a `ℂ`-algebra map - `A →ₐ[ℂ] ConjAlg A`. -/ -def ConjAlg (A : Type) : Type := A +/-- The coordinate element corresponding to the i-th basis vector as a member + of the potential algebra. -/ +def ψ (i : Fin 2) : PotentialAlgebra := + (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (DualLeftHandedWeyl.basis i)) -namespace ConjAlg +/-- The coordinate element corresponding to the conjugate i-th basis vector as a member + of the potential algebra. -/ +def barψ (i : Fin 2) : PotentialAlgebra := + (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (DualRightHandedWeyl.basis i)) -variable {A : Type} +@[simp] lemma ψ_mul_self (i : Fin 2) : ψ i * ψ i = 0 := ExteriorAlgebra.ι_sq_zero _ -/-- The identity map from a `ℂ`-algebra to its conjugate. -/ -def of (x : A) : ConjAlg A := x +@[simp] lemma ψ_one_mul_ψ_zero_swap : ψ 1 * ψ 0 = - ψ 0 * ψ 1 := by + rw [neg_mul, eq_neg_iff_add_eq_zero] + exact ExteriorAlgebra.ι_add_mul_swap _ _ -/-- The identity map from the conjugate of a `ℂ`-algebra back to that algebra. -/ -def val (x : ConjAlg A) : A := x +@[simp] lemma barψ_mul_self (i : Fin 2) : barψ i * barψ i = 0 := ExteriorAlgebra.ι_sq_zero _ -@[simp] -lemma val_of (x : A) : val (of x) = x := rfl +@[simp] lemma barψ_one_mul_barψ_zero_swap : barψ 1 * barψ 0 = - barψ 0 * barψ 1 := by + rw [neg_mul, eq_neg_iff_add_eq_zero] + exact ExteriorAlgebra.ι_add_mul_swap _ _ -variable [Ring A] - -instance : Ring (ConjAlg A) := inferInstanceAs (Ring A) - -@[simp] -lemma val_add (x y : ConjAlg A) : val (x + y) = val x + val y := rfl - -@[simp] -lemma val_mul (x y : ConjAlg A) : val (x * y) = val x * val y := rfl - -variable [Algebra ℂ A] - -instance : Algebra ℂ (ConjAlg A) := - RingHom.toAlgebra' ((algebraMap ℂ A).comp (starRingEnd ℂ) : ℂ →+* ConjAlg A) - fun c x => Algebra.commutes ((starRingEnd ℂ) c) (val x) - -@[simp] -lemma val_algebraMap (c : ℂ) : - val (algebraMap ℂ (ConjAlg A) c) = algebraMap ℂ A ((starRingEnd ℂ) c) := rfl - -lemma smul_of (c : ℂ) (x : A) : c • of x = of ((starRingEnd ℂ) c • x) := by - rw [Algebra.smul_def, Algebra.smul_def] - rfl - -end ConjAlg - -/-! - -## D. The potential algebra - --/ - -/-- The potential algebra of a left-handed Weyl fermion `ψ^α`: the exterior (Grassmann) algebra - generated by the components of `ψ^α` and of its conjugate `ψ̄^{\dot α}`. - The potential of a theory of a single Weyl fermion is an element of this algebra. -/ -def potentialAlgebra : Type := ExteriorAlgebra ℂ (LeftHandedWeyl × RightHandedWeyl) - -namespace potentialAlgebra /-! -### D.1. Basic instances on the potential algebra +### A.2. Basis -/ -instance : Ring potentialAlgebra := - inferInstanceAs (Ring (ExteriorAlgebra ℂ (LeftHandedWeyl × RightHandedWeyl))) -instance : Algebra ℂ potentialAlgebra := - inferInstanceAs (Algebra ℂ (ExteriorAlgebra ℂ (LeftHandedWeyl × RightHandedWeyl))) +/-- The basis of the potential algebra. -/ +def basis : Basis (Finset (Fin 4)) ℂ PotentialAlgebra := + Module.Basis.ExteriorAlgebra ((DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).reindex + finSumFinEquiv) /-! -### D.2. The generators of the potential algebra +## A.3. The representation on the potential algebra -/ -/-- The inclusion of the Weyl fermion generators `(ψ^α, ψ̄^{\dot α})` into the potential - algebra. -/ -def ι : LeftHandedWeyl × RightHandedWeyl →ₗ[ℂ] potentialAlgebra := ExteriorAlgebra.ι ℂ - -lemma ι_sq_zero (ψ : LeftHandedWeyl × RightHandedWeyl) : ι ψ * ι ψ = 0 := - ExteriorAlgebra.ι_sq_zero ψ - -/-- The generators of the potential algebra anticommute, corresponding to the fact that - fermions anticommute. -/ -lemma ι_mul_ι_swap (ψ φ : LeftHandedWeyl × RightHandedWeyl) : ι ψ * ι φ = - (ι φ * ι ψ) := by - have h := CliffordAlgebra.ι_mul_ι_add_swap - (Q := (0 : QuadraticForm ℂ (LeftHandedWeyl × RightHandedWeyl))) ψ φ - simp only [QuadraticMap.polar, QuadraticMap.zero_apply, sub_zero, map_zero] at h - exact eq_neg_of_add_eq_zero_left h - -/-- The generators of the potential algebra coming from the left-handed Weyl fermion `ψ^α`. -/ -def ιLeft : LeftHandedWeyl →ₗ[ℂ] potentialAlgebra := ι ∘ₗ LinearMap.inl ℂ _ _ - -/-- The generators of the potential algebra coming from the right-handed Weyl - fermion `ψ̄^{\dot α}`. -/ -def ιRight : RightHandedWeyl →ₗ[ℂ] potentialAlgebra := ι ∘ₗ LinearMap.inr ℂ _ _ - -lemma ιLeft_apply (ψ : LeftHandedWeyl) : ιLeft ψ = ι (ψ, 0) := rfl - -lemma ιRight_apply (ψ : RightHandedWeyl) : ιRight ψ = ι (0, ψ) := rfl - -/-- The potential algebra is generated, as an algebra, by the image of `ι`. -/ -@[elab_as_elim] -lemma induction {C : potentialAlgebra → Prop} - (algebraMap : ∀ c : ℂ, C (algebraMap ℂ potentialAlgebra c)) - (ι : ∀ ψ, C (potentialAlgebra.ι ψ)) - (mul : ∀ a b, C a → C b → C (a * b)) - (add : ∀ a b, C a → C b → C (a + b)) (x : potentialAlgebra) : C x := - ExteriorAlgebra.induction algebraMap ι mul add x +/-- The representation of the Lorentz group on `PotentialAlgebra`. -/ +def rep : Representation ℂ SL(2, ℂ) PotentialAlgebra where + toFun Λ := (ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap + (DualRightHandedWeyl.rep Λ))).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, LinearMap.prodMap_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← LinearMap.prodMap_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma rep_apply (Λ : SL(2, ℂ)) (V : PotentialAlgebra) : + rep Λ V = ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap + (DualRightHandedWeyl.rep Λ)) V := rfl + +lemma rep_mul (Λ : SL(2, ℂ)) (V W : PotentialAlgebra) : + rep Λ (V * W) = rep Λ V * rep Λ W:= by + simp [rep] + +lemma rep_apply_ψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : + rep Λ (ψ i) = ∑ j, Λ⁻¹ i j • ψ j := by + simp [rep, ψ, DualLeftHandedWeyl.rep_apply_basis, ← map_smul, ← map_add, + -SpecialLinearGroup.coe_inv, Lorentz.SL2C.inverse_coe] + +lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : + rep Λ (barψ i) = ∑ j, star (Λ⁻¹ i j) • barψ j := by + simp [rep, barψ, DualRightHandedWeyl.rep_apply_basis, ← map_smul, ← map_add, + -SpecialLinearGroup.coe_inv, Lorentz.SL2C.inverse_coe] /-! -### D.3. The left- and right-handed field subspaces - -The elements of the potential algebra containing exactly one factor of a left-handed -generator `θ_α`, that is, the image of `ιLeft`, form a submodule canonically isomorphic to -`LeftHandedWeyl`. This subspace carries the two Grassmann-odd degrees of freedom of the -left-handed fermion field. Similarly for the right-handed field. +## B. Invariance under the Lorentz group -/ -/-- The subspace of the potential algebra spanned by the left-handed generators `θ_α`. It - carries the two Grassmann-odd degrees of freedom of the left-handed fermion field. -/ -def leftFields : Submodule ℂ potentialAlgebra := LinearMap.range ιLeft - -/-- The subspace of the potential algebra spanned by the right-handed generators - `θ̄_{\dot α}`. It carries the two Grassmann-odd degrees of freedom of the right-handed - fermion field. -/ -def rightFields : Submodule ℂ potentialAlgebra := LinearMap.range ιRight - -lemma ιLeft_injective : Function.Injective ιLeft := - ExteriorAlgebra.ι_leftInverse.injective.comp LinearMap.inl_injective - -lemma ιRight_injective : Function.Injective ιRight := - ExteriorAlgebra.ι_leftInverse.injective.comp LinearMap.inr_injective -/-- The linear equivalence between `LeftHandedWeyl` and the subspace of the potential algebra - carrying the degrees of freedom of the left-handed fermion field. -/ -def leftFieldsEquiv : LeftHandedWeyl ≃ₗ[ℂ] leftFields := - LinearEquiv.ofInjective ιLeft ιLeft_injective +def IsInvariant (V : PotentialAlgebra) : Prop := ∀ Λ, rep Λ V = V -/-- The linear equivalence between `RightHandedWeyl` and the subspace of the potential algebra - carrying the degrees of freedom of the right-handed fermion field. -/ -def rightFieldsEquiv : RightHandedWeyl ≃ₗ[ℂ] rightFields := - LinearEquiv.ofInjective ιRight ιRight_injective +lemma IsInvariant.eq_iff {V : PotentialAlgebra} : + IsInvariant V ↔ ∀ Λ, rep Λ V = V := by rfl -/-- Members of the left-handed field subspace anticommute. -/ -lemma mul_swap_of_mem_leftFields {x y : potentialAlgebra} - (hx : x ∈ leftFields) (hy : y ∈ leftFields) : x * y = - (y * x) := by - obtain ⟨ψ, rfl⟩ := hx - obtain ⟨φ, rfl⟩ := hy - rw [ιLeft_apply, ιLeft_apply] - exact ι_mul_ι_swap _ _ +lemma IsInvariant.add {V W : PotentialAlgebra} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V + W) := by + intro Λ + simp_all [IsInvariant.eq_iff] -/-! - -## E. The star operation on the potential algebra +lemma IsInvariant.smul {V : PotentialAlgebra} (hV : IsInvariant V) (c : ℂ) : + IsInvariant (c • V) := by + intro Λ + simp_all [IsInvariant.eq_iff] -The star operation on the potential algebra conjugates the Weyl fermions, exchanging `ψ^α` and -`ψ̄^{\dot α}`, and reverses the order of the Grassmann generators. The reversal is -`CliffordAlgebra.reverse`, and makes the star operation into an anti-automorphism. +lemma IsInvariant.mul {V W : PotentialAlgebra} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V * W) := by + intro Λ + simp_all [IsInvariant.eq_iff, rep_mul] --/ - -/-- Reversal of the order of the Grassmann generators in the potential algebra. -/ -def reverse : potentialAlgebra →ₗ[ℂ] potentialAlgebra := CliffordAlgebra.reverse - -@[simp] -lemma reverse_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : reverse (ι ψ) = ι ψ := - CliffordAlgebra.reverse_ι ψ - -@[simp] -lemma reverse_algebraMap (c : ℂ) : - reverse (algebraMap ℂ potentialAlgebra c) = algebraMap ℂ potentialAlgebra c := - CliffordAlgebra.reverse.commutes c - -@[simp] -lemma reverse_mul (x y : potentialAlgebra) : reverse (x * y) = reverse y * reverse x := - CliffordAlgebra.reverse.map_mul x y - -/-- Conjugation of the Weyl fermions, as a `ℂ`-algebra map from the potential algebra to its - conjugate algebra. Equivalently, a conjugate-linear algebra map on the potential algebra. -/ -def conjHom : potentialAlgebra →ₐ[ℂ] ConjAlg potentialAlgebra := - ExteriorAlgebra.lift ℂ ⟨{ - toFun := fun ψ => ConjAlg.of (ι (conjugateFields ψ)) - map_add' := fun ψ φ => by - rw [map_add, map_add] - rfl - map_smul' := fun c ψ => by - rw [map_smulₛₗ, map_smul, RingHom.id_apply, ConjAlg.smul_of] }, - fun ψ => ι_sq_zero _⟩ - -@[simp] -lemma conjHom_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : - conjHom (ι ψ) = ConjAlg.of (ι (conjugateFields ψ)) := - ExteriorAlgebra.lift_ι_apply _ _ _ ψ - -/-- The conjugation of an element of the potential algebra: conjugate the Weyl fermions and - reverse the order of the Grassmann generators. -/ -def conjugate (x : potentialAlgebra) : potentialAlgebra := reverse (ConjAlg.val (conjHom x)) - -lemma conjugate_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : - conjugate (ι ψ) = ι (conjugateFields ψ) := by - show reverse (ConjAlg.val (conjHom (ι ψ))) = _ - rw [conjHom_ι, ConjAlg.val_of, reverse_ι] - -lemma conjugate_algebraMap (c : ℂ) : - conjugate (algebraMap ℂ potentialAlgebra c) = - algebraMap ℂ potentialAlgebra ((starRingEnd ℂ) c) := by - show reverse (ConjAlg.val (conjHom (algebraMap ℂ potentialAlgebra c))) = _ - rw [AlgHom.commutes, ConjAlg.val_algebraMap, reverse_algebraMap] - -lemma conjugate_mul (x y : potentialAlgebra) : - conjugate (x * y) = conjugate y * conjugate x := by - show reverse (ConjAlg.val (conjHom (x * y))) = _ - rw [map_mul, ConjAlg.val_mul, reverse_mul] - rfl - -lemma conjugate_add (x y : potentialAlgebra) : - conjugate (x + y) = conjugate x + conjugate y := by - show reverse (ConjAlg.val (conjHom (x + y))) = _ - rw [map_add, ConjAlg.val_add, map_add] - rfl - -lemma conjugate_conjugate (x : potentialAlgebra) : conjugate (conjugate x) = x := by - induction x using potentialAlgebra.induction with - | algebraMap c => rw [conjugate_algebraMap, conjugate_algebraMap, starRingEnd_self_apply] - | ι ψ => rw [conjugate_ι, conjugate_ι, conjugateFields_conjugateFields] - | mul a b ha hb => rw [conjugate_mul, conjugate_mul, ha, hb] - | add a b ha hb => rw [conjugate_add, conjugate_add, ha, hb] - -instance instStarRing : StarRing potentialAlgebra where - star := conjugate - star_involutive := conjugate_conjugate - star_mul := conjugate_mul - star_add := conjugate_add - -lemma star_def (x : potentialAlgebra) : star x = conjugate x := rfl - -@[simp] -lemma star_ι (ψ : LeftHandedWeyl × RightHandedWeyl) : star (ι ψ) = ι (conjugateFields ψ) := - conjugate_ι ψ - -@[simp] -lemma star_ιLeft (ψ : LeftHandedWeyl) : star (ιLeft ψ) = ιRight (LeftHandedWeyl.conjugate ψ) := by - rw [ιLeft_apply, star_ι, ιRight_apply] - simp - -@[simp] -lemma star_ιRight (ψ : RightHandedWeyl) : - star (ιRight ψ) = ιLeft (RightHandedWeyl.conjugate ψ) := by - rw [ιRight_apply, star_ι, ιLeft_apply] - simp - -@[simp] -lemma star_algebraMap (c : ℂ) : - star (algebraMap ℂ potentialAlgebra c) = algebraMap ℂ potentialAlgebra ((starRingEnd ℂ) c) := - conjugate_algebraMap c - -/-- The star operation on the potential algebra is conjugate-linear. -/ -instance : StarModule ℂ potentialAlgebra where - star_smul c x := by - rw [Algebra.smul_def, star_mul, star_algebraMap, ← Algebra.commutes, ← Algebra.smul_def] - rfl +lemma IsInvariant.one : IsInvariant 1 := by + intro Λ + simp [rep] /-! -## F. The action of `SL(2,ℂ)` on the potential algebra +## B.1. Specific terms which are invariant -/ -/-- The representation of `SL(2,ℂ)`, the double cover of the Lorentz group, on the potential - algebra, induced by its action on the Weyl fermion generators. -/ -def rep : Representation ℂ SL(2,ℂ) potentialAlgebra where - toFun M := (ExteriorAlgebra.map (repFields M)).toLinearMap - map_one' := by - refine LinearMap.ext fun x => ?_ - rw [map_one] - simp [Module.End.one_eq_id] - rfl - map_mul' M N := by - refine LinearMap.ext fun x => ?_ - rw [map_mul] - exact (AlgHom.congr_fun (ExteriorAlgebra.map_comp_map _ _) x).symm - -@[simp] -lemma rep_ι (M : SL(2,ℂ)) (ψ : LeftHandedWeyl × RightHandedWeyl) : - rep M (ι ψ) = ι (repFields M ψ) := - ExteriorAlgebra.map_apply_ι _ _ - -@[simp] -lemma rep_mul (M : SL(2,ℂ)) (x y : potentialAlgebra) : rep M (x * y) = rep M x * rep M y := - map_mul (ExteriorAlgebra.map (repFields M)) x y - -@[simp] -lemma rep_algebraMap (M : SL(2,ℂ)) (c : ℂ) : - rep M (algebraMap ℂ potentialAlgebra c) = algebraMap ℂ potentialAlgebra c := - AlgHom.commutes (ExteriorAlgebra.map (repFields M)) c - -@[simp] -lemma rep_ιLeft (M : SL(2,ℂ)) (ψ : LeftHandedWeyl) : - rep M (ιLeft ψ) = ιLeft (LeftHandedWeyl.rep M ψ) := by - rw [ιLeft_apply, rep_ι, ιLeft_apply] - simp - -/-- The star operation exchanges the left- and right-handed field subspaces. -/ -lemma star_mem_rightFields {x : potentialAlgebra} (hx : x ∈ leftFields) : - star x ∈ rightFields := by - obtain ⟨ψ, rfl⟩ := hx - exact ⟨LeftHandedWeyl.conjugate ψ, (star_ιLeft ψ).symm⟩ - -/-- The action of `SL(2,ℂ)` preserves the left-handed field subspace: the field transforms - into itself under the Lorentz group. -/ -lemma rep_mem_leftFields (M : SL(2,ℂ)) {x : potentialAlgebra} (hx : x ∈ leftFields) : - rep M x ∈ leftFields := by - obtain ⟨ψ, rfl⟩ := hx - exact ⟨LeftHandedWeyl.rep M ψ, (rep_ιLeft M ψ).symm⟩ - -/-- The star operation on the potential algebra commutes with the action of `SL(2,ℂ)`. -/ -lemma rep_star (M : SL(2,ℂ)) (x : potentialAlgebra) : rep M (star x) = star (rep M x) := by - induction x using potentialAlgebra.induction with - | algebraMap c => rw [star_algebraMap, rep_algebraMap, rep_algebraMap, star_algebraMap] - | ι ψ => rw [star_ι, rep_ι, rep_ι, star_ι, conjugateFields_repFields] - | mul a b ha hb => rw [star_mul, rep_mul, rep_mul, ha, hb, star_mul] - | add a b ha hb => rw [star_add, map_add, map_add, ha, hb, star_add] +lemma ψ_zero_mul_ψ_one_isInvariant : IsInvariant (ψ 0 * ψ 1) := by + intro Λ + simp [rep_mul, rep_apply_ψ_eq_sum, mul_add, add_mul] + trans (Λ.1.adjugate 1 1 • Λ.1.adjugate 0 0 - Λ.1.adjugate 1 0 • Λ.1.adjugate 0 1) • (ψ 0 * ψ 1) + · module + simp only [Fin.isValue, adjugate_fin_two, of_apply, cons_val', cons_val_one, cons_val_fin_one, + cons_val_zero, smul_eq_mul, mul_neg, neg_mul, neg_neg] + trans Λ.1.det • (ψ 0 * ψ 1) + · congr + simp only [Matrix.det_fin_two] + ring + · simp + +lemma barψ_zero_mul_barψ_one_isInvariant : IsInvariant (barψ 0 * barψ 1) := by + intro Λ + simp [rep_mul, rep_apply_barψ_eq_sum, mul_add, add_mul, adjugate_fin_two, smul_smul, + ← add_smul, ← neg_smul, ← map_mul, ← map_neg, ← map_add] + trans (starRingEnd ℂ) Λ.1.det • (barψ 0 * barψ 1) + · simp only [Matrix.det_fin_two] + ring_nf + · simp + +lemma quartic_isInvariant : IsInvariant (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by + intro Λ + simp [rep_mul, rep_apply_barψ_eq_sum, rep_apply_barψ_eq_sum, mul_add, add_mul, adjugate_fin_two, smul_smul, + ← add_smul, ← neg_smul, ← map_mul, ← map_neg, ← map_add, mul_assoc] + trans (starRingEnd ℂ) Λ.1.det • ((rep Λ) (ψ 0) * ((rep Λ) (ψ 1) * (barψ 0 * barψ 1))) + · simp only [Matrix.det_fin_two] + ring_nf + simp [rep_apply_ψ_eq_sum, mul_add, add_mul, ← mul_assoc, mul_add, add_mul, adjugate_fin_two, smul_smul, + ← add_smul, ← neg_smul] + trans Λ.1.det • (ψ 0 * ψ 1 * barψ 0 * barψ 1) + · simp only [Matrix.det_fin_two] + ring_nf + · simp /-! -## G. Majorana masses - -In the potential-algebra formalism the components of the fermion field `ψ^α` are the -Grassmann-odd generators `ιLeft (LeftHandedWeyl.basis α)` of the potential algebra itself. -A potential is a function of the field, that is, an element of the algebra; it does not take -a value of the field as an argument. Indeed, the contraction of the metric with two copies of -a commuting (c-number) spinor vanishes identically, since `ε` is antisymmetric while products -of commuting components are symmetric. - -The self contraction `ψψ = ε_{αβ} ψ^α ψ^β` of the fermion field is obtained by contracting -the metric with two copies of the field and multiplying the results in the potential algebra. -It is non-zero precisely because the components of the field anticommute, and it is invariant -under `SL(2,ℂ)` because the metric is. - -The Majorana mass term of mass `m` is `m ψψ` together with its conjugate, which makes it real. +## B.2. Terms which must be zero fo an invariant potential -/ +/-- If `V` is invariant, then all terms with an odd number of factors vanish. -/ +lemma even_of_isInvariant {V : PotentialAlgebra} {s : Finset (Fin 4)} (h : IsInvariant V) + (hs : Odd s.card) : basis.repr V s = 0 := by + suffices h : basis.repr V s = (-1 : ℂ) ^ s.card * basis.repr V s by + simpa [hs.neg_one_pow, CharZero.eq_neg_self_iff] using h + let Λ := (-1 : SL(2, ℂ)) + suffices Λ_basis : ∀ (t : Finset (Fin 4)), rep Λ (basis t) = (-1 : ℂ) ^ t.card • basis t by + conv_lhs => rw [← h Λ, ← basis.sum_repr V, map_sum] + simp [Λ_basis, Finsupp.single_apply, smul_smul, mul_comm] + intro t + have hF : (DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ) + = -LinearMap.id := by + have hinv : (-(1 : Matrix (Fin 2) (Fin 2) ℂ))⁻¹ = -1 := Matrix.inv_eq_left_inv (by simp) + refine (DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).ext fun i => ?_ + rcases i with i | i <;> fin_cases i <;> + simp [DualLeftHandedWeyl.rep_apply_basis, DualRightHandedWeyl.rep_apply_basis, Λ, hinv] + have hmap (n : ℕ) (g : Fin n → DualLeftHandedWeyl × DualRightHandedWeyl) : + ExteriorAlgebra.ιMulti ℂ n (-g) = (-1 : ℂ) ^ n • ExteriorAlgebra.ιMulti ℂ n g := by + rw [show -g = fun i => (-1 : ℂ) • g i from funext fun i => by simp, + AlternatingMap.map_smul_univ] + simp + rw [basis, ExteriorAlgebra.basis_apply_ofCard (s_card := rfl), rep_apply] + simp only [ExteriorAlgebra.ιMulti_family] + rw [ExteriorAlgebra.map_apply_ιMulti, hF] + exact hmap _ _ + +/-- If `V` is invariant, then the mixed terms `ψ i * barψ j` have coefficient zero. -/ +lemma zero_two_term_zero_of_isInvariant {V : PotentialAlgebra} (h : IsInvariant V) : + basis.repr V {0, 2} = 0 ∧ basis.repr V {0, 3} = 0 + ∧ basis.repr V {1, 2} = 0 ∧ basis.repr V {1, 3} = 0 := by + let Λ : SL(2, ℂ):= ⟨!![2 * I, 0; 0, -(I / 2)], by + simp [Matrix.det_fin_two_of]; linear_combination -Complex.I_sq⟩ + let d : Fin 4 → ℂ := ![-(I / 2), 2 * I, I / 2, -(2 * I)] + suffices Λ_basis : ∀ (t : Finset (Fin 4)), rep Λ (basis t) = (∏ k ∈ t, d k) • basis t by + have hzero (a b : Fin 4) (hab : a ≠ b) (hd : d a * d b ≠ 1) : + basis.repr V {a, b} = 0 := by + have h1 : basis.repr V {a, b} = (d a * d b) * basis.repr V {a, b} := by + conv_lhs => rw [← h Λ, ← basis.sum_repr V, map_sum] + simp [Λ_basis, Finsupp.single_apply, smul_smul, mul_comm, Finset.prod_pair hab] + by_contra hne + exact hd (mul_right_cancel₀ hne (by linear_combination -h1)) + refine ⟨hzero 0 2 (by decide) ?_, hzero 0 3 (by decide) ?_, + hzero 1 2 (by decide) ?_, hzero 1 3 (by decide) ?_⟩ <;> + simp only [d, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] + · rw [show -(I / 2) * (I / 2) = 1 / 4 from by linear_combination (-(1 : ℂ)/4) * Complex.I_sq] + norm_num + · rw [show -(I / 2) * -(2 * I) = -1 from by linear_combination Complex.I_sq] + norm_num + · rw [show 2 * I * (I / 2) = -1 from by linear_combination Complex.I_sq] + norm_num + · rw [show 2 * I * -(2 * I) = 4 from by linear_combination (-4 : ℂ) * Complex.I_sq] + norm_num + intro t + have hinv : (!![2 * I, 0; 0, -(I / 2)])⁻¹ = !![-(I / 2), 0; 0, 2 * I] := + Matrix.inv_eq_left_inv (by ext i j; fin_cases i <;> fin_cases j <;> + simp [Matrix.mul_apply, Fin.sum_univ_two] <;> linear_combination -Complex.I_sq) + have hv (k : Fin 4) : ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ)) + (((DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).reindex finSumFinEquiv) k) + = d k • ((DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).reindex + finSumFinEquiv) k := by + fin_cases k <;> + simp [DualLeftHandedWeyl.rep_apply_basis, DualRightHandedWeyl.rep_apply_basis, Λ, d, hinv, + Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons, Complex.conj_ofNat, neg_div, + show (finSumFinEquiv (m := 2) (n := 2)).symm 0 = Sum.inl 0 from rfl, + show (finSumFinEquiv (m := 2) (n := 2)).symm 1 = Sum.inl 1 from rfl, + show (finSumFinEquiv (m := 2) (n := 2)).symm 2 = Sum.inr 0 from rfl, + show (finSumFinEquiv (m := 2) (n := 2)).symm 3 = Sum.inr 1 from rfl] + have hmap (n : ℕ) (c : Fin n → ℂ) (g : Fin n → DualLeftHandedWeyl × DualRightHandedWeyl) + (hcg : ∀ i, ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ)) (g i) + = c i • g i) : + ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ)) + (ExteriorAlgebra.ιMulti ℂ n g) = (∏ i, c i) • ExteriorAlgebra.ιMulti ℂ n g := by + rw [ExteriorAlgebra.map_apply_ιMulti, show ⇑((DualLeftHandedWeyl.rep Λ).prodMap + (DualRightHandedWeyl.rep Λ)) ∘ g = fun i => c i • g i from funext fun i => hcg i, + AlternatingMap.map_smul_univ] + rw [basis, ExteriorAlgebra.basis_apply_ofCard (s_card := rfl), rep_apply] + simp only [ExteriorAlgebra.ιMulti_family, Set.powersetCard.ofFinEmbEquiv_symm_apply] + refine (hmap _ _ _ fun i => hv _).trans ?_ + congr 1 + rw [← Finset.prod_coe_sort t d] + exact Fintype.prod_equiv (t.orderIsoOfFin rfl).toEquiv _ _ fun i => by + simp [Finset.coe_orderIsoOfFin_apply] + +lemma isInvariant_iff {V : PotentialAlgebra} : + IsInvariant V ↔ ∃ (c m1 m2 ρ : ℂ), V = c • 1 + m1 • (ψ 0 * ψ 1) + m2 • (barψ 0 * barψ 1) + + ρ • (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by + constructor + · intro h + rw [← basis.sum_repr V] + refine ⟨basis.repr V ∅, basis.repr V {0, 1}, basis.repr V {2, 3}, basis.repr V {0, 1, 2, 3}, ?_⟩ + rw [show (Finset.univ : Finset (Finset (Fin 4))) = + {∅, {0}, {1}, {2}, {3}, {0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}, + {0, 1, 2}, {0, 1, 3}, {0, 2, 3}, {1, 2, 3}, {0, 1, 2, 3}} by decide] + repeat rw [Finset.sum_insert (by decide)] + rw [Finset.sum_singleton] + rw [even_of_isInvariant (s := {0}) h (by decide), even_of_isInvariant (s := {1}) h (by decide), + even_of_isInvariant (s := {2}) h (by decide), even_of_isInvariant (s := {3}) h (by decide), + even_of_isInvariant (s := {0, 1, 2}) h (by decide), + even_of_isInvariant (s := {0, 1, 3}) h (by decide), + even_of_isInvariant (s := {0, 2, 3}) h (by decide), + even_of_isInvariant (s := {1, 2, 3}) h (by decide), + (zero_two_term_zero_of_isInvariant h).1, (zero_two_term_zero_of_isInvariant h).2.1, + (zero_two_term_zero_of_isInvariant h).2.2.1, (zero_two_term_zero_of_isInvariant h).2.2.2] + simp [add_assoc] + congr + all_goals + rw [basis, ExteriorAlgebra.basis_apply]; + simp [ExteriorAlgebra.ιMulti_apply, + Set.powersetCard.ofFinEmbEquiv_symm_apply, Finset.orderEmbOfFin_apply, Finset.sort_insert, + ψ, barψ, mul_assoc]; + try rfl + · rintro ⟨c, m1, m2, ρ, rfl⟩ + apply_rules [IsInvariant.add, IsInvariant.smul, IsInvariant.one, + ψ_zero_mul_ψ_one_isInvariant, barψ_zero_mul_barψ_one_isInvariant, quartic_isInvariant] + +end PotentialAlgebra -/-- The contraction of the metric with two copies of a commuting spinor vanishes: a Majorana - mass cannot be built from a c-number left-handed Weyl fermion. -/ -lemma metricRaw_contract_comm_eq_zero (ψ : LeftHandedWeyl) : - ∑ α, ∑ β, metricRaw α β * ψ.val α * ψ.val β = 0 := by - simp only [metricRaw, Fin.sum_univ_two, of_apply, cons_val', cons_val_zero, cons_val_one, - empty_val', cons_val_fin_one] - ring - -/-- The self contraction `ψψ = ε_{αβ} ψ^α ψ^β` of the left-handed fermion field, obtained by - contracting the metric `leftMetricVal` with two copies of the field `ιLeft`, and multiplying - the resulting elements of the potential algebra. -/ -def leftSelfContract : potentialAlgebra := - LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ιLeft ιLeft leftMetricVal) - -/-- The self contraction expanded as a sum over components of the metric. -/ -lemma leftSelfContract_eq_sum : leftSelfContract = - ∑ α, ∑ β, (- metricRaw α β) • - (ιLeft (LeftHandedWeyl.basis α) * ιLeft (LeftHandedWeyl.basis β)) := by - rw [leftSelfContract, leftMetricVal_expand_tmul] - simp [metricRaw, Fin.sum_univ_two] - -/-- The self contraction of the left-handed fermion field is invariant under the action of - `SL(2,ℂ)`, that is, it is Lorentz invariant. -/ -lemma rep_leftSelfContract (M : SL(2,ℂ)) : rep M leftSelfContract = leftSelfContract := by - have h (x : LeftHandedWeyl ⊗[ℂ] LeftHandedWeyl) : - rep M (LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ιLeft ιLeft x)) = - LinearMap.mul' ℂ potentialAlgebra (TensorProduct.map ιLeft ιLeft - (TensorProduct.map (LeftHandedWeyl.rep M) (LeftHandedWeyl.rep M) x)) := by - induction x with - | zero => simp - | tmul ψ φ => simp - | add a b ha hb => simp [ha, hb] - rw [leftSelfContract, h, leftMetricVal_rep] - -/-- In terms of the basis, the self contraction of the fermion field is `- 2 ψ^1 ψ^2`. -/ -lemma leftSelfContract_eq_smul : leftSelfContract = - (-2 : ℂ) • (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := by - have h : ιLeft (LeftHandedWeyl.basis 1) * ιLeft (LeftHandedWeyl.basis 0) = - - (ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1)) := - ι_mul_ι_swap _ _ - rw [leftSelfContract, leftMetricVal_expand_tmul] - simp only [map_add, map_neg, TensorProduct.map_tmul, LinearMap.mul'_apply, h] - module - -/-- The self contraction of the fermion field is non-zero. It would vanish if the components - of the field commuted, by the antisymmetry of `ε`. -/ -lemma leftSelfContract_ne_zero : leftSelfContract ≠ 0 := by - /- The alternating form `(v, w) ↦ det ![v.1, w.1]` on the generators lifts to a linear - functional on the potential algebra which is non-zero on the self contraction. -/ - let form : (LeftHandedWeyl × RightHandedWeyl) [⋀^Fin 2]→ₗ[ℂ] ℂ := - Matrix.detRowAlternating.compLinearMap - (LeftHandedWeyl.toFin2ℂEquiv.toLinearMap ∘ₗ LinearMap.fst ℂ LeftHandedWeyl RightHandedWeyl) - let f : ∀ i, (LeftHandedWeyl × RightHandedWeyl) [⋀^Fin i]→ₗ[ℂ] ℂ := - Function.update (fun _ => 0) 2 form - have hprod : ιLeft (LeftHandedWeyl.basis 0) * ιLeft (LeftHandedWeyl.basis 1) = - ExteriorAlgebra.ιMulti ℂ 2 - ![(LeftHandedWeyl.basis 0, 0), (LeftHandedWeyl.basis 1, 0)] := by - rw [ExteriorAlgebra.ιMulti_apply] - simp [ιLeft_apply, ι] - rfl - let F : potentialAlgebra →ₗ[ℂ] ℂ := ExteriorAlgebra.liftAlternating f - have hmulti : F (ExteriorAlgebra.ιMulti ℂ 2 - ![(LeftHandedWeyl.basis 0, 0), (LeftHandedWeyl.basis 1, 0)]) = 1 := by - show ExteriorAlgebra.liftAlternating f _ = 1 - rw [ExteriorAlgebra.liftAlternating_apply_ιMulti] - simp only [f, Function.update_self, form, AlternatingMap.compLinearMap_apply] - show Matrix.det _ = 1 - simp [Matrix.det_fin_two, LeftHandedWeyl.toFin2ℂFun, LeftHandedWeyl.basis_apply] - have hF : F leftSelfContract = -2 := by - rw [leftSelfContract_eq_smul, map_smul, hprod, hmulti, smul_eq_mul, mul_one] - intro h - rw [h, map_zero] at hF - norm_num at hF - -/-- The Majorana mass term, of complex mass `m`, of the left-handed fermion field. It is the - sum of the self contraction `m ψψ` and its conjugate. -/ -def majoranaMass (m : ℂ) : potentialAlgebra := - m • leftSelfContract + star (m • leftSelfContract) - -/-- The Majorana mass term is real, that is, it is fixed by the star operation. -/ -lemma star_majoranaMass (m : ℂ) : star (majoranaMass m) = majoranaMass m := by - rw [majoranaMass, star_add, star_star, add_comm] - -/-- The Majorana mass term is invariant under the action of `SL(2,ℂ)`, that is, - it is Lorentz invariant. -/ -lemma rep_majoranaMass (M : SL(2,ℂ)) (m : ℂ) : rep M (majoranaMass m) = majoranaMass m := by - rw [majoranaMass, map_add, rep_star, map_smul, rep_leftSelfContract] - -end potentialAlgebra end end Fermion From 2fd955842ea821495efc951534fc6b8b395c55d9 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 13 Jul 2026 12:59:20 +0100 Subject: [PATCH 017/254] refactor: Rename --- Physlib.lean | 1 + ...alAlgebra.lean => EffectivePotential.lean} | 58 +++++++++---------- 2 files changed, 30 insertions(+), 29 deletions(-) rename Physlib/Relativity/Fermions/Weyl/{PotentialAlgebra.lean => EffectivePotential.lean} (88%) diff --git a/Physlib.lean b/Physlib.lean index 3142dc696..c19a4e94d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -324,6 +324,7 @@ public import Physlib.Relativity.Fermions.Weyl.Contraction public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded public import Physlib.Relativity.Fermions.Weyl.DualRightHanded public import Physlib.Relativity.Fermions.Weyl.Duals +public import Physlib.Relativity.Fermions.Weyl.EffectivePotential public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.Metric public import Physlib.Relativity.Fermions.Weyl.PotentialAlgebra diff --git a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean similarity index 88% rename from Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean rename to Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean index 04f2085b3..9eb83f384 100644 --- a/Physlib/Relativity/Fermions/Weyl/PotentialAlgebra.lean +++ b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean @@ -7,11 +7,10 @@ module public import Physlib.Relativity.Fermions.Weyl.Metric public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis /-! -# The potential algebra of Weyl fermions +# The effective potential of Weyl fermions ## i. Overview @@ -19,7 +18,7 @@ In this file are primary objective is to look at the potential of a single left-handed Weyl fermion, correctly taking account of the anti-commuting nature of the fermion. -Two facts about the potential, which we take as a given, are that: +Two facts about the (effective) potential, which we take as a given, are that: 1. It is written in terms of the components of the left-handed Weyl fermion and its conjugate. 2. Within the potential the components anti-commute. The first of these, tells us that we should be working with the dual of the left-handed Weyl fermion @@ -29,7 +28,7 @@ exterior algebra. Thus, the type in which the potential lives is `ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl)`. We call this type -`PotentialAlgebra` and define it and its properties in this file. +`EffectivePotential` and define it and its properties in this file. On `PotentialAlgebra` we define a representation of the Lorentz group, and prove that that if the potential is invariant under the Lorentz group it must be of the form @@ -57,9 +56,11 @@ open CategoryTheory.MonoidalCategory -/ -abbrev PotentialAlgebra : Type := ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl) +/-- The type corresponding to the effective potential of a + left-handed Weyl fermion. -/ +abbrev EffectivePotential : Type := ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl) -namespace PotentialAlgebra +namespace EffectivePotential /-! @@ -68,13 +69,13 @@ namespace PotentialAlgebra -/ /-- The coordinate element corresponding to the i-th basis vector as a member - of the potential algebra. -/ -def ψ (i : Fin 2) : PotentialAlgebra := + of the effective potential. -/ +def ψ (i : Fin 2) : EffectivePotential := (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (DualLeftHandedWeyl.basis i)) /-- The coordinate element corresponding to the conjugate i-th basis vector as a member - of the potential algebra. -/ -def barψ (i : Fin 2) : PotentialAlgebra := + of the effective potential. -/ +def barψ (i : Fin 2) : EffectivePotential := (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (DualRightHandedWeyl.basis i)) @[simp] lemma ψ_mul_self (i : Fin 2) : ψ i * ψ i = 0 := ExteriorAlgebra.ι_sq_zero _ @@ -96,9 +97,8 @@ def barψ (i : Fin 2) : PotentialAlgebra := -/ - -/-- The basis of the potential algebra. -/ -def basis : Basis (Finset (Fin 4)) ℂ PotentialAlgebra := +/-- The basis of the effective potential. -/ +def basis : Basis (Finset (Fin 4)) ℂ EffectivePotential := Module.Basis.ExteriorAlgebra ((DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).reindex finSumFinEquiv) @@ -109,7 +109,7 @@ def basis : Basis (Finset (Fin 4)) ℂ PotentialAlgebra := -/ /-- The representation of the Lorentz group on `PotentialAlgebra`. -/ -def rep : Representation ℂ SL(2, ℂ) PotentialAlgebra where +def rep : Representation ℂ SL(2, ℂ) EffectivePotential where toFun Λ := (ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ))).toLinearMap map_one' := by @@ -119,11 +119,11 @@ def rep : Representation ℂ SL(2, ℂ) PotentialAlgebra where simp only [map_mul, End.mul_eq_comp, ← LinearMap.prodMap_comp, ← ExteriorAlgebra.map_comp_map, AlgHom.comp_toLinearMap] -lemma rep_apply (Λ : SL(2, ℂ)) (V : PotentialAlgebra) : +lemma rep_apply (Λ : SL(2, ℂ)) (V : EffectivePotential) : rep Λ V = ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ)) V := rfl -lemma rep_mul (Λ : SL(2, ℂ)) (V W : PotentialAlgebra) : +lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : rep Λ (V * W) = rep Λ V * rep Λ W:= by simp [rep] @@ -144,22 +144,22 @@ lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : -/ -def IsInvariant (V : PotentialAlgebra) : Prop := ∀ Λ, rep Λ V = V +def IsInvariant (V : EffectivePotential) : Prop := ∀ Λ, rep Λ V = V -lemma IsInvariant.eq_iff {V : PotentialAlgebra} : +lemma IsInvariant.eq_iff {V : EffectivePotential} : IsInvariant V ↔ ∀ Λ, rep Λ V = V := by rfl -lemma IsInvariant.add {V W : PotentialAlgebra} (hV : IsInvariant V) (hW : IsInvariant W) : +lemma IsInvariant.add {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : IsInvariant (V + W) := by intro Λ simp_all [IsInvariant.eq_iff] -lemma IsInvariant.smul {V : PotentialAlgebra} (hV : IsInvariant V) (c : ℂ) : +lemma IsInvariant.smul {V : EffectivePotential} (hV : IsInvariant V) (c : ℂ) : IsInvariant (c • V) := by intro Λ simp_all [IsInvariant.eq_iff] -lemma IsInvariant.mul {V W : PotentialAlgebra} (hV : IsInvariant V) (hW : IsInvariant W) : +lemma IsInvariant.mul {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : IsInvariant (V * W) := by intro Λ simp_all [IsInvariant.eq_iff, rep_mul] @@ -198,13 +198,13 @@ lemma barψ_zero_mul_barψ_one_isInvariant : IsInvariant (barψ 0 * barψ 1) := lemma quartic_isInvariant : IsInvariant (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by intro Λ - simp [rep_mul, rep_apply_barψ_eq_sum, rep_apply_barψ_eq_sum, mul_add, add_mul, adjugate_fin_two, smul_smul, - ← add_smul, ← neg_smul, ← map_mul, ← map_neg, ← map_add, mul_assoc] + simp [rep_mul, rep_apply_barψ_eq_sum, rep_apply_barψ_eq_sum, mul_add, add_mul, adjugate_fin_two, + smul_smul, ← add_smul, ← neg_smul, ← map_mul, ← map_neg, ← map_add, mul_assoc] trans (starRingEnd ℂ) Λ.1.det • ((rep Λ) (ψ 0) * ((rep Λ) (ψ 1) * (barψ 0 * barψ 1))) · simp only [Matrix.det_fin_two] ring_nf - simp [rep_apply_ψ_eq_sum, mul_add, add_mul, ← mul_assoc, mul_add, add_mul, adjugate_fin_two, smul_smul, - ← add_smul, ← neg_smul] + simp [rep_apply_ψ_eq_sum, mul_add, add_mul, ← mul_assoc, mul_add, add_mul, + adjugate_fin_two, smul_smul, ← add_smul, ← neg_smul] trans Λ.1.det • (ψ 0 * ψ 1 * barψ 0 * barψ 1) · simp only [Matrix.det_fin_two] ring_nf @@ -216,7 +216,7 @@ lemma quartic_isInvariant : IsInvariant (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by -/ /-- If `V` is invariant, then all terms with an odd number of factors vanish. -/ -lemma even_of_isInvariant {V : PotentialAlgebra} {s : Finset (Fin 4)} (h : IsInvariant V) +lemma even_of_isInvariant {V : EffectivePotential} {s : Finset (Fin 4)} (h : IsInvariant V) (hs : Odd s.card) : basis.repr V s = 0 := by suffices h : basis.repr V s = (-1 : ℂ) ^ s.card * basis.repr V s by simpa [hs.neg_one_pow, CharZero.eq_neg_self_iff] using h @@ -242,7 +242,7 @@ lemma even_of_isInvariant {V : PotentialAlgebra} {s : Finset (Fin 4)} (h : IsInv exact hmap _ _ /-- If `V` is invariant, then the mixed terms `ψ i * barψ j` have coefficient zero. -/ -lemma zero_two_term_zero_of_isInvariant {V : PotentialAlgebra} (h : IsInvariant V) : +lemma zero_two_term_zero_of_isInvariant {V : EffectivePotential} (h : IsInvariant V) : basis.repr V {0, 2} = 0 ∧ basis.repr V {0, 3} = 0 ∧ basis.repr V {1, 2} = 0 ∧ basis.repr V {1, 3} = 0 := by let Λ : SL(2, ℂ):= ⟨!![2 * I, 0; 0, -(I / 2)], by @@ -299,7 +299,7 @@ lemma zero_two_term_zero_of_isInvariant {V : PotentialAlgebra} (h : IsInvariant exact Fintype.prod_equiv (t.orderIsoOfFin rfl).toEquiv _ _ fun i => by simp [Finset.coe_orderIsoOfFin_apply] -lemma isInvariant_iff {V : PotentialAlgebra} : +lemma isInvariant_iff {V : EffectivePotential} : IsInvariant V ↔ ∃ (c m1 m2 ρ : ℂ), V = c • 1 + m1 • (ψ 0 * ψ 1) + m2 • (barψ 0 * barψ 1) + ρ • (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by constructor @@ -331,7 +331,7 @@ lemma isInvariant_iff {V : PotentialAlgebra} : apply_rules [IsInvariant.add, IsInvariant.smul, IsInvariant.one, ψ_zero_mul_ψ_one_isInvariant, barψ_zero_mul_barψ_one_isInvariant, quartic_isInvariant] -end PotentialAlgebra +end EffectivePotential end end Fermion From 98d74b623f108ec43527c4d0663b28a92731b59a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 13 Jul 2026 13:49:57 +0100 Subject: [PATCH 018/254] refactor: Lint --- Physlib.lean | 1 - Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Physlib.lean b/Physlib.lean index c19a4e94d..b27c9f117 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -327,7 +327,6 @@ public import Physlib.Relativity.Fermions.Weyl.Duals public import Physlib.Relativity.Fermions.Weyl.EffectivePotential public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.Metric -public import Physlib.Relativity.Fermions.Weyl.PotentialAlgebra public import Physlib.Relativity.Fermions.Weyl.RightHanded public import Physlib.Relativity.Fermions.Weyl.Two public import Physlib.Relativity.Fermions.Weyl.Unit diff --git a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean index 9eb83f384..56123a33b 100644 --- a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean +++ b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean @@ -212,7 +212,7 @@ lemma quartic_isInvariant : IsInvariant (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by /-! -## B.2. Terms which must be zero fo an invariant potential +## B.2. Terms which must be zero in an invariant potential -/ /-- If `V` is invariant, then all terms with an odd number of factors vanish. -/ From e7561cf94efd02b195e2600d5c8e7ec0700e099c Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 13 Jul 2026 14:13:56 +0100 Subject: [PATCH 019/254] refactor: Add lemma about duals. --- Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean index 6884f71db..96025fd99 100644 --- a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean +++ b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean @@ -32,6 +32,8 @@ Although a different index convention is used there. namespace Fermion noncomputable section +TODO "Relate `DualLeftHandedWeyl` to `LeftHandedWeyl` via `Module.dual`." + /-- The module in which dual-left handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ structure DualLeftHandedWeyl where /-- The underlying value in `Fin 2 → ℂ`. -/ From c9ca4970de19bb69da577f2aaf658c213e348e76 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 14 Jul 2026 05:43:47 +0100 Subject: [PATCH 020/254] feat: Improve doc-strings --- Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean index 56123a33b..35e74ec00 100644 --- a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean +++ b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean @@ -20,6 +20,7 @@ of the anti-commuting nature of the fermion. Two facts about the (effective) potential, which we take as a given, are that: 1. It is written in terms of the components of the left-handed Weyl fermion and its conjugate. + (For this effective potential, we do not consider derivatives.) 2. Within the potential the components anti-commute. The first of these, tells us that we should be working with the dual of the left-handed Weyl fermion and its conjugate (since the duals are the linear functionals which pick @@ -90,7 +91,6 @@ def barψ (i : Fin 2) : EffectivePotential := rw [neg_mul, eq_neg_iff_add_eq_zero] exact ExteriorAlgebra.ι_add_mul_swap _ _ - /-! ### A.2. Basis @@ -144,6 +144,8 @@ lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : -/ +/-- An effective potential is Lorentz invariant if it is stable under the + action of the Lorentz group. -/ def IsInvariant (V : EffectivePotential) : Prop := ∀ Λ, rep Λ V = V lemma IsInvariant.eq_iff {V : EffectivePotential} : From 79d72afbc11319de87e143e82a92380950495273 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 14 Jul 2026 09:14:10 +0100 Subject: [PATCH 021/254] feat: Add termOfList, and update types --- Physlib/Mathematics/ConjModule.lean | 31 ++- .../Fermions/Weyl/EffectivePotential.lean | 228 +++++++++++------- 2 files changed, 170 insertions(+), 89 deletions(-) diff --git a/Physlib/Mathematics/ConjModule.lean b/Physlib/Mathematics/ConjModule.lean index 3b2ce7039..109c4030a 100644 --- a/Physlib/Mathematics/ConjModule.lean +++ b/Physlib/Mathematics/ConjModule.lean @@ -9,7 +9,7 @@ public import Mathlib.Algebra.Module.Equiv.Defs public import Mathlib.Algebra.Star.Module public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.Tactic.Ring - +public import Mathlib.RepresentationTheory.Basic /-! # The conjugate module @@ -89,16 +89,16 @@ noncomputable def starFinsupp : (ι →₀ k) ≃ₛₗ[starRingEnd k] (ι → /-- A basis of `M` transported to a basis of `ConjModule M`: the same basis vectors, with coordinates conjugated (`(Basis.conj b).repr v = star ∘ b.repr v`). -/ -noncomputable def _root_.Basis.conj (b : Basis ι k M) : Basis ι k (ConjModule M) := +noncomputable def _root_.Module.Basis.conj (b : Basis ι k M) : Basis ι k (ConjModule M) := Basis.ofRepr (((conjEquiv (k := k) (M := M)).symm.trans b.repr).trans starFinsupp) /-- Coordinates in `Basis.conj b` are the `star` of the coordinates in `b`. -/ -@[simp] lemma _root_.Basis.conj_repr_apply (b : Basis ι k M) (v : ConjModule M) (i : ι) : +@[simp] lemma _root_.Module.Basis.conj_repr_apply (b : Basis ι k M) (v : ConjModule M) (i : ι) : (Basis.conj b).repr v i = star (b.repr ((conjEquiv (k := k) (M := M)).symm v) i) := rfl /-- The basis vectors of `Basis.conj b` are those of `b`, viewed through `conjEquiv`. -/ -@[simp] lemma _root_.Basis.conj_apply (b : Basis ι k M) (i : ι) : +@[simp] lemma _root_.Module.Basis.conj_apply (b : Basis ι k M) (i : ι) : Basis.conj b i = conjEquiv (k := k) (M := M) (b i) := by apply (Basis.conj b).repr.injective ext j @@ -106,6 +106,29 @@ noncomputable def _root_.Basis.conj (b : Basis ι k M) : Basis ι k (ConjModule · subst h; simp [Basis.conj_repr_apply] · simp [Basis.conj_repr_apply, Finsupp.single_eq_of_ne, h] +/-! + +## The conjugate of a representation + +-/ + +/-- The conjugate of a representation `ρ` of `G` on `M`: the same maps `ρ g`, acting on +`ConjModule M` through `conjEquiv`. -/ +def _root_.Representation.conj {G} [Group G] (ρ : Representation k G M) : + Representation k G (ConjModule M) where + toFun g := { + toFun := conjEquiv (k := k) (M := M) ∘ ρ g ∘ (conjEquiv (k := k) (M := M)).symm + map_add' x y := (ρ g).map_add x y + map_smul' a m := (ρ g).map_smul (star a) m } + map_one' := LinearMap.ext fun _ => + congrArg (conjEquiv (k := k)) (LinearMap.congr_fun (map_one ρ) _) + map_mul' g h := LinearMap.ext fun _ => + congrArg (conjEquiv (k := k)) (LinearMap.congr_fun (map_mul ρ g h) _) + +lemma _root_.Representation.conj_apply {G} [Group G] (ρ : Representation k G M) (g : G) + (m : ConjModule M) : + ρ.conj g m = conjEquiv (k := k) (M := M) (ρ g ((conjEquiv (k := k) (M := M)).symm m)) := rfl + end ConjModule end diff --git a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean index 35e74ec00..949955994 100644 --- a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean +++ b/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean @@ -8,6 +8,7 @@ module public import Physlib.Relativity.Fermions.Weyl.Metric public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Mathematics.ConjModule /-! # The effective potential of Weyl fermions @@ -28,8 +29,13 @@ out the components of the fermion). The second of these tells us that we should exterior algebra. Thus, the type in which the potential lives is -`ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl)`. We call this type -`EffectivePotential` and define it and its properties in this file. +`ExteriorAlgebra ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl))`. +We call this type `EffectivePotential` and define it and its properties in this file. +Note that `Module.Dual ℂ LeftHandedWeyl` is equivalent to `DualLeftHandedWeyl` and +`Module.Dual ℂ (ConjModule LeftHandedWeyl)` is equivalent to `DualRightHandedWeyl`, +so we could equivalently define the effective potential as +`ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl)`. We have done the +former here as it generalises to other cases. On `PotentialAlgebra` we define a representation of the Lorentz group, and prove that that if the potential is invariant under the Lorentz group it must be of the form @@ -59,7 +65,8 @@ open CategoryTheory.MonoidalCategory /-- The type corresponding to the effective potential of a left-handed Weyl fermion. -/ -abbrev EffectivePotential : Type := ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl) +abbrev EffectivePotential : Type := ExteriorAlgebra ℂ + (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) namespace EffectivePotential @@ -72,12 +79,12 @@ namespace EffectivePotential /-- The coordinate element corresponding to the i-th basis vector as a member of the effective potential. -/ def ψ (i : Fin 2) : EffectivePotential := - (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (DualLeftHandedWeyl.basis i)) + (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis i)) /-- The coordinate element corresponding to the conjugate i-th basis vector as a member of the effective potential. -/ def barψ (i : Fin 2) : EffectivePotential := - (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (DualRightHandedWeyl.basis i)) + (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis i)) @[simp] lemma ψ_mul_self (i : Fin 2) : ψ i * ψ i = 0 := ExteriorAlgebra.ι_sq_zero _ @@ -91,27 +98,70 @@ def barψ (i : Fin 2) : EffectivePotential := rw [neg_mul, eq_neg_iff_add_eq_zero] exact ExteriorAlgebra.ι_add_mul_swap _ _ +@[simp] +lemma append_apply_zero_eq : Fin.append ψ barψ 0 = ψ 0 := rfl + +@[simp] +lemma append_apply_one_eq : Fin.append ψ barψ 1 = ψ 1 := rfl + +@[simp] +lemma append_apply_two_eq : Fin.append ψ barψ 2 = barψ 0 := rfl + +@[simp] +lemma append_apply_three_eq : Fin.append ψ barψ 3 = barψ 1 := rfl + +/-! + +### A.2. Of a list +-/ + +def termOfList (l : List (Fin 4)) : EffectivePotential := + (l.map (Fin.append ψ barψ)).prod + +@[simp] +lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] + +lemma termOfList_cons (l : List (Fin 4)) (i : Fin 4) : + termOfList (i :: l) = (Fin.append ψ barψ i) * termOfList l := by + simp only [termOfList, List.map_cons, List.prod_cons] + /-! -### A.2. Basis +### A.3. Basis -/ /-- The basis of the effective potential. -/ def basis : Basis (Finset (Fin 4)) ℂ EffectivePotential := - Module.Basis.ExteriorAlgebra ((DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).reindex - finSumFinEquiv) + Module.Basis.ExteriorAlgebra ((LeftHandedWeyl.basis.dualBasis.prod + LeftHandedWeyl.basis.conj.dualBasis).reindex finSumFinEquiv) + +lemma basis_eq_termOfList (s : Finset (Fin 4)) : basis s = termOfList (s.sort (· ≤ ·)) := by + have happend : Fin.append ψ barψ = fun j => (ExteriorAlgebra.ι ℂ) + (((LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex + finSumFinEquiv) j) := by + funext j + fin_cases j <;> + simp [ψ, barψ, Fin.append, Fin.addCases, Basis.prod_apply, + show (finSumFinEquiv (m := 2) (n := 2)).symm 0 = Sum.inl 0 from rfl, + show (finSumFinEquiv (m := 2) (n := 2)).symm 1 = Sum.inl 1 from rfl, + show (finSumFinEquiv (m := 2) (n := 2)).symm 2 = Sum.inr 0 from rfl, + show (finSumFinEquiv (m := 2) (n := 2)).symm 3 = Sum.inr 1 from rfl] + rw [basis, ExteriorAlgebra.basis_apply_ofCard (s_card := rfl), termOfList, happend] + simp only [ExteriorAlgebra.ιMulti_family, Set.powersetCard.ofFinEmbEquiv_symm_apply, + ExteriorAlgebra.ιMulti_apply] + refine congrArg List.prod (List.ext_getElem (by simp) fun i h1 h2 => ?_) + simp [Finset.orderEmbOfFin_apply] /-! - -## A.3. The representation on the potential algebra - +### A.4. The representation on the potential algebra -/ + /-- The representation of the Lorentz group on `PotentialAlgebra`. -/ def rep : Representation ℂ SL(2, ℂ) EffectivePotential where - toFun Λ := (ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap - (DualRightHandedWeyl.rep Λ))).toLinearMap + toFun Λ := (ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap + (LeftHandedWeyl.rep.conj.dual Λ))).toLinearMap map_one' := by simp only [map_one, End.one_eq_id, LinearMap.prodMap_id, ExteriorAlgebra.map_id, AlgHom.toLinearMap_id] @@ -120,8 +170,12 @@ def rep : Representation ℂ SL(2, ℂ) EffectivePotential where AlgHom.comp_toLinearMap] lemma rep_apply (Λ : SL(2, ℂ)) (V : EffectivePotential) : - rep Λ V = ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap - (DualRightHandedWeyl.rep Λ)) V := rfl + rep Λ V = ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap + (LeftHandedWeyl.rep.conj.dual Λ)) V := rfl + +@[simp] +lemma rep_apply_one (Λ : SL(2, ℂ)) : rep Λ 1 = 1 := by + simp [rep_apply] lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : rep Λ (V * W) = rep Λ V * rep Λ W:= by @@ -129,13 +183,50 @@ lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : lemma rep_apply_ψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : rep Λ (ψ i) = ∑ j, Λ⁻¹ i j • ψ j := by - simp [rep, ψ, DualLeftHandedWeyl.rep_apply_basis, ← map_smul, ← map_add, - -SpecialLinearGroup.coe_inv, Lorentz.SL2C.inverse_coe] + simp only [ψ, Basis.coe_dualBasis, LinearMap.coe_inl, rep_apply, Representation.dual_apply, + ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, ← map_smul, Prod.smul_mk, + smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, + ExteriorAlgebra.ι_inj, Prod.mk.injEq, and_true] + refine LeftHandedWeyl.basis.ext fun l => ?_ + fin_cases i <;> fin_cases l <;> + simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, + -SpecialLinearGroup.coe_inv] lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : rep Λ (barψ i) = ∑ j, star (Λ⁻¹ i j) • barψ j := by - simp [rep, barψ, DualRightHandedWeyl.rep_apply_basis, ← map_smul, ← map_add, - -SpecialLinearGroup.coe_inv, Lorentz.SL2C.inverse_coe] + simp only [barψ, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, Representation.dual_apply, + ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, RCLike.star_def, ← map_smul, + Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, + ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] + refine LeftHandedWeyl.basis.conj.ext fun l => ?_ + fin_cases i <;> fin_cases l <;> + simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, + -SpecialLinearGroup.coe_inv, Representation.conj_apply] + +lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List (Fin 4)) : + rep Λ (termOfList l) = ((l.map (Fin.append ψ barψ)).map (rep Λ)).prod := by + induction l with + | nil => simp + | cons i l ih => + simp [termOfList_cons, rep_mul, ih] + +lemma rep_neg_apply_append (Λ : SL(2, ℂ)) (i : Fin 4) : + rep (- Λ) (Fin.append ψ barψ i) = (-1 : ℂ) • rep Λ (Fin.append ψ barψ i) := by + fin_cases i + all_goals + simp [rep_apply_ψ_eq_sum, rep_apply_barψ_eq_sum] + abel + +lemma rep_neg_apply_termOfList (Λ : SL(2, ℂ)) (l : List (Fin 4)) : + rep (- Λ) (termOfList l) = ((-1 : ℂ) ^ l.length) • rep Λ (termOfList l) := by + induction l with + | nil => simp + | cons i l ih => + simp [termOfList_cons, rep_mul, ih, rep_neg_apply_append, pow_succ' (-1 : ℂ) l.length] + +lemma rep_neg_apply_basis (s : Finset (Fin 4)) (Λ : SL(2, ℂ)) : + rep (- Λ) (basis s) = (-1 : ℂ) ^ s.card • rep Λ (basis s) := by + simp [basis_eq_termOfList, rep_neg_apply_termOfList] /-! @@ -222,26 +313,11 @@ lemma even_of_isInvariant {V : EffectivePotential} {s : Finset (Fin 4)} (h : IsI (hs : Odd s.card) : basis.repr V s = 0 := by suffices h : basis.repr V s = (-1 : ℂ) ^ s.card * basis.repr V s by simpa [hs.neg_one_pow, CharZero.eq_neg_self_iff] using h - let Λ := (-1 : SL(2, ℂ)) - suffices Λ_basis : ∀ (t : Finset (Fin 4)), rep Λ (basis t) = (-1 : ℂ) ^ t.card • basis t by - conv_lhs => rw [← h Λ, ← basis.sum_repr V, map_sum] + suffices Λ_basis : ∀ (t : Finset (Fin 4)), rep (-1 : SL(2, ℂ)) (basis t) = + (-1 : ℂ) ^ t.card • basis t by + conv_lhs => rw [← h (-1 : SL(2, ℂ)), ← basis.sum_repr V, map_sum] simp [Λ_basis, Finsupp.single_apply, smul_smul, mul_comm] - intro t - have hF : (DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ) - = -LinearMap.id := by - have hinv : (-(1 : Matrix (Fin 2) (Fin 2) ℂ))⁻¹ = -1 := Matrix.inv_eq_left_inv (by simp) - refine (DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).ext fun i => ?_ - rcases i with i | i <;> fin_cases i <;> - simp [DualLeftHandedWeyl.rep_apply_basis, DualRightHandedWeyl.rep_apply_basis, Λ, hinv] - have hmap (n : ℕ) (g : Fin n → DualLeftHandedWeyl × DualRightHandedWeyl) : - ExteriorAlgebra.ιMulti ℂ n (-g) = (-1 : ℂ) ^ n • ExteriorAlgebra.ιMulti ℂ n g := by - rw [show -g = fun i => (-1 : ℂ) • g i from funext fun i => by simp, - AlternatingMap.map_smul_univ] - simp - rw [basis, ExteriorAlgebra.basis_apply_ofCard (s_card := rfl), rep_apply] - simp only [ExteriorAlgebra.ιMulti_family] - rw [ExteriorAlgebra.map_apply_ιMulti, hF] - exact hmap _ _ + simp [rep_neg_apply_basis] /-- If `V` is invariant, then the mixed terms `ψ i * barψ j` have coefficient zero. -/ lemma zero_two_term_zero_of_isInvariant {V : EffectivePotential} (h : IsInvariant V) : @@ -250,56 +326,38 @@ lemma zero_two_term_zero_of_isInvariant {V : EffectivePotential} (h : IsInvarian let Λ : SL(2, ℂ):= ⟨!![2 * I, 0; 0, -(I / 2)], by simp [Matrix.det_fin_two_of]; linear_combination -Complex.I_sq⟩ let d : Fin 4 → ℂ := ![-(I / 2), 2 * I, I / 2, -(2 * I)] + suffices Λ_basis_two : ∀ (a b : Fin 4) (hab : a ≠ b) (hd : d a * d b ≠ 1), + basis.repr V {a, b} = 0 by + refine ⟨Λ_basis_two 0 2 (by decide) ?_, Λ_basis_two 0 3 (by decide) ?_, + Λ_basis_two 1 2 (by decide) ?_, Λ_basis_two 1 3 (by decide) ?_⟩ + all_goals + simp [d] + ring_nf + simp + try grind suffices Λ_basis : ∀ (t : Finset (Fin 4)), rep Λ (basis t) = (∏ k ∈ t, d k) • basis t by - have hzero (a b : Fin 4) (hab : a ≠ b) (hd : d a * d b ≠ 1) : - basis.repr V {a, b} = 0 := by - have h1 : basis.repr V {a, b} = (d a * d b) * basis.repr V {a, b} := by + intro a b hab hd + have h1 : basis.repr V {a, b} = (d a * d b) * basis.repr V {a, b} := by conv_lhs => rw [← h Λ, ← basis.sum_repr V, map_sum] simp [Λ_basis, Finsupp.single_apply, smul_smul, mul_comm, Finset.prod_pair hab] - by_contra hne - exact hd (mul_right_cancel₀ hne (by linear_combination -h1)) - refine ⟨hzero 0 2 (by decide) ?_, hzero 0 3 (by decide) ?_, - hzero 1 2 (by decide) ?_, hzero 1 3 (by decide) ?_⟩ <;> - simp only [d, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] - · rw [show -(I / 2) * (I / 2) = 1 / 4 from by linear_combination (-(1 : ℂ)/4) * Complex.I_sq] - norm_num - · rw [show -(I / 2) * -(2 * I) = -1 from by linear_combination Complex.I_sq] - norm_num - · rw [show 2 * I * (I / 2) = -1 from by linear_combination Complex.I_sq] - norm_num - · rw [show 2 * I * -(2 * I) = 4 from by linear_combination (-4 : ℂ) * Complex.I_sq] - norm_num - intro t - have hinv : (!![2 * I, 0; 0, -(I / 2)])⁻¹ = !![-(I / 2), 0; 0, 2 * I] := - Matrix.inv_eq_left_inv (by ext i j; fin_cases i <;> fin_cases j <;> - simp [Matrix.mul_apply, Fin.sum_univ_two] <;> linear_combination -Complex.I_sq) - have hv (k : Fin 4) : ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ)) - (((DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).reindex finSumFinEquiv) k) - = d k • ((DualLeftHandedWeyl.basis.prod DualRightHandedWeyl.basis).reindex - finSumFinEquiv) k := by - fin_cases k <;> - simp [DualLeftHandedWeyl.rep_apply_basis, DualRightHandedWeyl.rep_apply_basis, Λ, d, hinv, - Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons, Complex.conj_ofNat, neg_div, - show (finSumFinEquiv (m := 2) (n := 2)).symm 0 = Sum.inl 0 from rfl, - show (finSumFinEquiv (m := 2) (n := 2)).symm 1 = Sum.inl 1 from rfl, - show (finSumFinEquiv (m := 2) (n := 2)).symm 2 = Sum.inr 0 from rfl, - show (finSumFinEquiv (m := 2) (n := 2)).symm 3 = Sum.inr 1 from rfl] - have hmap (n : ℕ) (c : Fin n → ℂ) (g : Fin n → DualLeftHandedWeyl × DualRightHandedWeyl) - (hcg : ∀ i, ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ)) (g i) - = c i • g i) : - ExteriorAlgebra.map ((DualLeftHandedWeyl.rep Λ).prodMap (DualRightHandedWeyl.rep Λ)) - (ExteriorAlgebra.ιMulti ℂ n g) = (∏ i, c i) • ExteriorAlgebra.ιMulti ℂ n g := by - rw [ExteriorAlgebra.map_apply_ιMulti, show ⇑((DualLeftHandedWeyl.rep Λ).prodMap - (DualRightHandedWeyl.rep Λ)) ∘ g = fun i => c i • g i from funext fun i => hcg i, - AlternatingMap.map_smul_univ] - rw [basis, ExteriorAlgebra.basis_apply_ofCard (s_card := rfl), rep_apply] - simp only [ExteriorAlgebra.ιMulti_family, Set.powersetCard.ofFinEmbEquiv_symm_apply] - refine (hmap _ _ _ fun i => hv _).trans ?_ - congr 1 - rw [← Finset.prod_coe_sort t d] - exact Fintype.prod_equiv (t.orderIsoOfFin rfl).toEquiv _ _ fun i => by - simp [Finset.coe_orderIsoOfFin_apply] + by_contra hne + exact hd (mul_right_cancel₀ hne (by linear_combination -h1)) + suffices Λ_termOfList : ∀ (l : List (Fin 4)), + rep Λ (termOfList l) = (l.map d).prod • termOfList l by + intro t + rw [basis_eq_termOfList, Λ_termOfList, ← Finset.prod_map_toList t, + ((Finset.sort_perm_toList t fun x1 x2 => x1 ≤ x2).map d).prod_eq] + suffices Λ_append : ∀ (i : Fin 4), rep Λ (Fin.append ψ barψ i) = d i • Fin.append ψ barψ i by + intro l + induction l with + | nil => simp + | cons i l ih => simp [termOfList_cons, rep_mul, ih, Λ_append, smul_smul, mul_comm] + intro i + fin_cases i + all_goals + simp [rep_apply_ψ_eq_sum, rep_apply_barψ_eq_sum, d, adjugate_fin_two, Λ, + neg_smul, Complex.conj_ofNat] + try module lemma isInvariant_iff {V : EffectivePotential} : IsInvariant V ↔ ∃ (c m1 m2 ρ : ℂ), V = c • 1 + m1 • (ψ 0 * ψ 1) + m2 • (barψ 0 * barψ 1) + From e67ba270aa7cb5071d9bc545445dc9f58ec34a11 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 14 Jul 2026 09:16:53 +0100 Subject: [PATCH 022/254] refactor: Move file --- Physlib.lean | 2 +- .../Weyl => Particles/PureFermionic}/EffectivePotential.lean | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename Physlib/{Relativity/Fermions/Weyl => Particles/PureFermionic}/EffectivePotential.lean (99%) diff --git a/Physlib.lean b/Physlib.lean index b27c9f117..5f64c438c 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -165,6 +165,7 @@ public import Physlib.Particles.FlavorPhysics.CKMMatrix.Rows public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.Basic public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.StandardParameters public import Physlib.Particles.NeutrinoPhysics.Basic +public import Physlib.Particles.PureFermionic.EffectivePotential public import Physlib.Particles.StandardModel.AnomalyCancellation.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.FamilyMaps public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.Basic @@ -324,7 +325,6 @@ public import Physlib.Relativity.Fermions.Weyl.Contraction public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded public import Physlib.Relativity.Fermions.Weyl.DualRightHanded public import Physlib.Relativity.Fermions.Weyl.Duals -public import Physlib.Relativity.Fermions.Weyl.EffectivePotential public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.Metric public import Physlib.Relativity.Fermions.Weyl.RightHanded diff --git a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean similarity index 99% rename from Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean rename to Physlib/Particles/PureFermionic/EffectivePotential.lean index 949955994..a56ec01e3 100644 --- a/Physlib/Relativity/Fermions/Weyl/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -11,11 +11,11 @@ public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Mathematics.ConjModule /-! -# The effective potential of Weyl fermions +# The effective potential for a left-handed Weyl fermion ## i. Overview -In this file are primary objective is to look at the potential +In this file our primary objective is to look at the potential of a single left-handed Weyl fermion, correctly taking account of the anti-commuting nature of the fermion. From df7bd337e6d02bc0a1234a5ef9c6706518c3d116 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 14 Jul 2026 09:26:29 +0100 Subject: [PATCH 023/254] refactor: Clean up --- .../PureFermionic/EffectivePotential.lean | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index a56ec01e3..a8bdfe779 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -78,21 +78,21 @@ namespace EffectivePotential /-- The coordinate element corresponding to the i-th basis vector as a member of the effective potential. -/ -def ψ (i : Fin 2) : EffectivePotential := - (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis i)) +def ψ (α : Fin 2) : EffectivePotential := + (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) /-- The coordinate element corresponding to the conjugate i-th basis vector as a member of the effective potential. -/ -def barψ (i : Fin 2) : EffectivePotential := - (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis i)) +def barψ (α : Fin 2) : EffectivePotential := + (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) -@[simp] lemma ψ_mul_self (i : Fin 2) : ψ i * ψ i = 0 := ExteriorAlgebra.ι_sq_zero _ +@[simp] lemma ψ_mul_self (α : Fin 2) : ψ α * ψ α = 0 := ExteriorAlgebra.ι_sq_zero _ @[simp] lemma ψ_one_mul_ψ_zero_swap : ψ 1 * ψ 0 = - ψ 0 * ψ 1 := by rw [neg_mul, eq_neg_iff_add_eq_zero] exact ExteriorAlgebra.ι_add_mul_swap _ _ -@[simp] lemma barψ_mul_self (i : Fin 2) : barψ i * barψ i = 0 := ExteriorAlgebra.ι_sq_zero _ +@[simp] lemma barψ_mul_self (α : Fin 2) : barψ α * barψ α = 0 := ExteriorAlgebra.ι_sq_zero _ @[simp] lemma barψ_one_mul_barψ_zero_swap : barψ 1 * barψ 0 = - barψ 0 * barψ 1 := by rw [neg_mul, eq_neg_iff_add_eq_zero] @@ -115,14 +115,16 @@ lemma append_apply_three_eq : Fin.append ψ barψ 3 = barψ 1 := rfl ### A.2. Of a list -/ +/-- The term of the effective potential generated from a list + of `Fin 4`, which describe the components `[ψ 0, ψ 1, barψ 0, barψ 1]`. -/ def termOfList (l : List (Fin 4)) : EffectivePotential := (l.map (Fin.append ψ barψ)).prod @[simp] lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] -lemma termOfList_cons (l : List (Fin 4)) (i : Fin 4) : - termOfList (i :: l) = (Fin.append ψ barψ i) * termOfList l := by +lemma termOfList_cons (l : List (Fin 4)) (α : Fin 4) : + termOfList (α :: l) = (Fin.append ψ barψ α) * termOfList l := by simp only [termOfList, List.map_cons, List.prod_cons] /-! @@ -154,9 +156,10 @@ lemma basis_eq_termOfList (s : Finset (Fin 4)) : basis s = termOfList (s.sort ( simp [Finset.orderEmbOfFin_apply] /-! + ### A.4. The representation on the potential algebra --/ +-/ /-- The representation of the Lorentz group on `PotentialAlgebra`. -/ def rep : Representation ℂ SL(2, ℂ) EffectivePotential where @@ -182,7 +185,7 @@ lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : simp [rep] lemma rep_apply_ψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : - rep Λ (ψ i) = ∑ j, Λ⁻¹ i j • ψ j := by + rep Λ (ψ i) = ∑ (j : Fin 2), Λ⁻¹ i j • ψ j := by simp only [ψ, Basis.coe_dualBasis, LinearMap.coe_inl, rep_apply, Representation.dual_apply, ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, ← map_smul, Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, @@ -192,14 +195,14 @@ lemma rep_apply_ψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, -SpecialLinearGroup.coe_inv] -lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : - rep Λ (barψ i) = ∑ j, star (Λ⁻¹ i j) • barψ j := by +lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : + rep Λ (barψ α) = ∑ β, star (Λ⁻¹ α β) • barψ β := by simp only [barψ, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, Representation.dual_apply, ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, RCLike.star_def, ← map_smul, Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] refine LeftHandedWeyl.basis.conj.ext fun l => ?_ - fin_cases i <;> fin_cases l <;> + fin_cases α <;> fin_cases l <;> simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, -SpecialLinearGroup.coe_inv, Representation.conj_apply] @@ -210,9 +213,9 @@ lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List (Fin 4)) : | cons i l ih => simp [termOfList_cons, rep_mul, ih] -lemma rep_neg_apply_append (Λ : SL(2, ℂ)) (i : Fin 4) : - rep (- Λ) (Fin.append ψ barψ i) = (-1 : ℂ) • rep Λ (Fin.append ψ barψ i) := by - fin_cases i +lemma rep_neg_apply_append (Λ : SL(2, ℂ)) (α : Fin 4) : + rep (- Λ) (Fin.append ψ barψ α) = (-1 : ℂ) • rep Λ (Fin.append ψ barψ α) := by + fin_cases α all_goals simp [rep_apply_ψ_eq_sum, rep_apply_barψ_eq_sum] abel @@ -234,7 +237,6 @@ lemma rep_neg_apply_basis (s : Finset (Fin 4)) (Λ : SL(2, ℂ)) : -/ - /-- An effective potential is Lorentz invariant if it is stable under the action of the Lorentz group. -/ def IsInvariant (V : EffectivePotential) : Prop := ∀ Λ, rep Λ V = V @@ -309,7 +311,7 @@ lemma quartic_isInvariant : IsInvariant (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by -/ /-- If `V` is invariant, then all terms with an odd number of factors vanish. -/ -lemma even_of_isInvariant {V : EffectivePotential} {s : Finset (Fin 4)} (h : IsInvariant V) +lemma even_of_isInvariant {V : EffectivePotential} (s : Finset (Fin 4)) (h : IsInvariant V) (hs : Odd s.card) : basis.repr V s = 0 := by suffices h : basis.repr V s = (-1 : ℂ) ^ s.card * basis.repr V s by simpa [hs.neg_one_pow, CharZero.eq_neg_self_iff] using h @@ -371,12 +373,10 @@ lemma isInvariant_iff {V : EffectivePotential} : {0, 1, 2}, {0, 1, 3}, {0, 2, 3}, {1, 2, 3}, {0, 1, 2, 3}} by decide] repeat rw [Finset.sum_insert (by decide)] rw [Finset.sum_singleton] - rw [even_of_isInvariant (s := {0}) h (by decide), even_of_isInvariant (s := {1}) h (by decide), - even_of_isInvariant (s := {2}) h (by decide), even_of_isInvariant (s := {3}) h (by decide), - even_of_isInvariant (s := {0, 1, 2}) h (by decide), - even_of_isInvariant (s := {0, 1, 3}) h (by decide), - even_of_isInvariant (s := {0, 2, 3}) h (by decide), - even_of_isInvariant (s := {1, 2, 3}) h (by decide), + rw [even_of_isInvariant {0} h (by decide), even_of_isInvariant {1} h (by decide), + even_of_isInvariant {2} h (by decide), even_of_isInvariant {3} h (by decide), + even_of_isInvariant {0, 1, 2} h (by decide), even_of_isInvariant {0, 1, 3} h (by decide), + even_of_isInvariant {0, 2, 3} h (by decide), even_of_isInvariant {1, 2, 3} h (by decide), (zero_two_term_zero_of_isInvariant h).1, (zero_two_term_zero_of_isInvariant h).2.1, (zero_two_term_zero_of_isInvariant h).2.2.1, (zero_two_term_zero_of_isInvariant h).2.2.2] simp [add_assoc] From 75fa2260d5481f20de51fc8341ecf74129766fbe Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:24:53 +0100 Subject: [PATCH 024/254] feat: Add reality condition, --- Physlib/Mathematics/ConjModule.lean | 33 +++ .../PureFermionic/EffectivePotential.lean | 203 ++++++++++++++++++ 2 files changed, 236 insertions(+) diff --git a/Physlib/Mathematics/ConjModule.lean b/Physlib/Mathematics/ConjModule.lean index 109c4030a..0e1102274 100644 --- a/Physlib/Mathematics/ConjModule.lean +++ b/Physlib/Mathematics/ConjModule.lean @@ -53,6 +53,19 @@ conjugation ring endomorphism `starRingEnd k`. -/ instance instModule : Module k (ConjModule M) := Module.compHom M (starRingEnd k) +variable {A : Type*} [Ring A] + +instance : Ring (ConjModule A) := + let i1 : AddCommGroup (ConjModule A) := inferInstanceAs (AddCommGroup (ConjModule A)) + let i2 : Ring A := inferInstanceAs (Ring A) + { i1, i2 with } + +/-- The conjugate module of a `k`-algebra is a `k`-algebra: the same ring, with scalars +acting through `star`. -/ +instance instAlgebra [Algebra k A] : Algebra k (ConjModule A) := + Algebra.ofModule (fun r x y => smul_mul_assoc (β := A) (star r) x y) + (fun r x y => mul_smul_comm (β := A) (star r) x y) + end ConjModule /-- The canonical conjugate-linear equivalence `M ≃ₛₗ[starRingEnd k] ConjModule M`, the identity on @@ -65,6 +78,26 @@ def conjEquiv : M ≃ₛₗ[starRingEnd k] ConjModule M where left_inv _ := rfl right_inv _ := rfl +/-- The canonical conjugate-linear equivalence between the dual of a module `M` and + the dual of its conjugate. -/ +def conjDualEquiv : Module.Dual k M ≃ₛₗ[starRingEnd k] Module.Dual k (ConjModule M) where + toFun f := (starRingEnd k).toSemilinearMap.comp + (f.comp (conjEquiv (k := k) (M := M)).symm.toLinearMap) + invFun f := (starRingEnd k).toSemilinearMap.comp + (f.comp (conjEquiv (k := k) (M := M)).toLinearMap) + map_add' f g := by + ext x + simp + map_smul' r f := by + ext x + simp + left_inv f := by + ext x + simp + right_inv f := by + ext x + simp + namespace ConjModule /-- Conjugating twice returns the original module: the `k`-linear isomorphism diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index a8bdfe779..d5223472c 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -44,6 +44,11 @@ which is true to all orders. There is as of yet no reality condition on this potential. This is a TODO. +## References + +- https://physics.stackexchange.com/questions/506709 describes the mass term of a + Weyl fermion. + -/ @[expose] public section @@ -155,6 +160,8 @@ lemma basis_eq_termOfList (s : Finset (Fin 4)) : basis s = termOfList (s.sort ( refine congrArg List.prod (List.ext_getElem (by simp) fun i h1 h2 => ?_) simp [Finset.orderEmbOfFin_apply] +lemma basis_empty_eq_one : basis ∅ = 1 := by simp [basis_eq_termOfList] + /-! ### A.4. The representation on the potential algebra @@ -391,6 +398,202 @@ lemma isInvariant_iff {V : EffectivePotential} : apply_rules [IsInvariant.add, IsInvariant.smul, IsInvariant.one, ψ_zero_mul_ψ_one_isInvariant, barψ_zero_mul_barψ_one_isInvariant, quartic_isInvariant] +/-! + +## C. Coefficent list + +-/ + +/-- The coefficients of an effective potential relevant for invariant potentials, as a + linear map: the coefficients of `1`, `ψ 0 * ψ 1`, `barψ 0 * barψ 1` and + `ψ 0 * ψ 1 * barψ 0 * barψ 1`. -/ +def invCoeffList : EffectivePotential →ₗ[ℂ] (Fin 4 → ℂ) := + LinearMap.pi ![basis.coord ∅, basis.coord {0, 1}, basis.coord {2, 3}, basis.coord {0, 1, 2, 3}] + +@[simp] +lemma invCoeffList_one : invCoeffList 1 = ![1, 0, 0, 0] := by + rw [← basis_empty_eq_one] + ext i + fin_cases i <;> simp [invCoeffList] + +@[simp] +lemma invCoeffList_ψ_zero_mul_ψ_one : invCoeffList (ψ 0 * ψ 1) = ![0, 1, 0, 0] := by + trans invCoeffList (basis {0, 1}) + · congr + rw [basis, ExteriorAlgebra.basis_apply] + simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, + Finset.orderEmbOfFin_apply, Finset.sort_insert, ψ] + rfl + ext i + fin_cases i <;> simp [invCoeffList, Finsupp.single_apply] + · decide + · decide + +@[simp] +lemma invCoeffList_barψ_zero_mul_barψ_one : invCoeffList (barψ 0 * barψ 1) = ![0, 0, 1, 0] := by + trans invCoeffList (basis {2, 3}) + · congr + rw [basis, ExteriorAlgebra.basis_apply] + simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, Finset.orderEmbOfFin_apply, Finset.sort_insert, barψ] + rfl + ext i + fin_cases i <;> simp [invCoeffList, Finsupp.single_apply] + · decide + · decide + +@[simp] +lemma invCoeffList_quartic : invCoeffList (ψ 0 * ψ 1 * barψ 0 * barψ 1) = ![0, 0, 0, 1] := by + trans invCoeffList (basis {0, 1, 2, 3}) + · congr + rw [basis, ExteriorAlgebra.basis_apply]; + simp [ExteriorAlgebra.ιMulti_apply, + Set.powersetCard.ofFinEmbEquiv_symm_apply, Finset.orderEmbOfFin_apply, Finset.sort_insert, + ψ, barψ, mul_assoc]; + rfl + ext i + fin_cases i <;> simp [invCoeffList, Finsupp.single_apply] + · decide + · decide + +lemma invCoeffList_injective {V1 V2 : EffectivePotential} (h1 : IsInvariant V1) + (h2 : IsInvariant V2) (h : invCoeffList V1 = invCoeffList V2) : V1 = V2 := by + obtain ⟨c1, m11, m21, ρ1, rfl⟩ := isInvariant_iff.1 h1 + obtain ⟨c2, m12, m22, ρ2, rfl⟩ := isInvariant_iff.1 h2 + simp at h + rcases h with ⟨rfl, rfl, rfl, rfl⟩ + rfl + +/-! + +## D. Conjugation + +-/ + +/-- The conjugation operator on the effective potential. + This takes the complex conjugate of the coefficients, swaps the generators `ψ α` and `barψ α`, and reverses the order of products. -/ +def conjugate : EffectivePotential →ₛₗ[starRingEnd ℂ] EffectivePotential := + let conjSwap : + (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) + →ₛₗ[starRingEnd ℂ] + Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl) := + { toFun := Prod.map conjDualEquiv.symm conjDualEquiv ∘ Prod.swap + map_add' p q := by simp [Prod.ext_iff] + map_smul' c p := by simp [Prod.ext_iff, map_smulₛₗ]} + CliffordAlgebra.reverse.comp <| + (conjEquiv (k := ℂ)).symm.comp <| + (ExteriorAlgebra.lift ℂ + ⟨(conjEquiv (k := ℂ)).comp ((ExteriorAlgebra.ι ℂ).comp conjSwap), + fun v => ExteriorAlgebra.ι_sq_zero _⟩).toLinearMap + +lemma conjugate_eq_comp_algebra_map : ∃ (A: EffectivePotential →ₐ[ℂ] ConjModule EffectivePotential), + conjugate = CliffordAlgebra.reverse.comp ((conjEquiv (k := ℂ)).symm.comp A.toLinearMap) := by + let conjSwap : + (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) + →ₛₗ[starRingEnd ℂ] + Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl) := + { toFun := Prod.map conjDualEquiv.symm conjDualEquiv ∘ Prod.swap + map_add' p q := by simp [Prod.ext_iff] + map_smul' c p := by simp [Prod.ext_iff, map_smulₛₗ]} + use ExteriorAlgebra.lift ℂ + ⟨(conjEquiv (k := ℂ)).comp ((ExteriorAlgebra.ι ℂ).comp conjSwap), + fun v => ExteriorAlgebra.ι_sq_zero _⟩ + rfl + +lemma conjugate_apply_ι (v : Dual ℂ LeftHandedWeyl × Dual ℂ (ConjModule LeftHandedWeyl)) : + conjugate (ExteriorAlgebra.ι ℂ v) = + (CliffordAlgebra.reverse <| conjEquiv (k := ℂ) <| + ExteriorAlgebra.ι ℂ <| Prod.map conjDualEquiv.symm conjDualEquiv ∘ Prod.swap <| v) := by + simp [conjugate] + erw [AlgHom.toLinearMap_apply] + rw [ExteriorAlgebra.lift_ι_apply] + rfl + +@[simp] +lemma conjugate_one : conjugate 1 = 1 := by + simp [conjugate] + erw [AlgHom.toLinearMap_apply] + rw [map_one] + exact CliffordAlgebra.reverse.map_one + +@[simp] +lemma conjugate_algebraMap (c : ℂ) : conjugate (algebraMap ℂ EffectivePotential c) = + algebraMap ℂ EffectivePotential (starRingEnd ℂ c) := by + simp [Algebra.algebraMap_eq_smul_one] + +lemma conjugate_mul (V W : EffectivePotential) : + conjugate (V * W) = conjugate W * conjugate V := by + obtain ⟨A, hA⟩ := conjugate_eq_comp_algebra_map + simp [hA] + erw [AlgHom.coe_toLinearMap, AlgHom.toLinearMap_apply] + simp [conjEquiv] + erw [CliffordAlgebra.reverse.map_mul] + +@[simp] +lemma conjugate_conjugate (V : EffectivePotential) : conjugate (conjugate V) = V := by + induction' V using ExteriorAlgebra.induction with r v a b ha hb a b ha hb + · simp [conjugate_algebraMap] + · simp [conjugate_apply_ι, conjEquiv] + obtain ⟨fst, snd⟩ := v + simp_all only [Prod.swap_prod_mk, Prod.map_apply, LinearEquiv.symm_apply_apply, LinearEquiv.apply_symm_apply] + · simp [conjugate_mul, ha, hb] + · simp [ha, hb] + +lemma conjugate_injective : Function.Injective conjugate := by + intro V W h + have h' : conjugate (conjugate V) = conjugate (conjugate W) := by rw [h] + simp only [conjugate_conjugate] at h' + exact h' + +@[simp] +lemma conjugate_ψ (α : Fin 2) : conjugate (ψ α) = barψ α := by + simp [ψ, conjugate_apply_ι] + trans CliffordAlgebra.reverse (barψ α) + · congr 1 + simp only [conjEquiv, LinearEquiv.coe_mk, LinearMap.coe_mk, AddHom.coe_mk, barψ, + Basis.coe_dualBasis, LinearMap.coe_inr, ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] + rfl + simp [barψ] + +@[simp] +lemma conjugate_barψ (α : Fin 2) : conjugate (barψ α) = ψ α := by + apply conjugate_injective + simp [conjugate_ψ] + +/-! + +## E. Reality condition + +-/ + +/-- The effective potential is real if it is equal to its conjugate. -/ +def IsReal (V : EffectivePotential) : Prop := conjugate V = V + +lemma isReal_iff {V : EffectivePotential} : IsReal V ↔ conjugate V = V := by rfl + +/-- The necessary and sufficent condition for a real potential to be + invariant under the Lorentz group. -/ +lemma isInvariant_iff_of_isReal {V : EffectivePotential} (h : IsReal V) : + IsInvariant V ↔ ∃ (c : ℝ), ∃ (m : ℂ), ∃ (ρ : ℝ), V = + c • 1 + m • ψ 0 * ψ 1 - star m • barψ 0 * barψ 1 + ρ • (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by + rw [isInvariant_iff] + constructor + · rintro ⟨c, m1, m2, ρ, rfl⟩ + simp [isReal_iff, conjugate_mul, ← mul_assoc] at h + have h1 := congrArg invCoeffList h + simp at h1 + rcases h1 with ⟨h1, h2, rfl, h3⟩ + use c.re, m1, ρ.re + have hc : c = (c.re : ℂ) := by rw [← propext (re_eq_ofReal_of_isSelfAdjoint h1)] + have hρ : ρ = (ρ.re : ℂ) := by rw [← propext (re_eq_ofReal_of_isSelfAdjoint h3)] + rw [hc, hρ] + simp only [coe_smul, Fin.isValue, neg_smul, ofReal_re, Algebra.smul_mul_assoc, RCLike.star_def, + add_left_inj] + abel + · rintro ⟨c, m1, ρ, rfl⟩ + use c, m1, -star m1, ρ + simp + abel + end EffectivePotential end From 7e0c4af54b1894192e85963e412bfda823d7f70a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:30:33 +0100 Subject: [PATCH 025/254] lemma: Add some small results --- .../PureFermionic/EffectivePotential.lean | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index d5223472c..ed76ac00a 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -9,6 +9,7 @@ public import Physlib.Relativity.Fermions.Weyl.Metric public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Mathematics.ConjModule +public import Mathlib.RingTheory.GradedAlgebra.Basic /-! # The effective potential for a left-handed Weyl fermion @@ -162,6 +163,30 @@ lemma basis_eq_termOfList (s : Finset (Fin 4)) : basis s = termOfList (s.sort ( lemma basis_empty_eq_one : basis ∅ = 1 := by simp [basis_eq_termOfList] +lemma ψ_zero_eq_basis : ψ 0 = basis {0} := by + rw [basis, ExteriorAlgebra.basis_apply] + simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, + Finset.orderEmbOfFin_apply, ψ] + rfl + +lemma ψ_one_eq_basis : ψ 1 = basis {1} := by + rw [basis, ExteriorAlgebra.basis_apply] + simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, + Finset.orderEmbOfFin_apply, ψ] + rfl + +lemma barψ_zero_eq_basis : barψ 0 = basis {2} := by + rw [basis, ExteriorAlgebra.basis_apply] + simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, + Finset.orderEmbOfFin_apply, barψ] + rfl + +lemma barψ_one_eq_basis : barψ 1 = basis {3} := by + rw [basis, ExteriorAlgebra.basis_apply] + simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, + Finset.orderEmbOfFin_apply, barψ] + rfl + /-! ### A.4. The representation on the potential algebra @@ -434,7 +459,8 @@ lemma invCoeffList_barψ_zero_mul_barψ_one : invCoeffList (barψ 0 * barψ 1) = trans invCoeffList (basis {2, 3}) · congr rw [basis, ExteriorAlgebra.basis_apply] - simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, Finset.orderEmbOfFin_apply, Finset.sort_insert, barψ] + simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, + Finset.orderEmbOfFin_apply, Finset.sort_insert, barψ] rfl ext i fin_cases i <;> simp [invCoeffList, Finsupp.single_apply] @@ -470,7 +496,8 @@ lemma invCoeffList_injective {V1 V2 : EffectivePotential} (h1 : IsInvariant V1) -/ /-- The conjugation operator on the effective potential. - This takes the complex conjugate of the coefficients, swaps the generators `ψ α` and `barψ α`, and reverses the order of products. -/ + This takes the complex conjugate of the coefficients, swaps the generators `ψ α` and `barψ α`, + and reverses the order of products. -/ def conjugate : EffectivePotential →ₛₗ[starRingEnd ℂ] EffectivePotential := let conjSwap : (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) @@ -534,7 +561,8 @@ lemma conjugate_conjugate (V : EffectivePotential) : conjugate (conjugate V) = V · simp [conjugate_algebraMap] · simp [conjugate_apply_ι, conjEquiv] obtain ⟨fst, snd⟩ := v - simp_all only [Prod.swap_prod_mk, Prod.map_apply, LinearEquiv.symm_apply_apply, LinearEquiv.apply_symm_apply] + simp_all only [Prod.swap_prod_mk, Prod.map_apply, LinearEquiv.symm_apply_apply, + LinearEquiv.apply_symm_apply] · simp [conjugate_mul, ha, hb] · simp [ha, hb] From b30f9092e8e59edf437b4e1718e012728f5578fe Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 15 Jul 2026 11:09:34 +0100 Subject: [PATCH 026/254] Update EffectivePotential.lean --- .../PureFermionic/EffectivePotential.lean | 363 +++++++++++++++--- 1 file changed, 299 insertions(+), 64 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index ed76ac00a..3fd708c8d 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -38,13 +38,11 @@ so we could equivalently define the effective potential as `ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl)`. We have done the former here as it generalises to other cases. -On `PotentialAlgebra` we define a representation of the Lorentz group, and prove that that +On `EffectivePotential` we define a representation of the Lorentz group, and prove that that if the potential is invariant under the Lorentz group it must be of the form `c + m1 * ψ 0 * ψ 1 + m2 * barψ 0 * barψ 1 + λ * ψ 0 * ψ 1 * barψ 0 * barψ 1`, which is true to all orders. -There is as of yet no reality condition on this potential. This is a TODO. - ## References - https://physics.stackexchange.com/questions/506709 describes the mass term of a @@ -65,7 +63,7 @@ open CategoryTheory.MonoidalCategory /-! -## A. The Potential algebra for Weyl fermions +## A. The effective potential for Weyl fermions -/ @@ -76,6 +74,110 @@ abbrev EffectivePotential : Type := ExteriorAlgebra ℂ namespace EffectivePotential +/-! + +### A. The representation on the effective potential + +-/ + +/-- The representation of the Lorentz group (here `SL(2, ℂ)`) on `EffectivePotential`. -/ +def rep : Representation ℂ SL(2, ℂ) EffectivePotential where + toFun Λ := (ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap + (LeftHandedWeyl.rep.conj.dual Λ))).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, LinearMap.prodMap_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← LinearMap.prodMap_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma rep_apply (Λ : SL(2, ℂ)) (V : EffectivePotential) : + rep Λ V = ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap + (LeftHandedWeyl.rep.conj.dual Λ)) V := rfl + +@[simp] +lemma rep_apply_one (Λ : SL(2, ℂ)) : rep Λ 1 = 1 := by + simp [rep_apply] + +lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : + rep Λ (V * W) = rep Λ V * rep Λ W:= by + simp [rep] + +end EffectivePotential + +/-! + +### B. Field specification for the theory + +-/ + +inductive FieldSpecification : Type + | ψ (α : Fin 2) : FieldSpecification + | barψ (α : Fin 2) : FieldSpecification +deriving DecidableEq, Fintype + +namespace FieldSpecification + +open EffectivePotential + +def toEffectivePotential : FieldSpecification → EffectivePotential + | ψ (α : Fin 2) => + (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) + | barψ (α : Fin 2) => + (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) + +scoped notation "[" v "]ₑ" => toEffectivePotential v + +lemma toEffectivePotential_eq_ι : + (ψ : FieldSpecification) → ∃ v, [ψ]ₑ = ExteriorAlgebra.ι ℂ v + | ψ α => ⟨(LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)), by rfl⟩ + | barψ α => ⟨(LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)), by rfl⟩ + +lemma toEffectivePotential_ψ_eq (α : Fin 2) : [ψ α]ₑ = + ExteriorAlgebra.ι ℂ (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) := by rfl + +lemma toEffectivePotential_barψ_eq (α : Fin 2) : [barψ α]ₑ = + ExteriorAlgebra.ι ℂ (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) := by rfl + +@[simp] +lemma toEffectivePotential_mul_self (ψ : FieldSpecification) : [ψ]ₑ * [ψ]ₑ = 0 := by + obtain ⟨v, hv⟩ := toEffectivePotential_eq_ι ψ + simp [hv] + +lemma toEffectivePotential_mul_anti_commute (ψ χ : FieldSpecification) : + [ψ]ₑ * [χ]ₑ = - [χ]ₑ * [ψ]ₑ := by + obtain ⟨v, hv⟩ := toEffectivePotential_eq_ι ψ + obtain ⟨w, hw⟩ := toEffectivePotential_eq_ι χ + simp [hv, hw, neg_mul, eq_neg_iff_add_eq_zero] + +lemma rep_apply_toEffectivePotential_ψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : + rep Λ [ψ α]ₑ = ∑ (β : Fin 2), Λ⁻¹ α β • [ψ β]ₑ := by + simp only [toEffectivePotential_ψ_eq, Basis.coe_dualBasis, LinearMap.coe_inl, rep_apply, + Representation.dual_apply, ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, + ← map_smul, Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, + add_zero, ExteriorAlgebra.ι_inj, Prod.mk.injEq, and_true] + refine LeftHandedWeyl.basis.ext fun l => ?_ + fin_cases α <;> fin_cases l <;> + simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, + -SpecialLinearGroup.coe_inv] + +lemma rep_apply_toEffectivePotential_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : + rep Λ [barψ α]ₑ = ∑ β, star (Λ⁻¹ α β) • [barψ β]ₑ := by + simp only [toEffectivePotential_barψ_eq, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, Representation.dual_apply, + ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, RCLike.star_def, ← map_smul, + Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, + ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] + refine LeftHandedWeyl.basis.conj.ext fun l => ?_ + fin_cases α <;> fin_cases l <;> + simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, + -SpecialLinearGroup.coe_inv, Representation.conj_apply] + +end FieldSpecification + +namespace EffectivePotential + + + /-! ### A.1. The coordinate elements of the potential algebra @@ -104,17 +206,44 @@ def barψ (α : Fin 2) : EffectivePotential := rw [neg_mul, eq_neg_iff_add_eq_zero] exact ExteriorAlgebra.ι_add_mul_swap _ _ +abbrev ψbarψ : Fin 4 → EffectivePotential := Fin.append ψ barψ + +@[simp] +lemma ψbarψ_zero_eq_ψ_zero : ψbarψ 0 = ψ 0 := rfl + +@[simp] +lemma ψbarψ_one_eq_ψ_one : ψbarψ 1 = ψ 1 := rfl + @[simp] -lemma append_apply_zero_eq : Fin.append ψ barψ 0 = ψ 0 := rfl +lemma ψbarψ_two_eq_barψ_zero : ψbarψ 2 = barψ 0 := rfl @[simp] -lemma append_apply_one_eq : Fin.append ψ barψ 1 = ψ 1 := rfl +lemma ψbarψ_three_eq_barψ_one : ψbarψ 3 = barψ 1 := rfl @[simp] -lemma append_apply_two_eq : Fin.append ψ barψ 2 = barψ 0 := rfl +lemma ψbarψ_mul_self (α : Fin 4) : ψbarψ α * ψbarψ α = 0 := by + fin_cases α + · exact ψ_mul_self 0 + · exact ψ_mul_self 1 + · exact barψ_mul_self 0 + · exact barψ_mul_self 1 + +lemma ψbarψ_swap (α β : Fin 4) : ψbarψ α * ψbarψ β = - ψbarψ β * ψbarψ α := by + fin_cases α <;> fin_cases β <;> + simp [ψbarψ, neg_mul, eq_neg_iff_add_eq_zero] + <;> exact ExteriorAlgebra.ι_add_mul_swap _ _ @[simp] -lemma append_apply_three_eq : Fin.append ψ barψ 3 = barψ 1 := rfl +lemma ψbarψ_apply_zero_eq : ψbarψ 0 = ψ 0 := rfl + +@[simp] +lemma ψbarψ_apply_one_eq : ψbarψ 1 = ψ 1 := rfl + +@[simp] +lemma ψbarψ_apply_two_eq : ψbarψ 2 = barψ 0 := rfl + +@[simp] +lemma ψbarψ_apply_three_eq : ψbarψ 3 = barψ 1 := rfl /-! @@ -124,15 +253,40 @@ lemma append_apply_three_eq : Fin.append ψ barψ 3 = barψ 1 := rfl /-- The term of the effective potential generated from a list of `Fin 4`, which describe the components `[ψ 0, ψ 1, barψ 0, barψ 1]`. -/ def termOfList (l : List (Fin 4)) : EffectivePotential := - (l.map (Fin.append ψ barψ)).prod + (l.map ψbarψ).prod @[simp] lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] lemma termOfList_cons (l : List (Fin 4)) (α : Fin 4) : - termOfList (α :: l) = (Fin.append ψ barψ α) * termOfList l := by + termOfList (α :: l) = ψbarψ α * termOfList l := by simp only [termOfList, List.map_cons, List.prod_cons] +lemma termOfList_append (l₁ l₂ : List (Fin 4)) : + termOfList (l₁ ++ l₂) = termOfList l₁ * termOfList l₂ := by + simp [termOfList] + +lemma ψbarψ_mul_termOfList_mem (α : Fin 4) (l : List (Fin 4)) (h : α ∈ l) : + ψbarψ α * termOfList l = 0 := by + induction l with + | nil => simp at h + | cons β t ih => + rcases List.mem_cons.mp h with rfl | ha + · simp [termOfList_cons, ← mul_assoc] + · simp [termOfList_cons, ← mul_assoc, ψbarψ_swap α β] + simp [mul_assoc, ih ha] + +lemma termOfList_zero_of_not_nodup (l : List (Fin 4)) (h : ¬ l.Nodup) : + termOfList l = 0 := by + revert h + induction l with + | nil => intro h; exact absurd List.nodup_nil h + | cons a t ih => + intro h + rw [termOfList_cons] + by_cases hmem : a ∈ t + · exact ψbarψ_mul_termOfList_mem a t hmem + · rw [ih fun hn => h (List.nodup_cons.mpr ⟨hmem, hn⟩), mul_zero] /-! ### A.3. Basis @@ -187,45 +341,7 @@ lemma barψ_one_eq_basis : barψ 1 = basis {3} := by Finset.orderEmbOfFin_apply, barψ] rfl -/-! - -### A.4. The representation on the potential algebra - --/ - -/-- The representation of the Lorentz group on `PotentialAlgebra`. -/ -def rep : Representation ℂ SL(2, ℂ) EffectivePotential where - toFun Λ := (ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap - (LeftHandedWeyl.rep.conj.dual Λ))).toLinearMap - map_one' := by - simp only [map_one, End.one_eq_id, LinearMap.prodMap_id, ExteriorAlgebra.map_id, - AlgHom.toLinearMap_id] - map_mul' Λ1 Λ2 := by - simp only [map_mul, End.mul_eq_comp, ← LinearMap.prodMap_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - -lemma rep_apply (Λ : SL(2, ℂ)) (V : EffectivePotential) : - rep Λ V = ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap - (LeftHandedWeyl.rep.conj.dual Λ)) V := rfl -@[simp] -lemma rep_apply_one (Λ : SL(2, ℂ)) : rep Λ 1 = 1 := by - simp [rep_apply] - -lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : - rep Λ (V * W) = rep Λ V * rep Λ W:= by - simp [rep] - -lemma rep_apply_ψ_eq_sum (Λ : SL(2, ℂ)) (i : Fin 2) : - rep Λ (ψ i) = ∑ (j : Fin 2), Λ⁻¹ i j • ψ j := by - simp only [ψ, Basis.coe_dualBasis, LinearMap.coe_inl, rep_apply, Representation.dual_apply, - ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, ← map_smul, Prod.smul_mk, - smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, - ExteriorAlgebra.ι_inj, Prod.mk.injEq, and_true] - refine LeftHandedWeyl.basis.ext fun l => ?_ - fin_cases i <;> fin_cases l <;> - simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, - -SpecialLinearGroup.coe_inv] lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : rep Λ (barψ α) = ∑ β, star (Λ⁻¹ α β) • barψ β := by @@ -263,6 +379,139 @@ lemma rep_neg_apply_basis (s : Finset (Fin 4)) (Λ : SL(2, ℂ)) : rep (- Λ) (basis s) = (-1 : ℂ) ^ s.card • rep Λ (basis s) := by simp [basis_eq_termOfList, rep_neg_apply_termOfList] +lemma rep_diagonal_apply_append (α : Fin 4) (c : ℂˣ) : + rep ⟨diagonal ![c, c⁻¹], by simp⟩ (Fin.append ψ barψ α) = + (![(c⁻¹).1, c.1, starRingEnd ℂ (c⁻¹).1, starRingEnd ℂ c] α) • Fin.append ψ barψ α := by + fin_cases α <;> simp [rep_apply_ψ_eq_sum, rep_apply_barψ_eq_sum, Finset.univ_fin2] + all_goals simp [Finset.pair_comm] + +lemma rep_diagonal_apply_termOfList (l : List (Fin 4)) (c : ℂˣ) : + rep ⟨diagonal ![c, c⁻¹], by simp⟩ (termOfList l) = + ((l.map (![(c⁻¹).1, c.1, starRingEnd ℂ (c⁻¹).1, starRingEnd ℂ c])).prod) • termOfList l := by + induction l with + | nil => simp + | cons i l ih => + simp [termOfList_cons, rep_mul, ih, rep_diagonal_apply_append, smul_smul, mul_comm] + +lemma rep_diagonal_apply_basis (s : Finset (Fin 4)) (c : ℂˣ) : + rep ⟨diagonal ![c, c⁻¹], by simp⟩ (basis s) = + (∏ i ∈ s, (![(c⁻¹).1, c.1, starRingEnd ℂ (c⁻¹).1, starRingEnd ℂ c] i)) • basis s := by + rw [basis_eq_termOfList, rep_diagonal_apply_termOfList, ← Finset.prod_map_toList _, + ((Finset.sort_perm_toList _ fun x1 x2 => x1 ≤ x2).map _).prod_eq] + +/-! + +### A.5. Multidegrees + +Since ψ fields rotate among themselves under the action of the Lorentz group, +and barψ fields rotate among themselves, it is natural to decompose +the effective potential into submodules which have a fixed number of ψ and barψ +fields appearing in them. The submodules are closed under the action of the +Lorentz group. + +-/ + +def FieldSpecification.ofIndex : Fin 4 → FieldSpecification + | 0 => FieldSpecification.ψ + | 1 => FieldSpecification.ψ + | 2 => FieldSpecification.barψ + | 3 => FieldSpecification.barψ + +/-- The submodules of `EffectivePotential` which have a fixed number of + `ψ` and `barψ` fields appearing in them. -/ +def multiDegreeSubmodule (d : Multiset FieldSpecification) : Submodule ℂ EffectivePotential := + Submodule.span ℂ {V | ∃ s : Finset (Fin 4), + (↑(s.val.map FieldSpecification.ofIndex) : Multiset FieldSpecification) = d ∧ basis s = V} + +lemma basis_mem_multiDegreeSubmodule (s : Finset (Fin 4)) : + basis s ∈ multiDegreeSubmodule ↑(s.val.map FieldSpecification.ofIndex) := + Submodule.subset_span ⟨s, rfl, rfl⟩ + +lemma termOfList_mem_multiDegreeSubmodule (l : List (Fin 4)) : + termOfList l ∈ multiDegreeSubmodule ↑(l.map FieldSpecification.ofIndex) := + Submodule.subset_span ⟨l.toFinset, by simp [Multiset.coe_toFinset, Multiset.map_map], by + simp [basis_eq_termOfList]⟩ +lemma one_mem_multiDegreeSubmodule_zero : (1 : EffectivePotential) ∈ multiDegreeSubmodule 0 := + Submodule.subset_span ⟨∅, rfl, by simp [basis_empty_eq_one]⟩ + +lemma append_mem_multiDegreeSubmodule (α : Fin 4) : + Fin.append ψ barψ α ∈ multiDegreeSubmodule {FieldSpecification.ofIndex α} := + Submodule.subset_span ⟨{α}, rfl, by + fin_cases α <;> + simp [ψ_zero_eq_basis, barψ_zero_eq_basis, ψ_one_eq_basis, barψ_one_eq_basis]⟩ + +lemma ψ_mem_multiDegreeSubmodule (i : Fin 2) : + ψ i ∈ multiDegreeSubmodule {FieldSpecification.ψ} := by + fin_cases i + · exact append_mem_multiDegreeSubmodule 0 + · exact append_mem_multiDegreeSubmodule 1 + +lemma barψ_mem_multiDegreeSubmodule (i : Fin 2) : + barψ i ∈ multiDegreeSubmodule {FieldSpecification.barψ} := by + fin_cases i + · exact append_mem_multiDegreeSubmodule 2 + · exact append_mem_multiDegreeSubmodule 3 + +lemma rep_basis_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (s : Finset (Fin 4)) : + rep Λ (basis s) ∈ multiDegreeSubmodule ↑(s.val.map FieldSpecification.ofIndex) := by + sorry + +/-! + +### A.6. Stability of multidegrees under the group action + +-/ + +lemma rep_ψ_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (i : Fin 2) : + rep Λ (ψ i) ∈ multiDegreeSubmodule {FieldSpecification.ψ} := by + rw [rep_apply_ψ_eq_sum] + exact Submodule.sum_mem _ fun j _ => + Submodule.smul_mem _ _ (ψ_mem_multiDegreeSubmodule j) + +lemma rep_barψ_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (i : Fin 2) : + rep Λ (barψ i) ∈ multiDegreeSubmodule {FieldSpecification.barψ} := by + rw [rep_apply_barψ_eq_sum] + exact Submodule.sum_mem _ fun j _ => + Submodule.smul_mem _ _ (barψ_mem_multiDegreeSubmodule j) + +lemma rep_append_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (α : Fin 4) : + rep Λ (Fin.append ψ barψ α) ∈ multiDegreeSubmodule {FieldSpecification.ofIndex α} := + match α with + | 0 => rep_ψ_mem_multiDegreeSubmodule Λ 0 + | 1 => rep_ψ_mem_multiDegreeSubmodule Λ 1 + | 2 => rep_barψ_mem_multiDegreeSubmodule Λ 0 + | 3 => rep_barψ_mem_multiDegreeSubmodule Λ 1 + +lemma rep_termOfList_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (l : List (Fin 4)) : + rep Λ (termOfList l) ∈ multiDegreeSubmodule ↑(l.map FieldSpecification.ofIndex) := by + induction l with + | nil => simpa using one_mem_multiDegreeSubmodule_zero + | cons α l ih => + rw [termOfList_cons, rep_mul] + simpa [Multiset.singleton_add] using + mul_mem_multiDegreeSubmodule (rep_append_mem_multiDegreeSubmodule Λ α) ih + +/-- The multidegree submodules are stable under the action of the Lorentz group. -/ +lemma rep_mem_multiDegreeSubmodule {d : Multiset FieldSpecification} (Λ : SL(2, ℂ)) + {V : EffectivePotential} (hV : V ∈ multiDegreeSubmodule d) : + rep Λ V ∈ multiDegreeSubmodule d := by + induction hV using Submodule.span_induction with + | mem x hx => + obtain ⟨l, hl, rfl⟩ := hx + exact hl ▸ rep_termOfList_mem_multiDegreeSubmodule Λ l + | zero => simp + | add a b _ _ ha hb => rw [map_add]; exact add_mem ha hb + | smul c a _ ha => rw [map_smul]; exact Submodule.smul_mem _ _ ha + +/-- The multidegree submodules are sent to themselves under the action + of the Lorentz group. -/ +lemma multiDegreeSubmodule_map_rep (Λ : SL(2, ℂ)) (d : Multiset FieldSpecification) : + (multiDegreeSubmodule d).map (rep Λ) = multiDegreeSubmodule d := by + refine le_antisymm (Submodule.map_le_iff_le_comap.2 fun V hV => + rep_mem_multiDegreeSubmodule Λ hV) fun V hV => ?_ + refine ⟨rep Λ⁻¹ V, rep_mem_multiDegreeSubmodule Λ⁻¹ hV, ?_⟩ + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] + /-! ## B. Invariance under the Lorentz group @@ -376,22 +625,8 @@ lemma zero_two_term_zero_of_isInvariant {V : EffectivePotential} (h : IsInvarian simp [Λ_basis, Finsupp.single_apply, smul_smul, mul_comm, Finset.prod_pair hab] by_contra hne exact hd (mul_right_cancel₀ hne (by linear_combination -h1)) - suffices Λ_termOfList : ∀ (l : List (Fin 4)), - rep Λ (termOfList l) = (l.map d).prod • termOfList l by - intro t - rw [basis_eq_termOfList, Λ_termOfList, ← Finset.prod_map_toList t, - ((Finset.sort_perm_toList t fun x1 x2 => x1 ≤ x2).map d).prod_eq] - suffices Λ_append : ∀ (i : Fin 4), rep Λ (Fin.append ψ barψ i) = d i • Fin.append ψ barψ i by - intro l - induction l with - | nil => simp - | cons i l ih => simp [termOfList_cons, rep_mul, ih, Λ_append, smul_smul, mul_comm] - intro i - fin_cases i - all_goals - simp [rep_apply_ψ_eq_sum, rep_apply_barψ_eq_sum, d, adjugate_fin_two, Λ, - neg_smul, Complex.conj_ofNat] - try module + sorry + lemma isInvariant_iff {V : EffectivePotential} : IsInvariant V ↔ ∃ (c m1 m2 ρ : ℂ), V = c • 1 + m1 • (ψ 0 * ψ 1) + m2 • (barψ 0 * barψ 1) + From 294cbf02418c068a1ba0046c17429ca9e5cee784 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 15 Jul 2026 15:52:34 +0100 Subject: [PATCH 027/254] feat: Updated, but not complete --- .../PureFermionic/EffectivePotential.lean | 412 +++++++++++++++++- 1 file changed, 395 insertions(+), 17 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index 3fd708c8d..4bc6eb8b2 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -114,41 +114,56 @@ end EffectivePotential inductive FieldSpecification : Type | ψ (α : Fin 2) : FieldSpecification | barψ (α : Fin 2) : FieldSpecification -deriving DecidableEq, Fintype +deriving DecidableEq namespace FieldSpecification open EffectivePotential -def toEffectivePotential : FieldSpecification → EffectivePotential - | ψ (α : Fin 2) => - (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) - | barψ (α : Fin 2) => - (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) +instance : Fintype FieldSpecification where + elems := {ψ 0, ψ 1, barψ 0, barψ 1} + complete := by + intro x + match x with + | ψ 0 => simp + | ψ 1 => simp + | barψ 0 => simp + | barψ 1 => simp + +def toSumFin : FieldSpecification ≃ Fin 2 ⊕ Fin 2 where + toFun := fun | .ψ (α : Fin 2) => Sum.inl α | .barψ α => Sum.inr α + invFun := fun | .inl α => ψ α | .inr α => barψ α + left_inv ψ := by + fin_cases ψ <;> simp + right_inv x := by fin_cases x <;> simp + +def moduleBasis : Basis FieldSpecification ℂ + (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) := + (LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex toSumFin.symm + +def toEffectivePotential (ψ : FieldSpecification) : EffectivePotential := + ExteriorAlgebra.ι ℂ (moduleBasis ψ) scoped notation "[" v "]ₑ" => toEffectivePotential v -lemma toEffectivePotential_eq_ι : - (ψ : FieldSpecification) → ∃ v, [ψ]ₑ = ExteriorAlgebra.ι ℂ v - | ψ α => ⟨(LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)), by rfl⟩ - | barψ α => ⟨(LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)), by rfl⟩ +lemma toEffectivePotential_eq (ψ : FieldSpecification) : + toEffectivePotential ψ = ExteriorAlgebra.ι ℂ (moduleBasis ψ) := rfl lemma toEffectivePotential_ψ_eq (α : Fin 2) : [ψ α]ₑ = - ExteriorAlgebra.ι ℂ (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) := by rfl + ExteriorAlgebra.ι ℂ (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) := by + fin_cases α <;> simp [toEffectivePotential_eq, moduleBasis, toSumFin] lemma toEffectivePotential_barψ_eq (α : Fin 2) : [barψ α]ₑ = - ExteriorAlgebra.ι ℂ (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) := by rfl + ExteriorAlgebra.ι ℂ (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) := by + fin_cases α <;> simp [toEffectivePotential_eq, moduleBasis, toSumFin] @[simp] lemma toEffectivePotential_mul_self (ψ : FieldSpecification) : [ψ]ₑ * [ψ]ₑ = 0 := by - obtain ⟨v, hv⟩ := toEffectivePotential_eq_ι ψ - simp [hv] + simp [toEffectivePotential_eq] lemma toEffectivePotential_mul_anti_commute (ψ χ : FieldSpecification) : [ψ]ₑ * [χ]ₑ = - [χ]ₑ * [ψ]ₑ := by - obtain ⟨v, hv⟩ := toEffectivePotential_eq_ι ψ - obtain ⟨w, hw⟩ := toEffectivePotential_eq_ι χ - simp [hv, hw, neg_mul, eq_neg_iff_add_eq_zero] + simp [toEffectivePotential_eq, neg_mul, eq_neg_iff_add_eq_zero] lemma rep_apply_toEffectivePotential_ψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : rep Λ [ψ α]ₑ = ∑ (β : Fin 2), Λ⁻¹ α β • [ψ β]ₑ := by @@ -176,6 +191,369 @@ end FieldSpecification namespace EffectivePotential +open FieldSpecification + +/-! + +## Elements from a list of FieldSpecifications +-/ + +def termOfList (l : List FieldSpecification) : EffectivePotential := + (l.map toEffectivePotential).prod + +lemma termOfList_cons (ψ : FieldSpecification) (l : List FieldSpecification) : + termOfList (ψ :: l) = [ψ]ₑ * termOfList l := by simp [termOfList] + +@[simp] +lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] + +lemma termOfList_singleton (ψ : FieldSpecification) : termOfList [ψ] = [ψ]ₑ := by + simp [termOfList_cons] + +lemma termOfList_append (l1 l2 : List FieldSpecification) : + termOfList (l1 ++ l2) = termOfList l1 * termOfList l2 := by + simp [termOfList] + +lemma mul_termOfList_of_mem (ψ : FieldSpecification) (l : List FieldSpecification) + (hψ : ψ ∈ l) : [ψ]ₑ * termOfList l = 0 := by + induction l with + | nil => simp at hψ + | cons β t ih => + rcases List.mem_cons.mp hψ with rfl | ha + · simp [termOfList_cons, ← mul_assoc] + · simp [termOfList_cons, ← mul_assoc, toEffectivePotential_mul_anti_commute ψ β] + simp [mul_assoc, ih ha] + +lemma termOfList_zero_of_not_nodup (l : List FieldSpecification) (h : ¬ l.Nodup) : + termOfList l = 0 := by + revert h + induction l with + | nil => intro h; exact absurd List.nodup_nil h + | cons a t ih => + intro h + rw [termOfList_cons] + by_cases hmem : a ∈ t + · exact mul_termOfList_of_mem a t hmem + · rw [ih fun hn => h (List.nodup_cons.mpr ⟨hmem, hn⟩), mul_zero] + +lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List FieldSpecification) : + rep Λ (termOfList l) = ((l.map toEffectivePotential).map (rep Λ)).prod := by + induction l with + | nil => simp + | cons i l ih => + simp [termOfList_cons, rep_mul, ih] + +lemma mem_termOfList_span (V : EffectivePotential) : + V ∈ Submodule.span ℂ (Set.range termOfList) := by + induction V using ExteriorAlgebra.induction with + | algebraMap r => + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], termOfList_nil⟩) + | ι v => + rw [← Basis.sum_repr moduleBasis v, map_sum] + refine Submodule.sum_mem _ fun f _ => ?_ + rw [map_smul] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[f], by simp [termOfList_singleton]; rfl⟩) + | mul a b ha hb => + induction ha using Submodule.span_induction with + | mem x hx => + obtain ⟨l1, rfl⟩ := hx + induction hb using Submodule.span_induction with + | mem y hy => + obtain ⟨l2, rfl⟩ := hy + exact Submodule.subset_span ⟨l1 ++ l2, termOfList_append l1 l2⟩ + | zero => simp + | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz + | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy + | zero => simp + | add x y _ _ hx hy => rw [add_mul]; exact add_mem hx hy + | smul c x _ hx => rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ hx + | add a b ha hb => exact add_mem ha hb + +lemma termOfList_perm {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : + ∃ c : ℂ, termOfList l1 = c • termOfList l2 := by + induction h with + | nil => exact ⟨1, by simp⟩ + | cons x _ ih => + obtain ⟨c, hc⟩ := ih + exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc, mul_smul_comm]⟩ + | swap x y l => + refine ⟨-1, ?_⟩ + rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc, + toEffectivePotential_mul_anti_commute y x] + simp [mul_assoc] + | trans _ _ ih1 ih2 => + obtain ⟨c1, hc1⟩ := ih1 + obtain ⟨c2, hc2⟩ := ih2 + exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul]⟩ + +lemma termOfList_eq_ιMulti (l : List FieldSpecification) : + termOfList l = ExteriorAlgebra.ιMulti ℂ l.length (fun i => moduleBasis (l.get i)) := by + induction l with + | nil => simp + | cons ψ l h => + simp [termOfList_cons, h] + rfl + +lemma termOfList_ofFn {n : ℕ} (g : Fin n → FieldSpecification) : + termOfList (List.ofFn g) = ExteriorAlgebra.ιMulti ℂ n (fun i => moduleBasis (g i)) := by + rw [ExteriorAlgebra.ιMulti_apply, termOfList, List.map_ofFn] + rfl + +/-! + +## Construction of a term from a tuple + +-/ + +def termOfTuple {n} (g : Fin n → FieldSpecification) : EffectivePotential := + termOfList (List.ofFn g) + +lemma termOfTuple_eq_ιMulti {n} (g : Fin n → FieldSpecification) : + termOfTuple g = ExteriorAlgebra.ιMulti ℂ n (fun i => moduleBasis (g i)) := by + rw [termOfTuple, termOfList_ofFn] + +lemma termOfTuple_perm {n} (g : Fin n → FieldSpecification) {i j : Fin n} (hij : i ≠ j) : + termOfTuple (g ∘ Equiv.swap i j) = - termOfTuple g := by + rw [termOfTuple_eq_ιMulti, termOfTuple_eq_ιMulti] + exact AlternatingMap.map_swap (ExteriorAlgebra.ιMulti ℂ n) (fun k => moduleBasis (g k)) hij + + +def termOfVectTuple {n} : + AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) + EffectivePotential (Fin n) := ExteriorAlgebra.ιMulti ℂ n + +def coeffOfVectorTuple (s : Multiset FieldSpecification) (n : ℕ) : + AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) + EffectivePotential (Fin n) where + toMultilinearMap := + ∑ g : Fin n → FieldSpecification, + if Multiset.ofList (List.ofFn g) = s then + (LinearMap.toSpanSingleton ℂ EffectivePotential (termOfTuple g)).compMultilinearMap + ((MultilinearMap.mkPiAlgebra ℂ (Fin n) ℂ).compLinearMap fun i => moduleBasis.coord (g i)) + else 0 + map_eq_zero_of_eq' := by + sorry + +def coeff (s : Multiset FieldSpecification) : EffectivePotential →ₗ[ℂ] EffectivePotential := + ExteriorAlgebra.liftAlternating (coeffOfVectorTuple s) + +/-! + +## Submodules + +Without choosing an ordering on FieldSpecification we cannot +write down a basis of EffectivePotential. However, what we +can do it split EffectivePotential into submodules of dimension 1. +These submodules are determined by the set of field components which +appear in them. + +We will define the projection of an element in the effective +potential onto these submodules, and show that two elements of +the effective potential are equal if and only if all their projections +onto these submodules are equal. + +These are in general not invariant under the group action. +-/ + + +def SubmoduleOfSet (s : Multiset FieldSpecification) : Submodule ℂ EffectivePotential := + Submodule.span ℂ {V | ∃ (l : List FieldSpecification), Multiset.ofList l = s ∧ V = termOfList l} + +lemma termOfList_mem_submoduleOfSet (l : List FieldSpecification) : + termOfList l ∈ SubmoduleOfSet (Multiset.ofList l) := + Submodule.subset_span ⟨l, rfl, rfl⟩ + +lemma multiset_ofList_ofFn_comp_perm {n : ℕ} (g : Fin n → FieldSpecification) + (σ : Equiv.Perm (Fin n)) : + Multiset.ofList (List.ofFn (g ∘ σ)) = Multiset.ofList (List.ofFn g) := by + have hperm : (List.ofFn (⇑σ)).Perm (List.ofFn (id : Fin n → Fin n)) := + List.perm_of_nodup_nodup_toFinset_eq + (List.nodup_ofFn.mpr σ.injective) (List.nodup_ofFn.mpr fun _ _ h => h) + (by + ext k + simp only [List.mem_toFinset, List.mem_ofFn] + exact ⟨fun _ => ⟨k, rfl⟩, fun _ => ⟨σ.symm k, σ.apply_symm_apply k⟩⟩) + calc Multiset.ofList (List.ofFn (g ∘ σ)) + = Multiset.ofList ((List.ofFn (⇑σ)).map g) := by rw [List.map_ofFn] + _ = Multiset.ofList ((List.ofFn (id : Fin n → Fin n)).map g) := + Multiset.coe_eq_coe.2 (hperm.map g) + _ = Multiset.ofList (List.ofFn g) := by rw [List.map_ofFn]; rfl + +/-- The value of the projection onto `SubmoduleOfSet s` on a tuple of field specifications: + the term of the tuple if its multiset is `s`, and zero otherwise. -/ +def SubmoduleOfSet.tupleValue (s : Multiset FieldSpecification) {n : ℕ} + (g : Fin n → FieldSpecification) : SubmoduleOfSet s := + if h : Multiset.ofList (List.ofFn g) = s then + ⟨termOfList (List.ofFn g), h ▸ termOfList_mem_submoduleOfSet (List.ofFn g)⟩ else 0 + +lemma SubmoduleOfSet.tupleValue_comp_swap (s : Multiset FieldSpecification) {n : ℕ} + (g : Fin n → FieldSpecification) {i j : Fin n} (hij : i ≠ j) : + SubmoduleOfSet.tupleValue s (g ∘ Equiv.swap i j) = - SubmoduleOfSet.tupleValue s g := by + rw [SubmoduleOfSet.tupleValue, SubmoduleOfSet.tupleValue] + by_cases h : Multiset.ofList (List.ofFn g) = s + · rw [dif_pos h, dif_pos (by rw [multiset_ofList_ofFn_comp_perm]; exact h)] + apply Subtype.ext + show termOfList (List.ofFn (g ∘ Equiv.swap i j)) = -termOfList (List.ofFn g) + rw [termOfList_ofFn, termOfList_ofFn] + exact AlternatingMap.map_swap (ExteriorAlgebra.ιMulti ℂ n) + (fun k => moduleBasis (g k)) hij + · rw [dif_neg h, dif_neg (by rw [multiset_ofList_ofFn_comp_perm]; exact h), neg_zero] + +/-- The multilinear map underlying the projection onto `SubmoduleOfSet s` in degree `n`: + each tuple of vectors is expanded in `moduleBasis` and the coefficients of tuples of + field specifications with multiset `s` are collected. -/ +def SubmoduleOfSet.projMultilinear (s : Multiset FieldSpecification) (n : ℕ) : + MultilinearMap ℂ + (fun _ : Fin n => Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) + (SubmoduleOfSet s) := + ∑ g : Fin n → FieldSpecification, + (LinearMap.toSpanSingleton ℂ (SubmoduleOfSet s) + (SubmoduleOfSet.tupleValue s g)).compMultilinearMap + ((MultilinearMap.mkPiAlgebra ℂ (Fin n) ℂ).compLinearMap fun i => moduleBasis.coord (g i)) + +lemma SubmoduleOfSet.projMultilinear_apply_basis (s : Multiset FieldSpecification) {n : ℕ} + (v : Fin n → FieldSpecification) : + SubmoduleOfSet.projMultilinear s n (fun i => moduleBasis (v i)) = + SubmoduleOfSet.tupleValue s v := by + rw [SubmoduleOfSet.projMultilinear, MultilinearMap.sum_apply] + simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, + MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply] + rw [Finset.sum_eq_single_of_mem v (Finset.mem_univ v)] + · have h1 : (∏ i, moduleBasis.coord (v i) (moduleBasis (v i))) = 1 := by + simp [Basis.coord_apply, Basis.repr_self] + rw [h1, one_smul] + · intro g _ hgv + obtain ⟨k, hk⟩ : ∃ k, g k ≠ v k := by + by_contra hcon + push Not at hcon + exact hgv (funext hcon) + have hzero : moduleBasis.coord (g k) (moduleBasis (v k)) = 0 := by + rw [Basis.coord_apply, Basis.repr_self, Finsupp.single_apply, if_neg (Ne.symm hk)] + rw [Finset.prod_eq_zero (Finset.mem_univ k) hzero, zero_smul] + +lemma SubmoduleOfSet.projMultilinear_map_eq_zero (s : Multiset FieldSpecification) {n : ℕ} + (v : Fin n → Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) + {i j : Fin n} (hv : v i = v j) (hij : i ≠ j) : + SubmoduleOfSet.projMultilinear s n v = 0 := by + have hvswap : ∀ k, v (Equiv.swap i j k) = v k := by + intro k + rcases eq_or_ne k i with rfl | hki + · rw [Equiv.swap_apply_left]; exact hv.symm + rcases eq_or_ne k j with rfl | hkj + · rw [Equiv.swap_apply_right]; exact hv + · rw [Equiv.swap_apply_of_ne_of_ne hki hkj] + have hinv : Function.Involutive + (fun g : Fin n → FieldSpecification => g ∘ ⇑(Equiv.swap i j)) := fun g => by + funext k + simp [Function.comp_apply, Equiv.swap_apply_self] + rw [SubmoduleOfSet.projMultilinear, MultilinearMap.sum_apply] + simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, + MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply] + set S := ∑ g : Fin n → FieldSpecification, + (∏ k, moduleBasis.coord (g k) (v k)) • SubmoduleOfSet.tupleValue s g with hS + have hre : S = ∑ g : Fin n → FieldSpecification, + (∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k)) • + SubmoduleOfSet.tupleValue s (g ∘ Equiv.swap i j) := by + rw [hS] + refine Fintype.sum_equiv (Function.Involutive.toPerm _ hinv) _ _ fun g => ?_ + rw [Function.Involutive.coe_toPerm] + rw [show (g ∘ ⇑(Equiv.swap i j)) ∘ ⇑(Equiv.swap i j) = g from hinv g] + have hpair : ∀ g : Fin n → FieldSpecification, + (∏ k, moduleBasis.coord (g k) (v k)) • SubmoduleOfSet.tupleValue s g + + (∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k)) • + SubmoduleOfSet.tupleValue s (g ∘ Equiv.swap i j) = 0 := by + intro g + have hcoef : (∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k)) = + ∏ k, moduleBasis.coord (g k) (v k) := by + calc ∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k) + = ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v (Equiv.swap i j k)) := + Finset.prod_congr rfl fun k _ => by rw [Function.comp_apply, hvswap] + _ = ∏ k, moduleBasis.coord (g k) (v k) := + Equiv.prod_comp (Equiv.swap i j) (fun k => moduleBasis.coord (g k) (v k)) + rw [hcoef, SubmoduleOfSet.tupleValue_comp_swap s g hij, smul_neg, add_neg_cancel] + have hSS : S + S = 0 := by + nth_rewrite 2 [hre] + rw [hS, ← Finset.sum_add_distrib] + exact Finset.sum_eq_zero fun g _ => hpair g + have h2 : (2 : ℂ) • S = 0 := by rw [two_smul]; exact hSS + have h3 : ((2 : ℂ)⁻¹ * 2) • S = 0 := by rw [mul_smul, h2, smul_zero] + rwa [show ((2 : ℂ)⁻¹ * 2) = 1 by norm_num, one_smul] at h3 + +/-- The alternating map underlying the projection onto `SubmoduleOfSet s` in degree `n`. -/ +def SubmoduleOfSet.projAlternating (s : Multiset FieldSpecification) (n : ℕ) : + (Module.Dual ℂ LeftHandedWeyl × + Module.Dual ℂ (ConjModule LeftHandedWeyl)) [⋀^Fin n]→ₗ[ℂ] SubmoduleOfSet s := + { SubmoduleOfSet.projMultilinear s n with + map_eq_zero_of_eq' := fun v _ _ hv hij => + SubmoduleOfSet.projMultilinear_map_eq_zero s v hv hij } + +lemma SubmoduleOfSet.projAlternating_apply (s : Multiset FieldSpecification) (n : ℕ) + (v : Fin n → Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) : + SubmoduleOfSet.projAlternating s n v = SubmoduleOfSet.projMultilinear s n v := rfl + +def SubmoduleOfSet.proj (s : Multiset FieldSpecification) : + EffectivePotential →ₗ[ℂ] SubmoduleOfSet s := + ExteriorAlgebra.liftAlternating (SubmoduleOfSet.projAlternating s) + +lemma SubmoduleOfSet.proj_apply_termOfList (s : Multiset FieldSpecification) + (l : List FieldSpecification) : + (SubmoduleOfSet.proj s (termOfList l) : EffectivePotential) = + if Multiset.ofList l = s then termOfList l else 0 := by + conv_lhs => rw [termOfList_eq_ιMulti] + rw [SubmoduleOfSet.proj, ExteriorAlgebra.liftAlternating_apply_ιMulti, + SubmoduleOfSet.projAlternating_apply, SubmoduleOfSet.projMultilinear_apply_basis] + simp only [SubmoduleOfSet.tupleValue, List.ofFn_get] + split_ifs with h + · rfl + · rfl + + +/-! + +## Gradings + +-/ + +variable {M : Type} [AddCommMonoid M] + + +def GradedSubmodule (g : FieldSpecification → M) (a : M) : Submodule ℂ EffectivePotential := + Submodule.span ℂ {V | ∃ (l : List FieldSpecification), (l.map g).sum = a ∧ V = termOfList l} + +lemma termOfList_mem_gradedSubmodule (g : FieldSpecification → M) (l : List FieldSpecification) : + termOfList l ∈ GradedSubmodule g ((l.map g).sum) := + Submodule.subset_span ⟨l, rfl, rfl⟩ + +lemma toEffectivePotential_mem_gradedSubmodule (g : FieldSpecification → M) + (f : FieldSpecification) : [f]ₑ ∈ GradedSubmodule g (g f) := by + simpa [termOfList_singleton] using termOfList_mem_gradedSubmodule g [f] + + +/-! + +## The irrep grading + +-/ + +def irrepGrading : FieldSpecification → ℤ × ℤ + | ψ _ => (1, 0) + | barψ _ => (0, 1) + +/-! + +## Mass dimension grading + +-/ + +def massDimGrading : FieldSpecification → ℚ := fun _ => 3/2 + + +/-! + +## Below here is old and WIP + +-/ /-! From 3826db6c3300fa9e3c51d30882f60f813e0ebddc Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 16 Jul 2026 08:32:26 +0100 Subject: [PATCH 028/254] feat: Add coeff --- .../PureFermionic/EffectivePotential.lean | 99 ++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index 4bc6eb8b2..2ca317a9a 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -130,6 +130,17 @@ instance : Fintype FieldSpecification where | barψ 0 => simp | barψ 1 => simp +/-! + +## Ordering on FieldSpecification + +We define an ordering on `FieldSpecification`. +This ordering is a choice, and nothing physical can depend on this choice. +We however make it as it simplifies the proofs of lots of lemmas, and +makes it easy to do more calculational aspects. + +-/ + def toSumFin : FieldSpecification ≃ Fin 2 ⊕ Fin 2 where toFun := fun | .ψ (α : Fin 2) => Sum.inl α | .barψ α => Sum.inr α invFun := fun | .inl α => ψ α | .inr α => barψ α @@ -137,6 +148,7 @@ def toSumFin : FieldSpecification ≃ Fin 2 ⊕ Fin 2 where fin_cases ψ <;> simp right_inv x := by fin_cases x <;> simp + def moduleBasis : Basis FieldSpecification ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) := (LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex toSumFin.symm @@ -333,11 +345,96 @@ def coeffOfVectorTuple (s : Multiset FieldSpecification) (n : ℕ) : ((MultilinearMap.mkPiAlgebra ℂ (Fin n) ℂ).compLinearMap fun i => moduleBasis.coord (g i)) else 0 map_eq_zero_of_eq' := by - sorry + intro v i j hv hij + have hvswap : ∀ k, v (Equiv.swap i j k) = v k := by + intro k + rcases eq_or_ne k i with rfl | hki + · rw [Equiv.swap_apply_left]; exact hv.symm + rcases eq_or_ne k j with rfl | hkj + · rw [Equiv.swap_apply_right]; exact hv + · rw [Equiv.swap_apply_of_ne_of_ne hki hkj] + simp only [MultilinearMap.toFun_eq_coe, MultilinearMap.sum_apply] + refine Finset.sum_involution (fun g _ => g ∘ Equiv.swap i j) ?_ ?_ + (fun g _ => Finset.mem_univ _) ?_ + · intro g _ + have hms : Multiset.ofList (List.ofFn (g ∘ Equiv.swap i j)) = + Multiset.ofList (List.ofFn g) := + Multiset.coe_eq_coe.mpr ((Equiv.swap i j).ofFn_comp_perm g) + rw [hms] + split_ifs with h + · simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, + MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply, + Function.comp_apply] + have hprod : ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v k) = + ∏ k, moduleBasis.coord (g k) (v k) := + calc ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v k) + = ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v (Equiv.swap i j k)) := + Finset.prod_congr rfl fun k _ => by rw [hvswap k] + _ = ∏ k, moduleBasis.coord (g k) (v k) := + Equiv.prod_comp (Equiv.swap i j) fun k => moduleBasis.coord (g k) (v k) + rw [hprod, termOfTuple_perm g hij, smul_neg, add_neg_cancel] + · simp + · intro g _ hfg hcontra + apply hfg + have hgji : g j = g i := by + simpa [Equiv.swap_apply_left] using congrFun hcontra i + have hterm : termOfTuple g = 0 := by + rw [termOfTuple_eq_ιMulti] + exact AlternatingMap.map_eq_zero_of_eq _ _ (by rw [hgji]) hij + split_ifs + · simp [hterm] + · simp + · intro g _ + funext k + simp [Function.comp, Equiv.swap_apply_self] def coeff (s : Multiset FieldSpecification) : EffectivePotential →ₗ[ℂ] EffectivePotential := ExteriorAlgebra.liftAlternating (coeffOfVectorTuple s) +lemma coeff_apply_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) : + coeff s (termOfList l) = if Multiset.ofList l = s then termOfList l else 0 := by + have hterm : termOfTuple l.get = termOfList l := by rw [termOfTuple, List.ofFn_get] + rw [coeff, termOfList_eq_ιMulti, ExteriorAlgebra.liftAlternating_apply_ιMulti] + simp only [coeffOfVectorTuple, AlternatingMap.coe_mk, MultilinearMap.sum_apply] + refine (Finset.sum_eq_single l.get ?_ ?_).trans ?_ + · intro g _ hg + obtain ⟨i, hi⟩ := Function.ne_iff.mp hg + split_ifs with h + · simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, + MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply] + have hzero : ∏ k, moduleBasis.coord (g k) (moduleBasis (l.get k)) = 0 := + Finset.prod_eq_zero (Finset.mem_univ i) (by + rw [Basis.coord_apply, Basis.repr_self, Finsupp.single_eq_of_ne hi]) + rw [hzero, zero_smul] + · simp + · intro h + exact absurd (Finset.mem_univ _) h + · rw [List.ofFn_get] + split_ifs with h + · simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, + MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply, hterm] + have hprod : ∏ i, moduleBasis.coord (l.get i) (moduleBasis (l.get i)) = 1 := by simp + rw [hprod, one_smul] + exact termOfList_eq_ιMulti l + · simp + +lemma coeff_eq_zero_of_dup (s : Multiset FieldSpecification) (h : ¬ s.Nodup) + (V : EffectivePotential) : coeff s V = 0 := by + have hzero : coeffOfVectorTuple s = 0 := by + funext n + ext v + simp only [coeffOfVectorTuple, AlternatingMap.coe_mk, MultilinearMap.sum_apply] + refine Finset.sum_eq_zero fun g _ => ?_ + split_ifs with hs + · obtain ⟨i, j, hgij, hij⟩ := Function.not_injective_iff.mp fun hinj => + h (hs ▸ Multiset.coe_nodup.mpr (List.nodup_ofFn.mpr hinj)) + have hterm : termOfTuple g = 0 := by + rw [termOfTuple_eq_ιMulti] + exact AlternatingMap.map_eq_zero_of_eq _ _ (by rw [hgij]) hij + simp [hterm] + · simp + rw [coeff, hzero, map_zero, LinearMap.zero_apply] + /-! ## Submodules From ad55f01ae4b38bce39ac44f06b6ce5fc8fc43866 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:03:45 +0100 Subject: [PATCH 029/254] feat: UPdate with projections --- .../PureFermionic/EffectivePotential.lean | 1067 +++-------------- 1 file changed, 180 insertions(+), 887 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index 2ca317a9a..5cddef1b3 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -103,6 +103,39 @@ lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : rep Λ (V * W) = rep Λ V * rep Λ W:= by simp [rep] + +/-! + +## The invariance condition on + +-/ + +/-- An effective potential is Lorentz invariant if it is stable under the + action of the Lorentz group. -/ +def IsInvariant (V : EffectivePotential) : Prop := ∀ Λ, rep Λ V = V + +lemma IsInvariant.eq_iff {V : EffectivePotential} : + IsInvariant V ↔ ∀ Λ, rep Λ V = V := by rfl + +lemma IsInvariant.add {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V + W) := by + intro Λ + simp_all [IsInvariant.eq_iff] + +lemma IsInvariant.smul {V : EffectivePotential} (hV : IsInvariant V) (c : ℂ) : + IsInvariant (c • V) := by + intro Λ + simp_all [IsInvariant.eq_iff] + +lemma IsInvariant.mul {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V * W) := by + intro Λ + simp_all [IsInvariant.eq_iff, rep_mul] + +lemma IsInvariant.one : IsInvariant 1 := by + intro Λ + simp [rep] + end EffectivePotential /-! @@ -199,6 +232,31 @@ lemma rep_apply_toEffectivePotential_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, -SpecialLinearGroup.coe_inv, Representation.conj_apply] +/-! + +## The irreps + +-/ + +inductive Irrep + | ψ + | barψ +deriving DecidableEq, Fintype + +def toIrrep : FieldSpecification → Irrep + | .ψ _ => .ψ + | .barψ _ => .barψ + +/-! + +## Mass dimension + +-/ + +def massDimension : FieldSpecification → ℕ + | .ψ _ => 3 / 2 + | .barψ _ => 3 / 2 + end FieldSpecification namespace EffectivePotential @@ -388,6 +446,18 @@ def coeffOfVectorTuple (s : Multiset FieldSpecification) (n : ℕ) : funext k simp [Function.comp, Equiv.swap_apply_self] +/-! + +## Coefficents + +We can't define a basis on effective potential without choosing and ordering on the field +specification. To get around this, we can define the coefficient of an effective potential given a +multi-set of field specifications as a linear map which projects down onto a subspace spanned by +terms which are of the correct type. It actually projects down onto a one-dimensional subspace, and +this is where you can think of it as a coefficient. + +-/ + def coeff (s : Multiset FieldSpecification) : EffectivePotential →ₗ[ℂ] EffectivePotential := ExteriorAlgebra.liftAlternating (coeffOfVectorTuple s) @@ -418,919 +488,142 @@ lemma coeff_apply_termOfList (s : Multiset FieldSpecification) (l : List FieldSp exact termOfList_eq_ιMulti l · simp -lemma coeff_eq_zero_of_dup (s : Multiset FieldSpecification) (h : ¬ s.Nodup) - (V : EffectivePotential) : coeff s V = 0 := by - have hzero : coeffOfVectorTuple s = 0 := by - funext n - ext v - simp only [coeffOfVectorTuple, AlternatingMap.coe_mk, MultilinearMap.sum_apply] - refine Finset.sum_eq_zero fun g _ => ?_ - split_ifs with hs - · obtain ⟨i, j, hgij, hij⟩ := Function.not_injective_iff.mp fun hinj => - h (hs ▸ Multiset.coe_nodup.mpr (List.nodup_ofFn.mpr hinj)) - have hterm : termOfTuple g = 0 := by - rw [termOfTuple_eq_ιMulti] - exact AlternatingMap.map_eq_zero_of_eq _ _ (by rw [hgij]) hij - simp [hterm] - · simp - rw [coeff, hzero, map_zero, LinearMap.zero_apply] - -/-! - -## Submodules - -Without choosing an ordering on FieldSpecification we cannot -write down a basis of EffectivePotential. However, what we -can do it split EffectivePotential into submodules of dimension 1. -These submodules are determined by the set of field components which -appear in them. - -We will define the projection of an element in the effective -potential onto these submodules, and show that two elements of -the effective potential are equal if and only if all their projections -onto these submodules are equal. - -These are in general not invariant under the group action. --/ - - -def SubmoduleOfSet (s : Multiset FieldSpecification) : Submodule ℂ EffectivePotential := - Submodule.span ℂ {V | ∃ (l : List FieldSpecification), Multiset.ofList l = s ∧ V = termOfList l} - -lemma termOfList_mem_submoduleOfSet (l : List FieldSpecification) : - termOfList l ∈ SubmoduleOfSet (Multiset.ofList l) := - Submodule.subset_span ⟨l, rfl, rfl⟩ - -lemma multiset_ofList_ofFn_comp_perm {n : ℕ} (g : Fin n → FieldSpecification) - (σ : Equiv.Perm (Fin n)) : - Multiset.ofList (List.ofFn (g ∘ σ)) = Multiset.ofList (List.ofFn g) := by - have hperm : (List.ofFn (⇑σ)).Perm (List.ofFn (id : Fin n → Fin n)) := - List.perm_of_nodup_nodup_toFinset_eq - (List.nodup_ofFn.mpr σ.injective) (List.nodup_ofFn.mpr fun _ _ h => h) - (by - ext k - simp only [List.mem_toFinset, List.mem_ofFn] - exact ⟨fun _ => ⟨k, rfl⟩, fun _ => ⟨σ.symm k, σ.apply_symm_apply k⟩⟩) - calc Multiset.ofList (List.ofFn (g ∘ σ)) - = Multiset.ofList ((List.ofFn (⇑σ)).map g) := by rw [List.map_ofFn] - _ = Multiset.ofList ((List.ofFn (id : Fin n → Fin n)).map g) := - Multiset.coe_eq_coe.2 (hperm.map g) - _ = Multiset.ofList (List.ofFn g) := by rw [List.map_ofFn]; rfl - -/-- The value of the projection onto `SubmoduleOfSet s` on a tuple of field specifications: - the term of the tuple if its multiset is `s`, and zero otherwise. -/ -def SubmoduleOfSet.tupleValue (s : Multiset FieldSpecification) {n : ℕ} - (g : Fin n → FieldSpecification) : SubmoduleOfSet s := - if h : Multiset.ofList (List.ofFn g) = s then - ⟨termOfList (List.ofFn g), h ▸ termOfList_mem_submoduleOfSet (List.ofFn g)⟩ else 0 - -lemma SubmoduleOfSet.tupleValue_comp_swap (s : Multiset FieldSpecification) {n : ℕ} - (g : Fin n → FieldSpecification) {i j : Fin n} (hij : i ≠ j) : - SubmoduleOfSet.tupleValue s (g ∘ Equiv.swap i j) = - SubmoduleOfSet.tupleValue s g := by - rw [SubmoduleOfSet.tupleValue, SubmoduleOfSet.tupleValue] - by_cases h : Multiset.ofList (List.ofFn g) = s - · rw [dif_pos h, dif_pos (by rw [multiset_ofList_ofFn_comp_perm]; exact h)] - apply Subtype.ext - show termOfList (List.ofFn (g ∘ Equiv.swap i j)) = -termOfList (List.ofFn g) - rw [termOfList_ofFn, termOfList_ofFn] - exact AlternatingMap.map_swap (ExteriorAlgebra.ιMulti ℂ n) - (fun k => moduleBasis (g k)) hij - · rw [dif_neg h, dif_neg (by rw [multiset_ofList_ofFn_comp_perm]; exact h), neg_zero] - -/-- The multilinear map underlying the projection onto `SubmoduleOfSet s` in degree `n`: - each tuple of vectors is expanded in `moduleBasis` and the coefficients of tuples of - field specifications with multiset `s` are collected. -/ -def SubmoduleOfSet.projMultilinear (s : Multiset FieldSpecification) (n : ℕ) : - MultilinearMap ℂ - (fun _ : Fin n => Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - (SubmoduleOfSet s) := - ∑ g : Fin n → FieldSpecification, - (LinearMap.toSpanSingleton ℂ (SubmoduleOfSet s) - (SubmoduleOfSet.tupleValue s g)).compMultilinearMap - ((MultilinearMap.mkPiAlgebra ℂ (Fin n) ℂ).compLinearMap fun i => moduleBasis.coord (g i)) - -lemma SubmoduleOfSet.projMultilinear_apply_basis (s : Multiset FieldSpecification) {n : ℕ} - (v : Fin n → FieldSpecification) : - SubmoduleOfSet.projMultilinear s n (fun i => moduleBasis (v i)) = - SubmoduleOfSet.tupleValue s v := by - rw [SubmoduleOfSet.projMultilinear, MultilinearMap.sum_apply] - simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, - MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply] - rw [Finset.sum_eq_single_of_mem v (Finset.mem_univ v)] - · have h1 : (∏ i, moduleBasis.coord (v i) (moduleBasis (v i))) = 1 := by - simp [Basis.coord_apply, Basis.repr_self] - rw [h1, one_smul] - · intro g _ hgv - obtain ⟨k, hk⟩ : ∃ k, g k ≠ v k := by - by_contra hcon - push Not at hcon - exact hgv (funext hcon) - have hzero : moduleBasis.coord (g k) (moduleBasis (v k)) = 0 := by - rw [Basis.coord_apply, Basis.repr_self, Finsupp.single_apply, if_neg (Ne.symm hk)] - rw [Finset.prod_eq_zero (Finset.mem_univ k) hzero, zero_smul] - -lemma SubmoduleOfSet.projMultilinear_map_eq_zero (s : Multiset FieldSpecification) {n : ℕ} - (v : Fin n → Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - {i j : Fin n} (hv : v i = v j) (hij : i ≠ j) : - SubmoduleOfSet.projMultilinear s n v = 0 := by - have hvswap : ∀ k, v (Equiv.swap i j k) = v k := by - intro k - rcases eq_or_ne k i with rfl | hki - · rw [Equiv.swap_apply_left]; exact hv.symm - rcases eq_or_ne k j with rfl | hkj - · rw [Equiv.swap_apply_right]; exact hv - · rw [Equiv.swap_apply_of_ne_of_ne hki hkj] - have hinv : Function.Involutive - (fun g : Fin n → FieldSpecification => g ∘ ⇑(Equiv.swap i j)) := fun g => by - funext k - simp [Function.comp_apply, Equiv.swap_apply_self] - rw [SubmoduleOfSet.projMultilinear, MultilinearMap.sum_apply] - simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, - MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply] - set S := ∑ g : Fin n → FieldSpecification, - (∏ k, moduleBasis.coord (g k) (v k)) • SubmoduleOfSet.tupleValue s g with hS - have hre : S = ∑ g : Fin n → FieldSpecification, - (∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k)) • - SubmoduleOfSet.tupleValue s (g ∘ Equiv.swap i j) := by - rw [hS] - refine Fintype.sum_equiv (Function.Involutive.toPerm _ hinv) _ _ fun g => ?_ - rw [Function.Involutive.coe_toPerm] - rw [show (g ∘ ⇑(Equiv.swap i j)) ∘ ⇑(Equiv.swap i j) = g from hinv g] - have hpair : ∀ g : Fin n → FieldSpecification, - (∏ k, moduleBasis.coord (g k) (v k)) • SubmoduleOfSet.tupleValue s g + - (∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k)) • - SubmoduleOfSet.tupleValue s (g ∘ Equiv.swap i j) = 0 := by - intro g - have hcoef : (∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k)) = - ∏ k, moduleBasis.coord (g k) (v k) := by - calc ∏ k, moduleBasis.coord ((g ∘ Equiv.swap i j) k) (v k) - = ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v (Equiv.swap i j k)) := - Finset.prod_congr rfl fun k _ => by rw [Function.comp_apply, hvswap] - _ = ∏ k, moduleBasis.coord (g k) (v k) := - Equiv.prod_comp (Equiv.swap i j) (fun k => moduleBasis.coord (g k) (v k)) - rw [hcoef, SubmoduleOfSet.tupleValue_comp_swap s g hij, smul_neg, add_neg_cancel] - have hSS : S + S = 0 := by - nth_rewrite 2 [hre] - rw [hS, ← Finset.sum_add_distrib] - exact Finset.sum_eq_zero fun g _ => hpair g - have h2 : (2 : ℂ) • S = 0 := by rw [two_smul]; exact hSS - have h3 : ((2 : ℂ)⁻¹ * 2) • S = 0 := by rw [mul_smul, h2, smul_zero] - rwa [show ((2 : ℂ)⁻¹ * 2) = 1 by norm_num, one_smul] at h3 - -/-- The alternating map underlying the projection onto `SubmoduleOfSet s` in degree `n`. -/ -def SubmoduleOfSet.projAlternating (s : Multiset FieldSpecification) (n : ℕ) : - (Module.Dual ℂ LeftHandedWeyl × - Module.Dual ℂ (ConjModule LeftHandedWeyl)) [⋀^Fin n]→ₗ[ℂ] SubmoduleOfSet s := - { SubmoduleOfSet.projMultilinear s n with - map_eq_zero_of_eq' := fun v _ _ hv hij => - SubmoduleOfSet.projMultilinear_map_eq_zero s v hv hij } - -lemma SubmoduleOfSet.projAlternating_apply (s : Multiset FieldSpecification) (n : ℕ) - (v : Fin n → Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) : - SubmoduleOfSet.projAlternating s n v = SubmoduleOfSet.projMultilinear s n v := rfl - -def SubmoduleOfSet.proj (s : Multiset FieldSpecification) : - EffectivePotential →ₗ[ℂ] SubmoduleOfSet s := - ExteriorAlgebra.liftAlternating (SubmoduleOfSet.projAlternating s) - -lemma SubmoduleOfSet.proj_apply_termOfList (s : Multiset FieldSpecification) - (l : List FieldSpecification) : - (SubmoduleOfSet.proj s (termOfList l) : EffectivePotential) = - if Multiset.ofList l = s then termOfList l else 0 := by - conv_lhs => rw [termOfList_eq_ιMulti] - rw [SubmoduleOfSet.proj, ExteriorAlgebra.liftAlternating_apply_ιMulti, - SubmoduleOfSet.projAlternating_apply, SubmoduleOfSet.projMultilinear_apply_basis] - simp only [SubmoduleOfSet.tupleValue, List.ofFn_get] - split_ifs with h - · rfl - · rfl - - -/-! - -## Gradings - --/ - -variable {M : Type} [AddCommMonoid M] - - -def GradedSubmodule (g : FieldSpecification → M) (a : M) : Submodule ℂ EffectivePotential := - Submodule.span ℂ {V | ∃ (l : List FieldSpecification), (l.map g).sum = a ∧ V = termOfList l} - -lemma termOfList_mem_gradedSubmodule (g : FieldSpecification → M) (l : List FieldSpecification) : - termOfList l ∈ GradedSubmodule g ((l.map g).sum) := - Submodule.subset_span ⟨l, rfl, rfl⟩ - -lemma toEffectivePotential_mem_gradedSubmodule (g : FieldSpecification → M) - (f : FieldSpecification) : [f]ₑ ∈ GradedSubmodule g (g f) := by - simpa [termOfList_singleton] using termOfList_mem_gradedSubmodule g [f] - - -/-! - -## The irrep grading - --/ - -def irrepGrading : FieldSpecification → ℤ × ℤ - | ψ _ => (1, 0) - | barψ _ => (0, 1) - -/-! - -## Mass dimension grading - --/ - -def massDimGrading : FieldSpecification → ℚ := fun _ => 3/2 - - -/-! - -## Below here is old and WIP - --/ - - -/-! - -### A.1. The coordinate elements of the potential algebra - --/ - -/-- The coordinate element corresponding to the i-th basis vector as a member - of the effective potential. -/ -def ψ (α : Fin 2) : EffectivePotential := - (ExteriorAlgebra.ι ℂ) (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) - -/-- The coordinate element corresponding to the conjugate i-th basis vector as a member - of the effective potential. -/ -def barψ (α : Fin 2) : EffectivePotential := - (ExteriorAlgebra.ι ℂ) (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) - -@[simp] lemma ψ_mul_self (α : Fin 2) : ψ α * ψ α = 0 := ExteriorAlgebra.ι_sq_zero _ - -@[simp] lemma ψ_one_mul_ψ_zero_swap : ψ 1 * ψ 0 = - ψ 0 * ψ 1 := by - rw [neg_mul, eq_neg_iff_add_eq_zero] - exact ExteriorAlgebra.ι_add_mul_swap _ _ - -@[simp] lemma barψ_mul_self (α : Fin 2) : barψ α * barψ α = 0 := ExteriorAlgebra.ι_sq_zero _ - -@[simp] lemma barψ_one_mul_barψ_zero_swap : barψ 1 * barψ 0 = - barψ 0 * barψ 1 := by - rw [neg_mul, eq_neg_iff_add_eq_zero] - exact ExteriorAlgebra.ι_add_mul_swap _ _ - -abbrev ψbarψ : Fin 4 → EffectivePotential := Fin.append ψ barψ - -@[simp] -lemma ψbarψ_zero_eq_ψ_zero : ψbarψ 0 = ψ 0 := rfl - -@[simp] -lemma ψbarψ_one_eq_ψ_one : ψbarψ 1 = ψ 1 := rfl - -@[simp] -lemma ψbarψ_two_eq_barψ_zero : ψbarψ 2 = barψ 0 := rfl - -@[simp] -lemma ψbarψ_three_eq_barψ_one : ψbarψ 3 = barψ 1 := rfl - -@[simp] -lemma ψbarψ_mul_self (α : Fin 4) : ψbarψ α * ψbarψ α = 0 := by - fin_cases α - · exact ψ_mul_self 0 - · exact ψ_mul_self 1 - · exact barψ_mul_self 0 - · exact barψ_mul_self 1 - -lemma ψbarψ_swap (α β : Fin 4) : ψbarψ α * ψbarψ β = - ψbarψ β * ψbarψ α := by - fin_cases α <;> fin_cases β <;> - simp [ψbarψ, neg_mul, eq_neg_iff_add_eq_zero] - <;> exact ExteriorAlgebra.ι_add_mul_swap _ _ - -@[simp] -lemma ψbarψ_apply_zero_eq : ψbarψ 0 = ψ 0 := rfl - -@[simp] -lemma ψbarψ_apply_one_eq : ψbarψ 1 = ψ 1 := rfl - -@[simp] -lemma ψbarψ_apply_two_eq : ψbarψ 2 = barψ 0 := rfl - -@[simp] -lemma ψbarψ_apply_three_eq : ψbarψ 3 = barψ 1 := rfl - -/-! - -### A.2. Of a list --/ - -/-- The term of the effective potential generated from a list - of `Fin 4`, which describe the components `[ψ 0, ψ 1, barψ 0, barψ 1]`. -/ -def termOfList (l : List (Fin 4)) : EffectivePotential := - (l.map ψbarψ).prod - @[simp] -lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] - -lemma termOfList_cons (l : List (Fin 4)) (α : Fin 4) : - termOfList (α :: l) = ψbarψ α * termOfList l := by - simp only [termOfList, List.map_cons, List.prod_cons] - -lemma termOfList_append (l₁ l₂ : List (Fin 4)) : - termOfList (l₁ ++ l₂) = termOfList l₁ * termOfList l₂ := by - simp [termOfList] - -lemma ψbarψ_mul_termOfList_mem (α : Fin 4) (l : List (Fin 4)) (h : α ∈ l) : - ψbarψ α * termOfList l = 0 := by - induction l with - | nil => simp at h - | cons β t ih => - rcases List.mem_cons.mp h with rfl | ha - · simp [termOfList_cons, ← mul_assoc] - · simp [termOfList_cons, ← mul_assoc, ψbarψ_swap α β] - simp [mul_assoc, ih ha] - -lemma termOfList_zero_of_not_nodup (l : List (Fin 4)) (h : ¬ l.Nodup) : - termOfList l = 0 := by - revert h - induction l with - | nil => intro h; exact absurd List.nodup_nil h - | cons a t ih => - intro h - rw [termOfList_cons] - by_cases hmem : a ∈ t - · exact ψbarψ_mul_termOfList_mem a t hmem - · rw [ih fun hn => h (List.nodup_cons.mpr ⟨hmem, hn⟩), mul_zero] -/-! - -### A.3. Basis - --/ - -/-- The basis of the effective potential. -/ -def basis : Basis (Finset (Fin 4)) ℂ EffectivePotential := - Module.Basis.ExteriorAlgebra ((LeftHandedWeyl.basis.dualBasis.prod - LeftHandedWeyl.basis.conj.dualBasis).reindex finSumFinEquiv) - -lemma basis_eq_termOfList (s : Finset (Fin 4)) : basis s = termOfList (s.sort (· ≤ ·)) := by - have happend : Fin.append ψ barψ = fun j => (ExteriorAlgebra.ι ℂ) - (((LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex - finSumFinEquiv) j) := by - funext j - fin_cases j <;> - simp [ψ, barψ, Fin.append, Fin.addCases, Basis.prod_apply, - show (finSumFinEquiv (m := 2) (n := 2)).symm 0 = Sum.inl 0 from rfl, - show (finSumFinEquiv (m := 2) (n := 2)).symm 1 = Sum.inl 1 from rfl, - show (finSumFinEquiv (m := 2) (n := 2)).symm 2 = Sum.inr 0 from rfl, - show (finSumFinEquiv (m := 2) (n := 2)).symm 3 = Sum.inr 1 from rfl] - rw [basis, ExteriorAlgebra.basis_apply_ofCard (s_card := rfl), termOfList, happend] - simp only [ExteriorAlgebra.ιMulti_family, Set.powersetCard.ofFinEmbEquiv_symm_apply, - ExteriorAlgebra.ιMulti_apply] - refine congrArg List.prod (List.ext_getElem (by simp) fun i h1 h2 => ?_) - simp [Finset.orderEmbOfFin_apply] - -lemma basis_empty_eq_one : basis ∅ = 1 := by simp [basis_eq_termOfList] - -lemma ψ_zero_eq_basis : ψ 0 = basis {0} := by - rw [basis, ExteriorAlgebra.basis_apply] - simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, - Finset.orderEmbOfFin_apply, ψ] - rfl - -lemma ψ_one_eq_basis : ψ 1 = basis {1} := by - rw [basis, ExteriorAlgebra.basis_apply] - simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, - Finset.orderEmbOfFin_apply, ψ] - rfl - -lemma barψ_zero_eq_basis : barψ 0 = basis {2} := by - rw [basis, ExteriorAlgebra.basis_apply] - simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, - Finset.orderEmbOfFin_apply, barψ] - rfl - -lemma barψ_one_eq_basis : barψ 1 = basis {3} := by - rw [basis, ExteriorAlgebra.basis_apply] - simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, - Finset.orderEmbOfFin_apply, barψ] - rfl - - - -lemma rep_apply_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : - rep Λ (barψ α) = ∑ β, star (Λ⁻¹ α β) • barψ β := by - simp only [barψ, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, Representation.dual_apply, - ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, RCLike.star_def, ← map_smul, - Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, - ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] - refine LeftHandedWeyl.basis.conj.ext fun l => ?_ - fin_cases α <;> fin_cases l <;> - simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, - -SpecialLinearGroup.coe_inv, Representation.conj_apply] - -lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List (Fin 4)) : - rep Λ (termOfList l) = ((l.map (Fin.append ψ barψ)).map (rep Λ)).prod := by - induction l with - | nil => simp - | cons i l ih => - simp [termOfList_cons, rep_mul, ih] - -lemma rep_neg_apply_append (Λ : SL(2, ℂ)) (α : Fin 4) : - rep (- Λ) (Fin.append ψ barψ α) = (-1 : ℂ) • rep Λ (Fin.append ψ barψ α) := by - fin_cases α - all_goals - simp [rep_apply_ψ_eq_sum, rep_apply_barψ_eq_sum] - abel - -lemma rep_neg_apply_termOfList (Λ : SL(2, ℂ)) (l : List (Fin 4)) : - rep (- Λ) (termOfList l) = ((-1 : ℂ) ^ l.length) • rep Λ (termOfList l) := by - induction l with - | nil => simp - | cons i l ih => - simp [termOfList_cons, rep_mul, ih, rep_neg_apply_append, pow_succ' (-1 : ℂ) l.length] - -lemma rep_neg_apply_basis (s : Finset (Fin 4)) (Λ : SL(2, ℂ)) : - rep (- Λ) (basis s) = (-1 : ℂ) ^ s.card • rep Λ (basis s) := by - simp [basis_eq_termOfList, rep_neg_apply_termOfList] - -lemma rep_diagonal_apply_append (α : Fin 4) (c : ℂˣ) : - rep ⟨diagonal ![c, c⁻¹], by simp⟩ (Fin.append ψ barψ α) = - (![(c⁻¹).1, c.1, starRingEnd ℂ (c⁻¹).1, starRingEnd ℂ c] α) • Fin.append ψ barψ α := by - fin_cases α <;> simp [rep_apply_ψ_eq_sum, rep_apply_barψ_eq_sum, Finset.univ_fin2] - all_goals simp [Finset.pair_comm] - -lemma rep_diagonal_apply_termOfList (l : List (Fin 4)) (c : ℂˣ) : - rep ⟨diagonal ![c, c⁻¹], by simp⟩ (termOfList l) = - ((l.map (![(c⁻¹).1, c.1, starRingEnd ℂ (c⁻¹).1, starRingEnd ℂ c])).prod) • termOfList l := by - induction l with - | nil => simp - | cons i l ih => - simp [termOfList_cons, rep_mul, ih, rep_diagonal_apply_append, smul_smul, mul_comm] - -lemma rep_diagonal_apply_basis (s : Finset (Fin 4)) (c : ℂˣ) : - rep ⟨diagonal ![c, c⁻¹], by simp⟩ (basis s) = - (∏ i ∈ s, (![(c⁻¹).1, c.1, starRingEnd ℂ (c⁻¹).1, starRingEnd ℂ c] i)) • basis s := by - rw [basis_eq_termOfList, rep_diagonal_apply_termOfList, ← Finset.prod_map_toList _, - ((Finset.sort_perm_toList _ fun x1 x2 => x1 ≤ x2).map _).prod_eq] - -/-! - -### A.5. Multidegrees - -Since ψ fields rotate among themselves under the action of the Lorentz group, -and barψ fields rotate among themselves, it is natural to decompose -the effective potential into submodules which have a fixed number of ψ and barψ -fields appearing in them. The submodules are closed under the action of the -Lorentz group. - --/ - -def FieldSpecification.ofIndex : Fin 4 → FieldSpecification - | 0 => FieldSpecification.ψ - | 1 => FieldSpecification.ψ - | 2 => FieldSpecification.barψ - | 3 => FieldSpecification.barψ - -/-- The submodules of `EffectivePotential` which have a fixed number of - `ψ` and `barψ` fields appearing in them. -/ -def multiDegreeSubmodule (d : Multiset FieldSpecification) : Submodule ℂ EffectivePotential := - Submodule.span ℂ {V | ∃ s : Finset (Fin 4), - (↑(s.val.map FieldSpecification.ofIndex) : Multiset FieldSpecification) = d ∧ basis s = V} - -lemma basis_mem_multiDegreeSubmodule (s : Finset (Fin 4)) : - basis s ∈ multiDegreeSubmodule ↑(s.val.map FieldSpecification.ofIndex) := - Submodule.subset_span ⟨s, rfl, rfl⟩ - -lemma termOfList_mem_multiDegreeSubmodule (l : List (Fin 4)) : - termOfList l ∈ multiDegreeSubmodule ↑(l.map FieldSpecification.ofIndex) := - Submodule.subset_span ⟨l.toFinset, by simp [Multiset.coe_toFinset, Multiset.map_map], by - simp [basis_eq_termOfList]⟩ -lemma one_mem_multiDegreeSubmodule_zero : (1 : EffectivePotential) ∈ multiDegreeSubmodule 0 := - Submodule.subset_span ⟨∅, rfl, by simp [basis_empty_eq_one]⟩ - -lemma append_mem_multiDegreeSubmodule (α : Fin 4) : - Fin.append ψ barψ α ∈ multiDegreeSubmodule {FieldSpecification.ofIndex α} := - Submodule.subset_span ⟨{α}, rfl, by - fin_cases α <;> - simp [ψ_zero_eq_basis, barψ_zero_eq_basis, ψ_one_eq_basis, barψ_one_eq_basis]⟩ - -lemma ψ_mem_multiDegreeSubmodule (i : Fin 2) : - ψ i ∈ multiDegreeSubmodule {FieldSpecification.ψ} := by - fin_cases i - · exact append_mem_multiDegreeSubmodule 0 - · exact append_mem_multiDegreeSubmodule 1 - -lemma barψ_mem_multiDegreeSubmodule (i : Fin 2) : - barψ i ∈ multiDegreeSubmodule {FieldSpecification.barψ} := by - fin_cases i - · exact append_mem_multiDegreeSubmodule 2 - · exact append_mem_multiDegreeSubmodule 3 - -lemma rep_basis_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (s : Finset (Fin 4)) : - rep Λ (basis s) ∈ multiDegreeSubmodule ↑(s.val.map FieldSpecification.ofIndex) := by - sorry - -/-! - -### A.6. Stability of multidegrees under the group action - --/ - -lemma rep_ψ_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (i : Fin 2) : - rep Λ (ψ i) ∈ multiDegreeSubmodule {FieldSpecification.ψ} := by - rw [rep_apply_ψ_eq_sum] - exact Submodule.sum_mem _ fun j _ => - Submodule.smul_mem _ _ (ψ_mem_multiDegreeSubmodule j) - -lemma rep_barψ_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (i : Fin 2) : - rep Λ (barψ i) ∈ multiDegreeSubmodule {FieldSpecification.barψ} := by - rw [rep_apply_barψ_eq_sum] - exact Submodule.sum_mem _ fun j _ => - Submodule.smul_mem _ _ (barψ_mem_multiDegreeSubmodule j) - -lemma rep_append_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (α : Fin 4) : - rep Λ (Fin.append ψ barψ α) ∈ multiDegreeSubmodule {FieldSpecification.ofIndex α} := - match α with - | 0 => rep_ψ_mem_multiDegreeSubmodule Λ 0 - | 1 => rep_ψ_mem_multiDegreeSubmodule Λ 1 - | 2 => rep_barψ_mem_multiDegreeSubmodule Λ 0 - | 3 => rep_barψ_mem_multiDegreeSubmodule Λ 1 - -lemma rep_termOfList_mem_multiDegreeSubmodule (Λ : SL(2, ℂ)) (l : List (Fin 4)) : - rep Λ (termOfList l) ∈ multiDegreeSubmodule ↑(l.map FieldSpecification.ofIndex) := by - induction l with - | nil => simpa using one_mem_multiDegreeSubmodule_zero - | cons α l ih => - rw [termOfList_cons, rep_mul] - simpa [Multiset.singleton_add] using - mul_mem_multiDegreeSubmodule (rep_append_mem_multiDegreeSubmodule Λ α) ih - -/-- The multidegree submodules are stable under the action of the Lorentz group. -/ -lemma rep_mem_multiDegreeSubmodule {d : Multiset FieldSpecification} (Λ : SL(2, ℂ)) - {V : EffectivePotential} (hV : V ∈ multiDegreeSubmodule d) : - rep Λ V ∈ multiDegreeSubmodule d := by - induction hV using Submodule.span_induction with - | mem x hx => - obtain ⟨l, hl, rfl⟩ := hx - exact hl ▸ rep_termOfList_mem_multiDegreeSubmodule Λ l - | zero => simp - | add a b _ _ ha hb => rw [map_add]; exact add_mem ha hb - | smul c a _ ha => rw [map_smul]; exact Submodule.smul_mem _ _ ha - -/-- The multidegree submodules are sent to themselves under the action - of the Lorentz group. -/ -lemma multiDegreeSubmodule_map_rep (Λ : SL(2, ℂ)) (d : Multiset FieldSpecification) : - (multiDegreeSubmodule d).map (rep Λ) = multiDegreeSubmodule d := by - refine le_antisymm (Submodule.map_le_iff_le_comap.2 fun V hV => - rep_mem_multiDegreeSubmodule Λ hV) fun V hV => ?_ - refine ⟨rep Λ⁻¹ V, rep_mem_multiDegreeSubmodule Λ⁻¹ hV, ?_⟩ - rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] - -/-! - -## B. Invariance under the Lorentz group - --/ - -/-- An effective potential is Lorentz invariant if it is stable under the - action of the Lorentz group. -/ -def IsInvariant (V : EffectivePotential) : Prop := ∀ Λ, rep Λ V = V - -lemma IsInvariant.eq_iff {V : EffectivePotential} : - IsInvariant V ↔ ∀ Λ, rep Λ V = V := by rfl - -lemma IsInvariant.add {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V + W) := by - intro Λ - simp_all [IsInvariant.eq_iff] - -lemma IsInvariant.smul {V : EffectivePotential} (hV : IsInvariant V) (c : ℂ) : - IsInvariant (c • V) := by - intro Λ - simp_all [IsInvariant.eq_iff] - -lemma IsInvariant.mul {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V * W) := by - intro Λ - simp_all [IsInvariant.eq_iff, rep_mul] - -lemma IsInvariant.one : IsInvariant 1 := by - intro Λ - simp [rep] - -/-! - -## B.1. Specific terms which are invariant - --/ - -lemma ψ_zero_mul_ψ_one_isInvariant : IsInvariant (ψ 0 * ψ 1) := by - intro Λ - simp [rep_mul, rep_apply_ψ_eq_sum, mul_add, add_mul] - trans (Λ.1.adjugate 1 1 • Λ.1.adjugate 0 0 - Λ.1.adjugate 1 0 • Λ.1.adjugate 0 1) • (ψ 0 * ψ 1) - · module - simp only [Fin.isValue, adjugate_fin_two, of_apply, cons_val', cons_val_one, cons_val_fin_one, - cons_val_zero, smul_eq_mul, mul_neg, neg_mul, neg_neg] - trans Λ.1.det • (ψ 0 * ψ 1) - · congr - simp only [Matrix.det_fin_two] - ring - · simp - -lemma barψ_zero_mul_barψ_one_isInvariant : IsInvariant (barψ 0 * barψ 1) := by - intro Λ - simp [rep_mul, rep_apply_barψ_eq_sum, mul_add, add_mul, adjugate_fin_two, smul_smul, - ← add_smul, ← neg_smul, ← map_mul, ← map_neg, ← map_add] - trans (starRingEnd ℂ) Λ.1.det • (barψ 0 * barψ 1) - · simp only [Matrix.det_fin_two] - ring_nf +lemma coeff_coeff_self {s : Multiset FieldSpecification} (V : EffectivePotential) : + coeff s (coeff s V) = coeff s V := by + induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy + a x _ hx + · simp at hV' + obtain ⟨l, rfl⟩ := hV' + simp [coeff_apply_termOfList, apply_ite] + grind · simp - -lemma quartic_isInvariant : IsInvariant (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by - intro Λ - simp [rep_mul, rep_apply_barψ_eq_sum, rep_apply_barψ_eq_sum, mul_add, add_mul, adjugate_fin_two, - smul_smul, ← add_smul, ← neg_smul, ← map_mul, ← map_neg, ← map_add, mul_assoc] - trans (starRingEnd ℂ) Λ.1.det • ((rep Λ) (ψ 0) * ((rep Λ) (ψ 1) * (barψ 0 * barψ 1))) - · simp only [Matrix.det_fin_two] - ring_nf - simp [rep_apply_ψ_eq_sum, mul_add, add_mul, ← mul_assoc, mul_add, add_mul, - adjugate_fin_two, smul_smul, ← add_smul, ← neg_smul] - trans Λ.1.det • (ψ 0 * ψ 1 * barψ 0 * barψ 1) - · simp only [Matrix.det_fin_two] - ring_nf - · simp - -/-! - -## B.2. Terms which must be zero in an invariant potential - --/ -/-- If `V` is invariant, then all terms with an odd number of factors vanish. -/ -lemma even_of_isInvariant {V : EffectivePotential} (s : Finset (Fin 4)) (h : IsInvariant V) - (hs : Odd s.card) : basis.repr V s = 0 := by - suffices h : basis.repr V s = (-1 : ℂ) ^ s.card * basis.repr V s by - simpa [hs.neg_one_pow, CharZero.eq_neg_self_iff] using h - suffices Λ_basis : ∀ (t : Finset (Fin 4)), rep (-1 : SL(2, ℂ)) (basis t) = - (-1 : ℂ) ^ t.card • basis t by - conv_lhs => rw [← h (-1 : SL(2, ℂ)), ← basis.sum_repr V, map_sum] - simp [Λ_basis, Finsupp.single_apply, smul_smul, mul_comm] - simp [rep_neg_apply_basis] - -/-- If `V` is invariant, then the mixed terms `ψ i * barψ j` have coefficient zero. -/ -lemma zero_two_term_zero_of_isInvariant {V : EffectivePotential} (h : IsInvariant V) : - basis.repr V {0, 2} = 0 ∧ basis.repr V {0, 3} = 0 - ∧ basis.repr V {1, 2} = 0 ∧ basis.repr V {1, 3} = 0 := by - let Λ : SL(2, ℂ):= ⟨!![2 * I, 0; 0, -(I / 2)], by - simp [Matrix.det_fin_two_of]; linear_combination -Complex.I_sq⟩ - let d : Fin 4 → ℂ := ![-(I / 2), 2 * I, I / 2, -(2 * I)] - suffices Λ_basis_two : ∀ (a b : Fin 4) (hab : a ≠ b) (hd : d a * d b ≠ 1), - basis.repr V {a, b} = 0 by - refine ⟨Λ_basis_two 0 2 (by decide) ?_, Λ_basis_two 0 3 (by decide) ?_, - Λ_basis_two 1 2 (by decide) ?_, Λ_basis_two 1 3 (by decide) ?_⟩ - all_goals - simp [d] - ring_nf + · simp [hx, hy] + · simp [hx] + +lemma coeff_eq_termOfList {s : Multiset FieldSpecification} + (V : EffectivePotential) {l : List FieldSpecification} (hl : Multiset.ofList l = s) : + ∃ c : ℂ, coeff s V = c • termOfList l := by + induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy + a x _ hx + · simp at hV' + obtain ⟨l', rfl⟩ := hV' + simp [coeff_apply_termOfList] + split_ifs + · rename_i hi + refine termOfList_perm ?_ + rw [← Multiset.coe_eq_coe] + simp_all + · use 0 simp - try grind - suffices Λ_basis : ∀ (t : Finset (Fin 4)), rep Λ (basis t) = (∏ k ∈ t, d k) • basis t by - intro a b hab hd - have h1 : basis.repr V {a, b} = (d a * d b) * basis.repr V {a, b} := by - conv_lhs => rw [← h Λ, ← basis.sum_repr V, map_sum] - simp [Λ_basis, Finsupp.single_apply, smul_smul, mul_comm, Finset.prod_pair hab] + · use 0 + simp + · obtain ⟨c1, hx⟩ := hx + obtain ⟨c2, hy⟩ := hy + use (c1 + c2) + simp [hx, hy] + module + · obtain ⟨c1, hx⟩ := hx + use a • c1 + simp [hx, smul_smul] + +/-- The support of an effective potential: the set of multisets of field specifications + for which the corresponding coefficient is non-zero. -/ +def support (V : EffectivePotential) : Finset (Multiset FieldSpecification) := + Set.Finite.toFinset (s := {s | coeff s V ≠ 0}) <| by + induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy + a x _ hx + · simp only [Set.mem_range] at hV' + obtain ⟨l, rfl⟩ := hV' + refine (Set.finite_singleton (Multiset.ofList l)).subset ?_ + intro s hs + simp at hs + rw [coeff_apply_termOfList] at hs + rw [Set.mem_singleton_iff] by_contra hne - exact hd (mul_right_cancel₀ hne (by linear_combination -h1)) + exact hs (if_neg fun h => hne h.symm) + · refine Set.finite_empty.subset ?_ + intro s hs + simp at hs + · refine (hx.union hy).subset ?_ + intro s hs + simp at hs + grind + · refine hx.subset ?_ + intro s hs + simp at hs + grind + +lemma mem_support_iff {V : EffectivePotential} {s : Multiset FieldSpecification} : + s ∈ support V ↔ coeff s V ≠ 0 := by simp [support] + +lemma support_add {V W : EffectivePotential} : + support (V + W) ⊆ support V ∪ support W := by sorry +lemma eq_sum_support_coeff (V : EffectivePotential) : V = ∑ s ∈ support V, coeff s V := by + sorry -lemma isInvariant_iff {V : EffectivePotential} : - IsInvariant V ↔ ∃ (c m1 m2 ρ : ℂ), V = c • 1 + m1 • (ψ 0 * ψ 1) + m2 • (barψ 0 * barψ 1) + - ρ • (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by - constructor - · intro h - rw [← basis.sum_repr V] - refine ⟨basis.repr V ∅, basis.repr V {0, 1}, basis.repr V {2, 3}, basis.repr V {0, 1, 2, 3}, ?_⟩ - rw [show (Finset.univ : Finset (Finset (Fin 4))) = - {∅, {0}, {1}, {2}, {3}, {0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}, - {0, 1, 2}, {0, 1, 3}, {0, 2, 3}, {1, 2, 3}, {0, 1, 2, 3}} by decide] - repeat rw [Finset.sum_insert (by decide)] - rw [Finset.sum_singleton] - rw [even_of_isInvariant {0} h (by decide), even_of_isInvariant {1} h (by decide), - even_of_isInvariant {2} h (by decide), even_of_isInvariant {3} h (by decide), - even_of_isInvariant {0, 1, 2} h (by decide), even_of_isInvariant {0, 1, 3} h (by decide), - even_of_isInvariant {0, 2, 3} h (by decide), even_of_isInvariant {1, 2, 3} h (by decide), - (zero_two_term_zero_of_isInvariant h).1, (zero_two_term_zero_of_isInvariant h).2.1, - (zero_two_term_zero_of_isInvariant h).2.2.1, (zero_two_term_zero_of_isInvariant h).2.2.2] - simp [add_assoc] - congr - all_goals - rw [basis, ExteriorAlgebra.basis_apply]; - simp [ExteriorAlgebra.ιMulti_apply, - Set.powersetCard.ofFinEmbEquiv_symm_apply, Finset.orderEmbOfFin_apply, Finset.sort_insert, - ψ, barψ, mul_assoc]; - try rfl - · rintro ⟨c, m1, m2, ρ, rfl⟩ - apply_rules [IsInvariant.add, IsInvariant.smul, IsInvariant.one, - ψ_zero_mul_ψ_one_isInvariant, barψ_zero_mul_barψ_one_isInvariant, quartic_isInvariant] +/-- A general result related to whether a multiset of field specifications is excluded from +the support of an effective potential due to a selection rule based on the group action. -/ +lemma support_selection_rule {V : EffectivePotential} (hV : IsInvariant v) + {s : Multiset FieldSpecification} + (selection_rule : ∃ g : SL(2, ℂ), ∃ l : List FieldSpecification, ∃ c : ℂˣ, + rep g (termOfList l) = c • termOfList l ∧ Multiset.ofList l = s ∧ c ≠ 1) : + s ∉ support V := by + sorry /-! -## C. Coefficent list - --/ - -/-- The coefficients of an effective potential relevant for invariant potentials, as a - linear map: the coefficients of `1`, `ψ 0 * ψ 1`, `barψ 0 * barψ 1` and - `ψ 0 * ψ 1 * barψ 0 * barψ 1`. -/ -def invCoeffList : EffectivePotential →ₗ[ℂ] (Fin 4 → ℂ) := - LinearMap.pi ![basis.coord ∅, basis.coord {0, 1}, basis.coord {2, 3}, basis.coord {0, 1, 2, 3}] - -@[simp] -lemma invCoeffList_one : invCoeffList 1 = ![1, 0, 0, 0] := by - rw [← basis_empty_eq_one] - ext i - fin_cases i <;> simp [invCoeffList] - -@[simp] -lemma invCoeffList_ψ_zero_mul_ψ_one : invCoeffList (ψ 0 * ψ 1) = ![0, 1, 0, 0] := by - trans invCoeffList (basis {0, 1}) - · congr - rw [basis, ExteriorAlgebra.basis_apply] - simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, - Finset.orderEmbOfFin_apply, Finset.sort_insert, ψ] - rfl - ext i - fin_cases i <;> simp [invCoeffList, Finsupp.single_apply] - · decide - · decide -@[simp] -lemma invCoeffList_barψ_zero_mul_barψ_one : invCoeffList (barψ 0 * barψ 1) = ![0, 0, 1, 0] := by - trans invCoeffList (basis {2, 3}) - · congr - rw [basis, ExteriorAlgebra.basis_apply] - simp [ExteriorAlgebra.ιMulti_apply, Set.powersetCard.ofFinEmbEquiv_symm_apply, - Finset.orderEmbOfFin_apply, Finset.sort_insert, barψ] - rfl - ext i - fin_cases i <;> simp [invCoeffList, Finsupp.single_apply] - · decide - · decide +## Coefficents of irrep terms -@[simp] -lemma invCoeffList_quartic : invCoeffList (ψ 0 * ψ 1 * barψ 0 * barψ 1) = ![0, 0, 0, 1] := by - trans invCoeffList (basis {0, 1, 2, 3}) - · congr - rw [basis, ExteriorAlgebra.basis_apply]; - simp [ExteriorAlgebra.ιMulti_apply, - Set.powersetCard.ofFinEmbEquiv_symm_apply, Finset.orderEmbOfFin_apply, Finset.sort_insert, - ψ, barψ, mul_assoc]; - rfl - ext i - fin_cases i <;> simp [invCoeffList, Finsupp.single_apply] - · decide - · decide - -lemma invCoeffList_injective {V1 V2 : EffectivePotential} (h1 : IsInvariant V1) - (h2 : IsInvariant V2) (h : invCoeffList V1 = invCoeffList V2) : V1 = V2 := by - obtain ⟨c1, m11, m21, ρ1, rfl⟩ := isInvariant_iff.1 h1 - obtain ⟨c2, m12, m22, ρ2, rfl⟩ := isInvariant_iff.1 h2 - simp at h - rcases h with ⟨rfl, rfl, rfl, rfl⟩ - rfl - -/-! - -## D. Conjugation -/ -/-- The conjugation operator on the effective potential. - This takes the complex conjugate of the coefficients, swaps the generators `ψ α` and `barψ α`, - and reverses the order of products. -/ -def conjugate : EffectivePotential →ₛₗ[starRingEnd ℂ] EffectivePotential := - let conjSwap : - (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - →ₛₗ[starRingEnd ℂ] - Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl) := - { toFun := Prod.map conjDualEquiv.symm conjDualEquiv ∘ Prod.swap - map_add' p q := by simp [Prod.ext_iff] - map_smul' c p := by simp [Prod.ext_iff, map_smulₛₗ]} - CliffordAlgebra.reverse.comp <| - (conjEquiv (k := ℂ)).symm.comp <| - (ExteriorAlgebra.lift ℂ - ⟨(conjEquiv (k := ℂ)).comp ((ExteriorAlgebra.ι ℂ).comp conjSwap), - fun v => ExteriorAlgebra.ι_sq_zero _⟩).toLinearMap - -lemma conjugate_eq_comp_algebra_map : ∃ (A: EffectivePotential →ₐ[ℂ] ConjModule EffectivePotential), - conjugate = CliffordAlgebra.reverse.comp ((conjEquiv (k := ℂ)).symm.comp A.toLinearMap) := by - let conjSwap : - (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - →ₛₗ[starRingEnd ℂ] - Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl) := - { toFun := Prod.map conjDualEquiv.symm conjDualEquiv ∘ Prod.swap - map_add' p q := by simp [Prod.ext_iff] - map_smul' c p := by simp [Prod.ext_iff, map_smulₛₗ]} - use ExteriorAlgebra.lift ℂ - ⟨(conjEquiv (k := ℂ)).comp ((ExteriorAlgebra.ι ℂ).comp conjSwap), - fun v => ExteriorAlgebra.ι_sq_zero _⟩ - rfl -lemma conjugate_apply_ι (v : Dual ℂ LeftHandedWeyl × Dual ℂ (ConjModule LeftHandedWeyl)) : - conjugate (ExteriorAlgebra.ι ℂ v) = - (CliffordAlgebra.reverse <| conjEquiv (k := ℂ) <| - ExteriorAlgebra.ι ℂ <| Prod.map conjDualEquiv.symm conjDualEquiv ∘ Prod.swap <| v) := by - simp [conjugate] - erw [AlgHom.toLinearMap_apply] - rw [ExteriorAlgebra.lift_ι_apply] - rfl -@[simp] -lemma conjugate_one : conjugate 1 = 1 := by - simp [conjugate] - erw [AlgHom.toLinearMap_apply] - rw [map_one] - exact CliffordAlgebra.reverse.map_one +def irrepCoeff (i : Multiset Irrep) : EffectivePotential →ₗ[ℂ] EffectivePotential where + toFun := fun V => ∑ s ∈ support V, if Multiset.map toIrrep s = i then coeff s V else 0 + map_add' := by + intro V W + sorry + map_smul' := by + intro c V + sorry -@[simp] -lemma conjugate_algebraMap (c : ℂ) : conjugate (algebraMap ℂ EffectivePotential c) = - algebraMap ℂ EffectivePotential (starRingEnd ℂ c) := by - simp [Algebra.algebraMap_eq_smul_one] - -lemma conjugate_mul (V W : EffectivePotential) : - conjugate (V * W) = conjugate W * conjugate V := by - obtain ⟨A, hA⟩ := conjugate_eq_comp_algebra_map - simp [hA] - erw [AlgHom.coe_toLinearMap, AlgHom.toLinearMap_apply] - simp [conjEquiv] - erw [CliffordAlgebra.reverse.map_mul] - -@[simp] -lemma conjugate_conjugate (V : EffectivePotential) : conjugate (conjugate V) = V := by - induction' V using ExteriorAlgebra.induction with r v a b ha hb a b ha hb - · simp [conjugate_algebraMap] - · simp [conjugate_apply_ι, conjEquiv] - obtain ⟨fst, snd⟩ := v - simp_all only [Prod.swap_prod_mk, Prod.map_apply, LinearEquiv.symm_apply_apply, - LinearEquiv.apply_symm_apply] - · simp [conjugate_mul, ha, hb] - · simp [ha, hb] - -lemma conjugate_injective : Function.Injective conjugate := by - intro V W h - have h' : conjugate (conjugate V) = conjugate (conjugate W) := by rw [h] - simp only [conjugate_conjugate] at h' - exact h' +def irrepSupport (V : EffectivePotential) : Finset (Multiset Irrep) := + (support V).image (Multiset.map toIrrep) -@[simp] -lemma conjugate_ψ (α : Fin 2) : conjugate (ψ α) = barψ α := by - simp [ψ, conjugate_apply_ι] - trans CliffordAlgebra.reverse (barψ α) - · congr 1 - simp only [conjEquiv, LinearEquiv.coe_mk, LinearMap.coe_mk, AddHom.coe_mk, barψ, - Basis.coe_dualBasis, LinearMap.coe_inr, ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] - rfl - simp [barψ] +lemma irrepCoeff_rep {i : Multiset Irrep} {V : EffectivePotential} (g : SL(2, ℂ)) : + rep g (irrepCoeff i V) = irrepCoeff i (rep g V) := by + sorry -@[simp] -lemma conjugate_barψ (α : Fin 2) : conjugate (barψ α) = ψ α := by - apply conjugate_injective - simp [conjugate_ψ] +lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EffectivePotential} (hV : IsInvariant V) : + irrepCoeff {Irrep.ψ, Irrep.barψ} V = 0 := by + sorry /-! -## E. Reality condition +## Mass dimension -/ -/-- The effective potential is real if it is equal to its conjugate. -/ -def IsReal (V : EffectivePotential) : Prop := conjugate V = V - -lemma isReal_iff {V : EffectivePotential} : IsReal V ↔ conjugate V = V := by rfl - -/-- The necessary and sufficent condition for a real potential to be - invariant under the Lorentz group. -/ -lemma isInvariant_iff_of_isReal {V : EffectivePotential} (h : IsReal V) : - IsInvariant V ↔ ∃ (c : ℝ), ∃ (m : ℂ), ∃ (ρ : ℝ), V = - c • 1 + m • ψ 0 * ψ 1 - star m • barψ 0 * barψ 1 + ρ • (ψ 0 * ψ 1 * barψ 0 * barψ 1) := by - rw [isInvariant_iff] - constructor - · rintro ⟨c, m1, m2, ρ, rfl⟩ - simp [isReal_iff, conjugate_mul, ← mul_assoc] at h - have h1 := congrArg invCoeffList h - simp at h1 - rcases h1 with ⟨h1, h2, rfl, h3⟩ - use c.re, m1, ρ.re - have hc : c = (c.re : ℂ) := by rw [← propext (re_eq_ofReal_of_isSelfAdjoint h1)] - have hρ : ρ = (ρ.re : ℂ) := by rw [← propext (re_eq_ofReal_of_isSelfAdjoint h3)] - rw [hc, hρ] - simp only [coe_smul, Fin.isValue, neg_smul, ofReal_re, Algebra.smul_mul_assoc, RCLike.star_def, - add_left_inj] - abel - · rintro ⟨c, m1, ρ, rfl⟩ - use c, m1, -star m1, ρ - simp - abel +def massDimCoeff (n : ℚ) : EffectivePotential →ₗ[ℂ] EffectivePotential where + toFun := fun V => ∑ s ∈ support V, if (s.map massDimension).sum = n then coeff s V else 0 + map_add' := by + intro V W + sorry + map_smul' := by + intro c V + sorry + +def massDimSupport (V : EffectivePotential) : Finset ℚ := + (support V).image (fun s => (s.map massDimension).sum) + +lemma eq_sum_massDimCoeff (V : EffectivePotential) : + V = ∑ n ∈ massDimSupport V, massDimCoeff n V := by + sorry end EffectivePotential From e17d0be07b174596b6634a7f0b8f89b6ed002df4 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 16 Jul 2026 11:00:45 +0100 Subject: [PATCH 030/254] feat: Add parts --- .../PureFermionic/EffectivePotential.lean | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index 5cddef1b3..1c42da782 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -313,6 +313,18 @@ lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List FieldSpecification) | cons i l ih => simp [termOfList_cons, rep_mul, ih] +lemma rep_scale_termOfList_of_rep_scale_toEffectivePotential (Λ : SL(2, ℂ)) + (h : ∀ ψ, ∃ c : ℂ, rep Λ [ψ]ₑ = c • [ψ]ₑ) (l : List FieldSpecification) : + ∃ c : ℂ, rep Λ (termOfList l) = c • termOfList l := by + induction l with + | nil => exact ⟨1, by simp⟩ + | cons ψ t ih => + obtain ⟨cψ, hcψ⟩ := h ψ + obtain ⟨ct, hct⟩ := ih + refine ⟨cψ * ct, ?_⟩ + simp [termOfList_cons, rep_mul, hcψ, hct] + module + lemma mem_termOfList_span (V : EffectivePotential) : V ∈ Submodule.span ℂ (Set.range termOfList) := by induction V using ExteriorAlgebra.induction with @@ -527,6 +539,13 @@ lemma coeff_eq_termOfList {s : Multiset FieldSpecification} use a • c1 simp [hx, smul_smul] +lemma coeff_eq_exists_termOfList (s : Multiset FieldSpecification) + (V : EffectivePotential) : + ∃ l, ∃ c : ℂ, coeff s V = c • termOfList l := by + obtain ⟨c, hl⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) + use Multiset.toList s + use c + /-- The support of an effective potential: the set of multisets of field specifications for which the corresponding coefficient is non-zero. -/ def support (V : EffectivePotential) : Finset (Multiset FieldSpecification) := @@ -554,6 +573,10 @@ def support (V : EffectivePotential) : Finset (Multiset FieldSpecification) := simp at hs grind +@[simp] +lemma support_zero_eq_empty : support (0 : EffectivePotential) = ∅ := by + simp [support] + lemma mem_support_iff {V : EffectivePotential} {s : Multiset FieldSpecification} : s ∈ support V ↔ coeff s V ≠ 0 := by simp [support] @@ -561,15 +584,26 @@ lemma support_add {V W : EffectivePotential} : support (V + W) ⊆ support V ∪ support W := by sorry +lemma support_smul {V : EffectivePotential} (c : ℂ) : + support (c • V) ⊆ support V := by + sorry + lemma eq_sum_support_coeff (V : EffectivePotential) : V = ∑ s ∈ support V, coeff s V := by sorry +lemma mem_support_termOfList_iff {l : List FieldSpecification} (s : Multiset FieldSpecification): + s ∈ support (termOfList l) ↔ s = Multiset.ofList l ∧ termOfList l ≠ 0 := by + simp [support, coeff_apply_termOfList] + grind + /-- A general result related to whether a multiset of field specifications is excluded from the support of an effective potential due to a selection rule based on the group action. -/ -lemma support_selection_rule {V : EffectivePotential} (hV : IsInvariant v) +lemma support_selection_rule {V : EffectivePotential} (hV : IsInvariant V) {s : Multiset FieldSpecification} - (selection_rule : ∃ g : SL(2, ℂ), ∃ l : List FieldSpecification, ∃ c : ℂˣ, - rep g (termOfList l) = c • termOfList l ∧ Multiset.ofList l = s ∧ c ≠ 1) : + (selection_rule : ∃ g : SL(2, ℂ), + + ∃ l : List FieldSpecification, ∃ c : ℂ, + rep g (termOfList l) = c • termOfList l ∧ Multiset.ofList l = s) : s ∉ support V := by sorry @@ -581,8 +615,6 @@ lemma support_selection_rule {V : EffectivePotential} (hV : IsInvariant v) -/ - - def irrepCoeff (i : Multiset Irrep) : EffectivePotential →ₗ[ℂ] EffectivePotential where toFun := fun V => ∑ s ∈ support V, if Multiset.map toIrrep s = i then coeff s V else 0 map_add' := by From 7020d6bfee95e9c837a7fdb74befa184d2934ece Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 17 Jul 2026 06:29:38 +0100 Subject: [PATCH 031/254] feat: Add results --- .../PureFermionic/EffectivePotential.lean | 115 ++++++++++++++++-- 1 file changed, 106 insertions(+), 9 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index 1c42da782..d1f8c4d56 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -352,22 +352,27 @@ lemma mem_termOfList_span (V : EffectivePotential) : | smul c x _ hx => rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ hx | add a b ha hb => exact add_mem ha hb -lemma termOfList_perm {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : - ∃ c : ℂ, termOfList l1 = c • termOfList l2 := by +lemma termOfList_perm_neq_zero {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : + ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ c ≠ 0 := by induction h with | nil => exact ⟨1, by simp⟩ | cons x _ ih => - obtain ⟨c, hc⟩ := ih - exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc, mul_smul_comm]⟩ + obtain ⟨c, hc1, hc2⟩ := ih + exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc1, mul_smul_comm], hc2⟩ | swap x y l => refine ⟨-1, ?_⟩ rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc, toEffectivePotential_mul_anti_commute y x] simp [mul_assoc] | trans _ _ ih1 ih2 => - obtain ⟨c1, hc1⟩ := ih1 - obtain ⟨c2, hc2⟩ := ih2 - exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul]⟩ + obtain ⟨c1, hc1, hc1'⟩ := ih1 + obtain ⟨c2, hc2, hc2'⟩ := ih2 + exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul], by grind⟩ + +lemma termOfList_perm {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : + ∃ c : ℂ, termOfList l1 = c • termOfList l2 := by + obtain ⟨c, h1, h2⟩ := termOfList_perm_neq_zero h + exact ⟨c, h1⟩ lemma termOfList_eq_ιMulti (l : List FieldSpecification) : termOfList l = ExteriorAlgebra.ιMulti ℂ l.length (fun i => moduleBasis (l.get i)) := by @@ -546,6 +551,40 @@ lemma coeff_eq_exists_termOfList (s : Multiset FieldSpecification) use Multiset.toList s use c +/-- If the action of `g` is to permute the fields, + then it defines a relation between the coefficients of the effective potential. -/ +lemma coeff_eq_perm (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) + (hg : ∀ ψ, rep g [ψ]ₑ = [σ ψ]ₑ) (s : Multiset FieldSpecification) + (V : EffectivePotential) (hV : IsInvariant V) : + coeff (s.map σ) V = rep g (coeff s V) := by + have hterm : ∀ l : List FieldSpecification, + rep g (termOfList l) = termOfList (l.map σ) := by + intro l + induction l with + | nil => simp + | cons a l ih => + rw [termOfList_cons, rep_mul, hg, ih, List.map_cons, termOfList_cons] + have hcomm : ∀ W : EffectivePotential, + coeff (s.map σ) (rep g W) = rep g (coeff s W) := by + intro W + induction' mem_termOfList_span W using Submodule.span_induction with W' hW' x y _ _ hx hy + a x _ hx + · simp only [Set.mem_range] at hW' + obtain ⟨l, rfl⟩ := hW' + rw [hterm, coeff_apply_termOfList, coeff_apply_termOfList] + have hcond : Multiset.ofList (List.map σ l) = Multiset.map σ s ↔ + Multiset.ofList l = s := by + rw [← Multiset.map_coe] + exact ⟨fun hc => Multiset.map_injective σ.injective hc, fun hc => by rw [hc]⟩ + by_cases hc : Multiset.ofList l = s + · rw [if_pos (hcond.mpr hc), if_pos hc, hterm] + · rw [if_neg (fun hcon => hc (hcond.mp hcon)), if_neg hc, map_zero] + · simp + · simp [map_add, hx, hy] + · simp [map_smul, hx] + conv_lhs => rw [← hV g] + exact hcomm V + /-- The support of an effective potential: the set of multisets of field specifications for which the corresponding coefficient is non-zero. -/ def support (V : EffectivePotential) : Finset (Multiset FieldSpecification) := @@ -586,7 +625,11 @@ lemma support_add {V W : EffectivePotential} : lemma support_smul {V : EffectivePotential} (c : ℂ) : support (c • V) ⊆ support V := by - sorry + simp [support] + +lemma support_smul_neq_zero {V : EffectivePotential} (c : ℂ) (hc : c ≠ 0) : + support (c • V) = support V := by + simp [support, hc] lemma eq_sum_support_coeff (V : EffectivePotential) : V = ∑ s ∈ support V, coeff s V := by sorry @@ -601,11 +644,65 @@ the support of an effective potential due to a selection rule based on the group lemma support_selection_rule {V : EffectivePotential} (hV : IsInvariant V) {s : Multiset FieldSpecification} (selection_rule : ∃ g : SL(2, ℂ), - ∃ l : List FieldSpecification, ∃ c : ℂ, rep g (termOfList l) = c • termOfList l ∧ Multiset.ofList l = s) : s ∉ support V := by sorry +/-! + +## + +-/ + +/-- Under the action of `g` an operator with field content specified by `s` mixes + into operators with field content given by this Finset. -/ +def repSupport (s : Multiset FieldSpecification) (g : SL(2, ℂ)) : + Finset (Multiset FieldSpecification) := + support (rep g (termOfList (Multiset.toList s))) + +lemma repSupport_eq_termOfList {s : Multiset FieldSpecification} (g : SL(2, ℂ)) + (l : List FieldSpecification) (hl : Multiset.ofList l = s) : + repSupport s g = support (rep g (termOfList l)) := by + simp [repSupport] + obtain ⟨c, h1, hc⟩ := termOfList_perm_neq_zero (l1 := Multiset.toList s) (l2 := l) + (by apply Multiset.coe_eq_coe.mp; simp [hl]) + simp [h1] + apply support_smul_neq_zero + exact hc + +lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecification} + (g : SL(2, ℂ)) (h : ∀ ψ : FieldSpecification, repSupport {ψ} g ⊆ {{ψ}}) : + repSupport s g ⊆ {s} := by + have hsingle : ∀ ψ : FieldSpecification, ∃ c : ℂ, + rep g (termOfList [ψ]) = c • termOfList [ψ] := by + intro ψ + have hsup := h ψ + rw [repSupport_eq_termOfList g [ψ] (by simp)] at hsup + rcases Finset.subset_singleton_iff.mp hsup with h0 | h1 + · refine ⟨0, ?_⟩ + rw [eq_sum_support_coeff (rep g (termOfList [ψ])), h0] + simp + · obtain ⟨c, hc⟩ := coeff_eq_termOfList (s := {ψ}) (rep g (termOfList [ψ])) + (l := [ψ]) (by simp) + refine ⟨c, ?_⟩ + rw [eq_sum_support_coeff (rep g (termOfList [ψ])), h1, Finset.sum_singleton, hc] + have hlist : ∀ l : List FieldSpecification, ∃ c : ℂ, + rep g (termOfList l) = c • termOfList l := by + intro l + induction l with + | nil => exact ⟨1, by simp⟩ + | cons a l ih => + obtain ⟨c, hc⟩ := ih + obtain ⟨ca, hca⟩ := hsingle a + refine ⟨ca * c, ?_⟩ + rw [show a :: l = [a] ++ l from rfl, termOfList_append, rep_mul, hca, hc, + smul_mul_smul_comm] + obtain ⟨c, hc⟩ := hlist s.toList + intro t ht + rw [repSupport, hc] at ht + have ht' := support_smul c ht + rw [mem_support_termOfList_iff] at ht' + simpa using ht'.1 /-! From 664a923a8b05ef069cbafecc7b93e0ef34487b61 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 17 Jul 2026 06:55:53 +0100 Subject: [PATCH 032/254] feat: More selection rules --- .../PureFermionic/EffectivePotential.lean | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EffectivePotential.lean index d1f8c4d56..974ae3c67 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EffectivePotential.lean @@ -553,7 +553,7 @@ lemma coeff_eq_exists_termOfList (s : Multiset FieldSpecification) /-- If the action of `g` is to permute the fields, then it defines a relation between the coefficients of the effective potential. -/ -lemma coeff_eq_perm (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) +lemma coeff_perm_selection_rule (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) (hg : ∀ ψ, rep g [ψ]ₑ = [σ ψ]ₑ) (s : Multiset FieldSpecification) (V : EffectivePotential) (hV : IsInvariant V) : coeff (s.map σ) V = rep g (coeff s V) := by @@ -585,6 +585,59 @@ lemma coeff_eq_perm (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) conv_lhs => rw [← hV g] exact hcomm V +lemma coeff_U1_selection_rule {V : EffectivePotential} (hV : IsInvariant V) + (g : SL(2, ℂ)) (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [ψ]ₑ) + (s : Multiset FieldSpecification) (hs : (s.map d).prod ≠ 1) : + coeff s V = 0 := by + have hterm : ∀ l : List FieldSpecification, + rep g (termOfList l) = (l.map d).prod • termOfList l := by + intro l + induction l with + | nil => simp + | cons a l ih => + rw [termOfList_cons, rep_mul, hg, ih, List.map_cons, List.prod_cons, + smul_mul_smul_comm] + have hcomm : ∀ W : EffectivePotential, + coeff s (rep g W) = (s.map d).prod • coeff s W := by + intro W + induction' mem_termOfList_span W using Submodule.span_induction with W' hW' x y _ _ hx hy + a x _ hx + · simp only [Set.mem_range] at hW' + obtain ⟨l, rfl⟩ := hW' + rw [hterm, map_smul, coeff_apply_termOfList] + by_cases hc : Multiset.ofList l = s + · rw [if_pos hc, ← hc, Multiset.map_coe, Multiset.prod_coe] + · simp [if_neg hc] + · simp + · simp [map_add, hx, hy] + · simp only [map_smul, hx] + rw [smul_comm] + have hfix : coeff s V = (s.map d).prod • coeff s V := by + conv_lhs => rw [← hV g] + exact hcomm V + have h1 : (1 - (s.map d).prod) • coeff s V = 0 := by + rw [sub_smul, one_smul, ← hfix, sub_self] + rcases smul_eq_zero.mp h1 with h | h + · exact absurd (sub_eq_zero.mp h).symm hs + · exact h + +/-- The selection rule on coefficients coming from the anti-symmetry of fermionic fields. -/ +lemma coeff_fermionic_selection_rule {V : EffectivePotential} (hV : IsInvariant V) + (s : Multiset FieldSpecification) (hs : ¬ s.Nodup) : + coeff s V = 0 := by + sorry + +/-- The selection rule on coefficients saying that + every term with an odd number of fermions is zero. -/ +lemma coeff_odd_selection_rule {V : EffectivePotential} (hV : IsInvariant V) + (s : Multiset FieldSpecification) (hs : Odd s.card) : + coeff s V = 0 := by + refine coeff_U1_selection_rule hV (g := -1) (d := fun ψ => -1) ?_ s ?_ + · intro ψ + sorry + · simp + sorry + /-- The support of an effective potential: the set of multisets of field specifications for which the corresponding coefficient is non-zero. -/ def support (V : EffectivePotential) : Finset (Multiset FieldSpecification) := @@ -754,6 +807,13 @@ lemma eq_sum_massDimCoeff (V : EffectivePotential) : V = ∑ n ∈ massDimSupport V, massDimCoeff n V := by sorry +/-! + +## Constraining the effective potential + +-/ + + end EffectivePotential end From 4f77c4968d3a093282a5e72c988abc7046c0bdce Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 17 Jul 2026 08:38:39 +0100 Subject: [PATCH 033/254] refactor: update name --- ...ntial.lean => EFTLagrangianExclDeriv.lean} | 135 ++++++++++-------- 1 file changed, 78 insertions(+), 57 deletions(-) rename Physlib/Particles/PureFermionic/{EffectivePotential.lean => EFTLagrangianExclDeriv.lean} (87%) diff --git a/Physlib/Particles/PureFermionic/EffectivePotential.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean similarity index 87% rename from Physlib/Particles/PureFermionic/EffectivePotential.lean rename to Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 974ae3c67..3fb0ca13e 100644 --- a/Physlib/Particles/PureFermionic/EffectivePotential.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -69,10 +69,10 @@ open CategoryTheory.MonoidalCategory /-- The type corresponding to the effective potential of a left-handed Weyl fermion. -/ -abbrev EffectivePotential : Type := ExteriorAlgebra ℂ +abbrev EFTLagrangianExclDeriv : Type := ExteriorAlgebra ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) -namespace EffectivePotential +namespace EFTLagrangianExclDeriv /-! @@ -81,7 +81,7 @@ namespace EffectivePotential -/ /-- The representation of the Lorentz group (here `SL(2, ℂ)`) on `EffectivePotential`. -/ -def rep : Representation ℂ SL(2, ℂ) EffectivePotential where +def rep : Representation ℂ SL(2, ℂ) EFTLagrangianExclDeriv where toFun Λ := (ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap (LeftHandedWeyl.rep.conj.dual Λ))).toLinearMap map_one' := by @@ -91,7 +91,7 @@ def rep : Representation ℂ SL(2, ℂ) EffectivePotential where simp only [map_mul, End.mul_eq_comp, ← LinearMap.prodMap_comp, ← ExteriorAlgebra.map_comp_map, AlgHom.comp_toLinearMap] -lemma rep_apply (Λ : SL(2, ℂ)) (V : EffectivePotential) : +lemma rep_apply (Λ : SL(2, ℂ)) (V : EFTLagrangianExclDeriv) : rep Λ V = ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap (LeftHandedWeyl.rep.conj.dual Λ)) V := rfl @@ -99,7 +99,7 @@ lemma rep_apply (Λ : SL(2, ℂ)) (V : EffectivePotential) : lemma rep_apply_one (Λ : SL(2, ℂ)) : rep Λ 1 = 1 := by simp [rep_apply] -lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : +lemma rep_mul (Λ : SL(2, ℂ)) (V W : EFTLagrangianExclDeriv) : rep Λ (V * W) = rep Λ V * rep Λ W:= by simp [rep] @@ -112,22 +112,22 @@ lemma rep_mul (Λ : SL(2, ℂ)) (V W : EffectivePotential) : /-- An effective potential is Lorentz invariant if it is stable under the action of the Lorentz group. -/ -def IsInvariant (V : EffectivePotential) : Prop := ∀ Λ, rep Λ V = V +def IsInvariant (V : EFTLagrangianExclDeriv) : Prop := ∀ Λ, rep Λ V = V -lemma IsInvariant.eq_iff {V : EffectivePotential} : +lemma IsInvariant.eq_iff {V : EFTLagrangianExclDeriv} : IsInvariant V ↔ ∀ Λ, rep Λ V = V := by rfl -lemma IsInvariant.add {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : +lemma IsInvariant.add {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : IsInvariant (V + W) := by intro Λ simp_all [IsInvariant.eq_iff] -lemma IsInvariant.smul {V : EffectivePotential} (hV : IsInvariant V) (c : ℂ) : +lemma IsInvariant.smul {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) (c : ℂ) : IsInvariant (c • V) := by intro Λ simp_all [IsInvariant.eq_iff] -lemma IsInvariant.mul {V W : EffectivePotential} (hV : IsInvariant V) (hW : IsInvariant W) : +lemma IsInvariant.mul {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : IsInvariant (V * W) := by intro Λ simp_all [IsInvariant.eq_iff, rep_mul] @@ -136,7 +136,7 @@ lemma IsInvariant.one : IsInvariant 1 := by intro Λ simp [rep] -end EffectivePotential +end EFTLagrangianExclDeriv /-! @@ -151,7 +151,7 @@ deriving DecidableEq namespace FieldSpecification -open EffectivePotential +open EFTLagrangianExclDeriv instance : Fintype FieldSpecification where elems := {ψ 0, ψ 1, barψ 0, barψ 1} @@ -186,7 +186,7 @@ def moduleBasis : Basis FieldSpecification ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) := (LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex toSumFin.symm -def toEffectivePotential (ψ : FieldSpecification) : EffectivePotential := +def toEffectivePotential (ψ : FieldSpecification) : EFTLagrangianExclDeriv := ExteriorAlgebra.ι ℂ (moduleBasis ψ) scoped notation "[" v "]ₑ" => toEffectivePotential v @@ -259,7 +259,7 @@ def massDimension : FieldSpecification → ℕ end FieldSpecification -namespace EffectivePotential +namespace EFTLagrangianExclDeriv open FieldSpecification @@ -268,7 +268,7 @@ open FieldSpecification ## Elements from a list of FieldSpecifications -/ -def termOfList (l : List FieldSpecification) : EffectivePotential := +def termOfList (l : List FieldSpecification) : EFTLagrangianExclDeriv := (l.map toEffectivePotential).prod lemma termOfList_cons (ψ : FieldSpecification) (l : List FieldSpecification) : @@ -313,6 +313,16 @@ lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List FieldSpecification) | cons i l ih => simp [termOfList_cons, rep_mul, ih] +lemma rep_termOfList_of_monomial (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) + (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [σ ψ]ₑ) + (l : List FieldSpecification) : + rep g (termOfList l) = (l.map d).prod • termOfList (l.map σ):= by + induction l with + | nil => simp + | cons a l ih => + rw [termOfList_cons, rep_mul, hg, ih] + simp [termOfList_cons, smul_smul, mul_comm] + lemma rep_scale_termOfList_of_rep_scale_toEffectivePotential (Λ : SL(2, ℂ)) (h : ∀ ψ, ∃ c : ℂ, rep Λ [ψ]ₑ = c • [ψ]ₑ) (l : List FieldSpecification) : ∃ c : ℂ, rep Λ (termOfList l) = c • termOfList l := by @@ -325,7 +335,7 @@ lemma rep_scale_termOfList_of_rep_scale_toEffectivePotential (Λ : SL(2, ℂ)) simp [termOfList_cons, rep_mul, hcψ, hct] module -lemma mem_termOfList_span (V : EffectivePotential) : +lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : V ∈ Submodule.span ℂ (Set.range termOfList) := by induction V using ExteriorAlgebra.induction with | algebraMap r => @@ -393,7 +403,7 @@ lemma termOfList_ofFn {n : ℕ} (g : Fin n → FieldSpecification) : -/ -def termOfTuple {n} (g : Fin n → FieldSpecification) : EffectivePotential := +def termOfTuple {n} (g : Fin n → FieldSpecification) : EFTLagrangianExclDeriv := termOfList (List.ofFn g) lemma termOfTuple_eq_ιMulti {n} (g : Fin n → FieldSpecification) : @@ -408,15 +418,15 @@ lemma termOfTuple_perm {n} (g : Fin n → FieldSpecification) {i j : Fin n} (hij def termOfVectTuple {n} : AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - EffectivePotential (Fin n) := ExteriorAlgebra.ιMulti ℂ n + EFTLagrangianExclDeriv (Fin n) := ExteriorAlgebra.ιMulti ℂ n def coeffOfVectorTuple (s : Multiset FieldSpecification) (n : ℕ) : AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - EffectivePotential (Fin n) where + EFTLagrangianExclDeriv (Fin n) where toMultilinearMap := ∑ g : Fin n → FieldSpecification, if Multiset.ofList (List.ofFn g) = s then - (LinearMap.toSpanSingleton ℂ EffectivePotential (termOfTuple g)).compMultilinearMap + (LinearMap.toSpanSingleton ℂ EFTLagrangianExclDeriv (termOfTuple g)).compMultilinearMap ((MultilinearMap.mkPiAlgebra ℂ (Fin n) ℂ).compLinearMap fun i => moduleBasis.coord (g i)) else 0 map_eq_zero_of_eq' := by @@ -475,7 +485,7 @@ this is where you can think of it as a coefficient. -/ -def coeff (s : Multiset FieldSpecification) : EffectivePotential →ₗ[ℂ] EffectivePotential := +def coeff (s : Multiset FieldSpecification) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := ExteriorAlgebra.liftAlternating (coeffOfVectorTuple s) lemma coeff_apply_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) : @@ -505,8 +515,15 @@ lemma coeff_apply_termOfList (s : Multiset FieldSpecification) (l : List FieldSp exact termOfList_eq_ιMulti l · simp +lemma coeff_one (s : Multiset FieldSpecification) : coeff s 1 = if s = ∅ then 1 else 0 := by + trans coeff s (termOfList []) + · simp + · rw [coeff_apply_termOfList] + simp + grind + @[simp] -lemma coeff_coeff_self {s : Multiset FieldSpecification} (V : EffectivePotential) : +lemma coeff_coeff_self {s : Multiset FieldSpecification} (V : EFTLagrangianExclDeriv) : coeff s (coeff s V) = coeff s V := by induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy a x _ hx @@ -519,7 +536,7 @@ lemma coeff_coeff_self {s : Multiset FieldSpecification} (V : EffectivePotential · simp [hx] lemma coeff_eq_termOfList {s : Multiset FieldSpecification} - (V : EffectivePotential) {l : List FieldSpecification} (hl : Multiset.ofList l = s) : + (V : EFTLagrangianExclDeriv) {l : List FieldSpecification} (hl : Multiset.ofList l = s) : ∃ c : ℂ, coeff s V = c • termOfList l := by induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy a x _ hx @@ -545,47 +562,51 @@ lemma coeff_eq_termOfList {s : Multiset FieldSpecification} simp [hx, smul_smul] lemma coeff_eq_exists_termOfList (s : Multiset FieldSpecification) - (V : EffectivePotential) : + (V : EFTLagrangianExclDeriv) : ∃ l, ∃ c : ℂ, coeff s V = c • termOfList l := by obtain ⟨c, hl⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) use Multiset.toList s use c +lemma coeff_monomial_selection_rule (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) + (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [σ ψ]ₑ) + (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv) (hV : IsInvariant V) : + coeff (s.map σ) V = rep g (coeff s V) := by + suffices h : ∀ W, coeff (s.map σ) (rep g W) = rep g (coeff s W) by + specialize h V + rw [hV g] at h + exact h + intro W + induction' mem_termOfList_span W using Submodule.span_induction with W' hW' x y _ _ hx hy + a x _ hx + · simp only [Set.mem_range] at hW' + obtain ⟨l, rfl⟩ := hW' + rw [rep_termOfList_of_monomial g σ d hg, map_smul, + coeff_apply_termOfList, coeff_apply_termOfList] + have hcond : Multiset.ofList (List.map σ l) = Multiset.map σ s ↔ + Multiset.ofList l = s := by + rw [← Multiset.map_coe] + exact ⟨fun hc => Multiset.map_injective σ.injective hc, fun hc => by rw [hc]⟩ + split_ifs with h1 h2 h2 + · rw [rep_termOfList_of_monomial g σ d hg] + · exact absurd (hcond.mp h1) h2 + · exact absurd (hcond.mpr h2) h1 + · simp + · simp + · simp [hx, hy] + · simp [hx] + /-- If the action of `g` is to permute the fields, then it defines a relation between the coefficients of the effective potential. -/ lemma coeff_perm_selection_rule (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) (hg : ∀ ψ, rep g [ψ]ₑ = [σ ψ]ₑ) (s : Multiset FieldSpecification) - (V : EffectivePotential) (hV : IsInvariant V) : + (V : EFTLagrangianExclDeriv) (hV : IsInvariant V) : coeff (s.map σ) V = rep g (coeff s V) := by - have hterm : ∀ l : List FieldSpecification, - rep g (termOfList l) = termOfList (l.map σ) := by - intro l - induction l with - | nil => simp - | cons a l ih => - rw [termOfList_cons, rep_mul, hg, ih, List.map_cons, termOfList_cons] - have hcomm : ∀ W : EffectivePotential, - coeff (s.map σ) (rep g W) = rep g (coeff s W) := by - intro W - induction' mem_termOfList_span W using Submodule.span_induction with W' hW' x y _ _ hx hy - a x _ hx - · simp only [Set.mem_range] at hW' - obtain ⟨l, rfl⟩ := hW' - rw [hterm, coeff_apply_termOfList, coeff_apply_termOfList] - have hcond : Multiset.ofList (List.map σ l) = Multiset.map σ s ↔ - Multiset.ofList l = s := by - rw [← Multiset.map_coe] - exact ⟨fun hc => Multiset.map_injective σ.injective hc, fun hc => by rw [hc]⟩ - by_cases hc : Multiset.ofList l = s - · rw [if_pos (hcond.mpr hc), if_pos hc, hterm] - · rw [if_neg (fun hcon => hc (hcond.mp hcon)), if_neg hc, map_zero] - · simp - · simp [map_add, hx, hy] - · simp [map_smul, hx] - conv_lhs => rw [← hV g] - exact hcomm V + apply coeff_monomial_selection_rule g σ (fun _ => 1) ?_ s V hV + intro ψ + simpa using hg ψ -lemma coeff_U1_selection_rule {V : EffectivePotential} (hV : IsInvariant V) +lemma coeff_U1_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) (g : SL(2, ℂ)) (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [ψ]ₑ) (s : Multiset FieldSpecification) (hs : (s.map d).prod ≠ 1) : coeff s V = 0 := by @@ -597,7 +618,7 @@ lemma coeff_U1_selection_rule {V : EffectivePotential} (hV : IsInvariant V) | cons a l ih => rw [termOfList_cons, rep_mul, hg, ih, List.map_cons, List.prod_cons, smul_mul_smul_comm] - have hcomm : ∀ W : EffectivePotential, + have hcomm : ∀ W : EFTLagrangianExclDeriv, coeff s (rep g W) = (s.map d).prod • coeff s W := by intro W induction' mem_termOfList_span W using Submodule.span_induction with W' hW' x y _ _ hx hy @@ -622,14 +643,14 @@ lemma coeff_U1_selection_rule {V : EffectivePotential} (hV : IsInvariant V) · exact h /-- The selection rule on coefficients coming from the anti-symmetry of fermionic fields. -/ -lemma coeff_fermionic_selection_rule {V : EffectivePotential} (hV : IsInvariant V) +lemma coeff_fermionic_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) (s : Multiset FieldSpecification) (hs : ¬ s.Nodup) : coeff s V = 0 := by sorry /-- The selection rule on coefficients saying that every term with an odd number of fermions is zero. -/ -lemma coeff_odd_selection_rule {V : EffectivePotential} (hV : IsInvariant V) +lemma coeff_odd_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) (s : Multiset FieldSpecification) (hs : Odd s.card) : coeff s V = 0 := by refine coeff_U1_selection_rule hV (g := -1) (d := fun ψ => -1) ?_ s ?_ @@ -814,7 +835,7 @@ lemma eq_sum_massDimCoeff (V : EffectivePotential) : -/ -end EffectivePotential +end EFTLagrangianExclDeriv end end Fermion From 73f9282178edb2fa3defba3b88aa789be91ddbd7 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 17 Jul 2026 08:47:28 +0100 Subject: [PATCH 034/254] fix: build --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 124 ++++++++---------- 1 file changed, 54 insertions(+), 70 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 3fb0ca13e..9adbba52a 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -31,14 +31,14 @@ exterior algebra. Thus, the type in which the potential lives is `ExteriorAlgebra ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl))`. -We call this type `EffectivePotential` and define it and its properties in this file. +We call this type `EFTLagrangianExclDeriv` and define it and its properties in this file. Note that `Module.Dual ℂ LeftHandedWeyl` is equivalent to `DualLeftHandedWeyl` and `Module.Dual ℂ (ConjModule LeftHandedWeyl)` is equivalent to `DualRightHandedWeyl`, so we could equivalently define the effective potential as `ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl)`. We have done the former here as it generalises to other cases. -On `EffectivePotential` we define a representation of the Lorentz group, and prove that that +On `EFTLagrangianExclDeriv` we define a representation of the Lorentz group, and prove that that if the potential is invariant under the Lorentz group it must be of the form `c + m1 * ψ 0 * ψ 1 + m2 * barψ 0 * barψ 1 + λ * ψ 0 * ψ 1 * barψ 0 * barψ 1`, which is true to all orders. @@ -80,7 +80,7 @@ namespace EFTLagrangianExclDeriv -/ -/-- The representation of the Lorentz group (here `SL(2, ℂ)`) on `EffectivePotential`. -/ +/-- The representation of the Lorentz group (here `SL(2, ℂ)`) on `EFTLagrangianExclDeriv`. -/ def rep : Representation ℂ SL(2, ℂ) EFTLagrangianExclDeriv where toFun Λ := (ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap (LeftHandedWeyl.rep.conj.dual Λ))).toLinearMap @@ -186,33 +186,33 @@ def moduleBasis : Basis FieldSpecification ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) := (LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex toSumFin.symm -def toEffectivePotential (ψ : FieldSpecification) : EFTLagrangianExclDeriv := +def toEFTLagrangianExclDeriv (ψ : FieldSpecification) : EFTLagrangianExclDeriv := ExteriorAlgebra.ι ℂ (moduleBasis ψ) -scoped notation "[" v "]ₑ" => toEffectivePotential v +scoped notation "[" v "]ₑ" => toEFTLagrangianExclDeriv v -lemma toEffectivePotential_eq (ψ : FieldSpecification) : - toEffectivePotential ψ = ExteriorAlgebra.ι ℂ (moduleBasis ψ) := rfl +lemma toEFTLagrangianExclDeriv_eq (ψ : FieldSpecification) : + toEFTLagrangianExclDeriv ψ = ExteriorAlgebra.ι ℂ (moduleBasis ψ) := rfl -lemma toEffectivePotential_ψ_eq (α : Fin 2) : [ψ α]ₑ = +lemma toEFTLagrangianExclDeriv_ψ_eq (α : Fin 2) : [ψ α]ₑ = ExteriorAlgebra.ι ℂ (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) := by - fin_cases α <;> simp [toEffectivePotential_eq, moduleBasis, toSumFin] + fin_cases α <;> simp [toEFTLagrangianExclDeriv_eq, moduleBasis, toSumFin] -lemma toEffectivePotential_barψ_eq (α : Fin 2) : [barψ α]ₑ = +lemma toEFTLagrangianExclDeriv_barψ_eq (α : Fin 2) : [barψ α]ₑ = ExteriorAlgebra.ι ℂ (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) := by - fin_cases α <;> simp [toEffectivePotential_eq, moduleBasis, toSumFin] + fin_cases α <;> simp [toEFTLagrangianExclDeriv_eq, moduleBasis, toSumFin] @[simp] -lemma toEffectivePotential_mul_self (ψ : FieldSpecification) : [ψ]ₑ * [ψ]ₑ = 0 := by - simp [toEffectivePotential_eq] +lemma toEFTLagrangianExclDeriv_mul_self (ψ : FieldSpecification) : [ψ]ₑ * [ψ]ₑ = 0 := by + simp [toEFTLagrangianExclDeriv_eq] -lemma toEffectivePotential_mul_anti_commute (ψ χ : FieldSpecification) : +lemma toEFTLagrangianExclDeriv_mul_anti_commute (ψ χ : FieldSpecification) : [ψ]ₑ * [χ]ₑ = - [χ]ₑ * [ψ]ₑ := by - simp [toEffectivePotential_eq, neg_mul, eq_neg_iff_add_eq_zero] + simp [toEFTLagrangianExclDeriv_eq, neg_mul, eq_neg_iff_add_eq_zero] -lemma rep_apply_toEffectivePotential_ψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : +lemma rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : rep Λ [ψ α]ₑ = ∑ (β : Fin 2), Λ⁻¹ α β • [ψ β]ₑ := by - simp only [toEffectivePotential_ψ_eq, Basis.coe_dualBasis, LinearMap.coe_inl, rep_apply, + simp only [toEFTLagrangianExclDeriv_ψ_eq, Basis.coe_dualBasis, LinearMap.coe_inl, rep_apply, Representation.dual_apply, ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, ← map_smul, Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, ExteriorAlgebra.ι_inj, Prod.mk.injEq, and_true] @@ -221,9 +221,9 @@ lemma rep_apply_toEffectivePotential_ψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, -SpecialLinearGroup.coe_inv] -lemma rep_apply_toEffectivePotential_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : +lemma rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : rep Λ [barψ α]ₑ = ∑ β, star (Λ⁻¹ α β) • [barψ β]ₑ := by - simp only [toEffectivePotential_barψ_eq, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, Representation.dual_apply, + simp only [toEFTLagrangianExclDeriv_barψ_eq, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, Representation.dual_apply, ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, RCLike.star_def, ← map_smul, Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] @@ -269,7 +269,7 @@ open FieldSpecification -/ def termOfList (l : List FieldSpecification) : EFTLagrangianExclDeriv := - (l.map toEffectivePotential).prod + (l.map toEFTLagrangianExclDeriv).prod lemma termOfList_cons (ψ : FieldSpecification) (l : List FieldSpecification) : termOfList (ψ :: l) = [ψ]ₑ * termOfList l := by simp [termOfList] @@ -291,7 +291,7 @@ lemma mul_termOfList_of_mem (ψ : FieldSpecification) (l : List FieldSpecificati | cons β t ih => rcases List.mem_cons.mp hψ with rfl | ha · simp [termOfList_cons, ← mul_assoc] - · simp [termOfList_cons, ← mul_assoc, toEffectivePotential_mul_anti_commute ψ β] + · simp [termOfList_cons, ← mul_assoc, toEFTLagrangianExclDeriv_mul_anti_commute ψ β] simp [mul_assoc, ih ha] lemma termOfList_zero_of_not_nodup (l : List FieldSpecification) (h : ¬ l.Nodup) : @@ -307,7 +307,7 @@ lemma termOfList_zero_of_not_nodup (l : List FieldSpecification) (h : ¬ l.Nodup · rw [ih fun hn => h (List.nodup_cons.mpr ⟨hmem, hn⟩), mul_zero] lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List FieldSpecification) : - rep Λ (termOfList l) = ((l.map toEffectivePotential).map (rep Λ)).prod := by + rep Λ (termOfList l) = ((l.map toEFTLagrangianExclDeriv).map (rep Λ)).prod := by induction l with | nil => simp | cons i l ih => @@ -323,7 +323,7 @@ lemma rep_termOfList_of_monomial (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecific rw [termOfList_cons, rep_mul, hg, ih] simp [termOfList_cons, smul_smul, mul_comm] -lemma rep_scale_termOfList_of_rep_scale_toEffectivePotential (Λ : SL(2, ℂ)) +lemma rep_scale_termOfList_of_rep_scale_toEFTLagrangianExclDeriv (Λ : SL(2, ℂ)) (h : ∀ ψ, ∃ c : ℂ, rep Λ [ψ]ₑ = c • [ψ]ₑ) (l : List FieldSpecification) : ∃ c : ℂ, rep Λ (termOfList l) = c • termOfList l := by induction l with @@ -372,7 +372,7 @@ lemma termOfList_perm_neq_zero {l1 l2 : List FieldSpecification} (h : l1.Perm l2 | swap x y l => refine ⟨-1, ?_⟩ rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc, - toEffectivePotential_mul_anti_commute y x] + toEFTLagrangianExclDeriv_mul_anti_commute y x] simp [mul_assoc] | trans _ _ ih1 ih2 => obtain ⟨c1, hc1, hc1'⟩ := ih1 @@ -610,35 +610,20 @@ lemma coeff_U1_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) (g : SL(2, ℂ)) (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [ψ]ₑ) (s : Multiset FieldSpecification) (hs : (s.map d).prod ≠ 1) : coeff s V = 0 := by - have hterm : ∀ l : List FieldSpecification, - rep g (termOfList l) = (l.map d).prod • termOfList l := by - intro l - induction l with - | nil => simp - | cons a l ih => - rw [termOfList_cons, rep_mul, hg, ih, List.map_cons, List.prod_cons, - smul_mul_smul_comm] - have hcomm : ∀ W : EFTLagrangianExclDeriv, - coeff s (rep g W) = (s.map d).prod • coeff s W := by - intro W - induction' mem_termOfList_span W using Submodule.span_induction with W' hW' x y _ _ hx hy - a x _ hx - · simp only [Set.mem_range] at hW' - obtain ⟨l, rfl⟩ := hW' - rw [hterm, map_smul, coeff_apply_termOfList] - by_cases hc : Multiset.ofList l = s - · rw [if_pos hc, ← hc, Multiset.map_coe, Multiset.prod_coe] - · simp [if_neg hc] - · simp - · simp [map_add, hx, hy] - · simp only [map_smul, hx] - rw [smul_comm] - have hfix : coeff s V = (s.map d).prod • coeff s V := by - conv_lhs => rw [← hV g] - exact hcomm V - have h1 : (1 - (s.map d).prod) • coeff s V = 0 := by - rw [sub_smul, one_smul, ← hfix, sub_self] - rcases smul_eq_zero.mp h1 with h | h + have h1 : coeff s V = rep g (coeff s V) := by + simpa using coeff_monomial_selection_rule g (Equiv.refl FieldSpecification) d + (by simpa using hg) s V hV + have hfix : rep g (coeff s V) = (s.map d).prod • coeff s V := by + obtain ⟨c, hl⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) + have hprod : ((Multiset.toList s).map d).prod = (s.map d).prod := by + rw [← Multiset.coe_toList s] + simp + rw [hl, map_smul, + rep_termOfList_of_monomial g (Equiv.refl FieldSpecification) d (by simpa using hg)] + simp [smul_smul, hprod, mul_comm] + have h2 : (1 - (s.map d).prod) • coeff s V = 0 := by + rw [sub_smul, one_smul, ← hfix, ← h1, sub_self] + rcases smul_eq_zero.mp h2 with h | h · exact absurd (sub_eq_zero.mp h).symm hs · exact h @@ -651,8 +636,7 @@ lemma coeff_fermionic_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvari /-- The selection rule on coefficients saying that every term with an odd number of fermions is zero. -/ lemma coeff_odd_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) - (s : Multiset FieldSpecification) (hs : Odd s.card) : - coeff s V = 0 := by + (s : Multiset FieldSpecification) (hs : Odd s.card) : coeff s V = 0 := by refine coeff_U1_selection_rule hV (g := -1) (d := fun ψ => -1) ?_ s ?_ · intro ψ sorry @@ -661,7 +645,7 @@ lemma coeff_odd_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) /-- The support of an effective potential: the set of multisets of field specifications for which the corresponding coefficient is non-zero. -/ -def support (V : EffectivePotential) : Finset (Multiset FieldSpecification) := +def support (V : EFTLagrangianExclDeriv) : Finset (Multiset FieldSpecification) := Set.Finite.toFinset (s := {s | coeff s V ≠ 0}) <| by induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy a x _ hx @@ -687,25 +671,25 @@ def support (V : EffectivePotential) : Finset (Multiset FieldSpecification) := grind @[simp] -lemma support_zero_eq_empty : support (0 : EffectivePotential) = ∅ := by +lemma support_zero_eq_empty : support (0 : EFTLagrangianExclDeriv) = ∅ := by simp [support] -lemma mem_support_iff {V : EffectivePotential} {s : Multiset FieldSpecification} : +lemma mem_support_iff {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} : s ∈ support V ↔ coeff s V ≠ 0 := by simp [support] -lemma support_add {V W : EffectivePotential} : +lemma support_add {V W : EFTLagrangianExclDeriv} : support (V + W) ⊆ support V ∪ support W := by sorry -lemma support_smul {V : EffectivePotential} (c : ℂ) : +lemma support_smul {V : EFTLagrangianExclDeriv} (c : ℂ) : support (c • V) ⊆ support V := by simp [support] -lemma support_smul_neq_zero {V : EffectivePotential} (c : ℂ) (hc : c ≠ 0) : +lemma support_smul_neq_zero {V : EFTLagrangianExclDeriv} (c : ℂ) (hc : c ≠ 0) : support (c • V) = support V := by simp [support, hc] -lemma eq_sum_support_coeff (V : EffectivePotential) : V = ∑ s ∈ support V, coeff s V := by +lemma eq_sum_support_coeff (V : EFTLagrangianExclDeriv) : V = ∑ s ∈ support V, coeff s V := by sorry lemma mem_support_termOfList_iff {l : List FieldSpecification} (s : Multiset FieldSpecification): @@ -715,7 +699,7 @@ lemma mem_support_termOfList_iff {l : List FieldSpecification} (s : Multiset Fie /-- A general result related to whether a multiset of field specifications is excluded from the support of an effective potential due to a selection rule based on the group action. -/ -lemma support_selection_rule {V : EffectivePotential} (hV : IsInvariant V) +lemma support_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) {s : Multiset FieldSpecification} (selection_rule : ∃ g : SL(2, ℂ), ∃ l : List FieldSpecification, ∃ c : ℂ, @@ -786,7 +770,7 @@ lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecifi -/ -def irrepCoeff (i : Multiset Irrep) : EffectivePotential →ₗ[ℂ] EffectivePotential where +def irrepCoeff (i : Multiset Irrep) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv where toFun := fun V => ∑ s ∈ support V, if Multiset.map toIrrep s = i then coeff s V else 0 map_add' := by intro V W @@ -795,15 +779,15 @@ def irrepCoeff (i : Multiset Irrep) : EffectivePotential →ₗ[ℂ] EffectivePo intro c V sorry -def irrepSupport (V : EffectivePotential) : Finset (Multiset Irrep) := +def irrepSupport (V : EFTLagrangianExclDeriv) : Finset (Multiset Irrep) := (support V).image (Multiset.map toIrrep) -lemma irrepCoeff_rep {i : Multiset Irrep} {V : EffectivePotential} (g : SL(2, ℂ)) : +lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2, ℂ)) : rep g (irrepCoeff i V) = irrepCoeff i (rep g V) := by sorry -lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EffectivePotential} (hV : IsInvariant V) : +lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) : irrepCoeff {Irrep.ψ, Irrep.barψ} V = 0 := by sorry /-! @@ -812,7 +796,7 @@ lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EffectivePotential} (hV : -/ -def massDimCoeff (n : ℚ) : EffectivePotential →ₗ[ℂ] EffectivePotential where +def massDimCoeff (n : ℚ) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv where toFun := fun V => ∑ s ∈ support V, if (s.map massDimension).sum = n then coeff s V else 0 map_add' := by intro V W @@ -821,10 +805,10 @@ def massDimCoeff (n : ℚ) : EffectivePotential →ₗ[ℂ] EffectivePotential w intro c V sorry -def massDimSupport (V : EffectivePotential) : Finset ℚ := +def massDimSupport (V : EFTLagrangianExclDeriv) : Finset ℚ := (support V).image (fun s => (s.map massDimension).sum) -lemma eq_sum_massDimCoeff (V : EffectivePotential) : +lemma eq_sum_massDimCoeff (V : EFTLagrangianExclDeriv) : V = ∑ n ∈ massDimSupport V, massDimCoeff n V := by sorry From 5517c2d167ce55f676130daf70e7e11b2e8d3df4 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 17 Jul 2026 09:01:24 +0100 Subject: [PATCH 035/254] feat: fill in sorry --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 69 +++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 9adbba52a..b323a5e89 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -415,7 +415,6 @@ lemma termOfTuple_perm {n} (g : Fin n → FieldSpecification) {i j : Fin n} (hij rw [termOfTuple_eq_ιMulti, termOfTuple_eq_ιMulti] exact AlternatingMap.map_swap (ExteriorAlgebra.ιMulti ℂ n) (fun k => moduleBasis (g k)) hij - def termOfVectTuple {n} : AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) EFTLagrangianExclDeriv (Fin n) := ExteriorAlgebra.ιMulti ℂ n @@ -677,9 +676,14 @@ lemma support_zero_eq_empty : support (0 : EFTLagrangianExclDeriv) = ∅ := by lemma mem_support_iff {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} : s ∈ support V ↔ coeff s V ≠ 0 := by simp [support] +lemma coeff_eq_zero_of_not_mem_support {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} + (h : s ∉ support V) : coeff s V = 0 := by + simpa [support, Set.Finite.mem_toFinset] using h + lemma support_add {V W : EFTLagrangianExclDeriv} : support (V + W) ⊆ support V ∪ support W := by - sorry + simp [support] + grind lemma support_smul {V : EFTLagrangianExclDeriv} (c : ℂ) : support (c • V) ⊆ support V := by @@ -689,23 +693,59 @@ lemma support_smul_neq_zero {V : EFTLagrangianExclDeriv} (c : ℂ) (hc : c ≠ 0 support (c • V) = support V := by simp [support, hc] -lemma eq_sum_support_coeff (V : EFTLagrangianExclDeriv) : V = ∑ s ∈ support V, coeff s V := by - sorry - lemma mem_support_termOfList_iff {l : List FieldSpecification} (s : Multiset FieldSpecification): s ∈ support (termOfList l) ↔ s = Multiset.ofList l ∧ termOfList l ≠ 0 := by simp [support, coeff_apply_termOfList] grind -/-- A general result related to whether a multiset of field specifications is excluded from -the support of an effective potential due to a selection rule based on the group action. -/ -lemma support_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) - {s : Multiset FieldSpecification} - (selection_rule : ∃ g : SL(2, ℂ), - ∃ l : List FieldSpecification, ∃ c : ℂ, - rep g (termOfList l) = c • termOfList l ∧ Multiset.ofList l = s) : - s ∉ support V := by - sorry +lemma support_termOfList_subset (l : List FieldSpecification) : + support (termOfList l) ⊆ {Multiset.ofList l} := by + intro s hs + simp [mem_support_termOfList_iff] at hs + simp [hs.1] + +lemma eq_sum_support_coeff (V : EFTLagrangianExclDeriv) : V = ∑ s ∈ support V, coeff s V := by + induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy + a x _ hx + · simp only [Set.mem_range] at hV' + obtain ⟨l, rfl⟩ := hV' + trans ∑ s ∈ {Multiset.ofList l}, coeff s (termOfList l); swap + · symm + apply Finset.sum_subset (support_termOfList_subset l) + simp + intro hl + simp [mem_support_termOfList_iff] at hl + rw [hl] + simp + · simp [coeff_apply_termOfList] + · simp + · trans ∑ s ∈ x.support ∪ y.support, coeff s (x + y); swap + · symm + apply Finset.sum_subset + · simp [support_add] + · intro s hs hs' + exact coeff_eq_zero_of_not_mem_support hs' + · conv_lhs => rw [hx, hy] + simp [Finset.sum_add_distrib] + congr 1 + · apply Finset.sum_subset + · simp + · intro s hs hs' + exact coeff_eq_zero_of_not_mem_support hs' + · apply Finset.sum_subset + · simp + · intro s hs hs' + exact coeff_eq_zero_of_not_mem_support hs' + · trans ∑ s ∈ (support x).image (fun s => s), coeff s (a • x); swap + · symm + apply Finset.sum_subset + · simp [support_smul] + · intro s hs hs' + exact coeff_eq_zero_of_not_mem_support hs' + conv_lhs => rw [hx] + simp [Finset.smul_sum] + + /-! ## @@ -762,6 +802,7 @@ lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecifi rw [mem_support_termOfList_iff] at ht' simpa using ht'.1 + /-! From c3c81780e24b3ceac86b801545b5128dfe95b86e Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 17 Jul 2026 09:52:03 +0100 Subject: [PATCH 036/254] Update EFTLagrangianExclDeriv.lean --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index b323a5e89..be94ba9cf 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -147,7 +147,7 @@ end EFTLagrangianExclDeriv inductive FieldSpecification : Type | ψ (α : Fin 2) : FieldSpecification | barψ (α : Fin 2) : FieldSpecification -deriving DecidableEq +deriving DecidableEq, Repr namespace FieldSpecification @@ -253,7 +253,7 @@ def toIrrep : FieldSpecification → Irrep -/ -def massDimension : FieldSpecification → ℕ +def massDimension : FieldSpecification → ℚ | .ψ _ => 3 / 2 | .barψ _ => 3 / 2 @@ -811,18 +811,26 @@ lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecifi -/ -def irrepCoeff (i : Multiset Irrep) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv where - toFun := fun V => ∑ s ∈ support V, if Multiset.map toIrrep s = i then coeff s V else 0 - map_add' := by - intro V W - sorry - map_smul' := by - intro c V - sorry +/-- The field content of a term which corresponds to a given irrep content. -/ +def allTermsWithIrrepContent (i : Multiset Irrep) : Finset (Multiset FieldSpecification) := + ((Finset.univ.sym i.card).image Sym.toMultiset).filter (fun s => Multiset.map toIrrep s = i) + +/-- The projection of a term of `EFTLagrangianExclDeriv` onto those operators which + have an irrep content determined by `i`. -/ +def irrepCoeff (i : Multiset Irrep) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := + ∑ s ∈ allTermsWithIrrepContent i, coeff s + +lemma irrepCoeff_eq_sum (i : Multiset Irrep) (V : EFTLagrangianExclDeriv) : + irrepCoeff i V = ∑ s ∈ allTermsWithIrrepContent i, coeff s V := by + simp [irrepCoeff] def irrepSupport (V : EFTLagrangianExclDeriv) : Finset (Multiset Irrep) := (support V).image (Multiset.map toIrrep) +lemma eq_sum_irrepCoeff (V : EFTLagrangianExclDeriv) : + V = ∑ i ∈ irrepSupport V, irrepCoeff i V := by + sorry + lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2, ℂ)) : rep g (irrepCoeff i V) = irrepCoeff i (rep g V) := by sorry @@ -837,6 +845,12 @@ lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (h -/ +def allTermsWithMassDimension (n : ℚ) : Finset (Multiset FieldSpecification) := + -- Since there is no mass dimension less then 1, a term with mass dimension n + -- can have at most `n` fields + let x := List.range (Rat.ceil n + 1).toNat + + ((Finset.univ.sym x.card).image Sym.toMultiset).filter (fun s => (s.map massDimension).sum = n) def massDimCoeff (n : ℚ) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv where toFun := fun V => ∑ s ∈ support V, if (s.map massDimension).sum = n then coeff s V else 0 map_add' := by From 44432f83ffd1a8e1d8e416654bf3ac393f77a1ae Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:18:12 +0100 Subject: [PATCH 037/254] refactor: Add results about irreps --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 74 ++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index be94ba9cf..39d886bb6 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -247,6 +247,16 @@ def toIrrep : FieldSpecification → Irrep | .ψ _ => .ψ | .barψ _ => .barψ +lemma rep_apply_toEFTLagrangianExclDeriv_mem_irrep (Λ : SL(2, ℂ)) (ψ : FieldSpecification) : + ∃ n, ∃ F : Fin n → FieldSpecification, (∃ f : Fin n → ℂ, rep Λ [ψ]ₑ = ∑ x, f x • [F x]ₑ) ∧ + (∀ x, toIrrep (F x) = toIrrep ψ) := by + match ψ with + | .ψ α => + exact ⟨2, .ψ, ⟨Λ⁻¹ α, rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum Λ α⟩, by simp [toIrrep]⟩ + | .barψ α => + exact ⟨2, .barψ, ⟨star (Λ⁻¹ α), rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum Λ α⟩, + by simp [toIrrep]⟩ + /-! ## Mass dimension @@ -335,6 +345,35 @@ lemma rep_scale_termOfList_of_rep_scale_toEFTLagrangianExclDeriv (Λ : SL(2, ℂ simp [termOfList_cons, rep_mul, hcψ, hct] module + +lemma rep_termOfList_eq_sum_of_toIrrep (Λ : SL(2, ℂ)) (l : List FieldSpecification) : + ∃ n, ∃ F : Fin n → List FieldSpecification, + (∃ f : Fin n → ℂ, rep Λ (termOfList l) = ∑ x, f x • termOfList (F x)) ∧ + (∀ x, (F x).map toIrrep = l.map toIrrep) := by + induction l with + | nil => + refine ⟨1, fun _ => [], ⟨fun _ => 1, by simp⟩, fun _ => rfl⟩ + | cons ψ t ih => + obtain ⟨n, F, ⟨f, hf⟩, hF⟩ := ih + obtain ⟨nψ, Fψ, ⟨fψ, hfψ⟩, hFψ⟩ := rep_apply_toEFTLagrangianExclDeriv_mem_irrep Λ ψ + use nψ * n + let F' : Fin nψ × Fin n → List FieldSpecification := fun ⟨i, j⟩ => Fψ i :: F j + use F' ∘ finProdFinEquiv.symm + refine ⟨?_, ?_⟩ + · use (fun ⟨i, j⟩ => fψ i * f j) ∘ finProdFinEquiv.symm + rw [← finProdFinEquiv.sum_comp] + simp [termOfList_cons, rep_mul, F', hfψ, hf] + rw [Fintype.sum_mul_sum, Fintype.sum_prod_type] + simp [smul_smul] + congr + funext x + congr + funext y + ring_nf + · intro x + obtain ⟨x, rfl⟩ := finProdFinEquiv.surjective x + simp [F', hF, hFψ] + lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : V ∈ Submodule.span ℂ (Set.range termOfList) := by induction V using ExteriorAlgebra.induction with @@ -815,6 +854,11 @@ lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecifi def allTermsWithIrrepContent (i : Multiset Irrep) : Finset (Multiset FieldSpecification) := ((Finset.univ.sym i.card).image Sym.toMultiset).filter (fun s => Multiset.map toIrrep s = i) +lemma mem_allTermsWithIrrepContent_iff (i : Multiset Irrep) (s : Multiset FieldSpecification) : + s ∈ allTermsWithIrrepContent i ↔ Multiset.map toIrrep s = i := by + simp [allTermsWithIrrepContent] + sorry + /-- The projection of a term of `EFTLagrangianExclDeriv` onto those operators which have an irrep content determined by `i`. -/ def irrepCoeff (i : Multiset Irrep) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := @@ -824,6 +868,19 @@ lemma irrepCoeff_eq_sum (i : Multiset Irrep) (V : EFTLagrangianExclDeriv) : irrepCoeff i V = ∑ s ∈ allTermsWithIrrepContent i, coeff s V := by simp [irrepCoeff] +lemma irrepCoeff_one (i : Multiset Irrep) : irrepCoeff i 1 = if i = ∅ then 1 else 0 := by + simp [irrepCoeff, coeff_one, allTermsWithIrrepContent] + split_ifs with hi <;> simp_all + rename_i h + subst h + apply hi ⟨∅, by simp⟩ + simp + +lemma irrepCoeff_termOfList (i : Multiset Irrep) (l : List FieldSpecification) : + irrepCoeff i (termOfList l) = if Multiset.map toIrrep (Multiset.ofList l) = i then + termOfList l else 0 := by + simp [irrepCoeff, coeff_apply_termOfList, mem_allTermsWithIrrepContent_iff] + def irrepSupport (V : EFTLagrangianExclDeriv) : Finset (Multiset Irrep) := (support V).image (Multiset.map toIrrep) @@ -831,10 +888,21 @@ lemma eq_sum_irrepCoeff (V : EFTLagrangianExclDeriv) : V = ∑ i ∈ irrepSupport V, irrepCoeff i V := by sorry -lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2, ℂ)) : - rep g (irrepCoeff i V) = irrepCoeff i (rep g V) := by +lemma irrepCoeff_rep_apply_fieldSpecification {i : Multiset Irrep} (g : SL(2, ℂ)) + (ψ : FieldSpecification) : + rep g (irrepCoeff i [ψ]ₑ) = irrepCoeff i (rep g [ψ]ₑ) := by sorry +lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2, ℂ)) : + rep g (irrepCoeff i V) = irrepCoeff i (rep g V) := by + induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy + a x _ hx + · simp only [Set.mem_range] at hV' + obtain ⟨l, rfl⟩ := hV' + sorry -- use rep_termOfList_eq_sum_of_toIrrep + · simp + · simp [hx, hy] + · simp [hx] lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) : irrepCoeff {Irrep.ψ, Irrep.barψ} V = 0 := by @@ -845,6 +913,8 @@ lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (h -/ +def upperBoundNumberOfFields (n : ℚ) : ℕ := by + let d := Fin.minimum massDimension def allTermsWithMassDimension (n : ℚ) : Finset (Multiset FieldSpecification) := -- Since there is no mass dimension less then 1, a term with mass dimension n -- can have at most `n` fields From 44142a8c4be1417097dfa786ce332421fcdd6018 Mon Sep 17 00:00:00 2001 From: Jinzheng Li Date: Mon, 20 Jul 2026 07:54:24 -0400 Subject: [PATCH 038/254] feat: complete sorries and mass-dimension section of the fermionic EFT Lagrangian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fill all eleven remaining sorries in Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean: - coeff_fermionic_selection_rule: via termOfList_zero_of_not_nodup. The IsInvariant hypothesis is dropped: the rule holds for any potential. - coeff_odd_selection_rule: fermion parity, via the new rep_neg_one_apply (the special case z = -1 of the diagonal family below). - mem_allTermsWithIrrepContent_iff: via multisetsOfCard. - eq_sum_irrepCoeff, eq_sum_massDimCoeff: via a new generic regrouping lemma eq_sum_fiber_coeff (decomposition of the support sum along any classifying map with specified fibers). - irrepCoeff_rep, irrepCoeff_rep_apply_fieldSpecification: via rep_termOfList_eq_sum_of_toIrrep, through a shared monomial helper. - irrepCoeff_ψ_barψ_eq_zero_of_isInvariant: no Lorentz-invariant operator mixes ψ with barψ. Proved with the new diagonal family diagSL (z : ℂˣ) : SL(2,ℂ) at z = 2i: the scaling factors of the four mixed pairs are 1/4, -1, -1 and 4, all ≠ 1, so coeff_U1_selection_rule applies. (Real diagonal elements, i.e. pure boosts, are insufficient: they scale the off-diagonal pairs by 1.) A TODO records that diagSL, diagSL_inv, diagSL_neg_one and twoI should move to Physlib.Relativity.SL2C.Basic when this development is split. Repair the mass-dimension section, which did not compile: - allTermsWithMassDimension is now the computable multisetsOfMassDim from the new file Physlib/Mathematics/MultisetsOfMassDim.lean (Finset.sym enumeration bounded by ⌊m / d_min⌋, with an ℕ-scaled decide-friendly variant and a denominator-clearing bridge lemma, as discussed on Zulip). upperBoundNumberOfFields is superseded by massDimCardBound. - massDimCoeff is defined as a sum of coeff over this fixed finset, so linearity holds by construction (removing the map_add'/map_smul' sorries). - decide examples: {ψ 0, ψ 1} has mass dimension 3; the quartic does not. Also: - fix the stale import Physlib.Particles.PureFermionic.EffectivePotential in Physlib.lean (renamed to EFTLagrangianExclDeriv), which broke the full-library build; - add docstrings to all previously undocumented definitions; - add simp evaluation lemmas so definitions stay opaque downstream (toIrrep_ψ, toIrrep_barψ, massDimension_eq, massDimensionNat_eq, diagSL_inv, diagSL_neg_one, diagScale_neg_one, diagScale_twoI_ψ, diagScale_twoI_barψ) and the structural fact sum_map_massDimension. The changes passed a ten-angle rubric review (correctness, reuse, scope, attribution, api-design, generality, placement, naming, documentation, proof-quality); the review's requested changes (private bound lemmas, authors header, defeq and simp-annotation hygiene, structure comments) are incorporated, with the SL2C placement recorded as a TODO. Co-authored-by: Claude Fable 5 --- Physlib.lean | 3 +- Physlib/Mathematics/MultisetsOfMassDim.lean | 217 ++++++++++ .../PureFermionic/EFTLagrangianExclDeriv.lean | 371 +++++++++++++++--- 3 files changed, 541 insertions(+), 50 deletions(-) create mode 100644 Physlib/Mathematics/MultisetsOfMassDim.lean diff --git a/Physlib.lean b/Physlib.lean index ead3e603e..d561038e4 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -106,6 +106,7 @@ public import Physlib.Mathematics.LinearPMap public import Physlib.Mathematics.List public import Physlib.Mathematics.List.InsertIdx public import Physlib.Mathematics.List.InsertionSort +public import Physlib.Mathematics.MultisetsOfMassDim public import Physlib.Mathematics.PiTensorProduct public import Physlib.Mathematics.RatComplexNum public import Physlib.Mathematics.SO3.Basic @@ -165,7 +166,7 @@ public import Physlib.Particles.FlavorPhysics.CKMMatrix.Rows public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.Basic public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.StandardParameters public import Physlib.Particles.NeutrinoPhysics.Basic -public import Physlib.Particles.PureFermionic.EffectivePotential +public import Physlib.Particles.PureFermionic.EFTLagrangianExclDeriv public import Physlib.Particles.StandardModel.AnomalyCancellation.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.FamilyMaps public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.Basic diff --git a/Physlib/Mathematics/MultisetsOfMassDim.lean b/Physlib/Mathematics/MultisetsOfMassDim.lean new file mode 100644 index 000000000..993d96854 --- /dev/null +++ b/Physlib/Mathematics/MultisetsOfMassDim.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Nathaneal Sajan, Jinzheng Li +-/ +module + +public import Mathlib.Data.Finset.Sym +public import Mathlib.Data.Finset.Lattice.Fold +public import Mathlib.Data.Rat.Floor +public import Mathlib.Algebra.Order.BigOperators.Group.Multiset +/-! + +# Computable enumeration of multisets of a given mass dimension + +## i. Overview + +Given a finite type `F` of field specifications, a map `dim : F → ℚ` assigning to each field +its mass dimension (assumed positive), and a target `m : ℚ`, this file constructs, in a +computable way, the `Finset (Multiset F)` of all multisets of fields whose overall mass +dimension is `m`. This corresponds to the possible operators (terms) of mass dimension `m` +in an EFT Lagrangian built from the fields in `F` (excluding derivatives). + +The construction proceeds by noting that if `d` is the minimal mass dimension of a field, +then a multiset of mass dimension `m` has at most `⌊m / d⌋₊` elements. We therefore +enumerate all multisets of cardinality at most this bound using `Finset.sym`, and filter +by the mass-dimension condition. + +Since the construction is computable it can be used with `#eval`. However, rational +arithmetic does not reduce in the kernel, so `multisetsOfMassDim` can not directly be +used with `decide`. For this reason we also provide a version `multisetsOfMassDimNat` +with natural-number valued mass dimensions (corresponding to clearing denominators, +e.g. working in units of half mass dimensions so that a Weyl fermion has scaled +dimension `3`), which is `decide`-friendly. The lemma `multisetsOfMassDim_eq_natCast` +allows one to rewrite the former into the latter before calling `decide`. + +## Key results + +- `multisetsOfCard` : the finset of all multisets over `F` of a given cardinality. +- `multisetsOfMassDim` : the finset of all multisets over `F` of a given mass dimension. +- `mem_multisetsOfMassDim_iff` : the defining property + `s ∈ multisetsOfMassDim dim m ↔ (s.map dim).sum = m`, valid whenever `dim` is positive. +- `multisetsOfMassDimNat`, `mem_multisetsOfMassDimNat_iff` : the analogous construction + for natural-number valued (scaled) mass dimensions, usable with `decide`. +- `multisetsOfMassDim_eq_natCast` : the two constructions agree after clearing + denominators. + +-/ + +@[expose] public section + +variable {F : Type*} [Fintype F] + +/-! + +## A. Multisets of a given cardinality + +-/ + +/-- The finset of all multisets over a finite type `F` with exactly `n` elements. -/ +def multisetsOfCard (F : Type*) [Fintype F] [DecidableEq F] (n : ℕ) : + Finset (Multiset F) := + (Finset.univ.sym n).image Sym.toMultiset + +@[simp] +lemma mem_multisetsOfCard [DecidableEq F] {n : ℕ} {s : Multiset F} : + s ∈ multisetsOfCard F n ↔ Multiset.card s = n := by + constructor + · intro h + obtain ⟨x, -, rfl⟩ := Finset.mem_image.mp h + exact x.2 + · rintro rfl + exact Finset.mem_image.mpr + ⟨⟨s, rfl⟩, Finset.mem_sym_iff.mpr fun a _ => Finset.mem_univ a, rfl⟩ + +/-! + +## B. The bound on the cardinality + +-/ + +/-- The sum of `dim` over a multiset is at least the cardinality times the minimal + value of `dim`. Shared bound underlying `card_le_massDimCardBound` and + `card_le_massDimCardBoundNat`. -/ +lemma card_nsmul_inf'_le_sum_map {M : Type*} [AddCommMonoid M] [LinearOrder M] + [AddLeftMono M] (huniv : (Finset.univ : Finset F).Nonempty) (dim : F → M) + (s : Multiset F) : + Multiset.card s • Finset.univ.inf' huniv dim ≤ (s.map dim).sum := by + have h1 : Multiset.card (s.map dim) • Finset.univ.inf' huniv dim ≤ (s.map dim).sum := by + refine Multiset.card_nsmul_le_sum fun x hx => ?_ + obtain ⟨f, -, rfl⟩ := Multiset.mem_map.mp hx + exact Finset.inf'_le dim (Finset.mem_univ f) + simpa using h1 + +/-- An upper bound on the number of fields in a multiset of overall mass dimension `m`: + `⌊m / d⌋₊` where `d` is the minimal mass dimension of a field. Equal to `0` when + `F` is empty. -/ +def massDimCardBound (dim : F → ℚ) (m : ℚ) : ℕ := + if h : (Finset.univ : Finset F).Nonempty then ⌊m / Finset.univ.inf' h dim⌋₊ else 0 + +private lemma card_le_massDimCardBound {dim : F → ℚ} (hdim : ∀ f, 0 < dim f) {m : ℚ} + {s : Multiset F} (hs : (s.map dim).sum = m) : + Multiset.card s ≤ massDimCardBound dim m := by + rcases eq_or_ne s 0 with rfl | hne + · simp + obtain ⟨f0, -⟩ := Multiset.exists_mem_of_ne_zero hne + have huniv : (Finset.univ : Finset F).Nonempty := ⟨f0, Finset.mem_univ f0⟩ + rw [massDimCardBound, dif_pos huniv] + have hdpos : 0 < Finset.univ.inf' huniv dim := + (Finset.lt_inf'_iff huniv).mpr fun i _ => hdim i + have hle := hs ▸ card_nsmul_inf'_le_sum_map huniv dim s + refine Nat.le_floor ?_ + rw [le_div_iff₀ hdpos] + simpa [nsmul_eq_mul] using hle + +/-! + +## C. Multisets of a given mass dimension + +-/ + +/-- The finset of all multisets over a finite type `F` whose overall mass dimension, + as measured by `dim : F → ℚ`, is `m`. The defining property, valid when `dim` is + positive, is `mem_multisetsOfMassDim_iff`. -/ +def multisetsOfMassDim [DecidableEq F] (dim : F → ℚ) (m : ℚ) : Finset (Multiset F) := + ((Finset.range (massDimCardBound dim m + 1)).biUnion (multisetsOfCard F)).filter + fun s => (s.map dim).sum = m + +lemma mem_multisetsOfMassDim_iff [DecidableEq F] {dim : F → ℚ} (hdim : ∀ f, 0 < dim f) {m : ℚ} + {s : Multiset F} : + s ∈ multisetsOfMassDim dim m ↔ (s.map dim).sum = m := by + constructor + · exact fun h => (Finset.mem_filter.mp h).2 + · intro h + refine Finset.mem_filter.mpr ⟨Finset.mem_biUnion.mpr ⟨Multiset.card s, ?_, by simp⟩, h⟩ + exact Finset.mem_range.mpr (Nat.lt_succ_of_le (card_le_massDimCardBound hdim h)) + +/-! + +## D. Multisets of a given scaled (natural-number) mass dimension + +Rational arithmetic does not reduce in the kernel, so `multisetsOfMassDim` is usable +with `#eval` but not with `decide`. Clearing denominators in the mass dimensions +(e.g. working in units of half mass dimensions) reduces the problem to natural-number +valued dimensions, for which the analogous construction below is `decide`-friendly. + +-/ + +/-- An upper bound on the number of fields in a multiset of overall scaled mass + dimension `m`: `m / d` (natural-number division) where `d` is the minimal scaled + mass dimension of a field. Equal to `0` when `F` is empty. -/ +def massDimCardBoundNat (dim : F → ℕ) (m : ℕ) : ℕ := + if h : (Finset.univ : Finset F).Nonempty then m / Finset.univ.inf' h dim else 0 + +private lemma card_le_massDimCardBoundNat {dim : F → ℕ} (hdim : ∀ f, 0 < dim f) {m : ℕ} + {s : Multiset F} (hs : (s.map dim).sum = m) : + Multiset.card s ≤ massDimCardBoundNat dim m := by + rcases eq_or_ne s 0 with rfl | hne + · simp + obtain ⟨f0, -⟩ := Multiset.exists_mem_of_ne_zero hne + have huniv : (Finset.univ : Finset F).Nonempty := ⟨f0, Finset.mem_univ f0⟩ + rw [massDimCardBoundNat, dif_pos huniv] + have hdpos : 0 < Finset.univ.inf' huniv dim := + (Finset.lt_inf'_iff huniv).mpr fun i _ => hdim i + rw [Nat.le_div_iff_mul_le hdpos] + simpa [hs, smul_eq_mul] using card_nsmul_inf'_le_sum_map huniv dim s + +/-- The finset of all multisets over a finite type `F` whose overall scaled mass + dimension, as measured by `dim : F → ℕ`, is `m`. The defining property, valid when + `dim` is positive, is `mem_multisetsOfMassDimNat_iff`. Unlike `multisetsOfMassDim`, + this construction reduces in the kernel and can be used with `decide`. -/ +def multisetsOfMassDimNat [DecidableEq F] (dim : F → ℕ) (m : ℕ) : Finset (Multiset F) := + ((Finset.range (massDimCardBoundNat dim m + 1)).biUnion (multisetsOfCard F)).filter + fun s => (s.map dim).sum = m + +lemma mem_multisetsOfMassDimNat_iff [DecidableEq F] {dim : F → ℕ} (hdim : ∀ f, 0 < dim f) + {m : ℕ} {s : Multiset F} : + s ∈ multisetsOfMassDimNat dim m ↔ (s.map dim).sum = m := by + constructor + · exact fun h => (Finset.mem_filter.mp h).2 + · intro h + refine Finset.mem_filter.mpr ⟨Finset.mem_biUnion.mpr ⟨Multiset.card s, ?_, by simp⟩, h⟩ + exact Finset.mem_range.mpr (Nat.lt_succ_of_le (card_le_massDimCardBoundNat hdim h)) + +/-! + +## E. Relating the two constructions + +-/ + +/-- Clearing denominators: on multiplying all mass dimensions and the target mass + dimension by a common positive scale `N` rendering them all natural numbers, the + finset of multisets of a given mass dimension can be computed through + `multisetsOfMassDimNat`, and hence through `decide`. -/ +lemma multisetsOfMassDim_eq_natCast [DecidableEq F] {dim : F → ℚ} (hdim : ∀ f, 0 < dim f) + {dimN : F → ℕ} {N : ℕ} (hN : 0 < N) (hdimN : ∀ f, (dimN f : ℚ) = dim f * N) + {m : ℚ} {mN : ℕ} (hmN : (mN : ℚ) = m * N) : + multisetsOfMassDim dim m = multisetsOfMassDimNat dimN mN := by + have hNQ : (N : ℚ) ≠ 0 := Nat.cast_ne_zero.mpr hN.ne' + have hdimNpos : ∀ f, 0 < dimN f := fun f => by + have h1 : (0 : ℚ) < (dimN f : ℚ) := by + rw [hdimN f] + exact mul_pos (hdim f) (by exact_mod_cast hN) + exact_mod_cast h1 + ext s + rw [mem_multisetsOfMassDim_iff hdim, mem_multisetsOfMassDimNat_iff hdimNpos] + have key : ((s.map dimN).sum : ℚ) = (s.map dim).sum * N := by + induction s using Multiset.induction with + | empty => simp + | cons a t ih => simp [hdimN, ih, add_mul] + constructor + · intro h + have h1 : ((s.map dimN).sum : ℚ) = (mN : ℚ) := by rw [key, h, hmN] + exact_mod_cast h1 + · intro h + have h1 : (s.map dim).sum * (N : ℚ) = m * N := by rw [← key, h, hmN] + exact mul_right_cancel₀ hNQ h1 diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 39d886bb6..9709b6775 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1,7 +1,7 @@ /- Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan -/ module @@ -9,6 +9,7 @@ public import Physlib.Relativity.Fermions.Weyl.Metric public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Mathematics.ConjModule +public import Physlib.Mathematics.MultisetsOfMassDim public import Mathlib.RingTheory.GradedAlgebra.Basic /-! @@ -140,10 +141,56 @@ end EFTLagrangianExclDeriv /-! +### Diagonal elements of the Lorentz group + +The diagonal elements `diag (z, z⁻¹)` of `SL(2, ℂ)` scale each of the fields by a +factor, given below by `FieldSpecification.diagScale`. These elements are useful for +deriving selection rules on the effective potential. + +-/ + +TODO "Move the diagonal `SL(2, ℂ)` material `diagSL`, `diagSL_inv`, `diagSL_neg_one` + and `twoI` to `Physlib.Relativity.SL2C.Basic`, their canonical home, when the + effective-potential development is split up." + +/-- The diagonal element `diag (z, z⁻¹)` of `SL(2, ℂ)` associated with a unit `z : ℂˣ`. -/ +def diagSL (z : ℂˣ) : SL(2, ℂ) := + ⟨!![(z : ℂ), 0; 0, ((z⁻¹ : ℂˣ) : ℂ)], by simp [Matrix.det_fin_two_of]⟩ + +@[simp] +lemma diagSL_inv (z : ℂˣ) : (diagSL z)⁻¹ = diagSL z⁻¹ := by + rw [inv_eq_iff_mul_eq_one] + ext i j + fin_cases i <;> fin_cases j <;> simp [diagSL, Matrix.mul_apply, Fin.sum_univ_two] + +/-- The diagonal element at `z = -1` is the central element `-1` of the Lorentz + group (the lift of a rotation by `2π`). -/ +@[simp] +lemma diagSL_neg_one : diagSL (-1) = -1 := by + ext i j + fin_cases i <;> fin_cases j <;> simp [diagSL] + +/-- The unit `2 * I` of `ℂ`. The associated diagonal Lorentz transformation + `diagSL twoI` detects selection rules which real diagonal elements miss, since its + scaling factors mix in a phase under conjugation. -/ +def twoI : ℂˣ := + ⟨2 * I, -I / 2, by linear_combination -Complex.I_mul_I, by linear_combination -Complex.I_mul_I⟩ + +@[simp] +lemma twoI_val : ((twoI : ℂˣ) : ℂ) = 2 * I := (rfl) + +@[simp] +lemma twoI_inv_val : ((twoI⁻¹ : ℂˣ) : ℂ) = -I / 2 := (rfl) + +/-! + ### B. Field specification for the theory -/ +/-- The specification of the field components appearing in the effective potential: + the two components `ψ α` of the left-handed Weyl fermion and the two components + `barψ α` of its conjugate. -/ inductive FieldSpecification : Type | ψ (α : Fin 2) : FieldSpecification | barψ (α : Fin 2) : FieldSpecification @@ -174,18 +221,24 @@ makes it easy to do more calculational aspects. -/ +/-- The equivalence between `FieldSpecification` and `Fin 2 ⊕ Fin 2` sending `ψ α` to + the left and `barψ α` to the right component. -/ def toSumFin : FieldSpecification ≃ Fin 2 ⊕ Fin 2 where toFun := fun | .ψ (α : Fin 2) => Sum.inl α | .barψ α => Sum.inr α invFun := fun | .inl α => ψ α | .inr α => barψ α - left_inv ψ := by - fin_cases ψ <;> simp - right_inv x := by fin_cases x <;> simp + left_inv f := by cases f <;> rfl + right_inv x := by cases x <;> rfl +/-- The basis of the module underlying the effective potential indexed by + `FieldSpecification`: `ψ α` corresponds to the dual basis of the left-handed Weyl + fermion and `barψ α` to the dual basis of its conjugate. -/ def moduleBasis : Basis FieldSpecification ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) := (LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex toSumFin.symm +/-- The image of a field specification in the effective potential, as the + exterior-algebra generator of the corresponding basis vector. Denoted `[ψ]ₑ`. -/ def toEFTLagrangianExclDeriv (ψ : FieldSpecification) : EFTLagrangianExclDeriv := ExteriorAlgebra.ι ℂ (moduleBasis ψ) @@ -223,7 +276,8 @@ lemma rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2 lemma rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : rep Λ [barψ α]ₑ = ∑ β, star (Λ⁻¹ α β) • [barψ β]ₑ := by - simp only [toEFTLagrangianExclDeriv_barψ_eq, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, Representation.dual_apply, + simp only [toEFTLagrangianExclDeriv_barψ_eq, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, + Representation.dual_apply, ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, RCLike.star_def, ← map_smul, Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] @@ -234,28 +288,103 @@ lemma rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fi /-! +## Scaling of the fields under diagonal Lorentz transformations + +-/ + +/-- The factor by which the field specifications scale under the action of `diagSL z`. -/ +def diagScale (z : ℂˣ) : FieldSpecification → ℂ + | .ψ α => if α = 0 then ((z⁻¹ : ℂˣ) : ℂ) else z + | .barψ α => if α = 0 then star ((z⁻¹ : ℂˣ) : ℂ) else star (z : ℂ) + +lemma rep_diagSL_apply (z : ℂˣ) (φ : FieldSpecification) : + rep (diagSL z) [φ]ₑ = diagScale z φ • [φ]ₑ := by + match φ with + | .ψ α => + rw [rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum, diagSL_inv] + fin_cases α <;> simp [diagSL, diagScale, Fin.sum_univ_two] + | .barψ α => + rw [rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum, diagSL_inv] + fin_cases α <;> simp [diagSL, diagScale, Fin.sum_univ_two] + +@[simp] +lemma diagScale_neg_one (φ : FieldSpecification) : diagScale (-1) φ = -1 := by + cases φ <;> simp [diagScale] + +lemma diagScale_twoI_ψ (α : Fin 2) : + diagScale twoI (ψ α) = if α = 0 then -I / 2 else 2 * I := by + simp only [diagScale, twoI_val, twoI_inv_val] + +lemma diagScale_twoI_barψ (α : Fin 2) : + diagScale twoI (barψ α) = if α = 0 then I / 2 else -(2 * I) := by + simp only [diagScale, twoI_val, twoI_inv_val] + split_ifs <;> simp [Complex.conj_I] + +/-- Every field scales by `-1` under the central element `-1` of the Lorentz group + (fermion parity): the special case `z = -1` of `rep_diagSL_apply`. -/ +lemma rep_neg_one_apply (φ : FieldSpecification) : + rep (-1) [φ]ₑ = (-1 : ℂ) • [φ]ₑ := by + rw [← diagSL_neg_one, rep_diagSL_apply, diagScale_neg_one] + +/-- Under `diagSL twoI` the total scaling of a mixed pair `ψ α`, `barψ β` is never `1`: + the four possible products are `1 / 4`, `-1`, `-1` and `4`. This is the numerical + input to the selection rule `irrepCoeff_ψ_barψ_eq_zero_of_isInvariant`. -/ +lemma diagScale_twoI_ψ_mul_barψ_ne_one (α β : Fin 2) : + diagScale twoI (ψ α) * diagScale twoI (barψ β) ≠ 1 := by + fin_cases α <;> fin_cases β <;> + simp only [diagScale_twoI_ψ, diagScale_twoI_barψ, Fin.zero_eta, Fin.mk_one, Fin.reduceEq, + reduceIte] + -- The four cases are the four weight products `1/4`, `-1`, `-1` and `4`. Each + -- counterfactual is routed through `linear_combination` with `I * I = -1` to a + -- rational equation, since `norm_num` alone treats `I` as an opaque atom; no uniform + -- closer exists (the modulus argument degenerates for the two `-1` cases). + · intro hcontra + have h : (1 / 4 : ℂ) = 1 := by + linear_combination hcontra + (1 / 4 : ℂ) * Complex.I_mul_I + norm_num at h + · intro hcontra + have h : (-1 : ℂ) = 1 := by linear_combination hcontra - Complex.I_mul_I + norm_num at h + · intro hcontra + have h : (-1 : ℂ) = 1 := by linear_combination hcontra - Complex.I_mul_I + norm_num at h + · intro hcontra + have h : (4 : ℂ) = 1 := by linear_combination hcontra + 4 * Complex.I_mul_I + norm_num at h + +/-! + ## The irreps -/ +/-- The irreducible representations of the Lorentz group present in the effective + potential: `ψ` for the left-handed Weyl fermion and `barψ` for its conjugate. -/ inductive Irrep | ψ | barψ deriving DecidableEq, Fintype +/-- The irrep in which a field specification sits. -/ def toIrrep : FieldSpecification → Irrep | .ψ _ => .ψ | .barψ _ => .barψ +@[simp] +lemma toIrrep_ψ (α : Fin 2) : toIrrep (ψ α) = Irrep.ψ := rfl + +@[simp] +lemma toIrrep_barψ (α : Fin 2) : toIrrep (barψ α) = Irrep.barψ := rfl + lemma rep_apply_toEFTLagrangianExclDeriv_mem_irrep (Λ : SL(2, ℂ)) (ψ : FieldSpecification) : ∃ n, ∃ F : Fin n → FieldSpecification, (∃ f : Fin n → ℂ, rep Λ [ψ]ₑ = ∑ x, f x • [F x]ₑ) ∧ (∀ x, toIrrep (F x) = toIrrep ψ) := by match ψ with | .ψ α => - exact ⟨2, .ψ, ⟨Λ⁻¹ α, rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum Λ α⟩, by simp [toIrrep]⟩ + exact ⟨2, .ψ, ⟨Λ⁻¹ α, rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum Λ α⟩, by simp⟩ | .barψ α => exact ⟨2, .barψ, ⟨star (Λ⁻¹ α), rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum Λ α⟩, - by simp [toIrrep]⟩ + by simp⟩ /-! @@ -263,10 +392,47 @@ lemma rep_apply_toEFTLagrangianExclDeriv_mem_irrep (Λ : SL(2, ℂ)) (ψ : Field -/ +/-- The mass dimension of each field specification; a Weyl fermion in four dimensions + has mass dimension `3 / 2`. -/ def massDimension : FieldSpecification → ℚ | .ψ _ => 3 / 2 | .barψ _ => 3 / 2 +@[simp] +lemma massDimension_eq (f : FieldSpecification) : massDimension f = 3 / 2 := by + cases f <;> rfl + +lemma massDimension_pos (f : FieldSpecification) : 0 < massDimension f := by + rw [massDimension_eq] + norm_num + +/-- In a theory whose fields all have the same mass dimension, the overall mass + dimension of an operator just counts its fields. -/ +lemma sum_map_massDimension (s : Multiset FieldSpecification) : + (s.map massDimension).sum = 3 / 2 * (Multiset.card s : ℚ) := by + induction s using Multiset.induction with + | empty => simp + | cons a t ih => + rw [Multiset.map_cons, Multiset.sum_cons, ih, Multiset.card_cons, massDimension_eq] + push_cast + ring + +/-- The mass dimension of a field specification in units of half mass dimensions, + so that a Weyl fermion has scaled mass dimension `3`. Unlike `massDimension` this + is usable with `decide`, since natural-number arithmetic reduces in the kernel. -/ +def massDimensionNat : FieldSpecification → ℕ + | .ψ _ => 3 + | .barψ _ => 3 + +@[simp] +lemma massDimensionNat_eq (f : FieldSpecification) : massDimensionNat f = 3 := by + cases f <;> rfl + +lemma massDimensionNat_cast (f : FieldSpecification) : + (massDimensionNat f : ℚ) = massDimension f * 2 := by + rw [massDimensionNat_eq, massDimension_eq] + norm_num + end FieldSpecification namespace EFTLagrangianExclDeriv @@ -278,6 +444,8 @@ open FieldSpecification ## Elements from a list of FieldSpecifications -/ +/-- The operator in the effective potential given by the ordered product of the + fields in `l`. -/ def termOfList (l : List FieldSpecification) : EFTLagrangianExclDeriv := (l.map toEFTLagrangianExclDeriv).prod @@ -442,6 +610,8 @@ lemma termOfList_ofFn {n : ℕ} (g : Fin n → FieldSpecification) : -/ +/-- The operator in the effective potential given by the ordered product of the + fields in the tuple `g`. -/ def termOfTuple {n} (g : Fin n → FieldSpecification) : EFTLagrangianExclDeriv := termOfList (List.ofFn g) @@ -454,10 +624,15 @@ lemma termOfTuple_perm {n} (g : Fin n → FieldSpecification) {i j : Fin n} (hij rw [termOfTuple_eq_ιMulti, termOfTuple_eq_ιMulti] exact AlternatingMap.map_swap (ExteriorAlgebra.ιMulti ℂ n) (fun k => moduleBasis (g k)) hij +/-- The alternating map taking a tuple of vectors to their product in the + effective potential. -/ def termOfVectTuple {n} : AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) EFTLagrangianExclDeriv (Fin n) := ExteriorAlgebra.ιMulti ℂ n +/-- The alternating map underlying `coeff s`: a tuple of vectors is sent to + `termOfTuple g` weighted by the product of the `g`-coordinates of the vectors, + summed over the tuples `g` of fields with field content `s`. -/ def coeffOfVectorTuple (s : Multiset FieldSpecification) (n : ℕ) : AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) EFTLagrangianExclDeriv (Fin n) where @@ -523,7 +698,11 @@ this is where you can think of it as a coefficient. -/ -def coeff (s : Multiset FieldSpecification) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := +/-- The projection of an effective potential onto the span of the operators with + field content `s`. As described above, this plays the role of the coefficient + of the operator `s` in the effective potential. -/ +def coeff (s : Multiset FieldSpecification) : + EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := ExteriorAlgebra.liftAlternating (coeffOfVectorTuple s) lemma coeff_apply_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) : @@ -665,21 +844,24 @@ lemma coeff_U1_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) · exact absurd (sub_eq_zero.mp h).symm hs · exact h -/-- The selection rule on coefficients coming from the anti-symmetry of fermionic fields. -/ -lemma coeff_fermionic_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) +/-- The selection rule on coefficients coming from the anti-symmetry of fermionic fields. + Note that this holds for any effective potential, invariant or not. -/ +lemma coeff_fermionic_selection_rule {V : EFTLagrangianExclDeriv} (s : Multiset FieldSpecification) (hs : ¬ s.Nodup) : coeff s V = 0 := by - sorry + obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) + have hl : ¬ (Multiset.toList s).Nodup := by + rw [← Multiset.coe_toList s] at hs + exact fun h => hs (Multiset.coe_nodup.mpr h) + rw [hc, termOfList_zero_of_not_nodup _ hl, smul_zero] /-- The selection rule on coefficients saying that every term with an odd number of fermions is zero. -/ lemma coeff_odd_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) (s : Multiset FieldSpecification) (hs : Odd s.card) : coeff s V = 0 := by - refine coeff_U1_selection_rule hV (g := -1) (d := fun ψ => -1) ?_ s ?_ - · intro ψ - sorry - · simp - sorry + refine coeff_U1_selection_rule hV (-1) (fun _ => -1) rep_neg_one_apply s ?_ + rw [Multiset.map_const', Multiset.prod_replicate, hs.neg_one_pow] + norm_num /-- The support of an effective potential: the set of multisets of field specifications for which the corresponding coefficient is non-zero. -/ @@ -715,8 +897,8 @@ lemma support_zero_eq_empty : support (0 : EFTLagrangianExclDeriv) = ∅ := by lemma mem_support_iff {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} : s ∈ support V ↔ coeff s V ≠ 0 := by simp [support] -lemma coeff_eq_zero_of_not_mem_support {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} - (h : s ∉ support V) : coeff s V = 0 := by +lemma coeff_eq_zero_of_not_mem_support {V : EFTLagrangianExclDeriv} + {s : Multiset FieldSpecification} (h : s ∉ support V) : coeff s V = 0 := by simpa [support, Set.Finite.mem_toFinset] using h lemma support_add {V W : EFTLagrangianExclDeriv} : @@ -784,10 +966,28 @@ lemma eq_sum_support_coeff (V : EFTLagrangianExclDeriv) : V = ∑ s ∈ support conv_lhs => rw [hx] simp [Finset.smul_sum] +/-- Regrouping the decomposition `eq_sum_support_coeff` along a classifying map `key` + on field contents: if `fiber k` is the finset of field contents with `key s = k`, + then an effective potential is the sum of its projections onto the fibers of the + keys appearing in its support. Specialised to irrep content in `eq_sum_irrepCoeff` + and to mass dimension in `eq_sum_massDimCoeff`. -/ +lemma eq_sum_fiber_coeff {κ : Type*} [DecidableEq κ] {key : Multiset FieldSpecification → κ} + {fiber : κ → Finset (Multiset FieldSpecification)} + (hmem : ∀ k s, s ∈ fiber k ↔ key s = k) (V : EFTLagrangianExclDeriv) : + V = ∑ k ∈ (support V).image key, ∑ s ∈ fiber k, coeff s V := by + have hdisj : (((support V).image key : Finset κ) : Set κ).PairwiseDisjoint fiber := by + intro i _ j _ hij + simp only [Function.onFun, Finset.disjoint_left] + intro s hsi hsj + exact hij (((hmem i s).mp hsi).symm.trans ((hmem j s).mp hsj)) + rw [← Finset.sum_biUnion hdisj] + conv_lhs => rw [eq_sum_support_coeff V] + refine Finset.sum_subset (fun s hs => ?_) (fun s _ hs => coeff_eq_zero_of_not_mem_support hs) + exact Finset.mem_biUnion.mpr ⟨key s, Finset.mem_image_of_mem _ hs, (hmem _ s).mpr rfl⟩ /-! -## +## Mixing of operators under the action of the Lorentz group -/ @@ -852,12 +1052,14 @@ lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecifi /-- The field content of a term which corresponds to a given irrep content. -/ def allTermsWithIrrepContent (i : Multiset Irrep) : Finset (Multiset FieldSpecification) := - ((Finset.univ.sym i.card).image Sym.toMultiset).filter (fun s => Multiset.map toIrrep s = i) + (multisetsOfCard FieldSpecification i.card).filter (fun s => Multiset.map toIrrep s = i) lemma mem_allTermsWithIrrepContent_iff (i : Multiset Irrep) (s : Multiset FieldSpecification) : s ∈ allTermsWithIrrepContent i ↔ Multiset.map toIrrep s = i := by - simp [allTermsWithIrrepContent] - sorry + simp only [allTermsWithIrrepContent, Finset.mem_filter, mem_multisetsOfCard, + and_iff_right_iff_imp] + intro h + rw [← h, Multiset.card_map] /-- The projection of a term of `EFTLagrangianExclDeriv` onto those operators which have an irrep content determined by `i`. -/ @@ -869,29 +1071,48 @@ lemma irrepCoeff_eq_sum (i : Multiset Irrep) (V : EFTLagrangianExclDeriv) : simp [irrepCoeff] lemma irrepCoeff_one (i : Multiset Irrep) : irrepCoeff i 1 = if i = ∅ then 1 else 0 := by - simp [irrepCoeff, coeff_one, allTermsWithIrrepContent] - split_ifs with hi <;> simp_all - rename_i h - subst h - apply hi ⟨∅, by simp⟩ - simp + rw [irrepCoeff_eq_sum] + simp only [coeff_one] + rw [Finset.sum_ite_eq'] + refine if_congr ?_ rfl rfl + rw [mem_allTermsWithIrrepContent_iff] + simp [eq_comm] lemma irrepCoeff_termOfList (i : Multiset Irrep) (l : List FieldSpecification) : irrepCoeff i (termOfList l) = if Multiset.map toIrrep (Multiset.ofList l) = i then termOfList l else 0 := by simp [irrepCoeff, coeff_apply_termOfList, mem_allTermsWithIrrepContent_iff] +/-- The irrep contents of the operators appearing in an effective potential. -/ def irrepSupport (V : EFTLagrangianExclDeriv) : Finset (Multiset Irrep) := (support V).image (Multiset.map toIrrep) lemma eq_sum_irrepCoeff (V : EFTLagrangianExclDeriv) : V = ∑ i ∈ irrepSupport V, irrepCoeff i V := by - sorry + simp only [irrepSupport, irrepCoeff_eq_sum] + exact eq_sum_fiber_coeff mem_allTermsWithIrrepContent_iff V + +lemma irrepCoeff_rep_termOfList (i : Multiset Irrep) (g : SL(2, ℂ)) + (l : List FieldSpecification) : + rep g (irrepCoeff i (termOfList l)) = irrepCoeff i (rep g (termOfList l)) := by + obtain ⟨n, F, ⟨f, hf⟩, hF⟩ := rep_termOfList_eq_sum_of_toIrrep g l + have hcond : ∀ x, Multiset.map toIrrep (Multiset.ofList (F x)) = + Multiset.map toIrrep (Multiset.ofList l) := by + intro x + rw [Multiset.map_coe, Multiset.map_coe, hF x] + rw [irrepCoeff_termOfList, hf, map_sum] + -- Rewriting with `hcond` transports every summand's irrep-content condition into the + -- outer one, so that `split_ifs` sees a single condition and produces two goals. + simp only [map_smul, irrepCoeff_termOfList, hcond] + split_ifs with h + · exact hf + · simp lemma irrepCoeff_rep_apply_fieldSpecification {i : Multiset Irrep} (g : SL(2, ℂ)) (ψ : FieldSpecification) : rep g (irrepCoeff i [ψ]ₑ) = irrepCoeff i (rep g [ψ]ₑ) := by - sorry + rw [← termOfList_singleton] + exact irrepCoeff_rep_termOfList i g [ψ] lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2, ℂ)) : rep g (irrepCoeff i V) = irrepCoeff i (rep g V) := by @@ -899,43 +1120,95 @@ lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2 a x _ hx · simp only [Set.mem_range] at hV' obtain ⟨l, rfl⟩ := hV' - sorry -- use rep_termOfList_eq_sum_of_toIrrep + exact irrepCoeff_rep_termOfList i g l · simp · simp [hx, hy] · simp [hx] +/-- There is no Lorentz-invariant operator with irrep content `{ψ, barψ}`: + invariance under the diagonal transformation `diagSL twoI` forces every + coefficient of a mixed `ψ`–`barψ` pair to vanish. -/ lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) : irrepCoeff {Irrep.ψ, Irrep.barψ} V = 0 := by - sorry + rw [irrepCoeff_eq_sum] + refine Finset.sum_eq_zero fun s hs => ?_ + rw [mem_allTermsWithIrrepContent_iff] at hs + have hcard : Multiset.card s = 2 := by simpa using congrArg Multiset.card hs + obtain ⟨a, b, rfl⟩ := Multiset.card_eq_two.mp hcard + refine coeff_U1_selection_rule hV (diagSL twoI) (diagScale twoI) (rep_diagSL_apply twoI) _ ?_ + simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, + Multiset.prod_cons, Multiset.prod_singleton] at hs ⊢ + cases a with + | ψ α => + cases b with + | ψ β => + simp only [toIrrep_ψ] at hs + exact absurd hs (by decide) + | barψ β => exact diagScale_twoI_ψ_mul_barψ_ne_one α β + | barψ α => + cases b with + | ψ β => + rw [mul_comm] + exact diagScale_twoI_ψ_mul_barψ_ne_one β α + | barψ β => + simp only [toIrrep_barψ] at hs + exact absurd hs (by decide) /-! ## Mass dimension -/ -def upperBoundNumberOfFields (n : ℚ) : ℕ := by - let d := Fin.minimum massDimension +/-- The finset of all possible field contents of terms with overall mass dimension `n`. + Since every field has mass dimension at least `3 / 2`, a term of mass dimension `n` + contains a bounded number of fields, so this is a computable finset (constructed + through `multisetsOfMassDim`). The defining property is + `mem_allTermsWithMassDimension_iff`. -/ def allTermsWithMassDimension (n : ℚ) : Finset (Multiset FieldSpecification) := - -- Since there is no mass dimension less then 1, a term with mass dimension n - -- can have at most `n` fields - let x := List.range (Rat.ceil n + 1).toNat - - ((Finset.univ.sym x.card).image Sym.toMultiset).filter (fun s => (s.map massDimension).sum = n) -def massDimCoeff (n : ℚ) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv where - toFun := fun V => ∑ s ∈ support V, if (s.map massDimension).sum = n then coeff s V else 0 - map_add' := by - intro V W - sorry - map_smul' := by - intro c V - sorry - + multisetsOfMassDim massDimension n + +lemma mem_allTermsWithMassDimension_iff (n : ℚ) (s : Multiset FieldSpecification) : + s ∈ allTermsWithMassDimension n ↔ (s.map massDimension).sum = n := + mem_multisetsOfMassDim_iff massDimension_pos + +/-- Clearing denominators: the terms of mass dimension `n` are those whose scaled + (`ℕ`-valued) mass dimensions sum to `2 * n`. The right-hand side reduces in the + kernel, so after rewriting by this lemma membership can be decided by `decide`. -/ +lemma allTermsWithMassDimension_eq_natCast {n : ℚ} {mN : ℕ} (hm : (mN : ℚ) = n * 2) : + allTermsWithMassDimension n = multisetsOfMassDimNat massDimensionNat mN := + multisetsOfMassDim_eq_natCast massDimension_pos (by norm_num) massDimensionNat_cast hm + +example : ({ψ 0, ψ 1} : Multiset FieldSpecification) ∈ allTermsWithMassDimension 3 := by + rw [allTermsWithMassDimension_eq_natCast (mN := 6) (by norm_num)] + decide + +example : ({ψ 0, ψ 1, barψ 0, barψ 1} : Multiset FieldSpecification) ∉ + allTermsWithMassDimension 3 := by + rw [allTermsWithMassDimension_eq_natCast (mN := 6) (by norm_num)] + decide + +/-- The projection of a term of `EFTLagrangianExclDeriv` onto those operators whose + field content has overall mass dimension `n`. -/ +def massDimCoeff (n : ℚ) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := + ∑ s ∈ allTermsWithMassDimension n, coeff s + +lemma massDimCoeff_eq_sum (n : ℚ) (V : EFTLagrangianExclDeriv) : + massDimCoeff n V = ∑ s ∈ allTermsWithMassDimension n, coeff s V := by + simp [massDimCoeff] + +lemma massDimCoeff_termOfList (n : ℚ) (l : List FieldSpecification) : + massDimCoeff n (termOfList l) = + if (Multiset.map massDimension (Multiset.ofList l)).sum = n then termOfList l else 0 := by + simp [massDimCoeff_eq_sum, coeff_apply_termOfList, mem_allTermsWithMassDimension_iff] + +/-- The mass dimensions of the operators appearing in an effective potential. -/ def massDimSupport (V : EFTLagrangianExclDeriv) : Finset ℚ := (support V).image (fun s => (s.map massDimension).sum) lemma eq_sum_massDimCoeff (V : EFTLagrangianExclDeriv) : V = ∑ n ∈ massDimSupport V, massDimCoeff n V := by - sorry + simp only [massDimSupport, massDimCoeff_eq_sum] + exact eq_sum_fiber_coeff mem_allTermsWithMassDimension_iff V /-! From 6b612a27b1947066628de6de91f864b7cf614462 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 24 Jul 2026 06:59:56 +0100 Subject: [PATCH 039/254] feat: Golf and add lema --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 9709b6775..cdee2ac3a 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1130,29 +1130,33 @@ lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2 coefficient of a mixed `ψ`–`barψ` pair to vanish. -/ lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) : irrepCoeff {Irrep.ψ, Irrep.barψ} V = 0 := by - rw [irrepCoeff_eq_sum] - refine Finset.sum_eq_zero fun s hs => ?_ - rw [mem_allTermsWithIrrepContent_iff] at hs - have hcard : Multiset.card s = 2 := by simpa using congrArg Multiset.card hs - obtain ⟨a, b, rfl⟩ := Multiset.card_eq_two.mp hcard + rw [irrepCoeff_eq_sum, Finset.sum_congr (g := fun s => coeff s V) + (s₂ := {{ψ 0, barψ 0}, {ψ 0, barψ 1}, {ψ 1, barψ 0}, {ψ 1, barψ 1}}) (by decide) (by simp)] + suffices h : ∀ (a b : Fin 2), coeff {ψ a, barψ b} V = 0 by + repeat rw [Finset.sum_insert (by decide)] + simp only [h, Finset.sum_singleton, add_zero] + intro a b refine coeff_U1_selection_rule hV (diagSL twoI) (diagScale twoI) (rep_diagSL_apply twoI) _ ?_ - simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, - Multiset.prod_cons, Multiset.prod_singleton] at hs ⊢ - cases a with - | ψ α => - cases b with - | ψ β => - simp only [toIrrep_ψ] at hs - exact absurd hs (by decide) - | barψ β => exact diagScale_twoI_ψ_mul_barψ_ne_one α β - | barψ α => - cases b with - | ψ β => - rw [mul_comm] - exact diagScale_twoI_ψ_mul_barψ_ne_one β α - | barψ β => - simp only [toIrrep_barψ] at hs - exact absurd hs (by decide) + simp only [Multiset.insert_eq_cons, diagScale, Fin.isValue, Units.val_inv_eq_inv_val, twoI_val, + _root_.mul_inv_rev, inv_I, neg_mul, star_neg, star_mul', RCLike.star_def, conj_I, star_inv₀, + star_ofNat, neg_neg, mul_neg, Multiset.map_cons, Multiset.map_singleton, Multiset.prod_cons, + Multiset.prod_singleton, mul_ite, ite_mul, ne_eq] + field_simp + simp only [Fin.isValue, I_sq, neg_neg, neg_mul, one_mul] + grind + +lemma irrepCoeff_ψ_ψ_isInvariant {V : EFTLagrangianExclDeriv} : + IsInvariant (irrepCoeff {Irrep.ψ, Irrep.ψ} V) := by + sorry + +lemma irrepCoeff_barψ_barψ_isInvariant {V : EFTLagrangianExclDeriv} : + IsInvariant (irrepCoeff {Irrep.barψ, Irrep.barψ} V) := by + sorry + +lemma irrepCoeff_quadratic_isInvariant {V : EFTLagrangianExclDeriv} : + IsInvariant (irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V) := by + sorry + /-! ## Mass dimension From abdc1298f0565221b70ff58c71c529b3377f83d4 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 24 Jul 2026 15:23:04 +0100 Subject: [PATCH 040/254] Update EFTLagrangianExclDeriv.lean --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 306 +++++++++++++++++- 1 file changed, 289 insertions(+), 17 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index cdee2ac3a..2212eec84 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -118,6 +118,11 @@ def IsInvariant (V : EFTLagrangianExclDeriv) : Prop := ∀ Λ, rep Λ V = V lemma IsInvariant.eq_iff {V : EFTLagrangianExclDeriv} : IsInvariant V ↔ ∀ Λ, rep Λ V = V := by rfl +@[simp] +lemma IsInvariant.zero : IsInvariant 0 := by + intro Λ + simp [rep] + lemma IsInvariant.add {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : IsInvariant (V + W) := by intro Λ @@ -137,6 +142,11 @@ lemma IsInvariant.one : IsInvariant 1 := by intro Λ simp [rep] +lemma IsInvariant.sum {ι : Type} (s : Finset ι) {f : ι → EFTLagrangianExclDeriv} + (h : ∀ i ∈ s, IsInvariant (f i)) : IsInvariant (∑ i ∈ s, f i) := by + intro Λ + simp_all [IsInvariant.eq_iff] + end EFTLagrangianExclDeriv /-! @@ -651,7 +661,7 @@ def coeffOfVectorTuple (s : Multiset FieldSpecification) (n : ℕ) : rcases eq_or_ne k j with rfl | hkj · rw [Equiv.swap_apply_right]; exact hv · rw [Equiv.swap_apply_of_ne_of_ne hki hkj] - simp only [MultilinearMap.toFun_eq_coe, MultilinearMap.sum_apply] + simp only [MultilinearMap.toFun_eq_coe, _root_.sum_apply] refine Finset.sum_involution (fun g _ => g ∘ Equiv.swap i j) ?_ ?_ (fun g _ => Finset.mem_univ _) ?_ · intro g _ @@ -709,7 +719,7 @@ lemma coeff_apply_termOfList (s : Multiset FieldSpecification) (l : List FieldSp coeff s (termOfList l) = if Multiset.ofList l = s then termOfList l else 0 := by have hterm : termOfTuple l.get = termOfList l := by rw [termOfTuple, List.ofFn_get] rw [coeff, termOfList_eq_ιMulti, ExteriorAlgebra.liftAlternating_apply_ιMulti] - simp only [coeffOfVectorTuple, AlternatingMap.coe_mk, MultilinearMap.sum_apply] + simp only [coeffOfVectorTuple, AlternatingMap.coe_mk, _root_.sum_apply] refine (Finset.sum_eq_single l.get ?_ ?_).trans ?_ · intro g _ hg obtain ⟨i, hi⟩ := Function.ne_iff.mp hg @@ -752,6 +762,33 @@ lemma coeff_coeff_self {s : Multiset FieldSpecification} (V : EFTLagrangianExclD · simp [hx, hy] · simp [hx] +lemma coeff_coeff_eq_zero_of_diff {s1 s2 : Multiset FieldSpecification} (h : s1 ≠ s2) + (V : EFTLagrangianExclDeriv) : coeff s1 (coeff s2 V) = 0 := by + induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy + a x _ hx + · simp at hV' + obtain ⟨l, rfl⟩ := hV' + simp [coeff_apply_termOfList, apply_ite] + grind + · simp + · simp [hx, hy] + · simp [hx] + +lemma coeff_sum_eq_zero_iff (V : EFTLagrangianExclDeriv) + (S : Finset (Multiset FieldSpecification)): + ∑ s ∈ S, coeff s V = 0 ↔ ∀ s ∈ S, coeff s V = 0 := by + constructor + · intro h s hs + have h1 := congrArg (coeff s) h + simp at h1 + rw [Finset.sum_eq_single s] at h1 + simpa using h1 + · intro b hb hx + exact coeff_coeff_eq_zero_of_diff (id (Ne.symm hx)) V + · simp_all + · intro h + exact Finset.sum_eq_zero h + lemma coeff_eq_termOfList {s : Multiset FieldSpecification} (V : EFTLagrangianExclDeriv) {l : List FieldSpecification} (hl : Multiset.ofList l = s) : ∃ c : ℂ, coeff s V = c • termOfList l := by @@ -863,6 +900,105 @@ lemma coeff_odd_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) rw [Multiset.map_const', Multiset.prod_replicate, hs.neg_one_pow] norm_num +@[simp] +lemma coeff_ψ_barψ_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) + (a b : Fin 2) : coeff {.ψ a, .barψ b} V = 0 := by + refine coeff_U1_selection_rule hV (diagSL twoI) (diagScale twoI) (rep_diagSL_apply twoI) _ ?_ + simp only [Multiset.insert_eq_cons, diagScale, Fin.isValue, Units.val_inv_eq_inv_val, twoI_val, + _root_.mul_inv_rev, inv_I, neg_mul, star_neg, star_mul', RCLike.star_def, conj_I, star_inv₀, + star_ofNat, neg_neg, mul_neg, Multiset.map_cons, Multiset.map_singleton, Multiset.prod_cons, + Multiset.prod_singleton, mul_ite, ite_mul, ne_eq] + field_simp + simp only [Fin.isValue, I_sq, neg_neg, neg_mul, one_mul] + grind + +lemma coeff_empty_isInvariant {V : EFTLagrangianExclDeriv} : IsInvariant (coeff 0 V) := by + obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := 0) (l := []) (by simp) + rw [hc] + refine IsInvariant.smul (fun Λ => ?_) _ + simp + +lemma coeff_ψ_zero_ψ_one_isInvariant {V : EFTLagrangianExclDeriv} : + IsInvariant (coeff {.ψ 0, .ψ 1} V) := by + obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1}) (l := [.ψ 0, .ψ 1]) (by decide) + rw [hc] + refine IsInvariant.smul (fun Λ => ?_) _ + simp only [termOfList, Fin.isValue, List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, + mul_one, rep_mul, rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum, SpecialLinearGroup.coe_inv, + adjugate_fin_two, of_apply, cons_val', cons_val_fin_one, cons_val_zero, Fin.sum_univ_two, + cons_val_one, mul_add, Algebra.mul_smul_comm, add_mul, Algebra.smul_mul_assoc, + toEFTLagrangianExclDeriv_mul_self, smul_zero, + toEFTLagrangianExclDeriv_mul_anti_commute (.ψ 1) (.ψ 0), neg_mul, smul_neg, ← neg_smul, neg_neg, + zero_add, smul_smul, add_zero, ← add_smul] + trans Λ.1.det • ([.ψ 0]ₑ * [.ψ 1]ₑ) + · simp only [Matrix.det_fin_two] + ring_nf + · simp + +@[simp] +lemma coeff_ψ_ψ_isInvariant {V : EFTLagrangianExclDeriv} (a b : Fin 2) : + IsInvariant (coeff {.ψ a, .ψ b} V) := by + match a, b with + | 0, 0 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp + | 1, 1 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp + | 0, 1 => exact coeff_ψ_zero_ψ_one_isInvariant + | 1, 0 => convert coeff_ψ_zero_ψ_one_isInvariant using 3; decide + +lemma coeff_barψ_zero_barψ_one_isInvariant {V : EFTLagrangianExclDeriv} : + IsInvariant (coeff {.barψ 0, .barψ 1} V) := by + obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := {.barψ 0, .barψ 1}) (l := [.barψ 0, .barψ 1]) + (by decide) + rw [hc] + refine IsInvariant.smul (fun Λ => ?_) _ + simp only [termOfList, Fin.isValue, List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, + mul_one, rep_mul, rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum, SpecialLinearGroup.coe_inv, + adjugate_fin_two, of_apply, cons_val', cons_val_fin_one, cons_val_zero, RCLike.star_def, + Fin.sum_univ_two, cons_val_one, mul_add, Algebra.mul_smul_comm, add_mul, Algebra.smul_mul_assoc, + toEFTLagrangianExclDeriv_mul_self, smul_zero, + toEFTLagrangianExclDeriv_mul_anti_commute (.barψ 1) (.barψ 0), neg_mul, smul_neg, ← neg_smul, + ← map_neg, neg_neg, zero_add, smul_smul, ← map_mul, add_zero, ← add_smul, ← map_add] + trans (starRingEnd ℂ) Λ.1.det • ([.barψ 0]ₑ * [.barψ 1]ₑ) + · simp only [Matrix.det_fin_two] + ring_nf + · simp + +@[simp] +lemma coeff_barψ_barψ_isInvariant {V : EFTLagrangianExclDeriv} (a b : Fin 2) : + IsInvariant (coeff {.barψ a, .barψ b} V) := by + match a, b with + | 0, 0 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp + | 1, 1 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp + | 0, 1 => exact coeff_barψ_zero_barψ_one_isInvariant + | 1, 0 => convert coeff_barψ_zero_barψ_one_isInvariant using 3; decide + +lemma coeff_quartic_isInvariant {V : EFTLagrangianExclDeriv} : + IsInvariant (coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1} V) := by + obtain ⟨c', hc⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) + (l := [.ψ 0, .ψ 1, .barψ 0, .barψ 1]) (by decide) + rw [hc] + refine IsInvariant.smul (fun Λ => ?_) _ + simp only [termOfList, Fin.isValue, List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, + mul_one, rep_mul, rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum, SpecialLinearGroup.coe_inv, + adjugate_fin_two, of_apply, cons_val', cons_val_fin_one, cons_val_zero, RCLike.star_def, + Fin.sum_univ_two, cons_val_one, mul_add, Algebra.mul_smul_comm, add_mul, Algebra.smul_mul_assoc, + toEFTLagrangianExclDeriv_mul_self, smul_zero, + toEFTLagrangianExclDeriv_mul_anti_commute (.barψ 1) (.barψ 0), neg_mul, smul_neg, ← neg_smul, + ← map_neg, neg_neg, zero_add, smul_smul, ← map_mul, add_zero, ← add_smul, ← map_add] + trans (starRingEnd ℂ) Λ.1.det • ((rep Λ) [ψ 0]ₑ * ((rep Λ) [ψ 1]ₑ * ([barψ 0]ₑ * [barψ 1]ₑ))) + · simp only [Matrix.det_fin_two] + ring_nf + simp only [SpecialLinearGroup.det_coe, map_one, Fin.isValue, + rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum, SpecialLinearGroup.coe_inv, adjugate_fin_two, + of_apply, cons_val', cons_val_fin_one, cons_val_zero, Fin.sum_univ_two, cons_val_one, + ← mul_assoc, add_mul, Algebra.smul_mul_assoc, mul_add, Algebra.mul_smul_comm, + toEFTLagrangianExclDeriv_mul_self, smul_zero, + toEFTLagrangianExclDeriv_mul_anti_commute (.ψ 1) (.ψ 0), neg_mul, smul_neg, ← neg_smul, neg_neg, + zero_add, smul_smul, add_zero, ← add_smul, mul_neg, one_mul] + trans Λ.1.det • ([ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ) + · simp only [Matrix.det_fin_two] + ring_nf + · simp + /-- The support of an effective potential: the set of multisets of field specifications for which the corresponding coefficient is non-zero. -/ def support (V : EFTLagrangianExclDeriv) : Finset (Multiset FieldSpecification) := @@ -966,6 +1102,21 @@ lemma eq_sum_support_coeff (V : EFTLagrangianExclDeriv) : V = ∑ s ∈ support conv_lhs => rw [hx] simp [Finset.smul_sum] +lemma nodup_of_mem_support {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} + (hs : s ∈ support V) : s.Nodup := by + simp [support, Set.Finite.mem_toFinset] at hs + by_contra h + exact hs (coeff_fermionic_selection_rule (V := V) s h) + +/-- For a purely fermionic theory, no fermion can appear twice in the same term, + so the support is a subset of those multisets which are actually finite sets. + This does not hold in a bosonic theory. -/ +lemma support_subset_finset_univ {V : EFTLagrangianExclDeriv} : + support V ⊆ (Finset.univ : Finset (Finset FieldSpecification)).image fun V => V.val := by + intro s hs + simp only [Finset.mem_image, Finset.mem_univ, true_and] + exact ⟨Finset.mk s (nodup_of_mem_support hs), rfl⟩ + /-- Regrouping the decomposition `eq_sum_support_coeff` along a classifying map `key` on field contents: if `fiber k` is the finset of field contents with `key s = k`, then an effective potential is the sum of its projections onto the fibers of the @@ -1087,11 +1238,44 @@ lemma irrepCoeff_termOfList (i : Multiset Irrep) (l : List FieldSpecification) : def irrepSupport (V : EFTLagrangianExclDeriv) : Finset (Multiset Irrep) := (support V).image (Multiset.map toIrrep) +lemma mem_irrepSupport_iff (V : EFTLagrangianExclDeriv) (i : Multiset Irrep) : + i ∈ irrepSupport V ↔ irrepCoeff i V ≠ 0 := by + simp [irrepSupport, Finset.mem_image] + constructor + · rintro ⟨s, hs, hsi⟩ + simp [irrepCoeff_eq_sum, coeff_sum_eq_zero_iff] + refine ⟨s, ?_⟩ + simp [mem_allTermsWithIrrepContent_iff, hsi] + exact mem_support_iff.mp hs + · intro h + simp [irrepCoeff_eq_sum, coeff_sum_eq_zero_iff] at h + obtain ⟨s, hs, hsi⟩ := h + use s + simp [mem_allTermsWithIrrepContent_iff] at hs + simp [mem_support_iff, hsi, hs] + +lemma irrepSupport_subset (V : EFTLagrangianExclDeriv) : + irrepSupport V ⊆ {{}, {.ψ}, {.barψ}, {.ψ, .ψ}, {.barψ, .barψ}, {.ψ, .barψ}, + {.ψ, .barψ, .barψ}, {.ψ, .ψ, .barψ}, {.ψ, .ψ, .barψ, .barψ}} := by + trans ((Finset.univ : Finset (Finset FieldSpecification)).image fun V => + V.val).image (Multiset.map toIrrep) + · rw [irrepSupport] + exact Finset.image_subset_image support_subset_finset_univ + · apply Finset.subset_of_eq + decide + lemma eq_sum_irrepCoeff (V : EFTLagrangianExclDeriv) : V = ∑ i ∈ irrepSupport V, irrepCoeff i V := by simp only [irrepSupport, irrepCoeff_eq_sum] exact eq_sum_fiber_coeff mem_allTermsWithIrrepContent_iff V +lemma eq_sum_irrepCoeff_subset {V : EFTLagrangianExclDeriv} {S : Finset (Multiset Irrep)} + (hS : irrepSupport V ⊆ S) : V = ∑ i ∈ S, irrepCoeff i V := by + conv_lhs => rw [eq_sum_irrepCoeff V] + apply Finset.sum_subset hS + intro s hs hsi + simpa [mem_irrepSupport_iff] using hsi + lemma irrepCoeff_rep_termOfList (i : Multiset Irrep) (g : SL(2, ℂ)) (l : List FieldSpecification) : rep g (irrepCoeff i (termOfList l)) = irrepCoeff i (rep g (termOfList l)) := by @@ -1132,30 +1316,118 @@ lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (h irrepCoeff {Irrep.ψ, Irrep.barψ} V = 0 := by rw [irrepCoeff_eq_sum, Finset.sum_congr (g := fun s => coeff s V) (s₂ := {{ψ 0, barψ 0}, {ψ 0, barψ 1}, {ψ 1, barψ 0}, {ψ 1, barψ 1}}) (by decide) (by simp)] - suffices h : ∀ (a b : Fin 2), coeff {ψ a, barψ b} V = 0 by - repeat rw [Finset.sum_insert (by decide)] - simp only [h, Finset.sum_singleton, add_zero] - intro a b - refine coeff_U1_selection_rule hV (diagSL twoI) (diagScale twoI) (rep_diagSL_apply twoI) _ ?_ - simp only [Multiset.insert_eq_cons, diagScale, Fin.isValue, Units.val_inv_eq_inv_val, twoI_val, - _root_.mul_inv_rev, inv_I, neg_mul, star_neg, star_mul', RCLike.star_def, conj_I, star_inv₀, - star_ofNat, neg_neg, mul_neg, Multiset.map_cons, Multiset.map_singleton, Multiset.prod_cons, - Multiset.prod_singleton, mul_ite, ite_mul, ne_eq] - field_simp - simp only [Fin.isValue, I_sq, neg_neg, neg_mul, one_mul] - grind + repeat rw [Finset.sum_insert (by decide)] + simp only [coeff_ψ_barψ_selection_rule hV, Finset.sum_singleton, add_zero] + +lemma irrepCoeff_odd_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} + (hV : IsInvariant V) (s : Multiset Irrep) (hs : Odd s.card) : irrepCoeff s V = 0 := by + simp [irrepCoeff_eq_sum] + refine Finset.sum_eq_zero ?_ + intro s' hs' + simp [mem_allTermsWithIrrepContent_iff] at hs' + subst hs' + apply coeff_odd_selection_rule hV s' + simpa using hs + +lemma eq_sum_irrepCoeff_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) : + V = irrepCoeff {} V + irrepCoeff {Irrep.ψ, Irrep.ψ} V + + irrepCoeff {Irrep.barψ, Irrep.barψ} V + + irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V := by + nth_rewrite 1 [eq_sum_irrepCoeff_subset (irrepSupport_subset V)] + repeat rw [Finset.sum_insert (by decide)] + rw [Finset.sum_singleton] + rw [irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.ψ} (by decide), + irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.barψ} (by decide), + irrepCoeff_ψ_barψ_eq_zero_of_isInvariant hV, + irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.ψ, Irrep.barψ, Irrep.barψ} (by decide), + irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.ψ, Irrep.ψ, Irrep.barψ} (by decide)] + abel + +/-- Only the terms whose field content is `Nodup` survive in `irrepCoeff i`, since a + repeated fermionic field forces the coefficient to vanish (`coeff_fermionic_selection_rule`). + Hence if exactly one such term `s` exists, `irrepCoeff i` is just `coeff s`. -/ +lemma irrepCoeff_eq_coeff_of_filter_nodup {i : Multiset Irrep} {s : Multiset FieldSpecification} + (h : (allTermsWithIrrepContent i).filter (·.Nodup) = {s}) (V : EFTLagrangianExclDeriv) : + irrepCoeff i V = coeff s V := by + rw [irrepCoeff_eq_sum, ← Finset.sum_filter_of_ne + (fun t _ ht => by by_contra hn; exact ht (coeff_fermionic_selection_rule t hn)), + h, Finset.sum_singleton] + +lemma irrepCoeff_empty_eq {V : EFTLagrangianExclDeriv} : + irrepCoeff 0 V = coeff 0 V := + irrepCoeff_eq_coeff_of_filter_nodup (by decide) V + +lemma irrepCoeff_ψ_ψ_eq {V : EFTLagrangianExclDeriv} : + irrepCoeff {Irrep.ψ, Irrep.ψ} V = coeff {.ψ 0, .ψ 1} V := + irrepCoeff_eq_coeff_of_filter_nodup (by decide) V + +lemma irrepCoeff_barψ_barψ_eq {V : EFTLagrangianExclDeriv} : + irrepCoeff {Irrep.barψ, Irrep.barψ} V = coeff {.barψ 0, .barψ 1} V := + irrepCoeff_eq_coeff_of_filter_nodup (by decide) V + +lemma irrepCoeff_quartic_eq {V : EFTLagrangianExclDeriv} : + irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V = + coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1} V := + irrepCoeff_eq_coeff_of_filter_nodup (by set_option maxRecDepth 4000 in decide) V + +lemma irrepCoeff_empty_isInvariant {V : EFTLagrangianExclDeriv} : + IsInvariant (irrepCoeff 0 V) := by + rw [irrepCoeff_empty_eq] + exact coeff_empty_isInvariant lemma irrepCoeff_ψ_ψ_isInvariant {V : EFTLagrangianExclDeriv} : IsInvariant (irrepCoeff {Irrep.ψ, Irrep.ψ} V) := by - sorry + rw [irrepCoeff_ψ_ψ_eq] + exact coeff_ψ_ψ_isInvariant _ _ lemma irrepCoeff_barψ_barψ_isInvariant {V : EFTLagrangianExclDeriv} : IsInvariant (irrepCoeff {Irrep.barψ, Irrep.barψ} V) := by - sorry + rw [irrepCoeff_barψ_barψ_eq] + exact coeff_barψ_barψ_isInvariant _ _ lemma irrepCoeff_quadratic_isInvariant {V : EFTLagrangianExclDeriv} : IsInvariant (irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V) := by - sorry + rw [irrepCoeff_quartic_eq] + exact coeff_quartic_isInvariant + +lemma isInvariant_iff_eq_sum_irrepCoeff {V : EFTLagrangianExclDeriv} : + IsInvariant V ↔ V = irrepCoeff 0 V + irrepCoeff {Irrep.ψ, Irrep.ψ} V + + irrepCoeff {Irrep.barψ, Irrep.barψ} V + + irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V := by + constructor + · intro hV + exact eq_sum_irrepCoeff_of_isInvariant hV + · intro h + rw [h] + apply IsInvariant.add _ irrepCoeff_quadratic_isInvariant + apply IsInvariant.add _ irrepCoeff_barψ_barψ_isInvariant + apply IsInvariant.add irrepCoeff_empty_isInvariant irrepCoeff_ψ_ψ_isInvariant + +lemma isInvariant_iff_eq_sum_coeff {V : EFTLagrangianExclDeriv} : + IsInvariant V ↔ V = coeff 0 V + coeff {.ψ 0, .ψ 1} V + + coeff {.barψ 0, .barψ 1} V + coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1} V := by + rw [isInvariant_iff_eq_sum_irrepCoeff, irrepCoeff_empty_eq, irrepCoeff_ψ_ψ_eq, + irrepCoeff_barψ_barψ_eq, irrepCoeff_quartic_eq] + +lemma isInvariant_iff_eq_exists {V : EFTLagrangianExclDeriv} : + IsInvariant V ↔ + ∃ c : ℂ, ∃ m0 : ℂ, ∃ m1 : ℂ, ∃ ρ : ℂ, V = c • 1 + m0 • ([ψ 0]ₑ * [ψ 1]ₑ) + + m1 • ([barψ 0]ₑ * [barψ 1]ₑ) + ρ • ([ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ):= by + rw [isInvariant_iff_eq_sum_coeff] + obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := 0) (l := []) (by decide) + obtain ⟨m0, hm0⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1}) (l := [.ψ 0, .ψ 1]) (by decide) + obtain ⟨m1, hm1⟩ := coeff_eq_termOfList V (s := {.barψ 0, .barψ 1}) (l := [.barψ 0, .barψ 1]) (by decide) + obtain ⟨ρ, hρ⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) (l := [.ψ 0, .ψ 1, .barψ 0, .barψ 1]) (by decide) + rw [hc, hm0, hm1, hρ] + simp [termOfList] + constructor + · intro h + use c, m0, m1, ρ + rw [h] + grind + · rintro ⟨c', m0', m1', ρ', rfl⟩ + simp_all + sorry /-! From 23b7da79ddeaa16750d92538305814830c680f34 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 05:27:48 +0100 Subject: [PATCH 041/254] feat: Fill in proof --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 2212eec84..7032a60d1 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1416,8 +1416,10 @@ lemma isInvariant_iff_eq_exists {V : EFTLagrangianExclDeriv} : rw [isInvariant_iff_eq_sum_coeff] obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := 0) (l := []) (by decide) obtain ⟨m0, hm0⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1}) (l := [.ψ 0, .ψ 1]) (by decide) - obtain ⟨m1, hm1⟩ := coeff_eq_termOfList V (s := {.barψ 0, .barψ 1}) (l := [.barψ 0, .barψ 1]) (by decide) - obtain ⟨ρ, hρ⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) (l := [.ψ 0, .ψ 1, .barψ 0, .barψ 1]) (by decide) + obtain ⟨m1, hm1⟩ := coeff_eq_termOfList V (s := {.barψ 0, .barψ 1}) + (l := [.barψ 0, .barψ 1]) (by decide) + obtain ⟨ρ, hρ⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) + (l := [.ψ 0, .ψ 1, .barψ 0, .barψ 1]) (by decide) rw [hc, hm0, hm1, hρ] simp [termOfList] constructor @@ -1425,9 +1427,20 @@ lemma isInvariant_iff_eq_exists {V : EFTLagrangianExclDeriv} : use c, m0, m1, ρ rw [h] grind - · rintro ⟨c', m0', m1', ρ', rfl⟩ + · rintro ⟨c', m0', m1', ρ', hV⟩ + simp [← mul_assoc] + rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = + termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, + show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], + show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV ⊢ + rw [hV] at hm0 hρ hm1 hc + simp only [Fin.isValue, map_add, map_smul, coeff_one, Multiset.empty_eq_zero, smul_ite, + smul_zero, coeff_apply_termOfList, ↓reduceIte, Multiset.coe_eq_zero, reduceCtorEq, add_zero, + termOfList_nil, ne_eq, one_ne_zero, not_false_eq_true, smul_left_inj] at hm0 hρ hm1 hc + rw [if_neg (by decide), if_pos (by decide), if_neg (by decide), if_neg (by decide)] at hm0 + rw [if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos (by decide)] at hρ + rw [if_neg (by decide), if_neg (by decide), if_pos (by decide), if_neg (by decide)] at hm1 simp_all - sorry /-! @@ -1486,13 +1499,6 @@ lemma eq_sum_massDimCoeff (V : EFTLagrangianExclDeriv) : simp only [massDimSupport, massDimCoeff_eq_sum] exact eq_sum_fiber_coeff mem_allTermsWithMassDimension_iff V -/-! - -## Constraining the effective potential - --/ - - end EFTLagrangianExclDeriv end From 3cafa972d75d7360e18c5d93f4b0bebfd5cf8488 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 08:11:50 +0100 Subject: [PATCH 042/254] feat: Start conjugate --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 121 +++++++++++++++++- 1 file changed, 119 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 7032a60d1..b202bae11 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -443,6 +443,18 @@ lemma massDimensionNat_cast (f : FieldSpecification) : rw [massDimensionNat_eq, massDimension_eq] norm_num + +/-! + +## Conjugation + +-/ + +def conjugate (ψ : FieldSpecification) : FieldSpecification := + match ψ with + | .ψ α => .barψ α + | .barψ α => .ψ α + end FieldSpecification namespace EFTLagrangianExclDeriv @@ -482,6 +494,16 @@ lemma mul_termOfList_of_mem (ψ : FieldSpecification) (l : List FieldSpecificati · simp [termOfList_cons, ← mul_assoc, toEFTLagrangianExclDeriv_mul_anti_commute ψ β] simp [mul_assoc, ih ha] +lemma termOfList_comm_fieldSpecification (ψ : FieldSpecification) (l : List FieldSpecification) : + termOfList l * [ψ]ₑ = ((-1) ^ l.length : ℂ) • ([ψ]ₑ * termOfList l) := by + induction l with + | nil => simp + | cons β t ih => + simp only [termOfList_cons, mul_assoc, ih, Algebra.mul_smul_comm, List.length_cons] + simp only [← mul_assoc, toEFTLagrangianExclDeriv_mul_anti_commute β ψ, neg_mul, smul_neg] + ring_nf + simp + lemma termOfList_zero_of_not_nodup (l : List FieldSpecification) (h : ¬ l.Nodup) : termOfList l = 0 := by revert h @@ -580,7 +602,7 @@ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : | add a b ha hb => exact add_mem ha hb lemma termOfList_perm_neq_zero {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : - ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ c ≠ 0 := by + ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ (c = 1 ∨ c = -1) := by induction h with | nil => exact ⟨1, by simp⟩ | cons x _ ih => @@ -601,6 +623,62 @@ lemma termOfList_perm {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : obtain ⟨c, h1, h2⟩ := termOfList_perm_neq_zero h exact ⟨c, h1⟩ + +lemma termOfList_reverse_eq {l : List FieldSpecification} : + termOfList l.reverse = ((-1) ^ (l.length.choose 2) : ℂ) • termOfList l := by + induction l with + | nil => simp + | cons ψ t ih => + rw [List.reverse_cons, termOfList_append, termOfList_singleton, ih, smul_mul_assoc, + termOfList_comm_fieldSpecification, ← termOfList_cons, smul_smul, ← pow_add, + List.length_cons, Nat.choose_succ_succ, Nat.choose_one_right, Nat.add_comm] + +lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldSpecification} {c : ℂ} + (h : termOfList l1 = c • termOfList l2) : + termOfList l1.reverse = c • termOfList l2.reverse := by + have hf : ∀ l : List FieldSpecification, + CliffordAlgebra.reverse (termOfList l) = termOfList l.reverse := by + intro l + induction l with + | nil => simp + | cons ψ t ih => + rw [termOfList_cons, CliffordAlgebra.reverse.map_mul, ih, List.reverse_cons, + termOfList_append, termOfList_singleton, toEFTLagrangianExclDeriv_eq, + CliffordAlgebra.reverse_ι] + rw [← hf, ← hf, h, map_smul] + +lemma termOfList_reverse_zero_of_zero {l : List FieldSpecification} (h : termOfList l = 0) : + termOfList l.reverse = 0 := by + rw [termOfList_reverse_eq, h, smul_zero] + +lemma termOfList_conjugate_eq_of_eq {l1 l2 : List FieldSpecification} {c : ℂ} + (h : termOfList l1 = c • termOfList l2) : + termOfList (l1.map conjugate) = c • termOfList (l2.map conjugate) := by + let f := ExteriorAlgebra.map (moduleBasis.constr ℂ fun ψ => moduleBasis (conjugate ψ)) + have hf : ∀ l : List FieldSpecification, f (termOfList l) = termOfList (l.map conjugate) := by + intro l + induction l with + | nil => simp [f] + | cons ψ t ih => + rw [termOfList_cons, List.map_cons, termOfList_cons, map_mul, ih] + congr 1 + simp [f, toEFTLagrangianExclDeriv_eq, ExteriorAlgebra.map_apply_ι] + rw [← hf, ← hf, h, map_smul] + +lemma termOfList_conjugate_zero_of_zero {l : List FieldSpecification} (h : termOfList l = 0) : + termOfList (l.map conjugate) = 0 := by + let f := ExteriorAlgebra.map (moduleBasis.constr ℂ fun ψ => moduleBasis (conjugate ψ)) + have hf : ∀ l : List FieldSpecification, f (termOfList l) = termOfList (l.map conjugate) := by + intro l + induction l with + | nil => simp [f] + | cons ψ t ih => + rw [termOfList_cons, List.map_cons, termOfList_cons, map_mul, ih] + congr 1 + simp [f, toEFTLagrangianExclDeriv_eq, ExteriorAlgebra.map_apply_ι] + rw [← hf, h] + simp + lemma termOfList_eq_ιMulti (l : List FieldSpecification) : termOfList l = ExteriorAlgebra.ιMulti ℂ l.length (fun i => moduleBasis (l.get i)) := by induction l with @@ -1156,7 +1234,7 @@ lemma repSupport_eq_termOfList {s : Multiset FieldSpecification} (g : SL(2, ℂ) (by apply Multiset.coe_eq_coe.mp; simp [hl]) simp [h1] apply support_smul_neq_zero - exact hc + grind lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecification} (g : SL(2, ℂ)) (h : ∀ ψ : FieldSpecification, repSupport {ψ} g ⊆ {{ψ}}) : @@ -1499,6 +1577,45 @@ lemma eq_sum_massDimCoeff (V : EFTLagrangianExclDeriv) : simp only [massDimSupport, massDimCoeff_eq_sum] exact eq_sum_fiber_coeff mem_allTermsWithMassDimension_iff V +/-! + +## Conjugation + +-/ + +/-- The conjugate of a coefficient. -/ +def conjCoeff (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv): + EFTLagrangianExclDeriv := + let c := Classical.choose (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) + starRingEnd ℂ c • termOfList (s.toList.map conjugate).reverse + +lemma conjCoeff_of_eq_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) + (V : EFTLagrangianExclDeriv) (c : ℂ) (hl : Multiset.ofList l = s) + (h : coeff s V = c • termOfList l) : + conjCoeff s V = starRingEnd ℂ c • termOfList (l.map conjugate).reverse := by + obtain ⟨b, hb1, hb2⟩ := termOfList_perm_neq_zero (l1 := s.toList) (l2 := l) + (by subst hl; rw [← Multiset.coe_eq_coe ]; simp) + let c' := Classical.choose (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) + have hc' : coeff s V = c' • termOfList s.toList := + Classical.choose_spec (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) + change starRingEnd ℂ c' • termOfList (s.toList.map conjugate).reverse = _ + rw [h] at hc' + have hx1 := termOfList_reverse_eq_of_eq (termOfList_conjugate_eq_of_eq hb1) + rw [hx1, smul_smul] + rw [hb1, smul_smul] at hc' + have hx2 : (c - c' * b) • termOfList l = 0 := by + simp [sub_smul, hc'] + simp at hx2 + rcases hx2 with (h0 | h1) + · congr + grind + · rw [termOfList_reverse_zero_of_zero (termOfList_conjugate_zero_of_zero h1)] + simp + +lemma conjCoeff_add (s : Multiset FieldSpecification) (V W : EFTLagrangianExclDeriv) : + conjCoeff s (V + W) = conjCoeff s V + conjCoeff s W := by + sorry + end EFTLagrangianExclDeriv end From f86757db230400471e52f702f278476d97ca65ed Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 10:14:53 +0100 Subject: [PATCH 043/254] feat: Add conjugation --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 180 +++++++++++++++++- 1 file changed, 173 insertions(+), 7 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index b202bae11..6ec0ccd73 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -895,10 +895,11 @@ lemma coeff_eq_termOfList {s : Multiset FieldSpecification} lemma coeff_eq_exists_termOfList (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv) : - ∃ l, ∃ c : ℂ, coeff s V = c • termOfList l := by + ∃ l, ∃ c : ℂ, (coeff s V = c • termOfList l) ∧ Multiset.ofList l = s := by obtain ⟨c, hl⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) use Multiset.toList s use c + simp [hl] lemma coeff_monomial_selection_rule (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [σ ψ]ₑ) @@ -1584,15 +1585,15 @@ lemma eq_sum_massDimCoeff (V : EFTLagrangianExclDeriv) : -/ /-- The conjugate of a coefficient. -/ -def conjCoeff (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv): +def conjCoeffMap (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv) : EFTLagrangianExclDeriv := let c := Classical.choose (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) starRingEnd ℂ c • termOfList (s.toList.map conjugate).reverse -lemma conjCoeff_of_eq_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) +lemma conjCoeffMap_of_eq_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) (V : EFTLagrangianExclDeriv) (c : ℂ) (hl : Multiset.ofList l = s) (h : coeff s V = c • termOfList l) : - conjCoeff s V = starRingEnd ℂ c • termOfList (l.map conjugate).reverse := by + conjCoeffMap s V = starRingEnd ℂ c • termOfList (l.map conjugate).reverse := by obtain ⟨b, hb1, hb2⟩ := termOfList_perm_neq_zero (l1 := s.toList) (l2 := l) (by subst hl; rw [← Multiset.coe_eq_coe ]; simp) let c' := Classical.choose (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) @@ -1612,9 +1613,174 @@ lemma conjCoeff_of_eq_termOfList (s : Multiset FieldSpecification) (l : List Fie · rw [termOfList_reverse_zero_of_zero (termOfList_conjugate_zero_of_zero h1)] simp -lemma conjCoeff_add (s : Multiset FieldSpecification) (V W : EFTLagrangianExclDeriv) : - conjCoeff s (V + W) = conjCoeff s V + conjCoeff s W := by - sorry +@[simp] +lemma conjCoeffMap_add (s : Multiset FieldSpecification) (V W : EFTLagrangianExclDeriv) : + conjCoeffMap s (V + W) = conjCoeffMap s V + conjCoeffMap s W := by + obtain ⟨l, c, hV, hl⟩ := coeff_eq_exists_termOfList s V + obtain ⟨d, hW⟩ := coeff_eq_termOfList W hl + have hVW : coeff s (V + W) = (c + d) • termOfList l := by + simp [hV, hW, add_smul] + rw [conjCoeffMap_of_eq_termOfList s l (V + W) (c + d) hl hVW, + conjCoeffMap_of_eq_termOfList s l V c hl hV, conjCoeffMap_of_eq_termOfList s l W d hl hW] + simp [add_smul] + +@[simp] +lemma conjCoeff_smul (s : Multiset FieldSpecification) (c : ℂ) (V : EFTLagrangianExclDeriv) : + conjCoeffMap s (c • V) = starRingEnd ℂ c • conjCoeffMap s V := by + obtain ⟨l, d, hV, hl⟩ := coeff_eq_exists_termOfList s V + have h : coeff s (c • V) = (c * d) • termOfList l := by + simp [hV, smul_smul] + rw [conjCoeffMap_of_eq_termOfList s l (c • V) (c * d) hl h, + conjCoeffMap_of_eq_termOfList s l V d hl hV] + simp [smul_smul] + +def conjCoeff (s : Multiset FieldSpecification) : EFTLagrangianExclDeriv →ₛₗ[starRingEnd ℂ] EFTLagrangianExclDeriv where + toFun := conjCoeffMap s + map_add' := conjCoeffMap_add s + map_smul' := conjCoeff_smul s + +lemma conjCoeff_of_eq_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) + (V : EFTLagrangianExclDeriv) (c : ℂ) (hl : Multiset.ofList l = s) + (h : coeff s V = c • termOfList l) : + conjCoeff s V = starRingEnd ℂ c • termOfList (l.map conjugate).reverse := by + simp [conjCoeff, conjCoeffMap_of_eq_termOfList s l V c hl h] + +/-- The conjugate coefficient vanishes on field contents outside the support, since there + the coefficient itself is zero. -/ +lemma conjCoeff_eq_zero_of_not_mem_support {s : Multiset FieldSpecification} + {V : EFTLagrangianExclDeriv} (h : s ∉ support V) : conjCoeff s V = 0 := by + rw [conjCoeff_of_eq_termOfList s s.toList V 0 (by simp) + (by simp [coeff_eq_zero_of_not_mem_support h])] + simp + +lemma conjCoeff_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) : + conjCoeff s (termOfList l) = if Multiset.ofList l = s then + termOfList (l.map conjugate).reverse else 0 := by + split_ifs with h + · have h0 : coeff s (termOfList l) = (1 : ℂ) • termOfList l := by + simp [coeff_apply_termOfList, h] + rw [conjCoeff_of_eq_termOfList s l (termOfList l) 1 h h0] + simp + · apply conjCoeff_eq_zero_of_not_mem_support + simp [mem_support_termOfList_iff] + grind + +def conjugate : EFTLagrangianExclDeriv →ₛₗ[starRingEnd ℂ] EFTLagrangianExclDeriv where + toFun := fun V => ∑ s ∈ support V, conjCoeff s V + map_add' := by + intro V W + rw [Finset.sum_subset support_add + (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs), + Finset.sum_subset (Finset.subset_union_left (s₂ := support W)) + (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs), + Finset.sum_subset (Finset.subset_union_right (s₁ := support V)) + (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs)] + simp [map_add, Finset.sum_add_distrib] + map_smul' := by + intro c V + rw [Finset.sum_subset (support_smul c) + (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs)] + simp [map_smulₛₗ, Finset.smul_sum] + +lemma conjugate_termOfList (l : List FieldSpecification) : + conjugate (termOfList l) = termOfList (l.map .conjugate).reverse := by + simp [conjugate, conjCoeff_termOfList, mem_support_termOfList_iff] + intro h + exact (termOfList_reverse_zero_of_zero (termOfList_conjugate_zero_of_zero h)).symm + +@[simp] +lemma conjugate_one : conjugate 1 = 1 := by + trans conjugate (termOfList []) + · simp + rw [conjugate_termOfList] + simp + +/-! + +## IsReal condition + +-/ + +def IsReal (V : EFTLagrangianExclDeriv) : Prop := conjugate V = V + + +/-- The lemma expressing the form of an element of `EFTLagrangianExclDeriv`, if it is both + invariant under the Lorentz group and is real. + + This expresses the EFT lagrangian in terms of the Majorana mass trem. -/ +lemma isInvariant_and_isReal_iff_eq_exists {V : EFTLagrangianExclDeriv} : + IsInvariant V ∧ IsReal V ↔ ∃ c : ℝ, ∃ m0 : ℂ, ∃ ρ : ℝ, V = (c : ℂ) • 1 + m0 • ([ψ 0]ₑ * [ψ 1]ₑ) - + starRingEnd ℂ m0 • ([barψ 0]ₑ * [barψ 1]ₑ) + + (ρ : ℂ) • ([ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ) := by + have h_quartic : termOfList [ψ 1, ψ 0, barψ 1, barψ 0] = termOfList [ψ 0, ψ 1, barψ 0, barψ 1] := by + simp [termOfList, toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0) (barψ 1)] + simp [← mul_assoc, toEFTLagrangianExclDeriv_mul_anti_commute (ψ 0) (ψ 1)] + constructor + · rintro ⟨hi, hr⟩ + rw [isInvariant_iff_eq_exists] at hi + obtain ⟨c, m0, m1, ρ, hV⟩ := hi + rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = + termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, + show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], + show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV ⊢ + simp [IsReal, hV, conjugate_termOfList] at hr + have h0 := congr_arg (coeff 0) hr + have h1 := congr_arg (coeff {.ψ 0, .ψ 1}) hr + have h2 := congr_arg (coeff {.barψ 0, .barψ 1}) hr + have h3 := congr_arg (coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) hr + simp +decide [coeff_apply_termOfList, coeff_one] at h0 h1 h2 h3 + have hc : c = (c.re : ℂ) := by rw [← propext (re_eq_ofReal_of_isSelfAdjoint h0)] + generalize c.re = c' at hc + use c', m0, ρ.re + rw [hV] + subst hc + simp + have hx : m1 • termOfList [barψ 0, barψ 1] = - starRingEnd ℂ m0 • termOfList [barψ 0, barψ 1] := by + rw [← h2] + simp [termOfList, FieldSpecification.conjugate, + toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0)] + rw [hx] + simp only [Fin.isValue, neg_smul] + suffices h : ρ • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = + ρ.re • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] by + simp [h] + abel + suffices h : (ρ - starRingEnd ℂ ρ ) • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = 0 by + simp at h + rcases h with (h0 | h1) + · have hρ : ρ = (ρ.re : ℂ) := by + rw [← propext (re_eq_ofReal_of_isSelfAdjoint _)] + rw [isSelfAdjoint_iff] + rw [starRingEnd_apply] at h0 + grind + generalize ρ.re = ρ' at hρ + subst hρ + simp + · simp [h1] + simp [sub_smul, ← h3, FieldSpecification.conjugate] + simp [h_quartic] + · rintro ⟨c, m0, ρ, hV⟩ + constructor + · rw [isInvariant_iff_eq_exists] + use (c : ℂ), m0, - starRingEnd ℂ m0, ρ + rw [hV] + simp + abel + · rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = + termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, + show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], + show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV + subst hV + simp [IsReal, -coe_smul, Fin.isValue, map_add, map_sub, LinearMap.map_smulₛₗ, + RingHomCompTriple.comp_apply, RingHom.id_apply, conjugate_termOfList, + FieldSpecification.conjugate, h_quartic] + simp [termOfList, toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0) (barψ 1), + toEFTLagrangianExclDeriv_mul_anti_commute (ψ 0) (ψ 1)] + abel + + + + end EFTLagrangianExclDeriv From 21f1e50e78c78b1005f2a2780eadda34255413ed Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 10:19:29 +0100 Subject: [PATCH 044/254] refactor: Golf --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 6ec0ccd73..2cba5afb8 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1685,15 +1685,11 @@ def conjugate : EFTLagrangianExclDeriv →ₛₗ[starRingEnd ℂ] EFTLagrangianE lemma conjugate_termOfList (l : List FieldSpecification) : conjugate (termOfList l) = termOfList (l.map .conjugate).reverse := by simp [conjugate, conjCoeff_termOfList, mem_support_termOfList_iff] - intro h - exact (termOfList_reverse_zero_of_zero (termOfList_conjugate_zero_of_zero h)).symm + exact fun h => (termOfList_reverse_zero_of_zero (termOfList_conjugate_zero_of_zero h)).symm @[simp] lemma conjugate_one : conjugate 1 = 1 := by - trans conjugate (termOfList []) - · simp - rw [conjugate_termOfList] - simp + simp [← termOfList_nil, conjugate_termOfList] /-! @@ -1778,10 +1774,6 @@ lemma isInvariant_and_isReal_iff_eq_exists {V : EFTLagrangianExclDeriv} : toEFTLagrangianExclDeriv_mul_anti_commute (ψ 0) (ψ 1)] abel - - - - end EFTLagrangianExclDeriv end From d1a69e5e64b534d10407950c4327c25c04707e50 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 10:20:28 +0100 Subject: [PATCH 045/254] refactor: More golf --- .../Particles/PureFermionic/EFTLagrangianExclDeriv.lean | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 2cba5afb8..a3ab0e554 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1513,12 +1513,9 @@ lemma isInvariant_iff_eq_exists {V : EFTLagrangianExclDeriv} : show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV ⊢ rw [hV] at hm0 hρ hm1 hc - simp only [Fin.isValue, map_add, map_smul, coeff_one, Multiset.empty_eq_zero, smul_ite, - smul_zero, coeff_apply_termOfList, ↓reduceIte, Multiset.coe_eq_zero, reduceCtorEq, add_zero, - termOfList_nil, ne_eq, one_ne_zero, not_false_eq_true, smul_left_inj] at hm0 hρ hm1 hc - rw [if_neg (by decide), if_pos (by decide), if_neg (by decide), if_neg (by decide)] at hm0 - rw [if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos (by decide)] at hρ - rw [if_neg (by decide), if_neg (by decide), if_pos (by decide), if_neg (by decide)] at hm1 + simp +decide only [Fin.isValue, map_add, map_smul, coeff_one, ↓reduceIte, smul_zero, + coeff_apply_termOfList, add_zero, termOfList_nil, ne_eq, one_ne_zero, not_false_eq_true, + smul_left_inj] at hm0 hρ hm1 hc simp_all /-! From ec4df031256d85f75e69fc71fb566162e0aac677 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 11:13:09 +0100 Subject: [PATCH 046/254] feat: Add HasMassDimLE lemmas --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index a3ab0e554..c3ce21072 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1121,6 +1121,15 @@ lemma support_add {V W : EFTLagrangianExclDeriv} : simp [support] grind +lemma support_sub {V W : EFTLagrangianExclDeriv} : + support (V - W) ⊆ support V ∪ support W := by + simp [support] + grind + +lemma support_one : support 1 = {{}} := by + simp [support, coeff_one] + rfl + lemma support_smul {V : EFTLagrangianExclDeriv} (c : ℂ) : support (c • V) ⊆ support V := by simp [support] @@ -1566,15 +1575,186 @@ lemma massDimCoeff_termOfList (n : ℚ) (l : List FieldSpecification) : if (Multiset.map massDimension (Multiset.ofList l)).sum = n then termOfList l else 0 := by simp [massDimCoeff_eq_sum, coeff_apply_termOfList, mem_allTermsWithMassDimension_iff] +lemma massDimCoeff_termOfList_ofNat (n : ℕ) (l : List FieldSpecification) : + massDimCoeff (n) (termOfList l) = + if (Multiset.map massDimensionNat (Multiset.ofList l)).sum = 2 * n then termOfList l else 0 := by + rw [massDimCoeff_termOfList] + simp + congr 1 + field_simp + simp + constructor + · intro h + exact_mod_cast h + · intro h + exact_mod_cast h + + +lemma massDimCoeff_one (n : ℚ) : massDimCoeff n 1 = if n = 0 then 1 else 0 := by + rw [massDimCoeff_eq_sum] + simp only [coeff_one] + rw [Finset.sum_ite_eq'] + refine if_congr ?_ rfl rfl + rw [mem_allTermsWithMassDimension_iff] + simp [eq_comm] + /-- The mass dimensions of the operators appearing in an effective potential. -/ def massDimSupport (V : EFTLagrangianExclDeriv) : Finset ℚ := (support V).image (fun s => (s.map massDimension).sum) +lemma massDimSupport_add {V W : EFTLagrangianExclDeriv} : + massDimSupport (V + W) ⊆ massDimSupport V ∪ massDimSupport W := by + simp [massDimSupport, ← Finset.image_union] + apply Finset.image_subset_image + exact support_add + +lemma massDimSupport_sub {V W : EFTLagrangianExclDeriv} : + massDimSupport (V - W) ⊆ massDimSupport V ∪ massDimSupport W := by + simp [massDimSupport, ← Finset.image_union] + apply Finset.image_subset_image + exact support_sub + +lemma massDimSupport_one : massDimSupport 1 = {0} := by + simp [support_one, massDimSupport] + +lemma massDimSupport_smul {c : ℂ} {V : EFTLagrangianExclDeriv} : + massDimSupport (c • V) ⊆ massDimSupport V := by + simp [massDimSupport, ] + apply Finset.image_subset_image + exact support_smul c + +lemma massDimSupport_termOfList (l : List FieldSpecification) : + massDimSupport (termOfList l) ⊆ {(Multiset.map massDimension (Multiset.ofList l)).sum} := by + trans ({Multiset.ofList l} : Finset (Multiset FieldSpecification)).image + (fun s => (s.map massDimension).sum) + · apply Finset.image_subset_image + exact support_termOfList_subset l + · simp + lemma eq_sum_massDimCoeff (V : EFTLagrangianExclDeriv) : V = ∑ n ∈ massDimSupport V, massDimCoeff n V := by simp only [massDimSupport, massDimCoeff_eq_sum] exact eq_sum_fiber_coeff mem_allTermsWithMassDimension_iff V +def HasMassDimLE (n : ℚ) (V : EFTLagrangianExclDeriv): Prop := + ∀ s ∈ massDimSupport V, s ≤ n + +lemma HasMassDimLE.add {n : ℚ} {V W : EFTLagrangianExclDeriv} (hV : HasMassDimLE n V) + (hW : HasMassDimLE n W) : HasMassDimLE n (V + W) := by + intro s hs + have h1 := massDimSupport_add hs + simp at h1 + rcases h1 with h1 | h1 + · exact hV s h1 + · exact hW s h1 + +lemma HasMassDimLE.sub {n : ℚ} {V W : EFTLagrangianExclDeriv} (hV : HasMassDimLE n V) + (hW : HasMassDimLE n W) : HasMassDimLE n (V - W) := by + intro s hs + have h1 := massDimSupport_sub hs + simp at h1 + rcases h1 with h1 | h1 + · exact hV s h1 + · exact hW s h1 + +lemma HasMassDimLE.smul {n : ℚ} {c : ℂ} {V : EFTLagrangianExclDeriv} (hV : HasMassDimLE n V) : + HasMassDimLE n (c • V) := by + intro s hs + have h1 := massDimSupport_smul hs + exact hV s h1 + +lemma HasMassDimLE.one {n : ℚ} (hn : 0 ≤ n): HasMassDimLE n 1 := by + simp [HasMassDimLE, massDimSupport_one] + exact hn + +lemma HasMassDimLE.termOfList {n : ℚ} {l : List FieldSpecification} + (hl : (Multiset.map massDimension (Multiset.ofList l)).sum ≤ n) : + HasMassDimLE n (termOfList l) := by + intro s hs + have hs' := massDimSupport_termOfList l hs + simp_all + +/-- Off the mass-dimension support the projection vanishes: if no operator of `V` has + mass dimension `q`, then `massDimCoeff q V = 0`. -/ +lemma massDimCoeff_eq_zero_of_not_mem_massDimSupport {q : ℚ} {V : EFTLagrangianExclDeriv} + (h : q ∉ massDimSupport V) : massDimCoeff q V = 0 := by + rw [massDimCoeff_eq_sum] + refine Finset.sum_eq_zero fun s hs => ?_ + rw [mem_allTermsWithMassDimension_iff] at hs + refine coeff_eq_zero_of_not_mem_support fun hsupp => h ?_ + rw [massDimSupport] + exact Finset.mem_image.mpr ⟨s, hsupp, hs⟩ + +lemma eq_sum_of_hasMassDimLE {n : ℕ} {V : EFTLagrangianExclDeriv} (h : HasMassDimLE n V) : + V = ∑ m ∈ Finset.range (2 * n + 1), massDimCoeff (m / (2 : ℚ)) V := by + have hinj : ∀ x ∈ Finset.range (2 * n + 1), ∀ y ∈ Finset.range (2 * n + 1), + (x / (2 : ℚ)) = (y / (2 : ℚ)) → x = y := by + intro x _ y _ hxy + exact_mod_cast (by linarith : (x : ℚ) = y) + have hreindex : (∑ m ∈ Finset.range (2 * n + 1), massDimCoeff (m / (2 : ℚ)) V) + = ∑ q ∈ (Finset.range (2 * n + 1)).image (fun m : ℕ => (m : ℚ) / 2), massDimCoeff q V := + (Finset.sum_image (f := fun q => massDimCoeff q V) hinj).symm + rw [hreindex] + conv_lhs => rw [eq_sum_massDimCoeff V] + refine Finset.sum_subset ?_ (fun q _ hq => massDimCoeff_eq_zero_of_not_mem_massDimSupport hq) + rw [massDimSupport, Finset.image_subset_iff] + intro s hs + have hle : (s.map massDimension).sum ≤ (n : ℚ) := + h _ (by rw [massDimSupport]; exact Finset.mem_image.mpr ⟨s, hs, rfl⟩) + rw [sum_map_massDimension] at hle + refine Finset.mem_image.mpr ⟨3 * s.card, Finset.mem_range.mpr ?_, ?_⟩ + · have h2 : (3 * s.card : ℚ) ≤ 2 * n := by linarith + have : 3 * s.card ≤ 2 * n := by exact_mod_cast h2 + omega + · rw [sum_map_massDimension]; push_cast; ring + +lemma massDimCoeff_eq_zero_of_hasMassDimLE {n : ℕ} {V : EFTLagrangianExclDeriv} + (h : HasMassDimLE n V) (m : ℚ) (hm : n < m) : + massDimCoeff m V = 0 := by + apply massDimCoeff_eq_zero_of_not_mem_massDimSupport + simp [HasMassDimLE] at h + by_contra hn + have hl := h m hn + grind + + +/-- Applying `coeff s` to a mass-dimension projection: it returns `coeff s V` when the field + content `s` has mass dimension `q`, and `0` otherwise (the other coefficients are orthogonal + to `coeff s`). -/ +lemma coeff_massDimCoeff (q : ℚ) (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv) : + coeff s (massDimCoeff q V) = if (s.map massDimension).sum = q then coeff s V else 0 := by + rw [massDimCoeff_eq_sum, map_sum] + split_ifs with h + · rw [Finset.sum_eq_single s (fun t _ htn => coeff_coeff_eq_zero_of_diff (Ne.symm htn) V) + (fun hns => absurd ((mem_allTermsWithMassDimension_iff q s).mpr h) hns)] + exact coeff_coeff_self V + · refine Finset.sum_eq_zero fun t ht => ?_ + rw [mem_allTermsWithMassDimension_iff] at ht + exact coeff_coeff_eq_zero_of_diff (by rintro rfl; exact h ht) V + +lemma hasMassDimLE_iff_eq_sum {n : ℕ} {V : EFTLagrangianExclDeriv} : + HasMassDimLE n V ↔ V = ∑ m ∈ Finset.range (2 * n + 1), massDimCoeff (m / (2 : ℚ)) V := by + refine ⟨eq_sum_of_hasMassDimLE, fun hV => ?_⟩ + intro q hq + rw [massDimSupport, Finset.mem_image] at hq + obtain ⟨s, hs, rfl⟩ := hq + rw [mem_support_iff] at hs + have hcoeff : coeff s V + = ∑ m ∈ Finset.range (2 * n + 1), + if (s.map massDimension).sum = (m : ℚ) / 2 then coeff s V else 0 := by + conv_lhs => rw [hV] + rw [map_sum] + simp_rw [coeff_massDimCoeff] + have hex : ∃ m ∈ Finset.range (2 * n + 1), (s.map massDimension).sum = (m : ℚ) / 2 := by + by_contra hcon + push Not at hcon + exact hs (by rw [hcoeff]; exact Finset.sum_eq_zero fun m hm => if_neg (hcon m hm)) + obtain ⟨m, hm, hqm⟩ := hex + rw [Finset.mem_range] at hm + rw [hqm] + have hmn : (m : ℚ) ≤ 2 * (n : ℚ) := by exact_mod_cast (show m ≤ 2 * n from by omega) + linarith + /-! ## Conjugation @@ -1771,6 +1951,46 @@ lemma isInvariant_and_isReal_iff_eq_exists {V : EFTLagrangianExclDeriv} : toEFTLagrangianExclDeriv_mul_anti_commute (ψ 0) (ψ 1)] abel +/-- The lemma expressing the form of an element of `EFTLagrangianExclDeriv`, if it is + invariant under the Lorentz group and is real, and has mass dimension at most `4`. + + This expresses the EFT lagrangian in terms of the Majorana mass trem. -/ +lemma isInvariant_isReal_hasMassDimLE_four_iff_eq_exists {V : EFTLagrangianExclDeriv} : + IsInvariant V ∧ IsReal V ∧ HasMassDimLE 4 V ↔ ∃ c : ℝ, ∃ m0 : ℂ, + V = (c : ℂ) • 1 + m0 • ([ψ 0]ₑ * [ψ 1]ₑ) - starRingEnd ℂ m0 • ([barψ 0]ₑ * [barψ 1]ₑ) := by + constructor + · rintro ⟨hi, hr, hm⟩ + obtain ⟨c, m0, ρ, hV⟩ := (isInvariant_and_isReal_iff_eq_exists.mp ⟨hi, hr⟩) + use c, m0 + rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = + termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, + show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], + show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV + rw [hV] + simp + have hmass := massDimCoeff_eq_zero_of_hasMassDimLE hm (6 : ℕ) (by norm_num) + have h0 := massDimCoeff_termOfList_ofNat (n := 6) + simp only [Nat.cast_ofNat, massDimensionNat_eq, Multiset.map_coe, List.map_const', + Multiset.sum_coe, List.sum_replicate, smul_eq_mul, Nat.reduceMul] at h0 + simp +decide [hV, h0, massDimCoeff_one] at hmass + rw [show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], + show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] + rcases hmass with rfl | hmass + · simp + · simp [hmass] + · rintro ⟨c, m0, hV⟩ + rw [← and_assoc] + constructor + · rw [isInvariant_and_isReal_iff_eq_exists] + use c, m0, 0 + simp [hV] + · rw [show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], + show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV + rw [hV] + refine HasMassDimLE.sub + (HasMassDimLE.add (HasMassDimLE.smul (HasMassDimLE.one ?_)) + (HasMassDimLE.smul (HasMassDimLE.termOfList ?_))) + (HasMassDimLE.smul (HasMassDimLE.termOfList ?_)) <;> norm_num end EFTLagrangianExclDeriv end From 0c174b34e89890c24e1a2c2159f51f8e2c46b1d7 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:21:23 +0100 Subject: [PATCH 047/254] refactor: Golf --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index c3ce21072..588bc370f 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1422,13 +1422,8 @@ lemma eq_sum_irrepCoeff_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInva irrepCoeff {Irrep.barψ, Irrep.barψ} V + irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V := by nth_rewrite 1 [eq_sum_irrepCoeff_subset (irrepSupport_subset V)] - repeat rw [Finset.sum_insert (by decide)] - rw [Finset.sum_singleton] - rw [irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.ψ} (by decide), - irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.barψ} (by decide), - irrepCoeff_ψ_barψ_eq_zero_of_isInvariant hV, - irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.ψ, Irrep.barψ, Irrep.barψ} (by decide), - irrepCoeff_odd_eq_zero_of_isInvariant hV {Irrep.ψ, Irrep.ψ, Irrep.barψ} (by decide)] + simp +decide [Finset.sum_insert, Finset.sum_singleton, -Multiset.insert_eq_cons, + irrepCoeff_odd_eq_zero_of_isInvariant hV, irrepCoeff_ψ_barψ_eq_zero_of_isInvariant hV] abel /-- Only the terms whose field content is `Nodup` survive in `irrepCoeff i`, since a @@ -1876,7 +1871,6 @@ lemma conjugate_one : conjugate 1 = 1 := by def IsReal (V : EFTLagrangianExclDeriv) : Prop := conjugate V = V - /-- The lemma expressing the form of an element of `EFTLagrangianExclDeriv`, if it is both invariant under the Lorentz group and is real. @@ -1892,10 +1886,7 @@ lemma isInvariant_and_isReal_iff_eq_exists {V : EFTLagrangianExclDeriv} : · rintro ⟨hi, hr⟩ rw [isInvariant_iff_eq_exists] at hi obtain ⟨c, m0, m1, ρ, hV⟩ := hi - rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = - termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, - show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], - show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV ⊢ + simp [← termOfList_singleton, ← termOfList_append] at hV ⊢ simp [IsReal, hV, conjugate_termOfList] at hr have h0 := congr_arg (coeff 0) hr have h1 := congr_arg (coeff {.ψ 0, .ψ 1}) hr @@ -1939,10 +1930,7 @@ lemma isInvariant_and_isReal_iff_eq_exists {V : EFTLagrangianExclDeriv} : rw [hV] simp abel - · rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = - termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, - show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], - show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV + · simp only [← termOfList_singleton, ← termOfList_append] at hV subst hV simp [IsReal, -coe_smul, Fin.isValue, map_add, map_sub, LinearMap.map_smulₛₗ, RingHomCompTriple.comp_apply, RingHom.id_apply, conjugate_termOfList, @@ -1962,10 +1950,7 @@ lemma isInvariant_isReal_hasMassDimLE_four_iff_eq_exists {V : EFTLagrangianExclD · rintro ⟨hi, hr, hm⟩ obtain ⟨c, m0, ρ, hV⟩ := (isInvariant_and_isReal_iff_eq_exists.mp ⟨hi, hr⟩) use c, m0 - rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = - termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, - show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], - show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV + simp only [← termOfList_singleton, ← termOfList_append] at hV rw [hV] simp have hmass := massDimCoeff_eq_zero_of_hasMassDimLE hm (6 : ℕ) (by norm_num) @@ -1973,8 +1958,7 @@ lemma isInvariant_isReal_hasMassDimLE_four_iff_eq_exists {V : EFTLagrangianExclD simp only [Nat.cast_ofNat, massDimensionNat_eq, Multiset.map_coe, List.map_const', Multiset.sum_coe, List.sum_replicate, smul_eq_mul, Nat.reduceMul] at h0 simp +decide [hV, h0, massDimCoeff_one] at hmass - rw [show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], - show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] + simp only [← termOfList_singleton, ← termOfList_append] rcases hmass with rfl | hmass · simp · simp [hmass] @@ -1984,13 +1968,13 @@ lemma isInvariant_isReal_hasMassDimLE_four_iff_eq_exists {V : EFTLagrangianExclD · rw [isInvariant_and_isReal_iff_eq_exists] use c, m0, 0 simp [hV] - · rw [show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], - show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV + · simp only [← termOfList_singleton, ← termOfList_append] at hV rw [hV] refine HasMassDimLE.sub (HasMassDimLE.add (HasMassDimLE.smul (HasMassDimLE.one ?_)) (HasMassDimLE.smul (HasMassDimLE.termOfList ?_))) (HasMassDimLE.smul (HasMassDimLE.termOfList ?_)) <;> norm_num + end EFTLagrangianExclDeriv end From a754535440e44fac9514dde2bcfd89cb02780e85 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:44:37 +0100 Subject: [PATCH 048/254] refactor: Golf --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 50 +++++++------------ 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean index 588bc370f..b5c589cf4 100644 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean @@ -1584,7 +1584,6 @@ lemma massDimCoeff_termOfList_ofNat (n : ℕ) (l : List FieldSpecification) : · intro h exact_mod_cast h - lemma massDimCoeff_one (n : ℚ) : massDimCoeff n 1 = if n = 0 then 1 else 0 := by rw [massDimCoeff_eq_sum] simp only [coeff_one] @@ -1889,40 +1888,26 @@ lemma isInvariant_and_isReal_iff_eq_exists {V : EFTLagrangianExclDeriv} : simp [← termOfList_singleton, ← termOfList_append] at hV ⊢ simp [IsReal, hV, conjugate_termOfList] at hr have h0 := congr_arg (coeff 0) hr - have h1 := congr_arg (coeff {.ψ 0, .ψ 1}) hr have h2 := congr_arg (coeff {.barψ 0, .barψ 1}) hr have h3 := congr_arg (coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) hr - simp +decide [coeff_apply_termOfList, coeff_one] at h0 h1 h2 h3 - have hc : c = (c.re : ℂ) := by rw [← propext (re_eq_ofReal_of_isSelfAdjoint h0)] - generalize c.re = c' at hc - use c', m0, ρ.re - rw [hV] - subst hc - simp - have hx : m1 • termOfList [barψ 0, barψ 1] = - starRingEnd ℂ m0 • termOfList [barψ 0, barψ 1] := by + simp +decide [coeff_apply_termOfList, coeff_one] at h0 h2 h3 + obtain ⟨c', rfl⟩ := Complex.conj_eq_iff_real.mp h0 + refine ⟨c', m0, ρ.re, hV.trans ?_⟩ + have hx : m1 • termOfList [barψ 0, barψ 1] = + -(starRingEnd ℂ m0 • termOfList [barψ 0, barψ 1]) := by rw [← h2] simp [termOfList, FieldSpecification.conjugate, - toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0)] - rw [hx] - simp only [Fin.isValue, neg_smul] - suffices h : ρ • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = - ρ.re • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] by - simp [h] - abel - suffices h : (ρ - starRingEnd ℂ ρ ) • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = 0 by - simp at h - rcases h with (h0 | h1) - · have hρ : ρ = (ρ.re : ℂ) := by - rw [← propext (re_eq_ofReal_of_isSelfAdjoint _)] - rw [isSelfAdjoint_iff] - rw [starRingEnd_apply] at h0 - grind - generalize ρ.re = ρ' at hρ - subst hρ + toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0)] + have hρ : ρ • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = + (ρ.re : ℂ) • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] := by + simp [FieldSpecification.conjugate, h_quartic] at h3 + rcases smul_eq_zero.mp (show (starRingEnd ℂ ρ - ρ) • + termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = 0 by simp [sub_smul, h3]) with h | h + · obtain ⟨ρ', rfl⟩ := Complex.conj_eq_iff_real.mp (sub_eq_zero.mp h) simp - · simp [h1] - simp [sub_smul, ← h3, FieldSpecification.conjugate] - simp [h_quartic] + · simp [h] + rw [hx, hρ] + simp [sub_eq_add_neg] · rintro ⟨c, m0, ρ, hV⟩ constructor · rw [isInvariant_iff_eq_exists] @@ -1950,15 +1935,14 @@ lemma isInvariant_isReal_hasMassDimLE_four_iff_eq_exists {V : EFTLagrangianExclD · rintro ⟨hi, hr, hm⟩ obtain ⟨c, m0, ρ, hV⟩ := (isInvariant_and_isReal_iff_eq_exists.mp ⟨hi, hr⟩) use c, m0 - simp only [← termOfList_singleton, ← termOfList_append] at hV + simp only [← termOfList_singleton, ← termOfList_append] at hV ⊢ rw [hV] - simp + simp only [Fin.isValue, add_eq_left, smul_eq_zero] have hmass := massDimCoeff_eq_zero_of_hasMassDimLE hm (6 : ℕ) (by norm_num) have h0 := massDimCoeff_termOfList_ofNat (n := 6) simp only [Nat.cast_ofNat, massDimensionNat_eq, Multiset.map_coe, List.map_const', Multiset.sum_coe, List.sum_replicate, smul_eq_mul, Nat.reduceMul] at h0 simp +decide [hV, h0, massDimCoeff_one] at hmass - simp only [← termOfList_singleton, ← termOfList_append] rcases hmass with rfl | hmass · simp · simp [hmass] From ba8686fecf2b67e174759c6206d3ca58f27e4947 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:09:56 +0100 Subject: [PATCH 049/254] feat: Add Wess-Zumino --- .../WessZumino/EFTLagrangianExclDeriv.lean | 662 ++++++++++++++++++ 1 file changed, 662 insertions(+) create mode 100644 Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean new file mode 100644 index 000000000..2143bf8fd --- /dev/null +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean @@ -0,0 +1,662 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan +-/ +module + +public import Physlib.Relativity.Fermions.Weyl.Metric +public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Mathematics.ConjModule +public import Physlib.Mathematics.MultisetsOfMassDim +public import Mathlib.RingTheory.GradedAlgebra.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis +public import Mathlib.Algebra.MvPolynomial.PDeriv +/-! + +# The Wess-Zumino EFT Lagrangian without derivatives + +## i. Overview + +The Wess-Zumino theory is a simple field theory consisting +of a single left-handed Weyl fermion and a single complex scalar field. +Sometimes the complex scalar field is replaced by a pair of real scalar fields. + +The theory is of physical interest, because it simple example of a theory +permitting a supersymmetry. In this file we don't consider the supersymmetric nature +of the theory. + +-/ + +@[expose] public section + +namespace WessZumino +noncomputable section + +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct +open CategoryTheory.MonoidalCategory +open Fermion + +/-! + +## Field specification + +-/ + +inductive ComplexScalars + | φ : ComplexScalars + | barφ : ComplexScalars +deriving DecidableEq + +inductive Fermions + | ψ (α : Fin 2) : Fermions + | barψ (α : Fin 2) : Fermions +deriving DecidableEq + +inductive FieldGenerators + | cScalar (_ : ComplexScalars) : FieldGenerators + | fermion (_ : Fermions) : FieldGenerators +deriving DecidableEq + +def FieldGenerators.IsFermion : FieldGenerators → Bool + | .cScalar _ => False + | .fermion _ => True + +@[simp] +lemma FieldGenerators.cScalar_isFermion (ϕ : ComplexScalars) : + (cScalar ϕ).IsFermion = False := by simp [IsFermion] + +@[simp] +lemma FieldGenerators.fermion_isFermion (ϕ : Fermions) : + (fermion ϕ).IsFermion = True := by simp [IsFermion] + +def FieldGenerators.IsBoson : FieldGenerators → Bool + | .cScalar _ => True + | .fermion _ => False + +@[simp] +lemma FieldGenerators.cScalar_isBoson (ϕ : ComplexScalars) : + (cScalar ϕ).IsBoson = True := by simp [IsBoson] + +@[simp] +lemma FieldGenerators.fermion_isBoson (ϕ : Fermions) : + (fermion ϕ).IsBoson = False := by simp [IsBoson] + + +/-! + +## A. The EFT lagrangian without derivatives + +-/ + +/-- The algebra corresponding to the EFT lagrangian excluding + derivative terms for the Wess-Zumino theory: the free supercommutative algebra + on the bosonic and fermionic generators, i.e. the tensor product of the symmetric + algebra on the bosonic duals with the exterior algebra on the fermionic duals. -/ +abbrev EFTLagrangianExclDeriv : Type := + -- bosonic part of the lagrangian + SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ)) ⊗[ℂ] + -- fermionic part of the lagrangian + ExteriorAlgebra ℂ (Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl)) + +namespace EFTLagrangianExclDeriv + +/-! + +## The elements of the EFT generated by the field generators + +Every element of the Field generators gives an element in the +type of EFT lagragians. + +-/ +/-- The elements of `EFTLagrangianExclDeriv` associated with + the `FieldGenerators`. -/ +def ofFieldGenerators : FieldGenerators → EFTLagrangianExclDeriv + | .cScalar .φ => SymmetricAlgebra.ι ℂ _ + (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inl 0)) + ⊗ₜ 1 + | .cScalar .barφ => SymmetricAlgebra.ι ℂ _ + (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inr 0)) + ⊗ₜ 1 + | .fermion (.ψ α) => 1 ⊗ₜ ExteriorAlgebra.ι ℂ + ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inl α)) + | .fermion (.barψ α) => 1 ⊗ₜ ExteriorAlgebra.ι ℂ + ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inr α)) + +scoped notation "[" v "]ₐ" => ofFieldGenerators v +scoped notation "[" v "]ₛ" => ofFieldGenerators (FieldGenerators.cScalar v) +scoped notation "[" v "]ₑ" => ofFieldGenerators (FieldGenerators.fermion v) + +lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalars) : + ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := by + match ϕ with + | .φ => exact + ⟨((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inl 0), rfl⟩ + | .barφ => exact + ⟨((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inr 0), rfl⟩ + +lemma ofFieldGenerators_fermion_exists (ψ : Fermions) : + ∃ x, [ψ]ₑ = 1 ⊗ₜ ExteriorAlgebra.ι ℂ x := by + match ψ with + | .ψ α => exact + ⟨((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inl α)), rfl⟩ + | .barψ α => exact + ⟨((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inr α)), rfl⟩ + +lemma cScalar_comm_cScalar (φ₁ φ₂ : ComplexScalars) : + [φ₁]ₛ * [φ₂]ₛ = [φ₂]ₛ * [φ₁]ₛ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists φ₁ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists φ₂ + simp [h1, h2, mul_comm] + +lemma cScalar_comm_fermion (ϕ : ComplexScalars) (ψ : Fermions) : + [ϕ]ₛ * [ψ]ₑ = [ψ]ₑ * [ϕ]ₛ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists ϕ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ + simp [h1, h2, mul_comm] + +lemma cScalar_comm (V : EFTLagrangianExclDeriv) (ϕ : ComplexScalars) : + [ϕ]ₛ * V = V * [ϕ]ₛ := by + obtain ⟨x, h⟩ := ofFieldGenerators_cScalar_exists ϕ + induction V using TensorProduct.induction_on with + | zero => simp + | tmul a b => simp [h, mul_comm] + | add x y hx hy => simp [mul_add, add_mul, hx, hy] + +lemma fermion_comm_cScalar (ψ : Fermions) (ϕ : ComplexScalars) : + [ψ]ₑ * [ϕ]ₛ = [ϕ]ₛ * [ψ]ₑ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists ϕ + simp [h1, h2] + +lemma fermion_anticomm_fermion (ψ₁ ψ₂ : Fermions) : + [ψ₁]ₑ * [ψ₂]ₑ = - [ψ₂]ₑ * [ψ₁]ₑ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ + rw [h1, h2, ← TensorProduct.tmul_neg, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul] + congr 1 + rw [neg_mul, eq_neg_iff_add_eq_zero] + exact ExteriorAlgebra.ι_add_mul_swap x₁ x₂ + +@[simp] +lemma fermion_mul_self (ψ : Fermions) : [ψ]ₑ * [ψ]ₑ = 0 := by + obtain ⟨x, h⟩ := ofFieldGenerators_fermion_exists ψ + simp [h] + +lemma ofFieldGenerators_comm (ϕ₁ ϕ₂ : FieldGenerators) : + ∃ c : ℂ, [ϕ₁]ₐ * [ϕ₂]ₐ = c • [ϕ₂]ₐ * [ϕ₁]ₐ ∧ (c = 1 ∨ c = -1) := by + match ϕ₁, ϕ₂ with + | .cScalar φ₁, .cScalar φ₂ => exact ⟨1, by simp [cScalar_comm_cScalar]⟩ + | .cScalar _, .fermion ψ => exact ⟨1, by simp [cScalar_comm_fermion]⟩ + | .fermion ψ, .cScalar _ => exact ⟨1, by simp [fermion_comm_cScalar]⟩ + |.fermion ψ₁, .fermion ψ₂ => + exact ⟨-1, by rw [fermion_anticomm_fermion]; abel, by simp⟩ + +/-! + +## The elements generated by lists of field generators + +-/ + +/-- The element of `EFTLagrangianExclDeriv` generated from a list of field generators. -/ +def termOfList (l : List FieldGenerators) : EFTLagrangianExclDeriv := + (l.map ofFieldGenerators).prod + +lemma termOfList_cons (ψ : FieldGenerators) (l : List FieldGenerators) : + termOfList (ψ :: l) = [ψ]ₐ * termOfList l := by simp [termOfList] + +lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] + +lemma termOfList_append (l1 l2 : List FieldGenerators) : + termOfList (l1 ++ l2) = termOfList l1 * termOfList l2 := by + simp [termOfList] + +lemma termOfList_perm {l1 l2 : List FieldGenerators} (h : l1.Perm l2) : + ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ (c = 1 ∨ c = -1) := by + induction h with + | nil => exact ⟨1, by simp⟩ + | cons x _ ih => + obtain ⟨c, hc1, hc2⟩ := ih + exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc1, mul_smul_comm], hc2⟩ + | swap x y l => + obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm y x + refine ⟨c, ?_⟩ + rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc] + simp [hc1, mul_assoc, smul_mul_assoc] + exact hc2 + | trans _ _ ih1 ih2 => + obtain ⟨c1, hc1, hc1'⟩ := ih1 + obtain ⟨c2, hc2, hc2'⟩ := ih2 + exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul], by grind⟩ + +lemma fermion_mul_termOfList_of_mem (ψ : Fermions) (l : List FieldGenerators) + (hψ : .fermion ψ ∈ l) : [ψ]ₑ * termOfList l = 0 := by + induction l with + | nil => simp at hψ + | cons β t ih => + rcases List.mem_cons.mp hψ with rfl | ha + · simp [termOfList_cons, ← mul_assoc] + · obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm (.fermion ψ) β + simp [termOfList_cons, ← mul_assoc, hc1] + simp [mul_assoc, ih ha] + +lemma termOfList_filter_isBoson_comm (l : List FieldGenerators) (V : EFTLagrangianExclDeriv) : + termOfList (l.filter FieldGenerators.IsBoson) * V = + V * termOfList (l.filter FieldGenerators.IsBoson) := by + induction l with + | nil => simp [termOfList] + | cons ψ t ih => + match ψ with + | .cScalar ϕ => + simp [termOfList_cons, cScalar_comm, mul_assoc] + simp [← mul_assoc, ih] + | .fermion ψ => simpa using ih + +lemma termOfList_eq_isBoson_mul_isFermion (l : List FieldGenerators) : + termOfList l = termOfList (l.filter FieldGenerators.IsBoson) * + termOfList (l.filter FieldGenerators.IsFermion) := by + induction l with + | nil => simp [termOfList] + | cons ψ t ih => + match ψ with + | .cScalar ϕ => simp [termOfList_cons, ih, mul_assoc] + | .fermion ψ => + simp [termOfList_cons, ih, ← mul_assoc, termOfList_filter_isBoson_comm] + simp [mul_assoc, termOfList_filter_isBoson_comm] + +lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} + (h : termOfList l1 = c • termOfList l2) : + termOfList l1.reverse = c • termOfList l2.reverse := by + let r : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := + TensorProduct.map LinearMap.id CliffordAlgebra.reverse + have hmul : ∀ x y : EFTLagrangianExclDeriv, r (x * y) = r y * r x := by + intro x y + induction x using TensorProduct.induction_on with + | zero => simp + | tmul a b => + induction y using TensorProduct.induction_on with + | zero => simp + | tmul a' b' => + simp [r, CliffordAlgebra.reverse.map_mul, mul_comm] + | add y₁ y₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] + | add x₁ x₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] + have hgen : ∀ ψ : FieldGenerators, r [ψ]ₐ = [ψ]ₐ := by + intro ψ + match ψ with + | .cScalar ϕ => + obtain ⟨x, hx⟩ := ofFieldGenerators_cScalar_exists ϕ + simp [r, hx] + | .fermion ψ => + obtain ⟨x, hx⟩ := ofFieldGenerators_fermion_exists ψ + simp [r, hx, CliffordAlgebra.reverse_ι] + have hf : ∀ l : List FieldGenerators, r (termOfList l) = termOfList l.reverse := by + intro l + induction l with + | nil => simp [r, termOfList_nil, Algebra.TensorProduct.one_def] + | cons ψ t ih => + rw [termOfList_cons, hmul, ih, hgen, List.reverse_cons, termOfList_append] + simp [termOfList] + rw [← hf, ← hf, h, map_smul] + +/-- The elements of type `termOfList` span `EFTLagrangianExclDeriv`. -/ +lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : + V ∈ Submodule.span ℂ (Set.range termOfList) := by + have hmul_mem : ∀ x y : EFTLagrangianExclDeriv, + x ∈ Submodule.span ℂ (Set.range termOfList) → + y ∈ Submodule.span ℂ (Set.range termOfList) → + x * y ∈ Submodule.span ℂ (Set.range termOfList) := fun x y hx hy => by + have h := Submodule.mul_mem_mul hx hy + rw [Submodule.span_mul_span] at h + refine Submodule.span_mono ?_ h + rintro _ ⟨_, ⟨l1, rfl⟩, _, ⟨l2, rfl⟩, rfl⟩ + exact ⟨l1 ++ l2, termOfList_append l1 l2⟩ + have hgen : ∀ g : FieldGenerators, [g]ₐ ∈ Submodule.span ℂ (Set.range termOfList) := + fun g => Submodule.subset_span ⟨[g], by simp [termOfList]⟩ + induction V using TensorProduct.induction_on with + | zero => exact Submodule.zero_mem _ + | add x y hx hy => exact Submodule.add_mem _ hx hy + | tmul a b => + -- The bosonic factor: `a ⊗ₜ 1` lies in the span. + have h1 : (a ⊗ₜ[ℂ] 1 : EFTLagrangianExclDeriv) ∈ + Submodule.span ℂ (Set.range termOfList) := by + induction a using SymmetricAlgebra.induction with + | algebraMap c => + have : (algebraMap ℂ _ c ⊗ₜ[ℂ] 1 : EFTLagrangianExclDeriv) = c • termOfList [] := by + simp [termOfList, Algebra.TensorProduct.one_def, Algebra.algebraMap_eq_smul_one, + TensorProduct.smul_tmul'] + rw [this] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl⟩) + | ι x => + rw [← Basis.sum_repr + (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis) x, + map_sum, TensorProduct.sum_tmul] + refine Submodule.sum_mem _ fun i _ => ?_ + rw [map_smul, ← TensorProduct.smul_tmul'] + refine Submodule.smul_mem _ _ ?_ + obtain (i | i) := i <;> fin_cases i + · exact hgen (.cScalar .φ) + · exact hgen (.cScalar .barφ) + | mul a₁ a₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ + | add a₁ a₂ h₁ h₂ => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ h₁ h₂ + -- The fermionic factor: `1 ⊗ₜ b` lies in the span. + have h2 : (1 ⊗ₜ[ℂ] b : EFTLagrangianExclDeriv) ∈ + Submodule.span ℂ (Set.range termOfList) := by + induction b using ExteriorAlgebra.induction with + | algebraMap c => + have : (1 ⊗ₜ[ℂ] algebraMap ℂ _ c : EFTLagrangianExclDeriv) = c • termOfList [] := by + simp [termOfList, Algebra.TensorProduct.one_def, Algebra.algebraMap_eq_smul_one, + TensorProduct.tmul_smul] + rw [this] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl⟩) + | ι x => + rw [← Basis.sum_repr ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis) x, + map_sum, TensorProduct.tmul_sum] + refine Submodule.sum_mem _ fun i _ => ?_ + rw [map_smul, TensorProduct.tmul_smul] + refine Submodule.smul_mem _ _ ?_ + obtain (α | α) := i + · exact hgen (.fermion (.ψ α)) + · exact hgen (.fermion (.barψ α)) + | mul b₁ b₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ + | add b₁ b₂ h₁ h₂ => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ h₁ h₂ + simpa using hmul_mem _ _ h1 h2 + +/-! + +## The coefficent associated with a multiset of field generators + + + +The below is AI slop, but it shows a useful way od defining the coefficent. + +-/ + +def CoeffSubmodule (s : Multiset FieldGenerators) : Submodule ℂ EFTLagrangianExclDeriv := + Submodule.span ℂ (termOfList '' {l | Multiset.ofList l = s}) + +instance : SetLike.GradedMonoid CoeffSubmodule where + one_mem := by simp [CoeffSubmodule, termOfList_nil] + mul_mem s1 s2 V1 V2 hV1 hV2 := by + have h := Submodule.mul_mem_mul hV1 hV2 + rw [CoeffSubmodule, CoeffSubmodule, Submodule.span_mul_span] at h + refine Submodule.span_mono ?_ h + rintro _ ⟨_, ⟨l1, hl1, rfl⟩, _, ⟨l2, hl2, rfl⟩, rfl⟩ + exact ⟨l1 ++ l2, by subst hl1; subst hl2; rfl, termOfList_append l1 l2⟩ + +open DirectSum + +namespace CoeffSubmodule + + +/-- Transport `DirectSum.of` along an equality of degrees: two homogeneous components with + equal degrees and equal underlying values are equal. -/ +lemma of_eq {s t : Multiset FieldGenerators} (h : s = t) + {x : CoeffSubmodule s} {y : CoeffSubmodule t} + (hxy : (x : EFTLagrangianExclDeriv) = y) : + DirectSum.of (fun u => CoeffSubmodule u) s x = DirectSum.of (fun u => CoeffSubmodule u) t y := by + subst h + exact congrArg _ (Subtype.ext hxy) + +/-- The class of `termOfList l` in the direct sum of the coefficient submodules, placed + in degree `↑l`. Note that the membership proof is definitional. -/ +def ofList (l : List FieldGenerators) : ⨁ s, CoeffSubmodule s := + DirectSum.of (fun s => CoeffSubmodule s) ↑l + ⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ + +lemma ofList_nil : ofList [] = 1 := by + simp [ofList, termOfList_nil] + rfl + +lemma ofList_append (l₁ l₂ : List FieldGenerators) : + ofList (l₁ ++ l₂) = ofList l₁ * ofList l₂ := by + rw [ofList, ofList, ofList, DirectSum.of_mul_of] + exact of_eq rfl (by rw [SetLike.coe_gMul]; exact termOfList_append l₁ l₂) + + +/-- The image of a generator in the direct sum of the coefficient submodules, + placed in degree `{g}`. -/ +def ofGenerator (g : FieldGenerators) : ⨁ s, CoeffSubmodule s := ofList [g] + +lemma ofGenerator_comm {g₁ g₂ : FieldGenerators} (h : [g₁]ₐ * [g₂]ₐ = [g₂]ₐ * [g₁]ₐ) : + ofGenerator g₁ * ofGenerator g₂ = ofGenerator g₂ * ofGenerator g₁ := by + rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] + exact of_eq (Multiset.cons_swap g₁ g₂ 0) (by simp [termOfList, h]) + +lemma fermion_mul_fermion_add_swap (ψ₁ ψ₂ : Fermions) : + [ψ₁]ₑ * [ψ₂]ₑ + [ψ₂]ₑ * [ψ₁]ₑ = 0 := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ + rw [h1, h2, Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + ← TensorProduct.tmul_add] + simp + +lemma ofList_eq_zero {l : List FieldGenerators} (h : termOfList l = 0) : ofList l = 0 := by + have hx : (⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ : CoeffSubmodule ↑l) = 0 := + Subtype.ext h + rw [ofList, hx, map_zero] + +/-- Two `termOfList` classes with the same field content sum to zero as soon as the + underlying terms do. -/ +lemma ofList_add_ofList {l₁ l₂ : List FieldGenerators} + (hp : (↑l₂ : Multiset FieldGenerators) = ↑l₁) + (h : termOfList l₁ + termOfList l₂ = 0) : ofList l₁ + ofList l₂ = 0 := by + have h2 : ofList l₂ = DirectSum.of (fun u => CoeffSubmodule u) ↑l₁ + ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ := of_eq hp rfl + have hsum : (⟨termOfList l₁, Submodule.subset_span ⟨l₁, rfl, rfl⟩⟩ + + ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ : CoeffSubmodule ↑l₁) = 0 := + Subtype.ext h + rw [ofList, h2, ← map_add, hsum, map_zero] + +lemma ofGenerator_fermion_sq (ψf : Fermions) : + ofGenerator (.fermion ψf) * ofGenerator (.fermion ψf) = 0 := by + rw [ofGenerator, ← ofList_append] + exact ofList_eq_zero (by simp [termOfList]) + +lemma ofGenerator_fermion_add_swap (ψ₁ ψ₂ : Fermions) : + ofGenerator (.fermion ψ₁) * ofGenerator (.fermion ψ₂) + + ofGenerator (.fermion ψ₂) * ofGenerator (.fermion ψ₁) = 0 := by + rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] + exact ofList_add_ofList + (by simpa using List.Perm.swap (FieldGenerators.fermion ψ₁) (.fermion ψ₂) []) + (by simpa [termOfList] using fermion_mul_fermion_add_swap ψ₁ ψ₂) + +/-- The decomposition map on the fermionic factor, sending each fermionic generator to + its class in degree `{ψ}`. -/ +noncomputable def decomposeExt : + ExteriorAlgebra ℂ (Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl)) →ₐ[ℂ] + ⨁ s, CoeffSubmodule s := + ExteriorAlgebra.lift ℂ + ⟨(LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.constr ℂ + (fun i => ofGenerator (.fermion (Sum.elim Fermions.ψ Fermions.barψ i))), by + intro m + -- Generic ring/module lemmas restated locally so that their statements carry the + -- direct sum's own instances; `rw` can then match where the library patterns cannot. + have hexpand : ∀ f g : Fin 2 ⊕ Fin 2 → ⨁ s, CoeffSubmodule s, + (∑ i, f i) * ∑ j, g j = ∑ i, ∑ j, f i * g j := fun f g => Fintype.sum_mul_sum f g + have hsmul : ∀ (a b : ℂ) (x y : ⨁ s, CoeffSubmodule s), + (a • x) * (b • y) = (a * b) • (x * y) := fun a b x y => smul_mul_smul_comm a x b y + have hcollect : ∀ (a : ℂ) (x y : ⨁ s, CoeffSubmodule s), + a • x + a • y = a • (x + y) := fun a x y => (smul_add a x y).symm + have hzero : ∀ a : ℂ, a • (0 : ⨁ s, CoeffSubmodule s) = 0 := fun a => smul_zero a + rw [Basis.constr_apply_fintype, hexpand, ← Finset.sum_product'] + refine Finset.sum_involution (fun p _ => (p.2, p.1)) ?_ ?_ + (fun p _ => Finset.mem_univ _) (fun p _ => rfl) + · intro p _ + rw [hsmul, hsmul, mul_comm + ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.equivFun m p.2) + ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.equivFun m p.1), + hcollect, ofGenerator_fermion_add_swap, hzero] + · intro p _ hne heq + refine hne ?_ + have h1 : p.2 = p.1 := congrArg Prod.fst heq + rw [hsmul, h1, ofGenerator_fermion_sq, hzero]⟩ + +/-- The subalgebra of the graded direct sum generated by the bosonic generator classes. + It is commutative, which lets `SymmetricAlgebra.lift` target it. -/ +noncomputable def bosonicAdjoin : Subalgebra ℂ (⨁ s, CoeffSubmodule s) := + Algebra.adjoin ℂ {ofGenerator (.cScalar .φ), ofGenerator (.cScalar .barφ)} + +instance : IsMulCommutative bosonicAdjoin := + Algebra.isMulCommutative_adjoin ℂ (by + rintro a (rfl | rfl) b (rfl | rfl) + · rfl + · exact ofGenerator_comm (cScalar_comm_cScalar .φ .barφ) + · exact ofGenerator_comm (cScalar_comm_cScalar .barφ .φ) + · rfl) + +open scoped IsMulCommutative in +/-- The decomposition map on the bosonic factor. Since `SymmetricAlgebra.lift` requires a + commutative target, we factor through `bosonicAdjoin`. -/ +noncomputable def decomposeSym : + SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ)) →ₐ[ℂ] ⨁ s, CoeffSubmodule s := + bosonicAdjoin.val.comp <| SymmetricAlgebra.lift <| + ((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis.constr ℂ + (Sum.elim + (fun _ => ⟨ofGenerator (.cScalar .φ), Algebra.subset_adjoin (Set.mem_insert _ _)⟩) + (fun _ => ⟨ofGenerator (.cScalar .barφ), + Algebra.subset_adjoin (Set.mem_insert_of_mem _ rfl)⟩)) + +lemma decomposeSym_mem_bosonicAdjoin (x : SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ))) : + decomposeSym x ∈ bosonicAdjoin := by + simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, Subalgebra.coe_val] + exact SetLike.coe_mem _ + +lemma decomposeExt_ι (v : Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl)) : + decomposeExt (ExteriorAlgebra.ι ℂ v) = + ∑ j, (LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.equivFun v j • + ofGenerator (.fermion (Sum.elim Fermions.ψ Fermions.barψ j)) := by + rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] + +lemma commute_decomposeSym_decomposeExt + (x : SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ))) + (y : ExteriorAlgebra ℂ (Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl))) : + Commute (decomposeSym x) (decomposeExt y) := by + -- Every element of `bosonicAdjoin` commutes with the image of the fermionic factor; + -- this avoids ever unfolding `decomposeSym`. + have hgen : ∀ g ∈ ({ofGenerator (.cScalar .φ), ofGenerator (.cScalar .barφ)} : + Set (⨁ s, CoeffSubmodule s)), Commute g (decomposeExt y) := by + intro g hg + induction y using ExteriorAlgebra.induction with + | algebraMap c => rw [AlgHom.commutes]; exact (Algebra.commutes c g).symm + | mul y₁ y₂ h₁ h₂ => + rw [map_mul] + exact Commute.mul_right (a := g) (b := decomposeExt y₁) h₁ h₂ + | add y₁ y₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ + | ι v => + rw [decomposeExt_ι] + refine Commute.sum_right (b := g) _ _ fun j _ => ?_ + refine Commute.smul_right (a := g) ?_ _ + rcases hg with rfl | rfl + · exact ofGenerator_comm (cScalar_comm_fermion _ _) + · exact ofGenerator_comm (cScalar_comm_fermion _ _) + have hx := decomposeSym_mem_bosonicAdjoin x + generalize decomposeSym x = a at hx ⊢ + induction hx using Algebra.adjoin_induction with + | mem a ha => exact hgen a ha + | algebraMap c => exact Algebra.commutes c _ + | add a b _ _ h₁ h₂ => exact h₁.add_left h₂ + | mul a b _ _ h₁ h₂ => exact Commute.mul_left (c := decomposeExt y) h₁ h₂ + +noncomputable def decompose' : EFTLagrangianExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := + Algebra.TensorProduct.lift decomposeSym decomposeExt commute_decomposeSym_decomposeExt + +lemma decomposeSym_ι_basis (j : Fin 1 ⊕ Fin 1) : + decomposeSym (SymmetricAlgebra.ι ℂ _ + (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis j)) = + Sum.elim (fun _ => ofGenerator (.cScalar .φ)) (fun _ => ofGenerator (.cScalar .barφ)) j := by + simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, SymmetricAlgebra.lift_ι_apply, + Basis.constr_basis] + obtain (j | j) := j <;> rfl + +lemma decomposeExt_ι_basis (j : Fin 2 ⊕ Fin 2) : + decomposeExt (ExteriorAlgebra.ι ℂ + ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis j)) = + ofGenerator (.fermion (Sum.elim Fermions.ψ Fermions.barψ j)) := by + rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_basis] + +lemma decompose'_ofFieldGenerators (g : FieldGenerators) : + decompose' [g]ₐ = ofGenerator g := by + -- Local restatements of `mul_one`/`one_mul` carrying the direct sum's own instances. + have hmul_one : ∀ x : ⨁ s, CoeffSubmodule s, x * 1 = x := fun x => mul_one x + have hone_mul : ∀ x : ⨁ s, CoeffSubmodule s, 1 * x = x := fun x => one_mul x + match g with + | .cScalar .φ => + rw [decompose', show ([ComplexScalars.φ]ₛ : EFTLagrangianExclDeriv) = + SymmetricAlgebra.ι ℂ _ (((Basis.singleton (Fin 1) ℂ).prod + (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inl 0)) ⊗ₜ 1 from rfl, + Algebra.TensorProduct.lift_tmul, map_one, hmul_one, decomposeSym_ι_basis] + rfl + | .cScalar .barφ => + rw [decompose', show ([ComplexScalars.barφ]ₛ : EFTLagrangianExclDeriv) = + SymmetricAlgebra.ι ℂ _ (((Basis.singleton (Fin 1) ℂ).prod + (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inr 0)) ⊗ₜ 1 from rfl, + Algebra.TensorProduct.lift_tmul, map_one, hmul_one, decomposeSym_ι_basis] + rfl + | .fermion (.ψ α) => + rw [decompose', show ([Fermions.ψ α]ₑ : EFTLagrangianExclDeriv) = + 1 ⊗ₜ ExteriorAlgebra.ι ℂ ((LeftHandedWeyl.basis.prod + LeftHandedWeyl.basis.conj).dualBasis (Sum.inl α)) from rfl, + Algebra.TensorProduct.lift_tmul, map_one, hone_mul, decomposeExt_ι_basis] + rfl + | .fermion (.barψ α) => + rw [decompose', show ([Fermions.barψ α]ₑ : EFTLagrangianExclDeriv) = + 1 ⊗ₜ ExteriorAlgebra.ι ℂ ((LeftHandedWeyl.basis.prod + LeftHandedWeyl.basis.conj).dualBasis (Sum.inr α)) from rfl, + Algebra.TensorProduct.lift_tmul, map_one, hone_mul, decomposeExt_ι_basis] + rfl + +lemma decompose'_termOfList (l : List FieldGenerators) : + decompose' (termOfList l) = ofList l := by + induction l with + | nil => rw [termOfList_nil, map_one, ofList_nil] + | cons g t ih => + rw [termOfList_cons, map_mul, ih, decompose'_ofFieldGenerators, ofGenerator, + ← ofList_append, List.singleton_append] + +lemma coeAlgHom_ofList (l : List FieldGenerators) : + DirectSum.coeAlgHom CoeffSubmodule (ofList l) = termOfList l := by + rw [ofList] + exact DirectSum.coeAlgHom_of _ _ _ + +instance : GradedAlgebra CoeffSubmodule := by + refine GradedAlgebra.ofAlgHom CoeffSubmodule decompose' ?_ ?_ + · refine AlgHom.ext fun x => ?_ + rw [AlgHom.comp_apply, AlgHom.id_apply] + induction mem_termOfList_span x using Submodule.span_induction with + | mem a ha => + obtain ⟨l, rfl⟩ := ha + rw [decompose'_termOfList] + exact coeAlgHom_ofList l + | zero => simp + | add a b _ _ h₁ h₂ => rw [map_add, map_add, h₁, h₂] + | smul c a _ h₁ => rw [map_smul, map_smul, h₁] + · intro s x + obtain ⟨x, hx⟩ := x + induction hx using Submodule.span_induction with + | mem a ha => + obtain ⟨l, hl, rfl⟩ := ha + subst hl + rw [decompose'_termOfList] + rfl + | zero => exact (map_zero (DirectSum.of (fun i => CoeffSubmodule i) s)).symm ▸ map_zero _ + | add a b ha hb h₁ h₂ => rw [map_add, h₁, h₂, ← map_add]; rfl + | smul c a ha h₁ => + rw [map_smul, h₁, ← DirectSum.lof_eq_of ℂ, ← map_smul]; rfl + + +def coeff (s : Multiset FieldGenerators) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv:= + GradedAlgebra.proj CoeffSubmodule s + +end CoeffSubmodule + + +end EFTLagrangianExclDeriv From c96740031c13d6a54c73b14bca63b8e9b10f236e Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 06:30:03 +0100 Subject: [PATCH 050/254] feat: Breaking PR, but add new results --- .../WessZumino/EFTLagrangianExclDeriv.lean | 348 ++++++++++++++++-- 1 file changed, 314 insertions(+), 34 deletions(-) diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean index 2143bf8fd..5423ac20e 100644 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean @@ -51,46 +51,289 @@ open Fermion -/ -inductive ComplexScalars - | φ : ComplexScalars - | barφ : ComplexScalars -deriving DecidableEq +/-! + +## The input data for Fermions + +For the Wess-Zumino theory there is a single left-handed Weyl fermion. + +-/ + +/-- The irreducible representations of the fermion field + under the Lorentz group. -/ +inductive FermionIrrep + | ψ : FermionIrrep +deriving DecidableEq, Fintype + +def FermionIrrep.components : FermionIrrep → Type + | .ψ => Fin 2 + +instance : (φ : FermionIrrep) → Fintype (FermionIrrep.components φ) + | .ψ => inferInstanceAs (Fintype (Fin 2)) + +instance : (φ : FermionIrrep) → DecidableEq (FermionIrrep.components φ) + | .ψ => inferInstanceAs (DecidableEq (Fin 2)) + +def FermionIrrep.module : FermionIrrep → Type + | .ψ => LeftHandedWeyl + +instance : (φ : FermionIrrep) → AddCommGroup (FermionIrrep.module φ) + | .ψ => inferInstanceAs (AddCommGroup LeftHandedWeyl) + +instance : (φ : FermionIrrep) → Module ℂ (FermionIrrep.module φ) + | .ψ => inferInstanceAs (Module ℂ LeftHandedWeyl) + +def FermionIrrep.basis : (φ : FermionIrrep) → + Basis (FermionIrrep.components φ) ℂ (FermionIrrep.module φ) + | .ψ => LeftHandedWeyl.basis + +def FermionIrrep.rep : (φ : FermionIrrep) → Representation ℂ SL(2,ℂ) (FermionIrrep.module φ) + | .ψ => LeftHandedWeyl.rep + +/-! + +## Derived Fermionic quantities + +This are quantities whose form is independent of the specific theory +we are constructing. + +-/ + +inductive FermionicGenerator + | of (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator + | bar (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator +deriving DecidableEq, Fintype + +def FermionicGenerator.conjugate : FermionicGenerator → FermionicGenerator + | .of φ α => .bar φ α + | .bar φ α => .of φ α + +@[simp] +lemma FermionicGenerator.conjugate_conjugate (g : FermionicGenerator) : + g.conjugate.conjugate = g := by + cases g <;> rfl + +def fermionicGeneratorEquiv : FermionicGenerator ≃ + (Σ φ : FermionIrrep, FermionIrrep.components φ) ⊕ (Σ φ : FermionIrrep, FermionIrrep.components φ) where + toFun g := match g with + | .of φ α => Sum.inl ⟨φ, α⟩ + | .bar φ α => Sum.inr ⟨φ, α⟩ + invFun g := match g with + | Sum.inl ⟨φ, α⟩ => .of φ α + | Sum.inr ⟨φ, α⟩ => .bar φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +abbrev FermionicTargetSpace := Π (φ : FermionIrrep), FermionIrrep.module φ + +def FermionicTargetSpace.rep : Representation ℂ SL(2,ℂ) FermionicTargetSpace where + toFun Λ := LinearMap.piMap fun φ => FermionIrrep.rep φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, Pi.single_eq_same, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp + +/-- The target space of the fermionic fields, including their conjugates. -/ +abbrev FermionicTargetSpaceWithComplex := FermionicTargetSpace × + ConjModule FermionicTargetSpace + +/-- The representation of the Lorentz group on the fermionic target space: + the irreps act componentwise on the product of their modules, and by the + conjugate action on the conjugate factor. -/ +def FermionicTargetSpaceWithComplex.rep : + Representation ℂ SL(2,ℂ) FermionicTargetSpaceWithComplex := + (FermionicTargetSpace.rep).prod (FermionicTargetSpace.rep.conj) + +abbrev FermionicComponentSpace := Module.Dual ℂ FermionicTargetSpaceWithComplex + +def FermionicComponentSpace.rep : Representation ℂ SL(2,ℂ) FermionicComponentSpace := + (FermionicTargetSpaceWithComplex.rep).dual + +def fermionicComponentBasis : Basis FermionicGenerator ℂ FermionicComponentSpace := + ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod + ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm + +abbrev FermionicEFTExclDeriv := ExteriorAlgebra ℂ FermionicComponentSpace + +def FermionicEFTExclDeriv.rep : Representation ℂ SL(2,ℂ) FermionicEFTExclDeriv where + toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ)).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + + +/-! + +## The input data for the complex scalar fields + +-/ + + +set_option linter.constructorNameAsVariable false + +inductive ComplexScalarIrrep + | φ : ComplexScalarIrrep +deriving DecidableEq, Fintype -inductive Fermions - | ψ (α : Fin 2) : Fermions - | barψ (α : Fin 2) : Fermions -deriving DecidableEq +def ComplexScalarIrrep.components : ComplexScalarIrrep → Type + | .φ => Fin 1 + +instance : (φ : ComplexScalarIrrep) → Fintype (ComplexScalarIrrep.components φ) + | .φ => inferInstanceAs (Fintype (Fin 1)) + +instance : (φ : ComplexScalarIrrep) → DecidableEq (ComplexScalarIrrep.components φ) + | .φ => inferInstanceAs (DecidableEq (Fin 1)) + +def ComplexScalarIrrep.module : ComplexScalarIrrep → Type + | .φ => ℂ + +instance : (φ : ComplexScalarIrrep) → AddCommGroup (ComplexScalarIrrep.module φ) + | .φ => inferInstanceAs (AddCommGroup ℂ) + +instance : (φ : ComplexScalarIrrep) → Module ℂ (ComplexScalarIrrep.module φ) + | .φ => inferInstanceAs (Module ℂ ℂ) + +def ComplexScalarIrrep.basis : (φ : ComplexScalarIrrep) → + Basis (ComplexScalarIrrep.components φ) ℂ (ComplexScalarIrrep.module φ) + | .φ => Basis.singleton (Fin 1) ℂ + +def ComplexScalarIrrep.rep : (φ : ComplexScalarIrrep) → Representation ℂ SL(2,ℂ) (ComplexScalarIrrep.module φ) + | .φ => Representation.trivial ℂ SL(2,ℂ) ℂ + +/-! + +## Derived Complex Scalar quantities + +-/ + +inductive ComplexScalarGenerator + | of (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator + | bar (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator +deriving DecidableEq, Fintype + +def ComplexScalarGenerator.conjugate : ComplexScalarGenerator → ComplexScalarGenerator + | .of φ α => .bar φ α + | .bar φ α => .of φ α + +@[simp] +lemma ComplexScalarGenerator.conjugate_conjugate (g : ComplexScalarGenerator) : + g.conjugate.conjugate = g := by + cases g <;> rfl + +def complexScalarGeneratorEquiv : ComplexScalarGenerator ≃ + (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) ⊕ + (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) where + toFun g := match g with + | .of φ α => Sum.inl ⟨φ, α⟩ + | .bar φ α => Sum.inr ⟨φ, α⟩ + invFun g := match g with + | Sum.inl ⟨φ, α⟩ => .of φ α + | Sum.inr ⟨φ, α⟩ => .bar φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +abbrev ComplexScalarTargetSpace := Π (φ : ComplexScalarIrrep), ComplexScalarIrrep.module φ + +def ComplexScalarTargetSpace.rep : Representation ℂ SL(2,ℂ) ComplexScalarTargetSpace where + toFun Λ := LinearMap.piMap fun φ => ComplexScalarIrrep.rep φ Λ + map_one' := by + ext1 x + apply LinearMap.ext + intro i + ext y + simp + map_mul' Λ1 Λ2 := by + ext1 x + apply LinearMap.ext + intro i + ext y + simp + +/-- The target space of the fermionic fields, including their conjugates. -/ +abbrev ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace × + ConjModule ComplexScalarTargetSpace + +/-- The representation of the Lorentz group on the fermionic target space: + the irreps act componentwise on the product of their modules, and by the + conjugate action on the conjugate factor. -/ +def ComplexScalarTargetSpaceWithComplex.rep : + Representation ℂ SL(2,ℂ) ComplexScalarTargetSpaceWithComplex := + (ComplexScalarTargetSpace.rep).prod (ComplexScalarTargetSpace.rep.conj) + +abbrev ComplexScalarComponentSpace := Module.Dual ℂ ComplexScalarTargetSpaceWithComplex + +def ComplexScalarComponentSpace.rep : Representation ℂ SL(2,ℂ) ComplexScalarComponentSpace := + (ComplexScalarTargetSpaceWithComplex.rep).dual + +def complexScalarComponentBasis : Basis ComplexScalarGenerator ℂ ComplexScalarComponentSpace := + ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod + ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm + +abbrev ComplexScalarEFTExclDeriv := SymmetricAlgebra ℂ ComplexScalarComponentSpace + +TODO "Define ComplexScalarEFTExclDeriv.rep" + +/-! + +## The field generators + +-/ inductive FieldGenerators - | cScalar (_ : ComplexScalars) : FieldGenerators - | fermion (_ : Fermions) : FieldGenerators -deriving DecidableEq + | cScalar (_ : ComplexScalarGenerator) : FieldGenerators + | fermion (_ : FermionicGenerator) : FieldGenerators +deriving DecidableEq, Fintype def FieldGenerators.IsFermion : FieldGenerators → Bool | .cScalar _ => False | .fermion _ => True +def FieldGenerators.IsBoson : FieldGenerators → Bool + | .cScalar _ => True + | .fermion _ => False + +def FieldGenerators.conjugate : FieldGenerators → FieldGenerators + | .cScalar g => .cScalar g.conjugate + | .fermion g => .fermion g.conjugate + +@[simp] +lemma FieldGenerators.conjugate_conjugate (ϕ : FieldGenerators) : + ϕ.conjugate.conjugate = ϕ := by + cases ϕ <;> simp [conjugate] + +def fieldGeneratorsEquiv : FieldGenerators ≃ + ComplexScalarGenerator ⊕ FermionicGenerator where + toFun g := match g with + | .cScalar g => Sum.inl g + | .fermion g => Sum.inr g + invFun g := match g with + | Sum.inl g => .cScalar g + | Sum.inr g => .fermion g + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + @[simp] -lemma FieldGenerators.cScalar_isFermion (ϕ : ComplexScalars) : +lemma FieldGenerators.cScalar_isFermion (ϕ : ComplexScalarGenerator) : (cScalar ϕ).IsFermion = False := by simp [IsFermion] @[simp] -lemma FieldGenerators.fermion_isFermion (ϕ : Fermions) : +lemma FieldGenerators.fermion_isFermion (ϕ : FermionicGenerator) : (fermion ϕ).IsFermion = True := by simp [IsFermion] -def FieldGenerators.IsBoson : FieldGenerators → Bool - | .cScalar _ => True - | .fermion _ => False - @[simp] -lemma FieldGenerators.cScalar_isBoson (ϕ : ComplexScalars) : +lemma FieldGenerators.cScalar_isBoson (ϕ : ComplexScalarGenerator) : (cScalar ϕ).IsBoson = True := by simp [IsBoson] @[simp] -lemma FieldGenerators.fermion_isBoson (ϕ : Fermions) : +lemma FieldGenerators.fermion_isBoson (ϕ : FermionicGenerator) : (fermion ϕ).IsBoson = False := by simp [IsBoson] - /-! ## A. The EFT lagrangian without derivatives @@ -103,9 +346,9 @@ lemma FieldGenerators.fermion_isBoson (ϕ : Fermions) : algebra on the bosonic duals with the exterior algebra on the fermionic duals. -/ abbrev EFTLagrangianExclDeriv : Type := -- bosonic part of the lagrangian - SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ)) ⊗[ℂ] + ComplexScalarEFTExclDeriv ⊗[ℂ] -- fermionic part of the lagrangian - ExteriorAlgebra ℂ (Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl)) + FermionicEFTExclDeriv namespace EFTLagrangianExclDeriv @@ -120,25 +363,62 @@ type of EFT lagragians. /-- The elements of `EFTLagrangianExclDeriv` associated with the `FieldGenerators`. -/ def ofFieldGenerators : FieldGenerators → EFTLagrangianExclDeriv - | .cScalar .φ => SymmetricAlgebra.ι ℂ _ - (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inl 0)) - ⊗ₜ 1 - | .cScalar .barφ => SymmetricAlgebra.ι ℂ _ - (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inr 0)) - ⊗ₜ 1 - | .fermion (.ψ α) => 1 ⊗ₜ ExteriorAlgebra.ι ℂ - ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inl α)) - | .fermion (.barψ α) => 1 ⊗ₜ ExteriorAlgebra.ι ℂ - ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inr α)) + | .cScalar φ => SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis φ) ⊗ₜ 1 + | .fermion ψ => 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis ψ) scoped notation "[" v "]ₐ" => ofFieldGenerators v scoped notation "[" v "]ₛ" => ofFieldGenerators (FieldGenerators.cScalar v) scoped notation "[" v "]ₑ" => ofFieldGenerators (FieldGenerators.fermion v) -lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalars) : +/-- The square-zero condition needed to lift to the exterior algebra holds for every + vector as soon as the images of the fermionic generators pairwise anticommute: + expanding in the basis, the diagonal terms vanish (over `ℂ`, `x = -x` forces `x = 0`) + and the off-diagonal terms cancel in swapped pairs. -/ +lemma fermionic_constr_mul_self_eq_zero {A : Type} [Ring A] [Algebra ℂ A] + (FF : FermionicGenerator → A) + (hFF : ∀ g g', FF g * FF g' = -(FF g' * FF g)) (v : FermionicComponentSpace) : + fermionicComponentBasis.constr ℂ FF v * fermionicComponentBasis.constr ℂ FF v = 0 := by + have hdiag : ∀ g, FF g * FF g = 0 := fun g => by + have h2 : (2 : ℂ) • (FF g * FF g) = 0 := by + rw [two_smul] + exact eq_neg_iff_add_eq_zero.mp (hFF g g) + calc FF g * FF g = ((2 : ℂ)⁻¹ * 2) • (FF g * FF g) := by norm_num + _ = (2 : ℂ)⁻¹ • ((2 : ℂ) • (FF g * FF g)) := by rw [mul_smul] + _ = 0 := by rw [h2, smul_zero] + rw [← fermionicComponentBasis.sum_repr v, map_sum] + simp only [map_smul, Basis.constr_basis] + rw [Finset.sum_mul_sum, ← Finset.sum_product'] + refine Finset.sum_involution (fun p _ => (p.2, p.1)) ?_ ?_ (fun p _ => Finset.mem_univ _) + (fun p _ => rfl) + · intro p _ + rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2] + module + · intro p _ hf hswap + apply hf + have h1 : p.2 = p.1 := (Prod.ext_iff.mp hswap).1 + rw [h1, smul_mul_smul_comm, hdiag, smul_zero] + +/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images of the + field generators: the bosonic generators are sent to central elements `FB g` and the + fermionic generators to pairwise-anticommuting elements `FF g`. -/ +def lift {A : Type} [Ring A] [Algebra ℂ A] + (FB : ComplexScalarGenerator → Subalgebra.center ℂ A) + (FF : FermionicGenerator → A) + (hFF : ∀ g g', FF g * FF g' = -(FF g' * FF g)) : + EFTLagrangianExclDeriv →ₐ[ℂ] A := + Algebra.TensorProduct.lift + ((Subalgebra.center ℂ A).val.comp + (SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ FB))) + (ExteriorAlgebra.lift ℂ + ⟨fermionicComponentBasis.constr ℂ FF, fermionic_constr_mul_self_eq_zero FF hFF⟩) + (fun x y => Subalgebra.mem_center_iff.mp + (SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ FB) x).2 _ |>.symm) + + +lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalarGenerator) : ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := by match ϕ with - | .φ => exact + | .of φ => exact ⟨((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inl 0), rfl⟩ | .barφ => exact ⟨((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inr 0), rfl⟩ From 36604e5f3cba5f79cbabc6aba2e8fc105ed00b93 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 06:55:00 +0100 Subject: [PATCH 051/254] refactor: fix build --- .../WessZumino/EFTLagrangianExclDeriv.lean | 243 +++++++----------- 1 file changed, 95 insertions(+), 148 deletions(-) diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean index 5423ac20e..b1e34acaa 100644 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean @@ -370,80 +370,69 @@ scoped notation "[" v "]ₐ" => ofFieldGenerators v scoped notation "[" v "]ₛ" => ofFieldGenerators (FieldGenerators.cScalar v) scoped notation "[" v "]ₑ" => ofFieldGenerators (FieldGenerators.fermion v) -/-- The square-zero condition needed to lift to the exterior algebra holds for every - vector as soon as the images of the fermionic generators pairwise anticommute: - expanding in the basis, the diagonal terms vanish (over `ℂ`, `x = -x` forces `x = 0`) - and the off-diagonal terms cancel in swapped pairs. -/ -lemma fermionic_constr_mul_self_eq_zero {A : Type} [Ring A] [Algebra ℂ A] - (FF : FermionicGenerator → A) - (hFF : ∀ g g', FF g * FF g' = -(FF g' * FF g)) (v : FermionicComponentSpace) : - fermionicComponentBasis.constr ℂ FF v * fermionicComponentBasis.constr ℂ FF v = 0 := by - have hdiag : ∀ g, FF g * FF g = 0 := fun g => by - have h2 : (2 : ℂ) • (FF g * FF g) = 0 := by - rw [two_smul] - exact eq_neg_iff_add_eq_zero.mp (hFF g g) - calc FF g * FF g = ((2 : ℂ)⁻¹ * 2) • (FF g * FF g) := by norm_num - _ = (2 : ℂ)⁻¹ • ((2 : ℂ) • (FF g * FF g)) := by rw [mul_smul] - _ = 0 := by rw [h2, smul_zero] - rw [← fermionicComponentBasis.sum_repr v, map_sum] - simp only [map_smul, Basis.constr_basis] - rw [Finset.sum_mul_sum, ← Finset.sum_product'] - refine Finset.sum_involution (fun p _ => (p.2, p.1)) ?_ ?_ (fun p _ => Finset.mem_univ _) - (fun p _ => rfl) - · intro p _ - rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2] - module - · intro p _ hf hswap - apply hf - have h1 : p.2 = p.1 := (Prod.ext_iff.mp hswap).1 - rw [h1, smul_mul_smul_comm, hdiag, smul_zero] - -/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images of the - field generators: the bosonic generators are sent to central elements `FB g` and the - fermionic generators to pairwise-anticommuting elements `FF g`. -/ -def lift {A : Type} [Ring A] [Algebra ℂ A] - (FB : ComplexScalarGenerator → Subalgebra.center ℂ A) - (FF : FermionicGenerator → A) - (hFF : ∀ g g', FF g * FF g' = -(FF g' * FF g)) : +open scoped IsMulCommutative in +/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images `F g` of + the field generators: the images of the bosonic generators pairwise commute and + commute with the images of the fermionic generators, which pairwise anticommute. + The bosonic factor lifts through the commutative subalgebra generated by the + bosonic images. -/ +def lift {A : Type} [Ring A] [Algebra ℂ A] (F : FieldGenerators → A) + (hFB : ∀ g g', Commute (F (.cScalar g)) (F (.cScalar g'))) + (hBF : ∀ g g', Commute (F (.cScalar g)) (F (.fermion g'))) + (hFF : ∀ g g', F (.fermion g) * F (.fermion g') = - (F (.fermion g') * F (.fermion g))) : EFTLagrangianExclDeriv →ₐ[ℂ] A := + let FB : ComplexScalarGenerator → A := fun g => F (.cScalar g) + let FF : FermionicGenerator → A := fun g => F (.fermion g) + have hFF : ∀ g g', FF g * FF g' = - (FF g' * FF g) := hFF + haveI : IsMulCommutative (Algebra.adjoin ℂ (Set.range FB)) := + Algebra.isMulCommutative_adjoin ℂ (by rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩; exact hFB g g') + let fS := SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ fun g => + (⟨FB g, Algebra.subset_adjoin (Set.mem_range_self g)⟩ : Algebra.adjoin ℂ (Set.range FB))) Algebra.TensorProduct.lift - ((Subalgebra.center ℂ A).val.comp - (SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ FB))) + ((Algebra.adjoin ℂ (Set.range FB)).val.comp fS) (ExteriorAlgebra.lift ℂ - ⟨fermionicComponentBasis.constr ℂ FF, fermionic_constr_mul_self_eq_zero FF hFF⟩) - (fun x y => Subalgebra.mem_center_iff.mp - (SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ FB) x).2 _ |>.symm) + ⟨fermionicComponentBasis.constr ℂ FF, fun v => by + have hdiag : ∀ g, FF g * FF g = 0 := fun g => by + simpa [← two_smul ℂ] using eq_neg_iff_add_eq_zero.mp (hFF g g) + rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Finset.sum_product'] + exact Finset.sum_involution (fun p _ => (p.2, p.1)) + (fun p _ => by rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2]; module) + (fun p _ hf hswap => hf (by rw [show p.2 = p.1 from (Prod.ext_iff.mp hswap).1, + smul_mul_smul_comm, hdiag, smul_zero])) + (fun p _ => Finset.mem_univ _) (fun p _ => rfl)⟩) + (fun x y => by + refine (Algebra.commute_of_mem_adjoin_of_forall_mem_commute (fS x).2 ?_).symm + rintro _ ⟨g, rfl⟩ + induction y using ExteriorAlgebra.induction with + | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commutes r _ + | ι v => + rw [ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] + exact Commute.sum_left _ _ _ fun g' _ => (hBF g g').symm.smul_left _ + | mul u w hu hw => rw [map_mul]; exact hu.mul_left hw + | add u w hu hw => rw [map_add]; exact hu.add_left hw) lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalarGenerator) : - ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := by - match ϕ with - | .of φ => exact - ⟨((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inl 0), rfl⟩ - | .barφ => exact - ⟨((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inr 0), rfl⟩ - -lemma ofFieldGenerators_fermion_exists (ψ : Fermions) : - ∃ x, [ψ]ₑ = 1 ⊗ₜ ExteriorAlgebra.ι ℂ x := by - match ψ with - | .ψ α => exact - ⟨((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inl α)), rfl⟩ - | .barψ α => exact - ⟨((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis (Sum.inr α)), rfl⟩ - -lemma cScalar_comm_cScalar (φ₁ φ₂ : ComplexScalars) : + ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := + ⟨complexScalarComponentBasis ϕ, rfl⟩ + +lemma ofFieldGenerators_fermion_exists (ψ : FermionicGenerator) : + ∃ x, [ψ]ₑ = 1 ⊗ₜ ExteriorAlgebra.ι ℂ x := + ⟨fermionicComponentBasis ψ, rfl⟩ + +lemma cScalar_comm_cScalar (φ₁ φ₂ : ComplexScalarGenerator) : [φ₁]ₛ * [φ₂]ₛ = [φ₂]ₛ * [φ₁]ₛ := by obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists φ₁ obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists φ₂ simp [h1, h2, mul_comm] -lemma cScalar_comm_fermion (ϕ : ComplexScalars) (ψ : Fermions) : +lemma cScalar_comm_fermion (ϕ : ComplexScalarGenerator) (ψ : FermionicGenerator) : [ϕ]ₛ * [ψ]ₑ = [ψ]ₑ * [ϕ]ₛ := by obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists ϕ obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ simp [h1, h2, mul_comm] -lemma cScalar_comm (V : EFTLagrangianExclDeriv) (ϕ : ComplexScalars) : +lemma cScalar_comm (V : EFTLagrangianExclDeriv) (ϕ : ComplexScalarGenerator) : [ϕ]ₛ * V = V * [ϕ]ₛ := by obtain ⟨x, h⟩ := ofFieldGenerators_cScalar_exists ϕ induction V using TensorProduct.induction_on with @@ -451,13 +440,13 @@ lemma cScalar_comm (V : EFTLagrangianExclDeriv) (ϕ : ComplexScalars) : | tmul a b => simp [h, mul_comm] | add x y hx hy => simp [mul_add, add_mul, hx, hy] -lemma fermion_comm_cScalar (ψ : Fermions) (ϕ : ComplexScalars) : +lemma fermion_comm_cScalar (ψ : FermionicGenerator) (ϕ : ComplexScalarGenerator) : [ψ]ₑ * [ϕ]ₛ = [ϕ]ₛ * [ψ]ₑ := by obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists ϕ simp [h1, h2] -lemma fermion_anticomm_fermion (ψ₁ ψ₂ : Fermions) : +lemma fermion_anticomm_fermion (ψ₁ ψ₂ : FermionicGenerator) : [ψ₁]ₑ * [ψ₂]ₑ = - [ψ₂]ₑ * [ψ₁]ₑ := by obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ @@ -468,7 +457,7 @@ lemma fermion_anticomm_fermion (ψ₁ ψ₂ : Fermions) : exact ExteriorAlgebra.ι_add_mul_swap x₁ x₂ @[simp] -lemma fermion_mul_self (ψ : Fermions) : [ψ]ₑ * [ψ]ₑ = 0 := by +lemma fermion_mul_self (ψ : FermionicGenerator) : [ψ]ₑ * [ψ]ₑ = 0 := by obtain ⟨x, h⟩ := ofFieldGenerators_fermion_exists ψ simp [h] @@ -518,7 +507,7 @@ lemma termOfList_perm {l1 l2 : List FieldGenerators} (h : l1.Perm l2) : obtain ⟨c2, hc2, hc2'⟩ := ih2 exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul], by grind⟩ -lemma fermion_mul_termOfList_of_mem (ψ : Fermions) (l : List FieldGenerators) +lemma fermion_mul_termOfList_of_mem (ψ : FermionicGenerator) (l : List FieldGenerators) (hψ : .fermion ψ ∈ l) : [ψ]ₑ * termOfList l = 0 := by induction l with | nil => simp at hψ @@ -616,15 +605,10 @@ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : rw [this] exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl⟩) | ι x => - rw [← Basis.sum_repr - (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis) x, - map_sum, TensorProduct.sum_tmul] + rw [← Basis.sum_repr complexScalarComponentBasis x, map_sum, TensorProduct.sum_tmul] refine Submodule.sum_mem _ fun i _ => ?_ rw [map_smul, ← TensorProduct.smul_tmul'] - refine Submodule.smul_mem _ _ ?_ - obtain (i | i) := i <;> fin_cases i - · exact hgen (.cScalar .φ) - · exact hgen (.cScalar .barφ) + exact Submodule.smul_mem _ _ (hgen (.cScalar i)) | mul a₁ a₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ | add a₁ a₂ h₁ h₂ => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ h₁ h₂ -- The fermionic factor: `1 ⊗ₜ b` lies in the span. @@ -638,14 +622,10 @@ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : rw [this] exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl⟩) | ι x => - rw [← Basis.sum_repr ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis) x, - map_sum, TensorProduct.tmul_sum] + rw [← Basis.sum_repr fermionicComponentBasis x, map_sum, TensorProduct.tmul_sum] refine Submodule.sum_mem _ fun i _ => ?_ rw [map_smul, TensorProduct.tmul_smul] - refine Submodule.smul_mem _ _ ?_ - obtain (α | α) := i - · exact hgen (.fermion (.ψ α)) - · exact hgen (.fermion (.barψ α)) + exact Submodule.smul_mem _ _ (hgen (.fermion i)) | mul b₁ b₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ | add b₁ b₂ h₁ h₂ => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ h₁ h₂ simpa using hmul_mem _ _ h1 h2 @@ -711,7 +691,7 @@ lemma ofGenerator_comm {g₁ g₂ : FieldGenerators} (h : [g₁]ₐ * [g₂]ₐ rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] exact of_eq (Multiset.cons_swap g₁ g₂ 0) (by simp [termOfList, h]) -lemma fermion_mul_fermion_add_swap (ψ₁ ψ₂ : Fermions) : +lemma fermion_mul_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : [ψ₁]ₑ * [ψ₂]ₑ + [ψ₂]ₑ * [ψ₁]ₑ = 0 := by obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ @@ -736,12 +716,12 @@ lemma ofList_add_ofList {l₁ l₂ : List FieldGenerators} Subtype.ext h rw [ofList, h2, ← map_add, hsum, map_zero] -lemma ofGenerator_fermion_sq (ψf : Fermions) : +lemma ofGenerator_fermion_sq (ψf : FermionicGenerator) : ofGenerator (.fermion ψf) * ofGenerator (.fermion ψf) = 0 := by rw [ofGenerator, ← ofList_append] exact ofList_eq_zero (by simp [termOfList]) -lemma ofGenerator_fermion_add_swap (ψ₁ ψ₂ : Fermions) : +lemma ofGenerator_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : ofGenerator (.fermion ψ₁) * ofGenerator (.fermion ψ₂) + ofGenerator (.fermion ψ₂) * ofGenerator (.fermion ψ₁) = 0 := by rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] @@ -751,16 +731,13 @@ lemma ofGenerator_fermion_add_swap (ψ₁ ψ₂ : Fermions) : /-- The decomposition map on the fermionic factor, sending each fermionic generator to its class in degree `{ψ}`. -/ -noncomputable def decomposeExt : - ExteriorAlgebra ℂ (Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl)) →ₐ[ℂ] - ⨁ s, CoeffSubmodule s := +noncomputable def decomposeExt : FermionicEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := ExteriorAlgebra.lift ℂ - ⟨(LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.constr ℂ - (fun i => ofGenerator (.fermion (Sum.elim Fermions.ψ Fermions.barψ i))), by + ⟨fermionicComponentBasis.constr ℂ (fun i => ofGenerator (.fermion i)), by intro m -- Generic ring/module lemmas restated locally so that their statements carry the -- direct sum's own instances; `rw` can then match where the library patterns cannot. - have hexpand : ∀ f g : Fin 2 ⊕ Fin 2 → ⨁ s, CoeffSubmodule s, + have hexpand : ∀ f g : FermionicGenerator → ⨁ s, CoeffSubmodule s, (∑ i, f i) * ∑ j, g j = ∑ i, ∑ j, f i * g j := fun f g => Fintype.sum_mul_sum f g have hsmul : ∀ (a b : ℂ) (x y : ⨁ s, CoeffSubmodule s), (a • x) * (b • y) = (a * b) • (x * y) := fun a b x y => smul_mul_smul_comm a x b y @@ -771,9 +748,8 @@ noncomputable def decomposeExt : refine Finset.sum_involution (fun p _ => (p.2, p.1)) ?_ ?_ (fun p _ => Finset.mem_univ _) (fun p _ => rfl) · intro p _ - rw [hsmul, hsmul, mul_comm - ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.equivFun m p.2) - ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.equivFun m p.1), + rw [hsmul, hsmul, mul_comm (fermionicComponentBasis.equivFun m p.2) + (fermionicComponentBasis.equivFun m p.1), hcollect, ofGenerator_fermion_add_swap, hzero] · intro p _ hne heq refine hne ?_ @@ -783,65 +759,54 @@ noncomputable def decomposeExt : /-- The subalgebra of the graded direct sum generated by the bosonic generator classes. It is commutative, which lets `SymmetricAlgebra.lift` target it. -/ noncomputable def bosonicAdjoin : Subalgebra ℂ (⨁ s, CoeffSubmodule s) := - Algebra.adjoin ℂ {ofGenerator (.cScalar .φ), ofGenerator (.cScalar .barφ)} + Algebra.adjoin ℂ (Set.range fun g : ComplexScalarGenerator => ofGenerator (.cScalar g)) instance : IsMulCommutative bosonicAdjoin := Algebra.isMulCommutative_adjoin ℂ (by - rintro a (rfl | rfl) b (rfl | rfl) - · rfl - · exact ofGenerator_comm (cScalar_comm_cScalar .φ .barφ) - · exact ofGenerator_comm (cScalar_comm_cScalar .barφ .φ) - · rfl) + rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩ + exact ofGenerator_comm (cScalar_comm_cScalar g g')) open scoped IsMulCommutative in /-- The decomposition map on the bosonic factor. Since `SymmetricAlgebra.lift` requires a commutative target, we factor through `bosonicAdjoin`. -/ -noncomputable def decomposeSym : - SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ)) →ₐ[ℂ] ⨁ s, CoeffSubmodule s := +noncomputable def decomposeSym : ComplexScalarEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := bosonicAdjoin.val.comp <| SymmetricAlgebra.lift <| - ((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis.constr ℂ - (Sum.elim - (fun _ => ⟨ofGenerator (.cScalar .φ), Algebra.subset_adjoin (Set.mem_insert _ _)⟩) - (fun _ => ⟨ofGenerator (.cScalar .barφ), - Algebra.subset_adjoin (Set.mem_insert_of_mem _ rfl)⟩)) + complexScalarComponentBasis.constr ℂ fun g => + (⟨ofGenerator (.cScalar g), Algebra.subset_adjoin (Set.mem_range_self g)⟩ : bosonicAdjoin) -lemma decomposeSym_mem_bosonicAdjoin (x : SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ))) : +lemma decomposeSym_mem_bosonicAdjoin (x : ComplexScalarEFTExclDeriv) : decomposeSym x ∈ bosonicAdjoin := by simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, Subalgebra.coe_val] exact SetLike.coe_mem _ -lemma decomposeExt_ι (v : Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl)) : +lemma decomposeExt_ι (v : FermionicComponentSpace) : decomposeExt (ExteriorAlgebra.ι ℂ v) = - ∑ j, (LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis.equivFun v j • - ofGenerator (.fermion (Sum.elim Fermions.ψ Fermions.barψ j)) := by + ∑ j, fermionicComponentBasis.equivFun v j • ofGenerator (.fermion j) := by rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] lemma commute_decomposeSym_decomposeExt - (x : SymmetricAlgebra ℂ (Module.Dual ℂ (ℂ × ConjModule ℂ))) - (y : ExteriorAlgebra ℂ (Module.Dual ℂ (LeftHandedWeyl × ConjModule LeftHandedWeyl))) : + (x : ComplexScalarEFTExclDeriv) (y : FermionicEFTExclDeriv) : Commute (decomposeSym x) (decomposeExt y) := by -- Every element of `bosonicAdjoin` commutes with the image of the fermionic factor; -- this avoids ever unfolding `decomposeSym`. - have hgen : ∀ g ∈ ({ofGenerator (.cScalar .φ), ofGenerator (.cScalar .barφ)} : - Set (⨁ s, CoeffSubmodule s)), Commute g (decomposeExt y) := by - intro g hg + have hgen : ∀ g : ComplexScalarGenerator, + Commute (ofGenerator (.cScalar g)) (decomposeExt y) := by + intro g induction y using ExteriorAlgebra.induction with - | algebraMap c => rw [AlgHom.commutes]; exact (Algebra.commutes c g).symm + | algebraMap c => rw [AlgHom.commutes]; exact (Algebra.commutes c _).symm | mul y₁ y₂ h₁ h₂ => rw [map_mul] - exact Commute.mul_right (a := g) (b := decomposeExt y₁) h₁ h₂ + exact Commute.mul_right (a := ofGenerator (.cScalar g)) (b := decomposeExt y₁) h₁ h₂ | add y₁ y₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ | ι v => rw [decomposeExt_ι] - refine Commute.sum_right (b := g) _ _ fun j _ => ?_ - refine Commute.smul_right (a := g) ?_ _ - rcases hg with rfl | rfl - · exact ofGenerator_comm (cScalar_comm_fermion _ _) - · exact ofGenerator_comm (cScalar_comm_fermion _ _) + refine Commute.sum_right (b := ofGenerator (.cScalar g)) _ _ fun j _ => ?_ + refine Commute.smul_right (a := ofGenerator (.cScalar g)) ?_ _ + exact ofGenerator_comm (cScalar_comm_fermion g j) have hx := decomposeSym_mem_bosonicAdjoin x generalize decomposeSym x = a at hx ⊢ induction hx using Algebra.adjoin_induction with - | mem a ha => exact hgen a ha + | mem a ha => obtain ⟨g, rfl⟩ := ha; exact hgen g | algebraMap c => exact Algebra.commutes c _ | add a b _ _ h₁ h₂ => exact h₁.add_left h₂ | mul a b _ _ h₁ h₂ => exact Commute.mul_left (c := decomposeExt y) h₁ h₂ @@ -849,18 +814,16 @@ lemma commute_decomposeSym_decomposeExt noncomputable def decompose' : EFTLagrangianExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := Algebra.TensorProduct.lift decomposeSym decomposeExt commute_decomposeSym_decomposeExt -lemma decomposeSym_ι_basis (j : Fin 1 ⊕ Fin 1) : - decomposeSym (SymmetricAlgebra.ι ℂ _ - (((Basis.singleton (Fin 1) ℂ).prod (Basis.singleton (Fin 1) ℂ).conj).dualBasis j)) = - Sum.elim (fun _ => ofGenerator (.cScalar .φ)) (fun _ => ofGenerator (.cScalar .barφ)) j := by +lemma decomposeSym_ι_basis (g : ComplexScalarGenerator) : + decomposeSym (SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g)) = + ofGenerator (.cScalar g) := by simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, SymmetricAlgebra.lift_ι_apply, Basis.constr_basis] - obtain (j | j) := j <;> rfl + rfl -lemma decomposeExt_ι_basis (j : Fin 2 ⊕ Fin 2) : - decomposeExt (ExteriorAlgebra.ι ℂ - ((LeftHandedWeyl.basis.prod LeftHandedWeyl.basis.conj).dualBasis j)) = - ofGenerator (.fermion (Sum.elim Fermions.ψ Fermions.barψ j)) := by +lemma decomposeExt_ι_basis (g : FermionicGenerator) : + decomposeExt (ExteriorAlgebra.ι ℂ (fermionicComponentBasis g)) = + ofGenerator (.fermion g) := by rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_basis] lemma decompose'_ofFieldGenerators (g : FieldGenerators) : @@ -869,30 +832,14 @@ lemma decompose'_ofFieldGenerators (g : FieldGenerators) : have hmul_one : ∀ x : ⨁ s, CoeffSubmodule s, x * 1 = x := fun x => mul_one x have hone_mul : ∀ x : ⨁ s, CoeffSubmodule s, 1 * x = x := fun x => one_mul x match g with - | .cScalar .φ => - rw [decompose', show ([ComplexScalars.φ]ₛ : EFTLagrangianExclDeriv) = - SymmetricAlgebra.ι ℂ _ (((Basis.singleton (Fin 1) ℂ).prod - (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inl 0)) ⊗ₜ 1 from rfl, - Algebra.TensorProduct.lift_tmul, map_one, hmul_one, decomposeSym_ι_basis] - rfl - | .cScalar .barφ => - rw [decompose', show ([ComplexScalars.barφ]ₛ : EFTLagrangianExclDeriv) = - SymmetricAlgebra.ι ℂ _ (((Basis.singleton (Fin 1) ℂ).prod - (Basis.singleton (Fin 1) ℂ).conj).dualBasis (Sum.inr 0)) ⊗ₜ 1 from rfl, + | .cScalar g => + rw [decompose', show ([g]ₛ : EFTLagrangianExclDeriv) = + SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g) ⊗ₜ 1 from rfl, Algebra.TensorProduct.lift_tmul, map_one, hmul_one, decomposeSym_ι_basis] - rfl - | .fermion (.ψ α) => - rw [decompose', show ([Fermions.ψ α]ₑ : EFTLagrangianExclDeriv) = - 1 ⊗ₜ ExteriorAlgebra.ι ℂ ((LeftHandedWeyl.basis.prod - LeftHandedWeyl.basis.conj).dualBasis (Sum.inl α)) from rfl, - Algebra.TensorProduct.lift_tmul, map_one, hone_mul, decomposeExt_ι_basis] - rfl - | .fermion (.barψ α) => - rw [decompose', show ([Fermions.barψ α]ₑ : EFTLagrangianExclDeriv) = - 1 ⊗ₜ ExteriorAlgebra.ι ℂ ((LeftHandedWeyl.basis.prod - LeftHandedWeyl.basis.conj).dualBasis (Sum.inr α)) from rfl, + | .fermion g => + rw [decompose', show ([g]ₑ : EFTLagrangianExclDeriv) = + 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis g) from rfl, Algebra.TensorProduct.lift_tmul, map_one, hone_mul, decomposeExt_ι_basis] - rfl lemma decompose'_termOfList (l : List FieldGenerators) : decompose' (termOfList l) = ofList l := by From 46343be0c258446deb163835794bcbe2b089a48a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 08:52:13 +0100 Subject: [PATCH 052/254] feat: seperate Coeff --- .../Basic.lean} | 406 ++++-------------- .../EFTLagrangianExclDeriv/Coeff.lean | 292 +++++++++++++ 2 files changed, 382 insertions(+), 316 deletions(-) rename Physlib/Particles/WessZumino/{EFTLagrangianExclDeriv.lean => EFTLagrangianExclDeriv/Basic.lean} (64%) create mode 100644 Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean similarity index 64% rename from Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean rename to Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean index b1e34acaa..bc15f2447 100644 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv.lean +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean @@ -279,6 +279,22 @@ abbrev ComplexScalarEFTExclDeriv := SymmetricAlgebra ℂ ComplexScalarComponentS TODO "Define ComplexScalarEFTExclDeriv.rep" +def ComplexScalarEFTExclDeriv.rep : Representation ℂ SL(2,ℂ) ComplexScalarEFTExclDeriv where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ2)) by + rw [h]; rfl + ext v + simp + /-! ## The field generators @@ -354,6 +370,20 @@ namespace EFTLagrangianExclDeriv /-! +## The representation of the Lorentz group on the EFT lagrangian + +-/ + +/-- The representation of the Lorentz group on `EFTLagrangianExclDeriv`. -/ +def rep : Representation ℂ SL(2,ℂ) EFTLagrangianExclDeriv := + (ComplexScalarEFTExclDeriv.rep).tprod (FermionicEFTExclDeriv.rep) + +lemma rep_mul (Λ : SL(2,ℂ)) (V W : EFTLagrangianExclDeriv) : + rep Λ (V * W) = rep Λ V * rep Λ W := by + sorry + +/-! + ## The elements of the EFT generated by the field generators Every element of the Field generators gives an element in the @@ -370,48 +400,6 @@ scoped notation "[" v "]ₐ" => ofFieldGenerators v scoped notation "[" v "]ₛ" => ofFieldGenerators (FieldGenerators.cScalar v) scoped notation "[" v "]ₑ" => ofFieldGenerators (FieldGenerators.fermion v) -open scoped IsMulCommutative in -/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images `F g` of - the field generators: the images of the bosonic generators pairwise commute and - commute with the images of the fermionic generators, which pairwise anticommute. - The bosonic factor lifts through the commutative subalgebra generated by the - bosonic images. -/ -def lift {A : Type} [Ring A] [Algebra ℂ A] (F : FieldGenerators → A) - (hFB : ∀ g g', Commute (F (.cScalar g)) (F (.cScalar g'))) - (hBF : ∀ g g', Commute (F (.cScalar g)) (F (.fermion g'))) - (hFF : ∀ g g', F (.fermion g) * F (.fermion g') = - (F (.fermion g') * F (.fermion g))) : - EFTLagrangianExclDeriv →ₐ[ℂ] A := - let FB : ComplexScalarGenerator → A := fun g => F (.cScalar g) - let FF : FermionicGenerator → A := fun g => F (.fermion g) - have hFF : ∀ g g', FF g * FF g' = - (FF g' * FF g) := hFF - haveI : IsMulCommutative (Algebra.adjoin ℂ (Set.range FB)) := - Algebra.isMulCommutative_adjoin ℂ (by rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩; exact hFB g g') - let fS := SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ fun g => - (⟨FB g, Algebra.subset_adjoin (Set.mem_range_self g)⟩ : Algebra.adjoin ℂ (Set.range FB))) - Algebra.TensorProduct.lift - ((Algebra.adjoin ℂ (Set.range FB)).val.comp fS) - (ExteriorAlgebra.lift ℂ - ⟨fermionicComponentBasis.constr ℂ FF, fun v => by - have hdiag : ∀ g, FF g * FF g = 0 := fun g => by - simpa [← two_smul ℂ] using eq_neg_iff_add_eq_zero.mp (hFF g g) - rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Finset.sum_product'] - exact Finset.sum_involution (fun p _ => (p.2, p.1)) - (fun p _ => by rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2]; module) - (fun p _ hf hswap => hf (by rw [show p.2 = p.1 from (Prod.ext_iff.mp hswap).1, - smul_mul_smul_comm, hdiag, smul_zero])) - (fun p _ => Finset.mem_univ _) (fun p _ => rfl)⟩) - (fun x y => by - refine (Algebra.commute_of_mem_adjoin_of_forall_mem_commute (fS x).2 ?_).symm - rintro _ ⟨g, rfl⟩ - induction y using ExteriorAlgebra.induction with - | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commutes r _ - | ι v => - rw [ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] - exact Commute.sum_left _ _ _ fun g' _ => (hBF g g').symm.smul_left _ - | mul u w hu hw => rw [map_mul]; exact hu.mul_left hw - | add u w hu hw => rw [map_add]; exact hu.add_left hw) - - lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalarGenerator) : ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := ⟨complexScalarComponentBasis ϕ, rfl⟩ @@ -472,6 +460,54 @@ lemma ofFieldGenerators_comm (ϕ₁ ϕ₂ : FieldGenerators) : /-! +## The lift of a map from the field generators to an algebra homomorphism + +-/ + +open scoped IsMulCommutative in +/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images `F g` of + the field generators: the images of the bosonic generators pairwise commute and + commute with the images of the fermionic generators, which pairwise anticommute. + The bosonic factor lifts through the commutative subalgebra generated by the + bosonic images. -/ +def lift {A : Type} [Ring A] [Algebra ℂ A] (F : FieldGenerators → A) + (hBB : ∀ g g', Commute (F (.cScalar g)) (F (.cScalar g'))) + (hBF : ∀ g g', Commute (F (.cScalar g)) (F (.fermion g'))) + (hFF : ∀ g g', F (.fermion g) * F (.fermion g') = - (F (.fermion g') * F (.fermion g))) : + EFTLagrangianExclDeriv →ₐ[ℂ] A := + let FB : ComplexScalarGenerator → A := fun g => F (.cScalar g) + let FF : FermionicGenerator → A := fun g => F (.fermion g) + have hFF : ∀ g g', FF g * FF g' = - (FF g' * FF g) := hFF + haveI : IsMulCommutative (Algebra.adjoin ℂ (Set.range FB)) := + Algebra.isMulCommutative_adjoin ℂ (by rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩; exact hBB g g') + let fS : ComplexScalarEFTExclDeriv →ₐ[ℂ] Algebra.adjoin ℂ (Set.range FB) := + SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ fun g => + ⟨FB g, Algebra.subset_adjoin ⟨g, rfl⟩⟩) + Algebra.TensorProduct.lift + ((Algebra.adjoin ℂ (Set.range FB)).val.comp fS) + (ExteriorAlgebra.lift ℂ + ⟨fermionicComponentBasis.constr ℂ FF, fun v => by + have hdiag : ∀ g, FF g * FF g = 0 := fun g => by + simpa [← two_smul ℂ] using eq_neg_iff_add_eq_zero.mp (hFF g g) + rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Finset.sum_product'] + exact Finset.sum_involution (fun p _ => (p.2, p.1)) + (fun p _ => by rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2]; module) + (fun p _ hf hswap => hf (by rw [show p.2 = p.1 from (Prod.ext_iff.mp hswap).1, + smul_mul_smul_comm, hdiag, smul_zero])) + (fun p _ => Finset.mem_univ _) (fun p _ => rfl)⟩) + (fun x y => by + refine (Algebra.commute_of_mem_adjoin_of_forall_mem_commute (fS x).2 ?_).symm + rintro _ ⟨g, rfl⟩ + induction y using ExteriorAlgebra.induction with + | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commutes r _ + | ι v => + rw [ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] + exact Commute.sum_left _ _ _ fun g' _ => (hBF g g').symm.smul_left _ + | mul u w hu hw => rw [map_mul]; exact hu.mul_left hw + | add u w hu hw => rw [map_add]; exact hu.add_left hw) + +/-! + ## The elements generated by lists of field generators -/ @@ -559,14 +595,7 @@ lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} | add y₁ y₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] | add x₁ x₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] have hgen : ∀ ψ : FieldGenerators, r [ψ]ₐ = [ψ]ₐ := by - intro ψ - match ψ with - | .cScalar ϕ => - obtain ⟨x, hx⟩ := ofFieldGenerators_cScalar_exists ϕ - simp [r, hx] - | .fermion ψ => - obtain ⟨x, hx⟩ := ofFieldGenerators_fermion_exists ψ - simp [r, hx, CliffordAlgebra.reverse_ι] + rintro (ϕ | ψ) <;> simp [r, ofFieldGenerators, CliffordAlgebra.reverse_ι] have hf : ∀ l : List FieldGenerators, r (termOfList l) = termOfList l.reverse := by intro l induction l with @@ -576,6 +605,11 @@ lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} simp [termOfList] rw [← hf, ← hf, h, map_smul] +lemma termOfList_conjugate_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} + (h : termOfList l1 = c • termOfList l2) : + termOfList (l1.map conjugate) = c • termOfList (l2.map conjugate) := by + sorry + /-- The elements of type `termOfList` span `EFTLagrangianExclDeriv`. -/ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : V ∈ Submodule.span ℂ (Set.range termOfList) := by @@ -599,11 +633,9 @@ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : Submodule.span ℂ (Set.range termOfList) := by induction a using SymmetricAlgebra.induction with | algebraMap c => - have : (algebraMap ℂ _ c ⊗ₜ[ℂ] 1 : EFTLagrangianExclDeriv) = c • termOfList [] := by - simp [termOfList, Algebra.TensorProduct.one_def, Algebra.algebraMap_eq_smul_one, - TensorProduct.smul_tmul'] - rw [this] - exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl⟩) + simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, + TensorProduct.smul_tmul'] using + Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) | ι x => rw [← Basis.sum_repr complexScalarComponentBasis x, map_sum, TensorProduct.sum_tmul] refine Submodule.sum_mem _ fun i _ => ?_ @@ -616,11 +648,9 @@ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : Submodule.span ℂ (Set.range termOfList) := by induction b using ExteriorAlgebra.induction with | algebraMap c => - have : (1 ⊗ₜ[ℂ] algebraMap ℂ _ c : EFTLagrangianExclDeriv) = c • termOfList [] := by - simp [termOfList, Algebra.TensorProduct.one_def, Algebra.algebraMap_eq_smul_one, - TensorProduct.tmul_smul] - rw [this] - exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl⟩) + simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, + TensorProduct.tmul_smul] using + Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) | ι x => rw [← Basis.sum_repr fermionicComponentBasis x, map_sum, TensorProduct.tmul_sum] refine Submodule.sum_mem _ fun i _ => ?_ @@ -630,260 +660,4 @@ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : | add b₁ b₂ h₁ h₂ => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ h₁ h₂ simpa using hmul_mem _ _ h1 h2 -/-! - -## The coefficent associated with a multiset of field generators - - - -The below is AI slop, but it shows a useful way od defining the coefficent. - --/ - -def CoeffSubmodule (s : Multiset FieldGenerators) : Submodule ℂ EFTLagrangianExclDeriv := - Submodule.span ℂ (termOfList '' {l | Multiset.ofList l = s}) - -instance : SetLike.GradedMonoid CoeffSubmodule where - one_mem := by simp [CoeffSubmodule, termOfList_nil] - mul_mem s1 s2 V1 V2 hV1 hV2 := by - have h := Submodule.mul_mem_mul hV1 hV2 - rw [CoeffSubmodule, CoeffSubmodule, Submodule.span_mul_span] at h - refine Submodule.span_mono ?_ h - rintro _ ⟨_, ⟨l1, hl1, rfl⟩, _, ⟨l2, hl2, rfl⟩, rfl⟩ - exact ⟨l1 ++ l2, by subst hl1; subst hl2; rfl, termOfList_append l1 l2⟩ - -open DirectSum - -namespace CoeffSubmodule - - -/-- Transport `DirectSum.of` along an equality of degrees: two homogeneous components with - equal degrees and equal underlying values are equal. -/ -lemma of_eq {s t : Multiset FieldGenerators} (h : s = t) - {x : CoeffSubmodule s} {y : CoeffSubmodule t} - (hxy : (x : EFTLagrangianExclDeriv) = y) : - DirectSum.of (fun u => CoeffSubmodule u) s x = DirectSum.of (fun u => CoeffSubmodule u) t y := by - subst h - exact congrArg _ (Subtype.ext hxy) - -/-- The class of `termOfList l` in the direct sum of the coefficient submodules, placed - in degree `↑l`. Note that the membership proof is definitional. -/ -def ofList (l : List FieldGenerators) : ⨁ s, CoeffSubmodule s := - DirectSum.of (fun s => CoeffSubmodule s) ↑l - ⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ - -lemma ofList_nil : ofList [] = 1 := by - simp [ofList, termOfList_nil] - rfl - -lemma ofList_append (l₁ l₂ : List FieldGenerators) : - ofList (l₁ ++ l₂) = ofList l₁ * ofList l₂ := by - rw [ofList, ofList, ofList, DirectSum.of_mul_of] - exact of_eq rfl (by rw [SetLike.coe_gMul]; exact termOfList_append l₁ l₂) - - -/-- The image of a generator in the direct sum of the coefficient submodules, - placed in degree `{g}`. -/ -def ofGenerator (g : FieldGenerators) : ⨁ s, CoeffSubmodule s := ofList [g] - -lemma ofGenerator_comm {g₁ g₂ : FieldGenerators} (h : [g₁]ₐ * [g₂]ₐ = [g₂]ₐ * [g₁]ₐ) : - ofGenerator g₁ * ofGenerator g₂ = ofGenerator g₂ * ofGenerator g₁ := by - rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] - exact of_eq (Multiset.cons_swap g₁ g₂ 0) (by simp [termOfList, h]) - -lemma fermion_mul_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : - [ψ₁]ₑ * [ψ₂]ₑ + [ψ₂]ₑ * [ψ₁]ₑ = 0 := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ - rw [h1, h2, Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - ← TensorProduct.tmul_add] - simp - -lemma ofList_eq_zero {l : List FieldGenerators} (h : termOfList l = 0) : ofList l = 0 := by - have hx : (⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ : CoeffSubmodule ↑l) = 0 := - Subtype.ext h - rw [ofList, hx, map_zero] - -/-- Two `termOfList` classes with the same field content sum to zero as soon as the - underlying terms do. -/ -lemma ofList_add_ofList {l₁ l₂ : List FieldGenerators} - (hp : (↑l₂ : Multiset FieldGenerators) = ↑l₁) - (h : termOfList l₁ + termOfList l₂ = 0) : ofList l₁ + ofList l₂ = 0 := by - have h2 : ofList l₂ = DirectSum.of (fun u => CoeffSubmodule u) ↑l₁ - ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ := of_eq hp rfl - have hsum : (⟨termOfList l₁, Submodule.subset_span ⟨l₁, rfl, rfl⟩⟩ + - ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ : CoeffSubmodule ↑l₁) = 0 := - Subtype.ext h - rw [ofList, h2, ← map_add, hsum, map_zero] - -lemma ofGenerator_fermion_sq (ψf : FermionicGenerator) : - ofGenerator (.fermion ψf) * ofGenerator (.fermion ψf) = 0 := by - rw [ofGenerator, ← ofList_append] - exact ofList_eq_zero (by simp [termOfList]) - -lemma ofGenerator_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : - ofGenerator (.fermion ψ₁) * ofGenerator (.fermion ψ₂) + - ofGenerator (.fermion ψ₂) * ofGenerator (.fermion ψ₁) = 0 := by - rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] - exact ofList_add_ofList - (by simpa using List.Perm.swap (FieldGenerators.fermion ψ₁) (.fermion ψ₂) []) - (by simpa [termOfList] using fermion_mul_fermion_add_swap ψ₁ ψ₂) - -/-- The decomposition map on the fermionic factor, sending each fermionic generator to - its class in degree `{ψ}`. -/ -noncomputable def decomposeExt : FermionicEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := - ExteriorAlgebra.lift ℂ - ⟨fermionicComponentBasis.constr ℂ (fun i => ofGenerator (.fermion i)), by - intro m - -- Generic ring/module lemmas restated locally so that their statements carry the - -- direct sum's own instances; `rw` can then match where the library patterns cannot. - have hexpand : ∀ f g : FermionicGenerator → ⨁ s, CoeffSubmodule s, - (∑ i, f i) * ∑ j, g j = ∑ i, ∑ j, f i * g j := fun f g => Fintype.sum_mul_sum f g - have hsmul : ∀ (a b : ℂ) (x y : ⨁ s, CoeffSubmodule s), - (a • x) * (b • y) = (a * b) • (x * y) := fun a b x y => smul_mul_smul_comm a x b y - have hcollect : ∀ (a : ℂ) (x y : ⨁ s, CoeffSubmodule s), - a • x + a • y = a • (x + y) := fun a x y => (smul_add a x y).symm - have hzero : ∀ a : ℂ, a • (0 : ⨁ s, CoeffSubmodule s) = 0 := fun a => smul_zero a - rw [Basis.constr_apply_fintype, hexpand, ← Finset.sum_product'] - refine Finset.sum_involution (fun p _ => (p.2, p.1)) ?_ ?_ - (fun p _ => Finset.mem_univ _) (fun p _ => rfl) - · intro p _ - rw [hsmul, hsmul, mul_comm (fermionicComponentBasis.equivFun m p.2) - (fermionicComponentBasis.equivFun m p.1), - hcollect, ofGenerator_fermion_add_swap, hzero] - · intro p _ hne heq - refine hne ?_ - have h1 : p.2 = p.1 := congrArg Prod.fst heq - rw [hsmul, h1, ofGenerator_fermion_sq, hzero]⟩ - -/-- The subalgebra of the graded direct sum generated by the bosonic generator classes. - It is commutative, which lets `SymmetricAlgebra.lift` target it. -/ -noncomputable def bosonicAdjoin : Subalgebra ℂ (⨁ s, CoeffSubmodule s) := - Algebra.adjoin ℂ (Set.range fun g : ComplexScalarGenerator => ofGenerator (.cScalar g)) - -instance : IsMulCommutative bosonicAdjoin := - Algebra.isMulCommutative_adjoin ℂ (by - rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩ - exact ofGenerator_comm (cScalar_comm_cScalar g g')) - -open scoped IsMulCommutative in -/-- The decomposition map on the bosonic factor. Since `SymmetricAlgebra.lift` requires a - commutative target, we factor through `bosonicAdjoin`. -/ -noncomputable def decomposeSym : ComplexScalarEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := - bosonicAdjoin.val.comp <| SymmetricAlgebra.lift <| - complexScalarComponentBasis.constr ℂ fun g => - (⟨ofGenerator (.cScalar g), Algebra.subset_adjoin (Set.mem_range_self g)⟩ : bosonicAdjoin) - -lemma decomposeSym_mem_bosonicAdjoin (x : ComplexScalarEFTExclDeriv) : - decomposeSym x ∈ bosonicAdjoin := by - simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, Subalgebra.coe_val] - exact SetLike.coe_mem _ - -lemma decomposeExt_ι (v : FermionicComponentSpace) : - decomposeExt (ExteriorAlgebra.ι ℂ v) = - ∑ j, fermionicComponentBasis.equivFun v j • ofGenerator (.fermion j) := by - rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] - -lemma commute_decomposeSym_decomposeExt - (x : ComplexScalarEFTExclDeriv) (y : FermionicEFTExclDeriv) : - Commute (decomposeSym x) (decomposeExt y) := by - -- Every element of `bosonicAdjoin` commutes with the image of the fermionic factor; - -- this avoids ever unfolding `decomposeSym`. - have hgen : ∀ g : ComplexScalarGenerator, - Commute (ofGenerator (.cScalar g)) (decomposeExt y) := by - intro g - induction y using ExteriorAlgebra.induction with - | algebraMap c => rw [AlgHom.commutes]; exact (Algebra.commutes c _).symm - | mul y₁ y₂ h₁ h₂ => - rw [map_mul] - exact Commute.mul_right (a := ofGenerator (.cScalar g)) (b := decomposeExt y₁) h₁ h₂ - | add y₁ y₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ - | ι v => - rw [decomposeExt_ι] - refine Commute.sum_right (b := ofGenerator (.cScalar g)) _ _ fun j _ => ?_ - refine Commute.smul_right (a := ofGenerator (.cScalar g)) ?_ _ - exact ofGenerator_comm (cScalar_comm_fermion g j) - have hx := decomposeSym_mem_bosonicAdjoin x - generalize decomposeSym x = a at hx ⊢ - induction hx using Algebra.adjoin_induction with - | mem a ha => obtain ⟨g, rfl⟩ := ha; exact hgen g - | algebraMap c => exact Algebra.commutes c _ - | add a b _ _ h₁ h₂ => exact h₁.add_left h₂ - | mul a b _ _ h₁ h₂ => exact Commute.mul_left (c := decomposeExt y) h₁ h₂ - -noncomputable def decompose' : EFTLagrangianExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := - Algebra.TensorProduct.lift decomposeSym decomposeExt commute_decomposeSym_decomposeExt - -lemma decomposeSym_ι_basis (g : ComplexScalarGenerator) : - decomposeSym (SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g)) = - ofGenerator (.cScalar g) := by - simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, SymmetricAlgebra.lift_ι_apply, - Basis.constr_basis] - rfl - -lemma decomposeExt_ι_basis (g : FermionicGenerator) : - decomposeExt (ExteriorAlgebra.ι ℂ (fermionicComponentBasis g)) = - ofGenerator (.fermion g) := by - rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_basis] - -lemma decompose'_ofFieldGenerators (g : FieldGenerators) : - decompose' [g]ₐ = ofGenerator g := by - -- Local restatements of `mul_one`/`one_mul` carrying the direct sum's own instances. - have hmul_one : ∀ x : ⨁ s, CoeffSubmodule s, x * 1 = x := fun x => mul_one x - have hone_mul : ∀ x : ⨁ s, CoeffSubmodule s, 1 * x = x := fun x => one_mul x - match g with - | .cScalar g => - rw [decompose', show ([g]ₛ : EFTLagrangianExclDeriv) = - SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g) ⊗ₜ 1 from rfl, - Algebra.TensorProduct.lift_tmul, map_one, hmul_one, decomposeSym_ι_basis] - | .fermion g => - rw [decompose', show ([g]ₑ : EFTLagrangianExclDeriv) = - 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis g) from rfl, - Algebra.TensorProduct.lift_tmul, map_one, hone_mul, decomposeExt_ι_basis] - -lemma decompose'_termOfList (l : List FieldGenerators) : - decompose' (termOfList l) = ofList l := by - induction l with - | nil => rw [termOfList_nil, map_one, ofList_nil] - | cons g t ih => - rw [termOfList_cons, map_mul, ih, decompose'_ofFieldGenerators, ofGenerator, - ← ofList_append, List.singleton_append] - -lemma coeAlgHom_ofList (l : List FieldGenerators) : - DirectSum.coeAlgHom CoeffSubmodule (ofList l) = termOfList l := by - rw [ofList] - exact DirectSum.coeAlgHom_of _ _ _ - -instance : GradedAlgebra CoeffSubmodule := by - refine GradedAlgebra.ofAlgHom CoeffSubmodule decompose' ?_ ?_ - · refine AlgHom.ext fun x => ?_ - rw [AlgHom.comp_apply, AlgHom.id_apply] - induction mem_termOfList_span x using Submodule.span_induction with - | mem a ha => - obtain ⟨l, rfl⟩ := ha - rw [decompose'_termOfList] - exact coeAlgHom_ofList l - | zero => simp - | add a b _ _ h₁ h₂ => rw [map_add, map_add, h₁, h₂] - | smul c a _ h₁ => rw [map_smul, map_smul, h₁] - · intro s x - obtain ⟨x, hx⟩ := x - induction hx using Submodule.span_induction with - | mem a ha => - obtain ⟨l, hl, rfl⟩ := ha - subst hl - rw [decompose'_termOfList] - rfl - | zero => exact (map_zero (DirectSum.of (fun i => CoeffSubmodule i) s)).symm ▸ map_zero _ - | add a b ha hb h₁ h₂ => rw [map_add, h₁, h₂, ← map_add]; rfl - | smul c a ha h₁ => - rw [map_smul, h₁, ← DirectSum.lof_eq_of ℂ, ← map_smul]; rfl - - -def coeff (s : Multiset FieldGenerators) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv:= - GradedAlgebra.proj CoeffSubmodule s - -end CoeffSubmodule - - end EFTLagrangianExclDeriv diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean new file mode 100644 index 000000000..e50b990e7 --- /dev/null +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean @@ -0,0 +1,292 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan +-/ +module + +public import Physlib.Particles.WessZumino.EFTLagrangianExclDeriv.Basic +/-! + +# The Wess-Zumino EFT Lagrangian without derivatives + +## i. Overview + +The Wess-Zumino theory is a simple field theory consisting +of a single left-handed Weyl fermion and a single complex scalar field. +Sometimes the complex scalar field is replaced by a pair of real scalar fields. + +The theory is of physical interest, because it simple example of a theory +permitting a supersymmetry. In this file we don't consider the supersymmetric nature +of the theory. + +-/ + +@[expose] public section + +namespace WessZumino +namespace EFTLagrangianExclDeriv +noncomputable section + +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct +open CategoryTheory.MonoidalCategory +open Fermion + +/-! + +## The coefficent associated with a multiset of field generators + + + +The below is AI slop, but it shows a useful way od defining the coefficent. + +-/ + +def CoeffSubmodule (s : Multiset FieldGenerators) : Submodule ℂ EFTLagrangianExclDeriv := + Submodule.span ℂ (termOfList '' {l | Multiset.ofList l = s}) + +instance : SetLike.GradedMonoid CoeffSubmodule where + one_mem := by simp [CoeffSubmodule, termOfList_nil] + mul_mem s1 s2 V1 V2 hV1 hV2 := by + have h := Submodule.mul_mem_mul hV1 hV2 + rw [CoeffSubmodule, CoeffSubmodule, Submodule.span_mul_span] at h + refine Submodule.span_mono ?_ h + rintro _ ⟨_, ⟨l1, hl1, rfl⟩, _, ⟨l2, hl2, rfl⟩, rfl⟩ + exact ⟨l1 ++ l2, by subst hl1; subst hl2; rfl, termOfList_append l1 l2⟩ + +open DirectSum + +namespace CoeffSubmodule + +/-- Transport `DirectSum.of` along an equality of degrees: two homogeneous components with + equal degrees and equal underlying values are equal. -/ +lemma of_eq {s t : Multiset FieldGenerators} (h : s = t) + {x : CoeffSubmodule s} {y : CoeffSubmodule t} + (hxy : (x : EFTLagrangianExclDeriv) = y) : + DirectSum.of (fun u => CoeffSubmodule u) s x = DirectSum.of (fun u => CoeffSubmodule u) t y := by + subst h + exact congrArg _ (Subtype.ext hxy) + +/-- The class of `termOfList l` in the direct sum of the coefficient submodules, placed + in degree `↑l`. Note that the membership proof is definitional. -/ +def ofList (l : List FieldGenerators) : ⨁ s, CoeffSubmodule s := + DirectSum.of (fun s => CoeffSubmodule s) ↑l + ⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ + +lemma ofList_nil : ofList [] = 1 := by + simp [ofList, termOfList_nil] + rfl + +lemma ofList_append (l₁ l₂ : List FieldGenerators) : + ofList (l₁ ++ l₂) = ofList l₁ * ofList l₂ := by + rw [ofList, ofList, ofList, DirectSum.of_mul_of] + exact of_eq rfl (by rw [SetLike.coe_gMul]; exact termOfList_append l₁ l₂) + + +/-- The image of a generator in the direct sum of the coefficient submodules, + placed in degree `{g}`. -/ +def ofGenerator (g : FieldGenerators) : ⨁ s, CoeffSubmodule s := ofList [g] + +lemma ofGenerator_comm {g₁ g₂ : FieldGenerators} (h : [g₁]ₐ * [g₂]ₐ = [g₂]ₐ * [g₁]ₐ) : + ofGenerator g₁ * ofGenerator g₂ = ofGenerator g₂ * ofGenerator g₁ := by + rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] + exact of_eq (Multiset.cons_swap g₁ g₂ 0) (by simp [termOfList, h]) + +lemma fermion_mul_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : + [ψ₁]ₑ * [ψ₂]ₑ + [ψ₂]ₑ * [ψ₁]ₑ = 0 := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ + rw [h1, h2, Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + ← TensorProduct.tmul_add] + simp + +lemma ofList_eq_zero {l : List FieldGenerators} (h : termOfList l = 0) : ofList l = 0 := by + have hx : (⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ : CoeffSubmodule ↑l) = 0 := + Subtype.ext h + rw [ofList, hx, map_zero] + +/-- Two `termOfList` classes with the same field content sum to zero as soon as the + underlying terms do. -/ +lemma ofList_add_ofList {l₁ l₂ : List FieldGenerators} + (hp : (↑l₂ : Multiset FieldGenerators) = ↑l₁) + (h : termOfList l₁ + termOfList l₂ = 0) : ofList l₁ + ofList l₂ = 0 := by + have h2 : ofList l₂ = DirectSum.of (fun u => CoeffSubmodule u) ↑l₁ + ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ := of_eq hp rfl + have hsum : (⟨termOfList l₁, Submodule.subset_span ⟨l₁, rfl, rfl⟩⟩ + + ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ : CoeffSubmodule ↑l₁) = 0 := + Subtype.ext h + rw [ofList, h2, ← map_add, hsum, map_zero] + +lemma ofGenerator_fermion_sq (ψf : FermionicGenerator) : + ofGenerator (.fermion ψf) * ofGenerator (.fermion ψf) = 0 := by + rw [ofGenerator, ← ofList_append] + exact ofList_eq_zero (by simp [termOfList]) + +lemma ofGenerator_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : + ofGenerator (.fermion ψ₁) * ofGenerator (.fermion ψ₂) + + ofGenerator (.fermion ψ₂) * ofGenerator (.fermion ψ₁) = 0 := by + rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] + exact ofList_add_ofList + (by simpa using List.Perm.swap (FieldGenerators.fermion ψ₁) (.fermion ψ₂) []) + (by simpa [termOfList] using fermion_mul_fermion_add_swap ψ₁ ψ₂) + +/-- The decomposition map on the fermionic factor, sending each fermionic generator to + its class in degree `{ψ}`. -/ +noncomputable def decomposeExt : FermionicEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := + ExteriorAlgebra.lift ℂ + ⟨fermionicComponentBasis.constr ℂ (fun i => ofGenerator (.fermion i)), by + intro m + -- Generic ring/module lemmas restated locally so that their statements carry the + -- direct sum's own instances; `rw` can then match where the library patterns cannot. + have hexpand : ∀ f g : FermionicGenerator → ⨁ s, CoeffSubmodule s, + (∑ i, f i) * ∑ j, g j = ∑ i, ∑ j, f i * g j := fun f g => Fintype.sum_mul_sum f g + have hsmul : ∀ (a b : ℂ) (x y : ⨁ s, CoeffSubmodule s), + (a • x) * (b • y) = (a * b) • (x * y) := fun a b x y => smul_mul_smul_comm a x b y + have hcollect : ∀ (a : ℂ) (x y : ⨁ s, CoeffSubmodule s), + a • x + a • y = a • (x + y) := fun a x y => (smul_add a x y).symm + have hzero : ∀ a : ℂ, a • (0 : ⨁ s, CoeffSubmodule s) = 0 := fun a => smul_zero a + rw [Basis.constr_apply_fintype, hexpand, ← Finset.sum_product'] + refine Finset.sum_involution (fun p _ => (p.2, p.1)) ?_ ?_ + (fun p _ => Finset.mem_univ _) (fun p _ => rfl) + · intro p _ + rw [hsmul, hsmul, mul_comm (fermionicComponentBasis.equivFun m p.2) + (fermionicComponentBasis.equivFun m p.1), + hcollect, ofGenerator_fermion_add_swap, hzero] + · intro p _ hne heq + refine hne ?_ + have h1 : p.2 = p.1 := congrArg Prod.fst heq + rw [hsmul, h1, ofGenerator_fermion_sq, hzero]⟩ + +/-- The subalgebra of the graded direct sum generated by the bosonic generator classes. + It is commutative, which lets `SymmetricAlgebra.lift` target it. -/ +noncomputable def bosonicAdjoin : Subalgebra ℂ (⨁ s, CoeffSubmodule s) := + Algebra.adjoin ℂ (Set.range fun g : ComplexScalarGenerator => ofGenerator (.cScalar g)) + +instance : IsMulCommutative bosonicAdjoin := + Algebra.isMulCommutative_adjoin ℂ (by + rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩ + exact ofGenerator_comm (cScalar_comm_cScalar g g')) + +open scoped IsMulCommutative in +/-- The decomposition map on the bosonic factor. Since `SymmetricAlgebra.lift` requires a + commutative target, we factor through `bosonicAdjoin`. -/ +noncomputable def decomposeSym : ComplexScalarEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := + bosonicAdjoin.val.comp <| SymmetricAlgebra.lift <| + complexScalarComponentBasis.constr ℂ fun g => + (⟨ofGenerator (.cScalar g), Algebra.subset_adjoin (Set.mem_range_self g)⟩ : bosonicAdjoin) + +lemma decomposeSym_mem_bosonicAdjoin (x : ComplexScalarEFTExclDeriv) : + decomposeSym x ∈ bosonicAdjoin := by + simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, Subalgebra.coe_val] + exact SetLike.coe_mem _ + +lemma decomposeExt_ι (v : FermionicComponentSpace) : + decomposeExt (ExteriorAlgebra.ι ℂ v) = + ∑ j, fermionicComponentBasis.equivFun v j • ofGenerator (.fermion j) := by + rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] + +lemma commute_decomposeSym_decomposeExt + (x : ComplexScalarEFTExclDeriv) (y : FermionicEFTExclDeriv) : + Commute (decomposeSym x) (decomposeExt y) := by + -- Every element of `bosonicAdjoin` commutes with the image of the fermionic factor; + -- this avoids ever unfolding `decomposeSym`. + have hgen : ∀ g : ComplexScalarGenerator, + Commute (ofGenerator (.cScalar g)) (decomposeExt y) := by + intro g + induction y using ExteriorAlgebra.induction with + | algebraMap c => rw [AlgHom.commutes]; exact (Algebra.commutes c _).symm + | mul y₁ y₂ h₁ h₂ => + rw [map_mul] + exact Commute.mul_right (a := ofGenerator (.cScalar g)) (b := decomposeExt y₁) h₁ h₂ + | add y₁ y₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ + | ι v => + rw [decomposeExt_ι] + refine Commute.sum_right (b := ofGenerator (.cScalar g)) _ _ fun j _ => ?_ + refine Commute.smul_right (a := ofGenerator (.cScalar g)) ?_ _ + exact ofGenerator_comm (cScalar_comm_fermion g j) + have hx := decomposeSym_mem_bosonicAdjoin x + generalize decomposeSym x = a at hx ⊢ + induction hx using Algebra.adjoin_induction with + | mem a ha => obtain ⟨g, rfl⟩ := ha; exact hgen g + | algebraMap c => exact Algebra.commutes c _ + | add a b _ _ h₁ h₂ => exact h₁.add_left h₂ + | mul a b _ _ h₁ h₂ => exact Commute.mul_left (c := decomposeExt y) h₁ h₂ + +noncomputable def decompose' : EFTLagrangianExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := + Algebra.TensorProduct.lift decomposeSym decomposeExt commute_decomposeSym_decomposeExt + +lemma decomposeSym_ι_basis (g : ComplexScalarGenerator) : + decomposeSym (SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g)) = + ofGenerator (.cScalar g) := by + simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, SymmetricAlgebra.lift_ι_apply, + Basis.constr_basis] + rfl + +lemma decomposeExt_ι_basis (g : FermionicGenerator) : + decomposeExt (ExteriorAlgebra.ι ℂ (fermionicComponentBasis g)) = + ofGenerator (.fermion g) := by + rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_basis] + +lemma decompose'_ofFieldGenerators (g : FieldGenerators) : + decompose' [g]ₐ = ofGenerator g := by + -- Local restatements of `mul_one`/`one_mul` carrying the direct sum's own instances. + have hmul_one : ∀ x : ⨁ s, CoeffSubmodule s, x * 1 = x := fun x => mul_one x + have hone_mul : ∀ x : ⨁ s, CoeffSubmodule s, 1 * x = x := fun x => one_mul x + match g with + | .cScalar g => + rw [decompose', show ([g]ₛ : EFTLagrangianExclDeriv) = + SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g) ⊗ₜ 1 from rfl, + Algebra.TensorProduct.lift_tmul, map_one, hmul_one, decomposeSym_ι_basis] + | .fermion g => + rw [decompose', show ([g]ₑ : EFTLagrangianExclDeriv) = + 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis g) from rfl, + Algebra.TensorProduct.lift_tmul, map_one, hone_mul, decomposeExt_ι_basis] + +lemma decompose'_termOfList (l : List FieldGenerators) : + decompose' (termOfList l) = ofList l := by + induction l with + | nil => rw [termOfList_nil, map_one, ofList_nil] + | cons g t ih => + rw [termOfList_cons, map_mul, ih, decompose'_ofFieldGenerators, ofGenerator, + ← ofList_append, List.singleton_append] + +lemma coeAlgHom_ofList (l : List FieldGenerators) : + DirectSum.coeAlgHom CoeffSubmodule (ofList l) = termOfList l := by + rw [ofList] + exact DirectSum.coeAlgHom_of _ _ _ + +instance : GradedAlgebra CoeffSubmodule := by + refine GradedAlgebra.ofAlgHom CoeffSubmodule decompose' ?_ ?_ + · refine AlgHom.ext fun x => ?_ + rw [AlgHom.comp_apply, AlgHom.id_apply] + induction mem_termOfList_span x using Submodule.span_induction with + | mem a ha => + obtain ⟨l, rfl⟩ := ha + rw [decompose'_termOfList] + exact coeAlgHom_ofList l + | zero => simp + | add a b _ _ h₁ h₂ => rw [map_add, map_add, h₁, h₂] + | smul c a _ h₁ => rw [map_smul, map_smul, h₁] + · intro s x + obtain ⟨x, hx⟩ := x + induction hx using Submodule.span_induction with + | mem a ha => + obtain ⟨l, hl, rfl⟩ := ha + subst hl + rw [decompose'_termOfList] + rfl + | zero => exact (map_zero (DirectSum.of (fun i => CoeffSubmodule i) s)).symm ▸ map_zero _ + | add a b ha hb h₁ h₂ => rw [map_add, h₁, h₂, ← map_add]; rfl + | smul c a ha h₁ => + rw [map_smul, h₁, ← DirectSum.lof_eq_of ℂ, ← map_smul]; rfl + + +def coeff (s : Multiset FieldGenerators) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv:= + GradedAlgebra.proj CoeffSubmodule s + +end CoeffSubmodule + +end EFTLagrangianExclDeriv From d904ad6250e91a036155801603776a1d49e8317a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 08:52:41 +0100 Subject: [PATCH 053/254] Update Coeff.lean --- Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean index e50b990e7..41b9c543b 100644 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean @@ -289,4 +289,4 @@ def coeff (s : Multiset FieldGenerators) : EFTLagrangianExclDeriv →ₗ[ℂ] EF end CoeffSubmodule -end EFTLagrangianExclDeriv +end From ea37a177f651523cb0b0d068d6c425a78ffd4edd Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 09:37:17 +0100 Subject: [PATCH 054/254] feat: Define EFTLagrangian for SM --- .../EFTLagrangianExclDeriv/Basic.lean | 726 ++++++++++++++++++ .../StandardModel/Fermions/DownSinglet.lean | 11 + .../StandardModel/Fermions/LeptonDoublet.lean | 11 + .../StandardModel/Fermions/LeptonSinglet.lean | 10 + .../StandardModel/Fermions/QuarkDoublet.lean | 18 +- .../StandardModel/Fermions/UpSinglet.lean | 11 + .../StandardModel/HiggsBoson/Basic.lean | 6 + .../EFTLagrangianExclDeriv/Basic.lean | 24 +- 8 files changed, 810 insertions(+), 7 deletions(-) create mode 100644 Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean new file mode 100644 index 000000000..ce17b04e7 --- /dev/null +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -0,0 +1,726 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan +-/ +module + +public import Physlib.Relativity.Fermions.Weyl.Metric +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.HiggsBoson.Basic +public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Mathematics.ConjModule +public import Physlib.Mathematics.MultisetsOfMassDim +public import Mathlib.RingTheory.GradedAlgebra.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis +public import Mathlib.Algebra.MvPolynomial.PDeriv +/-! + +# The Standard Model EFT Lagrangian without derivatives + +## i. Overview + +-/ + +@[expose] public section + +namespace StandardModel +noncomputable section + +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct +open CategoryTheory.MonoidalCategory +open Fermion + +/-! + +## Field specification + +-/ + +/-! + +## The input data for Fermions + +For the Wess-Zumino theory there is a single left-handed Weyl fermion. + +-/ + +/-- The irreducible representations of the fermion field + under the Lorentz group. -/ +inductive FermionIrrep + | Q (i : Fin 3) : FermionIrrep + | u (i : Fin 3) : FermionIrrep + | d (i : Fin 3) : FermionIrrep + | L (i : Fin 3) : FermionIrrep + | e (i : Fin 3) : FermionIrrep +deriving DecidableEq, Fintype + +/-- The components of each of the irreducible Fermionic representations + appearing in the Standard model. The components are ordered by + `Lorentz - SU(3) - SU(2)`. -/ +def FermionIrrep.components : FermionIrrep → Type + | .Q _ => Fin 2 × Fin 3 × Fin 2 + | .u _ => Fin 2 × Fin 3 + | .d _ => Fin 2 × Fin 3 + | .L _ => Fin 2 × Fin 2 + | .e _ => Fin 2 + +instance : (φ : FermionIrrep) → Fintype (FermionIrrep.components φ) + | .Q _ => inferInstanceAs (Fintype (Fin 2 × Fin 3 × Fin 2)) + | .u _ => inferInstanceAs (Fintype (Fin 2 × Fin 3)) + | .d _ => inferInstanceAs (Fintype (Fin 2 × Fin 3)) + | .L _ => inferInstanceAs (Fintype (Fin 2 × Fin 2)) + | .e _ => inferInstanceAs (Fintype (Fin 2)) + +instance : (φ : FermionIrrep) → DecidableEq (FermionIrrep.components φ) + | .Q _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 3 × Fin 2)) + | .u _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 3)) + | .d _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 3)) + | .L _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 2)) + | .e _ => inferInstanceAs (DecidableEq (Fin 2)) + +def FermionIrrep.module : FermionIrrep → Type + | .Q _ => QuarkDoublet + | .u _ => UpSinglet + | .d _ => DownSinglet + | .L _ => LeptonDoublet + | .e _ => LeptonSinglet + +instance : (φ : FermionIrrep) → AddCommGroup (FermionIrrep.module φ) + | .Q _ => inferInstanceAs (AddCommGroup QuarkDoublet) + | .u _ => inferInstanceAs (AddCommGroup UpSinglet) + | .d _ => inferInstanceAs (AddCommGroup DownSinglet) + | .L _ => inferInstanceAs (AddCommGroup LeptonDoublet) + | .e _ => inferInstanceAs (AddCommGroup LeptonSinglet) + +instance : (φ : FermionIrrep) → Module ℂ (FermionIrrep.module φ) + | .Q _ => inferInstanceAs (Module ℂ QuarkDoublet) + | .u _ => inferInstanceAs (Module ℂ UpSinglet) + | .d _ => inferInstanceAs (Module ℂ DownSinglet) + | .L _ => inferInstanceAs (Module ℂ LeptonDoublet) + | .e _ => inferInstanceAs (Module ℂ LeptonSinglet) + +def FermionIrrep.basis : (φ : FermionIrrep) → + Basis (FermionIrrep.components φ) ℂ (FermionIrrep.module φ) + | .Q _ => QuarkDoublet.basis + | .u _ => UpSinglet.basis + | .d _ => DownSinglet.basis + | .L _ => LeptonDoublet.basis + | .e _ => LeptonSinglet.basis + +def FermionIrrep.repLorentzGroup : + (φ : FermionIrrep) → Representation ℂ SL(2,ℂ) (FermionIrrep.module φ) + | .Q _ => QuarkDoublet.repLorentzGroup + | .u _ => UpSinglet.repLorentzGroup + | .d _ => DownSinglet.repLorentzGroup + | .L _ => LeptonDoublet.repLorentzGroup + | .e _ => LeptonSinglet.repLorentzGroup + +def FermionIrrep.repGaugeGroupI : + (φ : FermionIrrep) → Representation ℂ GaugeGroupI (FermionIrrep.module φ) + | .Q _ => QuarkDoublet.repGaugeGroupI + | .u _ => UpSinglet.repGaugeGroupI + | .d _ => DownSinglet.repGaugeGroupI + | .L _ => LeptonDoublet.repGaugeGroupI + | .e _ => LeptonSinglet.repGaugeGroupI + +/-! + +## Derived Fermionic quantities + +This are quantities whose form is independent of the specific theory +we are constructing. + +-/ + +inductive FermionicGenerator + | of (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator + | bar (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator +deriving DecidableEq, Fintype + +def FermionicGenerator.conjugate : FermionicGenerator → FermionicGenerator + | .of φ α => .bar φ α + | .bar φ α => .of φ α + +@[simp] +lemma FermionicGenerator.conjugate_conjugate (g : FermionicGenerator) : + g.conjugate.conjugate = g := by + cases g <;> rfl + +def fermionicGeneratorEquiv : FermionicGenerator ≃ + (Σ φ : FermionIrrep, FermionIrrep.components φ) ⊕ (Σ φ : FermionIrrep, FermionIrrep.components φ) where + toFun g := match g with + | .of φ α => Sum.inl ⟨φ, α⟩ + | .bar φ α => Sum.inr ⟨φ, α⟩ + invFun g := match g with + | Sum.inl ⟨φ, α⟩ => .of φ α + | Sum.inr ⟨φ, α⟩ => .bar φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +abbrev FermionicTargetSpace := Π (φ : FermionIrrep), FermionIrrep.module φ + +def FermionicTargetSpace.rep : Representation ℂ SL(2,ℂ) FermionicTargetSpace where + toFun Λ := LinearMap.piMap fun φ => FermionIrrep.repLorentzGroup φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp + +/-- The target space of the fermionic fields, including their conjugates. -/ +abbrev FermionicTargetSpaceWithComplex := FermionicTargetSpace × + ConjModule FermionicTargetSpace + +/-- The representation of the Lorentz group on the fermionic target space: + the irreps act componentwise on the product of their modules, and by the + conjugate action on the conjugate factor. -/ +def FermionicTargetSpaceWithComplex.rep : + Representation ℂ SL(2,ℂ) FermionicTargetSpaceWithComplex := + (FermionicTargetSpace.rep).prod (FermionicTargetSpace.rep.conj) + +abbrev FermionicComponentSpace := Module.Dual ℂ FermionicTargetSpaceWithComplex + +def FermionicComponentSpace.rep : Representation ℂ SL(2,ℂ) FermionicComponentSpace := + (FermionicTargetSpaceWithComplex.rep).dual + +def fermionicComponentBasis : Basis FermionicGenerator ℂ FermionicComponentSpace := + ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod + ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm + +abbrev FermionicEFTExclDeriv := ExteriorAlgebra ℂ FermionicComponentSpace + +def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicEFTExclDeriv where + toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ)).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + + +/-! + +## The input data for the complex scalar fields + +-/ + + +set_option linter.constructorNameAsVariable false + +inductive ComplexScalarIrrep + | H : ComplexScalarIrrep +deriving DecidableEq, Fintype + +def ComplexScalarIrrep.components : ComplexScalarIrrep → Type + | .H => Fin 2 + +instance : (φ : ComplexScalarIrrep) → Fintype (ComplexScalarIrrep.components φ) + | .H => inferInstanceAs (Fintype (Fin 2)) + +instance : (φ : ComplexScalarIrrep) → DecidableEq (ComplexScalarIrrep.components φ) + | .H => inferInstanceAs (DecidableEq (Fin 2)) + +def ComplexScalarIrrep.module : ComplexScalarIrrep → Type + | .H => HiggsVec + +instance : (φ : ComplexScalarIrrep) → AddCommGroup (ComplexScalarIrrep.module φ) + | .H => inferInstanceAs (AddCommGroup HiggsVec) + +instance : (φ : ComplexScalarIrrep) → Module ℂ (ComplexScalarIrrep.module φ) + | .H => inferInstanceAs (Module ℂ HiggsVec) + +def ComplexScalarIrrep.basis : (φ : ComplexScalarIrrep) → + Basis (ComplexScalarIrrep.components φ) ℂ (ComplexScalarIrrep.module φ) + | .H => HiggsVec.orthonormBasis.toBasis + +def ComplexScalarIrrep.repLorentzGroup : (φ : ComplexScalarIrrep) → Representation ℂ SL(2,ℂ) (ComplexScalarIrrep.module φ) + | .H => Representation.trivial ℂ SL(2,ℂ) HiggsVec + +/-! + +## Derived Complex Scalar quantities + +-/ + +inductive ComplexScalarGenerator + | of (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator + | bar (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator +deriving DecidableEq, Fintype + +def ComplexScalarGenerator.conjugate : ComplexScalarGenerator → ComplexScalarGenerator + | .of φ α => .bar φ α + | .bar φ α => .of φ α + +@[simp] +lemma ComplexScalarGenerator.conjugate_conjugate (g : ComplexScalarGenerator) : + g.conjugate.conjugate = g := by + cases g <;> rfl + +def complexScalarGeneratorEquiv : ComplexScalarGenerator ≃ + (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) ⊕ + (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) where + toFun g := match g with + | .of φ α => Sum.inl ⟨φ, α⟩ + | .bar φ α => Sum.inr ⟨φ, α⟩ + invFun g := match g with + | Sum.inl ⟨φ, α⟩ => .of φ α + | Sum.inr ⟨φ, α⟩ => .bar φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +abbrev ComplexScalarTargetSpace := Π (φ : ComplexScalarIrrep), ComplexScalarIrrep.module φ + +def ComplexScalarTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarTargetSpace where + toFun Λ := LinearMap.piMap fun φ => ComplexScalarIrrep.repLorentzGroup φ Λ + map_one' := by + ext1 x + apply LinearMap.ext + intro i + ext y + simp + map_mul' Λ1 Λ2 := by + ext1 x + apply LinearMap.ext + intro i + ext y + simp + +/-- The target space of the fermionic fields, including their conjugates. -/ +abbrev ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace × + ConjModule ComplexScalarTargetSpace + +/-- The representation of the Lorentz group on the fermionic target space: + the irreps act componentwise on the product of their modules, and by the + conjugate action on the conjugate factor. -/ +def ComplexScalarTargetSpaceWithComplex.repLorentzGroup : + Representation ℂ SL(2,ℂ) ComplexScalarTargetSpaceWithComplex := + (ComplexScalarTargetSpace.repLorentzGroup).prod (ComplexScalarTargetSpace.repLorentzGroup.conj) + +abbrev ComplexScalarComponentSpace := Module.Dual ℂ ComplexScalarTargetSpaceWithComplex + +def ComplexScalarComponentSpace.rep : Representation ℂ SL(2,ℂ) ComplexScalarComponentSpace := + (ComplexScalarTargetSpaceWithComplex.repLorentzGroup).dual + +def complexScalarComponentBasis : Basis ComplexScalarGenerator ℂ ComplexScalarComponentSpace := + ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod + ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm + +abbrev ComplexScalarEFTExclDeriv := SymmetricAlgebra ℂ ComplexScalarComponentSpace + +def ComplexScalarEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarEFTExclDeriv where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ2)) by + rw [h]; rfl + ext v + simp + +/-! + +## The field generators + +-/ + +inductive FieldGenerators + | cScalar (_ : ComplexScalarGenerator) : FieldGenerators + | fermion (_ : FermionicGenerator) : FieldGenerators +deriving DecidableEq, Fintype + +def FieldGenerators.IsFermion : FieldGenerators → Bool + | .cScalar _ => False + | .fermion _ => True + +def FieldGenerators.IsBoson : FieldGenerators → Bool + | .cScalar _ => True + | .fermion _ => False + +def FieldGenerators.conjugate : FieldGenerators → FieldGenerators + | .cScalar g => .cScalar g.conjugate + | .fermion g => .fermion g.conjugate + +@[simp] +lemma FieldGenerators.conjugate_conjugate (ϕ : FieldGenerators) : + ϕ.conjugate.conjugate = ϕ := by + cases ϕ <;> simp [conjugate] + +def fieldGeneratorsEquiv : FieldGenerators ≃ + ComplexScalarGenerator ⊕ FermionicGenerator where + toFun g := match g with + | .cScalar g => Sum.inl g + | .fermion g => Sum.inr g + invFun g := match g with + | Sum.inl g => .cScalar g + | Sum.inr g => .fermion g + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +@[simp] +lemma FieldGenerators.cScalar_isFermion (ϕ : ComplexScalarGenerator) : + (cScalar ϕ).IsFermion = False := by simp [IsFermion] + +@[simp] +lemma FieldGenerators.fermion_isFermion (ϕ : FermionicGenerator) : + (fermion ϕ).IsFermion = True := by simp [IsFermion] + +@[simp] +lemma FieldGenerators.cScalar_isBoson (ϕ : ComplexScalarGenerator) : + (cScalar ϕ).IsBoson = True := by simp [IsBoson] + +@[simp] +lemma FieldGenerators.fermion_isBoson (ϕ : FermionicGenerator) : + (fermion ϕ).IsBoson = False := by simp [IsBoson] + +/-! + +## A. The EFT lagrangian without derivatives + +-/ + +/-- The algebra corresponding to the EFT lagrangian excluding + derivative terms for the Wess-Zumino theory: the free supercommutative algebra + on the bosonic and fermionic generators, i.e. the tensor product of the symmetric + algebra on the bosonic duals with the exterior algebra on the fermionic duals. -/ +abbrev EFTLagrangianExclDeriv : Type := + -- bosonic part of the lagrangian + ComplexScalarEFTExclDeriv ⊗[ℂ] + -- fermionic part of the lagrangian + FermionicEFTExclDeriv + +namespace EFTLagrangianExclDeriv + +/-! + +## The representation of the Lorentz group on the EFT lagrangian + +-/ + +/-- The representation of the Lorentz group on `EFTLagrangianExclDeriv`. -/ +def rep : Representation ℂ SL(2,ℂ) EFTLagrangianExclDeriv := + (ComplexScalarEFTExclDeriv.repLorentzGroup).tprod (FermionicEFTExclDeriv.repLorentzGroup) + +lemma rep_mul (Λ : SL(2,ℂ)) (V W : EFTLagrangianExclDeriv) : + rep Λ (V * W) = rep Λ V * rep Λ W := by + sorry + +/-! + +## The elements of the EFT generated by the field generators + +Every element of the Field generators gives an element in the +type of EFT lagragians. + +-/ +/-- The elements of `EFTLagrangianExclDeriv` associated with + the `FieldGenerators`. -/ +def ofFieldGenerators : FieldGenerators → EFTLagrangianExclDeriv + | .cScalar φ => SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis φ) ⊗ₜ 1 + | .fermion ψ => 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis ψ) + +scoped notation "[" v "]ₐ" => ofFieldGenerators v +scoped notation "[" v "]ₛ" => ofFieldGenerators (FieldGenerators.cScalar v) +scoped notation "[" v "]ₑ" => ofFieldGenerators (FieldGenerators.fermion v) + +lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalarGenerator) : + ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := + ⟨complexScalarComponentBasis ϕ, rfl⟩ + +lemma ofFieldGenerators_fermion_exists (ψ : FermionicGenerator) : + ∃ x, [ψ]ₑ = 1 ⊗ₜ ExteriorAlgebra.ι ℂ x := + ⟨fermionicComponentBasis ψ, rfl⟩ + +lemma cScalar_comm_cScalar (φ₁ φ₂ : ComplexScalarGenerator) : + [φ₁]ₛ * [φ₂]ₛ = [φ₂]ₛ * [φ₁]ₛ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists φ₁ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists φ₂ + simp [h1, h2, mul_comm] + +lemma cScalar_comm_fermion (ϕ : ComplexScalarGenerator) (ψ : FermionicGenerator) : + [ϕ]ₛ * [ψ]ₑ = [ψ]ₑ * [ϕ]ₛ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists ϕ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ + simp [h1, h2, mul_comm] + +lemma cScalar_comm (V : EFTLagrangianExclDeriv) (ϕ : ComplexScalarGenerator) : + [ϕ]ₛ * V = V * [ϕ]ₛ := by + obtain ⟨x, h⟩ := ofFieldGenerators_cScalar_exists ϕ + induction V using TensorProduct.induction_on with + | zero => simp + | tmul a b => simp [h, mul_comm] + | add x y hx hy => simp [mul_add, add_mul, hx, hy] + +lemma fermion_comm_cScalar (ψ : FermionicGenerator) (ϕ : ComplexScalarGenerator) : + [ψ]ₑ * [ϕ]ₛ = [ϕ]ₛ * [ψ]ₑ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists ϕ + simp [h1, h2] + +lemma fermion_anticomm_fermion (ψ₁ ψ₂ : FermionicGenerator) : + [ψ₁]ₑ * [ψ₂]ₑ = - [ψ₂]ₑ * [ψ₁]ₑ := by + obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ + obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ + rw [h1, h2, ← TensorProduct.tmul_neg, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul] + congr 1 + rw [neg_mul, eq_neg_iff_add_eq_zero] + exact ExteriorAlgebra.ι_add_mul_swap x₁ x₂ + +@[simp] +lemma fermion_mul_self (ψ : FermionicGenerator) : [ψ]ₑ * [ψ]ₑ = 0 := by + obtain ⟨x, h⟩ := ofFieldGenerators_fermion_exists ψ + simp [h] + +lemma ofFieldGenerators_comm (ϕ₁ ϕ₂ : FieldGenerators) : + ∃ c : ℂ, [ϕ₁]ₐ * [ϕ₂]ₐ = c • [ϕ₂]ₐ * [ϕ₁]ₐ ∧ (c = 1 ∨ c = -1) := by + match ϕ₁, ϕ₂ with + | .cScalar φ₁, .cScalar φ₂ => exact ⟨1, by simp [cScalar_comm_cScalar]⟩ + | .cScalar _, .fermion ψ => exact ⟨1, by simp [cScalar_comm_fermion]⟩ + | .fermion ψ, .cScalar _ => exact ⟨1, by simp [fermion_comm_cScalar]⟩ + |.fermion ψ₁, .fermion ψ₂ => + exact ⟨-1, by rw [fermion_anticomm_fermion]; abel, by simp⟩ + +/-! + +## The lift of a map from the field generators to an algebra homomorphism + +-/ + +open scoped IsMulCommutative in +set_option maxRecDepth 2000 in +/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images `F g` of + the field generators: the images of the bosonic generators pairwise commute and + commute with the images of the fermionic generators, which pairwise anticommute. + The bosonic factor lifts through the commutative subalgebra generated by the + bosonic images. -/ +def lift {A : Type} [Ring A] [Algebra ℂ A] (F : FieldGenerators → A) + (hBB : ∀ g g', Commute (F (.cScalar g)) (F (.cScalar g'))) + (hBF : ∀ g g', Commute (F (.cScalar g)) (F (.fermion g'))) + (hFF : ∀ g g', F (.fermion g) * F (.fermion g') = - (F (.fermion g') * F (.fermion g))) : + EFTLagrangianExclDeriv →ₐ[ℂ] A := + let FB : ComplexScalarGenerator → A := fun g => F (.cScalar g) + let FF : FermionicGenerator → A := fun g => F (.fermion g) + have hFF : ∀ g g', FF g * FF g' = - (FF g' * FF g) := hFF + haveI : IsMulCommutative (Algebra.adjoin ℂ (Set.range FB)) := + Algebra.isMulCommutative_adjoin ℂ (by rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩; exact hBB g g') + let fS : ComplexScalarEFTExclDeriv →ₐ[ℂ] Algebra.adjoin ℂ (Set.range FB) := + SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ fun g => + ⟨FB g, Algebra.subset_adjoin ⟨g, rfl⟩⟩) + Algebra.TensorProduct.lift + ((Algebra.adjoin ℂ (Set.range FB)).val.comp fS) + (ExteriorAlgebra.lift ℂ + ⟨fermionicComponentBasis.constr ℂ FF, fun v => by + have hdiag : ∀ g, FF g * FF g = 0 := fun g => by + simpa [← two_smul ℂ] using eq_neg_iff_add_eq_zero.mp (hFF g g) + rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Fintype.sum_prod_type'] + exact Finset.sum_involution (fun p _ => (p.2, p.1)) + (fun p _ => by rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2]; module) + (fun p _ hf hswap => hf (by rw [show p.2 = p.1 from (Prod.ext_iff.mp hswap).1, + smul_mul_smul_comm, hdiag, smul_zero])) + (fun p _ => Finset.mem_univ _) (fun p _ => rfl)⟩) + (fun x y => by + refine (Algebra.commute_of_mem_adjoin_of_forall_mem_commute (fS x).2 ?_).symm + rintro _ ⟨g, rfl⟩ + induction y using ExteriorAlgebra.induction with + | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commutes r _ + | ι v => + rw [ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] + exact Commute.sum_left _ _ _ fun g' _ => (hBF g g').symm.smul_left _ + | mul u w hu hw => rw [map_mul]; exact hu.mul_left hw + | add u w hu hw => rw [map_add]; exact hu.add_left hw) + +/-! + +## The elements generated by lists of field generators + +-/ + +/-- The element of `EFTLagrangianExclDeriv` generated from a list of field generators. -/ +def termOfList (l : List FieldGenerators) : EFTLagrangianExclDeriv := + (l.map ofFieldGenerators).prod + +lemma termOfList_cons (ψ : FieldGenerators) (l : List FieldGenerators) : + termOfList (ψ :: l) = [ψ]ₐ * termOfList l := by simp [termOfList] + +lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] + +lemma termOfList_append (l1 l2 : List FieldGenerators) : + termOfList (l1 ++ l2) = termOfList l1 * termOfList l2 := by + simp [termOfList] + +lemma termOfList_perm {l1 l2 : List FieldGenerators} (h : l1.Perm l2) : + ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ (c = 1 ∨ c = -1) := by + induction h with + | nil => exact ⟨1, by simp⟩ + | cons x _ ih => + obtain ⟨c, hc1, hc2⟩ := ih + exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc1, mul_smul_comm], hc2⟩ + | swap x y l => + obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm y x + refine ⟨c, ?_⟩ + rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc] + simp [hc1, mul_assoc, smul_mul_assoc] + exact hc2 + | trans _ _ ih1 ih2 => + obtain ⟨c1, hc1, hc1'⟩ := ih1 + obtain ⟨c2, hc2, hc2'⟩ := ih2 + exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul], by grind⟩ + +lemma fermion_mul_termOfList_of_mem (ψ : FermionicGenerator) (l : List FieldGenerators) + (hψ : .fermion ψ ∈ l) : [ψ]ₑ * termOfList l = 0 := by + induction l with + | nil => simp at hψ + | cons β t ih => + rcases List.mem_cons.mp hψ with rfl | ha + · simp [termOfList_cons, ← mul_assoc] + · obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm (.fermion ψ) β + simp [termOfList_cons, ← mul_assoc, hc1] + simp [mul_assoc, ih ha] + +lemma termOfList_filter_isBoson_comm (l : List FieldGenerators) (V : EFTLagrangianExclDeriv) : + termOfList (l.filter FieldGenerators.IsBoson) * V = + V * termOfList (l.filter FieldGenerators.IsBoson) := by + induction l with + | nil => simp [termOfList] + | cons ψ t ih => + match ψ with + | .cScalar ϕ => + simp [termOfList_cons, cScalar_comm, mul_assoc] + simp [← mul_assoc, ih] + | .fermion ψ => simpa using ih + +lemma termOfList_eq_isBoson_mul_isFermion (l : List FieldGenerators) : + termOfList l = termOfList (l.filter FieldGenerators.IsBoson) * + termOfList (l.filter FieldGenerators.IsFermion) := by + induction l with + | nil => simp [termOfList] + | cons ψ t ih => + match ψ with + | .cScalar ϕ => simp [termOfList_cons, ih, mul_assoc] + | .fermion ψ => + simp [termOfList_cons, ih, ← mul_assoc, termOfList_filter_isBoson_comm] + simp [mul_assoc, termOfList_filter_isBoson_comm] + +lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} + (h : termOfList l1 = c • termOfList l2) : + termOfList l1.reverse = c • termOfList l2.reverse := by + let r : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := + TensorProduct.map LinearMap.id CliffordAlgebra.reverse + have hmul : ∀ x y : EFTLagrangianExclDeriv, r (x * y) = r y * r x := by + intro x y + induction x using TensorProduct.induction_on with + | zero => simp + | tmul a b => + induction y using TensorProduct.induction_on with + | zero => simp + | tmul a' b' => + simp [r, CliffordAlgebra.reverse.map_mul, mul_comm] + | add y₁ y₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] + | add x₁ x₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] + have hgen : ∀ ψ : FieldGenerators, r [ψ]ₐ = [ψ]ₐ := by + rintro (ϕ | ψ) <;> simp [r, ofFieldGenerators, CliffordAlgebra.reverse_ι] + have hf : ∀ l : List FieldGenerators, r (termOfList l) = termOfList l.reverse := by + intro l + induction l with + | nil => simp [r, termOfList_nil, Algebra.TensorProduct.one_def] + | cons ψ t ih => + rw [termOfList_cons, hmul, ih, hgen, List.reverse_cons, termOfList_append] + simp [termOfList] + rw [← hf, ← hf, h, map_smul] + +lemma termOfList_conjugate_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} + (h : termOfList l1 = c • termOfList l2) : + termOfList (l1.map FieldGenerators.conjugate) = + c • termOfList (l2.map FieldGenerators.conjugate) := by + -- Conjugation of generators induces an algebra endomorphism, acting on each + -- tensor factor by the basis permutation `g ↦ g.conjugate`. + let f : EFTLagrangianExclDeriv →ₐ[ℂ] EFTLagrangianExclDeriv := + Algebra.TensorProduct.map + (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ + complexScalarComponentBasis.constr ℂ fun g => complexScalarComponentBasis g.conjugate)) + (ExteriorAlgebra.map (fermionicComponentBasis.constr ℂ fun g => + fermionicComponentBasis g.conjugate)) + have hgen : ∀ g : FieldGenerators, f [g]ₐ = [g.conjugate]ₐ := by + rintro (g | g) <;> + simp [f, ofFieldGenerators, FieldGenerators.conjugate, ExteriorAlgebra.map_apply_ι] + have hf : ∀ l : List FieldGenerators, + f (termOfList l) = termOfList (l.map FieldGenerators.conjugate) := by + intro l + induction l with + | nil => simp [termOfList_nil] + | cons g t ih => rw [termOfList_cons, map_mul, ih, hgen, List.map_cons, termOfList_cons] + rw [← hf, ← hf, h, map_smul] + +/-- The elements of type `termOfList` span `EFTLagrangianExclDeriv`. -/ +lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : + V ∈ Submodule.span ℂ (Set.range termOfList) := by + have hmul_mem : ∀ x y : EFTLagrangianExclDeriv, + x ∈ Submodule.span ℂ (Set.range termOfList) → + y ∈ Submodule.span ℂ (Set.range termOfList) → + x * y ∈ Submodule.span ℂ (Set.range termOfList) := fun x y hx hy => by + have h := Submodule.mul_mem_mul hx hy + rw [Submodule.span_mul_span] at h + refine Submodule.span_mono ?_ h + rintro _ ⟨_, ⟨l1, rfl⟩, _, ⟨l2, rfl⟩, rfl⟩ + exact ⟨l1 ++ l2, termOfList_append l1 l2⟩ + have hgen : ∀ g : FieldGenerators, [g]ₐ ∈ Submodule.span ℂ (Set.range termOfList) := + fun g => Submodule.subset_span ⟨[g], by simp [termOfList]⟩ + induction V using TensorProduct.induction_on with + | zero => exact Submodule.zero_mem _ + | add x y hx hy => exact Submodule.add_mem _ hx hy + | tmul a b => + -- The bosonic factor: `a ⊗ₜ 1` lies in the span. + have h1 : (a ⊗ₜ[ℂ] 1 : EFTLagrangianExclDeriv) ∈ + Submodule.span ℂ (Set.range termOfList) := by + induction a using SymmetricAlgebra.induction with + | algebraMap c => + simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, + TensorProduct.smul_tmul'] using + Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) + | ι x => + rw [← Basis.sum_repr complexScalarComponentBasis x, map_sum, TensorProduct.sum_tmul] + refine Submodule.sum_mem _ fun i _ => ?_ + rw [map_smul, ← TensorProduct.smul_tmul'] + exact Submodule.smul_mem _ _ (hgen (.cScalar i)) + | mul a₁ a₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ + | add a₁ a₂ h₁ h₂ => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ h₁ h₂ + -- The fermionic factor: `1 ⊗ₜ b` lies in the span. + have h2 : (1 ⊗ₜ[ℂ] b : EFTLagrangianExclDeriv) ∈ + Submodule.span ℂ (Set.range termOfList) := by + induction b using ExteriorAlgebra.induction with + | algebraMap c => + simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, + TensorProduct.tmul_smul] using + Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) + | ι x => + rw [← Basis.sum_repr fermionicComponentBasis x, map_sum, TensorProduct.tmul_sum] + refine Submodule.sum_mem _ fun i _ => ?_ + rw [map_smul, TensorProduct.tmul_smul] + exact Submodule.smul_mem _ _ (hgen (.fermion i)) + | mul b₁ b₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ + | add b₁ b₂ h₁ h₂ => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ h₁ h₂ + simpa using hmul_mem _ _ h1 h2 + +end EFTLagrangianExclDeriv diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 246f2ed65..3389967a3 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -108,6 +108,17 @@ lemma val_smul (r : ℂ) (d : DownSinglet) : (r • d).val = r • d.val := rfl /-! +## The basis of the down-singlet space + +-/ + +/-- A basis on the down singlets. -/ +noncomputable def basis : Module.Basis (Fin 2 × Fin 3) ℂ DownSinglet := + (Fermion.RightHandedWeyl.basis.tensorProduct + (EuclideanSpace.basisFun (Fin 3) ℂ).toBasis).map valLinEquiv.symm + +/-! + ## C. Lorentz action The Lorentz group acts on the right-handed Weyl factor and leaves the colour index fixed. diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index 1c85c5e09..18fe44560 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -109,6 +109,17 @@ lemma val_smul (r : ℂ) (l : LeptonDoublet) : (r • l).val = r • l.val := rf /-! +## The basis of the lepton-doublet space + +-/ + +/-- A basis on the lepton doublets. -/ +noncomputable def basis : Module.Basis (Fin 2 × Fin 2) ℂ LeptonDoublet := + (Fermion.LeftHandedWeyl.basis.tensorProduct + (EuclideanSpace.basisFun (Fin 2) ℂ).toBasis).map valLinEquiv.symm + +/-! + ## C. Lorentz action The Lorentz group acts on the left-handed Weyl factor and leaves the weak index fixed. diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 85ccb50e6..af199e7a3 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -104,6 +104,16 @@ lemma val_smul (r : ℂ) (l : LeptonSinglet) : (r • l).val = r • l.val := rf /-! +## The basis of the charged-lepton-singlet space + +-/ + +/-- A basis on the charged-lepton singlets. -/ +noncomputable def basis : Module.Basis (Fin 2) ℂ LeptonSinglet := + Fermion.RightHandedWeyl.basis.map valLinEquiv.symm + +/-! + ## C. Lorentz action The Lorentz group acts through the right-handed Weyl representation, transported along the diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean index 953a4aefe..8fd55c0f9 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean @@ -27,10 +27,6 @@ namespace StandardModel open TensorProduct -TODO "Add other fermions similar to this file with the names: - - UpSinglet (3, 1)_{4} (right-handed) - - LeptonSinglet (1, 1)_{-6} (right-handed)" - /-- The vector space of a quark field in the Standard Model. These live in the (3, 2)_{1} representation of the gauge group. -/ @[ext] @@ -84,6 +80,20 @@ lemma val_add (q1 q2 : QuarkDoublet) : (q1 + q2).val = q1.val + q2.val := rfl @[simp] lemma val_smul (r : ℂ) (q : QuarkDoublet) : (r • q).val = r • q.val := rfl + +/-! + +## The basis of the quark doublet space + +-/ + +/-- A basis on the quark doublets. -/ +noncomputable def basis : Module.Basis (Fin 2 × Fin 3 × Fin 2) ℂ QuarkDoublet := + ((((Fermion.LeftHandedWeyl.basis.tensorProduct + (EuclideanSpace.basisFun (Fin 3) ℂ).toBasis).tensorProduct + (EuclideanSpace.basisFun (Fin 2) ℂ).toBasis).map valLinEquiv.symm).reindex + (Equiv.prodAssoc (Fin 2) (Fin 3) (Fin 2))) + /-! ## Lorentz group representation diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean index 8fe9c0071..387f33629 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean @@ -77,6 +77,17 @@ lemma val_smul (r : ℂ) (q : UpSinglet) : (r • q).val = r • q.val := rfl /-! +## The basis of the up-singlet space + +-/ + +/-- A basis on the up singlets. -/ +noncomputable def basis : Module.Basis (Fin 2 × Fin 3) ℂ UpSinglet := + (Fermion.RightHandedWeyl.basis.tensorProduct + (EuclideanSpace.basisFun (Fin 3) ℂ).toBasis).map valLinEquiv.symm + +/-! + ## Lorentz group representation -/ diff --git a/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean index 938ceecf2..acc4e92bd 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean @@ -194,9 +194,15 @@ TODO "Change the action of `GaugeGroupI` on `HiggsVec` to be a representation instance : SMulCommClass ℂ GaugeGroupI HiggsVec where smul_comm r g φ := by simp [gaugeGroupI_smul_eq, mulVec_smul, smul_comm r] +instance : SMulCommClass GaugeGroupI ℂ HiggsVec := + SMulCommClass.symm ℂ GaugeGroupI HiggsVec + instance : SMulCommClass ℝ GaugeGroupI HiggsVec where smul_comm r g φ := by simp [gaugeGroupI_smul_eq, mulVec_smul, smul_comm r] +def repGaugeGroupI : Representation ℂ GaugeGroupI HiggsVec := + Representation.ofDistribMulAction ℂ GaugeGroupI HiggsVec + /-! #### A.5.2. Unitary nature of the action diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean index bc15f2447..8ae907119 100644 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean @@ -489,7 +489,7 @@ def lift {A : Type} [Ring A] [Algebra ℂ A] (F : FieldGenerators → A) ⟨fermionicComponentBasis.constr ℂ FF, fun v => by have hdiag : ∀ g, FF g * FF g = 0 := fun g => by simpa [← two_smul ℂ] using eq_neg_iff_add_eq_zero.mp (hFF g g) - rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Finset.sum_product'] + rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Fintype.sum_prod_type'] exact Finset.sum_involution (fun p _ => (p.2, p.1)) (fun p _ => by rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2]; module) (fun p _ hf hswap => hf (by rw [show p.2 = p.1 from (Prod.ext_iff.mp hswap).1, @@ -607,8 +607,26 @@ lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} lemma termOfList_conjugate_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} (h : termOfList l1 = c • termOfList l2) : - termOfList (l1.map conjugate) = c • termOfList (l2.map conjugate) := by - sorry + termOfList (l1.map FieldGenerators.conjugate) = + c • termOfList (l2.map FieldGenerators.conjugate) := by + -- Conjugation of generators induces an algebra endomorphism, acting on each + -- tensor factor by the basis permutation `g ↦ g.conjugate`. + let f : EFTLagrangianExclDeriv →ₐ[ℂ] EFTLagrangianExclDeriv := + Algebra.TensorProduct.map + (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ + complexScalarComponentBasis.constr ℂ fun g => complexScalarComponentBasis g.conjugate)) + (ExteriorAlgebra.map (fermionicComponentBasis.constr ℂ fun g => + fermionicComponentBasis g.conjugate)) + have hgen : ∀ g : FieldGenerators, f [g]ₐ = [g.conjugate]ₐ := by + rintro (g | g) <;> + simp [f, ofFieldGenerators, FieldGenerators.conjugate, ExteriorAlgebra.map_apply_ι] + have hf : ∀ l : List FieldGenerators, + f (termOfList l) = termOfList (l.map FieldGenerators.conjugate) := by + intro l + induction l with + | nil => simp [termOfList_nil] + | cons g t ih => rw [termOfList_cons, map_mul, ih, hgen, List.map_cons, termOfList_cons] + rw [← hf, ← hf, h, map_smul] /-- The elements of type `termOfList` span `EFTLagrangianExclDeriv`. -/ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : From 8121959a9a8483314c1ad992f06a4dd0bc4c4213 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 10:02:53 +0100 Subject: [PATCH 055/254] feat: Add Invariance condition --- .../EFTLagrangianExclDeriv/Basic.lean | 257 +++++++++++++++--- .../EFTLagrangianExclDeriv/Basic.lean | 52 +++- 2 files changed, 263 insertions(+), 46 deletions(-) diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean index ce17b04e7..1fcd12e71 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -51,7 +51,7 @@ open Fermion /-! -## The input data for Fermions +## Specific block: The input data for Fermions For the Wess-Zumino theory there is a single left-handed Weyl fermion. @@ -138,7 +138,7 @@ def FermionIrrep.repGaugeGroupI : /-! -## Derived Fermionic quantities +## Repetable Derived Fermionic quantities This are quantities whose form is independent of the specific theory we are constructing. @@ -172,7 +172,26 @@ def fermionicGeneratorEquiv : FermionicGenerator ≃ abbrev FermionicTargetSpace := Π (φ : FermionIrrep), FermionIrrep.module φ -def FermionicTargetSpace.rep : Representation ℂ SL(2,ℂ) FermionicTargetSpace where +/-- The target space of the fermionic fields, including their conjugates. -/ +abbrev FermionicTargetSpaceWithComplex := FermionicTargetSpace × + ConjModule FermionicTargetSpace + + +abbrev FermionicComponentSpace := Module.Dual ℂ FermionicTargetSpaceWithComplex + +def fermionicComponentBasis : Basis FermionicGenerator ℂ FermionicComponentSpace := + ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod + ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm + +abbrev FermionicEFTExclDeriv := ExteriorAlgebra ℂ FermionicComponentSpace + +/-! + +### The representation of the Lorentz group on the fermionic part + +-/ + +def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicTargetSpace where toFun Λ := LinearMap.piMap fun φ => FermionIrrep.repLorentzGroup φ Λ map_one' := by ext x i y @@ -182,30 +201,48 @@ def FermionicTargetSpace.rep : Representation ℂ SL(2,ℂ) FermionicTargetSpace ext x i y simp -/-- The target space of the fermionic fields, including their conjugates. -/ -abbrev FermionicTargetSpaceWithComplex := FermionicTargetSpace × - ConjModule FermionicTargetSpace - -/-- The representation of the Lorentz group on the fermionic target space: - the irreps act componentwise on the product of their modules, and by the - conjugate action on the conjugate factor. -/ -def FermionicTargetSpaceWithComplex.rep : +def FermionicTargetSpaceWithComplex.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicTargetSpaceWithComplex := - (FermionicTargetSpace.rep).prod (FermionicTargetSpace.rep.conj) + FermionicTargetSpace.repLorentzGroup.prod (FermionicTargetSpace.repLorentzGroup.conj) -abbrev FermionicComponentSpace := Module.Dual ℂ FermionicTargetSpaceWithComplex +def FermionicComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicComponentSpace := + FermionicTargetSpaceWithComplex.repLorentzGroup.dual -def FermionicComponentSpace.rep : Representation ℂ SL(2,ℂ) FermionicComponentSpace := - (FermionicTargetSpaceWithComplex.rep).dual +def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicEFTExclDeriv where + toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] -def fermionicComponentBasis : Basis FermionicGenerator ℂ FermionicComponentSpace := - ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod - ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm +/-! -abbrev FermionicEFTExclDeriv := ExteriorAlgebra ℂ FermionicComponentSpace +### The representation of the Gauge group on the fermionic part -def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicEFTExclDeriv where - toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ)).toLinearMap +-/ + + +def FermionicTargetSpace.repGaugeGroupI : Representation ℂ GaugeGroupI FermionicTargetSpace where + toFun Λ := LinearMap.piMap fun φ => FermionIrrep.repGaugeGroupI φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp + +def FermionicTargetSpaceWithComplex.repGaugeGroupI : + Representation ℂ GaugeGroupI FermionicTargetSpaceWithComplex := + FermionicTargetSpace.repGaugeGroupI.prod (FermionicTargetSpace.repGaugeGroupI.conj) + +def FermionicComponentSpace.repGaugeGroupI : Representation ℂ GaugeGroupI FermionicComponentSpace := + FermionicTargetSpaceWithComplex.repGaugeGroupI.dual + +def FermionicEFTExclDeriv.repGaugeGroupI : Representation ℂ GaugeGroupI FermionicEFTExclDeriv where + toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroupI Λ)).toLinearMap map_one' := by simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, AlgHom.toLinearMap_id] @@ -214,6 +251,7 @@ def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) Fermion AlgHom.comp_toLinearMap] + /-! ## The input data for the complex scalar fields @@ -286,6 +324,27 @@ def complexScalarGeneratorEquiv : ComplexScalarGenerator ≃ abbrev ComplexScalarTargetSpace := Π (φ : ComplexScalarIrrep), ComplexScalarIrrep.module φ + +/-- The target space of the fermionic fields, including their conjugates. -/ +abbrev ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace × + ConjModule ComplexScalarTargetSpace + + +abbrev ComplexScalarComponentSpace := Module.Dual ℂ ComplexScalarTargetSpaceWithComplex + +def complexScalarComponentBasis : Basis ComplexScalarGenerator ℂ ComplexScalarComponentSpace := + ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod + ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm + +abbrev ComplexScalarEFTExclDeriv := SymmetricAlgebra ℂ ComplexScalarComponentSpace + + +/-! + +### The representation of the Lorentz group on the complex scalar part + +-/ + def ComplexScalarTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarTargetSpace where toFun Λ := LinearMap.piMap fun φ => ComplexScalarIrrep.repLorentzGroup φ Λ map_one' := by @@ -301,10 +360,6 @@ def ComplexScalarTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) Comp ext y simp -/-- The target space of the fermionic fields, including their conjugates. -/ -abbrev ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace × - ConjModule ComplexScalarTargetSpace - /-- The representation of the Lorentz group on the fermionic target space: the irreps act componentwise on the product of their modules, and by the conjugate action on the conjugate factor. -/ @@ -312,29 +367,75 @@ def ComplexScalarTargetSpaceWithComplex.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarTargetSpaceWithComplex := (ComplexScalarTargetSpace.repLorentzGroup).prod (ComplexScalarTargetSpace.repLorentzGroup.conj) -abbrev ComplexScalarComponentSpace := Module.Dual ℂ ComplexScalarTargetSpaceWithComplex - -def ComplexScalarComponentSpace.rep : Representation ℂ SL(2,ℂ) ComplexScalarComponentSpace := +def ComplexScalarComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarComponentSpace := (ComplexScalarTargetSpaceWithComplex.repLorentzGroup).dual -def complexScalarComponentBasis : Basis ComplexScalarGenerator ℂ ComplexScalarComponentSpace := - ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod - ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm - -abbrev ComplexScalarEFTExclDeriv := SymmetricAlgebra ℂ ComplexScalarComponentSpace - def ComplexScalarEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarEFTExclDeriv where toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)).toLinearMap + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)).toLinearMap map_one' := by simp [End.one_eq_id] map_mul' Λ1 Λ2 := by suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep (Λ1 * Λ2)) = + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup (Λ1 * Λ2)) = (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ1)).comp + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ1)).comp (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ2)) by + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ2)) by + rw [h]; rfl + ext v + simp + +/-! + +## The representation of the Gauge group on the complex scalar part + +-/ + +def ComplexScalarIrrep.repGaugeGroupI : + (φ : ComplexScalarIrrep) → Representation ℂ GaugeGroupI (ComplexScalarIrrep.module φ) + | .H => HiggsVec.repGaugeGroupI + +def ComplexScalarTargetSpace.repGaugeGroupI : + Representation ℂ GaugeGroupI ComplexScalarTargetSpace where + toFun g := LinearMap.piMap fun φ => ComplexScalarIrrep.repGaugeGroupI φ g + map_one' := by + ext1 x + apply LinearMap.ext + intro i + ext y + simp + map_mul' g1 g2 := by + ext1 x + apply LinearMap.ext + intro i + ext y + simp + +/-- The representation of the gauge group on the complex scalar target space: + the irreps act componentwise on the product of their modules, and by the + conjugate action on the conjugate factor. -/ +def ComplexScalarTargetSpaceWithComplex.repGaugeGroupI : + Representation ℂ GaugeGroupI ComplexScalarTargetSpaceWithComplex := + (ComplexScalarTargetSpace.repGaugeGroupI).prod (ComplexScalarTargetSpace.repGaugeGroupI.conj) + +def ComplexScalarComponentSpace.repGaugeGroupI : + Representation ℂ GaugeGroupI ComplexScalarComponentSpace := + (ComplexScalarTargetSpaceWithComplex.repGaugeGroupI).dual + +def ComplexScalarEFTExclDeriv.repGaugeGroupI : + Representation ℂ GaugeGroupI ComplexScalarEFTExclDeriv where + toFun g := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' g1 g2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI (g1 * g2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g2)) by rw [h]; rfl ext v simp @@ -414,17 +515,87 @@ namespace EFTLagrangianExclDeriv /-! -## The representation of the Lorentz group on the EFT lagrangian +## B. Invariance under the group actions + +-/ +/-! + +### B.1 The representation of the Lorentz group on the EFT lagrangian -/ /-- The representation of the Lorentz group on `EFTLagrangianExclDeriv`. -/ -def rep : Representation ℂ SL(2,ℂ) EFTLagrangianExclDeriv := +def repLorentzGroup : Representation ℂ SL(2,ℂ) EFTLagrangianExclDeriv := (ComplexScalarEFTExclDeriv.repLorentzGroup).tprod (FermionicEFTExclDeriv.repLorentzGroup) -lemma rep_mul (Λ : SL(2,ℂ)) (V W : EFTLagrangianExclDeriv) : - rep Λ (V * W) = rep Λ V * rep Λ W := by - sorry +lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : EFTLagrangianExclDeriv) : + repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := + map_mul (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) + (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) V W + +@[simp] +lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ 1 = 1 := + map_one (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) + (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) + +/-! + +### B.2 The representation of the gauge group on the EFT lagrangian + +-/ + +/-- The representation of the gauge group on `EFTLagrangianExclDeriv`. -/ +def repGaugeGroupI : Representation ℂ GaugeGroupI EFTLagrangianExclDeriv := + (ComplexScalarEFTExclDeriv.repGaugeGroupI).tprod (FermionicEFTExclDeriv.repGaugeGroupI) + +lemma repGaugeGroupI_mul (g : GaugeGroupI) (V W : EFTLagrangianExclDeriv) : + repGaugeGroupI g (V * W) = repGaugeGroupI g V * repGaugeGroupI g W := + map_mul (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g)) + (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroupI g))) V W + +@[simp] +lemma repGaugeGroupI_one (g : GaugeGroupI) : + repGaugeGroupI g 1 = 1 := + map_one (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g)) + (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroupI g))) + +/-! + +### B.3. The condition for invariance + +-/ + +def IsInvariant (V : EFTLagrangianExclDeriv) : Prop := + (∀ (Λ : SL(2,ℂ)), repLorentzGroup Λ V = V) ∧ ∀ (g : GaugeGroupI), repGaugeGroupI g V = V + +@[simp] +lemma IsInvariant.zero : IsInvariant 0 := by + simp [IsInvariant] + +lemma IsInvariant.add {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V + W) := by + simp_all [IsInvariant] + +lemma IsInvariant.smul {V : EFTLagrangianExclDeriv} (c : ℂ) (hV : IsInvariant V) : + IsInvariant (c • V) := by + simp_all [IsInvariant] + +lemma IsInvariant.mul {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V * W) := by + simp_all [IsInvariant, repLorentzGroup_mul, repGaugeGroupI_mul] + +@[simp] +lemma IsInvariant.one : IsInvariant 1 := by + simp [IsInvariant] /-! diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean index 8ae907119..0db9aaf7b 100644 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean @@ -370,7 +370,13 @@ namespace EFTLagrangianExclDeriv /-! -## The representation of the Lorentz group on the EFT lagrangian +## B. Invariance under the group actions + +-/ + +/-! + +### B.1. The representation of the Lorentz group -/ @@ -379,8 +385,48 @@ def rep : Representation ℂ SL(2,ℂ) EFTLagrangianExclDeriv := (ComplexScalarEFTExclDeriv.rep).tprod (FermionicEFTExclDeriv.rep) lemma rep_mul (Λ : SL(2,ℂ)) (V W : EFTLagrangianExclDeriv) : - rep Λ (V * W) = rep Λ V * rep Λ W := by - sorry + rep Λ (V * W) = rep Λ V * rep Λ W := + map_mul (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)) + (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ))) V W + +@[simp] +lemma rep_one (Λ : SL(2,ℂ)) : + rep Λ 1 = 1 := + map_one (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)) + (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ))) + +/-! + +### B.2. The condition for invariance + +-/ + +def IsInvariant (V : EFTLagrangianExclDeriv) : Prop := + (∀ (Λ : SL(2,ℂ)), rep Λ V = V) + +@[simp] +lemma IsInvariant.zero : IsInvariant 0 := by + simp [IsInvariant] + +lemma IsInvariant.add {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V + W) := by + simp_all [IsInvariant] + +lemma IsInvariant.smul {V : EFTLagrangianExclDeriv} (c : ℂ) (hV : IsInvariant V) : + IsInvariant (c • V) := by + simp_all [IsInvariant] + +lemma IsInvariant.mul {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : + IsInvariant (V * W) := by + simp_all [IsInvariant, rep_mul] + +@[simp] +lemma IsInvariant.one : IsInvariant 1 := by + simp [IsInvariant] /-! From 5a1b5a7033df9e17fe3e4b4d5a58b8dbf56a022b Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 10:22:34 +0100 Subject: [PATCH 056/254] Yukawa term test --- .../EFTLagrangianExclDeriv/YukawaTerms.lean | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean new file mode 100644 index 000000000..dc72f855c --- /dev/null +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.EFTLagrangianExclDeriv.Basic +/-! + +# The Yukawa terms in the EFT lagrangian + +-/ + +@[expose] public section + +namespace StandardModel +namespace EFTLagrangianExclDeriv +noncomputable section + +open Module Matrix +open MatrixGroups +open Complex +open TensorProduct +open CategoryTheory.MonoidalCategory +open Fermion + +def yukawaTermLeH : EFTLagrangianExclDeriv := sorry + +lemma yukawaTermLeH_invariant : IsInvariant yukawaTermLeH := by + sorry + +end From 02a8e0c0c65ff1b72fd1913b888ab61804498c3a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 11:01:28 +0100 Subject: [PATCH 057/254] feat: Claude Fable (High) Yukawa term Prompt: Fill in both these sorries. That is, write down the Yukawa term involving L e and H using the notation defined for the EFTLagrangianExclDeriv and proof that it is invariant under both the Lorentz group and the SM gauge group. Co-Authored-By: Claude --- .../EFTLagrangianExclDeriv/YukawaTerms.lean | 406 +++++++++++++++++- 1 file changed, 402 insertions(+), 4 deletions(-) diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean index dc72f855c..6b71de5a6 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean @@ -15,7 +15,6 @@ public import Physlib.Particles.StandardModel.EFTLagrangianExclDeriv.Basic @[expose] public section namespace StandardModel -namespace EFTLagrangianExclDeriv noncomputable section open Module Matrix @@ -25,9 +24,408 @@ open TensorProduct open CategoryTheory.MonoidalCategory open Fermion -def yukawaTermLeH : EFTLagrangianExclDeriv := sorry +/-! + +## The action of the representations on the basis of the target spaces + +-/ + +namespace LeptonDoublet + +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (α a : Fin 2) : + repLorentzGroup Λ (basis (α, a)) = ∑ β, Λ.1 β α • basis (β, a) := by + simp only [basis, Basis.map_apply, Basis.tensorProduct_apply, repLorentzGroup, + MonoidHom.coe_mk, OneHom.coe_mk, LinearMap.coe_comp, LinearEquiv.coe_coe, + Function.comp_apply, LinearEquiv.apply_symm_apply, TensorProduct.map_tmul, + Fermion.LeftHandedWeyl.rep_apply_basis, Representation.trivial_apply, + TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] + +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (α a : Fin 2) : + repGaugeGroupI g (basis (α, a)) = + ∑ b, (star (g.toU1.1 : ℂ) ^ 3 * g.toSU2.1 b a) • basis (α, b) := by + have h := repGaugeGroupI_tmul_basis_eq_sum g α a + simpa [basis, Basis.map_apply, Basis.tensorProduct_apply, valLinEquiv_symm_apply, + EuclideanSpace.basisFun_apply] using h + +end LeptonDoublet + +namespace LeptonSinglet + +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (basis α) = ∑ β, star (Λ.1 β α) • basis β := by + simp only [basis, Basis.map_apply, repLorentzGroup, MonoidHom.coe_mk, OneHom.coe_mk, + LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, LinearEquiv.apply_symm_apply, + Fermion.RightHandedWeyl.rep_apply_basis, Matrix.map_apply, map_sum, map_smul] + +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (α : Fin 2) : + repGaugeGroupI g (basis α) = (star (g.toU1.1 : ℂ) ^ 6) • basis α := by + simpa [basis, Basis.map_apply, valLinEquiv_symm_apply] using repGaugeGroupI_basis g α + +end LeptonSinglet + +namespace HiggsVec + +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (a : Fin 2) : + repGaugeGroupI g (orthonormBasis.toBasis a) = + ∑ b, ((g.toU1.1 : ℂ) ^ 3 * g.toSU2.1 b a) • orthonormBasis.toBasis b := by + ext c + simp [repGaugeGroupI, gaugeGroupI_smul_eq, orthonormBasis, EuclideanSpace.basisFun_apply, + PiLp.ofLp_single, Submonoid.smul_def, Fin.sum_univ_two, mul_comm] + fin_cases c <;> simp + +end HiggsVec + +/-! + +## The action of the representations on the fermionic component space + +-/ + +lemma FermionicComponentSpace.repLorentzGroup_apply_basis_of (Λ : SL(2,ℂ)) + (φ : FermionIrrep) (α : FermionIrrep.components φ) : + FermionicComponentSpace.repLorentzGroup Λ (fermionicComponentBasis (.of φ α)) = + ∑ β : FermionIrrep.components φ, + ((FermionIrrep.basis φ).repr (FermionIrrep.repLorentzGroup φ Λ⁻¹ + (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.of φ β) := by + refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod + ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ + obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w + · simp only [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] + simp + by_cases h : φ' = φ + · subst h + simp [Finsupp.single_apply, Sigma.mk.injEq] + · simp [Sigma.mk.injEq, h] + · simp [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] + +lemma FermionicComponentSpace.repLorentzGroup_apply_basis_bar (Λ : SL(2,ℂ)) + (φ : FermionIrrep) (α : FermionIrrep.components φ) : + FermionicComponentSpace.repLorentzGroup Λ (fermionicComponentBasis (.bar φ α)) = + ∑ β : FermionIrrep.components φ, + star ((FermionIrrep.basis φ).repr (FermionIrrep.repLorentzGroup φ Λ⁻¹ + (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.bar φ β) := by + refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod + ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ + obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w + · simp [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] + · simp only [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] + simp [Representation.conj_apply] + by_cases h : φ' = φ + · subst h + simp [Finsupp.single_apply, Sigma.mk.injEq] + · simp [Sigma.mk.injEq, h] + +lemma FermionicComponentSpace.repGaugeGroupI_apply_basis_of (g : GaugeGroupI) + (φ : FermionIrrep) (α : FermionIrrep.components φ) : + FermionicComponentSpace.repGaugeGroupI g (fermionicComponentBasis (.of φ α)) = + ∑ β : FermionIrrep.components φ, + ((FermionIrrep.basis φ).repr (FermionIrrep.repGaugeGroupI φ g⁻¹ + (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.of φ β) := by + refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod + ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ + obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w + · simp only [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] + simp + by_cases h : φ' = φ + · subst h + simp [Finsupp.single_apply, Sigma.mk.injEq] + · simp [Sigma.mk.injEq, h] + · simp [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] + +lemma FermionicComponentSpace.repGaugeGroupI_apply_basis_bar (g : GaugeGroupI) + (φ : FermionIrrep) (α : FermionIrrep.components φ) : + FermionicComponentSpace.repGaugeGroupI g (fermionicComponentBasis (.bar φ α)) = + ∑ β : FermionIrrep.components φ, + star ((FermionIrrep.basis φ).repr (FermionIrrep.repGaugeGroupI φ g⁻¹ + (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.bar φ β) := by + refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod + ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ + obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w + · simp [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] + · simp only [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, + Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, + fermionicGeneratorEquiv, Basis.prod_apply, + FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] + simp [Representation.conj_apply] + by_cases h : φ' = φ + · subst h + simp [Finsupp.single_apply, Sigma.mk.injEq] + · simp [Sigma.mk.injEq, h] + +/-! + +## The action of the representations on the complex scalar component space + +-/ + +lemma ComplexScalarComponentSpace.repLorentzGroup_apply (Λ : SL(2,ℂ)) + (v : ComplexScalarComponentSpace) : + ComplexScalarComponentSpace.repLorentzGroup Λ v = v := by + have h1 : ∀ w : ComplexScalarTargetSpaceWithComplex, + ComplexScalarTargetSpaceWithComplex.repLorentzGroup Λ⁻¹ w = w := by + intro w + apply Prod.ext + · funext φ + simp [ComplexScalarTargetSpaceWithComplex.repLorentzGroup, + ComplexScalarTargetSpace.repLorentzGroup] + cases φ + simp [ComplexScalarIrrep.repLorentzGroup] + rfl + · funext φ + simp [ComplexScalarTargetSpaceWithComplex.repLorentzGroup, + ComplexScalarTargetSpace.repLorentzGroup, Representation.conj_apply] + cases φ + simp [ComplexScalarIrrep.repLorentzGroup, conjEquiv] + rfl + refine LinearMap.ext fun w => ?_ + simp [ComplexScalarComponentSpace.repLorentzGroup, Representation.dual_apply, + Module.Dual.transpose_apply, h1] + +lemma ComplexScalarComponentSpace.repGaugeGroupI_apply_basis_of (g : GaugeGroupI) + (φ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components φ) : + ComplexScalarComponentSpace.repGaugeGroupI g (complexScalarComponentBasis (.of φ α)) = + ∑ β : ComplexScalarIrrep.components φ, + ((ComplexScalarIrrep.basis φ).repr (ComplexScalarIrrep.repGaugeGroupI φ g⁻¹ + (ComplexScalarIrrep.basis φ β)) α) • complexScalarComponentBasis (.of φ β) := by + refine ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod + ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).ext fun w => ?_ + obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w + · simp only [ComplexScalarComponentSpace.repGaugeGroupI, Representation.dual_apply, + Module.Dual.transpose_apply, complexScalarComponentBasis, Basis.reindex_apply, + complexScalarGeneratorEquiv, Basis.prod_apply, + ComplexScalarTargetSpaceWithComplex.repGaugeGroupI, + ComplexScalarTargetSpace.repGaugeGroupI] + simp + by_cases h : φ' = φ + · subst h + simp [Finsupp.single_apply, Sigma.mk.injEq] + · simp [Finsupp.single_apply, Sigma.mk.injEq] + · simp [ComplexScalarComponentSpace.repGaugeGroupI, Representation.dual_apply, + Module.Dual.transpose_apply, complexScalarComponentBasis, Basis.reindex_apply, + complexScalarGeneratorEquiv, Basis.prod_apply, + ComplexScalarTargetSpaceWithComplex.repGaugeGroupI, + ComplexScalarTargetSpace.repGaugeGroupI] + +namespace EFTLagrangianExclDeriv + +/-! + +## The action of the representations on the field generators + +-/ + +lemma repLorentzGroup_apply_fermion (Λ : SL(2,ℂ)) (ψ : FermionicGenerator) : + repLorentzGroup Λ [ψ]ₑ = 1 ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ + (FermionicComponentSpace.repLorentzGroup Λ (fermionicComponentBasis ψ)) := by + simp [repLorentzGroup, Representation.tprod_apply, ofFieldGenerators, + FermionicEFTExclDeriv.repLorentzGroup, ComplexScalarEFTExclDeriv.repLorentzGroup, + ExteriorAlgebra.map_apply_ι] + +lemma repGaugeGroupI_apply_fermion (g : GaugeGroupI) (ψ : FermionicGenerator) : + repGaugeGroupI g [ψ]ₑ = 1 ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ + (FermionicComponentSpace.repGaugeGroupI g (fermionicComponentBasis ψ)) := by + simp [repGaugeGroupI, Representation.tprod_apply, ofFieldGenerators, + FermionicEFTExclDeriv.repGaugeGroupI, ComplexScalarEFTExclDeriv.repGaugeGroupI, + ExteriorAlgebra.map_apply_ι] + +lemma repLorentzGroup_apply_cScalar (Λ : SL(2,ℂ)) (ϕ : ComplexScalarGenerator) : + repLorentzGroup Λ [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ + (ComplexScalarComponentSpace.repLorentzGroup Λ (complexScalarComponentBasis ϕ)) ⊗ₜ[ℂ] 1 := by + simp [repLorentzGroup, Representation.tprod_apply, ofFieldGenerators, + FermionicEFTExclDeriv.repLorentzGroup, ComplexScalarEFTExclDeriv.repLorentzGroup] + +lemma repGaugeGroupI_apply_cScalar (g : GaugeGroupI) (ϕ : ComplexScalarGenerator) : + repGaugeGroupI g [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ + (ComplexScalarComponentSpace.repGaugeGroupI g (complexScalarComponentBasis ϕ)) ⊗ₜ[ℂ] 1 := by + simp [repGaugeGroupI, Representation.tprod_apply, ofFieldGenerators, + FermionicEFTExclDeriv.repGaugeGroupI, ComplexScalarEFTExclDeriv.repGaugeGroupI] + +/-! + +## The action of the representations on the generators appearing in the +## `L`, `e`, `H` Yukawa term + +-/ + +lemma repLorentzGroup_apply_bar_L (Λ : SL(2,ℂ)) (i : Fin 3) (α a : Fin 2) : + repLorentzGroup Λ [FermionicGenerator.bar (.L i) (α, a)]ₑ = + ∑ β, star (Λ⁻¹.1 α β) • [FermionicGenerator.bar (.L i) (β, a)]ₑ := by + rw [repLorentzGroup_apply_fermion, FermionicComponentSpace.repLorentzGroup_apply_basis_bar] + show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) + (∑ β : Fin 2 × Fin 2, + star ((LeptonDoublet.basis.repr ((LeptonDoublet.repLorentzGroup Λ⁻¹) + (LeptonDoublet.basis β))) (α, a)) • + fermionicComponentBasis (FermionicGenerator.bar (FermionIrrep.L i) β)) = _ + rw [Fintype.sum_prod_type] + simp [LeptonDoublet.repLorentzGroup_apply_basis, Basis.repr_self, Finsupp.single_apply, + Prod.mk.injEq, ofFieldGenerators] + fin_cases α <;> fin_cases a <;> + simp [TensorProduct.tmul_add, TensorProduct.tmul_smul] + +lemma repLorentzGroup_apply_of_e (Λ : SL(2,ℂ)) (j : Fin 3) (α : Fin 2) : + repLorentzGroup Λ [FermionicGenerator.of (.e j) α]ₑ = + ∑ β, star (Λ⁻¹.1 α β) • [FermionicGenerator.of (.e j) β]ₑ := by + rw [repLorentzGroup_apply_fermion, FermionicComponentSpace.repLorentzGroup_apply_basis_of] + show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) + (∑ β : Fin 2, + ((LeptonSinglet.basis.repr ((LeptonSinglet.repLorentzGroup Λ⁻¹) + (LeptonSinglet.basis β))) α) • + fermionicComponentBasis (FermionicGenerator.of (FermionIrrep.e j) β)) = _ + simp [LeptonSinglet.repLorentzGroup_apply_basis, Basis.repr_self, Finsupp.single_apply, + ofFieldGenerators] + fin_cases α <;> simp [TensorProduct.tmul_add, TensorProduct.tmul_smul] + +lemma repLorentzGroup_apply_of_H (Λ : SL(2,ℂ)) (a : Fin 2) : + repLorentzGroup Λ [ComplexScalarGenerator.of .H a]ₛ = [ComplexScalarGenerator.of .H a]ₛ := by + rw [repLorentzGroup_apply_cScalar, ComplexScalarComponentSpace.repLorentzGroup_apply] + rfl + +lemma repGaugeGroupI_apply_bar_L (g : GaugeGroupI) (i : Fin 3) (α a : Fin 2) : + repGaugeGroupI g [FermionicGenerator.bar (.L i) (α, a)]ₑ = + ∑ b, (star (g.toU1.1 : ℂ) ^ 3 * g.toSU2.1 b a) • [FermionicGenerator.bar (.L i) (α, b)]ₑ := by + rw [repGaugeGroupI_apply_fermion, FermionicComponentSpace.repGaugeGroupI_apply_basis_bar] + show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) + (∑ β : Fin 2 × Fin 2, + star ((LeptonDoublet.basis.repr ((LeptonDoublet.repGaugeGroupI g⁻¹) + (LeptonDoublet.basis β))) (α, a)) • + fermionicComponentBasis (FermionicGenerator.bar (FermionIrrep.L i) β)) = _ + rw [Fintype.sum_prod_type] + simp [LeptonDoublet.repGaugeGroupI_apply_basis, Basis.repr_self, Finsupp.single_apply, + Prod.mk.injEq, ofFieldGenerators, map_inv, ← Unitary.star_eq_inv, ← Matrix.star_eq_inv, + Matrix.star_apply] + fin_cases α <;> fin_cases a <;> + simp [TensorProduct.tmul_add, TensorProduct.tmul_smul] + +lemma repGaugeGroupI_apply_of_e (g : GaugeGroupI) (j : Fin 3) (α : Fin 2) : + repGaugeGroupI g [FermionicGenerator.of (.e j) α]ₑ = + ((g.toU1.1 : ℂ) ^ 6) • [FermionicGenerator.of (.e j) α]ₑ := by + rw [repGaugeGroupI_apply_fermion, FermionicComponentSpace.repGaugeGroupI_apply_basis_of] + show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) + (∑ β : Fin 2, + ((LeptonSinglet.basis.repr ((LeptonSinglet.repGaugeGroupI g⁻¹) + (LeptonSinglet.basis β))) α) • + fermionicComponentBasis (FermionicGenerator.of (FermionIrrep.e j) β)) = _ + simp [LeptonSinglet.repGaugeGroupI_apply_basis, Basis.repr_self, Finsupp.single_apply, + ofFieldGenerators, map_inv, ← Unitary.star_eq_inv, TensorProduct.tmul_smul] + +lemma repGaugeGroupI_apply_of_H (g : GaugeGroupI) (a : Fin 2) : + repGaugeGroupI g [ComplexScalarGenerator.of .H a]ₛ = + ∑ b, (star (g.toU1.1 : ℂ) ^ 3 * star (g.toSU2.1 b a)) • [ComplexScalarGenerator.of .H b]ₛ := by + rw [repGaugeGroupI_apply_cScalar, ComplexScalarComponentSpace.repGaugeGroupI_apply_basis_of] + show (SymmetricAlgebra.ι ℂ _) + (∑ β : Fin 2, + ((HiggsVec.orthonormBasis.toBasis.repr ((HiggsVec.repGaugeGroupI g⁻¹) + (HiggsVec.orthonormBasis.toBasis β))) a) • + complexScalarComponentBasis (ComplexScalarGenerator.of ComplexScalarIrrep.H β)) + ⊗ₜ[ℂ] 1 = _ + simp only [HiggsVec.repGaugeGroupI_apply_basis, map_sum, map_smul, Finsupp.coe_finsetSum, + Finset.sum_apply, Finsupp.coe_smul, Pi.smul_apply, Basis.repr_self, smul_eq_mul, + Finsupp.single_apply] + simp [map_inv, ← Unitary.star_eq_inv, ← Matrix.star_eq_inv, Matrix.star_apply, + mul_ite, Finset.sum_ite_eq', ofFieldGenerators] + fin_cases a <;> simp [TensorProduct.add_tmul, ← TensorProduct.smul_tmul'] + +/-! + +## The Yukawa term for the lepton doublet, lepton singlet and Higgs field + +-/ + +/-- The Yukawa term coupling the lepton doublet `L i`, the charged lepton + singlet `e j` and the Higgs field: `ε^{α β} (bar L i)_{α a} (e j)_β H_a`, + with the Lorentz indices of `bar L` and `e` contracted with the Weyl metric + and the weak isospin indices of `bar L` and `H` contracted directly. -/ +def yukawaTermLeH (i j : Fin 3) : EFTLagrangianExclDeriv := + ∑ α, ∑ β, ∑ a, metricRaw α β • + ([FermionicGenerator.bar (.L i) (α, a)]ₑ * [FermionicGenerator.of (.e j) β]ₑ * + [ComplexScalarGenerator.of .H a]ₛ) + +lemma yukawaTermLeH_invariant (i j : Fin 3) : IsInvariant (yukawaTermLeH i j) := by + constructor + · intro Λ + have hdet : (starRingEnd ℂ) ((Λ⁻¹).1 0 0) * (starRingEnd ℂ) ((Λ⁻¹).1 1 1) - + (starRingEnd ℂ) ((Λ⁻¹).1 0 1) * (starRingEnd ℂ) ((Λ⁻¹).1 1 0) = 1 := by + have h : ((Λ⁻¹).1).det = 1 := Matrix.SpecialLinearGroup.det_coe Λ⁻¹ + rw [Matrix.det_fin_two] at h + simpa using congrArg (starRingEnd ℂ) h + simp only [yukawaTermLeH, metricRaw, Fin.isValue, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.empty_val', Matrix.cons_val_fin_one, + zero_smul, one_smul, zero_add, add_zero, map_add, map_smul, + repLorentzGroup_mul, repLorentzGroup_apply_bar_L, repLorentzGroup_apply_of_e, + repLorentzGroup_apply_of_H, Fin.sum_univ_two, add_mul, mul_add, smul_mul_assoc, + mul_smul_comm, RCLike.star_def] + match_scalars + all_goals first + | linear_combination hdet + | linear_combination -hdet + | linear_combination (2 : ℂ) * hdet + | linear_combination -(2 : ℂ) * hdet + | ring + · intro g + have hz6 : (g.toU1.1 : ℂ) ^ 6 * (starRingEnd ℂ) (g.toU1.1 : ℂ) ^ 6 = 1 := by + have hz : (g.toU1.1 : ℂ) * star (g.toU1.1 : ℂ) = 1 := (Unitary.mem_iff.mp g.toU1.2).2 + calc (g.toU1.1 : ℂ) ^ 6 * (starRingEnd ℂ) (g.toU1.1 : ℂ) ^ 6 + = ((g.toU1.1 : ℂ) * star (g.toU1.1 : ℂ)) ^ 6 := by rw [RCLike.star_def]; ring + _ = 1 := by rw [hz]; norm_num + have hE : ∀ b b' : Fin 2, + g.toSU2.1 b 0 * (starRingEnd ℂ) (g.toSU2.1 b' 0) + + g.toSU2.1 b 1 * (starRingEnd ℂ) (g.toSU2.1 b' 1) = if b = b' then 1 else 0 := by + intro b b' + have hh := Matrix.mem_unitaryGroup_iff.mp g.toSU2.2.1 + have h2 := congrArg (fun M : Matrix (Fin 2) (Fin 2) ℂ => M b b') hh + simpa [Matrix.mul_apply, Matrix.star_apply, Matrix.one_apply, Fin.sum_univ_two, + RCLike.star_def] using h2 + have hK : ∀ b b' : Fin 2, + (g.toU1.1 : ℂ) ^ 6 * (starRingEnd ℂ) (g.toU1.1 : ℂ) ^ 6 * + (g.toSU2.1 b 0 * (starRingEnd ℂ) (g.toSU2.1 b' 0) + + g.toSU2.1 b 1 * (starRingEnd ℂ) (g.toSU2.1 b' 1)) = if b = b' then 1 else 0 := by + intro b b' + rw [hz6, one_mul, hE] + have hK00 := hK 0 0 + have hK01 := hK 0 1 + have hK10 := hK 1 0 + have hK11 := hK 1 1 + rw [if_pos rfl] at hK00 hK11 + rw [if_neg (by decide)] at hK01 + rw [if_neg (by decide)] at hK10 + simp only [yukawaTermLeH, metricRaw, Fin.isValue, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.empty_val', Matrix.cons_val_fin_one, + zero_smul, one_smul, zero_add, add_zero, map_add, map_smul, + repGaugeGroupI_mul, repGaugeGroupI_apply_bar_L, repGaugeGroupI_apply_of_e, + repGaugeGroupI_apply_of_H, Fin.sum_univ_two, add_mul, mul_add, smul_mul_assoc, + mul_smul_comm, smul_smul, RCLike.star_def] + match_scalars + · linear_combination hK00 + · linear_combination hK10 + · linear_combination hK01 + · linear_combination hK11 + · linear_combination -hK00 + · linear_combination -hK10 + · linear_combination -hK01 + · linear_combination -hK11 -lemma yukawaTermLeH_invariant : IsInvariant yukawaTermLeH := by - sorry +end EFTLagrangianExclDeriv end +end StandardModel From c4c5e95eedb4fe0d914ad10421d443a94a78a9a1 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 11:11:56 +0100 Subject: [PATCH 058/254] feat: Set up exclusivity lemma --- .../EFTLagrangianExclDeriv/Basic.lean | 19 +++++++++++++++++++ .../EFTLagrangianExclDeriv/YukawaTerms.lean | 9 +++++++++ 2 files changed, 28 insertions(+) diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean index 1fcd12e71..5ade6b1ee 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -495,6 +495,25 @@ lemma FieldGenerators.cScalar_isBoson (ϕ : ComplexScalarGenerator) : lemma FieldGenerators.fermion_isBoson (ϕ : FermionicGenerator) : (fermion ϕ).IsBoson = False := by simp [IsBoson] + +/-! + +## Irreps + +-/ + +inductive Irrep + | cScalar (_ : ComplexScalarIrrep) : Irrep + | barCScalar (_ : ComplexScalarIrrep) : Irrep + | fermion (_ : FermionIrrep) : Irrep + | barFermion (_ : FermionIrrep) : Irrep + +def FieldGenerators.toIrrep : FieldGenerators → Irrep + | .cScalar (.of φ _) => .cScalar φ + | .cScalar (.bar φ _) => .barCScalar φ + | .fermion (.of φ _) => .fermion φ + | .fermion (.bar φ _) => .barFermion φ + /-! ## A. The EFT lagrangian without derivatives diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean index 6b71de5a6..d178fe9f7 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean @@ -425,6 +425,15 @@ lemma yukawaTermLeH_invariant (i j : Fin 3) : IsInvariant (yukawaTermLeH i j) := · linear_combination -hK01 · linear_combination -hK11 +def LEHSubModule (i j : Fin 3) : Submodule ℂ EFTLagrangianExclDeriv := + Submodule.span ℂ (termOfList '' {l | (Multiset.ofList l).map FieldGenerators.toIrrep = + [Irrep.barFermion (FermionIrrep.L i), Irrep.fermion (FermionIrrep.e j), + Irrep.cScalar ComplexScalarIrrep.H]}) + +lemma yukawaTermLeH_exclusive (i j : Fin 3) + (V : EFTLagrangianExclDeriv) (hV : V ∈ LEHSubModule i j) + (hI : IsInvariant V) : ∃ (c : ℂ), V = c • yukawaTermLeH i j := by + sorry end EFTLagrangianExclDeriv end From 8a6e832b6f12adf9f1bd3bb7c2845dc7b1dbd969 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 11:42:31 +0100 Subject: [PATCH 059/254] feat: Add exclusivity of the Yukawa for L e and H. Prompt: (Claude Fable (thinking (High))) Show that `yukawaTermLeH i j` is exclusively the only term in `LEHSubModule` (up to scaling) which is invariant under the group action. I.e. fill out the sorry. Only modify this one file. Co-Authored-By: Claude --- .../EFTLagrangianExclDeriv/YukawaTerms.lean | 378 +++++++++++++++++- 1 file changed, 377 insertions(+), 1 deletion(-) diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean index d178fe9f7..ecfd6ed8b 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean @@ -425,15 +425,391 @@ lemma yukawaTermLeH_invariant (i j : Fin 3) : IsInvariant (yukawaTermLeH i j) := · linear_combination -hK01 · linear_combination -hK11 +/-! + +## Exclusivity of the `L`, `e`, `H` Yukawa term + +The submodule of the EFT lagrangian spanned by the terms with irrep content +`{bar L i, e j, H}` is spanned by the sixteen monomials +`[bar L i (α, a)]ₑ * [e j β]ₑ * [H c]ₛ`. We construct linear functionals +extracting the coefficient of each monomial, and use invariance under specific +group elements to show that any invariant element of this submodule is +proportional to `yukawaTermLeH`. + +-/ + +/-- The index of a monomial in the `L`, `e`, `H` sector: the components + `(α, a)` of `bar L`, `β` of `e` and `c` of `H`. -/ +abbrev LEHIndex : Type := (Fin 2 × Fin 2) × Fin 2 × Fin 2 + +/-- The monomial `[bar L i (α, a)]ₑ * [e j β]ₑ * [H c]ₛ` of the `L`, `e`, `H` + sector associated with an index `((α, a), β, c)`. -/ +def lehMonomial (i j : Fin 3) (m : LEHIndex) : EFTLagrangianExclDeriv := + [FermionicGenerator.bar (.L i) m.1]ₑ * [FermionicGenerator.of (.e j) m.2.1]ₑ * + [ComplexScalarGenerator.of .H m.2.2]ₛ + +lemma yukawaTermLeH_eq_sum_lehMonomial (i j : Fin 3) : + yukawaTermLeH i j = ∑ α, ∑ β, ∑ a, metricRaw α β • lehMonomial i j ((α, a), β, a) := rfl + +lemma lehMonomial_eq_tmul (i j : Fin 3) (m : LEHIndex) : + lehMonomial i j m = + SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis (.of .H m.2.2)) ⊗ₜ[ℂ] + (ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.bar (.L i) m.1)) * + ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.of (.e j) m.2.1))) := by + simp [lehMonomial, ofFieldGenerators, Algebra.TensorProduct.tmul_mul_tmul] + +/-- The linear functional on the bosonic factor extracting the coefficient of + the degree-one monomial `SymmetricAlgebra.ι (complexScalarComponentBasis (.of .H c))`, + through the identification of the symmetric algebra with multivariate polynomials. -/ +def lehCoeffS (c : Fin 2) : ComplexScalarEFTExclDeriv →ₗ[ℂ] ℂ := + MvPolynomial.lcoeff ℂ (Finsupp.single (ComplexScalarGenerator.of .H c) 1) ∘ₗ + (SymmetricAlgebra.equivMvPolynomial complexScalarComponentBasis).toLinearMap + +lemma lehCoeffS_apply_ι (c c' : Fin 2) : + lehCoeffS c (SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis (.of .H c'))) = + if c' = c then 1 else 0 := by + simp only [lehCoeffS, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, + SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.lcoeff_apply, MvPolynomial.coeff_X] + simp only [Finsupp.single_eq_single_iff, ComplexScalarGenerator.of.injEq, one_ne_zero, + and_false, or_false, true_and] + split_ifs <;> simp_all + +/-- The linear functional on the fermionic factor extracting the coefficient of the + quadratic monomial `ι (bar L i (α, a)) * ι (e j β)`, built from the degree-two + alternating map given by the determinant of the pair of coordinate functionals. -/ +def lehCoeffE (i j : Fin 3) (α a β : Fin 2) : FermionicEFTExclDeriv →ₗ[ℂ] ℂ := + ExteriorAlgebra.liftAlternating fun n => + match n with + | 2 => (Matrix.detRowAlternating (n := Fin 2) (R := ℂ)).compLinearMap + (LinearMap.pi ![fermionicComponentBasis.coord (.bar (.L i) (α, a)), + fermionicComponentBasis.coord (.of (.e j) β)]) + | _ => 0 + +lemma lehCoeffE_apply_ι_mul_ι (i j : Fin 3) (α a β α' a' β' : Fin 2) : + lehCoeffE i j α a β (ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.bar (.L i) (α', a'))) * + ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.of (.e j) β'))) = + if (α', a') = (α, a) ∧ β' = β then 1 else 0 := by + have h2 : ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.bar (.L i) (α', a'))) * + ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.of (.e j) β')) = + ExteriorAlgebra.ιMulti ℂ 2 ![fermionicComponentBasis (.bar (.L i) (α', a')), + fermionicComponentBasis (.of (.e j) β')] := by + simp [ExteriorAlgebra.ιMulti_apply] + rw [h2, lehCoeffE, ExteriorAlgebra.liftAlternating_apply_ιMulti] + simp only [AlternatingMap.compLinearMap_apply] + show Matrix.det _ = _ + rw [Matrix.det_fin_two] + simp only [LinearMap.pi_apply, Matrix.cons_val_zero, Matrix.cons_val_one, Basis.coord_apply, + Basis.repr_self, Finsupp.single_apply, Fin.isValue] + simp only [FermionicGenerator.bar.injEq, FermionicGenerator.of.injEq, heq_eq_eq, + reduceCtorEq, if_false, mul_zero, sub_zero, true_and] + split_ifs <;> simp_all + +/-- The linear functional on `EFTLagrangianExclDeriv` extracting the coefficient of + the monomial `lehMonomial i j m`. -/ +def lehCoeff (i j : Fin 3) (m : LEHIndex) : EFTLagrangianExclDeriv →ₗ[ℂ] ℂ := + (TensorProduct.lid ℂ ℂ).toLinearMap ∘ₗ + TensorProduct.map (lehCoeffS m.2.2) (lehCoeffE i j m.1.1 m.1.2 m.2.1) + +lemma lehCoeff_apply_lehMonomial (i j : Fin 3) (m m' : LEHIndex) : + lehCoeff i j m (lehMonomial i j m') = if m' = m then 1 else 0 := by + obtain ⟨⟨α, a⟩, β, c⟩ := m + obtain ⟨⟨α', a'⟩, β', c'⟩ := m' + rw [lehMonomial_eq_tmul] + simp only [lehCoeff, LinearMap.coe_comp, Function.comp_apply, TensorProduct.map_tmul, + LinearEquiv.coe_coe, TensorProduct.lid_tmul, lehCoeffS_apply_ι, lehCoeffE_apply_ι_mul_ι, + smul_eq_mul, Prod.mk.injEq] + split_ifs <;> simp_all + +lemma lehCoeff_apply_sum (i j : Fin 3) (f : LEHIndex → ℂ) (m : LEHIndex) : + lehCoeff i j m (∑ m', f m' • lehMonomial i j m') = f m := by + rw [map_sum] + simp [lehCoeff_apply_lehMonomial, mul_ite] + +lemma eq_sum_lehCoeff_of_mem_span (i j : Fin 3) (V : EFTLagrangianExclDeriv) + (hV : V ∈ Submodule.span ℂ (Set.range (lehMonomial i j))) : + V = ∑ m, lehCoeff i j m V • lehMonomial i j m := by + induction hV using Submodule.span_induction with + | mem x hx => + obtain ⟨m', rfl⟩ := hx + simp [lehCoeff_apply_lehMonomial, ite_smul, Finset.sum_ite_eq] + | zero => simp + | add x y hx hy ihx ihy => + conv_lhs => rw [ihx, ihy] + simp [map_add, add_smul, Finset.sum_add_distrib] + | smul c x hx ih => + conv_lhs => rw [ih] + simp [map_smul, smul_smul, Finset.smul_sum] + def LEHSubModule (i j : Fin 3) : Submodule ℂ EFTLagrangianExclDeriv := Submodule.span ℂ (termOfList '' {l | (Multiset.ofList l).map FieldGenerators.toIrrep = [Irrep.barFermion (FermionIrrep.L i), Irrep.fermion (FermionIrrep.e j), Irrep.cScalar ComplexScalarIrrep.H]}) +lemma toIrrep_eq_barFermion_iff (g : FieldGenerators) (φ : FermionIrrep) : + g.toIrrep = Irrep.barFermion φ ↔ ∃ p, g = FieldGenerators.fermion (.bar φ p) := by + match g with + | .cScalar (.of φ' p) => simp [FieldGenerators.toIrrep] + | .cScalar (.bar φ' p) => simp [FieldGenerators.toIrrep] + | .fermion (.of φ' p) => simp [FieldGenerators.toIrrep] + | .fermion (.bar φ' p) => + simp only [FieldGenerators.toIrrep, Irrep.barFermion.injEq] + constructor + · intro h + subst h + exact ⟨p, rfl⟩ + · rintro ⟨p', h⟩ + simp only [FieldGenerators.fermion.injEq, FermionicGenerator.bar.injEq] at h + exact h.1 + +lemma toIrrep_eq_fermion_iff (g : FieldGenerators) (φ : FermionIrrep) : + g.toIrrep = Irrep.fermion φ ↔ ∃ p, g = FieldGenerators.fermion (.of φ p) := by + match g with + | .cScalar (.of φ' p) => simp [FieldGenerators.toIrrep] + | .cScalar (.bar φ' p) => simp [FieldGenerators.toIrrep] + | .fermion (.bar φ' p) => simp [FieldGenerators.toIrrep] + | .fermion (.of φ' p) => + simp only [FieldGenerators.toIrrep, Irrep.fermion.injEq] + constructor + · intro h + subst h + exact ⟨p, rfl⟩ + · rintro ⟨p', h⟩ + simp only [FieldGenerators.fermion.injEq, FermionicGenerator.of.injEq] at h + exact h.1 + +lemma toIrrep_eq_cScalar_iff (g : FieldGenerators) (φ : ComplexScalarIrrep) : + g.toIrrep = Irrep.cScalar φ ↔ ∃ p, g = FieldGenerators.cScalar (.of φ p) := by + match g with + | .cScalar (.bar φ' p) => simp [FieldGenerators.toIrrep] + | .fermion (.of φ' p) => simp [FieldGenerators.toIrrep] + | .fermion (.bar φ' p) => simp [FieldGenerators.toIrrep] + | .cScalar (.of φ' p) => + cases φ + cases φ' + simp only [FieldGenerators.toIrrep] + exact ⟨fun _ => ⟨p, rfl⟩, fun _ => trivial⟩ + +lemma exists_perm_of_mem_LEH_set (i j : Fin 3) (l : List FieldGenerators) + (hl : (Multiset.ofList l).map FieldGenerators.toIrrep = + ([Irrep.barFermion (FermionIrrep.L i), Irrep.fermion (FermionIrrep.e j), + Irrep.cScalar ComplexScalarIrrep.H] : Multiset Irrep)) : + ∃ m : LEHIndex, l.Perm [.fermion (.bar (.L i) m.1), .fermion (.of (.e j) m.2.1), + .cScalar (.of .H m.2.2)] := by + rw [show ([Irrep.barFermion (FermionIrrep.L i), Irrep.fermion (FermionIrrep.e j), + Irrep.cScalar ComplexScalarIrrep.H] : Multiset Irrep) = + Irrep.barFermion (FermionIrrep.L i) ::ₘ Irrep.fermion (FermionIrrep.e j) ::ₘ + {Irrep.cScalar ComplexScalarIrrep.H} from rfl] at hl + obtain ⟨g1, hg1m, hg1, h2⟩ := (Multiset.map_eq_cons _ _ _ _).mpr hl + obtain ⟨g2, hg2m, hg2, h3⟩ := (Multiset.map_eq_cons _ _ _ _).mpr h2 + obtain ⟨g3, h4, hg3⟩ := Multiset.map_eq_singleton.mp h3 + obtain ⟨p, rfl⟩ := (toIrrep_eq_barFermion_iff g1 _).mp hg1 + obtain ⟨q, rfl⟩ := (toIrrep_eq_fermion_iff g2 _).mp hg2 + obtain ⟨r, rfl⟩ := (toIrrep_eq_cScalar_iff g3 _).mp hg3 + refine ⟨(p, q, r), Multiset.coe_eq_coe.mp ?_⟩ + rw [← Multiset.cons_erase hg1m, ← Multiset.cons_erase hg2m, h4] + rfl + +lemma termOfList_canonical (i j : Fin 3) (m : LEHIndex) : + termOfList [.fermion (.bar (.L i) m.1), .fermion (.of (.e j) m.2.1), + .cScalar (.of .H m.2.2)] = lehMonomial i j m := by + simp [termOfList, lehMonomial, mul_assoc] + +lemma LEHSubModule_le_span (i j : Fin 3) : + LEHSubModule i j ≤ Submodule.span ℂ (Set.range (lehMonomial i j)) := by + rw [LEHSubModule] + refine Submodule.span_le.mpr ?_ + rintro x ⟨l, hl, rfl⟩ + obtain ⟨m, hperm⟩ := exists_perm_of_mem_LEH_set i j l hl + obtain ⟨c, hc, _⟩ := termOfList_perm hperm + rw [hc, termOfList_canonical] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨m, rfl⟩) + +/-! + +### Specific group elements used to constrain the coefficients + +-/ + +/-- The diagonal Lorentz transformation `diag (2, 2⁻¹)`. -/ +def lorentzDiag : SL(2,ℂ) := ⟨!![2, 0; 0, 2⁻¹], by simp [Matrix.det_fin_two_of]⟩ + +/-- The off-diagonal Lorentz transformation `!![0, 1; -1, 0]`. -/ +def lorentzSwap : SL(2,ℂ) := ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ + +lemma lorentzDiag_inv_coe : (lorentzDiag⁻¹).1 = !![2⁻¹, 0; 0, 2] := by + rw [Matrix.SpecialLinearGroup.coe_inv] + ext a b + fin_cases a <;> fin_cases b <;> + simp [lorentzDiag, Matrix.adjugate_fin_two] + +lemma lorentzSwap_inv_coe : (lorentzSwap⁻¹).1 = !![0, -1; 1, 0] := by + rw [Matrix.SpecialLinearGroup.coe_inv] + ext a b + fin_cases a <;> fin_cases b <;> + simp [lorentzSwap, Matrix.adjugate_fin_two] + +/-- The gauge transformation with `SU(2)` part `diag (I, -I)`. -/ +def gaugeDiag : GaugeGroupI := + (1, ⟨!![I, 0; 0, -I], by + rw [Matrix.mem_specialUnitaryGroup_iff] + constructor + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply] + · simp [Matrix.det_fin_two_of]⟩, 1) + +/-- The gauge transformation with `SU(2)` part `!![0, 1; -1, 0]`. -/ +def gaugeSwap : GaugeGroupI := + (1, ⟨!![0, 1; -1, 0], by + rw [Matrix.mem_specialUnitaryGroup_iff] + constructor + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply] + · simp [Matrix.det_fin_two_of]⟩, 1) + +lemma repLorentzGroup_lorentzDiag_lehMonomial (i j : Fin 3) (m : LEHIndex) : + repLorentzGroup lorentzDiag (lehMonomial i j m) = + ((![2⁻¹, 2] : Fin 2 → ℂ) m.1.1 * ![2⁻¹, 2] m.2.1) • lehMonomial i j m := by + obtain ⟨⟨α, a⟩, β, c⟩ := m + simp only [lehMonomial, repLorentzGroup_mul, repLorentzGroup_apply_bar_L, + repLorentzGroup_apply_of_e, repLorentzGroup_apply_of_H, lorentzDiag_inv_coe] + fin_cases α <;> fin_cases β <;> + simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, + smul_smul, Complex.conj_ofNat, one_smul] + +lemma repLorentzGroup_lorentzSwap_lehMonomial (i j : Fin 3) (m : LEHIndex) : + repLorentzGroup lorentzSwap (lehMonomial i j m) = + ((![-1, 1] : Fin 2 → ℂ) m.1.1 * ![-1, 1] m.2.1) • + lehMonomial i j ((![1, 0] m.1.1, m.1.2), ![1, 0] m.2.1, m.2.2) := by + obtain ⟨⟨α, a⟩, β, c⟩ := m + simp only [lehMonomial, repLorentzGroup_mul, repLorentzGroup_apply_bar_L, + repLorentzGroup_apply_of_e, repLorentzGroup_apply_of_H, lorentzSwap_inv_coe] + fin_cases α <;> fin_cases β <;> + simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, + smul_smul, mul_comm, one_smul] + +lemma repGaugeGroupI_gaugeDiag_lehMonomial (i j : Fin 3) (m : LEHIndex) : + repGaugeGroupI gaugeDiag (lehMonomial i j m) = + ((![I, -I] : Fin 2 → ℂ) m.1.2 * ![-I, I] m.2.2) • lehMonomial i j m := by + obtain ⟨⟨α, a⟩, β, c⟩ := m + simp only [lehMonomial, repGaugeGroupI_mul, repGaugeGroupI_apply_bar_L, + repGaugeGroupI_apply_of_e, repGaugeGroupI_apply_of_H] + have hU1 : (GaugeGroupI.toU1 gaugeDiag).1 = 1 := rfl + have hSU2 : (GaugeGroupI.toSU2 gaugeDiag).1 = !![I, 0; 0, -I] := rfl + rw [hU1, hSU2] + fin_cases a <;> fin_cases c <;> + simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, + smul_smul, mul_comm, neg_smul, one_smul] <;> + module + +lemma repGaugeGroupI_gaugeSwap_lehMonomial (i j : Fin 3) (m : LEHIndex) : + repGaugeGroupI gaugeSwap (lehMonomial i j m) = + ((![-1, 1] : Fin 2 → ℂ) m.1.2 * ![-1, 1] m.2.2) • + lehMonomial i j ((m.1.1, ![1, 0] m.1.2), m.2.1, ![1, 0] m.2.2) := by + obtain ⟨⟨α, a⟩, β, c⟩ := m + simp only [lehMonomial, repGaugeGroupI_mul, repGaugeGroupI_apply_bar_L, + repGaugeGroupI_apply_of_e, repGaugeGroupI_apply_of_H] + have hU1 : (GaugeGroupI.toU1 gaugeSwap).1 = 1 := rfl + have hSU2 : (GaugeGroupI.toSU2 gaugeSwap).1 = !![0, 1; -1, 0] := rfl + rw [hU1, hSU2] + fin_cases a <;> fin_cases c <;> + simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, + smul_smul, mul_comm, one_smul] + lemma yukawaTermLeH_exclusive (i j : Fin 3) (V : EFTLagrangianExclDeriv) (hV : V ∈ LEHSubModule i j) (hI : IsInvariant V) : ∃ (c : ℂ), V = c • yukawaTermLeH i j := by - sorry + have hVexp : V = ∑ m, lehCoeff i j m V • lehMonomial i j m := + eq_sum_lehCoeff_of_mem_span i j V (LEHSubModule_le_span i j hV) + -- The diagonal Lorentz transformation scales each monomial. + have hLD : ∀ m : LEHIndex, + lehCoeff i j m V * ((![2⁻¹, 2] : Fin 2 → ℂ) m.1.1 * ![2⁻¹, 2] m.2.1) = + lehCoeff i j m V := by + intro m + have h := congrArg (lehCoeff i j m) (hI.1 lorentzDiag) + conv at h => lhs; rw [hVexp] + simpa only [map_sum, map_smul, repLorentzGroup_lorentzDiag_lehMonomial, smul_smul, + lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero, + Finset.sum_ite_eq, Finset.sum_ite_eq', Finset.mem_univ, if_true] using h + -- The diagonal gauge transformation scales each monomial. + have hGD : ∀ m : LEHIndex, + lehCoeff i j m V * ((![I, -I] : Fin 2 → ℂ) m.1.2 * ![-I, I] m.2.2) = + lehCoeff i j m V := by + intro m + have h := congrArg (lehCoeff i j m) (hI.2 gaugeDiag) + conv at h => lhs; rw [hVexp] + simpa only [map_sum, map_smul, repGaugeGroupI_gaugeDiag_lehMonomial, smul_smul, + lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero, + Finset.sum_ite_eq, Finset.sum_ite_eq', Finset.mem_univ, if_true] using h + -- Coefficients with equal Lorentz indices vanish. + have hz00 : ∀ a c : Fin 2, lehCoeff i j ((0, a), 0, c) V = 0 := by + intro a c + have h := hLD ((0, a), 0, c) + simp only [Matrix.cons_val_zero] at h + linear_combination (-(4 : ℂ)/3) * h + have hz11 : ∀ a c : Fin 2, lehCoeff i j ((1, a), 1, c) V = 0 := by + intro a c + have h := hLD ((1, a), 1, c) + simp only [Matrix.cons_val_one, Matrix.cons_val_fin_one] at h + linear_combination ((1 : ℂ)/3) * h + -- Coefficients with different weak isospin indices vanish. + have hza01 : ∀ α β : Fin 2, lehCoeff i j ((α, 0), β, 1) V = 0 := by + intro α β + have h := hGD ((α, 0), β, 1) + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.cons_val_fin_one, Complex.I_mul_I] at h + linear_combination (-(1 : ℂ)/2) * h + have hza10 : ∀ α β : Fin 2, lehCoeff i j ((α, 1), β, 0) V = 0 := by + intro α β + have h := hGD ((α, 1), β, 0) + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.cons_val_fin_one, neg_mul_neg, Complex.I_mul_I] at h + linear_combination (-(1 : ℂ)/2) * h + -- The off-diagonal Lorentz transformation relates the two `ε` components. + have hr1 : lehCoeff i j ((1, 0), 0, 0) V = -lehCoeff i j ((0, 0), 1, 0) V := by + have h := congrArg (lehCoeff i j ((1, 0), 0, 0)) (hI.1 lorentzSwap) + conv at h => lhs; rw [hVexp] + simp only [map_sum, map_smul, repLorentzGroup_lorentzSwap_lehMonomial, smul_smul, + lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero] at h + simp only [Fintype.sum_prod_type, Fin.sum_univ_two, Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.cons_val_fin_one] at h + simp at h + linear_combination -h + have hr2 : lehCoeff i j ((1, 1), 0, 1) V = -lehCoeff i j ((0, 1), 1, 1) V := by + have h := congrArg (lehCoeff i j ((1, 1), 0, 1)) (hI.1 lorentzSwap) + conv at h => lhs; rw [hVexp] + simp only [map_sum, map_smul, repLorentzGroup_lorentzSwap_lehMonomial, smul_smul, + lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero] at h + simp only [Fintype.sum_prod_type, Fin.sum_univ_two, Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.cons_val_fin_one] at h + simp at h + linear_combination -h + -- The off-diagonal gauge transformation relates the two isospin components. + have hr3 : lehCoeff i j ((0, 1), 1, 1) V = lehCoeff i j ((0, 0), 1, 0) V := by + have h := congrArg (lehCoeff i j ((0, 1), 1, 1)) (hI.2 gaugeSwap) + conv at h => lhs; rw [hVexp] + simp only [map_sum, map_smul, repGaugeGroupI_gaugeSwap_lehMonomial, smul_smul, + lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero] at h + simp only [Fintype.sum_prod_type, Fin.sum_univ_two, Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.cons_val_fin_one] at h + simp at h + linear_combination -h + -- Assemble. + refine ⟨lehCoeff i j ((0, 0), 1, 0) V, ?_⟩ + conv_lhs => rw [hVexp] + rw [yukawaTermLeH_eq_sum_lehMonomial] + simp only [Fintype.sum_prod_type, Fin.sum_univ_two] + rw [hr1, hr2, hr3] + simp only [hz00, hz11, hza01, hza10, zero_smul, add_zero, zero_add] + simp only [metricRaw, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.empty_val', Matrix.cons_val_fin_one, + zero_smul, one_smul, add_zero, zero_add] + module end EFTLagrangianExclDeriv end From f1e68c7e0bd174f251162dd1869130f37246b4de Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 12:26:33 +0100 Subject: [PATCH 060/254] feat: Add Lagrangian THeory --- Physlib/Particles/LagrangianTheory/Basic.lean | 68 +++++++++++++++++++ .../EFTLagrangianExclDeriv/Basic.lean | 16 +++++ 2 files changed, 84 insertions(+) create mode 100644 Physlib/Particles/LagrangianTheory/Basic.lean diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean new file mode 100644 index 000000000..8515edaae --- /dev/null +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan +-/ +module + +public import Physlib.Relativity.Fermions.Weyl.Metric +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.HiggsBoson.Basic +public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Mathematics.ConjModule +public import Physlib.Mathematics.MultisetsOfMassDim +public import Mathlib.RingTheory.GradedAlgebra.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis +public import Mathlib.Algebra.MvPolynomial.PDeriv +/-! + +# The Standard Model EFT Lagrangian without derivatives + +## i. Overview + +-/ + +@[expose] public section + +/-! + +## The basic type for a lagrangian theory + +-/ +open Matrix MatrixGroups Module + +structure LagrangianTheory (G : Type) [Group G] where + -- The fermions + FermionIrreps : Type + [fermionIrreps_fintype : Fintype FermionIrreps] + [fermionIrreps_decEq : DecidableEq FermionIrreps] + fermionComponents : FermionIrreps → Type + [fermionComponents_fintype : ∀ φ, Fintype (fermionComponents φ)] + [fermionComponents_decEq : ∀ φ, DecidableEq (fermionComponents φ)] + fermionModule : ∀ (_ : FermionIrreps), Type + [fermionModule_addCommGroup : ∀ φ, AddCommGroup (fermionModule φ)] + [fermionModule_module : ∀ φ, Module ℂ (fermionModule φ)] + fermionBasis : ∀ φ, Basis (fermionComponents φ) ℂ (fermionModule φ) + fermionRepLorentzGroup : ∀ φ, Representation ℂ SL(2,ℂ) (fermionModule φ) + fermionRepGaugeGroup : ∀ φ, Representation ℂ G (fermionModule φ) + -- The complex scalars + ComplexScalarIrreps : Type + [complexScalarIrreps_fintype : Fintype ComplexScalarIrreps] + [complexScalarIrreps_decEq : DecidableEq ComplexScalarIrreps] + complexScalarComponents : ComplexScalarIrreps → Type + [complexScalarComponents_fintype : ∀ φ, Fintype (complexScalarComponents φ)] + [complexScalarComponents_decEq : ∀ φ, DecidableEq (complexScalarComponents φ)] + complexScalarModule : ∀ (_ : ComplexScalarIrreps), Type + [complexScalarModule_addCommGroup : ∀ φ, AddCommGroup (complexScalarModule φ)] + [complexScalarModule_module : ∀ φ, Module ℂ (complexScalarModule φ)] + complexScalarBasis : ∀ φ, Basis (complexScalarComponents φ) ℂ (complexScalarModule φ) + complexScalarRepLorentzGroup : ∀ φ, Representation ℂ SL(2,ℂ) (complexScalarModule φ) diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean index 5ade6b1ee..dcc9fbdda 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan -/ module +public import Physlib.Particles.LagrangianTheory.Basic public import Physlib.Relativity.Fermions.Weyl.Metric public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.DownSinglet @@ -290,6 +291,21 @@ def ComplexScalarIrrep.basis : (φ : ComplexScalarIrrep) → def ComplexScalarIrrep.repLorentzGroup : (φ : ComplexScalarIrrep) → Representation ℂ SL(2,ℂ) (ComplexScalarIrrep.module φ) | .H => Representation.trivial ℂ SL(2,ℂ) HiggsVec + +@[reducible] +def StandardModelLT : LagrangianTheory GaugeGroupI where + FermionIrreps := FermionIrrep + fermionComponents := FermionIrrep.components + fermionModule := FermionIrrep.module + fermionBasis := FermionIrrep.basis + fermionRepLorentzGroup := FermionIrrep.repLorentzGroup + fermionRepGaugeGroup := FermionIrrep.repGaugeGroupI + ComplexScalarIrreps := ComplexScalarIrrep + complexScalarComponents := ComplexScalarIrrep.components + complexScalarModule := ComplexScalarIrrep.module + complexScalarBasis := ComplexScalarIrrep.basis + complexScalarRepLorentzGroup := ComplexScalarIrrep.repLorentzGroup + /-! ## Derived Complex Scalar quantities From 0766a44703f20ec6a8fd2a70a21e673a369adbcd Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 12:47:46 +0100 Subject: [PATCH 061/254] feat: Add some things to Lagrangian Theory --- Physlib/Particles/LagrangianTheory/Basic.lean | 78 +++++++++++++++++-- 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 8515edaae..6d4106bb3 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -45,24 +45,86 @@ structure LagrangianTheory (G : Type) [Group G] where FermionIrreps : Type [fermionIrreps_fintype : Fintype FermionIrreps] [fermionIrreps_decEq : DecidableEq FermionIrreps] - fermionComponents : FermionIrreps → Type - [fermionComponents_fintype : ∀ φ, Fintype (fermionComponents φ)] - [fermionComponents_decEq : ∀ φ, DecidableEq (fermionComponents φ)] + FermionComponents : FermionIrreps → Type + [fermionComponents_fintype : ∀ φ, Fintype (FermionComponents φ)] + [fermionComponents_decEq : ∀ φ, DecidableEq (FermionComponents φ)] fermionModule : ∀ (_ : FermionIrreps), Type [fermionModule_addCommGroup : ∀ φ, AddCommGroup (fermionModule φ)] [fermionModule_module : ∀ φ, Module ℂ (fermionModule φ)] - fermionBasis : ∀ φ, Basis (fermionComponents φ) ℂ (fermionModule φ) + fermionBasis : ∀ φ, Basis (FermionComponents φ) ℂ (fermionModule φ) fermionRepLorentzGroup : ∀ φ, Representation ℂ SL(2,ℂ) (fermionModule φ) fermionRepGaugeGroup : ∀ φ, Representation ℂ G (fermionModule φ) -- The complex scalars ComplexScalarIrreps : Type [complexScalarIrreps_fintype : Fintype ComplexScalarIrreps] [complexScalarIrreps_decEq : DecidableEq ComplexScalarIrreps] - complexScalarComponents : ComplexScalarIrreps → Type - [complexScalarComponents_fintype : ∀ φ, Fintype (complexScalarComponents φ)] - [complexScalarComponents_decEq : ∀ φ, DecidableEq (complexScalarComponents φ)] + ComplexScalarComponents : ComplexScalarIrreps → Type + [complexScalarComponents_fintype : ∀ φ, Fintype (ComplexScalarComponents φ)] + [complexScalarComponents_decEq : ∀ φ, DecidableEq (ComplexScalarComponents φ)] complexScalarModule : ∀ (_ : ComplexScalarIrreps), Type [complexScalarModule_addCommGroup : ∀ φ, AddCommGroup (complexScalarModule φ)] [complexScalarModule_module : ∀ φ, Module ℂ (complexScalarModule φ)] - complexScalarBasis : ∀ φ, Basis (complexScalarComponents φ) ℂ (complexScalarModule φ) + complexScalarBasis : ∀ φ, Basis (ComplexScalarComponents φ) ℂ (complexScalarModule φ) complexScalarRepLorentzGroup : ∀ φ, Representation ℂ SL(2,ℂ) (complexScalarModule φ) + +namespace LagrangianTheory + +/-! + +## A. Definitions related to fermions + +-/ + +attribute [instance] fermionIrreps_fintype fermionIrreps_decEq + fermionComponents_fintype fermionComponents_decEq + fermionModule_addCommGroup fermionModule_module + complexScalarIrreps_fintype complexScalarIrreps_decEq + complexScalarComponents_fintype complexScalarComponents_decEq + complexScalarModule_addCommGroup complexScalarModule_module + +variable {G : Type} [Group G] + +inductive FermionicGenerator (L : LagrangianTheory G) + | of (φ : L.FermionIrreps) (α : L.FermionComponents φ) : L.FermionicGenerator + | bar (φ : L.FermionIrreps) (α : L.FermionComponents φ) : L.FermionicGenerator +deriving DecidableEq, Fintype + +def FermionicGenerator.conjugate {L : LagrangianTheory G} : + L.FermionicGenerator → L.FermionicGenerator + | .of φ α => .bar φ α + | .bar φ α => .of φ α + +@[simp] +lemma FermionicGenerator.conjugate_conjugate {L : LagrangianTheory G} (g : L.FermionicGenerator) : + g.conjugate.conjugate = g := by + cases g <;> rfl + +def fermionicGeneratorEquiv {L : LagrangianTheory G} : L.FermionicGenerator ≃ + (Σ φ : L.FermionIrreps, L.FermionComponents φ) ⊕ (Σ φ : L.FermionIrreps, L.FermionComponents φ) where + toFun g := match g with + | .of φ α => Sum.inl ⟨φ, α⟩ + | .bar φ α => Sum.inr ⟨φ, α⟩ + invFun g := match g with + | Sum.inl ⟨φ, α⟩ => .of φ α + | Sum.inr ⟨φ, α⟩ => .bar φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +abbrev FermionicTargetSpace (L : LagrangianTheory G) := Π (φ : L.FermionIrreps), L.fermionModule φ + +/-- The target space of the fermionic fields, including their conjugates. -/ +abbrev FermionicTargetSpaceWithComplex (L : LagrangianTheory G) := L.FermionicTargetSpace × + ConjModule L.FermionicTargetSpace + + +abbrev FermionicComponentSpace (L : LagrangianTheory G) := + Module.Dual ℂ L.FermionicTargetSpaceWithComplex + +noncomputable def fermionicComponentBasis {L : LagrangianTheory G} : + Basis L.FermionicGenerator ℂ L.FermionicComponentSpace := + ((Pi.basis (fun φ => L.fermionBasis φ)).prod + ((Pi.basis (fun φ => L.fermionBasis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm + +abbrev FermionicEFTExclDeriv (L : LagrangianTheory G) := ExteriorAlgebra ℂ L.FermionicComponentSpace + +end LagrangianTheory From 32c69cf19e2a9d397e4b58bccc0b356ae376a127 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 29 Jul 2026 14:15:52 +0100 Subject: [PATCH 062/254] feat: IsInvariant lemmas --- .../EFTLagrangianExclDeriv/Basic.lean | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean index dcc9fbdda..be5002ae4 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -295,13 +295,13 @@ def ComplexScalarIrrep.repLorentzGroup : (φ : ComplexScalarIrrep) → Represent @[reducible] def StandardModelLT : LagrangianTheory GaugeGroupI where FermionIrreps := FermionIrrep - fermionComponents := FermionIrrep.components + FermionComponents := FermionIrrep.components fermionModule := FermionIrrep.module fermionBasis := FermionIrrep.basis fermionRepLorentzGroup := FermionIrrep.repLorentzGroup fermionRepGaugeGroup := FermionIrrep.repGaugeGroupI ComplexScalarIrreps := ComplexScalarIrrep - complexScalarComponents := ComplexScalarIrrep.components + ComplexScalarComponents := ComplexScalarIrrep.components complexScalarModule := ComplexScalarIrrep.module complexScalarBasis := ComplexScalarIrrep.basis complexScalarRepLorentzGroup := ComplexScalarIrrep.repLorentzGroup @@ -632,6 +632,19 @@ lemma IsInvariant.mul {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : lemma IsInvariant.one : IsInvariant 1 := by simp [IsInvariant] +lemma IsInvariant.sum {ι : Type} [Fintype ι] {V : ι → EFTLagrangianExclDeriv} + (hV : ∀ i, IsInvariant (V i)) : IsInvariant (∑ i, V i) := by + simp_all [IsInvariant] + +lemma IsInvariant.of_mem_span {V : EFTLagrangianExclDeriv} {S : Set EFTLagrangianExclDeriv} + (hS : ∀ W ∈ S, IsInvariant W) (hV : V ∈ Submodule.span ℂ S) : + IsInvariant V := by + induction' hV using Submodule.span_induction with W hW W1 W2 h1 h2 hI1 hI2 a W hW hIW + · exact hS W hW + · exact zero + · exact add hI1 hI2 + · exact smul a hIW + /-! ## The elements of the EFT generated by the field generators From 65703e0a19e50ef321096b33ee3ff9a14aceda83 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 09:37:06 +0100 Subject: [PATCH 063/254] feat: Add reps --- Physlib/Particles/LagrangianTheory/Basic.lean | 273 +++++++++++++++++- .../EFTLagrangianExclDeriv/Basic.lean | 53 ++++ 2 files changed, 321 insertions(+), 5 deletions(-) create mode 100644 Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 6d4106bb3..6969b69fa 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -23,6 +23,7 @@ public import Mathlib.RingTheory.TensorProduct.Maps public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis public import Mathlib.Algebra.MvPolynomial.PDeriv +public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic /-! # The Standard Model EFT Lagrangian without derivatives @@ -66,14 +67,10 @@ structure LagrangianTheory (G : Type) [Group G] where [complexScalarModule_module : ∀ φ, Module ℂ (complexScalarModule φ)] complexScalarBasis : ∀ φ, Basis (ComplexScalarComponents φ) ℂ (complexScalarModule φ) complexScalarRepLorentzGroup : ∀ φ, Representation ℂ SL(2,ℂ) (complexScalarModule φ) + complexScalarRepGaugeGroup : ∀ φ, Representation ℂ G (complexScalarModule φ) namespace LagrangianTheory -/-! - -## A. Definitions related to fermions - --/ attribute [instance] fermionIrreps_fintype fermionIrreps_decEq fermionComponents_fintype fermionComponents_decEq @@ -84,6 +81,12 @@ attribute [instance] fermionIrreps_fintype fermionIrreps_decEq variable {G : Type} [Group G] +/-! + +## A. Definitions related to fermions + +-/ + inductive FermionicGenerator (L : LagrangianTheory G) | of (φ : L.FermionIrreps) (α : L.FermionComponents φ) : L.FermionicGenerator | bar (φ : L.FermionIrreps) (α : L.FermionComponents φ) : L.FermionicGenerator @@ -127,4 +130,264 @@ noncomputable def fermionicComponentBasis {L : LagrangianTheory G} : abbrev FermionicEFTExclDeriv (L : LagrangianTheory G) := ExteriorAlgebra ℂ L.FermionicComponentSpace +/-! + +### A.1 The representation of the Lorentz group on the fermionic part + +-/ + +variable {L : LagrangianTheory G} + +def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicTargetSpace where + toFun Λ := LinearMap.piMap fun φ => L.fermionRepLorentzGroup φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp + +noncomputable def FermionicTargetSpaceWithComplex.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.FermionicTargetSpaceWithComplex := + FermionicTargetSpace.repLorentzGroup.prod (FermionicTargetSpace.repLorentzGroup.conj) + +noncomputable def FermionicComponentSpace.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.FermionicComponentSpace := + FermionicTargetSpaceWithComplex.repLorentzGroup.dual + +noncomputable def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicEFTExclDeriv where + toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +/-! + +### A.2. The representation of the Gauge group on the fermionic part + +-/ + + +def FermionicTargetSpace.repGaugeGroup : Representation ℂ G L.FermionicTargetSpace where + toFun Λ := LinearMap.piMap fun φ => L.fermionRepGaugeGroup φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp + +noncomputable def FermionicTargetSpaceWithComplex.repGaugeGroup : + Representation ℂ G L.FermionicTargetSpaceWithComplex := + FermionicTargetSpace.repGaugeGroup.prod (FermionicTargetSpace.repGaugeGroup.conj) + +noncomputable def FermionicComponentSpace.repGaugeGroup : Representation ℂ G L.FermionicComponentSpace := + FermionicTargetSpaceWithComplex.repGaugeGroup.dual + +noncomputable def FermionicEFTExclDeriv.repGaugeGroup : Representation ℂ G L.FermionicEFTExclDeriv where + toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroup Λ)).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +/-! + +## B. Definitions related to the complex scalars + +-/ + +inductive ComplexScalarGenerator (L : LagrangianTheory G) + | of (φ : L.ComplexScalarIrreps) (α : L.ComplexScalarComponents φ) : L.ComplexScalarGenerator + | bar (φ : L.ComplexScalarIrreps) (α : L.ComplexScalarComponents φ) : L.ComplexScalarGenerator +deriving DecidableEq, Fintype + +def ComplexScalarGenerator.conjugate : L.ComplexScalarGenerator → L.ComplexScalarGenerator + | .of φ α => .bar φ α + | .bar φ α => .of φ α + +@[simp] +lemma ComplexScalarGenerator.conjugate_conjugate (g : L.ComplexScalarGenerator) : + g.conjugate.conjugate = g := by + cases g <;> rfl + +def complexScalarGeneratorEquiv : L.ComplexScalarGenerator ≃ + (Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) ⊕ + (Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) where + toFun g := match g with + | .of φ α => Sum.inl ⟨φ, α⟩ + | .bar φ α => Sum.inr ⟨φ, α⟩ + invFun g := match g with + | Sum.inl ⟨φ, α⟩ => .of φ α + | Sum.inr ⟨φ, α⟩ => .bar φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +abbrev ComplexScalarTargetSpace (L : LagrangianTheory G) := + Π (φ : L.ComplexScalarIrreps), L.complexScalarModule φ + +/-- The target space of the complex scalar fields, including their conjugates. -/ +abbrev ComplexScalarTargetSpaceWithComplex (L : LagrangianTheory G) := + L.ComplexScalarTargetSpace × ConjModule L.ComplexScalarTargetSpace + +abbrev ComplexScalarComponentSpace (L : LagrangianTheory G) := + Module.Dual ℂ L.ComplexScalarTargetSpaceWithComplex + +noncomputable def complexScalarComponentBasis : + Basis L.ComplexScalarGenerator ℂ L.ComplexScalarComponentSpace := + ((Pi.basis (fun φ => L.complexScalarBasis φ)).prod + ((Pi.basis (fun φ => L.complexScalarBasis φ)).conj)).dualBasis.reindex + complexScalarGeneratorEquiv.symm + +abbrev ComplexScalarEFTExclDeriv (L : LagrangianTheory G) := + SymmetricAlgebra ℂ L.ComplexScalarComponentSpace + +/-! + +### B.1 The representation of the Lorentz group on the complex scalar part + +-/ + +def ComplexScalarTargetSpace.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarTargetSpace where + toFun Λ := LinearMap.piMap fun φ => L.complexScalarRepLorentzGroup φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp + +noncomputable def ComplexScalarTargetSpaceWithComplex.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarTargetSpaceWithComplex := + ComplexScalarTargetSpace.repLorentzGroup.prod (ComplexScalarTargetSpace.repLorentzGroup.conj) + +noncomputable def ComplexScalarComponentSpace.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarComponentSpace := + ComplexScalarTargetSpaceWithComplex.repLorentzGroup.dual + +noncomputable def ComplexScalarEFTExclDeriv.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarEFTExclDeriv where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ2)) by + rw [h]; rfl + ext v + simp + +/-! + +### B.2. The representation of the Gauge group on the complex scalar part + +-/ + +def ComplexScalarTargetSpace.repGaugeGroup : + Representation ℂ G L.ComplexScalarTargetSpace where + toFun g := LinearMap.piMap fun φ => L.complexScalarRepGaugeGroup φ g + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' g1 g2 := by + ext x i y + simp + +noncomputable def ComplexScalarTargetSpaceWithComplex.repGaugeGroup : + Representation ℂ G L.ComplexScalarTargetSpaceWithComplex := + ComplexScalarTargetSpace.repGaugeGroup.prod (ComplexScalarTargetSpace.repGaugeGroup.conj) + +noncomputable def ComplexScalarComponentSpace.repGaugeGroup : + Representation ℂ G L.ComplexScalarComponentSpace := + ComplexScalarTargetSpaceWithComplex.repGaugeGroup.dual + +noncomputable def ComplexScalarEFTExclDeriv.repGaugeGroup : + Representation ℂ G L.ComplexScalarEFTExclDeriv where + toFun g := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroup g)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' g1 g2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroup (g1 * g2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroup g1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroup g2)) by + rw [h]; rfl + ext v + simp + +/-! + +## C. General field generators + +-/ + + +inductive FieldGenerators (L : LagrangianTheory G) + | cScalar (_ : L.ComplexScalarGenerator) : FieldGenerators L + | fermion (_ : L.FermionicGenerator) : FieldGenerators L +deriving DecidableEq, Fintype + +def FieldGenerators.IsFermion : L.FieldGenerators → Bool + | .cScalar _ => False + | .fermion _ => True + +def FieldGenerators.IsBoson : L.FieldGenerators → Bool + | .cScalar _ => True + | .fermion _ => False + +def FieldGenerators.conjugate : L.FieldGenerators → L.FieldGenerators + | .cScalar g => .cScalar g.conjugate + | .fermion g => .fermion g.conjugate + +@[simp] +lemma FieldGenerators.conjugate_conjugate (ϕ : L.FieldGenerators) : + ϕ.conjugate.conjugate = ϕ := by + cases ϕ <;> simp [conjugate] + +def fieldGeneratorsEquiv : L.FieldGenerators ≃ + L.ComplexScalarGenerator ⊕ L.FermionicGenerator where + toFun g := match g with + | .cScalar g => Sum.inl g + | .fermion g => Sum.inr g + invFun g := match g with + | Sum.inl g => .cScalar g + | Sum.inr g => .fermion g + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +@[simp] +lemma FieldGenerators.cScalar_isFermion (ϕ : L.ComplexScalarGenerator) : + (cScalar ϕ).IsFermion = False := by simp [IsFermion] + +@[simp] +lemma FieldGenerators.fermion_isFermion (ϕ : L.FermionicGenerator) : + (fermion ϕ).IsFermion = True := by simp [IsFermion] + +@[simp] +lemma FieldGenerators.cScalar_isBoson (ϕ : L.ComplexScalarGenerator) : + (cScalar ϕ).IsBoson = True := by simp [IsBoson] + +@[simp] +lemma FieldGenerators.fermion_isBoson (ϕ : L.FermionicGenerator) : + (fermion ϕ).IsBoson = False := by simp [IsBoson] + + end LagrangianTheory diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean new file mode 100644 index 000000000..86e733d53 --- /dev/null +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan +-/ +module + +public import Physlib.Particles.LagrangianTheory.Basic +/-! + +# The Standard Model EFT Lagrangian without derivatives + +## i. Overview + +-/ + +@[expose] public section + +namespace LagrangianTheory + +open TensorProduct Matrix MatrixGroups + +variable {G : Type} [Group G] + + +abbrev EFTLagrangianExclDeriv (L : LagrangianTheory G) : Type := + -- bosonic part of the lagrangian + L.ComplexScalarEFTExclDeriv ⊗[ℂ] + -- fermionic part of the lagrangian + L.FermionicEFTExclDeriv + +namespace EFTLagrangianExclDeriv + +variable {L : LagrangianTheory G} +/-! + +## A. The invariance conditions + +-/ + +/-! + +### A.1. The representation + +-/ + +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) L.EFTLagrangianExclDeriv := + (ComplexScalarEFTExclDeriv.repLorentzGroup).tprod (FermionicEFTExclDeriv.repLorentzGroup) + + +end EFTLagrangianExclDeriv + +end LagrangianTheory From bfce72acfe3495bc0f19ecdef6cd20d50b8888f8 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 10:18:17 +0100 Subject: [PATCH 064/254] refactor: Start adding derivatives --- Physlib/Particles/LagrangianTheory/Basic.lean | 122 +++++++++++++++++- 1 file changed, 120 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 6969b69fa..b343ed062 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -23,6 +23,7 @@ public import Mathlib.RingTheory.TensorProduct.Maps public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis public import Mathlib.Algebra.MvPolynomial.PDeriv +public import Mathlib.LinearAlgebra.TensorAlgebra.Basis public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic /-! @@ -39,7 +40,7 @@ public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic ## The basic type for a lagrangian theory -/ -open Matrix MatrixGroups Module +open Matrix MatrixGroups Module TensorProduct structure LagrangianTheory (G : Type) [Group G] where -- The fermions @@ -68,6 +69,17 @@ structure LagrangianTheory (G : Type) [Group G] where complexScalarBasis : ∀ φ, Basis (ComplexScalarComponents φ) ℂ (complexScalarModule φ) complexScalarRepLorentzGroup : ∀ φ, Representation ℂ SL(2,ℂ) (complexScalarModule φ) complexScalarRepGaugeGroup : ∀ φ, Representation ℂ G (complexScalarModule φ) + -- The real bosonic fields (e.g. the field strengths of the gauge bosons) + RealBosonIrreps : Type + [realBosonIrreps_fintype : Fintype RealBosonIrreps] + [realBosonIrreps_decEq : DecidableEq RealBosonIrreps] + RealBosonComponents : RealBosonIrreps → Type + [realBosonComponents_fintype : ∀ φ, Fintype (RealBosonComponents φ)] + [realBosonComponents_decEq : ∀ φ, DecidableEq (RealBosonComponents φ)] + realBosonModule : ∀ (_ : RealBosonIrreps), Type + [realBosonModule_addCommGroup : ∀ φ, AddCommGroup (realBosonModule φ)] + [realBosonModule_module : ∀ φ, Module ℂ (realBosonModule φ)] + realBosonBasis : ∀ φ, Basis (RealBosonComponents φ) ℂ (realBosonModule φ) namespace LagrangianTheory @@ -113,23 +125,98 @@ def fermionicGeneratorEquiv {L : LagrangianTheory G} : L.FermionicGenerator ≃ left_inv g := by cases g <;> rfl right_inv g := by cases g <;> rfl +/-! + +### A.1. The vector spaces of the fermionic fields. + +-/ + +/-- The target vector space of the fermionic fields. + If fermions are consider in terms of an associated-bundle, this vector space + would be the fiber of that bundle. + + This vector space includes all the fields appearing in the theory. -/ abbrev FermionicTargetSpace (L : LagrangianTheory G) := Π (φ : L.FermionIrreps), L.fermionModule φ -/-- The target space of the fermionic fields, including their conjugates. -/ +/-- The target vector space of covariant derivatives of fermions e.g. ∇_μ ψ. + This is similar to the Jet space associated with fermions, however, because covariant derivatives + do not commute, the commutation is not taken account of here. + + This vector space includes all the fields in the theory + their covariant derivatives. -/ +abbrev FermionicDerivSpace (L : LagrangianTheory G) := + TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace + +/-- The fermionic target space linearly embeds into the fermionic target space with derivatives. -/ +def FermionicTargetSpace.toFermionicDerivSpace {L : LagrangianTheory G} : + L.FermionicTargetSpace →ₗ[ℂ] L.FermionicDerivSpace := + TensorProduct.mk ℂ (TensorAlgebra ℂ Lorentz.CoℂModule) L.FermionicTargetSpace 1 + +/-- Since fermions are complex fields, we also need to consider the target space of their + complex conjugate. The vector space `FermionicTargetSpaceWithComplex` is defined + to contain both the target space of the fields, and their conjugates. + + This vector space includes all the fields appearing in the theory + their conjugates. -/ abbrev FermionicTargetSpaceWithComplex (L : LagrangianTheory G) := L.FermionicTargetSpace × ConjModule L.FermionicTargetSpace +/-- Similar to `FermionicTargetSpaceWithComplex` except including derivatives. + + This vector space includes all the fields present in the theory + their conjugates + all + their covariant derivatives. -/ +abbrev FermionicDerivSpaceWithComplex (L : LagrangianTheory G) := + (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace) × + (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpaceWithComplex) +/-- The vector space dual to `FermionicTargetSpaceWithComplex` and spanned by the component + functions of all the fields + their conjugates in the theory. -/ abbrev FermionicComponentSpace (L : LagrangianTheory G) := Module.Dual ℂ L.FermionicTargetSpaceWithComplex +/-- The vector space dual to `FermionicDerivSpaceWithComplex` and spanned by the component + functions of all the fields + their conjugates + all their covariant derivatives in the theory. -/ +abbrev FermionicComponentSpaceWithDeriv (L : LagrangianTheory G) := + Module.Dual ℂ L.FermionicDerivSpaceWithComplex + noncomputable def fermionicComponentBasis {L : LagrangianTheory G} : Basis L.FermionicGenerator ℂ L.FermionicComponentSpace := ((Pi.basis (fun φ => L.fermionBasis φ)).prod ((Pi.basis (fun φ => L.fermionBasis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm +/-! + +## A.2. The fermionic algebras + +-/ + +/-- The EFT algebra spanned by the fermions in the theory + their conjugate. -/ abbrev FermionicEFTExclDeriv (L : LagrangianTheory G) := ExteriorAlgebra ℂ L.FermionicComponentSpace +/-- The EFT algebra spanned by the fermions in the theory + their conjugate + all their + covariant derivatives without taking account of commutation of derivatives, or + total derivatives or equations of motion relations. -/ +abbrev FermionicEFTFreeDeriv (L : LagrangianTheory G) := + ExteriorAlgebra ℂ L.FermionicComponentSpaceWithDeriv + +/-! + +## A.1. The derivative space of the fermionic fields + +-/ + +/-- The basis of `FermionicDerivSpace` indexed by pairs of a list of spacetime + indices `Fin 1 ⊕ Fin 3` (the derivative slots, ordered since covariant derivatives + do not commute) and a basis index of the fermionic target space. -/ +noncomputable def FermionicDerivSpace.basis {L : LagrangianTheory G} : + Basis (List (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) ℂ + L.FermionicDerivSpace := + (Lorentz.complexCoBasis.tensorAlgebra).tensorProduct (Pi.basis fun φ => L.fermionBasis φ) + +/-- The inclusion of single covariant derivatives of the fermionic fields into + the space of all covariant derivatives, `v ⊗ₜ ψ ↦ TensorAlgebra.ι ℂ v ⊗ₜ ψ`. -/ +noncomputable def FermionicDerivSpace.ofSingleDeriv {L : LagrangianTheory G} : + Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace →ₗ[ℂ] L.FermionicDerivSpace := + LinearMap.rTensor L.FermionicTargetSpace (TensorAlgebra.ι ℂ) + /-! ### A.1 The representation of the Lorentz group on the fermionic part @@ -148,6 +235,37 @@ def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.Fermio ext x i y simp +/-- The representation of the Lorentz group on the tensor algebra of covariant + derivative slots, acting through `CoℂModule.SL2CRep` on each factor. -/ +noncomputable def derivSlotsRepLorentzGroup : + Representation ℂ SL(2,ℂ) (TensorAlgebra ℂ Lorentz.CoℂModule) where + toFun Λ := (TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ)).toLinearMap + map_one' := by + suffices h : TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep 1) = + AlgHom.id ℂ (TensorAlgebra ℂ Lorentz.CoℂModule) by + rw [h]; rfl + ext v + simp + map_mul' Λ1 Λ2 := by + suffices h : TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep (Λ1 * Λ2)) = + (TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ1)).comp + (TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ2)) by + rw [h]; rfl + ext v + simp + +/-- The representation of the Lorentz group on the covariant-derivative space of the fermionic + fields: the tensor product of the action on the derivative slots and the action + on the fermionic target space. -/ +noncomputable def FermionicDerivSpace.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.FermionicDerivSpace := + derivSlotsRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup + noncomputable def FermionicTargetSpaceWithComplex.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicTargetSpaceWithComplex := FermionicTargetSpace.repLorentzGroup.prod (FermionicTargetSpace.repLorentzGroup.conj) From d73aea3b81f108acdd8651d21f8af62fbd785da1 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:25:13 +0100 Subject: [PATCH 065/254] feat: Update with derivatives --- Physlib/Particles/LagrangianTheory/Basic.lean | 185 ++++++++++++++---- 1 file changed, 142 insertions(+), 43 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index b343ed062..ea600ba24 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -125,6 +125,24 @@ def fermionicGeneratorEquiv {L : LagrangianTheory G} : L.FermionicGenerator ≃ left_inv g := by cases g <;> rfl right_inv g := by cases g <;> rfl +inductive FermionicDerivGenerator (L : LagrangianTheory G) + | of (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.FermionIrreps) (α : L.FermionComponents φ) : + L.FermionicDerivGenerator + | bar (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.FermionIrreps) (α : L.FermionComponents φ) : + L.FermionicDerivGenerator + +def fermionicDerivGeneratorEquiv {L : LagrangianTheory G} : L.FermionicDerivGenerator ≃ + (List (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) ⊕ + (List (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) where + toFun g := match g with + | .of μ φ α => Sum.inl (μ, ⟨φ, α⟩) + | .bar μ φ α => Sum.inr (μ, ⟨φ, α⟩) + invFun g := match g with + | Sum.inl (μ, ⟨φ, α⟩) => .of μ φ α + | Sum.inr (μ, ⟨φ, α⟩) => .bar μ φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + /-! ### A.1. The vector spaces of the fermionic fields. @@ -165,22 +183,25 @@ abbrev FermionicTargetSpaceWithComplex (L : LagrangianTheory G) := L.FermionicTa their covariant derivatives. -/ abbrev FermionicDerivSpaceWithComplex (L : LagrangianTheory G) := (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace) × - (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpaceWithComplex) + (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] ConjModule L.FermionicTargetSpace) /-- The vector space dual to `FermionicTargetSpaceWithComplex` and spanned by the component functions of all the fields + their conjugates in the theory. -/ abbrev FermionicComponentSpace (L : LagrangianTheory G) := Module.Dual ℂ L.FermionicTargetSpaceWithComplex -/-- The vector space dual to `FermionicDerivSpaceWithComplex` and spanned by the component - functions of all the fields + their conjugates + all their covariant derivatives in the theory. -/ -abbrev FermionicComponentSpaceWithDeriv (L : LagrangianTheory G) := - Module.Dual ℂ L.FermionicDerivSpaceWithComplex +/-- The vector space spanned by the component functions of all the fields + their + conjugates + all their covariant derivatives in the theory. -noncomputable def fermionicComponentBasis {L : LagrangianTheory G} : - Basis L.FermionicGenerator ℂ L.FermionicComponentSpace := - ((Pi.basis (fun φ => L.fermionBasis φ)).prod - ((Pi.basis (fun φ => L.fermionBasis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm + This is the *graded* dual of `FermionicDerivSpaceWithComplex`: the duals of the + finite-dimensional building blocks are dualized individually and reassembled. The full + `Module.Dual` of `FermionicDerivSpaceWithComplex` is strictly larger (the latter is + infinite dimensional) and is not spanned by the component functions. -/ +abbrev FermionicComponentSpaceWithDeriv (L : LagrangianTheory G) := + (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ L.FermionicTargetSpace) × + (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule L.FermionicTargetSpace)) /-! @@ -199,45 +220,52 @@ abbrev FermionicEFTFreeDeriv (L : LagrangianTheory G) := /-! -## A.1. The derivative space of the fermionic fields +## A.3. The basis of the fermionic vector spaces + +The main vector spaces are `FermionicComponentSpace` and `FermionicComponentSpaceWithDeriv`. +On these spaces we want to define a basis indexed by `FermionicGenerator` and +`FermionicDerivGenerator` respectively. -/ -/-- The basis of `FermionicDerivSpace` indexed by pairs of a list of spacetime - indices `Fin 1 ⊕ Fin 3` (the derivative slots, ordered since covariant derivatives - do not commute) and a basis index of the fermionic target space. -/ -noncomputable def FermionicDerivSpace.basis {L : LagrangianTheory G} : - Basis (List (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) ℂ - L.FermionicDerivSpace := - (Lorentz.complexCoBasis.tensorAlgebra).tensorProduct (Pi.basis fun φ => L.fermionBasis φ) +noncomputable def FermionicComponentSpace.basis {L : LagrangianTheory G} : + Basis L.FermionicGenerator ℂ L.FermionicComponentSpace := + ((Pi.basis (fun φ => L.fermionBasis φ)).prod + ((Pi.basis (fun φ => L.fermionBasis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm -/-- The inclusion of single covariant derivatives of the fermionic fields into - the space of all covariant derivatives, `v ⊗ₜ ψ ↦ TensorAlgebra.ι ℂ v ⊗ₜ ψ`. -/ -noncomputable def FermionicDerivSpace.ofSingleDeriv {L : LagrangianTheory G} : - Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace →ₗ[ℂ] L.FermionicDerivSpace := - LinearMap.rTensor L.FermionicTargetSpace (TensorAlgebra.ι ℂ) + +noncomputable def FermionicComponentSpaceWithDeriv.basis {L : LagrangianTheory G} : + Basis L.FermionicDerivGenerator ℂ L.FermionicComponentSpaceWithDeriv := + (((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct + (Pi.basis fun φ => L.fermionBasis φ).dualBasis).prod + ((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct + ((Pi.basis fun φ => L.fermionBasis φ).conj.dualBasis))).reindex + fermionicDerivGeneratorEquiv.symm /-! -### A.1 The representation of the Lorentz group on the fermionic part +## A.4. The representation of the Lorentz group on fermionic vector spaces and algebras + +We now define the respresentation of the Lorentz group on the vector spaces +and algebras associated with Fermions. Note that since we are dealing with complex +fields we take the Lorentz group to be `SL(2,ℂ)`, rather than dealing with projective +representations of the Lorentz group. + +We are particularly interested in the representations acting on +- the vector spaces `FermionicComponentSpace` and `FermionicComponentSpaceWithDeriv`, and +- the algebras `FermionicEFTExclDeriv` and `FermionicEFTFreeDeriv`. + +To define the representations on vector spaces involving derivatives, +we first need to define the representations on the derivative algebras. -/ -variable {L : LagrangianTheory G} -def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicTargetSpace where - toFun Λ := LinearMap.piMap fun φ => L.fermionRepLorentzGroup φ Λ - map_one' := by - ext x i y - simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, - Function.comp_apply, Pi.map_apply, End.one_apply] - map_mul' Λ1 Λ2 := by - ext x i y - simp +variable {L : LagrangianTheory G} /-- The representation of the Lorentz group on the tensor algebra of covariant - derivative slots, acting through `CoℂModule.SL2CRep` on each factor. -/ -noncomputable def derivSlotsRepLorentzGroup : + derivatives, acting through `CoℂModule.SL2CRep` on each factor. -/ +noncomputable def derivAlgebraRepLorentzGroup : Representation ℂ SL(2,ℂ) (TensorAlgebra ℂ Lorentz.CoℂModule) where toFun Λ := (TensorAlgebra.lift ℂ (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ)).toLinearMap @@ -259,12 +287,39 @@ noncomputable def derivSlotsRepLorentzGroup : ext v simp -/-- The representation of the Lorentz group on the covariant-derivative space of the fermionic - fields: the tensor product of the action on the derivative slots and the action - on the fermionic target space. -/ -noncomputable def FermionicDerivSpace.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.FermionicDerivSpace := - derivSlotsRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup +noncomputable def dualDerivAlgebraRepLorentzGroup : + Representation ℂ SL(2,ℂ) (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where + toFun Λ := (TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ)).toLinearMap + map_one' := by + suffices h : TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual 1) = + AlgHom.id ℂ (TensorAlgebra ℂ _) by + rw [h]; rfl + ext v + simp + rfl + map_mul' Λ1 Λ2 := by + suffices h : TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual (Λ1 * Λ2)) = + (TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ1)).comp + (TensorAlgebra.lift ℂ + (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ2)) by + rw [h]; rfl + ext v + simp + rfl + +def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicTargetSpace where + toFun Λ := LinearMap.piMap fun φ => L.fermionRepLorentzGroup φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp noncomputable def FermionicTargetSpaceWithComplex.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicTargetSpaceWithComplex := @@ -274,6 +329,11 @@ noncomputable def FermionicComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicComponentSpace := FermionicTargetSpaceWithComplex.repLorentzGroup.dual +noncomputable def FermionicComponentSpaceWithDeriv.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.FermionicComponentSpaceWithDeriv := + (dualDerivAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.dual).prod + (dualDerivAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.conj.dual) + noncomputable def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicEFTExclDeriv where toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ)).toLinearMap map_one' := by @@ -283,13 +343,23 @@ noncomputable def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL( simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, AlgHom.comp_toLinearMap] +/-- The representation of the Lorentz group on the algebra `FermionicEFTFreeDeriv`. -/ +noncomputable def FermionicEFTFreeDeriv.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.FermionicEFTFreeDeriv where + toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ1 Λ2 := by + simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + /-! -### A.2. The representation of the Gauge group on the fermionic part +### A.5. The representation of the Lorentz group on fermionic vector spaces and algebras -/ - def FermionicTargetSpace.repGaugeGroup : Representation ℂ G L.FermionicTargetSpace where toFun Λ := LinearMap.piMap fun φ => L.fermionRepGaugeGroup φ Λ map_one' := by @@ -304,9 +374,28 @@ noncomputable def FermionicTargetSpaceWithComplex.repGaugeGroup : Representation ℂ G L.FermionicTargetSpaceWithComplex := FermionicTargetSpace.repGaugeGroup.prod (FermionicTargetSpace.repGaugeGroup.conj) +/-- The representation of the gauge group on the covariant-derivative space of the + fermionic fields. The gauge group acts trivially on the derivative slots: this is + the statement that the derivatives are *covariant* derivatives, so that `∇ ⋯ ∇ ψ` + transforms in the same representation of the gauge group as `ψ` itself. -/ +noncomputable def FermionicDerivSpace.repGaugeGroup : + Representation ℂ G L.FermionicDerivSpace := + (Representation.trivial ℂ G (TensorAlgebra ℂ Lorentz.CoℂModule)).tprod + FermionicTargetSpace.repGaugeGroup + noncomputable def FermionicComponentSpace.repGaugeGroup : Representation ℂ G L.FermionicComponentSpace := FermionicTargetSpaceWithComplex.repGaugeGroup.dual +/-- The representation of the gauge group on the space of component functions of the + fermionic fields, their conjugates, and their covariant derivatives; trivial on the + derivative slots. -/ +noncomputable def FermionicComponentSpaceWithDeriv.repGaugeGroup : + Representation ℂ G L.FermionicComponentSpaceWithDeriv := + ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + FermionicTargetSpace.repGaugeGroup.dual).prod + ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + FermionicTargetSpace.repGaugeGroup.conj.dual) + noncomputable def FermionicEFTExclDeriv.repGaugeGroup : Representation ℂ G L.FermionicEFTExclDeriv where toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroup Λ)).toLinearMap map_one' := by @@ -316,6 +405,16 @@ noncomputable def FermionicEFTExclDeriv.repGaugeGroup : Representation ℂ G L.F simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, AlgHom.comp_toLinearMap] +noncomputable def FermionicEFTFreeDeriv.repGaugeGroup : + Representation ℂ G L.FermionicEFTFreeDeriv where + toFun g := (ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repGaugeGroup g)).toLinearMap + map_one' := by + simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' g1 g2 := by + simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + /-! ## B. Definitions related to the complex scalars From df3c0ac65c387dd730b238b544d28cbc6a59baa2 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:36:56 +0100 Subject: [PATCH 066/254] feat: Add derivatives for bososns Co-Authored-By: Claude --- Physlib/Particles/LagrangianTheory/Basic.lean | 169 +++++++++++++++++- 1 file changed, 163 insertions(+), 6 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index ea600ba24..8dab64388 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -356,7 +356,7 @@ noncomputable def FermionicEFTFreeDeriv.repLorentzGroup : /-! -### A.5. The representation of the Lorentz group on fermionic vector spaces and algebras +### A.5. The representation of the Gauge group on fermionic vector spaces and algebras -/ @@ -447,28 +447,126 @@ def complexScalarGeneratorEquiv : L.ComplexScalarGenerator ≃ left_inv g := by cases g <;> rfl right_inv g := by cases g <;> rfl +inductive ComplexScalarDerivGenerator (L : LagrangianTheory G) + | of (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.ComplexScalarIrreps) + (α : L.ComplexScalarComponents φ) : L.ComplexScalarDerivGenerator + | bar (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.ComplexScalarIrreps) + (α : L.ComplexScalarComponents φ) : L.ComplexScalarDerivGenerator + +def complexScalarDerivGeneratorEquiv : L.ComplexScalarDerivGenerator ≃ + (List (Fin 1 ⊕ Fin 3) × Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) ⊕ + (List (Fin 1 ⊕ Fin 3) × Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) where + toFun g := match g with + | .of μ φ α => Sum.inl (μ, ⟨φ, α⟩) + | .bar μ φ α => Sum.inr (μ, ⟨φ, α⟩) + invFun g := match g with + | Sum.inl (μ, ⟨φ, α⟩) => .of μ φ α + | Sum.inr (μ, ⟨φ, α⟩) => .bar μ φ α + left_inv g := by cases g <;> rfl + right_inv g := by cases g <;> rfl + +/-! + +### B.1. The vector spaces of the complex scalar fields. + +-/ + +/-- The target vector space of the complex scalar fields. + + This vector space includes all the complex scalar fields appearing in the theory. -/ abbrev ComplexScalarTargetSpace (L : LagrangianTheory G) := Π (φ : L.ComplexScalarIrreps), L.complexScalarModule φ +/-- The target vector space of covariant derivatives of the complex scalar fields + e.g. ∇_μ ϕ. This is similar to the Jet space associated with the scalars, however, + because covariant derivatives do not commute, the commutation is not taken account + of here. + + This vector space includes all the complex scalar fields in the theory + their + covariant derivatives. -/ +abbrev ComplexScalarDerivSpace (L : LagrangianTheory G) := + TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.ComplexScalarTargetSpace + +/-- The complex scalar target space linearly embeds into the complex scalar target + space with derivatives. -/ +def ComplexScalarTargetSpace.toComplexScalarDerivSpace {L : LagrangianTheory G} : + L.ComplexScalarTargetSpace →ₗ[ℂ] L.ComplexScalarDerivSpace := + TensorProduct.mk ℂ (TensorAlgebra ℂ Lorentz.CoℂModule) L.ComplexScalarTargetSpace 1 + /-- The target space of the complex scalar fields, including their conjugates. -/ abbrev ComplexScalarTargetSpaceWithComplex (L : LagrangianTheory G) := L.ComplexScalarTargetSpace × ConjModule L.ComplexScalarTargetSpace +/-- Similar to `ComplexScalarTargetSpaceWithComplex` except including derivatives. + + This vector space includes all the complex scalar fields present in the theory + + their conjugates + all their covariant derivatives. -/ +abbrev ComplexScalarDerivSpaceWithComplex (L : LagrangianTheory G) := + (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.ComplexScalarTargetSpace) × + (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] ConjModule L.ComplexScalarTargetSpace) + +/-- The vector space dual to `ComplexScalarTargetSpaceWithComplex` and spanned by the + component functions of all the complex scalar fields + their conjugates in the + theory. -/ abbrev ComplexScalarComponentSpace (L : LagrangianTheory G) := Module.Dual ℂ L.ComplexScalarTargetSpaceWithComplex -noncomputable def complexScalarComponentBasis : +/-- The vector space spanned by the component functions of all the complex scalar + fields + their conjugates + all their covariant derivatives in the theory. + + This is the *graded* dual of `ComplexScalarDerivSpaceWithComplex`: the duals of the + finite-dimensional building blocks are dualized individually and reassembled. The + full `Module.Dual` of `ComplexScalarDerivSpaceWithComplex` is strictly larger (the + latter is infinite dimensional) and is not spanned by the component functions. -/ +abbrev ComplexScalarComponentSpaceWithDeriv (L : LagrangianTheory G) := + (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ L.ComplexScalarTargetSpace) × + (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule L.ComplexScalarTargetSpace)) + +/-! + +### B.2. The complex scalar algebras + +-/ + +/-- The EFT algebra spanned by the complex scalars in the theory + their conjugate. -/ +abbrev ComplexScalarEFTExclDeriv (L : LagrangianTheory G) := + SymmetricAlgebra ℂ L.ComplexScalarComponentSpace + +/-- The EFT algebra spanned by the complex scalars in the theory + their conjugate + + all their covariant derivatives without taking account of commutation of + derivatives, or total derivatives or equations of motion relations. -/ +abbrev ComplexScalarEFTFreeDeriv (L : LagrangianTheory G) := + SymmetricAlgebra ℂ L.ComplexScalarComponentSpaceWithDeriv + +/-! + +### B.3. The basis of the complex scalar vector spaces + +The main vector spaces are `ComplexScalarComponentSpace` and +`ComplexScalarComponentSpaceWithDeriv`. On these spaces we want to define a basis +indexed by `ComplexScalarGenerator` and `ComplexScalarDerivGenerator` respectively. + +-/ + +noncomputable def ComplexScalarComponentSpace.basis : Basis L.ComplexScalarGenerator ℂ L.ComplexScalarComponentSpace := ((Pi.basis (fun φ => L.complexScalarBasis φ)).prod ((Pi.basis (fun φ => L.complexScalarBasis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm -abbrev ComplexScalarEFTExclDeriv (L : LagrangianTheory G) := - SymmetricAlgebra ℂ L.ComplexScalarComponentSpace +noncomputable def ComplexScalarComponentSpaceWithDeriv.basis : + Basis L.ComplexScalarDerivGenerator ℂ L.ComplexScalarComponentSpaceWithDeriv := + (((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct + (Pi.basis fun φ => L.complexScalarBasis φ).dualBasis).prod + ((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct + ((Pi.basis fun φ => L.complexScalarBasis φ).conj.dualBasis))).reindex + complexScalarDerivGeneratorEquiv.symm /-! -### B.1 The representation of the Lorentz group on the complex scalar part +### B.4. The representation of the Lorentz group on complex scalar vector spaces and algebras -/ @@ -491,6 +589,11 @@ noncomputable def ComplexScalarComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.ComplexScalarComponentSpace := ComplexScalarTargetSpaceWithComplex.repLorentzGroup.dual +noncomputable def ComplexScalarComponentSpaceWithDeriv.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarComponentSpaceWithDeriv := + (dualDerivAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.dual).prod + (dualDerivAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.conj.dual) + noncomputable def ComplexScalarEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) L.ComplexScalarEFTExclDeriv where toFun Λ := (SymmetricAlgebra.lift @@ -508,9 +611,27 @@ noncomputable def ComplexScalarEFTExclDeriv.repLorentzGroup : ext v simp +/-- The representation of the Lorentz group on the algebra `ComplexScalarEFTFreeDeriv`. -/ +noncomputable def ComplexScalarEFTFreeDeriv.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarEFTFreeDeriv where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ2)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + /-! -### B.2. The representation of the Gauge group on the complex scalar part +### B.5. The representation of the Gauge group on complex scalar vector spaces and algebras -/ @@ -529,10 +650,29 @@ noncomputable def ComplexScalarTargetSpaceWithComplex.repGaugeGroup : Representation ℂ G L.ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace.repGaugeGroup.prod (ComplexScalarTargetSpace.repGaugeGroup.conj) +/-- The representation of the gauge group on the covariant-derivative space of the + complex scalar fields. The gauge group acts trivially on the derivative slots: this + is the statement that the derivatives are *covariant* derivatives, so that `∇ ⋯ ∇ ϕ` + transforms in the same representation of the gauge group as `ϕ` itself. -/ +noncomputable def ComplexScalarDerivSpace.repGaugeGroup : + Representation ℂ G L.ComplexScalarDerivSpace := + (Representation.trivial ℂ G (TensorAlgebra ℂ Lorentz.CoℂModule)).tprod + ComplexScalarTargetSpace.repGaugeGroup + noncomputable def ComplexScalarComponentSpace.repGaugeGroup : Representation ℂ G L.ComplexScalarComponentSpace := ComplexScalarTargetSpaceWithComplex.repGaugeGroup.dual +/-- The representation of the gauge group on the space of component functions of the + complex scalar fields, their conjugates, and their covariant derivatives; trivial on + the derivative slots. -/ +noncomputable def ComplexScalarComponentSpaceWithDeriv.repGaugeGroup : + Representation ℂ G L.ComplexScalarComponentSpaceWithDeriv := + ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + ComplexScalarTargetSpace.repGaugeGroup.dual).prod + ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + ComplexScalarTargetSpace.repGaugeGroup.conj.dual) + noncomputable def ComplexScalarEFTExclDeriv.repGaugeGroup : Representation ℂ G L.ComplexScalarEFTExclDeriv where toFun g := (SymmetricAlgebra.lift @@ -550,6 +690,23 @@ noncomputable def ComplexScalarEFTExclDeriv.repGaugeGroup : ext v simp +noncomputable def ComplexScalarEFTFreeDeriv.repGaugeGroup : + Representation ℂ G L.ComplexScalarEFTFreeDeriv where + toFun g := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' g1 g2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup (g1 * g2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g2)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + /-! ## C. General field generators From ffb32ced77d42333f7ec3880150de748bcaaf797 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:48:23 +0100 Subject: [PATCH 067/254] fix: Lagrangian theory --- Physlib/Particles/LagrangianTheory/Basic.lean | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 8dab64388..140d48e00 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -78,8 +78,10 @@ structure LagrangianTheory (G : Type) [Group G] where [realBosonComponents_decEq : ∀ φ, DecidableEq (RealBosonComponents φ)] realBosonModule : ∀ (_ : RealBosonIrreps), Type [realBosonModule_addCommGroup : ∀ φ, AddCommGroup (realBosonModule φ)] - [realBosonModule_module : ∀ φ, Module ℂ (realBosonModule φ)] - realBosonBasis : ∀ φ, Basis (RealBosonComponents φ) ℂ (realBosonModule φ) + [realBosonModule_module : ∀ φ, Module ℝ (realBosonModule φ)] + realBosonBasis : ∀ φ, Basis (RealBosonComponents φ) ℝ (realBosonModule φ) + realBosonRepLorentzGroup : ∀ φ, Representation ℝ SL(2,ℂ) (realBosonModule φ) + realBosonRepGaugeGroup : ∀ φ, Representation ℝ G (complexScalarModule φ) namespace LagrangianTheory From 4c20a57504f1907795dd6182dde6374f18e00024 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 12:11:45 +0100 Subject: [PATCH 068/254] feat: Start gluon field strength (as test) --- .../StandardModel/FieldStrength/Gluons.lean | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 Physlib/Particles/StandardModel/FieldStrength/Gluons.lean diff --git a/Physlib/Particles/StandardModel/FieldStrength/Gluons.lean b/Physlib/Particles/StandardModel/FieldStrength/Gluons.lean new file mode 100644 index 000000000..036c14111 --- /dev/null +++ b/Physlib/Particles/StandardModel/FieldStrength/Gluons.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +/-! +# Field strength of gluons + +## i. Overview + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The gluon field strength +-/ + +/-- The target vector space of the gluon field strength `G_{μν}`. It carries two + Lorentz indices, and is valued in the real vector space of `3 × 3` hermitian + matrices, corresponding to the adjoint of `SU(3)`. -/ +@[ext] +structure GluonFieldStrength where + /-- The two Lorentz indices together with the adjoint (hermitian-matrix) colour + factor. -/ + val : Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) + +namespace GluonFieldStrength + +/-! + +## B. Linear structure +-/ + +def valEquiv : GluonFieldStrength ≃ Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where + toFun := val + invFun := fun m => ⟨m⟩ + +noncomputable instance : AddCommGroup GluonFieldStrength := Equiv.addCommGroup valEquiv + +noncomputable instance : Module ℝ GluonFieldStrength := Equiv.module ℝ valEquiv + +/-- The linear identification with the underlying tensor product. -/ +def valLinEquiv : GluonFieldStrength ≃ₗ[ℝ] + Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where + toFun := val + invFun := fun m => ⟨m⟩ + map_add' := by intros; rfl + map_smul' := by intros; rfl + +@[simp] +lemma valLinEquiv_apply (d : GluonFieldStrength) : valLinEquiv d = d.val := rfl + +lemma valLinEquiv_symm_apply + (m : Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : + valLinEquiv.symm m = ⟨m⟩ := rfl + +@[simp] +lemma val_add (d₁ d₂ : GluonFieldStrength) : (d₁ + d₂).val = d₁.val + d₂.val := rfl + +@[simp] +lemma val_smul (r : ℝ) (d : GluonFieldStrength) : (r • d).val = r • d.val := rfl + + +/-! + +## C. Lorentz action + +The Lorentz group acts on the right-handed Weyl factor and leaves the colour index fixed. +-/ + +open Matrix MatrixGroups + +/-- The action of an element of `SL(2,ℂ)` on the gluon field strength: the vector + action, through the covering map `SL(2,ℂ) →* LorentzGroup 3`, on the two Lorentz + indices, and the trivial action on the colour (adjoint) factor. -/ +noncomputable def repLorentzGroupAux (Λ : SL(2,ℂ)) : + GluonFieldStrength →ₗ[ℝ] GluonFieldStrength := + valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map + (TensorProduct.map (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ)) + (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ))) + (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) Λ) ∘ₗ + valLinEquiv.toLinearMap + +/-- The Lorentz representation on the gluon field strength: the action on the two + Lorentz indices, trivial on the colour (adjoint) factor. -/ +noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) GluonFieldStrength where + toFun := repLorentzGroupAux + map_one' := by + ext F + simp [repLorentzGroupAux, Module.End.one_eq_id] + map_mul' Λ₁ Λ₂ := by + ext1 F + simp [repLorentzGroupAux, TensorProduct.map_map, TensorProduct.map_comp, + Module.End.mul_eq_comp, map_mul] + +/-! + +## D. Gauge action + +The gluon field strength transforms in the adjoint representation of the gauge group: +the `SU(3)` component acts on the colour factor by conjugation `A ↦ u * A * uᴴ`, while +the `SU(2)` and `U(1)` components act trivially, as do the two Lorentz indices. +-/ + +/-- The adjoint action of an element of `SU(3)` on the real vector space of `3 × 3` + hermitian matrices, `A ↦ u * A * uᴴ`. -/ +@[simps!] +noncomputable def adjointAction (u : specialUnitaryGroup (Fin 3) ℂ) : + selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) →ₗ[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where + toFun A := ⟨u.1 * A.1 * (u.1)ᴴ, + by + noncomm_ring [selfAdjoint.mem_iff, star_eq_conjTranspose, + conjTranspose_mul, conjTranspose_conjTranspose, + (star_eq_conjTranspose A.1).symm.trans <| selfAdjoint.mem_iff.mp A.2]⟩ + map_add' A B := by + simp only [AddSubgroup.coe_add, AddMemClass.mk_add_mk, Subtype.mk.injEq] + noncomm_ring + map_smul' r A := by + noncomm_ring [selfAdjoint.val_smul, Algebra.mul_smul_comm, Algebra.smul_mul_assoc, + RingHom.id_apply] + +@[simp] +lemma adjointAction_one : adjointAction 1 = LinearMap.id := by + refine LinearMap.ext fun A => Subtype.ext ?_ + simp [adjointAction] + +lemma adjointAction_mul (u₁ u₂ : specialUnitaryGroup (Fin 3) ℂ) : + adjointAction (u₁ * u₂) = adjointAction u₁ ∘ₗ adjointAction u₂ := by + refine LinearMap.ext fun A => Subtype.ext ?_ + simp [adjointAction, conjTranspose_mul, mul_assoc] + +/-- The action of an element of the gauge group on the gluon field strength: the + adjoint action of the `SU(3)` component on the colour factor, trivial on the two + Lorentz indices. -/ +noncomputable def repGaugeGroupIAux (g : GaugeGroupI) : + GluonFieldStrength →ₗ[ℝ] GluonFieldStrength := + valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id (adjointAction g.toSU3) ∘ₗ + valLinEquiv.toLinearMap + +/-- The adjoint action of the unquotiented Standard Model gauge group on the gluon + field strength. -/ +noncomputable def repGaugeGroupI : Representation ℝ GaugeGroupI GluonFieldStrength where + toFun := repGaugeGroupIAux + map_one' := by + ext F + simp [repGaugeGroupIAux] + map_mul' g₁ g₂ := by + ext1 F + simp [repGaugeGroupIAux, map_mul, adjointAction_mul, TensorProduct.map_map, + Module.End.mul_eq_comp] + +end GluonFieldStrength + +end StandardModel From 1b71959500780ffb2f38b1156002cd30837ed3f2 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 14:06:39 +0100 Subject: [PATCH 069/254] feat: Add Real bosons --- Physlib/Particles/LagrangianTheory/Basic.lean | 396 +++++++++++++++++- .../EFTLagrangianExclDeriv/Basic.lean | 25 +- .../EFTLagrangianFreeDeriv/Basic.lean | 89 ++++ 3 files changed, 492 insertions(+), 18 deletions(-) create mode 100644 Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 140d48e00..8477b4d6b 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -25,6 +25,8 @@ public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis public import Mathlib.Algebra.MvPolynomial.PDeriv public import Mathlib.LinearAlgebra.TensorAlgebra.Basis public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic +public import Physlib.Relativity.Tensors.RealTensor.CoVector.Representation +public import Physlib.Relativity.SL2C.Basic /-! # The Standard Model EFT Lagrangian without derivatives @@ -81,7 +83,7 @@ structure LagrangianTheory (G : Type) [Group G] where [realBosonModule_module : ∀ φ, Module ℝ (realBosonModule φ)] realBosonBasis : ∀ φ, Basis (RealBosonComponents φ) ℝ (realBosonModule φ) realBosonRepLorentzGroup : ∀ φ, Representation ℝ SL(2,ℂ) (realBosonModule φ) - realBosonRepGaugeGroup : ∀ φ, Representation ℝ G (complexScalarModule φ) + realBosonRepGaugeGroup : ∀ φ, Representation ℝ G (realBosonModule φ) namespace LagrangianTheory @@ -92,6 +94,9 @@ attribute [instance] fermionIrreps_fintype fermionIrreps_decEq complexScalarIrreps_fintype complexScalarIrreps_decEq complexScalarComponents_fintype complexScalarComponents_decEq complexScalarModule_addCommGroup complexScalarModule_module + realBosonIrreps_fintype realBosonIrreps_decEq + realBosonComponents_fintype realBosonComponents_decEq + realBosonModule_addCommGroup realBosonModule_module variable {G : Type} [Group G] @@ -711,7 +716,379 @@ noncomputable def ComplexScalarEFTFreeDeriv.repGaugeGroup : /-! -## C. General field generators +## C. Definitions related to real bosons + +The real bosonic fields (for example the field strengths of the gauge bosons) are +genuinely real, so unlike the fermions and complex scalars there is no conjugate +field, and every vector space and algebra below is taken over `ℝ`. + +-/ + +inductive RealBosonGenerator (L : LagrangianTheory G) + | of (φ : L.RealBosonIrreps) (α : L.RealBosonComponents φ) : L.RealBosonGenerator +deriving DecidableEq, Fintype + +def realBosonGeneratorEquiv : + L.RealBosonGenerator ≃ Σ φ : L.RealBosonIrreps, L.RealBosonComponents φ where + toFun g := match g with + | .of φ α => ⟨φ, α⟩ + invFun g := match g with + | ⟨φ, α⟩ => .of φ α + left_inv g := by cases g; rfl + right_inv g := by cases g; rfl + +inductive RealBosonDerivGenerator (L : LagrangianTheory G) + | of (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.RealBosonIrreps) (α : L.RealBosonComponents φ) : + L.RealBosonDerivGenerator + +def realBosonDerivGeneratorEquiv : L.RealBosonDerivGenerator ≃ + List (Fin 1 ⊕ Fin 3) × Σ φ : L.RealBosonIrreps, L.RealBosonComponents φ where + toFun g := match g with + | .of μ φ α => (μ, ⟨φ, α⟩) + invFun g := match g with + | (μ, ⟨φ, α⟩) => .of μ φ α + left_inv g := by cases g; rfl + right_inv g := by cases g; rfl + +/-! + +### C.1. The vector spaces of the real bosonic fields. + +-/ + +/-- The target vector space of the real bosonic fields. + + This vector space includes all the real bosonic fields appearing in the theory. -/ +abbrev RealBosonTargetSpace (L : LagrangianTheory G) := + Π (φ : L.RealBosonIrreps), L.realBosonModule φ + +/-- The target vector space of covariant derivatives of the real bosonic fields + e.g. ∇_μ B. Because covariant derivatives do not commute, the commutation is not + taken account of here. + + This vector space includes all the real bosonic fields in the theory + their + covariant derivatives. -/ +abbrev RealBosonDerivSpace (L : LagrangianTheory G) := + TensorAlgebra ℝ Lorentz.CoVector ⊗[ℝ] L.RealBosonTargetSpace + +/-- The real bosonic target space linearly embeds into the real bosonic target space + with derivatives. -/ +def RealBosonTargetSpace.toRealBosonDerivSpace {L : LagrangianTheory G} : + L.RealBosonTargetSpace →ₗ[ℝ] L.RealBosonDerivSpace := + TensorProduct.mk ℝ (TensorAlgebra ℝ Lorentz.CoVector) L.RealBosonTargetSpace 1 + +/-- The vector space dual to `RealBosonTargetSpace` and spanned by the component + functions of all the real bosonic fields in the theory. There is no conjugate + factor, since the fields are real. -/ +abbrev RealBosonComponentSpace (L : LagrangianTheory G) := + Module.Dual ℝ L.RealBosonTargetSpace + +/-- The vector space spanned by the component functions of all the real bosonic + fields + all their covariant derivatives in the theory. + + This is the *graded* dual of `RealBosonDerivSpace`: the duals of the + finite-dimensional building blocks are dualized individually and reassembled. -/ +abbrev RealBosonComponentSpaceWithDeriv (L : LagrangianTheory G) := + TensorAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) ⊗[ℝ] Module.Dual ℝ L.RealBosonTargetSpace + +/-! + +### C.2. The real bosonic algebras + +-/ + +/-- The EFT algebra spanned by the real bosonic fields in the theory. -/ +abbrev RealBosonEFTExclDeriv (L : LagrangianTheory G) := + SymmetricAlgebra ℝ L.RealBosonComponentSpace + +/-- The EFT algebra spanned by the real bosonic fields in the theory + all their + covariant derivatives without taking account of commutation of derivatives, or + total derivatives or equations of motion relations. -/ +abbrev RealBosonEFTFreeDeriv (L : LagrangianTheory G) := + SymmetricAlgebra ℝ L.RealBosonComponentSpaceWithDeriv + + +/-- The real bosonic EFT algebra with complex coefficients: the real bosonic EFT + algebra with scalars extended from `ℝ` to `ℂ`, so that it can be combined with the + complex scalar and fermionic algebras in the full EFT Lagrangian. -/ +abbrev RealBosonEFTExclDerivComplex (L : LagrangianTheory G) := ℂ ⊗[ℝ] L.RealBosonEFTExclDeriv + +/-- The real bosonic EFT algebra including covariant derivatives, with complex + coefficients: `RealBosonEFTFreeDeriv` with scalars extended from `ℝ` to `ℂ`, so + that it can be combined with the complex scalar and fermionic algebras in the full + EFT Lagrangian. -/ +abbrev RealBosonEFTFreeDerivComplex (L : LagrangianTheory G) := ℂ ⊗[ℝ] L.RealBosonEFTFreeDeriv + + +/-! + +### C.3. The basis of the real bosonic vector spaces + +-/ + +noncomputable def RealBosonComponentSpace.basis : + Basis L.RealBosonGenerator ℝ L.RealBosonComponentSpace := + (Pi.basis (fun φ => L.realBosonBasis φ)).dualBasis.reindex realBosonGeneratorEquiv.symm + +noncomputable def RealBosonComponentSpaceWithDeriv.basis : + Basis L.RealBosonDerivGenerator ℝ L.RealBosonComponentSpaceWithDeriv := + ((Lorentz.CoVector.basis.dualBasis.tensorAlgebra).tensorProduct + (Pi.basis fun φ => L.realBosonBasis φ).dualBasis).reindex + realBosonDerivGeneratorEquiv.symm + +/-! + +### C.4. The representation of the Lorentz group on real bosonic vector spaces and algebras + +-/ + +/-- The representation of the Lorentz group on the real Lorentz-covector derivative + slots, obtained from the real Lorentz-vector representation through the covering + map `SL(2,ℂ) →* LorentzGroup 3`. -/ +noncomputable def realBosonSlotRepLorentzGroup : Representation ℝ SL(2,ℂ) Lorentz.CoVector := + MonoidHom.comp Lorentz.CoVector.rep Lorentz.SL2C.toLorentzGroup + +/-- The representation of the Lorentz group on the tensor algebra of real covariant + derivative slots. -/ +noncomputable def realDerivAlgebraRepLorentzGroup : + Representation ℝ SL(2,ℂ) (TensorAlgebra ℝ Lorentz.CoVector) where + toFun Λ := (TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup Λ)).toLinearMap + map_one' := by + suffices h : TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup 1) = + AlgHom.id ℝ (TensorAlgebra ℝ Lorentz.CoVector) by + rw [h]; rfl + ext v + simp + map_mul' Λ1 Λ2 := by + suffices h : TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup (Λ1 * Λ2)) = + (TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup Λ1)).comp + (TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup Λ2)) by + rw [h]; rfl + ext v + simp [realBosonSlotRepLorentzGroup] + +/-- The representation of the Lorentz group on the tensor algebra of dual real + covariant derivative slots. -/ +noncomputable def dualRealDerivAlgebraRepLorentzGroup : + Representation ℝ SL(2,ℂ) (TensorAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) where + toFun Λ := (TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ)).toLinearMap + map_one' := by + suffices h : TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual 1) = + AlgHom.id ℝ (TensorAlgebra ℝ _) by + rw [h]; rfl + ext v + simp + rfl + map_mul' Λ1 Λ2 := by + suffices h : TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual (Λ1 * Λ2)) = + (TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ1)).comp + (TensorAlgebra.lift ℝ + (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ2)) by + rw [h]; rfl + ext v + simp + rfl + +def RealBosonTargetSpace.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonTargetSpace where + toFun Λ := LinearMap.piMap fun φ => L.realBosonRepLorentzGroup φ Λ + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' Λ1 Λ2 := by + ext x i y + simp + +/-- The representation of the Lorentz group on the covariant-derivative space of the + real bosonic fields: the tensor product of the action on the derivative slots and + the action on the real bosonic target space. -/ +noncomputable def RealBosonDerivSpace.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonDerivSpace := + realDerivAlgebraRepLorentzGroup.tprod RealBosonTargetSpace.repLorentzGroup + +noncomputable def RealBosonComponentSpace.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonComponentSpace := + RealBosonTargetSpace.repLorentzGroup.dual + +noncomputable def RealBosonComponentSpaceWithDeriv.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonComponentSpaceWithDeriv := + dualRealDerivAlgebraRepLorentzGroup.tprod RealBosonTargetSpace.repLorentzGroup.dual + +noncomputable def RealBosonEFTExclDeriv.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonEFTExclDeriv where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repLorentzGroup Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repLorentzGroup Λ2)) by + rw [h]; rfl + ext v + simp + +/-- The representation of the Lorentz group on the algebra `RealBosonEFTFreeDeriv`. -/ +noncomputable def RealBosonEFTFreeDeriv.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonEFTFreeDeriv where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ2)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + + +/-- The representation of the Lorentz group on the complexified real bosonic EFT + algebra, obtained from the real representation by extension of scalars and + transported to the wrapper type. -/ +noncomputable def RealBosonEFTExclDerivComplex.repLorentzGroup : + Representation ℂ SL(2,ℂ) (RealBosonEFTExclDerivComplex L) where + toFun Λ := + LinearMap.baseChange ℂ (RealBosonEFTExclDeriv.repLorentzGroup Λ) + map_one' := by + ext x + simp [Module.End.one_eq_id] + map_mul' Λ1 Λ2 := by + ext x + simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] + +/-- The representation of the Lorentz group on the complexified real bosonic EFT + algebra with derivatives, obtained from the real representation by extension of + scalars. -/ +noncomputable def RealBosonEFTFreeDerivComplex.repLorentzGroup : + Representation ℂ SL(2,ℂ) (RealBosonEFTFreeDerivComplex L) where + toFun Λ := + LinearMap.baseChange ℂ (RealBosonEFTFreeDeriv.repLorentzGroup Λ) + map_one' := by + ext x + simp [Module.End.one_eq_id] + map_mul' Λ1 Λ2 := by + ext x + simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] + + +/-! + +### C.5. The representation of the Gauge group on real bosonic vector spaces and algebras + +-/ + +def RealBosonTargetSpace.repGaugeGroup : + Representation ℝ G L.RealBosonTargetSpace where + toFun g := LinearMap.piMap fun φ => L.realBosonRepGaugeGroup φ g + map_one' := by + ext x i y + simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, + Function.comp_apply, Pi.map_apply, End.one_apply] + map_mul' g1 g2 := by + ext x i y + simp + +/-- The representation of the gauge group on the covariant-derivative space of the + real bosonic fields. The gauge group acts trivially on the derivative slots: this + is the statement that the derivatives are *covariant* derivatives, so that `∇ ⋯ ∇ B` + transforms in the same representation of the gauge group as `B` itself. -/ +noncomputable def RealBosonDerivSpace.repGaugeGroup : + Representation ℝ G L.RealBosonDerivSpace := + (Representation.trivial ℝ G (TensorAlgebra ℝ Lorentz.CoVector)).tprod + RealBosonTargetSpace.repGaugeGroup + +noncomputable def RealBosonComponentSpace.repGaugeGroup : + Representation ℝ G L.RealBosonComponentSpace := + RealBosonTargetSpace.repGaugeGroup.dual + +/-- The representation of the gauge group on the space of component functions of the + real bosonic fields and their covariant derivatives; trivial on the derivative + slots. -/ +noncomputable def RealBosonComponentSpaceWithDeriv.repGaugeGroup : + Representation ℝ G L.RealBosonComponentSpaceWithDeriv := + (Representation.trivial ℝ G (TensorAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector))).tprod + RealBosonTargetSpace.repGaugeGroup.dual + +noncomputable def RealBosonEFTExclDeriv.repGaugeGroup : + Representation ℝ G L.RealBosonEFTExclDeriv where + toFun g := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repGaugeGroup g)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' g1 g2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repGaugeGroup (g1 * g2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repGaugeGroup g1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpace.repGaugeGroup g2)) by + rw [h]; rfl + ext v + simp + +noncomputable def RealBosonEFTFreeDeriv.repGaugeGroup : + Representation ℝ G L.RealBosonEFTFreeDeriv where + toFun g := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' g1 g2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup (g1 * g2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g2)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + +noncomputable def RealBosonEFTExclDerivComplex.repGaugeGroup : + Representation ℂ G (RealBosonEFTExclDerivComplex L) where + toFun g := + LinearMap.baseChange ℂ (RealBosonEFTExclDeriv.repGaugeGroup g) + map_one' := by + ext x + simp [Module.End.one_eq_id] + map_mul' g1 g2 := by + ext x + simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] + +/-- The representation of the gauge group on the complexified real bosonic EFT + algebra with derivatives, obtained from the real representation by extension of + scalars. -/ +noncomputable def RealBosonEFTFreeDerivComplex.repGaugeGroup : + Representation ℂ G (RealBosonEFTFreeDerivComplex L) where + toFun g := + LinearMap.baseChange ℂ (RealBosonEFTFreeDeriv.repGaugeGroup g) + map_one' := by + ext x + simp [Module.End.one_eq_id] + map_mul' g1 g2 := by + ext x + simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] + +/-! + +## D. General field generators -/ @@ -719,36 +1096,29 @@ noncomputable def ComplexScalarEFTFreeDeriv.repGaugeGroup : inductive FieldGenerators (L : LagrangianTheory G) | cScalar (_ : L.ComplexScalarGenerator) : FieldGenerators L | fermion (_ : L.FermionicGenerator) : FieldGenerators L + | realBoson (_ : L.RealBosonGenerator) : FieldGenerators L deriving DecidableEq, Fintype def FieldGenerators.IsFermion : L.FieldGenerators → Bool | .cScalar _ => False | .fermion _ => True + | .realBoson _ => False def FieldGenerators.IsBoson : L.FieldGenerators → Bool | .cScalar _ => True | .fermion _ => False + | .realBoson _ => True def FieldGenerators.conjugate : L.FieldGenerators → L.FieldGenerators | .cScalar g => .cScalar g.conjugate | .fermion g => .fermion g.conjugate + | .realBoson g => .realBoson g @[simp] lemma FieldGenerators.conjugate_conjugate (ϕ : L.FieldGenerators) : ϕ.conjugate.conjugate = ϕ := by cases ϕ <;> simp [conjugate] -def fieldGeneratorsEquiv : L.FieldGenerators ≃ - L.ComplexScalarGenerator ⊕ L.FermionicGenerator where - toFun g := match g with - | .cScalar g => Sum.inl g - | .fermion g => Sum.inr g - invFun g := match g with - | Sum.inl g => .cScalar g - | Sum.inr g => .fermion g - left_inv g := by cases g <;> rfl - right_inv g := by cases g <;> rfl - @[simp] lemma FieldGenerators.cScalar_isFermion (ϕ : L.ComplexScalarGenerator) : (cScalar ϕ).IsFermion = False := by simp [IsFermion] diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean index 86e733d53..f80bff98c 100644 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean @@ -23,15 +23,28 @@ open TensorProduct Matrix MatrixGroups variable {G : Type} [Group G] +variable {L : LagrangianTheory G} + abbrev EFTLagrangianExclDeriv (L : LagrangianTheory G) : Type := - -- bosonic part of the lagrangian + -- complex scalar part of the lagrangian L.ComplexScalarEFTExclDeriv ⊗[ℂ] - -- fermionic part of the lagrangian - L.FermionicEFTExclDeriv + L.RealBosonEFTExclDerivComplex ⊗[ℂ] L.FermionicEFTExclDeriv namespace EFTLagrangianExclDeriv variable {L : LagrangianTheory G} + + +set_option maxSynthPendingDepth 4 in +noncomputable instance : Ring (L.EFTLagrangianExclDeriv) := inferInstanceAs <| + Ring (L.ComplexScalarEFTExclDeriv ⊗[ℂ] + L.RealBosonEFTExclDerivComplex ⊗[ℂ] L.FermionicEFTExclDeriv) + +set_option maxSynthPendingDepth 4 in +noncomputable instance : Algebra ℂ (L.EFTLagrangianExclDeriv) := inferInstanceAs <| + Algebra ℂ (L.ComplexScalarEFTExclDeriv ⊗[ℂ] + L.RealBosonEFTExclDerivComplex ⊗[ℂ] L.FermionicEFTExclDeriv) + /-! ## A. The invariance conditions @@ -44,8 +57,10 @@ variable {L : LagrangianTheory G} -/ -noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) L.EFTLagrangianExclDeriv := - (ComplexScalarEFTExclDeriv.repLorentzGroup).tprod (FermionicEFTExclDeriv.repLorentzGroup) +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) L.EFTLagrangianExclDeriv := + ((ComplexScalarEFTExclDeriv.repLorentzGroup (L := L)).tprod + (RealBosonEFTExclDerivComplex.repLorentzGroup (L := L))).tprod + (FermionicEFTExclDeriv.repLorentzGroup (L := L)) end EFTLagrangianExclDeriv diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean new file mode 100644 index 000000000..a37aacf05 --- /dev/null +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan +-/ +module + +public import Physlib.Particles.LagrangianTheory.Basic + +/-! + +# The Standard Model EFT Lagrangian with derivatives + +## i. Overview + +-/ + +@[expose] public section + +namespace LagrangianTheory + +open TensorProduct Matrix MatrixGroups + +variable {G : Type} [Group G] + + +variable {L : LagrangianTheory G} + +abbrev EFTLagrangianFreeDeriv (L : LagrangianTheory G) : Type := + -- complex scalar part of the lagrangian + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] + L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv + + +#synth Ring L.EFTLagrangianFreeDeriv +namespace EFTLagrangianExclDeriv + +variable {L : LagrangianTheory G} +/-! + +## A. The invariance conditions + +-/ + +/-! + +### A.1. The representation + +We define the representation of the Lorentz group on the full algebra. + +-/ + +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) L.EFTLagrangianFreeDeriv := + ((ComplexScalarEFTFreeDeriv.repLorentzGroup (L := L)).tprod + (RealBosonEFTFreeDerivComplex.repLorentzGroup (L := L))).tprod + (FermionicEFTFreeDeriv.repLorentzGroup (L := L)) + +lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : L.EFTLagrangianFreeDeriv) : + repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := + map_mul (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) + (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) V W + +@[simp] +lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ 1 = 1 := + map_one (Algebra.TensorProduct.map + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) + (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) + + +noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianFreeDeriv := + ((ComplexScalarEFTFreeDeriv.repGaugeGroup (L := L)).tprod + (RealBosonEFTFreeDerivComplex.repGaugeGroup (L := L))).tprod + (FermionicEFTFreeDeriv.repGaugeGroup (L := L)) + +/-! + +### A.2. The IsInvariant condition + +-/ + + + +end EFTLagrangianExclDeriv + +end LagrangianTheory From 5e93a275e8df60a18accdc84baf091eae94421e3 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 30 Jul 2026 14:39:12 +0100 Subject: [PATCH 070/254] feat: Start liftLinear --- .../EFTLagrangianExclDeriv/Basic.lean | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean index be5002ae4..93b7b509f 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -942,4 +942,30 @@ lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : | add b₁ b₂ h₁ h₂ => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ h₁ h₂ simpa using hmul_mem _ _ h1 h2 +/-- The linear map `EFTLagrangianExclDeriv →ₗ[ℂ] A` determined by the values `F l` on + the spanning terms `termOfList l`, provided `F` respects the scaling relations that + hold among the terms. -/ +noncomputable def liftLinear {A : Type} [Ring A] [Algebra ℂ A] (F : List FieldGenerators → A) + (hscale : ∀ (l1 l2 : List FieldGenerators) (c : ℂ), + termOfList l1 = c • termOfList l2 → F l1 = c • F l2) : + EFTLagrangianExclDeriv →ₗ[ℂ] A := + let π : (List FieldGenerators →₀ ℂ) →ₗ[ℂ] EFTLagrangianExclDeriv := + Finsupp.linearCombination ℂ termOfList + let φ : (List FieldGenerators →₀ ℂ) →ₗ[ℂ] A := + Finsupp.linearCombination ℂ F + have hπ : Function.Surjective π := + LinearMap.range_eq_top.mp (by + rw [Finsupp.range_linearCombination, eq_top_iff] + exact fun V _ => mem_termOfList_span V) + have hker : LinearMap.ker π ≤ LinearMap.ker φ := by + + sorry + ((LinearMap.ker π).liftQ φ hker).comp (π.quotKerEquivOfSurjective hπ).symm.toLinearMap + +lemma liftLinear_of_eq (A : Type) [Ring A] [Algebra ℂ A] (F : List FieldGenerators → A) + (hscale : ∀ (l1 l2 : List FieldGenerators) (c : ℂ), + termOfList l1 = c • termOfList l2 → F l1 = c • F l2) (l : List FieldGenerators) : + liftLinear F hscale (termOfList l) = F l := by + simp [liftLinear] + end EFTLagrangianExclDeriv From a9a770f696ebf417623bb8d45793a2edd35bfe64 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 31 Jul 2026 20:49:18 +0400 Subject: [PATCH 071/254] Add the Lorentz algebra action on free-derivative Lagrangians --- .../EFTLagrangianFreeDeriv/Basic.lean | 166 +++++++++++++++--- 1 file changed, 137 insertions(+), 29 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean index a37aacf05..3792d1f53 100644 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean @@ -9,10 +9,15 @@ public import Physlib.Particles.LagrangianTheory.Basic /-! -# The Standard Model EFT Lagrangian with derivatives +# The EFT Lagrangian with free derivatives ## i. Overview +For a Lagrangian theory, this file defines the algebra of complex-scalar, real-boson, and +fermionic expressions with arbitrarily many derivatives. It also bundles the Lorentz action as an +algebra homomorphism and proves that the existing tensor-product representation preserves +multiplication and the unit. + -/ @[expose] public section @@ -21,69 +26,172 @@ namespace LagrangianTheory open TensorProduct Matrix MatrixGroups -variable {G : Type} [Group G] - +noncomputable section +variable {G : Type} [Group G] variable {L : LagrangianTheory G} -abbrev EFTLagrangianFreeDeriv (L : LagrangianTheory G) : Type := - -- complex scalar part of the lagrangian +/-- The algebra of Lagrangian expressions whose derivative-decorated fields remain freely +generated. -/ +abbrev EFTLagrangianFreeDeriv (L : LagrangianTheory G) : Type := L.ComplexScalarEFTFreeDeriv ⊗[ℂ] - L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv + L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv +namespace EFTLagrangianFreeDeriv -#synth Ring L.EFTLagrangianFreeDeriv -namespace EFTLagrangianExclDeriv +set_option maxSynthPendingDepth 4 in +noncomputable instance : Ring L.EFTLagrangianFreeDeriv := inferInstanceAs <| + Ring (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] + L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv) + +set_option maxSynthPendingDepth 4 in +noncomputable instance : Algebra ℂ L.EFTLagrangianFreeDeriv := inferInstanceAs <| + Algebra ℂ (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] + L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv) -variable {L : LagrangianTheory G} /-! -## A. The invariance conditions +## A. Lorentz-group action + +### A.1. Algebra homomorphisms -/ -/-! +/-- The Lorentz action on the complex-scalar factor as an algebra homomorphism. -/ +noncomputable def complexScalarLorentzAlgHom (Λ : SL(2,ℂ)) : + L.ComplexScalarEFTFreeDeriv →ₐ[ℂ] L.ComplexScalarEFTFreeDeriv := + SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ) + +/-- The Lorentz action on the fermionic factor as an algebra homomorphism. -/ +noncomputable def fermionicLorentzAlgHom (Λ : SL(2,ℂ)) : + L.FermionicEFTFreeDeriv →ₐ[ℂ] L.FermionicEFTFreeDeriv := + ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repLorentzGroup Λ) + +/-- The Lorentz action on the real-boson factor as a real algebra homomorphism. -/ +noncomputable def realBosonLorentzAlgHom (Λ : SL(2,ℂ)) : + L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDeriv := + SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ) + +/-- The scalar extension of the real-boson Lorentz action as a complex algebra homomorphism. -/ +noncomputable def realBosonComplexLorentzAlgHom (Λ : SL(2,ℂ)) : + L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] L.RealBosonEFTFreeDerivComplex := + (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTFreeDeriv L.RealBosonEFTFreeDerivComplex) + ((Algebra.TensorProduct.includeRight : + L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDerivComplex).comp + (realBosonLorentzAlgHom Λ)) + +/-- The Lorentz action on the bosonic factors as an algebra homomorphism. -/ +noncomputable def bosonicLorentzAlgHom (Λ : SL(2,ℂ)) : + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := + Algebra.TensorProduct.map (complexScalarLorentzAlgHom Λ) (realBosonComplexLorentzAlgHom Λ) + +/-- The Lorentz action on the free-derivative Lagrangian as an algebra homomorphism. -/ +noncomputable def lorentzAlgHom (Λ : SL(2,ℂ)) : + L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := + Algebra.TensorProduct.map (bosonicLorentzAlgHom Λ) (fermionicLorentzAlgHom Λ) -### A.1. The representation +/-! -We define the representation of the Lorentz group on the full algebra. +### A.2. Representation and compatibility -/ -noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) L.EFTLagrangianFreeDeriv := +/-- The representation of the Lorentz group on the free-derivative Lagrangian. -/ +noncomputable def repLorentzGroup : + Representation ℂ SL(2,ℂ) L.EFTLagrangianFreeDeriv := ((ComplexScalarEFTFreeDeriv.repLorentzGroup (L := L)).tprod (RealBosonEFTFreeDerivComplex.repLorentzGroup (L := L))).tprod (FermionicEFTFreeDeriv.repLorentzGroup (L := L)) +private lemma complexScalar_repLorentzGroup_apply (Λ : SL(2,ℂ)) + (x : L.ComplexScalarEFTFreeDeriv) : + ComplexScalarEFTFreeDeriv.repLorentzGroup Λ x = complexScalarLorentzAlgHom Λ x := rfl + +private lemma fermionic_repLorentzGroup_apply (Λ : SL(2,ℂ)) + (x : L.FermionicEFTFreeDeriv) : + FermionicEFTFreeDeriv.repLorentzGroup Λ x = fermionicLorentzAlgHom Λ x := rfl + +private lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) + (x : L.RealBosonEFTFreeDerivComplex) : + RealBosonEFTFreeDerivComplex.repLorentzGroup Λ x = + realBosonComplexLorentzAlgHom Λ x := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul c x => + change c ⊗ₜ[ℝ] realBosonLorentzAlgHom Λ x = + c • (1 ⊗ₜ[ℝ] realBosonLorentzAlgHom Λ x) + exact TensorProduct.tmul_eq_smul_one_tmul c _ + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + +private lemma bosonic_repLorentzGroup_apply (Λ : SL(2,ℂ)) + (x : L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) : + ((ComplexScalarEFTFreeDeriv.repLorentzGroup (L := L)).tprod + (RealBosonEFTFreeDerivComplex.repLorentzGroup (L := L))) Λ x = + bosonicLorentzAlgHom Λ x := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul x y => + simp only [Representation.tprod_apply, TensorProduct.map_tmul] + rw [complexScalar_repLorentzGroup_apply, realBosonComplex_repLorentzGroup_apply] + simp [bosonicLorentzAlgHom] + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + +/-- The tensor-product Lorentz representation agrees with its algebra homomorphism. -/ +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : L.EFTLagrangianFreeDeriv) : + repLorentzGroup Λ x = lorentzAlgHom Λ x := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul x y => + simp only [repLorentzGroup, Representation.tprod_apply, TensorProduct.map_tmul] + have hx := bosonic_repLorentzGroup_apply (L := L) Λ x + simp only [Representation.tprod_apply] at hx + rw [hx, fermionic_repLorentzGroup_apply] + simp [lorentzAlgHom] + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + +/-- The Lorentz representation preserves multiplication. -/ lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : L.EFTLagrangianFreeDeriv) : - repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := - map_mul (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) - (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) V W - + repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := by + calc + repLorentzGroup Λ (V * W) = lorentzAlgHom Λ (V * W) := repLorentzGroup_apply Λ _ + _ = lorentzAlgHom Λ V * lorentzAlgHom Λ W := map_mul _ _ _ + _ = repLorentzGroup Λ V * repLorentzGroup Λ W := + congrArg₂ (· * ·) (repLorentzGroup_apply Λ V).symm + (repLorentzGroup_apply Λ W).symm + +/-- The Lorentz representation preserves the unit. -/ @[simp] lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : - repLorentzGroup Λ 1 = 1 := - map_one (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) - (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) + repLorentzGroup (L := L) Λ 1 = 1 := by + calc + repLorentzGroup (L := L) Λ 1 = lorentzAlgHom Λ 1 := repLorentzGroup_apply Λ _ + _ = 1 := map_one _ + +/-! +## B. Gauge-group action -noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianFreeDeriv := +-/ + +/-- The representation of the gauge group on the free-derivative Lagrangian. -/ +noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianFreeDeriv := ((ComplexScalarEFTFreeDeriv.repGaugeGroup (L := L)).tprod (RealBosonEFTFreeDerivComplex.repGaugeGroup (L := L))).tprod (FermionicEFTFreeDeriv.repGaugeGroup (L := L)) /-! -### A.2. The IsInvariant condition +## C. The `IsInvariant` condition --/ +This section is reserved for the predicate expressing simultaneous Lorentz and gauge invariance. +-/ +end EFTLagrangianFreeDeriv -end EFTLagrangianExclDeriv +end end LagrangianTheory From 65c3f5c43bd87e4917d816af077b6427088c5800 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 31 Jul 2026 20:52:28 +0400 Subject: [PATCH 072/254] Add the gauge algebra action on free-derivative Lagrangians --- .../EFTLagrangianFreeDeriv/Basic.lean | 112 +++++++++++++++++- 1 file changed, 109 insertions(+), 3 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean index 3792d1f53..752efd03d 100644 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean @@ -14,9 +14,9 @@ public import Physlib.Particles.LagrangianTheory.Basic ## i. Overview For a Lagrangian theory, this file defines the algebra of complex-scalar, real-boson, and -fermionic expressions with arbitrarily many derivatives. It also bundles the Lorentz action as an -algebra homomorphism and proves that the existing tensor-product representation preserves -multiplication and the unit. +fermionic expressions with arbitrarily many derivatives. It also bundles the Lorentz and gauge +actions as algebra homomorphisms and proves that the existing tensor-product representations +preserve multiplication and the unit. -/ @@ -174,6 +174,50 @@ lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : ## B. Gauge-group action +### B.1. Algebra homomorphisms + +-/ + +/-- The gauge action on the complex-scalar factor as an algebra homomorphism. -/ +noncomputable def complexScalarGaugeAlgHom (g : G) : + L.ComplexScalarEFTFreeDeriv →ₐ[ℂ] L.ComplexScalarEFTFreeDeriv := + SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g) + +/-- The gauge action on the fermionic factor as an algebra homomorphism. -/ +noncomputable def fermionicGaugeAlgHom (g : G) : + L.FermionicEFTFreeDeriv →ₐ[ℂ] L.FermionicEFTFreeDeriv := + ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repGaugeGroup g) + +/-- The gauge action on the real-boson factor as a real algebra homomorphism. -/ +noncomputable def realBosonGaugeAlgHom (g : G) : + L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDeriv := + SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g) + +/-- The scalar extension of the real-boson gauge action as a complex algebra homomorphism. -/ +noncomputable def realBosonComplexGaugeAlgHom (g : G) : + L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] L.RealBosonEFTFreeDerivComplex := + (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTFreeDeriv L.RealBosonEFTFreeDerivComplex) + ((Algebra.TensorProduct.includeRight : + L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDerivComplex).comp + (realBosonGaugeAlgHom g)) + +/-- The gauge action on the bosonic factors as an algebra homomorphism. -/ +noncomputable def bosonicGaugeAlgHom (g : G) : + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := + Algebra.TensorProduct.map (complexScalarGaugeAlgHom g) (realBosonComplexGaugeAlgHom g) + +/-- The gauge action on the free-derivative Lagrangian as an algebra homomorphism. -/ +noncomputable def gaugeAlgHom (g : G) : + L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := + Algebra.TensorProduct.map (bosonicGaugeAlgHom g) (fermionicGaugeAlgHom g) + +/-! + +### B.2. Representation and compatibility + -/ /-- The representation of the gauge group on the free-derivative Lagrangian. -/ @@ -182,6 +226,68 @@ noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianFreeDeriv (RealBosonEFTFreeDerivComplex.repGaugeGroup (L := L))).tprod (FermionicEFTFreeDeriv.repGaugeGroup (L := L)) +private lemma complexScalar_repGaugeGroup_apply (g : G) + (x : L.ComplexScalarEFTFreeDeriv) : + ComplexScalarEFTFreeDeriv.repGaugeGroup g x = complexScalarGaugeAlgHom g x := rfl + +private lemma fermionic_repGaugeGroup_apply (g : G) (x : L.FermionicEFTFreeDeriv) : + FermionicEFTFreeDeriv.repGaugeGroup g x = fermionicGaugeAlgHom g x := rfl + +private lemma realBosonComplex_repGaugeGroup_apply (g : G) + (x : L.RealBosonEFTFreeDerivComplex) : + RealBosonEFTFreeDerivComplex.repGaugeGroup g x = + realBosonComplexGaugeAlgHom g x := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul c x => + change c ⊗ₜ[ℝ] realBosonGaugeAlgHom g x = + c • (1 ⊗ₜ[ℝ] realBosonGaugeAlgHom g x) + exact TensorProduct.tmul_eq_smul_one_tmul c _ + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + +private lemma bosonic_repGaugeGroup_apply (g : G) + (x : L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) : + ((ComplexScalarEFTFreeDeriv.repGaugeGroup (L := L)).tprod + (RealBosonEFTFreeDerivComplex.repGaugeGroup (L := L))) g x = + bosonicGaugeAlgHom g x := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul x y => + simp only [Representation.tprod_apply, TensorProduct.map_tmul] + rw [complexScalar_repGaugeGroup_apply, realBosonComplex_repGaugeGroup_apply] + simp [bosonicGaugeAlgHom] + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + +/-- The tensor-product gauge representation agrees with its algebra homomorphism. -/ +lemma repGaugeGroup_apply (g : G) (x : L.EFTLagrangianFreeDeriv) : + repGaugeGroup g x = gaugeAlgHom g x := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul x y => + simp only [repGaugeGroup, Representation.tprod_apply, TensorProduct.map_tmul] + have hx := bosonic_repGaugeGroup_apply (L := L) g x + simp only [Representation.tprod_apply] at hx + rw [hx, fermionic_repGaugeGroup_apply] + simp [gaugeAlgHom] + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + +/-- The gauge representation preserves multiplication. -/ +lemma repGaugeGroup_mul (g : G) (V W : L.EFTLagrangianFreeDeriv) : + repGaugeGroup g (V * W) = repGaugeGroup g V * repGaugeGroup g W := by + calc + repGaugeGroup g (V * W) = gaugeAlgHom g (V * W) := repGaugeGroup_apply g _ + _ = gaugeAlgHom g V * gaugeAlgHom g W := map_mul _ _ _ + _ = repGaugeGroup g V * repGaugeGroup g W := + congrArg₂ (· * ·) (repGaugeGroup_apply g V).symm + (repGaugeGroup_apply g W).symm + +/-- The gauge representation preserves the unit. -/ +@[simp] +lemma repGaugeGroup_one (g : G) : repGaugeGroup (L := L) g 1 = 1 := by + calc + repGaugeGroup (L := L) g 1 = gaugeAlgHom g 1 := repGaugeGroup_apply g _ + _ = 1 := map_one _ + /-! ## C. The `IsInvariant` condition From a9b5f9fbfb5714f15347431b25af78b06d90e02e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 1 Aug 2026 01:17:43 +0400 Subject: [PATCH 073/254] refactor: define free-derivative symmetries by algebra automorphisms I realized that using algebra automorphisms would be a useful upgrade to the API. I wanted to keep this refactor localized, so with help from ChatGPT 5.6 Sol I reworked my previous two commits without changing any other files. The current implementation constructs the automorphism actions from the existing sector representations and their compatible algebra homomorphisms. Eventually, I would like to construct these automorphisms directly by lifting the generator representations. Co-authored-by: ChatGPT 5.6 Sol --- .../EFTLagrangianFreeDeriv/Basic.lean | 310 ++++++++++-------- 1 file changed, 175 insertions(+), 135 deletions(-) diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean index 752efd03d..96e3635c7 100644 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean @@ -14,9 +14,8 @@ public import Physlib.Particles.LagrangianTheory.Basic ## i. Overview For a Lagrangian theory, this file defines the algebra of complex-scalar, real-boson, and -fermionic expressions with arbitrarily many derivatives. It also bundles the Lorentz and gauge -actions as algebra homomorphisms and proves that the existing tensor-product representations -preserve multiplication and the unit. +fermionic expressions with arbitrarily many derivatives. It defines the Lorentz and gauge actions +as algebra automorphisms and gives their corresponding linear representations. -/ @@ -28,11 +27,66 @@ open TensorProduct Matrix MatrixGroups noncomputable section +variable {R H A : Type*} [CommSemiring R] [Group H] [Semiring A] [Algebra R A] + +/-- Promote algebra endomorphisms agreeing with a linear representation to a group action by +algebra automorphisms. -/ +def algAutOfRepresentation (ρ : Representation R H A) (φ : H → A →ₐ[R] A) + (h : ∀ g x, ρ g x = φ g x) : H →* A ≃ₐ[R] A where + toFun g := + { φ g with + invFun := φ g⁻¹ + left_inv := fun x => by + change φ g⁻¹ (φ g x) = x + rw [← h g x, ← h g⁻¹ (ρ g x)] + change (ρ g⁻¹ * ρ g) x = x + rw [← ρ.map_mul] + simp + right_inv := fun x => by + change φ g (φ g⁻¹ x) = x + rw [← h g⁻¹ x, ← h g (ρ g⁻¹ x)] + change (ρ g * ρ g⁻¹) x = x + rw [← ρ.map_mul] + simp } + map_one' := by + apply AlgEquiv.ext + intro x + change φ 1 x = x + rw [← h 1 x] + simp + map_mul' g₁ g₂ := by + apply AlgEquiv.ext + intro x + change φ (g₁ * g₂) x = φ g₁ (φ g₂ x) + rw [← h (g₁ * g₂) x, ← h g₂ x, ← h g₁ (ρ g₂ x)] + change ρ (g₁ * g₂) x = (ρ g₁ * ρ g₂) x + rw [ρ.map_mul] + +/-- Combine algebra-automorphism actions on two factors into an action on their tensor-product +algebra. -/ +def tensorProductAlgAut {B : Type*} [Semiring B] [Algebra R B] + (σA : H →* A ≃ₐ[R] A) (σB : H →* B ≃ₐ[R] B) : + H →* ((A ⊗[R] B) ≃ₐ[R] (A ⊗[R] B)) where + toFun g := Algebra.TensorProduct.congr (σA g) (σB g) + map_one' := by + apply AlgEquiv.ext + intro x + induction x using TensorProduct.induction_on with + | zero => simp + | tmul a b => simp + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + map_mul' g₁ g₂ := by + apply AlgEquiv.ext + intro x + induction x using TensorProduct.induction_on with + | zero => simp + | tmul a b => simp + | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + variable {G : Type} [Group G] variable {L : LagrangianTheory G} -/-- The algebra of Lagrangian expressions whose derivative-decorated fields remain freely -generated. -/ +/-- The algebra of Lagrangian expressions freely generated by fields and their derivatives. -/ abbrev EFTLagrangianFreeDeriv (L : LagrangianTheory G) : Type := L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv @@ -53,7 +107,7 @@ noncomputable instance : Algebra ℂ L.EFTLagrangianFreeDeriv := inferInstanceAs ## A. Lorentz-group action -### A.1. Algebra homomorphisms +### A.1. Actions on the factors -/ @@ -63,11 +117,23 @@ noncomputable def complexScalarLorentzAlgHom (Λ : SL(2,ℂ)) : SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ) +/-- The Lorentz action on the complex-scalar factor by algebra automorphisms. -/ +noncomputable def complexScalarLorentzAlgAut : + SL(2,ℂ) →* (L.ComplexScalarEFTFreeDeriv ≃ₐ[ℂ] L.ComplexScalarEFTFreeDeriv) := + algAutOfRepresentation ComplexScalarEFTFreeDeriv.repLorentzGroup + complexScalarLorentzAlgHom fun _ _ => rfl + /-- The Lorentz action on the fermionic factor as an algebra homomorphism. -/ noncomputable def fermionicLorentzAlgHom (Λ : SL(2,ℂ)) : L.FermionicEFTFreeDeriv →ₐ[ℂ] L.FermionicEFTFreeDeriv := ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repLorentzGroup Λ) +/-- The Lorentz action on the fermionic factor by algebra automorphisms. -/ +noncomputable def fermionicLorentzAlgAut : + SL(2,ℂ) →* (L.FermionicEFTFreeDeriv ≃ₐ[ℂ] L.FermionicEFTFreeDeriv) := + algAutOfRepresentation FermionicEFTFreeDeriv.repLorentzGroup + fermionicLorentzAlgHom fun _ _ => rfl + /-- The Lorentz action on the real-boson factor as a real algebra homomorphism. -/ noncomputable def realBosonLorentzAlgHom (Λ : SL(2,ℂ)) : L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDeriv := @@ -82,39 +148,8 @@ noncomputable def realBosonComplexLorentzAlgHom (Λ : SL(2,ℂ)) : L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDerivComplex).comp (realBosonLorentzAlgHom Λ)) -/-- The Lorentz action on the bosonic factors as an algebra homomorphism. -/ -noncomputable def bosonicLorentzAlgHom (Λ : SL(2,ℂ)) : - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := - Algebra.TensorProduct.map (complexScalarLorentzAlgHom Λ) (realBosonComplexLorentzAlgHom Λ) - -/-- The Lorentz action on the free-derivative Lagrangian as an algebra homomorphism. -/ -noncomputable def lorentzAlgHom (Λ : SL(2,ℂ)) : - L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := - Algebra.TensorProduct.map (bosonicLorentzAlgHom Λ) (fermionicLorentzAlgHom Λ) - -/-! - -### A.2. Representation and compatibility - --/ - -/-- The representation of the Lorentz group on the free-derivative Lagrangian. -/ -noncomputable def repLorentzGroup : - Representation ℂ SL(2,ℂ) L.EFTLagrangianFreeDeriv := - ((ComplexScalarEFTFreeDeriv.repLorentzGroup (L := L)).tprod - (RealBosonEFTFreeDerivComplex.repLorentzGroup (L := L))).tprod - (FermionicEFTFreeDeriv.repLorentzGroup (L := L)) - -private lemma complexScalar_repLorentzGroup_apply (Λ : SL(2,ℂ)) - (x : L.ComplexScalarEFTFreeDeriv) : - ComplexScalarEFTFreeDeriv.repLorentzGroup Λ x = complexScalarLorentzAlgHom Λ x := rfl - -private lemma fermionic_repLorentzGroup_apply (Λ : SL(2,ℂ)) - (x : L.FermionicEFTFreeDeriv) : - FermionicEFTFreeDeriv.repLorentzGroup Λ x = fermionicLorentzAlgHom Λ x := rfl - -private lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) +/-- The complexified real-boson Lorentz representation agrees with its algebra homomorphism. -/ +lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : L.RealBosonEFTFreeDerivComplex) : RealBosonEFTFreeDerivComplex.repLorentzGroup Λ x = realBosonComplexLorentzAlgHom Λ x := by @@ -126,55 +161,67 @@ private lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) exact TensorProduct.tmul_eq_smul_one_tmul c _ | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy -private lemma bosonic_repLorentzGroup_apply (Λ : SL(2,ℂ)) - (x : L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) : - ((ComplexScalarEFTFreeDeriv.repLorentzGroup (L := L)).tprod - (RealBosonEFTFreeDerivComplex.repLorentzGroup (L := L))) Λ x = - bosonicLorentzAlgHom Λ x := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul x y => - simp only [Representation.tprod_apply, TensorProduct.map_tmul] - rw [complexScalar_repLorentzGroup_apply, realBosonComplex_repLorentzGroup_apply] - simp [bosonicLorentzAlgHom] - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy +/-- The Lorentz action on the complexified real-boson factor by algebra automorphisms. -/ +noncomputable def realBosonComplexLorentzAlgAut : + SL(2,ℂ) →* + (L.RealBosonEFTFreeDerivComplex ≃ₐ[ℂ] L.RealBosonEFTFreeDerivComplex) := + algAutOfRepresentation RealBosonEFTFreeDerivComplex.repLorentzGroup + realBosonComplexLorentzAlgHom realBosonComplex_repLorentzGroup_apply + +/-! + +### A.2. The full action and its representation + +-/ + +/-- The Lorentz action on the two bosonic factors by algebra automorphisms. -/ +noncomputable def bosonicLorentzAlgAut : + SL(2,ℂ) →* + ((L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) ≃ₐ[ℂ] + (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex)) := + tensorProductAlgAut complexScalarLorentzAlgAut realBosonComplexLorentzAlgAut + +/-- The Lorentz action on the bosonic factors as an algebra homomorphism. -/ +noncomputable def bosonicLorentzAlgHom (Λ : SL(2,ℂ)) : + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := + (bosonicLorentzAlgAut Λ).toAlgHom + +/-- The Lorentz action on the free-derivative Lagrangian by algebra automorphisms. -/ +noncomputable def lorentzAlgAut : + SL(2,ℂ) →* (L.EFTLagrangianFreeDeriv ≃ₐ[ℂ] L.EFTLagrangianFreeDeriv) := + tensorProductAlgAut bosonicLorentzAlgAut fermionicLorentzAlgAut + +/-- The action of a Lorentz-group element as an algebra homomorphism. -/ +noncomputable def lorentzAlgHom (Λ : SL(2,ℂ)) : + L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := + (lorentzAlgAut Λ).toAlgHom -/-- The tensor-product Lorentz representation agrees with its algebra homomorphism. -/ +/-- The representation of the Lorentz group underlying its algebra-automorphism action. -/ +noncomputable def repLorentzGroup : + Representation ℂ SL(2,ℂ) L.EFTLagrangianFreeDeriv := + (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianFreeDeriv).comp lorentzAlgAut + +/-- The Lorentz representation agrees with its algebra homomorphism. -/ lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : L.EFTLagrangianFreeDeriv) : - repLorentzGroup Λ x = lorentzAlgHom Λ x := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul x y => - simp only [repLorentzGroup, Representation.tprod_apply, TensorProduct.map_tmul] - have hx := bosonic_repLorentzGroup_apply (L := L) Λ x - simp only [Representation.tprod_apply] at hx - rw [hx, fermionic_repLorentzGroup_apply] - simp [lorentzAlgHom] - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + repLorentzGroup Λ x = lorentzAlgHom Λ x := rfl /-- The Lorentz representation preserves multiplication. -/ lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : L.EFTLagrangianFreeDeriv) : repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := by - calc - repLorentzGroup Λ (V * W) = lorentzAlgHom Λ (V * W) := repLorentzGroup_apply Λ _ - _ = lorentzAlgHom Λ V * lorentzAlgHom Λ W := map_mul _ _ _ - _ = repLorentzGroup Λ V * repLorentzGroup Λ W := - congrArg₂ (· * ·) (repLorentzGroup_apply Λ V).symm - (repLorentzGroup_apply Λ W).symm + simpa only [repLorentzGroup_apply] using map_mul (lorentzAlgHom Λ) V W /-- The Lorentz representation preserves the unit. -/ @[simp] lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : repLorentzGroup (L := L) Λ 1 = 1 := by - calc - repLorentzGroup (L := L) Λ 1 = lorentzAlgHom Λ 1 := repLorentzGroup_apply Λ _ - _ = 1 := map_one _ + simpa only [repLorentzGroup_apply] using map_one (lorentzAlgHom (L := L) Λ) /-! ## B. Gauge-group action -### B.1. Algebra homomorphisms +### B.1. Actions on the factors -/ @@ -184,11 +231,23 @@ noncomputable def complexScalarGaugeAlgHom (g : G) : SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g) +/-- The gauge action on the complex-scalar factor by algebra automorphisms. -/ +noncomputable def complexScalarGaugeAlgAut : + G →* (L.ComplexScalarEFTFreeDeriv ≃ₐ[ℂ] L.ComplexScalarEFTFreeDeriv) := + algAutOfRepresentation ComplexScalarEFTFreeDeriv.repGaugeGroup + complexScalarGaugeAlgHom fun _ _ => rfl + /-- The gauge action on the fermionic factor as an algebra homomorphism. -/ noncomputable def fermionicGaugeAlgHom (g : G) : L.FermionicEFTFreeDeriv →ₐ[ℂ] L.FermionicEFTFreeDeriv := ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repGaugeGroup g) +/-- The gauge action on the fermionic factor by algebra automorphisms. -/ +noncomputable def fermionicGaugeAlgAut : + G →* (L.FermionicEFTFreeDeriv ≃ₐ[ℂ] L.FermionicEFTFreeDeriv) := + algAutOfRepresentation FermionicEFTFreeDeriv.repGaugeGroup + fermionicGaugeAlgHom fun _ _ => rfl + /-- The gauge action on the real-boson factor as a real algebra homomorphism. -/ noncomputable def realBosonGaugeAlgHom (g : G) : L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDeriv := @@ -203,37 +262,8 @@ noncomputable def realBosonComplexGaugeAlgHom (g : G) : L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDerivComplex).comp (realBosonGaugeAlgHom g)) -/-- The gauge action on the bosonic factors as an algebra homomorphism. -/ -noncomputable def bosonicGaugeAlgHom (g : G) : - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := - Algebra.TensorProduct.map (complexScalarGaugeAlgHom g) (realBosonComplexGaugeAlgHom g) - -/-- The gauge action on the free-derivative Lagrangian as an algebra homomorphism. -/ -noncomputable def gaugeAlgHom (g : G) : - L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := - Algebra.TensorProduct.map (bosonicGaugeAlgHom g) (fermionicGaugeAlgHom g) - -/-! - -### B.2. Representation and compatibility - --/ - -/-- The representation of the gauge group on the free-derivative Lagrangian. -/ -noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianFreeDeriv := - ((ComplexScalarEFTFreeDeriv.repGaugeGroup (L := L)).tprod - (RealBosonEFTFreeDerivComplex.repGaugeGroup (L := L))).tprod - (FermionicEFTFreeDeriv.repGaugeGroup (L := L)) - -private lemma complexScalar_repGaugeGroup_apply (g : G) - (x : L.ComplexScalarEFTFreeDeriv) : - ComplexScalarEFTFreeDeriv.repGaugeGroup g x = complexScalarGaugeAlgHom g x := rfl - -private lemma fermionic_repGaugeGroup_apply (g : G) (x : L.FermionicEFTFreeDeriv) : - FermionicEFTFreeDeriv.repGaugeGroup g x = fermionicGaugeAlgHom g x := rfl - -private lemma realBosonComplex_repGaugeGroup_apply (g : G) +/-- The complex real-boson gauge representation agrees with its algebra homomorphism. -/ +lemma realBosonComplex_repGaugeGroup_apply (g : G) (x : L.RealBosonEFTFreeDerivComplex) : RealBosonEFTFreeDerivComplex.repGaugeGroup g x = realBosonComplexGaugeAlgHom g x := by @@ -245,48 +275,57 @@ private lemma realBosonComplex_repGaugeGroup_apply (g : G) exact TensorProduct.tmul_eq_smul_one_tmul c _ | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy -private lemma bosonic_repGaugeGroup_apply (g : G) - (x : L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) : - ((ComplexScalarEFTFreeDeriv.repGaugeGroup (L := L)).tprod - (RealBosonEFTFreeDerivComplex.repGaugeGroup (L := L))) g x = - bosonicGaugeAlgHom g x := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul x y => - simp only [Representation.tprod_apply, TensorProduct.map_tmul] - rw [complexScalar_repGaugeGroup_apply, realBosonComplex_repGaugeGroup_apply] - simp [bosonicGaugeAlgHom] - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy +/-- The gauge action on the complex real-boson factor by algebra automorphisms. -/ +noncomputable def realBosonComplexGaugeAlgAut : + G →* (L.RealBosonEFTFreeDerivComplex ≃ₐ[ℂ] L.RealBosonEFTFreeDerivComplex) := + algAutOfRepresentation RealBosonEFTFreeDerivComplex.repGaugeGroup + realBosonComplexGaugeAlgHom realBosonComplex_repGaugeGroup_apply + +/-! + +### B.2. The full action and its representation + +-/ + +/-- The gauge action on the two bosonic factors by algebra automorphisms. -/ +noncomputable def bosonicGaugeAlgAut : + G →* ((L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) ≃ₐ[ℂ] + (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex)) := + tensorProductAlgAut complexScalarGaugeAlgAut realBosonComplexGaugeAlgAut + +/-- The gauge action on the bosonic factors as an algebra homomorphism. -/ +noncomputable def bosonicGaugeAlgHom (g : G) : + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] + L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := + (bosonicGaugeAlgAut g).toAlgHom + +/-- The gauge action on the free-derivative Lagrangian by algebra automorphisms. -/ +noncomputable def gaugeAlgAut : + G →* (L.EFTLagrangianFreeDeriv ≃ₐ[ℂ] L.EFTLagrangianFreeDeriv) := + tensorProductAlgAut bosonicGaugeAlgAut fermionicGaugeAlgAut + +/-- The action of a gauge-group element as an algebra homomorphism. -/ +noncomputable def gaugeAlgHom (g : G) : + L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := + (gaugeAlgAut g).toAlgHom -/-- The tensor-product gauge representation agrees with its algebra homomorphism. -/ +/-- The representation of the gauge group underlying its algebra-automorphism action. -/ +noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianFreeDeriv := + (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianFreeDeriv).comp gaugeAlgAut + +/-- The gauge representation agrees with its algebra homomorphism. -/ lemma repGaugeGroup_apply (g : G) (x : L.EFTLagrangianFreeDeriv) : - repGaugeGroup g x = gaugeAlgHom g x := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul x y => - simp only [repGaugeGroup, Representation.tprod_apply, TensorProduct.map_tmul] - have hx := bosonic_repGaugeGroup_apply (L := L) g x - simp only [Representation.tprod_apply] at hx - rw [hx, fermionic_repGaugeGroup_apply] - simp [gaugeAlgHom] - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy + repGaugeGroup g x = gaugeAlgHom g x := rfl /-- The gauge representation preserves multiplication. -/ lemma repGaugeGroup_mul (g : G) (V W : L.EFTLagrangianFreeDeriv) : repGaugeGroup g (V * W) = repGaugeGroup g V * repGaugeGroup g W := by - calc - repGaugeGroup g (V * W) = gaugeAlgHom g (V * W) := repGaugeGroup_apply g _ - _ = gaugeAlgHom g V * gaugeAlgHom g W := map_mul _ _ _ - _ = repGaugeGroup g V * repGaugeGroup g W := - congrArg₂ (· * ·) (repGaugeGroup_apply g V).symm - (repGaugeGroup_apply g W).symm + simpa only [repGaugeGroup_apply] using map_mul (gaugeAlgHom g) V W /-- The gauge representation preserves the unit. -/ @[simp] lemma repGaugeGroup_one (g : G) : repGaugeGroup (L := L) g 1 = 1 := by - calc - repGaugeGroup (L := L) g 1 = gaugeAlgHom g 1 := repGaugeGroup_apply g _ - _ = 1 := map_one _ + simpa only [repGaugeGroup_apply] using map_one (gaugeAlgHom (L := L) g) /-! @@ -300,4 +339,5 @@ end EFTLagrangianFreeDeriv end + end LagrangianTheory From 53be3849f79179eb18b7dcb8a50dab98b06d35f1 Mon Sep 17 00:00:00 2001 From: nateabr <135662056+nateabr@users.noreply.github.com> Date: Sat, 1 Aug 2026 09:43:16 +0400 Subject: [PATCH 074/254] Apply suggestion from @nateabr --- .../LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean index 96e3635c7..7759b63b3 100644 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean @@ -148,7 +148,7 @@ noncomputable def realBosonComplexLorentzAlgHom (Λ : SL(2,ℂ)) : L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDerivComplex).comp (realBosonLorentzAlgHom Λ)) -/-- The complexified real-boson Lorentz representation agrees with its algebra homomorphism. -/ +/-- The complex real-boson Lorentz representation agrees with its algebra homomorphism. -/ lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : L.RealBosonEFTFreeDerivComplex) : RealBosonEFTFreeDerivComplex.repLorentzGroup Λ x = From 0cc7c78eebc9b8a21eefea162ac141cca8b351cf Mon Sep 17 00:00:00 2001 From: Jinzheng Li Date: Sat, 1 Aug 2026 10:23:19 -0400 Subject: [PATCH 075/254] refactor: Higgs GaugeGroupI action to a Representation Resolves the TODO in HiggsBoson/Basic.lean: the action of GaugeGroupI on HiggsVec is now a directly-defined Representation (repGaugeGroupI), and the SMul/MulAction/DistribMulAction/SMulCommClass instances are removed, so the rep is the single spelling of the action on HiggsVec. - Lemmas restated in rep form: repGaugeGroupI_apply (and the U1/SU2 variants), repGaugeGroupI_inner/_norm, toRealGroupElem_apply_self, ofU1Subgroup_repGaugeGroupI_apply, repGaugeGroupI_phase_snd; the orbit lemma becomes exists_repGaugeGroupI_eq_iff_norm_eq. - New A.5.3 group-property lemmas (mul_apply, inv cancellation, the inv_apply_eq_iff) replace mul_smul/inv_smul_smul downstream. - EffectivePotential: IsInvariant via the rep; smul_comm use replaced by LinearMap.map_smul_of_tower (linearity). - TwoHDM: TwoHiggsDoublet keeps its MulAction (needed for its orbit classification) but it is now defined through repGaugeGroupI, so no type carries two spellings; GramMatrix ported. - StandardModelLT completed: complexScalarRepGaugeGroup wired to ComplexScalarIrrep.repGaugeGroupI (moved before StandardModelLT, later duplicate removed) and an empty real-boson sector added, fixing the missing-fields error from the real-boson commit. - liftLinear_of_eq proven (via quotKerEquivOfSurjective_symm_apply and liftQ_apply); the kernel-inclusion sorry inside liftLinear remains. - YukawaTerms simp site updated to repGaugeGroupI_apply. Co-Authored-By: Claude Fable 5 --- .../BeyondTheStandardModel/TwoHDM/Basic.lean | 10 +- .../TwoHDM/GramMatrix.lean | 58 +++---- .../EFTLagrangianExclDeriv/Basic.lean | 27 +++- .../EFTLagrangianExclDeriv/YukawaTerms.lean | 2 +- .../StandardModel/HiggsBoson/Basic.lean | 148 ++++++++++-------- .../HiggsBoson/EffectivePotential.lean | 14 +- 6 files changed, 150 insertions(+), 109 deletions(-) diff --git a/Physlib/Particles/BeyondTheStandardModel/TwoHDM/Basic.lean b/Physlib/Particles/BeyondTheStandardModel/TwoHDM/Basic.lean index af133c8e3..03983b715 100644 --- a/Physlib/Particles/BeyondTheStandardModel/TwoHDM/Basic.lean +++ b/Physlib/Particles/BeyondTheStandardModel/TwoHDM/Basic.lean @@ -59,21 +59,21 @@ lemma ext_of_fst_snd {H1 H2 : TwoHiggsDoublet} noncomputable instance : SMul StandardModel.GaugeGroupI TwoHiggsDoublet where smul g H := - { Φ1 := g • H.Φ1 - Φ2 := g • H.Φ2 } + { Φ1 := StandardModel.HiggsVec.repGaugeGroupI g H.Φ1 + Φ2 := StandardModel.HiggsVec.repGaugeGroupI g H.Φ2 } @[simp] lemma gaugeGroupI_smul_fst (g : StandardModel.GaugeGroupI) (H : TwoHiggsDoublet) : - (g • H).Φ1 = g • H.Φ1 := rfl + (g • H).Φ1 = StandardModel.HiggsVec.repGaugeGroupI g H.Φ1 := rfl @[simp] lemma gaugeGroupI_smul_snd (g : StandardModel.GaugeGroupI) (H : TwoHiggsDoublet) : - (g • H).Φ2 = g • H.Φ2 := rfl + (g • H).Φ2 = StandardModel.HiggsVec.repGaugeGroupI g H.Φ2 := rfl noncomputable instance : MulAction StandardModel.GaugeGroupI TwoHiggsDoublet where one_smul H := by ext <;> simp mul_smul g1 g2 H := by - ext <;> simp [mul_smul] + ext <;> simp [Module.End.mul_apply] end TwoHiggsDoublet diff --git a/Physlib/Particles/BeyondTheStandardModel/TwoHDM/GramMatrix.lean b/Physlib/Particles/BeyondTheStandardModel/TwoHDM/GramMatrix.lean index e6e319dba..e065eb1f6 100644 --- a/Physlib/Particles/BeyondTheStandardModel/TwoHDM/GramMatrix.lean +++ b/Physlib/Particles/BeyondTheStandardModel/TwoHDM/GramMatrix.lean @@ -89,17 +89,17 @@ lemma gramMatrix_tr_nonneg (H : TwoHiggsDoublet) : lemma gaugeGroupI_exists_fst_eq {H : TwoHiggsDoublet} (h1 : H.Φ1 ≠ 0) : ∃ g : StandardModel.GaugeGroupI, - g • H.Φ1 = (!₂[‖H.Φ1‖, 0] : HiggsVec) ∧ - (g • H.Φ2) 0 = ⟪H.Φ1, H.Φ2⟫_ℂ / ‖H.Φ1‖ ∧ - ‖(g • H.Φ2) 1‖ = Real.sqrt (H.gramMatrix.det.re) / ‖H.Φ1‖ := by + HiggsVec.repGaugeGroupI g H.Φ1 = (!₂[‖H.Φ1‖, 0] : HiggsVec) ∧ + (HiggsVec.repGaugeGroupI g H.Φ2) 0 = ⟪H.Φ1, H.Φ2⟫_ℂ / ‖H.Φ1‖ ∧ + ‖(HiggsVec.repGaugeGroupI g H.Φ2) 1‖ = Real.sqrt (H.gramMatrix.det.re) / ‖H.Φ1‖ := by rw [gramMatrix_det_eq_real] - obtain ⟨g, h⟩ := (HiggsVec.mem_orbit_gaugeGroupI_iff (H.Φ1) (!₂[‖H.Φ1‖, 0] : HiggsVec)).mpr - (by simp [@PiLp.norm_eq_of_L2]) + obtain ⟨g, h⟩ := (HiggsVec.exists_repGaugeGroupI_eq_iff_norm_eq (H.Φ1) + (!₂[‖H.Φ1‖, 0] : HiggsVec)).mpr (by simp [@PiLp.norm_eq_of_L2]) use g - simp at h simp [h] - have h_fst : (g • H.Φ2).ofLp 0 = ⟪H.Φ1, H.Φ2⟫_ℂ / ‖H.Φ1‖ := by - have h2 : ⟪H.Φ1, H.Φ2⟫_ℂ = ⟪g • H.Φ1, g • H.Φ2⟫_ℂ := by + have h_fst : (HiggsVec.repGaugeGroupI g H.Φ2).ofLp 0 = ⟪H.Φ1, H.Φ2⟫_ℂ / ‖H.Φ1‖ := by + have h2 : ⟪H.Φ1, H.Φ2⟫_ℂ = ⟪HiggsVec.repGaugeGroupI g H.Φ1, + HiggsVec.repGaugeGroupI g H.Φ2⟫_ℂ := by simp rw [h] at h2 conv_rhs at h2 => @@ -109,14 +109,16 @@ lemma gaugeGroupI_exists_fst_eq {H : TwoHiggsDoublet} (h1 : H.Φ1 ≠ 0) : simp_all field_simp apply And.intro h_fst - have hx : ‖g • H.Φ2‖ ^ 2 = ‖H.Φ2‖ ^ 2 := by + have hx : ‖HiggsVec.repGaugeGroupI g H.Φ2‖ ^ 2 = ‖H.Φ2‖ ^ 2 := by simp rw [PiLp.norm_sq_eq_of_L2] at hx simp at hx - have hx0 : ‖(g • H.Φ2).ofLp 1‖ ^ 2 = ‖H.Φ2‖ ^ 2 - ‖(g • H.Φ2).ofLp 0‖ ^ 2 := by + have hx0 : ‖(HiggsVec.repGaugeGroupI g H.Φ2).ofLp 1‖ ^ 2 = + ‖H.Φ2‖ ^ 2 - ‖(HiggsVec.repGaugeGroupI g H.Φ2).ofLp 0‖ ^ 2 := by rw [← hx] simp - have h0 : ‖(g • H.Φ2) 1‖ ^ 2 = (‖H.Φ1‖ ^ 2 * ‖H.Φ2‖ ^ 2 - ‖⟪H.Φ1, H.Φ2⟫_ℂ‖ ^ 2) / ‖H.Φ1‖ ^ 2 := by + have h0 : ‖(HiggsVec.repGaugeGroupI g H.Φ2) 1‖ ^ 2 = + (‖H.Φ1‖ ^ 2 * ‖H.Φ2‖ ^ 2 - ‖⟪H.Φ1, H.Φ2⟫_ℂ‖ ^ 2) / ‖H.Φ1‖ ^ 2 := by field_simp rw [hx0, h_fst] simp only [Fin.isValue, Complex.norm_div, Complex.norm_real, norm_norm] @@ -133,18 +135,19 @@ lemma gaugeGroupI_exists_fst_eq {H : TwoHiggsDoublet} (h1 : H.Φ1 ≠ 0) : ring_nf · exact norm_ne_zero_iff.mpr h1 · simpa using h1 - · exact norm_nonneg ((g • H.Φ2).ofLp 1) + · exact norm_nonneg ((HiggsVec.repGaugeGroupI g H.Φ2).ofLp 1) lemma gaugeGroupI_exists_fst_eq_snd_eq {H : TwoHiggsDoublet} (h1 : H.Φ1 ≠ 0) : ∃ g : StandardModel.GaugeGroupI, - g • H.Φ1 = (!₂[‖H.Φ1‖, 0] : HiggsVec) ∧ - g • H.Φ2 = (!₂[⟪H.Φ1, H.Φ2⟫_ℂ / ‖H.Φ1‖, √(H.gramMatrix.det.re) / ‖H.Φ1‖] : HiggsVec) := by + HiggsVec.repGaugeGroupI g H.Φ1 = (!₂[‖H.Φ1‖, 0] : HiggsVec) ∧ + HiggsVec.repGaugeGroupI g H.Φ2 = + (!₂[⟪H.Φ1, H.Φ2⟫_ℂ / ‖H.Φ1‖, √(H.gramMatrix.det.re) / ‖H.Φ1‖] : HiggsVec) := by obtain ⟨g, h_fst, h_snd_0, h_snd_1⟩ := gaugeGroupI_exists_fst_eq h1 - obtain ⟨k, h1, h2, h3⟩ := HiggsVec.gaugeGroupI_smul_phase_snd (g • H.Φ2) + obtain ⟨k, h1, h2, h3⟩ := HiggsVec.repGaugeGroupI_phase_snd (HiggsVec.repGaugeGroupI g H.Φ2) use k * g apply And.intro - · rw [mul_smul, h_fst, h3] - · rw [mul_smul] + · rw [HiggsVec.repGaugeGroupI_mul_apply, h_fst, h3] + · rw [HiggsVec.repGaugeGroupI_mul_apply] ext i fin_cases i · simp @@ -162,10 +165,10 @@ lemma mem_orbit_gaugeGroupI_iff_gramMatrix (H1 H2 : TwoHiggsDoublet) : simp [← hg] by_cases Φ1_zero : H1.Φ1 = 0 · intro h - obtain ⟨g1, hg1⟩ := (HiggsVec.mem_orbit_gaugeGroupI_iff (H1.Φ2) (!₂[‖H1.Φ2‖, 0] : HiggsVec)).mpr - (by simp [@PiLp.norm_eq_of_L2]) - obtain ⟨g2, hg2⟩ := (HiggsVec.mem_orbit_gaugeGroupI_iff (H2.Φ2) (!₂[‖H2.Φ2‖, 0] : HiggsVec)).mpr - (by simp [@PiLp.norm_eq_of_L2]) + obtain ⟨g1, hg1⟩ := (HiggsVec.exists_repGaugeGroupI_eq_iff_norm_eq (H1.Φ2) + (!₂[‖H1.Φ2‖, 0] : HiggsVec)).mpr (by simp [@PiLp.norm_eq_of_L2]) + obtain ⟨g2, hg2⟩ := (HiggsVec.exists_repGaugeGroupI_eq_iff_norm_eq (H2.Φ2) + (!₂[‖H2.Φ2‖, 0] : HiggsVec)).mpr (by simp [@PiLp.norm_eq_of_L2]) use g1⁻¹ * g2 simp only ext:1 @@ -175,9 +178,8 @@ lemma mem_orbit_gaugeGroupI_iff_gramMatrix (H1 H2 : TwoHiggsDoublet) : rw [← eq_fst_norm_of_eq_gramMatrix h] simp [Φ1_zero] at hnorm simp [hnorm] - · simp [mul_smul] - refine inv_smul_eq_iff.mpr ?_ - simp at hg1 hg2 + · simp + refine (HiggsVec.repGaugeGroupI_inv_apply_eq_iff _ _ _).mpr ?_ simp [hg1, hg2] exact eq_snd_norm_of_eq_gramMatrix h.symm · intro h @@ -192,12 +194,12 @@ lemma mem_orbit_gaugeGroupI_iff_gramMatrix (H1 H2 : TwoHiggsDoublet) : use g1⁻¹ * g2 simp only ext:1 - · simp [mul_smul] - refine inv_smul_eq_iff.mpr ?_ + · simp + refine (HiggsVec.repGaugeGroupI_inv_apply_eq_iff _ _ _).mpr ?_ simp [H1_Φ1, H2_Φ1] apply eq_fst_norm_of_eq_gramMatrix h.symm - · simp [mul_smul] - refine inv_smul_eq_iff.mpr ?_ + · simp + refine (HiggsVec.repGaugeGroupI_inv_apply_eq_iff _ _ _).mpr ?_ simp [H1_Φ2, H2_Φ2] apply And.intro · congr 1 diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean index 93b7b509f..ff0f46c45 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -291,6 +291,9 @@ def ComplexScalarIrrep.basis : (φ : ComplexScalarIrrep) → def ComplexScalarIrrep.repLorentzGroup : (φ : ComplexScalarIrrep) → Representation ℂ SL(2,ℂ) (ComplexScalarIrrep.module φ) | .H => Representation.trivial ℂ SL(2,ℂ) HiggsVec +def ComplexScalarIrrep.repGaugeGroupI : + (φ : ComplexScalarIrrep) → Representation ℂ GaugeGroupI (ComplexScalarIrrep.module φ) + | .H => HiggsVec.repGaugeGroupI @[reducible] def StandardModelLT : LagrangianTheory GaugeGroupI where @@ -305,6 +308,19 @@ def StandardModelLT : LagrangianTheory GaugeGroupI where complexScalarModule := ComplexScalarIrrep.module complexScalarBasis := ComplexScalarIrrep.basis complexScalarRepLorentzGroup := ComplexScalarIrrep.repLorentzGroup + complexScalarRepGaugeGroup := ComplexScalarIrrep.repGaugeGroupI + -- The Standard Model has no real bosonic fields at the no-derivative level + -- (the field strengths only enter the free-derivative layer). + RealBosonIrreps := Empty + RealBosonComponents := fun x => x.elim + realBosonComponents_fintype := fun x => x.elim + realBosonComponents_decEq := fun x => x.elim + realBosonModule := fun x => x.elim + realBosonModule_addCommGroup := fun x => x.elim + realBosonModule_module := fun x => x.elim + realBosonBasis := fun x => x.elim + realBosonRepLorentzGroup := fun x => x.elim + realBosonRepGaugeGroup := fun x => x.elim /-! @@ -408,10 +424,6 @@ def ComplexScalarEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) Com -/ -def ComplexScalarIrrep.repGaugeGroupI : - (φ : ComplexScalarIrrep) → Representation ℂ GaugeGroupI (ComplexScalarIrrep.module φ) - | .H => HiggsVec.repGaugeGroupI - def ComplexScalarTargetSpace.repGaugeGroupI : Representation ℂ GaugeGroupI ComplexScalarTargetSpace where toFun g := LinearMap.piMap fun φ => ComplexScalarIrrep.repGaugeGroupI φ g @@ -966,6 +978,11 @@ lemma liftLinear_of_eq (A : Type) [Ring A] [Algebra ℂ A] (F : List FieldGenera (hscale : ∀ (l1 l2 : List FieldGenerators) (c : ℂ), termOfList l1 = c • termOfList l2 → F l1 = c • F l2) (l : List FieldGenerators) : liftLinear F hscale (termOfList l) = F l := by - simp [liftLinear] + have h : termOfList l = + Finsupp.linearCombination ℂ termOfList (Finsupp.single l 1) := by + simp + simp only [liftLinear, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply] + rw [h, LinearMap.quotKerEquivOfSurjective_symm_apply, Submodule.liftQ_apply] + simp end EFTLagrangianExclDeriv diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean index ecfd6ed8b..9883e92c2 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean @@ -69,7 +69,7 @@ lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (a : Fin 2) : repGaugeGroupI g (orthonormBasis.toBasis a) = ∑ b, ((g.toU1.1 : ℂ) ^ 3 * g.toSU2.1 b a) • orthonormBasis.toBasis b := by ext c - simp [repGaugeGroupI, gaugeGroupI_smul_eq, orthonormBasis, EuclideanSpace.basisFun_apply, + simp [repGaugeGroupI_apply, orthonormBasis, EuclideanSpace.basisFun_apply, PiLp.ofLp_single, Submonoid.smul_def, Fin.sum_univ_two, mul_comm] fin_cases c <;> simp diff --git a/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean index acc4e92bd..64baa29ab 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean @@ -32,8 +32,9 @@ In this module we define the Higgs field and prove some basic properties. - A.3. Orthonormal basis - A.4. Generating Higgs vectors from real numbers - A.5. Action of the gauge group on `HiggsVec` - - A.5.1. Definition of the action + - A.5.1. Definition of the representation - A.5.2. Unitary nature of the action + - A.5.3. Group properties of the representation applied to vectors - A.6. The Gauge orbit of a Higgs vector - A.6.1. The rotation matrix to ofReal - A.6.2. Members of orbits @@ -160,49 +161,37 @@ The gauge group of the Standard Model acts on `HiggsVec` by matrix multiplicatio /-! -#### A.5.1. Definition of the action +#### A.5.1. Definition of the representation -/ -instance : SMul StandardModel.GaugeGroupI HiggsVec where - smul g φ := WithLp.toLp 2 <| g.toU1 ^ 3 • (g.toSU2.1 *ᵥ φ.ofLp) +/-- The representation of the gauge group `GaugeGroupI` on `HiggsVec`: the `SU(2)` + factor acts by matrix multiplication, and the `U(1)` factor by scalar + multiplication with its third power. -/ +def repGaugeGroupI : Representation ℂ GaugeGroupI HiggsVec where + toFun g := + { toFun φ := WithLp.toLp 2 <| g.toU1 ^ 3 • (g.toSU2.1 *ᵥ φ.ofLp) + map_add' φ ψ := by simp [mulVec_add, smul_add] + map_smul' c φ := by simp [mulVec_smul, smul_comm c] } + map_one' := by + ext φ + simp + map_mul' g₁ g₂ := by + ext φ + simp [Module.End.mul_apply, smul_smul, mulVec_mulVec, mul_pow, mul_comm] -lemma gaugeGroupI_smul_eq (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : - g • φ = (WithLp.toLp 2 <| g.toU1 ^ 3 • (g.toSU2.1 *ᵥ φ.ofLp)) := rfl +lemma repGaugeGroupI_apply (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : + repGaugeGroupI g φ = (WithLp.toLp 2 <| g.toU1 ^ 3 • (g.toSU2.1 *ᵥ φ.ofLp)) := rfl -lemma gaugeGroupI_smul_eq_U1_mul_SU2 (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : - g • φ = (WithLp.toLp 2 <| g.toSU2.1 *ᵥ (g.toU1 ^ 3 • φ.ofLp)) := by - rw [gaugeGroupI_smul_eq, ← mulVec_smul] +lemma repGaugeGroupI_apply_eq_U1_mul_SU2 (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : + repGaugeGroupI g φ = (WithLp.toLp 2 <| g.toSU2.1 *ᵥ (g.toU1 ^ 3 • φ.ofLp)) := by + rw [repGaugeGroupI_apply, ← mulVec_smul] -lemma gaugeGroupI_smul_eq_U1_smul_SU2 (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : - g • φ = (WithLp.toLp 2 <| (g.toU1 ^ 3 • g.toSU2.1) *ᵥ φ.ofLp) := by - rw [gaugeGroupI_smul_eq] +lemma repGaugeGroupI_apply_eq_U1_smul_SU2 (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : + repGaugeGroupI g φ = (WithLp.toLp 2 <| (g.toU1 ^ 3 • g.toSU2.1) *ᵥ φ.ofLp) := by + rw [repGaugeGroupI_apply] rw [Matrix.smul_mulVec] -instance : MulAction StandardModel.GaugeGroupI HiggsVec where - one_smul φ := by simp [gaugeGroupI_smul_eq] - mul_smul g₁ g₂ φ := by - simp [gaugeGroupI_smul_eq, mulVec_smul, smul_smul, mulVec_mulVec, mul_pow] - -instance : DistribMulAction StandardModel.GaugeGroupI HiggsVec where - smul_zero g := by simp [gaugeGroupI_smul_eq_U1_smul_SU2] - smul_add g φ ψ := by simp [gaugeGroupI_smul_eq_U1_smul_SU2, mulVec_add] - -TODO "Change the action of `GaugeGroupI` on `HiggsVec` to be a representation - rather than a `MulAction`." - -instance : SMulCommClass ℂ GaugeGroupI HiggsVec where - smul_comm r g φ := by simp [gaugeGroupI_smul_eq, mulVec_smul, smul_comm r] - -instance : SMulCommClass GaugeGroupI ℂ HiggsVec := - SMulCommClass.symm ℂ GaugeGroupI HiggsVec - -instance : SMulCommClass ℝ GaugeGroupI HiggsVec where - smul_comm r g φ := by simp [gaugeGroupI_smul_eq, mulVec_smul, smul_comm r] - -def repGaugeGroupI : Representation ℂ GaugeGroupI HiggsVec := - Representation.ofDistribMulAction ℂ GaugeGroupI HiggsVec - /-! #### A.5.2. Unitary nature of the action @@ -213,18 +202,46 @@ The action of `StandardModel.GaugeGroupI` on `HiggsVec` is unitary. open InnerProductSpace @[simp] -lemma gaugeGroupI_smul_inner (g : StandardModel.GaugeGroupI) (φ ψ : HiggsVec) : - ⟪g • φ, g • ψ⟫_ℂ = ⟪φ, ψ⟫_ℂ := by - rw [gaugeGroupI_smul_eq, gaugeGroupI_smul_eq, EuclideanSpace.inner_toLp_toLp, +lemma repGaugeGroupI_inner (g : StandardModel.GaugeGroupI) (φ ψ : HiggsVec) : + ⟪repGaugeGroupI g φ, repGaugeGroupI g ψ⟫_ℂ = ⟪φ, ψ⟫_ℂ := by + rw [repGaugeGroupI_apply, repGaugeGroupI_apply, EuclideanSpace.inner_toLp_toLp, EuclideanSpace.inner_eq_star_dotProduct, Submonoid.smul_def, Submonoid.smul_def, star_smul, smul_dotProduct, dotProduct_smul, smul_smul, Unitary.mul_star_self_of_mem (g.toU1 ^ 3).2, one_smul, star_mulVec, dotProduct_comm, dotProduct_mulVec, vecMul_vecMul, ← star_eq_conjTranspose, mem_unitaryGroup_iff'.mp g.toSU2.2.1, vecMul_one, dotProduct_comm] @[simp] -lemma gaugeGroupI_smul_norm (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : - ‖g • φ‖ = ‖φ‖ := by - rw [norm_eq_sqrt_re_inner (𝕜 := ℂ), norm_eq_sqrt_re_inner (𝕜 := ℂ), gaugeGroupI_smul_inner] +lemma repGaugeGroupI_norm (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : + ‖repGaugeGroupI g φ‖ = ‖φ‖ := by + rw [norm_eq_sqrt_re_inner (𝕜 := ℂ), norm_eq_sqrt_re_inner (𝕜 := ℂ), repGaugeGroupI_inner] + +/-! + +#### A.5.3. Group properties of the representation applied to vectors + +-/ + +lemma repGaugeGroupI_mul_apply (g₁ g₂ : StandardModel.GaugeGroupI) (φ : HiggsVec) : + repGaugeGroupI (g₁ * g₂) φ = repGaugeGroupI g₁ (repGaugeGroupI g₂ φ) := by + rw [map_mul, Module.End.mul_apply] + +@[simp] +lemma repGaugeGroupI_inv_apply_apply (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : + repGaugeGroupI g⁻¹ (repGaugeGroupI g φ) = φ := by + rw [← repGaugeGroupI_mul_apply, inv_mul_cancel, map_one, Module.End.one_apply] + +@[simp] +lemma repGaugeGroupI_apply_inv_apply (g : StandardModel.GaugeGroupI) (φ : HiggsVec) : + repGaugeGroupI g (repGaugeGroupI g⁻¹ φ) = φ := by + rw [← repGaugeGroupI_mul_apply, mul_inv_cancel, map_one, Module.End.one_apply] + +lemma repGaugeGroupI_inv_apply_eq_iff (g : StandardModel.GaugeGroupI) (φ ψ : HiggsVec) : + repGaugeGroupI g⁻¹ φ = ψ ↔ φ = repGaugeGroupI g ψ := by + constructor + · rintro rfl + rw [repGaugeGroupI_apply_inv_apply] + · rintro rfl + rw [repGaugeGroupI_inv_apply_apply] /-! @@ -276,12 +293,12 @@ def toRealGroupElem (φ : HiggsVec) : GaugeGroupI := rw [← mul_conj, ← mul_conj] ring -lemma toRealGroupElem_smul_self (φ : HiggsVec) : - (toRealGroupElem φ) • φ = ofReal (‖φ‖ ^ 2) := by +lemma toRealGroupElem_apply_self (φ : HiggsVec) : + repGaugeGroupI (toRealGroupElem φ) φ = ofReal (‖φ‖ ^ 2) := by by_cases hφ : φ = 0 · ext i fin_cases i <;> simp [hφ, toRealGroupElem, ofReal] - rw [gaugeGroupI_smul_eq] + rw [repGaugeGroupI_apply] have h0' : (‖φ‖ ^ 2 : ℂ) = φ 0 * (starRingEnd ℂ) (φ 0) + φ 1 * (starRingEnd ℂ) (φ 1) := by rw [← ofReal_pow, ← @real_inner_self_eq_norm_sq] simp only [Fin.isValue, mul_conj, PiLp.inner_apply, Complex.inner, ofReal_re, @@ -307,16 +324,18 @@ Higgs vectors with the same norm. -/ -lemma mem_orbit_gaugeGroupI_iff (φ : HiggsVec) (ψ : HiggsVec) : - ψ ∈ MulAction.orbit GaugeGroupI φ ↔ ‖ψ‖ = ‖φ‖ := by +/-- Two Higgs vectors are in the same gauge orbit (i.e. related by `repGaugeGroupI`) + if and only if they have the same norm. -/ +lemma exists_repGaugeGroupI_eq_iff_norm_eq (φ : HiggsVec) (ψ : HiggsVec) : + (∃ g : GaugeGroupI, repGaugeGroupI g φ = ψ) ↔ ‖ψ‖ = ‖φ‖ := by constructor · rintro ⟨g, rfl⟩ simp · intro h use (toRealGroupElem ψ)⁻¹ * toRealGroupElem (φ) - simp only - rw [← smul_smul, toRealGroupElem_smul_self φ, ← h, ← toRealGroupElem_smul_self ψ] - exact inv_smul_smul _ ψ + rw [map_mul, Module.End.mul_apply, toRealGroupElem_apply_self φ, ← h, + ← toRealGroupElem_apply_self ψ, ← Module.End.mul_apply, ← map_mul, + inv_mul_cancel, map_one, Module.End.one_apply] /-! @@ -330,7 +349,7 @@ The items in this section are marked as `informal_lemma` as they are not yet for -/ /-- The Higgs boson breaks electroweak symmetry down to the electromagnetic force, i.e., the -stability group of the action of `rep` on `![0, Complex.ofReal ‖φ‖]`, for non-zero `‖φ‖`, is the +stability group of `repGaugeGroupI` on `![0, Complex.ofReal ‖φ‖]`, for non-zero `‖φ‖`, is the `SU(3) × U(1)` subgroup of `gaugeGroup := SU(3) × SU(2) × U(1)` with the embedding given by `(g, e^{i θ}) ↦ (g, diag (e ^ {3 * i θ}, e ^ {- 3 * i θ}), e^{i θ})`. -/ @@ -339,8 +358,8 @@ informal_lemma stability_group_single where tag := "6V2MD" /-- The subgroup of `gaugeGroup := SU(3) × SU(2) × U(1)` which preserves every `HiggsVec` by the -action of `StandardModel.HiggsVec.rep` is given by `SU(3) × ℤ₆` where `ℤ₆` is the subgroup of -`SU(2) × U(1)` with elements `(α^(-3) * I₂, α)` where `α` is a sixth root of unity. +action of `StandardModel.HiggsVec.repGaugeGroupI` is given by `SU(3) × ℤ₆` where `ℤ₆` is the +subgroup of `SU(2) × U(1)` with elements `(α^(-3) * I₂, α)` where `α` is a sixth root of unity. -/ informal_lemma stability_group where deps := [``HiggsVec] @@ -352,10 +371,10 @@ informal_lemma stability_group where -/ -lemma ofU1Subgroup_smul_eq_smul (g : unitary ℂ) (φ : HiggsVec) : - (StandardModel.GaugeGroupI.ofU1Subgroup g) • φ = +lemma ofU1Subgroup_repGaugeGroupI_apply (g : unitary ℂ) (φ : HiggsVec) : + repGaugeGroupI (StandardModel.GaugeGroupI.ofU1Subgroup g) φ = (WithLp.toLp 2 <| !![1, 0; 0, g.1 ^ 6] *ᵥ φ.ofLp) := by - rw [gaugeGroupI_smul_eq_U1_smul_SU2] + rw [repGaugeGroupI_apply_eq_U1_smul_SU2] simp only [GaugeGroupI.ofU1Subgroup_toU1, GaugeGroupI.ofU1Subgroup_toSU2, SubmonoidClass.coe_pow, star_pow, RCLike.star_def, smul_of, smul_cons, smul_zero, smul_empty, cons_mulVec, cons_dotProduct, zero_mul, dotProduct_of_isEmpty, add_zero, zero_add, empty_mulVec, one_mul, @@ -368,17 +387,17 @@ lemma ofU1Subgroup_smul_eq_smul (g : unitary ℂ) (φ : HiggsVec) : · show (g : ℂ) ^ 3 * (g : ℂ) ^ 3 = (g : ℂ) ^ 6 ring -lemma gaugeGroupI_smul_phase_snd (φ : HiggsVec) : +lemma repGaugeGroupI_phase_snd (φ : HiggsVec) : ∃ g : StandardModel.GaugeGroupI, - (g • φ).ofLp 1 = ‖(φ.ofLp 1)‖ ∧ - (∀ φ1 : HiggsVec, (g • φ1).ofLp 0 = φ1.ofLp 0) ∧ - (∀ a : ℝ, g • (!₂[a, 0] : HiggsVec) = (!₂[a, 0] : HiggsVec)) := by + (repGaugeGroupI g φ).ofLp 1 = ‖(φ.ofLp 1)‖ ∧ + (∀ φ1 : HiggsVec, (repGaugeGroupI g φ1).ofLp 0 = φ1.ofLp 0) ∧ + (∀ a : ℝ, repGaugeGroupI g (!₂[a, 0] : HiggsVec) = (!₂[a, 0] : HiggsVec)) := by let θ := arg (φ 1) refine ⟨StandardModel.GaugeGroupI.ofU1Subgroup ⟨Complex.exp (-I * θ / 6), by simp [Unitary.mem_iff, ← Complex.exp_conj, ← Complex.exp_add, Complex.conj_ofNat] ring_nf simp⟩, ?_, ?_, ?_⟩ - · rw [ofU1Subgroup_smul_eq_smul] + · rw [ofU1Subgroup_repGaugeGroupI_apply] simp only [Fin.isValue, neg_mul, cons_mulVec, cons_dotProduct, one_mul, zero_mul, dotProduct_of_isEmpty, add_zero, zero_add, empty_mulVec, cons_val_one, cons_val_fin_one] rw [show vecHead (vecTail φ.ofLp) = φ.ofLp 1 from rfl] @@ -388,10 +407,10 @@ lemma gaugeGroupI_smul_phase_snd (φ : HiggsVec) : ring_nf simp · intro φ - simp [ofU1Subgroup_smul_eq_smul, vecHead] + simp [ofU1Subgroup_repGaugeGroupI_apply, vecHead] · intro a ext i - fin_cases i <;> simp [ofU1Subgroup_smul_eq_smul] + fin_cases i <;> simp [ofU1Subgroup_repGaugeGroupI_apply] /-! @@ -744,7 +763,8 @@ TODO "Define the global gauge action on HiggsField." TODO "Prove `⟪φ1, φ2⟫_H` invariant under the global gauge action. (norm_map_of_mem_unitary)" TODO "Prove invariance of potential under global gauge action." -/-- The action of `gaugeTransformI` on `HiggsField` acting pointwise through `HiggsVec.rep`. -/ +/-- The action of `gaugeTransformI` on `HiggsField` acting pointwise through + `HiggsVec.repGaugeGroupI`. -/ informal_definition gaugeAction where deps := [``gaugeTransformI] tag := "6V2NP" diff --git a/Physlib/Particles/StandardModel/HiggsBoson/EffectivePotential.lean b/Physlib/Particles/StandardModel/HiggsBoson/EffectivePotential.lean index 55ac72aa5..02a3bcd3f 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/EffectivePotential.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/EffectivePotential.lean @@ -44,13 +44,13 @@ namespace EffectivePotential /-- The proposition that the general potential is invariant under the global action of the gauge group. -/ def IsInvariant (V : EffectivePotential) : Prop := - ∀ (g : GaugeGroupI), ∀ (φ : HiggsVec), V (g • φ) = V φ + ∀ (g : GaugeGroupI), ∀ (φ : HiggsVec), V (HiggsVec.repGaugeGroupI g φ) = V φ namespace IsInvariant /-- An invariant potential is equal on gauge orbits. -/ lemma eq_on_orbits {φ1 φ2 : HiggsVec} {V : EffectivePotential} (h : IsInvariant V) - (hφ : φ1 ∈ MulAction.orbit GaugeGroupI φ2) : + (hφ : ∃ g : GaugeGroupI, HiggsVec.repGaugeGroupI g φ2 = φ1) : V φ1 = V φ2 := by obtain ⟨g, rfl⟩ := hφ exact h g φ2 @@ -58,7 +58,7 @@ lemma eq_on_orbits {φ1 φ2 : HiggsVec} {V : EffectivePotential} (h : IsInvarian /-- An invariant potential is equal on Higgs vectors with identical norms. -/ lemma eq_of_norm_eq {φ1 φ2 : HiggsVec} {V : EffectivePotential} (h : IsInvariant V) (hφ : ‖φ1‖ = ‖φ2‖) : - V φ1 = V φ2 := h.eq_on_orbits <| (HiggsVec.mem_orbit_gaugeGroupI_iff φ2 φ1).mpr hφ + V φ1 = V φ2 := h.eq_on_orbits <| (HiggsVec.exists_repGaugeGroupI_eq_iff_norm_eq φ2 φ1).mpr hφ lemma factors_through_norm {V : EffectivePotential} (h : IsInvariant V) : ∃ (f : ℝ → ℝ), V = f ∘ norm := by @@ -146,13 +146,15 @@ lemma termOfMassDim_isInvariant {V : EffectivePotential} {n : ℕ} (h : HasMaxMa (m : ℕ) (hV : IsInvariant V) : IsInvariant (termOfMassDim V h m) := by intro g φ have hV (t : ℝ) := hV g (t • φ) - have h1 (t : ℝ) : ∑ m ∈ Finset.range (n + 1), t ^ m * (termOfMassDim V h m (g • φ) - + have h1 (t : ℝ) : ∑ m ∈ Finset.range (n + 1), + t ^ m * (termOfMassDim V h m (HiggsVec.repGaugeGroupI g φ) - termOfMassDim V h m φ) = 0 := by simp [mul_sub, ← apply_smul_eq_sum_termOfMassDim] - rw [smul_comm, hV, sub_eq_zero] + rw [← LinearMap.map_smul_of_tower, hV, sub_eq_zero] by_cases hmn : m ≤ n · have hp : (∑ k ∈ Finset.range (n + 1), - Polynomial.C (termOfMassDim V h k (g • φ) - termOfMassDim V h k φ) * Polynomial.X ^ k) + Polynomial.C (termOfMassDim V h k (HiggsVec.repGaugeGroupI g φ) - + termOfMassDim V h k φ) * Polynomial.X ^ k) = 0 := by apply Polynomial.funext intro x From 8cff32a1df4240bddd897d0831491d589904c31e Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 3 Aug 2026 08:48:11 +0100 Subject: [PATCH 076/254] Update Coeff.lean --- .../EFTLagrangianExclDeriv/Coeff.lean | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean index 41b9c543b..412fd5e6d 100644 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean +++ b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean @@ -48,6 +48,9 @@ The below is AI slop, but it shows a useful way od defining the coefficent. def CoeffSubmodule (s : Multiset FieldGenerators) : Submodule ℂ EFTLagrangianExclDeriv := Submodule.span ℂ (termOfList '' {l | Multiset.ofList l = s}) + + + instance : SetLike.GradedMonoid CoeffSubmodule where one_mem := by simp [CoeffSubmodule, termOfList_nil] mul_mem s1 s2 V1 V2 hV1 hV2 := by @@ -287,6 +290,47 @@ instance : GradedAlgebra CoeffSubmodule := by def coeff (s : Multiset FieldGenerators) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv:= GradedAlgebra.proj CoeffSubmodule s +lemma coeff_mem_subModule (s : Multiset FieldGenerators) (x : EFTLagrangianExclDeriv) : + coeff s x ∈ CoeffSubmodule s := by + rw [coeff, GradedAlgebra.proj_apply] + exact SetLike.coe_mem _ + end CoeffSubmodule + +/-! + +## Properties of the submodules + +-/ + + +/-- A element of `EFTLagrangianExclDeriv` is an element of the `CoeffSubmodule` + iff it is a scalar multiple of a corresponding `termOfList l`. -/ +lemma coeffSubmodule_mem_iff_eq_mul {s : Multiset FieldGenerators} + {l : List FieldGenerators} (h : Multiset.ofList l = s) (x : EFTLagrangianExclDeriv) : + x ∈ CoeffSubmodule s ↔ ∃ c : ℂ, x = c • termOfList l := by + constructor + · intro hx + have hle : CoeffSubmodule s ≤ ℂ ∙ termOfList l := by + rw [CoeffSubmodule, Submodule.span_le] + rintro _ ⟨l', hl', rfl⟩ + obtain ⟨c, hc, -⟩ := termOfList_perm (Multiset.coe_eq_coe.mp (hl'.trans h.symm)) + exact Submodule.mem_span_singleton.mpr ⟨c, hc.symm⟩ + obtain ⟨c, hc⟩ := Submodule.mem_span_singleton.mp (hle hx) + exact ⟨c, hc.symm⟩ + · rintro ⟨c, rfl⟩ + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨l, h, rfl⟩) + +lemma coeffSubmodule_eq_span {s : Multiset FieldGenerators} + {l : List FieldGenerators} (h : Multiset.ofList l = s) : + CoeffSubmodule s = ℂ ∙ termOfList l := by + ext x + simp [coeffSubmodule_mem_iff_eq_mul h] + sorry + +/-- The map from coefficents associated with each list to the algebra. -/ +def ofListCoeff : (List FieldGenerators →₀ ℂ) →ₗ[ℂ] EFTLagrangianExclDeriv := + Finsupp.linearCombination ℂ termOfList + end From 2e8dd2763df0f1a8bff1992bb741a9337f8946af Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 3 Aug 2026 11:58:14 +0100 Subject: [PATCH 077/254] feat: Update to Jet bundles --- Physlib/Particles/LagrangianTheory/Basic.lean | 560 +++++++++--------- .../Basic.lean | 144 ++--- 2 files changed, 353 insertions(+), 351 deletions(-) rename Physlib/Particles/LagrangianTheory/{EFTLagrangianFreeDeriv => EFTLagrangianJet}/Basic.lean (65%) diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 8477b4d6b..3c90ed470 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -23,6 +23,7 @@ public import Mathlib.RingTheory.TensorProduct.Maps public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis public import Mathlib.Algebra.MvPolynomial.PDeriv +public import Mathlib.Data.Finsupp.Multiset public import Mathlib.LinearAlgebra.TensorAlgebra.Basis public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.Tensors.RealTensor.CoVector.Representation @@ -71,7 +72,7 @@ structure LagrangianTheory (G : Type) [Group G] where complexScalarBasis : ∀ φ, Basis (ComplexScalarComponents φ) ℂ (complexScalarModule φ) complexScalarRepLorentzGroup : ∀ φ, Representation ℂ SL(2,ℂ) (complexScalarModule φ) complexScalarRepGaugeGroup : ∀ φ, Representation ℂ G (complexScalarModule φ) - -- The real bosonic fields (e.g. the field strengths of the gauge bosons) + -- The real bosonic fields (e.g. the gauge bosons of the theory.) RealBosonIrreps : Type [realBosonIrreps_fintype : Fintype RealBosonIrreps] [realBosonIrreps_decEq : DecidableEq RealBosonIrreps] @@ -132,15 +133,15 @@ def fermionicGeneratorEquiv {L : LagrangianTheory G} : L.FermionicGenerator ≃ left_inv g := by cases g <;> rfl right_inv g := by cases g <;> rfl -inductive FermionicDerivGenerator (L : LagrangianTheory G) - | of (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.FermionIrreps) (α : L.FermionComponents φ) : - L.FermionicDerivGenerator - | bar (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.FermionIrreps) (α : L.FermionComponents φ) : - L.FermionicDerivGenerator +inductive FermionicJetGenerator (L : LagrangianTheory G) + | of (μ : Multiset (Fin 1 ⊕ Fin 3)) (φ : L.FermionIrreps) (α : L.FermionComponents φ) : + L.FermionicJetGenerator + | bar (μ : Multiset (Fin 1 ⊕ Fin 3)) (φ : L.FermionIrreps) (α : L.FermionComponents φ) : + L.FermionicJetGenerator -def fermionicDerivGeneratorEquiv {L : LagrangianTheory G} : L.FermionicDerivGenerator ≃ - (List (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) ⊕ - (List (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) where +def fermionicJetGeneratorEquiv {L : LagrangianTheory G} : L.FermionicJetGenerator ≃ + (Multiset (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) ⊕ + (Multiset (Fin 1 ⊕ Fin 3) × Σ φ : L.FermionIrreps, L.FermionComponents φ) where toFun g := match g with | .of μ φ α => Sum.inl (μ, ⟨φ, α⟩) | .bar μ φ α => Sum.inr (μ, ⟨φ, α⟩) @@ -163,18 +164,18 @@ def fermionicDerivGeneratorEquiv {L : LagrangianTheory G} : L.FermionicDerivGen This vector space includes all the fields appearing in the theory. -/ abbrev FermionicTargetSpace (L : LagrangianTheory G) := Π (φ : L.FermionIrreps), L.fermionModule φ -/-- The target vector space of covariant derivatives of fermions e.g. ∇_μ ψ. - This is similar to the Jet space associated with fermions, however, because covariant derivatives - do not commute, the commutation is not taken account of here. +/-- The target vector space of the jet-bundle coordinates of fermions e.g. ∂_μ ψ. + This is the fiber of the jet bundle associated with the fermions: since partial + derivatives commute, the derivative slots form a symmetric algebra. - This vector space includes all the fields in the theory + their covariant derivatives. -/ -abbrev FermionicDerivSpace (L : LagrangianTheory G) := - TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace + This vector space includes all the fields in the theory + their derivative coordinates. -/ +abbrev FermionicJetSpace (L : LagrangianTheory G) := + SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace /-- The fermionic target space linearly embeds into the fermionic target space with derivatives. -/ -def FermionicTargetSpace.toFermionicDerivSpace {L : LagrangianTheory G} : - L.FermionicTargetSpace →ₗ[ℂ] L.FermionicDerivSpace := - TensorProduct.mk ℂ (TensorAlgebra ℂ Lorentz.CoℂModule) L.FermionicTargetSpace 1 +def FermionicTargetSpace.toFermionicJetSpace {L : LagrangianTheory G} : + L.FermionicTargetSpace →ₗ[ℂ] L.FermionicJetSpace := + TensorProduct.mk ℂ (SymmetricAlgebra ℂ Lorentz.CoℂModule) L.FermionicTargetSpace 1 /-- Since fermions are complex fields, we also need to consider the target space of their complex conjugate. The vector space `FermionicTargetSpaceWithComplex` is defined @@ -187,10 +188,10 @@ abbrev FermionicTargetSpaceWithComplex (L : LagrangianTheory G) := L.FermionicTa /-- Similar to `FermionicTargetSpaceWithComplex` except including derivatives. This vector space includes all the fields present in the theory + their conjugates + all - their covariant derivatives. -/ -abbrev FermionicDerivSpaceWithComplex (L : LagrangianTheory G) := - (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace) × - (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] ConjModule L.FermionicTargetSpace) + their jet-bundle derivative coordinates. -/ +abbrev FermionicJetSpaceWithComplex (L : LagrangianTheory G) := + (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.FermionicTargetSpace) × + (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] ConjModule L.FermionicTargetSpace) /-- The vector space dual to `FermionicTargetSpaceWithComplex` and spanned by the component functions of all the fields + their conjugates in the theory. -/ @@ -198,16 +199,16 @@ abbrev FermionicComponentSpace (L : LagrangianTheory G) := Module.Dual ℂ L.FermionicTargetSpaceWithComplex /-- The vector space spanned by the component functions of all the fields + their - conjugates + all their covariant derivatives in the theory. + conjugates + all their jet-bundle derivative coordinates in the theory. - This is the *graded* dual of `FermionicDerivSpaceWithComplex`: the duals of the + This is the *graded* dual of `FermionicJetSpaceWithComplex`: the duals of the finite-dimensional building blocks are dualized individually and reassembled. The full - `Module.Dual` of `FermionicDerivSpaceWithComplex` is strictly larger (the latter is + `Module.Dual` of `FermionicJetSpaceWithComplex` is strictly larger (the latter is infinite dimensional) and is not spanned by the component functions. -/ -abbrev FermionicComponentSpaceWithDeriv (L : LagrangianTheory G) := - (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] +abbrev FermionicJetComponentSpace (L : LagrangianTheory G) := + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] Module.Dual ℂ L.FermionicTargetSpace) × - (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] Module.Dual ℂ (ConjModule L.FermionicTargetSpace)) /-! @@ -220,18 +221,18 @@ abbrev FermionicComponentSpaceWithDeriv (L : LagrangianTheory G) := abbrev FermionicEFTExclDeriv (L : LagrangianTheory G) := ExteriorAlgebra ℂ L.FermionicComponentSpace /-- The EFT algebra spanned by the fermions in the theory + their conjugate + all their - covariant derivatives without taking account of commutation of derivatives, or - total derivatives or equations of motion relations. -/ -abbrev FermionicEFTFreeDeriv (L : LagrangianTheory G) := - ExteriorAlgebra ℂ L.FermionicComponentSpaceWithDeriv + jet-bundle derivative coordinates, without taking account of total derivatives or + equations of motion relations. -/ +abbrev FermionicEFTJet (L : LagrangianTheory G) := + ExteriorAlgebra ℂ L.FermionicJetComponentSpace /-! ## A.3. The basis of the fermionic vector spaces -The main vector spaces are `FermionicComponentSpace` and `FermionicComponentSpaceWithDeriv`. +The main vector spaces are `FermionicComponentSpace` and `FermionicJetComponentSpace`. On these spaces we want to define a basis indexed by `FermionicGenerator` and -`FermionicDerivGenerator` respectively. +`FermionicJetGenerator` respectively. -/ @@ -240,14 +241,20 @@ noncomputable def FermionicComponentSpace.basis {L : LagrangianTheory G} : ((Pi.basis (fun φ => L.fermionBasis φ)).prod ((Pi.basis (fun φ => L.fermionBasis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm +/-- The basis of the symmetric algebra of dual jet slots, indexed by multisets of + spacetime indices. -/ +noncomputable def dualJetAlgebraBasis : + Basis (Multiset (Fin 1 ⊕ Fin 3)) ℂ (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) := + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.reindex Multiset.toFinsupp.toEquiv.symm -noncomputable def FermionicComponentSpaceWithDeriv.basis {L : LagrangianTheory G} : - Basis L.FermionicDerivGenerator ℂ L.FermionicComponentSpaceWithDeriv := - (((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct + +noncomputable def FermionicJetComponentSpace.basis {L : LagrangianTheory G} : + Basis L.FermionicJetGenerator ℂ L.FermionicJetComponentSpace := + ((dualJetAlgebraBasis.tensorProduct (Pi.basis fun φ => L.fermionBasis φ).dualBasis).prod - ((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct + (dualJetAlgebraBasis.tensorProduct ((Pi.basis fun φ => L.fermionBasis φ).conj.dualBasis))).reindex - fermionicDerivGeneratorEquiv.symm + fermionicJetGeneratorEquiv.symm /-! @@ -259,8 +266,8 @@ fields we take the Lorentz group to be `SL(2,ℂ)`, rather than dealing with pro representations of the Lorentz group. We are particularly interested in the representations acting on -- the vector spaces `FermionicComponentSpace` and `FermionicComponentSpaceWithDeriv`, and -- the algebras `FermionicEFTExclDeriv` and `FermionicEFTFreeDeriv`. +- the vector spaces `FermionicComponentSpace` and `FermionicJetComponentSpace`, and +- the algebras `FermionicEFTExclDeriv` and `FermionicEFTJet`. To define the representations on vector spaces involving derivatives, we first need to define the representations on the derivative algebras. @@ -270,53 +277,47 @@ we first need to define the representations on the derivative algebras. variable {L : LagrangianTheory G} -/-- The representation of the Lorentz group on the tensor algebra of covariant - derivatives, acting through `CoℂModule.SL2CRep` on each factor. -/ -noncomputable def derivAlgebraRepLorentzGroup : - Representation ℂ SL(2,ℂ) (TensorAlgebra ℂ Lorentz.CoℂModule) where - toFun Λ := (TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ)).toLinearMap +/-- The representation of the Lorentz group on the symmetric algebra of jet + coordinates, acting through `CoℂModule.SL2CRep` on each factor. -/ +noncomputable def jetAlgebraRepLorentzGroup : + Representation ℂ SL(2,ℂ) (SymmetricAlgebra ℂ Lorentz.CoℂModule) where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ)).toLinearMap map_one' := by - suffices h : TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep 1) = - AlgHom.id ℂ (TensorAlgebra ℂ Lorentz.CoℂModule) by - rw [h]; rfl - ext v - simp + simp [End.one_eq_id] map_mul' Λ1 Λ2 := by - suffices h : TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep (Λ1 * Λ2)) = - (TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ1)).comp - (TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ2)) by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep Λ2)) by rw [h]; rfl - ext v - simp + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] -noncomputable def dualDerivAlgebraRepLorentzGroup : - Representation ℂ SL(2,ℂ) (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where - toFun Λ := (TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ)).toLinearMap +noncomputable def dualJetAlgebraRepLorentzGroup : + Representation ℂ SL(2,ℂ) (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ)).toLinearMap map_one' := by - suffices h : TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual 1) = - AlgHom.id ℂ (TensorAlgebra ℂ _) by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual 1) = + AlgHom.id ℂ (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) by rw [h]; rfl - ext v + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp rfl map_mul' Λ1 Λ2 := by - suffices h : TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual (Λ1 * Λ2)) = - (TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ1)).comp - (TensorAlgebra.lift ℂ - (TensorAlgebra.ι ℂ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ2)) by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ2)) by rw [h]; rfl - ext v - simp - rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicTargetSpace where toFun Λ := LinearMap.piMap fun φ => L.fermionRepLorentzGroup φ Λ @@ -336,10 +337,10 @@ noncomputable def FermionicComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicComponentSpace := FermionicTargetSpaceWithComplex.repLorentzGroup.dual -noncomputable def FermionicComponentSpaceWithDeriv.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.FermionicComponentSpaceWithDeriv := - (dualDerivAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.dual).prod - (dualDerivAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.conj.dual) +noncomputable def FermionicJetComponentSpace.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.FermionicJetComponentSpace := + (dualJetAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.dual).prod + (dualJetAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.conj.dual) noncomputable def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicEFTExclDeriv where toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ)).toLinearMap @@ -350,10 +351,10 @@ noncomputable def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL( simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, AlgHom.comp_toLinearMap] -/-- The representation of the Lorentz group on the algebra `FermionicEFTFreeDeriv`. -/ -noncomputable def FermionicEFTFreeDeriv.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.FermionicEFTFreeDeriv where - toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repLorentzGroup Λ)).toLinearMap +/-- The representation of the Lorentz group on the algebra `FermionicEFTJet`. -/ +noncomputable def FermionicEFTJet.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.FermionicEFTJet where + toFun Λ := (ExteriorAlgebra.map (FermionicJetComponentSpace.repLorentzGroup Λ)).toLinearMap map_one' := by simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, AlgHom.toLinearMap_id] @@ -381,26 +382,25 @@ noncomputable def FermionicTargetSpaceWithComplex.repGaugeGroup : Representation ℂ G L.FermionicTargetSpaceWithComplex := FermionicTargetSpace.repGaugeGroup.prod (FermionicTargetSpace.repGaugeGroup.conj) -/-- The representation of the gauge group on the covariant-derivative space of the - fermionic fields. The gauge group acts trivially on the derivative slots: this is - the statement that the derivatives are *covariant* derivatives, so that `∇ ⋯ ∇ ψ` - transforms in the same representation of the gauge group as `ψ` itself. -/ -noncomputable def FermionicDerivSpace.repGaugeGroup : - Representation ℂ G L.FermionicDerivSpace := - (Representation.trivial ℂ G (TensorAlgebra ℂ Lorentz.CoℂModule)).tprod +/-- The representation of the gauge group on the jet space of the fermionic fields. + The gauge group acts trivially on the derivative slots, so that the jet coordinates + `∂ ⋯ ∂ ψ` transform in the same representation of the gauge group as `ψ` itself. -/ +noncomputable def FermionicJetSpace.repGaugeGroup : + Representation ℂ G L.FermionicJetSpace := + (Representation.trivial ℂ G (SymmetricAlgebra ℂ Lorentz.CoℂModule)).tprod FermionicTargetSpace.repGaugeGroup noncomputable def FermionicComponentSpace.repGaugeGroup : Representation ℂ G L.FermionicComponentSpace := FermionicTargetSpaceWithComplex.repGaugeGroup.dual /-- The representation of the gauge group on the space of component functions of the - fermionic fields, their conjugates, and their covariant derivatives; trivial on the - derivative slots. -/ -noncomputable def FermionicComponentSpaceWithDeriv.repGaugeGroup : - Representation ℂ G L.FermionicComponentSpaceWithDeriv := - ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + fermionic fields, their conjugates, and their jet-bundle derivative coordinates; + trivial on the derivative slots. -/ +noncomputable def FermionicJetComponentSpace.repGaugeGroup : + Representation ℂ G L.FermionicJetComponentSpace := + ((Representation.trivial ℂ G (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod FermionicTargetSpace.repGaugeGroup.dual).prod - ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + ((Representation.trivial ℂ G (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod FermionicTargetSpace.repGaugeGroup.conj.dual) noncomputable def FermionicEFTExclDeriv.repGaugeGroup : Representation ℂ G L.FermionicEFTExclDeriv where @@ -412,9 +412,9 @@ noncomputable def FermionicEFTExclDeriv.repGaugeGroup : Representation ℂ G L.F simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, AlgHom.comp_toLinearMap] -noncomputable def FermionicEFTFreeDeriv.repGaugeGroup : - Representation ℂ G L.FermionicEFTFreeDeriv where - toFun g := (ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repGaugeGroup g)).toLinearMap +noncomputable def FermionicEFTJet.repGaugeGroup : + Representation ℂ G L.FermionicEFTJet where + toFun g := (ExteriorAlgebra.map (FermionicJetComponentSpace.repGaugeGroup g)).toLinearMap map_one' := by simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, AlgHom.toLinearMap_id] @@ -454,15 +454,15 @@ def complexScalarGeneratorEquiv : L.ComplexScalarGenerator ≃ left_inv g := by cases g <;> rfl right_inv g := by cases g <;> rfl -inductive ComplexScalarDerivGenerator (L : LagrangianTheory G) - | of (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.ComplexScalarIrreps) - (α : L.ComplexScalarComponents φ) : L.ComplexScalarDerivGenerator - | bar (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.ComplexScalarIrreps) - (α : L.ComplexScalarComponents φ) : L.ComplexScalarDerivGenerator +inductive ComplexScalarJetGenerator (L : LagrangianTheory G) + | of (μ : Multiset (Fin 1 ⊕ Fin 3)) (φ : L.ComplexScalarIrreps) + (α : L.ComplexScalarComponents φ) : L.ComplexScalarJetGenerator + | bar (μ : Multiset (Fin 1 ⊕ Fin 3)) (φ : L.ComplexScalarIrreps) + (α : L.ComplexScalarComponents φ) : L.ComplexScalarJetGenerator -def complexScalarDerivGeneratorEquiv : L.ComplexScalarDerivGenerator ≃ - (List (Fin 1 ⊕ Fin 3) × Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) ⊕ - (List (Fin 1 ⊕ Fin 3) × Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) where +def complexScalarJetGeneratorEquiv : L.ComplexScalarJetGenerator ≃ + (Multiset (Fin 1 ⊕ Fin 3) × Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) ⊕ + (Multiset (Fin 1 ⊕ Fin 3) × Σ φ : L.ComplexScalarIrreps, L.ComplexScalarComponents φ) where toFun g := match g with | .of μ φ α => Sum.inl (μ, ⟨φ, α⟩) | .bar μ φ α => Sum.inr (μ, ⟨φ, α⟩) @@ -484,21 +484,20 @@ def complexScalarDerivGeneratorEquiv : L.ComplexScalarDerivGenerator ≃ abbrev ComplexScalarTargetSpace (L : LagrangianTheory G) := Π (φ : L.ComplexScalarIrreps), L.complexScalarModule φ -/-- The target vector space of covariant derivatives of the complex scalar fields - e.g. ∇_μ ϕ. This is similar to the Jet space associated with the scalars, however, - because covariant derivatives do not commute, the commutation is not taken account - of here. +/-- The target vector space of the jet-bundle coordinates of the complex scalar + fields e.g. ∂_μ ϕ. This is the fiber of the jet bundle associated with the scalars: + since partial derivatives commute, the derivative slots form a symmetric algebra. This vector space includes all the complex scalar fields in the theory + their - covariant derivatives. -/ -abbrev ComplexScalarDerivSpace (L : LagrangianTheory G) := - TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.ComplexScalarTargetSpace + derivative coordinates. -/ +abbrev ComplexScalarJetSpace (L : LagrangianTheory G) := + SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.ComplexScalarTargetSpace /-- The complex scalar target space linearly embeds into the complex scalar target space with derivatives. -/ -def ComplexScalarTargetSpace.toComplexScalarDerivSpace {L : LagrangianTheory G} : - L.ComplexScalarTargetSpace →ₗ[ℂ] L.ComplexScalarDerivSpace := - TensorProduct.mk ℂ (TensorAlgebra ℂ Lorentz.CoℂModule) L.ComplexScalarTargetSpace 1 +def ComplexScalarTargetSpace.toComplexScalarJetSpace {L : LagrangianTheory G} : + L.ComplexScalarTargetSpace →ₗ[ℂ] L.ComplexScalarJetSpace := + TensorProduct.mk ℂ (SymmetricAlgebra ℂ Lorentz.CoℂModule) L.ComplexScalarTargetSpace 1 /-- The target space of the complex scalar fields, including their conjugates. -/ abbrev ComplexScalarTargetSpaceWithComplex (L : LagrangianTheory G) := @@ -507,10 +506,10 @@ abbrev ComplexScalarTargetSpaceWithComplex (L : LagrangianTheory G) := /-- Similar to `ComplexScalarTargetSpaceWithComplex` except including derivatives. This vector space includes all the complex scalar fields present in the theory + - their conjugates + all their covariant derivatives. -/ -abbrev ComplexScalarDerivSpaceWithComplex (L : LagrangianTheory G) := - (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.ComplexScalarTargetSpace) × - (TensorAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] ConjModule L.ComplexScalarTargetSpace) + their conjugates + all their jet-bundle derivative coordinates. -/ +abbrev ComplexScalarJetSpaceWithComplex (L : LagrangianTheory G) := + (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] L.ComplexScalarTargetSpace) × + (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] ConjModule L.ComplexScalarTargetSpace) /-- The vector space dual to `ComplexScalarTargetSpaceWithComplex` and spanned by the component functions of all the complex scalar fields + their conjugates in the @@ -519,16 +518,17 @@ abbrev ComplexScalarComponentSpace (L : LagrangianTheory G) := Module.Dual ℂ L.ComplexScalarTargetSpaceWithComplex /-- The vector space spanned by the component functions of all the complex scalar - fields + their conjugates + all their covariant derivatives in the theory. + fields + their conjugates + all their jet-bundle derivative coordinates in the + theory. - This is the *graded* dual of `ComplexScalarDerivSpaceWithComplex`: the duals of the + This is the *graded* dual of `ComplexScalarJetSpaceWithComplex`: the duals of the finite-dimensional building blocks are dualized individually and reassembled. The - full `Module.Dual` of `ComplexScalarDerivSpaceWithComplex` is strictly larger (the + full `Module.Dual` of `ComplexScalarJetSpaceWithComplex` is strictly larger (the latter is infinite dimensional) and is not spanned by the component functions. -/ -abbrev ComplexScalarComponentSpaceWithDeriv (L : LagrangianTheory G) := - (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] +abbrev ComplexScalarJetComponentSpace (L : LagrangianTheory G) := + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] Module.Dual ℂ L.ComplexScalarTargetSpace) × - (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] Module.Dual ℂ (ConjModule L.ComplexScalarTargetSpace)) /-! @@ -542,18 +542,18 @@ abbrev ComplexScalarEFTExclDeriv (L : LagrangianTheory G) := SymmetricAlgebra ℂ L.ComplexScalarComponentSpace /-- The EFT algebra spanned by the complex scalars in the theory + their conjugate + - all their covariant derivatives without taking account of commutation of - derivatives, or total derivatives or equations of motion relations. -/ -abbrev ComplexScalarEFTFreeDeriv (L : LagrangianTheory G) := - SymmetricAlgebra ℂ L.ComplexScalarComponentSpaceWithDeriv + all their jet-bundle derivative coordinates, without taking account of total + derivatives or equations of motion relations. -/ +abbrev ComplexScalarEFTJet (L : LagrangianTheory G) := + SymmetricAlgebra ℂ L.ComplexScalarJetComponentSpace /-! ### B.3. The basis of the complex scalar vector spaces The main vector spaces are `ComplexScalarComponentSpace` and -`ComplexScalarComponentSpaceWithDeriv`. On these spaces we want to define a basis -indexed by `ComplexScalarGenerator` and `ComplexScalarDerivGenerator` respectively. +`ComplexScalarJetComponentSpace`. On these spaces we want to define a basis +indexed by `ComplexScalarGenerator` and `ComplexScalarJetGenerator` respectively. -/ @@ -563,13 +563,13 @@ noncomputable def ComplexScalarComponentSpace.basis : ((Pi.basis (fun φ => L.complexScalarBasis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm -noncomputable def ComplexScalarComponentSpaceWithDeriv.basis : - Basis L.ComplexScalarDerivGenerator ℂ L.ComplexScalarComponentSpaceWithDeriv := - (((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct +noncomputable def ComplexScalarJetComponentSpace.basis : + Basis L.ComplexScalarJetGenerator ℂ L.ComplexScalarJetComponentSpace := + ((dualJetAlgebraBasis.tensorProduct (Pi.basis fun φ => L.complexScalarBasis φ).dualBasis).prod - ((Lorentz.complexCoBasis.dualBasis.tensorAlgebra).tensorProduct + (dualJetAlgebraBasis.tensorProduct ((Pi.basis fun φ => L.complexScalarBasis φ).conj.dualBasis))).reindex - complexScalarDerivGeneratorEquiv.symm + complexScalarJetGeneratorEquiv.symm /-! @@ -596,10 +596,10 @@ noncomputable def ComplexScalarComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.ComplexScalarComponentSpace := ComplexScalarTargetSpaceWithComplex.repLorentzGroup.dual -noncomputable def ComplexScalarComponentSpaceWithDeriv.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.ComplexScalarComponentSpaceWithDeriv := - (dualDerivAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.dual).prod - (dualDerivAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.conj.dual) +noncomputable def ComplexScalarJetComponentSpace.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarJetComponentSpace := + (dualJetAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.dual).prod + (dualJetAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.conj.dual) noncomputable def ComplexScalarEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) L.ComplexScalarEFTExclDeriv where @@ -618,20 +618,20 @@ noncomputable def ComplexScalarEFTExclDeriv.repLorentzGroup : ext v simp -/-- The representation of the Lorentz group on the algebra `ComplexScalarEFTFreeDeriv`. -/ -noncomputable def ComplexScalarEFTFreeDeriv.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.ComplexScalarEFTFreeDeriv where +/-- The representation of the Lorentz group on the algebra `ComplexScalarEFTJet`. -/ +noncomputable def ComplexScalarEFTJet.repLorentzGroup : + Representation ℂ SL(2,ℂ) L.ComplexScalarEFTJet where toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ)).toLinearMap + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ)).toLinearMap map_one' := by simp [End.one_eq_id] map_mul' Λ1 Λ2 := by suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup (Λ1 * Λ2)) = (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ1)).comp + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ1)).comp (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ2)) by + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ2)) by rw [h]; rfl refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [map_mul, Module.End.mul_apply] @@ -657,13 +657,13 @@ noncomputable def ComplexScalarTargetSpaceWithComplex.repGaugeGroup : Representation ℂ G L.ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace.repGaugeGroup.prod (ComplexScalarTargetSpace.repGaugeGroup.conj) -/-- The representation of the gauge group on the covariant-derivative space of the - complex scalar fields. The gauge group acts trivially on the derivative slots: this - is the statement that the derivatives are *covariant* derivatives, so that `∇ ⋯ ∇ ϕ` - transforms in the same representation of the gauge group as `ϕ` itself. -/ -noncomputable def ComplexScalarDerivSpace.repGaugeGroup : - Representation ℂ G L.ComplexScalarDerivSpace := - (Representation.trivial ℂ G (TensorAlgebra ℂ Lorentz.CoℂModule)).tprod +/-- The representation of the gauge group on the jet space of the complex scalar + fields. The gauge group acts trivially on the derivative slots, so that the jet + coordinates `∂ ⋯ ∂ ϕ` transform in the same representation of the gauge group as + `ϕ` itself. -/ +noncomputable def ComplexScalarJetSpace.repGaugeGroup : + Representation ℂ G L.ComplexScalarJetSpace := + (Representation.trivial ℂ G (SymmetricAlgebra ℂ Lorentz.CoℂModule)).tprod ComplexScalarTargetSpace.repGaugeGroup noncomputable def ComplexScalarComponentSpace.repGaugeGroup : @@ -671,13 +671,13 @@ noncomputable def ComplexScalarComponentSpace.repGaugeGroup : ComplexScalarTargetSpaceWithComplex.repGaugeGroup.dual /-- The representation of the gauge group on the space of component functions of the - complex scalar fields, their conjugates, and their covariant derivatives; trivial on - the derivative slots. -/ -noncomputable def ComplexScalarComponentSpaceWithDeriv.repGaugeGroup : - Representation ℂ G L.ComplexScalarComponentSpaceWithDeriv := - ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + complex scalar fields, their conjugates, and their jet-bundle derivative + coordinates; trivial on the derivative slots. -/ +noncomputable def ComplexScalarJetComponentSpace.repGaugeGroup : + Representation ℂ G L.ComplexScalarJetComponentSpace := + ((Representation.trivial ℂ G (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod ComplexScalarTargetSpace.repGaugeGroup.dual).prod - ((Representation.trivial ℂ G (TensorAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod + ((Representation.trivial ℂ G (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod ComplexScalarTargetSpace.repGaugeGroup.conj.dual) noncomputable def ComplexScalarEFTExclDeriv.repGaugeGroup : @@ -697,19 +697,19 @@ noncomputable def ComplexScalarEFTExclDeriv.repGaugeGroup : ext v simp -noncomputable def ComplexScalarEFTFreeDeriv.repGaugeGroup : - Representation ℂ G L.ComplexScalarEFTFreeDeriv where +noncomputable def ComplexScalarEFTJet.repGaugeGroup : + Representation ℂ G L.ComplexScalarEFTJet where toFun g := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g)).toLinearMap + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g)).toLinearMap map_one' := by simp [End.one_eq_id] map_mul' g1 g2 := by suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup (g1 * g2)) = + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup (g1 * g2)) = (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g1)).comp + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g1)).comp (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g2)) by + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g2)) by rw [h]; rfl refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [map_mul, Module.End.mul_apply] @@ -737,12 +737,12 @@ def realBosonGeneratorEquiv : left_inv g := by cases g; rfl right_inv g := by cases g; rfl -inductive RealBosonDerivGenerator (L : LagrangianTheory G) - | of (μ : List (Fin 1 ⊕ Fin 3)) (φ : L.RealBosonIrreps) (α : L.RealBosonComponents φ) : - L.RealBosonDerivGenerator +inductive RealBosonJetGenerator (L : LagrangianTheory G) + | of (μ : Multiset (Fin 1 ⊕ Fin 3)) (φ : L.RealBosonIrreps) (α : L.RealBosonComponents φ) : + L.RealBosonJetGenerator -def realBosonDerivGeneratorEquiv : L.RealBosonDerivGenerator ≃ - List (Fin 1 ⊕ Fin 3) × Σ φ : L.RealBosonIrreps, L.RealBosonComponents φ where +def realBosonJetGeneratorEquiv : L.RealBosonJetGenerator ≃ + Multiset (Fin 1 ⊕ Fin 3) × Σ φ : L.RealBosonIrreps, L.RealBosonComponents φ where toFun g := match g with | .of μ φ α => (μ, ⟨φ, α⟩) invFun g := match g with @@ -762,20 +762,20 @@ def realBosonDerivGeneratorEquiv : L.RealBosonDerivGenerator ≃ abbrev RealBosonTargetSpace (L : LagrangianTheory G) := Π (φ : L.RealBosonIrreps), L.realBosonModule φ -/-- The target vector space of covariant derivatives of the real bosonic fields - e.g. ∇_μ B. Because covariant derivatives do not commute, the commutation is not - taken account of here. +/-- The target vector space of the jet-bundle coordinates of the real bosonic fields + e.g. ∂_μ B. Since partial derivatives commute, the derivative slots form a + symmetric algebra. This vector space includes all the real bosonic fields in the theory + their - covariant derivatives. -/ -abbrev RealBosonDerivSpace (L : LagrangianTheory G) := - TensorAlgebra ℝ Lorentz.CoVector ⊗[ℝ] L.RealBosonTargetSpace + derivative coordinates. -/ +abbrev RealBosonJetSpace (L : LagrangianTheory G) := + SymmetricAlgebra ℝ Lorentz.CoVector ⊗[ℝ] L.RealBosonTargetSpace /-- The real bosonic target space linearly embeds into the real bosonic target space with derivatives. -/ -def RealBosonTargetSpace.toRealBosonDerivSpace {L : LagrangianTheory G} : - L.RealBosonTargetSpace →ₗ[ℝ] L.RealBosonDerivSpace := - TensorProduct.mk ℝ (TensorAlgebra ℝ Lorentz.CoVector) L.RealBosonTargetSpace 1 +def RealBosonTargetSpace.toRealBosonJetSpace {L : LagrangianTheory G} : + L.RealBosonTargetSpace →ₗ[ℝ] L.RealBosonJetSpace := + TensorProduct.mk ℝ (SymmetricAlgebra ℝ Lorentz.CoVector) L.RealBosonTargetSpace 1 /-- The vector space dual to `RealBosonTargetSpace` and spanned by the component functions of all the real bosonic fields in the theory. There is no conjugate @@ -784,12 +784,12 @@ abbrev RealBosonComponentSpace (L : LagrangianTheory G) := Module.Dual ℝ L.RealBosonTargetSpace /-- The vector space spanned by the component functions of all the real bosonic - fields + all their covariant derivatives in the theory. + fields + all their jet-bundle derivative coordinates in the theory. - This is the *graded* dual of `RealBosonDerivSpace`: the duals of the + This is the *graded* dual of `RealBosonJetSpace`: the duals of the finite-dimensional building blocks are dualized individually and reassembled. -/ -abbrev RealBosonComponentSpaceWithDeriv (L : LagrangianTheory G) := - TensorAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) ⊗[ℝ] Module.Dual ℝ L.RealBosonTargetSpace +abbrev RealBosonJetComponentSpace (L : LagrangianTheory G) := + SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) ⊗[ℝ] Module.Dual ℝ L.RealBosonTargetSpace /-! @@ -802,10 +802,10 @@ abbrev RealBosonEFTExclDeriv (L : LagrangianTheory G) := SymmetricAlgebra ℝ L.RealBosonComponentSpace /-- The EFT algebra spanned by the real bosonic fields in the theory + all their - covariant derivatives without taking account of commutation of derivatives, or - total derivatives or equations of motion relations. -/ -abbrev RealBosonEFTFreeDeriv (L : LagrangianTheory G) := - SymmetricAlgebra ℝ L.RealBosonComponentSpaceWithDeriv + jet-bundle derivative coordinates, without taking account of total derivatives or + equations of motion relations. -/ +abbrev RealBosonEFTJet (L : LagrangianTheory G) := + SymmetricAlgebra ℝ L.RealBosonJetComponentSpace /-- The real bosonic EFT algebra with complex coefficients: the real bosonic EFT @@ -813,11 +813,11 @@ abbrev RealBosonEFTFreeDeriv (L : LagrangianTheory G) := complex scalar and fermionic algebras in the full EFT Lagrangian. -/ abbrev RealBosonEFTExclDerivComplex (L : LagrangianTheory G) := ℂ ⊗[ℝ] L.RealBosonEFTExclDeriv -/-- The real bosonic EFT algebra including covariant derivatives, with complex - coefficients: `RealBosonEFTFreeDeriv` with scalars extended from `ℝ` to `ℂ`, so +/-- The real bosonic EFT algebra including jet-bundle derivative coordinates, with complex + coefficients: `RealBosonEFTJet` with scalars extended from `ℝ` to `ℂ`, so that it can be combined with the complex scalar and fermionic algebras in the full EFT Lagrangian. -/ -abbrev RealBosonEFTFreeDerivComplex (L : LagrangianTheory G) := ℂ ⊗[ℝ] L.RealBosonEFTFreeDeriv +abbrev RealBosonEFTJetComplex (L : LagrangianTheory G) := ℂ ⊗[ℝ] L.RealBosonEFTJet /-! @@ -830,11 +830,17 @@ noncomputable def RealBosonComponentSpace.basis : Basis L.RealBosonGenerator ℝ L.RealBosonComponentSpace := (Pi.basis (fun φ => L.realBosonBasis φ)).dualBasis.reindex realBosonGeneratorEquiv.symm -noncomputable def RealBosonComponentSpaceWithDeriv.basis : - Basis L.RealBosonDerivGenerator ℝ L.RealBosonComponentSpaceWithDeriv := - ((Lorentz.CoVector.basis.dualBasis.tensorAlgebra).tensorProduct +/-- The basis of the symmetric algebra of dual real jet slots, indexed by multisets of + spacetime indices. -/ +noncomputable def dualRealJetAlgebraBasis : + Basis (Multiset (Fin 1 ⊕ Fin 3)) ℝ (SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) := + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.reindex Multiset.toFinsupp.toEquiv.symm + +noncomputable def RealBosonJetComponentSpace.basis : + Basis L.RealBosonJetGenerator ℝ L.RealBosonJetComponentSpace := + (dualRealJetAlgebraBasis.tensorProduct (Pi.basis fun φ => L.realBosonBasis φ).dualBasis).reindex - realBosonDerivGeneratorEquiv.symm + realBosonJetGeneratorEquiv.symm /-! @@ -848,55 +854,49 @@ noncomputable def RealBosonComponentSpaceWithDeriv.basis : noncomputable def realBosonSlotRepLorentzGroup : Representation ℝ SL(2,ℂ) Lorentz.CoVector := MonoidHom.comp Lorentz.CoVector.rep Lorentz.SL2C.toLorentzGroup -/-- The representation of the Lorentz group on the tensor algebra of real covariant - derivative slots. -/ -noncomputable def realDerivAlgebraRepLorentzGroup : - Representation ℝ SL(2,ℂ) (TensorAlgebra ℝ Lorentz.CoVector) where - toFun Λ := (TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup Λ)).toLinearMap +/-- The representation of the Lorentz group on the symmetric algebra of real jet + coordinate slots. -/ +noncomputable def realJetAlgebraRepLorentzGroup : + Representation ℝ SL(2,ℂ) (SymmetricAlgebra ℝ Lorentz.CoVector) where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup Λ)).toLinearMap map_one' := by - suffices h : TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup 1) = - AlgHom.id ℝ (TensorAlgebra ℝ Lorentz.CoVector) by - rw [h]; rfl - ext v - simp + simp [End.one_eq_id] map_mul' Λ1 Λ2 := by - suffices h : TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup (Λ1 * Λ2)) = - (TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup Λ1)).comp - (TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup Λ2)) by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup Λ2)) by rw [h]; rfl - ext v - simp [realBosonSlotRepLorentzGroup] - -/-- The representation of the Lorentz group on the tensor algebra of dual real - covariant derivative slots. -/ -noncomputable def dualRealDerivAlgebraRepLorentzGroup : - Representation ℝ SL(2,ℂ) (TensorAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) where - toFun Λ := (TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ)).toLinearMap + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + +/-- The representation of the Lorentz group on the symmetric algebra of dual real + jet coordinate slots. -/ +noncomputable def dualRealJetAlgebraRepLorentzGroup : + Representation ℝ SL(2,ℂ) (SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ)).toLinearMap map_one' := by - suffices h : TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual 1) = - AlgHom.id ℝ (TensorAlgebra ℝ _) by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual 1) = + AlgHom.id ℝ (SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) by rw [h]; rfl - ext v + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp rfl map_mul' Λ1 Λ2 := by - suffices h : TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual (Λ1 * Λ2)) = - (TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ1)).comp - (TensorAlgebra.lift ℝ - (TensorAlgebra.ι ℝ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ2)) by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ2)) by rw [h]; rfl - ext v - simp - rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] def RealBosonTargetSpace.repLorentzGroup : Representation ℝ SL(2,ℂ) L.RealBosonTargetSpace where @@ -909,20 +909,20 @@ def RealBosonTargetSpace.repLorentzGroup : ext x i y simp -/-- The representation of the Lorentz group on the covariant-derivative space of the - real bosonic fields: the tensor product of the action on the derivative slots and - the action on the real bosonic target space. -/ -noncomputable def RealBosonDerivSpace.repLorentzGroup : - Representation ℝ SL(2,ℂ) L.RealBosonDerivSpace := - realDerivAlgebraRepLorentzGroup.tprod RealBosonTargetSpace.repLorentzGroup +/-- The representation of the Lorentz group on the jet space of the real bosonic + fields: the tensor product of the action on the derivative slots and the action on + the real bosonic target space. -/ +noncomputable def RealBosonJetSpace.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonJetSpace := + realJetAlgebraRepLorentzGroup.tprod RealBosonTargetSpace.repLorentzGroup noncomputable def RealBosonComponentSpace.repLorentzGroup : Representation ℝ SL(2,ℂ) L.RealBosonComponentSpace := RealBosonTargetSpace.repLorentzGroup.dual -noncomputable def RealBosonComponentSpaceWithDeriv.repLorentzGroup : - Representation ℝ SL(2,ℂ) L.RealBosonComponentSpaceWithDeriv := - dualRealDerivAlgebraRepLorentzGroup.tprod RealBosonTargetSpace.repLorentzGroup.dual +noncomputable def RealBosonJetComponentSpace.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonJetComponentSpace := + dualRealJetAlgebraRepLorentzGroup.tprod RealBosonTargetSpace.repLorentzGroup.dual noncomputable def RealBosonEFTExclDeriv.repLorentzGroup : Representation ℝ SL(2,ℂ) L.RealBosonEFTExclDeriv where @@ -941,20 +941,20 @@ noncomputable def RealBosonEFTExclDeriv.repLorentzGroup : ext v simp -/-- The representation of the Lorentz group on the algebra `RealBosonEFTFreeDeriv`. -/ -noncomputable def RealBosonEFTFreeDeriv.repLorentzGroup : - Representation ℝ SL(2,ℂ) L.RealBosonEFTFreeDeriv where +/-- The representation of the Lorentz group on the algebra `RealBosonEFTJet`. -/ +noncomputable def RealBosonEFTJet.repLorentzGroup : + Representation ℝ SL(2,ℂ) L.RealBosonEFTJet where toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ)).toLinearMap + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup Λ)).toLinearMap map_one' := by simp [End.one_eq_id] map_mul' Λ1 Λ2 := by suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup (Λ1 * Λ2)) = (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ1)).comp + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup Λ1)).comp (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ2)) by + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup Λ2)) by rw [h]; rfl refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [map_mul, Module.End.mul_apply] @@ -977,10 +977,10 @@ noncomputable def RealBosonEFTExclDerivComplex.repLorentzGroup : /-- The representation of the Lorentz group on the complexified real bosonic EFT algebra with derivatives, obtained from the real representation by extension of scalars. -/ -noncomputable def RealBosonEFTFreeDerivComplex.repLorentzGroup : - Representation ℂ SL(2,ℂ) (RealBosonEFTFreeDerivComplex L) where +noncomputable def RealBosonEFTJetComplex.repLorentzGroup : + Representation ℂ SL(2,ℂ) (RealBosonEFTJetComplex L) where toFun Λ := - LinearMap.baseChange ℂ (RealBosonEFTFreeDeriv.repLorentzGroup Λ) + LinearMap.baseChange ℂ (RealBosonEFTJet.repLorentzGroup Λ) map_one' := by ext x simp [Module.End.one_eq_id] @@ -1006,13 +1006,13 @@ def RealBosonTargetSpace.repGaugeGroup : ext x i y simp -/-- The representation of the gauge group on the covariant-derivative space of the - real bosonic fields. The gauge group acts trivially on the derivative slots: this - is the statement that the derivatives are *covariant* derivatives, so that `∇ ⋯ ∇ B` - transforms in the same representation of the gauge group as `B` itself. -/ -noncomputable def RealBosonDerivSpace.repGaugeGroup : - Representation ℝ G L.RealBosonDerivSpace := - (Representation.trivial ℝ G (TensorAlgebra ℝ Lorentz.CoVector)).tprod +/-- The representation of the gauge group on the jet space of the real bosonic + fields. The gauge group acts trivially on the derivative slots, so that the jet + coordinates `∂ ⋯ ∂ B` transform in the same representation of the gauge group as + `B` itself. -/ +noncomputable def RealBosonJetSpace.repGaugeGroup : + Representation ℝ G L.RealBosonJetSpace := + (Representation.trivial ℝ G (SymmetricAlgebra ℝ Lorentz.CoVector)).tprod RealBosonTargetSpace.repGaugeGroup noncomputable def RealBosonComponentSpace.repGaugeGroup : @@ -1020,11 +1020,11 @@ noncomputable def RealBosonComponentSpace.repGaugeGroup : RealBosonTargetSpace.repGaugeGroup.dual /-- The representation of the gauge group on the space of component functions of the - real bosonic fields and their covariant derivatives; trivial on the derivative - slots. -/ -noncomputable def RealBosonComponentSpaceWithDeriv.repGaugeGroup : - Representation ℝ G L.RealBosonComponentSpaceWithDeriv := - (Representation.trivial ℝ G (TensorAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector))).tprod + real bosonic fields and their jet-bundle derivative coordinates; trivial on the + derivative slots. -/ +noncomputable def RealBosonJetComponentSpace.repGaugeGroup : + Representation ℝ G L.RealBosonJetComponentSpace := + (Representation.trivial ℝ G (SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector))).tprod RealBosonTargetSpace.repGaugeGroup.dual noncomputable def RealBosonEFTExclDeriv.repGaugeGroup : @@ -1044,19 +1044,19 @@ noncomputable def RealBosonEFTExclDeriv.repGaugeGroup : ext v simp -noncomputable def RealBosonEFTFreeDeriv.repGaugeGroup : - Representation ℝ G L.RealBosonEFTFreeDeriv where +noncomputable def RealBosonEFTJet.repGaugeGroup : + Representation ℝ G L.RealBosonEFTJet where toFun g := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g)).toLinearMap + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup g)).toLinearMap map_one' := by simp [End.one_eq_id] map_mul' g1 g2 := by suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup (g1 * g2)) = + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup (g1 * g2)) = (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g1)).comp + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup g1)).comp (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g2)) by + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup g2)) by rw [h]; rfl refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [map_mul, Module.End.mul_apply] @@ -1075,10 +1075,10 @@ noncomputable def RealBosonEFTExclDerivComplex.repGaugeGroup : /-- The representation of the gauge group on the complexified real bosonic EFT algebra with derivatives, obtained from the real representation by extension of scalars. -/ -noncomputable def RealBosonEFTFreeDerivComplex.repGaugeGroup : - Representation ℂ G (RealBosonEFTFreeDerivComplex L) where +noncomputable def RealBosonEFTJetComplex.repGaugeGroup : + Representation ℂ G (RealBosonEFTJetComplex L) where toFun g := - LinearMap.baseChange ℂ (RealBosonEFTFreeDeriv.repGaugeGroup g) + LinearMap.baseChange ℂ (RealBosonEFTJet.repGaugeGroup g) map_one' := by ext x simp [Module.End.one_eq_id] diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean similarity index 65% rename from Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean rename to Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean index 7759b63b3..fcfd787a4 100644 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianFreeDeriv/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean @@ -9,13 +9,14 @@ public import Physlib.Particles.LagrangianTheory.Basic /-! -# The EFT Lagrangian with free derivatives +# The jet EFT Lagrangian ## i. Overview For a Lagrangian theory, this file defines the algebra of complex-scalar, real-boson, and -fermionic expressions with arbitrarily many derivatives. It defines the Lorentz and gauge actions -as algebra automorphisms and gives their corresponding linear representations. +fermionic expressions with arbitrarily many jet-bundle derivative coordinates. It defines the +Lorentz and gauge actions as algebra automorphisms and gives their corresponding linear +representations. -/ @@ -86,22 +87,23 @@ def tensorProductAlgAut {B : Type*} [Semiring B] [Algebra R B] variable {G : Type} [Group G] variable {L : LagrangianTheory G} -/-- The algebra of Lagrangian expressions freely generated by fields and their derivatives. -/ -abbrev EFTLagrangianFreeDeriv (L : LagrangianTheory G) : Type := - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] - L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv +/-- The algebra of Lagrangian expressions generated by fields and their jet-bundle +derivative coordinates. -/ +abbrev EFTLagrangianJet (L : LagrangianTheory G) : Type := + L.ComplexScalarEFTJet ⊗[ℂ] + L.RealBosonEFTJetComplex ⊗[ℂ] L.FermionicEFTJet -namespace EFTLagrangianFreeDeriv +namespace EFTLagrangianJet set_option maxSynthPendingDepth 4 in -noncomputable instance : Ring L.EFTLagrangianFreeDeriv := inferInstanceAs <| - Ring (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] - L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv) +noncomputable instance : Ring L.EFTLagrangianJet := inferInstanceAs <| + Ring (L.ComplexScalarEFTJet ⊗[ℂ] + L.RealBosonEFTJetComplex ⊗[ℂ] L.FermionicEFTJet) set_option maxSynthPendingDepth 4 in -noncomputable instance : Algebra ℂ L.EFTLagrangianFreeDeriv := inferInstanceAs <| - Algebra ℂ (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] - L.RealBosonEFTFreeDerivComplex ⊗[ℂ] L.FermionicEFTFreeDeriv) +noncomputable instance : Algebra ℂ L.EFTLagrangianJet := inferInstanceAs <| + Algebra ℂ (L.ComplexScalarEFTJet ⊗[ℂ] + L.RealBosonEFTJetComplex ⊗[ℂ] L.FermionicEFTJet) /-! @@ -113,45 +115,45 @@ noncomputable instance : Algebra ℂ L.EFTLagrangianFreeDeriv := inferInstanceAs /-- The Lorentz action on the complex-scalar factor as an algebra homomorphism. -/ noncomputable def complexScalarLorentzAlgHom (Λ : SL(2,ℂ)) : - L.ComplexScalarEFTFreeDeriv →ₐ[ℂ] L.ComplexScalarEFTFreeDeriv := + L.ComplexScalarEFTJet →ₐ[ℂ] L.ComplexScalarEFTJet := SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repLorentzGroup Λ) + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ) /-- The Lorentz action on the complex-scalar factor by algebra automorphisms. -/ noncomputable def complexScalarLorentzAlgAut : - SL(2,ℂ) →* (L.ComplexScalarEFTFreeDeriv ≃ₐ[ℂ] L.ComplexScalarEFTFreeDeriv) := - algAutOfRepresentation ComplexScalarEFTFreeDeriv.repLorentzGroup + SL(2,ℂ) →* (L.ComplexScalarEFTJet ≃ₐ[ℂ] L.ComplexScalarEFTJet) := + algAutOfRepresentation ComplexScalarEFTJet.repLorentzGroup complexScalarLorentzAlgHom fun _ _ => rfl /-- The Lorentz action on the fermionic factor as an algebra homomorphism. -/ noncomputable def fermionicLorentzAlgHom (Λ : SL(2,ℂ)) : - L.FermionicEFTFreeDeriv →ₐ[ℂ] L.FermionicEFTFreeDeriv := - ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repLorentzGroup Λ) + L.FermionicEFTJet →ₐ[ℂ] L.FermionicEFTJet := + ExteriorAlgebra.map (FermionicJetComponentSpace.repLorentzGroup Λ) /-- The Lorentz action on the fermionic factor by algebra automorphisms. -/ noncomputable def fermionicLorentzAlgAut : - SL(2,ℂ) →* (L.FermionicEFTFreeDeriv ≃ₐ[ℂ] L.FermionicEFTFreeDeriv) := - algAutOfRepresentation FermionicEFTFreeDeriv.repLorentzGroup + SL(2,ℂ) →* (L.FermionicEFTJet ≃ₐ[ℂ] L.FermionicEFTJet) := + algAutOfRepresentation FermionicEFTJet.repLorentzGroup fermionicLorentzAlgHom fun _ _ => rfl /-- The Lorentz action on the real-boson factor as a real algebra homomorphism. -/ noncomputable def realBosonLorentzAlgHom (Λ : SL(2,ℂ)) : - L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDeriv := + L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJet := SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repLorentzGroup Λ) + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup Λ) /-- The scalar extension of the real-boson Lorentz action as a complex algebra homomorphism. -/ noncomputable def realBosonComplexLorentzAlgHom (Λ : SL(2,ℂ)) : - L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] L.RealBosonEFTFreeDerivComplex := - (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTFreeDeriv L.RealBosonEFTFreeDerivComplex) + L.RealBosonEFTJetComplex →ₐ[ℂ] L.RealBosonEFTJetComplex := + (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTJet L.RealBosonEFTJetComplex) ((Algebra.TensorProduct.includeRight : - L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDerivComplex).comp + L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJetComplex).comp (realBosonLorentzAlgHom Λ)) /-- The complex real-boson Lorentz representation agrees with its algebra homomorphism. -/ lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) - (x : L.RealBosonEFTFreeDerivComplex) : - RealBosonEFTFreeDerivComplex.repLorentzGroup Λ x = + (x : L.RealBosonEFTJetComplex) : + RealBosonEFTJetComplex.repLorentzGroup Λ x = realBosonComplexLorentzAlgHom Λ x := by induction x using TensorProduct.induction_on with | zero => simp @@ -164,8 +166,8 @@ lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) /-- The Lorentz action on the complexified real-boson factor by algebra automorphisms. -/ noncomputable def realBosonComplexLorentzAlgAut : SL(2,ℂ) →* - (L.RealBosonEFTFreeDerivComplex ≃ₐ[ℂ] L.RealBosonEFTFreeDerivComplex) := - algAutOfRepresentation RealBosonEFTFreeDerivComplex.repLorentzGroup + (L.RealBosonEFTJetComplex ≃ₐ[ℂ] L.RealBosonEFTJetComplex) := + algAutOfRepresentation RealBosonEFTJetComplex.repLorentzGroup realBosonComplexLorentzAlgHom realBosonComplex_repLorentzGroup_apply /-! @@ -177,37 +179,37 @@ noncomputable def realBosonComplexLorentzAlgAut : /-- The Lorentz action on the two bosonic factors by algebra automorphisms. -/ noncomputable def bosonicLorentzAlgAut : SL(2,ℂ) →* - ((L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) ≃ₐ[ℂ] - (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex)) := + ((L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex) ≃ₐ[ℂ] + (L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex)) := tensorProductAlgAut complexScalarLorentzAlgAut realBosonComplexLorentzAlgAut /-- The Lorentz action on the bosonic factors as an algebra homomorphism. -/ noncomputable def bosonicLorentzAlgHom (Λ : SL(2,ℂ)) : - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := + L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex →ₐ[ℂ] + L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex := (bosonicLorentzAlgAut Λ).toAlgHom -/-- The Lorentz action on the free-derivative Lagrangian by algebra automorphisms. -/ +/-- The Lorentz action on the jet Lagrangian by algebra automorphisms. -/ noncomputable def lorentzAlgAut : - SL(2,ℂ) →* (L.EFTLagrangianFreeDeriv ≃ₐ[ℂ] L.EFTLagrangianFreeDeriv) := + SL(2,ℂ) →* (L.EFTLagrangianJet ≃ₐ[ℂ] L.EFTLagrangianJet) := tensorProductAlgAut bosonicLorentzAlgAut fermionicLorentzAlgAut /-- The action of a Lorentz-group element as an algebra homomorphism. -/ noncomputable def lorentzAlgHom (Λ : SL(2,ℂ)) : - L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := + L.EFTLagrangianJet →ₐ[ℂ] L.EFTLagrangianJet := (lorentzAlgAut Λ).toAlgHom /-- The representation of the Lorentz group underlying its algebra-automorphism action. -/ noncomputable def repLorentzGroup : - Representation ℂ SL(2,ℂ) L.EFTLagrangianFreeDeriv := - (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianFreeDeriv).comp lorentzAlgAut + Representation ℂ SL(2,ℂ) L.EFTLagrangianJet := + (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianJet).comp lorentzAlgAut /-- The Lorentz representation agrees with its algebra homomorphism. -/ -lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : L.EFTLagrangianFreeDeriv) : +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : L.EFTLagrangianJet) : repLorentzGroup Λ x = lorentzAlgHom Λ x := rfl /-- The Lorentz representation preserves multiplication. -/ -lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : L.EFTLagrangianFreeDeriv) : +lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : L.EFTLagrangianJet) : repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := by simpa only [repLorentzGroup_apply] using map_mul (lorentzAlgHom Λ) V W @@ -227,45 +229,45 @@ lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : /-- The gauge action on the complex-scalar factor as an algebra homomorphism. -/ noncomputable def complexScalarGaugeAlgHom (g : G) : - L.ComplexScalarEFTFreeDeriv →ₐ[ℂ] L.ComplexScalarEFTFreeDeriv := + L.ComplexScalarEFTJet →ₐ[ℂ] L.ComplexScalarEFTJet := SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpaceWithDeriv.repGaugeGroup g) + (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g) /-- The gauge action on the complex-scalar factor by algebra automorphisms. -/ noncomputable def complexScalarGaugeAlgAut : - G →* (L.ComplexScalarEFTFreeDeriv ≃ₐ[ℂ] L.ComplexScalarEFTFreeDeriv) := - algAutOfRepresentation ComplexScalarEFTFreeDeriv.repGaugeGroup + G →* (L.ComplexScalarEFTJet ≃ₐ[ℂ] L.ComplexScalarEFTJet) := + algAutOfRepresentation ComplexScalarEFTJet.repGaugeGroup complexScalarGaugeAlgHom fun _ _ => rfl /-- The gauge action on the fermionic factor as an algebra homomorphism. -/ noncomputable def fermionicGaugeAlgHom (g : G) : - L.FermionicEFTFreeDeriv →ₐ[ℂ] L.FermionicEFTFreeDeriv := - ExteriorAlgebra.map (FermionicComponentSpaceWithDeriv.repGaugeGroup g) + L.FermionicEFTJet →ₐ[ℂ] L.FermionicEFTJet := + ExteriorAlgebra.map (FermionicJetComponentSpace.repGaugeGroup g) /-- The gauge action on the fermionic factor by algebra automorphisms. -/ noncomputable def fermionicGaugeAlgAut : - G →* (L.FermionicEFTFreeDeriv ≃ₐ[ℂ] L.FermionicEFTFreeDeriv) := - algAutOfRepresentation FermionicEFTFreeDeriv.repGaugeGroup + G →* (L.FermionicEFTJet ≃ₐ[ℂ] L.FermionicEFTJet) := + algAutOfRepresentation FermionicEFTJet.repGaugeGroup fermionicGaugeAlgHom fun _ _ => rfl /-- The gauge action on the real-boson factor as a real algebra homomorphism. -/ noncomputable def realBosonGaugeAlgHom (g : G) : - L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDeriv := + L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJet := SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonComponentSpaceWithDeriv.repGaugeGroup g) + (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup g) /-- The scalar extension of the real-boson gauge action as a complex algebra homomorphism. -/ noncomputable def realBosonComplexGaugeAlgHom (g : G) : - L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] L.RealBosonEFTFreeDerivComplex := - (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTFreeDeriv L.RealBosonEFTFreeDerivComplex) + L.RealBosonEFTJetComplex →ₐ[ℂ] L.RealBosonEFTJetComplex := + (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTJet L.RealBosonEFTJetComplex) ((Algebra.TensorProduct.includeRight : - L.RealBosonEFTFreeDeriv →ₐ[ℝ] L.RealBosonEFTFreeDerivComplex).comp + L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJetComplex).comp (realBosonGaugeAlgHom g)) /-- The complex real-boson gauge representation agrees with its algebra homomorphism. -/ lemma realBosonComplex_repGaugeGroup_apply (g : G) - (x : L.RealBosonEFTFreeDerivComplex) : - RealBosonEFTFreeDerivComplex.repGaugeGroup g x = + (x : L.RealBosonEFTJetComplex) : + RealBosonEFTJetComplex.repGaugeGroup g x = realBosonComplexGaugeAlgHom g x := by induction x using TensorProduct.induction_on with | zero => simp @@ -277,8 +279,8 @@ lemma realBosonComplex_repGaugeGroup_apply (g : G) /-- The gauge action on the complex real-boson factor by algebra automorphisms. -/ noncomputable def realBosonComplexGaugeAlgAut : - G →* (L.RealBosonEFTFreeDerivComplex ≃ₐ[ℂ] L.RealBosonEFTFreeDerivComplex) := - algAutOfRepresentation RealBosonEFTFreeDerivComplex.repGaugeGroup + G →* (L.RealBosonEFTJetComplex ≃ₐ[ℂ] L.RealBosonEFTJetComplex) := + algAutOfRepresentation RealBosonEFTJetComplex.repGaugeGroup realBosonComplexGaugeAlgHom realBosonComplex_repGaugeGroup_apply /-! @@ -289,36 +291,36 @@ noncomputable def realBosonComplexGaugeAlgAut : /-- The gauge action on the two bosonic factors by algebra automorphisms. -/ noncomputable def bosonicGaugeAlgAut : - G →* ((L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex) ≃ₐ[ℂ] - (L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex)) := + G →* ((L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex) ≃ₐ[ℂ] + (L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex)) := tensorProductAlgAut complexScalarGaugeAlgAut realBosonComplexGaugeAlgAut /-- The gauge action on the bosonic factors as an algebra homomorphism. -/ noncomputable def bosonicGaugeAlgHom (g : G) : - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex →ₐ[ℂ] - L.ComplexScalarEFTFreeDeriv ⊗[ℂ] L.RealBosonEFTFreeDerivComplex := + L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex →ₐ[ℂ] + L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex := (bosonicGaugeAlgAut g).toAlgHom -/-- The gauge action on the free-derivative Lagrangian by algebra automorphisms. -/ +/-- The gauge action on the jet Lagrangian by algebra automorphisms. -/ noncomputable def gaugeAlgAut : - G →* (L.EFTLagrangianFreeDeriv ≃ₐ[ℂ] L.EFTLagrangianFreeDeriv) := + G →* (L.EFTLagrangianJet ≃ₐ[ℂ] L.EFTLagrangianJet) := tensorProductAlgAut bosonicGaugeAlgAut fermionicGaugeAlgAut /-- The action of a gauge-group element as an algebra homomorphism. -/ noncomputable def gaugeAlgHom (g : G) : - L.EFTLagrangianFreeDeriv →ₐ[ℂ] L.EFTLagrangianFreeDeriv := + L.EFTLagrangianJet →ₐ[ℂ] L.EFTLagrangianJet := (gaugeAlgAut g).toAlgHom /-- The representation of the gauge group underlying its algebra-automorphism action. -/ -noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianFreeDeriv := - (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianFreeDeriv).comp gaugeAlgAut +noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianJet := + (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianJet).comp gaugeAlgAut /-- The gauge representation agrees with its algebra homomorphism. -/ -lemma repGaugeGroup_apply (g : G) (x : L.EFTLagrangianFreeDeriv) : +lemma repGaugeGroup_apply (g : G) (x : L.EFTLagrangianJet) : repGaugeGroup g x = gaugeAlgHom g x := rfl /-- The gauge representation preserves multiplication. -/ -lemma repGaugeGroup_mul (g : G) (V W : L.EFTLagrangianFreeDeriv) : +lemma repGaugeGroup_mul (g : G) (V W : L.EFTLagrangianJet) : repGaugeGroup g (V * W) = repGaugeGroup g V * repGaugeGroup g W := by simpa only [repGaugeGroup_apply] using map_mul (gaugeAlgHom g) V W @@ -335,7 +337,7 @@ This section is reserved for the predicate expressing simultaneous Lorentz and g -/ -end EFTLagrangianFreeDeriv +end EFTLagrangianJet end From 01048df41767f458a41acb5f23fc3f2615855599 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 3 Aug 2026 13:17:11 +0100 Subject: [PATCH 078/254] feat: Jet gauge group --- .../EFTLagrangianJet/Basic.lean | 2 +- .../StandardModel/GaugeBosons/Gluons.lean | 394 ++++++++++++++++++ .../StandardModel/GaugeGroup/Jet.lean | 263 ++++++++++++ 3 files changed, 658 insertions(+), 1 deletion(-) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Jet.lean diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean index fcfd787a4..cd9320890 100644 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean @@ -331,7 +331,7 @@ lemma repGaugeGroup_one (g : G) : repGaugeGroup (L := L) g 1 = 1 := by /-! -## C. The `IsInvariant` condition +## C. The `IsGlobalInvariant` condition This section is reserved for the predicate expressing simultaneous Lorentz and gauge invariance. diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean new file mode 100644 index 000000000..df6ffd4d0 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean @@ -0,0 +1,394 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +/-! +# Gluons + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The gluon field +-/ + +/-- The target vector space of the gluon field strength `G_{μ}`. It carries one + Lorentz index, and is valued in the real vector space of `3 × 3` hermitian + matrices, corresponding to the adjoint of `SU(3)`. -/ +@[ext] +structure Gluon where + /-- The Lorentz index together with the adjoint (hermitian-matrix) colour + factor. -/ + val : Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) + +namespace Gluon + +/-! + +## B. Linear structure +-/ + +def valEquiv : Gluon ≃ Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where + toFun := val + invFun := fun m => ⟨m⟩ + +noncomputable instance : AddCommGroup Gluon := Equiv.addCommGroup valEquiv + +noncomputable instance : Module ℝ Gluon := Equiv.module ℝ valEquiv + +/-- The linear identification with the underlying tensor product. -/ +def valLinEquiv : Gluon ≃ₗ[ℝ] + Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where + toFun := val + invFun := fun m => ⟨m⟩ + map_add' := by intros; rfl + map_smul' := by intros; rfl + +@[simp] +lemma valLinEquiv_apply (d : Gluon) : valLinEquiv d = d.val := rfl + +lemma valLinEquiv_symm_apply + (m : Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : + valLinEquiv.symm m = ⟨m⟩ := rfl + +@[simp] +lemma val_add (d₁ d₂ : Gluon) : (d₁ + d₂).val = d₁.val + d₂.val := rfl + +@[simp] +lemma val_smul (r : ℝ) (d : Gluon) : (r • d).val = r • d.val := rfl + + +/-! + +## C. Lorentz action + +The Lorentz group acts on the Lorentz index and leaves the colour index fixed. +-/ + +open Matrix MatrixGroups + +/-- The Lorentz representation on the gluon field: the action on the Lorentz + index, trivial on the colour (adjoint) factor. -/ +noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) Gluon where + toFun Λ := valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ)) + (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) Λ) ∘ₗ + valLinEquiv.toLinearMap + map_one' := by + ext F + simp [Module.End.one_eq_id] + map_mul' Λ₁ Λ₂ := by + ext1 F + simp [TensorProduct.map_map, + Module.End.mul_eq_comp, map_mul] + +/-! + +## D. Gauge action + +The gluon field transforms in the adjoint representation of the gauge group: +the `SU(3)` component acts on the colour factor by conjugation `A ↦ u * A * uᴴ`, while +the `SU(2)` and `U(1)` components act trivially, as does the Lorentz index. +-/ + +/-- The adjoint action of an element of `SU(3)` on the real vector space of `3 × 3` + hermitian matrices, `A ↦ u * A * uᴴ`. -/ +@[simps!] +noncomputable def adjointAction (u : specialUnitaryGroup (Fin 3) ℂ) : + selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) →ₗ[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where + toFun A := ⟨u.1 * A.1 * (u.1)ᴴ, + by + noncomm_ring [selfAdjoint.mem_iff, star_eq_conjTranspose, + conjTranspose_mul, conjTranspose_conjTranspose, + (star_eq_conjTranspose A.1).symm.trans <| selfAdjoint.mem_iff.mp A.2]⟩ + map_add' A B := by + simp only [AddSubgroup.coe_add, AddMemClass.mk_add_mk, Subtype.mk.injEq] + noncomm_ring + map_smul' r A := by + noncomm_ring [selfAdjoint.val_smul, Algebra.mul_smul_comm, Algebra.smul_mul_assoc, + RingHom.id_apply] + +@[simp] +lemma adjointAction_one : adjointAction 1 = LinearMap.id := by + refine LinearMap.ext fun A => Subtype.ext ?_ + simp [adjointAction] + +lemma adjointAction_mul (u₁ u₂ : specialUnitaryGroup (Fin 3) ℂ) : + adjointAction (u₁ * u₂) = adjointAction u₁ ∘ₗ adjointAction u₂ := by + refine LinearMap.ext fun A => Subtype.ext ?_ + simp [adjointAction, conjTranspose_mul, mul_assoc] + +/-- The adjoint action of the unquotiented Standard Model gauge group on the gluon + field. -/ +noncomputable def repGaugeGroupI : Representation ℝ GaugeGroupI Gluon where + toFun g := valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id (adjointAction g.toSU3) ∘ₗ + valLinEquiv.toLinearMap + map_one' := by + ext F + simp + map_mul' g₁ g₂ := by + ext1 F + simp [map_mul, adjointAction_mul, TensorProduct.map_map, + Module.End.mul_eq_comp] + +/-! + +## E. Local gauge action through jets + +A local gauge transformation acts on the gluon field through its first-order jet: +`G ↦ u G u† + i (∂_μ U)(0) u†`, where `u` is the value of the jet `U` at the base +point. The inhomogeneous Maurer–Cartan term `i (∂_μ U)(0) u†` is hermitian by +unitarity of `U`, and satisfies a cocycle identity by the Leibniz rule; together +these make the assignment an action. The action is affine rather than linear, so it +is realised as a `MulAction` of the jet gauge group `JetGaugeGroupI` on `Gluon` +rather than as a `Representation`. The `SU(2)` and `U(1)` jets act trivially, and +the jets of constant gauge transformations recover the adjoint representation +`repGaugeGroupI`. + +-/ + +open MvPowerSeries + +/-- The matrix of first-order Taylor coefficients, in the spacetime direction `μ`, + of a matrix of jets. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) ℂ := + A.map (coeff (Finsupp.single μ 1)) + +/-- The value at the base point of a matrix of jets: the entrywise constant + coefficient. -/ +noncomputable def jetValue (A : Matrix (Fin 3) (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) ℂ := + A.map constantCoeff + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : + jetDeriv μ (1 : Matrix (Fin 3) (Fin 3) JetRing) = 0 := by + ext i j + by_cases h : i = j <;> + simp [jetDeriv, Matrix.map_apply, h, coeff_one, Finsupp.single_eq_zero] + +/-- The Leibniz rule for the first-order Taylor coefficients of a matrix of jets. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (A B : Matrix (Fin 3) (Fin 3) JetRing) : + jetDeriv μ (A * B) = jetDeriv μ A * jetValue B + jetValue A * jetDeriv μ B := by + ext i j + simp [jetDeriv, jetValue, Matrix.mul_apply, Matrix.map_apply, Matrix.add_apply, + coeff_single_one_mul, Finset.sum_add_distrib] + +lemma jetDeriv_star (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : + jetDeriv μ (star A) = star (jetDeriv μ A) := by + ext i j + simp [jetDeriv, Matrix.map_apply, Matrix.star_apply] + +/-- The first-order Taylor coefficients of a constant jet vanish. -/ +@[simp] +lemma jetDeriv_map_C (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) ℂ) : + jetDeriv μ (A.map (C : ℂ →+* JetRing)) = 0 := by + ext i j + simp [jetDeriv, Matrix.map_apply, coeff_C, Finsupp.single_eq_zero] + +@[simp] +lemma jetValue_one : jetValue (1 : Matrix (Fin 3) (Fin 3) JetRing) = 1 := + Matrix.map_one _ (map_zero _) (map_one _) + +lemma jetValue_mul (A B : Matrix (Fin 3) (Fin 3) JetRing) : + jetValue (A * B) = jetValue A * jetValue B := + Matrix.map_mul + +lemma jetValue_star (A : Matrix (Fin 3) (Fin 3) JetRing) : + jetValue (star A) = star (jetValue A) := by + simpa [jetValue, RingHom.mapMatrix_apply] using + JetGaugeGroupI.mapMatrix_constantCoeff_star A + +/-- The unitarity of a jet of a special-unitary gauge transformation, as a matrix + identity over the jet ring. -/ +lemma coe_mul_star_self (U : specialUnitaryGroup (Fin 3) JetRing) : + (U : Matrix (Fin 3) (Fin 3) JetRing) * star (U : Matrix (Fin 3) (Fin 3) JetRing) = 1 := + mem_unitaryGroup_iff.mp (mem_specialUnitaryGroup_iff.mp U.2).1 + +/-- The value at the base point of a jet of a special-unitary gauge transformation + is unitary. -/ +lemma jetValue_mul_star_self (U : specialUnitaryGroup (Fin 3) JetRing) : + jetValue U.1 * star (jetValue U.1) = 1 := by + have h := congrArg jetValue (coe_mul_star_self U) + rwa [jetValue_mul, jetValue_star, jetValue_one] at h + +/-- The value at the base point of a jet of a special-unitary gauge transformation, + as computed by `JetGaugeGroupI.evalSU`. -/ +lemma evalSU_coe (U : specialUnitaryGroup (Fin 3) JetRing) : + (JetGaugeGroupI.evalSU (Fin 3) U : Matrix (Fin 3) (Fin 3) ℂ) = jetValue U.1 := rfl + +/-! + +### E.1. The Maurer–Cartan term + +-/ + +/-- The Maurer–Cartan matrix of a matrix of jets in the spacetime direction `μ`: + `i (∂_μ A)(0) * (A(0))†`. For a unitary jet this matrix is hermitian; see + `mcMatrix_mem_selfAdjoint`. -/ +noncomputable def mcMatrix (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) ℂ := + Complex.I • (jetDeriv μ A * star (jetValue A)) + +/-- The Maurer–Cartan matrix of a unitary jet is hermitian: differentiating + `A * A† = 1` shows `(∂_μ A)(0) * (A(0))†` is anti-hermitian, and multiplication + by `i` makes it hermitian. -/ +lemma mcMatrix_mem_selfAdjoint {A : Matrix (Fin 3) (Fin 3) JetRing} + (hA : A * star A = 1) (μ : Fin 1 ⊕ Fin 3) : + mcMatrix μ A ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := by + have h := congrArg (jetDeriv μ) hA + rw [jetDeriv_mul, jetDeriv_star, jetDeriv_one, jetValue_star] at h + rw [selfAdjoint.mem_iff, mcMatrix, star_smul, + show star (jetDeriv μ A * star (jetValue A)) = jetValue A * star (jetDeriv μ A) by + rw [star_mul, star_star], + eq_neg_of_add_eq_zero_left h] + simp [Complex.conj_I] + +/-- The cocycle identity for the Maurer–Cartan matrix: for jets `A`, `B` with `B` + unitary at the base point, `mc(A * B) = mc(A) + A(0) mc(B) (A(0))†`. -/ +lemma mcMatrix_mul (μ : Fin 1 ⊕ Fin 3) {A B : Matrix (Fin 3) (Fin 3) JetRing} + (hB : jetValue B * star (jetValue B) = 1) : + mcMatrix μ (A * B) = mcMatrix μ A + jetValue A * mcMatrix μ B * star (jetValue A) := by + rw [mcMatrix, mcMatrix, mcMatrix, jetDeriv_mul, jetValue_mul, star_mul, add_mul, + show jetDeriv μ A * jetValue B * (star (jetValue B) * star (jetValue A)) = + jetDeriv μ A * star (jetValue A) by + rw [mul_assoc, ← mul_assoc (jetValue B), hB, one_mul], + show jetValue A * jetDeriv μ B * (star (jetValue B) * star (jetValue A)) = + jetValue A * (jetDeriv μ B * star (jetValue B)) * star (jetValue A) by + rw [mul_assoc, mul_assoc, mul_assoc], + smul_add, Matrix.mul_smul, Matrix.smul_mul] + +/-- The Maurer–Cartan coefficient of a jet of a special-unitary gauge + transformation in the spacetime direction `μ`, as a hermitian matrix. -/ +noncomputable def mcCoeff (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : + selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + ⟨mcMatrix μ U.1, mcMatrix_mem_selfAdjoint (coe_mul_star_self U) μ⟩ + +@[simp] +lemma mcCoeff_one (μ : Fin 1 ⊕ Fin 3) : mcCoeff 1 μ = 0 := by + apply Subtype.ext + simp [mcCoeff, mcMatrix] + +/-- The cocycle identity for the Maurer–Cartan coefficient. -/ +lemma mcCoeff_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : + mcCoeff (U * V) μ = + mcCoeff U μ + adjointAction (JetGaugeGroupI.evalSU (Fin 3) U) (mcCoeff V μ) := by + apply Subtype.ext + simp only [mcCoeff, AddSubgroup.coe_add, adjointAction_apply_coe, MulMemClass.coe_mul] + rw [mcMatrix_mul μ (jetValue_mul_star_self V)] + rfl + +/-- The Maurer–Cartan term of a jet of a special-unitary gauge transformation, as a + gluon: the translation part of the local gauge action, with components + `i (∂_μ U)(0) u†`. -/ +noncomputable def mcGluon (U : specialUnitaryGroup (Fin 3) JetRing) : Gluon := + ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] mcCoeff U μ⟩ + +@[simp] +lemma val_zero : (0 : Gluon).val = 0 := rfl + +@[simp] +lemma mcGluon_one : mcGluon 1 = 0 := by + apply Gluon.ext + simp [mcGluon] + +/-! + +### E.2. The action + +-/ + +/-- The adjoint action of an element of `SU(3)` on the gluon field, trivial on the + Lorentz index: the linear part of the local gauge action. -/ +noncomputable def adAction (u : specialUnitaryGroup (Fin 3) ℂ) : Gluon →ₗ[ℝ] Gluon := + valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id (adjointAction u) ∘ₗ valLinEquiv.toLinearMap + +@[simp] +lemma adAction_one : adAction 1 = LinearMap.id := by + rw [adAction, adjointAction_one, TensorProduct.map_id] + ext F + simp + +lemma adAction_mul (u₁ u₂ : specialUnitaryGroup (Fin 3) ℂ) : + adAction (u₁ * u₂) = adAction u₁ ∘ₗ adAction u₂ := by + ext1 F + simp [adAction, adjointAction_mul, TensorProduct.map_map] + +lemma repGaugeGroupI_eq_adAction (g : GaugeGroupI) : repGaugeGroupI g = adAction g.toSU3 := rfl + +/-- The cocycle identity for the Maurer–Cartan term of the gluon. -/ +lemma mcGluon_mul (U V : specialUnitaryGroup (Fin 3) JetRing) : + mcGluon (U * V) = + mcGluon U + adAction (JetGaugeGroupI.evalSU (Fin 3) U) (mcGluon V) := by + apply Gluon.ext + simp [mcGluon, mcCoeff_mul, adAction, TensorProduct.tmul_add, Finset.sum_add_distrib, + valLinEquiv_symm_apply, map_sum] + +/-- The action of the jet gauge group on the gluon field: the value of the jet acts + through the adjoint representation on the colour factor, and the first-order part + of the jet contributes the Maurer–Cartan translation `i (∂_μ U)(0) u†`. The + action is affine rather than linear, which is why it is a `MulAction` and not a + `Representation`. The `SU(2)` and `U(1)` jets act trivially. -/ +noncomputable instance : MulAction JetGaugeGroupI Gluon where + smul U A := adAction (JetGaugeGroupI.evalSU (Fin 3) U.1) A + mcGluon U.1 + one_smul A := by + show adAction (JetGaugeGroupI.evalSU (Fin 3) (1 : JetGaugeGroupI).1) A + + mcGluon (1 : JetGaugeGroupI).1 = A + simp + mul_smul U V A := by + show adAction (JetGaugeGroupI.evalSU (Fin 3) (U * V).1) A + mcGluon (U * V).1 = + adAction (JetGaugeGroupI.evalSU (Fin 3) U.1) + (adAction (JetGaugeGroupI.evalSU (Fin 3) V.1) A + mcGluon V.1) + mcGluon U.1 + rw [Prod.fst_mul, map_mul, adAction_mul, mcGluon_mul, map_add] + simp only [LinearMap.coe_comp, Function.comp_apply] + abel + +lemma smul_def (U : JetGaugeGroupI) (A : Gluon) : + U • A = adAction (JetGaugeGroupI.evalSU (Fin 3) U.1) A + mcGluon U.1 := rfl + +/-- The jets of constant (global) gauge transformations act on the gluon through the + adjoint representation of the gauge group: the Maurer–Cartan term vanishes on + constant jets. -/ +@[simp] +lemma ofConstant_smul (g : GaugeGroupI) (A : Gluon) : + JetGaugeGroupI.ofConstant g • A = repGaugeGroupI g A := by + rw [smul_def] + have h1 : JetGaugeGroupI.evalSU (Fin 3) (JetGaugeGroupI.ofConstant g).1 = g.1 := by + apply Subtype.ext + ext i j + simp [JetGaugeGroupI.evalSU, JetGaugeGroupI.ofConstant, JetGaugeGroupI.ofConstantSU, + RingHom.mapMatrix_apply, Matrix.map_apply] + have h2 : mcGluon (JetGaugeGroupI.ofConstant g).1 = 0 := by + apply Gluon.ext + have hmc : ∀ μ, mcCoeff (JetGaugeGroupI.ofConstant g).1 μ = 0 := by + intro μ + apply Subtype.ext + show mcMatrix μ ((JetGaugeGroupI.ofConstantSU (Fin 3) g.1) : + Matrix (Fin 3) (Fin 3) JetRing) = _ + rw [show ((JetGaugeGroupI.ofConstantSU (Fin 3) g.1) : + Matrix (Fin 3) (Fin 3) JetRing) = g.1.1.map (C : ℂ →+* JetRing) from rfl] + simp [mcMatrix] + simp [mcGluon, hmc] + rw [h1, h2, add_zero, repGaugeGroupI_eq_adAction] + rfl + +end Gluon + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean new file mode 100644 index 000000000..4ef15ca9d --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Mathlib.RingTheory.MvPowerSeries.Basic +public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +/-! + +# The jet gauge group + +## i. Overview + +This file defines the group of formal infinite-order jets, at a spacetime point, of +local gauge transformations of the Standard Model. + +A local gauge transformation is a map from spacetime into the gauge group. Its +infinite-order jet at a point is the collection of all its Taylor coefficients +there, which, by Borel's theorem, is exactly a formal power series in the spacetime +coordinates. Since gauge transformations multiply pointwise, jets multiply as +(truncated) power series, with the Leibniz rule handled automatically by the +power-series product. + +This leads to a purely algebraic definition: the jet gauge group is the group of +`R`-points of the gauge group, where `R` is the commutative ring of formal power +series in the spacetime coordinates with complex coefficients. Concretely, an +element of the `SU(3)` factor is a `3 × 3` matrix of power series `U` satisfying +`U * Uᴴ = 1` and `det U = 1` as power series, which encodes the unitarity and +determinant constraints at every jet order simultaneously. + +The star operation on the power-series ring is coefficientwise complex conjugation, +so that the spacetime coordinates themselves are self-adjoint (they are real +coordinates); this star structure is defined in section A below and is not currently +in Mathlib. + +Evaluation of power series at the base point (the constant coefficient) gives a +group homomorphism from the jet gauge group to the gauge group `GaugeGroupI`, +projecting a jet to its zeroth-order part; conversely the constant power series give +an embedding of `GaugeGroupI` into the jet gauge group as the jets of constant +(global) gauge transformations. + +-/ + +@[expose] public section + +/-! + +## A. The star structure on multivariate power series + +The star operation on `MvPowerSeries σ R` is coefficientwise star. In particular +over `ℂ` it is coefficientwise complex conjugation, fixing the formal variables. + +-/ + +namespace MvPowerSeries + +variable {σ R : Type*} + +instance [Star R] : Star (MvPowerSeries σ R) where + star f := fun n => star (f n) + +@[simp] +lemma coeff_star [Semiring R] [StarRing R] (n : σ →₀ ℕ) (f : MvPowerSeries σ R) : + coeff n (star f) = star (coeff n f) := rfl + +instance [CommSemiring R] [StarRing R] : StarRing (MvPowerSeries σ R) where + star_involutive f := funext fun n => star_star (f n) + star_add f g := funext fun n => star_add (f n) (g n) + star_mul f g := by + have h : ∀ a b : MvPowerSeries σ R, star (a * b) = star a * star b := by + intro a b + ext n + classical + rw [coeff_star, coeff_mul, coeff_mul, star_sum] + exact Finset.sum_congr rfl fun p _ => by rw [star_mul', coeff_star, coeff_star] + rw [h, mul_comm] + +@[simp] +lemma constantCoeff_star [CommSemiring R] [StarRing R] (f : MvPowerSeries σ R) : + constantCoeff (star f) = star (constantCoeff f) := rfl + +@[simp] +lemma star_C [CommSemiring R] [StarRing R] (a : R) : + star (C (σ := σ) a) = C (star a) := by + ext n + classical + rw [coeff_star, coeff_C, coeff_C] + split_ifs <;> simp + +/-- The first-order Leibniz rule: the degree-one Taylor coefficient, in the + direction `μ`, of a product of power series. This is the coefficient-level + statement that the first jet of a product is given by the product rule. -/ +lemma coeff_single_one_mul [CommSemiring R] (μ : σ) (f g : MvPowerSeries σ R) : + coeff (Finsupp.single μ 1) (f * g) = + coeff (Finsupp.single μ 1) f * constantCoeff g + + constantCoeff f * coeff (Finsupp.single μ 1) g := by + classical + rw [coeff_mul, Finsupp.antidiagonal_single, + show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, + Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), + Finset.sum_singleton] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, + Finsupp.single_zero, coeff_zero_eq_constantCoeff] + ring + +end MvPowerSeries + +namespace StandardModel + +open Matrix MvPowerSeries + +/-! + +## B. The jet ring + +-/ + +/-- The ring of formal power series in the four spacetime coordinates, with complex + coefficients. Jets of fields and of gauge transformations at a spacetime point are + valued in this ring. The star operation is coefficientwise complex conjugation, so + the spacetime coordinates themselves are self-adjoint. -/ +abbrev JetRing : Type := MvPowerSeries (Fin 1 ⊕ Fin 3) ℂ + +/-! + +## C. The jet gauge group + +-/ + +/-- The group of formal infinite-order jets, at a spacetime point, of local gauge + transformations of the Standard Model: the `R`-points of the gauge group for `R` + the ring `JetRing` of formal power series in the spacetime coordinates. + + Since gauge transformations multiply pointwise, jets multiply as power series and + the group structure is that of the matrix groups over `JetRing`. The unitarity and + determinant constraints hold as power-series identities, i.e. at every jet order. + + Evaluation at the base point recovers `GaugeGroupI`; see `JetGaugeGroupI.eval`. -/ +abbrev JetGaugeGroupI : Type := + specialUnitaryGroup (Fin 3) JetRing × specialUnitaryGroup (Fin 2) JetRing × + unitary JetRing + +namespace JetGaugeGroupI + +/-! + +## D. Evaluation at the base point + +The constant coefficient of a power series is its value at the base point of the +jet. Applied entrywise it sends jets of gauge transformations to their zeroth-order +parts, giving a group homomorphism `JetGaugeGroupI →* GaugeGroupI`. + +-/ + +/-- Entrywise evaluation at the base point commutes with the conjugate transpose. -/ +lemma mapMatrix_constantCoeff_star {n : Type} [Fintype n] [DecidableEq n] + (A : Matrix n n JetRing) : + (constantCoeff : JetRing →+* ℂ).mapMatrix (star A) = + star ((constantCoeff : JetRing →+* ℂ).mapMatrix A) := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] + +/-- Evaluation of a jet of a special-unitary gauge transformation at the base point: + the entrywise constant coefficient. -/ +noncomputable def evalSU (n : Type) [Fintype n] [DecidableEq n] : + specialUnitaryGroup n JetRing →* specialUnitaryGroup n ℂ where + toFun U := ⟨(constantCoeff : JetRing →+* ℂ).mapMatrix U.1, by + obtain ⟨h1, h2⟩ := mem_specialUnitaryGroup_iff.mp U.2 + rw [mem_specialUnitaryGroup_iff] + constructor + · rw [mem_unitaryGroup_iff] at h1 ⊢ + rw [show star ((constantCoeff : JetRing →+* ℂ).mapMatrix U.1) = + (constantCoeff : JetRing →+* ℂ).mapMatrix (star U.1) from + (mapMatrix_constantCoeff_star U.1).symm, ← map_mul, h1, map_one] + · rw [← RingHom.map_det, h2, map_one]⟩ + map_one' := Subtype.ext (map_one ((constantCoeff : JetRing →+* ℂ).mapMatrix)) + map_mul' U V := Subtype.ext (map_mul ((constantCoeff : JetRing →+* ℂ).mapMatrix) U.1 V.1) + +/-- Evaluation of a jet of a `U(1)` gauge transformation at the base point: the + constant coefficient. -/ +noncomputable def evalU1 : unitary JetRing →* unitary ℂ where + toFun u := ⟨constantCoeff u.1, by + obtain ⟨h1, h2⟩ := Unitary.mem_iff.mp u.2 + exact Unitary.mem_iff.mpr + ⟨by rw [← constantCoeff_star, ← map_mul, h1, map_one], + by rw [← constantCoeff_star, ← map_mul, h2, map_one]⟩⟩ + map_one' := Subtype.ext (map_one _) + map_mul' u v := Subtype.ext (map_mul _ u.1 v.1) + +/-- Evaluation of a jet of a gauge transformation at the base point, projecting the + jet gauge group onto the gauge group `GaugeGroupI` by taking zeroth-order parts on + each factor. -/ +noncomputable def eval : JetGaugeGroupI →* GaugeGroupI := + (evalSU (Fin 3)).prodMap ((evalSU (Fin 2)).prodMap evalU1) + +/-! + +## E. Constant jets + +The constant power series embed the gauge group `GaugeGroupI` into the jet gauge +group, as the jets of constant (global) gauge transformations. This is a section of +the evaluation `eval`. + +-/ + +/-- Entrywise inclusion of constants commutes with the conjugate transpose. -/ +lemma mapMatrix_C_star {n : Type} [Fintype n] [DecidableEq n] (A : Matrix n n ℂ) : + (C : ℂ →+* JetRing).mapMatrix (star A) = star ((C : ℂ →+* JetRing).mapMatrix A) := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] + +/-- The jet of a constant special-unitary gauge transformation: the entrywise + inclusion of constants. -/ +noncomputable def ofConstantSU (n : Type) [Fintype n] [DecidableEq n] : + specialUnitaryGroup n ℂ →* specialUnitaryGroup n JetRing where + toFun u := ⟨(C : ℂ →+* JetRing).mapMatrix u.1, by + obtain ⟨h1, h2⟩ := mem_specialUnitaryGroup_iff.mp u.2 + rw [mem_specialUnitaryGroup_iff] + constructor + · rw [mem_unitaryGroup_iff] at h1 ⊢ + rw [show star ((C : ℂ →+* JetRing).mapMatrix u.1) = + (C : ℂ →+* JetRing).mapMatrix (star u.1) from (mapMatrix_C_star u.1).symm, + ← map_mul, h1, map_one] + · rw [← RingHom.map_det, h2, map_one]⟩ + map_one' := Subtype.ext (map_one ((C : ℂ →+* JetRing).mapMatrix)) + map_mul' u v := Subtype.ext (map_mul ((C : ℂ →+* JetRing).mapMatrix) u.1 v.1) + +/-- The jet of a constant `U(1)` gauge transformation: the inclusion of constants. -/ +noncomputable def ofConstantU1 : unitary ℂ →* unitary JetRing where + toFun u := ⟨C u.1, by + obtain ⟨h1, h2⟩ := Unitary.mem_iff.mp u.2 + exact Unitary.mem_iff.mpr + ⟨by rw [star_C, ← map_mul, h1, map_one], + by rw [star_C, ← map_mul, h2, map_one]⟩⟩ + map_one' := Subtype.ext (map_one _) + map_mul' u v := Subtype.ext (map_mul _ u.1 v.1) + +/-- The embedding of the gauge group into the jet gauge group as the jets of + constant (global) gauge transformations. -/ +noncomputable def ofConstant : GaugeGroupI →* JetGaugeGroupI := + (ofConstantSU (Fin 3)).prodMap ((ofConstantSU (Fin 2)).prodMap ofConstantU1) + +/-- Evaluating the jet of a constant gauge transformation at the base point recovers + the gauge transformation: `ofConstant` is a section of `eval`. -/ +@[simp] +lemma eval_ofConstant (g : GaugeGroupI) : eval (ofConstant g) = g := by + refine Prod.ext (Subtype.ext ?_) (Prod.ext (Subtype.ext ?_) (Subtype.ext ?_)) + · ext i j + simp [eval, ofConstant, evalSU, ofConstantSU, + RingHom.mapMatrix_apply, Matrix.map_apply] + · ext i j + simp [eval, ofConstant, evalSU, ofConstantSU, + RingHom.mapMatrix_apply, Matrix.map_apply] + · simp [eval, ofConstant, evalU1, ofConstantU1] + + + +end JetGaugeGroupI + +end StandardModel From a1dca05ce0b21e264eb23fa3852f7e45940c6640 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 3 Aug 2026 15:14:43 +0100 Subject: [PATCH 079/254] feat: Added jetAlgebra commits --- .../StandardModel/Fermions/LeptonDoublet.lean | 182 ++++++++++++ .../StandardModel/Fermions/LeptonSinglet.lean | 120 ++++++++ .../StandardModel/GaugeBosons/BBoson.lean | 278 +++++++++++++++++ .../StandardModel/GaugeGroup/Jet.lean | 279 ++++++++++++++++-- 4 files changed, 830 insertions(+), 29 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index 18fe44560..c1d8ee1aa 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet public import Physlib.Relativity.Tensors.ComplexTensor.Basic /-! # Lepton doublets @@ -42,6 +43,7 @@ form of the Standard Model gauge group. - D. Gauge action - E. Kernel of the gauge action - F. Descent to quotient gauge groups +- G. Jet gauge action -/ @@ -304,6 +306,186 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) +/-! + +## G. Jet gauge action + +The `(1, 2)_{-3}` representation extends verbatim to jets: the hypercharge power +series `star u ^ 3` and the `SU(2)` power-series matrix of a jet of gauge +transformations combine into a matrix of jets, `jetGaugeMatrix`. This matrix acts +on the polynomial jet space +`SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet` through the entrywise +derivative action `derivAction` on the derivative symbols, moving the weak index +and leaving the Weyl factor fixed: the value of the jet acts by the gauge matrix, +while its derivative coordinates lower derivative symbols by the Leibniz rule. On +jets of constant gauge transformations the action reduces to the global gauge +action, trivial on the derivative symbols. + +-/ + +/-- The matrix of jets through which a jet of gauge transformations acts on the + lepton doublet: the `SU(2)` power-series matrix scaled by the hypercharge power + series `star u ^ 3`. -/ +noncomputable def jetGaugeMatrix (U : JetGaugeGroupI) : Matrix (Fin 2) (Fin 2) JetRing := + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + +lemma jetGaugeMatrix_one : jetGaugeMatrix 1 = 1 := by + simp [jetGaugeMatrix] + +lemma jetGaugeMatrix_mul (U₁ U₂ : JetGaugeGroupI) : + jetGaugeMatrix (U₁ * U₂) = jetGaugeMatrix U₁ * jetGaugeMatrix U₂ := by + rw [jetGaugeMatrix, jetGaugeMatrix, jetGaugeMatrix, + show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) from rfl, + show (((U₁ * U₂).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) = + ((U₁.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) * + ((U₂.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + from rfl, + star_mul', mul_pow, Matrix.smul_mul, Matrix.mul_smul, smul_smul] + +@[simp] +lemma mk_zero : (⟨0⟩ : LeptonDoublet) = 0 := rfl + +/-- The evaluation of the `SU(2)` matrix unit on a weak basis vector. -/ +lemma toEuclideanLin_single_single (i j j' : Fin 2) : + (Matrix.single i j' (1 : ℂ)).toEuclideanLin (EuclideanSpace.single j (1 : ℂ)) = + if j' = j then EuclideanSpace.single i (1 : ℂ) else 0 := by + ext i' + rcases eq_or_ne j' j with h | h + · subst h + simp [Matrix.toEuclideanLin, Matrix.single_apply, eq_comm] + · simp [Matrix.toEuclideanLin, h] + +/-- The action of a matrix of jets on the jet space of the lepton doublet: each + entry acts through the derivative action `derivAction` on the derivative symbols + while moving the weak index; the Weyl factor is fixed. -/ +noncomputable def jetMatrixAction (A : Matrix (Fin 2) (Fin 2) JetRing) : + SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet →ₗ[ℂ] + SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet := + ∑ i, ∑ j, + TensorProduct.map (derivAction (A i j)) + (valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id ((Matrix.single i j (1 : ℂ)).toEuclideanLin) ∘ₗ + valLinEquiv.toLinearMap) + +/-- The action of a matrix of jets on a generator of the jet space. -/ +lemma jetMatrixAction_tmul (A : Matrix (Fin 2) (Fin 2) JetRing) + (p : SymmetricAlgebra ℂ Lorentz.CoℂModule) (w : Fermion.LeftHandedWeyl) (j : Fin 2) : + jetMatrixAction A (p ⊗ₜ[ℂ] ⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩) = + ∑ i, derivAction (A i j) p ⊗ₜ[ℂ] + (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet) := by + rw [jetMatrixAction, LinearMap.sum_apply] + refine Finset.sum_congr rfl fun i _ => ?_ + rw [LinearMap.sum_apply, Finset.sum_eq_single j] + · simp [valLinEquiv_symm_apply, toEuclideanLin_single_single] + · intro j' _ hj' + simp [valLinEquiv_symm_apply, toEuclideanLin_single_single, hj'] + · simp + +/-- The lepton-doublet basis as explicit spinor–weak tensors. -/ +lemma basis_apply (k j : Fin 2) : + (basis (k, j) : LeptonDoublet) = + ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩ := by + simp [basis, Module.Basis.tensorProduct_apply, valLinEquiv_symm_apply] + +lemma jetMatrixAction_one : jetMatrixAction 1 = LinearMap.id := by + apply (Lorentz.complexCoBasis.symmetricAlgebra.tensorProduct basis).ext + rintro ⟨m, k, j⟩ + rw [Module.Basis.tensorProduct_apply', basis_apply, jetMatrixAction_tmul] + fin_cases j <;> simp [Matrix.one_apply, apply_ite derivAction] + +lemma jetMatrixAction_mul (A B : Matrix (Fin 2) (Fin 2) JetRing) : + jetMatrixAction (A * B) = jetMatrixAction A ∘ₗ jetMatrixAction B := by + apply (Lorentz.complexCoBasis.symmetricAlgebra.tensorProduct basis).ext + rintro ⟨m, k, j⟩ + rw [Module.Basis.tensorProduct_apply', basis_apply] + simp only [LinearMap.coe_comp, Function.comp_apply] + rw [jetMatrixAction_tmul, jetMatrixAction_tmul, map_sum] + simp only [jetMatrixAction_tmul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun i _ => ?_ + rw [← TensorProduct.sum_tmul] + congr 1 + have h : derivAction ((A * B) i j) = ∑ l, derivAction (A i l) * derivAction (B l j) := by + rw [Matrix.mul_apply, + show derivAction (∑ l, A i l * B l j) = derivActionHom (∑ l, A i l * B l j) from rfl, + map_sum] + exact Finset.sum_congr rfl fun l _ => map_mul derivActionHom _ _ + rw [h, LinearMap.sum_apply] + exact Finset.sum_congr rfl fun l _ => rfl + +/-- The `(1, 2)_{-3}` action of the jet gauge group on the polynomial jet space of + the lepton doublet: a jet of gauge transformations acts through the entrywise + derivative action of its gauge matrix of power series on the derivative symbols, + moving the weak index and fixing the Weyl factor. Its value acts by the gauge + matrix, and its derivative coordinates act by the Leibniz rule. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI + (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet) where + toFun U := jetMatrixAction (jetGaugeMatrix U) + map_one' := by + rw [jetGaugeMatrix_one, jetMatrixAction_one] + rfl + map_mul' U₁ U₂ := by + rw [jetGaugeMatrix_mul, jetMatrixAction_mul] + rfl + +@[simp] +lemma repJetGaugeGroupI_apply (U : JetGaugeGroupI) + (x : SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet) : + repJetGaugeGroupI U x = jetMatrixAction (jetGaugeMatrix U) x := rfl + +/-- The entries of the gauge matrix of a jet of a constant gauge transformation are + the constant power series with the global gauge coefficients. -/ +lemma jetGaugeMatrix_ofConstant (g : GaugeGroupI) (i j : Fin 2) : + jetGaugeMatrix (JetGaugeGroupI.ofConstant g) i j = + MvPowerSeries.C ((star (g.toU1.1 : ℂ)) ^ 3 * g.toSU2.1 i j) := by + rw [jetGaugeMatrix, Matrix.smul_apply, + show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = + MvPowerSeries.C ((g.toU1.1 : ℂ)) from rfl, + show (((JetGaugeGroupI.ofConstant g).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) i j = + MvPowerSeries.C (g.toSU2.1 i j) from rfl, + MvPowerSeries.star_C, ← map_pow, smul_eq_mul, ← map_mul] + +/-- On jets of constant gauge transformations the jet action reduces to the global + gauge action on the jet space: the `(1, 2)_{-3}` action on the target factor and + the trivial action on the derivative symbols. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + TensorProduct.map LinearMap.id (repGaugeGroupI g) := by + apply (Lorentz.complexCoBasis.symmetricAlgebra.tensorProduct basis).ext + rintro ⟨m, k, j⟩ + rw [Module.Basis.tensorProduct_apply', basis_apply, repJetGaugeGroupI_apply, + jetMatrixAction_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + repGaugeGroupI_tmul_basis_eq_sum, TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun i _ => ?_ + rw [jetGaugeMatrix_ofConstant, derivAction_C, LinearMap.smul_apply, LinearMap.id_apply] + exact TensorProduct.smul_tmul _ _ _ + +/-- The jet action on a first-order derivative symbol is the Leibniz rule: the + value of the gauge matrix multiplies the first-derivative symbol, and its first + derivative feeds the field symbol, `∂_μ ψ_j ↦ ∑ i, A(0)_{ij} ∂_μ ψ_i + + (∂_μ A)(0)_{ij} ψ_i` for `A = jetGaugeMatrix U`. -/ +lemma repJetGaugeGroupI_ι_tmul (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (w : Fermion.LeftHandedWeyl) (j : Fin 2) : + repJetGaugeGroupI U + (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] + ⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩) = + ∑ i, + (MvPowerSeries.constantCoeff (jetGaugeMatrix U i j) • + (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] + (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet)) + + MvPowerSeries.coeff (Finsupp.single μ 1) (jetGaugeMatrix U i j) • + ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] + (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet))) := by + rw [repJetGaugeGroupI_apply, jetMatrixAction_tmul] + refine Finset.sum_congr rfl fun i _ => ?_ + rw [derivAction_apply_ι, TensorProduct.add_tmul, TensorProduct.smul_tmul', + TensorProduct.smul_tmul'] + end LeptonDoublet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index af199e7a3..b6fdba6fa 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -6,6 +6,9 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson +public import Mathlib.RingTheory.TensorProduct.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic /-! # Charged-lepton singlets @@ -41,6 +44,7 @@ form of the Standard Model gauge group. - D. Gauge action - E. Kernel of the gauge action - F. Descent to quotient gauge groups +- G. Jet gauge action -/ @@ -231,6 +235,122 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) +/-! + +## G. Jet gauge action + +The hypercharge character extends verbatim to jets: the jet ring carries a star +operation and powers, so `star u ^ 6` makes sense for the `U(1)` power-series +component `u` of a jet of gauge transformations. + +A jet acts on the polynomial jet space +`SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonSinglet` — the commuting +derivative symbols of the field tensored with its target space — through the +derivative action `derivAction` of its hypercharge power series on the symbols: +the value of the jet multiplies each symbol, while its derivative coordinates +lower derivative symbols by the Leibniz rule, e.g. +`∂_μ ψ ↦ χ(0) ∂_μ ψ + (∂_μ χ)(0) ψ` with `χ = star u ^ 6`. On jets of constant +gauge transformations the action reduces to the global gauge action, trivial on +the derivative symbols. + +-/ + +open TensorProduct + +/-- The `(1, 1)_{-6}` action of the jet gauge group on the polynomial jet space of + the charged-lepton singlet: a jet of gauge transformations acts through the + derivative action of its hypercharge power series `star u ^ 6` on the derivative + symbols. Its value multiplies each symbol, and its derivative coordinates act by + the Leibniz rule. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI + (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonSinglet) where + toFun U := TensorProduct.map (derivAction ((star (U.2.2 : JetRing)) ^ 6)) LinearMap.id + map_one' := by + rw [show ((star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6) = + (1 : JetRing) by simp, derivAction_one, TensorProduct.map_id] + rfl + map_mul' U₁ U₂ := by + rw [show ((star (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6) = + ((star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6) * + ((star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6) by + rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, star_mul', mul_pow], + derivAction_mul, Module.End.mul_eq_comp, ← TensorProduct.map_comp, LinearMap.id_comp] + +@[simp] +lemma repJetGaugeGroupI_apply (U : JetGaugeGroupI) + (x : SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonSinglet) : + repJetGaugeGroupI U x = + TensorProduct.map (derivAction ((star (U.2.2 : JetRing)) ^ 6)) LinearMap.id x := rfl + +/-- The jet action on the zeroth-order (field) symbol: the value of the jet acts by + its hypercharge scalar, with no derivative contributions. -/ +lemma repJetGaugeGroupI_one_tmul (U : JetGaugeGroupI) (l : LeptonSinglet) : + repJetGaugeGroupI U ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) = + MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6) • + ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) := by + rw [repJetGaugeGroupI_apply, TensorProduct.map_tmul, derivAction_apply_one, + TensorProduct.smul_tmul'] + rfl + +/-- The jet action on a first-order derivative symbol is the Leibniz rule: + `∂_μ ψ ↦ χ(0) • ∂_μ ψ + (∂_μ χ)(0) • ψ`, where `χ = star u ^ 6` is the + hypercharge power series of the jet. The value of the gauge transformation + multiplies the first-derivative symbol, and its first derivative feeds the field + symbol: this is `∂_μ(g ψ) = g ∂_μ ψ + (∂_μ g) ψ` for the `(1, 1)_{-6}` + character. -/ +lemma repJetGaugeGroupI_ι_tmul (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (l : LeptonSinglet) : + repJetGaugeGroupI U (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) = + MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6) • + (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) + + MvPowerSeries.coeff (Finsupp.single μ 1) ((star (U.2.2 : JetRing)) ^ 6) • + ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) := by + rw [repJetGaugeGroupI_apply, TensorProduct.map_tmul, derivAction_apply_ι, + TensorProduct.add_tmul, TensorProduct.smul_tmul', TensorProduct.smul_tmul'] + rfl + +/-- The first-order Leibniz rule expressed through the B-boson Maurer–Cartan + coefficient: the inhomogeneous term of the charged-lepton-singlet jet is the + hypercharge `6` times the abelian connection shift `i (∂_μ u)(0) ū(0)` of the + `U(1)` jet, times the value of the character. This is the structure of the + covariant derivative: the derivative coordinates of a charged field transform + through the same Maurer–Cartan term that shifts the B boson. -/ +lemma repJetGaugeGroupI_ι_tmul_mcCoeff (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (l : LeptonSinglet) : + repJetGaugeGroupI U + (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) = + MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6) • + (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) + + ((6 : ℂ) * Complex.I * (BBoson.mcCoeff U.2.2 μ : ℂ) * + MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6)) • + ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) := by + rw [repJetGaugeGroupI_ι_tmul, BBoson.coeff_single_star_pow] + norm_num + +/-- On jets of constant gauge transformations the jet action reduces to the global + gauge action on the jet space: the `(1, 1)_{-6}` scalar on the target factor and + the trivial action on the derivative symbols. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + TensorProduct.map LinearMap.id (repGaugeGroupI g) := by + have hχ : ((star (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing)) ^ 6) = + MvPowerSeries.C ((star (g.2.2 : ℂ)) ^ 6) := by + rw [show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = + MvPowerSeries.C ((g.2.2 : ℂ)) from rfl, MvPowerSeries.star_C, ← map_pow] + show TensorProduct.map (derivAction _) LinearMap.id = _ + rw [hχ, derivAction_C] + refine LinearMap.ext fun x => ?_ + induction x using TensorProduct.induction_on with + | zero => simp + | tmul p l => + simp only [TensorProduct.map_tmul, LinearMap.smul_apply, LinearMap.id_apply] + rw [show repGaugeGroupI g l = ((star (g.2.2 : ℂ)) ^ 6) • l from rfl, + TensorProduct.smul_tmul] + | add x y hx hy => simp only [map_add]; rw [hx, hy] + end LeptonSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean new file mode 100644 index 000000000..2ae62c7b9 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -0,0 +1,278 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +/-! +# The B boson + +The hypercharge gauge boson field `B_μ`: the gauge boson of the `U(1)` factor of +the Standard Model gauge group, with one Lorentz index, valued in the +one-dimensional adjoint of `U(1)`, modelled as the real vector space of hermitian +complex numbers. + +The physical Z boson and photon are the electroweak-mixed combinations of this +field with the neutral `SU(2)` boson; before mixing, the `U(1)` factor's gauge +boson is the B boson formalized here. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The B-boson field +-/ + +/-- The target vector space of the B-boson field `B_μ`. It carries one Lorentz + index, and is valued in the real vector space of hermitian complex numbers, + corresponding to the adjoint of `U(1)`. -/ +@[ext] +structure BBoson where + /-- The Lorentz index together with the adjoint (hermitian) factor. -/ + val : Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ + +namespace BBoson + +/-! + +## B. Linear structure +-/ + +def valEquiv : BBoson ≃ Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ where + toFun := val + invFun := fun m => ⟨m⟩ + +noncomputable instance : AddCommGroup BBoson := Equiv.addCommGroup valEquiv + +noncomputable instance : Module ℝ BBoson := Equiv.module ℝ valEquiv + +/-- The linear identification with the underlying tensor product. -/ +def valLinEquiv : BBoson ≃ₗ[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ where + toFun := val + invFun := fun m => ⟨m⟩ + map_add' := by intros; rfl + map_smul' := by intros; rfl + +@[simp] +lemma valLinEquiv_apply (d : BBoson) : valLinEquiv d = d.val := rfl + +lemma valLinEquiv_symm_apply (m : Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ) : + valLinEquiv.symm m = ⟨m⟩ := rfl + +@[simp] +lemma val_add (d₁ d₂ : BBoson) : (d₁ + d₂).val = d₁.val + d₂.val := rfl + +@[simp] +lemma val_smul (r : ℝ) (d : BBoson) : (r • d).val = r • d.val := rfl + +@[simp] +lemma val_zero : (0 : BBoson).val = 0 := rfl + +/-! + +## C. Lorentz action + +The Lorentz group acts on the Lorentz index and leaves the adjoint factor fixed. +-/ + +open Matrix MatrixGroups + +/-- The Lorentz representation on the B-boson field: the vector action, through the + covering map `SL(2,ℂ) →* LorentzGroup 3`, on the Lorentz index, and the trivial + action on the adjoint factor. -/ +noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) BBoson where + toFun Λ := valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ)) + (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) Λ) ∘ₗ + valLinEquiv.toLinearMap + map_one' := by + ext F + simp [Module.End.one_eq_id] + map_mul' Λ₁ Λ₂ := by + ext1 F + simp [TensorProduct.map_map, Module.End.mul_eq_comp, map_mul] + +/-! + +## D. Gauge action + +The B boson is neutral: the `SU(3)` and `SU(2)` components do not act on it, and +the adjoint action of the abelian `U(1)` component is `A ↦ u * A * ū = A`, which is +trivial. The global gauge group therefore acts trivially. +-/ + +/-- The (trivial) adjoint action of the unquotiented Standard Model gauge group on + the B-boson field. -/ +noncomputable def repGaugeGroupI : Representation ℝ GaugeGroupI BBoson := + Representation.trivial ℝ GaugeGroupI BBoson + +@[simp] +lemma repGaugeGroupI_apply (g : GaugeGroupI) (B : BBoson) : + repGaugeGroupI g B = B := rfl + +/-! + +## E. Local gauge action through jets + +A local gauge transformation acts on the B-boson field through its first-order jet. +Because the adjoint action is trivial, only the inhomogeneous Maurer–Cartan term +survives: `B_μ ↦ B_μ + i (∂_μ u)(0) ū(0)`, where `u` is the `U(1)` power-series +component of the jet. The Maurer–Cartan coefficient is hermitian by unitarity, and +since the group is abelian the cocycle identity degenerates to additivity. The +resulting action of `JetGaugeGroupI` on `BBoson` is by translations. +-/ + +open MvPowerSeries + +/-- The Maurer–Cartan coefficient of a jet of a `U(1)` gauge transformation in the + spacetime direction `μ`: `i (∂_μ u)(0) ū(0)`, which is hermitian by unitarity. -/ +noncomputable def mcCoeff (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : selfAdjoint ℂ := + ⟨Complex.I * coeff (Finsupp.single μ 1) (u : JetRing) * + star (constantCoeff (u : JetRing)), by + have h := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp u.2).2 + rw [coeff_single_one_mul, coeff_star, constantCoeff_star, + show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at h + have hI : (star Complex.I) = -Complex.I := by + simp [Complex.conj_I] + rw [selfAdjoint.mem_iff, star_mul', star_mul', star_star, hI] + linear_combination (-Complex.I) * h⟩ + +@[simp] +lemma mcCoeff_one (μ : Fin 1 ⊕ Fin 3) : mcCoeff 1 μ = 0 := by + apply Subtype.ext + have h : coeff (Finsupp.single μ 1) (1 : JetRing) = 0 := by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])] + simp [mcCoeff, h] + +/-- The abelian cocycle identity: the Maurer–Cartan coefficient is additive. -/ +lemma mcCoeff_mul (u₁ u₂ : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : + mcCoeff (u₁ * u₂) μ = mcCoeff u₁ μ + mcCoeff u₂ μ := by + have h₁ : constantCoeff (u₁ : JetRing) * star (constantCoeff (u₁ : JetRing)) = 1 := by + have h := congrArg constantCoeff (Unitary.mem_iff.mp u₁.2).2 + rwa [map_mul, constantCoeff_star, map_one] at h + have h₂ : constantCoeff (u₂ : JetRing) * star (constantCoeff (u₂ : JetRing)) = 1 := by + have h := congrArg constantCoeff (Unitary.mem_iff.mp u₂.2).2 + rwa [map_mul, constantCoeff_star, map_one] at h + apply Subtype.ext + simp only [mcCoeff, MulMemClass.coe_mul, AddSubgroup.coe_add] + rw [coeff_single_one_mul, map_mul, star_mul] + linear_combination (Complex.I * coeff (Finsupp.single μ 1) (u₁ : JetRing) * + star (constantCoeff (u₁ : JetRing))) * h₂ + + (Complex.I * coeff (Finsupp.single μ 1) (u₂ : JetRing) * + star (constantCoeff (u₂ : JetRing))) * h₁ + +/-- The first-order Taylor coefficient of a hypercharge power of a `U(1)` jet is + the charge times the Maurer–Cartan coefficient times the value of the character: + `(∂_μ (ū^q))(0) = q · i (∂_μu)(0)ū(0) · (ū(0))^q`. The abelian connection shift + controls the first-order transformation of every charged field. -/ +lemma coeff_single_star_pow (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) : + coeff (Finsupp.single μ 1) ((star (u : JetRing)) ^ q) = + (q : ℂ) * Complex.I * (mcCoeff u μ : ℂ) * + constantCoeff ((star (u : JetRing)) ^ q) := by + rcases Nat.eq_zero_or_pos q with hq | hq + · subst hq + rw [pow_zero, show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] + simp + · have h := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp u.2).2 + rw [coeff_single_one_mul, coeff_star, constantCoeff_star, + show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at h + have hB : constantCoeff (u : JetRing) * star (constantCoeff (u : JetRing)) = 1 := by + have h' := congrArg constantCoeff (Unitary.mem_iff.mp u.2).2 + rwa [map_mul, constantCoeff_star, map_one] at h' + have hσA : star (coeff (Finsupp.single μ 1) (u : JetRing)) = + -(coeff (Finsupp.single μ 1) (u : JetRing) * + star (constantCoeff (u : JetRing)) * star (constantCoeff (u : JetRing))) := by + linear_combination star (constantCoeff (u : JetRing)) * h - + star (coeff (Finsupp.single μ 1) (u : JetRing)) * hB + have hpow : star (constantCoeff (u : JetRing)) ^ (q - 1) * + star (constantCoeff (u : JetRing)) = star (constantCoeff (u : JetRing)) ^ q := by + rw [← pow_succ, Nat.sub_add_cancel hq] + rw [coeff_single_one_pow, coeff_star, constantCoeff_star, map_pow, constantCoeff_star, + hσA, show ((mcCoeff u μ : ℂ)) = Complex.I * + coeff (Finsupp.single μ 1) (u : JetRing) * + star (constantCoeff (u : JetRing)) from rfl, + show (q : ℂ) * star (constantCoeff (u : JetRing)) ^ (q - 1) * + -(coeff (Finsupp.single μ 1) (u : JetRing) * + star (constantCoeff (u : JetRing)) * star (constantCoeff (u : JetRing))) = + -((q : ℂ) * coeff (Finsupp.single μ 1) (u : JetRing) * + ((star (constantCoeff (u : JetRing)) ^ (q - 1) * + star (constantCoeff (u : JetRing))) * star (constantCoeff (u : JetRing)))) + from by ring, hpow] + ring_nf + rw [Complex.I_sq] + ring + +/-- The Maurer–Cartan term of a jet of a `U(1)` gauge transformation, as a B-boson: + the translation part of the local gauge action, with components + `i (∂_μ u)(0) ū(0)`. -/ +noncomputable def mcBBoson (u : unitary JetRing) : BBoson := + ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] mcCoeff u μ⟩ + +@[simp] +lemma mcBBoson_one : mcBBoson 1 = 0 := by + apply BBoson.ext + simp [mcBBoson] + +/-- The Maurer–Cartan term is additive in the jet. -/ +lemma mcBBoson_mul (u₁ u₂ : unitary JetRing) : + mcBBoson (u₁ * u₂) = mcBBoson u₁ + mcBBoson u₂ := by + apply BBoson.ext + simp [mcBBoson, mcCoeff_mul, TensorProduct.tmul_add, Finset.sum_add_distrib] + +/-- The action of the jet gauge group on the B-boson field: the adjoint action is + trivial, so a jet of gauge transformations acts purely by the Maurer–Cartan + translation `B_μ ↦ B_μ + i (∂_μ u)(0) ū(0)` of its `U(1)` component. The action + is affine rather than linear, which is why it is a `MulAction` and not a + `Representation`. -/ +noncomputable instance : MulAction JetGaugeGroupI BBoson where + smul U B := B + mcBBoson U.2.2 + one_smul B := by + show B + mcBBoson (1 : JetGaugeGroupI).2.2 = B + simp + mul_smul U V B := by + show B + mcBBoson (U * V).2.2 = (B + mcBBoson V.2.2) + mcBBoson U.2.2 + rw [show (U * V).2.2 = U.2.2 * V.2.2 from rfl, mcBBoson_mul] + abel + +lemma smul_def (U : JetGaugeGroupI) (B : BBoson) : U • B = B + mcBBoson U.2.2 := rfl + +/-- The jets of constant (global) gauge transformations act trivially on the B + boson, in agreement with the trivial adjoint representation `repGaugeGroupI`: the + Maurer–Cartan term vanishes on constant jets. -/ +@[simp] +lemma ofConstant_smul (g : GaugeGroupI) (B : BBoson) : + JetGaugeGroupI.ofConstant g • B = B := by + rw [smul_def] + have hmc : ∀ μ, mcCoeff (JetGaugeGroupI.ofConstant g).2.2 μ = 0 := by + intro μ + apply Subtype.ext + have h : coeff (Finsupp.single μ 1) + (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = 0 := by + rw [show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = + MvPowerSeries.C ((g.2.2 : ℂ)) from rfl, + coeff_C, if_neg (by simp [Finsupp.single_eq_zero])] + simp [mcCoeff, h] + have h0 : mcBBoson (JetGaugeGroupI.ofConstant g).2.2 = 0 := by + apply BBoson.ext + simp [mcBBoson, hmc] + rw [h0, add_zero] + +end BBoson + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index 4ef15ca9d..d9bc959d9 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -8,40 +8,20 @@ module public import Physlib.Particles.StandardModel.Basic public import Mathlib.RingTheory.MvPowerSeries.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic /-! # The jet gauge group ## i. Overview -This file defines the group of formal infinite-order jets, at a spacetime point, of -local gauge transformations of the Standard Model. - -A local gauge transformation is a map from spacetime into the gauge group. Its -infinite-order jet at a point is the collection of all its Taylor coefficients -there, which, by Borel's theorem, is exactly a formal power series in the spacetime -coordinates. Since gauge transformations multiply pointwise, jets multiply as -(truncated) power series, with the Leibniz rule handled automatically by the -power-series product. - -This leads to a purely algebraic definition: the jet gauge group is the group of -`R`-points of the gauge group, where `R` is the commutative ring of formal power -series in the spacetime coordinates with complex coefficients. Concretely, an -element of the `SU(3)` factor is a `3 × 3` matrix of power series `U` satisfying -`U * Uᴴ = 1` and `det U = 1` as power series, which encodes the unitarity and -determinant constraints at every jet order simultaneously. - -The star operation on the power-series ring is coefficientwise complex conjugation, -so that the spacetime coordinates themselves are self-adjoint (they are real -coordinates); this star structure is defined in section A below and is not currently -in Mathlib. - -Evaluation of power series at the base point (the constant coefficient) gives a -group homomorphism from the jet gauge group to the gauge group `GaugeGroupI`, -projecting a jet to its zeroth-order part; conversely the constant power series give -an embedding of `GaugeGroupI` into the jet gauge group as the jets of constant -(global) gauge transformations. - +The essential idea is that at a point `x` in spacetime, +a gauge transformation on fields at `x` and their derivatives +is determined by the gauge transformation -/ @[expose] public section @@ -106,11 +86,55 @@ lemma coeff_single_one_mul [CommSemiring R] (μ : σ) (f g : MvPowerSeries σ R) Finsupp.single_zero, coeff_zero_eq_constantCoeff] ring +/-- The first-order power rule: the degree-one Taylor coefficient, in the direction + `μ`, of a power of a power series. -/ +lemma coeff_single_one_pow [CommRing R] (μ : σ) (f : MvPowerSeries σ R) (n : ℕ) : + coeff (Finsupp.single μ 1) (f ^ n) = + (n : R) * constantCoeff f ^ (n - 1) * coeff (Finsupp.single μ 1) f := by + classical + induction n with + | zero => + simp [coeff_one, Finsupp.single_eq_zero] + | succ n ih => + rw [pow_succ, coeff_single_one_mul, ih, map_pow, Nat.add_sub_cancel] + rcases Nat.eq_zero_or_pos n with hn | hn + · subst hn + simp + · have hpow : constantCoeff f ^ (n - 1) * constantCoeff f = constantCoeff f ^ n := by + rw [← pow_succ, Nat.sub_add_cancel hn] + push_cast + linear_combination ((n : R) * coeff (Finsupp.single μ 1) f) * hpow + end MvPowerSeries +namespace Module.Basis + +variable {R M κ : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + +/-- The basis vector of the symmetric algebra at the zero multi-index is the unit + of the algebra. -/ +lemma symmetricAlgebra_zero (b : Module.Basis κ R M) : + b.symmetricAlgebra (0 : κ →₀ ℕ) = 1 := by + have h : (MvPolynomial.basisMonomials κ R) (0 : κ →₀ ℕ) = 1 := by + rw [MvPolynomial.coe_basisMonomials] + simp [MvPolynomial.monomial_zero'] + rw [symmetricAlgebra, map_apply, h] + simp + +/-- The basis vector of the symmetric algebra at a single multi-index is the + corresponding generator. -/ +lemma symmetricAlgebra_single (b : Module.Basis κ R M) (i : κ) : + b.symmetricAlgebra (Finsupp.single i 1) = SymmetricAlgebra.ι R M (b i) := by + have h : (MvPolynomial.basisMonomials κ R) (Finsupp.single i 1) = MvPolynomial.X i := rfl + rw [symmetricAlgebra, map_apply, h] + simp + +end Module.Basis + namespace StandardModel open Matrix MvPowerSeries +open scoped Nat /-! @@ -256,8 +280,205 @@ lemma eval_ofConstant (g : GaugeGroupI) : eval (ofConstant g) = g := by RingHom.mapMatrix_apply, Matrix.map_apply] · simp [eval, ofConstant, evalU1, ofConstantU1] +end JetGaugeGroupI + +/-! +## F. The derivative action on the symmetric algebra -end JetGaugeGroupI +The polynomial jet spaces of `LagrangianTheory` are built on the symmetric algebra +`SymmetricAlgebra ℂ Lorentz.CoℂModule`, whose multiset monomials are the commuting +derivative symbols `∂_m`. The jet ring pairs with this algebra by the +divided-power duality `⟨∂_m, f⟩ = m! · coeff m f` (the constant-coefficient +operator `∂_m` applied to `f`, evaluated at the base point). + +Through this pairing a jet `χ : JetRing` acts on the symmetric algebra as the +transpose of multiplication by `χ`, which is the infinite-order +constant-coefficient differential operator `χ(∂)`. On the derivative symbol `∂_m` +it acts by `∂_m ↦ ∑_{k + l = m} (m.descFactorial k) · (coeff k χ) · ∂_l`: the +Leibniz rule for how the derivatives of a field pick up derivatives of the gauge +parameter, e.g. `∂_μ ↦ χ(0) ∂_μ + (∂_μ χ)(0) ∂_∅`. Because the jet ring is +commutative, transposition preserves multiplicativity, so `χ ↦ χ(∂)` is +multiplicative; this is proved via adjointness and nondegeneracy of the pairing. + +-/ + +/-- The divided-power pairing between the symmetric algebra of covectors (the + algebra of derivative symbols) and the jet ring: on the monomial `∂_m` it is + `f ↦ m! · coeff m f`. -/ +noncomputable def symPairing : + SymmetricAlgebra ℂ Lorentz.CoℂModule →ₗ[ℂ] JetRing →ₗ[ℂ] ℂ := + Lorentz.complexCoBasis.symmetricAlgebra.constr ℂ fun m => + (∏ μ, (m μ)! : ℕ) • MvPowerSeries.coeff m + +@[simp] +lemma symPairing_basis (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (f : JetRing) : + symPairing (Lorentz.complexCoBasis.symmetricAlgebra m) f = + (∏ μ, (m μ)! : ℕ) • MvPowerSeries.coeff m f := by + rw [symPairing, Module.Basis.constr_basis] + rfl + +/-- The pairing of an element of the symmetric algebra with a monomial extracts the + corresponding basis coordinate, weighted by the factorial. -/ +lemma symPairing_monomial (p : SymmetricAlgebra ℂ Lorentz.CoℂModule) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + symPairing p (MvPowerSeries.monomial m 1) = + ((∏ μ, (m μ)! : ℕ) : ℂ) * Lorentz.complexCoBasis.symmetricAlgebra.repr p m := by + classical + rw [symPairing, Module.Basis.constr_apply, Finsupp.sum, LinearMap.sum_apply] + simp only [LinearMap.smul_apply, MvPowerSeries.coeff_monomial] + rw [Finset.sum_eq_single m] + · by_cases hm : m ∈ (Lorentz.complexCoBasis.symmetricAlgebra.repr p).support + · simp [mul_comm] + · rw [Finsupp.notMem_support_iff.mp hm] + simp + · intro i _ hi + simp [hi] + · intro hm + rw [Finsupp.notMem_support_iff.mp hm] + simp + +/-- Two elements of the symmetric algebra pairing equally against every jet are + equal: the divided-power pairing is nondegenerate on the symmetric-algebra side + (the factorials are invertible in characteristic zero). -/ +lemma symPairing_injective {p q : SymmetricAlgebra ℂ Lorentz.CoℂModule} + (h : ∀ f, symPairing p f = symPairing q f) : p = q := by + refine Lorentz.complexCoBasis.symmetricAlgebra.ext_elem fun m => ?_ + have hf := h (MvPowerSeries.monomial m 1) + rw [symPairing_monomial, symPairing_monomial] at hf + have hfac : ((∏ μ, (m μ)! : ℕ) : ℂ) ≠ 0 := by + rw [Nat.cast_ne_zero] + exact Finset.prod_ne_zero_iff.mpr fun μ _ => Nat.factorial_ne_zero (m μ) + exact mul_left_cancel₀ hfac hf + +/-- The action of a jet `χ` on the algebra of derivative symbols: the transpose of + multiplication by `χ` under the divided-power pairing, i.e. the constant + coefficient differential operator `χ(∂)`. On the derivative symbol `∂_m` it is + `∑_{k + l = m} (m.descFactorial k) · (coeff k χ) · ∂_l`, the Leibniz rule; for + example `∂_μ ↦ χ(0) ∂_μ + (∂_μχ)(0) ∂_∅`. -/ +noncomputable def derivAction (χ : JetRing) : + SymmetricAlgebra ℂ Lorentz.CoℂModule →ₗ[ℂ] SymmetricAlgebra ℂ Lorentz.CoℂModule := + Lorentz.complexCoBasis.symmetricAlgebra.constr ℂ fun m => + ∑ p ∈ Finset.antidiagonal m, + ((∏ μ, (m μ).descFactorial (p.1 μ) : ℕ) : ℂ) • MvPowerSeries.coeff p.1 χ • + Lorentz.complexCoBasis.symmetricAlgebra p.2 + +/-- Adjointness: the derivative action of `χ` is the transpose of multiplication by + `χ` under the divided-power pairing. This is the coefficient-level statement of + the Leibniz rule. -/ +lemma symPairing_derivAction (χ f : JetRing) (p : SymmetricAlgebra ℂ Lorentz.CoℂModule) : + symPairing (derivAction χ p) f = symPairing p (χ * f) := by + classical + have h : (symPairing.flip f) ∘ₗ derivAction χ = symPairing.flip (χ * f) := by + refine Lorentz.complexCoBasis.symmetricAlgebra.ext fun m => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.flip_apply] + rw [derivAction, Module.Basis.constr_basis] + simp only [map_sum, map_smul, LinearMap.sum_apply, LinearMap.smul_apply, + symPairing_basis, smul_eq_mul, nsmul_eq_mul] + rw [MvPowerSeries.coeff_mul, Finset.mul_sum] + refine Finset.sum_congr rfl fun q hq => ?_ + have hm : q.1 + q.2 = m := Finset.mem_antidiagonal.mp hq + have hfac : ((∏ μ, (m μ).descFactorial (q.1 μ) : ℕ) : ℂ) * + ((∏ μ, (q.2 μ)! : ℕ) : ℂ) = ((∏ μ, (m μ)! : ℕ) : ℂ) := by + rw [← Nat.cast_mul, ← Finset.prod_mul_distrib] + congr 1 + refine Finset.prod_congr rfl fun μ _ => ?_ + rw [mul_comm] + have h1 : q.1 μ ≤ m μ := by + rw [← hm]; simp + have h2 : m μ - q.1 μ = q.2 μ := by + rw [← hm]; simp + rw [← h2] + exact Nat.factorial_mul_descFactorial h1 + rw [← hfac] + ring + exact LinearMap.congr_fun h p + +/-- Constant jets act on the derivative symbols by their value: `C c` has no + derivative coordinates. -/ +@[simp] +lemma derivAction_C (c : ℂ) : + derivAction (MvPowerSeries.C c) = c • LinearMap.id := by + refine LinearMap.ext fun p => symPairing_injective fun f => ?_ + rw [symPairing_derivAction, + show (MvPowerSeries.C c : JetRing) * f = c • f from + (algebraMap_smul JetRing c f).symm ▸ (Algebra.smul_def c f).symm] + simp + +@[simp] +lemma derivAction_one : derivAction (1 : JetRing) = LinearMap.id := by + rw [show (1 : JetRing) = MvPowerSeries.C 1 from (map_one _).symm, derivAction_C, one_smul] + +/-- The derivative action is multiplicative: it is the transpose of multiplication + in the commutative jet ring. This makes `χ ↦ χ(∂)` a monoid homomorphism and + hence yields representations of the jet gauge group on polynomial jet spaces. -/ +lemma derivAction_mul (χ ψ : JetRing) : + derivAction (χ * ψ) = derivAction χ ∘ₗ derivAction ψ := by + refine LinearMap.ext fun p => symPairing_injective fun f => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply] + rw [symPairing_derivAction, symPairing_derivAction, symPairing_derivAction] + ring_nf + +@[simp] +lemma derivAction_zero : derivAction (0 : JetRing) = 0 := by + refine LinearMap.ext fun p => symPairing_injective fun f => ?_ + rw [symPairing_derivAction, zero_mul] + simp + +lemma derivAction_add (χ ψ : JetRing) : + derivAction (χ + ψ) = derivAction χ + derivAction ψ := by + refine LinearMap.ext fun p => symPairing_injective fun f => ?_ + simp only [LinearMap.add_apply, map_add, symPairing_derivAction] + rw [add_mul, map_add] + +/-- The derivative action as a ring homomorphism from the jet ring to the + endomorphisms of the algebra of derivative symbols: the module structure of the + jet ring on its graded dual. -/ +noncomputable def derivActionHom : + JetRing →+* Module.End ℂ (SymmetricAlgebra ℂ Lorentz.CoℂModule) where + toFun := derivAction + map_one' := derivAction_one + map_mul' χ ψ := derivAction_mul χ ψ + map_zero' := derivAction_zero + map_add' := derivAction_add + +/-- The derivative action on the zeroth-order (field) symbol: it is scaled by the + value of the jet at the base point. -/ +@[simp] +lemma derivAction_apply_one (χ : JetRing) : + derivAction χ (1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) = + MvPowerSeries.constantCoeff χ • 1 := by + rw [show (1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) = + Lorentz.complexCoBasis.symmetricAlgebra 0 from + (Lorentz.complexCoBasis.symmetricAlgebra_zero).symm, + derivAction, Module.Basis.constr_basis, Finsupp.antidiagonal_zero, Finset.sum_singleton] + simp + +/-- The derivative action on a first-order derivative symbol implements the Leibniz + rule: `∂_μ ↦ χ(0) ∂_μ + (∂_μχ)(0) 1`. The value of the jet multiplies the + first-derivative symbol, and its first derivative feeds the zeroth-order + symbol. -/ +lemma derivAction_apply_ι (χ : JetRing) (μ : Fin 1 ⊕ Fin 3) : + derivAction χ (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ)) = + MvPowerSeries.constantCoeff χ • + SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) + + MvPowerSeries.coeff (Finsupp.single μ 1) χ • 1 := by + classical + rw [show SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) = + Lorentz.complexCoBasis.symmetricAlgebra (Finsupp.single μ 1) from + (Lorentz.complexCoBasis.symmetricAlgebra_single μ).symm, + derivAction, Module.Basis.constr_basis, Finsupp.antidiagonal_single, + show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, + Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), + Finset.sum_singleton] + have h1 : (∏ ν, ((Finsupp.single μ 1) ν).descFactorial ((Finsupp.single μ 1) ν)) = 1 := + Finset.prod_eq_one fun ν _ => by + rcases eq_or_ne μ ν with h | h + · subst h; simp + · simp [h] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, + Finsupp.single_zero, Finsupp.coe_zero, Pi.zero_apply, Nat.descFactorial_zero, + Finset.prod_const_one, Nat.cast_one, one_smul, coeff_zero_eq_constantCoeff, h1, + Lorentz.complexCoBasis.symmetricAlgebra_single, Lorentz.complexCoBasis.symmetricAlgebra_zero] end StandardModel From 4ca5b7f30fc0be96b47028c951acee35035c1a92 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 06:27:31 +0100 Subject: [PATCH 080/254] docs: Jet --- .../StandardModel/GaugeGroup/Jet.lean | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index d9bc959d9..8ee934c6e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -19,9 +19,23 @@ public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic ## i. Overview -The essential idea is that at a point `x` in spacetime, -a gauge transformation on fields at `x` and their derivatives -is determined by the gauge transformation +For the Standard Model on Minkowski spacetime, +gauge transforms are maps from spacetime to the gauge group `G := SU(3) × SU(2) × U(1)`. + +If one is considering a gauge transformation `g` at a point `x`, its action +on all the fields and their derivatives at `x` is determined by the +value of `g` and all its derivatives at `x`. The collection of all +possible values of `g` and their derivatives at `x` is called the *jet* of `g` at `x`. +These form a group, which we call `JetGaugeGroupI`. + +The group `JetGaugeGroupI` acts on all the fields and their derivatives at `x`, +every gauge transformation `g` has a corresponding element of `JetGaugeGroupI`, +and the action of `g` on the fields and their derivatives at `x` is determined by this element. + +Thus locally it is enough to consider the action of `JetGaugeGroupI` on the fields and +their derivatives at a point, instead of the full set of gauge transformations on spacetime, +which is large and unwieldy. + -/ @[expose] public section From bdd36e7edd05257ed1653c68b8fad11fea11a78e Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 08:07:22 +0100 Subject: [PATCH 081/254] feat: jet actions --- .../Mathematics/MvPowerSeriesDerivative.lean | 214 ++++++++ Physlib/Particles/LagrangianTheory/Basic.lean | 5 - .../StandardModel/Fermions/LeptonSinglet.lean | 503 ++++++++++++++---- .../StandardModel/GaugeBosons/BBoson.lean | 247 +++++++++ 4 files changed, 869 insertions(+), 100 deletions(-) create mode 100644 Physlib/Mathematics/MvPowerSeriesDerivative.lean diff --git a/Physlib/Mathematics/MvPowerSeriesDerivative.lean b/Physlib/Mathematics/MvPowerSeriesDerivative.lean new file mode 100644 index 000000000..aac68f943 --- /dev/null +++ b/Physlib/Mathematics/MvPowerSeriesDerivative.lean @@ -0,0 +1,214 @@ +/- +Copyright (c) 2026 Justus Springer. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Justus Springer +-/ +module + +public import Mathlib.Algebra.MvPolynomial.PDeriv +public import Mathlib.RingTheory.MvPowerSeries.Inverse +public import Mathlib.RingTheory.MvPowerSeries.Trunc + +/-! +# Formal partial derivatives of multivariate power series + +NOTE: This file is copied verbatim from `Mathlib.RingTheory.MvPowerSeries.Derivative` +(mathlib4 commit `9fb10993c11c9e7abfa291e86fb499b6e1f4da82`), which postdates the Mathlib +version currently pinned by this project. Delete this copy and import the Mathlib file +directly once the pin catches up. + +This file defines `MvPowerSeries.pderiv R i`, the formal partial derivative of a multivariate +power series with respect to variable `i`, as a +`Derivation R (MvPowerSeries σ R) (MvPowerSeries σ R)`. + +See also `PowerSeries.derivative` for the univariate setting. + +## Main definitions + +- `MvPowerSeries.pderiv R i`: the formal partial derivative with respect to `i`, as a derivation. + +## Main results + +- `MvPowerSeries.coeff_pderiv`: coefficient formula + `coeff n (pderiv R i f) = coeff (n + single i 1) f * (n i + 1)`. +- `MvPowerSeries.pderiv_coe`: compatibility with `MvPolynomial.pderiv`. +- `MvPowerSeries.trunc_pderiv`: truncation commutes with partial differentiation. +- `MvPowerSeries.pderiv.ext`: a power series is determined by its constant term and its partial + derivatives. +- `MvPowerSeries.pderiv_pow`: power rule. +- `MvPowerSeries.pderiv_inv`, `MvPowerSeries.pderiv_inv'`: derivative of an inverse. + +-/ + +@[expose] public section + +namespace MvPowerSeries + +open MvPolynomial Finsupp + +variable {σ R : Type*} + +section Semiring + +variable [Semiring R] + +/-- The underlying function of the formal partial derivative with respect to variable `i`. +This is packaged as a derivation in `MvPowerSeries.pderiv`. -/ +noncomputable def pderivFun (i : σ) (f : MvPowerSeries σ R) : MvPowerSeries σ R := + fun d ↦ coeff (d + single i 1) f * (d i + 1) + +theorem coeff_pderivFun {i : σ} (f : MvPowerSeries σ R) (d : σ →₀ ℕ) : + coeff d (f.pderivFun i) = coeff (d + single i 1) f * (d i + 1) := by + rfl + +theorem pderivFun_add {i : σ} (f g : MvPowerSeries σ R) : + pderivFun i (f + g) = pderivFun i f + pderivFun i g := by + ext + rw [coeff_pderivFun, map_add, map_add, coeff_pderivFun, coeff_pderivFun, add_mul] + +theorem pderivFun_C {i : σ} (r : R) : pderivFun i (C r) = 0 := by + ext n + rw [coeff_pderivFun, coeff_add_single_C, zero_mul, (coeff n).map_zero] + +theorem pderivFun_one {i : σ} : pderivFun i (1 : MvPowerSeries σ R) = 0 := by + rw [← map_one C, pderivFun_C (1 : R)] + +end Semiring + +section CommSemiring + +variable [CommSemiring R] + +private theorem pderivFun_coe {i : σ} (f : MvPolynomial σ R) : + (f : MvPowerSeries σ R).pderivFun i = f.pderiv i := by + ext + rw [coeff_pderivFun, coeff_coe, coeff_coe, coeff_pderiv] + +private theorem trunc_pderivFun [DecidableEq σ] {i : σ} (f : MvPowerSeries σ R) (n : σ →₀ ℕ) : + trunc R n (pderivFun i f) = pderiv i (trunc R (n + single i 1) f) := by + ext + rw [coeff_trunc] + split_ifs with h + · rw [coeff_pderivFun, coeff_pderiv, coeff_trunc, if_pos (add_lt_add_left h _)] + · rw [coeff_pderiv, coeff_trunc, if_neg ((add_lt_add_iff_right _).not.mpr h), zero_mul] + +-- A special case of `pderivFun_mul`, used in its proof. +private theorem pderivFun_coe_mul_coe {i : σ} (f g : MvPolynomial σ R) : + pderivFun i (f * g : MvPowerSeries σ R) = f * pderiv i g + g * pderiv i f := by + rw [← coe_mul, pderivFun_coe, pderiv_mul, add_comm, mul_comm _ g, ← coe_mul, ← coe_mul, + MvPolynomial.coe_add] + +private theorem pderivFun_mul {i : σ} (f g : MvPowerSeries σ R) : + pderivFun i (f * g) = f • g.pderivFun i + g • f.pderivFun i := by + classical + ext n + have h₁ : n < n + single i 1 := lt_def.mpr ⟨self_le_add_right _ _, i, by simp⟩ + have h₂ : n + single i 1 < n + single i 1 + single i 1 := + lt_def.mpr ⟨self_le_add_right _ _, i, by simp⟩ + have h₃ : n < n + single i 1 + single i 1 := lt_trans h₁ h₂ + rw [coeff_pderivFun, map_add, ← coeff_trunc_mul_trunc_eq_coeff_mul _ _ _ h₂, smul_eq_mul, + smul_eq_mul, ← coeff_trunc_mul_trunc_eq_coeff_mul₂ _ _ g (f.pderivFun i) h₃ h₁, + ← coeff_trunc_mul_trunc_eq_coeff_mul₂ _ _ f (g.pderivFun i) h₃ h₁, trunc_pderivFun, + trunc_pderivFun, ← coeff_coe, ← coeff_coe, ← coeff_coe, ← map_add, coe_mul, coe_mul, coe_mul, + ← pderivFun_coe_mul_coe, coeff_pderivFun] + +private theorem pderivFun_smul {i : σ} (r : R) (f : MvPowerSeries σ R) : + pderivFun i (r • f) = r • pderivFun i f := by + rw [smul_eq_C_mul, smul_eq_C_mul, pderivFun_mul, pderivFun_C, smul_zero, add_zero, smul_eq_mul] + +variable (R) in +/-- The formal partial derivative of a multivariate formal power series with respect to +variable `i`, as an `R`-derivation on `MvPowerSeries σ R`. -/ +@[no_expose] +noncomputable def pderiv (i : σ) : Derivation R (MvPowerSeries σ R) (MvPowerSeries σ R) where + toFun := pderivFun i + map_add' := pderivFun_add + map_smul' := pderivFun_smul + map_one_eq_zero' := pderivFun_one + leibniz' := pderivFun_mul + +@[simp] theorem pderiv_C {i : σ} {r : R} : pderiv R i (C r) = 0 := pderivFun_C r + +theorem pderiv_one {i : σ} : pderiv R i 1 = 0 := pderiv_C + +theorem coeff_pderiv {i : σ} (f : MvPowerSeries σ R) (n : σ →₀ ℕ) : + coeff n (pderiv R i f) = coeff (n + single i 1) f * (n i + 1) := + coeff_pderivFun f n + +theorem pderiv_coe {i : σ} (f : MvPolynomial σ R) : + pderiv R i f = MvPolynomial.pderiv i f := pderivFun_coe f + +@[simp] +theorem pderiv_X_self {i : σ} : pderiv R i (X i) = 1 := by + classical + ext n + simp only [coeff_pderiv, coeff_X, boole_mul, add_eq_right, coeff_one] + split_ifs <;> simp_all + +@[simp] +theorem pderiv_X_of_ne {i j : σ} (h : j ≠ i) : pderiv R i (X j) = 0 := by + classical + ext n + simpa only [coeff_pderiv, coeff_X, boole_mul, coeff_zero] using + if_neg (ne_iff.mpr ⟨i, by grind [Finsupp.add_apply]⟩) + +theorem pderiv_X [DecidableEq σ] (i j : σ) : + pderiv R i (X j) = Pi.single (M := fun _ => MvPowerSeries σ R) i 1 j := by + by_cases h : i = j + · subst h; simp only [pderiv_X_self, Pi.single_eq_same] + · grind [pderiv_X_of_ne] + +theorem trunc_pderiv [DecidableEq σ] {i : σ} (f : MvPowerSeries σ R) (n : σ →₀ ℕ) : + trunc R n (pderiv R i f) = MvPolynomial.pderiv i (trunc R (n + single i 1) f) := + trunc_pderivFun .. + +/-- The partial derivative of `g^n` equals `n * g^(n-1) * g'`. -/ +theorem pderiv_pow {i : σ} (g : MvPowerSeries σ R) (n : ℕ) : + pderiv R i (g ^ n) = n * g ^ (n - 1) * pderiv R i g := by + rw [Derivation.leibniz_pow, smul_eq_mul, nsmul_eq_mul, mul_assoc] + +end CommSemiring + +/-- If `f` and `g` have the same constant term and all partial derivatives, then they are equal. + +The `CommRing` assumption is needed because the proof uses `smul_right_inj`, which requires +cancellation of addition in `R`; `IsAddTorsionFree` alone does not suffice. -/ +theorem pderiv.ext [CommRing R] [IsAddTorsionFree R] {f g : MvPowerSeries σ R} + (hD : ∀ i, pderiv R i f = pderiv R i g) (hc : constantCoeff f = constantCoeff g) : f = g := by + ext n + by_cases h : n = 0 + · rw [h, coeff_zero_eq_constantCoeff, hc] + obtain ⟨i, hi : n i ≠ 0⟩ := ne_iff.mp h + have : single i 1 ≤ n := fun j ↦ by + by_cases hj : j = i <;> grind [single_eq_same, single_eq_of_ne] + have e := congr(coeff (n - single i 1) $(hD i)) + rwa [coeff_pderiv, coeff_pderiv, tsub_add_cancel_of_le this, coe_tsub, Pi.sub_apply, + single_eq_same, Nat.cast_sub (Nat.one_le_iff_ne_zero.mpr hi), Nat.cast_one, sub_add_cancel, + mul_comm, ← nsmul_eq_mul, mul_comm, ← nsmul_eq_mul, smul_right_inj hi] at e + +@[simp] +theorem pderiv_inv {i : σ} [CommRing R] (f : (MvPowerSeries σ R)ˣ) : + pderiv R i ↑f⁻¹ = -(↑f⁻¹ : MvPowerSeries σ R) ^ 2 * pderiv R i f := + (pderiv R i).leibniz_of_mul_eq_one f.inv_mul + +@[simp] +theorem pderiv_invOf {i : σ} [CommRing R] (f : MvPowerSeries σ R) [Invertible f] : + pderiv R i ⅟f = -⅟f ^ 2 * pderiv R i f := + (pderiv R i).leibniz_invOf f + +/- +The following theorem is stated only in the case that `R` is a field. This is because +there is currently no instance of `Inv (MvPowerSeries σ R)` for more general base rings `R`. +-/ + +@[simp] +theorem pderiv_inv' {i : σ} [Field R] (f : MvPowerSeries σ R) : + pderiv R i f⁻¹ = -f⁻¹ ^ 2 * pderiv R i f := by + by_cases h : constantCoeff f = 0 + · suffices f⁻¹ = 0 by + rw [this, pow_two, zero_mul, neg_zero, zero_mul, map_zero] + rwa [MvPowerSeries.inv_eq_zero] + apply Derivation.leibniz_of_mul_eq_one + exact MvPowerSeries.inv_mul_cancel (h := h) + +end MvPowerSeries diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 3c90ed470..e43d86993 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -6,11 +6,6 @@ Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan module public import Physlib.Relativity.Fermions.Weyl.Metric -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet -public import Physlib.Particles.StandardModel.Fermions.DownSinglet -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet -public import Physlib.Particles.StandardModel.Fermions.UpSinglet public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index b6fdba6fa..caaf059e8 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -10,6 +10,9 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Jet public import Physlib.Particles.StandardModel.GaugeBosons.BBoson public import Mathlib.RingTheory.TensorProduct.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic /-! # Charged-lepton singlets @@ -237,119 +240,429 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → /-! -## G. Jet gauge action +## G. The jet component vector space -The hypercharge character extends verbatim to jets: the jet ring carries a star -operation and powers, so `star u ^ 6` makes sense for the `U(1)` power-series -component `u` of a jet of gauge transformations. +A Lagrangian containing a charged lepton singlet may have terms +of the form `∂_μ ∂_ν ψ`. These expressions should be considered as +component functions which takes in a section of the +bundle of charged lepton singlets and returns a complex number. -A jet acts on the polynomial jet space -`SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonSinglet` — the commuting -derivative symbols of the field tensored with its target space — through the -derivative action `derivAction` of its hypercharge power series on the symbols: -the value of the jet multiplies each symbol, while its derivative coordinates -lower derivative symbols by the Leibniz rule, e.g. -`∂_μ ψ ↦ χ(0) ∂_μ ψ + (∂_μ χ)(0) ψ` with `χ = star u ^ 6`. On jets of constant -gauge transformations the action reduces to the global gauge action, trivial on -the derivative symbols. +The space of all such component functions is what we call the jet component space. +The lagrangian is an element of the algebra over all such component +functions for all the fields in the theory. + +For matter particles, the (jet) Gauge group acts on the +jet component space as a representation. This is not case for the gauge bosons. -/ -open TensorProduct +open TensorProduct LagrangianTheory + +inductive JetGenerators where + | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators + | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators +deriving DecidableEq + +def JetGenerators.equiv : JetGenerators ≃ + (Multiset (Fin 1 ⊕ Fin 3) × Fin 2 ⊕ Multiset (Fin 1 ⊕ Fin 3) × Fin 2) where + toFun + | JetGenerators.dψ s α => Sum.inl (s, α) + | JetGenerators.dbarψ s α => Sum.inr (s, α) + invFun + | Sum.inl (s, α) => JetGenerators.dψ s α + | Sum.inr (s, α) => JetGenerators.dbarψ s α + left_inv := by + intro x + cases x <;> rfl + right_inv := by + intro x + cases x <;> rfl + +abbrev JetComponentSpace := + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) × + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet)) + +noncomputable def JetComponentSpace.basis : Module.Basis JetGenerators ℂ JetComponentSpace := + ((dualJetAlgebraBasis.tensorProduct + LeptonSinglet.basis.dualBasis).prod + (dualJetAlgebraBasis.tensorProduct + (LeptonSinglet.basis.conj.dualBasis))).reindex JetGenerators.equiv.symm + +/-- The dual jet algebra basis vector at a multiset of derivative indices is the + corresponding basis monomial of the symmetric algebra of dual symbols. -/ +lemma dualJetAlgebraBasis_apply (s : Multiset (Fin 1 ⊕ Fin 3)) : + dualJetAlgebraBasis s = + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by + rw [dualJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] + rfl + +/-- The dual jet algebra basis vector at the empty multiset is the unit of the + algebra: the zeroth-order component function carries no derivative symbols. -/ +lemma dualJetAlgebraBasis_nil : + dualJetAlgebraBasis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by + rw [dualJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({} : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp] + exact Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_zero + +/-- The basis vector of the jet component space at the zeroth-order singlet + generator: the unit of the dual jet algebra tensored with the dual basis of the + singlet, in the first (unconjugated) factor. -/ +lemma JetComponentSpace.basis_dψ_nil (α : Fin 2) : + JetComponentSpace.basis (.dψ {} α) = + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α, 0) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dψ {} α) = Sum.inl ({}, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', + dualJetAlgebraBasis_nil] + · rw [Module.Basis.prod_apply_inl_snd] + +/-- The dual jet algebra basis vector at a singleton multiset is the corresponding + dual derivative symbol. -/ +lemma dualJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : + dualJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) := by + rw [dualJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + Finsupp.single μ 1 by simp] + exact Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_single μ + +/-- The basis vector of the jet component space at a first-order singlet + generator: the dual derivative symbol tensored with the dual basis of the + singlet, in the first (unconjugated) factor. -/ +lemma JetComponentSpace.basis_dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + JetComponentSpace.basis (.dψ {μ} α) = + (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α, 0) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dψ {μ} α) = Sum.inl ({μ}, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', + dualJetAlgebraBasis_singleton] + · rw [Module.Basis.prod_apply_inl_snd] + +/-- The basis vector of the jet component space at a general singlet generator: + the dual jet algebra basis vector at its multiset of derivative indices, + tensored with the dual basis of the singlet, in the first (unconjugated) + factor. -/ +lemma JetComponentSpace.basis_dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + JetComponentSpace.basis (.dψ s α) = + (dualJetAlgebraBasis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dψ s α) = Sum.inl (s, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply'] + · rw [Module.Basis.prod_apply_inl_snd] + +noncomputable def JetComponentSpace.repLorentzGroup : + Representation ℂ (SL(2,ℂ)) JetComponentSpace := + (dualJetAlgebraRepLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual).prod + (dualJetAlgebraRepLorentzGroup.tprod LeptonSinglet.repLorentzGroup.conj.dual) + +/-- The identification of the algebra of derivative symbols with the dual jet + algebra, matching the monomial basis of derivative symbols with the monomial + basis of dual derivative symbols. -/ +noncomputable def dualJetAlgebraEquiv : + SymmetricAlgebra ℂ Lorentz.CoℂModule ≃ₗ[ℂ] + SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) := + Lorentz.complexCoBasis.symmetricAlgebra.equiv + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (Equiv.refl _) + +/-- The derivative action of a jet `χ` on the dual jet algebra: the transport of + `derivAction χ` through the basis identification `dualJetAlgebraEquiv`. The + component functions of the derivative coordinates transform by the same Leibniz + rule as the derivative symbols themselves. -/ +noncomputable def dualDerivAction (χ : JetRing) : + SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) →ₗ[ℂ] + SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) := + dualJetAlgebraEquiv.toLinearMap ∘ₗ derivAction χ ∘ₗ dualJetAlgebraEquiv.symm.toLinearMap -/-- The `(1, 1)_{-6}` action of the jet gauge group on the polynomial jet space of - the charged-lepton singlet: a jet of gauge transformations acts through the - derivative action of its hypercharge power series `star u ^ 6` on the derivative - symbols. Its value multiplies each symbol, and its derivative coordinates act by - the Leibniz rule. -/ -noncomputable def repJetGaugeGroupI : +@[simp] +lemma dualDerivAction_one : dualDerivAction (1 : JetRing) = LinearMap.id := by + refine LinearMap.ext fun x => ?_ + simp [dualDerivAction] + +lemma dualDerivAction_mul (χ ψ : JetRing) : + dualDerivAction (χ * ψ) = dualDerivAction χ ∘ₗ dualDerivAction ψ := by + refine LinearMap.ext fun x => ?_ + simp [dualDerivAction, derivAction_mul] + +@[simp] +lemma dualJetAlgebraEquiv_one : dualJetAlgebraEquiv 1 = 1 := by + rw [show (1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) = + Lorentz.complexCoBasis.symmetricAlgebra 0 from + Lorentz.complexCoBasis.symmetricAlgebra_zero.symm, + dualJetAlgebraEquiv, Module.Basis.equiv_apply] + simpa using Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_zero + +/-- The dual derivative action on the zeroth-order component function: it is + scaled by the value of the jet at the base point, with no derivative + contributions. -/ +@[simp] +lemma dualDerivAction_apply_one (χ : JetRing) : + dualDerivAction χ (1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) = + MvPowerSeries.constantCoeff χ • 1 := by + have h1 : dualJetAlgebraEquiv.symm + (1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) = 1 := by + rw [← dualJetAlgebraEquiv_one, LinearEquiv.symm_apply_apply] + simp [dualDerivAction, h1] + +@[simp] +lemma dualJetAlgebraEquiv_ι (μ : Fin 1 ⊕ Fin 3) : + dualJetAlgebraEquiv (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule + (Lorentz.complexCoBasis μ)) = + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) := by + rw [← Lorentz.complexCoBasis.symmetricAlgebra_single μ, + ← Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_single μ, + dualJetAlgebraEquiv, Module.Basis.equiv_apply, Equiv.refl_apply] + +/-- The dual derivative action on a first-order dual derivative symbol implements + the Leibniz rule, mirroring `derivAction_apply_ι`: the value of the jet + multiplies the symbol, and its first derivative feeds the zeroth-order component + function. -/ +lemma dualDerivAction_apply_ι (χ : JetRing) (μ : Fin 1 ⊕ Fin 3) : + dualDerivAction χ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ)) = + MvPowerSeries.constantCoeff χ • + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) + + MvPowerSeries.coeff (Finsupp.single μ 1) χ • 1 := by + have h1 : dualJetAlgebraEquiv.symm (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ)) = + SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) := by + rw [← dualJetAlgebraEquiv_ι, LinearEquiv.symm_apply_apply] + rw [show dualDerivAction χ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ)) = + dualJetAlgebraEquiv (derivAction χ (dualJetAlgebraEquiv.symm + (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ)))) from rfl, + h1, derivAction_apply_ι, map_add, map_smul, map_smul, dualJetAlgebraEquiv_ι, + dualJetAlgebraEquiv_one] + +@[simp] +lemma dualJetAlgebraEquiv_symmetricAlgebra (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + dualJetAlgebraEquiv (Lorentz.complexCoBasis.symmetricAlgebra m) = + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m := by + rw [dualJetAlgebraEquiv, Module.Basis.equiv_apply, Equiv.refl_apply] + +/-- The dual derivative action on a general monomial of dual derivative symbols: + the all-orders Leibniz rule, mirroring the definition of `derivAction`. Each + splitting `m = p.1 + p.2` contributes the `p.1`-th Taylor coefficient of the + jet, with the divided-power multiplicity, times the lower monomial `p.2`. -/ +lemma dualDerivAction_apply_symmetricAlgebra (χ : JetRing) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + dualDerivAction χ (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = + ∑ p ∈ Finset.antidiagonal m, + ((∏ μ, (m μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 χ • + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra p.2 := by + have h1 : dualJetAlgebraEquiv.symm + (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = + Lorentz.complexCoBasis.symmetricAlgebra m := by + rw [← dualJetAlgebraEquiv_symmetricAlgebra, LinearEquiv.symm_apply_apply] + rw [show dualDerivAction χ (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = + dualJetAlgebraEquiv (derivAction χ (dualJetAlgebraEquiv.symm + (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m))) from rfl, + h1, derivAction, Module.Basis.constr_basis, map_sum] + refine Finset.sum_congr rfl fun p hp => ?_ + rw [map_smul, map_smul, dualJetAlgebraEquiv_symmetricAlgebra] + +/-- The action of the jet gauge group on the dual jet algebra of the + charged-lepton singlet's component functions. Component functions transform + contragrediently to the field, so the hypercharge power series is + `u ^ 6 = (star u ^ 6)⁻¹`, acting through the Leibniz rule on the dual + derivative symbols. -/ +noncomputable def dualJetAlgebraRepJetGaugeGroupI : + Representation ℂ JetGaugeGroupI + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where + toFun U := dualDerivAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) + map_one' := by + rw [show (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = + (1 : JetRing) by simp, dualDerivAction_one] + rfl + map_mul' U₁ U₂ := by + rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = + ((U₁.2.2 : unitary JetRing) : JetRing) ^ 6 * + ((U₂.2.2 : unitary JetRing) : JetRing) ^ 6 by + rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, mul_pow], + dualDerivAction_mul, Module.End.mul_eq_comp] + +/-- The action of the jet gauge group on the dual jet algebra of the conjugate + charged-lepton singlet's component functions: the conjugate components + transform with the conjugate-contragredient hypercharge power series + `star u ^ 6`. -/ +noncomputable def dualJetAlgebraRepJetGaugeGroupIConj : Representation ℂ JetGaugeGroupI - (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonSinglet) where - toFun U := TensorProduct.map (derivAction ((star (U.2.2 : JetRing)) ^ 6)) LinearMap.id + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where + toFun U := dualDerivAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) map_one' := by - rw [show ((star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6) = - (1 : JetRing) by simp, derivAction_one, TensorProduct.map_id] + rw [show (star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = + (1 : JetRing) by simp, dualDerivAction_one] rfl map_mul' U₁ U₂ := by - rw [show ((star (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6) = - ((star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6) * - ((star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6) by + rw [show (star (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = + (star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6 * + (star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6 by rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) from rfl, star_mul', mul_pow], - derivAction_mul, Module.End.mul_eq_comp, ← TensorProduct.map_comp, LinearMap.id_comp] + dualDerivAction_mul, Module.End.mul_eq_comp] @[simp] -lemma repJetGaugeGroupI_apply (U : JetGaugeGroupI) - (x : SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonSinglet) : - repJetGaugeGroupI U x = - TensorProduct.map (derivAction ((star (U.2.2 : JetRing)) ^ 6)) LinearMap.id x := rfl - -/-- The jet action on the zeroth-order (field) symbol: the value of the jet acts by - its hypercharge scalar, with no derivative contributions. -/ -lemma repJetGaugeGroupI_one_tmul (U : JetGaugeGroupI) (l : LeptonSinglet) : - repJetGaugeGroupI U ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) = - MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6) • - ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) := by - rw [repJetGaugeGroupI_apply, TensorProduct.map_tmul, derivAction_apply_one, - TensorProduct.smul_tmul'] - rfl +lemma dualJetAlgebraRepJetGaugeGroupI_apply (U : JetGaugeGroupI) : + dualJetAlgebraRepJetGaugeGroupI U = + dualDerivAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) := rfl + +@[simp] +lemma dualJetAlgebraRepJetGaugeGroupIConj_apply (U : JetGaugeGroupI) : + dualJetAlgebraRepJetGaugeGroupIConj U = + dualDerivAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) := rfl + +/-- The `(1, 1)_{-6}` action of the jet gauge group on the space of component + functions of the charged-lepton singlet, its conjugate, and their derivative + coordinates. The conventions are contragredient, matching the `.dual` and + `.conj.dual` conventions of the global component-space representations: the + singlet components transform through the derivative action of `u ^ 6`, the + conjugate components through the derivative action of `star u ^ 6`, and the + target factors are inert. On jets of constant gauge transformations the + derivative symbols are inert and the action reduces to the dual global gauge + action. -/ +noncomputable def JetComponentSpace.repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI JetComponentSpace := + (dualJetAlgebraRepJetGaugeGroupI.tprod + (Representation.trivial ℂ JetGaugeGroupI (Module.Dual ℂ LeptonSinglet))).prod + (dualJetAlgebraRepJetGaugeGroupIConj.tprod + (Representation.trivial ℂ JetGaugeGroupI (Module.Dual ℂ (ConjModule LeptonSinglet)))) + +/-- The first-order Taylor coefficient of a hypercharge power of a `U(1)` jet: + the analogue of `BBoson.coeff_single_star_pow` for the contragredient character + `u ^ q`, with the sign of the Maurer–Cartan term reversed. -/ +lemma coeff_single_pow (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) : + MvPowerSeries.coeff (Finsupp.single μ 1) ((u : JetRing) ^ q) = + -((q : ℂ) * Complex.I * (BBoson.mcCoeff u μ : ℂ)) * + MvPowerSeries.constantCoeff ((u : JetRing) ^ q) := by + have hmc : BBoson.mcCoeff (star u) μ = - BBoson.mcCoeff u μ := by + have h := BBoson.mcCoeff_mul u (star u) μ + rw [Unitary.star_eq_inv, mul_inv_cancel, BBoson.mcCoeff_one] at h + exact eq_neg_of_add_eq_zero_right h.symm + have h := BBoson.coeff_single_star_pow (star u) μ q + rw [Unitary.coe_star, star_star, hmc] at h + rw [h] + push_cast + ring + +/-! + +## The jet algebra -/-- The jet action on a first-order derivative symbol is the Leibniz rule: - `∂_μ ψ ↦ χ(0) • ∂_μ ψ + (∂_μ χ)(0) • ψ`, where `χ = star u ^ 6` is the - hypercharge power series of the jet. The value of the gauge transformation - multiplies the first-derivative symbol, and its first derivative feeds the field - symbol: this is `∂_μ(g ψ) = g ∂_μ ψ + (∂_μ g) ψ` for the `(1, 1)_{-6}` - character. -/ -lemma repJetGaugeGroupI_ι_tmul (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (l : LeptonSinglet) : - repJetGaugeGroupI U (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) = - MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6) • - (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) + - MvPowerSeries.coeff (Finsupp.single μ 1) ((star (U.2.2 : JetRing)) ^ 6) • - ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) := by - rw [repJetGaugeGroupI_apply, TensorProduct.map_tmul, derivAction_apply_ι, - TensorProduct.add_tmul, TensorProduct.smul_tmul', TensorProduct.smul_tmul'] +-/ + + +abbrev JetAlgebra : Type := ExteriorAlgebra ℂ JetComponentSpace + +namespace JetAlgebra + +/-- The action of the (jet) gauge group on the jet algebra of the lepton singlets. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra where + toFun g := (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' g1 g2 := by + simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +noncomputable def ofGenerator (j : JetGenerators) : JetAlgebra := + ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) + +lemma repJetGaugeGroupI_apply (g : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI g x = + ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g) x := rfl + +/-- The value of the jet of gauge transformations at the base point acts by the + contragredient hypercharge scalar on the zeroth-order singlet generator, with + no derivative contributions. -/ +lemma repJetGaugeGroupI_ofGenerator_ψ_nil (g : JetGaugeGroupI) (α : Fin 2) : + repJetGaugeGroupI g (ofGenerator (.dψ {} α)) = g.eval.2.2 ^ 6 • ofGenerator (.dψ {} α) := by + rw [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.basis_dψ_nil, Submonoid.smul_def] + simp only [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, + Representation.trivial_apply, map_zero, TensorProduct.map_tmul, + dualDerivAction_apply_one, map_pow, ← TensorProduct.smul_tmul', + SubmonoidClass.coe_pow, ← map_smul, Prod.smul_mk, smul_zero] rfl -/-- The first-order Leibniz rule expressed through the B-boson Maurer–Cartan - coefficient: the inhomogeneous term of the charged-lepton-singlet jet is the - hypercharge `6` times the abelian connection shift `i (∂_μ u)(0) ū(0)` of the - `U(1)` jet, times the value of the character. This is the structure of the - covariant derivative: the derivative coordinates of a charged field transform - through the same Maurer–Cartan term that shifts the B boson. -/ -lemma repJetGaugeGroupI_ι_tmul_mcCoeff (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (l : LeptonSinglet) : - repJetGaugeGroupI U - (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) = - MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6) • - (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] l) + - ((6 : ℂ) * Complex.I * (BBoson.mcCoeff U.2.2 μ : ℂ) * - MvPowerSeries.constantCoeff ((star (U.2.2 : JetRing)) ^ 6)) • - ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] l) := by - rw [repJetGaugeGroupI_ι_tmul, BBoson.coeff_single_star_pow] - norm_num - -/-- On jets of constant gauge transformations the jet action reduces to the global - gauge action on the jet space: the `(1, 1)_{-6}` scalar on the target factor and - the trivial action on the derivative symbols. -/ -lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = - TensorProduct.map LinearMap.id (repGaugeGroupI g) := by - have hχ : ((star (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing)) ^ 6) = - MvPowerSeries.C ((star (g.2.2 : ℂ)) ^ 6) := by - rw [show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = - MvPowerSeries.C ((g.2.2 : ℂ)) from rfl, MvPowerSeries.star_C, ← map_pow] - show TensorProduct.map (derivAction _) LinearMap.id = _ - rw [hχ, derivAction_C] - refine LinearMap.ext fun x => ?_ - induction x using TensorProduct.induction_on with - | zero => simp - | tmul p l => - simp only [TensorProduct.map_tmul, LinearMap.smul_apply, LinearMap.id_apply] - rw [show repGaugeGroupI g l = ((star (g.2.2 : ℂ)) ^ 6) • l from rfl, - TensorProduct.smul_tmul] - | add x y hx hy => simp only [map_add]; rw [hx, hy] + +/-- The action of the gauge group on ∂_μ ψ takes it to + g • (∂_μ ψ + 6 i (BBoson.mcCoeff g.2.2 μ) • ψ)-/ +lemma repJetGaugeGroupI_ofGenerator_ψ_singleton (g : JetGaugeGroupI) + (μ : (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI g (ofGenerator (.dψ {μ} α)) = + g.eval.2.2 ^ 6 • ofGenerator (.dψ {μ} α) - + ((6 : ℂ) * Complex.I * (BBoson.mcCoeff g.2.2 μ : ℂ) * (g.eval.2.2 : ℂ) ^ 6) • + ofGenerator (.dψ {} α) := by + have hval : ((g.eval.2.2 : unitary ℂ) : ℂ) = + MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) := rfl + have hcoeff : MvPowerSeries.coeff (Finsupp.single μ 1) + (((g.2.2 : unitary JetRing) : JetRing) ^ 6) = + -((6 : ℂ) * Complex.I * (BBoson.mcCoeff g.2.2 μ : ℂ) * + MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) ^ 6) := by + rw [coeff_single_pow g.2.2 μ 6, map_pow] + push_cast + ring + have hinl : ∀ x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet, + (x, (0 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + LinearMap.inl ℂ _ _ x := fun x => rfl + simp only [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.basis_dψ_singleton, JetComponentSpace.basis_dψ_nil, + JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, + Representation.trivial_apply, map_zero, TensorProduct.map_tmul, + dualDerivAction_apply_ι, hcoeff, TensorProduct.add_tmul, + ← TensorProduct.smul_tmul', Submonoid.smul_def, SubmonoidClass.coe_pow, + hval, map_pow, sub_eq_add_neg, neg_smul] + simp only [hinl, TensorProduct.neg_tmul, ← TensorProduct.smul_tmul', + map_add, map_neg, map_smul] + +/-- The jet gauge action on a general singlet generator: the all-orders Leibniz + rule. A jet of gauge transformations acts on the derivative generator + `∂_s ψ_α` through the Taylor coefficients of its contragredient hypercharge + power series `u ^ 6`: each splitting `s = p.1 + p.2` contributes the `p.1`-th + Taylor coefficient, with the divided-power multiplicity, times the lower + generator `∂_{p.2} ψ_α`. The zeroth- and first-order cases are + `repJetGaugeGroupI_ofGenerator_ψ_nil` and + `repJetGaugeGroupI_ofGenerator_ψ_singleton`. -/ +lemma repJetGaugeGroupI_ofGenerator_ψ (g : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI g (ofGenerator (.dψ s α)) = + ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((g.2.2 : unitary JetRing) : JetRing) ^ 6) • + ofGenerator (.dψ (Finsupp.toMultiset p.2) α) := by + have hinl : ∀ x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet, + (x, (0 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + LinearMap.inl ℂ _ _ x := fun x => rfl + simp only [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.basis_dψ, dualJetAlgebraBasis_apply, Finsupp.toMultiset_toFinsupp, + JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, + Representation.trivial_apply, map_zero, TensorProduct.map_tmul, + dualDerivAction_apply_symmetricAlgebra] + simp only [hinl, TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] + +end JetAlgebra end LeptonSinglet diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 2ae62c7b9..ad5edc49a 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -11,6 +11,10 @@ public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative /-! # The B boson @@ -27,6 +31,30 @@ boson is the B boson formalized here. @[expose] public section +/-! + +## Aa. The formal partial derivative and the coefficientwise star + +The Maurer–Cartan jet series is built from the formal partial derivative +`MvPowerSeries.pderiv`; its hermiticity rests on the fact that the derivative +commutes with the coefficientwise star. + +-/ + +namespace MvPowerSeries + +variable {σ R : Type*} + +/-- The formal partial derivative commutes with the coefficientwise star. -/ +lemma pderiv_star [CommSemiring R] [StarRing R] (ν : σ) (f : MvPowerSeries σ R) : + pderiv R ν (star f) = star (pderiv R ν f) := by + ext s + rw [coeff_pderiv, coeff_star, coeff_star, coeff_pderiv, star_mul'] + congr 1 + simp + +end MvPowerSeries + namespace StandardModel open TensorProduct @@ -273,6 +301,225 @@ lemma ofConstant_smul (g : GaugeGroupI) (B : BBoson) : simp [mcBBoson, hmc] rw [h0, add_zero] +/-! + +## The Maurer–Cartan jet series + +The local gauge transformation of the B-boson field is the translation +`B_μ ↦ B_μ + i (∂_μ u) ū`, so a jet of gauge transformations shifts every +derivative coordinate `∂_s B_μ` of the field by the corresponding derivative +`∂_s (i ∂_μ u ū)(0)` of the Maurer–Cartan form at the base point. The +Maurer–Cartan coefficient `mcCoeff` records only the zeroth of these shifts — +enough for the action on the field itself, but not for the action on its jets. + +To express the shift of every derivative coordinate uniformly we define here the +full jet of the Maurer–Cartan form of a `U(1)` jet: the formal power series +`i (∂_ν u) ū`, whose value at the base point is `mcCoeff` and whose higher Taylor +coefficients are the higher shifts. Its coefficients are hermitian, and it is +additive in the jet; these two facts make the induced shift of the B-boson +component functions a real-valued cocycle, which is what turns the substitution +`B ↦ B + i (∂u) ū` into a representation of the jet gauge group on the jet +algebra below. + +-/ + +/-- The Maurer–Cartan power series of a jet of a `U(1)` gauge transformation in + the spacetime direction `ν`: the formal power series `i (∂_ν u) ū`, whose + constant coefficient is the Maurer–Cartan coefficient `mcCoeff`. -/ +noncomputable def mcSeries (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : JetRing := + (MvPowerSeries.C Complex.I : JetRing) * (pderiv ℂ ν (u : JetRing) * star (u : JetRing)) + +@[simp] +lemma mcSeries_one (ν : Fin 1 ⊕ Fin 3) : mcSeries 1 ν = 0 := by + simp [mcSeries] + +/-- The Maurer–Cartan series is additive in the jet: the abelian cocycle identity + at the level of full jets. -/ +lemma mcSeries_mul (u v : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : + mcSeries (u * v) ν = mcSeries u ν + mcSeries v ν := by + have hu : (u : JetRing) * star (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).2 + have hv : (v : JetRing) * star (v : JetRing) = 1 := (Unitary.mem_iff.mp v.2).2 + simp only [mcSeries, MulMemClass.coe_mul, Derivation.leibniz, smul_eq_mul, star_mul', + ← mul_add] + congr 1 + linear_combination (pderiv ℂ ν (u : JetRing) * star (u : JetRing)) * hv + + (pderiv ℂ ν (v : JetRing) * star (v : JetRing)) * hu + +/-- The Maurer–Cartan series is hermitian: `star (i (∂_ν u) ū) = i (∂_ν u) ū`, + by differentiating the unitarity relation `u ū = 1`. All its Taylor + coefficients are therefore real. -/ +lemma star_mcSeries (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : + star (mcSeries u ν) = mcSeries u ν := by + have hu : (u : JetRing) * star (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).2 + have h0 : pderiv ℂ ν ((u : JetRing) * star (u : JetRing)) = 0 := by + rw [hu, pderiv_one] + rw [Derivation.leibniz] at h0 + simp only [smul_eq_mul] at h0 + have hq : pderiv ℂ ν (star (u : JetRing)) * (u : JetRing) = + -(pderiv ℂ ν (u : JetRing) * star (u : JetRing)) := by + linear_combination h0 + rw [mcSeries, star_mul', star_C, star_mul', star_star, ← pderiv_star, hq, + show (star Complex.I) = -Complex.I by simp, map_neg, neg_mul, mul_neg, neg_neg] + +/-- The Taylor coefficients of the Maurer–Cartan series, as hermitian scalars. -/ +noncomputable def mcSeriesCoeff (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : selfAdjoint ℂ := + ⟨coeff m (mcSeries u ν), by + rw [selfAdjoint.mem_iff, ← coeff_star, star_mcSeries]⟩ + +@[simp] +lemma mcSeriesCoeff_one (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + mcSeriesCoeff 1 ν m = 0 := by + apply Subtype.ext + simp [mcSeriesCoeff] + +/-- The Taylor coefficients of the Maurer–Cartan series are additive in the jet. -/ +lemma mcSeriesCoeff_mul (u v : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + mcSeriesCoeff (u * v) ν m = mcSeriesCoeff u ν m + mcSeriesCoeff v ν m := by + apply Subtype.ext + simp [mcSeriesCoeff, mcSeries_mul] + +/-- The zeroth Taylor coefficient of the Maurer–Cartan series is the + Maurer–Cartan coefficient. -/ +lemma mcSeriesCoeff_zero (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : + mcSeriesCoeff u ν 0 = mcCoeff u ν := by + apply Subtype.ext + show coeff 0 (mcSeries u ν) = _ + rw [mcSeries, coeff_zero_eq_constantCoeff, map_mul, map_mul, constantCoeff_C, + show constantCoeff (pderiv ℂ ν (u : JetRing)) = + coeff (Finsupp.single ν (1 : ℕ)) (u : JetRing) from by + rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] + simp, + constantCoeff_star, ← mul_assoc] + rfl + +/-! + +## The Jet component vector space + +-/ + +abbrev JetComponentSpace := + SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) ⊗[ℝ] Module.Dual ℝ BBoson + +/-! + +## The Maurer–Cartan shift of the component functions + +-/ + +open LagrangianTheory + +/-- The Maurer–Cartan jet of a `U(1)` jet evaluated on the derivative symbols: + the basis monomial of dual derivative symbols at the multi-index `m` is sent to + the B-boson-valued `m`-th derivative of the Maurer–Cartan series at the base + point. This is the amount by which the corresponding derivative coordinate of + the B boson is shifted under the jet gauge transformation. -/ +noncomputable def mcJet (u : unitary JetRing) : + SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) →ₗ[ℝ] BBoson := + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => + ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] + ((∏ μ, Nat.factorial (m μ)) • mcSeriesCoeff u ν m)⟩ + +@[simp] +lemma mcJet_one : mcJet 1 = 0 := by + refine Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.ext fun m => ?_ + rw [mcJet, Module.Basis.constr_basis] + apply BBoson.ext + simp + +/-- The Maurer–Cartan jet is additive in the jet: the abelian cocycle identity + for the shift of the component functions. -/ +lemma mcJet_mul (u v : unitary JetRing) : mcJet (u * v) = mcJet u + mcJet v := by + refine Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.ext fun m => ?_ + rw [LinearMap.add_apply, mcJet, mcJet, mcJet, Module.Basis.constr_basis, + Module.Basis.constr_basis, Module.Basis.constr_basis] + apply BBoson.ext + simp [mcSeriesCoeff_mul, smul_add, TensorProduct.tmul_add, Finset.sum_add_distrib] + +/-- The Maurer–Cartan pairing: the amount by which a component function of the + B-boson jet is shifted under a jet gauge transformation, i.e. the evaluation of + the component function against the Maurer–Cartan jet. -/ +noncomputable def mcPairing (u : unitary JetRing) : JetComponentSpace →ₗ[ℝ] ℝ := + TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp (mcJet u)) + +@[simp] +lemma mcPairing_tmul (u : unitary JetRing) + (p : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) + (φ : Module.Dual ℝ BBoson) : + mcPairing u (p ⊗ₜ[ℝ] φ) = φ (mcJet u p) := rfl + +@[simp] +lemma mcPairing_one : mcPairing 1 = 0 := by + refine TensorProduct.ext' fun p φ => ?_ + simp + +/-- The Maurer–Cartan pairing is additive in the jet. -/ +lemma mcPairing_mul (u v : unitary JetRing) : + mcPairing (u * v) = mcPairing u + mcPairing v := by + refine TensorProduct.ext' fun p φ => ?_ + simp [mcJet_mul] + +/-! + +## The jet algebra and the jet gauge action + +-/ + +/-- The jet algebra of the B boson: the commutative algebra generated by the + component functions of the B-boson field and its derivative coordinates. -/ +abbrev JetAlgebra : Type := SymmetricAlgebra ℝ JetComponentSpace + +namespace JetAlgebra + +/-- The action of the jet gauge group on the jet algebra of the B boson. The + adjoint action is trivial and the local gauge action is the Maurer–Cartan + translation, whose linear part is the identity; consequently no information is + carried by a linear action on the component space itself, and the action lives + on the unital algebra: a jet of gauge transformations acts as the substitution + automorphism sending each generator `x` to `x + ⟨mc, x⟩ 1`, the pullback of the + translation `B ↦ B + i (∂u) ū` on polynomial functions of the jet + coordinates. On jets of constant gauge transformations the shift vanishes and + the action is trivial, in agreement with `repGaugeGroupI`. -/ +noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgebra where + toFun U := (SymmetricAlgebra.lift + ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)).toLinearMap + map_one' := by + rw [show mcPairing (1 : JetGaugeGroupI).2.2 = 0 from mcPairing_one] + suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = + AlgHom.id ℝ JetAlgebra by + rw [hs] + rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp + map_mul' U V := by + rw [show mcPairing (U * V : JetGaugeGroupI).2.2 = + mcPairing U.2.2 + mcPairing V.2.2 from mcPairing_mul U.2.2 V.2.2] + suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (mcPairing U.2.2 + mcPairing V.2.2)) = + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)).comp + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing V.2.2)) by + rw [hs, AlgHom.comp_toLinearMap, Module.End.mul_eq_comp] + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [add_assoc] + +/-- The jet gauge action on a generator of the jet algebra: the Maurer–Cartan + shift by the pairing of the component function with the Maurer–Cartan jet. -/ +@[simp] +lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : + repJetGaugeGroupI U (SymmetricAlgebra.ι ℝ JetComponentSpace x) = + SymmetricAlgebra.ι ℝ JetComponentSpace x + + algebraMap ℝ JetAlgebra (mcPairing U.2.2 x) := by + simp [repJetGaugeGroupI, SymmetricAlgebra.lift_ι_apply, AlgHom.toLinearMap_apply, + Algebra.linearMap_apply] + +end JetAlgebra + end BBoson end StandardModel From c640ed06e5c345488c35f031a3c5c3ab332ca0fc Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 08:30:31 +0100 Subject: [PATCH 082/254] feat: Add QED --- Physlib/Particles/QED/JetAlgebra.lean | 89 +++++++++++++++++++ .../StandardModel/GaugeBosons/BBoson.lean | 57 +++++++++++- 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 Physlib/Particles/QED/JetAlgebra.lean diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean new file mode 100644 index 000000000..a86f538a2 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson +public import Mathlib.RingTheory.TensorProduct.Basic +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson +/-! +# Jet algebra for quantum electrodynamics + +## i. Overview + +The jet algebra of quantum electrodynamics: the algebra generated by the component +functions of the photon-like `U(1)` gauge boson (the B boson) and the charged +lepton, together with all their derivative coordinates. It is the tensor product of +the complexified B-boson jet algebra (a symmetric algebra, complexified so it can +be paired with the complex fermionic factor) and the charged-lepton jet algebra +(an exterior algebra). + +The jet gauge group acts on each factor — by Maurer–Cartan substitutions on the +B-boson component functions, and linearly through the hypercharge character and its +derivatives on the lepton component functions — and hence on the full QED jet +algebra by the tensor product of the two actions. + +-/ + +@[expose] public section + +namespace QED +open TensorProduct StandardModel + +inductive JetGenerators where + | dB (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetGenerators + | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators + | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators + +abbrev JetAlgebra := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (LeptonSinglet.JetAlgebra) + +namespace JetAlgebra + +/-! + +## A. Elements associated with the generators + +-/ + +noncomputable def ofGenerator (s : JetGenerators) : JetAlgebra := + match s with + | JetGenerators.dB s μ => + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 + | JetGenerators.dψ s α => + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) + | JetGenerators.dbarψ s α => + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) + +scoped notation "[" s "]ₐ" => ofGenerator s + +/-! + +## B. Representations of the group + +-/ + +/-- The representation of the jet gauge group on the QED jet algebra: the + Maurer–Cartan substitution action on the (complexified) B-boson factor tensored + with the hypercharge action on the charged-lepton factor. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := + BBoson.JetAlgebra.complexRepJetGaugeGroupI.tprod LeptonSinglet.JetAlgebra.repJetGaugeGroupI + +lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ₜ[ℂ] l) = + (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl + + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index ad5edc49a..068b6b547 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -73,7 +73,7 @@ structure BBoson where val : Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ namespace BBoson - +open Module /-! ## B. Linear structure @@ -109,6 +109,13 @@ lemma val_smul (r : ℝ) (d : BBoson) : (r • d).val = r • d.val := rfl @[simp] lemma val_zero : (0 : BBoson).val = 0 := rfl +/-- The basis of the B-boson field indexed by the Lorentz index: the standard + Lorentz-vector basis tensored with the hermitian unit of the one-dimensional + adjoint factor. -/ +noncomputable def basis : Basis (Fin 1 ⊕ Fin 3) ℝ BBoson := + ((Lorentz.Vector.basis.tensorProduct + ((Module.Basis.singleton Unit ℝ).map Complex.selfAdjointEquiv.symm)).map + valLinEquiv.symm).reindex (Equiv.prodPUnit (Fin 1 ⊕ Fin 3)) /-! ## C. Lorentz action @@ -400,9 +407,34 @@ lemma mcSeriesCoeff_zero (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : -/ +open Module +inductive JetGenerators where + | dB (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3): JetGenerators +deriving DecidableEq + +def JetGenerators.equiv : JetGenerators ≃ Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) where + toFun + | JetGenerators.dB s μ => (s, μ) + invFun + | (s, μ) => JetGenerators.dB s μ + left_inv := by + intro x + cases x + rfl + right_inv := by + intro x + cases x + rfl + abbrev JetComponentSpace := SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) ⊗[ℝ] Module.Dual ℝ BBoson +/-- The basis of the B-boson jet component space indexed by the jet generators + `∂_s B_μ`: the multiset basis of the dual derivative symbols tensored with the + dual of the B-boson basis. -/ +noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponentSpace := + (LagrangianTheory.dualRealJetAlgebraBasis.tensorProduct + BBoson.basis.dualBasis).reindex JetGenerators.equiv.symm /-! ## The Maurer–Cartan shift of the component functions @@ -518,6 +550,29 @@ lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : simp [repJetGaugeGroupI, SymmetricAlgebra.lift_ι_apply, AlgHom.toLinearMap_apply, Algebra.linearMap_apply] + +/-- The action of the jet gauge group on the complexified B-boson jet algebra, + obtained from the real representation by extension of scalars. -/ +noncomputable def complexRepJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (ℂ ⊗[ℝ] BBoson.JetAlgebra) where + toFun U := LinearMap.baseChange ℂ (BBoson.JetAlgebra.repJetGaugeGroupI U) + map_one' := by + ext x + simp [Module.End.one_eq_id] + map_mul' U V := by + ext x + simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] + +noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := + SymmetricAlgebra.ι ℝ JetComponentSpace (BBoson.JetComponentSpace.basis x) + +/-! + +## The field strength of the B boson + +-/ + + end JetAlgebra end BBoson From 7f374760ad563fe01b65e327ad19ded46ac6d136 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 08:46:58 +0100 Subject: [PATCH 083/254] feat: Prove action on fieldstrengths Co-Authored-By: Claude --- .../StandardModel/GaugeBosons/BBoson.lean | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 068b6b547..62b61cb64 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -116,6 +116,32 @@ noncomputable def basis : Basis (Fin 1 ⊕ Fin 3) ℝ BBoson := ((Lorentz.Vector.basis.tensorProduct ((Module.Basis.singleton Unit ℝ).map Complex.selfAdjointEquiv.symm)).map valLinEquiv.symm).reindex (Equiv.prodPUnit (Fin 1 ⊕ Fin 3)) + +/-- The B-boson basis vector as an explicit tensor: the Lorentz basis vector paired + with the hermitian unit. -/ +lemma basis_apply (ν : Fin 1 ⊕ Fin 3) : + (basis ν : BBoson) = + ⟨Lorentz.Vector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ := by + rw [basis, Module.Basis.reindex_apply, Module.Basis.map_apply, + Module.Basis.tensorProduct_apply', Module.Basis.map_apply, + Module.Basis.singleton_apply, valLinEquiv_symm_apply] + rfl + +/-- A pure tensor of a Lorentz basis vector with a hermitian value is a multiple of + the corresponding B-boson basis vector. -/ +lemma mk_tmul_eq_smul_basis (ν : Fin 1 ⊕ Fin 3) (x : selfAdjoint ℂ) : + (⟨Lorentz.Vector.basis ν ⊗ₜ[ℝ] x⟩ : BBoson) = + Complex.selfAdjointEquiv x • basis ν := by + apply BBoson.ext + rw [val_smul, basis_apply, + show ((⟨Lorentz.Vector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ : BBoson)).val = + Lorentz.Vector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from rfl, + ← TensorProduct.tmul_smul] + congr 1 + rw [show (Complex.selfAdjointEquiv x) • (Complex.selfAdjointEquiv.symm 1) = + Complex.selfAdjointEquiv.symm (Complex.selfAdjointEquiv x • 1) from + (map_smul _ _ _).symm, smul_eq_mul, mul_one, LinearEquiv.symm_apply_apply] + rfl /-! ## C. Lorentz action @@ -401,6 +427,59 @@ lemma mcSeriesCoeff_zero (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : constantCoeff_star, ← mul_assoc] rfl +/-- The first-order Taylor coefficients of the Maurer–Cartan series are symmetric + in the two spacetime directions: the shift of `∂_μ B_ν` equals the shift of + `∂_ν B_μ`. This is the gauge invariance of the abelian field strength, and rests + on unitarity: the antisymmetric part `∂_νu ∂_μū - ∂_μu ∂_νū` vanishes because + `∂ū = -ū (∂u) ū`. -/ +lemma mcSeriesCoeff_single_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) : + mcSeriesCoeff u ν (Finsupp.single μ 1) = mcSeriesCoeff u μ (Finsupp.single ν 1) := by + rcases eq_or_ne μ ν with rfl | hμν + · rfl + apply Subtype.ext + show coeff (Finsupp.single μ 1) (mcSeries u ν) = coeff (Finsupp.single ν 1) (mcSeries u μ) + have hb : constantCoeff (u : JetRing) * star (constantCoeff (u : JetRing)) = 1 := by + have h := congrArg constantCoeff (Unitary.mem_iff.mp u.2).2 + rwa [map_mul, constantCoeff_star, map_one] at h + have hμ := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp u.2).2 + rw [coeff_single_one_mul, coeff_star, constantCoeff_star, + show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hμ + have hν := congrArg (coeff (Finsupp.single ν 1)) (Unitary.mem_iff.mp u.2).2 + rw [coeff_single_one_mul, coeff_star, constantCoeff_star, + show coeff (Finsupp.single ν 1) (1 : JetRing) = 0 by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hν + have hσμ : star (coeff (Finsupp.single μ 1) (u : JetRing)) = + -(coeff (Finsupp.single μ 1) (u : JetRing) * star (constantCoeff (u : JetRing)) * + star (constantCoeff (u : JetRing))) := by + linear_combination star (constantCoeff (u : JetRing)) * hμ - + star (coeff (Finsupp.single μ 1) (u : JetRing)) * hb + have hσν : star (coeff (Finsupp.single ν 1) (u : JetRing)) = + -(coeff (Finsupp.single ν 1) (u : JetRing) * star (constantCoeff (u : JetRing)) * + star (constantCoeff (u : JetRing))) := by + linear_combination star (constantCoeff (u : JetRing)) * hν - + star (coeff (Finsupp.single ν 1) (u : JetRing)) * hb + rw [mcSeries, mcSeries, + show ((C Complex.I : JetRing)) = algebraMap ℂ JetRing Complex.I from rfl, + ← Algebra.smul_def, ← Algebra.smul_def, map_smul, map_smul, smul_eq_mul, smul_eq_mul, + coeff_single_one_mul, coeff_single_one_mul, coeff_pderiv, coeff_pderiv, + coeff_star, coeff_star, constantCoeff_star, + show constantCoeff (pderiv ℂ ν (u : JetRing)) = + coeff (Finsupp.single ν (1 : ℕ)) (u : JetRing) from by + rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] + simp, + show constantCoeff (pderiv ℂ μ (u : JetRing)) = + coeff (Finsupp.single μ (1 : ℕ)) (u : JetRing) from by + rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] + simp, + show (Finsupp.single μ 1) ν = 0 from Finsupp.single_eq_of_ne hμν.symm, + show (Finsupp.single ν 1) μ = 0 from Finsupp.single_eq_of_ne hμν, + show Finsupp.single ν (1 : ℕ) + Finsupp.single μ 1 = + Finsupp.single μ 1 + Finsupp.single ν 1 from add_comm _ _, + hσμ, hσν] + push_cast + ring + /-! ## The Jet component vector space @@ -493,6 +572,65 @@ lemma mcPairing_mul (u v : unitary JetRing) : refine TensorProduct.ext' fun p φ => ?_ simp [mcJet_mul] +/-- The multiset basis of the dual derivative symbols at a singleton, as a basis + vector of the symmetric algebra at a single multi-index. -/ +lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : + LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Finsupp.single μ 1) := by + rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] + congr 1 + exact Multiset.toFinsupp_singleton μ + +/-- The Maurer–Cartan jet on a first-order derivative symbol: the B boson whose + `ν`-th component is the first-order Taylor coefficient of the Maurer–Cartan + series. -/ +lemma mcJet_singleton (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : + mcJet u (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] + (mcSeriesCoeff u ν (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ := by + rw [dualRealJetAlgebraBasis_singleton, mcJet, Module.Basis.constr_basis] + apply BBoson.ext + show (∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] + ((∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) • + mcSeriesCoeff u ν (Finsupp.single μ 1))) = _ + rw [show (∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) = 1 from + Finset.prod_eq_one fun ρ _ => by + rcases eq_or_ne μ ρ with rfl | h + · simp + · rw [Finsupp.single_eq_of_ne h.symm] + rfl] + simp + +/-- The jet component basis vector at a generator, as a pure tensor. -/ +lemma jetComponentSpace_basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) : + JetComponentSpace.basis (.dB s ρ) = + LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] BBoson.basis.dualBasis ρ := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, Equiv.symm_symm] + exact Module.Basis.tensorProduct_apply' _ _ _ + +/-- The Maurer–Cartan pairing on first-order generators: the shift of the component + function `∂_μ B_ν` is the first-order Taylor coefficient of the Maurer–Cartan + series. -/ +lemma mcPairing_basis_dB (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) : + mcPairing u (JetComponentSpace.basis (.dB {μ} ν)) = + Complex.selfAdjointEquiv (mcSeriesCoeff u ν (Finsupp.single μ 1)) := by + rw [jetComponentSpace_basis_dB, mcPairing_tmul, mcJet_singleton, + show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + (mcSeriesCoeff u ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = + ∑ ν', Complex.selfAdjointEquiv (mcSeriesCoeff u ν' (Finsupp.single μ 1)) • + basis ν' from by + rw [show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + (mcSeriesCoeff u ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = + valLinEquiv.symm (∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + (mcSeriesCoeff u ν' (Finsupp.single μ 1) : selfAdjoint ℂ)) from rfl, map_sum] + exact Finset.sum_congr rfl fun ν' _ => by + rw [valLinEquiv_symm_apply, mk_tmul_eq_smul_basis], + map_sum] + simp only [map_smul, Module.Basis.dualBasis_apply_self, smul_eq_mul, mul_ite, + mul_one, mul_zero] + rw [Finset.sum_ite_eq' Finset.univ ν] + simp + /-! ## The jet algebra and the jet gauge action @@ -563,6 +701,12 @@ noncomputable def complexRepJetGaugeGroupI : ext x simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] +/-! + +## Constructing elements of the jet algebra from the generators + +-/ + noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := SymmetricAlgebra.ι ℝ JetComponentSpace (BBoson.JetComponentSpace.basis x) @@ -572,6 +716,28 @@ noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := -/ +/-- The field strength of the B boson: the antisymmetrized derivative of the + component functions, which is gauge-invariant. -/ +noncomputable def fieldStrength (μ ν : Fin 1 ⊕ Fin 3) : BBoson.JetAlgebra := + ofGenerator (JetGenerators.dB {μ} ν) - ofGenerator (JetGenerators.dB {ν} μ) + +lemma fieldStrength_antisymm (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength μ ν = -fieldStrength ν μ := by + simp [fieldStrength] + +lemma repJetGaugeGroupI_fieldStrength (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (fieldStrength μ ν) = fieldStrength μ ν := by + simp only [fieldStrength, map_sub, ofGenerator, repJetGaugeGroupI_ι, mcPairing_basis_dB] + rw [mcSeriesCoeff_single_symm] + abel + +/-! + +## Invariance under the gauge group + +-/ + +lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : end JetAlgebra From 510c64a4dd175c84eb42065c4523760085b3daeb Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 09:50:41 +0100 Subject: [PATCH 084/254] feat: Add proof of repJetGaugeGroupI_apply_eq_self_iff_mem Co-Authored-By: Claude --- Physlib.lean | 2 + .../Mathematics/MvPolynomialTranslation.lean | 156 ++++ .../StandardModel/GaugeBosons/BBoson.lean | 742 ++++++++++++++++++ .../StandardModel/GaugeGroup/Jet.lean | 15 +- 4 files changed, 910 insertions(+), 5 deletions(-) create mode 100644 Physlib/Mathematics/MvPolynomialTranslation.lean diff --git a/Physlib.lean b/Physlib.lean index 7d0fe574a..f2664b8d8 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -121,6 +121,8 @@ public import Physlib.Mathematics.LinearPMap public import Physlib.Mathematics.List public import Physlib.Mathematics.List.InsertIdx public import Physlib.Mathematics.List.InsertionSort +public import Physlib.Mathematics.MvPolynomialTranslation +public import Physlib.Mathematics.MvPowerSeriesDerivative public import Physlib.Mathematics.OrthogonalMatrix public import Physlib.Mathematics.PiTensorProduct public import Physlib.Mathematics.RatComplexNum diff --git a/Physlib/Mathematics/MvPolynomialTranslation.lean b/Physlib/Mathematics/MvPolynomialTranslation.lean new file mode 100644 index 000000000..4bb37e451 --- /dev/null +++ b/Physlib/Mathematics/MvPolynomialTranslation.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 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 Mathlib.Algebra.MvPolynomial.Funext +public import Mathlib.Algebra.MvPolynomial.Monad +public import Mathlib.Algebra.MvPolynomial.Supported +/-! +# Polynomials invariant under fiberwise translations of variables + +Let `π` be an idempotent map on the index type of a multivariate polynomial ring +over an infinite integral domain, thought of as assigning to each variable a +canonical representative of its fiber. A polynomial that is invariant under +simultaneously translating, for each fiber, all the variables in that fiber by a +common constant is a polynomial in the differences `X i - X (π i)`. + +This is the algebraic heart of the statement that the gauge-invariant elements of +the jet algebra of an abelian gauge boson are generated by the derivatives of the +field strength: the Maurer–Cartan shift translates all jet coordinates with the +same symmetrized multi-index by a common amount, and the differences of such +coordinates are the derivatives of the field strength. + +-/ + +@[expose] public section + +namespace MvPolynomial + +variable {R : Type*} [CommRing R] [IsDomain R] [Infinite R] +variable {I : Type*} [DecidableEq I] + +omit [IsDomain R] [Infinite R] [DecidableEq I] in +/-- Evaluation of a substitution of a multivariate polynomial: substitution followed + by evaluation is evaluation at the evaluated substituents. -/ +lemma eval_aeval (x : I → R) (g : I → MvPolynomial I R) (p : MvPolynomial I R) : + eval x (aeval g p) = eval (fun i => eval x (g i)) p := by + induction p using MvPolynomial.induction_on with + | C a => simp + | add p q hp hq => simp only [map_add, hp, hq] + | mul_X p i hp => simp only [map_mul, aeval_X, hp, eval_X] + +/-- A polynomial invariant under all translations of a fixed variable is unchanged + by setting that variable to zero. -/ +lemma aeval_update_zero_eq_of_forall_aeval_add_eq (Q : MvPolynomial I R) (j : I) + (hQ : ∀ r : R, aeval (fun i => X i + C (if i = j then r else 0)) Q = Q) : + aeval (fun i => if i = j then 0 else X i) Q = Q := by + refine MvPolynomial.funext fun x => ?_ + have h := congrArg (eval x) (hQ (-(x j))) + rw [eval_aeval] at h + rw [eval_aeval] + have hpt : (fun i => eval x ((if i = j then 0 else X i) : MvPolynomial I R)) = + fun i => eval x (X i + C (if i = j then -(x j) else 0)) := by + funext i + by_cases hi : i = j + · simp [hi] + · simp [hi] + rw [hpt] + exact h + +/-- A polynomial invariant under all translations of a fixed variable does not + involve that variable. -/ +lemma notMem_vars_of_forall_aeval_add_eq (Q : MvPolynomial I R) (j : I) + (hQ : ∀ r : R, aeval (fun i => X i + C (if i = j then r else 0)) Q = Q) : + j ∉ Q.vars := by + intro hjv + have h2 := vars_bind₁ (fun i => if i = j then 0 else X i) Q + (by rw [show bind₁ (fun i => if i = j then (0 : MvPolynomial I R) else X i) Q = + aeval (fun i => if i = j then 0 else X i) Q from rfl, + aeval_update_zero_eq_of_forall_aeval_add_eq Q j hQ] + exact hjv) + obtain ⟨i, hiQ, hji⟩ := Finset.mem_biUnion.mp h2 + by_cases hij : i = j + · rw [if_pos hij, vars_0] at hji + simp at hji + · rw [if_neg hij, vars_X] at hji + exact hij (Finset.mem_singleton.mp hji).symm + +/-- A multivariate polynomial over an infinite integral domain that is invariant + under simultaneously translating, for every fiber of an idempotent map `π` on the + variables, all the variables in that fiber by a common constant, is a polynomial + in the differences `X i - X (π i)`. -/ +theorem mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq (π : I → I) + (hπ : ∀ i, π (π i) = π i) (P : MvPolynomial I R) + (hP : ∀ (i₀ : I) (r : R), + aeval (fun i => X i + C (if π i = π i₀ then r else 0)) P = P) : + P ∈ Algebra.adjoin R (Set.range fun i => (X i - X (π i) : MvPolynomial I R)) := by + have hcompHom : (aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i - X (π i))).comp + (aeval (fun i => if π i = i then (X i : MvPolynomial I R) else X i + X (π i))) = + AlgHom.id R (MvPolynomial I R) := by + apply algHom_ext + intro i + simp only [AlgHom.comp_apply, aeval_X, AlgHom.id_apply] + by_cases hi : π i = i + · rw [if_pos hi, aeval_X, if_pos hi] + · rw [if_neg hi, map_add, aeval_X, aeval_X, if_neg hi, if_pos (hπ i)] + ring + have hcomp : ∀ p : MvPolynomial I R, + aeval (fun i => if π i = i then (X i : MvPolynomial I R) else X i - X (π i)) + (aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i + X (π i)) p) = p := by + intro p + have h := DFunLike.congr_fun hcompHom p + simpa using h + have hQtrans : ∀ (j : I), π j = j → ∀ (r : R), + aeval (fun i => (X i + C (if i = j then r else 0) : MvPolynomial I R)) + (aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i + X (π i)) P) = + aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i + X (π i)) P := by + intro j hj r + have hkey : (aeval (fun i => X i + C (if i = j then r else 0))).comp + (aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i + X (π i))) = + (aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i + X (π i))).comp + (aeval (fun i => X i + C (if π i = π j then r else 0))) := by + apply algHom_ext + intro i + simp only [AlgHom.comp_apply, aeval_X] + by_cases hi : π i = i + · rw [if_pos hi] + simp only [map_add, aeval_X, aeval_C, algebraMap_eq] + rw [if_pos hi, if_congr (show (i = j) ↔ (π i = π j) from + ⟨fun h => by rw [h], fun h => by rw [← hi, h, hj]⟩) rfl rfl] + · rw [if_neg hi] + simp only [map_add, aeval_X, aeval_C, algebraMap_eq] + rw [if_neg hi, if_neg (show ¬i = j from fun h => hi (by rw [h, hj])), + if_congr (show (π i = j) ↔ (π i = π j) from by rw [hj]) rfl rfl, C_0] + ring + have h1 := DFunLike.congr_fun hkey P + simp only [AlgHom.comp_apply] at h1 + rw [hP j r] at h1 + exact h1 + have hQsupp : aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i + X (π i)) P ∈ + supported R {i : I | π i ≠ i} := by + refine mem_supported.mpr fun j hj => ?_ + intro hjfix + exact notMem_vars_of_forall_aeval_add_eq _ j (hQtrans j hjfix) (Finset.mem_coe.mp hj) + rw [supported_eq_adjoin_X] at hQsupp + have hmem : P ∈ (Algebra.adjoin R (X '' {i : I | π i ≠ i})).map + (aeval (fun i => if π i = i then (X i : MvPolynomial I R) + else X i - X (π i))) := + Subalgebra.mem_map.mpr ⟨_, hQsupp, hcomp P⟩ + rw [AlgHom.map_adjoin] at hmem + refine Algebra.adjoin_mono ?_ hmem + rintro _ ⟨_, ⟨i, hi, rfl⟩, rfl⟩ + refine ⟨i, ?_⟩ + simp only [aeval_X] + rw [if_neg (Set.mem_setOf.mp hi)] + +end MvPolynomial diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 62b61cb64..f5f175be9 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -15,6 +15,7 @@ public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Particles.LagrangianTheory.Basic public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation /-! # The B boson @@ -53,6 +54,271 @@ lemma pderiv_star [CommSemiring R] [StarRing R] (ν : σ) (f : MvPowerSeries σ congr 1 simp +/-- Formal partial derivatives commute. -/ +lemma pderiv_comm [CommSemiring R] (μ ν : σ) (f : MvPowerSeries σ R) : + pderiv R μ (pderiv R ν f) = pderiv R ν (pderiv R μ f) := by + classical + ext s + rw [coeff_pderiv, coeff_pderiv, coeff_pderiv, coeff_pderiv, + show s + Finsupp.single μ 1 + Finsupp.single ν 1 = + s + Finsupp.single ν 1 + Finsupp.single μ 1 from by + rw [add_assoc, add_assoc, add_comm (Finsupp.single μ 1)]] + rcases eq_or_ne μ ν with rfl | h + · rfl + · rw [Finsupp.add_apply, Finsupp.add_apply, Finsupp.single_eq_of_ne h.symm, + Finsupp.single_eq_of_ne h] + push_cast + ring + +/-! + +## Ab. The exponential of a monomial + +The gauge invariants of the B-boson jet algebra are computed below by realizing +arbitrary translations of the jet coordinates through explicit local `U(1)` gauge +transformations. These are the formal exponentials `exp (c X^w)` of a single +monomial, defined here coefficientwise; the exponential property +`exp(c X^w) exp(c' X^w) = exp((c + c') X^w)` gives unitarity for imaginary `c`, +and the chain rule gives their Maurer–Cartan series. + +-/ + +section ExpMonomial + +variable {K : Type*} [Field K] [CharZero K] {w : σ →₀ ℕ} + +open Classical in +/-- The formal exponential of `c` times the monomial with exponent `w`: the power + series `∑ₙ (cⁿ/n!) X^{n w}`, defined coefficientwise. -/ +noncomputable def expMonomial (c : K) (w : σ →₀ ℕ) : MvPowerSeries σ K := + fun k => if h : ∃ n : ℕ, k = n • w then c ^ h.choose / (h.choose.factorial : K) else 0 + +/-- A nonzero exponent has a coordinate at which it is nonzero. -/ +lemma exists_apply_ne_zero_of_ne_zero (hw : w ≠ 0) : ∃ ρ, w ρ ≠ 0 := by + obtain ⟨ρ, hρ⟩ := Finsupp.ne_iff.mp hw + exact ⟨ρ, by simpa using hρ⟩ + +/-- Multiples of a nonzero exponent determine the multiplier. -/ +lemma nsmul_right_cancel (hw : w ≠ 0) {n m : ℕ} (h : n • w = m • w) : n = m := by + obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw + have h' := DFunLike.congr_fun h ρ + simp only [Finsupp.smul_apply, smul_eq_mul] at h' + exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) h' + +omit [CharZero K] in +/-- The Taylor coefficient of the exponential of a monomial at a multiple of the + exponent. -/ +lemma coeff_expMonomial_nsmul (hw : w ≠ 0) (c : K) (n : ℕ) : + coeff (n • w) (expMonomial c w) = c ^ n / (n.factorial : K) := by + have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ + rw [coeff_apply] + simp only [expMonomial] + rw [dif_pos h, show h.choose = n from (nsmul_right_cancel hw h.choose_spec).symm] + +omit [CharZero K] in +/-- The Taylor coefficients of the exponential of a monomial vanish away from the + multiples of the exponent. -/ +lemma coeff_expMonomial_of_forall_ne (c : K) {k : σ →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : + coeff k (expMonomial c w) = 0 := by + rw [coeff_apply] + simp only [expMonomial] + rw [dif_neg (not_exists.mpr hk)] + +/-- The exponential property: exponentials of the same monomial multiply by adding + the scalars. -/ +lemma expMonomial_mul_expMonomial (hw : w ≠ 0) (c c' : K) : + expMonomial c w * expMonomial c' w = expMonomial (c + c') w := by + classical + ext k + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨N, rfl⟩ := hk + rw [coeff_mul, coeff_expMonomial_nsmul hw] + have hsub : (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) ⊆ + Finset.antidiagonal (N • w) := by + intro p hp + obtain ⟨n, hn, rfl⟩ := Finset.mem_image.mp hp + rw [Finset.mem_antidiagonal, ← add_smul, + Nat.add_sub_cancel' (Nat.lt_succ_iff.mp (Finset.mem_range.mp hn))] + have hvanish : ∀ p ∈ Finset.antidiagonal (N • w), + p ∉ (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) → + coeff p.1 (expMonomial c w) * coeff p.2 (expMonomial c' w) = 0 := by + intro p hp hpn + by_cases h1 : ∃ n : ℕ, p.1 = n • w + · obtain ⟨n₁, h1⟩ := h1 + exfalso + apply hpn + have hsum : p.1 + p.2 = N • w := Finset.mem_antidiagonal.mp hp + obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw + have hcoords : ∀ ρ', n₁ * w ρ' + p.2 ρ' = N * w ρ' := by + intro ρ' + have h' := DFunLike.congr_fun hsum ρ' + simpa [h1, Finsupp.smul_apply] using h' + have hle : n₁ ≤ N := + Nat.le_of_mul_le_mul_right (by have := hcoords ρ; omega) + (Nat.pos_of_ne_zero hρ) + have h2 : p.2 = (N - n₁) • w := by + ext ρ' + rw [Finsupp.smul_apply, smul_eq_mul, Nat.sub_mul] + have := hcoords ρ' + omega + exact Finset.mem_image.mpr + ⟨n₁, Finset.mem_range.mpr (Nat.lt_succ_of_le hle), by rw [← h1, ← h2]⟩ + · rw [coeff_expMonomial_of_forall_ne c (not_exists.mp h1), zero_mul] + rw [← Finset.sum_subset hsub hvanish, + Finset.sum_image (fun n _ m _ h => nsmul_right_cancel hw (congrArg Prod.fst h)), + add_pow, Finset.sum_div] + refine Finset.sum_congr rfl fun n hn => ?_ + rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw] + have hle : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hfact : ((N.choose n : K)) * (n.factorial : K) * ((N - n).factorial : K) = + (N.factorial : K) := by + exact_mod_cast congrArg (Nat.cast : ℕ → K) + (Nat.choose_mul_factorial_mul_factorial hle) + have h1 : (n.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr n.factorial_ne_zero + have h2 : ((N - n).factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr (N - n).factorial_ne_zero + have h3 : (N.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr N.factorial_ne_zero + rw [div_mul_div_comm, div_eq_div_iff (mul_ne_zero h1 h2) h3] + linear_combination (-(c ^ n * c' ^ (N - n))) * hfact + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_mul] + refine Finset.sum_eq_zero fun p hp => ?_ + by_cases h1 : ∃ n : ℕ, p.1 = n • w + · by_cases h2 : ∃ n : ℕ, p.2 = n • w + · exfalso + obtain ⟨n₁, h1⟩ := h1 + obtain ⟨n₂, h2⟩ := h2 + exact hk ⟨n₁ + n₂, by rw [← Finset.mem_antidiagonal.mp hp, h1, h2, add_smul]⟩ + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h2), mul_zero] + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h1), zero_mul] + +omit [CharZero K] in +/-- The coefficientwise star of the exponential of a monomial is the exponential at + the starred scalar. -/ +lemma star_expMonomial [StarRing K] (hw : w ≠ 0) (c : K) : + star (expMonomial c w) = expMonomial (star c) w := by + ext k + rw [coeff_star] + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨n, rfl⟩ := hk + rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw, star_div₀, star_pow, + star_natCast] + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), + coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), star_zero] + +/-- The exponential of a monomial at scalar zero is one. -/ +lemma expMonomial_zero (hw : w ≠ 0) : expMonomial (0 : K) w = 1 := by + classical + ext k + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨n, rfl⟩ := hk + rw [coeff_expMonomial_nsmul hw, coeff_one] + rcases Nat.eq_zero_or_pos n with hn | hn + · subst hn + rw [if_pos (zero_smul ℕ w)] + simp + · have hne : ¬n • w = 0 := by + obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw + intro h0 + have h' := DFunLike.congr_fun h0 ρ + simp only [Finsupp.smul_apply, smul_eq_mul, Finsupp.coe_zero, Pi.zero_apply, + Nat.mul_eq_zero] at h' + omega + rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg hne] + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_one, + if_neg (fun h => hk ⟨0, by rw [h, zero_smul]⟩)] + +/-- The chain rule for the exponential of a monomial: + `∂_ν exp(c X^w) = c w_ν X^{w - e_ν} exp(c X^w)`. -/ +lemma pderiv_expMonomial (hw : w ≠ 0) (ν : σ) (c : K) : + pderiv K ν (expMonomial c w) = + (c * (w ν : K)) • (monomial (w - Finsupp.single ν 1) 1 * expMonomial c w) := by + classical + ext k + rw [coeff_pderiv, map_smul, smul_eq_mul, coeff_monomial_mul] + by_cases hA : ∃ n : ℕ, k + Finsupp.single ν 1 = n • w + · obtain ⟨n, hn⟩ := hA + have hcoords : ∀ ρ, k ρ + (Finsupp.single ν 1) ρ = n * w ρ := by + intro ρ + have h' := DFunLike.congr_fun hn ρ + simpa [Finsupp.smul_apply] using h' + have hkν : k ν + 1 = n * w ν := by + have := hcoords ν + rwa [Finsupp.single_eq_same] at this + have hnpos : 0 < n := by + rcases Nat.eq_zero_or_pos n with h0 | h0 + · subst h0; omega + · exact h0 + have hwνpos : 0 < w ν := by + rcases Nat.eq_zero_or_pos (w ν) with h0 | h0 + · rw [h0, Nat.mul_zero] at hkν; omega + · exact h0 + have hdk : w - Finsupp.single ν 1 ≤ k := by + rw [Finsupp.le_def] + intro ρ + rw [Finsupp.tsub_apply] + have h1 := hcoords ρ + have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos + by_cases hρν : ρ = ν + · subst hρν + rw [Finsupp.single_eq_same] at h1 ⊢ + omega + · have hsρ : (Finsupp.single ν 1) ρ = 0 := + Finsupp.single_eq_of_ne hρν + rw [hsρ] at h1 ⊢ + omega + have hkd : k - (w - Finsupp.single ν 1) = (n - 1) • w := by + ext ρ + rw [Finsupp.tsub_apply, Finsupp.tsub_apply, Finsupp.smul_apply, smul_eq_mul, + Nat.sub_mul, one_mul] + have h1 := hcoords ρ + have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos + by_cases hρν : ρ = ν + · subst hρν + rw [Finsupp.single_eq_same] at h1 ⊢ + omega + · have hsρ : (Finsupp.single ν 1) ρ = 0 := + Finsupp.single_eq_of_ne hρν + rw [hsρ] at h1 ⊢ + omega + rw [if_pos hdk, one_mul, hkd, hn, coeff_expMonomial_nsmul hw, + coeff_expMonomial_nsmul hw] + have hcast : ((k ν : K) + 1) = (n : K) * (w ν : K) := by exact_mod_cast hkν + rw [hcast] + have hfac : (n.factorial : K) = (n : K) * ((n - 1).factorial : K) := by + exact_mod_cast congrArg (Nat.cast : ℕ → K) + (Nat.mul_factorial_pred (Nat.pos_iff_ne_zero.mp hnpos)).symm + have hpow : c ^ n = c * c ^ (n - 1) := by + conv_lhs => rw [show n = 1 + (n - 1) by omega, pow_add, pow_one] + rw [hfac, hpow] + have h1 : ((n : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.pos_iff_ne_zero.mp hnpos) + have h2 : (((n - 1).factorial : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero _) + field_simp + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hA), zero_mul] + by_cases hwv : w ν = 0 + · rw [hwv] + simp + · have hzero : (if w - Finsupp.single ν 1 ≤ k then + 1 * coeff (k - (w - Finsupp.single ν 1)) (expMonomial c w) else 0) = 0 := by + split_ifs with hdk + · rw [one_mul] + refine coeff_expMonomial_of_forall_ne _ fun m hm => ?_ + apply hA + refine ⟨m + 1, ?_⟩ + have hle : Finsupp.single ν 1 ≤ w := + Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) + have h1 : k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) = k := + tsub_add_cancel_of_le hdk + have h2 : (w - Finsupp.single ν 1) + Finsupp.single ν 1 = w := + tsub_add_cancel_of_le hle + calc k + Finsupp.single ν 1 + = k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) + + Finsupp.single ν 1 := by rw [h1] + _ = m • w + w := by rw [hm, add_assoc, h2] + _ = (m + 1) • w := by rw [add_smul, one_smul] + · rfl + rw [hzero, mul_zero] + +end ExpMonomial + end MvPowerSeries namespace StandardModel @@ -480,6 +746,42 @@ lemma mcSeriesCoeff_single_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) push_cast ring +/-- The Maurer–Cartan series is closed: `∂_μ mc_ν = ∂_ν mc_μ`. The mixed second + derivatives of `u` are symmetric, and the cross terms cancel by unitarity, + through `∂ū = -ū (∂u) ū`. -/ +lemma pderiv_mcSeries_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ (mcSeries u ν) = pderiv ℂ ν (mcSeries u μ) := by + have hu : (u : JetRing) * star (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).2 + have hu' : star (u : JetRing) * (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).1 + have hstar : ∀ ρ : Fin 1 ⊕ Fin 3, pderiv ℂ ρ (star (u : JetRing)) = + -(star (u : JetRing) * pderiv ℂ ρ (u : JetRing) * star (u : JetRing)) := by + intro ρ + have h0 : pderiv ℂ ρ ((u : JetRing) * star (u : JetRing)) = 0 := by + rw [hu, pderiv_one] + rw [Derivation.leibniz] at h0 + simp only [smul_eq_mul] at h0 + linear_combination star (u : JetRing) * h0 - + (pderiv ℂ ρ (star (u : JetRing))) * hu' + simp only [mcSeries, Derivation.leibniz, pderiv_C, smul_eq_mul, mul_zero, add_zero] + rw [hstar μ, hstar ν, pderiv_comm μ ν] + ring + +/-- The weighted symmetry of the Maurer–Cartan Taylor coefficients: exchanging the + field index with a derivative index changes the coefficient by the ratio of the + corresponding multiplicities. -/ +lemma mcSeriesCoeff_succ_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + (m μ + 1) • mcSeriesCoeff u ν (m + Finsupp.single μ 1) = + (m ν + 1) • mcSeriesCoeff u μ (m + Finsupp.single ν 1) := by + have h := congrArg (coeff m) (pderiv_mcSeries_symm u μ ν) + rw [coeff_pderiv, coeff_pderiv] at h + apply Subtype.ext + show ((m μ + 1 : ℕ)) • coeff (m + Finsupp.single μ 1) (mcSeries u ν) = + ((m ν + 1 : ℕ)) • coeff (m + Finsupp.single ν 1) (mcSeries u μ) + rw [nsmul_eq_mul, nsmul_eq_mul] + push_cast + linear_combination h + /-! ## The Jet component vector space @@ -631,6 +933,266 @@ lemma mcPairing_basis_dB (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) : rw [Finset.sum_ite_eq' Finset.univ ν] simp +/-- The multiset basis of the dual derivative symbols, as a basis vector of the + symmetric algebra at the corresponding multi-index. -/ +lemma dualRealJetAlgebraBasis_apply' (s : Multiset (Fin 1 ⊕ Fin 3)) : + LagrangianTheory.dualRealJetAlgebraBasis s = + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by + rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] + rfl + +/-- The Maurer–Cartan jet on a general derivative symbol. -/ +lemma mcJet_basis (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin 3)) : + mcJet u (LagrangianTheory.dualRealJetAlgebraBasis s) = + ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] + ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + mcSeriesCoeff u ν (Multiset.toFinsupp s))⟩ := by + rw [dualRealJetAlgebraBasis_apply', mcJet, Module.Basis.constr_basis] + +/-- The Maurer–Cartan pairing on a general generator: the factorial-weighted + Taylor coefficient of the Maurer–Cartan series. -/ +lemma mcPairing_basis_dB' (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) : + mcPairing u (JetComponentSpace.basis (.dB s ν)) = + (∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + Complex.selfAdjointEquiv (mcSeriesCoeff u ν (Multiset.toFinsupp s)) := by + rw [jetComponentSpace_basis_dB, mcPairing_tmul, mcJet_basis, + show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + mcSeriesCoeff u ν' (Multiset.toFinsupp s))⟩ : BBoson) = + ∑ ν', ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + Complex.selfAdjointEquiv (mcSeriesCoeff u ν' (Multiset.toFinsupp s))) • basis ν' from by + rw [show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + mcSeriesCoeff u ν' (Multiset.toFinsupp s))⟩ : BBoson) = + valLinEquiv.symm (∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + mcSeriesCoeff u ν' (Multiset.toFinsupp s))) from rfl, map_sum] + refine Finset.sum_congr rfl fun ν' _ => ?_ + rw [valLinEquiv_symm_apply, mk_tmul_eq_smul_basis, map_nsmul], + map_sum] + simp only [map_smul, Module.Basis.dualBasis_apply_self, smul_eq_mul, mul_ite, + mul_one, mul_zero] + rw [Finset.sum_ite_eq' Finset.univ ν] + simp + +/-- The factorial weight of a multi-index augmented by one derivative: the + multiplicity of the new index times the original weight. -/ +lemma prod_factorial_add_single (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (κ : Fin 1 ⊕ Fin 3) : + (∏ ρ : Fin 1 ⊕ Fin 3, Nat.factorial (((m + Finsupp.single κ 1) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ)) = + (m κ + 1) * ∏ ρ, Nat.factorial (m ρ) := by + rw [show (∏ ρ : Fin 1 ⊕ Fin 3, Nat.factorial (((m + Finsupp.single κ 1) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ)) = + ∏ ρ, ((if ρ = κ then m κ + 1 else 1) * Nat.factorial (m ρ)) from + Finset.prod_congr rfl fun ρ _ => by + rcases eq_or_ne ρ κ with rfl | h + · rw [Finsupp.add_apply, Finsupp.single_eq_same, Nat.factorial_succ, if_pos rfl] + · rw [Finsupp.add_apply, Finsupp.single_eq_of_ne h, add_zero, if_neg h, one_mul], + Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ κ] + simp + +/-- Exchanging the field index with a derivative index leaves the Maurer–Cartan + shift of the component functions unchanged: the shift is the jet of a gradient, + whose Taylor coefficients depend only on the total multi-index. -/ +lemma mcPairing_basis_dB_symm (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + mcPairing u (JetComponentSpace.basis (.dB (s + {μ}) ν)) = + mcPairing u (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by + rw [mcPairing_basis_dB', mcPairing_basis_dB', + show Multiset.toFinsupp (s + {μ}) = Multiset.toFinsupp s + Finsupp.single μ 1 from by + rw [map_add, Multiset.toFinsupp_singleton], + show Multiset.toFinsupp (s + {ν}) = Multiset.toFinsupp s + Finsupp.single ν 1 from by + rw [map_add, Multiset.toFinsupp_singleton], + prod_factorial_add_single, prod_factorial_add_single, mul_smul, mul_smul, + smul_comm (Multiset.toFinsupp s μ + 1), smul_comm (Multiset.toFinsupp s ν + 1)] + congr 1 + have h := congrArg Complex.selfAdjointEquiv + (mcSeriesCoeff_succ_symm u μ ν (Multiset.toFinsupp s)) + rw [map_nsmul, map_nsmul] at h + exact h + +/-! + +## Gauge realization of translations of the jet coordinates + +To identify the gauge invariants of the jet algebra we need not only that every +jet gauge transformation shifts the component functions by the Maurer–Cartan +pairing, but also that enough shifts are realized: for every nonzero symmetrized +multi-index `t` and every real `r` there is a jet of a local `U(1)` gauge +transformation shifting every component function with total multi-index `t` by +exactly `r`, and all others by nothing. The transformation realizing this is the +exponential `exp(-i a X^t)` with `a = r / t!`, formalized through +`MvPowerSeries.expMonomial`. + +-/ + +/-- The jet of the local `U(1)` gauge transformation `exp(-i a X^w)`: the + exponential of an imaginary multiple of a spacetime monomial, which is unitary + as a formal power series. -/ +noncomputable def expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + unitary JetRing := + ⟨expMonomial (-(a : ℂ) * Complex.I) w, by + have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by + rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] + ring + rw [Unitary.mem_iff, star_expMonomial hw, hstar, expMonomial_mul_expMonomial hw, + expMonomial_mul_expMonomial hw, neg_add_cancel, add_neg_cancel, + expMonomial_zero hw] + exact ⟨rfl, rfl⟩⟩ + +/-- The Maurer–Cartan series of the exponential gauge jet: the monomial + `a w_ν X^{w - e_ν}`, which is the jet of the gradient `a ∂_ν X^w`. -/ +lemma mcSeries_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) + (ν : Fin 1 ⊕ Fin 3) : + mcSeries (expUnitary a w hw) ν = + monomial (w - Finsupp.single ν 1) ((a : ℂ) * ((w ν : ℕ) : ℂ)) := by + have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by + rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] + ring + rw [mcSeries, + show ((expUnitary a w hw : unitary JetRing) : JetRing) = + expMonomial (-(a : ℂ) * Complex.I) w from rfl, + pderiv_expMonomial hw, star_expMonomial hw, hstar, smul_mul_assoc, + mul_assoc (monomial (w - Finsupp.single ν 1) 1), + expMonomial_mul_expMonomial hw, add_neg_cancel, expMonomial_zero hw, mul_one, + mul_smul_comm, ← monomial_zero_eq_C_apply, monomial_mul_monomial, zero_add, + ← map_smul, smul_eq_mul] + congr 1 + ring_nf + rw [Complex.I_sq] + ring + +/-- The Maurer–Cartan pairing of the exponential gauge jet `exp(-i a X^t)` with + `a = r / t!`: it shifts precisely the component functions whose total + symmetrized multi-index is `t`, and shifts them all by `r`. -/ +lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) + (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) : + mcPairing (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = + if s + {ν} = t then r else 0 := by + rw [mcPairing_basis_dB', Complex.selfAdjointEquiv_apply, + show ((mcSeriesCoeff (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + (Multiset.toFinsupp t) ht) ν (Multiset.toFinsupp s) : selfAdjoint ℂ) : ℂ) = + coeff (Multiset.toFinsupp s) (mcSeries (expUnitary + (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + (Multiset.toFinsupp t) ht) ν) from rfl, + mcSeries_expUnitary, coeff_monomial] + by_cases hcase : s + {ν} = t + · rw [if_pos hcase] + have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by + rw [← Multiset.toFinsupp_singleton, ← map_add] + exact congrArg _ hcase + have hwv : Multiset.toFinsupp t ν = Multiset.toFinsupp s ν + 1 := by + rw [← hmw] + simp + have hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 := + eq_tsub_of_add_eq hmw + have hF : (∏ ρ, Nat.factorial ((Multiset.toFinsupp t) ρ)) = + ((Multiset.toFinsupp s) ν + 1) * + ∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) := by + rw [← hmw] + exact prod_factorial_add_single (Multiset.toFinsupp s) ν + rw [if_pos hm, nsmul_eq_mul, hwv, hF] + have h1 : (((Multiset.toFinsupp s) ν + 1 : ℕ) : ℝ) ≠ 0 := by + positivity + have h2 : ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) : ℕ) : ℝ) ≠ 0 := by + rw [Nat.cast_ne_zero] + exact Finset.prod_ne_zero_iff.mpr fun ρ _ => Nat.factorial_ne_zero _ + simp only [Complex.mul_re, Complex.ofReal_re, Complex.ofReal_im, Complex.natCast_re, + Complex.natCast_im, mul_zero, sub_zero] + push_cast + field_simp + · rw [if_neg hcase] + by_cases hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 + · by_cases hwv : Multiset.toFinsupp t ν = 0 + · rw [if_pos hm, hwv] + simp + · exfalso + apply hcase + have hle : Finsupp.single ν 1 ≤ Multiset.toFinsupp t := + Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) + have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by + rw [hm, tsub_add_cancel_of_le hle] + refine Multiset.toFinsupp.injective ?_ + rw [map_add, Multiset.toFinsupp_singleton] + exact hmw + · rw [if_neg hm] + simp + +/-! + +## Canonical representatives of the jet generators + +The Maurer–Cartan pairing of a jet gauge transformation with the component +function `∂_s B_ν` depends only on the total symmetrized multi-index `s + {ν}`. +We choose, for every jet generator, a canonical generator with the same total +multi-index. The differences between a generator and its canonical +representative are exactly the derivatives of the field strength, while the +canonical generators themselves are shifted freely by the gauge transformations +realized above; this dichotomy computes the gauge invariants of the jet algebra +below. + +-/ + +namespace JetGenerators + +/-- The total symmetrized multi-index of a jet generator: the derivative + multi-index together with the Lorentz index of the field. The Maurer–Cartan + shift of a component function depends only on its total multi-index. -/ +def total : JetGenerators → Multiset (Fin 1 ⊕ Fin 3) + | .dB s ν => s + {ν} + +@[simp] +lemma total_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : + total (dB s ν) = s + {ν} := rfl + +lemma total_ne_zero (g : JetGenerators) : total g ≠ 0 := by + cases g with + | dB s ν => simp [total] + +/-- A choice of element of a multiset, used to pick the canonical representative + of each total multi-index. -/ +noncomputable def pick (t : Multiset (Fin 1 ⊕ Fin 3)) : Fin 1 ⊕ Fin 3 := + if h : ∃ ν, ν ∈ t then h.choose else Sum.inl 0 + +lemma pick_mem {t : Multiset (Fin 1 ⊕ Fin 3)} (ht : t ≠ 0) : pick t ∈ t := by + have h : ∃ ν, ν ∈ t := Multiset.exists_mem_of_ne_zero ht + rw [pick, dif_pos h] + exact h.choose_spec + +/-- The canonical representative of a jet generator: the generator with the same + total multi-index whose field index is the chosen element of the total. -/ +noncomputable def canon (g : JetGenerators) : JetGenerators := + .dB ((total g).erase (pick (total g))) (pick (total g)) + +/-- The canonical representative has the same total multi-index. -/ +@[simp] +lemma total_canon (g : JetGenerators) : total (canon g) = total g := by + rw [canon] + show ((total g).erase (pick (total g))) + {pick (total g)} = total g + rw [add_comm, Multiset.singleton_add] + exact Multiset.cons_erase (pick_mem (total_ne_zero g)) + +/-- Taking canonical representatives is idempotent. -/ +@[simp] +lemma canon_canon (g : JetGenerators) : canon (canon g) = canon g := by + rw [show canon (canon g) = + JetGenerators.dB ((total (canon g)).erase (pick (total (canon g)))) + (pick (total (canon g))) from rfl, total_canon] + rfl + +/-- Two jet generators have the same canonical representative if and only if they + have the same total multi-index. -/ +lemma canon_eq_canon_iff (g g' : JetGenerators) : + canon g = canon g' ↔ total g = total g' := by + constructor + · intro h + rw [← total_canon g, ← total_canon g', h] + · intro h + rw [canon, canon, h] + +end JetGenerators + /-! ## The jet algebra and the jet gauge action @@ -689,6 +1251,16 @@ lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : Algebra.linearMap_apply] +lemma repJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI U (x * y) = repJetGaugeGroupI U x * repJetGaugeGroupI U y := + map_mul (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)) x y + +lemma repJetGaugeGroupI_algebraMap (U : JetGaugeGroupI) (r : ℝ) : + repJetGaugeGroupI U (algebraMap ℝ JetAlgebra r) = algebraMap ℝ JetAlgebra r := + AlgHom.commutes (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)) r + /-- The action of the jet gauge group on the complexified B-boson jet algebra, obtained from the real representation by extension of scalars. -/ noncomputable def complexRepJetGaugeGroupI : @@ -731,13 +1303,183 @@ lemma repJetGaugeGroupI_fieldStrength (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fi rw [mcSeriesCoeff_single_symm] abel +noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra := + ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) + +lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν = -fieldStrengthDeriv s ν μ := by + simp [fieldStrengthDeriv] + +lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by + simp only [fieldStrengthDeriv, map_sub, ofGenerator, repJetGaugeGroupI_ι] + rw [mcPairing_basis_dB_symm] + abel /-! ## Invariance under the gauge group -/ +/-- Conjugating the jet gauge action by the polynomial coordinates of the jet + algebra: under `SymmetricAlgebra.equivMvPolynomial` the substitution + automorphism `x ↦ x + ⟨mc, x⟩ 1` becomes the translation of every polynomial + variable by the Maurer–Cartan pairing of the corresponding component + function. -/ +lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) : + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (repJetGaugeGroupI U V) = + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := by + have h : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom.comp + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)) = + (MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g)))).comp + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom := by + refine SymmetricAlgebra.algHom_ext (JetComponentSpace.basis.ext fun g => ?_) + show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2) + (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) = + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) + ((SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) + (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) + rw [SymmetricAlgebra.lift_ι_apply] + simp only [LinearMap.add_apply, LinearMap.coe_comp, Function.comp_apply, + Algebra.linearMap_apply, map_add, AlgEquiv.commutes, + SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.aeval_X, + MvPolynomial.algebraMap_eq] + exact DFunLike.congr_fun h V + +/-- The conjugated action of a `U(1)` jet embedded in the jet gauge group. -/ +lemma equivMvPolynomial_repJetGaugeGroupI_u1 (u : unitary JetRing) (V : JetAlgebra) : + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis + (repJetGaugeGroupI (1, 1, u) V) = + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing u (JetComponentSpace.basis g))) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := + equivMvPolynomial_repJetGaugeGroupI (1, 1, u) V + +/-- The difference between a jet-algebra generator and its canonical + representative is a derivative of the field strength, or zero. -/ +lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : + ofGenerator g - ofGenerator (JetGenerators.canon g) ∈ + Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by + obtain ⟨s, ν⟩ := g + set p := JetGenerators.pick (JetGenerators.total (JetGenerators.dB s ν)) with hp + by_cases hpν : p = ν + · have hcanon : JetGenerators.canon (JetGenerators.dB s ν) = JetGenerators.dB s ν := by + rw [JetGenerators.canon, ← hp, hpν] + congr 1 + show (s + {ν}).erase ν = s + rw [add_comm, Multiset.singleton_add, Multiset.erase_cons_head] + rw [hcanon, sub_self] + exact Subalgebra.zero_mem _ + · have hmem : p ∈ s + {ν} := + JetGenerators.pick_mem (JetGenerators.total_ne_zero (JetGenerators.dB s ν)) + have hps : p ∈ s := by + rcases Multiset.mem_add.mp hmem with h | h + · exact h + · exact absurd (Multiset.mem_singleton.mp h) hpν + have h2 : JetGenerators.canon (JetGenerators.dB s ν) = + JetGenerators.dB (s.erase p + {ν}) p := by + rw [JetGenerators.canon, ← hp] + congr 1 + show (s + {ν}).erase p = s.erase p + {ν} + exact Multiset.erase_add_left_pos _ hps + have h1 : JetGenerators.dB s ν = JetGenerators.dB (s.erase p + {p}) ν := by + congr 1 + rw [add_comm, Multiset.singleton_add] + exact (Multiset.cons_erase hps).symm + rw [h2, h1] + exact Algebra.subset_adjoin ⟨((s.erase p, p), ν), Set.mem_univ _, rfl⟩ + +/-- An element of the jet algebra of the B boson is invariant under the jet gauge + group if and only if it is a polynomial in the derivatives of the field + strength. + + The forward direction is the completeness of the field strength and its + derivatives as gauge invariants: conjugating by the polynomial coordinates, + the jet gauge group acts by translating each component function by the + Maurer–Cartan pairing, which depends only on the total symmetrized + multi-index; the exponential jets `exp(-i a X^t)` realize arbitrary + independent translations of each total multi-index, and a polynomial invariant + under all of them is a polynomial in the differences of component functions + with equal totals, i.e. in the derivatives of the field strength. -/ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : + (∀ U, repJetGaugeGroupI U V = V) ↔ V ∈ Algebra.adjoin ℝ + (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by + constructor + · intro hV + have htrans : ∀ (g₀ : JetGenerators) (r : ℝ), + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (if JetGenerators.canon g = JetGenerators.canon g₀ then r + else (0 : ℝ))) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) = + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V := by + intro g₀ r + obtain ⟨s₀, ν₀⟩ := g₀ + have hne : Multiset.toFinsupp (s₀ + {ν₀}) ≠ 0 := by + intro h + have h0 : s₀ + {ν₀} = 0 := + Multiset.toFinsupp.injective (by rw [h, Multiset.toFinsupp_zero]) + simp at h0 + have hconj := equivMvPolynomial_repJetGaugeGroupI_u1 + (expUnitary (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) + (Multiset.toFinsupp (s₀ + {ν₀})) hne) V + rw [hV _] at hconj + have hfun : (fun g => MvPolynomial.X g + MvPolynomial.C + (mcPairing (expUnitary + (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) + (Multiset.toFinsupp (s₀ + {ν₀})) hne) + (JetComponentSpace.basis g))) = + fun g => MvPolynomial.X g + MvPolynomial.C + (if JetGenerators.canon g = JetGenerators.canon (JetGenerators.dB s₀ ν₀) + then r else (0 : ℝ)) := by + funext g + obtain ⟨s, ν⟩ := g + rw [mcPairing_expUnitary (s₀ + {ν₀}) hne r s ν] + have hiff : (s + {ν} = s₀ + {ν₀}) ↔ + (JetGenerators.canon (JetGenerators.dB s ν) = + JetGenerators.canon (JetGenerators.dB s₀ ν₀)) := by + rw [JetGenerators.canon_eq_canon_iff] + simp + rw [if_congr hiff rfl rfl] + rw [hfun] at hconj + exact hconj.symm + have hmem := MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq + JetGenerators.canon JetGenerators.canon_canon + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) htrans + have hVmem : V ∈ (Algebra.adjoin ℝ (Set.range fun g => + (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g) : + MvPolynomial JetGenerators ℝ))).map + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom := + Subalgebra.mem_map.mpr ⟨_, hmem, AlgEquiv.symm_apply_apply _ _⟩ + rw [AlgHom.map_adjoin] at hVmem + refine Algebra.adjoin_le ?_ hVmem + rintro x ⟨_, ⟨g, rfl⟩, rfl⟩ + have hsymm : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom + (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = + ofGenerator g - ofGenerator (JetGenerators.canon g) := by + show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm + (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = _ + rw [map_sub, SymmetricAlgebra.equivMvPolynomial_symm_X, + SymmetricAlgebra.equivMvPolynomial_symm_X] + rfl + rw [hsymm] + exact ofGenerator_sub_ofGenerator_canon_mem g + · intro hVmem U + induction hVmem using Algebra.adjoin_induction with + | mem x hx => + obtain ⟨⟨⟨s', μ⟩, ν⟩, -, rfl⟩ := hx + exact repJetGaugeGroupI_fieldStrengthDeriv U s' μ ν + | algebraMap r => exact repJetGaugeGroupI_algebraMap U r + | add x y hx hy ihx ihy => rw [map_add, ihx, ihy] + | mul x y hx hy ihx ihy => rw [repJetGaugeGroupI_mul, ihx, ihy] end JetAlgebra diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index 8ee934c6e..87f52c093 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -154,6 +154,13 @@ open scoped Nat ## B. The jet ring +The jet ring is the ring generated by `x^μ`. +We can consider an element of `χ : JetRing` +as a formal power series in the spacetime coordinates. + +The action `derivAction` below takes `∂_μ · ↦ ∂_μ (χ • ·)`. + + -/ /-- The ring of formal power series in the four spacetime coordinates, with complex @@ -365,11 +372,9 @@ lemma symPairing_injective {p q : SymmetricAlgebra ℂ Lorentz.CoℂModule} exact Finset.prod_ne_zero_iff.mpr fun μ _ => Nat.factorial_ne_zero (m μ) exact mul_left_cancel₀ hfac hf -/-- The action of a jet `χ` on the algebra of derivative symbols: the transpose of - multiplication by `χ` under the divided-power pairing, i.e. the constant - coefficient differential operator `χ(∂)`. On the derivative symbol `∂_m` it is - `∑_{k + l = m} (m.descFactorial k) · (coeff k χ) · ∂_l`, the Leibniz rule; for - example `∂_μ ↦ χ(0) ∂_μ + (∂_μχ)(0) ∂_∅`. -/ +/-- + For `χ : JetRing`, the action which takes `∂_μ · ↦ ∂_μ (χ • ·)`. + We expand `∂_μ (χ • ·)` out using the chain rule. -/ noncomputable def derivAction (χ : JetRing) : SymmetricAlgebra ℂ Lorentz.CoℂModule →ₗ[ℂ] SymmetricAlgebra ℂ Lorentz.CoℂModule := Lorentz.complexCoBasis.symmetricAlgebra.constr ℂ fun m => From c3affb828028df97c97addb61f2ad0c69ad3f0bb Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 10:43:20 +0100 Subject: [PATCH 085/254] feat: Add derivatives to algebras!! Co-Authored-By: Claude --- Physlib/Particles/QED/JetAlgebra.lean | 121 +++++++++++++- .../StandardModel/Fermions/LeptonSinglet.lean | 149 ++++++++++++++++++ .../StandardModel/GaugeBosons/BBoson.lean | 95 +++++++++-- 3 files changed, 350 insertions(+), 15 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index a86f538a2..94ca0f034 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -57,9 +57,9 @@ namespace JetAlgebra noncomputable def ofGenerator (s : JetGenerators) : JetAlgebra := match s with | JetGenerators.dB s μ => - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 | JetGenerators.dψ s α => - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) | JetGenerators.dbarψ s α => (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) @@ -67,7 +67,10 @@ scoped notation "[" s "]ₐ" => ofGenerator s /-! -## B. Representations of the group +## B. Representation of the gauge group + +Gauge transformations act on the QED jet algebra +locally via the group `JetGaugeGroupI`. -/ @@ -83,6 +86,118 @@ lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgeb (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl +/-! + +## Jet derivatives + +The formal total spacetime derivative `∂_μ` on the QED jet algebra: the Leibniz +extension of the total derivatives of the two factors. Both factor derivatives +are even derivations, so the total derivative is an even derivation on the full +jet algebra, with no Koszul signs. + +-/ + +/-- The formal total spacetime derivative on the QED jet algebra in the + direction `μ`: the Leibniz extension of the total derivatives of the B-boson + and charged-lepton factors. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) LinearMap.id + + TensorProduct.map LinearMap.id (LeptonSinglet.JetAlgebra.jetDeriv μ) + +lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + jetDeriv μ (p ⊗ₜ[ℂ] l) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] l + + p ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.jetDeriv μ l := by + simp [jetDeriv] + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by + rw [show (1 : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, LinearMap.baseChange_tmul] + simp + +/-- The total derivative is an even derivation on the QED jet algebra: the + Leibniz rule holds with no Koszul signs. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + have hdist₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind + have hdist₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hzero₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hzero₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + induction x using TensorProduct.induction_on with + | zero => simp [hzero₁] + | add a b ha hb => + simp only [hdist₁, map_add, ha, hb] + abel + | tmul p l => + induction y using TensorProduct.induction_on with + | zero => simp [hzero₂] + | add a' b' ha' hb' => + simp only [hdist₂, map_add, ha', hb'] + abel + | tmul p' l' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, jetDeriv_tmul, + BBoson.JetAlgebra.jetDeriv_baseChange_mul, LeptonSinglet.JetAlgebra.jetDeriv_mul, + TensorProduct.add_tmul, TensorProduct.tmul_add, hdist₁, hdist₂] + abel + +/-! + +## Covariant derivatives + +The covariant derivative `D_l ψ_α` of the charged lepton, indexed by an ordered +list `l` of spacetime directions: covariant derivatives do not commute — their +commutator is the field strength — so the index is a list rather than a +multiset, with the head of the list the outermost derivative. + +The component functions of the lepton transform contragrediently, through the +hypercharge power series `u ^ 6`, so the covariant step on component functions +is `D_μ = ∂_μ + 6 i B_μ`: under a jet gauge transformation `∂_μ ψ_α` shifts by +`- 6 i mc_μ ψ_α` while `B_μ` shifts by `+ mc_μ`, and the two contributions +cancel. The step is defined on the whole jet algebra; applied repeatedly to the +zeroth-order component function of `ψ` it produces the covariant derivatives. + +-/ + +/-- One covariant-derivative step `D_μ = ∂_μ + 6 i B_μ` on the QED jet algebra: + the total spacetime derivative together with multiplication by the gauge field + weighted by the hypercharge coupling. -/ +noncomputable def covariantStep (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ + +/-- The covariant derivative `D_l ψ_α` of the charged lepton along the ordered + list of directions `l`, with the head of the list the outermost derivative: + the recursion `D_{μ :: l} ψ = (∂_μ + 6 i B_μ) (D_l ψ)` starting from the + zeroth-order component function of `ψ`. -/ +noncomputable def Dψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + JetAlgebra := + l.foldr (fun μ x => covariantStep μ x) [JetGenerators.dψ {} α]ₐ + +/-- The zeroth covariant derivative is the lepton component function itself. -/ +@[simp] +lemma Dψ_nil (α : Fin 2) : + Dψ [] α = [JetGenerators.dψ {} α]ₐ := rfl + +@[simp] +lemma Dψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) + (α : Fin 2) : + Dψ (μ :: l) α = covariantStep μ (Dψ l α) := + rfl + +/-- The first covariant derivative: `D_μ ψ_α = ∂_μ ψ_α + 6 i B_μ ψ_α`. -/ +lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + Dψ [μ] α = [JetGenerators.dψ {μ} α]ₐ + + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dψ {} α]ₐ) := by + rw [Dψ_cons, Dψ_nil, covariantStep, + LinearMap.add_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply] + congr 1 + simp only [ofGenerator] + have h1 : BBoson.JetAlgebra.jetDeriv μ (1 : BBoson.JetAlgebra) = 0 := + BBoson.JetAlgebra.jetDeriv_one μ + rw [jetDeriv_tmul, LinearMap.baseChange_tmul, h1, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ] + simp [Multiset.empty_eq_zero] end JetAlgebra diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index caaf059e8..64ad332fc 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -13,6 +13,7 @@ public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Particles.LagrangianTheory.Basic +public import Mathlib.Algebra.TrivSqZeroExt.Basic /-! # Charged-lepton singlets @@ -560,6 +561,48 @@ lemma coeff_single_pow (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) : /-! +## The formal total derivative on the component functions + +The formal total spacetime derivative `∂_μ` acts on the component functions of +the charged-lepton jet by appending the derivative index, +`∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α`, and likewise on the conjugate components. + +-/ + +namespace JetGenerators + +/-- The jet generator with one further derivative in the direction `μ`. -/ +def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators + | dψ s α => dψ (s + {μ}) α + | dbarψ s α => dbarψ (s + {μ}) α + +@[simp] +lemma shift_dψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + shift μ (dψ s α) = dψ (s + {μ}) α := rfl + +@[simp] +lemma shift_dbarψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + shift μ (dbarψ s α) = dbarψ (s + {μ}) α := rfl + +end JetGenerators + +/-- The formal total spacetime derivative on the space of component functions of + the charged-lepton singlet in the direction `μ`: the shift + `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the derivative multi-index, and likewise on the + conjugate components. -/ +noncomputable def JetComponentSpace.jetDeriv (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace →ₗ[ℂ] JetComponentSpace := + JetComponentSpace.basis.constr ℂ fun j => + JetComponentSpace.basis (JetGenerators.shift μ j) + +@[simp] +lemma JetComponentSpace.jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + JetComponentSpace.jetDeriv μ (JetComponentSpace.basis j) = + JetComponentSpace.basis (JetGenerators.shift μ j) := by + rw [JetComponentSpace.jetDeriv, Module.Basis.constr_basis] + +/-! + ## The jet algebra -/ @@ -662,6 +705,112 @@ lemma repJetGaugeGroupI_ofGenerator_ψ (g : JetGaugeGroupI) dualDerivAction_apply_symmetricAlgebra] simp only [hinl, TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] +/-! + +## The formal total derivative on the jet algebra + +The formal total spacetime derivative extends from the component functions to +the whole jet algebra as an even derivation: +`∂_μ (x y) = (∂_μ x) y + x (∂_μ y)`, with no Koszul signs. It is constructed by +lifting the generator map `ι x ↦ (ι x, ι (∂_μ x))` to an algebra homomorphism +into the trivial square-zero extension of the jet algebra; the square-zero +condition holds because degree-one elements of the exterior algebra +anticommute. + +-/ + +/-- The generator map of the total derivative into the trivial square-zero + extension of the jet algebra: `ι x ↦ (ι x, ι (∂_μ x))`. -/ +noncomputable def jetDerivGen (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace →ₗ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra where + toFun x := (ExteriorAlgebra.ι ℂ x, + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x)) + map_add' x y := by + simp only [map_add] + rfl + map_smul' c x := by + simp only [map_smul, RingHom.id_apply] + rfl + +@[simp] +lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl + +@[simp] +lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + (jetDerivGen μ x).snd = ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := rfl + +/-- The generator map squares to zero: degree-one elements of the exterior + algebra anticommute. -/ +lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDerivGen μ x * jetDerivGen μ x = 0 := by + refine TrivSqZeroExt.ext ?_ ?_ + · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, + TrivSqZeroExt.fst_zero] + · rw [TrivSqZeroExt.snd_mul, jetDerivGen_fst, jetDerivGen_snd, TrivSqZeroExt.snd_zero, + smul_eq_mul, op_smul_eq_mul] + exact ExteriorAlgebra.ι_add_mul_swap x (JetComponentSpace.jetDeriv μ x) + +/-- The lift of the total derivative to the trivial square-zero extension of the + jet algebra: the algebra homomorphism `x ↦ (x, ∂_μ x)`. -/ +noncomputable def jetDerivHom (μ : Fin 1 ⊕ Fin 3) : + JetAlgebra →ₐ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra := + ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ + +@[simp] +lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDerivHom μ (ExteriorAlgebra.ι ℂ x) = jetDerivGen μ x := by + rw [jetDerivHom, ExteriorAlgebra.lift_ι_apply] + +/-- The first component of the square-zero lift is the identity. -/ +@[simp] +lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + (jetDerivHom μ x).fst = x := by + have h : (TrivSqZeroExt.fstHom ℂ JetAlgebra JetAlgebra).comp (jetDerivHom μ) = + AlgHom.id ℂ JetAlgebra := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) + simp + exact DFunLike.congr_fun h x + +/-- The formal total spacetime derivative on the jet algebra of the + charged-lepton singlet in the direction `μ`: the even derivation extending the + shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the component functions. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra where + toFun x := (jetDerivHom μ x).snd + map_add' x y := congrArg TrivSqZeroExt.snd (map_add (jetDerivHom μ) x y) + map_smul' c x := congrArg TrivSqZeroExt.snd (map_smul (jetDerivHom μ) c x) + +lemma jetDeriv_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ x = (jetDerivHom μ x).snd := rfl + +@[simp] +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDeriv μ (ExteriorAlgebra.ι ℂ x) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := by + rw [jetDeriv_apply, jetDerivHom_ι, jetDerivGen_snd] + +/-- The total derivative appends the derivative index to each component + function. -/ +@[simp] +lemma jetDeriv_ofGenerator (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + jetDeriv μ (ofGenerator j) = ofGenerator (JetGenerators.shift μ j) := by + rw [ofGenerator, jetDeriv_ι, JetComponentSpace.jetDeriv_basis] + rfl + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := + congrArg TrivSqZeroExt.snd (map_one (jetDerivHom μ)) + +/-- The total derivative is an even derivation: the Leibniz rule holds on the + jet algebra with no Koszul signs. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + have h : jetDeriv μ (x * y) = + (jetDerivHom μ x).fst * jetDeriv μ y + jetDeriv μ x * (jetDerivHom μ y).fst := + congrArg TrivSqZeroExt.snd (map_mul (jetDerivHom μ) x y) + rw [jetDerivHom_fst, jetDerivHom_fst] at h + exact h.trans (add_comm _ _) + end JetAlgebra end LeptonSinglet diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index f5f175be9..e56649287 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -16,6 +16,7 @@ public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Particles.LagrangianTheory.Basic public import Physlib.Mathematics.MvPowerSeriesDerivative public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation /-! # The B boson @@ -1191,6 +1192,14 @@ lemma canon_eq_canon_iff (g g' : JetGenerators) : · intro h rw [canon, canon, h] +/-- The jet generator with one further derivative in the direction `μ`. -/ +def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators + | dB s ν => dB (s + {μ}) ν + +@[simp] +lemma shift_dB (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : + shift μ (dB s ν) = dB (s + {μ}) ν := rfl + end JetGenerators /-! @@ -1284,6 +1293,70 @@ noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := /-! +## The formal total derivative on the jet algebra + +The formal total spacetime derivative `∂_μ` acts on the component functions of +the B-boson jet by appending the derivative index, `∂_s B_ν ↦ ∂_{s + {μ}} B_ν`, +and extends to the jet algebra as a derivation. It is constructed through the +polynomial coordinates of the jet algebra. + +-/ + +/-- The formal total spacetime derivative on the B-boson jet algebra in the + direction `μ`: the derivation sending each component function `∂_s B_ν` to + `∂_{s + {μ}} B_ν`. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℝ] JetAlgebra := + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toLinearMap ∘ₗ + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.X (JetGenerators.shift μ g) : + MvPolynomial JetGenerators ℝ)).toLinearMap ∘ₗ + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toLinearMap + +/-- The total derivative appends the derivative index to each component + function. -/ +@[simp] +lemma jetDeriv_ofGenerator (μ : Fin 1 ⊕ Fin 3) (g : JetGenerators) : + jetDeriv μ (ofGenerator g) = ofGenerator (JetGenerators.shift μ g) := by + simp only [jetDeriv, ofGenerator, LinearMap.coe_comp, Function.comp_apply, + AlgEquiv.toLinearMap_apply, Derivation.coeFn_coe] + rw [SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.mkDerivation_X, + SymmetricAlgebra.equivMvPolynomial_symm_X] + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by + simp [jetDeriv] + +/-- The total derivative is a derivation: the Leibniz rule on the jet algebra. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, + AlgEquiv.toLinearMap_apply, map_mul, Derivation.coeFn_coe, Derivation.leibniz, + smul_eq_mul, map_add, AlgEquiv.symm_apply_apply] + ring + +/-- The Leibniz rule for the complexified total derivative on the complexified + jet algebra. -/ +lemma jetDeriv_baseChange_mul (μ : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] JetAlgebra) : + LinearMap.baseChange ℂ (jetDeriv μ) (x * y) = + LinearMap.baseChange ℂ (jetDeriv μ) x * y + + x * LinearMap.baseChange ℂ (jetDeriv μ) y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + ring + | tmul c b => + induction y using TensorProduct.induction_on with + | zero => simp + | add a' b' ha' hb' => + simp only [mul_add, map_add, ha', hb'] + ring + | tmul c' b' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, + jetDeriv_mul, TensorProduct.tmul_add] + +/-! + ## The field strength of the B boson -/ @@ -1317,6 +1390,13 @@ lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) (s : Multiset (F simp only [fieldStrengthDeriv, map_sub, ofGenerator, repJetGaugeGroupI_ι] rw [mcPairing_basis_dB_symm] abel + +lemma fieldStrengthDeriv_bianchi_identity (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν ρ : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv (s + {μ}) ν ρ + fieldStrengthDeriv (s + {ν}) ρ μ + + fieldStrengthDeriv (s + {ρ}) μ ν = 0 := by + simp only [fieldStrengthDeriv] + grind + /-! ## Invariance under the gauge group @@ -1398,18 +1478,9 @@ lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : rw [h2, h1] exact Algebra.subset_adjoin ⟨((s.erase p, p), ν), Set.mem_univ _, rfl⟩ -/-- An element of the jet algebra of the B boson is invariant under the jet gauge - group if and only if it is a polynomial in the derivatives of the field - strength. - - The forward direction is the completeness of the field strength and its - derivatives as gauge invariants: conjugating by the polynomial coordinates, - the jet gauge group acts by translating each component function by the - Maurer–Cartan pairing, which depends only on the total symmetrized - multi-index; the exponential jets `exp(-i a X^t)` realize arbitrary - independent translations of each total multi-index, and a polynomial invariant - under all of them is a polynomial in the differences of component functions - with equal totals, i.e. in the derivatives of the field strength. -/ +/-- An EFT lagrangian with field content consisting only of + a `B` bosons is invariant under the full gauge group if and only if + it can be written in terms of the field strength and derivatives thereof. -/ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : (∀ U, repJetGaugeGroupI U V = V) ↔ V ∈ Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by From 218c7de4696d0ac4072415d3632156a7991e33e8 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 10:45:24 +0100 Subject: [PATCH 086/254] fix: build Co-Authored-By: Claude --- Physlib/Particles/QED/JetAlgebra.lean | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index 94ca0f034..384f56293 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -193,11 +193,11 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : LinearMap.add_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply] congr 1 simp only [ofGenerator] - have h1 : BBoson.JetAlgebra.jetDeriv μ (1 : BBoson.JetAlgebra) = 0 := - BBoson.JetAlgebra.jetDeriv_one μ - rw [jetDeriv_tmul, LinearMap.baseChange_tmul, h1, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ] - simp [Multiset.empty_eq_zero] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] + end JetAlgebra From 190ebf4817d1237b39bcd1d47e68f31192b3a891 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:26:02 +0100 Subject: [PATCH 087/254] feat: Cleanup Co-Authored-By: Claude --- Physlib/Particles/LagrangianTheory/Basic.lean | 47 +- Physlib/Particles/QED/JetAlgebra.lean | 374 ++++++++++++ .../StandardModel/Fermions/LeptonDoublet.lean | 46 +- .../StandardModel/Fermions/LeptonSinglet.lean | 255 +++----- .../StandardModel/GaugeBosons/BBoson.lean | 457 ++++++++++++-- .../StandardModel/GaugeBosons/Gluons.lean | 2 +- .../StandardModel/GaugeGroup/Jet.lean | 334 +--------- .../GaugeGroup/MaurerCartan.lean | 308 ++++++++++ Physlib/Relativity/DerivAlgebra.lean | 576 ++++++++++++++++++ 9 files changed, 1818 insertions(+), 581 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean create mode 100644 Physlib/Relativity/DerivAlgebra.lean diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index e43d86993..ecc019590 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan module public import Physlib.Relativity.Fermions.Weyl.Metric +public import Physlib.Relativity.DerivAlgebra public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis @@ -236,18 +237,11 @@ noncomputable def FermionicComponentSpace.basis {L : LagrangianTheory G} : ((Pi.basis (fun φ => L.fermionBasis φ)).prod ((Pi.basis (fun φ => L.fermionBasis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm -/-- The basis of the symmetric algebra of dual jet slots, indexed by multisets of - spacetime indices. -/ -noncomputable def dualJetAlgebraBasis : - Basis (Multiset (Fin 1 ⊕ Fin 3)) ℂ (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) := - Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.reindex Multiset.toFinsupp.toEquiv.symm - - noncomputable def FermionicJetComponentSpace.basis {L : LagrangianTheory G} : Basis L.FermionicJetGenerator ℂ L.FermionicJetComponentSpace := - ((dualJetAlgebraBasis.tensorProduct + ((DerivAlgebraComplex.basis.tensorProduct (Pi.basis fun φ => L.fermionBasis φ).dualBasis).prod - (dualJetAlgebraBasis.tensorProduct + (DerivAlgebraComplex.basis.tensorProduct ((Pi.basis fun φ => L.fermionBasis φ).conj.dualBasis))).reindex fermionicJetGeneratorEquiv.symm @@ -291,29 +285,6 @@ noncomputable def jetAlgebraRepLorentzGroup : refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [map_mul, Module.End.mul_apply] -noncomputable def dualJetAlgebraRepLorentzGroup : - Representation ℂ SL(2,ℂ) (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where - toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ)).toLinearMap - map_one' := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual 1) = - AlgHom.id ℂ (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) by - rw [h]; rfl - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - simp - rfl - map_mul' Λ1 Λ2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual (Λ1 * Λ2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ2)) by - rw [h]; rfl - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - simp [map_mul, Module.End.mul_apply] - def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicTargetSpace where toFun Λ := LinearMap.piMap fun φ => L.fermionRepLorentzGroup φ Λ map_one' := by @@ -334,8 +305,8 @@ noncomputable def FermionicComponentSpace.repLorentzGroup : noncomputable def FermionicJetComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicJetComponentSpace := - (dualJetAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.dual).prod - (dualJetAlgebraRepLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.conj.dual) + (DerivAlgebraComplex.repLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.dual).prod + (DerivAlgebraComplex.repLorentzGroup.tprod FermionicTargetSpace.repLorentzGroup.conj.dual) noncomputable def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) L.FermionicEFTExclDeriv where toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ)).toLinearMap @@ -560,9 +531,9 @@ noncomputable def ComplexScalarComponentSpace.basis : noncomputable def ComplexScalarJetComponentSpace.basis : Basis L.ComplexScalarJetGenerator ℂ L.ComplexScalarJetComponentSpace := - ((dualJetAlgebraBasis.tensorProduct + ((DerivAlgebraComplex.basis.tensorProduct (Pi.basis fun φ => L.complexScalarBasis φ).dualBasis).prod - (dualJetAlgebraBasis.tensorProduct + (DerivAlgebraComplex.basis.tensorProduct ((Pi.basis fun φ => L.complexScalarBasis φ).conj.dualBasis))).reindex complexScalarJetGeneratorEquiv.symm @@ -593,8 +564,8 @@ noncomputable def ComplexScalarComponentSpace.repLorentzGroup : noncomputable def ComplexScalarJetComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) L.ComplexScalarJetComponentSpace := - (dualJetAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.dual).prod - (dualJetAlgebraRepLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.conj.dual) + (DerivAlgebraComplex.repLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.dual).prod + (DerivAlgebraComplex.repLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.conj.dual) noncomputable def ComplexScalarEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) L.ComplexScalarEFTExclDeriv where diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index 384f56293..9cc3a2f94 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -198,6 +198,380 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] +/-! + +## Covariance of the covariant derivatives + +The covariant derivatives of the charged lepton transform through the +hypercharge character of the value of the gauge jet at the base point alone: +`ρ_U (D_l ψ_α) = u(0)⁶ • D_l ψ_α`, with no derivative contributions. + +The proof works on the lepton-linear model of the `ψ`-sector: B-boson +polynomials tensored with a single unconjugated lepton component function. On +this model the gauge action `ρ`, the covariant step `D_μ`, and a family of +Maurer–Cartan anomaly operators `N_{s,μ}` satisfy a closed commutation algebra: + +* `ρ ∘ D_μ = D_μ ∘ ρ + ρ ∘ N_{[],μ}`, +* `N_{s,μ} ∘ D_ν = D_ν ∘ N_{s,μ} + N_{ν::s,μ}`, +* `N_{s,μ} ψ = 0` and `ρ ψ = u(0)⁶ • ψ`, + +so by induction every anomaly operator annihilates every covariant derivative, +and covariance propagates along the covariant-derivative recursion. + +-/ + +/-- The unconjugated lepton component functions. -/ +abbrev LeptonComponent : Type := + SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet + +/-- The lepton-linear elements: B-boson polynomials tensored with a single + unconjugated lepton component function. The covariant derivatives of `ψ` are + the images of such elements in the jet algebra. -/ +abbrev LeptonLinear : Type := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonComponent + +/-- The derivative action of a jet on the lepton component functions, acting on + the derivative symbols. -/ +noncomputable def actionC (χ : JetRing) : LeptonComponent →ₗ[ℂ] LeptonComponent := + TensorProduct.map (DerivAlgebraComplex.jetRingAction χ) LinearMap.id + +/-- The derivative-symbol shift on the lepton component functions. -/ +noncomputable def shiftC (ν : Fin 1 ⊕ Fin 3) : LeptonComponent →ₗ[ℂ] LeptonComponent := + TensorProduct.map (DerivAlgebraComplex.deriv ν) LinearMap.id + +lemma actionC_shiftC (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : LeptonComponent) : + actionC χ (shiftC ν a) = + shiftC ν (actionC χ a) + actionC (MvPowerSeries.pderiv ℂ ν χ) a := by + have h : (actionC χ) ∘ₗ (shiftC ν) = + (shiftC ν) ∘ₗ (actionC χ) + actionC (MvPowerSeries.pderiv ℂ ν χ) := by + simp only [actionC, shiftC] + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, + show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.deriv ν) = + (DerivAlgebraComplex.deriv ν) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) + + DerivAlgebraComplex.jetRingAction (MvPowerSeries.pderiv ℂ ν χ) from + LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_deriv χ ν b, + TensorProduct.map_add_left] + exact LinearMap.congr_fun h a + +lemma actionC_comm (χ ψ : JetRing) (a : LeptonComponent) : + actionC χ (actionC ψ a) = actionC ψ (actionC χ a) := by + have h : (actionC χ) ∘ₗ (actionC ψ) = (actionC ψ) ∘ₗ (actionC χ) := by + simp only [actionC] + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, + show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.jetRingAction ψ) = + (DerivAlgebraComplex.jetRingAction ψ) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) from + LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_comm χ ψ b] + exact LinearMap.congr_fun h a + +lemma actionC_mul (χ ψ : JetRing) (a : LeptonComponent) : + actionC (χ * ψ) a = actionC χ (actionC ψ a) := by + have h : actionC (χ * ψ) = (actionC χ) ∘ₗ (actionC ψ) := by + simp only [actionC] + rw [← TensorProduct.map_comp, LinearMap.id_comp, + DerivAlgebraComplex.jetRingAction_mul] + exact LinearMap.congr_fun h a + +lemma actionC_C (c : ℂ) (a : LeptonComponent) : + actionC (MvPowerSeries.C c : JetRing) a = c • a := by + have h : actionC (MvPowerSeries.C c : JetRing) = c • LinearMap.id := by + rw [actionC, DerivAlgebraComplex.jetRingAction_C, TensorProduct.map_smul_left, + TensorProduct.map_id] + rw [h] + rfl + +/-- The embedding of a lepton component function into the lepton jet algebra. -/ +noncomputable def leptonComponentIncl : + LeptonComponent →ₗ[ℂ] LeptonSinglet.JetAlgebra := + (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inl ℂ LeptonComponent + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) + +lemma leptonComponentIncl_apply (a : LeptonComponent) : + leptonComponentIncl a = + ExteriorAlgebra.ι ℂ ((a, 0) : LeptonSinglet.JetComponentSpace) := rfl + +/-- The inclusion of the lepton-linear elements into the QED jet algebra. -/ +noncomputable def leptonLinearIncl : LeptonLinear →ₗ[ℂ] JetAlgebra := + TensorProduct.map LinearMap.id leptonComponentIncl + +lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : LeptonComponent) : + leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] leptonComponentIncl a := by + simp [leptonLinearIncl] + +/-- The covariant-derivative step `D_μ = ∂_μ + 6 i B_μ` on lepton-linear + elements. -/ +noncomputable def covariantStepAux (μ : Fin 1 ⊕ Fin 3) : + LeptonLinear →ₗ[ℂ] LeptonLinear := + TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) + LinearMap.id + + TensorProduct.map LinearMap.id (shiftC μ) + + ((6 : ℂ) * Complex.I) • + TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id + +lemma covariantStepAux_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : LeptonComponent) : + covariantStepAux μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + + p ⊗ₜ[ℂ] shiftC μ a + + ((6 : ℂ) * Complex.I) • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by + simp [covariantStepAux] + +/-- The gauge action on lepton-linear elements. -/ +noncomputable def repAux (U : JetGaugeGroupI) : LeptonLinear →ₗ[ℂ] LeptonLinear := + TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) + (actionC (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) + +lemma repAux_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : LeptonComponent) : + repAux U (p ⊗ₜ[ℂ] a) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + actionC (((U.2.2 : unitary JetRing) : JetRing) ^ 6) a := by + simp [repAux] + +/-- The Maurer–Cartan anomaly operators on lepton-linear elements: the + obstruction to the gauge action commuting with the covariant step, indexed by + the derivative history of the step. -/ +noncomputable def anomalyAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : LeptonLinear →ₗ[ℂ] LeptonLinear := + TensorProduct.map (LinearMap.baseChange ℂ + (BBoson.JetAlgebra.mcDeriv u (↑s + {μ}))) LinearMap.id + + ((6 : ℂ) * Complex.I * ((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id - + ((6 : ℂ) * Complex.I) • + TensorProduct.map LinearMap.id (actionC (BBoson.mcSeriesDeriv u μ s)) + +lemma anomalyAux_tmul (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : LeptonComponent) : + anomalyAux u s μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv u (↑s + {μ})) p) ⊗ₜ[ℂ] a + + ((6 : ℂ) * Complex.I * ((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) - + ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.mcSeriesDeriv u μ s) a) := by + simp [anomalyAux] + +/-- The zeroth-order lepton component as a lepton-linear element. -/ +noncomputable def ψAux (α : Fin 2) : LeptonLinear := + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α) + +/-- The covariant derivative as a lepton-linear element. -/ +noncomputable def DψAux (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : LeptonLinear := + l.foldr (fun μ x => covariantStepAux μ x) (ψAux α) + +/-- The derivative actions of the Maurer–Cartan series and of a hypercharge + power commute. -/ +lemma actionC_mcSeries_pow (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) + (a : LeptonComponent) : + actionC (BBoson.mcSeries u μ) (actionC ((u : JetRing) ^ q) a) = + actionC ((u : JetRing) ^ q) (actionC (BBoson.mcSeries u μ) a) := + actionC_comm _ _ a + +/-- The derivative action of a jet on the zeroth-order lepton component: the + scalar action of its value at the base point. -/ +lemma actionC_one_tmul (χ : JetRing) (φ : Module.Dual ℂ LeptonSinglet) : + actionC χ ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) = + MvPowerSeries.constantCoeff χ • + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) := by + rw [actionC, TensorProduct.map_tmul, DerivAlgebraComplex.jetRingAction_apply_one, + LinearMap.id_coe, id_eq, TensorProduct.smul_tmul'] + +/-- The gauge action commutes with the covariant step up to the gauge action of + the zeroth anomaly operator. -/ +lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (x : LeptonLinear) : + repAux U (covariantStepAux μ x) = + covariantStepAux μ (repAux U x) + repAux U (anomalyAux U.2.2 [] μ x) := by + have h0 : (↑([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [Multiset.coe_nil, zero_add] + have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by + intro z + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [mul_add, ha, hb] + | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] + have key : (repAux U) ∘ₗ (covariantStepAux μ) = + (covariantStepAux μ) ∘ₗ (repAux U) + (repAux U) ∘ₗ (anomalyAux U.2.2 [] μ) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepAux_tmul, + anomalyAux_tmul, BBoson.mcSeriesDeriv_nil, map_add, map_smul, map_sub, + repAux_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] + simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, + actionC_shiftC, BBoson.pderiv_pow_unitary, actionC_mul, actionC_C, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, + actionC_mcSeries_pow] + have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB 0 μ) + + ((BBoson.mcPairing U.2.2 (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + + ((BBoson.mcPairing U.2.2 (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by + rw [add_mul, smul_mul_assoc, hone] + simp only [hdist] + simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', + TensorProduct.tmul_smul, smul_add, smul_smul] + push_cast + module + exact LinearMap.congr_fun key x + +/-- The anomaly operators commute with the covariant step up to the anomaly + operator with the derivative direction appended to its history. -/ +lemma anomalyAux_covariantStepAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : + anomalyAux u s μ (covariantStepAux ν x) = + covariantStepAux ν (anomalyAux u s μ x) + anomalyAux u (ν :: s) μ x := by + have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = + (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by + rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by + rw [Multiset.singleton_add, Multiset.cons_coe]] + ac_rfl + have hshift : BBoson.JetGenerators.shiftMulti ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + (BBoson.JetGenerators.dB {} ν) = + BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by + rw [BBoson.JetGenerators.shiftMulti_dB] + congr 1 + have hm : BBoson.mcPairing u (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = + BBoson.mcPairing u (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by + rw [BBoson.mcPairing_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = + ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by + rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] + have key : (anomalyAux u s μ) ∘ₗ (covariantStepAux ν) = + (covariantStepAux ν) ∘ₗ (anomalyAux u s μ) + anomalyAux u (ν :: s) μ := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepAux_tmul, + anomalyAux_tmul, map_add, map_smul, map_sub, BBoson.mcSeriesDeriv_cons] + simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, + BBoson.JetAlgebra.mcDeriv_baseChange_mul, + BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] + have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by + intro z + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [mul_add, ha, hb] + | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] + have hdist : (((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = + ((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • + p := by + rw [smul_mul_assoc, hone] + simp only [hdist] + simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', + smul_add, smul_smul] + module + exact LinearMap.congr_fun key x + +/-- The anomaly operators annihilate the zeroth-order lepton component: the + constant coefficient of the iterated Maurer–Cartan derivative is the + Maurer–Cartan pairing. -/ +lemma anomalyAux_ψAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + anomalyAux u s μ (ψAux α) = 0 := by + rw [ψAux, anomalyAux_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, actionC_one_tmul, BBoson.constantCoeff_mcSeriesDeriv, + TensorProduct.tmul_smul, smul_smul, zero_add, sub_self] + +/-- The gauge action on the zeroth-order lepton component is the hypercharge + character of the value of the jet at the base point. -/ +lemma repAux_ψAux (U : JetGaugeGroupI) (α : Fin 2) : + repAux U (ψAux α) = + MvPowerSeries.constantCoeff (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + ψAux α := by + rw [ψAux, repAux_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] + simp only [BBoson.JetAlgebra.repJetGaugeGroupI_one, actionC_one_tmul, + TensorProduct.tmul_smul] + +/-- Every anomaly operator annihilates every covariant derivative of the charged + lepton. -/ +lemma anomalyAux_DψAux (u : unitary JetRing) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), + anomalyAux u s μ (DψAux l α) = 0 := by + induction l with + | nil => exact fun s μ => anomalyAux_ψAux u s μ α + | cons ν l ih => + intro s μ + rw [show DψAux (ν :: l) α = covariantStepAux ν (DψAux l α) from rfl, + anomalyAux_covariantStepAux, ih s μ, map_zero, zero_add, ih (ν :: s) μ] + +/-- Covariance of the covariant derivatives on the lepton-linear model. -/ +lemma repAux_DψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repAux U (DψAux l α) = + MvPowerSeries.constantCoeff (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + DψAux l α := by + induction l with + | nil => exact repAux_ψAux U α + | cons ν l ih => + rw [show DψAux (ν :: l) α = covariantStepAux ν (DψAux l α) from rfl, + repAux_covariantStepAux, ih, map_smul, anomalyAux_DψAux U.2.2 l α [] ν, map_zero, + add_zero] + +/-- The inclusion intertwines the covariant steps. -/ +lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : + covariantStep μ (leptonLinearIncl x) = leptonLinearIncl (covariantStepAux μ x) := by + have key : (covariantStep μ) ∘ₗ leptonLinearIncl = + leptonLinearIncl ∘ₗ (covariantStepAux μ) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covariantStepAux_tmul, + leptonComponentIncl_apply, covariantStep, LinearMap.add_apply, + LinearMap.smul_apply, LinearMap.mulLeft_apply, map_add, map_smul, + jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, + LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + exact LinearMap.congr_fun key x + +/-- The inclusion intertwines the gauge actions. -/ +lemma repJetGaugeGroupI_leptonLinearIncl (U : JetGaugeGroupI) (x : LeptonLinear) : + repJetGaugeGroupI U (leptonLinearIncl x) = leptonLinearIncl (repAux U x) := by + have key : (repJetGaugeGroupI U) ∘ₗ leptonLinearIncl = + leptonLinearIncl ∘ₗ (repAux U) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, repAux_tmul, + leptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, + TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl', + actionC] + exact LinearMap.congr_fun key x + +/-- The covariant derivatives are the images of their lepton-linear models. -/ +lemma Dψ_eq_leptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α = leptonLinearIncl (DψAux l α) := by + induction l with + | nil => + rw [Dψ_nil, show DψAux [] α = ψAux α from rfl, ψAux, leptonLinearIncl_tmul, + leptonComponentIncl_apply] + simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, + LeptonSinglet.JetComponentSpace.basis_dψ_nil] + | cons ν l ih => + rw [Dψ_cons, ih, covariantStep_leptonLinearIncl] + rfl + +/-- Covariance of the covariant derivatives of the charged lepton: a jet of + gauge transformations acts on `D_l ψ_α` through the hypercharge character of + its value at the base point alone, with no derivative contributions. This is + the statement that the covariant derivative of a charged field is again a + charged field of the same charge. -/ +lemma repJetGaugeGroupI_Dψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U (Dψ l α) = U.eval.2.2 ^ 6 • Dψ l α := by + have hval : ((U.eval.2.2 : unitary ℂ) : ℂ) = + MvPowerSeries.constantCoeff ((U.2.2 : unitary JetRing) : JetRing) := rfl + rw [Dψ_eq_leptonLinearIncl, repJetGaugeGroupI_leptonLinearIncl, repAux_DψAux, + map_smul, ← Dψ_eq_leptonLinearIncl, Submonoid.smul_def, SubmonoidClass.coe_pow, + hval, map_pow] end JetAlgebra diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index c1d8ee1aa..325642e7e 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -314,8 +314,8 @@ The `(1, 2)_{-3}` representation extends verbatim to jets: the hypercharge power series `star u ^ 3` and the `SU(2)` power-series matrix of a jet of gauge transformations combine into a matrix of jets, `jetGaugeMatrix`. This matrix acts on the polynomial jet space -`SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet` through the entrywise -derivative action `derivAction` on the derivative symbols, moving the weak index +`SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet` through the entrywise +derivative action `DerivAlgebraComplex.jetRingAction` on the derivative symbols, moving the weak index and leaving the Weyl factor fixed: the value of the jet acts by the gauge matrix, while its derivative coordinates lower derivative symbols by the Leibniz rule. On jets of constant gauge transformations the action reduces to the global gauge @@ -359,22 +359,22 @@ lemma toEuclideanLin_single_single (i j j' : Fin 2) : · simp [Matrix.toEuclideanLin, h] /-- The action of a matrix of jets on the jet space of the lepton doublet: each - entry acts through the derivative action `derivAction` on the derivative symbols + entry acts through the derivative action `DerivAlgebraComplex.jetRingAction` on the derivative symbols while moving the weak index; the Weyl factor is fixed. -/ noncomputable def jetMatrixAction (A : Matrix (Fin 2) (Fin 2) JetRing) : - SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet →ₗ[ℂ] - SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet := + SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet →ₗ[ℂ] + SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet := ∑ i, ∑ j, - TensorProduct.map (derivAction (A i j)) + TensorProduct.map (DerivAlgebraComplex.jetRingAction (A i j)) (valLinEquiv.symm.toLinearMap ∘ₗ TensorProduct.map LinearMap.id ((Matrix.single i j (1 : ℂ)).toEuclideanLin) ∘ₗ valLinEquiv.toLinearMap) /-- The action of a matrix of jets on a generator of the jet space. -/ lemma jetMatrixAction_tmul (A : Matrix (Fin 2) (Fin 2) JetRing) - (p : SymmetricAlgebra ℂ Lorentz.CoℂModule) (w : Fermion.LeftHandedWeyl) (j : Fin 2) : + (p : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) (w : Fermion.LeftHandedWeyl) (j : Fin 2) : jetMatrixAction A (p ⊗ₜ[ℂ] ⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩) = - ∑ i, derivAction (A i j) p ⊗ₜ[ℂ] + ∑ i, DerivAlgebraComplex.jetRingAction (A i j) p ⊗ₜ[ℂ] (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet) := by rw [jetMatrixAction, LinearMap.sum_apply] refine Finset.sum_congr rfl fun i _ => ?_ @@ -391,14 +391,14 @@ lemma basis_apply (k j : Fin 2) : simp [basis, Module.Basis.tensorProduct_apply, valLinEquiv_symm_apply] lemma jetMatrixAction_one : jetMatrixAction 1 = LinearMap.id := by - apply (Lorentz.complexCoBasis.symmetricAlgebra.tensorProduct basis).ext + apply (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.tensorProduct basis).ext rintro ⟨m, k, j⟩ rw [Module.Basis.tensorProduct_apply', basis_apply, jetMatrixAction_tmul] - fin_cases j <;> simp [Matrix.one_apply, apply_ite derivAction] + fin_cases j <;> simp [Matrix.one_apply, apply_ite DerivAlgebraComplex.jetRingAction] lemma jetMatrixAction_mul (A B : Matrix (Fin 2) (Fin 2) JetRing) : jetMatrixAction (A * B) = jetMatrixAction A ∘ₗ jetMatrixAction B := by - apply (Lorentz.complexCoBasis.symmetricAlgebra.tensorProduct basis).ext + apply (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.tensorProduct basis).ext rintro ⟨m, k, j⟩ rw [Module.Basis.tensorProduct_apply', basis_apply] simp only [LinearMap.coe_comp, Function.comp_apply] @@ -408,11 +408,11 @@ lemma jetMatrixAction_mul (A B : Matrix (Fin 2) (Fin 2) JetRing) : refine Finset.sum_congr rfl fun i _ => ?_ rw [← TensorProduct.sum_tmul] congr 1 - have h : derivAction ((A * B) i j) = ∑ l, derivAction (A i l) * derivAction (B l j) := by + have h : DerivAlgebraComplex.jetRingAction ((A * B) i j) = ∑ l, DerivAlgebraComplex.jetRingAction (A i l) * DerivAlgebraComplex.jetRingAction (B l j) := by rw [Matrix.mul_apply, - show derivAction (∑ l, A i l * B l j) = derivActionHom (∑ l, A i l * B l j) from rfl, + show DerivAlgebraComplex.jetRingAction (∑ l, A i l * B l j) = DerivAlgebraComplex.jetRingActionHom (∑ l, A i l * B l j) from rfl, map_sum] - exact Finset.sum_congr rfl fun l _ => map_mul derivActionHom _ _ + exact Finset.sum_congr rfl fun l _ => map_mul DerivAlgebraComplex.jetRingActionHom _ _ rw [h, LinearMap.sum_apply] exact Finset.sum_congr rfl fun l _ => rfl @@ -423,7 +423,7 @@ lemma jetMatrixAction_mul (A B : Matrix (Fin 2) (Fin 2) JetRing) : matrix, and its derivative coordinates act by the Leibniz rule. -/ noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI - (SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet) where + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet) where toFun U := jetMatrixAction (jetGaugeMatrix U) map_one' := by rw [jetGaugeMatrix_one, jetMatrixAction_one] @@ -434,7 +434,7 @@ noncomputable def repJetGaugeGroupI : @[simp] lemma repJetGaugeGroupI_apply (U : JetGaugeGroupI) - (x : SymmetricAlgebra ℂ Lorentz.CoℂModule ⊗[ℂ] LeptonDoublet) : + (x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet) : repJetGaugeGroupI U x = jetMatrixAction (jetGaugeMatrix U) x := rfl /-- The entries of the gauge matrix of a jet of a constant gauge transformation are @@ -448,7 +448,7 @@ lemma jetGaugeMatrix_ofConstant (g : GaugeGroupI) (i j : Fin 2) : show (((JetGaugeGroupI.ofConstant g).2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) i j = MvPowerSeries.C (g.toSU2.1 i j) from rfl, - MvPowerSeries.star_C, ← map_pow, smul_eq_mul, ← map_mul] + JetRing.star_C, ← map_pow, smul_eq_mul, ← map_mul] /-- On jets of constant gauge transformations the jet action reduces to the global gauge action on the jet space: the `(1, 2)_{-3}` action on the target factor and @@ -456,13 +456,13 @@ lemma jetGaugeMatrix_ofConstant (g : GaugeGroupI) (i j : Fin 2) : lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = TensorProduct.map LinearMap.id (repGaugeGroupI g) := by - apply (Lorentz.complexCoBasis.symmetricAlgebra.tensorProduct basis).ext + apply (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.tensorProduct basis).ext rintro ⟨m, k, j⟩ rw [Module.Basis.tensorProduct_apply', basis_apply, repJetGaugeGroupI_apply, jetMatrixAction_tmul, TensorProduct.map_tmul, LinearMap.id_apply, repGaugeGroupI_tmul_basis_eq_sum, TensorProduct.tmul_sum] refine Finset.sum_congr rfl fun i _ => ?_ - rw [jetGaugeMatrix_ofConstant, derivAction_C, LinearMap.smul_apply, LinearMap.id_apply] + rw [jetGaugeMatrix_ofConstant, DerivAlgebraComplex.jetRingAction_C, LinearMap.smul_apply, LinearMap.id_apply] exact TensorProduct.smul_tmul _ _ _ /-- The jet action on a first-order derivative symbol is the Leibniz rule: the @@ -472,18 +472,18 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : lemma repJetGaugeGroupI_ι_tmul (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (w : Fermion.LeftHandedWeyl) (j : Fin 2) : repJetGaugeGroupI U - (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] + (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) (Lorentz.complexCoBasis.dualBasis μ) ⊗ₜ[ℂ] ⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩) = ∑ i, (MvPowerSeries.constantCoeff (jetGaugeMatrix U i j) • - (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) ⊗ₜ[ℂ] + (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) (Lorentz.complexCoBasis.dualBasis μ) ⊗ₜ[ℂ] (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet)) + MvPowerSeries.coeff (Finsupp.single μ 1) (jetGaugeMatrix U i j) • - ((1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) ⊗ₜ[ℂ] + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet))) := by rw [repJetGaugeGroupI_apply, jetMatrixAction_tmul] refine Finset.sum_congr rfl fun i _ => ?_ - rw [derivAction_apply_ι, TensorProduct.add_tmul, TensorProduct.smul_tmul', + rw [DerivAlgebraComplex.jetRingAction_apply_ι, TensorProduct.add_tmul, TensorProduct.smul_tmul', TensorProduct.smul_tmul'] end LeptonDoublet diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 64ad332fc..a5a465b2c 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -142,7 +142,7 @@ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonSinglet /-! -## D. Gauge action +## D. Global Gauge action The colour and weak factors act trivially, so the gauge group acts only through hypercharge. The `U(1)` action is `star z ^ 6`; since `z` is unitary, `star z = z⁻¹`, so this represents @@ -286,27 +286,11 @@ abbrev JetComponentSpace := Module.Dual ℂ (ConjModule LeptonSinglet)) noncomputable def JetComponentSpace.basis : Module.Basis JetGenerators ℂ JetComponentSpace := - ((dualJetAlgebraBasis.tensorProduct + ((DerivAlgebraComplex.basis.tensorProduct LeptonSinglet.basis.dualBasis).prod - (dualJetAlgebraBasis.tensorProduct + (DerivAlgebraComplex.basis.tensorProduct (LeptonSinglet.basis.conj.dualBasis))).reindex JetGenerators.equiv.symm -/-- The dual jet algebra basis vector at a multiset of derivative indices is the - corresponding basis monomial of the symmetric algebra of dual symbols. -/ -lemma dualJetAlgebraBasis_apply (s : Multiset (Fin 1 ⊕ Fin 3)) : - dualJetAlgebraBasis s = - Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by - rw [dualJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] - rfl - -/-- The dual jet algebra basis vector at the empty multiset is the unit of the - algebra: the zeroth-order component function carries no derivative symbols. -/ -lemma dualJetAlgebraBasis_nil : - dualJetAlgebraBasis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by - rw [dualJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm, - show Multiset.toFinsupp.toEquiv ({} : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp] - exact Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_zero - /-- The basis vector of the jet component space at the zeroth-order singlet generator: the unit of the dual jet algebra tensored with the dual basis of the singlet, in the first (unconjugated) factor. -/ @@ -318,20 +302,9 @@ lemma JetComponentSpace.basis_dψ_nil (α : Fin 2) : show JetGenerators.equiv.symm.symm (.dψ {} α) = Sum.inl ({}, α) from rfl] refine Prod.ext ?_ ?_ · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', - dualJetAlgebraBasis_nil] + DerivAlgebraComplex.basis_nil] · rw [Module.Basis.prod_apply_inl_snd] -/-- The dual jet algebra basis vector at a singleton multiset is the corresponding - dual derivative symbol. -/ -lemma dualJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : - dualJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ) := by - rw [dualJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm, - show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - Finsupp.single μ 1 by simp] - exact Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_single μ - /-- The basis vector of the jet component space at a first-order singlet generator: the dual derivative symbol tensored with the dual basis of the singlet, in the first (unconjugated) factor. -/ @@ -344,7 +317,7 @@ lemma JetComponentSpace.basis_dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) show JetGenerators.equiv.symm.symm (.dψ {μ} α) = Sum.inl ({μ}, α) from rfl] refine Prod.ext ?_ ?_ · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', - dualJetAlgebraBasis_singleton] + DerivAlgebraComplex.basis_singleton] · rw [Module.Basis.prod_apply_inl_snd] /-- The basis vector of the jet component space at a general singlet generator: @@ -353,7 +326,7 @@ lemma JetComponentSpace.basis_dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) factor. -/ lemma JetComponentSpace.basis_dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetComponentSpace.basis (.dψ s α) = - (dualJetAlgebraBasis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) := by + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) := by rw [JetComponentSpace.basis, Module.Basis.reindex_apply, show JetGenerators.equiv.symm.symm (.dψ s α) = Sum.inl (s, α) from rfl] refine Prod.ext ?_ ?_ @@ -362,116 +335,8 @@ lemma JetComponentSpace.basis_dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) noncomputable def JetComponentSpace.repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetComponentSpace := - (dualJetAlgebraRepLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual).prod - (dualJetAlgebraRepLorentzGroup.tprod LeptonSinglet.repLorentzGroup.conj.dual) - -/-- The identification of the algebra of derivative symbols with the dual jet - algebra, matching the monomial basis of derivative symbols with the monomial - basis of dual derivative symbols. -/ -noncomputable def dualJetAlgebraEquiv : - SymmetricAlgebra ℂ Lorentz.CoℂModule ≃ₗ[ℂ] - SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) := - Lorentz.complexCoBasis.symmetricAlgebra.equiv - Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (Equiv.refl _) - -/-- The derivative action of a jet `χ` on the dual jet algebra: the transport of - `derivAction χ` through the basis identification `dualJetAlgebraEquiv`. The - component functions of the derivative coordinates transform by the same Leibniz - rule as the derivative symbols themselves. -/ -noncomputable def dualDerivAction (χ : JetRing) : - SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) →ₗ[ℂ] - SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) := - dualJetAlgebraEquiv.toLinearMap ∘ₗ derivAction χ ∘ₗ dualJetAlgebraEquiv.symm.toLinearMap - -@[simp] -lemma dualDerivAction_one : dualDerivAction (1 : JetRing) = LinearMap.id := by - refine LinearMap.ext fun x => ?_ - simp [dualDerivAction] - -lemma dualDerivAction_mul (χ ψ : JetRing) : - dualDerivAction (χ * ψ) = dualDerivAction χ ∘ₗ dualDerivAction ψ := by - refine LinearMap.ext fun x => ?_ - simp [dualDerivAction, derivAction_mul] - -@[simp] -lemma dualJetAlgebraEquiv_one : dualJetAlgebraEquiv 1 = 1 := by - rw [show (1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) = - Lorentz.complexCoBasis.symmetricAlgebra 0 from - Lorentz.complexCoBasis.symmetricAlgebra_zero.symm, - dualJetAlgebraEquiv, Module.Basis.equiv_apply] - simpa using Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_zero - -/-- The dual derivative action on the zeroth-order component function: it is - scaled by the value of the jet at the base point, with no derivative - contributions. -/ -@[simp] -lemma dualDerivAction_apply_one (χ : JetRing) : - dualDerivAction χ (1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) = - MvPowerSeries.constantCoeff χ • 1 := by - have h1 : dualJetAlgebraEquiv.symm - (1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) = 1 := by - rw [← dualJetAlgebraEquiv_one, LinearEquiv.symm_apply_apply] - simp [dualDerivAction, h1] - -@[simp] -lemma dualJetAlgebraEquiv_ι (μ : Fin 1 ⊕ Fin 3) : - dualJetAlgebraEquiv (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule - (Lorentz.complexCoBasis μ)) = - SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ) := by - rw [← Lorentz.complexCoBasis.symmetricAlgebra_single μ, - ← Lorentz.complexCoBasis.dualBasis.symmetricAlgebra_single μ, - dualJetAlgebraEquiv, Module.Basis.equiv_apply, Equiv.refl_apply] - -/-- The dual derivative action on a first-order dual derivative symbol implements - the Leibniz rule, mirroring `derivAction_apply_ι`: the value of the jet - multiplies the symbol, and its first derivative feeds the zeroth-order component - function. -/ -lemma dualDerivAction_apply_ι (χ : JetRing) (μ : Fin 1 ⊕ Fin 3) : - dualDerivAction χ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ)) = - MvPowerSeries.constantCoeff χ • - SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ) + - MvPowerSeries.coeff (Finsupp.single μ 1) χ • 1 := by - have h1 : dualJetAlgebraEquiv.symm (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ)) = - SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) := by - rw [← dualJetAlgebraEquiv_ι, LinearEquiv.symm_apply_apply] - rw [show dualDerivAction χ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ)) = - dualJetAlgebraEquiv (derivAction χ (dualJetAlgebraEquiv.symm - (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ)))) from rfl, - h1, derivAction_apply_ι, map_add, map_smul, map_smul, dualJetAlgebraEquiv_ι, - dualJetAlgebraEquiv_one] - -@[simp] -lemma dualJetAlgebraEquiv_symmetricAlgebra (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - dualJetAlgebraEquiv (Lorentz.complexCoBasis.symmetricAlgebra m) = - Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m := by - rw [dualJetAlgebraEquiv, Module.Basis.equiv_apply, Equiv.refl_apply] - -/-- The dual derivative action on a general monomial of dual derivative symbols: - the all-orders Leibniz rule, mirroring the definition of `derivAction`. Each - splitting `m = p.1 + p.2` contributes the `p.1`-th Taylor coefficient of the - jet, with the divided-power multiplicity, times the lower monomial `p.2`. -/ -lemma dualDerivAction_apply_symmetricAlgebra (χ : JetRing) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - dualDerivAction χ (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = - ∑ p ∈ Finset.antidiagonal m, - ((∏ μ, (m μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 χ • - Lorentz.complexCoBasis.dualBasis.symmetricAlgebra p.2 := by - have h1 : dualJetAlgebraEquiv.symm - (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = - Lorentz.complexCoBasis.symmetricAlgebra m := by - rw [← dualJetAlgebraEquiv_symmetricAlgebra, LinearEquiv.symm_apply_apply] - rw [show dualDerivAction χ (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = - dualJetAlgebraEquiv (derivAction χ (dualJetAlgebraEquiv.symm - (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m))) from rfl, - h1, derivAction, Module.Basis.constr_basis, map_sum] - refine Finset.sum_congr rfl fun p hp => ?_ - rw [map_smul, map_smul, dualJetAlgebraEquiv_symmetricAlgebra] + (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual).prod + (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.conj.dual) /-- The action of the jet gauge group on the dual jet algebra of the charged-lepton singlet's component functions. Component functions transform @@ -481,10 +346,10 @@ lemma dualDerivAction_apply_symmetricAlgebra (χ : JetRing) (m : (Fin 1 ⊕ Fin noncomputable def dualJetAlgebraRepJetGaugeGroupI : Representation ℂ JetGaugeGroupI (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where - toFun U := dualDerivAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) + toFun U := DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) map_one' := by rw [show (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = - (1 : JetRing) by simp, dualDerivAction_one] + (1 : JetRing) by simp, DerivAlgebraComplex.jetRingAction_one] rfl map_mul' U₁ U₂ := by rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = @@ -493,7 +358,7 @@ noncomputable def dualJetAlgebraRepJetGaugeGroupI : rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) from rfl, mul_pow], - dualDerivAction_mul, Module.End.mul_eq_comp] + DerivAlgebraComplex.jetRingAction_mul, Module.End.mul_eq_comp] /-- The action of the jet gauge group on the dual jet algebra of the conjugate charged-lepton singlet's component functions: the conjugate components @@ -502,10 +367,10 @@ noncomputable def dualJetAlgebraRepJetGaugeGroupI : noncomputable def dualJetAlgebraRepJetGaugeGroupIConj : Representation ℂ JetGaugeGroupI (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where - toFun U := dualDerivAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) + toFun U := DerivAlgebraComplex.jetRingAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) map_one' := by rw [show (star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = - (1 : JetRing) by simp, dualDerivAction_one] + (1 : JetRing) by simp, DerivAlgebraComplex.jetRingAction_one] rfl map_mul' U₁ U₂ := by rw [show (star (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = @@ -514,17 +379,17 @@ noncomputable def dualJetAlgebraRepJetGaugeGroupIConj : rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) from rfl, star_mul', mul_pow], - dualDerivAction_mul, Module.End.mul_eq_comp] + DerivAlgebraComplex.jetRingAction_mul, Module.End.mul_eq_comp] @[simp] lemma dualJetAlgebraRepJetGaugeGroupI_apply (U : JetGaugeGroupI) : dualJetAlgebraRepJetGaugeGroupI U = - dualDerivAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) := rfl + DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) := rfl @[simp] lemma dualJetAlgebraRepJetGaugeGroupIConj_apply (U : JetGaugeGroupI) : dualJetAlgebraRepJetGaugeGroupIConj U = - dualDerivAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) := rfl + DerivAlgebraComplex.jetRingAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) := rfl /-- The `(1, 1)_{-6}` action of the jet gauge group on the space of component functions of the charged-lepton singlet, its conjugate, and their derivative @@ -542,6 +407,39 @@ noncomputable def JetComponentSpace.repJetGaugeGroupI : (dualJetAlgebraRepJetGaugeGroupIConj.tprod (Representation.trivial ℂ JetGaugeGroupI (Module.Dual ℂ (ConjModule LeptonSinglet)))) +/-- The jet gauge action preserves the unconjugated half of the component space, + acting there by the dual derivative action of the contragredient hypercharge + power series on the derivative symbols. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inl (U : JetGaugeGroupI) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.repJetGaugeGroupI U ((a ⊗ₜ[ℂ] φ, 0) : JetComponentSpace) = + ((DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) a) ⊗ₜ[ℂ] φ, 0) := by + refine Prod.ext ?_ ?_ <;> + simp [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply] + +/-- The jet gauge action on a general element of the unconjugated half of the + component space. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inl' (U : JetGaugeGroupI) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.repJetGaugeGroupI U ((y, 0) : JetComponentSpace) = + ((TensorProduct.map (DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) + LinearMap.id) y, 0) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((a + b, 0) : JetComponentSpace) = (a, 0) + (b, 0) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.repJetGaugeGroupI_inl, TensorProduct.map_tmul] + rfl + /-- The first-order Taylor coefficient of a hypercharge power of a `U(1)` jet: the analogue of `BBoson.coeff_single_star_pow` for the contragredient character `u ^ q`, with the sign of the Maurer–Cartan term reversed. -/ @@ -601,6 +499,53 @@ lemma JetComponentSpace.jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators JetComponentSpace.basis (JetGenerators.shift μ j) := by rw [JetComponentSpace.jetDeriv, Module.Basis.constr_basis] +/-- The total derivative preserves the unconjugated half of the component space, + acting there by the shift of dual derivative symbols. -/ +lemma JetComponentSpace.jetDeriv_inl (μ : Fin 1 ⊕ Fin 3) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.jetDeriv μ ((a ⊗ₜ[ℂ] φ, 0) : JetComponentSpace) = + ((DerivAlgebraComplex.deriv μ a) ⊗ₜ[ℂ] φ, 0) := by + have h : (JetComponentSpace.jetDeriv μ) ∘ₗ (LinearMap.inl ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + (LinearMap.inl ℂ _ _) ∘ₗ (TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) := by + refine (DerivAlgebraComplex.basis.tensorProduct LeptonSinglet.basis.dualBasis).ext + fun p => ?_ + obtain ⟨s, α⟩ := p + rw [Module.Basis.tensorProduct_apply'] + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.inl_apply, + TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [show ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) : + JetComponentSpace) = JetComponentSpace.basis (.dψ s α) from + (JetComponentSpace.basis_dψ s α).symm, + JetComponentSpace.jetDeriv_basis, JetGenerators.shift_dψ, + JetComponentSpace.basis_dψ, DerivAlgebraComplex.deriv_basis_multiset] + have h1 := LinearMap.congr_fun h (a ⊗ₜ[ℂ] φ) + simpa using h1 + +/-- The total derivative on a general element of the unconjugated half of the + component space. -/ +lemma JetComponentSpace.jetDeriv_inl' (μ : Fin 1 ⊕ Fin 3) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.jetDeriv μ ((y, 0) : JetComponentSpace) = + ((TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) y, 0) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((a + b, 0) : JetComponentSpace) = (a, 0) + (b, 0) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.jetDeriv_inl, TensorProduct.map_tmul] + rfl + /-! ## The jet algebra @@ -639,7 +584,7 @@ lemma repJetGaugeGroupI_ofGenerator_ψ_nil (g : JetGaugeGroupI) (α : Fin 2) : simp only [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, Representation.trivial_apply, map_zero, TensorProduct.map_tmul, - dualDerivAction_apply_one, map_pow, ← TensorProduct.smul_tmul', + DerivAlgebraComplex.jetRingAction_apply_one, map_pow, ← TensorProduct.smul_tmul', SubmonoidClass.coe_pow, ← map_smul, Prod.smul_mk, smul_zero] rfl @@ -671,7 +616,7 @@ lemma repJetGaugeGroupI_ofGenerator_ψ_singleton (g : JetGaugeGroupI) JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, Representation.trivial_apply, map_zero, TensorProduct.map_tmul, - dualDerivAction_apply_ι, hcoeff, TensorProduct.add_tmul, + DerivAlgebraComplex.jetRingAction_apply_ι, hcoeff, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow, sub_eq_add_neg, neg_smul] simp only [hinl, TensorProduct.neg_tmul, ← TensorProduct.smul_tmul', @@ -698,11 +643,11 @@ lemma repJetGaugeGroupI_ofGenerator_ψ (g : JetGaugeGroupI) Module.Dual ℂ (ConjModule LeptonSinglet))) = LinearMap.inl ℂ _ _ x := fun x => rfl simp only [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, - JetComponentSpace.basis_dψ, dualJetAlgebraBasis_apply, Finsupp.toMultiset_toFinsupp, + JetComponentSpace.basis_dψ, DerivAlgebraComplex.basis_apply, Finsupp.toMultiset_toFinsupp, JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, Representation.trivial_apply, map_zero, TensorProduct.map_tmul, - dualDerivAction_apply_symmetricAlgebra] + DerivAlgebraComplex.jetRingAction_basis] simp only [hinl, TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] /-! diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index e56649287..99b4e159b 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -33,44 +33,10 @@ boson is the B boson formalized here. @[expose] public section -/-! - -## Aa. The formal partial derivative and the coefficientwise star - -The Maurer–Cartan jet series is built from the formal partial derivative -`MvPowerSeries.pderiv`; its hermiticity rests on the fact that the derivative -commutes with the coefficientwise star. - --/ - namespace MvPowerSeries variable {σ R : Type*} -/-- The formal partial derivative commutes with the coefficientwise star. -/ -lemma pderiv_star [CommSemiring R] [StarRing R] (ν : σ) (f : MvPowerSeries σ R) : - pderiv R ν (star f) = star (pderiv R ν f) := by - ext s - rw [coeff_pderiv, coeff_star, coeff_star, coeff_pderiv, star_mul'] - congr 1 - simp - -/-- Formal partial derivatives commute. -/ -lemma pderiv_comm [CommSemiring R] (μ ν : σ) (f : MvPowerSeries σ R) : - pderiv R μ (pderiv R ν f) = pderiv R ν (pderiv R μ f) := by - classical - ext s - rw [coeff_pderiv, coeff_pderiv, coeff_pderiv, coeff_pderiv, - show s + Finsupp.single μ 1 + Finsupp.single ν 1 = - s + Finsupp.single ν 1 + Finsupp.single μ 1 from by - rw [add_assoc, add_assoc, add_comm (Finsupp.single μ 1)]] - rcases eq_or_ne μ ν with rfl | h - · rfl - · rw [Finsupp.add_apply, Finsupp.add_apply, Finsupp.single_eq_of_ne h.symm, - Finsupp.single_eq_of_ne h] - push_cast - ring - /-! ## Ab. The exponential of a monomial @@ -191,14 +157,13 @@ lemma expMonomial_mul_expMonomial (hw : w ≠ 0) (c c' : K) : · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h2), mul_zero] · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h1), zero_mul] -omit [CharZero K] in /-- The coefficientwise star of the exponential of a monomial is the exponential at the starred scalar. -/ -lemma star_expMonomial [StarRing K] (hw : w ≠ 0) (c : K) : - star (expMonomial c w) = expMonomial (star c) w := by +lemma star_expMonomial {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : m ≠ 0) (c : ℂ) : + star (expMonomial c m : JetRing) = expMonomial (star c) m := by ext k - rw [coeff_star] - by_cases hk : ∃ n : ℕ, k = n • w + rw [JetRing.coeff_star] + by_cases hk : ∃ n : ℕ, k = n • m · obtain ⟨n, rfl⟩ := hk rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw, star_div₀, star_pow, star_natCast] @@ -463,7 +428,7 @@ since the group is abelian the cocycle identity degenerates to additivity. The resulting action of `JetGaugeGroupI` on `BBoson` is by translations. -/ -open MvPowerSeries +open MvPowerSeries JetRing /-- The Maurer–Cartan coefficient of a jet of a `U(1)` gauge transformation in the spacetime direction `μ`: `i (∂_μ u)(0) ū(0)`, which is hermitian by unitarity. -/ @@ -661,6 +626,34 @@ lemma star_mcSeries (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : rw [mcSeries, star_mul', star_C, star_mul', star_star, ← pderiv_star, hq, show (star Complex.I) = -Complex.I by simp, map_neg, neg_mul, mul_neg, neg_neg] +/-- The derivative of a hypercharge power of a `U(1)` jet: + `∂_ν (u^q) = -q i mc_ν u^q`, the all-orders form of the first-order Taylor + coefficient formula for the contragredient character. -/ +lemma pderiv_pow_unitary (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : + pderiv ℂ ν ((u : JetRing) ^ q) = + MvPowerSeries.C (-(q : ℂ) * Complex.I) * (mcSeries u ν * (u : JetRing) ^ q) := by + rcases Nat.eq_zero_or_pos q with rfl | hq + · simp + · have h1 : star (u : JetRing) * (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).1 + have hpow : (u : JetRing) ^ q = (u : JetRing) * (u : JetRing) ^ (q - 1) := by + conv_lhs => rw [show q = 1 + (q - 1) by omega, pow_add, pow_one] + have hC : (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) * + MvPowerSeries.C Complex.I = MvPowerSeries.C ((q : ℕ) : ℂ) := by + rw [← map_mul] + congr 1 + ring_nf + rw [Complex.I_sq] + ring + have hN : (MvPowerSeries.C ((q : ℕ) : ℂ) : JetRing) = ((q : ℕ) : JetRing) := + map_natCast _ _ + rw [MvPowerSeries.pderiv_pow, mcSeries, hpow] + linear_combination + (-((u : JetRing) * (u : JetRing) ^ (q - 1) * pderiv ℂ ν (u : JetRing) * + star (u : JetRing))) * hC + + (-((u : JetRing) ^ (q - 1) * pderiv ℂ ν (u : JetRing) * + MvPowerSeries.C ((q : ℕ) : ℂ))) * h1 + + (-((u : JetRing) ^ (q - 1) * pderiv ℂ ν (u : JetRing))) * hN + /-- The Taylor coefficients of the Maurer–Cartan series, as hermitian scalars. -/ noncomputable def mcSeriesCoeff (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : selfAdjoint ℂ := @@ -1013,6 +1006,76 @@ lemma mcPairing_basis_dB_symm (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin /-! +## Iterated derivatives of the Maurer–Cartan series + +The covariance of the covariant derivatives of charged fields rests on the +higher Maurer–Cartan anomalies: the iterated formal derivatives of the +Maurer–Cartan series. Their constant coefficients are the Maurer–Cartan +pairings of the corresponding B-boson component functions. + +-/ + +/-- The iterated formal derivatives of the Maurer–Cartan series along an ordered + list of directions: `mc_{s,μ} = ∂_s mc_μ`. -/ +noncomputable def mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : + List (Fin 1 ⊕ Fin 3) → JetRing + | [] => mcSeries u μ + | ν :: s => pderiv ℂ ν (mcSeriesDeriv u μ s) + +@[simp] +lemma mcSeriesDeriv_nil (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : + mcSeriesDeriv u μ [] = mcSeries u μ := rfl + +@[simp] +lemma mcSeriesDeriv_cons (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) + (s : List (Fin 1 ⊕ Fin 3)) : + mcSeriesDeriv u μ (ν :: s) = pderiv ℂ ν (mcSeriesDeriv u μ s) := rfl + +/-- The factorial-weighted Taylor coefficients of the iterated derivatives of the + Maurer–Cartan series: differentiating shifts the multi-index inside the + factorial weight. -/ +lemma factorial_coeff_mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) + (s : List (Fin 1 ⊕ Fin 3)) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) * coeff m (mcSeriesDeriv u μ s) = + ((∏ ρ, Nat.factorial (((m + Multiset.toFinsupp ↑s) : + (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ) : ℕ) : ℂ) * + coeff (m + Multiset.toFinsupp ↑s) (mcSeries u μ) := by + induction s generalizing m with + | nil => simp + | cons ν s ih => + rw [mcSeriesDeriv_cons, coeff_pderiv] + have hT : Multiset.toFinsupp (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = + Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by + rw [Multiset.singleton_add, Multiset.cons_coe], + map_add, Multiset.toFinsupp_singleton] + have hcast : ((∏ ρ, Nat.factorial (((m + Finsupp.single ν 1) : + (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ) : ℕ) : ℂ) = + ((m ν + 1 : ℕ) : ℂ) * ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) := by + rw [← Nat.cast_mul, prod_factorial_add_single] + rw [hT, show m + (Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset _)) = + m + Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset _) from + (add_assoc _ _ _).symm, ← ih (m + Finsupp.single ν 1), hcast] + push_cast + ring + +/-- The constant coefficient of the iterated derivative of the Maurer–Cartan + series is the Maurer–Cartan pairing of the corresponding B-boson component + function. -/ +lemma constantCoeff_mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) + (s : List (Fin 1 ⊕ Fin 3)) : + MvPowerSeries.constantCoeff (mcSeriesDeriv u μ s) = + ((mcPairing u (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by + have h := factorial_coeff_mcSeriesDeriv u μ s 0 + simp only [Finsupp.coe_zero, Pi.zero_apply, Nat.factorial_zero, Finset.prod_const_one, + Nat.cast_one, one_mul, zero_add] at h + rw [← coeff_zero_eq_constantCoeff_apply, h, mcPairing_basis_dB', nsmul_eq_mul] + push_cast + rw [Complex.coe_selfAdjointEquiv] + rfl + +/-! + ## Gauge realization of translations of the jet coordinates To identify the gauge invariants of the jet algebra we need not only that every @@ -1200,6 +1263,28 @@ def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators lemma shift_dB (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : shift μ (dB s ν) = dB (s + {μ}) ν := rfl +/-- The jet generator with further derivatives appended from a multiset. -/ +def shiftMulti (t : Multiset (Fin 1 ⊕ Fin 3)) : JetGenerators → JetGenerators + | dB s ν => dB (s + t) ν + +@[simp] +lemma shiftMulti_dB (t s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : + shiftMulti t (dB s ν) = dB (s + t) ν := rfl + +lemma shiftMulti_singleton (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : + shiftMulti {ν} g = shift ν g := by + cases g with + | dB s ρ => rfl + +lemma shiftMulti_shift (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) + (g : JetGenerators) : + shiftMulti t (shift ν g) = shiftMulti (t + {ν}) g := by + cases g with + | dB s ρ => + simp only [shift_dB, shiftMulti_dB] + congr 1 + rw [add_comm t ({ν} : Multiset (Fin 1 ⊕ Fin 3)), ← add_assoc] + end JetGenerators /-! @@ -1357,6 +1442,123 @@ lemma jetDeriv_baseChange_mul (μ : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] JetAlge /-! +## The Maurer–Cartan correction derivations + +The total derivative does not commute with the jet gauge action: on the +component functions, differentiating after substituting picks up the +Maurer–Cartan shift of the new derivative coordinate. The failure is measured +by the correction derivations `mcDeriv u t`, sending each component function +`∂_s B_ν` to the constant `⟨mc, ∂_{s+t} B_ν⟩`; they satisfy a closed commutation +algebra with the total derivative and with the gauge action, which drives the +covariance of covariant derivatives of charged fields. + +-/ + +/-- The Maurer–Cartan correction derivation of weight `t` of a `U(1)` jet: the + derivation of the B-boson jet algebra sending the component function `∂_s B_ν` + to the constant `⟨mc, ∂_{s+t} B_ν⟩`. -/ +noncomputable def mcDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) : + JetAlgebra →ₗ[ℝ] JetAlgebra := + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toLinearMap ∘ₗ + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)).toLinearMap ∘ₗ + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toLinearMap + +@[simp] +lemma mcDeriv_ofGenerator (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) + (g : JetGenerators) : + mcDeriv u t (ofGenerator g) = algebraMap ℝ JetAlgebra + (mcPairing u (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) := by + simp only [mcDeriv, ofGenerator, LinearMap.coe_comp, Function.comp_apply, + AlgEquiv.toLinearMap_apply, Derivation.coeFn_coe] + rw [SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.mkDerivation_X, + ← MvPolynomial.algebraMap_eq] + exact AlgEquiv.commutes _ _ + +@[simp] +lemma mcDeriv_one (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) : + mcDeriv u t (1 : JetAlgebra) = 0 := by + simp [mcDeriv] + +/-- The correction derivations satisfy the Leibniz rule. -/ +lemma mcDeriv_mul (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) + (x y : JetAlgebra) : + mcDeriv u t (x * y) = mcDeriv u t x * y + x * mcDeriv u t y := by + simp only [mcDeriv, LinearMap.coe_comp, Function.comp_apply, + AlgEquiv.toLinearMap_apply, map_mul, Derivation.coeFn_coe, Derivation.leibniz, + smul_eq_mul, map_add, AlgEquiv.symm_apply_apply] + ring + +/-- The polynomial coordinates of the total derivative. -/ +lemma equivMvPolynomial_jetDeriv (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (jetDeriv ν x) = + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by + simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, + AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, Derivation.coeFn_coe] + +/-- The polynomial coordinates of the correction derivations. -/ +lemma equivMvPolynomial_mcDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) + (x : JetAlgebra) : + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (mcDeriv u t x) = + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by + simp only [mcDeriv, LinearMap.coe_comp, Function.comp_apply, + AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, Derivation.coeFn_coe] + +/-- Commutation of the correction derivations with the total derivative: the + weight of the correction absorbs the derivative index. -/ +lemma mcDeriv_jetDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + mcDeriv u t (jetDeriv ν x) = + jetDeriv ν (mcDeriv u t x) + mcDeriv u (t + {ν}) x := by + have key : ∀ p : MvPolynomial JetGenerators ℝ, + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) + ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) + ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) p) + + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti (t + {ν}) g))) : MvPolynomial JetGenerators ℝ)) p := by + intro p + induction p using MvPolynomial.induction_on with + | C a => + simp [MvPolynomial.derivation_C] + | add p q hp hq => + simp only [map_add, hp, hq] + ring + | mul_X p g ih => + have hlam : mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti t (JetGenerators.shift ν g))) = + mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti (t + {ν}) g)) := by + rw [JetGenerators.shiftMulti_shift] + simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, + MvPolynomial.derivation_C, map_add, mul_zero, zero_add] + rw [ih, hlam] + ring + rw [show mcDeriv u t (jetDeriv ν x) = + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis + (mcDeriv u t (jetDeriv ν x))) from + (AlgEquiv.symm_apply_apply _ _).symm, + equivMvPolynomial_mcDeriv, equivMvPolynomial_jetDeriv, key, map_add, + ← equivMvPolynomial_mcDeriv u t x, ← equivMvPolynomial_jetDeriv ν (mcDeriv u t x), + AlgEquiv.symm_apply_apply, ← equivMvPolynomial_mcDeriv u (t + {ν}) x, + AlgEquiv.symm_apply_apply] + +/-! + ## The field strength of the B boson -/ @@ -1444,6 +1646,181 @@ lemma equivMvPolynomial_repJetGaugeGroupI_u1 (u : unitary JetRing) (V : JetAlgeb (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := equivMvPolynomial_repJetGaugeGroupI (1, 1, u) V +/-- Commutation of the jet gauge action with the total derivative: the + substitution action commutes with `∂_ν` up to the Maurer–Cartan correction + derivation of weight `{ν}`. -/ +lemma repJetGaugeGroupI_jetDeriv (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) + (x : JetAlgebra) : + repJetGaugeGroupI U (jetDeriv ν x) = + jetDeriv ν (repJetGaugeGroupI U x) + + repJetGaugeGroupI U (mcDeriv U.2.2 {ν} x) := by + have key : ∀ p : MvPolynomial JetGenerators ℝ, + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) + ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) + (MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) p) + + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) + ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis + (JetGenerators.shiftMulti {ν} g))) : MvPolynomial JetGenerators ℝ)) p) := by + intro p + induction p using MvPolynomial.induction_on with + | C a => + simp [MvPolynomial.derivation_C, MvPolynomial.algebraMap_eq] + | add p q hp hq => + simp only [map_add, hp, hq] + ring + | mul_X p g ih => + have hlam : mcPairing U.2.2 (JetComponentSpace.basis (JetGenerators.shift ν g)) = + mcPairing U.2.2 (JetComponentSpace.basis + (JetGenerators.shiftMulti {ν} g)) := by + rw [JetGenerators.shiftMulti_singleton] + simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, + MvPolynomial.derivation_C, map_add, map_mul, add_zero, + MvPolynomial.aeval_X, MvPolynomial.aeval_C, MvPolynomial.algebraMap_eq] + rw [ih, hlam] + ring + rw [show repJetGaugeGroupI U (jetDeriv ν x) = + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis + (repJetGaugeGroupI U (jetDeriv ν x))) from + (AlgEquiv.symm_apply_apply _ _).symm, + equivMvPolynomial_repJetGaugeGroupI, equivMvPolynomial_jetDeriv, key, map_add, + ← equivMvPolynomial_repJetGaugeGroupI U x, + ← equivMvPolynomial_jetDeriv ν (repJetGaugeGroupI U x), + ← equivMvPolynomial_mcDeriv U.2.2 {ν} x, + ← equivMvPolynomial_repJetGaugeGroupI U (mcDeriv U.2.2 {ν} x), + AlgEquiv.symm_apply_apply] + congr 1 + exact AlgEquiv.symm_apply_apply _ _ + +/-! + +## Complexified commutation relations + +The complexified forms, on `ℂ ⊗ JetAlgebra`, of the commutation relations +between the gauge action, the total derivative, and the Maurer–Cartan +correction derivations; these drive the covariance of the covariant derivatives +of charged fields. + +-/ + +lemma complexRepJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : JetAlgebra) : + complexRepJetGaugeGroupI U (c ⊗ₜ[ℝ] b) = c ⊗ₜ[ℝ] repJetGaugeGroupI U b := rfl + +/-- The complexified commutation of the gauge action with the total + derivative. -/ +lemma complexRepJetGaugeGroupI_baseChange_jetDeriv (U : JetGaugeGroupI) + (ν : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] JetAlgebra) : + complexRepJetGaugeGroupI U (LinearMap.baseChange ℂ (jetDeriv ν) y) = + LinearMap.baseChange ℂ (jetDeriv ν) (complexRepJetGaugeGroupI U y) + + complexRepJetGaugeGroupI U + (LinearMap.baseChange ℂ (mcDeriv U.2.2 {ν}) y) := by + induction y using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [map_add, ha, hb] + abel + | tmul c b => + simp only [LinearMap.baseChange_tmul, complexRepJetGaugeGroupI_tmul, + repJetGaugeGroupI_jetDeriv, TensorProduct.tmul_add] + +/-- The complexified commutation of the correction derivations with the total + derivative. -/ +lemma mcDeriv_baseChange_jetDeriv (u : unitary JetRing) + (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] JetAlgebra) : + LinearMap.baseChange ℂ (mcDeriv u t) (LinearMap.baseChange ℂ (jetDeriv ν) y) = + LinearMap.baseChange ℂ (jetDeriv ν) + (LinearMap.baseChange ℂ (mcDeriv u t) y) + + LinearMap.baseChange ℂ (mcDeriv u (t + {ν})) y := by + induction y using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [map_add, ha, hb] + abel + | tmul c b => + simp only [LinearMap.baseChange_tmul, mcDeriv_jetDeriv, TensorProduct.tmul_add] + +/-- The complexified Leibniz rule for the correction derivations. -/ +lemma mcDeriv_baseChange_mul (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) + (x y : ℂ ⊗[ℝ] JetAlgebra) : + LinearMap.baseChange ℂ (mcDeriv u t) (x * y) = + LinearMap.baseChange ℂ (mcDeriv u t) x * y + + x * LinearMap.baseChange ℂ (mcDeriv u t) y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + ring + | tmul c b => + induction y using TensorProduct.induction_on with + | zero => simp + | add a' b' ha' hb' => + simp only [mul_add, map_add, ha', hb'] + ring + | tmul c' b' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, + mcDeriv_mul, TensorProduct.tmul_add] + +/-- The complexified gauge action is multiplicative. -/ +lemma complexRepJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : ℂ ⊗[ℝ] JetAlgebra) : + complexRepJetGaugeGroupI U (x * y) = + complexRepJetGaugeGroupI U x * complexRepJetGaugeGroupI U y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + | tmul c b => + induction y using TensorProduct.induction_on with + | zero => simp + | add a' b' ha' hb' => + simp only [mul_add, map_add, ha', hb'] + | tmul c' b' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, complexRepJetGaugeGroupI_tmul, + repJetGaugeGroupI_mul] + +lemma repJetGaugeGroupI_one (U : JetGaugeGroupI) : + repJetGaugeGroupI U (1 : JetAlgebra) = 1 := by + have h := repJetGaugeGroupI_algebraMap U 1 + simpa using h + +/-- The complexified gauge action on a jet-algebra generator: the Maurer–Cartan + shift of the component function. -/ +lemma complexRepJetGaugeGroupI_ofGenerator (U : JetGaugeGroupI) (g : JetGenerators) : + complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = + (1 : ℂ) ⊗ₜ[ℝ] ofGenerator g + + ((mcPairing U.2.2 (JetComponentSpace.basis g) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by + rw [complexRepJetGaugeGroupI_tmul, ofGenerator, repJetGaugeGroupI_ι, + TensorProduct.tmul_add, Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, + show ((mcPairing U.2.2 (JetComponentSpace.basis g) : ℝ) : ℂ) = + algebraMap ℝ ℂ (mcPairing U.2.2 (JetComponentSpace.basis g)) from rfl, + algebraMap_smul] + +/-- The complexified correction derivation on a jet-algebra generator. -/ +lemma mcDeriv_baseChange_ofGenerator (u : unitary JetRing) + (t : Multiset (Fin 1 ⊕ Fin 3)) (g : JetGenerators) : + LinearMap.baseChange ℂ (mcDeriv u t) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = + ((mcPairing u (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by + rw [LinearMap.baseChange_tmul, mcDeriv_ofGenerator, Algebra.algebraMap_eq_smul_one, + TensorProduct.tmul_smul, + show ((mcPairing u (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) = + algebraMap ℝ ℂ (mcPairing u (JetComponentSpace.basis + (JetGenerators.shiftMulti t g))) from rfl, + algebraMap_smul] + +/-- The complexified total derivative on a jet-algebra generator. -/ +lemma jetDeriv_baseChange_ofGenerator (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : + LinearMap.baseChange ℂ (jetDeriv ν) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = + (1 : ℂ) ⊗ₜ[ℝ] ofGenerator (JetGenerators.shift ν g) := by + rw [LinearMap.baseChange_tmul, jetDeriv_ofGenerator] + /-- The difference between a jet-algebra generator and its canonical representative is a derivative of the field strength, or zero. -/ lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean index df6ffd4d0..f9338d469 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean @@ -163,7 +163,7 @@ the jets of constant gauge transformations recover the adjoint representation -/ -open MvPowerSeries +open MvPowerSeries JetRing /-- The matrix of first-order Taylor coefficients, in the spacetime direction `μ`, of a matrix of jets. -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index 87f52c093..606b218e6 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Relativity.DerivAlgebra public import Mathlib.RingTheory.MvPowerSeries.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic @@ -40,138 +41,20 @@ which is large and unwieldy. @[expose] public section -/-! - -## A. The star structure on multivariate power series - -The star operation on `MvPowerSeries σ R` is coefficientwise star. In particular -over `ℂ` it is coefficientwise complex conjugation, fixing the formal variables. - --/ - -namespace MvPowerSeries - -variable {σ R : Type*} - -instance [Star R] : Star (MvPowerSeries σ R) where - star f := fun n => star (f n) - -@[simp] -lemma coeff_star [Semiring R] [StarRing R] (n : σ →₀ ℕ) (f : MvPowerSeries σ R) : - coeff n (star f) = star (coeff n f) := rfl - -instance [CommSemiring R] [StarRing R] : StarRing (MvPowerSeries σ R) where - star_involutive f := funext fun n => star_star (f n) - star_add f g := funext fun n => star_add (f n) (g n) - star_mul f g := by - have h : ∀ a b : MvPowerSeries σ R, star (a * b) = star a * star b := by - intro a b - ext n - classical - rw [coeff_star, coeff_mul, coeff_mul, star_sum] - exact Finset.sum_congr rfl fun p _ => by rw [star_mul', coeff_star, coeff_star] - rw [h, mul_comm] - -@[simp] -lemma constantCoeff_star [CommSemiring R] [StarRing R] (f : MvPowerSeries σ R) : - constantCoeff (star f) = star (constantCoeff f) := rfl - -@[simp] -lemma star_C [CommSemiring R] [StarRing R] (a : R) : - star (C (σ := σ) a) = C (star a) := by - ext n - classical - rw [coeff_star, coeff_C, coeff_C] - split_ifs <;> simp - -/-- The first-order Leibniz rule: the degree-one Taylor coefficient, in the - direction `μ`, of a product of power series. This is the coefficient-level - statement that the first jet of a product is given by the product rule. -/ -lemma coeff_single_one_mul [CommSemiring R] (μ : σ) (f g : MvPowerSeries σ R) : - coeff (Finsupp.single μ 1) (f * g) = - coeff (Finsupp.single μ 1) f * constantCoeff g + - constantCoeff f * coeff (Finsupp.single μ 1) g := by - classical - rw [coeff_mul, Finsupp.antidiagonal_single, - show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, - Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), - Finset.sum_singleton] - simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, - Finsupp.single_zero, coeff_zero_eq_constantCoeff] - ring - -/-- The first-order power rule: the degree-one Taylor coefficient, in the direction - `μ`, of a power of a power series. -/ -lemma coeff_single_one_pow [CommRing R] (μ : σ) (f : MvPowerSeries σ R) (n : ℕ) : - coeff (Finsupp.single μ 1) (f ^ n) = - (n : R) * constantCoeff f ^ (n - 1) * coeff (Finsupp.single μ 1) f := by - classical - induction n with - | zero => - simp [coeff_one, Finsupp.single_eq_zero] - | succ n ih => - rw [pow_succ, coeff_single_one_mul, ih, map_pow, Nat.add_sub_cancel] - rcases Nat.eq_zero_or_pos n with hn | hn - · subst hn - simp - · have hpow : constantCoeff f ^ (n - 1) * constantCoeff f = constantCoeff f ^ n := by - rw [← pow_succ, Nat.sub_add_cancel hn] - push_cast - linear_combination ((n : R) * coeff (Finsupp.single μ 1) f) * hpow - -end MvPowerSeries - -namespace Module.Basis - -variable {R M κ : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] - -/-- The basis vector of the symmetric algebra at the zero multi-index is the unit - of the algebra. -/ -lemma symmetricAlgebra_zero (b : Module.Basis κ R M) : - b.symmetricAlgebra (0 : κ →₀ ℕ) = 1 := by - have h : (MvPolynomial.basisMonomials κ R) (0 : κ →₀ ℕ) = 1 := by - rw [MvPolynomial.coe_basisMonomials] - simp [MvPolynomial.monomial_zero'] - rw [symmetricAlgebra, map_apply, h] - simp - -/-- The basis vector of the symmetric algebra at a single multi-index is the - corresponding generator. -/ -lemma symmetricAlgebra_single (b : Module.Basis κ R M) (i : κ) : - b.symmetricAlgebra (Finsupp.single i 1) = SymmetricAlgebra.ι R M (b i) := by - have h : (MvPolynomial.basisMonomials κ R) (Finsupp.single i 1) = MvPolynomial.X i := rfl - rw [symmetricAlgebra, map_apply, h] - simp - -end Module.Basis - namespace StandardModel -open Matrix MvPowerSeries +open Matrix MvPowerSeries JetRing open scoped Nat /-! -## B. The jet ring - -The jet ring is the ring generated by `x^μ`. -We can consider an element of `χ : JetRing` -as a formal power series in the spacetime coordinates. - -The action `derivAction` below takes `∂_μ · ↦ ∂_μ (χ • ·)`. +## B. The jet gauge group - --/ - -/-- The ring of formal power series in the four spacetime coordinates, with complex - coefficients. Jets of fields and of gauge transformations at a spacetime point are - valued in this ring. The star operation is coefficientwise complex conjugation, so - the spacetime coordinates themselves are self-adjoint. -/ -abbrev JetRing : Type := MvPowerSeries (Fin 1 ⊕ Fin 3) ℂ - -/-! - -## C. The jet gauge group +The ring `JetRing` of formal power series in the spacetime coordinates, in which +jets of fields and of gauge transformations are valued, is defined in +`Physlib.Relativity.DerivAlgebra`, together with the algebra of derivative +symbols `DerivAlgebraComplex` and the action `DerivAlgebraComplex.jetRingAction` +of the jet ring on it. -/ @@ -192,7 +75,7 @@ namespace JetGaugeGroupI /-! -## D. Evaluation at the base point +## C. Evaluation at the base point The constant coefficient of a power series is its value at the base point of the jet. Applied entrywise it sends jets of gauge transformations to their zeroth-order @@ -243,7 +126,7 @@ noncomputable def eval : JetGaugeGroupI →* GaugeGroupI := /-! -## E. Constant jets +## D. Constant jets The constant power series embed the gauge group `GaugeGroupI` into the jet gauge group, as the jets of constant (global) gauge transformations. This is a section of @@ -303,201 +186,4 @@ lemma eval_ofConstant (g : GaugeGroupI) : eval (ofConstant g) = g := by end JetGaugeGroupI -/-! - -## F. The derivative action on the symmetric algebra - -The polynomial jet spaces of `LagrangianTheory` are built on the symmetric algebra -`SymmetricAlgebra ℂ Lorentz.CoℂModule`, whose multiset monomials are the commuting -derivative symbols `∂_m`. The jet ring pairs with this algebra by the -divided-power duality `⟨∂_m, f⟩ = m! · coeff m f` (the constant-coefficient -operator `∂_m` applied to `f`, evaluated at the base point). - -Through this pairing a jet `χ : JetRing` acts on the symmetric algebra as the -transpose of multiplication by `χ`, which is the infinite-order -constant-coefficient differential operator `χ(∂)`. On the derivative symbol `∂_m` -it acts by `∂_m ↦ ∑_{k + l = m} (m.descFactorial k) · (coeff k χ) · ∂_l`: the -Leibniz rule for how the derivatives of a field pick up derivatives of the gauge -parameter, e.g. `∂_μ ↦ χ(0) ∂_μ + (∂_μ χ)(0) ∂_∅`. Because the jet ring is -commutative, transposition preserves multiplicativity, so `χ ↦ χ(∂)` is -multiplicative; this is proved via adjointness and nondegeneracy of the pairing. - --/ - -/-- The divided-power pairing between the symmetric algebra of covectors (the - algebra of derivative symbols) and the jet ring: on the monomial `∂_m` it is - `f ↦ m! · coeff m f`. -/ -noncomputable def symPairing : - SymmetricAlgebra ℂ Lorentz.CoℂModule →ₗ[ℂ] JetRing →ₗ[ℂ] ℂ := - Lorentz.complexCoBasis.symmetricAlgebra.constr ℂ fun m => - (∏ μ, (m μ)! : ℕ) • MvPowerSeries.coeff m - -@[simp] -lemma symPairing_basis (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (f : JetRing) : - symPairing (Lorentz.complexCoBasis.symmetricAlgebra m) f = - (∏ μ, (m μ)! : ℕ) • MvPowerSeries.coeff m f := by - rw [symPairing, Module.Basis.constr_basis] - rfl - -/-- The pairing of an element of the symmetric algebra with a monomial extracts the - corresponding basis coordinate, weighted by the factorial. -/ -lemma symPairing_monomial (p : SymmetricAlgebra ℂ Lorentz.CoℂModule) - (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - symPairing p (MvPowerSeries.monomial m 1) = - ((∏ μ, (m μ)! : ℕ) : ℂ) * Lorentz.complexCoBasis.symmetricAlgebra.repr p m := by - classical - rw [symPairing, Module.Basis.constr_apply, Finsupp.sum, LinearMap.sum_apply] - simp only [LinearMap.smul_apply, MvPowerSeries.coeff_monomial] - rw [Finset.sum_eq_single m] - · by_cases hm : m ∈ (Lorentz.complexCoBasis.symmetricAlgebra.repr p).support - · simp [mul_comm] - · rw [Finsupp.notMem_support_iff.mp hm] - simp - · intro i _ hi - simp [hi] - · intro hm - rw [Finsupp.notMem_support_iff.mp hm] - simp - -/-- Two elements of the symmetric algebra pairing equally against every jet are - equal: the divided-power pairing is nondegenerate on the symmetric-algebra side - (the factorials are invertible in characteristic zero). -/ -lemma symPairing_injective {p q : SymmetricAlgebra ℂ Lorentz.CoℂModule} - (h : ∀ f, symPairing p f = symPairing q f) : p = q := by - refine Lorentz.complexCoBasis.symmetricAlgebra.ext_elem fun m => ?_ - have hf := h (MvPowerSeries.monomial m 1) - rw [symPairing_monomial, symPairing_monomial] at hf - have hfac : ((∏ μ, (m μ)! : ℕ) : ℂ) ≠ 0 := by - rw [Nat.cast_ne_zero] - exact Finset.prod_ne_zero_iff.mpr fun μ _ => Nat.factorial_ne_zero (m μ) - exact mul_left_cancel₀ hfac hf - -/-- - For `χ : JetRing`, the action which takes `∂_μ · ↦ ∂_μ (χ • ·)`. - We expand `∂_μ (χ • ·)` out using the chain rule. -/ -noncomputable def derivAction (χ : JetRing) : - SymmetricAlgebra ℂ Lorentz.CoℂModule →ₗ[ℂ] SymmetricAlgebra ℂ Lorentz.CoℂModule := - Lorentz.complexCoBasis.symmetricAlgebra.constr ℂ fun m => - ∑ p ∈ Finset.antidiagonal m, - ((∏ μ, (m μ).descFactorial (p.1 μ) : ℕ) : ℂ) • MvPowerSeries.coeff p.1 χ • - Lorentz.complexCoBasis.symmetricAlgebra p.2 - -/-- Adjointness: the derivative action of `χ` is the transpose of multiplication by - `χ` under the divided-power pairing. This is the coefficient-level statement of - the Leibniz rule. -/ -lemma symPairing_derivAction (χ f : JetRing) (p : SymmetricAlgebra ℂ Lorentz.CoℂModule) : - symPairing (derivAction χ p) f = symPairing p (χ * f) := by - classical - have h : (symPairing.flip f) ∘ₗ derivAction χ = symPairing.flip (χ * f) := by - refine Lorentz.complexCoBasis.symmetricAlgebra.ext fun m => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.flip_apply] - rw [derivAction, Module.Basis.constr_basis] - simp only [map_sum, map_smul, LinearMap.sum_apply, LinearMap.smul_apply, - symPairing_basis, smul_eq_mul, nsmul_eq_mul] - rw [MvPowerSeries.coeff_mul, Finset.mul_sum] - refine Finset.sum_congr rfl fun q hq => ?_ - have hm : q.1 + q.2 = m := Finset.mem_antidiagonal.mp hq - have hfac : ((∏ μ, (m μ).descFactorial (q.1 μ) : ℕ) : ℂ) * - ((∏ μ, (q.2 μ)! : ℕ) : ℂ) = ((∏ μ, (m μ)! : ℕ) : ℂ) := by - rw [← Nat.cast_mul, ← Finset.prod_mul_distrib] - congr 1 - refine Finset.prod_congr rfl fun μ _ => ?_ - rw [mul_comm] - have h1 : q.1 μ ≤ m μ := by - rw [← hm]; simp - have h2 : m μ - q.1 μ = q.2 μ := by - rw [← hm]; simp - rw [← h2] - exact Nat.factorial_mul_descFactorial h1 - rw [← hfac] - ring - exact LinearMap.congr_fun h p - -/-- Constant jets act on the derivative symbols by their value: `C c` has no - derivative coordinates. -/ -@[simp] -lemma derivAction_C (c : ℂ) : - derivAction (MvPowerSeries.C c) = c • LinearMap.id := by - refine LinearMap.ext fun p => symPairing_injective fun f => ?_ - rw [symPairing_derivAction, - show (MvPowerSeries.C c : JetRing) * f = c • f from - (algebraMap_smul JetRing c f).symm ▸ (Algebra.smul_def c f).symm] - simp - -@[simp] -lemma derivAction_one : derivAction (1 : JetRing) = LinearMap.id := by - rw [show (1 : JetRing) = MvPowerSeries.C 1 from (map_one _).symm, derivAction_C, one_smul] - -/-- The derivative action is multiplicative: it is the transpose of multiplication - in the commutative jet ring. This makes `χ ↦ χ(∂)` a monoid homomorphism and - hence yields representations of the jet gauge group on polynomial jet spaces. -/ -lemma derivAction_mul (χ ψ : JetRing) : - derivAction (χ * ψ) = derivAction χ ∘ₗ derivAction ψ := by - refine LinearMap.ext fun p => symPairing_injective fun f => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply] - rw [symPairing_derivAction, symPairing_derivAction, symPairing_derivAction] - ring_nf - -@[simp] -lemma derivAction_zero : derivAction (0 : JetRing) = 0 := by - refine LinearMap.ext fun p => symPairing_injective fun f => ?_ - rw [symPairing_derivAction, zero_mul] - simp - -lemma derivAction_add (χ ψ : JetRing) : - derivAction (χ + ψ) = derivAction χ + derivAction ψ := by - refine LinearMap.ext fun p => symPairing_injective fun f => ?_ - simp only [LinearMap.add_apply, map_add, symPairing_derivAction] - rw [add_mul, map_add] - -/-- The derivative action as a ring homomorphism from the jet ring to the - endomorphisms of the algebra of derivative symbols: the module structure of the - jet ring on its graded dual. -/ -noncomputable def derivActionHom : - JetRing →+* Module.End ℂ (SymmetricAlgebra ℂ Lorentz.CoℂModule) where - toFun := derivAction - map_one' := derivAction_one - map_mul' χ ψ := derivAction_mul χ ψ - map_zero' := derivAction_zero - map_add' := derivAction_add - -/-- The derivative action on the zeroth-order (field) symbol: it is scaled by the - value of the jet at the base point. -/ -@[simp] -lemma derivAction_apply_one (χ : JetRing) : - derivAction χ (1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) = - MvPowerSeries.constantCoeff χ • 1 := by - rw [show (1 : SymmetricAlgebra ℂ Lorentz.CoℂModule) = - Lorentz.complexCoBasis.symmetricAlgebra 0 from - (Lorentz.complexCoBasis.symmetricAlgebra_zero).symm, - derivAction, Module.Basis.constr_basis, Finsupp.antidiagonal_zero, Finset.sum_singleton] - simp - -/-- The derivative action on a first-order derivative symbol implements the Leibniz - rule: `∂_μ ↦ χ(0) ∂_μ + (∂_μχ)(0) 1`. The value of the jet multiplies the - first-derivative symbol, and its first derivative feeds the zeroth-order - symbol. -/ -lemma derivAction_apply_ι (χ : JetRing) (μ : Fin 1 ⊕ Fin 3) : - derivAction χ (SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ)) = - MvPowerSeries.constantCoeff χ • - SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) + - MvPowerSeries.coeff (Finsupp.single μ 1) χ • 1 := by - classical - rw [show SymmetricAlgebra.ι ℂ Lorentz.CoℂModule (Lorentz.complexCoBasis μ) = - Lorentz.complexCoBasis.symmetricAlgebra (Finsupp.single μ 1) from - (Lorentz.complexCoBasis.symmetricAlgebra_single μ).symm, - derivAction, Module.Basis.constr_basis, Finsupp.antidiagonal_single, - show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, - Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), - Finset.sum_singleton] - have h1 : (∏ ν, ((Finsupp.single μ 1) ν).descFactorial ((Finsupp.single μ 1) ν)) = 1 := - Finset.prod_eq_one fun ν _ => by - rcases eq_or_ne μ ν with h | h - · subst h; simp - · simp [h] - simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, - Finsupp.single_zero, Finsupp.coe_zero, Pi.zero_apply, Nat.descFactorial_zero, - Finset.prod_const_one, Nat.cast_one, one_smul, coeff_zero_eq_constantCoeff, h1, - Lorentz.complexCoBasis.symmetricAlgebra_single, Lorentz.complexCoBasis.symmetricAlgebra_zero] - end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean new file mode 100644 index 000000000..583c9c393 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -0,0 +1,308 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# The B boson + +The hypercharge gauge boson field `B_μ`: the gauge boson of the `U(1)` factor of +the Standard Model gauge group, with one Lorentz index, valued in the +one-dimensional adjoint of `U(1)`, modelled as the real vector space of hermitian +complex numbers. + +The physical Z boson and photon are the electroweak-mixed combinations of this +field with the neutral `SU(2)` boson; before mixing, the `U(1)` factor's gauge +boson is the B boson formalized here. + +-/ + +@[expose] public section +namespace StandardModel +open MvPowerSeries + +/-! + +## The Maurer–Cartan forms of the jet gauge group + +-/ + +noncomputable def maurerCartanU1 (g : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : JetRing := + (MvPowerSeries.C Complex.I : JetRing) * (pderiv ℂ ν (g.2.2 : JetRing) * star (g.2.2 : JetRing)) + +/-- The `SU(3)` Maurer–Cartan form of a jet of gauge transformations in the + direction `ν`: the matrix-valued series `i (∂_ν U) U†` for `U` the colour factor + of the jet, with the formal partial derivative applied entrywise and `star` the + conjugate transpose. -/ +noncomputable def maurerCartanSU3 (g : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + Matrix (Fin 3) (Fin 3) JetRing := + (MvPowerSeries.C Complex.I : JetRing) • + ((g.1 : Matrix (Fin 3) (Fin 3) JetRing).map (pderiv ℂ ν) * + star (g.1 : Matrix (Fin 3) (Fin 3) JetRing)) + +/-- The `SU(2)` Maurer–Cartan form of a jet of gauge transformations in the + direction `ν`: the matrix-valued series `i (∂_ν U) U†` for `U` the weak factor + of the jet, with the formal partial derivative applied entrywise and `star` the + conjugate transpose. -/ +noncomputable def maurerCartanSU2 (g : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + Matrix (Fin 2) (Fin 2) JetRing := + (MvPowerSeries.C Complex.I : JetRing) • + ((g.2.1 : Matrix (Fin 2) (Fin 2) JetRing).map (pderiv ℂ ν) * + star (g.2.1 : Matrix (Fin 2) (Fin 2) JetRing)) + +/-! + +### Basic properties of the Maurer–Cartan forms + +-/ + +@[simp] +lemma maurerCartanU1_one (ν : Fin 1 ⊕ Fin 3) : maurerCartanU1 1 ν = 0 := by + simp [maurerCartanU1, star_one] + +@[simp] +lemma maurerCartanSU3_one (ν : Fin 1 ⊕ Fin 3) : maurerCartanSU3 1 ν = 0 := by + ext i j + simp [maurerCartanSU3, Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ν)] + +@[simp] +lemma maurerCartanSU2_one (ν : Fin 1 ⊕ Fin 3) : maurerCartanSU2 1 ν = 0 := by + ext i j + simp [maurerCartanSU2, Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ν)] + +lemma maurerCartanU1_mul (g1 g2 : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanU1 (g1 * g2) ν = maurerCartanU1 g1 ν + maurerCartanU1 g2 ν := by + have hcoe : ((g1 * g2).2.2 : JetRing) = (g1.2.2 : JetRing) * (g2.2.2 : JetRing) := rfl + have h1 : (g1.2.2 : JetRing) * star (g1.2.2 : JetRing) = 1 := + (Unitary.mem_iff.mp g1.2.2.2).2 + have h2 : (g2.2.2 : JetRing) * star (g2.2.2 : JetRing) = 1 := + (Unitary.mem_iff.mp g2.2.2.2).2 + rw [maurerCartanU1, maurerCartanU1, maurerCartanU1, hcoe, Derivation.leibniz, star_mul'] + simp only [smul_eq_mul] + linear_combination ((MvPowerSeries.C Complex.I : JetRing) * + pderiv ℂ ν (g2.2.2 : JetRing) * star (g2.2.2 : JetRing)) * h1 + + ((MvPowerSeries.C Complex.I : JetRing) * + pderiv ℂ ν (g1.2.2 : JetRing) * star (g1.2.2 : JetRing)) * h2 + +/-- The cocycle law of the `SU(3)` Maurer–Cartan form: it is additive only up to + conjugating the second factor's form by the first factor, + `mc(UV) = mc(U) + U mc(V) U†`. -/ +lemma maurerCartanSU3_mul (g1 g2 : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanSU3 (g1 * g2) ν = + maurerCartanSU3 g1 ν + + (g1.1 : Matrix (Fin 3) (Fin 3) JetRing) * maurerCartanSU3 g2 ν * + star (g1.1 : Matrix (Fin 3) (Fin 3) JetRing) := by + have hcoe : ((g1 * g2).1 : Matrix (Fin 3) (Fin 3) JetRing) = + (g1.1 : Matrix (Fin 3) (Fin 3) JetRing) * (g2.1 : Matrix (Fin 3) (Fin 3) JetRing) := rfl + rw [maurerCartanSU3, maurerCartanSU3, maurerCartanSU3, hcoe] + set U : Matrix (Fin 3) (Fin 3) JetRing := (g1.1 : Matrix (Fin 3) (Fin 3) JetRing) + set V : Matrix (Fin 3) (Fin 3) JetRing := (g2.1 : Matrix (Fin 3) (Fin 3) JetRing) + have hV : V * star V = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp g2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hleib : (U * V).map (pderiv ℂ ν) = + U.map (pderiv ℂ ν) * V + U * V.map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + rw [hleib, star_mul, Matrix.add_mul, smul_add] + congr 1 + · rw [mul_assoc, ← mul_assoc V, hV, one_mul] + · rw [mul_smul_comm, smul_mul_assoc] + congr 1 + rw [mul_assoc, ← mul_assoc (V.map (pderiv ℂ ν)), ← mul_assoc U] + +lemma maurerCartanSU2_mul (g1 g2 : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanSU2 (g1 * g2) ν = + maurerCartanSU2 g1 ν + (g1.2.1 : Matrix (Fin 2) (Fin 2) JetRing) * maurerCartanSU2 g2 ν * + star (g1.2.1 : Matrix (Fin 2) (Fin 2) JetRing) := by + have hcoe : ((g1 * g2).2.1 : Matrix (Fin 2) (Fin 2) JetRing) = + (g1.2.1 : Matrix (Fin 2) (Fin 2) JetRing) * (g2.2.1 : Matrix (Fin 2) (Fin 2) JetRing) := rfl + rw [maurerCartanSU2, maurerCartanSU2, maurerCartanSU2, hcoe] + set U : Matrix (Fin 2) (Fin 2) JetRing := (g1.2.1 : Matrix (Fin 2) (Fin 2) JetRing) + set V : Matrix (Fin 2) (Fin 2) JetRing := (g2.2.1 : Matrix (Fin 2) (Fin 2) JetRing) + have hV : V * star V = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp g2.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hleib : (U * V).map (pderiv ℂ ν) = + U.map (pderiv ℂ ν) * V + U * V.map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + rw [hleib, star_mul, Matrix.add_mul, smul_add] + congr 1 + · rw [mul_assoc, ← mul_assoc V, hV, one_mul] + · rw [mul_smul_comm, smul_mul_assoc] + congr 1 + rw [mul_assoc, ← mul_assoc (V.map (pderiv ℂ ν)), ← mul_assoc U] + +/-! + +### Derivatives of the Maurer–Cartan forms + +-/ + +lemma pderiv_maurerCartanU1_symm (u : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ (maurerCartanU1 u ν) = pderiv ℂ ν (maurerCartanU1 u μ) := by + have hu : (u.2.2 : JetRing) * star (u.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp u.2.2.2).2 + have hu' : star (u.2.2 : JetRing) * (u.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp u.2.2.2).1 + have hstar : ∀ ρ : Fin 1 ⊕ Fin 3, pderiv ℂ ρ (star (u.2.2 : JetRing)) = + -(star (u.2.2 : JetRing) * pderiv ℂ ρ (u.2.2 : JetRing) * star (u.2.2 : JetRing)) := by + intro ρ + have h0 : pderiv ℂ ρ ((u.2.2 : JetRing) * star (u.2.2 : JetRing)) = 0 := by + rw [hu, pderiv_one] + rw [Derivation.leibniz] at h0 + simp only [smul_eq_mul] at h0 + linear_combination star (u.2.2 : JetRing) * h0 - + (pderiv ℂ ρ (star (u.2.2 : JetRing))) * hu' + simp only [maurerCartanU1, Derivation.leibniz, pderiv_C, smul_eq_mul, mul_zero, add_zero] + rw [hstar μ, hstar ν, JetRing.pderiv_comm μ ν] + ring + +/-- The Maurer–Cartan structure equation for the `SU(3)` form: the antisymmetrized + derivative is the commutator, `∂_μ mc_ν - ∂_ν mc_μ = -i [mc_μ, mc_ν]`, here + stated additively. In the abelian `U(1)` case the commutator vanishes and this + reduces to `pderiv_maurerCartanU1_symm`. -/ +lemma pderiv_maurerCartanSU3_symm (u : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + (maurerCartanSU3 u ν).map (pderiv ℂ μ) + + (MvPowerSeries.C Complex.I : JetRing) • (maurerCartanSU3 u μ * maurerCartanSU3 u ν) = + (maurerCartanSU3 u μ).map (pderiv ℂ ν) + + (MvPowerSeries.C Complex.I : JetRing) • (maurerCartanSU3 u ν * maurerCartanSU3 u μ) := by + simp only [maurerCartanSU3] + set U : Matrix (Fin 3) (Fin 3) JetRing := (u.1 : Matrix (Fin 3) (Fin 3) JetRing) + have hU : U * star U = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp u.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hU' : star U * U = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp u.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h + have hone : ∀ ρ : Fin 1 ⊕ Fin 3, + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (pderiv ℂ ρ) = 0 := by + intro ρ + ext i j : 1 + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ρ)] + have hleib : ∀ (ρ : Fin 1 ⊕ Fin 3) (A B : Matrix (Fin 3) (Fin 3) JetRing), + (A * B).map (pderiv ℂ ρ) = A.map (pderiv ℂ ρ) * B + A * B.map (pderiv ℂ ρ) := by + intro ρ A B + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + have hstar : ∀ ρ : Fin 1 ⊕ Fin 3, (star U).map (pderiv ℂ ρ) = + -(star U * (U.map (pderiv ℂ ρ) * star U)) := by + intro ρ + have h0 : U.map (pderiv ℂ ρ) * star U + U * (star U).map (pderiv ℂ ρ) = 0 := by + rw [← hleib ρ U (star U), hU, hone] + have h1 : star U * (U.map (pderiv ℂ ρ) * star U) + + star U * (U * (star U).map (pderiv ℂ ρ)) = 0 := by + rw [← Matrix.mul_add, h0, mul_zero] + rw [show star U * (U * (star U).map (pderiv ℂ ρ)) = + star U * U * (star U).map (pderiv ℂ ρ) from (mul_assoc _ _ _).symm, hU', one_mul] at h1 + exact eq_neg_of_add_eq_zero_left h1 + have hCsmul : ∀ (ρ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing), + ((MvPowerSeries.C Complex.I : JetRing) • A).map (pderiv ℂ ρ) = + (MvPowerSeries.C Complex.I : JetRing) • A.map (pderiv ℂ ρ) := by + intro ρ A + ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply, smul_eq_mul, Derivation.leibniz, + pderiv_C, mul_zero, add_zero] + have hDcomm : (U.map (pderiv ℂ ν)).map (pderiv ℂ μ) = + (U.map (pderiv ℂ μ)).map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.map_apply] + exact JetRing.pderiv_comm μ ν (U i j) + have hI : (MvPowerSeries.C Complex.I : JetRing) * MvPowerSeries.C Complex.I = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + have hprod : ∀ (X Y : Matrix (Fin 3) (Fin 3) JetRing), + (MvPowerSeries.C Complex.I : JetRing) • + (((MvPowerSeries.C Complex.I : JetRing) • X) * + ((MvPowerSeries.C Complex.I : JetRing) • Y)) = + -((MvPowerSeries.C Complex.I : JetRing) • (X * Y)) := by + intro X Y + rw [smul_mul_assoc, mul_smul_comm, smul_smul, smul_smul, hI, neg_one_mul, neg_smul] + rw [hCsmul μ, hCsmul ν, hleib μ (U.map (pderiv ℂ ν)) (star U), + hleib ν (U.map (pderiv ℂ μ)) (star U), hstar μ, hstar ν, hDcomm, hprod, hprod] + simp only [mul_neg, smul_add, smul_neg, mul_assoc] + abel + +/-- The Maurer–Cartan structure equation for the `SU(2)` form; see + `pderiv_maurerCartanSU3_symm`. -/ +lemma pderiv_maurerCartanSU2_symm (u : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + (maurerCartanSU2 u ν).map (pderiv ℂ μ) + + (MvPowerSeries.C Complex.I : JetRing) • (maurerCartanSU2 u μ * maurerCartanSU2 u ν) = + (maurerCartanSU2 u μ).map (pderiv ℂ ν) + + (MvPowerSeries.C Complex.I : JetRing) • (maurerCartanSU2 u ν * maurerCartanSU2 u μ) := by + simp only [maurerCartanSU2] + set U : Matrix (Fin 2) (Fin 2) JetRing := (u.2.1 : Matrix (Fin 2) (Fin 2) JetRing) + have hU : U * star U = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp u.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hU' : star U * U = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp u.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h + have hone : ∀ ρ : Fin 1 ⊕ Fin 3, + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (pderiv ℂ ρ) = 0 := by + intro ρ + ext i j : 1 + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ρ)] + have hleib : ∀ (ρ : Fin 1 ⊕ Fin 3) (A B : Matrix (Fin 2) (Fin 2) JetRing), + (A * B).map (pderiv ℂ ρ) = A.map (pderiv ℂ ρ) * B + A * B.map (pderiv ℂ ρ) := by + intro ρ A B + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + have hstar : ∀ ρ : Fin 1 ⊕ Fin 3, (star U).map (pderiv ℂ ρ) = + -(star U * (U.map (pderiv ℂ ρ) * star U)) := by + intro ρ + have h0 : U.map (pderiv ℂ ρ) * star U + U * (star U).map (pderiv ℂ ρ) = 0 := by + rw [← hleib ρ U (star U), hU, hone] + have h1 : star U * (U.map (pderiv ℂ ρ) * star U) + + star U * (U * (star U).map (pderiv ℂ ρ)) = 0 := by + rw [← Matrix.mul_add, h0, mul_zero] + rw [show star U * (U * (star U).map (pderiv ℂ ρ)) = + star U * U * (star U).map (pderiv ℂ ρ) from (mul_assoc _ _ _).symm, hU', one_mul] at h1 + exact eq_neg_of_add_eq_zero_left h1 + have hCsmul : ∀ (ρ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 2) (Fin 2) JetRing), + ((MvPowerSeries.C Complex.I : JetRing) • A).map (pderiv ℂ ρ) = + (MvPowerSeries.C Complex.I : JetRing) • A.map (pderiv ℂ ρ) := by + intro ρ A + ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply, smul_eq_mul, Derivation.leibniz, + pderiv_C, mul_zero, add_zero] + have hDcomm : (U.map (pderiv ℂ ν)).map (pderiv ℂ μ) = + (U.map (pderiv ℂ μ)).map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.map_apply] + exact JetRing.pderiv_comm μ ν (U i j) + have hI : (MvPowerSeries.C Complex.I : JetRing) * MvPowerSeries.C Complex.I = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + have hprod : ∀ (X Y : Matrix (Fin 2) (Fin 2) JetRing), + (MvPowerSeries.C Complex.I : JetRing) • + (((MvPowerSeries.C Complex.I : JetRing) • X) * + ((MvPowerSeries.C Complex.I : JetRing) • Y)) = + -((MvPowerSeries.C Complex.I : JetRing) • (X * Y)) := by + intro X Y + rw [smul_mul_assoc, mul_smul_comm, smul_smul, smul_smul, hI, neg_one_mul, neg_smul] + rw [hCsmul μ, hCsmul ν, hleib μ (U.map (pderiv ℂ ν)) (star U), + hleib ν (U.map (pderiv ℂ μ)) (star U), hstar μ, hstar ν, hDcomm, hprod, hprod] + simp only [mul_neg, smul_add, smul_neg, mul_assoc] + abel + +end StandardModel diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean new file mode 100644 index 000000000..d7ce83b8f --- /dev/null +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -0,0 +1,576 @@ +/- +Copyright (c) 2026 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 Mathlib.RingTheory.TensorProduct.Basic +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Mathlib.Algebra.TrivSqZeroExt.Basic +public import Mathlib.Data.Finsupp.Multiset +public import Physlib.Particles.StandardModel.Basic +public import Mathlib.RingTheory.MvPowerSeries.Basic +public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic +/-! +# Derivative algebras + +-/ + +@[expose] public section + +/-! + +## A. The Jet ring + +-/ + +/-- The ring of formal power series in the four spacetime coordinates, with complex + coefficients. Jets of fields and of gauge transformations at a spacetime point are + valued in this ring. The star operation is coefficientwise complex conjugation, so + the spacetime coordinates themselves are self-adjoint. -/ +abbrev JetRing : Type := MvPowerSeries (Fin 1 ⊕ Fin 3) ℂ + +/-! + +### A.1. The star structure on the jet ring + +The star operation on the jet ring is coefficientwise complex conjugation, fixing +the formal variables. In particular the spacetime coordinates are self-adjoint. + +-/ + +namespace JetRing + +open MvPowerSeries + +instance : Star JetRing where + star f := fun n => star (f n) + +@[simp] +lemma coeff_star (n : (Fin 1 ⊕ Fin 3) →₀ ℕ) (f : JetRing) : + coeff n (star f) = star (coeff n f) := rfl + +instance : StarRing JetRing where + star_involutive f := funext fun n => star_star (f n) + star_add f g := funext fun n => star_add (f n) (g n) + star_mul f g := by + have h : ∀ a b : JetRing, star (a * b) = star a * star b := by + intro a b + ext n + classical + rw [coeff_star, coeff_mul, coeff_mul, star_sum] + exact Finset.sum_congr rfl fun p _ => by rw [star_mul', coeff_star, coeff_star] + rw [h, mul_comm] + +@[simp] +lemma constantCoeff_star (f : JetRing) : + constantCoeff (star f) = star (constantCoeff f) := rfl + +@[simp] +lemma star_C (a : ℂ) : + star (C a : JetRing) = C (star a) := by + ext n + classical + rw [coeff_star, coeff_C, coeff_C] + split_ifs <;> simp + +/-- The first-order Leibniz rule: the degree-one Taylor coefficient, in the + direction `μ`, of a product of jets. This is the coefficient-level statement + that the first jet of a product is given by the product rule. -/ +lemma coeff_single_one_mul (μ : Fin 1 ⊕ Fin 3) (f g : JetRing) : + coeff (Finsupp.single μ 1) (f * g) = + coeff (Finsupp.single μ 1) f * constantCoeff g + + constantCoeff f * coeff (Finsupp.single μ 1) g := by + classical + rw [coeff_mul, Finsupp.antidiagonal_single, + show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, + Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), + Finset.sum_singleton] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, + Finsupp.single_zero, coeff_zero_eq_constantCoeff] + ring + +/-- The first-order power rule: the degree-one Taylor coefficient, in the direction + `μ`, of a power of a jet. -/ +lemma coeff_single_one_pow (μ : Fin 1 ⊕ Fin 3) (f : JetRing) (n : ℕ) : + coeff (Finsupp.single μ 1) (f ^ n) = + (n : ℂ) * constantCoeff f ^ (n - 1) * coeff (Finsupp.single μ 1) f := by + classical + induction n with + | zero => + simp [coeff_one, Finsupp.single_eq_zero] + | succ n ih => + rw [pow_succ, coeff_single_one_mul, ih, map_pow, Nat.add_sub_cancel] + rcases Nat.eq_zero_or_pos n with hn | hn + · subst hn + simp + · have hpow : constantCoeff f ^ (n - 1) * constantCoeff f = constantCoeff f ^ n := by + rw [← pow_succ, Nat.sub_add_cancel hn] + push_cast + linear_combination ((n : ℂ) * coeff (Finsupp.single μ 1) f) * hpow + +/-! + +### A.2. The formal partial derivative on the jet ring + +-/ + +/-- The formal partial derivative commutes with the coefficientwise star. -/ +lemma pderiv_star (ν : Fin 1 ⊕ Fin 3) (f : JetRing) : + pderiv ℂ ν (star f) = star (pderiv ℂ ν f) := by + ext s + rw [coeff_pderiv, coeff_star, coeff_star, coeff_pderiv, star_mul'] + congr 1 + simp + +/-- Formal partial derivatives commute. -/ +lemma pderiv_comm (μ ν : Fin 1 ⊕ Fin 3) (f : JetRing) : + pderiv ℂ μ (pderiv ℂ ν f) = pderiv ℂ ν (pderiv ℂ μ f) := by + classical + ext s + rw [coeff_pderiv, coeff_pderiv, coeff_pderiv, coeff_pderiv, + show s + Finsupp.single μ 1 + Finsupp.single ν 1 = + s + Finsupp.single ν 1 + Finsupp.single μ 1 from by + rw [add_assoc, add_assoc, add_comm (Finsupp.single μ 1)]] + rcases eq_or_ne μ ν with rfl | h + · rfl + · rw [Finsupp.add_apply, Finsupp.add_apply, Finsupp.single_eq_of_ne h.symm, + Finsupp.single_eq_of_ne h] + push_cast + ring + +end JetRing + +/-! + +## B. The complex derivative algebra + +-/ + +abbrev DerivAlgebraComplex := SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) + +namespace DerivAlgebraComplex + +/-! + +### B.1. The basis indexed by multisets + +-/ + +/-- The basis of the algebra of derivative symbols, indexed by multisets of + spacetime indices: the multiset `s` labels the monomial `∂_s`. -/ +noncomputable def basis : + Module.Basis (Multiset (Fin 1 ⊕ Fin 3)) ℂ DerivAlgebraComplex := + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.reindex Multiset.toFinsupp.toEquiv.symm + +/-- The basis vector at a multiset of derivative indices is the corresponding + basis monomial of the symmetric algebra of dual symbols. -/ +lemma basis_apply (s : Multiset (Fin 1 ⊕ Fin 3)) : + basis s = + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by + rw [basis, Module.Basis.reindex_apply, Equiv.symm_symm] + rfl + +/-- The basis vector at the empty multiset is the unit of the algebra: the + zeroth-order symbol carries no derivatives. -/ +lemma basis_nil : + basis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℂ) ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) = 1 := by + rw [MvPolynomial.coe_basisMonomials] + simp [MvPolynomial.monomial_zero'] + rw [basis, Module.Basis.reindex_apply, Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({} : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp, + Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] + simp + +/-- The basis vector at a singleton multiset is the corresponding first-order + derivative symbol. -/ +lemma basis_singleton (μ : Fin 1 ⊕ Fin 3) : + basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℂ) (Finsupp.single μ 1) = + MvPolynomial.X μ := rfl + rw [basis, Module.Basis.reindex_apply, Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + Finsupp.single μ 1 by simp, + Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] + simp + +/-- Basis monomials multiply by adding the multisets of derivative indices: + `∂_s ∂_t = ∂_{s + t}`. -/ +lemma basis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : + basis s * basis t = basis (s + t) := by + rw [basis_apply, basis_apply, basis_apply, map_add] + simp only [Module.Basis.symmetricAlgebra, Module.Basis.map_apply, + show ∀ p, (SymmetricAlgebra.equivMvPolynomial + Lorentz.complexCoBasis.dualBasis).symm.toLinearEquiv p = + (SymmetricAlgebra.equivMvPolynomial Lorentz.complexCoBasis.dualBasis).symm p + from fun _ => rfl, + ← map_mul, MvPolynomial.coe_basisMonomials] + simp only [MvPolynomial.monomial_mul, mul_one] + +/-! + +### B.2. The derivative operator + +-/ + +/-- The derivative of an element in `DerivAlgebraComplex` taking e.g. + `∂_s` to `∂_μ ∂_s`. -/ +noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex := + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.constr ℂ fun m => + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (m + Finsupp.single μ 1) + +lemma deriv_basis (μ : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + deriv μ (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (m + Finsupp.single μ 1) := by + rw [deriv, Module.Basis.constr_basis] + +lemma deriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : DerivAlgebraComplex) : + deriv μ (deriv ν x) = deriv ν (deriv μ x) := by + have h : (deriv μ) ∘ₗ (deriv ν) = (deriv ν) ∘ₗ (deriv μ) := by + refine Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.ext fun m => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, deriv_basis] + rw [add_assoc, add_assoc, add_comm (Finsupp.single ν 1)] + exact LinearMap.congr_fun h x + +/-- The derivative operator on the multiset basis: appending the derivative + index to the multiset. -/ +lemma deriv_basis_multiset (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + deriv μ (basis s) = basis (s + {μ}) := by + rw [basis_apply, deriv_basis, basis_apply, + show Multiset.toFinsupp (s + {μ}) = Multiset.toFinsupp s + Finsupp.single μ 1 from by + rw [map_add, Multiset.toFinsupp_singleton]] + +/-- The derivative operator is right multiplication by the first-order derivative + symbol. -/ +lemma deriv_apply_eq_mul (μ : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex) : + deriv μ a = a * basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by + have h : deriv μ = LinearMap.mulRight ℂ (basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) := by + refine basis.ext fun s => ?_ + rw [deriv_basis_multiset, LinearMap.mulRight_apply, basis_mul] + rw [LinearMap.congr_fun h a, LinearMap.mulRight_apply] + +/-! + +### B.2. Evaluating on the Jet ring + +-/ +open Nat + +/-- The evaluation map taking a function `f : JetRing` to `∂_μ f`. -/ +noncomputable def eval : DerivAlgebraComplex →ₗ[ℂ] JetRing →ₗ[ℂ] ℂ := + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.constr ℂ fun m => + (∏ μ, (m μ)! : ℕ) • MvPowerSeries.coeff m + + +@[simp] +lemma eval_basis (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (f : JetRing) : + eval (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) f = + (∏ μ, (m μ)! : ℕ) • MvPowerSeries.coeff m f := by + rw [eval, Module.Basis.constr_basis] + rfl + +lemma eval_monomial (p : DerivAlgebraComplex) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + eval p (MvPowerSeries.monomial m 1) = + ((∏ μ, (m μ)! : ℕ) : ℂ) * Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.repr p m := by + classical + rw [eval, Module.Basis.constr_apply, Finsupp.sum, LinearMap.sum_apply] + simp only [LinearMap.smul_apply, MvPowerSeries.coeff_monomial] + rw [Finset.sum_eq_single m] + · by_cases hm : m ∈ (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.repr p).support + · simp [mul_comm] + · rw [Finsupp.notMem_support_iff.mp hm] + simp + · intro i _ hi + simp [hi] + · intro hm + rw [Finsupp.notMem_support_iff.mp hm] + simp + +lemma eval_injective {p q : DerivAlgebraComplex} + (h : ∀ f, eval p f = eval q f) : p = q := by + refine Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.ext_elem fun m => ?_ + have hf := h (MvPowerSeries.monomial m 1) + rw [eval_monomial, eval_monomial] at hf + have hfac : ((∏ μ, (m μ)! : ℕ) : ℂ) ≠ 0 := by + rw [Nat.cast_ne_zero] + exact Finset.prod_ne_zero_iff.mpr fun μ _ => Nat.factorial_ne_zero (m μ) + exact mul_left_cancel₀ hfac hf + +/-- Adjointness: the shift of derivative symbols is the transpose of the formal + partial derivative under the divided-power pairing. -/ +lemma eval_deriv (ν : Fin 1 ⊕ Fin 3) (p : DerivAlgebraComplex) (f : JetRing) : + eval (deriv ν p) f = eval p (MvPowerSeries.pderiv ℂ ν f) := by + have h : (eval.flip f) ∘ₗ deriv ν = + eval.flip (MvPowerSeries.pderiv ℂ ν f) := by + refine Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.ext fun m => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.flip_apply, + deriv_basis, eval_basis, MvPowerSeries.coeff_pderiv] + have hfac : (∏ ρ, (((m + Finsupp.single ν 1) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ)!) = + (m ν + 1) * ∏ ρ, (m ρ)! := by + rw [show (∏ ρ : Fin 1 ⊕ Fin 3, + (((m + Finsupp.single ν 1) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ)!) = + ∏ ρ, ((if ρ = ν then m ν + 1 else 1) * (m ρ)!) from + Finset.prod_congr rfl fun ρ _ => by + rcases eq_or_ne ρ ν with rfl | h + · rw [Finsupp.add_apply, Finsupp.single_eq_same, Nat.factorial_succ, if_pos rfl] + · rw [Finsupp.add_apply, Finsupp.single_eq_of_ne h, add_zero, if_neg h, one_mul], + Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ ν] + simp + rw [nsmul_eq_mul, nsmul_eq_mul, hfac] + push_cast + ring + exact LinearMap.congr_fun h p + +/-! + +### B.2. The action of the Jet ring + +-/ + +/-- The action of `χ` on the derivatives, this takes `∂_μ ·` to `∂_μ (χ ·)`, + expanded out explicitly. -/ +noncomputable def jetRingAction (χ : JetRing) : DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex := + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.constr ℂ fun m => + ∑ p ∈ Finset.antidiagonal m, + ((∏ μ, (m μ).descFactorial (p.1 μ) : ℕ) : ℂ) • MvPowerSeries.coeff p.1 χ • + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra p.2 + +lemma jetRingAction_basis (χ : JetRing) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + jetRingAction χ (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra m) = + ∑ p ∈ Finset.antidiagonal m, + ((∏ μ, (m μ).descFactorial (p.1 μ) : ℕ) : ℂ) • MvPowerSeries.coeff p.1 χ • + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra p.2 := by + rw [jetRingAction, Module.Basis.constr_basis] + +lemma eval_jetRingAction (χ f : JetRing) (p : DerivAlgebraComplex) : + eval (jetRingAction χ p) f = eval p (χ * f) := by + classical + have h : (eval.flip f) ∘ₗ jetRingAction χ = eval.flip (χ * f) := by + refine Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.ext fun m => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.flip_apply] + rw [jetRingAction, Module.Basis.constr_basis] + simp only [map_sum, map_smul, LinearMap.sum_apply, LinearMap.smul_apply, + eval_basis, smul_eq_mul, nsmul_eq_mul] + rw [MvPowerSeries.coeff_mul, Finset.mul_sum] + refine Finset.sum_congr rfl fun q hq => ?_ + have hm : q.1 + q.2 = m := Finset.mem_antidiagonal.mp hq + have hfac : ((∏ μ, (m μ).descFactorial (q.1 μ) : ℕ) : ℂ) * + ((∏ μ, (q.2 μ)! : ℕ) : ℂ) = ((∏ μ, (m μ)! : ℕ) : ℂ) := by + rw [← Nat.cast_mul, ← Finset.prod_mul_distrib] + congr 1 + refine Finset.prod_congr rfl fun μ _ => ?_ + rw [mul_comm] + have h1 : q.1 μ ≤ m μ := by + rw [← hm]; simp + have h2 : m μ - q.1 μ = q.2 μ := by + rw [← hm]; simp + rw [← h2] + exact Nat.factorial_mul_descFactorial h1 + rw [← hfac] + ring + exact LinearMap.congr_fun h p + +/-- Constant jets act on the derivative symbols by their value: `C c` has no + derivative coordinates. -/ +@[simp] +lemma jetRingAction_C (c : ℂ) : + jetRingAction (MvPowerSeries.C c) = c • LinearMap.id := by + refine LinearMap.ext fun p => eval_injective fun f => ?_ + rw [eval_jetRingAction, + show (MvPowerSeries.C c : JetRing) * f = c • f from + (algebraMap_smul JetRing c f).symm ▸ (Algebra.smul_def c f).symm] + simp + +@[simp] +lemma jetRingAction_one : jetRingAction (1 : JetRing) = LinearMap.id := by + rw [show (1 : JetRing) = MvPowerSeries.C 1 from (map_one _).symm, jetRingAction_C, one_smul] + +/-- The derivative action is multiplicative: it is the transpose of multiplication + in the commutative jet ring. This makes `χ ↦ χ(∂)` a monoid homomorphism and + hence yields representations of the jet gauge group on polynomial jet spaces. -/ +lemma jetRingAction_mul (χ ψ : JetRing) : + jetRingAction (χ * ψ) = jetRingAction χ ∘ₗ jetRingAction ψ := by + refine LinearMap.ext fun p => eval_injective fun f => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply] + rw [eval_jetRingAction, eval_jetRingAction, eval_jetRingAction] + ring_nf + + +@[simp] +lemma jetRingAction_zero : jetRingAction (0 : JetRing) = 0 := by + simp only [jetRingAction, Fintype.prod_sum_type, Finset.univ_unique, Fin.default_eq_zero, + Fin.isValue, Finset.prod_singleton, Nat.cast_mul, Nat.cast_prod, MvPowerSeries.coeff_zero, + zero_smul, smul_zero, Finset.sum_const_zero, EmbeddingLike.map_eq_zero_iff] + rfl + +lemma jetRingAction_add (χ ψ : JetRing) : + jetRingAction (χ + ψ) = jetRingAction χ + jetRingAction ψ := by + refine LinearMap.ext fun p => eval_injective fun f => ?_ + simp only [LinearMap.add_apply, map_add, eval_jetRingAction] + rw [add_mul, map_add] + +/-- The derivative action as a ring homomorphism from the jet ring to the + endomorphisms of the algebra of derivative symbols: the module structure of the + jet ring on its graded dual. -/ +noncomputable def jetRingActionHom : JetRing →+* Module.End ℂ DerivAlgebraComplex where + toFun := jetRingAction + map_one' := jetRingAction_one + map_mul' χ ψ := jetRingAction_mul χ ψ + map_zero' := jetRingAction_zero + map_add' := jetRingAction_add + +/-- The actions of two jets commute: the jet ring is commutative. -/ +lemma jetRingAction_comm (χ ψ : JetRing) (a : DerivAlgebraComplex) : + jetRingAction χ (jetRingAction ψ a) = jetRingAction ψ (jetRingAction χ a) := by + rw [← LinearMap.comp_apply, ← jetRingAction_mul, mul_comm, jetRingAction_mul, + LinearMap.comp_apply] + +/-- The derivative action on the zeroth-order (field) symbol: it is scaled by the + value of the jet at the base point. -/ +@[simp] +lemma jetRingAction_apply_one (χ : JetRing) : + jetRingAction χ (1 : DerivAlgebraComplex) = + MvPowerSeries.constantCoeff χ • 1 := by + have h0 : Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = + 1 := by + rw [show (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = + Multiset.toFinsupp ({} : Multiset (Fin 1 ⊕ Fin 3)) by simp, + ← basis_apply, basis_nil] + rw [show (1 : DerivAlgebraComplex) = + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra 0 from h0.symm, + jetRingAction, Module.Basis.constr_basis, Finsupp.antidiagonal_zero, Finset.sum_singleton] + simp + +/-- The derivative action on a first-order derivative symbol implements the Leibniz + rule: `∂_μ ↦ χ(0) ∂_μ + (∂_μχ)(0) 1`. The value of the jet multiplies the + first-derivative symbol, and its first derivative feeds the zeroth-order + symbol. -/ +lemma jetRingAction_apply_ι (χ : JetRing) (μ : Fin 1 ⊕ Fin 3) : + jetRingAction χ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ)) = + MvPowerSeries.constantCoeff χ • + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) + + MvPowerSeries.coeff (Finsupp.single μ 1) χ • 1 := by + classical + have h0 : Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = + 1 := by + rw [show (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = + Multiset.toFinsupp ({} : Multiset (Fin 1 ⊕ Fin 3)) by simp, + ← basis_apply, basis_nil] + have hs : Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (Finsupp.single μ 1) = + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) := by + rw [show (Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = + Multiset.toFinsupp ({μ} : Multiset (Fin 1 ⊕ Fin 3)) by simp, + ← basis_apply, basis_singleton] + rw [show SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) = + Lorentz.complexCoBasis.dualBasis.symmetricAlgebra (Finsupp.single μ 1) from hs.symm, + jetRingAction, Module.Basis.constr_basis, Finsupp.antidiagonal_single, + show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, + Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), + Finset.sum_singleton] + have h1 : (∏ ν, ((Finsupp.single μ 1) ν).descFactorial ((Finsupp.single μ 1) ν)) = 1 := + Finset.prod_eq_one fun ν _ => by + rcases eq_or_ne μ ν with h | h + · subst h; simp + · simp [h] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, + Finsupp.single_zero, Finsupp.coe_zero, Pi.zero_apply, Nat.descFactorial_zero, + Finset.prod_const_one, Nat.cast_one, one_smul, MvPowerSeries.coeff_zero_eq_constantCoeff, + h1, hs, h0] + +/-- The commutation of the jet-ring action with the derivative operator: acting by + `χ` after differentiating equals differentiating after acting, plus the action + of the derivative `∂_ν χ`. This is the operator form of the Leibniz rule + `∂_ν (χ f) = χ ∂_ν f + (∂_ν χ) f` under the divided-power pairing. -/ +lemma jetRingAction_deriv (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex) : + jetRingAction χ (deriv ν a) = + deriv ν (jetRingAction χ a) + jetRingAction (MvPowerSeries.pderiv ℂ ν χ) a := by + refine eval_injective fun f => ?_ + rw [eval_jetRingAction, eval_deriv, Derivation.leibniz, smul_eq_mul, smul_eq_mul, + map_add, map_add, LinearMap.add_apply, eval_deriv, eval_jetRingAction, + eval_jetRingAction, mul_comm f] + +/-! + +### B.5. The action of the Lorentz group + +-/ + +open Matrix MatrixGroups + +/-- The representation of the Lorentz group `SL(2,ℂ)` on the algebra of derivative + symbols, extending the dual covector representation multiplicatively. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) DerivAlgebraComplex where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ)).toLinearMap + map_one' := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual 1) = + AlgHom.id ℂ (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp + rfl + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ2)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + +@[simp] +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : repLorentzGroup Λ 1 = 1:= by + simp [repLorentzGroup] + +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : DerivAlgebraComplex) : + repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by + simp [repLorentzGroup, map_mul] + +/-- The Lorentz action on a generator. -/ +@[simp] +lemma repLorentzGroup_apply_ι (Λ : SL(2,ℂ)) (x : Module.Dual ℂ Lorentz.CoℂModule) : + repLorentzGroup Λ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) x) = + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.CoℂModule.SL2CRep.dual Λ x) := by + simp [repLorentzGroup] + +/-- The Lorentz action on a derivative: the derivative symbol transforms as a + covector, mixing the spacetime directions by the components of `Λ` in the dual + covector representation. -/ +lemma repLorentzGroup_deriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex) : + repLorentzGroup Λ (deriv μ a) = + ∑ ν, (Lorentz.CoℂModule.SL2CRep.dual Λ (Lorentz.complexCoBasis.dualBasis μ)) + (Lorentz.complexCoBasis ν) • deriv ν (repLorentzGroup Λ a) := by + have hb : repLorentzGroup Λ (basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ∑ ν, (Lorentz.CoℂModule.SL2CRep.dual Λ (Lorentz.complexCoBasis.dualBasis μ)) + (Lorentz.complexCoBasis ν) • basis ({ν} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [basis_singleton, repLorentzGroup_apply_ι] + conv_lhs => rw [← Lorentz.complexCoBasis.dualBasis.sum_repr + (Lorentz.CoℂModule.SL2CRep.dual Λ (Lorentz.complexCoBasis.dualBasis μ))] + rw [map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul, Module.Basis.dualBasis_repr, basis_singleton] + rw [deriv_apply_eq_mul, repLorentzGroup_apply_mul, hb, Finset.mul_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [mul_smul_comm, ← deriv_apply_eq_mul] + +end DerivAlgebraComplex From 86937150a3a791d55edc20db386a1503cc594f6f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:27:06 +0100 Subject: [PATCH 088/254] refactor: Fix build Co-Authored-By: Claude --- Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index 583c9c393..15d16fd4c 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -214,7 +214,7 @@ lemma pderiv_maurerCartanSU3_symm (u : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) rw [← Matrix.mul_add, h0, mul_zero] rw [show star U * (U * (star U).map (pderiv ℂ ρ)) = star U * U * (star U).map (pderiv ℂ ρ) from (mul_assoc _ _ _).symm, hU', one_mul] at h1 - exact eq_neg_of_add_eq_zero_left h1 + exact eq_neg_of_add_eq_zero_right h1 have hCsmul : ∀ (ρ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing), ((MvPowerSeries.C Complex.I : JetRing) • A).map (pderiv ℂ ρ) = (MvPowerSeries.C Complex.I : JetRing) • A.map (pderiv ℂ ρ) := by @@ -278,7 +278,7 @@ lemma pderiv_maurerCartanSU2_symm (u : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) rw [← Matrix.mul_add, h0, mul_zero] rw [show star U * (U * (star U).map (pderiv ℂ ρ)) = star U * U * (star U).map (pderiv ℂ ρ) from (mul_assoc _ _ _).symm, hU', one_mul] at h1 - exact eq_neg_of_add_eq_zero_left h1 + exact eq_neg_of_add_eq_zero_right h1 have hCsmul : ∀ (ρ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 2) (Fin 2) JetRing), ((MvPowerSeries.C Complex.I : JetRing) • A).map (pderiv ℂ ρ) = (MvPowerSeries.C Complex.I : JetRing) • A.map (pderiv ℂ ρ) := by From 7cd2ca6ea59ff314fa1fe6bda4927934ae2773cd Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 5 Aug 2026 06:00:05 +0100 Subject: [PATCH 089/254] feat: Clean up --- Physlib/Particles/QED/JetAlgebra.lean | 70 +- .../StandardModel/GaugeBosons/BBoson.lean | 1010 ++++++++--------- .../GaugeGroup/MaurerCartan.lean | 95 +- 3 files changed, 618 insertions(+), 557 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index 9cc3a2f94..57836f792 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -333,22 +333,22 @@ lemma repAux_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) /-- The Maurer–Cartan anomaly operators on lepton-linear elements: the obstruction to the gauge action commuting with the covariant step, indexed by the derivative history of the step. -/ -noncomputable def anomalyAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) +noncomputable def anomalyAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : LeptonLinear →ₗ[ℂ] LeptonLinear := TensorProduct.map (LinearMap.baseChange ℂ - (BBoson.JetAlgebra.mcDeriv u (↑s + {μ}))) LinearMap.id + - ((6 : ℂ) * Complex.I * ((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + + ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id - ((6 : ℂ) * Complex.I) • - TensorProduct.map LinearMap.id (actionC (BBoson.mcSeriesDeriv u μ s)) + TensorProduct.map LinearMap.id (actionC (BBoson.maurerCartanU1Deriv U μ s)) -lemma anomalyAux_tmul (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) +lemma anomalyAux_tmul (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : LeptonComponent) : - anomalyAux u s μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv u (↑s + {μ})) p) ⊗ₜ[ℂ] a + - ((6 : ℂ) * Complex.I * ((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + anomalyAux U s μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + + ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) - - ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.mcSeriesDeriv u μ s) a) := by + ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.maurerCartanU1Deriv U μ s) a) := by simp [anomalyAux] /-- The zeroth-order lepton component as a lepton-linear element. -/ @@ -363,10 +363,10 @@ noncomputable def DψAux (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : LeptonLinea /-- The derivative actions of the Maurer–Cartan series and of a hypercharge power commute. -/ -lemma actionC_mcSeries_pow (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) +lemma actionC_maurerCartanU1_pow (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) (a : LeptonComponent) : - actionC (BBoson.mcSeries u μ) (actionC ((u : JetRing) ^ q) a) = - actionC ((u : JetRing) ^ q) (actionC (BBoson.mcSeries u μ) a) := + actionC (maurerCartanU1 U μ) (actionC ((U.2.2 : JetRing) ^ q) a) = + actionC ((U.2.2 : JetRing) ^ q) (actionC (maurerCartanU1 U μ) a) := actionC_comm _ _ a /-- The derivative action of a jet on the zeroth-order lepton component: the @@ -383,7 +383,7 @@ lemma actionC_one_tmul (χ : JetRing) (φ : Module.Dual ℂ LeptonSinglet) : lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : repAux U (covariantStepAux μ x) = - covariantStepAux μ (repAux U x) + repAux U (anomalyAux U.2.2 [] μ x) := by + covariantStepAux μ (repAux U x) + repAux U (anomalyAux U [] μ x) := by have h0 : (↑([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by rw [Multiset.coe_nil, zero_add] @@ -395,25 +395,25 @@ lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) | add a b ha hb => simp only [mul_add, ha, hb] | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] have key : (repAux U) ∘ₗ (covariantStepAux μ) = - (covariantStepAux μ) ∘ₗ (repAux U) + (repAux U) ∘ₗ (anomalyAux U.2.2 [] μ) := by + (covariantStepAux μ) ∘ₗ (repAux U) + (repAux U) ∘ₗ (anomalyAux U [] μ) := by refine TensorProduct.ext' fun p a => ?_ simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepAux_tmul, - anomalyAux_tmul, BBoson.mcSeriesDeriv_nil, map_add, map_smul, map_sub, + anomalyAux_tmul, BBoson.maurerCartanU1Deriv_nil, map_add, map_smul, map_sub, repAux_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, actionC_shiftC, BBoson.pderiv_pow_unitary, actionC_mul, actionC_C, BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - actionC_mcSeries_pow] + actionC_maurerCartanU1_pow] have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ) + - ((BBoson.mcPairing U.2.2 (BBoson.JetComponentSpace.basis + ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + - ((BBoson.mcPairing U.2.2 (BBoson.JetComponentSpace.basis + ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by rw [add_mul, smul_mul_assoc, hone] @@ -426,10 +426,10 @@ lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) /-- The anomaly operators commute with the covariant step up to the anomaly operator with the derivative direction appended to its history. -/ -lemma anomalyAux_covariantStepAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) +lemma anomalyAux_covariantStepAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : - anomalyAux u s μ (covariantStepAux ν x) = - covariantStepAux ν (anomalyAux u s μ x) + anomalyAux u (ν :: s) μ x := by + anomalyAux U s μ (covariantStepAux ν x) = + covariantStepAux ν (anomalyAux U s μ x) + anomalyAux U (ν :: s) μ x := by have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by @@ -440,18 +440,18 @@ lemma anomalyAux_covariantStepAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by rw [BBoson.JetGenerators.shiftMulti_dB] congr 1 - have hm : BBoson.mcPairing u (BBoson.JetComponentSpace.basis + have hm : BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = - BBoson.mcPairing u (BBoson.JetComponentSpace.basis + BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by rw [BBoson.mcPairing_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] - have key : (anomalyAux u s μ) ∘ₗ (covariantStepAux ν) = - (covariantStepAux ν) ∘ₗ (anomalyAux u s μ) + anomalyAux u (ν :: s) μ := by + have key : (anomalyAux U s μ) ∘ₗ (covariantStepAux ν) = + (covariantStepAux ν) ∘ₗ (anomalyAux U s μ) + anomalyAux U (ν :: s) μ := by refine TensorProduct.ext' fun p a => ?_ simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepAux_tmul, - anomalyAux_tmul, map_add, map_smul, map_sub, BBoson.mcSeriesDeriv_cons] + anomalyAux_tmul, map_add, map_smul, map_sub, BBoson.maurerCartanU1Deriv_cons] simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, BBoson.JetAlgebra.mcDeriv_baseChange_mul, BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] @@ -462,10 +462,10 @@ lemma anomalyAux_covariantStepAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin | zero => simp | add a b ha hb => simp only [mul_add, ha, hb] | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] - have hdist : (((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + have hdist : (((BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = - ((BBoson.mcPairing u (BBoson.JetComponentSpace.basis + ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • p := by rw [smul_mul_assoc, hone] @@ -478,12 +478,12 @@ lemma anomalyAux_covariantStepAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin /-- The anomaly operators annihilate the zeroth-order lepton component: the constant coefficient of the iterated Maurer–Cartan derivative is the Maurer–Cartan pairing. -/ -lemma anomalyAux_ψAux (u : unitary JetRing) (s : List (Fin 1 ⊕ Fin 3)) +lemma anomalyAux_ψAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - anomalyAux u s μ (ψAux α) = 0 := by + anomalyAux U s μ (ψAux α) = 0 := by rw [ψAux, anomalyAux_tmul, LinearMap.baseChange_tmul] simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, actionC_one_tmul, BBoson.constantCoeff_mcSeriesDeriv, + TensorProduct.zero_tmul, actionC_one_tmul, BBoson.constantCoeff_maurerCartanU1Deriv, TensorProduct.tmul_smul, smul_smul, zero_add, sub_self] /-- The gauge action on the zeroth-order lepton component is the hypercharge @@ -498,11 +498,11 @@ lemma repAux_ψAux (U : JetGaugeGroupI) (α : Fin 2) : /-- Every anomaly operator annihilates every covariant derivative of the charged lepton. -/ -lemma anomalyAux_DψAux (u : unitary JetRing) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : +lemma anomalyAux_DψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), - anomalyAux u s μ (DψAux l α) = 0 := by + anomalyAux U s μ (DψAux l α) = 0 := by induction l with - | nil => exact fun s μ => anomalyAux_ψAux u s μ α + | nil => exact fun s μ => anomalyAux_ψAux U s μ α | cons ν l ih => intro s μ rw [show DψAux (ν :: l) α = covariantStepAux ν (DψAux l α) from rfl, @@ -517,7 +517,7 @@ lemma repAux_DψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin | nil => exact repAux_ψAux U α | cons ν l ih => rw [show DψAux (ν :: l) α = covariantStepAux ν (DψAux l α) from rfl, - repAux_covariantStepAux, ih, map_smul, anomalyAux_DψAux U.2.2 l α [] ν, map_zero, + repAux_covariantStepAux, ih, map_smul, anomalyAux_DψAux U l α [] ν, map_zero, add_zero] /-- The inclusion intertwines the covariant steps. -/ diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 99b4e159b..6fe033423 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -17,6 +17,7 @@ public import Physlib.Particles.LagrangianTheory.Basic public import Physlib.Mathematics.MvPowerSeriesDerivative public import Physlib.Mathematics.MvPolynomialTranslation public import Mathlib.Algebra.MvPolynomial.Derivation +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan /-! # The B boson @@ -577,10 +578,10 @@ derivative coordinate `∂_s B_μ` of the field by the corresponding derivative Maurer–Cartan coefficient `mcCoeff` records only the zeroth of these shifts — enough for the action on the field itself, but not for the action on its jets. -To express the shift of every derivative coordinate uniformly we define here the -full jet of the Maurer–Cartan form of a `U(1)` jet: the formal power series -`i (∂_ν u) ū`, whose value at the base point is `mcCoeff` and whose higher Taylor -coefficients are the higher shifts. Its coefficients are hermitian, and it is +To express the shift of every derivative coordinate uniformly we use the `U(1)` +Maurer–Cartan form `maurerCartanU1` of the jet gauge group: the formal power +series `i (∂_ν u) ū`, whose value at the base point is `mcCoeff` and whose +higher Taylor coefficients are the higher shifts. Its coefficients are hermitian, and it is additive in the jet; these two facts make the induced shift of the B-boson component functions a real-valued cocycle, which is what turns the substitution `B ↦ B + i (∂u) ū` into a representation of the jet gauge group on the jet @@ -588,54 +589,16 @@ algebra below. -/ -/-- The Maurer–Cartan power series of a jet of a `U(1)` gauge transformation in - the spacetime direction `ν`: the formal power series `i (∂_ν u) ū`, whose - constant coefficient is the Maurer–Cartan coefficient `mcCoeff`. -/ -noncomputable def mcSeries (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : JetRing := - (MvPowerSeries.C Complex.I : JetRing) * (pderiv ℂ ν (u : JetRing) * star (u : JetRing)) - -@[simp] -lemma mcSeries_one (ν : Fin 1 ⊕ Fin 3) : mcSeries 1 ν = 0 := by - simp [mcSeries] - -/-- The Maurer–Cartan series is additive in the jet: the abelian cocycle identity - at the level of full jets. -/ -lemma mcSeries_mul (u v : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : - mcSeries (u * v) ν = mcSeries u ν + mcSeries v ν := by - have hu : (u : JetRing) * star (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).2 - have hv : (v : JetRing) * star (v : JetRing) = 1 := (Unitary.mem_iff.mp v.2).2 - simp only [mcSeries, MulMemClass.coe_mul, Derivation.leibniz, smul_eq_mul, star_mul', - ← mul_add] - congr 1 - linear_combination (pderiv ℂ ν (u : JetRing) * star (u : JetRing)) * hv + - (pderiv ℂ ν (v : JetRing) * star (v : JetRing)) * hu - -/-- The Maurer–Cartan series is hermitian: `star (i (∂_ν u) ū) = i (∂_ν u) ū`, - by differentiating the unitarity relation `u ū = 1`. All its Taylor - coefficients are therefore real. -/ -lemma star_mcSeries (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : - star (mcSeries u ν) = mcSeries u ν := by - have hu : (u : JetRing) * star (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).2 - have h0 : pderiv ℂ ν ((u : JetRing) * star (u : JetRing)) = 0 := by - rw [hu, pderiv_one] - rw [Derivation.leibniz] at h0 - simp only [smul_eq_mul] at h0 - have hq : pderiv ℂ ν (star (u : JetRing)) * (u : JetRing) = - -(pderiv ℂ ν (u : JetRing) * star (u : JetRing)) := by - linear_combination h0 - rw [mcSeries, star_mul', star_C, star_mul', star_star, ← pderiv_star, hq, - show (star Complex.I) = -Complex.I by simp, map_neg, neg_mul, mul_neg, neg_neg] - /-- The derivative of a hypercharge power of a `U(1)` jet: `∂_ν (u^q) = -q i mc_ν u^q`, the all-orders form of the first-order Taylor coefficient formula for the contragredient character. -/ -lemma pderiv_pow_unitary (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : - pderiv ℂ ν ((u : JetRing) ^ q) = - MvPowerSeries.C (-(q : ℂ) * Complex.I) * (mcSeries u ν * (u : JetRing) ^ q) := by +lemma pderiv_pow_unitary (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : + pderiv ℂ ν ((U.2.2 : JetRing) ^ q) = + MvPowerSeries.C (-(q : ℂ) * Complex.I) * (maurerCartanU1 U ν * (U.2.2 : JetRing) ^ q) := by rcases Nat.eq_zero_or_pos q with rfl | hq · simp - · have h1 : star (u : JetRing) * (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).1 - have hpow : (u : JetRing) ^ q = (u : JetRing) * (u : JetRing) ^ (q - 1) := by + · have h1 : star (U.2.2 : JetRing) * (U.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp U.2.2.2).1 + have hpow : (U.2.2 : JetRing) ^ q = (U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) := by conv_lhs => rw [show q = 1 + (q - 1) by omega, pow_add, pow_one] have hC : (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) * MvPowerSeries.C Complex.I = MvPowerSeries.C ((q : ℕ) : ℂ) := by @@ -646,42 +609,42 @@ lemma pderiv_pow_unitary (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) ring have hN : (MvPowerSeries.C ((q : ℕ) : ℂ) : JetRing) = ((q : ℕ) : JetRing) := map_natCast _ _ - rw [MvPowerSeries.pderiv_pow, mcSeries, hpow] + rw [MvPowerSeries.pderiv_pow, maurerCartanU1, hpow] linear_combination - (-((u : JetRing) * (u : JetRing) ^ (q - 1) * pderiv ℂ ν (u : JetRing) * - star (u : JetRing))) * hC + - (-((u : JetRing) ^ (q - 1) * pderiv ℂ ν (u : JetRing) * + (-((U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * + star (U.2.2 : JetRing))) * hC + + (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * MvPowerSeries.C ((q : ℕ) : ℂ))) * h1 + - (-((u : JetRing) ^ (q - 1) * pderiv ℂ ν (u : JetRing))) * hN + (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing))) * hN /-- The Taylor coefficients of the Maurer–Cartan series, as hermitian scalars. -/ -noncomputable def mcSeriesCoeff (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) +noncomputable def maurerCartanU1Coeff (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : selfAdjoint ℂ := - ⟨coeff m (mcSeries u ν), by - rw [selfAdjoint.mem_iff, ← coeff_star, star_mcSeries]⟩ + ⟨coeff m (maurerCartanU1 U ν), by + rw [selfAdjoint.mem_iff, ← coeff_star, star_maurerCartanU1]⟩ @[simp] -lemma mcSeriesCoeff_one (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - mcSeriesCoeff 1 ν m = 0 := by +lemma maurerCartanU1Coeff_one (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + maurerCartanU1Coeff 1 ν m = 0 := by apply Subtype.ext - simp [mcSeriesCoeff] + simp [maurerCartanU1Coeff] /-- The Taylor coefficients of the Maurer–Cartan series are additive in the jet. -/ -lemma mcSeriesCoeff_mul (u v : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) +lemma maurerCartanU1Coeff_mul (U V : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - mcSeriesCoeff (u * v) ν m = mcSeriesCoeff u ν m + mcSeriesCoeff v ν m := by + maurerCartanU1Coeff (U * V) ν m = maurerCartanU1Coeff U ν m + maurerCartanU1Coeff V ν m := by apply Subtype.ext - simp [mcSeriesCoeff, mcSeries_mul] + simp [maurerCartanU1Coeff, maurerCartanU1_mul] /-- The zeroth Taylor coefficient of the Maurer–Cartan series is the Maurer–Cartan coefficient. -/ -lemma mcSeriesCoeff_zero (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : - mcSeriesCoeff u ν 0 = mcCoeff u ν := by +lemma maurerCartanU1Coeff_zero (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanU1Coeff U ν 0 = mcCoeff U.2.2 ν := by apply Subtype.ext - show coeff 0 (mcSeries u ν) = _ - rw [mcSeries, coeff_zero_eq_constantCoeff, map_mul, map_mul, constantCoeff_C, - show constantCoeff (pderiv ℂ ν (u : JetRing)) = - coeff (Finsupp.single ν (1 : ℕ)) (u : JetRing) from by + show coeff 0 (maurerCartanU1 U ν) = _ + rw [maurerCartanU1, coeff_zero_eq_constantCoeff, map_mul, map_mul, constantCoeff_C, + show constantCoeff (pderiv ℂ ν (U.2.2 : JetRing)) = + coeff (Finsupp.single ν (1 : ℕ)) (U.2.2 : JetRing) from by rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] simp, constantCoeff_star, ← mul_assoc] @@ -692,44 +655,44 @@ lemma mcSeriesCoeff_zero (u : unitary JetRing) (ν : Fin 1 ⊕ Fin 3) : `∂_ν B_μ`. This is the gauge invariance of the abelian field strength, and rests on unitarity: the antisymmetric part `∂_νu ∂_μū - ∂_μu ∂_νū` vanishes because `∂ū = -ū (∂u) ū`. -/ -lemma mcSeriesCoeff_single_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) : - mcSeriesCoeff u ν (Finsupp.single μ 1) = mcSeriesCoeff u μ (Finsupp.single ν 1) := by +lemma maurerCartanU1Coeff_single_symm (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + maurerCartanU1Coeff U ν (Finsupp.single μ 1) = maurerCartanU1Coeff U μ (Finsupp.single ν 1) := by rcases eq_or_ne μ ν with rfl | hμν · rfl apply Subtype.ext - show coeff (Finsupp.single μ 1) (mcSeries u ν) = coeff (Finsupp.single ν 1) (mcSeries u μ) - have hb : constantCoeff (u : JetRing) * star (constantCoeff (u : JetRing)) = 1 := by - have h := congrArg constantCoeff (Unitary.mem_iff.mp u.2).2 + show coeff (Finsupp.single μ 1) (maurerCartanU1 U ν) = coeff (Finsupp.single ν 1) (maurerCartanU1 U μ) + have hb : constantCoeff (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) = 1 := by + have h := congrArg constantCoeff (Unitary.mem_iff.mp U.2.2.2).2 rwa [map_mul, constantCoeff_star, map_one] at h - have hμ := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp u.2).2 + have hμ := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp U.2.2.2).2 rw [coeff_single_one_mul, coeff_star, constantCoeff_star, show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hμ - have hν := congrArg (coeff (Finsupp.single ν 1)) (Unitary.mem_iff.mp u.2).2 + have hν := congrArg (coeff (Finsupp.single ν 1)) (Unitary.mem_iff.mp U.2.2.2).2 rw [coeff_single_one_mul, coeff_star, constantCoeff_star, show coeff (Finsupp.single ν 1) (1 : JetRing) = 0 by rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hν - have hσμ : star (coeff (Finsupp.single μ 1) (u : JetRing)) = - -(coeff (Finsupp.single μ 1) (u : JetRing) * star (constantCoeff (u : JetRing)) * - star (constantCoeff (u : JetRing))) := by - linear_combination star (constantCoeff (u : JetRing)) * hμ - - star (coeff (Finsupp.single μ 1) (u : JetRing)) * hb - have hσν : star (coeff (Finsupp.single ν 1) (u : JetRing)) = - -(coeff (Finsupp.single ν 1) (u : JetRing) * star (constantCoeff (u : JetRing)) * - star (constantCoeff (u : JetRing))) := by - linear_combination star (constantCoeff (u : JetRing)) * hν - - star (coeff (Finsupp.single ν 1) (u : JetRing)) * hb - rw [mcSeries, mcSeries, + have hσμ : star (coeff (Finsupp.single μ 1) (U.2.2 : JetRing)) = + -(coeff (Finsupp.single μ 1) (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) * + star (constantCoeff (U.2.2 : JetRing))) := by + linear_combination star (constantCoeff (U.2.2 : JetRing)) * hμ - + star (coeff (Finsupp.single μ 1) (U.2.2 : JetRing)) * hb + have hσν : star (coeff (Finsupp.single ν 1) (U.2.2 : JetRing)) = + -(coeff (Finsupp.single ν 1) (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) * + star (constantCoeff (U.2.2 : JetRing))) := by + linear_combination star (constantCoeff (U.2.2 : JetRing)) * hν - + star (coeff (Finsupp.single ν 1) (U.2.2 : JetRing)) * hb + rw [maurerCartanU1, maurerCartanU1, show ((C Complex.I : JetRing)) = algebraMap ℂ JetRing Complex.I from rfl, ← Algebra.smul_def, ← Algebra.smul_def, map_smul, map_smul, smul_eq_mul, smul_eq_mul, coeff_single_one_mul, coeff_single_one_mul, coeff_pderiv, coeff_pderiv, coeff_star, coeff_star, constantCoeff_star, - show constantCoeff (pderiv ℂ ν (u : JetRing)) = - coeff (Finsupp.single ν (1 : ℕ)) (u : JetRing) from by + show constantCoeff (pderiv ℂ ν (U.2.2 : JetRing)) = + coeff (Finsupp.single ν (1 : ℕ)) (U.2.2 : JetRing) from by rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] simp, - show constantCoeff (pderiv ℂ μ (u : JetRing)) = - coeff (Finsupp.single μ (1 : ℕ)) (u : JetRing) from by + show constantCoeff (pderiv ℂ μ (U.2.2 : JetRing)) = + coeff (Finsupp.single μ (1 : ℕ)) (U.2.2 : JetRing) from by rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] simp, show (Finsupp.single μ 1) ν = 0 from Finsupp.single_eq_of_ne hμν.symm, @@ -740,38 +703,18 @@ lemma mcSeriesCoeff_single_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) push_cast ring -/-- The Maurer–Cartan series is closed: `∂_μ mc_ν = ∂_ν mc_μ`. The mixed second - derivatives of `u` are symmetric, and the cross terms cancel by unitarity, - through `∂ū = -ū (∂u) ū`. -/ -lemma pderiv_mcSeries_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ (mcSeries u ν) = pderiv ℂ ν (mcSeries u μ) := by - have hu : (u : JetRing) * star (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).2 - have hu' : star (u : JetRing) * (u : JetRing) = 1 := (Unitary.mem_iff.mp u.2).1 - have hstar : ∀ ρ : Fin 1 ⊕ Fin 3, pderiv ℂ ρ (star (u : JetRing)) = - -(star (u : JetRing) * pderiv ℂ ρ (u : JetRing) * star (u : JetRing)) := by - intro ρ - have h0 : pderiv ℂ ρ ((u : JetRing) * star (u : JetRing)) = 0 := by - rw [hu, pderiv_one] - rw [Derivation.leibniz] at h0 - simp only [smul_eq_mul] at h0 - linear_combination star (u : JetRing) * h0 - - (pderiv ℂ ρ (star (u : JetRing))) * hu' - simp only [mcSeries, Derivation.leibniz, pderiv_C, smul_eq_mul, mul_zero, add_zero] - rw [hstar μ, hstar ν, pderiv_comm μ ν] - ring - /-- The weighted symmetry of the Maurer–Cartan Taylor coefficients: exchanging the field index with a derivative index changes the coefficient by the ratio of the corresponding multiplicities. -/ -lemma mcSeriesCoeff_succ_symm (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) +lemma maurerCartanU1Coeff_succ_symm (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - (m μ + 1) • mcSeriesCoeff u ν (m + Finsupp.single μ 1) = - (m ν + 1) • mcSeriesCoeff u μ (m + Finsupp.single ν 1) := by - have h := congrArg (coeff m) (pderiv_mcSeries_symm u μ ν) + (m μ + 1) • maurerCartanU1Coeff U ν (m + Finsupp.single μ 1) = + (m ν + 1) • maurerCartanU1Coeff U μ (m + Finsupp.single ν 1) := by + have h := congrArg (coeff m) (pderiv_maurerCartanU1_symm U μ ν) rw [coeff_pderiv, coeff_pderiv] at h apply Subtype.ext - show ((m μ + 1 : ℕ)) • coeff (m + Finsupp.single μ 1) (mcSeries u ν) = - ((m ν + 1 : ℕ)) • coeff (m + Finsupp.single ν 1) (mcSeries u μ) + show ((m μ + 1 : ℕ)) • coeff (m + Finsupp.single μ 1) (maurerCartanU1 U ν) = + ((m ν + 1 : ℕ)) • coeff (m + Finsupp.single ν 1) (maurerCartanU1 U μ) rw [nsmul_eq_mul, nsmul_eq_mul] push_cast linear_combination h @@ -823,11 +766,11 @@ open LagrangianTheory the B-boson-valued `m`-th derivative of the Maurer–Cartan series at the base point. This is the amount by which the corresponding derivative coordinate of the B boson is shifted under the jet gauge transformation. -/ -noncomputable def mcJet (u : unitary JetRing) : +noncomputable def mcJet (U : JetGaugeGroupI) : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) →ₗ[ℝ] BBoson := Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] - ((∏ μ, Nat.factorial (m μ)) • mcSeriesCoeff u ν m)⟩ + ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩ @[simp] lemma mcJet_one : mcJet 1 = 0 := by @@ -838,24 +781,24 @@ lemma mcJet_one : mcJet 1 = 0 := by /-- The Maurer–Cartan jet is additive in the jet: the abelian cocycle identity for the shift of the component functions. -/ -lemma mcJet_mul (u v : unitary JetRing) : mcJet (u * v) = mcJet u + mcJet v := by +lemma mcJet_mul (U V : JetGaugeGroupI) : mcJet (U * V) = mcJet U + mcJet V := by refine Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.ext fun m => ?_ rw [LinearMap.add_apply, mcJet, mcJet, mcJet, Module.Basis.constr_basis, Module.Basis.constr_basis, Module.Basis.constr_basis] apply BBoson.ext - simp [mcSeriesCoeff_mul, smul_add, TensorProduct.tmul_add, Finset.sum_add_distrib] + simp [maurerCartanU1Coeff_mul, smul_add, TensorProduct.tmul_add, Finset.sum_add_distrib] /-- The Maurer–Cartan pairing: the amount by which a component function of the B-boson jet is shifted under a jet gauge transformation, i.e. the evaluation of the component function against the Maurer–Cartan jet. -/ -noncomputable def mcPairing (u : unitary JetRing) : JetComponentSpace →ₗ[ℝ] ℝ := - TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp (mcJet u)) +noncomputable def mcPairing (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := + TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp (mcJet U)) @[simp] -lemma mcPairing_tmul (u : unitary JetRing) +lemma mcPairing_tmul (U : JetGaugeGroupI) (p : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) (φ : Module.Dual ℝ BBoson) : - mcPairing u (p ⊗ₜ[ℝ] φ) = φ (mcJet u p) := rfl + mcPairing U (p ⊗ₜ[ℝ] φ) = φ (mcJet U p) := rfl @[simp] lemma mcPairing_one : mcPairing 1 = 0 := by @@ -863,8 +806,8 @@ lemma mcPairing_one : mcPairing 1 = 0 := by simp /-- The Maurer–Cartan pairing is additive in the jet. -/ -lemma mcPairing_mul (u v : unitary JetRing) : - mcPairing (u * v) = mcPairing u + mcPairing v := by +lemma mcPairing_mul (U V : JetGaugeGroupI) : + mcPairing (U * V) = mcPairing U + mcPairing V := by refine TensorProduct.ext' fun p φ => ?_ simp [mcJet_mul] @@ -880,15 +823,15 @@ lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : /-- The Maurer–Cartan jet on a first-order derivative symbol: the B boson whose `ν`-th component is the first-order Taylor coefficient of the Maurer–Cartan series. -/ -lemma mcJet_singleton (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : - mcJet u (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = +lemma mcJet_singleton (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + mcJet U (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] - (mcSeriesCoeff u ν (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ := by + (maurerCartanU1Coeff U ν (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ := by rw [dualRealJetAlgebraBasis_singleton, mcJet, Module.Basis.constr_basis] apply BBoson.ext show (∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) • - mcSeriesCoeff u ν (Finsupp.single μ 1))) = _ + maurerCartanU1Coeff U ν (Finsupp.single μ 1))) = _ rw [show (∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) = 1 from Finset.prod_eq_one fun ρ _ => by rcases eq_or_ne μ ρ with rfl | h @@ -907,18 +850,18 @@ lemma jetComponentSpace_basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 /-- The Maurer–Cartan pairing on first-order generators: the shift of the component function `∂_μ B_ν` is the first-order Taylor coefficient of the Maurer–Cartan series. -/ -lemma mcPairing_basis_dB (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) : - mcPairing u (JetComponentSpace.basis (.dB {μ} ν)) = - Complex.selfAdjointEquiv (mcSeriesCoeff u ν (Finsupp.single μ 1)) := by +lemma mcPairing_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + mcPairing U (JetComponentSpace.basis (.dB {μ} ν)) = + Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by rw [jetComponentSpace_basis_dB, mcPairing_tmul, mcJet_singleton, show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] - (mcSeriesCoeff u ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = - ∑ ν', Complex.selfAdjointEquiv (mcSeriesCoeff u ν' (Finsupp.single μ 1)) • + (maurerCartanU1Coeff U ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = + ∑ ν', Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν' (Finsupp.single μ 1)) • basis ν' from by rw [show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] - (mcSeriesCoeff u ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = + (maurerCartanU1Coeff U ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = valLinEquiv.symm (∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] - (mcSeriesCoeff u ν' (Finsupp.single μ 1) : selfAdjoint ℂ)) from rfl, map_sum] + (maurerCartanU1Coeff U ν' (Finsupp.single μ 1) : selfAdjoint ℂ)) from rfl, map_sum] exact Finset.sum_congr rfl fun ν' _ => by rw [valLinEquiv_symm_apply, mk_tmul_eq_smul_basis], map_sum] @@ -936,32 +879,32 @@ lemma dualRealJetAlgebraBasis_apply' (s : Multiset (Fin 1 ⊕ Fin 3)) : rfl /-- The Maurer–Cartan jet on a general derivative symbol. -/ -lemma mcJet_basis (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin 3)) : - mcJet u (LagrangianTheory.dualRealJetAlgebraBasis s) = +lemma mcJet_basis (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : + mcJet U (LagrangianTheory.dualRealJetAlgebraBasis s) = ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - mcSeriesCoeff u ν (Multiset.toFinsupp s))⟩ := by + maurerCartanU1Coeff U ν (Multiset.toFinsupp s))⟩ := by rw [dualRealJetAlgebraBasis_apply', mcJet, Module.Basis.constr_basis] /-- The Maurer–Cartan pairing on a general generator: the factorial-weighted Taylor coefficient of the Maurer–Cartan series. -/ -lemma mcPairing_basis_dB' (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcPairing_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - mcPairing u (JetComponentSpace.basis (.dB s ν)) = + mcPairing U (JetComponentSpace.basis (.dB s ν)) = (∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - Complex.selfAdjointEquiv (mcSeriesCoeff u ν (Multiset.toFinsupp s)) := by + Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s)) := by rw [jetComponentSpace_basis_dB, mcPairing_tmul, mcJet_basis, show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - mcSeriesCoeff u ν' (Multiset.toFinsupp s))⟩ : BBoson) = + maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = ∑ ν', ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - Complex.selfAdjointEquiv (mcSeriesCoeff u ν' (Multiset.toFinsupp s))) • basis ν' from by + Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))) • basis ν' from by rw [show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - mcSeriesCoeff u ν' (Multiset.toFinsupp s))⟩ : BBoson) = + maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = valLinEquiv.symm (∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - mcSeriesCoeff u ν' (Multiset.toFinsupp s))) from rfl, map_sum] + maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))) from rfl, map_sum] refine Finset.sum_congr rfl fun ν' _ => ?_ rw [valLinEquiv_symm_apply, mk_tmul_eq_smul_basis, map_nsmul], map_sum] @@ -987,10 +930,10 @@ lemma prod_factorial_add_single (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (κ : Fin 1 /-- Exchanging the field index with a derivative index leaves the Maurer–Cartan shift of the component functions unchanged: the shift is the jet of a gradient, whose Taylor coefficients depend only on the total multi-index. -/ -lemma mcPairing_basis_dB_symm (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcPairing_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - mcPairing u (JetComponentSpace.basis (.dB (s + {μ}) ν)) = - mcPairing u (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by + mcPairing U (JetComponentSpace.basis (.dB (s + {μ}) ν)) = + mcPairing U (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by rw [mcPairing_basis_dB', mcPairing_basis_dB', show Multiset.toFinsupp (s + {μ}) = Multiset.toFinsupp s + Finsupp.single μ 1 from by rw [map_add, Multiset.toFinsupp_singleton], @@ -1000,7 +943,7 @@ lemma mcPairing_basis_dB_symm (u : unitary JetRing) (s : Multiset (Fin 1 ⊕ Fin smul_comm (Multiset.toFinsupp s μ + 1), smul_comm (Multiset.toFinsupp s ν + 1)] congr 1 have h := congrArg Complex.selfAdjointEquiv - (mcSeriesCoeff_succ_symm u μ ν (Multiset.toFinsupp s)) + (maurerCartanU1Coeff_succ_symm U μ ν (Multiset.toFinsupp s)) rw [map_nsmul, map_nsmul] at h exact h @@ -1017,33 +960,33 @@ pairings of the corresponding B-boson component functions. /-- The iterated formal derivatives of the Maurer–Cartan series along an ordered list of directions: `mc_{s,μ} = ∂_s mc_μ`. -/ -noncomputable def mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : +noncomputable def maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : List (Fin 1 ⊕ Fin 3) → JetRing - | [] => mcSeries u μ - | ν :: s => pderiv ℂ ν (mcSeriesDeriv u μ s) + | [] => maurerCartanU1 U μ + | ν :: s => pderiv ℂ ν (maurerCartanU1Deriv U μ s) @[simp] -lemma mcSeriesDeriv_nil (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : - mcSeriesDeriv u μ [] = mcSeries u μ := rfl +lemma maurerCartanU1Deriv_nil (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + maurerCartanU1Deriv U μ [] = maurerCartanU1 U μ := rfl @[simp] -lemma mcSeriesDeriv_cons (u : unitary JetRing) (μ ν : Fin 1 ⊕ Fin 3) +lemma maurerCartanU1Deriv_cons (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) : - mcSeriesDeriv u μ (ν :: s) = pderiv ℂ ν (mcSeriesDeriv u μ s) := rfl + maurerCartanU1Deriv U μ (ν :: s) = pderiv ℂ ν (maurerCartanU1Deriv U μ s) := rfl /-- The factorial-weighted Taylor coefficients of the iterated derivatives of the Maurer–Cartan series: differentiating shifts the multi-index inside the factorial weight. -/ -lemma factorial_coeff_mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) +lemma factorial_coeff_maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) * coeff m (mcSeriesDeriv u μ s) = + ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) * coeff m (maurerCartanU1Deriv U μ s) = ((∏ ρ, Nat.factorial (((m + Multiset.toFinsupp ↑s) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ) : ℕ) : ℂ) * - coeff (m + Multiset.toFinsupp ↑s) (mcSeries u μ) := by + coeff (m + Multiset.toFinsupp ↑s) (maurerCartanU1 U μ) := by induction s generalizing m with | nil => simp | cons ν s ih => - rw [mcSeriesDeriv_cons, coeff_pderiv] + rw [maurerCartanU1Deriv_cons, coeff_pderiv] have hT : Multiset.toFinsupp (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset (Fin 1 ⊕ Fin 3)) := by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by @@ -1062,11 +1005,11 @@ lemma factorial_coeff_mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) /-- The constant coefficient of the iterated derivative of the Maurer–Cartan series is the Maurer–Cartan pairing of the corresponding B-boson component function. -/ -lemma constantCoeff_mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) +lemma constantCoeff_maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) : - MvPowerSeries.constantCoeff (mcSeriesDeriv u μ s) = - ((mcPairing u (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by - have h := factorial_coeff_mcSeriesDeriv u μ s 0 + MvPowerSeries.constantCoeff (maurerCartanU1Deriv U μ s) = + ((mcPairing U (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by + have h := factorial_coeff_maurerCartanU1Deriv U μ s 0 simp only [Finsupp.coe_zero, Pi.zero_apply, Nat.factorial_zero, Finset.prod_const_one, Nat.cast_one, one_mul, zero_add] at h rw [← coeff_zero_eq_constantCoeff_apply, h, mcPairing_basis_dB', nsmul_eq_mul] @@ -1074,114 +1017,6 @@ lemma constantCoeff_mcSeriesDeriv (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) rw [Complex.coe_selfAdjointEquiv] rfl -/-! - -## Gauge realization of translations of the jet coordinates - -To identify the gauge invariants of the jet algebra we need not only that every -jet gauge transformation shifts the component functions by the Maurer–Cartan -pairing, but also that enough shifts are realized: for every nonzero symmetrized -multi-index `t` and every real `r` there is a jet of a local `U(1)` gauge -transformation shifting every component function with total multi-index `t` by -exactly `r`, and all others by nothing. The transformation realizing this is the -exponential `exp(-i a X^t)` with `a = r / t!`, formalized through -`MvPowerSeries.expMonomial`. - --/ - -/-- The jet of the local `U(1)` gauge transformation `exp(-i a X^w)`: the - exponential of an imaginary multiple of a spacetime monomial, which is unitary - as a formal power series. -/ -noncomputable def expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - unitary JetRing := - ⟨expMonomial (-(a : ℂ) * Complex.I) w, by - have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by - rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] - ring - rw [Unitary.mem_iff, star_expMonomial hw, hstar, expMonomial_mul_expMonomial hw, - expMonomial_mul_expMonomial hw, neg_add_cancel, add_neg_cancel, - expMonomial_zero hw] - exact ⟨rfl, rfl⟩⟩ - -/-- The Maurer–Cartan series of the exponential gauge jet: the monomial - `a w_ν X^{w - e_ν}`, which is the jet of the gradient `a ∂_ν X^w`. -/ -lemma mcSeries_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) - (ν : Fin 1 ⊕ Fin 3) : - mcSeries (expUnitary a w hw) ν = - monomial (w - Finsupp.single ν 1) ((a : ℂ) * ((w ν : ℕ) : ℂ)) := by - have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by - rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] - ring - rw [mcSeries, - show ((expUnitary a w hw : unitary JetRing) : JetRing) = - expMonomial (-(a : ℂ) * Complex.I) w from rfl, - pderiv_expMonomial hw, star_expMonomial hw, hstar, smul_mul_assoc, - mul_assoc (monomial (w - Finsupp.single ν 1) 1), - expMonomial_mul_expMonomial hw, add_neg_cancel, expMonomial_zero hw, mul_one, - mul_smul_comm, ← monomial_zero_eq_C_apply, monomial_mul_monomial, zero_add, - ← map_smul, smul_eq_mul] - congr 1 - ring_nf - rw [Complex.I_sq] - ring - -/-- The Maurer–Cartan pairing of the exponential gauge jet `exp(-i a X^t)` with - `a = r / t!`: it shifts precisely the component functions whose total - symmetrized multi-index is `t`, and shifts them all by `r`. -/ -lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) - (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) : - mcPairing (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) - (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = - if s + {ν} = t then r else 0 := by - rw [mcPairing_basis_dB', Complex.selfAdjointEquiv_apply, - show ((mcSeriesCoeff (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) - (Multiset.toFinsupp t) ht) ν (Multiset.toFinsupp s) : selfAdjoint ℂ) : ℂ) = - coeff (Multiset.toFinsupp s) (mcSeries (expUnitary - (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) - (Multiset.toFinsupp t) ht) ν) from rfl, - mcSeries_expUnitary, coeff_monomial] - by_cases hcase : s + {ν} = t - · rw [if_pos hcase] - have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by - rw [← Multiset.toFinsupp_singleton, ← map_add] - exact congrArg _ hcase - have hwv : Multiset.toFinsupp t ν = Multiset.toFinsupp s ν + 1 := by - rw [← hmw] - simp - have hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 := - eq_tsub_of_add_eq hmw - have hF : (∏ ρ, Nat.factorial ((Multiset.toFinsupp t) ρ)) = - ((Multiset.toFinsupp s) ν + 1) * - ∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) := by - rw [← hmw] - exact prod_factorial_add_single (Multiset.toFinsupp s) ν - rw [if_pos hm, nsmul_eq_mul, hwv, hF] - have h1 : (((Multiset.toFinsupp s) ν + 1 : ℕ) : ℝ) ≠ 0 := by - positivity - have h2 : ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) : ℕ) : ℝ) ≠ 0 := by - rw [Nat.cast_ne_zero] - exact Finset.prod_ne_zero_iff.mpr fun ρ _ => Nat.factorial_ne_zero _ - simp only [Complex.mul_re, Complex.ofReal_re, Complex.ofReal_im, Complex.natCast_re, - Complex.natCast_im, mul_zero, sub_zero] - push_cast - field_simp - · rw [if_neg hcase] - by_cases hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 - · by_cases hwv : Multiset.toFinsupp t ν = 0 - · rw [if_pos hm, hwv] - simp - · exfalso - apply hcase - have hle : Finsupp.single ν 1 ≤ Multiset.toFinsupp t := - Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) - have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by - rw [hm, tsub_add_cancel_of_le hle] - refine Multiset.toFinsupp.injective ?_ - rw [map_add, Multiset.toFinsupp_singleton] - exact hmw - · rw [if_neg hm] - simp /-! @@ -1299,6 +1134,29 @@ abbrev JetAlgebra : Type := SymmetricAlgebra ℝ JetComponentSpace namespace JetAlgebra + +/-! + +## Constructing elements of the jet algebra from the generators + +-/ + +noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := + SymmetricAlgebra.ι ℝ JetComponentSpace (BBoson.JetComponentSpace.basis x) + +/-! + +## A. Representation of the jet Gauge group + +-/ + + +/-! + +## A.1 The real version + +-/ + /-- The action of the jet gauge group on the jet algebra of the B boson. The adjoint action is trivial and the local gauge action is the Maurer–Cartan translation, whose linear part is the identity; consequently no information is @@ -1311,9 +1169,9 @@ namespace JetAlgebra noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgebra where toFun U := (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)).toLinearMap + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)).toLinearMap map_one' := by - rw [show mcPairing (1 : JetGaugeGroupI).2.2 = 0 from mcPairing_one] + rw [show mcPairing (1 : JetGaugeGroupI) = 0 from mcPairing_one] suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = AlgHom.id ℝ JetAlgebra by @@ -1322,14 +1180,14 @@ noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgeb refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp map_mul' U V := by - rw [show mcPairing (U * V : JetGaugeGroupI).2.2 = - mcPairing U.2.2 + mcPairing V.2.2 from mcPairing_mul U.2.2 V.2.2] + rw [show mcPairing (U * V : JetGaugeGroupI) = + mcPairing U + mcPairing V from mcPairing_mul U V] suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (mcPairing U.2.2 + mcPairing V.2.2)) = + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (mcPairing U + mcPairing V)) = (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)).comp + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)).comp (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing V.2.2)) by + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing V)) by rw [hs, AlgHom.comp_toLinearMap, Module.End.mul_eq_comp] refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [add_assoc] @@ -1340,7 +1198,7 @@ noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgeb lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : repJetGaugeGroupI U (SymmetricAlgebra.ι ℝ JetComponentSpace x) = SymmetricAlgebra.ι ℝ JetComponentSpace x + - algebraMap ℝ JetAlgebra (mcPairing U.2.2 x) := by + algebraMap ℝ JetAlgebra (mcPairing U x) := by simp [repJetGaugeGroupI, SymmetricAlgebra.lift_ι_apply, AlgHom.toLinearMap_apply, Algebra.linearMap_apply] @@ -1348,12 +1206,67 @@ lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : lemma repJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : repJetGaugeGroupI U (x * y) = repJetGaugeGroupI U x * repJetGaugeGroupI U y := map_mul (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)) x y + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)) x y lemma repJetGaugeGroupI_algebraMap (U : JetGaugeGroupI) (r : ℝ) : repJetGaugeGroupI U (algebraMap ℝ JetAlgebra r) = algebraMap ℝ JetAlgebra r := AlgHom.commutes (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)) r + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)) r + +lemma repJetGaugeGroupI_one (U : JetGaugeGroupI) : + repJetGaugeGroupI U (1 : JetAlgebra) = 1 := by + have h := repJetGaugeGroupI_algebraMap U 1 + simpa using h + + +/-- Conjugating the jet gauge action by the polynomial coordinates of the jet + algebra: under `SymmetricAlgebra.equivMvPolynomial` the substitution + automorphism `x ↦ x + ⟨mc, x⟩ 1` becomes the translation of every polynomial + variable by the Maurer–Cartan pairing of the corresponding component + function. -/ +lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) : + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (repJetGaugeGroupI U V) = + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := by + have h : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom.comp + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)) = + (MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U (JetComponentSpace.basis g)))).comp + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom := by + refine SymmetricAlgebra.algHom_ext (JetComponentSpace.basis.ext fun g => ?_) + show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U) + (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) = + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) + ((SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) + (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) + rw [SymmetricAlgebra.lift_ι_apply] + simp only [LinearMap.add_apply, LinearMap.coe_comp, Function.comp_apply, + Algebra.linearMap_apply, map_add, AlgEquiv.commutes, + SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.aeval_X, + MvPolynomial.algebraMap_eq] + exact DFunLike.congr_fun h V + +/-- The conjugated action of a `U(1)` jet embedded in the jet gauge group. -/ +lemma equivMvPolynomial_repJetGaugeGroupI_u1 (u : unitary JetRing) (V : JetAlgebra) : + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis + (repJetGaugeGroupI (1, 1, u) V) = + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (mcPairing (1, 1, u) (JetComponentSpace.basis g))) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := + equivMvPolynomial_repJetGaugeGroupI (1, 1, u) V + + +/-! + +## A.2 The complexified version + +-/ + /-- The action of the jet gauge group on the complexified B-boson jet algebra, obtained from the real representation by extension of scalars. -/ @@ -1367,14 +1280,38 @@ noncomputable def complexRepJetGaugeGroupI : ext x simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] -/-! - -## Constructing elements of the jet algebra from the generators +lemma complexRepJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : JetAlgebra) : + complexRepJetGaugeGroupI U (c ⊗ₜ[ℝ] b) = c ⊗ₜ[ℝ] repJetGaugeGroupI U b := rfl --/ +/-- The complexified gauge action is multiplicative. -/ +lemma complexRepJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : ℂ ⊗[ℝ] JetAlgebra) : + complexRepJetGaugeGroupI U (x * y) = + complexRepJetGaugeGroupI U x * complexRepJetGaugeGroupI U y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + | tmul c b => + induction y using TensorProduct.induction_on with + | zero => simp + | add a' b' ha' hb' => + simp only [mul_add, map_add, ha', hb'] + | tmul c' b' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, complexRepJetGaugeGroupI_tmul, + repJetGaugeGroupI_mul] -noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := - SymmetricAlgebra.ι ℝ JetComponentSpace (BBoson.JetComponentSpace.basis x) +/-- The complexified gauge action on a jet-algebra generator: the Maurer–Cartan + shift of the component function. -/ +lemma complexRepJetGaugeGroupI_ofGenerator (U : JetGaugeGroupI) (g : JetGenerators) : + complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = + (1 : ℂ) ⊗ₜ[ℝ] ofGenerator g + + ((mcPairing U (JetComponentSpace.basis g) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by + rw [complexRepJetGaugeGroupI_tmul, ofGenerator, repJetGaugeGroupI_ι, + TensorProduct.tmul_add, Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, + show ((mcPairing U (JetComponentSpace.basis g) : ℝ) : ℂ) = + algebraMap ℝ ℂ (mcPairing U (JetComponentSpace.basis g)) from rfl, + algebraMap_smul] /-! @@ -1440,36 +1377,71 @@ lemma jetDeriv_baseChange_mul (μ : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] JetAlge simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, jetDeriv_mul, TensorProduct.tmul_add] +/-- The complexified total derivative on a jet-algebra generator. -/ +lemma jetDeriv_baseChange_ofGenerator (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : + LinearMap.baseChange ℂ (jetDeriv ν) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = + (1 : ℂ) ⊗ₜ[ℝ] ofGenerator (JetGenerators.shift ν g) := by + rw [LinearMap.baseChange_tmul, jetDeriv_ofGenerator] + +/-- The polynomial coordinates of the total derivative. -/ +lemma equivMvPolynomial_jetDeriv (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (jetDeriv ν x) = + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by + simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, + AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, Derivation.coeFn_coe] + /-! ## The Maurer–Cartan correction derivations -The total derivative does not commute with the jet gauge action: on the -component functions, differentiating after substituting picks up the -Maurer–Cartan shift of the new derivative coordinate. The failure is measured -by the correction derivations `mcDeriv u t`, sending each component function -`∂_s B_ν` to the constant `⟨mc, ∂_{s+t} B_ν⟩`; they satisfy a closed commutation -algebra with the total derivative and with the gauge action, which drives the -covariance of covariant derivatives of charged fields. +A local gauge transformation changes the B boson by a gradient, `δB_μ = ∂_μλ` +with `λ` the phase of the `U(1)` jet (the Maurer–Cartan form is closed, +`pderiv_maurerCartanU1_symm`). On genuine field configurations this variation +commutes with differentiation, since `δ(∂_s B_μ) = ∂_s ∂_μ λ`. The jet algebra, +however, remembers of `λ` only its Taylor coefficients at the base point: the +gauge action shifts each coordinate `∂_s B_μ` by the frozen constant +`⟨mc, ∂_s B_μ⟩ = (∂_s ∂_μ λ)(0)`, and the formal total derivative annihilates +constants while sending `∂_s B_μ` to `∂_{s+ν} B_μ`. Differentiating after +transforming therefore drops exactly the term that, on fields, would come from +the derivative hitting the gauge parameter. + +The correction derivation `mcDeriv U t` reinstates that term as an operator: +"differentiation acting on the gauge parameter instead of the field", the +derivation sending each component function `∂_s B_ν` to the constant +`⟨mc, ∂_{s+t} B_ν⟩`. The commutator of the gauge action with the total +derivative is the gauge action composed with the weight-`{ν}` correction +(`repJetGaugeGroupI_jetDeriv`), and commuting a correction past a further +derivative raises its weight (`mcDeriv_jetDeriv`), so the corrections close +into an algebra. + +This algebra is what makes covariant derivatives of charged fields covariant: +in `D_μψ = ∂_μψ - i q B_μ ψ` the gauge shift of `B_μ` must cancel the +derivative of the hypercharge character produced by `∂_μ` acting on the +transformed `ψ`, and at higher orders the iterated derivatives of the gauge +parameter on both sides are matched precisely by the anomaly operators built +from `mcDeriv`, which annihilate the covariant derivatives (see +`QED.JetAlgebra`). -/ /-- The Maurer–Cartan correction derivation of weight `t` of a `U(1)` jet: the derivation of the B-boson jet algebra sending the component function `∂_s B_ν` to the constant `⟨mc, ∂_{s+t} B_ν⟩`. -/ -noncomputable def mcDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) : +noncomputable def mcDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) : JetAlgebra →ₗ[ℝ] JetAlgebra := (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toLinearMap ∘ₗ (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (MvPolynomial.C (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)).toLinearMap ∘ₗ (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toLinearMap @[simp] -lemma mcDeriv_ofGenerator (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcDeriv_ofGenerator (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (g : JetGenerators) : - mcDeriv u t (ofGenerator g) = algebraMap ℝ JetAlgebra - (mcPairing u (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) := by + mcDeriv U t (ofGenerator g) = algebraMap ℝ JetAlgebra + (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) := by simp only [mcDeriv, ofGenerator, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, Derivation.coeFn_coe] rw [SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.mkDerivation_X, @@ -1477,34 +1449,46 @@ lemma mcDeriv_ofGenerator (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) exact AlgEquiv.commutes _ _ @[simp] -lemma mcDeriv_one (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) : - mcDeriv u t (1 : JetAlgebra) = 0 := by +lemma mcDeriv_one (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) : + mcDeriv U t (1 : JetAlgebra) = 0 := by simp [mcDeriv] /-- The correction derivations satisfy the Leibniz rule. -/ -lemma mcDeriv_mul (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcDeriv_mul (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : - mcDeriv u t (x * y) = mcDeriv u t x * y + x * mcDeriv u t y := by + mcDeriv U t (x * y) = mcDeriv U t x * y + x * mcDeriv U t y := by simp only [mcDeriv, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, map_mul, Derivation.coeFn_coe, Derivation.leibniz, smul_eq_mul, map_add, AlgEquiv.symm_apply_apply] ring -/-- The polynomial coordinates of the total derivative. -/ -lemma equivMvPolynomial_jetDeriv (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (jetDeriv ν x) = - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by - simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, - AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, Derivation.coeFn_coe] +/-- The complexified Leibniz rule for the correction derivations. -/ +lemma mcDeriv_baseChange_mul (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) + (x y : ℂ ⊗[ℝ] JetAlgebra) : + LinearMap.baseChange ℂ (mcDeriv U t) (x * y) = + LinearMap.baseChange ℂ (mcDeriv U t) x * y + + x * LinearMap.baseChange ℂ (mcDeriv U t) y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + ring + | tmul c b => + induction y using TensorProduct.induction_on with + | zero => simp + | add a' b' ha' hb' => + simp only [mul_add, map_add, ha', hb'] + ring + | tmul c' b' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, + mcDeriv_mul, TensorProduct.tmul_add] /-- The polynomial coordinates of the correction derivations. -/ -lemma equivMvPolynomial_mcDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) +lemma equivMvPolynomial_mcDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (x : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (mcDeriv u t x) = + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (mcDeriv U t x) = (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (MvPolynomial.C (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by simp only [mcDeriv, LinearMap.coe_comp, Function.comp_apply, @@ -1512,23 +1496,23 @@ lemma equivMvPolynomial_mcDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ F /-- Commutation of the correction derivations with the total derivative: the weight of the correction absorbs the derivative index. -/ -lemma mcDeriv_jetDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcDeriv_jetDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - mcDeriv u t (jetDeriv ν x) = - jetDeriv ν (mcDeriv u t x) + mcDeriv u (t + {ν}) x := by + mcDeriv U t (jetDeriv ν x) = + jetDeriv ν (mcDeriv U t x) + mcDeriv U (t + {ν}) x := by have key : ∀ p : MvPolynomial JetGenerators ℝ, (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (MvPolynomial.C (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (MvPolynomial.C (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) p) + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing u (JetComponentSpace.basis + (MvPolynomial.C (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti (t + {ν}) g))) : MvPolynomial JetGenerators ℝ)) p := by intro p induction p using MvPolynomial.induction_on with @@ -1538,135 +1522,44 @@ lemma mcDeriv_jetDeriv (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) simp only [map_add, hp, hq] ring | mul_X p g ih => - have hlam : mcPairing u (JetComponentSpace.basis + have hlam : mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t (JetGenerators.shift ν g))) = - mcPairing u (JetComponentSpace.basis + mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti (t + {ν}) g)) := by rw [JetGenerators.shiftMulti_shift] simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, MvPolynomial.derivation_C, map_add, mul_zero, zero_add] rw [ih, hlam] ring - rw [show mcDeriv u t (jetDeriv ν x) = + rw [show mcDeriv U t (jetDeriv ν x) = (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis - (mcDeriv u t (jetDeriv ν x))) from + (mcDeriv U t (jetDeriv ν x))) from (AlgEquiv.symm_apply_apply _ _).symm, equivMvPolynomial_mcDeriv, equivMvPolynomial_jetDeriv, key, map_add, - ← equivMvPolynomial_mcDeriv u t x, ← equivMvPolynomial_jetDeriv ν (mcDeriv u t x), - AlgEquiv.symm_apply_apply, ← equivMvPolynomial_mcDeriv u (t + {ν}) x, + ← equivMvPolynomial_mcDeriv U t x, ← equivMvPolynomial_jetDeriv ν (mcDeriv U t x), + AlgEquiv.symm_apply_apply, ← equivMvPolynomial_mcDeriv U (t + {ν}) x, AlgEquiv.symm_apply_apply] -/-! - -## The field strength of the B boson - --/ - -/-- The field strength of the B boson: the antisymmetrized derivative of the - component functions, which is gauge-invariant. -/ -noncomputable def fieldStrength (μ ν : Fin 1 ⊕ Fin 3) : BBoson.JetAlgebra := - ofGenerator (JetGenerators.dB {μ} ν) - ofGenerator (JetGenerators.dB {ν} μ) - -lemma fieldStrength_antisymm (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrength μ ν = -fieldStrength ν μ := by - simp [fieldStrength] - -lemma repJetGaugeGroupI_fieldStrength (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (fieldStrength μ ν) = fieldStrength μ ν := by - simp only [fieldStrength, map_sub, ofGenerator, repJetGaugeGroupI_ι, mcPairing_basis_dB] - rw [mcSeriesCoeff_single_symm] - abel - -noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra := - ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) - -lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν = -fieldStrengthDeriv s ν μ := by - simp [fieldStrengthDeriv] - -lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by - simp only [fieldStrengthDeriv, map_sub, ofGenerator, repJetGaugeGroupI_ι] - rw [mcPairing_basis_dB_symm] - abel - -lemma fieldStrengthDeriv_bianchi_identity (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν ρ : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv (s + {μ}) ν ρ + fieldStrengthDeriv (s + {ν}) ρ μ + - fieldStrengthDeriv (s + {ρ}) μ ν = 0 := by - simp only [fieldStrengthDeriv] - grind - -/-! - -## Invariance under the gauge group - --/ - -/-- Conjugating the jet gauge action by the polynomial coordinates of the jet - algebra: under `SymmetricAlgebra.equivMvPolynomial` the substitution - automorphism `x ↦ x + ⟨mc, x⟩ 1` becomes the translation of every polynomial - variable by the Maurer–Cartan pairing of the corresponding component - function. -/ -lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (repJetGaugeGroupI U V) = - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := by - have h : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom.comp - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2)) = - (MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g)))).comp - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom := by - refine SymmetricAlgebra.algHom_ext (JetComponentSpace.basis.ext fun g => ?_) - show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U.2.2) - (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) = - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) - ((SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) - (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) - rw [SymmetricAlgebra.lift_ι_apply] - simp only [LinearMap.add_apply, LinearMap.coe_comp, Function.comp_apply, - Algebra.linearMap_apply, map_add, AlgEquiv.commutes, - SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.aeval_X, - MvPolynomial.algebraMap_eq] - exact DFunLike.congr_fun h V - -/-- The conjugated action of a `U(1)` jet embedded in the jet gauge group. -/ -lemma equivMvPolynomial_repJetGaugeGroupI_u1 (u : unitary JetRing) (V : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis - (repJetGaugeGroupI (1, 1, u) V) = - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing u (JetComponentSpace.basis g))) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := - equivMvPolynomial_repJetGaugeGroupI (1, 1, u) V - /-- Commutation of the jet gauge action with the total derivative: the substitution action commutes with `∂_ν` up to the Maurer–Cartan correction derivation of weight `{ν}`. -/ lemma repJetGaugeGroupI_jetDeriv (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) - (x : JetAlgebra) : - repJetGaugeGroupI U (jetDeriv ν x) = - jetDeriv ν (repJetGaugeGroupI U x) + - repJetGaugeGroupI U (mcDeriv U.2.2 {ν} x) := by + (x : JetAlgebra) : repJetGaugeGroupI U (jetDeriv ν x) = + jetDeriv ν (repJetGaugeGroupI U x) + repJetGaugeGroupI U (mcDeriv U {ν} x) := by have key : ∀ p : MvPolynomial JetGenerators ℝ, MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) + MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) (MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) p) + + MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) p) + MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis g))) + MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing U.2.2 (JetComponentSpace.basis + (MvPolynomial.C (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti {ν} g))) : MvPolynomial JetGenerators ℝ)) p) := by intro p induction p using MvPolynomial.induction_on with @@ -1676,8 +1569,8 @@ lemma repJetGaugeGroupI_jetDeriv (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) simp only [map_add, hp, hq] ring | mul_X p g ih => - have hlam : mcPairing U.2.2 (JetComponentSpace.basis (JetGenerators.shift ν g)) = - mcPairing U.2.2 (JetComponentSpace.basis + have hlam : mcPairing U (JetComponentSpace.basis (JetGenerators.shift ν g)) = + mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti {ν} g)) := by rw [JetGenerators.shiftMulti_singleton] simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, @@ -1693,26 +1586,12 @@ lemma repJetGaugeGroupI_jetDeriv (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) equivMvPolynomial_repJetGaugeGroupI, equivMvPolynomial_jetDeriv, key, map_add, ← equivMvPolynomial_repJetGaugeGroupI U x, ← equivMvPolynomial_jetDeriv ν (repJetGaugeGroupI U x), - ← equivMvPolynomial_mcDeriv U.2.2 {ν} x, - ← equivMvPolynomial_repJetGaugeGroupI U (mcDeriv U.2.2 {ν} x), + ← equivMvPolynomial_mcDeriv U {ν} x, + ← equivMvPolynomial_repJetGaugeGroupI U (mcDeriv U {ν} x), AlgEquiv.symm_apply_apply] congr 1 exact AlgEquiv.symm_apply_apply _ _ -/-! - -## Complexified commutation relations - -The complexified forms, on `ℂ ⊗ JetAlgebra`, of the commutation relations -between the gauge action, the total derivative, and the Maurer–Cartan -correction derivations; these drive the covariance of the covariant derivatives -of charged fields. - --/ - -lemma complexRepJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : JetAlgebra) : - complexRepJetGaugeGroupI U (c ⊗ₜ[ℝ] b) = c ⊗ₜ[ℝ] repJetGaugeGroupI U b := rfl - /-- The complexified commutation of the gauge action with the total derivative. -/ lemma complexRepJetGaugeGroupI_baseChange_jetDeriv (U : JetGaugeGroupI) @@ -1720,7 +1599,7 @@ lemma complexRepJetGaugeGroupI_baseChange_jetDeriv (U : JetGaugeGroupI) complexRepJetGaugeGroupI U (LinearMap.baseChange ℂ (jetDeriv ν) y) = LinearMap.baseChange ℂ (jetDeriv ν) (complexRepJetGaugeGroupI U y) + complexRepJetGaugeGroupI U - (LinearMap.baseChange ℂ (mcDeriv U.2.2 {ν}) y) := by + (LinearMap.baseChange ℂ (mcDeriv U {ν}) y) := by induction y using TensorProduct.induction_on with | zero => simp | add a b ha hb => @@ -1732,12 +1611,12 @@ lemma complexRepJetGaugeGroupI_baseChange_jetDeriv (U : JetGaugeGroupI) /-- The complexified commutation of the correction derivations with the total derivative. -/ -lemma mcDeriv_baseChange_jetDeriv (u : unitary JetRing) +lemma mcDeriv_baseChange_jetDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] JetAlgebra) : - LinearMap.baseChange ℂ (mcDeriv u t) (LinearMap.baseChange ℂ (jetDeriv ν) y) = + LinearMap.baseChange ℂ (mcDeriv U t) (LinearMap.baseChange ℂ (jetDeriv ν) y) = LinearMap.baseChange ℂ (jetDeriv ν) - (LinearMap.baseChange ℂ (mcDeriv u t) y) + - LinearMap.baseChange ℂ (mcDeriv u (t + {ν})) y := by + (LinearMap.baseChange ℂ (mcDeriv U t) y) + + LinearMap.baseChange ℂ (mcDeriv U (t + {ν})) y := by induction y using TensorProduct.induction_on with | zero => simp | add a b ha hb => @@ -1746,80 +1625,183 @@ lemma mcDeriv_baseChange_jetDeriv (u : unitary JetRing) | tmul c b => simp only [LinearMap.baseChange_tmul, mcDeriv_jetDeriv, TensorProduct.tmul_add] -/-- The complexified Leibniz rule for the correction derivations. -/ -lemma mcDeriv_baseChange_mul (u : unitary JetRing) (t : Multiset (Fin 1 ⊕ Fin 3)) - (x y : ℂ ⊗[ℝ] JetAlgebra) : - LinearMap.baseChange ℂ (mcDeriv u t) (x * y) = - LinearMap.baseChange ℂ (mcDeriv u t) x * y + - x * LinearMap.baseChange ℂ (mcDeriv u t) y := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [add_mul, map_add, ha, hb] - ring - | tmul c b => - induction y using TensorProduct.induction_on with - | zero => simp - | add a' b' ha' hb' => - simp only [mul_add, map_add, ha', hb'] - ring - | tmul c' b' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, - mcDeriv_mul, TensorProduct.tmul_add] - -/-- The complexified gauge action is multiplicative. -/ -lemma complexRepJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : ℂ ⊗[ℝ] JetAlgebra) : - complexRepJetGaugeGroupI U (x * y) = - complexRepJetGaugeGroupI U x * complexRepJetGaugeGroupI U y := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [add_mul, map_add, ha, hb] - | tmul c b => - induction y using TensorProduct.induction_on with - | zero => simp - | add a' b' ha' hb' => - simp only [mul_add, map_add, ha', hb'] - | tmul c' b' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, complexRepJetGaugeGroupI_tmul, - repJetGaugeGroupI_mul] - -lemma repJetGaugeGroupI_one (U : JetGaugeGroupI) : - repJetGaugeGroupI U (1 : JetAlgebra) = 1 := by - have h := repJetGaugeGroupI_algebraMap U 1 - simpa using h - -/-- The complexified gauge action on a jet-algebra generator: the Maurer–Cartan - shift of the component function. -/ -lemma complexRepJetGaugeGroupI_ofGenerator (U : JetGaugeGroupI) (g : JetGenerators) : - complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = - (1 : ℂ) ⊗ₜ[ℝ] ofGenerator g + - ((mcPairing U.2.2 (JetComponentSpace.basis g) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by - rw [complexRepJetGaugeGroupI_tmul, ofGenerator, repJetGaugeGroupI_ι, - TensorProduct.tmul_add, Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, - show ((mcPairing U.2.2 (JetComponentSpace.basis g) : ℝ) : ℂ) = - algebraMap ℝ ℂ (mcPairing U.2.2 (JetComponentSpace.basis g)) from rfl, - algebraMap_smul] /-- The complexified correction derivation on a jet-algebra generator. -/ -lemma mcDeriv_baseChange_ofGenerator (u : unitary JetRing) +lemma mcDeriv_baseChange_ofGenerator (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (g : JetGenerators) : - LinearMap.baseChange ℂ (mcDeriv u t) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = - ((mcPairing u (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) • + LinearMap.baseChange ℂ (mcDeriv U t) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = + ((mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by rw [LinearMap.baseChange_tmul, mcDeriv_ofGenerator, Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, - show ((mcPairing u (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) = - algebraMap ℝ ℂ (mcPairing u (JetComponentSpace.basis + show ((mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) = + algebraMap ℝ ℂ (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) from rfl, algebraMap_smul] -/-- The complexified total derivative on a jet-algebra generator. -/ -lemma jetDeriv_baseChange_ofGenerator (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : - LinearMap.baseChange ℂ (jetDeriv ν) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = - (1 : ℂ) ⊗ₜ[ℝ] ofGenerator (JetGenerators.shift ν g) := by - rw [LinearMap.baseChange_tmul, jetDeriv_ofGenerator] +/-! + +## The field strength of the B boson + +-/ + +/-- The field strength of the B boson: the antisymmetrized derivative of the + component functions, which is gauge-invariant. -/ +noncomputable def fieldStrength (μ ν : Fin 1 ⊕ Fin 3) : BBoson.JetAlgebra := + ofGenerator (JetGenerators.dB {μ} ν) - ofGenerator (JetGenerators.dB {ν} μ) + +lemma fieldStrength_antisymm (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength μ ν = -fieldStrength ν μ := by + simp [fieldStrength] + +lemma repJetGaugeGroupI_fieldStrength (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (fieldStrength μ ν) = fieldStrength μ ν := by + simp only [fieldStrength, map_sub, ofGenerator, repJetGaugeGroupI_ι, mcPairing_basis_dB] + rw [maurerCartanU1Coeff_single_symm] + abel + +noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra := + ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) + +lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν = -fieldStrengthDeriv s ν μ := by + simp [fieldStrengthDeriv] + +lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by + simp only [fieldStrengthDeriv, map_sub, ofGenerator, repJetGaugeGroupI_ι] + rw [mcPairing_basis_dB_symm] + abel + +lemma fieldStrengthDeriv_bianchi_identity (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν ρ : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv (s + {μ}) ν ρ + fieldStrengthDeriv (s + {ν}) ρ μ + + fieldStrengthDeriv (s + {ρ}) μ ν = 0 := by + simp only [fieldStrengthDeriv] + grind + + +/-! + +## A. Invariance under the gauge group + +We now want to show that the if an element of the jet algebra is invariant under +the action of the jet gauge group, then it is a polynomial +in the field strength and its derivatives. + +-/ + + +/-! + +## Gauge realization of translations of the jet coordinates + +To identify the gauge invariants of the jet algebra we need not only that every +jet gauge transformation shifts the component functions by the Maurer–Cartan +pairing, but also that enough shifts are realized: for every nonzero symmetrized +multi-index `t` and every real `r` there is a jet of a local `U(1)` gauge +transformation shifting every component function with total multi-index `t` by +exactly `r`, and all others by nothing. The transformation realizing this is the +exponential `exp(-i a X^t)` with `a = r / t!`, formalized through +`MvPowerSeries.expMonomial`. + +-/ + +/-- The jet of the local `U(1)` gauge transformation `exp(-i a X^w)`: the + exponential of an imaginary multiple of a spacetime monomial, which is unitary + as a formal power series. -/ +noncomputable def expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + unitary JetRing := + ⟨expMonomial (-(a : ℂ) * Complex.I) w, by + have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by + rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] + ring + rw [Unitary.mem_iff, star_expMonomial hw, hstar, expMonomial_mul_expMonomial hw, + expMonomial_mul_expMonomial hw, neg_add_cancel, add_neg_cancel, + expMonomial_zero hw] + exact ⟨rfl, rfl⟩⟩ + +/-- The Maurer–Cartan series of the exponential gauge jet: the monomial + `a w_ν X^{w - e_ν}`, which is the jet of the gradient `a ∂_ν X^w`. -/ +lemma maurerCartanU1_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) + (ν : Fin 1 ⊕ Fin 3) : + maurerCartanU1 (1, 1, expUnitary a w hw) ν = + monomial (w - Finsupp.single ν 1) ((a : ℂ) * ((w ν : ℕ) : ℂ)) := by + have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by + rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] + ring + rw [maurerCartanU1, + show (((1, 1, expUnitary a w hw) : JetGaugeGroupI).2.2 : JetRing) = + expMonomial (-(a : ℂ) * Complex.I) w from rfl, + pderiv_expMonomial hw, star_expMonomial hw, hstar, smul_mul_assoc, + mul_assoc (monomial (w - Finsupp.single ν 1) 1), + expMonomial_mul_expMonomial hw, add_neg_cancel, expMonomial_zero hw, mul_one, + mul_smul_comm, ← monomial_zero_eq_C_apply, monomial_mul_monomial, zero_add, + ← map_smul, smul_eq_mul] + congr 1 + ring_nf + rw [Complex.I_sq] + ring + +/-- The Maurer–Cartan pairing of the exponential gauge jet `exp(-i a X^t)` with + `a = r / t!`: it shifts precisely the component functions whose total + symmetrized multi-index is `t`, and shifts them all by `r`. -/ +lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) + (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) : + mcPairing (1, 1, expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = + if s + {ν} = t then r else 0 := by + rw [mcPairing_basis_dB', Complex.selfAdjointEquiv_apply, + show ((maurerCartanU1Coeff (1, 1, expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + (Multiset.toFinsupp t) ht) ν (Multiset.toFinsupp s) : selfAdjoint ℂ) : ℂ) = + coeff (Multiset.toFinsupp s) (maurerCartanU1 (1, 1, expUnitary + (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + (Multiset.toFinsupp t) ht) ν) from rfl, + maurerCartanU1_expUnitary, coeff_monomial] + by_cases hcase : s + {ν} = t + · rw [if_pos hcase] + have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by + rw [← Multiset.toFinsupp_singleton, ← map_add] + exact congrArg _ hcase + have hwv : Multiset.toFinsupp t ν = Multiset.toFinsupp s ν + 1 := by + rw [← hmw] + simp + have hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 := + eq_tsub_of_add_eq hmw + have hF : (∏ ρ, Nat.factorial ((Multiset.toFinsupp t) ρ)) = + ((Multiset.toFinsupp s) ν + 1) * + ∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) := by + rw [← hmw] + exact prod_factorial_add_single (Multiset.toFinsupp s) ν + rw [if_pos hm, nsmul_eq_mul, hwv, hF] + have h1 : (((Multiset.toFinsupp s) ν + 1 : ℕ) : ℝ) ≠ 0 := by + positivity + have h2 : ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) : ℕ) : ℝ) ≠ 0 := by + rw [Nat.cast_ne_zero] + exact Finset.prod_ne_zero_iff.mpr fun ρ _ => Nat.factorial_ne_zero _ + simp only [Complex.mul_re, Complex.ofReal_re, Complex.ofReal_im, Complex.natCast_re, + Complex.natCast_im, mul_zero, sub_zero] + push_cast + field_simp + · rw [if_neg hcase] + by_cases hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 + · by_cases hwv : Multiset.toFinsupp t ν = 0 + · rw [if_pos hm, hwv] + simp + · exfalso + apply hcase + have hle : Finsupp.single ν 1 ≤ Multiset.toFinsupp t := + Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) + have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by + rw [hm, tsub_add_cancel_of_le hle] + refine Multiset.toFinsupp.injective ?_ + rw [map_add, Multiset.toFinsupp_singleton] + exact hmw + · rw [if_neg hm] + simp + /-- The difference between a jet-algebra generator and its canonical representative is a derivative of the field strength, or zero. -/ @@ -1881,7 +1863,7 @@ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : (Multiset.toFinsupp (s₀ + {ν₀})) hne) V rw [hV _] at hconj have hfun : (fun g => MvPolynomial.X g + MvPolynomial.C - (mcPairing (expUnitary + (mcPairing (1, 1, expUnitary (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) (Multiset.toFinsupp (s₀ + {ν₀})) hne) (JetComponentSpace.basis g))) = diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index 15d16fd4c..efbdd400a 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -18,16 +18,18 @@ public import Physlib.Mathematics.MvPowerSeriesDerivative public import Physlib.Mathematics.MvPolynomialTranslation public import Mathlib.Algebra.MvPolynomial.Derivation /-! -# The B boson +# The Maurer–Cartan forms of the jet gauge group -The hypercharge gauge boson field `B_μ`: the gauge boson of the `U(1)` factor of -the Standard Model gauge group, with one Lorentz index, valued in the -one-dimensional adjoint of `U(1)`, modelled as the real vector space of hermitian -complex numbers. +The Maurer–Cartan forms `i (∂_ν U) U†` of a jet of gauge transformations, one for +each factor of the Standard Model gauge group: the scalar-valued `U(1)` form and +the matrix-valued `SU(3)` and `SU(2)` forms. These are the inhomogeneous terms in +the local gauge transformations of the corresponding gauge bosons. -The physical Z boson and photon are the electroweak-mixed combinations of this -field with the neutral `SU(2)` boson; before mixing, the `U(1)` factor's gauge -boson is the B boson formalized here. +The abelian `U(1)` form is an additive cocycle; the nonabelian forms satisfy the +twisted cocycle law `mc(UV) = mc(U) + U mc(V) U†`. Each form satisfies its +Maurer–Cartan structure equation, relating the antisymmetrized derivative to the +commutator; in the abelian case the derivative is symmetric, i.e. the form is +closed. -/ @@ -41,6 +43,9 @@ open MvPowerSeries -/ +/-- The `U(1)` Maurer–Cartan form of a jet of gauge transformations in the + direction `ν`: the series `i (∂_ν u) ū` for `u` the hypercharge factor of the + jet. -/ noncomputable def maurerCartanU1 (g : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : JetRing := (MvPowerSeries.C Complex.I : JetRing) * (pderiv ℂ ν (g.2.2 : JetRing) * star (g.2.2 : JetRing)) @@ -152,6 +157,80 @@ lemma maurerCartanSU2_mul (g1 g2 : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : congr 1 rw [mul_assoc, ← mul_assoc (V.map (pderiv ℂ ν)), ← mul_assoc U] + +/-- The Maurer–Cartan series is hermitian: `star (i (∂_ν u) ū) = i (∂_ν u) ū`, + by differentiating the unitarity relation `u ū = 1`. All its Taylor + coefficients are therefore real. -/ +lemma star_maurerCartanU1 (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + star (maurerCartanU1 U ν) = maurerCartanU1 U ν := by + have hu : (U.2.2 : JetRing) * star (U.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp U.2.2.2).2 + have h0 : pderiv ℂ ν ((U.2.2 : JetRing) * star (U.2.2 : JetRing)) = 0 := by + rw [hu, pderiv_one] + rw [Derivation.leibniz] at h0 + simp only [smul_eq_mul] at h0 + have hq : pderiv ℂ ν (star (U.2.2 : JetRing)) * (U.2.2 : JetRing) = + -(pderiv ℂ ν (U.2.2 : JetRing) * star (U.2.2 : JetRing)) := by + linear_combination h0 + rw [maurerCartanU1, star_mul', JetRing.star_C, star_mul', star_star, ← JetRing.pderiv_star, hq, + show (star Complex.I) = -Complex.I by simp, map_neg, neg_mul, mul_neg, neg_neg] + +/-- The `SU(3)` Maurer–Cartan form is hermitian: `(i (∂_ν U) U†)† = i (∂_ν U) U†`, + by differentiating the unitarity relation `U U† = 1` entrywise. -/ +lemma star_maurerCartanSU3 (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + star (maurerCartanSU3 U ν) = maurerCartanSU3 U ν := by + rw [maurerCartanSU3] + set A : Matrix (Fin 3) (Fin 3) JetRing := (U.1 : Matrix (Fin 3) (Fin 3) JetRing) with hA + have hU : A * star A = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hone : (1 : Matrix (Fin 3) (Fin 3) JetRing).map (pderiv ℂ ν) = 0 := by + ext i j : 1 + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ν)] + have hleib : (A * star A).map (pderiv ℂ ν) = + A.map (pderiv ℂ ν) * star A + A * (star A).map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + have h0 : A.map (pderiv ℂ ν) * star A + A * (star A).map (pderiv ℂ ν) = 0 := by + rw [← hleib, hU, hone] + have hq : A * ((star A).map (pderiv ℂ ν)) = -(A.map (pderiv ℂ ν) * star A) := + eq_neg_of_add_eq_zero_right h0 + have hstarmap : star (A.map (pderiv ℂ ν)) = (star A).map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.star_apply, Matrix.map_apply] + exact (JetRing.pderiv_star ν (A j i)).symm + rw [star_smul, star_mul, star_star, hstarmap, hq, JetRing.star_C, + show (star Complex.I) = -Complex.I by simp, map_neg, neg_smul, smul_neg, neg_neg] + +/-- The `SU(2)` Maurer–Cartan form is hermitian; see `star_maurerCartanSU3`. -/ +lemma star_maurerCartanSU2 (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + star (maurerCartanSU2 U ν) = maurerCartanSU2 U ν := by + rw [maurerCartanSU2] + set A : Matrix (Fin 2) (Fin 2) JetRing := (U.2.1 : Matrix (Fin 2) (Fin 2) JetRing) with hA + have hU : A * star A = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hone : (1 : Matrix (Fin 2) (Fin 2) JetRing).map (pderiv ℂ ν) = 0 := by + ext i j : 1 + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ν)] + have hleib : (A * star A).map (pderiv ℂ ν) = + A.map (pderiv ℂ ν) * star A + A * (star A).map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + have h0 : A.map (pderiv ℂ ν) * star A + A * (star A).map (pderiv ℂ ν) = 0 := by + rw [← hleib, hU, hone] + have hq : A * ((star A).map (pderiv ℂ ν)) = -(A.map (pderiv ℂ ν) * star A) := + eq_neg_of_add_eq_zero_right h0 + have hstarmap : star (A.map (pderiv ℂ ν)) = (star A).map (pderiv ℂ ν) := by + ext i j : 1 + simp only [Matrix.star_apply, Matrix.map_apply] + exact (JetRing.pderiv_star ν (A j i)).symm + rw [star_smul, star_mul, star_star, hstarmap, hq, JetRing.star_C, + show (star Complex.I) = -Complex.I by simp, map_neg, neg_smul, smul_neg, neg_neg] + /-! ### Derivatives of the Maurer–Cartan forms From c09152ea811822cd1694c0f519ea8d805865b256 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 5 Aug 2026 06:00:21 +0100 Subject: [PATCH 090/254] Update BBoson.lean --- .../StandardModel/GaugeBosons/BBoson.lean | 499 +++++++++--------- 1 file changed, 245 insertions(+), 254 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 6fe033423..341cb63ce 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -34,259 +34,6 @@ boson is the B boson formalized here. @[expose] public section -namespace MvPowerSeries - -variable {σ R : Type*} - -/-! - -## Ab. The exponential of a monomial - -The gauge invariants of the B-boson jet algebra are computed below by realizing -arbitrary translations of the jet coordinates through explicit local `U(1)` gauge -transformations. These are the formal exponentials `exp (c X^w)` of a single -monomial, defined here coefficientwise; the exponential property -`exp(c X^w) exp(c' X^w) = exp((c + c') X^w)` gives unitarity for imaginary `c`, -and the chain rule gives their Maurer–Cartan series. - --/ - -section ExpMonomial - -variable {K : Type*} [Field K] [CharZero K] {w : σ →₀ ℕ} - -open Classical in -/-- The formal exponential of `c` times the monomial with exponent `w`: the power - series `∑ₙ (cⁿ/n!) X^{n w}`, defined coefficientwise. -/ -noncomputable def expMonomial (c : K) (w : σ →₀ ℕ) : MvPowerSeries σ K := - fun k => if h : ∃ n : ℕ, k = n • w then c ^ h.choose / (h.choose.factorial : K) else 0 - -/-- A nonzero exponent has a coordinate at which it is nonzero. -/ -lemma exists_apply_ne_zero_of_ne_zero (hw : w ≠ 0) : ∃ ρ, w ρ ≠ 0 := by - obtain ⟨ρ, hρ⟩ := Finsupp.ne_iff.mp hw - exact ⟨ρ, by simpa using hρ⟩ - -/-- Multiples of a nonzero exponent determine the multiplier. -/ -lemma nsmul_right_cancel (hw : w ≠ 0) {n m : ℕ} (h : n • w = m • w) : n = m := by - obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw - have h' := DFunLike.congr_fun h ρ - simp only [Finsupp.smul_apply, smul_eq_mul] at h' - exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) h' - -omit [CharZero K] in -/-- The Taylor coefficient of the exponential of a monomial at a multiple of the - exponent. -/ -lemma coeff_expMonomial_nsmul (hw : w ≠ 0) (c : K) (n : ℕ) : - coeff (n • w) (expMonomial c w) = c ^ n / (n.factorial : K) := by - have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ - rw [coeff_apply] - simp only [expMonomial] - rw [dif_pos h, show h.choose = n from (nsmul_right_cancel hw h.choose_spec).symm] - -omit [CharZero K] in -/-- The Taylor coefficients of the exponential of a monomial vanish away from the - multiples of the exponent. -/ -lemma coeff_expMonomial_of_forall_ne (c : K) {k : σ →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : - coeff k (expMonomial c w) = 0 := by - rw [coeff_apply] - simp only [expMonomial] - rw [dif_neg (not_exists.mpr hk)] - -/-- The exponential property: exponentials of the same monomial multiply by adding - the scalars. -/ -lemma expMonomial_mul_expMonomial (hw : w ≠ 0) (c c' : K) : - expMonomial c w * expMonomial c' w = expMonomial (c + c') w := by - classical - ext k - by_cases hk : ∃ n : ℕ, k = n • w - · obtain ⟨N, rfl⟩ := hk - rw [coeff_mul, coeff_expMonomial_nsmul hw] - have hsub : (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) ⊆ - Finset.antidiagonal (N • w) := by - intro p hp - obtain ⟨n, hn, rfl⟩ := Finset.mem_image.mp hp - rw [Finset.mem_antidiagonal, ← add_smul, - Nat.add_sub_cancel' (Nat.lt_succ_iff.mp (Finset.mem_range.mp hn))] - have hvanish : ∀ p ∈ Finset.antidiagonal (N • w), - p ∉ (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) → - coeff p.1 (expMonomial c w) * coeff p.2 (expMonomial c' w) = 0 := by - intro p hp hpn - by_cases h1 : ∃ n : ℕ, p.1 = n • w - · obtain ⟨n₁, h1⟩ := h1 - exfalso - apply hpn - have hsum : p.1 + p.2 = N • w := Finset.mem_antidiagonal.mp hp - obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw - have hcoords : ∀ ρ', n₁ * w ρ' + p.2 ρ' = N * w ρ' := by - intro ρ' - have h' := DFunLike.congr_fun hsum ρ' - simpa [h1, Finsupp.smul_apply] using h' - have hle : n₁ ≤ N := - Nat.le_of_mul_le_mul_right (by have := hcoords ρ; omega) - (Nat.pos_of_ne_zero hρ) - have h2 : p.2 = (N - n₁) • w := by - ext ρ' - rw [Finsupp.smul_apply, smul_eq_mul, Nat.sub_mul] - have := hcoords ρ' - omega - exact Finset.mem_image.mpr - ⟨n₁, Finset.mem_range.mpr (Nat.lt_succ_of_le hle), by rw [← h1, ← h2]⟩ - · rw [coeff_expMonomial_of_forall_ne c (not_exists.mp h1), zero_mul] - rw [← Finset.sum_subset hsub hvanish, - Finset.sum_image (fun n _ m _ h => nsmul_right_cancel hw (congrArg Prod.fst h)), - add_pow, Finset.sum_div] - refine Finset.sum_congr rfl fun n hn => ?_ - rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw] - have hle : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) - have hfact : ((N.choose n : K)) * (n.factorial : K) * ((N - n).factorial : K) = - (N.factorial : K) := by - exact_mod_cast congrArg (Nat.cast : ℕ → K) - (Nat.choose_mul_factorial_mul_factorial hle) - have h1 : (n.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr n.factorial_ne_zero - have h2 : ((N - n).factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr (N - n).factorial_ne_zero - have h3 : (N.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr N.factorial_ne_zero - rw [div_mul_div_comm, div_eq_div_iff (mul_ne_zero h1 h2) h3] - linear_combination (-(c ^ n * c' ^ (N - n))) * hfact - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_mul] - refine Finset.sum_eq_zero fun p hp => ?_ - by_cases h1 : ∃ n : ℕ, p.1 = n • w - · by_cases h2 : ∃ n : ℕ, p.2 = n • w - · exfalso - obtain ⟨n₁, h1⟩ := h1 - obtain ⟨n₂, h2⟩ := h2 - exact hk ⟨n₁ + n₂, by rw [← Finset.mem_antidiagonal.mp hp, h1, h2, add_smul]⟩ - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h2), mul_zero] - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h1), zero_mul] - -/-- The coefficientwise star of the exponential of a monomial is the exponential at - the starred scalar. -/ -lemma star_expMonomial {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : m ≠ 0) (c : ℂ) : - star (expMonomial c m : JetRing) = expMonomial (star c) m := by - ext k - rw [JetRing.coeff_star] - by_cases hk : ∃ n : ℕ, k = n • m - · obtain ⟨n, rfl⟩ := hk - rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw, star_div₀, star_pow, - star_natCast] - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), - coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), star_zero] - -/-- The exponential of a monomial at scalar zero is one. -/ -lemma expMonomial_zero (hw : w ≠ 0) : expMonomial (0 : K) w = 1 := by - classical - ext k - by_cases hk : ∃ n : ℕ, k = n • w - · obtain ⟨n, rfl⟩ := hk - rw [coeff_expMonomial_nsmul hw, coeff_one] - rcases Nat.eq_zero_or_pos n with hn | hn - · subst hn - rw [if_pos (zero_smul ℕ w)] - simp - · have hne : ¬n • w = 0 := by - obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw - intro h0 - have h' := DFunLike.congr_fun h0 ρ - simp only [Finsupp.smul_apply, smul_eq_mul, Finsupp.coe_zero, Pi.zero_apply, - Nat.mul_eq_zero] at h' - omega - rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg hne] - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_one, - if_neg (fun h => hk ⟨0, by rw [h, zero_smul]⟩)] - -/-- The chain rule for the exponential of a monomial: - `∂_ν exp(c X^w) = c w_ν X^{w - e_ν} exp(c X^w)`. -/ -lemma pderiv_expMonomial (hw : w ≠ 0) (ν : σ) (c : K) : - pderiv K ν (expMonomial c w) = - (c * (w ν : K)) • (monomial (w - Finsupp.single ν 1) 1 * expMonomial c w) := by - classical - ext k - rw [coeff_pderiv, map_smul, smul_eq_mul, coeff_monomial_mul] - by_cases hA : ∃ n : ℕ, k + Finsupp.single ν 1 = n • w - · obtain ⟨n, hn⟩ := hA - have hcoords : ∀ ρ, k ρ + (Finsupp.single ν 1) ρ = n * w ρ := by - intro ρ - have h' := DFunLike.congr_fun hn ρ - simpa [Finsupp.smul_apply] using h' - have hkν : k ν + 1 = n * w ν := by - have := hcoords ν - rwa [Finsupp.single_eq_same] at this - have hnpos : 0 < n := by - rcases Nat.eq_zero_or_pos n with h0 | h0 - · subst h0; omega - · exact h0 - have hwνpos : 0 < w ν := by - rcases Nat.eq_zero_or_pos (w ν) with h0 | h0 - · rw [h0, Nat.mul_zero] at hkν; omega - · exact h0 - have hdk : w - Finsupp.single ν 1 ≤ k := by - rw [Finsupp.le_def] - intro ρ - rw [Finsupp.tsub_apply] - have h1 := hcoords ρ - have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos - by_cases hρν : ρ = ν - · subst hρν - rw [Finsupp.single_eq_same] at h1 ⊢ - omega - · have hsρ : (Finsupp.single ν 1) ρ = 0 := - Finsupp.single_eq_of_ne hρν - rw [hsρ] at h1 ⊢ - omega - have hkd : k - (w - Finsupp.single ν 1) = (n - 1) • w := by - ext ρ - rw [Finsupp.tsub_apply, Finsupp.tsub_apply, Finsupp.smul_apply, smul_eq_mul, - Nat.sub_mul, one_mul] - have h1 := hcoords ρ - have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos - by_cases hρν : ρ = ν - · subst hρν - rw [Finsupp.single_eq_same] at h1 ⊢ - omega - · have hsρ : (Finsupp.single ν 1) ρ = 0 := - Finsupp.single_eq_of_ne hρν - rw [hsρ] at h1 ⊢ - omega - rw [if_pos hdk, one_mul, hkd, hn, coeff_expMonomial_nsmul hw, - coeff_expMonomial_nsmul hw] - have hcast : ((k ν : K) + 1) = (n : K) * (w ν : K) := by exact_mod_cast hkν - rw [hcast] - have hfac : (n.factorial : K) = (n : K) * ((n - 1).factorial : K) := by - exact_mod_cast congrArg (Nat.cast : ℕ → K) - (Nat.mul_factorial_pred (Nat.pos_iff_ne_zero.mp hnpos)).symm - have hpow : c ^ n = c * c ^ (n - 1) := by - conv_lhs => rw [show n = 1 + (n - 1) by omega, pow_add, pow_one] - rw [hfac, hpow] - have h1 : ((n : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.pos_iff_ne_zero.mp hnpos) - have h2 : (((n - 1).factorial : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero _) - field_simp - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hA), zero_mul] - by_cases hwv : w ν = 0 - · rw [hwv] - simp - · have hzero : (if w - Finsupp.single ν 1 ≤ k then - 1 * coeff (k - (w - Finsupp.single ν 1)) (expMonomial c w) else 0) = 0 := by - split_ifs with hdk - · rw [one_mul] - refine coeff_expMonomial_of_forall_ne _ fun m hm => ?_ - apply hA - refine ⟨m + 1, ?_⟩ - have hle : Finsupp.single ν 1 ≤ w := - Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) - have h1 : k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) = k := - tsub_add_cancel_of_le hdk - have h2 : (w - Finsupp.single ν 1) + Finsupp.single ν 1 = w := - tsub_add_cancel_of_le hle - calc k + Finsupp.single ν 1 - = k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) + - Finsupp.single ν 1 := by rw [h1] - _ = m • w + w := by rw [hm, add_assoc, h2] - _ = (m + 1) • w := by rw [add_smul, one_smul] - · rfl - rw [hzero, mul_zero] - -end ExpMonomial - -end MvPowerSeries namespace StandardModel @@ -1695,7 +1442,251 @@ in the field strength and its derivatives. /-! -## Gauge realization of translations of the jet coordinates +### A.1 The exponential of a monomial + +The gauge invariants of the B-boson jet algebra are computed below by realizing +arbitrary translations of the jet coordinates through explicit local `U(1)` gauge +transformations. These are the formal exponentials `exp (c X^w)` of a single +monomial, defined here coefficientwise; the exponential property +`exp(c X^w) exp(c' X^w) = exp((c + c') X^w)` gives unitarity for imaginary `c`, +and the chain rule gives their Maurer–Cartan series. + +-/ + +variable {K : Type*} [Field K] [CharZero K] {w : σ →₀ ℕ} + +open Classical in +/-- The formal exponential of `c` times the monomial with exponent `w`: the power + series `∑ₙ (cⁿ/n!) X^{n w}`, defined coefficientwise. -/ +noncomputable def expMonomial (c : K) (w : σ →₀ ℕ) : MvPowerSeries σ K := + fun k => if h : ∃ n : ℕ, k = n • w then c ^ h.choose / (h.choose.factorial : K) else 0 + +/-- A nonzero exponent has a coordinate at which it is nonzero. -/ +lemma exists_apply_ne_zero_of_ne_zero (hw : w ≠ 0) : ∃ ρ, w ρ ≠ 0 := by + obtain ⟨ρ, hρ⟩ := Finsupp.ne_iff.mp hw + exact ⟨ρ, by simpa using hρ⟩ + +/-- Multiples of a nonzero exponent determine the multiplier. -/ +lemma nsmul_right_cancel (hw : w ≠ 0) {n m : ℕ} (h : n • w = m • w) : n = m := by + obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw + have h' := DFunLike.congr_fun h ρ + simp only [Finsupp.smul_apply, smul_eq_mul] at h' + exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) h' + +omit [CharZero K] in +/-- The Taylor coefficient of the exponential of a monomial at a multiple of the + exponent. -/ +lemma coeff_expMonomial_nsmul (hw : w ≠ 0) (c : K) (n : ℕ) : + coeff (n • w) (expMonomial c w) = c ^ n / (n.factorial : K) := by + have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ + rw [coeff_apply] + simp only [expMonomial] + rw [dif_pos h, show h.choose = n from (nsmul_right_cancel hw h.choose_spec).symm] + +omit [CharZero K] in +/-- The Taylor coefficients of the exponential of a monomial vanish away from the + multiples of the exponent. -/ +lemma coeff_expMonomial_of_forall_ne (c : K) {k : σ →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : + coeff k (expMonomial c w) = 0 := by + rw [coeff_apply] + simp only [expMonomial] + rw [dif_neg (not_exists.mpr hk)] + +/-- The exponential property: exponentials of the same monomial multiply by adding + the scalars. -/ +lemma expMonomial_mul_expMonomial (hw : w ≠ 0) (c c' : K) : + expMonomial c w * expMonomial c' w = expMonomial (c + c') w := by + classical + ext k + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨N, rfl⟩ := hk + rw [coeff_mul, coeff_expMonomial_nsmul hw] + have hsub : (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) ⊆ + Finset.antidiagonal (N • w) := by + intro p hp + obtain ⟨n, hn, rfl⟩ := Finset.mem_image.mp hp + rw [Finset.mem_antidiagonal, ← add_smul, + Nat.add_sub_cancel' (Nat.lt_succ_iff.mp (Finset.mem_range.mp hn))] + have hvanish : ∀ p ∈ Finset.antidiagonal (N • w), + p ∉ (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) → + coeff p.1 (expMonomial c w) * coeff p.2 (expMonomial c' w) = 0 := by + intro p hp hpn + by_cases h1 : ∃ n : ℕ, p.1 = n • w + · obtain ⟨n₁, h1⟩ := h1 + exfalso + apply hpn + have hsum : p.1 + p.2 = N • w := Finset.mem_antidiagonal.mp hp + obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw + have hcoords : ∀ ρ', n₁ * w ρ' + p.2 ρ' = N * w ρ' := by + intro ρ' + have h' := DFunLike.congr_fun hsum ρ' + simpa [h1, Finsupp.smul_apply] using h' + have hle : n₁ ≤ N := + Nat.le_of_mul_le_mul_right (by have := hcoords ρ; omega) + (Nat.pos_of_ne_zero hρ) + have h2 : p.2 = (N - n₁) • w := by + ext ρ' + rw [Finsupp.smul_apply, smul_eq_mul, Nat.sub_mul] + have := hcoords ρ' + omega + exact Finset.mem_image.mpr + ⟨n₁, Finset.mem_range.mpr (Nat.lt_succ_of_le hle), by rw [← h1, ← h2]⟩ + · rw [coeff_expMonomial_of_forall_ne c (not_exists.mp h1), zero_mul] + rw [← Finset.sum_subset hsub hvanish, + Finset.sum_image (fun n _ m _ h => nsmul_right_cancel hw (congrArg Prod.fst h)), + add_pow, Finset.sum_div] + refine Finset.sum_congr rfl fun n hn => ?_ + rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw] + have hle : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hfact : ((N.choose n : K)) * (n.factorial : K) * ((N - n).factorial : K) = + (N.factorial : K) := by + exact_mod_cast congrArg (Nat.cast : ℕ → K) + (Nat.choose_mul_factorial_mul_factorial hle) + have h1 : (n.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr n.factorial_ne_zero + have h2 : ((N - n).factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr (N - n).factorial_ne_zero + have h3 : (N.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr N.factorial_ne_zero + rw [div_mul_div_comm, div_eq_div_iff (mul_ne_zero h1 h2) h3] + linear_combination (-(c ^ n * c' ^ (N - n))) * hfact + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_mul] + refine Finset.sum_eq_zero fun p hp => ?_ + by_cases h1 : ∃ n : ℕ, p.1 = n • w + · by_cases h2 : ∃ n : ℕ, p.2 = n • w + · exfalso + obtain ⟨n₁, h1⟩ := h1 + obtain ⟨n₂, h2⟩ := h2 + exact hk ⟨n₁ + n₂, by rw [← Finset.mem_antidiagonal.mp hp, h1, h2, add_smul]⟩ + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h2), mul_zero] + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h1), zero_mul] + +/-- The coefficientwise star of the exponential of a monomial is the exponential at + the starred scalar. -/ +lemma star_expMonomial {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : m ≠ 0) (c : ℂ) : + star (expMonomial c m : JetRing) = expMonomial (star c) m := by + ext k + rw [JetRing.coeff_star] + by_cases hk : ∃ n : ℕ, k = n • m + · obtain ⟨n, rfl⟩ := hk + rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw, star_div₀, star_pow, + star_natCast] + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), + coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), star_zero] + +/-- The exponential of a monomial at scalar zero is one. -/ +lemma expMonomial_zero (hw : w ≠ 0) : expMonomial (0 : K) w = 1 := by + classical + ext k + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨n, rfl⟩ := hk + rw [coeff_expMonomial_nsmul hw, coeff_one] + rcases Nat.eq_zero_or_pos n with hn | hn + · subst hn + rw [if_pos (zero_smul ℕ w)] + simp + · have hne : ¬n • w = 0 := by + obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw + intro h0 + have h' := DFunLike.congr_fun h0 ρ + simp only [Finsupp.smul_apply, smul_eq_mul, Finsupp.coe_zero, Pi.zero_apply, + Nat.mul_eq_zero] at h' + omega + rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg hne] + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_one, + if_neg (fun h => hk ⟨0, by rw [h, zero_smul]⟩)] + +/-- The chain rule for the exponential of a monomial: + `∂_ν exp(c X^w) = c w_ν X^{w - e_ν} exp(c X^w)`. -/ +lemma pderiv_expMonomial (hw : w ≠ 0) (ν : σ) (c : K) : + pderiv K ν (expMonomial c w) = + (c * (w ν : K)) • (monomial (w - Finsupp.single ν 1) 1 * expMonomial c w) := by + classical + ext k + rw [coeff_pderiv, map_smul, smul_eq_mul, coeff_monomial_mul] + by_cases hA : ∃ n : ℕ, k + Finsupp.single ν 1 = n • w + · obtain ⟨n, hn⟩ := hA + have hcoords : ∀ ρ, k ρ + (Finsupp.single ν 1) ρ = n * w ρ := by + intro ρ + have h' := DFunLike.congr_fun hn ρ + simpa [Finsupp.smul_apply] using h' + have hkν : k ν + 1 = n * w ν := by + have := hcoords ν + rwa [Finsupp.single_eq_same] at this + have hnpos : 0 < n := by + rcases Nat.eq_zero_or_pos n with h0 | h0 + · subst h0; omega + · exact h0 + have hwνpos : 0 < w ν := by + rcases Nat.eq_zero_or_pos (w ν) with h0 | h0 + · rw [h0, Nat.mul_zero] at hkν; omega + · exact h0 + have hdk : w - Finsupp.single ν 1 ≤ k := by + rw [Finsupp.le_def] + intro ρ + rw [Finsupp.tsub_apply] + have h1 := hcoords ρ + have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos + by_cases hρν : ρ = ν + · subst hρν + rw [Finsupp.single_eq_same] at h1 ⊢ + omega + · have hsρ : (Finsupp.single ν 1) ρ = 0 := + Finsupp.single_eq_of_ne hρν + rw [hsρ] at h1 ⊢ + omega + have hkd : k - (w - Finsupp.single ν 1) = (n - 1) • w := by + ext ρ + rw [Finsupp.tsub_apply, Finsupp.tsub_apply, Finsupp.smul_apply, smul_eq_mul, + Nat.sub_mul, one_mul] + have h1 := hcoords ρ + have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos + by_cases hρν : ρ = ν + · subst hρν + rw [Finsupp.single_eq_same] at h1 ⊢ + omega + · have hsρ : (Finsupp.single ν 1) ρ = 0 := + Finsupp.single_eq_of_ne hρν + rw [hsρ] at h1 ⊢ + omega + rw [if_pos hdk, one_mul, hkd, hn, coeff_expMonomial_nsmul hw, + coeff_expMonomial_nsmul hw] + have hcast : ((k ν : K) + 1) = (n : K) * (w ν : K) := by exact_mod_cast hkν + rw [hcast] + have hfac : (n.factorial : K) = (n : K) * ((n - 1).factorial : K) := by + exact_mod_cast congrArg (Nat.cast : ℕ → K) + (Nat.mul_factorial_pred (Nat.pos_iff_ne_zero.mp hnpos)).symm + have hpow : c ^ n = c * c ^ (n - 1) := by + conv_lhs => rw [show n = 1 + (n - 1) by omega, pow_add, pow_one] + rw [hfac, hpow] + have h1 : ((n : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.pos_iff_ne_zero.mp hnpos) + have h2 : (((n - 1).factorial : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero _) + field_simp + · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hA), zero_mul] + by_cases hwv : w ν = 0 + · rw [hwv] + simp + · have hzero : (if w - Finsupp.single ν 1 ≤ k then + 1 * coeff (k - (w - Finsupp.single ν 1)) (expMonomial c w) else 0) = 0 := by + split_ifs with hdk + · rw [one_mul] + refine coeff_expMonomial_of_forall_ne _ fun m hm => ?_ + apply hA + refine ⟨m + 1, ?_⟩ + have hle : Finsupp.single ν 1 ≤ w := + Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) + have h1 : k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) = k := + tsub_add_cancel_of_le hdk + have h2 : (w - Finsupp.single ν 1) + Finsupp.single ν 1 = w := + tsub_add_cancel_of_le hle + calc k + Finsupp.single ν 1 + = k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) + + Finsupp.single ν 1 := by rw [h1] + _ = m • w + w := by rw [hm, add_assoc, h2] + _ = (m + 1) • w := by rw [add_smul, one_smul] + · rfl + rw [hzero, mul_zero] + +/-! + +### A.2 Gauge realization of translations of the jet coordinates To identify the gauge invariants of the jet algebra we need not only that every jet gauge transformation shifts the component functions by the Maurer–Cartan From dcdfdcbfa362897492c2af9aa5f28b10cc398f62 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 5 Aug 2026 06:45:26 +0100 Subject: [PATCH 091/254] refactor: Clean up --- Physlib/Particles/QED/JetAlgebra.lean | 2 +- .../StandardModel/Fermions/LeptonSinglet.lean | 33 +- .../StandardModel/GaugeBosons/BBoson.lean | 740 ++++++------------ .../GaugeGroup/MaurerCartan.lean | 143 ++++ 4 files changed, 384 insertions(+), 534 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index 57836f792..d2dc95b3b 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -477,7 +477,7 @@ lemma anomalyAux_covariantStepAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin /-- The anomaly operators annihilate the zeroth-order lepton component: the constant coefficient of the iterated Maurer–Cartan derivative is the - Maurer–Cartan pairing. -/ + Maurer–Cartan shift. -/ lemma anomalyAux_ψAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : anomalyAux U s μ (ψAux α) = 0 := by diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index a5a465b2c..7f454c34c 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -440,23 +440,6 @@ lemma JetComponentSpace.repJetGaugeGroupI_inl' (U : JetGaugeGroupI) rw [JetComponentSpace.repJetGaugeGroupI_inl, TensorProduct.map_tmul] rfl -/-- The first-order Taylor coefficient of a hypercharge power of a `U(1)` jet: - the analogue of `BBoson.coeff_single_star_pow` for the contragredient character - `u ^ q`, with the sign of the Maurer–Cartan term reversed. -/ -lemma coeff_single_pow (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) : - MvPowerSeries.coeff (Finsupp.single μ 1) ((u : JetRing) ^ q) = - -((q : ℂ) * Complex.I * (BBoson.mcCoeff u μ : ℂ)) * - MvPowerSeries.constantCoeff ((u : JetRing) ^ q) := by - have hmc : BBoson.mcCoeff (star u) μ = - BBoson.mcCoeff u μ := by - have h := BBoson.mcCoeff_mul u (star u) μ - rw [Unitary.star_eq_inv, mul_inv_cancel, BBoson.mcCoeff_one] at h - exact eq_neg_of_add_eq_zero_right h.symm - have h := BBoson.coeff_single_star_pow (star u) μ q - rw [Unitary.coe_star, star_star, hmc] at h - rw [h] - push_cast - ring - /-! ## The formal total derivative on the component functions @@ -590,20 +573,28 @@ lemma repJetGaugeGroupI_ofGenerator_ψ_nil (g : JetGaugeGroupI) (α : Fin 2) : /-- The action of the gauge group on ∂_μ ψ takes it to - g • (∂_μ ψ + 6 i (BBoson.mcCoeff g.2.2 μ) • ψ)-/ + g • (∂_μ ψ + 6 i (maurerCartanU1Coeff g μ 0) • ψ)-/ lemma repJetGaugeGroupI_ofGenerator_ψ_singleton (g : JetGaugeGroupI) (μ : (Fin 1 ⊕ Fin 3)) (α : Fin 2) : repJetGaugeGroupI g (ofGenerator (.dψ {μ} α)) = g.eval.2.2 ^ 6 • ofGenerator (.dψ {μ} α) - - ((6 : ℂ) * Complex.I * (BBoson.mcCoeff g.2.2 μ : ℂ) * (g.eval.2.2 : ℂ) ^ 6) • + ((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * (g.eval.2.2 : ℂ) ^ 6) • ofGenerator (.dψ {} α) := by have hval : ((g.eval.2.2 : unitary ℂ) : ℂ) = MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) := rfl have hcoeff : MvPowerSeries.coeff (Finsupp.single μ 1) (((g.2.2 : unitary JetRing) : JetRing) ^ 6) = - -((6 : ℂ) * Complex.I * (BBoson.mcCoeff g.2.2 μ : ℂ) * + -((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) ^ 6) := by - rw [coeff_single_pow g.2.2 μ 6, map_pow] + have h := congrArg (MvPowerSeries.coeff (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) + (BBoson.pderiv_pow_unitary g μ 6) + rw [MvPowerSeries.coeff_pderiv] at h + simp only [MvPowerSeries.coeff_zero_eq_constantCoeff_apply, map_mul, map_pow, + MvPowerSeries.constantCoeff_C, Finsupp.coe_zero, Pi.zero_apply, Nat.cast_zero, + zero_add, mul_one] at h + rw [show ((maurerCartanU1Coeff g μ 0 : selfAdjoint ℂ) : ℂ) = + MvPowerSeries.constantCoeff (maurerCartanU1 g μ) from + MvPowerSeries.coeff_zero_eq_constantCoeff_apply _, h] push_cast ring have hinl : ∀ x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 341cb63ce..b55346f69 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -178,120 +178,20 @@ resulting action of `JetGaugeGroupI` on `BBoson` is by translations. open MvPowerSeries JetRing -/-- The Maurer–Cartan coefficient of a jet of a `U(1)` gauge transformation in the - spacetime direction `μ`: `i (∂_μ u)(0) ū(0)`, which is hermitian by unitarity. -/ -noncomputable def mcCoeff (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : selfAdjoint ℂ := - ⟨Complex.I * coeff (Finsupp.single μ 1) (u : JetRing) * - star (constantCoeff (u : JetRing)), by - have h := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp u.2).2 - rw [coeff_single_one_mul, coeff_star, constantCoeff_star, - show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by - rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at h - have hI : (star Complex.I) = -Complex.I := by - simp [Complex.conj_I] - rw [selfAdjoint.mem_iff, star_mul', star_mul', star_star, hI] - linear_combination (-Complex.I) * h⟩ - -@[simp] -lemma mcCoeff_one (μ : Fin 1 ⊕ Fin 3) : mcCoeff 1 μ = 0 := by - apply Subtype.ext - have h : coeff (Finsupp.single μ 1) (1 : JetRing) = 0 := by - rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])] - simp [mcCoeff, h] - -/-- The abelian cocycle identity: the Maurer–Cartan coefficient is additive. -/ -lemma mcCoeff_mul (u₁ u₂ : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : - mcCoeff (u₁ * u₂) μ = mcCoeff u₁ μ + mcCoeff u₂ μ := by - have h₁ : constantCoeff (u₁ : JetRing) * star (constantCoeff (u₁ : JetRing)) = 1 := by - have h := congrArg constantCoeff (Unitary.mem_iff.mp u₁.2).2 - rwa [map_mul, constantCoeff_star, map_one] at h - have h₂ : constantCoeff (u₂ : JetRing) * star (constantCoeff (u₂ : JetRing)) = 1 := by - have h := congrArg constantCoeff (Unitary.mem_iff.mp u₂.2).2 - rwa [map_mul, constantCoeff_star, map_one] at h - apply Subtype.ext - simp only [mcCoeff, MulMemClass.coe_mul, AddSubgroup.coe_add] - rw [coeff_single_one_mul, map_mul, star_mul] - linear_combination (Complex.I * coeff (Finsupp.single μ 1) (u₁ : JetRing) * - star (constantCoeff (u₁ : JetRing))) * h₂ + - (Complex.I * coeff (Finsupp.single μ 1) (u₂ : JetRing) * - star (constantCoeff (u₂ : JetRing))) * h₁ - -/-- The first-order Taylor coefficient of a hypercharge power of a `U(1)` jet is - the charge times the Maurer–Cartan coefficient times the value of the character: - `(∂_μ (ū^q))(0) = q · i (∂_μu)(0)ū(0) · (ū(0))^q`. The abelian connection shift - controls the first-order transformation of every charged field. -/ -lemma coeff_single_star_pow (u : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) : - coeff (Finsupp.single μ 1) ((star (u : JetRing)) ^ q) = - (q : ℂ) * Complex.I * (mcCoeff u μ : ℂ) * - constantCoeff ((star (u : JetRing)) ^ q) := by - rcases Nat.eq_zero_or_pos q with hq | hq - · subst hq - rw [pow_zero, show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by - rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] - simp - · have h := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp u.2).2 - rw [coeff_single_one_mul, coeff_star, constantCoeff_star, - show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by - rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at h - have hB : constantCoeff (u : JetRing) * star (constantCoeff (u : JetRing)) = 1 := by - have h' := congrArg constantCoeff (Unitary.mem_iff.mp u.2).2 - rwa [map_mul, constantCoeff_star, map_one] at h' - have hσA : star (coeff (Finsupp.single μ 1) (u : JetRing)) = - -(coeff (Finsupp.single μ 1) (u : JetRing) * - star (constantCoeff (u : JetRing)) * star (constantCoeff (u : JetRing))) := by - linear_combination star (constantCoeff (u : JetRing)) * h - - star (coeff (Finsupp.single μ 1) (u : JetRing)) * hB - have hpow : star (constantCoeff (u : JetRing)) ^ (q - 1) * - star (constantCoeff (u : JetRing)) = star (constantCoeff (u : JetRing)) ^ q := by - rw [← pow_succ, Nat.sub_add_cancel hq] - rw [coeff_single_one_pow, coeff_star, constantCoeff_star, map_pow, constantCoeff_star, - hσA, show ((mcCoeff u μ : ℂ)) = Complex.I * - coeff (Finsupp.single μ 1) (u : JetRing) * - star (constantCoeff (u : JetRing)) from rfl, - show (q : ℂ) * star (constantCoeff (u : JetRing)) ^ (q - 1) * - -(coeff (Finsupp.single μ 1) (u : JetRing) * - star (constantCoeff (u : JetRing)) * star (constantCoeff (u : JetRing))) = - -((q : ℂ) * coeff (Finsupp.single μ 1) (u : JetRing) * - ((star (constantCoeff (u : JetRing)) ^ (q - 1) * - star (constantCoeff (u : JetRing))) * star (constantCoeff (u : JetRing)))) - from by ring, hpow] - ring_nf - rw [Complex.I_sq] - ring - -/-- The Maurer–Cartan term of a jet of a `U(1)` gauge transformation, as a B-boson: - the translation part of the local gauge action, with components - `i (∂_μ u)(0) ū(0)`. -/ -noncomputable def mcBBoson (u : unitary JetRing) : BBoson := - ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] mcCoeff u μ⟩ - -@[simp] -lemma mcBBoson_one : mcBBoson 1 = 0 := by - apply BBoson.ext - simp [mcBBoson] - -/-- The Maurer–Cartan term is additive in the jet. -/ -lemma mcBBoson_mul (u₁ u₂ : unitary JetRing) : - mcBBoson (u₁ * u₂) = mcBBoson u₁ + mcBBoson u₂ := by - apply BBoson.ext - simp [mcBBoson, mcCoeff_mul, TensorProduct.tmul_add, Finset.sum_add_distrib] - /-- The action of the jet gauge group on the B-boson field: the adjoint action is trivial, so a jet of gauge transformations acts purely by the Maurer–Cartan translation `B_μ ↦ B_μ + i (∂_μ u)(0) ū(0)` of its `U(1)` component. The action is affine rather than linear, which is why it is a `MulAction` and not a `Representation`. -/ -noncomputable instance : MulAction JetGaugeGroupI BBoson where - smul U B := B + mcBBoson U.2.2 - one_smul B := by - show B + mcBBoson (1 : JetGaugeGroupI).2.2 = B - simp - mul_smul U V B := by - show B + mcBBoson (U * V).2.2 = (B + mcBBoson V.2.2) + mcBBoson U.2.2 - rw [show (U * V).2.2 = U.2.2 * V.2.2 from rfl, mcBBoson_mul] - abel +noncomputable instance : SMul JetGaugeGroupI BBoson where + smul U B := repGaugeGroupI U.eval B + ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ + +lemma smul_eq (U : JetGaugeGroupI) (B : BBoson) : U • B = B + + ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ := rfl -lemma smul_def (U : JetGaugeGroupI) (B : BBoson) : U • B = B + mcBBoson U.2.2 := rfl +lemma smul_val (U : JetGaugeGroupI) (B : BBoson) : + (U • B).val = B.val + ∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0 := by + rfl /-- The jets of constant (global) gauge transformations act trivially on the B boson, in agreement with the trivial adjoint representation `repGaugeGroupI`: the @@ -299,176 +199,23 @@ lemma smul_def (U : JetGaugeGroupI) (B : BBoson) : U • B = B + mcBBoson U.2.2 @[simp] lemma ofConstant_smul (g : GaugeGroupI) (B : BBoson) : JetGaugeGroupI.ofConstant g • B = B := by - rw [smul_def] - have hmc : ∀ μ, mcCoeff (JetGaugeGroupI.ofConstant g).2.2 μ = 0 := by - intro μ - apply Subtype.ext - have h : coeff (Finsupp.single μ 1) - (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = 0 := by - rw [show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = - MvPowerSeries.C ((g.2.2 : ℂ)) from rfl, - coeff_C, if_neg (by simp [Finsupp.single_eq_zero])] - simp [mcCoeff, h] - have h0 : mcBBoson (JetGaugeGroupI.ofConstant g).2.2 = 0 := by - apply BBoson.ext - simp [mcBBoson, hmc] - rw [h0, add_zero] - -/-! - -## The Maurer–Cartan jet series - -The local gauge transformation of the B-boson field is the translation -`B_μ ↦ B_μ + i (∂_μ u) ū`, so a jet of gauge transformations shifts every -derivative coordinate `∂_s B_μ` of the field by the corresponding derivative -`∂_s (i ∂_μ u ū)(0)` of the Maurer–Cartan form at the base point. The -Maurer–Cartan coefficient `mcCoeff` records only the zeroth of these shifts — -enough for the action on the field itself, but not for the action on its jets. - -To express the shift of every derivative coordinate uniformly we use the `U(1)` -Maurer–Cartan form `maurerCartanU1` of the jet gauge group: the formal power -series `i (∂_ν u) ū`, whose value at the base point is `mcCoeff` and whose -higher Taylor coefficients are the higher shifts. Its coefficients are hermitian, and it is -additive in the jet; these two facts make the induced shift of the B-boson -component functions a real-valued cocycle, which is what turns the substitution -`B ↦ B + i (∂u) ū` into a representation of the jet gauge group on the jet -algebra below. - --/ - -/-- The derivative of a hypercharge power of a `U(1)` jet: - `∂_ν (u^q) = -q i mc_ν u^q`, the all-orders form of the first-order Taylor - coefficient formula for the contragredient character. -/ -lemma pderiv_pow_unitary (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : - pderiv ℂ ν ((U.2.2 : JetRing) ^ q) = - MvPowerSeries.C (-(q : ℂ) * Complex.I) * (maurerCartanU1 U ν * (U.2.2 : JetRing) ^ q) := by - rcases Nat.eq_zero_or_pos q with rfl | hq - · simp - · have h1 : star (U.2.2 : JetRing) * (U.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp U.2.2.2).1 - have hpow : (U.2.2 : JetRing) ^ q = (U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) := by - conv_lhs => rw [show q = 1 + (q - 1) by omega, pow_add, pow_one] - have hC : (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) * - MvPowerSeries.C Complex.I = MvPowerSeries.C ((q : ℕ) : ℂ) := by - rw [← map_mul] - congr 1 - ring_nf - rw [Complex.I_sq] - ring - have hN : (MvPowerSeries.C ((q : ℕ) : ℂ) : JetRing) = ((q : ℕ) : JetRing) := - map_natCast _ _ - rw [MvPowerSeries.pderiv_pow, maurerCartanU1, hpow] - linear_combination - (-((U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * - star (U.2.2 : JetRing))) * hC + - (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * - MvPowerSeries.C ((q : ℕ) : ℂ))) * h1 + - (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing))) * hN - -/-- The Taylor coefficients of the Maurer–Cartan series, as hermitian scalars. -/ -noncomputable def maurerCartanU1Coeff (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) - (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : selfAdjoint ℂ := - ⟨coeff m (maurerCartanU1 U ν), by - rw [selfAdjoint.mem_iff, ← coeff_star, star_maurerCartanU1]⟩ + ext + simp [smul_val] -@[simp] -lemma maurerCartanU1Coeff_one (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - maurerCartanU1Coeff 1 ν m = 0 := by - apply Subtype.ext - simp [maurerCartanU1Coeff] - -/-- The Taylor coefficients of the Maurer–Cartan series are additive in the jet. -/ -lemma maurerCartanU1Coeff_mul (U V : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) - (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - maurerCartanU1Coeff (U * V) ν m = maurerCartanU1Coeff U ν m + maurerCartanU1Coeff V ν m := by - apply Subtype.ext - simp [maurerCartanU1Coeff, maurerCartanU1_mul] - -/-- The zeroth Taylor coefficient of the Maurer–Cartan series is the - Maurer–Cartan coefficient. -/ -lemma maurerCartanU1Coeff_zero (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : - maurerCartanU1Coeff U ν 0 = mcCoeff U.2.2 ν := by - apply Subtype.ext - show coeff 0 (maurerCartanU1 U ν) = _ - rw [maurerCartanU1, coeff_zero_eq_constantCoeff, map_mul, map_mul, constantCoeff_C, - show constantCoeff (pderiv ℂ ν (U.2.2 : JetRing)) = - coeff (Finsupp.single ν (1 : ℕ)) (U.2.2 : JetRing) from by - rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] - simp, - constantCoeff_star, ← mul_assoc] - rfl - -/-- The first-order Taylor coefficients of the Maurer–Cartan series are symmetric - in the two spacetime directions: the shift of `∂_μ B_ν` equals the shift of - `∂_ν B_μ`. This is the gauge invariance of the abelian field strength, and rests - on unitarity: the antisymmetric part `∂_νu ∂_μū - ∂_μu ∂_νū` vanishes because - `∂ū = -ū (∂u) ū`. -/ -lemma maurerCartanU1Coeff_single_symm (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : - maurerCartanU1Coeff U ν (Finsupp.single μ 1) = maurerCartanU1Coeff U μ (Finsupp.single ν 1) := by - rcases eq_or_ne μ ν with rfl | hμν - · rfl - apply Subtype.ext - show coeff (Finsupp.single μ 1) (maurerCartanU1 U ν) = coeff (Finsupp.single ν 1) (maurerCartanU1 U μ) - have hb : constantCoeff (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) = 1 := by - have h := congrArg constantCoeff (Unitary.mem_iff.mp U.2.2.2).2 - rwa [map_mul, constantCoeff_star, map_one] at h - have hμ := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp U.2.2.2).2 - rw [coeff_single_one_mul, coeff_star, constantCoeff_star, - show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by - rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hμ - have hν := congrArg (coeff (Finsupp.single ν 1)) (Unitary.mem_iff.mp U.2.2.2).2 - rw [coeff_single_one_mul, coeff_star, constantCoeff_star, - show coeff (Finsupp.single ν 1) (1 : JetRing) = 0 by - rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hν - have hσμ : star (coeff (Finsupp.single μ 1) (U.2.2 : JetRing)) = - -(coeff (Finsupp.single μ 1) (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) * - star (constantCoeff (U.2.2 : JetRing))) := by - linear_combination star (constantCoeff (U.2.2 : JetRing)) * hμ - - star (coeff (Finsupp.single μ 1) (U.2.2 : JetRing)) * hb - have hσν : star (coeff (Finsupp.single ν 1) (U.2.2 : JetRing)) = - -(coeff (Finsupp.single ν 1) (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) * - star (constantCoeff (U.2.2 : JetRing))) := by - linear_combination star (constantCoeff (U.2.2 : JetRing)) * hν - - star (coeff (Finsupp.single ν 1) (U.2.2 : JetRing)) * hb - rw [maurerCartanU1, maurerCartanU1, - show ((C Complex.I : JetRing)) = algebraMap ℂ JetRing Complex.I from rfl, - ← Algebra.smul_def, ← Algebra.smul_def, map_smul, map_smul, smul_eq_mul, smul_eq_mul, - coeff_single_one_mul, coeff_single_one_mul, coeff_pderiv, coeff_pderiv, - coeff_star, coeff_star, constantCoeff_star, - show constantCoeff (pderiv ℂ ν (U.2.2 : JetRing)) = - coeff (Finsupp.single ν (1 : ℕ)) (U.2.2 : JetRing) from by - rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] - simp, - show constantCoeff (pderiv ℂ μ (U.2.2 : JetRing)) = - coeff (Finsupp.single μ (1 : ℕ)) (U.2.2 : JetRing) from by - rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] - simp, - show (Finsupp.single μ 1) ν = 0 from Finsupp.single_eq_of_ne hμν.symm, - show (Finsupp.single ν 1) μ = 0 from Finsupp.single_eq_of_ne hμν, - show Finsupp.single ν (1 : ℕ) + Finsupp.single μ 1 = - Finsupp.single μ 1 + Finsupp.single ν 1 from add_comm _ _, - hσμ, hσν] - push_cast - ring +attribute [-simp] Fintype.sum_sum_type -/-- The weighted symmetry of the Maurer–Cartan Taylor coefficients: exchanging the - field index with a derivative index changes the coefficient by the ratio of the - corresponding multiplicities. -/ -lemma maurerCartanU1Coeff_succ_symm (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) - (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - (m μ + 1) • maurerCartanU1Coeff U ν (m + Finsupp.single μ 1) = - (m ν + 1) • maurerCartanU1Coeff U μ (m + Finsupp.single ν 1) := by - have h := congrArg (coeff m) (pderiv_maurerCartanU1_symm U μ ν) - rw [coeff_pderiv, coeff_pderiv] at h - apply Subtype.ext - show ((m μ + 1 : ℕ)) • coeff (m + Finsupp.single μ 1) (maurerCartanU1 U ν) = - ((m ν + 1 : ℕ)) • coeff (m + Finsupp.single ν 1) (maurerCartanU1 U μ) - rw [nsmul_eq_mul, nsmul_eq_mul] - push_cast - linear_combination h +noncomputable instance : MulAction JetGaugeGroupI BBoson where + one_smul B := by + simp [smul_eq, maurerCartanU1Coeff_one] + rfl + mul_smul U V B := by + ext + simp [smul_val, maurerCartanU1Coeff_mul, TensorProduct.tmul_add, Finset.sum_add_distrib] + abel /-! -## The Jet component vector space +## A. The Jet generators -/ @@ -491,6 +238,102 @@ def JetGenerators.equiv : JetGenerators ≃ Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 cases x rfl + +namespace JetGenerators + +/-- The total symmetrized multi-index of a jet generator: the derivative + multi-index together with the Lorentz index of the field. The Maurer–Cartan + shift of a component function depends only on its total multi-index. -/ +def total : JetGenerators → Multiset (Fin 1 ⊕ Fin 3) + | .dB s ν => s + {ν} + +@[simp] +lemma total_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : + total (dB s ν) = s + {ν} := rfl + +lemma total_ne_zero (g : JetGenerators) : total g ≠ 0 := by + cases g with + | dB s ν => simp [total] + +/-- A choice of element of a multiset, used to pick the canonical representative + of each total multi-index. -/ +noncomputable def pick (t : Multiset (Fin 1 ⊕ Fin 3)) : Fin 1 ⊕ Fin 3 := + if h : ∃ ν, ν ∈ t then h.choose else Sum.inl 0 + +lemma pick_mem {t : Multiset (Fin 1 ⊕ Fin 3)} (ht : t ≠ 0) : pick t ∈ t := by + have h : ∃ ν, ν ∈ t := Multiset.exists_mem_of_ne_zero ht + rw [pick, dif_pos h] + exact h.choose_spec + +/-- The canonical representative of a jet generator: the generator with the same + total multi-index whose field index is the chosen element of the total. -/ +noncomputable def canon (g : JetGenerators) : JetGenerators := + .dB ((total g).erase (pick (total g))) (pick (total g)) + +/-- The canonical representative has the same total multi-index. -/ +@[simp] +lemma total_canon (g : JetGenerators) : total (canon g) = total g := by + rw [canon] + show ((total g).erase (pick (total g))) + {pick (total g)} = total g + rw [add_comm, Multiset.singleton_add] + exact Multiset.cons_erase (pick_mem (total_ne_zero g)) + +/-- Taking canonical representatives is idempotent. -/ +@[simp] +lemma canon_canon (g : JetGenerators) : canon (canon g) = canon g := by + rw [show canon (canon g) = + JetGenerators.dB ((total (canon g)).erase (pick (total (canon g)))) + (pick (total (canon g))) from rfl, total_canon] + rfl + +/-- Two jet generators have the same canonical representative if and only if they + have the same total multi-index. -/ +lemma canon_eq_canon_iff (g g' : JetGenerators) : + canon g = canon g' ↔ total g = total g' := by + constructor + · intro h + rw [← total_canon g, ← total_canon g', h] + · intro h + rw [canon, canon, h] + +/-- The jet generator with one further derivative in the direction `μ`. -/ +def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators + | dB s ν => dB (s + {μ}) ν + +@[simp] +lemma shift_dB (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : + shift μ (dB s ν) = dB (s + {μ}) ν := rfl + +/-- The jet generator with further derivatives appended from a multiset. -/ +def shiftMulti (t : Multiset (Fin 1 ⊕ Fin 3)) : JetGenerators → JetGenerators + | dB s ν => dB (s + t) ν + +@[simp] +lemma shiftMulti_dB (t s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : + shiftMulti t (dB s ν) = dB (s + t) ν := rfl + +lemma shiftMulti_singleton (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : + shiftMulti {ν} g = shift ν g := by + cases g with + | dB s ρ => rfl + +lemma shiftMulti_shift (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) + (g : JetGenerators) : + shiftMulti t (shift ν g) = shiftMulti (t + {ν}) g := by + cases g with + | dB s ρ => + simp only [shift_dB, shiftMulti_dB] + congr 1 + rw [add_comm t ({ν} : Multiset (Fin 1 ⊕ Fin 3)), ← add_assoc] + +end JetGenerators + +/-! + +## A. The Jet component vector space + +-/ + abbrev JetComponentSpace := SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) ⊗[ℝ] Module.Dual ℝ BBoson @@ -502,90 +345,29 @@ noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponent BBoson.basis.dualBasis).reindex JetGenerators.equiv.symm /-! -## The Maurer–Cartan shift of the component functions +### A.1. The action of the gauge group on the jet component space -/ open LagrangianTheory -/-- The Maurer–Cartan jet of a `U(1)` jet evaluated on the derivative symbols: - the basis monomial of dual derivative symbols at the multi-index `m` is sent to - the B-boson-valued `m`-th derivative of the Maurer–Cartan series at the base - point. This is the amount by which the corresponding derivative coordinate of - the B boson is shifted under the jet gauge transformation. -/ -noncomputable def mcJet (U : JetGaugeGroupI) : - SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) →ₗ[ℝ] BBoson := - Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => - ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] - ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩ - -@[simp] -lemma mcJet_one : mcJet 1 = 0 := by - refine Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.ext fun m => ?_ - rw [mcJet, Module.Basis.constr_basis] - apply BBoson.ext - simp - -/-- The Maurer–Cartan jet is additive in the jet: the abelian cocycle identity - for the shift of the component functions. -/ -lemma mcJet_mul (U V : JetGaugeGroupI) : mcJet (U * V) = mcJet U + mcJet V := by - refine Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.ext fun m => ?_ - rw [LinearMap.add_apply, mcJet, mcJet, mcJet, Module.Basis.constr_basis, - Module.Basis.constr_basis, Module.Basis.constr_basis] - apply BBoson.ext - simp [maurerCartanU1Coeff_mul, smul_add, TensorProduct.tmul_add, Finset.sum_add_distrib] - -/-- The Maurer–Cartan pairing: the amount by which a component function of the - B-boson jet is shifted under a jet gauge transformation, i.e. the evaluation of - the component function against the Maurer–Cartan jet. -/ +/-- Under the action of the gauge group `∂_s B_ν ↦ ∂_s B_ν + ⟨mc, ∂_s B_ν⟩ · 1`. + The real number `⟨mc, ∂_s B_ν⟩` is what we here call the Maurer–Cartan pairing: + the component function evaluated against the B-boson whose components are the + factorial-weighted Taylor coefficients — the `s`-th derivatives at the base + point — of the Maurer–Cartan series. -/ noncomputable def mcPairing (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := - TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp (mcJet U)) - -@[simp] -lemma mcPairing_tmul (U : JetGaugeGroupI) - (p : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) - (φ : Module.Dual ℝ BBoson) : - mcPairing U (p ⊗ₜ[ℝ] φ) = φ (mcJet U p) := rfl - -@[simp] -lemma mcPairing_one : mcPairing 1 = 0 := by - refine TensorProduct.ext' fun p φ => ?_ - simp + TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp + (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => + ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩)) -/-- The Maurer–Cartan pairing is additive in the jet. -/ -lemma mcPairing_mul (U V : JetGaugeGroupI) : - mcPairing (U * V) = mcPairing U + mcPairing V := by - refine TensorProduct.ext' fun p φ => ?_ - simp [mcJet_mul] - -/-- The multiset basis of the dual derivative symbols at a singleton, as a basis - vector of the symmetric algebra at a single multi-index. -/ -lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : - LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Finsupp.single μ 1) := by +/-- The multiset basis of the dual derivative symbols, as a basis vector of the + symmetric algebra at the corresponding multi-index. -/ +lemma dualRealJetAlgebraBasis_apply' (s : Multiset (Fin 1 ⊕ Fin 3)) : + LagrangianTheory.dualRealJetAlgebraBasis s = + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] - congr 1 - exact Multiset.toFinsupp_singleton μ - -/-- The Maurer–Cartan jet on a first-order derivative symbol: the B boson whose - `ν`-th component is the first-order Taylor coefficient of the Maurer–Cartan - series. -/ -lemma mcJet_singleton (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - mcJet U (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = - ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] - (maurerCartanU1Coeff U ν (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ := by - rw [dualRealJetAlgebraBasis_singleton, mcJet, Module.Basis.constr_basis] - apply BBoson.ext - show (∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] - ((∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) • - maurerCartanU1Coeff U ν (Finsupp.single μ 1))) = _ - rw [show (∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) = 1 from - Finset.prod_eq_one fun ρ _ => by - rcases eq_or_ne μ ρ with rfl | h - · simp - · rw [Finsupp.single_eq_of_ne h.symm] - rfl] - simp + rfl /-- The jet component basis vector at a generator, as a pure tensor. -/ lemma jetComponentSpace_basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) : @@ -594,44 +376,19 @@ lemma jetComponentSpace_basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 rw [JetComponentSpace.basis, Module.Basis.reindex_apply, Equiv.symm_symm] exact Module.Basis.tensorProduct_apply' _ _ _ -/-- The Maurer–Cartan pairing on first-order generators: the shift of the component - function `∂_μ B_ν` is the first-order Taylor coefficient of the Maurer–Cartan - series. -/ -lemma mcPairing_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : - mcPairing U (JetComponentSpace.basis (.dB {μ} ν)) = - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by - rw [jetComponentSpace_basis_dB, mcPairing_tmul, mcJet_singleton, - show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] - (maurerCartanU1Coeff U ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = - ∑ ν', Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν' (Finsupp.single μ 1)) • - basis ν' from by - rw [show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] - (maurerCartanU1Coeff U ν' (Finsupp.single μ 1) : selfAdjoint ℂ)⟩ : BBoson) = - valLinEquiv.symm (∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] - (maurerCartanU1Coeff U ν' (Finsupp.single μ 1) : selfAdjoint ℂ)) from rfl, map_sum] - exact Finset.sum_congr rfl fun ν' _ => by - rw [valLinEquiv_symm_apply, mk_tmul_eq_smul_basis], - map_sum] - simp only [map_smul, Module.Basis.dualBasis_apply_self, smul_eq_mul, mul_ite, - mul_one, mul_zero] - rw [Finset.sum_ite_eq' Finset.univ ν] - simp - -/-- The multiset basis of the dual derivative symbols, as a basis vector of the - symmetric algebra at the corresponding multi-index. -/ -lemma dualRealJetAlgebraBasis_apply' (s : Multiset (Fin 1 ⊕ Fin 3)) : - LagrangianTheory.dualRealJetAlgebraBasis s = - Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by - rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] - rfl - -/-- The Maurer–Cartan jet on a general derivative symbol. -/ -lemma mcJet_basis (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - mcJet U (LagrangianTheory.dualRealJetAlgebraBasis s) = - ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] +/-- The Maurer–Cartan pairing on a pure tensor over a derivative-symbol basis + vector: the component function evaluated on the B boson of factorial-weighted + Taylor coefficients of the Maurer–Cartan series. -/ +lemma mcPairing_tmul_basis (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ BBoson) : + mcPairing U (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] φ) = + φ ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν (Multiset.toFinsupp s))⟩ := by - rw [dualRealJetAlgebraBasis_apply', mcJet, Module.Basis.constr_basis] + rw [dualRealJetAlgebraBasis_apply', mcPairing] + show φ ((Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ _) + (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s))) = _ + rw [Module.Basis.constr_basis] /-- The Maurer–Cartan pairing on a general generator: the factorial-weighted Taylor coefficient of the Maurer–Cartan series. -/ @@ -640,7 +397,7 @@ lemma mcPairing_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) mcPairing U (JetComponentSpace.basis (.dB s ν)) = (∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s)) := by - rw [jetComponentSpace_basis_dB, mcPairing_tmul, mcJet_basis, + rw [jetComponentSpace_basis_dB, mcPairing_tmul_basis, show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = @@ -660,6 +417,34 @@ lemma mcPairing_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) rw [Finset.sum_ite_eq' Finset.univ ν] simp +/-- The Maurer–Cartan pairing on first-order generators: the shift of the component + function `∂_μ B_ν` is the first-order Taylor coefficient of the Maurer–Cartan + series. -/ +lemma mcPairing_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + mcPairing U (JetComponentSpace.basis (.dB {μ} ν)) = + Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by + rw [mcPairing_basis_dB', Multiset.toFinsupp_singleton, + show (∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) = 1 from + Finset.prod_eq_one fun ρ _ => by + rcases eq_or_ne μ ρ with rfl | h + · simp + · rw [Finsupp.single_eq_of_ne h.symm] + rfl, + one_smul] + +@[simp] +lemma mcPairing_one : mcPairing 1 = 0 := by + refine JetComponentSpace.basis.ext fun g => ?_ + obtain ⟨s, ν⟩ := g + simp [mcPairing_basis_dB'] + +/-- The Maurer–Cartan pairing is additive in the jet. -/ +lemma mcPairing_mul (U V : JetGaugeGroupI) : + mcPairing (U * V) = mcPairing U + mcPairing V := by + refine JetComponentSpace.basis.ext fun g => ?_ + obtain ⟨s, ν⟩ := g + simp [mcPairing_basis_dB', maurerCartanU1Coeff_mul, smul_add] + /-- The factorial weight of a multi-index augmented by one derivative: the multiplicity of the new index times the original weight. -/ lemma prod_factorial_add_single (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (κ : Fin 1 ⊕ Fin 3) : @@ -765,109 +550,58 @@ lemma constantCoeff_maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin rfl -/-! - -## Canonical representatives of the jet generators - -The Maurer–Cartan pairing of a jet gauge transformation with the component -function `∂_s B_ν` depends only on the total symmetrized multi-index `s + {ν}`. -We choose, for every jet generator, a canonical generator with the same total -multi-index. The differences between a generator and its canonical -representative are exactly the derivatives of the field strength, while the -canonical generators themselves are shifted freely by the gauge transformations -realized above; this dichotomy computes the gauge invariants of the jet algebra -below. - --/ - -namespace JetGenerators - -/-- The total symmetrized multi-index of a jet generator: the derivative - multi-index together with the Lorentz index of the field. The Maurer–Cartan - shift of a component function depends only on its total multi-index. -/ -def total : JetGenerators → Multiset (Fin 1 ⊕ Fin 3) - | .dB s ν => s + {ν} - -@[simp] -lemma total_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - total (dB s ν) = s + {ν} := rfl - -lemma total_ne_zero (g : JetGenerators) : total g ≠ 0 := by - cases g with - | dB s ν => simp [total] - -/-- A choice of element of a multiset, used to pick the canonical representative - of each total multi-index. -/ -noncomputable def pick (t : Multiset (Fin 1 ⊕ Fin 3)) : Fin 1 ⊕ Fin 3 := - if h : ∃ ν, ν ∈ t then h.choose else Sum.inl 0 -lemma pick_mem {t : Multiset (Fin 1 ⊕ Fin 3)} (ht : t ≠ 0) : pick t ∈ t := by - have h : ∃ ν, ν ∈ t := Multiset.exists_mem_of_ne_zero ht - rw [pick, dif_pos h] - exact h.choose_spec - -/-- The canonical representative of a jet generator: the generator with the same - total multi-index whose field index is the chosen element of the total. -/ -noncomputable def canon (g : JetGenerators) : JetGenerators := - .dB ((total g).erase (pick (total g))) (pick (total g)) - -/-- The canonical representative has the same total multi-index. -/ -@[simp] -lemma total_canon (g : JetGenerators) : total (canon g) = total g := by - rw [canon] - show ((total g).erase (pick (total g))) + {pick (total g)} = total g - rw [add_comm, Multiset.singleton_add] - exact Multiset.cons_erase (pick_mem (total_ne_zero g)) - -/-- Taking canonical representatives is idempotent. -/ -@[simp] -lemma canon_canon (g : JetGenerators) : canon (canon g) = canon g := by - rw [show canon (canon g) = - JetGenerators.dB ((total (canon g)).erase (pick (total (canon g)))) - (pick (total (canon g))) from rfl, total_canon] - rfl - -/-- Two jet generators have the same canonical representative if and only if they - have the same total multi-index. -/ -lemma canon_eq_canon_iff (g g' : JetGenerators) : - canon g = canon g' ↔ total g = total g' := by - constructor - · intro h - rw [← total_canon g, ← total_canon g', h] - · intro h - rw [canon, canon, h] - -/-- The jet generator with one further derivative in the direction `μ`. -/ -def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators - | dB s ν => dB (s + {μ}) ν +/-! -@[simp] -lemma shift_dB (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - shift μ (dB s ν) = dB (s + {μ}) ν := rfl +## The Maurer–Cartan jet series -/-- The jet generator with further derivatives appended from a multiset. -/ -def shiftMulti (t : Multiset (Fin 1 ⊕ Fin 3)) : JetGenerators → JetGenerators - | dB s ν => dB (s + t) ν +The local gauge transformation of the B-boson field is the translation +`B_μ ↦ B_μ + i (∂_μ u) ū`, so a jet of gauge transformations shifts every +derivative coordinate `∂_s B_μ` of the field by the corresponding derivative +`∂_s (i ∂_μ u ū)(0)` of the Maurer–Cartan form at the base point. The zeroth +Taylor coefficient `maurerCartanU1Coeff U μ 0` records only the zeroth of these +shifts — enough for the action on the field itself, but not for the action on +its jets. -@[simp] -lemma shiftMulti_dB (t s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - shiftMulti t (dB s ν) = dB (s + t) ν := rfl +To express the shift of every derivative coordinate uniformly we use the `U(1)` +Maurer–Cartan form `maurerCartanU1` of the jet gauge group: the formal power +series `i (∂_ν u) ū`, whose Taylor coefficients `maurerCartanU1Coeff` are the +shifts at every order. Its coefficients are hermitian, and it is +additive in the jet; these two facts make the induced shift of the B-boson +component functions a real-valued cocycle, which is what turns the substitution +`B ↦ B + i (∂u) ū` into a representation of the jet gauge group on the jet +algebra below. -lemma shiftMulti_singleton (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : - shiftMulti {ν} g = shift ν g := by - cases g with - | dB s ρ => rfl +-/ -lemma shiftMulti_shift (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) - (g : JetGenerators) : - shiftMulti t (shift ν g) = shiftMulti (t + {ν}) g := by - cases g with - | dB s ρ => - simp only [shift_dB, shiftMulti_dB] - congr 1 - rw [add_comm t ({ν} : Multiset (Fin 1 ⊕ Fin 3)), ← add_assoc] +/-- The derivative of a hypercharge power of a `U(1)` jet: + `∂_ν (u^q) = -q i mc_ν u^q`, the all-orders form of the first-order Taylor + coefficient formula for the contragredient character. -/ +lemma pderiv_pow_unitary (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : + pderiv ℂ ν ((U.2.2 : JetRing) ^ q) = + MvPowerSeries.C (-(q : ℂ) * Complex.I) * (maurerCartanU1 U ν * (U.2.2 : JetRing) ^ q) := by + rcases Nat.eq_zero_or_pos q with rfl | hq + · simp + · have h1 : star (U.2.2 : JetRing) * (U.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp U.2.2.2).1 + have hpow : (U.2.2 : JetRing) ^ q = (U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) := by + conv_lhs => rw [show q = 1 + (q - 1) by omega, pow_add, pow_one] + have hC : (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) * + MvPowerSeries.C Complex.I = MvPowerSeries.C ((q : ℕ) : ℂ) := by + rw [← map_mul] + congr 1 + ring_nf + rw [Complex.I_sq] + ring + have hN : (MvPowerSeries.C ((q : ℕ) : ℂ) : JetRing) = ((q : ℕ) : JetRing) := + map_natCast _ _ + rw [MvPowerSeries.pderiv_pow, maurerCartanU1, hpow] + linear_combination + (-((U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * + star (U.2.2 : JetRing))) * hC + + (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * + MvPowerSeries.C ((q : ℕ) : ℂ))) * h1 + + (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing))) * hN -end JetGenerators /-! @@ -1462,16 +1196,14 @@ noncomputable def expMonomial (c : K) (w : σ →₀ ℕ) : MvPowerSeries σ K : fun k => if h : ∃ n : ℕ, k = n • w then c ^ h.choose / (h.choose.factorial : K) else 0 /-- A nonzero exponent has a coordinate at which it is nonzero. -/ -lemma exists_apply_ne_zero_of_ne_zero (hw : w ≠ 0) : ∃ ρ, w ρ ≠ 0 := by - obtain ⟨ρ, hρ⟩ := Finsupp.ne_iff.mp hw - exact ⟨ρ, by simpa using hρ⟩ +lemma exists_apply_ne_zero_of_ne_zero (hw : w ≠ 0) : ∃ ρ, w ρ ≠ 0 := + (Finsupp.ne_iff.mp hw).imp fun _ h => by simpa using h /-- Multiples of a nonzero exponent determine the multiplier. -/ lemma nsmul_right_cancel (hw : w ≠ 0) {n m : ℕ} (h : n • w = m • w) : n = m := by obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw - have h' := DFunLike.congr_fun h ρ - simp only [Finsupp.smul_apply, smul_eq_mul] at h' - exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) h' + exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) + (by simpa using DFunLike.congr_fun h ρ) omit [CharZero K] in /-- The Taylor coefficient of the exponential of a monomial at a multiple of the @@ -1479,8 +1211,7 @@ omit [CharZero K] in lemma coeff_expMonomial_nsmul (hw : w ≠ 0) (c : K) (n : ℕ) : coeff (n • w) (expMonomial c w) = c ^ n / (n.factorial : K) := by have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ - rw [coeff_apply] - simp only [expMonomial] + simp only [coeff_apply, expMonomial] rw [dif_pos h, show h.choose = n from (nsmul_right_cancel hw h.choose_spec).symm] omit [CharZero K] in @@ -1488,8 +1219,7 @@ omit [CharZero K] in multiples of the exponent. -/ lemma coeff_expMonomial_of_forall_ne (c : K) {k : σ →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : coeff k (expMonomial c w) = 0 := by - rw [coeff_apply] - simp only [expMonomial] + simp only [coeff_apply, expMonomial] rw [dif_neg (not_exists.mpr hk)] /-- The exponential property: exponentials of the same monomial multiply by adding @@ -1578,18 +1308,10 @@ lemma expMonomial_zero (hw : w ≠ 0) : expMonomial (0 : K) w = 1 := by by_cases hk : ∃ n : ℕ, k = n • w · obtain ⟨n, rfl⟩ := hk rw [coeff_expMonomial_nsmul hw, coeff_one] - rcases Nat.eq_zero_or_pos n with hn | hn - · subst hn - rw [if_pos (zero_smul ℕ w)] - simp - · have hne : ¬n • w = 0 := by - obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw - intro h0 - have h' := DFunLike.congr_fun h0 ρ - simp only [Finsupp.smul_apply, smul_eq_mul, Finsupp.coe_zero, Pi.zero_apply, - Nat.mul_eq_zero] at h' - omega - rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg hne] + rcases Nat.eq_zero_or_pos n with rfl | hn + · simp + · rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg fun h0 => + Nat.pos_iff_ne_zero.mp hn (nsmul_right_cancel hw (h0.trans (zero_smul ℕ w).symm))] · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_one, if_neg (fun h => hk ⟨0, by rw [h, zero_smul]⟩)] @@ -1610,14 +1332,8 @@ lemma pderiv_expMonomial (hw : w ≠ 0) (ν : σ) (c : K) : have hkν : k ν + 1 = n * w ν := by have := hcoords ν rwa [Finsupp.single_eq_same] at this - have hnpos : 0 < n := by - rcases Nat.eq_zero_or_pos n with h0 | h0 - · subst h0; omega - · exact h0 - have hwνpos : 0 < w ν := by - rcases Nat.eq_zero_or_pos (w ν) with h0 | h0 - · rw [h0, Nat.mul_zero] at hkν; omega - · exact h0 + have hnpos : 0 < n := Nat.pos_of_ne_zero fun h => by simp [h] at hkν + have hwνpos : 0 < w ν := Nat.pos_of_ne_zero fun h => by simp [h] at hkν have hdk : w - Finsupp.single ν 1 ≤ k := by rw [Finsupp.le_def] intro ρ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index efbdd400a..4b3b89295 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -157,6 +157,45 @@ lemma maurerCartanSU2_mul (g1 g2 : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : congr 1 rw [mul_assoc, ← mul_assoc (V.map (pderiv ℂ ν)), ← mul_assoc U] +/-- The Maurer–Cartan form vanishes on jets of constant gauge transformations: + constants have vanishing derivative. -/ +@[simp] +lemma maurerCartanU1_ofConstant (g : GaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanU1 (JetGaugeGroupI.ofConstant g) ν = 0 := by + rw [maurerCartanU1, + show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = + MvPowerSeries.C ((g.2.2 : ℂ)) from rfl, + pderiv_C, zero_mul, mul_zero] + +/-- The `SU(3)` Maurer–Cartan form vanishes on jets of constant gauge + transformations: constants have vanishing derivative. -/ +@[simp] +lemma maurerCartanSU3_ofConstant (g : GaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanSU3 (JetGaugeGroupI.ofConstant g) ν = 0 := by + have hmap : ((JetGaugeGroupI.ofConstant g).1 : Matrix (Fin 3) (Fin 3) JetRing).map + (pderiv ℂ ν) = 0 := by + ext i j + rw [Matrix.map_apply, + show ((JetGaugeGroupI.ofConstant g).1 : Matrix (Fin 3) (Fin 3) JetRing) i j = + MvPowerSeries.C ((g.1 : Matrix (Fin 3) (Fin 3) ℂ) i j) from rfl, + pderiv_C] + rfl + rw [maurerCartanSU3, hmap, zero_mul, smul_zero] + +/-- The `SU(2)` Maurer–Cartan form vanishes on jets of constant gauge + transformations: constants have vanishing derivative. -/ +@[simp] +lemma maurerCartanSU2_ofConstant (g : GaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanSU2 (JetGaugeGroupI.ofConstant g) ν = 0 := by + have hmap : ((JetGaugeGroupI.ofConstant g).2.1 : Matrix (Fin 2) (Fin 2) JetRing).map + (pderiv ℂ ν) = 0 := by + ext i j + rw [Matrix.map_apply, + show ((JetGaugeGroupI.ofConstant g).2.1 : Matrix (Fin 2) (Fin 2) JetRing) i j = + MvPowerSeries.C ((g.2.1 : Matrix (Fin 2) (Fin 2) ℂ) i j) from rfl, + pderiv_C] + rfl + rw [maurerCartanSU2, hmap, zero_mul, smul_zero] /-- The Maurer–Cartan series is hermitian: `star (i (∂_ν u) ū) = i (∂_ν u) ū`, by differentiating the unitarity relation `u ū = 1`. All its Taylor @@ -384,4 +423,108 @@ lemma pderiv_maurerCartanSU2_symm (u : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) simp only [mul_neg, smul_add, smul_neg, mul_assoc] abel +/-! + +## The coefficents of the Maurer–Cartan forms + +-/ + +open JetRing + +/-- The Taylor coefficients of the Maurer–Cartan series, as hermitian scalars. -/ +noncomputable def maurerCartanU1Coeff (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : selfAdjoint ℂ := + ⟨coeff m (maurerCartanU1 U ν), by + rw [selfAdjoint.mem_iff, ← coeff_star, star_maurerCartanU1]⟩ + +@[simp] +lemma maurerCartanU1Coeff_one (ν : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + maurerCartanU1Coeff 1 ν m = 0 := by + apply Subtype.ext + simp [maurerCartanU1Coeff] + +@[simp] +lemma maurerCartanU1Coeff_ofConstant (g : GaugeGroupI) (ν : Fin 1 ⊕ Fin 3) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + maurerCartanU1Coeff (JetGaugeGroupI.ofConstant g) ν m = 0 := by + apply Subtype.ext + simp [maurerCartanU1Coeff, maurerCartanU1_ofConstant] + +/-- The Taylor coefficients of the Maurer–Cartan series are additive in the jet. -/ +lemma maurerCartanU1Coeff_mul (U V : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + maurerCartanU1Coeff (U * V) ν m = maurerCartanU1Coeff U ν m + maurerCartanU1Coeff V ν m := by + apply Subtype.ext + simp [maurerCartanU1Coeff, maurerCartanU1_mul] + +/-- The first-order Taylor coefficients of the Maurer–Cartan series are symmetric + in the two spacetime directions: the shift of `∂_μ B_ν` equals the shift of + `∂_ν B_μ`. This is the gauge invariance of the abelian field strength, and rests + on unitarity: the antisymmetric part `∂_νu ∂_μū - ∂_μu ∂_νū` vanishes because + `∂ū = -ū (∂u) ū`. -/ +lemma maurerCartanU1Coeff_single_symm (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + maurerCartanU1Coeff U ν (Finsupp.single μ 1) = maurerCartanU1Coeff U μ (Finsupp.single ν 1) := by + rcases eq_or_ne μ ν with rfl | hμν + · rfl + apply Subtype.ext + show coeff (Finsupp.single μ 1) (maurerCartanU1 U ν) = coeff (Finsupp.single ν 1) (maurerCartanU1 U μ) + have hb : constantCoeff (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) = 1 := by + have h := congrArg constantCoeff (Unitary.mem_iff.mp U.2.2.2).2 + rwa [map_mul, constantCoeff_star, map_one] at h + have hμ := congrArg (coeff (Finsupp.single μ 1)) (Unitary.mem_iff.mp U.2.2.2).2 + rw [coeff_single_one_mul, coeff_star, constantCoeff_star, + show coeff (Finsupp.single μ 1) (1 : JetRing) = 0 by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hμ + have hν := congrArg (coeff (Finsupp.single ν 1)) (Unitary.mem_iff.mp U.2.2.2).2 + rw [coeff_single_one_mul, coeff_star, constantCoeff_star, + show coeff (Finsupp.single ν 1) (1 : JetRing) = 0 by + rw [coeff_one, if_neg (by simp [Finsupp.single_eq_zero])]] at hν + have hσμ : star (coeff (Finsupp.single μ 1) (U.2.2 : JetRing)) = + -(coeff (Finsupp.single μ 1) (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) * + star (constantCoeff (U.2.2 : JetRing))) := by + linear_combination star (constantCoeff (U.2.2 : JetRing)) * hμ - + star (coeff (Finsupp.single μ 1) (U.2.2 : JetRing)) * hb + have hσν : star (coeff (Finsupp.single ν 1) (U.2.2 : JetRing)) = + -(coeff (Finsupp.single ν 1) (U.2.2 : JetRing) * star (constantCoeff (U.2.2 : JetRing)) * + star (constantCoeff (U.2.2 : JetRing))) := by + linear_combination star (constantCoeff (U.2.2 : JetRing)) * hν - + star (coeff (Finsupp.single ν 1) (U.2.2 : JetRing)) * hb + rw [maurerCartanU1, maurerCartanU1, + show ((C Complex.I : JetRing)) = algebraMap ℂ JetRing Complex.I from rfl, + ← Algebra.smul_def, ← Algebra.smul_def, map_smul, map_smul, smul_eq_mul, smul_eq_mul, + coeff_single_one_mul, coeff_single_one_mul, coeff_pderiv, coeff_pderiv, + coeff_star, coeff_star, constantCoeff_star, + show constantCoeff (pderiv ℂ ν (U.2.2 : JetRing)) = + coeff (Finsupp.single ν (1 : ℕ)) (U.2.2 : JetRing) from by + rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] + simp, + show constantCoeff (pderiv ℂ μ (U.2.2 : JetRing)) = + coeff (Finsupp.single μ (1 : ℕ)) (U.2.2 : JetRing) from by + rw [← coeff_zero_eq_constantCoeff, coeff_pderiv] + simp, + show (Finsupp.single μ 1) ν = 0 from Finsupp.single_eq_of_ne hμν.symm, + show (Finsupp.single ν 1) μ = 0 from Finsupp.single_eq_of_ne hμν, + show Finsupp.single ν (1 : ℕ) + Finsupp.single μ 1 = + Finsupp.single μ 1 + Finsupp.single ν 1 from add_comm _ _, + hσμ, hσν] + push_cast + ring + +/-- The weighted symmetry of the Maurer–Cartan Taylor coefficients: exchanging the + field index with a derivative index changes the coefficient by the ratio of the + corresponding multiplicities. -/ +lemma maurerCartanU1Coeff_succ_symm (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) + (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + (m μ + 1) • maurerCartanU1Coeff U ν (m + Finsupp.single μ 1) = + (m ν + 1) • maurerCartanU1Coeff U μ (m + Finsupp.single ν 1) := by + have h := congrArg (coeff m) (pderiv_maurerCartanU1_symm U μ ν) + rw [coeff_pderiv, coeff_pderiv] at h + apply Subtype.ext + show ((m μ + 1 : ℕ)) • coeff (m + Finsupp.single μ 1) (maurerCartanU1 U ν) = + ((m ν + 1 : ℕ)) • coeff (m + Finsupp.single ν 1) (maurerCartanU1 U μ) + rw [nsmul_eq_mul, nsmul_eq_mul] + push_cast + linear_combination h + + end StandardModel From 55690d6a13689ac8657012dd30f6fd500e8c59f5 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 5 Aug 2026 07:18:40 +0100 Subject: [PATCH 092/254] feat: Clean up --- .../StandardModel/GaugeBosons/BBoson.lean | 382 +++++++++--------- 1 file changed, 183 insertions(+), 199 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index b55346f69..741b5bbca 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -732,14 +732,6 @@ lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) MvPolynomial.algebraMap_eq] exact DFunLike.congr_fun h V -/-- The conjugated action of a `U(1)` jet embedded in the jet gauge group. -/ -lemma equivMvPolynomial_repJetGaugeGroupI_u1 (u : unitary JetRing) (V : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis - (repJetGaugeGroupI (1, 1, u) V) = - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing (1, 1, u) (JetComponentSpace.basis g))) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := - equivMvPolynomial_repJetGaugeGroupI (1, 1, u) V /-! @@ -1176,150 +1168,172 @@ in the field strength and its derivatives. /-! -### A.1 The exponential of a monomial +### A.1 Gauge realization of translations of the jet coordinates The gauge invariants of the B-boson jet algebra are computed below by realizing arbitrary translations of the jet coordinates through explicit local `U(1)` gauge -transformations. These are the formal exponentials `exp (c X^w)` of a single -monomial, defined here coefficientwise; the exponential property -`exp(c X^w) exp(c' X^w) = exp((c + c') X^w)` gives unitarity for imaginary `c`, -and the chain rule gives their Maurer–Cartan series. +transformations: the jets `exp(-i a X^w)` of exponentials of a single spacetime +monomial, embedded in the jet gauge group with trivial colour and weak factors. +The exponential property `exp(c X^w) exp(c' X^w) = exp((c + c') X^w)` of the +underlying series gives unitarity, and the chain rule gives the Maurer–Cartan +form: the jet of the gradient `a ∂_ν X^w`. For every nonzero symmetrized +multi-index `t` and every real `r`, the transformation `exp(-i a X^t)` with +`a = r / t!` shifts every component function with total multi-index `t` by +exactly `r`, and all others by nothing. -/ -variable {K : Type*} [Field K] [CharZero K] {w : σ →₀ ℕ} - open Classical in -/-- The formal exponential of `c` times the monomial with exponent `w`: the power - series `∑ₙ (cⁿ/n!) X^{n w}`, defined coefficientwise. -/ -noncomputable def expMonomial (c : K) (w : σ →₀ ℕ) : MvPowerSeries σ K := - fun k => if h : ∃ n : ℕ, k = n • w then c ^ h.choose / (h.choose.factorial : K) else 0 - -/-- A nonzero exponent has a coordinate at which it is nonzero. -/ -lemma exists_apply_ne_zero_of_ne_zero (hw : w ≠ 0) : ∃ ρ, w ρ ≠ 0 := - (Finsupp.ne_iff.mp hw).imp fun _ h => by simpa using h - -/-- Multiples of a nonzero exponent determine the multiplier. -/ -lemma nsmul_right_cancel (hw : w ≠ 0) {n m : ℕ} (h : n • w = m • w) : n = m := by - obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw - exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) - (by simpa using DFunLike.congr_fun h ρ) - -omit [CharZero K] in -/-- The Taylor coefficient of the exponential of a monomial at a multiple of the +/-- The jet of the local `U(1)` gauge transformation `exp(-i a X^w)`: the + exponential of an imaginary multiple of a spacetime monomial — the power series + `∑ₙ ((-i a)ⁿ/n!) X^{n w}`, defined coefficientwise, unitary by the exponential + property — embedded in the jet gauge group with trivial colour and weak + factors. -/ +noncomputable def expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + JetGaugeGroupI := + let F : ℂ → JetRing := fun c k => if h : ∃ n : ℕ, k = n • w then + c ^ h.choose / (h.choose.factorial : ℂ) else 0 + (1, 1, ⟨F (-(a : ℂ) * Complex.I), by + classical + have hex : ∃ ρ, w ρ ≠ 0 := (Finsupp.ne_iff.mp hw).imp fun _ h => by simpa using h + have hcancel : ∀ {n m : ℕ}, n • w = m • w → n = m := by + intro n m h + obtain ⟨ρ, hρ⟩ := hex + exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) + (by simpa using DFunLike.congr_fun h ρ) + have hnsmul : ∀ (c : ℂ) (n : ℕ), coeff (n • w) (F c) = c ^ n / (n.factorial : ℂ) := by + intro c n + have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ + show (if h : ∃ m : ℕ, n • w = m • w then c ^ h.choose / (h.choose.factorial : ℂ) + else 0) = _ + rw [dif_pos h, show h.choose = n from (hcancel h.choose_spec).symm] + have hne : ∀ (c : ℂ) {k : (Fin 1 ⊕ Fin 3) →₀ ℕ}, (∀ n : ℕ, k ≠ n • w) → + coeff k (F c) = 0 := by + intro c k hk + show (if h : ∃ n : ℕ, k = n • w then c ^ h.choose / (h.choose.factorial : ℂ) + else 0) = 0 + rw [dif_neg (not_exists.mpr hk)] + have hmul : ∀ c c' : ℂ, F c * F c' = F (c + c') := by + intro c c' + ext k + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨N, rfl⟩ := hk + rw [coeff_mul, hnsmul] + have hsub : (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) ⊆ + Finset.antidiagonal (N • w) := by + intro p hp + obtain ⟨n, hn, rfl⟩ := Finset.mem_image.mp hp + rw [Finset.mem_antidiagonal, ← add_smul, + Nat.add_sub_cancel' (Nat.lt_succ_iff.mp (Finset.mem_range.mp hn))] + have hvanish : ∀ p ∈ Finset.antidiagonal (N • w), + p ∉ (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) → + coeff p.1 (F c) * coeff p.2 (F c') = 0 := by + intro p hp hpn + by_cases h1 : ∃ n : ℕ, p.1 = n • w + · obtain ⟨n₁, h1⟩ := h1 + exfalso + apply hpn + have hsum : p.1 + p.2 = N • w := Finset.mem_antidiagonal.mp hp + obtain ⟨ρ, hρ⟩ := hex + have hcoords : ∀ ρ', n₁ * w ρ' + p.2 ρ' = N * w ρ' := by + intro ρ' + have h' := DFunLike.congr_fun hsum ρ' + simpa [h1, Finsupp.smul_apply] using h' + have hle : n₁ ≤ N := + Nat.le_of_mul_le_mul_right (by have := hcoords ρ; omega) + (Nat.pos_of_ne_zero hρ) + have h2 : p.2 = (N - n₁) • w := by + ext ρ' + rw [Finsupp.smul_apply, smul_eq_mul, Nat.sub_mul] + have := hcoords ρ' + omega + exact Finset.mem_image.mpr + ⟨n₁, Finset.mem_range.mpr (Nat.lt_succ_of_le hle), by rw [← h1, ← h2]⟩ + · rw [hne c (not_exists.mp h1), zero_mul] + rw [← Finset.sum_subset hsub hvanish, + Finset.sum_image (fun n _ m _ h => hcancel (congrArg Prod.fst h)), + add_pow, Finset.sum_div] + refine Finset.sum_congr rfl fun n hn => ?_ + rw [hnsmul, hnsmul] + have hle : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hfact : ((N.choose n : ℂ)) * (n.factorial : ℂ) * ((N - n).factorial : ℂ) = + (N.factorial : ℂ) := by + exact_mod_cast congrArg (Nat.cast : ℕ → ℂ) + (Nat.choose_mul_factorial_mul_factorial hle) + have h1 : (n.factorial : ℂ) ≠ 0 := Nat.cast_ne_zero.mpr n.factorial_ne_zero + have h2 : ((N - n).factorial : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr (N - n).factorial_ne_zero + have h3 : (N.factorial : ℂ) ≠ 0 := Nat.cast_ne_zero.mpr N.factorial_ne_zero + rw [div_mul_div_comm, div_eq_div_iff (mul_ne_zero h1 h2) h3] + linear_combination (-(c ^ n * c' ^ (N - n))) * hfact + · rw [hne _ (not_exists.mp hk), coeff_mul] + refine Finset.sum_eq_zero fun p hp => ?_ + by_cases h1 : ∃ n : ℕ, p.1 = n • w + · by_cases h2 : ∃ n : ℕ, p.2 = n • w + · exfalso + obtain ⟨n₁, h1⟩ := h1 + obtain ⟨n₂, h2⟩ := h2 + exact hk ⟨n₁ + n₂, by rw [← Finset.mem_antidiagonal.mp hp, h1, h2, add_smul]⟩ + · rw [hne _ (not_exists.mp h2), mul_zero] + · rw [hne _ (not_exists.mp h1), zero_mul] + have hstar : ∀ c : ℂ, star (F c) = F (star c) := by + intro c + ext k + rw [JetRing.coeff_star] + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨n, rfl⟩ := hk + rw [hnsmul, hnsmul, star_div₀, star_pow, star_natCast] + · rw [hne _ (not_exists.mp hk), hne _ (not_exists.mp hk), star_zero] + have hzero : F 0 = 1 := by + ext k + by_cases hk : ∃ n : ℕ, k = n • w + · obtain ⟨n, rfl⟩ := hk + rw [hnsmul, coeff_one] + rcases Nat.eq_zero_or_pos n with rfl | hn + · simp + · rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg fun h0 => + Nat.pos_iff_ne_zero.mp hn (hcancel (h0.trans (zero_smul ℕ w).symm))] + · rw [hne _ (not_exists.mp hk), coeff_one, + if_neg (fun h => hk ⟨0, by rw [h, zero_smul]⟩)] + have hsc : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by + rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] + ring + rw [Unitary.mem_iff, hstar, hsc, hmul, hmul, neg_add_cancel, add_neg_cancel, hzero] + exact ⟨rfl, rfl⟩⟩) + +/-- The Taylor coefficient of the exponential gauge jet at a multiple of the exponent. -/ -lemma coeff_expMonomial_nsmul (hw : w ≠ 0) (c : K) (n : ℕ) : - coeff (n • w) (expMonomial c w) = c ^ n / (n.factorial : K) := by +lemma coeff_expUnitary_nsmul (a : ℝ) {w : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : w ≠ 0) (n : ℕ) : + coeff (n • w) (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = + (-(a : ℂ) * Complex.I) ^ n / (n.factorial : ℂ) := by + classical have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ - simp only [coeff_apply, expMonomial] - rw [dif_pos h, show h.choose = n from (nsmul_right_cancel hw h.choose_spec).symm] - -omit [CharZero K] in -/-- The Taylor coefficients of the exponential of a monomial vanish away from the + have hch : h.choose = n := by + obtain ⟨ρ, hρ⟩ := Finsupp.ne_iff.mp hw + exact (Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero (by simpa using hρ)) + (by simpa using DFunLike.congr_fun h.choose_spec ρ)).symm + show (if h : ∃ m : ℕ, n • w = m • w then + (-(a : ℂ) * Complex.I) ^ h.choose / (h.choose.factorial : ℂ) else 0) = _ + rw [dif_pos h, hch] + +/-- The Taylor coefficients of the exponential gauge jet vanish away from the multiples of the exponent. -/ -lemma coeff_expMonomial_of_forall_ne (c : K) {k : σ →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : - coeff k (expMonomial c w) = 0 := by - simp only [coeff_apply, expMonomial] +lemma coeff_expUnitary_of_forall_ne (a : ℝ) {w : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : w ≠ 0) + {k : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : + coeff k (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = 0 := by + classical + show (if h : ∃ n : ℕ, k = n • w then + (-(a : ℂ) * Complex.I) ^ h.choose / (h.choose.factorial : ℂ) else 0) = 0 rw [dif_neg (not_exists.mpr hk)] -/-- The exponential property: exponentials of the same monomial multiply by adding - the scalars. -/ -lemma expMonomial_mul_expMonomial (hw : w ≠ 0) (c c' : K) : - expMonomial c w * expMonomial c' w = expMonomial (c + c') w := by - classical - ext k - by_cases hk : ∃ n : ℕ, k = n • w - · obtain ⟨N, rfl⟩ := hk - rw [coeff_mul, coeff_expMonomial_nsmul hw] - have hsub : (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) ⊆ - Finset.antidiagonal (N • w) := by - intro p hp - obtain ⟨n, hn, rfl⟩ := Finset.mem_image.mp hp - rw [Finset.mem_antidiagonal, ← add_smul, - Nat.add_sub_cancel' (Nat.lt_succ_iff.mp (Finset.mem_range.mp hn))] - have hvanish : ∀ p ∈ Finset.antidiagonal (N • w), - p ∉ (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) → - coeff p.1 (expMonomial c w) * coeff p.2 (expMonomial c' w) = 0 := by - intro p hp hpn - by_cases h1 : ∃ n : ℕ, p.1 = n • w - · obtain ⟨n₁, h1⟩ := h1 - exfalso - apply hpn - have hsum : p.1 + p.2 = N • w := Finset.mem_antidiagonal.mp hp - obtain ⟨ρ, hρ⟩ := exists_apply_ne_zero_of_ne_zero hw - have hcoords : ∀ ρ', n₁ * w ρ' + p.2 ρ' = N * w ρ' := by - intro ρ' - have h' := DFunLike.congr_fun hsum ρ' - simpa [h1, Finsupp.smul_apply] using h' - have hle : n₁ ≤ N := - Nat.le_of_mul_le_mul_right (by have := hcoords ρ; omega) - (Nat.pos_of_ne_zero hρ) - have h2 : p.2 = (N - n₁) • w := by - ext ρ' - rw [Finsupp.smul_apply, smul_eq_mul, Nat.sub_mul] - have := hcoords ρ' - omega - exact Finset.mem_image.mpr - ⟨n₁, Finset.mem_range.mpr (Nat.lt_succ_of_le hle), by rw [← h1, ← h2]⟩ - · rw [coeff_expMonomial_of_forall_ne c (not_exists.mp h1), zero_mul] - rw [← Finset.sum_subset hsub hvanish, - Finset.sum_image (fun n _ m _ h => nsmul_right_cancel hw (congrArg Prod.fst h)), - add_pow, Finset.sum_div] - refine Finset.sum_congr rfl fun n hn => ?_ - rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw] - have hle : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) - have hfact : ((N.choose n : K)) * (n.factorial : K) * ((N - n).factorial : K) = - (N.factorial : K) := by - exact_mod_cast congrArg (Nat.cast : ℕ → K) - (Nat.choose_mul_factorial_mul_factorial hle) - have h1 : (n.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr n.factorial_ne_zero - have h2 : ((N - n).factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr (N - n).factorial_ne_zero - have h3 : (N.factorial : K) ≠ 0 := Nat.cast_ne_zero.mpr N.factorial_ne_zero - rw [div_mul_div_comm, div_eq_div_iff (mul_ne_zero h1 h2) h3] - linear_combination (-(c ^ n * c' ^ (N - n))) * hfact - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_mul] - refine Finset.sum_eq_zero fun p hp => ?_ - by_cases h1 : ∃ n : ℕ, p.1 = n • w - · by_cases h2 : ∃ n : ℕ, p.2 = n • w - · exfalso - obtain ⟨n₁, h1⟩ := h1 - obtain ⟨n₂, h2⟩ := h2 - exact hk ⟨n₁ + n₂, by rw [← Finset.mem_antidiagonal.mp hp, h1, h2, add_smul]⟩ - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h2), mul_zero] - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp h1), zero_mul] - -/-- The coefficientwise star of the exponential of a monomial is the exponential at - the starred scalar. -/ -lemma star_expMonomial {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : m ≠ 0) (c : ℂ) : - star (expMonomial c m : JetRing) = expMonomial (star c) m := by - ext k - rw [JetRing.coeff_star] - by_cases hk : ∃ n : ℕ, k = n • m - · obtain ⟨n, rfl⟩ := hk - rw [coeff_expMonomial_nsmul hw, coeff_expMonomial_nsmul hw, star_div₀, star_pow, - star_natCast] - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), - coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), star_zero] - -/-- The exponential of a monomial at scalar zero is one. -/ -lemma expMonomial_zero (hw : w ≠ 0) : expMonomial (0 : K) w = 1 := by - classical - ext k - by_cases hk : ∃ n : ℕ, k = n • w - · obtain ⟨n, rfl⟩ := hk - rw [coeff_expMonomial_nsmul hw, coeff_one] - rcases Nat.eq_zero_or_pos n with rfl | hn - · simp - · rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg fun h0 => - Nat.pos_iff_ne_zero.mp hn (nsmul_right_cancel hw (h0.trans (zero_smul ℕ w).symm))] - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hk), coeff_one, - if_neg (fun h => hk ⟨0, by rw [h, zero_smul]⟩)] - -/-- The chain rule for the exponential of a monomial: - `∂_ν exp(c X^w) = c w_ν X^{w - e_ν} exp(c X^w)`. -/ -lemma pderiv_expMonomial (hw : w ≠ 0) (ν : σ) (c : K) : - pderiv K ν (expMonomial c w) = - (c * (w ν : K)) • (monomial (w - Finsupp.single ν 1) 1 * expMonomial c w) := by +/-- The chain rule for the exponential gauge jet: + `∂_ν exp(-i a X^w) = -i a w_ν X^{w - e_ν} exp(-i a X^w)`. -/ +lemma pderiv_expUnitary (a : ℝ) {w : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : w ≠ 0) + (ν : Fin 1 ⊕ Fin 3) : + pderiv ℂ ν (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = + ((-(a : ℂ) * Complex.I) * (w ν : ℂ)) • + (monomial (w - Finsupp.single ν 1) 1 * + (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing)) := by classical ext k rw [coeff_pderiv, map_smul, smul_eq_mul, coeff_monomial_mul] @@ -1362,28 +1376,31 @@ lemma pderiv_expMonomial (hw : w ≠ 0) (ν : σ) (c : K) : Finsupp.single_eq_of_ne hρν rw [hsρ] at h1 ⊢ omega - rw [if_pos hdk, one_mul, hkd, hn, coeff_expMonomial_nsmul hw, - coeff_expMonomial_nsmul hw] - have hcast : ((k ν : K) + 1) = (n : K) * (w ν : K) := by exact_mod_cast hkν + rw [if_pos hdk, one_mul, hkd, hn, coeff_expUnitary_nsmul a hw, + coeff_expUnitary_nsmul a hw] + have hcast : ((k ν : ℂ) + 1) = (n : ℂ) * (w ν : ℂ) := by exact_mod_cast hkν rw [hcast] - have hfac : (n.factorial : K) = (n : K) * ((n - 1).factorial : K) := by - exact_mod_cast congrArg (Nat.cast : ℕ → K) + have hfac : (n.factorial : ℂ) = (n : ℂ) * ((n - 1).factorial : ℂ) := by + exact_mod_cast congrArg (Nat.cast : ℕ → ℂ) (Nat.mul_factorial_pred (Nat.pos_iff_ne_zero.mp hnpos)).symm - have hpow : c ^ n = c * c ^ (n - 1) := by + have hpow : (-(a : ℂ) * Complex.I) ^ n = + (-(a : ℂ) * Complex.I) * (-(a : ℂ) * Complex.I) ^ (n - 1) := by conv_lhs => rw [show n = 1 + (n - 1) by omega, pow_add, pow_one] rw [hfac, hpow] - have h1 : ((n : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.pos_iff_ne_zero.mp hnpos) - have h2 : (((n - 1).factorial : K)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero _) + have h1 : ((n : ℂ)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.pos_iff_ne_zero.mp hnpos) + have h2 : (((n - 1).factorial : ℂ)) ≠ 0 := + Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero _) field_simp - · rw [coeff_expMonomial_of_forall_ne _ (not_exists.mp hA), zero_mul] + · rw [coeff_expUnitary_of_forall_ne a hw (not_exists.mp hA), zero_mul] by_cases hwv : w ν = 0 · rw [hwv] simp · have hzero : (if w - Finsupp.single ν 1 ≤ k then - 1 * coeff (k - (w - Finsupp.single ν 1)) (expMonomial c w) else 0) = 0 := by + 1 * coeff (k - (w - Finsupp.single ν 1)) + (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) else 0) = 0 := by split_ifs with hdk · rw [one_mul] - refine coeff_expMonomial_of_forall_ne _ fun m hm => ?_ + refine coeff_expUnitary_of_forall_ne a hw fun m hm => ?_ apply hA refine ⟨m + 1, ?_⟩ have hle : Finsupp.single ν 1 ≤ w := @@ -1400,52 +1417,20 @@ lemma pderiv_expMonomial (hw : w ≠ 0) (ν : σ) (c : K) : · rfl rw [hzero, mul_zero] -/-! - -### A.2 Gauge realization of translations of the jet coordinates - -To identify the gauge invariants of the jet algebra we need not only that every -jet gauge transformation shifts the component functions by the Maurer–Cartan -pairing, but also that enough shifts are realized: for every nonzero symmetrized -multi-index `t` and every real `r` there is a jet of a local `U(1)` gauge -transformation shifting every component function with total multi-index `t` by -exactly `r`, and all others by nothing. The transformation realizing this is the -exponential `exp(-i a X^t)` with `a = r / t!`, formalized through -`MvPowerSeries.expMonomial`. - --/ - -/-- The jet of the local `U(1)` gauge transformation `exp(-i a X^w)`: the - exponential of an imaginary multiple of a spacetime monomial, which is unitary - as a formal power series. -/ -noncomputable def expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - unitary JetRing := - ⟨expMonomial (-(a : ℂ) * Complex.I) w, by - have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by - rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] - ring - rw [Unitary.mem_iff, star_expMonomial hw, hstar, expMonomial_mul_expMonomial hw, - expMonomial_mul_expMonomial hw, neg_add_cancel, add_neg_cancel, - expMonomial_zero hw] - exact ⟨rfl, rfl⟩⟩ - /-- The Maurer–Cartan series of the exponential gauge jet: the monomial - `a w_ν X^{w - e_ν}`, which is the jet of the gradient `a ∂_ν X^w`. -/ + `a w_ν X^{w - e_ν}`, which is the jet of the gradient `a ∂_ν X^w`. The star of + the series is eliminated by the unitarity relation, so only the chain rule + enters. -/ lemma maurerCartanU1_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) (ν : Fin 1 ⊕ Fin 3) : - maurerCartanU1 (1, 1, expUnitary a w hw) ν = + maurerCartanU1 (expUnitary a w hw) ν = monomial (w - Finsupp.single ν 1) ((a : ℂ) * ((w ν : ℕ) : ℂ)) := by - have hstar : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by - rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] - ring - rw [maurerCartanU1, - show (((1, 1, expUnitary a w hw) : JetGaugeGroupI).2.2 : JetRing) = - expMonomial (-(a : ℂ) * Complex.I) w from rfl, - pderiv_expMonomial hw, star_expMonomial hw, hstar, smul_mul_assoc, - mul_assoc (monomial (w - Finsupp.single ν 1) 1), - expMonomial_mul_expMonomial hw, add_neg_cancel, expMonomial_zero hw, mul_one, - mul_smul_comm, ← monomial_zero_eq_C_apply, monomial_mul_monomial, zero_add, - ← map_smul, smul_eq_mul] + have hu : (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) * + star (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = 1 := + (Unitary.mem_iff.mp (expUnitary a w hw).2.2.2).2 + rw [maurerCartanU1, pderiv_expUnitary a hw ν, smul_mul_assoc, + mul_assoc (monomial (w - Finsupp.single ν 1) 1), hu, mul_one, mul_smul_comm, + ← monomial_zero_eq_C_apply, monomial_mul_monomial, zero_add, ← map_smul, smul_eq_mul] congr 1 ring_nf rw [Complex.I_sq] @@ -1457,13 +1442,13 @@ lemma maurerCartanU1_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - mcPairing (1, 1, expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + mcPairing (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = if s + {ν} = t then r else 0 := by rw [mcPairing_basis_dB', Complex.selfAdjointEquiv_apply, - show ((maurerCartanU1Coeff (1, 1, expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + show ((maurerCartanU1Coeff (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) (Multiset.toFinsupp t) ht) ν (Multiset.toFinsupp s) : selfAdjoint ℂ) : ℂ) = - coeff (Multiset.toFinsupp s) (maurerCartanU1 (1, 1, expUnitary + coeff (Multiset.toFinsupp s) (maurerCartanU1 (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) (Multiset.toFinsupp t) ht) ν) from rfl, maurerCartanU1_expUnitary, coeff_monomial] @@ -1509,7 +1494,6 @@ lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) · rw [if_neg hm] simp - /-- The difference between a jet-algebra generator and its canonical representative is a derivative of the field strength, or zero. -/ lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : @@ -1565,12 +1549,12 @@ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : have h0 : s₀ + {ν₀} = 0 := Multiset.toFinsupp.injective (by rw [h, Multiset.toFinsupp_zero]) simp at h0 - have hconj := equivMvPolynomial_repJetGaugeGroupI_u1 + have hconj := equivMvPolynomial_repJetGaugeGroupI (expUnitary (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) (Multiset.toFinsupp (s₀ + {ν₀})) hne) V rw [hV _] at hconj have hfun : (fun g => MvPolynomial.X g + MvPolynomial.C - (mcPairing (1, 1, expUnitary + (mcPairing (expUnitary (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) (Multiset.toFinsupp (s₀ + {ν₀})) hne) (JetComponentSpace.basis g))) = From 02fa27d92859d3d13456ce4b002aade42791465a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 5 Aug 2026 09:41:19 +0100 Subject: [PATCH 093/254] Prove of: 'Theorem A' for QED Co-Authored-By: Claude --- Physlib/Particles/QED/JetAlgebra.lean | 1382 ++++++++++++++++- .../StandardModel/Fermions/LeptonSinglet.lean | 96 ++ .../StandardModel/GaugeBosons/BBoson.lean | 252 ++- .../GaugeGroup/MaurerCartan.lean | 8 + 4 files changed, 1666 insertions(+), 72 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index d2dc95b3b..204dce311 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -9,6 +9,7 @@ public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet public import Physlib.Particles.StandardModel.GaugeBosons.BBoson public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.LinearAlgebra.DirectSum.Finsupp public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis @@ -230,19 +231,24 @@ abbrev LeptonComponent : Type := the images of such elements in the jet algebra. -/ abbrev LeptonLinear : Type := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonComponent -/-- The derivative action of a jet on the lepton component functions, acting on - the derivative symbols. -/ -noncomputable def actionC (χ : JetRing) : LeptonComponent →ₗ[ℂ] LeptonComponent := +variable {W : Type*} [AddCommGroup W] [Module ℂ W] + +/-- The derivative action of a jet on component functions valued in any target + `W`, acting on the derivative symbols. -/ +noncomputable def actionC (χ : JetRing) : + (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := TensorProduct.map (DerivAlgebraComplex.jetRingAction χ) LinearMap.id -/-- The derivative-symbol shift on the lepton component functions. -/ -noncomputable def shiftC (ν : Fin 1 ⊕ Fin 3) : LeptonComponent →ₗ[ℂ] LeptonComponent := +/-- The derivative-symbol shift on component functions valued in any target + `W`. -/ +noncomputable def shiftC (ν : Fin 1 ⊕ Fin 3) : + (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := TensorProduct.map (DerivAlgebraComplex.deriv ν) LinearMap.id -lemma actionC_shiftC (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : LeptonComponent) : +lemma actionC_shiftC (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex ⊗[ℂ] W) : actionC χ (shiftC ν a) = shiftC ν (actionC χ a) + actionC (MvPowerSeries.pderiv ℂ ν χ) a := by - have h : (actionC χ) ∘ₗ (shiftC ν) = + have h : (actionC (W := W) χ) ∘ₗ (shiftC ν) = (shiftC ν) ∘ₗ (actionC χ) + actionC (MvPowerSeries.pderiv ℂ ν χ) := by simp only [actionC, shiftC] rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, @@ -253,9 +259,9 @@ lemma actionC_shiftC (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : LeptonComponent) TensorProduct.map_add_left] exact LinearMap.congr_fun h a -lemma actionC_comm (χ ψ : JetRing) (a : LeptonComponent) : +lemma actionC_comm (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : actionC χ (actionC ψ a) = actionC ψ (actionC χ a) := by - have h : (actionC χ) ∘ₗ (actionC ψ) = (actionC ψ) ∘ₗ (actionC χ) := by + have h : (actionC (W := W) χ) ∘ₗ (actionC ψ) = (actionC ψ) ∘ₗ (actionC χ) := by simp only [actionC] rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.jetRingAction ψ) = @@ -263,17 +269,17 @@ lemma actionC_comm (χ ψ : JetRing) (a : LeptonComponent) : LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_comm χ ψ b] exact LinearMap.congr_fun h a -lemma actionC_mul (χ ψ : JetRing) (a : LeptonComponent) : +lemma actionC_mul (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : actionC (χ * ψ) a = actionC χ (actionC ψ a) := by - have h : actionC (χ * ψ) = (actionC χ) ∘ₗ (actionC ψ) := by + have h : actionC (W := W) (χ * ψ) = (actionC χ) ∘ₗ (actionC ψ) := by simp only [actionC] rw [← TensorProduct.map_comp, LinearMap.id_comp, DerivAlgebraComplex.jetRingAction_mul] exact LinearMap.congr_fun h a -lemma actionC_C (c : ℂ) (a : LeptonComponent) : +lemma actionC_C (c : ℂ) (a : DerivAlgebraComplex ⊗[ℂ] W) : actionC (MvPowerSeries.C c : JetRing) a = c • a := by - have h : actionC (MvPowerSeries.C c : JetRing) = c • LinearMap.id := by + have h : actionC (W := W) (MvPowerSeries.C c : JetRing) = c • LinearMap.id := by rw [actionC, DerivAlgebraComplex.jetRingAction_C, TensorProduct.map_smul_left, TensorProduct.map_id] rw [h] @@ -364,14 +370,22 @@ noncomputable def DψAux (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : LeptonLinea /-- The derivative actions of the Maurer–Cartan series and of a hypercharge power commute. -/ lemma actionC_maurerCartanU1_pow (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) - (a : LeptonComponent) : + (a : DerivAlgebraComplex ⊗[ℂ] W) : actionC (maurerCartanU1 U μ) (actionC ((U.2.2 : JetRing) ^ q) a) = actionC ((U.2.2 : JetRing) ^ q) (actionC (maurerCartanU1 U μ) a) := actionC_comm _ _ a +/-- The derivative actions of the Maurer–Cartan series and of a conjugate + hypercharge power commute. -/ +lemma actionC_maurerCartanU1_star_pow (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) + (a : DerivAlgebraComplex ⊗[ℂ] W) : + actionC (maurerCartanU1 U μ) (actionC (star (U.2.2 : JetRing) ^ q) a) = + actionC (star (U.2.2 : JetRing) ^ q) (actionC (maurerCartanU1 U μ) a) := + actionC_comm _ _ a + /-- The derivative action of a jet on the zeroth-order lepton component: the scalar action of its value at the base point. -/ -lemma actionC_one_tmul (χ : JetRing) (φ : Module.Dual ℂ LeptonSinglet) : +lemma actionC_one_tmul (χ : JetRing) (φ : W) : actionC χ ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) = MvPowerSeries.constantCoeff χ • ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) := by @@ -573,6 +587,1344 @@ lemma repJetGaugeGroupI_Dψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) ( map_smul, ← Dψ_eq_leptonLinearIncl, Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] +/-! + +## Covariant derivatives of the conjugate lepton + +The conjugate lepton `ψ̄` carries the opposite hypercharge: its component +functions transform through the conjugate-contragredient power series +`(star u) ^ 6`, so under a jet gauge transformation `∂_μ ψ̄_α` shifts by +`+ 6 i mc_μ ψ̄_α` and the covariant step is `D̄_μ = ∂_μ - 6 i B_μ`. + +The covariance proof mirrors the unconjugated case on the conjugate-linear +model, with the coupling `6 i` replaced by `- 6 i` throughout. + +-/ + +/-- One covariant-derivative step `D̄_μ = ∂_μ - 6 i B_μ` for the conjugate + lepton on the QED jet algebra. -/ +noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ + +/-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the + ordered list of directions `l`, with the head of the list the outermost + derivative. -/ +noncomputable def Dbarψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := + l.foldr (fun μ x => covariantStepBar μ x) [JetGenerators.dbarψ {} α]ₐ + +/-- The zeroth covariant derivative is the conjugate-lepton component function + itself. -/ +@[simp] +lemma Dbarψ_nil (α : Fin 2) : + Dbarψ [] α = [JetGenerators.dbarψ {} α]ₐ := rfl + +@[simp] +lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ (μ :: l) α = covariantStepBar μ (Dbarψ l α) := rfl + +/-- The conjugate lepton component functions. -/ +abbrev ConjLeptonComponent : Type := + SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet) + +/-- The conjugate-linear elements: B-boson polynomials tensored with a single + conjugate lepton component function. -/ +abbrev ConjLeptonLinear : Type := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] ConjLeptonComponent + +/-- The embedding of a conjugate lepton component function into the lepton jet + algebra. -/ +noncomputable def conjLeptonComponentIncl : + ConjLeptonComponent →ₗ[ℂ] LeptonSinglet.JetAlgebra := + (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inr ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) ConjLeptonComponent) + +lemma conjLeptonComponentIncl_apply (a : ConjLeptonComponent) : + conjLeptonComponentIncl a = + ExteriorAlgebra.ι ℂ ((0, a) : LeptonSinglet.JetComponentSpace) := rfl + +/-- The inclusion of the conjugate-linear elements into the QED jet algebra. -/ +noncomputable def conjLeptonLinearIncl : ConjLeptonLinear →ₗ[ℂ] JetAlgebra := + TensorProduct.map LinearMap.id conjLeptonComponentIncl + +lemma conjLeptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : ConjLeptonComponent) : + conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] conjLeptonComponentIncl a := by + simp [conjLeptonLinearIncl] + +/-- The covariant-derivative step `D̄_μ = ∂_μ - 6 i B_μ` on conjugate-linear + elements. -/ +noncomputable def covariantStepBarAux (μ : Fin 1 ⊕ Fin 3) : + ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := + TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) + LinearMap.id + + TensorProduct.map LinearMap.id (shiftC μ) - + ((6 : ℂ) * Complex.I) • + TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id + +lemma covariantStepBarAux_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : ConjLeptonComponent) : + covariantStepBarAux μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + + p ⊗ₜ[ℂ] shiftC μ a - + ((6 : ℂ) * Complex.I) • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by + simp [covariantStepBarAux] + +/-- The gauge action on conjugate-linear elements. -/ +noncomputable def repBarAux (U : JetGaugeGroupI) : ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := + TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) + (actionC (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6)) + +lemma repBarAux_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : ConjLeptonComponent) : + repBarAux U (p ⊗ₜ[ℂ] a) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + actionC (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) a := by + simp [repBarAux] + +/-- The Maurer–Cartan anomaly operators on conjugate-linear elements: the + obstruction to the gauge action commuting with the conjugate covariant step, + with the couplings of the unconjugated case negated. -/ +noncomputable def anomalyBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := + TensorProduct.map (LinearMap.baseChange ℂ + (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id - + ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id + + ((6 : ℂ) * Complex.I) • + TensorProduct.map LinearMap.id (actionC (BBoson.maurerCartanU1Deriv U μ s)) + +lemma anomalyBarAux_tmul (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : ConjLeptonComponent) : + anomalyBarAux U s μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a - + ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) + + ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.maurerCartanU1Deriv U μ s) a) := by + simp [anomalyBarAux] + +/-- The zeroth-order conjugate-lepton component as a conjugate-linear element. -/ +noncomputable def ψBarAux (α : Fin 2) : ConjLeptonLinear := + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] + LeptonSinglet.basis.conj.dualBasis α) + +/-- The conjugate covariant derivative as a conjugate-linear element. -/ +noncomputable def DbarψAux (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : ConjLeptonLinear := + l.foldr (fun μ x => covariantStepBarAux μ x) (ψBarAux α) + +set_option maxHeartbeats 1000000 in +set_option linter.unusedSimpArgs false in +/-- The gauge action commutes with the conjugate covariant step up to the gauge + action of the zeroth conjugate anomaly operator. -/ +lemma repBarAux_covariantStepBarAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (x : ConjLeptonLinear) : + repBarAux U (covariantStepBarAux μ x) = + covariantStepBarAux μ (repBarAux U x) + repBarAux U (anomalyBarAux U [] μ x) := by + have h0 : (↑([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [Multiset.coe_nil, zero_add] + have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by + intro z + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [mul_add, ha, hb] + | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] + have key : (repBarAux U) ∘ₗ (covariantStepBarAux μ) = + (covariantStepBarAux μ) ∘ₗ (repBarAux U) + (repBarAux U) ∘ₗ (anomalyBarAux U [] μ) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepBarAux_tmul, + anomalyBarAux_tmul, BBoson.maurerCartanU1Deriv_nil, map_add, map_smul, map_sub, + repBarAux_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] + simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, + actionC_shiftC, BBoson.pderiv_pow_unitary_star, actionC_mul, actionC_C, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, + actionC_maurerCartanU1_star_pow] + have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB 0 μ) + + ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + + ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by + rw [add_mul, smul_mul_assoc, hone] + simp only [hdist] + simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, TensorProduct.tmul_sub, + TensorProduct.sub_tmul, ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, + smul_add, smul_sub, smul_smul, Nat.cast_ofNat] + module + exact LinearMap.congr_fun key x + +set_option linter.unusedSimpArgs false in +/-- The conjugate anomaly operators commute with the conjugate covariant step up + to the anomaly operator with the derivative direction appended. -/ +lemma anomalyBarAux_covariantStepBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (x : ConjLeptonLinear) : + anomalyBarAux U s μ (covariantStepBarAux ν x) = + covariantStepBarAux ν (anomalyBarAux U s μ x) + anomalyBarAux U (ν :: s) μ x := by + have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = + (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by + rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by + rw [Multiset.singleton_add, Multiset.cons_coe]] + ac_rfl + have hshift : BBoson.JetGenerators.shiftMulti ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + (BBoson.JetGenerators.dB {} ν) = + BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by + rw [BBoson.JetGenerators.shiftMulti_dB] + congr 1 + have hm : BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = + BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by + rw [BBoson.mcPairing_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = + ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by + rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] + have key : (anomalyBarAux U s μ) ∘ₗ (covariantStepBarAux ν) = + (covariantStepBarAux ν) ∘ₗ (anomalyBarAux U s μ) + anomalyBarAux U (ν :: s) μ := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepBarAux_tmul, + anomalyBarAux_tmul, map_add, map_smul, map_sub, BBoson.maurerCartanU1Deriv_cons] + simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, + BBoson.JetAlgebra.mcDeriv_baseChange_mul, + BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] + have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by + intro z + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [mul_add, ha, hb] + | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] + have hdist : (((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = + ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • + p := by + rw [smul_mul_assoc, hone] + simp only [hdist] + simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, TensorProduct.tmul_sub, + TensorProduct.sub_tmul, ← TensorProduct.smul_tmul', smul_add, smul_sub, smul_smul] + module + exact LinearMap.congr_fun key x + +/-- The conjugate anomaly operators annihilate the zeroth-order conjugate-lepton + component. -/ +lemma anomalyBarAux_ψBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + anomalyBarAux U s μ (ψBarAux α) = 0 := by + rw [ψBarAux, anomalyBarAux_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, actionC_one_tmul, BBoson.constantCoeff_maurerCartanU1Deriv, + TensorProduct.tmul_smul, smul_smul, zero_sub, neg_add_cancel] + +/-- The gauge action on the zeroth-order conjugate-lepton component is the + conjugate hypercharge character of the value of the jet at the base point. -/ +lemma repBarAux_ψBarAux (U : JetGaugeGroupI) (α : Fin 2) : + repBarAux U (ψBarAux α) = + MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + ψBarAux α := by + rw [ψBarAux, repBarAux_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] + simp only [BBoson.JetAlgebra.repJetGaugeGroupI_one, actionC_one_tmul, + TensorProduct.tmul_smul] + +/-- Every conjugate anomaly operator annihilates every conjugate covariant + derivative. -/ +lemma anomalyBarAux_DbarψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), + anomalyBarAux U s μ (DbarψAux l α) = 0 := by + induction l with + | nil => exact fun s μ => anomalyBarAux_ψBarAux U s μ α + | cons ν l ih => + intro s μ + rw [show DbarψAux (ν :: l) α = covariantStepBarAux ν (DbarψAux l α) from rfl, + anomalyBarAux_covariantStepBarAux, ih s μ, map_zero, zero_add, ih (ν :: s) μ] + +/-- Covariance of the conjugate covariant derivatives on the conjugate-linear + model. -/ +lemma repBarAux_DbarψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repBarAux U (DbarψAux l α) = + MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + DbarψAux l α := by + induction l with + | nil => exact repBarAux_ψBarAux U α + | cons ν l ih => + rw [show DbarψAux (ν :: l) α = covariantStepBarAux ν (DbarψAux l α) from rfl, + repBarAux_covariantStepBarAux, ih, map_smul, anomalyBarAux_DbarψAux U l α [] ν, + map_zero, add_zero] + +/-- The inclusion intertwines the conjugate covariant steps. -/ +lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) (x : ConjLeptonLinear) : + covariantStepBar μ (conjLeptonLinearIncl x) = + conjLeptonLinearIncl (covariantStepBarAux μ x) := by + have key : (covariantStepBar μ) ∘ₗ conjLeptonLinearIncl = + conjLeptonLinearIncl ∘ₗ (covariantStepBarAux μ) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, covariantStepBarAux_tmul, + conjLeptonComponentIncl_apply, covariantStepBar, LinearMap.sub_apply, + LinearMap.smul_apply, LinearMap.mulLeft_apply, map_add, map_smul, map_sub, + jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, + LeptonSinglet.JetComponentSpace.jetDeriv_inr', ofGenerator, shiftC, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + exact LinearMap.congr_fun key x + +/-- The inclusion intertwines the gauge actions. -/ +lemma repJetGaugeGroupI_conjLeptonLinearIncl (U : JetGaugeGroupI) (x : ConjLeptonLinear) : + repJetGaugeGroupI U (conjLeptonLinearIncl x) = conjLeptonLinearIncl (repBarAux U x) := by + have key : (repJetGaugeGroupI U) ∘ₗ conjLeptonLinearIncl = + conjLeptonLinearIncl ∘ₗ (repBarAux U) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, repBarAux_tmul, + conjLeptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, + TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr', + actionC] + exact LinearMap.congr_fun key x + +/-- The conjugate covariant derivatives are the images of their conjugate-linear + models. -/ +lemma Dbarψ_eq_conjLeptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α = conjLeptonLinearIncl (DbarψAux l α) := by + induction l with + | nil => + rw [Dbarψ_nil, show DbarψAux [] α = ψBarAux α from rfl, ψBarAux, + conjLeptonLinearIncl_tmul, conjLeptonComponentIncl_apply] + simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, + LeptonSinglet.JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.basis_nil] + | cons ν l ih => + rw [Dbarψ_cons, ih, covariantStepBar_conjLeptonLinearIncl] + rfl + +/-- Covariance of the covariant derivatives of the conjugate lepton: a jet of + gauge transformations acts on `D̄_l ψ̄_α` through the conjugate hypercharge + character of its value at the base point alone. -/ +lemma repJetGaugeGroupI_Dbarψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U (Dbarψ l α) = (star U.eval.2.2) ^ 6 • Dbarψ l α := by + have hval : ((star U.eval.2.2 : unitary ℂ) : ℂ) = + MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing)) := by + rw [Unitary.coe_star, JetRing.constantCoeff_star] + rfl + rw [Dbarψ_eq_conjLeptonLinearIncl, repJetGaugeGroupI_conjLeptonLinearIncl, + repBarAux_DbarψAux, map_smul, ← Dbarψ_eq_conjLeptonLinearIncl, Submonoid.smul_def, + SubmonoidClass.coe_pow, hval, map_pow] + +/-! + +## Invariants of the QED jet algebra + +The field strengths of the B boson, embedded in the QED jet algebra, are exactly +invariant; the covariant derivatives of the lepton and of its conjugate transform +by the hypercharge characters `u(0)^6` and `u(0)^{-6}` of the value of the gauge +jet at the base point. The gauge invariants of the QED jet algebra are contained +in the algebra generated by these three families. + +-/ + +/-- The derivatives of the B-boson field strength, embedded in the QED jet + algebra. -/ +noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ₜ[ℂ] 1 + +/-- The embedded field-strength derivatives are gauge invariant. -/ +lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by + rw [fieldStrengthDeriv, repJetGaugeGroupI_tmul, + BBoson.JetAlgebra.repJetGaugeGroupI_fieldStrengthDeriv, + show LeptonSinglet.JetAlgebra.repJetGaugeGroupI U (1 : LeptonSinglet.JetAlgebra) = 1 from + map_one (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U))] + +/-- The generating set of the invariants of the QED jet algebra: the embedded + field-strength derivatives together with the covariant derivatives of the + lepton and of its conjugate. -/ +noncomputable def invariantGenerators : Set JetAlgebra := + (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ + (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dψ p.1 p.2) ∪ + (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ p.1 p.2) + +/-! + +### The covariant substitution + +The change of variables from the plain fermionic coordinates `∂_s ψ_α`, +`∂_s ψ̄_α` to the covariant coordinates `D_s ψ_α`, `D̄_s ψ̄_α`, as an algebra +endomorphism of the QED jet algebra fixing the B-boson factor. + +-/ + +/-- A canonical list presentation of a multiset of spacetime indices. -/ +noncomputable def sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : List (Fin 1 ⊕ Fin 3) := + ((s.map finSumFinEquiv).sort (· ≤ ·)).map finSumFinEquiv.symm + +@[simp] +lemma coe_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : + (↑(sortList s) : Multiset (Fin 1 ⊕ Fin 3)) = s := by + rw [sortList, ← Multiset.map_coe, Multiset.sort_eq, Multiset.map_map] + simp + +@[simp] +lemma length_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : + (sortList s).length = Multiset.card s := by + rw [sortList, List.length_map, Multiset.length_sort, Multiset.card_map] + +/-- The derivative degree of a lepton jet generator. -/ +def genDeg : LeptonSinglet.JetGenerators → ℕ + | .dψ s _ => Multiset.card s + | .dbarψ s _ => Multiset.card s + +/-- The covariant element associated with a lepton jet generator: the covariant + derivative along a canonical ordering of the multiset of derivative indices. -/ +noncomputable def covGenerator : LeptonSinglet.JetGenerators → JetAlgebra + | .dψ s α => Dψ (sortList s) α + | .dbarψ s α => Dbarψ (sortList s) α + +/-- The inclusion of B-coefficiented degree-one fermionic elements into the QED + jet algebra. -/ +noncomputable def oddIncl : ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetComponentSpace) →ₗ[ℂ] JetAlgebra := + TensorProduct.map LinearMap.id (ExteriorAlgebra.ι ℂ) + +lemma oddIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace) : + oddIncl (p ⊗ₜ[ℂ] m) = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m := by + simp [oddIncl] + +set_option maxHeartbeats 1000000 in +/-- Odd elements anticommute. -/ +lemma oddIncl_mul_add_swap (w w' : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetComponentSpace) : + oddIncl w * oddIncl w' + oddIncl w' * oddIncl w = 0 := by + have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind + have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + induction w using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, add_zero] + | add u v hu hv => + simp only [map_add, hd₁, hd₂] + calc oddIncl u * oddIncl w' + oddIncl v * oddIncl w' + + (oddIncl w' * oddIncl u + oddIncl w' * oddIncl v) = + (oddIncl u * oddIncl w' + oddIncl w' * oddIncl u) + + (oddIncl v * oddIncl w' + oddIncl w' * oddIncl v) := by abel + _ = 0 := by rw [hu, hv, add_zero] + | tmul p m => + induction w' using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, add_zero] + | add u v hu hv => + simp only [map_add, hd₁, hd₂] + calc oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + + (oddIncl u * oddIncl (p ⊗ₜ[ℂ] m) + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) = + (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl u * oddIncl (p ⊗ₜ[ℂ] m)) + + (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) := by + abel + _ = 0 := by rw [hu, hv, add_zero] + | tmul q n => + rw [oddIncl_tmul, oddIncl_tmul, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, mul_comm q p, ← TensorProduct.tmul_add, + ExteriorAlgebra.ι_add_mul_swap, TensorProduct.tmul_zero] + +/-- Odd elements square to zero. -/ +lemma oddIncl_mul_self (w : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetComponentSpace) : + oddIncl w * oddIncl w = 0 := by + have h := oddIncl_mul_add_swap w w + have h2 : (2 : ℂ) • (oddIncl w * oddIncl w) = 0 := by + rw [two_smul] + exact h + exact (smul_eq_zero.mp h2).resolve_left (by norm_num) + +/-- The linear map sending each fermionic component function to its covariant + version. -/ +noncomputable def covMap : LeptonSinglet.JetComponentSpace →ₗ[ℂ] JetAlgebra := + LeptonSinglet.JetComponentSpace.basis.constr ℂ covGenerator + +@[simp] +lemma covMap_basis (g : LeptonSinglet.JetGenerators) : + covMap (LeptonSinglet.JetComponentSpace.basis g) = covGenerator g := by + rw [covMap, Module.Basis.constr_basis] + +lemma covGenerator_mem_range_oddIncl (g : LeptonSinglet.JetGenerators) : + covGenerator g ∈ LinearMap.range oddIncl := by + have hlept : ∀ x, leptonLinearIncl x ∈ LinearMap.range oddIncl := by + intro x + refine ⟨TensorProduct.map LinearMap.id (LinearMap.inl ℂ _ _) x, ?_⟩ + have h : oddIncl ∘ₗ TensorProduct.map LinearMap.id (LinearMap.inl ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = leptonLinearIncl := by + rw [oddIncl, leptonLinearIncl, ← TensorProduct.map_comp] + rfl + exact LinearMap.congr_fun h x + have hconj : ∀ x, conjLeptonLinearIncl x ∈ LinearMap.range oddIncl := by + intro x + refine ⟨TensorProduct.map LinearMap.id (LinearMap.inr ℂ _ _) x, ?_⟩ + have h : oddIncl ∘ₗ TensorProduct.map LinearMap.id (LinearMap.inr ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = conjLeptonLinearIncl := by + rw [oddIncl, conjLeptonLinearIncl, ← TensorProduct.map_comp] + rfl + exact LinearMap.congr_fun h x + cases g with + | dψ s α => + rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, + Dψ_eq_leptonLinearIncl] + exact hlept _ + | dbarψ s α => + rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, + Dbarψ_eq_conjLeptonLinearIncl] + exact hconj _ + +lemma covMap_mem_range_oddIncl (m : LeptonSinglet.JetComponentSpace) : + covMap m ∈ LinearMap.range oddIncl := by + rw [covMap, Module.Basis.constr_apply] + exact Submodule.sum_mem _ fun g _ => + Submodule.smul_mem _ _ (covGenerator_mem_range_oddIncl g) + +lemma covMap_mul_self (m : LeptonSinglet.JetComponentSpace) : + covMap m * covMap m = 0 := by + obtain ⟨w, hw⟩ := covMap_mem_range_oddIncl m + rw [← hw] + exact oddIncl_mul_self w + +/-- The covariant substitution on the fermionic factor. -/ +noncomputable def covExtHom : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := + ExteriorAlgebra.lift ℂ ⟨covMap, covMap_mul_self⟩ + +@[simp] +lemma covExtHom_ι (m : LeptonSinglet.JetComponentSpace) : + covExtHom (ExteriorAlgebra.ι ℂ m) = covMap m := by + rw [covExtHom, ExteriorAlgebra.lift_ι_apply] + +/-- Elements of the B-boson factor are central in the QED jet algebra. -/ +lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : + (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * y = + y * (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) := by + have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind + have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + induction y using TensorProduct.induction_on with + | zero => rw [hz₂, hz₁] + | add a b ha hb => simp only [hd₁, hd₂, ha, hb] + | tmul q l => + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + mul_comm, one_mul, mul_one] + +/-- The covariant substitution: the algebra endomorphism of the QED jet algebra + fixing the B-boson factor and sending each plain fermionic generator to its + covariant version. -/ +noncomputable def covSubst : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft covExtHom + (fun p y => (tmul_one_mul_comm p (covExtHom y))) + +lemma covSubst_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : + covSubst (p ⊗ₜ[ℂ] l) = (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := by + rw [covSubst, Algebra.TensorProduct.lift_tmul] + rfl + +@[simp] +lemma covSubst_tmul_one (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + covSubst (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = p ⊗ₜ[ℂ] 1 := by + have h1 : covExtHom (1 : LeptonSinglet.JetAlgebra) = 1 := covExtHom.map_one + have hmul : ∀ a : JetAlgebra, a * 1 = a := fun a => mul_one a + rw [covSubst_tmul, h1, hmul] + +@[simp] +lemma covSubst_one_tmul_ι (m : LeptonSinglet.JetComponentSpace) : + covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = + covMap m := by + have hone : ∀ a : JetAlgebra, 1 * a = a := fun a => one_mul a + rw [covSubst_tmul, covExtHom_ι, ← Algebra.TensorProduct.one_def, hone] + +/-! + +### The gauge action as an algebra homomorphism, and the intertwining + +-/ + +/-- The complexified B-boson gauge action as an algebra homomorphism. -/ +noncomputable def complexRepAlgHom (U : JetGaugeGroupI) : + (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra) := + AlgHom.ofLinearMap (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) + (by + rw [Algebra.TensorProduct.one_def, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul, + BBoson.JetAlgebra.repJetGaugeGroupI_one]) + (BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul U) + +@[simp] +lemma complexRepAlgHom_apply (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + complexRepAlgHom U p = BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := rfl + +/-- The QED gauge action as an algebra homomorphism. -/ +noncomputable def repAlgHom (U : JetGaugeGroupI) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (complexRepAlgHom U) + (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) + +set_option maxHeartbeats 1000000 in +lemma repJetGaugeGroupI_eq_repAlgHom (U : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI U x = repAlgHom U x := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb] + | tmul p l => + rw [show repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) from by + rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul], + repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply] + +set_option maxHeartbeats 1000000 in +/-- On gauge jets with trivial value at the base point, the covariant elements + are exactly invariant, so the gauge action intertwines the covariant + substitution with the B-boson action alone. -/ +lemma repJetGaugeGroupI_covSubst (U : JetGaugeGroupI) (hU : U.eval.2.2 = 1) + (x : JetAlgebra) : + repJetGaugeGroupI U (covSubst x) = + covSubst (TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) + LinearMap.id x) := by + have hcovfix : (repAlgHom U).comp covExtHom = covExtHom := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) + simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, + AlgHom.toLinearMap_apply, covExtHom_ι] + have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = covMap := by + refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ + rw [LinearMap.comp_apply, covMap_basis, AlgHom.toLinearMap_apply, + ← repJetGaugeGroupI_eq_repAlgHom] + cases g with + | dψ s α => + rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, + repJetGaugeGroupI_Dψ, hU, one_pow, one_smul] + | dbarψ s α => + rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, + repJetGaugeGroupI_Dbarψ, hU, star_one, one_pow, one_smul] + exact LinearMap.congr_fun hlin m + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul p l => + simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, covSubst_tmul] + rw [repJetGaugeGroupI_eq_repAlgHom] + have hm : repAlgHom U ((p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l) = + repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + repAlgHom U (covExtHom l) := map_mul _ _ _ + have h1 : repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] 1 := by + rw [repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply] + congr 1 + exact (ExteriorAlgebra.map _).map_one + have h2 : repAlgHom U (covExtHom l) = covExtHom l := AlgHom.congr_fun hcovfix l + rw [hm, h1, h2] + +/-! + +### The derivative-degree filtration + +The filtration of the QED jet algebra by the total derivative degree of the +fermionic factors: the span of B-coefficiented products of fermionic generators +of bounded total degree. The covariant substitution is unitriangular for this +filtration. + +-/ + +/-- The generating set of the degree filtration. -/ +def filtGen (d : ℕ) : Set JetAlgebra := + {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), + (l.map genDeg).sum ≤ d ∧ + z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} + +/-- The generating set of the strict degree filtration. -/ +def sfiltGen (d : ℕ) : Set JetAlgebra := + {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), + (l.map genDeg).sum < d ∧ + z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} + +/-- The filtration of the QED jet algebra by total fermionic derivative degree. -/ +noncomputable def filt (d : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ (filtGen d) + +/-- The strict filtration. -/ +noncomputable def sfilt (d : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ (sfiltGen d) + +lemma filt_mono {d d' : ℕ} (h : d ≤ d') : filt d ≤ filt d' := + Submodule.span_mono fun z hz => by + obtain ⟨c, l, hl, hze⟩ := hz + exact ⟨c, l, hl.trans h, hze⟩ + +lemma sfilt_mono {d d' : ℕ} (h : d ≤ d') : sfilt d ≤ sfilt d' := + Submodule.span_mono fun z hz => by + obtain ⟨c, l, hl, hze⟩ := hz + exact ⟨c, l, hl.trans_le h, hze⟩ + +lemma sfilt_le_filt (d : ℕ) : sfilt d ≤ filt d := + Submodule.span_mono fun z hz => by + obtain ⟨c, l, hl, hze⟩ := hz + exact ⟨c, l, hl.le, hze⟩ + +lemma sfilt_zero : sfilt 0 = ⊥ := by + rw [sfilt, show sfiltGen 0 = ∅ from Set.eq_empty_iff_forall_notMem.mpr (by + rintro z ⟨c, l, hl, hze⟩ + omega), Submodule.span_empty] + +lemma sfilt_succ (d : ℕ) : sfilt (d + 1) = filt d := by + rw [sfilt, filt, show sfiltGen (d + 1) = filtGen d from Set.ext fun z => + ⟨fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mp hl, hze⟩, + fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mpr hl, hze⟩⟩] + +lemma mul_mem_filt {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) + (hy : y ∈ filt b) : x * y ∈ filt (a + b) := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u + have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u + have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := + fun r u v => smul_mul_assoc r u v + have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := + fun r u v => mul_smul_comm r u v + induction hx using Submodule.span_induction with + | mem x' hx' => + induction hy using Submodule.span_induction with + | mem y' hy' => + obtain ⟨c, l, hl, rfl⟩ := hx' + obtain ⟨c', l', hl', rfl⟩ := hy' + refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ + · rw [List.map_append, List.sum_append] + omega + · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + | zero => rw [hz₂]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih + | zero => rw [hz₁]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih + +lemma mul_mem_sfilt_left {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ sfilt a) + (hy : y ∈ filt b) : x * y ∈ sfilt (a + b) := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u + have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u + have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := + fun r u v => smul_mul_assoc r u v + have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := + fun r u v => mul_smul_comm r u v + induction hx using Submodule.span_induction with + | mem x' hx' => + induction hy using Submodule.span_induction with + | mem y' hy' => + obtain ⟨c, l, hl, rfl⟩ := hx' + obtain ⟨c', l', hl', rfl⟩ := hy' + refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ + · rw [List.map_append, List.sum_append] + omega + · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + | zero => rw [hz₂]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih + | zero => rw [hz₁]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih + +lemma mul_mem_sfilt_right {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) + (hy : y ∈ sfilt b) : x * y ∈ sfilt (a + b) := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u + have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u + have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := + fun r u v => smul_mul_assoc r u v + have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := + fun r u v => mul_smul_comm r u v + induction hx using Submodule.span_induction with + | mem x' hx' => + induction hy using Submodule.span_induction with + | mem y' hy' => + obtain ⟨c, l, hl, rfl⟩ := hx' + obtain ⟨c', l', hl', rfl⟩ := hy' + refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ + · rw [List.map_append, List.sum_append] + omega + · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + | zero => rw [hz₂]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih + | zero => rw [hz₁]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih + +lemma exists_forall_tmul_mem_filt (l : LeptonSinglet.JetAlgebra) : + ∃ d, ∀ c : ℂ ⊗[ℝ] BBoson.JetAlgebra, c ⊗ₜ[ℂ] l ∈ filt d := by + induction l using ExteriorAlgebra.induction with + | algebraMap r => + refine ⟨0, fun c => ?_⟩ + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] + refine Submodule.smul_mem _ _ (Submodule.subset_span ⟨c, [], by simp, ?_⟩) + simp + | ι m => + refine ⟨(LeptonSinglet.JetComponentSpace.basis.repr m).support.sup genDeg, + fun c => ?_⟩ + have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = + (LeptonSinglet.JetComponentSpace.basis.repr m).sum + (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by + conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] + rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] + refine Finset.sum_congr rfl fun g _ => ?_ + rw [map_smul] + rfl + rw [hm, Finsupp.sum, TensorProduct.tmul_sum] + refine Submodule.sum_mem _ fun g hg => ?_ + rw [TensorProduct.tmul_smul] + refine Submodule.smul_mem _ _ (filt_mono (Finset.le_sup hg) + (Submodule.subset_span ⟨c, [g], by simp, ?_⟩)) + simp + | mul x y hx hy => + obtain ⟨dx, hdx⟩ := hx + obtain ⟨dy, hdy⟩ := hy + refine ⟨dx + dy, fun c => ?_⟩ + rw [show c ⊗ₜ[ℂ] (x * y) = (c ⊗ₜ[ℂ] x) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] y) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one]] + exact mul_mem_filt (hdx c) (hdy 1) + | add x y hx hy => + obtain ⟨dx, hdx⟩ := hx + obtain ⟨dy, hdy⟩ := hy + refine ⟨max dx dy, fun c => ?_⟩ + rw [TensorProduct.tmul_add] + exact add_mem (filt_mono (le_max_left _ _) (hdx c)) + (filt_mono (le_max_right _ _) (hdy c)) + +/-- Every element of the QED jet algebra has bounded fermionic derivative + degree. -/ +lemma exists_mem_filt (x : JetAlgebra) : ∃ d, x ∈ filt d := by + induction x using TensorProduct.induction_on with + | zero => exact ⟨0, zero_mem _⟩ + | add a b ha hb => + obtain ⟨d1, h1⟩ := ha + obtain ⟨d2, h2⟩ := hb + exact ⟨max d1 d2, add_mem (filt_mono (le_max_left _ _) h1) + (filt_mono (le_max_right _ _) h2)⟩ + | tmul c l => + obtain ⟨d, hd⟩ := exists_forall_tmul_mem_filt l + exact ⟨d, hd c⟩ + +/-- Strictly-lower-degree odd elements: B-coefficiented single fermionic + generators of derivative degree less than `d`. -/ +noncomputable def oddLow (d : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ + {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (g : LeptonSinglet.JetGenerators), + genDeg g < d ∧ z = c ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator g} + +lemma oddLow_le_sfilt (d : ℕ) : oddLow d ≤ sfilt d := by + refine Submodule.span_le.mpr ?_ + rintro z ⟨c, g, hg, rfl⟩ + refine Submodule.subset_span ⟨c, [g], by simpa using hg, ?_⟩ + simp + +lemma genDeg_shift (μ : Fin 1 ⊕ Fin 3) (g : LeptonSinglet.JetGenerators) : + genDeg (LeptonSinglet.JetGenerators.shift μ g) = genDeg g + 1 := by + cases g <;> simp [genDeg, LeptonSinglet.JetGenerators.shift] + +set_option maxHeartbeats 1000000 in +/-- Multiplication by the gauge field acts on the B-boson coefficient of an odd + element. -/ +lemma dB_mul_tmul (μ : Fin 1 ⊕ Fin 3) (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (y : LeptonSinglet.JetAlgebra) : + ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * (c ⊗ₜ[ℂ] y) = + (((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * c) + ⊗ₜ[ℂ] y := by + have hone : ∀ z : LeptonSinglet.JetAlgebra, 1 * z = z := fun z => one_mul z + rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, + Algebra.TensorProduct.tmul_mul_tmul, hone] + +set_option maxHeartbeats 1000000 in +lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} + (hx : x ∈ oddLow d) : covariantStep μ x ∈ oddLow (d + 1) := by + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨c, g, hg, rfl⟩ := hz + rw [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply, + jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] + refine add_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) + · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ + · rw [dB_mul_tmul] + exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + | zero => rw [map_zero]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv + | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih + +set_option maxHeartbeats 1000000 in +lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} + (hx : x ∈ oddLow d) : covariantStepBar μ x ∈ oddLow (d + 1) := by + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨c, g, hg, rfl⟩ := hz + rw [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply, + jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] + refine sub_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) + · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ + · rw [dB_mul_tmul] + exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + | zero => rw [map_zero]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv + | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih + +set_option maxHeartbeats 4000000 in +/-- The covariant derivative of the lepton is its plain derivative generator up + to strictly-lower-degree odd terms. -/ +lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑l) α) ∈ oddLow l.length := by + induction l with + | nil => + rw [Dψ_nil, show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (.dψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by + rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] + rfl, sub_self] + exact zero_mem _ + | cons μ t ih => + set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑t) α) with hL + have hstep : Dψ (μ :: t) α = covariantStep μ L + covariantStep μ (Dψ t α - L) := by + have h := (covariantStep μ).map_add L (Dψ t α - L) + rw [add_sub_cancel] at h + rw [Dψ_cons, h] + have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) + + ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by + rw [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, + LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, + TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dψ, + show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by + rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] + have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by + rw [hL, dB_mul_tmul] + refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ + simp [genDeg, Multiset.coe_card] + have hmem2 : covariantStep μ (Dψ t α - L) ∈ oddLow (t.length + 1) := + covariantStep_mem_oddLow μ ih + have habel : ∀ A X Y : JetAlgebra, A + X + Y - A = X + Y := fun A X Y => by abel + rw [hstep, hleadEq, habel] + exact add_mem (Submodule.smul_mem _ _ hmem1) hmem2 + +set_option maxHeartbeats 4000000 in +/-- The covariant derivative of the conjugate lepton is its plain derivative + generator up to strictly-lower-degree odd terms. -/ +lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑l) α) ∈ oddLow l.length := by + induction l with + | nil => + rw [Dbarψ_nil, show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (.dbarψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by + rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] + rfl, sub_self] + exact zero_mem _ + | cons μ t ih => + set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑t) α) with hL + have hstep : Dbarψ (μ :: t) α = + covariantStepBar μ L + covariantStepBar μ (Dbarψ t α - L) := by + have h := (covariantStepBar μ).map_add L (Dbarψ t α - L) + rw [add_sub_cancel] at h + rw [Dbarψ_cons, h] + have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) - + ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by + rw [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, + LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, + TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dbarψ, + show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by + rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] + have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by + rw [hL, dB_mul_tmul] + refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ + simp [genDeg, Multiset.coe_card] + have hmem2 : covariantStepBar μ (Dbarψ t α - L) ∈ oddLow (t.length + 1) := + covariantStepBar_mem_oddLow μ ih + have habel : ∀ A X Y : JetAlgebra, A - X + Y - A = Y - X := fun A X Y => by abel + rw [hstep, hleadEq, habel] + exact sub_mem hmem2 (Submodule.smul_mem _ _ hmem1) + +/-- The covariant generator is the plain generator up to strictly-lower-degree + odd terms. -/ +lemma covGenerator_sub_mem_oddLow (g : LeptonSinglet.JetGenerators) : + covGenerator g - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g ∈ oddLow (genDeg g) := by + cases g with + | dψ s α => + have h := Dψ_sub_mem_oddLow (sortList s) α + rw [coe_sortList, length_sortList] at h + exact h + | dbarψ s α => + have h := Dbarψ_sub_mem_oddLow (sortList s) α + rw [coe_sortList, length_sortList] at h + exact h + +lemma covGenerator_mem_filt (g : LeptonSinglet.JetGenerators) : + covGenerator g ∈ filt (genDeg g) := by + have h := sfilt_le_filt _ (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) + have hA : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g ∈ filt (genDeg g) := by + refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ + simp + have h2 := add_mem hA h + rwa [add_sub_cancel] at h2 + +lemma prod_covGenerator_mem_filt (l : List LeptonSinglet.JetGenerators) : + (l.map covGenerator).prod ∈ filt ((l.map genDeg).sum) := by + induction l with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil] + refine Submodule.subset_span ⟨1, [], by simp, ?_⟩ + rw [List.map_nil, List.prod_nil, Algebra.TensorProduct.one_def] + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + exact mul_mem_filt (covGenerator_mem_filt g) ih + +set_option maxHeartbeats 1000000 in +/-- The product of covariant generators is the corresponding product of plain + generators up to strictly-lower-degree terms. -/ +lemma prod_covGenerator_sub_mem_sfilt (l : List LeptonSinglet.JetGenerators) : + (l.map covGenerator).prod - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod ∈ + sfilt ((l.map genDeg).sum) := by + induction l with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil] + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : + JetAlgebra) = 1 from (Algebra.TensorProduct.one_def).symm, sub_self] + exact zero_mem _ + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + have hsub₁ : ∀ a b c : JetAlgebra, (a - b) * c = a * c - b * c := by grind + have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + set A : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g with hA + set Q : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod with hQ + have hAQ : A * Q = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.ofGenerator g * + (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by + rw [hA, hQ, Algebra.TensorProduct.tmul_mul_tmul, mul_one] + have hkey : covGenerator g * (t.map covGenerator).prod - + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.ofGenerator g * + (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = + (covGenerator g - A) * (t.map covGenerator).prod + + A * ((t.map covGenerator).prod - Q) := by + rw [hsub₁, hsub₂, hAQ] + abel + rw [hkey] + refine add_mem ?_ ?_ + · exact mul_mem_sfilt_left (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) + (prod_covGenerator_mem_filt t) + · have hAmem : A ∈ filt (genDeg g) := by + rw [hA] + refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ + simp + exact mul_mem_sfilt_right hAmem ih + +set_option maxHeartbeats 1000000 in +/-- Unitriangularity of the covariant substitution: it is the identity up to + strictly-lower-degree terms. -/ +lemma covSubst_sub_self_mem_sfilt {d : ℕ} {x : JetAlgebra} (hx : x ∈ filt d) : + covSubst x - x ∈ sfilt d := by + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨c, l, hl, rfl⟩ := hz + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p + have hgen : ∀ g : LeptonSinglet.JetGenerators, + covExtHom (LeptonSinglet.JetAlgebra.ofGenerator g) = covGenerator g := by + intro g + rw [show LeptonSinglet.JetAlgebra.ofGenerator g = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis g) from rfl, covExtHom_ι, covMap_basis] + have hlp : ∀ L : List LeptonSinglet.JetAlgebra, + covExtHom L.prod = (L.map covExtHom).prod := by + intro L + induction L with + | nil => exact covExtHom.map_one + | cons a t iht => + have hm : covExtHom (a * t.prod) = covExtHom a * covExtHom t.prod := + map_mul covExtHom a t.prod + rw [List.prod_cons, List.map_cons, List.prod_cons, hm, iht] + have hcs : covSubst (c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = + (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * (l.map covGenerator).prod := by + rw [covSubst_tmul] + congr 1 + rw [hlp, List.map_map, + show (⇑covExtHom ∘ LeptonSinglet.JetAlgebra.ofGenerator) = covGenerator from + funext fun g => hgen g] + have hz2 : c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod = + (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, hone] + have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind + have hc1 : (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) ∈ filt 0 := by + refine Submodule.subset_span ⟨c, [], by simp, ?_⟩ + simp + have hfin := mul_mem_sfilt_right hc1 (prod_covGenerator_sub_mem_sfilt l) + rw [zero_add] at hfin + rw [hcs, hz2, ← hsub₂] + exact sfilt_mono hl hfin + | zero => + rw [map_zero, sub_zero] + exact zero_mem _ + | add u v hu hv ihu ihv => + rw [map_add, show covSubst u + covSubst v - (u + v) = + (covSubst u - u) + (covSubst v - v) from by abel] + exact add_mem ihu ihv + | smul r u hu ih => + rw [map_smul, show r • covSubst u - r • u = r • (covSubst u - u) from + (smul_sub r _ _).symm] + exact Submodule.smul_mem _ _ ih + +lemma eq_zero_of_covSubst_eq_zero {d : ℕ} : + ∀ {x : JetAlgebra}, x ∈ filt d → covSubst x = 0 → x = 0 := by + induction d with + | zero => + intro x hx h0 + have h := covSubst_sub_self_mem_sfilt hx + rw [h0, zero_sub, sfilt_zero, Submodule.mem_bot, neg_eq_zero] at h + exact h + | succ d ih => + intro x hx h0 + have h := covSubst_sub_self_mem_sfilt hx + rw [h0, zero_sub, sfilt_succ] at h + exact ih (neg_mem_iff.mp h) h0 + +/-- The covariant substitution is injective. -/ +lemma covSubst_injective : Function.Injective covSubst := by + intro x y hxy + obtain ⟨d, hd⟩ := exists_mem_filt (x - y) + have h0 : covSubst (x - y) = 0 := by rw [map_sub, hxy, sub_self] + exact sub_eq_zero.mp (eq_zero_of_covSubst_eq_zero hd h0) + +lemma exists_covSubst_eq {d : ℕ} : + ∀ {x : JetAlgebra}, x ∈ filt d → ∃ y, covSubst y = x := by + induction d with + | zero => + intro x hx + have h := covSubst_sub_self_mem_sfilt hx + rw [sfilt_zero, Submodule.mem_bot, sub_eq_zero] at h + exact ⟨x, h⟩ + | succ d ih => + intro x hx + have h := covSubst_sub_self_mem_sfilt hx + rw [sfilt_succ] at h + obtain ⟨y, hy⟩ := ih h + exact ⟨x - y, by rw [map_sub, hy, sub_sub_cancel]⟩ + +/-- The covariant substitution is surjective. -/ +lemma covSubst_surjective : Function.Surjective covSubst := by + intro x + obtain ⟨d, hd⟩ := exists_mem_filt x + exact exists_covSubst_eq hd + +set_option maxHeartbeats 2000000 in +/-- Every gauge invariant of the QED jet algebra lies in the algebra generated by + the field-strength derivatives and the covariant derivatives of the lepton and + its conjugate. + + Proof strategy (the QED analogue of + `BBoson.JetAlgebra.repJetGaugeGroupI_apply_eq_self_iff_mem`): decompose the jet + algebra as a free module over the (complexified) B-boson factor with basis the + exterior monomials in the *covariant* fermionic coordinates `D_s ψ_α`, + `D̄_s ψ̄_α` — a triangular change of variables from the plain coordinates + `∂_s ψ_α`, `∂_s ψ̄_α` by `Dψ_eq_leptonLinearIncl` and its conjugate. On this + decomposition a gauge transformation acts by the B-boson substitution action on + the coefficients and the scalars `u(0)^{±6}` on the covariant monomials + (`repJetGaugeGroupI_Dψ`, `repJetGaugeGroupI_Dbarψ`). Invariance under the + `expUnitary` translation family (which has `u(0) = 1`) forces each coefficient + to be invariant under all Maurer–Cartan translations of the pure-gauge B-boson + coordinates, hence to lie in the (complexified) field-strength subalgebra by + the B-boson translation theorem. -/ +theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq + (x : JetAlgebra) (hx : ∀ U, repJetGaugeGroupI U x = x) : + x ∈ Algebra.adjoin ℂ invariantGenerators := by + classical + obtain ⟨y, rfl⟩ := covSubst_surjective x + have hyU : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), + TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI + (BBoson.JetAlgebra.expUnitary a w hw)) LinearMap.id y = y := by + intro a w hw + refine covSubst_injective ?_ + rw [← repJetGaugeGroupI_covSubst _ (BBoson.JetAlgebra.eval_expUnitary_u1 a w hw), + hx] + set bL := Module.Basis.ofVectorSpace ℂ LeptonSinglet.JetAlgebra with hbL + set e : JetAlgebra ≃ₗ[ℂ] + (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra →₀ + ℂ ⊗[ℝ] BBoson.JetAlgebra) := + (TensorProduct.congr (LinearEquiv.refl ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra)) bL.repr).trans + (TensorProduct.finsuppScalarRight ℂ ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) + (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra)) with hedef + have happly : ∀ (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra)) + (z : JetAlgebra) (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra), + e (TensorProduct.map f LinearMap.id z) T = f (e z T) := by + intro f z T + induction z using TensorProduct.induction_on with + | zero => simp + | add u v hu hv => simp only [map_add, Finsupp.add_apply, hu, hv] + | tmul c l => + rw [hedef] + simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, + LinearEquiv.trans_apply, TensorProduct.congr_tmul, LinearEquiv.refl_apply, + TensorProduct.finsuppScalarRight_apply_tmul_apply, map_smul] + have hcT : ∀ T, e y T ∈ Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] BBoson.JetAlgebra)) := by + intro T + refine BBoson.JetAlgebra.mem_adjoin_of_forall_expUnitary_complex _ fun a w hw => ?_ + have h := happly (BBoson.JetAlgebra.complexRepJetGaugeGroupI + (BBoson.JetAlgebra.expUnitary a w hw)) y T + rw [hyU a w hw] at h + exact h.symm + set S : Set JetAlgebra := (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ + (Set.range fun g : LeptonSinglet.JetGenerators => + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra)) with hS + have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p + have honeL : ∀ l : LeptonSinglet.JetAlgebra, 1 * l = l := fun l => one_mul l + have hone_tmul : ∀ l : LeptonSinglet.JetAlgebra, + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l : JetAlgebra) ∈ Algebra.adjoin ℂ S := by + intro l + induction l using ExteriorAlgebra.induction with + | algebraMap r => + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] + refine Subalgebra.smul_mem _ ?_ _ + rw [← Algebra.TensorProduct.one_def] + exact one_mem _ + | ι m => + have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = + (LeptonSinglet.JetComponentSpace.basis.repr m).sum + (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by + conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] + rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] + refine Finset.sum_congr rfl fun g _ => ?_ + rw [map_smul] + rfl + rw [hm, Finsupp.sum, TensorProduct.tmul_sum] + refine sum_mem fun g _ => ?_ + rw [TensorProduct.tmul_smul] + refine Subalgebra.smul_mem _ (Algebra.subset_adjoin ?_) _ + rw [hS] + exact Set.mem_union_right _ ⟨g, rfl⟩ + | mul u v hu hv => + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (u * v) : JetAlgebra) = + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] u) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] v) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeB]] + exact mul_mem hu hv + | add u v hu hv => + rw [TensorProduct.tmul_add] + exact add_mem hu hv + have hleft : ∀ c ∈ Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] BBoson.JetAlgebra)), + ((c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ + Algebra.adjoin ℂ S := by + intro c hc + induction hc using Algebra.adjoin_induction with + | mem z hz => + obtain ⟨p, rfl⟩ := hz + refine Algebra.subset_adjoin ?_ + rw [hS] + exact Set.mem_union_left _ ⟨p, rfl⟩ + | algebraMap z => + rw [Algebra.algebraMap_eq_smul_one, ← TensorProduct.smul_tmul'] + refine Subalgebra.smul_mem _ ?_ _ + rw [← Algebra.TensorProduct.one_def] + exact one_mem _ + | add u v hu hv ihu ihv => + rw [TensorProduct.add_tmul] + exact add_mem ihu ihv + | mul u v hu hv ihu ihv => + rw [show ((u * v) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : JetAlgebra) = + (u ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + (v ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeL]] + exact mul_mem ihu ihv + have hsymm_single : ∀ (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra) + (c : ℂ ⊗[ℝ] BBoson.JetAlgebra), + e.symm (Finsupp.single T c) = c ⊗ₜ[ℂ] (bL T) := by + intro T c + rw [hedef, LinearEquiv.symm_trans_apply, + TensorProduct.finsuppScalarRight_symm_apply_single, TensorProduct.congr_symm_tmul] + simp only [LinearEquiv.refl_symm, LinearEquiv.refl_apply, + Module.Basis.repr_symm_single_one] + have hdecomp : y = ((e y).support).sum (fun T => (e y T) ⊗ₜ[ℂ] (bL T)) := by + conv_lhs => rw [← e.symm_apply_apply y, ← Finsupp.sum_single (e y)] + rw [Finsupp.sum, map_sum] + exact Finset.sum_congr rfl fun T _ => hsymm_single T _ + have hyMem : y ∈ Algebra.adjoin ℂ S := by + rw [hdecomp] + refine sum_mem fun T _ => ?_ + rw [show ((e y T) ⊗ₜ[ℂ] (bL T) : JetAlgebra) = + ((e y T) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (bL T)) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, honeL]] + exact mul_mem (hleft _ (hcT T)) (hone_tmul _) + have himg : covSubst y ∈ (Algebra.adjoin ℂ S).map covSubst := + Subalgebra.mem_map.mpr ⟨y, hyMem, rfl⟩ + rw [AlgHom.map_adjoin] at himg + refine Algebra.adjoin_le ?_ himg + rintro z ⟨w, hw, rfl⟩ + rcases hw with ⟨p, rfl⟩ | ⟨g, rfl⟩ + · show covSubst (fieldStrengthDeriv p.1 p.2.1 p.2.2) ∈ + Algebra.adjoin ℂ invariantGenerators + rw [show (fieldStrengthDeriv p.1 p.2.1 p.2.2 : JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, covSubst_tmul_one] + exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from + Set.mem_union_left _ (Set.mem_union_left _ ⟨p, rfl⟩)) + · show covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g) ∈ Algebra.adjoin ℂ invariantGenerators + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis g) from rfl, covSubst_one_tmul_ι, + covMap_basis] + cases g with + | dψ s α => + exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from + Set.mem_union_left _ (Set.mem_union_right _ ⟨(sortList s, α), rfl⟩)) + | dbarψ s α => + exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from + Set.mem_union_right _ ⟨(sortList s, α), rfl⟩) + end JetAlgebra end QED diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 7f454c34c..6b2ee69f4 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -333,6 +333,19 @@ lemma JetComponentSpace.basis_dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply'] · rw [Module.Basis.prod_apply_inl_snd] +/-- The basis vector of the jet component space at a general conjugate-singlet + generator: the dual jet algebra basis vector at its multiset of derivative + indices, tensored with the conjugate dual basis of the singlet, in the second + (conjugated) factor. -/ +lemma JetComponentSpace.basis_dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + JetComponentSpace.basis (.dbarψ s α) = + (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.conj.dualBasis α) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dbarψ s α) = Sum.inr (s, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inr_fst] + · rw [Module.Basis.prod_apply_inr_snd, Module.Basis.tensorProduct_apply'] + noncomputable def JetComponentSpace.repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetComponentSpace := (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual).prod @@ -440,6 +453,40 @@ lemma JetComponentSpace.repJetGaugeGroupI_inl' (U : JetGaugeGroupI) rw [JetComponentSpace.repJetGaugeGroupI_inl, TensorProduct.map_tmul] rfl +/-- The jet gauge action preserves the conjugated half of the component space, + acting there by the dual derivative action of the conjugate-contragredient + hypercharge power series on the derivative symbols. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inr (U : JetGaugeGroupI) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.repJetGaugeGroupI U ((0, a ⊗ₜ[ℂ] φ) : JetComponentSpace) = + (0, (DerivAlgebraComplex.jetRingAction + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) a) ⊗ₜ[ℂ] φ) := by + refine Prod.ext ?_ ?_ <;> + simp [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupIConj_apply] + +/-- The jet gauge action on a general element of the conjugated half of the + component space. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inr' (U : JetGaugeGroupI) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.repJetGaugeGroupI U ((0, y) : JetComponentSpace) = + (0, (TensorProduct.map (DerivAlgebraComplex.jetRingAction + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6)) LinearMap.id) y) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((0, a + b) : JetComponentSpace) = (0, a) + (0, b) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.repJetGaugeGroupI_inr, TensorProduct.map_tmul] + rfl + /-! ## The formal total derivative on the component functions @@ -529,6 +576,55 @@ lemma JetComponentSpace.jetDeriv_inl' (μ : Fin 1 ⊕ Fin 3) rw [JetComponentSpace.jetDeriv_inl, TensorProduct.map_tmul] rfl +/-- The total derivative preserves the conjugated half of the component space, + acting there by the shift of dual derivative symbols. -/ +lemma JetComponentSpace.jetDeriv_inr (μ : Fin 1 ⊕ Fin 3) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.jetDeriv μ ((0, a ⊗ₜ[ℂ] φ) : JetComponentSpace) = + (0, (DerivAlgebraComplex.deriv μ a) ⊗ₜ[ℂ] φ) := by + have h : (JetComponentSpace.jetDeriv μ) ∘ₗ (LinearMap.inr ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + (LinearMap.inr ℂ _ _) ∘ₗ (TensorProduct.map (DerivAlgebraComplex.deriv μ) + LinearMap.id) := by + refine (DerivAlgebraComplex.basis.tensorProduct + (LeptonSinglet.basis.conj.dualBasis)).ext fun p => ?_ + obtain ⟨s, α⟩ := p + rw [Module.Basis.tensorProduct_apply'] + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.inr_apply, + TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [show ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + LeptonSinglet.basis.conj.dualBasis α) : JetComponentSpace) = + JetComponentSpace.basis (.dbarψ s α) from + (JetComponentSpace.basis_dbarψ s α).symm, + JetComponentSpace.jetDeriv_basis, JetGenerators.shift_dbarψ, + JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.deriv_basis_multiset] + have h1 := LinearMap.congr_fun h (a ⊗ₜ[ℂ] φ) + simpa using h1 + +/-- The total derivative on a general element of the conjugated half of the + component space. -/ +lemma JetComponentSpace.jetDeriv_inr' (μ : Fin 1 ⊕ Fin 3) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.jetDeriv μ ((0, y) : JetComponentSpace) = + (0, (TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) y) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((0, a + b) : JetComponentSpace) = (0, a) + (0, b) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.jetDeriv_inr, TensorProduct.map_tmul] + rfl + /-! ## The jet algebra diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 741b5bbca..e9ce92cfa 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -602,6 +602,20 @@ lemma pderiv_pow_unitary (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : MvPowerSeries.C ((q : ℕ) : ℂ))) * h1 + (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing))) * hN +/-- The derivative of a hypercharge power of the conjugate `U(1)` jet: + `∂_ν (ū^q) = q i mc_ν ū^q`, the conjugate-contragredient counterpart of + `pderiv_pow_unitary`. -/ +lemma pderiv_pow_unitary_star (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : + pderiv ℂ ν (star (U.2.2 : JetRing) ^ q) = + MvPowerSeries.C ((q : ℂ) * Complex.I) * + (maurerCartanU1 U ν * star (U.2.2 : JetRing) ^ q) := by + have h := pderiv_pow_unitary U⁻¹ ν q + have hcoe : ((U⁻¹.2.2 : unitary JetRing) : JetRing) = + star ((U.2.2 : unitary JetRing) : JetRing) := by + rw [show (U⁻¹.2.2 : unitary JetRing) = (U.2.2)⁻¹ from rfl, ← Unitary.star_eq_inv, + Unitary.coe_star] + rw [hcoe, maurerCartanU1_inv, neg_mul, map_neg] at h + linear_combination h /-! @@ -1528,6 +1542,186 @@ lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : rw [h2, h1] exact Algebra.subset_adjoin ⟨((s.erase p, p), ν), Set.mem_univ _, rfl⟩ +/-- The value of a translation gauge jet at the base point is one: the + exponential series has constant coefficient `1`. -/ +lemma constantCoeff_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + MvPowerSeries.constantCoeff + (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = 1 := by + classical + have hex : ∃ ρ, w ρ ≠ 0 := (Finsupp.ne_iff.mp hw).imp fun _ h => by simpa using h + have h₀ : ∃ n : ℕ, (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = n • w := ⟨0, by simp⟩ + show (if h : ∃ n : ℕ, (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = n • w then + (-(a : ℂ) * Complex.I) ^ h.choose / (h.choose.factorial : ℂ) else 0) = 1 + rw [dif_pos h₀] + obtain ⟨ρ, hρ⟩ := hex + have hch : h₀.choose = 0 := by + by_contra hn + have h := DFunLike.congr_fun h₀.choose_spec ρ + simp only [Finsupp.coe_zero, Pi.zero_apply, Finsupp.smul_apply, smul_eq_mul] at h + exact absurd h.symm (Nat.mul_ne_zero hn hρ) + rw [hch] + simp + +/-- The value of a translation gauge jet at the base point is the identity of the + gauge group. -/ +lemma eval_expUnitary_u1 (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + (expUnitary a w hw).eval.2.2 = 1 := + Subtype.ext (constantCoeff_expUnitary a w hw) + +/-- The invariance direction of `repJetGaugeGroupI_apply_eq_self_iff_mem` from + invariance under the `expUnitary` translation family alone: every element fixed + by all the translation gauge transformations lies in the field-strength + subalgebra. -/ +lemma mem_adjoin_of_forall_expUnitary (V : JetAlgebra) + (hV : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), + repJetGaugeGroupI (expUnitary a w hw) V = V) : + V ∈ Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by + have htrans : ∀ (g₀ : JetGenerators) (r : ℝ), + MvPolynomial.aeval (fun g => MvPolynomial.X g + + MvPolynomial.C (if JetGenerators.canon g = JetGenerators.canon g₀ then r + else (0 : ℝ))) + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) = + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V := by + intro g₀ r + obtain ⟨s₀, ν₀⟩ := g₀ + have hne : Multiset.toFinsupp (s₀ + {ν₀}) ≠ 0 := by + intro h + have h0 : s₀ + {ν₀} = 0 := + Multiset.toFinsupp.injective (by rw [h, Multiset.toFinsupp_zero]) + simp at h0 + have hconj := equivMvPolynomial_repJetGaugeGroupI + (expUnitary (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) + (Multiset.toFinsupp (s₀ + {ν₀})) hne) V + rw [hV _ _ _] at hconj + have hfun : (fun g => MvPolynomial.X g + MvPolynomial.C + (mcPairing (expUnitary + (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) + (Multiset.toFinsupp (s₀ + {ν₀})) hne) + (JetComponentSpace.basis g))) = + fun g => MvPolynomial.X g + MvPolynomial.C + (if JetGenerators.canon g = JetGenerators.canon (JetGenerators.dB s₀ ν₀) + then r else (0 : ℝ)) := by + funext g + obtain ⟨s, ν⟩ := g + rw [mcPairing_expUnitary (s₀ + {ν₀}) hne r s ν] + have hiff : (s + {ν} = s₀ + {ν₀}) ↔ + (JetGenerators.canon (JetGenerators.dB s ν) = + JetGenerators.canon (JetGenerators.dB s₀ ν₀)) := by + rw [JetGenerators.canon_eq_canon_iff] + simp + rw [if_congr hiff rfl rfl] + rw [hfun] at hconj + exact hconj.symm + have hmem := MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq + JetGenerators.canon JetGenerators.canon_canon + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) htrans + have hVmem : V ∈ (Algebra.adjoin ℝ (Set.range fun g => + (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g) : + MvPolynomial JetGenerators ℝ))).map + (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom := + Subalgebra.mem_map.mpr ⟨_, hmem, AlgEquiv.symm_apply_apply _ _⟩ + rw [AlgHom.map_adjoin] at hVmem + refine Algebra.adjoin_le ?_ hVmem + rintro x ⟨_, ⟨g, rfl⟩, rfl⟩ + have hsymm : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom + (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = + ofGenerator g - ofGenerator (JetGenerators.canon g) := by + show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm + (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = _ + rw [map_sub, SymmetricAlgebra.equivMvPolynomial_symm_X, + SymmetricAlgebra.equivMvPolynomial_symm_X] + rfl + rw [hsymm] + exact ofGenerator_sub_ofGenerator_canon_mem g + +/-- The coordinate retractions of the complexified jet algebra along the real + basis `{1, I}` of `ℂ`. -/ +private noncomputable def complexCoordAux (i : Fin 2) : + ℂ ⊗[ℝ] JetAlgebra →ₗ[ℝ] JetAlgebra := + TensorProduct.lift ((LinearMap.lsmul ℝ JetAlgebra).comp (Complex.basisOneI.coord i)) + +private lemma complexCoordAux_tmul (i : Fin 2) (z : ℂ) (b : JetAlgebra) : + complexCoordAux i (z ⊗ₜ[ℝ] b) = Complex.basisOneI.repr z i • b := by + simp [complexCoordAux, Module.Basis.coord_apply] + +set_option maxHeartbeats 1000000 in +/-- The complexified invariance direction: an element of the complexified B-boson + jet algebra fixed by the complexified action of the `expUnitary` translation + family lies in the complexified field-strength subalgebra. -/ +lemma mem_adjoin_of_forall_expUnitary_complex (x : ℂ ⊗[ℝ] JetAlgebra) + (hx : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), + complexRepJetGaugeGroupI (expUnitary a w hw) x = x) : + x ∈ Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] JetAlgebra)) := by + classical + have hrtmul : ∀ (i : Fin 2) (z : ℂ) (b : JetAlgebra), + complexCoordAux i (z ⊗ₜ[ℝ] b) = Complex.basisOneI.repr z i • b := + complexCoordAux_tmul + have h1 : ∀ y : ℂ ⊗[ℝ] JetAlgebra, + y = (1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 0 y + Complex.I ⊗ₜ[ℝ] complexCoordAux 1 y := by + intro y + induction y using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + rw [map_add, map_add, TensorProduct.tmul_add, TensorProduct.tmul_add] + calc a + b = ((1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 0 a + Complex.I ⊗ₜ[ℝ] complexCoordAux 1 a) + + ((1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 0 b + Complex.I ⊗ₜ[ℝ] complexCoordAux 1 b) := by rw [← ha, ← hb] + _ = _ := by abel + | tmul z b => + rw [hrtmul, hrtmul, TensorProduct.tmul_smul, TensorProduct.tmul_smul, + TensorProduct.smul_tmul', TensorProduct.smul_tmul', ← TensorProduct.add_tmul] + congr 1 + have hz := Complex.re_add_im z + simp only [Complex.coe_basisOneI_repr, Matrix.cons_val_zero, Matrix.cons_val_one] + rw [show z.re • (1 : ℂ) = (z.re : ℂ) from by simp [Complex.real_smul], + show z.im • Complex.I = (z.im : ℂ) * Complex.I from by rw [Complex.real_smul]] + exact hz.symm + have h2 : ∀ (U : JetGaugeGroupI) (i : Fin 2) (y : ℂ ⊗[ℝ] JetAlgebra), + complexCoordAux i (complexRepJetGaugeGroupI U y) = + repJetGaugeGroupI U (complexCoordAux i y) := by + intro U i y + induction y using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul z b => + simp only [complexRepJetGaugeGroupI_tmul] + rw [hrtmul, hrtmul] + exact ((repJetGaugeGroupI U).map_smul _ _).symm + have hmem : ∀ i : Fin 2, complexCoordAux i x ∈ Algebra.adjoin ℝ + (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by + intro i + refine mem_adjoin_of_forall_expUnitary (complexCoordAux i x) fun a w hw => ?_ + rw [← h2, hx a w hw] + have hinc : ∀ b ∈ Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ), + ((1 : ℂ) ⊗ₜ[ℝ] b : ℂ ⊗[ℝ] JetAlgebra) ∈ Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] JetAlgebra)) := by + intro b hb + induction hb using Algebra.adjoin_induction with + | mem y hy => + obtain ⟨⟨⟨s, μ⟩, ν⟩, -, rfl⟩ := hy + exact Algebra.subset_adjoin ⟨(s, μ, ν), rfl⟩ + | algebraMap t => + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, + ← IsScalarTower.algebraMap_smul ℂ t + ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra) : ℂ ⊗[ℝ] JetAlgebra)] + exact Subalgebra.smul_mem _ (one_mem _) _ + | add y z hy hz ihy ihz => + rw [TensorProduct.tmul_add] + exact add_mem ihy ihz + | mul y z hy hz ihy ihz => + rw [show ((1 : ℂ) ⊗ₜ[ℝ] (y * z) : ℂ ⊗[ℝ] JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] y) * ((1 : ℂ) ⊗ₜ[ℝ] z) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul]] + exact mul_mem ihy ihz + rw [h1 x] + refine add_mem (hinc _ (hmem 0)) ?_ + rw [show (Complex.I ⊗ₜ[ℝ] complexCoordAux 1 x : ℂ ⊗[ℝ] JetAlgebra) = + Complex.I • ((1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 1 x) from by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one]] + exact Subalgebra.smul_mem _ (hinc _ (hmem 1)) _ + /-- An EFT lagrangian with field content consisting only of a `B` bosons is invariant under the full gauge group if and only if it can be written in terms of the field strength and derivatives thereof. -/ @@ -1536,63 +1730,7 @@ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by constructor · intro hV - have htrans : ∀ (g₀ : JetGenerators) (r : ℝ), - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (if JetGenerators.canon g = JetGenerators.canon g₀ then r - else (0 : ℝ))) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) = - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V := by - intro g₀ r - obtain ⟨s₀, ν₀⟩ := g₀ - have hne : Multiset.toFinsupp (s₀ + {ν₀}) ≠ 0 := by - intro h - have h0 : s₀ + {ν₀} = 0 := - Multiset.toFinsupp.injective (by rw [h, Multiset.toFinsupp_zero]) - simp at h0 - have hconj := equivMvPolynomial_repJetGaugeGroupI - (expUnitary (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) - (Multiset.toFinsupp (s₀ + {ν₀})) hne) V - rw [hV _] at hconj - have hfun : (fun g => MvPolynomial.X g + MvPolynomial.C - (mcPairing (expUnitary - (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) - (Multiset.toFinsupp (s₀ + {ν₀})) hne) - (JetComponentSpace.basis g))) = - fun g => MvPolynomial.X g + MvPolynomial.C - (if JetGenerators.canon g = JetGenerators.canon (JetGenerators.dB s₀ ν₀) - then r else (0 : ℝ)) := by - funext g - obtain ⟨s, ν⟩ := g - rw [mcPairing_expUnitary (s₀ + {ν₀}) hne r s ν] - have hiff : (s + {ν} = s₀ + {ν₀}) ↔ - (JetGenerators.canon (JetGenerators.dB s ν) = - JetGenerators.canon (JetGenerators.dB s₀ ν₀)) := by - rw [JetGenerators.canon_eq_canon_iff] - simp - rw [if_congr hiff rfl rfl] - rw [hfun] at hconj - exact hconj.symm - have hmem := MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq - JetGenerators.canon JetGenerators.canon_canon - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) htrans - have hVmem : V ∈ (Algebra.adjoin ℝ (Set.range fun g => - (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g) : - MvPolynomial JetGenerators ℝ))).map - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom := - Subalgebra.mem_map.mpr ⟨_, hmem, AlgEquiv.symm_apply_apply _ _⟩ - rw [AlgHom.map_adjoin] at hVmem - refine Algebra.adjoin_le ?_ hVmem - rintro x ⟨_, ⟨g, rfl⟩, rfl⟩ - have hsymm : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom - (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = - ofGenerator g - ofGenerator (JetGenerators.canon g) := by - show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm - (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = _ - rw [map_sub, SymmetricAlgebra.equivMvPolynomial_symm_X, - SymmetricAlgebra.equivMvPolynomial_symm_X] - rfl - rw [hsymm] - exact ofGenerator_sub_ofGenerator_canon_mem g + exact mem_adjoin_of_forall_expUnitary V fun a w hw => hV _ · intro hVmem U induction hVmem using Algebra.adjoin_induction with | mem x hx => diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index 4b3b89295..f7f07ed32 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -157,6 +157,14 @@ lemma maurerCartanSU2_mul (g1 g2 : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : congr 1 rw [mul_assoc, ← mul_assoc (V.map (pderiv ℂ ν)), ← mul_assoc U] +/-- The `U(1)` Maurer–Cartan form of the inverse jet is the negative: the + abelian cocycle identity applied to `g g⁻¹ = 1`. -/ +lemma maurerCartanU1_inv (g : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + maurerCartanU1 g⁻¹ ν = -maurerCartanU1 g ν := by + have h := maurerCartanU1_mul g g⁻¹ ν + rw [mul_inv_cancel, maurerCartanU1_one] at h + exact eq_neg_of_add_eq_zero_right h.symm + /-- The Maurer–Cartan form vanishes on jets of constant gauge transformations: constants have vanishing derivative. -/ @[simp] From f8564e68b64feacc9eb5e5bb20bdec83609abbe9 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 5 Aug 2026 12:00:52 +0100 Subject: [PATCH 094/254] feat: Statement of final theorem for QED Co-Authored-By: Claude --- Physlib/Particles/QED/JetAlgebra.lean | 73 ++++++ Physlib/Particles/QED/MassDim.lean | 124 +++++++++ .../StandardModel/Fermions/LeptonSinglet.lean | 238 +++++++++++++++++- .../StandardModel/GaugeBosons/BBoson.lean | 103 ++++++++ Physlib/Relativity/DerivAlgebra.lean | 91 +++++++ 5 files changed, 624 insertions(+), 5 deletions(-) create mode 100644 Physlib/Particles/QED/MassDim.lean diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index 204dce311..0b2d77c92 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -89,6 +89,29 @@ lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgeb /-! +### B.1. The action of the Lorentz group + +-/ +open Matrix MatrixGroups + +noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetAlgebra := + BBoson.JetAlgebra.complexRepLorentzGroup.tprod LeptonSinglet.JetAlgebra.repLorentzGroup + +/-! + +### B.2. The invarance condition + +-/ + +def IsInvariant (x : JetAlgebra) : Prop := + (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) + ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) + +noncomputable def InvariantSubmodule : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x | IsInvariant x} + +/-! + ## Jet derivatives The formal total spacetime derivative `∂_μ` on the QED jet algebra: the Leibniz @@ -1925,6 +1948,56 @@ theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from Set.mem_union_right _ ⟨(sortList s, α), rfl⟩) +set_option maxHeartbeats 1000000 in +/-- Characterization of the invariants of the QED jet algebra: an element is + invariant under the jet gauge group and the Lorentz group precisely when it + lies in the algebra generated by the field-strength derivatives and the + covariant derivatives, is invariant under the constant gauge transformations, + and is Lorentz invariant. The forward direction is the main theorem above; the + backward direction holds because on the covariant generators a jet of gauge + transformations acts only through its value at the base point. -/ +lemma isInvariant_iff_mem_adjoin_invariantGenerators (x : JetAlgebra) : + IsInvariant x ↔ x ∈ Algebra.adjoin ℂ invariantGenerators ∧ + (∀ g : GaugeGroupI, repJetGaugeGroupI (.ofConstant g) x = x) + ∧ (∀ Λ : SL(2, ℂ), repLorentzGroup Λ x = x) := by + constructor + · intro h + exact ⟨mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq x h.1, + fun g => h.1 _, h.2⟩ + · rintro ⟨hmem, hconst, hlor⟩ + refine ⟨fun U => ?_, hlor⟩ + suffices hkey : repJetGaugeGroupI U x = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) x by + rw [hkey] + exact hconst U.eval + clear hconst hlor + induction hmem using Algebra.adjoin_induction with + | mem z hz => + rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · show repJetGaugeGroupI U (fieldStrengthDeriv p.1 p.2.1 p.2.2) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) + (fieldStrengthDeriv p.1 p.2.1 p.2.2) + rw [repJetGaugeGroupI_fieldStrengthDeriv, repJetGaugeGroupI_fieldStrengthDeriv] + · show repJetGaugeGroupI U (Dψ p.1 p.2) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dψ p.1 p.2) + rw [repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant] + · show repJetGaugeGroupI U (Dbarψ p.1 p.2) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dbarψ p.1 p.2) + rw [repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, + JetGaugeGroupI.eval_ofConstant] + | algebraMap r => + rw [repJetGaugeGroupI_eq_repAlgHom, repJetGaugeGroupI_eq_repAlgHom, + AlgHom.commutes, AlgHom.commutes] + | add u v hu hv ihu ihv => + rw [map_add, map_add, ihu, ihv] + | mul u v hu hv ihu ihv => + have hmul : ∀ V : JetGaugeGroupI, repJetGaugeGroupI V (u * v) = + repJetGaugeGroupI V u * repJetGaugeGroupI V v := fun V => + (repJetGaugeGroupI_eq_repAlgHom V (u * v)).trans + ((map_mul (repAlgHom V) u v).trans + (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom V u).symm + (repJetGaugeGroupI_eq_repAlgHom V v).symm)) + exact (hmul U).trans ((congrArg₂ (· * ·) ihu ihv).trans (hmul _).symm) end JetAlgebra end QED diff --git a/Physlib/Particles/QED/MassDim.lean b/Physlib/Particles/QED/MassDim.lean new file mode 100644 index 000000000..22c219664 --- /dev/null +++ b/Physlib/Particles/QED/MassDim.lean @@ -0,0 +1,124 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra +public import Physlib.Relativity.MinkowskiMatrix +public import Physlib.Relativity.PauliMatrices.Basic +/-! +# Mass dimension on the QED jet algebra + +-/ + +@[expose] public section + +namespace QED +open TensorProduct StandardModel + +/-- We define the mass weight of a term as two times its mass dimnesion. -/ +def MassWeight : JetGenerators → ℕ + | JetGenerators.dB s _ => 2 * (1 + s.card) + | JetGenerators.dψ s _ => 3 + 2 * s.card + | JetGenerators.dbarψ s _ => 3 + 2 * s.card + +namespace JetAlgebra + +/-- The mass-dimension scaling on the QED jet algebra: the algebra map + multiplying each generator by `c ^ w`, where `w` is twice its mass dimension. + It is the tensor product of the scalings on the B-boson and charged-lepton + jet algebras. -/ +noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (BBoson.JetAlgebra.massWeightScale c) + (LeptonSinglet.JetAlgebra.massWeightScale c) + +/-- Each generator scales by `c` to the power of its mass weight. -/ +@[simp] +lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : + massWeightScale c [j]ₐ = c ^ MassWeight j • [j]ₐ := by + cases j with + | dB s μ => + simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, map_one, + BBoson.JetAlgebra.massWeightScale_tmul_ofGenerator, ← TensorProduct.smul_tmul'] + rfl + | dψ s α => + simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, + ← Algebra.TensorProduct.one_def, map_one, + LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] + rfl + | dbarψ s α => + simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, + ← Algebra.TensorProduct.one_def, map_one, + LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] + rfl + + +noncomputable def MassDimSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ { x | ∀ c : ℂ, massWeightScale c x = c ^ n • x } + +noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ n • x} + +noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + MassWeightLESubmodule n ⊓ InvariantSubmodule + +/-! + +## The renormalizable invariants + +The gauge- and Lorentz-invariant elements of mass dimension at most four (mass +weight at most eight). Besides the constants these are kinetic terms alone: the +Maxwell term `F_{μν} F^{μν}`, the topological theta term +`ε^{μνρσ} F_{μν} F_{ρσ}`, and the two fermion kinetic terms +`i ψ̄ σ^μ (D_μ ψ)` and `-i (D̄_μ ψ̄) σ^μ ψ` (equal up to a total derivative). +No mass term exists: `ψψ` and `ψ̄ψ̄` carry hypercharge `±12`, and `ψ̄ψ` is not a +Lorentz scalar for a single Weyl fermion. All other candidate weights `≤ 8` are +excluded by charge balance or by the absence of a Lorentz invariant: +`∂^μ ∂^ν F_{μν} = 0` and `η^{μν} F_{μν} = 0` identically. + +-/ + +open scoped minkowskiMatrix PauliMatrix + +/-- The Maxwell kinetic term `F_{μν} F^{μν}`: the field-strength square with + both indices raised by the (diagonal) Minkowski metric. Mass weight eight. -/ +noncomputable def maxwellTerm : JetAlgebra := + ∑ μ, ∑ ν, ((η μ μ * η ν ν : ℝ) : ℂ) • + (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) + +/-- The topological theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, written as a sum over + the permutations of the four spacetime indices weighted by their signs. Mass + weight eight. -/ +noncomputable def thetaTerm : JetAlgebra := + ∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • + (fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) * + fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3))) + +/-- The fermion kinetic term `i ψ̄_α (σ^μ)_{α β} (D_μ ψ)_β` of the right-handed + charged-lepton singlet, with the covariant derivative on the lepton. Mass + weight eight. -/ +noncomputable def fermionKineticTerm : JetAlgebra := + Complex.I • ∑ μ, ∑ α, ∑ β, σ μ α β • (Dbarψ [] α * Dψ [μ] β) + +/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ^μ)_{α β} ψ_β`, with the + covariant derivative on the conjugate lepton. Mass weight eight. -/ +noncomputable def fermionKineticTermBar : JetAlgebra := + (-Complex.I) • ∑ μ, ∑ α, ∑ β, σ μ α β • (Dbarψ [μ] α * Dψ [] β) + +/-- The invariants of the QED jet algebra of mass dimension at most four: the + constants and the four kinetic terms. These span + `InvariantMassWeightSubmodule 8`, the renormalizable QED Lagrangian densities. -/ +def massDimFourInvariants : Set JetAlgebra := + {1, maxwellTerm, thetaTerm, fermionKineticTerm, fermionKineticTermBar} + +lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : + InvariantMassWeightSubmodule 8 = Submodule.span ℂ massDimFourInvariants := by + sorry + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 6b2ee69f4..13b03e12e 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -279,6 +279,10 @@ def JetGenerators.equiv : JetGenerators ≃ intro x cases x <;> rfl +def JetGenerators.massWeight : JetGenerators → ℕ + | JetGenerators.dψ s _ => 3 + 2 * s.card + | JetGenerators.dbarψ s _ => 3 + 2 * s.card + abbrev JetComponentSpace := (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] Module.Dual ℂ LeptonSinglet) × @@ -529,6 +533,136 @@ lemma JetComponentSpace.jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators JetComponentSpace.basis (JetGenerators.shift μ j) := by rw [JetComponentSpace.jetDeriv, Module.Basis.constr_basis] +/-- The mass-dimension scaling on the space of component functions of the + charged-lepton singlet: the diagonal map multiplying each component function + `∂_s ψ_α` by `c ^ w`, where `w` is twice its mass dimension. -/ +noncomputable def JetComponentSpace.massWeightScale (c : ℂ) : + JetComponentSpace →ₗ[ℂ] JetComponentSpace := + JetComponentSpace.basis.constr ℂ fun j => + c ^ j.massWeight • JetComponentSpace.basis j + +@[simp] +lemma JetComponentSpace.massWeightScale_basis (c : ℂ) (j : JetGenerators) : + JetComponentSpace.massWeightScale c (JetComponentSpace.basis j) = + c ^ j.massWeight • JetComponentSpace.basis j := by + rw [JetComponentSpace.massWeightScale, Module.Basis.constr_basis] + +/-- The mass-dimension scaling commutes with the action of jets of constant + gauge transformations on the component space: the constant action is diagonal + on the generator basis, with no derivative mixing. For a non-constant jet the + higher Taylor coefficients of `u ^ 6` strictly lower the derivative degree, so + the action does not commute with the scaling. -/ +lemma JetComponentSpace.massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) : + JetComponentSpace.massWeightScale c ∘ₗ + JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ∘ₗ + JetComponentSpace.massWeightScale c := by + have hu : ((((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing)) : JetRing) = + MvPowerSeries.C ((g.2.2 : ℂ)) := rfl + refine JetComponentSpace.basis.ext fun j => ?_ + cases j with + | dψ s α => + have hrep : JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (JetComponentSpace.basis (.dψ s α)) = + ((g.2.2 : ℂ) ^ 6) • JetComponentSpace.basis (.dψ s α) := by + simp only [JetComponentSpace.basis_dψ] + rw [JetComponentSpace.repJetGaugeGroupI_inl, hu, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp [TensorProduct.smul_tmul', Prod.smul_mk] + simp only [LinearMap.coe_comp, Function.comp_apply, hrep, map_smul, + JetComponentSpace.massWeightScale_basis] + exact smul_comm _ _ _ + | dbarψ s α => + have hrep : JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (JetComponentSpace.basis (.dbarψ s α)) = + ((star (g.2.2 : ℂ)) ^ 6) • JetComponentSpace.basis (.dbarψ s α) := by + simp only [JetComponentSpace.basis_dbarψ] + rw [JetComponentSpace.repJetGaugeGroupI_inr, hu, JetRing.star_C, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp [TensorProduct.smul_tmul', Prod.smul_mk] + simp only [LinearMap.coe_comp, Function.comp_apply, hrep, map_smul, + JetComponentSpace.massWeightScale_basis] + exact smul_comm _ _ _ + +/-- The mass-dimension scaling commutes with the Lorentz action on the component + space: the Lorentz action mixes derivative symbols and spinor components only + within a fixed derivative degree, on which the scaling is a scalar. -/ +lemma JetComponentSpace.massWeightScale_repLorentzGroup (c : ℂ) (g : SL(2,ℂ)) : + JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.repLorentzGroup g = + JetComponentSpace.repLorentzGroup g ∘ₗ JetComponentSpace.massWeightScale c := by + have hfact : JetComponentSpace.massWeightScale c = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id)) + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id)) := by + refine JetComponentSpace.basis.ext fun j => ?_ + cases j with + | dψ s α => + have hscal : (c : ℂ) ^ (JetGenerators.dψ s α).massWeight = + c ^ 3 * (c ^ 2) ^ s.card := by + show c ^ (3 + 2 * s.card) = _ + ring + rw [JetComponentSpace.massWeightScale_basis, hscal] + simp only [JetComponentSpace.basis_dψ, LinearMap.prodMap_apply, map_zero, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, LinearMap.smul_apply, + LinearMap.id_apply, DerivAlgebraComplex.gradeScale_basis, + TensorProduct.tmul_smul, TensorProduct.smul_tmul', Prod.smul_mk, smul_smul, + smul_zero] + | dbarψ s α => + have hscal : (c : ℂ) ^ (JetGenerators.dbarψ s α).massWeight = + c ^ 3 * (c ^ 2) ^ s.card := by + show c ^ (3 + 2 * s.card) = _ + ring + rw [JetComponentSpace.massWeightScale_basis, hscal] + simp only [JetComponentSpace.basis_dbarψ, LinearMap.prodMap_apply, map_zero, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, LinearMap.smul_apply, + LinearMap.id_apply, DerivAlgebraComplex.gradeScale_basis, + TensorProduct.tmul_smul, TensorProduct.smul_tmul', Prod.smul_mk, smul_smul, + smul_zero] + have hA : (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap ∘ₗ + DerivAlgebraComplex.repLorentzGroup g = + (DerivAlgebraComplex.repLorentzGroup g : + DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex) ∘ₗ + (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap := + LinearMap.ext fun a => DerivAlgebraComplex.gradeScale_repLorentzGroup (c ^ 2) g a + have hB1 : (c ^ 3 • (LinearMap.id : Module.End ℂ (Module.Dual ℂ LeptonSinglet))) ∘ₗ + LeptonSinglet.repLorentzGroup.dual g = + LeptonSinglet.repLorentzGroup.dual g ∘ₗ (c ^ 3 • LinearMap.id) := by + rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, LinearMap.comp_id] + have hB2 : (c ^ 3 • (LinearMap.id : + Module.End ℂ (Module.Dual ℂ (ConjModule LeptonSinglet)))) ∘ₗ + LeptonSinglet.repLorentzGroup.conj.dual g = + LeptonSinglet.repLorentzGroup.conj.dual g ∘ₗ (c ^ 3 • LinearMap.id) := by + rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, LinearMap.comp_id] + have hcomp1 : TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.dual g) = + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.dual g) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) := by + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB1] + have hcomp2 : TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.conj.dual g) = + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.conj.dual g) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) := by + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB2] + rw [hfact, show JetComponentSpace.repLorentzGroup g = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.dual g)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.conj.dual g)) from rfl] + refine LinearMap.ext fun x => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.prodMap_apply] + exact Prod.ext (DFunLike.congr_fun hcomp1 x.1) (DFunLike.congr_fun hcomp2 x.2) + /-- The total derivative preserves the unconjugated half of the component space, acting there by the shift of dual derivative symbols. -/ lemma JetComponentSpace.jetDeriv_inl (μ : Fin 1 ⊕ Fin 3) @@ -627,7 +761,7 @@ lemma JetComponentSpace.jetDeriv_inr' (μ : Fin 1 ⊕ Fin 3) /-! -## The jet algebra +## A. The jet algebra -/ @@ -636,6 +770,23 @@ abbrev JetAlgebra : Type := ExteriorAlgebra ℂ JetComponentSpace namespace JetAlgebra + +/-! + +### A.1. The generators of the jet algebra + +-/ + +noncomputable def ofGenerator (j : JetGenerators) : JetAlgebra := + ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) + + +/-! + +### A.2. The action of the jet gauge group. + +-/ + /-- The action of the (jet) gauge group on the jet algebra of the lepton singlets. -/ noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra where toFun g := (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g)).toLinearMap @@ -646,9 +797,6 @@ noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgeb simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, AlgHom.comp_toLinearMap] -noncomputable def ofGenerator (j : JetGenerators) : JetAlgebra := - ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) - lemma repJetGaugeGroupI_apply (g : JetGaugeGroupI) (x : JetAlgebra) : repJetGaugeGroupI g x = ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g) x := rfl @@ -739,7 +887,33 @@ lemma repJetGaugeGroupI_ofGenerator_ψ (g : JetGaugeGroupI) /-! -## The formal total derivative on the jet algebra +### A.3. The action of the Lorentz group + +-/ + +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) JetAlgebra where + toFun g := (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' g1 g2 := by + simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repLorentzGroup_apply (g : SL(2,ℂ)) (x : JetAlgebra) : + repLorentzGroup g x = + ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g) x := rfl + +lemma repLorentzGroup_apply_one (g : SL(2,ℂ)) : + repLorentzGroup g 1 = 1 := by simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_mul (g : SL(2,ℂ)) (x y : JetAlgebra) : + repLorentzGroup g (x * y) = repLorentzGroup g x * repLorentzGroup g y := by + simp [repLorentzGroup_apply] + +/-! + +### A.4. The formal total derivative on the jet algebra The formal total spacetime derivative extends from the component functions to the whole jet algebra as an even derivation: @@ -843,6 +1017,60 @@ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : rw [jetDerivHom_fst, jetDerivHom_fst] at h exact h.trans (add_comm _ _) +/-! + +### A.5. The mass-weight scaling on the jet algebra + +-/ + +/-- The mass-dimension scaling on the jet algebra of the charged-lepton singlet: + the (linear map underlying the) algebra map multiplying each generator by + `c ^ w`, where `w` is twice its mass dimension. -/ +noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra := + (ExteriorAlgebra.map (JetComponentSpace.massWeightScale c)) + +lemma massWeightScale_apply (c : ℂ) (x : JetAlgebra) : + massWeightScale c x = + ExteriorAlgebra.map (JetComponentSpace.massWeightScale c) x := rfl + +/-- Each generator scales by `c` to the power of its mass weight. -/ +@[simp] +lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : + massWeightScale c (ofGenerator j) = c ^ j.massWeight • ofGenerator j := by + rw [ofGenerator, massWeightScale_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.massWeightScale_basis, map_smul] + +/-- The mass-dimension scaling commutes with the gauge action of jets of + constant gauge transformations. This fails for a general jet: the gauge action + sends `∂ψ` to `u(0)⁶ ∂ψ + (∂u⁶)(0) ψ + …`, mixing derivative degrees + downwards, while the scaling weights each degree differently, so the two + compositions already differ on first-derivative generators. -/ +lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) : + massWeightScale c ∘ₗ JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ∘ₗ massWeightScale c := by + have h : (massWeightScale c).comp + (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI + (JetGaugeGroupI.ofConstant g))) = + (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI + (JetGaugeGroupI.ofConstant g))).comp (massWeightScale c) := by + rw [massWeightScale, ExteriorAlgebra.map_comp_map, ExteriorAlgebra.map_comp_map, + JetComponentSpace.massWeightScale_repJetGaugeGroupI_ofConstant] + have h2 := congrArg AlgHom.toLinearMap h + rw [AlgHom.comp_toLinearMap, AlgHom.comp_toLinearMap] at h2 + exact h2 + +lemma massWeightScale_repLorentzGroup (c : ℂ) (g : SL(2,ℂ)) : + massWeightScale c ∘ₗ JetAlgebra.repLorentzGroup g = + JetAlgebra.repLorentzGroup g ∘ₗ massWeightScale c := by + have h : (massWeightScale c).comp + (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)) = + (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)).comp + (massWeightScale c) := by + rw [massWeightScale, ExteriorAlgebra.map_comp_map, ExteriorAlgebra.map_comp_map, + JetComponentSpace.massWeightScale_repLorentzGroup] + have h2 := congrArg AlgHom.toLinearMap h + rw [AlgHom.comp_toLinearMap, AlgHom.comp_toLinearMap] at h2 + exact h2 end JetAlgebra end LeptonSinglet diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index e9ce92cfa..80be60dd2 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -224,6 +224,9 @@ inductive JetGenerators where | dB (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3): JetGenerators deriving DecidableEq +def JetGenerators.massWeight : JetGenerators → ℕ + | JetGenerators.dB s _ => 2 * (1 + s.card) + def JetGenerators.equiv : JetGenerators ≃ Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) where toFun | JetGenerators.dB s μ => (s, μ) @@ -343,6 +346,29 @@ abbrev JetComponentSpace := noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponentSpace := (LagrangianTheory.dualRealJetAlgebraBasis.tensorProduct BBoson.basis.dualBasis).reindex JetGenerators.equiv.symm + +/-- The mass-dimension scaling on the space of component functions of the + B boson: the diagonal map multiplying each component function `∂_s B_μ` by + `c ^ w`, where `w` is twice its mass dimension. -/ +noncomputable def JetComponentSpace.massWeightScale (c : ℝ) : + JetComponentSpace →ₗ[ℝ] JetComponentSpace := + JetComponentSpace.basis.constr ℝ fun j => + c ^ j.massWeight • JetComponentSpace.basis j + +@[simp] +lemma JetComponentSpace.massWeightScale_basis (c : ℝ) (j : JetGenerators) : + JetComponentSpace.massWeightScale c (JetComponentSpace.basis j) = + c ^ j.massWeight • JetComponentSpace.basis j := by + rw [JetComponentSpace.massWeightScale, Module.Basis.constr_basis] + +/-- The representation of the Lorentz group on the space of component functions + of the B boson: the derivative symbols transform through the real dual covector + action and the target factor through the dual of the B-boson representation. -/ +noncomputable def JetComponentSpace.repLorentzGroup : + Representation ℝ (SL(2,ℂ)) JetComponentSpace := + DerivAlgebraReal.repLorentzGroup.tprod BBoson.repLorentzGroup.dual + + /-! ### A.1. The action of the gauge group on the jet component space @@ -641,6 +667,38 @@ noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := /-! +## A. Representation of the Lorentz group + +-/ + +noncomputable def repLorentzGroup : + Representation ℝ SL(2,ℂ) JetAlgebra where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp [End.one_eq_id] + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ2)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + +noncomputable def complexRepLorentzGroup : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] JetAlgebra) where + toFun U := LinearMap.baseChange ℂ (BBoson.JetAlgebra.repLorentzGroup U) + map_one' := by + ext x + simp [Module.End.one_eq_id] + map_mul' U V := by + ext x + simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] + +/-! + ## A. Representation of the jet Gauge group -/ @@ -1740,6 +1798,51 @@ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : | add x y hx hy ihx ihy => rw [map_add, ihx, ihy] | mul x y hx hy ihx ihy => rw [repJetGaugeGroupI_mul, ihx, ihy] +/-! + +## Mass weight scaling + +-/ + + +/-- The mass-dimension scaling on the jet algebra of the B boson: the algebra + map multiplying each generator by `c ^ w`, where `w` is twice its mass + dimension. -/ +noncomputable def massWeightScaleReal (c : ℝ) : JetAlgebra →ₐ[ℝ] JetAlgebra := + SymmetricAlgebra.lift + ((SymmetricAlgebra.ι ℝ JetComponentSpace) ∘ₗ JetComponentSpace.massWeightScale c) + +/-- Each generator scales by `c` to the power of its mass weight. -/ +@[simp] +lemma massWeightScaleReal_ofGenerator (c : ℝ) (j : JetGenerators) : + massWeightScaleReal c (ofGenerator j) = c ^ j.massWeight • ofGenerator j := by + rw [ofGenerator, massWeightScaleReal, SymmetricAlgebra.lift_ι_apply] + simp only [LinearMap.coe_comp, Function.comp_apply, + JetComponentSpace.massWeightScale_basis, map_smul] + +/-- The mass-dimension scaling on the complexified jet algebra of the B boson: + the `ℂ`-algebra map multiplying each generator by `c ^ w`, where `w` is twice + its mass dimension. -/ +noncomputable def massWeightScale (c : ℂ) : + ℂ ⊗[ℝ] JetAlgebra →ₐ[ℂ] ℂ ⊗[ℝ] JetAlgebra := + Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft + (SymmetricAlgebra.lift (JetComponentSpace.basis.constr ℝ fun j => + c ^ j.massWeight • ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j))) + fun _ _ => Commute.all _ _ + +/-- Each complexified generator scales by `c` to the power of its mass + weight. -/ +@[simp] +lemma massWeightScale_tmul_ofGenerator (c z : ℂ) (j : JetGenerators) : + massWeightScale c (z ⊗ₜ[ℝ] ofGenerator j) = + c ^ j.massWeight • (z ⊗ₜ[ℝ] ofGenerator j) := by + rw [massWeightScale, Algebra.TensorProduct.lift_tmul, ofGenerator, + SymmetricAlgebra.lift_ι_apply, Module.Basis.constr_basis, mul_smul_comm] + congr 1 + rw [Algebra.TensorProduct.includeLeft_apply, Algebra.TensorProduct.tmul_mul_tmul, + mul_one, one_mul] + rfl + end JetAlgebra end BBoson diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index d7ce83b8f..dee39ba3c 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -20,6 +20,7 @@ public import Mathlib.RepresentationTheory.Basic public import Mathlib.RingTheory.TensorProduct.Basic public import Physlib.Mathematics.MvPowerSeriesDerivative public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic +public import Physlib.Relativity.Tensors.RealTensor.CoVector.Representation /-! # Derivative algebras @@ -573,4 +574,94 @@ lemma repLorentzGroup_deriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (a : DerivAl refine Finset.sum_congr rfl fun ν _ => ?_ rw [mul_smul_comm, ← deriv_apply_eq_mul] +/-! + +### B.6. The derivative-degree scaling + +-/ + +/-- The derivative-degree scaling on the algebra of derivative symbols: the + algebra map multiplying each generator by `t`, hence each degree-`n` monomial + by `t ^ n`. -/ +noncomputable def gradeScale (t : ℂ) : DerivAlgebraComplex →ₐ[ℂ] DerivAlgebraComplex := + SymmetricAlgebra.lift (t • SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + +@[simp] +lemma gradeScale_ι (t : ℂ) (x : Module.Dual ℂ Lorentz.CoℂModule) : + gradeScale t (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) x) = + t • SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) x := by + rw [gradeScale, SymmetricAlgebra.lift_ι_apply] + rfl + +/-- The degree scaling multiplies the basis monomial at `s` by `t ^ |s|`. -/ +lemma gradeScale_basis (t : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) : + gradeScale t (basis s) = t ^ s.card • basis s := by + induction s using Multiset.induction_on with + | empty => + rw [show basis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 from basis_nil, map_one] + simp + | cons a s ih => + rw [← Multiset.singleton_add, ← basis_mul, map_mul, ih, basis_singleton, + gradeScale_ι, smul_mul_smul_comm, ← _root_.pow_succ', ← basis_singleton, + basis_mul, Multiset.singleton_add, Multiset.card_cons] + +/-- The degree scaling commutes with the Lorentz action: the Lorentz action + preserves the derivative degree. -/ +lemma gradeScale_repLorentzGroup (t : ℂ) (Λ : SL(2,ℂ)) (a : DerivAlgebraComplex) : + gradeScale t (repLorentzGroup Λ a) = repLorentzGroup Λ (gradeScale t a) := by + have h : (gradeScale t).comp (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℂ _ ∘ₗ Lorentz.CoℂModule.SL2CRep.dual Λ)).comp + (gradeScale t) := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp + exact DFunLike.congr_fun h a + end DerivAlgebraComplex + + +/-! + +## C. The real derivative algebra + +-/ + +abbrev DerivAlgebraReal := SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) + +namespace DerivAlgebraReal +open Matrix MatrixGroups + +/-- The representation of the Lorentz group on the real Lorentz-covector derivative + slots, obtained from the real Lorentz-vector representation through the covering + map `SL(2,ℂ) →* LorentzGroup 3`. -/ +noncomputable def _root_.Lorentz.CoVector.sl2Rep : Representation ℝ SL(2,ℂ) Lorentz.CoVector := + MonoidHom.comp Lorentz.CoVector.rep Lorentz.SL2C.toLorentzGroup + + +/-- The representation of the Lorentz group `SL(2,ℂ)` on the algebra of derivative + symbols, extending the dual covector representation multiplicatively. -/ +noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) DerivAlgebraReal where + toFun Λ := (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)).toLinearMap + map_one' := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual 1) = + AlgHom.id ℝ (SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp + rfl + map_mul' Λ1 Λ2 := by + suffices h : SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual (Λ1 * Λ2)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ1)).comp + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ2)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp [map_mul, Module.End.mul_apply] + + +end DerivAlgebraReal From 4cdc22864a5d24979c607e4a4f7d0dac2d41aa9b Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 5 Aug 2026 16:06:03 +0100 Subject: [PATCH 095/254] feat: Claude push at proving theorem with guideance Co-Authored-By: Claude --- Physlib/Particles/QED/JetAlgebra.lean | 42 + Physlib/Particles/QED/MassDim.lean | 1328 ++++++++++++++++- .../StandardModel/Fermions/LeptonSinglet.lean | 48 + .../StandardModel/GaugeBosons/BBoson.lean | 501 ++++++- Physlib/Relativity/DerivAlgebra.lean | 58 + 5 files changed, 1958 insertions(+), 19 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra.lean index 0b2d77c92..0544cdd3d 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra.lean @@ -87,6 +87,7 @@ lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgeb (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl + /-! ### B.1. The action of the Lorentz group @@ -107,9 +108,40 @@ def IsInvariant (x : JetAlgebra) : Prop := (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) +lemma IsInvariant.add {x y : JetAlgebra} (hx : IsInvariant x) (hy : IsInvariant y) : + IsInvariant (x + y) := by + constructor + · intro U + simp [hx.left, hy.left] + · intro Λ + simp [hx.right, hy.right] + +lemma IsInvariant.smul {x : JetAlgebra} (hx : IsInvariant x) (r : ℂ) : + IsInvariant (r • x) := by + constructor + · intro U + simp [hx.left] + · intro Λ + simp [hx.right] + noncomputable def InvariantSubmodule : Submodule ℂ JetAlgebra := Submodule.span ℂ {x | IsInvariant x} +lemma InvariantSubmodule.mem_iff_isInvariant (x : JetAlgebra) : + x ∈ InvariantSubmodule ↔ IsInvariant x := by + constructor + · intro hx + induction hx using Submodule.span_induction with + | mem y hy => exact hy + | zero => exact ⟨fun U => map_zero _, fun Λ => map_zero _⟩ + | add y z hy hz ihy ihz => + exact ⟨fun U => by rw [map_add, ihy.1 U, ihz.1 U], + fun Λ => by rw [map_add, ihy.2 Λ, ihz.2 Λ]⟩ + | smul c y hy ihy => + exact ⟨fun U => by rw [map_smul, ihy.1 U], + fun Λ => by rw [map_smul, ihy.2 Λ]⟩ + · exact fun hx => Submodule.subset_span hx + /-! ## Jet derivatives @@ -1209,6 +1241,16 @@ lemma repJetGaugeGroupI_eq_repAlgHom (U : JetGaugeGroupI) (x : JetAlgebra) : repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply] +/-- The gauge action is multiplicative (term-level form avoiding elaboration + blowups on the tensor stack). -/ +lemma repJetGaugeGroupI_mul' (U : JetGaugeGroupI) (a b : JetAlgebra) : + repJetGaugeGroupI U (a * b) = + repJetGaugeGroupI U a * repJetGaugeGroupI U b := + (repJetGaugeGroupI_eq_repAlgHom U (a * b)).trans + ((map_mul (repAlgHom U) a b).trans + (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom U a).symm + (repJetGaugeGroupI_eq_repAlgHom U b).symm)) + set_option maxHeartbeats 1000000 in /-- On gauge jets with trivial value at the base point, the covariant elements are exactly invariant, so the gauge action intertwines the covariant diff --git a/Physlib/Particles/QED/MassDim.lean b/Physlib/Particles/QED/MassDim.lean index 22c219664..cc7be7e83 100644 --- a/Physlib/Particles/QED/MassDim.lean +++ b/Physlib/Particles/QED/MassDim.lean @@ -15,6 +15,8 @@ public import Physlib.Relativity.PauliMatrices.Basic @[expose] public section +set_option maxHeartbeats 1000000 + namespace QED open TensorProduct StandardModel @@ -26,6 +28,11 @@ def MassWeight : JetGenerators → ℕ namespace JetAlgebra +/-! + +## A. The massWeightScaling algebra homomorphism + +-/ /-- The mass-dimension scaling on the QED jet algebra: the algebra map multiplying each generator by `c ^ w`, where `w` is twice its mass dimension. It is the tensor product of the scalings on the B-boson and charged-lepton @@ -54,12 +61,101 @@ lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] rfl +/-- The total derivative raises the mass weight by two. -/ +lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + | tmul p l => + simp only [jetDeriv_tmul, map_add, massWeightScale, Algebra.TensorProduct.map_tmul, + BBoson.JetAlgebra.massWeightScale_jetDeriv_baseChange, + LeptonSinglet.JetAlgebra.massWeightScale_jetDeriv, TensorProduct.smul_tmul', + TensorProduct.tmul_smul, smul_add] + +/-- The covariant step raises the mass weight by two: the gauge-field term + `6 i B_μ ·` carries the same weight as the derivative. -/ +lemma massWeightScale_covariantStep (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (covariantStep μ x) = + c ^ 2 • covariantStep μ (massWeightScale c x) := by + have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = + massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b + have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = + c ^ 2 • [JetGenerators.dB {} μ]ₐ := by + rw [massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] + simp only [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply, map_add, map_smul, massWeightScale_jetDeriv, hm, hgen, + smul_mul_assoc] + module + +/-- The conjugate covariant step raises the mass weight by two. -/ +lemma massWeightScale_covariantStepBar (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (covariantStepBar μ x) = + c ^ 2 • covariantStepBar μ (massWeightScale c x) := by + have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = + massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b + have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = + c ^ 2 • [JetGenerators.dB {} μ]ₐ := by + rw [massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] + simp only [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply, map_sub, map_smul, massWeightScale_jetDeriv, hm, hgen, + smul_mul_assoc] + module + +/-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight + `3 + 2 |l|`. -/ +lemma massWeightScale_Dψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + massWeightScale c (Dψ l α) = c ^ (3 + 2 * l.length) • Dψ l α := by + induction l with + | nil => + rw [Dψ_nil, massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dψ {} α) = 3 from rfl] + norm_num + | cons μ l ih => + rw [Dψ_cons, massWeightScale_covariantStep, ih, map_smul, smul_smul, ← pow_add, + List.length_cons, show 3 + 2 * (l.length + 1) = 2 + (3 + 2 * l.length) from by + omega] + +/-- Homogeneity of the conjugate covariant derivative: `D̄_l ψ̄_α` has mass + weight `3 + 2 |l|`. -/ +lemma massWeightScale_Dbarψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + massWeightScale c (Dbarψ l α) = c ^ (3 + 2 * l.length) • Dbarψ l α := by + induction l with + | nil => + rw [Dbarψ_nil, massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dbarψ {} α) = 3 from rfl] + norm_num + | cons μ l ih => + rw [Dbarψ_cons, massWeightScale_covariantStepBar, ih, map_smul, smul_smul, + ← pow_add, List.length_cons, + show 3 + 2 * (l.length + 1) = 2 + (3 + 2 * l.length) from by omega] + +/-- Homogeneity of the field-strength derivatives: `∂_s F_{μν}` has mass weight + `4 + 2 |s|`. -/ +lemma massWeightScale_fieldStrengthDeriv (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + massWeightScale c (fieldStrengthDeriv s μ ν) = + c ^ (4 + 2 * Multiset.card s) • fieldStrengthDeriv s μ ν := by + have h : (fieldStrengthDeriv s μ ν : JetAlgebra) = + [JetGenerators.dB (s + {μ}) ν]ₐ - [JetGenerators.dB (s + {ν}) μ]ₐ := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, map_sub, massWeightScale_ofGenerator, massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dB (s + {μ}) ν) = 4 + 2 * Multiset.card s from by + simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, + show MassWeight (JetGenerators.dB (s + {ν}) μ) = 4 + 2 * Multiset.card s from by + simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, + smul_sub] + noncomputable def MassDimSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := Submodule.span ℂ { x | ∀ c : ℂ, massWeightScale c x = c ^ n • x } noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ n • x} + Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ m • x} noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := MassWeightLESubmodule n ⊓ InvariantSubmodule @@ -81,6 +177,7 @@ excluded by charge balance or by the absence of a Lorentz invariant: -/ open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups /-- The Maxwell kinetic term `F_{μν} F^{μν}`: the field-strength square with both indices raised by the (diagonal) Minkowski metric. Mass weight eight. -/ @@ -115,8 +212,1237 @@ noncomputable def fermionKineticTermBar : JetAlgebra := def massDimFourInvariants : Set JetAlgebra := {1, maxwellTerm, thetaTerm, fermionKineticTerm, fermionKineticTermBar} + +/-! + +## Gauge invariance of the renormalizable terms + +The hypercharge selection rule: a jet of gauge transformations acts on the +covariant generators only through `u(0)^{±6}`, so the field-strength squares are +exactly invariant and a product of one covariant lepton and one covariant +conjugate-lepton factor is invariant by unitarity. + +-/ + +lemma repJetGaugeGroupI_maxwellTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U maxwellTerm = maxwellTerm := by + rw [maxwellTerm, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul] + congr 1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv] + +lemma repJetGaugeGroupI_thetaTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U thetaTerm = thetaTerm := by + rw [thetaTerm, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_zsmul] + congr 1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, + repJetGaugeGroupI_fieldStrengthDeriv] + +/-- The hypercharge scalars of a lepton–conjugate-lepton pair cancel by + unitarity. -/ +lemma repJetGaugeGroupI_Dbarψ_mul_Dψ (U : JetGaugeGroupI) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + repJetGaugeGroupI U (Dbarψ l α * Dψ l' β) = Dbarψ l α * Dψ l' β := by + have hz : star ((U.eval.2.2 : unitary ℂ) : ℂ) * ((U.eval.2.2 : unitary ℂ) : ℂ) = 1 := + (Unitary.mem_iff.mp (U.eval.2.2).2).1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dbarψ, + Submonoid.smul_def, Submonoid.smul_def, SubmonoidClass.coe_pow, + SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← mul_pow, hz, + one_pow, one_smul] + +lemma repJetGaugeGroupI_fermionKineticTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] + +lemma repJetGaugeGroupI_fermionKineticTermBar (U : JetGaugeGroupI) : + repJetGaugeGroupI U fermionKineticTermBar = fermionKineticTermBar := by + rw [fermionKineticTermBar, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] + +/-! + +## Lorentz invariance of the renormalizable terms + +TODO: these require the transformation laws of the field strength (as an +antisymmetric two-tensor through `Λᵀ η Λ = η` and `det Λ = 1`) and of the +covariant derivatives (through the σ-matrix intertwining relation +`M σ^μ M† = Λ(M)^μ_ν σ^ν` defining `SL2C.toLorentzGroup`), which are not yet +available for the jet-algebra representations. + +-/ + +/-- The component form of the Lorentz-group defining identity: contracting two + Lorentz matrices with the (diagonal, involutive) Minkowski metric over their + second indices reproduces the metric. -/ +lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : + ∑ ν, η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν = η a a' := by + have hsq : η a' a' * η a' a' = 1 := by + rcases a' with i | i + · rw [show i = (0 : Fin 1) from Subsingleton.elim i 0, + minkowskiMatrix.inl_0_inl_0] + norm_num + · rw [minkowskiMatrix.inr_i_inr_i] + norm_num + have h := congrFun (congrFun ((LorentzGroup.mem_iff_self_mul_dual).mp + (Lorentz.SL2C.toLorentzGroup Λ).2) a) a' + rw [Matrix.mul_apply] at h + simp only [minkowskiMatrix.dual_apply] at h + have h2 := congrArg (fun t => t * η a' a') h + simp only [Finset.sum_mul] at h2 + rw [show (∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν * η a' a') * η a' a') = + ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν) * (η a' a' * η a' a') from + Finset.sum_congr rfl fun ν _ => by ring, hsq] at h2 + simp only [mul_one] at h2 + rw [h2, Matrix.one_apply] + by_cases haa : a = a' + · subst haa + simp + · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] + simp + +set_option maxHeartbeats 4000000 in +/-- The Lorentz action on the QED jet algebra is multiplicative (term-level + form). -/ +lemma repLorentzGroup_mul' (Λ : SL(2,ℂ)) (a b : JetAlgebra) : + repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by + have happ : ∀ (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra), + repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := fun p l => rfl + have hd₁ : ∀ x y z : JetAlgebra, (x + y) * z = x * z + y * z := by grind + have hd₂ : ∀ x y z : JetAlgebra, x * (y + z) = x * y + x * z := by grind + have hz₁ : ∀ x : JetAlgebra, 0 * x = 0 := fun x => zero_mul x + have hz₂ : ∀ x : JetAlgebra, x * 0 = 0 := fun x => mul_zero x + induction a using TensorProduct.induction_on with + | zero => rw [hz₁, map_zero, hz₁] + | add x y hx hy => rw [hd₁, map_add, map_add, hx, hy, hd₁] + | tmul p l => + induction b using TensorProduct.induction_on with + | zero => rw [hz₂, map_zero, hz₂] + | add x y hx hy => rw [hd₂, map_add, map_add, hx, hy, hd₂] + | tmul p' l' => + rw [Algebra.TensorProduct.tmul_mul_tmul, happ, happ, happ, + Algebra.TensorProduct.tmul_mul_tmul, + BBoson.JetAlgebra.complexRepLorentzGroup_mul, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_mul] + +/-- The transformation law of the embedded field strength: an antisymmetric + two-tensor with both indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) = + ∑ a, ∑ b, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • + fieldStrengthDeriv {} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + +set_option maxHeartbeats 2000000 in +/-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ +lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ maxwellTerm = maxwellTerm := by + have hscal : ∀ a b a' b' : Fin 1 ⊕ Fin 3, + (∑ μ, ∑ ν, η μ μ * η ν ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = η a a' * η b b' := by + intro a b a' b' + rw [show (∑ μ, ∑ ν, η μ μ * η ν ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = + ∑ μ, (η μ μ * (Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' μ) * + ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν) from + Finset.sum_congr rfl fun μ _ => by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun ν _ => by ring, + ← Finset.sum_mul, toLorentzGroup_sum_η_mul_mul, toLorentzGroup_sum_η_mul_mul] + have hFt : ∀ μ ν : Fin 1 ⊕ Fin 3, repLorentzGroup Λ + (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) = + ∑ a, ∑ b, ∑ a', ∑ b', + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + intro μ ν + rw [repLorentzGroup_mul', repLorentzGroup_fieldStrengthDeriv_nil] + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + simp only [hsm, hms, hsmul] + rw [maxwellTerm, map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, ν]; rw [map_smul, hFt μ ν] + simp only [Finset.smul_sum, smul_smul, ← Complex.ofReal_mul] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b, 2, a']; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a', 2, b', 2, μ]; rw [← Finset.sum_smul] + conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [← Finset.sum_smul] + simp only [← Complex.ofReal_sum, hscal] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rw [Finset.sum_eq_single a (fun a'' _ ha'' => Finset.sum_eq_zero fun b'' _ => by + rw [show η a a'' = 0 from by + rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm ha'')], + zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ a) h), + Finset.sum_eq_single b (fun b'' _ hb'' => by + rw [show η b b'' = 0 from by + rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm hb'')], + mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ b) h)] + +/-- The transformation law of a product of two field strengths. -/ +lemma repLorentzGroup_fieldStrengthDeriv_mul (Λ : SL(2,ℂ)) + (μ ν ρ τ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} ρ τ) = + ∑ a, ∑ b, ∑ a', ∑ b', + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' ρ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' τ : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + rw [repLorentzGroup_mul', repLorentzGroup_fieldStrengthDeriv_nil, + repLorentzGroup_fieldStrengthDeriv_nil] + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + simp only [hsm, hms, hsmul] + +/-- The alternating four-fold contraction of Lorentz matrices is a determinant: + the combinatorial identity behind the invariance of the theta term. -/ +lemma sum_perm_sign_mul_prod_eq_det (Λ : SL(2,ℂ)) (v : Fin 4 → Fin 1 ⊕ Fin 3) : + (∑ p : Equiv.Perm (Fin 4), ((Equiv.Perm.sign p : ℤ) : ℝ) * + ∏ i, (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p i))) = + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by + rw [← Matrix.det_transpose, Matrix.det_apply] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [Units.smul_def, zsmul_eq_mul] + rfl + +lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ thetaTerm = thetaTerm := by + -- TODO: expand with `repLorentzGroup_fieldStrengthDeriv_mul`, exchange the + -- permutation sum with the four index sums, evaluate the alternating + -- contraction with `sum_perm_sign_mul_prod_eq_det`: it vanishes on + -- non-injective index tuples (equal rows) and gives `sign q · det Λ = sign q` + -- on injective ones (`Matrix.det_permute`, `toLorentzGroup_det_one`), + -- reindexing the surviving tuples by permutations. + sorry + +lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by + sorry + +lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTermBar = fermionKineticTermBar := by + sorry + +/-! + +## The span inclusion + +Every element of `massDimFourInvariants` is invariant and has mass weight at +most eight, so the span is contained in `InvariantMassWeightSubmodule 8`. + +-/ + +/-- Eigenvectors of weight `m ≤ n` lie in the weight-`≤ n` submodule. -/ +lemma mem_massWeightLESubmodule_of_forall_massWeightScale {x : JetAlgebra} + {m n : ℕ} (hmn : m ≤ n) + (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) : + x ∈ MassWeightLESubmodule n := + Submodule.subset_span ⟨m, hmn, hx⟩ + +/-- Products of homogeneous elements are homogeneous of the summed weight. -/ +lemma massWeightScale_mul_eigen {x y : JetAlgebra} {m n : ℕ} + (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) + (hy : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (c : ℂ) : + massWeightScale c (x * y) = c ^ (m + n) • (x * y) := by + rw [map_mul, hx, hy, smul_mul_smul_comm, ← pow_add] + +lemma maxwellTerm_mem_massWeightLESubmodule : + maxwellTerm ∈ MassWeightLESubmodule 8 := by + rw [maxwellTerm] + refine Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun ν _ => + Submodule.smul_mem _ _ ?_ + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl + (massWeightScale_mul_eigen (m := 4) (n := 4) + (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν) + (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν)) + +lemma thetaTerm_mem_massWeightLESubmodule : + thetaTerm ∈ MassWeightLESubmodule 8 := by + rw [thetaTerm] + refine Submodule.sum_mem _ fun p _ => zsmul_mem ?_ _ + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl + (massWeightScale_mul_eigen (m := 4) (n := 4) + (fun c => massWeightScale_fieldStrengthDeriv c {} _ _) + (fun c => massWeightScale_fieldStrengthDeriv c {} _ _)) + +lemma fermionKineticTerm_mem_massWeightLESubmodule : + fermionKineticTerm ∈ MassWeightLESubmodule 8 := by + rw [fermionKineticTerm] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => + Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => + Submodule.smul_mem _ _ ?_) + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 3 + 5) le_rfl + (massWeightScale_mul_eigen (m := 3) (n := 5) + (fun c => massWeightScale_Dbarψ c [] α) + (fun c => massWeightScale_Dψ c [μ] β)) + +lemma fermionKineticTermBar_mem_massWeightLESubmodule : + fermionKineticTermBar ∈ MassWeightLESubmodule 8 := by + rw [fermionKineticTermBar] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => + Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => + Submodule.smul_mem _ _ ?_) + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 5 + 3) le_rfl + (massWeightScale_mul_eigen (m := 5) (n := 3) + (fun c => massWeightScale_Dbarψ c [μ] α) + (fun c => massWeightScale_Dψ c [] β)) + +/-- The Lorentz action fixes the unit of the jet algebra. -/ +lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ (1 : JetAlgebra) = 1 := by + have h1 : BBoson.JetAlgebra.complexRepLorentzGroup Λ + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by + rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, + show BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) + from by rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ = + LinearMap.baseChange ℂ (BBoson.JetAlgebra.repLorentzGroup Λ) from rfl, + LinearMap.baseChange_tmul], + show BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) = 1 from + map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + BBoson.JetComponentSpace.repLorentzGroup Λ))] + rw [show (1 : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, + show repLorentzGroup Λ ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + BBoson.JetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra) + from rfl, + h1, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + +/-- Every element of `massDimFourInvariants` is gauge and Lorentz invariant. -/ +lemma isInvariant_of_mem_massDimFourInvariants {x : JetAlgebra} + (hx : x ∈ massDimFourInvariants) : IsInvariant x := by + rcases hx with rfl | rfl | rfl | rfl | rfl + · exact ⟨fun U => (repJetGaugeGroupI_eq_repAlgHom U 1).trans (repAlgHom U).map_one, + repLorentzGroup_one⟩ + · exact ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ + · exact ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ + · exact ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ + · exact ⟨repJetGaugeGroupI_fermionKineticTermBar, + repLorentzGroup_fermionKineticTermBar⟩ + +lemma span_massDimFourInvariants_le : + Submodule.span ℂ massDimFourInvariants ≤ InvariantMassWeightSubmodule 8 := by + rw [Submodule.span_le] + intro x hx + refine Submodule.mem_inf.mpr ⟨?_, Submodule.subset_span + (isInvariant_of_mem_massDimFourInvariants hx)⟩ + rcases hx with rfl | rfl | rfl | rfl | rfl + · exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 0) (Nat.zero_le 8) + fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one + · exact maxwellTerm_mem_massWeightLESubmodule + · exact thetaTerm_mem_massWeightLESubmodule + · exact fermionKineticTerm_mem_massWeightLESubmodule + · exact fermionKineticTermBar_mem_massWeightLESubmodule + +/-! + +## Towards completeness: graded decomposition + +The powers `c ↦ c ^ w` are linearly independent functions of `c`, so the +weight components of an element are unique: a vanishing combination of +eigenvectors weighted by powers has vanishing components, and every element of +the weight-`≤ n` submodule decomposes into exact-weight eigenvectors. + +-/ + +/-- If a finite combination of vectors weighted by powers of `c` vanishes for + all `c`, each component vanishes. -/ +lemma eq_zero_of_forall_sum_pow_smul_eq_zero (s : Finset ℕ) (v : ℕ → JetAlgebra) + (h : ∀ c : ℂ, ∑ w ∈ s, c ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : v w = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hp : ∀ c : ℂ, Polynomial.eval c + (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by + intro c + have h2 := congrArg φ (h c) + rw [map_sum, map_zero] at h2 + rw [Polynomial.eval_finsetSum] + simpa [Polynomial.eval_monomial, mul_comm] using h2 + have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := + Polynomial.funext fun c => by rw [hp c, Polynomial.eval_zero] + have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff + +/-- Every element of the weight-`≤ n` submodule is a sum of exact-weight + eigenvectors of the mass-dimension scaling. -/ +lemma exists_eigen_decomp_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} + (hx : x ∈ MassWeightLESubmodule n) : + ∃ z : ℕ → JetAlgebra, + (∀ m, ∀ c : ℂ, massWeightScale c (z m) = c ^ m • z m) ∧ + x = ∑ m ∈ Finset.range (n + 1), z m := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨m, hmn, hym⟩ := hy + refine ⟨fun k => if k = m then y else 0, fun k c => ?_, ?_⟩ + · by_cases hk : k = m + · subst hk + simpa using hym c + · simp [hk] + · rw [Finset.sum_ite_eq' (Finset.range (n + 1)) m fun _ => y, + if_pos (Finset.mem_range.mpr (Nat.lt_succ_of_le hmn))] + | zero => + exact ⟨fun _ => 0, by simp, by simp⟩ + | add a b ha hb iha ihb => + obtain ⟨z₁, hz₁, rfl⟩ := iha + obtain ⟨z₂, hz₂, rfl⟩ := ihb + refine ⟨z₁ + z₂, fun m c => ?_, ?_⟩ + · simp only [Pi.add_apply, map_add, hz₁ m c, hz₂ m c, smul_add] + · rw [← Finset.sum_add_distrib] + rfl + | smul c a ha iha => + obtain ⟨z, hz, rfl⟩ := iha + refine ⟨c • z, fun m c' => ?_, ?_⟩ + · simp only [Pi.smul_apply, map_smul, hz m c', smul_comm c] + · rw [Finset.smul_sum] + rfl + +/-- The span of the covariant monomials of exact mass weight `w`: products of + field-strength derivatives and covariant derivatives of total weight `w`. -/ +noncomputable def covMonomialSpan (w : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ + ∀ c : ℂ, massWeightScale c y = c ^ w • y} + +/-- Every covariant monomial is homogeneous. -/ +lemma exists_weight_of_mem_closure {y : JetAlgebra} + (hy : y ∈ Submonoid.closure invariantGenerators) : + ∃ w, ∀ c : ℂ, massWeightScale c y = c ^ w • y := by + induction hy using Submonoid.closure_induction with + | mem z hz => + rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact ⟨4 + 2 * Multiset.card p.1, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dψ c p.1 p.2⟩ + · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + | one => + exact ⟨0, fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one⟩ + | mul a b ha hb iha ihb => + obtain ⟨wa, hwa⟩ := iha + obtain ⟨wb, hwb⟩ := ihb + exact ⟨wa + wb, massWeightScale_mul_eigen hwa hwb⟩ + +/-- Elements of the weight-`w` covariant monomial span are eigenvectors. -/ +lemma forall_massWeightScale_of_mem_covMonomialSpan {w : ℕ} {y : JetAlgebra} + (hy : y ∈ covMonomialSpan w) (c : ℂ) : + massWeightScale c y = c ^ w • y := by + induction hy using Submodule.span_induction with + | mem z hz => exact hz.2 c + | zero => simp + | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] + | smul d a ha iha => rw [map_smul, iha, smul_comm] + +/-- A vanishing tail extends a truncated sum. -/ +lemma sum_range_succ_ext {N M : ℕ} (z : ℕ → JetAlgebra) (hNM : N ≤ M) + (hz : ∀ m, N < m → z m = 0) : + ∑ m ∈ Finset.range (N + 1), z m = ∑ m ∈ Finset.range (M + 1), z m := by + refine Finset.sum_subset ?_ ?_ + · intro m hm + simp only [Finset.mem_range] at hm ⊢ + omega + intro m hm hms + refine hz m ?_ + simp only [Finset.mem_range] at hm hms + omega + +/-- Every element of the algebra generated by the covariant generators + decomposes into covariant monomial components of bounded weight. -/ +lemma exists_bound_decomp_of_mem_adjoin {x : JetAlgebra} + (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : + ∃ (N : ℕ) (z : ℕ → JetAlgebra), (∀ m, z m ∈ covMonomialSpan m) ∧ + (∀ m, N < m → z m = 0) ∧ x = ∑ m ∈ Finset.range (N + 1), z m := by + have hx' : x ∈ Subalgebra.toSubmodule (Algebra.adjoin ℂ invariantGenerators) := hadj + rw [Algebra.adjoin_eq_span] at hx' + clear hadj + induction hx' using Submodule.span_induction with + | mem y hy => + obtain ⟨w, hw⟩ := exists_weight_of_mem_closure hy + refine ⟨w, fun k => if k = w then y else 0, fun k => ?_, fun k hk => ?_, ?_⟩ + · by_cases hkw : k = w + · subst hkw + show (if k = k then y else 0) ∈ covMonomialSpan k + rw [if_pos rfl] + exact Submodule.subset_span ⟨hy, hw⟩ + · show (if k = w then y else 0) ∈ covMonomialSpan k + rw [if_neg hkw] + exact Submodule.zero_mem _ + · show (if k = w then y else 0) = 0 + rw [if_neg (show ¬ k = w by omega)] + · show y = ∑ m ∈ Finset.range (w + 1), (if m = w then y else 0) + rw [Finset.sum_ite_eq' (Finset.range (w + 1)) w fun _ => y, + if_pos (Finset.mem_range.mpr (Nat.lt_succ_self w))] + | zero => + exact ⟨0, fun _ => 0, fun m => Submodule.zero_mem _, fun _ _ => rfl, by simp⟩ + | add a b ha hb iha ihb => + obtain ⟨N₁, z₁, hz₁, hs₁, rfl⟩ := iha + obtain ⟨N₂, z₂, hz₂, hs₂, rfl⟩ := ihb + refine ⟨max N₁ N₂, z₁ + z₂, fun m => Submodule.add_mem _ (hz₁ m) (hz₂ m), + fun m hm => ?_, ?_⟩ + · simp only [Pi.add_apply, hs₁ m (lt_of_le_of_lt (le_max_left _ _) hm), + hs₂ m (lt_of_le_of_lt (le_max_right _ _) hm), add_zero] + · rw [sum_range_succ_ext z₁ (le_max_left N₁ N₂) hs₁, + sum_range_succ_ext z₂ (le_max_right N₁ N₂) hs₂, + ← Finset.sum_add_distrib] + rfl + | smul c a ha iha => + obtain ⟨N, z, hz, hs, rfl⟩ := iha + refine ⟨N, c • z, fun m => Submodule.smul_mem _ _ (hz m), + fun m hm => ?_, ?_⟩ + · simp only [Pi.smul_apply, hs m hm, smul_zero] + · rw [Finset.smul_sum] + rfl + +/-- The master decomposition: an element of the adjoin of the covariant + generators of mass weight at most eight is a sum of nine covariant monomial + components of weights `0, …, 8`. -/ +lemma exists_covMonomialSpan_decomp {x : JetAlgebra} + (hx : x ∈ MassWeightLESubmodule 8) + (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : + ∃ z : ℕ → JetAlgebra, (∀ m, z m ∈ covMonomialSpan m) ∧ + x = ∑ m ∈ Finset.range 9, z m := by + obtain ⟨N, z, hzmem, hzsupp, hzx⟩ := exists_bound_decomp_of_mem_adjoin hadj + obtain ⟨z', hz'eig, hz'x⟩ := exists_eigen_decomp_of_mem_massWeightLESubmodule hx + refine ⟨z, hzmem, ?_⟩ + set M := max N 8 with hM + have h1 : x = ∑ m ∈ Finset.range (M + 1), z m := + hzx.trans (sum_range_succ_ext z (le_max_left N 8) hzsupp) + have hz'supp : ∀ m, 8 < m → (fun k => if k < 9 then z' k else 0) m = 0 := by + intro m hm + show (if m < 9 then z' m else 0) = 0 + rw [if_neg (show ¬ m < 9 by omega)] + have h2 : x = ∑ m ∈ Finset.range (M + 1), (fun k => if k < 9 then z' k else 0) m := by + rw [hz'x, show (9 : ℕ) = 8 + 1 from rfl, + ← sum_range_succ_ext _ (le_max_right N 8) hz'supp] + exact Finset.sum_congr rfl fun m hm => by + rw [if_pos (Finset.mem_range.mp hm)] + have hdiff : ∀ c : ℂ, ∑ m ∈ Finset.range (M + 1), + c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) = 0 := by + intro c + have e1 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), c ^ m • z m := by + rw [h1, map_sum] + exact Finset.sum_congr rfl fun m _ => + forall_massWeightScale_of_mem_covMonomialSpan (hzmem m) c + have e2 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), + c ^ m • (fun k => if k < 9 then z' k else 0) m := by + rw [h2, map_sum] + refine Finset.sum_congr rfl fun m _ => ?_ + by_cases hm : m < 9 + · simp only [if_pos hm] + exact hz'eig m c + · simp only [if_neg hm, map_zero, smul_zero] + calc ∑ m ∈ Finset.range (M + 1), + c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) + = (∑ m ∈ Finset.range (M + 1), c ^ m • z m) - + ∑ m ∈ Finset.range (M + 1), + c ^ m • (fun k => if k < 9 then z' k else 0) m := by + rw [← Finset.sum_sub_distrib] + exact Finset.sum_congr rfl fun m _ => smul_sub _ _ _ + _ = massWeightScale c x - massWeightScale c x := by rw [← e1, ← e2] + _ = 0 := sub_self _ + have hkill : ∀ m, 8 < m → z m = 0 := by + intro m hm + by_cases hmM : m ≤ M + · have h0 : z m - (fun k => if k < 9 then z' k else 0) m = 0 := + eq_zero_of_forall_sum_pow_smul_eq_zero (Finset.range (M + 1)) _ hdiff + (show m ∈ Finset.range (M + 1) from Finset.mem_range.mpr (by omega)) + simpa [if_neg (by omega : ¬ m < 9)] using h0 + · exact hzsupp m (by omega) + rw [h1, show (9 : ℕ) = 8 + 1 from rfl, sum_range_succ_ext z (le_max_right N 8) hkill] + +/-! + +## Componentwise invariance + +The scaling at real scalars commutes with the Lorentz action and (at all +scalars) with the constant gauge action, so the weight components of an +invariant element are themselves invariant. + +-/ + +/-- The mass-dimension scaling at a real scalar commutes with the Lorentz + action on the QED jet algebra. -/ +lemma massWeightScale_ofReal_repLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) + (x : JetAlgebra) : + massWeightScale (r : ℂ) (repLorentzGroup Λ x) = + repLorentzGroup Λ (massWeightScale (r : ℂ) x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul p l => + have hLS : LeptonSinglet.JetAlgebra.massWeightScale (r : ℂ) + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) = + LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (LeptonSinglet.JetAlgebra.massWeightScale (r : ℂ) l) := + DFunLike.congr_fun + (LeptonSinglet.JetAlgebra.massWeightScale_repLorentzGroup (r : ℂ) Λ) l + have h1 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), + massWeightScale (r : ℂ) (p' ⊗ₜ[ℂ] l') = + (BBoson.JetAlgebra.massWeightScale (r : ℂ) p') ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.massWeightScale (r : ℂ) l') := + fun p' l' => rfl + have h2 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), + repLorentzGroup Λ (p' ⊗ₜ[ℂ] l') = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ p') ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l') := fun p' l' => rfl + rw [h2, h1, BBoson.JetAlgebra.massWeightScale_ofReal_complexRepLorentzGroup, + hLS, h1, h2] + +/-- The mass-dimension scaling commutes with the constant gauge action on the + QED jet algebra. -/ +lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) + (x : JetAlgebra) : + massWeightScale c (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (massWeightScale c x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul p l => + have hLS : LeptonSinglet.JetAlgebra.massWeightScale c + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI + (JetGaugeGroupI.ofConstant g) l) = + LeptonSinglet.JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (LeptonSinglet.JetAlgebra.massWeightScale c l) := + DFunLike.congr_fun + (LeptonSinglet.JetAlgebra.massWeightScale_repJetGaugeGroupI_ofConstant c g) l + have h1 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), + massWeightScale c (p' ⊗ₜ[ℂ] l') = + (BBoson.JetAlgebra.massWeightScale c p') ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.massWeightScale c l') := fun p' l' => rfl + have h2 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (p' ⊗ₜ[ℂ] l') = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI + (JetGaugeGroupI.ofConstant g) p') ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI + (JetGaugeGroupI.ofConstant g) l') := fun p' l' => rfl + rw [h2, BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, h1, hLS, h1, h2, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant] + +/-- Real-scalar variant of the independence of powers. -/ +lemma eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero (s : Finset ℕ) + (v : ℕ → JetAlgebra) + (h : ∀ r : ℝ, ∑ w ∈ s, ((r : ℂ)) ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : + v w = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hp : ∀ r : ℝ, Polynomial.eval ((r : ℂ)) + (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by + intro r + have h2 := congrArg φ (h r) + rw [map_sum, map_zero] at h2 + rw [Polynomial.eval_finsetSum] + simpa [Polynomial.eval_monomial, mul_comm] using h2 + have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by + refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ + refine Set.Infinite.mono ?_ + (Set.infinite_range_of_injective Complex.ofReal_injective) + rintro z ⟨r, rfl⟩ + exact hp r + have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff + +/-- The weight components of a Lorentz-invariant covariant decomposition are + Lorentz invariant. -/ +lemma repLorentzGroup_covComponent_eq {z : ℕ → JetAlgebra} + (hz : ∀ m, z m ∈ covMonomialSpan m) (Λ : SL(2,ℂ)) + (hx : repLorentzGroup Λ (∑ m ∈ Finset.range 9, z m) = + ∑ m ∈ Finset.range 9, z m) + {m : ℕ} (hm : m ∈ Finset.range 9) : + repLorentzGroup Λ (z m) = z m := by + have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, + ((r : ℂ)) ^ k • (repLorentzGroup Λ (z k) - z k) = 0 := by + intro r + have e1 : massWeightScale ((r : ℂ)) + (repLorentzGroup Λ (∑ k ∈ Finset.range 9, z k) - + ∑ k ∈ Finset.range 9, z k) = 0 := by + rw [hx, sub_self, map_zero] + rw [map_sum, map_sub, map_sum, map_sum] at e1 + calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • + (repLorentzGroup Λ (z k) - z k) + = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) + (repLorentzGroup Λ (z k))) - + ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [massWeightScale_ofReal_repLorentzGroup, + forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, + smul_sub] + _ = 0 := e1 + have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm + rwa [sub_eq_zero] at h0 + +/-- The weight components of a constant-gauge-invariant covariant decomposition + are constant-gauge invariant. -/ +lemma repJetGaugeGroupI_ofConstant_covComponent_eq {z : ℕ → JetAlgebra} + (hz : ∀ m, z m ∈ covMonomialSpan m) (g : GaugeGroupI) + (hx : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (∑ m ∈ Finset.range 9, z m) = ∑ m ∈ Finset.range 9, z m) + {m : ℕ} (hm : m ∈ Finset.range 9) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z m) = z m := by + have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) = 0 := by + intro r + have e1 : massWeightScale ((r : ℂ)) + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (∑ k ∈ Finset.range 9, z k) - ∑ k ∈ Finset.range 9, z k) = 0 := by + rw [hx, sub_self, map_zero] + rw [map_sum, map_sub, map_sum, map_sum] at e1 + calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) + = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k))) - + ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [massWeightScale_repJetGaugeGroupI_ofConstant, + forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, + smul_sub] + _ = 0 := e1 + have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm + rwa [sub_eq_zero] at h0 + +/-! + +## The low-weight sectors + +-/ + +/-- An element with two distinct exact weights vanishes. -/ +lemma eq_zero_of_eigen_ne {y : JetAlgebra} {m n : ℕ} + (hm : ∀ c : ℂ, massWeightScale c y = c ^ m • y) + (hn : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (hmn : m ≠ n) : y = 0 := by + have h : ((2 : ℂ) ^ m) • y = ((2 : ℂ) ^ n) • y := (hm 2).symm.trans (hn 2) + have h2 : ((2 : ℂ) ^ m - 2 ^ n) • y = 0 := + (sub_smul ((2 : ℂ) ^ m) ((2 : ℂ) ^ n) y).trans (by rw [h, sub_self]) + rcases smul_eq_zero.mp h2 with h3 | h3 + · exfalso + apply hmn + rw [sub_eq_zero] at h3 + have h4 : ((2 ^ m : ℕ) : ℂ) = ((2 ^ n : ℕ) : ℂ) := by + push_cast + exact h3 + exact Nat.pow_right_injective (le_refl 2) (Nat.cast_injective h4) + · exact h3 + +/-- Every covariant monomial is the unit or homogeneous of weight at least + three. -/ +lemma mem_closure_weight_cases {y : JetAlgebra} + (hy : y ∈ Submonoid.closure invariantGenerators) : + y = 1 ∨ ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c y = c ^ w • y := by + induction hy using Submonoid.closure_induction with + | mem z hz => + rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact Or.inr ⟨4 + 2 * Multiset.card p.1, by omega, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + · exact Or.inr ⟨3 + 2 * p.1.length, by omega, + fun c => massWeightScale_Dψ c p.1 p.2⟩ + · exact Or.inr ⟨3 + 2 * p.1.length, by omega, + fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + | one => exact Or.inl rfl + | mul a b ha hb iha ihb => + rcases iha with rfl | ⟨wa, hwa3, hwa⟩ + · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ + · exact Or.inl (one_mul (1 : JetAlgebra)) + · exact Or.inr ⟨wb, hwb3, fun c => by + rw [show (1 : JetAlgebra) * b = b from one_mul b] + exact hwb c⟩ + · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ + · exact Or.inr ⟨wa, hwa3, fun c => by + rw [show a * (1 : JetAlgebra) = a from mul_one a] + exact hwa c⟩ + · exact Or.inr ⟨wa + wb, by omega, massWeightScale_mul_eigen hwa hwb⟩ + +/-- The weight-zero covariant monomial span consists of the constants. -/ +lemma covMonomialSpan_zero_le : + covMonomialSpan 0 ≤ Submodule.span ℂ {(1 : JetAlgebra)} := by + rw [covMonomialSpan, Submodule.span_le] + rintro y ⟨hy, hy0⟩ + rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ + · exact Submodule.subset_span rfl + · rw [show y = 0 from eq_zero_of_eigen_ne hwe hy0 (by omega)] + exact Submodule.zero_mem _ + +/-- There are no covariant monomials of weights one or two. -/ +lemma covMonomialSpan_le_bot_of_lt_three {m : ℕ} (hm1 : 1 ≤ m) (hm2 : m < 3) : + covMonomialSpan m ≤ ⊥ := by + rw [covMonomialSpan, Submodule.span_le] + rintro y ⟨hy, hym⟩ + rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ + · have h1 : ∀ c : ℂ, massWeightScale c (1 : JetAlgebra) = c ^ 0 • 1 := + fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one + have := eq_zero_of_eigen_ne h1 hym (by omega) + simp [this] + · rw [show y = 0 from eq_zero_of_eigen_ne hwe hym (by omega)] + simp + +/-! + +## The parity selection rule + +Every covariant monomial is an eigenvector of the constant gauge action with a +hypercharge character whose parity equals that of its mass weight: bosonic +generators have even weight and charge zero, fermionic generators odd weight +and charge `±6`. The constant gauge transformation with `u(0) = i` therefore +acts on odd-weight monomials by `-1`, and no odd-weight sector contains a +gauge invariant. + +-/ + +/-- Every covariant monomial is an eigenvector of the constant gauge action, + with character exponent of the same parity as its mass weight. -/ +lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} + (hy : y ∈ Submonoid.closure invariantGenerators) : + ∃ (w : ℕ) (k : ℤ), k.natAbs ≤ w ∧ (w : ℤ) % 2 = k % 2 ∧ + (∀ c : ℂ, massWeightScale c y = c ^ w • y) ∧ + ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + (((g.2.2 : ℂ)) ^ (6 * k)) • y := by + have hz : ∀ g : GaugeGroupI, ((g.2.2 : ℂ)) ≠ 0 := by + intro g h + have h1 := (Unitary.mem_iff.mp (g.2.2).2).1 + rw [h, mul_zero] at h1 + exact zero_ne_one h1 + induction hy using Submonoid.closure_induction with + | mem z hzz => + rcases hzz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · refine ⟨4 + 2 * Multiset.card p.1, 0, by simp, by omega, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2, fun g => ?_⟩ + rw [repJetGaugeGroupI_fieldStrengthDeriv, mul_zero, zpow_zero, one_smul] + · refine ⟨3 + 2 * p.1.length, 1, by omega, by omega, + fun c => massWeightScale_Dψ c p.1 p.2, fun g => ?_⟩ + rw [repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, + SubmonoidClass.coe_pow, mul_one, + show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] + · refine ⟨3 + 2 * p.1.length, -1, by omega, by omega, + fun c => massWeightScale_Dbarψ c p.1 p.2, fun g => ?_⟩ + rw [repJetGaugeGroupI_Dbarψ, JetGaugeGroupI.eval_ofConstant, + Submonoid.smul_def, SubmonoidClass.coe_pow, Unitary.coe_star] + congr 1 + have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := + eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 + rw [hinv, show (6 : ℤ) * (-1) = -(6 : ℤ) from by ring, _root_.zpow_neg, + show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] + exact inv_pow _ 6 + | one => + refine ⟨0, 0, by simp, rfl, fun c => by + rw [pow_zero, one_smul]; exact (massWeightScale c).map_one, fun g => ?_⟩ + rw [mul_zero, zpow_zero, one_smul] + exact (repJetGaugeGroupI_eq_repAlgHom _ 1).trans + (repAlgHom (JetGaugeGroupI.ofConstant g)).map_one + | mul a b ha hb iha ihb => + obtain ⟨wa, ka, hba, hpa, hea, hga⟩ := iha + obtain ⟨wb, kb, hbb, hpb, heb, hgb⟩ := ihb + refine ⟨wa + wb, ka + kb, by + have := Int.natAbs_add_le ka kb + omega, by omega, massWeightScale_mul_eigen hea heb, fun g => ?_⟩ + rw [repJetGaugeGroupI_mul', hga g, hgb g, smul_mul_smul_comm, + show (6 : ℤ) * (ka + kb) = 6 * ka + 6 * kb from by ring, + zpow_add₀ (hz g)] + +/-- The constant gauge transformation with `u(0) = i`. -/ +noncomputable def parityGauge : GaugeGroupI := + (1, 1, ⟨Complex.I, by + rw [Unitary.mem_iff] + constructor <;> + simp [Complex.star_def, Complex.conj_I]⟩) + +/-- The parity gauge transformation acts by `-1` on every odd-weight covariant + monomial. -/ +lemma rep_parityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) + {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = -y := by + induction hy using Submodule.span_induction with + | mem u hu => + obtain ⟨hu1, hu2⟩ := hu + obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 + by_cases hu0 : u = 0 + · rw [hu0, map_zero, neg_zero] + · have hwm : w = m := by + by_contra hne + exact hu0 (eq_zero_of_eigen_ne he hu2 hne) + have hkodd : Odd k := by + rw [Int.odd_iff] + omega + rw [hg parityGauge, + show ((parityGauge.2.2 : ℂ)) = Complex.I from rfl, + show (6 : ℤ) * k = 2 * (3 * k) from by ring, _root_.zpow_mul, + show Complex.I ^ (2 : ℤ) = -1 from by + rw [show (2 : ℤ) = ((2 : ℕ) : ℤ) from rfl, zpow_natCast, Complex.I_sq], + show (-1 : ℂ) ^ (3 * k) = -1 from Odd.neg_one_zpow (by + rcases hkodd with ⟨j, hj⟩ + exact ⟨3 * j + 1, by omega⟩)] + exact neg_one_smul ℂ u + | zero => rw [map_zero, neg_zero] + | add u v hu hv ihu ihv => rw [map_add, ihu, ihv, neg_add] + | smul c u hu ihu => rw [map_smul, ihu, smul_neg] + +/-- Odd-weight covariant monomial spans contain no constant-gauge + invariants. -/ +lemma eq_zero_of_mem_covMonomialSpan_odd {m : ℕ} (hm : m % 2 = 1) + {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) + (hinv : repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = y) : + y = 0 := by + have h := (rep_parityGauge_eq_neg_of_mem_covMonomialSpan hm hy).symm.trans hinv + have h2 : (2 : ℂ) • y = 0 := by + calc (2 : ℂ) • y = y + y := two_smul ℂ y + _ = -y + y := congrArg (· + y) h.symm + _ = 0 := neg_add_cancel y + rcases smul_eq_zero.mp h2 with h3 | h3 + · exact absurd h3 two_ne_zero + · exact h3 + +/-! + +## The master selection rules + +An invariant which is also an eigenvector with a nontrivial eigenvalue must +vanish. Specialized to the constant gauge action at a root of unity this is the +hypercharge selection rule; specialized to diagonal Lorentz transformations it +kills the non-scalar Lorentz components. + +-/ + +/-- The master selection rule: an element that scales by a factor other than + one vanishes. -/ +lemma eq_zero_of_eq_smul_of_ne_one {y : JetAlgebra} {c : ℂ} + (h1 : y = c • y) (hc : c ≠ 1) : y = 0 := by + have h2 : (c - 1) • y = 0 := + (sub_smul c 1 y).trans (by rw [one_smul, ← h1, sub_self]) + rcases smul_eq_zero.mp h2 with h3 | h3 + · exact absurd (sub_eq_zero.mp h3) hc + · exact h3 + +/-- The unit-circle exponential is unitary. -/ +lemma exp_mul_I_mem_unitary (θ : ℝ) : + Complex.exp ((θ : ℂ) * Complex.I) ∈ unitary ℂ := by + have hstar : star (Complex.exp ((θ : ℂ) * Complex.I)) = + Complex.exp (-((θ : ℂ) * Complex.I)) := by + rw [show star (Complex.exp ((θ : ℂ) * Complex.I)) = + (starRingEnd ℂ) (Complex.exp ((θ : ℂ) * Complex.I)) from rfl, + ← Complex.exp_conj] + congr 1 + simp [Complex.conj_ofReal] + rw [Unitary.mem_iff] + constructor + · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] + · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero] + +/-- The constant `U(1)` gauge transformation at a unitary scalar. -/ +noncomputable def u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : GaugeGroupI := + (1, 1, ⟨z, hz⟩) + +/-- The hypercharge selection rule: a constant-gauge eigenvector of nonzero + charge admits no invariant. -/ +lemma eq_zero_of_charge_ne_zero {y : JetAlgebra} {k : ℤ} (hk : k ≠ 0) + (hy : ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + ((g.2.2 : ℂ)) ^ (6 * k) • y) + (hinv : ∀ g : GaugeGroupI, + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : y = 0 := by + have h6k : ((6 * k : ℤ) : ℝ) ≠ 0 := by + simp only [ne_eq, Int.cast_eq_zero] + omega + set θ : ℝ := Real.pi / ((6 * k : ℤ) : ℝ) with hθ + set g : GaugeGroupI := u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) + (exp_mul_I_mem_unitary θ) with hg + have hval : ((g.2.2 : ℂ)) = Complex.exp ((θ : ℂ) * Complex.I) := rfl + have hchar : ((g.2.2 : ℂ)) ^ (6 * k) = -1 := by + rw [hval, ← Complex.exp_int_mul, + show ((6 * k : ℤ) : ℂ) * ((θ : ℂ) * Complex.I) = + (((6 * k : ℤ) : ℝ) * θ : ℝ) * Complex.I from by push_cast; ring, + show ((6 * k : ℤ) : ℝ) * θ = Real.pi from mul_div_cancel₀ Real.pi h6k ▸ rfl] + exact Complex.exp_pi_mul_I + exact eq_zero_of_eq_smul_of_ne_one + ((hinv g).symm.trans ((hy g).trans (by rw [hchar]))) + (by + intro h + norm_num at h) + +/-! + +## Charge decomposition + +The constant gauge characters at distinct charges are linearly independent +along the unit circle, so every element of a weight sector decomposes into +charge components, and a constant-gauge invariant equals its neutral component. + +-/ + +/-- The unit-circle exponentials are injective on `(0, 1)`. -/ +lemma exp_mul_I_injOn : + Set.InjOn (fun θ : ℝ => Complex.exp ((θ : ℂ) * Complex.I)) + (Set.Ioo (0 : ℝ) 1) := by + intro a ha b hb hab + rcases Complex.exp_eq_exp_iff_exists_int.mp hab with ⟨n, hn⟩ + have h2 : (a : ℂ) = (b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ)) := by + have h1 : (a : ℂ) * Complex.I = + ((b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ))) * Complex.I := by + rw [hn] + ring + exact mul_right_cancel₀ Complex.I_ne_zero h1 + have h3 : a = b + (n : ℝ) * (2 * Real.pi) := by exact_mod_cast h2 + have hn0 : n = 0 := by + by_contra hne + have h4 : (1 : ℝ) ≤ |(n : ℝ)| := by exact_mod_cast Int.one_le_abs hne + have hπ : (2 : ℝ) ≤ Real.pi := Real.two_le_pi + have h5 : |a - b| < 1 := by + rw [abs_sub_lt_iff] + constructor <;> nlinarith [ha.1, ha.2, hb.1, hb.2] + rw [h3] at h5 + simp only [add_sub_cancel_left] at h5 + rw [abs_mul, abs_of_pos (by positivity : (0 : ℝ) < 2 * Real.pi)] at h5 + nlinarith + rw [hn0] at h3 + push_cast at h3 + linarith + +/-- Independence of the circle characters: a finite Laurent combination + vanishing on the unit circle has vanishing coefficients. -/ +lemma eq_zero_of_forall_circle_sum_zpow_smul_eq_zero (s : Finset ℤ) + (v : ℤ → JetAlgebra) + (h : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0) + {k : ℤ} (hk : k ∈ s) : v k = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hne : s.Nonempty := ⟨k, hk⟩ + set n₀ : ℤ := -s.min' hne with hn₀ + have hshift : ∀ j ∈ s, 0 ≤ j + n₀ := fun j hj => by + have := s.min'_le j hj + omega + have heval : ∀ θ : ℝ, Polynomial.eval (Complex.exp ((θ : ℂ) * Complex.I)) + (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by + intro θ + have hz0 : Complex.exp ((θ : ℂ) * Complex.I) ≠ 0 := Complex.exp_ne_zero _ + have h2 := congrArg φ (h θ) + rw [map_sum, map_zero] at h2 + have h3 : ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by + rw [← h2] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl + have h4 : Complex.exp ((θ : ℂ) * Complex.I) ^ n₀ * + ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by + rw [h3, mul_zero] + rw [Finset.mul_sum] at h4 + rw [Polynomial.eval_finsetSum, ← h4] + refine Finset.sum_congr rfl fun j hj => ?_ + rw [Polynomial.eval_monomial, + show Complex.exp ((θ : ℂ) * Complex.I) ^ (j + n₀).toNat = + Complex.exp ((θ : ℂ) * Complex.I) ^ ((j + n₀) : ℤ) from by + rw [← zpow_natCast, Int.toNat_of_nonneg (hshift j hj)], + zpow_add₀ hz0] + ring + have hzero : (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by + refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ + refine Set.Infinite.mono ?_ + ((Set.Ioo_infinite (by norm_num : (0 : ℝ) < 1)).image exp_mul_I_injOn) + rintro z ⟨θ, _, rfl⟩ + exact heval θ + have hcoeff := congrArg (fun p => Polynomial.coeff p (k + n₀).toNat) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + rw [Finset.sum_eq_single k + (fun j hj hjk => by + rw [Polynomial.coeff_monomial, if_neg (fun heq => hjk (by + have h1 : j + n₀ = k + n₀ := by + rw [← Int.toNat_of_nonneg (hshift j hj), + ← Int.toNat_of_nonneg (hshift k hk), heq] + omega))]) + (fun hks => absurd hk hks)] at hcoeff + simpa [Polynomial.coeff_monomial] using hcoeff + +/-- The charge-`6k` part of a weight sector: the span of the covariant + monomials of weight `m` and hypercharge `6 k`. -/ +noncomputable def chargeCovSpan (m : ℕ) (k : ℤ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ + (∀ c : ℂ, massWeightScale c y = c ^ m • y) ∧ + ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + ((g.2.2 : ℂ)) ^ (6 * k) • y} + +/-- Elements of the charge component are eigenvectors of the constant gauge + action. -/ +lemma forall_rep_ofConstant_of_mem_chargeCovSpan {m : ℕ} {k : ℤ} + {y : JetAlgebra} (hy : y ∈ chargeCovSpan m k) (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + ((g.2.2 : ℂ)) ^ (6 * k) • y := by + induction hy using Submodule.span_induction with + | mem u hu => exact hu.2.2 g + | zero => simp + | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] + | smul c a ha iha => rw [map_smul, iha, smul_comm] + +/-- The charge components sit inside the weight sector. -/ +lemma chargeCovSpan_le_covMonomialSpan {m : ℕ} {k : ℤ} : + chargeCovSpan m k ≤ covMonomialSpan m := + Submodule.span_mono fun y hy => ⟨hy.1, hy.2.1⟩ + +/-- Charge decomposition within a weight sector. -/ +lemma exists_charge_decomp_of_mem_covMonomialSpan {m : ℕ} {y : JetAlgebra} + (hy : y ∈ covMonomialSpan m) : + ∃ v : ℤ → JetAlgebra, (∀ j, v j ∈ chargeCovSpan m j) ∧ + y = ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), v j := by + induction hy using Submodule.span_induction with + | mem u hu => + obtain ⟨hu1, hu2⟩ := hu + obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 + by_cases hu0 : u = 0 + · exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp [hu0]⟩ + · have hwm : w = m := by + by_contra hne + exact hu0 (eq_zero_of_eigen_ne he hu2 hne) + have hkm : k ∈ Finset.Icc (-(m : ℤ)) (m : ℤ) := by + rw [Finset.mem_Icc] + omega + refine ⟨fun j => if j = k then u else 0, fun j => ?_, ?_⟩ + · by_cases hjk : j = k + · subst hjk + rw [if_pos rfl] + exact Submodule.subset_span ⟨hu1, hu2, hg⟩ + · rw [if_neg hjk] + exact Submodule.zero_mem _ + · rw [show (∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), + (fun j => if j = k then u else 0) j) = + ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), (if j = k then u else 0) from rfl, + Finset.sum_ite_eq' _ k fun _ => u, if_pos hkm] + | zero => + exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp⟩ + | add a b ha hb iha ihb => + obtain ⟨v₁, hv₁, rfl⟩ := iha + obtain ⟨v₂, hv₂, rfl⟩ := ihb + exact ⟨v₁ + v₂, fun j => Submodule.add_mem _ (hv₁ j) (hv₂ j), + by rw [← Finset.sum_add_distrib]; rfl⟩ + | smul c a ha iha => + obtain ⟨v, hv, rfl⟩ := iha + exact ⟨c • v, fun j => Submodule.smul_mem _ _ (hv j), + by rw [Finset.smul_sum]; rfl⟩ + +/-- The classification of the renormalizable QED Lagrangian densities: the + gauge- and Lorentz-invariant elements of mass weight at most eight are spanned + by the constants, the Maxwell term, the theta term, and the two fermion + kinetic terms. + + The inclusion `⊇` is `span_massDimFourInvariants_le`: each of the five + elements is invariant and of weight at most eight. + + The completeness direction `⊆` is proved as follows. + 1. By `InvariantSubmodule.mem_iff_isInvariant` and + `isInvariant_iff_mem_adjoin_invariantGenerators`, an invariant `x` of + weight at most eight lies in the algebra generated by the covariant + generators, is fixed by the jets of constant gauge transformations, and is + Lorentz invariant. + 2. Graded decomposition (`exists_covMonomialSpan_decomp`): `x` is a sum of + nine components `z m ∈ covMonomialSpan m` of exact weights `0, …, 8`, + using the homogeneity of the covariant monomials and the linear + independence of the powers `c ↦ c ^ m` + (`eq_zero_of_forall_sum_pow_smul_eq_zero`). + 3. Componentwise invariance: the mass-dimension scaling commutes with the + Lorentz action and with the constant gauge action, so each component + `z m` inherits both invariances, again by independence of powers. + 4. Sector analysis. `m = 0`: the weight-zero monomial span is the constants. + `m = 1, 2`: there are no covariant monomials of these weights, since the + generators have weights at least three. Odd `m = 3, 5, 7`: odd weight + forces an odd number of fermionic factors, and the constant gauge + transformation with `u(0) = i` acts on such a monomial by + `(i⁶)^{n_ψ} ((-i)⁶)^{n_ψ̄} = (-1)^{n_ψ + n_ψ̄} = -1`, so invariance forces + `z m = 0`. `m = 4, 6`: after splitting off the hypercharge `±12` sectors + with a further root of unity, the surviving monomials (`F_{μν}`; + `∂_ρ F_{μν}` and the zero-derivative fermion pairs `ψ̄_α ψ_β`) admit no + Lorentz invariant. `m = 8`: the charge-balanced monomials are `F · F`, + `∂∂F`, and the one-derivative fermion pairs; their Lorentz invariants are + spanned by the Maxwell term, the theta term, and the two σ-contracted + kinetic terms. + + Steps 3–4 remain to be formalized: they require the commutation of the + scaling with the two group actions at the QED level, the linear independence + of the covariant monomials, and the invariant theory of `SL(2,ℂ)` on the + finite-dimensional weight sectors. -/ lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : InvariantMassWeightSubmodule 8 = Submodule.span ℂ massDimFourInvariants := by + refine le_antisymm ?_ span_massDimFourInvariants_le + -- Completeness: every invariant of mass weight at most eight is a combination + -- of the four kinetic terms and the constants. TODO: requires (i) the weight + -- and hypercharge selection rules to reduce to the finite-dimensional space of + -- weight-`≤ 8`, charge-balanced covariant monomials, via the characterization + -- `isInvariant_iff_mem_adjoin_invariantGenerators`, and (ii) the classical + -- invariant theory of the Lorentz group on that space. sorry end JetAlgebra diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 13b03e12e..856bd71e1 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -516,6 +516,13 @@ lemma shift_dψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fi lemma shift_dbarψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : shift μ (dbarψ s α) = dbarψ (s + {μ}) α := rfl +/-- Appending a derivative index raises the mass weight by two: a derivative has + mass dimension one. -/ +@[simp] +lemma massWeight_shift (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + (shift μ j).massWeight = j.massWeight + 2 := by + cases j <;> simp [shift, massWeight] <;> omega + end JetGenerators /-- The formal total spacetime derivative on the space of component functions of @@ -547,6 +554,22 @@ lemma JetComponentSpace.massWeightScale_basis (c : ℂ) (j : JetGenerators) : c ^ j.massWeight • JetComponentSpace.basis j := by rw [JetComponentSpace.massWeightScale, Module.Basis.constr_basis] +/-- The total derivative raises the mass weight by two on the component space: + the scaling and the derivative commute up to `c ^ 2`. -/ +lemma JetComponentSpace.massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace) : + JetComponentSpace.massWeightScale c (JetComponentSpace.jetDeriv μ v) = + c ^ 2 • JetComponentSpace.jetDeriv μ (JetComponentSpace.massWeightScale c v) := by + have h : JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.jetDeriv μ = + c ^ 2 • (JetComponentSpace.jetDeriv μ ∘ₗ JetComponentSpace.massWeightScale c) := by + refine JetComponentSpace.basis.ext fun j => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.smul_apply, + JetComponentSpace.jetDeriv_basis, JetComponentSpace.massWeightScale_basis, + map_smul, JetGenerators.massWeight_shift, smul_smul, ← pow_add] + congr 1 + ring + exact DFunLike.congr_fun h v + /-- The mass-dimension scaling commutes with the action of jets of constant gauge transformations on the component space: the constant action is diagonal on the generator basis, with no derivative mixing. For a non-constant jet the @@ -1040,6 +1063,31 @@ lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : rw [ofGenerator, massWeightScale_apply, ExteriorAlgebra.map_apply_ι, JetComponentSpace.massWeightScale_basis, map_smul] +@[simp] +lemma massWeightScale_ι (c : ℂ) (v : JetComponentSpace) : + massWeightScale c (ExteriorAlgebra.ι ℂ v) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.massWeightScale c v) := by + rw [massWeightScale_apply, ExteriorAlgebra.map_apply_ι] + +set_option maxHeartbeats 1000000 in +/-- The total derivative raises the mass weight by two: the scaling and the + derivative commute up to `c ^ 2`. -/ +lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + simp [Algebra.algebraMap_eq_smul_one] + | ι v => + rw [jetDeriv_ι, massWeightScale_ι, JetComponentSpace.massWeightScale_jetDeriv, + map_smul, massWeightScale_ι, jetDeriv_ι] + | mul x y hx hy => + have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = + massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b + rw [jetDeriv_mul, map_add, hm, hm, hm, hx, hy, smul_mul_assoc, mul_smul_comm, + jetDeriv_mul, smul_add] + | add x y hx hy => + simp only [map_add, hx, hy, smul_add] + /-- The mass-dimension scaling commutes with the gauge action of jets of constant gauge transformations. This fails for a general jet: the gauge action sends `∂ψ` to `u(0)⁶ ∂ψ + (∂u⁶)(0) ψ + …`, mixing derivative degrees diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 80be60dd2..1f47567c5 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -50,7 +50,7 @@ open TensorProduct @[ext] structure BBoson where /-- The Lorentz index together with the adjoint (hermitian) factor. -/ - val : Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ + val : Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ namespace BBoson open Module @@ -59,7 +59,7 @@ open Module ## B. Linear structure -/ -def valEquiv : BBoson ≃ Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ where +def valEquiv : BBoson ≃ Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ where toFun := val invFun := fun m => ⟨m⟩ @@ -68,7 +68,7 @@ noncomputable instance : AddCommGroup BBoson := Equiv.addCommGroup valEquiv noncomputable instance : Module ℝ BBoson := Equiv.module ℝ valEquiv /-- The linear identification with the underlying tensor product. -/ -def valLinEquiv : BBoson ≃ₗ[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ where +def valLinEquiv : BBoson ≃ₗ[ℝ] Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ where toFun := val invFun := fun m => ⟨m⟩ map_add' := by intros; rfl @@ -77,7 +77,7 @@ def valLinEquiv : BBoson ≃ₗ[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ whe @[simp] lemma valLinEquiv_apply (d : BBoson) : valLinEquiv d = d.val := rfl -lemma valLinEquiv_symm_apply (m : Lorentz.Vector ⊗[ℝ] selfAdjoint ℂ) : +lemma valLinEquiv_symm_apply (m : Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ) : valLinEquiv.symm m = ⟨m⟩ := rfl @[simp] @@ -93,7 +93,7 @@ lemma val_zero : (0 : BBoson).val = 0 := rfl Lorentz-vector basis tensored with the hermitian unit of the one-dimensional adjoint factor. -/ noncomputable def basis : Basis (Fin 1 ⊕ Fin 3) ℝ BBoson := - ((Lorentz.Vector.basis.tensorProduct + ((Lorentz.CoVector.basis.tensorProduct ((Module.Basis.singleton Unit ℝ).map Complex.selfAdjointEquiv.symm)).map valLinEquiv.symm).reindex (Equiv.prodPUnit (Fin 1 ⊕ Fin 3)) @@ -101,7 +101,7 @@ noncomputable def basis : Basis (Fin 1 ⊕ Fin 3) ℝ BBoson := with the hermitian unit. -/ lemma basis_apply (ν : Fin 1 ⊕ Fin 3) : (basis ν : BBoson) = - ⟨Lorentz.Vector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ := by + ⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ := by rw [basis, Module.Basis.reindex_apply, Module.Basis.map_apply, Module.Basis.tensorProduct_apply', Module.Basis.map_apply, Module.Basis.singleton_apply, valLinEquiv_symm_apply] @@ -110,12 +110,12 @@ lemma basis_apply (ν : Fin 1 ⊕ Fin 3) : /-- A pure tensor of a Lorentz basis vector with a hermitian value is a multiple of the corresponding B-boson basis vector. -/ lemma mk_tmul_eq_smul_basis (ν : Fin 1 ⊕ Fin 3) (x : selfAdjoint ℂ) : - (⟨Lorentz.Vector.basis ν ⊗ₜ[ℝ] x⟩ : BBoson) = + (⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] x⟩ : BBoson) = Complex.selfAdjointEquiv x • basis ν := by apply BBoson.ext rw [val_smul, basis_apply, - show ((⟨Lorentz.Vector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ : BBoson)).val = - Lorentz.Vector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from rfl, + show ((⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ : BBoson)).val = + Lorentz.CoVector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from rfl, ← TensorProduct.tmul_smul] congr 1 rw [show (Complex.selfAdjointEquiv x) • (Complex.selfAdjointEquiv.symm 1) = @@ -136,7 +136,7 @@ open Matrix MatrixGroups action on the adjoint factor. -/ noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) BBoson where toFun Λ := valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ)) + TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup Λ)) (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) Λ) ∘ₗ valLinEquiv.toLinearMap map_one' := by @@ -184,13 +184,13 @@ open MvPowerSeries JetRing is affine rather than linear, which is why it is a `MulAction` and not a `Representation`. -/ noncomputable instance : SMul JetGaugeGroupI BBoson where - smul U B := repGaugeGroupI U.eval B + ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ + smul U B := repGaugeGroupI U.eval B + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ lemma smul_eq (U : JetGaugeGroupI) (B : BBoson) : U • B = B + - ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ := rfl + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ := rfl lemma smul_val (U : JetGaugeGroupI) (B : BBoson) : - (U • B).val = B.val + ∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0 := by + (U • B).val = B.val + ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0 := by rfl /-- The jets of constant (global) gauge transformations act trivially on the B @@ -307,6 +307,15 @@ def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators lemma shift_dB (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : shift μ (dB s ν) = dB (s + {μ}) ν := rfl +/-- Appending a derivative index raises the mass weight by two: a derivative has + mass dimension one. -/ +@[simp] +lemma massWeight_shift (μ : Fin 1 ⊕ Fin 3) (g : JetGenerators) : + (shift μ g).massWeight = g.massWeight + 2 := by + cases g + simp [shift, massWeight] + omega + /-- The jet generator with further derivatives appended from a multiset. -/ def shiftMulti (t : Multiset (Fin 1 ⊕ Fin 3)) : JetGenerators → JetGenerators | dB s ν => dB (s + t) ν @@ -385,7 +394,7 @@ open LagrangianTheory noncomputable def mcPairing (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => - ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩)) + ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩)) /-- The multiset basis of the dual derivative symbols, as a basis vector of the symmetric algebra at the corresponding multi-index. -/ @@ -408,7 +417,7 @@ lemma jetComponentSpace_basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 lemma mcPairing_tmul_basis (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ BBoson) : mcPairing U (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] φ) = - φ ⟨∑ ν, Lorentz.Vector.basis ν ⊗ₜ[ℝ] + φ ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν (Multiset.toFinsupp s))⟩ := by rw [dualRealJetAlgebraBasis_apply', mcPairing] @@ -424,15 +433,15 @@ lemma mcPairing_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s)) := by rw [jetComponentSpace_basis_dB, mcPairing_tmul_basis, - show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + show (⟨∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = ∑ ν', ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))) • basis ν' from by - rw [show (⟨∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + rw [show (⟨∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = - valLinEquiv.symm (∑ ν', Lorentz.Vector.basis ν' ⊗ₜ[ℝ] + valLinEquiv.symm (∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))) from rfl, map_sum] refine Finset.sum_congr rfl fun ν' _ => ?_ @@ -1843,6 +1852,462 @@ lemma massWeightScale_tmul_ofGenerator (c z : ℂ) (j : JetGenerators) : mul_one, one_mul] rfl +set_option maxHeartbeats 1000000 in +/-- The complexified total derivative raises the mass weight by two: the scaling + and the derivative commute up to `c ^ 2`. -/ +lemma massWeightScale_jetDeriv_baseChange (c : ℂ) (μ : Fin 1 ⊕ Fin 3) + (x : ℂ ⊗[ℝ] JetAlgebra) : + massWeightScale c (LinearMap.baseChange ℂ (jetDeriv μ) x) = + c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) (massWeightScale c x) := by + have hm : ∀ a b : ℂ ⊗[ℝ] JetAlgebra, massWeightScale c (a * b) = + massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b + have hone : ∀ b : JetAlgebra, + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) = + c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b)) := by + intro b + induction b using SymmetricAlgebra.induction with + | algebraMap r => + have hd : jetDeriv μ (algebraMap ℝ JetAlgebra r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] + have h1 : (1 : ℂ) ⊗ₜ[ℝ] algebraMap ℝ JetAlgebra r = + algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (algebraMap ℝ ℂ r) := by + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, + ← algebraMap_smul (R := ℝ) ℂ r ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)), + Algebra.algebraMap_eq_smul_one (R := ℂ) (A := ℂ ⊗[ℝ] JetAlgebra)] + rfl + have hD1 : LinearMap.baseChange ℂ (jetDeriv μ) + ((1 : ℂ) ⊗ₜ[ℝ] algebraMap ℝ JetAlgebra r) = 0 := by + rw [LinearMap.baseChange_tmul, hd, TensorProduct.tmul_zero] + rw [hd, TensorProduct.tmul_zero, map_zero, h1, AlgHom.commutes, + show algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (algebraMap ℝ ℂ r) = + (1 : ℂ) ⊗ₜ[ℝ] algebraMap ℝ JetAlgebra r from h1.symm, hD1, smul_zero] + | ι v => + have h : ((massWeightScale c).toLinearMap.restrictScalars ℝ) ∘ₗ + (TensorProduct.mk ℝ ℂ JetAlgebra 1) ∘ₗ (jetDeriv μ) ∘ₗ + (SymmetricAlgebra.ι ℝ JetComponentSpace) = + c ^ 2 • (((LinearMap.baseChange ℂ (jetDeriv μ)).restrictScalars ℝ) ∘ₗ + ((massWeightScale c).toLinearMap.restrictScalars ℝ) ∘ₗ + (TensorProduct.mk ℝ ℂ JetAlgebra 1) ∘ₗ + (SymmetricAlgebra.ι ℝ JetComponentSpace)) := by + refine JetComponentSpace.basis.ext fun g => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.smul_apply, + LinearMap.coe_restrictScalars, AlgHom.toLinearMap_apply, + TensorProduct.mk_apply] + rw [show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g) = + ofGenerator g from rfl, jetDeriv_ofGenerator, + massWeightScale_tmul_ofGenerator, massWeightScale_tmul_ofGenerator, + map_smul, jetDeriv_baseChange_ofGenerator, JetGenerators.massWeight_shift, + smul_smul, ← pow_add] + congr 1 + ring + exact DFunLike.congr_fun h v + | mul a b ha hb => + have h₁ : (1 : ℂ) ⊗ₜ[ℝ] (jetDeriv μ a * b) = + ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ a) * ((1 : ℂ) ⊗ₜ[ℝ] b) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] + have h₂ : (1 : ℂ) ⊗ₜ[ℝ] (a * jetDeriv μ b) = + ((1 : ℂ) ⊗ₜ[ℝ] a) * ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] + have h₃ : (1 : ℂ) ⊗ₜ[ℝ] (a * b) = + ((1 : ℂ) ⊗ₜ[ℝ] a) * ((1 : ℂ) ⊗ₜ[ℝ] b) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] + calc massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ (a * b)) + = massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] (jetDeriv μ a * b) + + (1 : ℂ) ⊗ₜ[ℝ] (a * jetDeriv μ b)) := by + rw [jetDeriv_mul, TensorProduct.tmul_add] + _ = massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ a) * + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) + + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := by + rw [map_add, h₁, h₂, hm, hm] + _ = (c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a))) * + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) + + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * + (c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := by + rw [ha, hb] + _ = c ^ 2 • (LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a)) * + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) + + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * + LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := by + rw [smul_mul_assoc, mul_smul_comm, smul_add] + _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b)) := by + rw [jetDeriv_baseChange_mul] + _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] (a * b))) := by + rw [h₃, hm] + | add a b ha hb => + simp only [map_add, TensorProduct.tmul_add, ha, hb, smul_add] + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + | tmul z b => + have hz₁ : z ⊗ₜ[ℝ] jetDeriv μ b = z • ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one] + have hz₂ : massWeightScale c (z ⊗ₜ[ℝ] b) = + z • massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) := by + rw [show z ⊗ₜ[ℝ] b = z • ((1 : ℂ) ⊗ₜ[ℝ] b) from by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one]] + exact map_smul (massWeightScale c) z _ + calc massWeightScale c (LinearMap.baseChange ℂ (jetDeriv μ) (z ⊗ₜ[ℝ] b)) + = massWeightScale c (z • ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b)) := by + rw [LinearMap.baseChange_tmul, hz₁] + _ = z • massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := + map_smul (massWeightScale c) z _ + _ = z • (c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := by rw [hone b] + _ = c ^ 2 • (z • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := smul_comm z _ _ + _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (z • massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b)) := by + rw [(LinearMap.baseChange ℂ (jetDeriv μ)).map_smul] + _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) + (massWeightScale c (z ⊗ₜ[ℝ] b)) := + congrArg (fun y => c ^ 2 • + LinearMap.baseChange ℂ (jetDeriv μ) y) hz₂.symm + +end JetAlgebra + +/-! + +## Lorentz transformation laws of the B-boson jet coordinates + +-/ + +/-- The Lorentz action on the B-boson basis: the covector transformation. -/ +lemma repLorentzGroup_basis (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (basis μ) = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1⁻¹ μ j • basis j := by + have happ : repLorentzGroup Λ (basis μ) = valLinEquiv.symm.toLinearMap + (TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup Λ)) + (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) Λ) + (valLinEquiv.toLinearMap (basis μ))) := rfl + rw [happ, show valLinEquiv.toLinearMap (basis μ) = + Lorentz.CoVector.basis μ ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from by + rw [basis_apply]; rfl, + TensorProduct.map_tmul, Lorentz.CoVector.rep_apply_basis, + Representation.trivial_apply, TensorProduct.sum_tmul, map_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [← TensorProduct.smul_tmul', map_smul] + congr 1 + rw [show valLinEquiv.symm.toLinearMap (Lorentz.CoVector.basis j ⊗ₜ[ℝ] + Complex.selfAdjointEquiv.symm 1) = (⟨Lorentz.CoVector.basis j ⊗ₜ[ℝ] + Complex.selfAdjointEquiv.symm 1⟩ : BBoson) from rfl, ← basis_apply] + +/-- The jet coordinates of the B boson transform contravariantly on the target + index, by the columns of the Lorentz matrix, matching the derivative slots. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup.dual Λ (basis.dualBasis ν) = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1 j ν • basis.dualBasis j := by + refine Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => (Lorentz.SL2C.toLorentzGroup Λ).1 j l) (fun j => ?_) + rw [repLorentzGroup_basis, ← LorentzGroup.coe_inv, map_inv, inv_inv] + rfl + +/-- The multiset basis of the real dual derivative slots at a singleton index. -/ +lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : + LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis μ) := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (Finsupp.single μ 1) = + MvPolynomial.X μ := rfl + rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, + Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + Finsupp.single μ 1 by simp, + Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] + simp + +/-- The multiset basis of the real dual derivative slots at the empty index. -/ +lemma dualRealJetAlgebraBasis_nil : + LagrangianTheory.dualRealJetAlgebraBasis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) + ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) = 1 := by + rw [MvPolynomial.coe_basisMonomials] + simp [MvPolynomial.monomial_zero'] + rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, + Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({} : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp, + Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] + simp + +/-- The multiset basis vectors of the real dual derivative slots multiply by + adding the multisets. -/ +lemma dualRealJetAlgebraBasis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : + LagrangianTheory.dualRealJetAlgebraBasis s * + LagrangianTheory.dualRealJetAlgebraBasis t = + LagrangianTheory.dualRealJetAlgebraBasis (s + t) := by + rw [dualRealJetAlgebraBasis_apply', dualRealJetAlgebraBasis_apply', + dualRealJetAlgebraBasis_apply', map_add] + simp only [Module.Basis.symmetricAlgebra, Module.Basis.map_apply, + show ∀ p, (SymmetricAlgebra.equivMvPolynomial + Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = + (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p + from fun _ => rfl, + ← map_mul, MvPolynomial.coe_basisMonomials] + simp only [MvPolynomial.monomial_mul, mul_one] + +/-- The degree scaling multiplies the multiset basis vector at `s` by + `t ^ |s|`. -/ +lemma gradeScale_dualRealJetAlgebraBasis (t : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) : + DerivAlgebraReal.gradeScale t (LagrangianTheory.dualRealJetAlgebraBasis s) = + t ^ Multiset.card s • LagrangianTheory.dualRealJetAlgebraBasis s := by + induction s using Multiset.induction_on with + | empty => + rw [show LagrangianTheory.dualRealJetAlgebraBasis + (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 from dualRealJetAlgebraBasis_nil, map_one] + simp + | cons a s ih => + rw [← Multiset.singleton_add, ← dualRealJetAlgebraBasis_mul, map_mul, ih, + dualRealJetAlgebraBasis_singleton, DerivAlgebraReal.gradeScale_ι, + smul_mul_smul_comm, ← _root_.pow_succ', ← dualRealJetAlgebraBasis_singleton, + dualRealJetAlgebraBasis_mul, Multiset.singleton_add, Multiset.card_cons] + +/-- The mass-dimension scaling commutes with the Lorentz action on the B-boson + component space: the Lorentz action preserves the derivative degree. -/ +lemma JetComponentSpace.massWeightScale_repLorentzGroup (c : ℝ) (Λ : SL(2,ℂ)) : + JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.repLorentzGroup Λ = + JetComponentSpace.repLorentzGroup Λ ∘ₗ JetComponentSpace.massWeightScale c := by + have hfact : JetComponentSpace.massWeightScale c = + TensorProduct.map (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap + (c ^ 2 • LinearMap.id) := by + refine JetComponentSpace.basis.ext fun j => ?_ + cases j with + | dB s ν => + have hscal : (c : ℝ) ^ (JetGenerators.dB s ν).massWeight = + c ^ 2 * (c ^ 2) ^ Multiset.card s := by + show c ^ (2 * (1 + Multiset.card s)) = _ + rw [pow_mul] + ring + rw [JetComponentSpace.massWeightScale_basis, hscal] + simp only [jetComponentSpace_basis_dB, TensorProduct.map_tmul, + AlgHom.toLinearMap_apply, LinearMap.smul_apply, LinearMap.id_apply, + gradeScale_dualRealJetAlgebraBasis, TensorProduct.tmul_smul, + TensorProduct.smul_tmul', smul_smul] + have hA : (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap ∘ₗ + DerivAlgebraReal.repLorentzGroup Λ = + (DerivAlgebraReal.repLorentzGroup Λ : + DerivAlgebraReal →ₗ[ℝ] DerivAlgebraReal) ∘ₗ + (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap := + LinearMap.ext fun a => DerivAlgebraReal.gradeScale_repLorentzGroup (c ^ 2) Λ a + have hB : (c ^ 2 • (LinearMap.id : Module.End ℝ (Module.Dual ℝ BBoson))) ∘ₗ + BBoson.repLorentzGroup.dual Λ = + BBoson.repLorentzGroup.dual Λ ∘ₗ (c ^ 2 • LinearMap.id) := by + rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, + LinearMap.comp_id] + rw [hfact, show JetComponentSpace.repLorentzGroup Λ = + TensorProduct.map (DerivAlgebraReal.repLorentzGroup Λ) + (BBoson.repLorentzGroup.dual Λ) from rfl, + ← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB] + +set_option maxHeartbeats 1000000 in +/-- The Lorentz action on the first-order B-boson jet coordinates: both indices + transform contravariantly, by the columns of the Lorentz matrix. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dB_singleton (Λ : SL(2,ℂ)) + (μ ν : Fin 1 ⊕ Fin 3) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dB {μ} ν)) = + ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) • + JetComponentSpace.basis (.dB {a} b) := by + have happ : JetComponentSpace.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {μ} ⊗ₜ[ℝ] BBoson.basis.dualBasis ν) = + (DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {μ})) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ (BBoson.basis.dualBasis ν)) := rfl + rw [jetComponentSpace_basis_dB, happ, dualRealJetAlgebraBasis_singleton, + DerivAlgebraReal.repLorentzGroup_apply_ι, Lorentz.CoVector.sl2Rep_dual_dualBasis, + BBoson.repLorentzGroup_dual_dualBasis] + simp only [map_sum, map_smul, TensorProduct.sum_tmul, TensorProduct.tmul_sum, + TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, smul_smul, + jetComponentSpace_basis_dB, dualRealJetAlgebraBasis_singleton] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + congr 2 + ring + +namespace JetAlgebra + +/-- The Lorentz action on a jet-algebra generator. -/ +@[simp] +lemma repLorentzGroup_apply_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace) : + repLorentzGroup Λ (SymmetricAlgebra.ι ℝ JetComponentSpace x) = + SymmetricAlgebra.ι ℝ JetComponentSpace + (JetComponentSpace.repLorentzGroup Λ x) := by + simp [repLorentzGroup] + +set_option maxHeartbeats 1000000 in +/-- The zeroth-order field strength transforms as an antisymmetric two-tensor: + the Lorentz action preserves the span of the field strengths. -/ +lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) = + ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) • fieldStrengthDeriv {} a b := by + have hFS : ∀ a b : Fin 1 ⊕ Fin 3, fieldStrengthDeriv ({} : Multiset _) a b = + ofGenerator (JetGenerators.dB {a} b) - + ofGenerator (JetGenerators.dB {b} a) := by + intro a b + rw [fieldStrengthDeriv, + show ({} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {a} from by simp, + show ({} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {b} from by simp] + simp only [hFS] + rw [map_sub, ofGenerator, ofGenerator, repLorentzGroup_apply_ι, + repLorentzGroup_apply_ι, JetComponentSpace.repLorentzGroup_basis_dB_singleton, + JetComponentSpace.repLorentzGroup_basis_dB_singleton] + simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, ofGenerator] + congr 1 + conv_rhs => rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + congr 1 + ring + +/-- The Lorentz action on the B-boson jet algebra is multiplicative. -/ +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : JetAlgebra) : + repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := + map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + JetComponentSpace.repLorentzGroup Λ)) x y + +/-- The complexified Lorentz action is multiplicative. -/ +lemma complexRepLorentzGroup_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] JetAlgebra) : + complexRepLorentzGroup Λ (x * y) = + complexRepLorentzGroup Λ x * complexRepLorentzGroup Λ y := by + have happ : ∀ (c : ℂ) (b : JetAlgebra), complexRepLorentzGroup Λ (c ⊗ₜ[ℝ] b) = + c ⊗ₜ[ℝ] repLorentzGroup Λ b := fun c b => rfl + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + | tmul c b => + induction y using TensorProduct.induction_on with + | zero => simp + | add a' b' ha' hb' => + simp only [mul_add, map_add, ha', hb'] + | tmul c' b' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, happ, + repLorentzGroup_apply_mul] + +/-- The transformation of the complexified zeroth-order field strength. -/ +lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) + (μ ν : Fin 1 ⊕ Fin 3) : + complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv {} μ ν) = + ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) • + ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv {} a b) := by + rw [show complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv {} μ ν) = + (1 : ℂ) ⊗ₜ[ℝ] repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) from rfl, + repLorentzGroup_fieldStrengthDeriv_nil] + simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] + +/-- The mass-dimension scaling commutes with the Lorentz action on the B-boson + jet algebra. -/ +lemma massWeightScaleReal_repLorentzGroup (c : ℝ) (Λ : SL(2,ℂ)) (x : JetAlgebra) : + massWeightScaleReal c (repLorentzGroup Λ x) = + repLorentzGroup Λ (massWeightScaleReal c x) := by + have h1 : ∀ w, massWeightScaleReal c (SymmetricAlgebra.ι ℝ JetComponentSpace w) = + SymmetricAlgebra.ι ℝ JetComponentSpace + (JetComponentSpace.massWeightScale c w) := fun w => by + rw [massWeightScaleReal, SymmetricAlgebra.lift_ι_apply] + rfl + have h2 : ∀ w, SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ + JetComponentSpace.repLorentzGroup Λ) + (SymmetricAlgebra.ι ℝ JetComponentSpace w) = + SymmetricAlgebra.ι ℝ JetComponentSpace + (JetComponentSpace.repLorentzGroup Λ w) := fun w => by + rw [SymmetricAlgebra.lift_ι_apply] + rfl + have h : (massWeightScaleReal c).comp (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ + JetComponentSpace.repLorentzGroup Λ)) = + (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ + JetComponentSpace.repLorentzGroup Λ)).comp (massWeightScaleReal c) := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) + show massWeightScaleReal c ((SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ + JetComponentSpace.repLorentzGroup Λ)) + ((SymmetricAlgebra.ι ℝ JetComponentSpace) v)) = + (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ + JetComponentSpace.repLorentzGroup Λ)) + (massWeightScaleReal c ((SymmetricAlgebra.ι ℝ JetComponentSpace) v)) + rw [h2, h1, h1, h2] + exact congrArg (SymmetricAlgebra.ι ℝ JetComponentSpace) + (DFunLike.congr_fun + (JetComponentSpace.massWeightScale_repLorentzGroup c Λ) v) + exact DFunLike.congr_fun h x + +/-- The Maurer–Cartan pairing of a jet of constant gauge transformations + vanishes. -/ +lemma mcPairing_ofConstant (g : GaugeGroupI) : + mcPairing (JetGaugeGroupI.ofConstant g) = 0 := by + refine JetComponentSpace.basis.ext fun j => ?_ + obtain ⟨s, ν⟩ := j + simp [mcPairing_basis_dB'] + +/-- Jets of constant gauge transformations act trivially on the B-boson jet + algebra: the Maurer–Cartan shift vanishes. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by + rw [show repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ + mcPairing (JetGaugeGroupI.ofConstant g))) x from rfl, + mcPairing_ofConstant] + have h2 : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = + AlgHom.id ℝ JetAlgebra := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) + simp + rw [h2] + rfl + +/-- Jets of constant gauge transformations act trivially on the complexified + B-boson jet algebra. -/ +lemma complexRepJetGaugeGroupI_ofConstant (g : GaugeGroupI) + (x : ℂ ⊗[ℝ] JetAlgebra) : + complexRepJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, ha, hb] + | tmul z b => rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_ofConstant] + +/-- For real scalars the complexified mass-dimension scaling is the base change + of the real scaling. -/ +lemma massWeightScale_ofReal (r : ℝ) : + massWeightScale (r : ℂ) = + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (massWeightScaleReal r) := by + refine Algebra.TensorProduct.ext (Subsingleton.elim _ _) ?_ + refine SymmetricAlgebra.algHom_ext ?_ + refine JetComponentSpace.basis.ext fun j => ?_ + show massWeightScale (r : ℂ) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) = + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (massWeightScaleReal r) + ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) + rw [massWeightScale_tmul_ofGenerator, Algebra.TensorProduct.map_tmul, + massWeightScaleReal_ofGenerator, TensorProduct.tmul_smul, ← Complex.ofReal_pow] + exact algebraMap_smul ℂ (r ^ j.massWeight) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) + +/-- The complexified scaling at a real scalar commutes with the Lorentz + action. -/ +lemma massWeightScale_ofReal_complexRepLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) + (x : ℂ ⊗[ℝ] JetAlgebra) : + massWeightScale (r : ℂ) (complexRepLorentzGroup Λ x) = + complexRepLorentzGroup Λ (massWeightScale (r : ℂ) x) := by + rw [massWeightScale_ofReal] + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul z b => + rw [show complexRepLorentzGroup Λ (z ⊗ₜ[ℝ] b) = + z ⊗ₜ[ℝ] repLorentzGroup Λ b from rfl, + Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.map_tmul, + show complexRepLorentzGroup Λ ((AlgHom.id ℂ ℂ) z ⊗ₜ[ℝ] + massWeightScaleReal r b) = (AlgHom.id ℂ ℂ) z ⊗ₜ[ℝ] + repLorentzGroup Λ (massWeightScaleReal r b) from rfl, + massWeightScaleReal_repLorentzGroup] + end JetAlgebra end BBoson diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index dee39ba3c..b19fc3fb0 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -627,6 +627,18 @@ end DerivAlgebraComplex -/ +/-- The components of a dual representation on a dual basis: if `ρ g⁻¹` has + matrix `M` in the basis `b` (columns indexing the argument), then `ρ.dual g` + acts on the dual basis by the rows of `M`. -/ +lemma _root_.Representation.dual_apply_dualBasis {k G V ι : Type*} [CommRing k] + [Group G] [AddCommGroup V] [Module k V] [Fintype ι] [DecidableEq ι] + (ρ : Representation k G V) (b : Module.Basis ι k V) (g : G) (i : ι) + (M : Matrix ι ι k) (hM : ∀ j, ρ g⁻¹ (b j) = ∑ l, M l j • b l) : + ρ.dual g (b.dualBasis i) = ∑ j, M i j • b.dualBasis j := by + refine b.ext fun j => ?_ + rw [Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply, hM] + simp [Finsupp.single_apply, Finset.sum_ite_eq, Finset.sum_ite_eq'] + abbrev DerivAlgebraReal := SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) namespace DerivAlgebraReal @@ -663,5 +675,51 @@ noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) DerivAlgebraRea refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [map_mul, Module.End.mul_apply] +/-- The Lorentz action on a generator of the real derivative algebra. -/ +@[simp] +lemma repLorentzGroup_apply_ι (Λ : SL(2,ℂ)) (x : Module.Dual ℝ Lorentz.CoVector) : + repLorentzGroup Λ (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) x) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.sl2Rep.dual Λ x) := by + simp [repLorentzGroup] + +/-- The components of the dual covector action on the dual basis: the dual + derivative slots transform contravariantly, by the columns of the Lorentz + matrix. -/ +lemma _root_.Lorentz.CoVector.sl2Rep_dual_dualBasis (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + Lorentz.CoVector.sl2Rep.dual Λ (Lorentz.CoVector.basis.dualBasis μ) = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1 j μ • + Lorentz.CoVector.basis.dualBasis j := by + refine Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => (Lorentz.SL2C.toLorentzGroup Λ).1 j l) (fun j => ?_) + rw [show Lorentz.CoVector.sl2Rep Λ⁻¹ = + Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup Λ⁻¹) from rfl, + Lorentz.CoVector.rep_apply_basis, ← LorentzGroup.coe_inv, map_inv, inv_inv] + rfl + +/-- The derivative-degree scaling on the real algebra of derivative symbols: + the algebra map multiplying each generator by `t`. -/ +noncomputable def gradeScale (t : ℝ) : DerivAlgebraReal →ₐ[ℝ] DerivAlgebraReal := + SymmetricAlgebra.lift (t • SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector)) + +@[simp] +lemma gradeScale_ι (t : ℝ) (x : Module.Dual ℝ Lorentz.CoVector) : + gradeScale t (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) x) = + t • SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) x := by + rw [gradeScale, SymmetricAlgebra.lift_ι_apply] + rfl + +/-- The degree scaling commutes with the Lorentz action on the real derivative + symbols. -/ +lemma gradeScale_repLorentzGroup (t : ℝ) (Λ : SL(2,ℂ)) (a : DerivAlgebraReal) : + gradeScale t (repLorentzGroup Λ a) = repLorentzGroup Λ (gradeScale t a) := by + have h : (gradeScale t).comp (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)) = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)).comp + (gradeScale t) := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simp + exact DFunLike.congr_fun h a end DerivAlgebraReal From d4a75fd0edef72ec7a91e94fecf7d33a4e7da36e Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 05:03:40 +0100 Subject: [PATCH 096/254] feat: Proof of 2nd theorem for QED Left Claude running overnight Co-Authored-By: Claude --- Physlib/Particles/QED/MassDim.lean | 10966 +++++++++++++++- .../EFTLagrangianExclDeriv/YukawaTerms.lean | 6 - .../StandardModel/Fermions/LeptonSinglet.lean | 193 + Physlib/Relativity/DerivAlgebra.lean | 61 +- Physlib/Relativity/SL2C/Basic.lean | 47 + 5 files changed, 11191 insertions(+), 82 deletions(-) diff --git a/Physlib/Particles/QED/MassDim.lean b/Physlib/Particles/QED/MassDim.lean index cc7be7e83..a3fdadd50 100644 --- a/Physlib/Particles/QED/MassDim.lean +++ b/Physlib/Particles/QED/MassDim.lean @@ -195,16 +195,26 @@ noncomputable def thetaTerm : JetAlgebra := fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3))) -/-- The fermion kinetic term `i ψ̄_α (σ^μ)_{α β} (D_μ ψ)_β` of the right-handed - charged-lepton singlet, with the covariant derivative on the lepton. Mass - weight eight. -/ +/-- The spinor contraction matrices of the right-handed kinetic term: the + transposed covariant Pauli matrices `(σ̄^μ)ᵀ = (1, -σ1, σ2, -σ3)`. In the + conventions of this repository the right-handed lepton field transforms by + the entrywise conjugate of `Λ` and its jet coordinates by the contragredient + dual, so the pairing of `ψ̄_α`, `(D_μ ψ)_β` and the derivative index `μ` is + Lorentz invariant precisely through these matrices; this is the intertwining + identity `sum_kineticPauli_contraction` below. -/ +noncomputable def kineticPauli (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := + ((PauliMatrix.pauliSelfAdjoint' μ).1)ᵀ + +/-- The fermion kinetic term `i ψ̄_α (σ̄^μ)ᵀ_{α β} (D_μ ψ)_β` of the + right-handed charged-lepton singlet, with the covariant derivative on the + lepton. Mass weight eight. -/ noncomputable def fermionKineticTerm : JetAlgebra := - Complex.I • ∑ μ, ∑ α, ∑ β, σ μ α β • (Dbarψ [] α * Dψ [μ] β) + Complex.I • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [] α * Dψ [μ] β) -/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ^μ)_{α β} ψ_β`, with the - covariant derivative on the conjugate lepton. Mass weight eight. -/ +/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ̄^μ)ᵀ_{α β} ψ_β`, with + the covariant derivative on the conjugate lepton. Mass weight eight. -/ noncomputable def fermionKineticTermBar : JetAlgebra := - (-Complex.I) • ∑ μ, ∑ α, ∑ β, σ μ α β • (Dbarψ [μ] α * Dψ [] β) + (-Complex.I) • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [μ] α * Dψ [] β) /-- The invariants of the QED jet algebra of mass dimension at most four: the constants and the four kinetic terms. These span @@ -485,23 +495,624 @@ lemma sum_perm_sign_mul_prod_eq_det (Λ : SL(2,ℂ)) (v : Fin 4 → Fin 1 ⊕ Fi rw [Units.smul_def, zsmul_eq_mul] rfl +/-- The alternating contraction matrix of a non-injective index tuple has two + equal rows, so its determinant vanishes. -/ +lemma det_toLorentzGroup_of_not_injective (Λ : SL(2,ℂ)) {v : Fin 4 → Fin 1 ⊕ Fin 3} + (hv : ¬ Function.Injective v) : + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = 0 := by + rw [Function.not_injective_iff] at hv + obtain ⟨i, j, hij, hne⟩ := hv + exact Matrix.det_zero_of_row_eq hne (funext fun k => by simp [hij]) + +/-- On an index tuple obtained by permuting the four spacetime indices, the + alternating contraction matrix has determinant the sign of the permutation, + by `det Λ = 1`. -/ +lemma det_toLorentzGroup_comp_perm (Λ : SL(2,ℂ)) (q : Equiv.Perm (Fin 4)) : + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + ((Equiv.Perm.sign q : ℤ) : ℝ) := by + have h1 : (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + ((Lorentz.SL2C.toLorentzGroup Λ).1.submatrix + (finSumFinEquiv (m := 1) (n := 3)).symm + (finSumFinEquiv (m := 1) (n := 3)).symm).submatrix q id := rfl + rw [h1, Matrix.det_permute, + Matrix.det_submatrix_equiv_self (finSumFinEquiv (m := 1) (n := 3)).symm, + Lorentz.SL2C.toLorentzGroup_det_one, mul_one] + +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the theta term: the alternating contraction is the + determinant of the Lorentz matrix, which is one. -/ lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : repLorentzGroup Λ thetaTerm = thetaTerm := by - -- TODO: expand with `repLorentzGroup_fieldStrengthDeriv_mul`, exchange the - -- permutation sum with the four index sums, evaluate the alternating - -- contraction with `sum_perm_sign_mul_prod_eq_det`: it vanishes on - -- non-injective index tuples (equal rows) and gives `sign q · det Λ = sign q` - -- on injective ones (`Matrix.det_permute`, `toLorentzGroup_det_one`), - -- reindexing the surviving tuples by permutations. - sorry + classical + rw [thetaTerm, map_sum] + conv_lhs => enter [2, p]; rw [map_zsmul, repLorentzGroup_fieldStrengthDeriv_mul] + simp only [Finset.smul_sum] + rw [Finset.sum_comm] + conv_lhs => enter [2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] + have hdet : ∀ a b a' b' : Fin 1 ⊕ Fin 3, + (∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) * + (Lorentz.SL2C.toLorentzGroup Λ).1 b + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3)) : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b')) = + ((Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (![a, b, a', b'] i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) : ℝ) : ℂ) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + intro a b a' b' + rw [← sum_perm_sign_mul_prod_eq_det Λ ![a, b, a', b'], Complex.ofReal_sum, + Finset.sum_smul] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [Fin.prod_univ_four] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + rw [← Int.cast_smul_eq_zsmul ℂ, smul_smul] + congr 1 + push_cast + ring + conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [hdet a b a' b'] + have hflat : ∀ (G : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + (Fin 1 ⊕ Fin 3) → JetAlgebra), + (∑ a, ∑ b, ∑ a', ∑ b', G a b a' b') = + ∑ t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + G t.1 t.2.1 t.2.2.1 t.2.2.2 := fun G => by + symm + simp only [Fintype.sum_prod_type] + rw [hflat] + rw [← Finset.sum_filter_of_ne + (p := fun t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × + (Fin 1 ⊕ Fin 3) => Function.Injective ![t.1, t.2.1, t.2.2.1, t.2.2.2]) + (fun t _ hne => by + by_contra hni + exact hne (by + rw [det_toLorentzGroup_of_not_injective Λ hni, Complex.ofReal_zero, + zero_smul]))] + have hcard : Fintype.card (Fin 4) = Fintype.card (Fin 1 ⊕ Fin 3) := by simp + refine Finset.sum_bij + (i := fun t ht => (Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) + ?_ ?_ ?_ ?_ + · intro t ht + exact Finset.mem_univ _ + · intro t₁ ht₁ t₂ ht₂ h + have hv : ∀ i : Fin 4, ![t₁.1, t₁.2.1, t₁.2.2.1, t₁.2.2.2] i = + ![t₂.1, t₂.2.1, t₂.2.2.1, t₂.2.2.2] i := by + intro i + have := congrArg (fun q : Equiv.Perm (Fin 4) => + (finSumFinEquiv (m := 1) (n := 3)).symm (q i)) h + simpa using this + have h0 := hv 0 + have h1 := hv 1 + have h2 := hv 2 + have h3 := hv 3 + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 + exact Prod.ext h0 (Prod.ext h1 (Prod.ext h2 h3)) + · intro q _ + refine ⟨((finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)), ?_, ?_⟩ + · refine Finset.mem_filter.mpr ⟨Finset.mem_univ _, ?_⟩ + have hveq : ![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] = + fun i => (finSumFinEquiv (m := 1) (n := 3)).symm (q i) := by + funext i + fin_cases i <;> rfl + rw [hveq] + exact ((finSumFinEquiv (m := 1) (n := 3)).symm.injective).comp q.injective + · refine Equiv.ext fun i => ?_ + show (finSumFinEquiv (m := 1) (n := 3)) + (![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] i) = q i + fin_cases i <;> simp + · intro t ht + have hq : ∀ i : Fin 4, (finSumFinEquiv (m := 1) (n := 3)).symm + (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) i) = + ![t.1, t.2.1, t.2.2.1, t.2.2.2] i := by + intro i + simp [Equiv.ofBijective] + have hmat : (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (![t.1, t.2.1, t.2.2.1, t.2.2.2] i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm + (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by + refine congrArg Matrix.of (funext fun i => funext fun j => ?_) + rw [hq i] + rw [hmat, det_toLorentzGroup_comp_perm] + have h0 := hq 0 + have h1 := hq 1 + have h2 := hq 2 + have h3 := hq 3 + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 + rw [h0, h1, h2, h3, ← Int.cast_smul_eq_zsmul ℂ] + module + +/-! + +### Lorentz transformation laws of the fermionic generators + +-/ + +/-- The QED Lorentz action on a pure tensor. -/ +lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl + +/-- The complexified B-boson Lorentz action fixes the unit. -/ +lemma complexRepLorentzGroup_one (Λ : SL(2,ℂ)) : + BBoson.JetAlgebra.complexRepLorentzGroup Λ + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by + rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, + show BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) + from rfl, + show BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) = 1 from + map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + BBoson.JetComponentSpace.repLorentzGroup Λ))] + +/-- The Lorentz action on the zeroth-order lepton generator: the spinor index + transforms contragrediently, by the conjugate inverse matrix. -/ +lemma repLorentzGroup_ψ (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dψ {} α]ₐ = + ∑ β, star ((Λ⁻¹).1 α β) • [JetGenerators.dψ {} β]ₐ := by + rw [show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dψ {} α) from rfl, + repLorentzGroup_tmul, complexRepLorentzGroup_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the first-order lepton generator. -/ +lemma repLorentzGroup_dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dψ {μ} α]ₐ = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • [JetGenerators.dψ {ν} β]ₐ := by + rw [show ([JetGenerators.dψ {μ} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dψ {μ} α) from rfl, + repLorentzGroup_tmul, complexRepLorentzGroup_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the zeroth-order conjugate lepton generator: the + spinor index transforms by the inverse matrix. -/ +lemma repLorentzGroup_barψ (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dbarψ {} α]ₐ = + ∑ β, (Λ⁻¹).1 α β • [JetGenerators.dbarψ {} β]ₐ := by + rw [show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dbarψ {} α) from rfl, + repLorentzGroup_tmul, complexRepLorentzGroup_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the first-order conjugate lepton generator. -/ +lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dbarψ {μ} α]ₐ = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • [JetGenerators.dbarψ {ν} β]ₐ := by + rw [show ([JetGenerators.dbarψ {μ} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dbarψ {μ} α) from rfl, + repLorentzGroup_tmul, complexRepLorentzGroup_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the zeroth-order B-boson generator of the B-boson + jet algebra: the covector transformation. -/ +lemma _root_.StandardModel.BBoson.JetAlgebra.repLorentzGroup_ofGenerator_dB_nil + (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = + ∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ • + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} ν) := by + rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.jetComponentSpace_basis_dB, + show BBoson.JetComponentSpace.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {} ⊗ₜ[ℝ] + StandardModel.BBoson.basis.dualBasis μ) = + (DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {})) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ (StandardModel.BBoson.basis.dualBasis μ)) + from rfl, + BBoson.dualRealJetAlgebraBasis_nil, + show DerivAlgebraReal.repLorentzGroup Λ (1 : DerivAlgebraReal) = 1 from + map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + Lorentz.CoVector.sl2Rep.dual Λ)), + BBoson.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_smul, map_smul, BBoson.JetAlgebra.ofGenerator, + BBoson.jetComponentSpace_basis_dB, BBoson.dualRealJetAlgebraBasis_nil] + +/-- The Lorentz action on the zeroth-order B-boson generator of the QED jet + algebra. -/ +lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ [JetGenerators.dB {} μ]ₐ = + ∑ ν, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) • + [JetGenerators.dB {} ν]ₐ := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) + ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, + repLorentzGroup_tmul, + show BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) from rfl, + BBoson.JetAlgebra.repLorentzGroup_ofGenerator_dB_nil, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one, TensorProduct.tmul_sum, + TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_smul, hconv] + rfl + +/-- The first conjugate covariant derivative: + `D̄_μ ψ̄_α = ∂_μ ψ̄_α - 6 i B_μ ψ̄_α`. -/ +lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ - + ((6 : ℂ) * Complex.I) • + ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by + rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar, LinearMap.sub_apply, + LinearMap.smul_apply, LinearMap.mulLeft_apply] + congr 1 + simp only [ofGenerator] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, zero_add, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] + +/-- Covariance of the zeroth covariant derivatives under the Lorentz group. -/ +lemma repLorentzGroup_Dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (Dψ [] α) = ∑ β, star ((Λ⁻¹).1 α β) • Dψ [] β := by + rw [Dψ_nil, repLorentzGroup_ψ] + simp only [Dψ_nil] + +lemma repLorentzGroup_Dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α) = ∑ β, (Λ⁻¹).1 α β • Dbarψ [] β := by + rw [Dbarψ_nil, repLorentzGroup_barψ] + simp only [Dbarψ_nil] + +set_option maxHeartbeats 2000000 in +/-- Covariance of the first covariant derivative under the Lorentz group: the + gauge-field term transforms exactly as the derivative term. -/ +lemma repLorentzGroup_Dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ (Dψ [μ] α) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • Dψ [ν] β := by + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [Dψ_singleton, map_add, map_smul, repLorentzGroup_mul', repLorentzGroup_B, + repLorentzGroup_ψ, repLorentzGroup_dψ_singleton] + conv_rhs => enter [2, ν, 2, β]; rw [Dψ_singleton, smul_add] + conv_rhs => enter [2, ν]; rw [Finset.sum_add_distrib] + rw [Finset.sum_add_distrib] + congr 1 + simp only [hsm, hms, hsmul, Finset.smul_sum] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [smul_smul, smul_smul] + congr 1 + ring + +set_option maxHeartbeats 2000000 in +/-- Covariance of the first conjugate covariant derivative under the Lorentz + group. -/ +lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ (Dbarψ [μ] α) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • Dbarψ [ν] β := by + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [Dbarψ_singleton, map_sub, map_smul, repLorentzGroup_mul', repLorentzGroup_B, + repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton] + conv_rhs => enter [2, ν, 2, β]; rw [Dbarψ_singleton, smul_sub] + conv_rhs => enter [2, ν]; rw [Finset.sum_sub_distrib] + rw [Finset.sum_sub_distrib] + congr 1 + simp only [hsm, hms, hsmul, Finset.smul_sum] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [smul_smul, smul_smul] + congr 1 + ring + +/-! + +### The kinetic contraction identity and Lorentz invariance + +-/ + +/-- The Lorentz intertwining identity of the kinetic contraction matrices: + transporting the two spinor slots contragrediently and the derivative slot by + the Lorentz matrix reproduces the contraction matrices. This is the identity + `L(Λ) L(Λ⁻¹) = 1` transported through `L(M†) = L(M)ᵀ`. -/ +lemma sum_kineticPauli_contraction (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) + (α' β' : Fin 2) : + ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' := by + classical + have hdet : Matrix.det ((Λ⁻¹).1ᴴ) = 1 := by + rw [Matrix.det_conjTranspose, Matrix.SpecialLinearGroup.det_coe] + exact star_one ℂ + have hval : ∀ μ, (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + intro μ + have h := congrArg Subtype.val + (Lorentz.SL2C.toSelfAdjointMap_basis + (M := (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))) μ) + simp only [Lorentz.SL2C.toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', + Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, + selfAdjoint.val_smul] at h + calc (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 + = ∑ j, (Lorentz.SL2C.toLorentzGroup + (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 j μ • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + rw [← h] + congr 1 + rw [show ((⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ)) : + Matrix (Fin 2) (Fin 2) ℂ)ᴴ = (Λ⁻¹).1 from + Matrix.conjTranspose_conjTranspose _] + _ = ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + refine Finset.sum_congr rfl fun j _ => ?_ + congr 1 + rw [show (Lorentz.SL2C.toLorentzGroup + (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 = + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1ᵀ from + Lorentz.SL2C.toLorentzGroup_conjTranspose rfl, + Matrix.transpose_apply] + have hsand : ∀ μ, (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β'))) = + ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + intro μ + have hentry := congrArg (fun A : Matrix (Fin 2) (Fin 2) ℂ => A β' α') (hval μ) + simp only [Matrix.sum_apply, Matrix.smul_apply] at hentry + calc (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * star ((Λ⁻¹).1 β β'))) + = ((Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1) β' α' := by + rw [Matrix.mul_apply] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Matrix.mul_apply, Finset.sum_mul] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [Matrix.conjTranspose_apply, kineticPauli, Matrix.transpose_apply] + ring + _ = ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + rw [hentry] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [kineticPauli, Matrix.transpose_apply, Complex.real_smul] + calc ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β'))) + = ∑ μ, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β')) := by + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + ring + _ = ∑ μ, ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + ((((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β') := by + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [hsand, Finset.mul_sum] + _ = ∑ j, ((∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [Complex.ofReal_sum, Finset.sum_mul] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Complex.ofReal_mul] + ring + _ = kineticPauli ν α' β' := by + have hmul : ∀ j, (∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j) = + ((1 : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ)) ν j := by + intro j + rw [← Matrix.mul_apply, + show ((Lorentz.SL2C.toLorentzGroup Λ).1 * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 : + Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) = + ((Lorentz.SL2C.toLorentzGroup Λ * + Lorentz.SL2C.toLorentzGroup Λ⁻¹ : LorentzGroup 3) : + Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) from rfl, + ← map_mul, mul_inv_cancel, map_one] + rfl + simp only [hmul, Matrix.one_apply] + rw [Finset.sum_eq_single ν (fun j _ hj => by + rw [if_neg (Ne.symm hj), Complex.ofReal_zero, zero_mul]) + (fun h => absurd (Finset.mem_univ ν) h), if_pos rfl, + Complex.ofReal_one, one_mul] +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the fermion kinetic term: the transformation of the + two spinor slots and the derivative slot cancels through the intertwining + identity of the contraction matrices. -/ lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by - sorry + have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, repLorentzGroup_mul', repLorentzGroup_Dbarψ_nil, + repLorentzGroup_Dψ_singleton] + simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] + -- move the primed sums out and the unprimed sums in + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] + conv_rhs => rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => + Finset.sum_congr rfl fun β' _ => ?_ + conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] + conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] + rw [← Finset.sum_smul] + rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * + ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β')))) = kineticPauli ν α' β' from + sum_kineticPauli_contraction Λ ν α' β'] +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the conjugate fermion kinetic term. -/ lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : repLorentzGroup Λ fermionKineticTermBar = fermionKineticTermBar := by - sorry + have hsmS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [fermionKineticTermBar, map_smul] + congr 1 + rw [map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, repLorentzGroup_mul', repLorentzGroup_Dbarψ_singleton, + repLorentzGroup_Dψ_nil] + simp only [hsmS, hsmF, hmsF, hsmul, Finset.smul_sum, smul_smul] + -- move the transformed sums out and the original sums in + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, ν, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, ν, 2, α']; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, ν, 2, α']; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun α' _ => + Finset.sum_congr rfl fun β' _ => ?_ + conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] + conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] + rw [← Finset.sum_smul] + rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' from by + rw [← sum_kineticPauli_contraction Λ ν α' β'] + refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun α _ => + Finset.sum_congr rfl fun β _ => ?_ + ring] /-! @@ -1372,7 +1983,8 @@ lemma exists_charge_decomp_of_mem_covMonomialSpan {m : ℕ} {y : JetAlgebra} rw [Finset.mem_Icc] omega refine ⟨fun j => if j = k then u else 0, fun j => ?_, ?_⟩ - · by_cases hjk : j = k + · show (if j = k then u else 0) ∈ chargeCovSpan m j + by_cases hjk : j = k · subst hjk rw [if_pos rfl] exact Submodule.subset_span ⟨hu1, hu2, hg⟩ @@ -1394,56 +2006,10282 @@ lemma exists_charge_decomp_of_mem_covMonomialSpan {m : ℕ} {y : JetAlgebra} exact ⟨c • v, fun j => Submodule.smul_mem _ _ (hv j), by rw [Finset.smul_sum]; rfl⟩ -/-- The classification of the renormalizable QED Lagrangian densities: the - gauge- and Lorentz-invariant elements of mass weight at most eight are spanned - by the constants, the Maxwell term, the theta term, and the two fermion - kinetic terms. +/-- The neutral-charge selection rule: a constant-gauge-invariant element of a + weight sector lies in the charge-zero component, since the characters + `u ↦ u^{6j}` of distinct charges are linearly independent along the unit + circle. -/ +lemma mem_chargeCovSpan_zero_of_invariant {m : ℕ} {y : JetAlgebra} + (hy : y ∈ covMonomialSpan m) + (hinv : ∀ g : GaugeGroupI, + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : + y ∈ chargeCovSpan m 0 := by + obtain ⟨v, hv, hyeq⟩ := exists_charge_decomp_of_mem_covMonomialSpan hy + set S : Finset ℤ := Finset.Icc (-(m : ℤ)) (m : ℤ) with hS + have hchar : ∀ θ : ℝ, ∑ j ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * j) • + v j = ∑ j ∈ S, v j := by + intro θ + have hval : (((u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) + (exp_mul_I_mem_unitary θ)).2.2 : ℂ)) = + Complex.exp ((θ : ℂ) * Complex.I) := rfl + have h1 := hinv (u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) + (exp_mul_I_mem_unitary θ)) + rw [hyeq, map_sum] at h1 + rw [← h1] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [forall_rep_ofConstant_of_mem_chargeCovSpan (hv j), hval] + have hkill : ∀ j ∈ S, j ≠ 0 → v j = 0 := by + intro j hj hj0 + have h6 : Function.Injective (fun k : ℤ => 6 * k) := fun a b hab => by + simpa using hab + set w : ℤ → JetAlgebra := fun k => v (k / 6) - + (if k = 0 then ∑ i ∈ S, v i else 0) with hw + have hzero : ∀ θ : ℝ, ∑ k ∈ S.image (fun j => 6 * j), + (Complex.exp ((θ : ℂ) * Complex.I)) ^ k • w k = 0 := by + intro θ + rw [Finset.sum_image fun a _ b _ h => h6 h] + have hterm : ∀ i ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • + w (6 * i) = (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • v i - + (if i = 0 then ∑ i ∈ S, v i else 0) := by + intro i _ + rw [hw] + simp only [Int.mul_ediv_cancel_left i (by norm_num : (6 : ℤ) ≠ 0), + show 6 * i = 0 ↔ i = 0 from by omega] + by_cases hi : i = 0 + · rw [if_pos hi, smul_sub, hi] + norm_num + · rw [if_neg hi] + simp + rw [Finset.sum_congr rfl hterm, Finset.sum_sub_distrib, hchar θ, + Finset.sum_ite_eq' S (0 : ℤ) fun _ => ∑ i ∈ S, v i, + if_pos (by simp [hS] : (0 : ℤ) ∈ S), sub_self] + have h0 := eq_zero_of_forall_circle_sum_zpow_smul_eq_zero _ _ hzero + (Finset.mem_image_of_mem (fun j => 6 * j) hj) + rw [hw] at h0 + simpa [Int.mul_ediv_cancel_left j (by norm_num : (6 : ℤ) ≠ 0), + show ¬ (6 * j = 0) from by omega] using h0 + have hy0 : y = v 0 := by + rw [hyeq, Finset.sum_eq_single 0 (fun j hj hj0 => hkill j hj hj0) + (fun h => absurd (by simp [hS] : (0 : ℤ) ∈ S) h)] + rw [hy0] + exact hv 0 - The inclusion `⊇` is `span_massDimFourInvariants_le`: each of the five - elements is invariant and of weight at most eight. +/-! - The completeness direction `⊆` is proved as follows. - 1. By `InvariantSubmodule.mem_iff_isInvariant` and - `isInvariant_iff_mem_adjoin_invariantGenerators`, an invariant `x` of - weight at most eight lies in the algebra generated by the covariant - generators, is fixed by the jets of constant gauge transformations, and is - Lorentz invariant. - 2. Graded decomposition (`exists_covMonomialSpan_decomp`): `x` is a sum of - nine components `z m ∈ covMonomialSpan m` of exact weights `0, …, 8`, - using the homogeneity of the covariant monomials and the linear - independence of the powers `c ↦ c ^ m` - (`eq_zero_of_forall_sum_pow_smul_eq_zero`). - 3. Componentwise invariance: the mass-dimension scaling commutes with the - Lorentz action and with the constant gauge action, so each component - `z m` inherits both invariances, again by independence of powers. - 4. Sector analysis. `m = 0`: the weight-zero monomial span is the constants. - `m = 1, 2`: there are no covariant monomials of these weights, since the - generators have weights at least three. Odd `m = 3, 5, 7`: odd weight - forces an odd number of fermionic factors, and the constant gauge - transformation with `u(0) = i` acts on such a monomial by - `(i⁶)^{n_ψ} ((-i)⁶)^{n_ψ̄} = (-1)^{n_ψ + n_ψ̄} = -1`, so invariance forces - `z m = 0`. `m = 4, 6`: after splitting off the hypercharge `±12` sectors - with a further root of unity, the surviving monomials (`F_{μν}`; - `∂_ρ F_{μν}` and the zero-derivative fermion pairs `ψ̄_α ψ_β`) admit no - Lorentz invariant. `m = 8`: the charge-balanced monomials are `F · F`, - `∂∂F`, and the one-derivative fermion pairs; their Lorentz invariants are - spanned by the Maxwell term, the theta term, and the two σ-contracted - kinetic terms. +## The Lorentz analysis of the neutral sectors - Steps 3–4 remain to be formalized: they require the commutation of the - scaling with the two group actions at the QED level, the linear independence - of the covariant monomials, and the invariant theory of `SL(2,ℂ)` on the - finite-dimensional weight sectors. -/ -lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : - InvariantMassWeightSubmodule 8 = Submodule.span ℂ massDimFourInvariants := by - refine le_antisymm ?_ span_massDimFourInvariants_le - -- Completeness: every invariant of mass weight at most eight is a combination - -- of the four kinetic terms and the constants. TODO: requires (i) the weight - -- and hypercharge selection rules to reduce to the finite-dimensional space of - -- weight-`≤ 8`, charge-balanced covariant monomials, via the characterization - -- `isInvariant_iff_mem_adjoin_invariantGenerators`, and (ii) the classical - -- invariant theory of the Lorentz group on that space. - sorry +TODO: the remaining sector lemmas. The charge-zero covariant monomials of +weight four are the field strengths `F_{μν}`, of weight six the derivatives +`∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β`, of weight eight the products +`F F`, the second derivatives `∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion +pairs. Lorentz invariance kills the weight-four and weight-six sectors and +reduces the weight-eight sector to the span of the Maxwell term, the theta +term, and the two fermion kinetic terms. + +-/ + +/-- Each invariant generator is a weight eigenvector of weight at least + three. -/ +lemma exists_weight_of_mem_invariantGenerators {g : JetAlgebra} + (hg : g ∈ invariantGenerators) : + ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c g = c ^ w • g := by + rcases hg with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact ⟨4 + 2 * Multiset.card p.1, by omega, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dψ c p.1 p.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + +/-- The product of a list of invariant generators is a weight eigenvector of + weight at least three times the length. -/ +lemma exists_weight_of_list_prod {l : List JetAlgebra} + (hl : ∀ g ∈ l, g ∈ invariantGenerators) : + ∃ w, 3 * l.length ≤ w ∧ + ∀ c : ℂ, massWeightScale c l.prod = c ^ w • l.prod := by + induction l with + | nil => + exact ⟨0, by simp, fun c => by + rw [List.prod_nil, pow_zero, one_smul] + exact (massWeightScale c).map_one⟩ + | cons g l ih => + obtain ⟨wg, hwg3, hwg⟩ := exists_weight_of_mem_invariantGenerators + (hl g List.mem_cons_self) + obtain ⟨wl, hwl3, hwl⟩ := ih fun x hx => hl x (List.mem_cons_of_mem g hx) + refine ⟨wg + wl, by simp only [List.length_cons]; omega, fun c => ?_⟩ + rw [List.prod_cons] + exact massWeightScale_mul_eigen hwg hwl c + +/-- The constant gauge character of a product of two lepton factors: charge + two. -/ +lemma rep_ofConstant_Dψ_mul_Dψ (g : GaugeGroupI) (l l' : List (Fin 1 ⊕ Fin 3)) + (α β : Fin 2) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dψ l α * Dψ l' β) = + ((g.2.2 : ℂ)) ^ (6 * (2 : ℤ)) • (Dψ l α * Dψ l' β) := by + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, + JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, + SubmonoidClass.coe_pow, smul_mul_smul_comm, ← pow_add, + show (6 * (2 : ℤ)) = ((12 : ℕ) : ℤ) from rfl, zpow_natCast] + +/-- The constant gauge character of a product of two conjugate lepton factors: + charge minus two. -/ +lemma rep_ofConstant_Dbarψ_mul_Dbarψ (g : GaugeGroupI) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dbarψ l α * Dbarψ l' β) = + ((g.2.2 : ℂ)) ^ (6 * (-2 : ℤ)) • (Dbarψ l α * Dbarψ l' β) := by + have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := + eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, + JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, + SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← pow_add, + hinv, inv_pow, show (6 + 6 : ℕ) = 12 from rfl, + show (6 * (-2 : ℤ)) = -((12 : ℕ) : ℤ) from rfl, _root_.zpow_neg, zpow_natCast] + +/-- The weight-four neutral sector: spanned by the embedded field strengths. -/ +lemma chargeCovSpan_four_le : + chargeCovSpan 4 0 ≤ Submodule.span ℂ + (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {} p.1 p.2) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, -⟩ + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', t⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 0 + · rw [Multiset.card_eq_zero.mp hcard] + exact Submodule.subset_span ⟨(p.2.1, p.2.2), rfl⟩ + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + rw [eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega)] + exact Submodule.zero_mem _ + +set_option maxHeartbeats 4000000 in +/-- The weight-six neutral sector: spanned by the first derivatives of the + field strength and the zero-derivative lepton pairs. -/ +lemma chargeCovSpan_six_le : + chargeCovSpan 6 0 ≤ Submodule.span ℂ + ((Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {p.1} p.2.1 p.2.2) ∪ + (Set.range fun p : Fin 2 × Fin 2 => Dbarψ [] p.1 * Dψ [] p.2) ∪ + (Set.range fun p : Fin 2 × Fin 2 => Dψ [] p.1 * Dbarψ [] p.2)) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, hy3⟩ + simp only [mul_zero, zpow_zero, one_smul] at hy3 + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 1 + · obtain ⟨ρ, hρ⟩ := Multiset.card_eq_one.mp hcard + rw [hρ] + exact Submodule.subset_span (Or.inl (Or.inl ⟨(ρ, p.2.1, p.2.2), rfl⟩)) + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with + (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> + dsimp only at hy2 hy3 ⊢ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) + (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 + · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] + exact Submodule.subset_span (Or.inr ⟨(p.2, q.2), rfl⟩) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 + · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] + exact Submodule.subset_span (Or.inl (Or.inr ⟨(p.2, q.2), rfl⟩)) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) + (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + rw [eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega)] + exact Submodule.zero_mem _ + +set_option maxHeartbeats 4000000 in +/-- The weight-eight neutral sector: spanned by the field-strength squares, the + second derivatives of the field strength, and the one-derivative lepton + pairs. -/ +lemma chargeCovSpan_eight_le : + chargeCovSpan 8 0 ≤ Submodule.span ℂ + ((Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × + (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {} p.1.1 p.1.2 * fieldStrengthDeriv {} p.2.1 p.2.2) ∪ + (Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × + (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {p.1.1, p.1.2} p.2.1 p.2.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dbarψ [] p.1.1 * Dψ [p.2] p.1.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dψ [p.2] p.1.2 * Dbarψ [] p.1.1) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dψ [] p.1.1 * Dbarψ [p.2] p.1.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dbarψ [p.2] p.1.2 * Dψ [] p.1.1)) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, hy3⟩ + simp only [mul_zero, zpow_zero, one_smul] at hy3 + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 2 + · obtain ⟨ρ, τ, hρτ⟩ := Multiset.card_eq_two.mp hcard + rw [hρτ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl + (Or.inr ⟨((ρ, τ), p.2.1, p.2.2), rfl⟩))))) + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with + (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> + dsimp only at hy2 hy3 ⊢ + · by_cases hcard : Multiset.card p.1 = 0 ∧ Multiset.card q.1 = 0 + · rw [Multiset.card_eq_zero.mp hcard.1, Multiset.card_eq_zero.mp hcard.2] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl + (Or.inl ⟨((p.2.1, p.2.2), q.2.1, q.2.2), rfl⟩))))) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) + (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 + rw [List.length_eq_zero_iff.mp hlen.1, hμ] + exact Submodule.subset_span (Or.inl (Or.inr ⟨((p.2, q.2), μ), rfl⟩)) + · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 + rw [List.length_eq_zero_iff.mp hlen'.2, hμ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inr + ⟨((q.2, p.2), μ), rfl⟩))) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 + rw [List.length_eq_zero_iff.mp hlen.1, hμ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inr + ⟨((p.2, q.2), μ), rfl⟩)))) + · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 + rw [List.length_eq_zero_iff.mp hlen'.2, hμ] + exact Submodule.subset_span (Or.inr ⟨((q.2, p.2), μ), rfl⟩) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) + (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · have h0 : (g :: g' :: g'' :: t).prod = 0 := by + obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + exact eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega) + exact Set.mem_of_eq_of_mem h0 (Submodule.zero_mem _) + +/-! + +### The parity rotations + +The three rotations by `π` about the coordinate axes lift to `SL(2,ℂ)` as +`i σ_k`; their Lorentz matrices are the diagonal sign matrices fixing the time +axis and the rotation axis and reversing the two others. Averaging over this +Klein four-group kills every tensor component with an odd index pattern; since +every antisymmetric index pair is odd under exactly two of the three parities, +the weight-four sector admits no invariant. + +-/ + +/-- The lift `diag(i, -i)` of the rotation by `π` about the `z`-axis. -/ +noncomputable def parityZ : SL(2,ℂ) := + ⟨!![Complex.I, 0; 0, -Complex.I], by + simp [Matrix.det_fin_two_of]⟩ + +/-- The lift `i σ1` of the rotation by `π` about the `x`-axis. -/ +noncomputable def parityX : SL(2,ℂ) := + ⟨!![0, Complex.I; Complex.I, 0], by + simp [Matrix.det_fin_two_of]⟩ + +/-- The lift `i σ2` of the rotation by `π` about the `y`-axis. -/ +noncomputable def parityY : SL(2,ℂ) := + ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ + +/-- The sign pattern of the rotation by `π` about the `z`-axis. -/ +def paritySignZ : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => -1 + | Sum.inr 1 => -1 + | Sum.inr 2 => 1 + +/-- The sign pattern of the rotation by `π` about the `x`-axis. -/ +def paritySignX : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => 1 + | Sum.inr 1 => -1 + | Sum.inr 2 => -1 + +/-- The sign pattern of the rotation by `π` about the `y`-axis. -/ +def paritySignY : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => -1 + | Sum.inr 1 => 1 + | Sum.inr 2 => -1 + +/-- The Lorentz matrix of the `z`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_parityZ (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup parityZ).1 a b = + if a = b then paritySignZ a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [parityZ, paritySignZ, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- The Lorentz matrix of the `x`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_parityX (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup parityX).1 a b = + if a = b then paritySignX a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [parityX, paritySignX, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- The Lorentz matrix of the `y`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_parityY (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup parityY).1 a b = + if a = b then paritySignY a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [parityY, paritySignY, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- Under a diagonal Lorentz transformation the field strength scales by the + product of the signs of its two indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {} μ ν) = + ((sgn μ * sgn ν : ℝ) : ℂ) • fieldStrengthDeriv {} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_nil] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] + +/-- The field strength vanishes on a repeated index. -/ +lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ μ = 0 := by + have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = + [JetGenerators.dB (s + {μ}) μ]ₐ - [JetGenerators.dB (s + {μ}) μ]ₐ := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, sub_self] + +set_option maxHeartbeats 2000000 in +/-- No Lorentz invariant of mass weight four: an invariant combination of the + field strengths `F_{μν}` vanishes, since every antisymmetric index pair is + odd under two of the three parity rotations. -/ +lemma eq_zero_of_mem_chargeCovSpan_four {y : JetAlgebra} + (hy : y ∈ chargeCovSpan 4 0) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by + obtain ⟨c, hc⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp + (chargeCovSpan_four_le hy) + have h4 : ((4 : ℂ)⁻¹ • (y + repLorentzGroup parityZ y + + repLorentzGroup parityY y + repLorentzGroup parityX y)) = y := by + rw [hinv, hinv, hinv] + module + rw [← h4, ← hc, map_sum, map_sum, map_sum] + simp only [map_smul, repLorentzGroup_diag_fieldStrengthDeriv + toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX] + rw [← Finset.sum_add_distrib, ← Finset.sum_add_distrib, + ← Finset.sum_add_distrib, Finset.smul_sum] + refine Finset.sum_eq_zero fun p _ => ?_ + rcases eq_or_ne p.1 p.2 with hp | hp + · rw [hp, fieldStrengthDeriv_self] + simp + · rw [smul_smul, smul_smul, smul_smul, ← add_smul, ← add_smul, ← add_smul, + smul_smul] + rw [show ((4 : ℂ)⁻¹ * (c p + c p * ((paritySignZ p.1 * paritySignZ p.2 : ℝ) : ℂ) + + c p * ((paritySignY p.1 * paritySignY p.2 : ℝ) : ℂ) + + c p * ((paritySignX p.1 * paritySignX p.2 : ℝ) : ℂ))) = 0 from by + rcases p with ⟨μ, ν⟩ + rcases μ with μ | μ <;> rcases ν with ν | ν <;> + first + | (exact absurd rfl (by simpa using hp)) + | (fin_cases μ <;> fin_cases ν <;> + simp_all [paritySignZ, paritySignY, paritySignX] <;> + norm_num [Complex.ext_iff] <;> ring)] + rw [zero_smul] + +/-! + +### The transformation law of the derivative field strength + +-/ + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on the two-derivative-index B-boson jet coordinates: + all three indices transform contravariantly, by the columns of the Lorentz + matrix. -/ +lemma _root_.StandardModel.BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair + (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetComponentSpace.repLorentzGroup Λ + (BBoson.JetComponentSpace.basis (.dB {ρ, μ} ν)) = + ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • + BBoson.JetComponentSpace.basis (.dB {r, a} b) := by + have hpair : ∀ x y : Fin 1 ⊕ Fin 3, + LagrangianTheory.dualRealJetAlgebraBasis ({x, y} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis x) * + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis y) := fun x y => by + rw [← BBoson.dualRealJetAlgebraBasis_singleton, + ← BBoson.dualRealJetAlgebraBasis_singleton, + BBoson.dualRealJetAlgebraBasis_mul, Multiset.singleton_add, + ← Multiset.insert_eq_cons] + have hmul : ∀ x y : DerivAlgebraReal, + DerivAlgebraReal.repLorentzGroup Λ (x * y) = + DerivAlgebraReal.repLorentzGroup Λ x * + DerivAlgebraReal.repLorentzGroup Λ y := fun x y => + map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + Lorentz.CoVector.sl2Rep.dual Λ)) x y + have happ : BBoson.JetComponentSpace.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ} ⊗ₜ[ℝ] + StandardModel.BBoson.basis.dualBasis ν) = + (DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ})) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ + (StandardModel.BBoson.basis.dualBasis ν)) := rfl + rw [BBoson.jetComponentSpace_basis_dB, happ, hpair, hmul, + DerivAlgebraReal.repLorentzGroup_apply_ι, + DerivAlgebraReal.repLorentzGroup_apply_ι, + Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, + BBoson.repLorentzGroup_dual_dualBasis] + simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, + smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, + ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, + smul_smul, BBoson.jetComponentSpace_basis_dB, hpair] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, j]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => + Finset.sum_congr rfl fun b _ => ?_ + module + +set_option maxHeartbeats 2000000 in +/-- The transformation law of the first-derivative field strength on the + B-boson jet algebra: a three-index tensor. -/ +lemma _root_.StandardModel.BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_singleton + (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = + ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • + BBoson.JetAlgebra.fieldStrengthDeriv {r} a b := by + have hFS : ∀ r a b : Fin 1 ⊕ Fin 3, + BBoson.JetAlgebra.fieldStrengthDeriv ({r} : Multiset _) a b = + BBoson.JetAlgebra.ofGenerator (.dB {r, a} b) - + BBoson.JetAlgebra.ofGenerator (.dB {r, b} a) := fun r a b => by + rw [BBoson.JetAlgebra.fieldStrengthDeriv, + show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, a} from by + rw [Multiset.singleton_add, ← Multiset.insert_eq_cons], + show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, b} from by + rw [Multiset.singleton_add, ← Multiset.insert_eq_cons]] + simp only [hFS] + rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair] + simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, + BBoson.JetAlgebra.ofGenerator] + rw [sub_right_inj] + conv_rhs => enter [2, r]; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => + Finset.sum_congr rfl fun b _ => ?_ + congr 1 + ring + +/-- The transformation of the complexified first-derivative field strength. -/ +lemma _root_.StandardModel.BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton + (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = + ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r} a b) := by + rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) from rfl, + BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_singleton] + simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] + +/-- The transformation law of the embedded first-derivative field strength: + a three-index tensor, all indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_singleton (Λ : SL(2,ℂ)) + (ρ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {ρ} μ ν) = + ∑ r, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) : ℝ)) : ℂ) • + fieldStrengthDeriv {r} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + +/-- Under a diagonal Lorentz transformation the derivative field strength + scales by the product of the signs of its three indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv_singleton {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (ρ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {ρ} μ ν) = + ((sgn ρ * (sgn μ * sgn ν) : ℝ) : ℂ) • fieldStrengthDeriv {ρ} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_singleton] + rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun a _ => + Finset.sum_eq_zero fun b _ => by + rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ρ) h)] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM ρ ρ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] + +/-- Antisymmetry of the embedded field-strength derivatives in the two field + indices. -/ +lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s ν μ = - fieldStrengthDeriv s μ ν := by + have h : ∀ a b : Fin 1 ⊕ Fin 3, (fieldStrengthDeriv s a b : JetAlgebra) = + [JetGenerators.dB (s + {a}) b]ₐ - [JetGenerators.dB (s + {b}) a]ₐ := by + intro a b + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, h, neg_sub] + +/-- The canonical orientation of a mixed field-strength component: the time + index first. -/ +lemma fieldStrengthDeriv_inr_inl (s : Multiset (Fin 1 ⊕ Fin 3)) (i : Fin 3) + (j : Fin 1) : + fieldStrengthDeriv s (Sum.inr i) (Sum.inl j) = + - fieldStrengthDeriv s (Sum.inl j) (Sum.inr i) := + fieldStrengthDeriv_antisymm s (Sum.inl j) (Sum.inr i) + +/-! + +### The boosts along the `z`-axis + +Two diagonal boosts `diag(t, t⁻¹)` with `t = 2, 3`. Together with the Klein +four-group of parity rotations they suffice to kill the neutral weight-six +sector: the Klein average projects onto the twelve surviving field-strength +components and the diagonal fermion pairs, and a rational combination of the +two boosts (with weights summing to one) annihilates all of them. + +-/ + +/-- The lift `diag(2, 1/2)` of the boost along the `z`-axis with rapidity + `log 4`. -/ +noncomputable def boostA : SL(2,ℂ) := + ⟨!![2, 0; 0, 2⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ + +/-- The lift `diag(3, 1/3)` of the boost along the `z`-axis with rapidity + `log 9`. -/ +noncomputable def boostB : SL(2,ℂ) := + ⟨!![3, 0; 0, 3⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ + +/-- The Lorentz matrix of `boostA`. -/ +noncomputable def boostMatA : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => 17/8 + | Sum.inl _, Sum.inr 2 => -(15/8) + | Sum.inr 2, Sum.inl _ => -(15/8) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 17/8 + | _, _ => 0 + +/-- The Lorentz matrix of `boostB`. -/ +noncomputable def boostMatB : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => 41/9 + | Sum.inl _, Sum.inr 2 => -(40/9) + | Sum.inr 2, Sum.inl _ => -(40/9) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 41/9 + | _, _ => 0 + +set_option maxHeartbeats 2000000 in +/-- The Lorentz matrix of the first boost. -/ +lemma toLorentzGroup_boostA (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup boostA).1 a b = boostMatA a b := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostA, boostMatA, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try norm_num [Complex.ext_iff] + +set_option maxHeartbeats 2000000 in +/-- The Lorentz matrix of the second boost. -/ +lemma toLorentzGroup_boostB (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup boostB).1 a b = boostMatB a b := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostB, boostMatB, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try norm_num [Complex.ext_iff] + +/-- The inverse of the `z`-parity, entrywise. -/ +lemma parityZ_inv_coe : + (parityZ⁻¹ : SL(2,ℂ)).1 = !![-Complex.I, 0; 0, Complex.I] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [parityZ] + +/-- The inverse of the `y`-parity, entrywise. -/ +lemma parityY_inv_coe : + (parityY⁻¹ : SL(2,ℂ)).1 = !![0, -1; 1, 0] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [parityY] + +/-- The inverse of the `x`-parity, entrywise. -/ +lemma parityX_inv_coe : + (parityX⁻¹ : SL(2,ℂ)).1 = !![0, -Complex.I; -Complex.I, 0] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [parityX] + +/-- The inverse of the first boost, entrywise, with real entries. -/ +lemma boostA_inv_coe : + (boostA⁻¹ : SL(2,ℂ)).1 = !![((2⁻¹ : ℝ) : ℂ), 0; 0, ((2 : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostA] + +/-- The inverse of the second boost, entrywise, with real entries. -/ +lemma boostB_inv_coe : + (boostB⁻¹ : SL(2,ℂ)).1 = !![((3⁻¹ : ℝ) : ℂ), 0; 0, ((3 : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostB] + +/-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ +lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = + ∑ γ, ∑ δ, ((Λ⁻¹).1 α γ * star ((Λ⁻¹).1 β δ)) • + (Dbarψ [] γ * Dψ [] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_mul', repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] + simp only [hsm, hms, hsmul] + +/-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ +lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : + repLorentzGroup Λ (Dψ [] α * Dbarψ [] β) = + ∑ γ, ∑ δ, (star ((Λ⁻¹).1 α γ) * (Λ⁻¹).1 β δ) • + (Dψ [] γ * Dbarψ [] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_mul', repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] + simp only [hsm, hms, hsmul] + +/-! + +### The kill operator of the weight-six sector + +-/ + +/-- The averaging operator over the Klein four-group of parity rotations. -/ +noncomputable def kleinAvg : Module.End ℂ JetAlgebra := + (4 : ℂ)⁻¹ • (LinearMap.id + repLorentzGroup parityZ + + repLorentzGroup parityY + repLorentzGroup parityX) + +/-- The boost-weighted Klein average: an operator fixing every + Lorentz-invariant vector and annihilating the neutral weight-six sector. + The weights `-13/24, 8/3, -9/8` sum to one and are chosen so that + `w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}` + respectively, killing both eigendirections of the two boosts. -/ +noncomputable def sixKill : Module.End ℂ JetAlgebra := + ((-13/24 : ℂ) • LinearMap.id + (8/3 : ℂ) • repLorentzGroup boostA + + (-9/8 : ℂ) • repLorentzGroup boostB) ∘ₗ kleinAvg + +/-- The Klein average, termwise. -/ +lemma kleinAvg_apply (v : JetAlgebra) : + kleinAvg v = (4 : ℂ)⁻¹ • (v + repLorentzGroup parityZ v + + repLorentzGroup parityY v + repLorentzGroup parityX v) := by + simp only [kleinAvg, LinearMap.smul_apply, LinearMap.add_apply, + LinearMap.id_apply] + +/-- The kill operator, termwise. -/ +lemma sixKill_apply (v : JetAlgebra) : + sixKill v = (-13/24 : ℂ) • kleinAvg v + + (8/3 : ℂ) • repLorentzGroup boostA (kleinAvg v) + + (-9/8 : ℂ) • repLorentzGroup boostB (kleinAvg v) := by + simp only [sixKill, LinearMap.comp_apply, LinearMap.add_apply, + LinearMap.smul_apply, LinearMap.id_apply] + +set_option maxHeartbeats 8000000 in +/-- The kill operator annihilates every embedded derivative field strength: + the Klein average kills every component with an odd index pattern, and the + boost combination kills the twelve surviving components. -/ +lemma sixKill_fieldStrengthDeriv_singleton (ρ μ ν : Fin 1 ⊕ Fin 3) : + sixKill (fieldStrengthDeriv {ρ} μ ν) = 0 := by + rcases eq_or_ne μ ν with rfl | hμν + · rw [fieldStrengthDeriv_self] + exact map_zero _ + · have hK : kleinAvg (fieldStrengthDeriv {ρ} μ ν) = + (((1 + paritySignZ ρ * (paritySignZ μ * paritySignZ ν) + + paritySignY ρ * (paritySignY μ * paritySignY ν) + + paritySignX ρ * (paritySignX μ * paritySignX ν)) / 4 : ℝ) : ℂ) • + fieldStrengthDeriv {ρ} μ ν := by + rw [kleinAvg_apply, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityX] + push_cast + module + rw [sixKill_apply, hK, map_smul, map_smul] + rcases ρ with ρ | ρ <;> rcases μ with μ | μ <;> rcases ν with ν | ν <;> + fin_cases ρ <;> fin_cases μ <;> fin_cases ν <;> + first + | (simp only [fieldStrengthDeriv_self, map_zero, smul_zero, add_zero]; done) + | (norm_num [paritySignZ, paritySignY, paritySignX]; done) + | (norm_num [paritySignZ, paritySignY, paritySignX] + rw [repLorentzGroup_fieldStrengthDeriv_singleton boostA, + repLorentzGroup_fieldStrengthDeriv_singleton boostB] + simp only [Fintype.sum_sum_type, Fin.sum_univ_three, Fin.sum_univ_one, + toLorentzGroup_boostA, toLorentzGroup_boostB] + norm_num [boostMatA, boostMatB, fieldStrengthDeriv_self, + fieldStrengthDeriv_inr_inl] + push_cast + module) + +set_option maxHeartbeats 4000000 in +/-- The kill operator annihilates every zero-derivative pair `ψ̄_α ψ_β`: the + Klein average kills the off-diagonal pairs and symmetrises the diagonal + ones, which the boost combination then kills. -/ +lemma sixKill_Dbarψ_mul_Dψ (α β : Fin 2) : + sixKill (Dbarψ [] α * Dψ [] β) = 0 := by + rw [sixKill_apply, kleinAvg_apply] + fin_cases α <;> fin_cases β <;> + · simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, map_add, map_smul, + map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, + Fin.mk_one, Matrix.of_apply, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, + star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, + Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, + neg_neg, + zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, + Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] + try push_cast + try module + +set_option maxHeartbeats 4000000 in +/-- The kill operator annihilates every zero-derivative pair `ψ_α ψ̄_β`. -/ +lemma sixKill_Dψ_mul_Dbarψ (α β : Fin 2) : + sixKill (Dψ [] α * Dbarψ [] β) = 0 := by + rw [sixKill_apply, kleinAvg_apply] + fin_cases α <;> fin_cases β <;> + · simp only [repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, map_add, map_smul, + map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, + Fin.mk_one, Matrix.of_apply, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, + star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, + Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, + neg_neg, + zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, + Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] + try push_cast + try module + +/-- No Lorentz invariant of mass weight six: an invariant combination of the + field-strength derivatives `∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β` + vanishes. -/ +lemma eq_zero_of_mem_chargeCovSpan_six {y : JetAlgebra} + (hy : y ∈ chargeCovSpan 6 0) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by + have h := chargeCovSpan_six_le hy + rw [Submodule.span_union, Submodule.span_union] at h + obtain ⟨u, hu, w, hw, hy'⟩ := Submodule.mem_sup.mp h + obtain ⟨u1, hu1, u2, hu2, hu'⟩ := Submodule.mem_sup.mp hu + obtain ⟨a, ha⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu1 + obtain ⟨d, hd⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu2 + obtain ⟨e, he⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw + have hKy : kleinAvg y = y := by + rw [kleinAvg_apply, hinv parityZ, hinv parityY, hinv parityX] + module + have hself : sixKill y = y := by + rw [sixKill_apply, hKy, hinv boostA, hinv boostB] + module + have hkill : sixKill y = 0 := by + rw [← hy', ← hu', ← ha, ← hd, ← he] + simp only [map_add, map_sum, map_smul, sixKill_fieldStrengthDeriv_singleton, + sixKill_Dbarψ_mul_Dψ, sixKill_Dψ_mul_Dbarψ, smul_zero, + Finset.sum_const_zero, add_zero] + exact hself.symm.trans hkill + +/-! + +### The transformation law of the second-derivative field strength + +-/ + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on the three-derivative-index B-boson jet coordinates: + all four indices transform contravariantly, by the columns of the Lorentz + matrix. -/ +lemma _root_.StandardModel.BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple + (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetComponentSpace.repLorentzGroup Λ + (BBoson.JetComponentSpace.basis (.dB {ρ, τ, μ} ν)) = + ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • + BBoson.JetComponentSpace.basis (.dB {r, s, a} b) := by + have htriple : ∀ x y z : Fin 1 ⊕ Fin 3, + LagrangianTheory.dualRealJetAlgebraBasis ({x, y, z} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis x) * + (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis y) * + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis z)) := fun x y z => by + rw [← BBoson.dualRealJetAlgebraBasis_singleton, + ← BBoson.dualRealJetAlgebraBasis_singleton, + ← BBoson.dualRealJetAlgebraBasis_singleton, + BBoson.dualRealJetAlgebraBasis_mul, BBoson.dualRealJetAlgebraBasis_mul, + Multiset.singleton_add, Multiset.singleton_add, ← Multiset.insert_eq_cons, + ← Multiset.insert_eq_cons] + have hmul : ∀ x y : DerivAlgebraReal, + DerivAlgebraReal.repLorentzGroup Λ (x * y) = + DerivAlgebraReal.repLorentzGroup Λ x * + DerivAlgebraReal.repLorentzGroup Λ y := fun x y => + map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + Lorentz.CoVector.sl2Rep.dual Λ)) x y + have happ : BBoson.JetComponentSpace.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ} ⊗ₜ[ℝ] + StandardModel.BBoson.basis.dualBasis ν) = + (DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ})) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ + (StandardModel.BBoson.basis.dualBasis ν)) := rfl + rw [BBoson.jetComponentSpace_basis_dB, happ, htriple, hmul, hmul, + DerivAlgebraReal.repLorentzGroup_apply_ι, + DerivAlgebraReal.repLorentzGroup_apply_ι, + DerivAlgebraReal.repLorentzGroup_apply_ι, + Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, + Lorentz.CoVector.sl2Rep_dual_dualBasis, + BBoson.repLorentzGroup_dual_dualBasis] + simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, + smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, + ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, + smul_smul, BBoson.jetComponentSpace_basis_dB, htriple] + conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] + conv_lhs => enter [2, i]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] + conv_lhs => enter [2, i]; rw [Finset.sum_comm] + conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => + Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + module + +set_option maxHeartbeats 2000000 in +/-- The transformation law of the second-derivative field strength on the + B-boson jet algebra: a four-index tensor. -/ +lemma _root_.StandardModel.BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_pair + (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = + ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • + BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b := by + have hFS : ∀ r s a b : Fin 1 ⊕ Fin 3, + BBoson.JetAlgebra.fieldStrengthDeriv ({r, s} : Multiset _) a b = + BBoson.JetAlgebra.ofGenerator (.dB {r, s, a} b) - + BBoson.JetAlgebra.ofGenerator (.dB {r, s, b} a) := fun r s a b => by + rw [BBoson.JetAlgebra.fieldStrengthDeriv, + show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, s, a} from by + rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, + ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons], + show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, s, b} from by + rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, + ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons]] + simp only [hFS] + rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple] + simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, + BBoson.JetAlgebra.ofGenerator] + rw [sub_right_inj] + conv_rhs => enter [2, r, 2, s]; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => + Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + congr 1 + ring + +/-- The transformation of the complexified second-derivative field strength. -/ +lemma _root_.StandardModel.BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair + (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = + ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b) := by + rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) from rfl, + BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_pair] + simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] + +set_option maxHeartbeats 2000000 in +/-- The transformation law of the embedded second-derivative field strength: + a four-index tensor, all indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) + (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) = + ∑ r, ∑ s, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) : ℝ)) : ℂ) • + fieldStrengthDeriv {r, s} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + +/-! + +### Commutation and anticommutation of the covariant factors + +-/ + +/-- The embedded field-strength derivatives commute: they live in the + commutative bosonic factor of the jet algebra. -/ +lemma fieldStrengthDeriv_mul_comm (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν ρ τ : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' ρ τ = + fieldStrengthDeriv s' ρ τ * fieldStrengthDeriv s μ ν := by + rw [fieldStrengthDeriv, fieldStrengthDeriv, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, + mul_comm (BBoson.JetAlgebra.fieldStrengthDeriv s μ ν)] + +set_option maxHeartbeats 16000000 in +/-- The embedded lepton-linear and conjugate-linear elements anticommute: + both are odd elements of the exterior factor of the jet algebra. -/ +lemma leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm (x : LeptonLinear) + (y : ConjLeptonLinear) : + leptonLinearIncl x * conjLeptonLinearIncl y = + -(conjLeptonLinearIncl y * leptonLinearIncl x) := by + have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z + have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hι : ∀ (a : LeptonComponent) (b : ConjLeptonComponent), + leptonComponentIncl a * conjLeptonComponentIncl b = + -(conjLeptonComponentIncl b * leptonComponentIncl a) := fun a b => by + rw [leptonComponentIncl_apply, conjLeptonComponentIncl_apply] + exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, neg_zero] + | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] + | tmul p a => + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, hz₂, hz₁, neg_zero] + | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] + | tmul q b => + rw [leptonLinearIncl_tmul, conjLeptonLinearIncl_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + hι a b, mul_comm q p, TensorProduct.tmul_neg] + +/-- The covariant lepton derivatives anticommute with the conjugate covariant + derivatives. -/ +lemma Dψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dψ l α * Dbarψ l' β = -(Dbarψ l' β * Dψ l α) := by + rw [Dψ_eq_leptonLinearIncl, Dbarψ_eq_conjLeptonLinearIncl, + leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm] + +set_option maxHeartbeats 16000000 in +/-- Two embedded lepton-linear elements anticommute. -/ +lemma leptonLinearIncl_mul_leptonLinearIncl_anticomm (x y : LeptonLinear) : + leptonLinearIncl x * leptonLinearIncl y = + -(leptonLinearIncl y * leptonLinearIncl x) := by + have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z + have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hι : ∀ a b : LeptonComponent, + leptonComponentIncl a * leptonComponentIncl b = + -(leptonComponentIncl b * leptonComponentIncl a) := fun a b => by + rw [leptonComponentIncl_apply, leptonComponentIncl_apply] + exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, neg_zero] + | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] + | tmul p a => + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, hz₂, hz₁, neg_zero] + | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] + | tmul q b => + rw [leptonLinearIncl_tmul, leptonLinearIncl_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + hι a b, mul_comm q p, TensorProduct.tmul_neg] + +/-- Two covariant lepton derivatives anticommute. -/ +lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dψ l α * Dψ l' β = -(Dψ l' β * Dψ l α) := by + rw [Dψ_eq_leptonLinearIncl, Dψ_eq_leptonLinearIncl, + leptonLinearIncl_mul_leptonLinearIncl_anticomm] + +/-! + +### Parametric boosts along the three axes + +The one-parameter families of boosts `diag(t, t⁻¹)` (along `z`) and their +conjugates along `x` and `y`, with symbolic Lorentz matrices in `t`. + +-/ + +/-- The lift `diag(t, t⁻¹)` of the boost along the `z`-axis with rapidity + `2 log t`. -/ +noncomputable def boostZel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![(t : ℂ), 0; 0, (t : ℂ)⁻¹], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + simp [mul_inv_cancel₀ htc]⟩ + +/-- The lift of the boost along the `x`-axis with rapidity `2 log t`. -/ +noncomputable def boostXel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, ((t : ℂ) - (t : ℂ)⁻¹)/2; + ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + field_simp + ring⟩ + +/-- The lift of the boost along the `y`-axis with rapidity `2 log t`. -/ +noncomputable def boostYel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; + Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have h2 : -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) = + ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + have hI : -Complex.I * Complex.I = 1 := by + rw [neg_mul, Complex.I_mul_I, neg_neg] + calc -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) + = (-Complex.I * Complex.I) * + (((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2)) := by + ring + _ = ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + rw [hI, one_mul] + rw [Matrix.det_fin_two_of, h2] + field_simp + ring⟩ + +/-- The Lorentz matrix of `boostZel t`: `ch = (t² + t⁻²)/2` on the time-time + and `zz` entries, `-sh = -(t² - t⁻²)/2` on the mixed entries. -/ +noncomputable def boostMatZ (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 2 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 2, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => (t^2 + (t⁻¹)^2)/2 + | _, _ => 0 + +/-- The Lorentz matrix of `boostXel t`. -/ +noncomputable def boostMatX (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 0 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => (t^2 + (t⁻¹)^2)/2 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 1 + | _, _ => 0 + +/-- The Lorentz matrix of `boostYel t`. -/ +noncomputable def boostMatY (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 1 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 1, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => (t^2 + (t⁻¹)^2)/2 + | Sum.inr 2, Sum.inr 2 => 1 + | _, _ => 0 + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `z`-boost. -/ +lemma toLorentzGroup_boostZel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostZel t ht)).1 a b = boostMatZ t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostZel, boostMatZ, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `x`-boost. -/ +lemma toLorentzGroup_boostXel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostXel t ht)).1 a b = boostMatX t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostXel, boostMatX, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `y`-boost. -/ +lemma toLorentzGroup_boostYel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostYel t ht)).1 a b = boostMatY t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostYel, boostMatY, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +/-- The inverse of the parametric `z`-boost is the boost at the inverse + parameter. -/ +lemma boostZel_inv (t : ℝ) (ht : t ≠ 0) : + (boostZel t ht)⁻¹ = boostZel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + simp [boostZel, Complex.ofReal_inv, inv_inv] + +/-- The inverse of the parametric `x`-boost is the boost at the inverse + parameter. -/ +lemma boostXel_inv (t : ℝ) (ht : t ≠ 0) : + (boostXel t ht)⁻¹ = boostXel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + · simp [boostXel, Complex.ofReal_inv, inv_inv] + try ring + +/-- The inverse of the parametric `y`-boost is the boost at the inverse + parameter. -/ +lemma boostYel_inv (t : ℝ) (ht : t ≠ 0) : + (boostYel t ht)⁻¹ = boostYel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + · simp [boostYel, Complex.ofReal_inv, inv_inv] + try ring + +/-- The inverse of the parametric `z`-boost, entrywise, with real entries. -/ +lemma boostZel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostZel t ht)⁻¹ : SL(2,ℂ)).1 = + !![(((t⁻¹ : ℝ)) : ℂ), 0; 0, ((t : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostZel] + +/-- The inverse of the parametric `x`-boost, entrywise. -/ +lemma boostXel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostXel t ht)⁻¹ : SL(2,ℂ)).1 = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, -(((t : ℂ) - (t : ℂ)⁻¹)/2); + -(((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostXel] + +/-- The inverse of the parametric `y`-boost, entrywise. -/ +lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostYel t ht)⁻¹ : SL(2,ℂ)).1 = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; + -(Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring + +/-- The Lorentz matrix of the inverse `z`-boost: the boost matrix at the + inverse parameter. -/ +lemma toLorentzGroup_boostZel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostZel t ht)⁻¹).1 a b = boostMatZ t⁻¹ a b := by + rw [boostZel_inv, toLorentzGroup_boostZel] + +/-- The Lorentz matrix of the inverse `x`-boost. -/ +lemma toLorentzGroup_boostXel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostXel t ht)⁻¹).1 a b = boostMatX t⁻¹ a b := by + rw [boostXel_inv, toLorentzGroup_boostXel] + +/-- The Lorentz matrix of the inverse `y`-boost. -/ +lemma toLorentzGroup_boostYel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostYel t ht)⁻¹).1 a b = boostMatY t⁻¹ a b := by + rw [boostYel_inv, toLorentzGroup_boostYel] + +/-! + +### The four invariants in monomial form + +-/ + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Maxwell term as an explicit combination of the six independent + field-strength squares. -/ +lemma maxwellTerm_eq : maxwellTerm = + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z + have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z + have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind + have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind + rw [maxwellTerm] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + minkowskiMatrix.inl_0_inl_0, minkowskiMatrix.inr_i_inr_i, + fieldStrengthDeriv_self, hz₁, hz₂, smul_zero, add_zero, zero_add] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + hnm, hmn, neg_neg] + push_cast + module + +set_option maxHeartbeats 8000000 in +set_option linter.unusedSimpArgs false in +/-- The theta term as an explicit combination of the three pair-partition + products of field strengths. -/ +lemma thetaTerm_eq : thetaTerm = + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind + have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind + rw [thetaTerm] + conv_lhs => + enter [2, p] + rw [show (1 : Fin 4) = (0 : Fin 3).succ from rfl, + show (2 : Fin 4) = (1 : Fin 3).succ from rfl, + show (3 : Fin 4) = (2 : Fin 3).succ from rfl] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i, 2, j] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i, 2, j, 2, k] + rw [Fintype.sum_subsingleton _ (1 : Equiv.Perm (Fin 1))] + simp only [Equiv.coe_toEmbedding, Fin.sum_univ_four, Fin.sum_univ_three, + Fin.sum_univ_two, + show ((1 : Fin 3)) = (0 : Fin 2).succ from rfl, + show ((2 : Fin 3)) = (1 : Fin 2).succ from rfl, + Equiv.Perm.decomposeFin_symm_of_one, + Equiv.Perm.decomposeFin.symm_sign, + Equiv.Perm.decomposeFin_symm_apply_zero, + Equiv.Perm.decomposeFin_symm_apply_one, + Equiv.Perm.decomposeFin_symm_apply_succ] + simp only [show ((0 : Fin 2).succ) = (1 : Fin 3) from rfl, + show ((1 : Fin 2).succ) = (2 : Fin 3) from rfl, + show ((0 : Fin 3).succ) = (1 : Fin 4) from rfl, + show ((1 : Fin 3).succ) = (2 : Fin 4) from rfl, + show ((2 : Fin 3).succ) = (3 : Fin 4) from rfl, + Equiv.swap_self, Equiv.Perm.sign_refl, Equiv.refl_apply, Equiv.Perm.sign_one, + Equiv.swap_apply_left, Equiv.swap_apply_right, Equiv.swap_apply_of_ne_of_ne, + Equiv.Perm.sign_swap', Fin.reduceEq, reduceIte, ne_eq, not_false_iff, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 0) = Sum.inl 0 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 1) = Sum.inr 0 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 2) = Sum.inr 1 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 3) = Sum.inr 2 from rfl, + Units.val_one, Units.val_neg, one_smul, neg_smul, one_mul, mul_one] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + hnm, hmn, neg_neg] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _] + module + +set_option maxHeartbeats 2000000 in +set_option linter.unusedSimpArgs false in +/-- The fermion kinetic term as an explicit combination of the eight + `ψ̄ (D ψ)` monomials. -/ +lemma fermionKineticTerm_eq : fermionKineticTerm = + Complex.I • ((Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - Complex.I • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) := by + rw [fermionKineticTerm] + congr 1 + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + Fin.sum_univ_two] + norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.transpose_apply, Matrix.one_apply] + module + +set_option maxHeartbeats 2000000 in +set_option linter.unusedSimpArgs false in +/-- The conjugate fermion kinetic term as an explicit combination of the eight + `(D̄ ψ̄) ψ` monomials. -/ +lemma fermionKineticTermBar_eq : fermionKineticTermBar = + (-Complex.I) • ((Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - Complex.I • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) := by + rw [fermionKineticTermBar] + congr 1 + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + Fin.sum_univ_two] + norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.transpose_apply, Matrix.one_apply] + module + +/-! + +### The symmetrised boost average on the weight-eight sector + +For each axis `T ∈ {Z, X, Y}` the paired boost actions `rep(boost) + rep(boost⁻¹)` +at `t` and `t⁻¹` act on the Klein-symmetric weight-eight basis vectors with +even coefficients in the boost parameter. A rational combination of the +paired boosts at `t = 2, 3, 4` together with the identity (`boostProjZ/X/Y`) +realises the Klein-restricted single-axis averages, and their mean `opS` +fixes every Lorentz-invariant vector while acting on the weight-eight basis +by an explicit rational matrix (the `opS_*` stage lemmas below). + +-/ + +section SectorEight + +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +/-- Left distribution in the jet algebra, in a form usable by `simp`. -/ +lemma mul_add_jet (x y z : JetAlgebra) : x * (y + z) = x * y + x * z := by grind + +/-- Right distribution in the jet algebra, in a form usable by `simp`. -/ +lemma add_mul_jet (x y z : JetAlgebra) : (x + y) * z = x * z + y * z := by grind + +/-- Scalar rearrangement of a product of two scaled elements. -/ +lemma smul_mul_smul_jet (c d : ℂ) (x y : JetAlgebra) : + (c • x) * (d • y) = (c * d) • (x * y) := by + rw [smul_mul_smul_comm] + +/-- Scalars pull out of the left factor of a product. -/ +lemma smul_mul_jet (c : ℂ) (x y : JetAlgebra) : (c • x) * y = c • (x * y) := by + rw [smul_mul_assoc] + +/-- Scalars pull out of the right factor of a product. -/ +lemma mul_smul_jet (c : ℂ) (x y : JetAlgebra) : x * (c • y) = c • (x * y) := by + rw [mul_smul_comm] + +/-- Reordering the two derivative indices of a second-derivative field + strength. -/ +lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {r, s} a b = fieldStrengthDeriv {s, r} a b := by + have h : ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) = {s, r} := Multiset.cons_swap r s 0 + rw [h] + +lemma boostMatZ_00 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatZ_01 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 0) = 0 := rfl +lemma boostMatZ_02 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 1) = 0 := rfl +lemma boostMatZ_03 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 2) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatZ_10 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inl 0) = 0 := rfl +lemma boostMatZ_11 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 0) = 1 := rfl +lemma boostMatZ_12 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 1) = 0 := rfl +lemma boostMatZ_13 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 2) = 0 := rfl +lemma boostMatZ_20 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inl 0) = 0 := rfl +lemma boostMatZ_21 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 0) = 0 := rfl +lemma boostMatZ_22 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 1) = 1 := rfl +lemma boostMatZ_23 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 2) = 0 := rfl +lemma boostMatZ_30 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatZ_31 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 0) = 0 := rfl +lemma boostMatZ_32 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 1) = 0 := rfl +lemma boostMatZ_33 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 2) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl + +lemma boostMatX_00 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatX_01 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatX_02 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 1) = 0 := rfl +lemma boostMatX_03 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 2) = 0 := rfl +lemma boostMatX_10 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatX_11 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatX_12 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 1) = 0 := rfl +lemma boostMatX_13 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 2) = 0 := rfl +lemma boostMatX_20 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inl 0) = 0 := rfl +lemma boostMatX_21 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 0) = 0 := rfl +lemma boostMatX_22 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 1) = 1 := rfl +lemma boostMatX_23 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 2) = 0 := rfl +lemma boostMatX_30 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inl 0) = 0 := rfl +lemma boostMatX_31 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 0) = 0 := rfl +lemma boostMatX_32 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 1) = 0 := rfl +lemma boostMatX_33 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 2) = 1 := rfl + +lemma boostMatY_00 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatY_01 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 0) = 0 := rfl +lemma boostMatY_02 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 1) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatY_03 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 2) = 0 := rfl +lemma boostMatY_10 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inl 0) = 0 := rfl +lemma boostMatY_11 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 0) = 1 := rfl +lemma boostMatY_12 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 1) = 0 := rfl +lemma boostMatY_13 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 2) = 0 := rfl +lemma boostMatY_20 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatY_21 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 0) = 0 := rfl +lemma boostMatY_22 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 1) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatY_23 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 2) = 0 := rfl +lemma boostMatY_30 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inl 0) = 0 := rfl +lemma boostMatY_31 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 0) = 0 := rfl +lemma boostMatY_32 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 1) = 0 := rfl +lemma boostMatY_33 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 2) = 1 := rfl + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on a fermion pair `ψ̄_α (Dψ_μ)_β` with one derivative on + the unbarred factor. -/ +lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) = + ∑ γ, ∑ ν, ∑ δ, ((Λ⁻¹).1 α γ * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β δ))) • (Dbarψ [] γ * Dψ [ν] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_mul', repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] + simp only [hsm, hms, hms₂, hsmul] + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on a fermion pair `(D̄ψ̄_μ)_α ψ_β` with one derivative on + the barred factor. -/ +lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) = + ∑ ν, ∑ γ, ∑ δ, (((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α γ) * star ((Λ⁻¹).1 β δ)) • (Dbarψ [ν] γ * Dψ [] δ) := by + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsm₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_mul', repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] + simp only [hsm, hsm₂, hms, hsmul] + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F01`. -/ +lemma genZ_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F02`. -/ +lemma genZ_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F03`. -/ +lemma genZ_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F12`. -/ +lemma genZ_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F13`. -/ +lemma genZ_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F23`. -/ +lemma genZ_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F01`. -/ +lemma genX_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F02`. -/ +lemma genX_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F03`. -/ +lemma genX_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F12`. -/ +lemma genX_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F13`. -/ +lemma genX_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F23`. -/ +lemma genX_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F01`. -/ +lemma genY_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F02`. -/ +lemma genY_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F03`. -/ +lemma genY_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F12`. -/ +lemma genY_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F13`. -/ +lemma genY_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F23`. -/ +lemma genY_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma genZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma genZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma genZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma genZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma genZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma genZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma genZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma genZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma genZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma genZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma genZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma genZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma genX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma genX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma genX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma genX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma genX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma genX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma genX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma genX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma genX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma genX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma genX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma genX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma genY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma genY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma genY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma genY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma genY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma genY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma genY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma genY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma genY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma genY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma genY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma genY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F01 * F01`. -/ +lemma pairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F01 t ht, + genZ_F01 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F01 * F23`. -/ +lemma pairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F01 t ht, + genZ_F01 t⁻¹ (inv_ne_zero ht), + genZ_F23 t ht, + genZ_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F02 * F02`. -/ +lemma pairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F02 t ht, + genZ_F02 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F02 * F13`. -/ +lemma pairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F02 t ht, + genZ_F02 t⁻¹ (inv_ne_zero ht), + genZ_F13 t ht, + genZ_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F03 * F03`. -/ +lemma pairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F03 t ht, + genZ_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F03 * F12`. -/ +lemma pairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F03 t ht, + genZ_F03 t⁻¹ (inv_ne_zero ht), + genZ_F12 t ht, + genZ_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F12 * F12`. -/ +lemma pairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F12 t ht, + genZ_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F13 * F13`. -/ +lemma pairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F13 t ht, + genZ_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F23 * F23`. -/ +lemma pairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genZ_F23 t ht, + genZ_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F01 * F01`. -/ +lemma pairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F01 t ht, + genX_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F01 * F23`. -/ +lemma pairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F01 t ht, + genX_F01 t⁻¹ (inv_ne_zero ht), + genX_F23 t ht, + genX_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F02 * F02`. -/ +lemma pairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F02 t ht, + genX_F02 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F02 * F13`. -/ +lemma pairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F02 t ht, + genX_F02 t⁻¹ (inv_ne_zero ht), + genX_F13 t ht, + genX_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F03 * F03`. -/ +lemma pairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F03 t ht, + genX_F03 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F03 * F12`. -/ +lemma pairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F03 t ht, + genX_F03 t⁻¹ (inv_ne_zero ht), + genX_F12 t ht, + genX_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F12 * F12`. -/ +lemma pairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F12 t ht, + genX_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F13 * F13`. -/ +lemma pairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F13 t ht, + genX_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F23 * F23`. -/ +lemma pairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genX_F23 t ht, + genX_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F01 * F01`. -/ +lemma pairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F01 t ht, + genY_F01 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F01 * F23`. -/ +lemma pairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F01 t ht, + genY_F01 t⁻¹ (inv_ne_zero ht), + genY_F23 t ht, + genY_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F02 * F02`. -/ +lemma pairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F02 t ht, + genY_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F02 * F13`. -/ +lemma pairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F02 t ht, + genY_F02 t⁻¹ (inv_ne_zero ht), + genY_F13 t ht, + genY_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F03 * F03`. -/ +lemma pairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F03 t ht, + genY_F03 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F03 * F12`. -/ +lemma pairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F03 t ht, + genY_F03 t⁻¹ (inv_ne_zero ht), + genY_F12 t ht, + genY_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F12 * F12`. -/ +lemma pairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F12 t ht, + genY_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F13 * F13`. -/ +lemma pairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F13 t ht, + genY_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F23 * F23`. -/ +lemma pairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + simp only [genY_F23 t ht, + genY_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F01` with + derivative indices `(0, 1)`. -/ +lemma pairZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd01_F01 t ht, genZ_dd01_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F23` with + derivative indices `(0, 1)`. -/ +lemma pairZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd01_F23 t ht, genZ_dd01_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F02` with + derivative indices `(0, 2)`. -/ +lemma pairZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd02_F02 t ht, genZ_dd02_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F13` with + derivative indices `(0, 2)`. -/ +lemma pairZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd02_F13 t ht, genZ_dd02_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F03` with + derivative indices `(0, 3)`. -/ +lemma pairZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd03_F03 t ht, genZ_dd03_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F12` with + derivative indices `(0, 3)`. -/ +lemma pairZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd03_F12 t ht, genZ_dd03_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F03` with + derivative indices `(1, 2)`. -/ +lemma pairZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd12_F03 t ht, genZ_dd12_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F12` with + derivative indices `(1, 2)`. -/ +lemma pairZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd12_F12 t ht, genZ_dd12_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F02` with + derivative indices `(1, 3)`. -/ +lemma pairZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd13_F02 t ht, genZ_dd13_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F13` with + derivative indices `(1, 3)`. -/ +lemma pairZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd13_F13 t ht, genZ_dd13_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F01` with + derivative indices `(2, 3)`. -/ +lemma pairZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd23_F01 t ht, genZ_dd23_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F23` with + derivative indices `(2, 3)`. -/ +lemma pairZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd23_F23 t ht, genZ_dd23_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F01` with + derivative indices `(0, 1)`. -/ +lemma pairX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd01_F01 t ht, genX_dd01_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F23` with + derivative indices `(0, 1)`. -/ +lemma pairX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd01_F23 t ht, genX_dd01_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F02` with + derivative indices `(0, 2)`. -/ +lemma pairX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd02_F02 t ht, genX_dd02_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F13` with + derivative indices `(0, 2)`. -/ +lemma pairX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd02_F13 t ht, genX_dd02_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F03` with + derivative indices `(0, 3)`. -/ +lemma pairX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd03_F03 t ht, genX_dd03_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F12` with + derivative indices `(0, 3)`. -/ +lemma pairX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd03_F12 t ht, genX_dd03_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F03` with + derivative indices `(1, 2)`. -/ +lemma pairX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd12_F03 t ht, genX_dd12_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F12` with + derivative indices `(1, 2)`. -/ +lemma pairX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd12_F12 t ht, genX_dd12_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F02` with + derivative indices `(1, 3)`. -/ +lemma pairX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd13_F02 t ht, genX_dd13_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F13` with + derivative indices `(1, 3)`. -/ +lemma pairX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd13_F13 t ht, genX_dd13_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F01` with + derivative indices `(2, 3)`. -/ +lemma pairX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd23_F01 t ht, genX_dd23_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F23` with + derivative indices `(2, 3)`. -/ +lemma pairX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd23_F23 t ht, genX_dd23_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F01` with + derivative indices `(0, 1)`. -/ +lemma pairY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd01_F01 t ht, genY_dd01_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F23` with + derivative indices `(0, 1)`. -/ +lemma pairY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd01_F23 t ht, genY_dd01_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F02` with + derivative indices `(0, 2)`. -/ +lemma pairY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd02_F02 t ht, genY_dd02_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F13` with + derivative indices `(0, 2)`. -/ +lemma pairY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd02_F13 t ht, genY_dd02_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F03` with + derivative indices `(0, 3)`. -/ +lemma pairY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd03_F03 t ht, genY_dd03_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F12` with + derivative indices `(0, 3)`. -/ +lemma pairY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd03_F12 t ht, genY_dd03_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F03` with + derivative indices `(1, 2)`. -/ +lemma pairY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd12_F03 t ht, genY_dd12_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F12` with + derivative indices `(1, 2)`. -/ +lemma pairY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd12_F12 t ht, genY_dd12_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F02` with + derivative indices `(1, 3)`. -/ +lemma pairY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd13_F02 t ht, genY_dd13_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F13` with + derivative indices `(1, 3)`. -/ +lemma pairY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd13_F13 t ht, genY_dd13_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F01` with + derivative indices `(2, 3)`. -/ +lemma pairY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd23_F01 t ht, genY_dd23_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F23` with + derivative indices `(2, 3)`. -/ +lemma pairY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd23_F23 t ht, genY_dd23_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u0`. -/ +lemma pairZ_u0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u1`. -/ +lemma pairZ_u1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u2`. -/ +lemma pairZ_u2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u3`. -/ +lemma pairZ_u3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u0`. -/ +lemma pairX_u0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u1`. -/ +lemma pairX_u1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u2`. -/ +lemma pairX_u2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u3`. -/ +lemma pairX_u3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u0`. -/ +lemma pairY_u0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u1`. -/ +lemma pairY_u1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u2`. -/ +lemma pairY_u2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u3`. -/ +lemma pairY_u3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar0`. -/ +lemma pairZ_ubar0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar1`. -/ +lemma pairZ_ubar1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar2`. -/ +lemma pairZ_ubar2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar3`. -/ +lemma pairZ_ubar3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar0`. -/ +lemma pairX_ubar0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar1`. -/ +lemma pairX_ubar1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar2`. -/ +lemma pairX_ubar2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar3`. -/ +lemma pairX_ubar3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar0`. -/ +lemma pairY_ubar0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar1`. -/ +lemma pairY_ubar1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar2`. -/ +lemma pairY_ubar2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar3`. -/ +lemma pairY_ubar3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +/-- The `Z`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the Klein-restricted single-axis + average on the weight-eight sector. -/ +noncomputable def boostProjZ : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + + repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + + repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + + repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) + +/-- The `X`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the Klein-restricted single-axis + average on the weight-eight sector. -/ +noncomputable def boostProjX : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + + repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + + repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + + repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) + +/-- The `Y`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the Klein-restricted single-axis + average on the weight-eight sector. -/ +noncomputable def boostProjY : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + + repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + + repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + + repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) + +/-- The symmetrised boost average over the three axes. -/ +noncomputable def opS : Module.End ℂ JetAlgebra := + (3⁻¹ : ℂ) • (boostProjZ + boostProjX + boostProjY) + +/-- The operator `opS` fixes every Lorentz-invariant vector: each boost term + fixes it and the weights sum to one. -/ +lemma opS_apply_of_invariant {y : JetAlgebra} + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opS y = y := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply, hinv] + match_scalars + norm_num + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F01 * F01`. -/ +lemma opS_F01_F01 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F01_F01 2 (by norm_num), + pairZ_F01_F01 3 (by norm_num), + pairZ_F01_F01 4 (by norm_num), + pairX_F01_F01 2 (by norm_num), + pairX_F01_F01 3 (by norm_num), + pairX_F01_F01 4 (by norm_num), + pairY_F01_F01 2 (by norm_num), + pairY_F01_F01 3 (by norm_num), + pairY_F01_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F01 * F23`. -/ +lemma opS_F01_F23 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F01_F23 2 (by norm_num), + pairZ_F01_F23 3 (by norm_num), + pairZ_F01_F23 4 (by norm_num), + pairX_F01_F23 2 (by norm_num), + pairX_F01_F23 3 (by norm_num), + pairX_F01_F23 4 (by norm_num), + pairY_F01_F23 2 (by norm_num), + pairY_F01_F23 3 (by norm_num), + pairY_F01_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F02 * F02`. -/ +lemma opS_F02_F02 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F02_F02 2 (by norm_num), + pairZ_F02_F02 3 (by norm_num), + pairZ_F02_F02 4 (by norm_num), + pairX_F02_F02 2 (by norm_num), + pairX_F02_F02 3 (by norm_num), + pairX_F02_F02 4 (by norm_num), + pairY_F02_F02 2 (by norm_num), + pairY_F02_F02 3 (by norm_num), + pairY_F02_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F02 * F13`. -/ +lemma opS_F02_F13 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F02_F13 2 (by norm_num), + pairZ_F02_F13 3 (by norm_num), + pairZ_F02_F13 4 (by norm_num), + pairX_F02_F13 2 (by norm_num), + pairX_F02_F13 3 (by norm_num), + pairX_F02_F13 4 (by norm_num), + pairY_F02_F13 2 (by norm_num), + pairY_F02_F13 3 (by norm_num), + pairY_F02_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F03 * F03`. -/ +lemma opS_F03_F03 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F03_F03 2 (by norm_num), + pairZ_F03_F03 3 (by norm_num), + pairZ_F03_F03 4 (by norm_num), + pairX_F03_F03 2 (by norm_num), + pairX_F03_F03 3 (by norm_num), + pairX_F03_F03 4 (by norm_num), + pairY_F03_F03 2 (by norm_num), + pairY_F03_F03 3 (by norm_num), + pairY_F03_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F03 * F12`. -/ +lemma opS_F03_F12 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F03_F12 2 (by norm_num), + pairZ_F03_F12 3 (by norm_num), + pairZ_F03_F12 4 (by norm_num), + pairX_F03_F12 2 (by norm_num), + pairX_F03_F12 3 (by norm_num), + pairX_F03_F12 4 (by norm_num), + pairY_F03_F12 2 (by norm_num), + pairY_F03_F12 3 (by norm_num), + pairY_F03_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F12 * F12`. -/ +lemma opS_F12_F12 : + opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F12_F12 2 (by norm_num), + pairZ_F12_F12 3 (by norm_num), + pairZ_F12_F12 4 (by norm_num), + pairX_F12_F12 2 (by norm_num), + pairX_F12_F12 3 (by norm_num), + pairX_F12_F12 4 (by norm_num), + pairY_F12_F12 2 (by norm_num), + pairY_F12_F12 3 (by norm_num), + pairY_F12_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F13 * F13`. -/ +lemma opS_F13_F13 : + opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F13_F13 2 (by norm_num), + pairZ_F13_F13 3 (by norm_num), + pairZ_F13_F13 4 (by norm_num), + pairX_F13_F13 2 (by norm_num), + pairX_F13_F13 3 (by norm_num), + pairX_F13_F13 4 (by norm_num), + pairY_F13_F13 2 (by norm_num), + pairY_F13_F13 3 (by norm_num), + pairY_F13_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F23 * F23`. -/ +lemma opS_F23_F23 : + opS (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F23_F23 2 (by norm_num), + pairZ_F23_F23 3 (by norm_num), + pairZ_F23_F23 4 (by norm_num), + pairX_F23_F23 2 (by norm_num), + pairX_F23_F23 3 (by norm_num), + pairX_F23_F23 4 (by norm_num), + pairY_F23_F23 2 (by norm_num), + pairY_F23_F23 3 (by norm_num), + pairY_F23_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma opS_dd01_F01 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd01_F01 2 (by norm_num), + pairZ_dd01_F01 3 (by norm_num), + pairZ_dd01_F01 4 (by norm_num), + pairX_dd01_F01 2 (by norm_num), + pairX_dd01_F01 3 (by norm_num), + pairX_dd01_F01 4 (by norm_num), + pairY_dd01_F01 2 (by norm_num), + pairY_dd01_F01 3 (by norm_num), + pairY_dd01_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma opS_dd01_F23 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd01_F23 2 (by norm_num), + pairZ_dd01_F23 3 (by norm_num), + pairZ_dd01_F23 4 (by norm_num), + pairX_dd01_F23 2 (by norm_num), + pairX_dd01_F23 3 (by norm_num), + pairX_dd01_F23 4 (by norm_num), + pairY_dd01_F23 2 (by norm_num), + pairY_dd01_F23 3 (by norm_num), + pairY_dd01_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma opS_dd02_F02 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd02_F02 2 (by norm_num), + pairZ_dd02_F02 3 (by norm_num), + pairZ_dd02_F02 4 (by norm_num), + pairX_dd02_F02 2 (by norm_num), + pairX_dd02_F02 3 (by norm_num), + pairX_dd02_F02 4 (by norm_num), + pairY_dd02_F02 2 (by norm_num), + pairY_dd02_F02 3 (by norm_num), + pairY_dd02_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma opS_dd02_F13 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd02_F13 2 (by norm_num), + pairZ_dd02_F13 3 (by norm_num), + pairZ_dd02_F13 4 (by norm_num), + pairX_dd02_F13 2 (by norm_num), + pairX_dd02_F13 3 (by norm_num), + pairX_dd02_F13 4 (by norm_num), + pairY_dd02_F13 2 (by norm_num), + pairY_dd02_F13 3 (by norm_num), + pairY_dd02_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma opS_dd03_F03 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd03_F03 2 (by norm_num), + pairZ_dd03_F03 3 (by norm_num), + pairZ_dd03_F03 4 (by norm_num), + pairX_dd03_F03 2 (by norm_num), + pairX_dd03_F03 3 (by norm_num), + pairX_dd03_F03 4 (by norm_num), + pairY_dd03_F03 2 (by norm_num), + pairY_dd03_F03 3 (by norm_num), + pairY_dd03_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma opS_dd03_F12 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd03_F12 2 (by norm_num), + pairZ_dd03_F12 3 (by norm_num), + pairZ_dd03_F12 4 (by norm_num), + pairX_dd03_F12 2 (by norm_num), + pairX_dd03_F12 3 (by norm_num), + pairX_dd03_F12 4 (by norm_num), + pairY_dd03_F12 2 (by norm_num), + pairY_dd03_F12 3 (by norm_num), + pairY_dd03_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma opS_dd12_F03 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd12_F03 2 (by norm_num), + pairZ_dd12_F03 3 (by norm_num), + pairZ_dd12_F03 4 (by norm_num), + pairX_dd12_F03 2 (by norm_num), + pairX_dd12_F03 3 (by norm_num), + pairX_dd12_F03 4 (by norm_num), + pairY_dd12_F03 2 (by norm_num), + pairY_dd12_F03 3 (by norm_num), + pairY_dd12_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma opS_dd12_F12 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd12_F12 2 (by norm_num), + pairZ_dd12_F12 3 (by norm_num), + pairZ_dd12_F12 4 (by norm_num), + pairX_dd12_F12 2 (by norm_num), + pairX_dd12_F12 3 (by norm_num), + pairX_dd12_F12 4 (by norm_num), + pairY_dd12_F12 2 (by norm_num), + pairY_dd12_F12 3 (by norm_num), + pairY_dd12_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma opS_dd13_F02 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd13_F02 2 (by norm_num), + pairZ_dd13_F02 3 (by norm_num), + pairZ_dd13_F02 4 (by norm_num), + pairX_dd13_F02 2 (by norm_num), + pairX_dd13_F02 3 (by norm_num), + pairX_dd13_F02 4 (by norm_num), + pairY_dd13_F02 2 (by norm_num), + pairY_dd13_F02 3 (by norm_num), + pairY_dd13_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma opS_dd13_F13 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd13_F13 2 (by norm_num), + pairZ_dd13_F13 3 (by norm_num), + pairZ_dd13_F13 4 (by norm_num), + pairX_dd13_F13 2 (by norm_num), + pairX_dd13_F13 3 (by norm_num), + pairX_dd13_F13 4 (by norm_num), + pairY_dd13_F13 2 (by norm_num), + pairY_dd13_F13 3 (by norm_num), + pairY_dd13_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma opS_dd23_F01 : + opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd23_F01 2 (by norm_num), + pairZ_dd23_F01 3 (by norm_num), + pairZ_dd23_F01 4 (by norm_num), + pairX_dd23_F01 2 (by norm_num), + pairX_dd23_F01 3 (by norm_num), + pairX_dd23_F01 4 (by norm_num), + pairY_dd23_F01 2 (by norm_num), + pairY_dd23_F01 3 (by norm_num), + pairY_dd23_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma opS_dd23_F23 : + opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd23_F23 2 (by norm_num), + pairZ_dd23_F23 3 (by norm_num), + pairZ_dd23_F23 4 (by norm_num), + pairX_dd23_F23 2 (by norm_num), + pairX_dd23_F23 3 (by norm_num), + pairX_dd23_F23 4 (by norm_num), + pairY_dd23_F23 2 (by norm_num), + pairY_dd23_F23 3 (by norm_num), + pairY_dd23_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u0`. -/ +lemma opS_u0 : + opS (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (-(Complex.I/6)) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u0 2 (by norm_num), + pairZ_u0 3 (by norm_num), + pairZ_u0 4 (by norm_num), + pairX_u0 2 (by norm_num), + pairX_u0 3 (by norm_num), + pairX_u0 4 (by norm_num), + pairY_u0 2 (by norm_num), + pairY_u0 3 (by norm_num), + pairY_u0 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u1`. -/ +lemma opS_u1 : + opS (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u1 2 (by norm_num), + pairZ_u1 3 (by norm_num), + pairZ_u1 4 (by norm_num), + pairX_u1 2 (by norm_num), + pairX_u1 3 (by norm_num), + pairX_u1 4 (by norm_num), + pairY_u1 2 (by norm_num), + pairY_u1 3 (by norm_num), + pairY_u1 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u2`. -/ +lemma opS_u2 : + opS (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (Complex.I/6) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u2 2 (by norm_num), + pairZ_u2 3 (by norm_num), + pairZ_u2 4 (by norm_num), + pairX_u2 2 (by norm_num), + pairX_u2 3 (by norm_num), + pairX_u2 4 (by norm_num), + pairY_u2 2 (by norm_num), + pairY_u2 3 (by norm_num), + pairY_u2 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u3`. -/ +lemma opS_u3 : + opS (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u3 2 (by norm_num), + pairZ_u3 3 (by norm_num), + pairZ_u3 4 (by norm_num), + pairX_u3 2 (by norm_num), + pairX_u3 3 (by norm_num), + pairX_u3 4 (by norm_num), + pairY_u3 2 (by norm_num), + pairY_u3 3 (by norm_num), + pairY_u3 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar0`. -/ +lemma opS_ubar0 : + opS (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (-(Complex.I/6)) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar0 2 (by norm_num), + pairZ_ubar0 3 (by norm_num), + pairZ_ubar0 4 (by norm_num), + pairX_ubar0 2 (by norm_num), + pairX_ubar0 3 (by norm_num), + pairX_ubar0 4 (by norm_num), + pairY_ubar0 2 (by norm_num), + pairY_ubar0 3 (by norm_num), + pairY_ubar0 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar1`. -/ +lemma opS_ubar1 : + opS (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar1 2 (by norm_num), + pairZ_ubar1 3 (by norm_num), + pairZ_ubar1 4 (by norm_num), + pairX_ubar1 2 (by norm_num), + pairX_ubar1 3 (by norm_num), + pairX_ubar1 4 (by norm_num), + pairY_ubar1 2 (by norm_num), + pairY_ubar1 3 (by norm_num), + pairY_ubar1 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar2`. -/ +lemma opS_ubar2 : + opS (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (Complex.I/6) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar2 2 (by norm_num), + pairZ_ubar2 3 (by norm_num), + pairZ_ubar2 4 (by norm_num), + pairX_ubar2 2 (by norm_num), + pairX_ubar2 3 (by norm_num), + pairX_ubar2 4 (by norm_num), + pairY_ubar2 2 (by norm_num), + pairY_ubar2 3 (by norm_num), + pairY_ubar2 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar3`. -/ +lemma opS_ubar3 : + opS (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar3 2 (by norm_num), + pairZ_ubar3 3 (by norm_num), + pairZ_ubar3 4 (by norm_num), + pairX_ubar3 2 (by norm_num), + pairX_ubar3 3 (by norm_num), + pairX_ubar3 4 (by norm_num), + pairY_ubar3 2 (by norm_num), + pairY_ubar3 3 (by norm_num), + pairY_ubar3 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +/-! + +### The projector polynomial and the weight-eight endgame + +-/ + +/-- Negation moves out of the left factor of a jet-algebra product. -/ +lemma neg_mul_jet (x y : JetAlgebra) : -x * y = -(x * y) := by grind + +/-- Negation moves out of the right factor of a jet-algebra product. -/ +lemma mul_neg_jet (x y : JetAlgebra) : x * -y = -(x * y) := by grind + +/-- The quintic projector polynomial in the symmetrised boost average `opS`: + the unique degree-five polynomial with value one at the invariant eigenvalue + and vanishing on the remaining boost eigenvalues of the weight-eight Klein + sector. -/ +noncomputable def opPi : Module.End ℂ JetAlgebra := + (-1 : ℂ) • (1 : Module.End ℂ JetAlgebra) + (137/10 : ℂ) • opS + + (-(135/2) : ℂ) • (opS * opS) + (153 : ℂ) • (opS * opS * opS) + + (-162 : ℂ) • (opS * opS * opS * opS) + + (324/5 : ℂ) • (opS * opS * opS * opS * opS) + +/-- The projector polynomial, termwise. -/ +lemma opPi_apply (v : JetAlgebra) : + opPi v = (-1 : ℂ) • v + (137/10 : ℂ) • opS v + + (-(135/2) : ℂ) • opS (opS v) + (153 : ℂ) • opS (opS (opS v)) + + (-162 : ℂ) • opS (opS (opS (opS v))) + + (324/5 : ℂ) • opS (opS (opS (opS (opS v)))) := by + simp only [opPi, LinearMap.add_apply, LinearMap.smul_apply, Module.End.one_apply, + Module.End.mul_apply] + +/-- The projector fixes every Lorentz-invariant vector: `opS` fixes it and the + coefficients sum to one. -/ +lemma opPi_apply_of_invariant {y : JetAlgebra} + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opPi y = y := by + have hS : opS y = y := opS_apply_of_invariant hinv + rw [opPi_apply] + simp only [hS] + match_scalars + norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the FF block. -/ +lemma projFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by + have i2 : T (T v0) = + (1/2 : ℂ) • (v0) + + (1/36 : ℂ) • (v2) + + (1/36 : ℂ) • (v4) + + (-(2/9) : ℂ) • (v6) + + (-(2/9) : ℂ) • (v7) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v0)) = + (11/27 : ℂ) • (v0) + + (1/18 : ℂ) • (v2) + + (1/18 : ℂ) • (v4) + + (-(17/72) : ℂ) • (v6) + + (-(17/72) : ℂ) • (v7) + + (-(1/108) : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v0))) = + (227/648 : ℂ) • (v0) + + (101/1296 : ℂ) • (v2) + + (101/1296 : ℂ) • (v4) + + (-(19/81) : ℂ) • (v6) + + (-(19/81) : ℂ) • (v7) + + (-(2/81) : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v0)))) = + (101/324 : ℂ) • (v0) + + (185/1944 : ℂ) • (v2) + + (185/1944 : ℂ) • (v4) + + (-(1771/7776) : ℂ) • (v6) + + (-(1771/7776) : ℂ) • (v7) + + (-(55/1296) : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h0] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the FF block. -/ +lemma projFF1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by + have i2 : T (T v1) = + (1/2 : ℂ) • (v1) + + (-(1/4) : ℂ) • (v3) + + (1/4 : ℂ) • (v5) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v1)) = + (5/12 : ℂ) • (v1) + + (-(7/24) : ℂ) • (v3) + + (7/24 : ℂ) • (v5) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v1))) = + (3/8 : ℂ) • (v1) + + (-(5/16) : ℂ) • (v3) + + (5/16 : ℂ) • (v5) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v1)))) = + (17/48 : ℂ) • (v1) + + (-(31/96) : ℂ) • (v3) + + (31/96 : ℂ) • (v5) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h1] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the FF block. -/ +lemma projFF2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by + have i2 : T (T v2) = + (1/36 : ℂ) • (v0) + + (1/2 : ℂ) • (v2) + + (1/36 : ℂ) • (v4) + + (-(2/9) : ℂ) • (v6) + + (-(2/9) : ℂ) • (v8) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v2)) = + (1/18 : ℂ) • (v0) + + (11/27 : ℂ) • (v2) + + (1/18 : ℂ) • (v4) + + (-(17/72) : ℂ) • (v6) + + (-(1/108) : ℂ) • (v7) + + (-(17/72) : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v2))) = + (101/1296 : ℂ) • (v0) + + (227/648 : ℂ) • (v2) + + (101/1296 : ℂ) • (v4) + + (-(19/81) : ℂ) • (v6) + + (-(2/81) : ℂ) • (v7) + + (-(19/81) : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v2)))) = + (185/1944 : ℂ) • (v0) + + (101/324 : ℂ) • (v2) + + (185/1944 : ℂ) • (v4) + + (-(1771/7776) : ℂ) • (v6) + + (-(55/1296) : ℂ) • (v7) + + (-(1771/7776) : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h2] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the FF block. -/ +lemma projFF3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (-(1/24) : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by + have i2 : T (T v3) = + (-(1/4) : ℂ) • (v1) + + (1/2 : ℂ) • (v3) + + (-(1/4) : ℂ) • (v5) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v3)) = + (-(7/24) : ℂ) • (v1) + + (5/12 : ℂ) • (v3) + + (-(7/24) : ℂ) • (v5) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v3))) = + (-(5/16) : ℂ) • (v1) + + (3/8 : ℂ) • (v3) + + (-(5/16) : ℂ) • (v5) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v3)))) = + (-(31/96) : ℂ) • (v1) + + (17/48 : ℂ) • (v3) + + (-(31/96) : ℂ) • (v5) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h3] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 4 of the FF block. -/ +lemma projFF4 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) + + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) + + (324/5 : ℂ) • T (T (T (T (T v4)))) = + (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by + have i2 : T (T v4) = + (1/36 : ℂ) • (v0) + + (1/36 : ℂ) • (v2) + + (1/2 : ℂ) • (v4) + + (-(2/9) : ℂ) • (v7) + + (-(2/9) : ℂ) • (v8) := by + rw [h4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v4)) = + (1/18 : ℂ) • (v0) + + (1/18 : ℂ) • (v2) + + (11/27 : ℂ) • (v4) + + (-(1/108) : ℂ) • (v6) + + (-(17/72) : ℂ) • (v7) + + (-(17/72) : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v4))) = + (101/1296 : ℂ) • (v0) + + (101/1296 : ℂ) • (v2) + + (227/648 : ℂ) • (v4) + + (-(2/81) : ℂ) • (v6) + + (-(19/81) : ℂ) • (v7) + + (-(19/81) : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v4)))) = + (185/1944 : ℂ) • (v0) + + (185/1944 : ℂ) • (v2) + + (101/324 : ℂ) • (v4) + + (-(55/1296) : ℂ) • (v6) + + (-(1771/7776) : ℂ) • (v7) + + (-(1771/7776) : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h4] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 5 of the FF block. -/ +lemma projFF5 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) + + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) + + (324/5 : ℂ) • T (T (T (T (T v5)))) = + (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by + have i2 : T (T v5) = + (1/4 : ℂ) • (v1) + + (-(1/4) : ℂ) • (v3) + + (1/2 : ℂ) • (v5) := by + rw [h5] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v5)) = + (7/24 : ℂ) • (v1) + + (-(7/24) : ℂ) • (v3) + + (5/12 : ℂ) • (v5) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v5))) = + (5/16 : ℂ) • (v1) + + (-(5/16) : ℂ) • (v3) + + (3/8 : ℂ) • (v5) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v5)))) = + (31/96 : ℂ) • (v1) + + (-(31/96) : ℂ) • (v3) + + (17/48 : ℂ) • (v5) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h5] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 6 of the FF block. -/ +lemma projFF6 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) + + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) + + (324/5 : ℂ) • T (T (T (T (T v6)))) = + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by + have i2 : T (T v6) = + (-(2/9) : ℂ) • (v0) + + (-(2/9) : ℂ) • (v2) + + (1/2 : ℂ) • (v6) + + (1/36 : ℂ) • (v7) + + (1/36 : ℂ) • (v8) := by + rw [h6] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v6)) = + (-(17/72) : ℂ) • (v0) + + (-(17/72) : ℂ) • (v2) + + (-(1/108) : ℂ) • (v4) + + (11/27 : ℂ) • (v6) + + (1/18 : ℂ) • (v7) + + (1/18 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v6))) = + (-(19/81) : ℂ) • (v0) + + (-(19/81) : ℂ) • (v2) + + (-(2/81) : ℂ) • (v4) + + (227/648 : ℂ) • (v6) + + (101/1296 : ℂ) • (v7) + + (101/1296 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v6)))) = + (-(1771/7776) : ℂ) • (v0) + + (-(1771/7776) : ℂ) • (v2) + + (-(55/1296) : ℂ) • (v4) + + (101/324 : ℂ) • (v6) + + (185/1944 : ℂ) • (v7) + + (185/1944 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h6] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 7 of the FF block. -/ +lemma projFF7 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) + + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) + + (324/5 : ℂ) • T (T (T (T (T v7)))) = + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by + have i2 : T (T v7) = + (-(2/9) : ℂ) • (v0) + + (-(2/9) : ℂ) • (v4) + + (1/36 : ℂ) • (v6) + + (1/2 : ℂ) • (v7) + + (1/36 : ℂ) • (v8) := by + rw [h7] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v7)) = + (-(17/72) : ℂ) • (v0) + + (-(1/108) : ℂ) • (v2) + + (-(17/72) : ℂ) • (v4) + + (1/18 : ℂ) • (v6) + + (11/27 : ℂ) • (v7) + + (1/18 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v7))) = + (-(19/81) : ℂ) • (v0) + + (-(2/81) : ℂ) • (v2) + + (-(19/81) : ℂ) • (v4) + + (101/1296 : ℂ) • (v6) + + (227/648 : ℂ) • (v7) + + (101/1296 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v7)))) = + (-(1771/7776) : ℂ) • (v0) + + (-(55/1296) : ℂ) • (v2) + + (-(1771/7776) : ℂ) • (v4) + + (185/1944 : ℂ) • (v6) + + (101/324 : ℂ) • (v7) + + (185/1944 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h7] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 8 of the FF block. -/ +lemma projFF8 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) + + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) + + (324/5 : ℂ) • T (T (T (T (T v8)))) = + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by + have i2 : T (T v8) = + (-(2/9) : ℂ) • (v2) + + (-(2/9) : ℂ) • (v4) + + (1/36 : ℂ) • (v6) + + (1/36 : ℂ) • (v7) + + (1/2 : ℂ) • (v8) := by + rw [h8] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v8)) = + (-(1/108) : ℂ) • (v0) + + (-(17/72) : ℂ) • (v2) + + (-(17/72) : ℂ) • (v4) + + (1/18 : ℂ) • (v6) + + (1/18 : ℂ) • (v7) + + (11/27 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v8))) = + (-(2/81) : ℂ) • (v0) + + (-(19/81) : ℂ) • (v2) + + (-(19/81) : ℂ) • (v4) + + (101/1296 : ℂ) • (v6) + + (101/1296 : ℂ) • (v7) + + (227/648 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v8)))) = + (-(55/1296) : ℂ) • (v0) + + (-(1771/7776) : ℂ) • (v2) + + (-(1771/7776) : ℂ) • (v4) + + (185/1944 : ℂ) • (v6) + + (185/1944 : ℂ) • (v7) + + (101/324 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h8] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the DDF block. -/ +lemma projDDF0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (0 : M) := by + have i2 : T (T v0) = + (1/6 : ℂ) • (v0) + + (-(1/36) : ℂ) • (v2) + + (-(1/36) : ℂ) • (v4) + + (1/6 : ℂ) • (v7) + + (1/6 : ℂ) • (v9) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v0)) = + (1/9 : ℂ) • (v0) + + (-(1/27) : ℂ) • (v2) + + (-(1/27) : ℂ) • (v4) + + (31/216 : ℂ) • (v7) + + (31/216 : ℂ) • (v9) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v0))) = + (55/648 : ℂ) • (v0) + + (-(47/1296) : ℂ) • (v2) + + (-(47/1296) : ℂ) • (v4) + + (13/108 : ℂ) • (v7) + + (13/108 : ℂ) • (v9) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v0)))) = + (133/1944 : ℂ) • (v0) + + (-(125/3888) : ℂ) • (v2) + + (-(125/3888) : ℂ) • (v4) + + (781/7776 : ℂ) • (v7) + + (781/7776 : ℂ) • (v9) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h0] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the DDF block. -/ +lemma projDDF1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (0 : M) := by + have i2 : T (T v1) = + (1/6 : ℂ) • (v1) + + (1/36 : ℂ) • (v3) + + (-(1/36) : ℂ) • (v5) + + (-(1/6) : ℂ) • (v6) + + (1/6 : ℂ) • (v8) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v1)) = + (1/9 : ℂ) • (v1) + + (1/27 : ℂ) • (v3) + + (-(1/27) : ℂ) • (v5) + + (-(31/216) : ℂ) • (v6) + + (31/216 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v1))) = + (55/648 : ℂ) • (v1) + + (47/1296 : ℂ) • (v3) + + (-(47/1296) : ℂ) • (v5) + + (-(13/108) : ℂ) • (v6) + + (13/108 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v1)))) = + (133/1944 : ℂ) • (v1) + + (125/3888 : ℂ) • (v3) + + (-(125/3888) : ℂ) • (v5) + + (-(781/7776) : ℂ) • (v6) + + (781/7776 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h1] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the DDF block. -/ +lemma projDDF2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (0 : M) := by + have i2 : T (T v2) = + (-(1/36) : ℂ) • (v0) + + (1/6 : ℂ) • (v2) + + (-(1/36) : ℂ) • (v4) + + (-(1/6) : ℂ) • (v7) + + (1/6 : ℂ) • (v11) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v2)) = + (-(1/27) : ℂ) • (v0) + + (1/9 : ℂ) • (v2) + + (-(1/27) : ℂ) • (v4) + + (-(31/216) : ℂ) • (v7) + + (31/216 : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v2))) = + (-(47/1296) : ℂ) • (v0) + + (55/648 : ℂ) • (v2) + + (-(47/1296) : ℂ) • (v4) + + (-(13/108) : ℂ) • (v7) + + (13/108 : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v2)))) = + (-(125/3888) : ℂ) • (v0) + + (133/1944 : ℂ) • (v2) + + (-(125/3888) : ℂ) • (v4) + + (-(781/7776) : ℂ) • (v7) + + (781/7776 : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h2] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the DDF block. -/ +lemma projDDF3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (0 : M) := by + have i2 : T (T v3) = + (1/36 : ℂ) • (v1) + + (1/6 : ℂ) • (v3) + + (1/36 : ℂ) • (v5) + + (-(1/6) : ℂ) • (v6) + + (1/6 : ℂ) • (v10) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v3)) = + (1/27 : ℂ) • (v1) + + (1/9 : ℂ) • (v3) + + (1/27 : ℂ) • (v5) + + (-(31/216) : ℂ) • (v6) + + (31/216 : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v3))) = + (47/1296 : ℂ) • (v1) + + (55/648 : ℂ) • (v3) + + (47/1296 : ℂ) • (v5) + + (-(13/108) : ℂ) • (v6) + + (13/108 : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v3)))) = + (125/3888 : ℂ) • (v1) + + (133/1944 : ℂ) • (v3) + + (125/3888 : ℂ) • (v5) + + (-(781/7776) : ℂ) • (v6) + + (781/7776 : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h3] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 4 of the DDF block. -/ +lemma projDDF4 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) + + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) + + (324/5 : ℂ) • T (T (T (T (T v4)))) = + (0 : M) := by + have i2 : T (T v4) = + (-(1/36) : ℂ) • (v0) + + (-(1/36) : ℂ) • (v2) + + (1/6 : ℂ) • (v4) + + (-(1/6) : ℂ) • (v9) + + (-(1/6) : ℂ) • (v11) := by + rw [h4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v4)) = + (-(1/27) : ℂ) • (v0) + + (-(1/27) : ℂ) • (v2) + + (1/9 : ℂ) • (v4) + + (-(31/216) : ℂ) • (v9) + + (-(31/216) : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v4))) = + (-(47/1296) : ℂ) • (v0) + + (-(47/1296) : ℂ) • (v2) + + (55/648 : ℂ) • (v4) + + (-(13/108) : ℂ) • (v9) + + (-(13/108) : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v4)))) = + (-(125/3888) : ℂ) • (v0) + + (-(125/3888) : ℂ) • (v2) + + (133/1944 : ℂ) • (v4) + + (-(781/7776) : ℂ) • (v9) + + (-(781/7776) : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h4] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 5 of the DDF block. -/ +lemma projDDF5 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) + + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) + + (324/5 : ℂ) • T (T (T (T (T v5)))) = + (0 : M) := by + have i2 : T (T v5) = + (-(1/36) : ℂ) • (v1) + + (1/36 : ℂ) • (v3) + + (1/6 : ℂ) • (v5) + + (-(1/6) : ℂ) • (v8) + + (1/6 : ℂ) • (v10) := by + rw [h5] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v5)) = + (-(1/27) : ℂ) • (v1) + + (1/27 : ℂ) • (v3) + + (1/9 : ℂ) • (v5) + + (-(31/216) : ℂ) • (v8) + + (31/216 : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v5))) = + (-(47/1296) : ℂ) • (v1) + + (47/1296 : ℂ) • (v3) + + (55/648 : ℂ) • (v5) + + (-(13/108) : ℂ) • (v8) + + (13/108 : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v5)))) = + (-(125/3888) : ℂ) • (v1) + + (125/3888 : ℂ) • (v3) + + (133/1944 : ℂ) • (v5) + + (-(781/7776) : ℂ) • (v8) + + (781/7776 : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h5] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 6 of the DDF block. -/ +lemma projDDF6 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) + + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) + + (324/5 : ℂ) • T (T (T (T (T v6)))) = + (0 : M) := by + have i2 : T (T v6) = + (-(1/6) : ℂ) • (v1) + + (-(1/6) : ℂ) • (v3) + + (1/2 : ℂ) • (v6) + + (-(1/36) : ℂ) • (v8) + + (-(1/36) : ℂ) • (v10) := by + rw [h6] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v6)) = + (-(31/216) : ℂ) • (v1) + + (-(31/216) : ℂ) • (v3) + + (7/18 : ℂ) • (v6) + + (-(5/108) : ℂ) • (v8) + + (-(5/108) : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v6))) = + (-(13/108) : ℂ) • (v1) + + (-(13/108) : ℂ) • (v3) + + (199/648 : ℂ) • (v6) + + (-(71/1296) : ℂ) • (v8) + + (-(71/1296) : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v6)))) = + (-(781/7776) : ℂ) • (v1) + + (-(781/7776) : ℂ) • (v3) + + (119/486 : ℂ) • (v6) + + (-(55/972) : ℂ) • (v8) + + (-(55/972) : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h6] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 7 of the DDF block. -/ +lemma projDDF7 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) + + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) + + (324/5 : ℂ) • T (T (T (T (T v7)))) = + (0 : M) := by + have i2 : T (T v7) = + (1/6 : ℂ) • (v0) + + (-(1/6) : ℂ) • (v2) + + (1/2 : ℂ) • (v7) + + (1/36 : ℂ) • (v9) + + (-(1/36) : ℂ) • (v11) := by + rw [h7] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v7)) = + (31/216 : ℂ) • (v0) + + (-(31/216) : ℂ) • (v2) + + (7/18 : ℂ) • (v7) + + (5/108 : ℂ) • (v9) + + (-(5/108) : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v7))) = + (13/108 : ℂ) • (v0) + + (-(13/108) : ℂ) • (v2) + + (199/648 : ℂ) • (v7) + + (71/1296 : ℂ) • (v9) + + (-(71/1296) : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v7)))) = + (781/7776 : ℂ) • (v0) + + (-(781/7776) : ℂ) • (v2) + + (119/486 : ℂ) • (v7) + + (55/972 : ℂ) • (v9) + + (-(55/972) : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h7] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 8 of the DDF block. -/ +lemma projDDF8 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) + + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) + + (324/5 : ℂ) • T (T (T (T (T v8)))) = + (0 : M) := by + have i2 : T (T v8) = + (1/6 : ℂ) • (v1) + + (-(1/6) : ℂ) • (v5) + + (-(1/36) : ℂ) • (v6) + + (1/2 : ℂ) • (v8) + + (-(1/36) : ℂ) • (v10) := by + rw [h8] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v8)) = + (31/216 : ℂ) • (v1) + + (-(31/216) : ℂ) • (v5) + + (-(5/108) : ℂ) • (v6) + + (7/18 : ℂ) • (v8) + + (-(5/108) : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v8))) = + (13/108 : ℂ) • (v1) + + (-(13/108) : ℂ) • (v5) + + (-(71/1296) : ℂ) • (v6) + + (199/648 : ℂ) • (v8) + + (-(71/1296) : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v8)))) = + (781/7776 : ℂ) • (v1) + + (-(781/7776) : ℂ) • (v5) + + (-(55/972) : ℂ) • (v6) + + (119/486 : ℂ) • (v8) + + (-(55/972) : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h8] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 9 of the DDF block. -/ +lemma projDDF9 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v9 + (137/10 : ℂ) • T v9 + (-(135/2) : ℂ) • T (T v9) + + (153 : ℂ) • T (T (T v9)) + (-162 : ℂ) • T (T (T (T v9))) + + (324/5 : ℂ) • T (T (T (T (T v9)))) = + (0 : M) := by + have i2 : T (T v9) = + (1/6 : ℂ) • (v0) + + (-(1/6) : ℂ) • (v4) + + (1/36 : ℂ) • (v7) + + (1/2 : ℂ) • (v9) + + (1/36 : ℂ) • (v11) := by + rw [h9] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v9)) = + (31/216 : ℂ) • (v0) + + (-(31/216) : ℂ) • (v4) + + (5/108 : ℂ) • (v7) + + (7/18 : ℂ) • (v9) + + (5/108 : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v9))) = + (13/108 : ℂ) • (v0) + + (-(13/108) : ℂ) • (v4) + + (71/1296 : ℂ) • (v7) + + (199/648 : ℂ) • (v9) + + (71/1296 : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v9)))) = + (781/7776 : ℂ) • (v0) + + (-(781/7776) : ℂ) • (v4) + + (55/972 : ℂ) • (v7) + + (119/486 : ℂ) • (v9) + + (55/972 : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h9] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 10 of the DDF block. -/ +lemma projDDF10 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v10 + (137/10 : ℂ) • T v10 + (-(135/2) : ℂ) • T (T v10) + + (153 : ℂ) • T (T (T v10)) + (-162 : ℂ) • T (T (T (T v10))) + + (324/5 : ℂ) • T (T (T (T (T v10)))) = + (0 : M) := by + have i2 : T (T v10) = + (1/6 : ℂ) • (v3) + + (1/6 : ℂ) • (v5) + + (-(1/36) : ℂ) • (v6) + + (-(1/36) : ℂ) • (v8) + + (1/2 : ℂ) • (v10) := by + rw [h10] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v10)) = + (31/216 : ℂ) • (v3) + + (31/216 : ℂ) • (v5) + + (-(5/108) : ℂ) • (v6) + + (-(5/108) : ℂ) • (v8) + + (7/18 : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v10))) = + (13/108 : ℂ) • (v3) + + (13/108 : ℂ) • (v5) + + (-(71/1296) : ℂ) • (v6) + + (-(71/1296) : ℂ) • (v8) + + (199/648 : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v10)))) = + (781/7776 : ℂ) • (v3) + + (781/7776 : ℂ) • (v5) + + (-(55/972) : ℂ) • (v6) + + (-(55/972) : ℂ) • (v8) + + (119/486 : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h10] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 11 of the DDF block. -/ +lemma projDDF11 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v11 + (137/10 : ℂ) • T v11 + (-(135/2) : ℂ) • T (T v11) + + (153 : ℂ) • T (T (T v11)) + (-162 : ℂ) • T (T (T (T v11))) + + (324/5 : ℂ) • T (T (T (T (T v11)))) = + (0 : M) := by + have i2 : T (T v11) = + (1/6 : ℂ) • (v2) + + (-(1/6) : ℂ) • (v4) + + (-(1/36) : ℂ) • (v7) + + (1/36 : ℂ) • (v9) + + (1/2 : ℂ) • (v11) := by + rw [h11] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v11)) = + (31/216 : ℂ) • (v2) + + (-(31/216) : ℂ) • (v4) + + (-(5/108) : ℂ) • (v7) + + (5/108 : ℂ) • (v9) + + (7/18 : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v11))) = + (13/108 : ℂ) • (v2) + + (-(13/108) : ℂ) • (v4) + + (-(71/1296) : ℂ) • (v7) + + (71/1296 : ℂ) • (v9) + + (199/648 : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v11)))) = + (781/7776 : ℂ) • (v2) + + (-(781/7776) : ℂ) • (v4) + + (-(55/972) : ℂ) • (v7) + + (55/972 : ℂ) • (v9) + + (119/486 : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h11] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the FMu block. -/ +lemma projFMu0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (-(Complex.I/4)) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v0) = + (1/3 : ℂ) • (v0) + + (-(2/9) : ℂ) • (v1) + + ((-(2/9) : ℂ) * Complex.I) • (v2) + + (-(2/9) : ℂ) • (v3) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v0)) = + (5/18 : ℂ) • (v0) + + (-(13/54) : ℂ) • (v1) + + ((-(13/54) : ℂ) * Complex.I) • (v2) + + (-(13/54) : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v0))) = + (7/27 : ℂ) • (v0) + + (-(20/81) : ℂ) • (v1) + + ((-(20/81) : ℂ) * Complex.I) • (v2) + + (-(20/81) : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v0)))) = + (41/162 : ℂ) • (v0) + + (-(121/486) : ℂ) • (v1) + + ((-(121/486) : ℂ) * Complex.I) • (v2) + + (-(121/486) : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h0] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the FMu block. -/ +lemma projFMu1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v1) = + (-(2/9) : ℂ) • (v0) + + (13/18 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (1/36 : ℂ) • (v3) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v1)) = + (-(13/54) : ℂ) • (v0) + + (23/36 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (13/216 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v1))) = + (-(20/81) : ℂ) • (v0) + + (371/648 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (13/144 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v1)))) = + (-(121/486) : ℂ) • (v0) + + (2015/3888 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (905/7776 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h1] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the FMu block. -/ +lemma projFMu2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (1/4 : ℂ) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v2) = + ((2/9 : ℂ) * Complex.I) • (v0) + + ((-(1/36) : ℂ) * Complex.I) • (v1) + + (13/18 : ℂ) • (v2) + + ((-(1/36) : ℂ) * Complex.I) • (v3) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v2)) = + ((13/54 : ℂ) * Complex.I) • (v0) + + ((-(13/216) : ℂ) * Complex.I) • (v1) + + (23/36 : ℂ) • (v2) + + ((-(13/216) : ℂ) * Complex.I) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v2))) = + ((20/81 : ℂ) * Complex.I) • (v0) + + ((-(13/144) : ℂ) * Complex.I) • (v1) + + (371/648 : ℂ) • (v2) + + ((-(13/144) : ℂ) * Complex.I) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v2)))) = + ((121/486 : ℂ) * Complex.I) • (v0) + + ((-(905/7776) : ℂ) * Complex.I) • (v1) + + (2015/3888 : ℂ) • (v2) + + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h2] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the FMu block. -/ +lemma projFMu3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v3) = + (-(2/9) : ℂ) • (v0) + + (1/36 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (13/18 : ℂ) • (v3) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v3)) = + (-(13/54) : ℂ) • (v0) + + (13/216 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (23/36 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v3))) = + (-(20/81) : ℂ) • (v0) + + (13/144 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (371/648 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v3)))) = + (-(121/486) : ℂ) • (v0) + + (905/7776 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (2015/3888 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the FMubar block. -/ +lemma projFMubar0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (Complex.I/4) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v0) = + (1/3 : ℂ) • (v0) + + (-(2/9) : ℂ) • (v1) + + ((-(2/9) : ℂ) * Complex.I) • (v2) + + (-(2/9) : ℂ) • (v3) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v0)) = + (5/18 : ℂ) • (v0) + + (-(13/54) : ℂ) • (v1) + + ((-(13/54) : ℂ) * Complex.I) • (v2) + + (-(13/54) : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v0))) = + (7/27 : ℂ) • (v0) + + (-(20/81) : ℂ) • (v1) + + ((-(20/81) : ℂ) * Complex.I) • (v2) + + (-(20/81) : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v0)))) = + (41/162 : ℂ) • (v0) + + (-(121/486) : ℂ) • (v1) + + ((-(121/486) : ℂ) * Complex.I) • (v2) + + (-(121/486) : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h0] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the FMubar block. -/ +lemma projFMubar1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v1) = + (-(2/9) : ℂ) • (v0) + + (13/18 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (1/36 : ℂ) • (v3) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v1)) = + (-(13/54) : ℂ) • (v0) + + (23/36 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (13/216 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v1))) = + (-(20/81) : ℂ) • (v0) + + (371/648 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (13/144 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v1)))) = + (-(121/486) : ℂ) • (v0) + + (2015/3888 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (905/7776 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h1] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the FMubar block. -/ +lemma projFMubar2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (-(1/4) : ℂ) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v2) = + ((2/9 : ℂ) * Complex.I) • (v0) + + ((-(1/36) : ℂ) * Complex.I) • (v1) + + (13/18 : ℂ) • (v2) + + ((-(1/36) : ℂ) * Complex.I) • (v3) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v2)) = + ((13/54 : ℂ) * Complex.I) • (v0) + + ((-(13/216) : ℂ) * Complex.I) • (v1) + + (23/36 : ℂ) • (v2) + + ((-(13/216) : ℂ) * Complex.I) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v2))) = + ((20/81 : ℂ) * Complex.I) • (v0) + + ((-(13/144) : ℂ) * Complex.I) • (v1) + + (371/648 : ℂ) • (v2) + + ((-(13/144) : ℂ) * Complex.I) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v2)))) = + ((121/486 : ℂ) * Complex.I) • (v0) + + ((-(905/7776) : ℂ) * Complex.I) • (v1) + + (2015/3888 : ℂ) • (v2) + + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h2] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the FMubar block. -/ +lemma projFMubar3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v3) = + (-(2/9) : ℂ) • (v0) + + (1/36 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (13/18 : ℂ) • (v3) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v3)) = + (-(13/54) : ℂ) • (v0) + + (13/216 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (23/36 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v3))) = + (-(20/81) : ℂ) • (v0) + + (13/144 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (371/648 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v3)))) = + (-(121/486) : ℂ) • (v0) + + (905/7776 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (2015/3888 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F01_F01`. -/ +lemma opPi_F01_F01 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF0 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F01_F23`. -/ +lemma opPi_F01_F23 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (1/24 : ℂ) • thetaTerm := by + rw [opPi_apply, + projFF1 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F02_F02`. -/ +lemma opPi_F02_F02 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF2 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F02_F13`. -/ +lemma opPi_F02_F13 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (-(1/24) : ℂ) • thetaTerm := by + rw [opPi_apply, + projFF3 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F03_F03`. -/ +lemma opPi_F03_F03 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF4 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F03_F12`. -/ +lemma opPi_F03_F12 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (1/24 : ℂ) • thetaTerm := by + rw [opPi_apply, + projFF5 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F12_F12`. -/ +lemma opPi_F12_F12 : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (1/12 : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF6 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F13_F13`. -/ +lemma opPi_F13_F13 : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (1/12 : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF7 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F23_F23`. -/ +lemma opPi_F23_F23 : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (1/12 : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF8 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd01_F01`. -/ +lemma opPi_dd01_F01 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF0 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd01_F23`. -/ +lemma opPi_dd01_F23 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF1 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd02_F02`. -/ +lemma opPi_dd02_F02 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF2 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd02_F13`. -/ +lemma opPi_dd02_F13 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF3 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd03_F03`. -/ +lemma opPi_dd03_F03 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF4 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd03_F12`. -/ +lemma opPi_dd03_F12 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF5 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd12_F03`. -/ +lemma opPi_dd12_F03 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF6 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd12_F12`. -/ +lemma opPi_dd12_F12 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF7 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd13_F02`. -/ +lemma opPi_dd13_F02 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF8 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd13_F13`. -/ +lemma opPi_dd13_F13 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF9 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd23_F01`. -/ +lemma opPi_dd23_F01 : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF10 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd23_F23`. -/ +lemma opPi_dd23_F23 : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF11 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u0`. -/ +lemma opPi_u0 : + opPi (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (-(Complex.I/4)) • fermionKineticTerm := by + rw [opPi_apply, + projFMu0 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u1`. -/ +lemma opPi_u1 : + opPi (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (Complex.I/4) • fermionKineticTerm := by + rw [opPi_apply, + projFMu1 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u2`. -/ +lemma opPi_u2 : + opPi (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (1/4 : ℂ) • fermionKineticTerm := by + rw [opPi_apply, + projFMu2 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u3`. -/ +lemma opPi_u3 : + opPi (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (Complex.I/4) • fermionKineticTerm := by + rw [opPi_apply, + projFMu3 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar0`. -/ +lemma opPi_ubar0 : + opPi (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (Complex.I/4) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar0 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar1`. -/ +lemma opPi_ubar1 : + opPi (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (-(Complex.I/4)) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar1 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar2`. -/ +lemma opPi_ubar2 : + opPi (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (-(1/4) : ℂ) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar2 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar3`. -/ +lemma opPi_ubar3 : + opPi (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (-(Complex.I/4)) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar3 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + +/-- Entries of the Lorentz matrix of `parityZ`. -/ +lemma parityMatZ_00 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_01 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_02 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_03 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_10 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_11 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 0) = -1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_12 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_13 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_20 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_21 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_22 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 1) = -1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_23 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_30 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_31 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_32 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_33 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 2) = 1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +/-- Entries of the Lorentz matrix of `parityX`. -/ +lemma parityMatX_00 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_01 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_02 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_03 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_10 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_11 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 0) = 1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_12 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_13 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_20 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_21 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_22 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 1) = -1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_23 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_30 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_31 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_32 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_33 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 2) = -1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +/-- Entries of the Lorentz matrix of `parityY`. -/ +lemma parityMatY_00 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_01 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_02 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_03 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_10 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_11 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 0) = -1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_12 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_13 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_20 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_21 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_22 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 1) = 1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_23 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_30 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_31 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_32 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_33 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 2) = -1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +set_option maxHeartbeats 2000000 in +/-- The Klein average acts diagonally on products of two field strengths, by + the average of the four parity signs. -/ +lemma kleinAvg_fieldStrengthDeriv_nil_mul (a b c d : Fin 1 ⊕ Fin 3) : + kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = + (((1 + paritySignZ a * paritySignZ b * (paritySignZ c * paritySignZ d) + + paritySignY a * paritySignY b * (paritySignY c * paritySignY d) + + paritySignX a * paritySignX b * (paritySignX c * paritySignX d)) / 4 : ℝ) : ℂ) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_mul', + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX, + smul_mul_smul_jet] + push_cast + module + +/-- Under a diagonal Lorentz transformation the second-derivative field + strength scales by the product of the signs of its four indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv_pair {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {ρ, τ} μ ν) = + ((sgn ρ * (sgn τ * (sgn μ * sgn ν)) : ℝ) : ℂ) • + fieldStrengthDeriv {ρ, τ} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_pair] + rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun s _ => + Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by + rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ρ) h)] + rw [Finset.sum_eq_single τ (fun s _ hs => Finset.sum_eq_zero fun a _ => + Finset.sum_eq_zero fun b _ => by + rw [hM s τ, if_neg hs, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ τ) h)] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, mul_zero, mul_zero, Complex.ofReal_zero, + zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, mul_zero, mul_zero, Complex.ofReal_zero, + zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM ρ ρ, if_pos rfl, hM τ τ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, + if_pos rfl] + +/-- The Klein average acts diagonally on the second-derivative field + strengths. -/ +lemma kleinAvg_fieldStrengthDeriv_pair (r t a b : Fin 1 ⊕ Fin 3) : + kleinAvg (fieldStrengthDeriv {r, t} a b) = + (((1 + paritySignZ r * (paritySignZ t * (paritySignZ a * paritySignZ b)) + + paritySignY r * (paritySignY t * (paritySignY a * paritySignY b)) + + paritySignX r * (paritySignX t * (paritySignX a * paritySignX b))) / 4 : ℝ) : ℂ) • + fieldStrengthDeriv {r, t} a b := by + rw [kleinAvg_apply, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityX] + push_cast + module + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,0]` (u-family). -/ +lemma kleinAvg_u_e000 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,1]` (u-family). -/ +lemma kleinAvg_u_e001 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,0]` (u-family). -/ +lemma kleinAvg_u_e010 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,1]` (u-family). -/ +lemma kleinAvg_u_e011 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,0]` (u-family). -/ +lemma kleinAvg_u_e100 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,1]` (u-family). -/ +lemma kleinAvg_u_e101 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,0]` (u-family). -/ +lemma kleinAvg_u_e110 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,1]` (u-family). -/ +lemma kleinAvg_u_e111 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,0]` (u-family). -/ +lemma kleinAvg_u_e200 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,1]` (u-family). -/ +lemma kleinAvg_u_e201 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,0]` (u-family). -/ +lemma kleinAvg_u_e210 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,1]` (u-family). -/ +lemma kleinAvg_u_e211 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,0]` (u-family). -/ +lemma kleinAvg_u_e300 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,1]` (u-family). -/ +lemma kleinAvg_u_e301 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,0]` (u-family). -/ +lemma kleinAvg_u_e310 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,1]` (u-family). -/ +lemma kleinAvg_u_e311 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e000 : + kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e001 : + kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e010 : + kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e011 : + kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e100 : + kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e101 : + kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e110 : + kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e111 : + kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e200 : + kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e201 : + kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e210 : + kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (-(1/2) : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e211 : + kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e300 : + kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e301 : + kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e310 : + kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e311 : + kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (-(1/2) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +/-- The Maxwell term lies in the span of the invariants. -/ +lemma maxwellTerm_mem_span : + maxwellTerm ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- The theta term lies in the span of the invariants. -/ +lemma thetaTerm_mem_span : + thetaTerm ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- The fermion kinetic term lies in the span of the invariants. -/ +lemma fermionKineticTerm_mem_span : + fermionKineticTerm ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- The conjugate fermion kinetic term lies in the span of the invariants. -/ +lemma fermionKineticTermBar_mem_span : + fermionKineticTermBar ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- Projector membership for the ordered square `F01 * F01`. -/ +lemma opPi_FF_c0101_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F01_F01] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F01 * F10`. -/ +lemma opPi_FF_c0110_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F01_F01] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F01`. -/ +lemma opPi_FF_c1001_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F01_F01] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F10`. -/ +lemma opPi_FF_c1010_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F01_F01] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F01 * F23`. -/ +lemma opPi_FF_c0123_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F01 * F32`. -/ +lemma opPi_FF_c0132_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F23`. -/ +lemma opPi_FF_c1023_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F32`. -/ +lemma opPi_FF_c1032_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F01`. -/ +lemma opPi_FF_c2301_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F10`. -/ +lemma opPi_FF_c2310_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F01`. -/ +lemma opPi_FF_c3201_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F10`. -/ +lemma opPi_FF_c3210_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F23`. -/ +lemma opPi_FF_c2323_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F23_F23] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F32`. -/ +lemma opPi_FF_c2332_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F23_F23] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F23`. -/ +lemma opPi_FF_c3223_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F23_F23] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F32`. -/ +lemma opPi_FF_c3232_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F23_F23] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F02`. -/ +lemma opPi_FF_c0202_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F02_F02] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F20`. -/ +lemma opPi_FF_c0220_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F02_F02] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F02`. -/ +lemma opPi_FF_c2002_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F02_F02] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F20`. -/ +lemma opPi_FF_c2020_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F02_F02] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F13`. -/ +lemma opPi_FF_c0213_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F31`. -/ +lemma opPi_FF_c0231_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F13`. -/ +lemma opPi_FF_c2013_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F31`. -/ +lemma opPi_FF_c2031_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F02`. -/ +lemma opPi_FF_c1302_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F20`. -/ +lemma opPi_FF_c1320_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F02`. -/ +lemma opPi_FF_c3102_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F20`. -/ +lemma opPi_FF_c3120_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F13`. -/ +lemma opPi_FF_c1313_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F13_F13] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F31`. -/ +lemma opPi_FF_c1331_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F13_F13] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F13`. -/ +lemma opPi_FF_c3113_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F13_F13] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F31`. -/ +lemma opPi_FF_c3131_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F13_F13] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F03`. -/ +lemma opPi_FF_c0303_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F03_F03] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F30`. -/ +lemma opPi_FF_c0330_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F03_F03] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F03`. -/ +lemma opPi_FF_c3003_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F03_F03] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F30`. -/ +lemma opPi_FF_c3030_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F03_F03] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F12`. -/ +lemma opPi_FF_c0312_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F21`. -/ +lemma opPi_FF_c0321_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F12`. -/ +lemma opPi_FF_c3012_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F21`. -/ +lemma opPi_FF_c3021_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F03`. -/ +lemma opPi_FF_c1203_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F30`. -/ +lemma opPi_FF_c1230_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F03`. -/ +lemma opPi_FF_c2103_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F30`. -/ +lemma opPi_FF_c2130_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F12`. -/ +lemma opPi_FF_c1212_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F12_F12] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F21`. -/ +lemma opPi_FF_c1221_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F12_F12] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F12`. -/ +lemma opPi_FF_c2112_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F12_F12] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F21`. -/ +lemma opPi_FF_c2121_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul_jet, mul_neg_jet, neg_neg, map_neg] + rw [opPi_F12_F12] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered derivative monomial `dd01 F01`. -/ +lemma opPi_DDF_c0101_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd01_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd01 F10`. -/ +lemma opPi_DDF_c0110_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F01`. -/ +lemma opPi_DDF_c1001_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [opPi_dd01_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F10`. -/ +lemma opPi_DDF_c1010_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd01 F23`. -/ +lemma opPi_DDF_c0123_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd01_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd01 F32`. -/ +lemma opPi_DDF_c0132_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F23`. -/ +lemma opPi_DDF_c1023_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [opPi_dd01_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F32`. -/ +lemma opPi_DDF_c1032_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F02`. -/ +lemma opPi_DDF_c0202_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd02_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F20`. -/ +lemma opPi_DDF_c0220_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F02`. -/ +lemma opPi_DDF_c2002_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [opPi_dd02_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F20`. -/ +lemma opPi_DDF_c2020_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F13`. -/ +lemma opPi_DDF_c0213_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd02_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F31`. -/ +lemma opPi_DDF_c0231_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F13`. -/ +lemma opPi_DDF_c2013_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [opPi_dd02_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F31`. -/ +lemma opPi_DDF_c2031_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F03`. -/ +lemma opPi_DDF_c0303_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd03_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F30`. -/ +lemma opPi_DDF_c0330_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F03`. -/ +lemma opPi_DDF_c3003_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [opPi_dd03_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F30`. -/ +lemma opPi_DDF_c3030_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F12`. -/ +lemma opPi_DDF_c0312_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd03_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F21`. -/ +lemma opPi_DDF_c0321_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F12`. -/ +lemma opPi_DDF_c3012_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [opPi_dd03_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F21`. -/ +lemma opPi_DDF_c3021_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F03`. -/ +lemma opPi_DDF_c1203_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd12_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F30`. -/ +lemma opPi_DDF_c1230_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F03`. -/ +lemma opPi_DDF_c2103_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [opPi_dd12_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F30`. -/ +lemma opPi_DDF_c2130_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F12`. -/ +lemma opPi_DDF_c1212_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd12_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F21`. -/ +lemma opPi_DDF_c1221_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F12`. -/ +lemma opPi_DDF_c2112_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [opPi_dd12_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F21`. -/ +lemma opPi_DDF_c2121_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F02`. -/ +lemma opPi_DDF_c1302_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd13_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F20`. -/ +lemma opPi_DDF_c1320_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F02`. -/ +lemma opPi_DDF_c3102_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [opPi_dd13_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F20`. -/ +lemma opPi_DDF_c3120_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F13`. -/ +lemma opPi_DDF_c1313_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd13_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F31`. -/ +lemma opPi_DDF_c1331_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F13`. -/ +lemma opPi_DDF_c3113_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [opPi_dd13_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F31`. -/ +lemma opPi_DDF_c3131_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F01`. -/ +lemma opPi_DDF_c2301_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd23_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F10`. -/ +lemma opPi_DDF_c2310_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F01`. -/ +lemma opPi_DDF_c3201_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [opPi_dd23_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F10`. -/ +lemma opPi_DDF_c3210_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F23`. -/ +lemma opPi_DDF_c2323_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd23_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F32`. -/ +lemma opPi_DDF_c2332_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F23`. -/ +lemma opPi_DDF_c3223_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [opPi_dd23_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F32`. -/ +lemma opPi_DDF_c3232_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u000_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e000, map_smul, opPi_u0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[0,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u001_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e001, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u010_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e010, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u011_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e011, map_smul, opPi_u0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[1,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u100_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e100, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[1,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u101_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e101, map_smul, opPi_u1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[1,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u110_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e110, map_smul, opPi_u1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[1,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u111_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e111, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u200_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e200, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u201_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e201, map_smul, opPi_u2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[2,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u210_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e210, map_smul, opPi_u2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[2,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u211_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e211, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u300_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e300, map_smul, opPi_u3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[3,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u301_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e301, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u310_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e310, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u311_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e311, map_smul, opPi_u3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[0,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar000_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e000, map_smul, opPi_ubar0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[0,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar001_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e001, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar010_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e010, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar011_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e011, map_smul, opPi_ubar0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[1,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar100_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e100, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[1,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar101_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e101, map_smul, opPi_ubar1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[1,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar110_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e110, map_smul, opPi_ubar1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[1,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar111_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e111, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar200_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e200, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar201_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e201, map_smul, opPi_ubar2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[2,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar210_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e210, map_smul, opPi_ubar2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[2,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar211_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e211, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar300_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e300, map_smul, opPi_ubar3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[3,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar301_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e301, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar310_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e310, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar311_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e311, map_smul, opPi_ubar3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +attribute [local irreducible] Dψ Dbarψ fieldStrengthDeriv + +set_option maxHeartbeats 16000000 in +set_option maxRecDepth 8192 in +/-- The projected Klein average of any product of two field strengths lies in + the span of the invariants. -/ +lemma opPi_kleinAvg_FF_mem (a b c d : Fin 1 ⊕ Fin 3) : + opPi (kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_fieldStrengthDeriv_nil_mul, map_smul] + rcases a with a | a <;> rcases b with b | b <;> rcases c with c | c <;> + rcases d with d | d <;> fin_cases a <;> fin_cases b <;> fin_cases c <;> + fin_cases d <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | (rw [fieldStrengthDeriv_self] + simp only [zero_mul, mul_zero, map_zero, smul_zero] + exact Submodule.zero_mem _) + | (refine Submodule.smul_mem _ _ ?_ + first + | exact opPi_FF_c0101_mem + | exact opPi_FF_c0110_mem + | exact opPi_FF_c1001_mem + | exact opPi_FF_c1010_mem + | exact opPi_FF_c0123_mem + | exact opPi_FF_c0132_mem + | exact opPi_FF_c1023_mem + | exact opPi_FF_c1032_mem + | exact opPi_FF_c2301_mem + | exact opPi_FF_c2310_mem + | exact opPi_FF_c3201_mem + | exact opPi_FF_c3210_mem + | exact opPi_FF_c2323_mem + | exact opPi_FF_c2332_mem + | exact opPi_FF_c3223_mem + | exact opPi_FF_c3232_mem + | exact opPi_FF_c0202_mem + | exact opPi_FF_c0220_mem + | exact opPi_FF_c2002_mem + | exact opPi_FF_c2020_mem + | exact opPi_FF_c0213_mem + | exact opPi_FF_c0231_mem + | exact opPi_FF_c2013_mem + | exact opPi_FF_c2031_mem + | exact opPi_FF_c1302_mem + | exact opPi_FF_c1320_mem + | exact opPi_FF_c3102_mem + | exact opPi_FF_c3120_mem + | exact opPi_FF_c1313_mem + | exact opPi_FF_c1331_mem + | exact opPi_FF_c3113_mem + | exact opPi_FF_c3131_mem + | exact opPi_FF_c0303_mem + | exact opPi_FF_c0330_mem + | exact opPi_FF_c3003_mem + | exact opPi_FF_c3030_mem + | exact opPi_FF_c0312_mem + | exact opPi_FF_c0321_mem + | exact opPi_FF_c3012_mem + | exact opPi_FF_c3021_mem + | exact opPi_FF_c1203_mem + | exact opPi_FF_c1230_mem + | exact opPi_FF_c2103_mem + | exact opPi_FF_c2130_mem + | exact opPi_FF_c1212_mem + | exact opPi_FF_c1221_mem + | exact opPi_FF_c2112_mem + | exact opPi_FF_c2121_mem) + | (norm_num [paritySignZ, paritySignY, paritySignX] + first + | done + | exact Submodule.zero_mem _) + +set_option maxHeartbeats 16000000 in +set_option maxRecDepth 8192 in +/-- The projected Klein average of any second-derivative field strength lies + in the span of the invariants. -/ +lemma opPi_kleinAvg_DDF_mem (r t a b : Fin 1 ⊕ Fin 3) : + opPi (kleinAvg (fieldStrengthDeriv {r, t} a b)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_fieldStrengthDeriv_pair, map_smul] + rcases r with r | r <;> rcases t with t | t <;> rcases a with a | a <;> + rcases b with b | b <;> fin_cases r <;> fin_cases t <;> fin_cases a <;> + fin_cases b <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | (rw [fieldStrengthDeriv_self] + simp only [map_zero, smul_zero] + exact Submodule.zero_mem _) + | (refine Submodule.smul_mem _ _ ?_ + first + | exact opPi_DDF_c0101_mem + | exact opPi_DDF_c0110_mem + | exact opPi_DDF_c1001_mem + | exact opPi_DDF_c1010_mem + | exact opPi_DDF_c0123_mem + | exact opPi_DDF_c0132_mem + | exact opPi_DDF_c1023_mem + | exact opPi_DDF_c1032_mem + | exact opPi_DDF_c0202_mem + | exact opPi_DDF_c0220_mem + | exact opPi_DDF_c2002_mem + | exact opPi_DDF_c2020_mem + | exact opPi_DDF_c0213_mem + | exact opPi_DDF_c0231_mem + | exact opPi_DDF_c2013_mem + | exact opPi_DDF_c2031_mem + | exact opPi_DDF_c0303_mem + | exact opPi_DDF_c0330_mem + | exact opPi_DDF_c3003_mem + | exact opPi_DDF_c3030_mem + | exact opPi_DDF_c0312_mem + | exact opPi_DDF_c0321_mem + | exact opPi_DDF_c3012_mem + | exact opPi_DDF_c3021_mem + | exact opPi_DDF_c1203_mem + | exact opPi_DDF_c1230_mem + | exact opPi_DDF_c2103_mem + | exact opPi_DDF_c2130_mem + | exact opPi_DDF_c1212_mem + | exact opPi_DDF_c1221_mem + | exact opPi_DDF_c2112_mem + | exact opPi_DDF_c2121_mem + | exact opPi_DDF_c1302_mem + | exact opPi_DDF_c1320_mem + | exact opPi_DDF_c3102_mem + | exact opPi_DDF_c3120_mem + | exact opPi_DDF_c1313_mem + | exact opPi_DDF_c1331_mem + | exact opPi_DDF_c3113_mem + | exact opPi_DDF_c3131_mem + | exact opPi_DDF_c2301_mem + | exact opPi_DDF_c2310_mem + | exact opPi_DDF_c3201_mem + | exact opPi_DDF_c3210_mem + | exact opPi_DDF_c2323_mem + | exact opPi_DDF_c2332_mem + | exact opPi_DDF_c3223_mem + | exact opPi_DDF_c3232_mem) + | (norm_num [paritySignZ, paritySignY, paritySignX] + first + | done + | exact Submodule.zero_mem _) + +set_option maxRecDepth 8192 in +/-- The projected Klein average of any `ψ̄ (Dψ)` pair lies in the span. -/ +lemma opPi_kleinAvg_FM1_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dbarψ [] α * Dψ [μ] β)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | exact opPi_kA_u000_mem + | exact opPi_kA_u001_mem + | exact opPi_kA_u010_mem + | exact opPi_kA_u011_mem + | exact opPi_kA_u100_mem + | exact opPi_kA_u101_mem + | exact opPi_kA_u110_mem + | exact opPi_kA_u111_mem + | exact opPi_kA_u200_mem + | exact opPi_kA_u201_mem + | exact opPi_kA_u210_mem + | exact opPi_kA_u211_mem + | exact opPi_kA_u300_mem + | exact opPi_kA_u301_mem + | exact opPi_kA_u310_mem + | exact opPi_kA_u311_mem + +set_option maxRecDepth 8192 in +/-- The projected Klein average of any `(D̄ψ̄) ψ` pair lies in the span. -/ +lemma opPi_kleinAvg_FM2_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dbarψ [μ] α * Dψ [] β)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | exact opPi_kA_ubar000_mem + | exact opPi_kA_ubar001_mem + | exact opPi_kA_ubar010_mem + | exact opPi_kA_ubar011_mem + | exact opPi_kA_ubar100_mem + | exact opPi_kA_ubar101_mem + | exact opPi_kA_ubar110_mem + | exact opPi_kA_ubar111_mem + | exact opPi_kA_ubar200_mem + | exact opPi_kA_ubar201_mem + | exact opPi_kA_ubar210_mem + | exact opPi_kA_ubar211_mem + | exact opPi_kA_ubar300_mem + | exact opPi_kA_ubar301_mem + | exact opPi_kA_ubar310_mem + | exact opPi_kA_ubar311_mem + +/-- The reversed pair `(Dψ) ψ̄`, via anticommutation. -/ +lemma opPi_kleinAvg_FM1r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dψ [μ] β * Dbarψ [] α)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] + exact neg_mem (opPi_kleinAvg_FM1_mem μ α β) + +/-- The reversed pair `ψ (D̄ψ̄)`, via anticommutation. -/ +lemma opPi_kleinAvg_FM2r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dψ [] α * Dbarψ [μ] β)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] + exact neg_mem (opPi_kleinAvg_FM2_mem μ β α) + +end SectorEight + +set_option maxHeartbeats 4000000 in +/-- The weight-eight classification: a Lorentz-invariant neutral element of + mass weight eight is a combination of the Maxwell term, the theta term, and + the two fermion kinetic terms. -/ +lemma mem_span_of_mem_chargeCovSpan_eight {y : JetAlgebra} + (hy : y ∈ chargeCovSpan 8 0) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : + y ∈ Submodule.span ℂ massDimFourInvariants := by + have h := chargeCovSpan_eight_le hy + rw [Submodule.span_union, Submodule.span_union, Submodule.span_union, + Submodule.span_union, Submodule.span_union] at h + obtain ⟨u5, hu5, w6, hw6, hE6⟩ := Submodule.mem_sup.mp h + obtain ⟨u4, hu4, w5, hw5, hE5⟩ := Submodule.mem_sup.mp hu5 + obtain ⟨u3, hu3, w4, hw4, hE4⟩ := Submodule.mem_sup.mp hu4 + obtain ⟨u2, hu2, w3, hw3, hE3⟩ := Submodule.mem_sup.mp hu3 + obtain ⟨w1, hw1, w2, hw2, hE2⟩ := Submodule.mem_sup.mp hu2 + obtain ⟨c1, hc1⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw1 + obtain ⟨c2, hc2⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw2 + obtain ⟨c3, hc3⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw3 + obtain ⟨c4, hc4⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw4 + obtain ⟨c5, hc5⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw5 + obtain ⟨c6, hc6⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw6 + have hKy : kleinAvg y = y := by + rw [kleinAvg_apply, hinv parityZ, hinv parityY, hinv parityX] + module + have hself : opPi (kleinAvg y) = y := by + rw [hKy] + exact opPi_apply_of_invariant hinv + rw [← hself, ← hE6, ← hE5, ← hE4, ← hE3, ← hE2, ← hc1, ← hc2, ← hc3, ← hc4, + ← hc5, ← hc6] + simp only [map_add, map_sum, map_smul] + refine Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ + (Submodule.add_mem _ (Submodule.add_mem _ ?_ ?_) ?_) ?_) ?_) ?_ + · exact Submodule.sum_mem _ fun p _ => + Submodule.smul_mem _ _ (opPi_kleinAvg_FF_mem p.1.1 p.1.2 p.2.1 p.2.2) + · exact Submodule.sum_mem _ fun p _ => + Submodule.smul_mem _ _ (opPi_kleinAvg_DDF_mem p.1.1 p.1.2 p.2.1 p.2.2) + · exact Submodule.sum_mem _ fun p _ => + Submodule.smul_mem _ _ (opPi_kleinAvg_FM1_mem p.2 p.1.1 p.1.2) + · exact Submodule.sum_mem _ fun p _ => + Submodule.smul_mem _ _ (opPi_kleinAvg_FM1r_mem p.2 p.1.1 p.1.2) + · exact Submodule.sum_mem _ fun p _ => + Submodule.smul_mem _ _ (opPi_kleinAvg_FM2r_mem p.2 p.1.1 p.1.2) + · exact Submodule.sum_mem _ fun p _ => + Submodule.smul_mem _ _ (opPi_kleinAvg_FM2_mem p.2 p.1.2 p.1.1) + +/-- The classification of the renormalizable QED Lagrangian densities: the + gauge- and Lorentz-invariant elements of mass weight at most eight are spanned + by the constants, the Maxwell term, the theta term, and the two fermion + kinetic terms. + + The inclusion `⊇` is `span_massDimFourInvariants_le`: each of the five + elements is invariant and of weight at most eight. + + The completeness direction `⊆` is proved as follows. + 1. By `InvariantSubmodule.mem_iff_isInvariant` and + `isInvariant_iff_mem_adjoin_invariantGenerators`, an invariant `x` of + weight at most eight lies in the algebra generated by the covariant + generators, is fixed by the jets of constant gauge transformations, and is + Lorentz invariant. + 2. Graded decomposition (`exists_covMonomialSpan_decomp`): `x` is a sum of + nine components `z m ∈ covMonomialSpan m` of exact weights `0, …, 8`, + using the homogeneity of the covariant monomials and the linear + independence of the powers `c ↦ c ^ m` + (`eq_zero_of_forall_sum_pow_smul_eq_zero`). + 3. Componentwise invariance: the mass-dimension scaling commutes with the + Lorentz action and with the constant gauge action, so each component + `z m` inherits both invariances, again by independence of powers. + 4. Sector analysis. `m = 0`: the weight-zero monomial span is the constants. + `m = 1, 2`: there are no covariant monomials of these weights, since the + generators have weights at least three. Odd `m = 3, 5, 7`: odd weight + forces an odd number of fermionic factors, and the constant gauge + transformation with `u(0) = i` acts on such a monomial by + `(i⁶)^{n_ψ} ((-i)⁶)^{n_ψ̄} = (-1)^{n_ψ + n_ψ̄} = -1`, so invariance forces + `z m = 0`. `m = 4, 6`: after splitting off the hypercharge `±12` sectors + with a further root of unity, the surviving monomials (`F_{μν}`; + `∂_ρ F_{μν}` and the zero-derivative fermion pairs `ψ̄_α ψ_β`) admit no + Lorentz invariant. `m = 8`: the charge-balanced monomials are `F · F`, + `∂∂F`, and the one-derivative fermion pairs; their Lorentz invariants are + spanned by the Maxwell term, the theta term, and the two σ-contracted + kinetic terms. + + Steps 3–4 remain to be formalized: they require the commutation of the + scaling with the two group actions at the QED level, the linear independence + of the covariant monomials, and the invariant theory of `SL(2,ℂ)` on the + finite-dimensional weight sectors. -/ +lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : + InvariantMassWeightSubmodule 8 = Submodule.span ℂ massDimFourInvariants := by + refine le_antisymm ?_ span_massDimFourInvariants_le + intro x hx + obtain ⟨hxw, hxinv⟩ := Submodule.mem_inf.mp hx + rw [InvariantSubmodule.mem_iff_isInvariant] at hxinv + obtain ⟨hadj, hconst, hlor⟩ := + (isInvariant_iff_mem_adjoin_invariantGenerators x).mp hxinv + obtain ⟨z, hzmem, hxeq⟩ := exists_covMonomialSpan_decomp hxw hadj + rw [hxeq] + refine Submodule.sum_mem _ fun m hm => ?_ + have hzlor : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ (z m) = z m := fun Λ => + repLorentzGroup_covComponent_eq hzmem Λ (by rw [← hxeq]; exact hlor Λ) hm + have hzconst : ∀ g : GaugeGroupI, + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z m) = z m := fun g => + repJetGaugeGroupI_ofConstant_covComponent_eq hzmem g + (by rw [← hxeq]; exact hconst g) hm + have hm9 := Finset.mem_range.mp hm + interval_cases m + · exact Submodule.span_mono (Set.singleton_subset_iff.mpr (Set.mem_insert _ _)) + (covMonomialSpan_zero_le (hzmem 0)) + · rw [show z 1 = 0 from (Submodule.mem_bot ℂ).mp + (covMonomialSpan_le_bot_of_lt_three le_rfl (by omega) (hzmem 1))] + exact Submodule.zero_mem _ + · rw [show z 2 = 0 from (Submodule.mem_bot ℂ).mp + (covMonomialSpan_le_bot_of_lt_three (by omega) (by omega) (hzmem 2))] + exact Submodule.zero_mem _ + · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 3) + (hzconst parityGauge)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_mem_chargeCovSpan_four + (mem_chargeCovSpan_zero_of_invariant (hzmem 4) hzconst) hzlor] + exact Submodule.zero_mem _ + · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 5) + (hzconst parityGauge)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_mem_chargeCovSpan_six + (mem_chargeCovSpan_zero_of_invariant (hzmem 6) hzconst) hzlor] + exact Submodule.zero_mem _ + · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 7) + (hzconst parityGauge)] + exact Submodule.zero_mem _ + · exact mem_span_of_mem_chargeCovSpan_eight + (mem_chargeCovSpan_zero_of_invariant (hzmem 8) hzconst) hzlor end JetAlgebra diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean index 9883e92c2..b6144b330 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean @@ -51,12 +51,6 @@ end LeptonDoublet namespace LeptonSinglet -lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (basis α) = ∑ β, star (Λ.1 β α) • basis β := by - simp only [basis, Basis.map_apply, repLorentzGroup, MonoidHom.coe_mk, OneHom.coe_mk, - LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, LinearEquiv.apply_symm_apply, - Fermion.RightHandedWeyl.rep_apply_basis, Matrix.map_apply, map_sum, map_smul] - lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (α : Fin 2) : repGaugeGroupI g (basis α) = (star (g.toU1.1 : ℂ) ^ 6) • basis α := by simpa [basis, Basis.map_apply, valLinEquiv_symm_apply] using repGaugeGroupI_basis g α diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 856bd71e1..7f3219455 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -140,6 +140,41 @@ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonSinglet ext1 l simp [Module.End.mul_eq_comp] +/-- The Lorentz action on the lepton-singlet basis: the right-handed Weyl + action by the entrywise conjugate matrix. -/ +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (basis α) = ∑ β, star (Λ.1 β α) • basis β := by + simp only [basis, Module.Basis.map_apply, repLorentzGroup, MonoidHom.coe_mk, + OneHom.coe_mk, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + LinearEquiv.apply_symm_apply, Fermion.RightHandedWeyl.rep_apply_basis, + Matrix.map_apply, map_sum, map_smul] + +/-- The lepton jet coordinates transform contragrediently, by the entrywise + conjugate of the inverse matrix. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup.dual Λ (basis.dualBasis α) = + ∑ β, star ((Λ⁻¹).1 α β) • basis.dualBasis β := + Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => star ((Λ⁻¹).1 l j)) + (fun j => repLorentzGroup_apply_basis Λ⁻¹ j) + +/-- The Lorentz action on the conjugate lepton basis: the coefficients are the + conjugates of those of the lepton action, that is, the matrix itself. -/ +lemma repLorentzGroup_conj_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup.conj Λ (basis.conj α) = ∑ β, Λ.1 β α • basis.conj β := by + rw [Representation.conj_apply, Module.Basis.conj_apply, + LinearEquiv.symm_apply_apply, repLorentzGroup_apply_basis, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [LinearEquiv.map_smulₛₗ, starRingEnd_apply, star_star, Module.Basis.conj_apply] + +/-- The conjugate lepton jet coordinates transform by the inverse matrix. -/ +lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup.conj.dual Λ (basis.conj.dualBasis α) = + ∑ β, (Λ⁻¹).1 α β • basis.conj.dualBasis β := + Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => (Λ⁻¹).1 l j) + (fun j => repLorentzGroup_conj_apply_basis Λ⁻¹ j) + /-! ## D. Global Gauge action @@ -355,6 +390,113 @@ noncomputable def JetComponentSpace.repLorentzGroup : (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual).prod (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.conj.dual) +/-- The Lorentz action on the zeroth-order lepton jet coordinate: the + contragredient conjugate spinor action. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dψ {} α)) = + ∑ β, star ((Λ⁻¹).1 α β) • JetComponentSpace.basis (.dψ {} β) := by + rw [basis_dψ_nil, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + DerivAlgebraComplex.repLorentzGroup_apply_one, + LeptonSinglet.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum] + have hb : ∀ β : Fin 2, JetComponentSpace.basis + (.dψ (0 : Multiset (Fin 1 ⊕ Fin 3)) β) = + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis β, 0) := fun β => basis_dψ_nil β + refine Prod.ext ?_ ?_ + · simp [Prod.fst_sum, hb, TensorProduct.tmul_smul] + · simp [Prod.snd_sum, hb] + +set_option maxHeartbeats 1000000 in +/-- The Lorentz action on the first-order lepton jet coordinate: the derivative + slot transforms by the columns of the Lorentz matrix and the spinor slot + contragrediently. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • JetComponentSpace.basis (.dψ {ν} β) := by + rw [basis_dψ_singleton, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + DerivAlgebraComplex.repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, + LeptonSinglet.repLorentzGroup_dual_dualBasis, map_sum, TensorProduct.sum_tmul] + refine Prod.ext ?_ ?_ + · simp only [Prod.fst_sum, Prod.smul_fst, basis_dψ_singleton, map_smul, + TensorProduct.smul_tmul', TensorProduct.tmul_sum, TensorProduct.sum_tmul, + Finset.smul_sum, TensorProduct.tmul_smul, smul_smul] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [mul_comm] + · simp [Prod.snd_sum, basis_dψ_singleton, TensorProduct.tmul_sum, + TensorProduct.sum_tmul, map_smul, TensorProduct.smul_tmul'] + +/-- The Lorentz action on the zeroth-order conjugate lepton jet coordinate. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dbarψ {} α)) = + ∑ β, (Λ⁻¹).1 α β • JetComponentSpace.basis (.dbarψ {} β) := by + rw [basis_dbarψ, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + show DerivAlgebraComplex.basis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 from + DerivAlgebraComplex.basis_nil, + DerivAlgebraComplex.repLorentzGroup_apply_one, + LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, TensorProduct.tmul_sum] + have hb0 : DerivAlgebraComplex.basis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := + DerivAlgebraComplex.basis_nil + refine Prod.ext ?_ ?_ + · simp [Prod.fst_sum, basis_dbarψ] + · simp [Prod.snd_sum, basis_dbarψ, TensorProduct.tmul_smul, hb0] + +set_option maxHeartbeats 1000000 in +/-- The Lorentz action on the first-order conjugate lepton jet coordinate. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dbarψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dbarψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • JetComponentSpace.basis (.dbarψ {ν} β) := by + rw [basis_dbarψ, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + show DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) from + DerivAlgebraComplex.basis_singleton μ, + DerivAlgebraComplex.repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, + LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, map_sum, + TensorProduct.sum_tmul] + refine Prod.ext ?_ ?_ + · simp [Prod.fst_sum, basis_dbarψ, TensorProduct.tmul_sum, + TensorProduct.sum_tmul, map_smul, TensorProduct.smul_tmul'] + · simp only [Prod.snd_sum, Prod.smul_snd, basis_dbarψ, + DerivAlgebraComplex.basis_singleton, map_smul, TensorProduct.smul_tmul', + TensorProduct.tmul_sum, TensorProduct.sum_tmul, Finset.smul_sum, + TensorProduct.tmul_smul, smul_smul] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [mul_comm] + /-- The action of the jet gauge group on the dual jet algebra of the charged-lepton singlet's component functions. Component functions transform contragrediently to the field, so the hypercharge power series is @@ -934,6 +1076,57 @@ lemma repLorentzGroup_apply_mul (g : SL(2,ℂ)) (x y : JetAlgebra) : repLorentzGroup g (x * y) = repLorentzGroup g x * repLorentzGroup g y := by simp [repLorentzGroup_apply] +/-- The Lorentz action on a jet-algebra generator. -/ +lemma repLorentzGroup_ofGenerator (Λ : SL(2,ℂ)) (j : JetGenerators) : + repLorentzGroup Λ (ofGenerator j) = + ExteriorAlgebra.ι ℂ + (JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis j)) := by + rw [ofGenerator, repLorentzGroup_apply, ExteriorAlgebra.map_apply_ι] + +/-- The Lorentz action on the zeroth-order lepton generator. -/ +lemma repLorentzGroup_ofGenerator_ψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dψ {} α)) = + ∑ β, star ((Λ⁻¹).1 α β) • ofGenerator (.dψ {} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dψ_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + +/-- The Lorentz action on the first-order lepton generator. -/ +lemma repLorentzGroup_ofGenerator_ψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • ofGenerator (.dψ {ν} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dψ_singleton, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + +/-- The Lorentz action on the zeroth-order conjugate lepton generator. -/ +lemma repLorentzGroup_ofGenerator_barψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dbarψ {} α)) = + ∑ β, (Λ⁻¹).1 α β • ofGenerator (.dbarψ {} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dbarψ_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + +/-- The Lorentz action on the first-order conjugate lepton generator. -/ +lemma repLorentzGroup_ofGenerator_barψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dbarψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • ofGenerator (.dbarψ {ν} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dbarψ_singleton, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + /-! ### A.4. The formal total derivative on the jet algebra diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index b19fc3fb0..ebe8682cf 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -512,6 +512,18 @@ lemma jetRingAction_deriv (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebr -/ +/-- The components of a dual representation on a dual basis: if `ρ g⁻¹` has + matrix `M` in the basis `b` (columns indexing the argument), then `ρ.dual g` + acts on the dual basis by the rows of `M`. -/ +lemma _root_.Representation.dual_apply_dualBasis {k G V ι : Type*} [CommRing k] + [Group G] [AddCommGroup V] [Module k V] [Fintype ι] [DecidableEq ι] + (ρ : Representation k G V) (b : Module.Basis ι k V) (g : G) (i : ι) + (M : Matrix ι ι k) (hM : ∀ j, ρ g⁻¹ (b j) = ∑ l, M l j • b l) : + ρ.dual g (b.dualBasis i) = ∑ j, M i j • b.dualBasis j := by + refine b.ext fun j => ?_ + rw [Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply, hM] + simp [Finsupp.single_apply, Finset.sum_ite_eq, Finset.sum_ite_eq'] + open Matrix MatrixGroups /-- The representation of the Lorentz group `SL(2,ℂ)` on the algebra of derivative @@ -574,6 +586,43 @@ lemma repLorentzGroup_deriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (a : DerivAl refine Finset.sum_congr rfl fun ν _ => ?_ rw [mul_smul_comm, ← deriv_apply_eq_mul] +/-- The components of the complex dual covector action on the dual basis: the + dual derivative slots transform contravariantly, by the columns of the + (complexified) Lorentz matrix. The complex analogue of + `Lorentz.CoVector.sl2Rep_dual_dualBasis`. -/ +lemma _root_.Lorentz.CoℂModule.SL2CRep_dual_dualBasis (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) : + Lorentz.CoℂModule.SL2CRep.dual Λ (Lorentz.complexCoBasis.dualBasis μ) = + ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ).1 j μ : ℝ) : ℂ) • + Lorentz.complexCoBasis.dualBasis j := by + refine Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => (((Lorentz.SL2C.toLorentzGroup Λ).1 j l : ℝ) : ℂ)) + (fun j => ?_) + have hexp : Lorentz.CoℂModule.SL2CRep Λ⁻¹ (Lorentz.complexCoBasis j) = + ∑ l, (LinearMap.toMatrix Lorentz.complexCoBasis Lorentz.complexCoBasis + (Lorentz.CoℂModule.SL2CRep Λ⁻¹)) l j • Lorentz.complexCoBasis l := by + conv_lhs => rw [← Lorentz.complexCoBasis.sum_repr + (Lorentz.CoℂModule.SL2CRep Λ⁻¹ (Lorentz.complexCoBasis j))] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [LinearMap.toMatrix_apply] + rw [hexp] + refine Finset.sum_congr rfl fun l _ => ?_ + congr 1 + rw [Lorentz.complexCoBasis_ρ_apply, map_inv, Matrix.transpose_apply, + ← LorentzGroup.toComplex_inv, Matrix.inv_inv_of_invertible] + rfl + +/-- The Lorentz action on the singleton derivative monomial: the derivative + slot transforms by the columns of the Lorentz matrix. -/ +lemma repLorentzGroup_basis_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ∑ ν, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) • + basis ({ν} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [basis_singleton, repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul, basis_singleton] + /-! ### B.6. The derivative-degree scaling @@ -627,18 +676,6 @@ end DerivAlgebraComplex -/ -/-- The components of a dual representation on a dual basis: if `ρ g⁻¹` has - matrix `M` in the basis `b` (columns indexing the argument), then `ρ.dual g` - acts on the dual basis by the rows of `M`. -/ -lemma _root_.Representation.dual_apply_dualBasis {k G V ι : Type*} [CommRing k] - [Group G] [AddCommGroup V] [Module k V] [Fintype ι] [DecidableEq ι] - (ρ : Representation k G V) (b : Module.Basis ι k V) (g : G) (i : ι) - (M : Matrix ι ι k) (hM : ∀ j, ρ g⁻¹ (b j) = ∑ l, M l j • b l) : - ρ.dual g (b.dualBasis i) = ∑ j, M i j • b.dualBasis j := by - refine b.ext fun j => ?_ - rw [Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply, hM] - simp [Finsupp.single_apply, Finset.sum_ite_eq, Finset.sum_ite_eq'] - abbrev DerivAlgebraReal := SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) namespace DerivAlgebraReal diff --git a/Physlib/Relativity/SL2C/Basic.lean b/Physlib/Relativity/SL2C/Basic.lean index 3f7ba29f2..d7a33da3e 100644 --- a/Physlib/Relativity/SL2C/Basic.lean +++ b/Physlib/Relativity/SL2C/Basic.lean @@ -203,6 +203,53 @@ lemma toSelfAdjointMap_pauliBasis (i : Fin 1 ⊕ Fin 3) : apply congrArg exact Eq.symm (minkowskiMatrix.dual_apply_minkowskiMatrix ((toLorentzGroup M).1) i j) +set_option linter.unusedSimpArgs false in +/-- Trace orthogonality of the covariant Pauli basis: + `tr (σ'_a σ'_b) = 2 δ_{a b}`. -/ +lemma trace_pauliSelfAdjoint'_mul (a b : Fin 1 ⊕ Fin 3) : + Matrix.trace ((PauliMatrix.pauliSelfAdjoint' a).1 * + (PauliMatrix.pauliSelfAdjoint' b).1) = if a = b then 2 else 0 := by + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + simp [PauliMatrix.pauliSelfAdjoint', Matrix.neg_mul, Matrix.mul_neg, + PauliMatrix.σ0_σ0_trace, PauliMatrix.σ0_σ1_trace, PauliMatrix.σ0_σ2_trace, + PauliMatrix.σ0_σ3_trace, PauliMatrix.σ1_σ0_trace, PauliMatrix.σ1_σ1_trace, + PauliMatrix.σ1_σ2_trace, PauliMatrix.σ1_σ3_trace, PauliMatrix.σ2_σ0_trace, + PauliMatrix.σ2_σ1_trace, PauliMatrix.σ2_σ2_trace, PauliMatrix.σ2_σ3_trace, + PauliMatrix.σ3_σ0_trace, PauliMatrix.σ3_σ1_trace, PauliMatrix.σ3_σ2_trace, + PauliMatrix.σ3_σ3_trace] + +/-- The matrix elements of the covering map through the trace pairing: + `L(M)_{l i} = ½ tr (σ'_l · M σ'_i M†)`. -/ +lemma toLorentzGroup_eq_trace (M : SL(2,ℂ)) (l i : Fin 1 ⊕ Fin 3) : + (((toLorentzGroup M).1 l i : ℝ) : ℂ) = + Matrix.trace ((PauliMatrix.pauliSelfAdjoint' l).1 * + (M.1 * (PauliMatrix.pauliSelfAdjoint' i).1 * M.1ᴴ)) / 2 := by + have h := congrArg (fun A : selfAdjoint (Matrix (Fin 2) (Fin 2) ℂ) => + Matrix.trace ((PauliMatrix.pauliSelfAdjoint' l).1 * A.1)) + (toSelfAdjointMap_basis (M := M) i) + simp only [toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', + Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, selfAdjoint.val_smul, + Matrix.mul_sum, Matrix.trace_sum, Matrix.mul_smul, Matrix.trace_smul, + trace_pauliSelfAdjoint'_mul, smul_ite, smul_zero, Finset.sum_ite_eq, + Finset.mem_univ, if_true] at h + rw [h, real_smul] + ring + +/-- The covering map intertwines conjugate transposition with matrix + transposition: `L(M†) = L(M)ᵀ`. -/ +lemma toLorentzGroup_conjTranspose {M N : SL(2,ℂ)} (hN : N.1 = M.1ᴴ) : + (toLorentzGroup N).1 = (toLorentzGroup M).1ᵀ := by + ext l i + refine Complex.ofReal_injective ?_ + have h1 := toLorentzGroup_eq_trace N l i + have h2 := toLorentzGroup_eq_trace M i l + rw [hN] at h1 + rw [Matrix.transpose_apply, h1, h2] + congr 1 + rw [Matrix.conjTranspose_conjTranspose, ← Matrix.mul_assoc, ← Matrix.mul_assoc, + Matrix.trace_mul_cycle, ← Matrix.mul_assoc, Matrix.trace_mul_comm, + ← Matrix.mul_assoc] + /-- The first column of the Lorentz matrix formed from an element of `SL(2, ℂ)`. -/ lemma toLorentzGroup_fst_col (M : SL(2, ℂ)) : (fun μ => (toLorentzGroup M).1 μ (Sum.inl 0)) = fun μ => From 720c827ae39c31a3cf57022d938db68a7a3ba14c Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 06:13:52 +0100 Subject: [PATCH 097/254] refactor: Start clean up --- .../Basic.lean} | 25 ++ .../Invariants.lean} | 297 +++------------- Physlib/Particles/QED/JetAlgebra/MassDim.lean | 169 ++++++++++ .../StandardModel/Fermions/LeptonSinglet.lean | 11 + .../StandardModel/GaugeBosons/BBoson.lean | 317 +++++++++++------- 5 files changed, 438 insertions(+), 381 deletions(-) rename Physlib/Particles/QED/{JetAlgebra.lean => JetAlgebra/Basic.lean} (98%) rename Physlib/Particles/QED/{MassDim.lean => JetAlgebra/Invariants.lean} (97%) create mode 100644 Physlib/Particles/QED/JetAlgebra/MassDim.lean diff --git a/Physlib/Particles/QED/JetAlgebra.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean similarity index 98% rename from Physlib/Particles/QED/JetAlgebra.lean rename to Physlib/Particles/QED/JetAlgebra/Basic.lean index 0544cdd3d..269d70bc1 100644 --- a/Physlib/Particles/QED/JetAlgebra.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -98,6 +98,31 @@ open Matrix MatrixGroups noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetAlgebra := BBoson.JetAlgebra.complexRepLorentzGroup.tprod LeptonSinglet.JetAlgebra.repLorentzGroup +/-- The QED Lorentz action on a pure tensor. -/ +lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl + +/-- The Lorentz action on the QED jet algebra agrees with the algebra + homomorphism obtained as the tensor product of the complexified B-boson + action with the exterior-algebra action on the charged-lepton factor. -/ +lemma repLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : JetAlgebra) : + repLorentzGroup Λ x = Algebra.TensorProduct.map + (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) + (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) x := rfl + +/-- The Lorentz action on the QED jet algebra is multiplicative (term-level + form). -/ +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : + repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by + simp [repLorentzGroup_eq_algHom] + +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ (1 : JetAlgebra) = 1 := by + simp [repLorentzGroup_eq_algHom] + /-! ### B.2. The invarance condition diff --git a/Physlib/Particles/QED/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/Invariants.lean similarity index 97% rename from Physlib/Particles/QED/MassDim.lean rename to Physlib/Particles/QED/JetAlgebra/Invariants.lean index a3fdadd50..d96bab52e 100644 --- a/Physlib/Particles/QED/MassDim.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra +public import Physlib.Particles.QED.JetAlgebra.MassDim public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic /-! @@ -20,148 +20,10 @@ set_option maxHeartbeats 1000000 namespace QED open TensorProduct StandardModel -/-- We define the mass weight of a term as two times its mass dimnesion. -/ -def MassWeight : JetGenerators → ℕ - | JetGenerators.dB s _ => 2 * (1 + s.card) - | JetGenerators.dψ s _ => 3 + 2 * s.card - | JetGenerators.dbarψ s _ => 3 + 2 * s.card - namespace JetAlgebra /-! -## A. The massWeightScaling algebra homomorphism - --/ -/-- The mass-dimension scaling on the QED jet algebra: the algebra map - multiplying each generator by `c ^ w`, where `w` is twice its mass dimension. - It is the tensor product of the scalings on the B-boson and charged-lepton - jet algebras. -/ -noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.map (BBoson.JetAlgebra.massWeightScale c) - (LeptonSinglet.JetAlgebra.massWeightScale c) - -/-- Each generator scales by `c` to the power of its mass weight. -/ -@[simp] -lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : - massWeightScale c [j]ₐ = c ^ MassWeight j • [j]ₐ := by - cases j with - | dB s μ => - simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, map_one, - BBoson.JetAlgebra.massWeightScale_tmul_ofGenerator, ← TensorProduct.smul_tmul'] - rfl - | dψ s α => - simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, - ← Algebra.TensorProduct.one_def, map_one, - LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] - rfl - | dbarψ s α => - simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, - ← Algebra.TensorProduct.one_def, map_one, - LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] - rfl - -/-- The total derivative raises the mass weight by two. -/ -lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb, smul_add] - | tmul p l => - simp only [jetDeriv_tmul, map_add, massWeightScale, Algebra.TensorProduct.map_tmul, - BBoson.JetAlgebra.massWeightScale_jetDeriv_baseChange, - LeptonSinglet.JetAlgebra.massWeightScale_jetDeriv, TensorProduct.smul_tmul', - TensorProduct.tmul_smul, smul_add] - -/-- The covariant step raises the mass weight by two: the gauge-field term - `6 i B_μ ·` carries the same weight as the derivative. -/ -lemma massWeightScale_covariantStep (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightScale c (covariantStep μ x) = - c ^ 2 • covariantStep μ (massWeightScale c x) := by - have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = - massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b - have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = - c ^ 2 • [JetGenerators.dB {} μ]ₐ := by - rw [massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] - simp only [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply, map_add, map_smul, massWeightScale_jetDeriv, hm, hgen, - smul_mul_assoc] - module - -/-- The conjugate covariant step raises the mass weight by two. -/ -lemma massWeightScale_covariantStepBar (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightScale c (covariantStepBar μ x) = - c ^ 2 • covariantStepBar μ (massWeightScale c x) := by - have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = - massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b - have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = - c ^ 2 • [JetGenerators.dB {} μ]ₐ := by - rw [massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] - simp only [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply, map_sub, map_smul, massWeightScale_jetDeriv, hm, hgen, - smul_mul_assoc] - module - -/-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight - `3 + 2 |l|`. -/ -lemma massWeightScale_Dψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - massWeightScale c (Dψ l α) = c ^ (3 + 2 * l.length) • Dψ l α := by - induction l with - | nil => - rw [Dψ_nil, massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dψ {} α) = 3 from rfl] - norm_num - | cons μ l ih => - rw [Dψ_cons, massWeightScale_covariantStep, ih, map_smul, smul_smul, ← pow_add, - List.length_cons, show 3 + 2 * (l.length + 1) = 2 + (3 + 2 * l.length) from by - omega] - -/-- Homogeneity of the conjugate covariant derivative: `D̄_l ψ̄_α` has mass - weight `3 + 2 |l|`. -/ -lemma massWeightScale_Dbarψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - massWeightScale c (Dbarψ l α) = c ^ (3 + 2 * l.length) • Dbarψ l α := by - induction l with - | nil => - rw [Dbarψ_nil, massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dbarψ {} α) = 3 from rfl] - norm_num - | cons μ l ih => - rw [Dbarψ_cons, massWeightScale_covariantStepBar, ih, map_smul, smul_smul, - ← pow_add, List.length_cons, - show 3 + 2 * (l.length + 1) = 2 + (3 + 2 * l.length) from by omega] - -/-- Homogeneity of the field-strength derivatives: `∂_s F_{μν}` has mass weight - `4 + 2 |s|`. -/ -lemma massWeightScale_fieldStrengthDeriv (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - massWeightScale c (fieldStrengthDeriv s μ ν) = - c ^ (4 + 2 * Multiset.card s) • fieldStrengthDeriv s μ ν := by - have h : (fieldStrengthDeriv s μ ν : JetAlgebra) = - [JetGenerators.dB (s + {μ}) ν]ₐ - [JetGenerators.dB (s + {ν}) μ]ₐ := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] - rfl - rw [h, map_sub, massWeightScale_ofGenerator, massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dB (s + {μ}) ν) = 4 + 2 * Multiset.card s from by - simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, - show MassWeight (JetGenerators.dB (s + {ν}) μ) = 4 + 2 * Multiset.card s from by - simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, - smul_sub] - - -noncomputable def MassDimSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ { x | ∀ c : ℂ, massWeightScale c x = c ^ n • x } - -noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ m • x} - -noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - MassWeightLESubmodule n ⊓ InvariantSubmodule - -/-! - ## The renormalizable invariants The gauge- and Lorentz-invariant elements of mass dimension at most four (mass @@ -333,32 +195,6 @@ lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] simp -set_option maxHeartbeats 4000000 in -/-- The Lorentz action on the QED jet algebra is multiplicative (term-level - form). -/ -lemma repLorentzGroup_mul' (Λ : SL(2,ℂ)) (a b : JetAlgebra) : - repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by - have happ : ∀ (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra), - repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := fun p l => rfl - have hd₁ : ∀ x y z : JetAlgebra, (x + y) * z = x * z + y * z := by grind - have hd₂ : ∀ x y z : JetAlgebra, x * (y + z) = x * y + x * z := by grind - have hz₁ : ∀ x : JetAlgebra, 0 * x = 0 := fun x => zero_mul x - have hz₂ : ∀ x : JetAlgebra, x * 0 = 0 := fun x => mul_zero x - induction a using TensorProduct.induction_on with - | zero => rw [hz₁, map_zero, hz₁] - | add x y hx hy => rw [hd₁, map_add, map_add, hx, hy, hd₁] - | tmul p l => - induction b using TensorProduct.induction_on with - | zero => rw [hz₂, map_zero, hz₂] - | add x y hx hy => rw [hd₂, map_add, map_add, hx, hy, hd₂] - | tmul p' l' => - rw [Algebra.TensorProduct.tmul_mul_tmul, happ, happ, happ, - Algebra.TensorProduct.tmul_mul_tmul, - BBoson.JetAlgebra.complexRepLorentzGroup_mul, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_mul] - /-- The transformation law of the embedded field strength: an antisymmetric two-tensor with both indices transforming by the Lorentz matrix. -/ lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : @@ -416,7 +252,7 @@ lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν : ℝ) : ℂ)) • (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by intro μ ν - rw [repLorentzGroup_mul', repLorentzGroup_fieldStrengthDeriv_nil] + rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil] have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), (∑ x, f x) * y = ∑ x, f x * y := fun f y => by rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] @@ -466,7 +302,7 @@ lemma repLorentzGroup_fieldStrengthDeriv_mul (Λ : SL(2,ℂ)) (((Lorentz.SL2C.toLorentzGroup Λ).1 a' ρ * (Lorentz.SL2C.toLorentzGroup Λ).1 b' τ : ℝ) : ℂ)) • (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - rw [repLorentzGroup_mul', repLorentzGroup_fieldStrengthDeriv_nil, + rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), (∑ x, f x) * y = ∑ x, f x * y := fun f y => by @@ -665,27 +501,6 @@ lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : -/ -/-- The QED Lorentz action on a pure tensor. -/ -lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl - -/-- The complexified B-boson Lorentz action fixes the unit. -/ -lemma complexRepLorentzGroup_one (Λ : SL(2,ℂ)) : - BBoson.JetAlgebra.complexRepLorentzGroup Λ - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by - rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = - (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, - show BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) - from rfl, - show BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) = 1 from - map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - BBoson.JetComponentSpace.repLorentzGroup Λ))] - /-- The Lorentz action on the zeroth-order lepton generator: the spinor index transforms contragrediently, by the conjugate inverse matrix. -/ lemma repLorentzGroup_ψ (Λ : SL(2,ℂ)) (α : Fin 2) : @@ -695,7 +510,7 @@ lemma repLorentzGroup_ψ (Λ : SL(2,ℂ)) (α : Fin 2) : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ {} α) from rfl, - repLorentzGroup_tmul, complexRepLorentzGroup_one, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, TensorProduct.tmul_sum] refine Finset.sum_congr rfl fun β _ => ?_ @@ -712,7 +527,7 @@ lemma repLorentzGroup_dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ {μ} α) from rfl, - repLorentzGroup_tmul, complexRepLorentzGroup_one, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, TensorProduct.tmul_sum] refine Finset.sum_congr rfl fun ν _ => ?_ @@ -730,7 +545,7 @@ lemma repLorentzGroup_barψ (Λ : SL(2,ℂ)) (α : Fin 2) : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ {} α) from rfl, - repLorentzGroup_tmul, complexRepLorentzGroup_one, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, TensorProduct.tmul_sum] refine Finset.sum_congr rfl fun β _ => ?_ @@ -747,7 +562,7 @@ lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ {μ} α) from rfl, - repLorentzGroup_tmul, complexRepLorentzGroup_one, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, TensorProduct.tmul_sum] refine Finset.sum_congr rfl fun ν _ => ?_ @@ -756,32 +571,6 @@ lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) rw [TensorProduct.tmul_smul] rfl -/-- The Lorentz action on the zeroth-order B-boson generator of the B-boson - jet algebra: the covector transformation. -/ -lemma _root_.StandardModel.BBoson.JetAlgebra.repLorentzGroup_ofGenerator_dB_nil - (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = - ∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ • - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} ν) := by - rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.jetComponentSpace_basis_dB, - show BBoson.JetComponentSpace.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {} ⊗ₜ[ℝ] - StandardModel.BBoson.basis.dualBasis μ) = - (DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {})) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ (StandardModel.BBoson.basis.dualBasis μ)) - from rfl, - BBoson.dualRealJetAlgebraBasis_nil, - show DerivAlgebraReal.repLorentzGroup Λ (1 : DerivAlgebraReal) = 1 from - map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - Lorentz.CoVector.sl2Rep.dual Λ)), - BBoson.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum, map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_smul, map_smul, BBoson.JetAlgebra.ofGenerator, - BBoson.jetComponentSpace_basis_dB, BBoson.dualRealJetAlgebraBasis_nil] - /-- The Lorentz action on the zeroth-order B-boson generator of the QED jet algebra. -/ lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : @@ -854,7 +643,7 @@ lemma repLorentzGroup_Dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by rw [smul_mul_smul_comm] - rw [Dψ_singleton, map_add, map_smul, repLorentzGroup_mul', repLorentzGroup_B, + rw [Dψ_singleton, map_add, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, repLorentzGroup_ψ, repLorentzGroup_dψ_singleton] conv_rhs => enter [2, ν, 2, β]; rw [Dψ_singleton, smul_add] conv_rhs => enter [2, ν]; rw [Finset.sum_add_distrib] @@ -885,7 +674,7 @@ lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by rw [smul_mul_smul_comm] - rw [Dbarψ_singleton, map_sub, map_smul, repLorentzGroup_mul', repLorentzGroup_B, + rw [Dbarψ_singleton, map_sub, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton] conv_rhs => enter [2, ν, 2, β]; rw [Dbarψ_singleton, smul_sub] conv_rhs => enter [2, ν]; rw [Finset.sum_sub_distrib] @@ -1038,7 +827,7 @@ lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : conv_lhs => enter [2, μ, 2, α]; rw [map_sum] conv_lhs => enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_mul', repLorentzGroup_Dbarψ_nil, + rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] -- move the primed sums out and the unprimed sums in @@ -1088,7 +877,7 @@ lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : conv_lhs => enter [2, μ, 2, α]; rw [map_sum] conv_lhs => enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_mul', repLorentzGroup_Dbarψ_singleton, + rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] simp only [hsmS, hsmF, hmsF, hsmul, Finset.smul_sum, smul_smul] -- move the transformed sums out and the original sums in @@ -2826,7 +2615,7 @@ lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by rw [smul_mul_smul_comm] - rw [repLorentzGroup_mul', repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] simp only [hsm, hms, hsmul] /-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ @@ -2845,7 +2634,7 @@ lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by rw [smul_mul_smul_comm] - rw [repLorentzGroup_mul', repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] simp only [hsm, hms, hsmul] /-! @@ -3729,7 +3518,7 @@ lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (Λ : SL(2,ℂ)) have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by rw [smul_mul_smul_comm] - rw [repLorentzGroup_mul', repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] simp only [hsm, hms, hms₂, hsmul] set_option maxHeartbeats 2000000 in @@ -3755,7 +3544,7 @@ lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by rw [smul_mul_smul_comm] - rw [repLorentzGroup_mul', repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] simp only [hsm, hsm₂, hms, hsmul] set_option maxHeartbeats 2000000 in @@ -5134,7 +4923,7 @@ lemma pairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F01 t ht, genZ_F01 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5158,7 +4947,7 @@ lemma pairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F01 t ht, genZ_F01 t⁻¹ (inv_ne_zero ht), genZ_F23 t ht, @@ -5184,7 +4973,7 @@ lemma pairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F02 t ht, genZ_F02 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5208,7 +4997,7 @@ lemma pairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F02 t ht, genZ_F02 t⁻¹ (inv_ne_zero ht), genZ_F13 t ht, @@ -5233,7 +5022,7 @@ lemma pairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F03 t ht, genZ_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) @@ -5252,7 +5041,7 @@ lemma pairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F03 t ht, genZ_F03 t⁻¹ (inv_ne_zero ht), genZ_F12 t ht, @@ -5273,7 +5062,7 @@ lemma pairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F12 t ht, genZ_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) @@ -5295,7 +5084,7 @@ lemma pairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F13 t ht, genZ_F13 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5319,7 +5108,7 @@ lemma pairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genZ_F23 t ht, genZ_F23 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5340,7 +5129,7 @@ lemma pairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F01 t ht, genX_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) @@ -5359,7 +5148,7 @@ lemma pairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F01 t ht, genX_F01 t⁻¹ (inv_ne_zero ht), genX_F23 t ht, @@ -5383,7 +5172,7 @@ lemma pairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F02 t ht, genX_F02 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5407,7 +5196,7 @@ lemma pairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F02 t ht, genX_F02 t⁻¹ (inv_ne_zero ht), genX_F13 t ht, @@ -5433,7 +5222,7 @@ lemma pairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F03 t ht, genX_F03 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5457,7 +5246,7 @@ lemma pairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F03 t ht, genX_F03 t⁻¹ (inv_ne_zero ht), genX_F12 t ht, @@ -5485,7 +5274,7 @@ lemma pairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F12 t ht, genX_F12 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5509,7 +5298,7 @@ lemma pairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F13 t ht, genX_F13 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5530,7 +5319,7 @@ lemma pairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genX_F23 t ht, genX_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) @@ -5552,7 +5341,7 @@ lemma pairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F01 t ht, genY_F01 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5576,7 +5365,7 @@ lemma pairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F01 t ht, genY_F01 t⁻¹ (inv_ne_zero ht), genY_F23 t ht, @@ -5599,7 +5388,7 @@ lemma pairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F02 t ht, genY_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) @@ -5618,7 +5407,7 @@ lemma pairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F02 t ht, genY_F02 t⁻¹ (inv_ne_zero ht), genY_F13 t ht, @@ -5642,7 +5431,7 @@ lemma pairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F03 t ht, genY_F03 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5666,7 +5455,7 @@ lemma pairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F03 t ht, genY_F03 t⁻¹ (inv_ne_zero ht), genY_F12 t ht, @@ -5694,7 +5483,7 @@ lemma pairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F12 t ht, genY_F12 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -5715,7 +5504,7 @@ lemma pairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F13 t ht, genY_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) @@ -5737,7 +5526,7 @@ lemma pairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_mul', repLorentzGroup_mul'] + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] simp only [genY_F23 t ht, genY_F23 t⁻¹ (inv_ne_zero ht)] simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, @@ -10018,7 +9807,7 @@ lemma kleinAvg_fieldStrengthDeriv_nil_mul (a b c d : Fin 1 ⊕ Fin 3) : paritySignX a * paritySignX b * (paritySignX c * paritySignX d)) / 4 : ℝ) : ℂ) • (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) := by rw [kleinAvg_apply] - simp only [repLorentzGroup_mul', + simp only [repLorentzGroup_apply_mul, repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityZ, repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX, diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/MassDim.lean new file mode 100644 index 000000000..f987d449b --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/MassDim.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Basic +public import Physlib.Relativity.MinkowskiMatrix +public import Physlib.Relativity.PauliMatrices.Basic +/-! +# Mass dimension on the QED jet algebra + +-/ + +@[expose] public section + +namespace QED +open TensorProduct StandardModel + +/-- We define the mass weight of a term as two times its mass dimnesion. -/ +def MassWeight : JetGenerators → ℕ + | JetGenerators.dB s _ => 2 * (1 + s.card) + | JetGenerators.dψ s _ => 3 + 2 * s.card + | JetGenerators.dbarψ s _ => 3 + 2 * s.card + +namespace JetAlgebra + +/-! + +## A. The massWeightScaling algebra homomorphism + +-/ +/-- The mass-dimension scaling on the QED jet algebra: the algebra map + multiplying each generator by `c ^ w`, where `w` is twice its mass dimension. + It is the tensor product of the scalings on the B-boson and charged-lepton + jet algebras. -/ +noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (BBoson.JetAlgebra.massWeightScale c) + (LeptonSinglet.JetAlgebra.massWeightScale c) + +/-- Each generator scales by `c` to the power of its mass weight. -/ +@[simp] +lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : + massWeightScale c [j]ₐ = c ^ MassWeight j • [j]ₐ := by + cases j with + | dB s μ => + simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, map_one, + BBoson.JetAlgebra.massWeightScale_tmul_ofGenerator, ← TensorProduct.smul_tmul'] + rfl + | dψ s α => + simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, + ← Algebra.TensorProduct.one_def, map_one, + LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] + rfl + | dbarψ s α => + simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, + ← Algebra.TensorProduct.one_def, map_one, + LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] + rfl + +/-- The total derivative raises the mass weight by two. -/ +lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + | tmul p l => + simp only [jetDeriv_tmul, map_add, massWeightScale, Algebra.TensorProduct.map_tmul, + BBoson.JetAlgebra.massWeightScale_jetDeriv_baseChange, + LeptonSinglet.JetAlgebra.massWeightScale_jetDeriv, TensorProduct.smul_tmul', + TensorProduct.tmul_smul, smul_add] + +/-- The covariant step raises the mass weight by two: the gauge-field term + `6 i B_μ ·` carries the same weight as the derivative. -/ +lemma massWeightScale_covariantStep (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (covariantStep μ x) = + c ^ 2 • covariantStep μ (massWeightScale c x) := by + have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = + massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b + have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = + c ^ 2 • [JetGenerators.dB {} μ]ₐ := by + rw [massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] + simp only [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply, map_add, map_smul, massWeightScale_jetDeriv, hm, hgen, + smul_mul_assoc] + module + +/-- The conjugate covariant step raises the mass weight by two. -/ +lemma massWeightScale_covariantStepBar (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (covariantStepBar μ x) = + c ^ 2 • covariantStepBar μ (massWeightScale c x) := by + have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = + massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b + have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = + c ^ 2 • [JetGenerators.dB {} μ]ₐ := by + rw [massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] + simp only [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply, map_sub, map_smul, massWeightScale_jetDeriv, hm, hgen, + smul_mul_assoc] + module + +/-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight + `3 + 2 |l|`. -/ +lemma massWeightScale_Dψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + massWeightScale c (Dψ l α) = c ^ (3 + 2 * l.length) • Dψ l α := by + induction l with + | nil => + rw [Dψ_nil, massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dψ {} α) = 3 from rfl] + norm_num + | cons μ l ih => + rw [Dψ_cons, massWeightScale_covariantStep c μ (Dψ l α), ih] + simp only [map_smul, smul_smul, List.length_cons] + ring_nf + + +/-- Homogeneity of the conjugate covariant derivative: `D̄_l ψ̄_α` has mass + weight `3 + 2 |l|`. -/ +lemma massWeightScale_Dbarψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + massWeightScale c (Dbarψ l α) = c ^ (3 + 2 * l.length) • Dbarψ l α := by + induction l with + | nil => + rw [Dbarψ_nil, massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dbarψ {} α) = 3 from rfl] + norm_num + | cons μ l ih => + rw [Dbarψ_cons, massWeightScale_covariantStepBar c μ (Dbarψ l α), ih] + simp only [map_smul, smul_smul, List.length_cons] + ring_nf + +/-- Homogeneity of the field-strength derivatives: `∂_s F_{μν}` has mass weight + `4 + 2 |s|`. -/ +lemma massWeightScale_fieldStrengthDeriv (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + massWeightScale c (fieldStrengthDeriv s μ ν) = + c ^ (4 + 2 * Multiset.card s) • fieldStrengthDeriv s μ ν := by + have h : (fieldStrengthDeriv s μ ν : JetAlgebra) = + [JetGenerators.dB (s + {μ}) ν]ₐ - [JetGenerators.dB (s + {ν}) μ]ₐ := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, map_sub, massWeightScale_ofGenerator, massWeightScale_ofGenerator, + show MassWeight (JetGenerators.dB (s + {μ}) ν) = 4 + 2 * Multiset.card s from by + simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, + show MassWeight (JetGenerators.dB (s + {ν}) μ) = 4 + 2 * Multiset.card s from by + simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, + smul_sub] + + +/-! + +##. The mass-weight submodules + +-/ +noncomputable def MassDimSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ { x | ∀ c : ℂ, massWeightScale c x = c ^ n • x } + +noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ m • x} + +noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + MassWeightLESubmodule n ⊓ InvariantSubmodule + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 7f3219455..d48636413 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -1127,6 +1127,17 @@ lemma repLorentzGroup_ofGenerator_barψ_singleton (Λ : SL(2,ℂ)) refine Finset.sum_congr rfl fun β _ => ?_ rw [map_smul, ofGenerator] + +noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : + AlgHom ℂ JetAlgebra JetAlgebra where + toFun := repLorentzGroup Λ + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repLorentzGroup_apply_one Λ + map_mul' := repLorentzGroup_apply_mul Λ + commutes' r := by simp [repLorentzGroup_apply] + + /-! ### A.4. The formal total derivative on the jet algebra diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 1f47567c5..f98cc5ec5 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -146,6 +146,37 @@ noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) BBoson where ext1 F simp [TensorProduct.map_map, Module.End.mul_eq_comp, map_mul] + +/-- The Lorentz action on the B-boson basis: the covector transformation. -/ +lemma repLorentzGroup_basis (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (basis μ) = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1⁻¹ μ j • basis j := by + have happ : repLorentzGroup Λ (basis μ) = valLinEquiv.symm.toLinearMap + (TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup Λ)) + (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) Λ) + (valLinEquiv.toLinearMap (basis μ))) := rfl + rw [happ, show valLinEquiv.toLinearMap (basis μ) = + Lorentz.CoVector.basis μ ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from by + rw [basis_apply]; rfl, + TensorProduct.map_tmul, Lorentz.CoVector.rep_apply_basis, + Representation.trivial_apply, TensorProduct.sum_tmul, map_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [← TensorProduct.smul_tmul', map_smul] + congr 1 + rw [show valLinEquiv.symm.toLinearMap (Lorentz.CoVector.basis j ⊗ₜ[ℝ] + Complex.selfAdjointEquiv.symm 1) = (⟨Lorentz.CoVector.basis j ⊗ₜ[ℝ] + Complex.selfAdjointEquiv.symm 1⟩ : BBoson) from rfl, ← basis_apply] + +/-- The jet coordinates of the B boson transform contravariantly on the target + index, by the columns of the Lorentz matrix, matching the derivative slots. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup.dual Λ (basis.dualBasis ν) = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1 j ν • basis.dualBasis j := by + refine Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => (Lorentz.SL2C.toLorentzGroup Λ).1 j l) (fun j => ?_) + rw [repLorentzGroup_basis, ← LorentzGroup.coe_inv, map_inv, inv_inv] + rfl + /-! ## D. Gauge action @@ -480,6 +511,14 @@ lemma mcPairing_mul (U V : JetGaugeGroupI) : obtain ⟨s, ν⟩ := g simp [mcPairing_basis_dB', maurerCartanU1Coeff_mul, smul_add] +/-- The Maurer–Cartan pairing of a jet of constant gauge transformations + vanishes. -/ +lemma mcPairing_ofConstant (g : GaugeGroupI) : + mcPairing (JetGaugeGroupI.ofConstant g) = 0 := by + refine JetComponentSpace.basis.ext fun j => ?_ + obtain ⟨s, ν⟩ := j + simp [mcPairing_basis_dB'] + /-- The factorial weight of a multi-index augmented by one derivative: the multiplicity of the new index times the original weight. -/ lemma prod_factorial_add_single (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (κ : Fin 1 ⊕ Fin 3) : @@ -680,6 +719,14 @@ noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := -/ + +/-! + +### A.1. The real Lorentz representation + +-/ + + noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) JetAlgebra where toFun Λ := (SymmetricAlgebra.lift @@ -697,6 +744,90 @@ noncomputable def repLorentzGroup : refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [map_mul, Module.End.mul_apply] +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (a : JetAlgebra) : + repLorentzGroup Λ a = + (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ)) a := rfl + +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : + repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by + simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ (1 : JetAlgebra) = 1 := by + simp [repLorentzGroup_apply] + +/-- The Lorentz action on a jet-algebra generator. -/ +@[simp] +lemma repLorentzGroup_apply_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace) : + repLorentzGroup Λ (SymmetricAlgebra.ι ℝ JetComponentSpace x) = + SymmetricAlgebra.ι ℝ JetComponentSpace + (JetComponentSpace.repLorentzGroup Λ x) := by + simp [repLorentzGroup_apply] + + + +/-- The multiset basis of the real dual derivative slots at the empty index. -/ +lemma _root_.StandardModel.BBoson.dualRealJetAlgebraBasis_nil : + LagrangianTheory.dualRealJetAlgebraBasis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) + ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) = 1 := by + rw [MvPolynomial.coe_basisMonomials] + simp [MvPolynomial.monomial_zero'] + rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, + Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({} : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp, + Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] + simp + +/-- The multiset basis vectors of the real dual derivative slots multiply by + adding the multisets. -/ +lemma _root_.StandardModel.BBoson.dualRealJetAlgebraBasis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : + LagrangianTheory.dualRealJetAlgebraBasis s * + LagrangianTheory.dualRealJetAlgebraBasis t = + LagrangianTheory.dualRealJetAlgebraBasis (s + t) := by + rw [dualRealJetAlgebraBasis_apply', dualRealJetAlgebraBasis_apply', + dualRealJetAlgebraBasis_apply', map_add] + simp only [Module.Basis.symmetricAlgebra, Module.Basis.map_apply, + show ∀ p, (SymmetricAlgebra.equivMvPolynomial + Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = + (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p + from fun _ => rfl, + ← map_mul, MvPolynomial.coe_basisMonomials] + simp only [MvPolynomial.monomial_mul, mul_one] + + +/-- The Lorentz action on the zeroth-order B-boson generator of the B-boson + jet algebra: the covector transformation. -/ +lemma repLorentzGroup_ofGenerator_dB_nil (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = + ∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ • + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} ν) := by + rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.jetComponentSpace_basis_dB, + show BBoson.JetComponentSpace.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {} ⊗ₜ[ℝ] + StandardModel.BBoson.basis.dualBasis μ) = + (DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {})) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ (StandardModel.BBoson.basis.dualBasis μ)) + from rfl, + BBoson.dualRealJetAlgebraBasis_nil, + show DerivAlgebraReal.repLorentzGroup Λ (1 : DerivAlgebraReal) = 1 from + map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + Lorentz.CoVector.sl2Rep.dual Λ)), + BBoson.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_smul, map_smul, BBoson.JetAlgebra.ofGenerator, + BBoson.jetComponentSpace_basis_dB, BBoson.dualRealJetAlgebraBasis_nil] + +/-! + +### A.2. The complexified Lorentz representation + +-/ + noncomputable def complexRepLorentzGroup : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] JetAlgebra) where toFun U := LinearMap.baseChange ℂ (BBoson.JetAlgebra.repLorentzGroup U) map_one' := by @@ -706,6 +837,39 @@ noncomputable def complexRepLorentzGroup : Representation ℂ SL(2,ℂ) (ℂ ⊗ ext x simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] +/-- The complexified Lorentz action agrees with the algebra homomorphism + obtained by tensoring the multiplicative lift defining the real action with + the identity of `ℂ`. -/ +lemma complexRepLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] JetAlgebra) : + complexRepLorentzGroup Λ x = + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) + (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + JetComponentSpace.repLorentzGroup Λ)) x := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb] + | tmul c b => rfl + +/-- The complexified B-boson Lorentz action fixes the unit. -/ +lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by + simp [complexRepLorentzGroup_eq_algHom] + +lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + complexRepLorentzGroup Λ (a * b) = + complexRepLorentzGroup Λ a * complexRepLorentzGroup Λ b := by + simp [complexRepLorentzGroup_eq_algHom] + +noncomputable def complexRepLorentzGroupAlgHom (Λ : SL(2,ℂ)) : + AlgHom ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) (ℂ ⊗[ℝ] BBoson.JetAlgebra) where + toFun := complexRepLorentzGroup Λ + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := complexRepLorentzGroup_apply_one Λ + map_mul' := complexRepLorentzGroup_apply_mul Λ + commutes' r := by simp [complexRepLorentzGroup_eq_algHom] + + /-! ## A. Representation of the jet Gauge group @@ -780,7 +944,6 @@ lemma repJetGaugeGroupI_one (U : JetGaugeGroupI) : have h := repJetGaugeGroupI_algebraMap U 1 simpa using h - /-- Conjugating the jet gauge action by the polynomial coordinates of the jet algebra: under `SymmetricAlgebra.equivMvPolynomial` the substitution automorphism `x ↦ x + ⟨mc, x⟩ 1` becomes the translation of every polynomial @@ -814,6 +977,22 @@ lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) exact DFunLike.congr_fun h V +/-- Jets of constant gauge transformations act trivially on the B-boson jet + algebra: the Maurer–Cartan shift vanishes. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by + rw [show repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ + mcPairing (JetGaugeGroupI.ofConstant g))) x from rfl, + mcPairing_ofConstant] + have h2 : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = + AlgHom.id ℝ JetAlgebra := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) + simp + rw [h2] + rfl /-! @@ -867,6 +1046,16 @@ lemma complexRepJetGaugeGroupI_ofGenerator (U : JetGaugeGroupI) (g : JetGenerato algebraMap ℝ ℂ (mcPairing U (JetComponentSpace.basis g)) from rfl, algebraMap_smul] +/-- Jets of constant gauge transformations act trivially on the complexified + B-boson jet algebra. -/ +lemma complexRepJetGaugeGroupI_ofConstant (g : GaugeGroupI) + (x : ℂ ⊗[ℝ] JetAlgebra) : + complexRepJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, ha, hb] + | tmul z b => rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_ofConstant] + /-! ## The formal total derivative on the jet algebra @@ -1980,36 +2169,6 @@ end JetAlgebra -/ -/-- The Lorentz action on the B-boson basis: the covector transformation. -/ -lemma repLorentzGroup_basis (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (basis μ) = - ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1⁻¹ μ j • basis j := by - have happ : repLorentzGroup Λ (basis μ) = valLinEquiv.symm.toLinearMap - (TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup Λ)) - (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) Λ) - (valLinEquiv.toLinearMap (basis μ))) := rfl - rw [happ, show valLinEquiv.toLinearMap (basis μ) = - Lorentz.CoVector.basis μ ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from by - rw [basis_apply]; rfl, - TensorProduct.map_tmul, Lorentz.CoVector.rep_apply_basis, - Representation.trivial_apply, TensorProduct.sum_tmul, map_sum] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [← TensorProduct.smul_tmul', map_smul] - congr 1 - rw [show valLinEquiv.symm.toLinearMap (Lorentz.CoVector.basis j ⊗ₜ[ℝ] - Complex.selfAdjointEquiv.symm 1) = (⟨Lorentz.CoVector.basis j ⊗ₜ[ℝ] - Complex.selfAdjointEquiv.symm 1⟩ : BBoson) from rfl, ← basis_apply] - -/-- The jet coordinates of the B boson transform contravariantly on the target - index, by the columns of the Lorentz matrix, matching the derivative slots. -/ -lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup.dual Λ (basis.dualBasis ν) = - ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1 j ν • basis.dualBasis j := by - refine Representation.dual_apply_dualBasis _ _ _ _ - (Matrix.of fun l j => (Lorentz.SL2C.toLorentzGroup Λ).1 j l) (fun j => ?_) - rw [repLorentzGroup_basis, ← LorentzGroup.coe_inv, map_inv, inv_inv] - rfl - /-- The multiset basis of the real dual derivative slots at a singleton index. -/ lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = @@ -2024,35 +2183,6 @@ lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] simp -/-- The multiset basis of the real dual derivative slots at the empty index. -/ -lemma dualRealJetAlgebraBasis_nil : - LagrangianTheory.dualRealJetAlgebraBasis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by - have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) - ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) = 1 := by - rw [MvPolynomial.coe_basisMonomials] - simp [MvPolynomial.monomial_zero'] - rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, - Equiv.symm_symm, - show Multiset.toFinsupp.toEquiv ({} : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp, - Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] - simp - -/-- The multiset basis vectors of the real dual derivative slots multiply by - adding the multisets. -/ -lemma dualRealJetAlgebraBasis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : - LagrangianTheory.dualRealJetAlgebraBasis s * - LagrangianTheory.dualRealJetAlgebraBasis t = - LagrangianTheory.dualRealJetAlgebraBasis (s + t) := by - rw [dualRealJetAlgebraBasis_apply', dualRealJetAlgebraBasis_apply', - dualRealJetAlgebraBasis_apply', map_add] - simp only [Module.Basis.symmetricAlgebra, Module.Basis.map_apply, - show ∀ p, (SymmetricAlgebra.equivMvPolynomial - Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = - (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p - from fun _ => rfl, - ← map_mul, MvPolynomial.coe_basisMonomials] - simp only [MvPolynomial.monomial_mul, mul_one] - /-- The degree scaling multiplies the multiset basis vector at `s` by `t ^ |s|`. -/ lemma gradeScale_dualRealJetAlgebraBasis (t : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) : @@ -2133,13 +2263,6 @@ lemma JetComponentSpace.repLorentzGroup_basis_dB_singleton (Λ : SL(2,ℂ)) namespace JetAlgebra -/-- The Lorentz action on a jet-algebra generator. -/ -@[simp] -lemma repLorentzGroup_apply_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace) : - repLorentzGroup Λ (SymmetricAlgebra.ι ℝ JetComponentSpace x) = - SymmetricAlgebra.ι ℝ JetComponentSpace - (JetComponentSpace.repLorentzGroup Λ x) := by - simp [repLorentzGroup] set_option maxHeartbeats 1000000 in /-- The zeroth-order field strength transforms as an antisymmetric two-tensor: @@ -2166,31 +2289,6 @@ lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ congr 1 ring -/-- The Lorentz action on the B-boson jet algebra is multiplicative. -/ -lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : JetAlgebra) : - repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := - map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - JetComponentSpace.repLorentzGroup Λ)) x y - -/-- The complexified Lorentz action is multiplicative. -/ -lemma complexRepLorentzGroup_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] JetAlgebra) : - complexRepLorentzGroup Λ (x * y) = - complexRepLorentzGroup Λ x * complexRepLorentzGroup Λ y := by - have happ : ∀ (c : ℂ) (b : JetAlgebra), complexRepLorentzGroup Λ (c ⊗ₜ[ℝ] b) = - c ⊗ₜ[ℝ] repLorentzGroup Λ b := fun c b => rfl - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [add_mul, map_add, ha, hb] - | tmul c b => - induction y using TensorProduct.induction_on with - | zero => simp - | add a' b' ha' hb' => - simp only [mul_add, map_add, ha', hb'] - | tmul c' b' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, happ, - repLorentzGroup_apply_mul] - /-- The transformation of the complexified zeroth-order field strength. -/ lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : @@ -2239,41 +2337,6 @@ lemma massWeightScaleReal_repLorentzGroup (c : ℝ) (Λ : SL(2,ℂ)) (x : JetAlg (JetComponentSpace.massWeightScale_repLorentzGroup c Λ) v) exact DFunLike.congr_fun h x -/-- The Maurer–Cartan pairing of a jet of constant gauge transformations - vanishes. -/ -lemma mcPairing_ofConstant (g : GaugeGroupI) : - mcPairing (JetGaugeGroupI.ofConstant g) = 0 := by - refine JetComponentSpace.basis.ext fun j => ?_ - obtain ⟨s, ν⟩ := j - simp [mcPairing_basis_dB'] - -/-- Jets of constant gauge transformations act trivially on the B-boson jet - algebra: the Maurer–Cartan shift vanishes. -/ -lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by - rw [show repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ - mcPairing (JetGaugeGroupI.ofConstant g))) x from rfl, - mcPairing_ofConstant] - have h2 : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = - AlgHom.id ℝ JetAlgebra := by - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) - simp - rw [h2] - rfl - -/-- Jets of constant gauge transformations act trivially on the complexified - B-boson jet algebra. -/ -lemma complexRepJetGaugeGroupI_ofConstant (g : GaugeGroupI) - (x : ℂ ⊗[ℝ] JetAlgebra) : - complexRepJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, ha, hb] - | tmul z b => rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_ofConstant] - /-- For real scalars the complexified mass-dimension scaling is the base change of the real scaling. -/ lemma massWeightScale_ofReal (r : ℝ) : From ff839460651b2e545a311af2214f69107fa581fd Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 07:03:37 +0100 Subject: [PATCH 098/254] feat: More clean up --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 66 ++++++++++----- .../Particles/QED/JetAlgebra/Invariants.lean | 80 ------------------- Physlib/Particles/QED/JetAlgebra/MassDim.lean | 52 +++++++++++- .../StandardModel/Fermions/LeptonSinglet.lean | 15 ++++ 4 files changed, 110 insertions(+), 103 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 269d70bc1..70bffb0d8 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -87,6 +87,14 @@ lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgeb (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl +/-- The QED gauge action on a pure tensor of the two jet-algebra factors. -/ +lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by + rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] + /-! @@ -279,6 +287,43 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] + +/-- One covariant-derivative step `D̄_μ = ∂_μ - 6 i B_μ` for the conjugate + lepton on the QED jet algebra. -/ +noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ + +/-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the + ordered list of directions `l`, with the head of the list the outermost + derivative. -/ +noncomputable def Dbarψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := + l.foldr (fun μ x => covariantStepBar μ x) [JetGenerators.dbarψ {} α]ₐ + +/-- The zeroth covariant derivative is the conjugate-lepton component function + itself. -/ +@[simp] +lemma Dbarψ_nil (α : Fin 2) : + Dbarψ [] α = [JetGenerators.dbarψ {} α]ₐ := rfl + +@[simp] +lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ (μ :: l) α = covariantStepBar μ (Dbarψ l α) := rfl + +/-- The first conjugate covariant derivative: + `D̄_μ ψ̄_α = ∂_μ ψ̄_α - 6 i B_μ ψ̄_α`. -/ +lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ - ((6 : ℂ) * Complex.I) • + ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by + rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar, LinearMap.sub_apply, + LinearMap.smul_apply, LinearMap.mulLeft_apply] + congr 1 + simp only [ofGenerator] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, zero_add, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] + /-! ## Covariance of the covariant derivatives @@ -681,27 +726,6 @@ model, with the coupling `6 i` replaced by `- 6 i` throughout. -/ -/-- One covariant-derivative step `D̄_μ = ∂_μ - 6 i B_μ` for the conjugate - lepton on the QED jet algebra. -/ -noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ - -/-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the - ordered list of directions `l`, with the head of the list the outermost - derivative. -/ -noncomputable def Dbarψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := - l.foldr (fun μ x => covariantStepBar μ x) [JetGenerators.dbarψ {} α]ₐ - -/-- The zeroth covariant derivative is the conjugate-lepton component function - itself. -/ -@[simp] -lemma Dbarψ_nil (α : Fin 2) : - Dbarψ [] α = [JetGenerators.dbarψ {} α]ₐ := rfl - -@[simp] -lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ (μ :: l) α = covariantStepBar μ (Dbarψ l α) := rfl - /-- The conjugate lepton component functions. -/ abbrev ConjLeptonComponent : Type := SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants.lean b/Physlib/Particles/QED/JetAlgebra/Invariants.lean index d96bab52e..ab3598d3c 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants.lean @@ -597,22 +597,6 @@ lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : rw [TensorProduct.tmul_smul, hconv] rfl -/-- The first conjugate covariant derivative: - `D̄_μ ψ̄_α = ∂_μ ψ̄_α - 6 i B_μ ψ̄_α`. -/ -lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ - - ((6 : ℂ) * Complex.I) • - ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by - rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar, LinearMap.sub_apply, - LinearMap.smul_apply, LinearMap.mulLeft_apply] - congr 1 - simp only [ofGenerator] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, zero_add, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] - /-- Covariance of the zeroth covariant derivatives under the Lorentz group. -/ lemma repLorentzGroup_Dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : repLorentzGroup Λ (Dψ [] α) = ∑ β, star ((Λ⁻¹).1 α β) • Dψ [] β := by @@ -919,13 +903,6 @@ lemma mem_massWeightLESubmodule_of_forall_massWeightScale {x : JetAlgebra} x ∈ MassWeightLESubmodule n := Submodule.subset_span ⟨m, hmn, hx⟩ -/-- Products of homogeneous elements are homogeneous of the summed weight. -/ -lemma massWeightScale_mul_eigen {x y : JetAlgebra} {m n : ℕ} - (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) - (hy : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (c : ℂ) : - massWeightScale c (x * y) = c ^ (m + n) • (x * y) := by - rw [map_mul, hx, hy, smul_mul_smul_comm, ← pow_add] - lemma maxwellTerm_mem_massWeightLESubmodule : maxwellTerm ∈ MassWeightLESubmodule 8 := by rw [maxwellTerm] @@ -1242,63 +1219,6 @@ invariant element are themselves invariant. -/ -/-- The mass-dimension scaling at a real scalar commutes with the Lorentz - action on the QED jet algebra. -/ -lemma massWeightScale_ofReal_repLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) - (x : JetAlgebra) : - massWeightScale (r : ℂ) (repLorentzGroup Λ x) = - repLorentzGroup Λ (massWeightScale (r : ℂ) x) := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul p l => - have hLS : LeptonSinglet.JetAlgebra.massWeightScale (r : ℂ) - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) = - LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (LeptonSinglet.JetAlgebra.massWeightScale (r : ℂ) l) := - DFunLike.congr_fun - (LeptonSinglet.JetAlgebra.massWeightScale_repLorentzGroup (r : ℂ) Λ) l - have h1 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), - massWeightScale (r : ℂ) (p' ⊗ₜ[ℂ] l') = - (BBoson.JetAlgebra.massWeightScale (r : ℂ) p') ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.massWeightScale (r : ℂ) l') := - fun p' l' => rfl - have h2 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), - repLorentzGroup Λ (p' ⊗ₜ[ℂ] l') = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ p') ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l') := fun p' l' => rfl - rw [h2, h1, BBoson.JetAlgebra.massWeightScale_ofReal_complexRepLorentzGroup, - hLS, h1, h2] - -/-- The mass-dimension scaling commutes with the constant gauge action on the - QED jet algebra. -/ -lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) - (x : JetAlgebra) : - massWeightScale c (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (massWeightScale c x) := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul p l => - have hLS : LeptonSinglet.JetAlgebra.massWeightScale c - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI - (JetGaugeGroupI.ofConstant g) l) = - LeptonSinglet.JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (LeptonSinglet.JetAlgebra.massWeightScale c l) := - DFunLike.congr_fun - (LeptonSinglet.JetAlgebra.massWeightScale_repJetGaugeGroupI_ofConstant c g) l - have h1 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), - massWeightScale c (p' ⊗ₜ[ℂ] l') = - (BBoson.JetAlgebra.massWeightScale c p') ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.massWeightScale c l') := fun p' l' => rfl - have h2 : ∀ (p' : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l' : LeptonSinglet.JetAlgebra), - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (p' ⊗ₜ[ℂ] l') = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI - (JetGaugeGroupI.ofConstant g) p') ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI - (JetGaugeGroupI.ofConstant g) l') := fun p' l' => rfl - rw [h2, BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, h1, hLS, h1, h2, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant] /-- Real-scalar variant of the independence of powers. -/ lemma eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero (s : Finset ℕ) diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/MassDim.lean index f987d449b..3f3f90c53 100644 --- a/Physlib/Particles/QED/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/QED/JetAlgebra/MassDim.lean @@ -16,7 +16,7 @@ public import Physlib.Relativity.PauliMatrices.Basic @[expose] public section namespace QED -open TensorProduct StandardModel +open TensorProduct StandardModel Matrix MatrixGroups /-- We define the mass weight of a term as two times its mass dimnesion. -/ def MassWeight : JetGenerators → ℕ @@ -39,6 +39,14 @@ noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra Algebra.TensorProduct.map (BBoson.JetAlgebra.massWeightScale c) (LeptonSinglet.JetAlgebra.massWeightScale c) +/-- The mass-dimension scaling on a pure tensor. -/ +lemma massWeightScale_tmul (c : ℂ) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + massWeightScale c (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.massWeightScale c p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.massWeightScale c l) := + Algebra.TensorProduct.map_tmul _ _ _ _ + /-- Each generator scales by `c` to the power of its mass weight. -/ @[simp] lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : @@ -149,15 +157,55 @@ lemma massWeightScale_fieldStrengthDeriv (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, smul_sub] +/-- Products of homogeneous elements are homogeneous of the summed weight. -/ +lemma massWeightScale_mul_eigen {x y : JetAlgebra} {m n : ℕ} + (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) + (hy : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (c : ℂ) : + massWeightScale c (x * y) = c ^ (m + n) • (x * y) := by + simp only [map_mul, hx, hy] + noncomm_ring [smul_smul] + ring_nf + + +/-- The mass-dimension scaling at a real scalar commutes with the Lorentz + action on the QED jet algebra. -/ +lemma massWeightScale_ofReal_repLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) + (x : JetAlgebra) : + massWeightScale (r : ℂ) (repLorentzGroup Λ x) = + repLorentzGroup Λ (massWeightScale (r : ℂ) x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul p l => + simp only [repLorentzGroup_tmul, massWeightScale_tmul, + BBoson.JetAlgebra.massWeightScale_ofReal_complexRepLorentzGroup, + LeptonSinglet.JetAlgebra.massWeightScale_repLorentzGroup_apply] + + +/-- The mass-dimension scaling commutes with the constant gauge action on the + QED jet algebra. -/ +lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) + (x : JetAlgebra) : + massWeightScale c (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (massWeightScale c x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul p l => + simp only [repJetGaugeGroupI_tmul', massWeightScale_tmul, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, + LeptonSinglet.JetAlgebra.massWeightScale_repJetGaugeGroupI_ofConstant_apply] /-! -##. The mass-weight submodules +## A. The mass-weight submodules -/ noncomputable def MassDimSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := Submodule.span ℂ { x | ∀ c : ℂ, massWeightScale c x = c ^ n • x } +instance : GradedAlgebra (R := ℂ) (A := JetAlgebra) MassDimSubmodule := sorry + noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ m • x} diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index d48636413..b4fc81e7c 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -1323,6 +1323,21 @@ lemma massWeightScale_repLorentzGroup (c : ℂ) (g : SL(2,ℂ)) : have h2 := congrArg AlgHom.toLinearMap h rw [AlgHom.comp_toLinearMap, AlgHom.comp_toLinearMap] at h2 exact h2 + +lemma massWeightScale_repJetGaugeGroupI_ofConstant_apply (c : ℂ) (g : GaugeGroupI) + (x : JetAlgebra) : + massWeightScale c + (JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = + JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (massWeightScale c x) := + DFunLike.congr_fun (massWeightScale_repJetGaugeGroupI_ofConstant c g) x + +lemma massWeightScale_repLorentzGroup_apply (c : ℂ) (g : SL(2,ℂ)) (x : JetAlgebra) : + massWeightScale c (JetAlgebra.repLorentzGroup g x) = + JetAlgebra.repLorentzGroup g (massWeightScale c x) := by + have h := massWeightScale_repLorentzGroup c g + exact DFunLike.congr_fun h x + end JetAlgebra end LeptonSinglet From aacf0526e0bee1c7369971fc5d9400833f602a12 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 11:21:33 +0100 Subject: [PATCH 099/254] feat: More clean up --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 221 +++++------ .../Particles/QED/JetAlgebra/Invariants.lean | 199 ---------- .../QED/JetAlgebra/LorentzGroup.lean | 344 ++++++++++++++++++ Physlib/Particles/QED/JetAlgebra/MassDim.lean | 2 +- .../StandardModel/Fermions/LeptonSinglet.lean | 143 +++++++- .../StandardModel/GaugeBosons/BBoson.lean | 91 ++++- 6 files changed, 652 insertions(+), 348 deletions(-) create mode 100644 Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 70bffb0d8..4a30fcd96 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -66,9 +66,23 @@ noncomputable def ofGenerator (s : JetGenerators) : JetAlgebra := scoped notation "[" s "]ₐ" => ofGenerator s +lemma ofGenerator_dψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + ofGenerator (JetGenerators.dψ s α) = + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dψ s α) := rfl + +lemma ofGenerator_B_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + ofGenerator (JetGenerators.dB s μ) = + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 := rfl + +lemma ofGenerator_dbarψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + ofGenerator (JetGenerators.dbarψ s α) = + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dbarψ s α) := rfl /-! -## B. Representation of the gauge group +## B. Representation of the jet gauge group Gauge transformations act on the QED jet algebra locally via the group `JetGaugeGroupI`. @@ -81,6 +95,20 @@ locally via the group `JetGaugeGroupI`. noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := BBoson.JetAlgebra.complexRepJetGaugeGroupI.tprod LeptonSinglet.JetAlgebra.repJetGaugeGroupI +lemma repJetGaugeGroupI_eq_algHom (g : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI g x = Algebra.TensorProduct.map + (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom g) + (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom g) x := rfl + +lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI g (x * y) = + repJetGaugeGroupI g x * repJetGaugeGroupI g y := by + simp [repJetGaugeGroupI_eq_algHom] + +lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : + repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by + simp [repJetGaugeGroupI_eq_algHom] + lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ₜ[ℂ] l) = @@ -95,85 +123,16 @@ lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetA (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] - -/-! - -### B.1. The action of the Lorentz group - --/ -open Matrix MatrixGroups - -noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetAlgebra := - BBoson.JetAlgebra.complexRepLorentzGroup.tprod LeptonSinglet.JetAlgebra.repLorentzGroup - -/-- The QED Lorentz action on a pure tensor. -/ -lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl - -/-- The Lorentz action on the QED jet algebra agrees with the algebra - homomorphism obtained as the tensor product of the complexified B-boson - action with the exterior-algebra action on the charged-lepton factor. -/ -lemma repLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : JetAlgebra) : - repLorentzGroup Λ x = Algebra.TensorProduct.map - (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) - (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) x := rfl - -/-- The Lorentz action on the QED jet algebra is multiplicative (term-level - form). -/ -lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : - repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by - simp [repLorentzGroup_eq_algHom] - -lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - repLorentzGroup Λ (1 : JetAlgebra) = 1 := by - simp [repLorentzGroup_eq_algHom] - -/-! - -### B.2. The invarance condition - --/ - -def IsInvariant (x : JetAlgebra) : Prop := - (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) - ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) - -lemma IsInvariant.add {x y : JetAlgebra} (hx : IsInvariant x) (hy : IsInvariant y) : - IsInvariant (x + y) := by - constructor - · intro U - simp [hx.left, hy.left] - · intro Λ - simp [hx.right, hy.right] - -lemma IsInvariant.smul {x : JetAlgebra} (hx : IsInvariant x) (r : ℂ) : - IsInvariant (r • x) := by - constructor - · intro U - simp [hx.left] - · intro Λ - simp [hx.right] - -noncomputable def InvariantSubmodule : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x | IsInvariant x} - -lemma InvariantSubmodule.mem_iff_isInvariant (x : JetAlgebra) : - x ∈ InvariantSubmodule ↔ IsInvariant x := by - constructor - · intro hx - induction hx using Submodule.span_induction with - | mem y hy => exact hy - | zero => exact ⟨fun U => map_zero _, fun Λ => map_zero _⟩ - | add y z hy hz ihy ihz => - exact ⟨fun U => by rw [map_add, ihy.1 U, ihz.1 U], - fun Λ => by rw [map_add, ihy.2 Λ, ihz.2 Λ]⟩ - | smul c y hy ihy => - exact ⟨fun U => by rw [map_smul, ihy.1 U], - fun Λ => by rw [map_smul, ihy.2 Λ]⟩ - · exact fun hx => Submodule.subset_span hx +/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge + transformations acts on it through the character of its value at the base + point alone, with no derivative contributions. This is the base case of + `repJetGaugeGroupI_Dψ`. -/ +lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : + repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by + rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, + Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] /-! @@ -231,6 +190,46 @@ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : TensorProduct.add_tmul, TensorProduct.tmul_add, hdist₁, hdist₂] abel +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [map_add, ha, hb] + | tmul p l => + simp [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_comm μ ν, + BBoson.JetAlgebra.jetDeriv_baseChange_comm μ ν p] + abel + +/-- Total derivatives commute, so an iterated derivative may be indexed by a + multiset of directions rather than by a list. -/ +instance : LeftCommutative + (fun (ν : Fin 1 ⊕ Fin 3) (A : JetAlgebra →ₗ[ℂ] JetAlgebra) => + jetDeriv ν ∘ₗ A) where + left_comm ν₁ ν₂ A := by + refine LinearMap.ext fun x => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply] + exact jetDeriv_comm ν₁ ν₂ (A x) + +/-- The iterated total spacetime derivative along a multiset of directions: + `∂_t = ∂_{μ₁} ⋯ ∂_{μ_k}` for `t = {μ₁, …, μ_k}`. The order is immaterial by + `jetDeriv_comm`, so the index is a multiset. -/ +noncomputable def jetDerivM (t : Multiset (Fin 1 ⊕ Fin 3)) : + JetAlgebra →ₗ[ℂ] JetAlgebra := + Multiset.foldr (fun ν A => jetDeriv ν ∘ₗ A) LinearMap.id t + +lemma jetDerivM_zero : jetDerivM 0 = LinearMap.id := by + simp [jetDerivM] + +lemma jetDerivM_cons (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : + jetDerivM (ν ::ₘ t) = jetDeriv ν ∘ₗ jetDerivM t := by + simp [jetDerivM] + +lemma jetDerivM_singleton (μ : Fin 1 ⊕ Fin 3) : jetDerivM {μ} = jetDeriv μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, jetDerivM_cons, + jetDerivM_zero, LinearMap.comp_id] + + /-! ## Covariant derivatives @@ -255,10 +254,6 @@ zeroth-order component function of `ψ` it produces the covariant derivatives. noncomputable def covariantStep (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ -/-- The covariant derivative `D_l ψ_α` of the charged lepton along the ordered - list of directions `l`, with the head of the list the outermost derivative: - the recursion `D_{μ :: l} ψ = (∂_μ + 6 i B_μ) (D_l ψ)` starting from the - zeroth-order component function of `ψ`. -/ noncomputable def Dψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := l.foldr (fun μ x => covariantStep μ x) [JetGenerators.dψ {} α]ₐ @@ -324,6 +319,14 @@ lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] +/-! + +## The covariant subsitution + +-/ + + + /-! ## Covariance of the covariant derivatives @@ -2039,56 +2042,6 @@ theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from Set.mem_union_right _ ⟨(sortList s, α), rfl⟩) -set_option maxHeartbeats 1000000 in -/-- Characterization of the invariants of the QED jet algebra: an element is - invariant under the jet gauge group and the Lorentz group precisely when it - lies in the algebra generated by the field-strength derivatives and the - covariant derivatives, is invariant under the constant gauge transformations, - and is Lorentz invariant. The forward direction is the main theorem above; the - backward direction holds because on the covariant generators a jet of gauge - transformations acts only through its value at the base point. -/ -lemma isInvariant_iff_mem_adjoin_invariantGenerators (x : JetAlgebra) : - IsInvariant x ↔ x ∈ Algebra.adjoin ℂ invariantGenerators ∧ - (∀ g : GaugeGroupI, repJetGaugeGroupI (.ofConstant g) x = x) - ∧ (∀ Λ : SL(2, ℂ), repLorentzGroup Λ x = x) := by - constructor - · intro h - exact ⟨mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq x h.1, - fun g => h.1 _, h.2⟩ - · rintro ⟨hmem, hconst, hlor⟩ - refine ⟨fun U => ?_, hlor⟩ - suffices hkey : repJetGaugeGroupI U x = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) x by - rw [hkey] - exact hconst U.eval - clear hconst hlor - induction hmem using Algebra.adjoin_induction with - | mem z hz => - rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · show repJetGaugeGroupI U (fieldStrengthDeriv p.1 p.2.1 p.2.2) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) - (fieldStrengthDeriv p.1 p.2.1 p.2.2) - rw [repJetGaugeGroupI_fieldStrengthDeriv, repJetGaugeGroupI_fieldStrengthDeriv] - · show repJetGaugeGroupI U (Dψ p.1 p.2) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dψ p.1 p.2) - rw [repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant] - · show repJetGaugeGroupI U (Dbarψ p.1 p.2) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dbarψ p.1 p.2) - rw [repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, - JetGaugeGroupI.eval_ofConstant] - | algebraMap r => - rw [repJetGaugeGroupI_eq_repAlgHom, repJetGaugeGroupI_eq_repAlgHom, - AlgHom.commutes, AlgHom.commutes] - | add u v hu hv ihu ihv => - rw [map_add, map_add, ihu, ihv] - | mul u v hu hv ihu ihv => - have hmul : ∀ V : JetGaugeGroupI, repJetGaugeGroupI V (u * v) = - repJetGaugeGroupI V u * repJetGaugeGroupI V v := fun V => - (repJetGaugeGroupI_eq_repAlgHom V (u * v)).trans - ((map_mul (repAlgHom V) u v).trans - (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom V u).symm - (repJetGaugeGroupI_eq_repAlgHom V v).symm)) - exact (hmul U).trans ((congrArg₂ (· * ·) ihu ihv).trans (hmul _).symm) end JetAlgebra end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants.lean b/Physlib/Particles/QED/JetAlgebra/Invariants.lean index ab3598d3c..d8b44ff90 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants.lean @@ -195,30 +195,6 @@ lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] simp -/-- The transformation law of the embedded field strength: an antisymmetric - two-tensor with both indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) = - ∑ a, ∑ b, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • - fieldStrengthDeriv {} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν)) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] - set_option maxHeartbeats 2000000 in /-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : @@ -497,181 +473,6 @@ lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : /-! -### Lorentz transformation laws of the fermionic generators - --/ - -/-- The Lorentz action on the zeroth-order lepton generator: the spinor index - transforms contragrediently, by the conjugate inverse matrix. -/ -lemma repLorentzGroup_ψ (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dψ {} α]ₐ = - ∑ β, star ((Λ⁻¹).1 α β) • [JetGenerators.dψ {} β]ₐ := by - rw [show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dψ {} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, - TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] - rfl - -/-- The Lorentz action on the first-order lepton generator. -/ -lemma repLorentzGroup_dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dψ {μ} α]ₐ = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 α β)) • [JetGenerators.dψ {ν} β]ₐ := by - rw [show ([JetGenerators.dψ {μ} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dψ {μ} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, - TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] - rfl - -/-- The Lorentz action on the zeroth-order conjugate lepton generator: the - spinor index transforms by the inverse matrix. -/ -lemma repLorentzGroup_barψ (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dbarψ {} α]ₐ = - ∑ β, (Λ⁻¹).1 α β • [JetGenerators.dbarψ {} β]ₐ := by - rw [show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dbarψ {} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, - TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] - rfl - -/-- The Lorentz action on the first-order conjugate lepton generator. -/ -lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dbarψ {μ} α]ₐ = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α β) • [JetGenerators.dbarψ {ν} β]ₐ := by - rw [show ([JetGenerators.dbarψ {μ} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dbarψ {μ} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, - TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] - rfl - -/-- The Lorentz action on the zeroth-order B-boson generator of the QED jet - algebra. -/ -lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ [JetGenerators.dB {} μ]ₐ = - ∑ ν, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) • - [JetGenerators.dB {} ν]ₐ := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] - rfl - rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) - ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, - repLorentzGroup_tmul, - show BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) from rfl, - BBoson.JetAlgebra.repLorentzGroup_ofGenerator_dB_nil, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one, TensorProduct.tmul_sum, - TensorProduct.sum_tmul] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_smul, hconv] - rfl - -/-- Covariance of the zeroth covariant derivatives under the Lorentz group. -/ -lemma repLorentzGroup_Dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (Dψ [] α) = ∑ β, star ((Λ⁻¹).1 α β) • Dψ [] β := by - rw [Dψ_nil, repLorentzGroup_ψ] - simp only [Dψ_nil] - -lemma repLorentzGroup_Dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α) = ∑ β, (Λ⁻¹).1 α β • Dbarψ [] β := by - rw [Dbarψ_nil, repLorentzGroup_barψ] - simp only [Dbarψ_nil] - -set_option maxHeartbeats 2000000 in -/-- Covariance of the first covariant derivative under the Lorentz group: the - gauge-field term transforms exactly as the derivative term. -/ -lemma repLorentzGroup_Dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ (Dψ [μ] α) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 α β)) • Dψ [ν] β := by - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [Dψ_singleton, map_add, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, - repLorentzGroup_ψ, repLorentzGroup_dψ_singleton] - conv_rhs => enter [2, ν, 2, β]; rw [Dψ_singleton, smul_add] - conv_rhs => enter [2, ν]; rw [Finset.sum_add_distrib] - rw [Finset.sum_add_distrib] - congr 1 - simp only [hsm, hms, hsmul, Finset.smul_sum] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ - rw [smul_smul, smul_smul] - congr 1 - ring - -set_option maxHeartbeats 2000000 in -/-- Covariance of the first conjugate covariant derivative under the Lorentz - group. -/ -lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ (Dbarψ [μ] α) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α β) • Dbarψ [ν] β := by - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [Dbarψ_singleton, map_sub, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, - repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton] - conv_rhs => enter [2, ν, 2, β]; rw [Dbarψ_singleton, smul_sub] - conv_rhs => enter [2, ν]; rw [Finset.sum_sub_distrib] - rw [Finset.sum_sub_distrib] - congr 1 - simp only [hsm, hms, hsmul, Finset.smul_sum] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ - rw [smul_smul, smul_smul] - congr 1 - ring - -/-! - ### The kinetic contraction identity and Lorentz invariance -/ diff --git a/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean b/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean new file mode 100644 index 000000000..b345580b7 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean @@ -0,0 +1,344 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Basic +public import Physlib.Relativity.MinkowskiMatrix +public import Physlib.Relativity.PauliMatrices.Basic +/-! +# THe Lorentz group action on the QED jet algebra +-/ + +@[expose] public section + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +### B.1. The action of the Lorentz group + +-/ +open Matrix MatrixGroups + +noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetAlgebra := + BBoson.JetAlgebra.complexRepLorentzGroup.tprod LeptonSinglet.JetAlgebra.repLorentzGroup + +/-- The QED Lorentz action on a pure tensor. -/ +lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl + +/-- The Lorentz action on the QED jet algebra agrees with the algebra + homomorphism obtained as the tensor product of the complexified B-boson + action with the exterior-algebra action on the charged-lepton factor. -/ +lemma repLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : JetAlgebra) : + repLorentzGroup Λ x = Algebra.TensorProduct.map + (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) + (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) x := rfl + +/-- The Lorentz action on the QED jet algebra is multiplicative (term-level + form). -/ +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : + repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by + simp [repLorentzGroup_eq_algHom] + +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ (1 : JetAlgebra) = 1 := by + simp [repLorentzGroup_eq_algHom] + +/-- The Lorentz action on the zeroth-order lepton generator: the spinor index + transforms contragrediently, by the conjugate inverse matrix. -/ +lemma repLorentzGroup_ψ (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dψ {} α]ₐ = + ∑ β, star ((Λ⁻¹).1 α β) • [JetGenerators.dψ {} β]ₐ := by + rw [show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dψ {} α) from rfl, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the first-order lepton generator. -/ +lemma repLorentzGroup_dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dψ {μ} α]ₐ = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • [JetGenerators.dψ {ν} β]ₐ := by + rw [show ([JetGenerators.dψ {μ} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dψ {μ} α) from rfl, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the zeroth-order conjugate lepton generator: the + spinor index transforms by the inverse matrix. -/ +lemma repLorentzGroup_barψ (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dbarψ {} α]ₐ = + ∑ β, (Λ⁻¹).1 α β • [JetGenerators.dbarψ {} β]ₐ := by + rw [show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dbarψ {} α) from rfl, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the first-order conjugate lepton generator. -/ +lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ [JetGenerators.dbarψ {μ} α]ₐ = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • [JetGenerators.dbarψ {ν} β]ₐ := by + rw [show ([JetGenerators.dbarψ {μ} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dbarψ {μ} α) from rfl, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [TensorProduct.tmul_smul] + rfl + +/-- The Lorentz action on the zeroth-order B-boson generator of the QED jet + algebra. -/ +lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ [JetGenerators.dB {} μ]ₐ = + ∑ ν, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) • + [JetGenerators.dB {} ν]ₐ := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) + ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, + repLorentzGroup_tmul, + show BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) from rfl, + BBoson.JetAlgebra.repLorentzGroup_ofGenerator_dB_nil, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one, TensorProduct.tmul_sum, + TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_smul, hconv] + rfl + + +/-- The transformation law of the embedded field strength: an antisymmetric + two-tensor with both indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) = + ∑ a, ∑ b, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • + fieldStrengthDeriv {} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + +/-- Covariance of the zeroth covariant derivatives under the Lorentz group. -/ +lemma repLorentzGroup_Dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (Dψ [] α) = ∑ β, star ((Λ⁻¹).1 α β) • Dψ [] β := by + rw [Dψ_nil, repLorentzGroup_ψ] + simp only [Dψ_nil] + +lemma repLorentzGroup_Dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α) = ∑ β, (Λ⁻¹).1 α β • Dbarψ [] β := by + rw [Dbarψ_nil, repLorentzGroup_barψ] + simp only [Dbarψ_nil] + +set_option maxHeartbeats 2000000 in +/-- Covariance of the first covariant derivative under the Lorentz group: the + gauge-field term transforms exactly as the derivative term. -/ +lemma repLorentzGroup_Dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ (Dψ [μ] α) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • Dψ [ν] β := by + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [Dψ_singleton, map_add, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, + repLorentzGroup_ψ, repLorentzGroup_dψ_singleton] + conv_rhs => enter [2, ν, 2, β]; rw [Dψ_singleton, smul_add] + conv_rhs => enter [2, ν]; rw [Finset.sum_add_distrib] + rw [Finset.sum_add_distrib] + congr 1 + simp only [hsm, hms, hsmul, Finset.smul_sum] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [smul_smul, smul_smul] + congr 1 + ring + +set_option maxHeartbeats 2000000 in +/-- Covariance of the first conjugate covariant derivative under the Lorentz + group. -/ +lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2) : + repLorentzGroup Λ (Dbarψ [μ] α) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • Dbarψ [ν] β := by + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [Dbarψ_singleton, map_sub, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, + repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton] + conv_rhs => enter [2, ν, 2, β]; rw [Dbarψ_singleton, smul_sub] + conv_rhs => enter [2, ν]; rw [Finset.sum_sub_distrib] + rw [Finset.sum_sub_distrib] + congr 1 + simp only [hsm, hms, hsmul, Finset.smul_sum] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [smul_smul, smul_smul] + congr 1 + ring +/-! + +### B.2. The invarance condition + +-/ + +def IsInvariant (x : JetAlgebra) : Prop := + (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) + ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) + +lemma IsInvariant.add {x y : JetAlgebra} (hx : IsInvariant x) (hy : IsInvariant y) : + IsInvariant (x + y) := by + constructor + · intro U + simp [hx.left, hy.left] + · intro Λ + simp [hx.right, hy.right] + +lemma IsInvariant.smul {x : JetAlgebra} (hx : IsInvariant x) (r : ℂ) : + IsInvariant (r • x) := by + constructor + · intro U + simp [hx.left] + · intro Λ + simp [hx.right] + +noncomputable def InvariantSubmodule : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x | IsInvariant x} + +lemma InvariantSubmodule.mem_iff_isInvariant (x : JetAlgebra) : + x ∈ InvariantSubmodule ↔ IsInvariant x := by + constructor + · intro hx + induction hx using Submodule.span_induction with + | mem y hy => exact hy + | zero => exact ⟨fun U => map_zero _, fun Λ => map_zero _⟩ + | add y z hy hz ihy ihz => + exact ⟨fun U => by rw [map_add, ihy.1 U, ihz.1 U], + fun Λ => by rw [map_add, ihy.2 Λ, ihz.2 Λ]⟩ + | smul c y hy ihy => + exact ⟨fun U => by rw [map_smul, ihy.1 U], + fun Λ => by rw [map_smul, ihy.2 Λ]⟩ + · exact fun hx => Submodule.subset_span hx + + +/-- Characterization of the invariants of the QED jet algebra: an element is + invariant under the jet gauge group and the Lorentz group precisely when it + lies in the algebra generated by the field-strength derivatives and the + covariant derivatives, is invariant under the constant gauge transformations, + and is Lorentz invariant. The forward direction is the main theorem above; the + backward direction holds because on the covariant generators a jet of gauge + transformations acts only through its value at the base point. -/ +lemma isInvariant_iff_mem_adjoin_invariantGenerators (x : JetAlgebra) : + IsInvariant x ↔ x ∈ Algebra.adjoin ℂ invariantGenerators ∧ + (∀ g : GaugeGroupI, repJetGaugeGroupI (.ofConstant g) x = x) + ∧ (∀ Λ : SL(2, ℂ), repLorentzGroup Λ x = x) := by + constructor + · intro h + exact ⟨mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq x h.1, + fun g => h.1 _, h.2⟩ + · rintro ⟨hmem, hconst, hlor⟩ + refine ⟨fun U => ?_, hlor⟩ + suffices hkey : repJetGaugeGroupI U x = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) x by + rw [hkey] + exact hconst U.eval + clear hconst hlor + induction hmem using Algebra.adjoin_induction with + | mem z hz => + rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · show repJetGaugeGroupI U (fieldStrengthDeriv p.1 p.2.1 p.2.2) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) + (fieldStrengthDeriv p.1 p.2.1 p.2.2) + rw [repJetGaugeGroupI_fieldStrengthDeriv, repJetGaugeGroupI_fieldStrengthDeriv] + · show repJetGaugeGroupI U (Dψ p.1 p.2) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dψ p.1 p.2) + rw [repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant] + · show repJetGaugeGroupI U (Dbarψ p.1 p.2) = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dbarψ p.1 p.2) + rw [repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, + JetGaugeGroupI.eval_ofConstant] + | algebraMap r => + simp only [repJetGaugeGroupI_eq_algHom, AlgHom.commutes] + | add u v hu hv ihu ihv => + exact (map_add (repJetGaugeGroupI U) u v).trans + ((congrArg₂ (· + ·) ihu ihv).trans + (map_add (repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval)) u v).symm) + | mul u v hu hv ihu ihv => + exact (repJetGaugeGroupI_apply_mul U u v).trans + ((congrArg₂ (· * ·) ihu ihv).trans + (repJetGaugeGroupI_apply_mul (JetGaugeGroupI.ofConstant U.eval) u v).symm) + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/MassDim.lean index 3f3f90c53..cdd558ad7 100644 --- a/Physlib/Particles/QED/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/QED/JetAlgebra/MassDim.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Basic +public import Physlib.Particles.QED.JetAlgebra.LorentzGroup public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic /-! diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index b4fc81e7c..ac1ffbcc4 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -497,14 +497,24 @@ lemma JetComponentSpace.repLorentzGroup_basis_dbarψ_singleton (Λ : SL(2,ℂ)) refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ rw [mul_comm] +/-! + + +### The action of the jet gauge group + +Under the action of the gauge group +`∂_s ψ` transforms as +`∑ (x + y = s), ∂_x (star u ^ 6) ∂_y ψ`, and similarly for the conjugate. + + +-/ /-- The action of the jet gauge group on the dual jet algebra of the charged-lepton singlet's component functions. Component functions transform contragrediently to the field, so the hypercharge power series is `u ^ 6 = (star u ^ 6)⁻¹`, acting through the Leibniz rule on the dual derivative symbols. -/ noncomputable def dualJetAlgebraRepJetGaugeGroupI : - Representation ℂ JetGaugeGroupI - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where + Representation ℂ JetGaugeGroupI DerivAlgebraComplex where toFun U := DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) map_one' := by rw [show (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = @@ -633,6 +643,77 @@ lemma JetComponentSpace.repJetGaugeGroupI_inr' (U : JetGaugeGroupI) rw [JetComponentSpace.repJetGaugeGroupI_inr, TensorProduct.map_tmul] rfl +open MvPowerSeries in +/-- The gauge action on a lepton jet coordinate is the Leibniz expansion of + `∂_t (u⁶ ψ)`: a sum over the splittings `t = x + y` of the `x`-th Taylor + coefficient of the hypercharge character `u⁶` against the `y`-th coordinate. + The weight `∏ descFactorial` together with `coeff x χ = (∂_x χ)(0) / x!` + makes up the multi-index binomial coefficient `(t choose x)`. -/ +lemma JetComponentSpace.repJetGaugeGroupI_basis_dψ (U : JetGaugeGroupI) + (t : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U (basis (.dψ t α)) = + ∑ p ∈ Finset.antidiagonal t.toFinsupp, + ((∏ μ, (t.toFinsupp μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + basis (.dψ (Multiset.toFinsupp.symm p.2) α) := by + have hb : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, + JetComponentSpace.basis (.dψ (Multiset.toFinsupp.symm p) α) = + ((Lorentz.complexCoBasis.dualBasis.symmetricAlgebra p ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α), 0) := by + intro p + rw [JetComponentSpace.basis_dψ, DerivAlgebraComplex.basis_apply, + AddEquiv.apply_symm_apply] + rw [JetComponentSpace.basis_dψ, JetComponentSpace.repJetGaugeGroupI_inl, + DerivAlgebraComplex.basis_apply, DerivAlgebraComplex.jetRingAction_basis, + TensorProduct.sum_tmul, + show ∀ v : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet, + ((v, 0) : JetComponentSpace) = LinearMap.inl ℂ _ _ v from fun _ => rfl, + map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [hb p.2, ← TensorProduct.smul_tmul', ← TensorProduct.smul_tmul', + map_smul, map_smul] + rfl + +open MvPowerSeries in +/-- The gauge action on the first-order lepton coordinate: the character at the + base point acts on the coordinate itself, and its first Taylor coefficient + feeds into the zeroth-order coordinate. This is the `t = {μ}` case of + `repJetGaugeGroupI_basis_dψ`. -/ +lemma JetComponentSpace.repJetGaugeGroupI_basis_dψ_singleton (U : JetGaugeGroupI) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repJetGaugeGroupI U (basis (.dψ {μ} α)) = + constantCoeff (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + basis (.dψ {μ} α) + + coeff (Finsupp.single μ 1) (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + basis (.dψ {} α) := by + classical + have hm : ({μ} : Multiset (Fin 1 ⊕ Fin 3)).toFinsupp = Finsupp.single μ 1 := by + simp + rw [JetComponentSpace.repJetGaugeGroupI_basis_dψ, hm, Finsupp.antidiagonal_single, + show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} from by decide, + Finset.map_insert, Finset.map_singleton, + Finset.sum_insert (by simp [Finsupp.single_eq_zero]), Finset.sum_singleton] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, + Prod.map_apply, Finsupp.single_zero, coeff_zero_eq_constantCoeff, + Nat.descFactorial_zero, Finset.prod_const_one, Nat.cast_one, one_smul, + Nat.descFactorial_self] + have hw1 : (∏ x, ((Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x).descFactorial + ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x) : ℕ) = 1 := by simp + have hw2 : (∏ x, ((Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x).factorial : ℕ) + = 1 := by + refine Finset.prod_eq_one fun x _ => ?_ + rcases eq_or_ne μ x with rfl | h + · simp + · simp only [Finsupp.single_apply, if_neg h, Nat.factorial_zero] + have htf1 : Multiset.toFinsupp.symm (Finsupp.single μ 1) = + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [← hm, AddEquiv.symm_apply_apply] + have htf0 : Multiset.toFinsupp.symm (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = + (0 : Multiset (Fin 1 ⊕ Fin 3)) := map_zero _ + rw [hw1, hw2, htf1, htf0] + simp + /-! ## The formal total derivative on the component functions @@ -682,6 +763,17 @@ lemma JetComponentSpace.jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators JetComponentSpace.basis (JetGenerators.shift μ j) := by rw [JetComponentSpace.jetDeriv, Module.Basis.constr_basis] +lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + JetComponentSpace.jetDeriv μ (JetComponentSpace.jetDeriv ν v) = + JetComponentSpace.jetDeriv ν (JetComponentSpace.jetDeriv μ v) := by + have h : JetComponentSpace.jetDeriv μ ∘ₗ JetComponentSpace.jetDeriv ν = + JetComponentSpace.jetDeriv ν ∘ₗ JetComponentSpace.jetDeriv μ := by + refine JetComponentSpace.basis.ext fun j => ?_ + simp [LinearMap.coe_comp, Function.comp_apply, JetComponentSpace.jetDeriv_basis, + JetGenerators.shift, ] + grind + exact DFunLike.congr_fun h v + /-- The mass-dimension scaling on the space of component functions of the charged-lepton singlet: the diagonal map multiplying each component function `∂_s ψ_α` by `c ^ w`, where `w` is twice its mass dimension. -/ @@ -966,6 +1058,15 @@ lemma repJetGaugeGroupI_apply (g : JetGaugeGroupI) (x : JetAlgebra) : repJetGaugeGroupI g x = ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g) x := rfl +lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : + repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by + simp [repJetGaugeGroupI_apply] + +lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI g (x * y) = + repJetGaugeGroupI g x * repJetGaugeGroupI g y := by + simp [repJetGaugeGroupI_apply] + /-- The value of the jet of gauge transformations at the base point acts by the contragredient hypercharge scalar on the zeroth-order singlet generator, with no derivative contributions. -/ @@ -1050,6 +1151,15 @@ lemma repJetGaugeGroupI_ofGenerator_ψ (g : JetGaugeGroupI) DerivAlgebraComplex.jetRingAction_basis] simp only [hinl, TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] +noncomputable def repJetGaugeGroupIAlgHom (g : JetGaugeGroupI) : + AlgHom ℂ JetAlgebra JetAlgebra where + toFun := repJetGaugeGroupI g + map_one' := repJetGaugeGroupI_apply_one g + map_mul' := repJetGaugeGroupI_apply_mul g + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + commutes' := fun r => by simp [repJetGaugeGroupI_apply] + /-! ### A.3. The action of the Lorentz group @@ -1244,6 +1354,35 @@ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : rw [jetDerivHom_fst, jetDerivHom_fst] at h exact h.trans (add_comm _ _) +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + simp [Algebra.algebraMap_eq_smul_one] + | ι v => + simp [JetComponentSpace.jetDeriv_comm] + | mul x y hx hy => + simp only [jetDeriv_mul, map_add, hx, hy] + abel + | add x y hx hy => + simp only [map_add, hx, hy] + +/-! + +## + +Let ∂_s be the derivative with respect to the multi-index s. +On the action of the gauge group `∂_s (g • ψ) ≠ g • ∂_s ψ`. +The RHS of this properly takes account of derivatives of the gauge transformation, +while the LHS does not. + +What we want to show is that +`g • ∂_s ψ = ∑_{p + q = s} q ^ {|p|} • (∂_p g) • ∂_q ψ`. +where `q` is the charge of the field. + +-/ + + /-! ### A.5. The mass-weight scaling on the jet algebra diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index f98cc5ec5..00f4b9bcd 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -338,6 +338,14 @@ def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators lemma shift_dB (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : shift μ (dB s ν) = dB (s + {μ}) ν := rfl +/-- Appending derivative indices commutes: the indices form a multiset. -/ +lemma shift_comm (μ ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : + shift μ (shift ν g) = shift ν (shift μ g) := by + cases g with + | dB s ρ => + show dB (s + {ν} + {μ}) ρ = dB (s + {μ} + {ν}) ρ + rw [add_right_comm] + /-- Appending a derivative index raises the mass weight by two: a derivative has mass dimension one. -/ @[simp] @@ -994,6 +1002,18 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : rw [h2] rfl +noncomputable def repJetGaugeGroupIAlgHom (U : JetGaugeGroupI) : + AlgHom ℝ JetAlgebra JetAlgebra where + toFun := repJetGaugeGroupI U + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repJetGaugeGroupI_one U + map_mul' := repJetGaugeGroupI_mul U + commutes' r := by simp [repJetGaugeGroupI_algebraMap] + +lemma repJetGaugeGroupIAlgHom_apply (U : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupIAlgHom U x = repJetGaugeGroupI U x := rfl + /-! ## A.2 The complexified version @@ -1013,6 +1033,15 @@ noncomputable def complexRepJetGaugeGroupI : ext x simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] +lemma complexRepJetGaugeGroupI_eq_algHom (U : JetGaugeGroupI) + (x : ℂ ⊗[ℝ] JetAlgebra) : + complexRepJetGaugeGroupI U x = + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (repJetGaugeGroupIAlgHom U) x := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb] + | tmul c b => rfl + lemma complexRepJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : JetAlgebra) : complexRepJetGaugeGroupI U (c ⊗ₜ[ℝ] b) = c ⊗ₜ[ℝ] repJetGaugeGroupI U b := rfl @@ -1020,18 +1049,16 @@ lemma complexRepJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : JetAlgeb lemma complexRepJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : ℂ ⊗[ℝ] JetAlgebra) : complexRepJetGaugeGroupI U (x * y) = complexRepJetGaugeGroupI U x * complexRepJetGaugeGroupI U y := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [add_mul, map_add, ha, hb] - | tmul c b => - induction y using TensorProduct.induction_on with - | zero => simp - | add a' b' ha' hb' => - simp only [mul_add, map_add, ha', hb'] - | tmul c' b' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, complexRepJetGaugeGroupI_tmul, - repJetGaugeGroupI_mul] + simp [complexRepJetGaugeGroupI_eq_algHom] + +lemma complexRepJetGaugeGroupI_one (U : JetGaugeGroupI) : + complexRepJetGaugeGroupI U (1 : ℂ ⊗[ℝ] JetAlgebra) = 1 := by + simp [complexRepJetGaugeGroupI_eq_algHom] + +lemma complexRepJetGaugeGroupI_one_tmul_one (U : JetGaugeGroupI) : + complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra) := by + rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_one] /-- The complexified gauge action on a jet-algebra generator: the Maurer–Cartan shift of the component function. -/ @@ -1056,6 +1083,15 @@ lemma complexRepJetGaugeGroupI_ofConstant (g : GaugeGroupI) | add a b ha hb => rw [map_add, ha, hb] | tmul z b => rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_ofConstant] +noncomputable def complexRepJetGaugeGroupIAlgHom (U : JetGaugeGroupI) : + AlgHom ℂ (ℂ ⊗[ℝ] JetAlgebra) (ℂ ⊗[ℝ] JetAlgebra) where + toFun := complexRepJetGaugeGroupI U + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := complexRepJetGaugeGroupI_one U + map_mul' := complexRepJetGaugeGroupI_mul U + commutes' r := by simp [complexRepJetGaugeGroupI_eq_algHom] + /-! ## The formal total derivative on the jet algebra @@ -1099,6 +1135,27 @@ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : smul_eq_mul, map_add, AlgEquiv.symm_apply_apply] ring +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => simp [Algebra.algebraMap_eq_smul_one] + | ι v => + have key : (jetDeriv μ) ∘ₗ (jetDeriv ν) ∘ₗ + (SymmetricAlgebra.ι ℝ JetComponentSpace) = + (jetDeriv ν) ∘ₗ (jetDeriv μ) ∘ₗ + (SymmetricAlgebra.ι ℝ JetComponentSpace) := by + refine JetComponentSpace.basis.ext fun g => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, + show ∀ h : JetGenerators, + SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis h) = + ofGenerator h from fun _ => rfl, + jetDeriv_ofGenerator, JetGenerators.shift_comm] + exact DFunLike.congr_fun key v + | mul a b ha hb => + simp only [jetDeriv_mul, map_add, ha, hb] + abel + | add a b ha hb => simp only [map_add, ha, hb] + /-- The Leibniz rule for the complexified total derivative on the complexified jet algebra. -/ lemma jetDeriv_baseChange_mul (μ : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] JetAlgebra) : @@ -1120,6 +1177,16 @@ lemma jetDeriv_baseChange_mul (μ : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] JetAlge simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, jetDeriv_mul, TensorProduct.tmul_add] +lemma jetDeriv_baseChange_comm (μ ν : Fin 1 ⊕ Fin 3) (x : ℂ ⊗[ℝ] JetAlgebra) : + LinearMap.baseChange ℂ (jetDeriv μ) (LinearMap.baseChange ℂ (jetDeriv ν) x) = + LinearMap.baseChange ℂ (jetDeriv ν) (LinearMap.baseChange ℂ (jetDeriv μ) x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [map_add, ha, hb] + | tmul c b => + simp only [LinearMap.baseChange_tmul, jetDeriv_comm] + /-- The complexified total derivative on a jet-algebra generator. -/ lemma jetDeriv_baseChange_ofGenerator (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : LinearMap.baseChange ℂ (jetDeriv ν) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = From 2bec746dad91f8e49b9bc136790d4738346306db Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 11:50:40 +0100 Subject: [PATCH 100/254] bit of clean up --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 559 +++++++++++--------- 1 file changed, 301 insertions(+), 258 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 4a30fcd96..60c722f65 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -80,60 +80,25 @@ lemma ofGenerator_dbarψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : ofGenerator (JetGenerators.dbarψ s α) = (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) := rfl -/-! -## B. Representation of the jet gauge group +/-! -Gauge transformations act on the QED jet algebra -locally via the group `JetGaugeGroupI`. +## A. The field strengths -/ -/-- The representation of the jet gauge group on the QED jet algebra: the - Maurer–Cartan substitution action on the (complexified) B-boson factor tensored - with the hypercharge action on the charged-lepton factor. -/ -noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := - BBoson.JetAlgebra.complexRepJetGaugeGroupI.tprod LeptonSinglet.JetAlgebra.repJetGaugeGroupI - -lemma repJetGaugeGroupI_eq_algHom (g : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI g x = Algebra.TensorProduct.map - (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom g) - (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom g) x := rfl - -lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : - repJetGaugeGroupI g (x * y) = - repJetGaugeGroupI g x * repJetGaugeGroupI g y := by - simp [repJetGaugeGroupI_eq_algHom] -lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : - repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by - simp [repJetGaugeGroupI_eq_algHom] - -lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ₜ[ℂ] l) = - (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl +/-- The derivatives of the B-boson field strength, embedded in the QED jet + algebra. -/ +noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ₜ[ℂ] 1 -/-- The QED gauge action on a pure tensor of the two jet-algebra factors. -/ -lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by - rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] +/-! -/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge - transformations acts on it through the character of its value at the base - point alone, with no derivative contributions. This is the base case of - `repJetGaugeGroupI_Dψ`. -/ -lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : - repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by - rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, - Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] +## A. The covariant derivatives +-/ /-! ## Jet derivatives @@ -321,10 +286,300 @@ lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : /-! -## The covariant subsitution +### The covariant substitution + +The change of variables from the plain fermionic coordinates `∂_s ψ_α`, +`∂_s ψ̄_α` to the covariant coordinates `D_s ψ_α`, `D̄_s ψ̄_α`, as an algebra +endomorphism of the QED jet algebra fixing the B-boson factor. + +-/ + +/-- A canonical list presentation of a multiset of spacetime indices. -/ +noncomputable def sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : List (Fin 1 ⊕ Fin 3) := + ((s.map finSumFinEquiv).sort (· ≤ ·)).map finSumFinEquiv.symm + +@[simp] +lemma coe_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : + (↑(sortList s) : Multiset (Fin 1 ⊕ Fin 3)) = s := by + rw [sortList, ← Multiset.map_coe, Multiset.sort_eq, Multiset.map_map] + simp + +@[simp] +lemma length_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : + (sortList s).length = Multiset.card s := by + rw [sortList, List.length_map, Multiset.length_sort, Multiset.card_map] + +/-- The derivative degree of a lepton jet generator. -/ +def genDeg : LeptonSinglet.JetGenerators → ℕ + | .dψ s _ => Multiset.card s + | .dbarψ s _ => Multiset.card s + +/-- The covariant element associated with a lepton jet generator: the covariant + derivative along a canonical ordering of the multiset of derivative indices. -/ +noncomputable def covGenerator : LeptonSinglet.JetGenerators → JetAlgebra + | .dψ s α => Dψ (sortList s) α + | .dbarψ s α => Dbarψ (sortList s) α + +/-- The linear map sending each fermionic component function to its covariant + version. -/ +noncomputable def covMap : LeptonSinglet.JetComponentSpace →ₗ[ℂ] JetAlgebra := + LeptonSinglet.JetComponentSpace.basis.constr ℂ covGenerator + +@[simp] +lemma covMap_basis (g : LeptonSinglet.JetGenerators) : + covMap (LeptonSinglet.JetComponentSpace.basis g) = covGenerator g := by + rw [covMap, Module.Basis.constr_basis] + + +/-- The inclusion of B-coefficiented degree-one fermionic elements into the QED + jet algebra. -/ +noncomputable def oddIncl : ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetComponentSpace) →ₗ[ℂ] JetAlgebra := + TensorProduct.map LinearMap.id (ExteriorAlgebra.ι ℂ) + +lemma oddIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace) : + oddIncl (p ⊗ₜ[ℂ] m) = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m := by + simp [oddIncl] + +set_option maxHeartbeats 1000000 in +/-- Odd elements anticommute. -/ +lemma oddIncl_mul_add_swap (w w' : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetComponentSpace) : + oddIncl w * oddIncl w' + oddIncl w' * oddIncl w = 0 := by + have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind + have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + induction w using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, add_zero] + | add u v hu hv => + simp only [map_add, hd₁, hd₂] + calc oddIncl u * oddIncl w' + oddIncl v * oddIncl w' + + (oddIncl w' * oddIncl u + oddIncl w' * oddIncl v) = + (oddIncl u * oddIncl w' + oddIncl w' * oddIncl u) + + (oddIncl v * oddIncl w' + oddIncl w' * oddIncl v) := by abel + _ = 0 := by rw [hu, hv, add_zero] + | tmul p m => + induction w' using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, add_zero] + | add u v hu hv => + simp only [map_add, hd₁, hd₂] + calc oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + + (oddIncl u * oddIncl (p ⊗ₜ[ℂ] m) + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) = + (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl u * oddIncl (p ⊗ₜ[ℂ] m)) + + (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) := by + abel + _ = 0 := by rw [hu, hv, add_zero] + | tmul q n => + rw [oddIncl_tmul, oddIncl_tmul, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, mul_comm q p, ← TensorProduct.tmul_add, + ExteriorAlgebra.ι_add_mul_swap, TensorProduct.tmul_zero] + +/-- Odd elements square to zero. -/ +lemma oddIncl_mul_self (w : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetComponentSpace) : + oddIncl w * oddIncl w = 0 := by + have h := oddIncl_mul_add_swap w w + have h2 : (2 : ℂ) • (oddIncl w * oddIncl w) = 0 := by + rw [two_smul] + exact h + exact (smul_eq_zero.mp h2).resolve_left (by norm_num) + +lemma covGenerator_mem_range_oddIncl (g : LeptonSinglet.JetGenerators) : + covGenerator g ∈ LinearMap.range oddIncl := by + have hdadd : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hderiv : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), + x ∈ LinearMap.range oddIncl → jetDeriv μ x ∈ LinearMap.range oddIncl := by + rintro μ x ⟨w, rfl⟩ + induction w using TensorProduct.induction_on with + | zero => simp + | add u v hu hv => + rw [map_add, map_add] + exact Submodule.add_mem _ hu hv + | tmul p m => + rw [oddIncl_tmul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] + exact Submodule.add_mem _ ⟨_, oddIncl_tmul _ _⟩ ⟨_, oddIncl_tmul _ _⟩ + have hmulB : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), + x ∈ LinearMap.range oddIncl → + [JetGenerators.dB {} μ]ₐ * x ∈ LinearMap.range oddIncl := by + rintro μ x ⟨w, rfl⟩ + refine ⟨TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) + LinearMap.id w, ?_⟩ + have key : oddIncl ∘ₗ TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) + LinearMap.id = + (LinearMap.mulLeft ℂ ([JetGenerators.dB {} μ]ₐ : JetAlgebra)) ∘ₗ oddIncl := by + refine TensorProduct.ext' fun p m => ?_ + simp only [LinearMap.comp_apply, TensorProduct.map_tmul, oddIncl_tmul, + LinearMap.mulLeft_apply, LinearMap.id_apply, + show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + exact LinearMap.congr_fun key w + have hstep : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), covariantStep μ x = + jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := + fun _ _ => rfl + have hstepBar : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), covariantStepBar μ x = + jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := + fun _ _ => rfl + have hDψ : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), + Dψ l α ∈ LinearMap.range oddIncl := by + intro l α + induction l with + | nil => + exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + LeptonSinglet.JetComponentSpace.basis (.dψ {} α), by + rw [oddIncl_tmul]; rfl⟩ + | cons ν l ih => + rw [Dψ_cons, hstep] + exact Submodule.add_mem _ (hderiv ν _ ih) + (Submodule.smul_mem _ _ (hmulB ν _ ih)) + have hDbarψ : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), + Dbarψ l α ∈ LinearMap.range oddIncl := by + intro l α + induction l with + | nil => + exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α), by + rw [oddIncl_tmul]; rfl⟩ + | cons ν l ih => + rw [Dbarψ_cons, hstepBar] + exact Submodule.sub_mem _ (hderiv ν _ ih) + (Submodule.smul_mem _ _ (hmulB ν _ ih)) + cases g with + | dψ s α => exact hDψ (sortList s) α + | dbarψ s α => exact hDbarψ (sortList s) α + +lemma covMap_mem_range_oddIncl (m : LeptonSinglet.JetComponentSpace) : + covMap m ∈ LinearMap.range oddIncl := by + rw [covMap, Module.Basis.constr_apply] + exact Submodule.sum_mem _ fun g _ => + Submodule.smul_mem _ _ (covGenerator_mem_range_oddIncl g) + +lemma covMap_mul_self (m : LeptonSinglet.JetComponentSpace) : + covMap m * covMap m = 0 := by + obtain ⟨w, hw⟩ := covMap_mem_range_oddIncl m + rw [← hw] + exact oddIncl_mul_self w + +/-- The covariant substitution on the fermionic factor. -/ +noncomputable def covExtHom : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := + ExteriorAlgebra.lift ℂ ⟨covMap, covMap_mul_self⟩ + +@[simp] +lemma covExtHom_ι (m : LeptonSinglet.JetComponentSpace) : + covExtHom (ExteriorAlgebra.ι ℂ m) = covMap m := by + rw [covExtHom, ExteriorAlgebra.lift_ι_apply] + +/-- Elements of the B-boson factor are central in the QED jet algebra. -/ +lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : + (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * y = + y * (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) := by + have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind + have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + induction y using TensorProduct.induction_on with + | zero => rw [hz₂, hz₁] + | add a b ha hb => simp only [hd₁, hd₂, ha, hb] + | tmul q l => + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + mul_comm, one_mul, mul_one] + +/-- The covariant substitution: the algebra endomorphism of the QED jet algebra + fixing the B-boson factor and sending each plain fermionic generator to its + covariant version. -/ +noncomputable def covSubst : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft covExtHom + (fun p y => (tmul_one_mul_comm p (covExtHom y))) + +lemma covSubst_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : + covSubst (p ⊗ₜ[ℂ] l) = (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := by + rw [covSubst, Algebra.TensorProduct.lift_tmul] + rfl + +@[simp] +lemma covSubst_tmul_one (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + covSubst (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = p ⊗ₜ[ℂ] 1 := by + have h1 : covExtHom (1 : LeptonSinglet.JetAlgebra) = 1 := covExtHom.map_one + have hmul : ∀ a : JetAlgebra, a * 1 = a := fun a => mul_one a + rw [covSubst_tmul, h1, hmul] + +@[simp] +lemma covSubst_one_tmul_ι (m : LeptonSinglet.JetComponentSpace) : + covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = + covMap m := by + have hone : ∀ a : JetAlgebra, 1 * a = a := fun a => one_mul a + rw [covSubst_tmul, covExtHom_ι, ← Algebra.TensorProduct.one_def, hone] + + + +/-! + +## B. Representation of the jet gauge group + +Gauge transformations act on the QED jet algebra +locally via the group `JetGaugeGroupI`. -/ +/-- The representation of the jet gauge group on the QED jet algebra: the + Maurer–Cartan substitution action on the (complexified) B-boson factor tensored + with the hypercharge action on the charged-lepton factor. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := + BBoson.JetAlgebra.complexRepJetGaugeGroupI.tprod LeptonSinglet.JetAlgebra.repJetGaugeGroupI + +lemma repJetGaugeGroupI_eq_algHom (g : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI g x = Algebra.TensorProduct.map + (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom g) + (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom g) x := rfl + +lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI g (x * y) = + repJetGaugeGroupI g x * repJetGaugeGroupI g y := by + simp [repJetGaugeGroupI_eq_algHom] + +lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : + repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by + simp [repJetGaugeGroupI_eq_algHom] + +lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ₜ[ℂ] l) = + (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl + +/-- The QED gauge action on a pure tensor of the two jet-algebra factors. -/ +lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by + rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] + +/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge + transformations acts on it through the character of its value at the base + point alone, with no derivative contributions. This is the base case of + `repJetGaugeGroupI_Dψ`. -/ +lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : + repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by + rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, + Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] + +/-- The embedded field-strength derivatives are gauge invariant. -/ +lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by + rw [fieldStrengthDeriv, repJetGaugeGroupI_tmul, + BBoson.JetAlgebra.repJetGaugeGroupI_fieldStrengthDeriv, + show LeptonSinglet.JetAlgebra.repJetGaugeGroupI U (1 : LeptonSinglet.JetAlgebra) = 1 from + map_one (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U))] /-! @@ -1034,21 +1289,6 @@ in the algebra generated by these three families. -/ -/-- The derivatives of the B-boson field strength, embedded in the QED jet - algebra. -/ -noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ₜ[ℂ] 1 - -/-- The embedded field-strength derivatives are gauge invariant. -/ -lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by - rw [fieldStrengthDeriv, repJetGaugeGroupI_tmul, - BBoson.JetAlgebra.repJetGaugeGroupI_fieldStrengthDeriv, - show LeptonSinglet.JetAlgebra.repJetGaugeGroupI U (1 : LeptonSinglet.JetAlgebra) = 1 from - map_one (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U))] - /-- The generating set of the invariants of the QED jet algebra: the embedded field-strength derivatives together with the covariant derivatives of the lepton and of its conjugate. -/ @@ -1060,203 +1300,6 @@ noncomputable def invariantGenerators : Set JetAlgebra := /-! -### The covariant substitution - -The change of variables from the plain fermionic coordinates `∂_s ψ_α`, -`∂_s ψ̄_α` to the covariant coordinates `D_s ψ_α`, `D̄_s ψ̄_α`, as an algebra -endomorphism of the QED jet algebra fixing the B-boson factor. - --/ - -/-- A canonical list presentation of a multiset of spacetime indices. -/ -noncomputable def sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : List (Fin 1 ⊕ Fin 3) := - ((s.map finSumFinEquiv).sort (· ≤ ·)).map finSumFinEquiv.symm - -@[simp] -lemma coe_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : - (↑(sortList s) : Multiset (Fin 1 ⊕ Fin 3)) = s := by - rw [sortList, ← Multiset.map_coe, Multiset.sort_eq, Multiset.map_map] - simp - -@[simp] -lemma length_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : - (sortList s).length = Multiset.card s := by - rw [sortList, List.length_map, Multiset.length_sort, Multiset.card_map] - -/-- The derivative degree of a lepton jet generator. -/ -def genDeg : LeptonSinglet.JetGenerators → ℕ - | .dψ s _ => Multiset.card s - | .dbarψ s _ => Multiset.card s - -/-- The covariant element associated with a lepton jet generator: the covariant - derivative along a canonical ordering of the multiset of derivative indices. -/ -noncomputable def covGenerator : LeptonSinglet.JetGenerators → JetAlgebra - | .dψ s α => Dψ (sortList s) α - | .dbarψ s α => Dbarψ (sortList s) α - -/-- The inclusion of B-coefficiented degree-one fermionic elements into the QED - jet algebra. -/ -noncomputable def oddIncl : ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetComponentSpace) →ₗ[ℂ] JetAlgebra := - TensorProduct.map LinearMap.id (ExteriorAlgebra.ι ℂ) - -lemma oddIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace) : - oddIncl (p ⊗ₜ[ℂ] m) = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m := by - simp [oddIncl] - -set_option maxHeartbeats 1000000 in -/-- Odd elements anticommute. -/ -lemma oddIncl_mul_add_swap (w w' : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetComponentSpace) : - oddIncl w * oddIncl w' + oddIncl w' * oddIncl w = 0 := by - have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction w using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, add_zero] - | add u v hu hv => - simp only [map_add, hd₁, hd₂] - calc oddIncl u * oddIncl w' + oddIncl v * oddIncl w' + - (oddIncl w' * oddIncl u + oddIncl w' * oddIncl v) = - (oddIncl u * oddIncl w' + oddIncl w' * oddIncl u) + - (oddIncl v * oddIncl w' + oddIncl w' * oddIncl v) := by abel - _ = 0 := by rw [hu, hv, add_zero] - | tmul p m => - induction w' using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, add_zero] - | add u v hu hv => - simp only [map_add, hd₁, hd₂] - calc oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + - (oddIncl u * oddIncl (p ⊗ₜ[ℂ] m) + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) = - (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl u * oddIncl (p ⊗ₜ[ℂ] m)) + - (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) := by - abel - _ = 0 := by rw [hu, hv, add_zero] - | tmul q n => - rw [oddIncl_tmul, oddIncl_tmul, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, mul_comm q p, ← TensorProduct.tmul_add, - ExteriorAlgebra.ι_add_mul_swap, TensorProduct.tmul_zero] - -/-- Odd elements square to zero. -/ -lemma oddIncl_mul_self (w : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetComponentSpace) : - oddIncl w * oddIncl w = 0 := by - have h := oddIncl_mul_add_swap w w - have h2 : (2 : ℂ) • (oddIncl w * oddIncl w) = 0 := by - rw [two_smul] - exact h - exact (smul_eq_zero.mp h2).resolve_left (by norm_num) - -/-- The linear map sending each fermionic component function to its covariant - version. -/ -noncomputable def covMap : LeptonSinglet.JetComponentSpace →ₗ[ℂ] JetAlgebra := - LeptonSinglet.JetComponentSpace.basis.constr ℂ covGenerator - -@[simp] -lemma covMap_basis (g : LeptonSinglet.JetGenerators) : - covMap (LeptonSinglet.JetComponentSpace.basis g) = covGenerator g := by - rw [covMap, Module.Basis.constr_basis] - -lemma covGenerator_mem_range_oddIncl (g : LeptonSinglet.JetGenerators) : - covGenerator g ∈ LinearMap.range oddIncl := by - have hlept : ∀ x, leptonLinearIncl x ∈ LinearMap.range oddIncl := by - intro x - refine ⟨TensorProduct.map LinearMap.id (LinearMap.inl ℂ _ _) x, ?_⟩ - have h : oddIncl ∘ₗ TensorProduct.map LinearMap.id (LinearMap.inl ℂ - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) = leptonLinearIncl := by - rw [oddIncl, leptonLinearIncl, ← TensorProduct.map_comp] - rfl - exact LinearMap.congr_fun h x - have hconj : ∀ x, conjLeptonLinearIncl x ∈ LinearMap.range oddIncl := by - intro x - refine ⟨TensorProduct.map LinearMap.id (LinearMap.inr ℂ _ _) x, ?_⟩ - have h : oddIncl ∘ₗ TensorProduct.map LinearMap.id (LinearMap.inr ℂ - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) = conjLeptonLinearIncl := by - rw [oddIncl, conjLeptonLinearIncl, ← TensorProduct.map_comp] - rfl - exact LinearMap.congr_fun h x - cases g with - | dψ s α => - rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, - Dψ_eq_leptonLinearIncl] - exact hlept _ - | dbarψ s α => - rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, - Dbarψ_eq_conjLeptonLinearIncl] - exact hconj _ - -lemma covMap_mem_range_oddIncl (m : LeptonSinglet.JetComponentSpace) : - covMap m ∈ LinearMap.range oddIncl := by - rw [covMap, Module.Basis.constr_apply] - exact Submodule.sum_mem _ fun g _ => - Submodule.smul_mem _ _ (covGenerator_mem_range_oddIncl g) - -lemma covMap_mul_self (m : LeptonSinglet.JetComponentSpace) : - covMap m * covMap m = 0 := by - obtain ⟨w, hw⟩ := covMap_mem_range_oddIncl m - rw [← hw] - exact oddIncl_mul_self w - -/-- The covariant substitution on the fermionic factor. -/ -noncomputable def covExtHom : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := - ExteriorAlgebra.lift ℂ ⟨covMap, covMap_mul_self⟩ - -@[simp] -lemma covExtHom_ι (m : LeptonSinglet.JetComponentSpace) : - covExtHom (ExteriorAlgebra.ι ℂ m) = covMap m := by - rw [covExtHom, ExteriorAlgebra.lift_ι_apply] - -/-- Elements of the B-boson factor are central in the QED jet algebra. -/ -lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : - (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * y = - y * (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) := by - have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction y using TensorProduct.induction_on with - | zero => rw [hz₂, hz₁] - | add a b ha hb => simp only [hd₁, hd₂, ha, hb] - | tmul q l => - rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - mul_comm, one_mul, mul_one] - -/-- The covariant substitution: the algebra endomorphism of the QED jet algebra - fixing the B-boson factor and sending each plain fermionic generator to its - covariant version. -/ -noncomputable def covSubst : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft covExtHom - (fun p y => (tmul_one_mul_comm p (covExtHom y))) - -lemma covSubst_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - covSubst (p ⊗ₜ[ℂ] l) = (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := by - rw [covSubst, Algebra.TensorProduct.lift_tmul] - rfl - -@[simp] -lemma covSubst_tmul_one (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - covSubst (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = p ⊗ₜ[ℂ] 1 := by - have h1 : covExtHom (1 : LeptonSinglet.JetAlgebra) = 1 := covExtHom.map_one - have hmul : ∀ a : JetAlgebra, a * 1 = a := fun a => mul_one a - rw [covSubst_tmul, h1, hmul] - -@[simp] -lemma covSubst_one_tmul_ι (m : LeptonSinglet.JetComponentSpace) : - covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = - covMap m := by - have hone : ∀ a : JetAlgebra, 1 * a = a := fun a => one_mul a - rw [covSubst_tmul, covExtHom_ι, ← Algebra.TensorProduct.one_def, hone] - -/-! - ### The gauge action as an algebra homomorphism, and the intertwining -/ From e79c94721c0703377d5f73cc78dedeebd958b71b Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 12:18:13 +0100 Subject: [PATCH 101/254] claude clean up claude prompt: /goal I want you to clean up the files in the ./QED/JetAlgebra directory. I want you to make sure: 1. All lemmas and results sit in a sensible place (following the usual API conventions of Physlib/Mathlib). 2. No lemmas are repeated. 3. The story is complete, and makes sense, and the documentation is not too verbose. 4. Everything builds. 5. A minimal amount of concrete definitions are made (there are lots of pointless definitions). Co-Authored-By: Claude --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 171 +- .../Particles/QED/JetAlgebra/Invariants.lean | 11668 +--------------- .../QED/JetAlgebra/Invariants/Basic.lean | 790 ++ .../Invariants/BoostFermionPairs.lean | 871 ++ .../QED/JetAlgebra/Invariants/BoostPairs.lean | 1247 ++ .../Invariants/BoostSecondDerivatives.lean | 1002 ++ .../Invariants/BoostTransforms.lean | 546 + .../JetAlgebra/Invariants/Decomposition.lean | 817 ++ .../JetAlgebra/Invariants/KleinAverage.lean | 1440 ++ .../QED/JetAlgebra/Invariants/Membership.lean | 1433 ++ .../JetAlgebra/Invariants/MonomialForm.lean | 500 + .../Invariants/ProjectorValues.lean | 312 + .../QED/JetAlgebra/Invariants/Projectors.lean | 539 + .../Invariants/ProjectorsDerivative.lean | 1115 ++ .../QED/JetAlgebra/Invariants/Sectors.lean | 894 ++ .../Invariants/SymmetrisedAverage.lean | 732 + Physlib/Particles/QED/JetAlgebra/MassDim.lean | 10 +- .../StandardModel/GaugeBosons/BBoson.lean | 227 + 18 files changed, 12580 insertions(+), 11734 deletions(-) create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/BoostFermionPairs.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/BoostPairs.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/Decomposition.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/Membership.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/Projectors.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorsDerivative.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean create mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 60c722f65..576d20247 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -219,6 +219,15 @@ zeroth-order component function of `ψ` it produces the covariant derivatives. noncomputable def covariantStep (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ +@[simp] +lemma covariantStep_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + covariantStep μ x = + jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by + rw [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply] + +/-- The covariant derivative `D_l ψ_α` of the charged lepton along the ordered + list of directions `l`, with the head of the list the outermost derivative. -/ noncomputable def Dψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := l.foldr (fun μ x => covariantStep μ x) [JetGenerators.dψ {} α]ₐ @@ -238,8 +247,7 @@ lemma Dψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : Dψ [μ] α = [JetGenerators.dψ {μ} α]ₐ + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dψ {} α]ₐ) := by - rw [Dψ_cons, Dψ_nil, covariantStep, - LinearMap.add_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply] + rw [Dψ_cons, Dψ_nil, covariantStep_apply] congr 1 simp only [ofGenerator] rw [jetDeriv_tmul, LinearMap.baseChange_tmul] @@ -253,6 +261,13 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ +@[simp] +lemma covariantStepBar_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + covariantStepBar μ x = + jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by + rw [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply] + /-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the ordered list of directions `l`, with the head of the list the outermost derivative. -/ @@ -274,8 +289,7 @@ lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by - rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar, LinearMap.sub_apply, - LinearMap.smul_apply, LinearMap.mulLeft_apply] + rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar_apply] congr 1 simp only [ofGenerator] rw [jetDeriv_tmul, LinearMap.baseChange_tmul] @@ -386,73 +400,73 @@ lemma oddIncl_mul_self (w : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] exact h exact (smul_eq_zero.mp h2).resolve_left (by norm_num) +/-- The odd part is preserved by the total derivative. -/ +lemma jetDeriv_mem_range_oddIncl (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} + (hx : x ∈ LinearMap.range oddIncl) : jetDeriv μ x ∈ LinearMap.range oddIncl := by + obtain ⟨w, rfl⟩ := hx + induction w using TensorProduct.induction_on with + | zero => simp + | add u v hu hv => + rw [map_add, map_add] + exact Submodule.add_mem _ hu hv + | tmul p m => + rw [oddIncl_tmul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] + exact Submodule.add_mem _ ⟨_, oddIncl_tmul _ _⟩ ⟨_, oddIncl_tmul _ _⟩ + +/-- The odd part is preserved by multiplication by a gauge-field generator, + which lives in the bosonic factor. -/ +lemma dB_mul_mem_range_oddIncl (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} + (hx : x ∈ LinearMap.range oddIncl) : + [JetGenerators.dB {} μ]ₐ * x ∈ LinearMap.range oddIncl := by + obtain ⟨w, rfl⟩ := hx + refine ⟨TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) + LinearMap.id w, ?_⟩ + have key : oddIncl ∘ₗ TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) + LinearMap.id = + (LinearMap.mulLeft ℂ ([JetGenerators.dB {} μ]ₐ : JetAlgebra)) ∘ₗ oddIncl := by + refine TensorProduct.ext' fun p m => ?_ + simp only [LinearMap.comp_apply, TensorProduct.map_tmul, oddIncl_tmul, + LinearMap.mulLeft_apply, LinearMap.id_apply, + show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + exact LinearMap.congr_fun key w + +/-- The covariant derivatives of the lepton are odd. -/ +lemma Dψ_mem_range_oddIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α ∈ LinearMap.range oddIncl := by + induction l with + | nil => + exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + LeptonSinglet.JetComponentSpace.basis (.dψ {} α), by + rw [oddIncl_tmul]; rfl⟩ + | cons ν l ih => + simp only [Dψ_cons, covariantStep_apply] + exact Submodule.add_mem _ (jetDeriv_mem_range_oddIncl ν ih) + (Submodule.smul_mem _ _ (dB_mul_mem_range_oddIncl ν ih)) + +/-- The covariant derivatives of the conjugate lepton are odd. -/ +lemma Dbarψ_mem_range_oddIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α ∈ LinearMap.range oddIncl := by + induction l with + | nil => + exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α), by + rw [oddIncl_tmul]; rfl⟩ + | cons ν l ih => + simp only [Dbarψ_cons, covariantStepBar_apply] + exact Submodule.sub_mem _ (jetDeriv_mem_range_oddIncl ν ih) + (Submodule.smul_mem _ _ (dB_mul_mem_range_oddIncl ν ih)) + lemma covGenerator_mem_range_oddIncl (g : LeptonSinglet.JetGenerators) : covGenerator g ∈ LinearMap.range oddIncl := by - have hdadd : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind - have hderiv : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), - x ∈ LinearMap.range oddIncl → jetDeriv μ x ∈ LinearMap.range oddIncl := by - rintro μ x ⟨w, rfl⟩ - induction w using TensorProduct.induction_on with - | zero => simp - | add u v hu hv => - rw [map_add, map_add] - exact Submodule.add_mem _ hu hv - | tmul p m => - rw [oddIncl_tmul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] - exact Submodule.add_mem _ ⟨_, oddIncl_tmul _ _⟩ ⟨_, oddIncl_tmul _ _⟩ - have hmulB : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), - x ∈ LinearMap.range oddIncl → - [JetGenerators.dB {} μ]ₐ * x ∈ LinearMap.range oddIncl := by - rintro μ x ⟨w, rfl⟩ - refine ⟨TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) - LinearMap.id w, ?_⟩ - have key : oddIncl ∘ₗ TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) - LinearMap.id = - (LinearMap.mulLeft ℂ ([JetGenerators.dB {} μ]ₐ : JetAlgebra)) ∘ₗ oddIncl := by - refine TensorProduct.ext' fun p m => ?_ - simp only [LinearMap.comp_apply, TensorProduct.map_tmul, oddIncl_tmul, - LinearMap.mulLeft_apply, LinearMap.id_apply, - show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, - Algebra.TensorProduct.tmul_mul_tmul, one_mul] - exact LinearMap.congr_fun key w - have hstep : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), covariantStep μ x = - jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := - fun _ _ => rfl - have hstepBar : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra), covariantStepBar μ x = - jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := - fun _ _ => rfl - have hDψ : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), - Dψ l α ∈ LinearMap.range oddIncl := by - intro l α - induction l with - | nil => - exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - LeptonSinglet.JetComponentSpace.basis (.dψ {} α), by - rw [oddIncl_tmul]; rfl⟩ - | cons ν l ih => - rw [Dψ_cons, hstep] - exact Submodule.add_mem _ (hderiv ν _ ih) - (Submodule.smul_mem _ _ (hmulB ν _ ih)) - have hDbarψ : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), - Dbarψ l α ∈ LinearMap.range oddIncl := by - intro l α - induction l with - | nil => - exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α), by - rw [oddIncl_tmul]; rfl⟩ - | cons ν l ih => - rw [Dbarψ_cons, hstepBar] - exact Submodule.sub_mem _ (hderiv ν _ ih) - (Submodule.smul_mem _ _ (hmulB ν _ ih)) cases g with - | dψ s α => exact hDψ (sortList s) α - | dbarψ s α => exact hDbarψ (sortList s) α + | dψ s α => exact Dψ_mem_range_oddIncl (sortList s) α + | dbarψ s α => exact Dbarψ_mem_range_oddIncl (sortList s) α lemma covMap_mem_range_oddIncl (m : LeptonSinglet.JetComponentSpace) : covMap m ∈ LinearMap.range oddIncl := by @@ -924,8 +938,7 @@ lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : leptonLinearIncl ∘ₗ (covariantStepAux μ) := by refine TensorProduct.ext' fun p a => ?_ simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covariantStepAux_tmul, - leptonComponentIncl_apply, covariantStep, LinearMap.add_apply, - LinearMap.smul_apply, LinearMap.mulLeft_apply, map_add, map_smul, + leptonComponentIncl_apply, covariantStep_apply, map_add, map_smul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, Algebra.TensorProduct.tmul_mul_tmul, one_mul] @@ -1230,8 +1243,8 @@ lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) (x : ConjLept conjLeptonLinearIncl ∘ₗ (covariantStepBarAux μ) := by refine TensorProduct.ext' fun p a => ?_ simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, covariantStepBarAux_tmul, - conjLeptonComponentIncl_apply, covariantStepBar, LinearMap.sub_apply, - LinearMap.smul_apply, LinearMap.mulLeft_apply, map_add, map_smul, map_sub, + conjLeptonComponentIncl_apply, covariantStepBar_apply, map_add, map_smul, + map_sub, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, LeptonSinglet.JetComponentSpace.jetDeriv_inr', ofGenerator, shiftC, Algebra.TensorProduct.tmul_mul_tmul, one_mul] @@ -1618,8 +1631,8 @@ lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} induction hx using Submodule.span_induction with | mem z hz => obtain ⟨c, g, hg, rfl⟩ := hz - rw [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply, - jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] + rw [covariantStep_apply, jetDeriv_tmul, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] refine add_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ @@ -1636,8 +1649,8 @@ lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgeb induction hx using Submodule.span_induction with | mem z hz => obtain ⟨c, g, hg, rfl⟩ := hz - rw [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply, - jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] + rw [covariantStepBar_apply, jetDeriv_tmul, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] refine sub_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ @@ -1671,8 +1684,7 @@ lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) + ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by - rw [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, + rw [covariantStep_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, @@ -1714,8 +1726,7 @@ lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) - ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by - rw [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, + rw [covariantStepBar_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants.lean b/Physlib/Particles/QED/JetAlgebra/Invariants.lean index d8b44ff90..9046ffe88 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants.lean @@ -5,11662 +5,35 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.MassDim -public import Physlib.Relativity.MinkowskiMatrix -public import Physlib.Relativity.PauliMatrices.Basic +public import Physlib.Particles.QED.JetAlgebra.Invariants.Membership /-! -# Mass dimension on the QED jet algebra +# Classification of the renormalizable QED Lagrangian densities --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace QED -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## The renormalizable invariants - -The gauge- and Lorentz-invariant elements of mass dimension at most four (mass -weight at most eight). Besides the constants these are kinetic terms alone: the -Maxwell term `F_{μν} F^{μν}`, the topological theta term -`ε^{μνρσ} F_{μν} F_{ρσ}`, and the two fermion kinetic terms -`i ψ̄ σ^μ (D_μ ψ)` and `-i (D̄_μ ψ̄) σ^μ ψ` (equal up to a total derivative). -No mass term exists: `ψψ` and `ψ̄ψ̄` carry hypercharge `±12`, and `ψ̄ψ` is not a -Lorentz scalar for a single Weyl fermion. All other candidate weights `≤ 8` are -excluded by charge balance or by the absence of a Lorentz invariant: -`∂^μ ∂^ν F_{μν} = 0` and `η^{μν} F_{μν} = 0` identically. - --/ - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The Maxwell kinetic term `F_{μν} F^{μν}`: the field-strength square with - both indices raised by the (diagonal) Minkowski metric. Mass weight eight. -/ -noncomputable def maxwellTerm : JetAlgebra := - ∑ μ, ∑ ν, ((η μ μ * η ν ν : ℝ) : ℂ) • - (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) - -/-- The topological theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, written as a sum over - the permutations of the four spacetime indices weighted by their signs. Mass - weight eight. -/ -noncomputable def thetaTerm : JetAlgebra := - ∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • - (fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) * - fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3))) - -/-- The spinor contraction matrices of the right-handed kinetic term: the - transposed covariant Pauli matrices `(σ̄^μ)ᵀ = (1, -σ1, σ2, -σ3)`. In the - conventions of this repository the right-handed lepton field transforms by - the entrywise conjugate of `Λ` and its jet coordinates by the contragredient - dual, so the pairing of `ψ̄_α`, `(D_μ ψ)_β` and the derivative index `μ` is - Lorentz invariant precisely through these matrices; this is the intertwining - identity `sum_kineticPauli_contraction` below. -/ -noncomputable def kineticPauli (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := - ((PauliMatrix.pauliSelfAdjoint' μ).1)ᵀ - -/-- The fermion kinetic term `i ψ̄_α (σ̄^μ)ᵀ_{α β} (D_μ ψ)_β` of the - right-handed charged-lepton singlet, with the covariant derivative on the - lepton. Mass weight eight. -/ -noncomputable def fermionKineticTerm : JetAlgebra := - Complex.I • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [] α * Dψ [μ] β) - -/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ̄^μ)ᵀ_{α β} ψ_β`, with - the covariant derivative on the conjugate lepton. Mass weight eight. -/ -noncomputable def fermionKineticTermBar : JetAlgebra := - (-Complex.I) • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [μ] α * Dψ [] β) - -/-- The invariants of the QED jet algebra of mass dimension at most four: the - constants and the four kinetic terms. These span - `InvariantMassWeightSubmodule 8`, the renormalizable QED Lagrangian densities. -/ -def massDimFourInvariants : Set JetAlgebra := - {1, maxwellTerm, thetaTerm, fermionKineticTerm, fermionKineticTermBar} - - -/-! - -## Gauge invariance of the renormalizable terms - -The hypercharge selection rule: a jet of gauge transformations acts on the -covariant generators only through `u(0)^{±6}`, so the field-strength squares are -exactly invariant and a product of one covariant lepton and one covariant -conjugate-lepton factor is invariant by unitarity. - --/ - -lemma repJetGaugeGroupI_maxwellTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U maxwellTerm = maxwellTerm := by - rw [maxwellTerm, map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_smul] - congr 1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv] - -lemma repJetGaugeGroupI_thetaTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U thetaTerm = thetaTerm := by - rw [thetaTerm, map_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [map_zsmul] - congr 1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, - repJetGaugeGroupI_fieldStrengthDeriv] - -/-- The hypercharge scalars of a lepton–conjugate-lepton pair cancel by - unitarity. -/ -lemma repJetGaugeGroupI_Dbarψ_mul_Dψ (U : JetGaugeGroupI) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - repJetGaugeGroupI U (Dbarψ l α * Dψ l' β) = Dbarψ l α * Dψ l' β := by - have hz : star ((U.eval.2.2 : unitary ℂ) : ℂ) * ((U.eval.2.2 : unitary ℂ) : ℂ) = 1 := - (Unitary.mem_iff.mp (U.eval.2.2).2).1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dbarψ, - Submonoid.smul_def, Submonoid.smul_def, SubmonoidClass.coe_pow, - SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← mul_pow, hz, - one_pow, one_smul] - -lemma repJetGaugeGroupI_fermionKineticTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] - -lemma repJetGaugeGroupI_fermionKineticTermBar (U : JetGaugeGroupI) : - repJetGaugeGroupI U fermionKineticTermBar = fermionKineticTermBar := by - rw [fermionKineticTermBar, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] - -/-! - -## Lorentz invariance of the renormalizable terms - -TODO: these require the transformation laws of the field strength (as an -antisymmetric two-tensor through `Λᵀ η Λ = η` and `det Λ = 1`) and of the -covariant derivatives (through the σ-matrix intertwining relation -`M σ^μ M† = Λ(M)^μ_ν σ^ν` defining `SL2C.toLorentzGroup`), which are not yet -available for the jet-algebra representations. - --/ - -/-- The component form of the Lorentz-group defining identity: contracting two - Lorentz matrices with the (diagonal, involutive) Minkowski metric over their - second indices reproduces the metric. -/ -lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : - ∑ ν, η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν = η a a' := by - have hsq : η a' a' * η a' a' = 1 := by - rcases a' with i | i - · rw [show i = (0 : Fin 1) from Subsingleton.elim i 0, - minkowskiMatrix.inl_0_inl_0] - norm_num - · rw [minkowskiMatrix.inr_i_inr_i] - norm_num - have h := congrFun (congrFun ((LorentzGroup.mem_iff_self_mul_dual).mp - (Lorentz.SL2C.toLorentzGroup Λ).2) a) a' - rw [Matrix.mul_apply] at h - simp only [minkowskiMatrix.dual_apply] at h - have h2 := congrArg (fun t => t * η a' a') h - simp only [Finset.sum_mul] at h2 - rw [show (∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν * η a' a') * η a' a') = - ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν) * (η a' a' * η a' a') from - Finset.sum_congr rfl fun ν _ => by ring, hsq] at h2 - simp only [mul_one] at h2 - rw [h2, Matrix.one_apply] - by_cases haa : a = a' - · subst haa - simp - · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] - simp - -set_option maxHeartbeats 2000000 in -/-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ -lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ maxwellTerm = maxwellTerm := by - have hscal : ∀ a b a' b' : Fin 1 ⊕ Fin 3, - (∑ μ, ∑ ν, η μ μ * η ν ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = η a a' * η b b' := by - intro a b a' b' - rw [show (∑ μ, ∑ ν, η μ μ * η ν ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = - ∑ μ, (η μ μ * (Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' μ) * - ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν) from - Finset.sum_congr rfl fun μ _ => by - rw [Finset.mul_sum] - exact Finset.sum_congr rfl fun ν _ => by ring, - ← Finset.sum_mul, toLorentzGroup_sum_η_mul_mul, toLorentzGroup_sum_η_mul_mul] - have hFt : ∀ μ ν : Fin 1 ⊕ Fin 3, repLorentzGroup Λ - (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) = - ∑ a, ∑ b, ∑ a', ∑ b', - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - intro μ ν - rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil] - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - simp only [hsm, hms, hsmul] - rw [maxwellTerm, map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, ν]; rw [map_smul, hFt μ ν] - simp only [Finset.smul_sum, smul_smul, ← Complex.ofReal_mul] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a, 2, b, 2, a']; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a', 2, b', 2, μ]; rw [← Finset.sum_smul] - conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [← Finset.sum_smul] - simp only [← Complex.ofReal_sum, hscal] - refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - rw [Finset.sum_eq_single a (fun a'' _ ha'' => Finset.sum_eq_zero fun b'' _ => by - rw [show η a a'' = 0 from by - rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm ha'')], - zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ a) h), - Finset.sum_eq_single b (fun b'' _ hb'' => by - rw [show η b b'' = 0 from by - rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm hb'')], - mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ b) h)] - -/-- The transformation law of a product of two field strengths. -/ -lemma repLorentzGroup_fieldStrengthDeriv_mul (Λ : SL(2,ℂ)) - (μ ν ρ τ : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} ρ τ) = - ∑ a, ∑ b, ∑ a', ∑ b', - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' ρ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' τ : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, - repLorentzGroup_fieldStrengthDeriv_nil] - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - simp only [hsm, hms, hsmul] - -/-- The alternating four-fold contraction of Lorentz matrices is a determinant: - the combinatorial identity behind the invariance of the theta term. -/ -lemma sum_perm_sign_mul_prod_eq_det (Λ : SL(2,ℂ)) (v : Fin 4 → Fin 1 ⊕ Fin 3) : - (∑ p : Equiv.Perm (Fin 4), ((Equiv.Perm.sign p : ℤ) : ℝ) * - ∏ i, (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p i))) = - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by - rw [← Matrix.det_transpose, Matrix.det_apply] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [Units.smul_def, zsmul_eq_mul] - rfl - -/-- The alternating contraction matrix of a non-injective index tuple has two - equal rows, so its determinant vanishes. -/ -lemma det_toLorentzGroup_of_not_injective (Λ : SL(2,ℂ)) {v : Fin 4 → Fin 1 ⊕ Fin 3} - (hv : ¬ Function.Injective v) : - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = 0 := by - rw [Function.not_injective_iff] at hv - obtain ⟨i, j, hij, hne⟩ := hv - exact Matrix.det_zero_of_row_eq hne (funext fun k => by simp [hij]) - -/-- On an index tuple obtained by permuting the four spacetime indices, the - alternating contraction matrix has determinant the sign of the permutation, - by `det Λ = 1`. -/ -lemma det_toLorentzGroup_comp_perm (Λ : SL(2,ℂ)) (q : Equiv.Perm (Fin 4)) : - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - ((Equiv.Perm.sign q : ℤ) : ℝ) := by - have h1 : (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - ((Lorentz.SL2C.toLorentzGroup Λ).1.submatrix - (finSumFinEquiv (m := 1) (n := 3)).symm - (finSumFinEquiv (m := 1) (n := 3)).symm).submatrix q id := rfl - rw [h1, Matrix.det_permute, - Matrix.det_submatrix_equiv_self (finSumFinEquiv (m := 1) (n := 3)).symm, - Lorentz.SL2C.toLorentzGroup_det_one, mul_one] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the theta term: the alternating contraction is the - determinant of the Lorentz matrix, which is one. -/ -lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ thetaTerm = thetaTerm := by - classical - rw [thetaTerm, map_sum] - conv_lhs => enter [2, p]; rw [map_zsmul, repLorentzGroup_fieldStrengthDeriv_mul] - simp only [Finset.smul_sum] - rw [Finset.sum_comm] - conv_lhs => enter [2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] - have hdet : ∀ a b a' b' : Fin 1 ⊕ Fin 3, - (∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) * - (Lorentz.SL2C.toLorentzGroup Λ).1 b - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3)) : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b')) = - ((Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (![a, b, a', b'] i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) : ℝ) : ℂ) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - intro a b a' b' - rw [← sum_perm_sign_mul_prod_eq_det Λ ![a, b, a', b'], Complex.ofReal_sum, - Finset.sum_smul] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [Fin.prod_univ_four] - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] - rw [← Int.cast_smul_eq_zsmul ℂ, smul_smul] - congr 1 - push_cast - ring - conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [hdet a b a' b'] - have hflat : ∀ (G : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → - (Fin 1 ⊕ Fin 3) → JetAlgebra), - (∑ a, ∑ b, ∑ a', ∑ b', G a b a' b') = - ∑ t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), - G t.1 t.2.1 t.2.2.1 t.2.2.2 := fun G => by - symm - simp only [Fintype.sum_prod_type] - rw [hflat] - rw [← Finset.sum_filter_of_ne - (p := fun t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × - (Fin 1 ⊕ Fin 3) => Function.Injective ![t.1, t.2.1, t.2.2.1, t.2.2.2]) - (fun t _ hne => by - by_contra hni - exact hne (by - rw [det_toLorentzGroup_of_not_injective Λ hni, Complex.ofReal_zero, - zero_smul]))] - have hcard : Fintype.card (Fin 4) = Fintype.card (Fin 1 ⊕ Fin 3) := by simp - refine Finset.sum_bij - (i := fun t ht => (Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) - ?_ ?_ ?_ ?_ - · intro t ht - exact Finset.mem_univ _ - · intro t₁ ht₁ t₂ ht₂ h - have hv : ∀ i : Fin 4, ![t₁.1, t₁.2.1, t₁.2.2.1, t₁.2.2.2] i = - ![t₂.1, t₂.2.1, t₂.2.2.1, t₂.2.2.2] i := by - intro i - have := congrArg (fun q : Equiv.Perm (Fin 4) => - (finSumFinEquiv (m := 1) (n := 3)).symm (q i)) h - simpa using this - have h0 := hv 0 - have h1 := hv 1 - have h2 := hv 2 - have h3 := hv 3 - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 - exact Prod.ext h0 (Prod.ext h1 (Prod.ext h2 h3)) - · intro q _ - refine ⟨((finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)), ?_, ?_⟩ - · refine Finset.mem_filter.mpr ⟨Finset.mem_univ _, ?_⟩ - have hveq : ![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] = - fun i => (finSumFinEquiv (m := 1) (n := 3)).symm (q i) := by - funext i - fin_cases i <;> rfl - rw [hveq] - exact ((finSumFinEquiv (m := 1) (n := 3)).symm.injective).comp q.injective - · refine Equiv.ext fun i => ?_ - show (finSumFinEquiv (m := 1) (n := 3)) - (![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] i) = q i - fin_cases i <;> simp - · intro t ht - have hq : ∀ i : Fin 4, (finSumFinEquiv (m := 1) (n := 3)).symm - (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) i) = - ![t.1, t.2.1, t.2.2.1, t.2.2.2] i := by - intro i - simp [Equiv.ofBijective] - have hmat : (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (![t.1, t.2.1, t.2.2.1, t.2.2.2] i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm - (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by - refine congrArg Matrix.of (funext fun i => funext fun j => ?_) - rw [hq i] - rw [hmat, det_toLorentzGroup_comp_perm] - have h0 := hq 0 - have h1 := hq 1 - have h2 := hq 2 - have h3 := hq 3 - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 - rw [h0, h1, h2, h3, ← Int.cast_smul_eq_zsmul ℂ] - module - -/-! - -### The kinetic contraction identity and Lorentz invariance - --/ - -/-- The Lorentz intertwining identity of the kinetic contraction matrices: - transporting the two spinor slots contragrediently and the derivative slot by - the Lorentz matrix reproduces the contraction matrices. This is the identity - `L(Λ) L(Λ⁻¹) = 1` transported through `L(M†) = L(M)ᵀ`. -/ -lemma sum_kineticPauli_contraction (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) - (α' β' : Fin 2) : - ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' := by - classical - have hdet : Matrix.det ((Λ⁻¹).1ᴴ) = 1 := by - rw [Matrix.det_conjTranspose, Matrix.SpecialLinearGroup.det_coe] - exact star_one ℂ - have hval : ∀ μ, (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 = - ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - intro μ - have h := congrArg Subtype.val - (Lorentz.SL2C.toSelfAdjointMap_basis - (M := (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))) μ) - simp only [Lorentz.SL2C.toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', - Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, - selfAdjoint.val_smul] at h - calc (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 - = ∑ j, (Lorentz.SL2C.toLorentzGroup - (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 j μ • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - rw [← h] - congr 1 - rw [show ((⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ)) : - Matrix (Fin 2) (Fin 2) ℂ)ᴴ = (Λ⁻¹).1 from - Matrix.conjTranspose_conjTranspose _] - _ = ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - refine Finset.sum_congr rfl fun j _ => ?_ - congr 1 - rw [show (Lorentz.SL2C.toLorentzGroup - (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 = - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1ᵀ from - Lorentz.SL2C.toLorentzGroup_conjTranspose rfl, - Matrix.transpose_apply] - have hsand : ∀ μ, (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β'))) = - ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - intro μ - have hentry := congrArg (fun A : Matrix (Fin 2) (Fin 2) ℂ => A β' α') (hval μ) - simp only [Matrix.sum_apply, Matrix.smul_apply] at hentry - calc (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * star ((Λ⁻¹).1 β β'))) - = ((Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1) β' α' := by - rw [Matrix.mul_apply] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [Matrix.mul_apply, Finset.sum_mul] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [Matrix.conjTranspose_apply, kineticPauli, Matrix.transpose_apply] - ring - _ = ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - rw [hentry] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [kineticPauli, Matrix.transpose_apply, Complex.real_smul] - calc ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β'))) - = ∑ μ, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β')) := by - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [Finset.mul_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [Finset.mul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - ring - _ = ∑ μ, ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - ((((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β') := by - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [hsand, Finset.mul_sum] - _ = ∑ j, ((∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [Complex.ofReal_sum, Finset.sum_mul] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [Complex.ofReal_mul] - ring - _ = kineticPauli ν α' β' := by - have hmul : ∀ j, (∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j) = - ((1 : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ)) ν j := by - intro j - rw [← Matrix.mul_apply, - show ((Lorentz.SL2C.toLorentzGroup Λ).1 * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 : - Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) = - ((Lorentz.SL2C.toLorentzGroup Λ * - Lorentz.SL2C.toLorentzGroup Λ⁻¹ : LorentzGroup 3) : - Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) from rfl, - ← map_mul, mul_inv_cancel, map_one] - rfl - simp only [hmul, Matrix.one_apply] - rw [Finset.sum_eq_single ν (fun j _ hj => by - rw [if_neg (Ne.symm hj), Complex.ofReal_zero, zero_mul]) - (fun h => absurd (Finset.mem_univ ν) h), if_pos rfl, - Complex.ofReal_one, one_mul] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the fermion kinetic term: the transformation of the - two spinor slots and the derivative slot cancels through the intertwining - identity of the contraction matrices. -/ -lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by - have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, α]; rw [map_sum] - conv_lhs => - enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, - repLorentzGroup_Dψ_singleton] - simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] - -- move the primed sums out and the unprimed sums in - conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] - conv_rhs => rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => - Finset.sum_congr rfl fun β' _ => ?_ - conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] - conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] - rw [← Finset.sum_smul] - rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * - ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β')))) = kineticPauli ν α' β' from - sum_kineticPauli_contraction Λ ν α' β'] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the conjugate fermion kinetic term. -/ -lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTermBar = fermionKineticTermBar := by - have hsmS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [fermionKineticTermBar, map_smul] - congr 1 - rw [map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, α]; rw [map_sum] - conv_lhs => - enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, - repLorentzGroup_Dψ_nil] - simp only [hsmS, hsmF, hmsF, hsmul, Finset.smul_sum, smul_smul] - -- move the transformed sums out and the original sums in - conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, ν, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, ν, 2, α']; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, ν, 2, α']; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun α' _ => - Finset.sum_congr rfl fun β' _ => ?_ - conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] - conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] - rw [← Finset.sum_smul] - rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' from by - rw [← sum_kineticPauli_contraction Λ ν α' β'] - refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun α _ => - Finset.sum_congr rfl fun β _ => ?_ - ring] - -/-! - -## The span inclusion - -Every element of `massDimFourInvariants` is invariant and has mass weight at -most eight, so the span is contained in `InvariantMassWeightSubmodule 8`. - --/ - -/-- Eigenvectors of weight `m ≤ n` lie in the weight-`≤ n` submodule. -/ -lemma mem_massWeightLESubmodule_of_forall_massWeightScale {x : JetAlgebra} - {m n : ℕ} (hmn : m ≤ n) - (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) : - x ∈ MassWeightLESubmodule n := - Submodule.subset_span ⟨m, hmn, hx⟩ - -lemma maxwellTerm_mem_massWeightLESubmodule : - maxwellTerm ∈ MassWeightLESubmodule 8 := by - rw [maxwellTerm] - refine Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun ν _ => - Submodule.smul_mem _ _ ?_ - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl - (massWeightScale_mul_eigen (m := 4) (n := 4) - (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν) - (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν)) - -lemma thetaTerm_mem_massWeightLESubmodule : - thetaTerm ∈ MassWeightLESubmodule 8 := by - rw [thetaTerm] - refine Submodule.sum_mem _ fun p _ => zsmul_mem ?_ _ - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl - (massWeightScale_mul_eigen (m := 4) (n := 4) - (fun c => massWeightScale_fieldStrengthDeriv c {} _ _) - (fun c => massWeightScale_fieldStrengthDeriv c {} _ _)) - -lemma fermionKineticTerm_mem_massWeightLESubmodule : - fermionKineticTerm ∈ MassWeightLESubmodule 8 := by - rw [fermionKineticTerm] - refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => - Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => - Submodule.smul_mem _ _ ?_) - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 3 + 5) le_rfl - (massWeightScale_mul_eigen (m := 3) (n := 5) - (fun c => massWeightScale_Dbarψ c [] α) - (fun c => massWeightScale_Dψ c [μ] β)) - -lemma fermionKineticTermBar_mem_massWeightLESubmodule : - fermionKineticTermBar ∈ MassWeightLESubmodule 8 := by - rw [fermionKineticTermBar] - refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => - Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => - Submodule.smul_mem _ _ ?_) - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 5 + 3) le_rfl - (massWeightScale_mul_eigen (m := 5) (n := 3) - (fun c => massWeightScale_Dbarψ c [μ] α) - (fun c => massWeightScale_Dψ c [] β)) - -/-- The Lorentz action fixes the unit of the jet algebra. -/ -lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : - repLorentzGroup Λ (1 : JetAlgebra) = 1 := by - have h1 : BBoson.JetAlgebra.complexRepLorentzGroup Λ - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by - rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = - (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, - show BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) - from by rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ = - LinearMap.baseChange ℂ (BBoson.JetAlgebra.repLorentzGroup Λ) from rfl, - LinearMap.baseChange_tmul], - show BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) = 1 from - map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - BBoson.JetComponentSpace.repLorentzGroup Λ))] - rw [show (1 : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, - show repLorentzGroup Λ ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra)) = - BBoson.JetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra) - from rfl, - h1, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - -/-- Every element of `massDimFourInvariants` is gauge and Lorentz invariant. -/ -lemma isInvariant_of_mem_massDimFourInvariants {x : JetAlgebra} - (hx : x ∈ massDimFourInvariants) : IsInvariant x := by - rcases hx with rfl | rfl | rfl | rfl | rfl - · exact ⟨fun U => (repJetGaugeGroupI_eq_repAlgHom U 1).trans (repAlgHom U).map_one, - repLorentzGroup_one⟩ - · exact ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ - · exact ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ - · exact ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ - · exact ⟨repJetGaugeGroupI_fermionKineticTermBar, - repLorentzGroup_fermionKineticTermBar⟩ - -lemma span_massDimFourInvariants_le : - Submodule.span ℂ massDimFourInvariants ≤ InvariantMassWeightSubmodule 8 := by - rw [Submodule.span_le] - intro x hx - refine Submodule.mem_inf.mpr ⟨?_, Submodule.subset_span - (isInvariant_of_mem_massDimFourInvariants hx)⟩ - rcases hx with rfl | rfl | rfl | rfl | rfl - · exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 0) (Nat.zero_le 8) - fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one - · exact maxwellTerm_mem_massWeightLESubmodule - · exact thetaTerm_mem_massWeightLESubmodule - · exact fermionKineticTerm_mem_massWeightLESubmodule - · exact fermionKineticTermBar_mem_massWeightLESubmodule - -/-! - -## Towards completeness: graded decomposition - -The powers `c ↦ c ^ w` are linearly independent functions of `c`, so the -weight components of an element are unique: a vanishing combination of -eigenvectors weighted by powers has vanishing components, and every element of -the weight-`≤ n` submodule decomposes into exact-weight eigenvectors. - --/ - -/-- If a finite combination of vectors weighted by powers of `c` vanishes for - all `c`, each component vanishes. -/ -lemma eq_zero_of_forall_sum_pow_smul_eq_zero (s : Finset ℕ) (v : ℕ → JetAlgebra) - (h : ∀ c : ℂ, ∑ w ∈ s, c ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : v w = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hp : ∀ c : ℂ, Polynomial.eval c - (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by - intro c - have h2 := congrArg φ (h c) - rw [map_sum, map_zero] at h2 - rw [Polynomial.eval_finsetSum] - simpa [Polynomial.eval_monomial, mul_comm] using h2 - have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := - Polynomial.funext fun c => by rw [hp c, Polynomial.eval_zero] - have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff - -/-- Every element of the weight-`≤ n` submodule is a sum of exact-weight - eigenvectors of the mass-dimension scaling. -/ -lemma exists_eigen_decomp_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} - (hx : x ∈ MassWeightLESubmodule n) : - ∃ z : ℕ → JetAlgebra, - (∀ m, ∀ c : ℂ, massWeightScale c (z m) = c ^ m • z m) ∧ - x = ∑ m ∈ Finset.range (n + 1), z m := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨m, hmn, hym⟩ := hy - refine ⟨fun k => if k = m then y else 0, fun k c => ?_, ?_⟩ - · by_cases hk : k = m - · subst hk - simpa using hym c - · simp [hk] - · rw [Finset.sum_ite_eq' (Finset.range (n + 1)) m fun _ => y, - if_pos (Finset.mem_range.mpr (Nat.lt_succ_of_le hmn))] - | zero => - exact ⟨fun _ => 0, by simp, by simp⟩ - | add a b ha hb iha ihb => - obtain ⟨z₁, hz₁, rfl⟩ := iha - obtain ⟨z₂, hz₂, rfl⟩ := ihb - refine ⟨z₁ + z₂, fun m c => ?_, ?_⟩ - · simp only [Pi.add_apply, map_add, hz₁ m c, hz₂ m c, smul_add] - · rw [← Finset.sum_add_distrib] - rfl - | smul c a ha iha => - obtain ⟨z, hz, rfl⟩ := iha - refine ⟨c • z, fun m c' => ?_, ?_⟩ - · simp only [Pi.smul_apply, map_smul, hz m c', smul_comm c] - · rw [Finset.smul_sum] - rfl - -/-- The span of the covariant monomials of exact mass weight `w`: products of - field-strength derivatives and covariant derivatives of total weight `w`. -/ -noncomputable def covMonomialSpan (w : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ - ∀ c : ℂ, massWeightScale c y = c ^ w • y} - -/-- Every covariant monomial is homogeneous. -/ -lemma exists_weight_of_mem_closure {y : JetAlgebra} - (hy : y ∈ Submonoid.closure invariantGenerators) : - ∃ w, ∀ c : ℂ, massWeightScale c y = c ^ w • y := by - induction hy using Submonoid.closure_induction with - | mem z hz => - rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact ⟨4 + 2 * Multiset.card p.1, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ - · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dψ c p.1 p.2⟩ - · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ - | one => - exact ⟨0, fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one⟩ - | mul a b ha hb iha ihb => - obtain ⟨wa, hwa⟩ := iha - obtain ⟨wb, hwb⟩ := ihb - exact ⟨wa + wb, massWeightScale_mul_eigen hwa hwb⟩ - -/-- Elements of the weight-`w` covariant monomial span are eigenvectors. -/ -lemma forall_massWeightScale_of_mem_covMonomialSpan {w : ℕ} {y : JetAlgebra} - (hy : y ∈ covMonomialSpan w) (c : ℂ) : - massWeightScale c y = c ^ w • y := by - induction hy using Submodule.span_induction with - | mem z hz => exact hz.2 c - | zero => simp - | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] - | smul d a ha iha => rw [map_smul, iha, smul_comm] - -/-- A vanishing tail extends a truncated sum. -/ -lemma sum_range_succ_ext {N M : ℕ} (z : ℕ → JetAlgebra) (hNM : N ≤ M) - (hz : ∀ m, N < m → z m = 0) : - ∑ m ∈ Finset.range (N + 1), z m = ∑ m ∈ Finset.range (M + 1), z m := by - refine Finset.sum_subset ?_ ?_ - · intro m hm - simp only [Finset.mem_range] at hm ⊢ - omega - intro m hm hms - refine hz m ?_ - simp only [Finset.mem_range] at hm hms - omega - -/-- Every element of the algebra generated by the covariant generators - decomposes into covariant monomial components of bounded weight. -/ -lemma exists_bound_decomp_of_mem_adjoin {x : JetAlgebra} - (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : - ∃ (N : ℕ) (z : ℕ → JetAlgebra), (∀ m, z m ∈ covMonomialSpan m) ∧ - (∀ m, N < m → z m = 0) ∧ x = ∑ m ∈ Finset.range (N + 1), z m := by - have hx' : x ∈ Subalgebra.toSubmodule (Algebra.adjoin ℂ invariantGenerators) := hadj - rw [Algebra.adjoin_eq_span] at hx' - clear hadj - induction hx' using Submodule.span_induction with - | mem y hy => - obtain ⟨w, hw⟩ := exists_weight_of_mem_closure hy - refine ⟨w, fun k => if k = w then y else 0, fun k => ?_, fun k hk => ?_, ?_⟩ - · by_cases hkw : k = w - · subst hkw - show (if k = k then y else 0) ∈ covMonomialSpan k - rw [if_pos rfl] - exact Submodule.subset_span ⟨hy, hw⟩ - · show (if k = w then y else 0) ∈ covMonomialSpan k - rw [if_neg hkw] - exact Submodule.zero_mem _ - · show (if k = w then y else 0) = 0 - rw [if_neg (show ¬ k = w by omega)] - · show y = ∑ m ∈ Finset.range (w + 1), (if m = w then y else 0) - rw [Finset.sum_ite_eq' (Finset.range (w + 1)) w fun _ => y, - if_pos (Finset.mem_range.mpr (Nat.lt_succ_self w))] - | zero => - exact ⟨0, fun _ => 0, fun m => Submodule.zero_mem _, fun _ _ => rfl, by simp⟩ - | add a b ha hb iha ihb => - obtain ⟨N₁, z₁, hz₁, hs₁, rfl⟩ := iha - obtain ⟨N₂, z₂, hz₂, hs₂, rfl⟩ := ihb - refine ⟨max N₁ N₂, z₁ + z₂, fun m => Submodule.add_mem _ (hz₁ m) (hz₂ m), - fun m hm => ?_, ?_⟩ - · simp only [Pi.add_apply, hs₁ m (lt_of_le_of_lt (le_max_left _ _) hm), - hs₂ m (lt_of_le_of_lt (le_max_right _ _) hm), add_zero] - · rw [sum_range_succ_ext z₁ (le_max_left N₁ N₂) hs₁, - sum_range_succ_ext z₂ (le_max_right N₁ N₂) hs₂, - ← Finset.sum_add_distrib] - rfl - | smul c a ha iha => - obtain ⟨N, z, hz, hs, rfl⟩ := iha - refine ⟨N, c • z, fun m => Submodule.smul_mem _ _ (hz m), - fun m hm => ?_, ?_⟩ - · simp only [Pi.smul_apply, hs m hm, smul_zero] - · rw [Finset.smul_sum] - rfl - -/-- The master decomposition: an element of the adjoin of the covariant - generators of mass weight at most eight is a sum of nine covariant monomial - components of weights `0, …, 8`. -/ -lemma exists_covMonomialSpan_decomp {x : JetAlgebra} - (hx : x ∈ MassWeightLESubmodule 8) - (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : - ∃ z : ℕ → JetAlgebra, (∀ m, z m ∈ covMonomialSpan m) ∧ - x = ∑ m ∈ Finset.range 9, z m := by - obtain ⟨N, z, hzmem, hzsupp, hzx⟩ := exists_bound_decomp_of_mem_adjoin hadj - obtain ⟨z', hz'eig, hz'x⟩ := exists_eigen_decomp_of_mem_massWeightLESubmodule hx - refine ⟨z, hzmem, ?_⟩ - set M := max N 8 with hM - have h1 : x = ∑ m ∈ Finset.range (M + 1), z m := - hzx.trans (sum_range_succ_ext z (le_max_left N 8) hzsupp) - have hz'supp : ∀ m, 8 < m → (fun k => if k < 9 then z' k else 0) m = 0 := by - intro m hm - show (if m < 9 then z' m else 0) = 0 - rw [if_neg (show ¬ m < 9 by omega)] - have h2 : x = ∑ m ∈ Finset.range (M + 1), (fun k => if k < 9 then z' k else 0) m := by - rw [hz'x, show (9 : ℕ) = 8 + 1 from rfl, - ← sum_range_succ_ext _ (le_max_right N 8) hz'supp] - exact Finset.sum_congr rfl fun m hm => by - rw [if_pos (Finset.mem_range.mp hm)] - have hdiff : ∀ c : ℂ, ∑ m ∈ Finset.range (M + 1), - c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) = 0 := by - intro c - have e1 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), c ^ m • z m := by - rw [h1, map_sum] - exact Finset.sum_congr rfl fun m _ => - forall_massWeightScale_of_mem_covMonomialSpan (hzmem m) c - have e2 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), - c ^ m • (fun k => if k < 9 then z' k else 0) m := by - rw [h2, map_sum] - refine Finset.sum_congr rfl fun m _ => ?_ - by_cases hm : m < 9 - · simp only [if_pos hm] - exact hz'eig m c - · simp only [if_neg hm, map_zero, smul_zero] - calc ∑ m ∈ Finset.range (M + 1), - c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) - = (∑ m ∈ Finset.range (M + 1), c ^ m • z m) - - ∑ m ∈ Finset.range (M + 1), - c ^ m • (fun k => if k < 9 then z' k else 0) m := by - rw [← Finset.sum_sub_distrib] - exact Finset.sum_congr rfl fun m _ => smul_sub _ _ _ - _ = massWeightScale c x - massWeightScale c x := by rw [← e1, ← e2] - _ = 0 := sub_self _ - have hkill : ∀ m, 8 < m → z m = 0 := by - intro m hm - by_cases hmM : m ≤ M - · have h0 : z m - (fun k => if k < 9 then z' k else 0) m = 0 := - eq_zero_of_forall_sum_pow_smul_eq_zero (Finset.range (M + 1)) _ hdiff - (show m ∈ Finset.range (M + 1) from Finset.mem_range.mpr (by omega)) - simpa [if_neg (by omega : ¬ m < 9)] using h0 - · exact hzsupp m (by omega) - rw [h1, show (9 : ℕ) = 8 + 1 from rfl, sum_range_succ_ext z (le_max_right N 8) hkill] - -/-! - -## Componentwise invariance - -The scaling at real scalars commutes with the Lorentz action and (at all -scalars) with the constant gauge action, so the weight components of an -invariant element are themselves invariant. - --/ - - -/-- Real-scalar variant of the independence of powers. -/ -lemma eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero (s : Finset ℕ) - (v : ℕ → JetAlgebra) - (h : ∀ r : ℝ, ∑ w ∈ s, ((r : ℂ)) ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : - v w = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hp : ∀ r : ℝ, Polynomial.eval ((r : ℂ)) - (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by - intro r - have h2 := congrArg φ (h r) - rw [map_sum, map_zero] at h2 - rw [Polynomial.eval_finsetSum] - simpa [Polynomial.eval_monomial, mul_comm] using h2 - have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by - refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ - refine Set.Infinite.mono ?_ - (Set.infinite_range_of_injective Complex.ofReal_injective) - rintro z ⟨r, rfl⟩ - exact hp r - have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff - -/-- The weight components of a Lorentz-invariant covariant decomposition are - Lorentz invariant. -/ -lemma repLorentzGroup_covComponent_eq {z : ℕ → JetAlgebra} - (hz : ∀ m, z m ∈ covMonomialSpan m) (Λ : SL(2,ℂ)) - (hx : repLorentzGroup Λ (∑ m ∈ Finset.range 9, z m) = - ∑ m ∈ Finset.range 9, z m) - {m : ℕ} (hm : m ∈ Finset.range 9) : - repLorentzGroup Λ (z m) = z m := by - have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, - ((r : ℂ)) ^ k • (repLorentzGroup Λ (z k) - z k) = 0 := by - intro r - have e1 : massWeightScale ((r : ℂ)) - (repLorentzGroup Λ (∑ k ∈ Finset.range 9, z k) - - ∑ k ∈ Finset.range 9, z k) = 0 := by - rw [hx, sub_self, map_zero] - rw [map_sum, map_sub, map_sum, map_sum] at e1 - calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • - (repLorentzGroup Λ (z k) - z k) - = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) - (repLorentzGroup Λ (z k))) - - ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by - rw [← Finset.sum_sub_distrib] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [massWeightScale_ofReal_repLorentzGroup, - forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, - smul_sub] - _ = 0 := e1 - have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm - rwa [sub_eq_zero] at h0 - -/-- The weight components of a constant-gauge-invariant covariant decomposition - are constant-gauge invariant. -/ -lemma repJetGaugeGroupI_ofConstant_covComponent_eq {z : ℕ → JetAlgebra} - (hz : ∀ m, z m ∈ covMonomialSpan m) (g : GaugeGroupI) - (hx : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (∑ m ∈ Finset.range 9, z m) = ∑ m ∈ Finset.range 9, z m) - {m : ℕ} (hm : m ∈ Finset.range 9) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z m) = z m := by - have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) = 0 := by - intro r - have e1 : massWeightScale ((r : ℂ)) - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (∑ k ∈ Finset.range 9, z k) - ∑ k ∈ Finset.range 9, z k) = 0 := by - rw [hx, sub_self, map_zero] - rw [map_sum, map_sub, map_sum, map_sum] at e1 - calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) - = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k))) - - ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by - rw [← Finset.sum_sub_distrib] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [massWeightScale_repJetGaugeGroupI_ofConstant, - forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, - smul_sub] - _ = 0 := e1 - have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm - rwa [sub_eq_zero] at h0 - -/-! - -## The low-weight sectors - --/ - -/-- An element with two distinct exact weights vanishes. -/ -lemma eq_zero_of_eigen_ne {y : JetAlgebra} {m n : ℕ} - (hm : ∀ c : ℂ, massWeightScale c y = c ^ m • y) - (hn : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (hmn : m ≠ n) : y = 0 := by - have h : ((2 : ℂ) ^ m) • y = ((2 : ℂ) ^ n) • y := (hm 2).symm.trans (hn 2) - have h2 : ((2 : ℂ) ^ m - 2 ^ n) • y = 0 := - (sub_smul ((2 : ℂ) ^ m) ((2 : ℂ) ^ n) y).trans (by rw [h, sub_self]) - rcases smul_eq_zero.mp h2 with h3 | h3 - · exfalso - apply hmn - rw [sub_eq_zero] at h3 - have h4 : ((2 ^ m : ℕ) : ℂ) = ((2 ^ n : ℕ) : ℂ) := by - push_cast - exact h3 - exact Nat.pow_right_injective (le_refl 2) (Nat.cast_injective h4) - · exact h3 - -/-- Every covariant monomial is the unit or homogeneous of weight at least - three. -/ -lemma mem_closure_weight_cases {y : JetAlgebra} - (hy : y ∈ Submonoid.closure invariantGenerators) : - y = 1 ∨ ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c y = c ^ w • y := by - induction hy using Submonoid.closure_induction with - | mem z hz => - rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact Or.inr ⟨4 + 2 * Multiset.card p.1, by omega, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ - · exact Or.inr ⟨3 + 2 * p.1.length, by omega, - fun c => massWeightScale_Dψ c p.1 p.2⟩ - · exact Or.inr ⟨3 + 2 * p.1.length, by omega, - fun c => massWeightScale_Dbarψ c p.1 p.2⟩ - | one => exact Or.inl rfl - | mul a b ha hb iha ihb => - rcases iha with rfl | ⟨wa, hwa3, hwa⟩ - · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ - · exact Or.inl (one_mul (1 : JetAlgebra)) - · exact Or.inr ⟨wb, hwb3, fun c => by - rw [show (1 : JetAlgebra) * b = b from one_mul b] - exact hwb c⟩ - · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ - · exact Or.inr ⟨wa, hwa3, fun c => by - rw [show a * (1 : JetAlgebra) = a from mul_one a] - exact hwa c⟩ - · exact Or.inr ⟨wa + wb, by omega, massWeightScale_mul_eigen hwa hwb⟩ - -/-- The weight-zero covariant monomial span consists of the constants. -/ -lemma covMonomialSpan_zero_le : - covMonomialSpan 0 ≤ Submodule.span ℂ {(1 : JetAlgebra)} := by - rw [covMonomialSpan, Submodule.span_le] - rintro y ⟨hy, hy0⟩ - rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ - · exact Submodule.subset_span rfl - · rw [show y = 0 from eq_zero_of_eigen_ne hwe hy0 (by omega)] - exact Submodule.zero_mem _ - -/-- There are no covariant monomials of weights one or two. -/ -lemma covMonomialSpan_le_bot_of_lt_three {m : ℕ} (hm1 : 1 ≤ m) (hm2 : m < 3) : - covMonomialSpan m ≤ ⊥ := by - rw [covMonomialSpan, Submodule.span_le] - rintro y ⟨hy, hym⟩ - rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ - · have h1 : ∀ c : ℂ, massWeightScale c (1 : JetAlgebra) = c ^ 0 • 1 := - fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one - have := eq_zero_of_eigen_ne h1 hym (by omega) - simp [this] - · rw [show y = 0 from eq_zero_of_eigen_ne hwe hym (by omega)] - simp - -/-! - -## The parity selection rule - -Every covariant monomial is an eigenvector of the constant gauge action with a -hypercharge character whose parity equals that of its mass weight: bosonic -generators have even weight and charge zero, fermionic generators odd weight -and charge `±6`. The constant gauge transformation with `u(0) = i` therefore -acts on odd-weight monomials by `-1`, and no odd-weight sector contains a -gauge invariant. - --/ - -/-- Every covariant monomial is an eigenvector of the constant gauge action, - with character exponent of the same parity as its mass weight. -/ -lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} - (hy : y ∈ Submonoid.closure invariantGenerators) : - ∃ (w : ℕ) (k : ℤ), k.natAbs ≤ w ∧ (w : ℤ) % 2 = k % 2 ∧ - (∀ c : ℂ, massWeightScale c y = c ^ w • y) ∧ - ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - (((g.2.2 : ℂ)) ^ (6 * k)) • y := by - have hz : ∀ g : GaugeGroupI, ((g.2.2 : ℂ)) ≠ 0 := by - intro g h - have h1 := (Unitary.mem_iff.mp (g.2.2).2).1 - rw [h, mul_zero] at h1 - exact zero_ne_one h1 - induction hy using Submonoid.closure_induction with - | mem z hzz => - rcases hzz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · refine ⟨4 + 2 * Multiset.card p.1, 0, by simp, by omega, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2, fun g => ?_⟩ - rw [repJetGaugeGroupI_fieldStrengthDeriv, mul_zero, zpow_zero, one_smul] - · refine ⟨3 + 2 * p.1.length, 1, by omega, by omega, - fun c => massWeightScale_Dψ c p.1 p.2, fun g => ?_⟩ - rw [repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, - SubmonoidClass.coe_pow, mul_one, - show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] - · refine ⟨3 + 2 * p.1.length, -1, by omega, by omega, - fun c => massWeightScale_Dbarψ c p.1 p.2, fun g => ?_⟩ - rw [repJetGaugeGroupI_Dbarψ, JetGaugeGroupI.eval_ofConstant, - Submonoid.smul_def, SubmonoidClass.coe_pow, Unitary.coe_star] - congr 1 - have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := - eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 - rw [hinv, show (6 : ℤ) * (-1) = -(6 : ℤ) from by ring, _root_.zpow_neg, - show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] - exact inv_pow _ 6 - | one => - refine ⟨0, 0, by simp, rfl, fun c => by - rw [pow_zero, one_smul]; exact (massWeightScale c).map_one, fun g => ?_⟩ - rw [mul_zero, zpow_zero, one_smul] - exact (repJetGaugeGroupI_eq_repAlgHom _ 1).trans - (repAlgHom (JetGaugeGroupI.ofConstant g)).map_one - | mul a b ha hb iha ihb => - obtain ⟨wa, ka, hba, hpa, hea, hga⟩ := iha - obtain ⟨wb, kb, hbb, hpb, heb, hgb⟩ := ihb - refine ⟨wa + wb, ka + kb, by - have := Int.natAbs_add_le ka kb - omega, by omega, massWeightScale_mul_eigen hea heb, fun g => ?_⟩ - rw [repJetGaugeGroupI_mul', hga g, hgb g, smul_mul_smul_comm, - show (6 : ℤ) * (ka + kb) = 6 * ka + 6 * kb from by ring, - zpow_add₀ (hz g)] - -/-- The constant gauge transformation with `u(0) = i`. -/ -noncomputable def parityGauge : GaugeGroupI := - (1, 1, ⟨Complex.I, by - rw [Unitary.mem_iff] - constructor <;> - simp [Complex.star_def, Complex.conj_I]⟩) - -/-- The parity gauge transformation acts by `-1` on every odd-weight covariant - monomial. -/ -lemma rep_parityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) - {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = -y := by - induction hy using Submodule.span_induction with - | mem u hu => - obtain ⟨hu1, hu2⟩ := hu - obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 - by_cases hu0 : u = 0 - · rw [hu0, map_zero, neg_zero] - · have hwm : w = m := by - by_contra hne - exact hu0 (eq_zero_of_eigen_ne he hu2 hne) - have hkodd : Odd k := by - rw [Int.odd_iff] - omega - rw [hg parityGauge, - show ((parityGauge.2.2 : ℂ)) = Complex.I from rfl, - show (6 : ℤ) * k = 2 * (3 * k) from by ring, _root_.zpow_mul, - show Complex.I ^ (2 : ℤ) = -1 from by - rw [show (2 : ℤ) = ((2 : ℕ) : ℤ) from rfl, zpow_natCast, Complex.I_sq], - show (-1 : ℂ) ^ (3 * k) = -1 from Odd.neg_one_zpow (by - rcases hkodd with ⟨j, hj⟩ - exact ⟨3 * j + 1, by omega⟩)] - exact neg_one_smul ℂ u - | zero => rw [map_zero, neg_zero] - | add u v hu hv ihu ihv => rw [map_add, ihu, ihv, neg_add] - | smul c u hu ihu => rw [map_smul, ihu, smul_neg] - -/-- Odd-weight covariant monomial spans contain no constant-gauge - invariants. -/ -lemma eq_zero_of_mem_covMonomialSpan_odd {m : ℕ} (hm : m % 2 = 1) - {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) - (hinv : repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = y) : - y = 0 := by - have h := (rep_parityGauge_eq_neg_of_mem_covMonomialSpan hm hy).symm.trans hinv - have h2 : (2 : ℂ) • y = 0 := by - calc (2 : ℂ) • y = y + y := two_smul ℂ y - _ = -y + y := congrArg (· + y) h.symm - _ = 0 := neg_add_cancel y - rcases smul_eq_zero.mp h2 with h3 | h3 - · exact absurd h3 two_ne_zero - · exact h3 - -/-! - -## The master selection rules - -An invariant which is also an eigenvector with a nontrivial eigenvalue must -vanish. Specialized to the constant gauge action at a root of unity this is the -hypercharge selection rule; specialized to diagonal Lorentz transformations it -kills the non-scalar Lorentz components. - --/ - -/-- The master selection rule: an element that scales by a factor other than - one vanishes. -/ -lemma eq_zero_of_eq_smul_of_ne_one {y : JetAlgebra} {c : ℂ} - (h1 : y = c • y) (hc : c ≠ 1) : y = 0 := by - have h2 : (c - 1) • y = 0 := - (sub_smul c 1 y).trans (by rw [one_smul, ← h1, sub_self]) - rcases smul_eq_zero.mp h2 with h3 | h3 - · exact absurd (sub_eq_zero.mp h3) hc - · exact h3 - -/-- The unit-circle exponential is unitary. -/ -lemma exp_mul_I_mem_unitary (θ : ℝ) : - Complex.exp ((θ : ℂ) * Complex.I) ∈ unitary ℂ := by - have hstar : star (Complex.exp ((θ : ℂ) * Complex.I)) = - Complex.exp (-((θ : ℂ) * Complex.I)) := by - rw [show star (Complex.exp ((θ : ℂ) * Complex.I)) = - (starRingEnd ℂ) (Complex.exp ((θ : ℂ) * Complex.I)) from rfl, - ← Complex.exp_conj] - congr 1 - simp [Complex.conj_ofReal] - rw [Unitary.mem_iff] - constructor - · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] - · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero] - -/-- The constant `U(1)` gauge transformation at a unitary scalar. -/ -noncomputable def u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : GaugeGroupI := - (1, 1, ⟨z, hz⟩) - -/-- The hypercharge selection rule: a constant-gauge eigenvector of nonzero - charge admits no invariant. -/ -lemma eq_zero_of_charge_ne_zero {y : JetAlgebra} {k : ℤ} (hk : k ≠ 0) - (hy : ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - ((g.2.2 : ℂ)) ^ (6 * k) • y) - (hinv : ∀ g : GaugeGroupI, - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : y = 0 := by - have h6k : ((6 * k : ℤ) : ℝ) ≠ 0 := by - simp only [ne_eq, Int.cast_eq_zero] - omega - set θ : ℝ := Real.pi / ((6 * k : ℤ) : ℝ) with hθ - set g : GaugeGroupI := u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) - (exp_mul_I_mem_unitary θ) with hg - have hval : ((g.2.2 : ℂ)) = Complex.exp ((θ : ℂ) * Complex.I) := rfl - have hchar : ((g.2.2 : ℂ)) ^ (6 * k) = -1 := by - rw [hval, ← Complex.exp_int_mul, - show ((6 * k : ℤ) : ℂ) * ((θ : ℂ) * Complex.I) = - (((6 * k : ℤ) : ℝ) * θ : ℝ) * Complex.I from by push_cast; ring, - show ((6 * k : ℤ) : ℝ) * θ = Real.pi from mul_div_cancel₀ Real.pi h6k ▸ rfl] - exact Complex.exp_pi_mul_I - exact eq_zero_of_eq_smul_of_ne_one - ((hinv g).symm.trans ((hy g).trans (by rw [hchar]))) - (by - intro h - norm_num at h) - -/-! - -## Charge decomposition - -The constant gauge characters at distinct charges are linearly independent -along the unit circle, so every element of a weight sector decomposes into -charge components, and a constant-gauge invariant equals its neutral component. - --/ - -/-- The unit-circle exponentials are injective on `(0, 1)`. -/ -lemma exp_mul_I_injOn : - Set.InjOn (fun θ : ℝ => Complex.exp ((θ : ℂ) * Complex.I)) - (Set.Ioo (0 : ℝ) 1) := by - intro a ha b hb hab - rcases Complex.exp_eq_exp_iff_exists_int.mp hab with ⟨n, hn⟩ - have h2 : (a : ℂ) = (b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ)) := by - have h1 : (a : ℂ) * Complex.I = - ((b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ))) * Complex.I := by - rw [hn] - ring - exact mul_right_cancel₀ Complex.I_ne_zero h1 - have h3 : a = b + (n : ℝ) * (2 * Real.pi) := by exact_mod_cast h2 - have hn0 : n = 0 := by - by_contra hne - have h4 : (1 : ℝ) ≤ |(n : ℝ)| := by exact_mod_cast Int.one_le_abs hne - have hπ : (2 : ℝ) ≤ Real.pi := Real.two_le_pi - have h5 : |a - b| < 1 := by - rw [abs_sub_lt_iff] - constructor <;> nlinarith [ha.1, ha.2, hb.1, hb.2] - rw [h3] at h5 - simp only [add_sub_cancel_left] at h5 - rw [abs_mul, abs_of_pos (by positivity : (0 : ℝ) < 2 * Real.pi)] at h5 - nlinarith - rw [hn0] at h3 - push_cast at h3 - linarith - -/-- Independence of the circle characters: a finite Laurent combination - vanishing on the unit circle has vanishing coefficients. -/ -lemma eq_zero_of_forall_circle_sum_zpow_smul_eq_zero (s : Finset ℤ) - (v : ℤ → JetAlgebra) - (h : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0) - {k : ℤ} (hk : k ∈ s) : v k = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hne : s.Nonempty := ⟨k, hk⟩ - set n₀ : ℤ := -s.min' hne with hn₀ - have hshift : ∀ j ∈ s, 0 ≤ j + n₀ := fun j hj => by - have := s.min'_le j hj - omega - have heval : ∀ θ : ℝ, Polynomial.eval (Complex.exp ((θ : ℂ) * Complex.I)) - (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by - intro θ - have hz0 : Complex.exp ((θ : ℂ) * Complex.I) ≠ 0 := Complex.exp_ne_zero _ - have h2 := congrArg φ (h θ) - rw [map_sum, map_zero] at h2 - have h3 : ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by - rw [← h2] - exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl - have h4 : Complex.exp ((θ : ℂ) * Complex.I) ^ n₀ * - ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by - rw [h3, mul_zero] - rw [Finset.mul_sum] at h4 - rw [Polynomial.eval_finsetSum, ← h4] - refine Finset.sum_congr rfl fun j hj => ?_ - rw [Polynomial.eval_monomial, - show Complex.exp ((θ : ℂ) * Complex.I) ^ (j + n₀).toNat = - Complex.exp ((θ : ℂ) * Complex.I) ^ ((j + n₀) : ℤ) from by - rw [← zpow_natCast, Int.toNat_of_nonneg (hshift j hj)], - zpow_add₀ hz0] - ring - have hzero : (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by - refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ - refine Set.Infinite.mono ?_ - ((Set.Ioo_infinite (by norm_num : (0 : ℝ) < 1)).image exp_mul_I_injOn) - rintro z ⟨θ, _, rfl⟩ - exact heval θ - have hcoeff := congrArg (fun p => Polynomial.coeff p (k + n₀).toNat) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - rw [Finset.sum_eq_single k - (fun j hj hjk => by - rw [Polynomial.coeff_monomial, if_neg (fun heq => hjk (by - have h1 : j + n₀ = k + n₀ := by - rw [← Int.toNat_of_nonneg (hshift j hj), - ← Int.toNat_of_nonneg (hshift k hk), heq] - omega))]) - (fun hks => absurd hk hks)] at hcoeff - simpa [Polynomial.coeff_monomial] using hcoeff - -/-- The charge-`6k` part of a weight sector: the span of the covariant - monomials of weight `m` and hypercharge `6 k`. -/ -noncomputable def chargeCovSpan (m : ℕ) (k : ℤ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ - (∀ c : ℂ, massWeightScale c y = c ^ m • y) ∧ - ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - ((g.2.2 : ℂ)) ^ (6 * k) • y} - -/-- Elements of the charge component are eigenvectors of the constant gauge - action. -/ -lemma forall_rep_ofConstant_of_mem_chargeCovSpan {m : ℕ} {k : ℤ} - {y : JetAlgebra} (hy : y ∈ chargeCovSpan m k) (g : GaugeGroupI) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - ((g.2.2 : ℂ)) ^ (6 * k) • y := by - induction hy using Submodule.span_induction with - | mem u hu => exact hu.2.2 g - | zero => simp - | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] - | smul c a ha iha => rw [map_smul, iha, smul_comm] - -/-- The charge components sit inside the weight sector. -/ -lemma chargeCovSpan_le_covMonomialSpan {m : ℕ} {k : ℤ} : - chargeCovSpan m k ≤ covMonomialSpan m := - Submodule.span_mono fun y hy => ⟨hy.1, hy.2.1⟩ - -/-- Charge decomposition within a weight sector. -/ -lemma exists_charge_decomp_of_mem_covMonomialSpan {m : ℕ} {y : JetAlgebra} - (hy : y ∈ covMonomialSpan m) : - ∃ v : ℤ → JetAlgebra, (∀ j, v j ∈ chargeCovSpan m j) ∧ - y = ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), v j := by - induction hy using Submodule.span_induction with - | mem u hu => - obtain ⟨hu1, hu2⟩ := hu - obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 - by_cases hu0 : u = 0 - · exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp [hu0]⟩ - · have hwm : w = m := by - by_contra hne - exact hu0 (eq_zero_of_eigen_ne he hu2 hne) - have hkm : k ∈ Finset.Icc (-(m : ℤ)) (m : ℤ) := by - rw [Finset.mem_Icc] - omega - refine ⟨fun j => if j = k then u else 0, fun j => ?_, ?_⟩ - · show (if j = k then u else 0) ∈ chargeCovSpan m j - by_cases hjk : j = k - · subst hjk - rw [if_pos rfl] - exact Submodule.subset_span ⟨hu1, hu2, hg⟩ - · rw [if_neg hjk] - exact Submodule.zero_mem _ - · rw [show (∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), - (fun j => if j = k then u else 0) j) = - ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), (if j = k then u else 0) from rfl, - Finset.sum_ite_eq' _ k fun _ => u, if_pos hkm] - | zero => - exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp⟩ - | add a b ha hb iha ihb => - obtain ⟨v₁, hv₁, rfl⟩ := iha - obtain ⟨v₂, hv₂, rfl⟩ := ihb - exact ⟨v₁ + v₂, fun j => Submodule.add_mem _ (hv₁ j) (hv₂ j), - by rw [← Finset.sum_add_distrib]; rfl⟩ - | smul c a ha iha => - obtain ⟨v, hv, rfl⟩ := iha - exact ⟨c • v, fun j => Submodule.smul_mem _ _ (hv j), - by rw [Finset.smul_sum]; rfl⟩ - -/-- The neutral-charge selection rule: a constant-gauge-invariant element of a - weight sector lies in the charge-zero component, since the characters - `u ↦ u^{6j}` of distinct charges are linearly independent along the unit - circle. -/ -lemma mem_chargeCovSpan_zero_of_invariant {m : ℕ} {y : JetAlgebra} - (hy : y ∈ covMonomialSpan m) - (hinv : ∀ g : GaugeGroupI, - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : - y ∈ chargeCovSpan m 0 := by - obtain ⟨v, hv, hyeq⟩ := exists_charge_decomp_of_mem_covMonomialSpan hy - set S : Finset ℤ := Finset.Icc (-(m : ℤ)) (m : ℤ) with hS - have hchar : ∀ θ : ℝ, ∑ j ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * j) • - v j = ∑ j ∈ S, v j := by - intro θ - have hval : (((u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) - (exp_mul_I_mem_unitary θ)).2.2 : ℂ)) = - Complex.exp ((θ : ℂ) * Complex.I) := rfl - have h1 := hinv (u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) - (exp_mul_I_mem_unitary θ)) - rw [hyeq, map_sum] at h1 - rw [← h1] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [forall_rep_ofConstant_of_mem_chargeCovSpan (hv j), hval] - have hkill : ∀ j ∈ S, j ≠ 0 → v j = 0 := by - intro j hj hj0 - have h6 : Function.Injective (fun k : ℤ => 6 * k) := fun a b hab => by - simpa using hab - set w : ℤ → JetAlgebra := fun k => v (k / 6) - - (if k = 0 then ∑ i ∈ S, v i else 0) with hw - have hzero : ∀ θ : ℝ, ∑ k ∈ S.image (fun j => 6 * j), - (Complex.exp ((θ : ℂ) * Complex.I)) ^ k • w k = 0 := by - intro θ - rw [Finset.sum_image fun a _ b _ h => h6 h] - have hterm : ∀ i ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • - w (6 * i) = (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • v i - - (if i = 0 then ∑ i ∈ S, v i else 0) := by - intro i _ - rw [hw] - simp only [Int.mul_ediv_cancel_left i (by norm_num : (6 : ℤ) ≠ 0), - show 6 * i = 0 ↔ i = 0 from by omega] - by_cases hi : i = 0 - · rw [if_pos hi, smul_sub, hi] - norm_num - · rw [if_neg hi] - simp - rw [Finset.sum_congr rfl hterm, Finset.sum_sub_distrib, hchar θ, - Finset.sum_ite_eq' S (0 : ℤ) fun _ => ∑ i ∈ S, v i, - if_pos (by simp [hS] : (0 : ℤ) ∈ S), sub_self] - have h0 := eq_zero_of_forall_circle_sum_zpow_smul_eq_zero _ _ hzero - (Finset.mem_image_of_mem (fun j => 6 * j) hj) - rw [hw] at h0 - simpa [Int.mul_ediv_cancel_left j (by norm_num : (6 : ℤ) ≠ 0), - show ¬ (6 * j = 0) from by omega] using h0 - have hy0 : y = v 0 := by - rw [hyeq, Finset.sum_eq_single 0 (fun j hj hj0 => hkill j hj hj0) - (fun h => absurd (by simp [hS] : (0 : ℤ) ∈ S) h)] - rw [hy0] - exact hv 0 - -/-! - -## The Lorentz analysis of the neutral sectors - -TODO: the remaining sector lemmas. The charge-zero covariant monomials of -weight four are the field strengths `F_{μν}`, of weight six the derivatives -`∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β`, of weight eight the products -`F F`, the second derivatives `∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion -pairs. Lorentz invariance kills the weight-four and weight-six sectors and -reduces the weight-eight sector to the span of the Maxwell term, the theta -term, and the two fermion kinetic terms. - --/ - -/-- Each invariant generator is a weight eigenvector of weight at least - three. -/ -lemma exists_weight_of_mem_invariantGenerators {g : JetAlgebra} - (hg : g ∈ invariantGenerators) : - ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c g = c ^ w • g := by - rcases hg with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact ⟨4 + 2 * Multiset.card p.1, by omega, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dψ c p.1 p.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ - -/-- The product of a list of invariant generators is a weight eigenvector of - weight at least three times the length. -/ -lemma exists_weight_of_list_prod {l : List JetAlgebra} - (hl : ∀ g ∈ l, g ∈ invariantGenerators) : - ∃ w, 3 * l.length ≤ w ∧ - ∀ c : ℂ, massWeightScale c l.prod = c ^ w • l.prod := by - induction l with - | nil => - exact ⟨0, by simp, fun c => by - rw [List.prod_nil, pow_zero, one_smul] - exact (massWeightScale c).map_one⟩ - | cons g l ih => - obtain ⟨wg, hwg3, hwg⟩ := exists_weight_of_mem_invariantGenerators - (hl g List.mem_cons_self) - obtain ⟨wl, hwl3, hwl⟩ := ih fun x hx => hl x (List.mem_cons_of_mem g hx) - refine ⟨wg + wl, by simp only [List.length_cons]; omega, fun c => ?_⟩ - rw [List.prod_cons] - exact massWeightScale_mul_eigen hwg hwl c - -/-- The constant gauge character of a product of two lepton factors: charge - two. -/ -lemma rep_ofConstant_Dψ_mul_Dψ (g : GaugeGroupI) (l l' : List (Fin 1 ⊕ Fin 3)) - (α β : Fin 2) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dψ l α * Dψ l' β) = - ((g.2.2 : ℂ)) ^ (6 * (2 : ℤ)) • (Dψ l α * Dψ l' β) := by - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, - JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, - SubmonoidClass.coe_pow, smul_mul_smul_comm, ← pow_add, - show (6 * (2 : ℤ)) = ((12 : ℕ) : ℤ) from rfl, zpow_natCast] - -/-- The constant gauge character of a product of two conjugate lepton factors: - charge minus two. -/ -lemma rep_ofConstant_Dbarψ_mul_Dbarψ (g : GaugeGroupI) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dbarψ l α * Dbarψ l' β) = - ((g.2.2 : ℂ)) ^ (6 * (-2 : ℤ)) • (Dbarψ l α * Dbarψ l' β) := by - have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := - eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, - JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, - SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← pow_add, - hinv, inv_pow, show (6 + 6 : ℕ) = 12 from rfl, - show (6 * (-2 : ℤ)) = -((12 : ℕ) : ℤ) from rfl, _root_.zpow_neg, zpow_natCast] - -/-- The weight-four neutral sector: spanned by the embedded field strengths. -/ -lemma chargeCovSpan_four_le : - chargeCovSpan 4 0 ≤ Submodule.span ℂ - (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {} p.1 p.2) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, -⟩ - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', t⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 0 - · rw [Multiset.card_eq_zero.mp hcard] - exact Submodule.subset_span ⟨(p.2.1, p.2.2), rfl⟩ - · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - rw [eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega)] - exact Submodule.zero_mem _ - -set_option maxHeartbeats 4000000 in -/-- The weight-six neutral sector: spanned by the first derivatives of the - field strength and the zero-derivative lepton pairs. -/ -lemma chargeCovSpan_six_le : - chargeCovSpan 6 0 ≤ Submodule.span ℂ - ((Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {p.1} p.2.1 p.2.2) ∪ - (Set.range fun p : Fin 2 × Fin 2 => Dbarψ [] p.1 * Dψ [] p.2) ∪ - (Set.range fun p : Fin 2 × Fin 2 => Dψ [] p.1 * Dbarψ [] p.2)) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, hy3⟩ - simp only [mul_zero, zpow_zero, one_smul] at hy3 - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 1 - · obtain ⟨ρ, hρ⟩ := Multiset.card_eq_one.mp hcard - rw [hρ] - exact Submodule.subset_span (Or.inl (Or.inl ⟨(ρ, p.2.1, p.2.2), rfl⟩)) - · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with - (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> - dsimp only at hy2 hy3 ⊢ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) - (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 - · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] - exact Submodule.subset_span (Or.inr ⟨(p.2, q.2), rfl⟩) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 - · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] - exact Submodule.subset_span (Or.inl (Or.inr ⟨(p.2, q.2), rfl⟩)) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) - (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - rw [eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega)] - exact Submodule.zero_mem _ - -set_option maxHeartbeats 4000000 in -/-- The weight-eight neutral sector: spanned by the field-strength squares, the - second derivatives of the field strength, and the one-derivative lepton - pairs. -/ -lemma chargeCovSpan_eight_le : - chargeCovSpan 8 0 ≤ Submodule.span ℂ - ((Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × - (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {} p.1.1 p.1.2 * fieldStrengthDeriv {} p.2.1 p.2.2) ∪ - (Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × - (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {p.1.1, p.1.2} p.2.1 p.2.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dbarψ [] p.1.1 * Dψ [p.2] p.1.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dψ [p.2] p.1.2 * Dbarψ [] p.1.1) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dψ [] p.1.1 * Dbarψ [p.2] p.1.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dbarψ [p.2] p.1.2 * Dψ [] p.1.1)) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, hy3⟩ - simp only [mul_zero, zpow_zero, one_smul] at hy3 - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 2 - · obtain ⟨ρ, τ, hρτ⟩ := Multiset.card_eq_two.mp hcard - rw [hρτ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl - (Or.inr ⟨((ρ, τ), p.2.1, p.2.2), rfl⟩))))) - · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with - (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> - dsimp only at hy2 hy3 ⊢ - · by_cases hcard : Multiset.card p.1 = 0 ∧ Multiset.card q.1 = 0 - · rw [Multiset.card_eq_zero.mp hcard.1, Multiset.card_eq_zero.mp hcard.2] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl - (Or.inl ⟨((p.2.1, p.2.2), q.2.1, q.2.2), rfl⟩))))) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) - (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 - rw [List.length_eq_zero_iff.mp hlen.1, hμ] - exact Submodule.subset_span (Or.inl (Or.inr ⟨((p.2, q.2), μ), rfl⟩)) - · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 - rw [List.length_eq_zero_iff.mp hlen'.2, hμ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inr - ⟨((q.2, p.2), μ), rfl⟩))) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 - rw [List.length_eq_zero_iff.mp hlen.1, hμ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inr - ⟨((p.2, q.2), μ), rfl⟩)))) - · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 - rw [List.length_eq_zero_iff.mp hlen'.2, hμ] - exact Submodule.subset_span (Or.inr ⟨((q.2, p.2), μ), rfl⟩) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) - (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · have h0 : (g :: g' :: g'' :: t).prod = 0 := by - obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - exact eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega) - exact Set.mem_of_eq_of_mem h0 (Submodule.zero_mem _) - -/-! - -### The parity rotations - -The three rotations by `π` about the coordinate axes lift to `SL(2,ℂ)` as -`i σ_k`; their Lorentz matrices are the diagonal sign matrices fixing the time -axis and the rotation axis and reversing the two others. Averaging over this -Klein four-group kills every tensor component with an odd index pattern; since -every antisymmetric index pair is odd under exactly two of the three parities, -the weight-four sector admits no invariant. - --/ - -/-- The lift `diag(i, -i)` of the rotation by `π` about the `z`-axis. -/ -noncomputable def parityZ : SL(2,ℂ) := - ⟨!![Complex.I, 0; 0, -Complex.I], by - simp [Matrix.det_fin_two_of]⟩ - -/-- The lift `i σ1` of the rotation by `π` about the `x`-axis. -/ -noncomputable def parityX : SL(2,ℂ) := - ⟨!![0, Complex.I; Complex.I, 0], by - simp [Matrix.det_fin_two_of]⟩ - -/-- The lift `i σ2` of the rotation by `π` about the `y`-axis. -/ -noncomputable def parityY : SL(2,ℂ) := - ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ - -/-- The sign pattern of the rotation by `π` about the `z`-axis. -/ -def paritySignZ : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => -1 - | Sum.inr 1 => -1 - | Sum.inr 2 => 1 - -/-- The sign pattern of the rotation by `π` about the `x`-axis. -/ -def paritySignX : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => 1 - | Sum.inr 1 => -1 - | Sum.inr 2 => -1 - -/-- The sign pattern of the rotation by `π` about the `y`-axis. -/ -def paritySignY : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => -1 - | Sum.inr 1 => 1 - | Sum.inr 2 => -1 - -/-- The Lorentz matrix of the `z`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_parityZ (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup parityZ).1 a b = - if a = b then paritySignZ a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [parityZ, paritySignZ, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- The Lorentz matrix of the `x`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_parityX (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup parityX).1 a b = - if a = b then paritySignX a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [parityX, paritySignX, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- The Lorentz matrix of the `y`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_parityY (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup parityY).1 a b = - if a = b then paritySignY a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [parityY, paritySignY, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- Under a diagonal Lorentz transformation the field strength scales by the - product of the signs of its two indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {} μ ν) = - ((sgn μ * sgn ν : ℝ) : ℂ) • fieldStrengthDeriv {} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_nil] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] - -/-- The field strength vanishes on a repeated index. -/ -lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ μ = 0 := by - have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = - [JetGenerators.dB (s + {μ}) μ]ₐ - [JetGenerators.dB (s + {μ}) μ]ₐ := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] - rfl - rw [h, sub_self] - -set_option maxHeartbeats 2000000 in -/-- No Lorentz invariant of mass weight four: an invariant combination of the - field strengths `F_{μν}` vanishes, since every antisymmetric index pair is - odd under two of the three parity rotations. -/ -lemma eq_zero_of_mem_chargeCovSpan_four {y : JetAlgebra} - (hy : y ∈ chargeCovSpan 4 0) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by - obtain ⟨c, hc⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp - (chargeCovSpan_four_le hy) - have h4 : ((4 : ℂ)⁻¹ • (y + repLorentzGroup parityZ y + - repLorentzGroup parityY y + repLorentzGroup parityX y)) = y := by - rw [hinv, hinv, hinv] - module - rw [← h4, ← hc, map_sum, map_sum, map_sum] - simp only [map_smul, repLorentzGroup_diag_fieldStrengthDeriv - toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX] - rw [← Finset.sum_add_distrib, ← Finset.sum_add_distrib, - ← Finset.sum_add_distrib, Finset.smul_sum] - refine Finset.sum_eq_zero fun p _ => ?_ - rcases eq_or_ne p.1 p.2 with hp | hp - · rw [hp, fieldStrengthDeriv_self] - simp - · rw [smul_smul, smul_smul, smul_smul, ← add_smul, ← add_smul, ← add_smul, - smul_smul] - rw [show ((4 : ℂ)⁻¹ * (c p + c p * ((paritySignZ p.1 * paritySignZ p.2 : ℝ) : ℂ) + - c p * ((paritySignY p.1 * paritySignY p.2 : ℝ) : ℂ) + - c p * ((paritySignX p.1 * paritySignX p.2 : ℝ) : ℂ))) = 0 from by - rcases p with ⟨μ, ν⟩ - rcases μ with μ | μ <;> rcases ν with ν | ν <;> - first - | (exact absurd rfl (by simpa using hp)) - | (fin_cases μ <;> fin_cases ν <;> - simp_all [paritySignZ, paritySignY, paritySignX] <;> - norm_num [Complex.ext_iff] <;> ring)] - rw [zero_smul] - -/-! - -### The transformation law of the derivative field strength - --/ - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on the two-derivative-index B-boson jet coordinates: - all three indices transform contravariantly, by the columns of the Lorentz - matrix. -/ -lemma _root_.StandardModel.BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair - (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetComponentSpace.repLorentzGroup Λ - (BBoson.JetComponentSpace.basis (.dB {ρ, μ} ν)) = - ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • - BBoson.JetComponentSpace.basis (.dB {r, a} b) := by - have hpair : ∀ x y : Fin 1 ⊕ Fin 3, - LagrangianTheory.dualRealJetAlgebraBasis ({x, y} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis x) * - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis y) := fun x y => by - rw [← BBoson.dualRealJetAlgebraBasis_singleton, - ← BBoson.dualRealJetAlgebraBasis_singleton, - BBoson.dualRealJetAlgebraBasis_mul, Multiset.singleton_add, - ← Multiset.insert_eq_cons] - have hmul : ∀ x y : DerivAlgebraReal, - DerivAlgebraReal.repLorentzGroup Λ (x * y) = - DerivAlgebraReal.repLorentzGroup Λ x * - DerivAlgebraReal.repLorentzGroup Λ y := fun x y => - map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - Lorentz.CoVector.sl2Rep.dual Λ)) x y - have happ : BBoson.JetComponentSpace.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ} ⊗ₜ[ℝ] - StandardModel.BBoson.basis.dualBasis ν) = - (DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ})) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ - (StandardModel.BBoson.basis.dualBasis ν)) := rfl - rw [BBoson.jetComponentSpace_basis_dB, happ, hpair, hmul, - DerivAlgebraReal.repLorentzGroup_apply_ι, - DerivAlgebraReal.repLorentzGroup_apply_ι, - Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, - BBoson.repLorentzGroup_dual_dualBasis] - simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, - smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, - ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, - smul_smul, BBoson.jetComponentSpace_basis_dB, hpair] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, j]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => - Finset.sum_congr rfl fun b _ => ?_ - module - -set_option maxHeartbeats 2000000 in -/-- The transformation law of the first-derivative field strength on the - B-boson jet algebra: a three-index tensor. -/ -lemma _root_.StandardModel.BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_singleton - (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = - ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • - BBoson.JetAlgebra.fieldStrengthDeriv {r} a b := by - have hFS : ∀ r a b : Fin 1 ⊕ Fin 3, - BBoson.JetAlgebra.fieldStrengthDeriv ({r} : Multiset _) a b = - BBoson.JetAlgebra.ofGenerator (.dB {r, a} b) - - BBoson.JetAlgebra.ofGenerator (.dB {r, b} a) := fun r a b => by - rw [BBoson.JetAlgebra.fieldStrengthDeriv, - show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, a} from by - rw [Multiset.singleton_add, ← Multiset.insert_eq_cons], - show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, b} from by - rw [Multiset.singleton_add, ← Multiset.insert_eq_cons]] - simp only [hFS] - rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair] - simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, - BBoson.JetAlgebra.ofGenerator] - rw [sub_right_inj] - conv_rhs => enter [2, r]; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => - Finset.sum_congr rfl fun b _ => ?_ - congr 1 - ring - -/-- The transformation of the complexified first-derivative field strength. -/ -lemma _root_.StandardModel.BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton - (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = - ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r} a b) := by - rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) from rfl, - BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_singleton] - simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] - -/-- The transformation law of the embedded first-derivative field strength: - a three-index tensor, all indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_singleton (Λ : SL(2,ℂ)) - (ρ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {ρ} μ ν) = - ∑ r, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) : ℝ)) : ℂ) • - fieldStrengthDeriv {r} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] - -/-- Under a diagonal Lorentz transformation the derivative field strength - scales by the product of the signs of its three indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv_singleton {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (ρ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {ρ} μ ν) = - ((sgn ρ * (sgn μ * sgn ν) : ℝ) : ℂ) • fieldStrengthDeriv {ρ} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_singleton] - rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun a _ => - Finset.sum_eq_zero fun b _ => by - rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ρ) h)] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM ρ ρ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] - -/-- Antisymmetry of the embedded field-strength derivatives in the two field - indices. -/ -lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s ν μ = - fieldStrengthDeriv s μ ν := by - have h : ∀ a b : Fin 1 ⊕ Fin 3, (fieldStrengthDeriv s a b : JetAlgebra) = - [JetGenerators.dB (s + {a}) b]ₐ - [JetGenerators.dB (s + {b}) a]ₐ := by - intro a b - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] - rfl - rw [h, h, neg_sub] - -/-- The canonical orientation of a mixed field-strength component: the time - index first. -/ -lemma fieldStrengthDeriv_inr_inl (s : Multiset (Fin 1 ⊕ Fin 3)) (i : Fin 3) - (j : Fin 1) : - fieldStrengthDeriv s (Sum.inr i) (Sum.inl j) = - - fieldStrengthDeriv s (Sum.inl j) (Sum.inr i) := - fieldStrengthDeriv_antisymm s (Sum.inl j) (Sum.inr i) - -/-! - -### The boosts along the `z`-axis - -Two diagonal boosts `diag(t, t⁻¹)` with `t = 2, 3`. Together with the Klein -four-group of parity rotations they suffice to kill the neutral weight-six -sector: the Klein average projects onto the twelve surviving field-strength -components and the diagonal fermion pairs, and a rational combination of the -two boosts (with weights summing to one) annihilates all of them. - --/ - -/-- The lift `diag(2, 1/2)` of the boost along the `z`-axis with rapidity - `log 4`. -/ -noncomputable def boostA : SL(2,ℂ) := - ⟨!![2, 0; 0, 2⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ - -/-- The lift `diag(3, 1/3)` of the boost along the `z`-axis with rapidity - `log 9`. -/ -noncomputable def boostB : SL(2,ℂ) := - ⟨!![3, 0; 0, 3⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ - -/-- The Lorentz matrix of `boostA`. -/ -noncomputable def boostMatA : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => 17/8 - | Sum.inl _, Sum.inr 2 => -(15/8) - | Sum.inr 2, Sum.inl _ => -(15/8) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 17/8 - | _, _ => 0 - -/-- The Lorentz matrix of `boostB`. -/ -noncomputable def boostMatB : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => 41/9 - | Sum.inl _, Sum.inr 2 => -(40/9) - | Sum.inr 2, Sum.inl _ => -(40/9) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 41/9 - | _, _ => 0 - -set_option maxHeartbeats 2000000 in -/-- The Lorentz matrix of the first boost. -/ -lemma toLorentzGroup_boostA (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup boostA).1 a b = boostMatA a b := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostA, boostMatA, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try norm_num [Complex.ext_iff] - -set_option maxHeartbeats 2000000 in -/-- The Lorentz matrix of the second boost. -/ -lemma toLorentzGroup_boostB (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup boostB).1 a b = boostMatB a b := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostB, boostMatB, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try norm_num [Complex.ext_iff] - -/-- The inverse of the `z`-parity, entrywise. -/ -lemma parityZ_inv_coe : - (parityZ⁻¹ : SL(2,ℂ)).1 = !![-Complex.I, 0; 0, Complex.I] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [parityZ] - -/-- The inverse of the `y`-parity, entrywise. -/ -lemma parityY_inv_coe : - (parityY⁻¹ : SL(2,ℂ)).1 = !![0, -1; 1, 0] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [parityY] - -/-- The inverse of the `x`-parity, entrywise. -/ -lemma parityX_inv_coe : - (parityX⁻¹ : SL(2,ℂ)).1 = !![0, -Complex.I; -Complex.I, 0] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [parityX] - -/-- The inverse of the first boost, entrywise, with real entries. -/ -lemma boostA_inv_coe : - (boostA⁻¹ : SL(2,ℂ)).1 = !![((2⁻¹ : ℝ) : ℂ), 0; 0, ((2 : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostA] - -/-- The inverse of the second boost, entrywise, with real entries. -/ -lemma boostB_inv_coe : - (boostB⁻¹ : SL(2,ℂ)).1 = !![((3⁻¹ : ℝ) : ℂ), 0; 0, ((3 : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostB] - -/-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ -lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = - ∑ γ, ∑ δ, ((Λ⁻¹).1 α γ * star ((Λ⁻¹).1 β δ)) • - (Dbarψ [] γ * Dψ [] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] - simp only [hsm, hms, hsmul] - -/-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ -lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : - repLorentzGroup Λ (Dψ [] α * Dbarψ [] β) = - ∑ γ, ∑ δ, (star ((Λ⁻¹).1 α γ) * (Λ⁻¹).1 β δ) • - (Dψ [] γ * Dbarψ [] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] - simp only [hsm, hms, hsmul] - -/-! - -### The kill operator of the weight-six sector - --/ - -/-- The averaging operator over the Klein four-group of parity rotations. -/ -noncomputable def kleinAvg : Module.End ℂ JetAlgebra := - (4 : ℂ)⁻¹ • (LinearMap.id + repLorentzGroup parityZ + - repLorentzGroup parityY + repLorentzGroup parityX) - -/-- The boost-weighted Klein average: an operator fixing every - Lorentz-invariant vector and annihilating the neutral weight-six sector. - The weights `-13/24, 8/3, -9/8` sum to one and are chosen so that - `w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}` - respectively, killing both eigendirections of the two boosts. -/ -noncomputable def sixKill : Module.End ℂ JetAlgebra := - ((-13/24 : ℂ) • LinearMap.id + (8/3 : ℂ) • repLorentzGroup boostA + - (-9/8 : ℂ) • repLorentzGroup boostB) ∘ₗ kleinAvg - -/-- The Klein average, termwise. -/ -lemma kleinAvg_apply (v : JetAlgebra) : - kleinAvg v = (4 : ℂ)⁻¹ • (v + repLorentzGroup parityZ v + - repLorentzGroup parityY v + repLorentzGroup parityX v) := by - simp only [kleinAvg, LinearMap.smul_apply, LinearMap.add_apply, - LinearMap.id_apply] - -/-- The kill operator, termwise. -/ -lemma sixKill_apply (v : JetAlgebra) : - sixKill v = (-13/24 : ℂ) • kleinAvg v + - (8/3 : ℂ) • repLorentzGroup boostA (kleinAvg v) + - (-9/8 : ℂ) • repLorentzGroup boostB (kleinAvg v) := by - simp only [sixKill, LinearMap.comp_apply, LinearMap.add_apply, - LinearMap.smul_apply, LinearMap.id_apply] - -set_option maxHeartbeats 8000000 in -/-- The kill operator annihilates every embedded derivative field strength: - the Klein average kills every component with an odd index pattern, and the - boost combination kills the twelve surviving components. -/ -lemma sixKill_fieldStrengthDeriv_singleton (ρ μ ν : Fin 1 ⊕ Fin 3) : - sixKill (fieldStrengthDeriv {ρ} μ ν) = 0 := by - rcases eq_or_ne μ ν with rfl | hμν - · rw [fieldStrengthDeriv_self] - exact map_zero _ - · have hK : kleinAvg (fieldStrengthDeriv {ρ} μ ν) = - (((1 + paritySignZ ρ * (paritySignZ μ * paritySignZ ν) + - paritySignY ρ * (paritySignY μ * paritySignY ν) + - paritySignX ρ * (paritySignX μ * paritySignX ν)) / 4 : ℝ) : ℂ) • - fieldStrengthDeriv {ρ} μ ν := by - rw [kleinAvg_apply, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityX] - push_cast - module - rw [sixKill_apply, hK, map_smul, map_smul] - rcases ρ with ρ | ρ <;> rcases μ with μ | μ <;> rcases ν with ν | ν <;> - fin_cases ρ <;> fin_cases μ <;> fin_cases ν <;> - first - | (simp only [fieldStrengthDeriv_self, map_zero, smul_zero, add_zero]; done) - | (norm_num [paritySignZ, paritySignY, paritySignX]; done) - | (norm_num [paritySignZ, paritySignY, paritySignX] - rw [repLorentzGroup_fieldStrengthDeriv_singleton boostA, - repLorentzGroup_fieldStrengthDeriv_singleton boostB] - simp only [Fintype.sum_sum_type, Fin.sum_univ_three, Fin.sum_univ_one, - toLorentzGroup_boostA, toLorentzGroup_boostB] - norm_num [boostMatA, boostMatB, fieldStrengthDeriv_self, - fieldStrengthDeriv_inr_inl] - push_cast - module) - -set_option maxHeartbeats 4000000 in -/-- The kill operator annihilates every zero-derivative pair `ψ̄_α ψ_β`: the - Klein average kills the off-diagonal pairs and symmetrises the diagonal - ones, which the boost combination then kills. -/ -lemma sixKill_Dbarψ_mul_Dψ (α β : Fin 2) : - sixKill (Dbarψ [] α * Dψ [] β) = 0 := by - rw [sixKill_apply, kleinAvg_apply] - fin_cases α <;> fin_cases β <;> - · simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, map_add, map_smul, - map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, - Fin.mk_one, Matrix.of_apply, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, - star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, - Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, - neg_neg, - zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, - Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] - try push_cast - try module - -set_option maxHeartbeats 4000000 in -/-- The kill operator annihilates every zero-derivative pair `ψ_α ψ̄_β`. -/ -lemma sixKill_Dψ_mul_Dbarψ (α β : Fin 2) : - sixKill (Dψ [] α * Dbarψ [] β) = 0 := by - rw [sixKill_apply, kleinAvg_apply] - fin_cases α <;> fin_cases β <;> - · simp only [repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, map_add, map_smul, - map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, - Fin.mk_one, Matrix.of_apply, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, - star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, - Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, - neg_neg, - zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, - Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] - try push_cast - try module - -/-- No Lorentz invariant of mass weight six: an invariant combination of the - field-strength derivatives `∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β` - vanishes. -/ -lemma eq_zero_of_mem_chargeCovSpan_six {y : JetAlgebra} - (hy : y ∈ chargeCovSpan 6 0) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by - have h := chargeCovSpan_six_le hy - rw [Submodule.span_union, Submodule.span_union] at h - obtain ⟨u, hu, w, hw, hy'⟩ := Submodule.mem_sup.mp h - obtain ⟨u1, hu1, u2, hu2, hu'⟩ := Submodule.mem_sup.mp hu - obtain ⟨a, ha⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu1 - obtain ⟨d, hd⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu2 - obtain ⟨e, he⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw - have hKy : kleinAvg y = y := by - rw [kleinAvg_apply, hinv parityZ, hinv parityY, hinv parityX] - module - have hself : sixKill y = y := by - rw [sixKill_apply, hKy, hinv boostA, hinv boostB] - module - have hkill : sixKill y = 0 := by - rw [← hy', ← hu', ← ha, ← hd, ← he] - simp only [map_add, map_sum, map_smul, sixKill_fieldStrengthDeriv_singleton, - sixKill_Dbarψ_mul_Dψ, sixKill_Dψ_mul_Dbarψ, smul_zero, - Finset.sum_const_zero, add_zero] - exact hself.symm.trans hkill - -/-! - -### The transformation law of the second-derivative field strength - --/ - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on the three-derivative-index B-boson jet coordinates: - all four indices transform contravariantly, by the columns of the Lorentz - matrix. -/ -lemma _root_.StandardModel.BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple - (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetComponentSpace.repLorentzGroup Λ - (BBoson.JetComponentSpace.basis (.dB {ρ, τ, μ} ν)) = - ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • - BBoson.JetComponentSpace.basis (.dB {r, s, a} b) := by - have htriple : ∀ x y z : Fin 1 ⊕ Fin 3, - LagrangianTheory.dualRealJetAlgebraBasis ({x, y, z} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis x) * - (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis y) * - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis z)) := fun x y z => by - rw [← BBoson.dualRealJetAlgebraBasis_singleton, - ← BBoson.dualRealJetAlgebraBasis_singleton, - ← BBoson.dualRealJetAlgebraBasis_singleton, - BBoson.dualRealJetAlgebraBasis_mul, BBoson.dualRealJetAlgebraBasis_mul, - Multiset.singleton_add, Multiset.singleton_add, ← Multiset.insert_eq_cons, - ← Multiset.insert_eq_cons] - have hmul : ∀ x y : DerivAlgebraReal, - DerivAlgebraReal.repLorentzGroup Λ (x * y) = - DerivAlgebraReal.repLorentzGroup Λ x * - DerivAlgebraReal.repLorentzGroup Λ y := fun x y => - map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - Lorentz.CoVector.sl2Rep.dual Λ)) x y - have happ : BBoson.JetComponentSpace.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ} ⊗ₜ[ℝ] - StandardModel.BBoson.basis.dualBasis ν) = - (DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ})) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ - (StandardModel.BBoson.basis.dualBasis ν)) := rfl - rw [BBoson.jetComponentSpace_basis_dB, happ, htriple, hmul, hmul, - DerivAlgebraReal.repLorentzGroup_apply_ι, - DerivAlgebraReal.repLorentzGroup_apply_ι, - DerivAlgebraReal.repLorentzGroup_apply_ι, - Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, - Lorentz.CoVector.sl2Rep_dual_dualBasis, - BBoson.repLorentzGroup_dual_dualBasis] - simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, - smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, - ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, - smul_smul, BBoson.jetComponentSpace_basis_dB, htriple] - conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] - conv_lhs => enter [2, i]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] - conv_lhs => enter [2, i]; rw [Finset.sum_comm] - conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => - Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - module - -set_option maxHeartbeats 2000000 in -/-- The transformation law of the second-derivative field strength on the - B-boson jet algebra: a four-index tensor. -/ -lemma _root_.StandardModel.BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_pair - (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = - ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • - BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b := by - have hFS : ∀ r s a b : Fin 1 ⊕ Fin 3, - BBoson.JetAlgebra.fieldStrengthDeriv ({r, s} : Multiset _) a b = - BBoson.JetAlgebra.ofGenerator (.dB {r, s, a} b) - - BBoson.JetAlgebra.ofGenerator (.dB {r, s, b} a) := fun r s a b => by - rw [BBoson.JetAlgebra.fieldStrengthDeriv, - show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, s, a} from by - rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, - ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons], - show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, s, b} from by - rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, - ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons]] - simp only [hFS] - rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple] - simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, - BBoson.JetAlgebra.ofGenerator] - rw [sub_right_inj] - conv_rhs => enter [2, r, 2, s]; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => - Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - congr 1 - ring - -/-- The transformation of the complexified second-derivative field strength. -/ -lemma _root_.StandardModel.BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair - (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = - ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b) := by - rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) from rfl, - BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_pair] - simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] - -set_option maxHeartbeats 2000000 in -/-- The transformation law of the embedded second-derivative field strength: - a four-index tensor, all indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) - (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) = - ∑ r, ∑ s, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) : ℝ)) : ℂ) • - fieldStrengthDeriv {r, s} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] - -/-! - -### Commutation and anticommutation of the covariant factors - --/ - -/-- The embedded field-strength derivatives commute: they live in the - commutative bosonic factor of the jet algebra. -/ -lemma fieldStrengthDeriv_mul_comm (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν ρ τ : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' ρ τ = - fieldStrengthDeriv s' ρ τ * fieldStrengthDeriv s μ ν := by - rw [fieldStrengthDeriv, fieldStrengthDeriv, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, - mul_comm (BBoson.JetAlgebra.fieldStrengthDeriv s μ ν)] - -set_option maxHeartbeats 16000000 in -/-- The embedded lepton-linear and conjugate-linear elements anticommute: - both are odd elements of the exterior factor of the jet algebra. -/ -lemma leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm (x : LeptonLinear) - (y : ConjLeptonLinear) : - leptonLinearIncl x * conjLeptonLinearIncl y = - -(conjLeptonLinearIncl y * leptonLinearIncl x) := by - have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z - have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hι : ∀ (a : LeptonComponent) (b : ConjLeptonComponent), - leptonComponentIncl a * conjLeptonComponentIncl b = - -(conjLeptonComponentIncl b * leptonComponentIncl a) := fun a b => by - rw [leptonComponentIncl_apply, conjLeptonComponentIncl_apply] - exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) - induction x using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, neg_zero] - | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] - | tmul p a => - induction y using TensorProduct.induction_on with - | zero => rw [map_zero, hz₂, hz₁, neg_zero] - | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] - | tmul q b => - rw [leptonLinearIncl_tmul, conjLeptonLinearIncl_tmul, - Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - hι a b, mul_comm q p, TensorProduct.tmul_neg] - -/-- The covariant lepton derivatives anticommute with the conjugate covariant - derivatives. -/ -lemma Dψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dψ l α * Dbarψ l' β = -(Dbarψ l' β * Dψ l α) := by - rw [Dψ_eq_leptonLinearIncl, Dbarψ_eq_conjLeptonLinearIncl, - leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm] - -set_option maxHeartbeats 16000000 in -/-- Two embedded lepton-linear elements anticommute. -/ -lemma leptonLinearIncl_mul_leptonLinearIncl_anticomm (x y : LeptonLinear) : - leptonLinearIncl x * leptonLinearIncl y = - -(leptonLinearIncl y * leptonLinearIncl x) := by - have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z - have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hι : ∀ a b : LeptonComponent, - leptonComponentIncl a * leptonComponentIncl b = - -(leptonComponentIncl b * leptonComponentIncl a) := fun a b => by - rw [leptonComponentIncl_apply, leptonComponentIncl_apply] - exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) - induction x using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, neg_zero] - | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] - | tmul p a => - induction y using TensorProduct.induction_on with - | zero => rw [map_zero, hz₂, hz₁, neg_zero] - | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] - | tmul q b => - rw [leptonLinearIncl_tmul, leptonLinearIncl_tmul, - Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - hι a b, mul_comm q p, TensorProduct.tmul_neg] - -/-- Two covariant lepton derivatives anticommute. -/ -lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dψ l α * Dψ l' β = -(Dψ l' β * Dψ l α) := by - rw [Dψ_eq_leptonLinearIncl, Dψ_eq_leptonLinearIncl, - leptonLinearIncl_mul_leptonLinearIncl_anticomm] - -/-! - -### Parametric boosts along the three axes - -The one-parameter families of boosts `diag(t, t⁻¹)` (along `z`) and their -conjugates along `x` and `y`, with symbolic Lorentz matrices in `t`. - --/ - -/-- The lift `diag(t, t⁻¹)` of the boost along the `z`-axis with rapidity - `2 log t`. -/ -noncomputable def boostZel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := - ⟨!![(t : ℂ), 0; 0, (t : ℂ)⁻¹], by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [Matrix.det_fin_two_of] - simp [mul_inv_cancel₀ htc]⟩ - -/-- The lift of the boost along the `x`-axis with rapidity `2 log t`. -/ -noncomputable def boostXel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := - ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, ((t : ℂ) - (t : ℂ)⁻¹)/2; - ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [Matrix.det_fin_two_of] - field_simp - ring⟩ - -/-- The lift of the boost along the `y`-axis with rapidity `2 log t`. -/ -noncomputable def boostYel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := - ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; - Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - have h2 : -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * - (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) = - ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by - have hI : -Complex.I * Complex.I = 1 := by - rw [neg_mul, Complex.I_mul_I, neg_neg] - calc -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * - (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) - = (-Complex.I * Complex.I) * - (((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2)) := by - ring - _ = ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by - rw [hI, one_mul] - rw [Matrix.det_fin_two_of, h2] - field_simp - ring⟩ - -/-- The Lorentz matrix of `boostZel t`: `ch = (t² + t⁻²)/2` on the time-time - and `zz` entries, `-sh = -(t² - t⁻²)/2` on the mixed entries. -/ -noncomputable def boostMatZ (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 - | Sum.inl _, Sum.inr 2 => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 2, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => (t^2 + (t⁻¹)^2)/2 - | _, _ => 0 - -/-- The Lorentz matrix of `boostXel t`. -/ -noncomputable def boostMatX (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 - | Sum.inl _, Sum.inr 0 => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inr 0 => (t^2 + (t⁻¹)^2)/2 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 1 - | _, _ => 0 - -/-- The Lorentz matrix of `boostYel t`. -/ -noncomputable def boostMatY (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 - | Sum.inl _, Sum.inr 1 => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 1, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => (t^2 + (t⁻¹)^2)/2 - | Sum.inr 2, Sum.inr 2 => 1 - | _, _ => 0 - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Lorentz matrix of the parametric `z`-boost. -/ -lemma toLorentzGroup_boostZel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostZel t ht)).1 a b = boostMatZ t a b := by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostZel, boostMatZ, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, - Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try push_cast - try field_simp - try ring_nf - try norm_num [Complex.I_sq, Complex.conj_ofNat] - try ring - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Lorentz matrix of the parametric `x`-boost. -/ -lemma toLorentzGroup_boostXel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostXel t ht)).1 a b = boostMatX t a b := by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostXel, boostMatX, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, - Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try push_cast - try field_simp - try ring_nf - try norm_num [Complex.I_sq, Complex.conj_ofNat] - try ring - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Lorentz matrix of the parametric `y`-boost. -/ -lemma toLorentzGroup_boostYel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostYel t ht)).1 a b = boostMatY t a b := by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostYel, boostMatY, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, - Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try push_cast - try field_simp - try ring_nf - try norm_num [Complex.I_sq, Complex.conj_ofNat] - try ring - -/-- The inverse of the parametric `z`-boost is the boost at the inverse - parameter. -/ -lemma boostZel_inv (t : ℝ) (ht : t ≠ 0) : - (boostZel t ht)⁻¹ = boostZel t⁻¹ (inv_ne_zero ht) := by - ext i j - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - fin_cases i <;> fin_cases j <;> - simp [boostZel, Complex.ofReal_inv, inv_inv] - -/-- The inverse of the parametric `x`-boost is the boost at the inverse - parameter. -/ -lemma boostXel_inv (t : ℝ) (ht : t ≠ 0) : - (boostXel t ht)⁻¹ = boostXel t⁻¹ (inv_ne_zero ht) := by - ext i j - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - fin_cases i <;> fin_cases j <;> - · simp [boostXel, Complex.ofReal_inv, inv_inv] - try ring - -/-- The inverse of the parametric `y`-boost is the boost at the inverse - parameter. -/ -lemma boostYel_inv (t : ℝ) (ht : t ≠ 0) : - (boostYel t ht)⁻¹ = boostYel t⁻¹ (inv_ne_zero ht) := by - ext i j - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - fin_cases i <;> fin_cases j <;> - · simp [boostYel, Complex.ofReal_inv, inv_inv] - try ring - -/-- The inverse of the parametric `z`-boost, entrywise, with real entries. -/ -lemma boostZel_inv_coe (t : ℝ) (ht : t ≠ 0) : - ((boostZel t ht)⁻¹ : SL(2,ℂ)).1 = - !![(((t⁻¹ : ℝ)) : ℂ), 0; 0, ((t : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostZel] - -/-- The inverse of the parametric `x`-boost, entrywise. -/ -lemma boostXel_inv_coe (t : ℝ) (ht : t ≠ 0) : - ((boostXel t ht)⁻¹ : SL(2,ℂ)).1 = - !![((t : ℂ) + (t : ℂ)⁻¹)/2, -(((t : ℂ) - (t : ℂ)⁻¹)/2); - -(((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostXel] - -/-- The inverse of the parametric `y`-boost, entrywise. -/ -lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : - ((boostYel t ht)⁻¹ : SL(2,ℂ)).1 = - !![((t : ℂ) + (t : ℂ)⁻¹)/2, Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; - -(Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring - -/-- The Lorentz matrix of the inverse `z`-boost: the boost matrix at the - inverse parameter. -/ -lemma toLorentzGroup_boostZel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostZel t ht)⁻¹).1 a b = boostMatZ t⁻¹ a b := by - rw [boostZel_inv, toLorentzGroup_boostZel] - -/-- The Lorentz matrix of the inverse `x`-boost. -/ -lemma toLorentzGroup_boostXel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostXel t ht)⁻¹).1 a b = boostMatX t⁻¹ a b := by - rw [boostXel_inv, toLorentzGroup_boostXel] - -/-- The Lorentz matrix of the inverse `y`-boost. -/ -lemma toLorentzGroup_boostYel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostYel t ht)⁻¹).1 a b = boostMatY t⁻¹ a b := by - rw [boostYel_inv, toLorentzGroup_boostYel] - -/-! - -### The four invariants in monomial form - --/ - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Maxwell term as an explicit combination of the six independent - field-strength squares. -/ -lemma maxwellTerm_eq : maxwellTerm = - (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z - have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z - have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind - have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind - rw [maxwellTerm] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - minkowskiMatrix.inl_0_inl_0, minkowskiMatrix.inr_i_inr_i, - fieldStrengthDeriv_self, hz₁, hz₂, smul_zero, add_zero, zero_add] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - hnm, hmn, neg_neg] - push_cast - module - -set_option maxHeartbeats 8000000 in -set_option linter.unusedSimpArgs false in -/-- The theta term as an explicit combination of the three pair-partition - products of field strengths. -/ -lemma thetaTerm_eq : thetaTerm = - (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind - have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind - rw [thetaTerm] - conv_lhs => - enter [2, p] - rw [show (1 : Fin 4) = (0 : Fin 3).succ from rfl, - show (2 : Fin 4) = (1 : Fin 3).succ from rfl, - show (3 : Fin 4) = (2 : Fin 3).succ from rfl] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i, 2, j] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i, 2, j, 2, k] - rw [Fintype.sum_subsingleton _ (1 : Equiv.Perm (Fin 1))] - simp only [Equiv.coe_toEmbedding, Fin.sum_univ_four, Fin.sum_univ_three, - Fin.sum_univ_two, - show ((1 : Fin 3)) = (0 : Fin 2).succ from rfl, - show ((2 : Fin 3)) = (1 : Fin 2).succ from rfl, - Equiv.Perm.decomposeFin_symm_of_one, - Equiv.Perm.decomposeFin.symm_sign, - Equiv.Perm.decomposeFin_symm_apply_zero, - Equiv.Perm.decomposeFin_symm_apply_one, - Equiv.Perm.decomposeFin_symm_apply_succ] - simp only [show ((0 : Fin 2).succ) = (1 : Fin 3) from rfl, - show ((1 : Fin 2).succ) = (2 : Fin 3) from rfl, - show ((0 : Fin 3).succ) = (1 : Fin 4) from rfl, - show ((1 : Fin 3).succ) = (2 : Fin 4) from rfl, - show ((2 : Fin 3).succ) = (3 : Fin 4) from rfl, - Equiv.swap_self, Equiv.Perm.sign_refl, Equiv.refl_apply, Equiv.Perm.sign_one, - Equiv.swap_apply_left, Equiv.swap_apply_right, Equiv.swap_apply_of_ne_of_ne, - Equiv.Perm.sign_swap', Fin.reduceEq, reduceIte, ne_eq, not_false_iff, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 0) = Sum.inl 0 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 1) = Sum.inr 0 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 2) = Sum.inr 1 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 3) = Sum.inr 2 from rfl, - Units.val_one, Units.val_neg, one_smul, neg_smul, one_mul, mul_one] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - hnm, hmn, neg_neg] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _] - module - -set_option maxHeartbeats 2000000 in -set_option linter.unusedSimpArgs false in -/-- The fermion kinetic term as an explicit combination of the eight - `ψ̄ (D ψ)` monomials. -/ -lemma fermionKineticTerm_eq : fermionKineticTerm = - Complex.I • ((Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) - - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - - Complex.I • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) := by - rw [fermionKineticTerm] - congr 1 - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - Fin.sum_univ_two] - norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.transpose_apply, Matrix.one_apply] - module - -set_option maxHeartbeats 2000000 in -set_option linter.unusedSimpArgs false in -/-- The conjugate fermion kinetic term as an explicit combination of the eight - `(D̄ ψ̄) ψ` monomials. -/ -lemma fermionKineticTermBar_eq : fermionKineticTermBar = - (-Complex.I) • ((Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) - - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - - Complex.I • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) := by - rw [fermionKineticTermBar] - congr 1 - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - Fin.sum_univ_two] - norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.transpose_apply, Matrix.one_apply] - module - -/-! - -### The symmetrised boost average on the weight-eight sector - -For each axis `T ∈ {Z, X, Y}` the paired boost actions `rep(boost) + rep(boost⁻¹)` -at `t` and `t⁻¹` act on the Klein-symmetric weight-eight basis vectors with -even coefficients in the boost parameter. A rational combination of the -paired boosts at `t = 2, 3, 4` together with the identity (`boostProjZ/X/Y`) -realises the Klein-restricted single-axis averages, and their mean `opS` -fixes every Lorentz-invariant vector while acting on the weight-eight basis -by an explicit rational matrix (the `opS_*` stage lemmas below). - --/ - -section SectorEight - -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -/-- Left distribution in the jet algebra, in a form usable by `simp`. -/ -lemma mul_add_jet (x y z : JetAlgebra) : x * (y + z) = x * y + x * z := by grind - -/-- Right distribution in the jet algebra, in a form usable by `simp`. -/ -lemma add_mul_jet (x y z : JetAlgebra) : (x + y) * z = x * z + y * z := by grind - -/-- Scalar rearrangement of a product of two scaled elements. -/ -lemma smul_mul_smul_jet (c d : ℂ) (x y : JetAlgebra) : - (c • x) * (d • y) = (c * d) • (x * y) := by - rw [smul_mul_smul_comm] - -/-- Scalars pull out of the left factor of a product. -/ -lemma smul_mul_jet (c : ℂ) (x y : JetAlgebra) : (c • x) * y = c • (x * y) := by - rw [smul_mul_assoc] - -/-- Scalars pull out of the right factor of a product. -/ -lemma mul_smul_jet (c : ℂ) (x y : JetAlgebra) : x * (c • y) = c • (x * y) := by - rw [mul_smul_comm] - -/-- Reordering the two derivative indices of a second-derivative field - strength. -/ -lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {r, s} a b = fieldStrengthDeriv {s, r} a b := by - have h : ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) = {s, r} := Multiset.cons_swap r s 0 - rw [h] - -lemma boostMatZ_00 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatZ_01 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 0) = 0 := rfl -lemma boostMatZ_02 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 1) = 0 := rfl -lemma boostMatZ_03 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 2) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatZ_10 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inl 0) = 0 := rfl -lemma boostMatZ_11 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 0) = 1 := rfl -lemma boostMatZ_12 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 1) = 0 := rfl -lemma boostMatZ_13 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 2) = 0 := rfl -lemma boostMatZ_20 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inl 0) = 0 := rfl -lemma boostMatZ_21 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 0) = 0 := rfl -lemma boostMatZ_22 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 1) = 1 := rfl -lemma boostMatZ_23 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 2) = 0 := rfl -lemma boostMatZ_30 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatZ_31 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 0) = 0 := rfl -lemma boostMatZ_32 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 1) = 0 := rfl -lemma boostMatZ_33 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 2) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl - -lemma boostMatX_00 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatX_01 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatX_02 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 1) = 0 := rfl -lemma boostMatX_03 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 2) = 0 := rfl -lemma boostMatX_10 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatX_11 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatX_12 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 1) = 0 := rfl -lemma boostMatX_13 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 2) = 0 := rfl -lemma boostMatX_20 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inl 0) = 0 := rfl -lemma boostMatX_21 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 0) = 0 := rfl -lemma boostMatX_22 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 1) = 1 := rfl -lemma boostMatX_23 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 2) = 0 := rfl -lemma boostMatX_30 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inl 0) = 0 := rfl -lemma boostMatX_31 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 0) = 0 := rfl -lemma boostMatX_32 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 1) = 0 := rfl -lemma boostMatX_33 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 2) = 1 := rfl - -lemma boostMatY_00 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatY_01 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 0) = 0 := rfl -lemma boostMatY_02 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 1) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatY_03 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 2) = 0 := rfl -lemma boostMatY_10 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inl 0) = 0 := rfl -lemma boostMatY_11 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 0) = 1 := rfl -lemma boostMatY_12 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 1) = 0 := rfl -lemma boostMatY_13 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 2) = 0 := rfl -lemma boostMatY_20 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatY_21 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 0) = 0 := rfl -lemma boostMatY_22 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 1) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatY_23 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 2) = 0 := rfl -lemma boostMatY_30 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inl 0) = 0 := rfl -lemma boostMatY_31 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 0) = 0 := rfl -lemma boostMatY_32 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 1) = 0 := rfl -lemma boostMatY_33 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 2) = 1 := rfl - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on a fermion pair `ψ̄_α (Dψ_μ)_β` with one derivative on - the unbarred factor. -/ -lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) = - ∑ γ, ∑ ν, ∑ δ, ((Λ⁻¹).1 α γ * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β δ))) • (Dbarψ [] γ * Dψ [ν] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] - simp only [hsm, hms, hms₂, hsmul] - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on a fermion pair `(D̄ψ̄_μ)_α ψ_β` with one derivative on - the barred factor. -/ -lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) = - ∑ ν, ∑ γ, ∑ δ, (((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α γ) * star ((Λ⁻¹).1 β δ)) • (Dbarψ [ν] γ * Dψ [] δ) := by - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsm₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] - simp only [hsm, hsm₂, hms, hsmul] - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F01`. -/ -lemma genZ_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F02`. -/ -lemma genZ_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F03`. -/ -lemma genZ_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F12`. -/ -lemma genZ_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F13`. -/ -lemma genZ_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F23`. -/ -lemma genZ_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F01`. -/ -lemma genX_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F02`. -/ -lemma genX_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F03`. -/ -lemma genX_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F12`. -/ -lemma genX_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F13`. -/ -lemma genX_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F23`. -/ -lemma genX_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F01`. -/ -lemma genY_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F02`. -/ -lemma genY_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F03`. -/ -lemma genY_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F12`. -/ -lemma genY_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F13`. -/ -lemma genY_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F23`. -/ -lemma genY_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma genZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma genZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma genZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma genZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma genZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma genZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma genZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma genZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma genZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma genZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma genZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma genZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma genX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma genX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma genX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma genX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma genX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma genX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma genX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma genX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma genX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma genX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma genX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma genX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma genY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma genY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma genY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma genY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma genY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma genY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma genY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma genY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma genY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma genY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma genY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma genY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F01 * F01`. -/ -lemma pairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F01 t ht, - genZ_F01 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F01 * F23`. -/ -lemma pairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F01 t ht, - genZ_F01 t⁻¹ (inv_ne_zero ht), - genZ_F23 t ht, - genZ_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F02 * F02`. -/ -lemma pairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F02 t ht, - genZ_F02 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F02 * F13`. -/ -lemma pairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F02 t ht, - genZ_F02 t⁻¹ (inv_ne_zero ht), - genZ_F13 t ht, - genZ_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F03 * F03`. -/ -lemma pairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F03 t ht, - genZ_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F03 * F12`. -/ -lemma pairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F03 t ht, - genZ_F03 t⁻¹ (inv_ne_zero ht), - genZ_F12 t ht, - genZ_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F12 * F12`. -/ -lemma pairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F12 t ht, - genZ_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F13 * F13`. -/ -lemma pairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F13 t ht, - genZ_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F23 * F23`. -/ -lemma pairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F23 t ht, - genZ_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F01 * F01`. -/ -lemma pairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F01 t ht, - genX_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F01 * F23`. -/ -lemma pairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F01 t ht, - genX_F01 t⁻¹ (inv_ne_zero ht), - genX_F23 t ht, - genX_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F02 * F02`. -/ -lemma pairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F02 t ht, - genX_F02 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F02 * F13`. -/ -lemma pairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F02 t ht, - genX_F02 t⁻¹ (inv_ne_zero ht), - genX_F13 t ht, - genX_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F03 * F03`. -/ -lemma pairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F03 t ht, - genX_F03 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F03 * F12`. -/ -lemma pairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F03 t ht, - genX_F03 t⁻¹ (inv_ne_zero ht), - genX_F12 t ht, - genX_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F12 * F12`. -/ -lemma pairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F12 t ht, - genX_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F13 * F13`. -/ -lemma pairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F13 t ht, - genX_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F23 * F23`. -/ -lemma pairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F23 t ht, - genX_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F01 * F01`. -/ -lemma pairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F01 t ht, - genY_F01 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F01 * F23`. -/ -lemma pairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F01 t ht, - genY_F01 t⁻¹ (inv_ne_zero ht), - genY_F23 t ht, - genY_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F02 * F02`. -/ -lemma pairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F02 t ht, - genY_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F02 * F13`. -/ -lemma pairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F02 t ht, - genY_F02 t⁻¹ (inv_ne_zero ht), - genY_F13 t ht, - genY_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F03 * F03`. -/ -lemma pairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F03 t ht, - genY_F03 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F03 * F12`. -/ -lemma pairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F03 t ht, - genY_F03 t⁻¹ (inv_ne_zero ht), - genY_F12 t ht, - genY_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F12 * F12`. -/ -lemma pairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F12 t ht, - genY_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F13 * F13`. -/ -lemma pairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F13 t ht, - genY_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F23 * F23`. -/ -lemma pairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F23 t ht, - genY_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul_jet, mul_add_jet, smul_mul_smul_jet, smul_mul_jet, mul_smul_jet, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F01` with - derivative indices `(0, 1)`. -/ -lemma pairZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd01_F01 t ht, genZ_dd01_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F23` with - derivative indices `(0, 1)`. -/ -lemma pairZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd01_F23 t ht, genZ_dd01_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F02` with - derivative indices `(0, 2)`. -/ -lemma pairZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd02_F02 t ht, genZ_dd02_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F13` with - derivative indices `(0, 2)`. -/ -lemma pairZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd02_F13 t ht, genZ_dd02_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F03` with - derivative indices `(0, 3)`. -/ -lemma pairZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd03_F03 t ht, genZ_dd03_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F12` with - derivative indices `(0, 3)`. -/ -lemma pairZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd03_F12 t ht, genZ_dd03_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F03` with - derivative indices `(1, 2)`. -/ -lemma pairZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd12_F03 t ht, genZ_dd12_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F12` with - derivative indices `(1, 2)`. -/ -lemma pairZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd12_F12 t ht, genZ_dd12_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F02` with - derivative indices `(1, 3)`. -/ -lemma pairZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd13_F02 t ht, genZ_dd13_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F13` with - derivative indices `(1, 3)`. -/ -lemma pairZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd13_F13 t ht, genZ_dd13_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F01` with - derivative indices `(2, 3)`. -/ -lemma pairZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd23_F01 t ht, genZ_dd23_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F23` with - derivative indices `(2, 3)`. -/ -lemma pairZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [genZ_dd23_F23 t ht, genZ_dd23_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F01` with - derivative indices `(0, 1)`. -/ -lemma pairX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd01_F01 t ht, genX_dd01_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F23` with - derivative indices `(0, 1)`. -/ -lemma pairX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd01_F23 t ht, genX_dd01_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F02` with - derivative indices `(0, 2)`. -/ -lemma pairX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd02_F02 t ht, genX_dd02_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F13` with - derivative indices `(0, 2)`. -/ -lemma pairX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd02_F13 t ht, genX_dd02_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F03` with - derivative indices `(0, 3)`. -/ -lemma pairX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd03_F03 t ht, genX_dd03_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F12` with - derivative indices `(0, 3)`. -/ -lemma pairX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd03_F12 t ht, genX_dd03_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F03` with - derivative indices `(1, 2)`. -/ -lemma pairX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd12_F03 t ht, genX_dd12_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F12` with - derivative indices `(1, 2)`. -/ -lemma pairX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd12_F12 t ht, genX_dd12_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F02` with - derivative indices `(1, 3)`. -/ -lemma pairX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd13_F02 t ht, genX_dd13_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F13` with - derivative indices `(1, 3)`. -/ -lemma pairX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd13_F13 t ht, genX_dd13_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F01` with - derivative indices `(2, 3)`. -/ -lemma pairX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd23_F01 t ht, genX_dd23_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F23` with - derivative indices `(2, 3)`. -/ -lemma pairX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [genX_dd23_F23 t ht, genX_dd23_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F01` with - derivative indices `(0, 1)`. -/ -lemma pairY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd01_F01 t ht, genY_dd01_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F23` with - derivative indices `(0, 1)`. -/ -lemma pairY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd01_F23 t ht, genY_dd01_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F02` with - derivative indices `(0, 2)`. -/ -lemma pairY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd02_F02 t ht, genY_dd02_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F13` with - derivative indices `(0, 2)`. -/ -lemma pairY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd02_F13 t ht, genY_dd02_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F03` with - derivative indices `(0, 3)`. -/ -lemma pairY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd03_F03 t ht, genY_dd03_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F12` with - derivative indices `(0, 3)`. -/ -lemma pairY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd03_F12 t ht, genY_dd03_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F03` with - derivative indices `(1, 2)`. -/ -lemma pairY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd12_F03 t ht, genY_dd12_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F12` with - derivative indices `(1, 2)`. -/ -lemma pairY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd12_F12 t ht, genY_dd12_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F02` with - derivative indices `(1, 3)`. -/ -lemma pairY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd13_F02 t ht, genY_dd13_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F13` with - derivative indices `(1, 3)`. -/ -lemma pairY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd13_F13 t ht, genY_dd13_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F01` with - derivative indices `(2, 3)`. -/ -lemma pairY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd23_F01 t ht, genY_dd23_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F23` with - derivative indices `(2, 3)`. -/ -lemma pairY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [genY_dd23_F23 t ht, genY_dd23_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u0`. -/ -lemma pairZ_u0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u1`. -/ -lemma pairZ_u1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u2`. -/ -lemma pairZ_u2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u3`. -/ -lemma pairZ_u3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u0`. -/ -lemma pairX_u0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u1`. -/ -lemma pairX_u1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u2`. -/ -lemma pairX_u2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u3`. -/ -lemma pairX_u3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u0`. -/ -lemma pairY_u0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u1`. -/ -lemma pairY_u1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u2`. -/ -lemma pairY_u2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u3`. -/ -lemma pairY_u3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar0`. -/ -lemma pairZ_ubar0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar1`. -/ -lemma pairZ_ubar1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar2`. -/ -lemma pairZ_ubar2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar3`. -/ -lemma pairZ_ubar3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar0`. -/ -lemma pairX_ubar0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar1`. -/ -lemma pairX_ubar1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar2`. -/ -lemma pairX_ubar2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar3`. -/ -lemma pairX_ubar3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar0`. -/ -lemma pairY_ubar0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar1`. -/ -lemma pairY_ubar1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar2`. -/ -lemma pairY_ubar2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar3`. -/ -lemma pairY_ubar3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -/-- The `Z`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the Klein-restricted single-axis - average on the weight-eight sector. -/ -noncomputable def boostProjZ : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + - repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + - repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + - repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) - -/-- The `X`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the Klein-restricted single-axis - average on the weight-eight sector. -/ -noncomputable def boostProjX : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + - repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + - repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + - repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) - -/-- The `Y`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the Klein-restricted single-axis - average on the weight-eight sector. -/ -noncomputable def boostProjY : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + - repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + - repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + - repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) - -/-- The symmetrised boost average over the three axes. -/ -noncomputable def opS : Module.End ℂ JetAlgebra := - (3⁻¹ : ℂ) • (boostProjZ + boostProjX + boostProjY) - -/-- The operator `opS` fixes every Lorentz-invariant vector: each boost term - fixes it and the weights sum to one. -/ -lemma opS_apply_of_invariant {y : JetAlgebra} - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opS y = y := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply, hinv] - match_scalars - norm_num - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F01 * F01`. -/ -lemma opS_F01_F01 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F01_F01 2 (by norm_num), - pairZ_F01_F01 3 (by norm_num), - pairZ_F01_F01 4 (by norm_num), - pairX_F01_F01 2 (by norm_num), - pairX_F01_F01 3 (by norm_num), - pairX_F01_F01 4 (by norm_num), - pairY_F01_F01 2 (by norm_num), - pairY_F01_F01 3 (by norm_num), - pairY_F01_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F01 * F23`. -/ -lemma opS_F01_F23 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F01_F23 2 (by norm_num), - pairZ_F01_F23 3 (by norm_num), - pairZ_F01_F23 4 (by norm_num), - pairX_F01_F23 2 (by norm_num), - pairX_F01_F23 3 (by norm_num), - pairX_F01_F23 4 (by norm_num), - pairY_F01_F23 2 (by norm_num), - pairY_F01_F23 3 (by norm_num), - pairY_F01_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F02 * F02`. -/ -lemma opS_F02_F02 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F02_F02 2 (by norm_num), - pairZ_F02_F02 3 (by norm_num), - pairZ_F02_F02 4 (by norm_num), - pairX_F02_F02 2 (by norm_num), - pairX_F02_F02 3 (by norm_num), - pairX_F02_F02 4 (by norm_num), - pairY_F02_F02 2 (by norm_num), - pairY_F02_F02 3 (by norm_num), - pairY_F02_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F02 * F13`. -/ -lemma opS_F02_F13 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F02_F13 2 (by norm_num), - pairZ_F02_F13 3 (by norm_num), - pairZ_F02_F13 4 (by norm_num), - pairX_F02_F13 2 (by norm_num), - pairX_F02_F13 3 (by norm_num), - pairX_F02_F13 4 (by norm_num), - pairY_F02_F13 2 (by norm_num), - pairY_F02_F13 3 (by norm_num), - pairY_F02_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F03 * F03`. -/ -lemma opS_F03_F03 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F03_F03 2 (by norm_num), - pairZ_F03_F03 3 (by norm_num), - pairZ_F03_F03 4 (by norm_num), - pairX_F03_F03 2 (by norm_num), - pairX_F03_F03 3 (by norm_num), - pairX_F03_F03 4 (by norm_num), - pairY_F03_F03 2 (by norm_num), - pairY_F03_F03 3 (by norm_num), - pairY_F03_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F03 * F12`. -/ -lemma opS_F03_F12 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F03_F12 2 (by norm_num), - pairZ_F03_F12 3 (by norm_num), - pairZ_F03_F12 4 (by norm_num), - pairX_F03_F12 2 (by norm_num), - pairX_F03_F12 3 (by norm_num), - pairX_F03_F12 4 (by norm_num), - pairY_F03_F12 2 (by norm_num), - pairY_F03_F12 3 (by norm_num), - pairY_F03_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F12 * F12`. -/ -lemma opS_F12_F12 : - opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F12_F12 2 (by norm_num), - pairZ_F12_F12 3 (by norm_num), - pairZ_F12_F12 4 (by norm_num), - pairX_F12_F12 2 (by norm_num), - pairX_F12_F12 3 (by norm_num), - pairX_F12_F12 4 (by norm_num), - pairY_F12_F12 2 (by norm_num), - pairY_F12_F12 3 (by norm_num), - pairY_F12_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F13 * F13`. -/ -lemma opS_F13_F13 : - opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F13_F13 2 (by norm_num), - pairZ_F13_F13 3 (by norm_num), - pairZ_F13_F13 4 (by norm_num), - pairX_F13_F13 2 (by norm_num), - pairX_F13_F13 3 (by norm_num), - pairX_F13_F13 4 (by norm_num), - pairY_F13_F13 2 (by norm_num), - pairY_F13_F13 3 (by norm_num), - pairY_F13_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F23 * F23`. -/ -lemma opS_F23_F23 : - opS (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F23_F23 2 (by norm_num), - pairZ_F23_F23 3 (by norm_num), - pairZ_F23_F23 4 (by norm_num), - pairX_F23_F23 2 (by norm_num), - pairX_F23_F23 3 (by norm_num), - pairX_F23_F23 4 (by norm_num), - pairY_F23_F23 2 (by norm_num), - pairY_F23_F23 3 (by norm_num), - pairY_F23_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma opS_dd01_F01 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd01_F01 2 (by norm_num), - pairZ_dd01_F01 3 (by norm_num), - pairZ_dd01_F01 4 (by norm_num), - pairX_dd01_F01 2 (by norm_num), - pairX_dd01_F01 3 (by norm_num), - pairX_dd01_F01 4 (by norm_num), - pairY_dd01_F01 2 (by norm_num), - pairY_dd01_F01 3 (by norm_num), - pairY_dd01_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma opS_dd01_F23 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd01_F23 2 (by norm_num), - pairZ_dd01_F23 3 (by norm_num), - pairZ_dd01_F23 4 (by norm_num), - pairX_dd01_F23 2 (by norm_num), - pairX_dd01_F23 3 (by norm_num), - pairX_dd01_F23 4 (by norm_num), - pairY_dd01_F23 2 (by norm_num), - pairY_dd01_F23 3 (by norm_num), - pairY_dd01_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma opS_dd02_F02 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd02_F02 2 (by norm_num), - pairZ_dd02_F02 3 (by norm_num), - pairZ_dd02_F02 4 (by norm_num), - pairX_dd02_F02 2 (by norm_num), - pairX_dd02_F02 3 (by norm_num), - pairX_dd02_F02 4 (by norm_num), - pairY_dd02_F02 2 (by norm_num), - pairY_dd02_F02 3 (by norm_num), - pairY_dd02_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma opS_dd02_F13 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd02_F13 2 (by norm_num), - pairZ_dd02_F13 3 (by norm_num), - pairZ_dd02_F13 4 (by norm_num), - pairX_dd02_F13 2 (by norm_num), - pairX_dd02_F13 3 (by norm_num), - pairX_dd02_F13 4 (by norm_num), - pairY_dd02_F13 2 (by norm_num), - pairY_dd02_F13 3 (by norm_num), - pairY_dd02_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma opS_dd03_F03 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd03_F03 2 (by norm_num), - pairZ_dd03_F03 3 (by norm_num), - pairZ_dd03_F03 4 (by norm_num), - pairX_dd03_F03 2 (by norm_num), - pairX_dd03_F03 3 (by norm_num), - pairX_dd03_F03 4 (by norm_num), - pairY_dd03_F03 2 (by norm_num), - pairY_dd03_F03 3 (by norm_num), - pairY_dd03_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma opS_dd03_F12 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd03_F12 2 (by norm_num), - pairZ_dd03_F12 3 (by norm_num), - pairZ_dd03_F12 4 (by norm_num), - pairX_dd03_F12 2 (by norm_num), - pairX_dd03_F12 3 (by norm_num), - pairX_dd03_F12 4 (by norm_num), - pairY_dd03_F12 2 (by norm_num), - pairY_dd03_F12 3 (by norm_num), - pairY_dd03_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma opS_dd12_F03 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd12_F03 2 (by norm_num), - pairZ_dd12_F03 3 (by norm_num), - pairZ_dd12_F03 4 (by norm_num), - pairX_dd12_F03 2 (by norm_num), - pairX_dd12_F03 3 (by norm_num), - pairX_dd12_F03 4 (by norm_num), - pairY_dd12_F03 2 (by norm_num), - pairY_dd12_F03 3 (by norm_num), - pairY_dd12_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma opS_dd12_F12 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd12_F12 2 (by norm_num), - pairZ_dd12_F12 3 (by norm_num), - pairZ_dd12_F12 4 (by norm_num), - pairX_dd12_F12 2 (by norm_num), - pairX_dd12_F12 3 (by norm_num), - pairX_dd12_F12 4 (by norm_num), - pairY_dd12_F12 2 (by norm_num), - pairY_dd12_F12 3 (by norm_num), - pairY_dd12_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma opS_dd13_F02 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd13_F02 2 (by norm_num), - pairZ_dd13_F02 3 (by norm_num), - pairZ_dd13_F02 4 (by norm_num), - pairX_dd13_F02 2 (by norm_num), - pairX_dd13_F02 3 (by norm_num), - pairX_dd13_F02 4 (by norm_num), - pairY_dd13_F02 2 (by norm_num), - pairY_dd13_F02 3 (by norm_num), - pairY_dd13_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma opS_dd13_F13 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd13_F13 2 (by norm_num), - pairZ_dd13_F13 3 (by norm_num), - pairZ_dd13_F13 4 (by norm_num), - pairX_dd13_F13 2 (by norm_num), - pairX_dd13_F13 3 (by norm_num), - pairX_dd13_F13 4 (by norm_num), - pairY_dd13_F13 2 (by norm_num), - pairY_dd13_F13 3 (by norm_num), - pairY_dd13_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma opS_dd23_F01 : - opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd23_F01 2 (by norm_num), - pairZ_dd23_F01 3 (by norm_num), - pairZ_dd23_F01 4 (by norm_num), - pairX_dd23_F01 2 (by norm_num), - pairX_dd23_F01 3 (by norm_num), - pairX_dd23_F01 4 (by norm_num), - pairY_dd23_F01 2 (by norm_num), - pairY_dd23_F01 3 (by norm_num), - pairY_dd23_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma opS_dd23_F23 : - opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd23_F23 2 (by norm_num), - pairZ_dd23_F23 3 (by norm_num), - pairZ_dd23_F23 4 (by norm_num), - pairX_dd23_F23 2 (by norm_num), - pairX_dd23_F23 3 (by norm_num), - pairX_dd23_F23 4 (by norm_num), - pairY_dd23_F23 2 (by norm_num), - pairY_dd23_F23 3 (by norm_num), - pairY_dd23_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u0`. -/ -lemma opS_u0 : - opS (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - + (-(Complex.I/6)) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u0 2 (by norm_num), - pairZ_u0 3 (by norm_num), - pairZ_u0 4 (by norm_num), - pairX_u0 2 (by norm_num), - pairX_u0 3 (by norm_num), - pairX_u0 4 (by norm_num), - pairY_u0 2 (by norm_num), - pairY_u0 3 (by norm_num), - pairY_u0 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u1`. -/ -lemma opS_u1 : - opS (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u1 2 (by norm_num), - pairZ_u1 3 (by norm_num), - pairZ_u1 4 (by norm_num), - pairX_u1 2 (by norm_num), - pairX_u1 3 (by norm_num), - pairX_u1 4 (by norm_num), - pairY_u1 2 (by norm_num), - pairY_u1 3 (by norm_num), - pairY_u1 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u2`. -/ -lemma opS_u2 : - opS (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - + (Complex.I/6) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u2 2 (by norm_num), - pairZ_u2 3 (by norm_num), - pairZ_u2 4 (by norm_num), - pairX_u2 2 (by norm_num), - pairX_u2 3 (by norm_num), - pairX_u2 4 (by norm_num), - pairY_u2 2 (by norm_num), - pairY_u2 3 (by norm_num), - pairY_u2 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u3`. -/ -lemma opS_u3 : - opS (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u3 2 (by norm_num), - pairZ_u3 3 (by norm_num), - pairZ_u3 4 (by norm_num), - pairX_u3 2 (by norm_num), - pairX_u3 3 (by norm_num), - pairX_u3 4 (by norm_num), - pairY_u3 2 (by norm_num), - pairY_u3 3 (by norm_num), - pairY_u3 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar0`. -/ -lemma opS_ubar0 : - opS (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - + (-(Complex.I/6)) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar0 2 (by norm_num), - pairZ_ubar0 3 (by norm_num), - pairZ_ubar0 4 (by norm_num), - pairX_ubar0 2 (by norm_num), - pairX_ubar0 3 (by norm_num), - pairX_ubar0 4 (by norm_num), - pairY_ubar0 2 (by norm_num), - pairY_ubar0 3 (by norm_num), - pairY_ubar0 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar1`. -/ -lemma opS_ubar1 : - opS (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar1 2 (by norm_num), - pairZ_ubar1 3 (by norm_num), - pairZ_ubar1 4 (by norm_num), - pairX_ubar1 2 (by norm_num), - pairX_ubar1 3 (by norm_num), - pairX_ubar1 4 (by norm_num), - pairY_ubar1 2 (by norm_num), - pairY_ubar1 3 (by norm_num), - pairY_ubar1 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar2`. -/ -lemma opS_ubar2 : - opS (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - + (Complex.I/6) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar2 2 (by norm_num), - pairZ_ubar2 3 (by norm_num), - pairZ_ubar2 4 (by norm_num), - pairX_ubar2 2 (by norm_num), - pairX_ubar2 3 (by norm_num), - pairX_ubar2 4 (by norm_num), - pairY_ubar2 2 (by norm_num), - pairY_ubar2 3 (by norm_num), - pairY_ubar2 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar3`. -/ -lemma opS_ubar3 : - opS (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar3 2 (by norm_num), - pairZ_ubar3 3 (by norm_num), - pairZ_ubar3 4 (by norm_num), - pairX_ubar3 2 (by norm_num), - pairX_ubar3 3 (by norm_num), - pairX_ubar3 4 (by norm_num), - pairY_ubar3 2 (by norm_num), - pairY_ubar3 3 (by norm_num), - pairY_ubar3 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -/-! - -### The projector polynomial and the weight-eight endgame - --/ - -/-- Negation moves out of the left factor of a jet-algebra product. -/ -lemma neg_mul_jet (x y : JetAlgebra) : -x * y = -(x * y) := by grind - -/-- Negation moves out of the right factor of a jet-algebra product. -/ -lemma mul_neg_jet (x y : JetAlgebra) : x * -y = -(x * y) := by grind - -/-- The quintic projector polynomial in the symmetrised boost average `opS`: - the unique degree-five polynomial with value one at the invariant eigenvalue - and vanishing on the remaining boost eigenvalues of the weight-eight Klein - sector. -/ -noncomputable def opPi : Module.End ℂ JetAlgebra := - (-1 : ℂ) • (1 : Module.End ℂ JetAlgebra) + (137/10 : ℂ) • opS - + (-(135/2) : ℂ) • (opS * opS) + (153 : ℂ) • (opS * opS * opS) - + (-162 : ℂ) • (opS * opS * opS * opS) - + (324/5 : ℂ) • (opS * opS * opS * opS * opS) - -/-- The projector polynomial, termwise. -/ -lemma opPi_apply (v : JetAlgebra) : - opPi v = (-1 : ℂ) • v + (137/10 : ℂ) • opS v - + (-(135/2) : ℂ) • opS (opS v) + (153 : ℂ) • opS (opS (opS v)) - + (-162 : ℂ) • opS (opS (opS (opS v))) - + (324/5 : ℂ) • opS (opS (opS (opS (opS v)))) := by - simp only [opPi, LinearMap.add_apply, LinearMap.smul_apply, Module.End.one_apply, - Module.End.mul_apply] - -/-- The projector fixes every Lorentz-invariant vector: `opS` fixes it and the - coefficients sum to one. -/ -lemma opPi_apply_of_invariant {y : JetAlgebra} - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opPi y = y := by - have hS : opS y = y := opS_apply_of_invariant hinv - rw [opPi_apply] - simp only [hS] - match_scalars - norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the FF block. -/ -lemma projFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v0) = - (1/2 : ℂ) • (v0) - + (1/36 : ℂ) • (v2) - + (1/36 : ℂ) • (v4) - + (-(2/9) : ℂ) • (v6) - + (-(2/9) : ℂ) • (v7) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v0)) = - (11/27 : ℂ) • (v0) - + (1/18 : ℂ) • (v2) - + (1/18 : ℂ) • (v4) - + (-(17/72) : ℂ) • (v6) - + (-(17/72) : ℂ) • (v7) - + (-(1/108) : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v0))) = - (227/648 : ℂ) • (v0) - + (101/1296 : ℂ) • (v2) - + (101/1296 : ℂ) • (v4) - + (-(19/81) : ℂ) • (v6) - + (-(19/81) : ℂ) • (v7) - + (-(2/81) : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v0)))) = - (101/324 : ℂ) • (v0) - + (185/1944 : ℂ) • (v2) - + (185/1944 : ℂ) • (v4) - + (-(1771/7776) : ℂ) • (v6) - + (-(1771/7776) : ℂ) • (v7) - + (-(55/1296) : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h0] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the FF block. -/ -lemma projFF1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have i2 : T (T v1) = - (1/2 : ℂ) • (v1) - + (-(1/4) : ℂ) • (v3) - + (1/4 : ℂ) • (v5) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v1)) = - (5/12 : ℂ) • (v1) - + (-(7/24) : ℂ) • (v3) - + (7/24 : ℂ) • (v5) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v1))) = - (3/8 : ℂ) • (v1) - + (-(5/16) : ℂ) • (v3) - + (5/16 : ℂ) • (v5) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v1)))) = - (17/48 : ℂ) • (v1) - + (-(31/96) : ℂ) • (v3) - + (31/96 : ℂ) • (v5) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h1] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the FF block. -/ -lemma projFF2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v2) = - (1/36 : ℂ) • (v0) - + (1/2 : ℂ) • (v2) - + (1/36 : ℂ) • (v4) - + (-(2/9) : ℂ) • (v6) - + (-(2/9) : ℂ) • (v8) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v2)) = - (1/18 : ℂ) • (v0) - + (11/27 : ℂ) • (v2) - + (1/18 : ℂ) • (v4) - + (-(17/72) : ℂ) • (v6) - + (-(1/108) : ℂ) • (v7) - + (-(17/72) : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v2))) = - (101/1296 : ℂ) • (v0) - + (227/648 : ℂ) • (v2) - + (101/1296 : ℂ) • (v4) - + (-(19/81) : ℂ) • (v6) - + (-(2/81) : ℂ) • (v7) - + (-(19/81) : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v2)))) = - (185/1944 : ℂ) • (v0) - + (101/324 : ℂ) • (v2) - + (185/1944 : ℂ) • (v4) - + (-(1771/7776) : ℂ) • (v6) - + (-(55/1296) : ℂ) • (v7) - + (-(1771/7776) : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h2] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the FF block. -/ -lemma projFF3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (-(1/24) : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have i2 : T (T v3) = - (-(1/4) : ℂ) • (v1) - + (1/2 : ℂ) • (v3) - + (-(1/4) : ℂ) • (v5) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v3)) = - (-(7/24) : ℂ) • (v1) - + (5/12 : ℂ) • (v3) - + (-(7/24) : ℂ) • (v5) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v3))) = - (-(5/16) : ℂ) • (v1) - + (3/8 : ℂ) • (v3) - + (-(5/16) : ℂ) • (v5) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v3)))) = - (-(31/96) : ℂ) • (v1) - + (17/48 : ℂ) • (v3) - + (-(31/96) : ℂ) • (v5) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h3] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 4 of the FF block. -/ -lemma projFF4 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) - + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) - + (324/5 : ℂ) • T (T (T (T (T v4)))) = - (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v4) = - (1/36 : ℂ) • (v0) - + (1/36 : ℂ) • (v2) - + (1/2 : ℂ) • (v4) - + (-(2/9) : ℂ) • (v7) - + (-(2/9) : ℂ) • (v8) := by - rw [h4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v4)) = - (1/18 : ℂ) • (v0) - + (1/18 : ℂ) • (v2) - + (11/27 : ℂ) • (v4) - + (-(1/108) : ℂ) • (v6) - + (-(17/72) : ℂ) • (v7) - + (-(17/72) : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v4))) = - (101/1296 : ℂ) • (v0) - + (101/1296 : ℂ) • (v2) - + (227/648 : ℂ) • (v4) - + (-(2/81) : ℂ) • (v6) - + (-(19/81) : ℂ) • (v7) - + (-(19/81) : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v4)))) = - (185/1944 : ℂ) • (v0) - + (185/1944 : ℂ) • (v2) - + (101/324 : ℂ) • (v4) - + (-(55/1296) : ℂ) • (v6) - + (-(1771/7776) : ℂ) • (v7) - + (-(1771/7776) : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h4] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 5 of the FF block. -/ -lemma projFF5 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) - + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) - + (324/5 : ℂ) • T (T (T (T (T v5)))) = - (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have i2 : T (T v5) = - (1/4 : ℂ) • (v1) - + (-(1/4) : ℂ) • (v3) - + (1/2 : ℂ) • (v5) := by - rw [h5] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v5)) = - (7/24 : ℂ) • (v1) - + (-(7/24) : ℂ) • (v3) - + (5/12 : ℂ) • (v5) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v5))) = - (5/16 : ℂ) • (v1) - + (-(5/16) : ℂ) • (v3) - + (3/8 : ℂ) • (v5) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v5)))) = - (31/96 : ℂ) • (v1) - + (-(31/96) : ℂ) • (v3) - + (17/48 : ℂ) • (v5) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h5] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 6 of the FF block. -/ -lemma projFF6 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) - + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) - + (324/5 : ℂ) • T (T (T (T (T v6)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v6) = - (-(2/9) : ℂ) • (v0) - + (-(2/9) : ℂ) • (v2) - + (1/2 : ℂ) • (v6) - + (1/36 : ℂ) • (v7) - + (1/36 : ℂ) • (v8) := by - rw [h6] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v6)) = - (-(17/72) : ℂ) • (v0) - + (-(17/72) : ℂ) • (v2) - + (-(1/108) : ℂ) • (v4) - + (11/27 : ℂ) • (v6) - + (1/18 : ℂ) • (v7) - + (1/18 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v6))) = - (-(19/81) : ℂ) • (v0) - + (-(19/81) : ℂ) • (v2) - + (-(2/81) : ℂ) • (v4) - + (227/648 : ℂ) • (v6) - + (101/1296 : ℂ) • (v7) - + (101/1296 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v6)))) = - (-(1771/7776) : ℂ) • (v0) - + (-(1771/7776) : ℂ) • (v2) - + (-(55/1296) : ℂ) • (v4) - + (101/324 : ℂ) • (v6) - + (185/1944 : ℂ) • (v7) - + (185/1944 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h6] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 7 of the FF block. -/ -lemma projFF7 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) - + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) - + (324/5 : ℂ) • T (T (T (T (T v7)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v7) = - (-(2/9) : ℂ) • (v0) - + (-(2/9) : ℂ) • (v4) - + (1/36 : ℂ) • (v6) - + (1/2 : ℂ) • (v7) - + (1/36 : ℂ) • (v8) := by - rw [h7] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v7)) = - (-(17/72) : ℂ) • (v0) - + (-(1/108) : ℂ) • (v2) - + (-(17/72) : ℂ) • (v4) - + (1/18 : ℂ) • (v6) - + (11/27 : ℂ) • (v7) - + (1/18 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v7))) = - (-(19/81) : ℂ) • (v0) - + (-(2/81) : ℂ) • (v2) - + (-(19/81) : ℂ) • (v4) - + (101/1296 : ℂ) • (v6) - + (227/648 : ℂ) • (v7) - + (101/1296 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v7)))) = - (-(1771/7776) : ℂ) • (v0) - + (-(55/1296) : ℂ) • (v2) - + (-(1771/7776) : ℂ) • (v4) - + (185/1944 : ℂ) • (v6) - + (101/324 : ℂ) • (v7) - + (185/1944 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h7] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 8 of the FF block. -/ -lemma projFF8 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) - + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) - + (324/5 : ℂ) • T (T (T (T (T v8)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v8) = - (-(2/9) : ℂ) • (v2) - + (-(2/9) : ℂ) • (v4) - + (1/36 : ℂ) • (v6) - + (1/36 : ℂ) • (v7) - + (1/2 : ℂ) • (v8) := by - rw [h8] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v8)) = - (-(1/108) : ℂ) • (v0) - + (-(17/72) : ℂ) • (v2) - + (-(17/72) : ℂ) • (v4) - + (1/18 : ℂ) • (v6) - + (1/18 : ℂ) • (v7) - + (11/27 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v8))) = - (-(2/81) : ℂ) • (v0) - + (-(19/81) : ℂ) • (v2) - + (-(19/81) : ℂ) • (v4) - + (101/1296 : ℂ) • (v6) - + (101/1296 : ℂ) • (v7) - + (227/648 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v8)))) = - (-(55/1296) : ℂ) • (v0) - + (-(1771/7776) : ℂ) • (v2) - + (-(1771/7776) : ℂ) • (v4) - + (185/1944 : ℂ) • (v6) - + (185/1944 : ℂ) • (v7) - + (101/324 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h8] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the DDF block. -/ -lemma projDDF0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (0 : M) := by - have i2 : T (T v0) = - (1/6 : ℂ) • (v0) - + (-(1/36) : ℂ) • (v2) - + (-(1/36) : ℂ) • (v4) - + (1/6 : ℂ) • (v7) - + (1/6 : ℂ) • (v9) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v0)) = - (1/9 : ℂ) • (v0) - + (-(1/27) : ℂ) • (v2) - + (-(1/27) : ℂ) • (v4) - + (31/216 : ℂ) • (v7) - + (31/216 : ℂ) • (v9) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v0))) = - (55/648 : ℂ) • (v0) - + (-(47/1296) : ℂ) • (v2) - + (-(47/1296) : ℂ) • (v4) - + (13/108 : ℂ) • (v7) - + (13/108 : ℂ) • (v9) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v0)))) = - (133/1944 : ℂ) • (v0) - + (-(125/3888) : ℂ) • (v2) - + (-(125/3888) : ℂ) • (v4) - + (781/7776 : ℂ) • (v7) - + (781/7776 : ℂ) • (v9) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h0] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the DDF block. -/ -lemma projDDF1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (0 : M) := by - have i2 : T (T v1) = - (1/6 : ℂ) • (v1) - + (1/36 : ℂ) • (v3) - + (-(1/36) : ℂ) • (v5) - + (-(1/6) : ℂ) • (v6) - + (1/6 : ℂ) • (v8) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v1)) = - (1/9 : ℂ) • (v1) - + (1/27 : ℂ) • (v3) - + (-(1/27) : ℂ) • (v5) - + (-(31/216) : ℂ) • (v6) - + (31/216 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v1))) = - (55/648 : ℂ) • (v1) - + (47/1296 : ℂ) • (v3) - + (-(47/1296) : ℂ) • (v5) - + (-(13/108) : ℂ) • (v6) - + (13/108 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v1)))) = - (133/1944 : ℂ) • (v1) - + (125/3888 : ℂ) • (v3) - + (-(125/3888) : ℂ) • (v5) - + (-(781/7776) : ℂ) • (v6) - + (781/7776 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h1] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the DDF block. -/ -lemma projDDF2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (0 : M) := by - have i2 : T (T v2) = - (-(1/36) : ℂ) • (v0) - + (1/6 : ℂ) • (v2) - + (-(1/36) : ℂ) • (v4) - + (-(1/6) : ℂ) • (v7) - + (1/6 : ℂ) • (v11) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v2)) = - (-(1/27) : ℂ) • (v0) - + (1/9 : ℂ) • (v2) - + (-(1/27) : ℂ) • (v4) - + (-(31/216) : ℂ) • (v7) - + (31/216 : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v2))) = - (-(47/1296) : ℂ) • (v0) - + (55/648 : ℂ) • (v2) - + (-(47/1296) : ℂ) • (v4) - + (-(13/108) : ℂ) • (v7) - + (13/108 : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v2)))) = - (-(125/3888) : ℂ) • (v0) - + (133/1944 : ℂ) • (v2) - + (-(125/3888) : ℂ) • (v4) - + (-(781/7776) : ℂ) • (v7) - + (781/7776 : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h2] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the DDF block. -/ -lemma projDDF3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (0 : M) := by - have i2 : T (T v3) = - (1/36 : ℂ) • (v1) - + (1/6 : ℂ) • (v3) - + (1/36 : ℂ) • (v5) - + (-(1/6) : ℂ) • (v6) - + (1/6 : ℂ) • (v10) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v3)) = - (1/27 : ℂ) • (v1) - + (1/9 : ℂ) • (v3) - + (1/27 : ℂ) • (v5) - + (-(31/216) : ℂ) • (v6) - + (31/216 : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v3))) = - (47/1296 : ℂ) • (v1) - + (55/648 : ℂ) • (v3) - + (47/1296 : ℂ) • (v5) - + (-(13/108) : ℂ) • (v6) - + (13/108 : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v3)))) = - (125/3888 : ℂ) • (v1) - + (133/1944 : ℂ) • (v3) - + (125/3888 : ℂ) • (v5) - + (-(781/7776) : ℂ) • (v6) - + (781/7776 : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h3] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 4 of the DDF block. -/ -lemma projDDF4 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) - + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) - + (324/5 : ℂ) • T (T (T (T (T v4)))) = - (0 : M) := by - have i2 : T (T v4) = - (-(1/36) : ℂ) • (v0) - + (-(1/36) : ℂ) • (v2) - + (1/6 : ℂ) • (v4) - + (-(1/6) : ℂ) • (v9) - + (-(1/6) : ℂ) • (v11) := by - rw [h4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v4)) = - (-(1/27) : ℂ) • (v0) - + (-(1/27) : ℂ) • (v2) - + (1/9 : ℂ) • (v4) - + (-(31/216) : ℂ) • (v9) - + (-(31/216) : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v4))) = - (-(47/1296) : ℂ) • (v0) - + (-(47/1296) : ℂ) • (v2) - + (55/648 : ℂ) • (v4) - + (-(13/108) : ℂ) • (v9) - + (-(13/108) : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v4)))) = - (-(125/3888) : ℂ) • (v0) - + (-(125/3888) : ℂ) • (v2) - + (133/1944 : ℂ) • (v4) - + (-(781/7776) : ℂ) • (v9) - + (-(781/7776) : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h4] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 5 of the DDF block. -/ -lemma projDDF5 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) - + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) - + (324/5 : ℂ) • T (T (T (T (T v5)))) = - (0 : M) := by - have i2 : T (T v5) = - (-(1/36) : ℂ) • (v1) - + (1/36 : ℂ) • (v3) - + (1/6 : ℂ) • (v5) - + (-(1/6) : ℂ) • (v8) - + (1/6 : ℂ) • (v10) := by - rw [h5] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v5)) = - (-(1/27) : ℂ) • (v1) - + (1/27 : ℂ) • (v3) - + (1/9 : ℂ) • (v5) - + (-(31/216) : ℂ) • (v8) - + (31/216 : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v5))) = - (-(47/1296) : ℂ) • (v1) - + (47/1296 : ℂ) • (v3) - + (55/648 : ℂ) • (v5) - + (-(13/108) : ℂ) • (v8) - + (13/108 : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v5)))) = - (-(125/3888) : ℂ) • (v1) - + (125/3888 : ℂ) • (v3) - + (133/1944 : ℂ) • (v5) - + (-(781/7776) : ℂ) • (v8) - + (781/7776 : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h5] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 6 of the DDF block. -/ -lemma projDDF6 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) - + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) - + (324/5 : ℂ) • T (T (T (T (T v6)))) = - (0 : M) := by - have i2 : T (T v6) = - (-(1/6) : ℂ) • (v1) - + (-(1/6) : ℂ) • (v3) - + (1/2 : ℂ) • (v6) - + (-(1/36) : ℂ) • (v8) - + (-(1/36) : ℂ) • (v10) := by - rw [h6] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v6)) = - (-(31/216) : ℂ) • (v1) - + (-(31/216) : ℂ) • (v3) - + (7/18 : ℂ) • (v6) - + (-(5/108) : ℂ) • (v8) - + (-(5/108) : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v6))) = - (-(13/108) : ℂ) • (v1) - + (-(13/108) : ℂ) • (v3) - + (199/648 : ℂ) • (v6) - + (-(71/1296) : ℂ) • (v8) - + (-(71/1296) : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v6)))) = - (-(781/7776) : ℂ) • (v1) - + (-(781/7776) : ℂ) • (v3) - + (119/486 : ℂ) • (v6) - + (-(55/972) : ℂ) • (v8) - + (-(55/972) : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h6] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 7 of the DDF block. -/ -lemma projDDF7 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) - + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) - + (324/5 : ℂ) • T (T (T (T (T v7)))) = - (0 : M) := by - have i2 : T (T v7) = - (1/6 : ℂ) • (v0) - + (-(1/6) : ℂ) • (v2) - + (1/2 : ℂ) • (v7) - + (1/36 : ℂ) • (v9) - + (-(1/36) : ℂ) • (v11) := by - rw [h7] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v7)) = - (31/216 : ℂ) • (v0) - + (-(31/216) : ℂ) • (v2) - + (7/18 : ℂ) • (v7) - + (5/108 : ℂ) • (v9) - + (-(5/108) : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v7))) = - (13/108 : ℂ) • (v0) - + (-(13/108) : ℂ) • (v2) - + (199/648 : ℂ) • (v7) - + (71/1296 : ℂ) • (v9) - + (-(71/1296) : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v7)))) = - (781/7776 : ℂ) • (v0) - + (-(781/7776) : ℂ) • (v2) - + (119/486 : ℂ) • (v7) - + (55/972 : ℂ) • (v9) - + (-(55/972) : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h7] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 8 of the DDF block. -/ -lemma projDDF8 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) - + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) - + (324/5 : ℂ) • T (T (T (T (T v8)))) = - (0 : M) := by - have i2 : T (T v8) = - (1/6 : ℂ) • (v1) - + (-(1/6) : ℂ) • (v5) - + (-(1/36) : ℂ) • (v6) - + (1/2 : ℂ) • (v8) - + (-(1/36) : ℂ) • (v10) := by - rw [h8] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v8)) = - (31/216 : ℂ) • (v1) - + (-(31/216) : ℂ) • (v5) - + (-(5/108) : ℂ) • (v6) - + (7/18 : ℂ) • (v8) - + (-(5/108) : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v8))) = - (13/108 : ℂ) • (v1) - + (-(13/108) : ℂ) • (v5) - + (-(71/1296) : ℂ) • (v6) - + (199/648 : ℂ) • (v8) - + (-(71/1296) : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v8)))) = - (781/7776 : ℂ) • (v1) - + (-(781/7776) : ℂ) • (v5) - + (-(55/972) : ℂ) • (v6) - + (119/486 : ℂ) • (v8) - + (-(55/972) : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h8] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 9 of the DDF block. -/ -lemma projDDF9 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v9 + (137/10 : ℂ) • T v9 + (-(135/2) : ℂ) • T (T v9) - + (153 : ℂ) • T (T (T v9)) + (-162 : ℂ) • T (T (T (T v9))) - + (324/5 : ℂ) • T (T (T (T (T v9)))) = - (0 : M) := by - have i2 : T (T v9) = - (1/6 : ℂ) • (v0) - + (-(1/6) : ℂ) • (v4) - + (1/36 : ℂ) • (v7) - + (1/2 : ℂ) • (v9) - + (1/36 : ℂ) • (v11) := by - rw [h9] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v9)) = - (31/216 : ℂ) • (v0) - + (-(31/216) : ℂ) • (v4) - + (5/108 : ℂ) • (v7) - + (7/18 : ℂ) • (v9) - + (5/108 : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v9))) = - (13/108 : ℂ) • (v0) - + (-(13/108) : ℂ) • (v4) - + (71/1296 : ℂ) • (v7) - + (199/648 : ℂ) • (v9) - + (71/1296 : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v9)))) = - (781/7776 : ℂ) • (v0) - + (-(781/7776) : ℂ) • (v4) - + (55/972 : ℂ) • (v7) - + (119/486 : ℂ) • (v9) - + (55/972 : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h9] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 10 of the DDF block. -/ -lemma projDDF10 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v10 + (137/10 : ℂ) • T v10 + (-(135/2) : ℂ) • T (T v10) - + (153 : ℂ) • T (T (T v10)) + (-162 : ℂ) • T (T (T (T v10))) - + (324/5 : ℂ) • T (T (T (T (T v10)))) = - (0 : M) := by - have i2 : T (T v10) = - (1/6 : ℂ) • (v3) - + (1/6 : ℂ) • (v5) - + (-(1/36) : ℂ) • (v6) - + (-(1/36) : ℂ) • (v8) - + (1/2 : ℂ) • (v10) := by - rw [h10] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v10)) = - (31/216 : ℂ) • (v3) - + (31/216 : ℂ) • (v5) - + (-(5/108) : ℂ) • (v6) - + (-(5/108) : ℂ) • (v8) - + (7/18 : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v10))) = - (13/108 : ℂ) • (v3) - + (13/108 : ℂ) • (v5) - + (-(71/1296) : ℂ) • (v6) - + (-(71/1296) : ℂ) • (v8) - + (199/648 : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v10)))) = - (781/7776 : ℂ) • (v3) - + (781/7776 : ℂ) • (v5) - + (-(55/972) : ℂ) • (v6) - + (-(55/972) : ℂ) • (v8) - + (119/486 : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h10] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 11 of the DDF block. -/ -lemma projDDF11 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v11 + (137/10 : ℂ) • T v11 + (-(135/2) : ℂ) • T (T v11) - + (153 : ℂ) • T (T (T v11)) + (-162 : ℂ) • T (T (T (T v11))) - + (324/5 : ℂ) • T (T (T (T (T v11)))) = - (0 : M) := by - have i2 : T (T v11) = - (1/6 : ℂ) • (v2) - + (-(1/6) : ℂ) • (v4) - + (-(1/36) : ℂ) • (v7) - + (1/36 : ℂ) • (v9) - + (1/2 : ℂ) • (v11) := by - rw [h11] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v11)) = - (31/216 : ℂ) • (v2) - + (-(31/216) : ℂ) • (v4) - + (-(5/108) : ℂ) • (v7) - + (5/108 : ℂ) • (v9) - + (7/18 : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v11))) = - (13/108 : ℂ) • (v2) - + (-(13/108) : ℂ) • (v4) - + (-(71/1296) : ℂ) • (v7) - + (71/1296 : ℂ) • (v9) - + (199/648 : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v11)))) = - (781/7776 : ℂ) • (v2) - + (-(781/7776) : ℂ) • (v4) - + (-(55/972) : ℂ) • (v7) - + (55/972 : ℂ) • (v9) - + (119/486 : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h11] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the FMu block. -/ -lemma projFMu0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (-(Complex.I/4)) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v0) = - (1/3 : ℂ) • (v0) - + (-(2/9) : ℂ) • (v1) - + ((-(2/9) : ℂ) * Complex.I) • (v2) - + (-(2/9) : ℂ) • (v3) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v0)) = - (5/18 : ℂ) • (v0) - + (-(13/54) : ℂ) • (v1) - + ((-(13/54) : ℂ) * Complex.I) • (v2) - + (-(13/54) : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v0))) = - (7/27 : ℂ) • (v0) - + (-(20/81) : ℂ) • (v1) - + ((-(20/81) : ℂ) * Complex.I) • (v2) - + (-(20/81) : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v0)))) = - (41/162 : ℂ) • (v0) - + (-(121/486) : ℂ) • (v1) - + ((-(121/486) : ℂ) * Complex.I) • (v2) - + (-(121/486) : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h0] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the FMu block. -/ -lemma projFMu1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v1) = - (-(2/9) : ℂ) • (v0) - + (13/18 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (1/36 : ℂ) • (v3) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v1)) = - (-(13/54) : ℂ) • (v0) - + (23/36 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (13/216 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v1))) = - (-(20/81) : ℂ) • (v0) - + (371/648 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (13/144 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v1)))) = - (-(121/486) : ℂ) • (v0) - + (2015/3888 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (905/7776 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h1] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the FMu block. -/ -lemma projFMu2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (1/4 : ℂ) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v2) = - ((2/9 : ℂ) * Complex.I) • (v0) - + ((-(1/36) : ℂ) * Complex.I) • (v1) - + (13/18 : ℂ) • (v2) - + ((-(1/36) : ℂ) * Complex.I) • (v3) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v2)) = - ((13/54 : ℂ) * Complex.I) • (v0) - + ((-(13/216) : ℂ) * Complex.I) • (v1) - + (23/36 : ℂ) • (v2) - + ((-(13/216) : ℂ) * Complex.I) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v2))) = - ((20/81 : ℂ) * Complex.I) • (v0) - + ((-(13/144) : ℂ) * Complex.I) • (v1) - + (371/648 : ℂ) • (v2) - + ((-(13/144) : ℂ) * Complex.I) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v2)))) = - ((121/486 : ℂ) * Complex.I) • (v0) - + ((-(905/7776) : ℂ) * Complex.I) • (v1) - + (2015/3888 : ℂ) • (v2) - + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h2] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the FMu block. -/ -lemma projFMu3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v3) = - (-(2/9) : ℂ) • (v0) - + (1/36 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (13/18 : ℂ) • (v3) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v3)) = - (-(13/54) : ℂ) • (v0) - + (13/216 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (23/36 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v3))) = - (-(20/81) : ℂ) • (v0) - + (13/144 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (371/648 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v3)))) = - (-(121/486) : ℂ) • (v0) - + (905/7776 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (2015/3888 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the FMubar block. -/ -lemma projFMubar0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (Complex.I/4) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v0) = - (1/3 : ℂ) • (v0) - + (-(2/9) : ℂ) • (v1) - + ((-(2/9) : ℂ) * Complex.I) • (v2) - + (-(2/9) : ℂ) • (v3) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v0)) = - (5/18 : ℂ) • (v0) - + (-(13/54) : ℂ) • (v1) - + ((-(13/54) : ℂ) * Complex.I) • (v2) - + (-(13/54) : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v0))) = - (7/27 : ℂ) • (v0) - + (-(20/81) : ℂ) • (v1) - + ((-(20/81) : ℂ) * Complex.I) • (v2) - + (-(20/81) : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v0)))) = - (41/162 : ℂ) • (v0) - + (-(121/486) : ℂ) • (v1) - + ((-(121/486) : ℂ) * Complex.I) • (v2) - + (-(121/486) : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h0] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the FMubar block. -/ -lemma projFMubar1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v1) = - (-(2/9) : ℂ) • (v0) - + (13/18 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (1/36 : ℂ) • (v3) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v1)) = - (-(13/54) : ℂ) • (v0) - + (23/36 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (13/216 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v1))) = - (-(20/81) : ℂ) • (v0) - + (371/648 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (13/144 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v1)))) = - (-(121/486) : ℂ) • (v0) - + (2015/3888 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (905/7776 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h1] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the FMubar block. -/ -lemma projFMubar2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (-(1/4) : ℂ) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v2) = - ((2/9 : ℂ) * Complex.I) • (v0) - + ((-(1/36) : ℂ) * Complex.I) • (v1) - + (13/18 : ℂ) • (v2) - + ((-(1/36) : ℂ) * Complex.I) • (v3) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v2)) = - ((13/54 : ℂ) * Complex.I) • (v0) - + ((-(13/216) : ℂ) * Complex.I) • (v1) - + (23/36 : ℂ) • (v2) - + ((-(13/216) : ℂ) * Complex.I) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v2))) = - ((20/81 : ℂ) * Complex.I) • (v0) - + ((-(13/144) : ℂ) * Complex.I) • (v1) - + (371/648 : ℂ) • (v2) - + ((-(13/144) : ℂ) * Complex.I) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v2)))) = - ((121/486 : ℂ) * Complex.I) • (v0) - + ((-(905/7776) : ℂ) * Complex.I) • (v1) - + (2015/3888 : ℂ) • (v2) - + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h2] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the FMubar block. -/ -lemma projFMubar3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v3) = - (-(2/9) : ℂ) • (v0) - + (1/36 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (13/18 : ℂ) • (v3) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v3)) = - (-(13/54) : ℂ) • (v0) - + (13/216 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (23/36 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v3))) = - (-(20/81) : ℂ) • (v0) - + (13/144 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (371/648 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v3)))) = - (-(121/486) : ℂ) • (v0) - + (905/7776 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (2015/3888 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F01_F01`. -/ -lemma opPi_F01_F01 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF0 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F01_F23`. -/ -lemma opPi_F01_F23 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (1/24 : ℂ) • thetaTerm := by - rw [opPi_apply, - projFF1 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F02_F02`. -/ -lemma opPi_F02_F02 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF2 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F02_F13`. -/ -lemma opPi_F02_F13 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (-(1/24) : ℂ) • thetaTerm := by - rw [opPi_apply, - projFF3 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F03_F03`. -/ -lemma opPi_F03_F03 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF4 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F03_F12`. -/ -lemma opPi_F03_F12 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (1/24 : ℂ) • thetaTerm := by - rw [opPi_apply, - projFF5 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F12_F12`. -/ -lemma opPi_F12_F12 : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (1/12 : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF6 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F13_F13`. -/ -lemma opPi_F13_F13 : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (1/12 : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF7 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F23_F23`. -/ -lemma opPi_F23_F23 : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (1/12 : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF8 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd01_F01`. -/ -lemma opPi_dd01_F01 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF0 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd01_F23`. -/ -lemma opPi_dd01_F23 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF1 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd02_F02`. -/ -lemma opPi_dd02_F02 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF2 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd02_F13`. -/ -lemma opPi_dd02_F13 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF3 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd03_F03`. -/ -lemma opPi_dd03_F03 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF4 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd03_F12`. -/ -lemma opPi_dd03_F12 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF5 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd12_F03`. -/ -lemma opPi_dd12_F03 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF6 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd12_F12`. -/ -lemma opPi_dd12_F12 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF7 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd13_F02`. -/ -lemma opPi_dd13_F02 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF8 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd13_F13`. -/ -lemma opPi_dd13_F13 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF9 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd23_F01`. -/ -lemma opPi_dd23_F01 : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF10 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd23_F23`. -/ -lemma opPi_dd23_F23 : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF11 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u0`. -/ -lemma opPi_u0 : - opPi (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (-(Complex.I/4)) • fermionKineticTerm := by - rw [opPi_apply, - projFMu0 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u1`. -/ -lemma opPi_u1 : - opPi (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (Complex.I/4) • fermionKineticTerm := by - rw [opPi_apply, - projFMu1 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u2`. -/ -lemma opPi_u2 : - opPi (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (1/4 : ℂ) • fermionKineticTerm := by - rw [opPi_apply, - projFMu2 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u3`. -/ -lemma opPi_u3 : - opPi (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (Complex.I/4) • fermionKineticTerm := by - rw [opPi_apply, - projFMu3 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar0`. -/ -lemma opPi_ubar0 : - opPi (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (Complex.I/4) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar0 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar1`. -/ -lemma opPi_ubar1 : - opPi (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (-(Complex.I/4)) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar1 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar2`. -/ -lemma opPi_ubar2 : - opPi (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (-(1/4) : ℂ) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar2 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar3`. -/ -lemma opPi_ubar3 : - opPi (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (-(Complex.I/4)) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar3 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - -/-- Entries of the Lorentz matrix of `parityZ`. -/ -lemma parityMatZ_00 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide +The gauge- and Lorentz-invariant elements of the QED jet algebra of mass +dimension at most four are exactly the linear combinations of the constants, +the Maxwell term, the theta term and the two fermion kinetic terms: -lemma parityMatZ_01 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide +`InvariantMassWeightSubmodule 8 = span ℂ massDimFourInvariants`. -lemma parityMatZ_02 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_03 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_10 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_11 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 0) = -1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_12 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_13 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_20 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_21 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_22 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 1) = -1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_23 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_30 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_31 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_32 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_33 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 2) = 1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -/-- Entries of the Lorentz matrix of `parityX`. -/ -lemma parityMatX_00 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_01 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_02 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_03 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_10 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_11 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 0) = 1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_12 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_13 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_20 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_21 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_22 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 1) = -1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_23 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_30 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_31 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_32 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_33 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 2) = -1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -/-- Entries of the Lorentz matrix of `parityY`. -/ -lemma parityMatY_00 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_01 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_02 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_03 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_10 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_11 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 0) = -1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_12 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_13 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_20 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_21 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_22 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 1) = 1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_23 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_30 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_31 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_32 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_33 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 2) = -1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -set_option maxHeartbeats 2000000 in -/-- The Klein average acts diagonally on products of two field strengths, by - the average of the four parity signs. -/ -lemma kleinAvg_fieldStrengthDeriv_nil_mul (a b c d : Fin 1 ⊕ Fin 3) : - kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = - (((1 + paritySignZ a * paritySignZ b * (paritySignZ c * paritySignZ d) + - paritySignY a * paritySignY b * (paritySignY c * paritySignY d) + - paritySignX a * paritySignX b * (paritySignX c * paritySignX d)) / 4 : ℝ) : ℂ) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_apply_mul, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX, - smul_mul_smul_jet] - push_cast - module - -/-- Under a diagonal Lorentz transformation the second-derivative field - strength scales by the product of the signs of its four indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv_pair {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {ρ, τ} μ ν) = - ((sgn ρ * (sgn τ * (sgn μ * sgn ν)) : ℝ) : ℂ) • - fieldStrengthDeriv {ρ, τ} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_pair] - rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun s _ => - Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by - rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ρ) h)] - rw [Finset.sum_eq_single τ (fun s _ hs => Finset.sum_eq_zero fun a _ => - Finset.sum_eq_zero fun b _ => by - rw [hM s τ, if_neg hs, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ τ) h)] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, mul_zero, mul_zero, Complex.ofReal_zero, - zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, mul_zero, mul_zero, Complex.ofReal_zero, - zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM ρ ρ, if_pos rfl, hM τ τ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, - if_pos rfl] - -/-- The Klein average acts diagonally on the second-derivative field - strengths. -/ -lemma kleinAvg_fieldStrengthDeriv_pair (r t a b : Fin 1 ⊕ Fin 3) : - kleinAvg (fieldStrengthDeriv {r, t} a b) = - (((1 + paritySignZ r * (paritySignZ t * (paritySignZ a * paritySignZ b)) + - paritySignY r * (paritySignY t * (paritySignY a * paritySignY b)) + - paritySignX r * (paritySignX t * (paritySignX a * paritySignX b))) / 4 : ℝ) : ℂ) • - fieldStrengthDeriv {r, t} a b := by - rw [kleinAvg_apply, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityX] - push_cast - module - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,0]` (u-family). -/ -lemma kleinAvg_u_e000 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,1]` (u-family). -/ -lemma kleinAvg_u_e001 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,0]` (u-family). -/ -lemma kleinAvg_u_e010 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,1]` (u-family). -/ -lemma kleinAvg_u_e011 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,0]` (u-family). -/ -lemma kleinAvg_u_e100 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,1]` (u-family). -/ -lemma kleinAvg_u_e101 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,0]` (u-family). -/ -lemma kleinAvg_u_e110 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,1]` (u-family). -/ -lemma kleinAvg_u_e111 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,0]` (u-family). -/ -lemma kleinAvg_u_e200 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,1]` (u-family). -/ -lemma kleinAvg_u_e201 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,0]` (u-family). -/ -lemma kleinAvg_u_e210 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,1]` (u-family). -/ -lemma kleinAvg_u_e211 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,0]` (u-family). -/ -lemma kleinAvg_u_e300 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,1]` (u-family). -/ -lemma kleinAvg_u_e301 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,0]` (u-family). -/ -lemma kleinAvg_u_e310 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,1]` (u-family). -/ -lemma kleinAvg_u_e311 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e000 : - kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e001 : - kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e010 : - kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e011 : - kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e100 : - kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e101 : - kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e110 : - kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e111 : - kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e200 : - kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e201 : - kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e210 : - kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (-(1/2) : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e211 : - kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e300 : - kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e301 : - kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e310 : - kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e311 : - kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (-(1/2) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -/-- The Maxwell term lies in the span of the invariants. -/ -lemma maxwellTerm_mem_span : - maxwellTerm ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- The theta term lies in the span of the invariants. -/ -lemma thetaTerm_mem_span : - thetaTerm ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- The fermion kinetic term lies in the span of the invariants. -/ -lemma fermionKineticTerm_mem_span : - fermionKineticTerm ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- The conjugate fermion kinetic term lies in the span of the invariants. -/ -lemma fermionKineticTermBar_mem_span : - fermionKineticTermBar ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- Projector membership for the ordered square `F01 * F01`. -/ -lemma opPi_FF_c0101_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F01_F01] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F01 * F10`. -/ -lemma opPi_FF_c0110_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F01_F01] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F01`. -/ -lemma opPi_FF_c1001_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F01_F01] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F10`. -/ -lemma opPi_FF_c1010_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F01_F01] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F01 * F23`. -/ -lemma opPi_FF_c0123_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F01 * F32`. -/ -lemma opPi_FF_c0132_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F23`. -/ -lemma opPi_FF_c1023_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F32`. -/ -lemma opPi_FF_c1032_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F01`. -/ -lemma opPi_FF_c2301_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F10`. -/ -lemma opPi_FF_c2310_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F01`. -/ -lemma opPi_FF_c3201_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F10`. -/ -lemma opPi_FF_c3210_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F23`. -/ -lemma opPi_FF_c2323_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F23_F23] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F32`. -/ -lemma opPi_FF_c2332_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F23_F23] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F23`. -/ -lemma opPi_FF_c3223_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F23_F23] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F32`. -/ -lemma opPi_FF_c3232_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F23_F23] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F02`. -/ -lemma opPi_FF_c0202_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F02_F02] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F20`. -/ -lemma opPi_FF_c0220_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F02_F02] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F02`. -/ -lemma opPi_FF_c2002_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F02_F02] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F20`. -/ -lemma opPi_FF_c2020_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F02_F02] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F13`. -/ -lemma opPi_FF_c0213_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F31`. -/ -lemma opPi_FF_c0231_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F13`. -/ -lemma opPi_FF_c2013_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F31`. -/ -lemma opPi_FF_c2031_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F02`. -/ -lemma opPi_FF_c1302_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F20`. -/ -lemma opPi_FF_c1320_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F02`. -/ -lemma opPi_FF_c3102_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F20`. -/ -lemma opPi_FF_c3120_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F13`. -/ -lemma opPi_FF_c1313_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F13_F13] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F31`. -/ -lemma opPi_FF_c1331_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F13_F13] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F13`. -/ -lemma opPi_FF_c3113_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F13_F13] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F31`. -/ -lemma opPi_FF_c3131_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F13_F13] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F03`. -/ -lemma opPi_FF_c0303_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F03_F03] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F30`. -/ -lemma opPi_FF_c0330_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F03_F03] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F03`. -/ -lemma opPi_FF_c3003_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F03_F03] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F30`. -/ -lemma opPi_FF_c3030_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F03_F03] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F12`. -/ -lemma opPi_FF_c0312_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F21`. -/ -lemma opPi_FF_c0321_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F12`. -/ -lemma opPi_FF_c3012_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F21`. -/ -lemma opPi_FF_c3021_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F03`. -/ -lemma opPi_FF_c1203_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F30`. -/ -lemma opPi_FF_c1230_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F03`. -/ -lemma opPi_FF_c2103_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F30`. -/ -lemma opPi_FF_c2130_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F12`. -/ -lemma opPi_FF_c1212_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F12_F12] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F21`. -/ -lemma opPi_FF_c1221_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F12_F12] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F12`. -/ -lemma opPi_FF_c2112_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F12_F12] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F21`. -/ -lemma opPi_FF_c2121_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul_jet, mul_neg_jet, neg_neg, map_neg] - rw [opPi_F12_F12] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered derivative monomial `dd01 F01`. -/ -lemma opPi_DDF_c0101_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd01_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd01 F10`. -/ -lemma opPi_DDF_c0110_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F01`. -/ -lemma opPi_DDF_c1001_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [opPi_dd01_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F10`. -/ -lemma opPi_DDF_c1010_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd01 F23`. -/ -lemma opPi_DDF_c0123_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd01_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd01 F32`. -/ -lemma opPi_DDF_c0132_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F23`. -/ -lemma opPi_DDF_c1023_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [opPi_dd01_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F32`. -/ -lemma opPi_DDF_c1032_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F02`. -/ -lemma opPi_DDF_c0202_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd02_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F20`. -/ -lemma opPi_DDF_c0220_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F02`. -/ -lemma opPi_DDF_c2002_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [opPi_dd02_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F20`. -/ -lemma opPi_DDF_c2020_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F13`. -/ -lemma opPi_DDF_c0213_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd02_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F31`. -/ -lemma opPi_DDF_c0231_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F13`. -/ -lemma opPi_DDF_c2013_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [opPi_dd02_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F31`. -/ -lemma opPi_DDF_c2031_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F03`. -/ -lemma opPi_DDF_c0303_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd03_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F30`. -/ -lemma opPi_DDF_c0330_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F03`. -/ -lemma opPi_DDF_c3003_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [opPi_dd03_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F30`. -/ -lemma opPi_DDF_c3030_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F12`. -/ -lemma opPi_DDF_c0312_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd03_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F21`. -/ -lemma opPi_DDF_c0321_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F12`. -/ -lemma opPi_DDF_c3012_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [opPi_dd03_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F21`. -/ -lemma opPi_DDF_c3021_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F03`. -/ -lemma opPi_DDF_c1203_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd12_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F30`. -/ -lemma opPi_DDF_c1230_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F03`. -/ -lemma opPi_DDF_c2103_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [opPi_dd12_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F30`. -/ -lemma opPi_DDF_c2130_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F12`. -/ -lemma opPi_DDF_c1212_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd12_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F21`. -/ -lemma opPi_DDF_c1221_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F12`. -/ -lemma opPi_DDF_c2112_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [opPi_dd12_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F21`. -/ -lemma opPi_DDF_c2121_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F02`. -/ -lemma opPi_DDF_c1302_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd13_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F20`. -/ -lemma opPi_DDF_c1320_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F02`. -/ -lemma opPi_DDF_c3102_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [opPi_dd13_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F20`. -/ -lemma opPi_DDF_c3120_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F13`. -/ -lemma opPi_DDF_c1313_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd13_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F31`. -/ -lemma opPi_DDF_c1331_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F13`. -/ -lemma opPi_DDF_c3113_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [opPi_dd13_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F31`. -/ -lemma opPi_DDF_c3131_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F01`. -/ -lemma opPi_DDF_c2301_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd23_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F10`. -/ -lemma opPi_DDF_c2310_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F01`. -/ -lemma opPi_DDF_c3201_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [opPi_dd23_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F10`. -/ -lemma opPi_DDF_c3210_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F23`. -/ -lemma opPi_DDF_c2323_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd23_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F32`. -/ -lemma opPi_DDF_c2332_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F23`. -/ -lemma opPi_DDF_c3223_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [opPi_dd23_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F32`. -/ -lemma opPi_DDF_c3232_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[0,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u000_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e000, map_smul, opPi_u0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[0,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u001_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e001, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[0,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u010_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e010, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[0,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u011_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e011, map_smul, opPi_u0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[1,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u100_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e100, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[1,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u101_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e101, map_smul, opPi_u1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[1,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u110_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e110, map_smul, opPi_u1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[1,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u111_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e111, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[2,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u200_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e200, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[2,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u201_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e201, map_smul, opPi_u2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[2,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u210_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e210, map_smul, opPi_u2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[2,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u211_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e211, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[3,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u300_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e300, map_smul, opPi_u3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[3,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u301_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e301, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[3,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u310_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e310, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[3,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u311_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e311, map_smul, opPi_u3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected Klein average of `e[0,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar000_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e000, map_smul, opPi_ubar0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected Klein average of `e[0,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar001_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e001, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[0,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar010_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e010, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[0,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar011_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e011, map_smul, opPi_ubar0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected Klein average of `e[1,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar100_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e100, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[1,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar101_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e101, map_smul, opPi_ubar1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected Klein average of `e[1,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar110_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e110, map_smul, opPi_ubar1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected Klein average of `e[1,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar111_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e111, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[2,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar200_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e200, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[2,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar201_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e201, map_smul, opPi_ubar2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected Klein average of `e[2,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar210_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e210, map_smul, opPi_ubar2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected Klein average of `e[2,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar211_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e211, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[3,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar300_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e300, map_smul, opPi_ubar3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected Klein average of `e[3,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar301_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e301, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[3,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar310_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e310, map_zero] - exact Submodule.zero_mem _ - -/-- Projected Klein average of `e[3,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar311_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e311, map_smul, opPi_ubar3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -attribute [local irreducible] Dψ Dbarψ fieldStrengthDeriv - -set_option maxHeartbeats 16000000 in -set_option maxRecDepth 8192 in -/-- The projected Klein average of any product of two field strengths lies in - the span of the invariants. -/ -lemma opPi_kleinAvg_FF_mem (a b c d : Fin 1 ⊕ Fin 3) : - opPi (kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_fieldStrengthDeriv_nil_mul, map_smul] - rcases a with a | a <;> rcases b with b | b <;> rcases c with c | c <;> - rcases d with d | d <;> fin_cases a <;> fin_cases b <;> fin_cases c <;> - fin_cases d <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | (rw [fieldStrengthDeriv_self] - simp only [zero_mul, mul_zero, map_zero, smul_zero] - exact Submodule.zero_mem _) - | (refine Submodule.smul_mem _ _ ?_ - first - | exact opPi_FF_c0101_mem - | exact opPi_FF_c0110_mem - | exact opPi_FF_c1001_mem - | exact opPi_FF_c1010_mem - | exact opPi_FF_c0123_mem - | exact opPi_FF_c0132_mem - | exact opPi_FF_c1023_mem - | exact opPi_FF_c1032_mem - | exact opPi_FF_c2301_mem - | exact opPi_FF_c2310_mem - | exact opPi_FF_c3201_mem - | exact opPi_FF_c3210_mem - | exact opPi_FF_c2323_mem - | exact opPi_FF_c2332_mem - | exact opPi_FF_c3223_mem - | exact opPi_FF_c3232_mem - | exact opPi_FF_c0202_mem - | exact opPi_FF_c0220_mem - | exact opPi_FF_c2002_mem - | exact opPi_FF_c2020_mem - | exact opPi_FF_c0213_mem - | exact opPi_FF_c0231_mem - | exact opPi_FF_c2013_mem - | exact opPi_FF_c2031_mem - | exact opPi_FF_c1302_mem - | exact opPi_FF_c1320_mem - | exact opPi_FF_c3102_mem - | exact opPi_FF_c3120_mem - | exact opPi_FF_c1313_mem - | exact opPi_FF_c1331_mem - | exact opPi_FF_c3113_mem - | exact opPi_FF_c3131_mem - | exact opPi_FF_c0303_mem - | exact opPi_FF_c0330_mem - | exact opPi_FF_c3003_mem - | exact opPi_FF_c3030_mem - | exact opPi_FF_c0312_mem - | exact opPi_FF_c0321_mem - | exact opPi_FF_c3012_mem - | exact opPi_FF_c3021_mem - | exact opPi_FF_c1203_mem - | exact opPi_FF_c1230_mem - | exact opPi_FF_c2103_mem - | exact opPi_FF_c2130_mem - | exact opPi_FF_c1212_mem - | exact opPi_FF_c1221_mem - | exact opPi_FF_c2112_mem - | exact opPi_FF_c2121_mem) - | (norm_num [paritySignZ, paritySignY, paritySignX] - first - | done - | exact Submodule.zero_mem _) - -set_option maxHeartbeats 16000000 in -set_option maxRecDepth 8192 in -/-- The projected Klein average of any second-derivative field strength lies - in the span of the invariants. -/ -lemma opPi_kleinAvg_DDF_mem (r t a b : Fin 1 ⊕ Fin 3) : - opPi (kleinAvg (fieldStrengthDeriv {r, t} a b)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_fieldStrengthDeriv_pair, map_smul] - rcases r with r | r <;> rcases t with t | t <;> rcases a with a | a <;> - rcases b with b | b <;> fin_cases r <;> fin_cases t <;> fin_cases a <;> - fin_cases b <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | (rw [fieldStrengthDeriv_self] - simp only [map_zero, smul_zero] - exact Submodule.zero_mem _) - | (refine Submodule.smul_mem _ _ ?_ - first - | exact opPi_DDF_c0101_mem - | exact opPi_DDF_c0110_mem - | exact opPi_DDF_c1001_mem - | exact opPi_DDF_c1010_mem - | exact opPi_DDF_c0123_mem - | exact opPi_DDF_c0132_mem - | exact opPi_DDF_c1023_mem - | exact opPi_DDF_c1032_mem - | exact opPi_DDF_c0202_mem - | exact opPi_DDF_c0220_mem - | exact opPi_DDF_c2002_mem - | exact opPi_DDF_c2020_mem - | exact opPi_DDF_c0213_mem - | exact opPi_DDF_c0231_mem - | exact opPi_DDF_c2013_mem - | exact opPi_DDF_c2031_mem - | exact opPi_DDF_c0303_mem - | exact opPi_DDF_c0330_mem - | exact opPi_DDF_c3003_mem - | exact opPi_DDF_c3030_mem - | exact opPi_DDF_c0312_mem - | exact opPi_DDF_c0321_mem - | exact opPi_DDF_c3012_mem - | exact opPi_DDF_c3021_mem - | exact opPi_DDF_c1203_mem - | exact opPi_DDF_c1230_mem - | exact opPi_DDF_c2103_mem - | exact opPi_DDF_c2130_mem - | exact opPi_DDF_c1212_mem - | exact opPi_DDF_c1221_mem - | exact opPi_DDF_c2112_mem - | exact opPi_DDF_c2121_mem - | exact opPi_DDF_c1302_mem - | exact opPi_DDF_c1320_mem - | exact opPi_DDF_c3102_mem - | exact opPi_DDF_c3120_mem - | exact opPi_DDF_c1313_mem - | exact opPi_DDF_c1331_mem - | exact opPi_DDF_c3113_mem - | exact opPi_DDF_c3131_mem - | exact opPi_DDF_c2301_mem - | exact opPi_DDF_c2310_mem - | exact opPi_DDF_c3201_mem - | exact opPi_DDF_c3210_mem - | exact opPi_DDF_c2323_mem - | exact opPi_DDF_c2332_mem - | exact opPi_DDF_c3223_mem - | exact opPi_DDF_c3232_mem) - | (norm_num [paritySignZ, paritySignY, paritySignX] - first - | done - | exact Submodule.zero_mem _) +The inclusion `≥` is `span_massDimFourInvariants_le`. For `≤`, an invariant +`x` of weight `≤ 8` decomposes into `massWeightScale`-eigenvectors, each +lying in a `covMonomialSpan`; the parity and hypercharge selection rules leave +only the neutral even-weight components, the weight-four and weight-six +sectors are killed by the Klein average and `sixKill`, and the weight-eight +sector is pinned down by the projector `opPi`. +-/ -set_option maxRecDepth 8192 in -/-- The projected Klein average of any `ψ̄ (Dψ)` pair lies in the span. -/ -lemma opPi_kleinAvg_FM1_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dbarψ [] α * Dψ [μ] β)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | exact opPi_kA_u000_mem - | exact opPi_kA_u001_mem - | exact opPi_kA_u010_mem - | exact opPi_kA_u011_mem - | exact opPi_kA_u100_mem - | exact opPi_kA_u101_mem - | exact opPi_kA_u110_mem - | exact opPi_kA_u111_mem - | exact opPi_kA_u200_mem - | exact opPi_kA_u201_mem - | exact opPi_kA_u210_mem - | exact opPi_kA_u211_mem - | exact opPi_kA_u300_mem - | exact opPi_kA_u301_mem - | exact opPi_kA_u310_mem - | exact opPi_kA_u311_mem +@[expose] public section -set_option maxRecDepth 8192 in -/-- The projected Klein average of any `(D̄ψ̄) ψ` pair lies in the span. -/ -lemma opPi_kleinAvg_FM2_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dbarψ [μ] α * Dψ [] β)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | exact opPi_kA_ubar000_mem - | exact opPi_kA_ubar001_mem - | exact opPi_kA_ubar010_mem - | exact opPi_kA_ubar011_mem - | exact opPi_kA_ubar100_mem - | exact opPi_kA_ubar101_mem - | exact opPi_kA_ubar110_mem - | exact opPi_kA_ubar111_mem - | exact opPi_kA_ubar200_mem - | exact opPi_kA_ubar201_mem - | exact opPi_kA_ubar210_mem - | exact opPi_kA_ubar211_mem - | exact opPi_kA_ubar300_mem - | exact opPi_kA_ubar301_mem - | exact opPi_kA_ubar310_mem - | exact opPi_kA_ubar311_mem +set_option maxHeartbeats 1000000 -/-- The reversed pair `(Dψ) ψ̄`, via anticommutation. -/ -lemma opPi_kleinAvg_FM1r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dψ [μ] β * Dbarψ [] α)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] - exact neg_mem (opPi_kleinAvg_FM1_mem μ α β) +namespace QED +open TensorProduct StandardModel -/-- The reversed pair `ψ (D̄ψ̄)`, via anticommutation. -/ -lemma opPi_kleinAvg_FM2r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dψ [] α * Dbarψ [μ] β)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] - exact neg_mem (opPi_kleinAvg_FM2_mem μ β α) +namespace JetAlgebra -end SectorEight +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups set_option maxHeartbeats 4000000 in /-- The weight-eight classification: a Lorentz-invariant neutral element of @@ -11792,7 +165,6 @@ lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : exact Submodule.zero_mem _ · exact mem_span_of_mem_chargeCovSpan_eight (mem_chargeCovSpan_zero_of_invariant (hzmem 8) hzconst) hzlor - end JetAlgebra end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean new file mode 100644 index 000000000..2159f75ca --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean @@ -0,0 +1,790 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.MassDim +/-! +# The renormalizable invariants of the QED jet algebra + +The four gauge- and Lorentz-invariant elements of mass dimension at most four +(mass weight at most eight): the Maxwell term `F_{μν} F^{μν}`, the topological +theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, and the two fermion kinetic terms +`i ψ̄ σ̄^μ (D_μ ψ)` and `-i (D̄_μ ψ̄) σ̄^μ ψ`. + +This file defines them, proves each is invariant under the jet gauge group and +under `SL(2,ℂ)`, and deduces the easy half of the classification: their span is +contained in `InvariantMassWeightSubmodule 8`. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The Maxwell kinetic term `F_{μν} F^{μν}`: the field-strength square with + both indices raised by the (diagonal) Minkowski metric. Mass weight eight. -/ +noncomputable def maxwellTerm : JetAlgebra := + ∑ μ, ∑ ν, ((η μ μ * η ν ν : ℝ) : ℂ) • + (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) + +/-- The topological theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, written as a sum over + the permutations of the four spacetime indices weighted by their signs. Mass + weight eight. -/ +noncomputable def thetaTerm : JetAlgebra := + ∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • + (fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) * + fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3))) + +/-- The spinor contraction matrices of the right-handed kinetic term: the + transposed covariant Pauli matrices `(σ̄^μ)ᵀ = (1, -σ1, σ2, -σ3)`. In the + conventions of this repository the right-handed lepton field transforms by + the entrywise conjugate of `Λ` and its jet coordinates by the contragredient + dual, so the pairing of `ψ̄_α`, `(D_μ ψ)_β` and the derivative index `μ` is + Lorentz invariant precisely through these matrices; this is the intertwining + identity `sum_kineticPauli_contraction` below. -/ +noncomputable def kineticPauli (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := + ((PauliMatrix.pauliSelfAdjoint' μ).1)ᵀ + +/-- The fermion kinetic term `i ψ̄_α (σ̄^μ)ᵀ_{α β} (D_μ ψ)_β` of the + right-handed charged-lepton singlet, with the covariant derivative on the + lepton. Mass weight eight. -/ +noncomputable def fermionKineticTerm : JetAlgebra := + Complex.I • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [] α * Dψ [μ] β) + +/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ̄^μ)ᵀ_{α β} ψ_β`, with + the covariant derivative on the conjugate lepton. Mass weight eight. -/ +noncomputable def fermionKineticTermBar : JetAlgebra := + (-Complex.I) • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [μ] α * Dψ [] β) + +/-- The invariants of the QED jet algebra of mass dimension at most four: the + constants and the four kinetic terms. These span + `InvariantMassWeightSubmodule 8`, the renormalizable QED Lagrangian densities. -/ +def massDimFourInvariants : Set JetAlgebra := + {1, maxwellTerm, thetaTerm, fermionKineticTerm, fermionKineticTermBar} + + +/-! + +## Gauge invariance of the renormalizable terms + +The hypercharge selection rule: a jet of gauge transformations acts on the +covariant generators only through `u(0)^{±6}`, so the field-strength squares are +exactly invariant and a product of one covariant lepton and one covariant +conjugate-lepton factor is invariant by unitarity. + +-/ + +lemma repJetGaugeGroupI_maxwellTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U maxwellTerm = maxwellTerm := by + rw [maxwellTerm, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul] + congr 1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv] + +lemma repJetGaugeGroupI_thetaTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U thetaTerm = thetaTerm := by + rw [thetaTerm, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_zsmul] + congr 1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, + repJetGaugeGroupI_fieldStrengthDeriv] + +/-- The hypercharge scalars of a lepton–conjugate-lepton pair cancel by + unitarity. -/ +lemma repJetGaugeGroupI_Dbarψ_mul_Dψ (U : JetGaugeGroupI) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + repJetGaugeGroupI U (Dbarψ l α * Dψ l' β) = Dbarψ l α * Dψ l' β := by + have hz : star ((U.eval.2.2 : unitary ℂ) : ℂ) * ((U.eval.2.2 : unitary ℂ) : ℂ) = 1 := + (Unitary.mem_iff.mp (U.eval.2.2).2).1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dbarψ, + Submonoid.smul_def, Submonoid.smul_def, SubmonoidClass.coe_pow, + SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← mul_pow, hz, + one_pow, one_smul] + +lemma repJetGaugeGroupI_fermionKineticTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] + +lemma repJetGaugeGroupI_fermionKineticTermBar (U : JetGaugeGroupI) : + repJetGaugeGroupI U fermionKineticTermBar = fermionKineticTermBar := by + rw [fermionKineticTermBar, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] + +/-! + +## Lorentz invariance of the renormalizable terms + +TODO: these require the transformation laws of the field strength (as an +antisymmetric two-tensor through `Λᵀ η Λ = η` and `det Λ = 1`) and of the +covariant derivatives (through the σ-matrix intertwining relation +`M σ^μ M† = Λ(M)^μ_ν σ^ν` defining `SL2C.toLorentzGroup`), which are not yet +available for the jet-algebra representations. + +-/ + +/-- The component form of the Lorentz-group defining identity: contracting two + Lorentz matrices with the (diagonal, involutive) Minkowski metric over their + second indices reproduces the metric. -/ +lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : + ∑ ν, η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν = η a a' := by + have hsq : η a' a' * η a' a' = 1 := by + rcases a' with i | i + · rw [show i = (0 : Fin 1) from Subsingleton.elim i 0, + minkowskiMatrix.inl_0_inl_0] + norm_num + · rw [minkowskiMatrix.inr_i_inr_i] + norm_num + have h := congrFun (congrFun ((LorentzGroup.mem_iff_self_mul_dual).mp + (Lorentz.SL2C.toLorentzGroup Λ).2) a) a' + rw [Matrix.mul_apply] at h + simp only [minkowskiMatrix.dual_apply] at h + have h2 := congrArg (fun t => t * η a' a') h + simp only [Finset.sum_mul] at h2 + rw [show (∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν * η a' a') * η a' a') = + ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν) * (η a' a' * η a' a') from + Finset.sum_congr rfl fun ν _ => by ring, hsq] at h2 + simp only [mul_one] at h2 + rw [h2, Matrix.one_apply] + by_cases haa : a = a' + · subst haa + simp + · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] + simp + +set_option maxHeartbeats 2000000 in +/-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ +lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ maxwellTerm = maxwellTerm := by + have hscal : ∀ a b a' b' : Fin 1 ⊕ Fin 3, + (∑ μ, ∑ ν, η μ μ * η ν ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = η a a' * η b b' := by + intro a b a' b' + rw [show (∑ μ, ∑ ν, η μ μ * η ν ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = + ∑ μ, (η μ μ * (Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' μ) * + ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν) from + Finset.sum_congr rfl fun μ _ => by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun ν _ => by ring, + ← Finset.sum_mul, toLorentzGroup_sum_η_mul_mul, toLorentzGroup_sum_η_mul_mul] + have hFt : ∀ μ ν : Fin 1 ⊕ Fin 3, repLorentzGroup Λ + (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) = + ∑ a, ∑ b, ∑ a', ∑ b', + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + intro μ ν + rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil] + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + simp only [hsm, hms, hsmul] + rw [maxwellTerm, map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, ν]; rw [map_smul, hFt μ ν] + simp only [Finset.smul_sum, smul_smul, ← Complex.ofReal_mul] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b, 2, a']; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a', 2, b', 2, μ]; rw [← Finset.sum_smul] + conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [← Finset.sum_smul] + simp only [← Complex.ofReal_sum, hscal] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rw [Finset.sum_eq_single a (fun a'' _ ha'' => Finset.sum_eq_zero fun b'' _ => by + rw [show η a a'' = 0 from by + rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm ha'')], + zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ a) h), + Finset.sum_eq_single b (fun b'' _ hb'' => by + rw [show η b b'' = 0 from by + rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm hb'')], + mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ b) h)] + +/-- The transformation law of a product of two field strengths. -/ +lemma repLorentzGroup_fieldStrengthDeriv_mul (Λ : SL(2,ℂ)) + (μ ν ρ τ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} ρ τ) = + ∑ a, ∑ b, ∑ a', ∑ b', + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' ρ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' τ : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, + repLorentzGroup_fieldStrengthDeriv_nil] + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + simp only [hsm, hms, hsmul] + +/-- The alternating four-fold contraction of Lorentz matrices is a determinant: + the combinatorial identity behind the invariance of the theta term. -/ +lemma sum_perm_sign_mul_prod_eq_det (Λ : SL(2,ℂ)) (v : Fin 4 → Fin 1 ⊕ Fin 3) : + (∑ p : Equiv.Perm (Fin 4), ((Equiv.Perm.sign p : ℤ) : ℝ) * + ∏ i, (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p i))) = + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by + rw [← Matrix.det_transpose, Matrix.det_apply] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [Units.smul_def, zsmul_eq_mul] + rfl + +/-- The alternating contraction matrix of a non-injective index tuple has two + equal rows, so its determinant vanishes. -/ +lemma det_toLorentzGroup_of_not_injective (Λ : SL(2,ℂ)) {v : Fin 4 → Fin 1 ⊕ Fin 3} + (hv : ¬ Function.Injective v) : + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = 0 := by + rw [Function.not_injective_iff] at hv + obtain ⟨i, j, hij, hne⟩ := hv + exact Matrix.det_zero_of_row_eq hne (funext fun k => by simp [hij]) + +/-- On an index tuple obtained by permuting the four spacetime indices, the + alternating contraction matrix has determinant the sign of the permutation, + by `det Λ = 1`. -/ +lemma det_toLorentzGroup_comp_perm (Λ : SL(2,ℂ)) (q : Equiv.Perm (Fin 4)) : + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + ((Equiv.Perm.sign q : ℤ) : ℝ) := by + have h1 : (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + ((Lorentz.SL2C.toLorentzGroup Λ).1.submatrix + (finSumFinEquiv (m := 1) (n := 3)).symm + (finSumFinEquiv (m := 1) (n := 3)).symm).submatrix q id := rfl + rw [h1, Matrix.det_permute, + Matrix.det_submatrix_equiv_self (finSumFinEquiv (m := 1) (n := 3)).symm, + Lorentz.SL2C.toLorentzGroup_det_one, mul_one] + +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the theta term: the alternating contraction is the + determinant of the Lorentz matrix, which is one. -/ +lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ thetaTerm = thetaTerm := by + classical + rw [thetaTerm, map_sum] + conv_lhs => enter [2, p]; rw [map_zsmul, repLorentzGroup_fieldStrengthDeriv_mul] + simp only [Finset.smul_sum] + rw [Finset.sum_comm] + conv_lhs => enter [2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] + have hdet : ∀ a b a' b' : Fin 1 ⊕ Fin 3, + (∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) * + (Lorentz.SL2C.toLorentzGroup Λ).1 b + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3)) : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b')) = + ((Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (![a, b, a', b'] i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) : ℝ) : ℂ) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + intro a b a' b' + rw [← sum_perm_sign_mul_prod_eq_det Λ ![a, b, a', b'], Complex.ofReal_sum, + Finset.sum_smul] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [Fin.prod_univ_four] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + rw [← Int.cast_smul_eq_zsmul ℂ, smul_smul] + congr 1 + push_cast + ring + conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [hdet a b a' b'] + have hflat : ∀ (G : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + (Fin 1 ⊕ Fin 3) → JetAlgebra), + (∑ a, ∑ b, ∑ a', ∑ b', G a b a' b') = + ∑ t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + G t.1 t.2.1 t.2.2.1 t.2.2.2 := fun G => by + symm + simp only [Fintype.sum_prod_type] + rw [hflat] + rw [← Finset.sum_filter_of_ne + (p := fun t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × + (Fin 1 ⊕ Fin 3) => Function.Injective ![t.1, t.2.1, t.2.2.1, t.2.2.2]) + (fun t _ hne => by + by_contra hni + exact hne (by + rw [det_toLorentzGroup_of_not_injective Λ hni, Complex.ofReal_zero, + zero_smul]))] + have hcard : Fintype.card (Fin 4) = Fintype.card (Fin 1 ⊕ Fin 3) := by simp + refine Finset.sum_bij + (i := fun t ht => (Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) + ?_ ?_ ?_ ?_ + · intro t ht + exact Finset.mem_univ _ + · intro t₁ ht₁ t₂ ht₂ h + have hv : ∀ i : Fin 4, ![t₁.1, t₁.2.1, t₁.2.2.1, t₁.2.2.2] i = + ![t₂.1, t₂.2.1, t₂.2.2.1, t₂.2.2.2] i := by + intro i + have := congrArg (fun q : Equiv.Perm (Fin 4) => + (finSumFinEquiv (m := 1) (n := 3)).symm (q i)) h + simpa using this + have h0 := hv 0 + have h1 := hv 1 + have h2 := hv 2 + have h3 := hv 3 + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 + exact Prod.ext h0 (Prod.ext h1 (Prod.ext h2 h3)) + · intro q _ + refine ⟨((finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)), ?_, ?_⟩ + · refine Finset.mem_filter.mpr ⟨Finset.mem_univ _, ?_⟩ + have hveq : ![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] = + fun i => (finSumFinEquiv (m := 1) (n := 3)).symm (q i) := by + funext i + fin_cases i <;> rfl + rw [hveq] + exact ((finSumFinEquiv (m := 1) (n := 3)).symm.injective).comp q.injective + · refine Equiv.ext fun i => ?_ + show (finSumFinEquiv (m := 1) (n := 3)) + (![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] i) = q i + fin_cases i <;> simp + · intro t ht + have hq : ∀ i : Fin 4, (finSumFinEquiv (m := 1) (n := 3)).symm + (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) i) = + ![t.1, t.2.1, t.2.2.1, t.2.2.2] i := by + intro i + simp [Equiv.ofBijective] + have hmat : (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (![t.1, t.2.1, t.2.2.1, t.2.2.2] i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm + (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by + refine congrArg Matrix.of (funext fun i => funext fun j => ?_) + rw [hq i] + rw [hmat, det_toLorentzGroup_comp_perm] + have h0 := hq 0 + have h1 := hq 1 + have h2 := hq 2 + have h3 := hq 3 + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 + rw [h0, h1, h2, h3, ← Int.cast_smul_eq_zsmul ℂ] + module + +/-! + +### The kinetic contraction identity and Lorentz invariance + +-/ + +/-- The Lorentz intertwining identity of the kinetic contraction matrices: + transporting the two spinor slots contragrediently and the derivative slot by + the Lorentz matrix reproduces the contraction matrices. This is the identity + `L(Λ) L(Λ⁻¹) = 1` transported through `L(M†) = L(M)ᵀ`. -/ +lemma sum_kineticPauli_contraction (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) + (α' β' : Fin 2) : + ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' := by + classical + have hdet : Matrix.det ((Λ⁻¹).1ᴴ) = 1 := by + rw [Matrix.det_conjTranspose, Matrix.SpecialLinearGroup.det_coe] + exact star_one ℂ + have hval : ∀ μ, (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + intro μ + have h := congrArg Subtype.val + (Lorentz.SL2C.toSelfAdjointMap_basis + (M := (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))) μ) + simp only [Lorentz.SL2C.toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', + Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, + selfAdjoint.val_smul] at h + calc (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 + = ∑ j, (Lorentz.SL2C.toLorentzGroup + (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 j μ • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + rw [← h] + congr 1 + rw [show ((⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ)) : + Matrix (Fin 2) (Fin 2) ℂ)ᴴ = (Λ⁻¹).1 from + Matrix.conjTranspose_conjTranspose _] + _ = ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + refine Finset.sum_congr rfl fun j _ => ?_ + congr 1 + rw [show (Lorentz.SL2C.toLorentzGroup + (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 = + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1ᵀ from + Lorentz.SL2C.toLorentzGroup_conjTranspose rfl, + Matrix.transpose_apply] + have hsand : ∀ μ, (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β'))) = + ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + intro μ + have hentry := congrArg (fun A : Matrix (Fin 2) (Fin 2) ℂ => A β' α') (hval μ) + simp only [Matrix.sum_apply, Matrix.smul_apply] at hentry + calc (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * star ((Λ⁻¹).1 β β'))) + = ((Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1) β' α' := by + rw [Matrix.mul_apply] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Matrix.mul_apply, Finset.sum_mul] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [Matrix.conjTranspose_apply, kineticPauli, Matrix.transpose_apply] + ring + _ = ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + rw [hentry] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [kineticPauli, Matrix.transpose_apply, Complex.real_smul] + calc ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β'))) + = ∑ μ, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β')) := by + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + ring + _ = ∑ μ, ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + ((((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β') := by + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [hsand, Finset.mul_sum] + _ = ∑ j, ((∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [Complex.ofReal_sum, Finset.sum_mul] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Complex.ofReal_mul] + ring + _ = kineticPauli ν α' β' := by + have hmul : ∀ j, (∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j) = + ((1 : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ)) ν j := by + intro j + rw [← Matrix.mul_apply, + show ((Lorentz.SL2C.toLorentzGroup Λ).1 * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 : + Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) = + ((Lorentz.SL2C.toLorentzGroup Λ * + Lorentz.SL2C.toLorentzGroup Λ⁻¹ : LorentzGroup 3) : + Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) from rfl, + ← map_mul, mul_inv_cancel, map_one] + rfl + simp only [hmul, Matrix.one_apply] + rw [Finset.sum_eq_single ν (fun j _ hj => by + rw [if_neg (Ne.symm hj), Complex.ofReal_zero, zero_mul]) + (fun h => absurd (Finset.mem_univ ν) h), if_pos rfl, + Complex.ofReal_one, one_mul] + +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the fermion kinetic term: the transformation of the + two spinor slots and the derivative slot cancels through the intertwining + identity of the contraction matrices. -/ +lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by + have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, + repLorentzGroup_Dψ_singleton] + simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] + -- move the primed sums out and the unprimed sums in + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] + conv_rhs => rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => + Finset.sum_congr rfl fun β' _ => ?_ + conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] + conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] + rw [← Finset.sum_smul] + rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * + ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β')))) = kineticPauli ν α' β' from + sum_kineticPauli_contraction Λ ν α' β'] + +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the conjugate fermion kinetic term. -/ +lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTermBar = fermionKineticTermBar := by + have hsmS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [fermionKineticTermBar, map_smul] + congr 1 + rw [map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, + repLorentzGroup_Dψ_nil] + simp only [hsmS, hsmF, hmsF, hsmul, Finset.smul_sum, smul_smul] + -- move the transformed sums out and the original sums in + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, ν, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, ν, 2, α']; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, ν, 2, α']; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun α' _ => + Finset.sum_congr rfl fun β' _ => ?_ + conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] + conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] + rw [← Finset.sum_smul] + rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' from by + rw [← sum_kineticPauli_contraction Λ ν α' β'] + refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun α _ => + Finset.sum_congr rfl fun β _ => ?_ + ring] + +/-! + +## The span inclusion + +Every element of `massDimFourInvariants` is invariant and has mass weight at +most eight, so the span is contained in `InvariantMassWeightSubmodule 8`. + +-/ + +/-- Eigenvectors of weight `m ≤ n` lie in the weight-`≤ n` submodule. -/ +lemma mem_massWeightLESubmodule_of_forall_massWeightScale {x : JetAlgebra} + {m n : ℕ} (hmn : m ≤ n) + (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) : + x ∈ MassWeightLESubmodule n := + Submodule.subset_span ⟨m, hmn, hx⟩ + +lemma maxwellTerm_mem_massWeightLESubmodule : + maxwellTerm ∈ MassWeightLESubmodule 8 := by + rw [maxwellTerm] + refine Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun ν _ => + Submodule.smul_mem _ _ ?_ + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl + (massWeightScale_mul_eigen (m := 4) (n := 4) + (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν) + (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν)) + +lemma thetaTerm_mem_massWeightLESubmodule : + thetaTerm ∈ MassWeightLESubmodule 8 := by + rw [thetaTerm] + refine Submodule.sum_mem _ fun p _ => zsmul_mem ?_ _ + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl + (massWeightScale_mul_eigen (m := 4) (n := 4) + (fun c => massWeightScale_fieldStrengthDeriv c {} _ _) + (fun c => massWeightScale_fieldStrengthDeriv c {} _ _)) + +lemma fermionKineticTerm_mem_massWeightLESubmodule : + fermionKineticTerm ∈ MassWeightLESubmodule 8 := by + rw [fermionKineticTerm] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => + Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => + Submodule.smul_mem _ _ ?_) + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 3 + 5) le_rfl + (massWeightScale_mul_eigen (m := 3) (n := 5) + (fun c => massWeightScale_Dbarψ c [] α) + (fun c => massWeightScale_Dψ c [μ] β)) + +lemma fermionKineticTermBar_mem_massWeightLESubmodule : + fermionKineticTermBar ∈ MassWeightLESubmodule 8 := by + rw [fermionKineticTermBar] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => + Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => + Submodule.smul_mem _ _ ?_) + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 5 + 3) le_rfl + (massWeightScale_mul_eigen (m := 5) (n := 3) + (fun c => massWeightScale_Dbarψ c [μ] α) + (fun c => massWeightScale_Dψ c [] β)) + +/-- The Lorentz action fixes the unit of the jet algebra. -/ +lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ (1 : JetAlgebra) = 1 := by + have h1 : BBoson.JetAlgebra.complexRepLorentzGroup Λ + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by + rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, + show BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) + from by rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ = + LinearMap.baseChange ℂ (BBoson.JetAlgebra.repLorentzGroup Λ) from rfl, + LinearMap.baseChange_tmul], + show BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) = 1 from + map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + BBoson.JetComponentSpace.repLorentzGroup Λ))] + rw [show (1 : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, + show repLorentzGroup Λ ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + BBoson.JetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra) + from rfl, + h1, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + +/-- Every element of `massDimFourInvariants` is gauge and Lorentz invariant. -/ +lemma isInvariant_of_mem_massDimFourInvariants {x : JetAlgebra} + (hx : x ∈ massDimFourInvariants) : IsInvariant x := by + rcases hx with rfl | rfl | rfl | rfl | rfl + · exact ⟨fun U => (repJetGaugeGroupI_eq_repAlgHom U 1).trans (repAlgHom U).map_one, + repLorentzGroup_one⟩ + · exact ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ + · exact ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ + · exact ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ + · exact ⟨repJetGaugeGroupI_fermionKineticTermBar, + repLorentzGroup_fermionKineticTermBar⟩ + +lemma span_massDimFourInvariants_le : + Submodule.span ℂ massDimFourInvariants ≤ InvariantMassWeightSubmodule 8 := by + rw [Submodule.span_le] + intro x hx + refine Submodule.mem_inf.mpr ⟨?_, Submodule.subset_span + (isInvariant_of_mem_massDimFourInvariants hx)⟩ + rcases hx with rfl | rfl | rfl | rfl | rfl + · exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 0) (Nat.zero_le 8) + fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one + · exact maxwellTerm_mem_massWeightLESubmodule + · exact thetaTerm_mem_massWeightLESubmodule + · exact fermionKineticTerm_mem_massWeightLESubmodule + · exact fermionKineticTermBar_mem_massWeightLESubmodule +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostFermionPairs.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostFermionPairs.lean new file mode 100644 index 000000000..2dc7cbbd4 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostFermionPairs.lean @@ -0,0 +1,871 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.BoostPairs +/-! +# Boost transformations of the fermion pairs + +The paired boost actions on the weight-eight fermion bilinears +`ψ̄_α (D_μ ψ)_β` and `(D̄_μ ψ̄)_α ψ_β`. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u0`. -/ +lemma pairZ_u0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u1`. -/ +lemma pairZ_u1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u2`. -/ +lemma pairZ_u2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `u3`. -/ +lemma pairZ_u3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u0`. -/ +lemma pairX_u0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u1`. -/ +lemma pairX_u1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u2`. -/ +lemma pairX_u2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `u3`. -/ +lemma pairX_u3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u0`. -/ +lemma pairY_u0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u1`. -/ +lemma pairY_u1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u2`. -/ +lemma pairY_u2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • + (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `u3`. -/ +lemma pairY_u3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar0`. -/ +lemma pairZ_ubar0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar1`. -/ +lemma pairZ_ubar1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar2`. -/ +lemma pairZ_ubar2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Z`-boost on the σ-contracted fermion + pair `ubar3`. -/ +lemma pairZ_ubar3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + repLorentzGroup ((boostZel t ht)⁻¹) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostZel, boostZel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar0`. -/ +lemma pairX_ubar0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar1`. -/ +lemma pairX_ubar1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar2`. -/ +lemma pairX_ubar2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `X`-boost on the σ-contracted fermion + pair `ubar3`. -/ +lemma pairX_ubar3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + repLorentzGroup ((boostXel t ht)⁻¹) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostXel, boostXel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar0`. -/ +lemma pairY_ubar0 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar1`. -/ +lemma pairY_ubar1 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar2`. -/ +lemma pairY_ubar2 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • + (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 1 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action of the `Y`-boost on the σ-contracted fermion + pair `ubar3`. -/ +lemma pairY_ubar3 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + repLorentzGroup ((boostYel t ht)⁻¹) + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + ((2 : ℝ) : ℂ) • + (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [map_add, map_sub, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 1 1, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, + toLorentzGroup_boostYel, boostYel_inv_coe, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostPairs.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostPairs.lean new file mode 100644 index 000000000..ca04edc3e --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostPairs.lean @@ -0,0 +1,1247 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.BoostSecondDerivatives +/-! +# Boost transformations of the field-strength pairs + +The paired boost actions on the weight-eight products `F_{ab} F_{cd}` +(`pairZ_*`, `pairX_*`, `pairY_*`) and on the second-derivative field strengths +`∂_r ∂_s F_{ab}` (`pairZ_dd*`, `pairX_dd*`, `pairY_dd*`). +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F01 * F01`. -/ +lemma pairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F01 t ht, + genZ_F01 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F01 * F23`. -/ +lemma pairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F01 t ht, + genZ_F01 t⁻¹ (inv_ne_zero ht), + genZ_F23 t ht, + genZ_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F02 * F02`. -/ +lemma pairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F02 t ht, + genZ_F02 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F02 * F13`. -/ +lemma pairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F02 t ht, + genZ_F02 t⁻¹ (inv_ne_zero ht), + genZ_F13 t ht, + genZ_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F03 * F03`. -/ +lemma pairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F03 t ht, + genZ_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F03 * F12`. -/ +lemma pairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F03 t ht, + genZ_F03 t⁻¹ (inv_ne_zero ht), + genZ_F12 t ht, + genZ_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F12 * F12`. -/ +lemma pairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F12 t ht, + genZ_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F13 * F13`. -/ +lemma pairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F13 t ht, + genZ_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on + `F23 * F23`. -/ +lemma pairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genZ_F23 t ht, + genZ_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F01 * F01`. -/ +lemma pairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F01 t ht, + genX_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F01 * F23`. -/ +lemma pairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F01 t ht, + genX_F01 t⁻¹ (inv_ne_zero ht), + genX_F23 t ht, + genX_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F02 * F02`. -/ +lemma pairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F02 t ht, + genX_F02 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F02 * F13`. -/ +lemma pairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F02 t ht, + genX_F02 t⁻¹ (inv_ne_zero ht), + genX_F13 t ht, + genX_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F03 * F03`. -/ +lemma pairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F03 t ht, + genX_F03 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F03 * F12`. -/ +lemma pairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F03 t ht, + genX_F03 t⁻¹ (inv_ne_zero ht), + genX_F12 t ht, + genX_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F12 * F12`. -/ +lemma pairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F12 t ht, + genX_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F13 * F13`. -/ +lemma pairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F13 t ht, + genX_F13 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on + `F23 * F23`. -/ +lemma pairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genX_F23 t ht, + genX_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F01 * F01`. -/ +lemma pairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F01 t ht, + genY_F01 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F01 * F23`. -/ +lemma pairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F01 t ht, + genY_F01 t⁻¹ (inv_ne_zero ht), + genY_F23 t ht, + genY_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F02 * F02`. -/ +lemma pairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F02 t ht, + genY_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F02 * F13`. -/ +lemma pairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F02 t ht, + genY_F02 t⁻¹ (inv_ne_zero ht), + genY_F13 t ht, + genY_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F03 * F03`. -/ +lemma pairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F03 t ht, + genY_F03 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F03 * F12`. -/ +lemma pairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F03 t ht, + genY_F03 t⁻¹ (inv_ne_zero ht), + genY_F12 t ht, + genY_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F12 * F12`. -/ +lemma pairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F12 t ht, + genY_F12 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F13 * F13`. -/ +lemma pairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F13 t ht, + genY_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 4000000 in +/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on + `F23 * F23`. -/ +lemma pairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] + simp only [genY_F23 t ht, + genY_F23 t⁻¹ (inv_ne_zero ht)] + simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F01` with + derivative indices `(0, 1)`. -/ +lemma pairZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd01_F01 t ht, genZ_dd01_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F23` with + derivative indices `(0, 1)`. -/ +lemma pairZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd01_F23 t ht, genZ_dd01_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F02` with + derivative indices `(0, 2)`. -/ +lemma pairZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd02_F02 t ht, genZ_dd02_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F13` with + derivative indices `(0, 2)`. -/ +lemma pairZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd02_F13 t ht, genZ_dd02_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F03` with + derivative indices `(0, 3)`. -/ +lemma pairZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd03_F03 t ht, genZ_dd03_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F12` with + derivative indices `(0, 3)`. -/ +lemma pairZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd03_F12 t ht, genZ_dd03_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F03` with + derivative indices `(1, 2)`. -/ +lemma pairZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd12_F03 t ht, genZ_dd12_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F12` with + derivative indices `(1, 2)`. -/ +lemma pairZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd12_F12 t ht, genZ_dd12_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F02` with + derivative indices `(1, 3)`. -/ +lemma pairZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd13_F02 t ht, genZ_dd13_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F13` with + derivative indices `(1, 3)`. -/ +lemma pairZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd13_F13 t ht, genZ_dd13_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F01` with + derivative indices `(2, 3)`. -/ +lemma pairZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd23_F01 t ht, genZ_dd23_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Z`-boost on `∂∂F23` with + derivative indices `(2, 3)`. -/ +lemma pairZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostZel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostZel_inv] + simp only [genZ_dd23_F23 t ht, genZ_dd23_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F01` with + derivative indices `(0, 1)`. -/ +lemma pairX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd01_F01 t ht, genX_dd01_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F23` with + derivative indices `(0, 1)`. -/ +lemma pairX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd01_F23 t ht, genX_dd01_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F02` with + derivative indices `(0, 2)`. -/ +lemma pairX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd02_F02 t ht, genX_dd02_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F13` with + derivative indices `(0, 2)`. -/ +lemma pairX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd02_F13 t ht, genX_dd02_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F03` with + derivative indices `(0, 3)`. -/ +lemma pairX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd03_F03 t ht, genX_dd03_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F12` with + derivative indices `(0, 3)`. -/ +lemma pairX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd03_F12 t ht, genX_dd03_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F03` with + derivative indices `(1, 2)`. -/ +lemma pairX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd12_F03 t ht, genX_dd12_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F12` with + derivative indices `(1, 2)`. -/ +lemma pairX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd12_F12 t ht, genX_dd12_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F02` with + derivative indices `(1, 3)`. -/ +lemma pairX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd13_F02 t ht, genX_dd13_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F13` with + derivative indices `(1, 3)`. -/ +lemma pairX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd13_F13 t ht, genX_dd13_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F01` with + derivative indices `(2, 3)`. -/ +lemma pairX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd23_F01 t ht, genX_dd23_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `X`-boost on `∂∂F23` with + derivative indices `(2, 3)`. -/ +lemma pairX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostXel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostXel_inv] + simp only [genX_dd23_F23 t ht, genX_dd23_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F01` with + derivative indices `(0, 1)`. -/ +lemma pairY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd01_F01 t ht, genY_dd01_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F23` with + derivative indices `(0, 1)`. -/ +lemma pairY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd01_F23 t ht, genY_dd01_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F02` with + derivative indices `(0, 2)`. -/ +lemma pairY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd02_F02 t ht, genY_dd02_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F13` with + derivative indices `(0, 2)`. -/ +lemma pairY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd02_F13 t ht, genY_dd02_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F03` with + derivative indices `(0, 3)`. -/ +lemma pairY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd03_F03 t ht, genY_dd03_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F12` with + derivative indices `(0, 3)`. -/ +lemma pairY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd03_F12 t ht, genY_dd03_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F03` with + derivative indices `(1, 2)`. -/ +lemma pairY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd12_F03 t ht, genY_dd12_F03 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F12` with + derivative indices `(1, 2)`. -/ +lemma pairY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd12_F12 t ht, genY_dd12_F12 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F02` with + derivative indices `(1, 3)`. -/ +lemma pairY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd13_F02 t ht, genY_dd13_F02 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F13` with + derivative indices `(1, 3)`. -/ +lemma pairY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + ((2 : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd13_F13 t ht, genY_dd13_F13 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F01` with + derivative indices `(2, 3)`. -/ +lemma pairY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd23_F01 t ht, genY_dd23_F01 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) + +set_option maxHeartbeats 2000000 in +/-- The paired boost action of the `Y`-boost on `∂∂F23` with + derivative indices `(2, 3)`. -/ +lemma pairY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + repLorentzGroup ((boostYel t ht)⁻¹) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [boostYel_inv] + simp only [genY_dd23_F23 t ht, genY_dd23_F23 t⁻¹ (inv_ne_zero ht)] + match_scalars <;> (push_cast; try field_simp; try ring) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean new file mode 100644 index 000000000..2687829c5 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean @@ -0,0 +1,1002 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.BoostTransforms +/-! +# Boost transformations of the second-derivative field strengths + +The paired boost actions `rep(boost t) + rep(boost t⁻¹)` on the weight-eight +monomials `∂_r ∂_s F_{ab}`, for each of the three coordinate axes. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma genZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma genZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma genZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma genZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma genZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma genZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma genZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma genZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma genZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma genZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma genZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Z`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma genZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma genX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma genX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma genX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma genX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma genX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma genX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma genX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma genX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma genX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma genX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma genX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `X`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma genX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma genY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma genY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma genY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma genY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma genY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma genY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma genY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma genY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma genY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma genY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma genY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + + (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 4000000 in +/-- The `Y`-boost action on the derivative field strength + `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma genY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • + fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_pair] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean new file mode 100644 index 000000000..52cc3d183 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean @@ -0,0 +1,546 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.MonomialForm +/-! +# Boost transformations of the weight-eight generators + +For each axis `T ∈ {Z, X, Y}` the paired boost actions +`rep(boost t) + rep(boost t⁻¹)` act on the weight-eight monomials with +coefficients polynomial in `t^2` and `t⁻²`. This file records those actions on +the single field strengths `F_{ab}` (`genZ_*`, `genX_*`, `genY_*`) and on the +second derivatives `∂_r ∂_s F_{ab}` (`genZ_dd*`, `genX_dd*`, `genY_dd*`). +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +### The symmetrised boost average on the weight-eight sector + +For each axis `T ∈ {Z, X, Y}` the paired boost actions `rep(boost) + rep(boost⁻¹)` +at `t` and `t⁻¹` act on the Klein-symmetric weight-eight basis vectors with +even coefficients in the boost parameter. A rational combination of the +paired boosts at `t = 2, 3, 4` together with the identity (`boostProjZ/X/Y`) +realises the Klein-restricted single-axis averages, and their mean `opS` +fixes every Lorentz-invariant vector while acting on the weight-eight basis +by an explicit rational matrix (the `opS_*` stage lemmas below). + +-/ +/-- Reordering the two derivative indices of a second-derivative field + strength. -/ +lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {r, s} a b = fieldStrengthDeriv {s, r} a b := by + have h : ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) = {s, r} := Multiset.cons_swap r s 0 + rw [h] + +lemma boostMatZ_00 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatZ_01 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 0) = 0 := rfl +lemma boostMatZ_02 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 1) = 0 := rfl +lemma boostMatZ_03 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 2) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatZ_10 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inl 0) = 0 := rfl +lemma boostMatZ_11 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 0) = 1 := rfl +lemma boostMatZ_12 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 1) = 0 := rfl +lemma boostMatZ_13 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 2) = 0 := rfl +lemma boostMatZ_20 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inl 0) = 0 := rfl +lemma boostMatZ_21 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 0) = 0 := rfl +lemma boostMatZ_22 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 1) = 1 := rfl +lemma boostMatZ_23 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 2) = 0 := rfl +lemma boostMatZ_30 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatZ_31 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 0) = 0 := rfl +lemma boostMatZ_32 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 1) = 0 := rfl +lemma boostMatZ_33 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 2) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl + +lemma boostMatX_00 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatX_01 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatX_02 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 1) = 0 := rfl +lemma boostMatX_03 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 2) = 0 := rfl +lemma boostMatX_10 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatX_11 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatX_12 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 1) = 0 := rfl +lemma boostMatX_13 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 2) = 0 := rfl +lemma boostMatX_20 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inl 0) = 0 := rfl +lemma boostMatX_21 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 0) = 0 := rfl +lemma boostMatX_22 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 1) = 1 := rfl +lemma boostMatX_23 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 2) = 0 := rfl +lemma boostMatX_30 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inl 0) = 0 := rfl +lemma boostMatX_31 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 0) = 0 := rfl +lemma boostMatX_32 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 1) = 0 := rfl +lemma boostMatX_33 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 2) = 1 := rfl + +lemma boostMatY_00 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatY_01 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 0) = 0 := rfl +lemma boostMatY_02 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 1) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatY_03 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 2) = 0 := rfl +lemma boostMatY_10 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inl 0) = 0 := rfl +lemma boostMatY_11 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 0) = 1 := rfl +lemma boostMatY_12 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 1) = 0 := rfl +lemma boostMatY_13 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 2) = 0 := rfl +lemma boostMatY_20 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl +lemma boostMatY_21 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 0) = 0 := rfl +lemma boostMatY_22 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 1) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl +lemma boostMatY_23 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 2) = 0 := rfl +lemma boostMatY_30 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inl 0) = 0 := rfl +lemma boostMatY_31 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 0) = 0 := rfl +lemma boostMatY_32 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 1) = 0 := rfl +lemma boostMatY_33 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 2) = 1 := rfl + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on a fermion pair `ψ̄_α (Dψ_μ)_β` with one derivative on + the unbarred factor. -/ +lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) = + ∑ γ, ∑ ν, ∑ δ, ((Λ⁻¹).1 α γ * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β δ))) • (Dbarψ [] γ * Dψ [ν] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] + simp only [hsm, hms, hms₂, hsmul] + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on a fermion pair `(D̄ψ̄_μ)_α ψ_β` with one derivative on + the barred factor. -/ +lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) = + ∑ ν, ∑ γ, ∑ δ, (((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α γ) * star ((Λ⁻¹).1 β δ)) • (Dbarψ [ν] γ * Dψ [] δ) := by + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsm₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] + simp only [hsm, hsm₂, hms, hsmul] + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F01`. -/ +lemma genZ_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F02`. -/ +lemma genZ_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F03`. -/ +lemma genZ_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F12`. -/ +lemma genZ_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F13`. -/ +lemma genZ_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Z`-boost action on the field strength `F23`. -/ +lemma genZ_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostZel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, + boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, + boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, + boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F01`. -/ +lemma genX_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F02`. -/ +lemma genX_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F03`. -/ +lemma genX_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F12`. -/ +lemma genX_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F13`. -/ +lemma genX_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `X`-boost action on the field strength `F23`. -/ +lemma genX_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostXel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, + boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, + boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, + boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F01`. -/ +lemma genY_F01 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F02`. -/ +lemma genY_F02 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F03`. -/ +lemma genY_F03 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F12`. -/ +lemma genY_F12 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + + (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F13`. -/ +lemma genY_F13 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + +set_option maxHeartbeats 2000000 in +/-- The `Y`-boost action on the field strength `F23`. -/ +lemma genY_F23 (t : ℝ) (ht : t ≠ 0) : + repLorentzGroup (boostYel t ht) + (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + + (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by + have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, + boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, + boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, + boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, + fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, + neg_smul, add_zero, zero_add, neg_zero] + try (match_scalars <;> (push_cast; try field_simp; try ring)) + try (match_scalars <;> (push_cast; try field_simp; try ring)) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Decomposition.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Decomposition.lean new file mode 100644 index 000000000..8f60c3a44 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/Decomposition.lean @@ -0,0 +1,817 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.Basic +/-! +# Weight and charge decomposition of the QED jet algebra + +The machinery for the converse inclusion. An element of +`MassWeightLESubmodule n` decomposes uniquely into eigenvectors of +`massWeightScale`, each of which lies in the span `covMonomialSpan w` of +covariant monomials of exact weight `w`; each of those decomposes further into +hypercharge eigenspaces `chargeCovSpan w k`. Both decompositions are +compatible with the Lorentz and gauge actions, so an invariant element is a +sum of invariant components. + +The selection rules `eq_zero_of_eq_smul_of_ne_one`, `eq_zero_of_charge_ne_zero` +and the parity rule `eq_zero_of_mem_covMonomialSpan_odd` kill all components +except those of even weight and zero charge. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +## Towards completeness: graded decomposition + +The powers `c ↦ c ^ w` are linearly independent functions of `c`, so the +weight components of an element are unique: a vanishing combination of +eigenvectors weighted by powers has vanishing components, and every element of +the weight-`≤ n` submodule decomposes into exact-weight eigenvectors. + +-/ + +/-- If a finite combination of vectors weighted by powers of `c` vanishes for + all `c`, each component vanishes. -/ +lemma eq_zero_of_forall_sum_pow_smul_eq_zero (s : Finset ℕ) (v : ℕ → JetAlgebra) + (h : ∀ c : ℂ, ∑ w ∈ s, c ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : v w = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hp : ∀ c : ℂ, Polynomial.eval c + (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by + intro c + have h2 := congrArg φ (h c) + rw [map_sum, map_zero] at h2 + rw [Polynomial.eval_finsetSum] + simpa [Polynomial.eval_monomial, mul_comm] using h2 + have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := + Polynomial.funext fun c => by rw [hp c, Polynomial.eval_zero] + have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff + +/-- Every element of the weight-`≤ n` submodule is a sum of exact-weight + eigenvectors of the mass-dimension scaling. -/ +lemma exists_eigen_decomp_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} + (hx : x ∈ MassWeightLESubmodule n) : + ∃ z : ℕ → JetAlgebra, + (∀ m, ∀ c : ℂ, massWeightScale c (z m) = c ^ m • z m) ∧ + x = ∑ m ∈ Finset.range (n + 1), z m := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨m, hmn, hym⟩ := hy + refine ⟨fun k => if k = m then y else 0, fun k c => ?_, ?_⟩ + · by_cases hk : k = m + · subst hk + simpa using hym c + · simp [hk] + · rw [Finset.sum_ite_eq' (Finset.range (n + 1)) m fun _ => y, + if_pos (Finset.mem_range.mpr (Nat.lt_succ_of_le hmn))] + | zero => + exact ⟨fun _ => 0, by simp, by simp⟩ + | add a b ha hb iha ihb => + obtain ⟨z₁, hz₁, rfl⟩ := iha + obtain ⟨z₂, hz₂, rfl⟩ := ihb + refine ⟨z₁ + z₂, fun m c => ?_, ?_⟩ + · simp only [Pi.add_apply, map_add, hz₁ m c, hz₂ m c, smul_add] + · rw [← Finset.sum_add_distrib] + rfl + | smul c a ha iha => + obtain ⟨z, hz, rfl⟩ := iha + refine ⟨c • z, fun m c' => ?_, ?_⟩ + · simp only [Pi.smul_apply, map_smul, hz m c', smul_comm c] + · rw [Finset.smul_sum] + rfl + +/-- The span of the covariant monomials of exact mass weight `w`: products of + field-strength derivatives and covariant derivatives of total weight `w`. -/ +noncomputable def covMonomialSpan (w : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ + ∀ c : ℂ, massWeightScale c y = c ^ w • y} + +/-- Every covariant monomial is homogeneous. -/ +lemma exists_weight_of_mem_closure {y : JetAlgebra} + (hy : y ∈ Submonoid.closure invariantGenerators) : + ∃ w, ∀ c : ℂ, massWeightScale c y = c ^ w • y := by + induction hy using Submonoid.closure_induction with + | mem z hz => + rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact ⟨4 + 2 * Multiset.card p.1, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dψ c p.1 p.2⟩ + · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + | one => + exact ⟨0, fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one⟩ + | mul a b ha hb iha ihb => + obtain ⟨wa, hwa⟩ := iha + obtain ⟨wb, hwb⟩ := ihb + exact ⟨wa + wb, massWeightScale_mul_eigen hwa hwb⟩ + +/-- Elements of the weight-`w` covariant monomial span are eigenvectors. -/ +lemma forall_massWeightScale_of_mem_covMonomialSpan {w : ℕ} {y : JetAlgebra} + (hy : y ∈ covMonomialSpan w) (c : ℂ) : + massWeightScale c y = c ^ w • y := by + induction hy using Submodule.span_induction with + | mem z hz => exact hz.2 c + | zero => simp + | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] + | smul d a ha iha => rw [map_smul, iha, smul_comm] + +/-- A vanishing tail extends a truncated sum. -/ +lemma sum_range_succ_ext {N M : ℕ} (z : ℕ → JetAlgebra) (hNM : N ≤ M) + (hz : ∀ m, N < m → z m = 0) : + ∑ m ∈ Finset.range (N + 1), z m = ∑ m ∈ Finset.range (M + 1), z m := by + refine Finset.sum_subset ?_ ?_ + · intro m hm + simp only [Finset.mem_range] at hm ⊢ + omega + intro m hm hms + refine hz m ?_ + simp only [Finset.mem_range] at hm hms + omega + +/-- Every element of the algebra generated by the covariant generators + decomposes into covariant monomial components of bounded weight. -/ +lemma exists_bound_decomp_of_mem_adjoin {x : JetAlgebra} + (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : + ∃ (N : ℕ) (z : ℕ → JetAlgebra), (∀ m, z m ∈ covMonomialSpan m) ∧ + (∀ m, N < m → z m = 0) ∧ x = ∑ m ∈ Finset.range (N + 1), z m := by + have hx' : x ∈ Subalgebra.toSubmodule (Algebra.adjoin ℂ invariantGenerators) := hadj + rw [Algebra.adjoin_eq_span] at hx' + clear hadj + induction hx' using Submodule.span_induction with + | mem y hy => + obtain ⟨w, hw⟩ := exists_weight_of_mem_closure hy + refine ⟨w, fun k => if k = w then y else 0, fun k => ?_, fun k hk => ?_, ?_⟩ + · by_cases hkw : k = w + · subst hkw + show (if k = k then y else 0) ∈ covMonomialSpan k + rw [if_pos rfl] + exact Submodule.subset_span ⟨hy, hw⟩ + · show (if k = w then y else 0) ∈ covMonomialSpan k + rw [if_neg hkw] + exact Submodule.zero_mem _ + · show (if k = w then y else 0) = 0 + rw [if_neg (show ¬ k = w by omega)] + · show y = ∑ m ∈ Finset.range (w + 1), (if m = w then y else 0) + rw [Finset.sum_ite_eq' (Finset.range (w + 1)) w fun _ => y, + if_pos (Finset.mem_range.mpr (Nat.lt_succ_self w))] + | zero => + exact ⟨0, fun _ => 0, fun m => Submodule.zero_mem _, fun _ _ => rfl, by simp⟩ + | add a b ha hb iha ihb => + obtain ⟨N₁, z₁, hz₁, hs₁, rfl⟩ := iha + obtain ⟨N₂, z₂, hz₂, hs₂, rfl⟩ := ihb + refine ⟨max N₁ N₂, z₁ + z₂, fun m => Submodule.add_mem _ (hz₁ m) (hz₂ m), + fun m hm => ?_, ?_⟩ + · simp only [Pi.add_apply, hs₁ m (lt_of_le_of_lt (le_max_left _ _) hm), + hs₂ m (lt_of_le_of_lt (le_max_right _ _) hm), add_zero] + · rw [sum_range_succ_ext z₁ (le_max_left N₁ N₂) hs₁, + sum_range_succ_ext z₂ (le_max_right N₁ N₂) hs₂, + ← Finset.sum_add_distrib] + rfl + | smul c a ha iha => + obtain ⟨N, z, hz, hs, rfl⟩ := iha + refine ⟨N, c • z, fun m => Submodule.smul_mem _ _ (hz m), + fun m hm => ?_, ?_⟩ + · simp only [Pi.smul_apply, hs m hm, smul_zero] + · rw [Finset.smul_sum] + rfl + +/-- The master decomposition: an element of the adjoin of the covariant + generators of mass weight at most eight is a sum of nine covariant monomial + components of weights `0, …, 8`. -/ +lemma exists_covMonomialSpan_decomp {x : JetAlgebra} + (hx : x ∈ MassWeightLESubmodule 8) + (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : + ∃ z : ℕ → JetAlgebra, (∀ m, z m ∈ covMonomialSpan m) ∧ + x = ∑ m ∈ Finset.range 9, z m := by + obtain ⟨N, z, hzmem, hzsupp, hzx⟩ := exists_bound_decomp_of_mem_adjoin hadj + obtain ⟨z', hz'eig, hz'x⟩ := exists_eigen_decomp_of_mem_massWeightLESubmodule hx + refine ⟨z, hzmem, ?_⟩ + set M := max N 8 with hM + have h1 : x = ∑ m ∈ Finset.range (M + 1), z m := + hzx.trans (sum_range_succ_ext z (le_max_left N 8) hzsupp) + have hz'supp : ∀ m, 8 < m → (fun k => if k < 9 then z' k else 0) m = 0 := by + intro m hm + show (if m < 9 then z' m else 0) = 0 + rw [if_neg (show ¬ m < 9 by omega)] + have h2 : x = ∑ m ∈ Finset.range (M + 1), (fun k => if k < 9 then z' k else 0) m := by + rw [hz'x, show (9 : ℕ) = 8 + 1 from rfl, + ← sum_range_succ_ext _ (le_max_right N 8) hz'supp] + exact Finset.sum_congr rfl fun m hm => by + rw [if_pos (Finset.mem_range.mp hm)] + have hdiff : ∀ c : ℂ, ∑ m ∈ Finset.range (M + 1), + c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) = 0 := by + intro c + have e1 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), c ^ m • z m := by + rw [h1, map_sum] + exact Finset.sum_congr rfl fun m _ => + forall_massWeightScale_of_mem_covMonomialSpan (hzmem m) c + have e2 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), + c ^ m • (fun k => if k < 9 then z' k else 0) m := by + rw [h2, map_sum] + refine Finset.sum_congr rfl fun m _ => ?_ + by_cases hm : m < 9 + · simp only [if_pos hm] + exact hz'eig m c + · simp only [if_neg hm, map_zero, smul_zero] + calc ∑ m ∈ Finset.range (M + 1), + c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) + = (∑ m ∈ Finset.range (M + 1), c ^ m • z m) - + ∑ m ∈ Finset.range (M + 1), + c ^ m • (fun k => if k < 9 then z' k else 0) m := by + rw [← Finset.sum_sub_distrib] + exact Finset.sum_congr rfl fun m _ => smul_sub _ _ _ + _ = massWeightScale c x - massWeightScale c x := by rw [← e1, ← e2] + _ = 0 := sub_self _ + have hkill : ∀ m, 8 < m → z m = 0 := by + intro m hm + by_cases hmM : m ≤ M + · have h0 : z m - (fun k => if k < 9 then z' k else 0) m = 0 := + eq_zero_of_forall_sum_pow_smul_eq_zero (Finset.range (M + 1)) _ hdiff + (show m ∈ Finset.range (M + 1) from Finset.mem_range.mpr (by omega)) + simpa [if_neg (by omega : ¬ m < 9)] using h0 + · exact hzsupp m (by omega) + rw [h1, show (9 : ℕ) = 8 + 1 from rfl, sum_range_succ_ext z (le_max_right N 8) hkill] + +/-! + +## Componentwise invariance + +The scaling at real scalars commutes with the Lorentz action and (at all +scalars) with the constant gauge action, so the weight components of an +invariant element are themselves invariant. + +-/ + + +/-- Real-scalar variant of the independence of powers. -/ +lemma eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero (s : Finset ℕ) + (v : ℕ → JetAlgebra) + (h : ∀ r : ℝ, ∑ w ∈ s, ((r : ℂ)) ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : + v w = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hp : ∀ r : ℝ, Polynomial.eval ((r : ℂ)) + (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by + intro r + have h2 := congrArg φ (h r) + rw [map_sum, map_zero] at h2 + rw [Polynomial.eval_finsetSum] + simpa [Polynomial.eval_monomial, mul_comm] using h2 + have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by + refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ + refine Set.Infinite.mono ?_ + (Set.infinite_range_of_injective Complex.ofReal_injective) + rintro z ⟨r, rfl⟩ + exact hp r + have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff + +/-- The weight components of a Lorentz-invariant covariant decomposition are + Lorentz invariant. -/ +lemma repLorentzGroup_covComponent_eq {z : ℕ → JetAlgebra} + (hz : ∀ m, z m ∈ covMonomialSpan m) (Λ : SL(2,ℂ)) + (hx : repLorentzGroup Λ (∑ m ∈ Finset.range 9, z m) = + ∑ m ∈ Finset.range 9, z m) + {m : ℕ} (hm : m ∈ Finset.range 9) : + repLorentzGroup Λ (z m) = z m := by + have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, + ((r : ℂ)) ^ k • (repLorentzGroup Λ (z k) - z k) = 0 := by + intro r + have e1 : massWeightScale ((r : ℂ)) + (repLorentzGroup Λ (∑ k ∈ Finset.range 9, z k) - + ∑ k ∈ Finset.range 9, z k) = 0 := by + rw [hx, sub_self, map_zero] + rw [map_sum, map_sub, map_sum, map_sum] at e1 + calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • + (repLorentzGroup Λ (z k) - z k) + = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) + (repLorentzGroup Λ (z k))) - + ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [massWeightScale_ofReal_repLorentzGroup, + forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, + smul_sub] + _ = 0 := e1 + have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm + rwa [sub_eq_zero] at h0 + +/-- The weight components of a constant-gauge-invariant covariant decomposition + are constant-gauge invariant. -/ +lemma repJetGaugeGroupI_ofConstant_covComponent_eq {z : ℕ → JetAlgebra} + (hz : ∀ m, z m ∈ covMonomialSpan m) (g : GaugeGroupI) + (hx : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (∑ m ∈ Finset.range 9, z m) = ∑ m ∈ Finset.range 9, z m) + {m : ℕ} (hm : m ∈ Finset.range 9) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z m) = z m := by + have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) = 0 := by + intro r + have e1 : massWeightScale ((r : ℂ)) + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (∑ k ∈ Finset.range 9, z k) - ∑ k ∈ Finset.range 9, z k) = 0 := by + rw [hx, sub_self, map_zero] + rw [map_sum, map_sub, map_sum, map_sum] at e1 + calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) + = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) + (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k))) - + ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [massWeightScale_repJetGaugeGroupI_ofConstant, + forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, + smul_sub] + _ = 0 := e1 + have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm + rwa [sub_eq_zero] at h0 + +/-! + +## The low-weight sectors + +-/ + +/-- An element with two distinct exact weights vanishes. -/ +lemma eq_zero_of_eigen_ne {y : JetAlgebra} {m n : ℕ} + (hm : ∀ c : ℂ, massWeightScale c y = c ^ m • y) + (hn : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (hmn : m ≠ n) : y = 0 := by + have h : ((2 : ℂ) ^ m) • y = ((2 : ℂ) ^ n) • y := (hm 2).symm.trans (hn 2) + have h2 : ((2 : ℂ) ^ m - 2 ^ n) • y = 0 := + (sub_smul ((2 : ℂ) ^ m) ((2 : ℂ) ^ n) y).trans (by rw [h, sub_self]) + rcases smul_eq_zero.mp h2 with h3 | h3 + · exfalso + apply hmn + rw [sub_eq_zero] at h3 + have h4 : ((2 ^ m : ℕ) : ℂ) = ((2 ^ n : ℕ) : ℂ) := by + push_cast + exact h3 + exact Nat.pow_right_injective (le_refl 2) (Nat.cast_injective h4) + · exact h3 + +/-- Every covariant monomial is the unit or homogeneous of weight at least + three. -/ +lemma mem_closure_weight_cases {y : JetAlgebra} + (hy : y ∈ Submonoid.closure invariantGenerators) : + y = 1 ∨ ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c y = c ^ w • y := by + induction hy using Submonoid.closure_induction with + | mem z hz => + rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact Or.inr ⟨4 + 2 * Multiset.card p.1, by omega, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + · exact Or.inr ⟨3 + 2 * p.1.length, by omega, + fun c => massWeightScale_Dψ c p.1 p.2⟩ + · exact Or.inr ⟨3 + 2 * p.1.length, by omega, + fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + | one => exact Or.inl rfl + | mul a b ha hb iha ihb => + rcases iha with rfl | ⟨wa, hwa3, hwa⟩ + · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ + · exact Or.inl (one_mul (1 : JetAlgebra)) + · exact Or.inr ⟨wb, hwb3, fun c => by + rw [show (1 : JetAlgebra) * b = b from one_mul b] + exact hwb c⟩ + · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ + · exact Or.inr ⟨wa, hwa3, fun c => by + rw [show a * (1 : JetAlgebra) = a from mul_one a] + exact hwa c⟩ + · exact Or.inr ⟨wa + wb, by omega, massWeightScale_mul_eigen hwa hwb⟩ + +/-- The weight-zero covariant monomial span consists of the constants. -/ +lemma covMonomialSpan_zero_le : + covMonomialSpan 0 ≤ Submodule.span ℂ {(1 : JetAlgebra)} := by + rw [covMonomialSpan, Submodule.span_le] + rintro y ⟨hy, hy0⟩ + rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ + · exact Submodule.subset_span rfl + · rw [show y = 0 from eq_zero_of_eigen_ne hwe hy0 (by omega)] + exact Submodule.zero_mem _ + +/-- There are no covariant monomials of weights one or two. -/ +lemma covMonomialSpan_le_bot_of_lt_three {m : ℕ} (hm1 : 1 ≤ m) (hm2 : m < 3) : + covMonomialSpan m ≤ ⊥ := by + rw [covMonomialSpan, Submodule.span_le] + rintro y ⟨hy, hym⟩ + rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ + · have h1 : ∀ c : ℂ, massWeightScale c (1 : JetAlgebra) = c ^ 0 • 1 := + fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one + have := eq_zero_of_eigen_ne h1 hym (by omega) + simp [this] + · rw [show y = 0 from eq_zero_of_eigen_ne hwe hym (by omega)] + simp + +/-! + +## The parity selection rule + +Every covariant monomial is an eigenvector of the constant gauge action with a +hypercharge character whose parity equals that of its mass weight: bosonic +generators have even weight and charge zero, fermionic generators odd weight +and charge `±6`. The constant gauge transformation with `u(0) = i` therefore +acts on odd-weight monomials by `-1`, and no odd-weight sector contains a +gauge invariant. + +-/ + +/-- Every covariant monomial is an eigenvector of the constant gauge action, + with character exponent of the same parity as its mass weight. -/ +lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} + (hy : y ∈ Submonoid.closure invariantGenerators) : + ∃ (w : ℕ) (k : ℤ), k.natAbs ≤ w ∧ (w : ℤ) % 2 = k % 2 ∧ + (∀ c : ℂ, massWeightScale c y = c ^ w • y) ∧ + ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + (((g.2.2 : ℂ)) ^ (6 * k)) • y := by + have hz : ∀ g : GaugeGroupI, ((g.2.2 : ℂ)) ≠ 0 := by + intro g h + have h1 := (Unitary.mem_iff.mp (g.2.2).2).1 + rw [h, mul_zero] at h1 + exact zero_ne_one h1 + induction hy using Submonoid.closure_induction with + | mem z hzz => + rcases hzz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · refine ⟨4 + 2 * Multiset.card p.1, 0, by simp, by omega, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2, fun g => ?_⟩ + rw [repJetGaugeGroupI_fieldStrengthDeriv, mul_zero, zpow_zero, one_smul] + · refine ⟨3 + 2 * p.1.length, 1, by omega, by omega, + fun c => massWeightScale_Dψ c p.1 p.2, fun g => ?_⟩ + rw [repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, + SubmonoidClass.coe_pow, mul_one, + show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] + · refine ⟨3 + 2 * p.1.length, -1, by omega, by omega, + fun c => massWeightScale_Dbarψ c p.1 p.2, fun g => ?_⟩ + rw [repJetGaugeGroupI_Dbarψ, JetGaugeGroupI.eval_ofConstant, + Submonoid.smul_def, SubmonoidClass.coe_pow, Unitary.coe_star] + congr 1 + have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := + eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 + rw [hinv, show (6 : ℤ) * (-1) = -(6 : ℤ) from by ring, _root_.zpow_neg, + show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] + exact inv_pow _ 6 + | one => + refine ⟨0, 0, by simp, rfl, fun c => by + rw [pow_zero, one_smul]; exact (massWeightScale c).map_one, fun g => ?_⟩ + rw [mul_zero, zpow_zero, one_smul] + exact (repJetGaugeGroupI_eq_repAlgHom _ 1).trans + (repAlgHom (JetGaugeGroupI.ofConstant g)).map_one + | mul a b ha hb iha ihb => + obtain ⟨wa, ka, hba, hpa, hea, hga⟩ := iha + obtain ⟨wb, kb, hbb, hpb, heb, hgb⟩ := ihb + refine ⟨wa + wb, ka + kb, by + have := Int.natAbs_add_le ka kb + omega, by omega, massWeightScale_mul_eigen hea heb, fun g => ?_⟩ + rw [repJetGaugeGroupI_mul', hga g, hgb g, smul_mul_smul_comm, + show (6 : ℤ) * (ka + kb) = 6 * ka + 6 * kb from by ring, + zpow_add₀ (hz g)] + +/-- The constant gauge transformation with `u(0) = i`. -/ +noncomputable def parityGauge : GaugeGroupI := + (1, 1, ⟨Complex.I, by + rw [Unitary.mem_iff] + constructor <;> + simp [Complex.star_def, Complex.conj_I]⟩) + +/-- The parity gauge transformation acts by `-1` on every odd-weight covariant + monomial. -/ +lemma rep_parityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) + {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = -y := by + induction hy using Submodule.span_induction with + | mem u hu => + obtain ⟨hu1, hu2⟩ := hu + obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 + by_cases hu0 : u = 0 + · rw [hu0, map_zero, neg_zero] + · have hwm : w = m := by + by_contra hne + exact hu0 (eq_zero_of_eigen_ne he hu2 hne) + have hkodd : Odd k := by + rw [Int.odd_iff] + omega + rw [hg parityGauge, + show ((parityGauge.2.2 : ℂ)) = Complex.I from rfl, + show (6 : ℤ) * k = 2 * (3 * k) from by ring, _root_.zpow_mul, + show Complex.I ^ (2 : ℤ) = -1 from by + rw [show (2 : ℤ) = ((2 : ℕ) : ℤ) from rfl, zpow_natCast, Complex.I_sq], + show (-1 : ℂ) ^ (3 * k) = -1 from Odd.neg_one_zpow (by + rcases hkodd with ⟨j, hj⟩ + exact ⟨3 * j + 1, by omega⟩)] + exact neg_one_smul ℂ u + | zero => rw [map_zero, neg_zero] + | add u v hu hv ihu ihv => rw [map_add, ihu, ihv, neg_add] + | smul c u hu ihu => rw [map_smul, ihu, smul_neg] + +/-- Odd-weight covariant monomial spans contain no constant-gauge + invariants. -/ +lemma eq_zero_of_mem_covMonomialSpan_odd {m : ℕ} (hm : m % 2 = 1) + {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) + (hinv : repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = y) : + y = 0 := by + have h := (rep_parityGauge_eq_neg_of_mem_covMonomialSpan hm hy).symm.trans hinv + have h2 : (2 : ℂ) • y = 0 := by + calc (2 : ℂ) • y = y + y := two_smul ℂ y + _ = -y + y := congrArg (· + y) h.symm + _ = 0 := neg_add_cancel y + rcases smul_eq_zero.mp h2 with h3 | h3 + · exact absurd h3 two_ne_zero + · exact h3 + +/-! + +## The master selection rules + +An invariant which is also an eigenvector with a nontrivial eigenvalue must +vanish. Specialized to the constant gauge action at a root of unity this is the +hypercharge selection rule; specialized to diagonal Lorentz transformations it +kills the non-scalar Lorentz components. + +-/ + +/-- The master selection rule: an element that scales by a factor other than + one vanishes. -/ +lemma eq_zero_of_eq_smul_of_ne_one {y : JetAlgebra} {c : ℂ} + (h1 : y = c • y) (hc : c ≠ 1) : y = 0 := by + have h2 : (c - 1) • y = 0 := + (sub_smul c 1 y).trans (by rw [one_smul, ← h1, sub_self]) + rcases smul_eq_zero.mp h2 with h3 | h3 + · exact absurd (sub_eq_zero.mp h3) hc + · exact h3 + +/-- The unit-circle exponential is unitary. -/ +lemma exp_mul_I_mem_unitary (θ : ℝ) : + Complex.exp ((θ : ℂ) * Complex.I) ∈ unitary ℂ := by + have hstar : star (Complex.exp ((θ : ℂ) * Complex.I)) = + Complex.exp (-((θ : ℂ) * Complex.I)) := by + rw [show star (Complex.exp ((θ : ℂ) * Complex.I)) = + (starRingEnd ℂ) (Complex.exp ((θ : ℂ) * Complex.I)) from rfl, + ← Complex.exp_conj] + congr 1 + simp [Complex.conj_ofReal] + rw [Unitary.mem_iff] + constructor + · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] + · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero] + +/-- The constant `U(1)` gauge transformation at a unitary scalar. -/ +noncomputable def u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : GaugeGroupI := + (1, 1, ⟨z, hz⟩) + +/-- The hypercharge selection rule: a constant-gauge eigenvector of nonzero + charge admits no invariant. -/ +lemma eq_zero_of_charge_ne_zero {y : JetAlgebra} {k : ℤ} (hk : k ≠ 0) + (hy : ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + ((g.2.2 : ℂ)) ^ (6 * k) • y) + (hinv : ∀ g : GaugeGroupI, + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : y = 0 := by + have h6k : ((6 * k : ℤ) : ℝ) ≠ 0 := by + simp only [ne_eq, Int.cast_eq_zero] + omega + set θ : ℝ := Real.pi / ((6 * k : ℤ) : ℝ) with hθ + set g : GaugeGroupI := u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) + (exp_mul_I_mem_unitary θ) with hg + have hval : ((g.2.2 : ℂ)) = Complex.exp ((θ : ℂ) * Complex.I) := rfl + have hchar : ((g.2.2 : ℂ)) ^ (6 * k) = -1 := by + rw [hval, ← Complex.exp_int_mul, + show ((6 * k : ℤ) : ℂ) * ((θ : ℂ) * Complex.I) = + (((6 * k : ℤ) : ℝ) * θ : ℝ) * Complex.I from by push_cast; ring, + show ((6 * k : ℤ) : ℝ) * θ = Real.pi from mul_div_cancel₀ Real.pi h6k ▸ rfl] + exact Complex.exp_pi_mul_I + exact eq_zero_of_eq_smul_of_ne_one + ((hinv g).symm.trans ((hy g).trans (by rw [hchar]))) + (by + intro h + norm_num at h) + +/-! + +## Charge decomposition + +The constant gauge characters at distinct charges are linearly independent +along the unit circle, so every element of a weight sector decomposes into +charge components, and a constant-gauge invariant equals its neutral component. + +-/ + +/-- The unit-circle exponentials are injective on `(0, 1)`. -/ +lemma exp_mul_I_injOn : + Set.InjOn (fun θ : ℝ => Complex.exp ((θ : ℂ) * Complex.I)) + (Set.Ioo (0 : ℝ) 1) := by + intro a ha b hb hab + rcases Complex.exp_eq_exp_iff_exists_int.mp hab with ⟨n, hn⟩ + have h2 : (a : ℂ) = (b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ)) := by + have h1 : (a : ℂ) * Complex.I = + ((b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ))) * Complex.I := by + rw [hn] + ring + exact mul_right_cancel₀ Complex.I_ne_zero h1 + have h3 : a = b + (n : ℝ) * (2 * Real.pi) := by exact_mod_cast h2 + have hn0 : n = 0 := by + by_contra hne + have h4 : (1 : ℝ) ≤ |(n : ℝ)| := by exact_mod_cast Int.one_le_abs hne + have hπ : (2 : ℝ) ≤ Real.pi := Real.two_le_pi + have h5 : |a - b| < 1 := by + rw [abs_sub_lt_iff] + constructor <;> nlinarith [ha.1, ha.2, hb.1, hb.2] + rw [h3] at h5 + simp only [add_sub_cancel_left] at h5 + rw [abs_mul, abs_of_pos (by positivity : (0 : ℝ) < 2 * Real.pi)] at h5 + nlinarith + rw [hn0] at h3 + push_cast at h3 + linarith + +/-- Independence of the circle characters: a finite Laurent combination + vanishing on the unit circle has vanishing coefficients. -/ +lemma eq_zero_of_forall_circle_sum_zpow_smul_eq_zero (s : Finset ℤ) + (v : ℤ → JetAlgebra) + (h : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0) + {k : ℤ} (hk : k ∈ s) : v k = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hne : s.Nonempty := ⟨k, hk⟩ + set n₀ : ℤ := -s.min' hne with hn₀ + have hshift : ∀ j ∈ s, 0 ≤ j + n₀ := fun j hj => by + have := s.min'_le j hj + omega + have heval : ∀ θ : ℝ, Polynomial.eval (Complex.exp ((θ : ℂ) * Complex.I)) + (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by + intro θ + have hz0 : Complex.exp ((θ : ℂ) * Complex.I) ≠ 0 := Complex.exp_ne_zero _ + have h2 := congrArg φ (h θ) + rw [map_sum, map_zero] at h2 + have h3 : ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by + rw [← h2] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl + have h4 : Complex.exp ((θ : ℂ) * Complex.I) ^ n₀ * + ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by + rw [h3, mul_zero] + rw [Finset.mul_sum] at h4 + rw [Polynomial.eval_finsetSum, ← h4] + refine Finset.sum_congr rfl fun j hj => ?_ + rw [Polynomial.eval_monomial, + show Complex.exp ((θ : ℂ) * Complex.I) ^ (j + n₀).toNat = + Complex.exp ((θ : ℂ) * Complex.I) ^ ((j + n₀) : ℤ) from by + rw [← zpow_natCast, Int.toNat_of_nonneg (hshift j hj)], + zpow_add₀ hz0] + ring + have hzero : (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by + refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ + refine Set.Infinite.mono ?_ + ((Set.Ioo_infinite (by norm_num : (0 : ℝ) < 1)).image exp_mul_I_injOn) + rintro z ⟨θ, _, rfl⟩ + exact heval θ + have hcoeff := congrArg (fun p => Polynomial.coeff p (k + n₀).toNat) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + rw [Finset.sum_eq_single k + (fun j hj hjk => by + rw [Polynomial.coeff_monomial, if_neg (fun heq => hjk (by + have h1 : j + n₀ = k + n₀ := by + rw [← Int.toNat_of_nonneg (hshift j hj), + ← Int.toNat_of_nonneg (hshift k hk), heq] + omega))]) + (fun hks => absurd hk hks)] at hcoeff + simpa [Polynomial.coeff_monomial] using hcoeff + +/-- The charge-`6k` part of a weight sector: the span of the covariant + monomials of weight `m` and hypercharge `6 k`. -/ +noncomputable def chargeCovSpan (m : ℕ) (k : ℤ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ + (∀ c : ℂ, massWeightScale c y = c ^ m • y) ∧ + ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + ((g.2.2 : ℂ)) ^ (6 * k) • y} + +/-- Elements of the charge component are eigenvectors of the constant gauge + action. -/ +lemma forall_rep_ofConstant_of_mem_chargeCovSpan {m : ℕ} {k : ℤ} + {y : JetAlgebra} (hy : y ∈ chargeCovSpan m k) (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = + ((g.2.2 : ℂ)) ^ (6 * k) • y := by + induction hy using Submodule.span_induction with + | mem u hu => exact hu.2.2 g + | zero => simp + | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] + | smul c a ha iha => rw [map_smul, iha, smul_comm] + +/-- The charge components sit inside the weight sector. -/ +lemma chargeCovSpan_le_covMonomialSpan {m : ℕ} {k : ℤ} : + chargeCovSpan m k ≤ covMonomialSpan m := + Submodule.span_mono fun y hy => ⟨hy.1, hy.2.1⟩ + +/-- Charge decomposition within a weight sector. -/ +lemma exists_charge_decomp_of_mem_covMonomialSpan {m : ℕ} {y : JetAlgebra} + (hy : y ∈ covMonomialSpan m) : + ∃ v : ℤ → JetAlgebra, (∀ j, v j ∈ chargeCovSpan m j) ∧ + y = ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), v j := by + induction hy using Submodule.span_induction with + | mem u hu => + obtain ⟨hu1, hu2⟩ := hu + obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 + by_cases hu0 : u = 0 + · exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp [hu0]⟩ + · have hwm : w = m := by + by_contra hne + exact hu0 (eq_zero_of_eigen_ne he hu2 hne) + have hkm : k ∈ Finset.Icc (-(m : ℤ)) (m : ℤ) := by + rw [Finset.mem_Icc] + omega + refine ⟨fun j => if j = k then u else 0, fun j => ?_, ?_⟩ + · show (if j = k then u else 0) ∈ chargeCovSpan m j + by_cases hjk : j = k + · subst hjk + rw [if_pos rfl] + exact Submodule.subset_span ⟨hu1, hu2, hg⟩ + · rw [if_neg hjk] + exact Submodule.zero_mem _ + · rw [show (∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), + (fun j => if j = k then u else 0) j) = + ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), (if j = k then u else 0) from rfl, + Finset.sum_ite_eq' _ k fun _ => u, if_pos hkm] + | zero => + exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp⟩ + | add a b ha hb iha ihb => + obtain ⟨v₁, hv₁, rfl⟩ := iha + obtain ⟨v₂, hv₂, rfl⟩ := ihb + exact ⟨v₁ + v₂, fun j => Submodule.add_mem _ (hv₁ j) (hv₂ j), + by rw [← Finset.sum_add_distrib]; rfl⟩ + | smul c a ha iha => + obtain ⟨v, hv, rfl⟩ := iha + exact ⟨c • v, fun j => Submodule.smul_mem _ _ (hv j), + by rw [Finset.smul_sum]; rfl⟩ + +/-- The neutral-charge selection rule: a constant-gauge-invariant element of a + weight sector lies in the charge-zero component, since the characters + `u ↦ u^{6j}` of distinct charges are linearly independent along the unit + circle. -/ +lemma mem_chargeCovSpan_zero_of_invariant {m : ℕ} {y : JetAlgebra} + (hy : y ∈ covMonomialSpan m) + (hinv : ∀ g : GaugeGroupI, + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : + y ∈ chargeCovSpan m 0 := by + obtain ⟨v, hv, hyeq⟩ := exists_charge_decomp_of_mem_covMonomialSpan hy + set S : Finset ℤ := Finset.Icc (-(m : ℤ)) (m : ℤ) with hS + have hchar : ∀ θ : ℝ, ∑ j ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * j) • + v j = ∑ j ∈ S, v j := by + intro θ + have hval : (((u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) + (exp_mul_I_mem_unitary θ)).2.2 : ℂ)) = + Complex.exp ((θ : ℂ) * Complex.I) := rfl + have h1 := hinv (u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) + (exp_mul_I_mem_unitary θ)) + rw [hyeq, map_sum] at h1 + rw [← h1] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [forall_rep_ofConstant_of_mem_chargeCovSpan (hv j), hval] + have hkill : ∀ j ∈ S, j ≠ 0 → v j = 0 := by + intro j hj hj0 + have h6 : Function.Injective (fun k : ℤ => 6 * k) := fun a b hab => by + simpa using hab + set w : ℤ → JetAlgebra := fun k => v (k / 6) - + (if k = 0 then ∑ i ∈ S, v i else 0) with hw + have hzero : ∀ θ : ℝ, ∑ k ∈ S.image (fun j => 6 * j), + (Complex.exp ((θ : ℂ) * Complex.I)) ^ k • w k = 0 := by + intro θ + rw [Finset.sum_image fun a _ b _ h => h6 h] + have hterm : ∀ i ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • + w (6 * i) = (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • v i - + (if i = 0 then ∑ i ∈ S, v i else 0) := by + intro i _ + rw [hw] + simp only [Int.mul_ediv_cancel_left i (by norm_num : (6 : ℤ) ≠ 0), + show 6 * i = 0 ↔ i = 0 from by omega] + by_cases hi : i = 0 + · rw [if_pos hi, smul_sub, hi] + norm_num + · rw [if_neg hi] + simp + rw [Finset.sum_congr rfl hterm, Finset.sum_sub_distrib, hchar θ, + Finset.sum_ite_eq' S (0 : ℤ) fun _ => ∑ i ∈ S, v i, + if_pos (by simp [hS] : (0 : ℤ) ∈ S), sub_self] + have h0 := eq_zero_of_forall_circle_sum_zpow_smul_eq_zero _ _ hzero + (Finset.mem_image_of_mem (fun j => 6 * j) hj) + rw [hw] at h0 + simpa [Int.mul_ediv_cancel_left j (by norm_num : (6 : ℤ) ≠ 0), + show ¬ (6 * j = 0) from by omega] using h0 + have hy0 : y = v 0 := by + rw [hyeq, Finset.sum_eq_single 0 (fun j hj hj0 => hkill j hj hj0) + (fun h => absurd (by simp [hS] : (0 : ℤ) ∈ S) h)] + rw [hy0] + exact hv 0 +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean new file mode 100644 index 000000000..0aaf8e08b --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean @@ -0,0 +1,1440 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.ProjectorValues +/-! +# The Klein average on the weight-eight monomials + +The entries of the Lorentz matrices of the three parity rotations, and the +values of the Klein four-group average `kleinAvg` on the weight-eight +monomials. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups +/-- Entries of the Lorentz matrix of `parityZ`. -/ +lemma parityMatZ_00 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_01 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_02 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_03 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_10 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_11 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 0) = -1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_12 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_13 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_20 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_21 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_22 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 1) = -1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_23 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_30 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_31 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_32 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +lemma parityMatZ_33 : + (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 2) = 1 := by + rw [toLorentzGroup_parityZ] + norm_num [paritySignZ] + all_goals decide + +/-- Entries of the Lorentz matrix of `parityX`. -/ +lemma parityMatX_00 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_01 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_02 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_03 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_10 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_11 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 0) = 1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_12 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_13 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_20 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_21 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_22 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 1) = -1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_23 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_30 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_31 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_32 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +lemma parityMatX_33 : + (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 2) = -1 := by + rw [toLorentzGroup_parityX] + norm_num [paritySignX] + all_goals decide + +/-- Entries of the Lorentz matrix of `parityY`. -/ +lemma parityMatY_00 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_01 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_02 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_03 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_10 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_11 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 0) = -1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_12 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_13 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_20 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_21 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_22 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 1) = 1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_23 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_30 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_31 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_32 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +lemma parityMatY_33 : + (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 2) = -1 := by + rw [toLorentzGroup_parityY] + norm_num [paritySignY] + all_goals decide + +set_option maxHeartbeats 2000000 in +/-- The Klein average acts diagonally on products of two field strengths, by + the average of the four parity signs. -/ +lemma kleinAvg_fieldStrengthDeriv_nil_mul (a b c d : Fin 1 ⊕ Fin 3) : + kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = + (((1 + paritySignZ a * paritySignZ b * (paritySignZ c * paritySignZ d) + + paritySignY a * paritySignY b * (paritySignY c * paritySignY d) + + paritySignX a * paritySignX b * (paritySignX c * paritySignX d)) / 4 : ℝ) : ℂ) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_apply_mul, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX, + smul_mul_smul_comm] + push_cast + module + +/-- Under a diagonal Lorentz transformation the second-derivative field + strength scales by the product of the signs of its four indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv_pair {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {ρ, τ} μ ν) = + ((sgn ρ * (sgn τ * (sgn μ * sgn ν)) : ℝ) : ℂ) • + fieldStrengthDeriv {ρ, τ} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_pair] + rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun s _ => + Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by + rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ρ) h)] + rw [Finset.sum_eq_single τ (fun s _ hs => Finset.sum_eq_zero fun a _ => + Finset.sum_eq_zero fun b _ => by + rw [hM s τ, if_neg hs, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ τ) h)] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, mul_zero, mul_zero, Complex.ofReal_zero, + zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, mul_zero, mul_zero, Complex.ofReal_zero, + zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM ρ ρ, if_pos rfl, hM τ τ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, + if_pos rfl] + +/-- The Klein average acts diagonally on the second-derivative field + strengths. -/ +lemma kleinAvg_fieldStrengthDeriv_pair (r t a b : Fin 1 ⊕ Fin 3) : + kleinAvg (fieldStrengthDeriv {r, t} a b) = + (((1 + paritySignZ r * (paritySignZ t * (paritySignZ a * paritySignZ b)) + + paritySignY r * (paritySignY t * (paritySignY a * paritySignY b)) + + paritySignX r * (paritySignX t * (paritySignX a * paritySignX b))) / 4 : ℝ) : ℂ) • + fieldStrengthDeriv {r, t} a b := by + rw [kleinAvg_apply, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityX] + push_cast + module + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,0]` (u-family). -/ +lemma kleinAvg_u_e000 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,1]` (u-family). -/ +lemma kleinAvg_u_e001 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,0]` (u-family). -/ +lemma kleinAvg_u_e010 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,1]` (u-family). -/ +lemma kleinAvg_u_e011 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,0]` (u-family). -/ +lemma kleinAvg_u_e100 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,1]` (u-family). -/ +lemma kleinAvg_u_e101 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,0]` (u-family). -/ +lemma kleinAvg_u_e110 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,1]` (u-family). -/ +lemma kleinAvg_u_e111 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,0]` (u-family). -/ +lemma kleinAvg_u_e200 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,1]` (u-family). -/ +lemma kleinAvg_u_e201 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,0]` (u-family). -/ +lemma kleinAvg_u_e210 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,1]` (u-family). -/ +lemma kleinAvg_u_e211 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,0]` (u-family). -/ +lemma kleinAvg_u_e300 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,1]` (u-family). -/ +lemma kleinAvg_u_e301 : + kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,0]` (u-family). -/ +lemma kleinAvg_u_e310 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,1]` (u-family). -/ +lemma kleinAvg_u_e311 : + kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e000 : + kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e001 : + kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e010 : + kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[0,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e011 : + kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e100 : + kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e101 : + kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e110 : + kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[1,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e111 : + kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e200 : + kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e201 : + kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e210 : + kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (-(1/2) : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[2,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e211 : + kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e300 : + kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,0,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e301 : + kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,0]` (ubar-family). -/ +lemma kleinAvg_ubar_e310 : + kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0) = + 0 := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The Klein average of the fermion pair monomial `e[3,1,1]` (ubar-family). -/ +lemma kleinAvg_ubar_e311 : + kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (-(1/2) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + rw [kleinAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, + parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, + parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, + parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, + parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, + parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, + parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, + parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Membership.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Membership.lean new file mode 100644 index 000000000..47da6fb0b --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/Membership.lean @@ -0,0 +1,1433 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.KleinAverage +/-! +# The projected weight-eight monomials lie in the span + +Every weight-eight monomial, after Klein-averaging and applying the projector +`opPi`, lands in the span of the four renormalizable invariants. Together with +`opPi_apply_of_invariant` this is the last input to the classification +theorem. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The Maxwell term lies in the span of the invariants. -/ +lemma maxwellTerm_mem_span : + maxwellTerm ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- The theta term lies in the span of the invariants. -/ +lemma thetaTerm_mem_span : + thetaTerm ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- The fermion kinetic term lies in the span of the invariants. -/ +lemma fermionKineticTerm_mem_span : + fermionKineticTerm ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- The conjugate fermion kinetic term lies in the span of the invariants. -/ +lemma fermionKineticTermBar_mem_span : + fermionKineticTermBar ∈ Submodule.span ℂ massDimFourInvariants := + Submodule.subset_span (by simp [massDimFourInvariants]) + +/-- Projector membership for the ordered square `F01 * F01`. -/ +lemma opPi_FF_c0101_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F01_F01] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F01 * F10`. -/ +lemma opPi_FF_c0110_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F01_F01] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F01`. -/ +lemma opPi_FF_c1001_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F01_F01] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F10`. -/ +lemma opPi_FF_c1010_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F01_F01] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F01 * F23`. -/ +lemma opPi_FF_c0123_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F01 * F32`. -/ +lemma opPi_FF_c0132_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F23`. -/ +lemma opPi_FF_c1023_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F10 * F32`. -/ +lemma opPi_FF_c1032_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F01`. -/ +lemma opPi_FF_c2301_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F10`. -/ +lemma opPi_FF_c2310_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F01`. -/ +lemma opPi_FF_c3201_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F10`. -/ +lemma opPi_FF_c3210_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F01_F23] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F23`. -/ +lemma opPi_FF_c2323_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F23_F23] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F23 * F32`. -/ +lemma opPi_FF_c2332_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F23_F23] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F23`. -/ +lemma opPi_FF_c3223_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F23_F23] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F32 * F32`. -/ +lemma opPi_FF_c3232_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F23_F23] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F02`. -/ +lemma opPi_FF_c0202_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F02_F02] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F20`. -/ +lemma opPi_FF_c0220_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F02_F02] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F02`. -/ +lemma opPi_FF_c2002_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F02_F02] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F20`. -/ +lemma opPi_FF_c2020_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F02_F02] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F13`. -/ +lemma opPi_FF_c0213_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F02 * F31`. -/ +lemma opPi_FF_c0231_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F13`. -/ +lemma opPi_FF_c2013_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F20 * F31`. -/ +lemma opPi_FF_c2031_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F02`. -/ +lemma opPi_FF_c1302_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F20`. -/ +lemma opPi_FF_c1320_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F02`. -/ +lemma opPi_FF_c3102_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F20`. -/ +lemma opPi_FF_c3120_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F02_F13] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F13`. -/ +lemma opPi_FF_c1313_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F13_F13] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F13 * F31`. -/ +lemma opPi_FF_c1331_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F13_F13] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F13`. -/ +lemma opPi_FF_c3113_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F13_F13] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F31 * F31`. -/ +lemma opPi_FF_c3131_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F13_F13] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F03`. -/ +lemma opPi_FF_c0303_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F03_F03] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F30`. -/ +lemma opPi_FF_c0330_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F03_F03] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F03`. -/ +lemma opPi_FF_c3003_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F03_F03] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F30`. -/ +lemma opPi_FF_c3030_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F03_F03] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F12`. -/ +lemma opPi_FF_c0312_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F03 * F21`. -/ +lemma opPi_FF_c0321_mem : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F12`. -/ +lemma opPi_FF_c3012_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F30 * F21`. -/ +lemma opPi_FF_c3021_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F03`. -/ +lemma opPi_FF_c1203_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F30`. -/ +lemma opPi_FF_c1230_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F03`. -/ +lemma opPi_FF_c2103_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F30`. -/ +lemma opPi_FF_c2130_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [fieldStrengthDeriv_mul_comm] + rw [opPi_F03_F12] + exact Submodule.smul_mem _ _ thetaTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F12`. -/ +lemma opPi_FF_c1212_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_F12_F12] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered square `F12 * F21`. -/ +lemma opPi_FF_c1221_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F12_F12] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F12`. -/ +lemma opPi_FF_c2112_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F12_F12] + exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) + +/-- Projector membership for the ordered square `F21 * F21`. -/ +lemma opPi_FF_c2121_mem : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, + neg_mul, mul_neg, neg_neg, map_neg] + rw [opPi_F12_F12] + exact Submodule.smul_mem _ _ maxwellTerm_mem_span + +/-- Projector membership for the ordered derivative monomial `dd01 F01`. -/ +lemma opPi_DDF_c0101_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd01_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd01 F10`. -/ +lemma opPi_DDF_c0110_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F01`. -/ +lemma opPi_DDF_c1001_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [opPi_dd01_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F10`. -/ +lemma opPi_DDF_c1010_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd01 F23`. -/ +lemma opPi_DDF_c0123_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd01_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd01 F32`. -/ +lemma opPi_DDF_c0132_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F23`. -/ +lemma opPi_DDF_c1023_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [opPi_dd01_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd10 F32`. -/ +lemma opPi_DDF_c1032_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] + rw [map_neg, opPi_dd01_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F02`. -/ +lemma opPi_DDF_c0202_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd02_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F20`. -/ +lemma opPi_DDF_c0220_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F02`. -/ +lemma opPi_DDF_c2002_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [opPi_dd02_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F20`. -/ +lemma opPi_DDF_c2020_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F13`. -/ +lemma opPi_DDF_c0213_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd02_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd02 F31`. -/ +lemma opPi_DDF_c0231_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F13`. -/ +lemma opPi_DDF_c2013_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [opPi_dd02_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd20 F31`. -/ +lemma opPi_DDF_c2031_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd02_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F03`. -/ +lemma opPi_DDF_c0303_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd03_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F30`. -/ +lemma opPi_DDF_c0330_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F03`. -/ +lemma opPi_DDF_c3003_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [opPi_dd03_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F30`. -/ +lemma opPi_DDF_c3030_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F12`. -/ +lemma opPi_DDF_c0312_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd03_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd03 F21`. -/ +lemma opPi_DDF_c0321_mem : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F12`. -/ +lemma opPi_DDF_c3012_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [opPi_dd03_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd30 F21`. -/ +lemma opPi_DDF_c3021_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] + rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd03_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F03`. -/ +lemma opPi_DDF_c1203_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd12_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F30`. -/ +lemma opPi_DDF_c1230_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F03`. -/ +lemma opPi_DDF_c2103_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inl 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [opPi_dd12_F03] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F30`. -/ +lemma opPi_DDF_c2130_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 2) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F03, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F12`. -/ +lemma opPi_DDF_c1212_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd12_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd12 F21`. -/ +lemma opPi_DDF_c1221_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F12`. -/ +lemma opPi_DDF_c2112_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [opPi_dd12_F12] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd21 F21`. -/ +lemma opPi_DDF_c2121_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 1) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] + rw [map_neg, opPi_dd12_F12, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F02`. -/ +lemma opPi_DDF_c1302_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd13_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F20`. -/ +lemma opPi_DDF_c1320_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F02`. -/ +lemma opPi_DDF_c3102_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inl 0) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [opPi_dd13_F02] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F20`. -/ +lemma opPi_DDF_c3120_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 1) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F02, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F13`. -/ +lemma opPi_DDF_c1313_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd13_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd13 F31`. -/ +lemma opPi_DDF_c1331_mem : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F13`. -/ +lemma opPi_DDF_c3113_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 0) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [opPi_dd13_F13] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd31 F31`. -/ +lemma opPi_DDF_c3131_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 2) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] + rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = + -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] + rw [map_neg, opPi_dd13_F13, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F01`. -/ +lemma opPi_DDF_c2301_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd23_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F10`. -/ +lemma opPi_DDF_c2310_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F01`. -/ +lemma opPi_DDF_c3201_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inl 0) (Sum.inr 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [opPi_dd23_F01] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F10`. -/ +lemma opPi_DDF_c3210_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 0) (Sum.inl 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F01, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F23`. -/ +lemma opPi_DDF_c2323_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [opPi_dd23_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd23 F32`. -/ +lemma opPi_DDF_c2332_mem : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F23`. -/ +lemma opPi_DDF_c3223_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 1) (Sum.inr 2)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [opPi_dd23_F23] + exact Submodule.zero_mem _ + +/-- Projector membership for the ordered derivative monomial `dd32 F32`. -/ +lemma opPi_DDF_c3232_mem : + opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 2) (Sum.inr 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] + rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = + -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from + fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] + rw [map_neg, opPi_dd23_F23, neg_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u000_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e000, map_smul, opPi_u0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[0,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u001_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e001, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u010_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e010, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u011_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e011, map_smul, opPi_u0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[1,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u100_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e100, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[1,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u101_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e101, map_smul, opPi_u1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[1,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u110_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e110, map_smul, opPi_u1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[1,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u111_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e111, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u200_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e200, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u201_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e201, map_smul, opPi_u2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[2,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u210_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e210, map_smul, opPi_u2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[2,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u211_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e211, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,0,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u300_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e300, map_smul, opPi_u3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[3,0,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u301_mem : + opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e301, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,0]` (u-family) lies in the span. -/ +lemma opPi_kA_u310_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e310, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,1]` (u-family) lies in the span. -/ +lemma opPi_kA_u311_mem : + opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_u_e311, map_smul, opPi_u3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) + +/-- Projected Klein average of `e[0,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar000_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e000, map_smul, opPi_ubar0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[0,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar001_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e001, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar010_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e010, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[0,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar011_mem : + opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e011, map_smul, opPi_ubar0] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[1,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar100_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e100, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[1,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar101_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e101, map_smul, opPi_ubar1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[1,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar110_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e110, map_smul, opPi_ubar1] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[1,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar111_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e111, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar200_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e200, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[2,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar201_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e201, map_smul, opPi_ubar2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[2,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar210_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e210, map_smul, opPi_ubar2] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[2,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar211_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e211, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,0,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar300_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e300, map_smul, opPi_ubar3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +/-- Projected Klein average of `e[3,0,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar301_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e301, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,0]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar310_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e310, map_zero] + exact Submodule.zero_mem _ + +/-- Projected Klein average of `e[3,1,1]` (ubar-family) lies in the span. -/ +lemma opPi_kA_ubar311_mem : + opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_ubar_e311, map_smul, opPi_ubar3] + exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) + +attribute [local irreducible] Dψ Dbarψ fieldStrengthDeriv + +set_option maxHeartbeats 16000000 in +set_option maxRecDepth 8192 in +/-- The projected Klein average of any product of two field strengths lies in + the span of the invariants. -/ +lemma opPi_kleinAvg_FF_mem (a b c d : Fin 1 ⊕ Fin 3) : + opPi (kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_fieldStrengthDeriv_nil_mul, map_smul] + rcases a with a | a <;> rcases b with b | b <;> rcases c with c | c <;> + rcases d with d | d <;> fin_cases a <;> fin_cases b <;> fin_cases c <;> + fin_cases d <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | (rw [fieldStrengthDeriv_self] + simp only [zero_mul, mul_zero, map_zero, smul_zero] + exact Submodule.zero_mem _) + | (refine Submodule.smul_mem _ _ ?_ + first + | exact opPi_FF_c0101_mem + | exact opPi_FF_c0110_mem + | exact opPi_FF_c1001_mem + | exact opPi_FF_c1010_mem + | exact opPi_FF_c0123_mem + | exact opPi_FF_c0132_mem + | exact opPi_FF_c1023_mem + | exact opPi_FF_c1032_mem + | exact opPi_FF_c2301_mem + | exact opPi_FF_c2310_mem + | exact opPi_FF_c3201_mem + | exact opPi_FF_c3210_mem + | exact opPi_FF_c2323_mem + | exact opPi_FF_c2332_mem + | exact opPi_FF_c3223_mem + | exact opPi_FF_c3232_mem + | exact opPi_FF_c0202_mem + | exact opPi_FF_c0220_mem + | exact opPi_FF_c2002_mem + | exact opPi_FF_c2020_mem + | exact opPi_FF_c0213_mem + | exact opPi_FF_c0231_mem + | exact opPi_FF_c2013_mem + | exact opPi_FF_c2031_mem + | exact opPi_FF_c1302_mem + | exact opPi_FF_c1320_mem + | exact opPi_FF_c3102_mem + | exact opPi_FF_c3120_mem + | exact opPi_FF_c1313_mem + | exact opPi_FF_c1331_mem + | exact opPi_FF_c3113_mem + | exact opPi_FF_c3131_mem + | exact opPi_FF_c0303_mem + | exact opPi_FF_c0330_mem + | exact opPi_FF_c3003_mem + | exact opPi_FF_c3030_mem + | exact opPi_FF_c0312_mem + | exact opPi_FF_c0321_mem + | exact opPi_FF_c3012_mem + | exact opPi_FF_c3021_mem + | exact opPi_FF_c1203_mem + | exact opPi_FF_c1230_mem + | exact opPi_FF_c2103_mem + | exact opPi_FF_c2130_mem + | exact opPi_FF_c1212_mem + | exact opPi_FF_c1221_mem + | exact opPi_FF_c2112_mem + | exact opPi_FF_c2121_mem) + | (norm_num [paritySignZ, paritySignY, paritySignX] + first + | done + | exact Submodule.zero_mem _) + +set_option maxHeartbeats 16000000 in +set_option maxRecDepth 8192 in +/-- The projected Klein average of any second-derivative field strength lies + in the span of the invariants. -/ +lemma opPi_kleinAvg_DDF_mem (r t a b : Fin 1 ⊕ Fin 3) : + opPi (kleinAvg (fieldStrengthDeriv {r, t} a b)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [kleinAvg_fieldStrengthDeriv_pair, map_smul] + rcases r with r | r <;> rcases t with t | t <;> rcases a with a | a <;> + rcases b with b | b <;> fin_cases r <;> fin_cases t <;> fin_cases a <;> + fin_cases b <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | (rw [fieldStrengthDeriv_self] + simp only [map_zero, smul_zero] + exact Submodule.zero_mem _) + | (refine Submodule.smul_mem _ _ ?_ + first + | exact opPi_DDF_c0101_mem + | exact opPi_DDF_c0110_mem + | exact opPi_DDF_c1001_mem + | exact opPi_DDF_c1010_mem + | exact opPi_DDF_c0123_mem + | exact opPi_DDF_c0132_mem + | exact opPi_DDF_c1023_mem + | exact opPi_DDF_c1032_mem + | exact opPi_DDF_c0202_mem + | exact opPi_DDF_c0220_mem + | exact opPi_DDF_c2002_mem + | exact opPi_DDF_c2020_mem + | exact opPi_DDF_c0213_mem + | exact opPi_DDF_c0231_mem + | exact opPi_DDF_c2013_mem + | exact opPi_DDF_c2031_mem + | exact opPi_DDF_c0303_mem + | exact opPi_DDF_c0330_mem + | exact opPi_DDF_c3003_mem + | exact opPi_DDF_c3030_mem + | exact opPi_DDF_c0312_mem + | exact opPi_DDF_c0321_mem + | exact opPi_DDF_c3012_mem + | exact opPi_DDF_c3021_mem + | exact opPi_DDF_c1203_mem + | exact opPi_DDF_c1230_mem + | exact opPi_DDF_c2103_mem + | exact opPi_DDF_c2130_mem + | exact opPi_DDF_c1212_mem + | exact opPi_DDF_c1221_mem + | exact opPi_DDF_c2112_mem + | exact opPi_DDF_c2121_mem + | exact opPi_DDF_c1302_mem + | exact opPi_DDF_c1320_mem + | exact opPi_DDF_c3102_mem + | exact opPi_DDF_c3120_mem + | exact opPi_DDF_c1313_mem + | exact opPi_DDF_c1331_mem + | exact opPi_DDF_c3113_mem + | exact opPi_DDF_c3131_mem + | exact opPi_DDF_c2301_mem + | exact opPi_DDF_c2310_mem + | exact opPi_DDF_c3201_mem + | exact opPi_DDF_c3210_mem + | exact opPi_DDF_c2323_mem + | exact opPi_DDF_c2332_mem + | exact opPi_DDF_c3223_mem + | exact opPi_DDF_c3232_mem) + | (norm_num [paritySignZ, paritySignY, paritySignX] + first + | done + | exact Submodule.zero_mem _) + +set_option maxRecDepth 8192 in +/-- The projected Klein average of any `ψ̄ (Dψ)` pair lies in the span. -/ +lemma opPi_kleinAvg_FM1_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dbarψ [] α * Dψ [μ] β)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | exact opPi_kA_u000_mem + | exact opPi_kA_u001_mem + | exact opPi_kA_u010_mem + | exact opPi_kA_u011_mem + | exact opPi_kA_u100_mem + | exact opPi_kA_u101_mem + | exact opPi_kA_u110_mem + | exact opPi_kA_u111_mem + | exact opPi_kA_u200_mem + | exact opPi_kA_u201_mem + | exact opPi_kA_u210_mem + | exact opPi_kA_u211_mem + | exact opPi_kA_u300_mem + | exact opPi_kA_u301_mem + | exact opPi_kA_u310_mem + | exact opPi_kA_u311_mem + +set_option maxRecDepth 8192 in +/-- The projected Klein average of any `(D̄ψ̄) ψ` pair lies in the span. -/ +lemma opPi_kleinAvg_FM2_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dbarψ [μ] α * Dψ [] β)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> + (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> + first + | exact opPi_kA_ubar000_mem + | exact opPi_kA_ubar001_mem + | exact opPi_kA_ubar010_mem + | exact opPi_kA_ubar011_mem + | exact opPi_kA_ubar100_mem + | exact opPi_kA_ubar101_mem + | exact opPi_kA_ubar110_mem + | exact opPi_kA_ubar111_mem + | exact opPi_kA_ubar200_mem + | exact opPi_kA_ubar201_mem + | exact opPi_kA_ubar210_mem + | exact opPi_kA_ubar211_mem + | exact opPi_kA_ubar300_mem + | exact opPi_kA_ubar301_mem + | exact opPi_kA_ubar310_mem + | exact opPi_kA_ubar311_mem + +/-- The reversed pair `(Dψ) ψ̄`, via anticommutation. -/ +lemma opPi_kleinAvg_FM1r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dψ [μ] β * Dbarψ [] α)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] + exact neg_mem (opPi_kleinAvg_FM1_mem μ α β) + +/-- The reversed pair `ψ (D̄ψ̄)`, via anticommutation. -/ +lemma opPi_kleinAvg_FM2r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + opPi (kleinAvg (Dψ [] α * Dbarψ [μ] β)) ∈ + Submodule.span ℂ massDimFourInvariants := by + rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] + exact neg_mem (opPi_kleinAvg_FM2_mem μ β α) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean new file mode 100644 index 000000000..5dd25893f --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean @@ -0,0 +1,500 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.Sectors +/-! +# The invariants in monomial form + +The Lorentz transformation law of the second-derivative field strength, the +(anti)commutation rules for the covariant factors, the parametric boosts along +the three coordinate axes, and the four renormalizable invariants written out +in the monomial basis. These are the inputs to the weight-eight analysis. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups +/-! + +### Commutation and anticommutation of the covariant factors + +-/ + +/-- The embedded field-strength derivatives commute: they live in the + commutative bosonic factor of the jet algebra. -/ +lemma fieldStrengthDeriv_mul_comm (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν ρ τ : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' ρ τ = + fieldStrengthDeriv s' ρ τ * fieldStrengthDeriv s μ ν := by + rw [fieldStrengthDeriv, fieldStrengthDeriv, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, + mul_comm (BBoson.JetAlgebra.fieldStrengthDeriv s μ ν)] + +set_option maxHeartbeats 16000000 in +/-- The embedded lepton-linear and conjugate-linear elements anticommute: + both are odd elements of the exterior factor of the jet algebra. -/ +lemma leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm (x : LeptonLinear) + (y : ConjLeptonLinear) : + leptonLinearIncl x * conjLeptonLinearIncl y = + -(conjLeptonLinearIncl y * leptonLinearIncl x) := by + have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z + have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hι : ∀ (a : LeptonComponent) (b : ConjLeptonComponent), + leptonComponentIncl a * conjLeptonComponentIncl b = + -(conjLeptonComponentIncl b * leptonComponentIncl a) := fun a b => by + rw [leptonComponentIncl_apply, conjLeptonComponentIncl_apply] + exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, neg_zero] + | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] + | tmul p a => + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, hz₂, hz₁, neg_zero] + | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] + | tmul q b => + rw [leptonLinearIncl_tmul, conjLeptonLinearIncl_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + hι a b, mul_comm q p, TensorProduct.tmul_neg] + +/-- The covariant lepton derivatives anticommute with the conjugate covariant + derivatives. -/ +lemma Dψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dψ l α * Dbarψ l' β = -(Dbarψ l' β * Dψ l α) := by + rw [Dψ_eq_leptonLinearIncl, Dbarψ_eq_conjLeptonLinearIncl, + leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm] + +set_option maxHeartbeats 16000000 in +/-- Two embedded lepton-linear elements anticommute. -/ +lemma leptonLinearIncl_mul_leptonLinearIncl_anticomm (x y : LeptonLinear) : + leptonLinearIncl x * leptonLinearIncl y = + -(leptonLinearIncl y * leptonLinearIncl x) := by + have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z + have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hι : ∀ a b : LeptonComponent, + leptonComponentIncl a * leptonComponentIncl b = + -(leptonComponentIncl b * leptonComponentIncl a) := fun a b => by + rw [leptonComponentIncl_apply, leptonComponentIncl_apply] + exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, hz₁, hz₂, neg_zero] + | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] + | tmul p a => + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, hz₂, hz₁, neg_zero] + | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] + | tmul q b => + rw [leptonLinearIncl_tmul, leptonLinearIncl_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + hι a b, mul_comm q p, TensorProduct.tmul_neg] + +/-- Two covariant lepton derivatives anticommute. -/ +lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dψ l α * Dψ l' β = -(Dψ l' β * Dψ l α) := by + rw [Dψ_eq_leptonLinearIncl, Dψ_eq_leptonLinearIncl, + leptonLinearIncl_mul_leptonLinearIncl_anticomm] + +/-! + +### Parametric boosts along the three axes + +The one-parameter families of boosts `diag(t, t⁻¹)` (along `z`) and their +conjugates along `x` and `y`, with symbolic Lorentz matrices in `t`. + +-/ + +/-- The lift `diag(t, t⁻¹)` of the boost along the `z`-axis with rapidity + `2 log t`. -/ +noncomputable def boostZel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![(t : ℂ), 0; 0, (t : ℂ)⁻¹], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + simp [mul_inv_cancel₀ htc]⟩ + +/-- The lift of the boost along the `x`-axis with rapidity `2 log t`. -/ +noncomputable def boostXel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, ((t : ℂ) - (t : ℂ)⁻¹)/2; + ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + field_simp + ring⟩ + +/-- The lift of the boost along the `y`-axis with rapidity `2 log t`. -/ +noncomputable def boostYel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; + Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have h2 : -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) = + ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + have hI : -Complex.I * Complex.I = 1 := by + rw [neg_mul, Complex.I_mul_I, neg_neg] + calc -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) + = (-Complex.I * Complex.I) * + (((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2)) := by + ring + _ = ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + rw [hI, one_mul] + rw [Matrix.det_fin_two_of, h2] + field_simp + ring⟩ + +/-- The Lorentz matrix of `boostZel t`: `ch = (t² + t⁻²)/2` on the time-time + and `zz` entries, `-sh = -(t² - t⁻²)/2` on the mixed entries. -/ +noncomputable def boostMatZ (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 2 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 2, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => (t^2 + (t⁻¹)^2)/2 + | _, _ => 0 + +/-- The Lorentz matrix of `boostXel t`. -/ +noncomputable def boostMatX (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 0 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => (t^2 + (t⁻¹)^2)/2 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 1 + | _, _ => 0 + +/-- The Lorentz matrix of `boostYel t`. -/ +noncomputable def boostMatY (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 1 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 1, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => (t^2 + (t⁻¹)^2)/2 + | Sum.inr 2, Sum.inr 2 => 1 + | _, _ => 0 + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `z`-boost. -/ +lemma toLorentzGroup_boostZel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostZel t ht)).1 a b = boostMatZ t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostZel, boostMatZ, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `x`-boost. -/ +lemma toLorentzGroup_boostXel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostXel t ht)).1 a b = boostMatX t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostXel, boostMatX, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `y`-boost. -/ +lemma toLorentzGroup_boostYel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostYel t ht)).1 a b = boostMatY t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostYel, boostMatY, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +/-- The inverse of the parametric `z`-boost is the boost at the inverse + parameter. -/ +lemma boostZel_inv (t : ℝ) (ht : t ≠ 0) : + (boostZel t ht)⁻¹ = boostZel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + simp [boostZel, Complex.ofReal_inv, inv_inv] + +/-- The inverse of the parametric `x`-boost is the boost at the inverse + parameter. -/ +lemma boostXel_inv (t : ℝ) (ht : t ≠ 0) : + (boostXel t ht)⁻¹ = boostXel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + · simp [boostXel, Complex.ofReal_inv, inv_inv] + try ring + +/-- The inverse of the parametric `y`-boost is the boost at the inverse + parameter. -/ +lemma boostYel_inv (t : ℝ) (ht : t ≠ 0) : + (boostYel t ht)⁻¹ = boostYel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + · simp [boostYel, Complex.ofReal_inv, inv_inv] + try ring + +/-- The inverse of the parametric `z`-boost, entrywise, with real entries. -/ +lemma boostZel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostZel t ht)⁻¹ : SL(2,ℂ)).1 = + !![(((t⁻¹ : ℝ)) : ℂ), 0; 0, ((t : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostZel] + +/-- The inverse of the parametric `x`-boost, entrywise. -/ +lemma boostXel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostXel t ht)⁻¹ : SL(2,ℂ)).1 = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, -(((t : ℂ) - (t : ℂ)⁻¹)/2); + -(((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostXel] + +/-- The inverse of the parametric `y`-boost, entrywise. -/ +lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostYel t ht)⁻¹ : SL(2,ℂ)).1 = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; + -(Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring + +/-- The Lorentz matrix of the inverse `z`-boost: the boost matrix at the + inverse parameter. -/ +lemma toLorentzGroup_boostZel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostZel t ht)⁻¹).1 a b = boostMatZ t⁻¹ a b := by + rw [boostZel_inv, toLorentzGroup_boostZel] + +/-- The Lorentz matrix of the inverse `x`-boost. -/ +lemma toLorentzGroup_boostXel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostXel t ht)⁻¹).1 a b = boostMatX t⁻¹ a b := by + rw [boostXel_inv, toLorentzGroup_boostXel] + +/-- The Lorentz matrix of the inverse `y`-boost. -/ +lemma toLorentzGroup_boostYel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostYel t ht)⁻¹).1 a b = boostMatY t⁻¹ a b := by + rw [boostYel_inv, toLorentzGroup_boostYel] + +/-! + +### The four invariants in monomial form + +-/ + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Maxwell term as an explicit combination of the six independent + field-strength squares. -/ +lemma maxwellTerm_eq : maxwellTerm = + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z + have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z + have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind + have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind + rw [maxwellTerm] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + minkowskiMatrix.inl_0_inl_0, minkowskiMatrix.inr_i_inr_i, + fieldStrengthDeriv_self, hz₁, hz₂, smul_zero, add_zero, zero_add] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + hnm, hmn, neg_neg] + push_cast + module + +set_option maxHeartbeats 8000000 in +set_option linter.unusedSimpArgs false in +/-- The theta term as an explicit combination of the three pair-partition + products of field strengths. -/ +lemma thetaTerm_eq : thetaTerm = + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind + have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind + rw [thetaTerm] + conv_lhs => + enter [2, p] + rw [show (1 : Fin 4) = (0 : Fin 3).succ from rfl, + show (2 : Fin 4) = (1 : Fin 3).succ from rfl, + show (3 : Fin 4) = (2 : Fin 3).succ from rfl] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i, 2, j] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i, 2, j, 2, k] + rw [Fintype.sum_subsingleton _ (1 : Equiv.Perm (Fin 1))] + simp only [Equiv.coe_toEmbedding, Fin.sum_univ_four, Fin.sum_univ_three, + Fin.sum_univ_two, + show ((1 : Fin 3)) = (0 : Fin 2).succ from rfl, + show ((2 : Fin 3)) = (1 : Fin 2).succ from rfl, + Equiv.Perm.decomposeFin_symm_of_one, + Equiv.Perm.decomposeFin.symm_sign, + Equiv.Perm.decomposeFin_symm_apply_zero, + Equiv.Perm.decomposeFin_symm_apply_one, + Equiv.Perm.decomposeFin_symm_apply_succ] + simp only [show ((0 : Fin 2).succ) = (1 : Fin 3) from rfl, + show ((1 : Fin 2).succ) = (2 : Fin 3) from rfl, + show ((0 : Fin 3).succ) = (1 : Fin 4) from rfl, + show ((1 : Fin 3).succ) = (2 : Fin 4) from rfl, + show ((2 : Fin 3).succ) = (3 : Fin 4) from rfl, + Equiv.swap_self, Equiv.Perm.sign_refl, Equiv.refl_apply, Equiv.Perm.sign_one, + Equiv.swap_apply_left, Equiv.swap_apply_right, Equiv.swap_apply_of_ne_of_ne, + Equiv.Perm.sign_swap', Fin.reduceEq, reduceIte, ne_eq, not_false_iff, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 0) = Sum.inl 0 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 1) = Sum.inr 0 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 2) = Sum.inr 1 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 3) = Sum.inr 2 from rfl, + Units.val_one, Units.val_neg, one_smul, neg_smul, one_mul, mul_one] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + hnm, hmn, neg_neg] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _] + module + +set_option maxHeartbeats 2000000 in +set_option linter.unusedSimpArgs false in +/-- The fermion kinetic term as an explicit combination of the eight + `ψ̄ (D ψ)` monomials. -/ +lemma fermionKineticTerm_eq : fermionKineticTerm = + Complex.I • ((Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - Complex.I • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) := by + rw [fermionKineticTerm] + congr 1 + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + Fin.sum_univ_two] + norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.transpose_apply, Matrix.one_apply] + module + +set_option maxHeartbeats 2000000 in +set_option linter.unusedSimpArgs false in +/-- The conjugate fermion kinetic term as an explicit combination of the eight + `(D̄ ψ̄) ψ` monomials. -/ +lemma fermionKineticTermBar_eq : fermionKineticTermBar = + (-Complex.I) • ((Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - Complex.I • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) := by + rw [fermionKineticTermBar] + congr 1 + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + Fin.sum_univ_two] + norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.transpose_apply, Matrix.one_apply] + module +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean new file mode 100644 index 000000000..15fd82f1d --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean @@ -0,0 +1,312 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.ProjectorsDerivative +/-! +# Values of the projector and of the Klein average + +The values of `opPi` on the weight-eight monomials, the entries of the Lorentz +matrices of the parity rotations, and the values of the Klein average +`kleinAvg` on the weight-eight monomials. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F01_F01`. -/ +lemma opPi_F01_F01 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF0 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F01_F23`. -/ +lemma opPi_F01_F23 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (1/24 : ℂ) • thetaTerm := by + rw [opPi_apply, + projFF1 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F02_F02`. -/ +lemma opPi_F02_F02 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF2 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F02_F13`. -/ +lemma opPi_F02_F13 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (-(1/24) : ℂ) • thetaTerm := by + rw [opPi_apply, + projFF3 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F03_F03`. -/ +lemma opPi_F03_F03 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF4 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F03_F12`. -/ +lemma opPi_F03_F12 : + opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (1/24 : ℂ) • thetaTerm := by + rw [opPi_apply, + projFF5 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F12_F12`. -/ +lemma opPi_F12_F12 : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (1/12 : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF6 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F13_F13`. -/ +lemma opPi_F13_F13 : + opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (1/12 : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF7 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the field-strength square `F23_F23`. -/ +lemma opPi_F23_F23 : + opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (1/12 : ℂ) • maxwellTerm := by + rw [opPi_apply, + projFF8 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 + opS_F13_F13 opS_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd01_F01`. -/ +lemma opPi_dd01_F01 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF0 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd01_F23`. -/ +lemma opPi_dd01_F23 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF1 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd02_F02`. -/ +lemma opPi_dd02_F02 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF2 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd02_F13`. -/ +lemma opPi_dd02_F13 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF3 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd03_F03`. -/ +lemma opPi_dd03_F03 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF4 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd03_F12`. -/ +lemma opPi_dd03_F12 : + opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF5 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd12_F03`. -/ +lemma opPi_dd12_F03 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF6 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd12_F12`. -/ +lemma opPi_dd12_F12 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF7 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd13_F02`. -/ +lemma opPi_dd13_F02 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF8 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd13_F13`. -/ +lemma opPi_dd13_F13 : + opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF9 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd23_F01`. -/ +lemma opPi_dd23_F01 : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF10 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` annihilates the derivative monomial `dd23_F23`. -/ +lemma opPi_dd23_F23 : + opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [opPi_apply, + projDDF11 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 + opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u0`. -/ +lemma opPi_u0 : + opPi (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (-(Complex.I/4)) • fermionKineticTerm := by + rw [opPi_apply, + projFMu0 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u1`. -/ +lemma opPi_u1 : + opPi (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (Complex.I/4) • fermionKineticTerm := by + rw [opPi_apply, + projFMu1 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u2`. -/ +lemma opPi_u2 : + opPi (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (1/4 : ℂ) • fermionKineticTerm := by + rw [opPi_apply, + projFMu2 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `u3`. -/ +lemma opPi_u3 : + opPi (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (Complex.I/4) • fermionKineticTerm := by + rw [opPi_apply, + projFMu3 opS opS_u0 opS_u1 opS_u2 opS_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar0`. -/ +lemma opPi_ubar0 : + opPi (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (Complex.I/4) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar0 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar1`. -/ +lemma opPi_ubar1 : + opPi (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (-(Complex.I/4)) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar1 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar2`. -/ +lemma opPi_ubar2 : + opPi (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (-(1/4) : ℂ) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar2 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `opPi` on the σ-contracted fermion pair `ubar3`. -/ +lemma opPi_ubar3 : + opPi (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (-(Complex.I/4)) • fermionKineticTermBar := by + rw [opPi_apply, + projFMubar3 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, + ← fermionKineticTermBar_eq] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Projectors.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Projectors.lean new file mode 100644 index 000000000..b5d1234e2 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/Projectors.lean @@ -0,0 +1,539 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.SymmetrisedAverage +/-! +# The projector polynomial + +`opPi` is the polynomial in `opS` that annihilates every eigenvalue of `opS` +other than `1`; it therefore fixes the Lorentz-invariant vectors and projects +the weight-eight monomials onto the invariant subspace. The `projFF*`, +`projDDF*` and `projFMu*` lemmas evaluate that polynomial on each eigenvalue +pattern occurring in the weight-eight basis. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the FF block. -/ +lemma projFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + + (2 : ℂ) • v8) := by + have i2 : T (T v0) = + (1/2 : ℂ) • (v0) + + (1/36 : ℂ) • (v2) + + (1/36 : ℂ) • (v4) + + (-(2/9) : ℂ) • (v6) + + (-(2/9) : ℂ) • (v7) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v0)) = + (11/27 : ℂ) • (v0) + + (1/18 : ℂ) • (v2) + + (1/18 : ℂ) • (v4) + + (-(17/72) : ℂ) • (v6) + + (-(17/72) : ℂ) • (v7) + + (-(1/108) : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v0))) = + (227/648 : ℂ) • (v0) + + (101/1296 : ℂ) • (v2) + + (101/1296 : ℂ) • (v4) + + (-(19/81) : ℂ) • (v6) + + (-(19/81) : ℂ) • (v7) + + (-(2/81) : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v0)))) = + (101/324 : ℂ) • (v0) + + (185/1944 : ℂ) • (v2) + + (185/1944 : ℂ) • (v4) + + (-(1771/7776) : ℂ) • (v6) + + (-(1771/7776) : ℂ) • (v7) + + (-(55/1296) : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h0] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the FF block. -/ +lemma projFF1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by + have i2 : T (T v1) = + (1/2 : ℂ) • (v1) + + (-(1/4) : ℂ) • (v3) + + (1/4 : ℂ) • (v5) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v1)) = + (5/12 : ℂ) • (v1) + + (-(7/24) : ℂ) • (v3) + + (7/24 : ℂ) • (v5) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v1))) = + (3/8 : ℂ) • (v1) + + (-(5/16) : ℂ) • (v3) + + (5/16 : ℂ) • (v5) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v1)))) = + (17/48 : ℂ) • (v1) + + (-(31/96) : ℂ) • (v3) + + (31/96 : ℂ) • (v5) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h1] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the FF block. -/ +lemma projFF2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + + (2 : ℂ) • v8) := by + have i2 : T (T v2) = + (1/36 : ℂ) • (v0) + + (1/2 : ℂ) • (v2) + + (1/36 : ℂ) • (v4) + + (-(2/9) : ℂ) • (v6) + + (-(2/9) : ℂ) • (v8) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v2)) = + (1/18 : ℂ) • (v0) + + (11/27 : ℂ) • (v2) + + (1/18 : ℂ) • (v4) + + (-(17/72) : ℂ) • (v6) + + (-(1/108) : ℂ) • (v7) + + (-(17/72) : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v2))) = + (101/1296 : ℂ) • (v0) + + (227/648 : ℂ) • (v2) + + (101/1296 : ℂ) • (v4) + + (-(19/81) : ℂ) • (v6) + + (-(2/81) : ℂ) • (v7) + + (-(19/81) : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v2)))) = + (185/1944 : ℂ) • (v0) + + (101/324 : ℂ) • (v2) + + (185/1944 : ℂ) • (v4) + + (-(1771/7776) : ℂ) • (v6) + + (-(55/1296) : ℂ) • (v7) + + (-(1771/7776) : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h2] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the FF block. -/ +lemma projFF3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (-(1/24) : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by + have i2 : T (T v3) = + (-(1/4) : ℂ) • (v1) + + (1/2 : ℂ) • (v3) + + (-(1/4) : ℂ) • (v5) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v3)) = + (-(7/24) : ℂ) • (v1) + + (5/12 : ℂ) • (v3) + + (-(7/24) : ℂ) • (v5) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v3))) = + (-(5/16) : ℂ) • (v1) + + (3/8 : ℂ) • (v3) + + (-(5/16) : ℂ) • (v5) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v3)))) = + (-(31/96) : ℂ) • (v1) + + (17/48 : ℂ) • (v3) + + (-(31/96) : ℂ) • (v5) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h3] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 4 of the FF block. -/ +lemma projFF4 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) + + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) + + (324/5 : ℂ) • T (T (T (T (T v4)))) = + (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + + (2 : ℂ) • v8) := by + have i2 : T (T v4) = + (1/36 : ℂ) • (v0) + + (1/36 : ℂ) • (v2) + + (1/2 : ℂ) • (v4) + + (-(2/9) : ℂ) • (v7) + + (-(2/9) : ℂ) • (v8) := by + rw [h4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v4)) = + (1/18 : ℂ) • (v0) + + (1/18 : ℂ) • (v2) + + (11/27 : ℂ) • (v4) + + (-(1/108) : ℂ) • (v6) + + (-(17/72) : ℂ) • (v7) + + (-(17/72) : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v4))) = + (101/1296 : ℂ) • (v0) + + (101/1296 : ℂ) • (v2) + + (227/648 : ℂ) • (v4) + + (-(2/81) : ℂ) • (v6) + + (-(19/81) : ℂ) • (v7) + + (-(19/81) : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v4)))) = + (185/1944 : ℂ) • (v0) + + (185/1944 : ℂ) • (v2) + + (101/324 : ℂ) • (v4) + + (-(55/1296) : ℂ) • (v6) + + (-(1771/7776) : ℂ) • (v7) + + (-(1771/7776) : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h4] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 5 of the FF block. -/ +lemma projFF5 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) + + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) + + (324/5 : ℂ) • T (T (T (T (T v5)))) = + (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by + have i2 : T (T v5) = + (1/4 : ℂ) • (v1) + + (-(1/4) : ℂ) • (v3) + + (1/2 : ℂ) • (v5) := by + rw [h5] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v5)) = + (7/24 : ℂ) • (v1) + + (-(7/24) : ℂ) • (v3) + + (5/12 : ℂ) • (v5) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v5))) = + (5/16 : ℂ) • (v1) + + (-(5/16) : ℂ) • (v3) + + (3/8 : ℂ) • (v5) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v5)))) = + (31/96 : ℂ) • (v1) + + (-(31/96) : ℂ) • (v3) + + (17/48 : ℂ) • (v5) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h5] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 6 of the FF block. -/ +lemma projFF6 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) + + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) + + (324/5 : ℂ) • T (T (T (T (T v6)))) = + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : + ℂ) • v8) := by + have i2 : T (T v6) = + (-(2/9) : ℂ) • (v0) + + (-(2/9) : ℂ) • (v2) + + (1/2 : ℂ) • (v6) + + (1/36 : ℂ) • (v7) + + (1/36 : ℂ) • (v8) := by + rw [h6] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v6)) = + (-(17/72) : ℂ) • (v0) + + (-(17/72) : ℂ) • (v2) + + (-(1/108) : ℂ) • (v4) + + (11/27 : ℂ) • (v6) + + (1/18 : ℂ) • (v7) + + (1/18 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v6))) = + (-(19/81) : ℂ) • (v0) + + (-(19/81) : ℂ) • (v2) + + (-(2/81) : ℂ) • (v4) + + (227/648 : ℂ) • (v6) + + (101/1296 : ℂ) • (v7) + + (101/1296 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v6)))) = + (-(1771/7776) : ℂ) • (v0) + + (-(1771/7776) : ℂ) • (v2) + + (-(55/1296) : ℂ) • (v4) + + (101/324 : ℂ) • (v6) + + (185/1944 : ℂ) • (v7) + + (185/1944 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h6] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 7 of the FF block. -/ +lemma projFF7 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) + + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) + + (324/5 : ℂ) • T (T (T (T (T v7)))) = + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : + ℂ) • v8) := by + have i2 : T (T v7) = + (-(2/9) : ℂ) • (v0) + + (-(2/9) : ℂ) • (v4) + + (1/36 : ℂ) • (v6) + + (1/2 : ℂ) • (v7) + + (1/36 : ℂ) • (v8) := by + rw [h7] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v7)) = + (-(17/72) : ℂ) • (v0) + + (-(1/108) : ℂ) • (v2) + + (-(17/72) : ℂ) • (v4) + + (1/18 : ℂ) • (v6) + + (11/27 : ℂ) • (v7) + + (1/18 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v7))) = + (-(19/81) : ℂ) • (v0) + + (-(2/81) : ℂ) • (v2) + + (-(19/81) : ℂ) • (v4) + + (101/1296 : ℂ) • (v6) + + (227/648 : ℂ) • (v7) + + (101/1296 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v7)))) = + (-(1771/7776) : ℂ) • (v0) + + (-(55/1296) : ℂ) • (v2) + + (-(1771/7776) : ℂ) • (v4) + + (185/1944 : ℂ) • (v6) + + (101/324 : ℂ) • (v7) + + (185/1944 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h7] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 8 of the FF block. -/ +lemma projFF8 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} + (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) + (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) + (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) + (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) + (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) + + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) + + (324/5 : ℂ) • T (T (T (T (T v8)))) = + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : + ℂ) • v8) := by + have i2 : T (T v8) = + (-(2/9) : ℂ) • (v2) + + (-(2/9) : ℂ) • (v4) + + (1/36 : ℂ) • (v6) + + (1/36 : ℂ) • (v7) + + (1/2 : ℂ) • (v8) := by + rw [h8] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i3 : T (T (T v8)) = + (-(1/108) : ℂ) • (v0) + + (-(17/72) : ℂ) • (v2) + + (-(17/72) : ℂ) • (v4) + + (1/18 : ℂ) • (v6) + + (1/18 : ℂ) • (v7) + + (11/27 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i4 : T (T (T (T v8))) = + (-(2/81) : ℂ) • (v0) + + (-(19/81) : ℂ) • (v2) + + (-(19/81) : ℂ) • (v4) + + (101/1296 : ℂ) • (v6) + + (101/1296 : ℂ) • (v7) + + (227/648 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v8)))) = + (-(55/1296) : ℂ) • (v0) + + (-(1771/7776) : ℂ) • (v2) + + (-(1771/7776) : ℂ) • (v4) + + (185/1944 : ℂ) • (v6) + + (185/1944 : ℂ) • (v7) + + (101/324 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h8] + match_scalars <;> norm_num + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorsDerivative.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorsDerivative.lean new file mode 100644 index 000000000..50ce4d2da --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorsDerivative.lean @@ -0,0 +1,1115 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.Projectors +/-! +# The projector polynomial on the derivative and fermion patterns + +Evaluation of the projector polynomial `opPi` on the eigenvalue patterns of +the second-derivative field strengths (`projDDF*`) and of the fermion +bilinears (`projFMu*`, `projFMubar*`). +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the DDF block. -/ +lemma projDDF0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (0 : M) := by + have i2 : T (T v0) = + (1/6 : ℂ) • (v0) + + (-(1/36) : ℂ) • (v2) + + (-(1/36) : ℂ) • (v4) + + (1/6 : ℂ) • (v7) + + (1/6 : ℂ) • (v9) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v0)) = + (1/9 : ℂ) • (v0) + + (-(1/27) : ℂ) • (v2) + + (-(1/27) : ℂ) • (v4) + + (31/216 : ℂ) • (v7) + + (31/216 : ℂ) • (v9) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v0))) = + (55/648 : ℂ) • (v0) + + (-(47/1296) : ℂ) • (v2) + + (-(47/1296) : ℂ) • (v4) + + (13/108 : ℂ) • (v7) + + (13/108 : ℂ) • (v9) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v0)))) = + (133/1944 : ℂ) • (v0) + + (-(125/3888) : ℂ) • (v2) + + (-(125/3888) : ℂ) • (v4) + + (781/7776 : ℂ) • (v7) + + (781/7776 : ℂ) • (v9) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h0] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the DDF block. -/ +lemma projDDF1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (0 : M) := by + have i2 : T (T v1) = + (1/6 : ℂ) • (v1) + + (1/36 : ℂ) • (v3) + + (-(1/36) : ℂ) • (v5) + + (-(1/6) : ℂ) • (v6) + + (1/6 : ℂ) • (v8) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v1)) = + (1/9 : ℂ) • (v1) + + (1/27 : ℂ) • (v3) + + (-(1/27) : ℂ) • (v5) + + (-(31/216) : ℂ) • (v6) + + (31/216 : ℂ) • (v8) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v1))) = + (55/648 : ℂ) • (v1) + + (47/1296 : ℂ) • (v3) + + (-(47/1296) : ℂ) • (v5) + + (-(13/108) : ℂ) • (v6) + + (13/108 : ℂ) • (v8) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v1)))) = + (133/1944 : ℂ) • (v1) + + (125/3888 : ℂ) • (v3) + + (-(125/3888) : ℂ) • (v5) + + (-(781/7776) : ℂ) • (v6) + + (781/7776 : ℂ) • (v8) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h1] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the DDF block. -/ +lemma projDDF2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (0 : M) := by + have i2 : T (T v2) = + (-(1/36) : ℂ) • (v0) + + (1/6 : ℂ) • (v2) + + (-(1/36) : ℂ) • (v4) + + (-(1/6) : ℂ) • (v7) + + (1/6 : ℂ) • (v11) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v2)) = + (-(1/27) : ℂ) • (v0) + + (1/9 : ℂ) • (v2) + + (-(1/27) : ℂ) • (v4) + + (-(31/216) : ℂ) • (v7) + + (31/216 : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v2))) = + (-(47/1296) : ℂ) • (v0) + + (55/648 : ℂ) • (v2) + + (-(47/1296) : ℂ) • (v4) + + (-(13/108) : ℂ) • (v7) + + (13/108 : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v2)))) = + (-(125/3888) : ℂ) • (v0) + + (133/1944 : ℂ) • (v2) + + (-(125/3888) : ℂ) • (v4) + + (-(781/7776) : ℂ) • (v7) + + (781/7776 : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h2] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the DDF block. -/ +lemma projDDF3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (0 : M) := by + have i2 : T (T v3) = + (1/36 : ℂ) • (v1) + + (1/6 : ℂ) • (v3) + + (1/36 : ℂ) • (v5) + + (-(1/6) : ℂ) • (v6) + + (1/6 : ℂ) • (v10) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v3)) = + (1/27 : ℂ) • (v1) + + (1/9 : ℂ) • (v3) + + (1/27 : ℂ) • (v5) + + (-(31/216) : ℂ) • (v6) + + (31/216 : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v3))) = + (47/1296 : ℂ) • (v1) + + (55/648 : ℂ) • (v3) + + (47/1296 : ℂ) • (v5) + + (-(13/108) : ℂ) • (v6) + + (13/108 : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v3)))) = + (125/3888 : ℂ) • (v1) + + (133/1944 : ℂ) • (v3) + + (125/3888 : ℂ) • (v5) + + (-(781/7776) : ℂ) • (v6) + + (781/7776 : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h3] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 4 of the DDF block. -/ +lemma projDDF4 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) + + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) + + (324/5 : ℂ) • T (T (T (T (T v4)))) = + (0 : M) := by + have i2 : T (T v4) = + (-(1/36) : ℂ) • (v0) + + (-(1/36) : ℂ) • (v2) + + (1/6 : ℂ) • (v4) + + (-(1/6) : ℂ) • (v9) + + (-(1/6) : ℂ) • (v11) := by + rw [h4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v4)) = + (-(1/27) : ℂ) • (v0) + + (-(1/27) : ℂ) • (v2) + + (1/9 : ℂ) • (v4) + + (-(31/216) : ℂ) • (v9) + + (-(31/216) : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v4))) = + (-(47/1296) : ℂ) • (v0) + + (-(47/1296) : ℂ) • (v2) + + (55/648 : ℂ) • (v4) + + (-(13/108) : ℂ) • (v9) + + (-(13/108) : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v4)))) = + (-(125/3888) : ℂ) • (v0) + + (-(125/3888) : ℂ) • (v2) + + (133/1944 : ℂ) • (v4) + + (-(781/7776) : ℂ) • (v9) + + (-(781/7776) : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h4] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 5 of the DDF block. -/ +lemma projDDF5 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) + + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) + + (324/5 : ℂ) • T (T (T (T (T v5)))) = + (0 : M) := by + have i2 : T (T v5) = + (-(1/36) : ℂ) • (v1) + + (1/36 : ℂ) • (v3) + + (1/6 : ℂ) • (v5) + + (-(1/6) : ℂ) • (v8) + + (1/6 : ℂ) • (v10) := by + rw [h5] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v5)) = + (-(1/27) : ℂ) • (v1) + + (1/27 : ℂ) • (v3) + + (1/9 : ℂ) • (v5) + + (-(31/216) : ℂ) • (v8) + + (31/216 : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v5))) = + (-(47/1296) : ℂ) • (v1) + + (47/1296 : ℂ) • (v3) + + (55/648 : ℂ) • (v5) + + (-(13/108) : ℂ) • (v8) + + (13/108 : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v5)))) = + (-(125/3888) : ℂ) • (v1) + + (125/3888 : ℂ) • (v3) + + (133/1944 : ℂ) • (v5) + + (-(781/7776) : ℂ) • (v8) + + (781/7776 : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h5] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 6 of the DDF block. -/ +lemma projDDF6 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) + + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) + + (324/5 : ℂ) • T (T (T (T (T v6)))) = + (0 : M) := by + have i2 : T (T v6) = + (-(1/6) : ℂ) • (v1) + + (-(1/6) : ℂ) • (v3) + + (1/2 : ℂ) • (v6) + + (-(1/36) : ℂ) • (v8) + + (-(1/36) : ℂ) • (v10) := by + rw [h6] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v6)) = + (-(31/216) : ℂ) • (v1) + + (-(31/216) : ℂ) • (v3) + + (7/18 : ℂ) • (v6) + + (-(5/108) : ℂ) • (v8) + + (-(5/108) : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v6))) = + (-(13/108) : ℂ) • (v1) + + (-(13/108) : ℂ) • (v3) + + (199/648 : ℂ) • (v6) + + (-(71/1296) : ℂ) • (v8) + + (-(71/1296) : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v6)))) = + (-(781/7776) : ℂ) • (v1) + + (-(781/7776) : ℂ) • (v3) + + (119/486 : ℂ) • (v6) + + (-(55/972) : ℂ) • (v8) + + (-(55/972) : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h6] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 7 of the DDF block. -/ +lemma projDDF7 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) + + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) + + (324/5 : ℂ) • T (T (T (T (T v7)))) = + (0 : M) := by + have i2 : T (T v7) = + (1/6 : ℂ) • (v0) + + (-(1/6) : ℂ) • (v2) + + (1/2 : ℂ) • (v7) + + (1/36 : ℂ) • (v9) + + (-(1/36) : ℂ) • (v11) := by + rw [h7] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v7)) = + (31/216 : ℂ) • (v0) + + (-(31/216) : ℂ) • (v2) + + (7/18 : ℂ) • (v7) + + (5/108 : ℂ) • (v9) + + (-(5/108) : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v7))) = + (13/108 : ℂ) • (v0) + + (-(13/108) : ℂ) • (v2) + + (199/648 : ℂ) • (v7) + + (71/1296 : ℂ) • (v9) + + (-(71/1296) : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v7)))) = + (781/7776 : ℂ) • (v0) + + (-(781/7776) : ℂ) • (v2) + + (119/486 : ℂ) • (v7) + + (55/972 : ℂ) • (v9) + + (-(55/972) : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h7] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 8 of the DDF block. -/ +lemma projDDF8 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) + + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) + + (324/5 : ℂ) • T (T (T (T (T v8)))) = + (0 : M) := by + have i2 : T (T v8) = + (1/6 : ℂ) • (v1) + + (-(1/6) : ℂ) • (v5) + + (-(1/36) : ℂ) • (v6) + + (1/2 : ℂ) • (v8) + + (-(1/36) : ℂ) • (v10) := by + rw [h8] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v8)) = + (31/216 : ℂ) • (v1) + + (-(31/216) : ℂ) • (v5) + + (-(5/108) : ℂ) • (v6) + + (7/18 : ℂ) • (v8) + + (-(5/108) : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v8))) = + (13/108 : ℂ) • (v1) + + (-(13/108) : ℂ) • (v5) + + (-(71/1296) : ℂ) • (v6) + + (199/648 : ℂ) • (v8) + + (-(71/1296) : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v8)))) = + (781/7776 : ℂ) • (v1) + + (-(781/7776) : ℂ) • (v5) + + (-(55/972) : ℂ) • (v6) + + (119/486 : ℂ) • (v8) + + (-(55/972) : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h8] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 9 of the DDF block. -/ +lemma projDDF9 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v9 + (137/10 : ℂ) • T v9 + (-(135/2) : ℂ) • T (T v9) + + (153 : ℂ) • T (T (T v9)) + (-162 : ℂ) • T (T (T (T v9))) + + (324/5 : ℂ) • T (T (T (T (T v9)))) = + (0 : M) := by + have i2 : T (T v9) = + (1/6 : ℂ) • (v0) + + (-(1/6) : ℂ) • (v4) + + (1/36 : ℂ) • (v7) + + (1/2 : ℂ) • (v9) + + (1/36 : ℂ) • (v11) := by + rw [h9] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v9)) = + (31/216 : ℂ) • (v0) + + (-(31/216) : ℂ) • (v4) + + (5/108 : ℂ) • (v7) + + (7/18 : ℂ) • (v9) + + (5/108 : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v9))) = + (13/108 : ℂ) • (v0) + + (-(13/108) : ℂ) • (v4) + + (71/1296 : ℂ) • (v7) + + (199/648 : ℂ) • (v9) + + (71/1296 : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v9)))) = + (781/7776 : ℂ) • (v0) + + (-(781/7776) : ℂ) • (v4) + + (55/972 : ℂ) • (v7) + + (119/486 : ℂ) • (v9) + + (55/972 : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h9] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 10 of the DDF block. -/ +lemma projDDF10 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v10 + (137/10 : ℂ) • T v10 + (-(135/2) : ℂ) • T (T v10) + + (153 : ℂ) • T (T (T v10)) + (-162 : ℂ) • T (T (T (T v10))) + + (324/5 : ℂ) • T (T (T (T (T v10)))) = + (0 : M) := by + have i2 : T (T v10) = + (1/6 : ℂ) • (v3) + + (1/6 : ℂ) • (v5) + + (-(1/36) : ℂ) • (v6) + + (-(1/36) : ℂ) • (v8) + + (1/2 : ℂ) • (v10) := by + rw [h10] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v10)) = + (31/216 : ℂ) • (v3) + + (31/216 : ℂ) • (v5) + + (-(5/108) : ℂ) • (v6) + + (-(5/108) : ℂ) • (v8) + + (7/18 : ℂ) • (v10) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v10))) = + (13/108 : ℂ) • (v3) + + (13/108 : ℂ) • (v5) + + (-(71/1296) : ℂ) • (v6) + + (-(71/1296) : ℂ) • (v8) + + (199/648 : ℂ) • (v10) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v10)))) = + (781/7776 : ℂ) • (v3) + + (781/7776 : ℂ) • (v5) + + (-(55/972) : ℂ) • (v6) + + (-(55/972) : ℂ) • (v8) + + (119/486 : ℂ) • (v10) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h10] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 11 of the DDF block. -/ +lemma projDDF11 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} + (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) + (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) + (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) + (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) + (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) + (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) + (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) + (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) + (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) + (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) + (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) + (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (-1 : ℂ) • v11 + (137/10 : ℂ) • T v11 + (-(135/2) : ℂ) • T (T v11) + + (153 : ℂ) • T (T (T v11)) + (-162 : ℂ) • T (T (T (T v11))) + + (324/5 : ℂ) • T (T (T (T (T v11)))) = + (0 : M) := by + have i2 : T (T v11) = + (1/6 : ℂ) • (v2) + + (-(1/6) : ℂ) • (v4) + + (-(1/36) : ℂ) • (v7) + + (1/36 : ℂ) • (v9) + + (1/2 : ℂ) • (v11) := by + rw [h11] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i3 : T (T (T v11)) = + (31/216 : ℂ) • (v2) + + (-(31/216) : ℂ) • (v4) + + (-(5/108) : ℂ) • (v7) + + (5/108 : ℂ) • (v9) + + (7/18 : ℂ) • (v11) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i4 : T (T (T (T v11))) = + (13/108 : ℂ) • (v2) + + (-(13/108) : ℂ) • (v4) + + (-(71/1296) : ℂ) • (v7) + + (71/1296 : ℂ) • (v9) + + (199/648 : ℂ) • (v11) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + have i5 : T (T (T (T (T v11)))) = + (781/7776 : ℂ) • (v2) + + (-(781/7776) : ℂ) • (v4) + + (-(55/972) : ℂ) • (v7) + + (55/972 : ℂ) • (v9) + + (119/486 : ℂ) • (v11) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] + match_scalars <;> norm_num + rw [i5, i4, i3, i2, h11] + match_scalars <;> norm_num + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the FMu block. -/ +lemma projFMu0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (-(Complex.I/4)) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v0) = + (1/3 : ℂ) • (v0) + + (-(2/9) : ℂ) • (v1) + + ((-(2/9) : ℂ) * Complex.I) • (v2) + + (-(2/9) : ℂ) • (v3) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v0)) = + (5/18 : ℂ) • (v0) + + (-(13/54) : ℂ) • (v1) + + ((-(13/54) : ℂ) * Complex.I) • (v2) + + (-(13/54) : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v0))) = + (7/27 : ℂ) • (v0) + + (-(20/81) : ℂ) • (v1) + + ((-(20/81) : ℂ) * Complex.I) • (v2) + + (-(20/81) : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v0)))) = + (41/162 : ℂ) • (v0) + + (-(121/486) : ℂ) • (v1) + + ((-(121/486) : ℂ) * Complex.I) • (v2) + + (-(121/486) : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h0] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the FMu block. -/ +lemma projFMu1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v1) = + (-(2/9) : ℂ) • (v0) + + (13/18 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (1/36 : ℂ) • (v3) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v1)) = + (-(13/54) : ℂ) • (v0) + + (23/36 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (13/216 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v1))) = + (-(20/81) : ℂ) • (v0) + + (371/648 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (13/144 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v1)))) = + (-(121/486) : ℂ) • (v0) + + (2015/3888 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (905/7776 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h1] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the FMu block. -/ +lemma projFMu2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (1/4 : ℂ) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v2) = + ((2/9 : ℂ) * Complex.I) • (v0) + + ((-(1/36) : ℂ) * Complex.I) • (v1) + + (13/18 : ℂ) • (v2) + + ((-(1/36) : ℂ) * Complex.I) • (v3) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v2)) = + ((13/54 : ℂ) * Complex.I) • (v0) + + ((-(13/216) : ℂ) * Complex.I) • (v1) + + (23/36 : ℂ) • (v2) + + ((-(13/216) : ℂ) * Complex.I) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v2))) = + ((20/81 : ℂ) * Complex.I) • (v0) + + ((-(13/144) : ℂ) * Complex.I) • (v1) + + (371/648 : ℂ) • (v2) + + ((-(13/144) : ℂ) * Complex.I) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v2)))) = + ((121/486 : ℂ) * Complex.I) • (v0) + + ((-(905/7776) : ℂ) * Complex.I) • (v1) + + (2015/3888 : ℂ) • (v2) + + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h2] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the FMu block. -/ +lemma projFMu3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v3) = + (-(2/9) : ℂ) • (v0) + + (1/36 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (13/18 : ℂ) • (v3) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v3)) = + (-(13/54) : ℂ) • (v0) + + (13/216 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (23/36 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v3))) = + (-(20/81) : ℂ) • (v0) + + (13/144 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (371/648 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v3)))) = + (-(121/486) : ℂ) • (v0) + + (905/7776 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (2015/3888 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 0 of the FMubar block. -/ +lemma projFMubar0 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + + (324/5 : ℂ) • T (T (T (T (T v0)))) = + (Complex.I/4) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v0) = + (1/3 : ℂ) • (v0) + + (-(2/9) : ℂ) • (v1) + + ((-(2/9) : ℂ) * Complex.I) • (v2) + + (-(2/9) : ℂ) • (v3) := by + rw [h0] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v0)) = + (5/18 : ℂ) • (v0) + + (-(13/54) : ℂ) • (v1) + + ((-(13/54) : ℂ) * Complex.I) • (v2) + + (-(13/54) : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v0))) = + (7/27 : ℂ) • (v0) + + (-(20/81) : ℂ) • (v1) + + ((-(20/81) : ℂ) * Complex.I) • (v2) + + (-(20/81) : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v0)))) = + (41/162 : ℂ) • (v0) + + (-(121/486) : ℂ) • (v1) + + ((-(121/486) : ℂ) * Complex.I) • (v2) + + (-(121/486) : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h0] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 1 of the FMubar block. -/ +lemma projFMubar1 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + + (324/5 : ℂ) • T (T (T (T (T v1)))) = + (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v1) = + (-(2/9) : ℂ) • (v0) + + (13/18 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (1/36 : ℂ) • (v3) := by + rw [h1] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v1)) = + (-(13/54) : ℂ) • (v0) + + (23/36 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (13/216 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v1))) = + (-(20/81) : ℂ) • (v0) + + (371/648 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (13/144 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v1)))) = + (-(121/486) : ℂ) • (v0) + + (2015/3888 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (905/7776 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h1] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 2 of the FMubar block. -/ +lemma projFMubar2 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + + (324/5 : ℂ) • T (T (T (T (T v2)))) = + (-(1/4) : ℂ) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v2) = + ((2/9 : ℂ) * Complex.I) • (v0) + + ((-(1/36) : ℂ) * Complex.I) • (v1) + + (13/18 : ℂ) • (v2) + + ((-(1/36) : ℂ) * Complex.I) • (v3) := by + rw [h2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v2)) = + ((13/54 : ℂ) * Complex.I) • (v0) + + ((-(13/216) : ℂ) * Complex.I) • (v1) + + (23/36 : ℂ) • (v2) + + ((-(13/216) : ℂ) * Complex.I) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v2))) = + ((20/81 : ℂ) * Complex.I) • (v0) + + ((-(13/144) : ℂ) * Complex.I) • (v1) + + (371/648 : ℂ) • (v2) + + ((-(13/144) : ℂ) * Complex.I) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v2)))) = + ((121/486 : ℂ) * Complex.I) • (v0) + + ((-(905/7776) : ℂ) * Complex.I) • (v1) + + (2015/3888 : ℂ) • (v2) + + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h2] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 2000000 in +/-- The abstract projector computation for column 3 of the FMubar block. -/ +lemma projFMubar3 {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) {v0 v1 v2 v3 : M} + (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) + (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) + (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) + (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : + (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + + (324/5 : ℂ) • T (T (T (T (T v3)))) = + (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by + have i2 : T (T v3) = + (-(2/9) : ℂ) • (v0) + + (1/36 : ℂ) • (v1) + + ((1/36 : ℂ) * Complex.I) • (v2) + + (13/18 : ℂ) • (v3) := by + rw [h3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i3 : T (T (T v3)) = + (-(13/54) : ℂ) • (v0) + + (13/216 : ℂ) • (v1) + + ((13/216 : ℂ) * Complex.I) • (v2) + + (23/36 : ℂ) • (v3) := by + rw [i2] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i4 : T (T (T (T v3))) = + (-(20/81) : ℂ) • (v0) + + (13/144 : ℂ) • (v1) + + ((13/144 : ℂ) * Complex.I) • (v2) + + (371/648 : ℂ) • (v3) := by + rw [i3] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + have i5 : T (T (T (T (T v3)))) = + (-(121/486) : ℂ) • (v0) + + (905/7776 : ℂ) • (v1) + + ((905/7776 : ℂ) * Complex.I) • (v2) + + (2015/3888 : ℂ) • (v3) := by + rw [i4] + simp only [map_add, map_smul, h0, h1, h2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + rw [i5, i4, i3, i2, h3] + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean new file mode 100644 index 000000000..60b821192 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean @@ -0,0 +1,894 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.Decomposition +/-! +# The neutral sectors of weight at most eight + +The charge-zero covariant monomials of weight four are the field strengths +`F_{μν}`, of weight six the derivatives `∂_ρ F_{μν}` and the fermion pairs +`ψ̄_α ψ_β`, and of weight eight the products `F F`, the second derivatives +`∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion pairs +(`chargeCovSpan_four_le`, `chargeCovSpan_six_le`, `chargeCovSpan_eight_le`). + +Averaging over the Klein four-group of parity rotations kills the weight-four +sector outright, and combining it with the trace-free kill operator `sixKill` +kills the weight-six sector. The file closes with the four invariants written +out in the monomial basis, which is what the weight-eight analysis consumes. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +## The Lorentz analysis of the neutral sectors + +TODO: the remaining sector lemmas. The charge-zero covariant monomials of +weight four are the field strengths `F_{μν}`, of weight six the derivatives +`∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β`, of weight eight the products +`F F`, the second derivatives `∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion +pairs. Lorentz invariance kills the weight-four and weight-six sectors and +reduces the weight-eight sector to the span of the Maxwell term, the theta +term, and the two fermion kinetic terms. + +-/ + +/-- Each invariant generator is a weight eigenvector of weight at least + three. -/ +lemma exists_weight_of_mem_invariantGenerators {g : JetAlgebra} + (hg : g ∈ invariantGenerators) : + ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c g = c ^ w • g := by + rcases hg with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact ⟨4 + 2 * Multiset.card p.1, by omega, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dψ c p.1 p.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + +/-- The product of a list of invariant generators is a weight eigenvector of + weight at least three times the length. -/ +lemma exists_weight_of_list_prod {l : List JetAlgebra} + (hl : ∀ g ∈ l, g ∈ invariantGenerators) : + ∃ w, 3 * l.length ≤ w ∧ + ∀ c : ℂ, massWeightScale c l.prod = c ^ w • l.prod := by + induction l with + | nil => + exact ⟨0, by simp, fun c => by + rw [List.prod_nil, pow_zero, one_smul] + exact (massWeightScale c).map_one⟩ + | cons g l ih => + obtain ⟨wg, hwg3, hwg⟩ := exists_weight_of_mem_invariantGenerators + (hl g List.mem_cons_self) + obtain ⟨wl, hwl3, hwl⟩ := ih fun x hx => hl x (List.mem_cons_of_mem g hx) + refine ⟨wg + wl, by simp only [List.length_cons]; omega, fun c => ?_⟩ + rw [List.prod_cons] + exact massWeightScale_mul_eigen hwg hwl c + +/-- The constant gauge character of a product of two lepton factors: charge + two. -/ +lemma rep_ofConstant_Dψ_mul_Dψ (g : GaugeGroupI) (l l' : List (Fin 1 ⊕ Fin 3)) + (α β : Fin 2) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dψ l α * Dψ l' β) = + ((g.2.2 : ℂ)) ^ (6 * (2 : ℤ)) • (Dψ l α * Dψ l' β) := by + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, + JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, + SubmonoidClass.coe_pow, smul_mul_smul_comm, ← pow_add, + show (6 * (2 : ℤ)) = ((12 : ℕ) : ℤ) from rfl, zpow_natCast] + +/-- The constant gauge character of a product of two conjugate lepton factors: + charge minus two. -/ +lemma rep_ofConstant_Dbarψ_mul_Dbarψ (g : GaugeGroupI) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dbarψ l α * Dbarψ l' β) = + ((g.2.2 : ℂ)) ^ (6 * (-2 : ℤ)) • (Dbarψ l α * Dbarψ l' β) := by + have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := + eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, + JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, + SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← pow_add, + hinv, inv_pow, show (6 + 6 : ℕ) = 12 from rfl, + show (6 * (-2 : ℤ)) = -((12 : ℕ) : ℤ) from rfl, _root_.zpow_neg, zpow_natCast] + +/-- The weight-four neutral sector: spanned by the embedded field strengths. -/ +lemma chargeCovSpan_four_le : + chargeCovSpan 4 0 ≤ Submodule.span ℂ + (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {} p.1 p.2) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, -⟩ + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', t⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 0 + · rw [Multiset.card_eq_zero.mp hcard] + exact Submodule.subset_span ⟨(p.2.1, p.2.2), rfl⟩ + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + rw [eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega)] + exact Submodule.zero_mem _ + +set_option maxHeartbeats 4000000 in +/-- The weight-six neutral sector: spanned by the first derivatives of the + field strength and the zero-derivative lepton pairs. -/ +lemma chargeCovSpan_six_le : + chargeCovSpan 6 0 ≤ Submodule.span ℂ + ((Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {p.1} p.2.1 p.2.2) ∪ + (Set.range fun p : Fin 2 × Fin 2 => Dbarψ [] p.1 * Dψ [] p.2) ∪ + (Set.range fun p : Fin 2 × Fin 2 => Dψ [] p.1 * Dbarψ [] p.2)) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, hy3⟩ + simp only [mul_zero, zpow_zero, one_smul] at hy3 + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 1 + · obtain ⟨ρ, hρ⟩ := Multiset.card_eq_one.mp hcard + rw [hρ] + exact Submodule.subset_span (Or.inl (Or.inl ⟨(ρ, p.2.1, p.2.2), rfl⟩)) + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with + (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> + dsimp only at hy2 hy3 ⊢ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) + (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 + · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] + exact Submodule.subset_span (Or.inr ⟨(p.2, q.2), rfl⟩) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 + · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] + exact Submodule.subset_span (Or.inl (Or.inr ⟨(p.2, q.2), rfl⟩)) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) + (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + rw [eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega)] + exact Submodule.zero_mem _ + +set_option maxHeartbeats 4000000 in +/-- The weight-eight neutral sector: spanned by the field-strength squares, the + second derivatives of the field strength, and the one-derivative lepton + pairs. -/ +lemma chargeCovSpan_eight_le : + chargeCovSpan 8 0 ≤ Submodule.span ℂ + ((Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × + (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {} p.1.1 p.1.2 * fieldStrengthDeriv {} p.2.1 p.2.2) ∪ + (Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × + (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {p.1.1, p.1.2} p.2.1 p.2.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dbarψ [] p.1.1 * Dψ [p.2] p.1.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dψ [p.2] p.1.2 * Dbarψ [] p.1.1) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dψ [] p.1.1 * Dbarψ [p.2] p.1.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dbarψ [p.2] p.1.2 * Dψ [] p.1.1)) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, hy3⟩ + simp only [mul_zero, zpow_zero, one_smul] at hy3 + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 2 + · obtain ⟨ρ, τ, hρτ⟩ := Multiset.card_eq_two.mp hcard + rw [hρτ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl + (Or.inr ⟨((ρ, τ), p.2.1, p.2.2), rfl⟩))))) + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with + (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> + dsimp only at hy2 hy3 ⊢ + · by_cases hcard : Multiset.card p.1 = 0 ∧ Multiset.card q.1 = 0 + · rw [Multiset.card_eq_zero.mp hcard.1, Multiset.card_eq_zero.mp hcard.2] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl + (Or.inl ⟨((p.2.1, p.2.2), q.2.1, q.2.2), rfl⟩))))) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) + (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 + rw [List.length_eq_zero_iff.mp hlen.1, hμ] + exact Submodule.subset_span (Or.inl (Or.inr ⟨((p.2, q.2), μ), rfl⟩)) + · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 + rw [List.length_eq_zero_iff.mp hlen'.2, hμ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inr + ⟨((q.2, p.2), μ), rfl⟩))) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 + rw [List.length_eq_zero_iff.mp hlen.1, hμ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inr + ⟨((p.2, q.2), μ), rfl⟩)))) + · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 + rw [List.length_eq_zero_iff.mp hlen'.2, hμ] + exact Submodule.subset_span (Or.inr ⟨((q.2, p.2), μ), rfl⟩) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) + (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · have h0 : (g :: g' :: g'' :: t).prod = 0 := by + obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + exact eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega) + exact Set.mem_of_eq_of_mem h0 (Submodule.zero_mem _) + +/-! + +### The parity rotations + +The three rotations by `π` about the coordinate axes lift to `SL(2,ℂ)` as +`i σ_k`; their Lorentz matrices are the diagonal sign matrices fixing the time +axis and the rotation axis and reversing the two others. Averaging over this +Klein four-group kills every tensor component with an odd index pattern; since +every antisymmetric index pair is odd under exactly two of the three parities, +the weight-four sector admits no invariant. + +-/ + +/-- The lift `diag(i, -i)` of the rotation by `π` about the `z`-axis. -/ +noncomputable def parityZ : SL(2,ℂ) := + ⟨!![Complex.I, 0; 0, -Complex.I], by + simp [Matrix.det_fin_two_of]⟩ + +/-- The lift `i σ1` of the rotation by `π` about the `x`-axis. -/ +noncomputable def parityX : SL(2,ℂ) := + ⟨!![0, Complex.I; Complex.I, 0], by + simp [Matrix.det_fin_two_of]⟩ + +/-- The lift `i σ2` of the rotation by `π` about the `y`-axis. -/ +noncomputable def parityY : SL(2,ℂ) := + ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ + +/-- The sign pattern of the rotation by `π` about the `z`-axis. -/ +def paritySignZ : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => -1 + | Sum.inr 1 => -1 + | Sum.inr 2 => 1 + +/-- The sign pattern of the rotation by `π` about the `x`-axis. -/ +def paritySignX : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => 1 + | Sum.inr 1 => -1 + | Sum.inr 2 => -1 + +/-- The sign pattern of the rotation by `π` about the `y`-axis. -/ +def paritySignY : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => -1 + | Sum.inr 1 => 1 + | Sum.inr 2 => -1 + +/-- The Lorentz matrix of the `z`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_parityZ (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup parityZ).1 a b = + if a = b then paritySignZ a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [parityZ, paritySignZ, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- The Lorentz matrix of the `x`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_parityX (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup parityX).1 a b = + if a = b then paritySignX a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [parityX, paritySignX, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- The Lorentz matrix of the `y`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_parityY (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup parityY).1 a b = + if a = b then paritySignY a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [parityY, paritySignY, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- Under a diagonal Lorentz transformation the field strength scales by the + product of the signs of its two indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {} μ ν) = + ((sgn μ * sgn ν : ℝ) : ℂ) • fieldStrengthDeriv {} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_nil] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] + +/-- The field strength vanishes on a repeated index. -/ +lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ μ = 0 := by + have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = + [JetGenerators.dB (s + {μ}) μ]ₐ - [JetGenerators.dB (s + {μ}) μ]ₐ := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, sub_self] + +set_option maxHeartbeats 2000000 in +/-- No Lorentz invariant of mass weight four: an invariant combination of the + field strengths `F_{μν}` vanishes, since every antisymmetric index pair is + odd under two of the three parity rotations. -/ +lemma eq_zero_of_mem_chargeCovSpan_four {y : JetAlgebra} + (hy : y ∈ chargeCovSpan 4 0) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by + obtain ⟨c, hc⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp + (chargeCovSpan_four_le hy) + have h4 : ((4 : ℂ)⁻¹ • (y + repLorentzGroup parityZ y + + repLorentzGroup parityY y + repLorentzGroup parityX y)) = y := by + rw [hinv, hinv, hinv] + module + rw [← h4, ← hc, map_sum, map_sum, map_sum] + simp only [map_smul, repLorentzGroup_diag_fieldStrengthDeriv + toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX] + rw [← Finset.sum_add_distrib, ← Finset.sum_add_distrib, + ← Finset.sum_add_distrib, Finset.smul_sum] + refine Finset.sum_eq_zero fun p _ => ?_ + rcases eq_or_ne p.1 p.2 with hp | hp + · rw [hp, fieldStrengthDeriv_self] + simp + · rw [smul_smul, smul_smul, smul_smul, ← add_smul, ← add_smul, ← add_smul, + smul_smul] + rw [show ((4 : ℂ)⁻¹ * (c p + c p * ((paritySignZ p.1 * paritySignZ p.2 : ℝ) : ℂ) + + c p * ((paritySignY p.1 * paritySignY p.2 : ℝ) : ℂ) + + c p * ((paritySignX p.1 * paritySignX p.2 : ℝ) : ℂ))) = 0 from by + rcases p with ⟨μ, ν⟩ + rcases μ with μ | μ <;> rcases ν with ν | ν <;> + first + | (exact absurd rfl (by simpa using hp)) + | (fin_cases μ <;> fin_cases ν <;> + simp_all [paritySignZ, paritySignY, paritySignX] <;> + norm_num [Complex.ext_iff] <;> ring)] + rw [zero_smul] + +/-! + +### The transformation law of the derivative field strength + +-/ + +/-- The transformation law of the embedded first-derivative field strength: + a three-index tensor, all indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_singleton (Λ : SL(2,ℂ)) + (ρ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {ρ} μ ν) = + ∑ r, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) : ℝ)) : ℂ) • + fieldStrengthDeriv {r} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + +/-- Under a diagonal Lorentz transformation the derivative field strength + scales by the product of the signs of its three indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv_singleton {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (ρ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {ρ} μ ν) = + ((sgn ρ * (sgn μ * sgn ν) : ℝ) : ℂ) • fieldStrengthDeriv {ρ} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_singleton] + rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun a _ => + Finset.sum_eq_zero fun b _ => by + rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ρ) h)] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM ρ ρ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] + +/-- Antisymmetry of the embedded field-strength derivatives in the two field + indices. -/ +lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s ν μ = - fieldStrengthDeriv s μ ν := by + have h : ∀ a b : Fin 1 ⊕ Fin 3, (fieldStrengthDeriv s a b : JetAlgebra) = + [JetGenerators.dB (s + {a}) b]ₐ - [JetGenerators.dB (s + {b}) a]ₐ := by + intro a b + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, h, neg_sub] + +/-- The canonical orientation of a mixed field-strength component: the time + index first. -/ +lemma fieldStrengthDeriv_inr_inl (s : Multiset (Fin 1 ⊕ Fin 3)) (i : Fin 3) + (j : Fin 1) : + fieldStrengthDeriv s (Sum.inr i) (Sum.inl j) = + - fieldStrengthDeriv s (Sum.inl j) (Sum.inr i) := + fieldStrengthDeriv_antisymm s (Sum.inl j) (Sum.inr i) + +/-! + +### The boosts along the `z`-axis + +Two diagonal boosts `diag(t, t⁻¹)` with `t = 2, 3`. Together with the Klein +four-group of parity rotations they suffice to kill the neutral weight-six +sector: the Klein average projects onto the twelve surviving field-strength +components and the diagonal fermion pairs, and a rational combination of the +two boosts (with weights summing to one) annihilates all of them. + +-/ + +/-- The lift `diag(2, 1/2)` of the boost along the `z`-axis with rapidity + `log 4`. -/ +noncomputable def boostA : SL(2,ℂ) := + ⟨!![2, 0; 0, 2⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ + +/-- The lift `diag(3, 1/3)` of the boost along the `z`-axis with rapidity + `log 9`. -/ +noncomputable def boostB : SL(2,ℂ) := + ⟨!![3, 0; 0, 3⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ + +/-- The Lorentz matrix of `boostA`. -/ +noncomputable def boostMatA : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => 17/8 + | Sum.inl _, Sum.inr 2 => -(15/8) + | Sum.inr 2, Sum.inl _ => -(15/8) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 17/8 + | _, _ => 0 + +/-- The Lorentz matrix of `boostB`. -/ +noncomputable def boostMatB : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => 41/9 + | Sum.inl _, Sum.inr 2 => -(40/9) + | Sum.inr 2, Sum.inl _ => -(40/9) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 41/9 + | _, _ => 0 + +set_option maxHeartbeats 2000000 in +/-- The Lorentz matrix of the first boost. -/ +lemma toLorentzGroup_boostA (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup boostA).1 a b = boostMatA a b := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostA, boostMatA, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try norm_num [Complex.ext_iff] + +set_option maxHeartbeats 2000000 in +/-- The Lorentz matrix of the second boost. -/ +lemma toLorentzGroup_boostB (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup boostB).1 a b = boostMatB a b := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostB, boostMatB, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try norm_num [Complex.ext_iff] + +/-- The inverse of the `z`-parity, entrywise. -/ +lemma parityZ_inv_coe : + (parityZ⁻¹ : SL(2,ℂ)).1 = !![-Complex.I, 0; 0, Complex.I] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [parityZ] + +/-- The inverse of the `y`-parity, entrywise. -/ +lemma parityY_inv_coe : + (parityY⁻¹ : SL(2,ℂ)).1 = !![0, -1; 1, 0] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [parityY] + +/-- The inverse of the `x`-parity, entrywise. -/ +lemma parityX_inv_coe : + (parityX⁻¹ : SL(2,ℂ)).1 = !![0, -Complex.I; -Complex.I, 0] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [parityX] + +/-- The inverse of the first boost, entrywise, with real entries. -/ +lemma boostA_inv_coe : + (boostA⁻¹ : SL(2,ℂ)).1 = !![((2⁻¹ : ℝ) : ℂ), 0; 0, ((2 : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostA] + +/-- The inverse of the second boost, entrywise, with real entries. -/ +lemma boostB_inv_coe : + (boostB⁻¹ : SL(2,ℂ)).1 = !![((3⁻¹ : ℝ) : ℂ), 0; 0, ((3 : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostB] + +/-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ +lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = + ∑ γ, ∑ δ, ((Λ⁻¹).1 α γ * star ((Λ⁻¹).1 β δ)) • + (Dbarψ [] γ * Dψ [] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] + simp only [hsm, hms, hsmul] + +/-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ +lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : + repLorentzGroup Λ (Dψ [] α * Dbarψ [] β) = + ∑ γ, ∑ δ, (star ((Λ⁻¹).1 α γ) * (Λ⁻¹).1 β δ) • + (Dψ [] γ * Dbarψ [] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] + simp only [hsm, hms, hsmul] + +/-! + +### The kill operator of the weight-six sector + +-/ + +/-- The averaging operator over the Klein four-group of parity rotations. -/ +noncomputable def kleinAvg : Module.End ℂ JetAlgebra := + (4 : ℂ)⁻¹ • (LinearMap.id + repLorentzGroup parityZ + + repLorentzGroup parityY + repLorentzGroup parityX) + +/-- The boost-weighted Klein average: an operator fixing every + Lorentz-invariant vector and annihilating the neutral weight-six sector. + The weights `-13/24, 8/3, -9/8` sum to one and are chosen so that + `w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}` + respectively, killing both eigendirections of the two boosts. -/ +noncomputable def sixKill : Module.End ℂ JetAlgebra := + ((-13/24 : ℂ) • LinearMap.id + (8/3 : ℂ) • repLorentzGroup boostA + + (-9/8 : ℂ) • repLorentzGroup boostB) ∘ₗ kleinAvg + +/-- The Klein average, termwise. -/ +lemma kleinAvg_apply (v : JetAlgebra) : + kleinAvg v = (4 : ℂ)⁻¹ • (v + repLorentzGroup parityZ v + + repLorentzGroup parityY v + repLorentzGroup parityX v) := by + simp only [kleinAvg, LinearMap.smul_apply, LinearMap.add_apply, + LinearMap.id_apply] + +/-- The kill operator, termwise. -/ +lemma sixKill_apply (v : JetAlgebra) : + sixKill v = (-13/24 : ℂ) • kleinAvg v + + (8/3 : ℂ) • repLorentzGroup boostA (kleinAvg v) + + (-9/8 : ℂ) • repLorentzGroup boostB (kleinAvg v) := by + simp only [sixKill, LinearMap.comp_apply, LinearMap.add_apply, + LinearMap.smul_apply, LinearMap.id_apply] + +set_option maxHeartbeats 8000000 in +/-- The kill operator annihilates every embedded derivative field strength: + the Klein average kills every component with an odd index pattern, and the + boost combination kills the twelve surviving components. -/ +lemma sixKill_fieldStrengthDeriv_singleton (ρ μ ν : Fin 1 ⊕ Fin 3) : + sixKill (fieldStrengthDeriv {ρ} μ ν) = 0 := by + rcases eq_or_ne μ ν with rfl | hμν + · rw [fieldStrengthDeriv_self] + exact map_zero _ + · have hK : kleinAvg (fieldStrengthDeriv {ρ} μ ν) = + (((1 + paritySignZ ρ * (paritySignZ μ * paritySignZ ν) + + paritySignY ρ * (paritySignY μ * paritySignY ν) + + paritySignX ρ * (paritySignX μ * paritySignX ν)) / 4 : ℝ) : ℂ) • + fieldStrengthDeriv {ρ} μ ν := by + rw [kleinAvg_apply, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityZ, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityY, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityX] + push_cast + module + rw [sixKill_apply, hK, map_smul, map_smul] + rcases ρ with ρ | ρ <;> rcases μ with μ | μ <;> rcases ν with ν | ν <;> + fin_cases ρ <;> fin_cases μ <;> fin_cases ν <;> + first + | (simp only [fieldStrengthDeriv_self, map_zero, smul_zero, add_zero]; done) + | (norm_num [paritySignZ, paritySignY, paritySignX]; done) + | (norm_num [paritySignZ, paritySignY, paritySignX] + rw [repLorentzGroup_fieldStrengthDeriv_singleton boostA, + repLorentzGroup_fieldStrengthDeriv_singleton boostB] + simp only [Fintype.sum_sum_type, Fin.sum_univ_three, Fin.sum_univ_one, + toLorentzGroup_boostA, toLorentzGroup_boostB] + norm_num [boostMatA, boostMatB, fieldStrengthDeriv_self, + fieldStrengthDeriv_inr_inl] + push_cast + module) + +set_option maxHeartbeats 4000000 in +/-- The kill operator annihilates every zero-derivative pair `ψ̄_α ψ_β`: the + Klein average kills the off-diagonal pairs and symmetrises the diagonal + ones, which the boost combination then kills. -/ +lemma sixKill_Dbarψ_mul_Dψ (α β : Fin 2) : + sixKill (Dbarψ [] α * Dψ [] β) = 0 := by + rw [sixKill_apply, kleinAvg_apply] + fin_cases α <;> fin_cases β <;> + · simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, map_add, map_smul, + map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, + Fin.mk_one, Matrix.of_apply, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, + star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, + Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, + neg_neg, + zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, + Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] + try push_cast + try module + +set_option maxHeartbeats 4000000 in +/-- The kill operator annihilates every zero-derivative pair `ψ_α ψ̄_β`. -/ +lemma sixKill_Dψ_mul_Dbarψ (α β : Fin 2) : + sixKill (Dψ [] α * Dbarψ [] β) = 0 := by + rw [sixKill_apply, kleinAvg_apply] + fin_cases α <;> fin_cases β <;> + · simp only [repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, map_add, map_smul, + map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, + boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, + Fin.mk_one, Matrix.of_apply, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, + star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, + Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, + neg_neg, + zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, + Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] + try push_cast + try module + +/-- No Lorentz invariant of mass weight six: an invariant combination of the + field-strength derivatives `∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β` + vanishes. -/ +lemma eq_zero_of_mem_chargeCovSpan_six {y : JetAlgebra} + (hy : y ∈ chargeCovSpan 6 0) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by + have h := chargeCovSpan_six_le hy + rw [Submodule.span_union, Submodule.span_union] at h + obtain ⟨u, hu, w, hw, hy'⟩ := Submodule.mem_sup.mp h + obtain ⟨u1, hu1, u2, hu2, hu'⟩ := Submodule.mem_sup.mp hu + obtain ⟨a, ha⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu1 + obtain ⟨d, hd⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu2 + obtain ⟨e, he⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw + have hKy : kleinAvg y = y := by + rw [kleinAvg_apply, hinv parityZ, hinv parityY, hinv parityX] + module + have hself : sixKill y = y := by + rw [sixKill_apply, hKy, hinv boostA, hinv boostB] + module + have hkill : sixKill y = 0 := by + rw [← hy', ← hu', ← ha, ← hd, ← he] + simp only [map_add, map_sum, map_smul, sixKill_fieldStrengthDeriv_singleton, + sixKill_Dbarψ_mul_Dψ, sixKill_Dψ_mul_Dbarψ, smul_zero, + Finset.sum_const_zero, add_zero] + exact hself.symm.trans hkill + +/-! + +### The transformation law of the second-derivative field strength + +-/ + +set_option maxHeartbeats 2000000 in +/-- The transformation law of the embedded second-derivative field strength: + a four-index tensor, all indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) + (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) = + ∑ r, ∑ s, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) : ℝ)) : ℂ) • + fieldStrengthDeriv {r, s} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + module +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean new file mode 100644 index 000000000..24f434e07 --- /dev/null +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean @@ -0,0 +1,732 @@ +/- +Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.BoostFermionPairs +/-! +# The symmetrised boost average + +A rational combination of the paired boosts at `t = 2, 3, 4` together with the +identity (`boostProjZ`, `boostProjX`, `boostProjY`) realises the single-axis +boost averages, and their mean `opS` fixes every Lorentz-invariant vector +while acting on the weight-eight monomials by an explicit rational matrix (the +`opS_*` lemmas). +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace QED +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The `Z`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the Klein-restricted single-axis + average on the weight-eight sector. -/ +noncomputable def boostProjZ : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + + repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + + repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + + repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) + +/-- The `X`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the Klein-restricted single-axis + average on the weight-eight sector. -/ +noncomputable def boostProjX : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + + repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + + repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + + repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) + +/-- The `Y`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the Klein-restricted single-axis + average on the weight-eight sector. -/ +noncomputable def boostProjY : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + + repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + + repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + + repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) + +/-- The symmetrised boost average over the three axes. -/ +noncomputable def opS : Module.End ℂ JetAlgebra := + (3⁻¹ : ℂ) • (boostProjZ + boostProjX + boostProjY) + +/-- The operator `opS` fixes every Lorentz-invariant vector: each boost term + fixes it and the weights sum to one. -/ +lemma opS_apply_of_invariant {y : JetAlgebra} + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opS y = y := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply, hinv] + match_scalars + norm_num + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F01 * F01`. -/ +lemma opS_F01_F01 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F01_F01 2 (by norm_num), + pairZ_F01_F01 3 (by norm_num), + pairZ_F01_F01 4 (by norm_num), + pairX_F01_F01 2 (by norm_num), + pairX_F01_F01 3 (by norm_num), + pairX_F01_F01 4 (by norm_num), + pairY_F01_F01 2 (by norm_num), + pairY_F01_F01 3 (by norm_num), + pairY_F01_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F01 * F23`. -/ +lemma opS_F01_F23 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F01_F23 2 (by norm_num), + pairZ_F01_F23 3 (by norm_num), + pairZ_F01_F23 4 (by norm_num), + pairX_F01_F23 2 (by norm_num), + pairX_F01_F23 3 (by norm_num), + pairX_F01_F23 4 (by norm_num), + pairY_F01_F23 2 (by norm_num), + pairY_F01_F23 3 (by norm_num), + pairY_F01_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F02 * F02`. -/ +lemma opS_F02_F02 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F02_F02 2 (by norm_num), + pairZ_F02_F02 3 (by norm_num), + pairZ_F02_F02 4 (by norm_num), + pairX_F02_F02 2 (by norm_num), + pairX_F02_F02 3 (by norm_num), + pairX_F02_F02 4 (by norm_num), + pairY_F02_F02 2 (by norm_num), + pairY_F02_F02 3 (by norm_num), + pairY_F02_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F02 * F13`. -/ +lemma opS_F02_F13 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F02_F13 2 (by norm_num), + pairZ_F02_F13 3 (by norm_num), + pairZ_F02_F13 4 (by norm_num), + pairX_F02_F13 2 (by norm_num), + pairX_F02_F13 3 (by norm_num), + pairX_F02_F13 4 (by norm_num), + pairY_F02_F13 2 (by norm_num), + pairY_F02_F13 3 (by norm_num), + pairY_F02_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F03 * F03`. -/ +lemma opS_F03_F03 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F03_F03 2 (by norm_num), + pairZ_F03_F03 3 (by norm_num), + pairZ_F03_F03 4 (by norm_num), + pairX_F03_F03 2 (by norm_num), + pairX_F03_F03 3 (by norm_num), + pairX_F03_F03 4 (by norm_num), + pairY_F03_F03 2 (by norm_num), + pairY_F03_F03 3 (by norm_num), + pairY_F03_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F03 * F12`. -/ +lemma opS_F03_F12 : + opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F03_F12 2 (by norm_num), + pairZ_F03_F12 3 (by norm_num), + pairZ_F03_F12 4 (by norm_num), + pairX_F03_F12 2 (by norm_num), + pairX_F03_F12 3 (by norm_num), + pairX_F03_F12 4 (by norm_num), + pairY_F03_F12 2 (by norm_num), + pairY_F03_F12 3 (by norm_num), + pairY_F03_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F12 * F12`. -/ +lemma opS_F12_F12 : + opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F12_F12 2 (by norm_num), + pairZ_F12_F12 3 (by norm_num), + pairZ_F12_F12 4 (by norm_num), + pairX_F12_F12 2 (by norm_num), + pairX_F12_F12 3 (by norm_num), + pairX_F12_F12 4 (by norm_num), + pairY_F12_F12 2 (by norm_num), + pairY_F12_F12 3 (by norm_num), + pairY_F12_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F13 * F13`. -/ +lemma opS_F13_F13 : + opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F13_F13 2 (by norm_num), + pairZ_F13_F13 3 (by norm_num), + pairZ_F13_F13 4 (by norm_num), + pairX_F13_F13 2 (by norm_num), + pairX_F13_F13 3 (by norm_num), + pairX_F13_F13 4 (by norm_num), + pairY_F13_F13 2 (by norm_num), + pairY_F13_F13 3 (by norm_num), + pairY_F13_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `F23 * F23`. -/ +lemma opS_F23_F23 : + opS (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_F23_F23 2 (by norm_num), + pairZ_F23_F23 3 (by norm_num), + pairZ_F23_F23 4 (by norm_num), + pairX_F23_F23 2 (by norm_num), + pairX_F23_F23 3 (by norm_num), + pairX_F23_F23 4 (by norm_num), + pairY_F23_F23 2 (by norm_num), + pairY_F23_F23 3 (by norm_num), + pairY_F23_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma opS_dd01_F01 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd01_F01 2 (by norm_num), + pairZ_dd01_F01 3 (by norm_num), + pairZ_dd01_F01 4 (by norm_num), + pairX_dd01_F01 2 (by norm_num), + pairX_dd01_F01 3 (by norm_num), + pairX_dd01_F01 4 (by norm_num), + pairY_dd01_F01 2 (by norm_num), + pairY_dd01_F01 3 (by norm_num), + pairY_dd01_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma opS_dd01_F23 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd01_F23 2 (by norm_num), + pairZ_dd01_F23 3 (by norm_num), + pairZ_dd01_F23 4 (by norm_num), + pairX_dd01_F23 2 (by norm_num), + pairX_dd01_F23 3 (by norm_num), + pairX_dd01_F23 4 (by norm_num), + pairY_dd01_F23 2 (by norm_num), + pairY_dd01_F23 3 (by norm_num), + pairY_dd01_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma opS_dd02_F02 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd02_F02 2 (by norm_num), + pairZ_dd02_F02 3 (by norm_num), + pairZ_dd02_F02 4 (by norm_num), + pairX_dd02_F02 2 (by norm_num), + pairX_dd02_F02 3 (by norm_num), + pairX_dd02_F02 4 (by norm_num), + pairY_dd02_F02 2 (by norm_num), + pairY_dd02_F02 3 (by norm_num), + pairY_dd02_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma opS_dd02_F13 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd02_F13 2 (by norm_num), + pairZ_dd02_F13 3 (by norm_num), + pairZ_dd02_F13 4 (by norm_num), + pairX_dd02_F13 2 (by norm_num), + pairX_dd02_F13 3 (by norm_num), + pairX_dd02_F13 4 (by norm_num), + pairY_dd02_F13 2 (by norm_num), + pairY_dd02_F13 3 (by norm_num), + pairY_dd02_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma opS_dd03_F03 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd03_F03 2 (by norm_num), + pairZ_dd03_F03 3 (by norm_num), + pairZ_dd03_F03 4 (by norm_num), + pairX_dd03_F03 2 (by norm_num), + pairX_dd03_F03 3 (by norm_num), + pairX_dd03_F03 4 (by norm_num), + pairY_dd03_F03 2 (by norm_num), + pairY_dd03_F03 3 (by norm_num), + pairY_dd03_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma opS_dd03_F12 : + opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd03_F12 2 (by norm_num), + pairZ_dd03_F12 3 (by norm_num), + pairZ_dd03_F12 4 (by norm_num), + pairX_dd03_F12 2 (by norm_num), + pairX_dd03_F12 3 (by norm_num), + pairX_dd03_F12 4 (by norm_num), + pairY_dd03_F12 2 (by norm_num), + pairY_dd03_F12 3 (by norm_num), + pairY_dd03_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma opS_dd12_F03 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd12_F03 2 (by norm_num), + pairZ_dd12_F03 3 (by norm_num), + pairZ_dd12_F03 4 (by norm_num), + pairX_dd12_F03 2 (by norm_num), + pairX_dd12_F03 3 (by norm_num), + pairX_dd12_F03 4 (by norm_num), + pairY_dd12_F03 2 (by norm_num), + pairY_dd12_F03 3 (by norm_num), + pairY_dd12_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma opS_dd12_F12 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd12_F12 2 (by norm_num), + pairZ_dd12_F12 3 (by norm_num), + pairZ_dd12_F12 4 (by norm_num), + pairX_dd12_F12 2 (by norm_num), + pairX_dd12_F12 3 (by norm_num), + pairX_dd12_F12 4 (by norm_num), + pairY_dd12_F12 2 (by norm_num), + pairY_dd12_F12 3 (by norm_num), + pairY_dd12_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma opS_dd13_F02 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd13_F02 2 (by norm_num), + pairZ_dd13_F02 3 (by norm_num), + pairZ_dd13_F02 4 (by norm_num), + pairX_dd13_F02 2 (by norm_num), + pairX_dd13_F02 3 (by norm_num), + pairX_dd13_F02 4 (by norm_num), + pairY_dd13_F02 2 (by norm_num), + pairY_dd13_F02 3 (by norm_num), + pairY_dd13_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma opS_dd13_F13 : + opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd13_F13 2 (by norm_num), + pairZ_dd13_F13 3 (by norm_num), + pairZ_dd13_F13 4 (by norm_num), + pairX_dd13_F13 2 (by norm_num), + pairX_dd13_F13 3 (by norm_num), + pairX_dd13_F13 4 (by norm_num), + pairY_dd13_F13 2 (by norm_num), + pairY_dd13_F13 3 (by norm_num), + pairY_dd13_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma opS_dd23_F01 : + opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd23_F01 2 (by norm_num), + pairZ_dd23_F01 3 (by norm_num), + pairZ_dd23_F01 4 (by norm_num), + pairX_dd23_F01 2 (by norm_num), + pairX_dd23_F01 3 (by norm_num), + pairX_dd23_F01 4 (by norm_num), + pairY_dd23_F01 2 (by norm_num), + pairY_dd23_F01 3 (by norm_num), + pairY_dd23_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma opS_dd23_F23 : + opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_dd23_F23 2 (by norm_num), + pairZ_dd23_F23 3 (by norm_num), + pairZ_dd23_F23 4 (by norm_num), + pairX_dd23_F23 2 (by norm_num), + pairX_dd23_F23 3 (by norm_num), + pairX_dd23_F23 4 (by norm_num), + pairY_dd23_F23 2 (by norm_num), + pairY_dd23_F23 3 (by norm_num), + pairY_dd23_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u0`. -/ +lemma opS_u0 : + opS (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (-(Complex.I/6)) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u0 2 (by norm_num), + pairZ_u0 3 (by norm_num), + pairZ_u0 4 (by norm_num), + pairX_u0 2 (by norm_num), + pairX_u0 3 (by norm_num), + pairX_u0 4 (by norm_num), + pairY_u0 2 (by norm_num), + pairY_u0 3 (by norm_num), + pairY_u0 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u1`. -/ +lemma opS_u1 : + opS (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u1 2 (by norm_num), + pairZ_u1 3 (by norm_num), + pairZ_u1 4 (by norm_num), + pairX_u1 2 (by norm_num), + pairX_u1 3 (by norm_num), + pairX_u1 4 (by norm_num), + pairY_u1 2 (by norm_num), + pairY_u1 3 (by norm_num), + pairY_u1 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u2`. -/ +lemma opS_u2 : + opS (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (Complex.I/6) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u2 2 (by norm_num), + pairZ_u2 3 (by norm_num), + pairZ_u2 4 (by norm_num), + pairX_u2 2 (by norm_num), + pairX_u2 3 (by norm_num), + pairX_u2 4 (by norm_num), + pairY_u2 2 (by norm_num), + pairY_u2 3 (by norm_num), + pairY_u2 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `u3`. -/ +lemma opS_u3 : + opS (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_u3 2 (by norm_num), + pairZ_u3 3 (by norm_num), + pairZ_u3 4 (by norm_num), + pairX_u3 2 (by norm_num), + pairX_u3 3 (by norm_num), + pairX_u3 4 (by norm_num), + pairY_u3 2 (by norm_num), + pairY_u3 3 (by norm_num), + pairY_u3 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar0`. -/ +lemma opS_ubar0 : + opS (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (-(Complex.I/6)) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar0 2 (by norm_num), + pairZ_ubar0 3 (by norm_num), + pairZ_ubar0 4 (by norm_num), + pairX_ubar0 2 (by norm_num), + pairX_ubar0 3 (by norm_num), + pairX_ubar0 4 (by norm_num), + pairY_ubar0 2 (by norm_num), + pairY_ubar0 3 (by norm_num), + pairY_ubar0 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar1`. -/ +lemma opS_ubar1 : + opS (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar1 2 (by norm_num), + pairZ_ubar1 3 (by norm_num), + pairZ_ubar1 4 (by norm_num), + pairX_ubar1 2 (by norm_num), + pairX_ubar1 3 (by norm_num), + pairX_ubar1 4 (by norm_num), + pairY_ubar1 2 (by norm_num), + pairY_ubar1 3 (by norm_num), + pairY_ubar1 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar2`. -/ +lemma opS_ubar2 : + opS (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (Complex.I/6) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar2 2 (by norm_num), + pairZ_ubar2 3 (by norm_num), + pairZ_ubar2 4 (by norm_num), + pairX_ubar2 2 (by norm_num), + pairX_ubar2 3 (by norm_num), + pairX_ubar2 4 (by norm_num), + pairY_ubar2 2 (by norm_num), + pairY_ubar2 3 (by norm_num), + pairY_ubar2 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `opS` on the σ-contracted fermion pair `ubar3`. -/ +lemma opS_ubar3 : + opS (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [pairZ_ubar3 2 (by norm_num), + pairZ_ubar3 3 (by norm_num), + pairZ_ubar3 4 (by norm_num), + pairX_ubar3 2 (by norm_num), + pairX_ubar3 3 (by norm_num), + pairX_ubar3 4 (by norm_num), + pairY_ubar3 2 (by norm_num), + pairY_ubar3 3 (by norm_num), + pairY_ubar3 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +/-! + +### The projector polynomial and the weight-eight endgame + +-/ +/-- The quintic projector polynomial in the symmetrised boost average `opS`: + the unique degree-five polynomial with value one at the invariant eigenvalue + and vanishing on the remaining boost eigenvalues of the weight-eight Klein + sector. -/ +noncomputable def opPi : Module.End ℂ JetAlgebra := + (-1 : ℂ) • (1 : Module.End ℂ JetAlgebra) + (137/10 : ℂ) • opS + + (-(135/2) : ℂ) • (opS * opS) + (153 : ℂ) • (opS * opS * opS) + + (-162 : ℂ) • (opS * opS * opS * opS) + + (324/5 : ℂ) • (opS * opS * opS * opS * opS) + +/-- The projector polynomial, termwise. -/ +lemma opPi_apply (v : JetAlgebra) : + opPi v = (-1 : ℂ) • v + (137/10 : ℂ) • opS v + + (-(135/2) : ℂ) • opS (opS v) + (153 : ℂ) • opS (opS (opS v)) + + (-162 : ℂ) • opS (opS (opS (opS v))) + + (324/5 : ℂ) • opS (opS (opS (opS (opS v)))) := by + simp only [opPi, LinearMap.add_apply, LinearMap.smul_apply, Module.End.one_apply, + Module.End.mul_apply] + +/-- The projector fixes every Lorentz-invariant vector: `opS` fixes it and the + coefficients sum to one. -/ +lemma opPi_apply_of_invariant {y : JetAlgebra} + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opPi y = y := by + have hS : opS y = y := opS_apply_of_invariant hinv + rw [opPi_apply] + simp only [hS] + match_scalars + norm_num +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/MassDim.lean index cdd558ad7..bc1ea8b77 100644 --- a/Physlib/Particles/QED/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/QED/JetAlgebra/MassDim.lean @@ -90,9 +90,8 @@ lemma massWeightScale_covariantStep (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlg c ^ 2 • [JetGenerators.dB {} μ]ₐ := by rw [massWeightScale_ofGenerator, show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] - simp only [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply, map_add, map_smul, massWeightScale_jetDeriv, hm, hgen, - smul_mul_assoc] + simp only [covariantStep_apply, map_add, map_smul, massWeightScale_jetDeriv, + hm, hgen, smul_mul_assoc] module /-- The conjugate covariant step raises the mass weight by two. -/ @@ -105,9 +104,8 @@ lemma massWeightScale_covariantStepBar (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : Jet c ^ 2 • [JetGenerators.dB {} μ]ₐ := by rw [massWeightScale_ofGenerator, show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] - simp only [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply, map_sub, map_smul, massWeightScale_jetDeriv, hm, hgen, - smul_mul_assoc] + simp only [covariantStepBar_apply, map_sub, map_smul, massWeightScale_jetDeriv, + hm, hgen, smul_mul_assoc] module /-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean index 00f4b9bcd..b23d1f613 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean @@ -2328,6 +2328,118 @@ lemma JetComponentSpace.repLorentzGroup_basis_dB_singleton (Λ : SL(2,ℂ)) congr 2 ring +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on the two-derivative-index B-boson jet coordinates: + all three indices transform contravariantly, by the columns of the Lorentz + matrix. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dB_pair + (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetComponentSpace.repLorentzGroup Λ + (BBoson.JetComponentSpace.basis (.dB {ρ, μ} ν)) = + ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • + BBoson.JetComponentSpace.basis (.dB {r, a} b) := by + have hpair : ∀ x y : Fin 1 ⊕ Fin 3, + LagrangianTheory.dualRealJetAlgebraBasis ({x, y} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis x) * + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis y) := fun x y => by + rw [← BBoson.dualRealJetAlgebraBasis_singleton, + ← BBoson.dualRealJetAlgebraBasis_singleton, + BBoson.dualRealJetAlgebraBasis_mul, Multiset.singleton_add, + ← Multiset.insert_eq_cons] + have hmul : ∀ x y : DerivAlgebraReal, + DerivAlgebraReal.repLorentzGroup Λ (x * y) = + DerivAlgebraReal.repLorentzGroup Λ x * + DerivAlgebraReal.repLorentzGroup Λ y := fun x y => + map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + Lorentz.CoVector.sl2Rep.dual Λ)) x y + have happ : BBoson.JetComponentSpace.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ} ⊗ₜ[ℝ] + StandardModel.BBoson.basis.dualBasis ν) = + (DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ})) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ + (StandardModel.BBoson.basis.dualBasis ν)) := rfl + rw [BBoson.jetComponentSpace_basis_dB, happ, hpair, hmul, + DerivAlgebraReal.repLorentzGroup_apply_ι, + DerivAlgebraReal.repLorentzGroup_apply_ι, + Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, + BBoson.repLorentzGroup_dual_dualBasis] + simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, + smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, + ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, + smul_smul, BBoson.jetComponentSpace_basis_dB, hpair] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, j]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => + Finset.sum_congr rfl fun b _ => ?_ + module + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on the three-derivative-index B-boson jet coordinates: + all four indices transform contravariantly, by the columns of the Lorentz + matrix. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dB_triple + (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetComponentSpace.repLorentzGroup Λ + (BBoson.JetComponentSpace.basis (.dB {ρ, τ, μ} ν)) = + ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • + BBoson.JetComponentSpace.basis (.dB {r, s, a} b) := by + have htriple : ∀ x y z : Fin 1 ⊕ Fin 3, + LagrangianTheory.dualRealJetAlgebraBasis ({x, y, z} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis x) * + (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis y) * + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis z)) := fun x y z => by + rw [← BBoson.dualRealJetAlgebraBasis_singleton, + ← BBoson.dualRealJetAlgebraBasis_singleton, + ← BBoson.dualRealJetAlgebraBasis_singleton, + BBoson.dualRealJetAlgebraBasis_mul, BBoson.dualRealJetAlgebraBasis_mul, + Multiset.singleton_add, Multiset.singleton_add, ← Multiset.insert_eq_cons, + ← Multiset.insert_eq_cons] + have hmul : ∀ x y : DerivAlgebraReal, + DerivAlgebraReal.repLorentzGroup Λ (x * y) = + DerivAlgebraReal.repLorentzGroup Λ x * + DerivAlgebraReal.repLorentzGroup Λ y := fun x y => + map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + Lorentz.CoVector.sl2Rep.dual Λ)) x y + have happ : BBoson.JetComponentSpace.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ} ⊗ₜ[ℝ] + StandardModel.BBoson.basis.dualBasis ν) = + (DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ})) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ + (StandardModel.BBoson.basis.dualBasis ν)) := rfl + rw [BBoson.jetComponentSpace_basis_dB, happ, htriple, hmul, hmul, + DerivAlgebraReal.repLorentzGroup_apply_ι, + DerivAlgebraReal.repLorentzGroup_apply_ι, + DerivAlgebraReal.repLorentzGroup_apply_ι, + Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, + Lorentz.CoVector.sl2Rep_dual_dualBasis, + BBoson.repLorentzGroup_dual_dualBasis] + simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, + smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, + ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, + smul_smul, BBoson.jetComponentSpace_basis_dB, htriple] + conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] + conv_lhs => enter [2, i]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] + conv_lhs => enter [2, i]; rw [Finset.sum_comm] + conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => + Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + module + namespace JetAlgebra @@ -2438,6 +2550,121 @@ lemma massWeightScale_ofReal_complexRepLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) repLorentzGroup Λ (massWeightScaleReal r b) from rfl, massWeightScaleReal_repLorentzGroup] +/-! + +## Lorentz transformation laws of the field strength + +The field strength `F_{μν} = ∂_μ B_ν - ∂_ν B_μ` and its derivatives are +tensors: every index transforms by the Lorentz matrix. + +-/ + +set_option maxHeartbeats 2000000 in +/-- The transformation law of the first-derivative field strength on the + B-boson jet algebra: a three-index tensor. -/ +lemma repLorentzGroup_fieldStrengthDeriv_singleton + (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = + ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • + BBoson.JetAlgebra.fieldStrengthDeriv {r} a b := by + have hFS : ∀ r a b : Fin 1 ⊕ Fin 3, + BBoson.JetAlgebra.fieldStrengthDeriv ({r} : Multiset _) a b = + BBoson.JetAlgebra.ofGenerator (.dB {r, a} b) - + BBoson.JetAlgebra.ofGenerator (.dB {r, b} a) := fun r a b => by + rw [BBoson.JetAlgebra.fieldStrengthDeriv, + show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, a} from by + rw [Multiset.singleton_add, ← Multiset.insert_eq_cons], + show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, b} from by + rw [Multiset.singleton_add, ← Multiset.insert_eq_cons]] + simp only [hFS] + rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair] + simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, + BBoson.JetAlgebra.ofGenerator] + rw [sub_right_inj] + conv_rhs => enter [2, r]; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => + Finset.sum_congr rfl fun b _ => ?_ + congr 1 + ring + +/-- The transformation of the complexified first-derivative field strength. -/ +lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton + (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = + ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r} a b) := by + rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) from rfl, + BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_singleton] + simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] + +set_option maxHeartbeats 2000000 in +/-- The transformation law of the second-derivative field strength on the + B-boson jet algebra: a four-index tensor. -/ +lemma repLorentzGroup_fieldStrengthDeriv_pair + (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = + ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • + BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b := by + have hFS : ∀ r s a b : Fin 1 ⊕ Fin 3, + BBoson.JetAlgebra.fieldStrengthDeriv ({r, s} : Multiset _) a b = + BBoson.JetAlgebra.ofGenerator (.dB {r, s, a} b) - + BBoson.JetAlgebra.ofGenerator (.dB {r, s, b} a) := fun r s a b => by + rw [BBoson.JetAlgebra.fieldStrengthDeriv, + show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, s, a} from by + rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, + ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons], + show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, s, b} from by + rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, + ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons]] + simp only [hFS] + rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetAlgebra.repLorentzGroup_apply_ι, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple, + BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple] + simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, + BBoson.JetAlgebra.ofGenerator] + rw [sub_right_inj] + conv_rhs => enter [2, r, 2, s]; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => + Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + congr 1 + ring + +/-- The transformation of the complexified second-derivative field strength. -/ +lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair + (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = + ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b) := by + rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ + (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) from rfl, + BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_pair] + simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] + end JetAlgebra end BBoson From f11f5e52dfeda390efefd4b34ca35cb08bc51508 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 13:34:32 +0100 Subject: [PATCH 102/254] feat: Some fixes and clean up --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 136 ++++----- .../QED/JetAlgebra/Invariants/Basic.lean | 27 +- .../Invariants/BoostTransforms.lean | 1 + .../QED/JetAlgebra/Invariants/Sectors.lean | 2 +- .../Invariants/SymmetrisedAverage.lean | 1 + .../StandardModel/Fermions/LeptonSinglet.lean | 2 +- .../{BBoson.lean => BBoson/Basic.lean} | 266 ++++++++++++++---- 7 files changed, 291 insertions(+), 144 deletions(-) rename Physlib/Particles/StandardModel/GaugeBosons/{BBoson.lean => BBoson/Basic.lean} (92%) diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 576d20247..4f148d526 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic public import Mathlib.RingTheory.TensorProduct.Basic public import Mathlib.LinearAlgebra.DirectSum.Finsupp public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -15,7 +15,6 @@ public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Particles.LagrangianTheory.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson /-! # Jet algebra for quantum electrodynamics @@ -206,24 +205,29 @@ multiset, with the head of the list the outermost derivative. The component functions of the lepton transform contragrediently, through the hypercharge power series `u ^ 6`, so the covariant step on component functions -is `D_μ = ∂_μ + 6 i B_μ`: under a jet gauge transformation `∂_μ ψ_α` shifts by -`- 6 i mc_μ ψ_α` while `B_μ` shifts by `+ mc_μ`, and the two contributions -cancel. The step is defined on the whole jet algebra; applied repeatedly to the -zeroth-order component function of `ψ` it produces the covariant derivatives. +is `D_μ = ∂_μ - 6 i B_μ`: under a jet gauge transformation `∂_μ ψ_α` shifts by +`- 6 i mc_μ ψ_α` while `B_μ`, being a component function too, shifts +contragrediently by `- mc_μ` (`BBoson.mcShift`), and the two contributions +cancel for the coupling `- 6 i` — and only for that coupling. The step is +defined on the whole jet algebra; applied repeatedly to the zeroth-order +component function of `ψ` it produces the covariant derivatives. -/ -/-- One covariant-derivative step `D_μ = ∂_μ + 6 i B_μ` on the QED jet algebra: +/-- One covariant-derivative step `D_μ = ∂_μ - 6 i B_μ` on the QED jet algebra: the total spacetime derivative together with multiplication by the gauge field - weighted by the hypercharge coupling. -/ + weighted by the hypercharge coupling. The sign is fixed by covariance: the + component function `ψ_α` carries hypercharge `+6`, so `∂_μ ψ_α` picks up + `- 6 i mc_μ ψ_α`, while `B_μ` shifts contragrediently by `- mc_μ` + (`BBoson.mcShift`); the two cancel only for the coupling `- 6 i`. -/ noncomputable def covariantStep (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ + jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ @[simp] lemma covariantStep_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : covariantStep μ x = - jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by - rw [covariantStep, LinearMap.add_apply, LinearMap.smul_apply, + jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by + rw [covariantStep, LinearMap.sub_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply] /-- The covariant derivative `D_l ψ_α` of the charged lepton along the ordered @@ -243,9 +247,9 @@ lemma Dψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) Dψ (μ :: l) α = covariantStep μ (Dψ l α) := rfl -/-- The first covariant derivative: `D_μ ψ_α = ∂_μ ψ_α + 6 i B_μ ψ_α`. -/ +/-- The first covariant derivative: `D_μ ψ_α = ∂_μ ψ_α - 6 i B_μ ψ_α`. -/ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dψ [μ] α = [JetGenerators.dψ {μ} α]ₐ + + Dψ [μ] α = [JetGenerators.dψ {μ} α]ₐ - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dψ {} α]ₐ) := by rw [Dψ_cons, Dψ_nil, covariantStep_apply] congr 1 @@ -256,16 +260,18 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] -/-- One covariant-derivative step `D̄_μ = ∂_μ - 6 i B_μ` for the conjugate - lepton on the QED jet algebra. -/ +/-- One covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` for the conjugate + lepton on the QED jet algebra: the conjugate component function `ψ̄_α` carries + hypercharge `-6`, so its coupling is the opposite of that in + `covariantStep`. -/ noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ + jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ @[simp] lemma covariantStepBar_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : covariantStepBar μ x = - jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by - rw [covariantStepBar, LinearMap.sub_apply, LinearMap.smul_apply, + jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by + rw [covariantStepBar, LinearMap.add_apply, LinearMap.smul_apply, LinearMap.mulLeft_apply] /-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the @@ -285,9 +291,9 @@ lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin Dbarψ (μ :: l) α = covariantStepBar μ (Dbarψ l α) := rfl /-- The first conjugate covariant derivative: - `D̄_μ ψ̄_α = ∂_μ ψ̄_α - 6 i B_μ ψ̄_α`. -/ + `D̄_μ ψ̄_α = ∂_μ ψ̄_α + 6 i B_μ ψ̄_α`. -/ lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ - ((6 : ℂ) * Complex.I) • + Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar_apply] congr 1 @@ -446,7 +452,7 @@ lemma Dψ_mem_range_oddIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : rw [oddIncl_tmul]; rfl⟩ | cons ν l ih => simp only [Dψ_cons, covariantStep_apply] - exact Submodule.add_mem _ (jetDeriv_mem_range_oddIncl ν ih) + exact Submodule.sub_mem _ (jetDeriv_mem_range_oddIncl ν ih) (Submodule.smul_mem _ _ (dB_mul_mem_range_oddIncl ν ih)) /-- The covariant derivatives of the conjugate lepton are odd. -/ @@ -459,7 +465,7 @@ lemma Dbarψ_mem_range_oddIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : rw [oddIncl_tmul]; rfl⟩ | cons ν l ih => simp only [Dbarψ_cons, covariantStepBar_apply] - exact Submodule.sub_mem _ (jetDeriv_mem_range_oddIncl ν ih) + exact Submodule.add_mem _ (jetDeriv_mem_range_oddIncl ν ih) (Submodule.smul_mem _ _ (dB_mul_mem_range_oddIncl ν ih)) lemma covGenerator_mem_range_oddIncl (g : LeptonSinglet.JetGenerators) : @@ -701,13 +707,13 @@ lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : LeptonComp leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] leptonComponentIncl a := by simp [leptonLinearIncl] -/-- The covariant-derivative step `D_μ = ∂_μ + 6 i B_μ` on lepton-linear +/-- The covariant-derivative step `D_μ = ∂_μ - 6 i B_μ` on lepton-linear elements. -/ noncomputable def covariantStepAux (μ : Fin 1 ⊕ Fin 3) : LeptonLinear →ₗ[ℂ] LeptonLinear := TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) LinearMap.id + - TensorProduct.map LinearMap.id (shiftC μ) + + TensorProduct.map LinearMap.id (shiftC μ) - ((6 : ℂ) * Complex.I) • TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id @@ -716,7 +722,7 @@ lemma covariantStepAux_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetA (a : LeptonComponent) : covariantStepAux μ (p ⊗ₜ[ℂ] a) = (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + - p ⊗ₜ[ℂ] shiftC μ a + + p ⊗ₜ[ℂ] shiftC μ a - ((6 : ℂ) * Complex.I) • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by simp [covariantStepAux] @@ -739,8 +745,8 @@ lemma repAux_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) noncomputable def anomalyAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : LeptonLinear →ₗ[ℂ] LeptonLinear := TensorProduct.map (LinearMap.baseChange ℂ - (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + - ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id - + ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id - ((6 : ℂ) * Complex.I) • TensorProduct.map LinearMap.id (actionC (BBoson.maurerCartanU1Deriv U μ s)) @@ -748,8 +754,8 @@ noncomputable def anomalyAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) lemma anomalyAux_tmul (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : LeptonComponent) : anomalyAux U s μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + - ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a - + ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) - ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.maurerCartanU1Deriv U μ s) a) := by simp [anomalyAux] @@ -818,13 +824,13 @@ lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) actionC_maurerCartanU1_pow] have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ) + - ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + - ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by rw [add_mul, smul_mul_assoc, hone] @@ -851,11 +857,11 @@ lemma anomalyAux_covariantStepAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by rw [BBoson.JetGenerators.shiftMulti_dB] congr 1 - have hm : BBoson.mcPairing U (BBoson.JetComponentSpace.basis + have hm : BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = - BBoson.mcPairing U (BBoson.JetComponentSpace.basis + BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by - rw [BBoson.mcPairing_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = + rw [BBoson.mcShift_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] have key : (anomalyAux U s μ) ∘ₗ (covariantStepAux ν) = @@ -873,10 +879,10 @@ lemma anomalyAux_covariantStepAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin | zero => simp | add a b ha hb => simp only [mul_add, ha, hb] | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] - have hdist : (((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + have hdist : (((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = - ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • p := by rw [smul_mul_assoc, hone] @@ -894,8 +900,10 @@ lemma anomalyAux_ψAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) anomalyAux U s μ (ψAux α) = 0 := by rw [ψAux, anomalyAux_tmul, LinearMap.baseChange_tmul] simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, actionC_one_tmul, BBoson.constantCoeff_maurerCartanU1Deriv, - TensorProduct.tmul_smul, smul_smul, zero_add, sub_self] + TensorProduct.zero_tmul, actionC_one_tmul, + BBoson.constantCoeff_maurerCartanU1Deriv_mcShift, + TensorProduct.tmul_smul, smul_smul, zero_sub] + module /-- The gauge action on the zeroth-order lepton component is the hypercharge character of the value of the jet at the base point. -/ @@ -938,7 +946,7 @@ lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : leptonLinearIncl ∘ₗ (covariantStepAux μ) := by refine TensorProduct.ext' fun p a => ?_ simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covariantStepAux_tmul, - leptonComponentIncl_apply, covariantStep_apply, map_add, map_smul, + leptonComponentIncl_apply, covariantStep_apply, map_add, map_sub, map_smul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, Algebra.TensorProduct.tmul_mul_tmul, one_mul] @@ -1027,13 +1035,13 @@ lemma conjLeptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] conjLeptonComponentIncl a := by simp [conjLeptonLinearIncl] -/-- The covariant-derivative step `D̄_μ = ∂_μ - 6 i B_μ` on conjugate-linear +/-- The covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` on conjugate-linear elements. -/ noncomputable def covariantStepBarAux (μ : Fin 1 ⊕ Fin 3) : ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) LinearMap.id + - TensorProduct.map LinearMap.id (shiftC μ) - + TensorProduct.map LinearMap.id (shiftC μ) + ((6 : ℂ) * Complex.I) • TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id @@ -1042,7 +1050,7 @@ lemma covariantStepBarAux_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.J (a : ConjLeptonComponent) : covariantStepBarAux μ (p ⊗ₜ[ℂ] a) = (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + - p ⊗ₜ[ℂ] shiftC μ a - + p ⊗ₜ[ℂ] shiftC μ a + ((6 : ℂ) * Complex.I) • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by simp [covariantStepBarAux] @@ -1065,8 +1073,8 @@ lemma repBarAux_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) noncomputable def anomalyBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := TensorProduct.map (LinearMap.baseChange ℂ - (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id - - ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + + ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id + ((6 : ℂ) * Complex.I) • TensorProduct.map LinearMap.id (actionC (BBoson.maurerCartanU1Deriv U μ s)) @@ -1074,8 +1082,8 @@ noncomputable def anomalyBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3) lemma anomalyBarAux_tmul (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : ConjLeptonComponent) : anomalyBarAux U s μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a - - ((6 : ℂ) * Complex.I * ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + + ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) + ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.maurerCartanU1Deriv U μ s) a) := by simp [anomalyBarAux] @@ -1121,13 +1129,13 @@ lemma repBarAux_covariantStepBarAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) actionC_maurerCartanU1_star_pow] have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ) + - ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + - ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by rw [add_mul, smul_mul_assoc, hone] @@ -1155,11 +1163,11 @@ lemma anomalyBarAux_covariantStepBarAux (U : JetGaugeGroupI) (s : List (Fin 1 BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by rw [BBoson.JetGenerators.shiftMulti_dB] congr 1 - have hm : BBoson.mcPairing U (BBoson.JetComponentSpace.basis + have hm : BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = - BBoson.mcPairing U (BBoson.JetComponentSpace.basis + BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by - rw [BBoson.mcPairing_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = + rw [BBoson.mcShift_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] have key : (anomalyBarAux U s μ) ∘ₗ (covariantStepBarAux ν) = @@ -1177,10 +1185,10 @@ lemma anomalyBarAux_covariantStepBarAux (U : JetGaugeGroupI) (s : List (Fin 1 | zero => simp | add a b ha hb => simp only [mul_add, ha, hb] | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] - have hdist : (((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + have hdist : (((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = - ((BBoson.mcPairing U (BBoson.JetComponentSpace.basis + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • p := by rw [smul_mul_assoc, hone] @@ -1197,8 +1205,10 @@ lemma anomalyBarAux_ψBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) anomalyBarAux U s μ (ψBarAux α) = 0 := by rw [ψBarAux, anomalyBarAux_tmul, LinearMap.baseChange_tmul] simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, actionC_one_tmul, BBoson.constantCoeff_maurerCartanU1Deriv, - TensorProduct.tmul_smul, smul_smul, zero_sub, neg_add_cancel] + TensorProduct.zero_tmul, actionC_one_tmul, + BBoson.constantCoeff_maurerCartanU1Deriv_mcShift, + TensorProduct.tmul_smul, smul_smul, zero_add] + module /-- The gauge action on the zeroth-order conjugate-lepton component is the conjugate hypercharge character of the value of the jet at the base point. -/ @@ -1633,7 +1643,7 @@ lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} obtain ⟨c, g, hg, rfl⟩ := hz rw [covariantStep_apply, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] - refine add_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) + refine sub_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ · rw [dB_mul_tmul] @@ -1651,7 +1661,7 @@ lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgeb obtain ⟨c, g, hg, rfl⟩ := hz rw [covariantStepBar_apply, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] - refine sub_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) + refine add_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ · rw [dB_mul_tmul] @@ -1682,7 +1692,7 @@ lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : rw [add_sub_cancel] at h rw [Dψ_cons, h] have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) + + LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) - ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by rw [covariantStep_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, @@ -1697,9 +1707,9 @@ lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : simp [genDeg, Multiset.coe_card] have hmem2 : covariantStep μ (Dψ t α - L) ∈ oddLow (t.length + 1) := covariantStep_mem_oddLow μ ih - have habel : ∀ A X Y : JetAlgebra, A + X + Y - A = X + Y := fun A X Y => by abel + have habel : ∀ A X Y : JetAlgebra, A - X + Y - A = Y - X := fun A X Y => by abel rw [hstep, hleadEq, habel] - exact add_mem (Submodule.smul_mem _ _ hmem1) hmem2 + exact sub_mem hmem2 (Submodule.smul_mem _ _ hmem1) set_option maxHeartbeats 4000000 in /-- The covariant derivative of the conjugate lepton is its plain derivative @@ -1724,7 +1734,7 @@ lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : rw [add_sub_cancel] at h rw [Dbarψ_cons, h] have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) - + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) + ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by rw [covariantStepBar_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, @@ -1739,9 +1749,9 @@ lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : simp [genDeg, Multiset.coe_card] have hmem2 : covariantStepBar μ (Dbarψ t α - L) ∈ oddLow (t.length + 1) := covariantStepBar_mem_oddLow μ ih - have habel : ∀ A X Y : JetAlgebra, A - X + Y - A = Y - X := fun A X Y => by abel + have habel : ∀ A X Y : JetAlgebra, A + X + Y - A = X + Y := fun A X Y => by abel rw [hstep, hleadEq, habel] - exact sub_mem hmem2 (Submodule.smul_mem _ _ hmem1) + exact add_mem (Submodule.smul_mem _ _ hmem1) hmem2 /-- The covariant generator is the plain generator up to strictly-lower-degree odd terms. -/ diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean index 2159f75ca..64823c258 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean @@ -735,37 +735,12 @@ lemma fermionKineticTermBar_mem_massWeightLESubmodule : (fun c => massWeightScale_Dbarψ c [μ] α) (fun c => massWeightScale_Dψ c [] β)) -/-- The Lorentz action fixes the unit of the jet algebra. -/ -lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : - repLorentzGroup Λ (1 : JetAlgebra) = 1 := by - have h1 : BBoson.JetAlgebra.complexRepLorentzGroup Λ - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by - rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = - (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, - show BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) - from by rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ = - LinearMap.baseChange ℂ (BBoson.JetAlgebra.repLorentzGroup Λ) from rfl, - LinearMap.baseChange_tmul], - show BBoson.JetAlgebra.repLorentzGroup Λ (1 : BBoson.JetAlgebra) = 1 from - map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - BBoson.JetComponentSpace.repLorentzGroup Λ))] - rw [show (1 : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, - show repLorentzGroup Λ ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra)) = - BBoson.JetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra) - from rfl, - h1, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - /-- Every element of `massDimFourInvariants` is gauge and Lorentz invariant. -/ lemma isInvariant_of_mem_massDimFourInvariants {x : JetAlgebra} (hx : x ∈ massDimFourInvariants) : IsInvariant x := by rcases hx with rfl | rfl | rfl | rfl | rfl · exact ⟨fun U => (repJetGaugeGroupI_eq_repAlgHom U 1).trans (repAlgHom U).map_one, - repLorentzGroup_one⟩ + repLorentzGroup_apply_one⟩ · exact ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ · exact ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ · exact ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean index 52cc3d183..3ce77a841 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean @@ -43,6 +43,7 @@ fixes every Lorentz-invariant vector while acting on the weight-eight basis by an explicit rational matrix (the `opS_*` stage lemmas below). -/ + /-- Reordering the two derivative indices of a second-derivative field strength. -/ lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean index 60b821192..670c7fffa 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean @@ -888,7 +888,7 @@ lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] - module + end JetAlgebra end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean index 24f434e07..ed6d3d5e2 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean @@ -699,6 +699,7 @@ lemma opS_ubar3 : ### The projector polynomial and the weight-eight endgame -/ + /-- The quintic projector polynomial in the symmetrised boost average `opS`: the unique degree-five polynomial with value one at the invariant eigenvalue and vanishing on the remaining boost eigenvalues of the weight-eight Klein diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index ac1ffbcc4..08265c109 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic public import Mathlib.RingTheory.TensorProduct.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Mathematics.ConjModule diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean similarity index 92% rename from Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean rename to Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index b23d1f613..77a812eb1 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -30,6 +30,51 @@ The physical Z boson and photon are the electroweak-mixed combinations of this field with the neutral `SU(2)` boson; before mixing, the `U(1)` factor's gauge boson is the B boson formalized here. +## A note on the general case + +Let us consider the general case of a gauge field which should help elcuidate the +theory here. Let `A_μ^a` be the gauge boson field for the general gauge group `G`, +with `a` an index in the adjoint representation of `G`. Then the gauge transformation on `A` +takes the form `A_μ^a ↦ (Ad_g A_μ)^a + mc(g)_μ^a`, where `mc(g)` is the Maurer–Cartan form +of the gauge transformation. In this file `BBoson` is the +vector space of the `B` boson fields, and the transformation of the +`B` boson is given by (`SMul JetGaugeGroupI BBoson`): + +`repGaugeGroupI U.eval B + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩` + +where here `repGaugeGroupI U.eval` is the adjoint action and the second term is +the Maurer–Cartan term. + +In general we will write `g • A_μ^a = M(g)^a_b A_μ^b + mc(g)_μ^a`, where `M(g)^a_b` +is the adjoint action of `g` evaluated at the base point. With this it is easy to say +how the gauge transformation acts on the derivatives of the gauge field. We have + +`∂_s A_μ^a ↦ ∂_s (g • A_μ^a) =` +`∑ (x + y = s), C(x,y) (∂_x g₀^a_b) ∂_y A_μ^b + ∂_s mc(g)_μ^a` +where `C(x,y)` is the usual binomial coefficient. + +What we actually want to work with (and what our Lagrangian is written in +terms of is) `[∂_s A_μ^a]`. These are the component functions of the gauge fields. +They are functions on the space of field configurations, so the induced left +action is the pullback along `g⁻¹`, `(g • f)(A) = f (g⁻¹ • A)`: one substitutes +`g⁻¹` — not `g` — into the field law above. Writing `M⁻¹ := M(g⁻¹) = M(g)⁻¹`, + +`g • [∂_s A_μ^a] = ∑ (x + y = s), C(x,y) (∂_x (M(g₀⁻¹))^a_b) [∂_y A_μ^b]` +` + ∂_s mc(g⁻¹)_μ^a` + +The inverse on `M` is essential: pulling back along `g` instead would give a +right action, since `(f ∘ g₁) ∘ g₂ = f ∘ (g₁g₂)` composes in the wrong order. +The Maurer–Cartan cocycle identity `mc(g₁g₂) = Ad_{g₁} mc(g₂) + mc(g₁)` gives +`mc(g⁻¹) = -Ad_{g⁻¹} mc(g)`, so the inhomogeneous term is minus the field-level +one, transported by `M⁻¹`. + +For the abelian case formalized here the adjoint action is trivial, `M ≡ 1`, so +the first sum collapses to `[∂_s B_μ]` and the shift is simply `-∂_s mc(g)_μ`: + +`g • [∂_s B_μ] = [∂_s B_μ] - ∂_s mc(g)_μ` + +This is `mcShift`, and it is the sign used by `repJetGaugeGroupI`. + -/ @[expose] public section @@ -215,7 +260,8 @@ open MvPowerSeries JetRing is affine rather than linear, which is why it is a `MulAction` and not a `Representation`. -/ noncomputable instance : SMul JetGaugeGroupI BBoson where - smul U B := repGaugeGroupI U.eval B + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ + smul U B := repGaugeGroupI U.eval B + + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ lemma smul_eq (U : JetGaugeGroupI) (B : BBoson) : U • B = B + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ := rfl @@ -395,6 +441,13 @@ noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponent (LagrangianTheory.dualRealJetAlgebraBasis.tensorProduct BBoson.basis.dualBasis).reindex JetGenerators.equiv.symm + +/-! + +### A.1. The mass dimension on the component space + +-/ + /-- The mass-dimension scaling on the space of component functions of the B boson: the diagonal map multiplying each component function `∂_s B_μ` by `c ^ w`, where `w` is twice its mass dimension. -/ @@ -409,6 +462,11 @@ lemma JetComponentSpace.massWeightScale_basis (c : ℝ) (j : JetGenerators) : c ^ j.massWeight • JetComponentSpace.basis j := by rw [JetComponentSpace.massWeightScale, Module.Basis.constr_basis] +/-! + +### A.2. The action of the Lorentz group + +-/ /-- The representation of the Lorentz group on the space of component functions of the B boson: the derivative symbols transform through the real dual covector action and the target factor through the dual of the B-boson representation. -/ @@ -421,15 +479,23 @@ noncomputable def JetComponentSpace.repLorentzGroup : ### A.1. The action of the gauge group on the jet component space +The jet gauge group does not act linearly on the B-boson fields. + +For a general gauge theory (potentially non-abelian), + +`∂_s B_μ ↦ ∂_s (g • B_μ) = ∂_s (Ad_g B_μ + mc(g)_μ) = ∂_s (Ad_g B_μ) + ∂_s mc(g)_μ` + +The last term in this expression is a real number. + -/ open LagrangianTheory -/-- Under the action of the gauge group `∂_s B_ν ↦ ∂_s B_ν + ⟨mc, ∂_s B_ν⟩ · 1`. - The real number `⟨mc, ∂_s B_ν⟩` is what we here call the Maurer–Cartan pairing: - the component function evaluated against the B-boson whose components are the - factorial-weighted Taylor coefficients — the `s`-th derivatives at the base - point — of the Maurer–Cartan series. -/ +/-- The Maurer–Cartan pairing `⟨mc, ∂_s B_ν⟩`: the component function evaluated + against the B-boson whose components are the factorial-weighted Taylor + coefficients — the `s`-th derivatives at the base point — of the Maurer–Cartan + series. This is the shift of the *field* `∂_s B_ν` under the gauge action; the + component functions shift by its negative, `mcShift`. -/ noncomputable def mcPairing (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => @@ -631,7 +697,87 @@ lemma constantCoeff_maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin rw [Complex.coe_selfAdjointEquiv] rfl +/-! + +### The Maurer–Cartan shift on component functions + +The jet gauge group acts on the *fields* by the translation `B_μ ↦ B_μ + mc(g)_μ` +(`SMul JetGaugeGroupI BBoson`). The jet algebra is the algebra of polynomial +*functions* of the jet coordinates, on which the induced left action is the +pullback along `g⁻¹`: +`(g · f)(B) = f (g⁻¹ • B)`. + +Component functions therefore shift contragrediently to the fields, by +`mc(g⁻¹) = -mc(g)` rather than by `+mc(g)`: + +`g • [∂_s B_ν] = [∂_s B_ν] - ⟨mc(g), ∂_s B_ν⟩ · 1`. + +Taking the pullback along `g` instead would give a right action; it is a +representation here only because the `U(1)` translations are abelian, and would +fail to be one for the `SU(2)` and `SU(3)` factors, whose Maurer–Cartan cocycle +satisfies `mc(g₁g₂) = Ad_{g₁} mc(g₂) + mc(g₁)`. + +-/ + +/-- The Maurer–Cartan shift of the component functions: minus the Maurer–Cartan + pairing, this being the pairing of the *inverse* jet, `⟨mc(U⁻¹), ·⟩`. This is + the shift appearing in the contragredient gauge action `repJetGaugeGroupI`. -/ +noncomputable def mcShift (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := + - mcPairing U + +lemma mcShift_apply (U : JetGaugeGroupI) (x : JetComponentSpace) : + mcShift U x = - mcPairing U x := rfl + +/-- The Maurer–Cartan shift on a general generator: minus the factorial-weighted + Taylor coefficient of the Maurer–Cartan series. -/ +lemma mcShift_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) : + mcShift U (JetComponentSpace.basis (.dB s ν)) = + - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s))) := by + rw [mcShift_apply, mcPairing_basis_dB'] + +/-- The Maurer–Cartan shift on first-order generators. -/ +lemma mcShift_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + mcShift U (JetComponentSpace.basis (.dB {μ} ν)) = + - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by + rw [mcShift_apply, mcPairing_basis_dB] + +@[simp] +lemma mcShift_one : mcShift 1 = 0 := by + rw [mcShift, mcPairing_one, neg_zero] + +/-- The Maurer–Cartan shift is additive in the jet. -/ +lemma mcShift_mul (U V : JetGaugeGroupI) : + mcShift (U * V) = mcShift U + mcShift V := by + rw [mcShift, mcShift, mcShift, mcPairing_mul, neg_add] + +/-- The Maurer–Cartan shift of a jet of constant gauge transformations + vanishes. -/ +lemma mcShift_ofConstant (g : GaugeGroupI) : + mcShift (JetGaugeGroupI.ofConstant g) = 0 := by + rw [mcShift, mcPairing_ofConstant, neg_zero] + +/-- The Maurer–Cartan shift inherits the symmetry of the first-order + Maurer–Cartan coefficients: the shift of `∂_{s+μ} B_ν` equals that of + `∂_{s+ν} B_μ`. This is the gauge invariance of the abelian field strength. -/ +lemma mcShift_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + mcShift U (JetComponentSpace.basis (.dB (s + {μ}) ν)) = + mcShift U (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by + rw [mcShift_apply, mcShift_apply, mcPairing_basis_dB_symm] + +/-- The constant coefficient of the iterated derivative of the Maurer–Cartan + series is minus the Maurer–Cartan shift of the corresponding B-boson component + function. -/ +lemma constantCoeff_maurerCartanU1Deriv_mcShift (U : JetGaugeGroupI) + (μ : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) : + MvPowerSeries.constantCoeff (maurerCartanU1Deriv U μ s) = + - ((mcShift U (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by + rw [constantCoeff_maurerCartanU1Deriv, mcShift_apply] + push_cast + ring /-! @@ -896,16 +1042,18 @@ noncomputable def complexRepLorentzGroupAlgHom (Λ : SL(2,ℂ)) : translation, whose linear part is the identity; consequently no information is carried by a linear action on the component space itself, and the action lives on the unital algebra: a jet of gauge transformations acts as the substitution - automorphism sending each generator `x` to `x + ⟨mc, x⟩ 1`, the pullback of the - translation `B ↦ B + i (∂u) ū` on polynomial functions of the jet - coordinates. On jets of constant gauge transformations the shift vanishes and - the action is trivial, in agreement with `repGaugeGroupI`. -/ + automorphism sending each generator `x` to `x + mcShift U x • 1`, i.e. to + `x - ⟨mc, x⟩ 1`. This is the pullback along `U⁻¹` of the field translation + `B ↦ B + i (∂u) ū`, the contragredient action, which is what makes this a left + action rather than a right one. On jets of constant gauge transformations the + shift vanishes and the action is trivial, in agreement with + `repGaugeGroupI`. -/ noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgebra where toFun U := (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)).toLinearMap + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)).toLinearMap map_one' := by - rw [show mcPairing (1 : JetGaugeGroupI) = 0 from mcPairing_one] + rw [show mcShift (1 : JetGaugeGroupI) = 0 from mcShift_one] suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = AlgHom.id ℝ JetAlgebra by @@ -914,14 +1062,14 @@ noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgeb refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp map_mul' U V := by - rw [show mcPairing (U * V : JetGaugeGroupI) = - mcPairing U + mcPairing V from mcPairing_mul U V] + rw [show mcShift (U * V : JetGaugeGroupI) = + mcShift U + mcShift V from mcShift_mul U V] suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (mcPairing U + mcPairing V)) = + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (mcShift U + mcShift V)) = (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)).comp + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)).comp (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing V)) by + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift V)) by rw [hs, AlgHom.comp_toLinearMap, Module.End.mul_eq_comp] refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp [add_assoc] @@ -932,7 +1080,7 @@ noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgeb lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : repJetGaugeGroupI U (SymmetricAlgebra.ι ℝ JetComponentSpace x) = SymmetricAlgebra.ι ℝ JetComponentSpace x + - algebraMap ℝ JetAlgebra (mcPairing U x) := by + algebraMap ℝ JetAlgebra (mcShift U x) := by simp [repJetGaugeGroupI, SymmetricAlgebra.lift_ι_apply, AlgHom.toLinearMap_apply, Algebra.linearMap_apply] @@ -940,12 +1088,12 @@ lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : lemma repJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : repJetGaugeGroupI U (x * y) = repJetGaugeGroupI U x * repJetGaugeGroupI U y := map_mul (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)) x y + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) x y lemma repJetGaugeGroupI_algebraMap (U : JetGaugeGroupI) (r : ℝ) : repJetGaugeGroupI U (algebraMap ℝ JetAlgebra r) = algebraMap ℝ JetAlgebra r := AlgHom.commutes (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)) r + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) r lemma repJetGaugeGroupI_one (U : JetGaugeGroupI) : repJetGaugeGroupI U (1 : JetAlgebra) = 1 := by @@ -960,21 +1108,21 @@ lemma repJetGaugeGroupI_one (U : JetGaugeGroupI) : lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) : SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (repJetGaugeGroupI U V) = MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) + MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := by have h : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom.comp (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U)) = + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) = (MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U (JetComponentSpace.basis g)))).comp + MvPolynomial.C (mcShift U (JetComponentSpace.basis g)))).comp (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom := by refine SymmetricAlgebra.algHom_ext (JetComponentSpace.basis.ext fun g => ?_) show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcPairing U) + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U) (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) = MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) + MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) ((SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) rw [SymmetricAlgebra.lift_ι_apply] @@ -992,8 +1140,8 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : rw [show repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ - mcPairing (JetGaugeGroupI.ofConstant g))) x from rfl, - mcPairing_ofConstant] + mcShift (JetGaugeGroupI.ofConstant g))) x from rfl, + mcShift_ofConstant] have h2 : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = AlgHom.id ℝ JetAlgebra := by @@ -1065,12 +1213,12 @@ lemma complexRepJetGaugeGroupI_one_tmul_one (U : JetGaugeGroupI) : lemma complexRepJetGaugeGroupI_ofGenerator (U : JetGaugeGroupI) (g : JetGenerators) : complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = (1 : ℂ) ⊗ₜ[ℝ] ofGenerator g + - ((mcPairing U (JetComponentSpace.basis g) : ℝ) : ℂ) • + ((mcShift U (JetComponentSpace.basis g) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by rw [complexRepJetGaugeGroupI_tmul, ofGenerator, repJetGaugeGroupI_ι, TensorProduct.tmul_add, Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, - show ((mcPairing U (JetComponentSpace.basis g) : ℝ) : ℂ) = - algebraMap ℝ ℂ (mcPairing U (JetComponentSpace.basis g)) from rfl, + show ((mcShift U (JetComponentSpace.basis g) : ℝ) : ℂ) = + algebraMap ℝ ℂ (mcShift U (JetComponentSpace.basis g)) from rfl, algebraMap_smul] /-- Jets of constant gauge transformations act trivially on the complexified @@ -1243,7 +1391,7 @@ noncomputable def mcDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) JetAlgebra →ₗ[ℝ] JetAlgebra := (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toLinearMap ∘ₗ (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing U (JetComponentSpace.basis + (MvPolynomial.C (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)).toLinearMap ∘ₗ (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toLinearMap @@ -1251,7 +1399,7 @@ noncomputable def mcDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) lemma mcDeriv_ofGenerator (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (g : JetGenerators) : mcDeriv U t (ofGenerator g) = algebraMap ℝ JetAlgebra - (mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) := by + (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) := by simp only [mcDeriv, ofGenerator, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, Derivation.coeFn_coe] rw [SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.mkDerivation_X, @@ -1298,7 +1446,7 @@ lemma equivMvPolynomial_mcDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fi (x : JetAlgebra) : SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (mcDeriv U t x) = (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing U (JetComponentSpace.basis + (MvPolynomial.C (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by simp only [mcDeriv, LinearMap.coe_comp, Function.comp_apply, @@ -1312,17 +1460,17 @@ lemma mcDeriv_jetDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) jetDeriv ν (mcDeriv U t x) + mcDeriv U (t + {ν}) x := by have key : ∀ p : MvPolynomial JetGenerators ℝ, (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing U (JetComponentSpace.basis + (MvPolynomial.C (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing U (JetComponentSpace.basis + (MvPolynomial.C (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) p) + (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing U (JetComponentSpace.basis + (MvPolynomial.C (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti (t + {ν}) g))) : MvPolynomial JetGenerators ℝ)) p := by intro p induction p using MvPolynomial.induction_on with @@ -1332,9 +1480,9 @@ lemma mcDeriv_jetDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) simp only [map_add, hp, hq] ring | mul_X p g ih => - have hlam : mcPairing U (JetComponentSpace.basis + have hlam : mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t (JetGenerators.shift ν g))) = - mcPairing U (JetComponentSpace.basis + mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti (t + {ν}) g)) := by rw [JetGenerators.shiftMulti_shift] simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, @@ -1359,17 +1507,17 @@ lemma repJetGaugeGroupI_jetDeriv (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) jetDeriv ν (repJetGaugeGroupI U x) + repJetGaugeGroupI U (mcDeriv U {ν} x) := by have key : ∀ p : MvPolynomial JetGenerators ℝ, MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) + MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) (MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) p) + + MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) p) + MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcPairing U (JetComponentSpace.basis g))) + MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcPairing U (JetComponentSpace.basis + (MvPolynomial.C (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti {ν} g))) : MvPolynomial JetGenerators ℝ)) p) := by intro p induction p using MvPolynomial.induction_on with @@ -1379,8 +1527,8 @@ lemma repJetGaugeGroupI_jetDeriv (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) simp only [map_add, hp, hq] ring | mul_X p g ih => - have hlam : mcPairing U (JetComponentSpace.basis (JetGenerators.shift ν g)) = - mcPairing U (JetComponentSpace.basis + have hlam : mcShift U (JetComponentSpace.basis (JetGenerators.shift ν g)) = + mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti {ν} g)) := by rw [JetGenerators.shiftMulti_singleton] simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, @@ -1440,12 +1588,12 @@ lemma mcDeriv_baseChange_jetDeriv (U : JetGaugeGroupI) lemma mcDeriv_baseChange_ofGenerator (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) (g : JetGenerators) : LinearMap.baseChange ℂ (mcDeriv U t) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = - ((mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) • + ((mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by rw [LinearMap.baseChange_tmul, mcDeriv_ofGenerator, Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, - show ((mcPairing U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) = - algebraMap ℝ ℂ (mcPairing U (JetComponentSpace.basis + show ((mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) = + algebraMap ℝ ℂ (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) from rfl, algebraMap_smul] @@ -1466,7 +1614,7 @@ lemma fieldStrength_antisymm (μ ν : Fin 1 ⊕ Fin 3) : lemma repJetGaugeGroupI_fieldStrength (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : repJetGaugeGroupI U (fieldStrength μ ν) = fieldStrength μ ν := by - simp only [fieldStrength, map_sub, ofGenerator, repJetGaugeGroupI_ι, mcPairing_basis_dB] + simp only [fieldStrength, map_sub, ofGenerator, repJetGaugeGroupI_ι, mcShift_basis_dB] rw [maurerCartanU1Coeff_single_symm] abel @@ -1482,7 +1630,7 @@ lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) (s : Multiset (F (μ ν : Fin 1 ⊕ Fin 3) : repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by simp only [fieldStrengthDeriv, map_sub, ofGenerator, repJetGaugeGroupI_ι] - rw [mcPairing_basis_dB_symm] + rw [mcShift_basis_dB_symm] abel lemma fieldStrengthDeriv_bianchi_identity (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν ρ : Fin 1 ⊕ Fin 3) : @@ -1831,6 +1979,18 @@ lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) · rw [if_neg hm] simp +/-- The Maurer–Cartan shift of the exponential gauge jet `exp(-i a X^t)` with + `a = r / t!`: it shifts precisely the component functions whose total + symmetrized multi-index is `t`, and shifts them all by `-r`. -/ +lemma mcShift_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) + (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) : + mcShift (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = + if s + {ν} = t then -r else 0 := by + rw [mcShift_apply, mcPairing_expUnitary] + split <;> simp + /-- The difference between a jet-algebra generator and its canonical representative is a derivative of the field strength, or zero. -/ lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : @@ -1913,12 +2073,12 @@ lemma mem_adjoin_of_forall_expUnitary (V : JetAlgebra) Multiset.toFinsupp.injective (by rw [h, Multiset.toFinsupp_zero]) simp at h0 have hconj := equivMvPolynomial_repJetGaugeGroupI - (expUnitary (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) + (expUnitary (-r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) (Multiset.toFinsupp (s₀ + {ν₀})) hne) V rw [hV _ _ _] at hconj have hfun : (fun g => MvPolynomial.X g + MvPolynomial.C - (mcPairing (expUnitary - (r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) + (mcShift (expUnitary + (-r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) (Multiset.toFinsupp (s₀ + {ν₀})) hne) (JetComponentSpace.basis g))) = fun g => MvPolynomial.X g + MvPolynomial.C @@ -1926,7 +2086,7 @@ lemma mem_adjoin_of_forall_expUnitary (V : JetAlgebra) then r else (0 : ℝ)) := by funext g obtain ⟨s, ν⟩ := g - rw [mcPairing_expUnitary (s₀ + {ν₀}) hne r s ν] + rw [mcShift_expUnitary (s₀ + {ν₀}) hne (-r) s ν, neg_neg] have hiff : (s + {ν} = s₀ + {ν₀}) ↔ (JetGenerators.canon (JetGenerators.dB s ν) = JetGenerators.canon (JetGenerators.dB s₀ ν₀)) := by From 7ca0e1d023b08569280d7ce24419175c92ce39c8 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 15:14:03 +0100 Subject: [PATCH 103/254] feat: Clean up --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 947 ++++++++---------- .../GaugeBosons/BBoson/Basic.lean | 367 ++++--- .../StandardModel/GaugeGroup/Jet.lean | 47 + 3 files changed, 651 insertions(+), 710 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 4f148d526..52a29d30f 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -351,140 +351,202 @@ lemma covMap_basis (g : LeptonSinglet.JetGenerators) : rw [covMap, Module.Basis.constr_basis] -/-- The inclusion of B-coefficiented degree-one fermionic elements into the QED - jet algebra. -/ -noncomputable def oddIncl : ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetComponentSpace) →ₗ[ℂ] JetAlgebra := - TensorProduct.map LinearMap.id (ExteriorAlgebra.ι ℂ) +/-! + +### The linear-matter submodule + +-/ -lemma oddIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) +/-- The linear-matter submodule: the elements of the jet algebra in which the + matter coordinates appear exactly linearly, spanned by the products of a + gauge-sector element with a single matter component function. + + The construction does not depend on the matter content. A jet algebra of this + shape is `G ⊗[ℂ] ExteriorAlgebra ℂ M`, with `G` the gauge-sector algebra and + `M` the space of matter component functions; the fermionic degree is the + exterior grading of the second factor, and degree one is the image of + `ExteriorAlgebra.ι`. For several matter species `M` is their direct sum and the + same definition applies verbatim. + + This is the submodule the covariance argument for the covariant derivatives + lives on. It is closed under the gauge group + (`repJetGaugeGroupI_mem_LinearMatterSubmodule`), under the total derivative + and under the covariant steps, and it is where the Maurer–Cartan anomaly + operators close: in higher fermionic degree they do not, because the gauge + action on the exterior algebra is an algebra map and so multiplies the + hypercharge characters. -/ +noncomputable def LinearMatterSubmodule : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x : JetAlgebra | ∃ (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace), x = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m} + +/-- The spanning elements: a gauge-sector coefficient times a single matter + component function. -/ +lemma tmul_ι_mem_LinearMatterSubmodule (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (m : LeptonSinglet.JetComponentSpace) : - oddIncl (p ⊗ₜ[ℂ] m) = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m := by - simp [oddIncl] + p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m ∈ LinearMatterSubmodule := + Submodule.subset_span ⟨p, m, rfl⟩ + +/-! + +The remaining results in this section are specific to *fermionic* matter: they +express that the linear-matter elements are odd. Nothing above depends on them, +and nothing that follows — the closure of the submodule under the derivative, +the covariant steps, or the gauge group — does either. For bosonic matter the +matter factor is a symmetric rather than an exterior algebra, the same +definition of `LinearMatterSubmodule` applies with the corresponding canonical +inclusion, and only this anticommutation block is dropped. + +-/ + +/-- Right distributivity on the jet algebra, with the multiplication forced to + the `JetAlgebra` instance. Stating it explicitly keeps `rw` from having to + match through the tensor-product instance path. -/ +lemma distrib_add_mul (a b c : JetAlgebra) : (a + b) * c = a * c + b * c := by grind + +/-- Left distributivity on the jet algebra; see `distrib_add_mul`. -/ +lemma distrib_mul_add (a b c : JetAlgebra) : a * (b + c) = a * b + a * c := by grind set_option maxHeartbeats 1000000 in -/-- Odd elements anticommute. -/ -lemma oddIncl_mul_add_swap (w w' : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetComponentSpace) : - oddIncl w * oddIncl w' + oddIncl w' * oddIncl w = 0 := by - have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind +/-- Linear-matter elements anticommute against the spanning elements. -/ +lemma tmul_ι_mul_add_swap_of_mem (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace) {y : JetAlgebra} + (hy : y ∈ LinearMatterSubmodule) : + (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * y + y * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = 0 := by + have hd₁ := distrib_add_mul + have hd₂ := distrib_mul_add have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction w using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, add_zero] - | add u v hu hv => - simp only [map_add, hd₁, hd₂] - calc oddIncl u * oddIncl w' + oddIncl v * oddIncl w' + - (oddIncl w' * oddIncl u + oddIncl w' * oddIncl v) = - (oddIncl u * oddIncl w' + oddIncl w' * oddIncl u) + - (oddIncl v * oddIncl w' + oddIncl w' * oddIncl v) := by abel + have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := + fun c a b => smul_mul_assoc c a b + have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := + fun c a b => mul_smul_comm c a b + induction hy using Submodule.span_induction with + | mem z hz => + obtain ⟨q, n, rfl⟩ := hz + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + mul_comm q p, ← TensorProduct.tmul_add, ExteriorAlgebra.ι_add_mul_swap, + TensorProduct.tmul_zero] + | zero => rw [hz₂, hz₁, add_zero] + | add u v _ _ hu hv => + rw [hd₂, hd₁] + calc (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + + (u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) = + ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) + + ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) := by + abel _ = 0 := by rw [hu, hv, add_zero] - | tmul p m => - induction w' using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, add_zero] - | add u v hu hv => - simp only [map_add, hd₁, hd₂] - calc oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + - (oddIncl u * oddIncl (p ⊗ₜ[ℂ] m) + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) = - (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl u + oddIncl u * oddIncl (p ⊗ₜ[ℂ] m)) + - (oddIncl (p ⊗ₜ[ℂ] m) * oddIncl v + oddIncl v * oddIncl (p ⊗ₜ[ℂ] m)) := by - abel + | smul c u _ hu => + rw [hs₂, hs₁, ← smul_add, hu, smul_zero] + +/-- Linear-matter elements anticommute: they are odd. -/ +lemma mul_add_swap_of_mem {x y : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) + (hy : y ∈ LinearMatterSubmodule) : x * y + y * x = 0 := by + have hd₁ := distrib_add_mul + have hd₂ := distrib_mul_add + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := + fun c a b => smul_mul_assoc c a b + have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := + fun c a b => mul_smul_comm c a b + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + exact tmul_ι_mul_add_swap_of_mem p m hy + | zero => rw [hz₁, hz₂, add_zero] + | add u v _ _ hu hv => + rw [hd₁, hd₂] + calc u * y + v * y + (y * u + y * v) = + (u * y + y * u) + (v * y + y * v) := by abel _ = 0 := by rw [hu, hv, add_zero] - | tmul q n => - rw [oddIncl_tmul, oddIncl_tmul, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, mul_comm q p, ← TensorProduct.tmul_add, - ExteriorAlgebra.ι_add_mul_swap, TensorProduct.tmul_zero] - -/-- Odd elements square to zero. -/ -lemma oddIncl_mul_self (w : (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetComponentSpace) : - oddIncl w * oddIncl w = 0 := by - have h := oddIncl_mul_add_swap w w - have h2 : (2 : ℂ) • (oddIncl w * oddIncl w) = 0 := by + | smul c u _ hu => + rw [hs₁, hs₂, ← smul_add, hu, smul_zero] + +/-- Linear-matter elements square to zero. -/ +lemma mul_self_of_mem {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : + x * x = 0 := by + have h2 : (2 : ℂ) • (x * x) = 0 := by rw [two_smul] - exact h + exact mul_add_swap_of_mem hx hx exact (smul_eq_zero.mp h2).resolve_left (by norm_num) -/-- The odd part is preserved by the total derivative. -/ -lemma jetDeriv_mem_range_oddIncl (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} - (hx : x ∈ LinearMap.range oddIncl) : jetDeriv μ x ∈ LinearMap.range oddIncl := by - obtain ⟨w, rfl⟩ := hx - induction w using TensorProduct.induction_on with - | zero => simp - | add u v hu hv => - rw [map_add, map_add] - exact Submodule.add_mem _ hu hv - | tmul p m => - rw [oddIncl_tmul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] - exact Submodule.add_mem _ ⟨_, oddIncl_tmul _ _⟩ ⟨_, oddIncl_tmul _ _⟩ - -/-- The odd part is preserved by multiplication by a gauge-field generator, - which lives in the bosonic factor. -/ -lemma dB_mul_mem_range_oddIncl (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} - (hx : x ∈ LinearMap.range oddIncl) : - [JetGenerators.dB {} μ]ₐ * x ∈ LinearMap.range oddIncl := by - obtain ⟨w, rfl⟩ := hx - refine ⟨TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) - LinearMap.id w, ?_⟩ - have key : oddIncl ∘ₗ TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) - LinearMap.id = - (LinearMap.mulLeft ℂ ([JetGenerators.dB {} μ]ₐ : JetAlgebra)) ∘ₗ oddIncl := by - refine TensorProduct.ext' fun p m => ?_ - simp only [LinearMap.comp_apply, TensorProduct.map_tmul, oddIncl_tmul, - LinearMap.mulLeft_apply, LinearMap.id_apply, - show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = +/-- The linear-matter submodule is preserved by the total derivative. -/ +lemma jetDeriv_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} + (hx : x ∈ LinearMatterSubmodule) : jetDeriv μ x ∈ LinearMatterSubmodule := by + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] + exact Submodule.add_mem _ (tmul_ι_mem_LinearMatterSubmodule _ _) + (tmul_ι_mem_LinearMatterSubmodule _ _) + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- The linear-matter submodule is preserved by multiplication by a gauge-field + generator, which lives in the bosonic factor. -/ +lemma dB_mul_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} + (hx : x ∈ LinearMatterSubmodule) : + [JetGenerators.dB {} μ]ₐ * x ∈ LinearMatterSubmodule := by + have hd₂ := distrib_mul_add + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := + fun c a b => mul_smul_comm c a b + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, Algebra.TensorProduct.tmul_mul_tmul, one_mul] - exact LinearMap.congr_fun key w - -/-- The covariant derivatives of the lepton are odd. -/ -lemma Dψ_mem_range_oddIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α ∈ LinearMap.range oddIncl := by + exact tmul_ι_mem_LinearMatterSubmodule _ _ + | zero => rw [hz₂]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [hd₂]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [hs₂]; exact Submodule.smul_mem _ _ hu + +/-- The covariant derivatives of the lepton are linear in the matter fields. -/ +lemma Dψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α ∈ LinearMatterSubmodule := by induction l with | nil => - exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - LeptonSinglet.JetComponentSpace.basis (.dψ {} α), by - rw [oddIncl_tmul]; rfl⟩ + rw [show Dψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dψ {} α)) from rfl] + exact tmul_ι_mem_LinearMatterSubmodule _ _ | cons ν l ih => simp only [Dψ_cons, covariantStep_apply] - exact Submodule.sub_mem _ (jetDeriv_mem_range_oddIncl ν ih) - (Submodule.smul_mem _ _ (dB_mul_mem_range_oddIncl ν ih)) + exact Submodule.sub_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) + (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) -/-- The covariant derivatives of the conjugate lepton are odd. -/ -lemma Dbarψ_mem_range_oddIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α ∈ LinearMap.range oddIncl := by +/-- The covariant derivatives of the conjugate lepton are linear in the matter + fields. -/ +lemma Dbarψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α ∈ LinearMatterSubmodule := by induction l with | nil => - exact ⟨((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α), by - rw [oddIncl_tmul]; rfl⟩ + rw [show Dbarψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl] + exact tmul_ι_mem_LinearMatterSubmodule _ _ | cons ν l ih => simp only [Dbarψ_cons, covariantStepBar_apply] - exact Submodule.add_mem _ (jetDeriv_mem_range_oddIncl ν ih) - (Submodule.smul_mem _ _ (dB_mul_mem_range_oddIncl ν ih)) + exact Submodule.add_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) + (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) -lemma covGenerator_mem_range_oddIncl (g : LeptonSinglet.JetGenerators) : - covGenerator g ∈ LinearMap.range oddIncl := by +lemma covGenerator_mem_LinearMatterSubmodule (g : LeptonSinglet.JetGenerators) : + covGenerator g ∈ LinearMatterSubmodule := by cases g with - | dψ s α => exact Dψ_mem_range_oddIncl (sortList s) α - | dbarψ s α => exact Dbarψ_mem_range_oddIncl (sortList s) α + | dψ s α => exact Dψ_mem_LinearMatterSubmodule (sortList s) α + | dbarψ s α => exact Dbarψ_mem_LinearMatterSubmodule (sortList s) α -lemma covMap_mem_range_oddIncl (m : LeptonSinglet.JetComponentSpace) : - covMap m ∈ LinearMap.range oddIncl := by +lemma covMap_mem_LinearMatterSubmodule (m : LeptonSinglet.JetComponentSpace) : + covMap m ∈ LinearMatterSubmodule := by rw [covMap, Module.Basis.constr_apply] exact Submodule.sum_mem _ fun g _ => - Submodule.smul_mem _ _ (covGenerator_mem_range_oddIncl g) + Submodule.smul_mem _ _ (covGenerator_mem_LinearMatterSubmodule g) lemma covMap_mul_self (m : LeptonSinglet.JetComponentSpace) : - covMap m * covMap m = 0 := by - obtain ⟨w, hw⟩ := covMap_mem_range_oddIncl m - rw [← hw] - exact oddIncl_mul_self w + covMap m * covMap m = 0 := + mul_self_of_mem (covMap_mem_LinearMatterSubmodule m) /-- The covariant substitution on the fermionic factor. -/ noncomputable def covExtHom : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := @@ -500,7 +562,7 @@ lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * y = y * (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) := by have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hd₂ := distrib_mul_add have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a induction y using TensorProduct.induction_on with @@ -581,6 +643,48 @@ lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetA (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] +/-- The gauge action on a spanning element of the linear-matter submodule: it + acts on the two factors separately, leaving the matter degree at one. This is + the only input the closure result needs, and it holds for any matter factor + whose gauge action is functorial in the component space. -/ +lemma repJetGaugeGroupI_tmul_ι (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace) : + repJetGaugeGroupI U (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U m) := by + rw [repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + ExteriorAlgebra.map_apply_ι] + +/-- The linear-matter submodule is closed under the gauge group: the gauge action + preserves the matter degree, because it acts on the matter factor functorially + in the component space and so intertwines with the canonical inclusion. -/ +lemma repJetGaugeGroupI_mem_LinearMatterSubmodule (U : JetGaugeGroupI) + {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : + repJetGaugeGroupI U x ∈ LinearMatterSubmodule := by + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + rw [repJetGaugeGroupI_tmul_ι] + exact tmul_ι_mem_LinearMatterSubmodule _ _ + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- The submodule form of `repJetGaugeGroupI_mem_LinearMatterSubmodule`. -/ +lemma map_repJetGaugeGroupI_LinearMatterSubmodule_le (U : JetGaugeGroupI) : + LinearMatterSubmodule.map (repJetGaugeGroupI U) ≤ LinearMatterSubmodule := by + rintro x ⟨y, hy, rfl⟩ + exact repJetGaugeGroupI_mem_LinearMatterSubmodule U hy + +/-- The gauge action restricts to an automorphism of the linear-matter + submodule: the reverse inclusion holds by applying the bound to `U⁻¹`. -/ +lemma map_repJetGaugeGroupI_LinearMatterSubmodule (U : JetGaugeGroupI) : + LinearMatterSubmodule.map (repJetGaugeGroupI U) = LinearMatterSubmodule := by + refine le_antisymm (map_repJetGaugeGroupI_LinearMatterSubmodule_le U) fun x hx => ?_ + exact ⟨repJetGaugeGroupI U⁻¹ x, + repJetGaugeGroupI_mem_LinearMatterSubmodule U⁻¹ hx, + repJetGaugeGroupI.self_inv_apply U x⟩ + /-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge transformations acts on it through the character of its value at the base point alone, with no derivative contributions. This is the base case of @@ -624,17 +728,13 @@ and covariance propagates along the covariant-derivative recursion. -/ -/-- The unconjugated lepton component functions. -/ -abbrev LeptonComponent : Type := - SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet +variable {W : Type*} [AddCommGroup W] [Module ℂ W] -/-- The lepton-linear elements: B-boson polynomials tensored with a single - unconjugated lepton component function. The covariant derivatives of `ψ` are - the images of such elements in the jet algebra. -/ -abbrev LeptonLinear : Type := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonComponent +/-- The linear-matter model over a matter target `W`: B-boson polynomials + tensored with a single matter component function. -/ +abbrev MatterLinear (W : Type*) [AddCommGroup W] [Module ℂ W] := + (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) -variable {W : Type*} [AddCommGroup W] [Module ℂ W] /-- The derivative action of a jet on component functions valued in any target `W`, acting on the derivative symbols. -/ @@ -690,138 +790,149 @@ lemma actionC_C (c : ℂ) (a : DerivAlgebraComplex ⊗[ℂ] W) : /-- The embedding of a lepton component function into the lepton jet algebra. -/ noncomputable def leptonComponentIncl : - LeptonComponent →ₗ[ℂ] LeptonSinglet.JetAlgebra := - (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inl ℂ LeptonComponent + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] LeptonSinglet.JetAlgebra := + (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet))) -lemma leptonComponentIncl_apply (a : LeptonComponent) : +lemma leptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : leptonComponentIncl a = ExteriorAlgebra.ι ℂ ((a, 0) : LeptonSinglet.JetComponentSpace) := rfl /-- The inclusion of the lepton-linear elements into the QED jet algebra. -/ -noncomputable def leptonLinearIncl : LeptonLinear →ₗ[ℂ] JetAlgebra := +noncomputable def leptonLinearIncl : + MatterLinear (Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] JetAlgebra := TensorProduct.map LinearMap.id leptonComponentIncl -lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : LeptonComponent) : +lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] leptonComponentIncl a := by simp [leptonLinearIncl] -/-- The covariant-derivative step `D_μ = ∂_μ - 6 i B_μ` on lepton-linear - elements. -/ -noncomputable def covariantStepAux (μ : Fin 1 ⊕ Fin 3) : - LeptonLinear →ₗ[ℂ] LeptonLinear := +/-- The derivative action of a jet on the zeroth-order lepton component: the + scalar action of its value at the base point. -/ +lemma actionC_one_tmul (χ : JetRing) (φ : W) : + actionC χ ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) = + MvPowerSeries.constantCoeff χ • + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) := by + rw [actionC, TensorProduct.map_tmul, DerivAlgebraComplex.jetRingAction_apply_one, + LinearMap.id_coe, id_eq, TensorProduct.smul_tmul'] + +/-! + +### The linear-matter model, uniformly in the matter species + +The covariance argument depends on the matter species only through two +parameters: the jet `χ` through which the gauge group acts on the matter +component functions, and the coupling `c` in the covariant step +`D_μ = ∂_μ + c B_μ`. They are tied together by the single hypothesis + +`∂_ν χ = -c · (mcShiftSeries U ν []) · χ` + +which is exactly what makes the anomaly cancel. Everything below is stated once, +for a general matter target `W`, and instantiated at each species: for the +charged lepton `χ = u^6`, `c = -6i`, and for its conjugate `χ = star u ^ 6`, +`c = +6i`, the hypothesis in both cases being `pderiv_pow_unitary_mcShiftSeries` +and its conjugate. + +-/ + +/-- The covariant step `D_μ = ∂_μ + c B_μ` on the linear-matter model. -/ +noncomputable def covStepM (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : + MatterLinear W →ₗ[ℂ] MatterLinear W := TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) LinearMap.id + - TensorProduct.map LinearMap.id (shiftC μ) - - ((6 : ℂ) * Complex.I) • - TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id - -lemma covariantStepAux_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : LeptonComponent) : - covariantStepAux μ (p ⊗ₜ[ℂ] a) = + TensorProduct.map LinearMap.id (shiftC μ) + + c • TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id + +lemma covStepM_tmul (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : DerivAlgebraComplex ⊗[ℂ] W) : + covStepM c μ (p ⊗ₜ[ℂ] a) = (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + - p ⊗ₜ[ℂ] shiftC μ a - - ((6 : ℂ) * Complex.I) • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + p ⊗ₜ[ℂ] shiftC μ a + + c • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by - simp [covariantStepAux] + simp [covStepM] -/-- The gauge action on lepton-linear elements. -/ -noncomputable def repAux (U : JetGaugeGroupI) : LeptonLinear →ₗ[ℂ] LeptonLinear := - TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) - (actionC (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) +/-- The gauge action on the linear-matter model, acting on the matter factor + through the jet `χ`. -/ +noncomputable def repM (U : JetGaugeGroupI) (χ : JetRing) : + MatterLinear W →ₗ[ℂ] MatterLinear W := + TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) (actionC χ) -lemma repAux_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : LeptonComponent) : - repAux U (p ⊗ₜ[ℂ] a) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - actionC (((U.2.2 : unitary JetRing) : JetRing) ^ 6) a := by - simp [repAux] - -/-- The Maurer–Cartan anomaly operators on lepton-linear elements: the - obstruction to the gauge action commuting with the covariant step, indexed by - the derivative history of the step. -/ -noncomputable def anomalyAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : LeptonLinear →ₗ[ℂ] LeptonLinear := +lemma repM_tmul (U : JetGaugeGroupI) (χ : JetRing) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : DerivAlgebraComplex ⊗[ℂ] W) : + repM U χ (p ⊗ₜ[ℂ] a) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] actionC χ a := by + simp [repM] + +/-- The Maurer–Cartan anomaly operators on the linear-matter model. -/ +noncomputable def anomalyM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : MatterLinear W →ₗ[ℂ] MatterLinear W := TensorProduct.map (LinearMap.baseChange ℂ - (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id - - ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + + (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id - - ((6 : ℂ) * Complex.I) • - TensorProduct.map LinearMap.id (actionC (BBoson.maurerCartanU1Deriv U μ s)) - -lemma anomalyAux_tmul (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : LeptonComponent) : - anomalyAux U s μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a - - ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis + c • TensorProduct.map LinearMap.id (actionC (BBoson.mcShiftSeries U μ s)) + +lemma anomalyM_tmul (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : DerivAlgebraComplex ⊗[ℂ] W) : + anomalyM U c s μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + + (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) - - ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.maurerCartanU1Deriv U μ s) a) := by - simp [anomalyAux] + c • (p ⊗ₜ[ℂ] actionC (BBoson.mcShiftSeries U μ s) a) := by + simp [anomalyM] + +/-- The shift series commutes with any other jet action. -/ +lemma actionC_mcShiftSeries_comm (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (s : List (Fin 1 ⊕ Fin 3)) (χ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : + actionC (BBoson.mcShiftSeries U μ s) (actionC χ a) = + actionC χ (actionC (BBoson.mcShiftSeries U μ s) a) := + actionC_comm _ _ a -/-- The zeroth-order lepton component as a lepton-linear element. -/ -noncomputable def ψAux (α : Fin 2) : LeptonLinear := +/-- The base vector of the model: a matter component function with trivial + derivative history and unit B-boson coefficient. -/ +noncomputable def baseM (φ : W) : MatterLinear W := ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] - LeptonSinglet.basis.dualBasis α) + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) -/-- The covariant derivative as a lepton-linear element. -/ -noncomputable def DψAux (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : LeptonLinear := - l.foldr (fun μ x => covariantStepAux μ x) (ψAux α) - -/-- The derivative actions of the Maurer–Cartan series and of a hypercharge - power commute. -/ -lemma actionC_maurerCartanU1_pow (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (maurerCartanU1 U μ) (actionC ((U.2.2 : JetRing) ^ q) a) = - actionC ((U.2.2 : JetRing) ^ q) (actionC (maurerCartanU1 U μ) a) := - actionC_comm _ _ a +/-- The covariant derivative in the model. -/ +noncomputable def DM (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : MatterLinear W := + l.foldr (fun μ x => covStepM c μ x) (baseM φ) -/-- The derivative actions of the Maurer–Cartan series and of a conjugate - hypercharge power commute. -/ -lemma actionC_maurerCartanU1_star_pow (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (q : ℕ) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (maurerCartanU1 U μ) (actionC (star (U.2.2 : JetRing) ^ q) a) = - actionC (star (U.2.2 : JetRing) ^ q) (actionC (maurerCartanU1 U μ) a) := - actionC_comm _ _ a +lemma DM_cons (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : + DM c (μ :: l) φ = covStepM c μ (DM c l φ) := rfl -/-- The derivative action of a jet on the zeroth-order lepton component: the - scalar action of its value at the base point. -/ -lemma actionC_one_tmul (χ : JetRing) (φ : W) : - actionC χ ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) = - MvPowerSeries.constantCoeff χ • - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) := by - rw [actionC, TensorProduct.map_tmul, DerivAlgebraComplex.jetRingAction_apply_one, - LinearMap.id_coe, id_eq, TensorProduct.smul_tmul'] +/-- Multiplication by the unit of the complexified B-boson jet algebra. -/ +lemma one_mul_complex (z : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [mul_add, ha, hb] + | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] /-- The gauge action commutes with the covariant step up to the gauge action of - the zeroth anomaly operator. -/ -lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (x : LeptonLinear) : - repAux U (covariantStepAux μ x) = - covariantStepAux μ (repAux U x) + repAux U (anomalyAux U [] μ x) := by - have h0 : (↑([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = - ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by - rw [Multiset.coe_nil, zero_add] - have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by - intro z - induction z using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [mul_add, ha, hb] - | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] - have key : (repAux U) ∘ₗ (covariantStepAux μ) = - (covariantStepAux μ) ∘ₗ (repAux U) + (repAux U) ∘ₗ (anomalyAux U [] μ) := by + the zeroth anomaly operator. This is where the hypothesis relating `χ` and `c` + is used, and the only place it is needed. -/ +lemma repM_covStepM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) + (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = + MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) + (μ : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : + repM U χ (covStepM c μ x) = + covStepM c μ (repM U χ x) + repM U χ (anomalyM U c [] μ x) := by + have key : (repM U χ) ∘ₗ (covStepM (W := W) c μ) = + (covStepM c μ) ∘ₗ (repM U χ) + (repM U χ) ∘ₗ (anomalyM U c [] μ) := by refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepAux_tmul, - anomalyAux_tmul, BBoson.maurerCartanU1Deriv_nil, map_add, map_smul, map_sub, - repAux_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] + simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, + anomalyM_tmul, map_add, map_smul, map_sub, + repM_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, - actionC_shiftC, BBoson.pderiv_pow_unitary, actionC_mul, actionC_C, + actionC_shiftC, hχ, actionC_mul, actionC_C, BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - actionC_maurerCartanU1_pow] + actionC_mcShiftSeries_comm] have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ) + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis @@ -833,7 +944,7 @@ lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by - rw [add_mul, smul_mul_assoc, hone] + rw [add_mul, smul_mul_assoc, one_mul_complex] simp only [hdist] simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, smul_add, smul_smul] @@ -843,10 +954,10 @@ lemma repAux_covariantStepAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) /-- The anomaly operators commute with the covariant step up to the anomaly operator with the derivative direction appended to its history. -/ -lemma anomalyAux_covariantStepAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : - anomalyAux U s μ (covariantStepAux ν x) = - covariantStepAux ν (anomalyAux U s μ x) + anomalyAux U (ν :: s) μ x := by +lemma anomalyM_covStepM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : + anomalyM U c s μ (covStepM c ν x) = + covStepM c ν (anomalyM U c s μ x) + anomalyM U c (ν :: s) μ x := by have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by @@ -864,113 +975,118 @@ lemma anomalyAux_covariantStepAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin rw [BBoson.mcShift_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] - have key : (anomalyAux U s μ) ∘ₗ (covariantStepAux ν) = - (covariantStepAux ν) ∘ₗ (anomalyAux U s μ) + anomalyAux U (ν :: s) μ := by + have key : (anomalyM U c s μ) ∘ₗ (covStepM (W := W) c ν) = + (covStepM c ν) ∘ₗ (anomalyM U c s μ) + anomalyM U c (ν :: s) μ := by refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepAux_tmul, - anomalyAux_tmul, map_add, map_smul, map_sub, BBoson.maurerCartanU1Deriv_cons] + simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, + anomalyM_tmul, map_add, map_smul, map_sub, BBoson.mcShiftSeries_cons] simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, BBoson.JetAlgebra.mcDeriv_baseChange_mul, BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] - have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by - intro z - induction z using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [mul_add, ha, hb] - | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] have hdist : (((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = ((BBoson.mcShift U (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • p := by - rw [smul_mul_assoc, hone] + rw [smul_mul_assoc, one_mul_complex] simp only [hdist] simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', smul_add, smul_smul] module exact LinearMap.congr_fun key x -/-- The anomaly operators annihilate the zeroth-order lepton component: the - constant coefficient of the iterated Maurer–Cartan derivative is the - Maurer–Cartan shift. -/ -lemma anomalyAux_ψAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - anomalyAux U s μ (ψAux α) = 0 := by - rw [ψAux, anomalyAux_tmul, LinearMap.baseChange_tmul] +/-- The anomaly operators annihilate the base vector. -/ +lemma anomalyM_baseM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : W) : anomalyM U c s μ (baseM φ) = 0 := by + rw [baseM, anomalyM_tmul, LinearMap.baseChange_tmul] simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, TensorProduct.zero_tmul, actionC_one_tmul, - BBoson.constantCoeff_maurerCartanU1Deriv_mcShift, - TensorProduct.tmul_smul, smul_smul, zero_sub] + BBoson.constantCoeff_mcShiftSeries, + TensorProduct.tmul_smul, smul_smul, zero_add] module -/-- The gauge action on the zeroth-order lepton component is the hypercharge - character of the value of the jet at the base point. -/ -lemma repAux_ψAux (U : JetGaugeGroupI) (α : Fin 2) : - repAux U (ψAux α) = - MvPowerSeries.constantCoeff (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - ψAux α := by - rw [ψAux, repAux_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] - simp only [BBoson.JetAlgebra.repJetGaugeGroupI_one, actionC_one_tmul, +/-- The gauge action on the base vector is the value of `χ` at the base point. -/ +lemma repM_baseM (U : JetGaugeGroupI) (χ : JetRing) (φ : W) : + repM U χ (baseM φ) = MvPowerSeries.constantCoeff χ • baseM φ := by + rw [baseM, repM_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] + simp only [BBoson.JetAlgebra.repJetGaugeGroupI_apply_one, actionC_one_tmul, TensorProduct.tmul_smul] -/-- Every anomaly operator annihilates every covariant derivative of the charged - lepton. -/ -lemma anomalyAux_DψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), - anomalyAux U s μ (DψAux l α) = 0 := by +/-- Every anomaly operator annihilates every covariant derivative. -/ +lemma anomalyM_DM (U : JetGaugeGroupI) (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : + ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), anomalyM U c s μ (DM c l φ) = 0 := by induction l with - | nil => exact fun s μ => anomalyAux_ψAux U s μ α + | nil => exact fun s μ => anomalyM_baseM U c s μ φ | cons ν l ih => intro s μ - rw [show DψAux (ν :: l) α = covariantStepAux ν (DψAux l α) from rfl, - anomalyAux_covariantStepAux, ih s μ, map_zero, zero_add, ih (ν :: s) μ] - -/-- Covariance of the covariant derivatives on the lepton-linear model. -/ -lemma repAux_DψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repAux U (DψAux l α) = - MvPowerSeries.constantCoeff (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - DψAux l α := by + rw [DM_cons, anomalyM_covStepM, ih s μ, map_zero, zero_add, ih (ν :: s) μ] + +/-- Covariance of the covariant derivatives on the linear-matter model. -/ +lemma repM_DM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) + (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = + MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) + (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : + repM U χ (DM c l φ) = MvPowerSeries.constantCoeff χ • DM c l φ := by induction l with - | nil => exact repAux_ψAux U α + | nil => exact repM_baseM U χ φ | cons ν l ih => - rw [show DψAux (ν :: l) α = covariantStepAux ν (DψAux l α) from rfl, - repAux_covariantStepAux, ih, map_smul, anomalyAux_DψAux U l α [] ν, map_zero, - add_zero] + rw [DM_cons, repM_covStepM U χ c hχ, ih, map_smul, anomalyM_DM U c l φ [] ν, + map_zero, add_zero] + +/-! + +### Instantiation at the unconjugated lepton + +-/ + +/-- The unconjugated lepton acts through `χ = u ^ 6` with coupling `c = -6i`. -/ +lemma pderiv_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + MvPowerSeries.pderiv ℂ ν (((U.2.2 : unitary JetRing) : JetRing) ^ 6) = + MvPowerSeries.C (-(-(6 : ℂ) * Complex.I)) * + (BBoson.mcShiftSeries U ν [] * ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by + rw [BBoson.pderiv_pow_unitary_mcShiftSeries] + norm_num /-- The inclusion intertwines the covariant steps. -/ -lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) (x : LeptonLinear) : - covariantStep μ (leptonLinearIncl x) = leptonLinearIncl (covariantStepAux μ x) := by +lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) + (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : + covariantStep μ (leptonLinearIncl x) = + leptonLinearIncl (covStepM (-(6 : ℂ) * Complex.I) μ x) := by have key : (covariantStep μ) ∘ₗ leptonLinearIncl = - leptonLinearIncl ∘ₗ (covariantStepAux μ) := by + leptonLinearIncl ∘ₗ (covStepM (-(6 : ℂ) * Complex.I) μ) := by refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covariantStepAux_tmul, - leptonComponentIncl_apply, covariantStep_apply, map_add, map_sub, map_smul, + simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covStepM_tmul, + leptonComponentIncl_apply, covariantStep_apply, map_add, map_smul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, Algebra.TensorProduct.tmul_mul_tmul, one_mul] + module exact LinearMap.congr_fun key x /-- The inclusion intertwines the gauge actions. -/ -lemma repJetGaugeGroupI_leptonLinearIncl (U : JetGaugeGroupI) (x : LeptonLinear) : - repJetGaugeGroupI U (leptonLinearIncl x) = leptonLinearIncl (repAux U x) := by +lemma repJetGaugeGroupI_leptonLinearIncl (U : JetGaugeGroupI) + (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : + repJetGaugeGroupI U (leptonLinearIncl x) = + leptonLinearIncl (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by have key : (repJetGaugeGroupI U) ∘ₗ leptonLinearIncl = - leptonLinearIncl ∘ₗ (repAux U) := by + leptonLinearIncl ∘ₗ (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, repAux_tmul, + simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, repM_tmul, leptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl', actionC] exact LinearMap.congr_fun key x -/-- The covariant derivatives are the images of their lepton-linear models. -/ +/-- The covariant derivatives are the images of their linear-matter models. -/ lemma Dψ_eq_leptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α = leptonLinearIncl (DψAux l α) := by + Dψ l α = leptonLinearIncl (DM (-(6 : ℂ) * Complex.I) l + (LeptonSinglet.basis.dualBasis α)) := by induction l with | nil => - rw [Dψ_nil, show DψAux [] α = ψAux α from rfl, ψAux, leptonLinearIncl_tmul, + rw [Dψ_nil, show DM (-(6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.dualBasis α) = + baseM (LeptonSinglet.basis.dualBasis α) from rfl, baseM, leptonLinearIncl_tmul, leptonComponentIncl_apply] simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, LeptonSinglet.JetComponentSpace.basis_dψ_nil] @@ -987,9 +1103,9 @@ lemma repJetGaugeGroupI_Dψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) ( repJetGaugeGroupI U (Dψ l α) = U.eval.2.2 ^ 6 • Dψ l α := by have hval : ((U.eval.2.2 : unitary ℂ) : ℂ) = MvPowerSeries.constantCoeff ((U.2.2 : unitary JetRing) : JetRing) := rfl - rw [Dψ_eq_leptonLinearIncl, repJetGaugeGroupI_leptonLinearIncl, repAux_DψAux, - map_smul, ← Dψ_eq_leptonLinearIncl, Submonoid.smul_def, SubmonoidClass.coe_pow, - hval, map_pow] + rw [Dψ_eq_leptonLinearIncl, repJetGaugeGroupI_leptonLinearIncl, + repM_DM U _ _ (pderiv_pow_six U), map_smul, ← Dψ_eq_leptonLinearIncl, + Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] /-! @@ -1005,281 +1121,76 @@ model, with the coupling `6 i` replaced by `- 6 i` throughout. -/ -/-- The conjugate lepton component functions. -/ -abbrev ConjLeptonComponent : Type := - SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet) - -/-- The conjugate-linear elements: B-boson polynomials tensored with a single - conjugate lepton component function. -/ -abbrev ConjLeptonLinear : Type := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] ConjLeptonComponent - /-- The embedding of a conjugate lepton component function into the lepton jet algebra. -/ noncomputable def conjLeptonComponentIncl : - ConjLeptonComponent →ₗ[ℂ] LeptonSinglet.JetAlgebra := + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] + LeptonSinglet.JetAlgebra := (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inr ℂ (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) ConjLeptonComponent) + Module.Dual ℂ LeptonSinglet) (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet))) -lemma conjLeptonComponentIncl_apply (a : ConjLeptonComponent) : +lemma conjLeptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : conjLeptonComponentIncl a = ExteriorAlgebra.ι ℂ ((0, a) : LeptonSinglet.JetComponentSpace) := rfl /-- The inclusion of the conjugate-linear elements into the QED jet algebra. -/ -noncomputable def conjLeptonLinearIncl : ConjLeptonLinear →ₗ[ℂ] JetAlgebra := +noncomputable def conjLeptonLinearIncl : + MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] JetAlgebra := TensorProduct.map LinearMap.id conjLeptonComponentIncl lemma conjLeptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : ConjLeptonComponent) : + (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] conjLeptonComponentIncl a := by simp [conjLeptonLinearIncl] -/-- The covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` on conjugate-linear - elements. -/ -noncomputable def covariantStepBarAux (μ : Fin 1 ⊕ Fin 3) : - ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := - TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) - LinearMap.id + - TensorProduct.map LinearMap.id (shiftC μ) + - ((6 : ℂ) * Complex.I) • - TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id - -lemma covariantStepBarAux_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : ConjLeptonComponent) : - covariantStepBarAux μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + - p ⊗ₜ[ℂ] shiftC μ a + - ((6 : ℂ) * Complex.I) • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by - simp [covariantStepBarAux] - -/-- The gauge action on conjugate-linear elements. -/ -noncomputable def repBarAux (U : JetGaugeGroupI) : ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := - TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) - (actionC (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6)) - -lemma repBarAux_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : ConjLeptonComponent) : - repBarAux U (p ⊗ₜ[ℂ] a) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - actionC (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) a := by - simp [repBarAux] - -/-- The Maurer–Cartan anomaly operators on conjugate-linear elements: the - obstruction to the gauge action commuting with the conjugate covariant step, - with the couplings of the unconjugated case negated. -/ -noncomputable def anomalyBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : ConjLeptonLinear →ₗ[ℂ] ConjLeptonLinear := - TensorProduct.map (LinearMap.baseChange ℂ - (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + - ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id + - ((6 : ℂ) * Complex.I) • - TensorProduct.map LinearMap.id (actionC (BBoson.maurerCartanU1Deriv U μ s)) - -lemma anomalyBarAux_tmul (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : ConjLeptonComponent) : - anomalyBarAux U s μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + - ((6 : ℂ) * Complex.I * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) + - ((6 : ℂ) * Complex.I) • (p ⊗ₜ[ℂ] actionC (BBoson.maurerCartanU1Deriv U μ s) a) := by - simp [anomalyBarAux] - -/-- The zeroth-order conjugate-lepton component as a conjugate-linear element. -/ -noncomputable def ψBarAux (α : Fin 2) : ConjLeptonLinear := - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] - LeptonSinglet.basis.conj.dualBasis α) - -/-- The conjugate covariant derivative as a conjugate-linear element. -/ -noncomputable def DbarψAux (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : ConjLeptonLinear := - l.foldr (fun μ x => covariantStepBarAux μ x) (ψBarAux α) - -set_option maxHeartbeats 1000000 in -set_option linter.unusedSimpArgs false in -/-- The gauge action commutes with the conjugate covariant step up to the gauge - action of the zeroth conjugate anomaly operator. -/ -lemma repBarAux_covariantStepBarAux (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (x : ConjLeptonLinear) : - repBarAux U (covariantStepBarAux μ x) = - covariantStepBarAux μ (repBarAux U x) + repBarAux U (anomalyBarAux U [] μ x) := by - have h0 : (↑([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = - ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by - rw [Multiset.coe_nil, zero_add] - have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by - intro z - induction z using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [mul_add, ha, hb] - | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] - have key : (repBarAux U) ∘ₗ (covariantStepBarAux μ) = - (covariantStepBarAux μ) ∘ₗ (repBarAux U) + (repBarAux U) ∘ₗ (anomalyBarAux U [] μ) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepBarAux_tmul, - anomalyBarAux_tmul, BBoson.maurerCartanU1Deriv_nil, map_add, map_smul, map_sub, - repBarAux_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] - simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, - actionC_shiftC, BBoson.pderiv_pow_unitary_star, actionC_mul, actionC_C, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - actionC_maurerCartanU1_star_pow] - have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB 0 μ) + - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by - rw [add_mul, smul_mul_assoc, hone] - simp only [hdist] - simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, TensorProduct.tmul_sub, - TensorProduct.sub_tmul, ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, - smul_add, smul_sub, smul_smul, Nat.cast_ofNat] - module - exact LinearMap.congr_fun key x - -set_option linter.unusedSimpArgs false in -/-- The conjugate anomaly operators commute with the conjugate covariant step up - to the anomaly operator with the derivative direction appended. -/ -lemma anomalyBarAux_covariantStepBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) (x : ConjLeptonLinear) : - anomalyBarAux U s μ (covariantStepBarAux ν x) = - covariantStepBarAux ν (anomalyBarAux U s μ x) + anomalyBarAux U (ν :: s) μ x := by - have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = - (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by - rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by - rw [Multiset.singleton_add, Multiset.cons_coe]] - ac_rfl - have hshift : BBoson.JetGenerators.shiftMulti ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) - (BBoson.JetGenerators.dB {} ν) = - BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by - rw [BBoson.JetGenerators.shiftMulti_dB] - congr 1 - have hm : BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = - BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by - rw [BBoson.mcShift_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = - ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by - rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] - have key : (anomalyBarAux U s μ) ∘ₗ (covariantStepBarAux ν) = - (covariantStepBarAux ν) ∘ₗ (anomalyBarAux U s μ) + anomalyBarAux U (ν :: s) μ := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covariantStepBarAux_tmul, - anomalyBarAux_tmul, map_add, map_smul, map_sub, BBoson.maurerCartanU1Deriv_cons] - simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, - BBoson.JetAlgebra.mcDeriv_baseChange_mul, - BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] - have hone : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by - intro z - induction z using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [mul_add, ha, hb] - | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] - have hdist : (((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • - p := by - rw [smul_mul_assoc, hone] - simp only [hdist] - simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, TensorProduct.tmul_sub, - TensorProduct.sub_tmul, ← TensorProduct.smul_tmul', smul_add, smul_sub, smul_smul] - module - exact LinearMap.congr_fun key x - -/-- The conjugate anomaly operators annihilate the zeroth-order conjugate-lepton - component. -/ -lemma anomalyBarAux_ψBarAux (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - anomalyBarAux U s μ (ψBarAux α) = 0 := by - rw [ψBarAux, anomalyBarAux_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, actionC_one_tmul, - BBoson.constantCoeff_maurerCartanU1Deriv_mcShift, - TensorProduct.tmul_smul, smul_smul, zero_add] - module - -/-- The gauge action on the zeroth-order conjugate-lepton component is the - conjugate hypercharge character of the value of the jet at the base point. -/ -lemma repBarAux_ψBarAux (U : JetGaugeGroupI) (α : Fin 2) : - repBarAux U (ψBarAux α) = - MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - ψBarAux α := by - rw [ψBarAux, repBarAux_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] - simp only [BBoson.JetAlgebra.repJetGaugeGroupI_one, actionC_one_tmul, - TensorProduct.tmul_smul] - -/-- Every conjugate anomaly operator annihilates every conjugate covariant - derivative. -/ -lemma anomalyBarAux_DbarψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), - anomalyBarAux U s μ (DbarψAux l α) = 0 := by - induction l with - | nil => exact fun s μ => anomalyBarAux_ψBarAux U s μ α - | cons ν l ih => - intro s μ - rw [show DbarψAux (ν :: l) α = covariantStepBarAux ν (DbarψAux l α) from rfl, - anomalyBarAux_covariantStepBarAux, ih s μ, map_zero, zero_add, ih (ν :: s) μ] - -/-- Covariance of the conjugate covariant derivatives on the conjugate-linear - model. -/ -lemma repBarAux_DbarψAux (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repBarAux U (DbarψAux l α) = - MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - DbarψAux l α := by - induction l with - | nil => exact repBarAux_ψBarAux U α - | cons ν l ih => - rw [show DbarψAux (ν :: l) α = covariantStepBarAux ν (DbarψAux l α) from rfl, - repBarAux_covariantStepBarAux, ih, map_smul, anomalyBarAux_DbarψAux U l α [] ν, - map_zero, add_zero] +/-- The conjugate lepton acts through `χ = star u ^ 6` with coupling `c = +6i`. -/ +lemma pderiv_star_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + MvPowerSeries.pderiv ℂ ν (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) = + MvPowerSeries.C (-((6 : ℂ) * Complex.I)) * + (BBoson.mcShiftSeries U ν [] * star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by + rw [BBoson.pderiv_pow_unitary_star_mcShiftSeries] + norm_num /-- The inclusion intertwines the conjugate covariant steps. -/ -lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) (x : ConjLeptonLinear) : +lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) + (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : covariantStepBar μ (conjLeptonLinearIncl x) = - conjLeptonLinearIncl (covariantStepBarAux μ x) := by + conjLeptonLinearIncl (covStepM ((6 : ℂ) * Complex.I) μ x) := by have key : (covariantStepBar μ) ∘ₗ conjLeptonLinearIncl = - conjLeptonLinearIncl ∘ₗ (covariantStepBarAux μ) := by + conjLeptonLinearIncl ∘ₗ (covStepM ((6 : ℂ) * Complex.I) μ) := by refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, covariantStepBarAux_tmul, + simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, covStepM_tmul, conjLeptonComponentIncl_apply, covariantStepBar_apply, map_add, map_smul, - map_sub, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, LeptonSinglet.JetComponentSpace.jetDeriv_inr', ofGenerator, shiftC, Algebra.TensorProduct.tmul_mul_tmul, one_mul] exact LinearMap.congr_fun key x /-- The inclusion intertwines the gauge actions. -/ -lemma repJetGaugeGroupI_conjLeptonLinearIncl (U : JetGaugeGroupI) (x : ConjLeptonLinear) : - repJetGaugeGroupI U (conjLeptonLinearIncl x) = conjLeptonLinearIncl (repBarAux U x) := by +lemma repJetGaugeGroupI_conjLeptonLinearIncl (U : JetGaugeGroupI) + (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : + repJetGaugeGroupI U (conjLeptonLinearIncl x) = + conjLeptonLinearIncl (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by have key : (repJetGaugeGroupI U) ∘ₗ conjLeptonLinearIncl = - conjLeptonLinearIncl ∘ₗ (repBarAux U) := by + conjLeptonLinearIncl ∘ₗ (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, repBarAux_tmul, + simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, repM_tmul, conjLeptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr', actionC] exact LinearMap.congr_fun key x -/-- The conjugate covariant derivatives are the images of their conjugate-linear +/-- The conjugate covariant derivatives are the images of their linear-matter models. -/ lemma Dbarψ_eq_conjLeptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α = conjLeptonLinearIncl (DbarψAux l α) := by + Dbarψ l α = conjLeptonLinearIncl (DM ((6 : ℂ) * Complex.I) l + (LeptonSinglet.basis.conj.dualBasis α)) := by induction l with | nil => - rw [Dbarψ_nil, show DbarψAux [] α = ψBarAux α from rfl, ψBarAux, + rw [Dbarψ_nil, show DM ((6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.conj.dualBasis α) = + baseM (LeptonSinglet.basis.conj.dualBasis α) from rfl, baseM, conjLeptonLinearIncl_tmul, conjLeptonComponentIncl_apply] simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, LeptonSinglet.JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.basis_nil] @@ -1297,8 +1208,8 @@ lemma repJetGaugeGroupI_Dbarψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) rw [Unitary.coe_star, JetRing.constantCoeff_star] rfl rw [Dbarψ_eq_conjLeptonLinearIncl, repJetGaugeGroupI_conjLeptonLinearIncl, - repBarAux_DbarψAux, map_smul, ← Dbarψ_eq_conjLeptonLinearIncl, Submonoid.smul_def, - SubmonoidClass.coe_pow, hval, map_pow] + repM_DM U _ _ (pderiv_star_pow_six U), map_smul, ← Dbarψ_eq_conjLeptonLinearIncl, + Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] /-! @@ -1333,7 +1244,7 @@ noncomputable def complexRepAlgHom (U : JetGaugeGroupI) : AlgHom.ofLinearMap (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) (by rw [Algebra.TensorProduct.one_def, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul, - BBoson.JetAlgebra.repJetGaugeGroupI_one]) + BBoson.JetAlgebra.repJetGaugeGroupI_apply_one]) (BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul U) @[simp] diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index 77a812eb1..9fe4290e0 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -74,6 +74,7 @@ the first sum collapses to `[∂_s B_μ]` and the shift is simply `-∂_s mc(g)_ `g • [∂_s B_μ] = [∂_s B_μ] - ∂_s mc(g)_μ` This is `mcShift`, and it is the sign used by `repJetGaugeGroupI`. +This relation is written down explicitly in `repJetGaugeGroupI_apply_ofGenerator`. -/ @@ -481,23 +482,40 @@ noncomputable def JetComponentSpace.repLorentzGroup : The jet gauge group does not act linearly on the B-boson fields. -For a general gauge theory (potentially non-abelian), +For a general gauge theory (potentially non-abelian), the *fields* transform by `∂_s B_μ ↦ ∂_s (g • B_μ) = ∂_s (Ad_g B_μ + mc(g)_μ) = ∂_s (Ad_g B_μ) + ∂_s mc(g)_μ` The last term in this expression is a real number. +The jet algebra, however, is the algebra of polynomial *functions* of the jet +coordinates, on which the induced left action is the pullback along `g⁻¹`, + +`(g · f)(B) = f (g⁻¹ • B)`, + +so the component functions shift contragrediently to the fields, by +`mc(g⁻¹) = -mc(g)` rather than by `+mc(g)`: + +`g • [∂_s B_ν] = [∂_s B_ν] - ⟨mc(g), ∂_s B_ν⟩ · 1`. + +Pulling back along `g` instead would give a right action; that would still be a +representation here, but only because the `U(1)` translations are abelian, and +it would fail to be one for the `SU(2)` and `SU(3)` factors, whose Maurer–Cartan +cocycle satisfies `mc(g₁g₂) = Ad_{g₁} mc(g₂) + mc(g₁)`. The shift below carries +the contragredient sign for this reason. + -/ open LagrangianTheory -/-- The Maurer–Cartan pairing `⟨mc, ∂_s B_ν⟩`: the component function evaluated - against the B-boson whose components are the factorial-weighted Taylor - coefficients — the `s`-th derivatives at the base point — of the Maurer–Cartan - series. This is the shift of the *field* `∂_s B_ν` under the gauge action; the - component functions shift by its negative, `mcShift`. -/ -noncomputable def mcPairing (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := - TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp +/-- The Maurer–Cartan shift `-⟨mc, ∂_s B_ν⟩` of the component functions: minus + the component function evaluated against the B-boson whose components are the + factorial-weighted Taylor coefficients — the `s`-th derivatives at the base + point — of the Maurer–Cartan series. Equivalently the pairing of the *inverse* + jet, `⟨mc(U⁻¹), ·⟩`. The sign is the contragredient one: the fields shift by + `+mc`, the functions of them by `-mc`. -/ +noncomputable def mcShift (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := + - TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩)) @@ -516,28 +534,28 @@ lemma jetComponentSpace_basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 rw [JetComponentSpace.basis, Module.Basis.reindex_apply, Equiv.symm_symm] exact Module.Basis.tensorProduct_apply' _ _ _ -/-- The Maurer–Cartan pairing on a pure tensor over a derivative-symbol basis - vector: the component function evaluated on the B boson of factorial-weighted - Taylor coefficients of the Maurer–Cartan series. -/ -lemma mcPairing_tmul_basis (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) +/-- The Maurer–Cartan shift on a pure tensor over a derivative-symbol basis + vector: minus the component function evaluated on the B boson of + factorial-weighted Taylor coefficients of the Maurer–Cartan series. -/ +lemma mcShift_tmul_basis (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ BBoson) : - mcPairing U (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] φ) = - φ ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] + mcShift U (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] φ) = + - φ ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν (Multiset.toFinsupp s))⟩ := by - rw [dualRealJetAlgebraBasis_apply', mcPairing] + rw [dualRealJetAlgebraBasis_apply', mcShift, LinearMap.neg_apply, neg_inj] show φ ((Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ _) (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s))) = _ rw [Module.Basis.constr_basis] -/-- The Maurer–Cartan pairing on a general generator: the factorial-weighted +/-- The Maurer–Cartan shift on a general generator: minus the factorial-weighted Taylor coefficient of the Maurer–Cartan series. -/ -lemma mcPairing_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcShift_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - mcPairing U (JetComponentSpace.basis (.dB s ν)) = - (∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s)) := by - rw [jetComponentSpace_basis_dB, mcPairing_tmul_basis, + mcShift U (JetComponentSpace.basis (.dB s ν)) = + - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • + Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s))) := by + rw [jetComponentSpace_basis_dB, mcShift_tmul_basis, neg_inj, show (⟨∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = @@ -557,13 +575,13 @@ lemma mcPairing_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) rw [Finset.sum_ite_eq' Finset.univ ν] simp -/-- The Maurer–Cartan pairing on first-order generators: the shift of the component - function `∂_μ B_ν` is the first-order Taylor coefficient of the Maurer–Cartan - series. -/ -lemma mcPairing_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : - mcPairing U (JetComponentSpace.basis (.dB {μ} ν)) = - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by - rw [mcPairing_basis_dB', Multiset.toFinsupp_singleton, +/-- The Maurer–Cartan shift on first-order generators: the shift of the component + function `∂_μ B_ν` is minus the first-order Taylor coefficient of the + Maurer–Cartan series. -/ +lemma mcShift_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + mcShift U (JetComponentSpace.basis (.dB {μ} ν)) = + - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by + rw [mcShift_basis_dB', neg_inj, Multiset.toFinsupp_singleton, show (∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) = 1 from Finset.prod_eq_one fun ρ _ => by rcases eq_or_ne μ ρ with rfl | h @@ -573,25 +591,26 @@ lemma mcPairing_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : one_smul] @[simp] -lemma mcPairing_one : mcPairing 1 = 0 := by +lemma mcShift_one : mcShift 1 = 0 := by refine JetComponentSpace.basis.ext fun g => ?_ obtain ⟨s, ν⟩ := g - simp [mcPairing_basis_dB'] + simp [mcShift_basis_dB'] -/-- The Maurer–Cartan pairing is additive in the jet. -/ -lemma mcPairing_mul (U V : JetGaugeGroupI) : - mcPairing (U * V) = mcPairing U + mcPairing V := by +/-- The Maurer–Cartan shift is additive in the jet. -/ +lemma mcShift_mul (U V : JetGaugeGroupI) : + mcShift (U * V) = mcShift U + mcShift V := by refine JetComponentSpace.basis.ext fun g => ?_ obtain ⟨s, ν⟩ := g - simp [mcPairing_basis_dB', maurerCartanU1Coeff_mul, smul_add] + simp only [mcShift_basis_dB', maurerCartanU1Coeff_mul, map_add, smul_add, + LinearMap.add_apply, neg_add] -/-- The Maurer–Cartan pairing of a jet of constant gauge transformations +/-- The Maurer–Cartan shift of a jet of constant gauge transformations vanishes. -/ -lemma mcPairing_ofConstant (g : GaugeGroupI) : - mcPairing (JetGaugeGroupI.ofConstant g) = 0 := by +lemma mcShift_ofConstant (g : GaugeGroupI) : + mcShift (JetGaugeGroupI.ofConstant g) = 0 := by refine JetComponentSpace.basis.ext fun j => ?_ obtain ⟨s, ν⟩ := j - simp [mcPairing_basis_dB'] + simp [mcShift_basis_dB'] /-- The factorial weight of a multi-index augmented by one derivative: the multiplicity of the new index times the original weight. -/ @@ -610,11 +629,11 @@ lemma prod_factorial_add_single (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (κ : Fin 1 /-- Exchanging the field index with a derivative index leaves the Maurer–Cartan shift of the component functions unchanged: the shift is the jet of a gradient, whose Taylor coefficients depend only on the total multi-index. -/ -lemma mcPairing_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcShift_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - mcPairing U (JetComponentSpace.basis (.dB (s + {μ}) ν)) = - mcPairing U (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by - rw [mcPairing_basis_dB', mcPairing_basis_dB', + mcShift U (JetComponentSpace.basis (.dB (s + {μ}) ν)) = + mcShift U (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by + rw [mcShift_basis_dB', mcShift_basis_dB', neg_inj, show Multiset.toFinsupp (s + {μ}) = Multiset.toFinsupp s + Finsupp.single μ 1 from by rw [map_add, Multiset.toFinsupp_singleton], show Multiset.toFinsupp (s + {ν}) = Multiset.toFinsupp s + Finsupp.single ν 1 from by @@ -629,44 +648,54 @@ lemma mcPairing_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin /-! -## Iterated derivatives of the Maurer–Cartan series +## The Maurer–Cartan shift series The covariance of the covariant derivatives of charged fields rests on the higher Maurer–Cartan anomalies: the iterated formal derivatives of the -Maurer–Cartan series. Their constant coefficients are the Maurer–Cartan -pairings of the corresponding B-boson component functions. +Maurer–Cartan series. + +The lepton sector consumes these as a whole power series — `actionC` is the +adjoint of multiplication and reads every Taylor coefficient — whereas the +B-boson sector only ever needs one scalar per generator, `mcShift`. The two are +the same data in different presentations, so the series is carried with the same +contragredient sign as `mcShift`: `mcShiftSeries` is minus the iterated +derivative of the Maurer–Cartan form, which makes it exactly the generating +function of the shifts, + +`constantCoeff (mcShiftSeries U μ s) = mcShift U [∂_s B_μ]` + +with no sign correction (`constantCoeff_mcShiftSeries`). -/ -/-- The iterated formal derivatives of the Maurer–Cartan series along an ordered - list of directions: `mc_{s,μ} = ∂_s mc_μ`. -/ -noncomputable def maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : +/-- The Maurer–Cartan shift series along an ordered list of directions: + `-∂_s mc_μ`, carrying the contragredient sign of `mcShift`. -/ +noncomputable def mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : List (Fin 1 ⊕ Fin 3) → JetRing - | [] => maurerCartanU1 U μ - | ν :: s => pderiv ℂ ν (maurerCartanU1Deriv U μ s) + | [] => - maurerCartanU1 U μ + | ν :: s => pderiv ℂ ν (mcShiftSeries U μ s) @[simp] -lemma maurerCartanU1Deriv_nil (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - maurerCartanU1Deriv U μ [] = maurerCartanU1 U μ := rfl +lemma mcShiftSeries_nil (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + mcShiftSeries U μ [] = - maurerCartanU1 U μ := rfl @[simp] -lemma maurerCartanU1Deriv_cons (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) +lemma mcShiftSeries_cons (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) : - maurerCartanU1Deriv U μ (ν :: s) = pderiv ℂ ν (maurerCartanU1Deriv U μ s) := rfl + mcShiftSeries U μ (ν :: s) = pderiv ℂ ν (mcShiftSeries U μ s) := rfl -/-- The factorial-weighted Taylor coefficients of the iterated derivatives of the - Maurer–Cartan series: differentiating shifts the multi-index inside the - factorial weight. -/ -lemma factorial_coeff_maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) +/-- The factorial-weighted Taylor coefficients of the Maurer–Cartan shift series: + differentiating shifts the multi-index inside the factorial weight. -/ +lemma factorial_coeff_mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) * coeff m (maurerCartanU1Deriv U μ s) = - ((∏ ρ, Nat.factorial (((m + Multiset.toFinsupp ↑s) : + ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) * coeff m (mcShiftSeries U μ s) = + - (((∏ ρ, Nat.factorial (((m + Multiset.toFinsupp ↑s) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ) : ℕ) : ℂ) * - coeff (m + Multiset.toFinsupp ↑s) (maurerCartanU1 U μ) := by + coeff (m + Multiset.toFinsupp ↑s) (maurerCartanU1 U μ)) := by induction s generalizing m with | nil => simp | cons ν s ih => - rw [maurerCartanU1Deriv_cons, coeff_pderiv] + rw [mcShiftSeries_cons, coeff_pderiv] have hT : Multiset.toFinsupp (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset (Fin 1 ⊕ Fin 3)) := by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by @@ -682,105 +711,23 @@ lemma factorial_coeff_maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ F push_cast ring -/-- The constant coefficient of the iterated derivative of the Maurer–Cartan - series is the Maurer–Cartan pairing of the corresponding B-boson component - function. -/ -lemma constantCoeff_maurerCartanU1Deriv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) +/-- The Maurer–Cartan shift series is the generating function of the shifts: its + constant coefficient is the Maurer–Cartan shift of the corresponding B-boson + component function, with no sign correction. -/ +lemma constantCoeff_mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) : - MvPowerSeries.constantCoeff (maurerCartanU1Deriv U μ s) = - ((mcPairing U (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by - have h := factorial_coeff_maurerCartanU1Deriv U μ s 0 + MvPowerSeries.constantCoeff (mcShiftSeries U μ s) = + ((mcShift U (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by + have h := factorial_coeff_mcShiftSeries U μ s 0 simp only [Finsupp.coe_zero, Pi.zero_apply, Nat.factorial_zero, Finset.prod_const_one, Nat.cast_one, one_mul, zero_add] at h - rw [← coeff_zero_eq_constantCoeff_apply, h, mcPairing_basis_dB', nsmul_eq_mul] + rw [← coeff_zero_eq_constantCoeff_apply, h, mcShift_basis_dB', nsmul_eq_mul] push_cast rw [Complex.coe_selfAdjointEquiv] rfl /-! -### The Maurer–Cartan shift on component functions - -The jet gauge group acts on the *fields* by the translation `B_μ ↦ B_μ + mc(g)_μ` -(`SMul JetGaugeGroupI BBoson`). The jet algebra is the algebra of polynomial -*functions* of the jet coordinates, on which the induced left action is the -pullback along `g⁻¹`: - -`(g · f)(B) = f (g⁻¹ • B)`. - -Component functions therefore shift contragrediently to the fields, by -`mc(g⁻¹) = -mc(g)` rather than by `+mc(g)`: - -`g • [∂_s B_ν] = [∂_s B_ν] - ⟨mc(g), ∂_s B_ν⟩ · 1`. - -Taking the pullback along `g` instead would give a right action; it is a -representation here only because the `U(1)` translations are abelian, and would -fail to be one for the `SU(2)` and `SU(3)` factors, whose Maurer–Cartan cocycle -satisfies `mc(g₁g₂) = Ad_{g₁} mc(g₂) + mc(g₁)`. - --/ - -/-- The Maurer–Cartan shift of the component functions: minus the Maurer–Cartan - pairing, this being the pairing of the *inverse* jet, `⟨mc(U⁻¹), ·⟩`. This is - the shift appearing in the contragredient gauge action `repJetGaugeGroupI`. -/ -noncomputable def mcShift (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := - - mcPairing U - -lemma mcShift_apply (U : JetGaugeGroupI) (x : JetComponentSpace) : - mcShift U x = - mcPairing U x := rfl - -/-- The Maurer–Cartan shift on a general generator: minus the factorial-weighted - Taylor coefficient of the Maurer–Cartan series. -/ -lemma mcShift_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) : - mcShift U (JetComponentSpace.basis (.dB s ν)) = - - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s))) := by - rw [mcShift_apply, mcPairing_basis_dB'] - -/-- The Maurer–Cartan shift on first-order generators. -/ -lemma mcShift_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : - mcShift U (JetComponentSpace.basis (.dB {μ} ν)) = - - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by - rw [mcShift_apply, mcPairing_basis_dB] - -@[simp] -lemma mcShift_one : mcShift 1 = 0 := by - rw [mcShift, mcPairing_one, neg_zero] - -/-- The Maurer–Cartan shift is additive in the jet. -/ -lemma mcShift_mul (U V : JetGaugeGroupI) : - mcShift (U * V) = mcShift U + mcShift V := by - rw [mcShift, mcShift, mcShift, mcPairing_mul, neg_add] - -/-- The Maurer–Cartan shift of a jet of constant gauge transformations - vanishes. -/ -lemma mcShift_ofConstant (g : GaugeGroupI) : - mcShift (JetGaugeGroupI.ofConstant g) = 0 := by - rw [mcShift, mcPairing_ofConstant, neg_zero] - -/-- The Maurer–Cartan shift inherits the symmetry of the first-order - Maurer–Cartan coefficients: the shift of `∂_{s+μ} B_ν` equals that of - `∂_{s+ν} B_μ`. This is the gauge invariance of the abelian field strength. -/ -lemma mcShift_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - mcShift U (JetComponentSpace.basis (.dB (s + {μ}) ν)) = - mcShift U (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by - rw [mcShift_apply, mcShift_apply, mcPairing_basis_dB_symm] - -/-- The constant coefficient of the iterated derivative of the Maurer–Cartan - series is minus the Maurer–Cartan shift of the corresponding B-boson component - function. -/ -lemma constantCoeff_maurerCartanU1Deriv_mcShift (U : JetGaugeGroupI) - (μ : Fin 1 ⊕ Fin 3) (s : List (Fin 1 ⊕ Fin 3)) : - MvPowerSeries.constantCoeff (maurerCartanU1Deriv U μ s) = - - ((mcShift U (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by - rw [constantCoeff_maurerCartanU1Deriv, mcShift_apply] - push_cast - ring - -/-! - ## The Maurer–Cartan jet series The local gauge transformation of the B-boson field is the translation @@ -845,6 +792,36 @@ lemma pderiv_pow_unitary_star (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : rw [hcoe, maurerCartanU1_inv, neg_mul, map_neg] at h linear_combination h +/-- `pderiv_pow_unitary` phrased in the Maurer–Cartan *shift* series rather than + the Maurer–Cartan form: `∂_ν (u^q) = q i (mcShift-series)_ν u^q`. The sign of + the scalar absorbs the contragredient sign of `mcShiftSeries`, which lets the + covariance proofs treat the series as an opaque jet and never split off a + negation. -/ +lemma pderiv_pow_unitary_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) + (q : ℕ) : + pderiv ℂ ν ((U.2.2 : JetRing) ^ q) = + MvPowerSeries.C ((q : ℂ) * Complex.I) * + (mcShiftSeries U ν [] * (U.2.2 : JetRing) ^ q) := by + rw [pderiv_pow_unitary, mcShiftSeries_nil] + rw [show (-maurerCartanU1 U ν) * (U.2.2 : JetRing) ^ q = + - (maurerCartanU1 U ν * (U.2.2 : JetRing) ^ q) from by ring, + show (MvPowerSeries.C ((q : ℂ) * Complex.I) : JetRing) = - MvPowerSeries.C (-(q : ℂ) * Complex.I) + from by rw [← map_neg]; ring_nf] + ring + +/-- The conjugate counterpart of `pderiv_pow_unitary_mcShiftSeries`. -/ +lemma pderiv_pow_unitary_star_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) + (q : ℕ) : + pderiv ℂ ν (star (U.2.2 : JetRing) ^ q) = + MvPowerSeries.C (-(q : ℂ) * Complex.I) * + (mcShiftSeries U ν [] * star (U.2.2 : JetRing) ^ q) := by + rw [pderiv_pow_unitary_star, mcShiftSeries_nil] + rw [show (-maurerCartanU1 U ν) * star (U.2.2 : JetRing) ^ q = + - (maurerCartanU1 U ν * star (U.2.2 : JetRing) ^ q) from by ring, + show (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) = - MvPowerSeries.C ((q : ℂ) * Complex.I) + from by rw [← map_neg]; ring_nf] + ring + /-! ## The jet algebra and the jet gauge action @@ -1084,8 +1061,7 @@ lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : simp [repJetGaugeGroupI, SymmetricAlgebra.lift_ι_apply, AlgHom.toLinearMap_apply, Algebra.linearMap_apply] - -lemma repJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : +lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : repJetGaugeGroupI U (x * y) = repJetGaugeGroupI U x * repJetGaugeGroupI U y := map_mul (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) x y @@ -1095,11 +1071,45 @@ lemma repJetGaugeGroupI_algebraMap (U : JetGaugeGroupI) (r : ℝ) : AlgHom.commutes (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) r -lemma repJetGaugeGroupI_one (U : JetGaugeGroupI) : +lemma repJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : repJetGaugeGroupI U (1 : JetAlgebra) = 1 := by have h := repJetGaugeGroupI_algebraMap U 1 simpa using h +lemma repJetGaugeGroupI_apply_B (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (ofGenerator (.dB {} μ)) = .ofGenerator (.dB {} μ) + + (mcShift U (.basis (.dB {} μ))) • 1 := by + rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repJetGaugeGroupI_ι, + BBoson.jetComponentSpace_basis_dB] + simp only [Multiset.empty_eq_zero, Basis.coe_dualBasis, add_right_inj] + exact Algebra.algebraMap_eq_smul_one ((mcShift U) (dualRealJetAlgebraBasis 0 ⊗ₜ[ℝ] basis.coord μ)) + +lemma repJetGaugeGroupI_apply_ofGenerator (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : repJetGaugeGroupI U (ofGenerator (.dB s μ)) = + .ofGenerator (.dB s μ) + (mcShift U (.basis (.dB s μ))) • 1 := by + rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repJetGaugeGroupI_ι, + BBoson.jetComponentSpace_basis_dB] + simp only [Basis.coe_dualBasis, add_right_inj] + exact Algebra.algebraMap_eq_smul_one ((mcShift U) + (dualRealJetAlgebraBasis ↑s ⊗ₜ[ℝ] basis.coord μ)) + +/-- Jets of constant gauge transformations act trivially on the B-boson jet + algebra: the Maurer–Cartan shift vanishes. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by + rw [show repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = + (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ + mcShift (JetGaugeGroupI.ofConstant g))) x from rfl, + mcShift_ofConstant] + have h2 : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + + (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = + AlgHom.id ℝ JetAlgebra := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) + simp + rw [h2] + rfl + /-- Conjugating the jet gauge action by the polynomial coordinates of the jet algebra: under `SymmetricAlgebra.equivMvPolynomial` the substitution automorphism `x ↦ x + ⟨mc, x⟩ 1` becomes the translation of every polynomial @@ -1133,30 +1143,13 @@ lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) exact DFunLike.congr_fun h V -/-- Jets of constant gauge transformations act trivially on the B-boson jet - algebra: the Maurer–Cartan shift vanishes. -/ -lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by - rw [show repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ - mcShift (JetGaugeGroupI.ofConstant g))) x from rfl, - mcShift_ofConstant] - have h2 : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = - AlgHom.id ℝ JetAlgebra := by - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) - simp - rw [h2] - rfl - noncomputable def repJetGaugeGroupIAlgHom (U : JetGaugeGroupI) : AlgHom ℝ JetAlgebra JetAlgebra where toFun := repJetGaugeGroupI U map_add' := LinearMap.map_add _ map_zero' := LinearMap.map_zero _ - map_one' := repJetGaugeGroupI_one U - map_mul' := repJetGaugeGroupI_mul U + map_one' := repJetGaugeGroupI_apply_one U + map_mul' := repJetGaugeGroupI_apply_mul U commutes' r := by simp [repJetGaugeGroupI_algebraMap] lemma repJetGaugeGroupIAlgHom_apply (U : JetGaugeGroupI) (x : JetAlgebra) : @@ -1206,7 +1199,7 @@ lemma complexRepJetGaugeGroupI_one (U : JetGaugeGroupI) : lemma complexRepJetGaugeGroupI_one_tmul_one (U : JetGaugeGroupI) : complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) = (1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra) := by - rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_one] + rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_apply_one] /-- The complexified gauge action on a jet-algebra generator: the Maurer–Cartan shift of the component function. -/ @@ -1924,13 +1917,15 @@ lemma maurerCartanU1_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw /-- The Maurer–Cartan pairing of the exponential gauge jet `exp(-i a X^t)` with `a = r / t!`: it shifts precisely the component functions whose total symmetrized multi-index is `t`, and shifts them all by `r`. -/ -lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcShift_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - mcPairing (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) + mcShift (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = - if s + {ν} = t then r else 0 := by - rw [mcPairing_basis_dB', Complex.selfAdjointEquiv_apply, + if s + {ν} = t then -r else 0 := by + rw [show (if s + {ν} = t then -r else 0) = -(if s + {ν} = t then r else 0) from by + split <;> simp, + mcShift_basis_dB', neg_inj, Complex.selfAdjointEquiv_apply, show ((maurerCartanU1Coeff (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) (Multiset.toFinsupp t) ht) ν (Multiset.toFinsupp s) : selfAdjoint ℂ) : ℂ) = coeff (Multiset.toFinsupp s) (maurerCartanU1 (expUnitary @@ -1979,18 +1974,6 @@ lemma mcPairing_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) · rw [if_neg hm] simp -/-- The Maurer–Cartan shift of the exponential gauge jet `exp(-i a X^t)` with - `a = r / t!`: it shifts precisely the component functions whose total - symmetrized multi-index is `t`, and shifts them all by `-r`. -/ -lemma mcShift_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) - (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) : - mcShift (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) - (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = - if s + {ν} = t then -r else 0 := by - rw [mcShift_apply, mcPairing_expUnitary] - split <;> simp - /-- The difference between a jet-algebra generator and its canonical representative is a derivative of the field strength, or zero. -/ lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : @@ -2221,7 +2204,7 @@ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : exact repJetGaugeGroupI_fieldStrengthDeriv U s' μ ν | algebraMap r => exact repJetGaugeGroupI_algebraMap U r | add x y hx hy ihx ihy => rw [map_add, ihx, ihy] - | mul x y hx hy ihx ihy => rw [repJetGaugeGroupI_mul, ihx, ihy] + | mul x y hx hy ihx ihy => rw [repJetGaugeGroupI_apply_mul, ihx, ihy] /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index 606b218e6..49245aca0 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -37,6 +37,53 @@ Thus locally it is enough to consider the action of `JetGaugeGroupI` on the fiel their derivatives at a point, instead of the full set of gauge transformations on spacetime, which is large and unwieldy. +## Start at a better overview + +A Lagrangian at a point x is a polynomial in the fields and + finitely many of their derivatives at x — that is the whole of + its input. Symmetries of such an expression can therefore only + ever see fields through that same finite window, and so a + symmetry given by a function g : M → G can only act through the + data g(x), ∂g(x), ∂²g(x), …. Two gauge transformations with the + same Taylor expansion at x are indistinguishable to every + Lagrangian at x: the honest symmetry group is not C^∞(M, G) but + its quotient by that equivalence, the group of jets at x. + + +So we want to work with Taylor expansions rather than functions. +The key observation is that Taylor expansions can be added and +multiplied just like numbers: the coefficients of a product are +given by the familiar sums of binomial coefficients times pairs +of derivatives, which is just the Leibniz rule. This makes them a +ring, which we call JetRing — it plays the same role that ℂ does +for ordinary numbers, only its elements record a value together +with all of its derivatives. + +Now, a group like SU(3), SU(2), or U(1) is defined by equations + in matrix entries — U*U = 1, det U = 1 — and nothing in those + equations demands that the entries be complex numbers. They make + sense whenever the entries can be added, multiplied, and + conjugated. In particular, they make sense for matrices whose + entries are Taylor expansions. Writing down the Standard Model + gauge group with entries in JetRing instead of ℂ gives + JetGaugeGroupI, and unwinding the definitions shows this is + precisely the group of Taylor expansions of gauge + transformations: an element is a g(x) together with all its + derivatives, constrained to be unitary order by order. + +The payoff is that the derivative bookkeeping disappears into th + ring multiplication. Products, inverses, and the adjoint action + of jets are just the group operations of JetGaugeGroupI, so + facts like "the jet of the inverse is the inverse of the jet" + hold for free instead of needing a separate check at each + order. We use infinite Taylor expansions rather than truncating + at some order k, so that a single group acts on Lagrangians of + every derivative order at once. The resulting group is blind to + everything global — topology, winding, large gauge + transformations — which is exactly right, since so is a + Lagrangian at a point. + + -/ @[expose] public section From 99d9a1e97f44bde03c594c963a8021558079b3d3 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 6 Aug 2026 15:57:17 +0100 Subject: [PATCH 104/254] feat: Some docs + clean up --- .../StandardModel/Fermions/LeptonSinglet.lean | 2 +- .../GaugeBosons/BBoson/Basic.lean | 337 +++++++++++++----- .../GaugeGroup/MaurerCartan.lean | 42 +++ 3 files changed, 296 insertions(+), 85 deletions(-) diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 08265c109..625ec455a 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -1097,7 +1097,7 @@ lemma repJetGaugeGroupI_ofGenerator_ψ_singleton (g : JetGaugeGroupI) -((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) ^ 6) := by have h := congrArg (MvPowerSeries.coeff (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) - (BBoson.pderiv_pow_unitary g μ 6) + (pderiv_pow_unitary g μ 6) rw [MvPowerSeries.coeff_pderiv] at h simp only [MvPowerSeries.coeff_zero_eq_constantCoeff_apply, map_mul, map_pow, MvPowerSeries.constantCoeff_C, Finsupp.coe_zero, Pi.zero_apply, Nat.cast_zero, diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index 9fe4290e0..2550cbfaa 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -76,6 +76,28 @@ the first sum collapses to `[∂_s B_μ]` and the shift is simply `-∂_s mc(g)_ This is `mcShift`, and it is the sign used by `repJetGaugeGroupI`. This relation is written down explicitly in `repJetGaugeGroupI_apply_ofGenerator`. + + +## Layout + +* `A` — the B-boson field itself: its target space, and the Lorentz and gauge + actions on it. +* `B` — the jet coordinates `[∂_s B_μ]`: the generators, the space they span, + and the Lorentz and gauge actions on that space. The gauge action is the + Maurer–Cartan shift `mcShift` (`B.5`). +* `C` — the Maurer–Cartan data packaged as jets: the shift series + `mcShiftSeries`, and the exponential family of gauge jets that realises + arbitrary translations of the coordinates. +* `D` — the jet algebra, and the Lorentz and gauge representations on it. +* `E` — calculus on the jet algebra: the formal total derivative, and the + correction derivations `mcDeriv` that measure its failure to commute with the + gauge action. +* `F` — the field strength, and the classification: a jet polynomial is gauge + invariant if and only if it is a polynomial in the derivatives of the field + strength (`F.2`). +* `G` — gradings and transformation laws: mass weight, and the Lorentz laws of + the coordinates and of the field strength. + -/ @[expose] public section @@ -87,7 +109,7 @@ open TensorProduct /-! -## A. The B-boson field +## A.1. The target vector space of the B-boson field -/ /-- The target vector space of the B-boson field `B_μ`. It carries one Lorentz @@ -102,7 +124,7 @@ namespace BBoson open Module /-! -## B. Linear structure +## A.2. Linear structure on the target space -/ def valEquiv : BBoson ≃ Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ where @@ -170,7 +192,7 @@ lemma mk_tmul_eq_smul_basis (ν : Fin 1 ⊕ Fin 3) (x : selfAdjoint ℂ) : rfl /-! -## C. Lorentz action +## A.3. The Lorentz action on the target space The Lorentz group acts on the Lorentz index and leaves the adjoint factor fixed. -/ @@ -225,7 +247,7 @@ lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) : /-! -## D. Gauge action +## A.4. The gauge action on the target space The B boson is neutral: the `SU(3)` and `SU(2)` components do not act on it, and the adjoint action of the abelian `U(1)` component is `A ↦ u * A * ū = A`, which is @@ -243,7 +265,7 @@ lemma repGaugeGroupI_apply (g : GaugeGroupI) (B : BBoson) : /-! -## E. Local gauge action through jets +## A.5. The local gauge action, through jets of gauge transformations A local gauge transformation acts on the B-boson field through its first-order jet. Because the adjoint action is trivial, only the inhomogeneous Maurer–Cartan term @@ -293,7 +315,10 @@ noncomputable instance : MulAction JetGaugeGroupI BBoson where /-! -## A. The Jet generators +## B.1. The jet generators + +The index set of the jet coordinates: one symbol `dB s μ` for each derivative +multiset `s` and Lorentz index `μ`. -/ @@ -428,7 +453,10 @@ end JetGenerators /-! -## A. The Jet component vector space +## B.2. The jet component space + +The linear span of the jet coordinates. Everything downstream is built from this +space: the jet algebra is its symmetric algebra. -/ @@ -445,7 +473,7 @@ noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponent /-! -### A.1. The mass dimension on the component space +### B.3. Mass dimension on the component space -/ @@ -465,7 +493,7 @@ lemma JetComponentSpace.massWeightScale_basis (c : ℝ) (j : JetGenerators) : /-! -### A.2. The action of the Lorentz group +### B.4. The Lorentz action on the component space -/ /-- The representation of the Lorentz group on the space of component functions @@ -478,7 +506,7 @@ noncomputable def JetComponentSpace.repLorentzGroup : /-! -### A.1. The action of the gauge group on the jet component space +### B.5. The gauge action on the component space: `mcShift` The jet gauge group does not act linearly on the B-boson fields. @@ -612,6 +640,7 @@ lemma mcShift_ofConstant (g : GaugeGroupI) : obtain ⟨s, ν⟩ := j simp [mcShift_basis_dB'] + /-- The factorial weight of a multi-index augmented by one derivative: the multiplicity of the new index times the original weight. -/ lemma prod_factorial_add_single (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (κ : Fin 1 ⊕ Fin 3) : @@ -648,24 +677,68 @@ lemma mcShift_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3) /-! -## The Maurer–Cartan shift series +## C.1. The Maurer–Cartan shift series `mcShiftSeries` + +A matter field `ψ` in a representation `R` of `G` transforms linearly, +`ψ ↦ R(g) ψ`, with no inhomogeneous term, so its component functions obey + +`g • [∂_s ψ] = ∑ (x + y = s), C(x,y) (∂_x R(g⁻¹)) [∂_y ψ]` + +and the same index-displacement argument gives the corrections -The covariance of the covariant derivatives of charged fields rests on the -higher Maurer–Cartan anomalies: the iterated formal derivatives of the -Maurer–Cartan series. +`D_t^ψ [∂_s ψ] = ∑ (x + y = s), C(x,y) (∂_{x+t} R(g⁻¹)) [∂_y ψ]` -The lepton sector consumes these as a whole power series — `actionC` is the -adjoint of multiplication and reads every Taylor coefficient — whereas the -B-boson sector only ever needs one scalar per generator, `mcShift`. The two are -the same data in different presentations, so the series is carried with the same -contragredient sign as `mcShift`: `mcShiftSeries` is minus the iterated -derivative of the Maurer–Cartan form, which makes it exactly the generating -function of the shifts, +with `D_t^ψ (∂_ν x) = ∂_ν (D_t^ψ x) + D_{t+{ν}}^ψ x` exactly as before. + +Here is the asymmetry with the gauge sector, and it is visible by comparing the +two displayed formulas. There, abelian-ness made `∂_z M⁻¹` vanish and collapsed +the sum to a single constant. Here nothing collapses even for `G = U(1)`, +because the object being differentiated is not the adjoint action — which is +trivial — but the character `R(g⁻¹)`, which is a nonconstant jet. Every +coefficient `∂_x R(g⁻¹)` for `x ≤ s` acts. So the matter sector cannot be run on +one number per coordinate; it needs `R(g⁻¹)` as an element of `JetRing`, and its +action is implemented as the derivative action of that jet — adjoint to +multiplication, hence reading every Taylor coefficient — rather than as a +translation. + +Those coefficients are not independent. The Maurer–Cartan equation for the +inverse jet, + +`∂_ν R(g⁻¹) = -i dR(mc(g⁻¹)_ν) · R(g⁻¹)` + +determines all of them from `mc(g⁻¹)` and its derivatives, so the object +governing the matter corrections is again `∂_s mc(g⁻¹)_μ` — the very same jet +that appeared in the gauge-field transformation law. That object is +`mcShiftSeries`: + +`mcShiftSeries U μ [] = mc(U⁻¹)_μ = -mc(U)_μ` +`mcShiftSeries U μ (ν :: s) = ∂_ν (mcShiftSeries U μ s)` + +so `mcShiftSeries U μ s = ∂_s mc(U⁻¹)_μ` (`mcShiftSeries_nil`, +`mcShiftSeries_cons`). For nonabelian `G` the same definition applies with +`dR(mc(g⁻¹)_ν)` in place of the scalar, matrix-valued and with the ordering of +the display above; only the scalar case is formalised here. + +Carrying the inverse jet, rather than `mc(U)` with a sign attached, is what makes +`mcShift`, `mcDeriv` and `mcShiftSeries` three readings of *one* object, +`∂_s mc(g⁻¹)_μ`: its value at the base point, its values at displaced indices +packaged as a derivation, and the whole series. Concretely, `constantCoeff (mcShiftSeries U μ s) = mcShift U [∂_s B_μ]` -with no sign correction (`constantCoeff_mcShiftSeries`). +(`constantCoeff_mcShiftSeries`), with no sign correction anywhere. + +For `U(1)` acting on matter through a character `χ = R(g⁻¹)` of charge `q`, the +Maurer–Cartan equation reads `∂_ν χ = -i q · mc(g⁻¹)_ν · χ`, and with the +covariant step written `D_ν = ∂_ν + c B_ν` this is +`∂_ν χ = -c · (mcShiftSeries U ν []) · χ` + +This single identity is exactly what makes `D_ν` covariant: it is the only +hypothesis the covariance proof consumes. For the charged lepton `χ = u^6` and +`c = -6i`, giving `∂_ν (u^6) = 6i · (mcShiftSeries U ν []) · u^6` +(`pderiv_pow_unitary_mcShiftSeries`); for its conjugate `χ = star u ^ 6` and +`c = +6i`. -/ /-- The Maurer–Cartan shift series along an ordered list of directions: @@ -728,7 +801,7 @@ lemma constantCoeff_mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) /-! -## The Maurer–Cartan jet series +## C.2. The Maurer–Cartan jet series and the exponential family The local gauge transformation of the B-boson field is the translation `B_μ ↦ B_μ + i (∂_μ u) ū`, so a jet of gauge transformations shifts every @@ -749,49 +822,6 @@ algebra below. -/ -/-- The derivative of a hypercharge power of a `U(1)` jet: - `∂_ν (u^q) = -q i mc_ν u^q`, the all-orders form of the first-order Taylor - coefficient formula for the contragredient character. -/ -lemma pderiv_pow_unitary (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : - pderiv ℂ ν ((U.2.2 : JetRing) ^ q) = - MvPowerSeries.C (-(q : ℂ) * Complex.I) * (maurerCartanU1 U ν * (U.2.2 : JetRing) ^ q) := by - rcases Nat.eq_zero_or_pos q with rfl | hq - · simp - · have h1 : star (U.2.2 : JetRing) * (U.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp U.2.2.2).1 - have hpow : (U.2.2 : JetRing) ^ q = (U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) := by - conv_lhs => rw [show q = 1 + (q - 1) by omega, pow_add, pow_one] - have hC : (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) * - MvPowerSeries.C Complex.I = MvPowerSeries.C ((q : ℕ) : ℂ) := by - rw [← map_mul] - congr 1 - ring_nf - rw [Complex.I_sq] - ring - have hN : (MvPowerSeries.C ((q : ℕ) : ℂ) : JetRing) = ((q : ℕ) : JetRing) := - map_natCast _ _ - rw [MvPowerSeries.pderiv_pow, maurerCartanU1, hpow] - linear_combination - (-((U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * - star (U.2.2 : JetRing))) * hC + - (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * - MvPowerSeries.C ((q : ℕ) : ℂ))) * h1 + - (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing))) * hN - -/-- The derivative of a hypercharge power of the conjugate `U(1)` jet: - `∂_ν (ū^q) = q i mc_ν ū^q`, the conjugate-contragredient counterpart of - `pderiv_pow_unitary`. -/ -lemma pderiv_pow_unitary_star (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : - pderiv ℂ ν (star (U.2.2 : JetRing) ^ q) = - MvPowerSeries.C ((q : ℂ) * Complex.I) * - (maurerCartanU1 U ν * star (U.2.2 : JetRing) ^ q) := by - have h := pderiv_pow_unitary U⁻¹ ν q - have hcoe : ((U⁻¹.2.2 : unitary JetRing) : JetRing) = - star ((U.2.2 : unitary JetRing) : JetRing) := by - rw [show (U⁻¹.2.2 : unitary JetRing) = (U.2.2)⁻¹ from rfl, ← Unitary.star_eq_inv, - Unitary.coe_star] - rw [hcoe, maurerCartanU1_inv, neg_mul, map_neg] at h - linear_combination h - /-- `pderiv_pow_unitary` phrased in the Maurer–Cartan *shift* series rather than the Maurer–Cartan form: `∂_ν (u^q) = q i (mcShift-series)_ν u^q`. The sign of the scalar absorbs the contragredient sign of `mcShiftSeries`, which lets the @@ -810,8 +840,7 @@ lemma pderiv_pow_unitary_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin ring /-- The conjugate counterpart of `pderiv_pow_unitary_mcShiftSeries`. -/ -lemma pderiv_pow_unitary_star_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) - (q : ℕ) : +lemma pderiv_pow_unitary_star_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : pderiv ℂ ν (star (U.2.2 : JetRing) ^ q) = MvPowerSeries.C (-(q : ℂ) * Complex.I) * (mcShiftSeries U ν [] * star (U.2.2 : JetRing) ^ q) := by @@ -824,7 +853,7 @@ lemma pderiv_pow_unitary_star_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ /-! -## The jet algebra and the jet gauge action +## D.1. The jet algebra -/ @@ -837,7 +866,7 @@ namespace JetAlgebra /-! -## Constructing elements of the jet algebra from the generators +## D.2. Constructing elements from the generators -/ @@ -846,14 +875,16 @@ noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := /-! -## A. Representation of the Lorentz group +## D.3. The Lorentz representation on the jet algebra + +In a real and a complexified form. -/ /-! -### A.1. The real Lorentz representation +### D.3.1. The real form -/ @@ -955,7 +986,7 @@ lemma repLorentzGroup_ofGenerator_dB_nil (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) /-! -### A.2. The complexified Lorentz representation +### D.3.2. The complexified form -/ @@ -1003,14 +1034,17 @@ noncomputable def complexRepLorentzGroupAlgHom (Λ : SL(2,ℂ)) : /-! -## A. Representation of the jet Gauge group +## D.4. The gauge representation on the jet algebra + +In a real and a complexified form. This is the substitution action of +section B.5, extended to the algebra. -/ /-! -## A.1 The real version +### D.4.1. The real form -/ @@ -1157,7 +1191,7 @@ lemma repJetGaugeGroupIAlgHom_apply (U : JetGaugeGroupI) (x : JetAlgebra) : /-! -## A.2 The complexified version +### D.4.2. The complexified form -/ @@ -1235,7 +1269,7 @@ noncomputable def complexRepJetGaugeGroupIAlgHom (U : JetGaugeGroupI) : /-! -## The formal total derivative on the jet algebra +## E.1. The formal total derivative The formal total spacetime derivative `∂_μ` acts on the component functions of the B-boson jet by appending the derivative index, `∂_s B_ν ↦ ∂_{s + {μ}} B_ν`, @@ -1345,7 +1379,7 @@ lemma equivMvPolynomial_jetDeriv (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : /-! -## The Maurer–Cartan correction derivations +## E.2. The Maurer–Cartan correction derivations `mcDeriv` A local gauge transformation changes the B boson by a gradient, `δB_μ = ∂_μλ` with `λ` the phase of the `U(1)` jet (the Maurer–Cartan form is closed, @@ -1375,6 +1409,141 @@ parameter on both sides are matched precisely by the anomaly operators built from `mcDeriv`, which annihilate the covariant derivatives (see `QED.JetAlgebra`). +### Two orders: transforming then differentiating, and the reverse + +There are two operations on the algebra of component functions, and the whole +theory of covariant derivatives comes from the fact that they do not commute. + +The first is the **total derivative** `∂_ν`, the derivation which raises the +derivative index of a coordinate, + +`∂_ν [∂_s A_μ^a] = [∂_{s+ν} A_μ^a]`, + +extended to products by the Leibniz rule. Note what it does *not* see: the +numbers `∂_x M⁻¹` and `∂_s mc(g⁻¹)` appearing in the transformation law are +functions of `g` alone and not of the field configuration, so they are constants +of this algebra and `∂_ν` annihilates them. + +The second is the **gauge action** `g •`, the algebra automorphism given on +generators by the law above. + +Applying the group action first and then differentiating gives + +`∂_ν (g • [∂_s A_μ^a]) = ∑ (x + y = s), C(x,y) (∂_x M⁻¹)^a_b [∂_{y+ν} A_μ^b]` + +— the inhomogeneous term has been killed, and the new derivative has landed on +the field in every term. Differentiating first and then acting gives instead + +`g • (∂_ν [∂_s A_μ^a]) = g • [∂_{s+ν} A_μ^a] =` +` ∑ (x + y = s + ν), C(x,y) (∂_x M⁻¹)^a_b [∂_y A_μ^b] + ∂_{s+ν} mc(g⁻¹)_μ^a` + +and now the decompositions of `s + ν` distribute the new derivative over *both* +factors. Subtracting, the difference is precisely the terms in which it fell on +the transformation data rather than on the field: + +`(g • ∂_ν - ∂_ν g •) [∂_s A_μ^a] =` +` ∑ (x + y = s), C(x,y) (∂_{x+ν} M⁻¹)^a_b [∂_y A_μ^b] + ∂_{s+ν} mc(g⁻¹)_μ^a` + +This defect is not a derivation, but a `g`-twisted one: +`(g • ∂_ν - ∂_ν g •)(XY) = ((g • ∂_ν - ∂_ν g •) X)(g • Y) + (g • X)((g • ∂_ν - ∂_ν g •) Y)`. +Untwisting it by `g` gives an honest derivation, and that is how it is packaged: + +`g • (∂_ν X) = ∂_ν (g • X) + g • (mcDeriv_ν X)` + +(`repJetGaugeGroupI_jetDeriv`), with `mcDeriv_ν = (g •)⁻¹ ∘ (g • ∂_ν - ∂_ν g •)`. + +In the abelian case `M ≡ 1`, so every `∂_{x+ν} M⁻¹` vanishes — the index `x + ν` +is never zero — and the entire first sum disappears. All that survives is the +Maurer–Cartan term, a *constant*: + +`mcDeriv U {ν} [∂_s B_μ] = ∂_{s+ν} mc(g⁻¹)_μ = mcShift U [∂_{s+ν} B_μ] · 1` + +### The general recursion, and why the weight is a multiset + +One commutation is not enough, because a covariant derivative is applied +repeatedly: having moved `g •` past `∂_ν` we are left holding a correction term, +and the next step differentiates that. So we need to know how the correction +itself commutes with `∂`, and the answer has to be uniform enough to iterate. + +Two general facts do the work, neither of them abelian. + +First, the defect is a *twisted* derivation. Writing `ρ := (g •)`, which is an +algebra automorphism, and `∂_ν`, which is a derivation, the operator +`ρ ∘ ∂_ν - ∂_ν ∘ ρ` satisfies + +`(ρ ∂_ν - ∂_ν ρ)(X Y) = ((ρ ∂_ν - ∂_ν ρ) X)(ρ Y) + (ρ X)((ρ ∂_ν - ∂_ν ρ) Y)` + +so it is not a derivation, but `ρ⁻¹ ∘ (ρ ∂_ν - ∂_ν ρ)` is one. That untwisted +operator is the correction, and it is what makes the identity + +`g • (∂_ν X) = ∂_ν (g • X) + g • (correction_ν X)` + +hold with `g •` sitting on the outside of the correction term. + +Second, the corrections form a family indexed by a multiset, obtained by +displacing the derivative indices of the transformation data. For a multiset `t` +let `D_t` be the map on generators + +`D_t [∂_s A_μ^a] = ∑ (x + y = s), C(x,y) (∂_{x+t} M⁻¹)^a_b [∂_y A_μ^b]` +` + ∂_{s+t} mc(g⁻¹)_μ^a` + +— literally the transformation law with every index of `M⁻¹` and `mc(g⁻¹)` +pushed `t` further along, so that `D_0` is the gauge action itself. Since `∂_ν` +annihilates the coefficients `∂_x M⁻¹` and `∂_s mc(g⁻¹)` (they depend on `g`, not +on the field) and acts only on `[∂_y A_μ^b]`, splitting the decompositions of +`s + ν` according to whether the new index lands on the field or on the data +gives, on generators, + +`D_t (∂_ν x) = ∂_ν (D_t x) + D_{t + {ν}} x` + +for every `t`. This is the general recursion: commuting past one more derivative +displaces the weight by one more index, and nothing else changes. The weight is +a *multiset* because the total derivatives commute, `∂_ρ ∂_σ = ∂_σ ∂_ρ`, so only +the multiplicity of each direction is remembered. Contrast the derivative history +of a covariant derivative, which is a `List`: covariant derivatives do not +commute, their commutator being the field strength. + +### What the abelian case buys + +Everything above holds for any `G`. The abelian case is easier for one reason: +`M ≡ 1`, so `∂_z M⁻¹ = 0` for every `z ≠ 0`. For `t ≠ 0` the index `x + t` is +never zero, so the entire first sum vanishes and only the inhomogeneous term +survives: + +`D_t [∂_s B_μ] = ∂_{s+t} mc(g⁻¹)_μ = mcShift U [∂_{s+t} B_μ]` + +The corrections are therefore *constants*, and two simplifications follow. Since +`ρ` fixes constants, `ρ⁻¹` does too, so the untwisting is invisible and the +correction can simply be *defined* as the derivation sending each generator to +that constant — this is `mcDeriv U t`: + +`mcDeriv U t [∂_s B_μ] = mcShift U [∂_{s+t} B_μ] · 1` + +(`mcDeriv_ofGenerator`), with the general recursion becoming + +`mcDeriv U t (∂_ν x) = ∂_ν (mcDeriv U t x) + mcDeriv U (t + {ν}) x` + +(`mcDeriv_jetDeriv`). And because the values are constants rather than +coordinates, the family never grows in complexity: the induction closes on the +single-parameter family `{mcDeriv U t}` indexed by how far along the jet +`mc(g⁻¹)_μ` is being read. In particular `mcDeriv U 0` sends each coordinate to +its own `mcShift`. + +For nonabelian `G` neither simplification is available: the `Ad`-terms survive, +the corrections are coordinate-valued rather than constant, and the untwisting by +`ρ⁻¹` is genuine. The recursion `D_t ∂_ν = ∂_ν D_t + D_{t+{ν}}` is still what +organises them. + +### Where the two meet + +Both readings appear together in the Maurer–Cartan anomaly operators of the QED +jet algebra (`QED.JetAlgebra.anomalyM`): `mcDeriv` from the gauge-field +coordinates, `mcShift` from the `c B_ν` term of the covariant step, and +`mcShiftSeries` from the matter coordinates. Covariance is the statement that +these cancel, and at the base point the cancellation is term-for-term between +`c · mcShift` and `c · constantCoeff (mcShiftSeries)` +(`QED.JetAlgebra.anomalyM_baseM`) — which is an identity of syntax, not of +computation, precisely because the two carry the same sign. -/ /-- The Maurer–Cartan correction derivation of weight `t` of a `U(1)` jet: the @@ -1592,7 +1761,7 @@ lemma mcDeriv_baseChange_ofGenerator (U : JetGaugeGroupI) /-! -## The field strength of the B boson +## F.1. The field strength -/ @@ -1635,7 +1804,7 @@ lemma fieldStrengthDeriv_bianchi_identity (s : Multiset (Fin 1 ⊕ Fin 3)) (μ /-! -## A. Invariance under the gauge group +## F.2. Classification of the gauge invariants We now want to show that the if an element of the jet algebra is invariant under the action of the jet gauge group, then it is a polynomial @@ -1646,7 +1815,7 @@ in the field strength and its derivatives. /-! -### A.1 Gauge realization of translations of the jet coordinates +### F.2.1. Gauge realization of translations of the jet coordinates The gauge invariants of the B-boson jet algebra are computed below by realizing arbitrary translations of the jet coordinates through explicit local `U(1)` gauge @@ -2208,7 +2377,7 @@ lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : /-! -## Mass weight scaling +## G.1. Mass weight scaling -/ @@ -2375,7 +2544,7 @@ end JetAlgebra /-! -## Lorentz transformation laws of the B-boson jet coordinates +## G.2. Lorentz transformation laws of the jet coordinates -/ @@ -2695,7 +2864,7 @@ lemma massWeightScale_ofReal_complexRepLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) /-! -## Lorentz transformation laws of the field strength +## G.3. Lorentz transformation laws of the field strength The field strength `F_{μν} = ∂_μ B_ν - ∂_ν B_μ` and its derivatives are tensors: every index transforms by the Lorentz matrix. diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index f7f07ed32..caf442d9f 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -535,4 +535,46 @@ lemma maurerCartanU1Coeff_succ_symm (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin linear_combination h +/-- The derivative of a hypercharge power of a `U(1)` jet: + `∂_ν (u^q) = -q i mc_ν u^q`, the all-orders form of the first-order Taylor + coefficient formula for the contragredient character. -/ +lemma pderiv_pow_unitary (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : + pderiv ℂ ν ((U.2.2 : JetRing) ^ q) = + MvPowerSeries.C (-(q : ℂ) * Complex.I) * (maurerCartanU1 U ν * (U.2.2 : JetRing) ^ q) := by + rcases Nat.eq_zero_or_pos q with rfl | hq + · simp + · have h1 : star (U.2.2 : JetRing) * (U.2.2 : JetRing) = 1 := (Unitary.mem_iff.mp U.2.2.2).1 + have hpow : (U.2.2 : JetRing) ^ q = (U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) := by + conv_lhs => rw [show q = 1 + (q - 1) by omega, pow_add, pow_one] + have hC : (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) * + MvPowerSeries.C Complex.I = MvPowerSeries.C ((q : ℕ) : ℂ) := by + rw [← map_mul] + congr 1 + ring_nf + rw [Complex.I_sq] + ring + have hN : (MvPowerSeries.C ((q : ℕ) : ℂ) : JetRing) = ((q : ℕ) : JetRing) := + map_natCast _ _ + rw [MvPowerSeries.pderiv_pow, maurerCartanU1, hpow] + linear_combination + (-((U.2.2 : JetRing) * (U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * + star (U.2.2 : JetRing))) * hC + + (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing) * + MvPowerSeries.C ((q : ℕ) : ℂ))) * h1 + + (-((U.2.2 : JetRing) ^ (q - 1) * pderiv ℂ ν (U.2.2 : JetRing))) * hN + +/-- The derivative of a hypercharge power of the conjugate `U(1)` jet: + `∂_ν (ū^q) = q i mc_ν ū^q`, the conjugate-contragredient counterpart of + `pderiv_pow_unitary`. -/ +lemma pderiv_pow_unitary_star (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : + pderiv ℂ ν (star (U.2.2 : JetRing) ^ q) = + MvPowerSeries.C ((q : ℂ) * Complex.I) * + (maurerCartanU1 U ν * star (U.2.2 : JetRing) ^ q) := by + have h := pderiv_pow_unitary U⁻¹ ν q + have hcoe : ((U⁻¹.2.2 : unitary JetRing) : JetRing) = + star ((U.2.2 : unitary JetRing) : JetRing) := by + rw [show (U⁻¹.2.2 : unitary JetRing) = (U.2.2)⁻¹ from rfl, ← Unitary.star_eq_inv, + Unitary.coe_star] + rw [hcoe, maurerCartanU1_inv, neg_mul, map_neg] at h + linear_combination h end StandardModel From ba4f6eb6fb1d56d9064082d68a081dd45aa9f01f Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 7 Aug 2026 05:24:04 +0100 Subject: [PATCH 105/254] feat: Comment about mass weight --- Physlib/Particles/QED/JetAlgebra/MassDim.lean | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/MassDim.lean index bc1ea8b77..f69f1402f 100644 --- a/Physlib/Particles/QED/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/QED/JetAlgebra/MassDim.lean @@ -11,6 +11,10 @@ public import Physlib.Relativity.PauliMatrices.Basic /-! # Mass dimension on the QED jet algebra +*Note*: In this file we use the notion 'mass weight'. The idea been that the +'mass weight' is twice the mass dimension. This is because it is easier to work exclusively with +integers, and the mass dimension of the fermion fields is 3/2. + -/ @[expose] public section From a3aa5efc0ae8facefe657d4ab7b40afee787c973 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 7 Aug 2026 10:12:02 +0400 Subject: [PATCH 106/254] feat: Proof of the 1st theorem for gluons Co-authored-by: Claude Opus 4.8 --- Physlib.lean | 1 + .../GaugeBosons/Gluons/JetCompleteness.lean | 129 ++ .../Gluons/JetCompleteness/ColourBasis.lean | 636 ++++++++++ .../JetCompleteness/CoordinateChange.lean | 519 ++++++++ .../JetCompleteness/CovariantTower.lean | 750 +++++++++++ .../Gluons/JetCompleteness/DiagonalJet.lean | 396 ++++++ .../JetCompleteness/FiniteCompleteness.lean | 317 +++++ .../Gluons/JetCompleteness/FiniteHeight.lean | 962 ++++++++++++++ .../Gluons/JetCompleteness/GaugeAction.lean | 1108 +++++++++++++++++ .../Gluons/JetCompleteness/HighestLayer.lean | 451 +++++++ .../Gluons/JetCompleteness/HookBianchi.lean | 784 ++++++++++++ .../Gluons/JetCompleteness/OrdinaryJets.lean | 960 ++++++++++++++ .../JetCompleteness/SeriesGaugeAction.lean | 385 ++++++ .../Gluons/JetCompleteness/Triangular.lean | 816 ++++++++++++ 14 files changed, 8214 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean diff --git a/Physlib.lean b/Physlib.lean index f2664b8d8..39ec81312 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -196,6 +196,7 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.Potential diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean new file mode 100644 index 000000000..650861f61 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean @@ -0,0 +1,129 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.FiniteHeight +/-! +# All-orders and full-group completeness + +## i. Overview + +This file removes the height bound from `FiniteHeight` and then passes from based jets +to the whole jet gauge +group. The two statements are + +```text +A fixed by based jets = C +A fixed by the full jet group = C fixed by constant SU(3) +``` + +where `A` is `OrdinaryJets`'s all-orders ordinary gluon jet algebra on the physical +traceless-hermitian +colour carrier and `C = covAlgebra` is `CovariantTower`'s subalgebra generated by the symmetrized +covariant +curvature derivatives `D^r F`. + +## ii. Removing the height bound + +No new machinery is needed. An element of a symmetric algebra is a polynomial, so its image under +`OrdinaryJets`'s `toPoly` has a finite variable set; the largest derivative degree occurring in that +set is a +height bound, which is `FiniteHeight`'s `mem_heightAlgebra_vars_sup`. +`FiniteHeight` then identifies the based +invariants of that height with the truncated covariant algebra, which sits inside `covAlgebra`. + +## iii. The full group + +The second theorem does **not** say that every element of `covAlgebra` is invariant: an +uncontracted `covCurv` component transforms covariantly, and a constant colour rotation generally +moves it. Only the globally `SU(3)`-invariant combinations are fixed by the whole jet group. The +reverse inclusion uses `CovariantTower`'s `gaugePull_eq_ofConstantSU`, which replaces the action of +an arbitrary +jet on the covariant subalgebra by the action of the constant jet of its base-point value. No +ordered product decomposition of a jet is constructed, and the contravariant composition law +`gaugePull (U * V) = gaugePull V ∘ gaugePull U` is never inverted. + +## iv. Results + +* `fixed_by_based_eq_covAlgebra` — the all-orders based fixed-algebra theorem; +* `fixed_by_jetGroup_eq_invariant_covAlgebra` — the full-group theorem. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. Removing the height bound + +-/ + +/-- **All-orders based completeness.** The elements of the all-orders ordinary gluon jet algebra +fixed by every *based* `SU(3)` gauge jet are exactly the elements of the subalgebra generated by +the symmetrized covariant curvature derivatives. + +The forward direction bounds the derivative height of a single polynomial by the largest +derivative degree among its finitely many variables and applies `FiniteHeight` at that +height; the reverse +direction is `CovariantTower`'s `gaugePull_eq_self_of_based`. -/ +lemma fixed_by_based_eq_covAlgebra : + {P : JetAlgebra | ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U P = P} = + (covAlgebra : Set JetAlgebra) := by + ext P + simp only [Set.mem_setOf_eq, SetLike.mem_coe] + constructor + · intro hP + have hmem : P ∈ {Q : JetAlgebra | Q ∈ heightAlgebra ((toPoly P).vars.sup genDeg) ∧ + ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U Q = Q} := + ⟨mem_heightAlgebra_vars_sup P, hP⟩ + rw [fixed_by_based_height_eq_covAlgebraAt] at hmem + exact covAlgebraAt_le_covAlgebra _ hmem + · intro hP U hU + exact gaugePull_eq_self_of_based U hU hP + +/-! + +## B. The full jet gauge group + +-/ + +/-- **The full-group theorem.** The elements of the all-orders ordinary gluon jet algebra fixed by +the *whole* `SU(3)` jet gauge group are the constant-`SU(3)`-invariant elements of the covariant +curvature algebra. + +Membership in the covariant algebra alone is not enough: an uncontracted covariant curvature +component is only covariant, and a constant colour rotation generally moves it. The reverse +inclusion works because on the covariant subalgebra an arbitrary gauge jet acts exactly as the +constant jet of its base-point value. -/ +lemma fixed_by_jetGroup_eq_invariant_covAlgebra : + {P : JetAlgebra | ∀ U : specialUnitaryGroup (Fin 3) JetRing, gaugePull U P = P} = + {P : JetAlgebra | P ∈ covAlgebra ∧ + ∀ g : specialUnitaryGroup (Fin 3) ℂ, + gaugePull (JetGaugeGroupI.ofConstantSU (Fin 3) g) P = P} := by + ext P + simp only [Set.mem_setOf_eq] + constructor + · intro hP + refine ⟨?_, fun g => hP _⟩ + have hbased : P ∈ {Q : JetAlgebra | ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U Q = Q} := fun U _ => hP U + rw [fixed_by_based_eq_covAlgebra] at hbased + exact hbased + · rintro ⟨hadj, hconst⟩ U + rw [gaugePull_eq_ofConstantSU U hadj] + exact hconst _ + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean new file mode 100644 index 000000000..cf79d4947 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean @@ -0,0 +1,636 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.DiagonalJet +/-! +# All eight colour directions + +## i. Overview + +This file proves that the single colour direction `H = diag(1, -1, 0)` realized by the `DiagonalJet` +diagonal jet +generates the whole physical colour carrier, and that based gauge jets therefore realize an +arbitrary traceless hermitian translation. + +Three things are produced. + +* `colourBasis` — an explicit `Basis (Fin 8) ℝ` of the traceless hermitian `3 × 3` matrices. This + is stronger than the "spanning family" alternative allowed by the proof strategy, and it is the + form later modules need: `SymmetricAlgebra.equivMvPolynomial` requires a `Basis`, so the colour + index type of the jet coordinate carrier has to come from here. +* `colourBasis_eq_adjointAction` — every basis vector is a *single* constant `SU(3)` conjugate of + `H`. No simplicity or irreducibility theory for `su(3)` is used; the six constant matrices are + written down. +* `exists_based_mcCoeff` — for every traceless hermitian `X` and every spacetime direction `μ` + there is a *based* gauge jet whose Maurer–Cartan coefficient is `X` in the direction `μ` and `0` + in every other direction. This is the translation input the layerwise elimination of + `FiniteCompleteness`, `HighestLayer` and + `FiniteHeight` consumes. + +## ii. The conjugation chain + +Only one of the six constant matrices has irrational entries, the `π/4` rotation in the `(0,1)` +block; everything else is a permutation or a diagonal phase. The chain is + +```text +H --Ad(cyc2)--> E₂ +H --Ad(u01)--> X₀₁ --Ad(d01)--> Y₀₁ +X₀₁ --Ad(cyc)--> X₀₂ --Ad(d02)--> Y₀₂ +X₀₂ --Ad(cyc)--> X₁₂ --Ad(d12)--> Y₁₂ +``` + +The eigenvalues of `H` are `1, -1, 0`, so every single conjugate of `H` has those eigenvalues; the +basis is chosen to consist of such matrices, which is why each basis vector is one conjugate rather +than a combination. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MvPowerSeries JetRing Module + +namespace SU3Jet + +/-! + +## A. The colour carrier + +The physical colour carrier in the traceless-Hermitian convention is the real vector space of +traceless hermitian `3 × 3` matrices. + +-/ + +/-- The traceless hermitian `3 × 3` matrices: the Lie algebra `su(3)`. -/ +def ColourSpace : Submodule ℝ (selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) where + carrier := {A | trace (A : Matrix (Fin 3) (Fin 3) ℂ) = 0} + add_mem' {A B} hA hB := by + simp only [Set.mem_setOf_eq, AddSubgroup.coe_add, Matrix.trace_add] at * + rw [hA, hB, add_zero] + zero_mem' := by + simp only [Set.mem_setOf_eq, ZeroMemClass.coe_zero, Matrix.trace_zero] + smul_mem' r A hA := by + simp only [Set.mem_setOf_eq, selfAdjoint.val_smul, Matrix.trace_smul] at * + rw [hA, smul_zero] + +@[simp] +lemma mem_ColourSpace {A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)} : + A ∈ ColourSpace ↔ trace (A : Matrix (Fin 3) (Fin 3) ℂ) = 0 := Iff.rfl + +/-! + +## B. The eight colour matrices + +-/ + +/-- `E₁ = diag(1, -1, 0)`, the direction realized directly by the `DiagonalJet` jet. -/ +def cm0 : Matrix (Fin 3) (Fin 3) ℂ := !![1, 0, 0; 0, -1, 0; 0, 0, 0] +/-- `E₂ = diag(0, 1, -1)`. -/ +def cm1 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 0; 0, 1, 0; 0, 0, -1] +/-- `X₀₁`. -/ +def cm2 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 1, 0; 1, 0, 0; 0, 0, 0] +/-- `Y₀₁`. -/ +noncomputable def cm3 : Matrix (Fin 3) (Fin 3) ℂ := + !![0, -Complex.I, 0; Complex.I, 0, 0; 0, 0, 0] +/-- `X₀₂`. -/ +def cm4 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 1; 0, 0, 0; 1, 0, 0] +/-- `Y₀₂`. -/ +noncomputable def cm5 : Matrix (Fin 3) (Fin 3) ℂ := + !![0, 0, -Complex.I; 0, 0, 0; Complex.I, 0, 0] +/-- `X₁₂`. -/ +def cm6 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 0; 0, 0, 1; 0, 1, 0] +/-- `Y₁₂`. -/ +noncomputable def cm7 : Matrix (Fin 3) (Fin 3) ℂ := + !![0, 0, 0; 0, 0, -Complex.I; 0, Complex.I, 0] + +/-- The `DiagonalJet` colour direction is the first colour matrix. -/ +lemma colourMat_eq_cm0 : colourMat = cm0 := by + ext i j + fin_cases i <;> fin_cases j <;> simp [colourMat, cm0] + +private lemma mem_sa (M : Matrix (Fin 3) (Fin 3) ℂ) + (h : ∀ i j, (starRingEnd ℂ) (M j i) = M i j) : + M ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := by + rw [selfAdjoint.mem_iff] + ext i j + rw [Matrix.star_apply] + exact h i j + +lemma cm0_mem : cm0 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm0] +lemma cm1_mem : cm1 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm1] +lemma cm2_mem : cm2 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm2] +lemma cm3_mem : cm3 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm3] +lemma cm4_mem : cm4 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm4] +lemma cm5_mem : cm5 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm5] +lemma cm6_mem : cm6 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm6] +lemma cm7_mem : cm7 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm7] + +/-- The eight colour directions, as hermitian matrices. -/ +noncomputable def colourVec : Fin 8 → selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + ![⟨cm0, cm0_mem⟩, ⟨cm1, cm1_mem⟩, ⟨cm2, cm2_mem⟩, ⟨cm3, cm3_mem⟩, + ⟨cm4, cm4_mem⟩, ⟨cm5, cm5_mem⟩, ⟨cm6, cm6_mem⟩, ⟨cm7, cm7_mem⟩] + +lemma colourVec_mem (k : Fin 8) : colourVec k ∈ ColourSpace := by + fin_cases k <;> + simp [colourVec, ColourSpace, cm0, cm1, cm2, cm3, cm4, cm5, cm6, cm7, + Matrix.trace_fin_three] + +/-! + +## C. Coordinates and the basis + +-/ + +/-- The eight real coordinates of a hermitian matrix relative to the colour directions. -/ +noncomputable def colourCoord : + selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) →ₗ[ℝ] (Fin 8 → ℝ) where + toFun A := ![((A : Matrix (Fin 3) (Fin 3) ℂ) 0 0).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 2 2).re, + ((A : Matrix (Fin 3) (Fin 3) ℂ) 0 1).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 0 1).im, + ((A : Matrix (Fin 3) (Fin 3) ℂ) 0 2).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 0 2).im, + ((A : Matrix (Fin 3) (Fin 3) ℂ) 1 2).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 1 2).im] + map_add' A B := by + funext k + fin_cases k <;> simp [Matrix.add_apply] <;> ring + map_smul' r A := by + funext k + fin_cases k <;> + simp [selfAdjoint.val_smul, Matrix.smul_apply, Complex.real_smul, Complex.mul_re, + Complex.mul_im] + +/-- The hermitian matrix with prescribed colour coordinates. -/ +noncomputable def colourMk : (Fin 8 → ℝ) →ₗ[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + Fintype.linearCombination ℝ colourVec + +lemma colourMk_apply (c : Fin 8 → ℝ) : colourMk c = ∑ k, c k • colourVec k := + Fintype.linearCombination_apply _ _ c + +lemma colourMk_mem (c : Fin 8 → ℝ) : colourMk c ∈ ColourSpace := by + rw [colourMk_apply] + exact Submodule.sum_mem _ fun k _ => Submodule.smul_mem _ _ (colourVec_mem k) + +lemma colourMk_val (c : Fin 8 → ℝ) (i j : Fin 3) : + ((colourMk c : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : Matrix (Fin 3) (Fin 3) ℂ) i j = + ∑ k, (c k : ℂ) * (colourVec k : Matrix (Fin 3) (Fin 3) ℂ) i j := by + rw [colourMk_apply] + rw [show ((∑ k, c k • colourVec k : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : + Matrix (Fin 3) (Fin 3) ℂ) = ∑ k, c k • (colourVec k : Matrix (Fin 3) (Fin 3) ℂ) from by + simp [selfAdjoint.val_smul]] + rw [Matrix.sum_apply] + exact Finset.sum_congr rfl fun k _ => by + rw [Matrix.smul_apply, Complex.real_smul] + +/-- The entries of the hermitian matrix built from eight real coordinates. -/ +lemma colourMk_entries (c : Fin 8 → ℝ) : + ((colourMk c : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : Matrix (Fin 3) (Fin 3) ℂ) = + !![(c 0 : ℂ), (c 2 : ℂ) - (c 3 : ℂ) * Complex.I, (c 4 : ℂ) - (c 5 : ℂ) * Complex.I; + (c 2 : ℂ) + (c 3 : ℂ) * Complex.I, -(c 0 : ℂ) + (c 1 : ℂ), + (c 6 : ℂ) - (c 7 : ℂ) * Complex.I; + (c 4 : ℂ) + (c 5 : ℂ) * Complex.I, (c 6 : ℂ) + (c 7 : ℂ) * Complex.I, -(c 1 : ℂ)] := by + ext i j + rw [colourMk_val] + fin_cases i <;> fin_cases j <;> + simp [Fin.sum_univ_eight, colourVec, cm0, cm1, cm2, cm3, cm4, cm5, cm6, cm7] <;> ring + +lemma colourCoord_colourMk (c : Fin 8 → ℝ) : colourCoord (colourMk c) = c := by + funext k + fin_cases k <;> + simp [colourCoord, colourMk_entries] + +lemma colourMk_colourCoord {A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)} (hA : A ∈ ColourSpace) : + colourMk (colourCoord A) = A := by + have hAs : star (A : Matrix (Fin 3) (Fin 3) ℂ) = (A : Matrix (Fin 3) (Fin 3) ℂ) := + selfAdjoint.mem_iff.mp A.2 + have hentry : ∀ i j, star ((A : Matrix (Fin 3) (Fin 3) ℂ) j i) = + (A : Matrix (Fin 3) (Fin 3) ℂ) i j := by + intro i j + have h := congrArg (fun N : Matrix (Fin 3) (Fin 3) ℂ => N i j) hAs + simpa [Matrix.star_apply] using h + have hre : ∀ i j, ((A : Matrix (Fin 3) (Fin 3) ℂ) j i).re = + ((A : Matrix (Fin 3) (Fin 3) ℂ) i j).re := by + intro i j + have := congrArg Complex.re (hentry i j) + simpa using this + have him : ∀ i j, ((A : Matrix (Fin 3) (Fin 3) ℂ) j i).im = + -((A : Matrix (Fin 3) (Fin 3) ℂ) i j).im := by + intro i j + have := congrArg Complex.im (hentry i j) + simp at this + linarith + have hdiagim : ∀ i, ((A : Matrix (Fin 3) (Fin 3) ℂ) i i).im = 0 := by + intro i + have := him i i + linarith + have htrre : ((A : Matrix (Fin 3) (Fin 3) ℂ) 0 0).re + + ((A : Matrix (Fin 3) (Fin 3) ℂ) 1 1).re + ((A : Matrix (Fin 3) (Fin 3) ℂ) 2 2).re = 0 := by + have h := mem_ColourSpace.mp hA + rw [Matrix.trace_fin_three] at h + have := congrArg Complex.re h + simpa using this + apply Subtype.ext + rw [colourMk_entries] + ext i j + fin_cases i <;> fin_cases j <;> + (apply Complex.ext <;> + simp [colourCoord] <;> + linarith [hre 0 1, hre 0 2, hre 1 2, him 0 1, him 0 2, him 1 2, + hdiagim 0, hdiagim 1, hdiagim 2, htrre]) + +/-- The colour carrier is eight-dimensional, with explicit coordinates. -/ +noncomputable def colourEquiv : ColourSpace ≃ₗ[ℝ] (Fin 8 → ℝ) where + toFun A := colourCoord (A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) + invFun c := ⟨colourMk c, colourMk_mem c⟩ + map_add' A B := by simp + map_smul' r A := by simp + left_inv A := Subtype.ext (colourMk_colourCoord A.2) + right_inv c := colourCoord_colourMk c + +/-- **An explicit basis of the colour carrier.** Eight traceless hermitian matrices, with + coordinates given by the real and imaginary parts of the entries. -/ +noncomputable def colourBasis : Basis (Fin 8) ℝ ColourSpace := + Basis.ofEquivFun colourEquiv + +lemma colourBasis_apply (k : Fin 8) : + ((colourBasis k : ColourSpace) : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) = colourVec k := by + rw [colourBasis, Basis.coe_ofEquivFun] + show (colourEquiv.symm (Pi.single k 1) : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) = _ + show colourMk (Pi.single k 1) = _ + rw [colourMk, Fintype.linearCombination_apply_single, one_smul] + +/-! + +## D. The six constant gauge matrices + +-/ + +/-- `1/√2`, as a complex scalar. -/ +noncomputable def rt : ℂ := ((Real.sqrt 2 / 2 : ℝ) : ℂ) + +@[simp] +lemma rt_mul_rt : rt * rt = 1 / 2 := by + have h : (Real.sqrt 2 / 2) * (Real.sqrt 2 / 2) = 1 / 2 := by + rw [show Real.sqrt 2 / 2 * (Real.sqrt 2 / 2) = Real.sqrt 2 * Real.sqrt 2 / 4 by ring, + Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 2)] + norm_num + rw [rt, ← Complex.ofReal_mul, h] + norm_num + +@[simp] +lemma star_rt : star rt = rt := by + rw [rt, Complex.star_def, Complex.conj_ofReal] + +@[simp] +lemma conj_rt : (starRingEnd ℂ) rt = rt := star_rt + +@[simp] +lemma rt_sq : rt ^ 2 = 1 / 2 := by rw [pow_two]; exact rt_mul_rt + +/-- The cyclic permutation matrix. -/ +def gcyc : Matrix (Fin 3) (Fin 3) ℂ := !![0, 1, 0; 0, 0, 1; 1, 0, 0] +/-- The square of the cyclic permutation matrix. -/ +def gcyc2 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 1; 1, 0, 0; 0, 1, 0] +/-- The `π/4` rotation in the `(0,1)` block: the only irrational constant needed. -/ +noncomputable def g01 : Matrix (Fin 3) (Fin 3) ℂ := !![rt, -rt, 0; rt, rt, 0; 0, 0, 1] +/-- The diagonal phase `diag(1, i, -i)`. -/ +noncomputable def d01 : Matrix (Fin 3) (Fin 3) ℂ := + !![1, 0, 0; 0, Complex.I, 0; 0, 0, -Complex.I] +/-- The diagonal phase `diag(1, -i, i)`. -/ +noncomputable def d02 : Matrix (Fin 3) (Fin 3) ℂ := + !![1, 0, 0; 0, -Complex.I, 0; 0, 0, Complex.I] +/-- The diagonal phase `diag(-i, 1, i)`. -/ +noncomputable def d12 : Matrix (Fin 3) (Fin 3) ℂ := + !![-Complex.I, 0, 0; 0, 1, 0; 0, 0, Complex.I] + +private lemma mem_su3 (M : Matrix (Fin 3) (Fin 3) ℂ) (hu : M * star M = 1) (hd : M.det = 1) : + M ∈ specialUnitaryGroup (Fin 3) ℂ := + mem_specialUnitaryGroup_iff.mpr ⟨mem_unitaryGroup_iff.mpr hu, hd⟩ + +lemma gcyc_mem : gcyc ∈ specialUnitaryGroup (Fin 3) ℂ := by + refine mem_su3 _ ?_ ?_ + · ext i j + fin_cases i <;> fin_cases j <;> + simp [gcyc, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply] + · simp [gcyc, Matrix.det_fin_three] + +lemma gcyc2_mem : gcyc2 ∈ specialUnitaryGroup (Fin 3) ℂ := by + refine mem_su3 _ ?_ ?_ + · ext i j + fin_cases i <;> fin_cases j <;> + simp [gcyc2, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply] + · simp [gcyc2, Matrix.det_fin_three] + +lemma g01_mem : g01 ∈ specialUnitaryGroup (Fin 3) ℂ := by + refine mem_su3 _ ?_ ?_ + · ext i j + fin_cases i <;> fin_cases j <;> + simp [g01, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply] <;> + all_goals ring_nf + · rw [g01, Matrix.det_fin_three] + simp; ring_nf + +lemma d01_mem : d01 ∈ specialUnitaryGroup (Fin 3) ℂ := by + refine mem_su3 _ ?_ ?_ + · ext i j + fin_cases i <;> fin_cases j <;> + simp [d01, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply, Complex.conj_I] + · simp [d01, Matrix.det_fin_three, Complex.I_mul_I] + +lemma d02_mem : d02 ∈ specialUnitaryGroup (Fin 3) ℂ := by + refine mem_su3 _ ?_ ?_ + · ext i j + fin_cases i <;> fin_cases j <;> + simp [d02, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply, Complex.conj_I] + · simp [d02, Matrix.det_fin_three, Complex.I_mul_I] + +lemma d12_mem : d12 ∈ specialUnitaryGroup (Fin 3) ℂ := by + refine mem_su3 _ ?_ ?_ + · ext i j + fin_cases i <;> fin_cases j <;> + simp [d12, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply, Complex.conj_I] + · simp [d12, Matrix.det_fin_three, Complex.I_mul_I] + +/-- The six constant gauge matrices as elements of `SU(3)`. -/ +noncomputable def ucyc : specialUnitaryGroup (Fin 3) ℂ := ⟨gcyc, gcyc_mem⟩ +/-- `cyc²` as an element of `SU(3)`. -/ +noncomputable def ucyc2 : specialUnitaryGroup (Fin 3) ℂ := ⟨gcyc2, gcyc2_mem⟩ +/-- The `π/4` rotation as an element of `SU(3)`. -/ +noncomputable def u01 : specialUnitaryGroup (Fin 3) ℂ := ⟨g01, g01_mem⟩ +/-- `diag(1, i, -i)` as an element of `SU(3)`. -/ +noncomputable def p01 : specialUnitaryGroup (Fin 3) ℂ := ⟨d01, d01_mem⟩ +/-- `diag(1, -i, i)` as an element of `SU(3)`. -/ +noncomputable def p02 : specialUnitaryGroup (Fin 3) ℂ := ⟨d02, d02_mem⟩ +/-- `diag(-i, 1, i)` as an element of `SU(3)`. -/ +noncomputable def p12 : specialUnitaryGroup (Fin 3) ℂ := ⟨d12, d12_mem⟩ + +/-! + +## E. The conjugation chain + +-/ + +private lemma conj_eq (u : specialUnitaryGroup (Fin 3) ℂ) + (A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) (B : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) + (h : (u : Matrix (Fin 3) (Fin 3) ℂ) * (A : Matrix (Fin 3) (Fin 3) ℂ) * + ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ = (B : Matrix (Fin 3) (Fin 3) ℂ)) : + Gluon.adjointAction u A = B := + Subtype.ext (by rw [Gluon.adjointAction_apply_coe]; exact h) + +lemma adjointAction_ucyc2_cm0 : + Gluon.adjointAction ucyc2 ⟨cm0, cm0_mem⟩ = ⟨cm1, cm1_mem⟩ := by + refine conj_eq _ _ _ ?_ + ext i j + fin_cases i <;> fin_cases j <;> + simp [ucyc2, gcyc2, cm0, cm1, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.conjTranspose_apply] + +lemma adjointAction_u01_cm0 : + Gluon.adjointAction u01 ⟨cm0, cm0_mem⟩ = ⟨cm2, cm2_mem⟩ := by + refine conj_eq _ _ _ ?_ + ext i j + fin_cases i <;> fin_cases j <;> + simp [u01, g01, cm0, cm2, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.conjTranspose_apply] <;> + all_goals ring_nf + +lemma adjointAction_p01_cm2 : + Gluon.adjointAction p01 ⟨cm2, cm2_mem⟩ = ⟨cm3, cm3_mem⟩ := by + refine conj_eq _ _ _ ?_ + ext i j + fin_cases i <;> fin_cases j <;> + simp [p01, d01, cm2, cm3, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.conjTranspose_apply, Complex.conj_I] + +lemma adjointAction_ucyc_cm2 : + Gluon.adjointAction ucyc ⟨cm2, cm2_mem⟩ = ⟨cm4, cm4_mem⟩ := by + refine conj_eq _ _ _ ?_ + ext i j + fin_cases i <;> fin_cases j <;> + simp [ucyc, gcyc, cm2, cm4, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.conjTranspose_apply] + +lemma adjointAction_p02_cm4 : + Gluon.adjointAction p02 ⟨cm4, cm4_mem⟩ = ⟨cm5, cm5_mem⟩ := by + refine conj_eq _ _ _ ?_ + ext i j + fin_cases i <;> fin_cases j <;> + simp [p02, d02, cm4, cm5, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.conjTranspose_apply, Complex.conj_I] + +lemma adjointAction_ucyc_cm4 : + Gluon.adjointAction ucyc ⟨cm4, cm4_mem⟩ = ⟨cm6, cm6_mem⟩ := by + refine conj_eq _ _ _ ?_ + ext i j + fin_cases i <;> fin_cases j <;> + simp [ucyc, gcyc, cm4, cm6, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.conjTranspose_apply] + +lemma adjointAction_p12_cm6 : + Gluon.adjointAction p12 ⟨cm6, cm6_mem⟩ = ⟨cm7, cm7_mem⟩ := by + refine conj_eq _ _ _ ?_ + ext i j + fin_cases i <;> fin_cases j <;> + simp [p12, d12, cm6, cm7, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.conjTranspose_apply, Complex.conj_I] + +/-- The constant `SU(3)` element carrying `H = diag(1, -1, 0)` to the `k`-th colour direction. -/ +noncomputable def colourConj : Fin 8 → specialUnitaryGroup (Fin 3) ℂ := + ![1, ucyc2, u01, p01 * u01, ucyc * u01, p02 * (ucyc * u01), + ucyc * (ucyc * u01), p12 * (ucyc * (ucyc * u01))] + +/-- **Every colour direction is a single constant conjugate of the `DiagonalJet` direction.** No + simplicity + or irreducibility theory for `su(3)` is used: the six constant matrices are explicit. -/ +lemma colourBasis_eq_adjointAction (k : Fin 8) : + Gluon.adjointAction (colourConj k) colourH = + ((colourBasis k : ColourSpace) : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) := by + have hH : (colourH : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) = ⟨cm0, cm0_mem⟩ := + Subtype.ext colourMat_eq_cm0 + have hmul : ∀ (u v : specialUnitaryGroup (Fin 3) ℂ) + (A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)), + Gluon.adjointAction (u * v) A = Gluon.adjointAction u (Gluon.adjointAction v A) := by + intro u v A + rw [Gluon.adjointAction_mul] + rfl + simp only [colourBasis_apply] + fin_cases k + · show Gluon.adjointAction 1 colourH = colourVec 0 + rw [hH, Gluon.adjointAction_one] + rfl + · show Gluon.adjointAction ucyc2 colourH = colourVec 1 + rw [hH] + exact adjointAction_ucyc2_cm0 + · show Gluon.adjointAction u01 colourH = colourVec 2 + rw [hH] + exact adjointAction_u01_cm0 + · show Gluon.adjointAction (p01 * u01) colourH = colourVec 3 + rw [hH, hmul, adjointAction_u01_cm0] + exact adjointAction_p01_cm2 + · show Gluon.adjointAction (ucyc * u01) colourH = colourVec 4 + rw [hH, hmul, adjointAction_u01_cm0] + exact adjointAction_ucyc_cm2 + · show Gluon.adjointAction (p02 * (ucyc * u01)) colourH = colourVec 5 + rw [hH, hmul, hmul, adjointAction_u01_cm0, adjointAction_ucyc_cm2] + exact adjointAction_p02_cm4 + · show Gluon.adjointAction (ucyc * (ucyc * u01)) colourH = colourVec 6 + rw [hH, hmul, hmul, adjointAction_u01_cm0, adjointAction_ucyc_cm2] + exact adjointAction_ucyc_cm4 + · show Gluon.adjointAction (p12 * (ucyc * (ucyc * u01))) colourH = colourVec 7 + rw [hH, hmul, hmul, hmul, adjointAction_u01_cm0, adjointAction_ucyc_cm2, + adjointAction_ucyc_cm4] + exact adjointAction_p12_cm6 + +/-- The conjugate of the `DiagonalJet` colour direction by a constant gauge transformation is + traceless + hermitian. -/ +lemma adjointAction_colourH_mem (u : specialUnitaryGroup (Fin 3) ℂ) : + Gluon.adjointAction u colourH ∈ ColourSpace := by + have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 + rwa [star_eq_conjTranspose] at h + rw [mem_ColourSpace, Gluon.adjointAction_apply_coe, trace_mul_cycle, hu, Matrix.one_mul, + colourH_coe] + exact trace_colourMat + +/-- The orbit of the `DiagonalJet` colour direction under constant gauge transformations, inside the + colour carrier. -/ +noncomputable def colourOrbit : Set ColourSpace := + Set.range fun u : specialUnitaryGroup (Fin 3) ℂ => + (⟨Gluon.adjointAction u colourH, adjointAction_colourH_mem u⟩ : ColourSpace) + +/-- **The conjugate orbit spans the colour carrier.** Every traceless hermitian matrix is a real + linear combination of constant `SU(3)` conjugates of `H = diag(1, -1, 0)`. -/ +lemma span_colourOrbit : Submodule.span ℝ colourOrbit = ⊤ := by + refine le_antisymm le_top ?_ + rw [← colourBasis.span_eq] + refine Submodule.span_le.mpr ?_ + rintro _ ⟨k, rfl⟩ + exact Submodule.subset_span ⟨colourConj k, Subtype.ext (colourBasis_eq_adjointAction k)⟩ + +/-! + +## F. Based jets in every colour direction + +-/ + +lemma evalSU_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) : + JetGaugeGroupI.evalSU (Fin 3) (JetGaugeGroupI.ofConstantSU (Fin 3) u) = u := by + apply Subtype.ext + ext i j + simp [JetGaugeGroupI.evalSU, JetGaugeGroupI.ofConstantSU, RingHom.mapMatrix_apply, + Matrix.map_apply] + +lemma mcCoeff_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Fin 1 ⊕ Fin 3) : + Gluon.mcCoeff (JetGaugeGroupI.ofConstantSU (Fin 3) u) μ = 0 := by + apply Subtype.ext + show Gluon.mcMatrix μ ((JetGaugeGroupI.ofConstantSU (Fin 3) u) : + Matrix (Fin 3) (Fin 3) JetRing) = _ + rw [show ((JetGaugeGroupI.ofConstantSU (Fin 3) u) : Matrix (Fin 3) (Fin 3) JetRing) = + (u : Matrix (Fin 3) (Fin 3) ℂ).map (C : ℂ →+* JetRing) from rfl] + simp [Gluon.mcMatrix] + +/-- For based jets the Maurer–Cartan cocycle degenerates to additivity. -/ +lemma mcCoeff_mul_of_based {U V : specialUnitaryGroup (Fin 3) JetRing} + (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (μ : Fin 1 ⊕ Fin 3) : + Gluon.mcCoeff (U * V) μ = Gluon.mcCoeff U μ + Gluon.mcCoeff V μ := by + rw [Gluon.mcCoeff_mul, hU, Gluon.adjointAction_one] + rfl + +/-- The ordered product of eight gauge jets. The colour jet group is not commutative, so the + product is written out rather than taken over a `Finset`. -/ +noncomputable def prodJet (f : Fin 8 → specialUnitaryGroup (Fin 3) JetRing) : + specialUnitaryGroup (Fin 3) JetRing := + f 0 * (f 1 * (f 2 * (f 3 * (f 4 * (f 5 * (f 6 * f 7)))))) + +lemma evalSU_prodJet {f : Fin 8 → specialUnitaryGroup (Fin 3) JetRing} + (hf : ∀ k, JetGaugeGroupI.evalSU (Fin 3) (f k) = 1) : + JetGaugeGroupI.evalSU (Fin 3) (prodJet f) = 1 := by + simp [prodJet, map_mul, hf] + +/-- On based jets the Maurer–Cartan coefficient of a product is the sum of the coefficients. -/ +lemma mcCoeff_prodJet {f : Fin 8 → specialUnitaryGroup (Fin 3) JetRing} + (hf : ∀ k, JetGaugeGroupI.evalSU (Fin 3) (f k) = 1) (ν : Fin 1 ⊕ Fin 3) : + Gluon.mcCoeff (prodJet f) ν = ∑ k, Gluon.mcCoeff (f k) ν := by + rw [Fin.sum_univ_eight, prodJet, mcCoeff_mul_of_based (hf 0), mcCoeff_mul_of_based (hf 1), + mcCoeff_mul_of_based (hf 2), mcCoeff_mul_of_based (hf 3), mcCoeff_mul_of_based (hf 4), + mcCoeff_mul_of_based (hf 5), mcCoeff_mul_of_based (hf 6)] + abel + +/-- The based jet realizing the shift `r • Ad(u) H` in the direction `μ`: the `DiagonalJet` diagonal + jet + conjugated by a constant colour rotation. -/ +noncomputable def conjJet (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ : Fin 1 ⊕ Fin 3) : + specialUnitaryGroup (Fin 3) JetRing := + JetGaugeGroupI.ofConstantSU (Fin 3) u * diagSU r (Finsupp.single μ 1) (single_ne_zero' μ) * + (JetGaugeGroupI.ofConstantSU (Fin 3) u)⁻¹ + +lemma evalSU_conjJet (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ : Fin 1 ⊕ Fin 3) : + JetGaugeGroupI.evalSU (Fin 3) (conjJet u r μ) = 1 := by + rw [conjJet, map_mul, map_mul, map_inv, evalSU_ofConstantSU, evalSU_diagSU, mul_one, + mul_inv_cancel] + +lemma mcCoeff_conjJet (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : + Gluon.mcCoeff (conjJet u r μ) ν = + Gluon.adjointAction u + (Gluon.mcCoeff (diagSU r (Finsupp.single μ 1) (single_ne_zero' μ)) ν) := by + have hinv : (JetGaugeGroupI.ofConstantSU (Fin 3) u)⁻¹ = + JetGaugeGroupI.ofConstantSU (Fin 3) u⁻¹ := (map_inv _ u).symm + simp only [conjJet, hinv, Gluon.mcCoeff_mul, mcCoeff_ofConstantSU, zero_add, + evalSU_ofConstantSU, map_zero, add_zero] + +/-- **Realizability in one colour direction.** For every constant `u`, every real `r` and every + spacetime direction `μ` there is a based gauge jet whose Maurer–Cartan coefficient is + `r • Ad(u) H` in the direction `μ` and zero elsewhere. -/ +lemma mcCoeff_conjJet_eq (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : + Gluon.mcCoeff (conjJet u r μ) ν = + if ν = μ then r • Gluon.adjointAction u colourH else 0 := by + rw [mcCoeff_conjJet] + by_cases h : ν = μ + · subst h + rw [if_pos rfl, mcCoeff_diagSU_single, map_smul] + · rw [if_neg h, mcCoeff_diagSU_single_of_ne r μ ν h, map_zero] + +/-- **Arbitrary based translations of the colour carrier.** For every traceless hermitian `X` and + every spacetime direction `μ` there is a based gauge jet whose Maurer–Cartan coefficient is `X` + in the direction `μ` and zero in every other direction. + + This is the exact input that layerwise polynomial-translation elimination consumes: the shift is + an arbitrary constant element of the colour carrier, concentrated in one Lorentz direction. -/ +lemma exists_based_mcCoeff (μ : Fin 1 ⊕ Fin 3) (X : ColourSpace) : + ∃ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 ∧ + ∀ ν, Gluon.mcCoeff U ν = + if ν = μ then (X : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) else 0 := by + classical + refine ⟨prodJet fun k => conjJet (colourConj k) (colourBasis.repr X k) μ, ?_, ?_⟩ + · exact evalSU_prodJet fun k => evalSU_conjJet _ _ _ + · intro ν + rw [mcCoeff_prodJet (fun k => evalSU_conjJet _ _ _) ν] + rcases eq_or_ne ν μ with rfl | hne + · have hcoe : ∀ k : Fin 8, + Gluon.mcCoeff (conjJet (colourConj k) (colourBasis.repr X k) ν) ν = + Submodule.subtype ColourSpace (colourBasis.repr X k • colourBasis k) := fun k => by + rw [mcCoeff_conjJet_eq, if_pos rfl, colourBasis_eq_adjointAction k] + rfl + rw [if_pos rfl, Finset.sum_congr rfl fun k (_ : k ∈ Finset.univ) => hcoe k, ← map_sum, + colourBasis.sum_repr X] + rfl + · rw [if_neg hne] + refine Finset.sum_eq_zero fun k _ => ?_ + rw [mcCoeff_conjJet_eq, if_neg hne] + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean new file mode 100644 index 000000000..2da99d4cb --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean @@ -0,0 +1,519 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Mathematics.MvPolynomialTranslation +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.ColourBasis +/-! +# The first-order covariant coordinate change + +## i. Overview + +`A₁` is the polynomial algebra over `ℝ` on the gluon connection coordinates `A_μ^c` and their +first ordinary derivatives `(∂_ν A_μ)^c`, with `μ, ν` spacetime directions and `c` a colour index +running over the basis `SU3Jet.colourBasis` of `ColourBasis`. This file replaces the `∂_ν A_μ` block +by the +*symmetric* derivative coordinates together with the field strength + +```text +F_{νμ} = ∂_ν A_μ - ∂_μ A_ν + i [A_ν, A_μ], +``` + +and proves that the replacement is an isomorphism of algebras whose inverse carries the nonabelian +commutator correction. + +## ii. Conventions + +Physlib uses hermitian gluon potentials. Converting the Lie-algebra formula of +the underlying matrix-valued jet model (`F = ∂A - ∂A - [A, A]`, anti-hermitian) by +`A^{ah} = -i A^h` gives the hermitian field strength `F = ∂A - ∂A + i [A, A]`, which is the sign +used here. Correspondingly the colour bracket carried by the coordinate change is +`brMat M N = i (M N - N M)`, which preserves the traceless hermitian carrier. + +## iii. Index design + +* the colour index is the `Fin 8` of `SU3Jet.colourBasis`, as required by the proof strategy; +* symmetric derivative coordinates are indexed by `Sym2 Lor`; +* curvature coordinates are indexed by `CurvPair`, the *strictly ordered* pairs of spacetime + directions, so that the carrier holds six independent curvature variables per colour direction + and no antisymmetry relation. + +`LinearOrder (Fin 1 ⊕ Fin 3)` does not synthesize in this Mathlib. Rather than introduce a local +order instance the order is transported along the explicit equivalence `lorRank : Lor ≃ Fin 4`; +`Fin 4` already carries the decidability and trichotomy that the curvature variable needs, and +nothing else in the development wants an order on `Lor`. + +Coordinate count: `∂A` is `16 × 8 = 128`, splitting as symmetric `10 × 8 = 80` plus curvature +`6 × 8 = 48`. + +## iv. Results + +* `brP`, `cstruct` — the colour bracket in coordinates, and its structure constants; +* `curvPoly` — the field strength as a polynomial in the ordinary coordinates; +* `oldToNew`, `newToOld` — the two substitution algebra maps; +* `newToOld_oldToNew`, `oldToNew_newToOld` — they are mutually inverse on every generator; +* `covEquiv : A₁ ≃ₐ[ℝ] A₁cov` — the resulting coordinate change. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. Index types + +-/ + +/-- The spacetime index. -/ +abbrev Lor : Type := Fin 1 ⊕ Fin 3 + +/-- The colour index, the index type of `SU3Jet.colourBasis`. -/ +abbrev Col : Type := Fin 8 + +/-- A linear ordering of the four spacetime directions, transported along an explicit + equivalence: `LinearOrder (Fin 1 ⊕ Fin 3)` does not synthesize. -/ +def lorRank : Lor ≃ Fin 4 := finSumFinEquiv + +/-- The transported strict order on spacetime directions. -/ +def LorLT (ν μ : Lor) : Prop := lorRank ν < lorRank μ + +instance (ν μ : Lor) : Decidable (LorLT ν μ) := by + unfold LorLT; infer_instance + +lemma lorLT_irrefl (ν : Lor) : ¬ LorLT ν ν := lt_irrefl _ + +lemma lorLT_asymm {ν μ : Lor} (h : LorLT ν μ) : ¬ LorLT μ ν := lt_asymm h + +lemma lor_trichotomy (ν μ : Lor) : LorLT ν μ ∨ ν = μ ∨ LorLT μ ν := by + rcases lt_trichotomy (lorRank ν) (lorRank μ) with h | h | h + · exact Or.inl h + · exact Or.inr (Or.inl (lorRank.injective h)) + · exact Or.inr (Or.inr h) + +/-- The six independent curvature slots: strictly ordered pairs of spacetime directions. -/ +abbrev CurvPair : Type := {p : Lor × Lor // LorLT p.1 p.2} + +/-- The ordinary coordinates of the first-order gluon jet algebra: the connection and its first + ordinary derivatives. -/ +inductive Coord where + /-- The connection coordinate `A_μ^c`. -/ + | conn : Lor → Col → Coord + /-- The ordinary derivative coordinate `(∂_ν A_μ)^c`. -/ + | der : Lor → Lor → Col → Coord +deriving DecidableEq + +/-- The covariant coordinates: the connection, the symmetric part of its derivative, and the + field strength. -/ +inductive CovCoord where + /-- The connection coordinate `A_μ^c`. -/ + | conn : Lor → Col → CovCoord + /-- The symmetric derivative coordinate `(∂_{(ν} A_{μ)})^c`. -/ + | sym : Sym2 Lor → Col → CovCoord + /-- The field strength coordinate `F_{νμ}^c`, one variable per ordered pair. -/ + | curv : CurvPair → Col → CovCoord +deriving DecidableEq + +/-- The first-order gluon jet algebra in ordinary coordinates. -/ +abbrev A₁ : Type := MvPolynomial Coord ℝ + +/-- The first-order gluon jet algebra in covariant coordinates. -/ +abbrev A₁cov : Type := MvPolynomial CovCoord ℝ + +/-! + +## B. The colour bracket + +-/ + +/-- The underlying complex matrix of a colour vector. -/ +def cmat (X : ColourSpace) : Matrix (Fin 3) (Fin 3) ℂ := + ((X : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : Matrix (Fin 3) (Fin 3) ℂ) + +lemma cmat_injective : Function.Injective cmat := fun _ _ h => + Subtype.ext (Subtype.ext h) + +@[simp] +lemma cmat_add (X Y : ColourSpace) : cmat (X + Y) = cmat X + cmat Y := rfl + +@[simp] +lemma cmat_smul (r : ℝ) (X : ColourSpace) : cmat (r • X) = r • cmat X := rfl + +@[simp] +lemma cmat_zero : cmat 0 = 0 := rfl + +@[simp] +lemma cmat_sub (X Y : ColourSpace) : cmat (X - Y) = cmat X - cmat Y := rfl + +lemma cmat_star (X : ColourSpace) : star (cmat X) = cmat X := + selfAdjoint.mem_iff.mp (X : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)).2 + +lemma cmat_trace (X : ColourSpace) : trace (cmat X) = 0 := X.2 + +/-- Assemble a colour vector from a traceless hermitian matrix. -/ +def mkCM (M : Matrix (Fin 3) (Fin 3) ℂ) (hs : star M = M) (ht : trace M = 0) : ColourSpace := + ⟨⟨M, selfAdjoint.mem_iff.mpr hs⟩, ht⟩ + +@[simp] +lemma cmat_mkCM (M : Matrix (Fin 3) (Fin 3) ℂ) (hs : star M = M) (ht : trace M = 0) : + cmat (mkCM M hs ht) = M := rfl + +/-- The hermitian colour bracket `i (M N - N M)`. The factor of `i` is what keeps the bracket + inside the hermitian carrier; it is the same `i` that appears in the hermitian field strength. -/ +def brMat (M N : Matrix (Fin 3) (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ := + Complex.I • (M * N - N * M) + +lemma brMat_star {M N : Matrix (Fin 3) (Fin 3) ℂ} (hM : star M = M) (hN : star N = N) : + star (brMat M N) = brMat M N := by + rw [brMat, star_smul, star_sub, star_mul, star_mul, hM, hN, Complex.star_def, Complex.conj_I, + neg_smul, ← smul_neg, neg_sub] + +lemma brMat_trace (M N : Matrix (Fin 3) (Fin 3) ℂ) : trace (brMat M N) = 0 := by + rw [brMat, trace_smul, trace_sub, trace_mul_comm M N, sub_self, smul_zero] + +lemma brMat_swap (M N : Matrix (Fin 3) (Fin 3) ℂ) : brMat M N = -brMat N M := by + rw [brMat, brMat, ← smul_neg, neg_sub] + +lemma brMat_self (M : Matrix (Fin 3) (Fin 3) ℂ) : brMat M M = 0 := by + rw [brMat, sub_self, smul_zero] + +/-- The colour bracket `X, Y ↦ i [X, Y]` on the traceless hermitian carrier. -/ +noncomputable def br : ColourSpace →ₗ[ℝ] ColourSpace →ₗ[ℝ] ColourSpace := + LinearMap.mk₂ ℝ + (fun X Y => mkCM (brMat (cmat X) (cmat Y)) + (brMat_star (cmat_star X) (cmat_star Y)) (brMat_trace _ _)) + (fun _ _ _ => cmat_injective (by + simp only [cmat_mkCM, cmat_add, brMat, add_mul, mul_add] + module)) + (fun _ _ _ => cmat_injective (by + simp only [cmat_mkCM, cmat_smul, brMat, Matrix.smul_mul, Matrix.mul_smul] + module)) + (fun _ _ _ => cmat_injective (by + simp only [cmat_mkCM, cmat_add, brMat, add_mul, mul_add] + module)) + (fun _ _ _ => cmat_injective (by + simp only [cmat_mkCM, cmat_smul, brMat, Matrix.smul_mul, Matrix.mul_smul] + module)) + +@[simp] +lemma cmat_br (X Y : ColourSpace) : cmat (br X Y) = brMat (cmat X) (cmat Y) := rfl + +lemma br_swap (X Y : ColourSpace) : br X Y = -br Y X := + cmat_injective (by + rw [cmat_br, brMat_swap] + show _ = cmat (-br Y X) + rw [show cmat (-br Y X) = -cmat (br Y X) from rfl, cmat_br]) + +lemma br_self (X : ColourSpace) : br X X = 0 := + cmat_injective (by rw [cmat_br, brMat_self, cmat_zero]) + +/-! + +## C. Colour coordinates and structure constants + +-/ + +/-- The `c`-th coordinate of a colour vector relative to `colourBasis`, as a linear + functional. -/ +noncomputable def coordC (c : Col) : ColourSpace →ₗ[ℝ] ℝ where + toFun X := colourBasis.repr X c + map_add' X Y := by simp + map_smul' r X := by simp + +@[simp] +lemma coordC_apply (c : Col) (X : ColourSpace) : coordC c X = colourBasis.repr X c := rfl + +/-- The colour vector with prescribed coordinates. -/ +noncomputable def mkC (f : Col → ℝ) : ColourSpace := colourBasis.equivFun.symm f + +@[simp] +lemma coordC_mkC (f : Col → ℝ) (a : Col) : coordC a (mkC f) = f a := + congrFun (colourBasis.equivFun.apply_symm_apply f) a + +lemma mkC_coordC (X : ColourSpace) : mkC (fun a => coordC a X) = X := + colourBasis.equivFun.symm_apply_apply X + +lemma mkC_eq_sum (f : Col → ℝ) : mkC f = ∑ a, f a • colourBasis a := + Basis.equivFun_symm_apply _ _ + +/-- The structure constants of the colour bracket in the basis `colourBasis`. -/ +noncomputable def cstruct (a b c : Col) : ℝ := + coordC c (br (colourBasis a) (colourBasis b)) + +lemma cstruct_swap (a b c : Col) : cstruct a b c = -cstruct b a c := by + rw [cstruct, cstruct, br_swap, map_neg] + +/-- **The colour bracket in coordinates.** -/ +lemma coordC_br (X Y : ColourSpace) (c : Col) : + coordC c (br X Y) = ∑ a, ∑ b, coordC a X * coordC b Y * cstruct a b c := by + conv_lhs => rw [← colourBasis.sum_repr X, ← colourBasis.sum_repr Y] + simp only [map_sum, LinearMap.sum_apply, map_smul, LinearMap.smul_apply, smul_eq_mul, + coordC_apply, cstruct, Finset.mul_sum] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => by ring + +/-! + +## D. Colour vectors of polynomials + +A colour vector of polynomials is a function `Col → MvPolynomial ι ℝ`. The bracket lifts to such +vectors through the structure constants, and evaluation at a point of the coordinate space +intertwines the lifted bracket with `br`. + +-/ + +section Poly + +variable {ι σ τ : Type*} + +/-- Any `ℝ`-algebra map between polynomial algebras fixes the constants. -/ +lemma algHom_C (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) (r : ℝ) : + φ (C r) = C r := by + rw [← algebraMap_eq, AlgHom.commutes, algebraMap_eq] + +/-- The colour bracket of two colour vectors of polynomials. -/ +noncomputable def brP (p q : Col → MvPolynomial ι ℝ) : Col → MvPolynomial ι ℝ := + fun c => ∑ a, ∑ b, C (cstruct a b c) * (p a * q b) + +lemma brP_swap (p q : Col → MvPolynomial ι ℝ) (c : Col) : brP p q c = -brP q p c := by + have key : (brP q p c : MvPolynomial ι ℝ) = + ∑ a, ∑ b, -(C (cstruct a b c) * (p a * q b)) := by + rw [brP, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rw [cstruct_swap b a c, map_neg] + ring + rw [key, brP] + simp [Finset.sum_neg_distrib] + +lemma brP_self (p : Col → MvPolynomial ι ℝ) (c : Col) : brP p p c = 0 := by + have h : (2 : ℝ) • brP p p c = 0 := by + rw [two_smul] + nth_rewrite 1 [brP_swap p p c] + exact neg_add_cancel _ + have h2 := congrArg (fun x : MvPolynomial ι ℝ => (2⁻¹ : ℝ) • x) h + simpa [smul_smul] using h2 + +lemma algHom_brP (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) (p q : Col → MvPolynomial σ ℝ) + (c : Col) : + φ (brP p q c) = brP (fun a => φ (p a)) (fun b => φ (q b)) c := by + rw [brP, brP, map_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_sum] + exact Finset.sum_congr rfl fun b _ => by rw [map_mul, map_mul, algHom_C] + +/-- **Evaluation intertwines the polynomial bracket with the colour bracket.** -/ +lemma eval_brP (x : ι → ℝ) (p q : Col → MvPolynomial ι ℝ) (c : Col) : + eval x (brP p q c) = + coordC c (br (mkC fun a => eval x (p a)) (mkC fun b => eval x (q b))) := by + rw [coordC_br] + simp only [coordC_mkC] + rw [brP, map_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [map_mul, map_mul, eval_C] + ring + +end Poly + +/-! + +## E. The two coordinate systems + +-/ + +/-- The connection colour vector in ordinary coordinates. -/ +noncomputable def connOld (μ : Lor) : Col → A₁ := fun c => X (Coord.conn μ c) + +/-- The connection colour vector in covariant coordinates. -/ +noncomputable def connCov (μ : Lor) : Col → A₁cov := fun c => X (CovCoord.conn μ c) + +/-- **The field strength in ordinary coordinates:** + `F_{νμ}^c = (∂_ν A_μ)^c - (∂_μ A_ν)^c + (i [A_ν, A_μ])^c`. -/ +noncomputable def curvPoly (ν μ : Lor) (c : Col) : A₁ := + X (Coord.der ν μ c) - X (Coord.der μ ν c) + brP (connOld ν) (connOld μ) c + +lemma curvPoly_swap (ν μ : Lor) (c : Col) : curvPoly ν μ c = -curvPoly μ ν c := by + rw [curvPoly, curvPoly, brP_swap (connOld μ) (connOld ν) c] + ring + +lemma curvPoly_self (ν : Lor) (c : Col) : curvPoly ν ν c = 0 := by + rw [curvPoly, brP_self, sub_self, add_zero] + +/-- The curvature variable of the covariant carrier, for an arbitrary ordered pair of directions: + the variable itself on an increasing pair, minus the variable on a decreasing pair, and zero on + the diagonal. This is what keeps the carrier free of antisymmetry relations. -/ +noncomputable def curvVar (ν μ : Lor) (c : Col) : A₁cov := + if h : LorLT ν μ then X (CovCoord.curv ⟨(ν, μ), h⟩ c) + else if h' : LorLT μ ν then -X (CovCoord.curv ⟨(μ, ν), h'⟩ c) + else 0 + +lemma curvVar_swap (ν μ : Lor) (c : Col) : curvVar ν μ c = -curvVar μ ν c := by + rw [curvVar, curvVar] + by_cases h : LorLT ν μ + · rw [dif_pos h, dif_neg (lorLT_asymm h), dif_pos h, neg_neg] + · by_cases h' : LorLT μ ν + · rw [dif_neg h, dif_pos h', dif_pos h'] + · rw [dif_neg h, dif_neg h', dif_neg h', dif_neg h, neg_zero] + +lemma curvVar_of_lt {ν μ : Lor} (h : LorLT ν μ) (c : Col) : + curvVar ν μ c = X (CovCoord.curv ⟨(ν, μ), h⟩ c) := by + rw [curvVar, dif_pos h] + +/-- The symmetric derivative coordinate of the covariant carrier, written in ordinary + coordinates. -/ +noncomputable def symOld (c : Col) : Sym2 Lor → A₁ := + Sym2.lift ⟨fun ν μ => (2⁻¹ : ℝ) • (X (Coord.der ν μ c) + X (Coord.der μ ν c)), by + intro a b + show (2⁻¹ : ℝ) • (X (Coord.der a b c) + X (Coord.der b a c)) = + (2⁻¹ : ℝ) • (X (Coord.der b a c) + X (Coord.der a b c)) + rw [add_comm]⟩ + +@[simp] +lemma symOld_mk (c : Col) (ν μ : Lor) : + symOld c s(ν, μ) = (2⁻¹ : ℝ) • (X (Coord.der ν μ c) + X (Coord.der μ ν c)) := + Sym2.lift_mk _ _ _ + +/-! + +## F. The two substitutions + +-/ + +/-- The ordinary coordinates written in covariant coordinates: the derivative coordinate splits + as its symmetric part plus half the field strength, corrected by the commutator. -/ +noncomputable def oldToNewGen : Coord → A₁cov + | Coord.conn μ c => X (CovCoord.conn μ c) + | Coord.der ν μ c => + X (CovCoord.sym s(ν, μ) c) + + (2⁻¹ : ℝ) • (curvVar ν μ c - brP (connCov ν) (connCov μ) c) + +/-- The covariant coordinates written in ordinary coordinates. -/ +noncomputable def newToOldGen : CovCoord → A₁ + | CovCoord.conn μ c => X (Coord.conn μ c) + | CovCoord.sym s c => symOld c s + | CovCoord.curv q c => curvPoly q.1.1 q.1.2 c + +/-- The substitution from ordinary to covariant coordinates. -/ +noncomputable def oldToNew : A₁ →ₐ[ℝ] A₁cov := aeval oldToNewGen + +/-- The substitution from covariant to ordinary coordinates. -/ +noncomputable def newToOld : A₁cov →ₐ[ℝ] A₁ := aeval newToOldGen + +@[simp] +lemma oldToNew_conn (μ : Lor) (c : Col) : + oldToNew (X (Coord.conn μ c)) = X (CovCoord.conn μ c) := aeval_X _ _ + +@[simp] +lemma oldToNew_der (ν μ : Lor) (c : Col) : + oldToNew (X (Coord.der ν μ c)) = + X (CovCoord.sym s(ν, μ) c) + + (2⁻¹ : ℝ) • (curvVar ν μ c - brP (connCov ν) (connCov μ) c) := aeval_X _ _ + +@[simp] +lemma newToOld_conn (μ : Lor) (c : Col) : + newToOld (X (CovCoord.conn μ c)) = X (Coord.conn μ c) := aeval_X _ _ + +@[simp] +lemma newToOld_sym (s : Sym2 Lor) (c : Col) : + newToOld (X (CovCoord.sym s c)) = symOld c s := aeval_X _ _ + +@[simp] +lemma newToOld_curv (q : CurvPair) (c : Col) : + newToOld (X (CovCoord.curv q c)) = curvPoly q.1.1 q.1.2 c := aeval_X _ _ + +lemma newToOld_connCov (ν : Lor) : (fun a => newToOld (connCov ν a)) = connOld ν := by + funext a + exact newToOld_conn ν a + +lemma oldToNew_connOld (ν : Lor) : (fun a => oldToNew (connOld ν a)) = connCov ν := by + funext a + exact oldToNew_conn ν a + +lemma newToOld_brP_conn (ν μ : Lor) (c : Col) : + newToOld (brP (connCov ν) (connCov μ) c) = brP (connOld ν) (connOld μ) c := by + rw [algHom_brP, newToOld_connCov, newToOld_connCov] + +lemma oldToNew_brP_conn (ν μ : Lor) (c : Col) : + oldToNew (brP (connOld ν) (connOld μ) c) = brP (connCov ν) (connCov μ) c := by + rw [algHom_brP, oldToNew_connOld, oldToNew_connOld] + +/-- The inverse image of the curvature variable is the field strength, at every ordered pair. -/ +lemma newToOld_curvVar (ν μ : Lor) (c : Col) : + newToOld (curvVar ν μ c) = curvPoly ν μ c := by + rw [curvVar] + by_cases h : LorLT ν μ + · rw [dif_pos h, newToOld_curv] + · by_cases h' : LorLT μ ν + · rw [dif_neg h, dif_pos h', map_neg, newToOld_curv, ← curvPoly_swap] + · rw [dif_neg h, dif_neg h', map_zero] + rcases lor_trichotomy ν μ with hlt | rfl | hgt + · exact absurd hlt h + · rw [curvPoly_self] + · exact absurd hgt h' + +/-! + +## G. The coordinate change is invertible + +-/ + +lemma newToOld_oldToNew (i : Coord) : newToOld (oldToNew (X i)) = X i := by + cases i with + | conn μ c => rw [oldToNew_conn, newToOld_conn] + | der ν μ c => + rw [oldToNew_der, map_add, map_smul, map_sub, newToOld_sym, newToOld_curvVar, + newToOld_brP_conn, symOld_mk, curvPoly] + module + +lemma oldToNew_newToOld (i : CovCoord) : oldToNew (newToOld (X i)) = X i := by + cases i with + | conn μ c => rw [newToOld_conn, oldToNew_conn] + | sym s c => + induction s using Sym2.ind with + | _ ν μ => + rw [newToOld_sym, symOld_mk, map_smul, map_add, oldToNew_der, oldToNew_der, + Sym2.eq_swap (a := μ) (b := ν), curvVar_swap μ ν c, + brP_swap (connCov μ) (connCov ν) c] + module + | curv q c => + obtain ⟨⟨ν, μ⟩, hq⟩ := q + rw [newToOld_curv, curvPoly, map_add, map_sub, oldToNew_der, oldToNew_der, + oldToNew_brP_conn, Sym2.eq_swap (a := μ) (b := ν), curvVar_swap μ ν c, + brP_swap (connCov μ) (connCov ν) c, curvVar_of_lt hq] + module + +/-- **The first-order covariant coordinate change.** The ordinary first-order gluon jet algebra + and the covariant one are the same algebra: the derivative block splits as its symmetric part + together with the field strength, and the inverse substitution carries the nonabelian commutator + correction. -/ +noncomputable def covEquiv : A₁ ≃ₐ[ℝ] A₁cov := + AlgEquiv.ofAlgHom oldToNew newToOld + (by refine algHom_ext fun i => ?_; rw [AlgHom.comp_apply, oldToNew_newToOld, AlgHom.id_apply]) + (by refine algHom_ext fun i => ?_; rw [AlgHom.comp_apply, newToOld_oldToNew, AlgHom.id_apply]) + +@[simp] +lemma covEquiv_apply (P : A₁) : covEquiv P = oldToNew P := rfl + +@[simp] +lemma covEquiv_symm_apply (Q : A₁cov) : covEquiv.symm Q = newToOld Q := rfl + +@[simp] +lemma newToOld_oldToNew_apply (P : A₁) : newToOld (oldToNew P) = P := + covEquiv.symm_apply_apply P + +@[simp] +lemma oldToNew_newToOld_apply (Q : A₁cov) : oldToNew (newToOld Q) = Q := + covEquiv.apply_symm_apply Q + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean new file mode 100644 index 000000000..87c1ad499 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean @@ -0,0 +1,750 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.OrdinaryJets +/-! +# The covariant curvature tower and its residual action + +## i. Overview + +This file builds, **inside** `OrdinaryJets`'s ordinary jet algebra, the field strength, the +covariant derivative and +the genuinely symmetrized covariant derivatives `D^r F` at arbitrary order, and proves that the +whole tower transforms under a jet gauge transformation only through the base-point value of the +jet. The covariant tower consists of honest elements of the ordinary algebra: it satisfies +antisymmetry, Bianchi and commutator relations, and no new carrier variables are introduced. + +## ii. Conventions + +The `HookBianchi` hermitian conventions, unchanged: + +```text +br(M,N) = i (M N - N M) +F_νμ = ∂_ν A_μ - ∂_μ A_ν + br(A_ν, A_μ) +D_ρ X = ∂_ρ X + br(A_ρ, X). +``` + +## iii. Method + +The covariance proof runs through a *series* evaluation dictionary rather than through a +generator-by-generator commutation rule for `gaugePull` and `jetDeriv` (which is not clean, because +the substitution freezes the Taylor coefficients of the gauge jet at the base point). Concretely: + +* `evalS A : JetAlgebra →ₐ[ℝ] MvPowerSeries Lor ℝ` substitutes a colour potential and its + derivatives *at a varying point*, and intertwines `jetDeriv` with `MvPowerSeries.pderiv`; +* `cser` turns a colour vector of real series into a matrix of jets, intertwining `brR` with the + matrix bracket; +* at the level of matrices of jets the covariance of `F` and of `D_ρ` is the classical + computation, whose only nontrivial input is the Maurer–Cartan structure equation + `∂_ν m_μ - ∂_μ m_ν = m_ν m_μ - m_μ m_ν` (`dMat_mcP_sub`, from `GaugeAction`'s `dMat_mcP`); +* taking base-point values turns conjugation by the series `U` into `Ad` by `evalSU U`. + +## iv. Symmetrization + +`covIter t` is the *ordered* iterated covariant derivative along a tuple `t : Fin r → Lor`. +Covariant derivatives do **not** commute, so the published tower is the genuine symmetrization + +```text +covCurv t ν μ = (r !)⁻¹ • ∑_{σ : Equiv.Perm (Fin r)} covIter (t ∘ σ) (curvVec ν μ), +``` + +and `covCurv_perm` proves it is unchanged by any permutation of the derivative slots. No claim is +made that the unsymmetrized `covIter` depends only on the multiset of directions. + +## v. Results + +* `evalS`, `evalS_jetDeriv`, `constantCoeff_evalS` — the series evaluation dictionary; +* `curvVec`, `covD`, `covIter`, `covCurv`, `covCurv_perm` — the covariant tower; +* `gaugePull_covCurv` — the arbitrary-order covariance theorem; +* `covAlgebra`, `gaugePull_covAlgebra_le`, `gaugePull_eq_self_of_based`, + `gaugePull_eq_of_evalSU_eq`, `gaugePull_eq_ofConstantSU` — the generated subalgebra results. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. The series evaluation dictionary + +Substituting a colour potential into a jet polynomial gives a *function of spacetime*, i.e. a +formal power series with real coefficients. Under this substitution the formal total derivative +of `OrdinaryJets` becomes the formal partial derivative of the power series. + +-/ + +/-- Real formal power series in the spacetime coordinates: the values of jet polynomials on a + fixed field configuration. -/ +abbrev RSeries : Type := MvPowerSeries Lor ℝ + +/-- A real series with prescribed Taylor coefficients. -/ +def mkRSeries (f : DIdx → ℝ) : RSeries := f + +@[simp] +lemma coeff_mkRSeries (f : DIdx → ℝ) (k : DIdx) : + MvPowerSeries.coeff k (mkRSeries f) = f k := rfl + +/-- The colour component of the `s`-th ordinary derivative of a colour potential, as a function of + the spacetime point. Its `k`-th Taylor coefficient is `(k+s)!/k!` times the `(k+s)`-th + coefficient of the potential. -/ +noncomputable def sCoordS (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) : RSeries := + mkRSeries fun k => facI (k + s) / facI k * coordC c (A.coeffC (k + s) μ) + +lemma constantCoeff_sCoordS (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) : + MvPowerSeries.constantCoeff (sCoordS A s μ c) = potPt A (JetGenerators.dA s μ c) := by + show facI (0 + s) / facI 0 * coordC c (A.coeffC (0 + s) μ) = _ + rw [zero_add, facI_zero, div_one] + rfl + +/-- **The derivative rule for the series dictionary.** Differentiating the component function of + `∂_s A_μ` gives the component function of `∂_{s+ρ} A_μ`. -/ +lemma pderiv_sCoordS (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) (ρ : Lor) : + MvPowerSeries.pderiv ℝ ρ (sCoordS A s μ c) = sCoordS A (s + Finsupp.single ρ 1) μ c := by + refine MvPowerSeries.ext fun k => ?_ + have hidx : k + Finsupp.single ρ 1 + s = k + (s + Finsupp.single ρ 1) := by + rw [add_assoc, add_comm (Finsupp.single ρ 1) s] + have hk : facI k ≠ 0 := facI_ne_zero k + have hr : ((k ρ : ℝ) + 1) ≠ 0 := by positivity + rw [MvPowerSeries.coeff_pderiv, sCoordS, sCoordS, coeff_mkRSeries, coeff_mkRSeries, hidx, + facI_add_single] + field_simp + +/-- The series dictionary on the ordinary generators. -/ +noncomputable def sCoordGen (A : ColourPot) : JetGenerators → RSeries + | .dA s μ c => sCoordS A s μ c + +@[simp] +lemma sCoordGen_dA (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) : + sCoordGen A (JetGenerators.dA s μ c) = sCoordS A s μ c := rfl + +/-- **Evaluation of a jet polynomial on a colour potential**, as a function of the spacetime + point. -/ +noncomputable def evalS (A : ColourPot) : JetAlgebra →ₐ[ℝ] RSeries := + (MvPolynomial.aeval (sCoordGen A)).comp toPoly.toAlgHom + +@[simp] +lemma evalS_ofGen (A : ColourPot) (g : JetGenerators) : evalS A (ofGen g) = sCoordGen A g := by + show MvPolynomial.aeval (sCoordGen A) (toPoly (ofGen g)) = _ + rw [toPoly_ofGen, aeval_X] + +private lemma aeval_polyDeriv (A : ColourPot) (ρ : Lor) (p : MvPolynomial JetGenerators ℝ) : + MvPolynomial.aeval (sCoordGen A) (polyDeriv ρ p) = + MvPowerSeries.pderiv ℝ ρ (MvPolynomial.aeval (sCoordGen A) p) := by + induction p using MvPolynomial.induction_on with + | C a => + rw [← algebraMap_eq, Derivation.map_algebraMap, map_zero, AlgHom.commutes, + Derivation.map_algebraMap] + | add p q hp hq => simp only [map_add, hp, hq] + | mul_X p g hp => + cases g with + | dA s μ c => + simp only [Derivation.leibniz, polyDeriv_X, smul_eq_mul, map_add, map_mul, aeval_X, + JetGenerators.shift_dA, sCoordGen_dA, hp, pderiv_sCoordS] + +/-- **The total derivative is the spacetime derivative of the substituted function.** -/ +lemma evalS_jetDeriv (A : ColourPot) (ρ : Lor) (P : JetAlgebra) : + evalS A (jetDeriv ρ P) = MvPowerSeries.pderiv ℝ ρ (evalS A P) := by + show MvPolynomial.aeval (sCoordGen A) (toPoly (jetDeriv ρ P)) = _ + rw [toPoly_jetDeriv, aeval_polyDeriv] + rfl + +/-- The base-point value of a real series, as an algebra map. -/ +noncomputable def constCoeffHom : RSeries →ₐ[ℝ] ℝ := + { (MvPowerSeries.constantCoeff : RSeries →+* ℝ) with + commutes' := fun r => by + show MvPowerSeries.constantCoeff (algebraMap ℝ RSeries r) = r + simp [MvPowerSeries.algebraMap_apply] } + +/-- Reading off the base-point value of a substituted jet polynomial is evaluating it at the + coordinate point of the potential. -/ +lemma constantCoeff_evalS (A : ColourPot) (P : JetAlgebra) : + MvPowerSeries.constantCoeff (evalS A P) = evalA (potPt A) P := by + have h : constCoeffHom.comp (evalS A) = evalA (potPt A) := + jetAlgHom_ext fun g => by + cases g with + | dA s μ c => + rw [AlgHom.comp_apply, evalS_ofGen, evalA_ofGen] + exact constantCoeff_sCoordS A s μ c + exact DFunLike.congr_fun h P + +/-! + +## B. Colour vectors of series as matrices of jets + +-/ + +lemma jetMat_ext {M N : Matrix (Fin 3) (Fin 3) JetRing} (h : ∀ k, coeffMat k M = coeffMat k N) : + M = N := by + refine Matrix.ext fun i j => MvPowerSeries.ext fun k => ?_ + exact congrFun (congrFun (h k) i) j + +lemma coeffMat_mul (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat k (M * N) = ∑ p ∈ Finset.antidiagonal k, coeffMat p.1 M * coeffMat p.2 N := by + refine Matrix.ext fun i j => ?_ + rw [Matrix.sum_apply] + show MvPowerSeries.coeff k (∑ l, M i l * N l j) = + ∑ p ∈ Finset.antidiagonal k, ∑ l, coeffMat p.1 M i l * coeffMat p.2 N l j + rw [map_sum, Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => MvPowerSeries.coeff_mul _ _ _ + +lemma coeffMat_sub (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat k (M - N) = coeffMat k M - coeffMat k N := + Matrix.ext fun i j => by + show MvPowerSeries.coeff k (M i j - N i j) = _ + rw [map_sub] + rfl + +lemma coeffMat_dMat (k : DIdx) (ρ : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat k (dMat ρ M) = ((k ρ : ℂ) + 1) • coeffMat (k + Finsupp.single ρ 1) M := by + refine Matrix.ext fun i j => ?_ + show MvPowerSeries.coeff k (MvPowerSeries.pderiv ℂ ρ (M i j)) = + ((k ρ : ℂ) + 1) * MvPowerSeries.coeff (k + Finsupp.single ρ 1) (M i j) + rw [MvPowerSeries.coeff_pderiv] + ring + +/-- The hermitian colour bracket on matrices of jets. -/ +noncomputable def brJ (M N : Matrix (Fin 3) (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing := + (MvPowerSeries.C Complex.I : JetRing) • (M * N - N * M) + +lemma coeffMat_brJ (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat k (brJ M N) = + ∑ p ∈ Finset.antidiagonal k, brMat (coeffMat p.1 M) (coeffMat p.2 N) := by + have hsm : ∀ (X : Matrix (Fin 3) (Fin 3) JetRing), + coeffMat k ((MvPowerSeries.C Complex.I : JetRing) • X) = Complex.I • coeffMat k X := by + intro X + refine Matrix.ext fun i j => ?_ + show MvPowerSeries.coeff k ((MvPowerSeries.C Complex.I : JetRing) * X i j) = + Complex.I * MvPowerSeries.coeff k (X i j) + rw [MvPowerSeries.coeff_C_mul] + rw [brJ, hsm, coeffMat_sub, coeffMat_mul, coeffMat_mul, + Finsupp.sum_antidiagonal_swap k fun a b => coeffMat a N * coeffMat b M, + ← Finset.sum_sub_distrib, Finset.smul_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [brMat, smul_sub] + +/-- A colour vector of real series, as a matrix of jets. -/ +noncomputable def cser (f : Col → RSeries) : Matrix (Fin 3) (Fin 3) JetRing := + Matrix.of fun i j => ∑ c, MvPowerSeries.map (algebraMap ℝ ℂ) (f c) * + (MvPowerSeries.C (cmat (colourBasis c) i j) : JetRing) + +lemma coeffMat_cser (k : DIdx) (f : Col → RSeries) : + coeffMat k (cser f) = cmat (mkC fun c => MvPowerSeries.coeff k (f c)) := by + refine Matrix.ext fun i j => ?_ + rw [mkC_eq_sum, cmat_sum] + show MvPowerSeries.coeff k (∑ c, MvPowerSeries.map (algebraMap ℝ ℂ) (f c) * + (MvPowerSeries.C (cmat (colourBasis c) i j) : JetRing)) = _ + rw [map_sum, Matrix.sum_apply] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [MvPowerSeries.coeff_mul_C, MvPowerSeries.coeff_map] + rfl + +lemma cser_injective : Function.Injective cser := by + intro f g h + funext c + refine MvPowerSeries.ext fun k => ?_ + have hk : cmat (mkC fun c => MvPowerSeries.coeff k (f c)) = + cmat (mkC fun c => MvPowerSeries.coeff k (g c)) := by + rw [← coeffMat_cser, ← coeffMat_cser, h] + have := congrArg (coordC c) (cmat_injective hk) + rwa [coordC_mkC, coordC_mkC] at this + +lemma mkC_add (f g : Col → ℝ) : mkC (fun c => f c + g c) = mkC f + mkC g := by + rw [mkC, mkC, mkC, ← map_add] + rfl + +lemma mkC_sub (f g : Col → ℝ) : mkC (fun c => f c - g c) = mkC f - mkC g := by + rw [mkC, mkC, mkC, ← map_sub] + rfl + +lemma cser_add (f g : Col → RSeries) : cser (f + g) = cser f + cser g := by + refine jetMat_ext fun k => ?_ + rw [coeffMat_add, coeffMat_cser, coeffMat_cser, coeffMat_cser, + show (fun c => MvPowerSeries.coeff k ((f + g) c)) = + (fun c => MvPowerSeries.coeff k (f c) + MvPowerSeries.coeff k (g c)) from + funext fun c => map_add _ _ _, mkC_add, cmat_add] + +lemma cser_sub (f g : Col → RSeries) : cser (f - g) = cser f - cser g := by + refine jetMat_ext fun k => ?_ + rw [coeffMat_sub, coeffMat_cser, coeffMat_cser, coeffMat_cser, + show (fun c => MvPowerSeries.coeff k ((f - g) c)) = + (fun c => MvPowerSeries.coeff k (f c) - MvPowerSeries.coeff k (g c)) from + funext fun c => map_sub _ _ _, mkC_sub, cmat_sub] + +/-- The matrix dictionary intertwines the spacetime derivative with the entrywise derivative. -/ +lemma dMat_cser (ρ : Lor) (f : Col → RSeries) : + dMat ρ (cser f) = cser fun c => MvPowerSeries.pderiv ℝ ρ (f c) := by + refine jetMat_ext fun k => ?_ + rw [coeffMat_dMat, coeffMat_cser, coeffMat_cser] + refine Matrix.ext fun i j => ?_ + rw [Matrix.smul_apply, mkC_eq_sum, mkC_eq_sum, cmat_sum, cmat_sum, Matrix.sum_apply, + Matrix.sum_apply, Finset.smul_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [cmat_smul, cmat_smul, Matrix.smul_apply, Matrix.smul_apply, MvPowerSeries.coeff_pderiv] + show ((k ρ : ℂ) + 1) * ((MvPowerSeries.coeff (k + Finsupp.single ρ 1) (f c) : ℝ) * + cmat (colourBasis c) i j) = + ((MvPowerSeries.coeff (k + Finsupp.single ρ 1) (f c) * ((k ρ : ℝ) + 1) : ℝ) * + cmat (colourBasis c) i j) + push_cast + ring + +/-- The matrix dictionary intertwines the polynomial colour bracket with the matrix bracket. -/ +lemma brJ_cser (f g : Col → RSeries) : brJ (cser f) (cser g) = cser (brR f g) := by + refine jetMat_ext fun k => ?_ + have hL : ∀ p : DIdx × DIdx, brMat (coeffMat p.1 (cser f)) (coeffMat p.2 (cser g)) = + cmat (br (mkC fun c => MvPowerSeries.coeff p.1 (f c)) + (mkC fun c => MvPowerSeries.coeff p.2 (g c))) := fun p => by + rw [cmat_br, coeffMat_cser, coeffMat_cser] + have hbr : ∀ p : DIdx × DIdx, ∀ c : Col, + coordC c (br (mkC fun a => MvPowerSeries.coeff p.1 (f a)) + (mkC fun b => MvPowerSeries.coeff p.2 (g b))) = + ∑ a, ∑ b, MvPowerSeries.coeff p.1 (f a) * MvPowerSeries.coeff p.2 (g b) * + cstruct a b c := fun p c => by + rw [coordC_br] + exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => by + rw [coordC_mkC, coordC_mkC] + rw [coeffMat_brJ, coeffMat_cser, + Finset.sum_congr rfl fun p (_ : p ∈ Finset.antidiagonal k) => hL p, ← cmat_sum] + congr 1 + rw [← mkC_coordC (∑ p ∈ Finset.antidiagonal k, + br (mkC fun c => MvPowerSeries.coeff p.1 (f c)) (mkC fun c => MvPowerSeries.coeff p.2 (g c)))] + congr 1 + funext c + have hLHS : coordC c (∑ p ∈ Finset.antidiagonal k, + br (mkC fun a => MvPowerSeries.coeff p.1 (f a)) + (mkC fun b => MvPowerSeries.coeff p.2 (g b))) = + ∑ a, ∑ b, ∑ p ∈ Finset.antidiagonal k, + MvPowerSeries.coeff p.1 (f a) * MvPowerSeries.coeff p.2 (g b) * cstruct a b c := by + rw [map_sum, Finset.sum_congr rfl fun p (_ : p ∈ Finset.antidiagonal k) => hbr p c, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.sum_comm + have hRHS : MvPowerSeries.coeff k (brR f g c) = + ∑ a, ∑ b, ∑ p ∈ Finset.antidiagonal k, + MvPowerSeries.coeff p.1 (f a) * MvPowerSeries.coeff p.2 (g b) * cstruct a b c := by + rw [brR, map_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + show MvPowerSeries.coeff k ((MvPowerSeries.C (cstruct a b c) : RSeries) * (f a * g b)) = _ + rw [MvPowerSeries.coeff_C_mul, MvPowerSeries.coeff_mul, Finset.mul_sum] + exact Finset.sum_congr rfl fun p _ => by ring + rw [hLHS, hRHS] + +lemma jetValue_cser (f : Col → RSeries) : + Gluon.jetValue (cser f) = cmat (mkC fun c => MvPowerSeries.constantCoeff (f c)) := by + rw [← coeffMat_zero_eq_jetValue, coeffMat_cser] + rfl + +/-! + +## C. Covariance at the level of matrices of jets + +At series level the field strength and the covariant derivative obey the classical covariance laws. +The only nontrivial input is the Maurer–Cartan structure equation. + +-/ + +lemma dMat_add (ν : Lor) (M N : Matrix (Fin 3) (Fin 3) JetRing) : + dMat ν (M + N) = dMat ν M + dMat ν N := + Matrix.ext fun i j => by + show MvPowerSeries.pderiv ℂ ν (M i j + N i j) = _ + rw [map_add] + rfl + +lemma dMat_smul_CI (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + dMat ν ((MvPowerSeries.C Complex.I : JetRing) • M) = + (MvPowerSeries.C Complex.I : JetRing) • dMat ν M := + Matrix.ext fun i j => by + show MvPowerSeries.pderiv ℂ ν ((MvPowerSeries.C Complex.I : JetRing) * M i j) = + (MvPowerSeries.C Complex.I : JetRing) * MvPowerSeries.pderiv ℂ ν (M i j) + rw [Derivation.leibniz, pderiv_C_jet, smul_zero, add_zero, smul_eq_mul] + +/-- The derivative of the gauge jet is the Maurer–Cartan series times the jet. -/ +lemma dMat_coe (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) : + dMat ρ U.1 = mcP U ρ * U.1 := by + rw [mcP, Matrix.mul_assoc, coe_star_mul_self, Matrix.mul_one] + +/-- The derivative of a conjugate. -/ +lemma dMat_conj (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) + (M : Matrix (Fin 3) (Fin 3) JetRing) : + dMat ρ (U.1 * M * star U.1) = + mcP U ρ * (U.1 * M * star U.1) + U.1 * dMat ρ M * star U.1 - + (U.1 * M * star U.1) * mcP U ρ := by + rw [dMat_mul, dMat_mul, dMat_coe, dMat_star_coe] + noncomm_ring + +lemma brJ_swap (M N : Matrix (Fin 3) (Fin 3) JetRing) : brJ M N = -brJ N M := by + rw [brJ, brJ, ← smul_neg, neg_sub] + +lemma brJ_add_left (M M' N : Matrix (Fin 3) (Fin 3) JetRing) : + brJ (M + M') N = brJ M N + brJ M' N := by + rw [brJ, brJ, brJ, ← smul_add] + congr 1 + noncomm_ring + +lemma brJ_add_right (M N N' : Matrix (Fin 3) (Fin 3) JetRing) : + brJ M (N + N') = brJ M N + brJ M N' := by + rw [brJ, brJ, brJ, ← smul_add] + congr 1 + noncomm_ring + +private lemma smul_CI_CI (X : Matrix (Fin 3) (Fin 3) JetRing) : + (MvPowerSeries.C Complex.I : JetRing) • ((MvPowerSeries.C Complex.I : JetRing) • X) = -X := by + rw [smul_smul, ← map_mul, Complex.I_mul_I, map_neg, map_one, neg_smul, one_smul] + +/-- The bracket of two conjugates is the conjugate of the bracket. -/ +lemma brJ_conj (U : specialUnitaryGroup (Fin 3) JetRing) + (M N : Matrix (Fin 3) (Fin 3) JetRing) : + brJ (U.1 * M * star U.1) (U.1 * N * star U.1) = U.1 * brJ M N * star U.1 := by + have key : ∀ P Q : Matrix (Fin 3) (Fin 3) JetRing, + U.1 * P * star U.1 * (U.1 * Q * star U.1) = U.1 * (P * Q) * star U.1 := by + intro P Q + calc U.1 * P * star U.1 * (U.1 * Q * star U.1) + = U.1 * P * (star U.1 * U.1) * Q * star U.1 := by noncomm_ring + _ = U.1 * (P * Q) * star U.1 := by rw [coe_star_mul_self]; noncomm_ring + rw [brJ, brJ, key, key, ← Matrix.sub_mul, ← Matrix.mul_sub, Matrix.mul_smul, Matrix.smul_mul] + +/-- The bracket with the hermitian Maurer–Cartan series, on the left. -/ +lemma brJ_mcH_left (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) + (M : Matrix (Fin 3) (Fin 3) JetRing) : + brJ (mcH U ρ) M = -(mcP U ρ * M - M * mcP U ρ) := by + rw [brJ, mcH, Matrix.smul_mul, Matrix.mul_smul, ← smul_sub, smul_CI_CI] + +/-- The bracket with the hermitian Maurer–Cartan series, on the right. -/ +lemma brJ_mcH_right (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) + (M : Matrix (Fin 3) (Fin 3) JetRing) : + brJ M (mcH U ρ) = mcP U ρ * M - M * mcP U ρ := by + rw [brJ_swap, brJ_mcH_left, neg_neg] + +lemma brJ_mcH_mcH (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) : + brJ (mcH U ν) (mcH U μ) = + -((MvPowerSeries.C Complex.I : JetRing) • (mcP U ν * mcP U μ) - + (MvPowerSeries.C Complex.I : JetRing) • (mcP U μ * mcP U ν)) := by + rw [brJ_mcH_left, mcH, Matrix.mul_smul, Matrix.smul_mul] + +/-- **The Maurer–Cartan structure equation.** -/ +lemma dMat_mcP_sub (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) : + dMat ν (mcP U μ) - dMat μ (mcP U ν) = mcP U ν * mcP U μ - mcP U μ * mcP U ν := by + rw [dMat_mcP, dMat_mcP, dMat_comm ν μ U.1] + abel + +/-- **The field strength** of a colour potential, as a matrix of jets. -/ +noncomputable def curvJ (A : ColourPot) (ν μ : Lor) : Matrix (Fin 3) (Fin 3) JetRing := + dMat ν (A.pot μ) - dMat μ (A.pot ν) + brJ (A.pot ν) (A.pot μ) + +/-- **The covariant derivative** on matrices of jets. -/ +noncomputable def covDJ (A : ColourPot) (ρ : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing := dMat ρ M + brJ (A.pot ρ) M + +/-- **Covariance of the covariant derivative** at series level. -/ +lemma covDJ_conj (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) (ρ : Lor) + (M : Matrix (Fin 3) (Fin 3) JetRing) : + covDJ (actPotC U A) ρ (U.1 * M * star U.1) = U.1 * covDJ A ρ M * star U.1 := by + rw [covDJ, covDJ, actPotC_pot, actPot, dMat_conj, brJ_add_left, brJ_conj, brJ_mcH_left, + Matrix.mul_add, Matrix.add_mul] + abel + +/-- **Covariance of the field strength** at series level. -/ +lemma curvJ_actPotC (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) (ν μ : Lor) : + curvJ (actPotC U A) ν μ = U.1 * curvJ A ν μ * star U.1 := by + have h1 : ∀ σ τ : Lor, dMat σ (actPot U A.pot τ) = + mcP U σ * (U.1 * A.pot τ * star U.1) + U.1 * dMat σ (A.pot τ) * star U.1 - + (U.1 * A.pot τ * star U.1) * mcP U σ + + ((MvPowerSeries.C Complex.I : JetRing) • (dMat σ (dMat τ U.1) * star U.1) - + (MvPowerSeries.C Complex.I : JetRing) • (mcP U τ * mcP U σ)) := by + intro σ τ + rw [actPot, dMat_add, dMat_conj, mcH, dMat_smul_CI, dMat_mcP, smul_sub] + have h2 : brJ (actPot U A.pot ν) (actPot U A.pot μ) = + U.1 * brJ (A.pot ν) (A.pot μ) * star U.1 + + (mcP U μ * (U.1 * A.pot ν * star U.1) - (U.1 * A.pot ν * star U.1) * mcP U μ) - + (mcP U ν * (U.1 * A.pot μ * star U.1) - (U.1 * A.pot μ * star U.1) * mcP U ν) - + ((MvPowerSeries.C Complex.I : JetRing) • (mcP U ν * mcP U μ) - + (MvPowerSeries.C Complex.I : JetRing) • (mcP U μ * mcP U ν)) := by + rw [actPot, actPot, brJ_add_left, brJ_add_right, brJ_add_right, brJ_conj, brJ_mcH_left, + brJ_mcH_right, brJ_mcH_mcH] + abel + rw [curvJ, curvJ, actPotC_pot, h1 ν μ, h1 μ ν, h2, dMat_comm ν μ U.1, + show U.1 * (dMat ν (A.pot μ) - dMat μ (A.pot ν) + brJ (A.pot ν) (A.pot μ)) * star U.1 = + U.1 * dMat ν (A.pot μ) * star U.1 - U.1 * dMat μ (A.pot ν) * star U.1 + + U.1 * brJ (A.pot ν) (A.pot μ) * star U.1 from by noncomm_ring] + abel + +/-! + +## D. The covariant tower inside the ordinary jet algebra + +-/ + +/-- The connection colour vector of the ordinary jet algebra. -/ +noncomputable def connVec (μ : Lor) : Col → JetAlgebra := genVec 0 μ + +/-- **The field strength inside the ordinary jet algebra**, in the `HookBianchi` hermitian + convention + `F_νμ = ∂_ν A_μ - ∂_μ A_ν + br(A_ν, A_μ)`. -/ +noncomputable def curvVec (ν μ : Lor) : Col → JetAlgebra := + fun c => jetDeriv ν (connVec μ c) - jetDeriv μ (connVec ν c) + brR (connVec ν) (connVec μ) c + +/-- **The covariant derivative** on colour vectors of the ordinary jet algebra: + `D_ρ X = ∂_ρ X + br(A_ρ, X)`, the `HookBianchi` convention. -/ +noncomputable def covD (ρ : Lor) (X : Col → JetAlgebra) : Col → JetAlgebra := + fun c => jetDeriv ρ (X c) + brR (connVec ρ) X c + +/-- The field strength is antisymmetric. Such relations are *allowed*: the tower consists of + elements of the ordinary algebra, not of independent carrier variables. -/ +lemma curvVec_swap (ν μ : Lor) (c : Col) : curvVec ν μ c = -curvVec μ ν c := by + rw [curvVec, curvVec, brR_swap (connVec ν) (connVec μ) c] + abel + +lemma curvVec_self (ν : Lor) (c : Col) : curvVec ν ν c = 0 := by + rw [curvVec, brR_self, sub_self, add_zero] + +/-- The **ordered** iterated covariant derivative along a tuple of directions. Covariant + derivatives do not commute, so this genuinely depends on the ordering; the published tower + symmetrizes it. -/ +noncomputable def covIter : (r : ℕ) → (Fin r → Lor) → (Col → JetAlgebra) → (Col → JetAlgebra) + | 0, _, X => X + | (n + 1), t, X => covD (t 0) (covIter n (fun i => t i.succ) X) + +@[simp] +lemma covIter_zero (t : Fin 0 → Lor) (X : Col → JetAlgebra) : covIter 0 t X = X := rfl + +@[simp] +lemma covIter_succ (n : ℕ) (t : Fin (n + 1) → Lor) (X : Col → JetAlgebra) : + covIter (n + 1) t X = covD (t 0) (covIter n (fun i => t i.succ) X) := rfl + +/-- **The symmetrized covariant derivative tower `D^r F`**, parametric in the derivative order. -/ +noncomputable def covCurv {r : ℕ} (t : Fin r → Lor) (ν μ : Lor) : Col → JetAlgebra := + fun c => (Nat.factorial r : ℝ)⁻¹ • + ∑ σ : Equiv.Perm (Fin r), covIter r (t ∘ σ) (curvVec ν μ) c + +/-- **The published tower is genuinely symmetric**: it is unchanged by any permutation of the + derivative slots. No such claim is made for the unsymmetrized `covIter`. -/ +lemma covCurv_perm {r : ℕ} (t : Fin r → Lor) (π : Equiv.Perm (Fin r)) (ν μ : Lor) : + covCurv (t ∘ π) ν μ = covCurv t ν μ := by + funext c + rw [covCurv, covCurv] + congr 1 + refine Fintype.sum_equiv (Equiv.mulLeft π) _ _ fun σ => ?_ + rfl + +/-- **Degree-one agreement with the `HookBianchi` pilot**: the first covariant derivative of the + field + strength is `D_ρ F_νμ = ∂_ρ F_νμ + br(A_ρ, F_νμ)`. -/ +lemma covCurv_one (ρ ν μ : Lor) (c : Col) : + covCurv (fun _ : Fin 1 => ρ) ν μ c = + jetDeriv ρ (curvVec ν μ c) + brR (connVec ρ) (curvVec ν μ) c := by + have hall : ∀ σ : Equiv.Perm (Fin 1), + covIter 1 ((fun _ : Fin 1 => ρ) ∘ ⇑σ) (curvVec ν μ) c = + jetDeriv ρ (curvVec ν μ c) + brR (connVec ρ) (curvVec ν μ) c := fun _ => rfl + rw [covCurv, Finset.sum_congr rfl fun σ (_ : σ ∈ Finset.univ) => hall σ, Finset.sum_const, + Finset.card_univ, Fintype.card_perm, Fintype.card_fin] + simp + +/-- The **ordered** iterated covariant derivative on matrices of jets. -/ +noncomputable def covIterJ (A : ColourPot) : (r : ℕ) → (Fin r → Lor) → + Matrix (Fin 3) (Fin 3) JetRing → Matrix (Fin 3) (Fin 3) JetRing + | 0, _, M => M + | (n + 1), t, M => covDJ A (t 0) (covIterJ A n (fun i => t i.succ) M) + +@[simp] +lemma covIterJ_zero (A : ColourPot) (t : Fin 0 → Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + covIterJ A 0 t M = M := rfl + +@[simp] +lemma covIterJ_succ (A : ColourPot) (n : ℕ) (t : Fin (n + 1) → Lor) + (M : Matrix (Fin 3) (Fin 3) JetRing) : + covIterJ A (n + 1) t M = covDJ A (t 0) (covIterJ A n (fun i => t i.succ) M) := rfl + +/-- The image of a colour vector of the ordinary algebra under the series dictionary. -/ +noncomputable def evalCS (A : ColourPot) (X : Col → JetAlgebra) : + Matrix (Fin 3) (Fin 3) JetRing := cser fun c => evalS A (X c) + +lemma evalCS_connVec (A : ColourPot) (μ : Lor) : evalCS A (connVec μ) = A.pot μ := by + refine jetMat_ext fun k => ?_ + rw [evalCS, coeffMat_cser, ← ColourPot.cmat_coeffC] + refine congrArg cmat (Eq.trans (congrArg mkC ?_) (mkC_coordC (A.coeffC k μ))) + funext c + show MvPowerSeries.coeff k (evalS A (connVec μ c)) = coordC c (A.coeffC k μ) + rw [connVec, genVec, evalS_ofGen, sCoordGen_dA, sCoordS, coeff_mkRSeries, add_zero, + div_self (facI_ne_zero k), one_mul] + +lemma evalCS_curvVec (A : ColourPot) (ν μ : Lor) : evalCS A (curvVec ν μ) = curvJ A ν μ := by + have h : (fun c => evalS A (curvVec ν μ c)) = + (fun c => MvPowerSeries.pderiv ℝ ν (evalS A (connVec μ c))) - + (fun c => MvPowerSeries.pderiv ℝ μ (evalS A (connVec ν c))) + + brR (fun c => evalS A (connVec ν c)) (fun c => evalS A (connVec μ c)) := by + funext c + rw [curvVec, map_add, map_sub, evalS_jetDeriv, evalS_jetDeriv, algHom_brR] + rfl + rw [evalCS, h, cser_add, cser_sub, ← dMat_cser, ← dMat_cser, ← brJ_cser, curvJ, + show (cser fun c => evalS A (connVec μ c)) = A.pot μ from evalCS_connVec A μ, + show (cser fun c => evalS A (connVec ν c)) = A.pot ν from evalCS_connVec A ν] + +lemma evalCS_covD (A : ColourPot) (ρ : Lor) (X : Col → JetAlgebra) : + evalCS A (covD ρ X) = covDJ A ρ (evalCS A X) := by + have h : (fun c => evalS A (covD ρ X c)) = + (fun c => MvPowerSeries.pderiv ℝ ρ (evalS A (X c))) + + brR (fun c => evalS A (connVec ρ c)) (fun c => evalS A (X c)) := by + funext c + rw [covD, map_add, evalS_jetDeriv, algHom_brR] + rfl + rw [evalCS, h, cser_add, ← dMat_cser, ← brJ_cser, covDJ, + show (cser fun c => evalS A (connVec ρ c)) = A.pot ρ from evalCS_connVec A ρ] + rfl + +lemma evalCS_covIter (A : ColourPot) : ∀ (r : ℕ) (t : Fin r → Lor) (X : Col → JetAlgebra), + evalCS A (covIter r t X) = covIterJ A r t (evalCS A X) + | 0, _, _ => rfl + | (n + 1), t, X => by + rw [covIter_succ, covIterJ_succ, evalCS_covD, evalCS_covIter A n] + +lemma covIterJ_conj (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : + ∀ (r : ℕ) (t : Fin r → Lor) (M : Matrix (Fin 3) (Fin 3) JetRing), + covIterJ (actPotC U A) r t (U.1 * M * star U.1) = U.1 * covIterJ A r t M * star U.1 + | 0, _, _ => rfl + | (n + 1), t, M => by + rw [covIterJ_succ, covIterJ_succ, covIterJ_conj U A n, covDJ_conj] + +lemma evalCS_actPotC_covIter (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) + (r : ℕ) (t : Fin r → Lor) (ν μ : Lor) : + evalCS (actPotC U A) (covIter r t (curvVec ν μ)) = + U.1 * evalCS A (covIter r t (curvVec ν μ)) * star U.1 := by + rw [evalCS_covIter, evalCS_covIter, evalCS_curvVec, evalCS_curvVec, curvJ_actPotC, + covIterJ_conj] + +/-! + +## E. The residual constant-colour action + +-/ + +/-- **Covariance of the ordered covariant tower**, uniformly in the derivative order. -/ +lemma gaugePull_covIter (U : specialUnitaryGroup (Fin 3) JetRing) (r : ℕ) (t : Fin r → Lor) + (ν μ : Lor) (c : Col) : + gaugePull U (covIter r t (curvVec ν μ) c) = + adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r t (curvVec ν μ)) c := by + refine jetAlgebra_funext fun x => ?_ + have hx : potPt (potOf x) = x := potPt_potOf x + have hkey : (mkC fun c' => MvPowerSeries.constantCoeff + (evalS (actPotC U (potOf x)) (covIter r t (curvVec ν μ) c'))) = + adC (JetGaugeGroupI.evalSU (Fin 3) U) + (mkC fun c' => MvPowerSeries.constantCoeff + (evalS (potOf x) (covIter r t (curvVec ν μ) c'))) := by + apply cmat_injective + rw [cmat_adC, ← jetValue_cser, ← jetValue_cser] + show Gluon.jetValue (evalCS (actPotC U (potOf x)) (covIter r t (curvVec ν μ))) = _ + rw [evalCS_actPotC_covIter, Gluon.jetValue_mul, Gluon.jetValue_mul, Gluon.jetValue_star, + jetValue_coe_eq, star_eq_conjTranspose] + rfl + have hL : evalA x (gaugePull U (covIter r t (curvVec ν μ) c)) = + MvPowerSeries.constantCoeff + (evalS (actPotC U (potOf x)) (covIter r t (curvVec ν μ) c)) := by + rw [evalA_gaugePull, constantCoeff_evalS] + rfl + have hR : evalA x (adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r t (curvVec ν μ)) c) = + ∑ c', adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c' * + MvPowerSeries.constantCoeff (evalS (potOf x) (covIter r t (curvVec ν μ) c')) := by + rw [adR, map_sum] + refine Finset.sum_congr rfl fun c' _ => ?_ + rw [map_mul, evalA_algebraMap, constantCoeff_evalS, hx] + have hc := congrArg (coordC c) hkey + rw [coordC_mkC, coordC_adC] at hc + rw [hL, hR, hc] + exact Finset.sum_congr rfl fun c' _ => by rw [coordC_mkC] + +/-- **The arbitrary-order covariance theorem.** Under any jet gauge substitution the symmetrized + covariant curvature tower transforms by the adjoint action of the base-point value of the jet + alone. -/ +lemma gaugePull_covCurv (U : specialUnitaryGroup (Fin 3) JetRing) {r : ℕ} (t : Fin r → Lor) + (ν μ : Lor) (c : Col) : + gaugePull U (covCurv t ν μ c) = + adR (JetGaugeGroupI.evalSU (Fin 3) U) (covCurv t ν μ) c := by + have hL : gaugePull U (covCurv t ν μ c) = + (Nat.factorial r : ℝ)⁻¹ • ∑ σ : Equiv.Perm (Fin r), + adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r (t ∘ σ) (curvVec ν μ)) c := by + rw [covCurv, map_smul, map_sum] + exact congrArg _ (Finset.sum_congr rfl fun σ _ => gaugePull_covIter U r (t ∘ σ) ν μ c) + have hR : adR (JetGaugeGroupI.evalSU (Fin 3) U) (covCurv t ν μ) c = + (Nat.factorial r : ℝ)⁻¹ • ∑ σ : Equiv.Perm (Fin r), + adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r (t ∘ σ) (curvVec ν μ)) c := by + rw [adR, Finset.smul_sum, + show (∑ σ : Equiv.Perm (Fin r), (Nat.factorial r : ℝ)⁻¹ • + adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r (t ∘ σ) (curvVec ν μ)) c) = + ∑ σ : Equiv.Perm (Fin r), ∑ c', (Nat.factorial r : ℝ)⁻¹ • + (algebraMap ℝ JetAlgebra (adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c') * + covIter r (t ∘ σ) (curvVec ν μ) c') from + Finset.sum_congr rfl fun σ _ => by rw [adR, Finset.smul_sum], Finset.sum_comm] + refine Finset.sum_congr rfl fun c' _ => ?_ + rw [covCurv, mul_smul_comm, Finset.mul_sum, Finset.smul_sum] + rw [hL, hR] + +/-- Every component of the complete covariant curvature tower. -/ +def covTower : Set JetAlgebra := + {P | ∃ (r : ℕ) (t : Fin r → Lor) (ν μ : Lor) (c : Col), P = covCurv t ν μ c} + +lemma covCurv_mem_covTower {r : ℕ} (t : Fin r → Lor) (ν μ : Lor) (c : Col) : + covCurv t ν μ c ∈ covTower := ⟨r, t, ν, μ, c, rfl⟩ + +/-- **The subalgebra generated by the covariant curvature tower.** -/ +noncomputable def covAlgebra : Subalgebra ℝ JetAlgebra := Algebra.adjoin ℝ covTower + +lemma covCurv_mem_covAlgebra {r : ℕ} (t : Fin r → Lor) (ν μ : Lor) (c : Col) : + covCurv t ν μ c ∈ covAlgebra := Algebra.subset_adjoin (covCurv_mem_covTower t ν μ c) + +lemma gaugePull_covCurv_mem (U : specialUnitaryGroup (Fin 3) JetRing) {r : ℕ} (t : Fin r → Lor) + (ν μ : Lor) (c : Col) : gaugePull U (covCurv t ν μ c) ∈ covAlgebra := by + rw [gaugePull_covCurv, adR] + exact Subalgebra.sum_mem _ fun c' _ => + Subalgebra.mul_mem _ (Subalgebra.algebraMap_mem _ _) (covCurv_mem_covAlgebra t ν μ c') + +/-- **Stability.** The covariant subalgebra is preserved by every jet gauge substitution. -/ +lemma gaugePull_covAlgebra_le (U : specialUnitaryGroup (Fin 3) JetRing) : + covAlgebra.map (gaugePull U) ≤ covAlgebra := by + rw [Subalgebra.map_le] + refine Algebra.adjoin_le ?_ + rintro P ⟨r, t, ν, μ, c, rfl⟩ + exact gaugePull_covCurv_mem U t ν μ c + +/-- **Based jets fix the covariant subalgebra pointwise.** -/ +lemma gaugePull_eq_self_of_based (U : specialUnitaryGroup (Fin 3) JetRing) + (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) {P : JetAlgebra} (hP : P ∈ covAlgebra) : + gaugePull U P = P := by + have h : covAlgebra ≤ AlgHom.equalizer (gaugePull U) (AlgHom.id ℝ JetAlgebra) := by + refine Algebra.adjoin_le ?_ + rintro Q ⟨r, t, ν, μ, c, rfl⟩ + show gaugePull U (covCurv t ν μ c) = AlgHom.id ℝ JetAlgebra (covCurv t ν μ c) + rw [gaugePull_covCurv, hU, adR_one, AlgHom.id_apply] + exact h hP + +/-- **The action on the covariant subalgebra factors through evaluation at the base point.** -/ +lemma gaugePull_eq_of_evalSU_eq (U V : specialUnitaryGroup (Fin 3) JetRing) + (h : JetGaugeGroupI.evalSU (Fin 3) U = JetGaugeGroupI.evalSU (Fin 3) V) + {P : JetAlgebra} (hP : P ∈ covAlgebra) : gaugePull U P = gaugePull V P := by + have hle : covAlgebra ≤ AlgHom.equalizer (gaugePull U) (gaugePull V) := by + refine Algebra.adjoin_le ?_ + rintro Q ⟨r, t, ν, μ, c, rfl⟩ + show gaugePull U (covCurv t ν μ c) = gaugePull V (covCurv t ν μ c) + rw [gaugePull_covCurv, gaugePull_covCurv, h] + exact hle hP + +/-- **On the covariant subalgebra a jet acts as the constant jet of its base-point value.** This + is the easy direction of the eventual completeness theorem. It does *not* say that a tower + element is invariant: a constant colour rotation generally moves it. -/ +lemma gaugePull_eq_ofConstantSU (U : specialUnitaryGroup (Fin 3) JetRing) {P : JetAlgebra} + (hP : P ∈ covAlgebra) : + gaugePull U P = + gaugePull (JetGaugeGroupI.ofConstantSU (Fin 3) (JetGaugeGroupI.evalSU (Fin 3) U)) P := + gaugePull_eq_of_evalSU_eq U _ (SU3Jet.evalSU_ofConstantSU _).symm hP + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean new file mode 100644 index 000000000..0b8c2c778 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean @@ -0,0 +1,396 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons +/-! +# A diagonal based `SU(3)` monomial jet + +## i. Overview + +This file proves that the scalar monomial-exponential gauge jet already constructed for the B boson +can +be embedded diagonally into `specialUnitaryGroup (Fin 3) JetRing` with exact control of its +base-point value and its leading Taylor coefficient. + +The construction is: extract the scalar unitary series `z = exp(-i a X^w)` underlying +`BBoson.JetAlgebra.expUnitary a w hw`, and form + +```text +diagonal (z, star z, 1). +``` + +Unitarity is `z (star z) = 1` entrywise; the determinant is `z (star z) 1 = 1`, so no determinant +theory beyond `Matrix.det_diagonal` is needed. + +## ii. Conventions + +Physlib represents gluon potentials by hermitian matrices, with Maurer–Cartan matrix + +```text +mcMatrix μ A = i (∂_μ A)(0) (A(0))† +``` + +(`Gluon.mcMatrix`), and `BBoson.JetAlgebra.expUnitary a w hw` is the jet of `exp(-i a X^w)`, whose +coefficient at `n • w` is `(-i a)^n / n!`. + +Composing the two: for a degree-one exponent `w = single μ 1` the diagonal jet has + +```text +(∂_μ diag)(0) = (-i a) • diag(1, -1, 0), mcMatrix μ = i (-i a) • diag(1, -1, 0) = a • diag(1, -1, +0). +``` + +So the Maurer–Cartan coefficient is `+a • diag(1, -1, 0)`: the sign is positive in `a`, and the two +factors of `i` cancel. This is recorded in `mcCoeff_diagSU_single`; it is the sign later modules +must +use. + +## iii. Results + +* `diagMat_mem` — the diagonal matrix is special unitary over the jet ring; +* `jetValue_diagMat`, `evalSU_diagSU`, `eval_diagJet` — the jet is based; +* `coeffMat_diagMat_self` — the leading Taylor coefficient is `(-i a) • diag(1, -1, 0)`; +* `coeffMat_diagMat_eq_zero` — all other coefficients below the first multiple of `w` vanish; +* `mcCoeff_diagSU_single`, `mcCoeff_diagSU_single_of_ne` — first-order realizability of an + arbitrary real multiple of `diag(1, -1, 0)` in one chosen Lorentz direction; +* `mcCoeff_diagSU_two`, `coeffMat_diagMat_two` — second-order readiness: for a degree-two exponent + every first-order Maurer–Cartan coefficient vanishes while the coefficient at `w` is controlled. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MvPowerSeries JetRing + +namespace SU3Jet + +/-! + +## A. The scalar exponential series + +`BBoson.JetAlgebra.expUnitary` packages the series in the `U(1)` slot of `JetGaugeGroupI`. The +series itself is reachable through that projection, so no reimplementation of the coefficientwise +exponential is needed. + +-/ + +/-- The scalar unitary power series `exp(-i a X^w)` underlying `BBoson.JetAlgebra.expUnitary`. -/ +noncomputable def expSeries (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : JetRing := + (((BBoson.JetAlgebra.expUnitary a w hw).2.2 : unitary JetRing) : JetRing) + +lemma expSeries_mul_star (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + expSeries a w hw * star (expSeries a w hw) = 1 := + (Unitary.mem_iff.mp (BBoson.JetAlgebra.expUnitary a w hw).2.2.2).2 + +lemma star_mul_expSeries (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + star (expSeries a w hw) * expSeries a w hw = 1 := + (Unitary.mem_iff.mp (BBoson.JetAlgebra.expUnitary a w hw).2.2.2).1 + +/-- The leading Taylor coefficient of the scalar series. -/ +lemma coeff_expSeries_self (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + coeff w (expSeries a w hw) = -(a : ℂ) * Complex.I := by + have h := BBoson.JetAlgebra.coeff_expUnitary_nsmul a hw 1 + rw [one_smul] at h + simpa [expSeries] using h + +/-- The Taylor coefficients of the scalar series vanish away from the multiples of `w`. -/ +lemma coeff_expSeries_of_forall_ne (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) + {k : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : + coeff k (expSeries a w hw) = 0 := + BBoson.JetAlgebra.coeff_expUnitary_of_forall_ne a hw hk + +lemma constantCoeff_expSeries (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + constantCoeff (expSeries a w hw) = 1 := + BBoson.JetAlgebra.constantCoeff_expUnitary a w hw + +/-! + +## B. The diagonal special-unitary jet + +-/ + +/-- The diagonal of the ``DiagonalJet`` jet: `(z, star z, 1)`. -/ +noncomputable def diagVec (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : Fin 3 → JetRing := + ![expSeries a w hw, star (expSeries a w hw), 1] + +/-- The diagonal `SU(3)` monomial jet `diag(exp(-i a X^w), exp(i a X^w), 1)`, as a matrix. -/ +noncomputable def diagMat (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + Matrix (Fin 3) (Fin 3) JetRing := + diagonal (diagVec a w hw) + +lemma diagMat_mul_star (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + diagMat a w hw * star (diagMat a w hw) = 1 := by + have h : (fun i => diagVec a w hw i * (star (diagVec a w hw)) i) = + fun _ : Fin 3 => (1 : JetRing) := by + funext i + fin_cases i <;> + simp [diagVec, expSeries_mul_star, star_mul_expSeries] + rw [diagMat, star_eq_conjTranspose, diagonal_conjTranspose, diagonal_mul_diagonal, h, + diagonal_one] + +lemma det_diagMat (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + (diagMat a w hw).det = 1 := by + rw [diagMat, det_diagonal, Fin.prod_univ_three] + simp [diagVec, expSeries_mul_star] + +/-- **Special-unitary membership.** The diagonal monomial jet lies in + `specialUnitaryGroup (Fin 3) JetRing`: unitarity is entrywise `z (star z) = 1`, and the + determinant is the product of the three diagonal entries. -/ +lemma diagMat_mem (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + diagMat a w hw ∈ specialUnitaryGroup (Fin 3) JetRing := + mem_specialUnitaryGroup_iff.mpr + ⟨mem_unitaryGroup_iff.mpr (diagMat_mul_star a w hw), det_diagMat a w hw⟩ + +/-- The diagonal `SU(3)` monomial jet, as an element of the colour jet group. -/ +noncomputable def diagSU (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + specialUnitaryGroup (Fin 3) JetRing := + ⟨diagMat a w hw, diagMat_mem a w hw⟩ + +/-- The diagonal monomial jet as an element of the full jet gauge group, with trivial `SU(2)` and + `U(1)` components. The gluon action depends only on the `SU(3)` component. -/ +noncomputable def diagJet (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : JetGaugeGroupI := + (diagSU a w hw, 1, 1) + +/-! + +## C. Basedness + +-/ + +/-- **Basedness.** The value of the diagonal monomial jet at the base point is the identity. -/ +lemma jetValue_diagMat (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + Gluon.jetValue (diagMat a w hw) = 1 := by + have h : (fun i => constantCoeff (diagVec a w hw i)) = fun _ : Fin 3 => (1 : ℂ) := by + funext i + fin_cases i <;> + simp [diagVec, constantCoeff_expSeries] + rw [Gluon.jetValue, diagMat, diagonal_map (map_zero _), h, diagonal_one] + +lemma evalSU_diagSU (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + JetGaugeGroupI.evalSU (Fin 3) (diagSU a w hw) = 1 := by + apply Subtype.ext + rw [Gluon.evalSU_coe] + simpa [diagSU] using jetValue_diagMat a w hw + +/-- The diagonal monomial jet lies in the kernel of evaluation: it is a based gauge jet. -/ +lemma eval_diagJet (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + JetGaugeGroupI.eval (diagJet a w hw) = 1 := by + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · exact evalSU_diagSU a w hw + · exact map_one _ + · exact map_one _ + +/-! + +## D. Taylor coefficients + +-/ + +/-- The matrix of Taylor coefficients at a multi-index. At `k = single μ 1` this is + `Gluon.jetDeriv μ`. -/ +noncomputable def coeffMat (k : (Fin 1 ⊕ Fin 3) →₀ ℕ) (A : Matrix (Fin 3) (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) ℂ := + A.map (coeff k) + +lemma jetDeriv_eq_coeffMat (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : + Gluon.jetDeriv μ A = coeffMat (Finsupp.single μ 1) A := rfl + +lemma coeffMat_diagMat (k : (Fin 1 ⊕ Fin 3) →₀ ℕ) (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) + (hw : w ≠ 0) : + coeffMat k (diagMat a w hw) = + diagonal ![coeff k (expSeries a w hw), star (coeff k (expSeries a w hw)), + if k = 0 then 1 else 0] := by + have h : (fun i => coeff k (diagVec a w hw i)) = + ![coeff k (expSeries a w hw), star (coeff k (expSeries a w hw)), + if k = 0 then 1 else 0] := by + funext i + fin_cases i <;> simp [diagVec, coeff_one] + rw [coeffMat, diagMat, diagonal_map (map_zero _), h] + +/-- The traceless hermitian colour direction `diag(1, -1, 0)`. -/ +def colourMat : Matrix (Fin 3) (Fin 3) ℂ := diagonal ![1, -1, 0] + +lemma colourMat_mem : colourMat ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := by + rw [selfAdjoint.mem_iff] + ext i j + fin_cases i <;> fin_cases j <;> + simp [colourMat, Matrix.star_apply] + +/-- The colour direction `diag(1, -1, 0)` as a hermitian matrix. -/ +noncomputable def colourH : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := + ⟨colourMat, colourMat_mem⟩ + +@[simp] +lemma colourH_coe : (colourH : Matrix (Fin 3) (Fin 3) ℂ) = colourMat := rfl + +lemma trace_colourMat : trace colourMat = 0 := by + simp [colourMat, Matrix.trace_diagonal, Fin.sum_univ_three] + +/-- **Leading coefficient.** The Taylor coefficient of the diagonal monomial jet at its own + exponent is `(-i a) • diag(1, -1, 0)`. -/ +lemma coeffMat_diagMat_self (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + coeffMat w (diagMat a w hw) = (-(a : ℂ) * Complex.I) • colourMat := by + have hstar : star (-(a : ℂ) * Complex.I) = (a : ℂ) * Complex.I := by + rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] + ring + rw [coeffMat_diagMat, coeff_expSeries_self, hstar, if_neg hw, colourMat] + ext i j + fin_cases i <;> fin_cases j <;> + simp [Matrix.smul_apply] + +/-- **Vanishing of the lower coefficients.** Away from the nonzero multiples of the exponent the + diagonal monomial jet has no Taylor coefficients: in particular every coefficient of positive + order strictly below `w` vanishes. -/ +lemma coeffMat_diagMat_eq_zero (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) + {k : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hk0 : k ≠ 0) (hk : ∀ n : ℕ, k ≠ n • w) : + coeffMat k (diagMat a w hw) = 0 := by + rw [coeffMat_diagMat, coeff_expSeries_of_forall_ne a w hw hk, star_zero, if_neg hk0] + ext i j + fin_cases i <;> fin_cases j <;> simp + +/-! + +## E. The Maurer–Cartan coefficient + +-/ + +lemma mcMatrix_diagMat (μ : Fin 1 ⊕ Fin 3) (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : + Gluon.mcMatrix μ (diagMat a w hw) = + Complex.I • coeffMat (Finsupp.single μ 1) (diagMat a w hw) := by + rw [Gluon.mcMatrix, jetValue_diagMat, star_one, Matrix.mul_one, jetDeriv_eq_coeffMat] + +/-- Real scalars act on the colour carrier through the complex scalars. -/ +lemma real_smul_colourMat (r : ℝ) : (r : ℂ) • colourMat = r • colourMat := by + rw [show ((r : ℂ)) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] + +/-- **First-order specialization.** For the degree-one exponent `single μ 1` the Maurer–Cartan + coefficient in the direction `μ` is exactly `a • diag(1, -1, 0)`. The sign is positive: the + factor `-i` in `exp(-i a X^w)` cancels the factor `i` in `Gluon.mcMatrix`. Since `a` ranges over + all reals, every real multiple of the colour direction is realized. -/ +lemma mcCoeff_diagSU_single (a : ℝ) (μ : Fin 1 ⊕ Fin 3) + (hw : (Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0) : + Gluon.mcCoeff (diagSU a (Finsupp.single μ 1) hw) μ = a • colourH := by + apply Subtype.ext + show Gluon.mcMatrix μ (diagMat a (Finsupp.single μ 1) hw) = _ + rw [mcMatrix_diagMat, coeffMat_diagMat_self, smul_smul, + show Complex.I * (-(a : ℂ) * Complex.I) = (a : ℂ) by + rw [show Complex.I * (-(a : ℂ) * Complex.I) = -(Complex.I * Complex.I) * (a : ℂ) by ring, + Complex.I_mul_I] + ring, + real_smul_colourMat] + rfl + +lemma single_ne_zero' (μ : Fin 1 ⊕ Fin 3) : + (Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0 := by + simp [Finsupp.single_eq_zero] + +/-- In the other Lorentz directions the Maurer–Cartan coefficient of the degree-one jet vanishes: + the translation is concentrated in the single direction `μ`. -/ +lemma mcCoeff_diagSU_single_of_ne (a : ℝ) (μ ν : Fin 1 ⊕ Fin 3) (hμν : ν ≠ μ) + (hw : (Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0) : + Gluon.mcCoeff (diagSU a (Finsupp.single μ 1) hw) ν = 0 := by + apply Subtype.ext + show Gluon.mcMatrix ν (diagMat a (Finsupp.single μ 1) hw) = _ + have hμν' : μ ≠ ν := fun h => hμν h.symm + have hk : ∀ n : ℕ, (Finsupp.single ν 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ n • Finsupp.single μ 1 := by + intro n h + have h' := DFunLike.congr_fun h ν + rw [Finsupp.single_eq_same, Finsupp.smul_apply, Finsupp.single_eq_of_ne hμν, + smul_eq_mul, Nat.mul_zero] at h' + exact absurd h' one_ne_zero + rw [mcMatrix_diagMat, coeffMat_diagMat_eq_zero a _ hw (single_ne_zero' ν) hk, smul_zero] + rfl + +/-! + +## F. Second-order readiness + +For a degree-two exponent the jet is based *to first order as well*: every first-order +Maurer–Cartan coefficient vanishes, while the Taylor coefficient at the exponent itself is still +`(-i a) • diag(1, -1, 0)`. This is the input a second-order gauge variation needs; the induced +action on a first-order jet algebra is not built here. + +-/ + +/-- A degree-two spacetime exponent is nonzero. -/ +lemma add_single_ne_zero (μ ν : Fin 1 ⊕ Fin 3) : + (Finsupp.single μ 1 + Finsupp.single ν 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0 := by + intro h + have h' := DFunLike.congr_fun h μ + rw [Finsupp.add_apply, Finsupp.single_eq_same] at h' + simp at h' + +/-- No degree-one multi-index is a multiple of a degree-two one. -/ +lemma single_ne_nsmul_add (ρ μ ν : Fin 1 ⊕ Fin 3) (n : ℕ) : + (Finsupp.single ρ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ + n • (Finsupp.single μ 1 + Finsupp.single ν 1) := by + intro h + rcases Nat.eq_zero_or_pos n with rfl | hn + · rw [zero_smul] at h + exact single_ne_zero' ρ h + have key : ∀ σ : Fin 1 ⊕ Fin 3, + (Finsupp.single ρ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ = + (Finsupp.single μ n : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ + + (Finsupp.single ν n : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ := by + intro σ + have hσ := DFunLike.congr_fun h σ + simpa [Finsupp.smul_apply, Finsupp.add_apply] using hσ + have hb : ∀ σ : Fin 1 ⊕ Fin 3, (Finsupp.single ρ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ ≤ 1 := by + intro σ + rw [Finsupp.single_apply] + split <;> simp + have e1 : (Finsupp.single μ n : (Fin 1 ⊕ Fin 3) →₀ ℕ) μ = n := Finsupp.single_eq_same + have e2 : (Finsupp.single ν n : (Fin 1 ⊕ Fin 3) →₀ ℕ) ν = n := Finsupp.single_eq_same + rcases eq_or_ne μ ν with rfl | hne + · have h1 := key μ + have h3 := hb μ + rw [e1] at h1 + omega + · have hne' : ν ≠ μ := fun hc => hne hc.symm + have h1 := key μ + have h2 := key ν + rw [e1, Finsupp.single_eq_of_ne hne] at h1 + rw [e2, Finsupp.single_eq_of_ne hne'] at h2 + have hρμ : ρ = μ := by + by_contra hc + rw [Finsupp.single_eq_of_ne (Ne.symm hc)] at h1 + omega + have hρν : ρ = ν := by + by_contra hc + rw [Finsupp.single_eq_of_ne (Ne.symm hc)] at h2 + omega + exact hne (by rw [← hρμ, hρν]) + +/-- **Second-order readiness, part one.** For a degree-two exponent every first-order + Maurer–Cartan coefficient of the diagonal monomial jet vanishes: the jet is based through first + order, so it acts trivially on the undifferentiated connection. -/ +lemma mcCoeff_diagSU_two (a : ℝ) (μ ν ρ : Fin 1 ⊕ Fin 3) : + Gluon.mcCoeff (diagSU a (Finsupp.single μ 1 + Finsupp.single ν 1) + (add_single_ne_zero μ ν)) ρ = 0 := by + apply Subtype.ext + show Gluon.mcMatrix ρ (diagMat a _ (add_single_ne_zero μ ν)) = _ + rw [mcMatrix_diagMat, + coeffMat_diagMat_eq_zero a _ (add_single_ne_zero μ ν) (single_ne_zero' ρ) + (single_ne_nsmul_add ρ μ ν), + smul_zero] + rfl + +/-- **Second-order readiness, part two.** The selected second-order Taylor coefficient of the + degree-two jet is exactly `(-i a) • diag(1, -1, 0)`, stated directly as a power-series + coefficient. -/ +lemma coeffMat_diagMat_two (a : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : + coeffMat (Finsupp.single μ 1 + Finsupp.single ν 1) + (diagMat a (Finsupp.single μ 1 + Finsupp.single ν 1) (add_single_ne_zero μ ν)) = + (-(a : ℂ) * Complex.I) • colourMat := + coeffMat_diagMat_self a _ (add_single_ne_zero μ ν) + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean new file mode 100644 index 000000000..d3cbcfdf3 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean @@ -0,0 +1,317 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.GaugeAction +/-! +# Finite-order completeness + +## i. Overview + +This file proves the two theorems the later modules consume: + +```text +A₁ fixed by based gauge jets = the algebra generated by the field strength +A₁ fixed by the full jet gauge group = the constant-SU(3)-invariant part of that. +``` + +The second does **not** say that every element of the curvature algebra is invariant: a curvature +component is conjugated by a constant colour rotation, and only the globally invariant combinations +survive; an uncontracted curvature component is generally moved by a constant colour rotation. + +## ii. The elimination + +The elimination is **top-down**, as the proof strategy requires. + +1. Order-two based jets (`exists_based_two`) translate a single symmetric derivative coordinate and + fix everything else. `MvPolynomial.notMem_vars_of_forall_aeval_add_eq` therefore removes every + symmetric coordinate from an invariant. +2. On what is left — the subalgebra supported on the connection and curvature coordinates — + order-one based jets (`SU3Jet.exists_based_mcCoeff`, from `ColourBasis`) translate a single + connection + coordinate and fix the curvature coordinates. They do *not* fix the symmetric coordinates, which + is exactly why the elimination must run in this order; the two substitutions agree only on the + subalgebra reached after step 1, and that is enough. +3. What remains is supported on the curvature coordinates, and `MvPolynomial.supported_eq_adjoin_X` + turns that into membership in the curvature subalgebra. + +The polynomial input is `MvPolynomial.notMem_vars_of_forall_aeval_add_eq` together with +`MvPolynomial.supported_eq_adjoin_X`, needed here. The headline theorem +`mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq` of `MvPolynomialTranslation` is **not** used: its +fiberwise common-shift hypothesis matches the abelian field strength, and the nonabelian one is not +a difference of coordinates. + +## iii. Results + +* `covAct` — the gauge action read in the covariant coordinates of `CoordinateChange`; +* `covAct_curv_of_based`, `covAct_conn_of_based`, `covAct_sym_of_based_two` — the three generator + transformation laws the elimination uses; +* `fixed_by_based_eq_adjoin_curv` — the first completeness theorem; +* `fixed_by_jetGroup_eq_invariant_curv` — the full-group theorem. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. The gauge action in covariant coordinates + +-/ + +/-- The local gauge action read through the `CoordinateChange` coordinate change. -/ +noncomputable def covAct (U : specialUnitaryGroup (Fin 3) JetRing) : A₁cov →ₐ[ℝ] A₁cov := + oldToNew.comp ((gaugeAct U).comp newToOld) + +lemma covAct_apply (U : specialUnitaryGroup (Fin 3) JetRing) (Q : A₁cov) : + covAct U Q = oldToNew (gaugeAct U (newToOld Q)) := rfl + +lemma covAct_oldToNew (U : specialUnitaryGroup (Fin 3) JetRing) (P : A₁) : + covAct U (oldToNew P) = oldToNew (gaugeAct U P) := by + rw [covAct_apply, newToOld_oldToNew_apply] + +/-! + +### A.1. The three generator transformation laws + +-/ + +/-- **Curvature is covariant.** In the covariant coordinates the curvature block transforms by the + matrix of the adjoint action of the base-point value of the jet. -/ +lemma covAct_curv (U : specialUnitaryGroup (Fin 3) JetRing) (q : CurvPair) (c : Col) : + covAct U (X (CovCoord.curv q c)) = + ∑ c', C (adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c') * X (CovCoord.curv q c') := by + rw [covAct_apply, newToOld_curv, gaugeAct_curvPoly, map_sum] + refine Finset.sum_congr rfl fun c' _ => ?_ + rw [map_mul, algHom_C, ← newToOld_curv q c', oldToNew_newToOld_apply] + +/-- **Based jets fix the curvature coordinates.** -/ +lemma covAct_curv_of_based {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (q : CurvPair) (c : Col) : + covAct U (X (CovCoord.curv q c)) = X (CovCoord.curv q c) := by + rw [covAct_curv, hU] + exact adP_one (fun c' => X (CovCoord.curv q c')) c + +/-- **Order-one based jets translate the connection coordinates.** -/ +lemma covAct_conn_of_based {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (μ : Lor) (c : Col) : + covAct U (X (CovCoord.conn μ c)) = X (CovCoord.conn μ c) + C (coordC c (mcC U μ)) := by + rw [covAct_apply, newToOld_conn, gaugeAct_conn, hU, map_add, algHom_constP] + congr 1 + rw [adP_one] + exact oldToNew_conn μ c + +/-- On a jet based to order one the second Maurer–Cartan coefficient is symmetric: this is + `mc2C_sub` with a vanishing first coefficient. -/ +lemma mc2C_symm_of_based {U : specialUnitaryGroup (Fin 3) JetRing} (hm : ∀ ρ, mcC U ρ = 0) + (ν μ : Lor) : mc2C U ν μ = mc2C U μ ν := by + have h := mc2C_sub U ν μ + rw [hm ν, map_zero, LinearMap.zero_apply, neg_zero, sub_eq_zero] at h + exact h + +/-- **Order-two based jets translate the ordinary derivative coordinates by a constant.** This is + the hypothesis of "Why the triangular strategy works": no field-dependent commutator survives. -/ +lemma gaugeAct_der_of_based_two {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (hm : ∀ ρ, mcC U ρ = 0) (ν μ : Lor) (c : Col) : + gaugeAct U (X (Coord.der ν μ c)) = X (Coord.der ν μ c) + C (coordC c (mc2C U ν μ)) := by + rw [gaugeAct_der, hU, adP_one, hm ν, constP_zero, brP_zero_left, sub_zero] + rfl + +/-- **Order-two based jets translate the symmetric derivative coordinates by a constant.** -/ +lemma covAct_sym_of_based_two {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (hm : ∀ ρ, mcC U ρ = 0) (ν μ : Lor) (c : Col) : + covAct U (X (CovCoord.sym s(ν, μ) c)) = + X (CovCoord.sym s(ν, μ) c) + C (coordC c (mc2C U ν μ)) := by + have ht : mc2C U μ ν = mc2C U ν μ := (mc2C_symm_of_based hm ν μ).symm + have key : gaugeAct U (symOld c s(ν, μ)) = + symOld c s(ν, μ) + C (coordC c (mc2C U ν μ)) := by + rw [symOld_mk, map_smul, map_add, gaugeAct_der_of_based_two hU hm, + gaugeAct_der_of_based_two hU hm, ht] + module + rw [covAct_apply, newToOld_sym, key, map_add, algHom_C, + show oldToNew (symOld c s(ν, μ)) = X (CovCoord.sym s(ν, μ) c) from by + rw [← newToOld_sym s(ν, μ) c, oldToNew_newToOld_apply]] + +/-! + +## B. Realizing the two translations in coordinates + +-/ + +lemma coordC_smul_basis (r : ℝ) (c₀ c : Col) : + coordC c (r • colourBasis c₀) = if c = c₀ then r else 0 := by + rw [map_smul, smul_eq_mul, coordC_apply, Basis.repr_self_apply] + by_cases h : c = c₀ + · rw [if_pos h, if_pos h.symm, mul_one] + · rw [if_neg h, if_neg fun hc => h hc.symm, mul_zero] + +/-- **Order-one realizability, in colour coordinates.** From `SU3Jet.exists_based_mcCoeff`. -/ +lemma exists_based_one (μ₀ : Lor) (c₀ : Col) (r : ℝ) : + ∃ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 ∧ + ∀ ν, mcC U ν = if ν = μ₀ then r • colourBasis c₀ else 0 := by + obtain ⟨U, hU, hmc⟩ := SU3Jet.exists_based_mcCoeff μ₀ (r • colourBasis c₀) + refine ⟨U, hU, fun ν => ?_⟩ + by_cases h : ν = μ₀ + · rw [if_pos h] + exact Subtype.ext (by rw [show (mcC U ν).1 = Gluon.mcCoeff U ν from rfl, hmc ν, if_pos h]) + · rw [if_neg h] + exact Subtype.ext (by rw [show (mcC U ν).1 = Gluon.mcCoeff U ν from rfl, hmc ν, if_neg h]; rfl) + +/-! + +## C. The elimination + +-/ + +private lemma ite_sym (s s' : Sym2 Lor) (c c' : Col) (r : ℝ) : + (if s = s' then (if c = c' then r else 0) else 0) = + if (CovCoord.sym s c : CovCoord) = CovCoord.sym s' c' then r else 0 := by + by_cases h1 : s = s' <;> by_cases h2 : c = c' <;> simp_all + +private lemma ite_conn (μ μ' : Lor) (c c' : Col) (r : ℝ) : + (if μ = μ' then (if c = c' then r else 0) else 0) = + if (CovCoord.conn μ c : CovCoord) = CovCoord.conn μ' c' then r else 0 := by + by_cases h1 : μ = μ' <;> by_cases h2 : c = c' <;> simp_all + +/-- **The first completeness theorem.** The elements of the first-order gluon jet algebra fixed by + every *based* gauge jet are exactly the polynomials in the field strength. + + The forward direction is the top-down elimination: order-two based jets remove the symmetric + derivative coordinates, then order-one based jets remove the connection coordinates. The reverse + direction is `gaugeAct_curvPoly` at `u = 1`. -/ +lemma fixed_by_based_eq_adjoin_curv : + {P : A₁ | ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugeAct U P = P} = + (Algebra.adjoin ℝ (Set.range fun q : Lor × Lor × Col => curvPoly q.1 q.2.1 q.2.2) : + Set A₁) := by + classical + ext P + simp only [Set.mem_setOf_eq, SetLike.mem_coe] + constructor + · intro hP + have hQfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → covAct U (oldToNew P) = oldToNew P := by + intro U hU + rw [covAct_oldToNew, hP U hU] + -- Step 1: no symmetric derivative coordinates. + have hstep1 : ∀ (s : Sym2 Lor) (c : Col), CovCoord.sym s c ∉ (oldToNew P).vars := by + intro s c₀ + refine MvPolynomial.notMem_vars_of_forall_aeval_add_eq _ (CovCoord.sym s c₀) fun r => ?_ + obtain ⟨U, hU, hm, hmc2⟩ := exists_based_two s c₀ r + have hagree : covAct U = + aeval (fun i => X i + C (if i = CovCoord.sym s c₀ then r else 0)) := by + refine algHom_ext fun i => ?_ + rw [aeval_X] + cases i with + | conn μ c => rw [covAct_conn_of_based hU, hm μ]; simp + | sym s' c => + induction s' using Sym2.ind with + | _ ν μ => + rw [covAct_sym_of_based_two hU hm, hmc2 ν μ] + by_cases h1 : s(ν, μ) = s + · rw [if_pos h1, coordC_smul_basis, ← ite_sym, if_pos h1] + · rw [if_neg h1, map_zero, ← ite_sym, if_neg h1] + | curv q c => rw [covAct_curv_of_based hU]; simp + rw [← hagree] + exact hQfix U hU + -- Step 2: no connection coordinates. + have hsupp1 : oldToNew P ∈ + MvPolynomial.supported ℝ {i : CovCoord | ∀ s c, i ≠ CovCoord.sym s c} := by + rw [mem_supported] + intro i hi s c + rintro rfl + exact hstep1 s c (Finset.mem_coe.mp hi) + rw [supported_eq_adjoin_X] at hsupp1 + have hstep2 : ∀ (μ : Lor) (c : Col), CovCoord.conn μ c ∉ (oldToNew P).vars := by + intro μ₀ c₀ + refine MvPolynomial.notMem_vars_of_forall_aeval_add_eq _ (CovCoord.conn μ₀ c₀) fun r => ?_ + obtain ⟨U, hU, hmc⟩ := exists_based_one μ₀ c₀ r + have hmem : oldToNew P ∈ AlgHom.equalizer (covAct U) + (aeval (fun i => X i + C (if i = CovCoord.conn μ₀ c₀ then r else 0))) := by + refine Algebra.adjoin_le ?_ hsupp1 + rintro _ ⟨i, hi, rfl⟩ + show covAct U (X i) = _ + rw [aeval_X] + cases i with + | conn μ c => + rw [covAct_conn_of_based hU, hmc μ] + by_cases h1 : μ = μ₀ + · rw [if_pos h1, coordC_smul_basis, ← ite_conn, if_pos h1] + · rw [if_neg h1, map_zero, ← ite_conn, if_neg h1] + | sym s c => exact absurd rfl (hi s c) + | curv q c => rw [covAct_curv_of_based hU]; simp + have heq : covAct U (oldToNew P) = + aeval (fun i => X i + C (if i = CovCoord.conn μ₀ c₀ then r else 0)) (oldToNew P) := hmem + rw [← heq] + exact hQfix U hU + -- Step 3: what is left is supported on the curvature coordinates. + have hsupp2 : oldToNew P ∈ + MvPolynomial.supported ℝ {i : CovCoord | ∃ q c, i = CovCoord.curv q c} := by + rw [mem_supported] + intro i hi + cases i with + | conn μ c => exact absurd (Finset.mem_coe.mp hi) (hstep2 μ c) + | sym s c => exact absurd (Finset.mem_coe.mp hi) (hstep1 s c) + | curv q c => exact ⟨q, c, rfl⟩ + rw [supported_eq_adjoin_X] at hsupp2 + have hmem2 : newToOld (oldToNew P) ∈ + (Algebra.adjoin ℝ (X '' {i : CovCoord | ∃ q c, i = CovCoord.curv q c})).map newToOld := + Subalgebra.mem_map.mpr ⟨oldToNew P, hsupp2, rfl⟩ + rw [AlgHom.map_adjoin, newToOld_oldToNew_apply] at hmem2 + refine Algebra.adjoin_mono ?_ hmem2 + rintro _ ⟨_, ⟨i, ⟨q, c, rfl⟩, rfl⟩, rfl⟩ + exact ⟨(q.1.1, q.1.2, c), (newToOld_curv q c).symm⟩ + · intro hP U hU + have hmem : P ∈ AlgHom.equalizer (gaugeAct U) (AlgHom.id ℝ A₁) := by + refine Algebra.adjoin_le ?_ hP + rintro _ ⟨⟨ν, μ, c⟩, rfl⟩ + show gaugeAct U (curvPoly ν μ c) = _ + rw [gaugeAct_curvPoly, hU] + exact adP_one (curvPoly ν μ) c + exact hmem + +/-- **The full-group theorem.** The elements of the first-order gluon jet algebra fixed by the + *whole* jet gauge group are the constant-`SU(3)`-invariant elements of the curvature algebra. + + Membership in the curvature algebra alone is not enough: an uncontracted field strength is only + covariant. The reverse inclusion works because on the curvature subalgebra an arbitrary gauge jet + acts exactly as the constant jet of its base-point value. -/ +lemma fixed_by_jetGroup_eq_invariant_curv : + {P : A₁ | ∀ U : specialUnitaryGroup (Fin 3) JetRing, gaugeAct U P = P} = + {P : A₁ | + P ∈ Algebra.adjoin ℝ (Set.range fun q : Lor × Lor × Col => curvPoly q.1 q.2.1 q.2.2) ∧ + ∀ g : specialUnitaryGroup (Fin 3) ℂ, + gaugeAct (JetGaugeGroupI.ofConstantSU (Fin 3) g) P = P} := by + ext P + simp only [Set.mem_setOf_eq] + constructor + · intro hP + refine ⟨?_, fun g => hP _⟩ + have hbased : P ∈ {P : A₁ | ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugeAct U P = P} := fun U _ => hP U + rw [fixed_by_based_eq_adjoin_curv] at hbased + exact hbased + · rintro ⟨hadj, hconst⟩ U + have hmem : P ∈ AlgHom.equalizer (gaugeAct U) + (gaugeAct (JetGaugeGroupI.ofConstantSU (Fin 3) (JetGaugeGroupI.evalSU (Fin 3) U))) := by + refine Algebra.adjoin_le ?_ hadj + rintro _ ⟨⟨ν, μ, c⟩, rfl⟩ + show gaugeAct U (curvPoly ν μ c) = _ + rw [gaugeAct_curvPoly, gaugeAct_curvPoly, SU3Jet.evalSU_ofConstantSU] + have heq : gaugeAct U P = + gaugeAct (JetGaugeGroupI.ofConstantSU (Fin 3) (JetGaugeGroupI.evalSU (Fin 3) U)) P := hmem + rw [heq, hconst] + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean new file mode 100644 index 000000000..093359e08 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean @@ -0,0 +1,962 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.Triangular +/-! +# Finite-height completeness + +## i. Overview + +This file proves the uniform finite-height completeness theorem: for every derivative height `N`, an +ordinary jet polynomial of height at most `N` that is fixed by every *based* `SU(3)` gauge jet lies +in the truncated algebra generated by those symmetrized covariant curvature derivatives whose +leading connection derivative fits inside that height, and conversely. + +## ii. Why the elimination needs a coordinate change + +A based jet translates *every* ordinary generator of one fibre `(s + ∂_μ, c)` by the *same* +constant (`HighestLayer` `gaugeSubstGen_eq_add_layerShift`), so no single ordinary variable can be +removed. +The fibrewise translation theorem `MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq` +is *not* usable here: its hypothesis quantifies over every fibre of the representative map, +including the singleton fibres of the strictly lower generators, and those are provably *fixed*, +not translated. Moving the lower generators into the coefficient ring does not help either, since +the theorem then asks for translations by arbitrary coefficient polynomials whereas a gauge jet +translates by a constant. `FiniteHeight` therefore uses `FiniteCompleteness`'s route — +`notMem_vars_of_forall_aeval_add_eq` +together with `supported_eq_adjoin_X` — one representative variable at a time, inside the +covariant coordinate system built below. + +## iii. The covariant coordinate system + +`linSubst` is the fibrewise **linear** change of variables that puts the weighted symmetric +average `symConn w c` in the distinguished slot of each fibre and the hook difference in every +other supported slot. It is invertible, with the explicit inverse `invLinSubst` read off +`Triangular`'s +weighted-average identity, so the resulting family is genuinely algebraically independent: no +independence hypothesis is assumed anywhere. Composing with `Triangular`'s nonlinear +`triangularSubst` +gives `covSubst`, whose generator images are exactly + +```text +covSubst (∂_s A_μ) = symConn (s + ∂_μ) c if μ is the distinguished direction + = covHook (s + ∂_μ, μ) c otherwise. +``` + +In these coordinates a jet based through order `r` + +* fixes every hook coordinate, at *every* derivative degree (`CovariantTower`, since `covHook ∈ + covAlgebra`); +* fixes `symConn w c` for `lorDeg w ≤ r`; +* translates `symConn w c` for `lorDeg w = r + 1` by an arbitrary independently realizable + constant (`HighestLayer`). + +The elimination is then one descending sweep removing the symmetric coordinates layer by layer. +No coefficient is ever extracted, and no global commutation law between `triangularSubst` and +`gaugePull` is asserted. + +## iv. Results + +* `heightAlgebra`, `covAlgebraAt` — the finite-height carrier and the truncated covariant algebra; +* `linSubst`, `invLinSubst`, `linSubst_injective` — the invertible fibrewise linear change; +* `covSubst`, `covCoordGen`, `covCoordHom_injective` — the covariant coordinate system; +* `heightAlgebra_le_covCoordAlgebra` — every ordinary generator is a polynomial in the covariant + coordinates of its own derivative degree; +* `gaugePull_covCoordGen_of_isSymSlot`, `gaugePull_covCoordGen_of_not_isSymSlot` — the based + action in covariant coordinates; +* `fixed_by_based_height_eq_covAlgebraAt` — the headline finite-height completeness theorem. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. The finite derivative height carrier + +-/ + +/-- The ordinary generators whose derivative degree is at most `N`. -/ +def heightGen (N : ℕ) : Set JetAlgebra := + {P | ∃ g : JetGenerators, genDeg g ≤ N ∧ P = ofGen g} + +/-- **The finite-height ordinary jet algebra**: the subalgebra generated by the connection and its +ordinary derivatives up to derivative degree `N`. -/ +noncomputable def heightAlgebra (N : ℕ) : Subalgebra ℝ JetAlgebra := + Algebra.adjoin ℝ (heightGen N) + +lemma ofGen_mem_heightAlgebra {N : ℕ} {g : JetGenerators} (hg : genDeg g ≤ N) : + ofGen g ∈ heightAlgebra N := Algebra.subset_adjoin ⟨g, hg, rfl⟩ + +lemma heightAlgebra_mono {M N : ℕ} (h : M ≤ N) : heightAlgebra M ≤ heightAlgebra N := + Algebra.adjoin_mono fun _ hP => by + obtain ⟨g, hg, hPg⟩ := hP + exact ⟨g, hg.trans h, hPg⟩ + +private lemma jetDeriv_mem_heightAlgebra_aux (nu : Lor) {N : ℕ} {P : JetAlgebra} + (hP : P ∈ Algebra.adjoin ℝ (heightGen N)) : jetDeriv nu P ∈ heightAlgebra (N + 1) := by + induction hP using Algebra.adjoin_induction with + | mem P hP => + obtain ⟨g, hg, rfl⟩ := hP + rw [jetDeriv_ofGen] + exact ofGen_mem_heightAlgebra (by rw [genDeg_shift]; omega) + | algebraMap r => + rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] + exact zero_mem _ + | add x y _ _ hx hy => rw [map_add]; exact add_mem hx hy + | mul x y hxm hym hx hy => + rw [jetDeriv_mul] + exact add_mem (mul_mem hx (heightAlgebra_mono (Nat.le_succ N) hym)) + (mul_mem (heightAlgebra_mono (Nat.le_succ N) hxm) hy) + +/-- The total derivative raises the derivative height by exactly one. -/ +lemma jetDeriv_mem_heightAlgebra (nu : Lor) {N : ℕ} {P : JetAlgebra} + (hP : P ∈ heightAlgebra N) : jetDeriv nu P ∈ heightAlgebra (N + 1) := + jetDeriv_mem_heightAlgebra_aux nu hP + +lemma brR_mem_heightAlgebra {N : ℕ} {p q : Col → JetAlgebra} + (hp : ∀ c, p c ∈ heightAlgebra N) (hq : ∀ c, q c ∈ heightAlgebra N) (c : Col) : + brR p q c ∈ heightAlgebra N := by + rw [brR] + exact sum_mem fun a _ => sum_mem fun b _ => + mul_mem (Subalgebra.algebraMap_mem _ _) (mul_mem (hp a) (hq b)) + +lemma connVec_mem_heightAlgebra (N : ℕ) (mu : Lor) (c : Col) : + connVec mu c ∈ heightAlgebra N := + ofGen_mem_heightAlgebra (by + show lorDeg (0 : DIdx) ≤ N + rw [(lorDeg_eq_zero_iff 0).2 rfl] + omega) + +lemma curvVec_mem_heightAlgebra (nu mu : Lor) (c : Col) : + curvVec nu mu c ∈ heightAlgebra 1 := by + rw [curvVec] + refine add_mem (sub_mem (jetDeriv_mem_heightAlgebra nu (connVec_mem_heightAlgebra 0 mu c)) + (jetDeriv_mem_heightAlgebra mu (connVec_mem_heightAlgebra 0 nu c))) ?_ + exact brR_mem_heightAlgebra (connVec_mem_heightAlgebra 1 nu) (connVec_mem_heightAlgebra 1 mu) c + +lemma covD_mem_heightAlgebra (rho : Lor) {N : ℕ} {X : Col → JetAlgebra} + (hX : ∀ c, X c ∈ heightAlgebra N) (c : Col) : covD rho X c ∈ heightAlgebra (N + 1) := by + rw [covD] + exact add_mem (jetDeriv_mem_heightAlgebra rho (hX c)) + (brR_mem_heightAlgebra (connVec_mem_heightAlgebra (N + 1) rho) + (fun c' => heightAlgebra_mono (Nat.le_succ N) (hX c')) c) + +lemma covIter_mem_heightAlgebra (r : ℕ) (t : Fin r → Lor) (nu mu : Lor) (c : Col) : + covIter r t (curvVec nu mu) c ∈ heightAlgebra (r + 1) := by + induction r generalizing c with + | zero => exact curvVec_mem_heightAlgebra nu mu c + | succ n ih => + rw [covIter_succ] + exact covD_mem_heightAlgebra (t 0) (fun c' => ih (fun i => t i.succ) c') c + +/-- The symmetrized covariant curvature derivative `D^r F` has derivative height `r + 1`. -/ +lemma covCurv_mem_heightAlgebra {r : ℕ} (t : Fin r → Lor) (nu mu : Lor) (c : Col) : + covCurv t nu mu c ∈ heightAlgebra (r + 1) := by + rw [covCurv] + refine Subalgebra.smul_mem _ ?_ _ + exact sum_mem fun sigma _ => covIter_mem_heightAlgebra r (t ∘ sigma) nu mu c + +/-- **Every ordinary jet polynomial has a finite derivative height.** The bound is the largest +derivative degree occurring among its polynomial variables. -/ +lemma mem_heightAlgebra_vars_sup (P : JetAlgebra) : + P ∈ heightAlgebra ((toPoly P).vars.sup genDeg) := by + classical + have hsupp : toPoly P ∈ + MvPolynomial.supported ℝ {g : JetGenerators | genDeg g ≤ (toPoly P).vars.sup genDeg} := by + rw [mem_supported] + intro g hg + show genDeg g ≤ (toPoly P).vars.sup genDeg + exact Finset.le_sup (Finset.mem_coe.mp hg) + rw [supported_eq_adjoin_X] at hsupp + have hmem : toPoly.symm (toPoly P) ∈ + (Algebra.adjoin ℝ + (X '' {g : JetGenerators | genDeg g ≤ (toPoly P).vars.sup genDeg})).map + toPoly.symm.toAlgHom := Subalgebra.mem_map.mpr ⟨_, hsupp, rfl⟩ + rw [AlgHom.map_adjoin, AlgEquiv.symm_apply_apply] at hmem + refine Algebra.adjoin_mono ?_ hmem + rintro _ ⟨_, ⟨g, hg, rfl⟩, rfl⟩ + exact ⟨g, hg, toPoly_symm_X g⟩ + +lemma exists_mem_heightAlgebra (P : JetAlgebra) : ∃ N, P ∈ heightAlgebra N := + ⟨_, mem_heightAlgebra_vars_sup P⟩ + +/-! + +## B. The truncated covariant curvature algebra + +-/ + +/-- The components of the covariant curvature tower whose leading ordinary connection derivative +has derivative degree at most `N`. -/ +def covTowerAt (N : ℕ) : Set JetAlgebra := + {P | ∃ (r : ℕ) (t : Fin r → Lor) (nu mu : Lor) (c : Col), r + 1 ≤ N ∧ P = covCurv t nu mu c} + +/-- **The truncated covariant curvature algebra** available inside derivative height `N`. -/ +noncomputable def covAlgebraAt (N : ℕ) : Subalgebra ℝ JetAlgebra := Algebra.adjoin ℝ (covTowerAt N) + +lemma covCurv_mem_covAlgebraAt {N r : ℕ} (hr : r + 1 ≤ N) (t : Fin r → Lor) (nu mu : Lor) + (c : Col) : covCurv t nu mu c ∈ covAlgebraAt N := + Algebra.subset_adjoin ⟨r, t, nu, mu, c, hr, rfl⟩ + +lemma covAlgebraAt_mono {M N : ℕ} (h : M ≤ N) : covAlgebraAt M ≤ covAlgebraAt N := + Algebra.adjoin_mono fun _ hP => by + obtain ⟨r, t, nu, mu, c, hr, hPc⟩ := hP + exact ⟨r, t, nu, mu, c, hr.trans h, hPc⟩ + +lemma covAlgebraAt_le_covAlgebra (N : ℕ) : covAlgebraAt N ≤ covAlgebra := by + refine Algebra.adjoin_le ?_ + rintro P ⟨r, t, nu, mu, c, _, rfl⟩ + exact covCurv_mem_covAlgebra t nu mu c + +lemma covAlgebraAt_le_heightAlgebra (N : ℕ) : covAlgebraAt N ≤ heightAlgebra N := by + refine Algebra.adjoin_le ?_ + rintro P ⟨r, t, nu, mu, c, hr, rfl⟩ + exact heightAlgebra_mono hr (covCurv_mem_heightAlgebra t nu mu c) + +lemma covHook_mem_covAlgebra (i : AllHookIdx) (c : Col) : covHook i c ∈ covAlgebra := + covCurv_mem_covAlgebra _ _ _ _ + +lemma covHook_mem_covAlgebraAt {N : ℕ} (i : AllHookIdx) (hi : lorDeg i.w ≤ N + 1) (c : Col) : + covHook i c ∈ covAlgebraAt N := by + refine covCurv_mem_covAlgebraAt ?_ (didxTuple (hookRest i)) (layerDir i.w) i.mu c + have h1 := didxList_length (hookRest i) + have h2 := lorDeg_hookRest i + omega + +/-! + +## C. Symmetric and hook slots + +Each nonzero total multi-index `w` labels one fibre of ordinary generators, namely the supported +components `∂_(w - ∂_ν) A_ν`. The slot of the distinguished direction `layerDir w` is where the +fully symmetric coordinate will live; every other supported slot carries a hook coordinate. + +-/ + +/-- The generator slot carrying the fully symmetric coordinate of the fibre `w`. -/ +noncomputable def symGen (w : DIdx) (c : Col) : JetGenerators := + .dA (layerPred w) (layerDir w) c + +lemma layerPred_eq_predAt (w : DIdx) : layerPred w = predAt w (layerDir w) := rfl + +lemma genDeg_symGen (w : DIdx) (c : Col) : genDeg (symGen w c) = lorDeg (layerPred w) := rfl + +/-- The fibre of a generator: the total multi-index obtained by adjoining its connection +direction. -/ +noncomputable def genFibre : JetGenerators → DIdx + | .dA s mu _ => s + Finsupp.single mu 1 + +/-- The colour index of a generator. -/ +def genCol : JetGenerators → Col + | .dA _ _ c => c + +@[simp] +lemma genFibre_dA (s : DIdx) (mu : Lor) (c : Col) : + genFibre (.dA s mu c) = s + Finsupp.single mu 1 := rfl + +@[simp] +lemma genCol_dA (s : DIdx) (mu : Lor) (c : Col) : genCol (.dA s mu c) = c := rfl + +lemma genFibre_ne_zero (g : JetGenerators) : genFibre g ≠ 0 := by + obtain ⟨s, mu, c⟩ := g + exact total_add_single_ne_zero s mu + +lemma lorDeg_genFibre (g : JetGenerators) : lorDeg (genFibre g) = genDeg g + 1 := by + obtain ⟨s, mu, c⟩ := g + rw [genFibre_dA, lorDeg_add, lorDeg_single, genDeg_dA] + +lemma genFibre_symGen {w : DIdx} (hw : w ≠ 0) (c : Col) : genFibre (symGen w c) = w := + layerPred_add_single hw + +lemma genCol_symGen (w : DIdx) (c : Col) : genCol (symGen w c) = c := rfl + +/-- A generator is a **symmetric slot** when its connection direction is the distinguished +direction of its fibre. -/ +noncomputable def IsSymSlot : JetGenerators → Prop + | .dA s mu _ => mu = layerDir (s + Finsupp.single mu 1) + +@[simp] +lemma isSymSlot_dA (s : DIdx) (mu : Lor) (c : Col) : + IsSymSlot (.dA s mu c) ↔ mu = layerDir (s + Finsupp.single mu 1) := Iff.rfl + +lemma isSymSlot_symGen {w : DIdx} (hw : w ≠ 0) (c : Col) : IsSymSlot (symGen w c) := by + show layerDir w = layerDir (layerPred w + Finsupp.single (layerDir w) 1) + rw [layerPred_add_single hw] + +lemma eq_symGen_of_isSymSlot {g : JetGenerators} (hg : IsSymSlot g) : + g = symGen (genFibre g) (genCol g) := by + obtain ⟨s, mu, c⟩ := g + have h : mu = layerDir (s + Finsupp.single mu 1) := hg + show JetGenerators.dA s mu c = + JetGenerators.dA (layerPred (s + Finsupp.single mu 1)) + (layerDir (s + Finsupp.single mu 1)) c + rw [← h, layerPred_eq_predAt, ← h, predAt_add_single_eq] + +lemma symGen_inj {w w' : DIdx} (hw : w ≠ 0) (hw' : w' ≠ 0) {c c' : Col} + (h : symGen w c = symGen w' c') : w = w' ∧ c = c' := by + have hf : genFibre (symGen w c) = genFibre (symGen w' c') := by rw [h] + rw [genFibre_symGen hw, genFibre_symGen hw'] at hf + refine ⟨hf, ?_⟩ + have := congrArg genCol h + rwa [genCol_symGen, genCol_symGen] at this + +/-- The symmetric slot value of the fibre `w`. -/ +noncomputable def symSlot (w : DIdx) (c : Col) : JetAlgebra := totalComponent w (layerDir w) c + +/-- The hook slot value of the fibre `w` in the direction `nu`; it is zero in the distinguished +direction. -/ +noncomputable def hookSlot (w : DIdx) (nu : Lor) (c : Col) : JetAlgebra := + if nu = layerDir w then 0 else totalComponent w nu c + +/-- The weighted average of the hook slots of a fibre; this is the correction appearing in + `Triangular`'s +explicit inverse coordinate formula. -/ +noncomputable def slotAverage (w : DIdx) (c : Col) : JetAlgebra := + (lorDeg w : ℝ)⁻¹ • ∑ nu : Lor, (w nu : ℝ) • hookSlot w nu c + +lemma symSlot_eq_ofGen (w : DIdx) (c : Col) : symSlot w c = ofGen (symGen w c) := rfl + +lemma lorDeg_cast_ne_zero {w : DIdx} (hw : w ≠ 0) : (lorDeg w : ℝ) ≠ 0 := by + exact_mod_cast Nat.ne_of_gt ((lorDeg_pos_iff w).2 hw) + +lemma sum_coeff_eq_lorDeg (w : DIdx) : ∑ nu : Lor, (w nu : ℝ) = (lorDeg w : ℝ) := by + rw [lorDeg] + norm_cast + +lemma sum_weighted_hookSlot {w : DIdx} (hw : w ≠ 0) (c : Col) : + ∑ nu : Lor, (w nu : ℝ) • hookSlot w nu c = (lorDeg w : ℝ) • slotAverage w c := by + rw [slotAverage, smul_smul, mul_inv_cancel₀ (lorDeg_cast_ne_zero hw), one_smul] + +/-! + +## D. The invertible fibrewise linear coordinate change + +-/ + +/-- Generator form of the fibrewise linear change of variables: the distinguished slot of a fibre +receives the weighted symmetric average, every other slot its hook difference. -/ +noncomputable def linCoordGen : JetGenerators → JetAlgebra + | .dA s mu c => + if mu = layerDir (s + Finsupp.single mu 1) then symConn (s + Finsupp.single mu 1) c + else + totalComponent (s + Finsupp.single mu 1) mu c - + totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c + +/-- Generator form of the inverse fibrewise linear change of variables, read off + `Triangular`'s explicit +weighted-average inverse. -/ +noncomputable def invLinCoordGen : JetGenerators → JetAlgebra + | .dA s mu c => + symSlot (s + Finsupp.single mu 1) c + hookSlot (s + Finsupp.single mu 1) mu c - + slotAverage (s + Finsupp.single mu 1) c + +/-- The fibrewise linear coordinate change on the ordinary jet algebra. -/ +noncomputable def linSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := + (MvPolynomial.aeval linCoordGen).comp toPoly.toAlgHom + +/-- The inverse fibrewise linear coordinate change. -/ +noncomputable def invLinSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := + (MvPolynomial.aeval invLinCoordGen).comp toPoly.toAlgHom + +@[simp] +lemma linSubst_ofGen (g : JetGenerators) : linSubst (ofGen g) = linCoordGen g := by + show MvPolynomial.aeval linCoordGen (toPoly (ofGen g)) = _ + rw [toPoly_ofGen, aeval_X] + +@[simp] +lemma invLinSubst_ofGen (g : JetGenerators) : invLinSubst (ofGen g) = invLinCoordGen g := by + show MvPolynomial.aeval invLinCoordGen (toPoly (ofGen g)) = _ + rw [toPoly_ofGen, aeval_X] + +lemma invLinSubst_totalComponent {w : DIdx} {nu : Lor} (hnu : w nu ≠ 0) (c : Col) : + invLinSubst (totalComponent w nu c) = + symSlot w c + hookSlot w nu c - slotAverage w c := by + rw [totalComponent, invLinSubst_ofGen] + show symSlot (predAt w nu + Finsupp.single nu 1) c + + hookSlot (predAt w nu + Finsupp.single nu 1) nu c - + slotAverage (predAt w nu + Finsupp.single nu 1) c = _ + rw [predAt_add_single hnu] + +lemma invLinSubst_symConn {w : DIdx} (hw : w ≠ 0) (c : Col) : + invLinSubst (symConn w c) = symSlot w c := by + have hdeg : (lorDeg w : ℝ) ≠ 0 := lorDeg_cast_ne_zero hw + have hterm : ∀ nu : Lor, invLinSubst ((w nu : ℝ) • totalComponent w nu c) = + (w nu : ℝ) • (symSlot w c + hookSlot w nu c - slotAverage w c) := by + intro nu + by_cases hnu : w nu = 0 + · rw [hnu, Nat.cast_zero, zero_smul, zero_smul, map_zero] + · rw [map_smul, invLinSubst_totalComponent hnu] + have hkey : ∑ nu : Lor, (w nu : ℝ) • (symSlot w c + hookSlot w nu c - slotAverage w c) = + (lorDeg w : ℝ) • symSlot w c := by + simp_rw [smul_sub, smul_add] + rw [Finset.sum_sub_distrib, Finset.sum_add_distrib, ← Finset.sum_smul, ← Finset.sum_smul, + sum_coeff_eq_lorDeg, sum_weighted_hookSlot hw] + abel + rw [symConn, map_smul, map_sum, Finset.sum_congr rfl fun nu _ => hterm nu, hkey, smul_smul, + inv_mul_cancel₀ hdeg, one_smul] + +/-- **The linear coordinate change is invertible.** This is where `Triangular`'s + explicit weighted-average +inverse is consumed; no algebraic independence is assumed. -/ +lemma invLinSubst_linCoordGen (g : JetGenerators) : invLinSubst (linCoordGen g) = ofGen g := by + obtain ⟨s, mu, c⟩ := g + have hw : s + Finsupp.single mu 1 ≠ 0 := total_add_single_ne_zero s mu + have hmu := total_add_single_apply_ne_zero s mu + have hdir := layerDir_coeff_ne_zero hw + by_cases h : mu = layerDir (s + Finsupp.single mu 1) + · rw [linCoordGen, if_pos h, invLinSubst_symConn hw, symSlot, ← h, totalComponent_add_single] + · rw [linCoordGen, if_neg h, map_sub, invLinSubst_totalComponent hmu, + invLinSubst_totalComponent hdir, hookSlot, if_neg h, hookSlot, if_pos rfl, + ← totalComponent_add_single s mu c] + abel + +lemma invLinSubst_linSubst (P : JetAlgebra) : invLinSubst (linSubst P) = P := by + have h : invLinSubst.comp linSubst = AlgHom.id ℝ JetAlgebra := + jetAlgHom_ext fun g => by + rw [AlgHom.comp_apply, linSubst_ofGen, invLinSubst_linCoordGen, AlgHom.id_apply] + have h2 := DFunLike.congr_fun h P + simpa using h2 + +lemma linSubst_injective : Function.Injective linSubst := + Function.LeftInverse.injective invLinSubst_linSubst + +/-! + +## E. The covariant coordinate system + +Composing the fibrewise linear change with `Triangular`'s triangular substitution +replaces every hook +difference by the matching symmetrized covariant curvature derivative while keeping the fully +symmetric connection coordinate. Injectivity is inherited from both factors, so the resulting +family of coordinates is genuinely algebraically independent. + +-/ + +lemma AllHookIdx.ext' {i j : AllHookIdx} (hw : i.w = j.w) (hmu : i.mu = j.mu) : i = j := by + obtain ⟨w, mu, h1, h2, h3⟩ := i + obtain ⟨w', mu', h1', h2', h3'⟩ := j + simp only at hw hmu + subst hw + subst hmu + rfl + +/-- Generator form of the covariant coordinate system: the distinguished slot of each fibre +carries the fully symmetric connection coordinate, every other supported slot carries the matching +symmetrized covariant curvature derivative. -/ +noncomputable def covCoordGen : JetGenerators → JetAlgebra + | .dA s mu c => + if h : mu = layerDir (s + Finsupp.single mu 1) then symConn (s + Finsupp.single mu 1) c + else + covHook ⟨s + Finsupp.single mu 1, mu, total_add_single_ne_zero s mu, + total_add_single_apply_ne_zero s mu, h⟩ c + +lemma covCoordGen_dA (s : DIdx) (mu : Lor) (c : Col) : + covCoordGen (.dA s mu c) = + if h : mu = layerDir (s + Finsupp.single mu 1) then symConn (s + Finsupp.single mu 1) c + else + covHook ⟨s + Finsupp.single mu 1, mu, total_add_single_ne_zero s mu, + total_add_single_apply_ne_zero s mu, h⟩ c := rfl + +/-- **The covariant coordinate substitution**: `Triangular`'s triangular map after the + fibrewise linear +change of variables. -/ +noncomputable def covSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := triangularSubst.comp linSubst + +@[simp] +lemma covSubst_ofGen (g : JetGenerators) : covSubst (ofGen g) = covCoordGen g := by + obtain ⟨s, mu, c⟩ := g + rw [covSubst, AlgHom.comp_apply, linSubst_ofGen, linCoordGen, covCoordGen_dA] + by_cases h : mu = layerDir (s + Finsupp.single mu 1) + · rw [if_pos h, dif_pos h, triangularSubst_symConn (total_add_single_ne_zero s mu)] + · rw [if_neg h, dif_neg h] + exact triangularSubst_hookDiff ⟨_, _, _, _, h⟩ c + +lemma covSubst_injective : Function.Injective covSubst := by + intro P Q h + have h' : triangularSubst (linSubst P) = triangularSubst (linSubst Q) := h + exact linSubst_injective (triangularSubst_injective h') + +/-- The covariant coordinates read as a polynomial substitution. -/ +noncomputable def covCoordHom : MvPolynomial JetGenerators ℝ →ₐ[ℝ] JetAlgebra := + MvPolynomial.aeval covCoordGen + +@[simp] +lemma covCoordHom_X (g : JetGenerators) : covCoordHom (X g) = covCoordGen g := aeval_X _ _ + +@[simp] +lemma covCoordHom_C (v : ℝ) : covCoordHom (C v) = algebraMap ℝ JetAlgebra v := aeval_C _ _ + +lemma covCoordHom_comp_X : + (⇑covCoordHom ∘ (X : JetGenerators → MvPolynomial JetGenerators ℝ)) = covCoordGen := + funext fun g => covCoordHom_X g + +lemma covCoordHom_eq_comp : covCoordHom = covSubst.comp toPoly.symm.toAlgHom := + MvPolynomial.algHom_ext fun g => by + rw [covCoordHom_X, AlgHom.comp_apply] + show covCoordGen g = covSubst (toPoly.symm (X g)) + rw [toPoly_symm_X, covSubst_ofGen] + +/-- **The covariant coordinates are algebraically independent.** Nothing is assumed here: the +injectivity comes from `Triangular`'s triangular inverse together with the explicit +inverse of the +fibrewise linear change. -/ +lemma covCoordHom_injective : Function.Injective covCoordHom := by + intro p q h + rw [covCoordHom_eq_comp] at h + have h' : covSubst (toPoly.symm p) = covSubst (toPoly.symm q) := h + exact toPoly.symm.injective (covSubst_injective h') + +lemma covCoordGen_symGen {w : DIdx} (hw : w ≠ 0) (c : Col) : + covCoordGen (symGen w c) = symConn w c := by + have hfib : layerPred w + Finsupp.single (layerDir w) 1 = w := layerPred_add_single hw + rw [symGen, covCoordGen_dA, + dif_pos (show layerDir w = layerDir (layerPred w + Finsupp.single (layerDir w) 1) by + rw [hfib]), hfib] + +lemma covCoordGen_predAt (i : AllHookIdx) (c : Col) : + covCoordGen (.dA (predAt i.w i.mu) i.mu c) = covHook i c := by + have hfib : predAt i.w i.mu + Finsupp.single i.mu 1 = i.w := predAt_add_single i.mu_supported + have hne : ¬ (i.mu = layerDir (predAt i.w i.mu + Finsupp.single i.mu 1)) := by + rw [hfib] + exact i.mu_ne_dir + rw [covCoordGen_dA, dif_neg hne] + exact congrArg (fun j => covHook j c) (AllHookIdx.ext' hfib rfl) + +lemma covCoordGen_mem_covAlgebra_of_not_isSymSlot {g : JetGenerators} (hg : ¬ IsSymSlot g) : + covCoordGen g ∈ covAlgebra := by + obtain ⟨s, mu, c⟩ := g + have hg' : ¬ (mu = layerDir (s + Finsupp.single mu 1)) := hg + rw [covCoordGen_dA, dif_neg hg'] + exact covHook_mem_covAlgebra _ c + +lemma covCoordGen_mem_covAlgebraAt_of_not_isSymSlot {N : ℕ} {g : JetGenerators} + (hg : ¬ IsSymSlot g) (hd : genDeg g ≤ N) : covCoordGen g ∈ covAlgebraAt N := by + obtain ⟨s, mu, c⟩ := g + have hg' : ¬ (mu = layerDir (s + Finsupp.single mu 1)) := hg + rw [covCoordGen_dA, dif_neg hg'] + refine covHook_mem_covAlgebraAt _ ?_ c + show lorDeg (s + Finsupp.single mu 1) ≤ N + 1 + have hs : lorDeg s ≤ N := hd + rw [lorDeg_add, lorDeg_single] + omega + +/-- The subalgebra generated by the covariant coordinates of derivative degree at most `N`. -/ +noncomputable def covCoordAlgebra (N : ℕ) : Subalgebra ℝ JetAlgebra := + Algebra.adjoin ℝ (covCoordGen '' {g : JetGenerators | genDeg g ≤ N}) + +lemma covCoordGen_mem_covCoordAlgebra {N : ℕ} {g : JetGenerators} (hg : genDeg g ≤ N) : + covCoordGen g ∈ covCoordAlgebra N := Algebra.subset_adjoin ⟨g, hg, rfl⟩ + +lemma covCoordAlgebra_mono {M N : ℕ} (h : M ≤ N) : covCoordAlgebra M ≤ covCoordAlgebra N := + Algebra.adjoin_mono (Set.image_mono fun _ hg => le_trans hg h) + +/-- **A hook difference is a covariant coordinate up to strictly lower terms.** The correction +`covHook - hookDiff` lies in the strict filtration by `Triangular`, so it is covered by +the inductive +hypothesis packaged as `hsfilt`. -/ +private lemma hookDiff_mem_covCoordAlgebra {m : ℕ} + (hsfilt : ∀ P ∈ sfilt m, P ∈ covCoordAlgebra m) (i : AllHookIdx) + (hi : lorDeg (predAt i.w i.mu) = m) (c : Col) : hookDiff i c ∈ covCoordAlgebra m := by + have h1 : covHook i c ∈ covCoordAlgebra m := by + rw [← covCoordGen_predAt i c] + exact covCoordGen_mem_covCoordAlgebra (le_of_eq hi) + have h2 : covHook i c - hookDiff i c ∈ covCoordAlgebra m := by + refine hsfilt _ ?_ + rw [← hi] + exact covHook_sub_hookDiff_mem_sfilt i c + have h3 := sub_mem h1 h2 + rwa [sub_sub_cancel] at h3 + +/-- The inductive step: once every strictly lower monomial is a polynomial in the covariant +coordinates, so is every ordinary generator of derivative degree `m`. -/ +private lemma ofGen_mem_covCoordAlgebra_step {m : ℕ} + (hsfilt : ∀ P ∈ sfilt m, P ∈ covCoordAlgebra m) : + ∀ g : JetGenerators, genDeg g = m → ofGen g ∈ covCoordAlgebra m := by + rintro ⟨s, mu, c⟩ hgm + have hgm' : lorDeg s = m := hgm + have hw : s + Finsupp.single mu 1 ≠ 0 := total_add_single_ne_zero s mu + have hmu := total_add_single_apply_ne_zero s mu + have hwdeg : lorDeg (s + Finsupp.single mu 1) = m + 1 := by + rw [lorDeg_add, lorDeg_single, hgm'] + have hsym : symConn (s + Finsupp.single mu 1) c ∈ covCoordAlgebra m := by + rw [← covCoordGen_symGen hw c] + refine covCoordGen_mem_covCoordAlgebra ?_ + show lorDeg (layerPred (s + Finsupp.single mu 1)) ≤ m + have h1 := lorDeg_layerPred hw + omega + have hhook : ∀ nu : Lor, ((s + Finsupp.single mu 1 : DIdx)) nu ≠ 0 → + nu ≠ layerDir (s + Finsupp.single mu 1) → + totalComponent (s + Finsupp.single mu 1) nu c - + totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c ∈ + covCoordAlgebra m := by + intro nu hnu hne + obtain ⟨i, hiw, himu⟩ : ∃ i : AllHookIdx, i.w = s + Finsupp.single mu 1 ∧ i.mu = nu := + ⟨⟨s + Finsupp.single mu 1, nu, hw, hnu, hne⟩, rfl, rfl⟩ + have hgoal : hookDiff i c = + totalComponent (s + Finsupp.single mu 1) nu c - + totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c := by + rw [hookDiff, hiw, himu] + rw [← hgoal] + refine hookDiff_mem_covCoordAlgebra hsfilt i ?_ c + rw [hiw, himu] + have h1 := lorDeg_predAt hnu + omega + have havg : hookAverage (s + Finsupp.single mu 1) c ∈ covCoordAlgebra m := by + rw [hookAverage] + refine Subalgebra.smul_mem _ ?_ _ + refine sum_mem fun nu _ => ?_ + by_cases hnu : ((s + Finsupp.single mu 1 : DIdx)) nu = 0 + · rw [hnu, Nat.cast_zero, zero_smul] + exact zero_mem _ + · by_cases hne : nu = layerDir (s + Finsupp.single mu 1) + · rw [hne, sub_self, smul_zero] + exact zero_mem _ + · exact Subalgebra.smul_mem _ (hhook nu hnu hne) _ + rw [← totalComponent_add_single s mu c, totalComponent_eq_symConn_add_hook_sub hw hmu c] + refine sub_mem (add_mem hsym ?_) havg + by_cases hne : mu = layerDir (s + Finsupp.single mu 1) + · have hzero : totalComponent (s + Finsupp.single mu 1) mu c = + totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c := by + rw [← hne] + rw [hzero, sub_self] + exact zero_mem _ + · exact hhook mu hmu hne + +/-- Every monomial of bounded additive derivative degree is a polynomial in the covariant +coordinates, provided each of its generators already is. -/ +private lemma filt_mem_covCoordAlgebra {m : ℕ} + (ih : ∀ k, k < m → ∀ g : JetGenerators, genDeg g = k → ofGen g ∈ covCoordAlgebra k) + {d : ℕ} (hd : d < m) : ∀ P ∈ filt d, P ∈ covCoordAlgebra m := by + intro P hP + induction hP using Submodule.span_induction with + | mem P hP => + obtain ⟨l, hl, rfl⟩ := hP + refine list_prod_mem ?_ + intro x hx + obtain ⟨h, hhl, rfl⟩ := List.mem_map.mp hx + have hdeg : genDeg h ≤ d := + le_trans (List.single_le_sum (fun _ _ => Nat.zero_le _) _ (List.mem_map_of_mem hhl)) hl + exact covCoordAlgebra_mono (le_of_lt (lt_of_le_of_lt hdeg hd)) + (ih (genDeg h) (lt_of_le_of_lt hdeg hd) h rfl) + | zero => exact zero_mem _ + | add x y _ _ hx hy => exact add_mem hx hy + | smul r x _ hx => exact Subalgebra.smul_mem _ hx r + +private lemma ofGen_mem_covCoordAlgebra_aux (m : ℕ) : + ∀ g : JetGenerators, genDeg g = m → ofGen g ∈ covCoordAlgebra m := by + induction m using Nat.strong_induction_on with + | _ m ih => + refine ofGen_mem_covCoordAlgebra_step ?_ + cases m with + | zero => + intro P hP + rw [sfilt_zero, Submodule.mem_bot] at hP + rw [hP] + exact zero_mem _ + | succ n => + intro P hP + rw [sfilt_succ] at hP + exact filt_mem_covCoordAlgebra ih (Nat.lt_succ_self n) P hP + +lemma ofGen_mem_covCoordAlgebra (g : JetGenerators) : ofGen g ∈ covCoordAlgebra (genDeg g) := + ofGen_mem_covCoordAlgebra_aux (genDeg g) g rfl + +/-- **Finite height is preserved by the covariant coordinate change.** Every ordinary generator is +a polynomial in the covariant coordinates of its own derivative degree, so a jet polynomial of +height at most `N` is a polynomial in the covariant coordinates of height at most `N`. -/ +lemma heightAlgebra_le_covCoordAlgebra (N : ℕ) : heightAlgebra N ≤ covCoordAlgebra N := by + refine Algebra.adjoin_le ?_ + rintro P ⟨g, hg, rfl⟩ + exact covCoordAlgebra_mono hg (ofGen_mem_covCoordAlgebra g) + +/-! + +## F. The based gauge action in covariant coordinates + +A jet based through order `r` fixes every hook coordinate at every derivative degree, because the +hook coordinates are covariant curvature components; and on the symmetric coordinates it is a pure +translation of the top layer, because of `HighestLayer`. This is the exact input of the +per-variable +polynomial translation lemma. + +-/ + +lemma coordC_smul_colourBasis (a : ℝ) (c₀ c : Col) : + coordC c (a • colourBasis c₀) = if c = c₀ then a else 0 := by + rw [map_smul, smul_eq_mul, coordC_apply, Basis.repr_self_apply] + by_cases h : c = c₀ + · rw [if_pos h, if_pos h.symm, mul_one] + · rw [if_neg h, if_neg fun hc => h hc.symm, mul_zero] + +/-- Below the top layer of a jet based through order `r` there is no shift at all. -/ +lemma layerShift_eq_zero_of_lorDeg_le {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : BasedTo r U) {w : DIdx} (hw : w ≠ 0) (h : lorDeg w ≤ r) : layerShift U w = 0 := by + have hlt : lorDeg (layerPred w) < r := by + have h1 := lorDeg_layerPred hw + omega + rw [layerShift, dif_neg hw, mcCoeffCAt_eq_zero_of_lt hU hlt (layerDir w), smul_zero] + +/-- **Every ordinary component of a fibre of derivative degree at most `r` is translated by the +same constant.** Below the top layer that constant vanishes, so this one statement covers both the +fixed and the translated layers. -/ +lemma gaugePull_totalComponent {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : BasedTo r U) {w : DIdx} {nu : Lor} (hnu : w nu ≠ 0) (hwr : lorDeg w ≤ r + 1) (c : Col) : + gaugePull U (totalComponent w nu c) = totalComponent w nu c + constR (layerShift U w) c := by + have hw : w ≠ 0 := fun h => hnu (by simp [h]) + have hpred := lorDeg_predAt hnu + rw [totalComponent, gaugePull_ofGen] + rcases eq_or_lt_of_le hwr with heq | hlt + · have hs : lorDeg (predAt w nu) = r := by omega + rw [gaugeSubstGen_eq_add_layerShift hU hs nu c, predAt_add_single hnu] + · have hs : lorDeg (predAt w nu) < r := by omega + rw [gaugeSubstGen_eq_ofGen_of_lt hU hs nu c, + layerShift_eq_zero_of_lorDeg_le hU hw (by omega)] + simp [constR] + +/-- **The fully symmetric coordinate is purely translated.** The weighted average of a fibre moves +by exactly the common constant of that fibre. -/ +lemma gaugePull_symConn {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} (hU : BasedTo r U) + {w : DIdx} (hw : w ≠ 0) (hwr : lorDeg w ≤ r + 1) (c : Col) : + gaugePull U (symConn w c) = symConn w c + constR (layerShift U w) c := by + have hdeg : (lorDeg w : ℝ) ≠ 0 := lorDeg_cast_ne_zero hw + have hterm : ∀ nu : Lor, gaugePull U ((w nu : ℝ) • totalComponent w nu c) = + (w nu : ℝ) • (totalComponent w nu c + constR (layerShift U w) c) := by + intro nu + by_cases hnu : w nu = 0 + · rw [hnu, Nat.cast_zero, zero_smul, zero_smul, map_zero] + · rw [map_smul, gaugePull_totalComponent hU hnu hwr] + rw [symConn, map_smul, map_sum, Finset.sum_congr rfl fun nu _ => hterm nu] + simp_rw [smul_add] + rw [Finset.sum_add_distrib, ← Finset.sum_smul, sum_coeff_eq_lorDeg, smul_add, smul_smul, + inv_mul_cancel₀ hdeg, one_smul] + +/-- **Based jets fix every hook coordinate**, at every derivative degree: these are covariant +curvature components, so this is `CovariantTower`. -/ +lemma gaugePull_covCoordGen_of_not_isSymSlot {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) {g : JetGenerators} (hg : ¬ IsSymSlot g) : + gaugePull U (covCoordGen g) = covCoordGen g := + gaugePull_eq_self_of_based U hU (covCoordGen_mem_covAlgebra_of_not_isSymSlot hg) + +/-- **Based jets translate the symmetric coordinates of their own layer and below by a +constant.** -/ +lemma gaugePull_covCoordGen_of_isSymSlot {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : BasedTo r U) {g : JetGenerators} (hg : IsSymSlot g) (hd : genDeg g ≤ r) : + gaugePull U (covCoordGen g) = + covCoordGen g + constR (layerShift U (genFibre g)) (genCol g) := by + obtain ⟨s, mu, c⟩ := g + have hmu : mu = layerDir (s + Finsupp.single mu 1) := hg + have hw : s + Finsupp.single mu 1 ≠ 0 := total_add_single_ne_zero s mu + have hs : lorDeg s ≤ r := hd + rw [covCoordGen_dA, dif_pos hmu, genFibre_dA, genCol_dA] + refine gaugePull_symConn hU hw ?_ c + rw [lorDeg_add, lorDeg_single] + omega + +/-! + +## G. The descending elimination + +-/ + +/-- The variables that survive after the symmetric coordinates of derivative degree at least `k` +have been eliminated inside derivative height `M`. -/ +def slotSupport (M k : ℕ) : Set JetGenerators := + {g | genDeg g ≤ M ∧ (¬ IsSymSlot g ∨ genDeg g < k)} + +lemma slotSupport_zero (M : ℕ) : + slotSupport M 0 = {g : JetGenerators | genDeg g ≤ M ∧ ¬ IsSymSlot g} := by + ext g + constructor + · rintro ⟨h1, h2 | h2⟩ + · exact ⟨h1, h2⟩ + · omega + · rintro ⟨h1, h2⟩ + exact ⟨h1, Or.inl h2⟩ + +/-- The constant by which a realizing jet moves a symmetric coordinate is the delta function of the +selected fibre and colour. This is the exact translation pattern the per-variable polynomial lemma +consumes. -/ +private lemma constR_layerShift_eq_ite {k : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} + (hU : BasedTo k U) {w : DIdx} (hw : lorDeg w = k + 1) {c₀ : Col} {a : ℝ} + (h1 : layerShift U w = a • colourBasis c₀) + (h0 : ∀ w', lorDeg w' = k + 1 → w' ≠ w → layerShift U w' = 0) + {g : JetGenerators} (hg : IsSymSlot g) (hd : genDeg g ≤ k) : + constR (layerShift U (genFibre g)) (genCol g) = + algebraMap ℝ JetAlgebra (if g = symGen w c₀ then a else 0) := by + have hw0 : w ≠ 0 := by + rw [← lorDeg_pos_iff, hw] + omega + have hfg : genFibre g ≠ 0 := genFibre_ne_zero g + have hfdeg : lorDeg (genFibre g) = genDeg g + 1 := lorDeg_genFibre g + have hgdeg : genDeg (symGen w c₀) = k := by + have hlp := lorDeg_layerPred hw0 + rw [genDeg_symGen] + omega + rcases eq_or_lt_of_le hd with heq | hlt + · have hfk : lorDeg (genFibre g) = k + 1 := by omega + by_cases hfw : genFibre g = w + · have hiff : (genCol g = c₀) ↔ (g = symGen w c₀) := by + constructor + · intro hc + calc g = symGen (genFibre g) (genCol g) := eq_symGen_of_isSymSlot hg + _ = symGen w c₀ := by rw [hfw, hc] + · intro hgs + have hcol := congrArg genCol hgs + rwa [genCol_symGen] at hcol + rw [hfw, h1, constR, coordC_smul_colourBasis, if_congr hiff rfl rfl] + · have hne : g ≠ symGen w c₀ := by + intro hgs + exact hfw (by rw [hgs, genFibre_symGen hw0]) + rw [h0 _ hfk hfw, if_neg hne] + simp [constR] + · have hle : lorDeg (genFibre g) ≤ k := by omega + have hne : g ≠ symGen w c₀ := by + intro hgs + have hdd : genDeg g = genDeg (symGen w c₀) := by rw [hgs] + omega + rw [layerShift_eq_zero_of_lorDeg_le hU hfg hle, if_neg hne] + simp [constR] + +/-- **One symmetric coordinate of the top surviving layer is removed.** The realizing jet of + `HighestLayer` +translates exactly that variable and fixes every other variable in the current support, so +`FiniteCompleteness`'s +per-variable translation lemma applies. -/ +private lemma notMem_vars_symGen {M k : ℕ} {Q : MvPolynomial JetGenerators ℝ} + (hfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q) + (hQ : Q ∈ supported ℝ (slotSupport M (k + 1))) + {w : DIdx} (hw : lorDeg w = k + 1) (c₀ : Col) : symGen w c₀ ∉ Q.vars := by + classical + have hw0 : w ≠ 0 := by + rw [← lorDeg_pos_iff, hw] + omega + refine MvPolynomial.notMem_vars_of_forall_aeval_add_eq Q (symGen w c₀) fun a => ?_ + obtain ⟨U, hUb, hU1, hU0⟩ := exists_basedTo_layerShift hw c₀ a + set f : JetGenerators → MvPolynomial JetGenerators ℝ := + fun i => X i + C (if i = symGen w c₀ then a else 0) with hfdef + have hagree : ∀ g ∈ slotSupport M (k + 1), + covCoordHom (aeval (R := ℝ) f (X g)) = gaugePull U (covCoordHom (X g)) := by + intro g hg + have hfg : aeval (R := ℝ) f (X g) = X g + C (if g = symGen w c₀ then a else 0) := by + rw [aeval_X, hfdef] + rw [hfg, map_add, covCoordHom_X, covCoordHom_C] + by_cases hs : IsSymSlot g + · have hd : genDeg g ≤ k := by + rcases hg.2 with h | h + · exact absurd hs h + · omega + rw [gaugePull_covCoordGen_of_isSymSlot hUb hs hd, + constR_layerShift_eq_ite hUb hw hU1 hU0 hs hd] + · have hne : g ≠ symGen w c₀ := fun hgs => hs (hgs ▸ isSymSlot_symGen hw0 c₀) + rw [if_neg hne, map_zero, add_zero, + gaugePull_covCoordGen_of_not_isSymSlot (basedTo_evalSU hUb) hs] + have hQ' : Q ∈ Algebra.adjoin ℝ (X '' slotSupport M (k + 1)) := by + rwa [← supported_eq_adjoin_X] + have hmem : Q ∈ AlgHom.equalizer (covCoordHom.comp (aeval (R := ℝ) f)) + ((gaugePull U).comp covCoordHom) := by + refine Algebra.adjoin_le ?_ hQ' + rintro _ ⟨g, hg, rfl⟩ + exact hagree g hg + have heq : covCoordHom (aeval (R := ℝ) f Q) = gaugePull U (covCoordHom Q) := hmem + rw [hfix U (basedTo_evalSU hUb)] at heq + exact covCoordHom_injective heq + +/-- One step of the descending elimination: the whole symmetric layer of derivative degree `k` +disappears from the support. -/ +private lemma supported_step {M k : ℕ} {Q : MvPolynomial JetGenerators ℝ} + (hfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q) + (hQ : Q ∈ supported ℝ (slotSupport M (k + 1))) : Q ∈ supported ℝ (slotSupport M k) := by + classical + have hsub := mem_supported.mp hQ + rw [mem_supported] + intro g hg + have hg' := hsub hg + refine ⟨hg'.1, ?_⟩ + rcases hg'.2 with h | h + · exact Or.inl h + · rcases Nat.lt_succ_iff_lt_or_eq.mp h with h2 | h2 + · exact Or.inr h2 + · by_cases hs : IsSymSlot g + · exfalso + have hfib : lorDeg (genFibre g) = k + 1 := by rw [lorDeg_genFibre, h2] + have hnot := notMem_vars_symGen hfix hQ hfib (genCol g) + rw [← eq_symGen_of_isSymSlot hs] at hnot + exact hnot (Finset.mem_coe.mp hg) + · exact Or.inl hs + +/-- The full descending elimination: every symmetric coordinate is removed, layer by layer, from +the top of the height down to the connection. -/ +private lemma supported_descend {M : ℕ} {Q : MvPolynomial JetGenerators ℝ} + (hfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q) : + ∀ k, Q ∈ supported ℝ (slotSupport M k) → Q ∈ supported ℝ (slotSupport M 0) := by + intro k + induction k with + | zero => exact fun h => h + | succ k ih => exact fun h => ih (supported_step hfix h) + +/-- **Finite-height completeness.** Inside every finite derivative height `N`, the ordinary jet +polynomials fixed by every based `SU(3)` gauge jet are exactly the elements of the truncated +algebra generated by the covariant curvature derivatives available at that height. + +The forward direction is the descending elimination in the covariant coordinates of section E; the +reverse direction is `CovariantTower`'s fixation of the covariant subalgebra together with the +height bound of +section B. -/ +lemma fixed_by_based_height_eq_covAlgebraAt (N : ℕ) : + {P : JetAlgebra | P ∈ heightAlgebra N ∧ + ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U P = P} = + (covAlgebraAt N : Set JetAlgebra) := by + classical + ext P + simp only [Set.mem_setOf_eq, SetLike.mem_coe] + constructor + · rintro ⟨hPh, hPfix⟩ + have h1 : P ∈ covCoordAlgebra N := heightAlgebra_le_covCoordAlgebra N hPh + have himg : (Algebra.adjoin ℝ (X '' {g : JetGenerators | genDeg g ≤ N})).map covCoordHom = + covCoordAlgebra N := by + rw [AlgHom.map_adjoin, covCoordAlgebra, ← Set.image_comp, covCoordHom_comp_X] + rw [← himg] at h1 + obtain ⟨Q, hQ, hQP⟩ := Subalgebra.mem_map.mp h1 + rw [← supported_eq_adjoin_X] at hQ + have hfixQ : ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q := by + intro U hU + rw [hQP] + exact hPfix U hU + have hstart : Q ∈ supported ℝ (slotSupport N (N + 1)) := by + have hsub := mem_supported.mp hQ + rw [mem_supported] + intro g hg + have hd : genDeg g ≤ N := hsub hg + exact ⟨hd, Or.inr (by omega)⟩ + have hend := supported_descend hfixQ (N + 1) hstart + rw [slotSupport_zero, supported_eq_adjoin_X] at hend + have hmem : P ∈ (Algebra.adjoin ℝ + (X '' {g : JetGenerators | genDeg g ≤ N ∧ ¬ IsSymSlot g})).map covCoordHom := + Subalgebra.mem_map.mpr ⟨Q, hend, hQP⟩ + rw [AlgHom.map_adjoin, ← Set.image_comp, covCoordHom_comp_X] at hmem + refine Algebra.adjoin_le ?_ hmem + rintro _ ⟨g, ⟨hd, hs⟩, rfl⟩ + exact covCoordGen_mem_covAlgebraAt_of_not_isSymSlot hs hd + · intro hP + exact ⟨covAlgebraAt_le_heightAlgebra N hP, + fun U hU => gaugePull_eq_self_of_based U hU (covAlgebraAt_le_covAlgebra N hP)⟩ + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean new file mode 100644 index 000000000..ea0fd6fa2 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean @@ -0,0 +1,1108 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Mathlib.LinearAlgebra.Matrix.Adjugate +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.CoordinateChange +/-! +# The first-order gauge action in covariant coordinates + +## i. Overview + +This file defines the action of a gauge jet on the first-order gluon jet algebra `A₁` of +`CoordinateChange` and proves +the transformation law of every generator. + +The action is not asserted: it is *derived*. A gluon potential together with all of its +derivatives at a point is modelled, as in the underlying matrix-valued jet model, by a +matrix of formal power series for each spacetime direction, and the local gauge action is the +honest affine one + +```text +A_μ ↦ U A_μ U† + i (∂_μ U) U†. +``` + +`jetValue_actPot` and `jetDeriv_actPot` compute the base-point value and the first Taylor +coefficient of the transformed potential, and those two identities are exactly the substitution +`gaugeSubst` used on the polynomial coordinates. + +## ii. Conventions + +Hermitian throughout, matching the Physlib gluon convention. The Maurer–Cartan series carries the +`+i` of +`Gluon.mcMatrix`, and the colour bracket is `brMat M N = i (M N - N M)` as in `CoordinateChange`. +The +Lie-algebra (anti-hermitian) formulas of the underlying matrix-valued jet calculation are converted, +never adopted. + +## iii. The three transformation laws + +With `u = U(0)`, `m_ν = Gluon.mcCoeff U ν` and `t_{νμ} = mc2C U ν μ` the second Maurer–Cartan +coefficient: + +```text +A_μ ↦ Ad_u A_μ + m_μ +∂_ν A_μ ↦ Ad_u (∂_ν A_μ) - i [m_ν, Ad_u A_μ] + t_{νμ} +F_{νμ} ↦ Ad_u F_{νμ} +``` + +The third is `curvC_actPt`/`gaugeAct_curvPoly`: the field strength is *covariant*, not invariant. +The antisymmetric part of `t` is exactly what makes the cancellation work: +`t_{νμ} - t_{μν} = -i [m_ν, m_μ]` (`mc2C_sub`). + +## iv. Results + +* `mcP`, `mc2M`, `mc2C` — the Maurer–Cartan series and its first derivative; +* `trace_mcP` — the Maurer–Cartan series is traceless, because `det U = 1`; +* `actPot`, `jetValue_actPot`, `jetDeriv_actPot` — the derived coordinate transformation; +* `gaugeSubst`, `gaugeAct` — the induced substitution on `A₁`; +* `gaugeAct_curvPoly` — **curvature transforms by conjugation by the base-point value**. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. The entrywise formal derivative on matrices of jets + +These entrywise derivative lemmas support the power-series gauge-action calculation. + +-/ + +/-- The entrywise formal partial derivative of a matrix of jets. -/ +noncomputable def dMat (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing := + M.map (fun f => MvPowerSeries.pderiv ℂ ν f) + +@[simp] +lemma dMat_apply (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) (i j : Fin 3) : + dMat ν M i j = MvPowerSeries.pderiv ℂ ν (M i j) := rfl + +lemma dMat_mul (ν : Lor) (M N : Matrix (Fin 3) (Fin 3) JetRing) : + dMat ν (M * N) = dMat ν M * N + M * dMat ν N := by + refine Matrix.ext fun i j => ?_ + rw [dMat_apply, Matrix.add_apply, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply, + map_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [Derivation.leibniz] + simp only [dMat_apply, smul_eq_mul] + ring + +@[simp] +lemma dMat_one (ν : Lor) : dMat ν (1 : Matrix (Fin 3) (Fin 3) JetRing) = 0 := by + refine Matrix.ext fun i j => ?_ + by_cases h : i = j <;> simp [h] + +lemma dMat_star (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + dMat ν (star M) = star (dMat ν M) := by + refine Matrix.ext fun i j => ?_ + exact JetRing.pderiv_star ν (M j i) + +lemma dMat_comm (μ ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + dMat μ (dMat ν M) = dMat ν (dMat μ M) := + Matrix.ext fun i j => JetRing.pderiv_comm μ ν (M i j) + +/-- The base-point value of the entrywise derivative is the first Taylor coefficient. -/ +lemma jetValue_dMat (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + Gluon.jetValue (dMat ν M) = Gluon.jetDeriv ν M := by + ext i j + show MvPowerSeries.constantCoeff (MvPowerSeries.pderiv ℂ ν (M i j)) = + MvPowerSeries.coeff (Finsupp.single ν 1) (M i j) + rw [← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, MvPowerSeries.coeff_pderiv] + simp + +lemma jetDeriv_add (ν : Lor) (M N : Matrix (Fin 3) (Fin 3) JetRing) : + Gluon.jetDeriv ν (M + N) = Gluon.jetDeriv ν M + Gluon.jetDeriv ν N := by + ext i j + simp [Gluon.jetDeriv, Matrix.add_apply] + +lemma jetValue_add (M N : Matrix (Fin 3) (Fin 3) JetRing) : + Gluon.jetValue (M + N) = Gluon.jetValue M + Gluon.jetValue N := by + ext i j + simp [Gluon.jetValue, Matrix.add_apply] + +lemma jetValue_sub (M N : Matrix (Fin 3) (Fin 3) JetRing) : + Gluon.jetValue (M - N) = Gluon.jetValue M - Gluon.jetValue N := by + ext i j + simp [Gluon.jetValue, Matrix.sub_apply] + +lemma trace_jetValue (M : Matrix (Fin 3) (Fin 3) JetRing) : + trace (Gluon.jetValue M) = MvPowerSeries.constantCoeff (trace M) := by + rw [Matrix.trace, Matrix.trace, map_sum] + exact Finset.sum_congr rfl fun i _ => rfl + +lemma trace_jetDeriv (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + trace (Gluon.jetDeriv ν M) = MvPowerSeries.coeff (Finsupp.single ν 1) (trace M) := by + rw [Matrix.trace, Matrix.trace, map_sum] + exact Finset.sum_congr rfl fun i _ => rfl + +/-! + +## B. The Maurer–Cartan series + +`mcP` is the Lie-algebra (anti-hermitian) Maurer–Cartan series `(∂_μ U) U†` of the underlying +matrix-valued jet calculation. +The hermitian series is `i` times it; the factor of `i` is inserted only after passing to complex +matrices, so no star-module structure on the jet ring is needed. + +-/ + +variable (U : specialUnitaryGroup (Fin 3) JetRing) + +lemma coe_star_mul_self : star (U : Matrix (Fin 3) (Fin 3) JetRing) * U.1 = 1 := + mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp U.2).1 + +/-- The Maurer–Cartan series of a gauge jet, in the Lie-algebra convention: `(∂_μ U) U†`. -/ +noncomputable def mcP (μ : Lor) : Matrix (Fin 3) (Fin 3) JetRing := + dMat μ U.1 * star U.1 + +lemma dMat_star_coe (μ : Lor) : dMat μ (star U.1) = -(star U.1 * mcP U μ) := by + have h := congrArg (dMat μ) (Gluon.coe_mul_star_self U) + rw [dMat_mul, dMat_one] at h + have h2 : U.1 * dMat μ (star U.1) = -(dMat μ U.1 * star U.1) := + eq_neg_of_add_eq_zero_right h + calc dMat μ (star U.1) + = star U.1 * U.1 * dMat μ (star U.1) := by rw [coe_star_mul_self, Matrix.one_mul] + _ = star U.1 * (U.1 * dMat μ (star U.1)) := by rw [Matrix.mul_assoc] + _ = -(star U.1 * mcP U μ) := by rw [h2, mcP, Matrix.mul_neg] + +/-- The Maurer–Cartan series is anti-self-adjoint; the hermitian series is `i` times it. -/ +lemma star_mcP (μ : Lor) : star (mcP U μ) = -mcP U μ := by + have h := congrArg (dMat μ) (Gluon.coe_mul_star_self U) + rw [dMat_mul, dMat_one] at h + rw [mcP, star_mul, star_star, ← dMat_star] + exact eq_neg_of_add_eq_zero_right h + +/-- The derivative of the Maurer–Cartan series: a symmetric second-derivative term together with + a quadratic term. This is `dMat_mcP`, converted. -/ +lemma dMat_mcP (ν μ : Lor) : + dMat ν (mcP U μ) = dMat ν (dMat μ U.1) * star U.1 - mcP U μ * mcP U ν := by + rw [mcP, dMat_mul, dMat_star_coe] + rw [show dMat μ U.1 * -(star U.1 * mcP U ν) = -(dMat μ U.1 * star U.1 * mcP U ν) by + rw [Matrix.mul_neg, Matrix.mul_assoc]] + rw [← mcP] + abel + +lemma jetValue_mcP (μ : Lor) : + Gluon.jetValue (mcP U μ) = Gluon.jetDeriv μ U.1 * star (Gluon.jetValue U.1) := by + rw [mcP, Gluon.jetValue_mul, Gluon.jetValue_star, jetValue_dMat] + +lemma mcMatrix_eq (μ : Lor) : + Gluon.mcMatrix μ U.1 = Complex.I • Gluon.jetValue (mcP U μ) := by + rw [Gluon.mcMatrix, jetValue_mcP] + +/-! + +### B.1. The Maurer–Cartan series is traceless + +Unitarity alone makes the series anti-self-adjoint; it is the determinant-one condition that makes +it traceless, i.e. `su(3)`-valued rather than `u(3)`-valued. This is the all-orders tracelessness +statement needed below. + +-/ + +/-- Jacobi's formula for `3 × 3` matrices of jets: a direct expansion, not a general + determinant-derivative development. -/ +lemma pderiv_det (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + MvPowerSeries.pderiv ℂ ν M.det = trace (dMat ν M * adjugate M) := by + simp only [Matrix.det_fin_three, Matrix.adjugate_fin_three, map_add, map_sub, + Derivation.leibniz, smul_eq_mul, Matrix.trace_fin_three, Matrix.mul_apply, + Fin.sum_univ_three, dMat_apply, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.head_fin_const] + ring + +/-- For a gauge jet the adjugate is the conjugate transpose. -/ +lemma adjugate_coe : adjugate (U : Matrix (Fin 3) (Fin 3) JetRing) = star U.1 := by + have h3 : (U : Matrix (Fin 3) (Fin 3) JetRing) * adjugate U.1 = 1 := by + rw [Matrix.mul_adjugate, (mem_specialUnitaryGroup_iff.mp U.2).2, one_smul] + calc adjugate (U : Matrix (Fin 3) (Fin 3) JetRing) + = 1 * adjugate U.1 := by rw [Matrix.one_mul] + _ = star U.1 * U.1 * adjugate U.1 := by rw [coe_star_mul_self] + _ = star U.1 * (U.1 * adjugate U.1) := by rw [Matrix.mul_assoc] + _ = star U.1 := by rw [h3, Matrix.mul_one] + +/-- **The Maurer–Cartan series is traceless.** -/ +lemma trace_mcP (μ : Lor) : trace (mcP U μ) = 0 := by + have h := pderiv_det μ (U : Matrix (Fin 3) (Fin 3) JetRing) + rw [(mem_specialUnitaryGroup_iff.mp U.2).2, Derivation.map_one_eq_zero, adjugate_coe] at h + rw [mcP, ← h] + +/-! + +## C. The colour data of a gauge jet + +-/ + +/-- The base-point Maurer–Cartan coefficient, as a colour vector. -/ +noncomputable def mcC (μ : Lor) : ColourSpace := + ⟨Gluon.mcCoeff U μ, by + show trace (Gluon.mcMatrix μ U.1) = 0 + rw [mcMatrix_eq U, trace_smul, trace_jetValue, trace_mcP, map_zero, smul_zero]⟩ + +@[simp] +lemma cmat_mcC (μ : Lor) : cmat (mcC U μ) = Gluon.mcMatrix μ U.1 := rfl + +/-- The first derivative of the hermitian Maurer–Cartan series, as a complex matrix. -/ +noncomputable def mc2M (ν μ : Lor) : Matrix (Fin 3) (Fin 3) ℂ := + Complex.I • Gluon.jetDeriv ν (mcP U μ) + +lemma star_mc2M (ν μ : Lor) : star (mc2M U ν μ) = mc2M U ν μ := by + have h : star (Gluon.jetDeriv ν (mcP U μ)) = -Gluon.jetDeriv ν (mcP U μ) := by + rw [← Gluon.jetDeriv_star, star_mcP] + ext i j + simp [Gluon.jetDeriv, Matrix.neg_apply] + rw [mc2M, star_smul, h, Complex.star_def, Complex.conj_I, neg_smul, ← smul_neg, neg_neg] + +lemma trace_mc2M (ν μ : Lor) : trace (mc2M U ν μ) = 0 := by + rw [mc2M, trace_smul, trace_jetDeriv, trace_mcP, map_zero, smul_zero] + +/-- The second Maurer–Cartan coefficient, as a colour vector: the constant by which an order-two + based jet translates the derivative coordinates. -/ +noncomputable def mc2C (ν μ : Lor) : ColourSpace := + mkCM (mc2M U ν μ) (star_mc2M U ν μ) (trace_mc2M U ν μ) + +@[simp] +lemma cmat_mc2C (ν μ : Lor) : cmat (mc2C U ν μ) = mc2M U ν μ := rfl + +/-- **The antisymmetric part of the second Maurer–Cartan coefficient.** It is exactly minus the + colour bracket of the first coefficients; this identity is what makes the field strength + covariant, and it is why the order-two translation is symmetric on based jets. -/ +lemma mc2C_sub (ν μ : Lor) : + mc2C U ν μ - mc2C U μ ν = -br (mcC U ν) (mcC U μ) := by + apply cmat_injective + have hd : ∀ ρ σ : Lor, Gluon.jetDeriv ρ (mcP U σ) = + Gluon.jetValue (dMat ρ (dMat σ U.1) * star U.1) - + Gluon.jetValue (mcP U σ) * Gluon.jetValue (mcP U ρ) := by + intro ρ σ + rw [← jetValue_dMat, dMat_mcP, jetValue_sub, Gluon.jetValue_mul (mcP U σ) (mcP U ρ)] + have key : Gluon.jetDeriv ν (mcP U μ) - Gluon.jetDeriv μ (mcP U ν) = + Gluon.jetValue (mcP U ν) * Gluon.jetValue (mcP U μ) - + Gluon.jetValue (mcP U μ) * Gluon.jetValue (mcP U ν) := by + rw [hd ν μ, hd μ ν, dMat_comm ν μ U.1] + abel + have hI : ∀ Z : Matrix (Fin 3) (Fin 3) ℂ, Complex.I • (Complex.I • Z) = -Z := by + intro Z + rw [smul_smul, Complex.I_mul_I, neg_smul, one_smul] + show mc2M U ν μ - mc2M U μ ν = -brMat (cmat (mcC U ν)) (cmat (mcC U μ)) + rw [mc2M, mc2M, ← smul_sub, key, brMat, cmat_mcC, cmat_mcC, mcMatrix_eq, mcMatrix_eq] + simp only [Matrix.smul_mul, Matrix.mul_smul, hI] + module + +/-! + +## D. The gauge action on potentials + +-/ + +/-- A gluon potential together with all of its derivatives at a point: for each spacetime + direction a matrix of formal power series in the spacetime coordinates. -/ +abbrev Potential : Type := Lor → Matrix (Fin 3) (Fin 3) JetRing + +/-- The hermitian Maurer–Cartan series `i (∂_μ U) U†`, written without a star-module structure on + the jet ring. -/ +noncomputable def mcH (μ : Lor) : Matrix (Fin 3) (Fin 3) JetRing := + (MvPowerSeries.C Complex.I : JetRing) • mcP U μ + +lemma jetValue_mcH (μ : Lor) : Gluon.jetValue (mcH U μ) = Gluon.mcMatrix μ U.1 := by + rw [mcMatrix_eq U] + ext i j + show MvPowerSeries.constantCoeff ((MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) i j) = + Complex.I * MvPowerSeries.constantCoeff ((mcP U μ) i j) + simp + +lemma jetDeriv_mcH (ν μ : Lor) : Gluon.jetDeriv ν (mcH U μ) = mc2M U ν μ := by + rw [mc2M] + ext i j + show MvPowerSeries.coeff (Finsupp.single ν 1) + ((MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) i j) = + Complex.I * MvPowerSeries.coeff (Finsupp.single ν 1) ((mcP U μ) i j) + simp + +/-- **The local gauge action on potentials**, in the hermitian convention: + `A_μ ↦ U A_μ U† + i (∂_μ U) U†`. -/ +noncomputable def actPot (A : Potential) : Potential := + fun μ => U.1 * A μ * star U.1 + mcH U μ + +/-- **The transformation of the connection coordinate.** -/ +lemma jetValue_actPot (A : Potential) (μ : Lor) : + Gluon.jetValue (actPot U A μ) = + Gluon.jetValue U.1 * Gluon.jetValue (A μ) * star (Gluon.jetValue U.1) + + Gluon.mcMatrix μ U.1 := by + rw [actPot, jetValue_add, jetValue_mcH, Gluon.jetValue_mul, Gluon.jetValue_mul, + Gluon.jetValue_star] + +lemma jetDeriv_coe (ν : Lor) : + Gluon.jetDeriv ν U.1 = (-Complex.I) • (Gluon.mcMatrix ν U.1 * Gluon.jetValue U.1) := by + have hu : star (Gluon.jetValue U.1) * Gluon.jetValue U.1 = 1 := + mul_eq_one_comm.mp (Gluon.jetValue_mul_star_self U) + rw [Gluon.mcMatrix, Matrix.smul_mul, smul_smul, Matrix.mul_assoc, hu, Matrix.mul_one, + show (-Complex.I) * Complex.I = 1 by rw [neg_mul, Complex.I_mul_I, neg_neg], one_smul] + +lemma jetDeriv_star_coe (ν : Lor) : + Gluon.jetDeriv ν (star U.1) = + Complex.I • (star (Gluon.jetValue U.1) * Gluon.mcMatrix ν U.1) := by + have hh : star (Gluon.mcMatrix ν U.1) = Gluon.mcMatrix ν U.1 := + selfAdjoint.mem_iff.mp (Gluon.mcMatrix_mem_selfAdjoint (Gluon.coe_mul_star_self U) ν) + rw [Gluon.jetDeriv_star, jetDeriv_coe, star_smul, star_mul, hh, Complex.star_def, map_neg, + Complex.conj_I, neg_neg] + +/-- **The transformation of the derivative coordinate.** Conjugation by the base-point value, + a commutator with the Maurer–Cartan coefficient, and a translation by the second Maurer–Cartan + coefficient. -/ +lemma jetDeriv_actPot (A : Potential) (ν μ : Lor) : + Gluon.jetDeriv ν (actPot U A μ) = + Gluon.jetValue U.1 * Gluon.jetDeriv ν (A μ) * star (Gluon.jetValue U.1) - + brMat (Gluon.mcMatrix ν U.1) + (Gluon.jetValue U.1 * Gluon.jetValue (A μ) * star (Gluon.jetValue U.1)) + + mc2M U ν μ := by + rw [actPot, jetDeriv_add, jetDeriv_mcH, Gluon.jetDeriv_mul, Gluon.jetDeriv_mul, + Gluon.jetValue_mul, Gluon.jetValue_star, jetDeriv_coe, jetDeriv_star_coe] + congr 1 + rw [brMat] + simp only [Matrix.add_mul, Matrix.smul_mul, Matrix.mul_smul, smul_sub, Matrix.mul_assoc] + module + +/-! + +## E. The adjoint action on the colour carrier + +-/ + +lemma adjointAction_mem_ColourSpace (u : specialUnitaryGroup (Fin 3) ℂ) + {A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)} (hA : A ∈ ColourSpace) : + Gluon.adjointAction u A ∈ ColourSpace := by + have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 + rwa [star_eq_conjTranspose] at h + rw [mem_ColourSpace, Gluon.adjointAction_apply_coe, trace_mul_cycle, hu, Matrix.one_mul] + exact hA + +/-- The adjoint action of a constant colour rotation on the traceless hermitian carrier. -/ +noncomputable def adC (u : specialUnitaryGroup (Fin 3) ℂ) : ColourSpace →ₗ[ℝ] ColourSpace := + LinearMap.restrict (Gluon.adjointAction u) (fun _ hX => adjointAction_mem_ColourSpace u hX) + +@[simp] +lemma cmat_adC (u : specialUnitaryGroup (Fin 3) ℂ) (X : ColourSpace) : + cmat (adC u X) = (u : Matrix (Fin 3) (Fin 3) ℂ) * cmat X * + ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := rfl + +@[simp] +lemma adC_one (X : ColourSpace) : adC 1 X = X := by + apply cmat_injective + rw [cmat_adC] + show (1 : Matrix (Fin 3) (Fin 3) ℂ) * cmat X * (1 : Matrix (Fin 3) (Fin 3) ℂ)ᴴ = cmat X + rw [Matrix.conjTranspose_one, Matrix.one_mul, Matrix.mul_one] + +/-- The adjoint action is a homomorphism for the colour bracket. -/ +lemma br_adC (u : specialUnitaryGroup (Fin 3) ℂ) (X Y : ColourSpace) : + br (adC u X) (adC u Y) = adC u (br X Y) := by + apply cmat_injective + have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 + rwa [star_eq_conjTranspose] at h + rw [cmat_br, cmat_adC, cmat_adC, cmat_adC, cmat_br, brMat, brMat] + simp only [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_sub, Matrix.sub_mul, Matrix.mul_assoc] + rw [show ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * ((u : Matrix (Fin 3) (Fin 3) ℂ) * + (cmat Y * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ)) = + cmat Y * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ by + rw [← Matrix.mul_assoc, hu, Matrix.one_mul]] + rw [show ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * ((u : Matrix (Fin 3) (Fin 3) ℂ) * + (cmat X * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ)) = + cmat X * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ by + rw [← Matrix.mul_assoc, hu, Matrix.one_mul]] + +/-- The matrix of the adjoint action in the colour basis. -/ +noncomputable def adCoef (u : specialUnitaryGroup (Fin 3) ℂ) (c c' : Col) : ℝ := + coordC c (adC u (colourBasis c')) + +lemma adCoef_one (c c' : Col) : adCoef 1 c c' = if c = c' then 1 else 0 := by + rw [adCoef, adC_one, coordC_apply] + by_cases h : c = c' + · subst h + simp + · rw [if_neg h, Basis.repr_self_apply, if_neg fun hc => h hc.symm] + +lemma coordC_adC (u : specialUnitaryGroup (Fin 3) ℂ) (X : ColourSpace) (c : Col) : + coordC c (adC u X) = ∑ c', adCoef u c c' * coordC c' X := by + conv_lhs => rw [← colourBasis.sum_repr X] + simp only [map_sum, map_smul, smul_eq_mul, coordC_apply, adCoef] + exact Finset.sum_congr rfl fun c' _ => by ring + +/-! + +## F. The substitution on the polynomial algebra + +-/ + +section Poly + +variable {ι σ τ : Type*} + +/-- The adjoint action on a colour vector of polynomials. -/ +noncomputable def adP (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial ι ℝ) : + Col → MvPolynomial ι ℝ := + fun c => ∑ c', C (adCoef u c c') * p c' + +/-- A constant colour vector of polynomials. -/ +noncomputable def constP (Y : ColourSpace) : Col → MvPolynomial ι ℝ := fun c => C (coordC c Y) + +lemma adP_one (p : Col → MvPolynomial ι ℝ) (c : Col) : adP 1 p c = p c := by + rw [adP] + have h : ∀ c' : Col, (C (adCoef 1 c c') : MvPolynomial ι ℝ) * p c' = + if c = c' then p c' else 0 := by + intro c' + rw [adCoef_one] + by_cases hc : c = c' <;> simp [hc] + rw [Finset.sum_congr rfl fun c' (_ : c' ∈ Finset.univ) => h c'] + simp + +@[simp] +lemma constP_zero : constP (0 : ColourSpace) = (fun _ => 0 : Col → MvPolynomial ι ℝ) := by + funext c + rw [constP, map_zero, map_zero] + +lemma brP_zero_left (q : Col → MvPolynomial ι ℝ) (c : Col) : + brP (fun _ => 0) q c = 0 := by + rw [brP] + exact Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by simp + +lemma eval_adP (x : ι → ℝ) (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial ι ℝ) + (c : Col) : + eval x (adP u p c) = coordC c (adC u (mkC fun a => eval x (p a))) := by + rw [coordC_adC] + simp only [coordC_mkC] + rw [adP, map_sum] + exact Finset.sum_congr rfl fun c' _ => by rw [map_mul, eval_C] + +@[simp] +lemma eval_constP (x : ι → ℝ) (Y : ColourSpace) (c : Col) : + eval x (constP Y c : MvPolynomial ι ℝ) = coordC c Y := eval_C _ + +lemma mkC_eval_constP (x : ι → ℝ) (Y : ColourSpace) : + (mkC fun a => eval x (constP Y a : MvPolynomial ι ℝ)) = Y := by + rw [show (fun a => eval x (constP Y a : MvPolynomial ι ℝ)) = fun a => coordC a Y from + funext fun a => eval_constP x Y a] + exact mkC_coordC Y + +lemma algHom_adP (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) + (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial σ ℝ) (c : Col) : + φ (adP u p c) = adP u (fun a => φ (p a)) c := by + rw [adP, adP, map_sum] + refine Finset.sum_congr rfl fun c' _ => ?_ + rw [map_mul, ← algebraMap_eq, AlgHom.commutes, algebraMap_eq] + +lemma algHom_constP (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) (Y : ColourSpace) (c : Col) : + φ (constP Y c) = constP Y c := by + show φ (C (coordC c Y)) = C (coordC c Y) + rw [← algebraMap_eq, AlgHom.commutes, algebraMap_eq] + +end Poly + +/-- The derivative colour vector in ordinary coordinates. -/ +noncomputable def derOld (ν μ : Lor) : Col → A₁ := fun c => X (Coord.der ν μ c) + +/-- **The gauge substitution**: the coordinate transcription of `jetValue_actPot` and + `jetDeriv_actPot`. -/ +noncomputable def gaugeSubst : Coord → A₁ + | Coord.conn μ c => + adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ) c + constP (mcC U μ) c + | Coord.der ν μ c => + adP (JetGaugeGroupI.evalSU (Fin 3) U) (derOld ν μ) c - + brP (constP (mcC U ν)) (adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ)) c + + constP (mc2C U ν μ) c + +/-- The pullback of the local gauge action to the first-order gluon jet algebra. -/ +noncomputable def gaugeAct : A₁ →ₐ[ℝ] A₁ := aeval (gaugeSubst U) + +@[simp] +lemma gaugeAct_conn (μ : Lor) (c : Col) : + gaugeAct U (X (Coord.conn μ c)) = + adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ) c + constP (mcC U μ) c := aeval_X _ _ + +@[simp] +lemma gaugeAct_der (ν μ : Lor) (c : Col) : + gaugeAct U (X (Coord.der ν μ c)) = + adP (JetGaugeGroupI.evalSU (Fin 3) U) (derOld ν μ) c - + brP (constP (mcC U ν)) (adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ)) c + + constP (mc2C U ν μ) c := aeval_X _ _ + +/-! + +## G. Points of the coordinate space + +Polynomial identities are proved by evaluating at every point, which turns them into identities in +the colour carrier. `MvPolynomial.funext` applies because `ℝ` is an infinite integral domain. + +-/ + +/-- The connection of the configuration described by a point of the coordinate space. -/ +noncomputable def cfgA (x : Coord → ℝ) (μ : Lor) : ColourSpace := mkC fun c => x (Coord.conn μ c) + +/-- The connection derivative of the configuration described by a point. -/ +noncomputable def cfgD (x : Coord → ℝ) (ν μ : Lor) : ColourSpace := + mkC fun c => x (Coord.der ν μ c) + +/-- The field strength of the configuration described by a point. -/ +noncomputable def curvC (x : Coord → ℝ) (ν μ : Lor) : ColourSpace := + cfgD x ν μ - cfgD x μ ν + br (cfgA x ν) (cfgA x μ) + +/-- The transformed connection. -/ +noncomputable def actA (x : Coord → ℝ) (μ : Lor) : ColourSpace := + adC (JetGaugeGroupI.evalSU (Fin 3) U) (cfgA x μ) + mcC U μ + +/-- The transformed connection derivative. -/ +noncomputable def actD (x : Coord → ℝ) (ν μ : Lor) : ColourSpace := + adC (JetGaugeGroupI.evalSU (Fin 3) U) (cfgD x ν μ) - + br (mcC U ν) (adC (JetGaugeGroupI.evalSU (Fin 3) U) (cfgA x μ)) + mc2C U ν μ + +/-- The transformed point of the coordinate space. -/ +noncomputable def actPt (x : Coord → ℝ) : Coord → ℝ + | Coord.conn μ c => coordC c (actA U x μ) + | Coord.der ν μ c => coordC c (actD U x ν μ) + +lemma mkC_eval_connOld (x : Coord → ℝ) (μ : Lor) : + (mkC fun a => eval x (connOld μ a)) = cfgA x μ := by + rw [cfgA] + congr 1 + funext a + exact eval_X _ + +lemma mkC_eval_derOld (x : Coord → ℝ) (ν μ : Lor) : + (mkC fun a => eval x (derOld ν μ a)) = cfgD x ν μ := by + rw [cfgD] + congr 1 + funext a + exact eval_X _ + +lemma mkC_eval_adP_connOld (x : Coord → ℝ) (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : + (mkC fun b => eval x (adP u (connOld μ) b)) = adC u (cfgA x μ) := by + rw [show (fun b => eval x (adP u (connOld μ) b)) = fun b => coordC b (adC u (cfgA x μ)) from + funext fun b => by rw [eval_adP, mkC_eval_connOld]] + exact mkC_coordC _ + +lemma eval_gaugeSubst (x : Coord → ℝ) (i : Coord) : + eval x (gaugeSubst U i) = actPt U x i := by + cases i with + | conn μ c => + rw [gaugeSubst, map_add, eval_adP, eval_constP, mkC_eval_connOld, actPt, actA, map_add] + | der ν μ c => + rw [gaugeSubst, map_add, map_sub, eval_adP, eval_constP, eval_brP, mkC_eval_derOld, + mkC_eval_constP, mkC_eval_adP_connOld, actPt, actD, map_add, map_sub] + +lemma eval_gaugeAct (x : Coord → ℝ) (P : A₁) : + eval x (gaugeAct U P) = eval (actPt U x) P := by + have h : (fun i => eval x (gaugeSubst U i)) = actPt U x := + funext fun i => eval_gaugeSubst U x i + rw [gaugeAct, MvPolynomial.eval_aeval, h] + +@[simp] +lemma cfgA_actPt (x : Coord → ℝ) (μ : Lor) : cfgA (actPt U x) μ = actA U x μ := mkC_coordC _ + +@[simp] +lemma cfgD_actPt (x : Coord → ℝ) (ν μ : Lor) : cfgD (actPt U x) ν μ = actD U x ν μ := + mkC_coordC _ + +lemma eval_curvPoly (x : Coord → ℝ) (ν μ : Lor) (c : Col) : + eval x (curvPoly ν μ c) = coordC c (curvC x ν μ) := by + simp only [curvPoly, curvC, cfgD, map_add, map_sub, eval_X, coordC_mkC] + rw [eval_brP, mkC_eval_connOld, mkC_eval_connOld] + +/-! + +## H. Covariance of the field strength + +-/ + +private lemma curv_shift (Av Am Dvm Dmv mv mm tvm tmv : ColourSpace) + (ht : tvm - tmv = -br mv mm) : + (Dvm - br mv Am + tvm) - (Dmv - br mm Av + tmv) + br (Av + mv) (Am + mm) + = Dvm - Dmv + br Av Am := by + have h1 : br (Av + mv) (Am + mm) = br Av Am + br Av mm + br mv Am + br mv mm := by + rw [show br (Av + mv) = br Av + br mv from map_add br Av mv, LinearMap.add_apply, + map_add, map_add] + abel + have h2 : br Av mm = -br mm Av := br_swap Av mm + have ht' : tvm = tmv - br mv mm := by + rw [sub_eq_iff_eq_add.mp ht] + abel + rw [h1, h2, ht'] + abel + +/-- **Covariance of the field strength.** Under any gauge jet the field strength of the + transformed configuration is the conjugate, by the base-point value of the jet, of the field + strength of the original configuration. -/ +lemma curvC_actPt (x : Coord → ℝ) (ν μ : Lor) : + curvC (actPt U x) ν μ = adC (JetGaugeGroupI.evalSU (Fin 3) U) (curvC x ν μ) := by + rw [curvC, cfgA_actPt, cfgA_actPt, cfgD_actPt, cfgD_actPt, actA, actA, actD, actD, + curv_shift _ _ _ _ _ _ _ _ (mc2C_sub U ν μ), curvC, map_add, map_sub, br_adC] + +/-- **Covariance of the field strength, in coordinates.** This is the transformation law the + completeness theorem consumes: the curvature generators span a subspace on which the whole jet + gauge group acts through its evaluation at the base point. -/ +lemma gaugeAct_curvPoly (ν μ : Lor) (c : Col) : + gaugeAct U (curvPoly ν μ c) = + ∑ c', C (adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c') * curvPoly ν μ c' := by + refine MvPolynomial.funext fun x => ?_ + rw [eval_gaugeAct, eval_curvPoly, curvC_actPt, coordC_adC, map_sum] + exact Finset.sum_congr rfl fun c' _ => by rw [map_mul, eval_C, eval_curvPoly] + +/-! + +## I. Constant jets + +-/ + +lemma pderiv_C_jet (ν : Lor) (a : ℂ) : + MvPowerSeries.pderiv ℂ ν (MvPowerSeries.C a : JetRing) = 0 := by + ext k + have hne : k + Finsupp.single ν 1 ≠ 0 := by + intro h + have h' := DFunLike.congr_fun h ν + rw [Finsupp.add_apply, Finsupp.single_eq_same] at h' + simp at h' + rw [MvPowerSeries.coeff_pderiv, MvPowerSeries.coeff_C, if_neg hne, zero_mul, map_zero] + +lemma dMat_map_C (ν : Lor) (M : Matrix (Fin 3) (Fin 3) ℂ) : + dMat ν (M.map (MvPowerSeries.C : ℂ →+* JetRing)) = 0 := + Matrix.ext fun i j => pderiv_C_jet ν (M i j) + +lemma jetValue_map_C (M : Matrix (Fin 3) (Fin 3) ℂ) : + Gluon.jetValue (M.map (MvPowerSeries.C : ℂ →+* JetRing)) = M := by + refine Matrix.ext fun i j => ?_ + show MvPowerSeries.constantCoeff (MvPowerSeries.C (M i j) : JetRing) = M i j + simp + +@[simp] +lemma jetDeriv_zero (ν : Lor) : + Gluon.jetDeriv ν (0 : Matrix (Fin 3) (Fin 3) JetRing) = 0 := by + refine Matrix.ext fun i j => ?_ + show MvPowerSeries.coeff (Finsupp.single ν 1) (0 : JetRing) = 0 + exact map_zero _ + +lemma ofConstantSU_coe (u : specialUnitaryGroup (Fin 3) ℂ) : + ((JetGaugeGroupI.ofConstantSU (Fin 3) u : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) = + (u : Matrix (Fin 3) (Fin 3) ℂ).map (MvPowerSeries.C : ℂ →+* JetRing) := rfl + +lemma mcP_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : + mcP (JetGaugeGroupI.ofConstantSU (Fin 3) u) μ = 0 := by + rw [mcP, ofConstantSU_coe, dMat_map_C, Matrix.zero_mul] + +lemma mcC_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : + mcC (JetGaugeGroupI.ofConstantSU (Fin 3) u) μ = 0 := + Subtype.ext (SU3Jet.mcCoeff_ofConstantSU u μ) + +lemma mc2C_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (ν μ : Lor) : + mc2C (JetGaugeGroupI.ofConstantSU (Fin 3) u) ν μ = 0 := by + apply cmat_injective + show mc2M _ ν μ = cmat 0 + rw [mc2M, mcP_ofConstantSU, jetDeriv_zero, smul_zero, cmat_zero] + +/-! + +## J. Jets based to order one + +-/ + +lemma jetValue_eq_one (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) : Gluon.jetValue U.1 = 1 := by + rw [← Gluon.evalSU_coe, hU] + rfl + +lemma mcMatrix_eq_zero (hm : ∀ ρ, mcC U ρ = 0) (ν : Lor) : Gluon.mcMatrix ν U.1 = 0 := by + have h := congrArg cmat (hm ν) + rwa [cmat_mcC, cmat_zero] at h + +lemma jetDeriv_eq_zero (hm : ∀ ρ, mcC U ρ = 0) (ν : Lor) : Gluon.jetDeriv ν U.1 = 0 := by + rw [jetDeriv_coe, mcMatrix_eq_zero U hm, Matrix.zero_mul, smul_zero] + +/-- On a jet based to order one the second Maurer–Cartan coefficient is just the second Taylor + coefficient of the jet: no lower-order corrections survive. -/ +lemma mc2M_of_based_one (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (hm : ∀ ρ, mcC U ρ = 0) + (ν μ : Lor) : mc2M U ν μ = Complex.I • Gluon.jetDeriv ν (dMat μ U.1) := by + have h1 : Gluon.jetValue U.1 = 1 := jetValue_eq_one U hU + have h2 : Gluon.jetValue (dMat μ U.1) = 0 := by + rw [jetValue_dMat] + exact jetDeriv_eq_zero U hm μ + rw [mc2M, mcP, Gluon.jetDeriv_mul, Gluon.jetValue_star, h1, star_one, Matrix.mul_one, h2, + Matrix.zero_mul, add_zero] + +lemma jetDeriv_dMat_eq (ν μ : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : + Gluon.jetDeriv ν (dMat μ M) = + ((((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℂ) + 1) • + coeffMat (Finsupp.single ν 1 + Finsupp.single μ 1) M := by + refine Matrix.ext fun i j => ?_ + show MvPowerSeries.coeff (Finsupp.single ν 1) (MvPowerSeries.pderiv ℂ μ (M i j)) = + ((((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℂ) + 1) * + MvPowerSeries.coeff (Finsupp.single ν 1 + Finsupp.single μ 1) (M i j) + rw [MvPowerSeries.coeff_pderiv] + ring + +/-! + +### J.1. Conjugation by a constant colour rotation + +-/ + +lemma coe_inv_su3 (v : specialUnitaryGroup (Fin 3) ℂ) : + ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = + ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by + have h1 : ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (v : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp v.2).1 + rwa [star_eq_conjTranspose] at h + have h2 : (v : Matrix (Fin 3) (Fin 3) ℂ) * + ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + have h : ((v * v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + rw [mul_inv_cancel] + rfl + rw [← h] + rfl + calc ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) + = 1 * ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) := by + rw [Matrix.one_mul] + _ = ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (v : Matrix (Fin 3) (Fin 3) ℂ) * + ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) := by rw [h1] + _ = ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * ((v : Matrix (Fin 3) (Fin 3) ℂ) * + ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ)) := by + rw [Matrix.mul_assoc] + _ = ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by rw [h2, Matrix.mul_one] + +/-- A based gauge jet conjugated by a constant colour rotation. -/ +noncomputable def conjBy (v : specialUnitaryGroup (Fin 3) ℂ) + (V : specialUnitaryGroup (Fin 3) JetRing) : specialUnitaryGroup (Fin 3) JetRing := + JetGaugeGroupI.ofConstantSU (Fin 3) v * V * (JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ + +lemma coe_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) (V : specialUnitaryGroup (Fin 3) JetRing) : + ((conjBy v V : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) = + (v : Matrix (Fin 3) (Fin 3) ℂ).map (MvPowerSeries.C : ℂ →+* JetRing) * V.1 * + ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ.map (MvPowerSeries.C : ℂ →+* JetRing) := by + rw [conjBy, show ((JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ : + specialUnitaryGroup (Fin 3) JetRing) = JetGaugeGroupI.ofConstantSU (Fin 3) v⁻¹ from + (map_inv _ v).symm, ← coe_inv_su3 v] + rfl + +lemma evalSU_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) + {V : specialUnitaryGroup (Fin 3) JetRing} (hV : JetGaugeGroupI.evalSU (Fin 3) V = 1) : + JetGaugeGroupI.evalSU (Fin 3) (conjBy v V) = 1 := by + rw [conjBy, map_mul, map_mul, map_inv, SU3Jet.evalSU_ofConstantSU, hV, mul_one, mul_inv_cancel] + +lemma mcCoeff_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) + (V : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) : + Gluon.mcCoeff (conjBy v V) ρ = Gluon.adjointAction v (Gluon.mcCoeff V ρ) := by + have hinv : (JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ = + JetGaugeGroupI.ofConstantSU (Fin 3) v⁻¹ := (map_inv _ v).symm + simp only [conjBy, hinv, Gluon.mcCoeff_mul, SU3Jet.mcCoeff_ofConstantSU, zero_add, + SU3Jet.evalSU_ofConstantSU, map_zero, add_zero] + +lemma mcC_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) {V : specialUnitaryGroup (Fin 3) JetRing} + (hm : ∀ ρ, mcC V ρ = 0) (ρ : Lor) : mcC (conjBy v V) ρ = 0 := by + apply Subtype.ext + show Gluon.mcCoeff (conjBy v V) ρ = 0 + rw [mcCoeff_conjBy, show Gluon.mcCoeff V ρ = 0 from congrArg Subtype.val (hm ρ), map_zero] + +lemma dMat_conj_const (P R : Matrix (Fin 3) (Fin 3) ℂ) (M : Matrix (Fin 3) (Fin 3) JetRing) + (μ : Lor) : + dMat μ (P.map (MvPowerSeries.C : ℂ →+* JetRing) * M * + R.map (MvPowerSeries.C : ℂ →+* JetRing)) = + P.map (MvPowerSeries.C : ℂ →+* JetRing) * dMat μ M * + R.map (MvPowerSeries.C : ℂ →+* JetRing) := by + rw [dMat_mul, dMat_mul, dMat_map_C, dMat_map_C] + simp + +lemma jetDeriv_conj_const (P R : Matrix (Fin 3) (Fin 3) ℂ) (M : Matrix (Fin 3) (Fin 3) JetRing) + (ν : Lor) : + Gluon.jetDeriv ν (P.map (MvPowerSeries.C : ℂ →+* JetRing) * M * + R.map (MvPowerSeries.C : ℂ →+* JetRing)) = P * Gluon.jetDeriv ν M * R := by + rw [Gluon.jetDeriv_mul, Gluon.jetDeriv_mul, Gluon.jetDeriv_map_C, Gluon.jetDeriv_map_C, + jetValue_map_C, jetValue_map_C] + simp + +/-- Conjugating a based gauge jet by a constant colour rotation conjugates its second + Maurer–Cartan coefficient. -/ +lemma mc2C_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) {V : specialUnitaryGroup (Fin 3) JetRing} + (hV : JetGaugeGroupI.evalSU (Fin 3) V = 1) (hm : ∀ ρ, mcC V ρ = 0) (ν μ : Lor) : + mc2C (conjBy v V) ν μ = adC v (mc2C V ν μ) := by + apply cmat_injective + rw [cmat_adC, cmat_mc2C, cmat_mc2C, + mc2M_of_based_one _ (evalSU_conjBy v hV) (mcC_conjBy v hm), + mc2M_of_based_one _ hV hm, coe_conjBy, dMat_conj_const, jetDeriv_conj_const] + simp only [Matrix.smul_mul, Matrix.mul_smul] + +/-! + +## K. The order-two diagonal jet + +-/ + +/-- The total degree of a spacetime multi-index. -/ +noncomputable def lorDeg (k : Lor →₀ ℕ) : ℕ := ∑ i, k i + +lemma lorDeg_add (k l : Lor →₀ ℕ) : lorDeg (k + l) = lorDeg k + lorDeg l := by + rw [lorDeg, lorDeg, lorDeg, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun i _ => rfl + +lemma lorDeg_nsmul (n : ℕ) (k : Lor →₀ ℕ) : lorDeg (n • k) = n * lorDeg k := by + rw [lorDeg, lorDeg, Finset.mul_sum] + exact Finset.sum_congr rfl fun i _ => by simp + +lemma lorDeg_single (ν : Lor) : lorDeg (Finsupp.single ν 1) = 1 := by + classical + rw [lorDeg] + simp [Finsupp.single_apply] + +lemma single_ne_nsmul_two {ν μ ν₀ μ₀ : Lor} + (hk : (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) ≠ + Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (n : ℕ) : + (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) ≠ + n • (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) := by + intro h + have hdeg := congrArg lorDeg h + rw [lorDeg_add, lorDeg_single, lorDeg_single, lorDeg_nsmul, lorDeg_add, lorDeg_single, + lorDeg_single] at hdeg + have hn : n = 1 := by omega + rw [hn, one_smul] at h + exact hk h + +/-- Two degree-two spacetime exponents agree exactly when the unordered pairs agree. -/ +lemma single_add_single_inj {ν μ ν' μ' : Lor} + (h : (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) = + Finsupp.single ν' 1 + Finsupp.single μ' 1) : s(ν, μ) = s(ν', μ') := by + have hm : ({ν, μ} : Multiset Lor) = {ν', μ'} := by + have hc := congrArg Finsupp.toMultiset h + simpa [Finsupp.toMultiset_single] using hc + rcases Multiset.cons_eq_cons.mp hm with ⟨h1, h2⟩ | ⟨_, cs, h2, h3⟩ + · rw [Sym2.eq_iff] + exact Or.inl ⟨h1, Multiset.singleton_inj.mp h2⟩ + · have hcs : cs = 0 := by + have hcard := congrArg Multiset.card h2 + simp at hcard + omega + subst hcs + rw [Sym2.eq_iff] + refine Or.inr ⟨?_, ?_⟩ + · exact (Multiset.singleton_inj.mp (by simpa using h3)).symm + · exact Multiset.singleton_inj.mp (by simpa using h2) + +lemma sym2_eq_iff_exp {ν μ ν₀ μ₀ : Lor} : + s(ν, μ) = s(ν₀, μ₀) ↔ + (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) = + Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1 := by + refine ⟨fun h => ?_, single_add_single_inj⟩ + rcases Sym2.eq_iff.mp h with ⟨h1, h2⟩ | ⟨h1, h2⟩ + · rw [h1, h2] + · rw [h1, h2, add_comm] + +/-- The multiplicity factor of a symmetric pair: `2` on the diagonal, `1` off it. -/ +noncomputable def dfac (ν μ : Lor) : ℝ := (((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℝ) + 1 + +lemma dfac_ne_zero (ν μ : Lor) : dfac ν μ ≠ 0 := by + have h : (0 : ℝ) < dfac ν μ := by rw [dfac]; positivity + exact ne_of_gt h + +lemma dfac_symm (ν μ : Lor) : dfac ν μ = dfac μ ν := by + classical + rw [dfac, dfac, Finsupp.single_apply, Finsupp.single_apply] + by_cases h : ν = μ + · rw [if_pos h, if_pos h.symm] + · rw [if_neg h, if_neg fun hc => h hc.symm] + +/-- The `DiagonalJet` colour direction `diag(1, -1, 0)` as an element of the colour carrier. -/ +noncomputable def colourC : ColourSpace := ⟨colourH, trace_colourMat⟩ + +@[simp] +lemma cmat_colourC : cmat colourC = colourMat := rfl + +/-- **The order-two translation realized by the `DiagonalJet` diagonal jet.** For a degree-two + spacetime + exponent the diagonal jet is based to order one, and it translates exactly the symmetric + derivative coordinates belonging to the unordered pair `{ν₀, μ₀}`. -/ +lemma mc2C_diagSU_two (a : ℝ) (ν₀ μ₀ ν μ : Lor) : + mc2C (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀)) ν μ = + if s(ν, μ) = s(ν₀, μ₀) then (dfac ν₀ μ₀ * a) • colourC else 0 := by + classical + have hbased : JetGaugeGroupI.evalSU (Fin 3) + (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀)) = 1 := + evalSU_diagSU a _ _ + have hm : ∀ ρ, mcC (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) + (add_single_ne_zero ν₀ μ₀)) ρ = 0 := fun ρ => Subtype.ext (mcCoeff_diagSU_two a ν₀ μ₀ ρ) + apply cmat_injective + rw [cmat_mc2C, mc2M_of_based_one _ hbased hm, jetDeriv_dMat_eq] + by_cases hk : s(ν, μ) = s(ν₀, μ₀) + · have hexp := sym2_eq_iff_exp.mp hk + have hfac : dfac ν μ = dfac ν₀ μ₀ := by + rcases Sym2.eq_iff.mp hk with ⟨h1, h2⟩ | ⟨h1, h2⟩ + · rw [h1, h2] + · rw [h1, h2, dfac_symm] + rw [if_pos hk] + show _ = ((dfac ν₀ μ₀ * a : ℝ) : ℂ) • colourMat + rw [show (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) + (add_single_ne_zero ν₀ μ₀) : Matrix (Fin 3) (Fin 3) JetRing) = + diagMat a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀) from rfl, + hexp, coeffMat_diagMat_self, smul_smul, smul_smul, ← hfac, dfac] + congr 1 + push_cast + linear_combination (-((((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℂ) + 1) * (a : ℂ)) * + Complex.I_mul_I + · rw [if_neg hk] + have hexp : (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) ≠ + Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1 := fun hc => hk (single_add_single_inj hc) + rw [show (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) + (add_single_ne_zero ν₀ μ₀) : Matrix (Fin 3) (Fin 3) JetRing) = + diagMat a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀) from rfl, + coeffMat_diagMat_eq_zero a _ (add_single_ne_zero ν₀ μ₀) (add_single_ne_zero ν μ) + (single_ne_nsmul_two hexp), smul_zero, smul_zero, cmat_zero] + +/-! + +## L. Realizability of the two translations + +-/ + +lemma adC_colourC (k : Col) : adC (colourConj k) colourC = colourBasis k := + Subtype.ext (colourBasis_eq_adjointAction k) + +/-- **Order-two realizability.** For every unordered pair of spacetime directions, every colour + basis direction and every real number there is a gauge jet, based to order one, which translates + exactly the corresponding symmetric derivative coordinate. -/ +lemma exists_based_two (s : Sym2 Lor) (c₀ : Col) (r : ℝ) : + ∃ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 ∧ (∀ ρ, mcC U ρ = 0) ∧ + ∀ ν μ, mc2C U ν μ = if s(ν, μ) = s then r • colourBasis c₀ else 0 := by + classical + induction s using Sym2.ind with + | _ ν₀ μ₀ => + refine ⟨conjBy (colourConj c₀) (diagSU (r / dfac ν₀ μ₀) + (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀)), ?_, ?_, ?_⟩ + · exact evalSU_conjBy _ (evalSU_diagSU _ _ _) + · exact mcC_conjBy _ fun ρ => Subtype.ext (mcCoeff_diagSU_two _ ν₀ μ₀ ρ) + · intro ν μ + rw [mc2C_conjBy _ (evalSU_diagSU _ _ _) + (fun ρ => Subtype.ext (mcCoeff_diagSU_two _ ν₀ μ₀ ρ)), mc2C_diagSU_two] + by_cases hk : s(ν, μ) = s(ν₀, μ₀) + · rw [if_pos hk, if_pos hk, map_smul, adC_colourC, + mul_div_cancel₀ r (dfac_ne_zero ν₀ μ₀)] + · rw [if_neg hk, if_neg hk, map_zero] + +/-! + +## M. Faithfulness of the substitution + +`gaugeSubst` was written to match `jetValue_actPot` and `jetDeriv_actPot`. This section closes the +loop rather than leaving the match to inspection: for a potential whose base-point value and first +Taylor coefficients are traceless hermitian in every direction — the physical colour carrier — +reading off the coordinates and then substituting is the same as acting and then reading off the +coordinates. + +-/ + +/-- A potential is a *colour potential* when its base-point value and its first Taylor coefficients + are traceless hermitian in every spacetime direction. -/ +structure IsColourPot (A : Potential) : Prop where + /-- The base-point value is hermitian. -/ + star_val : ∀ μ, star (Gluon.jetValue (A μ)) = Gluon.jetValue (A μ) + /-- The base-point value is traceless. -/ + trace_val : ∀ μ, trace (Gluon.jetValue (A μ)) = 0 + /-- The first Taylor coefficients are hermitian. -/ + star_der : ∀ ν μ, star (Gluon.jetDeriv ν (A μ)) = Gluon.jetDeriv ν (A μ) + /-- The first Taylor coefficients are traceless. -/ + trace_der : ∀ ν μ, trace (Gluon.jetDeriv ν (A μ)) = 0 + +/-- The point of the coordinate space described by a colour potential. -/ +noncomputable def potCoord {A : Potential} (h : IsColourPot A) : Coord → ℝ + | Coord.conn μ c => coordC c (mkCM (Gluon.jetValue (A μ)) (h.star_val μ) (h.trace_val μ)) + | Coord.der ν μ c => + coordC c (mkCM (Gluon.jetDeriv ν (A μ)) (h.star_der ν μ) (h.trace_der ν μ)) + +lemma cfgA_potCoord {A : Potential} (h : IsColourPot A) (μ : Lor) : + cfgA (potCoord h) μ = mkCM (Gluon.jetValue (A μ)) (h.star_val μ) (h.trace_val μ) := + mkC_coordC _ + +lemma cfgD_potCoord {A : Potential} (h : IsColourPot A) (ν μ : Lor) : + cfgD (potCoord h) ν μ = mkCM (Gluon.jetDeriv ν (A μ)) (h.star_der ν μ) (h.trace_der ν μ) := + mkC_coordC _ + +private lemma star_conj_u (u : specialUnitaryGroup (Fin 3) ℂ) {M : Matrix (Fin 3) (Fin 3) ℂ} + (hM : star M = M) : + star ((u : Matrix (Fin 3) (Fin 3) ℂ) * M * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) = + (u : Matrix (Fin 3) (Fin 3) ℂ) * M * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by + have h1 : star ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ = (u : Matrix (Fin 3) (Fin 3) ℂ) := by + rw [star_eq_conjTranspose, Matrix.conjTranspose_conjTranspose] + have h2 : star (u : Matrix (Fin 3) (Fin 3) ℂ) = ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := + star_eq_conjTranspose _ + rw [star_mul, star_mul, h1, h2, hM, Matrix.mul_assoc] + +private lemma trace_conj_u (u : specialUnitaryGroup (Fin 3) ℂ) (M : Matrix (Fin 3) (Fin 3) ℂ) : + trace ((u : Matrix (Fin 3) (Fin 3) ℂ) * M * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) = trace M := by + have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 + rwa [star_eq_conjTranspose] at h + rw [trace_mul_cycle, hu, Matrix.one_mul] + +lemma jetValue_coe_eq (U : specialUnitaryGroup (Fin 3) JetRing) : + Gluon.jetValue U.1 = + ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) := (Gluon.evalSU_coe U).symm + +/-- The local gauge action preserves the physical colour carrier: this is where tracelessness of + the Maurer–Cartan series is used. -/ +lemma isColourPot_actPot {A : Potential} (h : IsColourPot A) + (U : specialUnitaryGroup (Fin 3) JetRing) : IsColourPot (actPot U A) := by + set u := JetGaugeGroupI.evalSU (Fin 3) U with hu + have hcoe : Gluon.jetValue U.1 = ((u : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) := jetValue_coe_eq U + have hstar : star ((u : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = + ((u : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ)ᴴ := + star_eq_conjTranspose _ + have hm : ∀ ν, star (Gluon.mcMatrix ν U.1) = Gluon.mcMatrix ν U.1 := fun ν => + selfAdjoint.mem_iff.mp (Gluon.mcMatrix_mem_selfAdjoint (Gluon.coe_mul_star_self U) ν) + have hmt : ∀ ν, trace (Gluon.mcMatrix ν U.1) = 0 := fun ν => (mcC U ν).2 + refine ⟨fun μ => ?_, fun μ => ?_, fun ν μ => ?_, fun ν μ => ?_⟩ + · rw [jetValue_actPot, star_add, hm, hcoe, hstar, star_conj_u u (h.star_val μ)] + · rw [jetValue_actPot, trace_add, hcoe, hstar, trace_conj_u, h.trace_val, hmt, add_zero] + · rw [jetDeriv_actPot, star_add, star_sub, star_mc2M, hcoe, hstar, + star_conj_u u (h.star_der ν μ), brMat_star (hm ν) (star_conj_u u (h.star_val μ))] + · rw [jetDeriv_actPot, trace_add, trace_sub, trace_mc2M, hcoe, hstar, trace_conj_u, + h.trace_der, brMat_trace, sub_zero, add_zero] + +/-- **The substitution really is the coordinate form of the action.** Acting on a colour potential + and then reading off its coordinates is the same as reading off its coordinates and then applying + the transformed-point map that `gaugeSubst` evaluates to. -/ +lemma potCoord_actPot {A : Potential} (h : IsColourPot A) + (U : specialUnitaryGroup (Fin 3) JetRing) : + potCoord (isColourPot_actPot h U) = actPt U (potCoord h) := by + have hcoe : Gluon.jetValue U.1 = + ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) := jetValue_coe_eq U + have hstar : star ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) = + ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ)ᴴ := star_eq_conjTranspose _ + funext i + cases i with + | conn μ c => + show coordC c (mkCM (Gluon.jetValue (actPot U A μ)) _ _) = coordC c (actA U (potCoord h) μ) + congr 1 + apply cmat_injective + rw [cmat_mkCM, jetValue_actPot, actA, cmat_add, cmat_adC, cfgA_potCoord, cmat_mkCM, + cmat_mcC, hcoe, hstar] + | der ν μ c => + show coordC c (mkCM (Gluon.jetDeriv ν (actPot U A μ)) _ _) = + coordC c (actD U (potCoord h) ν μ) + congr 1 + apply cmat_injective + rw [cmat_mkCM, jetDeriv_actPot, actD, cmat_add, cmat_sub, cmat_adC, cmat_br, cmat_adC, + cfgD_potCoord, cfgA_potCoord, cmat_mkCM, cmat_mkCM, cmat_mcC, cmat_mc2C, hcoe, hstar] + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean new file mode 100644 index 000000000..55a6d63b5 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean @@ -0,0 +1,451 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.CovariantTower +/-! +# Arbitrary-order highest-layer translations + +## i. Overview + +This file proves the programme-level highest-layer statement on `OrdinaryJets`'s ordinary +carrier. A gauge jet based through order `r` fixes every ordinary generator below order `r` and +acts on order `r` by a constant translation. The translation depends only on the total +multi-index obtained by adjoining the connection index, so it is totally symmetric in all +`r + 1` indices. + +The factorial convention is essential: `facI_add_single` turns the derivative multiplicity in +`dMat` into the factorial of the total multi-index. No hook coordinate or symmetric projection is +introduced here. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. Jets based through a finite order + +-/ + +/-- A gauge jet based through order `r`: its value is the identity and every positive Taylor +coefficient of total degree at most `r` vanishes. -/ +def BasedTo (r : ℕ) (U : specialUnitaryGroup (Fin 3) JetRing) : Prop := + Gluon.jetValue U.1 = 1 ∧ + ∀ k, 0 < lorDeg k → lorDeg k ≤ r → coeffMat k U.1 = 0 + +lemma lorDeg_eq_zero_iff (k : DIdx) : lorDeg k = 0 ↔ k = 0 := by + constructor + · intro hk + ext μ + have hle : k μ ≤ lorDeg k := by + rw [lorDeg] + exact Finset.single_le_sum (fun _ _ ↦ Nat.zero_le _) (Finset.mem_univ μ) + rw [hk] at hle + exact Nat.eq_zero_of_le_zero hle + · rintro rfl + simp [lorDeg] + +lemma lorDeg_pos_iff (k : DIdx) : 0 < lorDeg k ↔ k ≠ 0 := by + rw [Nat.pos_iff_ne_zero, ne_eq, lorDeg_eq_zero_iff] + +private lemma left_le_of_add_eq {p q k : DIdx} (h : p + q = k) : lorDeg p ≤ lorDeg k := by + have hdeg := congrArg lorDeg h + rw [lorDeg_add] at hdeg + omega + +private lemma right_le_of_add_eq {p q k : DIdx} (h : p + q = k) : lorDeg q ≤ lorDeg k := by + have hdeg := congrArg lorDeg h + rw [lorDeg_add] at hdeg + omega + +lemma basedTo_evalSU (hU : BasedTo r U) : JetGaugeGroupI.evalSU (Fin 3) U = 1 := by + apply Subtype.ext + rw [Gluon.evalSU_coe] + exact hU.1 + +/-! + +## B. Truncation of coefficient conjugation + +-/ + +private lemma coeffMat_mul_constMat (k : DIdx) (P : Matrix (Fin 3) (Fin 3) JetRing) + (M : Matrix (Fin 3) (Fin 3) ℂ) : coeffMat k (P * constMat M) = coeffMat k P * M := by + ext i j + simp only [coeffMat, Matrix.map_apply, Matrix.mul_apply, map_sum, constMat_apply, + MvPowerSeries.coeff_mul_C] + +/-- The coefficient of a conjugated constant matrix is the two-sided coefficient convolution. -/ +lemma conjCoeffM_eq_sum (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) + (M : Matrix (Fin 3) (Fin 3) ℂ) : + conjCoeffM U t M = + ∑ p ∈ Finset.antidiagonal t, coeffMat p.1 U.1 * M * star (coeffMat p.2 U.1) := by + rw [conjCoeffM, coeffMat_mul] + refine Finset.sum_congr rfl fun p _ ↦ ?_ + rw [coeffMat_mul_constMat, star_coeffMat] + +/-- Positive coefficient-conjugation orders through `r` vanish for a jet based through `r`. -/ +lemma conjC_eq_zero_of_basedTo (hU : BasedTo r U) (ht0 : 0 < lorDeg t) + (htr : lorDeg t ≤ r) : conjC U t = 0 := by + apply LinearMap.ext + intro X + apply cmat_injective + rw [cmat_conjC, LinearMap.zero_apply, cmat_zero, conjCoeffM_eq_sum] + apply Finset.sum_eq_zero + rintro ⟨p, q⟩ hpq + have hpq' : p + q = t := Finset.mem_antidiagonal.mp hpq + by_cases hp0 : p = 0 + · subst p + have hqt : q = t := by simpa using hpq' + subst q + rw [hU.2 t ht0 htr, star_zero, Matrix.mul_zero] + · have hpdeg : 0 < lorDeg p := (lorDeg_pos_iff p).2 hp0 + rw [hU.2 p hpdeg ((left_le_of_add_eq hpq').trans htr), Matrix.zero_mul, + Matrix.zero_mul] + +/-- At coefficient order zero, a based jet acts by the identity colour endomorphism. -/ +lemma conjC_zero_of_basedTo (hU : BasedTo r U) : conjC U 0 = LinearMap.id := by + apply LinearMap.ext + intro X + rw [conjC_zero, basedTo_evalSU hU, adC_one, LinearMap.id_apply] + +/-! + +## C. The canonical highest-layer shift + +-/ + +/-- A canonical direction occurring in a nonzero total multi-index. -/ +noncomputable def layerDir (w : DIdx) : Lor := + if hw : w = 0 then default else Classical.choose (Finsupp.ne_iff.mp hw) + +lemma layerDir_coeff_ne_zero {w : DIdx} (hw : w ≠ 0) : w (layerDir w) ≠ 0 := by + rw [layerDir, dif_neg hw] + exact Classical.choose_spec (Finsupp.ne_iff.mp hw) + +/-- The predecessor obtained by removing one occurrence of `layerDir w`. -/ +noncomputable def layerPred (w : DIdx) : DIdx := + Finsupp.update w (layerDir w) (w (layerDir w) - 1) + +lemma layerPred_add_single {w : DIdx} (hw : w ≠ 0) : + layerPred w + Finsupp.single (layerDir w) 1 = w := by + ext μ + by_cases hμ : μ = layerDir w + · subst μ + simpa [layerPred, Finsupp.update] using + Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr (layerDir_coeff_ne_zero hw)) + · simp [layerPred, hμ] + +lemma lorDeg_layerPred {w : DIdx} (hw : w ≠ 0) : lorDeg (layerPred w) + 1 = lorDeg w := by + have h := congrArg lorDeg (layerPred_add_single hw) + rwa [lorDeg_add, lorDeg_single] at h + +/-- The constant colour shift attached to a total derivative multi-index. It is packaged through +`mcCoeffCAt`, whose construction already proves hermiticity and tracelessness. -/ +noncomputable def layerShift (U : specialUnitaryGroup (Fin 3) JetRing) (w : DIdx) : ColourSpace := + if _hw : w = 0 then 0 else + facI (layerPred w) • mcCoeffCAt U (layerDir w) (layerPred w) + +private lemma coeffMat_C_smul (z : ℂ) (k : DIdx) + (M : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat k ((MvPowerSeries.C z : JetRing) • M) = z • coeffMat k M := by + ext i j + show MvPowerSeries.coeff k ((MvPowerSeries.C z : JetRing) * M i j) = + z * MvPowerSeries.coeff k (M i j) + rw [MvPowerSeries.coeff_C_mul] + +/-- Under basedness, the Maurer--Cartan coefficient has only its leading Taylor term. -/ +lemma mcCoeffM_of_basedTo (hU : BasedTo r U) (hsr : lorDeg s ≤ r) (mu : Lor) : + mcCoeffM U mu s = + Complex.I • (((s mu : ℕ) : ℂ) + 1) • + coeffMat (s + Finsupp.single mu 1) U.1 := by + rw [mcCoeffM, mcH, mcP, coeffMat_C_smul, coeffMat_mul, + Finset.sum_eq_single (s, 0)] + · rw [coeffMat_dMat, coeffMat_zero_eq_jetValue, Gluon.jetValue_star, hU.1, star_one, + Matrix.mul_one] + · rintro ⟨p, q⟩ hpq hpair + have hpq' : p + q = s := Finset.mem_antidiagonal.mp hpq + have hq0 : q ≠ 0 := by + intro hq + subst q + have hps : p = s := by simpa using hpq' + exact hpair (Prod.ext hps rfl) + have hqdeg : 0 < lorDeg q := (lorDeg_pos_iff q).2 hq0 + have hq : coeffMat q (star U.1) = 0 := by + rw [← star_coeffMat, hU.2 q hqdeg ((right_le_of_add_eq hpq').trans hsr), star_zero] + rw [hq, Matrix.mul_zero] + · simp + +private lemma cmat_normalized_mcCoeff (hU : BasedTo r U) (hsr : lorDeg s ≤ r) (mu : Lor) : + cmat (facI s • mcCoeffCAt U mu s) = + ((facI (s + Finsupp.single mu 1) : ℂ) * Complex.I) • + coeffMat (s + Finsupp.single mu 1) U.1 := by + rw [cmat_smul, cmat_mcCoeffCAt, mcCoeffM_of_basedTo hU hsr, smul_smul, + facI_add_single] + push_cast + module + +/-- **Total symmetry.** The normalized coefficient depends only on the total index obtained by +adjoining the connection direction. The proof is exactly `facI_add_single`. -/ +lemma normalized_mcCoeff_eq_layerShift (hU : BasedTo r U) (hs : lorDeg s = r) (mu : Lor) : + facI s • mcCoeffCAt U mu s = layerShift U (s + Finsupp.single mu 1) := by + have hwdeg : lorDeg (s + Finsupp.single mu 1) = r + 1 := by + rw [lorDeg_add, lorDeg_single, hs] + have hw0 : s + Finsupp.single mu 1 ≠ 0 := by + rw [← lorDeg_pos_iff, hwdeg] + omega + apply cmat_injective + have hpred : lorDeg (layerPred (s + Finsupp.single mu 1)) ≤ r := by + have h := lorDeg_layerPred hw0 + rw [hwdeg] at h + omega + rw [layerShift, dif_neg hw0, cmat_normalized_mcCoeff hU hs.le mu, + cmat_normalized_mcCoeff hU hpred (layerDir (s + Finsupp.single mu 1)), + layerPred_add_single hw0] + +/-- The matrix of a highest-layer shift is `i` times the factorial-normalized leading Taylor +coefficient of the gauge jet. -/ +lemma cmat_layerShift_of_basedTo (hU : BasedTo r U) (hw : lorDeg w = r + 1) : + cmat (layerShift U w) = + ((facI w : ℂ) * Complex.I) • coeffMat w U.1 := by + have hw0 : w ≠ 0 := by + rw [← lorDeg_pos_iff, hw] + omega + have hpred : lorDeg (layerPred w) ≤ r := by + have h := lorDeg_layerPred hw0 + rw [hw] at h + omega + rw [layerShift, dif_neg hw0, + cmat_normalized_mcCoeff hU hpred (layerDir w), layerPred_add_single hw0] + +/-! + +## D. Exact fixation below the top layer + +-/ + +private lemma conjugation_part_eq_gen (hU : BasedTo r U) (hsr : lorDeg s ≤ r) + (mu : Lor) (c : Col) : + (∑ p ∈ Finset.antidiagonal s, ∑ c', + algebraMap ℝ JetAlgebra + (facI s * (facI p.1)⁻¹ * coordC c (conjC U p.2 (colourBasis c'))) * + genVec p.1 mu c') = genVec s mu c := by + rw [Finset.sum_eq_single (s, 0)] + · rw [conjC_zero_of_basedTo hU] + simp only [LinearMap.id_apply, mul_inv_cancel₀ (facI_ne_zero s), + one_mul] + calc + (∑ c', algebraMap ℝ JetAlgebra (coordC c (colourBasis c')) * genVec s mu c') = + adR (1 : specialUnitaryGroup (Fin 3) ℂ) (genVec s mu) c := by + simpa only [adC_one] using + (sum_coordC_adC (R := JetAlgebra) (1 : specialUnitaryGroup (Fin 3) ℂ) + (genVec s mu) c) + _ = genVec s mu c := adR_one _ _ + · rintro ⟨p, q⟩ hpq hpair + have hpq' : p + q = s := Finset.mem_antidiagonal.mp hpq + have hq0 : q ≠ 0 := by + intro hq + subst q + have hps : p = s := by simpa using hpq' + exact hpair (Prod.ext hps rfl) + have hqdeg : 0 < lorDeg q := (lorDeg_pos_iff q).2 hq0 + rw [conjC_eq_zero_of_basedTo hU hqdeg ((right_le_of_add_eq hpq').trans hsr)] + simp + · simp + +lemma mcCoeffCAt_eq_zero_of_lt (hU : BasedTo r U) (hsr : lorDeg s < r) (mu : Lor) : + mcCoeffCAt U mu s = 0 := by + have hwdeg : lorDeg (s + Finsupp.single mu 1) = lorDeg s + 1 := by + rw [lorDeg_add, lorDeg_single] + have hwpos : 0 < lorDeg (s + Finsupp.single mu 1) := by omega + have hwle : lorDeg (s + Finsupp.single mu 1) ≤ r := by omega + apply cmat_injective + rw [cmat_mcCoeffCAt, cmat_zero, mcCoeffM_of_basedTo hU hsr.le, + hU.2 _ hwpos hwle, smul_zero, smul_zero] + +/-- **Lower layers are fixed exactly.** Every ordinary generator of degree below `r` is fixed by +a jet based through order `r`. -/ +lemma gaugeSubstGen_eq_ofGen_of_lt (hU : BasedTo r U) (hsr : lorDeg s < r) + (mu : Lor) (c : Col) : + gaugeSubstGen U (JetGenerators.dA s mu c) = ofGen (JetGenerators.dA s mu c) := by + rw [gaugeSubstGen, conjugation_part_eq_gen hU hsr.le, + mcCoeffCAt_eq_zero_of_lt hU hsr, smul_zero] + simp [genVec, constR] + +/-- The ordinary generators whose derivative degree is strictly below `r`. -/ +def lowerLayer (r : ℕ) : Set JetAlgebra := + {P | ∃ (s : DIdx) (mu : Lor) (c : Col), lorDeg s < r ∧ P = ofGen (JetGenerators.dA s mu c)} + +/-- The polynomial algebra supported on ordinary generators of derivative degree below `r`. -/ +noncomputable def lowerAlgebra (r : ℕ) : Subalgebra ℝ JetAlgebra := Algebra.adjoin ℝ (lowerLayer r) + +/-- A jet based through `r` fixes every polynomial supported below derivative degree `r`. -/ +lemma gaugePull_eq_self_of_mem_lowerAlgebra (hU : BasedTo r U) {P : JetAlgebra} + (hP : P ∈ lowerAlgebra r) : gaugePull U P = P := by + have hle : lowerAlgebra r ≤ AlgHom.equalizer (gaugePull U) (AlgHom.id ℝ JetAlgebra) := by + refine Algebra.adjoin_le ?_ + rintro Q ⟨s, mu, c, hsr, rfl⟩ + show gaugePull U (ofGen (JetGenerators.dA s mu c)) = + AlgHom.id ℝ JetAlgebra (ofGen (JetGenerators.dA s mu c)) + rw [gaugePull_ofGen, gaugeSubstGen_eq_ofGen_of_lt hU hsr, AlgHom.id_apply] + exact hle hP + +/-- **The top layer is a pure translation.** No field-dependent commutator survives at +derivative degree `r`. -/ +lemma gaugeSubstGen_eq_add_layerShift (hU : BasedTo r U) (hs : lorDeg s = r) + (mu : Lor) (c : Col) : + gaugeSubstGen U (JetGenerators.dA s mu c) = + ofGen (JetGenerators.dA s mu c) + + constR (layerShift U (s + Finsupp.single mu 1)) c := by + rw [gaugeSubstGen, conjugation_part_eq_gen hU hs.le, + normalized_mcCoeff_eq_layerShift hU hs] + rfl + +/-- Two presentations of the same total multi-index give the same normalized shift. -/ +lemma normalized_mcCoeff_eq_of_total_index (hU : BasedTo r U) (hs : lorDeg s = r) + (hs' : lorDeg s' = r) (hidx : s + Finsupp.single mu 1 = s' + Finsupp.single mu' 1) : + facI s • mcCoeffCAt U mu s = facI s' • mcCoeffCAt U mu' s' := by + rw [normalized_mcCoeff_eq_layerShift hU hs, + normalized_mcCoeff_eq_layerShift hU hs', hidx] + +/-! + +## E. Realizability by a single conjugated monomial jet + +-/ + +/-- The single conjugated `DiagonalJet` monomial jet used to realize one highest-layer colour shift. + -/ +noncomputable def realizingJet (w : DIdx) (hw : w ≠ 0) (c₀ : Col) (a : ℝ) : + specialUnitaryGroup (Fin 3) JetRing := + conjBy (colourConj c₀) (diagSU (a / facI w) w hw) + +lemma realizingJet_basedTo (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) : + BasedTo r (realizingJet w (by rw [← lorDeg_pos_iff, hw]; omega) c₀ a) := by + let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega + change BasedTo r (realizingJet w hw₀ c₀ a) + constructor + · exact jetValue_eq_one _ + (evalSU_conjBy _ (evalSU_diagSU (a / facI w) w hw₀)) + · intro k hkpos hkr + have hk₀ : k ≠ 0 := (lorDeg_pos_iff k).1 hkpos + have hmult : ∀ n : ℕ, k ≠ n • w := by + intro n hkn + have hdeg := congrArg lorDeg hkn + rw [lorDeg_nsmul, hw] at hdeg + by_cases hn : n = 0 + · subst n + simp at hdeg + omega + have hlower := Nat.mul_le_mul_right (r + 1) (Nat.one_le_iff_ne_zero.mpr hn) + simp only [one_mul] at hlower + omega + rw [realizingJet, coe_conjBy, coeffMat_conj_const, + show ((diagSU (a / facI w) w hw₀ : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) = diagMat (a / facI w) w hw₀ from rfl, + coeffMat_diagMat_eq_zero (a / facI w) w hw₀ hk₀ hmult, + Matrix.mul_zero, Matrix.zero_mul] + +private lemma realizing_scalar (w : DIdx) (a : ℝ) : + ((facI w : ℂ) * Complex.I) * (-((a / facI w : ℝ) : ℂ) * Complex.I) = (a : ℂ) := by + have hw : (facI w : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr (facI_ne_zero w) + push_cast + field_simp + rw [pow_two, Complex.I_mul_I] + ring + +lemma layerShift_realizingJet_self (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) : + layerShift (realizingJet w (by rw [← lorDeg_pos_iff, hw]; omega) c₀ a) w = + a • colourBasis c₀ := by + let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega + change layerShift (realizingJet w hw₀ c₀ a) w = a • colourBasis c₀ + rw [← adC_colourC c₀] + apply cmat_injective + rw [cmat_layerShift_of_basedTo (realizingJet_basedTo hw c₀ a) hw, cmat_smul, cmat_adC, + cmat_colourC, realizingJet, coe_conjBy, coeffMat_conj_const, + show ((diagSU (a / facI w) w hw₀ : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) = diagMat (a / facI w) w hw₀ from rfl, + coeffMat_diagMat_self] + calc + ((facI w : ℂ) * Complex.I) • + ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * + ((-((a / facI w : ℝ) : ℂ) * Complex.I) • colourMat) * + ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) = + (((facI w : ℂ) * Complex.I) * + (-((a / facI w : ℝ) : ℂ) * Complex.I)) • + ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * colourMat * + ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) := by + rw [Matrix.mul_smul, Matrix.smul_mul, smul_smul] + _ = (a : ℂ) • + ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * colourMat * + ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) := by rw [realizing_scalar] + _ = a • ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * colourMat * + ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) := by + rw [show ((a : ℂ)) = algebraMap ℝ ℂ a from rfl, algebraMap_smul] + +lemma layerShift_realizingJet_of_ne (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) + (hw' : lorDeg w' = r + 1) (hne : w' ≠ w) : + layerShift (realizingJet w (by rw [← lorDeg_pos_iff, hw]; omega) c₀ a) w' = 0 := by + let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega + let hw₀' : w' ≠ 0 := by rw [← lorDeg_pos_iff, hw']; omega + change layerShift (realizingJet w hw₀ c₀ a) w' = 0 + have hmult : ∀ n : ℕ, w' ≠ n • w := by + intro n hn + have hdeg := congrArg lorDeg hn + rw [lorDeg_nsmul, hw, hw'] at hdeg + have h₁n : 1 = n := Nat.mul_right_cancel (Nat.zero_lt_succ r) + (by simpa only [one_mul] using hdeg) + have hn₁ : n = 1 := h₁n.symm + rw [hn₁, one_smul] at hn + exact hne hn + apply cmat_injective + rw [cmat_layerShift_of_basedTo (realizingJet_basedTo hw c₀ a) hw', cmat_zero, + realizingJet, coe_conjBy, coeffMat_conj_const, + show ((diagSU (a / facI w) w hw₀ : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) = diagMat (a / facI w) w hw₀ from rfl, + coeffMat_diagMat_eq_zero (a / facI w) w hw₀ hw₀' hmult, + Matrix.mul_zero, Matrix.zero_mul, smul_zero] + +/-- **Arbitrary-order realizability.** One conjugated monomial jet realizes any chosen colour +basis shift at one degree-`r + 1` total index and vanishes at every other index in that layer. -/ +lemma exists_basedTo_layerShift (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) : + ∃ U : specialUnitaryGroup (Fin 3) JetRing, + BasedTo r U ∧ layerShift U w = a • colourBasis c₀ ∧ + ∀ w', lorDeg w' = r + 1 → w' ≠ w → layerShift U w' = 0 := by + let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega + refine ⟨realizingJet w hw₀ c₀ a, realizingJet_basedTo hw c₀ a, + layerShift_realizingJet_self hw c₀ a, ?_⟩ + intro w' hw' hne + exact layerShift_realizingJet_of_ne hw c₀ a hw' hne + +/-! + +## F. Agreement with the degree-zero and degree-one pilots + +-/ + +/-- At `r = 0`, the layer shift is `GaugeAction`'s first Maurer--Cartan colour coefficient. -/ +lemma layerShift_single (hU : BasedTo 0 U) (mu : Lor) : + layerShift U (Finsupp.single mu 1) = mcC U mu := by + have h := normalized_mcCoeff_eq_layerShift hU (s := (0 : DIdx)) (by simp [lorDeg]) mu + simpa only [facI_zero, one_smul, mcCoeffCAt_zero, zero_add] using h.symm + +/-- At `r = 1`, the layer shift is `GaugeAction`'s second Maurer--Cartan colour coefficient. -/ +lemma layerShift_pair (hU : BasedTo 1 U) (nu mu : Lor) : + layerShift U (Finsupp.single nu 1 + Finsupp.single mu 1) = mc2C U nu mu := by + have h := normalized_mcCoeff_eq_layerShift hU (s := Finsupp.single nu 1) + (lorDeg_single nu) mu + simpa only [facI_single, one_smul, mcCoeffCAt_single] using h.symm + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean new file mode 100644 index 000000000..32d54d9d9 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean @@ -0,0 +1,784 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.GaugeAction +/-! +# Second-order hook coordinates and the Bianchi identity + +## i. Overview + +This file extends the finite gluon-jet carrier through second ordinary derivatives. +The old second-order block is indexed by `Sym2 Lor × Lor`; the covariant block splits it into a +fully symmetric twenty-component block and twenty independent components of `D F`. + +The displayed family `D_ρ F_νμ`, with `ν < μ`, has twenty-four members. `HookIdx` omits +exactly the four members with `ρ < ν < μ`. Those components are reconstructed by + +```text +D_ρ F_νμ = D_ν F_ρμ - D_μ F_ρν. +``` + +## ii. Convention + +The hermitian field strength of `CoordinateChange` is +`F_νμ = ∂_ν A_μ - ∂_μ A_ν + br(A_ν,A_μ)`, where +`br(M,N) = i (M N - N M)`. The affine action `actPot` of `GaugeAction` forces the adjoint covariant +derivative used here: + +```text +D_ρ F_νμ = ∂_ρ F_νμ + br(A_ρ,F_νμ) + = ∂_ρ F_νμ + i [A_ρ,F_νμ]. +``` + +No production declaration is changed by this file. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +namespace SU3Jet + +/-! + +## A. Independent finite index types + +-/ + +/-- Three ranks in nondecreasing order, representing a completely symmetric Lorentz triple. -/ +abbrev Sym3Idx : Type := + {t : Fin 4 × Fin 4 × Fin 4 // t.1 ≤ t.2.1 ∧ t.2.1 ≤ t.2.2} + +/-- A three-input sorting network on `Fin 4`. -/ +def sort3 (a b c : Fin 4) : Fin 4 × Fin 4 × Fin 4 := + let p := min a b + let q := max a b + let r := min q c + let z := max q c + (min p r, max p r, z) + +lemma sort3_ordered (a b c : Fin 4) : + (sort3 a b c).1 ≤ (sort3 a b c).2.1 ∧ + (sort3 a b c).2.1 ≤ (sort3 a b c).2.2 := by + dsimp [sort3] + constructor + · exact min_le_max + · apply max_le + · exact (min_le_max.trans (le_max_left _ _)) + · exact (min_le_left _ _).trans (le_max_left _ _) + +/-- The completely symmetric triple containing `ρ`, `ν`, and `μ`. -/ +def sym3Key (ρ ν μ : Lor) : Sym3Idx := + ⟨sort3 (lorRank ρ) (lorRank ν) (lorRank μ), sort3_ordered _ _ _⟩ + +lemma sort3_of_ordered {a b c : Fin 4} (hab : a ≤ b) (hbc : b ≤ c) : + sort3 a b c = (a, b, c) := by + simp [sort3, min_eq_left hab, max_eq_right hab, min_eq_left hbc, max_eq_right hbc] + +lemma sym3Key_components (t : Sym3Idx) : + sym3Key (lorRank.symm t.1.1) (lorRank.symm t.1.2.1) (lorRank.symm t.1.2.2) = t := by + apply Subtype.ext + simp only [sym3Key, Equiv.apply_symm_apply] + exact sort3_of_ordered t.2.1 t.2.2 + +lemma sym3Key_swap12 (ρ ν μ : Lor) : sym3Key ρ ν μ = sym3Key ν ρ μ := by + apply Subtype.ext + fin_cases ρ <;> fin_cases ν <;> fin_cases μ <;> rfl + +lemma sym3Key_swap23 (ρ ν μ : Lor) : sym3Key ρ ν μ = sym3Key ρ μ ν := by + apply Subtype.ext + fin_cases ρ <;> fin_cases ν <;> fin_cases μ <;> rfl + +lemma sym3Key_cycle (ρ ν μ : Lor) : sym3Key ρ ν μ = sym3Key ν μ ρ := by + rw [sym3Key_swap12, sym3Key_swap23] + +/-- The independent hook coordinates. For an increasing curvature pair `ν < μ`, the +component with derivative index `ρ` is retained precisely when it is not the omitted member +`ρ < ν < μ`. -/ +abbrev HookIdx : Type := + {p : Lor × CurvPair // ¬ LorLT p.1 p.2.1.1} + +set_option maxRecDepth 20000 in +lemma card_sym3Idx : Fintype.card Sym3Idx = 20 := by decide + +set_option maxRecDepth 20000 in +lemma card_hookIdx : Fintype.card HookIdx = 20 := by decide + +set_option maxRecDepth 20000 in +lemma card_old_second_layer : Fintype.card (Sym2 Lor × Lor) = 40 := by decide + +set_option maxRecDepth 20000 in +lemma card_cov_second_layer : Fintype.card (Sym3Idx ⊕ HookIdx) = 40 := by decide + +/-! + +## B. The two second-order polynomial carriers + +-/ + +/-- Ordinary coordinates through second order. The two derivative indices of `sec` are stored +as a symmetric pair. -/ +inductive Coord2 where + /-- The connection coordinate. -/ + | conn : Lor → Col → Coord2 + /-- The first ordinary derivative. -/ + | der : Lor → Lor → Col → Coord2 + /-- The second ordinary derivative, symmetric in its first two Lorentz indices. -/ + | sec : Sym2 Lor → Lor → Col → Coord2 +deriving DecidableEq, Fintype + +/-- Covariant coordinates through second order. -/ +inductive CovCoord2 where + /-- The connection coordinate. -/ + | conn : Lor → Col → CovCoord2 + /-- The symmetric first derivative. -/ + | sym1 : Sym2 Lor → Col → CovCoord2 + /-- The independent curvature coordinate. -/ + | curv : CurvPair → Col → CovCoord2 + /-- The completely symmetric second derivative. -/ + | sym2 : Sym3Idx → Col → CovCoord2 + /-- An independent covariant derivative of curvature. -/ + | hook : HookIdx → Col → CovCoord2 +deriving DecidableEq, Fintype + +/-- The ordinary polynomial algebra through second order. -/ +abbrev A₂ : Type := MvPolynomial Coord2 ℝ + +/-- The covariant polynomial algebra through second order. -/ +abbrev A₂cov : Type := MvPolynomial CovCoord2 ℝ + +set_option maxRecDepth 20000 in +lemma card_coord2 : Fintype.card Coord2 = 480 := by decide + +set_option maxRecDepth 20000 in +lemma card_covCoord2 : Fintype.card CovCoord2 = 480 := by decide + +/-! + +## C. Bracket identities used by Bianchi + +-/ + +/-- Jacobi for the hermitian colour bracket. -/ +lemma br_jacobi (X Y Z : ColourSpace) : + br X (br Y Z) - br Y (br X Z) + br Z (br X Y) = 0 := by + apply cmat_injective + ext i j + simp only [cmat_add, cmat_sub, cmat_zero, cmat_br, brMat, Matrix.add_apply, + Matrix.sub_apply, Matrix.zero_apply, Matrix.smul_apply, Matrix.mul_apply, Fin.sum_univ_three] + ring_nf + +section PolyIdentities + +variable { ι : Type* } + +lemma brP_add_left (p q r : Col → MvPolynomial ι ℝ) (c : Col) : + brP (fun a ↦ p a + q a) r c = brP p r c + brP q r c := by + simp only [brP, add_mul, mul_add, Finset.sum_add_distrib] + +lemma brP_add_right (p q r : Col → MvPolynomial ι ℝ) (c : Col) : + brP p (fun a ↦ q a + r a) c = brP p q c + brP p r c := by + simp only [brP, mul_add, Finset.sum_add_distrib] + +lemma brP_sub_left (p q r : Col → MvPolynomial ι ℝ) (c : Col) : + brP (fun a ↦ p a - q a) r c = brP p r c - brP q r c := by + simp only [brP, sub_mul, mul_sub, Finset.sum_sub_distrib] + +lemma brP_sub_right (p q r : Col → MvPolynomial ι ℝ) (c : Col) : + brP p (fun a ↦ q a - r a) c = brP p q c - brP p r c := by + simp only [brP, mul_sub, Finset.sum_sub_distrib] + +lemma brP_neg_right (p q : Col → MvPolynomial ι ℝ) (c : Col) : + brP p (fun a ↦ -q a) c = -brP p q c := by + simp only [brP, mul_neg, Finset.sum_neg_distrib] + +lemma mkC_eval_brP (x : ι → ℝ) (p q : Col → MvPolynomial ι ℝ) : + mkC (fun c ↦ eval x (brP p q c)) = + br (mkC fun a ↦ eval x (p a)) (mkC fun b ↦ eval x (q b)) := by + rw [show (fun c ↦ eval x (brP p q c)) = fun c ↦ + coordC c (br (mkC fun a ↦ eval x (p a)) (mkC fun b ↦ eval x (q b))) from + funext fun c ↦ eval_brP x p q c] + exact mkC_coordC _ + +/-- Jacobi after lifting three colour vectors to polynomial coordinates. -/ +lemma brP_jacobi (p q r : Col → MvPolynomial ι ℝ) (c : Col) : + brP p (brP q r) c - brP q (brP p r) c + brP r (brP p q) c = 0 := by + refine MvPolynomial.funext fun x ↦ ?_ + simp only [map_add, map_sub, map_zero] + rw [eval_brP, eval_brP, eval_brP, mkC_eval_brP, mkC_eval_brP, mkC_eval_brP] + simpa only [map_add, map_sub, map_zero] using congrArg (coordC c) + (br_jacobi (mkC fun a ↦ eval x (p a)) (mkC fun a ↦ eval x (q a)) + (mkC fun a ↦ eval x (r a))) + +end PolyIdentities + +/-! + +## D. Curvature and its covariant derivative in ordinary coordinates + +-/ + +/-- The connection colour vector in the second-order ordinary carrier. -/ +noncomputable def conn2Old (μ : Lor) : Col → A₂ := fun c ↦ X (Coord2.conn μ c) + +/-- The first derivative colour vector in the second-order ordinary carrier. -/ +noncomputable def der2Old (ρ μ : Lor) : Col → A₂ := fun c ↦ X (Coord2.der ρ μ c) + +/-- A displayed second derivative in the ordinary carrier. -/ +noncomputable def secAt (ρ ν μ : Lor) (c : Col) : A₂ := X (Coord2.sec s(ρ, ν) μ c) + +lemma secAt_swap (ρ ν μ : Lor) (c : Col) : secAt ρ ν μ c = secAt ν ρ μ c := by + rw [secAt, secAt, Sym2.eq_swap] + +/-- The curvature polynomial in the second-order ordinary carrier. -/ +noncomputable def curv2Poly (ν μ : Lor) (c : Col) : A₂ := + X (Coord2.der ν μ c) - X (Coord2.der μ ν c) + brP (conn2Old ν) (conn2Old μ) c + +lemma curv2Poly_swap (ν μ : Lor) (c : Col) : curv2Poly ν μ c = -curv2Poly μ ν c := by + rw [curv2Poly, curv2Poly, brP_swap (conn2Old μ) (conn2Old ν) c] + ring_nf + +lemma curv2Poly_self (ν : Lor) (c : Col) : curv2Poly ν ν c = 0 := by + rw [curv2Poly, brP_self, sub_self, add_zero] + +/-- The terms in `D_ρ F_νμ` below the leading second-derivative hook. -/ +noncomputable def dFNonlin (ρ ν μ : Lor) : Col → A₂ := fun c ↦ + brP (der2Old ρ ν) (conn2Old μ) c + + brP (conn2Old ν) (der2Old ρ μ) c + + brP (conn2Old ρ) (curv2Poly ν μ) c + +/-- The leading linear hook in the second ordinary derivative. -/ +noncomputable def leadHook (ρ ν μ : Lor) : Col → A₂ := + fun c ↦ secAt ρ ν μ c - secAt ρ μ ν c + +/-- The covariant derivative +`D_ρ F_νμ = ∂_ρ F_νμ + br(A_ρ,F_νμ)` in ordinary coordinates. -/ +noncomputable def dFPoly (ρ ν μ : Lor) : Col → A₂ := + fun c ↦ leadHook ρ ν μ c + dFNonlin ρ ν μ c + +lemma leadHook_swap (ρ ν μ : Lor) (c : Col) : + leadHook ρ ν μ c = -leadHook ρ μ ν c := by + rw [leadHook, leadHook] + ring_nf + +lemma leadHook_bianchi (ρ ν μ : Lor) (c : Col) : + leadHook ρ ν μ c - leadHook ν ρ μ c + leadHook μ ρ ν c = 0 := by + rw [leadHook, leadHook, leadHook, secAt_swap ν ρ, secAt_swap μ ρ, + secAt_swap μ ν] + ring_nf + +lemma dFNonlin_swap (ρ ν μ : Lor) (c : Col) : + dFNonlin ρ ν μ c = -dFNonlin ρ μ ν c := by + rw [dFNonlin, dFNonlin] + rw [brP_swap (der2Old ρ ν) (conn2Old μ) c, + brP_swap (der2Old ρ μ) (conn2Old ν) c] + have hcurv : curv2Poly ν μ = fun a ↦ -curv2Poly μ ν a := by + funext a + exact curv2Poly_swap ν μ a + rw [hcurv, brP_neg_right] + ring_nf + +/-- The nonlinear terms obey the cyclic identity by Jacobi. -/ +lemma dFNonlin_bianchi (ρ ν μ : Lor) (c : Col) : + dFNonlin ρ ν μ c - dFNonlin ν ρ μ c + dFNonlin μ ρ ν c = 0 := by + simp only [dFNonlin] + change + (brP (der2Old ρ ν) (conn2Old μ) c + brP (conn2Old ν) (der2Old ρ μ) c + + brP (conn2Old ρ) (fun a ↦ der2Old ν μ a - der2Old μ ν a + + brP (conn2Old ν) (conn2Old μ) a) c) - + (brP (der2Old ν ρ) (conn2Old μ) c + brP (conn2Old ρ) (der2Old ν μ) c + + brP (conn2Old ν) (fun a ↦ der2Old ρ μ a - der2Old μ ρ a + + brP (conn2Old ρ) (conn2Old μ) a) c) + + (brP (der2Old μ ρ) (conn2Old ν) c + brP (conn2Old ρ) (der2Old μ ν) c + + brP (conn2Old μ) (fun a ↦ der2Old ρ ν a - der2Old ν ρ a + + brP (conn2Old ρ) (conn2Old ν) a) c) = 0 + rw [brP_add_right, brP_sub_right, brP_add_right, brP_sub_right, brP_add_right, + brP_sub_right] + rw [brP_swap (conn2Old μ) (der2Old ρ ν) c, + brP_swap (conn2Old μ) (der2Old ν ρ) c, + brP_swap (der2Old μ ρ) (conn2Old ν) c] + have hj := brP_jacobi (conn2Old ρ) (conn2Old ν) (conn2Old μ) c + linear_combination (norm := ring_nf) hj + +/-- Antisymmetry of the covariant derivative in its curvature indices. -/ +lemma dFPoly_swap (ρ ν μ : Lor) (c : Col) : dFPoly ρ ν μ c = -dFPoly ρ μ ν c := by + rw [dFPoly, dFPoly, leadHook_swap, dFNonlin_swap] + ring_nf + +/-- The algebraic Bianchi identity in ordinary polynomial coordinates. -/ +lemma dFPoly_bianchi (ρ ν μ : Lor) (c : Col) : + dFPoly ρ ν μ c - dFPoly ν ρ μ c + dFPoly μ ρ ν c = 0 := by + rw [dFPoly, dFPoly, dFPoly] + linear_combination (norm := ring_nf) + leadHook_bianchi ρ ν μ c + dFNonlin_bianchi ρ ν μ c + +/-! + +## E. Reconstructing all displayed hook components + +-/ + +/-- A retained hook variable, or the Bianchi reconstruction when the displayed component was +omitted. Its curvature pair is already increasing. -/ +noncomputable def hookInc (ρ : Lor) (q : CurvPair) (c : Col) : A₂cov := + if h : LorLT ρ q.1.1 then + X (CovCoord2.hook + ⟨(q.1.1, ⟨(ρ, q.1.2), lt_trans h q.2⟩), lorLT_asymm h⟩ c) - + X (CovCoord2.hook + ⟨(q.1.2, ⟨(ρ, q.1.1), h⟩), lorLT_asymm (lt_trans h q.2)⟩ c) + else X (CovCoord2.hook ⟨(ρ, q), h⟩ c) + +/-- The covariant-coordinate polynomial representing `D_ρ F_νμ` for an arbitrary ordered +curvature pair. -/ +noncomputable def hookVar (ρ ν μ : Lor) (c : Col) : A₂cov := + if h : LorLT ν μ then hookInc ρ ⟨(ν, μ), h⟩ c + else if h' : LorLT μ ν then -hookInc ρ ⟨(μ, ν), h'⟩ c + else 0 + +lemma hookVar_swap (ρ ν μ : Lor) (c : Col) : hookVar ρ ν μ c = -hookVar ρ μ ν c := by + rw [hookVar, hookVar] + by_cases h : LorLT ν μ + · rw [dif_pos h, dif_neg (lorLT_asymm h), dif_pos h, neg_neg] + · by_cases h' : LorLT μ ν + · rw [dif_neg h, dif_pos h', dif_pos h'] + · rw [dif_neg h, dif_neg h', dif_neg h', dif_neg h, neg_zero] + +lemma hookVar_self (ρ ν : Lor) (c : Col) : hookVar ρ ν ν c = 0 := by + simp [hookVar, lorLT_irrefl] + +/-- The omitted component for `ρ < ν < μ` is reconstructed from the two retained components. -/ +lemma hookVar_reconstruct { ρ ν μ : Lor } (hρν : LorLT ρ ν) (hνμ : LorLT ν μ) (c : Col) : + hookVar ρ ν μ c = hookVar ν ρ μ c - hookVar μ ρ ν c := by + have hρμ : LorLT ρ μ := lt_trans hρν hνμ + simp only [hookVar, dif_pos hνμ, hookInc, dif_pos hρν, dif_pos hρμ, + dif_neg (lorLT_asymm hρν), dif_neg (lorLT_asymm hρμ)] + +private lemma hookVar_bianchi_of_lt {ρ ν : Lor} (hρν : LorLT ρ ν) (μ : Lor) (c : Col) : + hookVar ρ ν μ c - hookVar ν ρ μ c + hookVar μ ρ ν c = 0 := by + rcases lor_trichotomy ν μ with hνμ | rfl | hμν + · rw [hookVar_reconstruct hρν hνμ] + ring_nf + · rw [hookVar_self] + ring_nf + · rcases lor_trichotomy ρ μ with hρμ | rfl | hμρ + · have hr := hookVar_reconstruct hρμ hμν c + rw [hookVar_swap ρ ν μ] + rw [hr] + ring_nf + · rw [hookVar_self, hookVar_swap ρ ν ρ] + ring_nf + · have hr := hookVar_reconstruct hμρ hρν c + rw [hookVar_swap ρ ν μ, hookVar_swap ν ρ μ] + linear_combination (norm := ring_nf) hr + +/-- Bianchi for the reconstructed covariant-coordinate hook family. -/ +lemma hookVar_bianchi (ρ ν μ : Lor) (c : Col) : + hookVar ρ ν μ c - hookVar ν ρ μ c + hookVar μ ρ ν c = 0 := by + rcases lor_trichotomy ρ ν with hρν | rfl | hνρ + · exact hookVar_bianchi_of_lt hρν μ c + · rw [hookVar_self] + ring_nf + · have h := hookVar_bianchi_of_lt hνρ μ c + rw [hookVar_swap μ ν ρ] at h + linear_combination (norm := ring_nf) -h + +/-! + +## F. The nonlinear triangular substitutions + +-/ + +/-- The connection colour vector in covariant coordinates. -/ +noncomputable def conn2Cov (μ : Lor) : Col → A₂cov := fun c ↦ X (CovCoord2.conn μ c) + +/-- The curvature variable in the covariant carrier, extended antisymmetrically to every pair. -/ +noncomputable def curv2Var (ν μ : Lor) (c : Col) : A₂cov := + if h : LorLT ν μ then X (CovCoord2.curv ⟨(ν, μ), h⟩ c) + else if h' : LorLT μ ν then -X (CovCoord2.curv ⟨(μ, ν), h'⟩ c) + else 0 + +lemma curv2Var_swap (ν μ : Lor) (c : Col) : curv2Var ν μ c = -curv2Var μ ν c := by + rw [curv2Var, curv2Var] + by_cases h : LorLT ν μ + · rw [dif_pos h, dif_neg (lorLT_asymm h), dif_pos h, neg_neg] + · by_cases h' : LorLT μ ν + · rw [dif_neg h, dif_pos h', dif_pos h'] + · rw [dif_neg h, dif_neg h', dif_neg h', dif_neg h, neg_zero] + +/-- A first derivative written in the lower covariant coordinates. -/ +noncomputable def der2Cov (ν μ : Lor) : Col → A₂cov := fun c ↦ + X (CovCoord2.sym1 s(ν, μ) c) + + (2⁻¹ : ℝ) • (curv2Var ν μ c - brP (conn2Cov ν) (conn2Cov μ) c) + +/-- The lower-order nonlinear part of `D_ρ F_νμ` in covariant coordinates. -/ +noncomputable def dFNonlinCov (ρ ν μ : Lor) : Col → A₂cov := fun c ↦ + brP (der2Cov ρ ν) (conn2Cov μ) c + + brP (conn2Cov ν) (der2Cov ρ μ) c + + brP (conn2Cov ρ) (curv2Var ν μ) c + +lemma dFNonlinCov_swap (ρ ν μ : Lor) (c : Col) : + dFNonlinCov ρ ν μ c = -dFNonlinCov ρ μ ν c := by + rw [dFNonlinCov, dFNonlinCov] + rw [brP_swap (der2Cov ρ ν) (conn2Cov μ) c, + brP_swap (der2Cov ρ μ) (conn2Cov ν) c] + have hcurv : curv2Var ν μ = fun a ↦ -curv2Var μ ν a := by + funext a + exact curv2Var_swap ν μ a + rw [hcurv, brP_neg_right] + ring_nf + +/-- The completely symmetric average of an ordinary second derivative. -/ +noncomputable def sym3Average (ρ ν μ : Lor) (c : Col) : A₂ := + (3⁻¹ : ℝ) • (secAt ρ ν μ c + secAt ρ μ ν c + secAt ν μ ρ c) + +/-- A completely symmetric covariant generator written in ordinary coordinates. -/ +noncomputable def sym3Old (t : Sym3Idx) (c : Col) : A₂ := + sym3Average (lorRank.symm t.1.1) (lorRank.symm t.1.2.1) (lorRank.symm t.1.2.2) c + +lemma sym3Average_swap12 (ρ ν μ : Lor) (c : Col) : + sym3Average ρ ν μ c = sym3Average ν ρ μ c := by + rw [sym3Average, sym3Average, secAt_swap ν ρ] + ring_nf + +lemma sym3Average_swap23 (ρ ν μ : Lor) (c : Col) : + sym3Average ρ ν μ c = sym3Average ρ μ ν c := by + rw [sym3Average, sym3Average, secAt_swap μ ν] + ring_nf + +private lemma sym3Average_sort3Ranks (a b d : Fin 4) (c : Col) : + sym3Average (lorRank.symm (sort3 a b d).1) + (lorRank.symm (sort3 a b d).2.1) (lorRank.symm (sort3 a b d).2.2) c = + sym3Average (lorRank.symm a) (lorRank.symm b) (lorRank.symm d) c := by + let p := min a b + let q := max a b + let r := min q d + let z := max q d + calc + sym3Average (lorRank.symm (sort3 a b d).1) + (lorRank.symm (sort3 a b d).2.1) (lorRank.symm (sort3 a b d).2.2) c = + sym3Average (lorRank.symm (min p r)) (lorRank.symm (max p r)) + (lorRank.symm z) c := by rfl + _ = sym3Average (lorRank.symm p) (lorRank.symm r) (lorRank.symm z) c := by + by_cases h : p ≤ r + · rw [min_eq_left h, max_eq_right h] + · rw [min_eq_right (le_of_not_ge h), max_eq_left (le_of_not_ge h)] + exact sym3Average_swap12 _ _ _ _ + _ = sym3Average (lorRank.symm p) (lorRank.symm q) (lorRank.symm d) c := by + by_cases h : q ≤ d + · rw [show r = q from min_eq_left h, show z = d from max_eq_right h] + · rw [show r = d from min_eq_right (le_of_not_ge h), + show z = q from max_eq_left (le_of_not_ge h)] + exact sym3Average_swap23 _ _ _ _ + _ = sym3Average (lorRank.symm a) (lorRank.symm b) (lorRank.symm d) c := by + by_cases h : a ≤ b + · rw [show p = a from min_eq_left h, show q = b from max_eq_right h] + · rw [show p = b from min_eq_right (le_of_not_ge h), + show q = a from max_eq_left (le_of_not_ge h)] + exact sym3Average_swap12 _ _ _ _ + +lemma sym3Old_key (ρ ν μ : Lor) (c : Col) : + sym3Old (sym3Key ρ ν μ) c = sym3Average ρ ν μ c := by + change sym3Average (lorRank.symm (sort3 (lorRank ρ) (lorRank ν) (lorRank μ)).1) + (lorRank.symm (sort3 (lorRank ρ) (lorRank ν) (lorRank μ)).2.1) + (lorRank.symm (sort3 (lorRank ρ) (lorRank ν) (lorRank μ)).2.2) c = _ + simpa using sym3Average_sort3Ranks (lorRank ρ) (lorRank ν) (lorRank μ) c + +/-- The leading linear decomposition of a second ordinary derivative. -/ +lemma leading_hook_decomposition (ρ ν μ : Lor) (c : Col) : + secAt ρ ν μ c = sym3Old (sym3Key ρ ν μ) c + + (3⁻¹ : ℝ) • (leadHook ρ ν μ c + leadHook ν ρ μ c) := by + rw [sym3Old_key, sym3Average, leadHook, leadHook, secAt_swap ν ρ] + module + +/-- Ordinary generators written in covariant coordinates. -/ +noncomputable def oldToNew2Gen : Coord2 → A₂cov + | Coord2.conn μ c => X (CovCoord2.conn μ c) + | Coord2.der ν μ c => der2Cov ν μ c + | Coord2.sec s μ c => + Sym2.lift ⟨fun ρ ν ↦ + X (CovCoord2.sym2 (sym3Key ρ ν μ) c) + + (3⁻¹ : ℝ) • + ((hookVar ρ ν μ c - dFNonlinCov ρ ν μ c) + + (hookVar ν ρ μ c - dFNonlinCov ν ρ μ c)), by + intro ρ ν + dsimp + rw [sym3Key_swap12] + ring_nf⟩ s + +/-- Covariant generators written in ordinary coordinates. -/ +noncomputable def newToOld2Gen : CovCoord2 → A₂ + | CovCoord2.conn μ c => X (Coord2.conn μ c) + | CovCoord2.sym1 s c => + Sym2.lift ⟨fun ν μ ↦ (2⁻¹ : ℝ) • + (X (Coord2.der ν μ c) + X (Coord2.der μ ν c)), by + intro ν μ + dsimp + rw [add_comm]⟩ s + | CovCoord2.curv q c => curv2Poly q.1.1 q.1.2 c + | CovCoord2.sym2 t c => sym3Old t c + | CovCoord2.hook i c => dFPoly i.1.1 i.1.2.1.1 i.1.2.1.2 c + +/-- The triangular substitution from ordinary to covariant coordinates. -/ +noncomputable def oldToNew2 : A₂ →ₐ[ℝ] A₂cov := aeval oldToNew2Gen + +/-- The triangular substitution from covariant to ordinary coordinates. -/ +noncomputable def newToOld2 : A₂cov →ₐ[ℝ] A₂ := aeval newToOld2Gen + +@[simp] lemma oldToNew2_conn (μ : Lor) (c : Col) : + oldToNew2 (X (Coord2.conn μ c)) = X (CovCoord2.conn μ c) := aeval_X _ _ + +@[simp] lemma oldToNew2_der (ν μ : Lor) (c : Col) : + oldToNew2 (X (Coord2.der ν μ c)) = der2Cov ν μ c := aeval_X _ _ + +@[simp] lemma oldToNew2_sec (ρ ν μ : Lor) (c : Col) : + oldToNew2 (secAt ρ ν μ c) = + X (CovCoord2.sym2 (sym3Key ρ ν μ) c) + + (3⁻¹ : ℝ) • + ((hookVar ρ ν μ c - dFNonlinCov ρ ν μ c) + + (hookVar ν ρ μ c - dFNonlinCov ν ρ μ c)) := by + rw [secAt, oldToNew2, aeval_X, oldToNew2Gen, Sym2.lift_mk] + +@[simp] lemma newToOld2_conn (μ : Lor) (c : Col) : + newToOld2 (X (CovCoord2.conn μ c)) = X (Coord2.conn μ c) := aeval_X _ _ + +@[simp] lemma newToOld2_sym1 (ν μ : Lor) (c : Col) : + newToOld2 (X (CovCoord2.sym1 s(ν, μ) c)) = + (2⁻¹ : ℝ) • (X (Coord2.der ν μ c) + X (Coord2.der μ ν c)) := by + rw [newToOld2, aeval_X, newToOld2Gen, Sym2.lift_mk] + +@[simp] lemma newToOld2_curv (q : CurvPair) (c : Col) : + newToOld2 (X (CovCoord2.curv q c)) = curv2Poly q.1.1 q.1.2 c := aeval_X _ _ + +@[simp] lemma newToOld2_sym2 (t : Sym3Idx) (c : Col) : + newToOld2 (X (CovCoord2.sym2 t c)) = sym3Old t c := aeval_X _ _ + +@[simp] lemma newToOld2_hook (i : HookIdx) (c : Col) : + newToOld2 (X (CovCoord2.hook i c)) = dFPoly i.1.1 i.1.2.1.1 i.1.2.1.2 c := aeval_X _ _ + +lemma oldToNew2_conn2Old (μ : Lor) : (fun c ↦ oldToNew2 (conn2Old μ c)) = conn2Cov μ := by + funext c + exact oldToNew2_conn μ c + +lemma newToOld2_conn2Cov (μ : Lor) : (fun c ↦ newToOld2 (conn2Cov μ c)) = conn2Old μ := by + funext c + exact newToOld2_conn μ c + +lemma newToOld2_curv2Var (ν μ : Lor) (c : Col) : + newToOld2 (curv2Var ν μ c) = curv2Poly ν μ c := by + rw [curv2Var] + by_cases h : LorLT ν μ + · rw [dif_pos h, newToOld2_curv] + · by_cases h' : LorLT μ ν + · rw [dif_neg h, dif_pos h', map_neg, newToOld2_curv, ← curv2Poly_swap] + · rw [dif_neg h, dif_neg h', map_zero] + rcases lor_trichotomy ν μ with hlt | rfl | hgt + · exact absurd hlt h + · rw [curv2Poly_self] + · exact absurd hgt h' + +lemma newToOld2_der2Cov (ν μ : Lor) : + (fun c ↦ newToOld2 (der2Cov ν μ c)) = der2Old ν μ := by + funext c + rw [der2Cov, map_add, map_smul, map_sub, newToOld2_sym1, newToOld2_curv2Var, + algHom_brP, newToOld2_conn2Cov, newToOld2_conn2Cov, curv2Poly] + simp only [der2Old] + norm_num + module + +lemma oldToNew2_curv2Poly (ν μ : Lor) (c : Col) : + oldToNew2 (curv2Poly ν μ c) = curv2Var ν μ c := by + rw [curv2Poly, map_add, map_sub, oldToNew2_der, oldToNew2_der, algHom_brP, + oldToNew2_conn2Old, oldToNew2_conn2Old, der2Cov, der2Cov, + Sym2.eq_swap (a := μ) (b := ν), curv2Var_swap μ ν c, + brP_swap (conn2Cov μ) (conn2Cov ν) c] + module + +lemma newToOld2_dFNonlinCov (ρ ν μ : Lor) : + (fun c ↦ newToOld2 (dFNonlinCov ρ ν μ c)) = dFNonlin ρ ν μ := by + funext c + rw [dFNonlinCov, dFNonlin, map_add, map_add, algHom_brP, algHom_brP, algHom_brP, + newToOld2_der2Cov, newToOld2_der2Cov, newToOld2_conn2Cov, + newToOld2_conn2Cov, newToOld2_conn2Cov] + have hcurv : (fun b ↦ newToOld2 (curv2Var ν μ b)) = curv2Poly ν μ := by + funext b + exact newToOld2_curv2Var ν μ b + rw [hcurv] + +lemma oldToNew2_dFNonlin (ρ ν μ : Lor) : + (fun c ↦ oldToNew2 (dFNonlin ρ ν μ c)) = dFNonlinCov ρ ν μ := by + funext c + rw [dFNonlin, dFNonlinCov, map_add, map_add, algHom_brP, algHom_brP, algHom_brP, + oldToNew2_conn2Old, oldToNew2_conn2Old, oldToNew2_conn2Old] + have hder₁ : (fun a ↦ oldToNew2 (der2Old ρ ν a)) = der2Cov ρ ν := by + funext a + exact oldToNew2_der ρ ν a + have hder₂ : (fun a ↦ oldToNew2 (der2Old ρ μ a)) = der2Cov ρ μ := by + funext a + exact oldToNew2_der ρ μ a + have hcurv : (fun b ↦ oldToNew2 (curv2Poly ν μ b)) = curv2Var ν μ := by + funext b + exact oldToNew2_curv2Poly ν μ b + rw [hder₁, hder₂, hcurv] + +lemma newToOld2_hookInc (ρ : Lor) (q : CurvPair) (c : Col) : + newToOld2 (hookInc ρ q c) = dFPoly ρ q.1.1 q.1.2 c := by + obtain ⟨⟨ν, μ⟩, hνμ⟩ := q + rw [hookInc] + by_cases h : LorLT ρ ν + · rw [dif_pos h, map_sub, newToOld2_hook, newToOld2_hook] + have hb := dFPoly_bianchi ρ ν μ c + linear_combination (norm := ring_nf) -hb + · rw [dif_neg h, newToOld2_hook] + +lemma newToOld2_hookVar (ρ ν μ : Lor) (c : Col) : + newToOld2 (hookVar ρ ν μ c) = dFPoly ρ ν μ c := by + rw [hookVar] + by_cases h : LorLT ν μ + · rw [dif_pos h, newToOld2_hookInc] + · by_cases h' : LorLT μ ν + · rw [dif_neg h, dif_pos h', map_neg, newToOld2_hookInc, ← dFPoly_swap] + · rw [dif_neg h, dif_neg h', map_zero] + rcases lor_trichotomy ν μ with hlt | rfl | hgt + · exact absurd hlt h + · have hs := dFPoly_swap ρ ν ν c + have htwo : (2 : ℝ) • dFPoly ρ ν ν c = 0 := by + rw [two_smul] + nth_rewrite 1 [hs] + exact neg_add_cancel _ + have hhalf := congrArg (fun x : A₂ ↦ (2⁻¹ : ℝ) • x) htwo + symm + simpa [smul_smul] using hhalf + · exact absurd hgt h' + +lemma newToOld2_oldToNew2 (i : Coord2) : newToOld2 (oldToNew2 (X i)) = X i := by + cases i with + | conn μ c => rw [oldToNew2_conn, newToOld2_conn] + | der ν μ c => + rw [oldToNew2_der] + exact congrFun (newToOld2_der2Cov ν μ) c + | sec s μ c => + induction s using Sym2.ind with + | _ ρ ν => + rw [← secAt, oldToNew2_sec, map_add, map_smul, map_add, map_sub, map_sub, + newToOld2_sym2, newToOld2_hookVar, newToOld2_hookVar, + congrFun (newToOld2_dFNonlinCov ρ ν μ) c, + congrFun (newToOld2_dFNonlinCov ν ρ μ) c, + dFPoly, dFPoly] + calc + sym3Old (sym3Key ρ ν μ) c + + (3⁻¹ : ℝ) • + (leadHook ρ ν μ c + dFNonlin ρ ν μ c - dFNonlin ρ ν μ c + + (leadHook ν ρ μ c + dFNonlin ν ρ μ c - dFNonlin ν ρ μ c)) = + sym3Old (sym3Key ρ ν μ) c + + (3⁻¹ : ℝ) • (leadHook ρ ν μ c + leadHook ν ρ μ c) := by + module + _ = secAt ρ ν μ c := (leading_hook_decomposition ρ ν μ c).symm + +/- The remaining direction is proved after two triangular identities below. -/ + +lemma dFNonlinCov_bianchi (ρ ν μ : Lor) (c : Col) : + dFNonlinCov ρ ν μ c - dFNonlinCov ν ρ μ c + + dFNonlinCov μ ρ ν c = 0 := by + have h := congrArg oldToNew2 (dFNonlin_bianchi ρ ν μ c) + simpa only [map_add, map_sub, map_zero, congrFun (oldToNew2_dFNonlin ρ ν μ) c, + congrFun (oldToNew2_dFNonlin ν ρ μ) c, + congrFun (oldToNew2_dFNonlin μ ρ ν) c] using h + +private lemma triangular_hook_sub (S a b d na nb nd : A₂cov) + (ha : a - b + d = 0) (hn : na - nb + nd = 0) : + (S + (3⁻¹ : ℝ) • ((a - na) + (b - nb))) - + (S + (3⁻¹ : ℝ) • ((-a - -na) + (d - nd))) = a - na := by + have hb : b = a + d := by + linear_combination (norm := ring_nf) -ha + have hnb : nb = na + nd := by + linear_combination (norm := ring_nf) -hn + rw [hb, hnb] + norm_num + module + +lemma oldToNew2_leadHook (ρ ν μ : Lor) (c : Col) : + oldToNew2 (leadHook ρ ν μ c) = + hookVar ρ ν μ c - dFNonlinCov ρ ν μ c := by + have hs : (X (CovCoord2.sym2 (sym3Key ρ μ ν) c) : A₂cov) = + X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by + rw [sym3Key_swap23] + rw [leadHook, map_sub, oldToNew2_sec, oldToNew2_sec, hs, + hookVar_swap ρ μ ν, dFNonlinCov_swap ρ μ ν] + have hh := hookVar_bianchi ρ ν μ c + have hn := dFNonlinCov_bianchi ρ ν μ c + exact triangular_hook_sub _ _ _ _ _ _ _ hh hn + +lemma oldToNew2_dFPoly (ρ ν μ : Lor) (c : Col) : + oldToNew2 (dFPoly ρ ν μ c) = hookVar ρ ν μ c := by + rw [dFPoly, map_add, oldToNew2_leadHook, + congrFun (oldToNew2_dFNonlin ρ ν μ) c] + abel + +lemma oldToNew2_sym3Average (ρ ν μ : Lor) (c : Col) : + oldToNew2 (sym3Average ρ ν μ c) = X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by + have hs₁ : (X (CovCoord2.sym2 (sym3Key ρ μ ν) c) : A₂cov) = + X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by + exact congrArg (fun t ↦ (X (CovCoord2.sym2 t c) : A₂cov)) (sym3Key_swap23 ρ ν μ).symm + have hs₂ : (X (CovCoord2.sym2 (sym3Key ν μ ρ) c) : A₂cov) = + X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by + exact congrArg (fun t ↦ (X (CovCoord2.sym2 t c) : A₂cov)) (sym3Key_cycle ρ ν μ).symm + rw [sym3Average, map_smul, map_add, map_add, oldToNew2_sec, oldToNew2_sec, + oldToNew2_sec, hs₁, hs₂, + hookVar_swap ρ μ ν, dFNonlinCov_swap ρ μ ν, + hookVar_swap ν μ ρ, dFNonlinCov_swap ν μ ρ, + hookVar_swap μ ν ρ, dFNonlinCov_swap μ ν ρ] + norm_num + module + +lemma oldToNew2_sym3Old (t : Sym3Idx) (c : Col) : + oldToNew2 (sym3Old t c) = X (CovCoord2.sym2 t c) := by + rw [sym3Old, oldToNew2_sym3Average, sym3Key_components] + +lemma oldToNew2_hookInc (ρ : Lor) (q : CurvPair) (c : Col) : + oldToNew2 (dFPoly ρ q.1.1 q.1.2 c) = hookInc ρ q c := by + rw [oldToNew2_dFPoly, hookVar] + exact dif_pos q.2 + +lemma oldToNew2_newToOld2 (i : CovCoord2) : oldToNew2 (newToOld2 (X i)) = X i := by + cases i with + | conn μ c => rw [newToOld2_conn, oldToNew2_conn] + | sym1 s c => + induction s using Sym2.ind with + | _ ν μ => + rw [newToOld2_sym1, map_smul, map_add, oldToNew2_der, oldToNew2_der, + der2Cov, der2Cov, Sym2.eq_swap (a := μ) (b := ν), curv2Var_swap μ ν c, + brP_swap (conn2Cov μ) (conn2Cov ν) c] + module + | curv q c => + rw [newToOld2_curv, oldToNew2_curv2Poly, curv2Var] + exact dif_pos q.2 + | sym2 t c => rw [newToOld2_sym2, oldToNew2_sym3Old] + | hook i c => + obtain ⟨⟨ρ, q⟩, hi⟩ := i + rw [newToOld2_hook, oldToNew2_hookInc, hookInc, dif_neg hi] + +/-! + +## G. The second-order coordinate equivalence + +-/ + +/-- The second-order ordinary and covariant polynomial presentations are isomorphic. -/ +noncomputable def covEquiv2 : A₂ ≃ₐ[ℝ] A₂cov := + AlgEquiv.ofAlgHom oldToNew2 newToOld2 + (by refine algHom_ext fun i ↦ ?_; rw [AlgHom.comp_apply, oldToNew2_newToOld2, AlgHom.id_apply]) + (by refine algHom_ext fun i ↦ ?_; rw [AlgHom.comp_apply, newToOld2_oldToNew2, AlgHom.id_apply]) + +@[simp] lemma covEquiv2_apply (P : A₂) : covEquiv2 P = oldToNew2 P := rfl + +@[simp] lemma covEquiv2_symm_apply (Q : A₂cov) : covEquiv2.symm Q = newToOld2 Q := rfl + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean new file mode 100644 index 000000000..a2895acfb --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean @@ -0,0 +1,960 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.SeriesGaugeAction +/-! +# The all-orders ordinary gluon jet algebra + +## i. Overview + +This file builds the ordinary gluon jet algebra at *arbitrary* finite derivative order: the +commutative +real algebra generated by the colour components of the connection `A_μ` and of all of its ordinary +symmetric derivatives `∂_s A_μ` at a point. It carries + +* the formal total derivative `jetDeriv`; +* the all-orders local jet-gauge substitution `gaugePull`, obtained as the coefficient + transcription of `GaugeAction` and `SeriesGaugeAction`'s power-series action `actPot U A μ = U A_μ + ⋆U + mcH U μ`. + +## ii. Conventions + +Hermitian throughout, matching the Physlib gluon convention and `CoordinateChange` through +`HookBianchi`. The colour carrier is `ColourBasis`'s traceless +hermitian `ColourSpace` with basis index `Col = Fin 8`; the colour bracket is +`brMat M N = i (M N - N M)`. + +## iii. The factorial normalization + +The derivative multi-index is `DIdx = Lor →₀ ℕ`; `facI s = ∏_ρ (s ρ)!` is its factorial. A +generator means an **ordinary derivative**, not a Taylor coefficient: + +```text +dA s μ c ↝ coordC c (∂_s A_μ (0)), ∂_s A_μ (0) = facI s • coeffMat s (A μ). +``` + +This is the normalization forced by asking `jetDeriv` to append the derivative index with +coefficient one. At `s = 0` and `s = single ν 1` the factor is `1`, so the convention agrees with +`GaugeAction`'s `Coord.conn` and `Coord.der` on the nose. + +## iv. The composition orientation + +`GaugeAction`'s `gaugeAct U` is substitution by the *transformed point*, `eval x (gaugeAct U P) = +eval (actPt U x) P`. Since `actPot` is a **left** action on potentials, the raw polynomial +substitution is contravariant, and the law proved below is + +```text +gaugePull (U * V) = (gaugePull V).comp (gaugePull U). +``` + +No covariant composition law is asserted. A literal `MulAction` through inverse jets is *not* +packaged: `CovariantTower`'s covariance statement and `GaugeAction` compatibility both want the raw +substitution. + +## v. Results + +* `JetGenerators`, `JetComponentSpace.basis`, `JetAlgebra`, `ofGen` — the carrier; +* `jetDeriv`, `jetDeriv_ofGen`, `jetDeriv_one`, `jetDeriv_mul`, `jetDeriv_comm_apply`; +* `brR`, `adR`, `constR` — the colour-vector calculus over an arbitrary commutative `ℝ`-algebra, + with the same structure constants `cstruct` and `adCoef` as `CoordinateChange`/`GaugeAction`; +* `conjC` — the `t`-th Taylor coefficient of conjugation by a gauge jet, a colour endomorphism; +* `gaugeSubstGen`, `gaugePull` — the all-orders substitution; +* `evalA_gaugePull` — faithfulness: substituting is pulling back along the honest affine action; +* `gaugePull_one`, `gaugePull_mul` — the identity and (contravariant) composition laws; +* `gaugeSubstGen_zero`, `gaugeSubstGen_single` — degree-zero and degree-one agreement with + `GaugeAction`. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPolynomial + +open scoped TensorProduct + +namespace SU3Jet + +/-! + +## A. The ordinary generators + +-/ + +/-- The symmetric ordinary derivative multi-index. This is the `Lor →₀ ℕ` form of a multiset of + spacetime directions; it is the index type of `MvPowerSeries.coeff`, `coeffMat` and + `mcCoeffCAt`, which is why it is preferred to `Multiset Lor` here. -/ +abbrev DIdx : Type := Lor →₀ ℕ + +/-- The multiset form of a derivative multi-index, recording the equivalence with the + `Multiset Lor` presentation. -/ +noncomputable def didxMultiset : DIdx ≃ Multiset Lor := Multiset.toFinsupp.toEquiv.symm + +/-- An ordinary generator: the colour-`c` component of the `s`-th ordinary derivative of the + connection in the direction `μ`. -/ +inductive JetGenerators where + /-- The generator `(∂_s A_μ)^c`. -/ + | dA (s : DIdx) (μ : Lor) (c : Col) : JetGenerators +deriving DecidableEq + +namespace JetGenerators + +/-- The generator with one further ordinary derivative in the direction `ν`. -/ +noncomputable def shift (ν : Lor) : JetGenerators → JetGenerators + | dA s μ c => dA (s + Finsupp.single ν 1) μ c + +@[simp] +lemma shift_dA (ν : Lor) (s : DIdx) (μ : Lor) (c : Col) : + shift ν (dA s μ c) = dA (s + Finsupp.single ν 1) μ c := rfl + +/-- **Ordinary derivatives commute.** The derivative index really is symmetric: shifting by `μ` + and then `ν` is shifting by `ν` and then `μ`. -/ +lemma shift_comm (ν ρ : Lor) (g : JetGenerators) : shift ν (shift ρ g) = shift ρ (shift ν g) := by + cases g with + | dA s μ c => rw [shift_dA, shift_dA, shift_dA, shift_dA, add_right_comm] + +/-- The generators are the derivative multi-index, the Lorentz index and the colour index. -/ +def equiv : JetGenerators ≃ DIdx × Lor × Col where + toFun := fun (dA s μ c) => (s, μ, c) + invFun := fun p => dA p.1 p.2.1 p.2.2 + left_inv := fun (dA _ _ _) => rfl + right_inv := fun _ => rfl + +end JetGenerators + +/-! + +## B. The component space and the polynomial carrier + +The component space is the house-style tensor product of the real derivative-symbol algebra with +the dual of the connection components, following `BBoson.JetComponentSpace`. The colour factor is +the dual of `ColourBasis`'s physical traceless hermitian `ColourSpace`. + +-/ + +/-- The space of component functions of an ordinary gluon jet: derivative symbols tensored with + the dual of a Lorentz index and the dual of a colour direction. -/ +def JetComponentSpace : Type := + DerivAlgebraReal ⊗[ℝ] (Module.Dual ℝ Lorentz.CoVector ⊗[ℝ] Module.Dual ℝ ColourSpace) + +noncomputable instance : AddCommGroup JetComponentSpace := + inferInstanceAs (AddCommGroup + (DerivAlgebraReal ⊗[ℝ] (Module.Dual ℝ Lorentz.CoVector ⊗[ℝ] Module.Dual ℝ ColourSpace))) + +noncomputable instance : Module ℝ JetComponentSpace := + inferInstanceAs (Module ℝ + (DerivAlgebraReal ⊗[ℝ] (Module.Dual ℝ Lorentz.CoVector ⊗[ℝ] Module.Dual ℝ ColourSpace))) + +/-- The explicit basis of the ordinary jet component space, indexed by the ordinary generators. -/ +noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponentSpace := + (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.tensorProduct + (Lorentz.CoVector.basis.dualBasis.tensorProduct colourBasis.dualBasis)).reindex + JetGenerators.equiv.symm + +/-- The all-orders ordinary gluon jet algebra. -/ +def JetAlgebra : Type := SymmetricAlgebra ℝ JetComponentSpace + +noncomputable instance : CommRing JetAlgebra := + inferInstanceAs (CommRing (SymmetricAlgebra ℝ JetComponentSpace)) + +noncomputable instance : Algebra ℝ JetAlgebra := + inferInstanceAs (Algebra ℝ (SymmetricAlgebra ℝ JetComponentSpace)) + +/-- The generator of the jet algebra attached to an ordinary generator. -/ +noncomputable def ofGen (g : JetGenerators) : JetAlgebra := + SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g) + +/-- The polynomial coordinates of the ordinary jet algebra. -/ +noncomputable def toPoly : JetAlgebra ≃ₐ[ℝ] MvPolynomial JetGenerators ℝ := + SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis + +@[simp] +lemma toPoly_ofGen (g : JetGenerators) : toPoly (ofGen g) = X g := + SymmetricAlgebra.equivMvPolynomial_ι_apply _ _ + +@[simp] +lemma toPoly_symm_X (g : JetGenerators) : toPoly.symm (X g) = ofGen g := + SymmetricAlgebra.equivMvPolynomial_symm_X _ _ + +/-- Two algebra maps out of the jet algebra agreeing on every generator are equal. -/ +lemma jetAlgHom_ext {A : Type*} [CommSemiring A] [Algebra ℝ A] {f g : JetAlgebra →ₐ[ℝ] A} + (h : ∀ i : JetGenerators, f (ofGen i) = g (ofGen i)) : f = g := + SymmetricAlgebra.algHom_ext (JetComponentSpace.basis.ext h) + +/-- Evaluation of a jet polynomial at a point of the ordinary coordinate space. -/ +noncomputable def evalA (x : JetGenerators → ℝ) : JetAlgebra →ₐ[ℝ] ℝ := + (MvPolynomial.aeval x).comp toPoly.toAlgHom + +lemma evalA_eq_eval (x : JetGenerators → ℝ) (P : JetAlgebra) : + evalA x P = MvPolynomial.eval x (toPoly P) := rfl + +@[simp] +lemma evalA_ofGen (x : JetGenerators → ℝ) (g : JetGenerators) : evalA x (ofGen g) = x g := by + rw [evalA_eq_eval, toPoly_ofGen, eval_X] + +/-- Elements of the jet algebra agreeing at every point of the coordinate space are equal; + legitimate because `ℝ` is an infinite integral domain. -/ +lemma jetAlgebra_funext {P Q : JetAlgebra} (h : ∀ x, evalA x P = evalA x Q) : P = Q := by + apply toPoly.injective + exact MvPolynomial.funext fun x => by + have hx := h x + rwa [evalA_eq_eval, evalA_eq_eval] at hx + +/-! + +## C. The formal total derivative + +Following `BBoson.JetAlgebra.jetDeriv`: the derivation appending the derivative index, built +through the polynomial coordinates rather than postulated. + +-/ + +/-- The derivative substitution on polynomial coordinates. -/ +noncomputable def polyDeriv (ν : Lor) : + Derivation ℝ (MvPolynomial JetGenerators ℝ) (MvPolynomial JetGenerators ℝ) := + MvPolynomial.mkDerivation ℝ fun g : JetGenerators => + (X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ) + +@[simp] +lemma polyDeriv_X (ν : Lor) (g : JetGenerators) : + polyDeriv ν (X g) = X (JetGenerators.shift ν g) := + MvPolynomial.mkDerivation_X _ _ _ + +lemma polyDeriv_comm (ν ρ : Lor) (p : MvPolynomial JetGenerators ℝ) : + polyDeriv ν (polyDeriv ρ p) = polyDeriv ρ (polyDeriv ν p) := by + induction p using MvPolynomial.induction_on with + | C a => + rw [← algebraMap_eq, Derivation.map_algebraMap, map_zero, Derivation.map_algebraMap, + map_zero] + | add p q hp hq => rw [map_add, map_add, map_add, map_add, hp, hq] + | mul_X p g hp => + simp only [Derivation.leibniz, polyDeriv_X, smul_eq_mul, map_add] + rw [JetGenerators.shift_comm, hp] + ring + +/-- **The formal total spacetime derivative** on the ordinary jet algebra: the derivation sending + each component function `∂_s A_μ` to `∂_{s + ν} A_μ`. -/ +noncomputable def jetDeriv (ν : Lor) : JetAlgebra →ₗ[ℝ] JetAlgebra := + toPoly.symm.toLinearMap ∘ₗ (polyDeriv ν).toLinearMap ∘ₗ toPoly.toLinearMap + +lemma toPoly_jetDeriv (ν : Lor) (P : JetAlgebra) : + toPoly (jetDeriv ν P) = polyDeriv ν (toPoly P) := by + simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, + Derivation.coeFn_coe, AlgEquiv.apply_symm_apply] + +/-- **The total derivative appends the derivative index.** -/ +@[simp] +lemma jetDeriv_ofGen (ν : Lor) (g : JetGenerators) : + jetDeriv ν (ofGen g) = ofGen (JetGenerators.shift ν g) := by + apply toPoly.injective + rw [toPoly_jetDeriv, toPoly_ofGen, polyDeriv_X, toPoly_ofGen] + +@[simp] +lemma jetDeriv_one (ν : Lor) : jetDeriv ν (1 : JetAlgebra) = 0 := by + apply toPoly.injective + simp only [toPoly_jetDeriv, map_one, map_zero, Derivation.map_one_eq_zero] + +/-- **The Leibniz rule** for the total derivative. -/ +lemma jetDeriv_mul (ν : Lor) (P Q : JetAlgebra) : + jetDeriv ν (P * Q) = jetDeriv ν P * Q + P * jetDeriv ν Q := by + apply toPoly.injective + simp only [toPoly_jetDeriv, map_mul, map_add, Derivation.leibniz, smul_eq_mul] + ring + +/-- **Total derivatives commute.** -/ +lemma jetDeriv_comm_apply (ν ρ : Lor) (P : JetAlgebra) : + jetDeriv ν (jetDeriv ρ P) = jetDeriv ρ (jetDeriv ν P) := by + apply toPoly.injective + rw [toPoly_jetDeriv, toPoly_jetDeriv, toPoly_jetDeriv, toPoly_jetDeriv, polyDeriv_comm] + +/-! + +## D. Colour vectors over an arbitrary commutative real algebra + +`CoordinateChange`'s `brP`, `GaugeAction`'s `adP` and `constP` are stated for `MvPolynomial ι ℝ`. +The ordinary carrier is a +`SymmetricAlgebra`, and the evaluation dictionary below lands in a power-series ring, so the same +formulas are restated over an arbitrary commutative `ℝ`-algebra. The structure constants are +`CoordinateChange`'s `cstruct` and `GaugeAction`'s `adCoef` unchanged: nothing is re-expanded by +hand. + +-/ + +section ColourAlg + +variable {R S : Type*} [CommRing R] [Algebra ℝ R] [CommRing S] [Algebra ℝ S] + +/-- The colour bracket of two colour vectors valued in a commutative `ℝ`-algebra. -/ +noncomputable def brR (p q : Col → R) : Col → R := + fun c => ∑ a, ∑ b, algebraMap ℝ R (cstruct a b c) * (p a * q b) + +/-- The adjoint action of a constant colour rotation on a colour vector. -/ +noncomputable def adR (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → R) : Col → R := + fun c => ∑ c', algebraMap ℝ R (adCoef u c c') * p c' + +/-- A constant colour vector. -/ +noncomputable def constR (Y : ColourSpace) : Col → R := fun c => algebraMap ℝ R (coordC c Y) + +lemma brR_swap (p q : Col → R) (c : Col) : brR p q c = -brR q p c := by + have key : (brR q p c : R) = ∑ a, ∑ b, -(algebraMap ℝ R (cstruct a b c) * (p a * q b)) := by + rw [brR, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rw [cstruct_swap b a c, map_neg] + ring + rw [key, brR] + simp [Finset.sum_neg_distrib] + +lemma brR_self (p : Col → R) (c : Col) : brR p p c = 0 := by + have h : (2 : ℝ) • brR p p c = 0 := by + rw [two_smul] + nth_rewrite 1 [brR_swap p p c] + exact neg_add_cancel _ + have h2 := congrArg (fun x : R => (2⁻¹ : ℝ) • x) h + simpa [smul_smul] using h2 + +lemma brR_add_left (p p' q : Col → R) (c : Col) : + brR (p + p') q c = brR p q c + brR p' q c := by + simp only [brR, Pi.add_apply, add_mul, mul_add, Finset.sum_add_distrib] + +lemma brR_add_right (p q q' : Col → R) (c : Col) : + brR p (q + q') c = brR p q c + brR p q' c := by + simp only [brR, Pi.add_apply, mul_add, Finset.sum_add_distrib] + +lemma adR_one (p : Col → R) (c : Col) : adR 1 p c = p c := by + rw [adR] + have h : ∀ c' : Col, (algebraMap ℝ R (adCoef 1 c c')) * p c' = if c = c' then p c' else 0 := by + intro c' + rw [adCoef_one] + by_cases hc : c = c' <;> simp [hc] + rw [Finset.sum_congr rfl fun c' (_ : c' ∈ Finset.univ) => h c'] + simp + +lemma algHom_brR (φ : R →ₐ[ℝ] S) (p q : Col → R) (c : Col) : + φ (brR p q c) = brR (fun a => φ (p a)) (fun b => φ (q b)) c := by + rw [brR, brR, map_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_sum] + exact Finset.sum_congr rfl fun b _ => by rw [map_mul, map_mul, AlgHom.commutes] + +lemma algHom_adR (φ : R →ₐ[ℝ] S) (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → R) (c : Col) : + φ (adR u p c) = adR u (fun a => φ (p a)) c := by + rw [adR, adR, map_sum] + exact Finset.sum_congr rfl fun c' _ => by rw [map_mul, AlgHom.commutes] + +lemma algHom_constR (φ : R →ₐ[ℝ] S) (Y : ColourSpace) (c : Col) : + φ (constR Y c) = constR Y c := AlgHom.commutes _ _ + +end ColourAlg + +/-- On the polynomial carrier the general colour bracket is `CoordinateChange`'s `brP`. -/ +lemma brP_eq_brR {ι : Type*} (p q : Col → MvPolynomial ι ℝ) (c : Col) : + brP p q c = brR p q c := by + rw [brP, brR] + simp only [MvPolynomial.algebraMap_eq] + +/-- On the polynomial carrier the general adjoint action is `GaugeAction`'s `adP`. -/ +lemma adP_eq_adR {ι : Type*} (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial ι ℝ) + (c : Col) : adP u p c = adR u p c := by + rw [adP, adR] + simp only [MvPolynomial.algebraMap_eq] + +/-- On the polynomial carrier the general constant colour vector is `GaugeAction`'s `constP`. -/ +lemma constP_eq_constR {ι : Type*} (Y : ColourSpace) (c : Col) : + (constP Y c : MvPolynomial ι ℝ) = constR Y c := by + rw [constP, constR, MvPolynomial.algebraMap_eq] + +/-! + +## E. Coefficients of a conjugated constant colour matrix + +The generalized Leibniz rule for `∂_s (U A_μ ⋆U)` is carried entirely by power-series +multiplication. The only new object needed is the `t`-th Taylor coefficient of the conjugate of a +*constant* matrix by the gauge jet. It preserves the physical colour carrier: hermiticity because +the two outer factors enter symmetrically, and tracelessness because `⋆U U = 1` makes the trace of +the conjugate a constant series. + +-/ + +/-- A constant complex matrix, viewed as a matrix of jets. -/ +noncomputable def constMat (M : Matrix (Fin 3) (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) JetRing := + M.map (MvPowerSeries.C : ℂ →+* JetRing) + +@[simp] +lemma constMat_apply (M : Matrix (Fin 3) (Fin 3) ℂ) (i j : Fin 3) : + constMat M i j = (MvPowerSeries.C (M i j) : JetRing) := rfl + +lemma constMat_add (M N : Matrix (Fin 3) (Fin 3) ℂ) : + constMat (M + N) = constMat M + constMat N := + Matrix.ext fun i j => by + show (MvPowerSeries.C (M i j + N i j) : JetRing) = _ + rw [map_add]; rfl + +lemma smul_C_jet (r : ℝ) (z : ℂ) : + (MvPowerSeries.C ((r • z : ℂ)) : JetRing) = r • (MvPowerSeries.C z : JetRing) := by + ext k + rw [(MvPowerSeries.coeff k).map_smul_of_tower, MvPowerSeries.coeff_C, MvPowerSeries.coeff_C] + split_ifs <;> simp + +lemma constMat_smul (r : ℝ) (M : Matrix (Fin 3) (Fin 3) ℂ) : + constMat (r • M) = r • constMat M := + Matrix.ext fun i j => by + show (MvPowerSeries.C ((r • M i j : ℂ)) : JetRing) = _ + rw [smul_C_jet]; rfl + +lemma star_constMat (M : Matrix (Fin 3) (Fin 3) ℂ) : star (constMat M) = constMat (star M) := + Matrix.ext fun i j => by + show star (MvPowerSeries.C (M j i) : JetRing) = MvPowerSeries.C (star (M j i)) + rw [JetRing.star_C] + +lemma trace_constMat (M : Matrix (Fin 3) (Fin 3) ℂ) : + trace (constMat M) = (MvPowerSeries.C (trace M) : JetRing) := by + rw [Matrix.trace, Matrix.trace, map_sum] + exact Finset.sum_congr rfl fun i _ => rfl + +lemma coeffMat_add (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat k (M + N) = coeffMat k M + coeffMat k N := + Matrix.ext fun i j => by + show MvPowerSeries.coeff k (M i j + N i j) = _ + rw [map_add] + rfl + +lemma coeffMat_smul (k : DIdx) (r : ℝ) (M : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat k (r • M) = r • coeffMat k M := + Matrix.ext fun i j => by + show MvPowerSeries.coeff k (r • M i j) = _ + rw [(MvPowerSeries.coeff k).map_smul_of_tower] + rfl + +lemma star_coeffMat (k : DIdx) (M : Matrix (Fin 3) (Fin 3) JetRing) : + star (coeffMat k M) = coeffMat k (star M) := + Matrix.ext fun i j => (JetRing.coeff_star k (M j i)).symm + +lemma coeffMat_zero_eq_jetValue (M : Matrix (Fin 3) (Fin 3) JetRing) : + coeffMat 0 M = Gluon.jetValue M := + Matrix.ext fun i j => MvPowerSeries.coeff_zero_eq_constantCoeff_apply (M i j) + +/-- **The `t`-th Taylor coefficient of a conjugated constant colour matrix.** -/ +noncomputable def conjCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) + (M : Matrix (Fin 3) (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ := + coeffMat t (U.1 * constMat M * star U.1) + +lemma conjCoeffM_add (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) + (M N : Matrix (Fin 3) (Fin 3) ℂ) : + conjCoeffM U t (M + N) = conjCoeffM U t M + conjCoeffM U t N := by + rw [conjCoeffM, conjCoeffM, conjCoeffM, constMat_add, Matrix.mul_add, Matrix.add_mul, + coeffMat_add] + +lemma conjCoeffM_smul (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) (r : ℝ) + (M : Matrix (Fin 3) (Fin 3) ℂ) : + conjCoeffM U t (r • M) = r • conjCoeffM U t M := by + rw [conjCoeffM, conjCoeffM, constMat_smul, Matrix.mul_smul, Matrix.smul_mul, coeffMat_smul] + +/-- The conjugate of a hermitian matrix stays hermitian at every Taylor order. -/ +lemma star_conjCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) + {M : Matrix (Fin 3) (Fin 3) ℂ} (hM : star M = M) : + star (conjCoeffM U t M) = conjCoeffM U t M := by + rw [conjCoeffM, star_coeffMat, star_mul, star_mul, star_star, star_constMat, hM, + Matrix.mul_assoc] + +/-- The trace of the conjugate is a constant series: this is where `⋆U U = 1` is used. -/ +lemma trace_conjCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) + (M : Matrix (Fin 3) (Fin 3) ℂ) : + trace (conjCoeffM U t M) = + MvPowerSeries.coeff t (MvPowerSeries.C (trace M) : JetRing) := by + rw [conjCoeffM, trace_coeffMat, Matrix.trace_mul_cycle, coe_star_mul_self, Matrix.one_mul, + trace_constMat] + +lemma trace_conjCoeffM_of_traceless (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) + {M : Matrix (Fin 3) (Fin 3) ℂ} (hM : trace M = 0) : trace (conjCoeffM U t M) = 0 := by + rw [trace_conjCoeffM, hM, map_zero, map_zero] + +/-- **The coefficient conjugation operator on the physical colour carrier.** -/ +noncomputable def conjC (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) : + ColourSpace →ₗ[ℝ] ColourSpace where + toFun X := mkCM (conjCoeffM U t (cmat X)) (star_conjCoeffM U t (cmat_star X)) + (trace_conjCoeffM_of_traceless U t (cmat_trace X)) + map_add' X Y := cmat_injective (by + show conjCoeffM U t (cmat (X + Y)) = conjCoeffM U t (cmat X) + conjCoeffM U t (cmat Y) + rw [cmat_add, conjCoeffM_add]) + map_smul' r X := cmat_injective (by + show conjCoeffM U t (cmat (r • X)) = r • conjCoeffM U t (cmat X) + rw [cmat_smul, conjCoeffM_smul]) + +@[simp] +lemma cmat_conjC (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) (X : ColourSpace) : + cmat (conjC U t X) = conjCoeffM U t (cmat X) := rfl + +/-- At derivative order zero the coefficient conjugation is the adjoint action of the base-point + value of the gauge jet. -/ +lemma conjC_zero (U : specialUnitaryGroup (Fin 3) JetRing) (X : ColourSpace) : + conjC U 0 X = adC (JetGaugeGroupI.evalSU (Fin 3) U) X := by + apply cmat_injective + rw [cmat_conjC, cmat_adC, conjCoeffM, coeffMat_zero_eq_jetValue, Gluon.jetValue_mul, + Gluon.jetValue_mul, Gluon.jetValue_star, constMat, jetValue_map_C, jetValue_coe_eq, + star_eq_conjTranspose] + +/-! + +## F. The factorial normalization and the colour-potential dictionary + +`facI s` is the factorial of a derivative multi-index, so that `∂_s A_μ(0) = facI s • coeff_s A_μ`. +A generator is the *ordinary derivative*, which is the convention forced by asking `jetDeriv` to +append the derivative index with coefficient one. + +-/ + +/-- The factorial of a spacetime derivative multi-index. -/ +noncomputable def facI (s : DIdx) : ℝ := ∏ ρ, (Nat.factorial (s ρ) : ℝ) + +lemma facI_pos (s : DIdx) : 0 < facI s := + Finset.prod_pos fun ρ _ => by exact_mod_cast Nat.factorial_pos (s ρ) + +lemma facI_ne_zero (s : DIdx) : facI s ≠ 0 := ne_of_gt (facI_pos s) + +@[simp] +lemma facI_zero : facI (0 : DIdx) = 1 := + Finset.prod_eq_one fun ρ _ => by simp + +/-- Appending one derivative index multiplies the factorial by the new multiplicity. -/ +lemma facI_add_single (s : DIdx) (ν : Lor) : + facI (s + Finsupp.single ν 1) = ((s ν : ℝ) + 1) * facI s := by + classical + rw [facI, facI, + show (∏ ρ : Lor, (Nat.factorial (((s + Finsupp.single ν 1) : DIdx) ρ) : ℝ)) = + ∏ ρ : Lor, ((if ρ = ν then ((s ν : ℝ) + 1) else 1) * (Nat.factorial (s ρ) : ℝ)) from + Finset.prod_congr rfl fun ρ _ => by + rcases eq_or_ne ρ ν with rfl | h + · rw [Finsupp.add_apply, Finsupp.single_eq_same, Nat.factorial_succ, if_pos rfl] + push_cast + ring + · rw [Finsupp.add_apply, Finsupp.single_eq_of_ne h, add_zero, if_neg h, one_mul], + Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ ν] + simp + +@[simp] +lemma facI_single (ν : Lor) : facI (Finsupp.single ν 1) = 1 := by + have h := facI_add_single 0 ν + rw [zero_add, facI_zero, mul_one, Finsupp.coe_zero, Pi.zero_apply] at h + rw [h] + norm_num + +/-- A jet with prescribed Taylor coefficients. -/ +def mkJet (f : DIdx → ℂ) : JetRing := f + +@[simp] +lemma coeff_mkJet (f : DIdx → ℂ) (k : DIdx) : MvPowerSeries.coeff k (mkJet f) = f k := rfl + +lemma cmat_sum {ι : Type*} (t : Finset ι) (f : ι → ColourSpace) : + cmat (∑ i ∈ t, f i) = ∑ i ∈ t, cmat (f i) := by + classical + induction t using Finset.induction with + | empty => rw [Finset.sum_empty, Finset.sum_empty, cmat_zero] + | insert a t ha ih => rw [Finset.sum_insert ha, Finset.sum_insert ha, cmat_add, ih] + +lemma star_eq_self_of_coeffMat {M : Matrix (Fin 3) (Fin 3) JetRing} + (h : ∀ k, star (coeffMat k M) = coeffMat k M) : star M = M := by + refine Matrix.ext fun i j => MvPowerSeries.ext fun k => ?_ + have hk := congrFun (congrFun (h k) i) j + show MvPowerSeries.coeff k (star (M j i)) = MvPowerSeries.coeff k (M i j) + rw [JetRing.coeff_star] + exact hk + +lemma trace_eq_zero_of_coeffMat {M : Matrix (Fin 3) (Fin 3) JetRing} + (h : ∀ k, trace (coeffMat k M) = 0) : trace M = 0 := by + refine MvPowerSeries.ext fun k => ?_ + rw [map_zero, ← trace_coeffMat, h k] + +/-- A gluon potential jet all of whose Taylor coefficients lie in the physical traceless hermitian + colour carrier. -/ +structure ColourPot where + /-- The underlying matrix-of-jets potential. -/ + pot : Potential + /-- Hermiticity, at every Taylor order. -/ + star_pot : ∀ μ, star (pot μ) = pot μ + /-- Tracelessness, at every Taylor order. -/ + trace_pot : ∀ μ, trace (pot μ) = 0 + +lemma ColourPot.ext' {A B : ColourPot} (h : A.pot = B.pot) : A = B := by + cases A + cases B + subst h + rfl + +/-- The `s`-th Taylor coefficient of a colour potential, in the colour carrier. -/ +noncomputable def ColourPot.coeffC (A : ColourPot) (s : DIdx) (μ : Lor) : ColourSpace := + mkCM (coeffMat s (A.pot μ)) (by rw [star_coeffMat, A.star_pot]) + (by rw [trace_coeffMat, A.trace_pot, map_zero]) + +@[simp] +lemma ColourPot.cmat_coeffC (A : ColourPot) (s : DIdx) (μ : Lor) : + cmat (A.coeffC s μ) = coeffMat s (A.pot μ) := rfl + +/-- **The point of the ordinary coordinate space described by a colour potential.** The generator + `∂_s A_μ` reads off the *ordinary derivative*, which is `facI s` times the Taylor + coefficient. -/ +noncomputable def potPt (A : ColourPot) : JetGenerators → ℝ + | .dA s μ c => facI s * coordC c (A.coeffC s μ) + +/-- The colour vector of the `s`-th ordinary derivative of the connection at a coordinate + point. -/ +noncomputable def cfgC (x : JetGenerators → ℝ) (s : DIdx) (μ : Lor) : ColourSpace := + mkC fun c => x (JetGenerators.dA s μ c) + +/-- **The generic colour potential of a point of the ordinary coordinate space.** -/ +noncomputable def potOf (x : JetGenerators → ℝ) : ColourPot where + pot := fun μ => Matrix.of fun i j => mkJet fun k => cmat ((facI k)⁻¹ • cfgC x k μ) i j + star_pot μ := star_eq_self_of_coeffMat fun k => by + show star (cmat ((facI k)⁻¹ • cfgC x k μ)) = cmat ((facI k)⁻¹ • cfgC x k μ) + exact cmat_star _ + trace_pot μ := trace_eq_zero_of_coeffMat fun k => by + show trace (cmat ((facI k)⁻¹ • cfgC x k μ)) = 0 + exact cmat_trace _ + +@[simp] +lemma coeffMat_potOf (x : JetGenerators → ℝ) (k : DIdx) (μ : Lor) : + coeffMat k ((potOf x).pot μ) = cmat ((facI k)⁻¹ • cfgC x k μ) := rfl + +@[simp] +lemma coeffC_potOf (x : JetGenerators → ℝ) (k : DIdx) (μ : Lor) : + (potOf x).coeffC k μ = (facI k)⁻¹ • cfgC x k μ := + cmat_injective (coeffMat_potOf x k μ) + +/-- Reading off the coordinates of the generic potential returns the point. -/ +@[simp] +lemma potPt_potOf (x : JetGenerators → ℝ) : potPt (potOf x) = x := by + funext g + cases g with + | dA s μ c => + show facI s * coordC c ((potOf x).coeffC s μ) = _ + rw [coeffC_potOf, map_smul, smul_eq_mul, cfgC, coordC_mkC, ← mul_assoc, + mul_inv_cancel₀ (facI_ne_zero s), one_mul] + +/-- Building the generic potential from the coordinates of a colour potential returns it. -/ +@[simp] +lemma potOf_potPt (A : ColourPot) : potOf (potPt A) = A := by + refine ColourPot.ext' ?_ + funext μ + refine Matrix.ext fun i j => MvPowerSeries.ext fun k => ?_ + have h : cfgC (potPt A) k μ = facI k • A.coeffC k μ := by + rw [cfgC, show (fun c => potPt A (JetGenerators.dA k μ c)) = + (fun c => coordC c (facI k • A.coeffC k μ)) from funext fun c => by + rw [map_smul, smul_eq_mul] + rfl] + exact mkC_coordC _ + have h2 : cmat ((facI k)⁻¹ • cfgC (potPt A) k μ) = coeffMat k (A.pot μ) := by + rw [h, smul_smul, inv_mul_cancel₀ (facI_ne_zero k), one_smul, ColourPot.cmat_coeffC] + exact congrFun (congrFun h2 i) j + +/-- The local gauge action preserves the physical colour carrier at every Taylor order. -/ +noncomputable def actPotC (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : + ColourPot where + pot := actPot U A.pot + star_pot μ := by + rw [actPot, star_add, star_mcH, star_mul, star_mul, star_star, A.star_pot, Matrix.mul_assoc] + trace_pot μ := by + rw [actPot, trace_add, trace_mcH, Matrix.trace_mul_cycle, coe_star_mul_self, Matrix.one_mul, + A.trace_pot, add_zero] + +@[simp] +lemma actPotC_pot (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : + (actPotC U A).pot = actPot U A.pot := rfl + +lemma actPotC_one (A : ColourPot) : actPotC 1 A = A := + ColourPot.ext' (actPot_one A.pot) + +lemma actPotC_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : + actPotC (U * V) A = actPotC U (actPotC V A) := + ColourPot.ext' (actPot_mul U V A.pot) + +/-! + +## G. The coefficient convolution + +The generalized Leibniz rule for `∂_s (U A_μ ⋆U)` is carried by power-series multiplication: the +`s`-th coefficient of the conjugate is the convolution of the coefficients of `A_μ` with the +coefficient conjugation operator of section E. No multinomial bookkeeping is written by hand. + +-/ + +private lemma coeff_mul_mul_split (f g h : JetRing) (s : DIdx) : + MvPowerSeries.coeff s (f * g * h) = + ∑ p ∈ Finset.antidiagonal s, + MvPowerSeries.coeff p.1 g * MvPowerSeries.coeff p.2 (f * h) := by + rw [show f * g * h = g * (f * h) by ring, MvPowerSeries.coeff_mul] + +private lemma mul_mul_apply (P N Q : Matrix (Fin 3) (Fin 3) JetRing) (i j : Fin 3) : + (P * N * Q) i j = ∑ l, ∑ k, P i k * N k l * Q l j := by + rw [Matrix.mul_apply] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [Matrix.mul_apply, Finset.sum_mul] + +/-- **The coefficient convolution of a conjugated potential.** -/ +lemma coeffMat_conj_split (U : specialUnitaryGroup (Fin 3) JetRing) + (N : Matrix (Fin 3) (Fin 3) JetRing) (s : DIdx) : + coeffMat s (U.1 * N * star U.1) = + ∑ p ∈ Finset.antidiagonal s, conjCoeffM U p.2 (coeffMat p.1 N) := by + refine Matrix.ext fun i j => ?_ + have hR : (∑ p ∈ Finset.antidiagonal s, conjCoeffM U p.2 (coeffMat p.1 N)) i j = + ∑ p ∈ Finset.antidiagonal s, ∑ l, ∑ k, + MvPowerSeries.coeff p.1 (N k l) * + MvPowerSeries.coeff p.2 (U.1 i k * star U.1 l j) := by + rw [Matrix.sum_apply] + refine Finset.sum_congr rfl fun p _ => ?_ + show MvPowerSeries.coeff p.2 ((U.1 * constMat (coeffMat p.1 N) * star U.1) i j) = _ + rw [mul_mul_apply, map_sum] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [show U.1 i k * constMat (coeffMat p.1 N) k l * star U.1 l j = + (MvPowerSeries.C (MvPowerSeries.coeff p.1 (N k l)) : JetRing) * + (U.1 i k * star U.1 l j) from by + show U.1 i k * (MvPowerSeries.C (MvPowerSeries.coeff p.1 (N k l)) : JetRing) * + star U.1 l j = _ + ring, MvPowerSeries.coeff_C_mul] + rw [hR] + show MvPowerSeries.coeff s ((U.1 * N * star U.1) i j) = _ + rw [mul_mul_apply, map_sum] + rw [Finset.sum_comm (s := Finset.antidiagonal s)] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [map_sum, Finset.sum_comm (s := Finset.antidiagonal s)] + exact Finset.sum_congr rfl fun k _ => coeff_mul_mul_split _ _ _ s + +/-- **The coefficient transcription of the power-series action.** -/ +lemma coeffMat_actPot (U : specialUnitaryGroup (Fin 3) JetRing) (A : Potential) (μ : Lor) + (s : DIdx) : + coeffMat s (actPot U A μ) = + (∑ p ∈ Finset.antidiagonal s, conjCoeffM U p.2 (coeffMat p.1 (A μ))) + mcCoeffM U μ s := by + rw [actPot, coeffMat_add, coeffMat_conj_split] + rfl + +/-- The same statement in the physical colour carrier. -/ +lemma coeffC_actPotC (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) (μ : Lor) + (s : DIdx) : + (actPotC U A).coeffC s μ = + (∑ p ∈ Finset.antidiagonal s, conjC U p.2 (A.coeffC p.1 μ)) + mcCoeffCAt U μ s := by + apply cmat_injective + rw [ColourPot.cmat_coeffC, cmat_add, cmat_sum, cmat_mcCoeffCAt, actPotC_pot, coeffMat_actPot] + refine congrArg₂ _ (Finset.sum_congr rfl fun p _ => ?_) rfl + rw [cmat_conjC, ColourPot.cmat_coeffC] + +/-! + +## H. The all-orders jet-gauge substitution + +The image of the generator `∂_s A_μ` is the coefficient transcription of +`actPot U A μ = U A_μ ⋆U + mcH U μ` read in the colour basis, with the factorial normalization of +section F. + +-/ + +/-- The colour vector of the generators at derivative index `s` and Lorentz direction `μ`. -/ +noncomputable def genVec (s : DIdx) (μ : Lor) : Col → JetAlgebra := + fun c => ofGen (JetGenerators.dA s μ c) + +@[simp] +lemma evalA_algebraMap (x : JetGenerators → ℝ) (r : ℝ) : + evalA x (algebraMap ℝ JetAlgebra r) = r := (evalA x).commutes r + +/-- **The all-orders gauge substitution on generators.** -/ +noncomputable def gaugeSubstGen (U : specialUnitaryGroup (Fin 3) JetRing) : + JetGenerators → JetAlgebra + | .dA s μ c => + (∑ p ∈ Finset.antidiagonal s, ∑ c', + algebraMap ℝ JetAlgebra + (facI s * (facI p.1)⁻¹ * coordC c (conjC U p.2 (colourBasis c'))) * + genVec p.1 μ c') + + constR (facI s • mcCoeffCAt U μ s) c + +/-- **The all-orders jet-gauge substitution**, as an algebra endomorphism. -/ +noncomputable def gaugePull (U : specialUnitaryGroup (Fin 3) JetRing) : + JetAlgebra →ₐ[ℝ] JetAlgebra := + (MvPolynomial.aeval (gaugeSubstGen U)).comp toPoly.toAlgHom + +@[simp] +lemma gaugePull_ofGen (U : specialUnitaryGroup (Fin 3) JetRing) (g : JetGenerators) : + gaugePull U (ofGen g) = gaugeSubstGen U g := by + show MvPolynomial.aeval (gaugeSubstGen U) (toPoly (ofGen g)) = _ + rw [toPoly_ofGen, aeval_X] + +lemma coordC_conjC_mkC (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) (f : Col → ℝ) + (c : Col) : + coordC c (conjC U t (mkC f)) = ∑ c', f c' * coordC c (conjC U t (colourBasis c')) := by + rw [mkC_eq_sum, map_sum, map_sum] + exact Finset.sum_congr rfl fun c' _ => by rw [map_smul, map_smul, smul_eq_mul] + +/-- **The transformed point of the ordinary coordinate space**: build the generic potential, act + by the honest affine power-series action, and read off the coordinates again. -/ +noncomputable def actPtA (U : specialUnitaryGroup (Fin 3) JetRing) + (x : JetGenerators → ℝ) : JetGenerators → ℝ := potPt (actPotC U (potOf x)) + +/-- **The substitution really is the coordinate form of the action.** This is the all-orders + analogue of `GaugeAction`'s `potCoord_actPot`. -/ +lemma evalA_gaugeSubstGen (U : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) + (g : JetGenerators) : evalA x (gaugeSubstGen U g) = actPtA U x g := by + cases g with + | dA s μ c => + have hR : actPtA U x (JetGenerators.dA s μ c) = + (∑ p ∈ Finset.antidiagonal s, facI s * ((facI p.1)⁻¹ * + ∑ c', x (JetGenerators.dA p.1 μ c') * + coordC c (conjC U p.2 (colourBasis c')))) + + facI s * coordC c (mcCoeffCAt U μ s) := by + show facI s * coordC c ((actPotC U (potOf x)).coeffC s μ) = _ + rw [coeffC_actPotC, map_add, map_sum, mul_add, Finset.mul_sum] + refine congrArg₂ _ (Finset.sum_congr rfl fun p _ => ?_) rfl + rw [coeffC_potOf, map_smul, map_smul, smul_eq_mul, cfgC, coordC_conjC_mkC] + rw [hR, gaugeSubstGen, map_add, map_sum] + refine congrArg₂ _ (Finset.sum_congr rfl fun p _ => ?_) ?_ + · rw [map_sum, Finset.mul_sum, Finset.mul_sum] + refine Finset.sum_congr rfl fun c' _ => ?_ + rw [map_mul, evalA_algebraMap, genVec, evalA_ofGen] + ring + · rw [constR, evalA_algebraMap, map_smul, smul_eq_mul] + +/-- **Faithfulness of the substitution.** -/ +lemma evalA_gaugePull (U : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) + (P : JetAlgebra) : evalA x (gaugePull U P) = evalA (actPtA U x) P := by + have h : (evalA x).comp (gaugePull U) = evalA (actPtA U x) := + jetAlgHom_ext fun g => by + rw [AlgHom.comp_apply, gaugePull_ofGen, evalA_gaugeSubstGen, evalA_ofGen] + exact DFunLike.congr_fun h P + +@[simp] +lemma potOf_actPtA (U : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) : + potOf (actPtA U x) = actPotC U (potOf x) := by + rw [actPtA, potOf_potPt] + +lemma actPtA_one (x : JetGenerators → ℝ) : + actPtA (1 : specialUnitaryGroup (Fin 3) JetRing) x = x := by + rw [actPtA, actPotC_one, potPt_potOf] + +/-- The transformed point is a **left** action, inherited from `actPot_mul`. -/ +lemma actPtA_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) : + actPtA (U * V) x = actPtA U (actPtA V x) := by + show potPt (actPotC (U * V) (potOf x)) = potPt (actPotC U (potOf (actPtA V x))) + rw [potOf_actPtA, actPotC_mul] + +/-- **The identity substitution.** -/ +lemma gaugePull_one : + gaugePull (1 : specialUnitaryGroup (Fin 3) JetRing) = AlgHom.id ℝ JetAlgebra := by + refine AlgHom.ext fun P => jetAlgebra_funext fun x => ?_ + rw [evalA_gaugePull, actPtA_one, AlgHom.id_apply] + +/-- **The composition law of the substitution.** The raw substitution is pullback along a left + action on points, so it composes *contravariantly*. This is the orientation forced by the + definitions; no covariant composition law holds for `gaugePull`. -/ +lemma gaugePull_mul (U V : specialUnitaryGroup (Fin 3) JetRing) : + gaugePull (U * V) = (gaugePull V).comp (gaugePull U) := by + refine AlgHom.ext fun P => jetAlgebra_funext fun x => ?_ + rw [AlgHom.comp_apply, evalA_gaugePull, evalA_gaugePull, evalA_gaugePull, actPtA_mul] + +/-! + +## I. Degree-zero and degree-one agreement with `GaugeAction` + +-/ + +lemma sum_coordC_adC {R : Type*} [CommRing R] [Algebra ℝ R] + (u : specialUnitaryGroup (Fin 3) ℂ) (q : Col → R) (c : Col) : + (∑ c', algebraMap ℝ R (coordC c (adC u (colourBasis c'))) * q c') = adR u q c := + Finset.sum_congr rfl fun c' _ => by rw [adCoef] + +lemma sum_coordC_br_adC {R : Type*} [CommRing R] [Algebra ℝ R] (Y : ColourSpace) + (u : specialUnitaryGroup (Fin 3) ℂ) (q : Col → R) (c : Col) : + (∑ c', algebraMap ℝ R (coordC c (br Y (adC u (colourBasis c')))) * q c') = + brR (constR Y) (adR u q) c := by + rw [show (∑ c', algebraMap ℝ R (coordC c (br Y (adC u (colourBasis c')))) * q c') = + ∑ c', ∑ a, ∑ b, (algebraMap ℝ R (coordC a Y) * algebraMap ℝ R (adCoef u b c') * + algebraMap ℝ R (cstruct a b c)) * q c' from + Finset.sum_congr rfl fun c' _ => by + rw [coordC_br, map_sum, Finset.sum_mul] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_sum, Finset.sum_mul] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [map_mul, map_mul, adCoef], Finset.sum_comm, brR] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [constR, adR, Finset.mul_sum, Finset.mul_sum] + exact Finset.sum_congr rfl fun c' _ => by ring + +/-- **Degree-zero agreement with `GaugeAction`.** On the connection generators the all-orders + substitution + is `GaugeAction`'s `gaugeSubst (Coord.conn μ c)`. -/ +lemma gaugeSubstGen_zero (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (c : Col) : + gaugeSubstGen U (JetGenerators.dA 0 μ c) = + adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ) c + constR (mcC U μ) c := by + rw [gaugeSubstGen, Finsupp.antidiagonal_zero, Finset.sum_singleton, mcCoeffCAt_zero, facI_zero, + one_smul] + refine congrArg₂ _ ?_ rfl + refine (Finset.sum_congr rfl fun c' _ => ?_).trans (sum_coordC_adC _ (genVec 0 μ) c) + simp only [inv_one, one_mul, conjC_zero] + +/-- A sum over the antidiagonal of a degree-one multi-index has exactly two terms. -/ +lemma sum_antidiagonal_single {M : Type*} [AddCommMonoid M] (ν : Lor) (f : DIdx × DIdx → M) : + ∑ p ∈ Finset.antidiagonal (Finsupp.single ν 1 : DIdx), f p = + f (0, Finsupp.single ν 1) + f (Finsupp.single ν 1, 0) := by + rw [Finsupp.antidiagonal_single, show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, + Finset.sum_map, Finset.sum_insert (by decide), Finset.sum_singleton] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, + Finsupp.single_zero] + +/-- The degree-one coefficient conjugation is minus the colour bracket with the first + Maurer–Cartan coefficient. -/ +lemma conjC_single (U : specialUnitaryGroup (Fin 3) JetRing) (ν : Lor) (X : ColourSpace) : + conjC U (Finsupp.single ν 1) X = + -br (mcC U ν) (adC (JetGaugeGroupI.evalSU (Fin 3) U) X) := by + apply cmat_injective + have hu : Gluon.jetValue U.1 = + ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) := jetValue_coe_eq U + show conjCoeffM U (Finsupp.single ν 1) (cmat X) = + -brMat (cmat (mcC U ν)) (cmat (adC (JetGaugeGroupI.evalSU (Fin 3) U) X)) + rw [conjCoeffM, ← jetDeriv_eq_coeffMat, Gluon.jetDeriv_mul, Gluon.jetDeriv_mul, constMat, + Gluon.jetDeriv_map_C, jetValue_map_C, Gluon.jetValue_mul, jetValue_map_C, + Gluon.jetValue_star, jetDeriv_coe, jetDeriv_star_coe, cmat_mcC, cmat_adC, brMat, hu, + star_eq_conjTranspose] + simp only [Matrix.smul_mul, Matrix.mul_smul, Matrix.mul_zero, add_zero, Matrix.mul_assoc] + module + +/-- **Degree-one agreement with `GaugeAction`.** On the first-derivative generators the all-orders + substitution is `GaugeAction`'s `gaugeSubst (Coord.der ν μ c)`: conjugation by the base-point + value, a + bracket with the first Maurer–Cartan coefficient, and a translation by the second. -/ +lemma gaugeSubstGen_single (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) (c : Col) : + gaugeSubstGen U (JetGenerators.dA (Finsupp.single ν 1) μ c) = + adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec (Finsupp.single ν 1) μ) c - + brR (constR (mcC U ν)) (adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ)) c + + constR (mc2C U ν μ) c := by + have e1 : (∑ c', algebraMap ℝ JetAlgebra + (coordC c (conjC U (Finsupp.single ν 1) (colourBasis c'))) * genVec 0 μ c') = + -brR (constR (mcC U ν)) (adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ)) c := by + calc (∑ c', algebraMap ℝ JetAlgebra + (coordC c (conjC U (Finsupp.single ν 1) (colourBasis c'))) * genVec 0 μ c') + = ∑ c', -(algebraMap ℝ JetAlgebra (coordC c (br (mcC U ν) + (adC (JetGaugeGroupI.evalSU (Fin 3) U) (colourBasis c')))) * genVec 0 μ c') := + Finset.sum_congr rfl fun c' _ => by rw [conjC_single, map_neg, map_neg, neg_mul] + _ = -∑ c', algebraMap ℝ JetAlgebra (coordC c (br (mcC U ν) + (adC (JetGaugeGroupI.evalSU (Fin 3) U) (colourBasis c')))) * genVec 0 μ c' := + Finset.sum_neg_distrib _ + _ = -brR (constR (mcC U ν)) (adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ)) c := + congrArg Neg.neg (sum_coordC_br_adC _ _ _ _) + have e2 : (∑ c', algebraMap ℝ JetAlgebra (coordC c (conjC U 0 (colourBasis c'))) * + genVec (Finsupp.single ν 1) μ c') = + adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec (Finsupp.single ν 1) μ) c := + (Finset.sum_congr rfl fun c' _ => by rw [conjC_zero]).trans (sum_coordC_adC _ _ _) + rw [gaugeSubstGen, sum_antidiagonal_single ν (fun p : DIdx × DIdx => + ∑ c', algebraMap ℝ JetAlgebra + (facI (Finsupp.single ν 1) * (facI p.1)⁻¹ * + coordC c (conjC U p.2 (colourBasis c'))) * genVec p.1 μ c')] + simp only [facI_single, facI_zero, inv_one, one_mul, one_smul, mcCoeffCAt_single] + rw [e1, e2] + ring + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean new file mode 100644 index 000000000..4e482d50d --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean @@ -0,0 +1,385 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.HookBianchi +/-! +# The full-series gauge action and Maurer--Cartan coefficients + +## i. Overview + +This file proves the group-action laws for `GaugeAction`'s power-series-valued `actPot`, the +full-series Maurer--Cartan cocycle, and an arbitrary-coefficient API in the physical traceless +hermitian colour carrier. It does not construct an all-orders polynomial carrier. + +The multiplication convention is the left action + +```text +actPot (U * V) A = actPot U (actPot V A), +``` + +and the corresponding hermitian Maurer--Cartan cocycle is + +```text +mcH (U * V) μ = mcH U μ + U * mcH V μ * star U. +``` +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Module MvPowerSeries + +namespace SU3Jet + +/-! + +## A. Full-series Maurer--Cartan and action laws + +-/ + +/-- The Lie-algebra Maurer--Cartan series vanishes on the identity gauge jet. -/ +lemma mcP_one (μ : Lor) : mcP (1 : specialUnitaryGroup (Fin 3) JetRing) μ = 0 := by + rw [mcP] + change dMat μ (1 : Matrix (Fin 3) (Fin 3) JetRing) * star + (1 : Matrix (Fin 3) (Fin 3) JetRing) = 0 + rw [dMat_one, Matrix.zero_mul] + +/-- The hermitian Maurer--Cartan series vanishes on the identity gauge jet. -/ +lemma mcH_one (μ : Lor) : mcH (1 : specialUnitaryGroup (Fin 3) JetRing) μ = 0 := by + rw [mcH, mcP_one, smul_zero] + +/-- The full-series Lie-algebra Maurer--Cartan cocycle. -/ +lemma mcP_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : + mcP (U * V) μ = mcP U μ + U.1 * mcP V μ * star U.1 := by + rw [mcP, mcP, mcP] + change dMat μ (U.1 * V.1) * star (U.1 * V.1) = _ + rw [dMat_mul, star_mul, Matrix.add_mul] + have hV : V.1 * star V.1 = 1 := Gluon.coe_mul_star_self V + calc + dMat μ U.1 * V.1 * (star V.1 * star U.1) + + U.1 * dMat μ V.1 * (star V.1 * star U.1) = + dMat μ U.1 * (V.1 * star V.1) * star U.1 + + U.1 * (dMat μ V.1 * star V.1) * star U.1 := by + noncomm_ring + _ = dMat μ U.1 * star U.1 + U.1 * (dMat μ V.1 * star V.1) * star U.1 := by + rw [hV, Matrix.mul_one] + +/-- The full-series hermitian Maurer--Cartan cocycle, with the orientation forced by `actPot`. -/ +lemma mcH_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : + mcH (U * V) μ = mcH U μ + U.1 * mcH V μ * star U.1 := by + rw [mcH, mcH, mcH, mcP_mul, smul_add] + simp only [Matrix.smul_mul, Matrix.mul_smul] + +/-- The identity gauge jet acts trivially on a full power-series potential. -/ +lemma actPot_one (A : Potential) : actPot (1 : specialUnitaryGroup (Fin 3) JetRing) A = A := by + funext μ + rw [actPot, mcH_one] + change (1 : Matrix (Fin 3) (Fin 3) JetRing) * A μ * star + (1 : Matrix (Fin 3) (Fin 3) JetRing) + 0 = A μ + simp + +/-- The full power-series potential transformation is a left group action. -/ +lemma actPot_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (A : Potential) : + actPot (U * V) A = actPot U (actPot V A) := by + funext μ + rw [actPot, actPot, actPot, mcH_mul] + change (U.1 * V.1) * A μ * star (U.1 * V.1) + + (mcH U μ + U.1 * mcH V μ * star U.1) = + U.1 * (V.1 * A μ * star V.1 + mcH V μ) * star U.1 + mcH U μ + rw [star_mul] + noncomm_ring + +/-! + +## B. Arbitrary traceless-hermitian coefficients + +-/ + +/-- The hermitian Maurer--Cartan series is self-adjoint. -/ +lemma star_mcH (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : + star (mcH U μ) = mcH U μ := by + have hp := star_mcP U μ + apply Matrix.ext + intro i j + have hpij := congrFun (congrFun hp i) j + change star ((MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) j i) = + (MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) i j + rw [star_mul', JetRing.star_C, Complex.star_def, Complex.conj_I, + show star ((mcP U μ) j i) = -(mcP U μ) i j from hpij] + simp + +/-- The hermitian Maurer--Cartan series is traceless. -/ +lemma trace_mcH (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : trace (mcH U μ) = 0 := by + rw [mcH, trace_smul, trace_mcP, smul_zero] + +/-- The matrix coefficient of the hermitian Maurer--Cartan series at an arbitrary Lorentz +multi-index. -/ +noncomputable def mcCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) + (k : Lor →₀ ℕ) : Matrix (Fin 3) (Fin 3) ℂ := coeffMat k (mcH U μ) + +lemma trace_coeffMat (k : Lor →₀ ℕ) (M : Matrix (Fin 3) (Fin 3) JetRing) : + trace (coeffMat k M) = MvPowerSeries.coeff k (trace M) := by + rw [Matrix.trace, Matrix.trace, map_sum] + exact Finset.sum_congr rfl fun i _ ↦ rfl + +/-- Every arbitrary coefficient of `mcH` is hermitian. -/ +lemma star_mcCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : + star (mcCoeffM U μ k) = mcCoeffM U μ k := by + have hs := star_mcH U μ + ext i j + have hsij := congrFun (congrFun hs i) j + change star (MvPowerSeries.coeff k ((mcH U μ) j i)) = + MvPowerSeries.coeff k ((mcH U μ) i j) + rw [← JetRing.coeff_star] + exact congrArg (MvPowerSeries.coeff k) hsij + +/-- Every arbitrary coefficient of `mcH` is traceless. -/ +lemma trace_mcCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : + trace (mcCoeffM U μ k) = 0 := by + rw [mcCoeffM, trace_coeffMat, trace_mcH, map_zero] + +/-- The arbitrary coefficient of `mcH`, packaged in the physical traceless-hermitian colour +carrier. -/ +noncomputable def mcCoeffCAt (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) + (k : Lor →₀ ℕ) : ColourSpace := + mkCM (mcCoeffM U μ k) (star_mcCoeffM U μ k) (trace_mcCoeffM U μ k) + +@[simp] +lemma cmat_mcCoeffCAt (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : + cmat (mcCoeffCAt U μ k) = mcCoeffM U μ k := rfl + +/-! + +## C. Coefficient consequences of the cocycle + +-/ + +/-- Coefficient extraction from the series Maurer--Cartan cocycle. The conjugated term remains +at series level, avoiding an unnecessary general three-fold convolution formula. -/ +lemma mcCoeffM_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : + mcCoeffM (U * V) μ k = mcCoeffM U μ k + + coeffMat k (U.1 * mcH V μ * star U.1) := by + rw [mcCoeffM, mcCoeffM, mcH_mul] + ext i j + simp [coeffMat, Matrix.add_apply] + +/-- Every arbitrary Maurer--Cartan coefficient of a constant gauge jet vanishes. -/ +lemma mcCoeffM_ofConstantSU (v : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) (k : Lor →₀ ℕ) : + mcCoeffM (JetGaugeGroupI.ofConstantSU (Fin 3) v) μ k = 0 := by + rw [mcCoeffM, mcH, mcP_ofConstantSU, smul_zero] + ext i j + simp [coeffMat] + +/-- Constant gauge jets have zero arbitrary colour coefficient. -/ +lemma mcCoeffCAt_ofConstantSU (v : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) (k : Lor →₀ ℕ) : + mcCoeffCAt (JetGaugeGroupI.ofConstantSU (Fin 3) v) μ k = 0 := by + apply cmat_injective + rw [cmat_mcCoeffCAt, mcCoeffM_ofConstantSU, cmat_zero] + +/-- The full hermitian Maurer--Cartan series of a constant gauge jet vanishes. -/ +lemma mcH_ofConstantSU (v : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : + mcH (JetGaugeGroupI.ofConstantSU (Fin 3) v) μ = 0 := by + rw [mcH, mcP_ofConstantSU, smul_zero] + +/-- Conjugation of an arbitrary gauge jet by a constant colour rotation, at series level. -/ +lemma mcH_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) + (V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : + mcH (conjBy v V) μ = + (v : Matrix (Fin 3) (Fin 3) ℂ).map (MvPowerSeries.C : ℂ →+* JetRing) * mcH V μ * + ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ.map (MvPowerSeries.C : ℂ →+* JetRing) := by + have hinv : (JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ = + JetGaugeGroupI.ofConstantSU (Fin 3) v⁻¹ := (map_inv _ v).symm + rw [conjBy, hinv, mcH_mul, mcH_mul, mcH_ofConstantSU, mcH_ofConstantSU] + simp only [Matrix.mul_zero, Matrix.zero_mul, add_zero, zero_add, ofConstantSU_coe] + congr 1 + ext i j + simp [Matrix.star_apply, JetRing.star_C] + +/-- Arbitrary coefficients commute with multiplication on both sides by constant matrices. -/ +lemma coeffMat_conj_const (P R : Matrix (Fin 3) (Fin 3) ℂ) + (M : Matrix (Fin 3) (Fin 3) JetRing) (k : Lor →₀ ℕ) : + coeffMat k (P.map (MvPowerSeries.C : ℂ →+* JetRing) * M * + R.map (MvPowerSeries.C : ℂ →+* JetRing)) = P * coeffMat k M * R := by + ext i j + simp only [coeffMat, Matrix.mul_apply, map_sum, MvPowerSeries.coeff_mul_C, + MvPowerSeries.coeff_C_mul, Matrix.map_apply] + +/-- Conjugation by a constant `SU(3)` element conjugates every arbitrary matrix coefficient. -/ +lemma mcCoeffM_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) + (V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : + mcCoeffM (conjBy v V) μ k = + (v : Matrix (Fin 3) (Fin 3) ℂ) * mcCoeffM V μ k * + ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by + rw [mcCoeffM, mcH_conjBy, coeffMat_conj_const] + rfl + +/-- Conjugation by a constant `SU(3)` element acts on every arbitrary colour coefficient by +`adC`. -/ +lemma mcCoeffCAt_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) + (V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : + mcCoeffCAt (conjBy v V) μ k = adC v (mcCoeffCAt V μ k) := by + apply cmat_injective + rw [cmat_mcCoeffCAt, cmat_adC, cmat_mcCoeffCAt, mcCoeffM_conjBy] + +/-! + +## D. Leading coefficients under lower-coefficient vanishing + +-/ + +/-- All coefficients strictly below `k` in the componentwise multi-index order vanish. -/ +def LowerCoeffZero (M : Matrix (Fin 3) (Fin 3) JetRing) (k : Lor →₀ ℕ) : Prop := + ∀ q, q ≤ k → q ≠ k → coeffMat q M = 0 + +private lemma finsupp_left_le_of_add_eq {p q k : Lor →₀ ℕ} (h : p + q = k) : p ≤ k := by + intro i + have hi := DFunLike.congr_fun h i + rw [Finsupp.add_apply] at hi + omega + +private lemma finsupp_right_le_of_add_eq {p q k : Lor →₀ ℕ} (h : p + q = k) : q ≤ k := by + intro i + have hi := DFunLike.congr_fun h i + rw [Finsupp.add_apply] at hi + omega + +private lemma coeff_mul_of_right_lower_zero (f g : JetRing) (k : Lor →₀ ℕ) + (hg : ∀ q, q ≤ k → q ≠ k → MvPowerSeries.coeff q g = 0) : + MvPowerSeries.coeff k (f * g) = + MvPowerSeries.constantCoeff f * MvPowerSeries.coeff k g := by + classical + rw [MvPowerSeries.coeff_mul, Finset.sum_eq_single (0, k), + MvPowerSeries.coeff_zero_eq_constantCoeff] + · rintro ⟨p, q⟩ hp hpair + have hpq : p + q = k := Finset.mem_antidiagonal.mp hp + by_cases hq : q = k + · subst q + have hp0 : p = 0 := by + ext i + have hi : p i + k i = k i := by + simpa only [Finsupp.add_apply] using DFunLike.congr_fun hpq i + change p i = 0 + omega + exact (hpair (Prod.ext hp0 rfl)).elim + · rw [hg q (finsupp_right_le_of_add_eq hpq) hq, mul_zero] + · simp + +private lemma coeff_mul_of_left_lower_zero (f g : JetRing) (k : Lor →₀ ℕ) + (hf : ∀ p, p ≤ k → p ≠ k → MvPowerSeries.coeff p f = 0) : + MvPowerSeries.coeff k (f * g) = + MvPowerSeries.coeff k f * MvPowerSeries.constantCoeff g := by + classical + rw [MvPowerSeries.coeff_mul, Finset.sum_eq_single (k, 0), + MvPowerSeries.coeff_zero_eq_constantCoeff] + · rintro ⟨p, q⟩ hp hpair + have hpq : p + q = k := Finset.mem_antidiagonal.mp hp + by_cases hp' : p = k + · subst p + have hq0 : q = 0 := by + ext i + have hi : k i + q i = k i := by + simpa only [Finsupp.add_apply] using DFunLike.congr_fun hpq i + change q i = 0 + omega + exact (hpair (Prod.ext rfl hq0)).elim + · rw [hf p (finsupp_left_le_of_add_eq hpq) hp', zero_mul] + · simp + +private lemma coeffMat_mul_of_right_lower_zero (P M : Matrix (Fin 3) (Fin 3) JetRing) + (k : Lor →₀ ℕ) (hM : LowerCoeffZero M k) : + coeffMat k (P * M) = Gluon.jetValue P * coeffMat k M := by + apply Matrix.ext + intro i j + simp only [coeffMat, Matrix.map_apply, Matrix.mul_apply, Gluon.jetValue] + rw [map_sum] + refine Finset.sum_congr rfl fun a _ ↦ ?_ + apply coeff_mul_of_right_lower_zero + intro q hq hqk + have hMq := hM q hq hqk + exact congrFun (congrFun hMq a) j + +private lemma coeffMat_mul_of_left_lower_zero (M R : Matrix (Fin 3) (Fin 3) JetRing) + (k : Lor →₀ ℕ) (hM : LowerCoeffZero M k) : + coeffMat k (M * R) = coeffMat k M * Gluon.jetValue R := by + apply Matrix.ext + intro i j + simp only [coeffMat, Matrix.map_apply, Matrix.mul_apply, Gluon.jetValue] + rw [map_sum] + refine Finset.sum_congr rfl fun a _ ↦ ?_ + apply coeff_mul_of_left_lower_zero + intro q hq hqk + have hMq := hM q hq hqk + exact congrFun (congrFun hMq i) a + +private lemma lowerCoeffZero_mul_left (P M : Matrix (Fin 3) (Fin 3) JetRing) + (k : Lor →₀ ℕ) (hM : LowerCoeffZero M k) : LowerCoeffZero (P * M) k := by + intro q hq hqk + have hMq : LowerCoeffZero M q := by + intro r hr hrq + apply hM r (hr.trans hq) + intro hrk + subst r + exact hqk (le_antisymm hq hr) + rw [coeffMat_mul_of_right_lower_zero P M q hMq, hM q hq hqk, Matrix.mul_zero] + +/-- **Leading coefficient of a conjugated series.** If all coefficients of the middle series +strictly below `k` vanish, then the `k`-coefficient of `P M R` only sees the constant coefficients +of the two outer series. -/ +lemma coeffMat_conj_leading (P M R : Matrix (Fin 3) (Fin 3) JetRing) (k : Lor →₀ ℕ) + (hM : LowerCoeffZero M k) : + coeffMat k (P * M * R) = Gluon.jetValue P * coeffMat k M * Gluon.jetValue R := by + rw [coeffMat_mul_of_left_lower_zero (P * M) R k (lowerCoeffZero_mul_left P M k hM), + coeffMat_mul_of_right_lower_zero P M k hM] + +/-- **Leading-order coefficient form of the Maurer--Cartan cocycle.** Under explicit vanishing of +all lower coefficients of `mcH V μ`, the conjugated contribution at `k` is conjugation of the +`k`-coefficient by the base-point value of `U`. -/ +lemma mcCoeffM_mul_leading (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) + (k : Lor →₀ ℕ) (hV : LowerCoeffZero (mcH V μ) k) : + mcCoeffM (U * V) μ k = mcCoeffM U μ k + + Gluon.jetValue U.1 * mcCoeffM V μ k * star (Gluon.jetValue U.1) := by + rw [mcCoeffM_mul, coeffMat_conj_leading U.1 (mcH V μ) (star U.1) k hV, + Gluon.jetValue_star] + rfl + +/-- The leading-order cocycle in the physical colour carrier: the second summand is acted on only +by the constant `SU(3)` value of the first jet. -/ +lemma mcCoeffCAt_mul_leading (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) + (k : Lor →₀ ℕ) (hV : LowerCoeffZero (mcH V μ) k) : + mcCoeffCAt (U * V) μ k = mcCoeffCAt U μ k + + adC (JetGaugeGroupI.evalSU (Fin 3) U) (mcCoeffCAt V μ k) := by + apply cmat_injective + rw [cmat_mcCoeffCAt, cmat_add, cmat_mcCoeffCAt, cmat_adC, cmat_mcCoeffCAt, + mcCoeffM_mul_leading U V μ k hV, jetValue_coe_eq, star_eq_conjTranspose] + +/-! + +## E. Compatibility with the degree-one and degree-two coefficients + +-/ + +/-- The zero multi-index coefficient of `mcH` is `GaugeAction`'s first Maurer--Cartan colour + coefficient. -/ +lemma mcCoeffCAt_zero (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : + mcCoeffCAt U μ 0 = mcC U μ := by + apply cmat_injective + rw [cmat_mcCoeffCAt, cmat_mcC, mcCoeffM, ← jetValue_mcH] + ext i j + simp [coeffMat, Gluon.jetValue] + +/-- A degree-one coefficient of `mcH` is `GaugeAction`'s second Maurer--Cartan colour coefficient. + -/ +lemma mcCoeffCAt_single (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) : + mcCoeffCAt U μ (Finsupp.single ν 1) = mc2C U ν μ := by + apply cmat_injective + rw [cmat_mcCoeffCAt, cmat_mc2C, mcCoeffM, ← jetDeriv_mcH] + exact (jetDeriv_eq_coeffMat ν (mcH U μ)).symm + +end SU3Jet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean new file mode 100644 index 000000000..83c99f206 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean @@ -0,0 +1,816 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.HighestLayer + +/-! +# Arbitrary-order triangular gluon coordinates + +This file constructs an independent hook complement to `HighestLayer`'s fully symmetric translation +directions on `OrdinaryJets`'s unchanged ordinary carrier. For a nonzero total multi-index `w`, the +distinguished supported direction is `layerDir w`; the other supported directions index the hook +differences. The weighted symmetric average and those differences have an explicit inverse. + +The second half replaces every linear hook difference by the corresponding symmetrized covariant +curvature derivative from `CovariantTower` and proves that this nonlinear substitution is +unitriangular in the +additive ordinary-derivative-degree filtration. +-/ + +open scoped BigOperators +open Finsupp MvPolynomial SymmetricAlgebra + +@[expose] public section + +namespace StandardModel +namespace SU3Jet + +/-! +## A. An independent arbitrary-order hook index +-/ + +/-- Remove one occurrence of a supported direction from a derivative multi-index. -/ +noncomputable def predAt (w : DIdx) (mu : Lor) : DIdx := + Finsupp.update w mu (w mu - 1) + +lemma predAt_add_single {w : DIdx} {mu : Lor} (hmu : w mu ≠ 0) : + predAt w mu + Finsupp.single mu 1 = w := by + ext nu + by_cases h : nu = mu + · subst nu + simpa [predAt, Finsupp.update] using + Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr hmu) + · simp [predAt, h] + +lemma lorDeg_predAt {w : DIdx} {mu : Lor} (hmu : w mu ≠ 0) : + lorDeg (predAt w mu) + 1 = lorDeg w := by + have h := congrArg lorDeg (predAt_add_single hmu) + rwa [lorDeg_add, lorDeg_single] at h + +/-- A nonzero fully symmetric total index. -/ +abbrev SymIdx := {w : DIdx // w ≠ 0} + +/-- The independent hook coordinates over `w`: one for each supported direction other than the +distinguished direction. There are no quotient relations or redundant Bianchi coordinates. -/ +structure AllHookIdx where + w : DIdx + mu : Lor + w_ne_zero : w ≠ 0 + mu_supported : w mu ≠ 0 + mu_ne_dir : mu ≠ layerDir w + +/-- The ordinary component with total index `w` and connection direction `mu`. -/ +noncomputable def totalComponent (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := + ofGen (.dA (predAt w mu) mu c) + +/-- The fully symmetric projection of the connection derivative with total index `w`. -/ +noncomputable def symConn (w : DIdx) (c : Col) : JetAlgebra := + (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, (w mu : ℝ) • totalComponent w mu c + +/-- The independent linear hook difference relative to `layerDir w`. -/ +noncomputable def hookDiff (i : AllHookIdx) (c : Col) : JetAlgebra := + totalComponent i.w i.mu c - totalComponent i.w (layerDir i.w) c + +/-- The weighted hook correction appearing in the inverse coordinate formula. -/ +noncomputable def hookAverage (w : DIdx) (c : Col) : JetAlgebra := + (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, + (w mu : ℝ) • (totalComponent w mu c - totalComponent w (layerDir w) c) + +lemma symConn_eq_distinguished_add_hookAverage {w : DIdx} (hw : w ≠ 0) (c : Col) : + symConn w c = totalComponent w (layerDir w) c + hookAverage w c := by + rw [symConn, hookAverage] + have hdeg : (lorDeg w : ℝ) ≠ 0 := by + exact_mod_cast (Nat.ne_of_gt ((lorDeg_pos_iff w).2 hw)) + have hsum : ∑ mu : Lor, (w mu : ℝ) = lorDeg w := by + norm_cast + simp_rw [smul_sub] + rw [Finset.sum_sub_distrib, ← Finset.sum_smul, hsum, smul_sub, + inv_smul_smul₀ hdeg] + module + +lemma distinguished_eq_symConn_sub_hookAverage {w : DIdx} (hw : w ≠ 0) (c : Col) : + totalComponent w (layerDir w) c = symConn w c - hookAverage w c := by + rw [symConn_eq_distinguished_add_hookAverage hw] + abel + +lemma totalComponent_eq_symConn_add_hook_sub {w : DIdx} (hw : w ≠ 0) + {mu : Lor} (_hmu : w mu ≠ 0) (c : Col) : + totalComponent w mu c = symConn w c + + (totalComponent w mu c - totalComponent w (layerDir w) c) - hookAverage w c := by + rw [symConn_eq_distinguished_add_hookAverage hw] + abel + +/-! +## B. The additive ordinary-derivative-degree filtration + +The weight of a product is the sum of the derivative multi-index degrees of its ordinary +generators. Connection factors therefore have weight zero. A total derivative raises the +weight by one, while multiplication by a connection does not; this is the filtration in which +covariant derivatives are triangular. +-/ + +/-- Ordinary derivative degree of a generator. -/ +noncomputable def genDeg : JetGenerators → ℕ + | .dA s _ _ => lorDeg s + +@[simp] +lemma genDeg_dA (s : DIdx) (mu : Lor) (c : Col) : genDeg (.dA s mu c) = lorDeg s := rfl + +lemma genDeg_shift (nu : Lor) (g : JetGenerators) : + genDeg (JetGenerators.shift nu g) = genDeg g + 1 := by + cases g with + | dA s mu c => simp [genDeg, lorDeg_add, lorDeg_single] + +/-- Monomial generators of derivative degree at most `d`. -/ +def filtGen (d : ℕ) : Set JetAlgebra := + {P | ∃ l : List JetGenerators, + (l.map genDeg).sum ≤ d ∧ P = (l.map ofGen).prod} + +/-- Monomial generators of derivative degree strictly below `d`. -/ +def sfiltGen (d : ℕ) : Set JetAlgebra := + {P | ∃ l : List JetGenerators, + (l.map genDeg).sum < d ∧ P = (l.map ofGen).prod} + +/-- The additive derivative-degree filtration. -/ +noncomputable def filt (d : ℕ) : Submodule ℝ JetAlgebra := Submodule.span ℝ (filtGen d) + +/-- The strict additive derivative-degree filtration. -/ +noncomputable def sfilt (d : ℕ) : Submodule ℝ JetAlgebra := Submodule.span ℝ (sfiltGen d) + +lemma filt_mono {d e : ℕ} (h : d ≤ e) : filt d ≤ filt e := + Submodule.span_mono fun P hP => by + obtain ⟨l, hl, rfl⟩ := hP + exact ⟨l, hl.trans h, rfl⟩ + +lemma sfilt_mono {d e : ℕ} (h : d ≤ e) : sfilt d ≤ sfilt e := + Submodule.span_mono fun P hP => by + obtain ⟨l, hl, rfl⟩ := hP + exact ⟨l, hl.trans_le h, rfl⟩ + +lemma sfilt_le_filt (d : ℕ) : sfilt d ≤ filt d := + Submodule.span_mono fun P hP => by + obtain ⟨l, hl, rfl⟩ := hP + exact ⟨l, hl.le, rfl⟩ + +lemma sfilt_zero : sfilt 0 = ⊥ := by + rw [sfilt, show sfiltGen 0 = ∅ from Set.eq_empty_iff_forall_notMem.mpr (by + rintro P ⟨l, hl, rfl⟩ + omega), Submodule.span_empty] + +lemma sfilt_succ (d : ℕ) : sfilt (d + 1) = filt d := by + rw [sfilt, filt, show sfiltGen (d + 1) = filtGen d from Set.ext fun P => + ⟨fun ⟨l, hl, hP⟩ => ⟨l, Nat.lt_succ_iff.mp hl, hP⟩, + fun ⟨l, hl, hP⟩ => ⟨l, Nat.lt_succ_iff.mpr hl, hP⟩⟩] + +lemma one_mem_filt_zero : (1 : JetAlgebra) ∈ filt 0 := by + exact Submodule.subset_span ⟨[], by simp, by simp⟩ + +lemma ofGen_mem_filt (g : JetGenerators) : ofGen g ∈ filt (genDeg g) := by + exact Submodule.subset_span ⟨[g], by simp, by simp⟩ + +lemma mul_mem_filt {a b : ℕ} {P Q : JetAlgebra} (hP : P ∈ filt a) + (hQ : Q ∈ filt b) : P * Q ∈ filt (a + b) := by + induction hP using Submodule.span_induction with + | mem P hP => + induction hQ using Submodule.span_induction with + | mem Q hQ => + obtain ⟨l, hl, rfl⟩ := hP + obtain ⟨k, hk, rfl⟩ := hQ + refine Submodule.subset_span ⟨l ++ k, ?_, ?_⟩ + · simp only [List.map_append, List.sum_append] + omega + · simp [List.map_append, List.prod_append] + | zero => simp + | add x y _ _ hx hy => simpa [mul_add] using add_mem hx hy + | smul r x _ hx => simpa [mul_smul_comm] using Submodule.smul_mem (filt (a + b)) r hx + | zero => simp + | add x y _ _ hx hy => simpa [add_mul] using add_mem hx hy + | smul r x _ hx => simpa [smul_mul_assoc] using Submodule.smul_mem (filt (a + b)) r hx + +lemma mul_mem_sfilt_left {a b : ℕ} {P Q : JetAlgebra} (hP : P ∈ sfilt a) + (hQ : Q ∈ filt b) : P * Q ∈ sfilt (a + b) := by + induction hP using Submodule.span_induction with + | mem P hP => + induction hQ using Submodule.span_induction with + | mem Q hQ => + obtain ⟨l, hl, rfl⟩ := hP + obtain ⟨k, hk, rfl⟩ := hQ + refine Submodule.subset_span ⟨l ++ k, ?_, ?_⟩ + · simp only [List.map_append, List.sum_append] + omega + · simp [List.map_append, List.prod_append] + | zero => simp + | add x y _ _ hx hy => simpa [mul_add] using add_mem hx hy + | smul r x _ hx => simpa [mul_smul_comm] using Submodule.smul_mem (sfilt (a + b)) r hx + | zero => simp + | add x y _ _ hx hy => simpa [add_mul] using add_mem hx hy + | smul r x _ hx => simpa [smul_mul_assoc] using Submodule.smul_mem (sfilt (a + b)) r hx + +lemma mul_mem_sfilt_right {a b : ℕ} {P Q : JetAlgebra} (hP : P ∈ filt a) + (hQ : Q ∈ sfilt b) : P * Q ∈ sfilt (a + b) := by + rw [mul_comm] + simpa [add_comm] using mul_mem_sfilt_left hQ hP + +private lemma jetDeriv_prod_mem_filt (nu : Lor) (l : List JetGenerators) : + jetDeriv nu (l.map ofGen).prod ∈ filt ((l.map genDeg).sum + 1) := by + induction l with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil, jetDeriv_one] + exact zero_mem _ + | cons g l ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + rw [jetDeriv_mul, jetDeriv_ofGen] + refine add_mem ?_ ?_ + · have hg := ofGen_mem_filt (JetGenerators.shift nu g) + rw [genDeg_shift] at hg + have hl : (l.map ofGen).prod ∈ filt (l.map genDeg).sum := + Submodule.subset_span ⟨l, le_rfl, rfl⟩ + exact filt_mono (by omega) (mul_mem_filt hg hl) + · exact filt_mono (by omega) (mul_mem_filt (ofGen_mem_filt g) ih) + +lemma jetDeriv_mem_filt (nu : Lor) {d : ℕ} {P : JetAlgebra} (hP : P ∈ filt d) : + jetDeriv nu P ∈ filt (d + 1) := by + induction hP using Submodule.span_induction with + | mem P hP => + obtain ⟨l, hl, rfl⟩ := hP + exact filt_mono (by omega) (jetDeriv_prod_mem_filt nu l) + | zero => simp + | add x y _ _ hx hy => simpa using add_mem hx hy + | smul r x _ hx => simpa using Submodule.smul_mem (filt (d + 1)) r hx + +lemma jetDeriv_mem_sfilt (nu : Lor) {d : ℕ} {P : JetAlgebra} (hP : P ∈ sfilt d) : + jetDeriv nu P ∈ sfilt (d + 1) := by + induction hP using Submodule.span_induction with + | mem P hP => + obtain ⟨l, hl, rfl⟩ := hP + have h := jetDeriv_prod_mem_filt nu l + rw [← sfilt_succ] at h + exact sfilt_mono (by omega) h + | zero => simp + | add x y _ _ hx hy => simpa using add_mem hx hy + | smul r x _ hx => simpa using Submodule.smul_mem (sfilt (d + 1)) r hx + +lemma algebraMap_mem_filt_zero (r : ℝ) : algebraMap ℝ JetAlgebra r ∈ filt 0 := by + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ one_mem_filt_zero + +lemma brR_mem_filt {a b : ℕ} {p q : Col → JetAlgebra} + (hp : ∀ c, p c ∈ filt a) (hq : ∀ c, q c ∈ filt b) (c : Col) : + brR p q c ∈ filt (a + b) := by + rw [brR] + refine Submodule.sum_mem _ fun i _ => Submodule.sum_mem _ fun j _ => ?_ + have hpq := mul_mem_filt (hp i) (hq j) + have hs := mul_mem_filt (algebraMap_mem_filt_zero (cstruct i j c)) hpq + simpa using hs + +lemma connVec_mem_filt_zero (mu : Lor) (c : Col) : connVec mu c ∈ filt 0 := by + exact ofGen_mem_filt (.dA 0 mu c) + +/-- The linear leading part of the field strength. -/ +noncomputable def linCurv (nu mu : Lor) : Col → JetAlgebra := + fun c => jetDeriv nu (connVec mu c) - jetDeriv mu (connVec nu c) + +lemma linCurv_mem_filt_one (nu mu : Lor) (c : Col) : linCurv nu mu c ∈ filt 1 := by + rw [linCurv] + exact sub_mem (by simpa using jetDeriv_mem_filt nu (connVec_mem_filt_zero mu c)) + (by simpa using jetDeriv_mem_filt mu (connVec_mem_filt_zero nu c)) + +lemma curvVec_mem_filt_one (nu mu : Lor) (c : Col) : curvVec nu mu c ∈ filt 1 := by + rw [curvVec] + refine add_mem (linCurv_mem_filt_one nu mu c) ?_ + exact filt_mono (by omega) (brR_mem_filt (connVec_mem_filt_zero nu) + (connVec_mem_filt_zero mu) c) + +lemma curvVec_sub_linCurv_mem_sfilt_one (nu mu : Lor) (c : Col) : + curvVec nu mu c - linCurv nu mu c ∈ sfilt 1 := by + rw [curvVec, linCurv] + have h := brR_mem_filt (connVec_mem_filt_zero nu) (connVec_mem_filt_zero mu) c + rw [← sfilt_succ] at h + simpa using h + +lemma covD_mem_filt (rho : Lor) {d : ℕ} {X : Col → JetAlgebra} + (hX : ∀ c, X c ∈ filt d) (c : Col) : covD rho X c ∈ filt (d + 1) := by + rw [covD] + refine add_mem (jetDeriv_mem_filt rho (hX c)) ?_ + exact filt_mono (by omega) (brR_mem_filt (connVec_mem_filt_zero rho) hX c) + +lemma covIter_mem_filt (n : ℕ) (t : Fin n → Lor) (nu mu : Lor) (c : Col) : + covIter n t (curvVec nu mu) c ∈ filt (n + 1) := by + induction n generalizing c with + | zero => simpa using curvVec_mem_filt_one nu mu c + | succ n ih => + rw [covIter_succ] + exact covD_mem_filt (t 0) (fun c' => ih (t := fun i => t i.succ) (c := c')) c + +/-- Ordered ordinary derivatives, used only to identify the leading term of the covariant tower. -/ +noncomputable def plainIter : (n : ℕ) → (Fin n → Lor) → + (Col → JetAlgebra) → (Col → JetAlgebra) + | 0, _, X => X + | n + 1, t, X => fun c => jetDeriv (t 0) (plainIter n (fun i => t i.succ) X c) + +@[simp] +lemma plainIter_zero (t : Fin 0 → Lor) (X : Col → JetAlgebra) : plainIter 0 t X = X := rfl + +@[simp] +lemma plainIter_succ (n : ℕ) (t : Fin (n + 1) → Lor) (X : Col → JetAlgebra) (c : Col) : + plainIter (n + 1) t X c = jetDeriv (t 0) (plainIter n (fun i => t i.succ) X c) := rfl + +lemma covIter_sub_plainIter_mem_sfilt (n : ℕ) (t : Fin n → Lor) (nu mu : Lor) (c : Col) : + covIter n t (curvVec nu mu) c - plainIter n t (linCurv nu mu) c ∈ sfilt (n + 1) := by + induction n generalizing c with + | zero => simpa using curvVec_sub_linCurv_mem_sfilt_one nu mu c + | succ n ih => + rw [covIter_succ, plainIter_succ, covD] + have hder := jetDeriv_mem_sfilt (t 0) + (ih (t := fun i => t i.succ) (c := c)) + rw [map_sub] at hder + have hbr0 := brR_mem_filt (connVec_mem_filt_zero (t 0)) + (fun c' => covIter_mem_filt n (fun i => t i.succ) nu mu c') c + have hbr : brR (connVec (t 0)) (covIter n (fun i => t i.succ) (curvVec nu mu)) c ∈ + sfilt (n + 2) := by + rw [sfilt_succ] + simpa using hbr0 + have hsum := add_mem hder hbr + convert hsum using 1 + · abel + +/-- The derivative multi-index represented by an ordered tuple. -/ +noncomputable def tupleFinsupp {n : ℕ} (t : Fin n → Lor) : DIdx := + ∑ i, Finsupp.single (t i) 1 + +lemma tupleFinsupp_perm {n : ℕ} (t : Fin n → Lor) (sigma : Equiv.Perm (Fin n)) : + tupleFinsupp (t ∘ sigma) = tupleFinsupp t := by + rw [tupleFinsupp, tupleFinsupp] + simpa [Function.comp_def] using + sigma.sum_comp (Finset.univ : Finset (Fin n)) (fun i => Finsupp.single (t i) 1) + +lemma plainIter_linCurv (n : ℕ) (t : Fin n → Lor) (nu mu : Lor) (c : Col) : + plainIter n t (linCurv nu mu) c = + ofGen (.dA (tupleFinsupp t + Finsupp.single nu 1) mu c) - + ofGen (.dA (tupleFinsupp t + Finsupp.single mu 1) nu c) := by + induction n with + | zero => + simp [plainIter, linCurv, connVec, genVec, tupleFinsupp] + | succ n ih => + rw [plainIter_succ, ih, map_sub, jetDeriv_ofGen, jetDeriv_ofGen] + simp only [JetGenerators.shift_dA] + congr 2 <;> simp [tupleFinsupp, Fin.sum_univ_succ, add_left_comm, add_comm] + +lemma plainIter_linCurv_perm {n : ℕ} (t : Fin n → Lor) (sigma : Equiv.Perm (Fin n)) + (nu mu : Lor) (c : Col) : + plainIter n (t ∘ sigma) (linCurv nu mu) c = plainIter n t (linCurv nu mu) c := by + rw [plainIter_linCurv, plainIter_linCurv, tupleFinsupp_perm] + +/-- The symmetrized leading ordinary derivative of the linear field strength. -/ +noncomputable def symPlainCurv {n : ℕ} (t : Fin n → Lor) (nu mu : Lor) : Col → JetAlgebra := + fun c => (Nat.factorial n : ℝ)⁻¹ • + ∑ sigma : Equiv.Perm (Fin n), plainIter n (t ∘ sigma) (linCurv nu mu) c + +lemma covCurv_sub_symPlainCurv_mem_sfilt {n : ℕ} (t : Fin n → Lor) + (nu mu : Lor) (c : Col) : covCurv t nu mu c - symPlainCurv t nu mu c ∈ sfilt (n + 1) := by + have hsum : ∑ sigma : Equiv.Perm (Fin n), + (covIter n (t ∘ sigma) (curvVec nu mu) c - + plainIter n (t ∘ sigma) (linCurv nu mu) c) ∈ sfilt (n + 1) := + Submodule.sum_mem _ fun sigma _ => covIter_sub_plainIter_mem_sfilt n (t ∘ sigma) nu mu c + have hsmul := Submodule.smul_mem (sfilt (n + 1)) (Nat.factorial n : ℝ)⁻¹ hsum + rw [covCurv, symPlainCurv] + convert hsmul using 1 + rw [Finset.sum_sub_distrib] + module + +lemma symPlainCurv_eq_plainIter {n : ℕ} (t : Fin n → Lor) (nu mu : Lor) (c : Col) : + symPlainCurv t nu mu c = plainIter n t (linCurv nu mu) c := by + rw [symPlainCurv, Finset.sum_congr rfl fun sigma _ => plainIter_linCurv_perm t sigma nu mu c, + Finset.sum_const, Finset.card_univ, Fintype.card_perm, Fintype.card_fin, + ← Nat.cast_smul_eq_nsmul ℝ] + have hfac : (Nat.factorial n : ℝ) ≠ 0 := by positivity + exact inv_smul_smul₀ hfac (plainIter n t (linCurv nu mu) c) + +/-- A deterministic list representing a derivative multi-index. -/ +noncomputable def didxList (q : DIdx) : List Lor := (didxMultiset q).toList + +/-- The deterministic ordered tuple associated to `q`. -/ +noncomputable def didxTuple (q : DIdx) : Fin (didxList q).length → Lor := + fun i => (didxList q).get i + +lemma didxList_length (q : DIdx) : (didxList q).length = lorDeg q := by + rw [didxList, Multiset.length_toList, ← Multiset.toFinsupp_sum_eq] + simp [didxMultiset, lorDeg, Finsupp.sum_fintype] + +private lemma tupleFinsupp_get (l : List Lor) : + tupleFinsupp (fun i : Fin l.length => l.get i) = (l : Multiset Lor).toFinsupp := by + induction l with + | nil => simp [tupleFinsupp] + | cons a l ih => + simp only [tupleFinsupp, List.length_cons] + rw [Fin.sum_univ_succ] + rw [show (↑(a :: l) : Multiset Lor) = {a} + ↑l by rfl, map_add, + Multiset.toFinsupp_singleton, ← ih] + change Finsupp.single a 1 + ∑ i : Fin l.length, Finsupp.single (l.get i) 1 = + Finsupp.single a 1 + tupleFinsupp (fun i : Fin l.length => l.get i) + rfl + +lemma tupleFinsupp_didxTuple (q : DIdx) : tupleFinsupp (didxTuple q) = q := by + change tupleFinsupp (fun i : Fin (didxList q).length => (didxList q).get i) = q + rw [tupleFinsupp_get, didxList, Multiset.coe_toList] + simp [didxMultiset] + +/-! +## C. Independent covariant hooks and their leading terms +-/ + +private lemma predAt_apply_of_ne (w : DIdx) {mu nu : Lor} (h : nu ≠ mu) : + predAt w mu nu = w nu := by simp [predAt, h] + +/-- The derivative multi-index left after reserving the curvature directions `layerDir w` and +`mu`. -/ +noncomputable def hookRest (i : AllHookIdx) : DIdx := + predAt (predAt i.w i.mu) (layerDir i.w) + +private lemma hook_dir_supported (i : AllHookIdx) : + predAt i.w i.mu (layerDir i.w) ≠ 0 := by + rw [predAt_apply_of_ne i.w (Ne.symm i.mu_ne_dir)] + exact layerDir_coeff_ne_zero i.w_ne_zero + +lemma hookRest_add_dir (i : AllHookIdx) : + hookRest i + Finsupp.single (layerDir i.w) 1 = predAt i.w i.mu := by + exact predAt_add_single (hook_dir_supported i) + +lemma hookRest_add_mu (i : AllHookIdx) : + hookRest i + Finsupp.single i.mu 1 = predAt i.w (layerDir i.w) := by + apply add_right_cancel (b := Finsupp.single (layerDir i.w) 1) + calc + (hookRest i + Finsupp.single i.mu 1) + Finsupp.single (layerDir i.w) 1 = + (hookRest i + Finsupp.single (layerDir i.w) 1) + + Finsupp.single i.mu 1 := by ac_rfl + _ = predAt i.w i.mu + Finsupp.single i.mu 1 := by rw [hookRest_add_dir] + _ = i.w := predAt_add_single i.mu_supported + _ = predAt i.w (layerDir i.w) + Finsupp.single (layerDir i.w) 1 := + (predAt_add_single (layerDir_coeff_ne_zero i.w_ne_zero)).symm + +lemma lorDeg_hookRest (i : AllHookIdx) : lorDeg (hookRest i) + 2 = lorDeg i.w := by + have hmu := lorDeg_predAt i.mu_supported + have hdir := lorDeg_predAt (hook_dir_supported i) + change lorDeg (hookRest i) + 1 = lorDeg (predAt i.w i.mu) at hdir + omega + +/-- The independent covariant hook: the symmetrized `D^(|w|-2) F_(layerDir w),mu` component. -/ +noncomputable def covHook (i : AllHookIdx) (c : Col) : JetAlgebra := + covCurv (didxTuple (hookRest i)) (layerDir i.w) i.mu c + +lemma symPlainHook_eq_hookDiff (i : AllHookIdx) (c : Col) : + symPlainCurv (didxTuple (hookRest i)) (layerDir i.w) i.mu c = hookDiff i c := by + rw [symPlainCurv_eq_plainIter, plainIter_linCurv, tupleFinsupp_didxTuple, + hookRest_add_dir, hookRest_add_mu] + rfl + +/-- The covariant hook differs from its independent linear hook by terms of strictly smaller +additive derivative degree. -/ +lemma covHook_sub_hookDiff_mem_sfilt (i : AllHookIdx) (c : Col) : + covHook i c - hookDiff i c ∈ sfilt (lorDeg (predAt i.w i.mu)) := by + have h := covCurv_sub_symPlainCurv_mem_sfilt (didxTuple (hookRest i)) + (layerDir i.w) i.mu c + rw [symPlainHook_eq_hookDiff] at h + have hlen := didxList_length (hookRest i) + have hrest := lorDeg_hookRest i + have hmu := lorDeg_predAt i.mu_supported + have hdeg : (didxList (hookRest i)).length + 1 = lorDeg (predAt i.w i.mu) := by omega + rw [hdeg] at h + exact h + +/-! +## D. The normalized triangular substitution + +The map below fixes the symmetric weighted average and replaces every independent `hookDiff` by +`covHook`. Written back in ordinary components, its correction is the hook correction minus its +weighted average, so every generator changes only by strict lower filtration terms. +-/ + +lemma total_add_single_apply_ne_zero (s : DIdx) (mu : Lor) : + ((s + (Finsupp.single mu 1 : DIdx)) : DIdx) mu ≠ 0 := by simp + +lemma total_add_single_ne_zero (s : DIdx) (mu : Lor) : + s + Finsupp.single mu 1 ≠ 0 := by + rw [← lorDeg_pos_iff, lorDeg_add, lorDeg_single] + omega + +lemma predAt_add_single_eq (s : DIdx) (mu : Lor) : + predAt (s + Finsupp.single mu 1) mu = s := by + apply add_right_cancel (b := Finsupp.single mu 1) + exact predAt_add_single (total_add_single_apply_ne_zero s mu) + +lemma totalComponent_add_single (s : DIdx) (mu : Lor) (c : Col) : + totalComponent (s + Finsupp.single mu 1) mu c = ofGen (.dA s mu c) := by + rw [totalComponent, predAt_add_single_eq] + +/-- The nonlinear correction replacing a supported non-distinguished hook difference by the +matching covariant hook. -/ +noncomputable def hookCorrection (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := + if hw : w ≠ 0 then + if hmu : w mu ≠ 0 then + if hne : mu ≠ layerDir w then + let i : AllHookIdx := ⟨w, mu, hw, hmu, hne⟩ + covHook i c - hookDiff i c + else 0 + else 0 + else 0 + +lemma hookCorrection_eq (i : AllHookIdx) (c : Col) : + hookCorrection i.w i.mu c = covHook i c - hookDiff i c := by + rw [hookCorrection, dif_pos i.w_ne_zero, dif_pos i.mu_supported, dif_pos i.mu_ne_dir] + +lemma hookCorrection_dir (w : DIdx) (c : Col) : + hookCorrection w (layerDir w) c = 0 := by + by_cases hw : w ≠ 0 <;> simp [hookCorrection, hw] + +lemma hookCorrection_mem_sfilt (w : DIdx) (mu : Lor) (c : Col) : + hookCorrection w mu c ∈ sfilt (lorDeg w - 1) := by + rw [hookCorrection] + by_cases hw : w ≠ 0 + · rw [dif_pos hw] + by_cases hmu : w mu ≠ 0 + · rw [dif_pos hmu] + by_cases hne : mu ≠ layerDir w + · rw [dif_pos hne] + let i : AllHookIdx := ⟨w, mu, hw, hmu, hne⟩ + have hdeg := lorDeg_predAt hmu + have heq : lorDeg (predAt w mu) = lorDeg w - 1 := by omega + rw [← heq] + exact covHook_sub_hookDiff_mem_sfilt i c + · rw [dif_neg hne] + exact zero_mem _ + · rw [dif_neg hmu] + exact zero_mem _ + · rw [dif_neg hw] + exact zero_mem _ + +/-- The weighted average of the nonlinear hook corrections over a total index. -/ +noncomputable def correctionAverage (w : DIdx) (c : Col) : JetAlgebra := + (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, (w mu : ℝ) • hookCorrection w mu c + +lemma correctionAverage_mem_sfilt (w : DIdx) (c : Col) : + correctionAverage w c ∈ sfilt (lorDeg w - 1) := by + rw [correctionAverage] + exact Submodule.smul_mem _ _ (Submodule.sum_mem _ fun mu _ => + Submodule.smul_mem _ _ (hookCorrection_mem_sfilt w mu c)) + +/-- Generator form of the normalized triangular substitution. -/ +noncomputable def triangularGen : JetGenerators → JetAlgebra + | .dA s mu c => + let w := s + Finsupp.single mu 1 + ofGen (.dA s mu c) + hookCorrection w mu c - correctionAverage w c + +/-- The nonlinear triangular endomorphism of the unchanged `OrdinaryJets` ordinary carrier. -/ +noncomputable def triangularSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := + (MvPolynomial.aeval triangularGen).comp toPoly.toAlgHom + +@[simp] +lemma triangularSubst_ofGen (g : JetGenerators) : + triangularSubst (ofGen g) = triangularGen g := by + rw [triangularSubst] + change MvPolynomial.aeval triangularGen (toPoly (ofGen g)) = _ + rw [toPoly_ofGen, aeval_X] + +lemma triangularGen_sub_self_mem_sfilt (g : JetGenerators) : + triangularGen g - ofGen g ∈ sfilt (genDeg g) := by + obtain ⟨s, mu, c⟩ := g + rw [triangularGen, genDeg_dA] + have hdeg : lorDeg (s + Finsupp.single mu 1) - 1 = lorDeg s := by + rw [lorDeg_add, lorDeg_single] + omega + rw [show ofGen (.dA s mu c) + hookCorrection (s + Finsupp.single mu 1) mu c - + correctionAverage (s + Finsupp.single mu 1) c - ofGen (.dA s mu c) = + hookCorrection (s + Finsupp.single mu 1) mu c - + correctionAverage (s + Finsupp.single mu 1) c by abel] + rw [← hdeg] + exact sub_mem (hookCorrection_mem_sfilt _ _ _) (correctionAverage_mem_sfilt _ _) + +lemma triangularGen_mem_filt (g : JetGenerators) : triangularGen g ∈ filt (genDeg g) := by + have hlow := sfilt_le_filt _ (triangularGen_sub_self_mem_sfilt g) + have hgen := ofGen_mem_filt g + have h := add_mem hgen hlow + rwa [add_sub_cancel] at h + +lemma prod_triangularGen_mem_filt (l : List JetGenerators) : + (l.map triangularGen).prod ∈ filt (l.map genDeg).sum := by + induction l with + | nil => simpa using one_mem_filt_zero + | cons g l ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + exact mul_mem_filt (triangularGen_mem_filt g) ih + +lemma prod_triangularGen_sub_mem_sfilt (l : List JetGenerators) : + (l.map triangularGen).prod - (l.map ofGen).prod ∈ sfilt (l.map genDeg).sum := by + induction l with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil, sub_self] + exact zero_mem _ + | cons g l ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + have hkey : triangularGen g * (l.map triangularGen).prod - + ofGen g * (l.map ofGen).prod = + (triangularGen g - ofGen g) * (l.map triangularGen).prod + + ofGen g * ((l.map triangularGen).prod - (l.map ofGen).prod) := by ring + rw [hkey] + exact add_mem + (mul_mem_sfilt_left (triangularGen_sub_self_mem_sfilt g) + (prod_triangularGen_mem_filt l)) + (mul_mem_sfilt_right (ofGen_mem_filt g) ih) + +private lemma triangularSubst_prod_ofGen (l : List JetGenerators) : + triangularSubst (l.map ofGen).prod = (l.map triangularGen).prod := by + induction l with + | nil => simp + | cons g l ih => + simp only [List.map_cons, List.prod_cons, map_mul, triangularSubst_ofGen, ih] + +/-- Unitriangularity on every filtered piece. -/ +lemma triangularSubst_sub_self_mem_sfilt {d : ℕ} {P : JetAlgebra} (hP : P ∈ filt d) : + triangularSubst P - P ∈ sfilt d := by + induction hP using Submodule.span_induction with + | mem P hP => + obtain ⟨l, hl, rfl⟩ := hP + have h := prod_triangularGen_sub_mem_sfilt l + rw [triangularSubst_prod_ofGen] + exact sfilt_mono hl h + | zero => + rw [map_zero, sub_zero] + exact zero_mem _ + | add P Q _ _ hP hQ => + rw [map_add, show triangularSubst P + triangularSubst Q - (P + Q) = + (triangularSubst P - P) + (triangularSubst Q - Q) by abel] + exact add_mem hP hQ + | smul r P _ hP => + rw [map_smul, ← smul_sub] + exact Submodule.smul_mem _ _ hP + +/-- Every ordinary jet polynomial has bounded additive derivative degree. -/ +lemma exists_mem_filt (P : JetAlgebra) : ∃ d, P ∈ filt d := by + induction P using SymmetricAlgebra.induction with + | algebraMap r => exact ⟨0, algebraMap_mem_filt_zero r⟩ + | ι v => + let r := JetComponentSpace.basis.repr v + let d := r.support.sup genDeg + refine ⟨d, ?_⟩ + have hv : SymmetricAlgebra.ι ℝ JetComponentSpace v = + r.sum (fun g a => a • ofGen g) := by + conv_lhs => rw [← JetComponentSpace.basis.linearCombination_repr v] + rw [Finsupp.linearCombination_apply, Finsupp.sum, map_sum] + refine Finset.sum_congr rfl fun g _ => ?_ + rw [map_smul] + rfl + rw [hv, Finsupp.sum] + refine Submodule.sum_mem (filt d) fun g hg => ?_ + exact Submodule.smul_mem _ _ + (filt_mono (show genDeg g ≤ d from Finset.le_sup hg) (ofGen_mem_filt g)) + | mul P Q hP hQ => + obtain ⟨d, hd⟩ := hP + obtain ⟨e, he⟩ := hQ + exact ⟨d + e, mul_mem_filt hd he⟩ + | add P Q hP hQ => + obtain ⟨d, hd⟩ := hP + obtain ⟨e, he⟩ := hQ + exact ⟨max d e, add_mem (filt_mono (le_max_left _ _) hd) + (filt_mono (le_max_right _ _) he)⟩ + +private lemma eq_zero_of_triangularSubst_eq_zero {d : ℕ} : + ∀ {P : JetAlgebra}, P ∈ filt d → triangularSubst P = 0 → P = 0 := by + induction d with + | zero => + intro P hP h0 + have h := triangularSubst_sub_self_mem_sfilt hP + rw [h0, zero_sub, sfilt_zero, Submodule.mem_bot, neg_eq_zero] at h + exact h + | succ d ih => + intro P hP h0 + have h := triangularSubst_sub_self_mem_sfilt hP + rw [h0, zero_sub, sfilt_succ] at h + exact ih (neg_mem_iff.mp h) h0 + +lemma triangularSubst_injective : Function.Injective triangularSubst := by + intro P Q hPQ + obtain ⟨d, hd⟩ := exists_mem_filt (P - Q) + have h0 : triangularSubst (P - Q) = 0 := by rw [map_sub, hPQ, sub_self] + exact sub_eq_zero.mp (eq_zero_of_triangularSubst_eq_zero hd h0) + +private lemma exists_triangularSubst_eq {d : ℕ} : + ∀ {P : JetAlgebra}, P ∈ filt d → ∃ Q, triangularSubst Q = P := by + induction d with + | zero => + intro P hP + have h := triangularSubst_sub_self_mem_sfilt hP + rw [sfilt_zero, Submodule.mem_bot, sub_eq_zero] at h + exact ⟨P, h⟩ + | succ d ih => + intro P hP + have h := triangularSubst_sub_self_mem_sfilt hP + rw [sfilt_succ] at h + obtain ⟨Q, hQ⟩ := ih h + exact ⟨P - Q, by rw [map_sub, hQ, sub_sub_cancel]⟩ + +lemma triangularSubst_surjective : Function.Surjective triangularSubst := by + intro P + obtain ⟨d, hd⟩ := exists_mem_filt P + exact exists_triangularSubst_eq hd + +/-- **The arbitrary-order triangular coordinate equivalence.** -/ +noncomputable def covariantEquiv : JetAlgebra ≃ₐ[ℝ] JetAlgebra := + AlgEquiv.ofBijective triangularSubst ⟨triangularSubst_injective, triangularSubst_surjective⟩ + +@[simp] +lemma covariantEquiv_apply (P : JetAlgebra) : covariantEquiv P = triangularSubst P := rfl + +lemma triangularSubst_totalComponent {w : DIdx} {mu : Lor} (hmu : w mu ≠ 0) (c : Col) : + triangularSubst (totalComponent w mu c) = + totalComponent w mu c + hookCorrection w mu c - correctionAverage w c := by + rw [totalComponent, triangularSubst_ofGen, triangularGen] + rw [predAt_add_single hmu] + +/-- Every independent linear hook is sent to the matching symmetrized covariant curvature +derivative. -/ +lemma triangularSubst_hookDiff (i : AllHookIdx) (c : Col) : + triangularSubst (hookDiff i c) = covHook i c := by + rw [hookDiff, map_sub, triangularSubst_totalComponent i.mu_supported, + triangularSubst_totalComponent (layerDir_coeff_ne_zero i.w_ne_zero), + hookCorrection_dir, hookCorrection_eq] + rw [hookDiff] + abel + +/-- The fully symmetric connection coordinate is fixed by the normalized substitution. -/ +lemma triangularSubst_symConn {w : DIdx} (hw : w ≠ 0) (c : Col) : + triangularSubst (symConn w c) = symConn w c := by + rw [symConn, map_smul, map_sum] + have hterm : ∀ mu : Lor, + triangularSubst ((w mu : ℝ) • totalComponent w mu c) = + (w mu : ℝ) • (totalComponent w mu c + hookCorrection w mu c - + correctionAverage w c) := by + intro mu + by_cases hmu : w mu ≠ 0 + · rw [map_smul, triangularSubst_totalComponent hmu] + · have hz : w mu = 0 := not_ne_iff.mp hmu + simp [hz] + rw [Finset.sum_congr rfl fun mu _ => hterm mu] + have hdeg : (lorDeg w : ℝ) ≠ 0 := by + exact_mod_cast (Nat.ne_of_gt ((lorDeg_pos_iff w).2 hw)) + have hsum : ∑ mu : Lor, (w mu : ℝ) = lorDeg w := by norm_cast + simp_rw [smul_sub, smul_add] + rw [Finset.sum_sub_distrib, Finset.sum_add_distrib, ← Finset.sum_smul, hsum, + correctionAverage, smul_smul, mul_inv_cancel₀ hdeg, one_smul] + module + +/-! +## E. The parametric triangular coordinate identity +-/ + +/-- The covariant hook component extended to every displayed supported direction; the +distinguished component is zero. -/ +noncomputable def covHookAt (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := + totalComponent w mu c - totalComponent w (layerDir w) c + hookCorrection w mu c + +/-- The weighted average of the displayed covariant hook components. -/ +noncomputable def covHookAverage (w : DIdx) (c : Col) : JetAlgebra := + (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, (w mu : ℝ) • covHookAt w mu c + +/-- The strict lower-order remainder in the inverse triangular coordinate formula. -/ +noncomputable def triangularLower (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := + correctionAverage w c - hookCorrection w mu c + +lemma covHookAt_eq_covHook (i : AllHookIdx) (c : Col) : + covHookAt i.w i.mu c = covHook i c := by + rw [covHookAt, hookCorrection_eq, hookDiff] + abel + +lemma covHookAt_dir (w : DIdx) (c : Col) : covHookAt w (layerDir w) c = 0 := by + rw [covHookAt, hookCorrection_dir, sub_self, zero_add] + +lemma covHookAverage_eq (w : DIdx) (c : Col) : + covHookAverage w c = hookAverage w c + correctionAverage w c := by + unfold covHookAverage hookAverage correctionAverage covHookAt + simp_rw [smul_add] + rw [Finset.sum_add_distrib, smul_add] + +lemma triangularLower_mem_sfilt (w : DIdx) (mu : Lor) (c : Col) : + triangularLower w mu c ∈ sfilt (lorDeg w - 1) := by + exact sub_mem (correctionAverage_mem_sfilt w c) (hookCorrection_mem_sfilt w mu c) + +/-- **The arbitrary-order Brandt triangular identity.** Every ordinary component is the fully +symmetric connection coordinate plus its independent covariant hook component, minus the weighted +hook average needed by the explicit inverse, plus a term of strictly smaller additive derivative +degree. For an `AllHookIdx`, `covHookAt_eq_covHook` identifies the displayed hook with the +symmetrized `D^(|w|-2) F` from `CovariantTower`. -/ +lemma ordinary_eq_symmetric_add_covariant_hook {w : DIdx} (hw : w ≠ 0) + {mu : Lor} (hmu : w mu ≠ 0) (c : Col) : + totalComponent w mu c = + symConn w c + covHookAt w mu c - covHookAverage w c + triangularLower w mu c := by + rw [covHookAverage_eq, covHookAt, triangularLower] + have h := totalComponent_eq_symConn_add_hook_sub hw hmu c + rw [show totalComponent w mu c - totalComponent w (layerDir w) c = + totalComponent w mu c - totalComponent w (layerDir w) c from rfl] + linear_combination h + +end SU3Jet +end StandardModel From 8bd23ff7e2125da521f3dda20ab8b9a23439f1f3 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 7 Aug 2026 08:01:57 +0100 Subject: [PATCH 107/254] feat: Add mass dim --- .../QED/JetAlgebra/LorentzGroup.lean | 79 ++--- Physlib/Particles/QED/JetAlgebra/MassDim.lean | 29 +- .../StandardModel/Fermions/LeptonSinglet.lean | 286 +++++++++++++++++- 3 files changed, 324 insertions(+), 70 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean b/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean index b345580b7..d416b7728 100644 --- a/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean +++ b/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean @@ -186,7 +186,33 @@ lemma repLorentzGroup_Dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : rw [Dbarψ_nil, repLorentzGroup_barψ] simp only [Dbarψ_nil] -set_option maxHeartbeats 2000000 in +/-- Multiplication distributes over a finite sum on the left. Stated through + `LinearMap.mulRight` because the generic `Finset.sum_mul` does not match the + multiplication instance of the tensor-product algebra. -/ +lemma sum_mul' {ι : Type*} [Fintype ι] (f : ι → JetAlgebra) (y : JetAlgebra) : + (∑ i, f i) * y = ∑ i, f i * y := by + rw [show (∑ i, f i) * y = LinearMap.mulRight ℂ y (∑ i, f i) from rfl, map_sum] + rfl + +/-- Multiplication distributes over a finite sum on the right; see `sum_mul'`. -/ +lemma mul_sum' {ι : Type*} [Fintype ι] (y : JetAlgebra) (f : ι → JetAlgebra) : + y * (∑ i, f i) = ∑ i, y * f i := by + rw [show y * (∑ i, f i) = LinearMap.mulLeft ℂ y (∑ i, f i) from rfl, map_sum] + rfl + +/-- Bilinearity of the product against two scaled finite sums: the form in which + the gauge-field term of a covariant derivative is expanded after the Lorentz + action has been distributed over each factor. -/ +lemma smul_sum_mul_sum {ι κ : Type*} [Fintype ι] [Fintype κ] (c : ℂ) + (f : ι → ℂ) (g : κ → ℂ) (x : ι → JetAlgebra) (y : κ → JetAlgebra) : + c • ((∑ i, f i • x i) * (∑ j, g j • y j)) = + ∑ i, ∑ j, (f i * g j * c) • (x i * y j) := by + rw [sum_mul'] + simp only [mul_sum', smul_mul_smul_comm, Finset.smul_sum, smul_smul] + refine Finset.sum_congr rfl fun i _ => Finset.sum_congr rfl fun j _ => ?_ + congr 1 + ring + /-- Covariance of the first covariant derivative under the Lorentz group: the gauge-field term transforms exactly as the derivative term. -/ lemma repLorentzGroup_Dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) @@ -194,30 +220,10 @@ lemma repLorentzGroup_Dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) repLorentzGroup Λ (Dψ [μ] α) = ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * star ((Λ⁻¹).1 α β)) • Dψ [ν] β := by - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [Dψ_singleton, map_add, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, - repLorentzGroup_ψ, repLorentzGroup_dψ_singleton] - conv_rhs => enter [2, ν, 2, β]; rw [Dψ_singleton, smul_add] - conv_rhs => enter [2, ν]; rw [Finset.sum_add_distrib] - rw [Finset.sum_add_distrib] - congr 1 - simp only [hsm, hms, hsmul, Finset.smul_sum] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ - rw [smul_smul, smul_smul] - congr 1 - ring + simp only [Dψ_singleton, map_sub, map_smul, repLorentzGroup_apply_mul, + repLorentzGroup_B, repLorentzGroup_ψ, repLorentzGroup_dψ_singleton, + smul_sub, Finset.sum_sub_distrib, smul_smul, smul_sum_mul_sum] -set_option maxHeartbeats 2000000 in /-- Covariance of the first conjugate covariant derivative under the Lorentz group. -/ lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) @@ -225,28 +231,9 @@ lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) repLorentzGroup Λ (Dbarψ [μ] α) = ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α β) • Dbarψ [ν] β := by - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [Dbarψ_singleton, map_sub, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, - repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton] - conv_rhs => enter [2, ν, 2, β]; rw [Dbarψ_singleton, smul_sub] - conv_rhs => enter [2, ν]; rw [Finset.sum_sub_distrib] - rw [Finset.sum_sub_distrib] - congr 1 - simp only [hsm, hms, hsmul, Finset.smul_sum] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ - rw [smul_smul, smul_smul] - congr 1 - ring + simp only [Dbarψ_singleton, map_add, map_smul, repLorentzGroup_apply_mul, + repLorentzGroup_B, repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton, + smul_add, Finset.sum_add_distrib, smul_smul, smul_sum_mul_sum] /-! ### B.2. The invarance condition diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/MassDim.lean index f69f1402f..e2bbb998c 100644 --- a/Physlib/Particles/QED/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/QED/JetAlgebra/MassDim.lean @@ -52,7 +52,6 @@ lemma massWeightScale_tmul (c : ℂ) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) Algebra.TensorProduct.map_tmul _ _ _ _ /-- Each generator scales by `c` to the power of its mass weight. -/ -@[simp] lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : massWeightScale c [j]ₐ = c ^ MassWeight j • [j]ₐ := by cases j with @@ -71,6 +70,11 @@ lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] rfl +lemma massWeightScale_dB_nil (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : + massWeightScale c [JetGenerators.dB 0 μ]ₐ = c ^ 2 • [JetGenerators.dB 0 μ]ₐ := by + rw [massWeightScale_ofGenerator, MassWeight] + norm_num + /-- The total derivative raises the mass weight by two. -/ lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by @@ -88,28 +92,16 @@ lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) lemma massWeightScale_covariantStep (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : massWeightScale c (covariantStep μ x) = c ^ 2 • covariantStep μ (massWeightScale c x) := by - have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = - massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b - have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = - c ^ 2 • [JetGenerators.dB {} μ]ₐ := by - rw [massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] - simp only [covariantStep_apply, map_add, map_smul, massWeightScale_jetDeriv, - hm, hgen, smul_mul_assoc] + simp only [covariantStep_apply, Multiset.empty_eq_zero, map_sub, massWeightScale_jetDeriv, + map_smul, map_mul, massWeightScale_dB_nil, smul_mul_assoc] module /-- The conjugate covariant step raises the mass weight by two. -/ lemma massWeightScale_covariantStepBar (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : massWeightScale c (covariantStepBar μ x) = c ^ 2 • covariantStepBar μ (massWeightScale c x) := by - have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = - massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b - have hgen : massWeightScale c [JetGenerators.dB {} μ]ₐ = - c ^ 2 • [JetGenerators.dB {} μ]ₐ := by - rw [massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dB {} μ) = 2 from rfl] - simp only [covariantStepBar_apply, map_sub, map_smul, massWeightScale_jetDeriv, - hm, hgen, smul_mul_assoc] + simp only [covariantStepBar_apply, Multiset.empty_eq_zero, map_add, massWeightScale_jetDeriv, + map_smul, map_mul, massWeightScale_dB_nil, smul_mul_assoc, smul_add, add_right_inj] module /-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight @@ -126,7 +118,6 @@ lemma massWeightScale_Dψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : simp only [map_smul, smul_smul, List.length_cons] ring_nf - /-- Homogeneity of the conjugate covariant derivative: `D̄_l ψ̄_α` has mass weight `3 + 2 |l|`. -/ lemma massWeightScale_Dbarψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : @@ -198,6 +189,7 @@ lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, LeptonSinglet.JetAlgebra.massWeightScale_repJetGaugeGroupI_ofConstant_apply] + /-! ## A. The mass-weight submodules @@ -206,7 +198,6 @@ lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) noncomputable def MassDimSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := Submodule.span ℂ { x | ∀ c : ℂ, massWeightScale c x = c ^ n • x } -instance : GradedAlgebra (R := ℂ) (A := JetAlgebra) MassDimSubmodule := sorry noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ m • x} diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 625ec455a..fa3a17f91 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -1389,6 +1389,285 @@ where `q` is the charge of the field. -/ + +/-- The mass-weight polynomial on the charged-lepton factor: the `ℂ`-algebra map + sending each generator `j` to `X ^ w * j`, where `w` is the mass weight of `j`. + It is `LeptonSinglet.JetAlgebra.massWeightScale` with the scalar `c` replaced by + the formal variable `X`. -/ +noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + ExteriorAlgebra.lift ℂ + ⟨JetComponentSpace.basis.constr ℂ fun j => + Polynomial.monomial j.massWeight (ofGenerator j), by + set f := JetComponentSpace.basis.constr ℂ fun j => + Polynomial.monomial j.massWeight (ofGenerator j) with hf + set B := (LinearMap.mul ℂ (Polynomial JetAlgebra)).compl₁₂ f f with hBdef + have hB : B + B.flip = 0 := + LinearMap.ext_basis JetComponentSpace.basis JetComponentSpace.basis fun j k => by + simp only [hBdef, LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, + LinearMap.mul_apply', LinearMap.zero_apply, hf, Module.Basis.constr_basis, + ofGenerator, Polynomial.monomial_mul_monomial, + Nat.add_comm k.massWeight j.massWeight, ← map_add, + ExteriorAlgebra.ι_add_mul_swap, map_zero] + intro v + have h2 : (2 : ℂ) • (f v * f v) = 0 := by + rw [two_smul] + exact LinearMap.congr_fun (LinearMap.congr_fun hB v) v + simpa [smul_smul] using congrArg (fun y => (2⁻¹ : ℂ) • y) h2⟩ + +/-- Setting the formal variable to one recovers the original element. -/ +lemma massWeightPoly_eval_one (x : JetAlgebra) : + (massWeightPoly x).eval 1 = x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) 1 + fun a => Commute.one_right a).comp massWeightPoly = AlgHom.id ℂ JetAlgebra := by + refine ExteriorAlgebra.hom_ext (Module.Basis.ext JetComponentSpace.basis fun j => ?_) + simp [massWeightPoly, ofGenerator] + exact AlgHom.congr_fun h x + +lemma eq_sum_massWeightPoly_coeff (x : JetAlgebra) : + x = ∑ n ∈ Polynomial.support (massWeightPoly x), (massWeightPoly x).coeff n := by + conv_lhs => rw [← massWeightPoly_eval_one x] + rw [Polynomial.eval_eq_sum, Polynomial.sum_def] + simp + +/-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ +lemma massWeightPoly_ofGenerator (j : JetGenerators) : + massWeightPoly (ofGenerator j) = Polynomial.monomial j.massWeight (ofGenerator j) := by + rw [massWeightPoly, ofGenerator, ExteriorAlgebra.lift_ι_apply, Module.Basis.constr_basis] + rfl + +/-- `massWeightPoly` is injective, however, it is not surjective. -/ +lemma massWeightPoly_injective : Function.Injective massWeightPoly := by + intro x y h + rw [← massWeightPoly_eval_one x, ← massWeightPoly_eval_one y] + simp [h] + +/-- The total derivative of a linear generator: `massWeightPoly (∂_μ (ι v))` is + `X ^ 2` times a polynomial whose coefficients are the total derivatives of the + coefficients of `massWeightPoly (ι v)`. -/ +lemma exists_massWeightPoly_jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + ∃ q : Polynomial JetAlgebra, + massWeightPoly (jetDeriv μ (ExteriorAlgebra.ι ℂ v)) = Polynomial.X ^ 2 * q ∧ + ∀ n, q.coeff n = + jetDeriv μ ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) := by + have hv : v ∈ Submodule.span ℂ (Set.range JetComponentSpace.basis) := by + rw [JetComponentSpace.basis.span_eq] + trivial + induction hv using Submodule.span_induction with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + refine ⟨Polynomial.monomial j.massWeight (ofGenerator (JetGenerators.shift μ j)), ?_, + fun n => ?_⟩ + · rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, + jetDeriv_ofGenerator, massWeightPoly_ofGenerator, JetGenerators.massWeight_shift, + Polynomial.X_pow_eq_monomial, Polynomial.monomial_mul_monomial, one_mul, + Nat.add_comm 2 j.massWeight] + · rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, + massWeightPoly_ofGenerator, Polynomial.coeff_monomial, Polynomial.coeff_monomial] + split_ifs with h + · rw [jetDeriv_ofGenerator] + · rw [map_zero] + | zero => exact ⟨0, by simp, fun n => by simp⟩ + | add y z _ _ hy hz => + obtain ⟨qy, hqy, cy⟩ := hy + obtain ⟨qz, hqz, cz⟩ := hz + refine ⟨qy + qz, ?_, fun n => ?_⟩ + · simp only [map_add, hqy, hqz, mul_add] + · simp only [map_add, Polynomial.coeff_add, cy, cz] + | smul c y _ hy => + obtain ⟨qy, hqy, cy⟩ := hy + refine ⟨c • qy, ?_, fun n => ?_⟩ + · simp only [map_smul, hqy, mul_smul_comm] + · simp only [map_smul, Polynomial.coeff_smul, cy] + +/-- Rearrangement used for the Leibniz step: `X ^ 2` is central, so it can be + pulled out of a Leibniz combination. -/ +private lemma X_sq_mul_leibniz {R : Type} [Semiring R] (p q r s : Polynomial R) : + Polynomial.X ^ 2 * p * q + r * (Polynomial.X ^ 2 * s) = + Polynomial.X ^ 2 * (p * q + r * s) := by + rw [mul_add, mul_assoc, ← mul_assoc r, ← Polynomial.X_pow_mul, mul_assoc] + +/-- The polynomial half of the Leibniz step: the mass-weight polynomial of + `∂_μ (a * b)` is `X ^ 2` times the Leibniz combination. -/ +lemma massWeightPoly_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} + {qa qb : Polynomial JetAlgebra} + (hqa : massWeightPoly (jetDeriv μ a) = Polynomial.X ^ 2 * qa) + (hqb : massWeightPoly (jetDeriv μ b) = Polynomial.X ^ 2 * qb) : + massWeightPoly (jetDeriv μ (a * b)) = + Polynomial.X ^ 2 * (qa * massWeightPoly b + massWeightPoly a * qb) := by + rw [jetDeriv_mul, map_add massWeightPoly, map_mul massWeightPoly, map_mul massWeightPoly, + hqa, hqb, X_sq_mul_leibniz] + +/-- The coefficient half of the Leibniz step: the coefficients of the Leibniz + combination are the total derivatives of the coefficients of `a * b`. -/ +lemma coeff_mul_jetDeriv (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} + {qa qb : Polynomial JetAlgebra} + (ca : ∀ n, qa.coeff n = jetDeriv μ ((massWeightPoly a).coeff n)) + (cb : ∀ n, qb.coeff n = jetDeriv μ ((massWeightPoly b).coeff n)) (n : ℕ) : + (qa * massWeightPoly b + massWeightPoly a * qb).coeff n = + jetDeriv μ ((massWeightPoly (a * b)).coeff n) := by + rw [Polynomial.coeff_add, Polynomial.coeff_mul, Polynomial.coeff_mul, + ← Finset.sum_add_distrib, map_mul massWeightPoly, Polynomial.coeff_mul, + map_sum (jetDeriv μ)] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [jetDeriv_mul, ca, cb] + +/-- The Leibniz rule propagates the shift: if the mass-weight polynomials of the + total derivatives of `a` and `b` are `X ^ 2` times the coefficientwise total + derivatives, then so is that of `a * b`. -/ +lemma exists_massWeightPoly_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} + {qa qb : Polynomial JetAlgebra} + (hqa : massWeightPoly (jetDeriv μ a) = Polynomial.X ^ 2 * qa) + (ca : ∀ n, qa.coeff n = jetDeriv μ ((massWeightPoly a).coeff n)) + (hqb : massWeightPoly (jetDeriv μ b) = Polynomial.X ^ 2 * qb) + (cb : ∀ n, qb.coeff n = jetDeriv μ ((massWeightPoly b).coeff n)) : + ∃ q : Polynomial JetAlgebra, massWeightPoly (jetDeriv μ (a * b)) = Polynomial.X ^ 2 * q ∧ + ∀ n, q.coeff n = jetDeriv μ ((massWeightPoly (a * b)).coeff n) := + ⟨qa * massWeightPoly b + massWeightPoly a * qb, + massWeightPoly_jetDeriv_mul μ hqa hqb, coeff_mul_jetDeriv μ ca cb⟩ + +/-- The mass-weight polynomial of a total derivative is `X ^ 2` times a polynomial + whose coefficients are the total derivatives of the coefficients: the total + derivative raises the mass weight by two. -/ +lemma exists_massWeightPoly_jetDeriv (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + ∃ q : Polynomial JetAlgebra, massWeightPoly (jetDeriv μ x) = Polynomial.X ^ 2 * q ∧ + ∀ n, q.coeff n = jetDeriv μ ((massWeightPoly x).coeff n) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + have hr : jetDeriv μ (algebraMap ℂ JetAlgebra r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul (jetDeriv μ), jetDeriv_one, smul_zero] + refine ⟨0, ?_, fun n => ?_⟩ + · rw [hr, map_zero massWeightPoly, mul_zero] + · rw [Polynomial.coeff_zero, AlgHom.commutes, Polynomial.algebraMap_apply, + Polynomial.coeff_C] + split_ifs with h + · rw [hr] + · rw [map_zero (jetDeriv μ)] + | ι v => exact exists_massWeightPoly_jetDeriv_ι μ v + | mul a b ha hb => + obtain ⟨qa, hqa, ca⟩ := ha + obtain ⟨qb, hqb, cb⟩ := hb + exact exists_massWeightPoly_jetDeriv_mul μ hqa ca hqb cb + | add a b ha hb => + obtain ⟨qa, hqa, ca⟩ := ha + obtain ⟨qb, hqb, cb⟩ := hb + refine ⟨qa + qb, ?_, fun n => ?_⟩ + · simp only [map_add, hqa, hqb, mul_add] + · simp only [map_add, Polynomial.coeff_add, ca, cb] + +/-- The total derivative raises the mass weight by two: it takes the part of `x` of + mass weight `n` to the part of `∂_μ x` of mass weight `n + 2`. -/ +lemma jetDeriv_massWeightPoly_coeff (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) (n : ℕ) : + jetDeriv μ ((massWeightPoly x).coeff n) = (massWeightPoly (jetDeriv μ x)).coeff (n + 2) := by + obtain ⟨q, hq, hc⟩ := exists_massWeightPoly_jetDeriv μ x + rw [hq, Polynomial.coeff_X_pow_mul, hc] + + +/-- The coefficients of the mass-weight polynomial of a linear generator are + homogeneous: each basis vector is homogeneous, and a general vector is a + combination of basis vectors. -/ +lemma massWeightPoly_coeff_massWeightPoly_ι (n : ℕ) (v : JetComponentSpace) : + massWeightPoly ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) = + Polynomial.monomial n ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) := by + have hv : v ∈ Submodule.span ℂ (Set.range JetComponentSpace.basis) := by + rw [JetComponentSpace.basis.span_eq] + trivial + induction hv using Submodule.span_induction generalizing n with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, + massWeightPoly_ofGenerator, Polynomial.coeff_monomial] + split_ifs with h + · rw [← h, massWeightPoly_ofGenerator] + · simp only [map_zero] + | zero => simp only [map_zero, Polynomial.coeff_zero] + | add y z _ _ hy hz => + simp only [map_add, Polynomial.coeff_add] + rw [hy n, hz n] + | smul c y _ hy => + simp only [map_smul, Polynomial.coeff_smul] + rw [hy n, Polynomial.smul_monomial] + +/-- Homogeneity of the coefficients is inherited by products: the `n`-th coefficient + of a product is a sum of products of coefficients of complementary degrees. -/ +lemma massWeightPoly_coeff_massWeightPoly_mul {a b : JetAlgebra} + (ha : ∀ n, massWeightPoly ((massWeightPoly a).coeff n) = + Polynomial.monomial n ((massWeightPoly a).coeff n)) + (hb : ∀ n, massWeightPoly ((massWeightPoly b).coeff n) = + Polynomial.monomial n ((massWeightPoly b).coeff n)) (n : ℕ) : + massWeightPoly ((massWeightPoly (a * b)).coeff n) = + Polynomial.monomial n ((massWeightPoly (a * b)).coeff n) := by + rw [map_mul massWeightPoly a b, Polynomial.coeff_mul, map_sum massWeightPoly, + map_sum (Polynomial.monomial n)] + refine Finset.sum_congr rfl fun p hp => ?_ + rw [Finset.mem_antidiagonal] at hp + subst hp + rw [map_mul massWeightPoly, ha p.1, hb p.2, Polynomial.monomial_mul_monomial] + +/-- The coefficients of a mass-weight polynomial are homogeneous: the coefficient of + `X ^ n` in `massWeightPoly x` is sent by `massWeightPoly` to `X ^ n` times itself. + + This fails for a general `p : Polynomial JetAlgebra` in place of `massWeightPoly x`: + for `p = Polynomial.monomial 5 1` it would say `1 = X ^ 5`. -/ +lemma massWeightPoly_coeff_massWeightPoly (n : ℕ) (x : JetAlgebra) : + massWeightPoly ((massWeightPoly x).coeff n) = + Polynomial.monomial n ((massWeightPoly x).coeff n) := by + induction x using ExteriorAlgebra.induction generalizing n with + | algebraMap r => + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs with h + · subst h + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.monomial_zero_left] + · simp only [map_zero] + | ι v => exact massWeightPoly_coeff_massWeightPoly_ι n v + | mul a b ha hb => exact massWeightPoly_coeff_massWeightPoly_mul ha hb n + | add a b ha hb => + rw [map_add massWeightPoly a b, Polynomial.coeff_add, map_add massWeightPoly, ha n, hb n] + exact (map_add (Polynomial.monomial n) _ _).symm + + +/-- The submodule of elements of mass weight `n`: those `x` whose mass-weight + polynomial is `x * X ^ n`. -/ +def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where + carrier := {x | massWeightPoly x = Polynomial.monomial n x} + add_mem' {a b} ha hb := by + simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ + rw [ha, hb] + zero_mem' := by simp + smul_mem' c x hx := by + simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ + rw [hx, Polynomial.smul_monomial] + +@[simp] +lemma mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} : + x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl + +/-- The generator `j` has mass weight `j.massWeight`. -/ +lemma ofGenerator_mem_massWeightSubmodule (j : JetGenerators) : + ofGenerator j ∈ massWeightSubmodule j.massWeight := + massWeightPoly_ofGenerator j + +/-- Mass weights add under multiplication, and `1` has mass weight zero. -/ +instance : SetLike.GradedMonoid massWeightSubmodule where + one_mem := by simp + mul_mem {m n x y} hx hy := by + simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ + rw [hx, hy, Polynomial.monomial_mul_monomial] + + + +/-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass + weight `n`. -/ +lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : + (massWeightPoly x).coeff n ∈ massWeightSubmodule n := + massWeightPoly_coeff_massWeightPoly n x + +lemma massWeightSubmodule_isInternal : DirectSum.IsInternal massWeightSubmodule := by + constructor + · intro x y h + + sorry + · sorry + /-- The mass-dimension scaling on the jet algebra of the charged-lepton singlet: the (linear map underlying the) algebra map multiplying each generator by `c ^ w`, where `w` is twice its mass dimension. -/ @@ -1412,7 +1691,7 @@ lemma massWeightScale_ι (c : ℂ) (v : JetComponentSpace) : ExteriorAlgebra.ι ℂ (JetComponentSpace.massWeightScale c v) := by rw [massWeightScale_apply, ExteriorAlgebra.map_apply_ι] -set_option maxHeartbeats 1000000 in + /-- The total derivative raises the mass weight by two: the scaling and the derivative commute up to `c ^ 2`. -/ lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : @@ -1424,10 +1703,7 @@ lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) rw [jetDeriv_ι, massWeightScale_ι, JetComponentSpace.massWeightScale_jetDeriv, map_smul, massWeightScale_ι, jetDeriv_ι] | mul x y hx hy => - have hm : ∀ a b : JetAlgebra, massWeightScale c (a * b) = - massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b - rw [jetDeriv_mul, map_add, hm, hm, hm, hx, hy, smul_mul_assoc, mul_smul_comm, - jetDeriv_mul, smul_add] + simp [map_mul, jetDeriv_mul, hx, hy, smul_add] | add x y hx hy => simp only [map_add, hx, hy, smul_add] From 50fbbf9d07814fbcff6698e39ea5945c745399ee Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 7 Aug 2026 08:26:52 +0100 Subject: [PATCH 108/254] feat: Add mass dim grading --- .../StandardModel/Fermions/LeptonSinglet.lean | 59 +++++++++++++++++-- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index fa3a17f91..98c81abea 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -1661,12 +1661,61 @@ lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : (massWeightPoly x).coeff n ∈ massWeightSubmodule n := massWeightPoly_coeff_massWeightPoly n x -lemma massWeightSubmodule_isInternal : DirectSum.IsInternal massWeightSubmodule := by - constructor - · intro x y h +/-- On an element of mass weight `n`, the `n`-th coefficient of the mass-weight + polynomial is the element itself. -/ +lemma coeff_massWeightPoly_of_mem {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : (massWeightPoly x).coeff n = x := by + rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_pos rfl] + +/-- On an element of mass weight `m`, every other coefficient of the mass-weight + polynomial vanishes. -/ +lemma coeff_massWeightPoly_of_mem_ne {m n : ℕ} {x : JetAlgebra} (hmn : m ≠ n) + (hx : x ∈ massWeightSubmodule m) : (massWeightPoly x).coeff n = 0 := by + rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_neg hmn] + +/-- The `i`-th coefficient of the mass-weight polynomial vanishes on the span of + all the *other* weight submodules. This is the separation property that makes + the weight decomposition direct. -/ +lemma coeff_massWeightPoly_eq_zero_of_mem_iSup_ne (i : ℕ) {x : JetAlgebra} + (hx : x ∈ ⨆ (j : ℕ) (_ : j ≠ i), massWeightSubmodule j) : + (massWeightPoly x).coeff i = 0 := by + induction hx using Submodule.iSup_induction' with + | mem j x hj => + by_cases hne : j ≠ i + · rw [iSup_pos hne] at hj + exact coeff_massWeightPoly_of_mem_ne hne hj + · rw [iSup_neg hne, Submodule.mem_bot] at hj + rw [hj, map_zero, Polynomial.coeff_zero] + | zero => simp + | add a b _ _ ha hb => rw [map_add, Polynomial.coeff_add, ha, hb, add_zero] + +/-- The weight submodules span the whole jet algebra. -/ +lemma iSup_massWeightSubmodule_eq_top : + ⨆ n : ℕ, massWeightSubmodule n = ⊤ := by + rw [eq_top_iff] + intro x _ + rw [eq_sum_massWeightPoly_coeff x] + exact Submodule.sum_mem _ fun n _ => Submodule.mem_iSup_of_mem n + (coeff_massWeightPoly_mem_massWeightSubmodule n x) + +/-- The weight submodules are independent: an element of weight `i` lying in the + span of the other weights is zero, since taking the `i`-th coefficient of the + mass-weight polynomial returns it on the one and kills it on the other. -/ +lemma iSupIndep_massWeightSubmodule : iSupIndep massWeightSubmodule := by + intro i + rw [Submodule.disjoint_def] + intro x hx hx' + rw [← coeff_massWeightPoly_of_mem hx] + exact coeff_massWeightPoly_eq_zero_of_mem_iSup_ne i hx' + +/-- The jet algebra is the internal direct sum of its mass-weight submodules. -/ +lemma massWeightSubmodule_isInternal : DirectSum.IsInternal massWeightSubmodule := + (DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top _).mpr + ⟨iSupIndep_massWeightSubmodule, iSup_massWeightSubmodule_eq_top⟩ + +noncomputable instance : GradedAlgebra massWeightSubmodule := + DirectSum.IsInternal.gradedAlgebra massWeightSubmodule_isInternal - sorry - · sorry /-- The mass-dimension scaling on the jet algebra of the charged-lepton singlet: the (linear map underlying the) algebra map multiplying each generator by From ab4608b83f35f74aafb8e655f731259e32c1c352 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 7 Aug 2026 10:17:39 +0100 Subject: [PATCH 109/254] feat: More mass dim --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 30 +++ Physlib/Particles/QED/JetAlgebra/MassDim.lean | 27 ++ .../StandardModel/Fermions/LeptonSinglet.lean | 2 - .../GaugeBosons/BBoson/MassDim.lean | 238 ++++++++++++++++++ 4 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 52a29d30f..171d54cce 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -48,6 +48,36 @@ abbrev JetAlgebra := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (LeptonSinglet.Je namespace JetAlgebra +/-- The B-boson factor included into the QED jet algebra. -/ +noncomputable abbrev inclB : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.includeLeft + +/-- The charged-lepton factor included into the QED jet algebra. -/ +noncomputable abbrev inclL : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.includeRight + +/-- Polynomials pushed forward from the two tensor factors commute: the factors + commute in the tensor product, and the polynomial variable is central. -/ +lemma commute_mapAlgHom_inclB_inclL (p : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) + (q : Polynomial LeptonSinglet.JetAlgebra) : + Commute (Polynomial.mapAlgHom inclB p) (Polynomial.mapAlgHom inclL q) := by + induction p using Polynomial.induction_on' with + | add p₁ p₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_left h₂ + | monomial m a => + induction q using Polynomial.induction_on' with + | add q₁ q₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_right h₂ + | monomial n b => + show Polynomial.mapAlgHom inclB (Polynomial.monomial m a) * + Polynomial.mapAlgHom inclL (Polynomial.monomial n b) = _ + simp only [Polynomial.mapAlgHom, AlgHom.coe_mk, Polynomial.coe_mapRingHom, + Polynomial.map_monomial, Polynomial.monomial_mul_monomial] + rw [Nat.add_comm m n] + congr 1 + show (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) + = ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) * (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + one_mul, mul_one, one_mul, mul_one] + /-! ## A. Elements associated with the generators diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/QED/JetAlgebra/MassDim.lean index e2bbb998c..9bec3f02a 100644 --- a/Physlib/Particles/QED/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/QED/JetAlgebra/MassDim.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.QED.JetAlgebra.LorentzGroup public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.MassDim /-! # Mass dimension on the QED jet algebra @@ -205,6 +206,32 @@ noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := MassWeightLESubmodule n ⊓ InvariantSubmodule +/-! + +## D. The mass dimension polynomial. + +The QED jet algebra is the tensor product of the two factors, and mass weights +add under that product, so the mass-weight polynomial of the whole is assembled +from the two factor polynomials: push each into `Polynomial JetAlgebra` along the +tensor inclusions and multiply. On monomials this is exactly +`X ^ a * b ⊗ X ^ c * l ↦ X ^ (a + c) * (b ⊗ l)`. + +-/ + +/-- The mass-weight polynomial on the QED jet algebra, assembled from the + mass-weight polynomials of the two factors. -/ +noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + (Algebra.TensorProduct.lift (Polynomial.mapAlgHom inclB) + (Polynomial.mapAlgHom inclL) commute_mapAlgHom_inclB_inclL).comp + (Algebra.TensorProduct.map BBoson.JetAlgebra.massWeightPoly + LeptonSinglet.JetAlgebra.massWeightPoly) + +@[simp] +lemma massWeightPoly_tmul (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : + massWeightPoly (b ⊗ₜ[ℂ] l) = + Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) * + Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := rfl + end JetAlgebra end QED diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean index 98c81abea..965d482a0 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean @@ -1653,8 +1653,6 @@ instance : SetLike.GradedMonoid massWeightSubmodule where simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ rw [hx, hy, Polynomial.monomial_mul_monomial] - - /-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass weight `n`. -/ lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean new file mode 100644 index 000000000..525d45a36 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean @@ -0,0 +1,238 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.BBoson.Basic +/-! + +# The mass dimension associated with the `B` boson + +**Important:** Since it is easier to work with natural numbers rather then rationals, + we will work with twice the mass dimension which we will call the `mass weight`. + + +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + + +namespace StandardModel + +open TensorProduct + +namespace BBoson +open Module +namespace JetAlgebra + +/-! + +## The mass weight polynomial + +We define a polynomial associated with each element of the jet algebra, where the coefficient of +`X ^ n` is the sum of all components of mass weight `n`. +This is useful for checking that certain elements are zero, +since an element is zero if and only if all coefficients of its mass-weight polynomial are zero. + +-/ +/-- The mass-weight polynomial on the complexified B-boson jet algebra: the + `ℂ`-algebra map sending each generator `j` to `X ^ w * j`, where `w` is the + mass weight of `j`. + + The component space is a real vector space, so the symmetric-algebra lift + produces an `ℝ`-algebra map; `AlgHom.liftEquiv` turns it into a `ℂ`-algebra map + on the complexification, being the universal property of base change: a + `ℂ`-algebra map out of `ℂ ⊗[ℝ] A` is the same thing as an `ℝ`-algebra map out + of `A`. -/ +noncomputable def massWeightPoly : + (ℂ ⊗[ℝ] JetAlgebra) →ₐ[ℂ] Polynomial (ℂ ⊗[ℝ] JetAlgebra) := + AlgHom.liftEquiv ℝ ℂ JetAlgebra _ + (SymmetricAlgebra.lift (JetComponentSpace.basis.constr ℝ fun j => + Polynomial.monomial j.massWeight ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j))) + +/-- The scalar of the complexification passes straight through. -/ +lemma massWeightPoly_tmul (c : ℂ) (b : JetAlgebra) : + massWeightPoly (c ⊗ₜ[ℝ] b) = c • massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] b) := by + rw [massWeightPoly, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, one_smul] + +/-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ +@[simp] +lemma massWeightPoly_ofGenerator (j : JetGenerators) : + massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) = + Polynomial.monomial j.massWeight ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) := by + rw [massWeightPoly, AlgHom.liftEquiv_tmul, one_smul, ofGenerator, + SymmetricAlgebra.lift_ι_apply, Module.Basis.constr_basis] + rfl + +/-- Setting the formal variable to one recovers the original element. -/ +lemma massWeightPoly_eval_one (x : ℂ ⊗[ℝ] JetAlgebra) : + (massWeightPoly x).eval 1 = x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (ℂ ⊗[ℝ] JetAlgebra)) 1 + fun a => Commute.all a _).comp massWeightPoly = + AlgHom.id ℂ (ℂ ⊗[ℝ] JetAlgebra) := by + refine (AlgHom.liftEquiv ℝ ℂ JetAlgebra _).symm.injective ?_ + refine SymmetricAlgebra.algHom_ext + (Module.Basis.ext JetComponentSpace.basis fun j => ?_) + simp [massWeightPoly, ofGenerator] + exact AlgHom.congr_fun h x + +/-- Every element is the sum of the coefficients of its mass-weight polynomial. -/ +lemma eq_sum_massWeightPoly_coeff (x : ℂ ⊗[ℝ] JetAlgebra) : + x = ∑ n ∈ Polynomial.support (massWeightPoly x), (massWeightPoly x).coeff n := by + conv_lhs => rw [← massWeightPoly_eval_one x] + rw [Polynomial.eval_eq_sum, Polynomial.sum_def] + simp + +/-- `massWeightPoly` is injective, however, it is not surjective. -/ +lemma massWeightPoly_injective : Function.Injective massWeightPoly := by + intro x y h + rw [← massWeightPoly_eval_one x, ← massWeightPoly_eval_one y] + simp [h] + + +/-- Homogeneity of the coefficients for a linear generator: each basis vector is + homogeneous, and a general vector is a combination of basis vectors. -/ +lemma massWeightPoly_coeff_massWeightPoly_ι (n : ℕ) (v : JetComponentSpace) : + massWeightPoly ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ JetComponentSpace v)).coeff n) = + Polynomial.monomial n ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ JetComponentSpace v)).coeff n) := by + have hv : v ∈ Submodule.span ℝ (Set.range JetComponentSpace.basis) := by + rw [JetComponentSpace.basis.span_eq] + trivial + induction hv using Submodule.span_induction generalizing n with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + rw [show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis j) = + ofGenerator j from rfl, massWeightPoly_ofGenerator, Polynomial.coeff_monomial] + split_ifs with h + · rw [← h, massWeightPoly_ofGenerator] + · simp only [map_zero] + | zero => simp only [map_zero, TensorProduct.tmul_zero, Polynomial.coeff_zero] + | add y z _ _ hy hz => + simp only [map_add, TensorProduct.tmul_add, Polynomial.coeff_add] + rw [hy n, hz n] + | smul c y _ hy => + have h : ((1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ JetComponentSpace (c • y) + : ℂ ⊗[ℝ] JetAlgebra) = + (algebraMap ℝ ℂ c) • ((1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ JetComponentSpace y) := by + rw [map_smul, TensorProduct.tmul_smul, ← algebraMap_smul ℂ c] + rw [h, map_smul, Polynomial.coeff_smul, map_smul, hy n, Polynomial.smul_monomial] + +/-- Homogeneity of the coefficients is inherited by products: the `n`-th + coefficient of a product is a sum of products of coefficients of complementary + degrees. -/ +lemma massWeightPoly_coeff_massWeightPoly_mul {a b : ℂ ⊗[ℝ] JetAlgebra} + (ha : ∀ n, massWeightPoly ((massWeightPoly a).coeff n) = + Polynomial.monomial n ((massWeightPoly a).coeff n)) + (hb : ∀ n, massWeightPoly ((massWeightPoly b).coeff n) = + Polynomial.monomial n ((massWeightPoly b).coeff n)) (n : ℕ) : + massWeightPoly ((massWeightPoly (a * b)).coeff n) = + Polynomial.monomial n ((massWeightPoly (a * b)).coeff n) := by + rw [map_mul massWeightPoly a b, Polynomial.coeff_mul, map_sum massWeightPoly, + map_sum (Polynomial.monomial n)] + refine Finset.sum_congr rfl fun p hp => ?_ + rw [Finset.mem_antidiagonal] at hp + subst hp + rw [map_mul massWeightPoly, ha p.1, hb p.2, Polynomial.monomial_mul_monomial] + +/-- Homogeneity on the real part of the complexification, by induction over the + symmetric algebra. -/ +lemma massWeightPoly_coeff_massWeightPoly_one_tmul (n : ℕ) (b : JetAlgebra) : + massWeightPoly ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] b)).coeff n) = + Polynomial.monomial n ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] b)).coeff n) := by + induction b using SymmetricAlgebra.induction generalizing n with + | algebraMap r => + rw [show (1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ JetAlgebra r) = + algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (r : ℂ) from by + rw [Algebra.algebraMap_eq_smul_one, Algebra.algebraMap_eq_smul_one, + TensorProduct.tmul_smul, TensorProduct.smul_tmul'] + rfl] + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs with h + · subst h + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.monomial_zero_left] + · simp only [map_zero] + | ι v => exact massWeightPoly_coeff_massWeightPoly_ι n v + | mul a b ha hb => + rw [show (1 : ℂ) ⊗ₜ[ℝ] (a * b) = ((1 : ℂ) ⊗ₜ[ℝ] a) * ((1 : ℂ) ⊗ₜ[ℝ] b) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul]] + exact massWeightPoly_coeff_massWeightPoly_mul ha hb n + | add a b ha hb => + rw [TensorProduct.tmul_add, map_add massWeightPoly, Polynomial.coeff_add, + map_add massWeightPoly, ha n, hb n] + exact (map_add (Polynomial.monomial n) _ _).symm + +/-- The coefficients of a mass-weight polynomial are homogeneous: the coefficient + of `X ^ n` in `massWeightPoly x` is sent by `massWeightPoly` to `X ^ n` times + itself. + + This fails for a general `p : Polynomial (ℂ ⊗[ℝ] JetAlgebra)` in place of + `massWeightPoly x`: for `p = Polynomial.monomial 5 1` it would say + `1 = X ^ 5`. -/ +lemma massWeightPoly_coeff_massWeightPoly (n : ℕ) (x : ℂ ⊗[ℝ] JetAlgebra) : + massWeightPoly ((massWeightPoly x).coeff n) = + Polynomial.monomial n ((massWeightPoly x).coeff n) := by + induction x using TensorProduct.induction_on generalizing n with + | zero => simp only [map_zero, Polynomial.coeff_zero] + | add a b ha hb => + rw [map_add massWeightPoly, Polynomial.coeff_add, map_add massWeightPoly, ha n, hb n] + exact (map_add (Polynomial.monomial n) _ _).symm + | tmul c b => + rw [massWeightPoly_tmul, Polynomial.coeff_smul, map_smul, + massWeightPoly_coeff_massWeightPoly_one_tmul n b, Polynomial.smul_monomial] + + +/-! + +## B. The mass weight submodule + +We combine the coefficents of `massWeightPoly` into a submodule. +-/ + + +/-- The submodule of elements of mass weight `n`: those `x` whose mass-weight + polynomial is `x * X ^ n`. -/ +def massWeightSubmodule (n : ℕ) : Submodule ℂ (ℂ ⊗[ℝ] JetAlgebra) where + carrier := {x | massWeightPoly x = Polynomial.monomial n x} + add_mem' {a b} ha hb := by + simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ + rw [ha, hb] + zero_mem' := by simp + smul_mem' c x hx := by + simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ + rw [hx, Polynomial.smul_monomial] + +@[simp] +lemma mem_massWeightSubmodule {n : ℕ} {x : ℂ ⊗[ℝ] JetAlgebra} : + x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl + +/-- The generator `j` has mass weight `j.massWeight`. -/ +lemma ofGenerator_mem_massWeightSubmodule (j : JetGenerators) : + (1 : ℂ) ⊗ₜ[ℝ] ofGenerator j ∈ massWeightSubmodule j.massWeight := + massWeightPoly_ofGenerator j + +/-- Mass weights add under multiplication, and `1` has mass weight zero. -/ +instance : SetLike.GradedMonoid massWeightSubmodule where + one_mem := by simp + mul_mem {m n x y} hx hy := by + simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ + rw [hx, hy, Polynomial.monomial_mul_monomial] + +/-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass + weight `n`. -/ +lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : ℂ ⊗[ℝ] JetAlgebra) : + (massWeightPoly x).coeff n ∈ massWeightSubmodule n := + massWeightPoly_coeff_massWeightPoly n x + +TODO "Show invariance of the mass weights with repsect to the Lorentz group." + +end JetAlgebra + +end BBoson + +end StandardModel From 4923eaea6bd6c288d12bdab9652f484a9b9cefd4 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:24:54 +0100 Subject: [PATCH 110/254] refactor: add jets result --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 201 +++++++++++++++++- .../JetAlgebra/Invariants/MonomialForm.lean | 6 - .../GaugeBosons/BBoson/Basic.lean | 11 + 3 files changed, 201 insertions(+), 17 deletions(-) diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 171d54cce..76947a37d 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -212,6 +212,7 @@ noncomputable def jetDerivM (t : Multiset (Fin 1 ⊕ Fin 3)) : JetAlgebra →ₗ[ℂ] JetAlgebra := Multiset.foldr (fun ν A => jetDeriv ν ∘ₗ A) LinearMap.id t +@[simp] lemma jetDerivM_zero : jetDerivM 0 = LinearMap.id := by simp [jetDerivM] @@ -223,6 +224,96 @@ lemma jetDerivM_singleton (μ : Fin 1 ⊕ Fin 3) : jetDerivM {μ} = jetDeriv μ rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, jetDerivM_cons, jetDerivM_zero, LinearMap.comp_id] +lemma jetDerivM_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + jetDerivM (s + t) = jetDerivM s ∘ₗ jetDerivM t := by + induction s using Multiset.induction_on with + | empty => simp [jetDerivM_zero] + | cons μ s ih => + trans jetDerivM (μ ::ₘ (s + t)) + · simp + simp only [jetDerivM_cons, ih] + exact Eq.symm (LinearMap.comp_assoc (jetDerivM t) (jetDerivM s) (jetDeriv μ)) + +lemma jetDerivM_cons' (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : + jetDerivM (ν ::ₘ t) = jetDerivM t ∘ₗ jetDeriv ν := by + trans jetDerivM (t + {ν}) + · congr + rw [add_comm] + simp + · rw [jetDerivM_add, jetDerivM_singleton] + +lemma jetDerivM_jetDerivM (s t : Multiset (Fin 1 ⊕ Fin 3)) (x : JetAlgebra) : + jetDerivM t (jetDerivM s x) = jetDerivM (t + s) x := by + rw [jetDerivM_add] + simp + +lemma jetDerivM_jetDeriv (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) + (a : JetAlgebra) : + jetDerivM t (jetDeriv μ a) = jetDerivM (μ ::ₘ t) a := by + trans (jetDerivM t ∘ₗ jetDeriv μ) a + · rfl + rw [← jetDerivM_cons'] + +lemma jetDeriv_jetDerivM (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) + (a : JetAlgebra) : + jetDeriv μ (jetDerivM t a) = jetDerivM (μ ::ₘ t) a := by + trans (jetDeriv μ ∘ₗ jetDerivM t) a + · rfl + rw [← jetDerivM_cons] + +lemma ofGenerator_dB_eq_jetDerivM (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + [JetGenerators.dB s μ]ₐ = jetDerivM s [.dB 0 μ]ₐ := by + induction s using Multiset.induction_on with + | empty => rw [jetDerivM_zero, LinearMap.id_coe, id_eq] + | cons ν t ih => + rw [jetDerivM_cons, LinearMap.comp_apply, ← ih] + simp only [ofGenerator] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, + add_zero, BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] + congr 2 + rw [add_comm, Multiset.singleton_add] + +lemma jetDerivM_apply_mul_eq_powerset_sum (t : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : + jetDerivM t (x * y) = (t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum := by + induction t using Multiset.induction_on with + | empty => + simp only [jetDerivM_zero, LinearMap.id_coe, id_eq, Multiset.powerset_zero, zero_tsub, + Multiset.map_singleton, Multiset.sum_singleton] + | cons ν t ih => + calc _ + _ = jetDeriv ν (jetDerivM t (x * y)) := by simp [jetDerivM_cons] + _ = jetDeriv ν ((t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum) := by + congr + _ = (t.powerset.map (jetDeriv ν ∘ fun s => (jetDerivM s x * jetDerivM (t - s) y))).sum := by + rw [← Multiset.map_map] + exact map_multiset_sum (jetDeriv ν) _ + _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x * jetDerivM (t - s) y))).sum := by + rfl + _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y + + jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by + simp [jetDeriv_mul] + _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum + + (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by + exact Multiset.sum_map_add + _ = (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum + + (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum + := by abel + conv_rhs => rw [Multiset.powerset_cons] + simp only [Multiset.map_add, Multiset.map_map, Function.comp_apply, Multiset.sub_cons, + Multiset.erase_cons_head, Multiset.sum_add] + congr 1 + · congr 1 + apply Multiset.map_congr (by rfl) + intro s hs + rw [jetDeriv_jetDerivM] + congr + exact (Multiset.cons_sub_of_le ν (Multiset.mem_powerset.mp hs)).symm + · congr + funext s + simp [jetDeriv_jetDerivM] + + /-! @@ -289,6 +380,12 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] +/-- Two covariant lepton derivatives anticommute. -/ +lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dψ l α * Dψ l' β = - (Dψ l' β * Dψ l α) := by + sorry + + /-- One covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` for the conjugate lepton on the QED jet algebra: the conjugate component function `ψ̄_α` carries @@ -685,6 +782,99 @@ lemma repJetGaugeGroupI_tmul_ι (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.Je rw [repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι] +/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge + transformations acts on it through the character of its value at the base + point alone, with no derivative contributions. This is the base case of + `repJetGaugeGroupI_Dψ`. -/ +lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : + repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by + rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, + Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] + +lemma repJetGaugeGroupI_dψ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U [.dψ s α]ₐ = + ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + [.dψ (Finsupp.toMultiset p.2) α]ₐ := by + rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, + StandardModel.LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ] + simp [tmul_sum, ← ofGenerator_dψ_eq] + +lemma repJetGaugeGroupI_apply_dB (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U [JetGenerators.dB s μ]ₐ = + [JetGenerators.dB s μ]ₐ + (BBoson.mcShift U (.basis (.dB s μ))) • 1 := by + rw [ofGenerator_B_eq, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, TensorProduct.add_tmul, + TensorProduct.smul_tmul'] + rfl + + + +/-- The statement that if `x` and all its derivatives transform in the + same way that `ψ` transforms under the full + gauge group, then `covariantStep μ x` transforms this.-/ +lemma repJetGaugeGroupI_jetDerivM_covariantStep + (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) + (hx : ∀ s, (repJetGaugeGroupI U) (jetDerivM s x) + = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + jetDerivM (Finsupp.toMultiset p.2) x) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI U (jetDerivM s (covariantStep μ x)) = + ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by + calc _ + _ = repJetGaugeGroupI U (jetDerivM s (jetDeriv μ x - + (6 * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x))) := by + rfl + -- 1. Split the covariant step: `jetDerivM s` and `repJetGaugeGroupI U` are + -- linear, and `jetDerivM s (jetDeriv μ x) = jetDerivM (μ ::ₘ s) x` by + -- `jetDerivM_cons` together with `jetDerivM_add` / `jetDeriv_comm`. + _ = repJetGaugeGroupI U (jetDerivM (μ ::ₘ s) x) - + (6 * Complex.I) • repJetGaugeGroupI U (jetDerivM s ([JetGenerators.dB {} μ]ₐ * x)) := by + sorry + -- 2. `rw [hx (μ ::ₘ s)]` turns the first term into the expected sum at the + -- enlarged index `μ ::ₘ s`. + -- + -- 3. Leibniz on the gauge-field term via `jetDerivM_apply_mul`, then + -- `repJetGaugeGroupI_apply_mul` to split the action across each product: + -- ρ (∂_s (B_μ * x)) = ∑_q w_q • (ρ (∂_{q.1} B_μ) * ρ (∂_{q.2} x)) + -- NOTE: `jetDerivM_apply_mul` needs weight `Nat.choose`, not + -- `Nat.descFactorial`. At `s = {μ, μ}` the splitting `a = s` wants + -- `C(2,2) = 1`, but `Nat.descFactorial 2 2 = 2`. (`descFactorial` is + -- correct in `hx`: that comes from `jetRingAction` on a + -- factorial-weighted basis, a different normalisation.) + -- + -- 4. The gauge field is a coordinate, so it only shifts by a constant: + -- ρ_U (∂_a B_μ) = ∂_a B_μ + mcShift U [∂_{a+μ} B] • 1 + -- the QED-level counterpart of `BBoson.repJetGaugeGroupI_apply_dB` + -- transported through `repJetGaugeGroupI_tmul'`, together with + -- `jetDerivM a [dB {} μ]ₐ = [dB a μ]ₐ`. Neither exists yet. + -- + -- 5. The `x`-factor of each term is the hypothesis again, at index `q.2`. + -- + -- 6. Match against the target, expanded the same way: + -- ∂_p (D_μ x) = ∂_{μ ::ₘ p} x - 6i • ∂_p (B_μ * x) + -- Needs a Vandermonde/Pascal identity relating the weights at `μ ::ₘ s` + -- to those at `s` (reconciling `descFactorial` with `choose`), and + -- `coeff_p (u ^ 6)` at a shifted index expressed through the + -- Maurer–Cartan coefficients — the all-orders form of + -- `pderiv_pow_unitary`, currently only an inline `have` in + -- `LeptonSinglet`. That identity is what makes the shift from step 4 + -- cancel the derivative of the hypercharge character. + _ = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ ν, (Multiset.toFinsupp s ν).descFactorial (p.1 ν) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by + sorry + /-- The linear-matter submodule is closed under the gauge group: the gauge action preserves the matter degree, because it acts on the matter factor functorially in the component space and so intertwines with the canonical inclusion. -/ @@ -715,17 +905,6 @@ lemma map_repJetGaugeGroupI_LinearMatterSubmodule (U : JetGaugeGroupI) : repJetGaugeGroupI_mem_LinearMatterSubmodule U⁻¹ hx, repJetGaugeGroupI.self_inv_apply U x⟩ -/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge - transformations acts on it through the character of its value at the base - point alone, with no derivative contributions. This is the base case of - `repJetGaugeGroupI_Dψ`. -/ -lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : - repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by - rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, - Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] - /-- The embedded field-strength derivatives are gauge invariant. -/ lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean index 5dd25893f..de4d562dc 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean +++ b/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean @@ -104,12 +104,6 @@ lemma leptonLinearIncl_mul_leptonLinearIncl_anticomm (x y : LeptonLinear) : Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, hι a b, mul_comm q p, TensorProduct.tmul_neg] -/-- Two covariant lepton derivatives anticommute. -/ -lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dψ l α * Dψ l' β = -(Dψ l' β * Dψ l α) := by - rw [Dψ_eq_leptonLinearIncl, Dψ_eq_leptonLinearIncl, - leptonLinearIncl_mul_leptonLinearIncl_anticomm] - /-! ### Parametric boosts along the three axes diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index 2550cbfaa..96840caa6 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -799,6 +799,17 @@ lemma constantCoeff_mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) rw [Complex.coe_selfAdjointEquiv] rfl +lemma mcShift_dB_of_list_eq (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : + (mcShift U (.basis (.dB ↑l ν)) : ℂ) = + MvPowerSeries.constantCoeff (mcShiftSeries U ν l) := by + have h := factorial_coeff_mcShiftSeries U ν l 0 + simp only [Finsupp.coe_zero, Pi.zero_apply, Nat.factorial_zero, Finset.prod_const_one, + Nat.cast_one, one_mul, zero_add] at h + rw [← coeff_zero_eq_constantCoeff_apply, h, mcShift_basis_dB', nsmul_eq_mul] + push_cast + rw [Complex.coe_selfAdjointEquiv] + rfl + /-! ## C.2. The Maurer–Cartan jet series and the exponential family From 881d68f629a898339f662210beaad83dc743a2ce Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:25:42 +0100 Subject: [PATCH 111/254] feat: Add jetDerivM result --- Physlib/Particles/QED/JetAlgebra/Basic.lean | 65 ++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 76947a37d..3a6e63b5d 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -313,6 +313,69 @@ lemma jetDerivM_apply_mul_eq_powerset_sum (t : Multiset (Fin 1 ⊕ Fin 3)) (x y funext s simp [jetDeriv_jetDerivM] +lemma jetDerivM_apply_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : + jetDerivM s (x * y) = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ ν, (Multiset.toFinsupp s ν).choose (p.1 ν) : ℕ) : ℂ) • + (jetDerivM (Finsupp.toMultiset p.1) x * jetDerivM (Finsupp.toMultiset p.2) y) := by + have hcount : ∀ u t : Multiset (Fin 1 ⊕ Fin 3), Multiset.count t u.powerset = + ∏ ν, (Multiset.count ν u).choose (Multiset.count ν t) := by + intro u + induction u using Multiset.induction_on with + | empty => + intro t + rcases eq_or_ne t 0 with rfl | h + · simp + · obtain ⟨a, ha⟩ := Multiset.exists_mem_of_ne_zero h + rw [Finset.prod_eq_zero (Finset.mem_univ a)] + · simp [h] + · simp [Nat.choose_eq_zero_of_lt, Multiset.count_pos.mpr ha] + | cons a u ih => + intro t + rw [Multiset.powerset_cons, Multiset.count_add] + by_cases ha : a ∈ t + · obtain ⟨m, hm⟩ : ∃ m, Multiset.count a t = m + 1 := + ⟨Multiset.count a t - 1, by have := Multiset.count_pos.mpr ha; omega⟩ + have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = + Multiset.count (t.erase a) u.powerset := by + conv_lhs => rw [← Multiset.cons_erase ha] + exact Multiset.count_map_eq_count' _ _ (fun v w h => by simpa using h) _ + have hQ : ∀ ν ∈ Finset.univ.erase a, + (Multiset.count ν u).choose (Multiset.count ν (t.erase a)) = + (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by + rw [Multiset.count_erase_of_ne (Finset.mem_erase.mp hν).1] + have hR : ∀ ν ∈ Finset.univ.erase a, + (Multiset.count ν (a ::ₘ u)).choose (Multiset.count ν t) = + (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by + rw [Multiset.count_cons_of_ne (Finset.mem_erase.mp hν).1] + rw [h2, ih t, ih (t.erase a)] + simp only [← Finset.mul_prod_erase Finset.univ _ (Finset.mem_univ a)] + rw [Finset.prod_congr rfl hQ, Finset.prod_congr rfl hR, ← add_mul, + Multiset.count_erase_self, Multiset.count_cons_self, hm, Nat.add_sub_cancel, + Nat.choose_succ_succ'] + ring + · have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = 0 := + Multiset.count_eq_zero.mpr fun h => by + obtain ⟨v, _, rfl⟩ := Multiset.mem_map.mp h + exact ha (Multiset.mem_cons_self a v) + rw [h2, ih t, add_zero] + refine Finset.prod_congr rfl fun ν _ => ?_ + rcases eq_or_ne ν a with rfl | hν + · simp [Multiset.count_eq_zero.mpr ha] + · rw [Multiset.count_cons_of_ne hν] + have hsum : ∀ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + Finsupp.toMultiset p.1 + Finsupp.toMultiset p.2 = s := fun p hp => by + rw [← map_add, Finset.mem_antidiagonal.mp hp, Multiset.toFinsupp_toMultiset] + rw [jetDerivM_apply_mul_eq_powerset_sum, Finset.sum_multiset_map_count] + refine Finset.sum_nbij' (fun t => (Multiset.toFinsupp t, Multiset.toFinsupp (s - t))) + (fun p => Finsupp.toMultiset p.1) (fun t ht => ?_) (fun p hp => ?_) + (fun t _ => Multiset.toFinsupp_toMultiset t) (fun p hp => ?_) (fun t _ => ?_) + · rw [Finset.mem_antidiagonal, ← map_add, add_tsub_cancel_of_le (by simpa using ht)] + · simpa using Multiset.le_iff_exists_add.mpr ⟨Finsupp.toMultiset p.2, (hsum p hp).symm⟩ + · refine Prod.ext (Finsupp.toMultiset_toFinsupp p.1) ?_ + rw [← hsum p hp, add_tsub_cancel_left] + exact Finsupp.toMultiset_toFinsupp p.2 + · simp only [Multiset.toFinsupp_apply, Multiset.toFinsupp_toMultiset, hcount] + exact (Nat.cast_smul_eq_nsmul ℂ _ _).symm /-! @@ -817,7 +880,7 @@ lemma repJetGaugeGroupI_apply_dB (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ F /-- The statement that if `x` and all its derivatives transform in the same way that `ψ` transforms under the full gauge group, then `covariantStep μ x` transforms this.-/ -lemma repJetGaugeGroupI_jetDerivM_covariantStep +lemma repJetGaugeGroupI_jetDerivM_covariantSteplemma (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) (hx : ∀ s, (repJetGaugeGroupI U) (jetDerivM s x) = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), From e37bdfc438af5cf985069ed63f6a37a71845bfc6 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:58:27 +0100 Subject: [PATCH 112/254] feat: Sort leptonsinglets --- Physlib.lean | 8 +- Physlib/Particles/QED/JetAlgebra/Basic.lean | 10 +- .../EFTLagrangianExclDeriv/Basic.lean | 2 +- .../StandardModel/Fermions/LeptonSinglet.lean | 1807 ----------------- .../Fermions/LeptonSinglet/Basic.lean | 274 +++ .../LeptonSinglet/JetAlgebra/Basic.lean | 66 + .../LeptonSinglet/JetAlgebra/GaugeAction.lean | 170 ++ .../LeptonSinglet/JetAlgebra/JetDeriv.lean | 180 ++ .../JetAlgebra/LorentzAction.lean | 132 ++ .../LeptonSinglet/JetAlgebra/MassDim.lean | 477 +++++ .../LeptonSinglet/JetComponentSpace.lean | 809 ++++++++ 11 files changed, 2118 insertions(+), 1817 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/JetDeriv.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean diff --git a/Physlib.lean b/Physlib.lean index 39ec81312..93882c844 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -193,7 +193,13 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.Permutations public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.MassDim +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetComponentSpace public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.UpSinglet public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean index 3a6e63b5d..5b5db5413 100644 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ b/Physlib/Particles/QED/JetAlgebra/Basic.lean @@ -14,7 +14,7 @@ public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Particles.LagrangianTheory.Basic -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.MassDim /-! # Jet algebra for quantum electrodynamics @@ -443,13 +443,6 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] -/-- Two covariant lepton derivatives anticommute. -/ -lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dψ l α * Dψ l' β = - (Dψ l' β * Dψ l α) := by - sorry - - - /-- One covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` for the conjugate lepton on the QED jet algebra: the conjugate component function `ψ̄_α` carries hypercharge `-6`, so its coupling is the opposite of that in @@ -877,6 +870,7 @@ lemma repJetGaugeGroupI_apply_dB (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ F +set_option maxHeartbeats 1000000 in /-- The statement that if `x` and all its derivatives transform in the same way that `ψ` transforms under the full gauge group, then `covariantStep μ x` transforms this.-/ diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean index ff0f46c45..6ea12fa4c 100644 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean @@ -10,7 +10,7 @@ public import Physlib.Relativity.Fermions.Weyl.Metric public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.DownSinglet public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.UpSinglet public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean deleted file mode 100644 index 965d482a0..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet.lean +++ /dev/null @@ -1,1807 +0,0 @@ -/- -Copyright (c) 2026 Nathaneal Sajan. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic -public import Mathlib.RingTheory.TensorProduct.Basic -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Mathematics.ConjModule -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Particles.LagrangianTheory.Basic -public import Mathlib.Algebra.TrivSqZeroExt.Basic -/-! -# Charged-lepton singlets - -## i. Overview - -The Standard Model charged-lepton singlet is a right-handed Weyl spinor in the `(1, 1)_{-6}` -representation. Here charges are normalized as `6Y`, so `-6` is the usual hypercharge -`Y = -1`. - -`LeptonSinglet` is the target vector space of one charged-lepton singlet. Its only index is -the Lorentz index carried by the Weyl spinor. - -The Lorentz and gauge actions are first defined separately. The gauge action is then computed -on an arbitrary spinor, used to identify its kernel, and descended to each supported global -form of the Standard Model gauge group. - -## ii. Key results - -- `LeptonSinglet` : the target space of the `(1, 1)_{-6}` multiplet. -- `repLorentzGroup` : the right-handed Lorentz action. -- `repGaugeGroupI` : the action of the unquotiented gauge group. -- `repGaugeGroupI_apply` : the gauge action on a spinor. -- `mem_repGaugeGroupI_ker_iff_eq` : the kernel of the full-group action. -- `gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI` : triviality of the central `ℤ₆`. -- `repGaugeGroup` : the action descended to every supported gauge-group quotient. - -## iii. Table of contents - -- A. The charged-lepton-singlet space -- B. Linear structure -- C. Lorentz action -- D. Gauge action -- E. Kernel of the gauge action -- F. Descent to quotient gauge groups -- G. Jet gauge action - --/ - -@[expose] public section - -namespace StandardModel - -/-! - -## A. The charged-lepton-singlet space - -The Weyl spinor carries the right-handed Lorentz index, and it is the whole of the multiplet: -a charged-lepton singlet has no colour index and no weak-isospin index. --/ - -/-- The target vector space of one Standard Model charged-lepton singlet. - It carries the `(1, 1)_{-6}` representation of the gauge group. -/ -@[ext] -structure LeptonSinglet where - /-- The right-handed Weyl spinor. -/ - val : Fermion.RightHandedWeyl - -namespace LeptonSinglet - -/-! - -## B. Linear structure - -The wrapper distinguishes charged-lepton singlets from other isomorphic vector spaces. -The following equivalences transfer the linear structure of the Weyl-spinor space and expose -that model when defining representations. --/ - -/-- Identifies a charged-lepton singlet with its underlying Weyl spinor. -/ -def valEquiv : LeptonSinglet ≃ Fermion.RightHandedWeyl where - toFun := val - invFun := fun m => ⟨m⟩ - -instance : AddCommGroup LeptonSinglet := Equiv.addCommGroup valEquiv - -instance : Module ℂ LeptonSinglet := Equiv.module ℂ valEquiv - -/-- The linear identification with the underlying Weyl-spinor space. -/ -def valLinEquiv : LeptonSinglet ≃ₗ[ℂ] Fermion.RightHandedWeyl where - toFun := val - invFun := fun m => ⟨m⟩ - map_add' := by intros; rfl - map_smul' := by intros; rfl - -@[simp] -lemma valLinEquiv_apply (l : LeptonSinglet) : valLinEquiv l = l.val := rfl - -lemma valLinEquiv_symm_apply (m : Fermion.RightHandedWeyl) : - valLinEquiv.symm m = ⟨m⟩ := rfl - -@[simp] -lemma val_add (l₁ l₂ : LeptonSinglet) : (l₁ + l₂).val = l₁.val + l₂.val := rfl - -@[simp] -lemma val_smul (r : ℂ) (l : LeptonSinglet) : (r • l).val = r • l.val := rfl - -/-! - -## The basis of the charged-lepton-singlet space - --/ - -/-- A basis on the charged-lepton singlets. -/ -noncomputable def basis : Module.Basis (Fin 2) ℂ LeptonSinglet := - Fermion.RightHandedWeyl.basis.map valLinEquiv.symm - -/-! - -## C. Lorentz action - -The Lorentz group acts through the right-handed Weyl representation, transported along the -identification of a charged-lepton singlet with its spinor. --/ - -open Matrix MatrixGroups - -/-- The right-handed Lorentz representation on charged-lepton singlets. -/ -noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonSinglet where - toFun Λ := valLinEquiv.symm ∘ₗ Fermion.RightHandedWeyl.rep Λ ∘ₗ valLinEquiv - map_one' := by - ext l - simp [Module.End.one_eq_id] - map_mul' Λ₁ Λ₂ := by - ext1 l - simp [Module.End.mul_eq_comp] - -/-- The Lorentz action on the lepton-singlet basis: the right-handed Weyl - action by the entrywise conjugate matrix. -/ -lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (basis α) = ∑ β, star (Λ.1 β α) • basis β := by - simp only [basis, Module.Basis.map_apply, repLorentzGroup, MonoidHom.coe_mk, - OneHom.coe_mk, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, - LinearEquiv.apply_symm_apply, Fermion.RightHandedWeyl.rep_apply_basis, - Matrix.map_apply, map_sum, map_smul] - -/-- The lepton jet coordinates transform contragrediently, by the entrywise - conjugate of the inverse matrix. -/ -lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup.dual Λ (basis.dualBasis α) = - ∑ β, star ((Λ⁻¹).1 α β) • basis.dualBasis β := - Representation.dual_apply_dualBasis _ _ _ _ - (Matrix.of fun l j => star ((Λ⁻¹).1 l j)) - (fun j => repLorentzGroup_apply_basis Λ⁻¹ j) - -/-- The Lorentz action on the conjugate lepton basis: the coefficients are the - conjugates of those of the lepton action, that is, the matrix itself. -/ -lemma repLorentzGroup_conj_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup.conj Λ (basis.conj α) = ∑ β, Λ.1 β α • basis.conj β := by - rw [Representation.conj_apply, Module.Basis.conj_apply, - LinearEquiv.symm_apply_apply, repLorentzGroup_apply_basis, map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [LinearEquiv.map_smulₛₗ, starRingEnd_apply, star_star, Module.Basis.conj_apply] - -/-- The conjugate lepton jet coordinates transform by the inverse matrix. -/ -lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup.conj.dual Λ (basis.conj.dualBasis α) = - ∑ β, (Λ⁻¹).1 α β • basis.conj.dualBasis β := - Representation.dual_apply_dualBasis _ _ _ _ - (Matrix.of fun l j => (Λ⁻¹).1 l j) - (fun j => repLorentzGroup_conj_apply_basis Λ⁻¹ j) - -/-! - -## D. Global Gauge action - -The colour and weak factors act trivially, so the gauge group acts only through hypercharge. -The `U(1)` action is `star z ^ 6`; since `z` is unitary, `star z = z⁻¹`, so this represents -charge `-6`. - -The formulas below expose the scalar used to compare actions and compute the kernel. --/ - -/-- The `(1, 1)_{-6}` action of the unquotiented Standard Model gauge group. -/ -noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI LeptonSinglet where - toFun g := valLinEquiv.symm ∘ₗ - LinearMap.lsmul ℂ Fermion.RightHandedWeyl (star g.toU1.1 ^ 6 : ℂ) - ∘ₗ valLinEquiv - map_one' := by - ext l - simp [valLinEquiv_symm_apply] - map_mul' g₁ g₂ := by - ext l - simp [smul_smul, mul_comm, valLinEquiv_symm_apply] - ring_nf - -/-- The gauge group acts on a charged-lepton singlet by the hypercharge scalar alone. -/ -lemma repGaugeGroupI_apply (g : GaugeGroupI) (ψ : Fermion.RightHandedWeyl) : - repGaugeGroupI g ⟨ψ⟩ = ⟨(star g.toU1.1 ^ 6) • ψ⟩ := rfl - -open Fermion in -/-- The gauge action is diagonal in the standard Weyl basis. -/ -lemma repGaugeGroupI_basis (g : GaugeGroupI) (k : Fin 2) : - repGaugeGroupI g ⟨RightHandedWeyl.basis k⟩ = - (star g.toU1.1 ^ 6) • (⟨RightHandedWeyl.basis k⟩ : LeptonSinglet) := rfl - -open Fermion in -/-- Two gauge elements induce the same action exactly when their hypercharge scalars agree. -/ -lemma repGaugeGroupI_eq_iff {g₁ g₂ : GaugeGroupI} : - repGaugeGroupI g₁ = repGaugeGroupI g₂ ↔ - star g₁.toU1.1 ^ 6 = star g₂.toU1.1 ^ 6 := by - constructor - · intro h - have h' := congrFun (congrArg (fun f => f.1) h) - (⟨RightHandedWeyl.basis 0⟩ : LeptonSinglet) - simp only [LinearMap.coe_toAddHom, repGaugeGroupI_apply] at h' - have h'' := congrArg (fun v => RightHandedWeyl.basis.repr (LeptonSinglet.val v) 0) h' - simpa using h'' - · intro h - have h' : (starRingEnd ℂ) g₁.toU1.1 ^ 6 = (starRingEnd ℂ) g₂.toU1.1 ^ 6 := h - ext l - simp [repGaugeGroupI, h'] - -/-! - -## E. Kernel of the gauge action - -An element acts trivially exactly when its hypercharge scalar is one. Its colour and weak -components are unrestricted, since neither appears in the action. --/ - -/-- Characterizes the full-group elements acting trivially on the charged-lepton singlet. -/ -lemma mem_repGaugeGroupI_ker_iff_eq {g : GaugeGroupI} : - g ∈ repGaugeGroupI.ker ↔ star g.toU1.1 ^ 6 = 1 := by - rw [MonoidHom.mem_ker, ← MonoidHom.map_one repGaugeGroupI, repGaugeGroupI_eq_iff] - simp - -/-! - -## F. Descent to quotient gauge groups - -A representation descends through a quotient when the quotient subgroup lies in its kernel. -The `U(1)` component of a central element is a sixth root of unity, so conjugating and raising -to the sixth power gives one, and charge `-6` therefore acts trivially. --/ - -/-- The central `ℤ₆` subgroup acts trivially on `(1, 1)_{-6}`. -/ -lemma gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI : - GaugeGroupQuot.subgroup .ℤ₆ ≤ repGaugeGroupI.ker := by - simp only [GaugeGroupQuot.subgroup, gaugeGroupℤ₆SubGroup, SetLike.le_def, - MonoidHom.mem_range, gaugeGroupℤ₆Hom_apply, Subtype.exists, - mem_repGaugeGroupI_ker_iff_eq, forall_exists_index] - rintro g x hx ⟨rfl⟩ - simp only [gaugeGroupℤ₆OfRoot_toU1, gaugeGroupℤ₆UnitaryOfRoot_coe] - have hx6 : (((x : ℂˣ) : ℂ)) ^ 6 = 1 := (mem_rootsOfUnity' 6 x).mp hx - simpa [map_pow] using congrArg (starRingEnd ℂ) hx6 - -/-- Every supported quotient subgroup acts trivially on the charged-lepton singlet. -/ -lemma gaugeGroup_subgroup_le_ker_repGaugeGroupI (Q : GaugeGroupQuot) : - Q.subgroup ≤ repGaugeGroupI.ker := Q.subgroup_le_subgroup_ℤ₆.trans - gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI - -/-- The `(1, 1)_{-6}` representation for every supported global form of the - Standard Model gauge group. -/ -noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → - Representation ℂ (GaugeGroup Q) LeptonSinglet - | .I => repGaugeGroupI - | .ℤ₆ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₆) - | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) - | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) - -/-! - -## G. The jet component vector space - -A Lagrangian containing a charged lepton singlet may have terms -of the form `∂_μ ∂_ν ψ`. These expressions should be considered as -component functions which takes in a section of the -bundle of charged lepton singlets and returns a complex number. - -The space of all such component functions is what we call the jet component space. -The lagrangian is an element of the algebra over all such component -functions for all the fields in the theory. - -For matter particles, the (jet) Gauge group acts on the -jet component space as a representation. This is not case for the gauge bosons. - --/ - -open TensorProduct LagrangianTheory - -inductive JetGenerators where - | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators - | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators -deriving DecidableEq - -def JetGenerators.equiv : JetGenerators ≃ - (Multiset (Fin 1 ⊕ Fin 3) × Fin 2 ⊕ Multiset (Fin 1 ⊕ Fin 3) × Fin 2) where - toFun - | JetGenerators.dψ s α => Sum.inl (s, α) - | JetGenerators.dbarψ s α => Sum.inr (s, α) - invFun - | Sum.inl (s, α) => JetGenerators.dψ s α - | Sum.inr (s, α) => JetGenerators.dbarψ s α - left_inv := by - intro x - cases x <;> rfl - right_inv := by - intro x - cases x <;> rfl - -def JetGenerators.massWeight : JetGenerators → ℕ - | JetGenerators.dψ s _ => 3 + 2 * s.card - | JetGenerators.dbarψ s _ => 3 + 2 * s.card - -abbrev JetComponentSpace := - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) × - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet)) - -noncomputable def JetComponentSpace.basis : Module.Basis JetGenerators ℂ JetComponentSpace := - ((DerivAlgebraComplex.basis.tensorProduct - LeptonSinglet.basis.dualBasis).prod - (DerivAlgebraComplex.basis.tensorProduct - (LeptonSinglet.basis.conj.dualBasis))).reindex JetGenerators.equiv.symm - -/-- The basis vector of the jet component space at the zeroth-order singlet - generator: the unit of the dual jet algebra tensored with the dual basis of the - singlet, in the first (unconjugated) factor. -/ -lemma JetComponentSpace.basis_dψ_nil (α : Fin 2) : - JetComponentSpace.basis (.dψ {} α) = - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] - LeptonSinglet.basis.dualBasis α, 0) := by - rw [JetComponentSpace.basis, Module.Basis.reindex_apply, - show JetGenerators.equiv.symm.symm (.dψ {} α) = Sum.inl ({}, α) from rfl] - refine Prod.ext ?_ ?_ - · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', - DerivAlgebraComplex.basis_nil] - · rw [Module.Basis.prod_apply_inl_snd] - -/-- The basis vector of the jet component space at a first-order singlet - generator: the dual derivative symbol tensored with the dual basis of the - singlet, in the first (unconjugated) factor. -/ -lemma JetComponentSpace.basis_dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - JetComponentSpace.basis (.dψ {μ} α) = - (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ) ⊗ₜ[ℂ] - LeptonSinglet.basis.dualBasis α, 0) := by - rw [JetComponentSpace.basis, Module.Basis.reindex_apply, - show JetGenerators.equiv.symm.symm (.dψ {μ} α) = Sum.inl ({μ}, α) from rfl] - refine Prod.ext ?_ ?_ - · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', - DerivAlgebraComplex.basis_singleton] - · rw [Module.Basis.prod_apply_inl_snd] - -/-- The basis vector of the jet component space at a general singlet generator: - the dual jet algebra basis vector at its multiset of derivative indices, - tensored with the dual basis of the singlet, in the first (unconjugated) - factor. -/ -lemma JetComponentSpace.basis_dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - JetComponentSpace.basis (.dψ s α) = - (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) := by - rw [JetComponentSpace.basis, Module.Basis.reindex_apply, - show JetGenerators.equiv.symm.symm (.dψ s α) = Sum.inl (s, α) from rfl] - refine Prod.ext ?_ ?_ - · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply'] - · rw [Module.Basis.prod_apply_inl_snd] - -/-- The basis vector of the jet component space at a general conjugate-singlet - generator: the dual jet algebra basis vector at its multiset of derivative - indices, tensored with the conjugate dual basis of the singlet, in the second - (conjugated) factor. -/ -lemma JetComponentSpace.basis_dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - JetComponentSpace.basis (.dbarψ s α) = - (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.conj.dualBasis α) := by - rw [JetComponentSpace.basis, Module.Basis.reindex_apply, - show JetGenerators.equiv.symm.symm (.dbarψ s α) = Sum.inr (s, α) from rfl] - refine Prod.ext ?_ ?_ - · rw [Module.Basis.prod_apply_inr_fst] - · rw [Module.Basis.prod_apply_inr_snd, Module.Basis.tensorProduct_apply'] - -noncomputable def JetComponentSpace.repLorentzGroup : - Representation ℂ (SL(2,ℂ)) JetComponentSpace := - (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual).prod - (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.conj.dual) - -/-- The Lorentz action on the zeroth-order lepton jet coordinate: the - contragredient conjugate spinor action. -/ -lemma JetComponentSpace.repLorentzGroup_basis_dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dψ {} α)) = - ∑ β, star ((Λ⁻¹).1 α β) • JetComponentSpace.basis (.dψ {} β) := by - rw [basis_dψ_nil, - show JetComponentSpace.repLorentzGroup Λ = - LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.dual Λ)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, - LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, - DerivAlgebraComplex.repLorentzGroup_apply_one, - LeptonSinglet.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum] - have hb : ∀ β : Fin 2, JetComponentSpace.basis - (.dψ (0 : Multiset (Fin 1 ⊕ Fin 3)) β) = - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] - LeptonSinglet.basis.dualBasis β, 0) := fun β => basis_dψ_nil β - refine Prod.ext ?_ ?_ - · simp [Prod.fst_sum, hb, TensorProduct.tmul_smul] - · simp [Prod.snd_sum, hb] - -set_option maxHeartbeats 1000000 in -/-- The Lorentz action on the first-order lepton jet coordinate: the derivative - slot transforms by the columns of the Lorentz matrix and the spinor slot - contragrediently. -/ -lemma JetComponentSpace.repLorentzGroup_basis_dψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dψ {μ} α)) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 α β)) • JetComponentSpace.basis (.dψ {ν} β) := by - rw [basis_dψ_singleton, - show JetComponentSpace.repLorentzGroup Λ = - LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.dual Λ)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, - LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, - DerivAlgebraComplex.repLorentzGroup_apply_ι, - Lorentz.CoℂModule.SL2CRep_dual_dualBasis, - LeptonSinglet.repLorentzGroup_dual_dualBasis, map_sum, TensorProduct.sum_tmul] - refine Prod.ext ?_ ?_ - · simp only [Prod.fst_sum, Prod.smul_fst, basis_dψ_singleton, map_smul, - TensorProduct.smul_tmul', TensorProduct.tmul_sum, TensorProduct.sum_tmul, - Finset.smul_sum, TensorProduct.tmul_smul, smul_smul] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ - rw [mul_comm] - · simp [Prod.snd_sum, basis_dψ_singleton, TensorProduct.tmul_sum, - TensorProduct.sum_tmul, map_smul, TensorProduct.smul_tmul'] - -/-- The Lorentz action on the zeroth-order conjugate lepton jet coordinate. -/ -lemma JetComponentSpace.repLorentzGroup_basis_dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dbarψ {} α)) = - ∑ β, (Λ⁻¹).1 α β • JetComponentSpace.basis (.dbarψ {} β) := by - rw [basis_dbarψ, - show JetComponentSpace.repLorentzGroup Λ = - LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.dual Λ)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, - LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, - show DerivAlgebraComplex.basis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 from - DerivAlgebraComplex.basis_nil, - DerivAlgebraComplex.repLorentzGroup_apply_one, - LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, TensorProduct.tmul_sum] - have hb0 : DerivAlgebraComplex.basis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := - DerivAlgebraComplex.basis_nil - refine Prod.ext ?_ ?_ - · simp [Prod.fst_sum, basis_dbarψ] - · simp [Prod.snd_sum, basis_dbarψ, TensorProduct.tmul_smul, hb0] - -set_option maxHeartbeats 1000000 in -/-- The Lorentz action on the first-order conjugate lepton jet coordinate. -/ -lemma JetComponentSpace.repLorentzGroup_basis_dbarψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dbarψ {μ} α)) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α β) • JetComponentSpace.basis (.dbarψ {ν} β) := by - rw [basis_dbarψ, - show JetComponentSpace.repLorentzGroup Λ = - LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.dual Λ)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) - (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, - LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, - show DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) - (Lorentz.complexCoBasis.dualBasis μ) from - DerivAlgebraComplex.basis_singleton μ, - DerivAlgebraComplex.repLorentzGroup_apply_ι, - Lorentz.CoℂModule.SL2CRep_dual_dualBasis, - LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, map_sum, - TensorProduct.sum_tmul] - refine Prod.ext ?_ ?_ - · simp [Prod.fst_sum, basis_dbarψ, TensorProduct.tmul_sum, - TensorProduct.sum_tmul, map_smul, TensorProduct.smul_tmul'] - · simp only [Prod.snd_sum, Prod.smul_snd, basis_dbarψ, - DerivAlgebraComplex.basis_singleton, map_smul, TensorProduct.smul_tmul', - TensorProduct.tmul_sum, TensorProduct.sum_tmul, Finset.smul_sum, - TensorProduct.tmul_smul, smul_smul] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ - rw [mul_comm] - -/-! - - -### The action of the jet gauge group - -Under the action of the gauge group -`∂_s ψ` transforms as -`∑ (x + y = s), ∂_x (star u ^ 6) ∂_y ψ`, and similarly for the conjugate. - - --/ -/-- The action of the jet gauge group on the dual jet algebra of the - charged-lepton singlet's component functions. Component functions transform - contragrediently to the field, so the hypercharge power series is - `u ^ 6 = (star u ^ 6)⁻¹`, acting through the Leibniz rule on the dual - derivative symbols. -/ -noncomputable def dualJetAlgebraRepJetGaugeGroupI : - Representation ℂ JetGaugeGroupI DerivAlgebraComplex where - toFun U := DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) - map_one' := by - rw [show (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = - (1 : JetRing) by simp, DerivAlgebraComplex.jetRingAction_one] - rfl - map_mul' U₁ U₂ := by - rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = - ((U₁.2.2 : unitary JetRing) : JetRing) ^ 6 * - ((U₂.2.2 : unitary JetRing) : JetRing) ^ 6 by - rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = - ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) - from rfl, mul_pow], - DerivAlgebraComplex.jetRingAction_mul, Module.End.mul_eq_comp] - -/-- The action of the jet gauge group on the dual jet algebra of the conjugate - charged-lepton singlet's component functions: the conjugate components - transform with the conjugate-contragredient hypercharge power series - `star u ^ 6`. -/ -noncomputable def dualJetAlgebraRepJetGaugeGroupIConj : - Representation ℂ JetGaugeGroupI - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where - toFun U := DerivAlgebraComplex.jetRingAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) - map_one' := by - rw [show (star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = - (1 : JetRing) by simp, DerivAlgebraComplex.jetRingAction_one] - rfl - map_mul' U₁ U₂ := by - rw [show (star (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = - (star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6 * - (star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6 by - rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = - ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) - from rfl, star_mul', mul_pow], - DerivAlgebraComplex.jetRingAction_mul, Module.End.mul_eq_comp] - -@[simp] -lemma dualJetAlgebraRepJetGaugeGroupI_apply (U : JetGaugeGroupI) : - dualJetAlgebraRepJetGaugeGroupI U = - DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) := rfl - -@[simp] -lemma dualJetAlgebraRepJetGaugeGroupIConj_apply (U : JetGaugeGroupI) : - dualJetAlgebraRepJetGaugeGroupIConj U = - DerivAlgebraComplex.jetRingAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) := rfl - -/-- The `(1, 1)_{-6}` action of the jet gauge group on the space of component - functions of the charged-lepton singlet, its conjugate, and their derivative - coordinates. The conventions are contragredient, matching the `.dual` and - `.conj.dual` conventions of the global component-space representations: the - singlet components transform through the derivative action of `u ^ 6`, the - conjugate components through the derivative action of `star u ^ 6`, and the - target factors are inert. On jets of constant gauge transformations the - derivative symbols are inert and the action reduces to the dual global gauge - action. -/ -noncomputable def JetComponentSpace.repJetGaugeGroupI : - Representation ℂ JetGaugeGroupI JetComponentSpace := - (dualJetAlgebraRepJetGaugeGroupI.tprod - (Representation.trivial ℂ JetGaugeGroupI (Module.Dual ℂ LeptonSinglet))).prod - (dualJetAlgebraRepJetGaugeGroupIConj.tprod - (Representation.trivial ℂ JetGaugeGroupI (Module.Dual ℂ (ConjModule LeptonSinglet)))) - -/-- The jet gauge action preserves the unconjugated half of the component space, - acting there by the dual derivative action of the contragredient hypercharge - power series on the derivative symbols. -/ -lemma JetComponentSpace.repJetGaugeGroupI_inl (U : JetGaugeGroupI) - (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) - (φ : Module.Dual ℂ LeptonSinglet) : - JetComponentSpace.repJetGaugeGroupI U ((a ⊗ₜ[ℂ] φ, 0) : JetComponentSpace) = - ((DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) a) ⊗ₜ[ℂ] φ, 0) := by - refine Prod.ext ?_ ?_ <;> - simp [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, - Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply] - -/-- The jet gauge action on a general element of the unconjugated half of the - component space. -/ -lemma JetComponentSpace.repJetGaugeGroupI_inl' (U : JetGaugeGroupI) - (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) : - JetComponentSpace.repJetGaugeGroupI U ((y, 0) : JetComponentSpace) = - ((TensorProduct.map (DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) - LinearMap.id) y, 0) := by - induction y using TensorProduct.induction_on with - | zero => - rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] - rfl - | add a b ha hb => - have hpair : ((a + b, 0) : JetComponentSpace) = (a, 0) + (b, 0) := by - simp - rw [hpair, map_add, ha, hb, map_add] - simp - | tmul a φ => - rw [JetComponentSpace.repJetGaugeGroupI_inl, TensorProduct.map_tmul] - rfl - -/-- The jet gauge action preserves the conjugated half of the component space, - acting there by the dual derivative action of the conjugate-contragredient - hypercharge power series on the derivative symbols. -/ -lemma JetComponentSpace.repJetGaugeGroupI_inr (U : JetGaugeGroupI) - (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : - JetComponentSpace.repJetGaugeGroupI U ((0, a ⊗ₜ[ℂ] φ) : JetComponentSpace) = - (0, (DerivAlgebraComplex.jetRingAction - ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) a) ⊗ₜ[ℂ] φ) := by - refine Prod.ext ?_ ?_ <;> - simp [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, - Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupIConj_apply] - -/-- The jet gauge action on a general element of the conjugated half of the - component space. -/ -lemma JetComponentSpace.repJetGaugeGroupI_inr' (U : JetGaugeGroupI) - (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet)) : - JetComponentSpace.repJetGaugeGroupI U ((0, y) : JetComponentSpace) = - (0, (TensorProduct.map (DerivAlgebraComplex.jetRingAction - ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6)) LinearMap.id) y) := by - induction y using TensorProduct.induction_on with - | zero => - rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] - rfl - | add a b ha hb => - have hpair : ((0, a + b) : JetComponentSpace) = (0, a) + (0, b) := by - simp - rw [hpair, map_add, ha, hb, map_add] - simp - | tmul a φ => - rw [JetComponentSpace.repJetGaugeGroupI_inr, TensorProduct.map_tmul] - rfl - -open MvPowerSeries in -/-- The gauge action on a lepton jet coordinate is the Leibniz expansion of - `∂_t (u⁶ ψ)`: a sum over the splittings `t = x + y` of the `x`-th Taylor - coefficient of the hypercharge character `u⁶` against the `y`-th coordinate. - The weight `∏ descFactorial` together with `coeff x χ = (∂_x χ)(0) / x!` - makes up the multi-index binomial coefficient `(t choose x)`. -/ -lemma JetComponentSpace.repJetGaugeGroupI_basis_dψ (U : JetGaugeGroupI) - (t : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI U (basis (.dψ t α)) = - ∑ p ∈ Finset.antidiagonal t.toFinsupp, - ((∏ μ, (t.toFinsupp μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - basis (.dψ (Multiset.toFinsupp.symm p.2) α) := by - have hb : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, - JetComponentSpace.basis (.dψ (Multiset.toFinsupp.symm p) α) = - ((Lorentz.complexCoBasis.dualBasis.symmetricAlgebra p ⊗ₜ[ℂ] - LeptonSinglet.basis.dualBasis α), 0) := by - intro p - rw [JetComponentSpace.basis_dψ, DerivAlgebraComplex.basis_apply, - AddEquiv.apply_symm_apply] - rw [JetComponentSpace.basis_dψ, JetComponentSpace.repJetGaugeGroupI_inl, - DerivAlgebraComplex.basis_apply, DerivAlgebraComplex.jetRingAction_basis, - TensorProduct.sum_tmul, - show ∀ v : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet, - ((v, 0) : JetComponentSpace) = LinearMap.inl ℂ _ _ v from fun _ => rfl, - map_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [hb p.2, ← TensorProduct.smul_tmul', ← TensorProduct.smul_tmul', - map_smul, map_smul] - rfl - -open MvPowerSeries in -/-- The gauge action on the first-order lepton coordinate: the character at the - base point acts on the coordinate itself, and its first Taylor coefficient - feeds into the zeroth-order coordinate. This is the `t = {μ}` case of - `repJetGaugeGroupI_basis_dψ`. -/ -lemma JetComponentSpace.repJetGaugeGroupI_basis_dψ_singleton (U : JetGaugeGroupI) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - repJetGaugeGroupI U (basis (.dψ {μ} α)) = - constantCoeff (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - basis (.dψ {μ} α) + - coeff (Finsupp.single μ 1) (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - basis (.dψ {} α) := by - classical - have hm : ({μ} : Multiset (Fin 1 ⊕ Fin 3)).toFinsupp = Finsupp.single μ 1 := by - simp - rw [JetComponentSpace.repJetGaugeGroupI_basis_dψ, hm, Finsupp.antidiagonal_single, - show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} from by decide, - Finset.map_insert, Finset.map_singleton, - Finset.sum_insert (by simp [Finsupp.single_eq_zero]), Finset.sum_singleton] - simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, - Prod.map_apply, Finsupp.single_zero, coeff_zero_eq_constantCoeff, - Nat.descFactorial_zero, Finset.prod_const_one, Nat.cast_one, one_smul, - Nat.descFactorial_self] - have hw1 : (∏ x, ((Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x).descFactorial - ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x) : ℕ) = 1 := by simp - have hw2 : (∏ x, ((Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x).factorial : ℕ) - = 1 := by - refine Finset.prod_eq_one fun x _ => ?_ - rcases eq_or_ne μ x with rfl | h - · simp - · simp only [Finsupp.single_apply, if_neg h, Nat.factorial_zero] - have htf1 : Multiset.toFinsupp.symm (Finsupp.single μ 1) = - ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by - rw [← hm, AddEquiv.symm_apply_apply] - have htf0 : Multiset.toFinsupp.symm (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = - (0 : Multiset (Fin 1 ⊕ Fin 3)) := map_zero _ - rw [hw1, hw2, htf1, htf0] - simp - -/-! - -## The formal total derivative on the component functions - -The formal total spacetime derivative `∂_μ` acts on the component functions of -the charged-lepton jet by appending the derivative index, -`∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α`, and likewise on the conjugate components. - --/ - -namespace JetGenerators - -/-- The jet generator with one further derivative in the direction `μ`. -/ -def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators - | dψ s α => dψ (s + {μ}) α - | dbarψ s α => dbarψ (s + {μ}) α - -@[simp] -lemma shift_dψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - shift μ (dψ s α) = dψ (s + {μ}) α := rfl - -@[simp] -lemma shift_dbarψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - shift μ (dbarψ s α) = dbarψ (s + {μ}) α := rfl - -/-- Appending a derivative index raises the mass weight by two: a derivative has - mass dimension one. -/ -@[simp] -lemma massWeight_shift (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : - (shift μ j).massWeight = j.massWeight + 2 := by - cases j <;> simp [shift, massWeight] <;> omega - -end JetGenerators - -/-- The formal total spacetime derivative on the space of component functions of - the charged-lepton singlet in the direction `μ`: the shift - `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the derivative multi-index, and likewise on the - conjugate components. -/ -noncomputable def JetComponentSpace.jetDeriv (μ : Fin 1 ⊕ Fin 3) : - JetComponentSpace →ₗ[ℂ] JetComponentSpace := - JetComponentSpace.basis.constr ℂ fun j => - JetComponentSpace.basis (JetGenerators.shift μ j) - -@[simp] -lemma JetComponentSpace.jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : - JetComponentSpace.jetDeriv μ (JetComponentSpace.basis j) = - JetComponentSpace.basis (JetGenerators.shift μ j) := by - rw [JetComponentSpace.jetDeriv, Module.Basis.constr_basis] - -lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : - JetComponentSpace.jetDeriv μ (JetComponentSpace.jetDeriv ν v) = - JetComponentSpace.jetDeriv ν (JetComponentSpace.jetDeriv μ v) := by - have h : JetComponentSpace.jetDeriv μ ∘ₗ JetComponentSpace.jetDeriv ν = - JetComponentSpace.jetDeriv ν ∘ₗ JetComponentSpace.jetDeriv μ := by - refine JetComponentSpace.basis.ext fun j => ?_ - simp [LinearMap.coe_comp, Function.comp_apply, JetComponentSpace.jetDeriv_basis, - JetGenerators.shift, ] - grind - exact DFunLike.congr_fun h v - -/-- The mass-dimension scaling on the space of component functions of the - charged-lepton singlet: the diagonal map multiplying each component function - `∂_s ψ_α` by `c ^ w`, where `w` is twice its mass dimension. -/ -noncomputable def JetComponentSpace.massWeightScale (c : ℂ) : - JetComponentSpace →ₗ[ℂ] JetComponentSpace := - JetComponentSpace.basis.constr ℂ fun j => - c ^ j.massWeight • JetComponentSpace.basis j - -@[simp] -lemma JetComponentSpace.massWeightScale_basis (c : ℂ) (j : JetGenerators) : - JetComponentSpace.massWeightScale c (JetComponentSpace.basis j) = - c ^ j.massWeight • JetComponentSpace.basis j := by - rw [JetComponentSpace.massWeightScale, Module.Basis.constr_basis] - -/-- The total derivative raises the mass weight by two on the component space: - the scaling and the derivative commute up to `c ^ 2`. -/ -lemma JetComponentSpace.massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) - (v : JetComponentSpace) : - JetComponentSpace.massWeightScale c (JetComponentSpace.jetDeriv μ v) = - c ^ 2 • JetComponentSpace.jetDeriv μ (JetComponentSpace.massWeightScale c v) := by - have h : JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.jetDeriv μ = - c ^ 2 • (JetComponentSpace.jetDeriv μ ∘ₗ JetComponentSpace.massWeightScale c) := by - refine JetComponentSpace.basis.ext fun j => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.smul_apply, - JetComponentSpace.jetDeriv_basis, JetComponentSpace.massWeightScale_basis, - map_smul, JetGenerators.massWeight_shift, smul_smul, ← pow_add] - congr 1 - ring - exact DFunLike.congr_fun h v - -/-- The mass-dimension scaling commutes with the action of jets of constant - gauge transformations on the component space: the constant action is diagonal - on the generator basis, with no derivative mixing. For a non-constant jet the - higher Taylor coefficients of `u ^ 6` strictly lower the derivative degree, so - the action does not commute with the scaling. -/ -lemma JetComponentSpace.massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) : - JetComponentSpace.massWeightScale c ∘ₗ - JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = - JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ∘ₗ - JetComponentSpace.massWeightScale c := by - have hu : ((((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing)) : JetRing) = - MvPowerSeries.C ((g.2.2 : ℂ)) := rfl - refine JetComponentSpace.basis.ext fun j => ?_ - cases j with - | dψ s α => - have hrep : JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (JetComponentSpace.basis (.dψ s α)) = - ((g.2.2 : ℂ) ^ 6) • JetComponentSpace.basis (.dψ s α) := by - simp only [JetComponentSpace.basis_dψ] - rw [JetComponentSpace.repJetGaugeGroupI_inl, hu, ← map_pow, - DerivAlgebraComplex.jetRingAction_C] - simp [TensorProduct.smul_tmul', Prod.smul_mk] - simp only [LinearMap.coe_comp, Function.comp_apply, hrep, map_smul, - JetComponentSpace.massWeightScale_basis] - exact smul_comm _ _ _ - | dbarψ s α => - have hrep : JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (JetComponentSpace.basis (.dbarψ s α)) = - ((star (g.2.2 : ℂ)) ^ 6) • JetComponentSpace.basis (.dbarψ s α) := by - simp only [JetComponentSpace.basis_dbarψ] - rw [JetComponentSpace.repJetGaugeGroupI_inr, hu, JetRing.star_C, ← map_pow, - DerivAlgebraComplex.jetRingAction_C] - simp [TensorProduct.smul_tmul', Prod.smul_mk] - simp only [LinearMap.coe_comp, Function.comp_apply, hrep, map_smul, - JetComponentSpace.massWeightScale_basis] - exact smul_comm _ _ _ - -/-- The mass-dimension scaling commutes with the Lorentz action on the component - space: the Lorentz action mixes derivative symbols and spinor components only - within a fixed derivative degree, on which the scaling is a scalar. -/ -lemma JetComponentSpace.massWeightScale_repLorentzGroup (c : ℂ) (g : SL(2,ℂ)) : - JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.repLorentzGroup g = - JetComponentSpace.repLorentzGroup g ∘ₗ JetComponentSpace.massWeightScale c := by - have hfact : JetComponentSpace.massWeightScale c = - LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap - (c ^ 3 • LinearMap.id)) - (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap - (c ^ 3 • LinearMap.id)) := by - refine JetComponentSpace.basis.ext fun j => ?_ - cases j with - | dψ s α => - have hscal : (c : ℂ) ^ (JetGenerators.dψ s α).massWeight = - c ^ 3 * (c ^ 2) ^ s.card := by - show c ^ (3 + 2 * s.card) = _ - ring - rw [JetComponentSpace.massWeightScale_basis, hscal] - simp only [JetComponentSpace.basis_dψ, LinearMap.prodMap_apply, map_zero, - TensorProduct.map_tmul, AlgHom.toLinearMap_apply, LinearMap.smul_apply, - LinearMap.id_apply, DerivAlgebraComplex.gradeScale_basis, - TensorProduct.tmul_smul, TensorProduct.smul_tmul', Prod.smul_mk, smul_smul, - smul_zero] - | dbarψ s α => - have hscal : (c : ℂ) ^ (JetGenerators.dbarψ s α).massWeight = - c ^ 3 * (c ^ 2) ^ s.card := by - show c ^ (3 + 2 * s.card) = _ - ring - rw [JetComponentSpace.massWeightScale_basis, hscal] - simp only [JetComponentSpace.basis_dbarψ, LinearMap.prodMap_apply, map_zero, - TensorProduct.map_tmul, AlgHom.toLinearMap_apply, LinearMap.smul_apply, - LinearMap.id_apply, DerivAlgebraComplex.gradeScale_basis, - TensorProduct.tmul_smul, TensorProduct.smul_tmul', Prod.smul_mk, smul_smul, - smul_zero] - have hA : (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap ∘ₗ - DerivAlgebraComplex.repLorentzGroup g = - (DerivAlgebraComplex.repLorentzGroup g : - DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex) ∘ₗ - (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap := - LinearMap.ext fun a => DerivAlgebraComplex.gradeScale_repLorentzGroup (c ^ 2) g a - have hB1 : (c ^ 3 • (LinearMap.id : Module.End ℂ (Module.Dual ℂ LeptonSinglet))) ∘ₗ - LeptonSinglet.repLorentzGroup.dual g = - LeptonSinglet.repLorentzGroup.dual g ∘ₗ (c ^ 3 • LinearMap.id) := by - rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, LinearMap.comp_id] - have hB2 : (c ^ 3 • (LinearMap.id : - Module.End ℂ (Module.Dual ℂ (ConjModule LeptonSinglet)))) ∘ₗ - LeptonSinglet.repLorentzGroup.conj.dual g = - LeptonSinglet.repLorentzGroup.conj.dual g ∘ₗ (c ^ 3 • LinearMap.id) := by - rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, LinearMap.comp_id] - have hcomp1 : TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap - (c ^ 3 • LinearMap.id) ∘ₗ - TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) - (LeptonSinglet.repLorentzGroup.dual g) = - TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) - (LeptonSinglet.repLorentzGroup.dual g) ∘ₗ - TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap - (c ^ 3 • LinearMap.id) := by - rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB1] - have hcomp2 : TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap - (c ^ 3 • LinearMap.id) ∘ₗ - TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) - (LeptonSinglet.repLorentzGroup.conj.dual g) = - TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) - (LeptonSinglet.repLorentzGroup.conj.dual g) ∘ₗ - TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap - (c ^ 3 • LinearMap.id) := by - rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB2] - rw [hfact, show JetComponentSpace.repLorentzGroup g = - LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) - (LeptonSinglet.repLorentzGroup.dual g)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) - (LeptonSinglet.repLorentzGroup.conj.dual g)) from rfl] - refine LinearMap.ext fun x => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.prodMap_apply] - exact Prod.ext (DFunLike.congr_fun hcomp1 x.1) (DFunLike.congr_fun hcomp2 x.2) - -/-- The total derivative preserves the unconjugated half of the component space, - acting there by the shift of dual derivative symbols. -/ -lemma JetComponentSpace.jetDeriv_inl (μ : Fin 1 ⊕ Fin 3) - (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) - (φ : Module.Dual ℂ LeptonSinglet) : - JetComponentSpace.jetDeriv μ ((a ⊗ₜ[ℂ] φ, 0) : JetComponentSpace) = - ((DerivAlgebraComplex.deriv μ a) ⊗ₜ[ℂ] φ, 0) := by - have h : (JetComponentSpace.jetDeriv μ) ∘ₗ (LinearMap.inl ℂ - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) = - (LinearMap.inl ℂ _ _) ∘ₗ (TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) := by - refine (DerivAlgebraComplex.basis.tensorProduct LeptonSinglet.basis.dualBasis).ext - fun p => ?_ - obtain ⟨s, α⟩ := p - rw [Module.Basis.tensorProduct_apply'] - simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.inl_apply, - TensorProduct.map_tmul, LinearMap.id_coe, id_eq] - rw [show ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) : - JetComponentSpace) = JetComponentSpace.basis (.dψ s α) from - (JetComponentSpace.basis_dψ s α).symm, - JetComponentSpace.jetDeriv_basis, JetGenerators.shift_dψ, - JetComponentSpace.basis_dψ, DerivAlgebraComplex.deriv_basis_multiset] - have h1 := LinearMap.congr_fun h (a ⊗ₜ[ℂ] φ) - simpa using h1 - -/-- The total derivative on a general element of the unconjugated half of the - component space. -/ -lemma JetComponentSpace.jetDeriv_inl' (μ : Fin 1 ⊕ Fin 3) - (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) : - JetComponentSpace.jetDeriv μ ((y, 0) : JetComponentSpace) = - ((TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) y, 0) := by - induction y using TensorProduct.induction_on with - | zero => - rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] - rfl - | add a b ha hb => - have hpair : ((a + b, 0) : JetComponentSpace) = (a, 0) + (b, 0) := by - simp - rw [hpair, map_add, ha, hb, map_add] - simp - | tmul a φ => - rw [JetComponentSpace.jetDeriv_inl, TensorProduct.map_tmul] - rfl - -/-- The total derivative preserves the conjugated half of the component space, - acting there by the shift of dual derivative symbols. -/ -lemma JetComponentSpace.jetDeriv_inr (μ : Fin 1 ⊕ Fin 3) - (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : - JetComponentSpace.jetDeriv μ ((0, a ⊗ₜ[ℂ] φ) : JetComponentSpace) = - (0, (DerivAlgebraComplex.deriv μ a) ⊗ₜ[ℂ] φ) := by - have h : (JetComponentSpace.jetDeriv μ) ∘ₗ (LinearMap.inr ℂ - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) = - (LinearMap.inr ℂ _ _) ∘ₗ (TensorProduct.map (DerivAlgebraComplex.deriv μ) - LinearMap.id) := by - refine (DerivAlgebraComplex.basis.tensorProduct - (LeptonSinglet.basis.conj.dualBasis)).ext fun p => ?_ - obtain ⟨s, α⟩ := p - rw [Module.Basis.tensorProduct_apply'] - simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.inr_apply, - TensorProduct.map_tmul, LinearMap.id_coe, id_eq] - rw [show ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] - LeptonSinglet.basis.conj.dualBasis α) : JetComponentSpace) = - JetComponentSpace.basis (.dbarψ s α) from - (JetComponentSpace.basis_dbarψ s α).symm, - JetComponentSpace.jetDeriv_basis, JetGenerators.shift_dbarψ, - JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.deriv_basis_multiset] - have h1 := LinearMap.congr_fun h (a ⊗ₜ[ℂ] φ) - simpa using h1 - -/-- The total derivative on a general element of the conjugated half of the - component space. -/ -lemma JetComponentSpace.jetDeriv_inr' (μ : Fin 1 ⊕ Fin 3) - (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet)) : - JetComponentSpace.jetDeriv μ ((0, y) : JetComponentSpace) = - (0, (TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) y) := by - induction y using TensorProduct.induction_on with - | zero => - rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] - rfl - | add a b ha hb => - have hpair : ((0, a + b) : JetComponentSpace) = (0, a) + (0, b) := by - simp - rw [hpair, map_add, ha, hb, map_add] - simp - | tmul a φ => - rw [JetComponentSpace.jetDeriv_inr, TensorProduct.map_tmul] - rfl - -/-! - -## A. The jet algebra - --/ - - -abbrev JetAlgebra : Type := ExteriorAlgebra ℂ JetComponentSpace - -namespace JetAlgebra - - -/-! - -### A.1. The generators of the jet algebra - --/ - -noncomputable def ofGenerator (j : JetGenerators) : JetAlgebra := - ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) - - -/-! - -### A.2. The action of the jet gauge group. - --/ - -/-- The action of the (jet) gauge group on the jet algebra of the lepton singlets. -/ -noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra where - toFun g := (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g)).toLinearMap - map_one' := by - simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, - AlgHom.toLinearMap_id] - map_mul' g1 g2 := by - simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - -lemma repJetGaugeGroupI_apply (g : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI g x = - ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g) x := rfl - -lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : - repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by - simp [repJetGaugeGroupI_apply] - -lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : - repJetGaugeGroupI g (x * y) = - repJetGaugeGroupI g x * repJetGaugeGroupI g y := by - simp [repJetGaugeGroupI_apply] - -/-- The value of the jet of gauge transformations at the base point acts by the - contragredient hypercharge scalar on the zeroth-order singlet generator, with - no derivative contributions. -/ -lemma repJetGaugeGroupI_ofGenerator_ψ_nil (g : JetGaugeGroupI) (α : Fin 2) : - repJetGaugeGroupI g (ofGenerator (.dψ {} α)) = g.eval.2.2 ^ 6 • ofGenerator (.dψ {} α) := by - rw [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, - JetComponentSpace.basis_dψ_nil, Submonoid.smul_def] - simp only [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, - Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, - Representation.trivial_apply, map_zero, TensorProduct.map_tmul, - DerivAlgebraComplex.jetRingAction_apply_one, map_pow, ← TensorProduct.smul_tmul', - SubmonoidClass.coe_pow, ← map_smul, Prod.smul_mk, smul_zero] - rfl - - -/-- The action of the gauge group on ∂_μ ψ takes it to - g • (∂_μ ψ + 6 i (maurerCartanU1Coeff g μ 0) • ψ)-/ -lemma repJetGaugeGroupI_ofGenerator_ψ_singleton (g : JetGaugeGroupI) - (μ : (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI g (ofGenerator (.dψ {μ} α)) = - g.eval.2.2 ^ 6 • ofGenerator (.dψ {μ} α) - - ((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * (g.eval.2.2 : ℂ) ^ 6) • - ofGenerator (.dψ {} α) := by - have hval : ((g.eval.2.2 : unitary ℂ) : ℂ) = - MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) := rfl - have hcoeff : MvPowerSeries.coeff (Finsupp.single μ 1) - (((g.2.2 : unitary JetRing) : JetRing) ^ 6) = - -((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * - MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) ^ 6) := by - have h := congrArg (MvPowerSeries.coeff (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) - (pderiv_pow_unitary g μ 6) - rw [MvPowerSeries.coeff_pderiv] at h - simp only [MvPowerSeries.coeff_zero_eq_constantCoeff_apply, map_mul, map_pow, - MvPowerSeries.constantCoeff_C, Finsupp.coe_zero, Pi.zero_apply, Nat.cast_zero, - zero_add, mul_one] at h - rw [show ((maurerCartanU1Coeff g μ 0 : selfAdjoint ℂ) : ℂ) = - MvPowerSeries.constantCoeff (maurerCartanU1 g μ) from - MvPowerSeries.coeff_zero_eq_constantCoeff_apply _, h] - push_cast - ring - have hinl : ∀ x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet, - (x, (0 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) = - LinearMap.inl ℂ _ _ x := fun x => rfl - simp only [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, - JetComponentSpace.basis_dψ_singleton, JetComponentSpace.basis_dψ_nil, - JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, - Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, - Representation.trivial_apply, map_zero, TensorProduct.map_tmul, - DerivAlgebraComplex.jetRingAction_apply_ι, hcoeff, TensorProduct.add_tmul, - ← TensorProduct.smul_tmul', Submonoid.smul_def, SubmonoidClass.coe_pow, - hval, map_pow, sub_eq_add_neg, neg_smul] - simp only [hinl, TensorProduct.neg_tmul, ← TensorProduct.smul_tmul', - map_add, map_neg, map_smul] - -/-- The jet gauge action on a general singlet generator: the all-orders Leibniz - rule. A jet of gauge transformations acts on the derivative generator - `∂_s ψ_α` through the Taylor coefficients of its contragredient hypercharge - power series `u ^ 6`: each splitting `s = p.1 + p.2` contributes the `p.1`-th - Taylor coefficient, with the divided-power multiplicity, times the lower - generator `∂_{p.2} ψ_α`. The zeroth- and first-order cases are - `repJetGaugeGroupI_ofGenerator_ψ_nil` and - `repJetGaugeGroupI_ofGenerator_ψ_singleton`. -/ -lemma repJetGaugeGroupI_ofGenerator_ψ (g : JetGaugeGroupI) - (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI g (ofGenerator (.dψ s α)) = - ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((g.2.2 : unitary JetRing) : JetRing) ^ 6) • - ofGenerator (.dψ (Finsupp.toMultiset p.2) α) := by - have hinl : ∀ x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet, - (x, (0 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) = - LinearMap.inl ℂ _ _ x := fun x => rfl - simp only [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, - JetComponentSpace.basis_dψ, DerivAlgebraComplex.basis_apply, Finsupp.toMultiset_toFinsupp, - JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, - Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, - Representation.trivial_apply, map_zero, TensorProduct.map_tmul, - DerivAlgebraComplex.jetRingAction_basis] - simp only [hinl, TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] - -noncomputable def repJetGaugeGroupIAlgHom (g : JetGaugeGroupI) : - AlgHom ℂ JetAlgebra JetAlgebra where - toFun := repJetGaugeGroupI g - map_one' := repJetGaugeGroupI_apply_one g - map_mul' := repJetGaugeGroupI_apply_mul g - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - commutes' := fun r => by simp [repJetGaugeGroupI_apply] - -/-! - -### A.3. The action of the Lorentz group - --/ - -noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) JetAlgebra where - toFun g := (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)).toLinearMap - map_one' := by - simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, - AlgHom.toLinearMap_id] - map_mul' g1 g2 := by - simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - -lemma repLorentzGroup_apply (g : SL(2,ℂ)) (x : JetAlgebra) : - repLorentzGroup g x = - ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g) x := rfl - -lemma repLorentzGroup_apply_one (g : SL(2,ℂ)) : - repLorentzGroup g 1 = 1 := by simp [repLorentzGroup_apply] - -lemma repLorentzGroup_apply_mul (g : SL(2,ℂ)) (x y : JetAlgebra) : - repLorentzGroup g (x * y) = repLorentzGroup g x * repLorentzGroup g y := by - simp [repLorentzGroup_apply] - -/-- The Lorentz action on a jet-algebra generator. -/ -lemma repLorentzGroup_ofGenerator (Λ : SL(2,ℂ)) (j : JetGenerators) : - repLorentzGroup Λ (ofGenerator j) = - ExteriorAlgebra.ι ℂ - (JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis j)) := by - rw [ofGenerator, repLorentzGroup_apply, ExteriorAlgebra.map_apply_ι] - -/-- The Lorentz action on the zeroth-order lepton generator. -/ -lemma repLorentzGroup_ofGenerator_ψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (ofGenerator (.dψ {} α)) = - ∑ β, star ((Λ⁻¹).1 α β) • ofGenerator (.dψ {} β) := by - rw [repLorentzGroup_ofGenerator, - JetComponentSpace.repLorentzGroup_basis_dψ_nil, map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, ofGenerator] - -/-- The Lorentz action on the first-order lepton generator. -/ -lemma repLorentzGroup_ofGenerator_ψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - repLorentzGroup Λ (ofGenerator (.dψ {μ} α)) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 α β)) • ofGenerator (.dψ {ν} β) := by - rw [repLorentzGroup_ofGenerator, - JetComponentSpace.repLorentzGroup_basis_dψ_singleton, map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, ofGenerator] - -/-- The Lorentz action on the zeroth-order conjugate lepton generator. -/ -lemma repLorentzGroup_ofGenerator_barψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (ofGenerator (.dbarψ {} α)) = - ∑ β, (Λ⁻¹).1 α β • ofGenerator (.dbarψ {} β) := by - rw [repLorentzGroup_ofGenerator, - JetComponentSpace.repLorentzGroup_basis_dbarψ_nil, map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, ofGenerator] - -/-- The Lorentz action on the first-order conjugate lepton generator. -/ -lemma repLorentzGroup_ofGenerator_barψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - repLorentzGroup Λ (ofGenerator (.dbarψ {μ} α)) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α β) • ofGenerator (.dbarψ {ν} β) := by - rw [repLorentzGroup_ofGenerator, - JetComponentSpace.repLorentzGroup_basis_dbarψ_singleton, map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, ofGenerator] - - -noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : - AlgHom ℂ JetAlgebra JetAlgebra where - toFun := repLorentzGroup Λ - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - map_one' := repLorentzGroup_apply_one Λ - map_mul' := repLorentzGroup_apply_mul Λ - commutes' r := by simp [repLorentzGroup_apply] - - -/-! - -### A.4. The formal total derivative on the jet algebra - -The formal total spacetime derivative extends from the component functions to -the whole jet algebra as an even derivation: -`∂_μ (x y) = (∂_μ x) y + x (∂_μ y)`, with no Koszul signs. It is constructed by -lifting the generator map `ι x ↦ (ι x, ι (∂_μ x))` to an algebra homomorphism -into the trivial square-zero extension of the jet algebra; the square-zero -condition holds because degree-one elements of the exterior algebra -anticommute. - --/ - -/-- The generator map of the total derivative into the trivial square-zero - extension of the jet algebra: `ι x ↦ (ι x, ι (∂_μ x))`. -/ -noncomputable def jetDerivGen (μ : Fin 1 ⊕ Fin 3) : - JetComponentSpace →ₗ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra where - toFun x := (ExteriorAlgebra.ι ℂ x, - ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x)) - map_add' x y := by - simp only [map_add] - rfl - map_smul' c x := by - simp only [map_smul, RingHom.id_apply] - rfl - -@[simp] -lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : - (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl - -@[simp] -lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : - (jetDerivGen μ x).snd = ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := rfl - -/-- The generator map squares to zero: degree-one elements of the exterior - algebra anticommute. -/ -lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : - jetDerivGen μ x * jetDerivGen μ x = 0 := by - refine TrivSqZeroExt.ext ?_ ?_ - · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, - TrivSqZeroExt.fst_zero] - · rw [TrivSqZeroExt.snd_mul, jetDerivGen_fst, jetDerivGen_snd, TrivSqZeroExt.snd_zero, - smul_eq_mul, op_smul_eq_mul] - exact ExteriorAlgebra.ι_add_mul_swap x (JetComponentSpace.jetDeriv μ x) - -/-- The lift of the total derivative to the trivial square-zero extension of the - jet algebra: the algebra homomorphism `x ↦ (x, ∂_μ x)`. -/ -noncomputable def jetDerivHom (μ : Fin 1 ⊕ Fin 3) : - JetAlgebra →ₐ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra := - ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ - -@[simp] -lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : - jetDerivHom μ (ExteriorAlgebra.ι ℂ x) = jetDerivGen μ x := by - rw [jetDerivHom, ExteriorAlgebra.lift_ι_apply] - -/-- The first component of the square-zero lift is the identity. -/ -@[simp] -lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - (jetDerivHom μ x).fst = x := by - have h : (TrivSqZeroExt.fstHom ℂ JetAlgebra JetAlgebra).comp (jetDerivHom μ) = - AlgHom.id ℂ JetAlgebra := by - refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) - simp - exact DFunLike.congr_fun h x - -/-- The formal total spacetime derivative on the jet algebra of the - charged-lepton singlet in the direction `μ`: the even derivation extending the - shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the component functions. -/ -noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra where - toFun x := (jetDerivHom μ x).snd - map_add' x y := congrArg TrivSqZeroExt.snd (map_add (jetDerivHom μ) x y) - map_smul' c x := congrArg TrivSqZeroExt.snd (map_smul (jetDerivHom μ) c x) - -lemma jetDeriv_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - jetDeriv μ x = (jetDerivHom μ x).snd := rfl - -@[simp] -lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : - jetDeriv μ (ExteriorAlgebra.ι ℂ x) = - ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := by - rw [jetDeriv_apply, jetDerivHom_ι, jetDerivGen_snd] - -/-- The total derivative appends the derivative index to each component - function. -/ -@[simp] -lemma jetDeriv_ofGenerator (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : - jetDeriv μ (ofGenerator j) = ofGenerator (JetGenerators.shift μ j) := by - rw [ofGenerator, jetDeriv_ι, JetComponentSpace.jetDeriv_basis] - rfl - -@[simp] -lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := - congrArg TrivSqZeroExt.snd (map_one (jetDerivHom μ)) - -/-- The total derivative is an even derivation: the Leibniz rule holds on the - jet algebra with no Koszul signs. -/ -lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : - jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by - have h : jetDeriv μ (x * y) = - (jetDerivHom μ x).fst * jetDeriv μ y + jetDeriv μ x * (jetDerivHom μ y).fst := - congrArg TrivSqZeroExt.snd (map_mul (jetDerivHom μ) x y) - rw [jetDerivHom_fst, jetDerivHom_fst] at h - exact h.trans (add_comm _ _) - -lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by - induction x using ExteriorAlgebra.induction with - | algebraMap r => - simp [Algebra.algebraMap_eq_smul_one] - | ι v => - simp [JetComponentSpace.jetDeriv_comm] - | mul x y hx hy => - simp only [jetDeriv_mul, map_add, hx, hy] - abel - | add x y hx hy => - simp only [map_add, hx, hy] - -/-! - -## - -Let ∂_s be the derivative with respect to the multi-index s. -On the action of the gauge group `∂_s (g • ψ) ≠ g • ∂_s ψ`. -The RHS of this properly takes account of derivatives of the gauge transformation, -while the LHS does not. - -What we want to show is that -`g • ∂_s ψ = ∑_{p + q = s} q ^ {|p|} • (∂_p g) • ∂_q ψ`. -where `q` is the charge of the field. - --/ - - -/-! - -### A.5. The mass-weight scaling on the jet algebra - --/ - - -/-- The mass-weight polynomial on the charged-lepton factor: the `ℂ`-algebra map - sending each generator `j` to `X ^ w * j`, where `w` is the mass weight of `j`. - It is `LeptonSinglet.JetAlgebra.massWeightScale` with the scalar `c` replaced by - the formal variable `X`. -/ -noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := - ExteriorAlgebra.lift ℂ - ⟨JetComponentSpace.basis.constr ℂ fun j => - Polynomial.monomial j.massWeight (ofGenerator j), by - set f := JetComponentSpace.basis.constr ℂ fun j => - Polynomial.monomial j.massWeight (ofGenerator j) with hf - set B := (LinearMap.mul ℂ (Polynomial JetAlgebra)).compl₁₂ f f with hBdef - have hB : B + B.flip = 0 := - LinearMap.ext_basis JetComponentSpace.basis JetComponentSpace.basis fun j k => by - simp only [hBdef, LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, - LinearMap.mul_apply', LinearMap.zero_apply, hf, Module.Basis.constr_basis, - ofGenerator, Polynomial.monomial_mul_monomial, - Nat.add_comm k.massWeight j.massWeight, ← map_add, - ExteriorAlgebra.ι_add_mul_swap, map_zero] - intro v - have h2 : (2 : ℂ) • (f v * f v) = 0 := by - rw [two_smul] - exact LinearMap.congr_fun (LinearMap.congr_fun hB v) v - simpa [smul_smul] using congrArg (fun y => (2⁻¹ : ℂ) • y) h2⟩ - -/-- Setting the formal variable to one recovers the original element. -/ -lemma massWeightPoly_eval_one (x : JetAlgebra) : - (massWeightPoly x).eval 1 = x := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) 1 - fun a => Commute.one_right a).comp massWeightPoly = AlgHom.id ℂ JetAlgebra := by - refine ExteriorAlgebra.hom_ext (Module.Basis.ext JetComponentSpace.basis fun j => ?_) - simp [massWeightPoly, ofGenerator] - exact AlgHom.congr_fun h x - -lemma eq_sum_massWeightPoly_coeff (x : JetAlgebra) : - x = ∑ n ∈ Polynomial.support (massWeightPoly x), (massWeightPoly x).coeff n := by - conv_lhs => rw [← massWeightPoly_eval_one x] - rw [Polynomial.eval_eq_sum, Polynomial.sum_def] - simp - -/-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ -lemma massWeightPoly_ofGenerator (j : JetGenerators) : - massWeightPoly (ofGenerator j) = Polynomial.monomial j.massWeight (ofGenerator j) := by - rw [massWeightPoly, ofGenerator, ExteriorAlgebra.lift_ι_apply, Module.Basis.constr_basis] - rfl - -/-- `massWeightPoly` is injective, however, it is not surjective. -/ -lemma massWeightPoly_injective : Function.Injective massWeightPoly := by - intro x y h - rw [← massWeightPoly_eval_one x, ← massWeightPoly_eval_one y] - simp [h] - -/-- The total derivative of a linear generator: `massWeightPoly (∂_μ (ι v))` is - `X ^ 2` times a polynomial whose coefficients are the total derivatives of the - coefficients of `massWeightPoly (ι v)`. -/ -lemma exists_massWeightPoly_jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : - ∃ q : Polynomial JetAlgebra, - massWeightPoly (jetDeriv μ (ExteriorAlgebra.ι ℂ v)) = Polynomial.X ^ 2 * q ∧ - ∀ n, q.coeff n = - jetDeriv μ ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) := by - have hv : v ∈ Submodule.span ℂ (Set.range JetComponentSpace.basis) := by - rw [JetComponentSpace.basis.span_eq] - trivial - induction hv using Submodule.span_induction with - | mem y hy => - obtain ⟨j, rfl⟩ := hy - refine ⟨Polynomial.monomial j.massWeight (ofGenerator (JetGenerators.shift μ j)), ?_, - fun n => ?_⟩ - · rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, - jetDeriv_ofGenerator, massWeightPoly_ofGenerator, JetGenerators.massWeight_shift, - Polynomial.X_pow_eq_monomial, Polynomial.monomial_mul_monomial, one_mul, - Nat.add_comm 2 j.massWeight] - · rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, - massWeightPoly_ofGenerator, Polynomial.coeff_monomial, Polynomial.coeff_monomial] - split_ifs with h - · rw [jetDeriv_ofGenerator] - · rw [map_zero] - | zero => exact ⟨0, by simp, fun n => by simp⟩ - | add y z _ _ hy hz => - obtain ⟨qy, hqy, cy⟩ := hy - obtain ⟨qz, hqz, cz⟩ := hz - refine ⟨qy + qz, ?_, fun n => ?_⟩ - · simp only [map_add, hqy, hqz, mul_add] - · simp only [map_add, Polynomial.coeff_add, cy, cz] - | smul c y _ hy => - obtain ⟨qy, hqy, cy⟩ := hy - refine ⟨c • qy, ?_, fun n => ?_⟩ - · simp only [map_smul, hqy, mul_smul_comm] - · simp only [map_smul, Polynomial.coeff_smul, cy] - -/-- Rearrangement used for the Leibniz step: `X ^ 2` is central, so it can be - pulled out of a Leibniz combination. -/ -private lemma X_sq_mul_leibniz {R : Type} [Semiring R] (p q r s : Polynomial R) : - Polynomial.X ^ 2 * p * q + r * (Polynomial.X ^ 2 * s) = - Polynomial.X ^ 2 * (p * q + r * s) := by - rw [mul_add, mul_assoc, ← mul_assoc r, ← Polynomial.X_pow_mul, mul_assoc] - -/-- The polynomial half of the Leibniz step: the mass-weight polynomial of - `∂_μ (a * b)` is `X ^ 2` times the Leibniz combination. -/ -lemma massWeightPoly_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} - {qa qb : Polynomial JetAlgebra} - (hqa : massWeightPoly (jetDeriv μ a) = Polynomial.X ^ 2 * qa) - (hqb : massWeightPoly (jetDeriv μ b) = Polynomial.X ^ 2 * qb) : - massWeightPoly (jetDeriv μ (a * b)) = - Polynomial.X ^ 2 * (qa * massWeightPoly b + massWeightPoly a * qb) := by - rw [jetDeriv_mul, map_add massWeightPoly, map_mul massWeightPoly, map_mul massWeightPoly, - hqa, hqb, X_sq_mul_leibniz] - -/-- The coefficient half of the Leibniz step: the coefficients of the Leibniz - combination are the total derivatives of the coefficients of `a * b`. -/ -lemma coeff_mul_jetDeriv (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} - {qa qb : Polynomial JetAlgebra} - (ca : ∀ n, qa.coeff n = jetDeriv μ ((massWeightPoly a).coeff n)) - (cb : ∀ n, qb.coeff n = jetDeriv μ ((massWeightPoly b).coeff n)) (n : ℕ) : - (qa * massWeightPoly b + massWeightPoly a * qb).coeff n = - jetDeriv μ ((massWeightPoly (a * b)).coeff n) := by - rw [Polynomial.coeff_add, Polynomial.coeff_mul, Polynomial.coeff_mul, - ← Finset.sum_add_distrib, map_mul massWeightPoly, Polynomial.coeff_mul, - map_sum (jetDeriv μ)] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [jetDeriv_mul, ca, cb] - -/-- The Leibniz rule propagates the shift: if the mass-weight polynomials of the - total derivatives of `a` and `b` are `X ^ 2` times the coefficientwise total - derivatives, then so is that of `a * b`. -/ -lemma exists_massWeightPoly_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} - {qa qb : Polynomial JetAlgebra} - (hqa : massWeightPoly (jetDeriv μ a) = Polynomial.X ^ 2 * qa) - (ca : ∀ n, qa.coeff n = jetDeriv μ ((massWeightPoly a).coeff n)) - (hqb : massWeightPoly (jetDeriv μ b) = Polynomial.X ^ 2 * qb) - (cb : ∀ n, qb.coeff n = jetDeriv μ ((massWeightPoly b).coeff n)) : - ∃ q : Polynomial JetAlgebra, massWeightPoly (jetDeriv μ (a * b)) = Polynomial.X ^ 2 * q ∧ - ∀ n, q.coeff n = jetDeriv μ ((massWeightPoly (a * b)).coeff n) := - ⟨qa * massWeightPoly b + massWeightPoly a * qb, - massWeightPoly_jetDeriv_mul μ hqa hqb, coeff_mul_jetDeriv μ ca cb⟩ - -/-- The mass-weight polynomial of a total derivative is `X ^ 2` times a polynomial - whose coefficients are the total derivatives of the coefficients: the total - derivative raises the mass weight by two. -/ -lemma exists_massWeightPoly_jetDeriv (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - ∃ q : Polynomial JetAlgebra, massWeightPoly (jetDeriv μ x) = Polynomial.X ^ 2 * q ∧ - ∀ n, q.coeff n = jetDeriv μ ((massWeightPoly x).coeff n) := by - induction x using ExteriorAlgebra.induction with - | algebraMap r => - have hr : jetDeriv μ (algebraMap ℂ JetAlgebra r) = 0 := by - rw [Algebra.algebraMap_eq_smul_one, map_smul (jetDeriv μ), jetDeriv_one, smul_zero] - refine ⟨0, ?_, fun n => ?_⟩ - · rw [hr, map_zero massWeightPoly, mul_zero] - · rw [Polynomial.coeff_zero, AlgHom.commutes, Polynomial.algebraMap_apply, - Polynomial.coeff_C] - split_ifs with h - · rw [hr] - · rw [map_zero (jetDeriv μ)] - | ι v => exact exists_massWeightPoly_jetDeriv_ι μ v - | mul a b ha hb => - obtain ⟨qa, hqa, ca⟩ := ha - obtain ⟨qb, hqb, cb⟩ := hb - exact exists_massWeightPoly_jetDeriv_mul μ hqa ca hqb cb - | add a b ha hb => - obtain ⟨qa, hqa, ca⟩ := ha - obtain ⟨qb, hqb, cb⟩ := hb - refine ⟨qa + qb, ?_, fun n => ?_⟩ - · simp only [map_add, hqa, hqb, mul_add] - · simp only [map_add, Polynomial.coeff_add, ca, cb] - -/-- The total derivative raises the mass weight by two: it takes the part of `x` of - mass weight `n` to the part of `∂_μ x` of mass weight `n + 2`. -/ -lemma jetDeriv_massWeightPoly_coeff (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) (n : ℕ) : - jetDeriv μ ((massWeightPoly x).coeff n) = (massWeightPoly (jetDeriv μ x)).coeff (n + 2) := by - obtain ⟨q, hq, hc⟩ := exists_massWeightPoly_jetDeriv μ x - rw [hq, Polynomial.coeff_X_pow_mul, hc] - - -/-- The coefficients of the mass-weight polynomial of a linear generator are - homogeneous: each basis vector is homogeneous, and a general vector is a - combination of basis vectors. -/ -lemma massWeightPoly_coeff_massWeightPoly_ι (n : ℕ) (v : JetComponentSpace) : - massWeightPoly ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) = - Polynomial.monomial n ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) := by - have hv : v ∈ Submodule.span ℂ (Set.range JetComponentSpace.basis) := by - rw [JetComponentSpace.basis.span_eq] - trivial - induction hv using Submodule.span_induction generalizing n with - | mem y hy => - obtain ⟨j, rfl⟩ := hy - rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, - massWeightPoly_ofGenerator, Polynomial.coeff_monomial] - split_ifs with h - · rw [← h, massWeightPoly_ofGenerator] - · simp only [map_zero] - | zero => simp only [map_zero, Polynomial.coeff_zero] - | add y z _ _ hy hz => - simp only [map_add, Polynomial.coeff_add] - rw [hy n, hz n] - | smul c y _ hy => - simp only [map_smul, Polynomial.coeff_smul] - rw [hy n, Polynomial.smul_monomial] - -/-- Homogeneity of the coefficients is inherited by products: the `n`-th coefficient - of a product is a sum of products of coefficients of complementary degrees. -/ -lemma massWeightPoly_coeff_massWeightPoly_mul {a b : JetAlgebra} - (ha : ∀ n, massWeightPoly ((massWeightPoly a).coeff n) = - Polynomial.monomial n ((massWeightPoly a).coeff n)) - (hb : ∀ n, massWeightPoly ((massWeightPoly b).coeff n) = - Polynomial.monomial n ((massWeightPoly b).coeff n)) (n : ℕ) : - massWeightPoly ((massWeightPoly (a * b)).coeff n) = - Polynomial.monomial n ((massWeightPoly (a * b)).coeff n) := by - rw [map_mul massWeightPoly a b, Polynomial.coeff_mul, map_sum massWeightPoly, - map_sum (Polynomial.monomial n)] - refine Finset.sum_congr rfl fun p hp => ?_ - rw [Finset.mem_antidiagonal] at hp - subst hp - rw [map_mul massWeightPoly, ha p.1, hb p.2, Polynomial.monomial_mul_monomial] - -/-- The coefficients of a mass-weight polynomial are homogeneous: the coefficient of - `X ^ n` in `massWeightPoly x` is sent by `massWeightPoly` to `X ^ n` times itself. - - This fails for a general `p : Polynomial JetAlgebra` in place of `massWeightPoly x`: - for `p = Polynomial.monomial 5 1` it would say `1 = X ^ 5`. -/ -lemma massWeightPoly_coeff_massWeightPoly (n : ℕ) (x : JetAlgebra) : - massWeightPoly ((massWeightPoly x).coeff n) = - Polynomial.monomial n ((massWeightPoly x).coeff n) := by - induction x using ExteriorAlgebra.induction generalizing n with - | algebraMap r => - rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] - split_ifs with h - · subst h - rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.monomial_zero_left] - · simp only [map_zero] - | ι v => exact massWeightPoly_coeff_massWeightPoly_ι n v - | mul a b ha hb => exact massWeightPoly_coeff_massWeightPoly_mul ha hb n - | add a b ha hb => - rw [map_add massWeightPoly a b, Polynomial.coeff_add, map_add massWeightPoly, ha n, hb n] - exact (map_add (Polynomial.monomial n) _ _).symm - - -/-- The submodule of elements of mass weight `n`: those `x` whose mass-weight - polynomial is `x * X ^ n`. -/ -def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where - carrier := {x | massWeightPoly x = Polynomial.monomial n x} - add_mem' {a b} ha hb := by - simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ - rw [ha, hb] - zero_mem' := by simp - smul_mem' c x hx := by - simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ - rw [hx, Polynomial.smul_monomial] - -@[simp] -lemma mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} : - x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl - -/-- The generator `j` has mass weight `j.massWeight`. -/ -lemma ofGenerator_mem_massWeightSubmodule (j : JetGenerators) : - ofGenerator j ∈ massWeightSubmodule j.massWeight := - massWeightPoly_ofGenerator j - -/-- Mass weights add under multiplication, and `1` has mass weight zero. -/ -instance : SetLike.GradedMonoid massWeightSubmodule where - one_mem := by simp - mul_mem {m n x y} hx hy := by - simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ - rw [hx, hy, Polynomial.monomial_mul_monomial] - -/-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass - weight `n`. -/ -lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : - (massWeightPoly x).coeff n ∈ massWeightSubmodule n := - massWeightPoly_coeff_massWeightPoly n x - -/-- On an element of mass weight `n`, the `n`-th coefficient of the mass-weight - polynomial is the element itself. -/ -lemma coeff_massWeightPoly_of_mem {n : ℕ} {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) : (massWeightPoly x).coeff n = x := by - rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_pos rfl] - -/-- On an element of mass weight `m`, every other coefficient of the mass-weight - polynomial vanishes. -/ -lemma coeff_massWeightPoly_of_mem_ne {m n : ℕ} {x : JetAlgebra} (hmn : m ≠ n) - (hx : x ∈ massWeightSubmodule m) : (massWeightPoly x).coeff n = 0 := by - rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_neg hmn] - -/-- The `i`-th coefficient of the mass-weight polynomial vanishes on the span of - all the *other* weight submodules. This is the separation property that makes - the weight decomposition direct. -/ -lemma coeff_massWeightPoly_eq_zero_of_mem_iSup_ne (i : ℕ) {x : JetAlgebra} - (hx : x ∈ ⨆ (j : ℕ) (_ : j ≠ i), massWeightSubmodule j) : - (massWeightPoly x).coeff i = 0 := by - induction hx using Submodule.iSup_induction' with - | mem j x hj => - by_cases hne : j ≠ i - · rw [iSup_pos hne] at hj - exact coeff_massWeightPoly_of_mem_ne hne hj - · rw [iSup_neg hne, Submodule.mem_bot] at hj - rw [hj, map_zero, Polynomial.coeff_zero] - | zero => simp - | add a b _ _ ha hb => rw [map_add, Polynomial.coeff_add, ha, hb, add_zero] - -/-- The weight submodules span the whole jet algebra. -/ -lemma iSup_massWeightSubmodule_eq_top : - ⨆ n : ℕ, massWeightSubmodule n = ⊤ := by - rw [eq_top_iff] - intro x _ - rw [eq_sum_massWeightPoly_coeff x] - exact Submodule.sum_mem _ fun n _ => Submodule.mem_iSup_of_mem n - (coeff_massWeightPoly_mem_massWeightSubmodule n x) - -/-- The weight submodules are independent: an element of weight `i` lying in the - span of the other weights is zero, since taking the `i`-th coefficient of the - mass-weight polynomial returns it on the one and kills it on the other. -/ -lemma iSupIndep_massWeightSubmodule : iSupIndep massWeightSubmodule := by - intro i - rw [Submodule.disjoint_def] - intro x hx hx' - rw [← coeff_massWeightPoly_of_mem hx] - exact coeff_massWeightPoly_eq_zero_of_mem_iSup_ne i hx' - -/-- The jet algebra is the internal direct sum of its mass-weight submodules. -/ -lemma massWeightSubmodule_isInternal : DirectSum.IsInternal massWeightSubmodule := - (DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top _).mpr - ⟨iSupIndep_massWeightSubmodule, iSup_massWeightSubmodule_eq_top⟩ - -noncomputable instance : GradedAlgebra massWeightSubmodule := - DirectSum.IsInternal.gradedAlgebra massWeightSubmodule_isInternal - - -/-- The mass-dimension scaling on the jet algebra of the charged-lepton singlet: - the (linear map underlying the) algebra map multiplying each generator by - `c ^ w`, where `w` is twice its mass dimension. -/ -noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra := - (ExteriorAlgebra.map (JetComponentSpace.massWeightScale c)) - -lemma massWeightScale_apply (c : ℂ) (x : JetAlgebra) : - massWeightScale c x = - ExteriorAlgebra.map (JetComponentSpace.massWeightScale c) x := rfl - -/-- Each generator scales by `c` to the power of its mass weight. -/ -@[simp] -lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : - massWeightScale c (ofGenerator j) = c ^ j.massWeight • ofGenerator j := by - rw [ofGenerator, massWeightScale_apply, ExteriorAlgebra.map_apply_ι, - JetComponentSpace.massWeightScale_basis, map_smul] - -@[simp] -lemma massWeightScale_ι (c : ℂ) (v : JetComponentSpace) : - massWeightScale c (ExteriorAlgebra.ι ℂ v) = - ExteriorAlgebra.ι ℂ (JetComponentSpace.massWeightScale c v) := by - rw [massWeightScale_apply, ExteriorAlgebra.map_apply_ι] - - -/-- The total derivative raises the mass weight by two: the scaling and the - derivative commute up to `c ^ 2`. -/ -lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by - induction x using ExteriorAlgebra.induction with - | algebraMap r => - simp [Algebra.algebraMap_eq_smul_one] - | ι v => - rw [jetDeriv_ι, massWeightScale_ι, JetComponentSpace.massWeightScale_jetDeriv, - map_smul, massWeightScale_ι, jetDeriv_ι] - | mul x y hx hy => - simp [map_mul, jetDeriv_mul, hx, hy, smul_add] - | add x y hx hy => - simp only [map_add, hx, hy, smul_add] - -/-- The mass-dimension scaling commutes with the gauge action of jets of - constant gauge transformations. This fails for a general jet: the gauge action - sends `∂ψ` to `u(0)⁶ ∂ψ + (∂u⁶)(0) ψ + …`, mixing derivative degrees - downwards, while the scaling weights each degree differently, so the two - compositions already differ on first-derivative generators. -/ -lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) : - massWeightScale c ∘ₗ JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = - JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ∘ₗ massWeightScale c := by - have h : (massWeightScale c).comp - (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI - (JetGaugeGroupI.ofConstant g))) = - (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI - (JetGaugeGroupI.ofConstant g))).comp (massWeightScale c) := by - rw [massWeightScale, ExteriorAlgebra.map_comp_map, ExteriorAlgebra.map_comp_map, - JetComponentSpace.massWeightScale_repJetGaugeGroupI_ofConstant] - have h2 := congrArg AlgHom.toLinearMap h - rw [AlgHom.comp_toLinearMap, AlgHom.comp_toLinearMap] at h2 - exact h2 - -lemma massWeightScale_repLorentzGroup (c : ℂ) (g : SL(2,ℂ)) : - massWeightScale c ∘ₗ JetAlgebra.repLorentzGroup g = - JetAlgebra.repLorentzGroup g ∘ₗ massWeightScale c := by - have h : (massWeightScale c).comp - (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)) = - (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)).comp - (massWeightScale c) := by - rw [massWeightScale, ExteriorAlgebra.map_comp_map, ExteriorAlgebra.map_comp_map, - JetComponentSpace.massWeightScale_repLorentzGroup] - have h2 := congrArg AlgHom.toLinearMap h - rw [AlgHom.comp_toLinearMap, AlgHom.comp_toLinearMap] at h2 - exact h2 - -lemma massWeightScale_repJetGaugeGroupI_ofConstant_apply (c : ℂ) (g : GaugeGroupI) - (x : JetAlgebra) : - massWeightScale c - (JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = - JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (massWeightScale c x) := - DFunLike.congr_fun (massWeightScale_repJetGaugeGroupI_ofConstant c g) x - -lemma massWeightScale_repLorentzGroup_apply (c : ℂ) (g : SL(2,ℂ)) (x : JetAlgebra) : - massWeightScale c (JetAlgebra.repLorentzGroup g x) = - JetAlgebra.repLorentzGroup g (massWeightScale c x) := by - have h := massWeightScale_repLorentzGroup c g - exact DFunLike.congr_fun h x - -end JetAlgebra - -end LeptonSinglet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean new file mode 100644 index 000000000..2e15d34e7 --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -0,0 +1,274 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.Basic +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.DerivAlgebra +public import Physlib.Mathematics.ConjModule +/-! +# Charged-lepton singlets + +## i. Overview + +The Standard Model charged-lepton singlet is a right-handed Weyl spinor in the `(1, 1)_{-6}` +representation. Here charges are normalized as `6Y`, so `-6` is the usual hypercharge +`Y = -1`. + +`LeptonSinglet` is the target vector space of one charged-lepton singlet. Its only index is +the Lorentz index carried by the Weyl spinor. + +The Lorentz and gauge actions are first defined separately. The gauge action is then computed +on an arbitrary spinor, used to identify its kernel, and descended to each supported global +form of the Standard Model gauge group. + +## ii. Key results + +- `LeptonSinglet` : the target space of the `(1, 1)_{-6}` multiplet. +- `repLorentzGroup` : the right-handed Lorentz action. +- `repGaugeGroupI` : the action of the unquotiented gauge group. +- `repGaugeGroupI_apply` : the gauge action on a spinor. +- `mem_repGaugeGroupI_ker_iff_eq` : the kernel of the full-group action. +- `gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI` : triviality of the central `ℤ₆`. +- `repGaugeGroup` : the action descended to every supported gauge-group quotient. + +## iii. Table of contents + +- A. The charged-lepton-singlet space +- B. Linear structure + - B.1. The basis of the charged-lepton-singlet space +- C. Lorentz action +- D. Global Gauge action +- E. Kernel of the gauge action +- F. Descent to quotient gauge groups + +-/ + +@[expose] public section + +namespace StandardModel + +/-! + +## A. The charged-lepton-singlet space + +The Weyl spinor carries the right-handed Lorentz index, and it is the whole of the multiplet: +a charged-lepton singlet has no colour index and no weak-isospin index. +-/ + +/-- The target vector space of one Standard Model charged-lepton singlet. + It carries the `(1, 1)_{-6}` representation of the gauge group. -/ +@[ext] +structure LeptonSinglet where + /-- The right-handed Weyl spinor. -/ + val : Fermion.RightHandedWeyl + +namespace LeptonSinglet + +/-! + +## B. Linear structure + +The wrapper distinguishes charged-lepton singlets from other isomorphic vector spaces. +The following equivalences transfer the linear structure of the Weyl-spinor space and expose +that model when defining representations. +-/ + +/-- Identifies a charged-lepton singlet with its underlying Weyl spinor. -/ +def valEquiv : LeptonSinglet ≃ Fermion.RightHandedWeyl where + toFun := val + invFun := fun m => ⟨m⟩ + +instance : AddCommGroup LeptonSinglet := Equiv.addCommGroup valEquiv + +instance : Module ℂ LeptonSinglet := Equiv.module ℂ valEquiv + +/-- The linear identification with the underlying Weyl-spinor space. -/ +def valLinEquiv : LeptonSinglet ≃ₗ[ℂ] Fermion.RightHandedWeyl where + toFun := val + invFun := fun m => ⟨m⟩ + map_add' := by intros; rfl + map_smul' := by intros; rfl + +@[simp] +lemma valLinEquiv_apply (l : LeptonSinglet) : valLinEquiv l = l.val := rfl + +lemma valLinEquiv_symm_apply (m : Fermion.RightHandedWeyl) : + valLinEquiv.symm m = ⟨m⟩ := rfl + +@[simp] +lemma val_add (l₁ l₂ : LeptonSinglet) : (l₁ + l₂).val = l₁.val + l₂.val := rfl + +@[simp] +lemma val_smul (r : ℂ) (l : LeptonSinglet) : (r • l).val = r • l.val := rfl + +/-! + +### B.1. The basis of the charged-lepton-singlet space + +-/ + +/-- A basis on the charged-lepton singlets. -/ +noncomputable def basis : Module.Basis (Fin 2) ℂ LeptonSinglet := + Fermion.RightHandedWeyl.basis.map valLinEquiv.symm + +/-! + +## C. Lorentz action + +The Lorentz group acts through the right-handed Weyl representation, transported along the +identification of a charged-lepton singlet with its spinor. +-/ + +open Matrix MatrixGroups + +/-- The right-handed Lorentz representation on charged-lepton singlets. -/ +noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonSinglet where + toFun Λ := valLinEquiv.symm ∘ₗ Fermion.RightHandedWeyl.rep Λ ∘ₗ valLinEquiv + map_one' := by + ext l + simp [Module.End.one_eq_id] + map_mul' Λ₁ Λ₂ := by + ext1 l + simp [Module.End.mul_eq_comp] + +/-- The Lorentz action on the lepton-singlet basis: the right-handed Weyl + action by the entrywise conjugate matrix. -/ +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (basis α) = ∑ β, star (Λ.1 β α) • basis β := by + simp only [basis, Module.Basis.map_apply, repLorentzGroup, MonoidHom.coe_mk, + OneHom.coe_mk, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + LinearEquiv.apply_symm_apply, Fermion.RightHandedWeyl.rep_apply_basis, + Matrix.map_apply, map_sum, map_smul] + +/-- The lepton jet coordinates transform contragrediently, by the entrywise + conjugate of the inverse matrix. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup.dual Λ (basis.dualBasis α) = + ∑ β, star ((Λ⁻¹).1 α β) • basis.dualBasis β := + Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => star ((Λ⁻¹).1 l j)) + (fun j => repLorentzGroup_apply_basis Λ⁻¹ j) + +/-- The Lorentz action on the conjugate lepton basis: the coefficients are the + conjugates of those of the lepton action, that is, the matrix itself. -/ +lemma repLorentzGroup_conj_apply_basis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup.conj Λ (basis.conj α) = ∑ β, Λ.1 β α • basis.conj β := by + rw [Representation.conj_apply, Module.Basis.conj_apply, + LinearEquiv.symm_apply_apply, repLorentzGroup_apply_basis, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [LinearEquiv.map_smulₛₗ, starRingEnd_apply, star_star, Module.Basis.conj_apply] + +/-- The conjugate lepton jet coordinates transform by the inverse matrix. -/ +lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup.conj.dual Λ (basis.conj.dualBasis α) = + ∑ β, (Λ⁻¹).1 α β • basis.conj.dualBasis β := + Representation.dual_apply_dualBasis _ _ _ _ + (Matrix.of fun l j => (Λ⁻¹).1 l j) + (fun j => repLorentzGroup_conj_apply_basis Λ⁻¹ j) + +/-! + +## D. Global Gauge action + +The colour and weak factors act trivially, so the gauge group acts only through hypercharge. +The `U(1)` action is `star z ^ 6`; since `z` is unitary, `star z = z⁻¹`, so this represents +charge `-6`. + +The formulas below expose the scalar used to compare actions and compute the kernel. +-/ + +/-- The `(1, 1)_{-6}` action of the unquotiented Standard Model gauge group. -/ +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI LeptonSinglet where + toFun g := valLinEquiv.symm ∘ₗ + LinearMap.lsmul ℂ Fermion.RightHandedWeyl (star g.toU1.1 ^ 6 : ℂ) + ∘ₗ valLinEquiv + map_one' := by + ext l + simp [valLinEquiv_symm_apply] + map_mul' g₁ g₂ := by + ext l + simp [smul_smul, mul_comm, valLinEquiv_symm_apply] + ring_nf + +/-- The gauge group acts on a charged-lepton singlet by the hypercharge scalar alone. -/ +lemma repGaugeGroupI_apply (g : GaugeGroupI) (ψ : Fermion.RightHandedWeyl) : + repGaugeGroupI g ⟨ψ⟩ = ⟨(star g.toU1.1 ^ 6) • ψ⟩ := rfl + +open Fermion in +/-- The gauge action is diagonal in the standard Weyl basis. -/ +lemma repGaugeGroupI_basis (g : GaugeGroupI) (k : Fin 2) : + repGaugeGroupI g ⟨RightHandedWeyl.basis k⟩ = + (star g.toU1.1 ^ 6) • (⟨RightHandedWeyl.basis k⟩ : LeptonSinglet) := rfl + +open Fermion in +/-- Two gauge elements induce the same action exactly when their hypercharge scalars agree. -/ +lemma repGaugeGroupI_eq_iff {g₁ g₂ : GaugeGroupI} : + repGaugeGroupI g₁ = repGaugeGroupI g₂ ↔ + star g₁.toU1.1 ^ 6 = star g₂.toU1.1 ^ 6 := by + constructor + · intro h + have h' := congrFun (congrArg (fun f => f.1) h) + (⟨RightHandedWeyl.basis 0⟩ : LeptonSinglet) + simp only [LinearMap.coe_toAddHom, repGaugeGroupI_apply] at h' + have h'' := congrArg (fun v => RightHandedWeyl.basis.repr (LeptonSinglet.val v) 0) h' + simpa using h'' + · intro h + have h' : (starRingEnd ℂ) g₁.toU1.1 ^ 6 = (starRingEnd ℂ) g₂.toU1.1 ^ 6 := h + ext l + simp [repGaugeGroupI, h'] + +/-! + +## E. Kernel of the gauge action + +An element acts trivially exactly when its hypercharge scalar is one. Its colour and weak +components are unrestricted, since neither appears in the action. +-/ + +/-- Characterizes the full-group elements acting trivially on the charged-lepton singlet. -/ +lemma mem_repGaugeGroupI_ker_iff_eq {g : GaugeGroupI} : + g ∈ repGaugeGroupI.ker ↔ star g.toU1.1 ^ 6 = 1 := by + rw [MonoidHom.mem_ker, ← MonoidHom.map_one repGaugeGroupI, repGaugeGroupI_eq_iff] + simp + +/-! + +## F. Descent to quotient gauge groups + +A representation descends through a quotient when the quotient subgroup lies in its kernel. +The `U(1)` component of a central element is a sixth root of unity, so conjugating and raising +to the sixth power gives one, and charge `-6` therefore acts trivially. +-/ + +/-- The central `ℤ₆` subgroup acts trivially on `(1, 1)_{-6}`. -/ +lemma gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI : + GaugeGroupQuot.subgroup .ℤ₆ ≤ repGaugeGroupI.ker := by + simp only [GaugeGroupQuot.subgroup, gaugeGroupℤ₆SubGroup, SetLike.le_def, + MonoidHom.mem_range, gaugeGroupℤ₆Hom_apply, Subtype.exists, + mem_repGaugeGroupI_ker_iff_eq, forall_exists_index] + rintro g x hx ⟨rfl⟩ + simp only [gaugeGroupℤ₆OfRoot_toU1, gaugeGroupℤ₆UnitaryOfRoot_coe] + have hx6 : (((x : ℂˣ) : ℂ)) ^ 6 = 1 := (mem_rootsOfUnity' 6 x).mp hx + simpa [map_pow] using congrArg (starRingEnd ℂ) hx6 + +/-- Every supported quotient subgroup acts trivially on the charged-lepton singlet. -/ +lemma gaugeGroup_subgroup_le_ker_repGaugeGroupI (Q : GaugeGroupQuot) : + Q.subgroup ≤ repGaugeGroupI.ker := Q.subgroup_le_subgroup_ℤ₆.trans + gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI + +/-- The `(1, 1)_{-6}` representation for every supported global form of the + Standard Model gauge group. -/ +noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → + Representation ℂ (GaugeGroup Q) LeptonSinglet + | .I => repGaugeGroupI + | .ℤ₆ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₆) + | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) + | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) + +end LeptonSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean new file mode 100644 index 000000000..34a1fb80c --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetComponentSpace +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +/-! +# The jet algebra of the charged-lepton singlet + +## i. Overview + +The jet algebra of the charged-lepton singlet is the exterior algebra on its jet +component space. It is the algebra in which the charged-lepton part of a +Lagrangian lives: the generators are the component functions `∂_s ψ_α` and their +conjugates, and the exterior product implements the anticommutativity of +fermionic fields. + +## ii. Key results + +- `JetAlgebra` : the exterior algebra on the jet component space. +- `JetAlgebra.ofGenerator` : the jet-algebra element of a generator. + +## iii. Table of contents + +- A. The jet algebra + - A.1. The generators of the jet algebra + +-/ + +@[expose] public section + +namespace StandardModel + +namespace LeptonSinglet + +open TensorProduct LagrangianTheory + +/-! + +## A. The jet algebra + +-/ + + +abbrev JetAlgebra : Type := ExteriorAlgebra ℂ JetComponentSpace + +namespace JetAlgebra + + +/-! + +### A.1. The generators of the jet algebra + +-/ + +noncomputable def ofGenerator (j : JetGenerators) : JetAlgebra := + ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) + +end JetAlgebra + +end LeptonSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean new file mode 100644 index 000000000..943565134 --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan +/-! +# The jet gauge action on the charged-lepton jet algebra + +## i. Overview + +The jet gauge group acts on the jet algebra of the charged-lepton singlet by the +exterior-algebra functor applied to its action on the jet component space. On a +derivative generator `∂_s ψ_α` the action is the all-orders Leibniz rule for the +contragredient hypercharge character `u ^ 6`: each splitting of the derivative +multi-index contributes a Taylor coefficient of the character against a lower +generator. + +## ii. Key results + +- `JetAlgebra.repJetGaugeGroupI` : the jet gauge action on the jet algebra. +- `JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ` : the all-orders Leibniz rule. +- `JetAlgebra.repJetGaugeGroupIAlgHom` : the action as an algebra homomorphism. + +## iii. Table of contents + +- A. The action of the jet gauge group + +-/ + +@[expose] public section + +namespace StandardModel + +namespace LeptonSinglet + +namespace JetAlgebra + +open TensorProduct LagrangianTheory + +/-! + +## A. The action of the jet gauge group + +-/ + +/-- The action of the (jet) gauge group on the jet algebra of the lepton singlets. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra where + toFun g := (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' g1 g2 := by + simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repJetGaugeGroupI_apply (g : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI g x = + ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI g) x := rfl + +lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : + repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by + simp [repJetGaugeGroupI_apply] + +lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI g (x * y) = + repJetGaugeGroupI g x * repJetGaugeGroupI g y := by + simp [repJetGaugeGroupI_apply] + +/-- The value of the jet of gauge transformations at the base point acts by the + contragredient hypercharge scalar on the zeroth-order singlet generator, with + no derivative contributions. -/ +lemma repJetGaugeGroupI_ofGenerator_ψ_nil (g : JetGaugeGroupI) (α : Fin 2) : + repJetGaugeGroupI g (ofGenerator (.dψ {} α)) = g.eval.2.2 ^ 6 • ofGenerator (.dψ {} α) := by + rw [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.basis_dψ_nil, Submonoid.smul_def] + simp only [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, + Representation.trivial_apply, map_zero, TensorProduct.map_tmul, + DerivAlgebraComplex.jetRingAction_apply_one, map_pow, ← TensorProduct.smul_tmul', + SubmonoidClass.coe_pow, ← map_smul, Prod.smul_mk, smul_zero] + rfl + + +/-- The action of the gauge group on ∂_μ ψ takes it to + g • (∂_μ ψ + 6 i (maurerCartanU1Coeff g μ 0) • ψ)-/ +lemma repJetGaugeGroupI_ofGenerator_ψ_singleton (g : JetGaugeGroupI) + (μ : (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI g (ofGenerator (.dψ {μ} α)) = + g.eval.2.2 ^ 6 • ofGenerator (.dψ {μ} α) - + ((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * (g.eval.2.2 : ℂ) ^ 6) • + ofGenerator (.dψ {} α) := by + have hval : ((g.eval.2.2 : unitary ℂ) : ℂ) = + MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) := rfl + have hcoeff : MvPowerSeries.coeff (Finsupp.single μ 1) + (((g.2.2 : unitary JetRing) : JetRing) ^ 6) = + -((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * + MvPowerSeries.constantCoeff ((g.2.2 : unitary JetRing) : JetRing) ^ 6) := by + have h := congrArg (MvPowerSeries.coeff (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) + (pderiv_pow_unitary g μ 6) + rw [MvPowerSeries.coeff_pderiv] at h + simp only [MvPowerSeries.coeff_zero_eq_constantCoeff_apply, map_mul, map_pow, + MvPowerSeries.constantCoeff_C, Finsupp.coe_zero, Pi.zero_apply, Nat.cast_zero, + zero_add, mul_one] at h + rw [show ((maurerCartanU1Coeff g μ 0 : selfAdjoint ℂ) : ℂ) = + MvPowerSeries.constantCoeff (maurerCartanU1 g μ) from + MvPowerSeries.coeff_zero_eq_constantCoeff_apply _, h] + push_cast + ring + have hinl : ∀ x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet, + (x, (0 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + LinearMap.inl ℂ _ _ x := fun x => rfl + simp only [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.basis_dψ_singleton, JetComponentSpace.basis_dψ_nil, + JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, + Representation.trivial_apply, map_zero, TensorProduct.map_tmul, + DerivAlgebraComplex.jetRingAction_apply_ι, hcoeff, TensorProduct.add_tmul, + ← TensorProduct.smul_tmul', Submonoid.smul_def, SubmonoidClass.coe_pow, + hval, map_pow, sub_eq_add_neg, neg_smul] + simp only [hinl, TensorProduct.neg_tmul, ← TensorProduct.smul_tmul', + map_add, map_neg, map_smul] + +/-- The jet gauge action on a general singlet generator: the all-orders Leibniz + rule. A jet of gauge transformations acts on the derivative generator + `∂_s ψ_α` through the Taylor coefficients of its contragredient hypercharge + power series `u ^ 6`: each splitting `s = p.1 + p.2` contributes the `p.1`-th + Taylor coefficient, with the divided-power multiplicity, times the lower + generator `∂_{p.2} ψ_α`. The zeroth- and first-order cases are + `repJetGaugeGroupI_ofGenerator_ψ_nil` and + `repJetGaugeGroupI_ofGenerator_ψ_singleton`. -/ +lemma repJetGaugeGroupI_ofGenerator_ψ (g : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI g (ofGenerator (.dψ s α)) = + ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((g.2.2 : unitary JetRing) : JetRing) ^ 6) • + ofGenerator (.dψ (Finsupp.toMultiset p.2) α) := by + have hinl : ∀ x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet, + (x, (0 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + LinearMap.inl ℂ _ _ x := fun x => rfl + simp only [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.basis_dψ, DerivAlgebraComplex.basis_apply, Finsupp.toMultiset_toFinsupp, + JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply, + Representation.trivial_apply, map_zero, TensorProduct.map_tmul, + DerivAlgebraComplex.jetRingAction_basis] + simp only [hinl, TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] + +noncomputable def repJetGaugeGroupIAlgHom (g : JetGaugeGroupI) : + AlgHom ℂ JetAlgebra JetAlgebra where + toFun := repJetGaugeGroupI g + map_one' := repJetGaugeGroupI_apply_one g + map_mul' := repJetGaugeGroupI_apply_mul g + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + commutes' := fun r => by simp [repJetGaugeGroupI_apply] + +end JetAlgebra + +end LeptonSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/JetDeriv.lean new file mode 100644 index 000000000..7ebcf2703 --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/JetDeriv.lean @@ -0,0 +1,180 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.Basic +public import Mathlib.Algebra.TrivSqZeroExt.Basic +/-! +# The formal total derivative on the charged-lepton jet algebra + +## i. Overview + +The formal total spacetime derivative extends from the component functions to the +whole jet algebra as an even derivation. It is constructed by lifting the +generator map `ι x ↦ (ι x, ι (∂_μ x))` to an algebra homomorphism into the +trivial square-zero extension of the jet algebra. + +## ii. Key results + +- `JetAlgebra.jetDeriv` : the formal total spacetime derivative. +- `JetAlgebra.jetDeriv_ofGenerator` : the derivative of a generator. +- `JetAlgebra.jetDeriv_mul` : the Leibniz rule. +- `JetAlgebra.jetDeriv_comm` : total derivatives commute. + +## iii. Table of contents + +- A. The formal total derivative on the jet algebra +- B. Gauge transformations and total derivatives + +-/ + +@[expose] public section + +namespace StandardModel + +namespace LeptonSinglet + +namespace JetAlgebra + +/-! + +## A. The formal total derivative on the jet algebra + +The formal total spacetime derivative extends from the component functions to +the whole jet algebra as an even derivation: +`∂_μ (x y) = (∂_μ x) y + x (∂_μ y)`, with no Koszul signs. It is constructed by +lifting the generator map `ι x ↦ (ι x, ι (∂_μ x))` to an algebra homomorphism +into the trivial square-zero extension of the jet algebra; the square-zero +condition holds because degree-one elements of the exterior algebra +anticommute. + +-/ + +/-- The generator map of the total derivative into the trivial square-zero + extension of the jet algebra: `ι x ↦ (ι x, ι (∂_μ x))`. -/ +noncomputable def jetDerivGen (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace →ₗ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra where + toFun x := (ExteriorAlgebra.ι ℂ x, + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x)) + map_add' x y := by + simp only [map_add] + rfl + map_smul' c x := by + simp only [map_smul, RingHom.id_apply] + rfl + +@[simp] +lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl + +@[simp] +lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + (jetDerivGen μ x).snd = ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := rfl + +/-- The generator map squares to zero: degree-one elements of the exterior + algebra anticommute. -/ +lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDerivGen μ x * jetDerivGen μ x = 0 := by + refine TrivSqZeroExt.ext ?_ ?_ + · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, + TrivSqZeroExt.fst_zero] + · rw [TrivSqZeroExt.snd_mul, jetDerivGen_fst, jetDerivGen_snd, TrivSqZeroExt.snd_zero, + smul_eq_mul, op_smul_eq_mul] + exact ExteriorAlgebra.ι_add_mul_swap x (JetComponentSpace.jetDeriv μ x) + +/-- The lift of the total derivative to the trivial square-zero extension of the + jet algebra: the algebra homomorphism `x ↦ (x, ∂_μ x)`. -/ +noncomputable def jetDerivHom (μ : Fin 1 ⊕ Fin 3) : + JetAlgebra →ₐ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra := + ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ + +@[simp] +lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDerivHom μ (ExteriorAlgebra.ι ℂ x) = jetDerivGen μ x := by + rw [jetDerivHom, ExteriorAlgebra.lift_ι_apply] + +/-- The first component of the square-zero lift is the identity. -/ +@[simp] +lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + (jetDerivHom μ x).fst = x := by + have h : (TrivSqZeroExt.fstHom ℂ JetAlgebra JetAlgebra).comp (jetDerivHom μ) = + AlgHom.id ℂ JetAlgebra := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) + simp + exact DFunLike.congr_fun h x + +/-- The formal total spacetime derivative on the jet algebra of the + charged-lepton singlet in the direction `μ`: the even derivation extending the + shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the component functions. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra where + toFun x := (jetDerivHom μ x).snd + map_add' x y := congrArg TrivSqZeroExt.snd (map_add (jetDerivHom μ) x y) + map_smul' c x := congrArg TrivSqZeroExt.snd (map_smul (jetDerivHom μ) c x) + +lemma jetDeriv_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ x = (jetDerivHom μ x).snd := rfl + +@[simp] +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDeriv μ (ExteriorAlgebra.ι ℂ x) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := by + rw [jetDeriv_apply, jetDerivHom_ι, jetDerivGen_snd] + +/-- The total derivative appends the derivative index to each component + function. -/ +@[simp] +lemma jetDeriv_ofGenerator (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + jetDeriv μ (ofGenerator j) = ofGenerator (JetGenerators.shift μ j) := by + rw [ofGenerator, jetDeriv_ι, JetComponentSpace.jetDeriv_basis] + rfl + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := + congrArg TrivSqZeroExt.snd (map_one (jetDerivHom μ)) + +/-- The total derivative is an even derivation: the Leibniz rule holds on the + jet algebra with no Koszul signs. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + have h : jetDeriv μ (x * y) = + (jetDerivHom μ x).fst * jetDeriv μ y + jetDeriv μ x * (jetDerivHom μ y).fst := + congrArg TrivSqZeroExt.snd (map_mul (jetDerivHom μ) x y) + rw [jetDerivHom_fst, jetDerivHom_fst] at h + exact h.trans (add_comm _ _) + +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + simp [Algebra.algebraMap_eq_smul_one] + | ι v => + simp [JetComponentSpace.jetDeriv_comm] + | mul x y hx hy => + simp only [jetDeriv_mul, map_add, hx, hy] + abel + | add x y hx hy => + simp only [map_add, hx, hy] + +/-! + +## B. Gauge transformations and total derivatives + +Let ∂_s be the derivative with respect to the multi-index s. +On the action of the gauge group `∂_s (g • ψ) ≠ g • ∂_s ψ`. +The RHS of this properly takes account of derivatives of the gauge transformation, +while the LHS does not. + +What we want to show is that +`g • ∂_s ψ = ∑_{p + q = s} q ^ {|p|} • (∂_p g) • ∂_q ψ`. +where `q` is the charge of the field. + +-/ + +end JetAlgebra + +end LeptonSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean new file mode 100644 index 000000000..8dca259b2 --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.Basic +/-! +# The Lorentz action on the charged-lepton jet algebra + +## i. Overview + +The Lorentz group acts on the jet algebra of the charged-lepton singlet by the +exterior-algebra functor applied to its action on the jet component space. On a +generator the derivative symbols transform by the Lorentz matrix and the spinor +index contragrediently. + +## ii. Key results + +- `JetAlgebra.repLorentzGroup` : the Lorentz action on the jet algebra. +- `JetAlgebra.repLorentzGroup_ofGenerator` : the action on a generator. +- `JetAlgebra.repLorentzGroupAlgHom` : the action as an algebra homomorphism. + +## iii. Table of contents + +- A. The action of the Lorentz group + +-/ + +@[expose] public section + +namespace StandardModel + +namespace LeptonSinglet + +namespace JetAlgebra + +open Matrix MatrixGroups + +/-! + +## A. The action of the Lorentz group + +-/ + +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) JetAlgebra where + toFun g := (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' g1 g2 := by + simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repLorentzGroup_apply (g : SL(2,ℂ)) (x : JetAlgebra) : + repLorentzGroup g x = + ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g) x := rfl + +lemma repLorentzGroup_apply_one (g : SL(2,ℂ)) : + repLorentzGroup g 1 = 1 := by simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_mul (g : SL(2,ℂ)) (x y : JetAlgebra) : + repLorentzGroup g (x * y) = repLorentzGroup g x * repLorentzGroup g y := by + simp [repLorentzGroup_apply] + +/-- The Lorentz action on a jet-algebra generator. -/ +lemma repLorentzGroup_ofGenerator (Λ : SL(2,ℂ)) (j : JetGenerators) : + repLorentzGroup Λ (ofGenerator j) = + ExteriorAlgebra.ι ℂ + (JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis j)) := by + rw [ofGenerator, repLorentzGroup_apply, ExteriorAlgebra.map_apply_ι] + +/-- The Lorentz action on the zeroth-order lepton generator. -/ +lemma repLorentzGroup_ofGenerator_ψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dψ {} α)) = + ∑ β, star ((Λ⁻¹).1 α β) • ofGenerator (.dψ {} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dψ_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + +/-- The Lorentz action on the first-order lepton generator. -/ +lemma repLorentzGroup_ofGenerator_ψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • ofGenerator (.dψ {ν} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dψ_singleton, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + +/-- The Lorentz action on the zeroth-order conjugate lepton generator. -/ +lemma repLorentzGroup_ofGenerator_barψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dbarψ {} α)) = + ∑ β, (Λ⁻¹).1 α β • ofGenerator (.dbarψ {} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dbarψ_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + +/-- The Lorentz action on the first-order conjugate lepton generator. -/ +lemma repLorentzGroup_ofGenerator_barψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repLorentzGroup Λ (ofGenerator (.dbarψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • ofGenerator (.dbarψ {ν} β) := by + rw [repLorentzGroup_ofGenerator, + JetComponentSpace.repLorentzGroup_basis_dbarψ_singleton, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, ofGenerator] + + +noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : + AlgHom ℂ JetAlgebra JetAlgebra where + toFun := repLorentzGroup Λ + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repLorentzGroup_apply_one Λ + map_mul' := repLorentzGroup_apply_mul Λ + commutes' r := by simp [repLorentzGroup_apply] + +end JetAlgebra + +end LeptonSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean new file mode 100644 index 000000000..1b484322c --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean @@ -0,0 +1,477 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.JetDeriv +/-! +# Mass dimension on the charged-lepton jet algebra + +## i. Overview + +*Note*: In this file we use the notion 'mass weight'. The idea being that the +'mass weight' is twice the mass dimension. This is because it is easier to work +exclusively with integers, and the mass dimension of the fermion fields is 3/2. + +The mass-weight polynomial records the mass weight of each homogeneous piece of +an element of the jet algebra in a formal variable. It gives the mass-weight +grading of the jet algebra, and its coefficientwise behaviour under the total +derivative shows that a derivative raises the mass weight by two. + +## ii. Key results + +- `JetAlgebra.massWeightPoly` : the mass-weight polynomial. +- `JetAlgebra.jetDeriv_massWeightPoly_coeff` : a derivative raises the mass weight by two. +- `JetAlgebra.massWeightSubmodule` : the submodule of elements of a given mass weight. +- `JetAlgebra.massWeightSubmodule_isInternal` : the mass-weight decomposition is direct. +- `JetAlgebra.massWeightScale` : the mass-dimension scaling. + +## iii. Table of contents + +- A. The mass-weight polynomial and the mass-weight grading +- B. The mass-weight scaling on the jet algebra + +-/ + +@[expose] public section + +namespace StandardModel + +namespace LeptonSinglet + +namespace JetAlgebra + +open Matrix MatrixGroups LagrangianTheory + +/-! + +## A. The mass-weight polynomial and the mass-weight grading + +-/ + + +/-- The mass-weight polynomial on the charged-lepton factor: the `ℂ`-algebra map + sending each generator `j` to `X ^ w * j`, where `w` is the mass weight of `j`. + It is `LeptonSinglet.JetAlgebra.massWeightScale` with the scalar `c` replaced by + the formal variable `X`. -/ +noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + ExteriorAlgebra.lift ℂ + ⟨JetComponentSpace.basis.constr ℂ fun j => + Polynomial.monomial j.massWeight (ofGenerator j), by + set f := JetComponentSpace.basis.constr ℂ fun j => + Polynomial.monomial j.massWeight (ofGenerator j) with hf + set B := (LinearMap.mul ℂ (Polynomial JetAlgebra)).compl₁₂ f f with hBdef + have hB : B + B.flip = 0 := + LinearMap.ext_basis JetComponentSpace.basis JetComponentSpace.basis fun j k => by + simp only [hBdef, LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, + LinearMap.mul_apply', LinearMap.zero_apply, hf, Module.Basis.constr_basis, + ofGenerator, Polynomial.monomial_mul_monomial, + Nat.add_comm k.massWeight j.massWeight, ← map_add, + ExteriorAlgebra.ι_add_mul_swap, map_zero] + intro v + have h2 : (2 : ℂ) • (f v * f v) = 0 := by + rw [two_smul] + exact LinearMap.congr_fun (LinearMap.congr_fun hB v) v + simpa [smul_smul] using congrArg (fun y => (2⁻¹ : ℂ) • y) h2⟩ + +/-- Setting the formal variable to one recovers the original element. -/ +lemma massWeightPoly_eval_one (x : JetAlgebra) : + (massWeightPoly x).eval 1 = x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) 1 + fun a => Commute.one_right a).comp massWeightPoly = AlgHom.id ℂ JetAlgebra := by + refine ExteriorAlgebra.hom_ext (Module.Basis.ext JetComponentSpace.basis fun j => ?_) + simp [massWeightPoly, ofGenerator] + exact AlgHom.congr_fun h x + +lemma eq_sum_massWeightPoly_coeff (x : JetAlgebra) : + x = ∑ n ∈ Polynomial.support (massWeightPoly x), (massWeightPoly x).coeff n := by + conv_lhs => rw [← massWeightPoly_eval_one x] + rw [Polynomial.eval_eq_sum, Polynomial.sum_def] + simp + +/-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ +lemma massWeightPoly_ofGenerator (j : JetGenerators) : + massWeightPoly (ofGenerator j) = Polynomial.monomial j.massWeight (ofGenerator j) := by + rw [massWeightPoly, ofGenerator, ExteriorAlgebra.lift_ι_apply, Module.Basis.constr_basis] + rfl + +/-- `massWeightPoly` is injective, however, it is not surjective. -/ +lemma massWeightPoly_injective : Function.Injective massWeightPoly := by + intro x y h + rw [← massWeightPoly_eval_one x, ← massWeightPoly_eval_one y] + simp [h] + +/-- The total derivative of a linear generator: `massWeightPoly (∂_μ (ι v))` is + `X ^ 2` times a polynomial whose coefficients are the total derivatives of the + coefficients of `massWeightPoly (ι v)`. -/ +lemma exists_massWeightPoly_jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + ∃ q : Polynomial JetAlgebra, + massWeightPoly (jetDeriv μ (ExteriorAlgebra.ι ℂ v)) = Polynomial.X ^ 2 * q ∧ + ∀ n, q.coeff n = + jetDeriv μ ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) := by + have hv : v ∈ Submodule.span ℂ (Set.range JetComponentSpace.basis) := by + rw [JetComponentSpace.basis.span_eq] + trivial + induction hv using Submodule.span_induction with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + refine ⟨Polynomial.monomial j.massWeight (ofGenerator (JetGenerators.shift μ j)), ?_, + fun n => ?_⟩ + · rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, + jetDeriv_ofGenerator, massWeightPoly_ofGenerator, JetGenerators.massWeight_shift, + Polynomial.X_pow_eq_monomial, Polynomial.monomial_mul_monomial, one_mul, + Nat.add_comm 2 j.massWeight] + · rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, + massWeightPoly_ofGenerator, Polynomial.coeff_monomial, Polynomial.coeff_monomial] + split_ifs with h + · rw [jetDeriv_ofGenerator] + · rw [map_zero] + | zero => exact ⟨0, by simp, fun n => by simp⟩ + | add y z _ _ hy hz => + obtain ⟨qy, hqy, cy⟩ := hy + obtain ⟨qz, hqz, cz⟩ := hz + refine ⟨qy + qz, ?_, fun n => ?_⟩ + · simp only [map_add, hqy, hqz, mul_add] + · simp only [map_add, Polynomial.coeff_add, cy, cz] + | smul c y _ hy => + obtain ⟨qy, hqy, cy⟩ := hy + refine ⟨c • qy, ?_, fun n => ?_⟩ + · simp only [map_smul, hqy, mul_smul_comm] + · simp only [map_smul, Polynomial.coeff_smul, cy] + +/-- Rearrangement used for the Leibniz step: `X ^ 2` is central, so it can be + pulled out of a Leibniz combination. -/ +private lemma X_sq_mul_leibniz {R : Type} [Semiring R] (p q r s : Polynomial R) : + Polynomial.X ^ 2 * p * q + r * (Polynomial.X ^ 2 * s) = + Polynomial.X ^ 2 * (p * q + r * s) := by + rw [mul_add, mul_assoc, ← mul_assoc r, ← Polynomial.X_pow_mul, mul_assoc] + +/-- The polynomial half of the Leibniz step: the mass-weight polynomial of + `∂_μ (a * b)` is `X ^ 2` times the Leibniz combination. -/ +lemma massWeightPoly_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} + {qa qb : Polynomial JetAlgebra} + (hqa : massWeightPoly (jetDeriv μ a) = Polynomial.X ^ 2 * qa) + (hqb : massWeightPoly (jetDeriv μ b) = Polynomial.X ^ 2 * qb) : + massWeightPoly (jetDeriv μ (a * b)) = + Polynomial.X ^ 2 * (qa * massWeightPoly b + massWeightPoly a * qb) := by + rw [jetDeriv_mul, map_add massWeightPoly, map_mul massWeightPoly, map_mul massWeightPoly, + hqa, hqb, X_sq_mul_leibniz] + +/-- The coefficient half of the Leibniz step: the coefficients of the Leibniz + combination are the total derivatives of the coefficients of `a * b`. -/ +lemma coeff_mul_jetDeriv (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} + {qa qb : Polynomial JetAlgebra} + (ca : ∀ n, qa.coeff n = jetDeriv μ ((massWeightPoly a).coeff n)) + (cb : ∀ n, qb.coeff n = jetDeriv μ ((massWeightPoly b).coeff n)) (n : ℕ) : + (qa * massWeightPoly b + massWeightPoly a * qb).coeff n = + jetDeriv μ ((massWeightPoly (a * b)).coeff n) := by + rw [Polynomial.coeff_add, Polynomial.coeff_mul, Polynomial.coeff_mul, + ← Finset.sum_add_distrib, map_mul massWeightPoly, Polynomial.coeff_mul, + map_sum (jetDeriv μ)] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [jetDeriv_mul, ca, cb] + +/-- The Leibniz rule propagates the shift: if the mass-weight polynomials of the + total derivatives of `a` and `b` are `X ^ 2` times the coefficientwise total + derivatives, then so is that of `a * b`. -/ +lemma exists_massWeightPoly_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) {a b : JetAlgebra} + {qa qb : Polynomial JetAlgebra} + (hqa : massWeightPoly (jetDeriv μ a) = Polynomial.X ^ 2 * qa) + (ca : ∀ n, qa.coeff n = jetDeriv μ ((massWeightPoly a).coeff n)) + (hqb : massWeightPoly (jetDeriv μ b) = Polynomial.X ^ 2 * qb) + (cb : ∀ n, qb.coeff n = jetDeriv μ ((massWeightPoly b).coeff n)) : + ∃ q : Polynomial JetAlgebra, massWeightPoly (jetDeriv μ (a * b)) = Polynomial.X ^ 2 * q ∧ + ∀ n, q.coeff n = jetDeriv μ ((massWeightPoly (a * b)).coeff n) := + ⟨qa * massWeightPoly b + massWeightPoly a * qb, + massWeightPoly_jetDeriv_mul μ hqa hqb, coeff_mul_jetDeriv μ ca cb⟩ + +/-- The mass-weight polynomial of a total derivative is `X ^ 2` times a polynomial + whose coefficients are the total derivatives of the coefficients: the total + derivative raises the mass weight by two. -/ +lemma exists_massWeightPoly_jetDeriv (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + ∃ q : Polynomial JetAlgebra, massWeightPoly (jetDeriv μ x) = Polynomial.X ^ 2 * q ∧ + ∀ n, q.coeff n = jetDeriv μ ((massWeightPoly x).coeff n) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + have hr : jetDeriv μ (algebraMap ℂ JetAlgebra r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul (jetDeriv μ), jetDeriv_one, smul_zero] + refine ⟨0, ?_, fun n => ?_⟩ + · rw [hr, map_zero massWeightPoly, mul_zero] + · rw [Polynomial.coeff_zero, AlgHom.commutes, Polynomial.algebraMap_apply, + Polynomial.coeff_C] + split_ifs with h + · rw [hr] + · rw [map_zero (jetDeriv μ)] + | ι v => exact exists_massWeightPoly_jetDeriv_ι μ v + | mul a b ha hb => + obtain ⟨qa, hqa, ca⟩ := ha + obtain ⟨qb, hqb, cb⟩ := hb + exact exists_massWeightPoly_jetDeriv_mul μ hqa ca hqb cb + | add a b ha hb => + obtain ⟨qa, hqa, ca⟩ := ha + obtain ⟨qb, hqb, cb⟩ := hb + refine ⟨qa + qb, ?_, fun n => ?_⟩ + · simp only [map_add, hqa, hqb, mul_add] + · simp only [map_add, Polynomial.coeff_add, ca, cb] + +/-- The total derivative raises the mass weight by two: it takes the part of `x` of + mass weight `n` to the part of `∂_μ x` of mass weight `n + 2`. -/ +lemma jetDeriv_massWeightPoly_coeff (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) (n : ℕ) : + jetDeriv μ ((massWeightPoly x).coeff n) = (massWeightPoly (jetDeriv μ x)).coeff (n + 2) := by + obtain ⟨q, hq, hc⟩ := exists_massWeightPoly_jetDeriv μ x + rw [hq, Polynomial.coeff_X_pow_mul, hc] + + +/-- The coefficients of the mass-weight polynomial of a linear generator are + homogeneous: each basis vector is homogeneous, and a general vector is a + combination of basis vectors. -/ +lemma massWeightPoly_coeff_massWeightPoly_ι (n : ℕ) (v : JetComponentSpace) : + massWeightPoly ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) = + Polynomial.monomial n ((massWeightPoly (ExteriorAlgebra.ι ℂ v)).coeff n) := by + have hv : v ∈ Submodule.span ℂ (Set.range JetComponentSpace.basis) := by + rw [JetComponentSpace.basis.span_eq] + trivial + induction hv using Submodule.span_induction generalizing n with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + rw [show ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j) = ofGenerator j from rfl, + massWeightPoly_ofGenerator, Polynomial.coeff_monomial] + split_ifs with h + · rw [← h, massWeightPoly_ofGenerator] + · simp only [map_zero] + | zero => simp only [map_zero, Polynomial.coeff_zero] + | add y z _ _ hy hz => + simp only [map_add, Polynomial.coeff_add] + rw [hy n, hz n] + | smul c y _ hy => + simp only [map_smul, Polynomial.coeff_smul] + rw [hy n, Polynomial.smul_monomial] + +/-- Homogeneity of the coefficients is inherited by products: the `n`-th coefficient + of a product is a sum of products of coefficients of complementary degrees. -/ +lemma massWeightPoly_coeff_massWeightPoly_mul {a b : JetAlgebra} + (ha : ∀ n, massWeightPoly ((massWeightPoly a).coeff n) = + Polynomial.monomial n ((massWeightPoly a).coeff n)) + (hb : ∀ n, massWeightPoly ((massWeightPoly b).coeff n) = + Polynomial.monomial n ((massWeightPoly b).coeff n)) (n : ℕ) : + massWeightPoly ((massWeightPoly (a * b)).coeff n) = + Polynomial.monomial n ((massWeightPoly (a * b)).coeff n) := by + rw [map_mul massWeightPoly a b, Polynomial.coeff_mul, map_sum massWeightPoly, + map_sum (Polynomial.monomial n)] + refine Finset.sum_congr rfl fun p hp => ?_ + rw [Finset.mem_antidiagonal] at hp + subst hp + rw [map_mul massWeightPoly, ha p.1, hb p.2, Polynomial.monomial_mul_monomial] + +/-- The coefficients of a mass-weight polynomial are homogeneous: the coefficient of + `X ^ n` in `massWeightPoly x` is sent by `massWeightPoly` to `X ^ n` times itself. + + This fails for a general `p : Polynomial JetAlgebra` in place of `massWeightPoly x`: + for `p = Polynomial.monomial 5 1` it would say `1 = X ^ 5`. -/ +lemma massWeightPoly_coeff_massWeightPoly (n : ℕ) (x : JetAlgebra) : + massWeightPoly ((massWeightPoly x).coeff n) = + Polynomial.monomial n ((massWeightPoly x).coeff n) := by + induction x using ExteriorAlgebra.induction generalizing n with + | algebraMap r => + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs with h + · subst h + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.monomial_zero_left] + · simp only [map_zero] + | ι v => exact massWeightPoly_coeff_massWeightPoly_ι n v + | mul a b ha hb => exact massWeightPoly_coeff_massWeightPoly_mul ha hb n + | add a b ha hb => + rw [map_add massWeightPoly a b, Polynomial.coeff_add, map_add massWeightPoly, ha n, hb n] + exact (map_add (Polynomial.monomial n) _ _).symm + + +/-- The submodule of elements of mass weight `n`: those `x` whose mass-weight + polynomial is `x * X ^ n`. -/ +def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where + carrier := {x | massWeightPoly x = Polynomial.monomial n x} + add_mem' {a b} ha hb := by + simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ + rw [ha, hb] + zero_mem' := by simp + smul_mem' c x hx := by + simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ + rw [hx, Polynomial.smul_monomial] + +@[simp] +lemma mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} : + x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl + +/-- The generator `j` has mass weight `j.massWeight`. -/ +lemma ofGenerator_mem_massWeightSubmodule (j : JetGenerators) : + ofGenerator j ∈ massWeightSubmodule j.massWeight := + massWeightPoly_ofGenerator j + +/-- Mass weights add under multiplication, and `1` has mass weight zero. -/ +instance : SetLike.GradedMonoid massWeightSubmodule where + one_mem := by simp + mul_mem {m n x y} hx hy := by + simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ + rw [hx, hy, Polynomial.monomial_mul_monomial] + +/-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass + weight `n`. -/ +lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : + (massWeightPoly x).coeff n ∈ massWeightSubmodule n := + massWeightPoly_coeff_massWeightPoly n x + +/-- On an element of mass weight `n`, the `n`-th coefficient of the mass-weight + polynomial is the element itself. -/ +lemma coeff_massWeightPoly_of_mem {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : (massWeightPoly x).coeff n = x := by + rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_pos rfl] + +/-- On an element of mass weight `m`, every other coefficient of the mass-weight + polynomial vanishes. -/ +lemma coeff_massWeightPoly_of_mem_ne {m n : ℕ} {x : JetAlgebra} (hmn : m ≠ n) + (hx : x ∈ massWeightSubmodule m) : (massWeightPoly x).coeff n = 0 := by + rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_neg hmn] + +/-- The `i`-th coefficient of the mass-weight polynomial vanishes on the span of + all the *other* weight submodules. This is the separation property that makes + the weight decomposition direct. -/ +lemma coeff_massWeightPoly_eq_zero_of_mem_iSup_ne (i : ℕ) {x : JetAlgebra} + (hx : x ∈ ⨆ (j : ℕ) (_ : j ≠ i), massWeightSubmodule j) : + (massWeightPoly x).coeff i = 0 := by + induction hx using Submodule.iSup_induction' with + | mem j x hj => + by_cases hne : j ≠ i + · rw [iSup_pos hne] at hj + exact coeff_massWeightPoly_of_mem_ne hne hj + · rw [iSup_neg hne, Submodule.mem_bot] at hj + rw [hj, map_zero, Polynomial.coeff_zero] + | zero => simp + | add a b _ _ ha hb => rw [map_add, Polynomial.coeff_add, ha, hb, add_zero] + +/-- The weight submodules span the whole jet algebra. -/ +lemma iSup_massWeightSubmodule_eq_top : + ⨆ n : ℕ, massWeightSubmodule n = ⊤ := by + rw [eq_top_iff] + intro x _ + rw [eq_sum_massWeightPoly_coeff x] + exact Submodule.sum_mem _ fun n _ => Submodule.mem_iSup_of_mem n + (coeff_massWeightPoly_mem_massWeightSubmodule n x) + +/-- The weight submodules are independent: an element of weight `i` lying in the + span of the other weights is zero, since taking the `i`-th coefficient of the + mass-weight polynomial returns it on the one and kills it on the other. -/ +lemma iSupIndep_massWeightSubmodule : iSupIndep massWeightSubmodule := by + intro i + rw [Submodule.disjoint_def] + intro x hx hx' + rw [← coeff_massWeightPoly_of_mem hx] + exact coeff_massWeightPoly_eq_zero_of_mem_iSup_ne i hx' + +/-- The jet algebra is the internal direct sum of its mass-weight submodules. -/ +lemma massWeightSubmodule_isInternal : DirectSum.IsInternal massWeightSubmodule := + (DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top _).mpr + ⟨iSupIndep_massWeightSubmodule, iSup_massWeightSubmodule_eq_top⟩ + +noncomputable instance : GradedAlgebra massWeightSubmodule := + DirectSum.IsInternal.gradedAlgebra massWeightSubmodule_isInternal + + +/-! + +## B. The mass-weight scaling on the jet algebra + +-/ + +/-- The mass-dimension scaling on the jet algebra of the charged-lepton singlet: + the (linear map underlying the) algebra map multiplying each generator by + `c ^ w`, where `w` is twice its mass dimension. -/ +noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra := + (ExteriorAlgebra.map (JetComponentSpace.massWeightScale c)) + +lemma massWeightScale_apply (c : ℂ) (x : JetAlgebra) : + massWeightScale c x = + ExteriorAlgebra.map (JetComponentSpace.massWeightScale c) x := rfl + +/-- Each generator scales by `c` to the power of its mass weight. -/ +@[simp] +lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : + massWeightScale c (ofGenerator j) = c ^ j.massWeight • ofGenerator j := by + rw [ofGenerator, massWeightScale_apply, ExteriorAlgebra.map_apply_ι, + JetComponentSpace.massWeightScale_basis, map_smul] + +@[simp] +lemma massWeightScale_ι (c : ℂ) (v : JetComponentSpace) : + massWeightScale c (ExteriorAlgebra.ι ℂ v) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.massWeightScale c v) := by + rw [massWeightScale_apply, ExteriorAlgebra.map_apply_ι] + + +/-- The total derivative raises the mass weight by two: the scaling and the + derivative commute up to `c ^ 2`. -/ +lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + simp [Algebra.algebraMap_eq_smul_one] + | ι v => + rw [jetDeriv_ι, massWeightScale_ι, JetComponentSpace.massWeightScale_jetDeriv, + map_smul, massWeightScale_ι, jetDeriv_ι] + | mul x y hx hy => + simp [map_mul, jetDeriv_mul, hx, hy, smul_add] + | add x y hx hy => + simp only [map_add, hx, hy, smul_add] + +/-- The mass-dimension scaling commutes with the gauge action of jets of + constant gauge transformations. This fails for a general jet: the gauge action + sends `∂ψ` to `u(0)⁶ ∂ψ + (∂u⁶)(0) ψ + …`, mixing derivative degrees + downwards, while the scaling weights each degree differently, so the two + compositions already differ on first-derivative generators. -/ +lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) : + massWeightScale c ∘ₗ JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ∘ₗ massWeightScale c := by + have h : (massWeightScale c).comp + (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI + (JetGaugeGroupI.ofConstant g))) = + (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI + (JetGaugeGroupI.ofConstant g))).comp (massWeightScale c) := by + rw [massWeightScale, ExteriorAlgebra.map_comp_map, ExteriorAlgebra.map_comp_map, + JetComponentSpace.massWeightScale_repJetGaugeGroupI_ofConstant] + have h2 := congrArg AlgHom.toLinearMap h + rw [AlgHom.comp_toLinearMap, AlgHom.comp_toLinearMap] at h2 + exact h2 + +lemma massWeightScale_repLorentzGroup (c : ℂ) (g : SL(2,ℂ)) : + massWeightScale c ∘ₗ JetAlgebra.repLorentzGroup g = + JetAlgebra.repLorentzGroup g ∘ₗ massWeightScale c := by + have h : (massWeightScale c).comp + (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)) = + (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup g)).comp + (massWeightScale c) := by + rw [massWeightScale, ExteriorAlgebra.map_comp_map, ExteriorAlgebra.map_comp_map, + JetComponentSpace.massWeightScale_repLorentzGroup] + have h2 := congrArg AlgHom.toLinearMap h + rw [AlgHom.comp_toLinearMap, AlgHom.comp_toLinearMap] at h2 + exact h2 + +lemma massWeightScale_repJetGaugeGroupI_ofConstant_apply (c : ℂ) (g : GaugeGroupI) + (x : JetAlgebra) : + massWeightScale c + (JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = + JetAlgebra.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (massWeightScale c x) := + DFunLike.congr_fun (massWeightScale_repJetGaugeGroupI_ofConstant c g) x + +lemma massWeightScale_repLorentzGroup_apply (c : ℂ) (g : SL(2,ℂ)) (x : JetAlgebra) : + massWeightScale c (JetAlgebra.repLorentzGroup g x) = + JetAlgebra.repLorentzGroup g (massWeightScale c x) := by + have h := massWeightScale_repLorentzGroup c g + exact DFunLike.congr_fun h x + +end JetAlgebra + +end LeptonSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean new file mode 100644 index 000000000..82d9f47fc --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean @@ -0,0 +1,809 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.LagrangianTheory.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# The jet component space of the charged-lepton singlet + +## i. Overview + +A Lagrangian containing a charged-lepton singlet may have terms of the form +`∂_μ ∂_ν ψ`. These expressions are component functions taking a section of the +bundle of charged-lepton singlets and returning a complex number. The space of +all such component functions is the jet component space of the charged-lepton +singlet. + +The jet gauge group and the Lorentz group act on this space, and it carries the +formal total spacetime derivative and the mass-weight scaling. + +## ii. Key results + +- `JetGenerators` : the generators `∂_s ψ_α` and `∂_s ψ̄_α` of the component space. +- `JetComponentSpace` : the space of component functions. +- `JetComponentSpace.repLorentzGroup` : the Lorentz action. +- `JetComponentSpace.repJetGaugeGroupI` : the jet gauge action. +- `JetComponentSpace.jetDeriv` : the formal total spacetime derivative. +- `JetComponentSpace.massWeightScale` : the mass-weight scaling. + +## iii. Table of contents + +- A. The jet component vector space + - A.1. The action of the jet gauge group +- B. The formal total derivative on the component functions +- C. The mass-weight scaling on the component functions +- D. The total derivative on the summands of the component space + +-/ + +@[expose] public section + +namespace StandardModel + +namespace LeptonSinglet + +open Matrix MatrixGroups + +/-! + +## A. The jet component vector space + +A Lagrangian containing a charged lepton singlet may have terms +of the form `∂_μ ∂_ν ψ`. These expressions should be considered as +component functions which takes in a section of the +bundle of charged lepton singlets and returns a complex number. + +The space of all such component functions is what we call the jet component space. +The lagrangian is an element of the algebra over all such component +functions for all the fields in the theory. + +For matter particles, the (jet) Gauge group acts on the +jet component space as a representation. This is not case for the gauge bosons. + +-/ + +open TensorProduct LagrangianTheory + +inductive JetGenerators where + | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators + | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators +deriving DecidableEq + +def JetGenerators.equiv : JetGenerators ≃ + (Multiset (Fin 1 ⊕ Fin 3) × Fin 2 ⊕ Multiset (Fin 1 ⊕ Fin 3) × Fin 2) where + toFun + | JetGenerators.dψ s α => Sum.inl (s, α) + | JetGenerators.dbarψ s α => Sum.inr (s, α) + invFun + | Sum.inl (s, α) => JetGenerators.dψ s α + | Sum.inr (s, α) => JetGenerators.dbarψ s α + left_inv := by + intro x + cases x <;> rfl + right_inv := by + intro x + cases x <;> rfl + +def JetGenerators.massWeight : JetGenerators → ℕ + | JetGenerators.dψ s _ => 3 + 2 * s.card + | JetGenerators.dbarψ s _ => 3 + 2 * s.card + +abbrev JetComponentSpace := + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) × + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet)) + +noncomputable def JetComponentSpace.basis : Module.Basis JetGenerators ℂ JetComponentSpace := + ((DerivAlgebraComplex.basis.tensorProduct + LeptonSinglet.basis.dualBasis).prod + (DerivAlgebraComplex.basis.tensorProduct + (LeptonSinglet.basis.conj.dualBasis))).reindex JetGenerators.equiv.symm + +/-- The basis vector of the jet component space at the zeroth-order singlet + generator: the unit of the dual jet algebra tensored with the dual basis of the + singlet, in the first (unconjugated) factor. -/ +lemma JetComponentSpace.basis_dψ_nil (α : Fin 2) : + JetComponentSpace.basis (.dψ {} α) = + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α, 0) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dψ {} α) = Sum.inl ({}, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', + DerivAlgebraComplex.basis_nil] + · rw [Module.Basis.prod_apply_inl_snd] + +/-- The basis vector of the jet component space at a first-order singlet + generator: the dual derivative symbol tensored with the dual basis of the + singlet, in the first (unconjugated) factor. -/ +lemma JetComponentSpace.basis_dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + JetComponentSpace.basis (.dψ {μ} α) = + (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α, 0) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dψ {μ} α) = Sum.inl ({μ}, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply', + DerivAlgebraComplex.basis_singleton] + · rw [Module.Basis.prod_apply_inl_snd] + +/-- The basis vector of the jet component space at a general singlet generator: + the dual jet algebra basis vector at its multiset of derivative indices, + tensored with the dual basis of the singlet, in the first (unconjugated) + factor. -/ +lemma JetComponentSpace.basis_dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + JetComponentSpace.basis (.dψ s α) = + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dψ s α) = Sum.inl (s, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inl_fst, Module.Basis.tensorProduct_apply'] + · rw [Module.Basis.prod_apply_inl_snd] + +/-- The basis vector of the jet component space at a general conjugate-singlet + generator: the dual jet algebra basis vector at its multiset of derivative + indices, tensored with the conjugate dual basis of the singlet, in the second + (conjugated) factor. -/ +lemma JetComponentSpace.basis_dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + JetComponentSpace.basis (.dbarψ s α) = + (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.conj.dualBasis α) := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, + show JetGenerators.equiv.symm.symm (.dbarψ s α) = Sum.inr (s, α) from rfl] + refine Prod.ext ?_ ?_ + · rw [Module.Basis.prod_apply_inr_fst] + · rw [Module.Basis.prod_apply_inr_snd, Module.Basis.tensorProduct_apply'] + +noncomputable def JetComponentSpace.repLorentzGroup : + Representation ℂ (SL(2,ℂ)) JetComponentSpace := + (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual).prod + (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.conj.dual) + +/-- The Lorentz action on the zeroth-order lepton jet coordinate: the + contragredient conjugate spinor action. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dψ {} α)) = + ∑ β, star ((Λ⁻¹).1 α β) • JetComponentSpace.basis (.dψ {} β) := by + rw [basis_dψ_nil, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + DerivAlgebraComplex.repLorentzGroup_apply_one, + LeptonSinglet.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum] + have hb : ∀ β : Fin 2, JetComponentSpace.basis + (.dψ (0 : Multiset (Fin 1 ⊕ Fin 3)) β) = + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis β, 0) := fun β => basis_dψ_nil β + refine Prod.ext ?_ ?_ + · simp [Prod.fst_sum, hb, TensorProduct.tmul_smul] + · simp [Prod.snd_sum, hb] + +set_option maxHeartbeats 1000000 in +/-- The Lorentz action on the first-order lepton jet coordinate: the derivative + slot transforms by the columns of the Lorentz matrix and the spinor slot + contragrediently. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 α β)) • JetComponentSpace.basis (.dψ {ν} β) := by + rw [basis_dψ_singleton, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + DerivAlgebraComplex.repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, + LeptonSinglet.repLorentzGroup_dual_dualBasis, map_sum, TensorProduct.sum_tmul] + refine Prod.ext ?_ ?_ + · simp only [Prod.fst_sum, Prod.smul_fst, basis_dψ_singleton, map_smul, + TensorProduct.smul_tmul', TensorProduct.tmul_sum, TensorProduct.sum_tmul, + Finset.smul_sum, TensorProduct.tmul_smul, smul_smul] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [mul_comm] + · simp [Prod.snd_sum, basis_dψ_singleton, TensorProduct.tmul_sum, + TensorProduct.sum_tmul, map_smul, TensorProduct.smul_tmul'] + +/-- The Lorentz action on the zeroth-order conjugate lepton jet coordinate. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dbarψ {} α)) = + ∑ β, (Λ⁻¹).1 α β • JetComponentSpace.basis (.dbarψ {} β) := by + rw [basis_dbarψ, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + show DerivAlgebraComplex.basis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 from + DerivAlgebraComplex.basis_nil, + DerivAlgebraComplex.repLorentzGroup_apply_one, + LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, TensorProduct.tmul_sum] + have hb0 : DerivAlgebraComplex.basis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := + DerivAlgebraComplex.basis_nil + refine Prod.ext ?_ ?_ + · simp [Prod.fst_sum, basis_dbarψ] + · simp [Prod.snd_sum, basis_dbarψ, TensorProduct.tmul_smul, hb0] + +set_option maxHeartbeats 1000000 in +/-- The Lorentz action on the first-order conjugate lepton jet coordinate. -/ +lemma JetComponentSpace.repLorentzGroup_basis_dbarψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dbarψ {μ} α)) = + ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α β) • JetComponentSpace.basis (.dbarψ {ν} β) := by + rw [basis_dbarψ, + show JetComponentSpace.repLorentzGroup Λ = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) + (LeptonSinglet.repLorentzGroup.conj.dual Λ)) from rfl, + LinearMap.prodMap_apply, map_zero, TensorProduct.map_tmul, + show DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ) from + DerivAlgebraComplex.basis_singleton μ, + DerivAlgebraComplex.repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, + LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, map_sum, + TensorProduct.sum_tmul] + refine Prod.ext ?_ ?_ + · simp [Prod.fst_sum, basis_dbarψ, TensorProduct.tmul_sum, + TensorProduct.sum_tmul, map_smul, TensorProduct.smul_tmul'] + · simp only [Prod.snd_sum, Prod.smul_snd, basis_dbarψ, + DerivAlgebraComplex.basis_singleton, map_smul, TensorProduct.smul_tmul', + TensorProduct.tmul_sum, TensorProduct.sum_tmul, Finset.smul_sum, + TensorProduct.tmul_smul, smul_smul] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun β _ => ?_ + rw [mul_comm] + +/-! + + +### A.1. The action of the jet gauge group + +Under the action of the gauge group +`∂_s ψ` transforms as +`∑ (x + y = s), ∂_x (star u ^ 6) ∂_y ψ`, and similarly for the conjugate. + + +-/ +/-- The action of the jet gauge group on the dual jet algebra of the + charged-lepton singlet's component functions. Component functions transform + contragrediently to the field, so the hypercharge power series is + `u ^ 6 = (star u ^ 6)⁻¹`, acting through the Leibniz rule on the dual + derivative symbols. -/ +noncomputable def dualJetAlgebraRepJetGaugeGroupI : + Representation ℂ JetGaugeGroupI DerivAlgebraComplex where + toFun U := DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) + map_one' := by + rw [show (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = + (1 : JetRing) by simp, DerivAlgebraComplex.jetRingAction_one] + rfl + map_mul' U₁ U₂ := by + rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 6 = + ((U₁.2.2 : unitary JetRing) : JetRing) ^ 6 * + ((U₂.2.2 : unitary JetRing) : JetRing) ^ 6 by + rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, mul_pow], + DerivAlgebraComplex.jetRingAction_mul, Module.End.mul_eq_comp] + +/-- The action of the jet gauge group on the dual jet algebra of the conjugate + charged-lepton singlet's component functions: the conjugate components + transform with the conjugate-contragredient hypercharge power series + `star u ^ 6`. -/ +noncomputable def dualJetAlgebraRepJetGaugeGroupIConj : + Representation ℂ JetGaugeGroupI + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) where + toFun U := DerivAlgebraComplex.jetRingAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) + map_one' := by + rw [show (star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = + (1 : JetRing) by simp, DerivAlgebraComplex.jetRingAction_one] + rfl + map_mul' U₁ U₂ := by + rw [show (star (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 = + (star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6 * + (star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6 by + rw [show (((U₁ * U₂ : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, star_mul', mul_pow], + DerivAlgebraComplex.jetRingAction_mul, Module.End.mul_eq_comp] + +@[simp] +lemma dualJetAlgebraRepJetGaugeGroupI_apply (U : JetGaugeGroupI) : + dualJetAlgebraRepJetGaugeGroupI U = + DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) := rfl + +@[simp] +lemma dualJetAlgebraRepJetGaugeGroupIConj_apply (U : JetGaugeGroupI) : + dualJetAlgebraRepJetGaugeGroupIConj U = + DerivAlgebraComplex.jetRingAction ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) := rfl + +/-- The `(1, 1)_{-6}` action of the jet gauge group on the space of component + functions of the charged-lepton singlet, its conjugate, and their derivative + coordinates. The conventions are contragredient, matching the `.dual` and + `.conj.dual` conventions of the global component-space representations: the + singlet components transform through the derivative action of `u ^ 6`, the + conjugate components through the derivative action of `star u ^ 6`, and the + target factors are inert. On jets of constant gauge transformations the + derivative symbols are inert and the action reduces to the dual global gauge + action. -/ +noncomputable def JetComponentSpace.repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI JetComponentSpace := + (dualJetAlgebraRepJetGaugeGroupI.tprod + (Representation.trivial ℂ JetGaugeGroupI (Module.Dual ℂ LeptonSinglet))).prod + (dualJetAlgebraRepJetGaugeGroupIConj.tprod + (Representation.trivial ℂ JetGaugeGroupI (Module.Dual ℂ (ConjModule LeptonSinglet)))) + +/-- The jet gauge action preserves the unconjugated half of the component space, + acting there by the dual derivative action of the contragredient hypercharge + power series on the derivative symbols. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inl (U : JetGaugeGroupI) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.repJetGaugeGroupI U ((a ⊗ₜ[ℂ] φ, 0) : JetComponentSpace) = + ((DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6) a) ⊗ₜ[ℂ] φ, 0) := by + refine Prod.ext ?_ ?_ <;> + simp [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupI_apply] + +/-- The jet gauge action on a general element of the unconjugated half of the + component space. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inl' (U : JetGaugeGroupI) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.repJetGaugeGroupI U ((y, 0) : JetComponentSpace) = + ((TensorProduct.map (DerivAlgebraComplex.jetRingAction (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) + LinearMap.id) y, 0) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((a + b, 0) : JetComponentSpace) = (a, 0) + (b, 0) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.repJetGaugeGroupI_inl, TensorProduct.map_tmul] + rfl + +/-- The jet gauge action preserves the conjugated half of the component space, + acting there by the dual derivative action of the conjugate-contragredient + hypercharge power series on the derivative symbols. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inr (U : JetGaugeGroupI) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.repJetGaugeGroupI U ((0, a ⊗ₜ[ℂ] φ) : JetComponentSpace) = + (0, (DerivAlgebraComplex.jetRingAction + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6) a) ⊗ₜ[ℂ] φ) := by + refine Prod.ext ?_ ?_ <;> + simp [JetComponentSpace.repJetGaugeGroupI, Representation.prod_apply_apply, + Representation.tprod_apply, dualJetAlgebraRepJetGaugeGroupIConj_apply] + +/-- The jet gauge action on a general element of the conjugated half of the + component space. -/ +lemma JetComponentSpace.repJetGaugeGroupI_inr' (U : JetGaugeGroupI) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.repJetGaugeGroupI U ((0, y) : JetComponentSpace) = + (0, (TensorProduct.map (DerivAlgebraComplex.jetRingAction + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6)) LinearMap.id) y) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((0, a + b) : JetComponentSpace) = (0, a) + (0, b) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.repJetGaugeGroupI_inr, TensorProduct.map_tmul] + rfl + +open MvPowerSeries in +/-- The gauge action on a lepton jet coordinate is the Leibniz expansion of + `∂_t (u⁶ ψ)`: a sum over the splittings `t = x + y` of the `x`-th Taylor + coefficient of the hypercharge character `u⁶` against the `y`-th coordinate. + The weight `∏ descFactorial` together with `coeff x χ = (∂_x χ)(0) / x!` + makes up the multi-index binomial coefficient `(t choose x)`. -/ +lemma JetComponentSpace.repJetGaugeGroupI_basis_dψ (U : JetGaugeGroupI) + (t : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U (basis (.dψ t α)) = + ∑ p ∈ Finset.antidiagonal t.toFinsupp, + ((∏ μ, (t.toFinsupp μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + basis (.dψ (Multiset.toFinsupp.symm p.2) α) := by + have hb : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, + JetComponentSpace.basis (.dψ (Multiset.toFinsupp.symm p) α) = + ((Lorentz.complexCoBasis.dualBasis.symmetricAlgebra p ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α), 0) := by + intro p + rw [JetComponentSpace.basis_dψ, DerivAlgebraComplex.basis_apply, + AddEquiv.apply_symm_apply] + rw [JetComponentSpace.basis_dψ, JetComponentSpace.repJetGaugeGroupI_inl, + DerivAlgebraComplex.basis_apply, DerivAlgebraComplex.jetRingAction_basis, + TensorProduct.sum_tmul, + show ∀ v : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet, + ((v, 0) : JetComponentSpace) = LinearMap.inl ℂ _ _ v from fun _ => rfl, + map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [hb p.2, ← TensorProduct.smul_tmul', ← TensorProduct.smul_tmul', + map_smul, map_smul] + rfl + +open MvPowerSeries in +/-- The gauge action on the first-order lepton coordinate: the character at the + base point acts on the coordinate itself, and its first Taylor coefficient + feeds into the zeroth-order coordinate. This is the `t = {μ}` case of + `repJetGaugeGroupI_basis_dψ`. -/ +lemma JetComponentSpace.repJetGaugeGroupI_basis_dψ_singleton (U : JetGaugeGroupI) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repJetGaugeGroupI U (basis (.dψ {μ} α)) = + constantCoeff (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + basis (.dψ {μ} α) + + coeff (Finsupp.single μ 1) (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + basis (.dψ {} α) := by + classical + have hm : ({μ} : Multiset (Fin 1 ⊕ Fin 3)).toFinsupp = Finsupp.single μ 1 := by + simp + rw [JetComponentSpace.repJetGaugeGroupI_basis_dψ, hm, Finsupp.antidiagonal_single, + show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} from by decide, + Finset.map_insert, Finset.map_singleton, + Finset.sum_insert (by simp [Finsupp.single_eq_zero]), Finset.sum_singleton] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, + Prod.map_apply, Finsupp.single_zero, coeff_zero_eq_constantCoeff, + Nat.descFactorial_zero, Finset.prod_const_one, Nat.cast_one, one_smul, + Nat.descFactorial_self] + have hw1 : (∏ x, ((Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x).descFactorial + ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x) : ℕ) = 1 := by simp + have hw2 : (∏ x, ((Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) x).factorial : ℕ) + = 1 := by + refine Finset.prod_eq_one fun x _ => ?_ + rcases eq_or_ne μ x with rfl | h + · simp + · simp only [Finsupp.single_apply, if_neg h, Nat.factorial_zero] + have htf1 : Multiset.toFinsupp.symm (Finsupp.single μ 1) = + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [← hm, AddEquiv.symm_apply_apply] + have htf0 : Multiset.toFinsupp.symm (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = + (0 : Multiset (Fin 1 ⊕ Fin 3)) := map_zero _ + rw [hw1, hw2, htf1, htf0] + simp + +/-! + +## B. The formal total derivative on the component functions + +The formal total spacetime derivative `∂_μ` acts on the component functions of +the charged-lepton jet by appending the derivative index, +`∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α`, and likewise on the conjugate components. + +-/ + +namespace JetGenerators + +/-- The jet generator with one further derivative in the direction `μ`. -/ +def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators + | dψ s α => dψ (s + {μ}) α + | dbarψ s α => dbarψ (s + {μ}) α + +@[simp] +lemma shift_dψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + shift μ (dψ s α) = dψ (s + {μ}) α := rfl + +@[simp] +lemma shift_dbarψ (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + shift μ (dbarψ s α) = dbarψ (s + {μ}) α := rfl + +/-- Appending a derivative index raises the mass weight by two: a derivative has + mass dimension one. -/ +@[simp] +lemma massWeight_shift (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + (shift μ j).massWeight = j.massWeight + 2 := by + cases j <;> simp [shift, massWeight] <;> omega + +end JetGenerators + +/-- The formal total spacetime derivative on the space of component functions of + the charged-lepton singlet in the direction `μ`: the shift + `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the derivative multi-index, and likewise on the + conjugate components. -/ +noncomputable def JetComponentSpace.jetDeriv (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace →ₗ[ℂ] JetComponentSpace := + JetComponentSpace.basis.constr ℂ fun j => + JetComponentSpace.basis (JetGenerators.shift μ j) + +@[simp] +lemma JetComponentSpace.jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + JetComponentSpace.jetDeriv μ (JetComponentSpace.basis j) = + JetComponentSpace.basis (JetGenerators.shift μ j) := by + rw [JetComponentSpace.jetDeriv, Module.Basis.constr_basis] + +lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + JetComponentSpace.jetDeriv μ (JetComponentSpace.jetDeriv ν v) = + JetComponentSpace.jetDeriv ν (JetComponentSpace.jetDeriv μ v) := by + have h : JetComponentSpace.jetDeriv μ ∘ₗ JetComponentSpace.jetDeriv ν = + JetComponentSpace.jetDeriv ν ∘ₗ JetComponentSpace.jetDeriv μ := by + refine JetComponentSpace.basis.ext fun j => ?_ + simp [LinearMap.coe_comp, Function.comp_apply, JetComponentSpace.jetDeriv_basis, + JetGenerators.shift, ] + grind + exact DFunLike.congr_fun h v + +/-! + +## C. The mass-weight scaling on the component functions + +-/ + +/-- The mass-dimension scaling on the space of component functions of the + charged-lepton singlet: the diagonal map multiplying each component function + `∂_s ψ_α` by `c ^ w`, where `w` is twice its mass dimension. -/ +noncomputable def JetComponentSpace.massWeightScale (c : ℂ) : + JetComponentSpace →ₗ[ℂ] JetComponentSpace := + JetComponentSpace.basis.constr ℂ fun j => + c ^ j.massWeight • JetComponentSpace.basis j + +@[simp] +lemma JetComponentSpace.massWeightScale_basis (c : ℂ) (j : JetGenerators) : + JetComponentSpace.massWeightScale c (JetComponentSpace.basis j) = + c ^ j.massWeight • JetComponentSpace.basis j := by + rw [JetComponentSpace.massWeightScale, Module.Basis.constr_basis] + +/-- The total derivative raises the mass weight by two on the component space: + the scaling and the derivative commute up to `c ^ 2`. -/ +lemma JetComponentSpace.massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace) : + JetComponentSpace.massWeightScale c (JetComponentSpace.jetDeriv μ v) = + c ^ 2 • JetComponentSpace.jetDeriv μ (JetComponentSpace.massWeightScale c v) := by + have h : JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.jetDeriv μ = + c ^ 2 • (JetComponentSpace.jetDeriv μ ∘ₗ JetComponentSpace.massWeightScale c) := by + refine JetComponentSpace.basis.ext fun j => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.smul_apply, + JetComponentSpace.jetDeriv_basis, JetComponentSpace.massWeightScale_basis, + map_smul, JetGenerators.massWeight_shift, smul_smul, ← pow_add] + congr 1 + ring + exact DFunLike.congr_fun h v + +/-- The mass-dimension scaling commutes with the action of jets of constant + gauge transformations on the component space: the constant action is diagonal + on the generator basis, with no derivative mixing. For a non-constant jet the + higher Taylor coefficients of `u ^ 6` strictly lower the derivative degree, so + the action does not commute with the scaling. -/ +lemma JetComponentSpace.massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) : + JetComponentSpace.massWeightScale c ∘ₗ + JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ∘ₗ + JetComponentSpace.massWeightScale c := by + have hu : ((((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing)) : JetRing) = + MvPowerSeries.C ((g.2.2 : ℂ)) := rfl + refine JetComponentSpace.basis.ext fun j => ?_ + cases j with + | dψ s α => + have hrep : JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (JetComponentSpace.basis (.dψ s α)) = + ((g.2.2 : ℂ) ^ 6) • JetComponentSpace.basis (.dψ s α) := by + simp only [JetComponentSpace.basis_dψ] + rw [JetComponentSpace.repJetGaugeGroupI_inl, hu, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp [TensorProduct.smul_tmul', Prod.smul_mk] + simp only [LinearMap.coe_comp, Function.comp_apply, hrep, map_smul, + JetComponentSpace.massWeightScale_basis] + exact smul_comm _ _ _ + | dbarψ s α => + have hrep : JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (JetComponentSpace.basis (.dbarψ s α)) = + ((star (g.2.2 : ℂ)) ^ 6) • JetComponentSpace.basis (.dbarψ s α) := by + simp only [JetComponentSpace.basis_dbarψ] + rw [JetComponentSpace.repJetGaugeGroupI_inr, hu, JetRing.star_C, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp [TensorProduct.smul_tmul', Prod.smul_mk] + simp only [LinearMap.coe_comp, Function.comp_apply, hrep, map_smul, + JetComponentSpace.massWeightScale_basis] + exact smul_comm _ _ _ + +/-- The mass-dimension scaling commutes with the Lorentz action on the component + space: the Lorentz action mixes derivative symbols and spinor components only + within a fixed derivative degree, on which the scaling is a scalar. -/ +lemma JetComponentSpace.massWeightScale_repLorentzGroup (c : ℂ) (g : SL(2,ℂ)) : + JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.repLorentzGroup g = + JetComponentSpace.repLorentzGroup g ∘ₗ JetComponentSpace.massWeightScale c := by + have hfact : JetComponentSpace.massWeightScale c = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id)) + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id)) := by + refine JetComponentSpace.basis.ext fun j => ?_ + cases j with + | dψ s α => + have hscal : (c : ℂ) ^ (JetGenerators.dψ s α).massWeight = + c ^ 3 * (c ^ 2) ^ s.card := by + show c ^ (3 + 2 * s.card) = _ + ring + rw [JetComponentSpace.massWeightScale_basis, hscal] + simp only [JetComponentSpace.basis_dψ, LinearMap.prodMap_apply, map_zero, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, LinearMap.smul_apply, + LinearMap.id_apply, DerivAlgebraComplex.gradeScale_basis, + TensorProduct.tmul_smul, TensorProduct.smul_tmul', Prod.smul_mk, smul_smul, + smul_zero] + | dbarψ s α => + have hscal : (c : ℂ) ^ (JetGenerators.dbarψ s α).massWeight = + c ^ 3 * (c ^ 2) ^ s.card := by + show c ^ (3 + 2 * s.card) = _ + ring + rw [JetComponentSpace.massWeightScale_basis, hscal] + simp only [JetComponentSpace.basis_dbarψ, LinearMap.prodMap_apply, map_zero, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, LinearMap.smul_apply, + LinearMap.id_apply, DerivAlgebraComplex.gradeScale_basis, + TensorProduct.tmul_smul, TensorProduct.smul_tmul', Prod.smul_mk, smul_smul, + smul_zero] + have hA : (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap ∘ₗ + DerivAlgebraComplex.repLorentzGroup g = + (DerivAlgebraComplex.repLorentzGroup g : + DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex) ∘ₗ + (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap := + LinearMap.ext fun a => DerivAlgebraComplex.gradeScale_repLorentzGroup (c ^ 2) g a + have hB1 : (c ^ 3 • (LinearMap.id : Module.End ℂ (Module.Dual ℂ LeptonSinglet))) ∘ₗ + LeptonSinglet.repLorentzGroup.dual g = + LeptonSinglet.repLorentzGroup.dual g ∘ₗ (c ^ 3 • LinearMap.id) := by + rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, LinearMap.comp_id] + have hB2 : (c ^ 3 • (LinearMap.id : + Module.End ℂ (Module.Dual ℂ (ConjModule LeptonSinglet)))) ∘ₗ + LeptonSinglet.repLorentzGroup.conj.dual g = + LeptonSinglet.repLorentzGroup.conj.dual g ∘ₗ (c ^ 3 • LinearMap.id) := by + rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, LinearMap.comp_id] + have hcomp1 : TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.dual g) = + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.dual g) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) := by + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB1] + have hcomp2 : TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.conj.dual g) = + TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.conj.dual g) ∘ₗ + TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + (c ^ 3 • LinearMap.id) := by + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB2] + rw [hfact, show JetComponentSpace.repLorentzGroup g = + LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.dual g)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup g) + (LeptonSinglet.repLorentzGroup.conj.dual g)) from rfl] + refine LinearMap.ext fun x => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.prodMap_apply] + exact Prod.ext (DFunLike.congr_fun hcomp1 x.1) (DFunLike.congr_fun hcomp2 x.2) + +/-! + +## D. The total derivative on the summands of the component space + +-/ + +/-- The total derivative preserves the unconjugated half of the component space, + acting there by the shift of dual derivative symbols. -/ +lemma JetComponentSpace.jetDeriv_inl (μ : Fin 1 ⊕ Fin 3) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.jetDeriv μ ((a ⊗ₜ[ℂ] φ, 0) : JetComponentSpace) = + ((DerivAlgebraComplex.deriv μ a) ⊗ₜ[ℂ] φ, 0) := by + have h : (JetComponentSpace.jetDeriv μ) ∘ₗ (LinearMap.inl ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + (LinearMap.inl ℂ _ _) ∘ₗ (TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) := by + refine (DerivAlgebraComplex.basis.tensorProduct LeptonSinglet.basis.dualBasis).ext + fun p => ?_ + obtain ⟨s, α⟩ := p + rw [Module.Basis.tensorProduct_apply'] + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.inl_apply, + TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [show ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] LeptonSinglet.basis.dualBasis α, 0) : + JetComponentSpace) = JetComponentSpace.basis (.dψ s α) from + (JetComponentSpace.basis_dψ s α).symm, + JetComponentSpace.jetDeriv_basis, JetGenerators.shift_dψ, + JetComponentSpace.basis_dψ, DerivAlgebraComplex.deriv_basis_multiset] + have h1 := LinearMap.congr_fun h (a ⊗ₜ[ℂ] φ) + simpa using h1 + +/-- The total derivative on a general element of the unconjugated half of the + component space. -/ +lemma JetComponentSpace.jetDeriv_inl' (μ : Fin 1 ⊕ Fin 3) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) : + JetComponentSpace.jetDeriv μ ((y, 0) : JetComponentSpace) = + ((TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) y, 0) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((a + b, 0) : JetComponentSpace) = (a, 0) + (b, 0) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.jetDeriv_inl, TensorProduct.map_tmul] + rfl + +/-- The total derivative preserves the conjugated half of the component space, + acting there by the shift of dual derivative symbols. -/ +lemma JetComponentSpace.jetDeriv_inr (μ : Fin 1 ⊕ Fin 3) + (a : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.jetDeriv μ ((0, a ⊗ₜ[ℂ] φ) : JetComponentSpace) = + (0, (DerivAlgebraComplex.deriv μ a) ⊗ₜ[ℂ] φ) := by + have h : (JetComponentSpace.jetDeriv μ) ∘ₗ (LinearMap.inr ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) = + (LinearMap.inr ℂ _ _) ∘ₗ (TensorProduct.map (DerivAlgebraComplex.deriv μ) + LinearMap.id) := by + refine (DerivAlgebraComplex.basis.tensorProduct + (LeptonSinglet.basis.conj.dualBasis)).ext fun p => ?_ + obtain ⟨s, α⟩ := p + rw [Module.Basis.tensorProduct_apply'] + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.inr_apply, + TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [show ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + LeptonSinglet.basis.conj.dualBasis α) : JetComponentSpace) = + JetComponentSpace.basis (.dbarψ s α) from + (JetComponentSpace.basis_dbarψ s α).symm, + JetComponentSpace.jetDeriv_basis, JetGenerators.shift_dbarψ, + JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.deriv_basis_multiset] + have h1 := LinearMap.congr_fun h (a ⊗ₜ[ℂ] φ) + simpa using h1 + +/-- The total derivative on a general element of the conjugated half of the + component space. -/ +lemma JetComponentSpace.jetDeriv_inr' (μ : Fin 1 ⊕ Fin 3) + (y : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet)) : + JetComponentSpace.jetDeriv μ ((0, y) : JetComponentSpace) = + (0, (TensorProduct.map (DerivAlgebraComplex.deriv μ) LinearMap.id) y) := by + induction y using TensorProduct.induction_on with + | zero => + rw [show ((0, 0) : JetComponentSpace) = 0 from rfl, map_zero, map_zero] + rfl + | add a b ha hb => + have hpair : ((0, a + b) : JetComponentSpace) = (0, a) + (0, b) := by + simp + rw [hpair, map_add, ha, hb, map_add] + simp + | tmul a φ => + rw [JetComponentSpace.jetDeriv_inr, TensorProduct.map_tmul] + rfl + +end LeptonSinglet + +end StandardModel From e1aaa6ad80f7c0e364314a10d638f1557557ff01 Mon Sep 17 00:00:00 2001 From: Jinzheng Li Date: Fri, 7 Aug 2026 12:27:37 -0400 Subject: [PATCH 113/254] feat: Self-contained photon jet algebra and its evaluation on potentials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds `Physlib/Particles/QED/Photon.lean`, an experiment relating the formal jet-algebra description of QED to the concrete electromagnetism of `Physlib.Electromagnetism`. The jet algebra is built directly on `ElectromagneticPotential` rather than on the B boson: the `B` boson is the gauge boson of `U(1)_Y` before electroweak symmetry breaking, whereas the photon is the mixed combination `A = cos θ_W B + sin θ_W W³`, so identifying them would also drag in the Standard Model charge normalisation `6Y`, which has no meaning for `U(1)_em`. Accordingly the file imports only `Physlib.Electromagnetism`. Contents: * `JetGenerators` / `JetAlgebra` — the formal jet coordinates `∂_s A_μ`, indexed by a multiset of directions, and the real polynomials in them. * `fieldStrength`, `maxwellTerm` — the formal `∂_s F_{μν}` and `F_{μν} F^{μν}`. * `gaugeAction` — the `U(1)_em` gauge action `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`, parametrised by the symmetrised derivatives of the gauge function. Gauge jets compose by addition (`gaugeAction_comp`). * `gaugeAction_fieldStrength` — gauge invariance of the field strength. The two shifts are indexed by `s + {μ} + {ν}` and `s + {ν} + {μ}`, so the proof is exactly the commutativity of multiset addition: Clairaut's theorem is built into the indexing rather than assumed. * `derivMultiset`, `evalPotential` — the iterated derivative along a multiset, in the canonical sorted order, and the evaluation of the jet algebra at a chosen potential, sending `∂_s A_μ` to `∂_s A_μ` with the index lowered. * `evalPotential_maxwellTerm` — the formal Maxwell term evaluates, on any differentiable potential, to `-4 μ₀` times `ElectromagneticPotential.kineticTerm`. * `evalPotential_fieldStrength_gaugeTransform`, `evalPotential_maxwellTerm_gaugeTransform` — the formal gauge invariance matches the library's concrete `A ↦ A + ∂χ`. The file contains no `sorry`. It is not added to `Physlib.lean`, matching the rest of `Physlib/Particles/QED/`. Co-Authored-By: Claude Opus 5 (1M context) --- Physlib/Particles/QED/Photon.lean | 395 ++++++++++++++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 Physlib/Particles/QED/Photon.lean diff --git a/Physlib/Particles/QED/Photon.lean b/Physlib/Particles/QED/Photon.lean new file mode 100644 index 000000000..583422a97 --- /dev/null +++ b/Physlib/Particles/QED/Photon.lean @@ -0,0 +1,395 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Electromagnetism.Kinematics.GaugeTransformation +public import Physlib.Electromagnetism.Dynamics.KineticTerm +/-! +# The jet algebra of the photon + +## i. Overview + +This file builds, from scratch, the jet algebra of the electromagnetic potential +of `Physlib.Electromagnetism`: the free commutative algebra on formal symbols +`∂_s A_μ`, one for every multiset `s` of spacetime directions and every Lorentz +index `μ`, together with the `U(1)_em` gauge action on those symbols and the +evaluation of the algebra on an honest potential. + +It deliberately does *not* use `Physlib.Particles.StandardModel.GaugeBosons.BBoson`. +The `B` boson is the gauge boson of `U(1)_Y`, defined before electroweak symmetry +breaking; the photon is the mixed combination `A = cos θ_W B + sin θ_W W³`, and +the two are not the same field. Building the photon jet algebra directly on +`ElectromagneticPotential` avoids that identification, and also avoids inheriting +the Standard Model charge normalisation `6Y`, which has no meaning for `U(1)_em`. + +The two results the file is built around are: + +* the field strength and the Maxwell term are invariant under the formal gauge + action, and the proof is exactly the commutativity of multiset addition + (`gaugeAction_fieldStrength`); +* evaluated on any differentiable potential `A`, the formal Maxwell term + `F_{μν} F^{μν}` is `-4 μ₀` times `ElectromagneticPotential.kineticTerm` + (`evalPotential_maxwellTerm`). + +Nothing here involves the charged lepton. Note that a faithful QED matter +sector needs a *Dirac* electron, that is two Weyl spinors of the same chirality +with charges `±Q`, which is what makes the dimension-three mass term +`m ψ̄ ψ` available; a single Weyl fermion admits no such term. + +## ii. Key results + +- `JetGenerators`, `JetAlgebra` : the formal jet coordinates `∂_s A_μ` and the + algebra of real polynomials in them. +- `fieldStrength` : the formal field strength `∂_s F_{μν}`. +- `maxwellTerm` : the formal Maxwell term `F_{μν} F^{μν}`. +- `gaugeAction` : the `U(1)_em` gauge action `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. +- `gaugeAction_fieldStrength`, `gaugeAction_maxwellTerm` : gauge invariance. +- `derivMultiset` : the iterated partial derivative `∂_s` along a multiset. +- `evalPotential` : the evaluation of the jet algebra on a potential. +- `evalPotential_maxwellTerm` : the formal Maxwell term is the Maxwell + Lagrangian of `Physlib.Electromagnetism`. +- `evalPotential_fieldStrength_gaugeTransform` : the evaluation is compatible + with the concrete gauge transformation `A ↦ A + ∂χ`. + +## iii. Table of contents + +- A. The jet coordinates of the photon + - A.1. The field strength + - A.2. The Maxwell term +- B. The gauge action + - B.1. Gauge invariance of the field strength and the Maxwell term +- C. Iterated derivatives indexed by a multiset +- D. Evaluation on a potential + - D.1. Evaluation of the field strength + - D.2. The Maxwell term is the Maxwell Lagrangian + - D.3. Compatibility with concrete gauge transformations + +## iv. References + +The concrete side is `Physlib/Electromagnetism/Kinematics/GaugeTransformation.lean` +and `Physlib/Electromagnetism/Dynamics/KineticTerm.lean`. + +-/ + +@[expose] public section + +namespace QED + +open Electromagnetism SpaceTime minkowskiMatrix + +attribute [-simp] Fintype.sum_sum_type + +namespace Photon + +/-! + +## A. The jet coordinates of the photon + +A jet coordinate is a formal symbol `∂_s A_μ`, where `s` is a *multiset* of +spacetime directions: for a smooth potential the partial derivatives commute, so +only the number of times each direction occurs matters. The jet algebra is the +algebra of real polynomials in these symbols. + +-/ + +/-- The jet coordinates of the electromagnetic potential: the symbol `∂_s A_μ`, + the `s`-th derivative of the `μ`-th covariant component. -/ +inductive JetGenerators where + /-- The jet coordinate `∂_s A_μ`. -/ + | dA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetGenerators + deriving DecidableEq + +/-- The jet algebra of the photon: real polynomials in the jet coordinates. -/ +abbrev JetAlgebra : Type := MvPolynomial JetGenerators ℝ + +namespace JetAlgebra + +/-- The jet coordinate `∂_s A_μ` as an element of the jet algebra. -/ +noncomputable def coord (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetAlgebra := + MvPolynomial.X (JetGenerators.dA s μ) + +/-! + +### A.1. The field strength + +-/ + +/-- The formal field strength `∂_s F_{μν} = ∂_s ∂_μ A_ν - ∂_s ∂_ν A_μ`. -/ +noncomputable def fieldStrength (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + JetAlgebra := + coord (s + {μ}) ν - coord (s + {ν}) μ + +lemma fieldStrength_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength s μ ν = -fieldStrength s ν μ := by + simp [fieldStrength] + +@[simp] +lemma fieldStrength_self (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + fieldStrength s μ μ = 0 := by + simp [fieldStrength] + +/-! + +### A.2. The Maxwell term + +-/ + +/-- The formal Maxwell term `F_{μν} F^{μν}`, both indices raised with the + (diagonal) Minkowski metric. -/ +noncomputable def maxwellTerm : JetAlgebra := + ∑ μ, ∑ ν, (η μ μ * η ν ν) • (fieldStrength 0 μ ν * fieldStrength 0 μ ν) + +/-! + +## B. The gauge action + +A `U(1)_em` gauge transformation sends `A_μ ↦ A_μ + ∂_μ χ`, hence on jet +coordinates `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. All that the jet algebra sees of +the gauge function `χ` is the family of its symmetrised derivatives at the base +point, which is what `GaugeJet` records; the shift of `∂_s A_μ` is then the +value of that family at `s + {μ}`. + +-/ + +/-- A gauge jet: the family `s ↦ ∂_s χ` of symmetrised derivatives of a gauge + function at the base point. This is all the jet algebra sees of a gauge + transformation. -/ +abbrev GaugeJet : Type := Multiset (Fin 1 ⊕ Fin 3) → ℝ + +/-- The gauge action on the jet algebra: the algebra map determined by + `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. -/ +noncomputable def gaugeAction (c : GaugeJet) : JetAlgebra →ₐ[ℝ] JetAlgebra := + MvPolynomial.aeval fun j => match j with + | JetGenerators.dA s μ => coord s μ + MvPolynomial.C (c (s + {μ})) + +@[simp] +lemma gaugeAction_coord (c : GaugeJet) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + gaugeAction c (coord s μ) = coord s μ + MvPolynomial.C (c (s + {μ})) := by + rw [coord, gaugeAction, MvPolynomial.aeval_X] + rfl + +@[simp] +lemma gaugeAction_C (c : GaugeJet) (r : ℝ) : + gaugeAction c (MvPolynomial.C r) = MvPolynomial.C r := by + rw [gaugeAction, MvPolynomial.aeval_C, MvPolynomial.algebraMap_eq] + +/-- Gauge jets compose by addition: the gauge transformations form a group + acting on the jet algebra. -/ +lemma gaugeAction_comp (c₁ c₂ : GaugeJet) : + (gaugeAction c₁).comp (gaugeAction c₂) = gaugeAction (c₁ + c₂) := by + refine MvPolynomial.algHom_ext fun j => ?_ + obtain ⟨s, μ⟩ := j + rw [AlgHom.comp_apply] + show gaugeAction c₁ (gaugeAction c₂ (coord s μ)) = gaugeAction (c₁ + c₂) (coord s μ) + rw [gaugeAction_coord, gaugeAction_coord, map_add, gaugeAction_coord, gaugeAction_C, + add_assoc, ← MvPolynomial.C_add] + rfl + +@[simp] +lemma gaugeAction_zero : gaugeAction 0 = AlgHom.id ℝ JetAlgebra := by + refine MvPolynomial.algHom_ext fun j => ?_ + obtain ⟨s, μ⟩ := j + show gaugeAction 0 (coord s μ) = coord s μ + simp + +/-! + +### B.1. Gauge invariance of the field strength and the Maxwell term + +The field strength is gauge invariant, and the reason is exactly that multiset +addition is commutative: the two shifts are `∂_s ∂_μ ∂_ν χ` and +`∂_s ∂_ν ∂_μ χ`, indexed by `s + {μ} + {ν}` and `s + {ν} + {μ}`. Clairaut's +theorem is built into the indexing. + +-/ + +@[simp] +theorem gaugeAction_fieldStrength (c : GaugeJet) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + gaugeAction c (fieldStrength s μ ν) = fieldStrength s μ ν := by + have hcomm : s + {μ} + {ν} = s + {ν} + {μ} := by + rw [add_assoc, add_assoc, add_comm ({μ} : Multiset _)] + rw [fieldStrength, map_sub, gaugeAction_coord, gaugeAction_coord, hcomm] + ring + +@[simp] +theorem gaugeAction_maxwellTerm (c : GaugeJet) : gaugeAction c maxwellTerm = maxwellTerm := by + rw [maxwellTerm, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul, map_mul, gaugeAction_fieldStrength] + +/-! + +## C. Iterated derivatives indexed by a multiset + +To evaluate a jet coordinate on a potential we must differentiate along a +multiset of directions, so we must choose an order; we choose the canonical one, +sorting `s` through `Fin 1 ⊕ Fin 3 ≃ Fin 4`. For a `C^∞` potential the choice +is immaterial, by Clairaut's theorem (`SpaceTime.deriv_commute`). + +-/ + +/-- The iterated partial derivative `∂_s f` along a multiset `s` of spacetime + directions, taken in the canonical order obtained by sorting `s`. -/ +noncomputable def derivMultiset (s : Multiset (Fin 1 ⊕ Fin 3)) (f : SpaceTime 3 → ℝ) : + SpaceTime 3 → ℝ := + ((s.map (finSumFinEquiv (m := 1) (n := 3))).sort).foldr + (fun i g => ∂_ ((finSumFinEquiv (m := 1) (n := 3)).symm i) g) f + +@[simp] +lemma derivMultiset_zero (f : SpaceTime 3 → ℝ) : derivMultiset 0 f = f := by + simp [derivMultiset] + +@[simp] +lemma derivMultiset_singleton (μ : Fin 1 ⊕ Fin 3) (f : SpaceTime 3 → ℝ) : + derivMultiset {μ} f = ∂_ μ f := by + simp [derivMultiset] + +/-! + +## D. Evaluation on a potential + +`ElectromagneticPotential` stores the contravariant components `A^μ`, whereas a +gauge potential carries a lower index, so the jet coordinate `∂_s A_μ` evaluates +to the `s`-th derivative of `A_μ = η_{μμ} A^μ`. + +-/ + +/-- The covariant components `A_μ = η_{μμ} A^μ` of an electromagnetic potential. -/ +noncomputable def coPotential (A : ElectromagneticPotential 3) (μ : Fin 1 ⊕ Fin 3) : + SpaceTime 3 → ℝ := fun x => η μ μ * A x μ + +/-- The evaluation of the photon jet algebra at an electromagnetic potential `A`: + the algebra map sending the formal jet coordinate `∂_s A_μ` to the honest + function `∂_s A_μ` on spacetime. -/ +noncomputable def evalPotential (A : ElectromagneticPotential 3) : + JetAlgebra →ₐ[ℝ] (SpaceTime 3 → ℝ) := + MvPolynomial.aeval fun j => match j with + | JetGenerators.dA s μ => derivMultiset s (coPotential A μ) + +@[simp] +lemma evalPotential_coord (A : ElectromagneticPotential 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + evalPotential A (coord s μ) = derivMultiset s (coPotential A μ) := by + rw [coord, evalPotential, MvPolynomial.aeval_X] + +/-! + +### D.1. Evaluation of the field strength + +-/ + +/-- The derivative of a covariant component. Differentiability is needed to move + the constant `η_{νν}` through the derivative. -/ +lemma deriv_coPotential (A : ElectromagneticPotential 3) (hA : Differentiable ℝ A) + (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + ∂_ μ (coPotential A ν) x = η ν ν * ∂_ μ A x ν := by + have hd : Differentiable ℝ (fun y => A y ν) := (SpaceTime.differentiable_vector _).mpr hA ν + rw [SpaceTime.deriv_apply_eq μ ν _ hA x] + show fderiv ℝ (fun y => η ν ν * A y ν) x (Lorentz.Vector.basis μ) = _ + rw [fderiv_const_mul (hd x)] + simp + +lemma evalPotential_fieldStrength_zero_apply (A : ElectromagneticPotential 3) + (hA : Differentiable ℝ A) (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + evalPotential A (fieldStrength 0 μ ν) x = η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ := by + rw [fieldStrength, map_sub] + simp only [zero_add, evalPotential_coord, derivMultiset_singleton, Pi.sub_apply] + rw [deriv_coPotential A hA μ ν x, deriv_coPotential A hA ν μ x] + +/-- The formal field strength evaluates to the field strength of the potential + with both indices lowered, `F_{μν} = η_{μμ} η_{νν} F^{μν}`. -/ +lemma evalPotential_fieldStrength_zero (A : ElectromagneticPotential 3) + (hA : Differentiable ℝ A) (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + evalPotential A (fieldStrength 0 μ ν) x = + η μ μ * η ν ν * A.fieldStrengthMatrix x (μ, ν) := by + rw [evalPotential_fieldStrength_zero_apply A hA μ ν x, + ElectromagneticPotential.toFieldStrength_basis_repr_apply_eq_single (μν := (μ, ν))] + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag μ) with h1 | h1 <;> + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with h2 | h2 <;> + rw [h1, h2] <;> ring + +/-! + +### D.2. The Maxwell term is the Maxwell Lagrangian + +-/ + +/-- **The formal Maxwell term is the Maxwell Lagrangian.** Evaluated on any + differentiable electromagnetic potential, the gauge-invariant jet polynomial + `F_{μν} F^{μν}` is `-4 μ₀` times the kinetic term + `- 1/(4 μ₀) F_{μν} F^{μν}` of `Physlib.Electromagnetism`. -/ +theorem evalPotential_maxwellTerm (𝓕 : FreeSpace) (A : ElectromagneticPotential 3) + (hA : Differentiable ℝ A) (x : SpaceTime 3) : + evalPotential A maxwellTerm x = -(4 * 𝓕.μ₀) * A.kineticTerm 𝓕 x := by + rw [ElectromagneticPotential.kineticTerm_eq_sum_potential, maxwellTerm, map_sum] + simp only [Finset.sum_apply, map_sum, map_smul, Pi.smul_apply, smul_eq_mul, map_mul, + Pi.mul_apply] + simp only [evalPotential_fieldStrength_zero_apply A hA] + /- Both sides are now explicit double sums in `∂_ μ A x ν`. -/ + have key : ∀ μ ν : Fin 1 ⊕ Fin 3, + η μ μ * η ν ν * ((η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ) * + (η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ)) = + (η μ μ * η ν ν * (∂_ μ A x ν) ^ 2 - ∂_ μ A x ν * ∂_ ν A x μ) + + (η ν ν * η μ μ * (∂_ ν A x μ) ^ 2 - ∂_ ν A x μ * ∂_ μ A x ν) := by + intro μ ν + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag μ) with h1 | h1 <;> + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with h2 | h2 <;> + rw [h1, h2] <;> ring + rw [Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun ν _ => key μ ν] + simp only [Finset.sum_add_distrib] + rw [Finset.sum_comm (s := Finset.univ) (t := Finset.univ) + (f := fun μ ν : Fin 1 ⊕ Fin 3 => + η ν ν * η μ μ * (∂_ ν A x μ) ^ 2 - ∂_ ν A x μ * ∂_ μ A x ν)] + have hμ₀ : 𝓕.μ₀ ≠ 0 := ne_of_gt 𝓕.μ₀_pos + field_simp + ring + +/-! + +### D.3. Compatibility with concrete gauge transformations + +The formal gauge invariance of section B.1 is matched on the concrete side: the +evaluation of the field strength, and hence of the Maxwell term, is unchanged +when the potential is replaced by `A + ∂χ`. + +-/ + +lemma differentiable_gaugeTransform {A : ElectromagneticPotential 3} {χ : SpaceTime 3 → ℝ} + (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) : + Differentiable ℝ (ElectromagneticPotential.gaugeTransform χ A) := + hA.add (ElectromagneticPotential.differentiable_ofGradient hχ) + +/-- The evaluated field strength is invariant under the concrete gauge + transformation `A ↦ A + ∂χ`, matching `gaugeAction_fieldStrength`. -/ +theorem evalPotential_fieldStrength_gaugeTransform (A : ElectromagneticPotential 3) + (χ : SpaceTime 3 → ℝ) (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) + (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + evalPotential (ElectromagneticPotential.gaugeTransform χ A) (fieldStrength 0 μ ν) x = + evalPotential A (fieldStrength 0 μ ν) x := by + rw [evalPotential_fieldStrength_zero _ (differentiable_gaugeTransform hA hχ), + evalPotential_fieldStrength_zero A hA, + ElectromagneticPotential.fieldStrengthMatrix_gaugeTransform A χ hA hχ] + +/-- The Maxwell Lagrangian is gauge invariant, as read off from the jet algebra. -/ +theorem evalPotential_maxwellTerm_gaugeTransform (A : ElectromagneticPotential 3) + (χ : SpaceTime 3 → ℝ) (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) + (x : SpaceTime 3) : + evalPotential (ElectromagneticPotential.gaugeTransform χ A) maxwellTerm x = + evalPotential A maxwellTerm x := by + rw [maxwellTerm, map_sum, map_sum] + simp only [Finset.sum_apply, map_sum, map_smul, Pi.smul_apply, smul_eq_mul, map_mul, + Pi.mul_apply] + refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun ν _ => ?_ + rw [evalPotential_fieldStrength_gaugeTransform A χ hA hχ] + +end JetAlgebra + +end Photon + +end QED From e3b7c1676c635b2595caee9dd7cb236b6e159c5f Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 08:04:57 +0100 Subject: [PATCH 114/254] feat: modify LeptonGaugeSector --- .../LeptonGaugeSector/JetAlgebra/Basic.lean | 114 + .../JetAlgebra/CovariantAlgebra.lean | 282 ++ .../JetAlgebra/CovariantDeriv.lean | 184 ++ .../JetAlgebra/DerivativeOrder.lean | 723 ++++++ .../JetAlgebra/FieldStrength.lean | 80 + .../JetAlgebra/GaugeAction.lean | 722 ++++++ .../JetAlgebra/Invariants.lean | 115 +- .../Invariants/Averages/BoostAverage.lean | 704 +++++ .../Averages/BoostAvgProjector.lean | 87 + ...AvgProjectorOnDerivativesAndFermions.lean} | 54 +- .../BoostAvgProjectorOnMonomials.lean | 311 +++ .../BoostAvgProjectorOnPhotonPairs.lean} | 33 +- .../Invariants/Averages/RotationAverage.lean | 1233 +++++++++ .../Averages/RotationPiBoostAverage.lean | 164 ++ .../JetAlgebra/Invariants/Basic.lean | 65 + .../Grading/MassWeightAndHypercharge.lean} | 94 +- .../Invariants/Grading/NeutralSectors.lean | 357 +++ .../JetAlgebra/Invariants/GroupAverage.lean | 170 ++ .../SpanOfRenormalizableTerms.lean} | 1226 ++++----- .../Invariants/Subgroups/AxisBoosts.lean | 382 +++ .../Subgroups/BoostsOnFermionTerms.lean} | 56 +- .../Subgroups/BoostsOnFieldStrength.lean} | 56 +- .../BoostsOnFieldStrengthDerivatives.lean} | 80 +- .../Subgroups/BoostsOnPhotonTerms.lean} | 398 +-- .../Invariants/Subgroups/RotationsPi.lean | 459 ++++ .../JetAlgebra/IsInvariant.lean | 139 + .../JetAlgebra/JetDeriv.lean | 276 ++ .../JetAlgebra/LorentzAction.lean} | 169 +- .../JetAlgebra/MassDim.lean | 78 +- .../JetAlgebra/Terms/KineticTerms.lean | 356 +++ .../JetAlgebra/Terms/MaxwellTerm.lean | 211 ++ .../JetAlgebra/Terms/ThetaTerm.lean | 352 +++ .../{QED => LeptonGaugeSector}/Photon.lean | 4 +- Physlib/Particles/QED/JetAlgebra/Basic.lean | 2288 ----------------- .../QED/JetAlgebra/Invariants/Basic.lean | 765 ------ .../JetAlgebra/Invariants/KleinAverage.lean | 1440 ----------- .../JetAlgebra/Invariants/MonomialForm.lean | 494 ---- .../Invariants/ProjectorValues.lean | 312 --- .../QED/JetAlgebra/Invariants/Sectors.lean | 894 ------- .../Invariants/SymmetrisedAverage.lean | 733 ------ .../GaugeBosons/BBoson/Basic.lean | 8 +- 41 files changed, 8681 insertions(+), 7987 deletions(-) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean rename Physlib/Particles/{QED => LeptonGaugeSector}/JetAlgebra/Invariants.lean (55%) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean rename Physlib/Particles/{QED/JetAlgebra/Invariants/ProjectorsDerivative.lean => LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean} (96%) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean rename Physlib/Particles/{QED/JetAlgebra/Invariants/Projectors.lean => LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean} (95%) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean rename Physlib/Particles/{QED/JetAlgebra/Invariants/Decomposition.lean => LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean} (90%) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean rename Physlib/Particles/{QED/JetAlgebra/Invariants/Membership.lean => LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean} (54%) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean rename Physlib/Particles/{QED/JetAlgebra/Invariants/BoostFermionPairs.lean => LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean} (97%) rename Physlib/Particles/{QED/JetAlgebra/Invariants/BoostTransforms.lean => LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean} (95%) rename Physlib/Particles/{QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean => LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean} (96%) rename Physlib/Particles/{QED/JetAlgebra/Invariants/BoostPairs.lean => LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean} (83%) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean rename Physlib/Particles/{QED/JetAlgebra/LorentzGroup.lean => LeptonGaugeSector/JetAlgebra/LorentzAction.lean} (64%) rename Physlib/Particles/{QED => LeptonGaugeSector}/JetAlgebra/MassDim.lean (75%) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean rename Physlib/Particles/{QED => LeptonGaugeSector}/Photon.lean (99%) delete mode 100644 Physlib/Particles/QED/JetAlgebra/Basic.lean delete mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean delete mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean delete mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean delete mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean delete mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean delete mode 100644 Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean new file mode 100644 index 000000000..b5b206592 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.LinearAlgebra.DirectSum.Finsupp +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.MassDim +/-! +# Jet algebra for quantum electrodynamics + +## i. Overview + +The jet algebra of quantum electrodynamics: the algebra generated by the component +functions of the photon-like `U(1)` gauge boson (the B boson) and the charged +lepton, together with all their derivative coordinates. It is the tensor product of +the complexified B-boson jet algebra (a symmetric algebra, complexified so it can +be paired with the complex fermionic factor) and the charged-lepton jet algebra +(an exterior algebra). + +The jet gauge group acts on each factor — by Maurer–Cartan substitutions on the +B-boson component functions, and linearly through the hypercharge character and its +derivatives on the lepton component functions — and hence on the full lepton–gauge-sector jet +algebra by the tensor product of the two actions. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +inductive JetGenerators where + | dB (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetGenerators + | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators + | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators + +abbrev JetAlgebra := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (LeptonSinglet.JetAlgebra) + +namespace JetAlgebra + +/-- The B-boson factor included into the lepton–gauge-sector jet algebra. -/ +noncomputable abbrev inclB : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.includeLeft + +/-- The charged-lepton factor included into the lepton–gauge-sector jet algebra. -/ +noncomputable abbrev inclL : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.includeRight + +/-- Polynomials pushed forward from the two tensor factors commute: the factors + commute in the tensor product, and the polynomial variable is central. -/ +lemma commute_mapAlgHom_inclB_inclL (p : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) + (q : Polynomial LeptonSinglet.JetAlgebra) : + Commute (Polynomial.mapAlgHom inclB p) (Polynomial.mapAlgHom inclL q) := by + induction p using Polynomial.induction_on' with + | add p₁ p₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_left h₂ + | monomial m a => + induction q using Polynomial.induction_on' with + | add q₁ q₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_right h₂ + | monomial n b => + show Polynomial.mapAlgHom inclB (Polynomial.monomial m a) * + Polynomial.mapAlgHom inclL (Polynomial.monomial n b) = _ + simp only [Polynomial.mapAlgHom, AlgHom.coe_mk, Polynomial.coe_mapRingHom, + Polynomial.map_monomial, Polynomial.monomial_mul_monomial] + rw [Nat.add_comm m n] + congr 1 + show (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) + = ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) * (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + one_mul, mul_one, one_mul, mul_one] + +/-! + +## A. Elements associated with the generators + +-/ + +noncomputable def ofGenerator (s : JetGenerators) : JetAlgebra := + match s with + | JetGenerators.dB s μ => + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 + | JetGenerators.dψ s α => + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) + | JetGenerators.dbarψ s α => + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) + +scoped notation "[" s "]ₐ" => ofGenerator s + +lemma ofGenerator_dψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + ofGenerator (JetGenerators.dψ s α) = + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dψ s α) := rfl + +lemma ofGenerator_B_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + ofGenerator (JetGenerators.dB s μ) = + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 := rfl + +lemma ofGenerator_dbarψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + ofGenerator (JetGenerators.dbarψ s α) = + (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (LeptonSinglet.JetGenerators.dbarψ s α) := rfl +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean new file mode 100644 index 000000000..bcb14fcbb --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.CovariantDeriv +/-! +# The linear-matter submodule of the lepton–gauge-sector jet algebra + +The submodule spanned by a single matter component function times a B-boson +polynomial, its closure under the total derivative and the covariant steps, and +the oddness of its elements in the fermionic case. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +### The linear-matter submodule + +-/ + +/-- The linear-matter submodule: the elements of the jet algebra in which the + matter coordinates appear exactly linearly, spanned by the products of a + gauge-sector element with a single matter component function. + + The construction does not depend on the matter content. A jet algebra of this + shape is `G ⊗[ℂ] ExteriorAlgebra ℂ M`, with `G` the gauge-sector algebra and + `M` the space of matter component functions; the fermionic degree is the + exterior grading of the second factor, and degree one is the image of + `ExteriorAlgebra.ι`. For several matter species `M` is their direct sum and the + same definition applies verbatim. + + This is the submodule the covariance argument for the covariant derivatives + lives on. It is closed under the gauge group + (`repJetGaugeGroupI_mem_LinearMatterSubmodule`), under the total derivative + and under the covariant steps, and it is where the Maurer–Cartan anomaly + operators close: in higher fermionic degree they do not, because the gauge + action on the exterior algebra is an algebra map and so multiplies the + hypercharge characters. -/ +noncomputable def LinearMatterSubmodule : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x : JetAlgebra | ∃ (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace), x = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m} + +/-- The spanning elements: a gauge-sector coefficient times a single matter + component function. -/ +lemma tmul_ι_mem_LinearMatterSubmodule (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace) : + p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m ∈ LinearMatterSubmodule := + Submodule.subset_span ⟨p, m, rfl⟩ + +/-! + +The remaining results in this section are specific to *fermionic* matter: they +express that the linear-matter elements are odd. Nothing above depends on them, +and nothing that follows — the closure of the submodule under the derivative, +the covariant steps, or the gauge group — does either. For bosonic matter the +matter factor is a symmetric rather than an exterior algebra, the same +definition of `LinearMatterSubmodule` applies with the corresponding canonical +inclusion, and only this anticommutation block is dropped. + +-/ + +/-- Right distributivity on the jet algebra, with the multiplication forced to + the `JetAlgebra` instance. Stating it explicitly keeps `rw` from having to + match through the tensor-product instance path. -/ +lemma distrib_add_mul (a b c : JetAlgebra) : (a + b) * c = a * c + b * c := by grind + +/-- Left distributivity on the jet algebra; see `distrib_add_mul`. -/ +lemma distrib_mul_add (a b c : JetAlgebra) : a * (b + c) = a * b + a * c := by grind + +set_option maxHeartbeats 1000000 in +/-- Linear-matter elements anticommute against the spanning elements. -/ +lemma tmul_ι_mul_add_swap_of_mem (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace) {y : JetAlgebra} + (hy : y ∈ LinearMatterSubmodule) : + (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * y + y * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = 0 := by + have hd₁ := distrib_add_mul + have hd₂ := distrib_mul_add + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := + fun c a b => smul_mul_assoc c a b + have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := + fun c a b => mul_smul_comm c a b + induction hy using Submodule.span_induction with + | mem z hz => + obtain ⟨q, n, rfl⟩ := hz + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + mul_comm q p, ← TensorProduct.tmul_add, ExteriorAlgebra.ι_add_mul_swap, + TensorProduct.tmul_zero] + | zero => rw [hz₂, hz₁, add_zero] + | add u v _ _ hu hv => + rw [hd₂, hd₁] + calc (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + + (u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) = + ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) + + ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) := by + abel + _ = 0 := by rw [hu, hv, add_zero] + | smul c u _ hu => + rw [hs₂, hs₁, ← smul_add, hu, smul_zero] + +/-- Linear-matter elements anticommute: they are odd. -/ +lemma mul_add_swap_of_mem {x y : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) + (hy : y ∈ LinearMatterSubmodule) : x * y + y * x = 0 := by + have hd₁ := distrib_add_mul + have hd₂ := distrib_mul_add + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := + fun c a b => smul_mul_assoc c a b + have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := + fun c a b => mul_smul_comm c a b + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + exact tmul_ι_mul_add_swap_of_mem p m hy + | zero => rw [hz₁, hz₂, add_zero] + | add u v _ _ hu hv => + rw [hd₁, hd₂] + calc u * y + v * y + (y * u + y * v) = + (u * y + y * u) + (v * y + y * v) := by abel + _ = 0 := by rw [hu, hv, add_zero] + | smul c u _ hu => + rw [hs₁, hs₂, ← smul_add, hu, smul_zero] + +/-- Linear-matter elements square to zero. -/ +lemma mul_self_of_mem {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : + x * x = 0 := by + have h2 : (2 : ℂ) • (x * x) = 0 := by + rw [two_smul] + exact mul_add_swap_of_mem hx hx + exact (smul_eq_zero.mp h2).resolve_left (by norm_num) + +/-- The linear-matter submodule is preserved by the total derivative. -/ +lemma jetDeriv_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} + (hx : x ∈ LinearMatterSubmodule) : jetDeriv μ x ∈ LinearMatterSubmodule := by + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] + exact Submodule.add_mem _ (tmul_ι_mem_LinearMatterSubmodule _ _) + (tmul_ι_mem_LinearMatterSubmodule _ _) + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- The linear-matter submodule is preserved by multiplication by a gauge-field + generator, which lives in the bosonic factor. -/ +lemma dB_mul_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} + (hx : x ∈ LinearMatterSubmodule) : + [JetGenerators.dB {} μ]ₐ * x ∈ LinearMatterSubmodule := by + have hd₂ := distrib_mul_add + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := + fun c a b => mul_smul_comm c a b + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + exact tmul_ι_mem_LinearMatterSubmodule _ _ + | zero => rw [hz₂]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [hd₂]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [hs₂]; exact Submodule.smul_mem _ _ hu + +/-- The covariant derivatives of the lepton are linear in the matter fields. -/ +lemma Dψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α ∈ LinearMatterSubmodule := by + induction l with + | nil => + rw [show Dψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dψ {} α)) from rfl] + exact tmul_ι_mem_LinearMatterSubmodule _ _ + | cons ν l ih => + simp only [Dψ_cons, covariantStep_apply] + exact Submodule.sub_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) + (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) + +/-- The covariant derivatives of the conjugate lepton are linear in the matter + fields. -/ +lemma Dbarψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α ∈ LinearMatterSubmodule := by + induction l with + | nil => + rw [show Dbarψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl] + exact tmul_ι_mem_LinearMatterSubmodule _ _ + | cons ν l ih => + simp only [Dbarψ_cons, covariantStepBar_apply] + exact Submodule.add_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) + (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) + +/-- The covariant lepton derivatives anticommute with the conjugate covariant + derivatives: both are odd elements of the linear-matter submodule. -/ +lemma Dψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dψ l α * Dbarψ l' β = -(Dbarψ l' β * Dψ l α) := + eq_neg_of_add_eq_zero_left + (mul_add_swap_of_mem (Dψ_mem_LinearMatterSubmodule l α) + (Dbarψ_mem_LinearMatterSubmodule l' β)) + +lemma covGenerator_mem_LinearMatterSubmodule (g : LeptonSinglet.JetGenerators) : + covGenerator g ∈ LinearMatterSubmodule := by + cases g with + | dψ s α => exact Dψ_mem_LinearMatterSubmodule (sortList s) α + | dbarψ s α => exact Dbarψ_mem_LinearMatterSubmodule (sortList s) α + +lemma covMap_mem_LinearMatterSubmodule (m : LeptonSinglet.JetComponentSpace) : + covMap m ∈ LinearMatterSubmodule := by + rw [covMap, Module.Basis.constr_apply] + exact Submodule.sum_mem _ fun g _ => + Submodule.smul_mem _ _ (covGenerator_mem_LinearMatterSubmodule g) + +lemma covMap_mul_self (m : LeptonSinglet.JetComponentSpace) : + covMap m * covMap m = 0 := + mul_self_of_mem (covMap_mem_LinearMatterSubmodule m) + +/-- The covariant substitution on the fermionic factor. -/ +noncomputable def covExtHom : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := + ExteriorAlgebra.lift ℂ ⟨covMap, covMap_mul_self⟩ + +@[simp] +lemma covExtHom_ι (m : LeptonSinglet.JetComponentSpace) : + covExtHom (ExteriorAlgebra.ι ℂ m) = covMap m := by + rw [covExtHom, ExteriorAlgebra.lift_ι_apply] + +/-- Elements of the B-boson factor are central in the lepton–gauge-sector jet algebra. -/ +lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : + (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * y = + y * (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) := by + have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind + have hd₂ := distrib_mul_add + have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + induction y using TensorProduct.induction_on with + | zero => rw [hz₂, hz₁] + | add a b ha hb => simp only [hd₁, hd₂, ha, hb] + | tmul q l => + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + mul_comm, one_mul, mul_one] + +/-- The covariant substitution: the algebra endomorphism of the lepton–gauge-sector jet algebra + fixing the B-boson factor and sending each plain fermionic generator to its + covariant version. -/ +noncomputable def covSubst : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft covExtHom + (fun p y => (tmul_one_mul_comm p (covExtHom y))) + +lemma covSubst_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : + covSubst (p ⊗ₜ[ℂ] l) = (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := by + rw [covSubst, Algebra.TensorProduct.lift_tmul] + rfl + +@[simp] +lemma covSubst_tmul_one (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + covSubst (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = p ⊗ₜ[ℂ] 1 := by + have h1 : covExtHom (1 : LeptonSinglet.JetAlgebra) = 1 := covExtHom.map_one + have hmul : ∀ a : JetAlgebra, a * 1 = a := fun a => mul_one a + rw [covSubst_tmul, h1, hmul] + +@[simp] +lemma covSubst_one_tmul_ι (m : LeptonSinglet.JetComponentSpace) : + covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = + covMap m := by + have hone : ∀ a : JetAlgebra, 1 * a = a := fun a => one_mul a + rw [covSubst_tmul, covExtHom_ι, ← Algebra.TensorProduct.one_def, hone] +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean new file mode 100644 index 000000000..63402a286 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.JetDeriv +/-! +# The covariant derivatives of the charged lepton + +The covariant derivative `D_l ψ_α` of the charged lepton and its conjugate +`D̄_l ψ̄_α`, built by iterating the covariant step `∂_μ + 6 i B_μ`, and the +covariant substitution that trades the plain fermionic coordinates for them. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## Covariant derivatives + +The covariant derivative `D_l ψ_α` of the charged lepton, indexed by an ordered +list `l` of spacetime directions: covariant derivatives do not commute — their +commutator is the field strength — so the index is a list rather than a +multiset, with the head of the list the outermost derivative. + +The component functions of the lepton transform contragrediently, through the +hypercharge power series `u ^ 6`, so the covariant step on component functions +is `D_μ = ∂_μ - 6 i B_μ`: under a jet gauge transformation `∂_μ ψ_α` shifts by +`- 6 i mc_μ ψ_α` while `B_μ`, being a component function too, shifts +contragrediently by `- mc_μ` (`BBoson.mcShift`), and the two contributions +cancel for the coupling `- 6 i` — and only for that coupling. The step is +defined on the whole jet algebra; applied repeatedly to the zeroth-order +component function of `ψ` it produces the covariant derivatives. + +-/ + +/-- One covariant-derivative step `D_μ = ∂_μ - 6 i B_μ` on the lepton–gauge-sector + jet algebra: + the total spacetime derivative together with multiplication by the gauge field + weighted by the hypercharge coupling. The sign is fixed by covariance: the + component function `ψ_α` carries hypercharge `+6`, so `∂_μ ψ_α` picks up + `- 6 i mc_μ ψ_α`, while `B_μ` shifts contragrediently by `- mc_μ` + (`BBoson.mcShift`); the two cancel only for the coupling `- 6 i`. -/ +noncomputable def covariantStep (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ + +@[simp] +lemma covariantStep_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + covariantStep μ x = + jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by + rw [covariantStep, LinearMap.sub_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply] + +/-- The covariant derivative `D_l ψ_α` of the charged lepton along the ordered + list of directions `l`, with the head of the list the outermost derivative. -/ +noncomputable def Dψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + JetAlgebra := + l.foldr (fun μ x => covariantStep μ x) [JetGenerators.dψ {} α]ₐ + +/-- The zeroth covariant derivative is the lepton component function itself. -/ +@[simp] +lemma Dψ_nil (α : Fin 2) : + Dψ [] α = [JetGenerators.dψ {} α]ₐ := rfl + +@[simp] +lemma Dψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) + (α : Fin 2) : + Dψ (μ :: l) α = covariantStep μ (Dψ l α) := + rfl + +/-- The first covariant derivative: `D_μ ψ_α = ∂_μ ψ_α - 6 i B_μ ψ_α`. -/ +lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + Dψ [μ] α = [JetGenerators.dψ {μ} α]ₐ - + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dψ {} α]ₐ) := by + rw [Dψ_cons, Dψ_nil, covariantStep_apply] + congr 1 + simp only [ofGenerator] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] + +/-- One covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` for the conjugate + lepton on the lepton–gauge-sector jet algebra: the conjugate component + function `ψ̄_α` carries + hypercharge `-6`, so its coupling is the opposite of that in + `covariantStep`. -/ +noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ + +@[simp] +lemma covariantStepBar_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + covariantStepBar μ x = + jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by + rw [covariantStepBar, LinearMap.add_apply, LinearMap.smul_apply, + LinearMap.mulLeft_apply] + +/-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the + ordered list of directions `l`, with the head of the list the outermost + derivative. -/ +noncomputable def Dbarψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := + l.foldr (fun μ x => covariantStepBar μ x) [JetGenerators.dbarψ {} α]ₐ + +/-- The zeroth covariant derivative is the conjugate-lepton component function + itself. -/ +@[simp] +lemma Dbarψ_nil (α : Fin 2) : + Dbarψ [] α = [JetGenerators.dbarψ {} α]ₐ := rfl + +@[simp] +lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ (μ :: l) α = covariantStepBar μ (Dbarψ l α) := rfl + +/-- The first conjugate covariant derivative: + `D̄_μ ψ̄_α = ∂_μ ψ̄_α + 6 i B_μ ψ̄_α`. -/ +lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ + ((6 : ℂ) * Complex.I) • + ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by + rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar_apply] + congr 1 + simp only [ofGenerator] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, zero_add, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] + +/-! + +### The covariant substitution + +The change of variables from the plain fermionic coordinates `∂_s ψ_α`, +`∂_s ψ̄_α` to the covariant coordinates `D_s ψ_α`, `D̄_s ψ̄_α`, as an algebra +endomorphism of the lepton–gauge-sector jet algebra fixing the B-boson factor. + +-/ + +/-- A canonical list presentation of a multiset of spacetime indices. -/ +noncomputable def sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : List (Fin 1 ⊕ Fin 3) := + ((s.map finSumFinEquiv).sort (· ≤ ·)).map finSumFinEquiv.symm + +@[simp] +lemma coe_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : + (↑(sortList s) : Multiset (Fin 1 ⊕ Fin 3)) = s := by + rw [sortList, ← Multiset.map_coe, Multiset.sort_eq, Multiset.map_map] + simp + +@[simp] +lemma length_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : + (sortList s).length = Multiset.card s := by + rw [sortList, List.length_map, Multiset.length_sort, Multiset.card_map] + +/-- The derivative degree of a lepton jet generator. -/ +def genDeg : LeptonSinglet.JetGenerators → ℕ + | .dψ s _ => Multiset.card s + | .dbarψ s _ => Multiset.card s + +/-- The covariant element associated with a lepton jet generator: the covariant + derivative along a canonical ordering of the multiset of derivative indices. -/ +noncomputable def covGenerator : LeptonSinglet.JetGenerators → JetAlgebra + | .dψ s α => Dψ (sortList s) α + | .dbarψ s α => Dbarψ (sortList s) α + +/-- The linear map sending each fermionic component function to its covariant + version. -/ +noncomputable def covMap : LeptonSinglet.JetComponentSpace →ₗ[ℂ] JetAlgebra := + LeptonSinglet.JetComponentSpace.basis.constr ℂ covGenerator + +@[simp] +lemma covMap_basis (g : LeptonSinglet.JetGenerators) : + covMap (LeptonSinglet.JetComponentSpace.basis g) = covGenerator g := by + rw [covMap, Module.Basis.constr_basis] +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean new file mode 100644 index 000000000..ccf6ce644 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean @@ -0,0 +1,723 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant +/-! +# The derivative-order filtration + +The filtration of the lepton–gauge-sector jet algebra by the number of derivatives, the leading +behaviour of the covariant generators with respect to it, and the theorem that a +gauge-invariant element lies in the algebra generated by the invariant +generators, which the filtration is built to prove. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +### The derivative-degree filtration + +The filtration of the lepton–gauge-sector jet algebra by the total derivative degree of the +fermionic factors: the span of B-coefficiented products of fermionic generators +of bounded total degree. The covariant substitution is unitriangular for this +filtration. + +-/ + +/-- The generating set of the degree filtration. -/ +def filtGen (d : ℕ) : Set JetAlgebra := + {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), + (l.map genDeg).sum ≤ d ∧ + z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} + +/-- The generating set of the strict degree filtration. -/ +def sfiltGen (d : ℕ) : Set JetAlgebra := + {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), + (l.map genDeg).sum < d ∧ + z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} + +/-- The filtration of the lepton–gauge-sector jet algebra by total fermionic derivative degree. -/ +noncomputable def filt (d : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ (filtGen d) + +/-- The strict filtration. -/ +noncomputable def sfilt (d : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ (sfiltGen d) + +lemma filt_mono {d d' : ℕ} (h : d ≤ d') : filt d ≤ filt d' := + Submodule.span_mono fun z hz => by + obtain ⟨c, l, hl, hze⟩ := hz + exact ⟨c, l, hl.trans h, hze⟩ + +lemma sfilt_mono {d d' : ℕ} (h : d ≤ d') : sfilt d ≤ sfilt d' := + Submodule.span_mono fun z hz => by + obtain ⟨c, l, hl, hze⟩ := hz + exact ⟨c, l, hl.trans_le h, hze⟩ + +lemma sfilt_le_filt (d : ℕ) : sfilt d ≤ filt d := + Submodule.span_mono fun z hz => by + obtain ⟨c, l, hl, hze⟩ := hz + exact ⟨c, l, hl.le, hze⟩ + +lemma sfilt_zero : sfilt 0 = ⊥ := by + rw [sfilt, show sfiltGen 0 = ∅ from Set.eq_empty_iff_forall_notMem.mpr (by + rintro z ⟨c, l, hl, hze⟩ + omega), Submodule.span_empty] + +lemma sfilt_succ (d : ℕ) : sfilt (d + 1) = filt d := by + rw [sfilt, filt, show sfiltGen (d + 1) = filtGen d from Set.ext fun z => + ⟨fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mp hl, hze⟩, + fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mpr hl, hze⟩⟩] + +lemma mul_mem_filt {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) + (hy : y ∈ filt b) : x * y ∈ filt (a + b) := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u + have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u + have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := + fun r u v => smul_mul_assoc r u v + have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := + fun r u v => mul_smul_comm r u v + induction hx using Submodule.span_induction with + | mem x' hx' => + induction hy using Submodule.span_induction with + | mem y' hy' => + obtain ⟨c, l, hl, rfl⟩ := hx' + obtain ⟨c', l', hl', rfl⟩ := hy' + refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ + · rw [List.map_append, List.sum_append] + omega + · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + | zero => rw [hz₂]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih + | zero => rw [hz₁]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih + +lemma mul_mem_sfilt_left {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ sfilt a) + (hy : y ∈ filt b) : x * y ∈ sfilt (a + b) := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u + have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u + have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := + fun r u v => smul_mul_assoc r u v + have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := + fun r u v => mul_smul_comm r u v + induction hx using Submodule.span_induction with + | mem x' hx' => + induction hy using Submodule.span_induction with + | mem y' hy' => + obtain ⟨c, l, hl, rfl⟩ := hx' + obtain ⟨c', l', hl', rfl⟩ := hy' + refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ + · rw [List.map_append, List.sum_append] + omega + · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + | zero => rw [hz₂]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih + | zero => rw [hz₁]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih + +lemma mul_mem_sfilt_right {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) + (hy : y ∈ sfilt b) : x * y ∈ sfilt (a + b) := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind + have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u + have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u + have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := + fun r u v => smul_mul_assoc r u v + have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := + fun r u v => mul_smul_comm r u v + induction hx using Submodule.span_induction with + | mem x' hx' => + induction hy using Submodule.span_induction with + | mem y' hy' => + obtain ⟨c, l, hl, rfl⟩ := hx' + obtain ⟨c', l', hl', rfl⟩ := hy' + refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ + · rw [List.map_append, List.sum_append] + omega + · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + | zero => rw [hz₂]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih + | zero => rw [hz₁]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv + | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih + +lemma exists_forall_tmul_mem_filt (l : LeptonSinglet.JetAlgebra) : + ∃ d, ∀ c : ℂ ⊗[ℝ] BBoson.JetAlgebra, c ⊗ₜ[ℂ] l ∈ filt d := by + induction l using ExteriorAlgebra.induction with + | algebraMap r => + refine ⟨0, fun c => ?_⟩ + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] + refine Submodule.smul_mem _ _ (Submodule.subset_span ⟨c, [], by simp, ?_⟩) + simp + | ι m => + refine ⟨(LeptonSinglet.JetComponentSpace.basis.repr m).support.sup genDeg, + fun c => ?_⟩ + have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = + (LeptonSinglet.JetComponentSpace.basis.repr m).sum + (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by + conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] + rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] + refine Finset.sum_congr rfl fun g _ => ?_ + rw [map_smul] + rfl + rw [hm, Finsupp.sum, TensorProduct.tmul_sum] + refine Submodule.sum_mem _ fun g hg => ?_ + rw [TensorProduct.tmul_smul] + refine Submodule.smul_mem _ _ (filt_mono (Finset.le_sup hg) + (Submodule.subset_span ⟨c, [g], by simp, ?_⟩)) + simp + | mul x y hx hy => + obtain ⟨dx, hdx⟩ := hx + obtain ⟨dy, hdy⟩ := hy + refine ⟨dx + dy, fun c => ?_⟩ + rw [show c ⊗ₜ[ℂ] (x * y) = (c ⊗ₜ[ℂ] x) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] y) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one]] + exact mul_mem_filt (hdx c) (hdy 1) + | add x y hx hy => + obtain ⟨dx, hdx⟩ := hx + obtain ⟨dy, hdy⟩ := hy + refine ⟨max dx dy, fun c => ?_⟩ + rw [TensorProduct.tmul_add] + exact add_mem (filt_mono (le_max_left _ _) (hdx c)) + (filt_mono (le_max_right _ _) (hdy c)) + +/-- Every element of the lepton–gauge-sector jet algebra has bounded fermionic derivative + degree. -/ +lemma exists_mem_filt (x : JetAlgebra) : ∃ d, x ∈ filt d := by + induction x using TensorProduct.induction_on with + | zero => exact ⟨0, zero_mem _⟩ + | add a b ha hb => + obtain ⟨d1, h1⟩ := ha + obtain ⟨d2, h2⟩ := hb + exact ⟨max d1 d2, add_mem (filt_mono (le_max_left _ _) h1) + (filt_mono (le_max_right _ _) h2)⟩ + | tmul c l => + obtain ⟨d, hd⟩ := exists_forall_tmul_mem_filt l + exact ⟨d, hd c⟩ + +/-- Strictly-lower-degree odd elements: B-coefficiented single fermionic + generators of derivative degree less than `d`. -/ +noncomputable def oddLow (d : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ + {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (g : LeptonSinglet.JetGenerators), + genDeg g < d ∧ z = c ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator g} + +lemma oddLow_le_sfilt (d : ℕ) : oddLow d ≤ sfilt d := by + refine Submodule.span_le.mpr ?_ + rintro z ⟨c, g, hg, rfl⟩ + refine Submodule.subset_span ⟨c, [g], by simpa using hg, ?_⟩ + simp + +lemma genDeg_shift (μ : Fin 1 ⊕ Fin 3) (g : LeptonSinglet.JetGenerators) : + genDeg (LeptonSinglet.JetGenerators.shift μ g) = genDeg g + 1 := by + cases g <;> simp [genDeg, LeptonSinglet.JetGenerators.shift] + +set_option maxHeartbeats 1000000 in +/-- Multiplication by the gauge field acts on the B-boson coefficient of an odd + element. -/ +lemma dB_mul_tmul (μ : Fin 1 ⊕ Fin 3) (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (y : LeptonSinglet.JetAlgebra) : + ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * (c ⊗ₜ[ℂ] y) = + (((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * c) + ⊗ₜ[ℂ] y := by + have hone : ∀ z : LeptonSinglet.JetAlgebra, 1 * z = z := fun z => one_mul z + rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, + Algebra.TensorProduct.tmul_mul_tmul, hone] + +set_option maxHeartbeats 1000000 in +lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} + (hx : x ∈ oddLow d) : covariantStep μ x ∈ oddLow (d + 1) := by + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨c, g, hg, rfl⟩ := hz + rw [covariantStep_apply, jetDeriv_tmul, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] + refine sub_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) + · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ + · rw [dB_mul_tmul] + exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + | zero => rw [map_zero]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv + | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih + +set_option maxHeartbeats 1000000 in +lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} + (hx : x ∈ oddLow d) : covariantStepBar μ x ∈ oddLow (d + 1) := by + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨c, g, hg, rfl⟩ := hz + rw [covariantStepBar_apply, jetDeriv_tmul, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] + refine add_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) + · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ + · rw [dB_mul_tmul] + exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ + | zero => rw [map_zero]; exact zero_mem _ + | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv + | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih + +set_option maxHeartbeats 4000000 in +/-- The covariant derivative of the lepton is its plain derivative generator up + to strictly-lower-degree odd terms. -/ +lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑l) α) ∈ oddLow l.length := by + induction l with + | nil => + rw [Dψ_nil, show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (.dψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by + rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] + rfl, sub_self] + exact zero_mem _ + | cons μ t ih => + set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑t) α) with hL + have hstep : Dψ (μ :: t) α = covariantStep μ L + covariantStep μ (Dψ t α - L) := by + have h := (covariantStep μ).map_add L (Dψ t α - L) + rw [add_sub_cancel] at h + rw [Dψ_cons, h] + have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) - + ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by + rw [covariantStep_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, + LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, + TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dψ, + show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by + rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] + have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by + rw [hL, dB_mul_tmul] + refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ + simp [genDeg, Multiset.coe_card] + have hmem2 : covariantStep μ (Dψ t α - L) ∈ oddLow (t.length + 1) := + covariantStep_mem_oddLow μ ih + have habel : ∀ A X Y : JetAlgebra, A - X + Y - A = Y - X := fun A X Y => by abel + rw [hstep, hleadEq, habel] + exact sub_mem hmem2 (Submodule.smul_mem _ _ hmem1) + +set_option maxHeartbeats 4000000 in +/-- The covariant derivative of the conjugate lepton is its plain derivative + generator up to strictly-lower-degree odd terms. -/ +lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑l) α) ∈ oddLow l.length := by + induction l with + | nil => + rw [Dbarψ_nil, show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (.dbarψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by + rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] + rfl, sub_self] + exact zero_mem _ + | cons μ t ih => + set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑t) α) with hL + have hstep : Dbarψ (μ :: t) α = + covariantStepBar μ L + covariantStepBar μ (Dbarψ t α - L) := by + have h := (covariantStepBar μ).map_add L (Dbarψ t α - L) + rw [add_sub_cancel] at h + rw [Dbarψ_cons, h] + have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) + + ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by + rw [covariantStepBar_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, + LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, + TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, + LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + LeptonSinglet.JetGenerators.shift_dbarψ, + show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by + rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] + have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by + rw [hL, dB_mul_tmul] + refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ + simp [genDeg, Multiset.coe_card] + have hmem2 : covariantStepBar μ (Dbarψ t α - L) ∈ oddLow (t.length + 1) := + covariantStepBar_mem_oddLow μ ih + have habel : ∀ A X Y : JetAlgebra, A + X + Y - A = X + Y := fun A X Y => by abel + rw [hstep, hleadEq, habel] + exact add_mem (Submodule.smul_mem _ _ hmem1) hmem2 + +/-- The covariant generator is the plain generator up to strictly-lower-degree + odd terms. -/ +lemma covGenerator_sub_mem_oddLow (g : LeptonSinglet.JetGenerators) : + covGenerator g - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g ∈ oddLow (genDeg g) := by + cases g with + | dψ s α => + have h := Dψ_sub_mem_oddLow (sortList s) α + rw [coe_sortList, length_sortList] at h + exact h + | dbarψ s α => + have h := Dbarψ_sub_mem_oddLow (sortList s) α + rw [coe_sortList, length_sortList] at h + exact h + +lemma covGenerator_mem_filt (g : LeptonSinglet.JetGenerators) : + covGenerator g ∈ filt (genDeg g) := by + have h := sfilt_le_filt _ (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) + have hA : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g ∈ filt (genDeg g) := by + refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ + simp + have h2 := add_mem hA h + rwa [add_sub_cancel] at h2 + +lemma prod_covGenerator_mem_filt (l : List LeptonSinglet.JetGenerators) : + (l.map covGenerator).prod ∈ filt ((l.map genDeg).sum) := by + induction l with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil] + refine Submodule.subset_span ⟨1, [], by simp, ?_⟩ + rw [List.map_nil, List.prod_nil, Algebra.TensorProduct.one_def] + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + exact mul_mem_filt (covGenerator_mem_filt g) ih + +set_option maxHeartbeats 1000000 in +/-- The product of covariant generators is the corresponding product of plain + generators up to strictly-lower-degree terms. -/ +lemma prod_covGenerator_sub_mem_sfilt (l : List LeptonSinglet.JetGenerators) : + (l.map covGenerator).prod - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod ∈ + sfilt ((l.map genDeg).sum) := by + induction l with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil] + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : + JetAlgebra) = 1 from (Algebra.TensorProduct.one_def).symm, sub_self] + exact zero_mem _ + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + have hsub₁ : ∀ a b c : JetAlgebra, (a - b) * c = a * c - b * c := by grind + have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + set A : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g with hA + set Q : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod with hQ + have hAQ : A * Q = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.ofGenerator g * + (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by + rw [hA, hQ, Algebra.TensorProduct.tmul_mul_tmul, mul_one] + have hkey : covGenerator g * (t.map covGenerator).prod - + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.ofGenerator g * + (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = + (covGenerator g - A) * (t.map covGenerator).prod + + A * ((t.map covGenerator).prod - Q) := by + rw [hsub₁, hsub₂, hAQ] + abel + rw [hkey] + refine add_mem ?_ ?_ + · exact mul_mem_sfilt_left (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) + (prod_covGenerator_mem_filt t) + · have hAmem : A ∈ filt (genDeg g) := by + rw [hA] + refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ + simp + exact mul_mem_sfilt_right hAmem ih + +set_option maxHeartbeats 1000000 in +/-- Unitriangularity of the covariant substitution: it is the identity up to + strictly-lower-degree terms. -/ +lemma covSubst_sub_self_mem_sfilt {d : ℕ} {x : JetAlgebra} (hx : x ∈ filt d) : + covSubst x - x ∈ sfilt d := by + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨c, l, hl, rfl⟩ := hz + have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y + have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p + have hgen : ∀ g : LeptonSinglet.JetGenerators, + covExtHom (LeptonSinglet.JetAlgebra.ofGenerator g) = covGenerator g := by + intro g + rw [show LeptonSinglet.JetAlgebra.ofGenerator g = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis g) from rfl, covExtHom_ι, covMap_basis] + have hlp : ∀ L : List LeptonSinglet.JetAlgebra, + covExtHom L.prod = (L.map covExtHom).prod := by + intro L + induction L with + | nil => exact covExtHom.map_one + | cons a t iht => + have hm : covExtHom (a * t.prod) = covExtHom a * covExtHom t.prod := + map_mul covExtHom a t.prod + rw [List.prod_cons, List.map_cons, List.prod_cons, hm, iht] + have hcs : covSubst (c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = + (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * (l.map covGenerator).prod := by + rw [covSubst_tmul] + congr 1 + rw [hlp, List.map_map, + show (⇑covExtHom ∘ LeptonSinglet.JetAlgebra.ofGenerator) = covGenerator from + funext fun g => hgen g] + have hz2 : c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod = + (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, hone] + have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind + have hc1 : (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) ∈ filt 0 := by + refine Submodule.subset_span ⟨c, [], by simp, ?_⟩ + simp + have hfin := mul_mem_sfilt_right hc1 (prod_covGenerator_sub_mem_sfilt l) + rw [zero_add] at hfin + rw [hcs, hz2, ← hsub₂] + exact sfilt_mono hl hfin + | zero => + rw [map_zero, sub_zero] + exact zero_mem _ + | add u v hu hv ihu ihv => + rw [map_add, show covSubst u + covSubst v - (u + v) = + (covSubst u - u) + (covSubst v - v) from by abel] + exact add_mem ihu ihv + | smul r u hu ih => + rw [map_smul, show r • covSubst u - r • u = r • (covSubst u - u) from + (smul_sub r _ _).symm] + exact Submodule.smul_mem _ _ ih + +lemma eq_zero_of_covSubst_eq_zero {d : ℕ} : + ∀ {x : JetAlgebra}, x ∈ filt d → covSubst x = 0 → x = 0 := by + induction d with + | zero => + intro x hx h0 + have h := covSubst_sub_self_mem_sfilt hx + rw [h0, zero_sub, sfilt_zero, Submodule.mem_bot, neg_eq_zero] at h + exact h + | succ d ih => + intro x hx h0 + have h := covSubst_sub_self_mem_sfilt hx + rw [h0, zero_sub, sfilt_succ] at h + exact ih (neg_mem_iff.mp h) h0 + +/-- The covariant substitution is injective. -/ +lemma covSubst_injective : Function.Injective covSubst := by + intro x y hxy + obtain ⟨d, hd⟩ := exists_mem_filt (x - y) + have h0 : covSubst (x - y) = 0 := by rw [map_sub, hxy, sub_self] + exact sub_eq_zero.mp (eq_zero_of_covSubst_eq_zero hd h0) + +lemma exists_covSubst_eq {d : ℕ} : + ∀ {x : JetAlgebra}, x ∈ filt d → ∃ y, covSubst y = x := by + induction d with + | zero => + intro x hx + have h := covSubst_sub_self_mem_sfilt hx + rw [sfilt_zero, Submodule.mem_bot, sub_eq_zero] at h + exact ⟨x, h⟩ + | succ d ih => + intro x hx + have h := covSubst_sub_self_mem_sfilt hx + rw [sfilt_succ] at h + obtain ⟨y, hy⟩ := ih h + exact ⟨x - y, by rw [map_sub, hy, sub_sub_cancel]⟩ + +/-- The covariant substitution is surjective. -/ +lemma covSubst_surjective : Function.Surjective covSubst := by + intro x + obtain ⟨d, hd⟩ := exists_mem_filt x + exact exists_covSubst_eq hd + +set_option maxHeartbeats 2000000 in +/-- Every gauge invariant of the lepton–gauge-sector jet algebra lies in the algebra generated by + the field-strength derivatives and the covariant derivatives of the lepton and + its conjugate. + + Proof strategy (the sector analogue of + `BBoson.JetAlgebra.repJetGaugeGroupI_apply_eq_self_iff_mem`): decompose the jet + algebra as a free module over the (complexified) B-boson factor with basis the + exterior monomials in the *covariant* fermionic coordinates `D_s ψ_α`, + `D̄_s ψ̄_α` — a triangular change of variables from the plain coordinates + `∂_s ψ_α`, `∂_s ψ̄_α` by `Dψ_eq_leptonLinearIncl` and its conjugate. On this + decomposition a gauge transformation acts by the B-boson substitution action on + the coefficients and the scalars `u(0)^{±6}` on the covariant monomials + (`repJetGaugeGroupI_Dψ`, `repJetGaugeGroupI_Dbarψ`). Invariance under the + `expUnitary` translation family (which has `u(0) = 1`) forces each coefficient + to be invariant under all Maurer–Cartan translations of the pure-gauge B-boson + coordinates, hence to lie in the (complexified) field-strength subalgebra by + the B-boson translation theorem. -/ +theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq + (x : JetAlgebra) (hx : ∀ U, repJetGaugeGroupI U x = x) : + x ∈ Algebra.adjoin ℂ invariantGenerators := by + classical + obtain ⟨y, rfl⟩ := covSubst_surjective x + have hyU : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), + TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI + (BBoson.JetAlgebra.expUnitary a w hw)) LinearMap.id y = y := by + intro a w hw + refine covSubst_injective ?_ + rw [← repJetGaugeGroupI_covSubst _ (BBoson.JetAlgebra.eval_expUnitary_u1 a w hw), + hx] + set bL := Module.Basis.ofVectorSpace ℂ LeptonSinglet.JetAlgebra with hbL + set e : JetAlgebra ≃ₗ[ℂ] + (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra →₀ + ℂ ⊗[ℝ] BBoson.JetAlgebra) := + (TensorProduct.congr (LinearEquiv.refl ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra)) bL.repr).trans + (TensorProduct.finsuppScalarRight ℂ ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) + (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra)) with hedef + have happly : ∀ (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra)) + (z : JetAlgebra) (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra), + e (TensorProduct.map f LinearMap.id z) T = f (e z T) := by + intro f z T + induction z using TensorProduct.induction_on with + | zero => simp + | add u v hu hv => simp only [map_add, Finsupp.add_apply, hu, hv] + | tmul c l => + rw [hedef] + simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, + LinearEquiv.trans_apply, TensorProduct.congr_tmul, LinearEquiv.refl_apply, + TensorProduct.finsuppScalarRight_apply_tmul_apply, map_smul] + have hcT : ∀ T, e y T ∈ Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] BBoson.JetAlgebra)) := by + intro T + refine BBoson.JetAlgebra.mem_adjoin_of_forall_expUnitary_complex _ fun a w hw => ?_ + have h := happly (BBoson.JetAlgebra.complexRepJetGaugeGroupI + (BBoson.JetAlgebra.expUnitary a w hw)) y T + rw [hyU a w hw] at h + exact h.symm + set S : Set JetAlgebra := (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ + (Set.range fun g : LeptonSinglet.JetGenerators => + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra)) with hS + have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p + have honeL : ∀ l : LeptonSinglet.JetAlgebra, 1 * l = l := fun l => one_mul l + have hone_tmul : ∀ l : LeptonSinglet.JetAlgebra, + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l : JetAlgebra) ∈ Algebra.adjoin ℂ S := by + intro l + induction l using ExteriorAlgebra.induction with + | algebraMap r => + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] + refine Subalgebra.smul_mem _ ?_ _ + rw [← Algebra.TensorProduct.one_def] + exact one_mem _ + | ι m => + have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = + (LeptonSinglet.JetComponentSpace.basis.repr m).sum + (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by + conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] + rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] + refine Finset.sum_congr rfl fun g _ => ?_ + rw [map_smul] + rfl + rw [hm, Finsupp.sum, TensorProduct.tmul_sum] + refine sum_mem fun g _ => ?_ + rw [TensorProduct.tmul_smul] + refine Subalgebra.smul_mem _ (Algebra.subset_adjoin ?_) _ + rw [hS] + exact Set.mem_union_right _ ⟨g, rfl⟩ + | mul u v hu hv => + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (u * v) : JetAlgebra) = + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] u) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] v) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeB]] + exact mul_mem hu hv + | add u v hu hv => + rw [TensorProduct.tmul_add] + exact add_mem hu hv + have hleft : ∀ c ∈ Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] BBoson.JetAlgebra)), + ((c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ + Algebra.adjoin ℂ S := by + intro c hc + induction hc using Algebra.adjoin_induction with + | mem z hz => + obtain ⟨p, rfl⟩ := hz + refine Algebra.subset_adjoin ?_ + rw [hS] + exact Set.mem_union_left _ ⟨p, rfl⟩ + | algebraMap z => + rw [Algebra.algebraMap_eq_smul_one, ← TensorProduct.smul_tmul'] + refine Subalgebra.smul_mem _ ?_ _ + rw [← Algebra.TensorProduct.one_def] + exact one_mem _ + | add u v hu hv ihu ihv => + rw [TensorProduct.add_tmul] + exact add_mem ihu ihv + | mul u v hu hv ihu ihv => + rw [show ((u * v) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : JetAlgebra) = + (u ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + (v ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeL]] + exact mul_mem ihu ihv + have hsymm_single : ∀ (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra) + (c : ℂ ⊗[ℝ] BBoson.JetAlgebra), + e.symm (Finsupp.single T c) = c ⊗ₜ[ℂ] (bL T) := by + intro T c + rw [hedef, LinearEquiv.symm_trans_apply, + TensorProduct.finsuppScalarRight_symm_apply_single, TensorProduct.congr_symm_tmul] + simp only [LinearEquiv.refl_symm, LinearEquiv.refl_apply, + Module.Basis.repr_symm_single_one] + have hdecomp : y = ((e y).support).sum (fun T => (e y T) ⊗ₜ[ℂ] (bL T)) := by + conv_lhs => rw [← e.symm_apply_apply y, ← Finsupp.sum_single (e y)] + rw [Finsupp.sum, map_sum] + exact Finset.sum_congr rfl fun T _ => hsymm_single T _ + have hyMem : y ∈ Algebra.adjoin ℂ S := by + rw [hdecomp] + refine sum_mem fun T _ => ?_ + rw [show ((e y T) ⊗ₜ[ℂ] (bL T) : JetAlgebra) = + ((e y T) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (bL T)) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, honeL]] + exact mul_mem (hleft _ (hcT T)) (hone_tmul _) + have himg : covSubst y ∈ (Algebra.adjoin ℂ S).map covSubst := + Subalgebra.mem_map.mpr ⟨y, hyMem, rfl⟩ + rw [AlgHom.map_adjoin] at himg + refine Algebra.adjoin_le ?_ himg + rintro z ⟨w, hw, rfl⟩ + rcases hw with ⟨p, rfl⟩ | ⟨g, rfl⟩ + · show covSubst (fieldStrengthDeriv p.1 p.2.1 p.2.2) ∈ + Algebra.adjoin ℂ invariantGenerators + rw [show (fieldStrengthDeriv p.1 p.2.1 p.2.2 : JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, covSubst_tmul_one] + exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from + Set.mem_union_left _ (Set.mem_union_left _ ⟨p, rfl⟩)) + · show covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g) ∈ Algebra.adjoin ℂ invariantGenerators + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis g) from rfl, covSubst_one_tmul_ι, + covMap_basis] + cases g with + | dψ s α => + exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from + Set.mem_union_left _ (Set.mem_union_right _ ⟨(sortList s, α), rfl⟩)) + | dbarψ s α => + exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from + Set.mem_union_right _ ⟨(sortList s, α), rfl⟩) +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean new file mode 100644 index 000000000..103685390 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Basic +/-! +# The field strengths of the lepton–gauge-sector jet algebra + +The derivatives `∂_s F_{μν}` of the B-boson field strength, embedded in the +lepton–gauge-sector +jet algebra as elements of its bosonic factor, together with the identities +that hold of them as elements of that algebra: antisymmetry in the two field +indices, vanishing on a repeated index, and commutativity, the field strengths +lying in the commutative bosonic factor. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-- The derivatives of the B-boson field strength, embedded in the lepton–gauge-sector jet + algebra. -/ +noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ₜ[ℂ] 1 + + +/-- Antisymmetry of the embedded field-strength derivatives in the two field + indices. -/ +lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s ν μ = - fieldStrengthDeriv s μ ν := by + have h : ∀ a b : Fin 1 ⊕ Fin 3, (fieldStrengthDeriv s a b : JetAlgebra) = + [JetGenerators.dB (s + {a}) b]ₐ - [JetGenerators.dB (s + {b}) a]ₐ := by + intro a b + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, h, neg_sub] + +/-- The canonical orientation of a mixed field-strength component: the time + index first. -/ +lemma fieldStrengthDeriv_inr_inl (s : Multiset (Fin 1 ⊕ Fin 3)) (i : Fin 3) + (j : Fin 1) : + fieldStrengthDeriv s (Sum.inr i) (Sum.inl j) = + - fieldStrengthDeriv s (Sum.inl j) (Sum.inr i) := + fieldStrengthDeriv_antisymm s (Sum.inl j) (Sum.inr i) + +/-- The field strength vanishes on a repeated index. -/ +lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ μ = 0 := by + have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = + [JetGenerators.dB (s + {μ}) μ]ₐ - [JetGenerators.dB (s + {μ}) μ]ₐ := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, + TensorProduct.tmul_sub, TensorProduct.sub_tmul] + rfl + rw [h, sub_self] + +/-- The embedded field-strength derivatives commute: they live in the + commutative bosonic factor of the jet algebra. -/ +lemma fieldStrengthDeriv_mul_comm (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν ρ τ : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' ρ τ = + fieldStrengthDeriv s' ρ τ * fieldStrengthDeriv s μ ν := by + rw [fieldStrengthDeriv, fieldStrengthDeriv, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, + mul_comm (BBoson.JetAlgebra.fieldStrengthDeriv s μ ν)] + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean new file mode 100644 index 000000000..4536bccb1 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean @@ -0,0 +1,722 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.CovariantAlgebra +/-! +# The gauge action on the lepton–gauge-sector jet algebra + +The representation of the jet gauge group, the covariance of the covariant +derivatives under it, and the linear-matter model in which that covariance is +proved uniformly in the matter species before being instantiated at the lepton +and at its conjugate. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## B. Representation of the jet gauge group + +Gauge transformations act on the lepton–gauge-sector jet algebra +locally via the group `JetGaugeGroupI`. + +-/ + +/-- The representation of the jet gauge group on the lepton–gauge-sector jet algebra: the + Maurer–Cartan substitution action on the (complexified) B-boson factor tensored + with the hypercharge action on the charged-lepton factor. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := + BBoson.JetAlgebra.complexRepJetGaugeGroupI.tprod LeptonSinglet.JetAlgebra.repJetGaugeGroupI + +lemma repJetGaugeGroupI_eq_algHom (g : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI g x = Algebra.TensorProduct.map + (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom g) + (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom g) x := rfl + +lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI g (x * y) = + repJetGaugeGroupI g x * repJetGaugeGroupI g y := by + simp [repJetGaugeGroupI_eq_algHom] + +lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : + repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by + simp [repJetGaugeGroupI_eq_algHom] + +lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ₜ[ℂ] l) = + (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] + LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl + +/-- The gauge action on a pure tensor of the two jet-algebra factors. -/ +lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by + rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] + +/-- The gauge action on a spanning element of the linear-matter submodule: it + acts on the two factors separately, leaving the matter degree at one. This is + the only input the closure result needs, and it holds for any matter factor + whose gauge action is functorial in the component space. -/ +lemma repJetGaugeGroupI_tmul_ι (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (m : LeptonSinglet.JetComponentSpace) : + repJetGaugeGroupI U (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U m) := by + rw [repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + ExteriorAlgebra.map_apply_ι] + +/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge + transformations acts on it through the character of its value at the base + point alone, with no derivative contributions. This is the base case of + `repJetGaugeGroupI_Dψ`. -/ +lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : + repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by + rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, + Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] + +lemma repJetGaugeGroupI_dψ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U [.dψ s α]ₐ = + ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + [.dψ (Finsupp.toMultiset p.2) α]ₐ := by + rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, + StandardModel.LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ] + simp [tmul_sum, ← ofGenerator_dψ_eq] + +lemma repJetGaugeGroupI_apply_dB (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U [JetGenerators.dB s μ]ₐ = + [JetGenerators.dB s μ]ₐ + (BBoson.mcShift U (.basis (.dB s μ))) • 1 := by + rw [ofGenerator_B_eq, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, TensorProduct.add_tmul, + TensorProduct.smul_tmul'] + rfl + + + +set_option maxHeartbeats 1000000 in +/-- The statement that if `x` and all its derivatives transform in the + same way that `ψ` transforms under the full + gauge group, then `covariantStep μ x` transforms this.-/ +lemma repJetGaugeGroupI_jetDerivM_covariantSteplemma + (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) + (hx : ∀ s, (repJetGaugeGroupI U) (jetDerivM s x) + = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + jetDerivM (Finsupp.toMultiset p.2) x) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI U (jetDerivM s (covariantStep μ x)) = + ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by + calc _ + _ = repJetGaugeGroupI U (jetDerivM s (jetDeriv μ x - + (6 * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x))) := by + rfl + -- 1. Split the covariant step: `jetDerivM s` and `repJetGaugeGroupI U` are + -- linear, and `jetDerivM s (jetDeriv μ x) = jetDerivM (μ ::ₘ s) x` by + -- `jetDerivM_cons` together with `jetDerivM_add` / `jetDeriv_comm`. + _ = repJetGaugeGroupI U (jetDerivM (μ ::ₘ s) x) - + (6 * Complex.I) • repJetGaugeGroupI U (jetDerivM s ([JetGenerators.dB {} μ]ₐ * x)) := by + sorry + -- 2. `rw [hx (μ ::ₘ s)]` turns the first term into the expected sum at the + -- enlarged index `μ ::ₘ s`. + -- + -- 3. Leibniz on the gauge-field term via `jetDerivM_apply_mul`, then + -- `repJetGaugeGroupI_apply_mul` to split the action across each product: + -- ρ (∂_s (B_μ * x)) = ∑_q w_q • (ρ (∂_{q.1} B_μ) * ρ (∂_{q.2} x)) + -- NOTE: `jetDerivM_apply_mul` needs weight `Nat.choose`, not + -- `Nat.descFactorial`. At `s = {μ, μ}` the splitting `a = s` wants + -- `C(2,2) = 1`, but `Nat.descFactorial 2 2 = 2`. (`descFactorial` is + -- correct in `hx`: that comes from `jetRingAction` on a + -- factorial-weighted basis, a different normalisation.) + -- + -- 4. The gauge field is a coordinate, so it only shifts by a constant: + -- ρ_U (∂_a B_μ) = ∂_a B_μ + mcShift U [∂_{a+μ} B] • 1 + -- the sector-level counterpart of `BBoson.repJetGaugeGroupI_apply_dB` + -- transported through `repJetGaugeGroupI_tmul'`, together with + -- `jetDerivM a [dB {} μ]ₐ = [dB a μ]ₐ`. Neither exists yet. + -- + -- 5. The `x`-factor of each term is the hypothesis again, at index `q.2`. + -- + -- 6. Match against the target, expanded the same way: + -- ∂_p (D_μ x) = ∂_{μ ::ₘ p} x - 6i • ∂_p (B_μ * x) + -- Needs a Vandermonde/Pascal identity relating the weights at `μ ::ₘ s` + -- to those at `s` (reconciling `descFactorial` with `choose`), and + -- `coeff_p (u ^ 6)` at a shifted index expressed through the + -- Maurer–Cartan coefficients — the all-orders form of + -- `pderiv_pow_unitary`, currently only an inline `have` in + -- `LeptonSinglet`. That identity is what makes the shift from step 4 + -- cancel the derivative of the hypercharge character. + _ = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ ν, (Multiset.toFinsupp s ν).descFactorial (p.1 ν) : ℕ) : ℂ) • + MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • + jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by + sorry + +/-- The linear-matter submodule is closed under the gauge group: the gauge action + preserves the matter degree, because it acts on the matter factor functorially + in the component space and so intertwines with the canonical inclusion. -/ +lemma repJetGaugeGroupI_mem_LinearMatterSubmodule (U : JetGaugeGroupI) + {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : + repJetGaugeGroupI U x ∈ LinearMatterSubmodule := by + induction hx using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + rw [repJetGaugeGroupI_tmul_ι] + exact tmul_ι_mem_LinearMatterSubmodule _ _ + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- The submodule form of `repJetGaugeGroupI_mem_LinearMatterSubmodule`. -/ +lemma map_repJetGaugeGroupI_LinearMatterSubmodule_le (U : JetGaugeGroupI) : + LinearMatterSubmodule.map (repJetGaugeGroupI U) ≤ LinearMatterSubmodule := by + rintro x ⟨y, hy, rfl⟩ + exact repJetGaugeGroupI_mem_LinearMatterSubmodule U hy + +/-- The gauge action restricts to an automorphism of the linear-matter + submodule: the reverse inclusion holds by applying the bound to `U⁻¹`. -/ +lemma map_repJetGaugeGroupI_LinearMatterSubmodule (U : JetGaugeGroupI) : + LinearMatterSubmodule.map (repJetGaugeGroupI U) = LinearMatterSubmodule := by + refine le_antisymm (map_repJetGaugeGroupI_LinearMatterSubmodule_le U) fun x hx => ?_ + exact ⟨repJetGaugeGroupI U⁻¹ x, + repJetGaugeGroupI_mem_LinearMatterSubmodule U⁻¹ hx, + repJetGaugeGroupI.self_inv_apply U x⟩ + +/-- The embedded field-strength derivatives are gauge invariant. -/ +lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by + rw [fieldStrengthDeriv, repJetGaugeGroupI_tmul, + BBoson.JetAlgebra.repJetGaugeGroupI_fieldStrengthDeriv, + show LeptonSinglet.JetAlgebra.repJetGaugeGroupI U (1 : LeptonSinglet.JetAlgebra) = 1 from + map_one (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U))] + + +/-! + +## Covariance of the covariant derivatives + +The covariant derivatives of the charged lepton transform through the +hypercharge character of the value of the gauge jet at the base point alone: +`ρ_U (D_l ψ_α) = u(0)⁶ • D_l ψ_α`, with no derivative contributions. + +The proof works on the lepton-linear model of the `ψ`-sector: B-boson +polynomials tensored with a single unconjugated lepton component function. On +this model the gauge action `ρ`, the covariant step `D_μ`, and a family of +Maurer–Cartan anomaly operators `N_{s,μ}` satisfy a closed commutation algebra: + +* `ρ ∘ D_μ = D_μ ∘ ρ + ρ ∘ N_{[],μ}`, +* `N_{s,μ} ∘ D_ν = D_ν ∘ N_{s,μ} + N_{ν::s,μ}`, +* `N_{s,μ} ψ = 0` and `ρ ψ = u(0)⁶ • ψ`, + +so by induction every anomaly operator annihilates every covariant derivative, +and covariance propagates along the covariant-derivative recursion. + +-/ + +variable {W : Type*} [AddCommGroup W] [Module ℂ W] + +/-- The linear-matter model over a matter target `W`: B-boson polynomials + tensored with a single matter component function. -/ +abbrev MatterLinear (W : Type*) [AddCommGroup W] [Module ℂ W] := + (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) + + +/-- The derivative action of a jet on component functions valued in any target + `W`, acting on the derivative symbols. -/ +noncomputable def actionC (χ : JetRing) : + (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := + TensorProduct.map (DerivAlgebraComplex.jetRingAction χ) LinearMap.id + +/-- The derivative-symbol shift on component functions valued in any target + `W`. -/ +noncomputable def shiftC (ν : Fin 1 ⊕ Fin 3) : + (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := + TensorProduct.map (DerivAlgebraComplex.deriv ν) LinearMap.id + +lemma actionC_shiftC (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex ⊗[ℂ] W) : + actionC χ (shiftC ν a) = + shiftC ν (actionC χ a) + actionC (MvPowerSeries.pderiv ℂ ν χ) a := by + have h : (actionC (W := W) χ) ∘ₗ (shiftC ν) = + (shiftC ν) ∘ₗ (actionC χ) + actionC (MvPowerSeries.pderiv ℂ ν χ) := by + simp only [actionC, shiftC] + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, + show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.deriv ν) = + (DerivAlgebraComplex.deriv ν) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) + + DerivAlgebraComplex.jetRingAction (MvPowerSeries.pderiv ℂ ν χ) from + LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_deriv χ ν b, + TensorProduct.map_add_left] + exact LinearMap.congr_fun h a + +lemma actionC_comm (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : + actionC χ (actionC ψ a) = actionC ψ (actionC χ a) := by + have h : (actionC (W := W) χ) ∘ₗ (actionC ψ) = (actionC ψ) ∘ₗ (actionC χ) := by + simp only [actionC] + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, + show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.jetRingAction ψ) = + (DerivAlgebraComplex.jetRingAction ψ) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) from + LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_comm χ ψ b] + exact LinearMap.congr_fun h a + +lemma actionC_mul (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : + actionC (χ * ψ) a = actionC χ (actionC ψ a) := by + have h : actionC (W := W) (χ * ψ) = (actionC χ) ∘ₗ (actionC ψ) := by + simp only [actionC] + rw [← TensorProduct.map_comp, LinearMap.id_comp, + DerivAlgebraComplex.jetRingAction_mul] + exact LinearMap.congr_fun h a + +lemma actionC_C (c : ℂ) (a : DerivAlgebraComplex ⊗[ℂ] W) : + actionC (MvPowerSeries.C c : JetRing) a = c • a := by + have h : actionC (W := W) (MvPowerSeries.C c : JetRing) = c • LinearMap.id := by + rw [actionC, DerivAlgebraComplex.jetRingAction_C, TensorProduct.map_smul_left, + TensorProduct.map_id] + rw [h] + rfl + +/-- The embedding of a lepton component function into the lepton jet algebra. -/ +noncomputable def leptonComponentIncl : + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] LeptonSinglet.JetAlgebra := + (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet))) + +lemma leptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : + leptonComponentIncl a = + ExteriorAlgebra.ι ℂ ((a, 0) : LeptonSinglet.JetComponentSpace) := rfl + +/-- The inclusion of the lepton-linear elements into the lepton–gauge-sector jet algebra. -/ +noncomputable def leptonLinearIncl : + MatterLinear (Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] JetAlgebra := + TensorProduct.map LinearMap.id leptonComponentIncl + +lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : + leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] leptonComponentIncl a := by + simp [leptonLinearIncl] + +/-- The derivative action of a jet on the zeroth-order lepton component: the + scalar action of its value at the base point. -/ +lemma actionC_one_tmul (χ : JetRing) (φ : W) : + actionC χ ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) = + MvPowerSeries.constantCoeff χ • + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) := by + rw [actionC, TensorProduct.map_tmul, DerivAlgebraComplex.jetRingAction_apply_one, + LinearMap.id_coe, id_eq, TensorProduct.smul_tmul'] + +/-! + +### The linear-matter model, uniformly in the matter species + +The covariance argument depends on the matter species only through two +parameters: the jet `χ` through which the gauge group acts on the matter +component functions, and the coupling `c` in the covariant step +`D_μ = ∂_μ + c B_μ`. They are tied together by the single hypothesis + +`∂_ν χ = -c · (mcShiftSeries U ν []) · χ` + +which is exactly what makes the anomaly cancel. Everything below is stated once, +for a general matter target `W`, and instantiated at each species: for the +charged lepton `χ = u^6`, `c = -6i`, and for its conjugate `χ = star u ^ 6`, +`c = +6i`, the hypothesis in both cases being `pderiv_pow_unitary_mcShiftSeries` +and its conjugate. + +-/ + +/-- The covariant step `D_μ = ∂_μ + c B_μ` on the linear-matter model. -/ +noncomputable def covStepM (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : + MatterLinear W →ₗ[ℂ] MatterLinear W := + TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) + LinearMap.id + + TensorProduct.map LinearMap.id (shiftC μ) + + c • TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id + +lemma covStepM_tmul (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : DerivAlgebraComplex ⊗[ℂ] W) : + covStepM c μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + + p ⊗ₜ[ℂ] shiftC μ a + + c • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by + simp [covStepM] + +/-- The gauge action on the linear-matter model, acting on the matter factor + through the jet `χ`. -/ +noncomputable def repM (U : JetGaugeGroupI) (χ : JetRing) : + MatterLinear W →ₗ[ℂ] MatterLinear W := + TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) (actionC χ) + +lemma repM_tmul (U : JetGaugeGroupI) (χ : JetRing) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : DerivAlgebraComplex ⊗[ℂ] W) : + repM U χ (p ⊗ₜ[ℂ] a) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] actionC χ a := by + simp [repM] + +/-- The Maurer–Cartan anomaly operators on the linear-matter model. -/ +noncomputable def anomalyM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : MatterLinear W →ₗ[ℂ] MatterLinear W := + TensorProduct.map (LinearMap.baseChange ℂ + (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + + (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id - + c • TensorProduct.map LinearMap.id (actionC (BBoson.mcShiftSeries U μ s)) + +lemma anomalyM_tmul (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : DerivAlgebraComplex ⊗[ℂ] W) : + anomalyM U c s μ (p ⊗ₜ[ℂ] a) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + + (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) - + c • (p ⊗ₜ[ℂ] actionC (BBoson.mcShiftSeries U μ s) a) := by + simp [anomalyM] + +/-- The shift series commutes with any other jet action. -/ +lemma actionC_mcShiftSeries_comm (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (s : List (Fin 1 ⊕ Fin 3)) (χ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : + actionC (BBoson.mcShiftSeries U μ s) (actionC χ a) = + actionC χ (actionC (BBoson.mcShiftSeries U μ s) a) := + actionC_comm _ _ a + +/-- The base vector of the model: a matter component function with trivial + derivative history and unit B-boson coefficient. -/ +noncomputable def baseM (φ : W) : MatterLinear W := + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) + +/-- The covariant derivative in the model. -/ +noncomputable def DM (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : MatterLinear W := + l.foldr (fun μ x => covStepM c μ x) (baseM φ) + +lemma DM_cons (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : + DM c (μ :: l) φ = covStepM c μ (DM c l φ) := rfl + +/-- Multiplication by the unit of the complexified B-boson jet algebra. -/ +lemma one_mul_complex (z : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [mul_add, ha, hb] + | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] + +/-- The gauge action commutes with the covariant step up to the gauge action of + the zeroth anomaly operator. This is where the hypothesis relating `χ` and `c` + is used, and the only place it is needed. -/ +lemma repM_covStepM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) + (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = + MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) + (μ : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : + repM U χ (covStepM c μ x) = + covStepM c μ (repM U χ x) + repM U χ (anomalyM U c [] μ x) := by + have key : (repM U χ) ∘ₗ (covStepM (W := W) c μ) = + (covStepM c μ) ∘ₗ (repM U χ) + (repM U χ) ∘ₗ (anomalyM U c [] μ) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, + anomalyM_tmul, map_add, map_smul, map_sub, + repM_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] + simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, + actionC_shiftC, hχ, actionC_mul, actionC_C, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, + actionC_mcShiftSeries_comm] + have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator + (BBoson.JetGenerators.dB 0 μ) + + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • + BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by + rw [add_mul, smul_mul_assoc, one_mul_complex] + simp only [hdist] + simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', + TensorProduct.tmul_smul, smul_add, smul_smul] + push_cast + module + exact LinearMap.congr_fun key x + +/-- The anomaly operators commute with the covariant step up to the anomaly + operator with the derivative direction appended to its history. -/ +lemma anomalyM_covStepM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : + anomalyM U c s μ (covStepM c ν x) = + covStepM c ν (anomalyM U c s μ x) + anomalyM U c (ν :: s) μ x := by + have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = + (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by + rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by + rw [Multiset.singleton_add, Multiset.cons_coe]] + ac_rfl + have hshift : BBoson.JetGenerators.shiftMulti ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + (BBoson.JetGenerators.dB {} ν) = + BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by + rw [BBoson.JetGenerators.shiftMulti_dB] + congr 1 + have hm : BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = + BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by + rw [BBoson.mcShift_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = + ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by + rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] + have key : (anomalyM U c s μ) ∘ₗ (covStepM (W := W) c ν) = + (covStepM c ν) ∘ₗ (anomalyM U c s μ) + anomalyM U c (ν :: s) μ := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, + anomalyM_tmul, map_add, map_smul, map_sub, BBoson.mcShiftSeries_cons] + simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, + BBoson.JetAlgebra.mcDeriv_baseChange_mul, + BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] + have hdist : (((BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = + ((BBoson.mcShift U (BBoson.JetComponentSpace.basis + (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • + p := by + rw [smul_mul_assoc, one_mul_complex] + simp only [hdist] + simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', + smul_add, smul_smul] + module + exact LinearMap.congr_fun key x + +/-- The anomaly operators annihilate the base vector. -/ +lemma anomalyM_baseM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : W) : anomalyM U c s μ (baseM φ) = 0 := by + rw [baseM, anomalyM_tmul, LinearMap.baseChange_tmul] + simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, actionC_one_tmul, + BBoson.constantCoeff_mcShiftSeries, + TensorProduct.tmul_smul, smul_smul, zero_add] + module + +/-- The gauge action on the base vector is the value of `χ` at the base point. -/ +lemma repM_baseM (U : JetGaugeGroupI) (χ : JetRing) (φ : W) : + repM U χ (baseM φ) = MvPowerSeries.constantCoeff χ • baseM φ := by + rw [baseM, repM_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] + simp only [BBoson.JetAlgebra.repJetGaugeGroupI_apply_one, actionC_one_tmul, + TensorProduct.tmul_smul] + +/-- Every anomaly operator annihilates every covariant derivative. -/ +lemma anomalyM_DM (U : JetGaugeGroupI) (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : + ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), anomalyM U c s μ (DM c l φ) = 0 := by + induction l with + | nil => exact fun s μ => anomalyM_baseM U c s μ φ + | cons ν l ih => + intro s μ + rw [DM_cons, anomalyM_covStepM, ih s μ, map_zero, zero_add, ih (ν :: s) μ] + +/-- Covariance of the covariant derivatives on the linear-matter model. -/ +lemma repM_DM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) + (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = + MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) + (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : + repM U χ (DM c l φ) = MvPowerSeries.constantCoeff χ • DM c l φ := by + induction l with + | nil => exact repM_baseM U χ φ + | cons ν l ih => + rw [DM_cons, repM_covStepM U χ c hχ, ih, map_smul, anomalyM_DM U c l φ [] ν, + map_zero, add_zero] + +/-! + +### Instantiation at the unconjugated lepton + +-/ + +/-- The unconjugated lepton acts through `χ = u ^ 6` with coupling `c = -6i`. -/ +lemma pderiv_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + MvPowerSeries.pderiv ℂ ν (((U.2.2 : unitary JetRing) : JetRing) ^ 6) = + MvPowerSeries.C (-(-(6 : ℂ) * Complex.I)) * + (BBoson.mcShiftSeries U ν [] * ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by + rw [BBoson.pderiv_pow_unitary_mcShiftSeries] + norm_num + +/-- The inclusion intertwines the covariant steps. -/ +lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) + (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : + covariantStep μ (leptonLinearIncl x) = + leptonLinearIncl (covStepM (-(6 : ℂ) * Complex.I) μ x) := by + have key : (covariantStep μ) ∘ₗ leptonLinearIncl = + leptonLinearIncl ∘ₗ (covStepM (-(6 : ℂ) * Complex.I) μ) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covStepM_tmul, + leptonComponentIncl_apply, covariantStep_apply, map_add, map_smul, + jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, + LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + module + exact LinearMap.congr_fun key x + +/-- The inclusion intertwines the gauge actions. -/ +lemma repJetGaugeGroupI_leptonLinearIncl (U : JetGaugeGroupI) + (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : + repJetGaugeGroupI U (leptonLinearIncl x) = + leptonLinearIncl (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by + have key : (repJetGaugeGroupI U) ∘ₗ leptonLinearIncl = + leptonLinearIncl ∘ₗ (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, repM_tmul, + leptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, + TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl', + actionC] + exact LinearMap.congr_fun key x + +/-- The covariant derivatives are the images of their linear-matter models. -/ +lemma Dψ_eq_leptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α = leptonLinearIncl (DM (-(6 : ℂ) * Complex.I) l + (LeptonSinglet.basis.dualBasis α)) := by + induction l with + | nil => + rw [Dψ_nil, show DM (-(6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.dualBasis α) = + baseM (LeptonSinglet.basis.dualBasis α) from rfl, baseM, leptonLinearIncl_tmul, + leptonComponentIncl_apply] + simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, + LeptonSinglet.JetComponentSpace.basis_dψ_nil] + | cons ν l ih => + rw [Dψ_cons, ih, covariantStep_leptonLinearIncl] + rfl + +/-- Covariance of the covariant derivatives of the charged lepton: a jet of + gauge transformations acts on `D_l ψ_α` through the hypercharge character of + its value at the base point alone, with no derivative contributions. This is + the statement that the covariant derivative of a charged field is again a + charged field of the same charge. -/ +lemma repJetGaugeGroupI_Dψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U (Dψ l α) = U.eval.2.2 ^ 6 • Dψ l α := by + have hval : ((U.eval.2.2 : unitary ℂ) : ℂ) = + MvPowerSeries.constantCoeff ((U.2.2 : unitary JetRing) : JetRing) := rfl + rw [Dψ_eq_leptonLinearIncl, repJetGaugeGroupI_leptonLinearIncl, + repM_DM U _ _ (pderiv_pow_six U), map_smul, ← Dψ_eq_leptonLinearIncl, + Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] + +/-! + +## Covariant derivatives of the conjugate lepton + +The conjugate lepton `ψ̄` carries the opposite hypercharge: its component +functions transform through the conjugate-contragredient power series +`(star u) ^ 6`, so under a jet gauge transformation `∂_μ ψ̄_α` shifts by +`+ 6 i mc_μ ψ̄_α` and the covariant step is `D̄_μ = ∂_μ - 6 i B_μ`. + +The covariance proof mirrors the unconjugated case on the conjugate-linear +model, with the coupling `6 i` replaced by `- 6 i` throughout. + +-/ + +/-- The embedding of a conjugate lepton component function into the lepton jet + algebra. -/ +noncomputable def conjLeptonComponentIncl : + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] + LeptonSinglet.JetAlgebra := + (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inr ℂ + (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] + Module.Dual ℂ LeptonSinglet) (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet))) + +lemma conjLeptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : + conjLeptonComponentIncl a = + ExteriorAlgebra.ι ℂ ((0, a) : LeptonSinglet.JetComponentSpace) := rfl + +/-- The inclusion of the conjugate-linear elements into the lepton–gauge-sector jet algebra. -/ +noncomputable def conjLeptonLinearIncl : + MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] JetAlgebra := + TensorProduct.map LinearMap.id conjLeptonComponentIncl + +lemma conjLeptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : + conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] conjLeptonComponentIncl a := by + simp [conjLeptonLinearIncl] + +/-- The conjugate lepton acts through `χ = star u ^ 6` with coupling `c = +6i`. -/ +lemma pderiv_star_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : + MvPowerSeries.pderiv ℂ ν (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) = + MvPowerSeries.C (-((6 : ℂ) * Complex.I)) * + (BBoson.mcShiftSeries U ν [] * star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by + rw [BBoson.pderiv_pow_unitary_star_mcShiftSeries] + norm_num + +/-- The inclusion intertwines the conjugate covariant steps. -/ +lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) + (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : + covariantStepBar μ (conjLeptonLinearIncl x) = + conjLeptonLinearIncl (covStepM ((6 : ℂ) * Complex.I) μ x) := by + have key : (covariantStepBar μ) ∘ₗ conjLeptonLinearIncl = + conjLeptonLinearIncl ∘ₗ (covStepM ((6 : ℂ) * Complex.I) μ) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, covStepM_tmul, + conjLeptonComponentIncl_apply, covariantStepBar_apply, map_add, map_smul, + jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, + LeptonSinglet.JetComponentSpace.jetDeriv_inr', ofGenerator, shiftC, + Algebra.TensorProduct.tmul_mul_tmul, one_mul] + exact LinearMap.congr_fun key x + +/-- The inclusion intertwines the gauge actions. -/ +lemma repJetGaugeGroupI_conjLeptonLinearIncl (U : JetGaugeGroupI) + (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : + repJetGaugeGroupI U (conjLeptonLinearIncl x) = + conjLeptonLinearIncl (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by + have key : (repJetGaugeGroupI U) ∘ₗ conjLeptonLinearIncl = + conjLeptonLinearIncl ∘ₗ (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by + refine TensorProduct.ext' fun p a => ?_ + simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, repM_tmul, + conjLeptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, + TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr', + actionC] + exact LinearMap.congr_fun key x + +/-- The conjugate covariant derivatives are the images of their linear-matter + models. -/ +lemma Dbarψ_eq_conjLeptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α = conjLeptonLinearIncl (DM ((6 : ℂ) * Complex.I) l + (LeptonSinglet.basis.conj.dualBasis α)) := by + induction l with + | nil => + rw [Dbarψ_nil, show DM ((6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.conj.dualBasis α) = + baseM (LeptonSinglet.basis.conj.dualBasis α) from rfl, baseM, + conjLeptonLinearIncl_tmul, conjLeptonComponentIncl_apply] + simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, + LeptonSinglet.JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.basis_nil] + | cons ν l ih => + rw [Dbarψ_cons, ih, covariantStepBar_conjLeptonLinearIncl] + rfl + +/-- Covariance of the covariant derivatives of the conjugate lepton: a jet of + gauge transformations acts on `D̄_l ψ̄_α` through the conjugate hypercharge + character of its value at the base point alone. -/ +lemma repJetGaugeGroupI_Dbarψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repJetGaugeGroupI U (Dbarψ l α) = (star U.eval.2.2) ^ 6 • Dbarψ l α := by + have hval : ((star U.eval.2.2 : unitary ℂ) : ℂ) = + MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing)) := by + rw [Unitary.coe_star, JetRing.constantCoeff_star] + rfl + rw [Dbarψ_eq_conjLeptonLinearIncl, repJetGaugeGroupI_conjLeptonLinearIncl, + repM_DM U _ _ (pderiv_star_pow_six U), map_smul, ← Dbarψ_eq_conjLeptonLinearIncl, + Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean similarity index 55% rename from Physlib/Particles/QED/JetAlgebra/Invariants.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean index 9046ffe88..dc32bfbe7 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean @@ -5,11 +5,11 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.Membership +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.SpanOfRenormalizableTerms /-! -# Classification of the renormalizable QED Lagrangian densities +# Classification of the renormalizable Lagrangian densities of the lepton–gauge sector -The gauge- and Lorentz-invariant elements of the QED jet algebra of mass +The gauge- and Lorentz-invariant elements of the lepton–gauge-sector jet algebra of mass dimension at most four are exactly the linear combinations of the constants, the Maxwell term, the theta term and the two fermion kinetic terms: @@ -17,17 +17,86 @@ the Maxwell term, the theta term and the two fermion kinetic terms: The inclusion `≥` is `span_massDimFourInvariants_le`. For `≤`, an invariant `x` of weight `≤ 8` decomposes into `massWeightScale`-eigenvectors, each -lying in a `covMonomialSpan`; the parity and hypercharge selection rules leave +lying in a `covMonomialSpan`; the rotation and hypercharge selection rules leave only the neutral even-weight components, the weight-four and weight-six -sectors are killed by the Klein average and `sixKill`, and the weight-eight -sector is pinned down by the projector `opPi`. +sectors are killed by the rotation average and `rotationPiBoostAvg`, and the weight-eight +sector is pinned down by the projector `boostAvgScalarProj`. + +## The two techniques, and the layout of `Invariants/` + +Everything below the top level rests on one principle, proved in +`Invariants/GroupAverage`. If `T` is a linear operator built from the group +action which fixes every invariant vector, then for an invariant `y` lying in a +span, + +`y ∈ span S` and `T y = y` give `y = T y ∈ span (T '' S)`, + +so it suffices to compute `T v` for the finitely many `v ∈ S`. The operators +used are of two kinds: + +* genuine averages over a finite subgroup — `rotationPiAvg` is the Reynolds + operator of the Klein four-group `{1, R_x, R_y, R_z}` of rotations by `π`. + Such an average is idempotent, so it projects onto the invariants outright; +* weighted combinations whose weights sum to one, so that they still fix the + invariants, but which are engineered to annihilate the unwanted eigenvalues + of the operator they are built from. The boosts are non-compact and admit no + invariant average, so `boostAvgZ`, `boostAvgX`, `boostAvgY` pair `B(t)` with + `B(t)⁻¹` at `t = 2, 3, 4` with rational weights and `boostAvg` is their mean + over the three axes, while `rotationPiBoostAvg` weights the identity against + two `z`-boosts. Despite the names these are not idempotent, and the last step + of the argument needs one that is: `boostAvgScalarProj` is the degree-five + polynomial in `boostAvg` vanishing on each of its other five eigenvalues and + equal to one on the invariants — a spectral projector, not an average. + +Alongside these sit the reduction steps, which cut the problem down to a +finite spanning set before any operator is applied: separation of components +by a character (the powers `c ^ m` for the mass weight, roots of unity for the +hypercharge), selection rules read off a single group element (the gauge +element with `u 0 = i` kills every odd-weight component), and the explicit +monomial spanning sets of each sector. + +The subdirectories group the files by which of these they carry, and each +subgroup sits opposite the average taken over it. + +* `Invariants/GroupAverage` — the averaging principle itself, stated for an + arbitrary representation: the span lemma above, weighted sums of group + elements, the average over a finite subgroup, and the fact that a polynomial + with unit coefficient sum in an operator fixing `y` again fixes `y`. +* `Invariants/Grading/` — which grading is being used. + `MassWeightAndHypercharge` builds the two gradings, by mass weight and by + hypercharge, together with the selection rules that follow from them. + `NeutralSectors` reduces each charge-neutral sector of weight four, six and + eight to a finite explicit spanning family of monomials. +* `Invariants/Subgroups/` — which subgroup, acting on what. `RotationsPi` + defines the rotations by `π` and the subgroup they generate; `AxisBoosts` + defines the one-parameter boosts along the three coordinate axes and the two + fixed `z`-boosts; `BoostsOnFieldStrength`, + `BoostsOnFieldStrengthDerivatives`, `BoostsOnPhotonTerms` and + `BoostsOnFermionTerms` tabulate how the boosts move `F_{μν}`, + `∂_ρ ∂_τ F_{μν}`, the products `F F` and the fermion bilinears. +* `Invariants/Averages/` — the average over each of those subgroups, and what + it does to the monomials. `RotationAverage` stands opposite + `Subgroups/RotationsPi` and kills the weight-four sector; + `RotationPiBoostAverage` follows it with a weighting of the two `z`-boosts + and kills the weight-six sector; `BoostAverage` stands opposite + `Subgroups/AxisBoosts` and, the boosts being non-compact, replaces the + missing invariant average by the weighted combinations `boostAvgZ/X/Y` and + their mean `boostAvg`. `BoostAvgProjector` then turns `boostAvg` into a + genuine projector, and `BoostAvgProjectorOnPhotonPairs`, + `BoostAvgProjectorOnDerivativesAndFermions` and + `BoostAvgProjectorOnMonomials` evaluate it on each kind of weight-eight term. + +`Invariants/Basic` (the four renormalizable terms, defined one per file in +`LeptonGaugeSector/JetAlgebra/Terms/`, collected into one set together with the easy +inclusion) and `Invariants/SpanOfRenormalizableTerms` (the projected monomials +land in their span) bracket these and stay at the top level. -/ @[expose] public section set_option maxHeartbeats 1000000 -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -57,31 +126,31 @@ lemma mem_span_of_mem_chargeCovSpan_eight {y : JetAlgebra} obtain ⟨c4, hc4⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw4 obtain ⟨c5, hc5⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw5 obtain ⟨c6, hc6⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw6 - have hKy : kleinAvg y = y := by - rw [kleinAvg_apply, hinv parityZ, hinv parityY, hinv parityX] + have hKy : rotationPiAvg y = y := by + rw [rotationPiAvg_apply, hinv rotationPiZ, hinv rotationPiY, hinv rotationPiX] module - have hself : opPi (kleinAvg y) = y := by + have hself : boostAvgScalarProj (rotationPiAvg y) = y := by rw [hKy] - exact opPi_apply_of_invariant hinv + exact boostAvgScalarProj_apply_of_invariant hinv rw [← hself, ← hE6, ← hE5, ← hE4, ← hE3, ← hE2, ← hc1, ← hc2, ← hc3, ← hc4, ← hc5, ← hc6] simp only [map_add, map_sum, map_smul] refine Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ ?_ ?_) ?_) ?_) ?_) ?_ · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (opPi_kleinAvg_FF_mem p.1.1 p.1.2 p.2.1 p.2.2) + Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FF_mem p.1.1 p.1.2 p.2.1 p.2.2) · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (opPi_kleinAvg_DDF_mem p.1.1 p.1.2 p.2.1 p.2.2) + Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_DDF_mem p.1.1 p.1.2 p.2.1 p.2.2) · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (opPi_kleinAvg_FM1_mem p.2 p.1.1 p.1.2) + Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM1_mem p.2 p.1.1 p.1.2) · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (opPi_kleinAvg_FM1r_mem p.2 p.1.1 p.1.2) + Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM1r_mem p.2 p.1.1 p.1.2) · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (opPi_kleinAvg_FM2r_mem p.2 p.1.1 p.1.2) + Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM2r_mem p.2 p.1.1 p.1.2) · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (opPi_kleinAvg_FM2_mem p.2 p.1.2 p.1.1) + Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM2_mem p.2 p.1.2 p.1.1) -/-- The classification of the renormalizable QED Lagrangian densities: the +/-- The classification of the renormalizable Lagrangian densities of the lepton–gauge sector: the gauge- and Lorentz-invariant elements of mass weight at most eight are spanned by the constants, the Maxwell term, the theta term, and the two fermion kinetic terms. @@ -118,7 +187,7 @@ lemma mem_span_of_mem_chargeCovSpan_eight {y : JetAlgebra} kinetic terms. Steps 3–4 remain to be formalized: they require the commutation of the - scaling with the two group actions at the QED level, the linear independence + scaling with the two group actions at the sector level, the linear independence of the covariant monomials, and the invariant theory of `SL(2,ℂ)` on the finite-dimensional weight sectors. -/ lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : @@ -149,22 +218,22 @@ lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : (covMonomialSpan_le_bot_of_lt_three (by omega) (by omega) (hzmem 2))] exact Submodule.zero_mem _ · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 3) - (hzconst parityGauge)] + (hzconst fermionParityGauge)] exact Submodule.zero_mem _ · rw [eq_zero_of_mem_chargeCovSpan_four (mem_chargeCovSpan_zero_of_invariant (hzmem 4) hzconst) hzlor] exact Submodule.zero_mem _ · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 5) - (hzconst parityGauge)] + (hzconst fermionParityGauge)] exact Submodule.zero_mem _ · rw [eq_zero_of_mem_chargeCovSpan_six (mem_chargeCovSpan_zero_of_invariant (hzmem 6) hzconst) hzlor] exact Submodule.zero_mem _ · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 7) - (hzconst parityGauge)] + (hzconst fermionParityGauge)] exact Submodule.zero_mem _ · exact mem_span_of_mem_chargeCovSpan_eight (mem_chargeCovSpan_zero_of_invariant (hzmem 8) hzconst) hzlor end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean new file mode 100644 index 000000000..33b31e0ae --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean @@ -0,0 +1,704 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.RotationPiBoostAverage +/-! +# The average over the boosts + +The average over the boosts of `Subgroups/AxisBoosts`, whose action on the +weight-eight monomials is tabulated in the `Subgroups/BoostsOn*` files. + +A boost subgroup is non-compact, so it carries no invariant average. In its +place a rational combination of the boosts at `t = 2, 3, 4` paired with their +inverses, together with the identity (`boostAvgZ`, `boostAvgX`, `boostAvgY`), +has weights summing to one — so it still fixes every Lorentz-invariant vector — +while annihilating the unwanted boost eigenvalues. Their mean over the three +axes is `boostAvg`, which acts on the weight-eight monomials by an explicit rational +matrix (the `boostAvg_*` lemmas). +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The `Z`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the rotation-averaged single-axis + average on the weight-eight sector. -/ +noncomputable def boostAvgZ : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + + repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + + repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + + repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) + +/-- The `X`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the rotation-averaged single-axis + average on the weight-eight sector. -/ +noncomputable def boostAvgX : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + + repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + + repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + + repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) + +/-- The `Y`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the rotation-averaged single-axis + average on the weight-eight sector. -/ +noncomputable def boostAvgY : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + + repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + + repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + + repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) + +/-- The symmetrised boost average over the three axes. -/ +noncomputable def boostAvg : Module.End ℂ JetAlgebra := + (3⁻¹ : ℂ) • (boostAvgZ + boostAvgX + boostAvgY) + +/-- The operator `boostAvg` fixes every Lorentz-invariant vector: each boost term + fixes it and the weights sum to one. -/ +lemma boostAvg_apply_of_invariant {y : JetAlgebra} + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : boostAvg y = y := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply, hinv] + match_scalars + norm_num + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F01 * F01`. -/ +lemma boostAvg_F01_F01 : + boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F01_F01 2 (by norm_num), + boostPairZ_F01_F01 3 (by norm_num), + boostPairZ_F01_F01 4 (by norm_num), + boostPairX_F01_F01 2 (by norm_num), + boostPairX_F01_F01 3 (by norm_num), + boostPairX_F01_F01 4 (by norm_num), + boostPairY_F01_F01 2 (by norm_num), + boostPairY_F01_F01 3 (by norm_num), + boostPairY_F01_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F01 * F23`. -/ +lemma boostAvg_F01_F23 : + boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F01_F23 2 (by norm_num), + boostPairZ_F01_F23 3 (by norm_num), + boostPairZ_F01_F23 4 (by norm_num), + boostPairX_F01_F23 2 (by norm_num), + boostPairX_F01_F23 3 (by norm_num), + boostPairX_F01_F23 4 (by norm_num), + boostPairY_F01_F23 2 (by norm_num), + boostPairY_F01_F23 3 (by norm_num), + boostPairY_F01_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F02 * F02`. -/ +lemma boostAvg_F02_F02 : + boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F02_F02 2 (by norm_num), + boostPairZ_F02_F02 3 (by norm_num), + boostPairZ_F02_F02 4 (by norm_num), + boostPairX_F02_F02 2 (by norm_num), + boostPairX_F02_F02 3 (by norm_num), + boostPairX_F02_F02 4 (by norm_num), + boostPairY_F02_F02 2 (by norm_num), + boostPairY_F02_F02 3 (by norm_num), + boostPairY_F02_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F02 * F13`. -/ +lemma boostAvg_F02_F13 : + boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F02_F13 2 (by norm_num), + boostPairZ_F02_F13 3 (by norm_num), + boostPairZ_F02_F13 4 (by norm_num), + boostPairX_F02_F13 2 (by norm_num), + boostPairX_F02_F13 3 (by norm_num), + boostPairX_F02_F13 4 (by norm_num), + boostPairY_F02_F13 2 (by norm_num), + boostPairY_F02_F13 3 (by norm_num), + boostPairY_F02_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F03 * F03`. -/ +lemma boostAvg_F03_F03 : + boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F03_F03 2 (by norm_num), + boostPairZ_F03_F03 3 (by norm_num), + boostPairZ_F03_F03 4 (by norm_num), + boostPairX_F03_F03 2 (by norm_num), + boostPairX_F03_F03 3 (by norm_num), + boostPairX_F03_F03 4 (by norm_num), + boostPairY_F03_F03 2 (by norm_num), + boostPairY_F03_F03 3 (by norm_num), + boostPairY_F03_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F03 * F12`. -/ +lemma boostAvg_F03_F12 : + boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F03_F12 2 (by norm_num), + boostPairZ_F03_F12 3 (by norm_num), + boostPairZ_F03_F12 4 (by norm_num), + boostPairX_F03_F12 2 (by norm_num), + boostPairX_F03_F12 3 (by norm_num), + boostPairX_F03_F12 4 (by norm_num), + boostPairY_F03_F12 2 (by norm_num), + boostPairY_F03_F12 3 (by norm_num), + boostPairY_F03_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F12 * F12`. -/ +lemma boostAvg_F12_F12 : + boostAvg (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F12_F12 2 (by norm_num), + boostPairZ_F12_F12 3 (by norm_num), + boostPairZ_F12_F12 4 (by norm_num), + boostPairX_F12_F12 2 (by norm_num), + boostPairX_F12_F12 3 (by norm_num), + boostPairX_F12_F12 4 (by norm_num), + boostPairY_F12_F12 2 (by norm_num), + boostPairY_F12_F12 3 (by norm_num), + boostPairY_F12_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F13 * F13`. -/ +lemma boostAvg_F13_F13 : + boostAvg (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F13_F13 2 (by norm_num), + boostPairZ_F13_F13 3 (by norm_num), + boostPairZ_F13_F13 4 (by norm_num), + boostPairX_F13_F13 2 (by norm_num), + boostPairX_F13_F13 3 (by norm_num), + boostPairX_F13_F13 4 (by norm_num), + boostPairY_F13_F13 2 (by norm_num), + boostPairY_F13_F13 3 (by norm_num), + boostPairY_F13_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `F23 * F23`. -/ +lemma boostAvg_F23_F23 : + boostAvg (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_F23_F23 2 (by norm_num), + boostPairZ_F23_F23 3 (by norm_num), + boostPairZ_F23_F23 4 (by norm_num), + boostPairX_F23_F23 2 (by norm_num), + boostPairX_F23_F23 3 (by norm_num), + boostPairX_F23_F23 4 (by norm_num), + boostPairY_F23_F23 2 (by norm_num), + boostPairY_F23_F23 3 (by norm_num), + boostPairY_F23_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F01` with derivative indices `(0, 1)`. -/ +lemma boostAvg_dd01_F01 : + boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd01_F01 2 (by norm_num), + boostPairZ_dd01_F01 3 (by norm_num), + boostPairZ_dd01_F01 4 (by norm_num), + boostPairX_dd01_F01 2 (by norm_num), + boostPairX_dd01_F01 3 (by norm_num), + boostPairX_dd01_F01 4 (by norm_num), + boostPairY_dd01_F01 2 (by norm_num), + boostPairY_dd01_F01 3 (by norm_num), + boostPairY_dd01_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F23` with derivative indices `(0, 1)`. -/ +lemma boostAvg_dd01_F23 : + boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd01_F23 2 (by norm_num), + boostPairZ_dd01_F23 3 (by norm_num), + boostPairZ_dd01_F23 4 (by norm_num), + boostPairX_dd01_F23 2 (by norm_num), + boostPairX_dd01_F23 3 (by norm_num), + boostPairX_dd01_F23 4 (by norm_num), + boostPairY_dd01_F23 2 (by norm_num), + boostPairY_dd01_F23 3 (by norm_num), + boostPairY_dd01_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F02` with derivative indices `(0, 2)`. -/ +lemma boostAvg_dd02_F02 : + boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd02_F02 2 (by norm_num), + boostPairZ_dd02_F02 3 (by norm_num), + boostPairZ_dd02_F02 4 (by norm_num), + boostPairX_dd02_F02 2 (by norm_num), + boostPairX_dd02_F02 3 (by norm_num), + boostPairX_dd02_F02 4 (by norm_num), + boostPairY_dd02_F02 2 (by norm_num), + boostPairY_dd02_F02 3 (by norm_num), + boostPairY_dd02_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F13` with derivative indices `(0, 2)`. -/ +lemma boostAvg_dd02_F13 : + boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd02_F13 2 (by norm_num), + boostPairZ_dd02_F13 3 (by norm_num), + boostPairZ_dd02_F13 4 (by norm_num), + boostPairX_dd02_F13 2 (by norm_num), + boostPairX_dd02_F13 3 (by norm_num), + boostPairX_dd02_F13 4 (by norm_num), + boostPairY_dd02_F13 2 (by norm_num), + boostPairY_dd02_F13 3 (by norm_num), + boostPairY_dd02_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F03` with derivative indices `(0, 3)`. -/ +lemma boostAvg_dd03_F03 : + boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd03_F03 2 (by norm_num), + boostPairZ_dd03_F03 3 (by norm_num), + boostPairZ_dd03_F03 4 (by norm_num), + boostPairX_dd03_F03 2 (by norm_num), + boostPairX_dd03_F03 3 (by norm_num), + boostPairX_dd03_F03 4 (by norm_num), + boostPairY_dd03_F03 2 (by norm_num), + boostPairY_dd03_F03 3 (by norm_num), + boostPairY_dd03_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F12` with derivative indices `(0, 3)`. -/ +lemma boostAvg_dd03_F12 : + boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd03_F12 2 (by norm_num), + boostPairZ_dd03_F12 3 (by norm_num), + boostPairZ_dd03_F12 4 (by norm_num), + boostPairX_dd03_F12 2 (by norm_num), + boostPairX_dd03_F12 3 (by norm_num), + boostPairX_dd03_F12 4 (by norm_num), + boostPairY_dd03_F12 2 (by norm_num), + boostPairY_dd03_F12 3 (by norm_num), + boostPairY_dd03_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F03` with derivative indices `(1, 2)`. -/ +lemma boostAvg_dd12_F03 : + boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd12_F03 2 (by norm_num), + boostPairZ_dd12_F03 3 (by norm_num), + boostPairZ_dd12_F03 4 (by norm_num), + boostPairX_dd12_F03 2 (by norm_num), + boostPairX_dd12_F03 3 (by norm_num), + boostPairX_dd12_F03 4 (by norm_num), + boostPairY_dd12_F03 2 (by norm_num), + boostPairY_dd12_F03 3 (by norm_num), + boostPairY_dd12_F03 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F12` with derivative indices `(1, 2)`. -/ +lemma boostAvg_dd12_F12 : + boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd12_F12 2 (by norm_num), + boostPairZ_dd12_F12 3 (by norm_num), + boostPairZ_dd12_F12 4 (by norm_num), + boostPairX_dd12_F12 2 (by norm_num), + boostPairX_dd12_F12 3 (by norm_num), + boostPairX_dd12_F12 4 (by norm_num), + boostPairY_dd12_F12 2 (by norm_num), + boostPairY_dd12_F12 3 (by norm_num), + boostPairY_dd12_F12 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F02` with derivative indices `(1, 3)`. -/ +lemma boostAvg_dd13_F02 : + boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd13_F02 2 (by norm_num), + boostPairZ_dd13_F02 3 (by norm_num), + boostPairZ_dd13_F02 4 (by norm_num), + boostPairX_dd13_F02 2 (by norm_num), + boostPairX_dd13_F02 3 (by norm_num), + boostPairX_dd13_F02 4 (by norm_num), + boostPairY_dd13_F02 2 (by norm_num), + boostPairY_dd13_F02 3 (by norm_num), + boostPairY_dd13_F02 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F13` with derivative indices `(1, 3)`. -/ +lemma boostAvg_dd13_F13 : + boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd13_F13 2 (by norm_num), + boostPairZ_dd13_F13 3 (by norm_num), + boostPairZ_dd13_F13 4 (by norm_num), + boostPairX_dd13_F13 2 (by norm_num), + boostPairX_dd13_F13 3 (by norm_num), + boostPairX_dd13_F13 4 (by norm_num), + boostPairY_dd13_F13 2 (by norm_num), + boostPairY_dd13_F13 3 (by norm_num), + boostPairY_dd13_F13 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F01` with derivative indices `(2, 3)`. -/ +lemma boostAvg_dd23_F01 : + boostAvg (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd23_F01 2 (by norm_num), + boostPairZ_dd23_F01 3 (by norm_num), + boostPairZ_dd23_F01 4 (by norm_num), + boostPairX_dd23_F01 2 (by norm_num), + boostPairX_dd23_F01 3 (by norm_num), + boostPairX_dd23_F01 4 (by norm_num), + boostPairY_dd23_F01 2 (by norm_num), + boostPairY_dd23_F01 3 (by norm_num), + boostPairY_dd23_F01 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on `∂∂F23` with derivative indices `(2, 3)`. -/ +lemma boostAvg_dd23_F23 : + boostAvg (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_dd23_F23 2 (by norm_num), + boostPairZ_dd23_F23 3 (by norm_num), + boostPairZ_dd23_F23 4 (by norm_num), + boostPairX_dd23_F23 2 (by norm_num), + boostPairX_dd23_F23 3 (by norm_num), + boostPairX_dd23_F23 4 (by norm_num), + boostPairY_dd23_F23 2 (by norm_num), + boostPairY_dd23_F23 3 (by norm_num), + boostPairY_dd23_F23 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `u0`. -/ +lemma boostAvg_u0 : + boostAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (-(Complex.I/6)) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_u0 2 (by norm_num), + boostPairZ_u0 3 (by norm_num), + boostPairZ_u0 4 (by norm_num), + boostPairX_u0 2 (by norm_num), + boostPairX_u0 3 (by norm_num), + boostPairX_u0 4 (by norm_num), + boostPairY_u0 2 (by norm_num), + boostPairY_u0 3 (by norm_num), + boostPairY_u0 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `u1`. -/ +lemma boostAvg_u1 : + boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_u1 2 (by norm_num), + boostPairZ_u1 3 (by norm_num), + boostPairZ_u1 4 (by norm_num), + boostPairX_u1 2 (by norm_num), + boostPairX_u1 3 (by norm_num), + boostPairX_u1 4 (by norm_num), + boostPairY_u1 2 (by norm_num), + boostPairY_u1 3 (by norm_num), + boostPairY_u1 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `u2`. -/ +lemma boostAvg_u2 : + boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + + (Complex.I/6) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_u2 2 (by norm_num), + boostPairZ_u2 3 (by norm_num), + boostPairZ_u2 4 (by norm_num), + boostPairX_u2 2 (by norm_num), + boostPairX_u2 3 (by norm_num), + boostPairX_u2 4 (by norm_num), + boostPairY_u2 2 (by norm_num), + boostPairY_u2 3 (by norm_num), + boostPairY_u2 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `u3`. -/ +lemma boostAvg_u3 : + boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_u3 2 (by norm_num), + boostPairZ_u3 3 (by norm_num), + boostPairZ_u3 4 (by norm_num), + boostPairX_u3 2 (by norm_num), + boostPairX_u3 3 (by norm_num), + boostPairX_u3 4 (by norm_num), + boostPairY_u3 2 (by norm_num), + boostPairY_u3 3 (by norm_num), + boostPairY_u3 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar0`. -/ +lemma boostAvg_ubar0 : + boostAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (-(Complex.I/6)) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_ubar0 2 (by norm_num), + boostPairZ_ubar0 3 (by norm_num), + boostPairZ_ubar0 4 (by norm_num), + boostPairX_ubar0 2 (by norm_num), + boostPairX_ubar0 3 (by norm_num), + boostPairX_ubar0 4 (by norm_num), + boostPairY_ubar0 2 (by norm_num), + boostPairY_ubar0 3 (by norm_num), + boostPairY_ubar0 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar1`. -/ +lemma boostAvg_ubar1 : + boostAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_ubar1 2 (by norm_num), + boostPairZ_ubar1 3 (by norm_num), + boostPairZ_ubar1 4 (by norm_num), + boostPairX_ubar1 2 (by norm_num), + boostPairX_ubar1 3 (by norm_num), + boostPairX_ubar1 4 (by norm_num), + boostPairY_ubar1 2 (by norm_num), + boostPairY_ubar1 3 (by norm_num), + boostPairY_ubar1 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar2`. -/ +lemma boostAvg_ubar2 : + boostAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + + (Complex.I/6) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_ubar2 2 (by norm_num), + boostPairZ_ubar2 3 (by norm_num), + boostPairZ_ubar2 4 (by norm_num), + boostPairX_ubar2 2 (by norm_num), + boostPairX_ubar2 3 (by norm_num), + boostPairX_ubar2 4 (by norm_num), + boostPairY_ubar2 2 (by norm_num), + boostPairY_ubar2 3 (by norm_num), + boostPairY_ubar2 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +set_option maxHeartbeats 4000000 in +/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar3`. -/ +lemma boostAvg_ubar3 : + boostAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (5/6 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, + LinearMap.add_apply, LinearMap.id_apply] + simp only [boostPairZ_ubar3 2 (by norm_num), + boostPairZ_ubar3 3 (by norm_num), + boostPairZ_ubar3 4 (by norm_num), + boostPairX_ubar3 2 (by norm_num), + boostPairX_ubar3 3 (by norm_num), + boostPairX_ubar3 4 (by norm_num), + boostPairY_ubar3 2 (by norm_num), + boostPairY_ubar3 3 (by norm_num), + boostPairY_ubar3 4 (by norm_num)] + match_scalars <;> (push_cast; try ring_nf; try norm_num) + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean new file mode 100644 index 000000000..7cc462a22 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAverage +/-! +# The scalar projector built from the boost average + +`boostAvgScalarProj` is *not* an average. It is a polynomial in the boost +average `boostAvg` of `Averages/BoostAverage`, and the distinction matters. + +An average over a finite subgroup is idempotent, so it projects onto the +invariants outright. The boosts are not finite — not even compact — and +`boostAvg` is only a weighted combination with weights summing to one: it fixes +every Lorentz-invariant element, but it is not idempotent, and on the +rotation-averaged weight-eight sector it acts with the six eigenvalues +`1, 5/6, 2/3, 1/2, 1/3, 1/6`. The invariants are exactly the eigenvalue-one +eigenspace. + +Turning that operator into a projector is Sylvester's formula: for the unique +quintic `p` with `p 1 = 1` and `p λ = 0` at the other five eigenvalues, + +`p x = (324/5) (x - 5/6) (x - 2/3) (x - 1/2) (x - 1/3) (x - 1/6)` +` = -1 + (137/10) x - (135/2) x² + 153 x³ - 162 x⁴ + (324/5) x⁵,` + +the operator `p boostAvg` kills every other eigenspace and is the identity on +the invariants. That operator is `boostAvgScalarProj`. Its coefficients sum to +one, so `Module.End.sum_smul_pow_apply_of_apply_eq_self` of +`Invariants/GroupAverage` applies verbatim and it fixes Lorentz invariants just +as an average would (`boostAvgScalarProj_apply_of_invariant`); that is all the +averaging principle ever needs of it. + +Its values on the weight-eight monomials are computed in +`BoostAvgProjectorOnPhotonPairs`, `BoostAvgProjectorOnDerivativesAndFermions` +and `BoostAvgProjectorOnMonomials`. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The spectral projector onto the Lorentz scalars, obtained from the boost + average `boostAvg` by Sylvester's formula. Not an average itself: it is the + unique quintic in `boostAvg` taking the value one at the eigenvalue one and + vanishing at the other five eigenvalues `5/6, 2/3, 1/2, 1/3, 1/6` of + `boostAvg` on the rotation-averaged weight-eight sector, namely + `(324/5) (x - 5/6) (x - 2/3) (x - 1/2) (x - 1/3) (x - 1/6)`. Unlike `boostAvg` + it is idempotent there, which is what pins the sector down. -/ +noncomputable def boostAvgScalarProj : Module.End ℂ JetAlgebra := + (-1 : ℂ) • (1 : Module.End ℂ JetAlgebra) + (137/10 : ℂ) • boostAvg + + (-(135/2) : ℂ) • (boostAvg * boostAvg) + (153 : ℂ) • (boostAvg * boostAvg * boostAvg) + + (-162 : ℂ) • (boostAvg * boostAvg * boostAvg * boostAvg) + + (324/5 : ℂ) • (boostAvg * boostAvg * boostAvg * boostAvg * boostAvg) + +/-- The projector polynomial, termwise. -/ +lemma boostAvgScalarProj_apply (v : JetAlgebra) : + boostAvgScalarProj v = (-1 : ℂ) • v + (137/10 : ℂ) • boostAvg v + + (-(135/2) : ℂ) • boostAvg (boostAvg v) + (153 : ℂ) • boostAvg (boostAvg (boostAvg v)) + + (-162 : ℂ) • boostAvg (boostAvg (boostAvg (boostAvg v))) + + (324/5 : ℂ) • boostAvg (boostAvg (boostAvg (boostAvg (boostAvg v)))) := by + simp only [boostAvgScalarProj, LinearMap.add_apply, LinearMap.smul_apply, Module.End.one_apply, + Module.End.mul_apply] + +/-- The projector fixes every Lorentz-invariant vector: `boostAvg` fixes it and the + coefficients sum to one. -/ +lemma boostAvgScalarProj_apply_of_invariant {y : JetAlgebra} + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : boostAvgScalarProj y = y := by + have hS : boostAvg y = y := boostAvg_apply_of_invariant hinv + rw [boostAvgScalarProj_apply] + simp only [hS] + match_scalars + norm_num + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorsDerivative.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean similarity index 96% rename from Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorsDerivative.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean index 50ce4d2da..efb39aff5 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorsDerivative.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean @@ -5,13 +5,13 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.Projectors +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjectorOnPhotonPairs /-! -# The projector polynomial on the derivative and fermion patterns +# The Lorentz-scalar projector on the derivative and fermion terms -Evaluation of the projector polynomial `opPi` on the eigenvalue patterns of -the second-derivative field strengths (`projDDF*`) and of the fermion -bilinears (`projFMu*`, `projFMubar*`). +Evaluation of the projector polynomial `boostAvgScalarProj` on the eigenvalue patterns of +the second-derivative field strengths (`scalarProjDDF*`) and of the fermion +bilinears (`scalarProjFMu*`, `scalarProjFMubar*`). -/ @[expose] public section @@ -20,7 +20,7 @@ set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -29,7 +29,7 @@ open scoped minkowskiMatrix PauliMatrix open Matrix MatrixGroups set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 0 of the DDF block. -/ -lemma projDDF0 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF0 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -88,7 +88,7 @@ lemma projDDF0 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 1 of the DDF block. -/ -lemma projDDF1 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF1 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -147,7 +147,7 @@ lemma projDDF1 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 2 of the DDF block. -/ -lemma projDDF2 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF2 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -206,7 +206,7 @@ lemma projDDF2 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 3 of the DDF block. -/ -lemma projDDF3 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF3 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -265,7 +265,7 @@ lemma projDDF3 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 4 of the DDF block. -/ -lemma projDDF4 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF4 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -324,7 +324,7 @@ lemma projDDF4 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 5 of the DDF block. -/ -lemma projDDF5 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF5 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -383,7 +383,7 @@ lemma projDDF5 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 6 of the DDF block. -/ -lemma projDDF6 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF6 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -442,7 +442,7 @@ lemma projDDF6 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 7 of the DDF block. -/ -lemma projDDF7 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF7 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -501,7 +501,7 @@ lemma projDDF7 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 8 of the DDF block. -/ -lemma projDDF8 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF8 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -560,7 +560,7 @@ lemma projDDF8 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 9 of the DDF block. -/ -lemma projDDF9 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF9 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -619,7 +619,7 @@ lemma projDDF9 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 10 of the DDF block. -/ -lemma projDDF10 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF10 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -678,7 +678,7 @@ lemma projDDF10 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 11 of the DDF block. -/ -lemma projDDF11 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjDDF11 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) @@ -737,7 +737,7 @@ lemma projDDF11 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 0 of the FMu block. -/ -lemma projFMu0 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMu0 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -784,7 +784,7 @@ lemma projFMu0 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 1 of the FMu block. -/ -lemma projFMu1 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMu1 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -831,7 +831,7 @@ lemma projFMu1 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 2 of the FMu block. -/ -lemma projFMu2 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMu2 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -878,7 +878,7 @@ lemma projFMu2 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 3 of the FMu block. -/ -lemma projFMu3 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMu3 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -925,7 +925,7 @@ lemma projFMu3 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 0 of the FMubar block. -/ -lemma projFMubar0 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMubar0 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -972,7 +972,7 @@ lemma projFMubar0 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 1 of the FMubar block. -/ -lemma projFMubar1 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMubar1 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -1019,7 +1019,7 @@ lemma projFMubar1 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 2 of the FMubar block. -/ -lemma projFMubar2 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMubar2 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -1066,7 +1066,7 @@ lemma projFMubar2 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 3 of the FMubar block. -/ -lemma projFMubar3 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFMubar3 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 : M} (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) @@ -1112,4 +1112,4 @@ lemma projFMubar3 {M : Type*} [AddCommGroup M] [Module ℂ M] match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean new file mode 100644 index 000000000..2db81364a --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean @@ -0,0 +1,311 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjectorOnDerivativesAndFermions +/-! +# The Lorentz-scalar projector on the weight-eight monomials + +The values of `boostAvgScalarProj` on the weight-eight monomials, the entries of the Lorentz +matrices of the rotations by `π`, and the values of the rotation average +`rotationPiAvg` on the weight-eight monomials. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F01_F01`. -/ +lemma boostAvgScalarProj_F01_F01 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF0 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F01_F23`. -/ +lemma boostAvgScalarProj_F01_F23 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (1/24 : ℂ) • thetaTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF1 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F02_F02`. -/ +lemma boostAvgScalarProj_F02_F02 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF2 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F02_F13`. -/ +lemma boostAvgScalarProj_F02_F13 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (-(1/24) : ℂ) • thetaTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF3 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F03_F03`. -/ +lemma boostAvgScalarProj_F03_F03 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = + (-(1/12) : ℂ) • maxwellTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF4 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F03_F12`. -/ +lemma boostAvgScalarProj_F03_F12 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (1/24 : ℂ) • thetaTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF5 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← thetaTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F12_F12`. -/ +lemma boostAvgScalarProj_F12_F12 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + (1/12 : ℂ) • maxwellTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF6 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F13_F13`. -/ +lemma boostAvgScalarProj_F13_F13 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = + (1/12 : ℂ) • maxwellTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF7 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the field-strength square `F23_F23`. -/ +lemma boostAvgScalarProj_F23_F23 : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = + (1/12 : ℂ) • maxwellTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFF8 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 + boostAvg_F13_F13 boostAvg_F23_F23, + ← maxwellTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd01_F01`. -/ +lemma boostAvgScalarProj_dd01_F01 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF0 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd01_F23`. -/ +lemma boostAvgScalarProj_dd01_F23 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF1 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd02_F02`. -/ +lemma boostAvgScalarProj_dd02_F02 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF2 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd02_F13`. -/ +lemma boostAvgScalarProj_dd02_F13 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF3 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd03_F03`. -/ +lemma boostAvgScalarProj_dd03_F03 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF4 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd03_F12`. -/ +lemma boostAvgScalarProj_dd03_F12 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF5 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd12_F03`. -/ +lemma boostAvgScalarProj_dd12_F03 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF6 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd12_F12`. -/ +lemma boostAvgScalarProj_dd12_F12 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF7 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd13_F02`. -/ +lemma boostAvgScalarProj_dd13_F02 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF8 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd13_F13`. -/ +lemma boostAvgScalarProj_dd13_F13 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF9 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd23_F01`. -/ +lemma boostAvgScalarProj_dd23_F01 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF10 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd23_F23`. -/ +lemma boostAvgScalarProj_dd23_F23 : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = + (0 : JetAlgebra) := by + rw [boostAvgScalarProj_apply, + scalarProjDDF11 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 + boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u0`. -/ +lemma boostAvgScalarProj_u0 : + boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (-(Complex.I/4)) • fermionKineticTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFMu0 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u1`. -/ +lemma boostAvgScalarProj_u1 : + boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (Complex.I/4) • fermionKineticTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFMu1 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u2`. -/ +lemma boostAvgScalarProj_u2 : + boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (1/4 : ℂ) • fermionKineticTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFMu2 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u3`. -/ +lemma boostAvgScalarProj_u3 : + boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (Complex.I/4) • fermionKineticTerm := by + rw [boostAvgScalarProj_apply, + scalarProjFMu3 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, + ← fermionKineticTerm_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar0`. -/ +lemma boostAvgScalarProj_ubar0 : + boostAvgScalarProj (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (Complex.I/4) • fermionKineticTermBar := by + rw [boostAvgScalarProj_apply, + scalarProjFMubar0 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar1`. -/ +lemma boostAvgScalarProj_ubar1 : + boostAvgScalarProj (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (-(Complex.I/4)) • fermionKineticTermBar := by + rw [boostAvgScalarProj_apply, + scalarProjFMubar1 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar2`. -/ +lemma boostAvgScalarProj_ubar2 : + boostAvgScalarProj (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (-(1/4) : ℂ) • fermionKineticTermBar := by + rw [boostAvgScalarProj_apply, + scalarProjFMubar2 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, + ← fermionKineticTermBar_eq] + +set_option maxHeartbeats 2000000 in +/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar3`. -/ +lemma boostAvgScalarProj_ubar3 : + boostAvgScalarProj (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (-(Complex.I/4)) • fermionKineticTermBar := by + rw [boostAvgScalarProj_apply, + scalarProjFMubar3 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, + ← fermionKineticTermBar_eq] +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Projectors.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean similarity index 95% rename from Physlib/Particles/QED/JetAlgebra/Invariants/Projectors.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean index b5d1234e2..2f8b477df 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/Projectors.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean @@ -5,14 +5,14 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.SymmetrisedAverage +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjector /-! -# The projector polynomial +# The Lorentz-scalar projector on the photon pairs -`opPi` is the polynomial in `opS` that annihilates every eigenvalue of `opS` +`boostAvgScalarProj` is the polynomial in `boostAvg` that annihilates every eigenvalue of `boostAvg` other than `1`; it therefore fixes the Lorentz-invariant vectors and projects -the weight-eight monomials onto the invariant subspace. The `projFF*`, -`projDDF*` and `projFMu*` lemmas evaluate that polynomial on each eigenvalue +the weight-eight monomials onto the invariant subspace. The `scalarProjFF*`, +`scalarProjDDF*` and `scalarProjFMu*` lemmas evaluate that polynomial on each eigenvalue pattern occurring in the weight-eight basis. -/ @@ -22,7 +22,7 @@ set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -32,7 +32,7 @@ open Matrix MatrixGroups set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 0 of the FF block. -/ -lemma projFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -92,7 +92,7 @@ lemma projFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 1 of the FF block. -/ -lemma projFF1 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF1 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -140,7 +140,7 @@ lemma projFF1 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 2 of the FF block. -/ -lemma projFF2 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF2 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -200,7 +200,7 @@ lemma projFF2 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 3 of the FF block. -/ -lemma projFF3 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF3 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -248,7 +248,7 @@ lemma projFF3 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 4 of the FF block. -/ -lemma projFF4 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF4 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -308,7 +308,7 @@ lemma projFF4 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 5 of the FF block. -/ -lemma projFF5 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF5 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -356,7 +356,7 @@ lemma projFF5 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 6 of the FF block. -/ -lemma projFF6 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF6 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -416,7 +416,7 @@ lemma projFF6 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 7 of the FF block. -/ -lemma projFF7 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF7 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -476,7 +476,7 @@ lemma projFF7 {M : Type*} [AddCommGroup M] [Module ℂ M] set_option maxHeartbeats 2000000 in /-- The abstract projector computation for column 8 of the FF block. -/ -lemma projFF8 {M : Type*} [AddCommGroup M] [Module ℂ M] +lemma scalarProjFF8 {M : Type*} [AddCommGroup M] [Module ℂ M] (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) @@ -533,7 +533,6 @@ lemma projFF8 {M : Type*} [AddCommGroup M] [Module ℂ M] match_scalars <;> norm_num rw [i5, i4, i3, i2, h8] match_scalars <;> norm_num - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean new file mode 100644 index 000000000..f8087f19d --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean @@ -0,0 +1,1233 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnFermionTerms +/-! +# The average over the rotations by `π` + +The average `rotationPiAvg` over the Klein four-group of rotations by `π` +defined in `Subgroups/RotationsPi`. Being a finite subgroup it admits an honest +invariant average — the Reynolds operator — unlike the boosts of +`Averages/BoostAverage`. + +By the averaging principle of `Invariants/GroupAverage` an invariant element of +the span of a family lies in the span of the averages of that family, so it +suffices to evaluate `rotationPiAvg` on the monomials of `Grading/NeutralSectors`. +Every field strength averages to zero, which already settles the weight-four +sector (`eq_zero_of_mem_chargeCovSpan_four`); the values on the weight-eight +monomials are tabulated in the rest of the file. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The average over the rotations by `π`: the mean of the identity and the three + lifted rotations, an honest average over the Klein four-group (its lift to + `SL(2,ℂ)` is the quaternion group, which acts through the same four operators on + the even sectors met here). -/ +noncomputable def rotationPiAvg : Module.End ℂ JetAlgebra := + (4 : ℂ)⁻¹ • (LinearMap.id + repLorentzGroup rotationPiZ + + repLorentzGroup rotationPiY + repLorentzGroup rotationPiX) + +/-- The rotation average, termwise. -/ +lemma rotationPiAvg_apply (v : JetAlgebra) : + rotationPiAvg v = (4 : ℂ)⁻¹ • (v + repLorentzGroup rotationPiZ v + + repLorentzGroup rotationPiY v + repLorentzGroup rotationPiX v) := by + simp only [rotationPiAvg, LinearMap.smul_apply, LinearMap.add_apply, + LinearMap.id_apply] + +/-- The rotation average fixes every Lorentz-invariant element. Its four weights sum + to one, so this is the instance of `Representation.weightedSum_apply_of_invariant` + at the four lifted rotations by `π`. -/ +lemma rotationPiAvg_apply_of_invariant {y : JetAlgebra} + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : rotationPiAvg y = y := by + rw [rotationPiAvg_apply, hinv, hinv, hinv] + module + +/-- The averaging principle for the rotation average: a Lorentz-invariant element of + the span of a family lies in the span of the rotation averages of that family. + This is `Submodule.mem_span_range_of_apply_eq_self` for `rotationPiAvg`. -/ +lemma mem_span_range_rotationPiAvg {ι : Type} {v : ι → JetAlgebra} {y : JetAlgebra} + (hy : y ∈ Submodule.span ℂ (Set.range v)) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : + y ∈ Submodule.span ℂ (Set.range fun i => rotationPiAvg (v i)) := + Submodule.mem_span_range_of_apply_eq_self hy (rotationPiAvg_apply_of_invariant hinv) + +set_option maxHeartbeats 2000000 in +/-- The rotation average annihilates every field strength: `F_{μμ}` vanishes, and for + `μ ≠ ν` the pair `F_{μν}` is odd under two of the three rotations by `π`, so the + four signs cancel. -/ +lemma rotationPiAvg_fieldStrengthDeriv_nil (μ ν : Fin 1 ⊕ Fin 3) : + rotationPiAvg (fieldStrengthDeriv {} μ ν) = 0 := by + rw [rotationPiAvg_apply] + rcases eq_or_ne μ ν with hp | hp + · rw [hp, fieldStrengthDeriv_self] + simp + · rw [repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiZ, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiY, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiX] + have hs : (1 : ℂ) + ((rotationPiSignZ μ * rotationPiSignZ ν : ℝ) : ℂ) + + ((rotationPiSignY μ * rotationPiSignY ν : ℝ) : ℂ) + + ((rotationPiSignX μ * rotationPiSignX ν : ℝ) : ℂ) = 0 := by + rcases μ with μ | μ <;> rcases ν with ν | ν <;> + first + | (exact absurd rfl (by simpa using hp)) + | (fin_cases μ <;> fin_cases ν <;> + simp_all [rotationPiSignZ, rotationPiSignY, rotationPiSignX] <;> + norm_num [Complex.ext_iff] <;> ring) + have hcomb : ∀ (a b c : ℂ) (x : JetAlgebra), + x + a • x + b • x + c • x = (1 + a + b + c) • x := by + intro a b c x + module + rw [hcomb, hs, zero_smul, smul_zero] + +/-- No Lorentz invariant of mass weight four: an invariant combination of the + field strengths `F_{μν}` lies, by the averaging principle, in the span of their + rotation averages, and each of those vanishes. -/ +lemma eq_zero_of_mem_chargeCovSpan_four {y : JetAlgebra} + (hy : y ∈ chargeCovSpan 4 0) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by + have h := mem_span_range_rotationPiAvg (chargeCovSpan_four_le hy) hinv + have hle : Submodule.span ℂ (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + rotationPiAvg (fieldStrengthDeriv {} p.1 p.2)) ≤ ⊥ := by + rw [Submodule.span_le] + rintro _ ⟨p, rfl⟩ + simpa using rotationPiAvg_fieldStrengthDeriv_nil p.1 p.2 + exact (Submodule.mem_bot ℂ).mp (hle h) + + +set_option maxHeartbeats 2000000 in +/-- The rotation average acts diagonally on products of two field strengths, by + the average of the four parity signs. -/ +lemma rotationPiAvg_fieldStrengthDeriv_nil_mul (a b c d : Fin 1 ⊕ Fin 3) : + rotationPiAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = + (((1 + rotationPiSignZ a * rotationPiSignZ b * (rotationPiSignZ c * rotationPiSignZ d) + + rotationPiSignY a * rotationPiSignY b * (rotationPiSignY c * rotationPiSignY d) + + rotationPiSignX a * rotationPiSignX b * (rotationPiSignX c * rotationPiSignX d)) / 4 : ℝ) : ℂ) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_apply_mul, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiZ, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiY, + repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiX, + smul_mul_smul_comm] + push_cast + module + +/-- Under a diagonal Lorentz transformation the second-derivative field + strength scales by the product of the signs of its four indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv_pair {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {ρ, τ} μ ν) = + ((sgn ρ * (sgn τ * (sgn μ * sgn ν)) : ℝ) : ℂ) • + fieldStrengthDeriv {ρ, τ} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_pair] + rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun s _ => + Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by + rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ρ) h)] + rw [Finset.sum_eq_single τ (fun s _ hs => Finset.sum_eq_zero fun a _ => + Finset.sum_eq_zero fun b _ => by + rw [hM s τ, if_neg hs, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ τ) h)] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, mul_zero, mul_zero, Complex.ofReal_zero, + zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, mul_zero, mul_zero, Complex.ofReal_zero, + zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM ρ ρ, if_pos rfl, hM τ τ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, + if_pos rfl] + +/-- The rotation average acts diagonally on the second-derivative field + strengths. -/ +lemma rotationPiAvg_fieldStrengthDeriv_pair (r t a b : Fin 1 ⊕ Fin 3) : + rotationPiAvg (fieldStrengthDeriv {r, t} a b) = + (((1 + rotationPiSignZ r * (rotationPiSignZ t * (rotationPiSignZ a * rotationPiSignZ b)) + + rotationPiSignY r * (rotationPiSignY t * (rotationPiSignY a * rotationPiSignY b)) + + rotationPiSignX r * (rotationPiSignX t * (rotationPiSignX a * rotationPiSignX b))) / 4 : ℝ) : ℂ) • + fieldStrengthDeriv {r, t} a b := by + rw [rotationPiAvg_apply, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_rotationPiZ, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_rotationPiY, + repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_rotationPiX] + push_cast + module + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,0,0]` (u-family). -/ +lemma rotationPiAvg_u_e000 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,0,1]` (u-family). -/ +lemma rotationPiAvg_u_e001 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,1,0]` (u-family). -/ +lemma rotationPiAvg_u_e010 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,1,1]` (u-family). -/ +lemma rotationPiAvg_u_e011 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,0,0]` (u-family). -/ +lemma rotationPiAvg_u_e100 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,0,1]` (u-family). -/ +lemma rotationPiAvg_u_e101 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,1,0]` (u-family). -/ +lemma rotationPiAvg_u_e110 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,1,1]` (u-family). -/ +lemma rotationPiAvg_u_e111 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,0,0]` (u-family). -/ +lemma rotationPiAvg_u_e200 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,0,1]` (u-family). -/ +lemma rotationPiAvg_u_e201 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,1,0]` (u-family). -/ +lemma rotationPiAvg_u_e210 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = + (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,1,1]` (u-family). -/ +lemma rotationPiAvg_u_e211 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,0,0]` (u-family). -/ +lemma rotationPiAvg_u_e300 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0) = + (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,0,1]` (u-family). -/ +lemma rotationPiAvg_u_e301 : + rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,1,0]` (u-family). -/ +lemma rotationPiAvg_u_e310 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,1,1]` (u-family). -/ +lemma rotationPiAvg_u_e311 : + rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = + (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : + JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr + 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ + [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] + 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,0,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e000 : + rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,0,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e001 : + rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,1,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e010 : + rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[0,1,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e011 : + rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,0,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e100 : + rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,0,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e101 : + rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,1,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e110 : + rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[1,1,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e111 : + rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,0,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e200 : + rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,0,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e201 : + rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,1,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e210 : + rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = + (-(1/2) : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[2,1,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e211 : + rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,0,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e300 : + rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0) = + (1/2 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,0,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e301 : + rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,1,0]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e310 : + rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0) = + 0 := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) + +set_option maxHeartbeats 4000000 in +/-- The rotation average of the fermion pair monomial `e[3,1,1]` (ubar-family). -/ +lemma rotationPiAvg_ubar_e311 : + rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = + (-(1/2) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by + rw [rotationPiAvg_apply] + simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, + rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, + rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, + rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, + rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, + rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, + rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, + rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, map_one, map_neg, + Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, + mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, + Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, + zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, + Complex.I_mul_I] + generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : + JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ + [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] + 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ + [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 + match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean new file mode 100644 index 000000000..394d4034a --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.RotationAverage +/-! +# The rotation average weighted against two boosts + +The operator `rotationPiBoostAvg`: the rotation average of +`Averages/RotationAverage` followed by a weighting of the identity against the +two `z`-boosts `boostZ2`, `boostZ3` of `Subgroups/AxisBoosts`. + +The three weights `-13/24, 8/3, -9/8` sum to one, so the operator still fixes +every Lorentz-invariant element, but they are chosen so that +`w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}`, which kills +both eigendirections of the two boosts. Since the boosts are non-compact this +weighting is what stands in for an invariant average — the same device that +`Averages/BoostAverage` uses on the weight-eight sector. It annihilates the +neutral weight-six sector outright (`eq_zero_of_mem_chargeCovSpan_six`). +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The boost-weighted rotation average: an operator fixing every + Lorentz-invariant vector and annihilating the neutral weight-six sector. + The weights `-13/24, 8/3, -9/8` sum to one and are chosen so that + `w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}` + respectively, killing both eigendirections of the two boosts. -/ +noncomputable def rotationPiBoostAvg : Module.End ℂ JetAlgebra := + ((-13/24 : ℂ) • LinearMap.id + (8/3 : ℂ) • repLorentzGroup boostZ2 + + (-9/8 : ℂ) • repLorentzGroup boostZ3) ∘ₗ rotationPiAvg + +/-- The kill operator, termwise. -/ +lemma rotationPiBoostAvg_apply (v : JetAlgebra) : + rotationPiBoostAvg v = (-13/24 : ℂ) • rotationPiAvg v + + (8/3 : ℂ) • repLorentzGroup boostZ2 (rotationPiAvg v) + + (-9/8 : ℂ) • repLorentzGroup boostZ3 (rotationPiAvg v) := by + simp only [rotationPiBoostAvg, LinearMap.comp_apply, LinearMap.add_apply, + LinearMap.smul_apply, LinearMap.id_apply] + +set_option maxHeartbeats 8000000 in +/-- The kill operator annihilates every embedded derivative field strength: + the rotation average kills every component with an odd index pattern, and the + boost combination kills the twelve surviving components. -/ +lemma rotationPiBoostAvg_fieldStrengthDeriv_singleton (ρ μ ν : Fin 1 ⊕ Fin 3) : + rotationPiBoostAvg (fieldStrengthDeriv {ρ} μ ν) = 0 := by + rcases eq_or_ne μ ν with rfl | hμν + · rw [fieldStrengthDeriv_self] + exact map_zero _ + · have hK : rotationPiAvg (fieldStrengthDeriv {ρ} μ ν) = + (((1 + rotationPiSignZ ρ * (rotationPiSignZ μ * rotationPiSignZ ν) + + rotationPiSignY ρ * (rotationPiSignY μ * rotationPiSignY ν) + + rotationPiSignX ρ * (rotationPiSignX μ * rotationPiSignX ν)) / 4 : ℝ) : ℂ) • + fieldStrengthDeriv {ρ} μ ν := by + rw [rotationPiAvg_apply, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_rotationPiZ, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_rotationPiY, + repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_rotationPiX] + push_cast + module + rw [rotationPiBoostAvg_apply, hK, map_smul, map_smul] + rcases ρ with ρ | ρ <;> rcases μ with μ | μ <;> rcases ν with ν | ν <;> + fin_cases ρ <;> fin_cases μ <;> fin_cases ν <;> + first + | (simp only [fieldStrengthDeriv_self, map_zero, smul_zero, add_zero]; done) + | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX]; done) + | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX] + rw [repLorentzGroup_fieldStrengthDeriv_singleton boostZ2, + repLorentzGroup_fieldStrengthDeriv_singleton boostZ3] + simp only [Fintype.sum_sum_type, Fin.sum_univ_three, Fin.sum_univ_one, + toLorentzGroup_boostZ2, toLorentzGroup_boostZ3] + norm_num [boostMatA, boostMatB, fieldStrengthDeriv_self, + fieldStrengthDeriv_inr_inl] + push_cast + module) + +set_option maxHeartbeats 4000000 in +/-- The kill operator annihilates every zero-derivative pair `ψ̄_α ψ_β`: the + rotation average kills the off-diagonal pairs and symmetrises the diagonal + ones, which the boost combination then kills. -/ +lemma rotationPiBoostAvg_Dbarψ_mul_Dψ (α β : Fin 2) : + rotationPiBoostAvg (Dbarψ [] α * Dψ [] β) = 0 := by + rw [rotationPiBoostAvg_apply, rotationPiAvg_apply] + fin_cases α <;> fin_cases β <;> + · simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, map_add, map_smul, + map_sum, rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + boostZ2_inv_coe, boostZ3_inv_coe, Fin.sum_univ_two, Fin.zero_eta, + Fin.mk_one, Matrix.of_apply, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, + star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, + Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, + neg_neg, + zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, + Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] + try push_cast + try module + +set_option maxHeartbeats 4000000 in +/-- The kill operator annihilates every zero-derivative pair `ψ_α ψ̄_β`. -/ +lemma rotationPiBoostAvg_Dψ_mul_Dbarψ (α β : Fin 2) : + rotationPiBoostAvg (Dψ [] α * Dbarψ [] β) = 0 := by + rw [rotationPiBoostAvg_apply, rotationPiAvg_apply] + fin_cases α <;> fin_cases β <;> + · simp only [repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, map_add, map_smul, + map_sum, rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, + boostZ2_inv_coe, boostZ3_inv_coe, Fin.sum_univ_two, Fin.zero_eta, + Fin.mk_one, Matrix.of_apply, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, + star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, + Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, + neg_neg, + zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, + Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] + try push_cast + try module + +/-- No Lorentz invariant of mass weight six: an invariant combination of the + field-strength derivatives `∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β` + vanishes. -/ +lemma eq_zero_of_mem_chargeCovSpan_six {y : JetAlgebra} + (hy : y ∈ chargeCovSpan 6 0) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by + have h := chargeCovSpan_six_le hy + rw [Submodule.span_union, Submodule.span_union] at h + obtain ⟨u, hu, w, hw, hy'⟩ := Submodule.mem_sup.mp h + obtain ⟨u1, hu1, u2, hu2, hu'⟩ := Submodule.mem_sup.mp hu + obtain ⟨a, ha⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu1 + obtain ⟨d, hd⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu2 + obtain ⟨e, he⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw + have hKy : rotationPiAvg y = y := by + rw [rotationPiAvg_apply, hinv rotationPiZ, hinv rotationPiY, hinv rotationPiX] + module + have hself : rotationPiBoostAvg y = y := by + rw [rotationPiBoostAvg_apply, hKy, hinv boostZ2, hinv boostZ3] + module + have hkill : rotationPiBoostAvg y = 0 := by + rw [← hy', ← hu', ← ha, ← hd, ← he] + simp only [map_add, map_sum, map_smul, rotationPiBoostAvg_fieldStrengthDeriv_singleton, + rotationPiBoostAvg_Dbarψ_mul_Dψ, rotationPiBoostAvg_Dψ_mul_Dbarψ, smul_zero, + Finset.sum_const_zero, add_zero] + exact hself.symm.trans hkill + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean new file mode 100644 index 000000000..f2b9bca08 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.GroupAverage +/-! +# The renormalizable terms of the lepton–gauge-sector jet algebra + +The four gauge- and Lorentz-invariant elements of mass dimension at most four — +the Maxwell term, the theta term and the two fermion kinetic terms, defined in +`Terms/` — collected into one set, together with the easy half of the +classification: their span is contained in `InvariantMassWeightSubmodule 8`. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The invariants of the lepton–gauge-sector jet algebra of mass dimension at most four: the + constants and the four kinetic terms. These span + `InvariantMassWeightSubmodule 8`, the renormalizable Lagrangian densities of the lepton–gauge sector. -/ +def massDimFourInvariants : Set JetAlgebra := + {1, maxwellTerm, thetaTerm, fermionKineticTerm, fermionKineticTermBar} + +/-- Every element of `massDimFourInvariants` is gauge and Lorentz invariant. -/ +lemma isInvariant_of_mem_massDimFourInvariants {x : JetAlgebra} + (hx : x ∈ massDimFourInvariants) : IsInvariant x := by + rcases hx with rfl | rfl | rfl | rfl | rfl + · exact ⟨fun U => (repJetGaugeGroupI_eq_repAlgHom U 1).trans (repAlgHom U).map_one, + repLorentzGroup_apply_one⟩ + · exact ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ + · exact ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ + · exact ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ + · exact ⟨repJetGaugeGroupI_fermionKineticTermBar, + repLorentzGroup_fermionKineticTermBar⟩ + +lemma span_massDimFourInvariants_le : + Submodule.span ℂ massDimFourInvariants ≤ InvariantMassWeightSubmodule 8 := by + rw [Submodule.span_le] + intro x hx + refine Submodule.mem_inf.mpr ⟨?_, Submodule.subset_span + (isInvariant_of_mem_massDimFourInvariants hx)⟩ + rcases hx with rfl | rfl | rfl | rfl | rfl + · exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 0) (Nat.zero_le 8) + fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one + · exact maxwellTerm_mem_massWeightLESubmodule + · exact thetaTerm_mem_massWeightLESubmodule + · exact fermionKineticTerm_mem_massWeightLESubmodule + · exact fermionKineticTermBar_mem_massWeightLESubmodule + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Decomposition.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean similarity index 90% rename from Physlib/Particles/QED/JetAlgebra/Invariants/Decomposition.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean index 8f60c3a44..4a546b7a4 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/Decomposition.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean @@ -5,17 +5,21 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.Basic +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Basic /-! -# Weight and charge decomposition of the QED jet algebra - -The machinery for the converse inclusion. An element of -`MassWeightLESubmodule n` decomposes uniquely into eigenvectors of -`massWeightScale`, each of which lies in the span `covMonomialSpan w` of -covariant monomials of exact weight `w`; each of those decomposes further into -hypercharge eigenspaces `chargeCovSpan w k`. Both decompositions are -compatible with the Lorentz and gauge actions, so an invariant element is a -sum of invariant components. +# The mass-weight and hypercharge gradings + +The machinery for the converse inclusion. That an element of +`MassWeightLESubmodule n` decomposes into eigenvectors of `massWeightScale` is +not special to the invariants and lives with the grading itself, in +`LeptonGaugeSector.JetAlgebra.exists_eigen_decomp_of_mem_massWeightLESubmodule` in +`LeptonGaugeSector/JetAlgebra/MassDim`, along with the independence of the powers `c ^ w` that +gives it. What is added here is the refinement specific to the classification: +each eigenvector lies in the span `covMonomialSpan w` of covariant monomials of +exact weight `w`, and each of those decomposes further into hypercharge +eigenspaces `chargeCovSpan w k`. Both decompositions are compatible with the +Lorentz and gauge actions, so an invariant element is a sum of invariant +components. The selection rules `eq_zero_of_eq_smul_of_ne_one`, `eq_zero_of_charge_ne_zero` and the parity rule `eq_zero_of_mem_covMonomialSpan_odd` kill all components @@ -26,7 +30,7 @@ except those of even weight and zero charge. set_option maxHeartbeats 1000000 -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -45,58 +49,6 @@ the weight-`≤ n` submodule decomposes into exact-weight eigenvectors. -/ -/-- If a finite combination of vectors weighted by powers of `c` vanishes for - all `c`, each component vanishes. -/ -lemma eq_zero_of_forall_sum_pow_smul_eq_zero (s : Finset ℕ) (v : ℕ → JetAlgebra) - (h : ∀ c : ℂ, ∑ w ∈ s, c ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : v w = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hp : ∀ c : ℂ, Polynomial.eval c - (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by - intro c - have h2 := congrArg φ (h c) - rw [map_sum, map_zero] at h2 - rw [Polynomial.eval_finsetSum] - simpa [Polynomial.eval_monomial, mul_comm] using h2 - have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := - Polynomial.funext fun c => by rw [hp c, Polynomial.eval_zero] - have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff - -/-- Every element of the weight-`≤ n` submodule is a sum of exact-weight - eigenvectors of the mass-dimension scaling. -/ -lemma exists_eigen_decomp_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} - (hx : x ∈ MassWeightLESubmodule n) : - ∃ z : ℕ → JetAlgebra, - (∀ m, ∀ c : ℂ, massWeightScale c (z m) = c ^ m • z m) ∧ - x = ∑ m ∈ Finset.range (n + 1), z m := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨m, hmn, hym⟩ := hy - refine ⟨fun k => if k = m then y else 0, fun k c => ?_, ?_⟩ - · by_cases hk : k = m - · subst hk - simpa using hym c - · simp [hk] - · rw [Finset.sum_ite_eq' (Finset.range (n + 1)) m fun _ => y, - if_pos (Finset.mem_range.mpr (Nat.lt_succ_of_le hmn))] - | zero => - exact ⟨fun _ => 0, by simp, by simp⟩ - | add a b ha hb iha ihb => - obtain ⟨z₁, hz₁, rfl⟩ := iha - obtain ⟨z₂, hz₂, rfl⟩ := ihb - refine ⟨z₁ + z₂, fun m c => ?_, ?_⟩ - · simp only [Pi.add_apply, map_add, hz₁ m c, hz₂ m c, smul_add] - · rw [← Finset.sum_add_distrib] - rfl - | smul c a ha iha => - obtain ⟨z, hz, rfl⟩ := iha - refine ⟨c • z, fun m c' => ?_, ?_⟩ - · simp only [Pi.smul_apply, map_smul, hz m c', smul_comm c] - · rw [Finset.smul_sum] - rfl - /-- The span of the covariant monomials of exact mass weight `w`: products of field-strength derivatives and covariant derivatives of total weight `w`. -/ noncomputable def covMonomialSpan (w : ℕ) : Submodule ℂ JetAlgebra := @@ -481,7 +433,7 @@ lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} zpow_add₀ (hz g)] /-- The constant gauge transformation with `u(0) = i`. -/ -noncomputable def parityGauge : GaugeGroupI := +noncomputable def fermionParityGauge : GaugeGroupI := (1, 1, ⟨Complex.I, by rw [Unitary.mem_iff] constructor <;> @@ -489,9 +441,9 @@ noncomputable def parityGauge : GaugeGroupI := /-- The parity gauge transformation acts by `-1` on every odd-weight covariant monomial. -/ -lemma rep_parityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) +lemma rep_fermionParityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = -y := by + repJetGaugeGroupI (JetGaugeGroupI.ofConstant fermionParityGauge) y = -y := by induction hy using Submodule.span_induction with | mem u hu => obtain ⟨hu1, hu2⟩ := hu @@ -504,8 +456,8 @@ lemma rep_parityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) have hkodd : Odd k := by rw [Int.odd_iff] omega - rw [hg parityGauge, - show ((parityGauge.2.2 : ℂ)) = Complex.I from rfl, + rw [hg fermionParityGauge, + show ((fermionParityGauge.2.2 : ℂ)) = Complex.I from rfl, show (6 : ℤ) * k = 2 * (3 * k) from by ring, _root_.zpow_mul, show Complex.I ^ (2 : ℤ) = -1 from by rw [show (2 : ℤ) = ((2 : ℕ) : ℤ) from rfl, zpow_natCast, Complex.I_sq], @@ -521,9 +473,9 @@ lemma rep_parityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) invariants. -/ lemma eq_zero_of_mem_covMonomialSpan_odd {m : ℕ} (hm : m % 2 = 1) {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) - (hinv : repJetGaugeGroupI (JetGaugeGroupI.ofConstant parityGauge) y = y) : + (hinv : repJetGaugeGroupI (JetGaugeGroupI.ofConstant fermionParityGauge) y = y) : y = 0 := by - have h := (rep_parityGauge_eq_neg_of_mem_covMonomialSpan hm hy).symm.trans hinv + have h := (rep_fermionParityGauge_eq_neg_of_mem_covMonomialSpan hm hy).symm.trans hinv have h2 : (2 : ℂ) • y = 0 := by calc (2 : ℂ) • y = y + y := two_smul ℂ y _ = -y + y := congrArg (· + y) h.symm @@ -814,4 +766,4 @@ lemma mem_chargeCovSpan_zero_of_invariant {m : ℕ} {y : JetAlgebra} exact hv 0 end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean new file mode 100644 index 000000000..16206dae4 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean @@ -0,0 +1,357 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Grading.MassWeightAndHypercharge +/-! +# The neutral sectors of weight at most eight + +The charge-zero covariant monomials of each even weight up to eight: the field +strengths `F_{μν}` at weight four, the derivatives `∂_ρ F_{μν}` and the fermion +pairs `ψ̄_α ψ_β` at weight six, and the products `F F`, the second derivatives +`∂_ρ ∂_τ F_{μν}` and the one-derivative fermion pairs at weight eight +(`chargeCovSpan_four_le`, `chargeCovSpan_six_le`, `chargeCovSpan_eight_le`). + +This is the reduction step of the classification: it replaces "an invariant of +weight `m` and hypercharge zero" by a *finite explicit spanning family*, on +which the subgroups of `Subgroups/` and the averages of `Averages/` can then be +computed one monomial at a time. That the weight-four and weight-six sectors +contain no invariant at all is proved where the relevant average is defined, in +`Averages/RotationAverage` and `Averages/RotationPiBoostAverage`. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +## The Lorentz analysis of the neutral sectors + +TODO: the remaining sector lemmas. The charge-zero covariant monomials of +weight four are the field strengths `F_{μν}`, of weight six the derivatives +`∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β`, of weight eight the products +`F F`, the second derivatives `∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion +pairs. Lorentz invariance kills the weight-four and weight-six sectors and +reduces the weight-eight sector to the span of the Maxwell term, the theta +term, and the two fermion kinetic terms. + +-/ + +/-- Each invariant generator is a weight eigenvector of weight at least + three. -/ +lemma exists_weight_of_mem_invariantGenerators {g : JetAlgebra} + (hg : g ∈ invariantGenerators) : + ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c g = c ^ w • g := by + rcases hg with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact ⟨4 + 2 * Multiset.card p.1, by omega, + fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dψ c p.1 p.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + +/-- The product of a list of invariant generators is a weight eigenvector of + weight at least three times the length. -/ +lemma exists_weight_of_list_prod {l : List JetAlgebra} + (hl : ∀ g ∈ l, g ∈ invariantGenerators) : + ∃ w, 3 * l.length ≤ w ∧ + ∀ c : ℂ, massWeightScale c l.prod = c ^ w • l.prod := by + induction l with + | nil => + exact ⟨0, by simp, fun c => by + rw [List.prod_nil, pow_zero, one_smul] + exact (massWeightScale c).map_one⟩ + | cons g l ih => + obtain ⟨wg, hwg3, hwg⟩ := exists_weight_of_mem_invariantGenerators + (hl g List.mem_cons_self) + obtain ⟨wl, hwl3, hwl⟩ := ih fun x hx => hl x (List.mem_cons_of_mem g hx) + refine ⟨wg + wl, by simp only [List.length_cons]; omega, fun c => ?_⟩ + rw [List.prod_cons] + exact massWeightScale_mul_eigen hwg hwl c + +/-- The constant gauge character of a product of two lepton factors: charge + two. -/ +lemma rep_ofConstant_Dψ_mul_Dψ (g : GaugeGroupI) (l l' : List (Fin 1 ⊕ Fin 3)) + (α β : Fin 2) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dψ l α * Dψ l' β) = + ((g.2.2 : ℂ)) ^ (6 * (2 : ℤ)) • (Dψ l α * Dψ l' β) := by + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, + JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, + SubmonoidClass.coe_pow, smul_mul_smul_comm, ← pow_add, + show (6 * (2 : ℤ)) = ((12 : ℕ) : ℤ) from rfl, zpow_natCast] + +/-- The constant gauge character of a product of two conjugate lepton factors: + charge minus two. -/ +lemma rep_ofConstant_Dbarψ_mul_Dbarψ (g : GaugeGroupI) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dbarψ l α * Dbarψ l' β) = + ((g.2.2 : ℂ)) ^ (6 * (-2 : ℤ)) • (Dbarψ l α * Dbarψ l' β) := by + have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := + eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, + JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, + SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← pow_add, + hinv, inv_pow, show (6 + 6 : ℕ) = 12 from rfl, + show (6 * (-2 : ℤ)) = -((12 : ℕ) : ℤ) from rfl, _root_.zpow_neg, zpow_natCast] + +/-- The weight-four neutral sector: spanned by the embedded field strengths. -/ +lemma chargeCovSpan_four_le : + chargeCovSpan 4 0 ≤ Submodule.span ℂ + (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {} p.1 p.2) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, -⟩ + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', t⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 0 + · rw [Multiset.card_eq_zero.mp hcard] + exact Submodule.subset_span ⟨(p.2.1, p.2.2), rfl⟩ + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + rw [eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega)] + exact Submodule.zero_mem _ + +set_option maxHeartbeats 4000000 in +/-- The weight-six neutral sector: spanned by the first derivatives of the + field strength and the zero-derivative lepton pairs. -/ +lemma chargeCovSpan_six_le : + chargeCovSpan 6 0 ≤ Submodule.span ℂ + ((Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {p.1} p.2.1 p.2.2) ∪ + (Set.range fun p : Fin 2 × Fin 2 => Dbarψ [] p.1 * Dψ [] p.2) ∪ + (Set.range fun p : Fin 2 × Fin 2 => Dψ [] p.1 * Dbarψ [] p.2)) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, hy3⟩ + simp only [mul_zero, zpow_zero, one_smul] at hy3 + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 1 + · obtain ⟨ρ, hρ⟩ := Multiset.card_eq_one.mp hcard + rw [hρ] + exact Submodule.subset_span (Or.inl (Or.inl ⟨(ρ, p.2.1, p.2.2), rfl⟩)) + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with + (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> + dsimp only at hy2 hy3 ⊢ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) + (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 + · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] + exact Submodule.subset_span (Or.inr ⟨(p.2, q.2), rfl⟩) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 + · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] + exact Submodule.subset_span (Or.inl (Or.inr ⟨(p.2, q.2), rfl⟩)) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) + (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + rw [eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega)] + exact Submodule.zero_mem _ + +set_option maxHeartbeats 4000000 in +/-- The weight-eight neutral sector: spanned by the field-strength squares, the + second derivatives of the field strength, and the one-derivative lepton + pairs. -/ +lemma chargeCovSpan_eight_le : + chargeCovSpan 8 0 ≤ Submodule.span ℂ + ((Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × + (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {} p.1.1 p.1.2 * fieldStrengthDeriv {} p.2.1 p.2.2) ∪ + (Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × + (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv {p.1.1, p.1.2} p.2.1 p.2.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dbarψ [] p.1.1 * Dψ [p.2] p.1.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dψ [p.2] p.1.2 * Dbarψ [] p.1.1) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dψ [] p.1.1 * Dbarψ [p.2] p.1.2) ∪ + (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => + Dbarψ [p.2] p.1.2 * Dψ [] p.1.1)) := by + rw [chargeCovSpan, Submodule.span_le] + rintro y ⟨hy1, hy2, hy3⟩ + simp only [mul_zero, zpow_zero, one_smul] at hy3 + obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 + subst hprod + rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ + · rw [List.prod_nil] at hy2 ⊢ + rw [eq_zero_of_eigen_ne (m := 0) + (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) + hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + dsimp only at hy2 ⊢ + · by_cases hcard : Multiset.card p.1 = 2 + · obtain ⟨ρ, τ, hρτ⟩ := Multiset.card_eq_two.mp hcard + rw [hρτ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl + (Or.inr ⟨((ρ, τ), p.2.1, p.2.2), rfl⟩))))) + · rw [eq_zero_of_eigen_ne + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ + rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> + rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with + (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> + dsimp only at hy2 hy3 ⊢ + · by_cases hcard : Multiset.card p.1 = 0 ∧ Multiset.card q.1 = 0 + · rw [Multiset.card_eq_zero.mp hcard.1, Multiset.card_eq_zero.mp hcard.2] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl + (Or.inl ⟨((p.2.1, p.2.2), q.2.1, q.2.2), rfl⟩))))) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) + (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 + rw [List.length_eq_zero_iff.mp hlen.1, hμ] + exact Submodule.subset_span (Or.inl (Or.inr ⟨((p.2, q.2), μ), rfl⟩)) + · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 + rw [List.length_eq_zero_iff.mp hlen'.2, hμ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inr + ⟨((q.2, p.2), μ), rfl⟩))) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dψ c p.1 p.2) + (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + (by omega)] + exact Submodule.zero_mem _ + · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 + rw [List.length_eq_zero_iff.mp hlen.1, hμ] + exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inr + ⟨((p.2, q.2), μ), rfl⟩)))) + · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 + · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 + rw [List.length_eq_zero_iff.mp hlen'.2, hμ] + exact Submodule.subset_span (Or.inr ⟨((q.2, p.2), μ), rfl⟩) + · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen + (fun c => massWeightScale_Dbarψ c p.1 p.2) + (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + exact Submodule.zero_mem _ + · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) + (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] + exact Submodule.zero_mem _ + · have h0 : (g :: g' :: g'' :: t).prod = 0 := by + obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl + exact eq_zero_of_eigen_ne hweig hy2 (by + simp only [List.length_cons] at hw + omega) + exact Set.mem_of_eq_of_mem h0 (Submodule.zero_mem _) + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean new file mode 100644 index 000000000..2792396bb --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 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 Mathlib.RepresentationTheory.Basic +public import Mathlib.LinearAlgebra.Span.Basic +/-! +# Averaging an invariant vector over a spanning set + +The classification of invariants of a representation rests on a single +observation. Suppose a vector `y` is known to lie in the span of a set `s`, and +suppose `f` is a linear operator built from the group action which fixes `y`. +Then + +`y = f y ∈ f '' (span s) = span (f '' s)`, + +so `y` already lies in the span of the *transformed* set, and it suffices to +compute `f v` for the — usually far fewer, or far simpler — elements `v` of `s`. +This is `Submodule.mem_span_image_of_apply_eq_self`. + +The operators `f` to which this is applied come in two flavours, both provided +here. + +* The average `Representation.subgroupAverage` over a finite subgroup `S`, the + Reynolds operator `α_S = |S|⁻¹ ∑_{g ∈ S} ρ g`. Every `S`-invariant vector is + fixed by it, giving the theorem in its familiar form: an invariant `y` in the + span of `v i` lies in the span of the averages `α_S (v i)` + (`Representation.mem_span_range_subgroupAverage`). +* More generally `Representation.weightedSum`, a combination `∑ w i • ρ (g i)` + of finitely many group elements whose weights sum to one. This still fixes + every invariant vector, but does not require the elements to form a finite + subgroup — which matters when the group is non-compact and carries no + invariant average, as for the Lorentz boosts. The weights are then free + parameters, and can be chosen to annihilate whatever else one wishes. + +Polynomials in an operator that fixes `y` again fix `y` provided their +coefficients sum to one (`Module.End.sum_smul_pow_apply_of_apply_eq_self`), so +spectral projectors built this way are covered too — `boostAvgScalarProj` of +`Averages/BoostAvgProjector` is one. + +Nothing here is specific to this sector; the file sits at the root of `Invariants/` +because that is where the principle is used, and every other file in the +folder is an instance of it. +-/ + +@[expose] public section + +namespace Submodule + +variable {R M : Type*} [Semiring R] [AddCommMonoid M] [Module R M] + +/-- **The averaging principle.** A vector in the span of `s` which is fixed by a + linear endomorphism `f` lies in the span of the image `f '' s`. -/ +theorem mem_span_image_of_apply_eq_self {s : Set M} {f : M →ₗ[R] M} {y : M} + (hy : y ∈ span R s) (hfy : f y = y) : y ∈ span R (f '' s) := by + rw [span_image] + exact ⟨y, hy, hfy⟩ + +/-- The averaging principle for a spanning family: a vector in the span of the + `v i` which is fixed by `f` lies in the span of the `f (v i)`. -/ +theorem mem_span_range_of_apply_eq_self {ι : Type*} {v : ι → M} {f : M →ₗ[R] M} {y : M} + (hy : y ∈ span R (Set.range v)) (hfy : f y = y) : + y ∈ span R (Set.range fun i => f (v i)) := by + rw [show (Set.range fun i => f (v i)) = f '' Set.range v from Set.range_comp f v] + exact mem_span_image_of_apply_eq_self hy hfy + +end Submodule + +namespace Module.End + +variable {R M ι : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + +/-- A power of an operator fixing `v` fixes `v`. -/ +lemma pow_apply_of_apply_eq_self {f : Module.End R M} {v : M} (hf : f v = v) : + ∀ n : ℕ, (f ^ n) v = v + | 0 => by simp + | n + 1 => by + rw [pow_succ, Module.End.mul_apply, hf, pow_apply_of_apply_eq_self hf n] + +/-- A polynomial in an operator fixing `v`, with coefficients summing to one, fixes + `v`. Spectral projectors are of this form. -/ +lemma sum_smul_pow_apply_of_apply_eq_self {f : Module.End R M} {v : M} (hf : f v = v) + {s : Finset ι} {c : ι → R} {n : ι → ℕ} (hc : ∑ i ∈ s, c i = 1) : + (∑ i ∈ s, c i • f ^ n i) v = v := by + rw [LinearMap.sum_apply, + Finset.sum_congr rfl fun i _ => by + rw [LinearMap.smul_apply, pow_apply_of_apply_eq_self hf], ← Finset.sum_smul, hc, one_smul] + +end Module.End + +namespace Representation + +variable {R G M ι : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + +section Monoid + +variable [Monoid G] + +/-- A weighted combination `∑ w i • ρ (g i)` of the operators of a representation. -/ +noncomputable def weightedSum (ρ : Representation R G M) (s : Finset ι) (w : ι → R) (g : ι → G) : + M →ₗ[R] M := + ∑ i ∈ s, w i • ρ (g i) + +lemma weightedSum_apply (ρ : Representation R G M) (s : Finset ι) (w : ι → R) (g : ι → G) (v : M) : + ρ.weightedSum s w g v = ∑ i ∈ s, w i • ρ (g i) v := by + simp [weightedSum, LinearMap.sum_apply] + +/-- A weighted combination of group elements whose weights sum to one fixes every + vector invariant under those elements. No subgroup, and no compactness, is + needed. -/ +lemma weightedSum_apply_of_invariant {ρ : Representation R G M} {s : Finset ι} {w : ι → R} + {g : ι → G} {v : M} (hw : ∑ i ∈ s, w i = 1) (hv : ∀ i ∈ s, ρ (g i) v = v) : + ρ.weightedSum s w g v = v := by + rw [weightedSum_apply, Finset.sum_congr rfl fun i hi => by rw [hv i hi], ← Finset.sum_smul, hw, + one_smul] + +/-- An invariant vector in the span of `s` lies in the span of the image of `s` under + any weighted combination of group elements fixing it. -/ +theorem mem_span_image_weightedSum {ρ : Representation R G M} {s : Finset ι} {w : ι → R} + {g : ι → G} {t : Set M} {y : M} (hy : y ∈ Submodule.span R t) (hw : ∑ i ∈ s, w i = 1) + (hv : ∀ i ∈ s, ρ (g i) y = y) : + y ∈ Submodule.span R (ρ.weightedSum s w g '' t) := + Submodule.mem_span_image_of_apply_eq_self hy (weightedSum_apply_of_invariant hw hv) + +end Monoid + +section Subgroup + +variable [Group G] + +/-- The average of a representation over a finite subgroup, `α_S = |S|⁻¹ ∑_{g ∈ S} ρ g`. -/ +noncomputable def subgroupAverage (ρ : Representation R G M) (S : Subgroup G) [Fintype S] + [Invertible (Fintype.card S : R)] : M →ₗ[R] M := + ρ.weightedSum Finset.univ (fun _ : S => ⅟(Fintype.card S : R)) (fun h => (h : G)) + +lemma subgroupAverage_apply (ρ : Representation R G M) (S : Subgroup G) [Fintype S] + [Invertible (Fintype.card S : R)] (v : M) : + ρ.subgroupAverage S v = ∑ g : S, ⅟(Fintype.card S : R) • ρ (g : G) v := + weightedSum_apply _ _ _ _ v + +/-- The average over a subgroup fixes every vector invariant under that subgroup. -/ +lemma subgroupAverage_apply_of_invariant {ρ : Representation R G M} {S : Subgroup G} [Fintype S] + [Invertible (Fintype.card S : R)] {v : M} (hv : ∀ g ∈ S, ρ g v = v) : + ρ.subgroupAverage S v = v := by + refine weightedSum_apply_of_invariant ?_ fun g _ => hv (g : G) g.2 + rw [Finset.sum_const, Finset.card_univ, nsmul_eq_mul, mul_invOf_self] + +/-- **Averaging over a subgroup.** If `y` lies in the span of `t` and is invariant + under a finite subgroup `S`, then `y` lies in the span of the averaged set + `α_S '' t`. -/ +theorem mem_span_image_subgroupAverage {ρ : Representation R G M} {S : Subgroup G} [Fintype S] + [Invertible (Fintype.card S : R)] {t : Set M} {y : M} (hy : y ∈ Submodule.span R t) + (hinv : ∀ g ∈ S, ρ g y = y) : + y ∈ Submodule.span R (ρ.subgroupAverage S '' t) := + Submodule.mem_span_image_of_apply_eq_self hy (subgroupAverage_apply_of_invariant hinv) + +/-- **Averaging over a subgroup**, for a spanning family: an invariant `y` in the span + of the `v i` lies in the span of the averages `α_S (v i)`. -/ +theorem mem_span_range_subgroupAverage {ρ : Representation R G M} {S : Subgroup G} [Fintype S] + [Invertible (Fintype.card S : R)] {v : ι → M} {y : M} + (hy : y ∈ Submodule.span R (Set.range v)) (hinv : ∀ g ∈ S, ρ g y = y) : + y ∈ Submodule.span R (Set.range fun i => ρ.subgroupAverage S (v i)) := + Submodule.mem_span_range_of_apply_eq_self hy (subgroupAverage_apply_of_invariant hinv) + +end Subgroup + +end Representation diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Membership.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean similarity index 54% rename from Physlib/Particles/QED/JetAlgebra/Invariants/Membership.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean index 47da6fb0b..cdf2cf909 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/Membership.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean @@ -5,13 +5,13 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.KleinAverage +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjectorOnMonomials /-! # The projected weight-eight monomials lie in the span -Every weight-eight monomial, after Klein-averaging and applying the projector -`opPi`, lands in the span of the four renormalizable invariants. Together with -`opPi_apply_of_invariant` this is the last input to the classification +Every weight-eight monomial, after averaging over the rotations by `π` and applying the projector +`boostAvgScalarProj`, lands in the span of the four renormalizable invariants. Together with +`boostAvgScalarProj_apply_of_invariant` this is the last input to the classification theorem. -/ @@ -21,7 +21,7 @@ set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -49,1188 +49,1196 @@ lemma fermionKineticTermBar_mem_span : fermionKineticTermBar ∈ Submodule.span ℂ massDimFourInvariants := Submodule.subset_span (by simp [massDimFourInvariants]) +/-- Pulling a sign out of a jet-algebra product on the right. The generic + `mul_neg` does not fire here: the multiplication comes from the tensor-product + instance, which typeclass search does not connect to `HasDistribNeg`. -/ +lemma jetMul_neg (u v : JetAlgebra) : u * -v = -(u * v) := by grind + +/-- Pulling a sign out of a jet-algebra product on the left; see `jetMul_neg`. -/ +lemma jetNeg_mul (u v : JetAlgebra) : -u * v = -(u * v) := by grind + /-- Projector membership for the ordered square `F01 * F01`. -/ -lemma opPi_FF_c0101_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c0101_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F01_F01] + rw [boostAvgScalarProj_F01_F01] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F01 * F10`. -/ -lemma opPi_FF_c0110_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c0110_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F01_F01] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F01_F01] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F10 * F01`. -/ -lemma opPi_FF_c1001_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c1001_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F01_F01] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F01_F01] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F10 * F10`. -/ -lemma opPi_FF_c1010_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c1010_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F01_F01] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F01_F01] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F01 * F23`. -/ -lemma opPi_FF_c0123_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c0123_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F01_F23] + rw [boostAvgScalarProj_F01_F23] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F01 * F32`. -/ -lemma opPi_FF_c0132_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c0132_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F01_F23] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F01_F23] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F10 * F23`. -/ -lemma opPi_FF_c1023_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c1023_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F01_F23] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F01_F23] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F10 * F32`. -/ -lemma opPi_FF_c1032_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c1032_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F01_F23] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F01_F23] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F23 * F01`. -/ -lemma opPi_FF_c2301_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c2301_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] + rw [boostAvgScalarProj_F01_F23] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F23 * F10`. -/ -lemma opPi_FF_c2310_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c2310_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] + rw [boostAvgScalarProj_F01_F23] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F32 * F01`. -/ -lemma opPi_FF_c3201_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c3201_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] + rw [boostAvgScalarProj_F01_F23] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F32 * F10`. -/ -lemma opPi_FF_c3210_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c3210_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F01_F23] + rw [boostAvgScalarProj_F01_F23] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F23 * F23`. -/ -lemma opPi_FF_c2323_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c2323_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F23_F23] + rw [boostAvgScalarProj_F23_F23] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F23 * F32`. -/ -lemma opPi_FF_c2332_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c2332_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F23_F23] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F23_F23] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F32 * F23`. -/ -lemma opPi_FF_c3223_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c3223_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F23_F23] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F23_F23] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F32 * F32`. -/ -lemma opPi_FF_c3232_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c3232_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F23_F23] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F23_F23] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F02 * F02`. -/ -lemma opPi_FF_c0202_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c0202_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F02_F02] + rw [boostAvgScalarProj_F02_F02] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F02 * F20`. -/ -lemma opPi_FF_c0220_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c0220_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F02_F02] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F02_F02] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F20 * F02`. -/ -lemma opPi_FF_c2002_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c2002_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F02_F02] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F02_F02] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F20 * F20`. -/ -lemma opPi_FF_c2020_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c2020_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F02_F02] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F02_F02] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F02 * F13`. -/ -lemma opPi_FF_c0213_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c0213_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F02_F13] + rw [boostAvgScalarProj_F02_F13] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F02 * F31`. -/ -lemma opPi_FF_c0231_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c0231_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F02_F13] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F02_F13] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F20 * F13`. -/ -lemma opPi_FF_c2013_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c2013_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F02_F13] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F02_F13] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F20 * F31`. -/ -lemma opPi_FF_c2031_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c2031_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F02_F13] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F02_F13] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F13 * F02`. -/ -lemma opPi_FF_c1302_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c1302_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] + rw [boostAvgScalarProj_F02_F13] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F13 * F20`. -/ -lemma opPi_FF_c1320_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c1320_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] + rw [boostAvgScalarProj_F02_F13] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F31 * F02`. -/ -lemma opPi_FF_c3102_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c3102_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] + rw [boostAvgScalarProj_F02_F13] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F31 * F20`. -/ -lemma opPi_FF_c3120_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c3120_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F02_F13] + rw [boostAvgScalarProj_F02_F13] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F13 * F13`. -/ -lemma opPi_FF_c1313_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c1313_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F13_F13] + rw [boostAvgScalarProj_F13_F13] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F13 * F31`. -/ -lemma opPi_FF_c1331_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c1331_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F13_F13] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F13_F13] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F31 * F13`. -/ -lemma opPi_FF_c3113_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c3113_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F13_F13] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F13_F13] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F31 * F31`. -/ -lemma opPi_FF_c3131_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c3131_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F13_F13] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F13_F13] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F03 * F03`. -/ -lemma opPi_FF_c0303_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c0303_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F03_F03] + rw [boostAvgScalarProj_F03_F03] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F03 * F30`. -/ -lemma opPi_FF_c0330_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c0330_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F03_F03] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F03_F03] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F30 * F03`. -/ -lemma opPi_FF_c3003_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c3003_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F03_F03] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F03_F03] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F30 * F30`. -/ -lemma opPi_FF_c3030_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c3030_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F03_F03] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F03_F03] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F03 * F12`. -/ -lemma opPi_FF_c0312_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c0312_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F03_F12] + rw [boostAvgScalarProj_F03_F12] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F03 * F21`. -/ -lemma opPi_FF_c0321_mem : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * +lemma boostAvgScalarProj_FF_c0321_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F03_F12] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F03_F12] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F30 * F12`. -/ -lemma opPi_FF_c3012_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c3012_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F03_F12] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F03_F12] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F30 * F21`. -/ -lemma opPi_FF_c3021_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * +lemma boostAvgScalarProj_FF_c3021_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F03_F12] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F03_F12] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F12 * F03`. -/ -lemma opPi_FF_c1203_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c1203_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] + rw [boostAvgScalarProj_F03_F12] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F12 * F30`. -/ -lemma opPi_FF_c1230_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c1230_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] + rw [boostAvgScalarProj_F03_F12] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F21 * F03`. -/ -lemma opPi_FF_c2103_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c2103_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] + rw [boostAvgScalarProj_F03_F12] exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) /-- Projector membership for the ordered square `F21 * F30`. -/ -lemma opPi_FF_c2130_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c2130_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] rw [fieldStrengthDeriv_mul_comm] - rw [opPi_F03_F12] + rw [boostAvgScalarProj_F03_F12] exact Submodule.smul_mem _ _ thetaTerm_mem_span /-- Projector membership for the ordered square `F12 * F12`. -/ -lemma opPi_FF_c1212_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c1212_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_F12_F12] + rw [boostAvgScalarProj_F12_F12] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered square `F12 * F21`. -/ -lemma opPi_FF_c1221_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * +lemma boostAvgScalarProj_FF_c1221_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F12_F12] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F12_F12] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F21 * F12`. -/ -lemma opPi_FF_c2112_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c2112_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F12_F12] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F12_F12] exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) /-- Projector membership for the ordered square `F21 * F21`. -/ -lemma opPi_FF_c2121_mem : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * +lemma boostAvgScalarProj_FF_c2121_mem : + boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - neg_mul, mul_neg, neg_neg, map_neg] - rw [opPi_F12_F12] + jetNeg_mul, jetMul_neg, neg_neg, map_neg] + rw [boostAvgScalarProj_F12_F12] exact Submodule.smul_mem _ _ maxwellTerm_mem_span /-- Projector membership for the ordered derivative monomial `dd01 F01`. -/ -lemma opPi_DDF_c0101_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c0101_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd01_F01] + rw [boostAvgScalarProj_dd01_F01] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd01 F10`. -/ -lemma opPi_DDF_c0110_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c0110_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F01, neg_zero] + rw [map_neg, boostAvgScalarProj_dd01_F01, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd10 F01`. -/ -lemma opPi_DDF_c1001_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c1001_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [opPi_dd01_F01] + rw [boostAvgScalarProj_dd01_F01] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd10 F10`. -/ -lemma opPi_DDF_c1010_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 0) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c1010_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F01, neg_zero] + rw [map_neg, boostAvgScalarProj_dd01_F01, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd01 F23`. -/ -lemma opPi_DDF_c0123_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c0123_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd01_F23] + rw [boostAvgScalarProj_dd01_F23] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd01 F32`. -/ -lemma opPi_DDF_c0132_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c0132_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F23, neg_zero] + rw [map_neg, boostAvgScalarProj_dd01_F23, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd10 F23`. -/ -lemma opPi_DDF_c1023_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c1023_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [opPi_dd01_F23] + rw [boostAvgScalarProj_dd01_F23] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd10 F32`. -/ -lemma opPi_DDF_c1032_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 2) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c1032_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, opPi_dd01_F23, neg_zero] + rw [map_neg, boostAvgScalarProj_dd01_F23, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd02 F02`. -/ -lemma opPi_DDF_c0202_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c0202_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd02_F02] + rw [boostAvgScalarProj_dd02_F02] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd02 F20`. -/ -lemma opPi_DDF_c0220_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c0220_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F02, neg_zero] + rw [map_neg, boostAvgScalarProj_dd02_F02, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd20 F02`. -/ -lemma opPi_DDF_c2002_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inl 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c2002_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [opPi_dd02_F02] + rw [boostAvgScalarProj_dd02_F02] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd20 F20`. -/ -lemma opPi_DDF_c2020_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 1) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c2020_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F02, neg_zero] + rw [map_neg, boostAvgScalarProj_dd02_F02, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd02 F13`. -/ -lemma opPi_DDF_c0213_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c0213_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd02_F13] + rw [boostAvgScalarProj_dd02_F13] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd02 F31`. -/ -lemma opPi_DDF_c0231_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c0231_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F13, neg_zero] + rw [map_neg, boostAvgScalarProj_dd02_F13, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd20 F13`. -/ -lemma opPi_DDF_c2013_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c2013_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [opPi_dd02_F13] + rw [boostAvgScalarProj_dd02_F13] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd20 F31`. -/ -lemma opPi_DDF_c2031_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 2) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c2031_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd02_F13, neg_zero] + rw [map_neg, boostAvgScalarProj_dd02_F13, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd03 F03`. -/ -lemma opPi_DDF_c0303_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c0303_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd03_F03] + rw [boostAvgScalarProj_dd03_F03] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd03 F30`. -/ -lemma opPi_DDF_c0330_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c0330_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F03, neg_zero] + rw [map_neg, boostAvgScalarProj_dd03_F03, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd30 F03`. -/ -lemma opPi_DDF_c3003_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inl 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c3003_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [opPi_dd03_F03] + rw [boostAvgScalarProj_dd03_F03] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd30 F30`. -/ -lemma opPi_DDF_c3030_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 2) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c3030_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F03, neg_zero] + rw [map_neg, boostAvgScalarProj_dd03_F03, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd03 F12`. -/ -lemma opPi_DDF_c0312_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c0312_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd03_F12] + rw [boostAvgScalarProj_dd03_F12] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd03 F21`. -/ -lemma opPi_DDF_c0321_mem : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c0321_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F12, neg_zero] + rw [map_neg, boostAvgScalarProj_dd03_F12, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd30 F12`. -/ -lemma opPi_DDF_c3012_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c3012_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [opPi_dd03_F12] + rw [boostAvgScalarProj_dd03_F12] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd30 F21`. -/ -lemma opPi_DDF_c3021_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 1) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c3021_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd03_F12, neg_zero] + rw [map_neg, boostAvgScalarProj_dd03_F12, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd12 F03`. -/ -lemma opPi_DDF_c1203_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c1203_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd12_F03] + rw [boostAvgScalarProj_dd12_F03] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd12 F30`. -/ -lemma opPi_DDF_c1230_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c1230_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F03, neg_zero] + rw [map_neg, boostAvgScalarProj_dd12_F03, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd21 F03`. -/ -lemma opPi_DDF_c2103_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inl 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c2103_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inl 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [opPi_dd12_F03] + rw [boostAvgScalarProj_dd12_F03] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd21 F30`. -/ -lemma opPi_DDF_c2130_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 2) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c2130_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 2) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F03, neg_zero] + rw [map_neg, boostAvgScalarProj_dd12_F03, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd12 F12`. -/ -lemma opPi_DDF_c1212_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c1212_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd12_F12] + rw [boostAvgScalarProj_dd12_F12] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd12 F21`. -/ -lemma opPi_DDF_c1221_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c1221_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F12, neg_zero] + rw [map_neg, boostAvgScalarProj_dd12_F12, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd21 F12`. -/ -lemma opPi_DDF_c2112_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c2112_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [opPi_dd12_F12] + rw [boostAvgScalarProj_dd12_F12] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd21 F21`. -/ -lemma opPi_DDF_c2121_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 1) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c2121_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 1) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, opPi_dd12_F12, neg_zero] + rw [map_neg, boostAvgScalarProj_dd12_F12, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd13 F02`. -/ -lemma opPi_DDF_c1302_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c1302_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd13_F02] + rw [boostAvgScalarProj_dd13_F02] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd13 F20`. -/ -lemma opPi_DDF_c1320_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c1320_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F02, neg_zero] + rw [map_neg, boostAvgScalarProj_dd13_F02, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd31 F02`. -/ -lemma opPi_DDF_c3102_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inl 0) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c3102_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inl 0) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [opPi_dd13_F02] + rw [boostAvgScalarProj_dd13_F02] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd31 F20`. -/ -lemma opPi_DDF_c3120_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 1) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c3120_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 1) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F02, neg_zero] + rw [map_neg, boostAvgScalarProj_dd13_F02, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd13 F13`. -/ -lemma opPi_DDF_c1313_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c1313_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd13_F13] + rw [boostAvgScalarProj_dd13_F13] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd13 F31`. -/ -lemma opPi_DDF_c1331_mem : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c1331_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F13, neg_zero] + rw [map_neg, boostAvgScalarProj_dd13_F13, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd31 F13`. -/ -lemma opPi_DDF_c3113_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 0) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c3113_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 0) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [opPi_dd13_F13] + rw [boostAvgScalarProj_dd13_F13] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd31 F31`. -/ -lemma opPi_DDF_c3131_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 2) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c3131_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 2) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, opPi_dd13_F13, neg_zero] + rw [map_neg, boostAvgScalarProj_dd13_F13, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd23 F01`. -/ -lemma opPi_DDF_c2301_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c2301_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd23_F01] + rw [boostAvgScalarProj_dd23_F01] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd23 F10`. -/ -lemma opPi_DDF_c2310_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c2310_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F01, neg_zero] + rw [map_neg, boostAvgScalarProj_dd23_F01, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd32 F01`. -/ -lemma opPi_DDF_c3201_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inl 0) (Sum.inr 0)) ∈ +lemma boostAvgScalarProj_DDF_c3201_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inl 0) (Sum.inr 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [opPi_dd23_F01] + rw [boostAvgScalarProj_dd23_F01] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd32 F10`. -/ -lemma opPi_DDF_c3210_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 0) (Sum.inl 0)) ∈ +lemma boostAvgScalarProj_DDF_c3210_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 0) (Sum.inl 0)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F01, neg_zero] + rw [map_neg, boostAvgScalarProj_dd23_F01, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd23 F23`. -/ -lemma opPi_DDF_c2323_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c2323_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [opPi_dd23_F23] + rw [boostAvgScalarProj_dd23_F23] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd23 F32`. -/ -lemma opPi_DDF_c2332_mem : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c2332_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F23, neg_zero] + rw [map_neg, boostAvgScalarProj_dd23_F23, neg_zero] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd32 F23`. -/ -lemma opPi_DDF_c3223_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 1) (Sum.inr 2)) ∈ +lemma boostAvgScalarProj_DDF_c3223_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 1) (Sum.inr 2)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [opPi_dd23_F23] + rw [boostAvgScalarProj_dd23_F23] exact Submodule.zero_mem _ /-- Projector membership for the ordered derivative monomial `dd32 F32`. -/ -lemma opPi_DDF_c3232_mem : - opPi (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 2) (Sum.inr 1)) ∈ +lemma boostAvgScalarProj_DDF_c3232_mem : + boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 2) (Sum.inr 1)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, opPi_dd23_F23, neg_zero] + rw [map_neg, boostAvgScalarProj_dd23_F23, neg_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[0,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u000_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0)) ∈ +/-- Projected rotation average of `e[0,0,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u000_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e000, map_smul, opPi_u0] + rw [rotationPiAvg_u_e000, map_smul, boostAvgScalarProj_u0] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[0,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u001_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1)) ∈ +/-- Projected rotation average of `e[0,0,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u001_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e001, map_zero] + rw [rotationPiAvg_u_e001, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[0,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u010_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0)) ∈ +/-- Projected rotation average of `e[0,1,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u010_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e010, map_zero] + rw [rotationPiAvg_u_e010, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[0,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u011_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1)) ∈ +/-- Projected rotation average of `e[0,1,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u011_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e011, map_smul, opPi_u0] + rw [rotationPiAvg_u_e011, map_smul, boostAvgScalarProj_u0] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[1,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u100_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0)) ∈ +/-- Projected rotation average of `e[1,0,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u100_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e100, map_zero] + rw [rotationPiAvg_u_e100, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[1,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u101_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1)) ∈ +/-- Projected rotation average of `e[1,0,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u101_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e101, map_smul, opPi_u1] + rw [rotationPiAvg_u_e101, map_smul, boostAvgScalarProj_u1] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[1,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u110_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0)) ∈ +/-- Projected rotation average of `e[1,1,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u110_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e110, map_smul, opPi_u1] + rw [rotationPiAvg_u_e110, map_smul, boostAvgScalarProj_u1] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[1,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u111_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1)) ∈ +/-- Projected rotation average of `e[1,1,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u111_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e111, map_zero] + rw [rotationPiAvg_u_e111, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[2,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u200_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0)) ∈ +/-- Projected rotation average of `e[2,0,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u200_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e200, map_zero] + rw [rotationPiAvg_u_e200, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[2,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u201_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1)) ∈ +/-- Projected rotation average of `e[2,0,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u201_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e201, map_smul, opPi_u2] + rw [rotationPiAvg_u_e201, map_smul, boostAvgScalarProj_u2] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[2,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u210_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0)) ∈ +/-- Projected rotation average of `e[2,1,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u210_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e210, map_smul, opPi_u2] + rw [rotationPiAvg_u_e210, map_smul, boostAvgScalarProj_u2] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[2,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u211_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1)) ∈ +/-- Projected rotation average of `e[2,1,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u211_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e211, map_zero] + rw [rotationPiAvg_u_e211, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[3,0,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u300_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0)) ∈ +/-- Projected rotation average of `e[3,0,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u300_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e300, map_smul, opPi_u3] + rw [rotationPiAvg_u_e300, map_smul, boostAvgScalarProj_u3] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[3,0,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u301_mem : - opPi (kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1)) ∈ +/-- Projected rotation average of `e[3,0,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u301_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e301, map_zero] + rw [rotationPiAvg_u_e301, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[3,1,0]` (u-family) lies in the span. -/ -lemma opPi_kA_u310_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0)) ∈ +/-- Projected rotation average of `e[3,1,0]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u310_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e310, map_zero] + rw [rotationPiAvg_u_e310, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[3,1,1]` (u-family) lies in the span. -/ -lemma opPi_kA_u311_mem : - opPi (kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) ∈ +/-- Projected rotation average of `e[3,1,1]` (u-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_u311_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_u_e311, map_smul, opPi_u3] + rw [rotationPiAvg_u_e311, map_smul, boostAvgScalarProj_u3] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) -/-- Projected Klein average of `e[0,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar000_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[0,0,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar000_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e000, map_smul, opPi_ubar0] + rw [rotationPiAvg_ubar_e000, map_smul, boostAvgScalarProj_ubar0] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) -/-- Projected Klein average of `e[0,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar001_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[0,0,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar001_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e001, map_zero] + rw [rotationPiAvg_ubar_e001, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[0,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar010_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[0,1,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar010_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e010, map_zero] + rw [rotationPiAvg_ubar_e010, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[0,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar011_mem : - opPi (kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[0,1,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar011_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e011, map_smul, opPi_ubar0] + rw [rotationPiAvg_ubar_e011, map_smul, boostAvgScalarProj_ubar0] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) -/-- Projected Klein average of `e[1,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar100_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[1,0,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar100_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e100, map_zero] + rw [rotationPiAvg_ubar_e100, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[1,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar101_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[1,0,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar101_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e101, map_smul, opPi_ubar1] + rw [rotationPiAvg_ubar_e101, map_smul, boostAvgScalarProj_ubar1] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) -/-- Projected Klein average of `e[1,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar110_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[1,1,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar110_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e110, map_smul, opPi_ubar1] + rw [rotationPiAvg_ubar_e110, map_smul, boostAvgScalarProj_ubar1] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) -/-- Projected Klein average of `e[1,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar111_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[1,1,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar111_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e111, map_zero] + rw [rotationPiAvg_ubar_e111, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[2,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar200_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[2,0,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar200_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e200, map_zero] + rw [rotationPiAvg_ubar_e200, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[2,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar201_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[2,0,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar201_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e201, map_smul, opPi_ubar2] + rw [rotationPiAvg_ubar_e201, map_smul, boostAvgScalarProj_ubar2] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) -/-- Projected Klein average of `e[2,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar210_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[2,1,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar210_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e210, map_smul, opPi_ubar2] + rw [rotationPiAvg_ubar_e210, map_smul, boostAvgScalarProj_ubar2] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) -/-- Projected Klein average of `e[2,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar211_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[2,1,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar211_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e211, map_zero] + rw [rotationPiAvg_ubar_e211, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[3,0,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar300_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[3,0,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar300_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e300, map_smul, opPi_ubar3] + rw [rotationPiAvg_ubar_e300, map_smul, boostAvgScalarProj_ubar3] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) -/-- Projected Klein average of `e[3,0,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar301_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[3,0,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar301_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e301, map_zero] + rw [rotationPiAvg_ubar_e301, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[3,1,0]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar310_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0)) ∈ +/-- Projected rotation average of `e[3,1,0]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar310_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e310, map_zero] + rw [rotationPiAvg_ubar_e310, map_zero] exact Submodule.zero_mem _ -/-- Projected Klein average of `e[3,1,1]` (ubar-family) lies in the span. -/ -lemma opPi_kA_ubar311_mem : - opPi (kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) ∈ +/-- Projected rotation average of `e[3,1,1]` (ubar-family) lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_ubar311_mem : + boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_ubar_e311, map_smul, opPi_ubar3] + rw [rotationPiAvg_ubar_e311, map_smul, boostAvgScalarProj_ubar3] exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) attribute [local irreducible] Dψ Dbarψ fieldStrengthDeriv set_option maxHeartbeats 16000000 in set_option maxRecDepth 8192 in -/-- The projected Klein average of any product of two field strengths lies in +/-- The projected rotation average of any product of two field strengths lies in the span of the invariants. -/ -lemma opPi_kleinAvg_FF_mem (a b c d : Fin 1 ⊕ Fin 3) : - opPi (kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d)) ∈ +lemma boostAvgScalarProj_rotationPiAvg_FF_mem (a b c d : Fin 1 ⊕ Fin 3) : + boostAvgScalarProj (rotationPiAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_fieldStrengthDeriv_nil_mul, map_smul] + rw [rotationPiAvg_fieldStrengthDeriv_nil_mul, map_smul] rcases a with a | a <;> rcases b with b | b <;> rcases c with c | c <;> rcases d with d | d <;> fin_cases a <;> fin_cases b <;> fin_cases c <;> fin_cases d <;> @@ -1241,67 +1249,67 @@ lemma opPi_kleinAvg_FF_mem (a b c d : Fin 1 ⊕ Fin 3) : exact Submodule.zero_mem _) | (refine Submodule.smul_mem _ _ ?_ first - | exact opPi_FF_c0101_mem - | exact opPi_FF_c0110_mem - | exact opPi_FF_c1001_mem - | exact opPi_FF_c1010_mem - | exact opPi_FF_c0123_mem - | exact opPi_FF_c0132_mem - | exact opPi_FF_c1023_mem - | exact opPi_FF_c1032_mem - | exact opPi_FF_c2301_mem - | exact opPi_FF_c2310_mem - | exact opPi_FF_c3201_mem - | exact opPi_FF_c3210_mem - | exact opPi_FF_c2323_mem - | exact opPi_FF_c2332_mem - | exact opPi_FF_c3223_mem - | exact opPi_FF_c3232_mem - | exact opPi_FF_c0202_mem - | exact opPi_FF_c0220_mem - | exact opPi_FF_c2002_mem - | exact opPi_FF_c2020_mem - | exact opPi_FF_c0213_mem - | exact opPi_FF_c0231_mem - | exact opPi_FF_c2013_mem - | exact opPi_FF_c2031_mem - | exact opPi_FF_c1302_mem - | exact opPi_FF_c1320_mem - | exact opPi_FF_c3102_mem - | exact opPi_FF_c3120_mem - | exact opPi_FF_c1313_mem - | exact opPi_FF_c1331_mem - | exact opPi_FF_c3113_mem - | exact opPi_FF_c3131_mem - | exact opPi_FF_c0303_mem - | exact opPi_FF_c0330_mem - | exact opPi_FF_c3003_mem - | exact opPi_FF_c3030_mem - | exact opPi_FF_c0312_mem - | exact opPi_FF_c0321_mem - | exact opPi_FF_c3012_mem - | exact opPi_FF_c3021_mem - | exact opPi_FF_c1203_mem - | exact opPi_FF_c1230_mem - | exact opPi_FF_c2103_mem - | exact opPi_FF_c2130_mem - | exact opPi_FF_c1212_mem - | exact opPi_FF_c1221_mem - | exact opPi_FF_c2112_mem - | exact opPi_FF_c2121_mem) - | (norm_num [paritySignZ, paritySignY, paritySignX] + | exact boostAvgScalarProj_FF_c0101_mem + | exact boostAvgScalarProj_FF_c0110_mem + | exact boostAvgScalarProj_FF_c1001_mem + | exact boostAvgScalarProj_FF_c1010_mem + | exact boostAvgScalarProj_FF_c0123_mem + | exact boostAvgScalarProj_FF_c0132_mem + | exact boostAvgScalarProj_FF_c1023_mem + | exact boostAvgScalarProj_FF_c1032_mem + | exact boostAvgScalarProj_FF_c2301_mem + | exact boostAvgScalarProj_FF_c2310_mem + | exact boostAvgScalarProj_FF_c3201_mem + | exact boostAvgScalarProj_FF_c3210_mem + | exact boostAvgScalarProj_FF_c2323_mem + | exact boostAvgScalarProj_FF_c2332_mem + | exact boostAvgScalarProj_FF_c3223_mem + | exact boostAvgScalarProj_FF_c3232_mem + | exact boostAvgScalarProj_FF_c0202_mem + | exact boostAvgScalarProj_FF_c0220_mem + | exact boostAvgScalarProj_FF_c2002_mem + | exact boostAvgScalarProj_FF_c2020_mem + | exact boostAvgScalarProj_FF_c0213_mem + | exact boostAvgScalarProj_FF_c0231_mem + | exact boostAvgScalarProj_FF_c2013_mem + | exact boostAvgScalarProj_FF_c2031_mem + | exact boostAvgScalarProj_FF_c1302_mem + | exact boostAvgScalarProj_FF_c1320_mem + | exact boostAvgScalarProj_FF_c3102_mem + | exact boostAvgScalarProj_FF_c3120_mem + | exact boostAvgScalarProj_FF_c1313_mem + | exact boostAvgScalarProj_FF_c1331_mem + | exact boostAvgScalarProj_FF_c3113_mem + | exact boostAvgScalarProj_FF_c3131_mem + | exact boostAvgScalarProj_FF_c0303_mem + | exact boostAvgScalarProj_FF_c0330_mem + | exact boostAvgScalarProj_FF_c3003_mem + | exact boostAvgScalarProj_FF_c3030_mem + | exact boostAvgScalarProj_FF_c0312_mem + | exact boostAvgScalarProj_FF_c0321_mem + | exact boostAvgScalarProj_FF_c3012_mem + | exact boostAvgScalarProj_FF_c3021_mem + | exact boostAvgScalarProj_FF_c1203_mem + | exact boostAvgScalarProj_FF_c1230_mem + | exact boostAvgScalarProj_FF_c2103_mem + | exact boostAvgScalarProj_FF_c2130_mem + | exact boostAvgScalarProj_FF_c1212_mem + | exact boostAvgScalarProj_FF_c1221_mem + | exact boostAvgScalarProj_FF_c2112_mem + | exact boostAvgScalarProj_FF_c2121_mem) + | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX] first | done | exact Submodule.zero_mem _) set_option maxHeartbeats 16000000 in set_option maxRecDepth 8192 in -/-- The projected Klein average of any second-derivative field strength lies +/-- The projected rotation average of any second-derivative field strength lies in the span of the invariants. -/ -lemma opPi_kleinAvg_DDF_mem (r t a b : Fin 1 ⊕ Fin 3) : - opPi (kleinAvg (fieldStrengthDeriv {r, t} a b)) ∈ +lemma boostAvgScalarProj_rotationPiAvg_DDF_mem (r t a b : Fin 1 ⊕ Fin 3) : + boostAvgScalarProj (rotationPiAvg (fieldStrengthDeriv {r, t} a b)) ∈ Submodule.span ℂ massDimFourInvariants := by - rw [kleinAvg_fieldStrengthDeriv_pair, map_smul] + rw [rotationPiAvg_fieldStrengthDeriv_pair, map_smul] rcases r with r | r <;> rcases t with t | t <;> rcases a with a | a <;> rcases b with b | b <;> fin_cases r <;> fin_cases t <;> fin_cases a <;> fin_cases b <;> @@ -1312,122 +1320,124 @@ lemma opPi_kleinAvg_DDF_mem (r t a b : Fin 1 ⊕ Fin 3) : exact Submodule.zero_mem _) | (refine Submodule.smul_mem _ _ ?_ first - | exact opPi_DDF_c0101_mem - | exact opPi_DDF_c0110_mem - | exact opPi_DDF_c1001_mem - | exact opPi_DDF_c1010_mem - | exact opPi_DDF_c0123_mem - | exact opPi_DDF_c0132_mem - | exact opPi_DDF_c1023_mem - | exact opPi_DDF_c1032_mem - | exact opPi_DDF_c0202_mem - | exact opPi_DDF_c0220_mem - | exact opPi_DDF_c2002_mem - | exact opPi_DDF_c2020_mem - | exact opPi_DDF_c0213_mem - | exact opPi_DDF_c0231_mem - | exact opPi_DDF_c2013_mem - | exact opPi_DDF_c2031_mem - | exact opPi_DDF_c0303_mem - | exact opPi_DDF_c0330_mem - | exact opPi_DDF_c3003_mem - | exact opPi_DDF_c3030_mem - | exact opPi_DDF_c0312_mem - | exact opPi_DDF_c0321_mem - | exact opPi_DDF_c3012_mem - | exact opPi_DDF_c3021_mem - | exact opPi_DDF_c1203_mem - | exact opPi_DDF_c1230_mem - | exact opPi_DDF_c2103_mem - | exact opPi_DDF_c2130_mem - | exact opPi_DDF_c1212_mem - | exact opPi_DDF_c1221_mem - | exact opPi_DDF_c2112_mem - | exact opPi_DDF_c2121_mem - | exact opPi_DDF_c1302_mem - | exact opPi_DDF_c1320_mem - | exact opPi_DDF_c3102_mem - | exact opPi_DDF_c3120_mem - | exact opPi_DDF_c1313_mem - | exact opPi_DDF_c1331_mem - | exact opPi_DDF_c3113_mem - | exact opPi_DDF_c3131_mem - | exact opPi_DDF_c2301_mem - | exact opPi_DDF_c2310_mem - | exact opPi_DDF_c3201_mem - | exact opPi_DDF_c3210_mem - | exact opPi_DDF_c2323_mem - | exact opPi_DDF_c2332_mem - | exact opPi_DDF_c3223_mem - | exact opPi_DDF_c3232_mem) - | (norm_num [paritySignZ, paritySignY, paritySignX] + | exact boostAvgScalarProj_DDF_c0101_mem + | exact boostAvgScalarProj_DDF_c0110_mem + | exact boostAvgScalarProj_DDF_c1001_mem + | exact boostAvgScalarProj_DDF_c1010_mem + | exact boostAvgScalarProj_DDF_c0123_mem + | exact boostAvgScalarProj_DDF_c0132_mem + | exact boostAvgScalarProj_DDF_c1023_mem + | exact boostAvgScalarProj_DDF_c1032_mem + | exact boostAvgScalarProj_DDF_c0202_mem + | exact boostAvgScalarProj_DDF_c0220_mem + | exact boostAvgScalarProj_DDF_c2002_mem + | exact boostAvgScalarProj_DDF_c2020_mem + | exact boostAvgScalarProj_DDF_c0213_mem + | exact boostAvgScalarProj_DDF_c0231_mem + | exact boostAvgScalarProj_DDF_c2013_mem + | exact boostAvgScalarProj_DDF_c2031_mem + | exact boostAvgScalarProj_DDF_c0303_mem + | exact boostAvgScalarProj_DDF_c0330_mem + | exact boostAvgScalarProj_DDF_c3003_mem + | exact boostAvgScalarProj_DDF_c3030_mem + | exact boostAvgScalarProj_DDF_c0312_mem + | exact boostAvgScalarProj_DDF_c0321_mem + | exact boostAvgScalarProj_DDF_c3012_mem + | exact boostAvgScalarProj_DDF_c3021_mem + | exact boostAvgScalarProj_DDF_c1203_mem + | exact boostAvgScalarProj_DDF_c1230_mem + | exact boostAvgScalarProj_DDF_c2103_mem + | exact boostAvgScalarProj_DDF_c2130_mem + | exact boostAvgScalarProj_DDF_c1212_mem + | exact boostAvgScalarProj_DDF_c1221_mem + | exact boostAvgScalarProj_DDF_c2112_mem + | exact boostAvgScalarProj_DDF_c2121_mem + | exact boostAvgScalarProj_DDF_c1302_mem + | exact boostAvgScalarProj_DDF_c1320_mem + | exact boostAvgScalarProj_DDF_c3102_mem + | exact boostAvgScalarProj_DDF_c3120_mem + | exact boostAvgScalarProj_DDF_c1313_mem + | exact boostAvgScalarProj_DDF_c1331_mem + | exact boostAvgScalarProj_DDF_c3113_mem + | exact boostAvgScalarProj_DDF_c3131_mem + | exact boostAvgScalarProj_DDF_c2301_mem + | exact boostAvgScalarProj_DDF_c2310_mem + | exact boostAvgScalarProj_DDF_c3201_mem + | exact boostAvgScalarProj_DDF_c3210_mem + | exact boostAvgScalarProj_DDF_c2323_mem + | exact boostAvgScalarProj_DDF_c2332_mem + | exact boostAvgScalarProj_DDF_c3223_mem + | exact boostAvgScalarProj_DDF_c3232_mem) + | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX] first | done | exact Submodule.zero_mem _) +set_option maxHeartbeats 16000000 in set_option maxRecDepth 8192 in -/-- The projected Klein average of any `ψ̄ (Dψ)` pair lies in the span. -/ -lemma opPi_kleinAvg_FM1_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dbarψ [] α * Dψ [μ] β)) ∈ +/-- The projected rotation average of any `ψ̄ (Dψ)` pair lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_FM1_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + boostAvgScalarProj (rotationPiAvg (Dbarψ [] α * Dψ [μ] β)) ∈ Submodule.span ℂ massDimFourInvariants := by rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> first - | exact opPi_kA_u000_mem - | exact opPi_kA_u001_mem - | exact opPi_kA_u010_mem - | exact opPi_kA_u011_mem - | exact opPi_kA_u100_mem - | exact opPi_kA_u101_mem - | exact opPi_kA_u110_mem - | exact opPi_kA_u111_mem - | exact opPi_kA_u200_mem - | exact opPi_kA_u201_mem - | exact opPi_kA_u210_mem - | exact opPi_kA_u211_mem - | exact opPi_kA_u300_mem - | exact opPi_kA_u301_mem - | exact opPi_kA_u310_mem - | exact opPi_kA_u311_mem + | exact boostAvgScalarProj_rotationPiAvg_u000_mem + | exact boostAvgScalarProj_rotationPiAvg_u001_mem + | exact boostAvgScalarProj_rotationPiAvg_u010_mem + | exact boostAvgScalarProj_rotationPiAvg_u011_mem + | exact boostAvgScalarProj_rotationPiAvg_u100_mem + | exact boostAvgScalarProj_rotationPiAvg_u101_mem + | exact boostAvgScalarProj_rotationPiAvg_u110_mem + | exact boostAvgScalarProj_rotationPiAvg_u111_mem + | exact boostAvgScalarProj_rotationPiAvg_u200_mem + | exact boostAvgScalarProj_rotationPiAvg_u201_mem + | exact boostAvgScalarProj_rotationPiAvg_u210_mem + | exact boostAvgScalarProj_rotationPiAvg_u211_mem + | exact boostAvgScalarProj_rotationPiAvg_u300_mem + | exact boostAvgScalarProj_rotationPiAvg_u301_mem + | exact boostAvgScalarProj_rotationPiAvg_u310_mem + | exact boostAvgScalarProj_rotationPiAvg_u311_mem +set_option maxHeartbeats 16000000 in set_option maxRecDepth 8192 in -/-- The projected Klein average of any `(D̄ψ̄) ψ` pair lies in the span. -/ -lemma opPi_kleinAvg_FM2_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dbarψ [μ] α * Dψ [] β)) ∈ +/-- The projected rotation average of any `(D̄ψ̄) ψ` pair lies in the span. -/ +lemma boostAvgScalarProj_rotationPiAvg_FM2_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + boostAvgScalarProj (rotationPiAvg (Dbarψ [μ] α * Dψ [] β)) ∈ Submodule.span ℂ massDimFourInvariants := by rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> first - | exact opPi_kA_ubar000_mem - | exact opPi_kA_ubar001_mem - | exact opPi_kA_ubar010_mem - | exact opPi_kA_ubar011_mem - | exact opPi_kA_ubar100_mem - | exact opPi_kA_ubar101_mem - | exact opPi_kA_ubar110_mem - | exact opPi_kA_ubar111_mem - | exact opPi_kA_ubar200_mem - | exact opPi_kA_ubar201_mem - | exact opPi_kA_ubar210_mem - | exact opPi_kA_ubar211_mem - | exact opPi_kA_ubar300_mem - | exact opPi_kA_ubar301_mem - | exact opPi_kA_ubar310_mem - | exact opPi_kA_ubar311_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar000_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar001_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar010_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar011_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar100_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar101_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar110_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar111_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar200_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar201_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar210_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar211_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar300_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar301_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar310_mem + | exact boostAvgScalarProj_rotationPiAvg_ubar311_mem /-- The reversed pair `(Dψ) ψ̄`, via anticommutation. -/ -lemma opPi_kleinAvg_FM1r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dψ [μ] β * Dbarψ [] α)) ∈ +lemma boostAvgScalarProj_rotationPiAvg_FM1r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + boostAvgScalarProj (rotationPiAvg (Dψ [μ] β * Dbarψ [] α)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] - exact neg_mem (opPi_kleinAvg_FM1_mem μ α β) + exact neg_mem (boostAvgScalarProj_rotationPiAvg_FM1_mem μ α β) /-- The reversed pair `ψ (D̄ψ̄)`, via anticommutation. -/ -lemma opPi_kleinAvg_FM2r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - opPi (kleinAvg (Dψ [] α * Dbarψ [μ] β)) ∈ +lemma boostAvgScalarProj_rotationPiAvg_FM2r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + boostAvgScalarProj (rotationPiAvg (Dψ [] α * Dbarψ [μ] β)) ∈ Submodule.span ℂ massDimFourInvariants := by rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] - exact neg_mem (opPi_kleinAvg_FM2_mem μ β α) + exact neg_mem (boostAvgScalarProj_rotationPiAvg_FM2_mem μ β α) end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean new file mode 100644 index 000000000..9264bcad2 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.RotationsPi +/-! +# The boosts along the coordinate axes + +The one-parameter boosts `boostZel t`, `boostXel t`, `boostYel t` along the +three coordinate axes, the subgroups `boostSubgroupZ/X/Y` they generate, and +their Lorentz matrices; together with the two fixed `z`-boosts `boostZ2`, +`boostZ3` used to kill the weight-six sector. + +These boosts are the subgroup that the rest of `Subgroups/` acts with — the +`BoostsOn*` files tabulate their action on the field strength, its derivatives, +and the photon and fermion terms — and that `Averages/BoostAverage` averages +over. Being non-compact they admit no invariant average, which is why that +file has to weight them by hand. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +### Parametric boosts along the three axes + +The one-parameter families of boosts `diag(t, t⁻¹)` (along `z`) and their +conjugates along `x` and `y`, with symbolic Lorentz matrices in `t`. + +-/ + +/-- The lift `diag(t, t⁻¹)` of the boost along the `z`-axis with rapidity + `2 log t`. -/ +noncomputable def boostZel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![(t : ℂ), 0; 0, (t : ℂ)⁻¹], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + simp [mul_inv_cancel₀ htc]⟩ + +/-- The lift of the boost along the `x`-axis with rapidity `2 log t`. -/ +noncomputable def boostXel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, ((t : ℂ) - (t : ℂ)⁻¹)/2; + ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + field_simp + ring⟩ + +/-- The lift of the boost along the `y`-axis with rapidity `2 log t`. -/ +noncomputable def boostYel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := + ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; + Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have h2 : -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) = + ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + have hI : -Complex.I * Complex.I = 1 := by + rw [neg_mul, Complex.I_mul_I, neg_neg] + calc -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) + = (-Complex.I * Complex.I) * + (((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2)) := by + ring + _ = ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + rw [hI, one_mul] + rw [Matrix.det_fin_two_of, h2] + field_simp + ring⟩ + +/-! + +### The boosts as one-parameter subgroups + +`t ↦ diag(t, t⁻¹)` is a homomorphism from the multiplicative group of nonzero +reals, so the `z`-boosts form a genuine subgroup of `SL(2,ℂ)`; the `x`- and +`y`-boosts are its conjugates. The averages of `Averages/BoostAverage` are taken +over finitely many elements of these subgroups. + +-/ + +/-- The boosts along the `z`-axis as a homomorphism from the nonzero reals. -/ +noncomputable def boostHomZ : ℝˣ →* SL(2,ℂ) where + toFun u := boostZel (u : ℝ) u.ne_zero + map_one' := by + refine Subtype.ext ?_ + rw [boostZel, Matrix.SpecialLinearGroup.coe_one] + ext i j + fin_cases i <;> fin_cases j <;> simp [Matrix.one_apply] + map_mul' u v := by + refine Subtype.ext ?_ + rw [boostZel, boostZel, boostZel] + have hu : ((u : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr u.ne_zero + have hv : ((v : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr v.ne_zero + ext i j + fin_cases i <;> fin_cases j <;> + simp [Units.val_mul, mul_inv] <;> ring + +/-- The one-parameter subgroup of `SL(2,ℂ)` of boosts along the `z`-axis. -/ +noncomputable def boostSubgroupZ : Subgroup SL(2,ℂ) := boostHomZ.range + +lemma boostZel_mem_boostSubgroupZ (t : ℝ) (ht : t ≠ 0) : + boostZel t ht ∈ boostSubgroupZ := + ⟨Units.mk0 t ht, rfl⟩ + +/-- The subgroup of `SL(2,ℂ)` generated by the boosts along the `x`-axis. -/ +noncomputable def boostSubgroupX : Subgroup SL(2,ℂ) := + Subgroup.closure (Set.range fun u : ℝˣ => boostXel (u : ℝ) u.ne_zero) + +lemma boostXel_mem_boostSubgroupX (t : ℝ) (ht : t ≠ 0) : + boostXel t ht ∈ boostSubgroupX := + Subgroup.subset_closure ⟨Units.mk0 t ht, rfl⟩ + +/-- The subgroup of `SL(2,ℂ)` generated by the boosts along the `y`-axis. -/ +noncomputable def boostSubgroupY : Subgroup SL(2,ℂ) := + Subgroup.closure (Set.range fun u : ℝˣ => boostYel (u : ℝ) u.ne_zero) + +lemma boostYel_mem_boostSubgroupY (t : ℝ) (ht : t ≠ 0) : + boostYel t ht ∈ boostSubgroupY := + Subgroup.subset_closure ⟨Units.mk0 t ht, rfl⟩ + +/-- The Lorentz matrix of `boostZel t`: `ch = (t² + t⁻²)/2` on the time-time + and `zz` entries, `-sh = -(t² - t⁻²)/2` on the mixed entries. -/ +noncomputable def boostMatZ (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 2 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 2, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => (t^2 + (t⁻¹)^2)/2 + | _, _ => 0 + +/-- The Lorentz matrix of `boostXel t`. -/ +noncomputable def boostMatX (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 0 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => (t^2 + (t⁻¹)^2)/2 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 1 + | _, _ => 0 + +/-- The Lorentz matrix of `boostYel t`. -/ +noncomputable def boostMatY (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 + | Sum.inl _, Sum.inr 1 => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 1, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => (t^2 + (t⁻¹)^2)/2 + | Sum.inr 2, Sum.inr 2 => 1 + | _, _ => 0 + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `z`-boost. -/ +lemma toLorentzGroup_boostZel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostZel t ht)).1 a b = boostMatZ t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostZel, boostMatZ, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `x`-boost. -/ +lemma toLorentzGroup_boostXel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostXel t ht)).1 a b = boostMatX t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostXel, boostMatX, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Lorentz matrix of the parametric `y`-boost. -/ +lemma toLorentzGroup_boostYel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostYel t ht)).1 a b = boostMatY t a b := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostYel, boostMatY, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, + Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try push_cast + try field_simp + try ring_nf + try norm_num [Complex.I_sq, Complex.conj_ofNat] + try ring + +/-- The inverse of the parametric `z`-boost is the boost at the inverse + parameter. -/ +lemma boostZel_inv (t : ℝ) (ht : t ≠ 0) : + (boostZel t ht)⁻¹ = boostZel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + simp [boostZel, Complex.ofReal_inv, inv_inv] + +/-- The inverse of the parametric `x`-boost is the boost at the inverse + parameter. -/ +lemma boostXel_inv (t : ℝ) (ht : t ≠ 0) : + (boostXel t ht)⁻¹ = boostXel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + · simp [boostXel, Complex.ofReal_inv, inv_inv] + try ring + +/-- The inverse of the parametric `y`-boost is the boost at the inverse + parameter. -/ +lemma boostYel_inv (t : ℝ) (ht : t ≠ 0) : + (boostYel t ht)⁻¹ = boostYel t⁻¹ (inv_ne_zero ht) := by + ext i j + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases i <;> fin_cases j <;> + · simp [boostYel, Complex.ofReal_inv, inv_inv] + try ring + +/-- The inverse of the parametric `z`-boost, entrywise, with real entries. -/ +lemma boostZel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostZel t ht)⁻¹ : SL(2,ℂ)).1 = + !![(((t⁻¹ : ℝ)) : ℂ), 0; 0, ((t : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostZel] + +/-- The inverse of the parametric `x`-boost, entrywise. -/ +lemma boostXel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostXel t ht)⁻¹ : SL(2,ℂ)).1 = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, -(((t : ℂ) - (t : ℂ)⁻¹)/2); + -(((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostXel] + +/-- The inverse of the parametric `y`-boost, entrywise. -/ +lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : + ((boostYel t ht)⁻¹ : SL(2,ℂ)).1 = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; + -(Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring + +/-- The Lorentz matrix of the inverse `z`-boost: the boost matrix at the + inverse parameter. -/ +lemma toLorentzGroup_boostZel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostZel t ht)⁻¹).1 a b = boostMatZ t⁻¹ a b := by + rw [boostZel_inv, toLorentzGroup_boostZel] + +/-- The Lorentz matrix of the inverse `x`-boost. -/ +lemma toLorentzGroup_boostXel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostXel t ht)⁻¹).1 a b = boostMatX t⁻¹ a b := by + rw [boostXel_inv, toLorentzGroup_boostXel] + +/-- The Lorentz matrix of the inverse `y`-boost. -/ +lemma toLorentzGroup_boostYel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup (boostYel t ht)⁻¹).1 a b = boostMatY t⁻¹ a b := by + rw [boostYel_inv, toLorentzGroup_boostYel] + + +/-! + +### The two fixed `z`-boosts + +Two diagonal boosts `diag(t, t⁻¹)` with `t = 2, 3`. Together with the Klein +four-group of rotations by `π` they suffice to kill the neutral weight-six +sector: the rotation average projects onto the twelve surviving field-strength +components and the diagonal fermion pairs, and a rational combination of the +two boosts (with weights summing to one) annihilates all of them. That +combination is `rotationPiBoostAvg` of `Averages/RotationPiBoostAverage`. + +-/ + +/-- The lift `diag(2, 1/2)` of the boost along the `z`-axis with rapidity + `log 4`. -/ +noncomputable def boostZ2 : SL(2,ℂ) := + ⟨!![2, 0; 0, 2⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ + +/-- The lift `diag(3, 1/3)` of the boost along the `z`-axis with rapidity + `log 9`. -/ +noncomputable def boostZ3 : SL(2,ℂ) := + ⟨!![3, 0; 0, 3⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ + +/-- The Lorentz matrix of `boostZ2`. -/ +noncomputable def boostMatA : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => 17/8 + | Sum.inl _, Sum.inr 2 => -(15/8) + | Sum.inr 2, Sum.inl _ => -(15/8) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 17/8 + | _, _ => 0 + +/-- The Lorentz matrix of `boostZ3`. -/ +noncomputable def boostMatB : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ + | Sum.inl _, Sum.inl _ => 41/9 + | Sum.inl _, Sum.inr 2 => -(40/9) + | Sum.inr 2, Sum.inl _ => -(40/9) + | Sum.inr 0, Sum.inr 0 => 1 + | Sum.inr 1, Sum.inr 1 => 1 + | Sum.inr 2, Sum.inr 2 => 41/9 + | _, _ => 0 + +set_option maxHeartbeats 2000000 in +/-- The Lorentz matrix of the first boost. -/ +lemma toLorentzGroup_boostZ2 (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup boostZ2).1 a b = boostMatA a b := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostZ2, boostMatA, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try norm_num [Complex.ext_iff] + +set_option maxHeartbeats 2000000 in +/-- The Lorentz matrix of the second boost. -/ +lemma toLorentzGroup_boostZ3 (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup boostZ3).1 a b = boostMatB a b := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · try simp [boostZ3, boostMatB, PauliMatrix.pauliSelfAdjoint', + PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.conjTranspose, Matrix.diag] + try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + try norm_num [Complex.ext_iff] + +/-- The inverse of the first boost, entrywise, with real entries. -/ +lemma boostZ2_inv_coe : + (boostZ2⁻¹ : SL(2,ℂ)).1 = !![((2⁻¹ : ℝ) : ℂ), 0; 0, ((2 : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostZ2] + +/-- The inverse of the second boost, entrywise, with real entries. -/ +lemma boostZ3_inv_coe : + (boostZ3⁻¹ : SL(2,ℂ)).1 = !![((3⁻¹ : ℝ) : ℂ), 0; 0, ((3 : ℝ) : ℂ)] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [boostZ3] + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostFermionPairs.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean similarity index 97% rename from Physlib/Particles/QED/JetAlgebra/Invariants/BoostFermionPairs.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean index 2dc7cbbd4..3d098ba22 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostFermionPairs.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean @@ -5,9 +5,9 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.BoostPairs +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnPhotonTerms /-! -# Boost transformations of the fermion pairs +# Boosts acting on the fermion terms The paired boost actions on the weight-eight fermion bilinears `ψ̄_α (D_μ ψ)_β` and `(D̄_μ ψ̄)_α ψ_β`. @@ -19,7 +19,7 @@ set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -30,7 +30,7 @@ open Matrix MatrixGroups set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `u0`. -/ -lemma pairZ_u0 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_u0 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -66,7 +66,7 @@ lemma pairZ_u0 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `u1`. -/ -lemma pairZ_u1 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_u1 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -100,7 +100,7 @@ lemma pairZ_u1 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `u2`. -/ -lemma pairZ_u2 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_u2 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -134,7 +134,7 @@ lemma pairZ_u2 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `u3`. -/ -lemma pairZ_u3 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_u3 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -170,7 +170,7 @@ lemma pairZ_u3 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `u0`. -/ -lemma pairX_u0 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_u0 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -206,7 +206,7 @@ lemma pairX_u0 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `u1`. -/ -lemma pairX_u1 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_u1 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -242,7 +242,7 @@ lemma pairX_u1 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `u2`. -/ -lemma pairX_u2 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_u2 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -276,7 +276,7 @@ lemma pairX_u2 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `u3`. -/ -lemma pairX_u3 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_u3 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -310,7 +310,7 @@ lemma pairX_u3 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `u0`. -/ -lemma pairY_u0 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_u0 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -346,7 +346,7 @@ lemma pairY_u0 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `u1`. -/ -lemma pairY_u1 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_u1 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -380,7 +380,7 @@ lemma pairY_u1 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `u2`. -/ -lemma pairY_u2 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_u2 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -416,7 +416,7 @@ lemma pairY_u2 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `u3`. -/ -lemma pairY_u3 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_u3 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -450,7 +450,7 @@ lemma pairY_u3 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `ubar0`. -/ -lemma pairZ_ubar0 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_ubar0 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -486,7 +486,7 @@ lemma pairZ_ubar0 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `ubar1`. -/ -lemma pairZ_ubar1 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_ubar1 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -520,7 +520,7 @@ lemma pairZ_ubar1 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `ubar2`. -/ -lemma pairZ_ubar2 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_ubar2 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -554,7 +554,7 @@ lemma pairZ_ubar2 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Z`-boost on the σ-contracted fermion pair `ubar3`. -/ -lemma pairZ_ubar3 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_ubar3 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -590,7 +590,7 @@ lemma pairZ_ubar3 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `ubar0`. -/ -lemma pairX_ubar0 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_ubar0 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -626,7 +626,7 @@ lemma pairX_ubar0 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `ubar1`. -/ -lemma pairX_ubar1 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_ubar1 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -662,7 +662,7 @@ lemma pairX_ubar1 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `ubar2`. -/ -lemma pairX_ubar2 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_ubar2 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -696,7 +696,7 @@ lemma pairX_ubar2 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `X`-boost on the σ-contracted fermion pair `ubar3`. -/ -lemma pairX_ubar3 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_ubar3 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -730,7 +730,7 @@ lemma pairX_ubar3 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `ubar0`. -/ -lemma pairY_ubar0 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_ubar0 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -766,7 +766,7 @@ lemma pairY_ubar0 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `ubar1`. -/ -lemma pairY_ubar1 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_ubar1 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -800,7 +800,7 @@ lemma pairY_ubar1 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `ubar2`. -/ -lemma pairY_ubar2 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_ubar2 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -836,7 +836,7 @@ lemma pairY_ubar2 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action of the `Y`-boost on the σ-contracted fermion pair `ubar3`. -/ -lemma pairY_ubar3 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_ubar3 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -868,4 +868,4 @@ lemma pairY_ubar3 (t : ℝ) (ht : t ≠ 0) : match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean similarity index 95% rename from Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean index 3ce77a841..bd475986c 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostTransforms.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean @@ -5,15 +5,15 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.MonomialForm +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.AxisBoosts /-! -# Boost transformations of the weight-eight generators +# Boosts acting on the field strength For each axis `T ∈ {Z, X, Y}` the paired boost actions `rep(boost t) + rep(boost t⁻¹)` act on the weight-eight monomials with coefficients polynomial in `t^2` and `t⁻²`. This file records those actions on -the single field strengths `F_{ab}` (`genZ_*`, `genX_*`, `genY_*`) and on the -second derivatives `∂_r ∂_s F_{ab}` (`genZ_dd*`, `genX_dd*`, `genY_dd*`). +the single field strengths `F_{ab}` (`boostZ_*`, `boostX_*`, `boostY_*`) and on the +second derivatives `∂_r ∂_s F_{ab}` (`boostZ_dd*`, `boostX_dd*`, `boostY_dd*`). -/ @[expose] public section @@ -22,7 +22,7 @@ set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -35,12 +35,12 @@ open Matrix MatrixGroups ### The symmetrised boost average on the weight-eight sector For each axis `T ∈ {Z, X, Y}` the paired boost actions `rep(boost) + rep(boost⁻¹)` -at `t` and `t⁻¹` act on the Klein-symmetric weight-eight basis vectors with +at `t` and `t⁻¹` act on the rotation-symmetric weight-eight basis vectors with even coefficients in the boost parameter. A rational combination of the -paired boosts at `t = 2, 3, 4` together with the identity (`boostProjZ/X/Y`) -realises the Klein-restricted single-axis averages, and their mean `opS` +paired boosts at `t = 2, 3, 4` together with the identity (`boostAvgZ/X/Y`) +realises the rotation-averaged single-axis averages, and their mean `boostAvg` fixes every Lorentz-invariant vector while acting on the weight-eight basis -by an explicit rational matrix (the `opS_*` stage lemmas below). +by an explicit rational matrix (the `boostAvg_*` stage lemmas below). -/ @@ -157,7 +157,7 @@ lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) set_option maxHeartbeats 2000000 in /-- The `Z`-boost action on the field strength `F01`. -/ -lemma genZ_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -180,7 +180,7 @@ lemma genZ_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Z`-boost action on the field strength `F02`. -/ -lemma genZ_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -203,7 +203,7 @@ lemma genZ_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Z`-boost action on the field strength `F03`. -/ -lemma genZ_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by @@ -223,7 +223,7 @@ lemma genZ_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Z`-boost action on the field strength `F12`. -/ -lemma genZ_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by @@ -242,7 +242,7 @@ lemma genZ_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Z`-boost action on the field strength `F13`. -/ -lemma genZ_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -265,7 +265,7 @@ lemma genZ_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Z`-boost action on the field strength `F23`. -/ -lemma genZ_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -288,7 +288,7 @@ lemma genZ_F23 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `X`-boost action on the field strength `F01`. -/ -lemma genX_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by @@ -308,7 +308,7 @@ lemma genX_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `X`-boost action on the field strength `F02`. -/ -lemma genX_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -330,7 +330,7 @@ lemma genX_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `X`-boost action on the field strength `F03`. -/ -lemma genX_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -352,7 +352,7 @@ lemma genX_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `X`-boost action on the field strength `F12`. -/ -lemma genX_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -374,7 +374,7 @@ lemma genX_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `X`-boost action on the field strength `F13`. -/ -lemma genX_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -396,7 +396,7 @@ lemma genX_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `X`-boost action on the field strength `F23`. -/ -lemma genX_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by @@ -415,7 +415,7 @@ lemma genX_F23 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Y`-boost action on the field strength `F01`. -/ -lemma genY_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -438,7 +438,7 @@ lemma genY_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Y`-boost action on the field strength `F02`. -/ -lemma genY_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by @@ -458,7 +458,7 @@ lemma genY_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Y`-boost action on the field strength `F03`. -/ -lemma genY_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -480,7 +480,7 @@ lemma genY_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Y`-boost action on the field strength `F12`. -/ -lemma genY_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -503,7 +503,7 @@ lemma genY_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Y`-boost action on the field strength `F13`. -/ -lemma genY_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by @@ -522,7 +522,7 @@ lemma genY_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 2000000 in /-- The `Y`-boost action on the field strength `F23`. -/ -lemma genY_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • @@ -544,4 +544,4 @@ lemma genY_F23 (t : ℝ) (ht : t ≠ 0) : try (match_scalars <;> (push_cast; try field_simp; try ring)) end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean similarity index 96% rename from Physlib/Particles/QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean index 2687829c5..e46dba81d 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostSecondDerivatives.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean @@ -5,9 +5,9 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.BoostTransforms +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnFieldStrength /-! -# Boost transformations of the second-derivative field strengths +# Boosts acting on the derivatives of the field strength The paired boost actions `rep(boost t) + rep(boost t⁻¹)` on the weight-eight monomials `∂_r ∂_s F_{ab}`, for each of the three coordinate axes. @@ -19,7 +19,7 @@ set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -29,7 +29,7 @@ open Matrix MatrixGroups set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma genZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -59,7 +59,7 @@ lemma genZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma genZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -89,7 +89,7 @@ lemma genZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma genZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -119,7 +119,7 @@ lemma genZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma genZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -149,7 +149,7 @@ lemma genZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma genZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • @@ -178,7 +178,7 @@ lemma genZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma genZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • @@ -204,7 +204,7 @@ lemma genZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma genZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by @@ -225,7 +225,7 @@ lemma genZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma genZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by @@ -245,7 +245,7 @@ lemma genZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma genZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -275,7 +275,7 @@ lemma genZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma genZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -305,7 +305,7 @@ lemma genZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma genZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -335,7 +335,7 @@ lemma genZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Z`-boost action on the derivative field strength `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma genZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -365,7 +365,7 @@ lemma genZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma genX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • @@ -394,7 +394,7 @@ lemma genX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma genX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • @@ -420,7 +420,7 @@ lemma genX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma genX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -447,7 +447,7 @@ lemma genX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma genX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -474,7 +474,7 @@ lemma genX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma genX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -501,7 +501,7 @@ lemma genX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma genX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -528,7 +528,7 @@ lemma genX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma genX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -555,7 +555,7 @@ lemma genX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma genX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -582,7 +582,7 @@ lemma genX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma genX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -609,7 +609,7 @@ lemma genX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma genX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -636,7 +636,7 @@ lemma genX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma genX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by @@ -657,7 +657,7 @@ lemma genX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `X`-boost action on the derivative field strength `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma genX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by @@ -677,7 +677,7 @@ lemma genX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma genY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -707,7 +707,7 @@ lemma genY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma genY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -735,7 +735,7 @@ lemma genY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma genY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • @@ -764,7 +764,7 @@ lemma genY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma genY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • @@ -790,7 +790,7 @@ lemma genY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma genY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -817,7 +817,7 @@ lemma genY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma genY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -846,7 +846,7 @@ lemma genY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma genY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -874,7 +874,7 @@ lemma genY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma genY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -904,7 +904,7 @@ lemma genY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma genY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by @@ -925,7 +925,7 @@ lemma genY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma genY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by @@ -945,7 +945,7 @@ lemma genY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma genY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -974,7 +974,7 @@ lemma genY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The `Y`-boost action on the derivative field strength `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma genY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • @@ -999,4 +999,4 @@ lemma genY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : try (match_scalars <;> (push_cast; try field_simp; try ring)) end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostPairs.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean similarity index 83% rename from Physlib/Particles/QED/JetAlgebra/Invariants/BoostPairs.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean index ca04edc3e..bc0b38354 100644 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/BoostPairs.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean @@ -5,13 +5,13 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Invariants.BoostSecondDerivatives +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnFieldStrengthDerivatives /-! -# Boost transformations of the field-strength pairs +# Boosts acting on the photon terms The paired boost actions on the weight-eight products `F_{ab} F_{cd}` -(`pairZ_*`, `pairX_*`, `pairY_*`) and on the second-derivative field strengths -`∂_r ∂_s F_{ab}` (`pairZ_dd*`, `pairX_dd*`, `pairY_dd*`). +(`boostPairZ_*`, `boostPairX_*`, `boostPairY_*`) and on the second-derivative field strengths +`∂_r ∂_s F_{ab}` (`boostPairZ_dd*`, `boostPairX_dd*`, `boostPairY_dd*`). -/ @[expose] public section @@ -20,7 +20,7 @@ set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -28,10 +28,18 @@ namespace JetAlgebra open scoped minkowskiMatrix PauliMatrix open Matrix MatrixGroups +/-- Right distributivity on the jet algebra. The generic `add_mul` does not fire + here: the multiplication of the jet algebra comes from the tensor-product + instance, which typeclass search does not connect to `RightDistribClass`. -/ +lemma jetAdd_mul (u v w : JetAlgebra) : (u + v) * w = u * w + v * w := by grind + +/-- Left distributivity on the jet algebra; see `jetAdd_mul`. -/ +lemma jetMul_add (u v w : JetAlgebra) : u * (v + w) = u * v + u * w := by grind + set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F01 * F01`. -/ -lemma pairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + @@ -46,16 +54,16 @@ lemma pairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F01 t ht, - genZ_F01 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostZ_F01 t ht, + boostZ_F01 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F01 * F23`. -/ -lemma pairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + @@ -70,18 +78,18 @@ lemma pairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F01 t ht, - genZ_F01 t⁻¹ (inv_ne_zero ht), - genZ_F23 t ht, - genZ_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostZ_F01 t ht, + boostZ_F01 t⁻¹ (inv_ne_zero ht), + boostZ_F23 t ht, + boostZ_F23 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F02 * F02`. -/ -lemma pairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + @@ -96,16 +104,16 @@ lemma pairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F02 t ht, - genZ_F02 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostZ_F02 t ht, + boostZ_F02 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F02 * F13`. -/ -lemma pairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + @@ -120,11 +128,11 @@ lemma pairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F02 t ht, - genZ_F02 t⁻¹ (inv_ne_zero ht), - genZ_F13 t ht, - genZ_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostZ_F02 t ht, + boostZ_F02 t⁻¹ (inv_ne_zero ht), + boostZ_F13 t ht, + boostZ_F13 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0), fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 2)] @@ -133,7 +141,7 @@ lemma pairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F03 * F03`. -/ -lemma pairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + @@ -145,14 +153,14 @@ lemma pairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F03 t ht, - genZ_F03 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_F03 t ht, + boostZ_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F03 * F12`. -/ -lemma pairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + @@ -164,16 +172,16 @@ lemma pairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F03 t ht, - genZ_F03 t⁻¹ (inv_ne_zero ht), - genZ_F12 t ht, - genZ_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_F03 t ht, + boostZ_F03 t⁻¹ (inv_ne_zero ht), + boostZ_F12 t ht, + boostZ_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F12 * F12`. -/ -lemma pairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + @@ -185,14 +193,14 @@ lemma pairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F12 t ht, - genZ_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_F12 t ht, + boostZ_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F13 * F13`. -/ -lemma pairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + @@ -207,16 +215,16 @@ lemma pairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F13 t ht, - genZ_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostZ_F13 t ht, + boostZ_F13 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on `F23 * F23`. -/ -lemma pairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + @@ -231,16 +239,16 @@ lemma pairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genZ_F23 t ht, - genZ_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostZ_F23 t ht, + boostZ_F23 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F01 * F01`. -/ -lemma pairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + @@ -252,14 +260,14 @@ lemma pairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F01 t ht, - genX_F01 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_F01 t ht, + boostX_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F01 * F23`. -/ -lemma pairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + @@ -271,16 +279,16 @@ lemma pairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F01 t ht, - genX_F01 t⁻¹ (inv_ne_zero ht), - genX_F23 t ht, - genX_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_F01 t ht, + boostX_F01 t⁻¹ (inv_ne_zero ht), + boostX_F23 t ht, + boostX_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F02 * F02`. -/ -lemma pairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + @@ -295,16 +303,16 @@ lemma pairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F02 t ht, - genX_F02 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostX_F02 t ht, + boostX_F02 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F02 * F13`. -/ -lemma pairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + @@ -319,18 +327,18 @@ lemma pairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F02 t ht, - genX_F02 t⁻¹ (inv_ne_zero ht), - genX_F13 t ht, - genX_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostX_F02 t ht, + boostX_F02 t⁻¹ (inv_ne_zero ht), + boostX_F13 t ht, + boostX_F13 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F03 * F03`. -/ -lemma pairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + @@ -345,16 +353,16 @@ lemma pairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F03 t ht, - genX_F03 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostX_F03 t ht, + boostX_F03 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F03 * F12`. -/ -lemma pairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + @@ -369,11 +377,11 @@ lemma pairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F03 t ht, - genX_F03 t⁻¹ (inv_ne_zero ht), - genX_F12 t ht, - genX_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostX_F03 t ht, + boostX_F03 t⁻¹ (inv_ne_zero ht), + boostX_F12 t ht, + boostX_F12 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] @@ -382,7 +390,7 @@ lemma pairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F12 * F12`. -/ -lemma pairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + @@ -397,16 +405,16 @@ lemma pairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F12 t ht, - genX_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostX_F12 t ht, + boostX_F12 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F13 * F13`. -/ -lemma pairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + @@ -421,16 +429,16 @@ lemma pairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F13 t ht, - genX_F13 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostX_F13 t ht, + boostX_F13 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on `F23 * F23`. -/ -lemma pairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + @@ -442,14 +450,14 @@ lemma pairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genX_F23 t ht, - genX_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_F23 t ht, + boostX_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F01 * F01`. -/ -lemma pairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + @@ -464,16 +472,16 @@ lemma pairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F01 t ht, - genY_F01 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostY_F01 t ht, + boostY_F01 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F01 * F23`. -/ -lemma pairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + @@ -488,18 +496,18 @@ lemma pairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F01 t ht, - genY_F01 t⁻¹ (inv_ne_zero ht), - genY_F23 t ht, - genY_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostY_F01 t ht, + boostY_F01 t⁻¹ (inv_ne_zero ht), + boostY_F23 t ht, + boostY_F23 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F02 * F02`. -/ -lemma pairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + @@ -511,14 +519,14 @@ lemma pairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F02 t ht, - genY_F02 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_F02 t ht, + boostY_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F02 * F13`. -/ -lemma pairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + @@ -530,16 +538,16 @@ lemma pairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F02 t ht, - genY_F02 t⁻¹ (inv_ne_zero ht), - genY_F13 t ht, - genY_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_F02 t ht, + boostY_F02 t⁻¹ (inv_ne_zero ht), + boostY_F13 t ht, + boostY_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F03 * F03`. -/ -lemma pairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + @@ -554,16 +562,16 @@ lemma pairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F03 t ht, - genY_F03 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostY_F03 t ht, + boostY_F03 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F03 * F12`. -/ -lemma pairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + @@ -578,11 +586,11 @@ lemma pairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F03 t ht, - genY_F03 t⁻¹ (inv_ne_zero ht), - genY_F12 t ht, - genY_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostY_F03 t ht, + boostY_F03 t⁻¹ (inv_ne_zero ht), + boostY_F12 t ht, + boostY_F12 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] @@ -591,7 +599,7 @@ lemma pairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F12 * F12`. -/ -lemma pairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + @@ -606,16 +614,16 @@ lemma pairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F12 t ht, - genY_F12 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostY_F12 t ht, + boostY_F12 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F13 * F13`. -/ -lemma pairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + @@ -627,14 +635,14 @@ lemma pairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F13 t ht, - genY_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_F13 t ht, + boostY_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 4000000 in /-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on `F23 * F23`. -/ -lemma pairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + @@ -649,16 +657,16 @@ lemma pairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [genY_F23 t ht, - genY_F23 t⁻¹ (inv_ne_zero ht)] - simp only [add_mul, mul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, + simp only [boostY_F23 t ht, + boostY_F23 t⁻¹ (inv_ne_zero ht)] + simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma pairZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -669,13 +677,13 @@ lemma pairZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd01_F01 t ht, genZ_dd01_F01 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd01_F01 t ht, boostZ_dd01_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma pairZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -686,13 +694,13 @@ lemma pairZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd01_F23 t ht, genZ_dd01_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd01_F23 t ht, boostZ_dd01_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma pairZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -703,13 +711,13 @@ lemma pairZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd02_F02 t ht, genZ_dd02_F02 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd02_F02 t ht, boostZ_dd02_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma pairZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -720,13 +728,13 @@ lemma pairZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd02_F13 t ht, genZ_dd02_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd02_F13 t ht, boostZ_dd02_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma pairZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -735,13 +743,13 @@ lemma pairZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd03_F03 t ht, genZ_dd03_F03 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd03_F03 t ht, boostZ_dd03_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma pairZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -750,13 +758,13 @@ lemma pairZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd03_F12 t ht, genZ_dd03_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd03_F12 t ht, boostZ_dd03_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma pairZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -765,13 +773,13 @@ lemma pairZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd12_F03 t ht, genZ_dd12_F03 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd12_F03 t ht, boostZ_dd12_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma pairZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -780,13 +788,13 @@ lemma pairZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd12_F12 t ht, genZ_dd12_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd12_F12 t ht, boostZ_dd12_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma pairZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -797,13 +805,13 @@ lemma pairZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd13_F02 t ht, genZ_dd13_F02 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd13_F02 t ht, boostZ_dd13_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma pairZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -814,13 +822,13 @@ lemma pairZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd13_F13 t ht, genZ_dd13_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd13_F13 t ht, boostZ_dd13_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma pairZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -831,13 +839,13 @@ lemma pairZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd23_F01 t ht, genZ_dd23_F01 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd23_F01 t ht, boostZ_dd23_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Z`-boost on `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma pairZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostZel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + repLorentzGroup ((boostZel t ht)⁻¹) @@ -848,13 +856,13 @@ lemma pairZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostZel_inv] - simp only [genZ_dd23_F23 t ht, genZ_dd23_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostZ_dd23_F23 t ht, boostZ_dd23_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma pairX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -863,13 +871,13 @@ lemma pairX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd01_F01 t ht, genX_dd01_F01 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd01_F01 t ht, boostX_dd01_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma pairX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -878,13 +886,13 @@ lemma pairX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd01_F23 t ht, genX_dd01_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd01_F23 t ht, boostX_dd01_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma pairX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -895,13 +903,13 @@ lemma pairX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd02_F02 t ht, genX_dd02_F02 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd02_F02 t ht, boostX_dd02_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma pairX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -912,13 +920,13 @@ lemma pairX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd02_F13 t ht, genX_dd02_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd02_F13 t ht, boostX_dd02_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma pairX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -929,13 +937,13 @@ lemma pairX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd03_F03 t ht, genX_dd03_F03 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd03_F03 t ht, boostX_dd03_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma pairX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -946,13 +954,13 @@ lemma pairX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd03_F12 t ht, genX_dd03_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd03_F12 t ht, boostX_dd03_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma pairX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -963,13 +971,13 @@ lemma pairX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd12_F03 t ht, genX_dd12_F03 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd12_F03 t ht, boostX_dd12_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma pairX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -980,13 +988,13 @@ lemma pairX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd12_F12 t ht, genX_dd12_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd12_F12 t ht, boostX_dd12_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma pairX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -997,13 +1005,13 @@ lemma pairX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd13_F02 t ht, genX_dd13_F02 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd13_F02 t ht, boostX_dd13_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma pairX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -1014,13 +1022,13 @@ lemma pairX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd13_F13 t ht, genX_dd13_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd13_F13 t ht, boostX_dd13_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma pairX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -1029,13 +1037,13 @@ lemma pairX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd23_F01 t ht, genX_dd23_F01 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd23_F01 t ht, boostX_dd23_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `X`-boost on `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma pairX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostXel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + repLorentzGroup ((boostXel t ht)⁻¹) @@ -1044,13 +1052,13 @@ lemma pairX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostXel_inv] - simp only [genX_dd23_F23 t ht, genX_dd23_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostX_dd23_F23 t ht, boostX_dd23_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma pairY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1061,13 +1069,13 @@ lemma pairY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd01_F01 t ht, genY_dd01_F01 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd01_F01 t ht, boostY_dd01_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma pairY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1078,13 +1086,13 @@ lemma pairY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd01_F23 t ht, genY_dd01_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd01_F23 t ht, boostY_dd01_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma pairY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1093,13 +1101,13 @@ lemma pairY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd02_F02 t ht, genY_dd02_F02 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd02_F02 t ht, boostY_dd02_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma pairY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1108,13 +1116,13 @@ lemma pairY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd02_F13 t ht, genY_dd02_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd02_F13 t ht, boostY_dd02_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma pairY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1125,13 +1133,13 @@ lemma pairY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd03_F03 t ht, genY_dd03_F03 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd03_F03 t ht, boostY_dd03_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma pairY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1142,13 +1150,13 @@ lemma pairY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd03_F12 t ht, genY_dd03_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd03_F12 t ht, boostY_dd03_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma pairY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1159,13 +1167,13 @@ lemma pairY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd12_F03 t ht, genY_dd12_F03 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd12_F03 t ht, boostY_dd12_F03 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma pairY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1176,13 +1184,13 @@ lemma pairY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd12_F12 t ht, genY_dd12_F12 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd12_F12 t ht, boostY_dd12_F12 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma pairY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1191,13 +1199,13 @@ lemma pairY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd13_F02 t ht, genY_dd13_F02 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd13_F02 t ht, boostY_dd13_F02 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma pairY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1206,13 +1214,13 @@ lemma pairY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd13_F13 t ht, genY_dd13_F13 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd13_F13 t ht, boostY_dd13_F13 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma pairY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1223,13 +1231,13 @@ lemma pairY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd23_F01 t ht, genY_dd23_F01 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd23_F01 t ht, boostY_dd23_F01 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) set_option maxHeartbeats 2000000 in /-- The paired boost action of the `Y`-boost on `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma pairY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : +lemma boostPairY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : repLorentzGroup (boostYel t ht) (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + repLorentzGroup ((boostYel t ht)⁻¹) @@ -1240,8 +1248,8 @@ lemma pairY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [boostYel_inv] - simp only [genY_dd23_F23 t ht, genY_dd23_F23 t⁻¹ (inv_ne_zero ht)] + simp only [boostY_dd23_F23 t ht, boostY_dd23_F23 t⁻¹ (inv_ne_zero ht)] match_scalars <;> (push_cast; try field_simp; try ring) end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean new file mode 100644 index 000000000..51ec9756f --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean @@ -0,0 +1,459 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Grading.NeutralSectors +/-! +# The rotations by `π` about the coordinate axes + +The three rotations by `π` about the coordinate axes, lifted to `SL(2,ℂ)` as +`i σ_k`, and the subgroup `rotationPiSubgroup` they generate. Their Lorentz +matrices are the diagonal sign matrices fixing the time axis and the rotation +axis and reversing the two others, recorded here entry by entry. + +This is the finite subgroup of the classification; `Averages/RotationAverage` +is the average taken over it. Being finite it admits an honest invariant +average, unlike the boosts of `AxisBoosts`. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +### The rotations by `π` + +The three rotations by `π` about the coordinate axes lift to `SL(2,ℂ)` as +`i σ_k`; their Lorentz matrices are the diagonal sign matrices fixing the time +axis and the rotation axis and reversing the two others. Averaging over this +Klein four-group kills every tensor component with an odd index pattern; since +every antisymmetric index pair is odd under exactly two of the three parities, +the weight-four sector admits no invariant. + +-/ + +/-- The lift `diag(i, -i)` of the rotation by `π` about the `z`-axis. -/ +noncomputable def rotationPiZ : SL(2,ℂ) := + ⟨!![Complex.I, 0; 0, -Complex.I], by + simp [Matrix.det_fin_two_of]⟩ + +/-- The lift `i σ1` of the rotation by `π` about the `x`-axis. -/ +noncomputable def rotationPiX : SL(2,ℂ) := + ⟨!![0, Complex.I; Complex.I, 0], by + simp [Matrix.det_fin_two_of]⟩ + +/-- The lift `i σ2` of the rotation by `π` about the `y`-axis. -/ +noncomputable def rotationPiY : SL(2,ℂ) := + ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ + +/-- The subgroup of `SL(2,ℂ)` generated by the lifted rotations by `π` about the + three coordinate axes. In `SL(2,ℂ)` this is the quaternion group `Q₈`: each + lift squares to `-1` rather than to `1`, so it is the double cover of the Klein + four-group `{1, R_x, R_y, R_z}` of rotations by `π` inside the rotation group. + `rotationPiAvg` averages the representation over the four elements + `1, R_z, R_y, R_x`, which is the average over that Klein four-group. -/ +noncomputable def rotationPiSubgroup : Subgroup SL(2,ℂ) := + Subgroup.closure {rotationPiZ, rotationPiX, rotationPiY} + +lemma rotationPiZ_mem_rotationPiSubgroup : rotationPiZ ∈ rotationPiSubgroup := + Subgroup.subset_closure (by simp) + +lemma rotationPiX_mem_rotationPiSubgroup : rotationPiX ∈ rotationPiSubgroup := + Subgroup.subset_closure (by simp) + +lemma rotationPiY_mem_rotationPiSubgroup : rotationPiY ∈ rotationPiSubgroup := + Subgroup.subset_closure (by simp) + +/-- The sign pattern of the rotation by `π` about the `z`-axis. -/ +def rotationPiSignZ : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => -1 + | Sum.inr 1 => -1 + | Sum.inr 2 => 1 + +/-- The sign pattern of the rotation by `π` about the `x`-axis. -/ +def rotationPiSignX : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => 1 + | Sum.inr 1 => -1 + | Sum.inr 2 => -1 + +/-- The sign pattern of the rotation by `π` about the `y`-axis. -/ +def rotationPiSignY : Fin 1 ⊕ Fin 3 → ℝ + | Sum.inl _ => 1 + | Sum.inr 0 => -1 + | Sum.inr 1 => 1 + | Sum.inr 2 => -1 + +/-- The Lorentz matrix of the `z`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_rotationPiZ (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 a b = + if a = b then rotationPiSignZ a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [rotationPiZ, rotationPiSignZ, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- The Lorentz matrix of the `x`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_rotationPiX (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 a b = + if a = b then rotationPiSignX a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [rotationPiX, rotationPiSignX, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- The Lorentz matrix of the `y`-parity is the diagonal sign matrix. -/ +lemma toLorentzGroup_rotationPiY (a b : Fin 1 ⊕ Fin 3) : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 a b = + if a = b then rotationPiSignY a else 0 := by + refine Complex.ofReal_injective ?_ + rw [Lorentz.SL2C.toLorentzGroup_eq_trace] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + · simp [rotationPiY, rotationPiSignY, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, + Matrix.diag] + simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] + +/-- The inverse of the `z`-parity, entrywise. -/ +lemma rotationPiZ_inv_coe : + (rotationPiZ⁻¹ : SL(2,ℂ)).1 = !![-Complex.I, 0; 0, Complex.I] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [rotationPiZ] + +/-- The inverse of the `y`-parity, entrywise. -/ +lemma rotationPiY_inv_coe : + (rotationPiY⁻¹ : SL(2,ℂ)).1 = !![0, -1; 1, 0] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [rotationPiY] + +/-- The inverse of the `x`-parity, entrywise. -/ +lemma rotationPiX_inv_coe : + (rotationPiX⁻¹ : SL(2,ℂ)).1 = !![0, -Complex.I; -Complex.I, 0] := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> simp [rotationPiX] + + +/-! + +### The Lorentz matrices of the rotations, entry by entry + +-/ + +/-- Entries of the Lorentz matrix of `rotationPiZ`. -/ +lemma rotationPiMatZ_00 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_01 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_02 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_03 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_10 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_11 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inr 0) = -1 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_12 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_13 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_20 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_21 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_22 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inr 1) = -1 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_23 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_30 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_31 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_32 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +lemma rotationPiMatZ_33 : + (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inr 2) = 1 := by + rw [toLorentzGroup_rotationPiZ] + norm_num [rotationPiSignZ] + all_goals decide + +/-- Entries of the Lorentz matrix of `rotationPiX`. -/ +lemma rotationPiMatX_00 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_01 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_02 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_03 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_10 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_11 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inr 0) = 1 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_12 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_13 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_20 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_21 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_22 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inr 1) = -1 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_23 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_30 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_31 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_32 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +lemma rotationPiMatX_33 : + (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inr 2) = -1 := by + rw [toLorentzGroup_rotationPiX] + norm_num [rotationPiSignX] + all_goals decide + +/-- Entries of the Lorentz matrix of `rotationPiY`. -/ +lemma rotationPiMatY_00 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inl 0) = 1 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_01 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_02 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_03 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_10 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_11 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inr 0) = -1 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_12 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_13 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_20 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_21 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_22 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inr 1) = 1 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_23 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inr 2) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_30 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inl 0) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_31 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inr 0) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_32 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inr 1) = 0 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +lemma rotationPiMatY_33 : + (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inr 2) = -1 := by + rw [toLorentzGroup_rotationPiY] + norm_num [rotationPiSignY] + all_goals decide + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean new file mode 100644 index 000000000..1cdb4edd6 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeAction +/-! +# The invariant generators of the lepton–gauge-sector jet algebra + +The generating set of the gauge invariants — the embedded field-strength +derivatives together with the covariant derivatives of the lepton and of its +conjugate — and the gauge action written as an algebra homomorphism, which is +what lets the invariance of a product be read off its factors. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## Invariants of the lepton–gauge-sector jet algebra + +The field strengths of the B boson, embedded in the lepton–gauge-sector jet algebra, are exactly +invariant; the covariant derivatives of the lepton and of its conjugate transform +by the hypercharge characters `u(0)^6` and `u(0)^{-6}` of the value of the gauge +jet at the base point. The gauge invariants of the lepton–gauge-sector jet algebra are contained +in the algebra generated by these three families. + +-/ + +/-- The generating set of the invariants of the lepton–gauge-sector jet algebra: the embedded + field-strength derivatives together with the covariant derivatives of the + lepton and of its conjugate. -/ +noncomputable def invariantGenerators : Set JetAlgebra := + (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ + (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dψ p.1 p.2) ∪ + (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ p.1 p.2) + +/-! + +### The gauge action as an algebra homomorphism, and the intertwining + +-/ + +/-- The complexified B-boson gauge action as an algebra homomorphism. -/ +noncomputable def complexRepAlgHom (U : JetGaugeGroupI) : + (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra) := + AlgHom.ofLinearMap (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) + (by + rw [Algebra.TensorProduct.one_def, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul, + BBoson.JetAlgebra.repJetGaugeGroupI_apply_one]) + (BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul U) + +@[simp] +lemma complexRepAlgHom_apply (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + complexRepAlgHom U p = BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := rfl + +/-- The gauge action as an algebra homomorphism. -/ +noncomputable def repAlgHom (U : JetGaugeGroupI) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (complexRepAlgHom U) + (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) + +set_option maxHeartbeats 1000000 in +lemma repJetGaugeGroupI_eq_repAlgHom (U : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI U x = repAlgHom U x := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb] + | tmul p l => + rw [show repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) from by + rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul], + repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply] + +/-- The gauge action is multiplicative (term-level form avoiding elaboration + blowups on the tensor stack). -/ +lemma repJetGaugeGroupI_mul' (U : JetGaugeGroupI) (a b : JetAlgebra) : + repJetGaugeGroupI U (a * b) = + repJetGaugeGroupI U a * repJetGaugeGroupI U b := + (repJetGaugeGroupI_eq_repAlgHom U (a * b)).trans + ((map_mul (repAlgHom U) a b).trans + (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom U a).symm + (repJetGaugeGroupI_eq_repAlgHom U b).symm)) + +set_option maxHeartbeats 1000000 in +/-- On gauge jets with trivial value at the base point, the covariant elements + are exactly invariant, so the gauge action intertwines the covariant + substitution with the B-boson action alone. -/ +lemma repJetGaugeGroupI_covSubst (U : JetGaugeGroupI) (hU : U.eval.2.2 = 1) + (x : JetAlgebra) : + repJetGaugeGroupI U (covSubst x) = + covSubst (TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) + LinearMap.id x) := by + have hcovfix : (repAlgHom U).comp covExtHom = covExtHom := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) + simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, + AlgHom.toLinearMap_apply, covExtHom_ι] + have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = covMap := by + refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ + rw [LinearMap.comp_apply, covMap_basis, AlgHom.toLinearMap_apply, + ← repJetGaugeGroupI_eq_repAlgHom] + cases g with + | dψ s α => + rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, + repJetGaugeGroupI_Dψ, hU, one_pow, one_smul] + | dbarψ s α => + rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, + repJetGaugeGroupI_Dbarψ, hU, star_one, one_pow, one_smul] + exact LinearMap.congr_fun hlin m + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => simp only [map_add, ha, hb] + | tmul p l => + simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, covSubst_tmul] + rw [repJetGaugeGroupI_eq_repAlgHom] + have hm : repAlgHom U ((p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l) = + repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * + repAlgHom U (covExtHom l) := map_mul _ _ _ + have h1 : repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] 1 := by + rw [repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply] + congr 1 + exact (ExteriorAlgebra.map _).map_one + have h2 : repAlgHom U (covExtHom l) = covExtHom l := AlgHom.congr_fun hcovfix l + rw [hm, h1, h2] +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean new file mode 100644 index 000000000..06d0e2403 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean @@ -0,0 +1,276 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FieldStrength +/-! +# The total spacetime derivative on the lepton–gauge-sector jet algebra + +The formal total derivative `∂_μ`, the Leibniz extension of the total +derivatives of the B-boson and charged-lepton factors, together with its action +on the generators and its commutation relations. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## Jet derivatives + +The formal total spacetime derivative `∂_μ` on the lepton–gauge-sector jet algebra: the Leibniz +extension of the total derivatives of the two factors. Both factor derivatives +are even derivations, so the total derivative is an even derivation on the full +jet algebra, with no Koszul signs. + +-/ + +/-- The formal total spacetime derivative on the lepton–gauge-sector jet algebra in the + direction `μ`: the Leibniz extension of the total derivatives of the B-boson + and charged-lepton factors. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) LinearMap.id + + TensorProduct.map LinearMap.id (LeptonSinglet.JetAlgebra.jetDeriv μ) + +lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + jetDeriv μ (p ⊗ₜ[ℂ] l) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] l + + p ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.jetDeriv μ l := by + simp [jetDeriv] + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by + rw [show (1 : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, LinearMap.baseChange_tmul] + simp + +/-- The total derivative is an even derivation on the lepton–gauge-sector jet algebra: the + Leibniz rule holds with no Koszul signs. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + have hdist₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind + have hdist₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind + have hzero₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a + have hzero₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a + induction x using TensorProduct.induction_on with + | zero => simp [hzero₁] + | add a b ha hb => + simp only [hdist₁, map_add, ha, hb] + abel + | tmul p l => + induction y using TensorProduct.induction_on with + | zero => simp [hzero₂] + | add a' b' ha' hb' => + simp only [hdist₂, map_add, ha', hb'] + abel + | tmul p' l' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, jetDeriv_tmul, + BBoson.JetAlgebra.jetDeriv_baseChange_mul, LeptonSinglet.JetAlgebra.jetDeriv_mul, + TensorProduct.add_tmul, TensorProduct.tmul_add, hdist₁, hdist₂] + abel + +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [map_add, ha, hb] + | tmul p l => + simp [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_comm μ ν, + BBoson.JetAlgebra.jetDeriv_baseChange_comm μ ν p] + abel + +/-- Total derivatives commute, so an iterated derivative may be indexed by a + multiset of directions rather than by a list. -/ +instance : LeftCommutative + (fun (ν : Fin 1 ⊕ Fin 3) (A : JetAlgebra →ₗ[ℂ] JetAlgebra) => + jetDeriv ν ∘ₗ A) where + left_comm ν₁ ν₂ A := by + refine LinearMap.ext fun x => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply] + exact jetDeriv_comm ν₁ ν₂ (A x) + +/-- The iterated total spacetime derivative along a multiset of directions: + `∂_t = ∂_{μ₁} ⋯ ∂_{μ_k}` for `t = {μ₁, …, μ_k}`. The order is immaterial by + `jetDeriv_comm`, so the index is a multiset. -/ +noncomputable def jetDerivM (t : Multiset (Fin 1 ⊕ Fin 3)) : + JetAlgebra →ₗ[ℂ] JetAlgebra := + Multiset.foldr (fun ν A => jetDeriv ν ∘ₗ A) LinearMap.id t + +@[simp] +lemma jetDerivM_zero : jetDerivM 0 = LinearMap.id := by + simp [jetDerivM] + +lemma jetDerivM_cons (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : + jetDerivM (ν ::ₘ t) = jetDeriv ν ∘ₗ jetDerivM t := by + simp [jetDerivM] + +lemma jetDerivM_singleton (μ : Fin 1 ⊕ Fin 3) : jetDerivM {μ} = jetDeriv μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, jetDerivM_cons, + jetDerivM_zero, LinearMap.comp_id] + +lemma jetDerivM_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + jetDerivM (s + t) = jetDerivM s ∘ₗ jetDerivM t := by + induction s using Multiset.induction_on with + | empty => simp [jetDerivM_zero] + | cons μ s ih => + trans jetDerivM (μ ::ₘ (s + t)) + · simp + simp only [jetDerivM_cons, ih] + exact Eq.symm (LinearMap.comp_assoc (jetDerivM t) (jetDerivM s) (jetDeriv μ)) + +lemma jetDerivM_cons' (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : + jetDerivM (ν ::ₘ t) = jetDerivM t ∘ₗ jetDeriv ν := by + trans jetDerivM (t + {ν}) + · congr + rw [add_comm] + simp + · rw [jetDerivM_add, jetDerivM_singleton] + +lemma jetDerivM_jetDerivM (s t : Multiset (Fin 1 ⊕ Fin 3)) (x : JetAlgebra) : + jetDerivM t (jetDerivM s x) = jetDerivM (t + s) x := by + rw [jetDerivM_add] + simp + +lemma jetDerivM_jetDeriv (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) + (a : JetAlgebra) : + jetDerivM t (jetDeriv μ a) = jetDerivM (μ ::ₘ t) a := by + trans (jetDerivM t ∘ₗ jetDeriv μ) a + · rfl + rw [← jetDerivM_cons'] + +lemma jetDeriv_jetDerivM (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) + (a : JetAlgebra) : + jetDeriv μ (jetDerivM t a) = jetDerivM (μ ::ₘ t) a := by + trans (jetDeriv μ ∘ₗ jetDerivM t) a + · rfl + rw [← jetDerivM_cons] + +lemma ofGenerator_dB_eq_jetDerivM (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + [JetGenerators.dB s μ]ₐ = jetDerivM s [.dB 0 μ]ₐ := by + induction s using Multiset.induction_on with + | empty => rw [jetDerivM_zero, LinearMap.id_coe, id_eq] + | cons ν t ih => + rw [jetDerivM_cons, LinearMap.comp_apply, ← ih] + simp only [ofGenerator] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, + add_zero, BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] + congr 2 + rw [add_comm, Multiset.singleton_add] + +lemma jetDerivM_apply_mul_eq_powerset_sum (t : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : + jetDerivM t (x * y) = (t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum := by + induction t using Multiset.induction_on with + | empty => + simp only [jetDerivM_zero, LinearMap.id_coe, id_eq, Multiset.powerset_zero, zero_tsub, + Multiset.map_singleton, Multiset.sum_singleton] + | cons ν t ih => + calc _ + _ = jetDeriv ν (jetDerivM t (x * y)) := by simp [jetDerivM_cons] + _ = jetDeriv ν ((t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum) := by + congr + _ = (t.powerset.map (jetDeriv ν ∘ fun s => (jetDerivM s x * jetDerivM (t - s) y))).sum := by + rw [← Multiset.map_map] + exact map_multiset_sum (jetDeriv ν) _ + _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x * jetDerivM (t - s) y))).sum := by + rfl + _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y + + jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by + simp [jetDeriv_mul] + _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum + + (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by + exact Multiset.sum_map_add + _ = (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum + + (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum + := by abel + conv_rhs => rw [Multiset.powerset_cons] + simp only [Multiset.map_add, Multiset.map_map, Function.comp_apply, Multiset.sub_cons, + Multiset.erase_cons_head, Multiset.sum_add] + congr 1 + · congr 1 + apply Multiset.map_congr (by rfl) + intro s hs + rw [jetDeriv_jetDerivM] + congr + exact (Multiset.cons_sub_of_le ν (Multiset.mem_powerset.mp hs)).symm + · congr + funext s + simp [jetDeriv_jetDerivM] + +lemma jetDerivM_apply_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : + jetDerivM s (x * y) = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + ((∏ ν, (Multiset.toFinsupp s ν).choose (p.1 ν) : ℕ) : ℂ) • + (jetDerivM (Finsupp.toMultiset p.1) x * jetDerivM (Finsupp.toMultiset p.2) y) := by + have hcount : ∀ u t : Multiset (Fin 1 ⊕ Fin 3), Multiset.count t u.powerset = + ∏ ν, (Multiset.count ν u).choose (Multiset.count ν t) := by + intro u + induction u using Multiset.induction_on with + | empty => + intro t + rcases eq_or_ne t 0 with rfl | h + · simp + · obtain ⟨a, ha⟩ := Multiset.exists_mem_of_ne_zero h + rw [Finset.prod_eq_zero (Finset.mem_univ a)] + · simp [h] + · simp [Nat.choose_eq_zero_of_lt, Multiset.count_pos.mpr ha] + | cons a u ih => + intro t + rw [Multiset.powerset_cons, Multiset.count_add] + by_cases ha : a ∈ t + · obtain ⟨m, hm⟩ : ∃ m, Multiset.count a t = m + 1 := + ⟨Multiset.count a t - 1, by have := Multiset.count_pos.mpr ha; omega⟩ + have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = + Multiset.count (t.erase a) u.powerset := by + conv_lhs => rw [← Multiset.cons_erase ha] + exact Multiset.count_map_eq_count' _ _ (fun v w h => by simpa using h) _ + have hQ : ∀ ν ∈ Finset.univ.erase a, + (Multiset.count ν u).choose (Multiset.count ν (t.erase a)) = + (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by + rw [Multiset.count_erase_of_ne (Finset.mem_erase.mp hν).1] + have hR : ∀ ν ∈ Finset.univ.erase a, + (Multiset.count ν (a ::ₘ u)).choose (Multiset.count ν t) = + (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by + rw [Multiset.count_cons_of_ne (Finset.mem_erase.mp hν).1] + rw [h2, ih t, ih (t.erase a)] + simp only [← Finset.mul_prod_erase Finset.univ _ (Finset.mem_univ a)] + rw [Finset.prod_congr rfl hQ, Finset.prod_congr rfl hR, ← add_mul, + Multiset.count_erase_self, Multiset.count_cons_self, hm, Nat.add_sub_cancel, + Nat.choose_succ_succ'] + ring + · have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = 0 := + Multiset.count_eq_zero.mpr fun h => by + obtain ⟨v, _, rfl⟩ := Multiset.mem_map.mp h + exact ha (Multiset.mem_cons_self a v) + rw [h2, ih t, add_zero] + refine Finset.prod_congr rfl fun ν _ => ?_ + rcases eq_or_ne ν a with rfl | hν + · simp [Multiset.count_eq_zero.mpr ha] + · rw [Multiset.count_cons_of_ne hν] + have hsum : ∀ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), + Finsupp.toMultiset p.1 + Finsupp.toMultiset p.2 = s := fun p hp => by + rw [← map_add, Finset.mem_antidiagonal.mp hp, Multiset.toFinsupp_toMultiset] + rw [jetDerivM_apply_mul_eq_powerset_sum, Finset.sum_multiset_map_count] + refine Finset.sum_nbij' (fun t => (Multiset.toFinsupp t, Multiset.toFinsupp (s - t))) + (fun p => Finsupp.toMultiset p.1) (fun t ht => ?_) (fun p hp => ?_) + (fun t _ => Multiset.toFinsupp_toMultiset t) (fun p hp => ?_) (fun t _ => ?_) + · rw [Finset.mem_antidiagonal, ← map_add, add_tsub_cancel_of_le (by simpa using ht)] + · simpa using Multiset.le_iff_exists_add.mpr ⟨Finsupp.toMultiset p.2, (hsum p hp).symm⟩ + · refine Prod.ext (Finsupp.toMultiset_toFinsupp p.1) ?_ + rw [← hsum p hp, add_tsub_cancel_left] + exact Finsupp.toMultiset_toFinsupp p.2 + · simp only [Multiset.toFinsupp_apply, Multiset.toFinsupp_toMultiset, hcount] + exact (Nat.cast_smul_eq_nsmul ℂ _ _).symm +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean similarity index 64% rename from Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean index d416b7728..5bfbcbd29 100644 --- a/Physlib/Particles/QED/JetAlgebra/LorentzGroup.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean @@ -5,16 +5,16 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.Basic +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.DerivativeOrder public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic /-! -# THe Lorentz group action on the QED jet algebra +# THe Lorentz group action on the lepton–gauge-sector jet algebra -/ @[expose] public section -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra @@ -29,14 +29,14 @@ open Matrix MatrixGroups noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetAlgebra := BBoson.JetAlgebra.complexRepLorentzGroup.tprod LeptonSinglet.JetAlgebra.repLorentzGroup -/-- The QED Lorentz action on a pure tensor. -/ +/-- The Lorentz action on a pure tensor. -/ lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl -/-- The Lorentz action on the QED jet algebra agrees with the algebra +/-- The Lorentz action on the lepton–gauge-sector jet algebra agrees with the algebra homomorphism obtained as the tensor product of the complexified B-boson action with the exterior-algebra action on the charged-lepton factor. -/ lemma repLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : JetAlgebra) : @@ -44,7 +44,7 @@ lemma repLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : JetAlgebra) : (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) x := rfl -/-- The Lorentz action on the QED jet algebra is multiplicative (term-level +/-- The Lorentz action on the lepton–gauge-sector jet algebra is multiplicative (term-level form). -/ lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by @@ -124,7 +124,7 @@ lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) rw [TensorProduct.tmul_smul] rfl -/-- The Lorentz action on the zeroth-order B-boson generator of the QED jet +/-- The Lorentz action on the zeroth-order B-boson generator of the lepton–gauge-sector jet algebra. -/ lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : repLorentzGroup Λ [JetGenerators.dB {} μ]ₐ = @@ -234,6 +234,157 @@ lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) simp only [Dbarψ_singleton, map_add, map_smul, repLorentzGroup_apply_mul, repLorentzGroup_B, repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton, smul_add, Finset.sum_add_distrib, smul_smul, smul_sum_mul_sum] + +/-! + +### The transformation law of the field strengths + +The embedded field-strength derivatives are tensors: every index, the +derivative indices included, transforms by the Lorentz matrix. For a +*diagonal* Lorentz matrix this collapses to a scaling by the product of the +signs carried by the indices, which is what the parity and boost arguments of +`Invariants/` use. + +-/ + +/-- Under a diagonal Lorentz transformation the field strength scales by the + product of the signs of its two indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {} μ ν) = + ((sgn μ * sgn ν : ℝ) : ℂ) • fieldStrengthDeriv {} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_nil] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] + +/-- The transformation law of the embedded first-derivative field strength: + a three-index tensor, all indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_singleton (Λ : SL(2,ℂ)) + (ρ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {ρ} μ ν) = + ∑ r, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) : ℝ)) : ℂ) • + fieldStrengthDeriv {r} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + +/-- Under a diagonal Lorentz transformation the derivative field strength + scales by the product of the signs of its three indices. -/ +lemma repLorentzGroup_diag_fieldStrengthDeriv_singleton {M : SL(2,ℂ)} + {sgn : Fin 1 ⊕ Fin 3 → ℝ} + (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = + if a = b then sgn a else 0) (ρ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup M (fieldStrengthDeriv {ρ} μ ν) = + ((sgn ρ * (sgn μ * sgn ν) : ℝ) : ℂ) • fieldStrengthDeriv {ρ} μ ν := by + rw [repLorentzGroup_fieldStrengthDeriv_singleton] + rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun a _ => + Finset.sum_eq_zero fun b _ => by + rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ρ) h)] + rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by + rw [hM a μ, if_neg ha, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ μ) h)] + rw [Finset.sum_eq_single ν (fun b _ hb => by + rw [hM b ν, if_neg hb, mul_zero, mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ ν) h)] + rw [hM ρ ρ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] + +set_option maxHeartbeats 2000000 in +/-- The transformation law of the embedded second-derivative field strength: + a four-index tensor, all indices transforming by the Lorentz matrix. -/ +lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) + (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) = + ∑ r, ∑ s, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) : ℝ)) : ℂ) • + fieldStrengthDeriv {r, s} a b := by + have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), + (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + intro r X + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rfl + have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (1 : LeptonSinglet.JetAlgebra)) := rfl + rw [fieldStrengthDeriv, happ, + BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + +/-! + +### The transformation law of a zero-derivative fermion pair + +-/ + +set_option maxHeartbeats 1000000 in +/-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ +lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = + ∑ γ, ∑ δ, ((Λ⁻¹).1 α γ * star ((Λ⁻¹).1 β δ)) • + (Dbarψ [] γ * Dψ [] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] + simp only [hsm, hms, hsmul] + +set_option maxHeartbeats 1000000 in +/-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ +lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : + repLorentzGroup Λ (Dψ [] α * Dbarψ [] β) = + ∑ γ, ∑ δ, (star ((Λ⁻¹).1 α γ) * (Λ⁻¹).1 β δ) • + (Dψ [] γ * Dbarψ [] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] + simp only [hsm, hms, hsmul] + /-! ### B.2. The invarance condition @@ -279,7 +430,7 @@ lemma InvariantSubmodule.mem_iff_isInvariant (x : JetAlgebra) : · exact fun hx => Submodule.subset_span hx -/-- Characterization of the invariants of the QED jet algebra: an element is +/-- Characterization of the invariants of the lepton–gauge-sector jet algebra: an element is invariant under the jet gauge group and the Lorentz group precisely when it lies in the algebra generated by the field-strength derivatives and the covariant derivatives, is invariant under the constant gauge transformations, @@ -328,4 +479,4 @@ lemma isInvariant_iff_mem_adjoin_invariantGenerators (x : JetAlgebra) : end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/MassDim.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean similarity index 75% rename from Physlib/Particles/QED/JetAlgebra/MassDim.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean index 9bec3f02a..6c53a0c9d 100644 --- a/Physlib/Particles/QED/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean @@ -5,12 +5,12 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.QED.JetAlgebra.LorentzGroup +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.MassDim /-! -# Mass dimension on the QED jet algebra +# Mass dimension on the lepton–gauge-sector jet algebra *Note*: In this file we use the notion 'mass weight'. The idea been that the 'mass weight' is twice the mass dimension. This is because it is easier to work exclusively with @@ -20,7 +20,7 @@ integers, and the mass dimension of the fermion fields is 3/2. @[expose] public section -namespace QED +namespace LeptonGaugeSector open TensorProduct StandardModel Matrix MatrixGroups /-- We define the mass weight of a term as two times its mass dimnesion. -/ @@ -36,7 +36,7 @@ namespace JetAlgebra ## A. The massWeightScaling algebra homomorphism -/ -/-- The mass-dimension scaling on the QED jet algebra: the algebra map +/-- The mass-dimension scaling on the lepton–gauge-sector jet algebra: the algebra map multiplying each generator by `c ^ w`, where `w` is twice its mass dimension. It is the tensor product of the scalings on the B-boson and charged-lepton jet algebras. -/ @@ -162,7 +162,7 @@ lemma massWeightScale_mul_eigen {x y : JetAlgebra} {m n : ℕ} /-- The mass-dimension scaling at a real scalar commutes with the Lorentz - action on the QED jet algebra. -/ + action on the lepton–gauge-sector jet algebra. -/ lemma massWeightScale_ofReal_repLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) (x : JetAlgebra) : massWeightScale (r : ℂ) (repLorentzGroup Λ x) = @@ -177,7 +177,7 @@ lemma massWeightScale_ofReal_repLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) /-- The mass-dimension scaling commutes with the constant gauge action on the - QED jet algebra. -/ + lepton–gauge-sector jet algebra. -/ lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) (x : JetAlgebra) : massWeightScale c (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = @@ -206,11 +206,71 @@ noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := MassWeightLESubmodule n ⊓ InvariantSubmodule +/-- Eigenvectors of weight `m ≤ n` lie in the weight-`≤ n` submodule. -/ +lemma mem_massWeightLESubmodule_of_forall_massWeightScale {x : JetAlgebra} + {m n : ℕ} (hmn : m ≤ n) + (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) : + x ∈ MassWeightLESubmodule n := + Submodule.subset_span ⟨m, hmn, hx⟩ + +/-- Independence of the powers `c ↦ c ^ w`: if a finite combination + `∑ c ^ w • v w` vanishes for every scalar `c`, then every `v w` vanishes. This + is what separates the mass-weight components of an element. -/ +lemma eq_zero_of_forall_sum_pow_smul_eq_zero (s : Finset ℕ) (v : ℕ → JetAlgebra) + (h : ∀ c : ℂ, ∑ w ∈ s, c ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : v w = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hp : ∀ c : ℂ, Polynomial.eval c + (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by + intro c + have h2 := congrArg φ (h c) + rw [map_sum, map_zero] at h2 + rw [Polynomial.eval_finsetSum] + simpa [Polynomial.eval_monomial, mul_comm] using h2 + have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := + Polynomial.funext fun c => by rw [hp c, Polynomial.eval_zero] + have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff + +/-- Every element of the weight-`≤ n` submodule is a sum of exact-weight + eigenvectors of the mass-weight scaling. -/ +lemma exists_eigen_decomp_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} + (hx : x ∈ MassWeightLESubmodule n) : + ∃ z : ℕ → JetAlgebra, + (∀ m, ∀ c : ℂ, massWeightScale c (z m) = c ^ m • z m) ∧ + x = ∑ m ∈ Finset.range (n + 1), z m := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨m, hmn, hym⟩ := hy + refine ⟨fun k => if k = m then y else 0, fun k c => ?_, ?_⟩ + · by_cases hk : k = m + · subst hk + simpa using hym c + · simp [hk] + · rw [Finset.sum_ite_eq' (Finset.range (n + 1)) m fun _ => y, + if_pos (Finset.mem_range.mpr (Nat.lt_succ_of_le hmn))] + | zero => + exact ⟨fun _ => 0, by simp, by simp⟩ + | add a b ha hb iha ihb => + obtain ⟨z₁, hz₁, rfl⟩ := iha + obtain ⟨z₂, hz₂, rfl⟩ := ihb + refine ⟨z₁ + z₂, fun m c => ?_, ?_⟩ + · simp only [Pi.add_apply, map_add, hz₁ m c, hz₂ m c, smul_add] + · rw [← Finset.sum_add_distrib] + rfl + | smul c a ha iha => + obtain ⟨z, hz, rfl⟩ := iha + refine ⟨c • z, fun m c' => ?_, ?_⟩ + · simp only [Pi.smul_apply, map_smul, hz m c', smul_comm c] + · rw [Finset.smul_sum] + rfl + /-! ## D. The mass dimension polynomial. -The QED jet algebra is the tensor product of the two factors, and mass weights +The lepton–gauge-sector jet algebra is the tensor product of the two factors, and mass weights add under that product, so the mass-weight polynomial of the whole is assembled from the two factor polynomials: push each into `Polynomial JetAlgebra` along the tensor inclusions and multiply. On monomials this is exactly @@ -218,7 +278,7 @@ tensor inclusions and multiply. On monomials this is exactly -/ -/-- The mass-weight polynomial on the QED jet algebra, assembled from the +/-- The mass-weight polynomial on the lepton–gauge-sector jet algebra, assembled from the mass-weight polynomials of the two factors. -/ noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := (Algebra.TensorProduct.lift (Polynomial.mapAlgHom inclB) @@ -234,4 +294,4 @@ lemma massWeightPoly_tmul (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSingle end JetAlgebra -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean new file mode 100644 index 000000000..4a0e912ff --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean @@ -0,0 +1,356 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.ThetaTerm +/-! +# The fermion kinetic terms + +The kinetic terms `i ψ̄ σ̄^μ (D_μ ψ)` and `-i (D̄_μ ψ̄) σ̄^μ ψ` of the charged +lepton. Gauge invariance is the cancellation of the hypercharge characters +between the lepton and its conjugate; Lorentz invariance is the intertwining +identity of the contraction matrices `σ̄^μ`. Both have mass weight eight. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The spinor contraction matrices of the right-handed kinetic term: the + transposed covariant Pauli matrices `(σ̄^μ)ᵀ = (1, -σ1, σ2, -σ3)`. In the + conventions of this repository the right-handed lepton field transforms by + the entrywise conjugate of `Λ` and its jet coordinates by the contragredient + dual, so the pairing of `ψ̄_α`, `(D_μ ψ)_β` and the derivative index `μ` is + Lorentz invariant precisely through these matrices; this is the intertwining + identity `sum_kineticPauli_contraction` below. -/ +noncomputable def kineticPauli (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := + ((PauliMatrix.pauliSelfAdjoint' μ).1)ᵀ + +/-- The fermion kinetic term `i ψ̄_α (σ̄^μ)ᵀ_{α β} (D_μ ψ)_β` of the + right-handed charged-lepton singlet, with the covariant derivative on the + lepton. Mass weight eight. -/ +noncomputable def fermionKineticTerm : JetAlgebra := + Complex.I • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [] α * Dψ [μ] β) + +/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ̄^μ)ᵀ_{α β} ψ_β`, with + the covariant derivative on the conjugate lepton. Mass weight eight. -/ +noncomputable def fermionKineticTermBar : JetAlgebra := + (-Complex.I) • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [μ] α * Dψ [] β) + +/-- The hypercharge scalars of a lepton–conjugate-lepton pair cancel by + unitarity. -/ +lemma repJetGaugeGroupI_Dbarψ_mul_Dψ (U : JetGaugeGroupI) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + repJetGaugeGroupI U (Dbarψ l α * Dψ l' β) = Dbarψ l α * Dψ l' β := by + have hz : star ((U.eval.2.2 : unitary ℂ) : ℂ) * ((U.eval.2.2 : unitary ℂ) : ℂ) = 1 := + (Unitary.mem_iff.mp (U.eval.2.2).2).1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dbarψ, + Submonoid.smul_def, Submonoid.smul_def, SubmonoidClass.coe_pow, + SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← mul_pow, hz, + one_pow, one_smul] + +lemma repJetGaugeGroupI_fermionKineticTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] + +lemma repJetGaugeGroupI_fermionKineticTermBar (U : JetGaugeGroupI) : + repJetGaugeGroupI U fermionKineticTermBar = fermionKineticTermBar := by + rw [fermionKineticTermBar, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] + +/-- The Lorentz intertwining identity of the kinetic contraction matrices: + transporting the two spinor slots contragrediently and the derivative slot by + the Lorentz matrix reproduces the contraction matrices. This is the identity + `L(Λ) L(Λ⁻¹) = 1` transported through `L(M†) = L(M)ᵀ`. -/ +lemma sum_kineticPauli_contraction (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) + (α' β' : Fin 2) : + ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' := by + classical + have hdet : Matrix.det ((Λ⁻¹).1ᴴ) = 1 := by + rw [Matrix.det_conjTranspose, Matrix.SpecialLinearGroup.det_coe] + exact star_one ℂ + have hval : ∀ μ, (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 = + ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + intro μ + have h := congrArg Subtype.val + (Lorentz.SL2C.toSelfAdjointMap_basis + (M := (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))) μ) + simp only [Lorentz.SL2C.toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', + Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, + selfAdjoint.val_smul] at h + calc (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 + = ∑ j, (Lorentz.SL2C.toLorentzGroup + (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 j μ • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + rw [← h] + congr 1 + rw [show ((⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ)) : + Matrix (Fin 2) (Fin 2) ℂ)ᴴ = (Λ⁻¹).1 from + Matrix.conjTranspose_conjTranspose _] + _ = ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • + (PauliMatrix.pauliSelfAdjoint' j).1 := by + refine Finset.sum_congr rfl fun j _ => ?_ + congr 1 + rw [show (Lorentz.SL2C.toLorentzGroup + (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 = + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1ᵀ from + Lorentz.SL2C.toLorentzGroup_conjTranspose rfl, + Matrix.transpose_apply] + have hsand : ∀ μ, (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β'))) = + ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + intro μ + have hentry := congrArg (fun A : Matrix (Fin 2) (Fin 2) ℂ => A β' α') (hval μ) + simp only [Matrix.sum_apply, Matrix.smul_apply] at hentry + calc (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * star ((Λ⁻¹).1 β β'))) + = ((Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1) β' α' := by + rw [Matrix.mul_apply] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Matrix.mul_apply, Finset.sum_mul] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [Matrix.conjTranspose_apply, kineticPauli, Matrix.transpose_apply] + ring + _ = ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + rw [hentry] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [kineticPauli, Matrix.transpose_apply, Complex.real_smul] + calc ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β'))) + = ∑ μ, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β')) := by + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + ring + _ = ∑ μ, ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + ((((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β') := by + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [hsand, Finset.mul_sum] + _ = ∑ j, ((∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * + kineticPauli j α' β' := by + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [Complex.ofReal_sum, Finset.sum_mul] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Complex.ofReal_mul] + ring + _ = kineticPauli ν α' β' := by + have hmul : ∀ j, (∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j) = + ((1 : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ)) ν j := by + intro j + rw [← Matrix.mul_apply, + show ((Lorentz.SL2C.toLorentzGroup Λ).1 * + (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 : + Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) = + ((Lorentz.SL2C.toLorentzGroup Λ * + Lorentz.SL2C.toLorentzGroup Λ⁻¹ : LorentzGroup 3) : + Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) from rfl, + ← map_mul, mul_inv_cancel, map_one] + rfl + simp only [hmul, Matrix.one_apply] + rw [Finset.sum_eq_single ν (fun j _ hj => by + rw [if_neg (Ne.symm hj), Complex.ofReal_zero, zero_mul]) + (fun h => absurd (Finset.mem_univ ν) h), if_pos rfl, + Complex.ofReal_one, one_mul] + +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the fermion kinetic term: the transformation of the + two spinor slots and the derivative slot cancels through the intertwining + identity of the contraction matrices. -/ +lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by + have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, + repLorentzGroup_Dψ_singleton] + simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] + -- move the primed sums out and the unprimed sums in + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] + conv_rhs => rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => + Finset.sum_congr rfl fun β' _ => ?_ + conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] + conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] + rw [← Finset.sum_smul] + rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * + ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β')))) = kineticPauli ν α' β' from + sum_kineticPauli_contraction Λ ν α' β'] + +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the conjugate fermion kinetic term. -/ +lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTermBar = fermionKineticTermBar := by + have hsmS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [fermionKineticTermBar, map_smul] + congr 1 + rw [map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, + repLorentzGroup_Dψ_nil] + simp only [hsmS, hsmF, hmsF, hsmul, Finset.smul_sum, smul_smul] + -- move the transformed sums out and the original sums in + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, ν, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, ν, 2, α']; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, ν, 2, α']; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun α' _ => + Finset.sum_congr rfl fun β' _ => ?_ + conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] + conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] + rw [← Finset.sum_smul] + rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α α' * + star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' from by + rw [← sum_kineticPauli_contraction Λ ν α' β'] + refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun α _ => + Finset.sum_congr rfl fun β _ => ?_ + ring] + +lemma fermionKineticTerm_mem_massWeightLESubmodule : + fermionKineticTerm ∈ MassWeightLESubmodule 8 := by + rw [fermionKineticTerm] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => + Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => + Submodule.smul_mem _ _ ?_) + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 3 + 5) le_rfl + (massWeightScale_mul_eigen (m := 3) (n := 5) + (fun c => massWeightScale_Dbarψ c [] α) + (fun c => massWeightScale_Dψ c [μ] β)) + +lemma fermionKineticTermBar_mem_massWeightLESubmodule : + fermionKineticTermBar ∈ MassWeightLESubmodule 8 := by + rw [fermionKineticTermBar] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => + Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => + Submodule.smul_mem _ _ ?_) + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 5 + 3) le_rfl + (massWeightScale_mul_eigen (m := 5) (n := 3) + (fun c => massWeightScale_Dbarψ c [μ] α) + (fun c => massWeightScale_Dψ c [] β)) + +set_option maxHeartbeats 2000000 in +set_option linter.unusedSimpArgs false in +/-- The fermion kinetic term as an explicit combination of the eight + `ψ̄ (D ψ)` monomials. -/ +lemma fermionKineticTerm_eq : fermionKineticTerm = + Complex.I • ((Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - Complex.I • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) := by + rw [fermionKineticTerm] + congr 1 + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + Fin.sum_univ_two] + norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.transpose_apply, Matrix.one_apply] + module + +set_option maxHeartbeats 2000000 in +set_option linter.unusedSimpArgs false in +/-- The conjugate fermion kinetic term as an explicit combination of the eight + `(D̄ ψ̄) ψ` monomials. -/ +lemma fermionKineticTermBar_eq : fermionKineticTermBar = + (-Complex.I) • ((Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - Complex.I • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) := by + rw [fermionKineticTermBar] + congr 1 + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + Fin.sum_univ_two] + norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.transpose_apply, Matrix.one_apply] + module + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean new file mode 100644 index 000000000..707d6e8b4 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean @@ -0,0 +1,211 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.MassDim +/-! +# The Maxwell term + +The kinetic term `F_{μν} F^{μν}` of the photon: the square of the field strength +with both indices raised by the Minkowski metric. It is gauge invariant because +the field strength is, Lorentz invariant by the defining identity of the Lorentz +group, and of mass weight eight, that is mass dimension four. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The Maxwell kinetic term `F_{μν} F^{μν}`: the field-strength square with + both indices raised by the (diagonal) Minkowski metric. Mass weight eight. -/ +noncomputable def maxwellTerm : JetAlgebra := + ∑ μ, ∑ ν, ((η μ μ * η ν ν : ℝ) : ℂ) • + (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) + +lemma repJetGaugeGroupI_maxwellTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U maxwellTerm = maxwellTerm := by + rw [maxwellTerm, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul] + congr 1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv] + +/-- The component form of the Lorentz-group defining identity: contracting two + Lorentz matrices with the (diagonal, involutive) Minkowski metric over their + second indices reproduces the metric. -/ +lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : + ∑ ν, η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν = η a a' := by + have hsq : η a' a' * η a' a' = 1 := by + rcases a' with i | i + · rw [show i = (0 : Fin 1) from Subsingleton.elim i 0, + minkowskiMatrix.inl_0_inl_0] + norm_num + · rw [minkowskiMatrix.inr_i_inr_i] + norm_num + have h := congrFun (congrFun ((LorentzGroup.mem_iff_self_mul_dual).mp + (Lorentz.SL2C.toLorentzGroup Λ).2) a) a' + rw [Matrix.mul_apply] at h + simp only [minkowskiMatrix.dual_apply] at h + have h2 := congrArg (fun t => t * η a' a') h + simp only [Finset.sum_mul] at h2 + rw [show (∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν * η a' a') * η a' a') = + ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν) * (η a' a' * η a' a') from + Finset.sum_congr rfl fun ν _ => by ring, hsq] at h2 + simp only [mul_one] at h2 + rw [h2, Matrix.one_apply] + by_cases haa : a = a' + · subst haa + simp + · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] + simp + +set_option maxHeartbeats 2000000 in +/-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ +lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ maxwellTerm = maxwellTerm := by + have hscal : ∀ a b a' b' : Fin 1 ⊕ Fin 3, + (∑ μ, ∑ ν, η μ μ * η ν ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = η a a' * η b b' := by + intro a b a' b' + rw [show (∑ μ, ∑ ν, η μ μ * η ν ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = + ∑ μ, (η μ μ * (Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 a' μ) * + ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν) from + Finset.sum_congr rfl fun μ _ => by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun ν _ => by ring, + ← Finset.sum_mul, toLorentzGroup_sum_η_mul_mul, toLorentzGroup_sum_η_mul_mul] + have hFt : ∀ μ ν : Fin 1 ⊕ Fin 3, repLorentzGroup Λ + (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) = + ∑ a, ∑ b, ∑ a', ∑ b', + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + intro μ ν + rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil] + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + simp only [hsm, hms, hsmul] + rw [maxwellTerm, map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, ν]; rw [map_smul, hFt μ ν] + simp only [Finset.smul_sum, smul_smul, ← Complex.ofReal_mul] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b, 2, a']; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a', 2, b', 2, μ]; rw [← Finset.sum_smul] + conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [← Finset.sum_smul] + simp only [← Complex.ofReal_sum, hscal] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rw [Finset.sum_eq_single a (fun a'' _ ha'' => Finset.sum_eq_zero fun b'' _ => by + rw [show η a a'' = 0 from by + rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm ha'')], + zero_mul, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ a) h), + Finset.sum_eq_single b (fun b'' _ hb'' => by + rw [show η b b'' = 0 from by + rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm hb'')], + mul_zero, Complex.ofReal_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ b) h)] + +lemma maxwellTerm_mem_massWeightLESubmodule : + maxwellTerm ∈ MassWeightLESubmodule 8 := by + rw [maxwellTerm] + refine Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun ν _ => + Submodule.smul_mem _ _ ?_ + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl + (massWeightScale_mul_eigen (m := 4) (n := 4) + (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν) + (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν)) + +set_option maxHeartbeats 4000000 in +set_option linter.unusedSimpArgs false in +/-- The Maxwell term as an explicit combination of the six independent + field-strength squares. -/ +lemma maxwellTerm_eq : maxwellTerm = + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by + have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z + have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z + have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind + have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind + rw [maxwellTerm] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + minkowskiMatrix.inl_0_inl_0, minkowskiMatrix.inr_i_inr_i, + fieldStrengthDeriv_self, hz₁, hz₂, smul_zero, add_zero, zero_add] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + hnm, hmn, neg_neg] + push_cast + module + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean new file mode 100644 index 000000000..5f744a5d9 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean @@ -0,0 +1,352 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.MaxwellTerm +/-! +# The theta term + +The topological term `ε^{μνρσ} F_{μν} F_{ρσ}`, the alternating contraction of two +field strengths. Its Lorentz invariance is the statement that the alternating +four-fold contraction of a Lorentz matrix is its determinant, which is one; like +the Maxwell term it has mass weight eight. +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-- The topological theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, written as a sum over + the permutations of the four spacetime indices weighted by their signs. Mass + weight eight. -/ +noncomputable def thetaTerm : JetAlgebra := + ∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • + (fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) * + fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3))) + +lemma repJetGaugeGroupI_thetaTerm (U : JetGaugeGroupI) : + repJetGaugeGroupI U thetaTerm = thetaTerm := by + rw [thetaTerm, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_zsmul] + congr 1 + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, + repJetGaugeGroupI_fieldStrengthDeriv] + +/-- The transformation law of a product of two field strengths. -/ +lemma repLorentzGroup_fieldStrengthDeriv_mul (Λ : SL(2,ℂ)) + (μ ν ρ τ : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} ρ τ) = + ∑ a, ∑ b, ∑ a', ∑ b', + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' ρ * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' τ : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, + repLorentzGroup_fieldStrengthDeriv_nil] + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + simp only [hsm, hms, hsmul] + +/-- The alternating four-fold contraction of Lorentz matrices is a determinant: + the combinatorial identity behind the invariance of the theta term. -/ +lemma sum_perm_sign_mul_prod_eq_det (Λ : SL(2,ℂ)) (v : Fin 4 → Fin 1 ⊕ Fin 3) : + (∑ p : Equiv.Perm (Fin 4), ((Equiv.Perm.sign p : ℤ) : ℝ) * + ∏ i, (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm (p i))) = + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by + rw [← Matrix.det_transpose, Matrix.det_apply] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [Units.smul_def, zsmul_eq_mul] + rfl + +/-- The alternating contraction matrix of a non-injective index tuple has two + equal rows, so its determinant vanishes. -/ +lemma det_toLorentzGroup_of_not_injective (Λ : SL(2,ℂ)) {v : Fin 4 → Fin 1 ⊕ Fin 3} + (hv : ¬ Function.Injective v) : + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = 0 := by + rw [Function.not_injective_iff] at hv + obtain ⟨i, j, hij, hne⟩ := hv + exact Matrix.det_zero_of_row_eq hne (funext fun k => by simp [hij]) + +/-- On an index tuple obtained by permuting the four spacetime indices, the + alternating contraction matrix has determinant the sign of the permutation, + by `det Λ = 1`. -/ +lemma det_toLorentzGroup_comp_perm (Λ : SL(2,ℂ)) (q : Equiv.Perm (Fin 4)) : + Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + ((Equiv.Perm.sign q : ℤ) : ℝ) := by + have h1 : (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + ((Lorentz.SL2C.toLorentzGroup Λ).1.submatrix + (finSumFinEquiv (m := 1) (n := 3)).symm + (finSumFinEquiv (m := 1) (n := 3)).symm).submatrix q id := rfl + rw [h1, Matrix.det_permute, + Matrix.det_submatrix_equiv_self (finSumFinEquiv (m := 1) (n := 3)).symm, + Lorentz.SL2C.toLorentzGroup_det_one, mul_one] + +set_option maxHeartbeats 4000000 in +/-- Lorentz invariance of the theta term: the alternating contraction is the + determinant of the Lorentz matrix, which is one. -/ +lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ thetaTerm = thetaTerm := by + classical + rw [thetaTerm, map_sum] + conv_lhs => enter [2, p]; rw [map_zsmul, repLorentzGroup_fieldStrengthDeriv_mul] + simp only [Finset.smul_sum] + rw [Finset.sum_comm] + conv_lhs => enter [2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] + have hdet : ∀ a b a' b' : Fin 1 ⊕ Fin 3, + (∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • + ((((Lorentz.SL2C.toLorentzGroup Λ).1 a + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) * + (Lorentz.SL2C.toLorentzGroup Λ).1 b + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) : ℝ) : ℂ) * + (((Lorentz.SL2C.toLorentzGroup Λ).1 a' + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) * + (Lorentz.SL2C.toLorentzGroup Λ).1 b' + ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3)) : ℝ) : ℂ)) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b')) = + ((Matrix.det (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (![a, b, a', b'] i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) : ℝ) : ℂ) • + (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by + intro a b a' b' + rw [← sum_perm_sign_mul_prod_eq_det Λ ![a, b, a', b'], Complex.ofReal_sum, + Finset.sum_smul] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [Fin.prod_univ_four] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + rw [← Int.cast_smul_eq_zsmul ℂ, smul_smul] + congr 1 + push_cast + ring + conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [hdet a b a' b'] + have hflat : ∀ (G : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + (Fin 1 ⊕ Fin 3) → JetAlgebra), + (∑ a, ∑ b, ∑ a', ∑ b', G a b a' b') = + ∑ t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + G t.1 t.2.1 t.2.2.1 t.2.2.2 := fun G => by + symm + simp only [Fintype.sum_prod_type] + rw [hflat] + rw [← Finset.sum_filter_of_ne + (p := fun t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × + (Fin 1 ⊕ Fin 3) => Function.Injective ![t.1, t.2.1, t.2.2.1, t.2.2.2]) + (fun t _ hne => by + by_contra hni + exact hne (by + rw [det_toLorentzGroup_of_not_injective Λ hni, Complex.ofReal_zero, + zero_smul]))] + have hcard : Fintype.card (Fin 4) = Fintype.card (Fin 1 ⊕ Fin 3) := by simp + refine Finset.sum_bij + (i := fun t ht => (Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) + ?_ ?_ ?_ ?_ + · intro t ht + exact Finset.mem_univ _ + · intro t₁ ht₁ t₂ ht₂ h + have hv : ∀ i : Fin 4, ![t₁.1, t₁.2.1, t₁.2.2.1, t₁.2.2.2] i = + ![t₂.1, t₂.2.1, t₂.2.2.1, t₂.2.2.2] i := by + intro i + have := congrArg (fun q : Equiv.Perm (Fin 4) => + (finSumFinEquiv (m := 1) (n := 3)).symm (q i)) h + simpa using this + have h0 := hv 0 + have h1 := hv 1 + have h2 := hv 2 + have h3 := hv 3 + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 + exact Prod.ext h0 (Prod.ext h1 (Prod.ext h2 h3)) + · intro q _ + refine ⟨((finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)), ?_, ?_⟩ + · refine Finset.mem_filter.mpr ⟨Finset.mem_univ _, ?_⟩ + have hveq : ![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] = + fun i => (finSumFinEquiv (m := 1) (n := 3)).symm (q i) := by + funext i + fin_cases i <;> rfl + rw [hveq] + exact ((finSumFinEquiv (m := 1) (n := 3)).symm.injective).comp q.injective + · refine Equiv.ext fun i => ?_ + show (finSumFinEquiv (m := 1) (n := 3)) + (![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), + (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] i) = q i + fin_cases i <;> simp + · intro t ht + have hq : ∀ i : Fin 4, (finSumFinEquiv (m := 1) (n := 3)).symm + (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) i) = + ![t.1, t.2.1, t.2.2.1, t.2.2.2] i := by + intro i + simp [Equiv.ofBijective] + have hmat : (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 (![t.1, t.2.1, t.2.2.1, t.2.2.2] i) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = + (Matrix.of fun i j : Fin 4 => + (Lorentz.SL2C.toLorentzGroup Λ).1 + ((finSumFinEquiv (m := 1) (n := 3)).symm + (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] + ((Fintype.bijective_iff_injective_and_card _).mpr + ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans + (finSumFinEquiv (m := 1) (n := 3))) i)) + ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by + refine congrArg Matrix.of (funext fun i => funext fun j => ?_) + rw [hq i] + rw [hmat, det_toLorentzGroup_comp_perm] + have h0 := hq 0 + have h1 := hq 1 + have h2 := hq 2 + have h3 := hq 3 + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 + rw [h0, h1, h2, h3, ← Int.cast_smul_eq_zsmul ℂ] + module + +lemma thetaTerm_mem_massWeightLESubmodule : + thetaTerm ∈ MassWeightLESubmodule 8 := by + rw [thetaTerm] + refine Submodule.sum_mem _ fun p _ => zsmul_mem ?_ _ + exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl + (massWeightScale_mul_eigen (m := 4) (n := 4) + (fun c => massWeightScale_fieldStrengthDeriv c {} _ _) + (fun c => massWeightScale_fieldStrengthDeriv c {} _ _)) + +set_option maxHeartbeats 8000000 in +set_option linter.unusedSimpArgs false in +/-- The theta term as an explicit combination of the three pair-partition + products of field strengths. -/ +lemma thetaTerm_eq : thetaTerm = + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + + (-8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by + have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind + have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind + rw [thetaTerm] + conv_lhs => + enter [2, p] + rw [show (1 : Fin 4) = (0 : Fin 3).succ from rfl, + show (2 : Fin 4) = (1 : Fin 3).succ from rfl, + show (3 : Fin 4) = (2 : Fin 3).succ from rfl] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i, 2, j] + rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] + conv_lhs => + enter [2, i, 2, j, 2, k] + rw [Fintype.sum_subsingleton _ (1 : Equiv.Perm (Fin 1))] + simp only [Equiv.coe_toEmbedding, Fin.sum_univ_four, Fin.sum_univ_three, + Fin.sum_univ_two, + show ((1 : Fin 3)) = (0 : Fin 2).succ from rfl, + show ((2 : Fin 3)) = (1 : Fin 2).succ from rfl, + Equiv.Perm.decomposeFin_symm_of_one, + Equiv.Perm.decomposeFin.symm_sign, + Equiv.Perm.decomposeFin_symm_apply_zero, + Equiv.Perm.decomposeFin_symm_apply_one, + Equiv.Perm.decomposeFin_symm_apply_succ] + simp only [show ((0 : Fin 2).succ) = (1 : Fin 3) from rfl, + show ((1 : Fin 2).succ) = (2 : Fin 3) from rfl, + show ((0 : Fin 3).succ) = (1 : Fin 4) from rfl, + show ((1 : Fin 3).succ) = (2 : Fin 4) from rfl, + show ((2 : Fin 3).succ) = (3 : Fin 4) from rfl, + Equiv.swap_self, Equiv.Perm.sign_refl, Equiv.refl_apply, Equiv.Perm.sign_one, + Equiv.swap_apply_left, Equiv.swap_apply_right, Equiv.swap_apply_of_ne_of_ne, + Equiv.Perm.sign_swap', Fin.reduceEq, reduceIte, ne_eq, not_false_iff, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 0) = Sum.inl 0 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 1) = Sum.inr 0 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 2) = Sum.inr 1 from rfl, + show ((finSumFinEquiv (m := 1) (n := 3)).symm 3) = Sum.inr 2 from rfl, + Units.val_one, Units.val_neg, one_smul, neg_smul, one_mul, mul_one] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + hnm, hmn, neg_neg] + simp only [ + show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _, + show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) = + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from + fieldStrengthDeriv_mul_comm {} {} _ _ _ _] + module + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/Photon.lean b/Physlib/Particles/LeptonGaugeSector/Photon.lean similarity index 99% rename from Physlib/Particles/QED/Photon.lean rename to Physlib/Particles/LeptonGaugeSector/Photon.lean index 583422a97..a85b798bf 100644 --- a/Physlib/Particles/QED/Photon.lean +++ b/Physlib/Particles/LeptonGaugeSector/Photon.lean @@ -76,7 +76,7 @@ and `Physlib/Electromagnetism/Dynamics/KineticTerm.lean`. @[expose] public section -namespace QED +namespace LeptonGaugeSector open Electromagnetism SpaceTime minkowskiMatrix @@ -392,4 +392,4 @@ end JetAlgebra end Photon -end QED +end LeptonGaugeSector diff --git a/Physlib/Particles/QED/JetAlgebra/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Basic.lean deleted file mode 100644 index 5b5db5413..000000000 --- a/Physlib/Particles/QED/JetAlgebra/Basic.lean +++ /dev/null @@ -1,2288 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic -public import Mathlib.RingTheory.TensorProduct.Basic -public import Mathlib.LinearAlgebra.DirectSum.Finsupp -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Mathematics.ConjModule -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Particles.LagrangianTheory.Basic -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.MassDim -/-! -# Jet algebra for quantum electrodynamics - -## i. Overview - -The jet algebra of quantum electrodynamics: the algebra generated by the component -functions of the photon-like `U(1)` gauge boson (the B boson) and the charged -lepton, together with all their derivative coordinates. It is the tensor product of -the complexified B-boson jet algebra (a symmetric algebra, complexified so it can -be paired with the complex fermionic factor) and the charged-lepton jet algebra -(an exterior algebra). - -The jet gauge group acts on each factor — by Maurer–Cartan substitutions on the -B-boson component functions, and linearly through the hypercharge character and its -derivatives on the lepton component functions — and hence on the full QED jet -algebra by the tensor product of the two actions. - --/ - -@[expose] public section - -namespace QED -open TensorProduct StandardModel - -inductive JetGenerators where - | dB (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetGenerators - | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators - | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators - -abbrev JetAlgebra := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (LeptonSinglet.JetAlgebra) - -namespace JetAlgebra - -/-- The B-boson factor included into the QED jet algebra. -/ -noncomputable abbrev inclB : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.includeLeft - -/-- The charged-lepton factor included into the QED jet algebra. -/ -noncomputable abbrev inclL : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.includeRight - -/-- Polynomials pushed forward from the two tensor factors commute: the factors - commute in the tensor product, and the polynomial variable is central. -/ -lemma commute_mapAlgHom_inclB_inclL (p : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) - (q : Polynomial LeptonSinglet.JetAlgebra) : - Commute (Polynomial.mapAlgHom inclB p) (Polynomial.mapAlgHom inclL q) := by - induction p using Polynomial.induction_on' with - | add p₁ p₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_left h₂ - | monomial m a => - induction q using Polynomial.induction_on' with - | add q₁ q₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_right h₂ - | monomial n b => - show Polynomial.mapAlgHom inclB (Polynomial.monomial m a) * - Polynomial.mapAlgHom inclL (Polynomial.monomial n b) = _ - simp only [Polynomial.mapAlgHom, AlgHom.coe_mk, Polynomial.coe_mapRingHom, - Polynomial.map_monomial, Polynomial.monomial_mul_monomial] - rw [Nat.add_comm m n] - congr 1 - show (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) - = ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) * (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) - rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - one_mul, mul_one, one_mul, mul_one] - -/-! - -## A. Elements associated with the generators - --/ - -noncomputable def ofGenerator (s : JetGenerators) : JetAlgebra := - match s with - | JetGenerators.dB s μ => - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 - | JetGenerators.dψ s α => - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) - | JetGenerators.dbarψ s α => - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) - -scoped notation "[" s "]ₐ" => ofGenerator s - -lemma ofGenerator_dψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - ofGenerator (JetGenerators.dψ s α) = - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dψ s α) := rfl - -lemma ofGenerator_B_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - ofGenerator (JetGenerators.dB s μ) = - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 := rfl - -lemma ofGenerator_dbarψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - ofGenerator (JetGenerators.dbarψ s α) = - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dbarψ s α) := rfl - -/-! - -## A. The field strengths - --/ - - -/-- The derivatives of the B-boson field strength, embedded in the QED jet - algebra. -/ -noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ₜ[ℂ] 1 - -/-! - -## A. The covariant derivatives - --/ -/-! - -## Jet derivatives - -The formal total spacetime derivative `∂_μ` on the QED jet algebra: the Leibniz -extension of the total derivatives of the two factors. Both factor derivatives -are even derivations, so the total derivative is an even derivation on the full -jet algebra, with no Koszul signs. - --/ - -/-- The formal total spacetime derivative on the QED jet algebra in the - direction `μ`: the Leibniz extension of the total derivatives of the B-boson - and charged-lepton factors. -/ -noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) LinearMap.id + - TensorProduct.map LinearMap.id (LeptonSinglet.JetAlgebra.jetDeriv μ) - -lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - jetDeriv μ (p ⊗ₜ[ℂ] l) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] l + - p ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.jetDeriv μ l := by - simp [jetDeriv] - -@[simp] -lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by - rw [show (1 : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, LinearMap.baseChange_tmul] - simp - -/-- The total derivative is an even derivation on the QED jet algebra: the - Leibniz rule holds with no Koszul signs. -/ -lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : - jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by - have hdist₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hdist₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind - have hzero₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hzero₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction x using TensorProduct.induction_on with - | zero => simp [hzero₁] - | add a b ha hb => - simp only [hdist₁, map_add, ha, hb] - abel - | tmul p l => - induction y using TensorProduct.induction_on with - | zero => simp [hzero₂] - | add a' b' ha' hb' => - simp only [hdist₂, map_add, ha', hb'] - abel - | tmul p' l' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, jetDeriv_tmul, - BBoson.JetAlgebra.jetDeriv_baseChange_mul, LeptonSinglet.JetAlgebra.jetDeriv_mul, - TensorProduct.add_tmul, TensorProduct.tmul_add, hdist₁, hdist₂] - abel - -lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [map_add, ha, hb] - | tmul p l => - simp [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_comm μ ν, - BBoson.JetAlgebra.jetDeriv_baseChange_comm μ ν p] - abel - -/-- Total derivatives commute, so an iterated derivative may be indexed by a - multiset of directions rather than by a list. -/ -instance : LeftCommutative - (fun (ν : Fin 1 ⊕ Fin 3) (A : JetAlgebra →ₗ[ℂ] JetAlgebra) => - jetDeriv ν ∘ₗ A) where - left_comm ν₁ ν₂ A := by - refine LinearMap.ext fun x => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply] - exact jetDeriv_comm ν₁ ν₂ (A x) - -/-- The iterated total spacetime derivative along a multiset of directions: - `∂_t = ∂_{μ₁} ⋯ ∂_{μ_k}` for `t = {μ₁, …, μ_k}`. The order is immaterial by - `jetDeriv_comm`, so the index is a multiset. -/ -noncomputable def jetDerivM (t : Multiset (Fin 1 ⊕ Fin 3)) : - JetAlgebra →ₗ[ℂ] JetAlgebra := - Multiset.foldr (fun ν A => jetDeriv ν ∘ₗ A) LinearMap.id t - -@[simp] -lemma jetDerivM_zero : jetDerivM 0 = LinearMap.id := by - simp [jetDerivM] - -lemma jetDerivM_cons (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : - jetDerivM (ν ::ₘ t) = jetDeriv ν ∘ₗ jetDerivM t := by - simp [jetDerivM] - -lemma jetDerivM_singleton (μ : Fin 1 ⊕ Fin 3) : jetDerivM {μ} = jetDeriv μ := by - rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, jetDerivM_cons, - jetDerivM_zero, LinearMap.comp_id] - -lemma jetDerivM_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : - jetDerivM (s + t) = jetDerivM s ∘ₗ jetDerivM t := by - induction s using Multiset.induction_on with - | empty => simp [jetDerivM_zero] - | cons μ s ih => - trans jetDerivM (μ ::ₘ (s + t)) - · simp - simp only [jetDerivM_cons, ih] - exact Eq.symm (LinearMap.comp_assoc (jetDerivM t) (jetDerivM s) (jetDeriv μ)) - -lemma jetDerivM_cons' (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : - jetDerivM (ν ::ₘ t) = jetDerivM t ∘ₗ jetDeriv ν := by - trans jetDerivM (t + {ν}) - · congr - rw [add_comm] - simp - · rw [jetDerivM_add, jetDerivM_singleton] - -lemma jetDerivM_jetDerivM (s t : Multiset (Fin 1 ⊕ Fin 3)) (x : JetAlgebra) : - jetDerivM t (jetDerivM s x) = jetDerivM (t + s) x := by - rw [jetDerivM_add] - simp - -lemma jetDerivM_jetDeriv (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) - (a : JetAlgebra) : - jetDerivM t (jetDeriv μ a) = jetDerivM (μ ::ₘ t) a := by - trans (jetDerivM t ∘ₗ jetDeriv μ) a - · rfl - rw [← jetDerivM_cons'] - -lemma jetDeriv_jetDerivM (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) - (a : JetAlgebra) : - jetDeriv μ (jetDerivM t a) = jetDerivM (μ ::ₘ t) a := by - trans (jetDeriv μ ∘ₗ jetDerivM t) a - · rfl - rw [← jetDerivM_cons] - -lemma ofGenerator_dB_eq_jetDerivM (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - [JetGenerators.dB s μ]ₐ = jetDerivM s [.dB 0 μ]ₐ := by - induction s using Multiset.induction_on with - | empty => rw [jetDerivM_zero, LinearMap.id_coe, id_eq] - | cons ν t ih => - rw [jetDerivM_cons, LinearMap.comp_apply, ← ih] - simp only [ofGenerator] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, - add_zero, BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] - congr 2 - rw [add_comm, Multiset.singleton_add] - -lemma jetDerivM_apply_mul_eq_powerset_sum (t : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : - jetDerivM t (x * y) = (t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum := by - induction t using Multiset.induction_on with - | empty => - simp only [jetDerivM_zero, LinearMap.id_coe, id_eq, Multiset.powerset_zero, zero_tsub, - Multiset.map_singleton, Multiset.sum_singleton] - | cons ν t ih => - calc _ - _ = jetDeriv ν (jetDerivM t (x * y)) := by simp [jetDerivM_cons] - _ = jetDeriv ν ((t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum) := by - congr - _ = (t.powerset.map (jetDeriv ν ∘ fun s => (jetDerivM s x * jetDerivM (t - s) y))).sum := by - rw [← Multiset.map_map] - exact map_multiset_sum (jetDeriv ν) _ - _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x * jetDerivM (t - s) y))).sum := by - rfl - _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y - + jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by - simp [jetDeriv_mul] - _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum + - (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by - exact Multiset.sum_map_add - _ = (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum - + (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum - := by abel - conv_rhs => rw [Multiset.powerset_cons] - simp only [Multiset.map_add, Multiset.map_map, Function.comp_apply, Multiset.sub_cons, - Multiset.erase_cons_head, Multiset.sum_add] - congr 1 - · congr 1 - apply Multiset.map_congr (by rfl) - intro s hs - rw [jetDeriv_jetDerivM] - congr - exact (Multiset.cons_sub_of_le ν (Multiset.mem_powerset.mp hs)).symm - · congr - funext s - simp [jetDeriv_jetDerivM] - -lemma jetDerivM_apply_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : - jetDerivM s (x * y) = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ ν, (Multiset.toFinsupp s ν).choose (p.1 ν) : ℕ) : ℂ) • - (jetDerivM (Finsupp.toMultiset p.1) x * jetDerivM (Finsupp.toMultiset p.2) y) := by - have hcount : ∀ u t : Multiset (Fin 1 ⊕ Fin 3), Multiset.count t u.powerset = - ∏ ν, (Multiset.count ν u).choose (Multiset.count ν t) := by - intro u - induction u using Multiset.induction_on with - | empty => - intro t - rcases eq_or_ne t 0 with rfl | h - · simp - · obtain ⟨a, ha⟩ := Multiset.exists_mem_of_ne_zero h - rw [Finset.prod_eq_zero (Finset.mem_univ a)] - · simp [h] - · simp [Nat.choose_eq_zero_of_lt, Multiset.count_pos.mpr ha] - | cons a u ih => - intro t - rw [Multiset.powerset_cons, Multiset.count_add] - by_cases ha : a ∈ t - · obtain ⟨m, hm⟩ : ∃ m, Multiset.count a t = m + 1 := - ⟨Multiset.count a t - 1, by have := Multiset.count_pos.mpr ha; omega⟩ - have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = - Multiset.count (t.erase a) u.powerset := by - conv_lhs => rw [← Multiset.cons_erase ha] - exact Multiset.count_map_eq_count' _ _ (fun v w h => by simpa using h) _ - have hQ : ∀ ν ∈ Finset.univ.erase a, - (Multiset.count ν u).choose (Multiset.count ν (t.erase a)) = - (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by - rw [Multiset.count_erase_of_ne (Finset.mem_erase.mp hν).1] - have hR : ∀ ν ∈ Finset.univ.erase a, - (Multiset.count ν (a ::ₘ u)).choose (Multiset.count ν t) = - (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by - rw [Multiset.count_cons_of_ne (Finset.mem_erase.mp hν).1] - rw [h2, ih t, ih (t.erase a)] - simp only [← Finset.mul_prod_erase Finset.univ _ (Finset.mem_univ a)] - rw [Finset.prod_congr rfl hQ, Finset.prod_congr rfl hR, ← add_mul, - Multiset.count_erase_self, Multiset.count_cons_self, hm, Nat.add_sub_cancel, - Nat.choose_succ_succ'] - ring - · have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = 0 := - Multiset.count_eq_zero.mpr fun h => by - obtain ⟨v, _, rfl⟩ := Multiset.mem_map.mp h - exact ha (Multiset.mem_cons_self a v) - rw [h2, ih t, add_zero] - refine Finset.prod_congr rfl fun ν _ => ?_ - rcases eq_or_ne ν a with rfl | hν - · simp [Multiset.count_eq_zero.mpr ha] - · rw [Multiset.count_cons_of_ne hν] - have hsum : ∀ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - Finsupp.toMultiset p.1 + Finsupp.toMultiset p.2 = s := fun p hp => by - rw [← map_add, Finset.mem_antidiagonal.mp hp, Multiset.toFinsupp_toMultiset] - rw [jetDerivM_apply_mul_eq_powerset_sum, Finset.sum_multiset_map_count] - refine Finset.sum_nbij' (fun t => (Multiset.toFinsupp t, Multiset.toFinsupp (s - t))) - (fun p => Finsupp.toMultiset p.1) (fun t ht => ?_) (fun p hp => ?_) - (fun t _ => Multiset.toFinsupp_toMultiset t) (fun p hp => ?_) (fun t _ => ?_) - · rw [Finset.mem_antidiagonal, ← map_add, add_tsub_cancel_of_le (by simpa using ht)] - · simpa using Multiset.le_iff_exists_add.mpr ⟨Finsupp.toMultiset p.2, (hsum p hp).symm⟩ - · refine Prod.ext (Finsupp.toMultiset_toFinsupp p.1) ?_ - rw [← hsum p hp, add_tsub_cancel_left] - exact Finsupp.toMultiset_toFinsupp p.2 - · simp only [Multiset.toFinsupp_apply, Multiset.toFinsupp_toMultiset, hcount] - exact (Nat.cast_smul_eq_nsmul ℂ _ _).symm - - -/-! - -## Covariant derivatives - -The covariant derivative `D_l ψ_α` of the charged lepton, indexed by an ordered -list `l` of spacetime directions: covariant derivatives do not commute — their -commutator is the field strength — so the index is a list rather than a -multiset, with the head of the list the outermost derivative. - -The component functions of the lepton transform contragrediently, through the -hypercharge power series `u ^ 6`, so the covariant step on component functions -is `D_μ = ∂_μ - 6 i B_μ`: under a jet gauge transformation `∂_μ ψ_α` shifts by -`- 6 i mc_μ ψ_α` while `B_μ`, being a component function too, shifts -contragrediently by `- mc_μ` (`BBoson.mcShift`), and the two contributions -cancel for the coupling `- 6 i` — and only for that coupling. The step is -defined on the whole jet algebra; applied repeatedly to the zeroth-order -component function of `ψ` it produces the covariant derivatives. - --/ - -/-- One covariant-derivative step `D_μ = ∂_μ - 6 i B_μ` on the QED jet algebra: - the total spacetime derivative together with multiplication by the gauge field - weighted by the hypercharge coupling. The sign is fixed by covariance: the - component function `ψ_α` carries hypercharge `+6`, so `∂_μ ψ_α` picks up - `- 6 i mc_μ ψ_α`, while `B_μ` shifts contragrediently by `- mc_μ` - (`BBoson.mcShift`); the two cancel only for the coupling `- 6 i`. -/ -noncomputable def covariantStep (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ - -@[simp] -lemma covariantStep_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - covariantStep μ x = - jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by - rw [covariantStep, LinearMap.sub_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply] - -/-- The covariant derivative `D_l ψ_α` of the charged lepton along the ordered - list of directions `l`, with the head of the list the outermost derivative. -/ -noncomputable def Dψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - JetAlgebra := - l.foldr (fun μ x => covariantStep μ x) [JetGenerators.dψ {} α]ₐ - -/-- The zeroth covariant derivative is the lepton component function itself. -/ -@[simp] -lemma Dψ_nil (α : Fin 2) : - Dψ [] α = [JetGenerators.dψ {} α]ₐ := rfl - -@[simp] -lemma Dψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) - (α : Fin 2) : - Dψ (μ :: l) α = covariantStep μ (Dψ l α) := - rfl - -/-- The first covariant derivative: `D_μ ψ_α = ∂_μ ψ_α - 6 i B_μ ψ_α`. -/ -lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dψ [μ] α = [JetGenerators.dψ {μ} α]ₐ - - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dψ {} α]ₐ) := by - rw [Dψ_cons, Dψ_nil, covariantStep_apply] - congr 1 - simp only [ofGenerator] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] - -/-- One covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` for the conjugate - lepton on the QED jet algebra: the conjugate component function `ψ̄_α` carries - hypercharge `-6`, so its coupling is the opposite of that in - `covariantStep`. -/ -noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ - -@[simp] -lemma covariantStepBar_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - covariantStepBar μ x = - jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by - rw [covariantStepBar, LinearMap.add_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply] - -/-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the - ordered list of directions `l`, with the head of the list the outermost - derivative. -/ -noncomputable def Dbarψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := - l.foldr (fun μ x => covariantStepBar μ x) [JetGenerators.dbarψ {} α]ₐ - -/-- The zeroth covariant derivative is the conjugate-lepton component function - itself. -/ -@[simp] -lemma Dbarψ_nil (α : Fin 2) : - Dbarψ [] α = [JetGenerators.dbarψ {} α]ₐ := rfl - -@[simp] -lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ (μ :: l) α = covariantStepBar μ (Dbarψ l α) := rfl - -/-- The first conjugate covariant derivative: - `D̄_μ ψ̄_α = ∂_μ ψ̄_α + 6 i B_μ ψ̄_α`. -/ -lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ + ((6 : ℂ) * Complex.I) • - ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by - rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar_apply] - congr 1 - simp only [ofGenerator] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, zero_add, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] - -/-! - -### The covariant substitution - -The change of variables from the plain fermionic coordinates `∂_s ψ_α`, -`∂_s ψ̄_α` to the covariant coordinates `D_s ψ_α`, `D̄_s ψ̄_α`, as an algebra -endomorphism of the QED jet algebra fixing the B-boson factor. - --/ - -/-- A canonical list presentation of a multiset of spacetime indices. -/ -noncomputable def sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : List (Fin 1 ⊕ Fin 3) := - ((s.map finSumFinEquiv).sort (· ≤ ·)).map finSumFinEquiv.symm - -@[simp] -lemma coe_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : - (↑(sortList s) : Multiset (Fin 1 ⊕ Fin 3)) = s := by - rw [sortList, ← Multiset.map_coe, Multiset.sort_eq, Multiset.map_map] - simp - -@[simp] -lemma length_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : - (sortList s).length = Multiset.card s := by - rw [sortList, List.length_map, Multiset.length_sort, Multiset.card_map] - -/-- The derivative degree of a lepton jet generator. -/ -def genDeg : LeptonSinglet.JetGenerators → ℕ - | .dψ s _ => Multiset.card s - | .dbarψ s _ => Multiset.card s - -/-- The covariant element associated with a lepton jet generator: the covariant - derivative along a canonical ordering of the multiset of derivative indices. -/ -noncomputable def covGenerator : LeptonSinglet.JetGenerators → JetAlgebra - | .dψ s α => Dψ (sortList s) α - | .dbarψ s α => Dbarψ (sortList s) α - -/-- The linear map sending each fermionic component function to its covariant - version. -/ -noncomputable def covMap : LeptonSinglet.JetComponentSpace →ₗ[ℂ] JetAlgebra := - LeptonSinglet.JetComponentSpace.basis.constr ℂ covGenerator - -@[simp] -lemma covMap_basis (g : LeptonSinglet.JetGenerators) : - covMap (LeptonSinglet.JetComponentSpace.basis g) = covGenerator g := by - rw [covMap, Module.Basis.constr_basis] - - -/-! - -### The linear-matter submodule - --/ - -/-- The linear-matter submodule: the elements of the jet algebra in which the - matter coordinates appear exactly linearly, spanned by the products of a - gauge-sector element with a single matter component function. - - The construction does not depend on the matter content. A jet algebra of this - shape is `G ⊗[ℂ] ExteriorAlgebra ℂ M`, with `G` the gauge-sector algebra and - `M` the space of matter component functions; the fermionic degree is the - exterior grading of the second factor, and degree one is the image of - `ExteriorAlgebra.ι`. For several matter species `M` is their direct sum and the - same definition applies verbatim. - - This is the submodule the covariance argument for the covariant derivatives - lives on. It is closed under the gauge group - (`repJetGaugeGroupI_mem_LinearMatterSubmodule`), under the total derivative - and under the covariant steps, and it is where the Maurer–Cartan anomaly - operators close: in higher fermionic degree they do not, because the gauge - action on the exterior algebra is an algebra map and so multiplies the - hypercharge characters. -/ -noncomputable def LinearMatterSubmodule : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x : JetAlgebra | ∃ (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace), x = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m} - -/-- The spanning elements: a gauge-sector coefficient times a single matter - component function. -/ -lemma tmul_ι_mem_LinearMatterSubmodule (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace) : - p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m ∈ LinearMatterSubmodule := - Submodule.subset_span ⟨p, m, rfl⟩ - -/-! - -The remaining results in this section are specific to *fermionic* matter: they -express that the linear-matter elements are odd. Nothing above depends on them, -and nothing that follows — the closure of the submodule under the derivative, -the covariant steps, or the gauge group — does either. For bosonic matter the -matter factor is a symmetric rather than an exterior algebra, the same -definition of `LinearMatterSubmodule` applies with the corresponding canonical -inclusion, and only this anticommutation block is dropped. - --/ - -/-- Right distributivity on the jet algebra, with the multiplication forced to - the `JetAlgebra` instance. Stating it explicitly keeps `rw` from having to - match through the tensor-product instance path. -/ -lemma distrib_add_mul (a b c : JetAlgebra) : (a + b) * c = a * c + b * c := by grind - -/-- Left distributivity on the jet algebra; see `distrib_add_mul`. -/ -lemma distrib_mul_add (a b c : JetAlgebra) : a * (b + c) = a * b + a * c := by grind - -set_option maxHeartbeats 1000000 in -/-- Linear-matter elements anticommute against the spanning elements. -/ -lemma tmul_ι_mul_add_swap_of_mem (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace) {y : JetAlgebra} - (hy : y ∈ LinearMatterSubmodule) : - (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * y + y * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = 0 := by - have hd₁ := distrib_add_mul - have hd₂ := distrib_mul_add - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := - fun c a b => smul_mul_assoc c a b - have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := - fun c a b => mul_smul_comm c a b - induction hy using Submodule.span_induction with - | mem z hz => - obtain ⟨q, n, rfl⟩ := hz - rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - mul_comm q p, ← TensorProduct.tmul_add, ExteriorAlgebra.ι_add_mul_swap, - TensorProduct.tmul_zero] - | zero => rw [hz₂, hz₁, add_zero] - | add u v _ _ hu hv => - rw [hd₂, hd₁] - calc (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + - (u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) = - ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) + - ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) := by - abel - _ = 0 := by rw [hu, hv, add_zero] - | smul c u _ hu => - rw [hs₂, hs₁, ← smul_add, hu, smul_zero] - -/-- Linear-matter elements anticommute: they are odd. -/ -lemma mul_add_swap_of_mem {x y : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) - (hy : y ∈ LinearMatterSubmodule) : x * y + y * x = 0 := by - have hd₁ := distrib_add_mul - have hd₂ := distrib_mul_add - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := - fun c a b => smul_mul_assoc c a b - have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := - fun c a b => mul_smul_comm c a b - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - exact tmul_ι_mul_add_swap_of_mem p m hy - | zero => rw [hz₁, hz₂, add_zero] - | add u v _ _ hu hv => - rw [hd₁, hd₂] - calc u * y + v * y + (y * u + y * v) = - (u * y + y * u) + (v * y + y * v) := by abel - _ = 0 := by rw [hu, hv, add_zero] - | smul c u _ hu => - rw [hs₁, hs₂, ← smul_add, hu, smul_zero] - -/-- Linear-matter elements square to zero. -/ -lemma mul_self_of_mem {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : - x * x = 0 := by - have h2 : (2 : ℂ) • (x * x) = 0 := by - rw [two_smul] - exact mul_add_swap_of_mem hx hx - exact (smul_eq_zero.mp h2).resolve_left (by norm_num) - -/-- The linear-matter submodule is preserved by the total derivative. -/ -lemma jetDeriv_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} - (hx : x ∈ LinearMatterSubmodule) : jetDeriv μ x ∈ LinearMatterSubmodule := by - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] - exact Submodule.add_mem _ (tmul_ι_mem_LinearMatterSubmodule _ _) - (tmul_ι_mem_LinearMatterSubmodule _ _) - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- The linear-matter submodule is preserved by multiplication by a gauge-field - generator, which lives in the bosonic factor. -/ -lemma dB_mul_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} - (hx : x ∈ LinearMatterSubmodule) : - [JetGenerators.dB {} μ]ₐ * x ∈ LinearMatterSubmodule := by - have hd₂ := distrib_mul_add - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := - fun c a b => mul_smul_comm c a b - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, - Algebra.TensorProduct.tmul_mul_tmul, one_mul] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | zero => rw [hz₂]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [hd₂]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [hs₂]; exact Submodule.smul_mem _ _ hu - -/-- The covariant derivatives of the lepton are linear in the matter fields. -/ -lemma Dψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α ∈ LinearMatterSubmodule := by - induction l with - | nil => - rw [show Dψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dψ {} α)) from rfl] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | cons ν l ih => - simp only [Dψ_cons, covariantStep_apply] - exact Submodule.sub_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) - (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) - -/-- The covariant derivatives of the conjugate lepton are linear in the matter - fields. -/ -lemma Dbarψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α ∈ LinearMatterSubmodule := by - induction l with - | nil => - rw [show Dbarψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | cons ν l ih => - simp only [Dbarψ_cons, covariantStepBar_apply] - exact Submodule.add_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) - (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) - -lemma covGenerator_mem_LinearMatterSubmodule (g : LeptonSinglet.JetGenerators) : - covGenerator g ∈ LinearMatterSubmodule := by - cases g with - | dψ s α => exact Dψ_mem_LinearMatterSubmodule (sortList s) α - | dbarψ s α => exact Dbarψ_mem_LinearMatterSubmodule (sortList s) α - -lemma covMap_mem_LinearMatterSubmodule (m : LeptonSinglet.JetComponentSpace) : - covMap m ∈ LinearMatterSubmodule := by - rw [covMap, Module.Basis.constr_apply] - exact Submodule.sum_mem _ fun g _ => - Submodule.smul_mem _ _ (covGenerator_mem_LinearMatterSubmodule g) - -lemma covMap_mul_self (m : LeptonSinglet.JetComponentSpace) : - covMap m * covMap m = 0 := - mul_self_of_mem (covMap_mem_LinearMatterSubmodule m) - -/-- The covariant substitution on the fermionic factor. -/ -noncomputable def covExtHom : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := - ExteriorAlgebra.lift ℂ ⟨covMap, covMap_mul_self⟩ - -@[simp] -lemma covExtHom_ι (m : LeptonSinglet.JetComponentSpace) : - covExtHom (ExteriorAlgebra.ι ℂ m) = covMap m := by - rw [covExtHom, ExteriorAlgebra.lift_ι_apply] - -/-- Elements of the B-boson factor are central in the QED jet algebra. -/ -lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : - (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * y = - y * (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) := by - have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hd₂ := distrib_mul_add - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction y using TensorProduct.induction_on with - | zero => rw [hz₂, hz₁] - | add a b ha hb => simp only [hd₁, hd₂, ha, hb] - | tmul q l => - rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - mul_comm, one_mul, mul_one] - -/-- The covariant substitution: the algebra endomorphism of the QED jet algebra - fixing the B-boson factor and sending each plain fermionic generator to its - covariant version. -/ -noncomputable def covSubst : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft covExtHom - (fun p y => (tmul_one_mul_comm p (covExtHom y))) - -lemma covSubst_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - covSubst (p ⊗ₜ[ℂ] l) = (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := by - rw [covSubst, Algebra.TensorProduct.lift_tmul] - rfl - -@[simp] -lemma covSubst_tmul_one (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - covSubst (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = p ⊗ₜ[ℂ] 1 := by - have h1 : covExtHom (1 : LeptonSinglet.JetAlgebra) = 1 := covExtHom.map_one - have hmul : ∀ a : JetAlgebra, a * 1 = a := fun a => mul_one a - rw [covSubst_tmul, h1, hmul] - -@[simp] -lemma covSubst_one_tmul_ι (m : LeptonSinglet.JetComponentSpace) : - covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = - covMap m := by - have hone : ∀ a : JetAlgebra, 1 * a = a := fun a => one_mul a - rw [covSubst_tmul, covExtHom_ι, ← Algebra.TensorProduct.one_def, hone] - - - -/-! - -## B. Representation of the jet gauge group - -Gauge transformations act on the QED jet algebra -locally via the group `JetGaugeGroupI`. - --/ - -/-- The representation of the jet gauge group on the QED jet algebra: the - Maurer–Cartan substitution action on the (complexified) B-boson factor tensored - with the hypercharge action on the charged-lepton factor. -/ -noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := - BBoson.JetAlgebra.complexRepJetGaugeGroupI.tprod LeptonSinglet.JetAlgebra.repJetGaugeGroupI - -lemma repJetGaugeGroupI_eq_algHom (g : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI g x = Algebra.TensorProduct.map - (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom g) - (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom g) x := rfl - -lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : - repJetGaugeGroupI g (x * y) = - repJetGaugeGroupI g x * repJetGaugeGroupI g y := by - simp [repJetGaugeGroupI_eq_algHom] - -lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : - repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by - simp [repJetGaugeGroupI_eq_algHom] - -lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ₜ[ℂ] l) = - (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl - -/-- The QED gauge action on a pure tensor of the two jet-algebra factors. -/ -lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by - rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] - -/-- The gauge action on a spanning element of the linear-matter submodule: it - acts on the two factors separately, leaving the matter degree at one. This is - the only input the closure result needs, and it holds for any matter factor - whose gauge action is functorial in the component space. -/ -lemma repJetGaugeGroupI_tmul_ι (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace) : - repJetGaugeGroupI U (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U m) := by - rw [repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - ExteriorAlgebra.map_apply_ι] - -/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge - transformations acts on it through the character of its value at the base - point alone, with no derivative contributions. This is the base case of - `repJetGaugeGroupI_Dψ`. -/ -lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : - repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by - rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, - Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] - -lemma repJetGaugeGroupI_dψ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI U [.dψ s α]ₐ = - ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - [.dψ (Finsupp.toMultiset p.2) α]ₐ := by - rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, - StandardModel.LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ] - simp [tmul_sum, ← ofGenerator_dψ_eq] - -lemma repJetGaugeGroupI_apply_dB (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U [JetGenerators.dB s μ]ₐ = - [JetGenerators.dB s μ]ₐ + (BBoson.mcShift U (.basis (.dB s μ))) • 1 := by - rw [ofGenerator_B_eq, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, TensorProduct.add_tmul, - TensorProduct.smul_tmul'] - rfl - - - -set_option maxHeartbeats 1000000 in -/-- The statement that if `x` and all its derivatives transform in the - same way that `ψ` transforms under the full - gauge group, then `covariantStep μ x` transforms this.-/ -lemma repJetGaugeGroupI_jetDerivM_covariantSteplemma - (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) - (hx : ∀ s, (repJetGaugeGroupI U) (jetDerivM s x) - = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - jetDerivM (Finsupp.toMultiset p.2) x) - (s : Multiset (Fin 1 ⊕ Fin 3)) : - repJetGaugeGroupI U (jetDerivM s (covariantStep μ x)) = - ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by - calc _ - _ = repJetGaugeGroupI U (jetDerivM s (jetDeriv μ x - - (6 * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x))) := by - rfl - -- 1. Split the covariant step: `jetDerivM s` and `repJetGaugeGroupI U` are - -- linear, and `jetDerivM s (jetDeriv μ x) = jetDerivM (μ ::ₘ s) x` by - -- `jetDerivM_cons` together with `jetDerivM_add` / `jetDeriv_comm`. - _ = repJetGaugeGroupI U (jetDerivM (μ ::ₘ s) x) - - (6 * Complex.I) • repJetGaugeGroupI U (jetDerivM s ([JetGenerators.dB {} μ]ₐ * x)) := by - sorry - -- 2. `rw [hx (μ ::ₘ s)]` turns the first term into the expected sum at the - -- enlarged index `μ ::ₘ s`. - -- - -- 3. Leibniz on the gauge-field term via `jetDerivM_apply_mul`, then - -- `repJetGaugeGroupI_apply_mul` to split the action across each product: - -- ρ (∂_s (B_μ * x)) = ∑_q w_q • (ρ (∂_{q.1} B_μ) * ρ (∂_{q.2} x)) - -- NOTE: `jetDerivM_apply_mul` needs weight `Nat.choose`, not - -- `Nat.descFactorial`. At `s = {μ, μ}` the splitting `a = s` wants - -- `C(2,2) = 1`, but `Nat.descFactorial 2 2 = 2`. (`descFactorial` is - -- correct in `hx`: that comes from `jetRingAction` on a - -- factorial-weighted basis, a different normalisation.) - -- - -- 4. The gauge field is a coordinate, so it only shifts by a constant: - -- ρ_U (∂_a B_μ) = ∂_a B_μ + mcShift U [∂_{a+μ} B] • 1 - -- the QED-level counterpart of `BBoson.repJetGaugeGroupI_apply_dB` - -- transported through `repJetGaugeGroupI_tmul'`, together with - -- `jetDerivM a [dB {} μ]ₐ = [dB a μ]ₐ`. Neither exists yet. - -- - -- 5. The `x`-factor of each term is the hypothesis again, at index `q.2`. - -- - -- 6. Match against the target, expanded the same way: - -- ∂_p (D_μ x) = ∂_{μ ::ₘ p} x - 6i • ∂_p (B_μ * x) - -- Needs a Vandermonde/Pascal identity relating the weights at `μ ::ₘ s` - -- to those at `s` (reconciling `descFactorial` with `choose`), and - -- `coeff_p (u ^ 6)` at a shifted index expressed through the - -- Maurer–Cartan coefficients — the all-orders form of - -- `pderiv_pow_unitary`, currently only an inline `have` in - -- `LeptonSinglet`. That identity is what makes the shift from step 4 - -- cancel the derivative of the hypercharge character. - _ = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ ν, (Multiset.toFinsupp s ν).descFactorial (p.1 ν) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by - sorry - -/-- The linear-matter submodule is closed under the gauge group: the gauge action - preserves the matter degree, because it acts on the matter factor functorially - in the component space and so intertwines with the canonical inclusion. -/ -lemma repJetGaugeGroupI_mem_LinearMatterSubmodule (U : JetGaugeGroupI) - {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : - repJetGaugeGroupI U x ∈ LinearMatterSubmodule := by - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - rw [repJetGaugeGroupI_tmul_ι] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- The submodule form of `repJetGaugeGroupI_mem_LinearMatterSubmodule`. -/ -lemma map_repJetGaugeGroupI_LinearMatterSubmodule_le (U : JetGaugeGroupI) : - LinearMatterSubmodule.map (repJetGaugeGroupI U) ≤ LinearMatterSubmodule := by - rintro x ⟨y, hy, rfl⟩ - exact repJetGaugeGroupI_mem_LinearMatterSubmodule U hy - -/-- The gauge action restricts to an automorphism of the linear-matter - submodule: the reverse inclusion holds by applying the bound to `U⁻¹`. -/ -lemma map_repJetGaugeGroupI_LinearMatterSubmodule (U : JetGaugeGroupI) : - LinearMatterSubmodule.map (repJetGaugeGroupI U) = LinearMatterSubmodule := by - refine le_antisymm (map_repJetGaugeGroupI_LinearMatterSubmodule_le U) fun x hx => ?_ - exact ⟨repJetGaugeGroupI U⁻¹ x, - repJetGaugeGroupI_mem_LinearMatterSubmodule U⁻¹ hx, - repJetGaugeGroupI.self_inv_apply U x⟩ - -/-- The embedded field-strength derivatives are gauge invariant. -/ -lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by - rw [fieldStrengthDeriv, repJetGaugeGroupI_tmul, - BBoson.JetAlgebra.repJetGaugeGroupI_fieldStrengthDeriv, - show LeptonSinglet.JetAlgebra.repJetGaugeGroupI U (1 : LeptonSinglet.JetAlgebra) = 1 from - map_one (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U))] - - -/-! - -## Covariance of the covariant derivatives - -The covariant derivatives of the charged lepton transform through the -hypercharge character of the value of the gauge jet at the base point alone: -`ρ_U (D_l ψ_α) = u(0)⁶ • D_l ψ_α`, with no derivative contributions. - -The proof works on the lepton-linear model of the `ψ`-sector: B-boson -polynomials tensored with a single unconjugated lepton component function. On -this model the gauge action `ρ`, the covariant step `D_μ`, and a family of -Maurer–Cartan anomaly operators `N_{s,μ}` satisfy a closed commutation algebra: - -* `ρ ∘ D_μ = D_μ ∘ ρ + ρ ∘ N_{[],μ}`, -* `N_{s,μ} ∘ D_ν = D_ν ∘ N_{s,μ} + N_{ν::s,μ}`, -* `N_{s,μ} ψ = 0` and `ρ ψ = u(0)⁶ • ψ`, - -so by induction every anomaly operator annihilates every covariant derivative, -and covariance propagates along the covariant-derivative recursion. - --/ - -variable {W : Type*} [AddCommGroup W] [Module ℂ W] - -/-- The linear-matter model over a matter target `W`: B-boson polynomials - tensored with a single matter component function. -/ -abbrev MatterLinear (W : Type*) [AddCommGroup W] [Module ℂ W] := - (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) - - -/-- The derivative action of a jet on component functions valued in any target - `W`, acting on the derivative symbols. -/ -noncomputable def actionC (χ : JetRing) : - (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := - TensorProduct.map (DerivAlgebraComplex.jetRingAction χ) LinearMap.id - -/-- The derivative-symbol shift on component functions valued in any target - `W`. -/ -noncomputable def shiftC (ν : Fin 1 ⊕ Fin 3) : - (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := - TensorProduct.map (DerivAlgebraComplex.deriv ν) LinearMap.id - -lemma actionC_shiftC (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC χ (shiftC ν a) = - shiftC ν (actionC χ a) + actionC (MvPowerSeries.pderiv ℂ ν χ) a := by - have h : (actionC (W := W) χ) ∘ₗ (shiftC ν) = - (shiftC ν) ∘ₗ (actionC χ) + actionC (MvPowerSeries.pderiv ℂ ν χ) := by - simp only [actionC, shiftC] - rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, - show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.deriv ν) = - (DerivAlgebraComplex.deriv ν) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) + - DerivAlgebraComplex.jetRingAction (MvPowerSeries.pderiv ℂ ν χ) from - LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_deriv χ ν b, - TensorProduct.map_add_left] - exact LinearMap.congr_fun h a - -lemma actionC_comm (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC χ (actionC ψ a) = actionC ψ (actionC χ a) := by - have h : (actionC (W := W) χ) ∘ₗ (actionC ψ) = (actionC ψ) ∘ₗ (actionC χ) := by - simp only [actionC] - rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, - show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.jetRingAction ψ) = - (DerivAlgebraComplex.jetRingAction ψ) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) from - LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_comm χ ψ b] - exact LinearMap.congr_fun h a - -lemma actionC_mul (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (χ * ψ) a = actionC χ (actionC ψ a) := by - have h : actionC (W := W) (χ * ψ) = (actionC χ) ∘ₗ (actionC ψ) := by - simp only [actionC] - rw [← TensorProduct.map_comp, LinearMap.id_comp, - DerivAlgebraComplex.jetRingAction_mul] - exact LinearMap.congr_fun h a - -lemma actionC_C (c : ℂ) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (MvPowerSeries.C c : JetRing) a = c • a := by - have h : actionC (W := W) (MvPowerSeries.C c : JetRing) = c • LinearMap.id := by - rw [actionC, DerivAlgebraComplex.jetRingAction_C, TensorProduct.map_smul_left, - TensorProduct.map_id] - rw [h] - rfl - -/-- The embedding of a lepton component function into the lepton jet algebra. -/ -noncomputable def leptonComponentIncl : - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] LeptonSinglet.JetAlgebra := - (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) - -lemma leptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : - leptonComponentIncl a = - ExteriorAlgebra.ι ℂ ((a, 0) : LeptonSinglet.JetComponentSpace) := rfl - -/-- The inclusion of the lepton-linear elements into the QED jet algebra. -/ -noncomputable def leptonLinearIncl : - MatterLinear (Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] JetAlgebra := - TensorProduct.map LinearMap.id leptonComponentIncl - -lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : - leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] leptonComponentIncl a := by - simp [leptonLinearIncl] - -/-- The derivative action of a jet on the zeroth-order lepton component: the - scalar action of its value at the base point. -/ -lemma actionC_one_tmul (χ : JetRing) (φ : W) : - actionC χ ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) = - MvPowerSeries.constantCoeff χ • - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) := by - rw [actionC, TensorProduct.map_tmul, DerivAlgebraComplex.jetRingAction_apply_one, - LinearMap.id_coe, id_eq, TensorProduct.smul_tmul'] - -/-! - -### The linear-matter model, uniformly in the matter species - -The covariance argument depends on the matter species only through two -parameters: the jet `χ` through which the gauge group acts on the matter -component functions, and the coupling `c` in the covariant step -`D_μ = ∂_μ + c B_μ`. They are tied together by the single hypothesis - -`∂_ν χ = -c · (mcShiftSeries U ν []) · χ` - -which is exactly what makes the anomaly cancel. Everything below is stated once, -for a general matter target `W`, and instantiated at each species: for the -charged lepton `χ = u^6`, `c = -6i`, and for its conjugate `χ = star u ^ 6`, -`c = +6i`, the hypothesis in both cases being `pderiv_pow_unitary_mcShiftSeries` -and its conjugate. - --/ - -/-- The covariant step `D_μ = ∂_μ + c B_μ` on the linear-matter model. -/ -noncomputable def covStepM (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : - MatterLinear W →ₗ[ℂ] MatterLinear W := - TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) - LinearMap.id + - TensorProduct.map LinearMap.id (shiftC μ) + - c • TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id - -lemma covStepM_tmul (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - covStepM c μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + - p ⊗ₜ[ℂ] shiftC μ a + - c • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by - simp [covStepM] - -/-- The gauge action on the linear-matter model, acting on the matter factor - through the jet `χ`. -/ -noncomputable def repM (U : JetGaugeGroupI) (χ : JetRing) : - MatterLinear W →ₗ[ℂ] MatterLinear W := - TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) (actionC χ) - -lemma repM_tmul (U : JetGaugeGroupI) (χ : JetRing) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - repM U χ (p ⊗ₜ[ℂ] a) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] actionC χ a := by - simp [repM] - -/-- The Maurer–Cartan anomaly operators on the linear-matter model. -/ -noncomputable def anomalyM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : MatterLinear W →ₗ[ℂ] MatterLinear W := - TensorProduct.map (LinearMap.baseChange ℂ - (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + - (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id - - c • TensorProduct.map LinearMap.id (actionC (BBoson.mcShiftSeries U μ s)) - -lemma anomalyM_tmul (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - anomalyM U c s μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + - (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) - - c • (p ⊗ₜ[ℂ] actionC (BBoson.mcShiftSeries U μ s) a) := by - simp [anomalyM] - -/-- The shift series commutes with any other jet action. -/ -lemma actionC_mcShiftSeries_comm (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (s : List (Fin 1 ⊕ Fin 3)) (χ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (BBoson.mcShiftSeries U μ s) (actionC χ a) = - actionC χ (actionC (BBoson.mcShiftSeries U μ s) a) := - actionC_comm _ _ a - -/-- The base vector of the model: a matter component function with trivial - derivative history and unit B-boson coefficient. -/ -noncomputable def baseM (φ : W) : MatterLinear W := - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) - -/-- The covariant derivative in the model. -/ -noncomputable def DM (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : MatterLinear W := - l.foldr (fun μ x => covStepM c μ x) (baseM φ) - -lemma DM_cons (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : - DM c (μ :: l) φ = covStepM c μ (DM c l φ) := rfl - -/-- Multiplication by the unit of the complexified B-boson jet algebra. -/ -lemma one_mul_complex (z : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by - induction z using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [mul_add, ha, hb] - | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] - -/-- The gauge action commutes with the covariant step up to the gauge action of - the zeroth anomaly operator. This is where the hypothesis relating `χ` and `c` - is used, and the only place it is needed. -/ -lemma repM_covStepM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) - (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = - MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) - (μ : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : - repM U χ (covStepM c μ x) = - covStepM c μ (repM U χ x) + repM U χ (anomalyM U c [] μ x) := by - have key : (repM U χ) ∘ₗ (covStepM (W := W) c μ) = - (covStepM c μ) ∘ₗ (repM U χ) + (repM U χ) ∘ₗ (anomalyM U c [] μ) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, - anomalyM_tmul, map_add, map_smul, map_sub, - repM_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] - simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, - actionC_shiftC, hχ, actionC_mul, actionC_C, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - actionC_mcShiftSeries_comm] - have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB 0 μ) + - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by - rw [add_mul, smul_mul_assoc, one_mul_complex] - simp only [hdist] - simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', - TensorProduct.tmul_smul, smul_add, smul_smul] - push_cast - module - exact LinearMap.congr_fun key x - -/-- The anomaly operators commute with the covariant step up to the anomaly - operator with the derivative direction appended to its history. -/ -lemma anomalyM_covStepM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : - anomalyM U c s μ (covStepM c ν x) = - covStepM c ν (anomalyM U c s μ x) + anomalyM U c (ν :: s) μ x := by - have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = - (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by - rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by - rw [Multiset.singleton_add, Multiset.cons_coe]] - ac_rfl - have hshift : BBoson.JetGenerators.shiftMulti ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) - (BBoson.JetGenerators.dB {} ν) = - BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by - rw [BBoson.JetGenerators.shiftMulti_dB] - congr 1 - have hm : BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = - BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by - rw [BBoson.mcShift_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = - ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by - rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] - have key : (anomalyM U c s μ) ∘ₗ (covStepM (W := W) c ν) = - (covStepM c ν) ∘ₗ (anomalyM U c s μ) + anomalyM U c (ν :: s) μ := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, - anomalyM_tmul, map_add, map_smul, map_sub, BBoson.mcShiftSeries_cons] - simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, - BBoson.JetAlgebra.mcDeriv_baseChange_mul, - BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] - have hdist : (((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • - p := by - rw [smul_mul_assoc, one_mul_complex] - simp only [hdist] - simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', - smul_add, smul_smul] - module - exact LinearMap.congr_fun key x - -/-- The anomaly operators annihilate the base vector. -/ -lemma anomalyM_baseM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : W) : anomalyM U c s μ (baseM φ) = 0 := by - rw [baseM, anomalyM_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, actionC_one_tmul, - BBoson.constantCoeff_mcShiftSeries, - TensorProduct.tmul_smul, smul_smul, zero_add] - module - -/-- The gauge action on the base vector is the value of `χ` at the base point. -/ -lemma repM_baseM (U : JetGaugeGroupI) (χ : JetRing) (φ : W) : - repM U χ (baseM φ) = MvPowerSeries.constantCoeff χ • baseM φ := by - rw [baseM, repM_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] - simp only [BBoson.JetAlgebra.repJetGaugeGroupI_apply_one, actionC_one_tmul, - TensorProduct.tmul_smul] - -/-- Every anomaly operator annihilates every covariant derivative. -/ -lemma anomalyM_DM (U : JetGaugeGroupI) (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : - ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), anomalyM U c s μ (DM c l φ) = 0 := by - induction l with - | nil => exact fun s μ => anomalyM_baseM U c s μ φ - | cons ν l ih => - intro s μ - rw [DM_cons, anomalyM_covStepM, ih s μ, map_zero, zero_add, ih (ν :: s) μ] - -/-- Covariance of the covariant derivatives on the linear-matter model. -/ -lemma repM_DM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) - (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = - MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) - (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : - repM U χ (DM c l φ) = MvPowerSeries.constantCoeff χ • DM c l φ := by - induction l with - | nil => exact repM_baseM U χ φ - | cons ν l ih => - rw [DM_cons, repM_covStepM U χ c hχ, ih, map_smul, anomalyM_DM U c l φ [] ν, - map_zero, add_zero] - -/-! - -### Instantiation at the unconjugated lepton - --/ - -/-- The unconjugated lepton acts through `χ = u ^ 6` with coupling `c = -6i`. -/ -lemma pderiv_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : - MvPowerSeries.pderiv ℂ ν (((U.2.2 : unitary JetRing) : JetRing) ^ 6) = - MvPowerSeries.C (-(-(6 : ℂ) * Complex.I)) * - (BBoson.mcShiftSeries U ν [] * ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by - rw [BBoson.pderiv_pow_unitary_mcShiftSeries] - norm_num - -/-- The inclusion intertwines the covariant steps. -/ -lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) - (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : - covariantStep μ (leptonLinearIncl x) = - leptonLinearIncl (covStepM (-(6 : ℂ) * Complex.I) μ x) := by - have key : (covariantStep μ) ∘ₗ leptonLinearIncl = - leptonLinearIncl ∘ₗ (covStepM (-(6 : ℂ) * Complex.I) μ) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covStepM_tmul, - leptonComponentIncl_apply, covariantStep_apply, map_add, map_smul, - jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, - LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, - Algebra.TensorProduct.tmul_mul_tmul, one_mul] - module - exact LinearMap.congr_fun key x - -/-- The inclusion intertwines the gauge actions. -/ -lemma repJetGaugeGroupI_leptonLinearIncl (U : JetGaugeGroupI) - (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : - repJetGaugeGroupI U (leptonLinearIncl x) = - leptonLinearIncl (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by - have key : (repJetGaugeGroupI U) ∘ₗ leptonLinearIncl = - leptonLinearIncl ∘ₗ (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, repM_tmul, - leptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, - TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl', - actionC] - exact LinearMap.congr_fun key x - -/-- The covariant derivatives are the images of their linear-matter models. -/ -lemma Dψ_eq_leptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α = leptonLinearIncl (DM (-(6 : ℂ) * Complex.I) l - (LeptonSinglet.basis.dualBasis α)) := by - induction l with - | nil => - rw [Dψ_nil, show DM (-(6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.dualBasis α) = - baseM (LeptonSinglet.basis.dualBasis α) from rfl, baseM, leptonLinearIncl_tmul, - leptonComponentIncl_apply] - simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, - LeptonSinglet.JetComponentSpace.basis_dψ_nil] - | cons ν l ih => - rw [Dψ_cons, ih, covariantStep_leptonLinearIncl] - rfl - -/-- Covariance of the covariant derivatives of the charged lepton: a jet of - gauge transformations acts on `D_l ψ_α` through the hypercharge character of - its value at the base point alone, with no derivative contributions. This is - the statement that the covariant derivative of a charged field is again a - charged field of the same charge. -/ -lemma repJetGaugeGroupI_Dψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI U (Dψ l α) = U.eval.2.2 ^ 6 • Dψ l α := by - have hval : ((U.eval.2.2 : unitary ℂ) : ℂ) = - MvPowerSeries.constantCoeff ((U.2.2 : unitary JetRing) : JetRing) := rfl - rw [Dψ_eq_leptonLinearIncl, repJetGaugeGroupI_leptonLinearIncl, - repM_DM U _ _ (pderiv_pow_six U), map_smul, ← Dψ_eq_leptonLinearIncl, - Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] - -/-! - -## Covariant derivatives of the conjugate lepton - -The conjugate lepton `ψ̄` carries the opposite hypercharge: its component -functions transform through the conjugate-contragredient power series -`(star u) ^ 6`, so under a jet gauge transformation `∂_μ ψ̄_α` shifts by -`+ 6 i mc_μ ψ̄_α` and the covariant step is `D̄_μ = ∂_μ - 6 i B_μ`. - -The covariance proof mirrors the unconjugated case on the conjugate-linear -model, with the coupling `6 i` replaced by `- 6 i` throughout. - --/ - -/-- The embedding of a conjugate lepton component function into the lepton jet - algebra. -/ -noncomputable def conjLeptonComponentIncl : - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] - LeptonSinglet.JetAlgebra := - (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inr ℂ - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet))) - -lemma conjLeptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : - conjLeptonComponentIncl a = - ExteriorAlgebra.ι ℂ ((0, a) : LeptonSinglet.JetComponentSpace) := rfl - -/-- The inclusion of the conjugate-linear elements into the QED jet algebra. -/ -noncomputable def conjLeptonLinearIncl : - MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] JetAlgebra := - TensorProduct.map LinearMap.id conjLeptonComponentIncl - -lemma conjLeptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : - conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] conjLeptonComponentIncl a := by - simp [conjLeptonLinearIncl] - -/-- The conjugate lepton acts through `χ = star u ^ 6` with coupling `c = +6i`. -/ -lemma pderiv_star_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : - MvPowerSeries.pderiv ℂ ν (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) = - MvPowerSeries.C (-((6 : ℂ) * Complex.I)) * - (BBoson.mcShiftSeries U ν [] * star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by - rw [BBoson.pderiv_pow_unitary_star_mcShiftSeries] - norm_num - -/-- The inclusion intertwines the conjugate covariant steps. -/ -lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) - (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : - covariantStepBar μ (conjLeptonLinearIncl x) = - conjLeptonLinearIncl (covStepM ((6 : ℂ) * Complex.I) μ x) := by - have key : (covariantStepBar μ) ∘ₗ conjLeptonLinearIncl = - conjLeptonLinearIncl ∘ₗ (covStepM ((6 : ℂ) * Complex.I) μ) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, covStepM_tmul, - conjLeptonComponentIncl_apply, covariantStepBar_apply, map_add, map_smul, - jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, - LeptonSinglet.JetComponentSpace.jetDeriv_inr', ofGenerator, shiftC, - Algebra.TensorProduct.tmul_mul_tmul, one_mul] - exact LinearMap.congr_fun key x - -/-- The inclusion intertwines the gauge actions. -/ -lemma repJetGaugeGroupI_conjLeptonLinearIncl (U : JetGaugeGroupI) - (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : - repJetGaugeGroupI U (conjLeptonLinearIncl x) = - conjLeptonLinearIncl (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by - have key : (repJetGaugeGroupI U) ∘ₗ conjLeptonLinearIncl = - conjLeptonLinearIncl ∘ₗ (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, repM_tmul, - conjLeptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, - TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr', - actionC] - exact LinearMap.congr_fun key x - -/-- The conjugate covariant derivatives are the images of their linear-matter - models. -/ -lemma Dbarψ_eq_conjLeptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α = conjLeptonLinearIncl (DM ((6 : ℂ) * Complex.I) l - (LeptonSinglet.basis.conj.dualBasis α)) := by - induction l with - | nil => - rw [Dbarψ_nil, show DM ((6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.conj.dualBasis α) = - baseM (LeptonSinglet.basis.conj.dualBasis α) from rfl, baseM, - conjLeptonLinearIncl_tmul, conjLeptonComponentIncl_apply] - simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, - LeptonSinglet.JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.basis_nil] - | cons ν l ih => - rw [Dbarψ_cons, ih, covariantStepBar_conjLeptonLinearIncl] - rfl - -/-- Covariance of the covariant derivatives of the conjugate lepton: a jet of - gauge transformations acts on `D̄_l ψ̄_α` through the conjugate hypercharge - character of its value at the base point alone. -/ -lemma repJetGaugeGroupI_Dbarψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI U (Dbarψ l α) = (star U.eval.2.2) ^ 6 • Dbarψ l α := by - have hval : ((star U.eval.2.2 : unitary ℂ) : ℂ) = - MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing)) := by - rw [Unitary.coe_star, JetRing.constantCoeff_star] - rfl - rw [Dbarψ_eq_conjLeptonLinearIncl, repJetGaugeGroupI_conjLeptonLinearIncl, - repM_DM U _ _ (pderiv_star_pow_six U), map_smul, ← Dbarψ_eq_conjLeptonLinearIncl, - Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] - -/-! - -## Invariants of the QED jet algebra - -The field strengths of the B boson, embedded in the QED jet algebra, are exactly -invariant; the covariant derivatives of the lepton and of its conjugate transform -by the hypercharge characters `u(0)^6` and `u(0)^{-6}` of the value of the gauge -jet at the base point. The gauge invariants of the QED jet algebra are contained -in the algebra generated by these three families. - --/ - -/-- The generating set of the invariants of the QED jet algebra: the embedded - field-strength derivatives together with the covariant derivatives of the - lepton and of its conjugate. -/ -noncomputable def invariantGenerators : Set JetAlgebra := - (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ - (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dψ p.1 p.2) ∪ - (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ p.1 p.2) - -/-! - -### The gauge action as an algebra homomorphism, and the intertwining - --/ - -/-- The complexified B-boson gauge action as an algebra homomorphism. -/ -noncomputable def complexRepAlgHom (U : JetGaugeGroupI) : - (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra) := - AlgHom.ofLinearMap (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) - (by - rw [Algebra.TensorProduct.one_def, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul, - BBoson.JetAlgebra.repJetGaugeGroupI_apply_one]) - (BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul U) - -@[simp] -lemma complexRepAlgHom_apply (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - complexRepAlgHom U p = BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := rfl - -/-- The QED gauge action as an algebra homomorphism. -/ -noncomputable def repAlgHom (U : JetGaugeGroupI) : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.map (complexRepAlgHom U) - (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) - -set_option maxHeartbeats 1000000 in -lemma repJetGaugeGroupI_eq_repAlgHom (U : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI U x = repAlgHom U x := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb] - | tmul p l => - rw [show repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) from by - rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul], - repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply] - -/-- The gauge action is multiplicative (term-level form avoiding elaboration - blowups on the tensor stack). -/ -lemma repJetGaugeGroupI_mul' (U : JetGaugeGroupI) (a b : JetAlgebra) : - repJetGaugeGroupI U (a * b) = - repJetGaugeGroupI U a * repJetGaugeGroupI U b := - (repJetGaugeGroupI_eq_repAlgHom U (a * b)).trans - ((map_mul (repAlgHom U) a b).trans - (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom U a).symm - (repJetGaugeGroupI_eq_repAlgHom U b).symm)) - -set_option maxHeartbeats 1000000 in -/-- On gauge jets with trivial value at the base point, the covariant elements - are exactly invariant, so the gauge action intertwines the covariant - substitution with the B-boson action alone. -/ -lemma repJetGaugeGroupI_covSubst (U : JetGaugeGroupI) (hU : U.eval.2.2 = 1) - (x : JetAlgebra) : - repJetGaugeGroupI U (covSubst x) = - covSubst (TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) - LinearMap.id x) := by - have hcovfix : (repAlgHom U).comp covExtHom = covExtHom := by - refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) - simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, - AlgHom.toLinearMap_apply, covExtHom_ι] - have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = covMap := by - refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ - rw [LinearMap.comp_apply, covMap_basis, AlgHom.toLinearMap_apply, - ← repJetGaugeGroupI_eq_repAlgHom] - cases g with - | dψ s α => - rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, - repJetGaugeGroupI_Dψ, hU, one_pow, one_smul] - | dbarψ s α => - rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, - repJetGaugeGroupI_Dbarψ, hU, star_one, one_pow, one_smul] - exact LinearMap.congr_fun hlin m - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul p l => - simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, covSubst_tmul] - rw [repJetGaugeGroupI_eq_repAlgHom] - have hm : repAlgHom U ((p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l) = - repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - repAlgHom U (covExtHom l) := map_mul _ _ _ - have h1 : repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] 1 := by - rw [repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply] - congr 1 - exact (ExteriorAlgebra.map _).map_one - have h2 : repAlgHom U (covExtHom l) = covExtHom l := AlgHom.congr_fun hcovfix l - rw [hm, h1, h2] - -/-! - -### The derivative-degree filtration - -The filtration of the QED jet algebra by the total derivative degree of the -fermionic factors: the span of B-coefficiented products of fermionic generators -of bounded total degree. The covariant substitution is unitriangular for this -filtration. - --/ - -/-- The generating set of the degree filtration. -/ -def filtGen (d : ℕ) : Set JetAlgebra := - {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), - (l.map genDeg).sum ≤ d ∧ - z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} - -/-- The generating set of the strict degree filtration. -/ -def sfiltGen (d : ℕ) : Set JetAlgebra := - {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), - (l.map genDeg).sum < d ∧ - z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} - -/-- The filtration of the QED jet algebra by total fermionic derivative degree. -/ -noncomputable def filt (d : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ (filtGen d) - -/-- The strict filtration. -/ -noncomputable def sfilt (d : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ (sfiltGen d) - -lemma filt_mono {d d' : ℕ} (h : d ≤ d') : filt d ≤ filt d' := - Submodule.span_mono fun z hz => by - obtain ⟨c, l, hl, hze⟩ := hz - exact ⟨c, l, hl.trans h, hze⟩ - -lemma sfilt_mono {d d' : ℕ} (h : d ≤ d') : sfilt d ≤ sfilt d' := - Submodule.span_mono fun z hz => by - obtain ⟨c, l, hl, hze⟩ := hz - exact ⟨c, l, hl.trans_le h, hze⟩ - -lemma sfilt_le_filt (d : ℕ) : sfilt d ≤ filt d := - Submodule.span_mono fun z hz => by - obtain ⟨c, l, hl, hze⟩ := hz - exact ⟨c, l, hl.le, hze⟩ - -lemma sfilt_zero : sfilt 0 = ⊥ := by - rw [sfilt, show sfiltGen 0 = ∅ from Set.eq_empty_iff_forall_notMem.mpr (by - rintro z ⟨c, l, hl, hze⟩ - omega), Submodule.span_empty] - -lemma sfilt_succ (d : ℕ) : sfilt (d + 1) = filt d := by - rw [sfilt, filt, show sfiltGen (d + 1) = filtGen d from Set.ext fun z => - ⟨fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mp hl, hze⟩, - fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mpr hl, hze⟩⟩] - -lemma mul_mem_filt {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) - (hy : y ∈ filt b) : x * y ∈ filt (a + b) := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u - have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u - have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := - fun r u v => smul_mul_assoc r u v - have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := - fun r u v => mul_smul_comm r u v - induction hx using Submodule.span_induction with - | mem x' hx' => - induction hy using Submodule.span_induction with - | mem y' hy' => - obtain ⟨c, l, hl, rfl⟩ := hx' - obtain ⟨c', l', hl', rfl⟩ := hy' - refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ - · rw [List.map_append, List.sum_append] - omega - · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] - | zero => rw [hz₂]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih - | zero => rw [hz₁]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih - -lemma mul_mem_sfilt_left {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ sfilt a) - (hy : y ∈ filt b) : x * y ∈ sfilt (a + b) := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u - have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u - have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := - fun r u v => smul_mul_assoc r u v - have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := - fun r u v => mul_smul_comm r u v - induction hx using Submodule.span_induction with - | mem x' hx' => - induction hy using Submodule.span_induction with - | mem y' hy' => - obtain ⟨c, l, hl, rfl⟩ := hx' - obtain ⟨c', l', hl', rfl⟩ := hy' - refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ - · rw [List.map_append, List.sum_append] - omega - · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] - | zero => rw [hz₂]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih - | zero => rw [hz₁]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih - -lemma mul_mem_sfilt_right {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) - (hy : y ∈ sfilt b) : x * y ∈ sfilt (a + b) := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u - have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u - have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := - fun r u v => smul_mul_assoc r u v - have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := - fun r u v => mul_smul_comm r u v - induction hx using Submodule.span_induction with - | mem x' hx' => - induction hy using Submodule.span_induction with - | mem y' hy' => - obtain ⟨c, l, hl, rfl⟩ := hx' - obtain ⟨c', l', hl', rfl⟩ := hy' - refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ - · rw [List.map_append, List.sum_append] - omega - · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] - | zero => rw [hz₂]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih - | zero => rw [hz₁]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih - -lemma exists_forall_tmul_mem_filt (l : LeptonSinglet.JetAlgebra) : - ∃ d, ∀ c : ℂ ⊗[ℝ] BBoson.JetAlgebra, c ⊗ₜ[ℂ] l ∈ filt d := by - induction l using ExteriorAlgebra.induction with - | algebraMap r => - refine ⟨0, fun c => ?_⟩ - rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] - refine Submodule.smul_mem _ _ (Submodule.subset_span ⟨c, [], by simp, ?_⟩) - simp - | ι m => - refine ⟨(LeptonSinglet.JetComponentSpace.basis.repr m).support.sup genDeg, - fun c => ?_⟩ - have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = - (LeptonSinglet.JetComponentSpace.basis.repr m).sum - (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by - conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] - rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] - refine Finset.sum_congr rfl fun g _ => ?_ - rw [map_smul] - rfl - rw [hm, Finsupp.sum, TensorProduct.tmul_sum] - refine Submodule.sum_mem _ fun g hg => ?_ - rw [TensorProduct.tmul_smul] - refine Submodule.smul_mem _ _ (filt_mono (Finset.le_sup hg) - (Submodule.subset_span ⟨c, [g], by simp, ?_⟩)) - simp - | mul x y hx hy => - obtain ⟨dx, hdx⟩ := hx - obtain ⟨dy, hdy⟩ := hy - refine ⟨dx + dy, fun c => ?_⟩ - rw [show c ⊗ₜ[ℂ] (x * y) = (c ⊗ₜ[ℂ] x) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] y) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one]] - exact mul_mem_filt (hdx c) (hdy 1) - | add x y hx hy => - obtain ⟨dx, hdx⟩ := hx - obtain ⟨dy, hdy⟩ := hy - refine ⟨max dx dy, fun c => ?_⟩ - rw [TensorProduct.tmul_add] - exact add_mem (filt_mono (le_max_left _ _) (hdx c)) - (filt_mono (le_max_right _ _) (hdy c)) - -/-- Every element of the QED jet algebra has bounded fermionic derivative - degree. -/ -lemma exists_mem_filt (x : JetAlgebra) : ∃ d, x ∈ filt d := by - induction x using TensorProduct.induction_on with - | zero => exact ⟨0, zero_mem _⟩ - | add a b ha hb => - obtain ⟨d1, h1⟩ := ha - obtain ⟨d2, h2⟩ := hb - exact ⟨max d1 d2, add_mem (filt_mono (le_max_left _ _) h1) - (filt_mono (le_max_right _ _) h2)⟩ - | tmul c l => - obtain ⟨d, hd⟩ := exists_forall_tmul_mem_filt l - exact ⟨d, hd c⟩ - -/-- Strictly-lower-degree odd elements: B-coefficiented single fermionic - generators of derivative degree less than `d`. -/ -noncomputable def oddLow (d : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ - {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (g : LeptonSinglet.JetGenerators), - genDeg g < d ∧ z = c ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator g} - -lemma oddLow_le_sfilt (d : ℕ) : oddLow d ≤ sfilt d := by - refine Submodule.span_le.mpr ?_ - rintro z ⟨c, g, hg, rfl⟩ - refine Submodule.subset_span ⟨c, [g], by simpa using hg, ?_⟩ - simp - -lemma genDeg_shift (μ : Fin 1 ⊕ Fin 3) (g : LeptonSinglet.JetGenerators) : - genDeg (LeptonSinglet.JetGenerators.shift μ g) = genDeg g + 1 := by - cases g <;> simp [genDeg, LeptonSinglet.JetGenerators.shift] - -set_option maxHeartbeats 1000000 in -/-- Multiplication by the gauge field acts on the B-boson coefficient of an odd - element. -/ -lemma dB_mul_tmul (μ : Fin 1 ⊕ Fin 3) (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (y : LeptonSinglet.JetAlgebra) : - ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * (c ⊗ₜ[ℂ] y) = - (((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * c) - ⊗ₜ[ℂ] y := by - have hone : ∀ z : LeptonSinglet.JetAlgebra, 1 * z = z := fun z => one_mul z - rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, - Algebra.TensorProduct.tmul_mul_tmul, hone] - -set_option maxHeartbeats 1000000 in -lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} - (hx : x ∈ oddLow d) : covariantStep μ x ∈ oddLow (d + 1) := by - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨c, g, hg, rfl⟩ := hz - rw [covariantStep_apply, jetDeriv_tmul, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] - refine sub_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) - · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ - · rw [dB_mul_tmul] - exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - | zero => rw [map_zero]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv - | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih - -set_option maxHeartbeats 1000000 in -lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} - (hx : x ∈ oddLow d) : covariantStepBar μ x ∈ oddLow (d + 1) := by - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨c, g, hg, rfl⟩ := hz - rw [covariantStepBar_apply, jetDeriv_tmul, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] - refine add_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) - · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ - · rw [dB_mul_tmul] - exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - | zero => rw [map_zero]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv - | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih - -set_option maxHeartbeats 4000000 in -/-- The covariant derivative of the lepton is its plain derivative generator up - to strictly-lower-degree odd terms. -/ -lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑l) α) ∈ oddLow l.length := by - induction l with - | nil => - rw [Dψ_nil, show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator - (.dψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by - rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] - rfl, sub_self] - exact zero_mem _ - | cons μ t ih => - set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑t) α) with hL - have hstep : Dψ (μ :: t) α = covariantStep μ L + covariantStep μ (Dψ t α - L) := by - have h := (covariantStep μ).map_add L (Dψ t α - L) - rw [add_sub_cancel] at h - rw [Dψ_cons, h] - have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) - - ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by - rw [covariantStep_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, - LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, - TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dψ, - show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by - rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] - have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by - rw [hL, dB_mul_tmul] - refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ - simp [genDeg, Multiset.coe_card] - have hmem2 : covariantStep μ (Dψ t α - L) ∈ oddLow (t.length + 1) := - covariantStep_mem_oddLow μ ih - have habel : ∀ A X Y : JetAlgebra, A - X + Y - A = Y - X := fun A X Y => by abel - rw [hstep, hleadEq, habel] - exact sub_mem hmem2 (Submodule.smul_mem _ _ hmem1) - -set_option maxHeartbeats 4000000 in -/-- The covariant derivative of the conjugate lepton is its plain derivative - generator up to strictly-lower-degree odd terms. -/ -lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑l) α) ∈ oddLow l.length := by - induction l with - | nil => - rw [Dbarψ_nil, show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator - (.dbarψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by - rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] - rfl, sub_self] - exact zero_mem _ - | cons μ t ih => - set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑t) α) with hL - have hstep : Dbarψ (μ :: t) α = - covariantStepBar μ L + covariantStepBar μ (Dbarψ t α - L) := by - have h := (covariantStepBar μ).map_add L (Dbarψ t α - L) - rw [add_sub_cancel] at h - rw [Dbarψ_cons, h] - have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) + - ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by - rw [covariantStepBar_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, - LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, - TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dbarψ, - show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by - rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] - have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by - rw [hL, dB_mul_tmul] - refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ - simp [genDeg, Multiset.coe_card] - have hmem2 : covariantStepBar μ (Dbarψ t α - L) ∈ oddLow (t.length + 1) := - covariantStepBar_mem_oddLow μ ih - have habel : ∀ A X Y : JetAlgebra, A + X + Y - A = X + Y := fun A X Y => by abel - rw [hstep, hleadEq, habel] - exact add_mem (Submodule.smul_mem _ _ hmem1) hmem2 - -/-- The covariant generator is the plain generator up to strictly-lower-degree - odd terms. -/ -lemma covGenerator_sub_mem_oddLow (g : LeptonSinglet.JetGenerators) : - covGenerator g - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator g ∈ oddLow (genDeg g) := by - cases g with - | dψ s α => - have h := Dψ_sub_mem_oddLow (sortList s) α - rw [coe_sortList, length_sortList] at h - exact h - | dbarψ s α => - have h := Dbarψ_sub_mem_oddLow (sortList s) α - rw [coe_sortList, length_sortList] at h - exact h - -lemma covGenerator_mem_filt (g : LeptonSinglet.JetGenerators) : - covGenerator g ∈ filt (genDeg g) := by - have h := sfilt_le_filt _ (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) - have hA : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator g ∈ filt (genDeg g) := by - refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ - simp - have h2 := add_mem hA h - rwa [add_sub_cancel] at h2 - -lemma prod_covGenerator_mem_filt (l : List LeptonSinglet.JetGenerators) : - (l.map covGenerator).prod ∈ filt ((l.map genDeg).sum) := by - induction l with - | nil => - simp only [List.map_nil, List.prod_nil, List.sum_nil] - refine Submodule.subset_span ⟨1, [], by simp, ?_⟩ - rw [List.map_nil, List.prod_nil, Algebra.TensorProduct.one_def] - | cons g t ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - exact mul_mem_filt (covGenerator_mem_filt g) ih - -set_option maxHeartbeats 1000000 in -/-- The product of covariant generators is the corresponding product of plain - generators up to strictly-lower-degree terms. -/ -lemma prod_covGenerator_sub_mem_sfilt (l : List LeptonSinglet.JetGenerators) : - (l.map covGenerator).prod - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod ∈ - sfilt ((l.map genDeg).sum) := by - induction l with - | nil => - simp only [List.map_nil, List.prod_nil, List.sum_nil] - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : - JetAlgebra) = 1 from (Algebra.TensorProduct.one_def).symm, sub_self] - exact zero_mem _ - | cons g t ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - have hsub₁ : ∀ a b c : JetAlgebra, (a - b) * c = a * c - b * c := by grind - have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - set A : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator g with hA - set Q : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod with hQ - have hAQ : A * Q = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.ofGenerator g * - (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by - rw [hA, hQ, Algebra.TensorProduct.tmul_mul_tmul, mul_one] - have hkey : covGenerator g * (t.map covGenerator).prod - - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.ofGenerator g * - (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = - (covGenerator g - A) * (t.map covGenerator).prod + - A * ((t.map covGenerator).prod - Q) := by - rw [hsub₁, hsub₂, hAQ] - abel - rw [hkey] - refine add_mem ?_ ?_ - · exact mul_mem_sfilt_left (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) - (prod_covGenerator_mem_filt t) - · have hAmem : A ∈ filt (genDeg g) := by - rw [hA] - refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ - simp - exact mul_mem_sfilt_right hAmem ih - -set_option maxHeartbeats 1000000 in -/-- Unitriangularity of the covariant substitution: it is the identity up to - strictly-lower-degree terms. -/ -lemma covSubst_sub_self_mem_sfilt {d : ℕ} {x : JetAlgebra} (hx : x ∈ filt d) : - covSubst x - x ∈ sfilt d := by - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨c, l, hl, rfl⟩ := hz - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p - have hgen : ∀ g : LeptonSinglet.JetGenerators, - covExtHom (LeptonSinglet.JetAlgebra.ofGenerator g) = covGenerator g := by - intro g - rw [show LeptonSinglet.JetAlgebra.ofGenerator g = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis g) from rfl, covExtHom_ι, covMap_basis] - have hlp : ∀ L : List LeptonSinglet.JetAlgebra, - covExtHom L.prod = (L.map covExtHom).prod := by - intro L - induction L with - | nil => exact covExtHom.map_one - | cons a t iht => - have hm : covExtHom (a * t.prod) = covExtHom a * covExtHom t.prod := - map_mul covExtHom a t.prod - rw [List.prod_cons, List.map_cons, List.prod_cons, hm, iht] - have hcs : covSubst (c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = - (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * (l.map covGenerator).prod := by - rw [covSubst_tmul] - congr 1 - rw [hlp, List.map_map, - show (⇑covExtHom ∘ LeptonSinglet.JetAlgebra.ofGenerator) = covGenerator from - funext fun g => hgen g] - have hz2 : c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod = - (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, hone] - have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind - have hc1 : (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) ∈ filt 0 := by - refine Submodule.subset_span ⟨c, [], by simp, ?_⟩ - simp - have hfin := mul_mem_sfilt_right hc1 (prod_covGenerator_sub_mem_sfilt l) - rw [zero_add] at hfin - rw [hcs, hz2, ← hsub₂] - exact sfilt_mono hl hfin - | zero => - rw [map_zero, sub_zero] - exact zero_mem _ - | add u v hu hv ihu ihv => - rw [map_add, show covSubst u + covSubst v - (u + v) = - (covSubst u - u) + (covSubst v - v) from by abel] - exact add_mem ihu ihv - | smul r u hu ih => - rw [map_smul, show r • covSubst u - r • u = r • (covSubst u - u) from - (smul_sub r _ _).symm] - exact Submodule.smul_mem _ _ ih - -lemma eq_zero_of_covSubst_eq_zero {d : ℕ} : - ∀ {x : JetAlgebra}, x ∈ filt d → covSubst x = 0 → x = 0 := by - induction d with - | zero => - intro x hx h0 - have h := covSubst_sub_self_mem_sfilt hx - rw [h0, zero_sub, sfilt_zero, Submodule.mem_bot, neg_eq_zero] at h - exact h - | succ d ih => - intro x hx h0 - have h := covSubst_sub_self_mem_sfilt hx - rw [h0, zero_sub, sfilt_succ] at h - exact ih (neg_mem_iff.mp h) h0 - -/-- The covariant substitution is injective. -/ -lemma covSubst_injective : Function.Injective covSubst := by - intro x y hxy - obtain ⟨d, hd⟩ := exists_mem_filt (x - y) - have h0 : covSubst (x - y) = 0 := by rw [map_sub, hxy, sub_self] - exact sub_eq_zero.mp (eq_zero_of_covSubst_eq_zero hd h0) - -lemma exists_covSubst_eq {d : ℕ} : - ∀ {x : JetAlgebra}, x ∈ filt d → ∃ y, covSubst y = x := by - induction d with - | zero => - intro x hx - have h := covSubst_sub_self_mem_sfilt hx - rw [sfilt_zero, Submodule.mem_bot, sub_eq_zero] at h - exact ⟨x, h⟩ - | succ d ih => - intro x hx - have h := covSubst_sub_self_mem_sfilt hx - rw [sfilt_succ] at h - obtain ⟨y, hy⟩ := ih h - exact ⟨x - y, by rw [map_sub, hy, sub_sub_cancel]⟩ - -/-- The covariant substitution is surjective. -/ -lemma covSubst_surjective : Function.Surjective covSubst := by - intro x - obtain ⟨d, hd⟩ := exists_mem_filt x - exact exists_covSubst_eq hd - -set_option maxHeartbeats 2000000 in -/-- Every gauge invariant of the QED jet algebra lies in the algebra generated by - the field-strength derivatives and the covariant derivatives of the lepton and - its conjugate. - - Proof strategy (the QED analogue of - `BBoson.JetAlgebra.repJetGaugeGroupI_apply_eq_self_iff_mem`): decompose the jet - algebra as a free module over the (complexified) B-boson factor with basis the - exterior monomials in the *covariant* fermionic coordinates `D_s ψ_α`, - `D̄_s ψ̄_α` — a triangular change of variables from the plain coordinates - `∂_s ψ_α`, `∂_s ψ̄_α` by `Dψ_eq_leptonLinearIncl` and its conjugate. On this - decomposition a gauge transformation acts by the B-boson substitution action on - the coefficients and the scalars `u(0)^{±6}` on the covariant monomials - (`repJetGaugeGroupI_Dψ`, `repJetGaugeGroupI_Dbarψ`). Invariance under the - `expUnitary` translation family (which has `u(0) = 1`) forces each coefficient - to be invariant under all Maurer–Cartan translations of the pure-gauge B-boson - coordinates, hence to lie in the (complexified) field-strength subalgebra by - the B-boson translation theorem. -/ -theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq - (x : JetAlgebra) (hx : ∀ U, repJetGaugeGroupI U x = x) : - x ∈ Algebra.adjoin ℂ invariantGenerators := by - classical - obtain ⟨y, rfl⟩ := covSubst_surjective x - have hyU : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), - TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI - (BBoson.JetAlgebra.expUnitary a w hw)) LinearMap.id y = y := by - intro a w hw - refine covSubst_injective ?_ - rw [← repJetGaugeGroupI_covSubst _ (BBoson.JetAlgebra.eval_expUnitary_u1 a w hw), - hx] - set bL := Module.Basis.ofVectorSpace ℂ LeptonSinglet.JetAlgebra with hbL - set e : JetAlgebra ≃ₗ[ℂ] - (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra →₀ - ℂ ⊗[ℝ] BBoson.JetAlgebra) := - (TensorProduct.congr (LinearEquiv.refl ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra)) bL.repr).trans - (TensorProduct.finsuppScalarRight ℂ ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) - (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra)) with hedef - have happly : ∀ (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra)) - (z : JetAlgebra) (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra), - e (TensorProduct.map f LinearMap.id z) T = f (e z T) := by - intro f z T - induction z using TensorProduct.induction_on with - | zero => simp - | add u v hu hv => simp only [map_add, Finsupp.add_apply, hu, hv] - | tmul c l => - rw [hedef] - simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, - LinearEquiv.trans_apply, TensorProduct.congr_tmul, LinearEquiv.refl_apply, - TensorProduct.finsuppScalarRight_apply_tmul_apply, map_smul] - have hcT : ∀ T, e y T ∈ Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] BBoson.JetAlgebra)) := by - intro T - refine BBoson.JetAlgebra.mem_adjoin_of_forall_expUnitary_complex _ fun a w hw => ?_ - have h := happly (BBoson.JetAlgebra.complexRepJetGaugeGroupI - (BBoson.JetAlgebra.expUnitary a w hw)) y T - rw [hyU a w hw] at h - exact h.symm - set S : Set JetAlgebra := (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ - (Set.range fun g : LeptonSinglet.JetGenerators => - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra)) with hS - have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p - have honeL : ∀ l : LeptonSinglet.JetAlgebra, 1 * l = l := fun l => one_mul l - have hone_tmul : ∀ l : LeptonSinglet.JetAlgebra, - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l : JetAlgebra) ∈ Algebra.adjoin ℂ S := by - intro l - induction l using ExteriorAlgebra.induction with - | algebraMap r => - rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] - refine Subalgebra.smul_mem _ ?_ _ - rw [← Algebra.TensorProduct.one_def] - exact one_mem _ - | ι m => - have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = - (LeptonSinglet.JetComponentSpace.basis.repr m).sum - (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by - conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] - rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] - refine Finset.sum_congr rfl fun g _ => ?_ - rw [map_smul] - rfl - rw [hm, Finsupp.sum, TensorProduct.tmul_sum] - refine sum_mem fun g _ => ?_ - rw [TensorProduct.tmul_smul] - refine Subalgebra.smul_mem _ (Algebra.subset_adjoin ?_) _ - rw [hS] - exact Set.mem_union_right _ ⟨g, rfl⟩ - | mul u v hu hv => - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (u * v) : JetAlgebra) = - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] u) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] v) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeB]] - exact mul_mem hu hv - | add u v hu hv => - rw [TensorProduct.tmul_add] - exact add_mem hu hv - have hleft : ∀ c ∈ Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] BBoson.JetAlgebra)), - ((c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ - Algebra.adjoin ℂ S := by - intro c hc - induction hc using Algebra.adjoin_induction with - | mem z hz => - obtain ⟨p, rfl⟩ := hz - refine Algebra.subset_adjoin ?_ - rw [hS] - exact Set.mem_union_left _ ⟨p, rfl⟩ - | algebraMap z => - rw [Algebra.algebraMap_eq_smul_one, ← TensorProduct.smul_tmul'] - refine Subalgebra.smul_mem _ ?_ _ - rw [← Algebra.TensorProduct.one_def] - exact one_mem _ - | add u v hu hv ihu ihv => - rw [TensorProduct.add_tmul] - exact add_mem ihu ihv - | mul u v hu hv ihu ihv => - rw [show ((u * v) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : JetAlgebra) = - (u ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - (v ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeL]] - exact mul_mem ihu ihv - have hsymm_single : ∀ (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra) - (c : ℂ ⊗[ℝ] BBoson.JetAlgebra), - e.symm (Finsupp.single T c) = c ⊗ₜ[ℂ] (bL T) := by - intro T c - rw [hedef, LinearEquiv.symm_trans_apply, - TensorProduct.finsuppScalarRight_symm_apply_single, TensorProduct.congr_symm_tmul] - simp only [LinearEquiv.refl_symm, LinearEquiv.refl_apply, - Module.Basis.repr_symm_single_one] - have hdecomp : y = ((e y).support).sum (fun T => (e y T) ⊗ₜ[ℂ] (bL T)) := by - conv_lhs => rw [← e.symm_apply_apply y, ← Finsupp.sum_single (e y)] - rw [Finsupp.sum, map_sum] - exact Finset.sum_congr rfl fun T _ => hsymm_single T _ - have hyMem : y ∈ Algebra.adjoin ℂ S := by - rw [hdecomp] - refine sum_mem fun T _ => ?_ - rw [show ((e y T) ⊗ₜ[ℂ] (bL T) : JetAlgebra) = - ((e y T) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (bL T)) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, honeL]] - exact mul_mem (hleft _ (hcT T)) (hone_tmul _) - have himg : covSubst y ∈ (Algebra.adjoin ℂ S).map covSubst := - Subalgebra.mem_map.mpr ⟨y, hyMem, rfl⟩ - rw [AlgHom.map_adjoin] at himg - refine Algebra.adjoin_le ?_ himg - rintro z ⟨w, hw, rfl⟩ - rcases hw with ⟨p, rfl⟩ | ⟨g, rfl⟩ - · show covSubst (fieldStrengthDeriv p.1 p.2.1 p.2.2) ∈ - Algebra.adjoin ℂ invariantGenerators - rw [show (fieldStrengthDeriv p.1 p.2.1 p.2.2 : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, covSubst_tmul_one] - exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from - Set.mem_union_left _ (Set.mem_union_left _ ⟨p, rfl⟩)) - · show covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator g) ∈ Algebra.adjoin ℂ invariantGenerators - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis g) from rfl, covSubst_one_tmul_ι, - covMap_basis] - cases g with - | dψ s α => - exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from - Set.mem_union_left _ (Set.mem_union_right _ ⟨(sortList s, α), rfl⟩)) - | dbarψ s α => - exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from - Set.mem_union_right _ ⟨(sortList s, α), rfl⟩) - -end JetAlgebra - -end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean deleted file mode 100644 index 64823c258..000000000 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/Basic.lean +++ /dev/null @@ -1,765 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.QED.JetAlgebra.MassDim -/-! -# The renormalizable invariants of the QED jet algebra - -The four gauge- and Lorentz-invariant elements of mass dimension at most four -(mass weight at most eight): the Maxwell term `F_{μν} F^{μν}`, the topological -theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, and the two fermion kinetic terms -`i ψ̄ σ̄^μ (D_μ ψ)` and `-i (D̄_μ ψ̄) σ̄^μ ψ`. - -This file defines them, proves each is invariant under the jet gauge group and -under `SL(2,ℂ)`, and deduces the easy half of the classification: their span is -contained in `InvariantMassWeightSubmodule 8`. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace QED -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The Maxwell kinetic term `F_{μν} F^{μν}`: the field-strength square with - both indices raised by the (diagonal) Minkowski metric. Mass weight eight. -/ -noncomputable def maxwellTerm : JetAlgebra := - ∑ μ, ∑ ν, ((η μ μ * η ν ν : ℝ) : ℂ) • - (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) - -/-- The topological theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, written as a sum over - the permutations of the four spacetime indices weighted by their signs. Mass - weight eight. -/ -noncomputable def thetaTerm : JetAlgebra := - ∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • - (fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) * - fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3))) - -/-- The spinor contraction matrices of the right-handed kinetic term: the - transposed covariant Pauli matrices `(σ̄^μ)ᵀ = (1, -σ1, σ2, -σ3)`. In the - conventions of this repository the right-handed lepton field transforms by - the entrywise conjugate of `Λ` and its jet coordinates by the contragredient - dual, so the pairing of `ψ̄_α`, `(D_μ ψ)_β` and the derivative index `μ` is - Lorentz invariant precisely through these matrices; this is the intertwining - identity `sum_kineticPauli_contraction` below. -/ -noncomputable def kineticPauli (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := - ((PauliMatrix.pauliSelfAdjoint' μ).1)ᵀ - -/-- The fermion kinetic term `i ψ̄_α (σ̄^μ)ᵀ_{α β} (D_μ ψ)_β` of the - right-handed charged-lepton singlet, with the covariant derivative on the - lepton. Mass weight eight. -/ -noncomputable def fermionKineticTerm : JetAlgebra := - Complex.I • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [] α * Dψ [μ] β) - -/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ̄^μ)ᵀ_{α β} ψ_β`, with - the covariant derivative on the conjugate lepton. Mass weight eight. -/ -noncomputable def fermionKineticTermBar : JetAlgebra := - (-Complex.I) • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [μ] α * Dψ [] β) - -/-- The invariants of the QED jet algebra of mass dimension at most four: the - constants and the four kinetic terms. These span - `InvariantMassWeightSubmodule 8`, the renormalizable QED Lagrangian densities. -/ -def massDimFourInvariants : Set JetAlgebra := - {1, maxwellTerm, thetaTerm, fermionKineticTerm, fermionKineticTermBar} - - -/-! - -## Gauge invariance of the renormalizable terms - -The hypercharge selection rule: a jet of gauge transformations acts on the -covariant generators only through `u(0)^{±6}`, so the field-strength squares are -exactly invariant and a product of one covariant lepton and one covariant -conjugate-lepton factor is invariant by unitarity. - --/ - -lemma repJetGaugeGroupI_maxwellTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U maxwellTerm = maxwellTerm := by - rw [maxwellTerm, map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_smul] - congr 1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv] - -lemma repJetGaugeGroupI_thetaTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U thetaTerm = thetaTerm := by - rw [thetaTerm, map_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [map_zsmul] - congr 1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, - repJetGaugeGroupI_fieldStrengthDeriv] - -/-- The hypercharge scalars of a lepton–conjugate-lepton pair cancel by - unitarity. -/ -lemma repJetGaugeGroupI_Dbarψ_mul_Dψ (U : JetGaugeGroupI) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - repJetGaugeGroupI U (Dbarψ l α * Dψ l' β) = Dbarψ l α * Dψ l' β := by - have hz : star ((U.eval.2.2 : unitary ℂ) : ℂ) * ((U.eval.2.2 : unitary ℂ) : ℂ) = 1 := - (Unitary.mem_iff.mp (U.eval.2.2).2).1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dbarψ, - Submonoid.smul_def, Submonoid.smul_def, SubmonoidClass.coe_pow, - SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← mul_pow, hz, - one_pow, one_smul] - -lemma repJetGaugeGroupI_fermionKineticTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] - -lemma repJetGaugeGroupI_fermionKineticTermBar (U : JetGaugeGroupI) : - repJetGaugeGroupI U fermionKineticTermBar = fermionKineticTermBar := by - rw [fermionKineticTermBar, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] - -/-! - -## Lorentz invariance of the renormalizable terms - -TODO: these require the transformation laws of the field strength (as an -antisymmetric two-tensor through `Λᵀ η Λ = η` and `det Λ = 1`) and of the -covariant derivatives (through the σ-matrix intertwining relation -`M σ^μ M† = Λ(M)^μ_ν σ^ν` defining `SL2C.toLorentzGroup`), which are not yet -available for the jet-algebra representations. - --/ - -/-- The component form of the Lorentz-group defining identity: contracting two - Lorentz matrices with the (diagonal, involutive) Minkowski metric over their - second indices reproduces the metric. -/ -lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : - ∑ ν, η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν = η a a' := by - have hsq : η a' a' * η a' a' = 1 := by - rcases a' with i | i - · rw [show i = (0 : Fin 1) from Subsingleton.elim i 0, - minkowskiMatrix.inl_0_inl_0] - norm_num - · rw [minkowskiMatrix.inr_i_inr_i] - norm_num - have h := congrFun (congrFun ((LorentzGroup.mem_iff_self_mul_dual).mp - (Lorentz.SL2C.toLorentzGroup Λ).2) a) a' - rw [Matrix.mul_apply] at h - simp only [minkowskiMatrix.dual_apply] at h - have h2 := congrArg (fun t => t * η a' a') h - simp only [Finset.sum_mul] at h2 - rw [show (∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν * η a' a') * η a' a') = - ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν) * (η a' a' * η a' a') from - Finset.sum_congr rfl fun ν _ => by ring, hsq] at h2 - simp only [mul_one] at h2 - rw [h2, Matrix.one_apply] - by_cases haa : a = a' - · subst haa - simp - · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] - simp - -set_option maxHeartbeats 2000000 in -/-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ -lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ maxwellTerm = maxwellTerm := by - have hscal : ∀ a b a' b' : Fin 1 ⊕ Fin 3, - (∑ μ, ∑ ν, η μ μ * η ν ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = η a a' * η b b' := by - intro a b a' b' - rw [show (∑ μ, ∑ ν, η μ μ * η ν ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = - ∑ μ, (η μ μ * (Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' μ) * - ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν) from - Finset.sum_congr rfl fun μ _ => by - rw [Finset.mul_sum] - exact Finset.sum_congr rfl fun ν _ => by ring, - ← Finset.sum_mul, toLorentzGroup_sum_η_mul_mul, toLorentzGroup_sum_η_mul_mul] - have hFt : ∀ μ ν : Fin 1 ⊕ Fin 3, repLorentzGroup Λ - (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) = - ∑ a, ∑ b, ∑ a', ∑ b', - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - intro μ ν - rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil] - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - simp only [hsm, hms, hsmul] - rw [maxwellTerm, map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, ν]; rw [map_smul, hFt μ ν] - simp only [Finset.smul_sum, smul_smul, ← Complex.ofReal_mul] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a, 2, b, 2, a']; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a', 2, b', 2, μ]; rw [← Finset.sum_smul] - conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [← Finset.sum_smul] - simp only [← Complex.ofReal_sum, hscal] - refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - rw [Finset.sum_eq_single a (fun a'' _ ha'' => Finset.sum_eq_zero fun b'' _ => by - rw [show η a a'' = 0 from by - rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm ha'')], - zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ a) h), - Finset.sum_eq_single b (fun b'' _ hb'' => by - rw [show η b b'' = 0 from by - rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm hb'')], - mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ b) h)] - -/-- The transformation law of a product of two field strengths. -/ -lemma repLorentzGroup_fieldStrengthDeriv_mul (Λ : SL(2,ℂ)) - (μ ν ρ τ : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} ρ τ) = - ∑ a, ∑ b, ∑ a', ∑ b', - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' ρ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' τ : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, - repLorentzGroup_fieldStrengthDeriv_nil] - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - simp only [hsm, hms, hsmul] - -/-- The alternating four-fold contraction of Lorentz matrices is a determinant: - the combinatorial identity behind the invariance of the theta term. -/ -lemma sum_perm_sign_mul_prod_eq_det (Λ : SL(2,ℂ)) (v : Fin 4 → Fin 1 ⊕ Fin 3) : - (∑ p : Equiv.Perm (Fin 4), ((Equiv.Perm.sign p : ℤ) : ℝ) * - ∏ i, (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p i))) = - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by - rw [← Matrix.det_transpose, Matrix.det_apply] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [Units.smul_def, zsmul_eq_mul] - rfl - -/-- The alternating contraction matrix of a non-injective index tuple has two - equal rows, so its determinant vanishes. -/ -lemma det_toLorentzGroup_of_not_injective (Λ : SL(2,ℂ)) {v : Fin 4 → Fin 1 ⊕ Fin 3} - (hv : ¬ Function.Injective v) : - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = 0 := by - rw [Function.not_injective_iff] at hv - obtain ⟨i, j, hij, hne⟩ := hv - exact Matrix.det_zero_of_row_eq hne (funext fun k => by simp [hij]) - -/-- On an index tuple obtained by permuting the four spacetime indices, the - alternating contraction matrix has determinant the sign of the permutation, - by `det Λ = 1`. -/ -lemma det_toLorentzGroup_comp_perm (Λ : SL(2,ℂ)) (q : Equiv.Perm (Fin 4)) : - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - ((Equiv.Perm.sign q : ℤ) : ℝ) := by - have h1 : (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - ((Lorentz.SL2C.toLorentzGroup Λ).1.submatrix - (finSumFinEquiv (m := 1) (n := 3)).symm - (finSumFinEquiv (m := 1) (n := 3)).symm).submatrix q id := rfl - rw [h1, Matrix.det_permute, - Matrix.det_submatrix_equiv_self (finSumFinEquiv (m := 1) (n := 3)).symm, - Lorentz.SL2C.toLorentzGroup_det_one, mul_one] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the theta term: the alternating contraction is the - determinant of the Lorentz matrix, which is one. -/ -lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ thetaTerm = thetaTerm := by - classical - rw [thetaTerm, map_sum] - conv_lhs => enter [2, p]; rw [map_zsmul, repLorentzGroup_fieldStrengthDeriv_mul] - simp only [Finset.smul_sum] - rw [Finset.sum_comm] - conv_lhs => enter [2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] - have hdet : ∀ a b a' b' : Fin 1 ⊕ Fin 3, - (∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) * - (Lorentz.SL2C.toLorentzGroup Λ).1 b - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3)) : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b')) = - ((Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (![a, b, a', b'] i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) : ℝ) : ℂ) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - intro a b a' b' - rw [← sum_perm_sign_mul_prod_eq_det Λ ![a, b, a', b'], Complex.ofReal_sum, - Finset.sum_smul] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [Fin.prod_univ_four] - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] - rw [← Int.cast_smul_eq_zsmul ℂ, smul_smul] - congr 1 - push_cast - ring - conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [hdet a b a' b'] - have hflat : ∀ (G : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → - (Fin 1 ⊕ Fin 3) → JetAlgebra), - (∑ a, ∑ b, ∑ a', ∑ b', G a b a' b') = - ∑ t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), - G t.1 t.2.1 t.2.2.1 t.2.2.2 := fun G => by - symm - simp only [Fintype.sum_prod_type] - rw [hflat] - rw [← Finset.sum_filter_of_ne - (p := fun t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × - (Fin 1 ⊕ Fin 3) => Function.Injective ![t.1, t.2.1, t.2.2.1, t.2.2.2]) - (fun t _ hne => by - by_contra hni - exact hne (by - rw [det_toLorentzGroup_of_not_injective Λ hni, Complex.ofReal_zero, - zero_smul]))] - have hcard : Fintype.card (Fin 4) = Fintype.card (Fin 1 ⊕ Fin 3) := by simp - refine Finset.sum_bij - (i := fun t ht => (Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) - ?_ ?_ ?_ ?_ - · intro t ht - exact Finset.mem_univ _ - · intro t₁ ht₁ t₂ ht₂ h - have hv : ∀ i : Fin 4, ![t₁.1, t₁.2.1, t₁.2.2.1, t₁.2.2.2] i = - ![t₂.1, t₂.2.1, t₂.2.2.1, t₂.2.2.2] i := by - intro i - have := congrArg (fun q : Equiv.Perm (Fin 4) => - (finSumFinEquiv (m := 1) (n := 3)).symm (q i)) h - simpa using this - have h0 := hv 0 - have h1 := hv 1 - have h2 := hv 2 - have h3 := hv 3 - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 - exact Prod.ext h0 (Prod.ext h1 (Prod.ext h2 h3)) - · intro q _ - refine ⟨((finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)), ?_, ?_⟩ - · refine Finset.mem_filter.mpr ⟨Finset.mem_univ _, ?_⟩ - have hveq : ![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] = - fun i => (finSumFinEquiv (m := 1) (n := 3)).symm (q i) := by - funext i - fin_cases i <;> rfl - rw [hveq] - exact ((finSumFinEquiv (m := 1) (n := 3)).symm.injective).comp q.injective - · refine Equiv.ext fun i => ?_ - show (finSumFinEquiv (m := 1) (n := 3)) - (![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] i) = q i - fin_cases i <;> simp - · intro t ht - have hq : ∀ i : Fin 4, (finSumFinEquiv (m := 1) (n := 3)).symm - (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) i) = - ![t.1, t.2.1, t.2.2.1, t.2.2.2] i := by - intro i - simp [Equiv.ofBijective] - have hmat : (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (![t.1, t.2.1, t.2.2.1, t.2.2.2] i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm - (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by - refine congrArg Matrix.of (funext fun i => funext fun j => ?_) - rw [hq i] - rw [hmat, det_toLorentzGroup_comp_perm] - have h0 := hq 0 - have h1 := hq 1 - have h2 := hq 2 - have h3 := hq 3 - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 - rw [h0, h1, h2, h3, ← Int.cast_smul_eq_zsmul ℂ] - module - -/-! - -### The kinetic contraction identity and Lorentz invariance - --/ - -/-- The Lorentz intertwining identity of the kinetic contraction matrices: - transporting the two spinor slots contragrediently and the derivative slot by - the Lorentz matrix reproduces the contraction matrices. This is the identity - `L(Λ) L(Λ⁻¹) = 1` transported through `L(M†) = L(M)ᵀ`. -/ -lemma sum_kineticPauli_contraction (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) - (α' β' : Fin 2) : - ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' := by - classical - have hdet : Matrix.det ((Λ⁻¹).1ᴴ) = 1 := by - rw [Matrix.det_conjTranspose, Matrix.SpecialLinearGroup.det_coe] - exact star_one ℂ - have hval : ∀ μ, (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 = - ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - intro μ - have h := congrArg Subtype.val - (Lorentz.SL2C.toSelfAdjointMap_basis - (M := (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))) μ) - simp only [Lorentz.SL2C.toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', - Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, - selfAdjoint.val_smul] at h - calc (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 - = ∑ j, (Lorentz.SL2C.toLorentzGroup - (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 j μ • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - rw [← h] - congr 1 - rw [show ((⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ)) : - Matrix (Fin 2) (Fin 2) ℂ)ᴴ = (Λ⁻¹).1 from - Matrix.conjTranspose_conjTranspose _] - _ = ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - refine Finset.sum_congr rfl fun j _ => ?_ - congr 1 - rw [show (Lorentz.SL2C.toLorentzGroup - (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 = - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1ᵀ from - Lorentz.SL2C.toLorentzGroup_conjTranspose rfl, - Matrix.transpose_apply] - have hsand : ∀ μ, (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β'))) = - ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - intro μ - have hentry := congrArg (fun A : Matrix (Fin 2) (Fin 2) ℂ => A β' α') (hval μ) - simp only [Matrix.sum_apply, Matrix.smul_apply] at hentry - calc (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * star ((Λ⁻¹).1 β β'))) - = ((Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1) β' α' := by - rw [Matrix.mul_apply] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [Matrix.mul_apply, Finset.sum_mul] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [Matrix.conjTranspose_apply, kineticPauli, Matrix.transpose_apply] - ring - _ = ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - rw [hentry] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [kineticPauli, Matrix.transpose_apply, Complex.real_smul] - calc ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β'))) - = ∑ μ, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β')) := by - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [Finset.mul_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [Finset.mul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - ring - _ = ∑ μ, ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - ((((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β') := by - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [hsand, Finset.mul_sum] - _ = ∑ j, ((∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [Complex.ofReal_sum, Finset.sum_mul] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [Complex.ofReal_mul] - ring - _ = kineticPauli ν α' β' := by - have hmul : ∀ j, (∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j) = - ((1 : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ)) ν j := by - intro j - rw [← Matrix.mul_apply, - show ((Lorentz.SL2C.toLorentzGroup Λ).1 * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 : - Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) = - ((Lorentz.SL2C.toLorentzGroup Λ * - Lorentz.SL2C.toLorentzGroup Λ⁻¹ : LorentzGroup 3) : - Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) from rfl, - ← map_mul, mul_inv_cancel, map_one] - rfl - simp only [hmul, Matrix.one_apply] - rw [Finset.sum_eq_single ν (fun j _ hj => by - rw [if_neg (Ne.symm hj), Complex.ofReal_zero, zero_mul]) - (fun h => absurd (Finset.mem_univ ν) h), if_pos rfl, - Complex.ofReal_one, one_mul] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the fermion kinetic term: the transformation of the - two spinor slots and the derivative slot cancels through the intertwining - identity of the contraction matrices. -/ -lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by - have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, α]; rw [map_sum] - conv_lhs => - enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, - repLorentzGroup_Dψ_singleton] - simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] - -- move the primed sums out and the unprimed sums in - conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] - conv_rhs => rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => - Finset.sum_congr rfl fun β' _ => ?_ - conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] - conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] - rw [← Finset.sum_smul] - rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * - ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β')))) = kineticPauli ν α' β' from - sum_kineticPauli_contraction Λ ν α' β'] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the conjugate fermion kinetic term. -/ -lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTermBar = fermionKineticTermBar := by - have hsmS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [fermionKineticTermBar, map_smul] - congr 1 - rw [map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, α]; rw [map_sum] - conv_lhs => - enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, - repLorentzGroup_Dψ_nil] - simp only [hsmS, hsmF, hmsF, hsmul, Finset.smul_sum, smul_smul] - -- move the transformed sums out and the original sums in - conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, ν, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, ν, 2, α']; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, ν, 2, α']; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun α' _ => - Finset.sum_congr rfl fun β' _ => ?_ - conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] - conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] - rw [← Finset.sum_smul] - rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' from by - rw [← sum_kineticPauli_contraction Λ ν α' β'] - refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun α _ => - Finset.sum_congr rfl fun β _ => ?_ - ring] - -/-! - -## The span inclusion - -Every element of `massDimFourInvariants` is invariant and has mass weight at -most eight, so the span is contained in `InvariantMassWeightSubmodule 8`. - --/ - -/-- Eigenvectors of weight `m ≤ n` lie in the weight-`≤ n` submodule. -/ -lemma mem_massWeightLESubmodule_of_forall_massWeightScale {x : JetAlgebra} - {m n : ℕ} (hmn : m ≤ n) - (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) : - x ∈ MassWeightLESubmodule n := - Submodule.subset_span ⟨m, hmn, hx⟩ - -lemma maxwellTerm_mem_massWeightLESubmodule : - maxwellTerm ∈ MassWeightLESubmodule 8 := by - rw [maxwellTerm] - refine Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun ν _ => - Submodule.smul_mem _ _ ?_ - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl - (massWeightScale_mul_eigen (m := 4) (n := 4) - (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν) - (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν)) - -lemma thetaTerm_mem_massWeightLESubmodule : - thetaTerm ∈ MassWeightLESubmodule 8 := by - rw [thetaTerm] - refine Submodule.sum_mem _ fun p _ => zsmul_mem ?_ _ - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl - (massWeightScale_mul_eigen (m := 4) (n := 4) - (fun c => massWeightScale_fieldStrengthDeriv c {} _ _) - (fun c => massWeightScale_fieldStrengthDeriv c {} _ _)) - -lemma fermionKineticTerm_mem_massWeightLESubmodule : - fermionKineticTerm ∈ MassWeightLESubmodule 8 := by - rw [fermionKineticTerm] - refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => - Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => - Submodule.smul_mem _ _ ?_) - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 3 + 5) le_rfl - (massWeightScale_mul_eigen (m := 3) (n := 5) - (fun c => massWeightScale_Dbarψ c [] α) - (fun c => massWeightScale_Dψ c [μ] β)) - -lemma fermionKineticTermBar_mem_massWeightLESubmodule : - fermionKineticTermBar ∈ MassWeightLESubmodule 8 := by - rw [fermionKineticTermBar] - refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => - Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => - Submodule.smul_mem _ _ ?_) - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 5 + 3) le_rfl - (massWeightScale_mul_eigen (m := 5) (n := 3) - (fun c => massWeightScale_Dbarψ c [μ] α) - (fun c => massWeightScale_Dψ c [] β)) - -/-- Every element of `massDimFourInvariants` is gauge and Lorentz invariant. -/ -lemma isInvariant_of_mem_massDimFourInvariants {x : JetAlgebra} - (hx : x ∈ massDimFourInvariants) : IsInvariant x := by - rcases hx with rfl | rfl | rfl | rfl | rfl - · exact ⟨fun U => (repJetGaugeGroupI_eq_repAlgHom U 1).trans (repAlgHom U).map_one, - repLorentzGroup_apply_one⟩ - · exact ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ - · exact ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ - · exact ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ - · exact ⟨repJetGaugeGroupI_fermionKineticTermBar, - repLorentzGroup_fermionKineticTermBar⟩ - -lemma span_massDimFourInvariants_le : - Submodule.span ℂ massDimFourInvariants ≤ InvariantMassWeightSubmodule 8 := by - rw [Submodule.span_le] - intro x hx - refine Submodule.mem_inf.mpr ⟨?_, Submodule.subset_span - (isInvariant_of_mem_massDimFourInvariants hx)⟩ - rcases hx with rfl | rfl | rfl | rfl | rfl - · exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 0) (Nat.zero_le 8) - fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one - · exact maxwellTerm_mem_massWeightLESubmodule - · exact thetaTerm_mem_massWeightLESubmodule - · exact fermionKineticTerm_mem_massWeightLESubmodule - · exact fermionKineticTermBar_mem_massWeightLESubmodule -end JetAlgebra - -end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean deleted file mode 100644 index 0aaf8e08b..000000000 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/KleinAverage.lean +++ /dev/null @@ -1,1440 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.ProjectorValues -/-! -# The Klein average on the weight-eight monomials - -The entries of the Lorentz matrices of the three parity rotations, and the -values of the Klein four-group average `kleinAvg` on the weight-eight -monomials. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace QED -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups -/-- Entries of the Lorentz matrix of `parityZ`. -/ -lemma parityMatZ_00 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_01 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_02 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_03 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_10 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_11 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 0) = -1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_12 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_13 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_20 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_21 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_22 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 1) = -1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_23 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_30 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_31 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_32 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -lemma parityMatZ_33 : - (Lorentz.SL2C.toLorentzGroup parityZ).1 (Sum.inr 2) (Sum.inr 2) = 1 := by - rw [toLorentzGroup_parityZ] - norm_num [paritySignZ] - all_goals decide - -/-- Entries of the Lorentz matrix of `parityX`. -/ -lemma parityMatX_00 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_01 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_02 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_03 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_10 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_11 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 0) = 1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_12 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_13 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_20 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_21 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_22 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 1) = -1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_23 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_30 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_31 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_32 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -lemma parityMatX_33 : - (Lorentz.SL2C.toLorentzGroup parityX).1 (Sum.inr 2) (Sum.inr 2) = -1 := by - rw [toLorentzGroup_parityX] - norm_num [paritySignX] - all_goals decide - -/-- Entries of the Lorentz matrix of `parityY`. -/ -lemma parityMatY_00 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_01 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_02 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_03 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_10 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_11 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 0) = -1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_12 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_13 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_20 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_21 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_22 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 1) = 1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_23 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_30 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_31 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_32 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -lemma parityMatY_33 : - (Lorentz.SL2C.toLorentzGroup parityY).1 (Sum.inr 2) (Sum.inr 2) = -1 := by - rw [toLorentzGroup_parityY] - norm_num [paritySignY] - all_goals decide - -set_option maxHeartbeats 2000000 in -/-- The Klein average acts diagonally on products of two field strengths, by - the average of the four parity signs. -/ -lemma kleinAvg_fieldStrengthDeriv_nil_mul (a b c d : Fin 1 ⊕ Fin 3) : - kleinAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = - (((1 + paritySignZ a * paritySignZ b * (paritySignZ c * paritySignZ d) + - paritySignY a * paritySignY b * (paritySignY c * paritySignY d) + - paritySignX a * paritySignX b * (paritySignX c * paritySignX d)) / 4 : ℝ) : ℂ) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_apply_mul, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX, - smul_mul_smul_comm] - push_cast - module - -/-- Under a diagonal Lorentz transformation the second-derivative field - strength scales by the product of the signs of its four indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv_pair {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {ρ, τ} μ ν) = - ((sgn ρ * (sgn τ * (sgn μ * sgn ν)) : ℝ) : ℂ) • - fieldStrengthDeriv {ρ, τ} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_pair] - rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun s _ => - Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by - rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ρ) h)] - rw [Finset.sum_eq_single τ (fun s _ hs => Finset.sum_eq_zero fun a _ => - Finset.sum_eq_zero fun b _ => by - rw [hM s τ, if_neg hs, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ τ) h)] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, mul_zero, mul_zero, Complex.ofReal_zero, - zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, mul_zero, mul_zero, Complex.ofReal_zero, - zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM ρ ρ, if_pos rfl, hM τ τ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, - if_pos rfl] - -/-- The Klein average acts diagonally on the second-derivative field - strengths. -/ -lemma kleinAvg_fieldStrengthDeriv_pair (r t a b : Fin 1 ⊕ Fin 3) : - kleinAvg (fieldStrengthDeriv {r, t} a b) = - (((1 + paritySignZ r * (paritySignZ t * (paritySignZ a * paritySignZ b)) + - paritySignY r * (paritySignY t * (paritySignY a * paritySignY b)) + - paritySignX r * (paritySignX t * (paritySignX a * paritySignX b))) / 4 : ℝ) : ℂ) • - fieldStrengthDeriv {r, t} a b := by - rw [kleinAvg_apply, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_parityX] - push_cast - module - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,0]` (u-family). -/ -lemma kleinAvg_u_e000 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,1]` (u-family). -/ -lemma kleinAvg_u_e001 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,0]` (u-family). -/ -lemma kleinAvg_u_e010 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,1]` (u-family). -/ -lemma kleinAvg_u_e011 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,0]` (u-family). -/ -lemma kleinAvg_u_e100 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,1]` (u-family). -/ -lemma kleinAvg_u_e101 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,0]` (u-family). -/ -lemma kleinAvg_u_e110 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,1]` (u-family). -/ -lemma kleinAvg_u_e111 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,0]` (u-family). -/ -lemma kleinAvg_u_e200 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,1]` (u-family). -/ -lemma kleinAvg_u_e201 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,0]` (u-family). -/ -lemma kleinAvg_u_e210 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,1]` (u-family). -/ -lemma kleinAvg_u_e211 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,0]` (u-family). -/ -lemma kleinAvg_u_e300 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,1]` (u-family). -/ -lemma kleinAvg_u_e301 : - kleinAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,0]` (u-family). -/ -lemma kleinAvg_u_e310 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,1]` (u-family). -/ -lemma kleinAvg_u_e311 : - kleinAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e000 : - kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e001 : - kleinAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e010 : - kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[0,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e011 : - kleinAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e100 : - kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e101 : - kleinAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e110 : - kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[1,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e111 : - kleinAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e200 : - kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e201 : - kleinAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e210 : - kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (-(1/2) : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[2,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e211 : - kleinAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e300 : - kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,0,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e301 : - kleinAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,0]` (ubar-family). -/ -lemma kleinAvg_ubar_e310 : - kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0) = - 0 := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The Klein average of the fermion pair monomial `e[3,1,1]` (ubar-family). -/ -lemma kleinAvg_ubar_e311 : - kleinAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (-(1/2) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - rw [kleinAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - parityMatZ_00, parityMatZ_01, parityMatZ_02, parityMatZ_03, parityMatZ_10, parityMatZ_11, - parityMatZ_12, parityMatZ_13, parityMatZ_20, parityMatZ_21, parityMatZ_22, parityMatZ_23, - parityMatZ_30, parityMatZ_31, parityMatZ_32, parityMatZ_33, parityMatX_00, parityMatX_01, - parityMatX_02, parityMatX_03, parityMatX_10, parityMatX_11, parityMatX_12, parityMatX_13, - parityMatX_20, parityMatX_21, parityMatX_22, parityMatX_23, parityMatX_30, parityMatX_31, - parityMatX_32, parityMatX_33, parityMatY_00, parityMatY_01, parityMatY_02, parityMatY_03, - parityMatY_10, parityMatY_11, parityMatY_12, parityMatY_13, parityMatY_20, parityMatY_21, - parityMatY_22, parityMatY_23, parityMatY_30, parityMatY_31, parityMatY_32, parityMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) -end JetAlgebra - -end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean deleted file mode 100644 index de4d562dc..000000000 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/MonomialForm.lean +++ /dev/null @@ -1,494 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.Sectors -/-! -# The invariants in monomial form - -The Lorentz transformation law of the second-derivative field strength, the -(anti)commutation rules for the covariant factors, the parametric boosts along -the three coordinate axes, and the four renormalizable invariants written out -in the monomial basis. These are the inputs to the weight-eight analysis. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace QED -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups -/-! - -### Commutation and anticommutation of the covariant factors - --/ - -/-- The embedded field-strength derivatives commute: they live in the - commutative bosonic factor of the jet algebra. -/ -lemma fieldStrengthDeriv_mul_comm (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν ρ τ : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' ρ τ = - fieldStrengthDeriv s' ρ τ * fieldStrengthDeriv s μ ν := by - rw [fieldStrengthDeriv, fieldStrengthDeriv, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, - mul_comm (BBoson.JetAlgebra.fieldStrengthDeriv s μ ν)] - -set_option maxHeartbeats 16000000 in -/-- The embedded lepton-linear and conjugate-linear elements anticommute: - both are odd elements of the exterior factor of the jet algebra. -/ -lemma leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm (x : LeptonLinear) - (y : ConjLeptonLinear) : - leptonLinearIncl x * conjLeptonLinearIncl y = - -(conjLeptonLinearIncl y * leptonLinearIncl x) := by - have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z - have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hι : ∀ (a : LeptonComponent) (b : ConjLeptonComponent), - leptonComponentIncl a * conjLeptonComponentIncl b = - -(conjLeptonComponentIncl b * leptonComponentIncl a) := fun a b => by - rw [leptonComponentIncl_apply, conjLeptonComponentIncl_apply] - exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) - induction x using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, neg_zero] - | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] - | tmul p a => - induction y using TensorProduct.induction_on with - | zero => rw [map_zero, hz₂, hz₁, neg_zero] - | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] - | tmul q b => - rw [leptonLinearIncl_tmul, conjLeptonLinearIncl_tmul, - Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - hι a b, mul_comm q p, TensorProduct.tmul_neg] - -/-- The covariant lepton derivatives anticommute with the conjugate covariant - derivatives. -/ -lemma Dψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dψ l α * Dbarψ l' β = -(Dbarψ l' β * Dψ l α) := by - rw [Dψ_eq_leptonLinearIncl, Dbarψ_eq_conjLeptonLinearIncl, - leptonLinearIncl_mul_conjLeptonLinearIncl_anticomm] - -set_option maxHeartbeats 16000000 in -/-- Two embedded lepton-linear elements anticommute. -/ -lemma leptonLinearIncl_mul_leptonLinearIncl_anticomm (x y : LeptonLinear) : - leptonLinearIncl x * leptonLinearIncl y = - -(leptonLinearIncl y * leptonLinearIncl x) := by - have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z - have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hι : ∀ a b : LeptonComponent, - leptonComponentIncl a * leptonComponentIncl b = - -(leptonComponentIncl b * leptonComponentIncl a) := fun a b => by - rw [leptonComponentIncl_apply, leptonComponentIncl_apply] - exact eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap _ _) - induction x using TensorProduct.induction_on with - | zero => rw [map_zero, hz₁, hz₂, neg_zero] - | add a b ha hb => rw [map_add, hd₁, hd₂, ha, hb, neg_add] - | tmul p a => - induction y using TensorProduct.induction_on with - | zero => rw [map_zero, hz₂, hz₁, neg_zero] - | add c d hc hd => rw [map_add, hd₂, hd₁, hc, hd, neg_add] - | tmul q b => - rw [leptonLinearIncl_tmul, leptonLinearIncl_tmul, - Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - hι a b, mul_comm q p, TensorProduct.tmul_neg] - -/-! - -### Parametric boosts along the three axes - -The one-parameter families of boosts `diag(t, t⁻¹)` (along `z`) and their -conjugates along `x` and `y`, with symbolic Lorentz matrices in `t`. - --/ - -/-- The lift `diag(t, t⁻¹)` of the boost along the `z`-axis with rapidity - `2 log t`. -/ -noncomputable def boostZel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := - ⟨!![(t : ℂ), 0; 0, (t : ℂ)⁻¹], by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [Matrix.det_fin_two_of] - simp [mul_inv_cancel₀ htc]⟩ - -/-- The lift of the boost along the `x`-axis with rapidity `2 log t`. -/ -noncomputable def boostXel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := - ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, ((t : ℂ) - (t : ℂ)⁻¹)/2; - ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [Matrix.det_fin_two_of] - field_simp - ring⟩ - -/-- The lift of the boost along the `y`-axis with rapidity `2 log t`. -/ -noncomputable def boostYel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := - ⟨!![((t : ℂ) + (t : ℂ)⁻¹)/2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; - Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2], by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - have h2 : -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * - (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) = - ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by - have hI : -Complex.I * Complex.I = 1 := by - rw [neg_mul, Complex.I_mul_I, neg_neg] - calc -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * - (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) - = (-Complex.I * Complex.I) * - (((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2)) := by - ring - _ = ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by - rw [hI, one_mul] - rw [Matrix.det_fin_two_of, h2] - field_simp - ring⟩ - -/-- The Lorentz matrix of `boostZel t`: `ch = (t² + t⁻²)/2` on the time-time - and `zz` entries, `-sh = -(t² - t⁻²)/2` on the mixed entries. -/ -noncomputable def boostMatZ (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 - | Sum.inl _, Sum.inr 2 => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 2, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => (t^2 + (t⁻¹)^2)/2 - | _, _ => 0 - -/-- The Lorentz matrix of `boostXel t`. -/ -noncomputable def boostMatX (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 - | Sum.inl _, Sum.inr 0 => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inr 0 => (t^2 + (t⁻¹)^2)/2 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 1 - | _, _ => 0 - -/-- The Lorentz matrix of `boostYel t`. -/ -noncomputable def boostMatY (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => (t^2 + (t⁻¹)^2)/2 - | Sum.inl _, Sum.inr 1 => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 1, Sum.inl _ => -((t^2 - (t⁻¹)^2)/2) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => (t^2 + (t⁻¹)^2)/2 - | Sum.inr 2, Sum.inr 2 => 1 - | _, _ => 0 - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Lorentz matrix of the parametric `z`-boost. -/ -lemma toLorentzGroup_boostZel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostZel t ht)).1 a b = boostMatZ t a b := by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostZel, boostMatZ, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, - Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try push_cast - try field_simp - try ring_nf - try norm_num [Complex.I_sq, Complex.conj_ofNat] - try ring - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Lorentz matrix of the parametric `x`-boost. -/ -lemma toLorentzGroup_boostXel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostXel t ht)).1 a b = boostMatX t a b := by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostXel, boostMatX, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, - Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try push_cast - try field_simp - try ring_nf - try norm_num [Complex.I_sq, Complex.conj_ofNat] - try ring - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Lorentz matrix of the parametric `y`-boost. -/ -lemma toLorentzGroup_boostYel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostYel t ht)).1 a b = boostMatY t a b := by - have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostYel, boostMatY, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag, Complex.conj_ofNat, - Complex.conj_ofReal, Complex.conj_I, Complex.I_sq] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try push_cast - try field_simp - try ring_nf - try norm_num [Complex.I_sq, Complex.conj_ofNat] - try ring - -/-- The inverse of the parametric `z`-boost is the boost at the inverse - parameter. -/ -lemma boostZel_inv (t : ℝ) (ht : t ≠ 0) : - (boostZel t ht)⁻¹ = boostZel t⁻¹ (inv_ne_zero ht) := by - ext i j - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - fin_cases i <;> fin_cases j <;> - simp [boostZel, Complex.ofReal_inv, inv_inv] - -/-- The inverse of the parametric `x`-boost is the boost at the inverse - parameter. -/ -lemma boostXel_inv (t : ℝ) (ht : t ≠ 0) : - (boostXel t ht)⁻¹ = boostXel t⁻¹ (inv_ne_zero ht) := by - ext i j - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - fin_cases i <;> fin_cases j <;> - · simp [boostXel, Complex.ofReal_inv, inv_inv] - try ring - -/-- The inverse of the parametric `y`-boost is the boost at the inverse - parameter. -/ -lemma boostYel_inv (t : ℝ) (ht : t ≠ 0) : - (boostYel t ht)⁻¹ = boostYel t⁻¹ (inv_ne_zero ht) := by - ext i j - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - fin_cases i <;> fin_cases j <;> - · simp [boostYel, Complex.ofReal_inv, inv_inv] - try ring - -/-- The inverse of the parametric `z`-boost, entrywise, with real entries. -/ -lemma boostZel_inv_coe (t : ℝ) (ht : t ≠ 0) : - ((boostZel t ht)⁻¹ : SL(2,ℂ)).1 = - !![(((t⁻¹ : ℝ)) : ℂ), 0; 0, ((t : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostZel] - -/-- The inverse of the parametric `x`-boost, entrywise. -/ -lemma boostXel_inv_coe (t : ℝ) (ht : t ≠ 0) : - ((boostXel t ht)⁻¹ : SL(2,ℂ)).1 = - !![((t : ℂ) + (t : ℂ)⁻¹)/2, -(((t : ℂ) - (t : ℂ)⁻¹)/2); - -(((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostXel] - -/-- The inverse of the parametric `y`-boost, entrywise. -/ -lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : - ((boostYel t ht)⁻¹ : SL(2,ℂ)).1 = - !![((t : ℂ) + (t : ℂ)⁻¹)/2, Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; - -(Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2), ((t : ℂ) + (t : ℂ)⁻¹)/2] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring - -/-- The Lorentz matrix of the inverse `z`-boost: the boost matrix at the - inverse parameter. -/ -lemma toLorentzGroup_boostZel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostZel t ht)⁻¹).1 a b = boostMatZ t⁻¹ a b := by - rw [boostZel_inv, toLorentzGroup_boostZel] - -/-- The Lorentz matrix of the inverse `x`-boost. -/ -lemma toLorentzGroup_boostXel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostXel t ht)⁻¹).1 a b = boostMatX t⁻¹ a b := by - rw [boostXel_inv, toLorentzGroup_boostXel] - -/-- The Lorentz matrix of the inverse `y`-boost. -/ -lemma toLorentzGroup_boostYel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostYel t ht)⁻¹).1 a b = boostMatY t⁻¹ a b := by - rw [boostYel_inv, toLorentzGroup_boostYel] - -/-! - -### The four invariants in monomial form - --/ - -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in -/-- The Maxwell term as an explicit combination of the six independent - field-strength squares. -/ -lemma maxwellTerm_eq : maxwellTerm = - (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z - have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z - have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind - have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind - rw [maxwellTerm] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - minkowskiMatrix.inl_0_inl_0, minkowskiMatrix.inr_i_inr_i, - fieldStrengthDeriv_self, hz₁, hz₂, smul_zero, add_zero, zero_add] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - hnm, hmn, neg_neg] - push_cast - module - -set_option maxHeartbeats 8000000 in -set_option linter.unusedSimpArgs false in -/-- The theta term as an explicit combination of the three pair-partition - products of field strengths. -/ -lemma thetaTerm_eq : thetaTerm = - (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind - have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind - rw [thetaTerm] - conv_lhs => - enter [2, p] - rw [show (1 : Fin 4) = (0 : Fin 3).succ from rfl, - show (2 : Fin 4) = (1 : Fin 3).succ from rfl, - show (3 : Fin 4) = (2 : Fin 3).succ from rfl] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i, 2, j] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i, 2, j, 2, k] - rw [Fintype.sum_subsingleton _ (1 : Equiv.Perm (Fin 1))] - simp only [Equiv.coe_toEmbedding, Fin.sum_univ_four, Fin.sum_univ_three, - Fin.sum_univ_two, - show ((1 : Fin 3)) = (0 : Fin 2).succ from rfl, - show ((2 : Fin 3)) = (1 : Fin 2).succ from rfl, - Equiv.Perm.decomposeFin_symm_of_one, - Equiv.Perm.decomposeFin.symm_sign, - Equiv.Perm.decomposeFin_symm_apply_zero, - Equiv.Perm.decomposeFin_symm_apply_one, - Equiv.Perm.decomposeFin_symm_apply_succ] - simp only [show ((0 : Fin 2).succ) = (1 : Fin 3) from rfl, - show ((1 : Fin 2).succ) = (2 : Fin 3) from rfl, - show ((0 : Fin 3).succ) = (1 : Fin 4) from rfl, - show ((1 : Fin 3).succ) = (2 : Fin 4) from rfl, - show ((2 : Fin 3).succ) = (3 : Fin 4) from rfl, - Equiv.swap_self, Equiv.Perm.sign_refl, Equiv.refl_apply, Equiv.Perm.sign_one, - Equiv.swap_apply_left, Equiv.swap_apply_right, Equiv.swap_apply_of_ne_of_ne, - Equiv.Perm.sign_swap', Fin.reduceEq, reduceIte, ne_eq, not_false_iff, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 0) = Sum.inl 0 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 1) = Sum.inr 0 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 2) = Sum.inr 1 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 3) = Sum.inr 2 from rfl, - Units.val_one, Units.val_neg, one_smul, neg_smul, one_mul, mul_one] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - hnm, hmn, neg_neg] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _] - module - -set_option maxHeartbeats 2000000 in -set_option linter.unusedSimpArgs false in -/-- The fermion kinetic term as an explicit combination of the eight - `ψ̄ (D ψ)` monomials. -/ -lemma fermionKineticTerm_eq : fermionKineticTerm = - Complex.I • ((Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) - - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - - Complex.I • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) := by - rw [fermionKineticTerm] - congr 1 - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - Fin.sum_univ_two] - norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.transpose_apply, Matrix.one_apply] - module - -set_option maxHeartbeats 2000000 in -set_option linter.unusedSimpArgs false in -/-- The conjugate fermion kinetic term as an explicit combination of the eight - `(D̄ ψ̄) ψ` monomials. -/ -lemma fermionKineticTermBar_eq : fermionKineticTermBar = - (-Complex.I) • ((Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) - - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - - Complex.I • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) := by - rw [fermionKineticTermBar] - congr 1 - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - Fin.sum_univ_two] - norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.transpose_apply, Matrix.one_apply] - module -end JetAlgebra - -end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean deleted file mode 100644 index 15fd82f1d..000000000 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/ProjectorValues.lean +++ /dev/null @@ -1,312 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.ProjectorsDerivative -/-! -# Values of the projector and of the Klein average - -The values of `opPi` on the weight-eight monomials, the entries of the Lorentz -matrices of the parity rotations, and the values of the Klein average -`kleinAvg` on the weight-eight monomials. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace QED -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F01_F01`. -/ -lemma opPi_F01_F01 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF0 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F01_F23`. -/ -lemma opPi_F01_F23 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (1/24 : ℂ) • thetaTerm := by - rw [opPi_apply, - projFF1 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F02_F02`. -/ -lemma opPi_F02_F02 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF2 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F02_F13`. -/ -lemma opPi_F02_F13 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (-(1/24) : ℂ) • thetaTerm := by - rw [opPi_apply, - projFF3 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F03_F03`. -/ -lemma opPi_F03_F03 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF4 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F03_F12`. -/ -lemma opPi_F03_F12 : - opPi (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (1/24 : ℂ) • thetaTerm := by - rw [opPi_apply, - projFF5 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F12_F12`. -/ -lemma opPi_F12_F12 : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (1/12 : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF6 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F13_F13`. -/ -lemma opPi_F13_F13 : - opPi (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (1/12 : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF7 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the field-strength square `F23_F23`. -/ -lemma opPi_F23_F23 : - opPi (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (1/12 : ℂ) • maxwellTerm := by - rw [opPi_apply, - projFF8 opS opS_F01_F01 opS_F01_F23 opS_F02_F02 opS_F02_F13 opS_F03_F03 opS_F03_F12 opS_F12_F12 - opS_F13_F13 opS_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd01_F01`. -/ -lemma opPi_dd01_F01 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF0 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd01_F23`. -/ -lemma opPi_dd01_F23 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF1 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd02_F02`. -/ -lemma opPi_dd02_F02 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF2 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd02_F13`. -/ -lemma opPi_dd02_F13 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF3 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd03_F03`. -/ -lemma opPi_dd03_F03 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF4 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd03_F12`. -/ -lemma opPi_dd03_F12 : - opPi (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF5 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd12_F03`. -/ -lemma opPi_dd12_F03 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF6 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd12_F12`. -/ -lemma opPi_dd12_F12 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF7 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd13_F02`. -/ -lemma opPi_dd13_F02 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF8 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd13_F13`. -/ -lemma opPi_dd13_F13 : - opPi (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF9 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd23_F01`. -/ -lemma opPi_dd23_F01 : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF10 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` annihilates the derivative monomial `dd23_F23`. -/ -lemma opPi_dd23_F23 : - opPi (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [opPi_apply, - projDDF11 opS opS_dd01_F01 opS_dd01_F23 opS_dd02_F02 opS_dd02_F13 opS_dd03_F03 opS_dd03_F12 - opS_dd12_F03 opS_dd12_F12 opS_dd13_F02 opS_dd13_F13 opS_dd23_F01 opS_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u0`. -/ -lemma opPi_u0 : - opPi (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (-(Complex.I/4)) • fermionKineticTerm := by - rw [opPi_apply, - projFMu0 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u1`. -/ -lemma opPi_u1 : - opPi (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (Complex.I/4) • fermionKineticTerm := by - rw [opPi_apply, - projFMu1 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u2`. -/ -lemma opPi_u2 : - opPi (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (1/4 : ℂ) • fermionKineticTerm := by - rw [opPi_apply, - projFMu2 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `u3`. -/ -lemma opPi_u3 : - opPi (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (Complex.I/4) • fermionKineticTerm := by - rw [opPi_apply, - projFMu3 opS opS_u0 opS_u1 opS_u2 opS_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar0`. -/ -lemma opPi_ubar0 : - opPi (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (Complex.I/4) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar0 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar1`. -/ -lemma opPi_ubar1 : - opPi (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (-(Complex.I/4)) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar1 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar2`. -/ -lemma opPi_ubar2 : - opPi (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (-(1/4) : ℂ) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar2 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `opPi` on the σ-contracted fermion pair `ubar3`. -/ -lemma opPi_ubar3 : - opPi (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (-(Complex.I/4)) • fermionKineticTermBar := by - rw [opPi_apply, - projFMubar3 opS opS_ubar0 opS_ubar1 opS_ubar2 opS_ubar3, - ← fermionKineticTermBar_eq] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) -end JetAlgebra - -end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean deleted file mode 100644 index 670c7fffa..000000000 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/Sectors.lean +++ /dev/null @@ -1,894 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.Decomposition -/-! -# The neutral sectors of weight at most eight - -The charge-zero covariant monomials of weight four are the field strengths -`F_{μν}`, of weight six the derivatives `∂_ρ F_{μν}` and the fermion pairs -`ψ̄_α ψ_β`, and of weight eight the products `F F`, the second derivatives -`∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion pairs -(`chargeCovSpan_four_le`, `chargeCovSpan_six_le`, `chargeCovSpan_eight_le`). - -Averaging over the Klein four-group of parity rotations kills the weight-four -sector outright, and combining it with the trace-free kill operator `sixKill` -kills the weight-six sector. The file closes with the four invariants written -out in the monomial basis, which is what the weight-eight analysis consumes. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace QED -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## The Lorentz analysis of the neutral sectors - -TODO: the remaining sector lemmas. The charge-zero covariant monomials of -weight four are the field strengths `F_{μν}`, of weight six the derivatives -`∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β`, of weight eight the products -`F F`, the second derivatives `∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion -pairs. Lorentz invariance kills the weight-four and weight-six sectors and -reduces the weight-eight sector to the span of the Maxwell term, the theta -term, and the two fermion kinetic terms. - --/ - -/-- Each invariant generator is a weight eigenvector of weight at least - three. -/ -lemma exists_weight_of_mem_invariantGenerators {g : JetAlgebra} - (hg : g ∈ invariantGenerators) : - ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c g = c ^ w • g := by - rcases hg with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact ⟨4 + 2 * Multiset.card p.1, by omega, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dψ c p.1 p.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ - -/-- The product of a list of invariant generators is a weight eigenvector of - weight at least three times the length. -/ -lemma exists_weight_of_list_prod {l : List JetAlgebra} - (hl : ∀ g ∈ l, g ∈ invariantGenerators) : - ∃ w, 3 * l.length ≤ w ∧ - ∀ c : ℂ, massWeightScale c l.prod = c ^ w • l.prod := by - induction l with - | nil => - exact ⟨0, by simp, fun c => by - rw [List.prod_nil, pow_zero, one_smul] - exact (massWeightScale c).map_one⟩ - | cons g l ih => - obtain ⟨wg, hwg3, hwg⟩ := exists_weight_of_mem_invariantGenerators - (hl g List.mem_cons_self) - obtain ⟨wl, hwl3, hwl⟩ := ih fun x hx => hl x (List.mem_cons_of_mem g hx) - refine ⟨wg + wl, by simp only [List.length_cons]; omega, fun c => ?_⟩ - rw [List.prod_cons] - exact massWeightScale_mul_eigen hwg hwl c - -/-- The constant gauge character of a product of two lepton factors: charge - two. -/ -lemma rep_ofConstant_Dψ_mul_Dψ (g : GaugeGroupI) (l l' : List (Fin 1 ⊕ Fin 3)) - (α β : Fin 2) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dψ l α * Dψ l' β) = - ((g.2.2 : ℂ)) ^ (6 * (2 : ℤ)) • (Dψ l α * Dψ l' β) := by - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, - JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, - SubmonoidClass.coe_pow, smul_mul_smul_comm, ← pow_add, - show (6 * (2 : ℤ)) = ((12 : ℕ) : ℤ) from rfl, zpow_natCast] - -/-- The constant gauge character of a product of two conjugate lepton factors: - charge minus two. -/ -lemma rep_ofConstant_Dbarψ_mul_Dbarψ (g : GaugeGroupI) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dbarψ l α * Dbarψ l' β) = - ((g.2.2 : ℂ)) ^ (6 * (-2 : ℤ)) • (Dbarψ l α * Dbarψ l' β) := by - have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := - eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, - JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, - SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← pow_add, - hinv, inv_pow, show (6 + 6 : ℕ) = 12 from rfl, - show (6 * (-2 : ℤ)) = -((12 : ℕ) : ℤ) from rfl, _root_.zpow_neg, zpow_natCast] - -/-- The weight-four neutral sector: spanned by the embedded field strengths. -/ -lemma chargeCovSpan_four_le : - chargeCovSpan 4 0 ≤ Submodule.span ℂ - (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {} p.1 p.2) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, -⟩ - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', t⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 0 - · rw [Multiset.card_eq_zero.mp hcard] - exact Submodule.subset_span ⟨(p.2.1, p.2.2), rfl⟩ - · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - rw [eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega)] - exact Submodule.zero_mem _ - -set_option maxHeartbeats 4000000 in -/-- The weight-six neutral sector: spanned by the first derivatives of the - field strength and the zero-derivative lepton pairs. -/ -lemma chargeCovSpan_six_le : - chargeCovSpan 6 0 ≤ Submodule.span ℂ - ((Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {p.1} p.2.1 p.2.2) ∪ - (Set.range fun p : Fin 2 × Fin 2 => Dbarψ [] p.1 * Dψ [] p.2) ∪ - (Set.range fun p : Fin 2 × Fin 2 => Dψ [] p.1 * Dbarψ [] p.2)) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, hy3⟩ - simp only [mul_zero, zpow_zero, one_smul] at hy3 - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 1 - · obtain ⟨ρ, hρ⟩ := Multiset.card_eq_one.mp hcard - rw [hρ] - exact Submodule.subset_span (Or.inl (Or.inl ⟨(ρ, p.2.1, p.2.2), rfl⟩)) - · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with - (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> - dsimp only at hy2 hy3 ⊢ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) - (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 - · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] - exact Submodule.subset_span (Or.inr ⟨(p.2, q.2), rfl⟩) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 - · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] - exact Submodule.subset_span (Or.inl (Or.inr ⟨(p.2, q.2), rfl⟩)) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) - (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - rw [eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega)] - exact Submodule.zero_mem _ - -set_option maxHeartbeats 4000000 in -/-- The weight-eight neutral sector: spanned by the field-strength squares, the - second derivatives of the field strength, and the one-derivative lepton - pairs. -/ -lemma chargeCovSpan_eight_le : - chargeCovSpan 8 0 ≤ Submodule.span ℂ - ((Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × - (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {} p.1.1 p.1.2 * fieldStrengthDeriv {} p.2.1 p.2.2) ∪ - (Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × - (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {p.1.1, p.1.2} p.2.1 p.2.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dbarψ [] p.1.1 * Dψ [p.2] p.1.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dψ [p.2] p.1.2 * Dbarψ [] p.1.1) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dψ [] p.1.1 * Dbarψ [p.2] p.1.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dbarψ [p.2] p.1.2 * Dψ [] p.1.1)) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, hy3⟩ - simp only [mul_zero, zpow_zero, one_smul] at hy3 - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 2 - · obtain ⟨ρ, τ, hρτ⟩ := Multiset.card_eq_two.mp hcard - rw [hρτ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl - (Or.inr ⟨((ρ, τ), p.2.1, p.2.2), rfl⟩))))) - · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with - (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> - dsimp only at hy2 hy3 ⊢ - · by_cases hcard : Multiset.card p.1 = 0 ∧ Multiset.card q.1 = 0 - · rw [Multiset.card_eq_zero.mp hcard.1, Multiset.card_eq_zero.mp hcard.2] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl - (Or.inl ⟨((p.2.1, p.2.2), q.2.1, q.2.2), rfl⟩))))) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) - (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 - rw [List.length_eq_zero_iff.mp hlen.1, hμ] - exact Submodule.subset_span (Or.inl (Or.inr ⟨((p.2, q.2), μ), rfl⟩)) - · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 - rw [List.length_eq_zero_iff.mp hlen'.2, hμ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inr - ⟨((q.2, p.2), μ), rfl⟩))) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 - rw [List.length_eq_zero_iff.mp hlen.1, hμ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inr - ⟨((p.2, q.2), μ), rfl⟩)))) - · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 - rw [List.length_eq_zero_iff.mp hlen'.2, hμ] - exact Submodule.subset_span (Or.inr ⟨((q.2, p.2), μ), rfl⟩) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) - (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · have h0 : (g :: g' :: g'' :: t).prod = 0 := by - obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - exact eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega) - exact Set.mem_of_eq_of_mem h0 (Submodule.zero_mem _) - -/-! - -### The parity rotations - -The three rotations by `π` about the coordinate axes lift to `SL(2,ℂ)` as -`i σ_k`; their Lorentz matrices are the diagonal sign matrices fixing the time -axis and the rotation axis and reversing the two others. Averaging over this -Klein four-group kills every tensor component with an odd index pattern; since -every antisymmetric index pair is odd under exactly two of the three parities, -the weight-four sector admits no invariant. - --/ - -/-- The lift `diag(i, -i)` of the rotation by `π` about the `z`-axis. -/ -noncomputable def parityZ : SL(2,ℂ) := - ⟨!![Complex.I, 0; 0, -Complex.I], by - simp [Matrix.det_fin_two_of]⟩ - -/-- The lift `i σ1` of the rotation by `π` about the `x`-axis. -/ -noncomputable def parityX : SL(2,ℂ) := - ⟨!![0, Complex.I; Complex.I, 0], by - simp [Matrix.det_fin_two_of]⟩ - -/-- The lift `i σ2` of the rotation by `π` about the `y`-axis. -/ -noncomputable def parityY : SL(2,ℂ) := - ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ - -/-- The sign pattern of the rotation by `π` about the `z`-axis. -/ -def paritySignZ : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => -1 - | Sum.inr 1 => -1 - | Sum.inr 2 => 1 - -/-- The sign pattern of the rotation by `π` about the `x`-axis. -/ -def paritySignX : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => 1 - | Sum.inr 1 => -1 - | Sum.inr 2 => -1 - -/-- The sign pattern of the rotation by `π` about the `y`-axis. -/ -def paritySignY : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => -1 - | Sum.inr 1 => 1 - | Sum.inr 2 => -1 - -/-- The Lorentz matrix of the `z`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_parityZ (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup parityZ).1 a b = - if a = b then paritySignZ a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [parityZ, paritySignZ, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- The Lorentz matrix of the `x`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_parityX (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup parityX).1 a b = - if a = b then paritySignX a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [parityX, paritySignX, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- The Lorentz matrix of the `y`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_parityY (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup parityY).1 a b = - if a = b then paritySignY a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [parityY, paritySignY, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- Under a diagonal Lorentz transformation the field strength scales by the - product of the signs of its two indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {} μ ν) = - ((sgn μ * sgn ν : ℝ) : ℂ) • fieldStrengthDeriv {} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_nil] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] - -/-- The field strength vanishes on a repeated index. -/ -lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ μ = 0 := by - have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = - [JetGenerators.dB (s + {μ}) μ]ₐ - [JetGenerators.dB (s + {μ}) μ]ₐ := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] - rfl - rw [h, sub_self] - -set_option maxHeartbeats 2000000 in -/-- No Lorentz invariant of mass weight four: an invariant combination of the - field strengths `F_{μν}` vanishes, since every antisymmetric index pair is - odd under two of the three parity rotations. -/ -lemma eq_zero_of_mem_chargeCovSpan_four {y : JetAlgebra} - (hy : y ∈ chargeCovSpan 4 0) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by - obtain ⟨c, hc⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp - (chargeCovSpan_four_le hy) - have h4 : ((4 : ℂ)⁻¹ • (y + repLorentzGroup parityZ y + - repLorentzGroup parityY y + repLorentzGroup parityX y)) = y := by - rw [hinv, hinv, hinv] - module - rw [← h4, ← hc, map_sum, map_sum, map_sum] - simp only [map_smul, repLorentzGroup_diag_fieldStrengthDeriv - toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_parityX] - rw [← Finset.sum_add_distrib, ← Finset.sum_add_distrib, - ← Finset.sum_add_distrib, Finset.smul_sum] - refine Finset.sum_eq_zero fun p _ => ?_ - rcases eq_or_ne p.1 p.2 with hp | hp - · rw [hp, fieldStrengthDeriv_self] - simp - · rw [smul_smul, smul_smul, smul_smul, ← add_smul, ← add_smul, ← add_smul, - smul_smul] - rw [show ((4 : ℂ)⁻¹ * (c p + c p * ((paritySignZ p.1 * paritySignZ p.2 : ℝ) : ℂ) + - c p * ((paritySignY p.1 * paritySignY p.2 : ℝ) : ℂ) + - c p * ((paritySignX p.1 * paritySignX p.2 : ℝ) : ℂ))) = 0 from by - rcases p with ⟨μ, ν⟩ - rcases μ with μ | μ <;> rcases ν with ν | ν <;> - first - | (exact absurd rfl (by simpa using hp)) - | (fin_cases μ <;> fin_cases ν <;> - simp_all [paritySignZ, paritySignY, paritySignX] <;> - norm_num [Complex.ext_iff] <;> ring)] - rw [zero_smul] - -/-! - -### The transformation law of the derivative field strength - --/ - -/-- The transformation law of the embedded first-derivative field strength: - a three-index tensor, all indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_singleton (Λ : SL(2,ℂ)) - (ρ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {ρ} μ ν) = - ∑ r, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) : ℝ)) : ℂ) • - fieldStrengthDeriv {r} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] - -/-- Under a diagonal Lorentz transformation the derivative field strength - scales by the product of the signs of its three indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv_singleton {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (ρ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {ρ} μ ν) = - ((sgn ρ * (sgn μ * sgn ν) : ℝ) : ℂ) • fieldStrengthDeriv {ρ} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_singleton] - rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun a _ => - Finset.sum_eq_zero fun b _ => by - rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ρ) h)] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM ρ ρ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] - -/-- Antisymmetry of the embedded field-strength derivatives in the two field - indices. -/ -lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s ν μ = - fieldStrengthDeriv s μ ν := by - have h : ∀ a b : Fin 1 ⊕ Fin 3, (fieldStrengthDeriv s a b : JetAlgebra) = - [JetGenerators.dB (s + {a}) b]ₐ - [JetGenerators.dB (s + {b}) a]ₐ := by - intro a b - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] - rfl - rw [h, h, neg_sub] - -/-- The canonical orientation of a mixed field-strength component: the time - index first. -/ -lemma fieldStrengthDeriv_inr_inl (s : Multiset (Fin 1 ⊕ Fin 3)) (i : Fin 3) - (j : Fin 1) : - fieldStrengthDeriv s (Sum.inr i) (Sum.inl j) = - - fieldStrengthDeriv s (Sum.inl j) (Sum.inr i) := - fieldStrengthDeriv_antisymm s (Sum.inl j) (Sum.inr i) - -/-! - -### The boosts along the `z`-axis - -Two diagonal boosts `diag(t, t⁻¹)` with `t = 2, 3`. Together with the Klein -four-group of parity rotations they suffice to kill the neutral weight-six -sector: the Klein average projects onto the twelve surviving field-strength -components and the diagonal fermion pairs, and a rational combination of the -two boosts (with weights summing to one) annihilates all of them. - --/ - -/-- The lift `diag(2, 1/2)` of the boost along the `z`-axis with rapidity - `log 4`. -/ -noncomputable def boostA : SL(2,ℂ) := - ⟨!![2, 0; 0, 2⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ - -/-- The lift `diag(3, 1/3)` of the boost along the `z`-axis with rapidity - `log 9`. -/ -noncomputable def boostB : SL(2,ℂ) := - ⟨!![3, 0; 0, 3⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ - -/-- The Lorentz matrix of `boostA`. -/ -noncomputable def boostMatA : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => 17/8 - | Sum.inl _, Sum.inr 2 => -(15/8) - | Sum.inr 2, Sum.inl _ => -(15/8) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 17/8 - | _, _ => 0 - -/-- The Lorentz matrix of `boostB`. -/ -noncomputable def boostMatB : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => 41/9 - | Sum.inl _, Sum.inr 2 => -(40/9) - | Sum.inr 2, Sum.inl _ => -(40/9) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 41/9 - | _, _ => 0 - -set_option maxHeartbeats 2000000 in -/-- The Lorentz matrix of the first boost. -/ -lemma toLorentzGroup_boostA (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup boostA).1 a b = boostMatA a b := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostA, boostMatA, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try norm_num [Complex.ext_iff] - -set_option maxHeartbeats 2000000 in -/-- The Lorentz matrix of the second boost. -/ -lemma toLorentzGroup_boostB (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup boostB).1 a b = boostMatB a b := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostB, boostMatB, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try norm_num [Complex.ext_iff] - -/-- The inverse of the `z`-parity, entrywise. -/ -lemma parityZ_inv_coe : - (parityZ⁻¹ : SL(2,ℂ)).1 = !![-Complex.I, 0; 0, Complex.I] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [parityZ] - -/-- The inverse of the `y`-parity, entrywise. -/ -lemma parityY_inv_coe : - (parityY⁻¹ : SL(2,ℂ)).1 = !![0, -1; 1, 0] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [parityY] - -/-- The inverse of the `x`-parity, entrywise. -/ -lemma parityX_inv_coe : - (parityX⁻¹ : SL(2,ℂ)).1 = !![0, -Complex.I; -Complex.I, 0] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [parityX] - -/-- The inverse of the first boost, entrywise, with real entries. -/ -lemma boostA_inv_coe : - (boostA⁻¹ : SL(2,ℂ)).1 = !![((2⁻¹ : ℝ) : ℂ), 0; 0, ((2 : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostA] - -/-- The inverse of the second boost, entrywise, with real entries. -/ -lemma boostB_inv_coe : - (boostB⁻¹ : SL(2,ℂ)).1 = !![((3⁻¹ : ℝ) : ℂ), 0; 0, ((3 : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostB] - -/-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ -lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = - ∑ γ, ∑ δ, ((Λ⁻¹).1 α γ * star ((Λ⁻¹).1 β δ)) • - (Dbarψ [] γ * Dψ [] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] - simp only [hsm, hms, hsmul] - -/-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ -lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : - repLorentzGroup Λ (Dψ [] α * Dbarψ [] β) = - ∑ γ, ∑ δ, (star ((Λ⁻¹).1 α γ) * (Λ⁻¹).1 β δ) • - (Dψ [] γ * Dbarψ [] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] - simp only [hsm, hms, hsmul] - -/-! - -### The kill operator of the weight-six sector - --/ - -/-- The averaging operator over the Klein four-group of parity rotations. -/ -noncomputable def kleinAvg : Module.End ℂ JetAlgebra := - (4 : ℂ)⁻¹ • (LinearMap.id + repLorentzGroup parityZ + - repLorentzGroup parityY + repLorentzGroup parityX) - -/-- The boost-weighted Klein average: an operator fixing every - Lorentz-invariant vector and annihilating the neutral weight-six sector. - The weights `-13/24, 8/3, -9/8` sum to one and are chosen so that - `w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}` - respectively, killing both eigendirections of the two boosts. -/ -noncomputable def sixKill : Module.End ℂ JetAlgebra := - ((-13/24 : ℂ) • LinearMap.id + (8/3 : ℂ) • repLorentzGroup boostA + - (-9/8 : ℂ) • repLorentzGroup boostB) ∘ₗ kleinAvg - -/-- The Klein average, termwise. -/ -lemma kleinAvg_apply (v : JetAlgebra) : - kleinAvg v = (4 : ℂ)⁻¹ • (v + repLorentzGroup parityZ v + - repLorentzGroup parityY v + repLorentzGroup parityX v) := by - simp only [kleinAvg, LinearMap.smul_apply, LinearMap.add_apply, - LinearMap.id_apply] - -/-- The kill operator, termwise. -/ -lemma sixKill_apply (v : JetAlgebra) : - sixKill v = (-13/24 : ℂ) • kleinAvg v + - (8/3 : ℂ) • repLorentzGroup boostA (kleinAvg v) + - (-9/8 : ℂ) • repLorentzGroup boostB (kleinAvg v) := by - simp only [sixKill, LinearMap.comp_apply, LinearMap.add_apply, - LinearMap.smul_apply, LinearMap.id_apply] - -set_option maxHeartbeats 8000000 in -/-- The kill operator annihilates every embedded derivative field strength: - the Klein average kills every component with an odd index pattern, and the - boost combination kills the twelve surviving components. -/ -lemma sixKill_fieldStrengthDeriv_singleton (ρ μ ν : Fin 1 ⊕ Fin 3) : - sixKill (fieldStrengthDeriv {ρ} μ ν) = 0 := by - rcases eq_or_ne μ ν with rfl | hμν - · rw [fieldStrengthDeriv_self] - exact map_zero _ - · have hK : kleinAvg (fieldStrengthDeriv {ρ} μ ν) = - (((1 + paritySignZ ρ * (paritySignZ μ * paritySignZ ν) + - paritySignY ρ * (paritySignY μ * paritySignY ν) + - paritySignX ρ * (paritySignX μ * paritySignX ν)) / 4 : ℝ) : ℂ) • - fieldStrengthDeriv {ρ} μ ν := by - rw [kleinAvg_apply, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityZ, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityY, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_parityX] - push_cast - module - rw [sixKill_apply, hK, map_smul, map_smul] - rcases ρ with ρ | ρ <;> rcases μ with μ | μ <;> rcases ν with ν | ν <;> - fin_cases ρ <;> fin_cases μ <;> fin_cases ν <;> - first - | (simp only [fieldStrengthDeriv_self, map_zero, smul_zero, add_zero]; done) - | (norm_num [paritySignZ, paritySignY, paritySignX]; done) - | (norm_num [paritySignZ, paritySignY, paritySignX] - rw [repLorentzGroup_fieldStrengthDeriv_singleton boostA, - repLorentzGroup_fieldStrengthDeriv_singleton boostB] - simp only [Fintype.sum_sum_type, Fin.sum_univ_three, Fin.sum_univ_one, - toLorentzGroup_boostA, toLorentzGroup_boostB] - norm_num [boostMatA, boostMatB, fieldStrengthDeriv_self, - fieldStrengthDeriv_inr_inl] - push_cast - module) - -set_option maxHeartbeats 4000000 in -/-- The kill operator annihilates every zero-derivative pair `ψ̄_α ψ_β`: the - Klein average kills the off-diagonal pairs and symmetrises the diagonal - ones, which the boost combination then kills. -/ -lemma sixKill_Dbarψ_mul_Dψ (α β : Fin 2) : - sixKill (Dbarψ [] α * Dψ [] β) = 0 := by - rw [sixKill_apply, kleinAvg_apply] - fin_cases α <;> fin_cases β <;> - · simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, map_add, map_smul, - map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, - Fin.mk_one, Matrix.of_apply, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, - star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, - Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, - neg_neg, - zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, - Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] - try push_cast - try module - -set_option maxHeartbeats 4000000 in -/-- The kill operator annihilates every zero-derivative pair `ψ_α ψ̄_β`. -/ -lemma sixKill_Dψ_mul_Dbarψ (α β : Fin 2) : - sixKill (Dψ [] α * Dbarψ [] β) = 0 := by - rw [sixKill_apply, kleinAvg_apply] - fin_cases α <;> fin_cases β <;> - · simp only [repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, map_add, map_smul, - map_sum, parityZ_inv_coe, parityY_inv_coe, parityX_inv_coe, - boostA_inv_coe, boostB_inv_coe, Fin.sum_univ_two, Fin.zero_eta, - Fin.mk_one, Matrix.of_apply, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, - star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, - Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, - neg_neg, - zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, - Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] - try push_cast - try module - -/-- No Lorentz invariant of mass weight six: an invariant combination of the - field-strength derivatives `∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β` - vanishes. -/ -lemma eq_zero_of_mem_chargeCovSpan_six {y : JetAlgebra} - (hy : y ∈ chargeCovSpan 6 0) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by - have h := chargeCovSpan_six_le hy - rw [Submodule.span_union, Submodule.span_union] at h - obtain ⟨u, hu, w, hw, hy'⟩ := Submodule.mem_sup.mp h - obtain ⟨u1, hu1, u2, hu2, hu'⟩ := Submodule.mem_sup.mp hu - obtain ⟨a, ha⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu1 - obtain ⟨d, hd⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu2 - obtain ⟨e, he⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw - have hKy : kleinAvg y = y := by - rw [kleinAvg_apply, hinv parityZ, hinv parityY, hinv parityX] - module - have hself : sixKill y = y := by - rw [sixKill_apply, hKy, hinv boostA, hinv boostB] - module - have hkill : sixKill y = 0 := by - rw [← hy', ← hu', ← ha, ← hd, ← he] - simp only [map_add, map_sum, map_smul, sixKill_fieldStrengthDeriv_singleton, - sixKill_Dbarψ_mul_Dψ, sixKill_Dψ_mul_Dbarψ, smul_zero, - Finset.sum_const_zero, add_zero] - exact hself.symm.trans hkill - -/-! - -### The transformation law of the second-derivative field strength - --/ - -set_option maxHeartbeats 2000000 in -/-- The transformation law of the embedded second-derivative field strength: - a four-index tensor, all indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) - (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) = - ∑ r, ∑ s, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) : ℝ)) : ℂ) • - fieldStrengthDeriv {r, s} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] - -end JetAlgebra - -end QED diff --git a/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean b/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean deleted file mode 100644 index ed6d3d5e2..000000000 --- a/Physlib/Particles/QED/JetAlgebra/Invariants/SymmetrisedAverage.lean +++ /dev/null @@ -1,733 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.QED.JetAlgebra.Invariants.BoostFermionPairs -/-! -# The symmetrised boost average - -A rational combination of the paired boosts at `t = 2, 3, 4` together with the -identity (`boostProjZ`, `boostProjX`, `boostProjY`) realises the single-axis -boost averages, and their mean `opS` fixes every Lorentz-invariant vector -while acting on the weight-eight monomials by an explicit rational matrix (the -`opS_*` lemmas). --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace QED -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The `Z`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the Klein-restricted single-axis - average on the weight-eight sector. -/ -noncomputable def boostProjZ : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + - repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + - repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + - repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) - -/-- The `X`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the Klein-restricted single-axis - average on the weight-eight sector. -/ -noncomputable def boostProjX : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + - repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + - repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + - repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) - -/-- The `Y`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the Klein-restricted single-axis - average on the weight-eight sector. -/ -noncomputable def boostProjY : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + - repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + - repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + - repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) - -/-- The symmetrised boost average over the three axes. -/ -noncomputable def opS : Module.End ℂ JetAlgebra := - (3⁻¹ : ℂ) • (boostProjZ + boostProjX + boostProjY) - -/-- The operator `opS` fixes every Lorentz-invariant vector: each boost term - fixes it and the weights sum to one. -/ -lemma opS_apply_of_invariant {y : JetAlgebra} - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opS y = y := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply, hinv] - match_scalars - norm_num - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F01 * F01`. -/ -lemma opS_F01_F01 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F01_F01 2 (by norm_num), - pairZ_F01_F01 3 (by norm_num), - pairZ_F01_F01 4 (by norm_num), - pairX_F01_F01 2 (by norm_num), - pairX_F01_F01 3 (by norm_num), - pairX_F01_F01 4 (by norm_num), - pairY_F01_F01 2 (by norm_num), - pairY_F01_F01 3 (by norm_num), - pairY_F01_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F01 * F23`. -/ -lemma opS_F01_F23 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F01_F23 2 (by norm_num), - pairZ_F01_F23 3 (by norm_num), - pairZ_F01_F23 4 (by norm_num), - pairX_F01_F23 2 (by norm_num), - pairX_F01_F23 3 (by norm_num), - pairX_F01_F23 4 (by norm_num), - pairY_F01_F23 2 (by norm_num), - pairY_F01_F23 3 (by norm_num), - pairY_F01_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F02 * F02`. -/ -lemma opS_F02_F02 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F02_F02 2 (by norm_num), - pairZ_F02_F02 3 (by norm_num), - pairZ_F02_F02 4 (by norm_num), - pairX_F02_F02 2 (by norm_num), - pairX_F02_F02 3 (by norm_num), - pairX_F02_F02 4 (by norm_num), - pairY_F02_F02 2 (by norm_num), - pairY_F02_F02 3 (by norm_num), - pairY_F02_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F02 * F13`. -/ -lemma opS_F02_F13 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F02_F13 2 (by norm_num), - pairZ_F02_F13 3 (by norm_num), - pairZ_F02_F13 4 (by norm_num), - pairX_F02_F13 2 (by norm_num), - pairX_F02_F13 3 (by norm_num), - pairX_F02_F13 4 (by norm_num), - pairY_F02_F13 2 (by norm_num), - pairY_F02_F13 3 (by norm_num), - pairY_F02_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F03 * F03`. -/ -lemma opS_F03_F03 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F03_F03 2 (by norm_num), - pairZ_F03_F03 3 (by norm_num), - pairZ_F03_F03 4 (by norm_num), - pairX_F03_F03 2 (by norm_num), - pairX_F03_F03 3 (by norm_num), - pairX_F03_F03 4 (by norm_num), - pairY_F03_F03 2 (by norm_num), - pairY_F03_F03 3 (by norm_num), - pairY_F03_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F03 * F12`. -/ -lemma opS_F03_F12 : - opS (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F03_F12 2 (by norm_num), - pairZ_F03_F12 3 (by norm_num), - pairZ_F03_F12 4 (by norm_num), - pairX_F03_F12 2 (by norm_num), - pairX_F03_F12 3 (by norm_num), - pairX_F03_F12 4 (by norm_num), - pairY_F03_F12 2 (by norm_num), - pairY_F03_F12 3 (by norm_num), - pairY_F03_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F12 * F12`. -/ -lemma opS_F12_F12 : - opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F12_F12 2 (by norm_num), - pairZ_F12_F12 3 (by norm_num), - pairZ_F12_F12 4 (by norm_num), - pairX_F12_F12 2 (by norm_num), - pairX_F12_F12 3 (by norm_num), - pairX_F12_F12 4 (by norm_num), - pairY_F12_F12 2 (by norm_num), - pairY_F12_F12 3 (by norm_num), - pairY_F12_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F13 * F13`. -/ -lemma opS_F13_F13 : - opS (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F13_F13 2 (by norm_num), - pairZ_F13_F13 3 (by norm_num), - pairZ_F13_F13 4 (by norm_num), - pairX_F13_F13 2 (by norm_num), - pairX_F13_F13 3 (by norm_num), - pairX_F13_F13 4 (by norm_num), - pairY_F13_F13 2 (by norm_num), - pairY_F13_F13 3 (by norm_num), - pairY_F13_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `F23 * F23`. -/ -lemma opS_F23_F23 : - opS (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_F23_F23 2 (by norm_num), - pairZ_F23_F23 3 (by norm_num), - pairZ_F23_F23 4 (by norm_num), - pairX_F23_F23 2 (by norm_num), - pairX_F23_F23 3 (by norm_num), - pairX_F23_F23 4 (by norm_num), - pairY_F23_F23 2 (by norm_num), - pairY_F23_F23 3 (by norm_num), - pairY_F23_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma opS_dd01_F01 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd01_F01 2 (by norm_num), - pairZ_dd01_F01 3 (by norm_num), - pairZ_dd01_F01 4 (by norm_num), - pairX_dd01_F01 2 (by norm_num), - pairX_dd01_F01 3 (by norm_num), - pairX_dd01_F01 4 (by norm_num), - pairY_dd01_F01 2 (by norm_num), - pairY_dd01_F01 3 (by norm_num), - pairY_dd01_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma opS_dd01_F23 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd01_F23 2 (by norm_num), - pairZ_dd01_F23 3 (by norm_num), - pairZ_dd01_F23 4 (by norm_num), - pairX_dd01_F23 2 (by norm_num), - pairX_dd01_F23 3 (by norm_num), - pairX_dd01_F23 4 (by norm_num), - pairY_dd01_F23 2 (by norm_num), - pairY_dd01_F23 3 (by norm_num), - pairY_dd01_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma opS_dd02_F02 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd02_F02 2 (by norm_num), - pairZ_dd02_F02 3 (by norm_num), - pairZ_dd02_F02 4 (by norm_num), - pairX_dd02_F02 2 (by norm_num), - pairX_dd02_F02 3 (by norm_num), - pairX_dd02_F02 4 (by norm_num), - pairY_dd02_F02 2 (by norm_num), - pairY_dd02_F02 3 (by norm_num), - pairY_dd02_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma opS_dd02_F13 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd02_F13 2 (by norm_num), - pairZ_dd02_F13 3 (by norm_num), - pairZ_dd02_F13 4 (by norm_num), - pairX_dd02_F13 2 (by norm_num), - pairX_dd02_F13 3 (by norm_num), - pairX_dd02_F13 4 (by norm_num), - pairY_dd02_F13 2 (by norm_num), - pairY_dd02_F13 3 (by norm_num), - pairY_dd02_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma opS_dd03_F03 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd03_F03 2 (by norm_num), - pairZ_dd03_F03 3 (by norm_num), - pairZ_dd03_F03 4 (by norm_num), - pairX_dd03_F03 2 (by norm_num), - pairX_dd03_F03 3 (by norm_num), - pairX_dd03_F03 4 (by norm_num), - pairY_dd03_F03 2 (by norm_num), - pairY_dd03_F03 3 (by norm_num), - pairY_dd03_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma opS_dd03_F12 : - opS (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd03_F12 2 (by norm_num), - pairZ_dd03_F12 3 (by norm_num), - pairZ_dd03_F12 4 (by norm_num), - pairX_dd03_F12 2 (by norm_num), - pairX_dd03_F12 3 (by norm_num), - pairX_dd03_F12 4 (by norm_num), - pairY_dd03_F12 2 (by norm_num), - pairY_dd03_F12 3 (by norm_num), - pairY_dd03_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma opS_dd12_F03 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd12_F03 2 (by norm_num), - pairZ_dd12_F03 3 (by norm_num), - pairZ_dd12_F03 4 (by norm_num), - pairX_dd12_F03 2 (by norm_num), - pairX_dd12_F03 3 (by norm_num), - pairX_dd12_F03 4 (by norm_num), - pairY_dd12_F03 2 (by norm_num), - pairY_dd12_F03 3 (by norm_num), - pairY_dd12_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma opS_dd12_F12 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd12_F12 2 (by norm_num), - pairZ_dd12_F12 3 (by norm_num), - pairZ_dd12_F12 4 (by norm_num), - pairX_dd12_F12 2 (by norm_num), - pairX_dd12_F12 3 (by norm_num), - pairX_dd12_F12 4 (by norm_num), - pairY_dd12_F12 2 (by norm_num), - pairY_dd12_F12 3 (by norm_num), - pairY_dd12_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma opS_dd13_F02 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd13_F02 2 (by norm_num), - pairZ_dd13_F02 3 (by norm_num), - pairZ_dd13_F02 4 (by norm_num), - pairX_dd13_F02 2 (by norm_num), - pairX_dd13_F02 3 (by norm_num), - pairX_dd13_F02 4 (by norm_num), - pairY_dd13_F02 2 (by norm_num), - pairY_dd13_F02 3 (by norm_num), - pairY_dd13_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma opS_dd13_F13 : - opS (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd13_F13 2 (by norm_num), - pairZ_dd13_F13 3 (by norm_num), - pairZ_dd13_F13 4 (by norm_num), - pairX_dd13_F13 2 (by norm_num), - pairX_dd13_F13 3 (by norm_num), - pairX_dd13_F13 4 (by norm_num), - pairY_dd13_F13 2 (by norm_num), - pairY_dd13_F13 3 (by norm_num), - pairY_dd13_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma opS_dd23_F01 : - opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd23_F01 2 (by norm_num), - pairZ_dd23_F01 3 (by norm_num), - pairZ_dd23_F01 4 (by norm_num), - pairX_dd23_F01 2 (by norm_num), - pairX_dd23_F01 3 (by norm_num), - pairX_dd23_F01 4 (by norm_num), - pairY_dd23_F01 2 (by norm_num), - pairY_dd23_F01 3 (by norm_num), - pairY_dd23_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma opS_dd23_F23 : - opS (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_dd23_F23 2 (by norm_num), - pairZ_dd23_F23 3 (by norm_num), - pairZ_dd23_F23 4 (by norm_num), - pairX_dd23_F23 2 (by norm_num), - pairX_dd23_F23 3 (by norm_num), - pairX_dd23_F23 4 (by norm_num), - pairY_dd23_F23 2 (by norm_num), - pairY_dd23_F23 3 (by norm_num), - pairY_dd23_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u0`. -/ -lemma opS_u0 : - opS (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - + (-(Complex.I/6)) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u0 2 (by norm_num), - pairZ_u0 3 (by norm_num), - pairZ_u0 4 (by norm_num), - pairX_u0 2 (by norm_num), - pairX_u0 3 (by norm_num), - pairX_u0 4 (by norm_num), - pairY_u0 2 (by norm_num), - pairY_u0 3 (by norm_num), - pairY_u0 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u1`. -/ -lemma opS_u1 : - opS (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u1 2 (by norm_num), - pairZ_u1 3 (by norm_num), - pairZ_u1 4 (by norm_num), - pairX_u1 2 (by norm_num), - pairX_u1 3 (by norm_num), - pairX_u1 4 (by norm_num), - pairY_u1 2 (by norm_num), - pairY_u1 3 (by norm_num), - pairY_u1 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u2`. -/ -lemma opS_u2 : - opS (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - + (Complex.I/6) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u2 2 (by norm_num), - pairZ_u2 3 (by norm_num), - pairZ_u2 4 (by norm_num), - pairX_u2 2 (by norm_num), - pairX_u2 3 (by norm_num), - pairX_u2 4 (by norm_num), - pairY_u2 2 (by norm_num), - pairY_u2 3 (by norm_num), - pairY_u2 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `u3`. -/ -lemma opS_u3 : - opS (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_u3 2 (by norm_num), - pairZ_u3 3 (by norm_num), - pairZ_u3 4 (by norm_num), - pairX_u3 2 (by norm_num), - pairX_u3 3 (by norm_num), - pairX_u3 4 (by norm_num), - pairY_u3 2 (by norm_num), - pairY_u3 3 (by norm_num), - pairY_u3 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar0`. -/ -lemma opS_ubar0 : - opS (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - + (-(Complex.I/6)) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar0 2 (by norm_num), - pairZ_ubar0 3 (by norm_num), - pairZ_ubar0 4 (by norm_num), - pairX_ubar0 2 (by norm_num), - pairX_ubar0 3 (by norm_num), - pairX_ubar0 4 (by norm_num), - pairY_ubar0 2 (by norm_num), - pairY_ubar0 3 (by norm_num), - pairY_ubar0 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar1`. -/ -lemma opS_ubar1 : - opS (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar1 2 (by norm_num), - pairZ_ubar1 3 (by norm_num), - pairZ_ubar1 4 (by norm_num), - pairX_ubar1 2 (by norm_num), - pairX_ubar1 3 (by norm_num), - pairX_ubar1 4 (by norm_num), - pairY_ubar1 2 (by norm_num), - pairY_ubar1 3 (by norm_num), - pairY_ubar1 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar2`. -/ -lemma opS_ubar2 : - opS (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - + (Complex.I/6) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar2 2 (by norm_num), - pairZ_ubar2 3 (by norm_num), - pairZ_ubar2 4 (by norm_num), - pairX_ubar2 2 (by norm_num), - pairX_ubar2 3 (by norm_num), - pairX_ubar2 4 (by norm_num), - pairY_ubar2 2 (by norm_num), - pairY_ubar2 3 (by norm_num), - pairY_ubar2 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in -/-- The boost average `opS` on the σ-contracted fermion pair `ubar3`. -/ -lemma opS_ubar3 : - opS (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [opS, boostProjZ, boostProjX, boostProjY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [pairZ_ubar3 2 (by norm_num), - pairZ_ubar3 3 (by norm_num), - pairZ_ubar3 4 (by norm_num), - pairX_ubar3 2 (by norm_num), - pairX_ubar3 3 (by norm_num), - pairX_ubar3 4 (by norm_num), - pairY_ubar3 2 (by norm_num), - pairY_ubar3 3 (by norm_num), - pairY_ubar3 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -/-! - -### The projector polynomial and the weight-eight endgame - --/ - -/-- The quintic projector polynomial in the symmetrised boost average `opS`: - the unique degree-five polynomial with value one at the invariant eigenvalue - and vanishing on the remaining boost eigenvalues of the weight-eight Klein - sector. -/ -noncomputable def opPi : Module.End ℂ JetAlgebra := - (-1 : ℂ) • (1 : Module.End ℂ JetAlgebra) + (137/10 : ℂ) • opS - + (-(135/2) : ℂ) • (opS * opS) + (153 : ℂ) • (opS * opS * opS) - + (-162 : ℂ) • (opS * opS * opS * opS) - + (324/5 : ℂ) • (opS * opS * opS * opS * opS) - -/-- The projector polynomial, termwise. -/ -lemma opPi_apply (v : JetAlgebra) : - opPi v = (-1 : ℂ) • v + (137/10 : ℂ) • opS v - + (-(135/2) : ℂ) • opS (opS v) + (153 : ℂ) • opS (opS (opS v)) - + (-162 : ℂ) • opS (opS (opS (opS v))) - + (324/5 : ℂ) • opS (opS (opS (opS (opS v)))) := by - simp only [opPi, LinearMap.add_apply, LinearMap.smul_apply, Module.End.one_apply, - Module.End.mul_apply] - -/-- The projector fixes every Lorentz-invariant vector: `opS` fixes it and the - coefficients sum to one. -/ -lemma opPi_apply_of_invariant {y : JetAlgebra} - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : opPi y = y := by - have hS : opS y = y := opS_apply_of_invariant hinv - rw [opPi_apply] - simp only [hS] - match_scalars - norm_num -end JetAlgebra - -end QED diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index 96840caa6..d7a035551 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -1418,7 +1418,7 @@ derivative of the hypercharge character produced by `∂_μ` acting on the transformed `ψ`, and at higher orders the iterated derivatives of the gauge parameter on both sides are matched precisely by the anomaly operators built from `mcDeriv`, which annihilate the covariant derivatives (see -`QED.JetAlgebra`). +`LeptonGaugeSector.JetAlgebra`). ### Two orders: transforming then differentiating, and the reverse @@ -1547,13 +1547,13 @@ organises them. ### Where the two meet -Both readings appear together in the Maurer–Cartan anomaly operators of the QED -jet algebra (`QED.JetAlgebra.anomalyM`): `mcDeriv` from the gauge-field +Both readings appear together in the Maurer–Cartan anomaly operators of the lepton–gauge-sector +jet algebra (`LeptonGaugeSector.JetAlgebra.anomalyM`): `mcDeriv` from the gauge-field coordinates, `mcShift` from the `c B_ν` term of the covariant step, and `mcShiftSeries` from the matter coordinates. Covariance is the statement that these cancel, and at the base point the cancellation is term-for-term between `c · mcShift` and `c · constantCoeff (mcShiftSeries)` -(`QED.JetAlgebra.anomalyM_baseM`) — which is an identity of syntax, not of +(`LeptonGaugeSector.JetAlgebra.anomalyM_baseM`) — which is an identity of syntax, not of computation, precisely because the two carry the same sign. -/ From 7e9f8ba8f055bbff37ecc6f55bd1bb74bcbd9dec Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 09:16:53 +0100 Subject: [PATCH 115/254] feat: Mass dimension --- Physlib.lean | 1 + Physlib/Mathematics/PolynomialEval.lean | 193 +++++ .../JetAlgebra/JetDeriv.lean | 6 + .../LeptonGaugeSector/JetAlgebra/MassDim.lean | 750 ++++++++++++------ .../LeptonSinglet/JetAlgebra/MassDim.lean | 67 ++ .../GaugeBosons/BBoson/MassDim.lean | 78 ++ 6 files changed, 874 insertions(+), 221 deletions(-) create mode 100644 Physlib/Mathematics/PolynomialEval.lean diff --git a/Physlib.lean b/Physlib.lean index 93882c844..824f76dd3 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -125,6 +125,7 @@ public import Physlib.Mathematics.MvPolynomialTranslation public import Physlib.Mathematics.MvPowerSeriesDerivative public import Physlib.Mathematics.OrthogonalMatrix public import Physlib.Mathematics.PiTensorProduct +public import Physlib.Mathematics.PolynomialEval public import Physlib.Mathematics.RatComplexNum public import Physlib.Mathematics.Resolvent public import Physlib.Mathematics.SO3.Basic diff --git a/Physlib/Mathematics/PolynomialEval.lean b/Physlib/Mathematics/PolynomialEval.lean new file mode 100644 index 000000000..ec41d0f19 --- /dev/null +++ b/Physlib/Mathematics/PolynomialEval.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 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 Mathlib.LinearAlgebra.Dual.Lemmas +public import Mathlib.Algebra.Polynomial.AlgebraMap +public import Mathlib.Algebra.Polynomial.Roots +/-! + +# Polynomials with coefficients in an algebra + +## i. Overview + +A polynomial whose coefficients lie in a `k`-algebra `A` can be evaluated at the image +`algebraMap k A c` of a scalar. This file records that such a polynomial is determined by +those evaluations alone, when `k` is an infinite field, and defines the polynomial obtained +by applying a `k`-linear map to every coefficient. + +Both are used to transport grading statements between two equivalent descriptions of a +grading on a jet algebra: the *mass-weight polynomial*, whose `X ^ n` coefficient is the +weight-`n` part of an element, and the *mass-weight scaling*, the algebra map scaling each +weight-`n` part by `c ^ n`. The scaling is the evaluation of the polynomial, so a statement +about one transfers to the other. + +The determinacy is not an instance of `Polynomial.funext`: the coefficient ring `A` is +neither commutative nor a domain in the intended applications. It holds because `A` is a +`k`-vector space, so its elements are separated by linear functionals, and a polynomial over +the infinite field `k` is determined by its values. + +## ii. Key results + +- `Polynomial.eq_zero_of_forall_eval_algebraMap_eq_zero` : a polynomial vanishing at every + scalar is zero. +- `Polynomial.ext_of_forall_eval_algebraMap` : two polynomials agreeing at every scalar are + equal. +- `Polynomial.mapCoeffs` : apply a linear map to every coefficient. +- `Polynomial.eval_algebraMap_mapCoeffs` : evaluation commutes with `mapCoeffs`. + +## iii. Table of contents + +- A. Determinacy by evaluation at scalars +- B. Applying a linear map to the coefficients + +-/ + +@[expose] public section + +namespace Polynomial + +/-! + +## A. Determinacy by evaluation at scalars + +-/ + +/-- A polynomial with coefficients in an algebra over an infinite field vanishes as soon as + it vanishes at the image of every scalar. Linear functionals separate the coefficients, + and over an infinite field a polynomial is determined by its values. -/ +lemma eq_zero_of_forall_eval_algebraMap_eq_zero {k A : Type*} [Field k] [Infinite k] + [Ring A] [Algebra k A] {p : Polynomial A} + (h : ∀ c : k, p.eval (algebraMap k A c) = 0) : p = 0 := by + ext n + rw [Polynomial.coeff_zero, ← Module.forall_dual_apply_eq_zero_iff k] + intro φ + set s : Polynomial k := ∑ m ∈ p.support, Polynomial.monomial m (φ (p.coeff m)) with hs + have hcoeff : ∀ m, s.coeff m = φ (p.coeff m) := by + intro m + rw [hs, Polynomial.finsetSum_coeff] + simp only [Polynomial.coeff_monomial] + rw [Finset.sum_ite_eq' p.support m fun i => φ (p.coeff i)] + by_cases hm : m ∈ p.support + · rw [if_pos hm] + · rw [if_neg hm, Polynomial.notMem_support_iff.mp hm, map_zero] + have hzero : s = 0 := by + refine Polynomial.funext fun c => ?_ + have h1 := congrArg φ (h c) + rw [Polynomial.eval_eq_sum, Polynomial.sum_def, map_sum, map_zero] at h1 + rw [Polynomial.eval_zero, hs, Polynomial.eval_finsetSum] + simp only [Polynomial.eval_monomial] + rw [← h1] + refine Finset.sum_congr rfl fun m _ => ?_ + rw [← map_pow, ← Algebra.commutes, ← Algebra.smul_def, map_smul, smul_eq_mul, mul_comm] + rw [← hcoeff n, hzero, Polynomial.coeff_zero] + +/-- Two polynomials with coefficients in an algebra over an infinite field are equal as soon + as they agree at the image of every scalar. -/ +lemma ext_of_forall_eval_algebraMap {k A : Type*} [Field k] [Infinite k] + [Ring A] [Algebra k A] {p q : Polynomial A} + (h : ∀ c : k, p.eval (algebraMap k A c) = q.eval (algebraMap k A c)) : p = q := by + rw [← sub_eq_zero] + refine eq_zero_of_forall_eval_algebraMap_eq_zero (k := k) fun c => ?_ + rw [Polynomial.eval_sub, h c, sub_self] + +/-! + +## B. Applying a linear map to the coefficients + +-/ + +/-- The polynomial obtained by applying a function to every coefficient. Unlike + `Polynomial.map` this needs no multiplicativity, so it applies to derivations. + + The argument is a bare function rather than a linear map: on an algebra built as a tensor + product the module structure coming from the algebra and the one coming from the tensor + product are equal but not syntactically so, and bundling would force the caller to + reconcile them. The properties needed are taken as hypotheses instead. -/ +noncomputable def mapCoeffs {A : Type*} [Semiring A] (f : A → A) (p : Polynomial A) : + Polynomial A := + ∑ m ∈ p.support, Polynomial.monomial m (f (p.coeff m)) + +lemma coeff_mapCoeffs {A : Type*} [Semiring A] {f : A → A} (hf0 : f 0 = 0) + (p : Polynomial A) (n : ℕ) : (mapCoeffs f p).coeff n = f (p.coeff n) := by + rw [mapCoeffs, Polynomial.finsetSum_coeff] + simp only [Polynomial.coeff_monomial] + rw [Finset.sum_ite_eq' p.support n fun i => f (p.coeff i)] + by_cases hn : n ∈ p.support + · rw [if_pos hn] + · rw [if_neg hn, Polynomial.notMem_support_iff.mp hn, hf0] + +lemma mapCoeffs_monomial {A : Type*} [Semiring A] {f : A → A} (hf0 : f 0 = 0) + (n : ℕ) (a : A) : + mapCoeffs f (Polynomial.monomial n a) = Polynomial.monomial n (f a) := by + ext m + rw [coeff_mapCoeffs hf0, Polynomial.coeff_monomial, Polynomial.coeff_monomial] + split_ifs + · rfl + · exact hf0 + +lemma mapCoeffs_add {A : Type*} [Semiring A] {f : A → A} (hf0 : f 0 = 0) + (hadd : ∀ a b : A, f (a + b) = f a + f b) (p q : Polynomial A) : + mapCoeffs f (p + q) = mapCoeffs f p + mapCoeffs f q := by + ext m + rw [coeff_mapCoeffs hf0, Polynomial.coeff_add, Polynomial.coeff_add, coeff_mapCoeffs hf0, + coeff_mapCoeffs hf0, hadd] + +/-- Evaluation at a scalar commutes with pushing a polynomial along an algebra map: an + algebra map fixes the scalars. -/ +lemma eval_algebraMap_mapAlgHom {k A B : Type*} [CommSemiring k] [Semiring A] [Semiring B] + [Algebra k A] [Algebra k B] (f : A →ₐ[k] B) (p : Polynomial A) (c : k) : + (Polynomial.mapAlgHom f p).eval (algebraMap k B c) = f (p.eval (algebraMap k A c)) := by + induction p using Polynomial.induction_on' with + | add p q hp hq => rw [map_add, Polynomial.eval_add, Polynomial.eval_add, hp, hq, map_add] + | monomial n a => + simp only [Polynomial.mapAlgHom, AlgHom.coe_mk, Polynomial.coe_mapRingHom, + Polynomial.map_monomial] + rw [Polynomial.eval_monomial, Polynomial.eval_monomial, map_mul, map_pow, + AlgHom.commutes] + rfl + +/-- Evaluation at a scalar commutes with applying a linear map to the coefficients: the + powers of the scalar are central, so they pass through the linear map. -/ +lemma eval_algebraMap_mapCoeffs {k A : Type*} [Field k] [Ring A] [Algebra k A] + (f : A →ₗ[k] A) (p : Polynomial A) (c : k) : + (mapCoeffs f p).eval (algebraMap k A c) = f (p.eval (algebraMap k A c)) := by + have hsmul : ∀ (m : ℕ) (a : A), a * (algebraMap k A c) ^ m = (c ^ m) • a := fun m a => by + rw [← map_pow, ← Algebra.commutes, ← Algebra.smul_def] + induction p using Polynomial.induction_on' with + | add p q hp hq => + rw [mapCoeffs_add (map_zero f) (map_add f), Polynomial.eval_add, Polynomial.eval_add, + hp, hq, map_add] + | monomial n a => + rw [mapCoeffs_monomial (map_zero f), Polynomial.eval_monomial, Polynomial.eval_monomial, + hsmul, hsmul, map_smul] + +/-- Evaluation at one commutes with pushing a polynomial along an algebra map. -/ +lemma eval_one_mapAlgHom {k A B : Type*} [CommSemiring k] [Semiring A] [Semiring B] + [Algebra k A] [Algebra k B] (f : A →ₐ[k] B) (p : Polynomial A) : + (Polynomial.mapAlgHom f p).eval 1 = f (p.eval 1) := by + have h := eval_algebraMap_mapAlgHom f p 1 + rwa [map_one, map_one] at h + +/-- A map satisfying the Leibniz rule satisfies it coefficientwise on polynomials. Applied to + a total derivative this is the Leibniz rule for the mass-weight polynomial. -/ +lemma mapCoeffs_mul_of_leibniz {A : Type*} [Ring A] {D : A → A} (hD0 : D 0 = 0) + (hDadd : ∀ a b : A, D (a + b) = D a + D b) + (hD : ∀ a b : A, D (a * b) = D a * b + a * D b) (p q : Polynomial A) : + mapCoeffs D (p * q) = mapCoeffs D p * q + p * mapCoeffs D q := by + have hsum : ∀ (s : Finset (ℕ × ℕ)) (g : ℕ × ℕ → A), + D (∑ m ∈ s, g m) = ∑ m ∈ s, D (g m) := by + intro s g + induction s using Finset.induction with + | empty => simpa using hD0 + | insert a s ha ih => rw [Finset.sum_insert ha, hDadd, ih, Finset.sum_insert ha] + ext n + rw [coeff_mapCoeffs hD0, Polynomial.coeff_add, Polynomial.coeff_mul, Polynomial.coeff_mul, + Polynomial.coeff_mul, hsum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun m _ => ?_ + rw [hD, coeff_mapCoeffs hD0, coeff_mapCoeffs hD0] + +end Polynomial diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean index 06d0e2403..26ac55f54 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean @@ -100,6 +100,12 @@ instance : LeftCommutative simp only [LinearMap.coe_comp, Function.comp_apply] exact jetDeriv_comm ν₁ ν₂ (A x) +/-! + +## Jet derivatives over a multiset. + + +-/ /-- The iterated total spacetime derivative along a multiset of directions: `∂_t = ∂_{μ₁} ⋯ ∂_{μ_k}` for `t = {μ₁, …, μ_k}`. The order is immaterial by `jetDeriv_comm`, so the index is a multiset. -/ diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean index 6c53a0c9d..c6768cb3f 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean @@ -9,6 +9,7 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.MassDim +public import Physlib.Mathematics.PolynomialEval /-! # Mass dimension on the lepton–gauge-sector jet algebra @@ -16,10 +17,23 @@ public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.MassDim 'mass weight' is twice the mass dimension. This is because it is easier to work exclusively with integers, and the mass dimension of the fermion fields is 3/2. +The grading is carried by the *mass-weight polynomial*: the algebra map sending each generator +`j` to `X ^ w * j`, where `w` is its mass weight. The coefficient of `X ^ n` in the mass-weight +polynomial of an element is its part of mass weight `n`, so an element is homogeneous of weight +`n` exactly when its mass-weight polynomial is `X ^ n` times itself, which is the condition +defining `massWeightSubmodule`. + +The jet algebra is the tensor product of the two factors and mass weights add under that +product, so the mass-weight polynomial of the whole is assembled from the two factor +polynomials: push each into `Polynomial JetAlgebra` along the tensor inclusions and multiply. +On monomials this is exactly `X ^ a * b ⊗ X ^ c * l ↦ X ^ (a + c) * (b ⊗ l)`. + -/ @[expose] public section +set_option maxHeartbeats 1000000 + namespace LeptonGaugeSector open TensorProduct StandardModel Matrix MatrixGroups @@ -33,264 +47,558 @@ namespace JetAlgebra /-! -## A. The massWeightScaling algebra homomorphism +## A. The mass-weight polynomial -/ -/-- The mass-dimension scaling on the lepton–gauge-sector jet algebra: the algebra map - multiplying each generator by `c ^ w`, where `w` is twice its mass dimension. - It is the tensor product of the scalings on the B-boson and charged-lepton - jet algebras. -/ -noncomputable def massWeightScale (c : ℂ) : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.map (BBoson.JetAlgebra.massWeightScale c) - (LeptonSinglet.JetAlgebra.massWeightScale c) - -/-- The mass-dimension scaling on a pure tensor. -/ -lemma massWeightScale_tmul (c : ℂ) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - massWeightScale c (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.massWeightScale c p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.massWeightScale c l) := - Algebra.TensorProduct.map_tmul _ _ _ _ - -/-- Each generator scales by `c` to the power of its mass weight. -/ -lemma massWeightScale_ofGenerator (c : ℂ) (j : JetGenerators) : - massWeightScale c [j]ₐ = c ^ MassWeight j • [j]ₐ := by + +/-- The mass-weight polynomial on the lepton–gauge-sector jet algebra, assembled from the + mass-weight polynomials of the two factors. -/ +noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + (Algebra.TensorProduct.lift (Polynomial.mapAlgHom inclB) + (Polynomial.mapAlgHom inclL) commute_mapAlgHom_inclB_inclL).comp + (Algebra.TensorProduct.map BBoson.JetAlgebra.massWeightPoly + LeptonSinglet.JetAlgebra.massWeightPoly) + +@[simp] +lemma massWeightPoly_tmul (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : + massWeightPoly (b ⊗ₜ[ℂ] l) = + Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) * + Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := rfl + +/-- On the bosonic factor the mass-weight polynomial is the B-boson mass-weight polynomial + pushed along the inclusion. -/ +lemma massWeightPoly_inclB (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + massWeightPoly (inclB b) = + Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) := by + rw [show inclB b = b ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, massWeightPoly_tmul, + map_one, map_one, mul_one] + +/-- On the fermionic factor the mass-weight polynomial is the charged-lepton mass-weight + polynomial pushed along the inclusion. -/ +lemma massWeightPoly_inclL (l : LeptonSinglet.JetAlgebra) : + massWeightPoly (inclL l) = + Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := by + rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l from rfl, massWeightPoly_tmul, + map_one, map_one, one_mul] + +/-- The bosonic inclusion is unital. -/ +private lemma inclB_one : inclB (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := rfl + +/-- The fermionic inclusion is unital. -/ +private lemma inclL_one : inclL (1 : LeptonSinglet.JetAlgebra) = 1 := rfl + +/-- A pure tensor is the product of the images of its two factors. -/ +lemma tmul_eq_inclB_mul_inclL (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : b ⊗ₜ[ℂ] l = inclB b * inclL l := by + rw [show inclB b = b ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, + show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l from rfl, + Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + +/-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ +@[simp] +lemma massWeightPoly_ofGenerator (j : JetGenerators) : + massWeightPoly [j]ₐ = Polynomial.monomial (MassWeight j) [j]ₐ := by cases j with | dB s μ => - simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, map_one, - BBoson.JetAlgebra.massWeightScale_tmul_ofGenerator, ← TensorProduct.smul_tmul'] + rw [show ([JetGenerators.dB s μ]ₐ : JetAlgebra) = inclB ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) from rfl, + massWeightPoly_inclB, BBoson.JetAlgebra.massWeightPoly_ofGenerator, + Polynomial.mapAlgHom_monomial] rfl | dψ s α => - simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, - ← Algebra.TensorProduct.one_def, map_one, - LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] + rw [show ([JetGenerators.dψ s α]ₐ : JetAlgebra) = inclL + (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α)) from rfl, + massWeightPoly_inclL, LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, + Polynomial.mapAlgHom_monomial] rfl | dbarψ s α => - simp only [ofGenerator, massWeightScale, Algebra.TensorProduct.map_tmul, - ← Algebra.TensorProduct.one_def, map_one, - LeptonSinglet.JetAlgebra.massWeightScale_ofGenerator, TensorProduct.tmul_smul] + rw [show ([JetGenerators.dbarψ s α]ₐ : JetAlgebra) = inclL + (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α)) + from rfl, + massWeightPoly_inclL, LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, + Polynomial.mapAlgHom_monomial] rfl -lemma massWeightScale_dB_nil (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : - massWeightScale c [JetGenerators.dB 0 μ]ₐ = c ^ 2 • [JetGenerators.dB 0 μ]ₐ := by - rw [massWeightScale_ofGenerator, MassWeight] - norm_num +/-- Evaluation at one, as an algebra map. The jet algebra is not commutative, so evaluation + is multiplicative only because the point `1` is central. -/ +private noncomputable def evalOne : Polynomial JetAlgebra →ₐ[ℂ] JetAlgebra := + Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) 1 fun a => Commute.one_right a -/-- The total derivative raises the mass weight by two. -/ -lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by +private lemma evalOne_apply (p : Polynomial JetAlgebra) : evalOne p = p.eval 1 := rfl + +/-- Setting the formal variable to one recovers the original element. -/ +lemma massWeightPoly_eval_one (x : JetAlgebra) : (massWeightPoly x).eval 1 = x := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb] + | tmul b l => + rw [massWeightPoly_tmul, ← evalOne_apply, map_mul, evalOne_apply, evalOne_apply, + Polynomial.eval_one_mapAlgHom, Polynomial.eval_one_mapAlgHom, + BBoson.JetAlgebra.massWeightPoly_eval_one, + LeptonSinglet.JetAlgebra.massWeightPoly_eval_one, ← tmul_eq_inclB_mul_inclL] + +/-- Every element is the sum of the coefficients of its mass-weight polynomial. -/ +lemma eq_sum_massWeightPoly_coeff (x : JetAlgebra) : + x = ∑ n ∈ Polynomial.support (massWeightPoly x), (massWeightPoly x).coeff n := by + conv_lhs => rw [← massWeightPoly_eval_one x] + rw [Polynomial.eval_eq_sum, Polynomial.sum_def] + exact Finset.sum_congr rfl fun n _ => by + have h1 : (1 : JetAlgebra) ^ n = 1 := one_pow (M := JetAlgebra) n + grind + +/-- `massWeightPoly` is injective, however, it is not surjective. -/ +lemma massWeightPoly_injective : Function.Injective massWeightPoly := by + intro x y h + have h1 : (massWeightPoly x).eval 1 = (massWeightPoly y).eval 1 := by rw [h] + rwa [massWeightPoly_eval_one, massWeightPoly_eval_one] at h1 + +/-! + +## B. The mass-weight submodules + +-/ + +/-- The submodule of elements of mass weight `n`: those `x` whose mass-weight polynomial is + `x * X ^ n`. -/ +def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where + carrier := {x | massWeightPoly x = Polynomial.monomial n x} + add_mem' {a b} ha hb := by + simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ + rw [ha, hb] + zero_mem' := by simp + smul_mem' c x hx := by + simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ + rw [hx, Polynomial.smul_monomial] + +@[simp] +lemma mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} : + x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl + +/-- Mass weights add under multiplication, and `1` has mass weight zero. -/ +instance : SetLike.GradedMonoid massWeightSubmodule where + one_mem := by + show massWeightPoly 1 = Polynomial.monomial 0 1 + rw [Polynomial.monomial_zero_left, Polynomial.C_1] + exact massWeightPoly.map_one + mul_mem {m n x y} hx hy := by + simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ + rw [hx, hy, Polynomial.monomial_mul_monomial] + +/-- Mass weights add under multiplication. -/ +lemma mul_mem_massWeightSubmodule {m n : ℕ} {x y : JetAlgebra} + (hx : x ∈ massWeightSubmodule m) (hy : y ∈ massWeightSubmodule n) : + x * y ∈ massWeightSubmodule (m + n) := by + simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ + rw [hx, hy, Polynomial.monomial_mul_monomial] + +/-- The generator `j` has mass weight `MassWeight j`. -/ +lemma ofGenerator_mem_massWeightSubmodule (j : JetGenerators) : + [j]ₐ ∈ massWeightSubmodule (MassWeight j) := + massWeightPoly_ofGenerator j + +/-- The inclusion of the bosonic factor preserves mass weights. -/ +lemma inclB_mem_massWeightSubmodule {n : ℕ} {b : ℂ ⊗[ℝ] BBoson.JetAlgebra} + (hb : b ∈ BBoson.JetAlgebra.massWeightSubmodule n) : + inclB b ∈ massWeightSubmodule n := by + rw [mem_massWeightSubmodule, massWeightPoly_inclB, + BBoson.JetAlgebra.mem_massWeightSubmodule.mp hb, Polynomial.mapAlgHom_monomial] + +/-- The inclusion of the fermionic factor preserves mass weights. -/ +lemma inclL_mem_massWeightSubmodule {n : ℕ} {l : LeptonSinglet.JetAlgebra} + (hl : l ∈ LeptonSinglet.JetAlgebra.massWeightSubmodule n) : + inclL l ∈ massWeightSubmodule n := by + rw [mem_massWeightSubmodule, massWeightPoly_inclL, + LeptonSinglet.JetAlgebra.mem_massWeightSubmodule.mp hl, Polynomial.mapAlgHom_monomial] + +/-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass weight `n`: on a + pure tensor it is a sum of products of a bosonic and a fermionic coefficient of + complementary weights. -/ +lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : + (massWeightPoly x).coeff n ∈ massWeightSubmodule n := by + induction x using TensorProduct.induction_on generalizing n with + | zero => simp + | add a b ha hb => + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ha n) (hb n) + | tmul b l => + rw [massWeightPoly_tmul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + rw [Finset.mem_antidiagonal] at hp + rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, ← hp] + exact mul_mem_massWeightSubmodule + (inclB_mem_massWeightSubmodule + (BBoson.JetAlgebra.coeff_massWeightPoly_mem_massWeightSubmodule p.1 b)) + (inclL_mem_massWeightSubmodule + (LeptonSinglet.JetAlgebra.coeff_massWeightPoly_mem_massWeightSubmodule p.2 l)) + +/-- The coefficients of a mass-weight polynomial are homogeneous: the coefficient of `X ^ n` + in `massWeightPoly x` is sent by `massWeightPoly` to `X ^ n` times itself. -/ +lemma massWeightPoly_coeff_massWeightPoly (n : ℕ) (x : JetAlgebra) : + massWeightPoly ((massWeightPoly x).coeff n) = + Polynomial.monomial n ((massWeightPoly x).coeff n) := + coeff_massWeightPoly_mem_massWeightSubmodule n x + +/-- On an element of mass weight `n`, the `n`-th coefficient of the mass-weight polynomial is + the element itself. -/ +lemma coeff_massWeightPoly_of_mem {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : (massWeightPoly x).coeff n = x := by + rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_pos rfl] + +/-- On an element of mass weight `m`, every other coefficient of the mass-weight polynomial + vanishes. -/ +lemma coeff_massWeightPoly_of_mem_ne {m n : ℕ} {x : JetAlgebra} (hmn : m ≠ n) + (hx : x ∈ massWeightSubmodule m) : (massWeightPoly x).coeff n = 0 := by + rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_neg hmn] + +/-- The submodule of elements of mass weight at most `n`: the renormalizable Lagrangian + densities are those of mass weight at most eight. -/ +noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + ⨆ (m : ℕ) (_ : m ≤ n), massWeightSubmodule m + +lemma massWeightSubmodule_le_massWeightLESubmodule {m n : ℕ} (hmn : m ≤ n) : + massWeightSubmodule m ≤ MassWeightLESubmodule n := + le_iSup_of_le m (le_iSup_of_le hmn le_rfl) + +/-- An element of mass weight `m ≤ n` has mass weight at most `n`. -/ +lemma mem_massWeightLESubmodule_of_mem {m n : ℕ} (hmn : m ≤ n) {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule m) : x ∈ MassWeightLESubmodule n := + massWeightSubmodule_le_massWeightLESubmodule hmn hx + +/-- Above the bound the coefficients of the mass-weight polynomial vanish. -/ +lemma coeff_massWeightPoly_eq_zero_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} + (hx : x ∈ MassWeightLESubmodule n) {i : ℕ} (hi : n < i) : + (massWeightPoly x).coeff i = 0 := by + induction hx using Submodule.iSup_induction' with + | mem m y hy => + by_cases hmn : m ≤ n + · rw [iSup_pos hmn] at hy + exact coeff_massWeightPoly_of_mem_ne (by omega) hy + · rw [iSup_neg hmn, Submodule.mem_bot] at hy + rw [hy, map_zero, Polynomial.coeff_zero] + | zero => simp + | add a b _ _ ha hb => rw [map_add, Polynomial.coeff_add, ha, hb, add_zero] + +/-- An element of mass weight at most `n` is the sum of its parts of weight `0, …, n`, each + read off as a coefficient of its mass-weight polynomial. -/ +lemma eq_sum_coeff_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} + (hx : x ∈ MassWeightLESubmodule n) : + x = ∑ m ∈ Finset.range (n + 1), (massWeightPoly x).coeff m := by + conv_lhs => rw [eq_sum_massWeightPoly_coeff x] + refine Finset.sum_subset (fun m hm => ?_) (fun m _ hm => ?_) + · rw [Finset.mem_range] + by_contra hlt + exact Polynomial.mem_support_iff.mp hm + (coeff_massWeightPoly_eq_zero_of_mem_massWeightLESubmodule hx (by omega)) + · exact Polynomial.notMem_support_iff.mp hm + +/-- The Lorentz-invariant Lagrangian densities of mass weight at most `n`. -/ +noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := + MassWeightLESubmodule n ⊓ InvariantSubmodule + +/-! + +## C. The mass weight of the derivatives and of the field strength + +-/ + +/-- The total derivative acts on the bosonic factor through its own total derivative. -/ +lemma jetDeriv_inclB (μ : Fin 1 ⊕ Fin 3) (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + jetDeriv μ (inclB b) = + inclB (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) b) := by + rw [show inclB b = b ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, + LeptonSinglet.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, add_zero] + rfl + +/-- The total derivative acts on the fermionic factor through its own total derivative. -/ +lemma jetDeriv_inclL (μ : Fin 1 ⊕ Fin 3) (l : LeptonSinglet.JetAlgebra) : + jetDeriv μ (inclL l) = inclL (LeptonSinglet.JetAlgebra.jetDeriv μ l) := by + rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l from rfl, jetDeriv_tmul, + show LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 0 from by + rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, LinearMap.baseChange_tmul, + BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero], + TensorProduct.zero_tmul, zero_add] + rfl + +/-- Pushing a polynomial forward along the bosonic inclusion commutes with applying the total + derivative to its coefficients. -/ +private lemma mapCoeffs_jetDeriv_mapAlgHom_inclB (μ : Fin 1 ⊕ Fin 3) + (p : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) : + Polynomial.mapCoeffs (jetDeriv μ) (Polynomial.mapAlgHom inclB p) = + Polynomial.mapAlgHom inclB + (Polynomial.mapCoeffs (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) p) := by + refine Polynomial.ext fun n => ?_ + rw [Polynomial.coeff_mapCoeffs (map_zero (jetDeriv μ)), + Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapCoeffs + (map_zero (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)))] + exact jetDeriv_inclB μ _ + +/-- Pushing a polynomial forward along the fermionic inclusion commutes with applying the + total derivative to its coefficients. -/ +private lemma mapCoeffs_jetDeriv_mapAlgHom_inclL (μ : Fin 1 ⊕ Fin 3) + (p : Polynomial LeptonSinglet.JetAlgebra) : + Polynomial.mapCoeffs (jetDeriv μ) (Polynomial.mapAlgHom inclL p) = + Polynomial.mapAlgHom inclL + (Polynomial.mapCoeffs (LeptonSinglet.JetAlgebra.jetDeriv μ) p) := by + refine Polynomial.ext fun n => ?_ + rw [Polynomial.coeff_mapCoeffs (map_zero (jetDeriv μ)), + Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapCoeffs (map_zero (LeptonSinglet.JetAlgebra.jetDeriv μ))] + exact jetDeriv_inclL μ _ + +/-- The formal variable is fixed by the tensor inclusions. -/ +private lemma mapAlgHom_X_sq_inclB : + Polynomial.mapAlgHom inclB + ((Polynomial.X : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) ^ 2) = + (Polynomial.X : Polynomial JetAlgebra) ^ 2 := by + rw [Polynomial.X_pow_eq_monomial, Polynomial.mapAlgHom_monomial, inclB_one, + ← Polynomial.X_pow_eq_monomial] + +private lemma mapAlgHom_X_sq_inclL : + Polynomial.mapAlgHom inclL ((Polynomial.X : Polynomial LeptonSinglet.JetAlgebra) ^ 2) = + (Polynomial.X : Polynomial JetAlgebra) ^ 2 := by + rw [Polynomial.X_pow_eq_monomial, Polynomial.mapAlgHom_monomial, inclL_one, + ← Polynomial.X_pow_eq_monomial] + +/-- The Leibniz rule for the total derivative applied coefficientwise to a product of + polynomials. -/ +private lemma mapCoeffs_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (P Q : Polynomial JetAlgebra) : + Polynomial.mapCoeffs (jetDeriv μ) (P * Q) = + Polynomial.mapCoeffs (jetDeriv μ) P * Q + P * Polynomial.mapCoeffs (jetDeriv μ) Q := + Polynomial.mapCoeffs_mul_of_leibniz (map_zero (jetDeriv μ)) (map_add (jetDeriv μ)) + (jetDeriv_mul μ) P Q + +/-- Rearrangement used for the Leibniz step: `X ^ 2` is central, so it can be pulled out of a + Leibniz combination. -/ +private lemma X_sq_mul_leibniz {R : Type} [Semiring R] (p q r s : Polynomial R) : + Polynomial.X ^ 2 * p * q + r * (Polynomial.X ^ 2 * s) = + Polynomial.X ^ 2 * (p * q + r * s) := by + rw [mul_add, mul_assoc, ← mul_assoc r, ← Polynomial.X_pow_mul, mul_assoc] + +/-- The total derivative raises the mass weight by two: its mass-weight polynomial is `X ^ 2` + times the coefficientwise total derivative. -/ +lemma massWeightPoly_jetDeriv (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightPoly (jetDeriv μ x) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly x) := by + have hmul : ∀ a b : JetAlgebra, + massWeightPoly (jetDeriv μ a) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly a) → + massWeightPoly (jetDeriv μ b) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly b) → + massWeightPoly (jetDeriv μ (a * b)) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly (a * b)) := by + intro a b ha hb + rw [jetDeriv_mul] + simp only [map_add, map_mul] + rw [ha, hb, mapCoeffs_jetDeriv_mul, X_sq_mul_leibniz] + have hB : ∀ b : ℂ ⊗[ℝ] BBoson.JetAlgebra, + massWeightPoly (jetDeriv μ (inclB b)) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly (inclB b)) := by + intro b + rw [jetDeriv_inclB, massWeightPoly_inclB, massWeightPoly_inclB, + BBoson.JetAlgebra.massWeightPoly_jetDeriv_baseChange, map_mul, + mapAlgHom_X_sq_inclB, mapCoeffs_jetDeriv_mapAlgHom_inclB] + have hL : ∀ l : LeptonSinglet.JetAlgebra, + massWeightPoly (jetDeriv μ (inclL l)) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly (inclL l)) := by + intro l + rw [jetDeriv_inclL, massWeightPoly_inclL, massWeightPoly_inclL, + LeptonSinglet.JetAlgebra.massWeightPoly_jetDeriv, map_mul, + mapAlgHom_X_sq_inclL, mapCoeffs_jetDeriv_mapAlgHom_inclL] induction x using TensorProduct.induction_on with | zero => simp - | add a b ha hb => simp only [map_add, ha, hb, smul_add] - | tmul p l => - simp only [jetDeriv_tmul, map_add, massWeightScale, Algebra.TensorProduct.map_tmul, - BBoson.JetAlgebra.massWeightScale_jetDeriv_baseChange, - LeptonSinglet.JetAlgebra.massWeightScale_jetDeriv, TensorProduct.smul_tmul', - TensorProduct.tmul_smul, smul_add] - -/-- The covariant step raises the mass weight by two: the gauge-field term - `6 i B_μ ·` carries the same weight as the derivative. -/ -lemma massWeightScale_covariantStep (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightScale c (covariantStep μ x) = - c ^ 2 • covariantStep μ (massWeightScale c x) := by - simp only [covariantStep_apply, Multiset.empty_eq_zero, map_sub, massWeightScale_jetDeriv, - map_smul, map_mul, massWeightScale_dB_nil, smul_mul_assoc] - module + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, mul_add] + | tmul b l => + rw [tmul_eq_inclB_mul_inclL] + exact hmul _ _ (hB b) (hL l) + +/-- The total derivative raises the mass weight by two. -/ +lemma jetDeriv_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : jetDeriv μ x ∈ massWeightSubmodule (n + 2) := by + rw [mem_massWeightSubmodule] at hx ⊢ + rw [massWeightPoly_jetDeriv, hx, Polynomial.mapCoeffs_monomial (map_zero (jetDeriv μ)), + Polynomial.X_pow_eq_monomial, Polynomial.monomial_mul_monomial, one_mul, + Nat.add_comm 2 n] + +/-- The gauge field has mass weight two. -/ +lemma dB_nil_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) : + [JetGenerators.dB {} μ]ₐ ∈ massWeightSubmodule 2 := by + have h := ofGenerator_mem_massWeightSubmodule (JetGenerators.dB {} μ) + rwa [show MassWeight (JetGenerators.dB {} μ) = 2 from by simp [MassWeight]] at h + +/-- The covariant step raises the mass weight by two: the gauge-field term `6 i B_μ ·` + carries the same weight as the derivative. -/ +lemma covariantStep_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : + covariantStep μ x ∈ massWeightSubmodule (n + 2) := by + rw [covariantStep_apply] + refine Submodule.sub_mem _ (jetDeriv_mem_massWeightSubmodule μ hx) + (Submodule.smul_mem _ _ ?_) + have h := mul_mem_massWeightSubmodule (dB_nil_mem_massWeightSubmodule μ) hx + rwa [Nat.add_comm 2 n] at h /-- The conjugate covariant step raises the mass weight by two. -/ -lemma massWeightScale_covariantStepBar (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightScale c (covariantStepBar μ x) = - c ^ 2 • covariantStepBar μ (massWeightScale c x) := by - simp only [covariantStepBar_apply, Multiset.empty_eq_zero, map_add, massWeightScale_jetDeriv, - map_smul, map_mul, massWeightScale_dB_nil, smul_mul_assoc, smul_add, add_right_inj] - module - -/-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight - `3 + 2 |l|`. -/ -lemma massWeightScale_Dψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - massWeightScale c (Dψ l α) = c ^ (3 + 2 * l.length) • Dψ l α := by +lemma covariantStepBar_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : + covariantStepBar μ x ∈ massWeightSubmodule (n + 2) := by + rw [covariantStepBar_apply] + refine Submodule.add_mem _ (jetDeriv_mem_massWeightSubmodule μ hx) + (Submodule.smul_mem _ _ ?_) + have h := mul_mem_massWeightSubmodule (dB_nil_mem_massWeightSubmodule μ) hx + rwa [Nat.add_comm 2 n] at h + +/-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight `3 + 2 |l|`. -/ +lemma Dψ_mem_massWeightSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α ∈ massWeightSubmodule (3 + 2 * l.length) := by induction l with | nil => - rw [Dψ_nil, massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dψ {} α) = 3 from rfl] - norm_num + rw [Dψ_nil] + have h := ofGenerator_mem_massWeightSubmodule (JetGenerators.dψ {} α) + rwa [show MassWeight (JetGenerators.dψ {} α) = 3 + 2 * ([] : List (Fin 1 ⊕ Fin 3)).length + from by simp [MassWeight]] at h | cons μ l ih => - rw [Dψ_cons, massWeightScale_covariantStep c μ (Dψ l α), ih] - simp only [map_smul, smul_smul, List.length_cons] - ring_nf - -/-- Homogeneity of the conjugate covariant derivative: `D̄_l ψ̄_α` has mass - weight `3 + 2 |l|`. -/ -lemma massWeightScale_Dbarψ (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - massWeightScale c (Dbarψ l α) = c ^ (3 + 2 * l.length) • Dbarψ l α := by + rw [Dψ_cons] + have h := covariantStep_mem_massWeightSubmodule μ ih + rwa [show 3 + 2 * l.length + 2 = 3 + 2 * (μ :: l).length from by + simp only [List.length_cons]; omega] at h + +/-- Homogeneity of the conjugate covariant derivative: `D̄_l ψ̄_α` has mass weight + `3 + 2 |l|`. -/ +lemma Dbarψ_mem_massWeightSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α ∈ massWeightSubmodule (3 + 2 * l.length) := by induction l with | nil => - rw [Dbarψ_nil, massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dbarψ {} α) = 3 from rfl] - norm_num + rw [Dbarψ_nil] + have h := ofGenerator_mem_massWeightSubmodule (JetGenerators.dbarψ {} α) + rwa [show MassWeight (JetGenerators.dbarψ {} α) = + 3 + 2 * ([] : List (Fin 1 ⊕ Fin 3)).length from by simp [MassWeight]] at h | cons μ l ih => - rw [Dbarψ_cons, massWeightScale_covariantStepBar c μ (Dbarψ l α), ih] - simp only [map_smul, smul_smul, List.length_cons] - ring_nf + rw [Dbarψ_cons] + have h := covariantStepBar_mem_massWeightSubmodule μ ih + rwa [show 3 + 2 * l.length + 2 = 3 + 2 * (μ :: l).length from by + simp only [List.length_cons]; omega] at h /-- Homogeneity of the field-strength derivatives: `∂_s F_{μν}` has mass weight `4 + 2 |s|`. -/ -lemma massWeightScale_fieldStrengthDeriv (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) +lemma fieldStrengthDeriv_mem_massWeightSubmodule (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - massWeightScale c (fieldStrengthDeriv s μ ν) = - c ^ (4 + 2 * Multiset.card s) • fieldStrengthDeriv s μ ν := by + fieldStrengthDeriv s μ ν ∈ massWeightSubmodule (4 + 2 * Multiset.card s) := by have h : (fieldStrengthDeriv s μ ν : JetAlgebra) = [JetGenerators.dB (s + {μ}) ν]ₐ - [JetGenerators.dB (s + {ν}) μ]ₐ := by rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, TensorProduct.tmul_sub, TensorProduct.sub_tmul] rfl - rw [h, map_sub, massWeightScale_ofGenerator, massWeightScale_ofGenerator, - show MassWeight (JetGenerators.dB (s + {μ}) ν) = 4 + 2 * Multiset.card s from by - simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, - show MassWeight (JetGenerators.dB (s + {ν}) μ) = 4 + 2 * Multiset.card s from by - simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega, - smul_sub] - -/-- Products of homogeneous elements are homogeneous of the summed weight. -/ -lemma massWeightScale_mul_eigen {x y : JetAlgebra} {m n : ℕ} - (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) - (hy : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (c : ℂ) : - massWeightScale c (x * y) = c ^ (m + n) • (x * y) := by - simp only [map_mul, hx, hy] - noncomm_ring [smul_smul] - ring_nf - - -/-- The mass-dimension scaling at a real scalar commutes with the Lorentz - action on the lepton–gauge-sector jet algebra. -/ -lemma massWeightScale_ofReal_repLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) - (x : JetAlgebra) : - massWeightScale (r : ℂ) (repLorentzGroup Λ x) = - repLorentzGroup Λ (massWeightScale (r : ℂ) x) := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul p l => - simp only [repLorentzGroup_tmul, massWeightScale_tmul, - BBoson.JetAlgebra.massWeightScale_ofReal_complexRepLorentzGroup, - LeptonSinglet.JetAlgebra.massWeightScale_repLorentzGroup_apply] - - -/-- The mass-dimension scaling commutes with the constant gauge action on the - lepton–gauge-sector jet algebra. -/ -lemma massWeightScale_repJetGaugeGroupI_ofConstant (c : ℂ) (g : GaugeGroupI) - (x : JetAlgebra) : - massWeightScale c (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (massWeightScale c x) := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul p l => - simp only [repJetGaugeGroupI_tmul', massWeightScale_tmul, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, - LeptonSinglet.JetAlgebra.massWeightScale_repJetGaugeGroupI_ofConstant_apply] - + rw [h] + refine Submodule.sub_mem _ ?_ ?_ + · have hg := ofGenerator_mem_massWeightSubmodule (JetGenerators.dB (s + {μ}) ν) + rwa [show MassWeight (JetGenerators.dB (s + {μ}) ν) = 4 + 2 * Multiset.card s from by + simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega] at hg + · have hg := ofGenerator_mem_massWeightSubmodule (JetGenerators.dB (s + {ν}) μ) + rwa [show MassWeight (JetGenerators.dB (s + {ν}) μ) = 4 + 2 * Multiset.card s from by + simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega] at hg /-! -## A. The mass-weight submodules +## D. Invariance of the mass weights under the Lorentz and constant gauge actions -/ -noncomputable def MassDimSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ { x | ∀ c : ℂ, massWeightScale c x = c ^ n • x } - -noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x | ∃ m ≤ n, ∀ c : ℂ, massWeightScale c x = c ^ m • x} - -noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - MassWeightLESubmodule n ⊓ InvariantSubmodule - -/-- Eigenvectors of weight `m ≤ n` lie in the weight-`≤ n` submodule. -/ -lemma mem_massWeightLESubmodule_of_forall_massWeightScale {x : JetAlgebra} - {m n : ℕ} (hmn : m ≤ n) - (hx : ∀ c : ℂ, massWeightScale c x = c ^ m • x) : - x ∈ MassWeightLESubmodule n := - Submodule.subset_span ⟨m, hmn, hx⟩ - -/-- Independence of the powers `c ↦ c ^ w`: if a finite combination - `∑ c ^ w • v w` vanishes for every scalar `c`, then every `v w` vanishes. This - is what separates the mass-weight components of an element. -/ -lemma eq_zero_of_forall_sum_pow_smul_eq_zero (s : Finset ℕ) (v : ℕ → JetAlgebra) - (h : ∀ c : ℂ, ∑ w ∈ s, c ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : v w = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hp : ∀ c : ℂ, Polynomial.eval c - (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by - intro c - have h2 := congrArg φ (h c) - rw [map_sum, map_zero] at h2 - rw [Polynomial.eval_finsetSum] - simpa [Polynomial.eval_monomial, mul_comm] using h2 - have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := - Polynomial.funext fun c => by rw [hp c, Polynomial.eval_zero] - have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff - -/-- Every element of the weight-`≤ n` submodule is a sum of exact-weight - eigenvectors of the mass-weight scaling. -/ -lemma exists_eigen_decomp_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} - (hx : x ∈ MassWeightLESubmodule n) : - ∃ z : ℕ → JetAlgebra, - (∀ m, ∀ c : ℂ, massWeightScale c (z m) = c ^ m • z m) ∧ - x = ∑ m ∈ Finset.range (n + 1), z m := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨m, hmn, hym⟩ := hy - refine ⟨fun k => if k = m then y else 0, fun k c => ?_, ?_⟩ - · by_cases hk : k = m - · subst hk - simpa using hym c - · simp [hk] - · rw [Finset.sum_ite_eq' (Finset.range (n + 1)) m fun _ => y, - if_pos (Finset.mem_range.mpr (Nat.lt_succ_of_le hmn))] - | zero => - exact ⟨fun _ => 0, by simp, by simp⟩ - | add a b ha hb iha ihb => - obtain ⟨z₁, hz₁, rfl⟩ := iha - obtain ⟨z₂, hz₂, rfl⟩ := ihb - refine ⟨z₁ + z₂, fun m c => ?_, ?_⟩ - · simp only [Pi.add_apply, map_add, hz₁ m c, hz₂ m c, smul_add] - · rw [← Finset.sum_add_distrib] - rfl - | smul c a ha iha => - obtain ⟨z, hz, rfl⟩ := iha - refine ⟨c • z, fun m c' => ?_, ?_⟩ - · simp only [Pi.smul_apply, map_smul, hz m c', smul_comm c] - · rw [Finset.smul_sum] +/-- The Lorentz action preserves mass weights: the mass-weight polynomial of a transformed + element is the transform of its mass-weight polynomial. -/ +lemma massWeightPoly_repLorentzGroup (Λ : SL(2,ℂ)) (x : JetAlgebra) : + massWeightPoly (repLorentzGroup Λ x) = + Polynomial.mapAlgHom (Algebra.TensorProduct.map + (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) + (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ)) (massWeightPoly x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add] + | tmul b l => + rw [repLorentzGroup_tmul, massWeightPoly_tmul, massWeightPoly_tmul, + BBoson.JetAlgebra.massWeightPoly_complexRepLorentzGroup, + LeptonSinglet.JetAlgebra.massWeightPoly_repLorentzGroup, map_mul] + refine congrArg₂ (· * ·) (Polynomial.ext fun n => ?_) (Polynomial.ext fun n => ?_) + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapAlgHom_apply] + show inclB _ = _ + rw [show inclB ((BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) + ((BBoson.JetAlgebra.massWeightPoly b).coeff n)) = + (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) + ((BBoson.JetAlgebra.massWeightPoly b).coeff n) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl] + rw [show inclB ((BBoson.JetAlgebra.massWeightPoly b).coeff n) = + ((BBoson.JetAlgebra.massWeightPoly b).coeff n) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, Algebra.TensorProduct.map_tmul, map_one] + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapAlgHom_apply] + show inclL _ = _ + rw [show inclL ((LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) + ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n)) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) + ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl] + rw [show inclL ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl, + Algebra.TensorProduct.map_tmul, map_one] + +/-- The Lorentz action preserves each mass-weight submodule. -/ +lemma repLorentzGroup_mem_massWeightSubmodule (Λ : SL(2,ℂ)) {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : repLorentzGroup Λ x ∈ massWeightSubmodule n := by + rw [mem_massWeightSubmodule] at hx ⊢ + rw [massWeightPoly_repLorentzGroup, hx, Polynomial.mapAlgHom_monomial] + rfl + +/-- Jets of constant gauge transformations preserve mass weights. This fails for a general + jet: the higher Taylor coefficients of the hypercharge character lower the derivative + degree, mixing weights. -/ +lemma massWeightPoly_repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : + massWeightPoly (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = + Polynomial.mapAlgHom (Algebra.TensorProduct.map + (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom (JetGaugeGroupI.ofConstant g)) + (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom (JetGaugeGroupI.ofConstant g))) + (massWeightPoly x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add] + | tmul b l => + rw [repJetGaugeGroupI_tmul', massWeightPoly_tmul, massWeightPoly_tmul, + BBoson.JetAlgebra.massWeightPoly_complexRepJetGaugeGroupI_ofConstant, + LeptonSinglet.JetAlgebra.massWeightPoly_repJetGaugeGroupI_ofConstant, map_mul] + refine congrArg₂ (· * ·) (Polynomial.ext fun n => ?_) (Polynomial.ext fun n => ?_) + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply] + show inclB _ = _ + rw [show inclB ((BBoson.JetAlgebra.massWeightPoly b).coeff n) = + ((BBoson.JetAlgebra.massWeightPoly b).coeff n) ⊗ₜ[ℂ] + (1 : LeptonSinglet.JetAlgebra) from rfl, Algebra.TensorProduct.map_tmul, map_one] + rw [show (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom + (JetGaugeGroupI.ofConstant g)) ((BBoson.JetAlgebra.massWeightPoly b).coeff n) = + (BBoson.JetAlgebra.massWeightPoly b).coeff n from + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant g _] rfl - -/-! - -## D. The mass dimension polynomial. - -The lepton–gauge-sector jet algebra is the tensor product of the two factors, and mass weights -add under that product, so the mass-weight polynomial of the whole is assembled -from the two factor polynomials: push each into `Polynomial JetAlgebra` along the -tensor inclusions and multiply. On monomials this is exactly -`X ^ a * b ⊗ X ^ c * l ↦ X ^ (a + c) * (b ⊗ l)`. - --/ - -/-- The mass-weight polynomial on the lepton–gauge-sector jet algebra, assembled from the - mass-weight polynomials of the two factors. -/ -noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := - (Algebra.TensorProduct.lift (Polynomial.mapAlgHom inclB) - (Polynomial.mapAlgHom inclL) commute_mapAlgHom_inclB_inclL).comp - (Algebra.TensorProduct.map BBoson.JetAlgebra.massWeightPoly - LeptonSinglet.JetAlgebra.massWeightPoly) - -@[simp] -lemma massWeightPoly_tmul (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - massWeightPoly (b ⊗ₜ[ℂ] l) = - Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) * - Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := rfl + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapAlgHom_apply] + show inclL _ = _ + rw [show inclL ((LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom + (JetGaugeGroupI.ofConstant g)) + ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n)) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom (JetGaugeGroupI.ofConstant g)) + ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl] + rw [show inclL ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) = + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl, + Algebra.TensorProduct.map_tmul, map_one] + +/-- Jets of constant gauge transformations preserve each mass-weight submodule. -/ +lemma repJetGaugeGroupI_ofConstant_mem_massWeightSubmodule (g : GaugeGroupI) {n : ℕ} + {x : JetAlgebra} (hx : x ∈ massWeightSubmodule n) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x ∈ massWeightSubmodule n := by + rw [mem_massWeightSubmodule] at hx ⊢ + rw [massWeightPoly_repJetGaugeGroupI_ofConstant, hx, Polynomial.mapAlgHom_monomial] + rfl end JetAlgebra diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean index 1b484322c..216bc9819 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.JetDeriv +public import Physlib.Mathematics.PolynomialEval /-! # Mass dimension on the charged-lepton jet algebra @@ -470,6 +471,72 @@ lemma massWeightScale_repLorentzGroup_apply (c : ℂ) (g : SL(2,ℂ)) (x : JetAl have h := massWeightScale_repLorentzGroup c g exact DFunLike.congr_fun h x +/-! + +## C. Evaluating the mass-weight polynomial + +The mass-weight polynomial and the mass-weight scaling are two descriptions of the same +grading: evaluating the polynomial at a scalar gives the scaling by that scalar. Since a +polynomial with coefficients in an algebra over an infinite field is determined by its +values at the scalars, statements proved for one description transfer to the other. + +-/ + +/-- Evaluating the mass-weight polynomial at a scalar is the mass-weight scaling by that + scalar. Both send a generator of weight `w` to `c ^ w` times itself, and both are + algebra maps. -/ +lemma eval_massWeightPoly (c : ℂ) (x : JetAlgebra) : + (massWeightPoly x).eval (algebraMap ℂ JetAlgebra c) = massWeightScale c x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) + (algebraMap ℂ JetAlgebra c) + (fun a => (Algebra.commutes c a).symm)).comp massWeightPoly = + (massWeightScale c : JetAlgebra →ₐ[ℂ] JetAlgebra) := by + refine ExteriorAlgebra.hom_ext (Module.Basis.ext JetComponentSpace.basis fun j => ?_) + show (massWeightPoly (ofGenerator j)).eval (algebraMap ℂ JetAlgebra c) = + massWeightScale c (ofGenerator j) + rw [massWeightPoly_ofGenerator, massWeightScale_ofGenerator, Polynomial.eval_monomial, + ← map_pow, ← Algebra.commutes, ← Algebra.smul_def] + exact AlgHom.congr_fun h x + +/-! + +## D. The mass weight of derivatives and of transformed elements + +-/ + +/-- The total derivative raises the mass weight by two: its mass-weight polynomial is + `X ^ 2` times the coefficientwise total derivative. -/ +lemma massWeightPoly_jetDeriv (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + massWeightPoly (jetDeriv μ x) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly x) := by + obtain ⟨q, hq, hc⟩ := exists_massWeightPoly_jetDeriv μ x + rw [hq] + congr 1 + refine Polynomial.ext fun n => ?_ + rw [Polynomial.coeff_mapCoeffs (map_zero (jetDeriv μ)), hc] + +/-- The Lorentz action preserves mass weights: the mass-weight polynomial of a transformed + element is the transform of its mass-weight polynomial. -/ +lemma massWeightPoly_repLorentzGroup (Λ : SL(2,ℂ)) (x : JetAlgebra) : + massWeightPoly (repLorentzGroup Λ x) = + Polynomial.mapAlgHom (repLorentzGroupAlgHom Λ) (massWeightPoly x) := by + refine Polynomial.ext_of_forall_eval_algebraMap (k := ℂ) fun c => ?_ + rw [eval_massWeightPoly, Polynomial.eval_algebraMap_mapAlgHom, eval_massWeightPoly, + massWeightScale_repLorentzGroup_apply] + rfl + +/-- Jets of constant gauge transformations preserve mass weights. This fails for a general + jet: the higher Taylor coefficients of the hypercharge character lower the derivative + degree, mixing weights. -/ +lemma massWeightPoly_repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : + massWeightPoly (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = + Polynomial.mapAlgHom (repJetGaugeGroupIAlgHom (JetGaugeGroupI.ofConstant g)) + (massWeightPoly x) := by + refine Polynomial.ext_of_forall_eval_algebraMap (k := ℂ) fun c => ?_ + rw [eval_massWeightPoly, Polynomial.eval_algebraMap_mapAlgHom, eval_massWeightPoly, + massWeightScale_repJetGaugeGroupI_ofConstant_apply] + rfl + end JetAlgebra end LeptonSinglet diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean index 525d45a36..496479599 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic +public import Physlib.Mathematics.PolynomialEval /-! # The mass dimension associated with the `B` boson @@ -229,6 +230,83 @@ lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : ℂ ⊗[ℝ] J (massWeightPoly x).coeff n ∈ massWeightSubmodule n := massWeightPoly_coeff_massWeightPoly n x +/-! + +## C. Evaluating the mass-weight polynomial + +The mass-weight polynomial and the mass-weight scaling are two descriptions of the same +grading: evaluating the polynomial at a scalar gives the scaling by that scalar. Since a +polynomial with coefficients in an algebra over an infinite field is determined by its +values at the scalars, statements proved for one description transfer to the other. + +-/ + +/-- Evaluating the mass-weight polynomial at a scalar is the mass-weight scaling by that + scalar. Both send a generator of weight `w` to `c ^ w` times itself, and both are + algebra maps. -/ +lemma eval_massWeightPoly (c : ℂ) (x : ℂ ⊗[ℝ] JetAlgebra) : + (massWeightPoly x).eval (algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) c) = massWeightScale c x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (ℂ ⊗[ℝ] JetAlgebra)) + (algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) c) + (fun a => Commute.all a _)).comp massWeightPoly = massWeightScale c := by + refine (AlgHom.liftEquiv ℝ ℂ JetAlgebra _).symm.injective ?_ + refine SymmetricAlgebra.algHom_ext + (Module.Basis.ext JetComponentSpace.basis fun j => ?_) + show (massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j)).eval + (algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) c) = + massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) + rw [massWeightPoly_ofGenerator, massWeightScale_tmul_ofGenerator, + Polynomial.eval_monomial, ← map_pow, ← Algebra.commutes, ← Algebra.smul_def] + exact AlgHom.congr_fun h x + +/-- Evaluating at a real scalar, where the scalar tower lets the same value be read either + over `ℝ` or over `ℂ`. -/ +lemma eval_massWeightPoly_ofReal (r : ℝ) (x : ℂ ⊗[ℝ] JetAlgebra) : + (massWeightPoly x).eval (algebraMap ℝ (ℂ ⊗[ℝ] JetAlgebra) r) = + massWeightScale (r : ℂ) x := by + rw [IsScalarTower.algebraMap_apply ℝ ℂ (ℂ ⊗[ℝ] JetAlgebra) r, eval_massWeightPoly] + rfl + +/-! + +## D. The mass weight of derivatives and of transformed elements + +-/ + +open Matrix MatrixGroups + +/-- The total derivative raises the mass weight by two: its mass-weight polynomial is + `X ^ 2` times the coefficientwise total derivative. -/ +lemma massWeightPoly_jetDeriv_baseChange (μ : Fin 1 ⊕ Fin 3) (x : ℂ ⊗[ℝ] JetAlgebra) : + massWeightPoly (LinearMap.baseChange ℂ (jetDeriv μ) x) = + Polynomial.X ^ 2 * Polynomial.mapCoeffs (LinearMap.baseChange ℂ (jetDeriv μ)) + (massWeightPoly x) := by + refine Polynomial.ext_of_forall_eval_algebraMap (k := ℂ) fun c => ?_ + rw [eval_massWeightPoly, Polynomial.eval_mul, Polynomial.eval_pow, Polynomial.eval_X, + Polynomial.eval_algebraMap_mapCoeffs, eval_massWeightPoly, + massWeightScale_jetDeriv_baseChange, ← map_pow, ← Algebra.smul_def] + +/-- The Lorentz action preserves mass weights: the mass-weight polynomial of a transformed + element is the transform of its mass-weight polynomial. -/ +lemma massWeightPoly_complexRepLorentzGroup (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] JetAlgebra) : + massWeightPoly (complexRepLorentzGroup Λ x) = + Polynomial.mapAlgHom (complexRepLorentzGroupAlgHom Λ) (massWeightPoly x) := by + refine Polynomial.ext_of_forall_eval_algebraMap (k := ℝ) fun r => ?_ + have hmap : algebraMap ℝ (ℂ ⊗[ℝ] JetAlgebra) r = + algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (r : ℂ) := + IsScalarTower.algebraMap_apply ℝ ℂ (ℂ ⊗[ℝ] JetAlgebra) r + rw [hmap, eval_massWeightPoly, Polynomial.eval_algebraMap_mapAlgHom, + eval_massWeightPoly, massWeightScale_ofReal_complexRepLorentzGroup] + rfl + +/-- Jets of constant gauge transformations act trivially on the B-boson factor, so they + preserve the mass-weight polynomial outright. -/ +lemma massWeightPoly_complexRepJetGaugeGroupI_ofConstant (g : GaugeGroupI) + (x : ℂ ⊗[ℝ] JetAlgebra) : + massWeightPoly (complexRepJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = + massWeightPoly x := by + rw [complexRepJetGaugeGroupI_ofConstant] + TODO "Show invariance of the mass weights with repsect to the Lorentz group." end JetAlgebra From e00d93c925c2da3aaf0036d237fd47f89721be07 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:08:04 +0100 Subject: [PATCH 116/254] feat: Some clean up/reagranging Co-Authored-By: Claude --- Physlib/Mathematics/PolynomialEval.lean | 4 + .../LeptonGaugeSector/JetAlgebra/Basic.lean | 134 ++++++++++- .../JetAlgebra/CovariantAlgebra.lean | 141 ++++++++--- .../JetAlgebra/CovariantDeriv.lean | 9 +- .../JetAlgebra/DerivativeOrder.lean | 171 +++++++------- .../JetAlgebra/FieldStrength.lean | 14 +- .../JetAlgebra/GaugeAction.lean | 176 +++++++++++--- .../JetAlgebra/IsInvariant.lean | 199 +++++++--------- .../JetAlgebra/JetDeriv.lean | 45 ++-- .../JetAlgebra/LorentzAction.lean | 206 +++++----------- .../LeptonGaugeSector/JetAlgebra/MassDim.lean | 223 ++++++++++++------ 11 files changed, 793 insertions(+), 529 deletions(-) diff --git a/Physlib/Mathematics/PolynomialEval.lean b/Physlib/Mathematics/PolynomialEval.lean index ec41d0f19..d7972186b 100644 --- a/Physlib/Mathematics/PolynomialEval.lean +++ b/Physlib/Mathematics/PolynomialEval.lean @@ -120,6 +120,10 @@ lemma coeff_mapCoeffs {A : Type*} [Semiring A] {f : A → A} (hf0 : f 0 = 0) · rw [if_pos hn] · rw [if_neg hn, Polynomial.notMem_support_iff.mp hn, hf0] +@[simp] +lemma mapCoeffs_zero {A : Type*} [Semiring A] (f : A → A) : mapCoeffs f 0 = 0 := by + simp [mapCoeffs] + lemma mapCoeffs_monomial {A : Type*} [Semiring A] {f : A → A} (hf0 : f 0 = 0) (n : ℕ) (a : A) : mapCoeffs f (Polynomial.monomial n a) = Polynomial.monomial n (f a) := by diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean index b5b206592..3367bb0bc 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean @@ -44,10 +44,130 @@ inductive JetGenerators where | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators -abbrev JetAlgebra := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (LeptonSinglet.JetAlgebra) +/-- The jet algebra of the lepton–gauge sector: the tensor product of the complexified + B-boson jet algebra with the charged-lepton jet algebra. + + This is a `def` rather than an `abbrev`, and its algebraic structure is fixed by the single + `Ring` and `Algebra` instances below, so that every algebraic class projects from one root. + On the bare tensor product `One`, `Mul`, `Zero`, `Add`, `SMul` and `Module` are instead + supplied by standalone `TensorProduct.*` instances rather than as projections of the + semiring. Those are definitionally the projections, but not syntactically, so a lemma whose + type argument is not pinned by an explicit argument cannot be unified against a goal — that + would need a projection inverted through a metavariable. Concretely `mul_one a` succeeds, + because `a` fixes the type first, while `one_pow n` fails. Rooting the structure here keeps + the generic algebraic lemmas usable. + + Note that the corresponding issue does not arise for the complexification + `ℂ ⊗[ℝ] BBoson.JetAlgebra`, where both factors are commutative. -/ +def JetAlgebra : Type := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (LeptonSinglet.JetAlgebra) + +noncomputable instance : Ring JetAlgebra := + inferInstanceAs (Ring ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra)) + +noncomputable instance : Algebra ℂ JetAlgebra := + inferInstanceAs (Algebra ℂ ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra)) namespace JetAlgebra +/-- A pure tensor, as an element of the jet algebra. + + Writing `a ⊗ₜ[ℂ] b` builds an element of the *underlying* tensor product, which is only + definitionally an element of `JetAlgebra`. A goal mixing such a term with the jet algebra's + own operations is then not type-correct at `instances` transparency, and no rewrite can fire + on it. This constructor keeps pure tensors typed at `JetAlgebra`, and is what the lemmas + below and the induction principle are stated in terms of. -/ +noncomputable def tmul (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + JetAlgebra := a ⊗ₜ[ℂ] b + +@[inherit_doc] scoped infixl:100 " ⊗ⱼ " => JetAlgebra.tmul + +/-- `tmul` is the pure tensor of the underlying tensor product; use this to move between the + jet algebra and lemmas stated for the tensor product. -/ +lemma tmul_eq (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + a ⊗ⱼ b = a ⊗ₜ[ℂ] b := rfl + +lemma one_eq_tmul : (1 : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ 1 := rfl + +/-- Multiplication of pure tensors. `Algebra.TensorProduct.tmul_mul_tmul` does not rewrite + here, even though it is definitionally the same statement. -/ +@[simp] +lemma tmul_mul_tmul (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (b₁ b₂ : LeptonSinglet.JetAlgebra) : + (a₁ ⊗ⱼ b₁) * (a₂ ⊗ⱼ b₂) = (a₁ * a₂) ⊗ⱼ (b₁ * b₂) := + Algebra.TensorProduct.tmul_mul_tmul _ _ _ _ + +@[simp] +lemma zero_tmul (b : LeptonSinglet.JetAlgebra) : + (0 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ b = 0 := TensorProduct.zero_tmul _ b + +@[simp] +lemma tmul_zero (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + a ⊗ⱼ (0 : LeptonSinglet.JetAlgebra) = 0 := TensorProduct.tmul_zero _ a + +@[simp] +lemma add_tmul (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + (a₁ + a₂) ⊗ⱼ b = a₁ ⊗ⱼ b + a₂ ⊗ⱼ b := TensorProduct.add_tmul a₁ a₂ b + +@[simp] +lemma tmul_add (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b₁ b₂ : LeptonSinglet.JetAlgebra) : + a ⊗ⱼ (b₁ + b₂) = a ⊗ⱼ b₁ + a ⊗ⱼ b₂ := TensorProduct.tmul_add a b₁ b₂ + +@[simp] +lemma sub_tmul (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + (a₁ - a₂) ⊗ⱼ b = a₁ ⊗ⱼ b - a₂ ⊗ⱼ b := TensorProduct.sub_tmul a₁ a₂ b + +@[simp] +lemma tmul_sub (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b₁ b₂ : LeptonSinglet.JetAlgebra) : + a ⊗ⱼ (b₁ - b₂) = a ⊗ⱼ b₁ - a ⊗ⱼ b₂ := TensorProduct.tmul_sub a b₁ b₂ + +lemma tmul_sum {ι : Type*} (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (s : Finset ι) + (f : ι → LeptonSinglet.JetAlgebra) : a ⊗ⱼ (∑ i ∈ s, f i) = ∑ i ∈ s, a ⊗ⱼ f i := + TensorProduct.tmul_sum a s f + +lemma sum_tmul {ι : Type*} (s : Finset ι) (f : ι → ℂ ⊗[ℝ] BBoson.JetAlgebra) + (b : LeptonSinglet.JetAlgebra) : (∑ i ∈ s, f i) ⊗ⱼ b = ∑ i ∈ s, f i ⊗ⱼ b := + TensorProduct.sum_tmul s f b + +@[simp] +lemma tmul_smul (r : ℂ) (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + a ⊗ⱼ (r • b) = r • (a ⊗ⱼ b) := TensorProduct.tmul_smul r a b + +@[simp] +lemma smul_tmul' (r : ℂ) (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + (r • a) ⊗ⱼ b = r • (a ⊗ⱼ b) := TensorProduct.smul_tmul' r a b + +lemma tmul_add_tmul_right (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (b₁ b₂ : LeptonSinglet.JetAlgebra) : a ⊗ⱼ b₁ + a ⊗ⱼ b₂ = a ⊗ⱼ (b₁ + b₂) := + (TensorProduct.tmul_add a b₁ b₂).symm + +@[simp] +lemma tmul_add_tmul_left (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (b : LeptonSinglet.JetAlgebra) : a₁ ⊗ⱼ b + a₂ ⊗ⱼ b = (a₁ + a₂) ⊗ⱼ b := + (TensorProduct.add_tmul a₁ a₂ b).symm + +/-- A linear map on the bosonic factor, extended to the whole jet algebra. Stating this as a + map out of `JetAlgebra` keeps `map_zero`/`map_add` applicable, which they are not for a bare + `TensorProduct.map` fed a jet-algebra element. -/ +noncomputable def mapB (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ ⊗[ℝ] BBoson.JetAlgebra) : + JetAlgebra →ₗ[ℂ] JetAlgebra := + TensorProduct.map f LinearMap.id + +@[simp] +lemma mapB_tmul (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ ⊗[ℝ] BBoson.JetAlgebra) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + mapB f (a ⊗ⱼ b) = (f a) ⊗ⱼ b := rfl + +/-- Induction on the jet algebra, stated for `JetAlgebra` itself. Using + `TensorProduct.induction_on` directly leaves the zero, the sum and the pure tensors in the + goals carrying the tensor product's structure rather than the jet algebra's, which makes + those goals unrewritable. -/ +@[elab_as_elim] +lemma induction_on {motive : JetAlgebra → Prop} (x : JetAlgebra) (zero : motive 0) + (tmul : ∀ (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra), + motive (a ⊗ⱼ b)) + (add : ∀ x y : JetAlgebra, motive x → motive y → motive (x + y)) : motive x := + TensorProduct.induction_on x zero tmul add + /-- The B-boson factor included into the lepton–gauge-sector jet algebra. -/ noncomputable abbrev inclB : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] JetAlgebra := Algebra.TensorProduct.includeLeft @@ -87,27 +207,27 @@ lemma commute_mapAlgHom_inclB_inclL (p : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlge noncomputable def ofGenerator (s : JetGenerators) : JetAlgebra := match s with | JetGenerators.dB s μ => - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ⱼ 1 | JetGenerators.dψ s α => - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) + (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) | JetGenerators.dbarψ s α => - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) + (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) scoped notation "[" s "]ₐ" => ofGenerator s lemma ofGenerator_dψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : ofGenerator (JetGenerators.dψ s α) = - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) := rfl lemma ofGenerator_B_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : ofGenerator (JetGenerators.dB s μ) = (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB s μ)) ⊗ₜ[ℂ] 1 := rfl + (BBoson.JetGenerators.dB s μ)) ⊗ⱼ 1 := rfl lemma ofGenerator_dbarψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : ofGenerator (JetGenerators.dbarψ s α) = - (1 ⊗ₜ[ℝ] 1) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) := rfl end JetAlgebra diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean index bcb14fcbb..00c238e48 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean @@ -7,16 +7,21 @@ module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.CovariantDeriv /-! -# The linear-matter submodule of the lepton–gauge-sector jet algebra +# The covariant subalgebra of the lepton–gauge-sector jet algebra -The submodule spanned by a single matter component function times a B-boson -polynomial, its closure under the total derivative and the covariant steps, and -the oddness of its elements in the fermionic case. +The subalgebra generated by the covariant quantities of the theory — the derivatives of the +field strength and the covariant derivatives of the lepton and of its conjugate — together +with the linear-matter submodule and the covariant substitution used to study it. + +The linear-matter submodule is spanned by a single matter component function times a B-boson +polynomial; the file records its closure under the total derivative and the covariant steps, +and the oddness of its elements in the fermionic case. The covariant substitution `covSubst` +replaces each plain fermionic generator by its covariant version, and is the change of +variables under which the covariant subalgebra is the image of the plain one. -/ @[expose] public section -set_option maxHeartbeats 1000000 namespace LeptonGaugeSector open TensorProduct StandardModel @@ -25,7 +30,82 @@ namespace JetAlgebra /-! -### The linear-matter submodule +## A. The covariant subalgebra + +The subalgebra generated by the covariant quantities of the theory: the derivatives of the +field strength — which for an abelian gauge field are already covariant, the field strength +being neutral — and the covariant derivatives of the lepton and of its conjugate. + +Every gauge invariant lies in this subalgebra — that is +`mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq` — and conversely an element of it is +invariant as soon as it is fixed by the *constant* gauge transformations and by the Lorentz +group, since a jet of gauge transformations acts on these generators only through its value at +the base point. + +-/ + +/-- The generators of the covariant subalgebra: the derivatives of the field strength together + with the covariant derivatives of the lepton and of its conjugate. -/ +noncomputable def invariantGenerators : Set JetAlgebra := + (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ + (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dψ p.1 p.2) ∪ + (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ p.1 p.2) + +/-- The covariant subalgebra of the lepton–gauge-sector jet algebra: the subalgebra generated + by the derivatives of the field strength and the covariant derivatives of the lepton and of + its conjugate. -/ +noncomputable def CovariantAlgebra : Subalgebra ℂ JetAlgebra := + Algebra.adjoin ℂ invariantGenerators + +lemma mem_covariantAlgebra_iff {x : JetAlgebra} : + x ∈ CovariantAlgebra ↔ x ∈ Algebra.adjoin ℂ invariantGenerators := Iff.rfl + +lemma fieldStrengthDeriv_mem_covariantAlgebra (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ ν ∈ CovariantAlgebra := + Algebra.subset_adjoin (Or.inl (Or.inl ⟨(s, μ, ν), rfl⟩)) + +lemma Dψ_mem_covariantAlgebra (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dψ l α ∈ CovariantAlgebra := + Algebra.subset_adjoin (Or.inl (Or.inr ⟨(l, α), rfl⟩)) + +lemma Dbarψ_mem_covariantAlgebra (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + Dbarψ l α ∈ CovariantAlgebra := + Algebra.subset_adjoin (Or.inr ⟨(l, α), rfl⟩) + +/-- Induction over the covariant subalgebra, with the three families of generators presented + separately. This is the shape every proof about the covariant subalgebra wants: unfolding + `Algebra.adjoin_induction` by hand forces the caller to take apart the union defining + `invariantGenerators` at each use. -/ +@[elab_as_elim] +lemma CovariantAlgebra.induction_on + {motive : (x : JetAlgebra) → x ∈ CovariantAlgebra → Prop} + (fieldStrength : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3), + motive (fieldStrengthDeriv s μ ν) (fieldStrengthDeriv_mem_covariantAlgebra s μ ν)) + (lepton : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), + motive (Dψ l α) (Dψ_mem_covariantAlgebra l α)) + (conjLepton : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), + motive (Dbarψ l α) (Dbarψ_mem_covariantAlgebra l α)) + (algebraMap : ∀ r : ℂ, motive (algebraMap ℂ JetAlgebra r) + (Subalgebra.algebraMap_mem CovariantAlgebra r)) + (add : ∀ (u v : JetAlgebra) (hu : u ∈ CovariantAlgebra) (hv : v ∈ CovariantAlgebra), + motive u hu → motive v hv → motive (u + v) (Subalgebra.add_mem _ hu hv)) + (mul : ∀ (u v : JetAlgebra) (hu : u ∈ CovariantAlgebra) (hv : v ∈ CovariantAlgebra), + motive u hu → motive v hv → motive (u * v) (Subalgebra.mul_mem _ hu hv)) + {x : JetAlgebra} (hx : x ∈ CovariantAlgebra) : motive x hx := by + induction hx using Algebra.adjoin_induction with + | mem z hz => + rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ + · exact fieldStrength p.1 p.2.1 p.2.2 + · exact lepton p.1 p.2 + · exact conjLepton p.1 p.2 + | algebraMap r => exact algebraMap r + | add u v hu hv ihu ihv => exact add u v hu hv ihu ihv + | mul u v hu hv ihu ihv => exact mul u v hu hv ihu ihv + +/-! + +## B. The linear-matter submodule -/ @@ -49,13 +129,13 @@ namespace JetAlgebra hypercharge characters. -/ noncomputable def LinearMatterSubmodule : Submodule ℂ JetAlgebra := Submodule.span ℂ {x : JetAlgebra | ∃ (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace), x = p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m} + (m : LeptonSinglet.JetComponentSpace), x = p ⊗ⱼ ExteriorAlgebra.ι ℂ m} /-- The spanning elements: a gauge-sector coefficient times a single matter component function. -/ lemma tmul_ι_mem_LinearMatterSubmodule (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (m : LeptonSinglet.JetComponentSpace) : - p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m ∈ LinearMatterSubmodule := + p ⊗ⱼ ExteriorAlgebra.ι ℂ m ∈ LinearMatterSubmodule := Submodule.subset_span ⟨p, m, rfl⟩ /-! @@ -78,12 +158,11 @@ lemma distrib_add_mul (a b c : JetAlgebra) : (a + b) * c = a * c + b * c := by g /-- Left distributivity on the jet algebra; see `distrib_add_mul`. -/ lemma distrib_mul_add (a b c : JetAlgebra) : a * (b + c) = a * b + a * c := by grind -set_option maxHeartbeats 1000000 in /-- Linear-matter elements anticommute against the spanning elements. -/ lemma tmul_ι_mul_add_swap_of_mem (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (m : LeptonSinglet.JetComponentSpace) {y : JetAlgebra} (hy : y ∈ LinearMatterSubmodule) : - (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * y + y * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = 0 := by + (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * y + y * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) = 0 := by have hd₁ := distrib_add_mul have hd₂ := distrib_mul_add have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a @@ -95,16 +174,16 @@ lemma tmul_ι_mul_add_swap_of_mem (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) induction hy using Submodule.span_induction with | mem z hz => obtain ⟨q, n, rfl⟩ := hz - rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - mul_comm q p, ← TensorProduct.tmul_add, ExteriorAlgebra.ι_add_mul_swap, - TensorProduct.tmul_zero] + rw [tmul_mul_tmul, tmul_mul_tmul, + mul_comm q p, tmul_add_tmul_right, ExteriorAlgebra.ι_add_mul_swap, + tmul_zero] | zero => rw [hz₂, hz₁, add_zero] | add u v _ _ hu hv => rw [hd₂, hd₁] - calc (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + - (u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) = - ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * u + u * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) + - ((p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) * v + v * (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m)) := by + calc (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * u + (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * v + + (u * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) + v * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m)) = + ((p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * u + u * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m)) + + ((p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * v + v * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m)) := by abel _ = 0 := by rw [hu, hv, add_zero] | smul c u _ hu => @@ -169,9 +248,9 @@ lemma dB_mul_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} obtain ⟨p, m, rfl⟩ := hz rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] + (BBoson.JetGenerators.dB {} μ)) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, - Algebra.TensorProduct.tmul_mul_tmul, one_mul] + tmul_mul_tmul, one_mul] exact tmul_ι_mem_LinearMatterSubmodule _ _ | zero => rw [hz₂]; exact Submodule.zero_mem _ | add u v _ _ hu hv => rw [hd₂]; exact Submodule.add_mem _ hu hv @@ -182,7 +261,7 @@ lemma Dψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : Dψ l α ∈ LinearMatterSubmodule := by induction l with | nil => - rw [show Dψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + rw [show Dψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ⱼ ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dψ {} α)) from rfl] exact tmul_ι_mem_LinearMatterSubmodule _ _ | cons ν l ih => @@ -196,7 +275,7 @@ lemma Dbarψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) Dbarψ l α ∈ LinearMatterSubmodule := by induction l with | nil => - rw [show Dbarψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] + rw [show Dbarψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ⱼ ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl] exact tmul_ι_mem_LinearMatterSubmodule _ _ | cons ν l ih => @@ -239,18 +318,17 @@ lemma covExtHom_ι (m : LeptonSinglet.JetComponentSpace) : /-- Elements of the B-boson factor are central in the lepton–gauge-sector jet algebra. -/ lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : - (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * y = - y * (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) := by + (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * y = + y * (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) := by have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind have hd₂ := distrib_mul_add have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction y using TensorProduct.induction_on with + induction y using JetAlgebra.induction_on with | zero => rw [hz₂, hz₁] | add a b ha hb => simp only [hd₁, hd₂, ha, hb] | tmul q l => - rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - mul_comm, one_mul, mul_one] + rw [tmul_mul_tmul, tmul_mul_tmul, mul_comm, one_mul, mul_one] /-- The covariant substitution: the algebra endomorphism of the lepton–gauge-sector jet algebra fixing the B-boson factor and sending each plain fermionic generator to its @@ -260,23 +338,22 @@ noncomputable def covSubst : JetAlgebra →ₐ[ℂ] JetAlgebra := (fun p y => (tmul_one_mul_comm p (covExtHom y))) lemma covSubst_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - covSubst (p ⊗ₜ[ℂ] l) = (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := by - rw [covSubst, Algebra.TensorProduct.lift_tmul] - rfl + covSubst (p ⊗ⱼ l) = (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := rfl @[simp] lemma covSubst_tmul_one (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - covSubst (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = p ⊗ₜ[ℂ] 1 := by + covSubst (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = p ⊗ⱼ 1 := by have h1 : covExtHom (1 : LeptonSinglet.JetAlgebra) = 1 := covExtHom.map_one have hmul : ∀ a : JetAlgebra, a * 1 = a := fun a => mul_one a rw [covSubst_tmul, h1, hmul] @[simp] lemma covSubst_one_tmul_ι (m : LeptonSinglet.JetComponentSpace) : - covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = + covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ ExteriorAlgebra.ι ℂ m) = covMap m := by have hone : ∀ a : JetAlgebra, 1 * a = a := fun a => one_mul a - rw [covSubst_tmul, covExtHom_ι, ← Algebra.TensorProduct.one_def, hone] + rw [covSubst_tmul, covExtHom_ι, ← one_eq_tmul, hone] + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean index 63402a286..075ea45bf 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean @@ -16,7 +16,6 @@ covariant substitution that trades the plain fermionic coordinates for them. @[expose] public section -set_option maxHeartbeats 1000000 namespace LeptonGaugeSector open TensorProduct StandardModel @@ -85,8 +84,8 @@ lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : congr 1 simp only [ofGenerator] rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, + simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, tmul_zero, + TensorProduct.zero_tmul, zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] /-- One covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` for the conjugate @@ -129,8 +128,8 @@ lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : congr 1 simp only [ofGenerator] rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, zero_add, + simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, tmul_zero, + TensorProduct.zero_tmul, zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean index ccf6ce644..7afea684f 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeAction /-! # The derivative-order filtration @@ -17,7 +17,6 @@ generators, which the filtration is built to prove. @[expose] public section -set_option maxHeartbeats 1000000 namespace LeptonGaugeSector open TensorProduct StandardModel @@ -39,13 +38,13 @@ filtration. def filtGen (d : ℕ) : Set JetAlgebra := {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), (l.map genDeg).sum ≤ d ∧ - z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} + z = c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} /-- The generating set of the strict degree filtration. -/ def sfiltGen (d : ℕ) : Set JetAlgebra := {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), (l.map genDeg).sum < d ∧ - z = c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} + z = c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} /-- The filtration of the lepton–gauge-sector jet algebra by total fermionic derivative degree. -/ noncomputable def filt (d : ℕ) : Submodule ℂ JetAlgebra := @@ -99,7 +98,7 @@ lemma mul_mem_filt {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ · rw [List.map_append, List.sum_append] omega - · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + · rw [tmul_mul_tmul, List.map_append, List.prod_append] | zero => rw [hz₂]; exact zero_mem _ | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih @@ -126,7 +125,7 @@ lemma mul_mem_sfilt_left {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ sfilt a) refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ · rw [List.map_append, List.sum_append] omega - · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + · rw [tmul_mul_tmul, List.map_append, List.prod_append] | zero => rw [hz₂]; exact zero_mem _ | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih @@ -153,7 +152,7 @@ lemma mul_mem_sfilt_right {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ · rw [List.map_append, List.sum_append] omega - · rw [Algebra.TensorProduct.tmul_mul_tmul, List.map_append, List.prod_append] + · rw [tmul_mul_tmul, List.map_append, List.prod_append] | zero => rw [hz₂]; exact zero_mem _ | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih @@ -162,11 +161,11 @@ lemma mul_mem_sfilt_right {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih lemma exists_forall_tmul_mem_filt (l : LeptonSinglet.JetAlgebra) : - ∃ d, ∀ c : ℂ ⊗[ℝ] BBoson.JetAlgebra, c ⊗ₜ[ℂ] l ∈ filt d := by + ∃ d, ∀ c : ℂ ⊗[ℝ] BBoson.JetAlgebra, c ⊗ⱼ l ∈ filt d := by induction l using ExteriorAlgebra.induction with | algebraMap r => refine ⟨0, fun c => ?_⟩ - rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] + rw [Algebra.algebraMap_eq_smul_one, tmul_smul] refine Submodule.smul_mem _ _ (Submodule.subset_span ⟨c, [], by simp, ?_⟩) simp | ι m => @@ -180,9 +179,9 @@ lemma exists_forall_tmul_mem_filt (l : LeptonSinglet.JetAlgebra) : refine Finset.sum_congr rfl fun g _ => ?_ rw [map_smul] rfl - rw [hm, Finsupp.sum, TensorProduct.tmul_sum] + rw [hm, Finsupp.sum, tmul_sum] refine Submodule.sum_mem _ fun g hg => ?_ - rw [TensorProduct.tmul_smul] + rw [tmul_smul] refine Submodule.smul_mem _ _ (filt_mono (Finset.le_sup hg) (Submodule.subset_span ⟨c, [g], by simp, ?_⟩)) simp @@ -190,22 +189,22 @@ lemma exists_forall_tmul_mem_filt (l : LeptonSinglet.JetAlgebra) : obtain ⟨dx, hdx⟩ := hx obtain ⟨dy, hdy⟩ := hy refine ⟨dx + dy, fun c => ?_⟩ - rw [show c ⊗ₜ[ℂ] (x * y) = (c ⊗ₜ[ℂ] x) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] y) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one]] + rw [show c ⊗ⱼ (x * y) = (c ⊗ⱼ x) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ y) from by + rw [tmul_mul_tmul, mul_one]] exact mul_mem_filt (hdx c) (hdy 1) | add x y hx hy => obtain ⟨dx, hdx⟩ := hx obtain ⟨dy, hdy⟩ := hy refine ⟨max dx dy, fun c => ?_⟩ - rw [TensorProduct.tmul_add] + rw [tmul_add] exact add_mem (filt_mono (le_max_left _ _) (hdx c)) (filt_mono (le_max_right _ _) (hdy c)) /-- Every element of the lepton–gauge-sector jet algebra has bounded fermionic derivative degree. -/ lemma exists_mem_filt (x : JetAlgebra) : ∃ d, x ∈ filt d := by - induction x using TensorProduct.induction_on with + induction x using JetAlgebra.induction_on with | zero => exact ⟨0, zero_mem _⟩ | add a b ha hb => obtain ⟨d1, h1⟩ := ha @@ -221,7 +220,7 @@ lemma exists_mem_filt (x : JetAlgebra) : ∃ d, x ∈ filt d := by noncomputable def oddLow (d : ℕ) : Submodule ℂ JetAlgebra := Submodule.span ℂ {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (g : LeptonSinglet.JetGenerators), - genDeg g < d ∧ z = c ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator g} + genDeg g < d ∧ z = c ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g} lemma oddLow_le_sfilt (d : ℕ) : oddLow d ≤ sfilt d := by refine Submodule.span_le.mpr ?_ @@ -233,21 +232,19 @@ lemma genDeg_shift (μ : Fin 1 ⊕ Fin 3) (g : LeptonSinglet.JetGenerators) : genDeg (LeptonSinglet.JetGenerators.shift μ g) = genDeg g + 1 := by cases g <;> simp [genDeg, LeptonSinglet.JetGenerators.shift] -set_option maxHeartbeats 1000000 in /-- Multiplication by the gauge field acts on the B-boson coefficient of an odd element. -/ lemma dB_mul_tmul (μ : Fin 1 ⊕ Fin 3) (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : LeptonSinglet.JetAlgebra) : - ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * (c ⊗ₜ[ℂ] y) = + ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * (c ⊗ⱼ y) = (((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * c) - ⊗ₜ[ℂ] y := by + ⊗ⱼ y := by have hone : ∀ z : LeptonSinglet.JetAlgebra, 1 * z = z := fun z => one_mul z rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) ⊗ₜ[ℂ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, - Algebra.TensorProduct.tmul_mul_tmul, hone] + tmul_mul_tmul, hone] -set_option maxHeartbeats 1000000 in lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} (hx : x ∈ oddLow d) : covariantStep μ x ∈ oddLow (d + 1) := by have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y @@ -265,7 +262,6 @@ lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih -set_option maxHeartbeats 1000000 in lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} (hx : x ∈ oddLow d) : covariantStepBar μ x ∈ oddLow (d + 1) := by have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y @@ -283,33 +279,32 @@ lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgeb | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih -set_option maxHeartbeats 4000000 in /-- The covariant derivative of the lepton is its plain derivative generator up to strictly-lower-degree odd terms. -/ lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + Dψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑l) α) ∈ oddLow l.length := by induction l with | nil => rw [Dψ_nil, show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] rfl, sub_self] exact zero_mem _ | cons μ t ih => - set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑t) α) with hL have hstep : Dψ (μ :: t) α = covariantStep μ L + covariantStep μ (Dψ t α - L) := by have h := (covariantStep μ).map_add L (Dψ t α - L) rw [add_sub_cancel] at h rw [Dψ_cons, h] - have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) - ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by rw [covariantStep_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, - TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, + TensorProduct.tmul_zero, zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dψ, show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by @@ -324,34 +319,33 @@ lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : rw [hstep, hleadEq, habel] exact sub_mem hmem2 (Submodule.smul_mem _ _ hmem1) -set_option maxHeartbeats 4000000 in /-- The covariant derivative of the conjugate lepton is its plain derivative generator up to strictly-lower-degree odd terms. -/ lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + Dbarψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑l) α) ∈ oddLow l.length := by induction l with | nil => rw [Dbarψ_nil, show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.ofGenerator + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] rfl, sub_self] exact zero_mem _ | cons μ t ih => - set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑t) α) with hL have hstep : Dbarψ (μ :: t) α = covariantStepBar μ L + covariantStepBar μ (Dbarψ t α - L) := by have h := (covariantStepBar μ).map_add L (Dbarψ t α - L) rw [add_sub_cancel] at h rw [Dbarψ_cons, h] - have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) + ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by rw [covariantStepBar_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, - TensorProduct.tmul_zero, TensorProduct.zero_tmul, zero_add, + TensorProduct.tmul_zero, zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, LeptonSinglet.JetGenerators.shift_dbarψ, show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by @@ -369,7 +363,7 @@ lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : /-- The covariant generator is the plain generator up to strictly-lower-degree odd terms. -/ lemma covGenerator_sub_mem_oddLow (g : LeptonSinglet.JetGenerators) : - covGenerator g - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + covGenerator g - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g ∈ oddLow (genDeg g) := by cases g with | dψ s α => @@ -384,7 +378,7 @@ lemma covGenerator_sub_mem_oddLow (g : LeptonSinglet.JetGenerators) : lemma covGenerator_mem_filt (g : LeptonSinglet.JetGenerators) : covGenerator g ∈ filt (genDeg g) := by have h := sfilt_le_filt _ (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) - have hA : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + have hA : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g ∈ filt (genDeg g) := by refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ simp @@ -397,39 +391,38 @@ lemma prod_covGenerator_mem_filt (l : List LeptonSinglet.JetGenerators) : | nil => simp only [List.map_nil, List.prod_nil, List.sum_nil] refine Submodule.subset_span ⟨1, [], by simp, ?_⟩ - rw [List.map_nil, List.prod_nil, Algebra.TensorProduct.one_def] + rw [List.map_nil, List.prod_nil, one_eq_tmul] | cons g t ih => simp only [List.map_cons, List.prod_cons, List.sum_cons] exact mul_mem_filt (covGenerator_mem_filt g) ih -set_option maxHeartbeats 1000000 in /-- The product of covariant generators is the corresponding product of plain generators up to strictly-lower-degree terms. -/ lemma prod_covGenerator_sub_mem_sfilt (l : List LeptonSinglet.JetGenerators) : - (l.map covGenerator).prod - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (l.map covGenerator).prod - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod ∈ sfilt ((l.map genDeg).sum) := by induction l with | nil => simp only [List.map_nil, List.prod_nil, List.sum_nil] - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : - JetAlgebra) = 1 from (Algebra.TensorProduct.one_def).symm, sub_self] + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) : + JetAlgebra) = 1 from (one_eq_tmul).symm, sub_self] exact zero_mem _ | cons g t ih => simp only [List.map_cons, List.prod_cons, List.sum_cons] have hsub₁ : ∀ a b c : JetAlgebra, (a - b) * c = a * c - b * c := by grind have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - set A : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + set A : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g with hA - set Q : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + set Q : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod with hQ - have hAQ : A * Q = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + have hAQ : A * Q = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (LeptonSinglet.JetAlgebra.ofGenerator g * (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by - rw [hA, hQ, Algebra.TensorProduct.tmul_mul_tmul, mul_one] + rw [hA, hQ, tmul_mul_tmul, mul_one] have hkey : covGenerator g * (t.map covGenerator).prod - - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (LeptonSinglet.JetAlgebra.ofGenerator g * (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = (covGenerator g - A) * (t.map covGenerator).prod + @@ -446,7 +439,6 @@ lemma prod_covGenerator_sub_mem_sfilt (l : List LeptonSinglet.JetGenerators) : simp exact mul_mem_sfilt_right hAmem ih -set_option maxHeartbeats 1000000 in /-- Unitriangularity of the covariant substitution: it is the identity up to strictly-lower-degree terms. -/ lemma covSubst_sub_self_mem_sfilt {d : ℕ} {x : JetAlgebra} (hx : x ∈ filt d) : @@ -470,20 +462,20 @@ lemma covSubst_sub_self_mem_sfilt {d : ℕ} {x : JetAlgebra} (hx : x ∈ filt d) have hm : covExtHom (a * t.prod) = covExtHom a * covExtHom t.prod := map_mul covExtHom a t.prod rw [List.prod_cons, List.map_cons, List.prod_cons, hm, iht] - have hcs : covSubst (c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = - (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * (l.map covGenerator).prod := by + have hcs : covSubst (c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = + (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * (l.map covGenerator).prod := by rw [covSubst_tmul] congr 1 rw [hlp, List.map_map, show (⇑covExtHom ∘ LeptonSinglet.JetAlgebra.ofGenerator) = covGenerator from funext fun g => hgen g] - have hz2 : c ⊗ₜ[ℂ] (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod = - (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + have hz2 : c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod = + (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, hone] + rw [tmul_mul_tmul, honeB, hone] have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind - have hc1 : (c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) ∈ filt 0 := by + have hc1 : (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) ∈ filt 0 := by refine Submodule.subset_span ⟨c, [], by simp, ?_⟩ simp have hfin := mul_mem_sfilt_right hc1 (prod_covGenerator_sub_mem_sfilt l) @@ -562,9 +554,9 @@ set_option maxHeartbeats 2000000 in to be invariant under all Maurer–Cartan translations of the pure-gauge B-boson coordinates, hence to lie in the (complexified) field-strength subalgebra by the B-boson translation theorem. -/ -theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq +theorem mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq (x : JetAlgebra) (hx : ∀ U, repJetGaugeGroupI U x = x) : - x ∈ Algebra.adjoin ℂ invariantGenerators := by + x ∈ CovariantAlgebra := by classical obtain ⟨y, rfl⟩ := covSubst_surjective x have hyU : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), @@ -572,10 +564,12 @@ theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq (BBoson.JetAlgebra.expUnitary a w hw)) LinearMap.id y = y := by intro a w hw refine covSubst_injective ?_ + show covSubst (mapB (BBoson.JetAlgebra.complexRepJetGaugeGroupI + (BBoson.JetAlgebra.expUnitary a w hw)) y) = covSubst y rw [← repJetGaugeGroupI_covSubst _ (BBoson.JetAlgebra.eval_expUnitary_u1 a w hw), hx] set bL := Module.Basis.ofVectorSpace ℂ LeptonSinglet.JetAlgebra with hbL - set e : JetAlgebra ≃ₗ[ℂ] + set e : ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra) ≃ₗ[ℂ] (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra →₀ ℂ ⊗[ℝ] BBoson.JetAlgebra) := (TensorProduct.congr (LinearEquiv.refl ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra)) bL.repr).trans @@ -607,18 +601,18 @@ theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ (Set.range fun g : LeptonSinglet.JetGenerators => - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra)) with hS have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p have honeL : ∀ l : LeptonSinglet.JetAlgebra, 1 * l = l := fun l => one_mul l have hone_tmul : ∀ l : LeptonSinglet.JetAlgebra, - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l : JetAlgebra) ∈ Algebra.adjoin ℂ S := by + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l : JetAlgebra) ∈ Algebra.adjoin ℂ S := by intro l induction l using ExteriorAlgebra.induction with | algebraMap r => - rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul] + rw [Algebra.algebraMap_eq_smul_one, tmul_smul] refine Subalgebra.smul_mem _ ?_ _ - rw [← Algebra.TensorProduct.one_def] + rw [← one_eq_tmul] exact one_mem _ | ι m => have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = @@ -629,26 +623,26 @@ theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq refine Finset.sum_congr rfl fun g _ => ?_ rw [map_smul] rfl - rw [hm, Finsupp.sum, TensorProduct.tmul_sum] + rw [hm, Finsupp.sum, tmul_sum] refine sum_mem fun g _ => ?_ - rw [TensorProduct.tmul_smul] + rw [tmul_smul] refine Subalgebra.smul_mem _ (Algebra.subset_adjoin ?_) _ rw [hS] exact Set.mem_union_right _ ⟨g, rfl⟩ | mul u v hu hv => - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (u * v) : JetAlgebra) = - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] u) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] v) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeB]] + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (u * v) : JetAlgebra) = + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ u) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ v) from by + rw [tmul_mul_tmul, honeB]] exact mul_mem hu hv | add u v hu hv => - rw [TensorProduct.tmul_add] + rw [tmul_add] exact add_mem hu hv have hleft : ∀ c ∈ Algebra.adjoin ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] BBoson.JetAlgebra)), - ((c ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ + ((c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ Algebra.adjoin ℂ S := by intro c hc induction hc using Algebra.adjoin_induction with @@ -658,38 +652,39 @@ theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq rw [hS] exact Set.mem_union_left _ ⟨p, rfl⟩ | algebraMap z => - rw [Algebra.algebraMap_eq_smul_one, ← TensorProduct.smul_tmul'] + rw [Algebra.algebraMap_eq_smul_one, smul_tmul'] refine Subalgebra.smul_mem _ ?_ _ - rw [← Algebra.TensorProduct.one_def] + rw [← one_eq_tmul] exact one_mem _ | add u v hu hv ihu ihv => - rw [TensorProduct.add_tmul] + rw [add_tmul] exact add_mem ihu ihv | mul u v hu hv ihu ihv => - rw [show ((u * v) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) : JetAlgebra) = - (u ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - (v ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeL]] + rw [show ((u * v) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) : JetAlgebra) = + (u ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * + (v ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) from by + rw [tmul_mul_tmul, honeL]] exact mul_mem ihu ihv have hsymm_single : ∀ (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra) (c : ℂ ⊗[ℝ] BBoson.JetAlgebra), - e.symm (Finsupp.single T c) = c ⊗ₜ[ℂ] (bL T) := by + e.symm (Finsupp.single T c) = c ⊗ⱼ (bL T) := by intro T c rw [hedef, LinearEquiv.symm_trans_apply, TensorProduct.finsuppScalarRight_symm_apply_single, TensorProduct.congr_symm_tmul] simp only [LinearEquiv.refl_symm, LinearEquiv.refl_apply, Module.Basis.repr_symm_single_one] - have hdecomp : y = ((e y).support).sum (fun T => (e y T) ⊗ₜ[ℂ] (bL T)) := by + rfl + have hdecomp : y = ((e y).support).sum (fun T => (e y T) ⊗ⱼ (bL T)) := by conv_lhs => rw [← e.symm_apply_apply y, ← Finsupp.sum_single (e y)] rw [Finsupp.sum, map_sum] exact Finset.sum_congr rfl fun T _ => hsymm_single T _ have hyMem : y ∈ Algebra.adjoin ℂ S := by rw [hdecomp] refine sum_mem fun T _ => ?_ - rw [show ((e y T) ⊗ₜ[ℂ] (bL T) : JetAlgebra) = - ((e y T) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] (bL T)) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, honeB, honeL]] + rw [show ((e y T) ⊗ⱼ (bL T) : JetAlgebra) = + ((e y T) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (bL T)) from by + rw [tmul_mul_tmul, honeB, honeL]] exact mul_mem (hleft _ (hcT T)) (hone_tmul _) have himg : covSubst y ∈ (Algebra.adjoin ℂ S).map covSubst := Subalgebra.mem_map.mpr ⟨y, hyMem, rfl⟩ @@ -700,15 +695,15 @@ theorem mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq · show covSubst (fieldStrengthDeriv p.1 p.2.1 p.2.2) ∈ Algebra.adjoin ℂ invariantGenerators rw [show (fieldStrengthDeriv p.1 p.2.1 p.2.2 : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2) ⊗ₜ[ℂ] + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, covSubst_tmul_one] exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from Set.mem_union_left _ (Set.mem_union_left _ ⟨p, rfl⟩)) - · show covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + · show covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g) ∈ Algebra.adjoin ℂ invariantGenerators - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis g) from rfl, covSubst_one_tmul_ι, covMap_basis] cases g with diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean index 103685390..dea32ad1d 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean @@ -19,7 +19,6 @@ lying in the commutative bosonic factor. @[expose] public section -set_option maxHeartbeats 1000000 namespace LeptonGaugeSector open TensorProduct StandardModel @@ -30,7 +29,7 @@ namespace JetAlgebra algebra. -/ noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ₜ[ℂ] 1 + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ⱼ 1 /-- Antisymmetry of the embedded field-strength derivatives in the two field @@ -42,7 +41,7 @@ lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) [JetGenerators.dB (s + {a}) b]ₐ - [JetGenerators.dB (s + {b}) a]ₐ := by intro a b rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] + TensorProduct.tmul_sub, sub_tmul] rfl rw [h, h, neg_sub] @@ -60,7 +59,7 @@ lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = [JetGenerators.dB (s + {μ}) μ]ₐ - [JetGenerators.dB (s + {μ}) μ]ₐ := by rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] + TensorProduct.tmul_sub, sub_tmul] rfl rw [h, sub_self] @@ -70,10 +69,9 @@ lemma fieldStrengthDeriv_mul_comm (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ ν ρ τ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' ρ τ = fieldStrengthDeriv s' ρ τ * fieldStrengthDeriv s μ ν := by - rw [fieldStrengthDeriv, fieldStrengthDeriv, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul, - mul_comm (BBoson.JetAlgebra.fieldStrengthDeriv s μ ν)] + rw [fieldStrengthDeriv, fieldStrengthDeriv, tmul_mul_tmul, tmul_mul_tmul] + congr 1 + exact mul_comm _ _ end JetAlgebra diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean index 4536bccb1..235582495 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean @@ -17,7 +17,6 @@ and at its conjugate. @[expose] public section -set_option maxHeartbeats 1000000 namespace LeptonGaugeSector open TensorProduct StandardModel @@ -44,28 +43,39 @@ lemma repJetGaugeGroupI_eq_algHom (g : JetGaugeGroupI) (x : JetAlgebra) : (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom g) (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom g) x := rfl -lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : - repJetGaugeGroupI g (x * y) = - repJetGaugeGroupI g x * repJetGaugeGroupI g y := by - simp [repJetGaugeGroupI_eq_algHom] - -lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : - repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by - simp [repJetGaugeGroupI_eq_algHom] - lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ₜ[ℂ] l) = - (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ₜ[ℂ] + repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ⱼ l) = + (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ⱼ LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl /-- The gauge action on a pure tensor of the two jet-algebra factors. -/ lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := by - rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul] + repJetGaugeGroupI U (p ⊗ⱼ l) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ + (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := rfl + +lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI g (x * y) = + repJetGaugeGroupI g x * repJetGaugeGroupI g y := by + induction x using JetAlgebra.induction_on with + | zero => simp + | add a b ha hb => simp only [add_mul, map_add, ha, hb] + | tmul p l => + induction y using JetAlgebra.induction_on with + | zero => simp + | add a b ha hb => simp only [mul_add, map_add, ha, hb] + | tmul q k => + simp only [tmul_mul_tmul, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_mul] + +lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : + repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by + rw [one_eq_tmul, repJetGaugeGroupI_tmul', + BBoson.JetAlgebra.complexRepJetGaugeGroupI_one, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, ← one_eq_tmul] /-- The gauge action on a spanning element of the linear-matter submodule: it acts on the two factors separately, leaving the matter degree at one. This is @@ -73,8 +83,8 @@ lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetA whose gauge action is functorial in the component space. -/ lemma repJetGaugeGroupI_tmul_ι (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (m : LeptonSinglet.JetComponentSpace) : - repJetGaugeGroupI U (p ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ m) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] + repJetGaugeGroupI U (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U m) := by rw [repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι] @@ -88,7 +98,7 @@ lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, - Submonoid.smul_def, Submonoid.smul_def, TensorProduct.tmul_smul] + Submonoid.smul_def, Submonoid.smul_def, tmul_smul] lemma repJetGaugeGroupI_dψ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : repJetGaugeGroupI U [.dψ s α]ₐ = @@ -105,13 +115,11 @@ lemma repJetGaugeGroupI_apply_dB (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ F [JetGenerators.dB s μ]ₐ + (BBoson.mcShift U (.basis (.dB s μ))) • 1 := by rw [ofGenerator_B_eq, repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, TensorProduct.add_tmul, - TensorProduct.smul_tmul'] + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, add_tmul, smul_tmul'] rfl -set_option maxHeartbeats 1000000 in /-- The statement that if `x` and all its derivatives transform in the same way that `ψ` transforms under the full gauge group, then `covariantStep μ x` transforms this.-/ @@ -312,8 +320,7 @@ noncomputable def leptonLinearIncl : TensorProduct.map LinearMap.id leptonComponentIncl lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : - leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] leptonComponentIncl a := by - simp [leptonLinearIncl] + leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ⱼ leptonComponentIncl a := rfl /-- The derivative action of a jet on the zeroth-order lepton component: the scalar action of its value at the base point. -/ @@ -418,7 +425,7 @@ lemma one_mul_complex (z : ℂ ⊗[ℝ] BBoson.JetAlgebra) : induction z using TensorProduct.induction_on with | zero => simp | add a b ha hb => simp only [mul_add, ha, hb] - | tmul c b => simp [Algebra.TensorProduct.tmul_mul_tmul] + | tmul c b => simp [tmul_mul_tmul] /-- The gauge action commutes with the covariant step up to the gauge action of the zeroth anomaly operator. This is where the hypothesis relating `χ` and `c` @@ -507,8 +514,8 @@ lemma anomalyM_covStepM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin lemma anomalyM_baseM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : W) : anomalyM U c s μ (baseM φ) = 0 := by rw [baseM, anomalyM_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, - TensorProduct.zero_tmul, actionC_one_tmul, + simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, tmul_zero, + TensorProduct.zero_tmul, zero_tmul, actionC_one_tmul, BBoson.constantCoeff_mcShiftSeries, TensorProduct.tmul_smul, smul_smul, zero_add] module @@ -567,7 +574,7 @@ lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) leptonComponentIncl_apply, covariantStep_apply, map_add, map_smul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, - Algebra.TensorProduct.tmul_mul_tmul, one_mul] + tmul_mul_tmul, one_mul] module exact LinearMap.congr_fun key x @@ -580,8 +587,7 @@ lemma repJetGaugeGroupI_leptonLinearIncl (U : JetGaugeGroupI) leptonLinearIncl ∘ₗ (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by refine TensorProduct.ext' fun p a => ?_ simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, repM_tmul, - leptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, - TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + leptonComponentIncl_apply, repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl', actionC] exact LinearMap.congr_fun key x @@ -648,8 +654,7 @@ noncomputable def conjLeptonLinearIncl : lemma conjLeptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : - conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ₜ[ℂ] conjLeptonComponentIncl a := by - simp [conjLeptonLinearIncl] + conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ⱼ conjLeptonComponentIncl a := rfl /-- The conjugate lepton acts through `χ = star u ^ 6` with coupling `c = +6i`. -/ lemma pderiv_star_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : @@ -671,7 +676,7 @@ lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) conjLeptonComponentIncl_apply, covariantStepBar_apply, map_add, map_smul, jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, LeptonSinglet.JetComponentSpace.jetDeriv_inr', ofGenerator, shiftC, - Algebra.TensorProduct.tmul_mul_tmul, one_mul] + tmul_mul_tmul, one_mul] exact LinearMap.congr_fun key x /-- The inclusion intertwines the gauge actions. -/ @@ -683,8 +688,7 @@ lemma repJetGaugeGroupI_conjLeptonLinearIncl (U : JetGaugeGroupI) conjLeptonLinearIncl ∘ₗ (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by refine TensorProduct.ext' fun p a => ?_ simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, repM_tmul, - conjLeptonComponentIncl_apply, repJetGaugeGroupI, Representation.tprod_apply, - TensorProduct.map_tmul, LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + conjLeptonComponentIncl_apply, repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr', actionC] exact LinearMap.congr_fun key x @@ -717,6 +721,108 @@ lemma repJetGaugeGroupI_Dbarψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) rw [Dbarψ_eq_conjLeptonLinearIncl, repJetGaugeGroupI_conjLeptonLinearIncl, repM_DM U _ _ (pderiv_star_pow_six U), map_smul, ← Dbarψ_eq_conjLeptonLinearIncl, Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] + +/-! + +## C. The invariant generators and the gauge action as an algebra homomorphism + +The field strengths of the B boson, embedded in the lepton–gauge-sector jet algebra, are exactly +invariant; the covariant derivatives of the lepton and of its conjugate transform +by the hypercharge characters `u(0)^6` and `u(0)^{-6}` of the value of the gauge +jet at the base point. The gauge invariants of the lepton–gauge-sector jet algebra are contained +in the algebra generated by these three families. + +-/ + +/-! + +### The gauge action as an algebra homomorphism, and the intertwining + +-/ + +/-- The complexified B-boson gauge action as an algebra homomorphism. -/ +noncomputable def complexRepAlgHom (U : JetGaugeGroupI) : + (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra) := + AlgHom.ofLinearMap (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) + (by + rw [Algebra.TensorProduct.one_def, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul, + BBoson.JetAlgebra.repJetGaugeGroupI_apply_one]) + (BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul U) + +@[simp] +lemma complexRepAlgHom_apply (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + complexRepAlgHom U p = BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := rfl + +/-- The gauge action as an algebra homomorphism. -/ +noncomputable def repAlgHom (U : JetGaugeGroupI) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (complexRepAlgHom U) + (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) + +lemma repAlgHom_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) + (l : LeptonSinglet.JetAlgebra) : + repAlgHom U (p ⊗ⱼ l) = (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ + (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U) l) := rfl + +lemma repJetGaugeGroupI_eq_repAlgHom (U : JetGaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI U x = repAlgHom U x := by + induction x using JetAlgebra.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb] + | tmul p l => + rw [repJetGaugeGroupI_tmul'] + rfl + +/-- The gauge action is multiplicative (term-level form avoiding elaboration + blowups on the tensor stack). -/ +lemma repJetGaugeGroupI_mul' (U : JetGaugeGroupI) (a b : JetAlgebra) : + repJetGaugeGroupI U (a * b) = + repJetGaugeGroupI U a * repJetGaugeGroupI U b := + (repJetGaugeGroupI_eq_repAlgHom U (a * b)).trans + ((map_mul (repAlgHom U) a b).trans + (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom U a).symm + (repJetGaugeGroupI_eq_repAlgHom U b).symm)) + +set_option maxHeartbeats 400000 in +/-- On gauge jets with trivial value at the base point, the covariant elements + are exactly invariant, so the gauge action intertwines the covariant + substitution with the B-boson action alone. -/ +lemma repJetGaugeGroupI_covSubst (U : JetGaugeGroupI) (hU : U.eval.2.2 = 1) + (x : JetAlgebra) : + repJetGaugeGroupI U (covSubst x) = + covSubst (mapB (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) x) := by + have hcovfix : (repAlgHom U).comp covExtHom = covExtHom := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) + simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, + AlgHom.toLinearMap_apply, covExtHom_ι] + have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = covMap := by + refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ + rw [LinearMap.comp_apply, covMap_basis, AlgHom.toLinearMap_apply, + ← repJetGaugeGroupI_eq_repAlgHom] + cases g with + | dψ s α => + rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, + repJetGaugeGroupI_Dψ, hU, one_pow, one_smul] + | dbarψ s α => + rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, + repJetGaugeGroupI_Dbarψ, hU, star_one, one_pow, one_smul] + exact LinearMap.congr_fun hlin m + induction x using JetAlgebra.induction_on with + | zero => rw [map_zero, map_zero, map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, map_add, map_add, ha, hb] + | tmul p l => + rw [mapB_tmul, covSubst_tmul, covSubst_tmul] + rw [repJetGaugeGroupI_eq_repAlgHom] + have hm : repAlgHom U ((p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * covExtHom l) = + repAlgHom U (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * + repAlgHom U (covExtHom l) := map_mul _ _ _ + have h1 : repAlgHom U (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = + (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ 1 := by + rw [repAlgHom_tmul] + congr 1 + exact (ExteriorAlgebra.map _).map_one + have h2 : repAlgHom U (covExtHom l) = covExtHom l := AlgHom.congr_fun hcovfix l + rw [hm, h1, h2] + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean index 1cdb4edd6..e55e3990c 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean @@ -5,135 +5,110 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeAction +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.DerivativeOrder /-! -# The invariant generators of the lepton–gauge-sector jet algebra +# Invariance in the lepton–gauge-sector jet algebra -The generating set of the gauge invariants — the embedded field-strength -derivatives together with the covariant derivatives of the lepton and of its -conjugate — and the gauge action written as an algebra homomorphism, which is -what lets the invariance of a product be read off its factors. +An element of the jet algebra is invariant when it is fixed by the jet gauge group and by the +Lorentz group. This file defines that condition, collects the invariants into a submodule, +and characterises them: an element is invariant exactly when it lies in the algebra generated +by the field-strength derivatives and the covariant derivatives, is fixed by the constant +gauge transformations, and is Lorentz invariant. + +The forward direction is `mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq`, proved +through the derivative-order filtration; the backward direction holds because a jet of gauge +transformations acts on the covariant generators only through its value at the base point. -/ @[expose] public section -set_option maxHeartbeats 1000000 - namespace LeptonGaugeSector open TensorProduct StandardModel namespace JetAlgebra -/-! - -## Invariants of the lepton–gauge-sector jet algebra - -The field strengths of the B boson, embedded in the lepton–gauge-sector jet algebra, are exactly -invariant; the covariant derivatives of the lepton and of its conjugate transform -by the hypercharge characters `u(0)^6` and `u(0)^{-6}` of the value of the gauge -jet at the base point. The gauge invariants of the lepton–gauge-sector jet algebra are contained -in the algebra generated by these three families. - --/ - -/-- The generating set of the invariants of the lepton–gauge-sector jet algebra: the embedded - field-strength derivatives together with the covariant derivatives of the - lepton and of its conjugate. -/ -noncomputable def invariantGenerators : Set JetAlgebra := - (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ - (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dψ p.1 p.2) ∪ - (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ p.1 p.2) +open Matrix MatrixGroups /-! -### The gauge action as an algebra homomorphism, and the intertwining +## A. The invariance condition -/ -/-- The complexified B-boson gauge action as an algebra homomorphism. -/ -noncomputable def complexRepAlgHom (U : JetGaugeGroupI) : - (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra) := - AlgHom.ofLinearMap (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) - (by - rw [Algebra.TensorProduct.one_def, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul, - BBoson.JetAlgebra.repJetGaugeGroupI_apply_one]) - (BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul U) - -@[simp] -lemma complexRepAlgHom_apply (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - complexRepAlgHom U p = BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := rfl - -/-- The gauge action as an algebra homomorphism. -/ -noncomputable def repAlgHom (U : JetGaugeGroupI) : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.map (complexRepAlgHom U) - (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) - -set_option maxHeartbeats 1000000 in -lemma repJetGaugeGroupI_eq_repAlgHom (U : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI U x = repAlgHom U x := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb] - | tmul p l => - rw [show repJetGaugeGroupI U (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) from by - rw [repJetGaugeGroupI, Representation.tprod_apply, TensorProduct.map_tmul], - repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply] - -/-- The gauge action is multiplicative (term-level form avoiding elaboration - blowups on the tensor stack). -/ -lemma repJetGaugeGroupI_mul' (U : JetGaugeGroupI) (a b : JetAlgebra) : - repJetGaugeGroupI U (a * b) = - repJetGaugeGroupI U a * repJetGaugeGroupI U b := - (repJetGaugeGroupI_eq_repAlgHom U (a * b)).trans - ((map_mul (repAlgHom U) a b).trans - (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom U a).symm - (repJetGaugeGroupI_eq_repAlgHom U b).symm)) - -set_option maxHeartbeats 1000000 in -/-- On gauge jets with trivial value at the base point, the covariant elements - are exactly invariant, so the gauge action intertwines the covariant - substitution with the B-boson action alone. -/ -lemma repJetGaugeGroupI_covSubst (U : JetGaugeGroupI) (hU : U.eval.2.2 = 1) - (x : JetAlgebra) : - repJetGaugeGroupI U (covSubst x) = - covSubst (TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) - LinearMap.id x) := by - have hcovfix : (repAlgHom U).comp covExtHom = covExtHom := by - refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) - simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, - AlgHom.toLinearMap_apply, covExtHom_ι] - have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = covMap := by - refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ - rw [LinearMap.comp_apply, covMap_basis, AlgHom.toLinearMap_apply, - ← repJetGaugeGroupI_eq_repAlgHom] - cases g with - | dψ s α => - rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, - repJetGaugeGroupI_Dψ, hU, one_pow, one_smul] - | dbarψ s α => - rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, - repJetGaugeGroupI_Dbarψ, hU, star_one, one_pow, one_smul] - exact LinearMap.congr_fun hlin m - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul p l => - simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, covSubst_tmul] - rw [repJetGaugeGroupI_eq_repAlgHom] - have hm : repAlgHom U ((p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * covExtHom l) = - repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * - repAlgHom U (covExtHom l) := map_mul _ _ _ - have h1 : repAlgHom U (p ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] 1 := by - rw [repAlgHom, Algebra.TensorProduct.map_tmul, complexRepAlgHom_apply] - congr 1 - exact (ExteriorAlgebra.map _).map_one - have h2 : repAlgHom U (covExtHom l) = covExtHom l := AlgHom.congr_fun hcovfix l - rw [hm, h1, h2] +def IsInvariant (x : JetAlgebra) : Prop := + (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) + ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) + +lemma IsInvariant.add {x y : JetAlgebra} (hx : IsInvariant x) (hy : IsInvariant y) : + IsInvariant (x + y) := by + constructor + · intro U + simp [hx.left, hy.left] + · intro Λ + simp [hx.right, hy.right] + +lemma IsInvariant.smul {x : JetAlgebra} (hx : IsInvariant x) (r : ℂ) : + IsInvariant (r • x) := by + constructor + · intro U + simp [hx.left] + · intro Λ + simp [hx.right] + +noncomputable def InvariantSubmodule : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x | IsInvariant x} + +lemma InvariantSubmodule.mem_iff_isInvariant (x : JetAlgebra) : + x ∈ InvariantSubmodule ↔ IsInvariant x := by + constructor + · intro hx + induction hx using Submodule.span_induction with + | mem y hy => exact hy + | zero => exact ⟨fun U => map_zero _, fun Λ => map_zero _⟩ + | add y z hy hz ihy ihz => + exact ⟨fun U => by rw [map_add, ihy.1 U, ihz.1 U], + fun Λ => by rw [map_add, ihy.2 Λ, ihz.2 Λ]⟩ + | smul c y hy ihy => + exact ⟨fun U => by rw [map_smul, ihy.1 U], + fun Λ => by rw [map_smul, ihy.2 Λ]⟩ + · exact fun hx => Submodule.subset_span hx + + +/-- Characterisation of the invariants of the lepton–gauge-sector jet algebra: an element is + invariant under the jet gauge group and the Lorentz group precisely when it lies in the + covariant subalgebra, is fixed by the constant gauge transformations, and is Lorentz + invariant. The forward direction is the classification theorem; the backward direction holds + because a jet of gauge transformations acts on the covariant generators only through its + value at the base point. -/ +lemma isInvariant_iff_mem_covariantAlgebra (x : JetAlgebra) : + IsInvariant x ↔ x ∈ CovariantAlgebra ∧ + (∀ g : GaugeGroupI, repJetGaugeGroupI (.ofConstant g) x = x) ∧ + (∀ Λ : SL(2, ℂ), repLorentzGroup Λ x = x) := by + constructor + · intro h + exact ⟨mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq x h.1, fun g => h.1 _, h.2⟩ + · rintro ⟨hmem, hconst, hlor⟩ + refine ⟨fun U => ?_, hlor⟩ + suffices hkey : repJetGaugeGroupI U x = + repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) x by + rw [hkey] + exact hconst U.eval + clear hconst hlor + induction hmem using CovariantAlgebra.induction_on with + | fieldStrength s μ ν => + rw [repJetGaugeGroupI_fieldStrengthDeriv, repJetGaugeGroupI_fieldStrengthDeriv] + | lepton l α => + rw [repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant] + | conjLepton l α => + rw [repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, JetGaugeGroupI.eval_ofConstant] + | algebraMap r => + rw [Algebra.algebraMap_eq_smul_one, map_smul, map_smul, + repJetGaugeGroupI_apply_one, repJetGaugeGroupI_apply_one] + | add u v _ _ ihu ihv => rw [map_add, map_add, ihu, ihv] + | mul u v _ _ ihu ihv => + rw [repJetGaugeGroupI_apply_mul, repJetGaugeGroupI_apply_mul, ihu, ihv] + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean index 26ac55f54..35c5b1f4f 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean @@ -16,7 +16,6 @@ on the generators and its commutation relations. @[expose] public section -set_option maxHeartbeats 1000000 namespace LeptonGaugeSector open TensorProduct StandardModel @@ -43,50 +42,48 @@ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAl lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - jetDeriv μ (p ⊗ₜ[ℂ] l) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] l + - p ⊗ₜ[ℂ] LeptonSinglet.JetAlgebra.jetDeriv μ l := by - simp [jetDeriv] + jetDeriv μ (p ⊗ⱼ l) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ⱼ l + + p ⊗ⱼ LeptonSinglet.JetAlgebra.jetDeriv μ l := rfl @[simp] lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by - rw [show (1 : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, LinearMap.baseChange_tmul] - simp + have hB : LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 0 := by + rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, + LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero] + rw [one_eq_tmul, jetDeriv_tmul, hB, LeptonSinglet.JetAlgebra.jetDeriv_one, zero_tmul, + tmul_zero, add_zero] /-- The total derivative is an even derivation on the lepton–gauge-sector jet algebra: the Leibniz rule holds with no Koszul signs. -/ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by - have hdist₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hdist₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := by grind - have hzero₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hzero₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction x using TensorProduct.induction_on with - | zero => simp [hzero₁] + induction x using JetAlgebra.induction_on with + | zero => simp | add a b ha hb => - simp only [hdist₁, map_add, ha, hb] + simp only [add_mul, map_add, ha, hb] abel | tmul p l => - induction y using TensorProduct.induction_on with - | zero => simp [hzero₂] + induction y using JetAlgebra.induction_on with + | zero => simp | add a' b' ha' hb' => - simp only [hdist₂, map_add, ha', hb'] + simp only [mul_add, map_add, ha', hb'] abel | tmul p' l' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, jetDeriv_tmul, + simp only [tmul_mul_tmul, jetDeriv_tmul, BBoson.JetAlgebra.jetDeriv_baseChange_mul, LeptonSinglet.JetAlgebra.jetDeriv_mul, - TensorProduct.add_tmul, TensorProduct.tmul_add, hdist₁, hdist₂] + ← tmul_add_tmul_left, ← tmul_add_tmul_right, add_mul, mul_add, tmul_mul_tmul] abel lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by - induction x using TensorProduct.induction_on with + induction x using JetAlgebra.induction_on with | zero => simp | add a b ha hb => simp only [map_add, ha, hb] | tmul p l => - simp [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_comm μ ν, + simp only [jetDeriv_tmul, map_add, LeptonSinglet.JetAlgebra.jetDeriv_comm μ ν, BBoson.JetAlgebra.jetDeriv_baseChange_comm μ ν p] abel @@ -170,8 +167,8 @@ lemma ofGenerator_dB_eq_jetDerivM (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 rw [jetDerivM_cons, LinearMap.comp_apply, ← ih] simp only [ofGenerator] rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, - add_zero, BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] + simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, + zero_add, BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] congr 2 rw [add_comm, Multiset.singleton_add] diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean index 5bfbcbd29..279df9755 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.DerivativeOrder +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeAction public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic /-! @@ -32,27 +32,45 @@ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetAlgebra := /-- The Lorentz action on a pure tensor. -/ lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - repLorentzGroup Λ (p ⊗ₜ[ℂ] l) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ₜ[ℂ] + repLorentzGroup Λ (p ⊗ⱼ l) = + (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ⱼ (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl -/-- The Lorentz action on the lepton–gauge-sector jet algebra agrees with the algebra - homomorphism obtained as the tensor product of the complexified B-boson - action with the exterior-algebra action on the charged-lepton factor. -/ -lemma repLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : JetAlgebra) : - repLorentzGroup Λ x = Algebra.TensorProduct.map - (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) - (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) x := rfl - /-- The Lorentz action on the lepton–gauge-sector jet algebra is multiplicative (term-level form). -/ lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by - simp [repLorentzGroup_eq_algHom] + induction a using JetAlgebra.induction_on with + | zero => simp + | add u v hu hv => simp only [add_mul, map_add, hu, hv] + | tmul p l => + induction b using JetAlgebra.induction_on with + | zero => simp + | add u v hu hv => simp only [mul_add, map_add, hu, hv] + | tmul q k => + simp only [tmul_mul_tmul, repLorentzGroup_tmul, + BBoson.JetAlgebra.complexRepLorentzGroup_apply_mul, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_mul] lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : repLorentzGroup Λ (1 : JetAlgebra) = 1 := by - simp [repLorentzGroup_eq_algHom] + rw [one_eq_tmul, repLorentzGroup_tmul, + BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one, ← one_eq_tmul] + +/-- The Lorentz action packaged as an algebra homomorphism of the jet algebra. Stating + results with this rather than the underlying `Algebra.TensorProduct.map` keeps the terms + small enough for the elaborator. -/ +noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : JetAlgebra →ₐ[ℂ] JetAlgebra where + toFun := repLorentzGroup Λ + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repLorentzGroup_apply_one Λ + map_mul' := repLorentzGroup_apply_mul Λ + commutes' r := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, + ← Algebra.algebraMap_eq_smul_one] + /-- The Lorentz action on the zeroth-order lepton generator: the spinor index transforms contragrediently, by the conjugate inverse matrix. -/ @@ -60,14 +78,14 @@ lemma repLorentzGroup_ψ (Λ : SL(2,ℂ)) (α : Fin 2) : repLorentzGroup Λ [JetGenerators.dψ {} α]ₐ = ∑ β, star ((Λ⁻¹).1 α β) • [JetGenerators.dψ {} β]ₐ := by rw [show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ {} α) from rfl, repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, - TensorProduct.tmul_sum] + tmul_sum] refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] + rw [tmul_smul] rfl /-- The Lorentz action on the first-order lepton generator. -/ @@ -77,16 +95,16 @@ lemma repLorentzGroup_dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * star ((Λ⁻¹).1 α β)) • [JetGenerators.dψ {ν} β]ₐ := by rw [show ([JetGenerators.dψ {μ} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ {μ} α) from rfl, repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, - TensorProduct.tmul_sum] + tmul_sum] refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_sum] + rw [tmul_sum] refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] + rw [tmul_smul] rfl /-- The Lorentz action on the zeroth-order conjugate lepton generator: the @@ -95,14 +113,14 @@ lemma repLorentzGroup_barψ (Λ : SL(2,ℂ)) (α : Fin 2) : repLorentzGroup Λ [JetGenerators.dbarψ {} α]ₐ = ∑ β, (Λ⁻¹).1 α β • [JetGenerators.dbarψ {} β]ₐ := by rw [show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ {} α) from rfl, repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, - TensorProduct.tmul_sum] + tmul_sum] refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] + rw [tmul_smul] rfl /-- The Lorentz action on the first-order conjugate lepton generator. -/ @@ -112,16 +130,16 @@ lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α β) • [JetGenerators.dbarψ {ν} β]ₐ := by rw [show ([JetGenerators.dbarψ {μ} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ {μ} α) from rfl, repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, - TensorProduct.tmul_sum] + tmul_sum] refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_sum] + rw [tmul_sum] refine Finset.sum_congr rfl fun β _ => ?_ - rw [TensorProduct.tmul_smul] + rw [tmul_smul] rfl /-- The Lorentz action on the zeroth-order B-boson generator of the lepton–gauge-sector jet @@ -131,13 +149,13 @@ lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : ∑ ν, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) • [JetGenerators.dB {} ν]ₐ := by have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] rfl rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) - ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, + ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, repLorentzGroup_tmul, show BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = @@ -145,7 +163,7 @@ lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) from rfl, BBoson.JetAlgebra.repLorentzGroup_ofGenerator_dB_nil, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one, TensorProduct.tmul_sum, - TensorProduct.sum_tmul] + sum_tmul] refine Finset.sum_congr rfl fun ν _ => ?_ rw [TensorProduct.tmul_smul, hconv] rfl @@ -159,21 +177,21 @@ lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • fieldStrengthDeriv {} a b := by have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] rfl have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν) ⊗ₜ[ℂ] + BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν)) ⊗ₜ[ℂ] + BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν)) ⊗ⱼ (LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra)) := rfl rw [fieldStrengthDeriv, happ, BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + simp only [sum_tmul, hconv, fieldStrengthDeriv] /-- Covariance of the zeroth covariant derivatives under the Lorentz group. -/ lemma repLorentzGroup_Dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : @@ -274,21 +292,21 @@ lemma repLorentzGroup_fieldStrengthDeriv_singleton (Λ : SL(2,ℂ)) (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) : ℝ)) : ℂ) • fieldStrengthDeriv {r} a b := by have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] rfl have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ₜ[ℂ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ₜ[ℂ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ⱼ (LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra)) := rfl rw [fieldStrengthDeriv, happ, BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + simp only [sum_tmul, hconv, fieldStrengthDeriv] /-- Under a diagonal Lorentz transformation the derivative field strength scales by the product of the signs of its three indices. -/ @@ -311,7 +329,6 @@ lemma repLorentzGroup_diag_fieldStrengthDeriv_singleton {M : SL(2,ℂ)} (fun h => absurd (Finset.mem_univ ν) h)] rw [hM ρ ρ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] -set_option maxHeartbeats 2000000 in /-- The transformation law of the embedded second-derivative field strength: a four-index tensor, all indices transforming by the Lorentz matrix. -/ lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) @@ -323,21 +340,21 @@ lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) : ℝ)) : ℂ) • fieldStrengthDeriv {r, s} a b := by have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ₜ[ℂ] 1) := by + (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← TensorProduct.smul_tmul'] + rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] rfl have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ₜ[ℂ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ₜ[ℂ] + BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ⱼ (LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra)) := rfl rw [fieldStrengthDeriv, happ, BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [TensorProduct.sum_tmul, hconv, fieldStrengthDeriv] + simp only [sum_tmul, hconv, fieldStrengthDeriv] /-! @@ -345,7 +362,6 @@ lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) -/ -set_option maxHeartbeats 1000000 in /-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = @@ -365,7 +381,6 @@ lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] simp only [hsm, hms, hsmul] -set_option maxHeartbeats 1000000 in /-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : repLorentzGroup Λ (Dψ [] α * Dbarψ [] β) = @@ -384,99 +399,6 @@ lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : rw [smul_mul_smul_comm] rw [repLorentzGroup_apply_mul, repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] simp only [hsm, hms, hsmul] - -/-! - -### B.2. The invarance condition - --/ - -def IsInvariant (x : JetAlgebra) : Prop := - (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) - ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) - -lemma IsInvariant.add {x y : JetAlgebra} (hx : IsInvariant x) (hy : IsInvariant y) : - IsInvariant (x + y) := by - constructor - · intro U - simp [hx.left, hy.left] - · intro Λ - simp [hx.right, hy.right] - -lemma IsInvariant.smul {x : JetAlgebra} (hx : IsInvariant x) (r : ℂ) : - IsInvariant (r • x) := by - constructor - · intro U - simp [hx.left] - · intro Λ - simp [hx.right] - -noncomputable def InvariantSubmodule : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x | IsInvariant x} - -lemma InvariantSubmodule.mem_iff_isInvariant (x : JetAlgebra) : - x ∈ InvariantSubmodule ↔ IsInvariant x := by - constructor - · intro hx - induction hx using Submodule.span_induction with - | mem y hy => exact hy - | zero => exact ⟨fun U => map_zero _, fun Λ => map_zero _⟩ - | add y z hy hz ihy ihz => - exact ⟨fun U => by rw [map_add, ihy.1 U, ihz.1 U], - fun Λ => by rw [map_add, ihy.2 Λ, ihz.2 Λ]⟩ - | smul c y hy ihy => - exact ⟨fun U => by rw [map_smul, ihy.1 U], - fun Λ => by rw [map_smul, ihy.2 Λ]⟩ - · exact fun hx => Submodule.subset_span hx - - -/-- Characterization of the invariants of the lepton–gauge-sector jet algebra: an element is - invariant under the jet gauge group and the Lorentz group precisely when it - lies in the algebra generated by the field-strength derivatives and the - covariant derivatives, is invariant under the constant gauge transformations, - and is Lorentz invariant. The forward direction is the main theorem above; the - backward direction holds because on the covariant generators a jet of gauge - transformations acts only through its value at the base point. -/ -lemma isInvariant_iff_mem_adjoin_invariantGenerators (x : JetAlgebra) : - IsInvariant x ↔ x ∈ Algebra.adjoin ℂ invariantGenerators ∧ - (∀ g : GaugeGroupI, repJetGaugeGroupI (.ofConstant g) x = x) - ∧ (∀ Λ : SL(2, ℂ), repLorentzGroup Λ x = x) := by - constructor - · intro h - exact ⟨mem_adjoin_invariantGenerators_of_forall_repJetGaugeGroupI_eq x h.1, - fun g => h.1 _, h.2⟩ - · rintro ⟨hmem, hconst, hlor⟩ - refine ⟨fun U => ?_, hlor⟩ - suffices hkey : repJetGaugeGroupI U x = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) x by - rw [hkey] - exact hconst U.eval - clear hconst hlor - induction hmem using Algebra.adjoin_induction with - | mem z hz => - rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · show repJetGaugeGroupI U (fieldStrengthDeriv p.1 p.2.1 p.2.2) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) - (fieldStrengthDeriv p.1 p.2.1 p.2.2) - rw [repJetGaugeGroupI_fieldStrengthDeriv, repJetGaugeGroupI_fieldStrengthDeriv] - · show repJetGaugeGroupI U (Dψ p.1 p.2) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dψ p.1 p.2) - rw [repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant] - · show repJetGaugeGroupI U (Dbarψ p.1 p.2) = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) (Dbarψ p.1 p.2) - rw [repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, - JetGaugeGroupI.eval_ofConstant] - | algebraMap r => - simp only [repJetGaugeGroupI_eq_algHom, AlgHom.commutes] - | add u v hu hv ihu ihv => - exact (map_add (repJetGaugeGroupI U) u v).trans - ((congrArg₂ (· + ·) ihu ihv).trans - (map_add (repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval)) u v).symm) - | mul u v hu hv ihu ihv => - exact (repJetGaugeGroupI_apply_mul U u v).trans - ((congrArg₂ (· * ·) ihu ihv).trans - (repJetGaugeGroupI_apply_mul (JetGaugeGroupI.ofConstant U.eval) u v).symm) - end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean index c6768cb3f..a9a4be312 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.Basic public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.MassDim @@ -32,7 +32,6 @@ On monomials this is exactly `X ^ a * b ⊗ X ^ c * l ↦ X ^ (a + c) * (b ⊗ l @[expose] public section -set_option maxHeartbeats 1000000 namespace LeptonGaugeSector open TensorProduct StandardModel Matrix MatrixGroups @@ -61,7 +60,7 @@ noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra @[simp] lemma massWeightPoly_tmul (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - massWeightPoly (b ⊗ₜ[ℂ] l) = + massWeightPoly (b ⊗ⱼ l) = Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) * Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := rfl @@ -70,7 +69,7 @@ lemma massWeightPoly_tmul (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSingle lemma massWeightPoly_inclB (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : massWeightPoly (inclB b) = Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) := by - rw [show inclB b = b ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, massWeightPoly_tmul, + rw [show inclB b = b ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, massWeightPoly_tmul, map_one, map_one, mul_one] /-- On the fermionic factor the mass-weight polynomial is the charged-lepton mass-weight @@ -78,7 +77,7 @@ lemma massWeightPoly_inclB (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : lemma massWeightPoly_inclL (l : LeptonSinglet.JetAlgebra) : massWeightPoly (inclL l) = Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := by - rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l from rfl, massWeightPoly_tmul, + rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l from rfl, massWeightPoly_tmul, map_one, map_one, one_mul] /-- The bosonic inclusion is unital. -/ @@ -89,10 +88,10 @@ private lemma inclL_one : inclL (1 : LeptonSinglet.JetAlgebra) = 1 := rfl /-- A pure tensor is the product of the images of its two factors. -/ lemma tmul_eq_inclB_mul_inclL (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : b ⊗ₜ[ℂ] l = inclB b * inclL l := by - rw [show inclB b = b ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, - show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l from rfl, - Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + (l : LeptonSinglet.JetAlgebra) : b ⊗ⱼ l = inclB b * inclL l := by + rw [show inclB b = b ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, + show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l from rfl, + tmul_mul_tmul, mul_one, one_mul] /-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ @[simp] @@ -128,7 +127,7 @@ private lemma evalOne_apply (p : Polynomial JetAlgebra) : evalOne p = p.eval 1 : /-- Setting the formal variable to one recovers the original element. -/ lemma massWeightPoly_eval_one (x : JetAlgebra) : (massWeightPoly x).eval 1 = x := by - induction x using TensorProduct.induction_on with + induction x using JetAlgebra.induction_on with | zero => simp | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb] | tmul b l => @@ -215,10 +214,10 @@ lemma inclL_mem_massWeightSubmodule {n : ℕ} {l : LeptonSinglet.JetAlgebra} complementary weights. -/ lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : (massWeightPoly x).coeff n ∈ massWeightSubmodule n := by - induction x using TensorProduct.induction_on generalizing n with + induction x using JetAlgebra.induction_on generalizing n with | zero => simp | add a b ha hb => - rw [map_add, Polynomial.coeff_add] + simp only [map_add, Polynomial.coeff_add] exact Submodule.add_mem _ (ha n) (hb n) | tmul b l => rw [massWeightPoly_tmul, Polynomial.coeff_mul] @@ -305,20 +304,20 @@ noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlge lemma jetDeriv_inclB (μ : Fin 1 ⊕ Fin 3) (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : jetDeriv μ (inclB b) = inclB (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) b) := by - rw [show inclB b = b ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, - LeptonSinglet.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, add_zero] + rw [show inclB b = b ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, + LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero] rfl /-- The total derivative acts on the fermionic factor through its own total derivative. -/ lemma jetDeriv_inclL (μ : Fin 1 ⊕ Fin 3) (l : LeptonSinglet.JetAlgebra) : jetDeriv μ (inclL l) = inclL (LeptonSinglet.JetAlgebra.jetDeriv μ l) := by - rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] l from rfl, jetDeriv_tmul, + rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l from rfl, jetDeriv_tmul, show LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 0 from by rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero], - TensorProduct.zero_tmul, zero_add] + zero_tmul, zero_add] rfl /-- Pushing a polynomial forward along the bosonic inclusion commutes with applying the total @@ -407,9 +406,11 @@ lemma massWeightPoly_jetDeriv (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : rw [jetDeriv_inclL, massWeightPoly_inclL, massWeightPoly_inclL, LeptonSinglet.JetAlgebra.massWeightPoly_jetDeriv, map_mul, mapAlgHom_X_sq_inclL, mapCoeffs_jetDeriv_mapAlgHom_inclL] - induction x using TensorProduct.induction_on with + induction x using JetAlgebra.induction_on with | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, mul_add] + | add a b ha hb => + rw [map_add, map_add, ha, hb, map_add, + Polynomial.mapCoeffs_add (map_zero (jetDeriv μ)) (map_add (jetDeriv μ)), mul_add] | tmul b l => rw [tmul_eq_inclB_mul_inclL] exact hmul _ _ (hB b) (hL l) @@ -488,7 +489,7 @@ lemma fieldStrengthDeriv_mem_massWeightSubmodule (s : Multiset (Fin 1 ⊕ Fin 3) have h : (fieldStrengthDeriv s μ ν : JetAlgebra) = [JetGenerators.dB (s + {μ}) ν]ₐ - [JetGenerators.dB (s + {ν}) μ]ₐ := by rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, TensorProduct.sub_tmul] + TensorProduct.tmul_sub, sub_tmul] rfl rw [h] refine Submodule.sub_mem _ ?_ ?_ @@ -505,44 +506,38 @@ lemma fieldStrengthDeriv_mem_massWeightSubmodule (s : Multiset (Fin 1 ⊕ Fin 3) -/ +set_option maxHeartbeats 400000 in /-- The Lorentz action preserves mass weights: the mass-weight polynomial of a transformed element is the transform of its mass-weight polynomial. -/ lemma massWeightPoly_repLorentzGroup (Λ : SL(2,ℂ)) (x : JetAlgebra) : massWeightPoly (repLorentzGroup Λ x) = - Polynomial.mapAlgHom (Algebra.TensorProduct.map - (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) - (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ)) (massWeightPoly x) := by - induction x using TensorProduct.induction_on with + Polynomial.mapAlgHom (repLorentzGroupAlgHom Λ) (massWeightPoly x) := by + have hB : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, repLorentzGroupAlgHom Λ (inclB z) = + inclB (BBoson.JetAlgebra.complexRepLorentzGroup Λ z) := by + intro z + show repLorentzGroup Λ (z ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = _ + rw [repLorentzGroup_tmul, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] + rfl + have hL : ∀ z : LeptonSinglet.JetAlgebra, repLorentzGroupAlgHom Λ (inclL z) = + inclL (LeptonSinglet.JetAlgebra.repLorentzGroup Λ z) := by + intro z + show repLorentzGroup Λ ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ z) = _ + rw [repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one] + rfl + induction x using JetAlgebra.induction_on with | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb, map_add] + | add a b ha hb => simp only [map_add, ha, hb] | tmul b l => rw [repLorentzGroup_tmul, massWeightPoly_tmul, massWeightPoly_tmul, BBoson.JetAlgebra.massWeightPoly_complexRepLorentzGroup, LeptonSinglet.JetAlgebra.massWeightPoly_repLorentzGroup, map_mul] refine congrArg₂ (· * ·) (Polynomial.ext fun n => ?_) (Polynomial.ext fun n => ?_) - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapAlgHom_apply] - show inclB _ = _ - rw [show inclB ((BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) - ((BBoson.JetAlgebra.massWeightPoly b).coeff n)) = - (BBoson.JetAlgebra.complexRepLorentzGroupAlgHom Λ) - ((BBoson.JetAlgebra.massWeightPoly b).coeff n) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl] - rw [show inclB ((BBoson.JetAlgebra.massWeightPoly b).coeff n) = - ((BBoson.JetAlgebra.massWeightPoly b).coeff n) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, Algebra.TensorProduct.map_tmul, map_one] - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapAlgHom_apply] - show inclL _ = _ - rw [show inclL ((LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) - ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n)) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repLorentzGroupAlgHom Λ) - ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl] - rw [show inclL ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl, - Algebra.TensorProduct.map_tmul, map_one] + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, hB] + rfl + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, hL] + rfl /-- The Lorentz action preserves each mass-weight submodule. -/ lemma repLorentzGroup_mem_massWeightSubmodule (Λ : SL(2,ℂ)) {n : ℕ} {x : JetAlgebra} @@ -551,55 +546,131 @@ lemma repLorentzGroup_mem_massWeightSubmodule (Λ : SL(2,ℂ)) {n : ℕ} {x : Je rw [massWeightPoly_repLorentzGroup, hx, Polynomial.mapAlgHom_monomial] rfl +set_option maxHeartbeats 400000 in /-- Jets of constant gauge transformations preserve mass weights. This fails for a general jet: the higher Taylor coefficients of the hypercharge character lower the derivative degree, mixing weights. -/ lemma massWeightPoly_repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : massWeightPoly (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = - Polynomial.mapAlgHom (Algebra.TensorProduct.map - (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom (JetGaugeGroupI.ofConstant g)) - (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom (JetGaugeGroupI.ofConstant g))) - (massWeightPoly x) := by - induction x using TensorProduct.induction_on with + Polynomial.mapAlgHom (repAlgHom (JetGaugeGroupI.ofConstant g)) (massWeightPoly x) := by + set U := JetGaugeGroupI.ofConstant g with hUdef + have hB : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, repAlgHom U (inclB z) = + inclB (BBoson.JetAlgebra.complexRepJetGaugeGroupI U z) := by + intro z + rw [show inclB z = z ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, repAlgHom_tmul, + show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) + (1 : LeptonSinglet.JetAlgebra) = 1 from map_one _] + rfl + have hL : ∀ z : LeptonSinglet.JetAlgebra, repAlgHom U (inclL z) = + inclL (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U z) := by + intro z + rw [show inclL z = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ z from rfl, repAlgHom_tmul, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_one] + rfl + induction x using JetAlgebra.induction_on with | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb, map_add] + | add a b ha hb => simp only [map_add, ha, hb] | tmul b l => rw [repJetGaugeGroupI_tmul', massWeightPoly_tmul, massWeightPoly_tmul, BBoson.JetAlgebra.massWeightPoly_complexRepJetGaugeGroupI_ofConstant, LeptonSinglet.JetAlgebra.massWeightPoly_repJetGaugeGroupI_ofConstant, map_mul] refine congrArg₂ (· * ·) (Polynomial.ext fun n => ?_) (Polynomial.ext fun n => ?_) - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply] - show inclB _ = _ - rw [show inclB ((BBoson.JetAlgebra.massWeightPoly b).coeff n) = - ((BBoson.JetAlgebra.massWeightPoly b).coeff n) ⊗ₜ[ℂ] - (1 : LeptonSinglet.JetAlgebra) from rfl, Algebra.TensorProduct.map_tmul, map_one] - rw [show (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom - (JetGaugeGroupI.ofConstant g)) ((BBoson.JetAlgebra.massWeightPoly b).coeff n) = - (BBoson.JetAlgebra.massWeightPoly b).coeff n from - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant g _] + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapAlgHom_apply, hB, + BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant] + · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, + Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, hL] rfl - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapAlgHom_apply] - show inclL _ = _ - rw [show inclL ((LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom - (JetGaugeGroupI.ofConstant g)) - ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n)) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom (JetGaugeGroupI.ofConstant g)) - ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl] - rw [show inclL ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] - ((LeptonSinglet.JetAlgebra.massWeightPoly l).coeff n) from rfl, - Algebra.TensorProduct.map_tmul, map_one] /-- Jets of constant gauge transformations preserve each mass-weight submodule. -/ lemma repJetGaugeGroupI_ofConstant_mem_massWeightSubmodule (g : GaugeGroupI) {n : ℕ} {x : JetAlgebra} (hx : x ∈ massWeightSubmodule n) : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x ∈ massWeightSubmodule n := by rw [mem_massWeightSubmodule] at hx ⊢ - rw [massWeightPoly_repJetGaugeGroupI_ofConstant, hx, Polynomial.mapAlgHom_monomial] + rw [massWeightPoly_repJetGaugeGroupI_ofConstant, hx, Polynomial.mapAlgHom_monomial, + ← repJetGaugeGroupI_eq_repAlgHom] + + +/-! + +## E. Invariance of the mass-weight components + +Taking the part of a given mass weight commutes with the Lorentz action and with the action of +the *constant* gauge transformations, because both preserve mass weights. The covariant +subalgebra is generated by homogeneous elements, so it too is graded by mass weight. Together +these say that an invariant element of the covariant subalgebra has invariant mass-weight +components — which is what lets the classification be run one weight at a time. + +-/ + +/-- Taking the weight-`n` part commutes with the Lorentz action. -/ +lemma repLorentzGroup_coeff_massWeightPoly (Λ : SL(2,ℂ)) (x : JetAlgebra) (n : ℕ) : + repLorentzGroup Λ ((massWeightPoly x).coeff n) = + (massWeightPoly (repLorentzGroup Λ x)).coeff n := by + rw [massWeightPoly_repLorentzGroup, Polynomial.coeff_mapAlgHom_apply] rfl +/-- Taking the weight-`n` part commutes with the action of a constant gauge transformation. + This fails for a general gauge jet, whose higher Taylor coefficients mix weights. -/ +lemma repJetGaugeGroupI_ofConstant_coeff_massWeightPoly (g : GaugeGroupI) (x : JetAlgebra) + (n : ℕ) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ((massWeightPoly x).coeff n) = + (massWeightPoly (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x)).coeff n := by + rw [massWeightPoly_repJetGaugeGroupI_ofConstant, Polynomial.coeff_mapAlgHom_apply, + ← repJetGaugeGroupI_eq_repAlgHom] + +/-- The covariant subalgebra is graded by mass weight: its generators are homogeneous — the + field-strength derivative `∂_s F_{μν}` has weight `4 + 2 |s|` and the covariant derivatives + `D_l ψ_α`, `D̄_l ψ̄_α` weight `3 + 2 |l|` — so every mass-weight part of an element of the + subalgebra lies in the subalgebra again. -/ +lemma coeff_massWeightPoly_mem_covariantAlgebra {x : JetAlgebra} (hx : x ∈ CovariantAlgebra) + (n : ℕ) : (massWeightPoly x).coeff n ∈ CovariantAlgebra := by + induction hx using CovariantAlgebra.induction_on generalizing n with + | fieldStrength s μ ν => + by_cases hn : 4 + 2 * Multiset.card s = n + · rw [coeff_massWeightPoly_of_mem (hn ▸ fieldStrengthDeriv_mem_massWeightSubmodule s μ ν)] + exact fieldStrengthDeriv_mem_covariantAlgebra s μ ν + · rw [coeff_massWeightPoly_of_mem_ne hn (fieldStrengthDeriv_mem_massWeightSubmodule s μ ν)] + exact Subalgebra.zero_mem _ + | lepton l α => + by_cases hn : 3 + 2 * l.length = n + · rw [coeff_massWeightPoly_of_mem (hn ▸ Dψ_mem_massWeightSubmodule l α)] + exact Dψ_mem_covariantAlgebra l α + · rw [coeff_massWeightPoly_of_mem_ne hn (Dψ_mem_massWeightSubmodule l α)] + exact Subalgebra.zero_mem _ + | conjLepton l α => + by_cases hn : 3 + 2 * l.length = n + · rw [coeff_massWeightPoly_of_mem (hn ▸ Dbarψ_mem_massWeightSubmodule l α)] + exact Dbarψ_mem_covariantAlgebra l α + · rw [coeff_massWeightPoly_of_mem_ne hn (Dbarψ_mem_massWeightSubmodule l α)] + exact Subalgebra.zero_mem _ + | algebraMap r => + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs + · exact Subalgebra.algebraMap_mem _ r + · exact Subalgebra.zero_mem _ + | add u v _ _ ihu ihv => + rw [map_add, Polynomial.coeff_add] + exact Subalgebra.add_mem _ (ihu n) (ihv n) + | mul u v _ _ ihu ihv => + rw [map_mul, Polynomial.coeff_mul] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.mul_mem _ (ihu p.1) (ihv p.2) + +/-- The mass-weight components of an invariant element are themselves invariant. + + Invariance under the full jet gauge group does not by itself pass to the components — a + general gauge jet mixes mass weights. It passes because an invariant element lies in the + covariant subalgebra (`isInvariant_iff_mem_covariantAlgebra`), on which invariance is + equivalent to membership together with invariance under the *constant* gauge transformations + and the Lorentz group, and all three of those conditions are inherited by the components. -/ +lemma isInvariant_coeff_massWeightPoly {x : JetAlgebra} (hx : IsInvariant x) (n : ℕ) : + IsInvariant ((massWeightPoly x).coeff n) := by + rw [isInvariant_iff_mem_covariantAlgebra] at hx ⊢ + obtain ⟨hmem, hconst, hlor⟩ := hx + refine ⟨coeff_massWeightPoly_mem_covariantAlgebra hmem n, fun g => ?_, fun Λ => ?_⟩ + · rw [repJetGaugeGroupI_ofConstant_coeff_massWeightPoly, hconst g] + · rw [repLorentzGroup_coeff_massWeightPoly, hlor Λ] + end JetAlgebra end LeptonGaugeSector From 256e7c8e49c4001b3f36be18443a6d10ebb6250c Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:42:51 +0100 Subject: [PATCH 117/254] feat: Fermionic parity Co-Authored-By: Claude --- Physlib.lean | 1 + .../JetAlgebra/FermionicParity.lean | 424 ++++++++++++++++++ .../JetAlgebra/Grading/Hypercharge.lean | 39 ++ .../LorentzGroup/FermionicParity.lean | 123 +++++ 4 files changed, 587 insertions(+) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean create mode 100644 Physlib/Relativity/LorentzGroup/FermionicParity.lean diff --git a/Physlib.lean b/Physlib.lean index 824f76dd3..313e9f942 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -375,6 +375,7 @@ public import Physlib.Relativity.LorentzGroup.Basic public import Physlib.Relativity.LorentzGroup.Boosts.Apply public import Physlib.Relativity.LorentzGroup.Boosts.Basic public import Physlib.Relativity.LorentzGroup.Boosts.Generalized +public import Physlib.Relativity.LorentzGroup.FermionicParity public import Physlib.Relativity.LorentzGroup.Orthochronous.Basic public import Physlib.Relativity.LorentzGroup.Proper public import Physlib.Relativity.LorentzGroup.Restricted.Basic diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean new file mode 100644 index 000000000..1d5c38405 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean @@ -0,0 +1,424 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.MassDim +public import Physlib.Relativity.LorentzGroup.FermionicParity +/-! +# Fermionic parity on the lepton–gauge-sector jet algebra + +Fermionic parity `-1 ∈ SL(2, ℂ)` projects to the identity Lorentz transformation, so it acts +trivially on everything built from Lorentz vectors — the B-boson factor and the derivative +symbols — and by `-1` on the Weyl spinor of the charged lepton. On the jet algebra it therefore +negates each fermionic generator and fixes each bosonic one. + +Since the mass weight of a bosonic generator `∂_s B_μ` is even, `2(1 + |s|)`, and that of a +fermionic generator `∂_s ψ_α` or `∂_s ψ̄_α` is odd, `3 + 2|s|`, fermionic parity acts on a +generator by `(-1)` raised to its mass weight. + +-/ + +@[expose] public section + +set_option maxHeartbeats 400000 + +namespace LeptonGaugeSector +open TensorProduct StandardModel Matrix MatrixGroups LorentzGroup + +namespace JetAlgebra + +/-! + +## A. Fermionic parity on the derivative symbols and the two factors + +-/ + +private lemma fermionicParity_inv : fermionicParity⁻¹ = fermionicParity := + inv_eq_of_mul_eq_one_right (by rw [← sq]; exact fermionicParity_sq) + +/-- Fermionic parity acts trivially on the dual complex Lorentz covectors. -/ +lemma coℂModule_SL2CRep_dual_fermionicParity : + Lorentz.CoℂModule.SL2CRep.dual fermionicParity = LinearMap.id := by + rw [Representation.dual_apply, fermionicParity_inv, coℂModule_SL2CRep_fermionicParity] + ext f x + simp [Module.Dual.transpose] + +/-- Fermionic parity acts trivially on the complex algebra of derivative symbols. -/ +lemma derivAlgebraComplex_repLorentzGroup_fermionicParity : + DerivAlgebraComplex.repLorentzGroup fermionicParity = LinearMap.id := by + show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ + Lorentz.CoℂModule.SL2CRep.dual fermionicParity)).toLinearMap = _ + rw [coℂModule_SL2CRep_dual_fermionicParity, + LinearMap.comp_id (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule))] + refine LinearMap.ext fun x => ?_ + show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _) x = x + rw [show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule)) = + AlgHom.id ℂ _ from SymmetricAlgebra.algHom_ext (by ext y; simp)] + rfl + +/-- Fermionic parity acts trivially on the real Lorentz covectors. -/ +lemma coVector_sl2Rep_fermionicParity : + Lorentz.CoVector.sl2Rep fermionicParity = LinearMap.id := by + show (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup fermionicParity)) = _ + rw [toLorentzGroup_fermionicParity, map_one] + rfl + +lemma coVector_sl2Rep_dual_fermionicParity : + Lorentz.CoVector.sl2Rep.dual fermionicParity = LinearMap.id := by + rw [Representation.dual_apply, fermionicParity_inv, coVector_sl2Rep_fermionicParity] + ext f x + simp [Module.Dual.transpose] + +/-- Fermionic parity acts trivially on the real algebra of derivative symbols. -/ +lemma derivAlgebraReal_repLorentzGroup_fermionicParity : + DerivAlgebraReal.repLorentzGroup fermionicParity = LinearMap.id := by + show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + Lorentz.CoVector.sl2Rep.dual fermionicParity)).toLinearMap = _ + rw [coVector_sl2Rep_dual_fermionicParity, + LinearMap.comp_id (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector))] + refine LinearMap.ext fun x => ?_ + show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _) x = x + rw [show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector)) = + AlgHom.id ℝ _ from SymmetricAlgebra.algHom_ext (by ext y; simp)] + rfl + +/-! + +## B. Fermionic parity on the B-boson factor + +The B boson is a Lorentz vector, so fermionic parity leaves the whole bosonic factor alone. + +-/ + +lemma bBoson_repLorentzGroup_fermionicParity : + BBoson.repLorentzGroup fermionicParity = LinearMap.id := by + show (BBoson.valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup fermionicParity)) + (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) fermionicParity) ∘ₗ + BBoson.valLinEquiv.toLinearMap) = _ + rw [toLorentzGroup_fermionicParity, map_one] + ext F + simp [Module.End.one_eq_id, TensorProduct.map_id] + +lemma bBoson_repLorentzGroup_dual_fermionicParity : + BBoson.repLorentzGroup.dual fermionicParity = LinearMap.id := by + rw [Representation.dual_apply, fermionicParity_inv, bBoson_repLorentzGroup_fermionicParity] + ext f x + simp [Module.Dual.transpose] + +lemma bBoson_jetComponentSpace_repLorentzGroup_fermionicParity : + BBoson.JetComponentSpace.repLorentzGroup fermionicParity = LinearMap.id := by + show (TensorProduct.map (DerivAlgebraReal.repLorentzGroup fermionicParity) + (BBoson.repLorentzGroup.dual fermionicParity)) = _ + rw [derivAlgebraReal_repLorentzGroup_fermionicParity, + bBoson_repLorentzGroup_dual_fermionicParity, TensorProduct.map_id] + +/-! + +## C. Fermionic parity on the charged-lepton factor + +The lepton is a Weyl spinor, so fermionic parity acts on the component space by `-1`, and hence +negates each fermionic generator of the exterior algebra. + +-/ + +lemma leptonSinglet_repLorentzGroup_fermionicParity : + LeptonSinglet.repLorentzGroup fermionicParity = -LinearMap.id := by + show (LeptonSinglet.valLinEquiv.symm.toLinearMap ∘ₗ + Fermion.RightHandedWeyl.rep fermionicParity ∘ₗ + LeptonSinglet.valLinEquiv.toLinearMap) = _ + rw [rightHandedWeyl_rep_fermionicParity] + ext l + simp + +lemma leptonSinglet_repLorentzGroup_dual_fermionicParity : + LeptonSinglet.repLorentzGroup.dual fermionicParity = -LinearMap.id := by + rw [Representation.dual_apply, fermionicParity_inv, + leptonSinglet_repLorentzGroup_fermionicParity] + ext f x + simp [Module.Dual.transpose] + +lemma leptonSinglet_repLorentzGroup_conj_fermionicParity : + LeptonSinglet.repLorentzGroup.conj fermionicParity = -LinearMap.id := by + ext m + rw [Representation.conj_apply, leptonSinglet_repLorentzGroup_fermionicParity] + simp + +lemma leptonSinglet_repLorentzGroup_conj_dual_fermionicParity : + LeptonSinglet.repLorentzGroup.conj.dual fermionicParity = -LinearMap.id := by + rw [Representation.dual_apply, fermionicParity_inv, + leptonSinglet_repLorentzGroup_conj_fermionicParity] + ext f x + simp [Module.Dual.transpose] + +/-- Fermionic parity acts by `-1` on every lepton component function, at every derivative + order at once: the derivative symbols are inert and the spinor index carries the sign. -/ +lemma leptonSinglet_jetComponentSpace_repLorentzGroup_fermionicParity : + LeptonSinglet.JetComponentSpace.repLorentzGroup fermionicParity = -LinearMap.id := by + show LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup fermionicParity) + (LeptonSinglet.repLorentzGroup.dual fermionicParity)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup fermionicParity) + (LeptonSinglet.repLorentzGroup.conj.dual fermionicParity)) = _ + rw [derivAlgebraComplex_repLorentzGroup_fermionicParity, + leptonSinglet_repLorentzGroup_dual_fermionicParity, + leptonSinglet_repLorentzGroup_conj_dual_fermionicParity] + have h1 : TensorProduct.map (LinearMap.id : DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex) + (-LinearMap.id : Module.Dual ℂ LeptonSinglet →ₗ[ℂ] Module.Dual ℂ LeptonSinglet) = + -LinearMap.id := by + refine TensorProduct.ext' fun a b => ?_ + simp [TensorProduct.tmul_neg] + have h2 : TensorProduct.map (LinearMap.id : DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex) + (-LinearMap.id : Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] + Module.Dual ℂ (ConjModule LeptonSinglet)) = -LinearMap.id := by + refine TensorProduct.ext' fun a b => ?_ + simp [TensorProduct.tmul_neg] + rw [h1, h2] + refine LinearMap.ext fun x => Prod.ext ?_ ?_ <;> simp + + +/-! + +## D. Checking algebra maps on the generators + +Two algebra maps out of the jet algebra that agree on every generator are equal. The bosonic +factor is a symmetric algebra and the fermionic one an exterior algebra, both on spaces with a +distinguished basis indexed by the generators, so each factor is handled by its own induction +principle. `Algebra.TensorProduct.ext` is not usable here: the bosonic factor is itself an +`ℝ`-tensor product, so that lemma demands an `IsScalarTower ℝ ℂ A` on the target. + +-/ + +/-- Two algebra maps out of the jet algebra agreeing on the bosonic factor. -/ +private lemma algHom_eq_on_inclB {A : Type} [Ring A] [Algebra ℂ A] + {f g : JetAlgebra →ₐ[ℂ] A} (h : ∀ j : JetGenerators, f [j]ₐ = g [j]ₐ) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : f (inclB a) = g (inclB a) := by + have hone : ∀ c : BBoson.JetAlgebra, + f (inclB ((1 : ℂ) ⊗ₜ[ℝ] c)) = g (inclB ((1 : ℂ) ⊗ₜ[ℝ] c)) := by + intro c + induction c using SymmetricAlgebra.induction with + | algebraMap r => + rw [show ((1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ BBoson.JetAlgebra r) : + ℂ ⊗[ℝ] BBoson.JetAlgebra) = + algebraMap ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) (algebraMap ℝ ℂ r) from by + rw [Algebra.algebraMap_eq_smul_one, Algebra.algebraMap_eq_smul_one, + TensorProduct.tmul_smul, TensorProduct.smul_tmul'] + rfl, AlgHom.commutes, AlgHom.commutes, AlgHom.commutes] + | ι v => + have hv : v ∈ Submodule.span ℝ (Set.range BBoson.JetComponentSpace.basis) := by + rw [BBoson.JetComponentSpace.basis.span_eq] + trivial + induction hv using Submodule.span_induction with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + obtain ⟨s, μ⟩ := j + exact h (JetGenerators.dB s μ) + | zero => simp + | add u w _ _ ihu ihw => + simp only [map_add, TensorProduct.tmul_add] + rw [ihu, ihw] + | smul r u _ ihu => + have hs : ((1 : ℂ) ⊗ₜ[ℝ] + (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace (r • u)) : + ℂ ⊗[ℝ] BBoson.JetAlgebra) = + (algebraMap ℝ ℂ r) • ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace u) := by + rw [map_smul, TensorProduct.tmul_smul, ← algebraMap_smul ℂ r] + rw [hs] + simp only [map_smul] + rw [ihu] + | mul u v ihu ihv => + rw [show ((1 : ℂ) ⊗ₜ[ℝ] (u * v) : ℂ ⊗[ℝ] BBoson.JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] u) * ((1 : ℂ) ⊗ₜ[ℝ] v) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul]] + simp only [map_mul] + rw [ihu, ihv] + | add u v ihu ihv => + simp only [TensorProduct.tmul_add, map_add] + rw [ihu, ihv] + induction a using TensorProduct.induction_on with + | zero => simp + | add u v hu hv => rw [map_add, map_add, map_add, hu, hv] + | tmul z c => + rw [show (z ⊗ₜ[ℝ] c : ℂ ⊗[ℝ] BBoson.JetAlgebra) = z • ((1 : ℂ) ⊗ₜ[ℝ] c) from by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one], map_smul, map_smul, map_smul, + hone c] + +/-- Two algebra maps out of the jet algebra agreeing on the fermionic factor. -/ +private lemma algHom_eq_on_inclL {A : Type} [Ring A] [Algebra ℂ A] + {f g : JetAlgebra →ₐ[ℂ] A} (h : ∀ j : JetGenerators, f [j]ₐ = g [j]ₐ) + (b : LeptonSinglet.JetAlgebra) : f (inclL b) = g (inclL b) := by + have hcomp : f.comp inclL = g.comp inclL := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) + have hm : m ∈ Submodule.span ℂ (Set.range LeptonSinglet.JetComponentSpace.basis) := by + rw [LeptonSinglet.JetComponentSpace.basis.span_eq] + trivial + induction hm using Submodule.span_induction with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + cases j with + | dψ s α => exact h (JetGenerators.dψ s α) + | dbarψ s α => exact h (JetGenerators.dbarψ s α) + | zero => simp + | add u v _ _ ihu ihv => + simp only [LinearMap.coe_comp, Function.comp_apply, AlgHom.toLinearMap_apply, + map_add] at ihu ihv ⊢ + rw [ihu, ihv] + | smul c u _ ihu => + simp only [LinearMap.coe_comp, Function.comp_apply, AlgHom.toLinearMap_apply, + map_smul] at ihu ⊢ + rw [ihu] + exact AlgHom.congr_fun hcomp b + +/-- Two algebra maps out of the jet algebra agreeing on every generator are equal. -/ +lemma algHom_ext {A : Type} [Ring A] [Algebra ℂ A] {f g : JetAlgebra →ₐ[ℂ] A} + (h : ∀ j : JetGenerators, f [j]ₐ = g [j]ₐ) : f = g := by + refine AlgHom.ext fun x => ?_ + induction x using JetAlgebra.induction_on with + | zero => simp + | add u v hu hv => rw [map_add, map_add, hu, hv] + | tmul a b => + rw [tmul_eq_inclB_mul_inclL, map_mul, map_mul, algHom_eq_on_inclB h, + algHom_eq_on_inclL h] + + +/-! + +## E. Fermionic parity acts by `(-1)` to the mass weight + +-/ + +private lemma tmul_neg' (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + a ⊗ⱼ (-b) = -(a ⊗ⱼ b) := TensorProduct.tmul_neg a b + +lemma bBoson_jetAlgebra_repLorentzGroup_fermionicParity : + BBoson.JetAlgebra.repLorentzGroup fermionicParity = LinearMap.id := by + show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ + BBoson.JetComponentSpace.repLorentzGroup fermionicParity)).toLinearMap = _ + rw [bBoson_jetComponentSpace_repLorentzGroup_fermionicParity, + LinearMap.comp_id (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace)] + refine LinearMap.ext fun x => ?_ + show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _) x = x + rw [show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace) = + AlgHom.id ℝ _ from SymmetricAlgebra.algHom_ext (by ext y; simp)] + rfl + +lemma bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity : + BBoson.JetAlgebra.complexRepLorentzGroup fermionicParity = LinearMap.id := by + refine LinearMap.ext fun x => ?_ + induction x using TensorProduct.induction_on with + | zero => simp + | add u v hu hv => rw [map_add, hu, hv]; simp + | tmul z b => + show z ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup fermionicParity b = _ + rw [bBoson_jetAlgebra_repLorentzGroup_fermionicParity] + rfl + +/-- Fermionic parity negates every fermionic generator. -/ +lemma leptonSinglet_jetAlgebra_repLorentzGroup_fermionicParity_ofGenerator + (j : LeptonSinglet.JetGenerators) : + LeptonSinglet.JetAlgebra.repLorentzGroup fermionicParity + (LeptonSinglet.JetAlgebra.ofGenerator j) = + -LeptonSinglet.JetAlgebra.ofGenerator j := by + rw [LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator, + leptonSinglet_jetComponentSpace_repLorentzGroup_fermionicParity] + simp [LeptonSinglet.JetAlgebra.ofGenerator] + +/-- Fermionic parity acts on each generator by `(-1)` raised to its mass weight: bosonic + generators have even weight and are fixed, fermionic generators have odd weight and are + negated. -/ +lemma repLorentzGroup_fermionicParity_ofGenerator (j : JetGenerators) : + repLorentzGroup fermionicParity [j]ₐ = (-1 : ℂ) ^ MassWeight j • [j]ₐ := by + cases j with + | dB s μ => + rw [ofGenerator_B_eq, repLorentzGroup_tmul, + bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity, + show LeptonSinglet.JetAlgebra.repLorentzGroup fermionicParity + (1 : LeptonSinglet.JetAlgebra) = 1 from + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one fermionicParity, + show MassWeight (JetGenerators.dB s μ) = 2 * (1 + Multiset.card s) from rfl, + Even.neg_one_pow ⟨1 + Multiset.card s, by ring⟩, one_smul] + rfl + | dψ s α => + rw [ofGenerator_dψ_eq, repLorentzGroup_tmul, + leptonSinglet_jetAlgebra_repLorentzGroup_fermionicParity_ofGenerator, + show MassWeight (JetGenerators.dψ s α) = 3 + 2 * Multiset.card s from rfl, + Odd.neg_one_pow ⟨1 + Multiset.card s, by ring⟩, neg_one_smul] + rw [show (BBoson.JetAlgebra.complexRepLorentzGroup fermionicParity) + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from by + rw [bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity]; rfl, tmul_neg'] + | dbarψ s α => + rw [ofGenerator_dbarψ_eq, repLorentzGroup_tmul, + leptonSinglet_jetAlgebra_repLorentzGroup_fermionicParity_ofGenerator, + show MassWeight (JetGenerators.dbarψ s α) = 3 + 2 * Multiset.card s from rfl, + Odd.neg_one_pow ⟨1 + Multiset.card s, by ring⟩, neg_one_smul] + rw [show (BBoson.JetAlgebra.complexRepLorentzGroup fermionicParity) + ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from by + rw [bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity]; rfl, tmul_neg'] + +/-- Evaluation of a mass-weight polynomial at a scalar. -/ +private noncomputable def evalAt (c : ℂ) : Polynomial JetAlgebra →ₐ[ℂ] JetAlgebra := + Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) (algebraMap ℂ JetAlgebra c) + fun a => (Algebra.commutes c a).symm + +private lemma evalAt_monomial (c : ℂ) (n : ℕ) (y : JetAlgebra) : + evalAt c (Polynomial.monomial n y) = c ^ n • y := by + show Polynomial.eval₂ (AlgHom.id ℂ JetAlgebra).toRingHom + (algebraMap ℂ JetAlgebra c) (Polynomial.monomial n y) = _ + rw [Polynomial.eval₂_monomial, ← map_pow, ← Algebra.commutes, ← Algebra.smul_def] + rfl + +/-- Fermionic parity is the mass-weight polynomial evaluated at `-1`. -/ +private lemma repLorentzGroupAlgHom_fermionicParity : + repLorentzGroupAlgHom fermionicParity = (evalAt (-1)).comp massWeightPoly := by + refine algHom_ext fun j => ?_ + show repLorentzGroup fermionicParity [j]ₐ = evalAt (-1) (massWeightPoly [j]ₐ) + rw [repLorentzGroup_fermionicParity_ofGenerator, massWeightPoly_ofGenerator, + evalAt_monomial] + +/-- On an element of mass weight `n`, fermionic parity acts by `(-1) ^ n`. -/ +lemma repLorentzGroup_fermionicParity_of_mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) : + repLorentzGroup fermionicParity x = (-1 : ℂ) ^ n • x := by + have h := AlgHom.congr_fun repLorentzGroupAlgHom_fermionicParity x + show repLorentzGroup fermionicParity x = _ + rw [show repLorentzGroup fermionicParity x = repLorentzGroupAlgHom fermionicParity x from rfl, + h, AlgHom.comp_apply, mem_massWeightSubmodule.mp hx, evalAt_monomial] + +/-! + +## F. The selection rule + +-/ + +/-- **No invariant has odd mass weight.** An element of odd mass weight that is invariant under + the Lorentz group vanishes: fermionic parity fixes it, being a Lorentz transformation, while + acting on it by `-1`, since its mass weight is odd. Physically: a Lagrangian term must contain + an even number of fermions. -/ +theorem eq_zero_of_odd_massWeight_of_forall_repLorentzGroup_eq {n : ℕ} (hn : Odd n) + {x : JetAlgebra} (hx : x ∈ massWeightSubmodule n) + (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) : x = 0 := by + have h1 : x = (-1 : ℂ) ^ n • x := by + rw [← repLorentzGroup_fermionicParity_of_mem_massWeightSubmodule hx, hinv] + rw [hn.neg_one_pow, neg_one_smul] at h1 + have h2 : (2 : ℂ) • x = 0 := by + calc (2 : ℂ) • x = x + x := two_smul ℂ x + _ = -x + x := congrArg (· + x) h1 + _ = 0 := neg_add_cancel x + rcases smul_eq_zero.mp h2 with h3 | h3 + · exact absurd h3 two_ne_zero + · exact h3 + +/-- An invariant element of odd mass weight vanishes. -/ +theorem eq_zero_of_odd_massWeight_of_isInvariant {n : ℕ} (hn : Odd n) {x : JetAlgebra} + (hx : x ∈ massWeightSubmodule n) (hinv : IsInvariant x) : x = 0 := + eq_zero_of_odd_massWeight_of_forall_repLorentzGroup_eq hn hx hinv.2 + +end JetAlgebra + +end LeptonGaugeSector + + diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean new file mode 100644 index 000000000..bebde0c49 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.MassDim +public import Physlib.Relativity.LorentzGroup.FermionicParity +/-! +# Grading due to hypercharge + +The JetAlgebra can be mapped into a `LaurentPolynomial` mapping generators +to exponents of the generator `T` corresponding to their hypercharge. +This map is an algebra map. For example `ψ ↦ T^(-6) • ψ` + +In the same way which mass dimension is defined through `Polynomial`, +we define a grading on `JetAlgebra` through `LaurentPolynomial`. + +This grading can be used to define a projection from `JetAlgebra` to itself +picking out only the subspace of terms which are charge singlets. + +Every term which is invariant is stable under this projection. +This result trivially generalizes to any theory based on the SM gauge group. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel Matrix MatrixGroups LorentzGroup + +namespace JetAlgebra + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Relativity/LorentzGroup/FermionicParity.lean b/Physlib/Relativity/LorentzGroup/FermionicParity.lean new file mode 100644 index 000000000..6b077e162 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/FermionicParity.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 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.Basic +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic +/-! + +# Fermionic parity + +## i. Overview + +The homomorphism `SL(2, ℂ) → LorentzGroup 3` is two-to-one, and the nontrivial element of its +kernel is `-1`. Physically it is the rotation by `2π`: it acts as the identity on every tensor, +and as `-1` on every spinor, so it measures the parity of the number of fermionic indices +carried by a quantity. We call it the *fermionic parity*. + +Because it lies in the Lorentz group's double cover and projects to the identity, any quantity +required to be invariant under `SL(2, ℂ)` is fixed by it. A quantity carrying an odd number of +spinor indices is negated by it, and therefore vanishes: this is the selection rule that forbids +terms with an odd number of fermions. + +## ii. Key results + +- `LorentzGroup.fermionicParity` : the nontrivial element of the kernel of the covering + `SL(2, ℂ) → LorentzGroup 3`. +- `LorentzGroup.toSelfAdjointMap_fermionicParity` : it acts trivially on self-adjoint matrices. +- `LorentzGroup.toLorentzGroup_fermionicParity` : it projects to the identity Lorentz + transformation. +- `LorentzGroup.fermionicParity_sq` : it squares to one. +- `LorentzGroup.fermionicParity_ne_one` : it is not itself the identity. + +## iii. Table of contents + +- A. Fermionic parity +- B. The action on vectors and on spinors + +-/ + +@[expose] public section + +open Matrix MatrixGroups + +namespace LorentzGroup + +/-! + +## A. Fermionic parity + +-/ + +/-- Fermionic parity: the nontrivial element `-1` of the kernel of the two-to-one homomorphism + `SL(2, ℂ) → LorentzGroup 3`, that is the rotation by `2π`. It acts trivially on tensors and by + `-1` on spinors. -/ +def fermionicParity : SL(2, ℂ) := -1 + +/-- Fermionic parity acts trivially on self-adjoint matrices: conjugation by `-1` is the + identity. -/ +lemma toSelfAdjointMap_fermionicParity : + Lorentz.SL2C.toSelfAdjointMap fermionicParity = LinearMap.id := by + ext A + rw [Lorentz.SL2C.toSelfAdjointMap_apply] + simp [fermionicParity, Matrix.conjTranspose_neg] + +/-- Fermionic parity projects to the identity Lorentz transformation: it is invisible on + tensors. -/ +lemma toLorentzGroup_fermionicParity : + Lorentz.SL2C.toLorentzGroup fermionicParity = 1 := by + ext i j + show Lorentz.SL2C.toMatrix fermionicParity i j = _ + rw [Lorentz.SL2C.toMatrix, MonoidHom.coe_mk, OneHom.coe_mk, + toSelfAdjointMap_fermionicParity, LinearMap.toMatrix_id] + rfl + +@[simp] +lemma fermionicParity_sq : fermionicParity ^ 2 = 1 := by + rw [fermionicParity, neg_pow, one_pow] + simp + +/-- Fermionic parity is not the identity of `SL(2, ℂ)`: the covering is genuinely + two-to-one. -/ +lemma fermionicParity_ne_one : fermionicParity ≠ 1 := by + intro h + have h1 : ((fermionicParity : SL(2, ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) 0 0 = -1 := by + simp [fermionicParity, SpecialLinearGroup.coe_neg] + rw [h] at h1 + simp only [SpecialLinearGroup.coe_one, Matrix.one_apply_eq] at h1 + norm_num at h1 + +/-! + +## B. The action on vectors and on spinors + +Fermionic parity is invisible on Lorentz vectors and acts by `-1` on Weyl spinors: this is what +makes it measure the parity of the number of spinor indices. + +-/ + +/-- Fermionic parity acts trivially on complex covariant Lorentz vectors, since it projects to + the identity Lorentz transformation. -/ +lemma coℂModule_SL2CRep_fermionicParity : + Lorentz.CoℂModule.SL2CRep fermionicParity = LinearMap.id := by + ext v + rw [Lorentz.CoℂModule.SL2CRep_val] + show ((LorentzGroup.toComplex (Lorentz.SL2C.toLorentzGroup fermionicParity))⁻¹ᵀ *ᵥ v.val) _ = _ + rw [toLorentzGroup_fermionicParity] + simp + +/-- Fermionic parity acts by `-1` on right-handed Weyl spinors. -/ +lemma rightHandedWeyl_rep_fermionicParity : + Fermion.RightHandedWeyl.rep fermionicParity = -LinearMap.id := by + refine Fermion.RightHandedWeyl.basis.ext fun i => ?_ + rw [Fermion.RightHandedWeyl.rep_apply_basis] + simp only [LinearMap.neg_apply, LinearMap.id_coe, id_eq] + rw [show ((fermionicParity : SL(2, ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = -1 from rfl] + fin_cases i <;> + simp [Matrix.one_apply, Fin.sum_univ_two] + +end LorentzGroup From c5414c73748a3bf6c680bfdb1f16f93fe4bfe928 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:38:02 +0100 Subject: [PATCH 118/254] feat: Add hypercharge grading Co-Authored-By: Claude --- .../JetAlgebra/Grading/Hypercharge.lean | 654 +++++++++++++++++- .../Grading/MassWeightAndHypercharge.lean | 108 +-- 2 files changed, 659 insertions(+), 103 deletions(-) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean index bebde0c49..3db8f4b38 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean @@ -5,14 +5,14 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDim -public import Physlib.Relativity.LorentzGroup.FermionicParity +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicParity +public import Mathlib.Algebra.Polynomial.Laurent /-! # Grading due to hypercharge The JetAlgebra can be mapped into a `LaurentPolynomial` mapping generators to exponents of the generator `T` corresponding to their hypercharge. -This map is an algebra map. For example `ψ ↦ T^(-6) • ψ` +This map is an algebra map. For example `ψ ↦ T^6 • ψ` In the same way which mass dimension is defined through `Polynomial`, we define a grading on `JetAlgebra` through `LaurentPolynomial`. @@ -23,15 +23,661 @@ picking out only the subspace of terms which are charge singlets. Every term which is invariant is stable under this projection. This result trivially generalizes to any theory based on the SM gauge group. +*Sign convention*: charges are normalized as `6Y`, and the generators of the jet algebra are +the *component functions* of the fields, which transform contragrediently to them. The +charged-lepton singlet is the `(1, 1)_{-6}` field, so its component function `ψ_α` carries +`+6`, matching `repJetGaugeGroupI_dψ_nil`; the conjugate component function `ψ̄_α` carries +`-6`, and the B-boson component functions carry `0`. + +Only the constant gauge transformations are used below, and they already suffice: a gauge jet +mixes derivative orders but not species, so the constant part is where the charge is read off. + +## i. Overview + +Every generator is an eigenvector of the constant `U(1)` gauge transformations, with the +character `z ↦ z ^ q` for `q` its hypercharge. Recording that exponent in the formal variable +`T` of a Laurent polynomial gives an algebra map `hyperchargePoly`, whose `T ^ q` coefficient +is the part of an element of hypercharge `q`. + +The constant gauge action is then literally the evaluation of the hypercharge polynomial at +the gauge parameter, `repJetGaugeGroupI_ofConstant_eq_evalUnit`. Invariance therefore says +that a fixed Laurent expression takes the same value at every point of the unit circle, which +by independence of the circle characters forces every charged component to vanish. + +## ii. Key results + +- `Hypercharge` : the hypercharge of a generator. +- `JetAlgebra.hyperchargePoly` : the hypercharge Laurent polynomial. +- `JetAlgebra.hyperchargeSubmodule` : the submodule of elements of a given hypercharge. +- `JetAlgebra.neutralProjection` : the projection onto the charge singlets. +- `JetAlgebra.mem_hyperchargeSubmodule_zero_of_isInvariant` : an invariant term is a charge + singlet. +- `JetAlgebra.neutralProjection_of_isInvariant` : an invariant term is fixed by the + projection. + +## iii. Table of contents + +- A. Laurent polynomials over a noncommutative ring +- B. The hypercharge Laurent polynomial +- C. The hypercharge grading +- D. Evaluation, and the constant gauge action +- E. Independence of the circle characters +- F. Invariant terms are charge singlets + -/ @[expose] public section namespace LeptonGaugeSector -open TensorProduct StandardModel Matrix MatrixGroups LorentzGroup +open TensorProduct StandardModel Matrix MatrixGroups LorentzGroup LaurentPolynomial + +/-- The hypercharge of a generator of the lepton–gauge-sector jet algebra, normalized as `6Y`. + The generators are component functions, so they carry the charge contragredient to that of + the field: `ψ_α` carries `+6` and `ψ̄_α` carries `-6`, while the B-boson component functions + are neutral. -/ +def Hypercharge : JetGenerators → ℤ + | JetGenerators.dB _ _ => 0 + | JetGenerators.dψ _ _ => 6 + | JetGenerators.dbarψ _ _ => -6 + +/-- The hypercharge of a generator of the charged-lepton factor. -/ +def leptonHypercharge : LeptonSinglet.JetGenerators → ℤ + | LeptonSinglet.JetGenerators.dψ _ _ => 6 + | LeptonSinglet.JetGenerators.dbarψ _ _ => -6 namespace JetAlgebra +/-! + +## A. Laurent polynomials over a noncommutative ring + +The coefficient ring here is the jet algebra, which is not commutative, so the parts of the +`LaurentPolynomial` API that assume commutativity — in particular `eval₂` — are unavailable. +The three facts below are all that is needed: how two Laurent monomials multiply and add, and +that `C` of a central element is central. + +-/ + +section Laurent + +variable {R : Type*} [Semiring R] + +/-- Laurent monomials multiply by adding exponents. -/ +lemma C_mul_T_mul_C_mul_T (a b : R) (m n : ℤ) : + C a * T m * (C b * T n) = C (a * b) * T (m + n) := by + rw [← single_eq_C_mul_T, ← single_eq_C_mul_T, ← single_eq_C_mul_T, + AddMonoidAlgebra.single_mul_single] + +/-- Laurent monomials of equal exponent add coefficientwise. -/ +lemma C_mul_T_add_C_mul_T (a b : R) (n : ℤ) : + C a * T n + C b * T n = C (a + b) * T n := by + rw [← add_mul, ← map_add] + +/-- `C` of a central element is central: multiplication by `C a` acts on each coefficient. -/ +lemma commute_C_of_central {a : R} (ha : ∀ z : R, Commute a z) (p : R[T;T⁻¹]) : + Commute (C a) p := by + induction p using AddMonoidAlgebra.induction_linear with + | zero => exact Commute.zero_right _ + | add p q hp hq => exact hp.add_right hq + | single m r => + show C a * _ = _ * C a + rw [← single_eq_C, AddMonoidAlgebra.single_mul_single, + AddMonoidAlgebra.single_mul_single, zero_add, add_zero, ha r] + +end Laurent + +/-- `LaurentPolynomial.C` as an algebra map. It is not `algebraMap`, which is unavailable + because the jet algebra is not commutative. -/ +noncomputable def CAlgHom : JetAlgebra →ₐ[ℂ] LaurentPolynomial JetAlgebra where + toFun := C + map_one' := map_one C + map_mul' := map_mul C + map_zero' := map_zero C + map_add' := map_add C + commutes' r := (LaurentPolynomial.algebraMap_apply r).symm + +@[simp] +lemma CAlgHom_apply (x : JetAlgebra) : CAlgHom x = C x := rfl + +/-- The bosonic factor is central in the jet algebra: it is a tensor factor, and the + complexified B-boson jet algebra is commutative. -/ +lemma commute_inclB (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (x : JetAlgebra) : + Commute (inclB a) x := by + induction x using JetAlgebra.induction_on with + | zero => exact Commute.zero_right _ + | add u v hu hv => exact hu.add_right hv + | tmul b l => + show inclB a * (b ⊗ⱼ l) = (b ⊗ⱼ l) * inclB a + rw [show inclB a = a ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, tmul_mul_tmul, + tmul_mul_tmul, mul_one, one_mul, mul_comm a b] + +/-! + +## B. The hypercharge Laurent polynomial + +The bosonic factor is neutral, so on it the hypercharge polynomial is the constant polynomial. +On the fermionic factor the generators are eigenvectors of charge `±6`; sending each to +`C · T ^ (±6)` squares to zero, because the two exponents cancel in the cross terms, so it +extends to the exterior algebra. + +-/ + +/-- The generator map of the hypercharge polynomial on the charged-lepton component space. -/ +noncomputable def hyperchargeι : + LeptonSinglet.JetComponentSpace →ₗ[ℂ] LaurentPolynomial JetAlgebra := + LeptonSinglet.JetComponentSpace.basis.constr ℂ fun j => + C (inclL (LeptonSinglet.JetAlgebra.ofGenerator j)) * T (leptonHypercharge j) + +@[simp] +lemma hyperchargeι_basis (j : LeptonSinglet.JetGenerators) : + hyperchargeι (LeptonSinglet.JetComponentSpace.basis j) = + C (inclL (LeptonSinglet.JetAlgebra.ofGenerator j)) * T (leptonHypercharge j) := by + rw [hyperchargeι, Module.Basis.constr_basis] + +/-- The generator map squares to zero: the exponents of a cross term cancel, leaving the + anticommutator of two exterior generators. -/ +lemma hyperchargeι_mul_self (v : LeptonSinglet.JetComponentSpace) : + hyperchargeι v * hyperchargeι v = 0 := by + set B := (LinearMap.mul ℂ (LaurentPolynomial JetAlgebra)).compl₁₂ hyperchargeι hyperchargeι + with hBdef + have hB : B + B.flip = 0 := + LinearMap.ext_basis LeptonSinglet.JetComponentSpace.basis + LeptonSinglet.JetComponentSpace.basis fun j k => by + simp only [hBdef, LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, + LinearMap.mul_apply', LinearMap.zero_apply, hyperchargeι_basis] + rw [C_mul_T_mul_C_mul_T, C_mul_T_mul_C_mul_T, + add_comm (leptonHypercharge k) (leptonHypercharge j), C_mul_T_add_C_mul_T, + ← map_mul inclL, ← map_mul inclL, ← map_add inclL, + show LeptonSinglet.JetAlgebra.ofGenerator j * + LeptonSinglet.JetAlgebra.ofGenerator k + + LeptonSinglet.JetAlgebra.ofGenerator k * + LeptonSinglet.JetAlgebra.ofGenerator j = 0 from + ExteriorAlgebra.ι_add_mul_swap _ _, + map_zero, map_zero, zero_mul] + have h2 : (2 : ℂ) • (hyperchargeι v * hyperchargeι v) = 0 := by + rw [two_smul] + exact LinearMap.congr_fun (LinearMap.congr_fun hB v) v + simpa [smul_smul] using congrArg (fun y => (2⁻¹ : ℂ) • y) h2 + +/-- The hypercharge polynomial on the charged-lepton factor. -/ +noncomputable def hyperchargePolyL : + LeptonSinglet.JetAlgebra →ₐ[ℂ] LaurentPolynomial JetAlgebra := + ExteriorAlgebra.lift ℂ ⟨hyperchargeι, hyperchargeι_mul_self⟩ + +@[simp] +lemma hyperchargePolyL_ofGenerator (j : LeptonSinglet.JetGenerators) : + hyperchargePolyL (LeptonSinglet.JetAlgebra.ofGenerator j) = + C (inclL (LeptonSinglet.JetAlgebra.ofGenerator j)) * T (leptonHypercharge j) := by + rw [show LeptonSinglet.JetAlgebra.ofGenerator j = + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis j) from rfl, + hyperchargePolyL, ExteriorAlgebra.lift_ι_apply, hyperchargeι_basis] + rfl + +/-- The hypercharge Laurent polynomial: the `ℂ`-algebra map sending each generator `j` to + `j * T ^ q`, where `q` is the hypercharge of `j`. The coefficient of `T ^ q` in the + hypercharge polynomial of an element is its part of hypercharge `q`. -/ +noncomputable def hyperchargePoly : JetAlgebra →ₐ[ℂ] LaurentPolynomial JetAlgebra := + Algebra.TensorProduct.lift (CAlgHom.comp inclB) hyperchargePolyL + fun a _ => commute_C_of_central (commute_inclB a) _ + +@[simp] +lemma hyperchargePoly_tmul (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : + hyperchargePoly (a ⊗ⱼ l) = C (inclB a) * hyperchargePolyL l := rfl + +/-- On the bosonic factor the hypercharge polynomial is constant: the B boson is neutral. -/ +lemma hyperchargePoly_inclB (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + hyperchargePoly (inclB a) = C (inclB a) := by + rw [show hyperchargePoly (inclB a) = C (inclB a) * hyperchargePolyL 1 from rfl, + map_one, mul_one] + +/-- On the fermionic factor the hypercharge polynomial is the charged-lepton one. -/ +lemma hyperchargePoly_inclL (l : LeptonSinglet.JetAlgebra) : + hyperchargePoly (inclL l) = hyperchargePolyL l := by + rw [show hyperchargePoly (inclL l) = + C (inclB (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra)) * hyperchargePolyL l from rfl, + map_one, map_one, one_mul] + +/-- Each generator is sent to `j * T ^ q`, where `q` is its hypercharge. -/ +@[simp] +lemma hyperchargePoly_ofGenerator (j : JetGenerators) : + hyperchargePoly [j]ₐ = C [j]ₐ * T (Hypercharge j) := by + cases j with + | dB s μ => + rw [show ([JetGenerators.dB s μ]ₐ : JetAlgebra) = inclB ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) from rfl, + hyperchargePoly_inclB, show Hypercharge (JetGenerators.dB s μ) = 0 from rfl, T_zero, + mul_one] + | dψ s α => + rw [show ([JetGenerators.dψ s α]ₐ : JetAlgebra) = inclL + (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α)) from rfl, + hyperchargePoly_inclL, hyperchargePolyL_ofGenerator] + rfl + | dbarψ s α => + rw [show ([JetGenerators.dbarψ s α]ₐ : JetAlgebra) = inclL + (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α)) + from rfl, + hyperchargePoly_inclL, hyperchargePolyL_ofGenerator] + rfl + +/-! + +## C. The hypercharge grading + +-/ + +/-- The submodule of elements of hypercharge `q`: those `x` whose hypercharge polynomial is + `x * T ^ q`. -/ +def hyperchargeSubmodule (q : ℤ) : Submodule ℂ JetAlgebra where + carrier := {x | hyperchargePoly x = C x * T q} + add_mem' {a b} ha hb := by + simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ + rw [ha, hb, add_mul] + zero_mem' := by simp + smul_mem' c x hx := by + simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ + rw [hx, Algebra.smul_def, Algebra.smul_def, LaurentPolynomial.algebraMap_apply, ← mul_assoc, + ← map_mul] + +@[simp] +lemma mem_hyperchargeSubmodule {q : ℤ} {x : JetAlgebra} : + x ∈ hyperchargeSubmodule q ↔ hyperchargePoly x = C x * T q := Iff.rfl + +/-- Hypercharges add under multiplication. -/ +lemma mul_mem_hyperchargeSubmodule {p q : ℤ} {x y : JetAlgebra} + (hx : x ∈ hyperchargeSubmodule p) (hy : y ∈ hyperchargeSubmodule q) : + x * y ∈ hyperchargeSubmodule (p + q) := by + simp only [mem_hyperchargeSubmodule, map_mul] at hx hy ⊢ + rw [hx, hy, C_mul_T_mul_C_mul_T, map_mul] + +/-- Hypercharges add under multiplication, and `1` is neutral. -/ +instance : SetLike.GradedMonoid hyperchargeSubmodule where + one_mem := by + show hyperchargePoly 1 = C 1 * T 0 + rw [T_zero, mul_one, map_one, map_one] + mul_mem _ _ _ _ hx hy := mul_mem_hyperchargeSubmodule hx hy + +/-- The generator `j` has hypercharge `Hypercharge j`. -/ +lemma ofGenerator_mem_hyperchargeSubmodule (j : JetGenerators) : + [j]ₐ ∈ hyperchargeSubmodule (Hypercharge j) := + hyperchargePoly_ofGenerator j + +/-- The hypercharge-`q` component of an element: the coefficient of `T ^ q` in its hypercharge + polynomial. -/ +noncomputable def chargeComponent (q : ℤ) : JetAlgebra →ₗ[ℂ] JetAlgebra where + toFun x := (hyperchargePoly x).coeff q + map_add' x y := by rw [map_add]; rfl + map_smul' c x := by rw [map_smul]; rfl + +@[simp] +lemma chargeComponent_apply (q : ℤ) (x : JetAlgebra) : + chargeComponent q x = (hyperchargePoly x).coeff q := rfl + +/-- On a homogeneous element the component of its own charge is the element itself. -/ +lemma chargeComponent_of_mem {q : ℤ} {x : JetAlgebra} (hx : x ∈ hyperchargeSubmodule q) : + chargeComponent q x = x := by + rw [chargeComponent_apply, mem_hyperchargeSubmodule.mp hx, ← single_eq_C_mul_T, + AddMonoidAlgebra.coeff_single, Finsupp.single_eq_same] + +/-- On a homogeneous element every other charge component vanishes. -/ +lemma chargeComponent_of_mem_ne {p q : ℤ} {x : JetAlgebra} (hpq : p ≠ q) + (hx : x ∈ hyperchargeSubmodule p) : chargeComponent q x = 0 := by + rw [chargeComponent_apply, mem_hyperchargeSubmodule.mp hx, ← single_eq_C_mul_T, + AddMonoidAlgebra.coeff_single, Finsupp.single_apply, if_neg hpq] + +/-- The projection onto the charge singlets: the part of hypercharge zero. -/ +noncomputable def neutralProjection : JetAlgebra →ₗ[ℂ] JetAlgebra := chargeComponent 0 + +lemma neutralProjection_apply (x : JetAlgebra) : + neutralProjection x = (hyperchargePoly x).coeff 0 := rfl + +/-! + +## D. Evaluation, and the constant gauge action + +Setting the formal variable to an invertible scalar gives an algebra map back to the jet +algebra. Evaluating at `1` recovers the element; evaluating at a unitary scalar `z` is exactly +the action of the constant gauge transformation with `U(1)` part `z`. + +-/ + +/-- The character `k ↦ z ^ k` of a unit, valued in the jet algebra. -/ +noncomputable def charMonoidHom (z : ℂˣ) : Multiplicative ℤ →* JetAlgebra := + ((algebraMap ℂ JetAlgebra).toMonoidHom.comp (Units.coeHom ℂ)).comp (zpowersHom ℂˣ z) + +@[simp] +lemma charMonoidHom_apply (z : ℂˣ) (k : ℤ) : + charMonoidHom z (Multiplicative.ofAdd k) = algebraMap ℂ JetAlgebra ((z : ℂ) ^ k) := by + simp [charMonoidHom, Units.val_zpow_eq_zpow_val] + +/-- Evaluation of a Laurent polynomial at an invertible scalar. The jet algebra is not + commutative, so this is multiplicative only because the scalars are central. -/ +noncomputable def evalUnit (z : ℂˣ) : LaurentPolynomial JetAlgebra →ₐ[ℂ] JetAlgebra := + AddMonoidAlgebra.liftNCAlgHom (AlgHom.id ℂ JetAlgebra) (charMonoidHom z) + fun x k => by + rw [show charMonoidHom z k = + algebraMap ℂ JetAlgebra ((z : ℂ) ^ (Multiplicative.toAdd k)) from + charMonoidHom_apply z _] + exact (Algebra.commutes _ _).symm + +lemma evalUnit_single (z : ℂˣ) (k : ℤ) (a : JetAlgebra) : + evalUnit z (AddMonoidAlgebra.single k a) = ((z : ℂ) ^ k) • a := by + show AddMonoidAlgebra.liftNC _ _ _ = _ + rw [AddMonoidAlgebra.liftNC_single, charMonoidHom_apply] + show a * algebraMap ℂ JetAlgebra ((z : ℂ) ^ k) = _ + rw [← Algebra.commutes, ← Algebra.smul_def] + +@[simp] +lemma evalUnit_C_mul_T (z : ℂˣ) (k : ℤ) (a : JetAlgebra) : + evalUnit z (C a * T k) = ((z : ℂ) ^ k) • a := by + rw [← single_eq_C_mul_T, evalUnit_single] + +/-- Evaluation is the sum of the coefficients, weighted by the powers of the scalar. -/ +lemma evalUnit_eq_sum (z : ℂˣ) (p : LaurentPolynomial JetAlgebra) : + evalUnit z p = ∑ k ∈ p.coeff.support, ((z : ℂ) ^ k) • p.coeff k := by + have hsum : ∀ q : LaurentPolynomial JetAlgebra, + evalUnit z q = q.coeff.sum fun k a => ((z : ℂ) ^ k) • a := by + intro q + induction q using AddMonoidAlgebra.induction_linear with + | zero => simp + | add u v hu hv => + rw [map_add, hu, hv, AddMonoidAlgebra.coeff_add, + Finsupp.sum_add_index' (fun k => smul_zero _) fun k a b => smul_add _ a b] + | single m r => + rw [evalUnit_single, AddMonoidAlgebra.coeff_single, Finsupp.sum] + by_cases hr : r = 0 + · subst hr + simp + · rw [Finsupp.support_single m hr, Finset.sum_singleton, Finsupp.single_eq_same] + exact hsum p + +/-- Setting the formal variable to one recovers the original element. -/ +lemma evalUnit_one_hyperchargePoly (x : JetAlgebra) : evalUnit 1 (hyperchargePoly x) = x := by + have h : (evalUnit 1).comp hyperchargePoly = AlgHom.id ℂ JetAlgebra := by + refine algHom_ext fun j => ?_ + rw [AlgHom.comp_apply, hyperchargePoly_ofGenerator, evalUnit_C_mul_T] + simp + exact AlgHom.congr_fun h x + +/-- Every element is the sum of its charge components. -/ +lemma eq_sum_chargeComponent (x : JetAlgebra) : + x = ∑ k ∈ (hyperchargePoly x).coeff.support, chargeComponent k x := by + conv_lhs => rw [← evalUnit_one_hyperchargePoly x] + rw [evalUnit_eq_sum] + exact Finset.sum_congr rfl fun k _ => by simp + +/-- The `U(1)` part of a gauge-group element, as a unit of `ℂ`. -/ +noncomputable def u1Unit (g : GaugeGroupI) : ℂˣ where + val := (g.2.2 : ℂ) + inv := star (g.2.2 : ℂ) + val_inv := (Unitary.mem_iff.mp g.2.2.2).2 + inv_val := (Unitary.mem_iff.mp g.2.2.2).1 + +@[simp] +lemma u1Unit_val (g : GaugeGroupI) : ((u1Unit g : ℂˣ) : ℂ) = (g.2.2 : ℂ) := rfl + +lemma u1Unit_inv (g : GaugeGroupI) : + (((u1Unit g)⁻¹ : ℂˣ) : ℂ) = star (g.2.2 : ℂ) := rfl + +/-- The constant gauge action on the charged-lepton component space is diagonal on the + generator basis, with the hypercharge character as eigenvalue. -/ +lemma leptonSinglet_repJetGaugeGroupI_ofConstant_basis (g : GaugeGroupI) + (j : LeptonSinglet.JetGenerators) : + LeptonSinglet.JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) + (LeptonSinglet.JetComponentSpace.basis j) = + ((u1Unit g : ℂ) ^ leptonHypercharge j) • LeptonSinglet.JetComponentSpace.basis j := by + have hu : ((((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing)) : JetRing) = + MvPowerSeries.C ((g.2.2 : ℂ)) := rfl + cases j with + | dψ s α => + rw [show leptonHypercharge (LeptonSinglet.JetGenerators.dψ s α) = (6 : ℕ) from rfl, + zpow_natCast, u1Unit_val, LeptonSinglet.JetComponentSpace.basis_dψ, + LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl, hu, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp [TensorProduct.smul_tmul', Prod.smul_mk] + | dbarψ s α => + rw [show leptonHypercharge (LeptonSinglet.JetGenerators.dbarψ s α) = -(6 : ℕ) from rfl, + _root_.zpow_neg, zpow_natCast, ← inv_pow, ← Units.val_inv_eq_inv_val, u1Unit_inv, + LeptonSinglet.JetComponentSpace.basis_dbarψ, + LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr, hu, JetRing.star_C, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp [TensorProduct.smul_tmul', Prod.smul_mk] + +/-- A jet of a constant gauge transformation acts on each generator by its hypercharge + character. -/ +lemma repJetGaugeGroupI_ofConstant_ofGenerator (g : GaugeGroupI) (j : JetGenerators) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) [j]ₐ = + ((u1Unit g : ℂ) ^ Hypercharge j) • [j]ₐ := by + cases j with + | dB s μ => + rw [show ([JetGenerators.dB s μ]ₐ : JetAlgebra) = inclB ((1 : ℂ) ⊗ₜ[ℝ] + BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) from rfl, + show Hypercharge (JetGenerators.dB s μ) = 0 from rfl, zpow_zero, one_smul, + show inclB ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) = + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ⱼ + (1 : LeptonSinglet.JetAlgebra) from rfl, + repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one] + | dψ s α => + rw [show ([JetGenerators.dψ s α]ₐ : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ + LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) from rfl, + repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + show LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) = + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis + (LeptonSinglet.JetGenerators.dψ s α)) from rfl, + ExteriorAlgebra.map_apply_ι, leptonSinglet_repJetGaugeGroupI_ofConstant_basis, map_smul, + tmul_smul] + rfl + | dbarψ s α => + rw [show ([JetGenerators.dbarψ s α]ₐ : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ + LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) from rfl, + repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, + LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, + show LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) = + ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis + (LeptonSinglet.JetGenerators.dbarψ s α)) from rfl, + ExteriorAlgebra.map_apply_ι, leptonSinglet_repJetGaugeGroupI_ofConstant_basis, map_smul, + tmul_smul] + rfl + +/-- The constant gauge action is the evaluation of the hypercharge polynomial at the gauge + parameter. This is the content of the hypercharge grading: the `U(1)` gauge group acts + through the formal variable alone. -/ +lemma repJetGaugeGroupI_ofConstant_eq_evalUnit (g : GaugeGroupI) (x : JetAlgebra) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = + evalUnit (u1Unit g) (hyperchargePoly x) := by + have h : repAlgHom (JetGaugeGroupI.ofConstant g) = + (evalUnit (u1Unit g)).comp hyperchargePoly := by + refine algHom_ext fun j => ?_ + rw [AlgHom.comp_apply, hyperchargePoly_ofGenerator, evalUnit_C_mul_T, + ← repJetGaugeGroupI_eq_repAlgHom, repJetGaugeGroupI_ofConstant_ofGenerator] + rw [repJetGaugeGroupI_eq_repAlgHom, h, AlgHom.comp_apply] + +/-! + +## E. Independence of the circle characters + +A finite Laurent combination of the characters `z ↦ z ^ k` that vanishes on the whole unit +circle has vanishing coefficients: after clearing the negative powers it becomes a polynomial +with infinitely many roots. + +-/ + +/-- The unit-circle exponential is unitary. -/ +lemma exp_mul_I_mem_unitary (θ : ℝ) : + Complex.exp ((θ : ℂ) * Complex.I) ∈ unitary ℂ := by + have hstar : star (Complex.exp ((θ : ℂ) * Complex.I)) = + Complex.exp (-((θ : ℂ) * Complex.I)) := by + rw [show star (Complex.exp ((θ : ℂ) * Complex.I)) = + (starRingEnd ℂ) (Complex.exp ((θ : ℂ) * Complex.I)) from rfl, + ← Complex.exp_conj] + congr 1 + simp [Complex.conj_ofReal] + rw [Unitary.mem_iff] + constructor + · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] + · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero] + +/-- The unit-circle exponentials are injective on `(0, 1)`. -/ +lemma exp_mul_I_injOn : + Set.InjOn (fun θ : ℝ => Complex.exp ((θ : ℂ) * Complex.I)) + (Set.Ioo (0 : ℝ) 1) := by + intro a ha b hb hab + rcases Complex.exp_eq_exp_iff_exists_int.mp hab with ⟨n, hn⟩ + have h2 : (a : ℂ) = (b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ)) := by + have h1 : (a : ℂ) * Complex.I = + ((b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ))) * Complex.I := by + rw [hn] + ring + exact mul_right_cancel₀ Complex.I_ne_zero h1 + have h3 : a = b + (n : ℝ) * (2 * Real.pi) := by exact_mod_cast h2 + have hn0 : n = 0 := by + by_contra hne + have h4 : (1 : ℝ) ≤ |(n : ℝ)| := by exact_mod_cast Int.one_le_abs hne + have hπ : (2 : ℝ) ≤ Real.pi := Real.two_le_pi + have h5 : |a - b| < 1 := by + rw [abs_sub_lt_iff] + constructor <;> nlinarith [ha.1, ha.2, hb.1, hb.2] + rw [h3] at h5 + simp only [add_sub_cancel_left] at h5 + rw [abs_mul, abs_of_pos (by positivity : (0 : ℝ) < 2 * Real.pi)] at h5 + nlinarith + rw [hn0] at h3 + push_cast at h3 + linarith + +/-- Independence of the circle characters: a finite Laurent combination vanishing on the unit + circle has vanishing coefficients. -/ +lemma eq_zero_of_forall_circle_sum_zpow_smul_eq_zero {V : Type*} [AddCommGroup V] + [Module ℂ V] (s : Finset ℤ) (v : ℤ → V) + (h : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0) + {k : ℤ} (hk : k ∈ s) : v k = 0 := by + rw [← Module.forall_dual_apply_eq_zero_iff ℂ] + intro φ + have hne : s.Nonempty := ⟨k, hk⟩ + set n₀ : ℤ := -s.min' hne with hn₀ + have hshift : ∀ j ∈ s, 0 ≤ j + n₀ := fun j hj => by + have := s.min'_le j hj + omega + have heval : ∀ θ : ℝ, Polynomial.eval (Complex.exp ((θ : ℂ) * Complex.I)) + (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by + intro θ + have hz0 : Complex.exp ((θ : ℂ) * Complex.I) ≠ 0 := Complex.exp_ne_zero _ + have h2 := congrArg φ (h θ) + rw [map_sum, map_zero] at h2 + have h3 : ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by + rw [← h2] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl + have h4 : Complex.exp ((θ : ℂ) * Complex.I) ^ n₀ * + ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by + rw [h3, mul_zero] + rw [Finset.mul_sum] at h4 + rw [Polynomial.eval_finsetSum, ← h4] + refine Finset.sum_congr rfl fun j hj => ?_ + rw [Polynomial.eval_monomial, + show Complex.exp ((θ : ℂ) * Complex.I) ^ (j + n₀).toNat = + Complex.exp ((θ : ℂ) * Complex.I) ^ ((j + n₀) : ℤ) from by + rw [← zpow_natCast, Int.toNat_of_nonneg (hshift j hj)], + zpow_add₀ hz0] + ring + have hzero : (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by + refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ + refine Set.Infinite.mono ?_ + ((Set.Ioo_infinite (by norm_num : (0 : ℝ) < 1)).image exp_mul_I_injOn) + rintro z ⟨θ, _, rfl⟩ + exact heval θ + have hcoeff := congrArg (fun p => Polynomial.coeff p (k + n₀).toNat) hzero + rw [Polynomial.finsetSum_coeff] at hcoeff + rw [Finset.sum_eq_single k + (fun j hj hjk => by + rw [Polynomial.coeff_monomial, if_neg (fun heq => hjk (by + have h1 : j + n₀ = k + n₀ := by + rw [← Int.toNat_of_nonneg (hshift j hj), + ← Int.toNat_of_nonneg (hshift k hk), heq] + omega))]) + (fun hks => absurd hk hks)] at hcoeff + simpa using hcoeff + +/-- The constant `U(1)` gauge transformation at a unitary scalar. -/ +noncomputable def u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : GaugeGroupI := (1, 1, ⟨z, hz⟩) + +@[simp] +lemma u1Unit_u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : + ((u1Unit (u1Gauge z hz) : ℂˣ) : ℂ) = z := rfl + +/-! + +## F. Invariant terms are charge singlets + +An invariant element is fixed by every constant gauge transformation, so its hypercharge +polynomial takes the same value at every point of the unit circle. By independence of the +circle characters its charged components all vanish, so it is homogeneous of hypercharge zero +and is fixed by the projection onto the charge singlets. + +-/ + +/-- An element fixed by every constant gauge transformation is a charge singlet. -/ +lemma mem_hyperchargeSubmodule_zero_of_forall_repJetGaugeGroupI_ofConstant_eq {x : JetAlgebra} + (h : ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x) : + x ∈ hyperchargeSubmodule 0 := by + set p := hyperchargePoly x with hp + set s : Finset ℤ := insert 0 p.coeff.support with hs + set v : ℤ → JetAlgebra := fun k => p.coeff k - (if k = 0 then x else 0) with hv + have hcirc : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0 := by + intro θ + set z : ℂ := Complex.exp ((θ : ℂ) * Complex.I) with hz + set g : GaugeGroupI := u1Gauge z (exp_mul_I_mem_unitary θ) with hg + have hsum : ∑ j ∈ s, z ^ j • p.coeff j = x := by + have h1 : evalUnit (u1Unit g) p = x := by + rw [hp, ← repJetGaugeGroupI_ofConstant_eq_evalUnit, h g] + rw [← h1, evalUnit_eq_sum, u1Unit_u1Gauge] + refine (Finset.sum_subset (Finset.subset_insert _ _) fun j _ hj => ?_).symm + rw [Finsupp.notMem_support_iff.mp hj, smul_zero] + have hx0 : ∑ j ∈ s, z ^ j • (if j = 0 then x else 0) = x := by + rw [Finset.sum_eq_single (0 : ℤ) (fun j _ hj => by simp [hj]) + (fun hns => absurd (Finset.mem_insert_self (0 : ℤ) _) hns)] + simp + have hsplit : ∑ j ∈ s, z ^ j • v j = + (∑ j ∈ s, z ^ j • p.coeff j) - ∑ j ∈ s, z ^ j • (if j = 0 then x else 0) := by + rw [← Finset.sum_sub_distrib] + exact Finset.sum_congr rfl fun j _ => by rw [hv]; exact smul_sub _ _ _ + rw [hsplit, hsum, hx0, sub_self] + have hzero : ∀ k ∈ s, v k = 0 := fun k hk => + eq_zero_of_forall_circle_sum_zpow_smul_eq_zero s v hcirc hk + have hcoeff0 : p.coeff 0 = x := by + have h0 := hzero 0 (Finset.mem_insert_self _ _) + rw [hv] at h0 + simpa using sub_eq_zero.mp (by simpa using h0) + have hcoeffk : ∀ k : ℤ, k ≠ 0 → p.coeff k = 0 := by + intro k hk + by_cases hks : k ∈ p.coeff.support + · have hkz := hzero k (Finset.mem_insert_of_mem hks) + rw [hv] at hkz + simpa [hk] using hkz + · exact Finsupp.notMem_support_iff.mp hks + rw [mem_hyperchargeSubmodule, ← hp, ← single_eq_C_mul_T] + refine LaurentPolynomial.ext fun k => ?_ + rw [AddMonoidAlgebra.coeff_single, Finsupp.single_apply] + by_cases hk : (0 : ℤ) = k + · rw [if_pos hk, ← hk, hcoeff0] + · rw [if_neg hk, hcoeffk k (fun h => hk h.symm)] + +/-- An invariant term is a charge singlet: it is homogeneous of hypercharge zero. -/ +lemma mem_hyperchargeSubmodule_zero_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : + x ∈ hyperchargeSubmodule 0 := + mem_hyperchargeSubmodule_zero_of_forall_repJetGaugeGroupI_ofConstant_eq fun _ => hx.1 _ + +/-- Every invariant term is stable under the projection onto the charge singlets. -/ +lemma neutralProjection_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : + neutralProjection x = x := + chargeComponent_of_mem (mem_hyperchargeSubmodule_zero_of_isInvariant hx) + +/-- Every charged component of an invariant term vanishes. -/ +lemma chargeComponent_of_isInvariant {q : ℤ} (hq : q ≠ 0) {x : JetAlgebra} + (hx : IsInvariant x) : chargeComponent q x = 0 := + chargeComponent_of_mem_ne (fun h => hq h.symm) + (mem_hyperchargeSubmodule_zero_of_isInvariant hx) + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean index 4a546b7a4..5bd0c6423 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Basic +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.Hypercharge /-! # The mass-weight and hypercharge gradings @@ -24,6 +25,14 @@ components. The selection rules `eq_zero_of_eq_smul_of_ne_one`, `eq_zero_of_charge_ne_zero` and the parity rule `eq_zero_of_mem_covMonomialSpan_odd` kill all components except those of even weight and zero charge. + +The hypercharge grading itself, together with the unit-circle machinery that makes the charge +decomposition work — `u1Gauge`, `exp_mul_I_mem_unitary`, `exp_mul_I_injOn` and the +independence of the circle characters — now lives upstream in +`LeptonGaugeSector/JetAlgebra/Grading/Hypercharge`, which also carries the canonical form of +the neutral selection rule, `mem_hyperchargeSubmodule_zero_of_isInvariant`. What is left here +is only the refinement that keeps track of the *monomial* structure alongside the charge, +which the classification needs and the grading alone does not give. -/ @[expose] public section @@ -505,25 +514,6 @@ lemma eq_zero_of_eq_smul_of_ne_one {y : JetAlgebra} {c : ℂ} · exact absurd (sub_eq_zero.mp h3) hc · exact h3 -/-- The unit-circle exponential is unitary. -/ -lemma exp_mul_I_mem_unitary (θ : ℝ) : - Complex.exp ((θ : ℂ) * Complex.I) ∈ unitary ℂ := by - have hstar : star (Complex.exp ((θ : ℂ) * Complex.I)) = - Complex.exp (-((θ : ℂ) * Complex.I)) := by - rw [show star (Complex.exp ((θ : ℂ) * Complex.I)) = - (starRingEnd ℂ) (Complex.exp ((θ : ℂ) * Complex.I)) from rfl, - ← Complex.exp_conj] - congr 1 - simp [Complex.conj_ofReal] - rw [Unitary.mem_iff] - constructor - · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] - · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero] - -/-- The constant `U(1)` gauge transformation at a unitary scalar. -/ -noncomputable def u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : GaugeGroupI := - (1, 1, ⟨z, hz⟩) - /-- The hypercharge selection rule: a constant-gauge eigenvector of nonzero charge admits no invariant. -/ lemma eq_zero_of_charge_ne_zero {y : JetAlgebra} {k : ℤ} (hk : k ≠ 0) @@ -560,86 +550,6 @@ charge components, and a constant-gauge invariant equals its neutral component. -/ -/-- The unit-circle exponentials are injective on `(0, 1)`. -/ -lemma exp_mul_I_injOn : - Set.InjOn (fun θ : ℝ => Complex.exp ((θ : ℂ) * Complex.I)) - (Set.Ioo (0 : ℝ) 1) := by - intro a ha b hb hab - rcases Complex.exp_eq_exp_iff_exists_int.mp hab with ⟨n, hn⟩ - have h2 : (a : ℂ) = (b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ)) := by - have h1 : (a : ℂ) * Complex.I = - ((b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ))) * Complex.I := by - rw [hn] - ring - exact mul_right_cancel₀ Complex.I_ne_zero h1 - have h3 : a = b + (n : ℝ) * (2 * Real.pi) := by exact_mod_cast h2 - have hn0 : n = 0 := by - by_contra hne - have h4 : (1 : ℝ) ≤ |(n : ℝ)| := by exact_mod_cast Int.one_le_abs hne - have hπ : (2 : ℝ) ≤ Real.pi := Real.two_le_pi - have h5 : |a - b| < 1 := by - rw [abs_sub_lt_iff] - constructor <;> nlinarith [ha.1, ha.2, hb.1, hb.2] - rw [h3] at h5 - simp only [add_sub_cancel_left] at h5 - rw [abs_mul, abs_of_pos (by positivity : (0 : ℝ) < 2 * Real.pi)] at h5 - nlinarith - rw [hn0] at h3 - push_cast at h3 - linarith - -/-- Independence of the circle characters: a finite Laurent combination - vanishing on the unit circle has vanishing coefficients. -/ -lemma eq_zero_of_forall_circle_sum_zpow_smul_eq_zero (s : Finset ℤ) - (v : ℤ → JetAlgebra) - (h : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0) - {k : ℤ} (hk : k ∈ s) : v k = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hne : s.Nonempty := ⟨k, hk⟩ - set n₀ : ℤ := -s.min' hne with hn₀ - have hshift : ∀ j ∈ s, 0 ≤ j + n₀ := fun j hj => by - have := s.min'_le j hj - omega - have heval : ∀ θ : ℝ, Polynomial.eval (Complex.exp ((θ : ℂ) * Complex.I)) - (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by - intro θ - have hz0 : Complex.exp ((θ : ℂ) * Complex.I) ≠ 0 := Complex.exp_ne_zero _ - have h2 := congrArg φ (h θ) - rw [map_sum, map_zero] at h2 - have h3 : ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by - rw [← h2] - exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl - have h4 : Complex.exp ((θ : ℂ) * Complex.I) ^ n₀ * - ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by - rw [h3, mul_zero] - rw [Finset.mul_sum] at h4 - rw [Polynomial.eval_finsetSum, ← h4] - refine Finset.sum_congr rfl fun j hj => ?_ - rw [Polynomial.eval_monomial, - show Complex.exp ((θ : ℂ) * Complex.I) ^ (j + n₀).toNat = - Complex.exp ((θ : ℂ) * Complex.I) ^ ((j + n₀) : ℤ) from by - rw [← zpow_natCast, Int.toNat_of_nonneg (hshift j hj)], - zpow_add₀ hz0] - ring - have hzero : (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by - refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ - refine Set.Infinite.mono ?_ - ((Set.Ioo_infinite (by norm_num : (0 : ℝ) < 1)).image exp_mul_I_injOn) - rintro z ⟨θ, _, rfl⟩ - exact heval θ - have hcoeff := congrArg (fun p => Polynomial.coeff p (k + n₀).toNat) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - rw [Finset.sum_eq_single k - (fun j hj hjk => by - rw [Polynomial.coeff_monomial, if_neg (fun heq => hjk (by - have h1 : j + n₀ = k + n₀ := by - rw [← Int.toNat_of_nonneg (hshift j hj), - ← Int.toNat_of_nonneg (hshift k hk), heq] - omega))]) - (fun hks => absurd hk hks)] at hcoeff - simpa [Polynomial.coeff_monomial] using hcoeff - /-- The charge-`6k` part of a weight sector: the span of the covariant monomials of weight `m` and hypercharge `6 k`. -/ noncomputable def chargeCovSpan (m : ℕ) (k : ℤ) : Submodule ℂ JetAlgebra := From 684ba750155ad449ab13d1252f5d856508442fd6 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:43:14 +0100 Subject: [PATCH 119/254] feat: Add irrep stub --- .../JetAlgebra/Grading/Irrep.lean | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean new file mode 100644 index 000000000..42f553fae --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FermionicParity +public import Mathlib.Algebra.Polynomial.Laurent +/-! +# Grading by irreps + +We can grade the *covariant algebra* by irreducible representations of the +global gauge group and the Lorentz group. + +The irreps are determine the number of covariant derivatives acting on which field. + +This grading is invariant under the action of both the gauge transformation +and the Lorentz group. + +-/ From 4fee897399846d7e1e05d76eca6c95aad7b84527 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 15:53:19 +0100 Subject: [PATCH 120/254] feat: Simplify --- .../JetAlgebra/FieldStrength.lean | 8 + .../JetAlgebra/Invariants.lean | 8 +- .../Invariants/Averages/BoostAverage.lean | 549 ++----- .../Averages/BoostAvgProjector.lean | 75 + .../BoostAvgProjectorOnPhotonPairs.lean | 747 ++++------ .../Invariants/Averages/RotationAverage.lean | 2 +- .../JetAlgebra/Invariants/Basic.lean | 4 +- .../Grading/MassWeightAndHypercharge.lean | 226 +-- .../Invariants/Grading/NeutralSectors.lean | 132 +- .../Invariants/Subgroups/AxisBoosts.lean | 24 +- .../Subgroups/BoostsOnFermionTerms.lean | 871 ------------ .../Subgroups/BoostsOnFieldStrength.lean | 547 ------- .../BoostsOnFieldStrengthDerivatives.lean | 1002 ------------- .../Subgroups/BoostsOnPhotonTerms.lean | 1255 ----------------- .../JetAlgebra/LorentzAction.lean | 54 + .../JetAlgebra/Terms/KineticTerms.lean | 14 +- .../JetAlgebra/Terms/MaxwellTerm.lean | 27 +- .../JetAlgebra/Terms/ThetaTerm.lean | 8 +- 18 files changed, 728 insertions(+), 4825 deletions(-) delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean index dea32ad1d..4c0169590 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean @@ -32,6 +32,13 @@ noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ⱼ 1 +/-- Reordering the two derivative indices of a second-derivative field + strength. -/ +lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {r, s} a b = fieldStrengthDeriv {s, r} a b := by + have h : ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) = {s, r} := Multiset.cons_swap r s 0 + rw [h] + /-- Antisymmetry of the embedded field-strength derivatives in the two field indices. -/ lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) @@ -54,6 +61,7 @@ lemma fieldStrengthDeriv_inr_inl (s : Multiset (Fin 1 ⊕ Fin 3)) (i : Fin 3) fieldStrengthDeriv_antisymm s (Sum.inl j) (Sum.inr i) /-- The field strength vanishes on a repeated index. -/ +@[simp] lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ μ = 0 := by have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean index dc32bfbe7..2f3511e77 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean @@ -70,10 +70,10 @@ subgroup sits opposite the average taken over it. * `Invariants/Subgroups/` — which subgroup, acting on what. `RotationsPi` defines the rotations by `π` and the subgroup they generate; `AxisBoosts` defines the one-parameter boosts along the three coordinate axes and the two - fixed `z`-boosts; `BoostsOnFieldStrength`, - `BoostsOnFieldStrengthDerivatives`, `BoostsOnPhotonTerms` and - `BoostsOnFermionTerms` tabulate how the boosts move `F_{μν}`, - `∂_ρ ∂_τ F_{μν}`, the products `F F` and the fermion bilinears. + fixed `z`-boosts. How the boosts move `F_{μν}`, `∂_ρ ∂_τ F_{μν}`, the products + `F F` and the fermion bilinears is not tabulated: it follows from the + transformation laws of `LorentzAction`, and the `boostAvg_calculator` tactic + of `Averages/BoostAverage` derives it on demand. * `Invariants/Averages/` — the average over each of those subgroups, and what it does to the monomials. `RotationAverage` stands opposite `Subgroups/RotationsPi` and kills the weight-four sector; diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean index 33b31e0ae..99738099f 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean @@ -9,8 +9,9 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages /-! # The average over the boosts -The average over the boosts of `Subgroups/AxisBoosts`, whose action on the -weight-eight monomials is tabulated in the `Subgroups/BoostsOn*` files. +The average over the boosts of `Subgroups/AxisBoosts`. Their action on the weight-eight +monomials is not tabulated: the tactic `boostAvg_calculator` below computes it on demand from +the Lorentz transformation laws of `LorentzAction` and the boost matrices of `AxisBoosts`. A boost subgroup is non-compact, so it carries no invariant average. In its place a rational combination of the boosts at `t = 2, 3, 4` paired with their @@ -78,6 +79,88 @@ noncomputable def boostAvgY : Module.End ℂ JetAlgebra := noncomputable def boostAvg : Module.End ℂ JetAlgebra := (3⁻¹ : ℂ) • (boostAvgZ + boostAvgX + boostAvgY) +/-! + +## The boost-average calculator + +The values of `boostAvg` on the weight-eight monomials below are not separate facts: they are +what the Lorentz transformation laws of `LorentzAction` give when the boost matrices of +`Subgroups/AxisBoosts` are substituted and the index sums expanded. The tactic +`boostAvg_calculator` performs exactly that, so each of the lemmas is proved by a single +invocation and nothing has to be tabulated in advance. + +The only step that is not mechanical is fixing a basis: a field strength is antisymmetric, so +the expansion produces both `F_{ab}` and `F_{ba}` and the two have to be identified. The three +lemmas below orient the spatial index pairs; `fieldStrengthDeriv_inr_inl` orients the mixed +ones and `fieldStrengthDeriv_self` kills the diagonal. All four are oriented, so they terminate. + +-/ + +/-- Orientation of the `yx` field-strength component. -/ +lemma fieldStrengthDeriv_yx (s : Multiset (Fin 1 ⊕ Fin 3)) : + fieldStrengthDeriv s (Sum.inr 1) (Sum.inr 0) = + -fieldStrengthDeriv s (Sum.inr 0) (Sum.inr 1) := fieldStrengthDeriv_antisymm .. + +/-- Orientation of the `zx` field-strength component. -/ +lemma fieldStrengthDeriv_zx (s : Multiset (Fin 1 ⊕ Fin 3)) : + fieldStrengthDeriv s (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv s (Sum.inr 0) (Sum.inr 2) := fieldStrengthDeriv_antisymm .. + +/-- Orientation of the `zy` field-strength component. -/ +lemma fieldStrengthDeriv_zy (s : Multiset (Fin 1 ⊕ Fin 3)) : + fieldStrengthDeriv s (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv s (Sum.inr 1) (Sum.inr 2) := fieldStrengthDeriv_antisymm .. + +/-- Compute the boost average on an explicit weight-eight monomial, directly from the Lorentz + transformation laws: unfold the average, push the representation through the products, expand + each generator into its index sum, substitute the boost matrices, orient the basis, and + compare coefficients. -/ +scoped syntax "boostAvg_calculator" : tactic + +scoped macro_rules + | `(tactic| boostAvg_calculator) => + `(tactic| + (simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, + LinearMap.add_apply, LinearMap.smul_apply, LinearMap.id_apply, + repLorentzGroup_apply_mul, repLorentzGroup_apply_one, + repLorentzGroup_fieldStrengthDeriv_nil, + repLorentzGroup_fieldStrengthDeriv_singleton, + repLorentzGroup_fieldStrengthDeriv_pair, + repLorentzGroup_Dψ_nil, repLorentzGroup_Dψ_singleton, + repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dbarψ_singleton, + repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, + repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, + repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, + map_add, map_sub, inv_inv, + boostZel_coe, boostXel_coe, boostYel_coe, + boostZel_inv_coe, boostXel_inv_coe, boostYel_inv_coe, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_mul, map_div₀, map_inv₀, map_ofNat, + map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, + star_zero, star_one, neg_neg, neg_zero, Complex.ofReal_neg, + toLorentzGroup_boostZel, toLorentzGroup_boostZel_inv, + toLorentzGroup_boostXel, toLorentzGroup_boostXel_inv, + toLorentzGroup_boostYel, toLorentzGroup_boostYel_inv, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_two, Fin.sum_univ_three, + boostMatZ, boostMatX, boostMatY, + fieldStrengthDeriv_self, fieldStrengthDeriv_inr_inl, + fieldStrengthDeriv_yx, fieldStrengthDeriv_zx, fieldStrengthDeriv_zy, + fieldStrengthDeriv_mul_comm, fieldStrengthDeriv_pair_swap, + mul_zero, zero_mul, mul_one, one_mul, + Complex.ofReal_zero, Complex.ofReal_one, + zero_smul, smul_zero, add_zero, zero_add, neg_mul, mul_neg, smul_neg, neg_smul, + add_mul, mul_add, smul_mul_assoc, mul_smul_comm, smul_smul] + push_cast + match_scalars <;> + (push_cast + first + | (norm_num; done) + | (ring_nf; simp only [Complex.I_sq]; ring_nf; done) + | (ring_nf; simp only [Complex.I_sq]; norm_num; done) + | (field_simp; ring)))) + /-- The operator `boostAvg` fixes every Lorentz-invariant vector: each boost term fixes it and the weights sum to one. -/ lemma boostAvg_apply_of_invariant {y : JetAlgebra} @@ -87,7 +170,6 @@ lemma boostAvg_apply_of_invariant {y : JetAlgebra} match_scalars norm_num -set_option maxHeartbeats 4000000 in /-- The boost average `boostAvg` on `F01 * F01`. -/ lemma boostAvg_F01_F01 : boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * @@ -98,20 +180,8 @@ lemma boostAvg_F01_F01 : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F01_F01 2 (by norm_num), - boostPairZ_F01_F01 3 (by norm_num), - boostPairZ_F01_F01 4 (by norm_num), - boostPairX_F01_F01 2 (by norm_num), - boostPairX_F01_F01 3 (by norm_num), - boostPairX_F01_F01 4 (by norm_num), - boostPairY_F01_F01 2 (by norm_num), - boostPairY_F01_F01 3 (by norm_num), - boostPairY_F01_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F01 * F23`. -/ lemma boostAvg_F01_F23 : boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * @@ -122,20 +192,8 @@ lemma boostAvg_F01_F23 : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F01_F23 2 (by norm_num), - boostPairZ_F01_F23 3 (by norm_num), - boostPairZ_F01_F23 4 (by norm_num), - boostPairX_F01_F23 2 (by norm_num), - boostPairX_F01_F23 3 (by norm_num), - boostPairX_F01_F23 4 (by norm_num), - boostPairY_F01_F23 2 (by norm_num), - boostPairY_F01_F23 3 (by norm_num), - boostPairY_F01_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F02 * F02`. -/ lemma boostAvg_F02_F02 : boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * @@ -146,20 +204,8 @@ lemma boostAvg_F02_F02 : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F02_F02 2 (by norm_num), - boostPairZ_F02_F02 3 (by norm_num), - boostPairZ_F02_F02 4 (by norm_num), - boostPairX_F02_F02 2 (by norm_num), - boostPairX_F02_F02 3 (by norm_num), - boostPairX_F02_F02 4 (by norm_num), - boostPairY_F02_F02 2 (by norm_num), - boostPairY_F02_F02 3 (by norm_num), - boostPairY_F02_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F02 * F13`. -/ lemma boostAvg_F02_F13 : boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * @@ -170,20 +216,8 @@ lemma boostAvg_F02_F13 : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F02_F13 2 (by norm_num), - boostPairZ_F02_F13 3 (by norm_num), - boostPairZ_F02_F13 4 (by norm_num), - boostPairX_F02_F13 2 (by norm_num), - boostPairX_F02_F13 3 (by norm_num), - boostPairX_F02_F13 4 (by norm_num), - boostPairY_F02_F13 2 (by norm_num), - boostPairY_F02_F13 3 (by norm_num), - boostPairY_F02_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F03 * F03`. -/ lemma boostAvg_F03_F03 : boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * @@ -194,20 +228,8 @@ lemma boostAvg_F03_F03 : fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F03_F03 2 (by norm_num), - boostPairZ_F03_F03 3 (by norm_num), - boostPairZ_F03_F03 4 (by norm_num), - boostPairX_F03_F03 2 (by norm_num), - boostPairX_F03_F03 3 (by norm_num), - boostPairX_F03_F03 4 (by norm_num), - boostPairY_F03_F03 2 (by norm_num), - boostPairY_F03_F03 3 (by norm_num), - boostPairY_F03_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F03 * F12`. -/ lemma boostAvg_F03_F12 : boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * @@ -218,20 +240,8 @@ lemma boostAvg_F03_F12 : fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F03_F12 2 (by norm_num), - boostPairZ_F03_F12 3 (by norm_num), - boostPairZ_F03_F12 4 (by norm_num), - boostPairX_F03_F12 2 (by norm_num), - boostPairX_F03_F12 3 (by norm_num), - boostPairX_F03_F12 4 (by norm_num), - boostPairY_F03_F12 2 (by norm_num), - boostPairY_F03_F12 3 (by norm_num), - boostPairY_F03_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F12 * F12`. -/ lemma boostAvg_F12_F12 : boostAvg (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * @@ -242,20 +252,8 @@ lemma boostAvg_F12_F12 : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F12_F12 2 (by norm_num), - boostPairZ_F12_F12 3 (by norm_num), - boostPairZ_F12_F12 4 (by norm_num), - boostPairX_F12_F12 2 (by norm_num), - boostPairX_F12_F12 3 (by norm_num), - boostPairX_F12_F12 4 (by norm_num), - boostPairY_F12_F12 2 (by norm_num), - boostPairY_F12_F12 3 (by norm_num), - boostPairY_F12_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F13 * F13`. -/ lemma boostAvg_F13_F13 : boostAvg (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * @@ -266,20 +264,8 @@ lemma boostAvg_F13_F13 : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F13_F13 2 (by norm_num), - boostPairZ_F13_F13 3 (by norm_num), - boostPairZ_F13_F13 4 (by norm_num), - boostPairX_F13_F13 2 (by norm_num), - boostPairX_F13_F13 3 (by norm_num), - boostPairX_F13_F13 4 (by norm_num), - boostPairY_F13_F13 2 (by norm_num), - boostPairY_F13_F13 3 (by norm_num), - boostPairY_F13_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `F23 * F23`. -/ lemma boostAvg_F23_F23 : boostAvg (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * @@ -290,260 +276,104 @@ lemma boostAvg_F23_F23 : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_F23_F23 2 (by norm_num), - boostPairZ_F23_F23 3 (by norm_num), - boostPairZ_F23_F23 4 (by norm_num), - boostPairX_F23_F23 2 (by norm_num), - boostPairX_F23_F23 3 (by norm_num), - boostPairX_F23_F23 4 (by norm_num), - boostPairY_F23_F23 2 (by norm_num), - boostPairY_F23_F23 3 (by norm_num), - boostPairY_F23_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F01` with derivative indices `(0, 1)`. -/ lemma boostAvg_dd01_F01 : boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd01_F01 2 (by norm_num), - boostPairZ_dd01_F01 3 (by norm_num), - boostPairZ_dd01_F01 4 (by norm_num), - boostPairX_dd01_F01 2 (by norm_num), - boostPairX_dd01_F01 3 (by norm_num), - boostPairX_dd01_F01 4 (by norm_num), - boostPairY_dd01_F01 2 (by norm_num), - boostPairY_dd01_F01 3 (by norm_num), - boostPairY_dd01_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F23` with derivative indices `(0, 1)`. -/ lemma boostAvg_dd01_F23 : boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd01_F23 2 (by norm_num), - boostPairZ_dd01_F23 3 (by norm_num), - boostPairZ_dd01_F23 4 (by norm_num), - boostPairX_dd01_F23 2 (by norm_num), - boostPairX_dd01_F23 3 (by norm_num), - boostPairX_dd01_F23 4 (by norm_num), - boostPairY_dd01_F23 2 (by norm_num), - boostPairY_dd01_F23 3 (by norm_num), - boostPairY_dd01_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F02` with derivative indices `(0, 2)`. -/ lemma boostAvg_dd02_F02 : boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd02_F02 2 (by norm_num), - boostPairZ_dd02_F02 3 (by norm_num), - boostPairZ_dd02_F02 4 (by norm_num), - boostPairX_dd02_F02 2 (by norm_num), - boostPairX_dd02_F02 3 (by norm_num), - boostPairX_dd02_F02 4 (by norm_num), - boostPairY_dd02_F02 2 (by norm_num), - boostPairY_dd02_F02 3 (by norm_num), - boostPairY_dd02_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F13` with derivative indices `(0, 2)`. -/ lemma boostAvg_dd02_F13 : boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd02_F13 2 (by norm_num), - boostPairZ_dd02_F13 3 (by norm_num), - boostPairZ_dd02_F13 4 (by norm_num), - boostPairX_dd02_F13 2 (by norm_num), - boostPairX_dd02_F13 3 (by norm_num), - boostPairX_dd02_F13 4 (by norm_num), - boostPairY_dd02_F13 2 (by norm_num), - boostPairY_dd02_F13 3 (by norm_num), - boostPairY_dd02_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F03` with derivative indices `(0, 3)`. -/ lemma boostAvg_dd03_F03 : boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd03_F03 2 (by norm_num), - boostPairZ_dd03_F03 3 (by norm_num), - boostPairZ_dd03_F03 4 (by norm_num), - boostPairX_dd03_F03 2 (by norm_num), - boostPairX_dd03_F03 3 (by norm_num), - boostPairX_dd03_F03 4 (by norm_num), - boostPairY_dd03_F03 2 (by norm_num), - boostPairY_dd03_F03 3 (by norm_num), - boostPairY_dd03_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F12` with derivative indices `(0, 3)`. -/ lemma boostAvg_dd03_F12 : boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd03_F12 2 (by norm_num), - boostPairZ_dd03_F12 3 (by norm_num), - boostPairZ_dd03_F12 4 (by norm_num), - boostPairX_dd03_F12 2 (by norm_num), - boostPairX_dd03_F12 3 (by norm_num), - boostPairX_dd03_F12 4 (by norm_num), - boostPairY_dd03_F12 2 (by norm_num), - boostPairY_dd03_F12 3 (by norm_num), - boostPairY_dd03_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F03` with derivative indices `(1, 2)`. -/ lemma boostAvg_dd12_F03 : boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd12_F03 2 (by norm_num), - boostPairZ_dd12_F03 3 (by norm_num), - boostPairZ_dd12_F03 4 (by norm_num), - boostPairX_dd12_F03 2 (by norm_num), - boostPairX_dd12_F03 3 (by norm_num), - boostPairX_dd12_F03 4 (by norm_num), - boostPairY_dd12_F03 2 (by norm_num), - boostPairY_dd12_F03 3 (by norm_num), - boostPairY_dd12_F03 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F12` with derivative indices `(1, 2)`. -/ lemma boostAvg_dd12_F12 : boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd12_F12 2 (by norm_num), - boostPairZ_dd12_F12 3 (by norm_num), - boostPairZ_dd12_F12 4 (by norm_num), - boostPairX_dd12_F12 2 (by norm_num), - boostPairX_dd12_F12 3 (by norm_num), - boostPairX_dd12_F12 4 (by norm_num), - boostPairY_dd12_F12 2 (by norm_num), - boostPairY_dd12_F12 3 (by norm_num), - boostPairY_dd12_F12 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F02` with derivative indices `(1, 3)`. -/ lemma boostAvg_dd13_F02 : boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd13_F02 2 (by norm_num), - boostPairZ_dd13_F02 3 (by norm_num), - boostPairZ_dd13_F02 4 (by norm_num), - boostPairX_dd13_F02 2 (by norm_num), - boostPairX_dd13_F02 3 (by norm_num), - boostPairX_dd13_F02 4 (by norm_num), - boostPairY_dd13_F02 2 (by norm_num), - boostPairY_dd13_F02 3 (by norm_num), - boostPairY_dd13_F02 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F13` with derivative indices `(1, 3)`. -/ lemma boostAvg_dd13_F13 : boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd13_F13 2 (by norm_num), - boostPairZ_dd13_F13 3 (by norm_num), - boostPairZ_dd13_F13 4 (by norm_num), - boostPairX_dd13_F13 2 (by norm_num), - boostPairX_dd13_F13 3 (by norm_num), - boostPairX_dd13_F13 4 (by norm_num), - boostPairY_dd13_F13 2 (by norm_num), - boostPairY_dd13_F13 3 (by norm_num), - boostPairY_dd13_F13 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F01` with derivative indices `(2, 3)`. -/ lemma boostAvg_dd23_F01 : boostAvg (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd23_F01 2 (by norm_num), - boostPairZ_dd23_F01 3 (by norm_num), - boostPairZ_dd23_F01 4 (by norm_num), - boostPairX_dd23_F01 2 (by norm_num), - boostPairX_dd23_F01 3 (by norm_num), - boostPairX_dd23_F01 4 (by norm_num), - boostPairY_dd23_F01 2 (by norm_num), - boostPairY_dd23_F01 3 (by norm_num), - boostPairY_dd23_F01 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on `∂∂F23` with derivative indices `(2, 3)`. -/ lemma boostAvg_dd23_F23 : boostAvg (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_dd23_F23 2 (by norm_num), - boostPairZ_dd23_F23 3 (by norm_num), - boostPairZ_dd23_F23 4 (by norm_num), - boostPairX_dd23_F23 2 (by norm_num), - boostPairX_dd23_F23 3 (by norm_num), - boostPairX_dd23_F23 4 (by norm_num), - boostPairY_dd23_F23 2 (by norm_num), - boostPairY_dd23_F23 3 (by norm_num), - boostPairY_dd23_F23 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `u0`. -/ lemma boostAvg_u0 : boostAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = @@ -551,77 +381,29 @@ lemma boostAvg_u0 : + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + (-(Complex.I/6)) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_u0 2 (by norm_num), - boostPairZ_u0 3 (by norm_num), - boostPairZ_u0 4 (by norm_num), - boostPairX_u0 2 (by norm_num), - boostPairX_u0 3 (by norm_num), - boostPairX_u0 4 (by norm_num), - boostPairY_u0 2 (by norm_num), - boostPairY_u0 3 (by norm_num), - boostPairY_u0 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `u1`. -/ lemma boostAvg_u1 : boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_u1 2 (by norm_num), - boostPairZ_u1 3 (by norm_num), - boostPairZ_u1 4 (by norm_num), - boostPairX_u1 2 (by norm_num), - boostPairX_u1 3 (by norm_num), - boostPairX_u1 4 (by norm_num), - boostPairY_u1 2 (by norm_num), - boostPairY_u1 3 (by norm_num), - boostPairY_u1 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `u2`. -/ lemma boostAvg_u2 : boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + (Complex.I/6) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_u2 2 (by norm_num), - boostPairZ_u2 3 (by norm_num), - boostPairZ_u2 4 (by norm_num), - boostPairX_u2 2 (by norm_num), - boostPairX_u2 3 (by norm_num), - boostPairX_u2 4 (by norm_num), - boostPairY_u2 2 (by norm_num), - boostPairY_u2 3 (by norm_num), - boostPairY_u2 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `u3`. -/ lemma boostAvg_u3 : boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_u3 2 (by norm_num), - boostPairZ_u3 3 (by norm_num), - boostPairZ_u3 4 (by norm_num), - boostPairX_u3 2 (by norm_num), - boostPairX_u3 3 (by norm_num), - boostPairX_u3 4 (by norm_num), - boostPairY_u3 2 (by norm_num), - boostPairY_u3 3 (by norm_num), - boostPairY_u3 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar0`. -/ lemma boostAvg_ubar0 : boostAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = @@ -629,75 +411,28 @@ lemma boostAvg_ubar0 : + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + (-(Complex.I/6)) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_ubar0 2 (by norm_num), - boostPairZ_ubar0 3 (by norm_num), - boostPairZ_ubar0 4 (by norm_num), - boostPairX_ubar0 2 (by norm_num), - boostPairX_ubar0 3 (by norm_num), - boostPairX_ubar0 4 (by norm_num), - boostPairY_ubar0 2 (by norm_num), - boostPairY_ubar0 3 (by norm_num), - boostPairY_ubar0 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar1`. -/ lemma boostAvg_ubar1 : boostAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = (5/6 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_ubar1 2 (by norm_num), - boostPairZ_ubar1 3 (by norm_num), - boostPairZ_ubar1 4 (by norm_num), - boostPairX_ubar1 2 (by norm_num), - boostPairX_ubar1 3 (by norm_num), - boostPairX_ubar1 4 (by norm_num), - boostPairY_ubar1 2 (by norm_num), - boostPairY_ubar1 3 (by norm_num), - boostPairY_ubar1 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar2`. -/ lemma boostAvg_ubar2 : boostAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = (5/6 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + (Complex.I/6) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_ubar2 2 (by norm_num), - boostPairZ_ubar2 3 (by norm_num), - boostPairZ_ubar2 4 (by norm_num), - boostPairX_ubar2 2 (by norm_num), - boostPairX_ubar2 3 (by norm_num), - boostPairX_ubar2 4 (by norm_num), - boostPairY_ubar2 2 (by norm_num), - boostPairY_ubar2 3 (by norm_num), - boostPairY_ubar2 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) - -set_option maxHeartbeats 4000000 in + boostAvg_calculator + /-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar3`. -/ lemma boostAvg_ubar3 : boostAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = (5/6 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply] - simp only [boostPairZ_ubar3 2 (by norm_num), - boostPairZ_ubar3 3 (by norm_num), - boostPairZ_ubar3 4 (by norm_num), - boostPairX_ubar3 2 (by norm_num), - boostPairX_ubar3 3 (by norm_num), - boostPairX_ubar3 4 (by norm_num), - boostPairY_ubar3 2 (by norm_num), - boostPairY_ubar3 3 (by norm_num), - boostPairY_ubar3 4 (by norm_num)] - match_scalars <;> (push_cast; try ring_nf; try norm_num) + boostAvg_calculator end JetAlgebra diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean index 7cc462a22..61e2042a0 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean @@ -50,6 +50,70 @@ namespace JetAlgebra open scoped minkowskiMatrix PauliMatrix open Matrix MatrixGroups +/-! + +## A. Sylvester's polynomial + +The projector is a polynomial in the boost average, so it acts on an eigenvector of that average +by the value of the polynomial at the eigenvalue. Since the polynomial was built to take the +value one at the eigenvalue one and to vanish at the other five, every computation of the +projector on a concrete vector reduces to a single linear-algebra step: decompose the vector +into eigenvectors of `boostAvg` and read off the eigenvalue-one part. No iterate of the operator +ever has to be computed. + +-/ + +/-- Sylvester's interpolation polynomial for the spectrum of the boost average: + `(324/5) (c - 5/6) (c - 2/3) (c - 1/2) (c - 1/3) (c - 1/6)`, normalized to take the value one + at `c = 1`. -/ +noncomputable def sylvester (c : ℂ) : ℂ := + -1 + (137/10) * c + (-(135/2)) * c ^ 2 + 153 * c ^ 3 + (-162) * c ^ 4 + (324/5) * c ^ 5 + +@[simp] lemma sylvester_one : sylvester (1 : ℂ) = 1 := by norm_num [sylvester] +@[simp] lemma sylvester_five_sixths : sylvester (5/6 : ℂ) = 0 := by norm_num [sylvester] +@[simp] lemma sylvester_two_thirds : sylvester (2/3 : ℂ) = 0 := by norm_num [sylvester] +@[simp] lemma sylvester_half : sylvester (1/2 : ℂ) = 0 := by norm_num [sylvester] +@[simp] lemma sylvester_third : sylvester (1/3 : ℂ) = 0 := by norm_num [sylvester] +@[simp] lemma sylvester_sixth : sylvester (1/6 : ℂ) = 0 := by norm_num [sylvester] + +/-- Sylvester's polynomial evaluated on an endomorphism. Stated for an arbitrary module, since + nothing about the jet algebra is used. -/ +noncomputable def sylvesterEnd {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) : Module.End ℂ M := + (-1 : ℂ) • T ^ 0 + (137/10 : ℂ) • T ^ 1 + (-(135/2) : ℂ) • T ^ 2 + (153 : ℂ) • T ^ 3 + + (-162 : ℂ) • T ^ 4 + (324/5 : ℂ) • T ^ 5 + +lemma sylvesterEnd_apply {M : Type*} [AddCommGroup M] [Module ℂ M] + (T : Module.End ℂ M) (v : M) : + sylvesterEnd T v = (-1 : ℂ) • v + (137/10 : ℂ) • T v + (-(135/2) : ℂ) • T (T v) + + (153 : ℂ) • T (T (T v)) + (-162 : ℂ) • T (T (T (T v))) + + (324/5 : ℂ) • T (T (T (T (T v)))) := by + simp [sylvesterEnd, pow_succ, Module.End.mul_apply] + +lemma pow_apply_of_eigen {M : Type*} [AddCommGroup M] [Module ℂ M] + {T : Module.End ℂ M} {c : ℂ} {v : M} (h : T v = c • v) (n : ℕ) : + (T ^ n) v = c ^ n • v := by + induction n with + | zero => simp + | succ n ih => + rw [pow_succ, Module.End.mul_apply, h, map_smul, ih, smul_smul, pow_succ] + ring_nf + +/-- On an eigenvector, a polynomial in the operator acts by the value of the polynomial at the + eigenvalue. This is the only fact about `sylvesterEnd` that the computations need. -/ +lemma sylvesterEnd_of_eigen {M : Type*} [AddCommGroup M] [Module ℂ M] + {T : Module.End ℂ M} {c : ℂ} {v : M} (h : T v = c • v) : + sylvesterEnd T v = sylvester c • v := by + simp only [sylvesterEnd, LinearMap.add_apply, LinearMap.smul_apply, pow_apply_of_eigen h, + smul_smul, sylvester] + module + +/-! + +## B. The projector + +-/ + /-- The spectral projector onto the Lorentz scalars, obtained from the boost average `boostAvg` by Sylvester's formula. Not an average itself: it is the unique quintic in `boostAvg` taking the value one at the eigenvalue one and @@ -72,6 +136,17 @@ lemma boostAvgScalarProj_apply (v : JetAlgebra) : simp only [boostAvgScalarProj, LinearMap.add_apply, LinearMap.smul_apply, Module.End.one_apply, Module.End.mul_apply] +/-- The projector is Sylvester's polynomial evaluated on the boost average. -/ +lemma boostAvgScalarProj_eq_sylvesterEnd : boostAvgScalarProj = sylvesterEnd boostAvg := by + simp [boostAvgScalarProj, sylvesterEnd, pow_succ] + +/-- On an eigenvector of the boost average the projector acts by the value of Sylvester's + polynomial at the eigenvalue. Together with `sylvester_one` and the four vanishing values + this reduces every evaluation of the projector to an eigenvector decomposition. -/ +lemma boostAvgScalarProj_of_eigen {c : ℂ} {v : JetAlgebra} (h : boostAvg v = c • v) : + boostAvgScalarProj v = sylvester c • v := by + rw [boostAvgScalarProj_eq_sylvesterEnd, sylvesterEnd_of_eigen h] + /-- The projector fixes every Lorentz-invariant vector: `boostAvg` fixes it and the coefficients sum to one. -/ lemma boostAvgScalarProj_apply_of_invariant {y : JetAlgebra} diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean index 2f8b477df..16b6d0c65 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean @@ -9,16 +9,26 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages /-! # The Lorentz-scalar projector on the photon pairs -`boostAvgScalarProj` is the polynomial in `boostAvg` that annihilates every eigenvalue of `boostAvg` -other than `1`; it therefore fixes the Lorentz-invariant vectors and projects -the weight-eight monomials onto the invariant subspace. The `scalarProjFF*`, -`scalarProjDDF*` and `scalarProjFMu*` lemmas evaluate that polynomial on each eigenvalue -pattern occurring in the weight-eight basis. +`boostAvgScalarProj` is the polynomial in `boostAvg` that annihilates every eigenvalue of +`boostAvg` other than `1`; it therefore fixes the Lorentz-invariant vectors and projects the +weight-eight monomials onto the invariant subspace. The `scalarProjFF*` lemmas evaluate that +polynomial on the nine products of two field strengths. + +Each is proved by decomposing the monomial into eigenvectors of the average and applying +`sylvesterEnd_of_eigen`: the polynomial was built to kill the five non-unit eigenvalues, so only +the eigenvalue-one part survives. On the six squares `F01_F01, …, F23_F23` the average acts as +`2/3 - (1/6) A` for `A` the adjacency of the six-cycle `F01, F12, F02, F23, F03, F13`, whose +eigenvalues `2, 1, 1, -1, -1, -2` give the average the eigenvalues `1/3, 1/2, 1/2, 5/6, 5/6, 1`; +the alternating vector around that cycle is the Maxwell term. On the three products +`F01_F23, F02_F13, F03_F12` the average has eigenvalues `1/2, 1/2, 1`, the invariant being the +theta term. + +No iterate of the operator is computed: every proof applies the average once, inside the +eigenvector lemmas, which is why no heartbeat bump is needed here. -/ @[expose] public section -set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false set_option linter.unusedTactic false @@ -30,10 +40,9 @@ namespace JetAlgebra open scoped minkowskiMatrix PauliMatrix open Matrix MatrixGroups -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the FF block. -/ -lemma scalarProjFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} +variable {M : Type*} [AddCommGroup M] [Module ℂ M] +variable (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} +variable (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) @@ -42,497 +51,305 @@ lemma scalarProjFF0 {M : Type*} [AddCommGroup M] [Module ℂ M] (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) + +/-! + +## A. The eigenvectors of the average on the field-strength squares + +-/ + +include h0 h2 h4 h6 h7 h8 in +/-- The Maxwell combination is invariant: the alternating vector on the six-cycle. -/ +lemma ffEigenMaxwell : T (v0 + v2 + v4 - v6 - v7 - v8) = (1 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by + simp only [map_add, map_sub, h0, h2, h4, h6, h7, h8] + module + +include h0 h2 h4 h6 h7 h8 in +/-- The total sum of the squares is an eigenvector of eigenvalue `1/3`. -/ +lemma ffEigenTrace : T (v0 + v2 + v4 + v6 + v7 + v8) = (1/3 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) := by + simp only [map_add, h0, h2, h4, h6, h7, h8] + module + +include h0 h2 h4 h6 h7 h8 in +/-- First eigenvector of eigenvalue `1/2`. -/ +lemma ffEigenHalf₁ : T ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) = + (1/2 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) := by + simp only [map_add, map_sub, map_smul, h0, h2, h4, h6, h7, h8] + module + +include h2 h4 h6 h7 in +/-- Second eigenvector of eigenvalue `1/2`. -/ +lemma ffEigenHalf₂ : T (v2 - v4 + v6 - v7) = (1/2 : ℂ) • (v2 - v4 + v6 - v7) := by + simp only [map_add, map_sub, h2, h4, h6, h7] + module + +include h0 h2 h4 h6 h7 h8 in +/-- First eigenvector of eigenvalue `5/6`. -/ +lemma ffEigenFiveSixths₁ : T ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) = + (5/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) := by + simp only [map_add, map_sub, map_smul, h0, h2, h4, h6, h7, h8] + module + +include h2 h4 h6 h7 in +/-- Second eigenvector of eigenvalue `5/6`. -/ +lemma ffEigenFiveSixths₂ : T (-v2 + v4 + v6 - v7) = (5/6 : ℂ) • (-v2 + v4 + v6 - v7) := by + simp only [map_add, map_sub, map_neg, h2, h4, h6, h7] + module + +/-! + +## B. The eigenvectors of the average on the dual pairs + +-/ + +include h1 h3 h5 in +/-- The theta combination is invariant. -/ +lemma ffEigenTheta : T (v1 - v3 + v5) = (1 : ℂ) • (v1 - v3 + v5) := by + simp only [map_add, map_sub, h1, h3, h5] + module + +include h1 h3 in +/-- First eigenvector of eigenvalue `1/2` on the dual pairs. -/ +lemma ffEigenThetaHalf₁ : T (v1 + v3) = (1/2 : ℂ) • (v1 + v3) := by + simp only [map_add, h1, h3] + module + +include h1 h5 in +/-- Second eigenvector of eigenvalue `1/2` on the dual pairs. -/ +lemma ffEigenThetaHalf₂ : T (-v1 + v5) = (1/2 : ℂ) • (-v1 + v5) := by + simp only [map_add, map_neg, h1, h5] + module + +/-! + +## C. The projector on each column + +-/ + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 0 of the FF block, the field-strength square `F01_F01`. -/ +lemma scalarProjFF0 : (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) + (324/5 : ℂ) • T (T (T (T (T v0)))) = (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v0) = - (1/2 : ℂ) • (v0) - + (1/36 : ℂ) • (v2) - + (1/36 : ℂ) • (v4) - + (-(2/9) : ℂ) • (v6) - + (-(2/9) : ℂ) • (v7) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v0)) = - (11/27 : ℂ) • (v0) - + (1/18 : ℂ) • (v2) - + (1/18 : ℂ) • (v4) - + (-(17/72) : ℂ) • (v6) - + (-(17/72) : ℂ) • (v7) - + (-(1/108) : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v0))) = - (227/648 : ℂ) • (v0) - + (101/1296 : ℂ) • (v2) - + (101/1296 : ℂ) • (v4) - + (-(19/81) : ℂ) • (v6) - + (-(19/81) : ℂ) • (v7) - + (-(2/81) : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v0)))) = - (101/324 : ℂ) • (v0) - + (185/1944 : ℂ) • (v2) - + (185/1944 : ℂ) • (v4) - + (-(1771/7776) : ℂ) • (v6) - + (-(1771/7776) : ℂ) • (v7) - + (-(55/1296) : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h0] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the FF block. -/ -lemma scalarProjFF1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + have key : sylvesterEnd T v0 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by + conv_lhs => + rw [show v0 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) + + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) + + (1/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) + + (1/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), + sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 1 of the FF block, the field-strength product `F01_F23`. -/ +lemma scalarProjFF1 : (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) + (324/5 : ℂ) • T (T (T (T (T v1)))) = (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have i2 : T (T v1) = - (1/2 : ℂ) • (v1) - + (-(1/4) : ℂ) • (v3) - + (1/4 : ℂ) • (v5) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v1)) = - (5/12 : ℂ) • (v1) - + (-(7/24) : ℂ) • (v3) - + (7/24 : ℂ) • (v5) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v1))) = - (3/8 : ℂ) • (v1) - + (-(5/16) : ℂ) • (v3) - + (5/16 : ℂ) • (v5) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v1)))) = - (17/48 : ℂ) • (v1) - + (-(31/96) : ℂ) • (v3) - + (31/96 : ℂ) • (v5) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h1] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the FF block. -/ -lemma scalarProjFF2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + have key : sylvesterEnd T v1 = (1/3 : ℂ) • (v1 - v3 + v5) := by + conv_lhs => + rw [show v1 = (1/3 : ℂ) • (v1 - v3 + v5) + + (1/3 : ℂ) • (v1 + v3) + + (-(1/3) : ℂ) • (-v1 + v5) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenTheta T h1 h3 h5), + sylvesterEnd_of_eigen (ffEigenThetaHalf₁ T h1 h3), + sylvesterEnd_of_eigen (ffEigenThetaHalf₂ T h1 h5), + sylvester_one, sylvester_half] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 2 of the FF block, the field-strength square `F02_F02`. -/ +lemma scalarProjFF2 : (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) + (324/5 : ℂ) • T (T (T (T (T v2)))) = (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v2) = - (1/36 : ℂ) • (v0) - + (1/2 : ℂ) • (v2) - + (1/36 : ℂ) • (v4) - + (-(2/9) : ℂ) • (v6) - + (-(2/9) : ℂ) • (v8) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v2)) = - (1/18 : ℂ) • (v0) - + (11/27 : ℂ) • (v2) - + (1/18 : ℂ) • (v4) - + (-(17/72) : ℂ) • (v6) - + (-(1/108) : ℂ) • (v7) - + (-(17/72) : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v2))) = - (101/1296 : ℂ) • (v0) - + (227/648 : ℂ) • (v2) - + (101/1296 : ℂ) • (v4) - + (-(19/81) : ℂ) • (v6) - + (-(2/81) : ℂ) • (v7) - + (-(19/81) : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v2)))) = - (185/1944 : ℂ) • (v0) - + (101/324 : ℂ) • (v2) - + (185/1944 : ℂ) • (v4) - + (-(1771/7776) : ℂ) • (v6) - + (-(55/1296) : ℂ) • (v7) - + (-(1771/7776) : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h2] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the FF block. -/ -lemma scalarProjFF3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + have key : sylvesterEnd T v2 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by + conv_lhs => + rw [show v2 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) + + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) + + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) + + (1/4 : ℂ) • (v2 - v4 + v6 - v7) + + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) + + (-(1/4) : ℂ) • (-v2 + v4 + v6 - v7) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), + sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), + sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 3 of the FF block, the field-strength product `F02_F13`. -/ +lemma scalarProjFF3 : (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) + (324/5 : ℂ) • T (T (T (T (T v3)))) = (-(1/24) : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have i2 : T (T v3) = - (-(1/4) : ℂ) • (v1) - + (1/2 : ℂ) • (v3) - + (-(1/4) : ℂ) • (v5) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v3)) = - (-(7/24) : ℂ) • (v1) - + (5/12 : ℂ) • (v3) - + (-(7/24) : ℂ) • (v5) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v3))) = - (-(5/16) : ℂ) • (v1) - + (3/8 : ℂ) • (v3) - + (-(5/16) : ℂ) • (v5) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v3)))) = - (-(31/96) : ℂ) • (v1) - + (17/48 : ℂ) • (v3) - + (-(31/96) : ℂ) • (v5) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h3] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 4 of the FF block. -/ -lemma scalarProjFF4 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + have key : sylvesterEnd T v3 = (-(1/3) : ℂ) • (v1 - v3 + v5) := by + conv_lhs => + rw [show v3 = (-(1/3) : ℂ) • (v1 - v3 + v5) + + (2/3 : ℂ) • (v1 + v3) + + (1/3 : ℂ) • (-v1 + v5) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenTheta T h1 h3 h5), + sylvesterEnd_of_eigen (ffEigenThetaHalf₁ T h1 h3), + sylvesterEnd_of_eigen (ffEigenThetaHalf₂ T h1 h5), + sylvester_one, sylvester_half] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 4 of the FF block, the field-strength square `F03_F03`. -/ +lemma scalarProjFF4 : (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) + (324/5 : ℂ) • T (T (T (T (T v4)))) = (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : ℂ) • v8) := by - have i2 : T (T v4) = - (1/36 : ℂ) • (v0) - + (1/36 : ℂ) • (v2) - + (1/2 : ℂ) • (v4) - + (-(2/9) : ℂ) • (v7) - + (-(2/9) : ℂ) • (v8) := by - rw [h4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v4)) = - (1/18 : ℂ) • (v0) - + (1/18 : ℂ) • (v2) - + (11/27 : ℂ) • (v4) - + (-(1/108) : ℂ) • (v6) - + (-(17/72) : ℂ) • (v7) - + (-(17/72) : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v4))) = - (101/1296 : ℂ) • (v0) - + (101/1296 : ℂ) • (v2) - + (227/648 : ℂ) • (v4) - + (-(2/81) : ℂ) • (v6) - + (-(19/81) : ℂ) • (v7) - + (-(19/81) : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v4)))) = - (185/1944 : ℂ) • (v0) - + (185/1944 : ℂ) • (v2) - + (101/324 : ℂ) • (v4) - + (-(55/1296) : ℂ) • (v6) - + (-(1771/7776) : ℂ) • (v7) - + (-(1771/7776) : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h4] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 5 of the FF block. -/ -lemma scalarProjFF5 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + have key : sylvesterEnd T v4 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by + conv_lhs => + rw [show v4 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) + + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) + + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) + + (-(1/4) : ℂ) • (v2 - v4 + v6 - v7) + + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) + + (1/4 : ℂ) • (-v2 + v4 + v6 - v7) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), + sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), + sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 5 of the FF block, the field-strength product `F03_F12`. -/ +lemma scalarProjFF5 : (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) + (324/5 : ℂ) • T (T (T (T (T v5)))) = (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have i2 : T (T v5) = - (1/4 : ℂ) • (v1) - + (-(1/4) : ℂ) • (v3) - + (1/2 : ℂ) • (v5) := by - rw [h5] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v5)) = - (7/24 : ℂ) • (v1) - + (-(7/24) : ℂ) • (v3) - + (5/12 : ℂ) • (v5) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v5))) = - (5/16 : ℂ) • (v1) - + (-(5/16) : ℂ) • (v3) - + (3/8 : ℂ) • (v5) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v5)))) = - (31/96 : ℂ) • (v1) - + (-(31/96) : ℂ) • (v3) - + (17/48 : ℂ) • (v5) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h5] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 6 of the FF block. -/ -lemma scalarProjFF6 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + have key : sylvesterEnd T v5 = (1/3 : ℂ) • (v1 - v3 + v5) := by + conv_lhs => + rw [show v5 = (1/3 : ℂ) • (v1 - v3 + v5) + + (1/3 : ℂ) • (v1 + v3) + + (2/3 : ℂ) • (-v1 + v5) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenTheta T h1 h3 h5), + sylvesterEnd_of_eigen (ffEigenThetaHalf₁ T h1 h3), + sylvesterEnd_of_eigen (ffEigenThetaHalf₂ T h1 h5), + sylvester_one, sylvester_half] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 6 of the FF block, the field-strength square `F12_F12`. -/ +lemma scalarProjFF6 : (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) + (324/5 : ℂ) • T (T (T (T (T v6)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : - ℂ) • v8) := by - have i2 : T (T v6) = - (-(2/9) : ℂ) • (v0) - + (-(2/9) : ℂ) • (v2) - + (1/2 : ℂ) • (v6) - + (1/36 : ℂ) • (v7) - + (1/36 : ℂ) • (v8) := by - rw [h6] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v6)) = - (-(17/72) : ℂ) • (v0) - + (-(17/72) : ℂ) • (v2) - + (-(1/108) : ℂ) • (v4) - + (11/27 : ℂ) • (v6) - + (1/18 : ℂ) • (v7) - + (1/18 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v6))) = - (-(19/81) : ℂ) • (v0) - + (-(19/81) : ℂ) • (v2) - + (-(2/81) : ℂ) • (v4) - + (227/648 : ℂ) • (v6) - + (101/1296 : ℂ) • (v7) - + (101/1296 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v6)))) = - (-(1771/7776) : ℂ) • (v0) - + (-(1771/7776) : ℂ) • (v2) - + (-(55/1296) : ℂ) • (v4) - + (101/324 : ℂ) • (v6) - + (185/1944 : ℂ) • (v7) - + (185/1944 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h6] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 7 of the FF block. -/ -lemma scalarProjFF7 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + + (2 : ℂ) • v8) := by + have key : sylvesterEnd T v6 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by + conv_lhs => + rw [show v6 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) + + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) + + (1/12 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) + + (1/4 : ℂ) • (v2 - v4 + v6 - v7) + + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) + + (1/4 : ℂ) • (-v2 + v4 + v6 - v7) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), + sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), + sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 7 of the FF block, the field-strength square `F13_F13`. -/ +lemma scalarProjFF7 : (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) + (324/5 : ℂ) • T (T (T (T (T v7)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : - ℂ) • v8) := by - have i2 : T (T v7) = - (-(2/9) : ℂ) • (v0) - + (-(2/9) : ℂ) • (v4) - + (1/36 : ℂ) • (v6) - + (1/2 : ℂ) • (v7) - + (1/36 : ℂ) • (v8) := by - rw [h7] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v7)) = - (-(17/72) : ℂ) • (v0) - + (-(1/108) : ℂ) • (v2) - + (-(17/72) : ℂ) • (v4) - + (1/18 : ℂ) • (v6) - + (11/27 : ℂ) • (v7) - + (1/18 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v7))) = - (-(19/81) : ℂ) • (v0) - + (-(2/81) : ℂ) • (v2) - + (-(19/81) : ℂ) • (v4) - + (101/1296 : ℂ) • (v6) - + (227/648 : ℂ) • (v7) - + (101/1296 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v7)))) = - (-(1771/7776) : ℂ) • (v0) - + (-(55/1296) : ℂ) • (v2) - + (-(1771/7776) : ℂ) • (v4) - + (185/1944 : ℂ) • (v6) - + (101/324 : ℂ) • (v7) - + (185/1944 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h7] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 8 of the FF block. -/ -lemma scalarProjFF8 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) : + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + + (2 : ℂ) • v8) := by + have key : sylvesterEnd T v7 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by + conv_lhs => + rw [show v7 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) + + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) + + (1/12 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) + + (-(1/4) : ℂ) • (v2 - v4 + v6 - v7) + + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) + + (-(1/4) : ℂ) • (-v2 + v4 + v6 - v7) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), + sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), + sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] + module + rw [← sylvesterEnd_apply, key] + module + +include h0 h1 h2 h3 h4 h5 h6 h7 h8 in +/-- The projector polynomial on column 8 of the FF block, the field-strength square `F23_F23`. -/ +lemma scalarProjFF8 : (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) + (324/5 : ℂ) • T (T (T (T (T v8)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + (2 : - ℂ) • v8) := by - have i2 : T (T v8) = - (-(2/9) : ℂ) • (v2) - + (-(2/9) : ℂ) • (v4) - + (1/36 : ℂ) • (v6) - + (1/36 : ℂ) • (v7) - + (1/2 : ℂ) • (v8) := by - rw [h8] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i3 : T (T (T v8)) = - (-(1/108) : ℂ) • (v0) - + (-(17/72) : ℂ) • (v2) - + (-(17/72) : ℂ) • (v4) - + (1/18 : ℂ) • (v6) - + (1/18 : ℂ) • (v7) - + (11/27 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i4 : T (T (T (T v8))) = - (-(2/81) : ℂ) • (v0) - + (-(19/81) : ℂ) • (v2) - + (-(19/81) : ℂ) • (v4) - + (101/1296 : ℂ) • (v6) - + (101/1296 : ℂ) • (v7) - + (227/648 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v8)))) = - (-(55/1296) : ℂ) • (v0) - + (-(1771/7776) : ℂ) • (v2) - + (-(1771/7776) : ℂ) • (v4) - + (185/1944 : ℂ) • (v6) - + (185/1944 : ℂ) • (v7) - + (101/324 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h8] - match_scalars <;> norm_num + (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + + (2 : ℂ) • v8) := by + have key : sylvesterEnd T v8 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by + conv_lhs => + rw [show v8 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) + + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) + + (-(1/6) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) + + (1/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) from by module] + simp only [map_add, map_smul, + sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), + sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), + sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] + module + rw [← sylvesterEnd_apply, key] + module + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean index f8087f19d..2b8d3a302 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnFermionTerms +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.AxisBoosts /-! # The average over the rotations by `π` diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean index f2b9bca08..75732f447 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean @@ -53,8 +53,8 @@ lemma span_massDimFourInvariants_le : refine Submodule.mem_inf.mpr ⟨?_, Submodule.subset_span (isInvariant_of_mem_massDimFourInvariants hx)⟩ rcases hx with rfl | rfl | rfl | rfl | rfl - · exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 0) (Nat.zero_le 8) - fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one + · exact mem_massWeightLESubmodule_of_mem (m := 0) (Nat.zero_le 8) + (SetLike.one_mem_graded massWeightSubmodule) · exact maxwellTerm_mem_massWeightLESubmodule · exact thetaTerm_mem_massWeightLESubmodule · exact fermionKineticTerm_mem_massWeightLESubmodule diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean index 5bd0c6423..4fee87ba9 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean @@ -11,11 +11,11 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.Hypercharge # The mass-weight and hypercharge gradings The machinery for the converse inclusion. That an element of -`MassWeightLESubmodule n` decomposes into eigenvectors of `massWeightScale` is -not special to the invariants and lives with the grading itself, in -`LeptonGaugeSector.JetAlgebra.exists_eigen_decomp_of_mem_massWeightLESubmodule` in -`LeptonGaugeSector/JetAlgebra/MassDim`, along with the independence of the powers `c ^ w` that -gives it. What is added here is the refinement specific to the classification: +`MassWeightLESubmodule n` decomposes into its homogeneous pieces is not special to the +invariants and lives with the grading itself, in +`LeptonGaugeSector.JetAlgebra.eq_sum_coeff_of_mem_massWeightLESubmodule` in +`LeptonGaugeSector/JetAlgebra/MassDim`, as the coefficients of the mass-weight polynomial. +What is added here is the refinement specific to the classification: each eigenvector lies in the span `covMonomialSpan w` of covariant monomials of exact weight `w`, and each of those decomposes further into hypercharge eigenspaces `chargeCovSpan w k`. Both decompositions are compatible with the @@ -62,35 +62,38 @@ the weight-`≤ n` submodule decomposes into exact-weight eigenvectors. field-strength derivatives and covariant derivatives of total weight `w`. -/ noncomputable def covMonomialSpan (w : ℕ) : Submodule ℂ JetAlgebra := Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ - ∀ c : ℂ, massWeightScale c y = c ^ w • y} + y ∈ massWeightSubmodule w} /-- Every covariant monomial is homogeneous. -/ lemma exists_weight_of_mem_closure {y : JetAlgebra} (hy : y ∈ Submonoid.closure invariantGenerators) : - ∃ w, ∀ c : ℂ, massWeightScale c y = c ^ w • y := by + ∃ w, y ∈ massWeightSubmodule w := by induction hy using Submonoid.closure_induction with | mem z hz => rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ · exact ⟨4 + 2 * Multiset.card p.1, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ - · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dψ c p.1 p.2⟩ - · exact ⟨3 + 2 * p.1.length, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ - | one => - exact ⟨0, fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one⟩ + fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2⟩ + · exact ⟨3 + 2 * p.1.length, Dψ_mem_massWeightSubmodule p.1 p.2⟩ + · exact ⟨3 + 2 * p.1.length, Dbarψ_mem_massWeightSubmodule p.1 p.2⟩ + | one => exact ⟨0, SetLike.one_mem_graded massWeightSubmodule⟩ | mul a b ha hb iha ihb => obtain ⟨wa, hwa⟩ := iha obtain ⟨wb, hwb⟩ := ihb - exact ⟨wa + wb, massWeightScale_mul_eigen hwa hwb⟩ - -/-- Elements of the weight-`w` covariant monomial span are eigenvectors. -/ -lemma forall_massWeightScale_of_mem_covMonomialSpan {w : ℕ} {y : JetAlgebra} - (hy : y ∈ covMonomialSpan w) (c : ℂ) : - massWeightScale c y = c ^ w • y := by - induction hy using Submodule.span_induction with - | mem z hz => exact hz.2 c - | zero => simp - | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] - | smul d a ha iha => rw [map_smul, iha, smul_comm] + exact ⟨wa + wb, mul_mem_massWeightSubmodule hwa hwb⟩ + +/-- Elements of the weight-`w` covariant monomial span are homogeneous of weight `w`. -/ +lemma mem_massWeightSubmodule_of_mem_covMonomialSpan {w : ℕ} {y : JetAlgebra} + (hy : y ∈ covMonomialSpan w) : y ∈ massWeightSubmodule w := + Submodule.span_le.mpr (fun _ hz => hz.2) hy + +/-- Reading a weight component off a decomposition into homogeneous pieces. -/ +lemma coeff_massWeightPoly_sum {n : ℕ} {z : ℕ → JetAlgebra} + (hz : ∀ k, z k ∈ massWeightSubmodule k) {m : ℕ} (hm : m ∈ Finset.range n) : + (massWeightPoly (∑ k ∈ Finset.range n, z k)).coeff m = z m := by + rw [map_sum, Polynomial.finsetSum_coeff, + Finset.sum_eq_single m (fun k _ hk => coeff_massWeightPoly_of_mem_ne hk (hz k)) + (fun h => absurd hm h)] + exact coeff_massWeightPoly_of_mem (hz m) /-- A vanishing tail extends a truncated sum. -/ lemma sum_range_succ_ext {N M : ℕ} (z : ℕ → JetAlgebra) (hNM : N ≤ M) @@ -161,51 +164,19 @@ lemma exists_covMonomialSpan_decomp {x : JetAlgebra} ∃ z : ℕ → JetAlgebra, (∀ m, z m ∈ covMonomialSpan m) ∧ x = ∑ m ∈ Finset.range 9, z m := by obtain ⟨N, z, hzmem, hzsupp, hzx⟩ := exists_bound_decomp_of_mem_adjoin hadj - obtain ⟨z', hz'eig, hz'x⟩ := exists_eigen_decomp_of_mem_massWeightLESubmodule hx refine ⟨z, hzmem, ?_⟩ + have hzw : ∀ k, z k ∈ massWeightSubmodule k := + fun k => mem_massWeightSubmodule_of_mem_covMonomialSpan (hzmem k) set M := max N 8 with hM have h1 : x = ∑ m ∈ Finset.range (M + 1), z m := hzx.trans (sum_range_succ_ext z (le_max_left N 8) hzsupp) - have hz'supp : ∀ m, 8 < m → (fun k => if k < 9 then z' k else 0) m = 0 := by - intro m hm - show (if m < 9 then z' m else 0) = 0 - rw [if_neg (show ¬ m < 9 by omega)] - have h2 : x = ∑ m ∈ Finset.range (M + 1), (fun k => if k < 9 then z' k else 0) m := by - rw [hz'x, show (9 : ℕ) = 8 + 1 from rfl, - ← sum_range_succ_ext _ (le_max_right N 8) hz'supp] - exact Finset.sum_congr rfl fun m hm => by - rw [if_pos (Finset.mem_range.mp hm)] - have hdiff : ∀ c : ℂ, ∑ m ∈ Finset.range (M + 1), - c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) = 0 := by - intro c - have e1 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), c ^ m • z m := by - rw [h1, map_sum] - exact Finset.sum_congr rfl fun m _ => - forall_massWeightScale_of_mem_covMonomialSpan (hzmem m) c - have e2 : massWeightScale c x = ∑ m ∈ Finset.range (M + 1), - c ^ m • (fun k => if k < 9 then z' k else 0) m := by - rw [h2, map_sum] - refine Finset.sum_congr rfl fun m _ => ?_ - by_cases hm : m < 9 - · simp only [if_pos hm] - exact hz'eig m c - · simp only [if_neg hm, map_zero, smul_zero] - calc ∑ m ∈ Finset.range (M + 1), - c ^ m • (z m - (fun k => if k < 9 then z' k else 0) m) - = (∑ m ∈ Finset.range (M + 1), c ^ m • z m) - - ∑ m ∈ Finset.range (M + 1), - c ^ m • (fun k => if k < 9 then z' k else 0) m := by - rw [← Finset.sum_sub_distrib] - exact Finset.sum_congr rfl fun m _ => smul_sub _ _ _ - _ = massWeightScale c x - massWeightScale c x := by rw [← e1, ← e2] - _ = 0 := sub_self _ have hkill : ∀ m, 8 < m → z m = 0 := by intro m hm by_cases hmM : m ≤ M - · have h0 : z m - (fun k => if k < 9 then z' k else 0) m = 0 := - eq_zero_of_forall_sum_pow_smul_eq_zero (Finset.range (M + 1)) _ hdiff - (show m ∈ Finset.range (M + 1) from Finset.mem_range.mpr (by omega)) - simpa [if_neg (by omega : ¬ m < 9)] using h0 + · have hc : (massWeightPoly x).coeff m = z m := by + rw [h1] + exact coeff_massWeightPoly_sum hzw (Finset.mem_range.mpr (by omega)) + rw [← hc, coeff_massWeightPoly_eq_zero_of_mem_massWeightLESubmodule hx (by omega)] · exact hzsupp m (by omega) rw [h1, show (9 : ℕ) = 8 + 1 from rfl, sum_range_succ_ext z (le_max_right N 8) hkill] @@ -220,89 +191,31 @@ invariant element are themselves invariant. -/ -/-- Real-scalar variant of the independence of powers. -/ -lemma eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero (s : Finset ℕ) - (v : ℕ → JetAlgebra) - (h : ∀ r : ℝ, ∑ w ∈ s, ((r : ℂ)) ^ w • v w = 0) {w : ℕ} (hw : w ∈ s) : - v w = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hp : ∀ r : ℝ, Polynomial.eval ((r : ℂ)) - (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by - intro r - have h2 := congrArg φ (h r) - rw [map_sum, map_zero] at h2 - rw [Polynomial.eval_finsetSum] - simpa [Polynomial.eval_monomial, mul_comm] using h2 - have hzero : (∑ u ∈ s, Polynomial.monomial u (φ (v u))) = 0 := by - refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ - refine Set.Infinite.mono ?_ - (Set.infinite_range_of_injective Complex.ofReal_injective) - rintro z ⟨r, rfl⟩ - exact hp r - have hcoeff := congrArg (fun p => Polynomial.coeff p w) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - simpa [Polynomial.coeff_monomial, Finset.sum_ite_eq', hw] using hcoeff - /-- The weight components of a Lorentz-invariant covariant decomposition are - Lorentz invariant. -/ + Lorentz invariant: taking the weight-`m` part commutes with the Lorentz action. -/ lemma repLorentzGroup_covComponent_eq {z : ℕ → JetAlgebra} (hz : ∀ m, z m ∈ covMonomialSpan m) (Λ : SL(2,ℂ)) (hx : repLorentzGroup Λ (∑ m ∈ Finset.range 9, z m) = ∑ m ∈ Finset.range 9, z m) {m : ℕ} (hm : m ∈ Finset.range 9) : repLorentzGroup Λ (z m) = z m := by - have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, - ((r : ℂ)) ^ k • (repLorentzGroup Λ (z k) - z k) = 0 := by - intro r - have e1 : massWeightScale ((r : ℂ)) - (repLorentzGroup Λ (∑ k ∈ Finset.range 9, z k) - - ∑ k ∈ Finset.range 9, z k) = 0 := by - rw [hx, sub_self, map_zero] - rw [map_sum, map_sub, map_sum, map_sum] at e1 - calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • - (repLorentzGroup Λ (z k) - z k) - = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) - (repLorentzGroup Λ (z k))) - - ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by - rw [← Finset.sum_sub_distrib] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [massWeightScale_ofReal_repLorentzGroup, - forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, - smul_sub] - _ = 0 := e1 - have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm - rwa [sub_eq_zero] at h0 + have hc : (massWeightPoly (∑ k ∈ Finset.range 9, z k)).coeff m = z m := + coeff_massWeightPoly_sum + (fun k => mem_massWeightSubmodule_of_mem_covMonomialSpan (hz k)) hm + rw [← hc, repLorentzGroup_coeff_massWeightPoly, hx] /-- The weight components of a constant-gauge-invariant covariant decomposition - are constant-gauge invariant. -/ + are constant-gauge invariant: the constant gauge action preserves mass weights. -/ lemma repJetGaugeGroupI_ofConstant_covComponent_eq {z : ℕ → JetAlgebra} (hz : ∀ m, z m ∈ covMonomialSpan m) (g : GaugeGroupI) (hx : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (∑ m ∈ Finset.range 9, z m) = ∑ m ∈ Finset.range 9, z m) {m : ℕ} (hm : m ∈ Finset.range 9) : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z m) = z m := by - have hv : ∀ r : ℝ, ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) = 0 := by - intro r - have e1 : massWeightScale ((r : ℂ)) - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (∑ k ∈ Finset.range 9, z k) - ∑ k ∈ Finset.range 9, z k) = 0 := by - rw [hx, sub_self, map_zero] - rw [map_sum, map_sub, map_sum, map_sum] at e1 - calc ∑ k ∈ Finset.range 9, ((r : ℂ)) ^ k • - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k) - z k) - = (∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) - (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z k))) - - ∑ k ∈ Finset.range 9, massWeightScale ((r : ℂ)) (z k) := by - rw [← Finset.sum_sub_distrib] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [massWeightScale_repJetGaugeGroupI_ofConstant, - forall_massWeightScale_of_mem_covMonomialSpan (hz k), map_smul, - smul_sub] - _ = 0 := e1 - have h0 := eq_zero_of_forall_ofReal_sum_pow_smul_eq_zero _ _ hv hm - rwa [sub_eq_zero] at h0 + have hc : (massWeightPoly (∑ k ∈ Finset.range 9, z k)).coeff m = z m := + coeff_massWeightPoly_sum + (fun k => mem_massWeightSubmodule_of_mem_covMonomialSpan (hz k)) hm + rw [← hc, repJetGaugeGroupI_ofConstant_coeff_massWeightPoly, hx] /-! @@ -312,48 +225,34 @@ lemma repJetGaugeGroupI_ofConstant_covComponent_eq {z : ℕ → JetAlgebra} /-- An element with two distinct exact weights vanishes. -/ lemma eq_zero_of_eigen_ne {y : JetAlgebra} {m n : ℕ} - (hm : ∀ c : ℂ, massWeightScale c y = c ^ m • y) - (hn : ∀ c : ℂ, massWeightScale c y = c ^ n • y) (hmn : m ≠ n) : y = 0 := by - have h : ((2 : ℂ) ^ m) • y = ((2 : ℂ) ^ n) • y := (hm 2).symm.trans (hn 2) - have h2 : ((2 : ℂ) ^ m - 2 ^ n) • y = 0 := - (sub_smul ((2 : ℂ) ^ m) ((2 : ℂ) ^ n) y).trans (by rw [h, sub_self]) - rcases smul_eq_zero.mp h2 with h3 | h3 - · exfalso - apply hmn - rw [sub_eq_zero] at h3 - have h4 : ((2 ^ m : ℕ) : ℂ) = ((2 ^ n : ℕ) : ℂ) := by - push_cast - exact h3 - exact Nat.pow_right_injective (le_refl 2) (Nat.cast_injective h4) - · exact h3 + (hm : y ∈ massWeightSubmodule m) (hn : y ∈ massWeightSubmodule n) (hmn : m ≠ n) : + y = 0 := + (coeff_massWeightPoly_of_mem hm).symm.trans + (coeff_massWeightPoly_of_mem_ne (Ne.symm hmn) hn) /-- Every covariant monomial is the unit or homogeneous of weight at least three. -/ lemma mem_closure_weight_cases {y : JetAlgebra} (hy : y ∈ Submonoid.closure invariantGenerators) : - y = 1 ∨ ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c y = c ^ w • y := by + y = 1 ∨ ∃ w, 3 ≤ w ∧ y ∈ massWeightSubmodule w := by induction hy using Submonoid.closure_induction with | mem z hz => rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ · exact Or.inr ⟨4 + 2 * Multiset.card p.1, by omega, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ + fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2⟩ · exact Or.inr ⟨3 + 2 * p.1.length, by omega, - fun c => massWeightScale_Dψ c p.1 p.2⟩ + Dψ_mem_massWeightSubmodule p.1 p.2⟩ · exact Or.inr ⟨3 + 2 * p.1.length, by omega, - fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + Dbarψ_mem_massWeightSubmodule p.1 p.2⟩ | one => exact Or.inl rfl | mul a b ha hb iha ihb => rcases iha with rfl | ⟨wa, hwa3, hwa⟩ · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ · exact Or.inl (one_mul (1 : JetAlgebra)) - · exact Or.inr ⟨wb, hwb3, fun c => by - rw [show (1 : JetAlgebra) * b = b from one_mul b] - exact hwb c⟩ + · exact Or.inr ⟨wb, hwb3, by rwa [one_mul]⟩ · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ - · exact Or.inr ⟨wa, hwa3, fun c => by - rw [show a * (1 : JetAlgebra) = a from mul_one a] - exact hwa c⟩ - · exact Or.inr ⟨wa + wb, by omega, massWeightScale_mul_eigen hwa hwb⟩ + · exact Or.inr ⟨wa, hwa3, by rwa [mul_one]⟩ + · exact Or.inr ⟨wa + wb, by omega, mul_mem_massWeightSubmodule hwa hwb⟩ /-- The weight-zero covariant monomial span consists of the constants. -/ lemma covMonomialSpan_zero_le : @@ -371,9 +270,7 @@ lemma covMonomialSpan_le_bot_of_lt_three {m : ℕ} (hm1 : 1 ≤ m) (hm2 : m < 3) rw [covMonomialSpan, Submodule.span_le] rintro y ⟨hy, hym⟩ rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ - · have h1 : ∀ c : ℂ, massWeightScale c (1 : JetAlgebra) = c ^ 0 • 1 := - fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one - have := eq_zero_of_eigen_ne h1 hym (by omega) + · have := eq_zero_of_eigen_ne (SetLike.one_mem_graded massWeightSubmodule) hym (by omega) simp [this] · rw [show y = 0 from eq_zero_of_eigen_ne hwe hym (by omega)] simp @@ -396,7 +293,7 @@ gauge invariant. lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} (hy : y ∈ Submonoid.closure invariantGenerators) : ∃ (w : ℕ) (k : ℤ), k.natAbs ≤ w ∧ (w : ℤ) % 2 = k % 2 ∧ - (∀ c : ℂ, massWeightScale c y = c ^ w • y) ∧ + y ∈ massWeightSubmodule w ∧ ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = (((g.2.2 : ℂ)) ^ (6 * k)) • y := by have hz : ∀ g : GaugeGroupI, ((g.2.2 : ℂ)) ≠ 0 := by @@ -408,15 +305,15 @@ lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} | mem z hzz => rcases hzz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ · refine ⟨4 + 2 * Multiset.card p.1, 0, by simp, by omega, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2, fun g => ?_⟩ + fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2, fun g => ?_⟩ rw [repJetGaugeGroupI_fieldStrengthDeriv, mul_zero, zpow_zero, one_smul] · refine ⟨3 + 2 * p.1.length, 1, by omega, by omega, - fun c => massWeightScale_Dψ c p.1 p.2, fun g => ?_⟩ + Dψ_mem_massWeightSubmodule p.1 p.2, fun g => ?_⟩ rw [repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, SubmonoidClass.coe_pow, mul_one, show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] · refine ⟨3 + 2 * p.1.length, -1, by omega, by omega, - fun c => massWeightScale_Dbarψ c p.1 p.2, fun g => ?_⟩ + Dbarψ_mem_massWeightSubmodule p.1 p.2, fun g => ?_⟩ rw [repJetGaugeGroupI_Dbarψ, JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, SubmonoidClass.coe_pow, Unitary.coe_star] congr 1 @@ -426,8 +323,7 @@ lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] exact inv_pow _ 6 | one => - refine ⟨0, 0, by simp, rfl, fun c => by - rw [pow_zero, one_smul]; exact (massWeightScale c).map_one, fun g => ?_⟩ + refine ⟨0, 0, by simp, rfl, SetLike.one_mem_graded massWeightSubmodule, fun g => ?_⟩ rw [mul_zero, zpow_zero, one_smul] exact (repJetGaugeGroupI_eq_repAlgHom _ 1).trans (repAlgHom (JetGaugeGroupI.ofConstant g)).map_one @@ -436,7 +332,7 @@ lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} obtain ⟨wb, kb, hbb, hpb, heb, hgb⟩ := ihb refine ⟨wa + wb, ka + kb, by have := Int.natAbs_add_le ka kb - omega, by omega, massWeightScale_mul_eigen hea heb, fun g => ?_⟩ + omega, by omega, mul_mem_massWeightSubmodule hea heb, fun g => ?_⟩ rw [repJetGaugeGroupI_mul', hga g, hgb g, smul_mul_smul_comm, show (6 : ℤ) * (ka + kb) = 6 * ka + 6 * kb from by ring, zpow_add₀ (hz g)] @@ -554,7 +450,7 @@ charge components, and a constant-gauge invariant equals its neutral component. monomials of weight `m` and hypercharge `6 k`. -/ noncomputable def chargeCovSpan (m : ℕ) (k : ℤ) : Submodule ℂ JetAlgebra := Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ - (∀ c : ℂ, massWeightScale c y = c ^ m • y) ∧ + y ∈ massWeightSubmodule m ∧ ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = ((g.2.2 : ℂ)) ^ (6 * k) • y} diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean index 16206dae4..f902ef1fd 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean @@ -53,31 +53,30 @@ term, and the two fermion kinetic terms. three. -/ lemma exists_weight_of_mem_invariantGenerators {g : JetAlgebra} (hg : g ∈ invariantGenerators) : - ∃ w, 3 ≤ w ∧ ∀ c : ℂ, massWeightScale c g = c ^ w • g := by + ∃ w, 3 ≤ w ∧ g ∈ massWeightSubmodule w := by rcases hg with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ · exact ⟨4 + 2 * Multiset.card p.1, by omega, - fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dψ c p.1 p.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, fun c => massWeightScale_Dbarψ c p.1 p.2⟩ + fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, Dψ_mem_massWeightSubmodule p.1 p.2⟩ + · exact ⟨3 + 2 * p.1.length, by omega, Dbarψ_mem_massWeightSubmodule p.1 p.2⟩ /-- The product of a list of invariant generators is a weight eigenvector of weight at least three times the length. -/ lemma exists_weight_of_list_prod {l : List JetAlgebra} (hl : ∀ g ∈ l, g ∈ invariantGenerators) : - ∃ w, 3 * l.length ≤ w ∧ - ∀ c : ℂ, massWeightScale c l.prod = c ^ w • l.prod := by + ∃ w, 3 * l.length ≤ w ∧ l.prod ∈ massWeightSubmodule w := by induction l with | nil => - exact ⟨0, by simp, fun c => by - rw [List.prod_nil, pow_zero, one_smul] - exact (massWeightScale c).map_one⟩ + exact ⟨0, by simp, by + rw [List.prod_nil] + exact SetLike.one_mem_graded massWeightSubmodule⟩ | cons g l ih => obtain ⟨wg, hwg3, hwg⟩ := exists_weight_of_mem_invariantGenerators (hl g List.mem_cons_self) obtain ⟨wl, hwl3, hwl⟩ := ih fun x hx => hl x (List.mem_cons_of_mem g hx) - refine ⟨wg + wl, by simp only [List.length_cons]; omega, fun c => ?_⟩ + refine ⟨wg + wl, by simp only [List.length_cons]; omega, ?_⟩ rw [List.prod_cons] - exact massWeightScale_mul_eigen hwg hwl c + exact mul_mem_massWeightSubmodule hwg hwl /-- The constant gauge character of a product of two lepton factors: charge two. -/ @@ -116,8 +115,7 @@ lemma chargeCovSpan_four_le : rcases l with _ | ⟨g, _ | ⟨g', t⟩⟩ · rw [List.prod_nil] at hy2 ⊢ rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] + (SetLike.one_mem_graded massWeightSubmodule) hy2 (by omega)] exact Submodule.zero_mem _ · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> @@ -126,13 +124,13 @@ lemma chargeCovSpan_four_le : · rw [Multiset.card_eq_zero.mp hcard] exact Submodule.subset_span ⟨(p.2.1, p.2.2), rfl⟩ · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + · rw [eq_zero_of_eigen_ne (Dψ_mem_massWeightSubmodule p.1 p.2) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + · rw [eq_zero_of_eigen_ne (Dbarψ_mem_massWeightSubmodule p.1 p.2) hy2 (by omega)] exact Submodule.zero_mem _ · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl @@ -158,8 +156,7 @@ lemma chargeCovSpan_six_le : rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ · rw [List.prod_nil] at hy2 ⊢ rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] + (SetLike.one_mem_graded massWeightSubmodule) hy2 (by omega)] exact Submodule.zero_mem _ · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> @@ -169,13 +166,13 @@ lemma chargeCovSpan_six_le : rw [hρ] exact Submodule.subset_span (Or.inl (Or.inl ⟨(ρ, p.2.1, p.2.2), rfl⟩)) · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + · rw [eq_zero_of_eigen_ne (Dψ_mem_massWeightSubmodule p.1 p.2) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + · rw [eq_zero_of_eigen_ne (Dbarψ_mem_massWeightSubmodule p.1 p.2) hy2 (by omega)] exact Submodule.zero_mem _ · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ @@ -183,22 +180,22 @@ lemma chargeCovSpan_six_le : rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> dsimp only at hy2 hy3 ⊢ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) + (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) + (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) + (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dψ_mem_massWeightSubmodule p.1 p.2) + (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 (by omega)] exact Submodule.zero_mem _ · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) @@ -207,21 +204,21 @@ lemma chargeCovSpan_six_le : · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] exact Submodule.subset_span (Or.inr ⟨(p.2, q.2), rfl⟩) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dψ_mem_massWeightSubmodule p.1 p.2) + (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dbarψ_mem_massWeightSubmodule p.1 p.2) + (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 (by omega)] exact Submodule.zero_mem _ · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] exact Submodule.subset_span (Or.inl (Or.inr ⟨(p.2, q.2), rfl⟩)) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dbarψ_mem_massWeightSubmodule p.1 p.2) + (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] @@ -260,8 +257,7 @@ lemma chargeCovSpan_eight_le : rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ · rw [List.prod_nil] at hy2 ⊢ rw [eq_zero_of_eigen_ne (m := 0) - (fun c => by rw [pow_zero, one_smul]; exact (massWeightScale c).map_one) - hy2 (by omega)] + (SetLike.one_mem_graded massWeightSubmodule) hy2 (by omega)] exact Submodule.zero_mem _ · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> @@ -272,13 +268,13 @@ lemma chargeCovSpan_eight_le : exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨((ρ, τ), p.2.1, p.2.2), rfl⟩))))) · rw [eq_zero_of_eigen_ne - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) hy2 + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dψ c p.1 p.2) hy2 + · rw [eq_zero_of_eigen_ne (Dψ_mem_massWeightSubmodule p.1 p.2) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (fun c => massWeightScale_Dbarψ c p.1 p.2) hy2 + · rw [eq_zero_of_eigen_ne (Dbarψ_mem_massWeightSubmodule p.1 p.2) hy2 (by omega)] exact Submodule.zero_mem _ · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ @@ -290,22 +286,22 @@ lemma chargeCovSpan_eight_le : · rw [Multiset.card_eq_zero.mp hcard.1, Multiset.card_eq_zero.mp hcard.2] exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl ⟨((p.2.1, p.2.2), q.2.1, q.2.2), rfl⟩))))) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) + (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) + (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_fieldStrengthDeriv c p.1 p.2.1 p.2.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) + (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dψ_mem_massWeightSubmodule p.1 p.2) + (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 (by omega)] exact Submodule.zero_mem _ · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) @@ -320,13 +316,13 @@ lemma chargeCovSpan_eight_le : rw [List.length_eq_zero_iff.mp hlen'.2, hμ] exact Submodule.subset_span (Or.inl (Or.inl (Or.inr ⟨((q.2, p.2), μ), rfl⟩))) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dψ c p.1 p.2) - (fun c => massWeightScale_Dbarψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dψ_mem_massWeightSubmodule p.1 p.2) + (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_fieldStrengthDeriv c q.1 q.2.1 q.2.2)) hy2 + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dbarψ_mem_massWeightSubmodule p.1 p.2) + (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 (by omega)] exact Submodule.zero_mem _ · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 @@ -338,9 +334,9 @@ lemma chargeCovSpan_eight_le : · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 rw [List.length_eq_zero_iff.mp hlen'.2, hμ] exact Submodule.subset_span (Or.inr ⟨((q.2, p.2), μ), rfl⟩) - · rw [eq_zero_of_eigen_ne (massWeightScale_mul_eigen - (fun c => massWeightScale_Dbarψ c p.1 p.2) - (fun c => massWeightScale_Dψ c q.1 q.2)) hy2 (by omega)] + · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule + (Dbarψ_mem_massWeightSubmodule p.1 p.2) + (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] exact Submodule.zero_mem _ · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean index 9264bcad2..a54970c24 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean @@ -14,10 +14,9 @@ three coordinate axes, the subgroups `boostSubgroupZ/X/Y` they generate, and their Lorentz matrices; together with the two fixed `z`-boosts `boostZ2`, `boostZ3` used to kill the weight-six sector. -These boosts are the subgroup that the rest of `Subgroups/` acts with — the -`BoostsOn*` files tabulate their action on the field strength, its derivatives, -and the photon and fermion terms — and that `Averages/BoostAverage` averages -over. Being non-compact they admit no invariant average, which is why that +These boosts are the subgroup that `Averages/BoostAverage` averages over; its +`boostAvg_calculator` tactic computes their action on the weight-eight monomials from the +`boostMat*` matrices below together with the transformation laws of `LorentzAction`. Being non-compact they admit no invariant average, which is why that file has to weight them by hand. -/ @@ -251,6 +250,23 @@ lemma boostYel_inv (t : ℝ) (ht : t ≠ 0) : · simp [boostYel, Complex.ofReal_inv, inv_inv] try ring +/-- The matrix of the `z`-boost. -/ +lemma boostZel_coe (t : ℝ) (ht : t ≠ 0) : + ((boostZel t ht : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = + !![((t : ℝ) : ℂ), 0; 0, (((t : ℝ) : ℂ))⁻¹] := rfl + +/-- The matrix of the `x`-boost. -/ +lemma boostXel_coe (t : ℝ) (ht : t ≠ 0) : + ((boostXel t ht : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, ((t : ℂ) - (t : ℂ)⁻¹)/2; + ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2] := rfl + +/-- The matrix of the `y`-boost. -/ +lemma boostYel_coe (t : ℝ) (ht : t ≠ 0) : + ((boostYel t ht : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = + !![((t : ℂ) + (t : ℂ)⁻¹)/2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; + Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2] := rfl + /-- The inverse of the parametric `z`-boost, entrywise, with real entries. -/ lemma boostZel_inv_coe (t : ℝ) (ht : t ≠ 0) : ((boostZel t ht)⁻¹ : SL(2,ℂ)).1 = diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean deleted file mode 100644 index 3d098ba22..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFermionTerms.lean +++ /dev/null @@ -1,871 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnPhotonTerms -/-! -# Boosts acting on the fermion terms - -The paired boost actions on the weight-eight fermion bilinears -`ψ̄_α (D_μ ψ)_β` and `(D̄_μ ψ̄)_α ψ_β`. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u0`. -/ -lemma boostPairZ_u0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u1`. -/ -lemma boostPairZ_u1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u2`. -/ -lemma boostPairZ_u2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `u3`. -/ -lemma boostPairZ_u3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u0`. -/ -lemma boostPairX_u0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u1`. -/ -lemma boostPairX_u1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u2`. -/ -lemma boostPairX_u2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `u3`. -/ -lemma boostPairX_u3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u0`. -/ -lemma boostPairY_u0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) + - (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u1`. -/ -lemma boostPairY_u1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u2`. -/ -lemma boostPairY_u2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) + - (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • - (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `u3`. -/ -lemma boostPairY_u3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar0`. -/ -lemma boostPairZ_ubar0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar1`. -/ -lemma boostPairZ_ubar1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar2`. -/ -lemma boostPairZ_ubar2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Z`-boost on the σ-contracted fermion - pair `ubar3`. -/ -lemma boostPairZ_ubar3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - repLorentzGroup ((boostZel t ht)⁻¹) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostZel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostZel, boostZel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar0`. -/ -lemma boostPairX_ubar0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar1`. -/ -lemma boostPairX_ubar1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar2`. -/ -lemma boostPairX_ubar2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `X`-boost on the σ-contracted fermion - pair `ubar3`. -/ -lemma boostPairX_ubar3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - repLorentzGroup ((boostXel t ht)⁻¹) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostXel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostXel, boostXel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar0`. -/ -lemma boostPairY_ubar0 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) + - (Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ)) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inl 0) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inl 0) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar1`. -/ -lemma boostPairY_ubar1 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 0) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 0) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar2`. -/ -lemma boostPairY_ubar2 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) + - (-(Complex.I * (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ))) • - (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 1) 1 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 0 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 1) 1 0, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action of the `Y`-boost on the σ-contracted fermion - pair `ubar3`. -/ -lemma boostPairY_ubar3 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) + - repLorentzGroup ((boostYel t ht)⁻¹) - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - ((2 : ℝ) : ℂ) • - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [map_add, map_sub, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t ht) (Sum.inr 2) 1 1, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 0 0, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (boostYel t⁻¹ (inv_ne_zero ht)) (Sum.inr 2) 1 1, - toLorentzGroup_boostYel, boostYel_inv_coe, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_add, map_sub, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - match_scalars <;> (push_cast; try field_simp; try ring_nf; try simp only [Complex.I_sq]; try ring) -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean deleted file mode 100644 index bd475986c..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrength.lean +++ /dev/null @@ -1,547 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.AxisBoosts -/-! -# Boosts acting on the field strength - -For each axis `T ∈ {Z, X, Y}` the paired boost actions -`rep(boost t) + rep(boost t⁻¹)` act on the weight-eight monomials with -coefficients polynomial in `t^2` and `t⁻²`. This file records those actions on -the single field strengths `F_{ab}` (`boostZ_*`, `boostX_*`, `boostY_*`) and on the -second derivatives `∂_r ∂_s F_{ab}` (`boostZ_dd*`, `boostX_dd*`, `boostY_dd*`). --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -### The symmetrised boost average on the weight-eight sector - -For each axis `T ∈ {Z, X, Y}` the paired boost actions `rep(boost) + rep(boost⁻¹)` -at `t` and `t⁻¹` act on the rotation-symmetric weight-eight basis vectors with -even coefficients in the boost parameter. A rational combination of the -paired boosts at `t = 2, 3, 4` together with the identity (`boostAvgZ/X/Y`) -realises the rotation-averaged single-axis averages, and their mean `boostAvg` -fixes every Lorentz-invariant vector while acting on the weight-eight basis -by an explicit rational matrix (the `boostAvg_*` stage lemmas below). - --/ - -/-- Reordering the two derivative indices of a second-derivative field - strength. -/ -lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {r, s} a b = fieldStrengthDeriv {s, r} a b := by - have h : ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) = {s, r} := Multiset.cons_swap r s 0 - rw [h] - -lemma boostMatZ_00 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatZ_01 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 0) = 0 := rfl -lemma boostMatZ_02 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 1) = 0 := rfl -lemma boostMatZ_03 (t : ℝ) : boostMatZ t (Sum.inl 0) (Sum.inr 2) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatZ_10 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inl 0) = 0 := rfl -lemma boostMatZ_11 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 0) = 1 := rfl -lemma boostMatZ_12 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 1) = 0 := rfl -lemma boostMatZ_13 (t : ℝ) : boostMatZ t (Sum.inr 0) (Sum.inr 2) = 0 := rfl -lemma boostMatZ_20 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inl 0) = 0 := rfl -lemma boostMatZ_21 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 0) = 0 := rfl -lemma boostMatZ_22 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 1) = 1 := rfl -lemma boostMatZ_23 (t : ℝ) : boostMatZ t (Sum.inr 1) (Sum.inr 2) = 0 := rfl -lemma boostMatZ_30 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatZ_31 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 0) = 0 := rfl -lemma boostMatZ_32 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 1) = 0 := rfl -lemma boostMatZ_33 (t : ℝ) : boostMatZ t (Sum.inr 2) (Sum.inr 2) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl - -lemma boostMatX_00 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatX_01 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatX_02 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 1) = 0 := rfl -lemma boostMatX_03 (t : ℝ) : boostMatX t (Sum.inl 0) (Sum.inr 2) = 0 := rfl -lemma boostMatX_10 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatX_11 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatX_12 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 1) = 0 := rfl -lemma boostMatX_13 (t : ℝ) : boostMatX t (Sum.inr 0) (Sum.inr 2) = 0 := rfl -lemma boostMatX_20 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inl 0) = 0 := rfl -lemma boostMatX_21 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 0) = 0 := rfl -lemma boostMatX_22 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 1) = 1 := rfl -lemma boostMatX_23 (t : ℝ) : boostMatX t (Sum.inr 1) (Sum.inr 2) = 0 := rfl -lemma boostMatX_30 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inl 0) = 0 := rfl -lemma boostMatX_31 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 0) = 0 := rfl -lemma boostMatX_32 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 1) = 0 := rfl -lemma boostMatX_33 (t : ℝ) : boostMatX t (Sum.inr 2) (Sum.inr 2) = 1 := rfl - -lemma boostMatY_00 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inl 0) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatY_01 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 0) = 0 := rfl -lemma boostMatY_02 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 1) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatY_03 (t : ℝ) : boostMatY t (Sum.inl 0) (Sum.inr 2) = 0 := rfl -lemma boostMatY_10 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inl 0) = 0 := rfl -lemma boostMatY_11 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 0) = 1 := rfl -lemma boostMatY_12 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 1) = 0 := rfl -lemma boostMatY_13 (t : ℝ) : boostMatY t (Sum.inr 0) (Sum.inr 2) = 0 := rfl -lemma boostMatY_20 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inl 0) = -((t ^ 2 - t⁻¹ ^ 2) / 2) := rfl -lemma boostMatY_21 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 0) = 0 := rfl -lemma boostMatY_22 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 1) = (t ^ 2 + t⁻¹ ^ 2) / 2 := rfl -lemma boostMatY_23 (t : ℝ) : boostMatY t (Sum.inr 1) (Sum.inr 2) = 0 := rfl -lemma boostMatY_30 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inl 0) = 0 := rfl -lemma boostMatY_31 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 0) = 0 := rfl -lemma boostMatY_32 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 1) = 0 := rfl -lemma boostMatY_33 (t : ℝ) : boostMatY t (Sum.inr 2) (Sum.inr 2) = 1 := rfl - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on a fermion pair `ψ̄_α (Dψ_μ)_β` with one derivative on - the unbarred factor. -/ -lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) = - ∑ γ, ∑ ν, ∑ δ, ((Λ⁻¹).1 α γ * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β δ))) • (Dbarψ [] γ * Dψ [ν] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] - simp only [hsm, hms, hms₂, hsmul] - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on a fermion pair `(D̄ψ̄_μ)_α ψ_β` with one derivative on - the barred factor. -/ -lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) = - ∑ ν, ∑ γ, ∑ δ, (((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α γ) * star ((Λ⁻¹).1 β δ)) • (Dbarψ [ν] γ * Dψ [] δ) := by - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsm₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] - simp only [hsm, hsm₂, hms, hsmul] - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F01`. -/ -lemma boostZ_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F02`. -/ -lemma boostZ_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F03`. -/ -lemma boostZ_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F12`. -/ -lemma boostZ_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F13`. -/ -lemma boostZ_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Z`-boost action on the field strength `F23`. -/ -lemma boostZ_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F01`. -/ -lemma boostX_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F02`. -/ -lemma boostX_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F03`. -/ -lemma boostX_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F12`. -/ -lemma boostX_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F13`. -/ -lemma boostX_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `X`-boost action on the field strength `F23`. -/ -lemma boostX_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F01`. -/ -lemma boostY_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F02`. -/ -lemma boostY_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F03`. -/ -lemma boostY_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F12`. -/ -lemma boostY_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 4 - 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F13`. -/ -lemma boostY_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 2000000 in -/-- The `Y`-boost action on the field strength `F23`. -/ -lemma boostY_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 4 + 1) / (2 * t ^ 2) : ℝ) : ℂ) • - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - try (match_scalars <;> (push_cast; try field_simp; try ring)) -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean deleted file mode 100644 index e46dba81d..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnFieldStrengthDerivatives.lean +++ /dev/null @@ -1,1002 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnFieldStrength -/-! -# Boosts acting on the derivatives of the field strength - -The paired boost actions `rep(boost t) + rep(boost t⁻¹)` on the weight-eight -monomials `∂_r ∂_s F_{ab}`, for each of the three coordinate axes. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma boostZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma boostZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma boostZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma boostZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma boostZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 2, Sum.inr 2} (Sum.inl 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma boostZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 2, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma boostZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma boostZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma boostZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma boostZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma boostZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 2), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Z`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma boostZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ_00, boostMatZ_01, boostMatZ_02, boostMatZ_03, - boostMatZ_10, boostMatZ_11, boostMatZ_12, boostMatZ_13, - boostMatZ_20, boostMatZ_21, boostMatZ_22, boostMatZ_23, - boostMatZ_30, boostMatZ_31, boostMatZ_32, boostMatZ_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma boostX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma boostX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma boostX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma boostX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma boostX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma boostX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma boostX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma boostX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma boostX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma boostX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma boostX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `X`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma boostX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatX_00, boostMatX_01, boostMatX_02, boostMatX_03, - boostMatX_10, boostMatX_11, boostMatX_12, boostMatX_13, - boostMatX_20, boostMatX_21, boostMatX_22, boostMatX_23, - boostMatX_30, boostMatX_31, boostMatX_32, boostMatX_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma boostY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma boostY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma boostY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 1} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma boostY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inl 0} (Sum.inr 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma boostY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma boostY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma boostY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma boostY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0), - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 0), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma boostY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma boostY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma boostY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - (((-t ^ 8 + 2 * t ^ 4 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 8 - 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inr 1), - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) - -set_option maxHeartbeats 4000000 in -/-- The `Y`-boost action on the derivative field strength - `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma boostY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 8 - 2 * t ^ 4 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((-t ^ 8 + 1) / (4 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_pair] - simp only [toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatY_00, boostMatY_01, boostMatY_02, boostMatY_03, - boostMatY_10, boostMatY_11, boostMatY_12, boostMatY_13, - boostMatY_20, boostMatY_21, boostMatY_22, boostMatY_23, - boostMatY_30, boostMatY_31, boostMatY_32, boostMatY_33, - fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_neg, zero_smul, smul_zero, smul_neg, - neg_smul, add_zero, zero_add, neg_zero] - try (match_scalars <;> (push_cast; try field_simp; try ring)) -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean deleted file mode 100644 index bc0b38354..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/BoostsOnPhotonTerms.lean +++ /dev/null @@ -1,1255 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.BoostsOnFieldStrengthDerivatives -/-! -# Boosts acting on the photon terms - -The paired boost actions on the weight-eight products `F_{ab} F_{cd}` -(`boostPairZ_*`, `boostPairX_*`, `boostPairY_*`) and on the second-derivative field strengths -`∂_r ∂_s F_{ab}` (`boostPairZ_dd*`, `boostPairX_dd*`, `boostPairY_dd*`). --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- Right distributivity on the jet algebra. The generic `add_mul` does not fire - here: the multiplication of the jet algebra comes from the tensor-product - instance, which typeclass search does not connect to `RightDistribClass`. -/ -lemma jetAdd_mul (u v w : JetAlgebra) : (u + v) * w = u * w + v * w := by grind - -/-- Left distributivity on the jet algebra; see `jetAdd_mul`. -/ -lemma jetMul_add (u v w : JetAlgebra) : u * (v + w) = u * v + u * w := by grind - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F01 * F01`. -/ -lemma boostPairZ_F01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F01 t ht, - boostZ_F01 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F01 * F23`. -/ -lemma boostPairZ_F01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F01 t ht, - boostZ_F01 t⁻¹ (inv_ne_zero ht), - boostZ_F23 t ht, - boostZ_F23 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F02 * F02`. -/ -lemma boostPairZ_F02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F02 t ht, - boostZ_F02 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F02 * F13`. -/ -lemma boostPairZ_F02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F02 t ht, - boostZ_F02 t⁻¹ (inv_ne_zero ht), - boostZ_F13 t ht, - boostZ_F13 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F03 * F03`. -/ -lemma boostPairZ_F03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F03 t ht, - boostZ_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F03 * F12`. -/ -lemma boostPairZ_F03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F03 t ht, - boostZ_F03 t⁻¹ (inv_ne_zero ht), - boostZ_F12 t ht, - boostZ_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F12 * F12`. -/ -lemma boostPairZ_F12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F12 t ht, - boostZ_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F13 * F13`. -/ -lemma boostPairZ_F13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F13 t ht, - boostZ_F13 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Z`-boost on - `F23 * F23`. -/ -lemma boostPairZ_F23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostZ_F23 t ht, - boostZ_F23 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F01 * F01`. -/ -lemma boostPairX_F01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F01 t ht, - boostX_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F01 * F23`. -/ -lemma boostPairX_F01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F01 t ht, - boostX_F01 t⁻¹ (inv_ne_zero ht), - boostX_F23 t ht, - boostX_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F02 * F02`. -/ -lemma boostPairX_F02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F02 t ht, - boostX_F02 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F02 * F13`. -/ -lemma boostPairX_F02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F02 t ht, - boostX_F02 t⁻¹ (inv_ne_zero ht), - boostX_F13 t ht, - boostX_F13 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F03 * F03`. -/ -lemma boostPairX_F03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F03 t ht, - boostX_F03 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F03 * F12`. -/ -lemma boostPairX_F03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F03 t ht, - boostX_F03 t⁻¹ (inv_ne_zero ht), - boostX_F12 t ht, - boostX_F12 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F12 * F12`. -/ -lemma boostPairX_F12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F12 t ht, - boostX_F12 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F13 * F13`. -/ -lemma boostPairX_F13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F13 t ht, - boostX_F13 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `X`-boost on - `F23 * F23`. -/ -lemma boostPairX_F23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostX_F23 t ht, - boostX_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F01 * F01`. -/ -lemma boostPairY_F01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F01 t ht, - boostY_F01 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F01 * F23`. -/ -lemma boostPairY_F01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F01 t ht, - boostY_F01 t⁻¹ (inv_ne_zero ht), - boostY_F23 t ht, - boostY_F23 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F02 * F02`. -/ -lemma boostPairY_F02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F02 t ht, - boostY_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F02 * F13`. -/ -lemma boostPairY_F02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F02 t ht, - boostY_F02 t⁻¹ (inv_ne_zero ht), - boostY_F13 t ht, - boostY_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F03 * F03`. -/ -lemma boostPairY_F03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F03 t ht, - boostY_F03 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F03 * F12`. -/ -lemma boostPairY_F03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F03 t ht, - boostY_F03 t⁻¹ (inv_ne_zero ht), - boostY_F12 t ht, - boostY_F12 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F12 * F12`. -/ -lemma boostPairY_F12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F12 t ht, - boostY_F12 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F13 * F13`. -/ -lemma boostPairY_F13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F13 t ht, - boostY_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 4000000 in -/-- The paired boost action (`t` and `t⁻¹` together) of the `Y`-boost on - `F23 * F23`. -/ -lemma boostPairY_F23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul] - simp only [boostY_F23 t ht, - boostY_F23 t⁻¹ (inv_ne_zero ht)] - simp only [jetAdd_mul, jetMul_add, smul_mul_smul_comm, smul_mul_assoc, mul_smul_comm, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F01` with - derivative indices `(0, 1)`. -/ -lemma boostPairZ_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd01_F01 t ht, boostZ_dd01_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F23` with - derivative indices `(0, 1)`. -/ -lemma boostPairZ_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd01_F23 t ht, boostZ_dd01_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F02` with - derivative indices `(0, 2)`. -/ -lemma boostPairZ_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd02_F02 t ht, boostZ_dd02_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F13` with - derivative indices `(0, 2)`. -/ -lemma boostPairZ_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd02_F13 t ht, boostZ_dd02_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F03` with - derivative indices `(0, 3)`. -/ -lemma boostPairZ_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd03_F03 t ht, boostZ_dd03_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F12` with - derivative indices `(0, 3)`. -/ -lemma boostPairZ_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd03_F12 t ht, boostZ_dd03_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F03` with - derivative indices `(1, 2)`. -/ -lemma boostPairZ_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd12_F03 t ht, boostZ_dd12_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F12` with - derivative indices `(1, 2)`. -/ -lemma boostPairZ_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd12_F12 t ht, boostZ_dd12_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F02` with - derivative indices `(1, 3)`. -/ -lemma boostPairZ_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd13_F02 t ht, boostZ_dd13_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F13` with - derivative indices `(1, 3)`. -/ -lemma boostPairZ_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd13_F13 t ht, boostZ_dd13_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F01` with - derivative indices `(2, 3)`. -/ -lemma boostPairZ_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd23_F01 t ht, boostZ_dd23_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Z`-boost on `∂∂F23` with - derivative indices `(2, 3)`. -/ -lemma boostPairZ_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostZel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostZel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostZel_inv] - simp only [boostZ_dd23_F23 t ht, boostZ_dd23_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F01` with - derivative indices `(0, 1)`. -/ -lemma boostPairX_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd01_F01 t ht, boostX_dd01_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F23` with - derivative indices `(0, 1)`. -/ -lemma boostPairX_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd01_F23 t ht, boostX_dd01_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F02` with - derivative indices `(0, 2)`. -/ -lemma boostPairX_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd02_F02 t ht, boostX_dd02_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F13` with - derivative indices `(0, 2)`. -/ -lemma boostPairX_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd02_F13 t ht, boostX_dd02_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F03` with - derivative indices `(0, 3)`. -/ -lemma boostPairX_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd03_F03 t ht, boostX_dd03_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F12` with - derivative indices `(0, 3)`. -/ -lemma boostPairX_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd03_F12 t ht, boostX_dd03_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F03` with - derivative indices `(1, 2)`. -/ -lemma boostPairX_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd12_F03 t ht, boostX_dd12_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F12` with - derivative indices `(1, 2)`. -/ -lemma boostPairX_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd12_F12 t ht, boostX_dd12_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F02` with - derivative indices `(1, 3)`. -/ -lemma boostPairX_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd13_F02 t ht, boostX_dd13_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F13` with - derivative indices `(1, 3)`. -/ -lemma boostPairX_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd13_F13 t ht, boostX_dd13_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F01` with - derivative indices `(2, 3)`. -/ -lemma boostPairX_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd23_F01 t ht, boostX_dd23_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `X`-boost on `∂∂F23` with - derivative indices `(2, 3)`. -/ -lemma boostPairX_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostXel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostXel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostXel_inv] - simp only [boostX_dd23_F23 t ht, boostX_dd23_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F01` with - derivative indices `(0, 1)`. -/ -lemma boostPairY_dd01_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd01_F01 t ht, boostY_dd01_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F23` with - derivative indices `(0, 1)`. -/ -lemma boostPairY_dd01_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd01_F23 t ht, boostY_dd01_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F02` with - derivative indices `(0, 2)`. -/ -lemma boostPairY_dd02_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd02_F02 t ht, boostY_dd02_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F13` with - derivative indices `(0, 2)`. -/ -lemma boostPairY_dd02_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (((t ^ 8 + 1) / t ^ 4 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd02_F13 t ht, boostY_dd02_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F03` with - derivative indices `(0, 3)`. -/ -lemma boostPairY_dd03_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd03_F03 t ht, boostY_dd03_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F12` with - derivative indices `(0, 3)`. -/ -lemma boostPairY_dd03_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd03_F12 t ht, boostY_dd03_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F03` with - derivative indices `(1, 2)`. -/ -lemma boostPairY_dd12_F03 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd12_F03 t ht, boostY_dd12_F03 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F12` with - derivative indices `(1, 2)`. -/ -lemma boostPairY_dd12_F12 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd12_F12 t ht, boostY_dd12_F12 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F02` with - derivative indices `(1, 3)`. -/ -lemma boostPairY_dd13_F02 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd13_F02 t ht, boostY_dd13_F02 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F13` with - derivative indices `(1, 3)`. -/ -lemma boostPairY_dd13_F13 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - ((2 : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd13_F13 t ht, boostY_dd13_F13 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F01` with - derivative indices `(2, 3)`. -/ -lemma boostPairY_dd23_F01 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0) + - ((-((t ^ 4 - 1) ^ 2 / (2 * t ^ 4)) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd23_F01 t ht, boostY_dd23_F01 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) - -set_option maxHeartbeats 2000000 in -/-- The paired boost action of the `Y`-boost on `∂∂F23` with - derivative indices `(2, 3)`. -/ -lemma boostPairY_dd23_F23 (t : ℝ) (ht : t ≠ 0) : - repLorentzGroup (boostYel t ht) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) + - repLorentzGroup ((boostYel t ht)⁻¹) - (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (((t ^ 4 + 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2) + - (((t ^ 4 - 1) ^ 2 / (2 * t ^ 4) : ℝ) : ℂ) • - fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2) := by - have ht' : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [boostYel_inv] - simp only [boostY_dd23_F23 t ht, boostY_dd23_F23 t⁻¹ (inv_ne_zero ht)] - match_scalars <;> (push_cast; try field_simp; try ring) -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean index 279df9755..0a9830e97 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean @@ -362,6 +362,60 @@ lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) -/ +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on a fermion pair `ψ̄_α (Dψ_μ)_β` with one derivative on + the unbarred factor. -/ +lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) = + ∑ γ, ∑ ν, ∑ δ, ((Λ⁻¹).1 α γ * + ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β δ))) • (Dbarψ [] γ * Dψ [ν] δ) := by + have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] + simp only [hsm, hms, hms₂, hsmul] + +set_option maxHeartbeats 2000000 in +/-- The Lorentz action on a fermion pair `(D̄ψ̄_μ)_α ψ_β` with one derivative on + the barred factor. -/ +lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : + repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) = + ∑ ν, ∑ γ, ∑ δ, (((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + (Λ⁻¹).1 α γ) * star ((Λ⁻¹).1 β δ)) • (Dbarψ [ν] γ * Dψ [] δ) := by + have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsm₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] + simp only [hsm, hsm₂, hms, hsmul] + + /-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean index 4a0e912ff..c314d8178 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean @@ -301,10 +301,9 @@ lemma fermionKineticTerm_mem_massWeightLESubmodule : refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => Submodule.smul_mem _ _ ?_) - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 3 + 5) le_rfl - (massWeightScale_mul_eigen (m := 3) (n := 5) - (fun c => massWeightScale_Dbarψ c [] α) - (fun c => massWeightScale_Dψ c [μ] β)) + refine mem_massWeightLESubmodule_of_mem (n := 8) (by simp) + (mul_mem_massWeightSubmodule (Dbarψ_mem_massWeightSubmodule [] α) + (Dψ_mem_massWeightSubmodule [μ] β)) lemma fermionKineticTermBar_mem_massWeightLESubmodule : fermionKineticTermBar ∈ MassWeightLESubmodule 8 := by @@ -312,10 +311,9 @@ lemma fermionKineticTermBar_mem_massWeightLESubmodule : refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => Submodule.smul_mem _ _ ?_) - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 5 + 3) le_rfl - (massWeightScale_mul_eigen (m := 5) (n := 3) - (fun c => massWeightScale_Dbarψ c [μ] α) - (fun c => massWeightScale_Dψ c [] β)) + refine mem_massWeightLESubmodule_of_mem (n := 8) (by simp) + (mul_mem_massWeightSubmodule (Dbarψ_mem_massWeightSubmodule [μ] α) + (Dψ_mem_massWeightSubmodule [] β)) set_option maxHeartbeats 2000000 in set_option linter.unusedSimpArgs false in diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean index 707d6e8b4..81cc159e0 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean @@ -75,7 +75,6 @@ lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] simp -set_option maxHeartbeats 2000000 in /-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : repLorentzGroup Λ maxwellTerm = maxwellTerm := by @@ -153,13 +152,11 @@ lemma maxwellTerm_mem_massWeightLESubmodule : rw [maxwellTerm] refine Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun ν _ => Submodule.smul_mem _ _ ?_ - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl - (massWeightScale_mul_eigen (m := 4) (n := 4) - (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν) - (fun c => massWeightScale_fieldStrengthDeriv c {} μ ν)) + have h4 : (fieldStrengthDeriv {} μ ν : JetAlgebra) ∈ massWeightSubmodule 4 := by + simpa using fieldStrengthDeriv_mem_massWeightSubmodule {} μ ν + exact mem_massWeightLESubmodule_of_mem (m := 4 + 4) le_rfl + (mul_mem_massWeightSubmodule h4 h4) -set_option maxHeartbeats 4000000 in -set_option linter.unusedSimpArgs false in /-- The Maxwell term as an explicit combination of the six independent field-strength squares. -/ lemma maxwellTerm_eq : maxwellTerm = @@ -175,32 +172,18 @@ lemma maxwellTerm_eq : maxwellTerm = fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have hz₁ : ∀ z : JetAlgebra, 0 * z = 0 := fun z => zero_mul z - have hz₂ : ∀ z : JetAlgebra, z * 0 = 0 := fun z => mul_zero z have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind rw [maxwellTerm] simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, minkowskiMatrix.inl_0_inl_0, minkowskiMatrix.inr_i_inr_i, - fieldStrengthDeriv_self, hz₁, hz₂, smul_zero, add_zero, zero_add] + fieldStrengthDeriv_self, mul_zero, smul_zero, add_zero, zero_add] simp only [ - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), hnm, hmn, neg_neg] push_cast diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean index 5f744a5d9..5fb1be96d 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean @@ -253,10 +253,10 @@ lemma thetaTerm_mem_massWeightLESubmodule : thetaTerm ∈ MassWeightLESubmodule 8 := by rw [thetaTerm] refine Submodule.sum_mem _ fun p _ => zsmul_mem ?_ _ - exact mem_massWeightLESubmodule_of_forall_massWeightScale (m := 4 + 4) le_rfl - (massWeightScale_mul_eigen (m := 4) (n := 4) - (fun c => massWeightScale_fieldStrengthDeriv c {} _ _) - (fun c => massWeightScale_fieldStrengthDeriv c {} _ _)) + have h4 : ∀ μ ν, (fieldStrengthDeriv {} μ ν : JetAlgebra) ∈ massWeightSubmodule 4 := fun μ ν => by + simpa using fieldStrengthDeriv_mem_massWeightSubmodule {} μ ν + exact mem_massWeightLESubmodule_of_mem (m := 4 + 4) le_rfl + (mul_mem_massWeightSubmodule (h4 _ _) (h4 _ _)) set_option maxHeartbeats 8000000 in set_option linter.unusedSimpArgs false in From cc98fe8779ebed3fcafff4d12521566715e02710 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 16:40:42 +0100 Subject: [PATCH 121/254] feat: Add boost weight grading Co-Authored-By: Claude --- .../JetAlgebra/Grading/BoostWeight.lean | 528 ++++++++++++++++++ 1 file changed, 528 insertions(+) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean new file mode 100644 index 000000000..895b98373 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -0,0 +1,528 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAverage +/-! +# Grading by boost weight in the Z-direction + +The jet algebra is graded by the boost weight, corresponding to how the element scales under a +boost in the Z-direction: `x` has boost weight `k` when `ρ(boostZel t) x = t ^ k • x` for every +`t`. + +*Unlike the hypercharge grading, this one is not diagonal on the generators.* The gauge group +acts on each generator by a character, so `hyperchargePoly` could be defined by sending each +generator to `T ^ q` times itself. A boost does not: it mixes the time index with the `z` index, +so `∂_s B_μ` and `∂_s ψ_α` in the coordinate basis are not boost eigenvectors. For instance +`ρ(boostZel t) F_{0x} = ch F_{0x} - sh F_{zx}`. Only the light-cone combinations are homogeneous +— `F_{0x} ∓ F_{zx}` has boost weight `±2` — so a `LaurentPolynomial`-valued grading map in the +style of `Grading/Hypercharge` would first need a light-cone generating set. What is defined +here instead is the grading itself, as the family of weight submodules, which needs no change of +basis. + +With this grading we can define the subspace of boost weight zero. Any invariant under the +Lorentz group lies in it, since a boost fixes an invariant. + +*How far the grading is established.* Of the two halves of `DirectSum.IsInternal`, independence +is proved — `boostWeightSubmodule_iSupIndep`, from the weight spaces sitting inside the +eigenspaces of a single boost at the distinct eigenvalues `2 ^ k`. Exhaustiveness is reduced to +a single statement: `boostWeightSubalgebra_eq_top_of_forall_ofGenerator` says the homogeneous +elements span everything as soon as each *generator* `[j]ₐ` is a finite sum of boost +eigenvectors, and `boostWeightSubmodule_isInternal_iff` turns spanning into `IsInternal`. So the +whole grading rests on + + `∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra`, + +which is not proved here. The route is to descend to the component spaces, where the boost acts +linearly: `BBoson.JetComponentSpace` is `DerivAlgebraReal ⊗ Module.Dual ℝ BBoson`, and +`DerivAlgebraReal` is a symmetric algebra on `Module.Dual ℝ Lorentz.CoVector`, so — since the +span of eigenvectors is a subalgebra and `repLorentzGroup_apply_ι` and `repLorentzGroup_apply_mul` +are available there — it suffices to give a light-cone eigenbasis of the four-dimensional spaces +`Module.Dual ℝ Lorentz.CoVector` and `Module.Dual ℝ BBoson`, and of the two-dimensional spinor +duals on the fermionic side. No covariance of `jetDeriv` is needed. + +The boost weight is bounded by the mass weight: a generator of mass weight `w` carries at most +`w` units of boost weight. A bosonic generator `∂_s B_μ` of mass weight `2(1 + |s|)` has +`1 + |s|` vector indices, each contributing at most `±2`; a fermionic generator `∂_s ψ_α` of +mass weight `3 + 2|s|` has `|s|` vector indices and one spinor index, contributing at most +`2|s| + 1`. So `|boost weight| ≤ mass weight` throughout. + +The map `boostAvgZ` is this projection wherever the boost weights that occur are among +`0, ±2, ±4, ±6`: `boostAvgZ` acts on a weight-`k` element by the value at `k` of the +interpolating polynomial `boostAvgZWeight`, which is one at `k = 0` and vanishes at +`k = ±2, ±4, ±6`. On the covariant subalgebra in mass weight eight or less those are the only +weights that occur, so there it is exactly the projection onto boost weight zero. Note that this +is a statement about the *covariant* subalgebra, not about mass weight eight alone: the +mass-weight-eight element `∂_ρ ∂_σ ∂_τ B_μ` reaches boost weight `8`, and `boostAvgZWeight 8` is +not zero. + +## i. Overview + +The weight submodules are defined by the eigenvector condition, so the multiplicative structure +is immediate: weights add under multiplication and the unit has weight zero. Relating them to +`boostAvgZ` is then a single computation, since `boostAvgZ` is a linear combination of boosts +and each acts on a weight-`k` element by a power of `t`. + +## ii. Key results + +- `JetAlgebra.boostWeightSubmodule` : the elements of a given boost weight. +- `JetAlgebra.mul_mem_boostWeightSubmodule` : boost weights add under multiplication. +- `JetAlgebra.mem_boostWeightSubmodule_zero_of_isInvariant` : an invariant has boost weight zero. +- `JetAlgebra.boostAvgZ_apply_of_mem` : `boostAvgZ` acts on a weight-`k` element by + `boostAvgZWeight k`. +- `JetAlgebra.boostAvgZ_apply_of_mem_zero` and `JetAlgebra.boostAvgZ_apply_eq_zero_of_mem` : + it is the identity on boost weight zero and annihilates weights `±2, ±4, ±6`. +- `JetAlgebra.boostWeightSubmodule_iSupIndep` : the weight spaces are independent. +- `JetAlgebra.boostWeightSubalgebra` : the subalgebra they span. +- `JetAlgebra.boostWeightSubalgebra_eq_top_of_forall_ofGenerator` and + `JetAlgebra.boostWeightSubmodule_isInternal_iff` : the reduction of the grading to the + generators. + +## iii. Table of contents + +- A. The boost-weight submodules +- B. Homogeneous elements +- B'. Independence of the weight submodules +- B''. The span of the homogeneous elements is a subalgebra +- C. The interpolating polynomial of `boostAvgZ` +- D. `boostAvgZ` is the projection onto boost weight zero + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +namespace JetAlgebra + +/-! + +## A. The boost-weight submodules + +-/ + +/-- The submodule of elements of boost weight `k`: those scaling by `t ^ k` under the `z`-boost + with parameter `t`. -/ +def boostWeightSubmodule (k : ℤ) : Submodule ℂ JetAlgebra where + carrier := {x | ∀ (t : ℝ) (ht : t ≠ 0), + repLorentzGroup (boostZel t ht) x = (((t : ℝ) : ℂ) ^ k) • x} + add_mem' {a b} ha hb := fun t ht => by rw [map_add, ha t ht, hb t ht, smul_add] + zero_mem' := fun t ht => by rw [map_zero, smul_zero] + smul_mem' c x hx := fun t ht => by rw [map_smul, hx t ht, smul_comm] + +@[simp] +lemma mem_boostWeightSubmodule {k : ℤ} {x : JetAlgebra} : + x ∈ boostWeightSubmodule k ↔ ∀ (t : ℝ) (ht : t ≠ 0), + repLorentzGroup (boostZel t ht) x = (((t : ℝ) : ℂ) ^ k) • x := Iff.rfl + +/-- The unit has boost weight zero. -/ +lemma one_mem_boostWeightSubmodule : (1 : JetAlgebra) ∈ boostWeightSubmodule 0 := + fun t _ => by rw [repLorentzGroup_apply_one, zpow_zero, one_smul] + +/-- Boost weights add under multiplication. -/ +lemma mul_mem_boostWeightSubmodule {k l : ℤ} {x y : JetAlgebra} + (hx : x ∈ boostWeightSubmodule k) (hy : y ∈ boostWeightSubmodule l) : + x * y ∈ boostWeightSubmodule (k + l) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_apply_mul, hx t ht, hy t ht, smul_mul_smul_comm, zpow_add₀ ht'] + +instance : SetLike.GradedMonoid boostWeightSubmodule where + one_mem := one_mem_boostWeightSubmodule + mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy + +/-- A Lorentz-invariant element has boost weight zero. -/ +lemma mem_boostWeightSubmodule_zero_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : + x ∈ boostWeightSubmodule 0 := + fun t ht => by rw [hx.2 (boostZel t ht), zpow_zero, one_smul] + +/-! + +## B. Homogeneous elements + +The coordinate components of a field strength are not boost eigenvectors; the light-cone +combinations are. The two components with both indices transverse to the boost — `F_{xy}` — and +the one along it — `F_{0z}` — are invariant. + +-/ + +/-- The light-cone combination `F_{0x} - F_{zx}` has boost weight `2`. -/ +lemma fieldStrengthDeriv_lightCone_mem_two : + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule 2 := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, Complex.ofReal_zero, Complex.ofReal_one, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- The light-cone combination `F_{0x} + F_{zx}` has boost weight `-2`. -/ +lemma fieldStrengthDeriv_lightCone_mem_neg_two : + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule (-2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, Complex.ofReal_zero, Complex.ofReal_one, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- The transverse component `F_{xy}` has boost weight zero. -/ +lemma fieldStrengthDeriv_transverse_mem_zero : + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ boostWeightSubmodule 0 := by + intro t ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, zero_mul, mul_one, one_mul, Complex.ofReal_zero, Complex.ofReal_one, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> norm_num + +/-- The zeroth-order lepton coordinate `ψ_0` has boost weight `-1`. -/ +lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ boostWeightSubmodule (-1) := by + intro t ht + rw [repLorentzGroup_Dψ_nil, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, add_zero, + Complex.conj_ofReal] + rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] + +/-- The zeroth-order lepton coordinate `ψ_1` has boost weight `1`. -/ +lemma Dψ_nil_one_mem_one : Dψ [] 1 ∈ boostWeightSubmodule 1 := by + intro t ht + rw [repLorentzGroup_Dψ_nil, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, zero_add, + Complex.conj_ofReal] + rw [zpow_one] + +/-- The zeroth-order conjugate lepton coordinate `ψ̄_0` has boost weight `-1`. -/ +lemma Dbarψ_nil_zero_mem_neg_one : Dbarψ [] 0 ∈ boostWeightSubmodule (-1) := by + intro t ht + rw [repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, zero_smul, add_zero] + rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] + +/-- The zeroth-order conjugate lepton coordinate `ψ̄_1` has boost weight `1`. -/ +lemma Dbarψ_nil_one_mem_one : Dbarψ [] 1 ∈ boostWeightSubmodule 1 := by + intro t ht + rw [repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, zero_smul, zero_add] + rw [zpow_one] + +/-- The gauge potential in the light-cone direction, `B_0 - B_z`, has boost weight `2`. -/ +lemma B_lightCone_mem_two : + [JetGenerators.dB {} (Sum.inl 0)]ₐ - [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ + boostWeightSubmodule 2 := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_B, repLorentzGroup_B] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, Complex.ofReal_one, + zero_smul, add_zero, zero_add, one_smul] + push_cast + match_scalars <;> (field_simp; ring) + +/-- The gauge potential in the other light-cone direction has boost weight `-2`. -/ +lemma B_lightCone_mem_neg_two : + [JetGenerators.dB {} (Sum.inl 0)]ₐ + [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ + boostWeightSubmodule (-2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_B, repLorentzGroup_B] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, Complex.ofReal_one, + zero_smul, add_zero, zero_add, one_smul] + push_cast + match_scalars <;> (field_simp; ring) + +/-! + +## B'. Independence of the weight submodules + +The weight submodules sit inside the eigenspaces of a single boost, `ρ(boostZel 2)`, at the +pairwise distinct eigenvalues `2 ^ k`. Eigenspaces at distinct eigenvalues are independent, so +the family is independent: an element has at most one decomposition into homogeneous parts. +This is one of the two halves of `DirectSum.IsInternal`; the other, that the weight submodules +span, is not proved here — see the module docstring. + +-/ + +/-- The weight submodule of weight `k` sits inside the `2 ^ k` eigenspace of the boost at + parameter two. -/ +lemma boostWeightSubmodule_le_eigenspace (k : ℤ) : + boostWeightSubmodule k ≤ + Module.End.eigenspace (repLorentzGroup (boostZel 2 two_ne_zero)) ((2 : ℂ) ^ k) := by + intro x hx + rw [Module.End.mem_eigenspace_iff] + have h := hx 2 two_ne_zero + norm_num at h ⊢ + exact h + +private lemma zpow_two_injective : Function.Injective (fun k : ℤ => ((2 : ℂ) ^ k)) := by + have hcast : ∀ k : ℤ, ((2 : ℂ) ^ k) = (((2 : ℝ) ^ k : ℝ) : ℂ) := by + intro k + rw [Complex.ofReal_zpow] + norm_num + intro a b hab + simp only [hcast] at hab + exact zpow_right_injective₀ (by norm_num) (by norm_num) (Complex.ofReal_injective hab) + +/-- The boost-weight submodules are independent: a decomposition into homogeneous parts is + unique when it exists. -/ +lemma boostWeightSubmodule_iSupIndep : iSupIndep boostWeightSubmodule := + ((Module.End.eigenspaces_iSupIndep + (repLorentzGroup (boostZel 2 two_ne_zero) : Module.End ℂ JetAlgebra)).comp + zpow_two_injective).mono boostWeightSubmodule_le_eigenspace + +/-! + +## B''. The span of the homogeneous elements is a subalgebra + +-/ + +/-- The span of the homogeneous elements contains one. -/ +lemma one_mem_iSup_boostWeightSubmodule : + (1 : JetAlgebra) ∈ ⨆ k, boostWeightSubmodule k := + Submodule.mem_iSup_of_mem 0 one_mem_boostWeightSubmodule + +/-- The span of the homogeneous elements is closed under multiplication. -/ +lemma mul_mem_iSup_boostWeightSubmodule {x y : JetAlgebra} + (hx : x ∈ ⨆ k, boostWeightSubmodule k) (hy : y ∈ ⨆ k, boostWeightSubmodule k) : + x * y ∈ ⨆ k, boostWeightSubmodule k := by + induction hx using Submodule.iSup_induction' with + | mem k a ha => + induction hy using Submodule.iSup_induction' with + | mem l b hb => + exact Submodule.mem_iSup_of_mem (k + l) (mul_mem_boostWeightSubmodule ha hb) + | zero => rw [mul_zero]; exact Submodule.zero_mem _ + | add b c _ _ ihb ihc => rw [mul_add]; exact Submodule.add_mem _ ihb ihc + | zero => rw [zero_mul]; exact Submodule.zero_mem _ + | add a b _ _ iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb + +/-- The homogeneous elements span a subalgebra of the jet algebra. -/ +noncomputable def boostWeightSubalgebra : Subalgebra ℂ JetAlgebra := + Submodule.toSubalgebra (⨆ k, boostWeightSubmodule k) one_mem_iSup_boostWeightSubmodule + fun _ _ hx hy => mul_mem_iSup_boostWeightSubmodule hx hy + +@[simp] +lemma mem_boostWeightSubalgebra {x : JetAlgebra} : + x ∈ boostWeightSubalgebra ↔ x ∈ ⨆ k, boostWeightSubmodule k := Iff.rfl + +/-- The homogeneous span contains the whole bosonic factor once it contains the generators. -/ +private lemma inclB_mem_boostWeightSubalgebra + (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : inclB a ∈ boostWeightSubalgebra := by + have hone : ∀ c : BBoson.JetAlgebra, + inclB ((1 : ℂ) ⊗ₜ[ℝ] c) ∈ boostWeightSubalgebra := by + intro c + induction c using SymmetricAlgebra.induction with + | algebraMap r => + rw [show ((1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ BBoson.JetAlgebra r) : + ℂ ⊗[ℝ] BBoson.JetAlgebra) = + algebraMap ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) (algebraMap ℝ ℂ r) from by + rw [Algebra.algebraMap_eq_smul_one, Algebra.algebraMap_eq_smul_one, + TensorProduct.tmul_smul, TensorProduct.smul_tmul'] + rfl, AlgHom.commutes] + exact Subalgebra.algebraMap_mem _ _ + | ι v => + have hv : v ∈ Submodule.span ℝ (Set.range BBoson.JetComponentSpace.basis) := by + rw [BBoson.JetComponentSpace.basis.span_eq] + trivial + induction hv using Submodule.span_induction with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + obtain ⟨s, μ⟩ := j + exact h (JetGenerators.dB s μ) + | zero => simpa using Subalgebra.zero_mem _ + | add u w _ _ ihu ihw => + simp only [map_add, TensorProduct.tmul_add] + exact Subalgebra.add_mem _ ihu ihw + | smul r u _ ihu => + rw [show ((1 : ℂ) ⊗ₜ[ℝ] + (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace (r • u)) : + ℂ ⊗[ℝ] BBoson.JetAlgebra) = + (algebraMap ℝ ℂ r) • ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace u) from by + rw [map_smul, TensorProduct.tmul_smul, ← algebraMap_smul ℂ r], map_smul] + exact Subalgebra.smul_mem _ ihu _ + | mul u v ihu ihv => + rw [show ((1 : ℂ) ⊗ₜ[ℝ] (u * v) : ℂ ⊗[ℝ] BBoson.JetAlgebra) = + ((1 : ℂ) ⊗ₜ[ℝ] u) * ((1 : ℂ) ⊗ₜ[ℝ] v) from by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul], map_mul] + exact Subalgebra.mul_mem _ ihu ihv + | add u v ihu ihv => + simp only [TensorProduct.tmul_add, map_add] + exact Subalgebra.add_mem _ ihu ihv + induction a using TensorProduct.induction_on with + | zero => simpa using Subalgebra.zero_mem _ + | add u v hu hv => rw [map_add]; exact Subalgebra.add_mem _ hu hv + | tmul z c => + rw [show (z ⊗ₜ[ℝ] c : ℂ ⊗[ℝ] BBoson.JetAlgebra) = z • ((1 : ℂ) ⊗ₜ[ℝ] c) from by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one], map_smul] + exact Subalgebra.smul_mem _ (hone c) _ + +/-- The homogeneous span contains the whole fermionic factor once it contains the generators. -/ +private lemma inclL_mem_boostWeightSubalgebra + (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra) + (b : LeptonSinglet.JetAlgebra) : inclL b ∈ boostWeightSubalgebra := by + have hι : ∀ m : LeptonSinglet.JetComponentSpace, + inclL (ExteriorAlgebra.ι ℂ m) ∈ boostWeightSubalgebra := by + intro m + have hm : m ∈ Submodule.span ℂ (Set.range LeptonSinglet.JetComponentSpace.basis) := by + rw [LeptonSinglet.JetComponentSpace.basis.span_eq] + trivial + induction hm using Submodule.span_induction with + | mem y hy => + obtain ⟨j, rfl⟩ := hy + cases j with + | dψ s α => exact h (JetGenerators.dψ s α) + | dbarψ s α => exact h (JetGenerators.dbarψ s α) + | zero => simpa using Subalgebra.zero_mem _ + | add u v _ _ ihu ihv => + simp only [map_add] + exact Subalgebra.add_mem _ ihu ihv + | smul c u _ ihu => + simp only [map_smul] + exact Subalgebra.smul_mem _ ihu _ + induction b using ExteriorAlgebra.induction with + | algebraMap r => rw [AlgHom.commutes]; exact Subalgebra.algebraMap_mem _ _ + | ι m => exact hι m + | mul u v ihu ihv => rw [map_mul]; exact Subalgebra.mul_mem _ ihu ihv + | add u v ihu ihv => rw [map_add]; exact Subalgebra.add_mem _ ihu ihv + +/-- Once every generator is a finite sum of boost eigenvectors, so is every element: the + homogeneous elements then span the whole jet algebra. -/ +theorem boostWeightSubalgebra_eq_top_of_forall_ofGenerator + (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra) : boostWeightSubalgebra = ⊤ := by + refine Algebra.eq_top_iff.mpr fun x => ?_ + induction x using JetAlgebra.induction_on with + | zero => exact Subalgebra.zero_mem _ + | add u v hu hv => exact Subalgebra.add_mem _ hu hv + | tmul a b => + rw [tmul_eq_inclB_mul_inclL] + exact Subalgebra.mul_mem _ (inclB_mem_boostWeightSubalgebra h a) + (inclL_mem_boostWeightSubalgebra h b) + +/-- The decomposition of the jet algebra into boost-weight spaces is internal exactly when the + homogeneous elements span. Independence always holds, so this isolates the one remaining + obligation: that every element is a finite sum of boost eigenvectors. -/ +theorem boostWeightSubmodule_isInternal_iff : + DirectSum.IsInternal boostWeightSubmodule ↔ (⨆ k, boostWeightSubmodule k) = ⊤ := by + rw [DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top] + exact ⟨And.right, fun h => ⟨boostWeightSubmodule_iSupIndep, h⟩⟩ + +/-- The homogeneous elements span a subalgebra which the boost weights grade internally: the + decomposition into weights is defined on it and is unique. -/ +theorem boostWeightSubmodule_isInternal_of_top + (h : (⨆ k, boostWeightSubmodule k) = ⊤) : DirectSum.IsInternal boostWeightSubmodule := + boostWeightSubmodule_isInternal_iff.mpr h + +/-! + +## C. The interpolating polynomial of `boostAvgZ` + +`boostAvgZ` is a fixed rational combination of the identity and the boosts at `t = 2, 3, 4` +paired with their inverses, so on an element of boost weight `k` it acts by the scalar obtained +by substituting `t ^ k + t ^ (-k)` for each pair. The weights were chosen to make that scalar +one at `k = 0` and zero at `k = 2, 4, 6`; being a function of `t ^ k + t ^ (-k)` it is +automatically even in `k`, so it vanishes at `k = -2, -4, -6` as well. + +-/ + +/-- The scalar by which `boostAvgZ` acts on an element of boost weight `k`. -/ +noncomputable def boostAvgZWeight (k : ℤ) : ℂ := + (65359/21600 : ℂ) + + (-133264/99225 : ℂ) * ((2 : ℂ) ^ k + (2 : ℂ) ^ (-k)) + + (384183/1019200 : ℂ) * ((3 : ℂ) ^ k + (3 : ℂ) ^ (-k)) + + (-60416/1289925 : ℂ) * ((4 : ℂ) ^ k + (4 : ℂ) ^ (-k)) + +/-- The interpolating scalar is even in the weight. -/ +lemma boostAvgZWeight_neg (k : ℤ) : boostAvgZWeight (-k) = boostAvgZWeight k := by + simp only [boostAvgZWeight, neg_neg] + ring + +@[simp] lemma boostAvgZWeight_zero : boostAvgZWeight 0 = 1 := by norm_num [boostAvgZWeight] +@[simp] lemma boostAvgZWeight_two : boostAvgZWeight 2 = 0 := by norm_num [boostAvgZWeight] +@[simp] lemma boostAvgZWeight_four : boostAvgZWeight 4 = 0 := by norm_num [boostAvgZWeight] +@[simp] lemma boostAvgZWeight_six : boostAvgZWeight 6 = 0 := by norm_num [boostAvgZWeight] + +/-- The interpolating scalar does *not* vanish at weight eight. This is why `boostAvgZ` is the + projection only where the boost weights are among `0, ±2, ±4, ±6` — on the covariant + subalgebra in mass weight eight — and not on all of mass weight eight, which contains the + weight-eight element `∂_ρ ∂_σ ∂_τ B_μ`. -/ +lemma boostAvgZWeight_eight_ne_zero : boostAvgZWeight 8 ≠ 0 := by + norm_num [boostAvgZWeight] + +@[simp] lemma boostAvgZWeight_neg_two : boostAvgZWeight (-2) = 0 := by + rw [boostAvgZWeight_neg, boostAvgZWeight_two] + +@[simp] lemma boostAvgZWeight_neg_four : boostAvgZWeight (-4) = 0 := by + rw [boostAvgZWeight_neg, boostAvgZWeight_four] + +@[simp] lemma boostAvgZWeight_neg_six : boostAvgZWeight (-6) = 0 := by + rw [boostAvgZWeight_neg, boostAvgZWeight_six] + +/-! + +## D. `boostAvgZ` is the projection onto boost weight zero + +-/ + +/-- `boostAvgZ` acts on an element of boost weight `k` by the scalar `boostAvgZWeight k`. -/ +lemma boostAvgZ_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule k) : + boostAvgZ x = boostAvgZWeight k • x := by + have hinv : ∀ (t : ℝ) (ht : t ≠ 0), + repLorentzGroup ((boostZel t ht)⁻¹) x = ((((t : ℝ) : ℂ))⁻¹ ^ k) • x := by + intro t ht + rw [boostZel_inv, hx t⁻¹ (inv_ne_zero ht), Complex.ofReal_inv] + simp only [boostAvgZ, LinearMap.add_apply, LinearMap.smul_apply, LinearMap.id_apply, + hx 2 (by norm_num), hx 3 (by norm_num), hx 4 (by norm_num), + hinv 2 (by norm_num), hinv 3 (by norm_num), hinv 4 (by norm_num), + boostAvgZWeight] + push_cast + match_scalars + simp only [one_div, _root_.inv_zpow, ← _root_.zpow_neg] + ring + +/-- On boost weight zero `boostAvgZ` is the identity. -/ +lemma boostAvgZ_apply_of_mem_zero {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 0) : + boostAvgZ x = x := by + rw [boostAvgZ_apply_of_mem hx, boostAvgZWeight_zero, one_smul] + +/-- `boostAvgZ` annihilates the boost weights `±2, ±4, ±6`. -/ +lemma boostAvgZ_apply_eq_zero_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule k) + (hk : k = 2 ∨ k = 4 ∨ k = 6 ∨ k = -2 ∨ k = -4 ∨ k = -6) : boostAvgZ x = 0 := by + rw [boostAvgZ_apply_of_mem hx] + rcases hk with rfl | rfl | rfl | rfl | rfl | rfl <;> simp + +/-- `boostAvgZ` fixes every Lorentz-invariant element, as the projection onto boost weight zero + must. -/ +lemma boostAvgZ_apply_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : boostAvgZ x = x := + boostAvgZ_apply_of_mem_zero (mem_boostWeightSubmodule_zero_of_isInvariant hx) + +end JetAlgebra + +end LeptonGaugeSector + +end From 0961f509a1b2ef6abdb88aa82bb46e889c77aec3 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 10 Aug 2026 16:57:07 +0100 Subject: [PATCH 122/254] feat: Show BoostWeight is a graded algebra Co-Authored-By: Claude --- .../JetAlgebra/Grading/BoostWeight.lean | 545 +++++++++++++++++- 1 file changed, 524 insertions(+), 21 deletions(-) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index 895b98373..bed369543 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -26,23 +26,18 @@ basis. With this grading we can define the subspace of boost weight zero. Any invariant under the Lorentz group lies in it, since a boost fixes an invariant. -*How far the grading is established.* Of the two halves of `DirectSum.IsInternal`, independence -is proved — `boostWeightSubmodule_iSupIndep`, from the weight spaces sitting inside the -eigenspaces of a single boost at the distinct eigenvalues `2 ^ k`. Exhaustiveness is reduced to -a single statement: `boostWeightSubalgebra_eq_top_of_forall_ofGenerator` says the homogeneous -elements span everything as soon as each *generator* `[j]ₐ` is a finite sum of boost -eigenvectors, and `boostWeightSubmodule_isInternal_iff` turns spanning into `IsInternal`. So the -whole grading rests on - - `∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra`, - -which is not proved here. The route is to descend to the component spaces, where the boost acts -linearly: `BBoson.JetComponentSpace` is `DerivAlgebraReal ⊗ Module.Dual ℝ BBoson`, and -`DerivAlgebraReal` is a symmetric algebra on `Module.Dual ℝ Lorentz.CoVector`, so — since the -span of eigenvectors is a subalgebra and `repLorentzGroup_apply_ι` and `repLorentzGroup_apply_mul` -are available there — it suffices to give a light-cone eigenbasis of the four-dimensional spaces -`Module.Dual ℝ Lorentz.CoVector` and `Module.Dual ℝ BBoson`, and of the two-dimensional spinor -duals on the fermionic side. No covariance of `jetDeriv` is needed. +*The grading is established.* `boostWeightSubmodule_isInternal` decomposes the jet algebra as an +internal direct sum of the weight submodules, and `GradedAlgebra boostWeightSubmodule` is an +instance. Independence comes from the weight spaces sitting inside the eigenspaces of a single +boost at the distinct eigenvalues `2 ^ k`. Exhaustiveness is the content of section O': it is +proved by descending to the component spaces, where the boost acts *linearly*. There the +statement propagates mechanically — the span of eigenvectors is closed under tensor products, +products, symmetric and exterior algebras, and base change — so the whole thing rests on +four-dimensional and two-dimensional base cases. For the spacetime-indexed spaces +`Module.Dual ℝ Lorentz.CoVector`, `Module.Dual ℂ Lorentz.CoℂModule` and `Module.Dual ℝ BBoson` +the eigenvectors are the light-cone combinations `b₀ ∓ b₃`, of weight `±2`, together with the +transverse directions, of weight `0`; on the spinor duals the boost is already diagonal, with +weights `∓1`. No covariance of `jetDeriv` is needed anywhere. The boost weight is bounded by the mass weight: a generator of mass weight `w` carries at most `w` units of boost weight. A bosonic generator `∂_s B_μ` of mass weight `2(1 + |s|)` has @@ -77,18 +72,22 @@ and each acts on a weight-`k` element by a power of `t`. it is the identity on boost weight zero and annihilates weights `±2, ±4, ±6`. - `JetAlgebra.boostWeightSubmodule_iSupIndep` : the weight spaces are independent. - `JetAlgebra.boostWeightSubalgebra` : the subalgebra they span. -- `JetAlgebra.boostWeightSubalgebra_eq_top_of_forall_ofGenerator` and - `JetAlgebra.boostWeightSubmodule_isInternal_iff` : the reduction of the grading to the - generators. +- `JetAlgebra.boostWeightSubmodule_isInternal` : the weight submodules decompose the jet + algebra as an internal direct sum, so `GradedAlgebra boostWeightSubmodule` holds. +- `JetAlgebra.BoostWeight.IsGraded` and the transport lemmas of section O : the grading + propagates along tensor products, products, symmetric and exterior algebras and base change. ## iii. Table of contents +- O. Boost weights of a general representation +- O'. The component spaces are boost-graded - A. The boost-weight submodules - B. Homogeneous elements - B'. Independence of the weight submodules - B''. The span of the homogeneous elements is a subalgebra - C. The interpolating polynomial of `boostAvgZ` - D. `boostAvgZ` is the projection onto boost weight zero +- E. The grading -/ @@ -103,6 +102,474 @@ namespace JetAlgebra /-! +## O. Boost weights of a general representation + +The descent to the component spaces is uniform, so it is carried out once here for an arbitrary +representation. The weight spaces are defined exactly as `boostWeightSubmodule` is, and +`IsGraded` says that they span. The point of the section is that `IsGraded` propagates along +every construction the jet algebra is built from: tensor products, products, symmetric algebras, +exterior algebras and base change. The recursion bottoms out at a finite-dimensional space with +an eigenbasis, where the light-cone combinations do the work. + +-/ + +namespace BoostWeight + +variable {K : Type*} [Field K] [Algebra ℝ K] +variable {M N V : Type*} [AddCommGroup M] [Module K M] [AddCommGroup N] [Module K N] + [AddCommGroup V] [Module K V] + +private lemma algebraMap_ne_zero {t : ℝ} (ht : t ≠ 0) : (algebraMap ℝ K t) ≠ 0 := + fun h => ht ((algebraMap ℝ K).injective (by simpa using h)) + +/-- The weight-`w` space of a representation: the vectors scaling by `t ^ w` under the + `z`-boost at parameter `t`. -/ +def space (rep : Representation K SL(2,ℂ) M) (w : ℤ) : Submodule K M where + carrier := {x | ∀ (t : ℝ) (ht : t ≠ 0), + rep (boostZel t ht) x = (algebraMap ℝ K t) ^ w • x} + add_mem' {a b} ha hb := fun t ht => by rw [map_add, ha t ht, hb t ht, smul_add] + zero_mem' := fun t ht => by rw [map_zero, smul_zero] + smul_mem' c x hx := fun t ht => by rw [map_smul, hx t ht, smul_comm] + +lemma mem_space {rep : Representation K SL(2,ℂ) M} {w : ℤ} {x : M} : + x ∈ space rep w ↔ ∀ (t : ℝ) (ht : t ≠ 0), + rep (boostZel t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl + +/-- The span of all the weight spaces. -/ +def weightSpan (rep : Representation K SL(2,ℂ) M) : Submodule K M := ⨆ w, space rep w + +/-- A representation is boost-graded when its weight spaces span. -/ +def IsGraded (rep : Representation K SL(2,ℂ) M) : Prop := weightSpan rep = ⊤ + +lemma mem_weightSpan_of_mem_space {rep : Representation K SL(2,ℂ) M} {w : ℤ} {x : M} + (h : x ∈ space rep w) : x ∈ weightSpan rep := + Submodule.mem_iSup_of_mem w h + +lemma mem_weightSpan_of_isGraded {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep) (x : M) : + x ∈ weightSpan rep := by rw [IsGraded] at h; rw [h]; trivial + +lemma isGraded_iff_forall_mem {rep : Representation K SL(2,ℂ) M} : + IsGraded rep ↔ ∀ x, x ∈ weightSpan rep := + ⟨mem_weightSpan_of_isGraded, fun h => eq_top_iff.mpr fun x _ => h x⟩ + +/-- A representation with a spanning family of vectors in the weight span is graded. -/ +lemma isGraded_of_span {rep : Representation K SL(2,ℂ) M} {S : Set M} + (hS : Submodule.span K S = ⊤) (h : ∀ x ∈ S, x ∈ weightSpan rep) : IsGraded rep := + eq_top_iff.mpr (hS ▸ Submodule.span_le.mpr h) + +/-- A representation with a basis of vectors lying in the weight span is graded. -/ +lemma isGraded_of_basis {ι : Type*} {rep : Representation K SL(2,ℂ) M} (b : Module.Basis ι K M) + (h : ∀ i, b i ∈ weightSpan rep) : IsGraded rep := + isGraded_of_span b.span_eq (by rintro _ ⟨i, rfl⟩; exact h i) + +/-! + +### Tensor products + +-/ + +lemma tmul_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + {a b : ℤ} {x : M} {y : N} (hx : x ∈ space rep a) (hy : y ∈ space rep₂ b) : + x ⊗ₜ[K] y ∈ space (rep.tprod rep₂) (a + b) := by + intro t ht + show (TensorProduct.map _ _) _ = _ + rw [TensorProduct.map_tmul, hx t ht, hy t ht] + simp only [TensorProduct.tmul_smul, TensorProduct.smul_tmul', smul_smul] + rw [← zpow_add₀ (algebraMap_ne_zero (K := K) ht), add_comm b a] + +lemma isGraded_tprod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + (h₁ : IsGraded rep) (h₂ : IsGraded rep₂) : IsGraded (rep.tprod rep₂) := by + refine isGraded_iff_forall_mem.mpr fun z => ?_ + induction z using TensorProduct.induction_on with + | zero => exact Submodule.zero_mem _ + | add u v hu hv => exact Submodule.add_mem _ hu hv + | tmul x y => + have hx := mem_weightSpan_of_isGraded h₁ x + have hy := mem_weightSpan_of_isGraded h₂ y + induction hx using Submodule.iSup_induction' with + | mem a x' hx' => + induction hy using Submodule.iSup_induction' with + | mem b y' hy' => exact mem_weightSpan_of_mem_space (tmul_mem_space hx' hy') + | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv + | zero => rw [TensorProduct.zero_tmul]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ ihu ihv + + +/-! + +### Products + +-/ + +lemma inl_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + {a : ℤ} {x : M} (hx : x ∈ space rep a) : + ((x, 0) : M × N) ∈ space (rep.prod rep₂) a := by + intro t ht + show ((rep _ x, rep₂ _ 0) : M × N) = _ + rw [map_zero, hx t ht, Prod.smul_mk, smul_zero] + +lemma inr_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + {a : ℤ} {y : N} (hy : y ∈ space rep₂ a) : + ((0, y) : M × N) ∈ space (rep.prod rep₂) a := by + intro t ht + show ((rep _ 0, rep₂ _ y) : M × N) = _ + rw [map_zero, hy t ht, Prod.smul_mk, smul_zero] + +lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + (h₁ : IsGraded rep) (h₂ : IsGraded rep₂) : IsGraded (rep.prod rep₂) := by + have hleft : ∀ x : M, ((x, (0 : N))) ∈ weightSpan (rep.prod rep₂) := by + intro x + have hx := mem_weightSpan_of_isGraded h₁ x + induction hx using Submodule.iSup_induction' with + | mem a u hu => exact mem_weightSpan_of_mem_space (inl_mem_space hu) + | zero => exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => + rw [show ((u + v, (0 : N))) = ((u, (0 : N))) + ((v, (0 : N))) from by ext <;> simp] + exact Submodule.add_mem _ ihu ihv + have hright : ∀ y : N, (((0 : M), y)) ∈ weightSpan (rep.prod rep₂) := by + intro y + have hy := mem_weightSpan_of_isGraded h₂ y + induction hy using Submodule.iSup_induction' with + | mem a u hu => exact mem_weightSpan_of_mem_space (inr_mem_space hu) + | zero => exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => + rw [show (((0 : M), u + v)) = (((0 : M), u)) + (((0 : M), v)) from by ext <;> simp] + exact Submodule.add_mem _ ihu ihv + refine isGraded_iff_forall_mem.mpr fun z => ?_ + rw [show z = ((z.1, (0 : N))) + (((0 : M), z.2)) from by ext <;> simp] + exact Submodule.add_mem _ (hleft z.1) (hright z.2) + +/-! + +### Algebras generated in degree one + +-/ + +variable {A : Type*} [Ring A] [Algebra K A] + +lemma one_mem_space {rep : Representation K SL(2,ℂ) A} (hone : ∀ Λ, rep Λ 1 = 1) : + (1 : A) ∈ space rep 0 := fun t _ => by rw [hone, zpow_zero, one_smul] + +lemma mul_mem_space {rep : Representation K SL(2,ℂ) A} + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) + {a b : ℤ} {x y : A} (hx : x ∈ space rep a) (hy : y ∈ space rep b) : + x * y ∈ space rep (a + b) := by + intro t ht + rw [hmul, hx t ht, hy t ht, smul_mul_smul_comm, + zpow_add₀ (algebraMap_ne_zero (K := K) ht)] + +lemma mul_mem_weightSpan {rep : Representation K SL(2,ℂ) A} + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) + {x y : A} (hx : x ∈ weightSpan rep) (hy : y ∈ weightSpan rep) : + x * y ∈ weightSpan rep := by + induction hx using Submodule.iSup_induction' with + | mem a u hu => + induction hy using Submodule.iSup_induction' with + | mem b v hv => exact mem_weightSpan_of_mem_space (mul_mem_space hmul hu hv) + | zero => rw [mul_zero]; exact Submodule.zero_mem _ + | add v w _ _ ihv ihw => rw [mul_add]; exact Submodule.add_mem _ ihv ihw + | zero => rw [zero_mul]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [add_mul]; exact Submodule.add_mem _ ihu ihv + +lemma algebraMap_mem_weightSpan {rep : Representation K SL(2,ℂ) A} + (hone : ∀ Λ, rep Λ 1 = 1) (r : K) : algebraMap K A r ∈ weightSpan rep := by + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ (mem_weightSpan_of_mem_space (one_mem_space hone)) + +/-- A symmetric algebra is boost-graded as soon as its degree-one part is. -/ +lemma isGraded_symmetricAlgebra {V : Type*} [AddCommGroup V] [Module K V] + {repV : Representation K SL(2,ℂ) V} + {repA : Representation K SL(2,ℂ) (SymmetricAlgebra K V)} + (hone : ∀ Λ, repA Λ 1 = 1) + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : SymmetricAlgebra K V), + repA Λ (x * y) = repA Λ x * repA Λ y) + (hι : ∀ (Λ : SL(2,ℂ)) (x : V), + repA Λ (SymmetricAlgebra.ι K V x) = SymmetricAlgebra.ι K V (repV Λ x)) + (hV : IsGraded repV) : IsGraded repA := by + refine isGraded_iff_forall_mem.mpr fun x => ?_ + induction x using SymmetricAlgebra.induction with + | algebraMap r => exact algebraMap_mem_weightSpan hone r + | ι v => + have hv := mem_weightSpan_of_isGraded hV v + induction hv using Submodule.iSup_induction' with + | mem a u hu => + refine mem_weightSpan_of_mem_space (w := a) fun t ht => ?_ + rw [hι, hu t ht, map_smul] + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv + | mul u v ihu ihv => exact mul_mem_weightSpan hmul ihu ihv + | add u v ihu ihv => exact Submodule.add_mem _ ihu ihv + +/-- An exterior algebra is boost-graded as soon as its degree-one part is. -/ +lemma isGraded_exteriorAlgebra {V : Type*} [AddCommGroup V] [Module K V] + {repV : Representation K SL(2,ℂ) V} + {repA : Representation K SL(2,ℂ) (ExteriorAlgebra K V)} + (hone : ∀ Λ, repA Λ 1 = 1) + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : ExteriorAlgebra K V), + repA Λ (x * y) = repA Λ x * repA Λ y) + (hι : ∀ (Λ : SL(2,ℂ)) (x : V), + repA Λ (ExteriorAlgebra.ι K x) = ExteriorAlgebra.ι K (repV Λ x)) + (hV : IsGraded repV) : IsGraded repA := by + refine isGraded_iff_forall_mem.mpr fun x => ?_ + induction x using ExteriorAlgebra.induction with + | algebraMap r => exact algebraMap_mem_weightSpan hone r + | ι v => + have hv := mem_weightSpan_of_isGraded hV v + induction hv using Submodule.iSup_induction' with + | mem a u hu => + refine mem_weightSpan_of_mem_space (w := a) fun t ht => ?_ + rw [hι, hu t ht, map_smul] + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv + | mul u v ihu ihv => exact mul_mem_weightSpan hmul ihu ihv + | add u v ihu ihv => exact Submodule.add_mem _ ihu ihv + +/-! + +### The light-cone eigenbasis of a spacetime-indexed space + +-/ + +/-- A space with a basis indexed by spacetime directions transforming by the columns of the + Lorentz matrix is boost-graded: the light-cone combinations `b₀ ∓ b₃` are eigenvectors of + weight `±2` and the transverse directions are invariant. -/ +lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} + (b : Module.Basis (Fin 1 ⊕ Fin 3) K M) + (h : ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), rep Λ (b μ) = + ∑ j, algebraMap ℝ K ((Lorentz.SL2C.toLorentzGroup Λ).1 j μ) • b j) : + IsGraded rep := by + haveI : CharZero K := charZero_of_injective_algebraMap (algebraMap ℝ K).injective + have key : ∀ (t : ℝ) (ht : t ≠ 0) (μ : Fin 1 ⊕ Fin 3), + rep (boostZel t ht) (b μ) = + ∑ j, algebraMap ℝ K (boostMatZ t j μ) • b j := by + intro t ht μ + rw [h] + exact Finset.sum_congr rfl fun j _ => by rw [toLorentzGroup_boostZel] + have hplus : b (Sum.inl 0) - b (Sum.inr 2) ∈ space rep 2 := by + intro t ht + have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht + rw [map_sub, key t ht, key t ht] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, + map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, map_div₀, map_sub, + map_add, map_pow, map_inv₀, map_ofNat, map_neg] + match_scalars <;> (field_simp; try ring_nf; try norm_num) + have hminus : b (Sum.inl 0) + b (Sum.inr 2) ∈ space rep (-2) := by + intro t ht + have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht + rw [map_add, key t ht, key t ht] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, + map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, map_div₀, map_sub, + map_add, map_pow, map_inv₀, map_ofNat, map_neg] + match_scalars <;> (field_simp; try ring_nf; try norm_num) + have htr : ∀ i : Fin 3, i = 0 ∨ i = 1 → b (Sum.inr i) ∈ space rep 0 := by + rintro i (rfl | rfl) <;> + · intro t ht + rw [key t ht] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, + map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, zpow_zero] + refine isGraded_of_basis b fun μ => ?_ + match μ with + | Sum.inl 0 => + rw [show b (Sum.inl 0) = (2⁻¹ : K) • ((b (Sum.inl 0) - b (Sum.inr 2)) + + (b (Sum.inl 0) + b (Sum.inr 2))) from by match_scalars <;> (field_simp; try ring)] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ + (mem_weightSpan_of_mem_space hplus) (mem_weightSpan_of_mem_space hminus)) + | Sum.inr 0 => exact mem_weightSpan_of_mem_space (htr 0 (Or.inl rfl)) + | Sum.inr 1 => exact mem_weightSpan_of_mem_space (htr 1 (Or.inr rfl)) + | Sum.inr 2 => + rw [show b (Sum.inr 2) = (2⁻¹ : K) • ((b (Sum.inl 0) + b (Sum.inr 2)) + - (b (Sum.inl 0) - b (Sum.inr 2))) from by match_scalars <;> (field_simp; try ring)] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ + (mem_weightSpan_of_mem_space hminus) (mem_weightSpan_of_mem_space hplus)) + +/-! + +### Base change from the real to the complex scalars + +-/ + +lemma isGraded_baseChange {A : Type*} [AddCommGroup A] [Module ℝ A] + {repR : Representation ℝ SL(2,ℂ) A} {repC : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] A)} + (h : ∀ (Λ : SL(2,ℂ)) (c : ℂ) (y : A), repC Λ (c ⊗ₜ[ℝ] y) = c ⊗ₜ[ℝ] repR Λ y) + (hR : IsGraded repR) : IsGraded repC := by + have htmul : ∀ (c : ℂ) (w : ℤ) (y : A), y ∈ space repR w → + (c ⊗ₜ[ℝ] y : ℂ ⊗[ℝ] A) ∈ space repC w := by + intro c w y hy t ht + rw [h, hy t ht, TensorProduct.tmul_smul, + show ((algebraMap ℝ ℝ) t) ^ w = t ^ w from by simp, + ← algebraMap_smul (R := ℝ) ℂ (t ^ w) (c ⊗ₜ[ℝ] y), map_zpow₀] + refine isGraded_iff_forall_mem.mpr fun z => ?_ + induction z using TensorProduct.induction_on with + | zero => exact Submodule.zero_mem _ + | add u v hu hv => exact Submodule.add_mem _ hu hv + | tmul c y => + have hy := mem_weightSpan_of_isGraded hR y + induction hy using Submodule.iSup_induction' with + | mem w u hu => exact mem_weightSpan_of_mem_space (htmul c w u hu) + | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv + +end BoostWeight + +/-! + +## O'. The component spaces are boost-graded + +Each layer of the jet algebra is graded once the layer below it is: the two four-dimensional +derivative and target spaces by `isGraded_of_lorentzColumns`, the spinor duals directly (the +boost is already diagonal on them), and everything above by the tensor, product, symmetric- and +exterior-algebra transports. + +-/ + +open BoostWeight in +/-- The real dual covectors — the derivative slots — are boost-graded. -/ +lemma isGraded_coVectorDual : IsGraded (Lorentz.CoVector.sl2Rep.dual) := + isGraded_of_lorentzColumns Lorentz.CoVector.basis.dualBasis fun Λ μ => by + simpa using Lorentz.CoVector.sl2Rep_dual_dualBasis Λ μ + +open BoostWeight in +/-- The complex dual covectors are boost-graded. -/ +lemma isGraded_coℂModuleDual : IsGraded (Lorentz.CoℂModule.SL2CRep.dual) := + isGraded_of_lorentzColumns Lorentz.complexCoBasis.dualBasis fun Λ μ => by + simpa using Lorentz.CoℂModule.SL2CRep_dual_dualBasis Λ μ + +open BoostWeight in +/-- The dual B-boson target space is boost-graded. -/ +lemma isGraded_bBosonDual : IsGraded (BBoson.repLorentzGroup.dual) := + isGraded_of_lorentzColumns BBoson.basis.dualBasis fun Λ μ => by + simpa using BBoson.repLorentzGroup_dual_dualBasis Λ μ + +open BoostWeight in +/-- The real algebra of derivative symbols is boost-graded. -/ +lemma isGraded_derivAlgebraReal : IsGraded (DerivAlgebraReal.repLorentzGroup) := + isGraded_symmetricAlgebra (repV := Lorentz.CoVector.sl2Rep.dual) + (fun Λ => by + show (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)) 1 = 1 + exact map_one _) + (fun Λ x y => by + show (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)) (x * y) = _ + exact map_mul _ _ _) + (fun Λ x => DerivAlgebraReal.repLorentzGroup_apply_ι Λ x) + isGraded_coVectorDual + +open BoostWeight in +/-- The complex algebra of derivative symbols is boost-graded. -/ +lemma isGraded_derivAlgebraComplex : IsGraded (DerivAlgebraComplex.repLorentzGroup) := + isGraded_symmetricAlgebra (repV := Lorentz.CoℂModule.SL2CRep.dual) + (fun Λ => DerivAlgebraComplex.repLorentzGroup_apply_one Λ) + (fun Λ x y => DerivAlgebraComplex.repLorentzGroup_apply_mul Λ x y) + (fun Λ x => DerivAlgebraComplex.repLorentzGroup_apply_ι Λ x) + isGraded_coℂModuleDual + +open BoostWeight in +/-- The B-boson jet component space is boost-graded. -/ +lemma isGraded_bBosonJetComponentSpace : + IsGraded (BBoson.JetComponentSpace.repLorentzGroup) := + isGraded_tprod isGraded_derivAlgebraReal isGraded_bBosonDual + +open BoostWeight in +/-- The B-boson jet algebra is boost-graded. -/ +lemma isGraded_bBosonJetAlgebra : IsGraded (BBoson.JetAlgebra.repLorentzGroup) := + isGraded_symmetricAlgebra (repV := BBoson.JetComponentSpace.repLorentzGroup) + (fun Λ => by + show (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ BBoson.JetComponentSpace.repLorentzGroup Λ)) 1 = 1 + exact map_one _) + (fun Λ x y => by + show (SymmetricAlgebra.lift + (SymmetricAlgebra.ι ℝ _ ∘ₗ BBoson.JetComponentSpace.repLorentzGroup Λ)) (x * y) = _ + exact map_mul _ _ _) + (fun Λ x => BBoson.JetAlgebra.repLorentzGroup_apply_ι Λ x) + isGraded_bBosonJetComponentSpace + +open BoostWeight in +/-- The complexified B-boson jet algebra is boost-graded. -/ +lemma isGraded_complexBBosonJetAlgebra : + IsGraded (BBoson.JetAlgebra.complexRepLorentzGroup) := + isGraded_baseChange (fun _ _ _ => rfl) isGraded_bBosonJetAlgebra + + +open BoostWeight in +/-- The dual charged-lepton spinors are boost-graded: the boost is already diagonal on them, + with weights `∓1`. -/ +lemma isGraded_leptonSingletDual : IsGraded (LeptonSinglet.repLorentzGroup.dual) := by + refine isGraded_of_basis LeptonSinglet.basis.dualBasis fun α => ?_ + match α with + | 0 => + refine mem_weightSpan_of_mem_space (w := -1) fun t ht => ?_ + rw [LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, add_zero, + Complex.conj_ofReal] + rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] + rfl + | 1 => + refine mem_weightSpan_of_mem_space (w := 1) fun t ht => ?_ + rw [LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, zero_add, + Complex.conj_ofReal] + rw [zpow_one] + rfl + +open BoostWeight in +/-- The dual conjugate charged-lepton spinors are boost-graded. -/ +lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.conj.dual) := by + refine isGraded_of_basis LeptonSinglet.basis.conj.dualBasis fun α => ?_ + match α with + | 0 => + refine mem_weightSpan_of_mem_space (w := -1) fun t ht => ?_ + rw [LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, zero_smul, add_zero] + rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] + rfl + | 1 => + refine mem_weightSpan_of_mem_space (w := 1) fun t ht => ?_ + rw [LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] + simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, zero_smul, zero_add] + rw [zpow_one] + rfl + +open BoostWeight in +/-- The charged-lepton jet component space is boost-graded. -/ +lemma isGraded_leptonJetComponentSpace : + IsGraded (LeptonSinglet.JetComponentSpace.repLorentzGroup) := + isGraded_prod (isGraded_tprod isGraded_derivAlgebraComplex isGraded_leptonSingletDual) + (isGraded_tprod isGraded_derivAlgebraComplex isGraded_leptonSingletConjDual) + +open BoostWeight in +/-- The charged-lepton jet algebra is boost-graded. -/ +lemma isGraded_leptonJetAlgebra : IsGraded (LeptonSinglet.JetAlgebra.repLorentzGroup) := + isGraded_exteriorAlgebra (repV := LeptonSinglet.JetComponentSpace.repLorentzGroup) + (fun Λ => by + show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) 1 = 1 + exact map_one _) + (fun Λ x y => by + show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) (x * y) = _ + exact map_mul _ _ _) + (fun Λ x => by + show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) + (ExteriorAlgebra.ι ℂ x) = _ + exact ExteriorAlgebra.map_apply_ι _ _) + isGraded_leptonJetComponentSpace + +open BoostWeight in +/-- The lepton–gauge-sector jet algebra is boost-graded. -/ +lemma isGraded_jetAlgebra : IsGraded (repLorentzGroup) := + isGraded_tprod isGraded_complexBBosonJetAlgebra isGraded_leptonJetAlgebra + +/-! + ## A. The boost-weight submodules -/ @@ -264,7 +731,7 @@ The weight submodules sit inside the eigenspaces of a single boost, `ρ(boostZel pairwise distinct eigenvalues `2 ^ k`. Eigenspaces at distinct eigenvalues are independent, so the family is independent: an element has at most one decomposition into homogeneous parts. This is one of the two halves of `DirectSum.IsInternal`; the other, that the weight submodules -span, is not proved here — see the module docstring. +span, is section O'. -/ @@ -521,6 +988,42 @@ lemma boostAvgZ_apply_eq_zero_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boos lemma boostAvgZ_apply_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : boostAvgZ x = x := boostAvgZ_apply_of_mem_zero (mem_boostWeightSubmodule_zero_of_isInvariant hx) +/-! + +## E. The grading + +The weight submodules are independent (`boostWeightSubmodule_iSupIndep`) and, by the descent +through the component spaces of section O', they span. So they decompose the jet algebra +internally, and together with the graded-monoid structure of section A they make it a graded +algebra. + +-/ + +/-- The homogeneous elements span the jet algebra. -/ +theorem iSup_boostWeightSubmodule_eq_top : (⨆ k, boostWeightSubmodule k) = ⊤ := + isGraded_jetAlgebra + +/-- Every generator is a finite sum of boost eigenvectors. -/ +theorem ofGenerator_mem_boostWeightSubalgebra (j : JetGenerators) : + [j]ₐ ∈ boostWeightSubalgebra := by + rw [mem_boostWeightSubalgebra, iSup_boostWeightSubmodule_eq_top] + trivial + +/-- **The boost weight grades the jet algebra.** The weight submodules decompose it as an + internal direct sum: every element is a finite sum of boost eigenvectors, uniquely. -/ +theorem boostWeightSubmodule_isInternal : DirectSum.IsInternal boostWeightSubmodule := + boostWeightSubmodule_isInternal_iff.mpr iSup_boostWeightSubmodule_eq_top + +/-- The decomposition of an element of the jet algebra into its boost-weight components. -/ +noncomputable instance : DirectSum.Decomposition boostWeightSubmodule := + boostWeightSubmodule_isInternal.chooseDecomposition + +/-- **The jet algebra is a graded algebra for the boost weight.** Weights add under + multiplication, the unit is neutral, and the weight components decompose every element. -/ +noncomputable instance : GradedAlgebra boostWeightSubmodule where + one_mem := one_mem_boostWeightSubmodule + mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy + end JetAlgebra end LeptonGaugeSector From da935a4ad0eec7336a8be89ea9ae2fc45cc5e015 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 11 Aug 2026 00:26:10 +0400 Subject: [PATCH 123/254] feat(tensor): add fixed-submodule extension lemmas --- Physlib.lean | 1 + Physlib/Mathematics/TensorProduct.lean | 166 ++++++++++++++++++ .../JetAlgebra/DerivativeOrder.lean | 116 ++++++------ .../GaugeBosons/BBoson/Basic.lean | 95 +++++----- .../GaugeBosons/Gluons/JetCompleteness.lean | 44 +++++ 5 files changed, 306 insertions(+), 116 deletions(-) create mode 100644 Physlib/Mathematics/TensorProduct.lean diff --git a/Physlib.lean b/Physlib.lean index 313e9f942..11be091ca 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -131,6 +131,7 @@ public import Physlib.Mathematics.Resolvent public import Physlib.Mathematics.SO3.Basic public import Physlib.Mathematics.SchurTriangulation public import Physlib.Mathematics.SpecialFunctions.PhysHermite +public import Physlib.Mathematics.TensorProduct public import Physlib.Mathematics.Trigonometry.Tanh public import Physlib.Mathematics.VariationalCalculus.Basic public import Physlib.Mathematics.VariationalCalculus.HasVarAdjDeriv diff --git a/Physlib/Mathematics/TensorProduct.lean b/Physlib/Mathematics/TensorProduct.lean new file mode 100644 index 000000000..5974ffd88 --- /dev/null +++ b/Physlib/Mathematics/TensorProduct.lean @@ -0,0 +1,166 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Mathlib.Algebra.Module.Submodule.EqLocus +public import Mathlib.LinearAlgebra.TensorProduct.Basis +public import Mathlib.LinearAlgebra.TensorProduct.Map + +/-! +# Simultaneous fixed submodules under tensor extension + +Let `F : ι → Module.End R M` be a family of linear endomorphisms. Its simultaneous fixed +submodule is the intersection `⋂ i, LinearMap.eqLocus (F i) LinearMap.id`. + +If `C` is a free `R`-module and every `F i` acts on `M ⊗[R] C` through the `M` factor, then the +simultaneous fixed submodule of the extended family is the tensor extension of the original fixed +submodule. The corresponding result also holds for `C ⊗[R] M`, with the endomorphisms acting on +the right factor. + +The proof chooses a basis of `C`, the tensor factor on which the extended endomorphisms act by the +identity. An element of the tensor product then has a unique finite expansion in this basis, +and it is fixed exactly when each coefficient in `M` is fixed. This only requires `C` to be free +as an `R`-module. + +This allows a fixed-point calculation on one module to be reused after tensoring with a free module +on which the endomorphisms act as the identity. For example, the added factor may be an exterior +algebra over a field, even though it contains nilpotent elements. + +-/ + +@[expose] public section + +open scoped TensorProduct + +namespace TensorProduct + +/-! + +## A. Coefficient decompositions and tensor maps + +Mathlib's `equivFinsuppOfBasisRight` and `equivFinsuppOfBasisLeft` express a tensor as a finitely +supported family of coefficients after choosing a basis of one tensor factor. The following +lemmas show that applying a linear map to the other factor applies that map independently to every +coefficient. + +-/ + +/-- Let `𝒞` be a basis of the right tensor factor. The `i`-th coefficient of +`f.rTensor C x` is `f` applied to the `i`-th coefficient of `x`. -/ +lemma equivFinsuppOfBasisRight_rTensor_apply + {R M N C κ : Type*} [CommSemiring R] + [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N] + [AddCommMonoid C] [Module R C] [DecidableEq κ] + (𝒞 : Module.Basis κ R C) (f : M →ₗ[R] N) (x : M ⊗[R] C) (i : κ) : + equivFinsuppOfBasisRight 𝒞 (f.rTensor C x) i = + f (equivFinsuppOfBasisRight 𝒞 x i) := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul m c => + rw [LinearMap.rTensor_tmul, equivFinsuppOfBasisRight_apply_tmul_apply, + equivFinsuppOfBasisRight_apply_tmul_apply, map_smul] + | add x y hx hy => simp only [map_add, Finsupp.add_apply, hx, hy] + +/-- Let `𝒞` be a basis of the left tensor factor. The `i`-th coefficient of +`f.lTensor C x` is `f` applied to the `i`-th coefficient of `x`. -/ +lemma equivFinsuppOfBasisLeft_lTensor_apply + {R M N C κ : Type*} [CommSemiring R] + [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N] + [AddCommMonoid C] [Module R C] [DecidableEq κ] + (𝒞 : Module.Basis κ R C) (f : M →ₗ[R] N) (x : C ⊗[R] M) (i : κ) : + equivFinsuppOfBasisLeft 𝒞 (f.lTensor C x) i = + f (equivFinsuppOfBasisLeft 𝒞 x i) := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul c m => + rw [LinearMap.lTensor_tmul, equivFinsuppOfBasisLeft_apply_tmul_apply, + equivFinsuppOfBasisLeft_apply_tmul_apply, map_smul] + | add x y hx hy => simp only [map_add, Finsupp.add_apply, hx, hy] + +end TensorProduct + +namespace LinearMap + +/-! + +## B. Simultaneous fixed submodules + +The simultaneous fixed submodule of `F` is the intersection of the equalizers of `F i` and the +identity. For a submodule `P ≤ M`, its extension inside `M ⊗[R] C` is +`Submodule.map₂ (TensorProduct.mk R M C) P ⊤`. This is the submodule spanned by the elementary +tensors `m ⊗ₜ c` with `m ∈ P`. When `C` is free, a tensor is fixed by every extended +endomorphism exactly when each of its coefficients belongs to the simultaneous fixed +submodule of `F`. + +-/ + +/-- Simultaneous fixed submodules after tensoring on the right by a free module. -/ +lemma iInf_eqLocus_rTensor + {R M C ι : Type*} [CommRing R] + [AddCommGroup M] [Module R M] + [AddCommGroup C] [Module R C] [Module.Free R C] + (F : ι → Module.End R M) : + (⨅ i, eqLocus ((F i).rTensor C) LinearMap.id) = + Submodule.map₂ (TensorProduct.mk R M C) (⨅ i, eqLocus (F i) LinearMap.id) ⊤ := by + classical + apply le_antisymm + · intro x hx + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hx + let 𝒞 := Module.Free.chooseBasis R C + have hcoeff : ∀ k, TensorProduct.equivFinsuppOfBasisRight 𝒞 x k ∈ + (⨅ i, eqLocus (F i) LinearMap.id) := by + intro k + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] + intro i + have h := TensorProduct.equivFinsuppOfBasisRight_rTensor_apply 𝒞 (F i) x k + rw [hx i] at h + exact h.symm + have hxrepr := (TensorProduct.equivFinsuppOfBasisRight 𝒞).symm_apply_apply x + rw [TensorProduct.equivFinsuppOfBasisRight_symm_apply] at hxrepr + rw [← hxrepr, Finsupp.sum] + exact Submodule.sum_mem _ fun k _ => + Submodule.apply_mem_map₂ _ (hcoeff k) (Submodule.mem_top) + · rw [Submodule.map₂_le] + intro m hm c _ + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hm ⊢ + intro i + change (F i).rTensor C (m ⊗ₜ[R] c) = m ⊗ₜ[R] c + rw [LinearMap.rTensor_tmul, hm i] + +/-- Simultaneous fixed submodules after tensoring on the left by a free module. -/ +lemma iInf_eqLocus_lTensor + {R M C ι : Type*} [CommRing R] + [AddCommGroup M] [Module R M] + [AddCommGroup C] [Module R C] [Module.Free R C] + (F : ι → Module.End R M) : + (⨅ i, eqLocus ((F i).lTensor C) LinearMap.id) = + Submodule.map₂ (TensorProduct.mk R C M) ⊤ (⨅ i, eqLocus (F i) LinearMap.id) := by + classical + apply le_antisymm + · intro x hx + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hx + let 𝒞 := Module.Free.chooseBasis R C + have hcoeff : ∀ k, TensorProduct.equivFinsuppOfBasisLeft 𝒞 x k ∈ + (⨅ i, eqLocus (F i) LinearMap.id) := by + intro k + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] + intro i + have h := TensorProduct.equivFinsuppOfBasisLeft_lTensor_apply 𝒞 (F i) x k + rw [hx i] at h + exact h.symm + have hxrepr := (TensorProduct.equivFinsuppOfBasisLeft 𝒞).symm_apply_apply x + rw [TensorProduct.equivFinsuppOfBasisLeft_symm_apply] at hxrepr + rw [← hxrepr, Finsupp.sum] + exact Submodule.sum_mem _ fun k _ => + Submodule.apply_mem_map₂ _ (Submodule.mem_top) (hcoeff k) + · rw [Submodule.map₂_le] + intro c _ m hm + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hm ⊢ + intro i + change (F i).lTensor C (c ⊗ₜ[R] m) = c ⊗ₜ[R] m + rw [LinearMap.lTensor_tmul, hm i] + +end LinearMap diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean index 7afea684f..ffd68a3af 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.TensorProduct public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeAction /-! # The derivative-order filtration @@ -541,20 +542,10 @@ set_option maxHeartbeats 2000000 in the field-strength derivatives and the covariant derivatives of the lepton and its conjugate. - Proof strategy (the sector analogue of - `BBoson.JetAlgebra.repJetGaugeGroupI_apply_eq_self_iff_mem`): decompose the jet - algebra as a free module over the (complexified) B-boson factor with basis the - exterior monomials in the *covariant* fermionic coordinates `D_s ψ_α`, - `D̄_s ψ̄_α` — a triangular change of variables from the plain coordinates - `∂_s ψ_α`, `∂_s ψ̄_α` by `Dψ_eq_leptonLinearIncl` and its conjugate. On this - decomposition a gauge transformation acts by the B-boson substitution action on - the coefficients and the scalars `u(0)^{±6}` on the covariant monomials - (`repJetGaugeGroupI_Dψ`, `repJetGaugeGroupI_Dbarψ`). Invariance under the - `expUnitary` translation family (which has `u(0) = 1`) forces each coefficient - to be invariant under all Maurer–Cartan translations of the pure-gauge B-boson - coordinates, hence to lie in the (complexified) field-strength subalgebra by - the B-boson translation theorem. -/ -theorem mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq + After applying the covariant substitution, every `expUnitary` transformation with value `1` at + the base point acts only on the complexified B-boson factor. The generic tensor fixed-submodule + result extends the B-boson translation result across the lepton exterior-algebra factor. -/ +lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq (x : JetAlgebra) (hx : ∀ U, repJetGaugeGroupI U x = x) : x ∈ CovariantAlgebra := by classical @@ -568,35 +559,41 @@ theorem mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq (BBoson.JetAlgebra.expUnitary a w hw)) y) = covSubst y rw [← repJetGaugeGroupI_covSubst _ (BBoson.JetAlgebra.eval_expUnitary_u1 a w hw), hx] - set bL := Module.Basis.ofVectorSpace ℂ LeptonSinglet.JetAlgebra with hbL - set e : ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra) ≃ₗ[ℂ] - (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra →₀ - ℂ ⊗[ℝ] BBoson.JetAlgebra) := - (TensorProduct.congr (LinearEquiv.refl ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra)) bL.repr).trans - (TensorProduct.finsuppScalarRight ℂ ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) - (Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra)) with hedef - have happly : ∀ (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra)) - (z : JetAlgebra) (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra), - e (TensorProduct.map f LinearMap.id z) T = f (e z T) := by - intro f z T - induction z using TensorProduct.induction_on with - | zero => simp - | add u v hu hv => simp only [map_add, Finsupp.add_apply, hu, hv] - | tmul c l => - rw [hedef] - simp only [TensorProduct.map_tmul, LinearMap.id_coe, id_eq, - LinearEquiv.trans_apply, TensorProduct.congr_tmul, LinearEquiv.refl_apply, - TensorProduct.finsuppScalarRight_apply_tmul_apply, map_smul] - have hcT : ∀ T, e y T ∈ Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] BBoson.JetAlgebra)) := by - intro T - refine BBoson.JetAlgebra.mem_adjoin_of_forall_expUnitary_complex _ fun a w hw => ?_ - have h := happly (BBoson.JetAlgebra.complexRepJetGaugeGroupI - (BBoson.JetAlgebra.expUnitary a w hw)) y T - rw [hyU a w hw] at h - exact h.symm + let Translation := {p : ℝ × ((Fin 1 ⊕ Fin 3) →₀ ℕ) // p.2 ≠ 0} + let F : Translation → Module.End ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) := fun p => + BBoson.JetAlgebra.complexRepJetGaugeGroupI + (BBoson.JetAlgebra.expUnitary p.1.1 p.1.2 p.2) + have hyFixed : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetAlgebra from y) ∈ ⨅ p : Translation, + LinearMap.eqLocus ((F p).rTensor LeptonSinglet.JetAlgebra) LinearMap.id := by + refine (Submodule.mem_iInf _).2 ?_ + intro p + refine LinearMap.mem_eqLocus.mpr ?_ + simpa only [LinearMap.id_apply, LinearMap.rTensor_def, F] using hyU p.1.1 p.1.2 p.2 + have hyTensor : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetAlgebra from y) ∈ Submodule.map₂ (TensorProduct.mk ℂ + (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) + (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ⊤ := by + rw [← LinearMap.iInf_eqLocus_rTensor F] + exact hyFixed + have hB : (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ≤ + (Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] BBoson.JetAlgebra))).toSubmodule := by + intro c hc + refine BBoson.JetAlgebra.mem_adjoin_of_forall_expUnitary_complex c fun a w hw => ?_ + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hc + exact hc (⟨(a, w), hw⟩ : Translation) + have hyField : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] + LeptonSinglet.JetAlgebra from y) ∈ Submodule.map₂ (TensorProduct.mk ℂ + (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) + (Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] BBoson.JetAlgebra))).toSubmodule ⊤ := + Submodule.map₂_le_map₂_left + (f := TensorProduct.mk ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) hB hyTensor set S : Set JetAlgebra := (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ @@ -665,27 +662,22 @@ theorem mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq (v ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) from by rw [tmul_mul_tmul, honeL]] exact mul_mem ihu ihv - have hsymm_single : ∀ (T : Module.Basis.ofVectorSpaceIndex ℂ LeptonSinglet.JetAlgebra) - (c : ℂ ⊗[ℝ] BBoson.JetAlgebra), - e.symm (Finsupp.single T c) = c ⊗ⱼ (bL T) := by - intro T c - rw [hedef, LinearEquiv.symm_trans_apply, - TensorProduct.finsuppScalarRight_symm_apply_single, TensorProduct.congr_symm_tmul] - simp only [LinearEquiv.refl_symm, LinearEquiv.refl_apply, - Module.Basis.repr_symm_single_one] - rfl - have hdecomp : y = ((e y).support).sum (fun T => (e y T) ⊗ⱼ (bL T)) := by - conv_lhs => rw [← e.symm_apply_apply y, ← Finsupp.sum_single (e y)] - rw [Finsupp.sum, map_sum] - exact Finset.sum_congr rfl fun T _ => hsymm_single T _ have hyMem : y ∈ Algebra.adjoin ℂ S := by - rw [hdecomp] - refine sum_mem fun T _ => ?_ - rw [show ((e y T) ⊗ⱼ (bL T) : JetAlgebra) = - ((e y T) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (bL T)) from by + apply (show Submodule.map₂ (TensorProduct.mk ℂ + (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) + (Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] BBoson.JetAlgebra))).toSubmodule ⊤ ≤ + (Algebra.adjoin ℂ S).toSubmodule from ?_) hyField + rw [Submodule.map₂_le] + intro c hc l _ + change c ⊗ⱼ l ∈ Algebra.adjoin ℂ S + rw [show (c ⊗ⱼ l : JetAlgebra) = + (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * + ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l) from by rw [tmul_mul_tmul, honeB, honeL]] - exact mul_mem (hleft _ (hcT T)) (hone_tmul _) + exact mul_mem (hleft c hc) (hone_tmul l) have himg : covSubst y ∈ (Algebra.adjoin ℂ S).map covSubst := Subalgebra.mem_map.mpr ⟨y, hyMem, rfl⟩ rw [AlgHom.map_adjoin] at himg diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index d7a035551..242389985 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -12,6 +12,7 @@ public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation public import Physlib.Relativity.SL2C.Basic public import Physlib.Mathematics.ConjModule +public import Physlib.Mathematics.TensorProduct public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Particles.LagrangianTheory.Basic public import Physlib.Mathematics.MvPowerSeriesDerivative @@ -2280,20 +2281,11 @@ lemma mem_adjoin_of_forall_expUnitary (V : JetAlgebra) rw [hsymm] exact ofGenerator_sub_ofGenerator_canon_mem g -/-- The coordinate retractions of the complexified jet algebra along the real - basis `{1, I}` of `ℂ`. -/ -private noncomputable def complexCoordAux (i : Fin 2) : - ℂ ⊗[ℝ] JetAlgebra →ₗ[ℝ] JetAlgebra := - TensorProduct.lift ((LinearMap.lsmul ℝ JetAlgebra).comp (Complex.basisOneI.coord i)) - -private lemma complexCoordAux_tmul (i : Fin 2) (z : ℂ) (b : JetAlgebra) : - complexCoordAux i (z ⊗ₜ[ℝ] b) = Complex.basisOneI.repr z i • b := by - simp [complexCoordAux, Module.Basis.coord_apply] - set_option maxHeartbeats 1000000 in /-- The complexified invariance direction: an element of the complexified B-boson jet algebra fixed by the complexified action of the `expUnitary` translation - family lies in the complexified field-strength subalgebra. -/ + family lies in the complexified field-strength subalgebra. The generic tensor + fixed-submodule result extends the real translation argument across the scalar factor `ℂ`. -/ lemma mem_adjoin_of_forall_expUnitary_complex (x : ℂ ⊗[ℝ] JetAlgebra) (hx : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), complexRepJetGaugeGroupI (expUnitary a w hw) x = x) : @@ -2301,44 +2293,29 @@ lemma mem_adjoin_of_forall_expUnitary_complex (x : ℂ ⊗[ℝ] JetAlgebra) Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] JetAlgebra)) := by classical - have hrtmul : ∀ (i : Fin 2) (z : ℂ) (b : JetAlgebra), - complexCoordAux i (z ⊗ₜ[ℝ] b) = Complex.basisOneI.repr z i • b := - complexCoordAux_tmul - have h1 : ∀ y : ℂ ⊗[ℝ] JetAlgebra, - y = (1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 0 y + Complex.I ⊗ₜ[ℝ] complexCoordAux 1 y := by - intro y - induction y using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - rw [map_add, map_add, TensorProduct.tmul_add, TensorProduct.tmul_add] - calc a + b = ((1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 0 a + Complex.I ⊗ₜ[ℝ] complexCoordAux 1 a) + - ((1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 0 b + Complex.I ⊗ₜ[ℝ] complexCoordAux 1 b) := by rw [← ha, ← hb] - _ = _ := by abel - | tmul z b => - rw [hrtmul, hrtmul, TensorProduct.tmul_smul, TensorProduct.tmul_smul, - TensorProduct.smul_tmul', TensorProduct.smul_tmul', ← TensorProduct.add_tmul] - congr 1 - have hz := Complex.re_add_im z - simp only [Complex.coe_basisOneI_repr, Matrix.cons_val_zero, Matrix.cons_val_one] - rw [show z.re • (1 : ℂ) = (z.re : ℂ) from by simp [Complex.real_smul], - show z.im • Complex.I = (z.im : ℂ) * Complex.I from by rw [Complex.real_smul]] - exact hz.symm - have h2 : ∀ (U : JetGaugeGroupI) (i : Fin 2) (y : ℂ ⊗[ℝ] JetAlgebra), - complexCoordAux i (complexRepJetGaugeGroupI U y) = - repJetGaugeGroupI U (complexCoordAux i y) := by - intro U i y - induction y using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul z b => - simp only [complexRepJetGaugeGroupI_tmul] - rw [hrtmul, hrtmul] - exact ((repJetGaugeGroupI U).map_smul _ _).symm - have hmem : ∀ i : Fin 2, complexCoordAux i x ∈ Algebra.adjoin ℝ - (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by - intro i - refine mem_adjoin_of_forall_expUnitary (complexCoordAux i x) fun a w hw => ?_ - rw [← h2, hx a w hw] + let Translation := {p : ℝ × ((Fin 1 ⊕ Fin 3) →₀ ℕ) // p.2 ≠ 0} + let F : Translation → Module.End ℝ JetAlgebra := fun p => + repJetGaugeGroupI (expUnitary p.1.1 p.1.2 p.2) + have hxFixed : x ∈ ⨅ p : Translation, + LinearMap.eqLocus ((F p).lTensor ℂ) LinearMap.id := by + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] + intro p + rw [← LinearMap.baseChange_eq_ltensor] + exact hx p.1.1 p.1.2 p.2 + have hxTensor : x ∈ Submodule.map₂ (TensorProduct.mk ℝ ℂ JetAlgebra) ⊤ + (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) := by + rw [← LinearMap.iInf_eqLocus_lTensor F] + exact hxFixed + have hreal : (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ≤ + (Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ)).toSubmodule := by + intro b hb + refine mem_adjoin_of_forall_expUnitary b fun a w hw => ?_ + simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hb + exact hb (⟨(a, w), hw⟩ : Translation) + have hxField : x ∈ Submodule.map₂ (TensorProduct.mk ℝ ℂ JetAlgebra) ⊤ + (Algebra.adjoin ℝ + (fieldStrengthDeriv.uncurry.uncurry '' Set.univ)).toSubmodule := + Submodule.map₂_le_map₂_right hreal hxTensor have hinc : ∀ b ∈ Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ), ((1 : ℂ) ⊗ₜ[ℝ] b : ℂ ⊗[ℝ] JetAlgebra) ∈ Algebra.adjoin ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => @@ -2361,12 +2338,22 @@ lemma mem_adjoin_of_forall_expUnitary_complex (x : ℂ ⊗[ℝ] JetAlgebra) ((1 : ℂ) ⊗ₜ[ℝ] y) * ((1 : ℂ) ⊗ₜ[ℝ] z) from by rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul]] exact mul_mem ihy ihz - rw [h1 x] - refine add_mem (hinc _ (hmem 0)) ?_ - rw [show (Complex.I ⊗ₜ[ℝ] complexCoordAux 1 x : ℂ ⊗[ℝ] JetAlgebra) = - Complex.I • ((1 : ℂ) ⊗ₜ[ℝ] complexCoordAux 1 x) from by + apply (show Submodule.map₂ (TensorProduct.mk ℝ ℂ JetAlgebra) ⊤ + (Algebra.adjoin ℝ + (fieldStrengthDeriv.uncurry.uncurry '' Set.univ)).toSubmodule ≤ + (Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : + ℂ ⊗[ℝ] JetAlgebra))).toSubmodule.restrictScalars ℝ from ?_) hxField + rw [Submodule.map₂_le] + intro c _ b hb + change c ⊗ₜ[ℝ] b ∈ Algebra.adjoin ℂ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] JetAlgebra)) + rw [show (c ⊗ₜ[ℝ] b : ℂ ⊗[ℝ] JetAlgebra) = + c • ((1 : ℂ) ⊗ₜ[ℝ] b) from by rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one]] - exact Subalgebra.smul_mem _ (hinc _ (hmem 1)) _ + exact Subalgebra.smul_mem _ (hinc b hb) c /-- An EFT lagrangian with field content consisting only of a `B` bosons is invariant under the full gauge group if and only if diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean index 650861f61..75ceb8554 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean @@ -5,6 +5,7 @@ Authors: Nathaneal Sajan -/ module +public import Physlib.Mathematics.TensorProduct public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.FiniteHeight /-! # All-orders and full-group completeness @@ -58,6 +59,7 @@ ordered product decomposition of a jet is constructed, and the contravariant com namespace StandardModel open Matrix Module MvPolynomial +open scoped TensorProduct namespace SU3Jet @@ -124,6 +126,48 @@ lemma fixed_by_jetGroup_eq_invariant_covAlgebra : rw [gaugePull_eq_ofConstantSU U hadj] exact hconst _ +/-! + +## C. Extension by an unchanged tensor factor + +The based completeness result extends to a tensor product when the gauge pull acts only on the +gluon factor. The generic fixed-submodule result in `Physlib.Mathematics.TensorProduct` reduces +this statement to `fixed_by_based_eq_covAlgebra`, without repeating the coefficient decomposition +or the gluon elimination argument. + +-/ + +/-- The tensor extension of the covariant gluon subalgebra by an arbitrary real module `C`. -/ +noncomputable def covTensor (C : Type*) [AddCommGroup C] [Module ℝ C] : + Submodule ℝ (JetAlgebra ⊗[ℝ] C) := + Submodule.map₂ (TensorProduct.mk ℝ JetAlgebra C) covAlgebra.toSubmodule ⊤ + +/-- After tensoring on the right by a free real module, the elements fixed by every based gauge +pull acting on the gluon factor are exactly the tensor extension of `covAlgebra`. -/ +lemma fixed_by_based_tensor_eq_covTensor + (C : Type*) [AddCommGroup C] [Module ℝ C] [Module.Free ℝ C] : + {z : JetAlgebra ⊗[ℝ] C | ∀ U : specialUnitaryGroup (Fin 3) JetRing, + JetGaugeGroupI.evalSU (Fin 3) U = 1 → + (gaugePull U).toLinearMap.rTensor C z = z} = + (covTensor C : Set (JetAlgebra ⊗[ℝ] C)) := by + classical + let BasedJet := {U : specialUnitaryGroup (Fin 3) JetRing // + JetGaugeGroupI.evalSU (Fin 3) U = 1} + let F : BasedJet → Module.End ℝ JetAlgebra := fun U => (gaugePull U.1).toLinearMap + have hbase : (⨅ U : BasedJet, LinearMap.eqLocus (F U) LinearMap.id) = + covAlgebra.toSubmodule := by + ext P + rw [Submodule.mem_iInf] + change (∀ U : BasedJet, gaugePull U.1 P = P) ↔ P ∈ covAlgebra + have hP := Set.ext_iff.mp fixed_by_based_eq_covAlgebra P + simpa only [Set.mem_setOf_eq, SetLike.mem_coe, Subtype.forall, BasedJet] using hP + have h := LinearMap.iInf_eqLocus_rTensor (C := C) F + rw [hbase] at h + ext z + have hz := SetLike.ext_iff.mp h z + simpa only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply, + Set.mem_setOf_eq, SetLike.mem_coe, Subtype.forall, BasedJet, F, covTensor] using hz + end SU3Jet end StandardModel From 3dee07b9cfc9478e7f0e354e8f7153c5e30a85c6 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 11 Aug 2026 05:42:52 +0100 Subject: [PATCH 124/254] Create BoostWeightSubMod.lean --- .../JetAlgebra/Grading/BoostWeightSubMod.lean | 548 ++++++++++++++++++ 1 file changed, 548 insertions(+) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean new file mode 100644 index 000000000..0fd82750a --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean @@ -0,0 +1,548 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +/-! +# The boost weight zero part of the photon pairs + +The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra. This +file computes its intersection with the boost weight zero submodule: it is spanned by seven +explicit products, listed in `fieldStrengthPairsWeightZero`. + +*The proof is a certificate.* Rather than deducing the intersection abstractly, the span of the +products is written out in boost eigenvectors. The coordinate components `F_{μν}` are not boost +eigenvectors, but six combinations of them are: the light-cone combinations `F_{0x} - F_{zx}` and +`F_{0y} - F_{zy}` of weight `2`, their partners `F_{0x} + F_{zx}` and `F_{0y} + F_{zy}` of weight +`-2`, and the two components with no free light-cone index, `F_{xy}` and `F_{0z}`, of weight `0`. +Every `F_{μν}` is a combination of these six — the sixteen cases of `fieldStrengthSpan_le` — so +the span of the products is contained in the sum of the nine products of the three weight spaces, +whose weights are `0, ±2, ±4`. The three of weight zero — a weight-`2` field strength against a +weight-`-2` one, and two weight-zero ones — are exactly the seven products listed. + +The intersection then follows formally, with no linear independence of the products needed. The +weight submodules are independent (`boostWeightSubmodule_iSupIndep`), so boost weight zero is +disjoint from the span of the weights `±2, ±4`; since the weight-zero part sits inside boost +weight zero, the modular law cuts the intersection down to it. + +## i. Overview + +Section A exhibits the six boost eigenvectors, section B decomposes every coordinate component +into them, section C multiplies the weight spaces together and reads off the weight of each of +the nine products, and section D assembles the intersection. + +## ii. Key results + +- `JetAlgebra.fieldStrengthPlusX` and its five partners : the boost eigenvectors among the + field strengths, of weights `2`, `-2` and `0`. +- `JetAlgebra.fieldStrengthSpan_le` : every field strength is a combination of the six. +- `JetAlgebra.fieldStrengthPairs` : the products `F_{μν} F_{μ'ν'}`. +- `JetAlgebra.fieldStrengthPairsWeightZero` : the seven products of boost weight zero. +- `JetAlgebra.span_fieldStrengthPairs_le` : the span of the products, split into its weights. +- `JetAlgebra.boostWeight_inter_fieldStrength` : the intersection of boost weight zero with the + span of the products is the span of the seven. + +## iii. Table of contents + +- A. The boost eigenvectors among the field strengths +- B. Every field strength is a combination of the eigenvectors +- C. Products of two field strengths +- D. The weight zero part of the photon pairs + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +namespace JetAlgebra + +open scoped Pointwise + +/-! + +## A. The boost eigenvectors among the field strengths + +A boost in the `z`-direction mixes the time index with the `z` index, so the coordinate +components of the field strength are not boost eigenvectors. Six combinations of them are: the +four light-cone combinations, of weight `±2`, and the two components whose index pair is either +transverse to the boost or contained in the `0z` plane, of weight `0`. + +-/ + +/-- `F_{0x} - F_{zx}`, of boost weight `2`. -/ +noncomputable def fieldStrengthPlusX : JetAlgebra := + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) + +/-- `F_{0y} - F_{zy}`, of boost weight `2`. -/ +noncomputable def fieldStrengthPlusY : JetAlgebra := + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) + +/-- `F_{0x} + F_{zx}`, of boost weight `-2`. -/ +noncomputable def fieldStrengthMinusX : JetAlgebra := + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) + +/-- `F_{0y} + F_{zy}`, of boost weight `-2`. -/ +noncomputable def fieldStrengthMinusY : JetAlgebra := + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) + +/-- `F_{xy}`, of boost weight `0`. -/ +noncomputable def fieldStrengthTransverse : JetAlgebra := + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) + +/-- `F_{0z}`, of boost weight `0`. -/ +noncomputable def fieldStrengthLongitudinal : JetAlgebra := + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + +/-- `F_{0x} - F_{zx}` has boost weight `2`. -/ +lemma fieldStrengthPlusX_mem : fieldStrengthPlusX ∈ boostWeightSubmodule 2 := + fieldStrengthDeriv_lightCone_mem_two + +/-- `F_{0x} + F_{zx}` has boost weight `-2`. -/ +lemma fieldStrengthMinusX_mem : fieldStrengthMinusX ∈ boostWeightSubmodule (-2) := + fieldStrengthDeriv_lightCone_mem_neg_two + +/-- `F_{xy}` has boost weight `0`: both indices are transverse to the boost. -/ +lemma fieldStrengthTransverse_mem : fieldStrengthTransverse ∈ boostWeightSubmodule 0 := + fieldStrengthDeriv_transverse_mem_zero + +/-- `F_{0y} - F_{zy}` has boost weight `2`. -/ +lemma fieldStrengthPlusY_mem : fieldStrengthPlusY ∈ boostWeightSubmodule 2 := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [fieldStrengthPlusY, map_sub, repLorentzGroup_fieldStrengthDeriv_nil, + repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- `F_{0y} + F_{zy}` has boost weight `-2`. -/ +lemma fieldStrengthMinusY_mem : fieldStrengthMinusY ∈ boostWeightSubmodule (-2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [fieldStrengthMinusY, map_add, repLorentzGroup_fieldStrengthDeriv_nil, + repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- `F_{0z}` has boost weight `0`: the boost acts on its two indices by inverse factors. -/ +lemma fieldStrengthLongitudinal_mem : fieldStrengthLongitudinal ∈ boostWeightSubmodule 0 := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [fieldStrengthLongitudinal, repLorentzGroup_fieldStrengthDeriv_nil] + simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, zero_mul, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] + push_cast + match_scalars + field_simp + ring + +/-! + +## B. Every field strength is a combination of the eigenvectors + +The six eigenvectors span the same submodule as the sixteen coordinate components: on the +light-cone pairs this is the change of basis `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` +and its partners, and the remaining components are either zero, one of the two weight-zero +eigenvectors, or minus one of these by antisymmetry. + +-/ + +/-- The span of the two weight-`2` field strengths. -/ +noncomputable def fieldStrengthSpanTwo : Submodule ℂ JetAlgebra := + Submodule.span ℂ {fieldStrengthPlusX, fieldStrengthPlusY} + +/-- The span of the two weight-`0` field strengths. -/ +noncomputable def fieldStrengthSpanZero : Submodule ℂ JetAlgebra := + Submodule.span ℂ {fieldStrengthTransverse, fieldStrengthLongitudinal} + +/-- The span of the two weight-`-2` field strengths. -/ +noncomputable def fieldStrengthSpanNegTwo : Submodule ℂ JetAlgebra := + Submodule.span ℂ {fieldStrengthMinusX, fieldStrengthMinusY} + +/-- The span of the field strengths `F_{μν}`. -/ +noncomputable def fieldStrengthSpan : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} + +/-- The weight-`2` field strengths span a submodule of boost weight `2`. -/ +lemma fieldStrengthSpanTwo_le : fieldStrengthSpanTwo ≤ boostWeightSubmodule 2 := by + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · exact fieldStrengthPlusX_mem + · exact fieldStrengthPlusY_mem + +/-- The weight-`0` field strengths span a submodule of boost weight `0`. -/ +lemma fieldStrengthSpanZero_le : fieldStrengthSpanZero ≤ boostWeightSubmodule 0 := by + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · exact fieldStrengthTransverse_mem + · exact fieldStrengthLongitudinal_mem + +/-- The weight-`-2` field strengths span a submodule of boost weight `-2`. -/ +lemma fieldStrengthSpanNegTwo_le : fieldStrengthSpanNegTwo ≤ boostWeightSubmodule (-2) := by + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · exact fieldStrengthMinusX_mem + · exact fieldStrengthMinusY_mem + +/-- Every field strength is a combination of the six boost eigenvectors. -/ +lemma fieldStrengthSpan_le : + fieldStrengthSpan ≤ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ fieldStrengthSpanNegTwo := by + have hPX : fieldStrengthPlusX ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ + fieldStrengthSpanNegTwo := + Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) + have hPY : fieldStrengthPlusY ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ + fieldStrengthSpanNegTwo := + Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) + have hT : fieldStrengthTransverse ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ + fieldStrengthSpanNegTwo := + Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) + have hL : fieldStrengthLongitudinal ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ + fieldStrengthSpanNegTwo := + Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) + have hMX : fieldStrengthMinusX ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ + fieldStrengthSpanNegTwo := + Submodule.mem_sup_right (Submodule.subset_span (by simp)) + have hMY : fieldStrengthMinusY ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ + fieldStrengthSpanNegTwo := + Submodule.mem_sup_right (Submodule.subset_span (by simp)) + refine Submodule.span_le.2 ?_ + rintro x ⟨μ, ν, rfl⟩ + match μ, ν with + | Sum.inl 0, Sum.inl 0 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ + | Sum.inr 0, Sum.inr 0 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ + | Sum.inr 1, Sum.inr 1 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ + | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ + | Sum.inl 0, Sum.inr 0 => + rw [show fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = + (2⁻¹ : ℂ) • (fieldStrengthPlusX + fieldStrengthMinusX) from by + rw [fieldStrengthPlusX, fieldStrengthMinusX]; module] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPX hMX) + | Sum.inr 0, Sum.inl 0 => + rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + (-2⁻¹ : ℂ) • (fieldStrengthPlusX + fieldStrengthMinusX) from by + rw [fieldStrengthPlusX, fieldStrengthMinusX, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0)]; module] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPX hMX) + | Sum.inl 0, Sum.inr 1 => + rw [show fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = + (2⁻¹ : ℂ) • (fieldStrengthPlusY + fieldStrengthMinusY) from by + rw [fieldStrengthPlusY, fieldStrengthMinusY]; module] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPY hMY) + | Sum.inr 1, Sum.inl 0 => + rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + (-2⁻¹ : ℂ) • (fieldStrengthPlusY + fieldStrengthMinusY) from by + rw [fieldStrengthPlusY, fieldStrengthMinusY, + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1)]; module] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPY hMY) + | Sum.inr 2, Sum.inr 0 => + rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + (2⁻¹ : ℂ) • (fieldStrengthMinusX - fieldStrengthPlusX) from by + rw [fieldStrengthPlusX, fieldStrengthMinusX]; module] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hMX hPX) + | Sum.inr 0, Sum.inr 2 => + rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) = + (2⁻¹ : ℂ) • (fieldStrengthPlusX - fieldStrengthMinusX) from by + rw [fieldStrengthPlusX, fieldStrengthMinusX, + fieldStrengthDeriv_antisymm {} (Sum.inr 2) (Sum.inr 0)]; module] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hPX hMX) + | Sum.inr 2, Sum.inr 1 => + rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + (2⁻¹ : ℂ) • (fieldStrengthMinusY - fieldStrengthPlusY) from by + rw [fieldStrengthPlusY, fieldStrengthMinusY]; module] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hMY hPY) + | Sum.inr 1, Sum.inr 2 => + rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) = + (2⁻¹ : ℂ) • (fieldStrengthPlusY - fieldStrengthMinusY) from by + rw [fieldStrengthPlusY, fieldStrengthMinusY, + fieldStrengthDeriv_antisymm {} (Sum.inr 2) (Sum.inr 1)]; module] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hPY hMY) + | Sum.inr 0, Sum.inr 1 => exact hT + | Sum.inr 1, Sum.inr 0 => + rw [fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1)] + exact neg_mem hT + | Sum.inl 0, Sum.inr 2 => exact hL + | Sum.inr 2, Sum.inl 0 => + rw [fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] + exact neg_mem hL + +/-! + +## C. Products of two field strengths + +The span of the products is the product of the span of the field strengths with itself, so it is +contained in the product of the sum of the three weight spaces with itself. That expands into +nine products of weight spaces, and boost weights add under multiplication, so each of the nine +carries a single weight: `0` for the three products of a weight `w` space with a weight `-w` one, +and `±2` or `±4` for the other six. + +-/ + +/-- Each field strength lies in the field-strength span. -/ +lemma fieldStrengthDeriv_mem_span (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {} μ ν ∈ fieldStrengthSpan := + Submodule.subset_span ⟨μ, ν, rfl⟩ + +/-- The weight-`2` eigenvector `F_{0x} - F_{zx}` lies in the field-strength span. -/ +lemma fieldStrengthPlusX_mem_span : fieldStrengthPlusX ∈ fieldStrengthSpan := + Submodule.sub_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) + +/-- The weight-`2` eigenvector `F_{0y} - F_{zy}` lies in the field-strength span. -/ +lemma fieldStrengthPlusY_mem_span : fieldStrengthPlusY ∈ fieldStrengthSpan := + Submodule.sub_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) + +/-- The weight-`-2` eigenvector `F_{0x} + F_{zx}` lies in the field-strength span. -/ +lemma fieldStrengthMinusX_mem_span : fieldStrengthMinusX ∈ fieldStrengthSpan := + Submodule.add_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) + +/-- The weight-`-2` eigenvector `F_{0y} + F_{zy}` lies in the field-strength span. -/ +lemma fieldStrengthMinusY_mem_span : fieldStrengthMinusY ∈ fieldStrengthSpan := + Submodule.add_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) + +/-- `F_{xy}` lies in the field-strength span. -/ +lemma fieldStrengthTransverse_mem_span : fieldStrengthTransverse ∈ fieldStrengthSpan := + fieldStrengthDeriv_mem_span _ _ + +/-- `F_{0z}` lies in the field-strength span. -/ +lemma fieldStrengthLongitudinal_mem_span : fieldStrengthLongitudinal ∈ fieldStrengthSpan := + fieldStrengthDeriv_mem_span _ _ + +/-- Elements of the field-strength span commute. -/ +lemma mul_comm_of_mem_fieldStrengthSpan {x y : JetAlgebra} (hx : x ∈ fieldStrengthSpan) + (hy : y ∈ fieldStrengthSpan) : x * y = y * x := by + induction hx using Submodule.span_induction with + | mem a ha => + obtain ⟨μ, ν, rfl⟩ := ha + induction hy using Submodule.span_induction with + | mem b hb => + obtain ⟨μ', ν', rfl⟩ := hb + exact fieldStrengthDeriv_mul_comm {} {} μ ν μ' ν' + | zero => rw [mul_zero, zero_mul] + | add u v _ _ ihu ihv => rw [mul_add, add_mul, ihu, ihv] + | smul c u _ ihu => rw [mul_smul_comm, smul_mul_assoc, ihu] + | zero => rw [mul_zero, zero_mul] + | add u v _ _ ihu ihv => rw [mul_add, add_mul, ihu, ihv] + | smul c u _ ihu => rw [mul_smul_comm, smul_mul_assoc, ihu] + +/-- Boost weights add under multiplication. -/ +lemma mul_mem_boostWeightSubmodule' {k l m : ℤ} (hm : k + l = m) {x y : JetAlgebra} + (hx : x ∈ boostWeightSubmodule k) (hy : y ∈ boostWeightSubmodule l) : + x * y ∈ boostWeightSubmodule m := by + rw [← hm] + exact mul_mem_boostWeightSubmodule hx hy + +/-- Boost weights add under the product of submodules. -/ +lemma mul_le_boostWeightSubmodule {X Y : Submodule ℂ JetAlgebra} {k l m : ℤ} (hm : k + l = m) + (hX : X ≤ boostWeightSubmodule k) (hY : Y ≤ boostWeightSubmodule l) : + X * Y ≤ boostWeightSubmodule m := by + rw [← hm] + exact Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy) + +/-- The products `F_{μν} F_{μ'ν'}` of two field strengths. -/ +def fieldStrengthPairs : Set JetAlgebra := + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} + +/-- The products of two field strengths which are of boost weight zero: a weight-`2` light-cone + field strength against a weight-`-2` one, or a pair drawn from `F_{xy}` and `F_{0z}`. -/ +def fieldStrengthPairsWeightZero : Set JetAlgebra := + {fieldStrengthPlusX * fieldStrengthMinusX, fieldStrengthPlusX * fieldStrengthMinusY, + fieldStrengthPlusY * fieldStrengthMinusX, fieldStrengthPlusY * fieldStrengthMinusY, + fieldStrengthTransverse * fieldStrengthTransverse, + fieldStrengthTransverse * fieldStrengthLongitudinal, + fieldStrengthLongitudinal * fieldStrengthLongitudinal} + +/-- The span of the products of two field strengths is the product of the field-strength span + with itself. -/ +lemma span_fieldStrengthPairs : + Submodule.span ℂ fieldStrengthPairs = fieldStrengthSpan * fieldStrengthSpan := by + rw [fieldStrengthSpan, Submodule.span_mul_span] + congr 1 + ext x + constructor + · rintro ⟨μ, ν, μ', ν', rfl⟩ + exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ + · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩ + exact ⟨μ, ν, μ', ν', rfl⟩ + +/-- A weight-`2` field strength times a weight-`-2` one is one of the weight-zero pairs. -/ +lemma fieldStrengthSpanTwo_mul_NegTwo_le : + fieldStrengthSpanTwo * fieldStrengthSpanNegTwo ≤ + Submodule.span ℂ fieldStrengthPairsWeightZero := by + rw [fieldStrengthSpanTwo, fieldStrengthSpanNegTwo, Submodule.span_mul_span] + refine Submodule.span_le.2 ?_ + rintro x ⟨a, ha, b, hb, rfl⟩ + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb + rcases ha with rfl | rfl <;> rcases hb with rfl | rfl <;> + exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + +/-- The same product in the other order, using that the field strengths commute. -/ +lemma fieldStrengthSpanNegTwo_mul_Two_le : + fieldStrengthSpanNegTwo * fieldStrengthSpanTwo ≤ + Submodule.span ℂ fieldStrengthPairsWeightZero := by + rw [fieldStrengthSpanTwo, fieldStrengthSpanNegTwo, Submodule.span_mul_span] + refine Submodule.span_le.2 ?_ + rintro x ⟨a, ha, b, hb, rfl⟩ + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb + rcases ha with rfl | rfl <;> rcases hb with rfl | rfl <;> beta_reduce + · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusX_mem_span + fieldStrengthPlusX_mem_span] + exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusX_mem_span + fieldStrengthPlusY_mem_span] + exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusY_mem_span + fieldStrengthPlusX_mem_span] + exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusY_mem_span + fieldStrengthPlusY_mem_span] + exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + +/-- Two transverse field strengths multiply into the weight-zero pairs. -/ +lemma fieldStrengthSpanZero_mul_Zero_le : + fieldStrengthSpanZero * fieldStrengthSpanZero ≤ + Submodule.span ℂ fieldStrengthPairsWeightZero := by + rw [fieldStrengthSpanZero, Submodule.span_mul_span] + refine Submodule.span_le.2 ?_ + rintro x ⟨a, ha, b, hb, rfl⟩ + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb + rcases ha with rfl | rfl <;> rcases hb with rfl | rfl <;> beta_reduce + · exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + · exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthLongitudinal_mem_span + fieldStrengthTransverse_mem_span] + exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + · exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) + +/-- The span of the products of two field strengths, split into its boost weights: the + weight-zero pairs together with the weights `±2` and `±4`. -/ +lemma span_fieldStrengthPairs_le : + Submodule.span ℂ fieldStrengthPairs ≤ + Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ + ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := by + have hrest : ∀ k : ℤ, k ≠ 0 → boostWeightSubmodule k ≤ + ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := + fun k hk => le_iSup_of_le k (le_iSup_of_le hk le_rfl) + rw [span_fieldStrengthPairs] + refine (Submodule.mul_le.2 fun _ hx _ hy => + Submodule.mul_mem_mul (fieldStrengthSpan_le hx) (fieldStrengthSpan_le hy)).trans ?_ + simp only [Submodule.sup_mul, Submodule.mul_sup] + repeat' apply sup_le + · -- `(+2) + (+2) = 4` + exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanTwo_le + fieldStrengthSpanTwo_le).trans (hrest _ (by norm_num))) + · -- `0 + (+2) = 2` + exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanZero_le + fieldStrengthSpanTwo_le).trans (hrest _ (by norm_num))) + · -- `(-2) + (+2) = 0` + exact le_sup_of_le_left fieldStrengthSpanNegTwo_mul_Two_le + · -- `(+2) + 0 = 2` + exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanTwo_le + fieldStrengthSpanZero_le).trans (hrest _ (by norm_num))) + · -- `0 + 0 = 0` + exact le_sup_of_le_left fieldStrengthSpanZero_mul_Zero_le + · -- `(-2) + 0 = -2` + exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanNegTwo_le + fieldStrengthSpanZero_le).trans (hrest _ (by norm_num))) + · -- `(+2) + (-2) = 0` + exact le_sup_of_le_left fieldStrengthSpanTwo_mul_NegTwo_le + · -- `0 + (-2) = -2` + exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanZero_le + fieldStrengthSpanNegTwo_le).trans (hrest _ (by norm_num))) + · -- `(-2) + (-2) = -4` + exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanNegTwo_le + fieldStrengthSpanNegTwo_le).trans (hrest _ (by norm_num))) + +/-- The weight-zero pairs have boost weight zero. -/ +lemma span_fieldStrengthPairsWeightZero_le_boostWeightSubmodule : + Submodule.span ℂ fieldStrengthPairsWeightZero ≤ boostWeightSubmodule 0 := by + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) + · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusX_mem + fieldStrengthMinusX_mem + · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusX_mem + fieldStrengthMinusY_mem + · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusY_mem + fieldStrengthMinusX_mem + · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusY_mem + fieldStrengthMinusY_mem + · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthTransverse_mem + fieldStrengthTransverse_mem + · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthTransverse_mem + fieldStrengthLongitudinal_mem + · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthLongitudinal_mem + fieldStrengthLongitudinal_mem + +/-- The weight-zero pairs are products of two field strengths. -/ +lemma span_fieldStrengthPairsWeightZero_le : + Submodule.span ℂ fieldStrengthPairsWeightZero ≤ Submodule.span ℂ fieldStrengthPairs := by + rw [span_fieldStrengthPairs] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) + · exact Submodule.mul_mem_mul fieldStrengthPlusX_mem_span fieldStrengthMinusX_mem_span + · exact Submodule.mul_mem_mul fieldStrengthPlusX_mem_span fieldStrengthMinusY_mem_span + · exact Submodule.mul_mem_mul fieldStrengthPlusY_mem_span fieldStrengthMinusX_mem_span + · exact Submodule.mul_mem_mul fieldStrengthPlusY_mem_span fieldStrengthMinusY_mem_span + · exact Submodule.mul_mem_mul fieldStrengthTransverse_mem_span fieldStrengthTransverse_mem_span + · exact Submodule.mul_mem_mul fieldStrengthTransverse_mem_span + fieldStrengthLongitudinal_mem_span + · exact Submodule.mul_mem_mul fieldStrengthLongitudinal_mem_span + fieldStrengthLongitudinal_mem_span + +/-! + +## D. The weight zero part of the photon pairs + +-/ + +/-- **The boost weight zero part of the photon pairs.** An element of the span of the products + `F_{μν} F_{μ'ν'}` has boost weight zero exactly when it is a combination of the seven products + of `fieldStrengthPairsWeightZero`. + + The inclusion of the right-hand side is the two membership lemmas above. For the other, the + span of the products decomposes into the weights `0, ±2, ±4` by `span_fieldStrengthPairs_le`; + boost weight zero is disjoint from the sum of the nonzero weights by + `boostWeightSubmodule_iSupIndep`, and the modular law removes it. -/ +theorem boostWeight_inter_fieldStrength : + boostWeightSubmodule 0 ⊓ Submodule.span ℂ fieldStrengthPairs = + Submodule.span ℂ fieldStrengthPairsWeightZero := by + refine le_antisymm ?_ (le_inf span_fieldStrengthPairsWeightZero_le_boostWeightSubmodule + span_fieldStrengthPairsWeightZero_le) + calc boostWeightSubmodule 0 ⊓ Submodule.span ℂ fieldStrengthPairs + ≤ boostWeightSubmodule 0 ⊓ (Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ + ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j) := + inf_le_inf_left _ span_fieldStrengthPairs_le + _ = (Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ + ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j) ⊓ boostWeightSubmodule 0 := inf_comm _ _ + _ = Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ + ((⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j) ⊓ boostWeightSubmodule 0) := + sup_inf_assoc_of_le _ span_fieldStrengthPairsWeightZero_le_boostWeightSubmodule + _ = Submodule.span ℂ fieldStrengthPairsWeightZero := by + rw [disjoint_iff.mp (boostWeightSubmodule_iSupIndep 0).symm, sup_bot_eq] + +end JetAlgebra + +end LeptonGaugeSector + +end From 9daa3c20d82608bee980a3d346e9a6787bb4be1c Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 11 Aug 2026 07:58:12 +0100 Subject: [PATCH 125/254] feat: Improve BoostWeightSubMod --- .../JetAlgebra/Grading/BoostWeightSubMod.lean | 870 ++++++++---------- 1 file changed, 368 insertions(+), 502 deletions(-) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean index 0fd82750a..bdc250821 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean @@ -7,539 +7,405 @@ module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight /-! -# The boost weight zero part of the photon pairs +# The boost weight zero parts of the photon pairs and the fermion kinetic bilinears -The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra. This -file computes its intersection with the boost weight zero submodule: it is spanned by seven -explicit products, listed in `fieldStrengthPairsWeightZero`. +The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra, as do +the fermion kinetic bilinears `ψ̄_α ∂_μ ψ_β`. This file computes the intersections of these spans +with the boost weight zero submodule: they are spanned by seven, respectively six, explicit +products, and both spans are written out in the statements of the two theorems below. *The proof is a certificate.* Rather than deducing the intersection abstractly, the span of the -products is written out in boost eigenvectors. The coordinate components `F_{μν}` are not boost +products is expanded into boost eigenvectors. The coordinate components `F_{μν}` are not boost eigenvectors, but six combinations of them are: the light-cone combinations `F_{0x} - F_{zx}` and `F_{0y} - F_{zy}` of weight `2`, their partners `F_{0x} + F_{zx}` and `F_{0y} + F_{zy}` of weight `-2`, and the two components with no free light-cone index, `F_{xy}` and `F_{0z}`, of weight `0`. -Every `F_{μν}` is a combination of these six — the sixteen cases of `fieldStrengthSpan_le` — so -the span of the products is contained in the sum of the nine products of the three weight spaces, -whose weights are `0, ±2, ±4`. The three of weight zero — a weight-`2` field strength against a -weight-`-2` one, and two weight-zero ones — are exactly the seven products listed. +Every `F_{μν}` is a combination of these six — the sixteen cases of step B — so the span of the +products lies in the sum of the nine products of the three weight spaces, of weights `0, ±2, ±4`. +The three of weight zero — a weight-`2` field strength against a weight-`-2` one, and two +weight-zero ones — are exactly the seven products listed. The intersection then follows formally, with no linear independence of the products needed. The weight submodules are independent (`boostWeightSubmodule_iSupIndep`), so boost weight zero is disjoint from the span of the weights `±2, ±4`; since the weight-zero part sits inside boost weight zero, the modular law cuts the intersection down to it. +The fermion bilinears follow the same pattern with less bookkeeping: the left factors `ψ̄_α` are +already eigenvectors of weight `∓1`, and on `∂_μ ψ_β` the spinor index contributes `∓1` while the +light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. The six weight-zero bilinears are +listed as `±`-pairs grouped into a `∂_0/∂_z` block and `∂_x`, `∂_y` blocks, adapted to a later +restriction by the boost weights in the `x`- and `y`-directions. + ## i. Overview -Section A exhibits the six boost eigenvectors, section B decomposes every coordinate component -into them, section C multiplies the weight spaces together and reads off the weight of each of -the nine products, and section D assembles the intersection. +Each proof runs in four steps, marked in its source. Step A exhibits the boost eigenvectors, +step B decomposes the coordinate components (or, for the bilinears, spans the weight-zero +products), step C splits every product into eigen products of a single weight, and step D +assembles the intersection. ## ii. Key results -- `JetAlgebra.fieldStrengthPlusX` and its five partners : the boost eigenvectors among the - field strengths, of weights `2`, `-2` and `0`. -- `JetAlgebra.fieldStrengthSpan_le` : every field strength is a combination of the six. -- `JetAlgebra.fieldStrengthPairs` : the products `F_{μν} F_{μ'ν'}`. -- `JetAlgebra.fieldStrengthPairsWeightZero` : the seven products of boost weight zero. -- `JetAlgebra.span_fieldStrengthPairs_le` : the span of the products, split into its weights. - `JetAlgebra.boostWeight_inter_fieldStrength` : the intersection of boost weight zero with the - span of the products is the span of the seven. - -## iii. Table of contents - -- A. The boost eigenvectors among the field strengths -- B. Every field strength is a combination of the eigenvectors -- C. Products of two field strengths -- D. The weight zero part of the photon pairs + span of the products `F_{μν} F_{μ'ν'}` is the span of the seven weight-zero products. +- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term` : the intersection of boost weight zero + with the span of the bilinears `ψ̄_α ∂_μ ψ_β` is the span of six explicit bilinears, paired + into blocks adapted to the boosts in the `x`- and `y`-directions. -/ @[expose] public section +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false +set_option linter.unnecessarySeqFocus false + namespace LeptonGaugeSector open TensorProduct StandardModel -open scoped minkowskiMatrix PauliMatrix +open scoped minkowskiMatrix PauliMatrix Pointwise open Matrix MatrixGroups namespace JetAlgebra -open scoped Pointwise - -/-! - -## A. The boost eigenvectors among the field strengths - -A boost in the `z`-direction mixes the time index with the `z` index, so the coordinate -components of the field strength are not boost eigenvectors. Six combinations of them are: the -four light-cone combinations, of weight `±2`, and the two components whose index pair is either -transverse to the boost or contained in the `0z` plane, of weight `0`. - --/ - -/-- `F_{0x} - F_{zx}`, of boost weight `2`. -/ -noncomputable def fieldStrengthPlusX : JetAlgebra := - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) - -/-- `F_{0y} - F_{zy}`, of boost weight `2`. -/ -noncomputable def fieldStrengthPlusY : JetAlgebra := - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) - -/-- `F_{0x} + F_{zx}`, of boost weight `-2`. -/ -noncomputable def fieldStrengthMinusX : JetAlgebra := - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) - -/-- `F_{0y} + F_{zy}`, of boost weight `-2`. -/ -noncomputable def fieldStrengthMinusY : JetAlgebra := - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) - -/-- `F_{xy}`, of boost weight `0`. -/ -noncomputable def fieldStrengthTransverse : JetAlgebra := - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) - -/-- `F_{0z}`, of boost weight `0`. -/ -noncomputable def fieldStrengthLongitudinal : JetAlgebra := - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - -/-- `F_{0x} - F_{zx}` has boost weight `2`. -/ -lemma fieldStrengthPlusX_mem : fieldStrengthPlusX ∈ boostWeightSubmodule 2 := - fieldStrengthDeriv_lightCone_mem_two - -/-- `F_{0x} + F_{zx}` has boost weight `-2`. -/ -lemma fieldStrengthMinusX_mem : fieldStrengthMinusX ∈ boostWeightSubmodule (-2) := - fieldStrengthDeriv_lightCone_mem_neg_two - -/-- `F_{xy}` has boost weight `0`: both indices are transverse to the boost. -/ -lemma fieldStrengthTransverse_mem : fieldStrengthTransverse ∈ boostWeightSubmodule 0 := - fieldStrengthDeriv_transverse_mem_zero - -/-- `F_{0y} - F_{zy}` has boost weight `2`. -/ -lemma fieldStrengthPlusY_mem : fieldStrengthPlusY ∈ boostWeightSubmodule 2 := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [fieldStrengthPlusY, map_sub, repLorentzGroup_fieldStrengthDeriv_nil, - repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- `F_{0y} + F_{zy}` has boost weight `-2`. -/ -lemma fieldStrengthMinusY_mem : fieldStrengthMinusY ∈ boostWeightSubmodule (-2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [fieldStrengthMinusY, map_add, repLorentzGroup_fieldStrengthDeriv_nil, - repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- `F_{0z}` has boost weight `0`: the boost acts on its two indices by inverse factors. -/ -lemma fieldStrengthLongitudinal_mem : fieldStrengthLongitudinal ∈ boostWeightSubmodule 0 := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [fieldStrengthLongitudinal, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, zero_mul, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] - push_cast - match_scalars - field_simp - ring - -/-! - -## B. Every field strength is a combination of the eigenvectors - -The six eigenvectors span the same submodule as the sixteen coordinate components: on the -light-cone pairs this is the change of basis `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` -and its partners, and the remaining components are either zero, one of the two weight-zero -eigenvectors, or minus one of these by antisymmetry. - --/ - -/-- The span of the two weight-`2` field strengths. -/ -noncomputable def fieldStrengthSpanTwo : Submodule ℂ JetAlgebra := - Submodule.span ℂ {fieldStrengthPlusX, fieldStrengthPlusY} - -/-- The span of the two weight-`0` field strengths. -/ -noncomputable def fieldStrengthSpanZero : Submodule ℂ JetAlgebra := - Submodule.span ℂ {fieldStrengthTransverse, fieldStrengthLongitudinal} - -/-- The span of the two weight-`-2` field strengths. -/ -noncomputable def fieldStrengthSpanNegTwo : Submodule ℂ JetAlgebra := - Submodule.span ℂ {fieldStrengthMinusX, fieldStrengthMinusY} - -/-- The span of the field strengths `F_{μν}`. -/ -noncomputable def fieldStrengthSpan : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} - -/-- The weight-`2` field strengths span a submodule of boost weight `2`. -/ -lemma fieldStrengthSpanTwo_le : fieldStrengthSpanTwo ≤ boostWeightSubmodule 2 := by - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · exact fieldStrengthPlusX_mem - · exact fieldStrengthPlusY_mem - -/-- The weight-`0` field strengths span a submodule of boost weight `0`. -/ -lemma fieldStrengthSpanZero_le : fieldStrengthSpanZero ≤ boostWeightSubmodule 0 := by - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · exact fieldStrengthTransverse_mem - · exact fieldStrengthLongitudinal_mem - -/-- The weight-`-2` field strengths span a submodule of boost weight `-2`. -/ -lemma fieldStrengthSpanNegTwo_le : fieldStrengthSpanNegTwo ≤ boostWeightSubmodule (-2) := by - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · exact fieldStrengthMinusX_mem - · exact fieldStrengthMinusY_mem - -/-- Every field strength is a combination of the six boost eigenvectors. -/ -lemma fieldStrengthSpan_le : - fieldStrengthSpan ≤ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ fieldStrengthSpanNegTwo := by - have hPX : fieldStrengthPlusX ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ - fieldStrengthSpanNegTwo := - Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) - have hPY : fieldStrengthPlusY ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ - fieldStrengthSpanNegTwo := - Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) - have hT : fieldStrengthTransverse ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ - fieldStrengthSpanNegTwo := - Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) - have hL : fieldStrengthLongitudinal ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ - fieldStrengthSpanNegTwo := - Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) - have hMX : fieldStrengthMinusX ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ - fieldStrengthSpanNegTwo := - Submodule.mem_sup_right (Submodule.subset_span (by simp)) - have hMY : fieldStrengthMinusY ∈ fieldStrengthSpanTwo ⊔ fieldStrengthSpanZero ⊔ - fieldStrengthSpanNegTwo := - Submodule.mem_sup_right (Submodule.subset_span (by simp)) - refine Submodule.span_le.2 ?_ - rintro x ⟨μ, ν, rfl⟩ - match μ, ν with - | Sum.inl 0, Sum.inl 0 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ - | Sum.inr 0, Sum.inr 0 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ - | Sum.inr 1, Sum.inr 1 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ - | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact Submodule.zero_mem _ - | Sum.inl 0, Sum.inr 0 => - rw [show fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = - (2⁻¹ : ℂ) • (fieldStrengthPlusX + fieldStrengthMinusX) from by - rw [fieldStrengthPlusX, fieldStrengthMinusX]; module] - exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPX hMX) - | Sum.inr 0, Sum.inl 0 => - rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - (-2⁻¹ : ℂ) • (fieldStrengthPlusX + fieldStrengthMinusX) from by - rw [fieldStrengthPlusX, fieldStrengthMinusX, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0)]; module] - exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPX hMX) - | Sum.inl 0, Sum.inr 1 => - rw [show fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = - (2⁻¹ : ℂ) • (fieldStrengthPlusY + fieldStrengthMinusY) from by - rw [fieldStrengthPlusY, fieldStrengthMinusY]; module] - exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPY hMY) - | Sum.inr 1, Sum.inl 0 => - rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - (-2⁻¹ : ℂ) • (fieldStrengthPlusY + fieldStrengthMinusY) from by - rw [fieldStrengthPlusY, fieldStrengthMinusY, - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1)]; module] - exact Submodule.smul_mem _ _ (Submodule.add_mem _ hPY hMY) - | Sum.inr 2, Sum.inr 0 => - rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - (2⁻¹ : ℂ) • (fieldStrengthMinusX - fieldStrengthPlusX) from by - rw [fieldStrengthPlusX, fieldStrengthMinusX]; module] - exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hMX hPX) - | Sum.inr 0, Sum.inr 2 => - rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) = - (2⁻¹ : ℂ) • (fieldStrengthPlusX - fieldStrengthMinusX) from by - rw [fieldStrengthPlusX, fieldStrengthMinusX, - fieldStrengthDeriv_antisymm {} (Sum.inr 2) (Sum.inr 0)]; module] - exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hPX hMX) - | Sum.inr 2, Sum.inr 1 => - rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - (2⁻¹ : ℂ) • (fieldStrengthMinusY - fieldStrengthPlusY) from by - rw [fieldStrengthPlusY, fieldStrengthMinusY]; module] - exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hMY hPY) - | Sum.inr 1, Sum.inr 2 => - rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) = - (2⁻¹ : ℂ) • (fieldStrengthPlusY - fieldStrengthMinusY) from by - rw [fieldStrengthPlusY, fieldStrengthMinusY, - fieldStrengthDeriv_antisymm {} (Sum.inr 2) (Sum.inr 1)]; module] - exact Submodule.smul_mem _ _ (Submodule.sub_mem _ hPY hMY) - | Sum.inr 0, Sum.inr 1 => exact hT - | Sum.inr 1, Sum.inr 0 => - rw [fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1)] - exact neg_mem hT - | Sum.inl 0, Sum.inr 2 => exact hL - | Sum.inr 2, Sum.inl 0 => - rw [fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] - exact neg_mem hL - -/-! - -## C. Products of two field strengths - -The span of the products is the product of the span of the field strengths with itself, so it is -contained in the product of the sum of the three weight spaces with itself. That expands into -nine products of weight spaces, and boost weights add under multiplication, so each of the nine -carries a single weight: `0` for the three products of a weight `w` space with a weight `-w` one, -and `±2` or `±4` for the other six. - --/ - -/-- Each field strength lies in the field-strength span. -/ -lemma fieldStrengthDeriv_mem_span (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {} μ ν ∈ fieldStrengthSpan := - Submodule.subset_span ⟨μ, ν, rfl⟩ - -/-- The weight-`2` eigenvector `F_{0x} - F_{zx}` lies in the field-strength span. -/ -lemma fieldStrengthPlusX_mem_span : fieldStrengthPlusX ∈ fieldStrengthSpan := - Submodule.sub_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) - -/-- The weight-`2` eigenvector `F_{0y} - F_{zy}` lies in the field-strength span. -/ -lemma fieldStrengthPlusY_mem_span : fieldStrengthPlusY ∈ fieldStrengthSpan := - Submodule.sub_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) - -/-- The weight-`-2` eigenvector `F_{0x} + F_{zx}` lies in the field-strength span. -/ -lemma fieldStrengthMinusX_mem_span : fieldStrengthMinusX ∈ fieldStrengthSpan := - Submodule.add_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) - -/-- The weight-`-2` eigenvector `F_{0y} + F_{zy}` lies in the field-strength span. -/ -lemma fieldStrengthMinusY_mem_span : fieldStrengthMinusY ∈ fieldStrengthSpan := - Submodule.add_mem _ (fieldStrengthDeriv_mem_span _ _) (fieldStrengthDeriv_mem_span _ _) - -/-- `F_{xy}` lies in the field-strength span. -/ -lemma fieldStrengthTransverse_mem_span : fieldStrengthTransverse ∈ fieldStrengthSpan := - fieldStrengthDeriv_mem_span _ _ - -/-- `F_{0z}` lies in the field-strength span. -/ -lemma fieldStrengthLongitudinal_mem_span : fieldStrengthLongitudinal ∈ fieldStrengthSpan := - fieldStrengthDeriv_mem_span _ _ - -/-- Elements of the field-strength span commute. -/ -lemma mul_comm_of_mem_fieldStrengthSpan {x y : JetAlgebra} (hx : x ∈ fieldStrengthSpan) - (hy : y ∈ fieldStrengthSpan) : x * y = y * x := by - induction hx using Submodule.span_induction with - | mem a ha => - obtain ⟨μ, ν, rfl⟩ := ha - induction hy using Submodule.span_induction with - | mem b hb => - obtain ⟨μ', ν', rfl⟩ := hb - exact fieldStrengthDeriv_mul_comm {} {} μ ν μ' ν' - | zero => rw [mul_zero, zero_mul] - | add u v _ _ ihu ihv => rw [mul_add, add_mul, ihu, ihv] - | smul c u _ ihu => rw [mul_smul_comm, smul_mul_assoc, ihu] - | zero => rw [mul_zero, zero_mul] - | add u v _ _ ihu ihv => rw [mul_add, add_mul, ihu, ihv] - | smul c u _ ihu => rw [mul_smul_comm, smul_mul_assoc, ihu] - -/-- Boost weights add under multiplication. -/ -lemma mul_mem_boostWeightSubmodule' {k l m : ℤ} (hm : k + l = m) {x y : JetAlgebra} - (hx : x ∈ boostWeightSubmodule k) (hy : y ∈ boostWeightSubmodule l) : - x * y ∈ boostWeightSubmodule m := by - rw [← hm] - exact mul_mem_boostWeightSubmodule hx hy - -/-- Boost weights add under the product of submodules. -/ -lemma mul_le_boostWeightSubmodule {X Y : Submodule ℂ JetAlgebra} {k l m : ℤ} (hm : k + l = m) - (hX : X ≤ boostWeightSubmodule k) (hY : Y ≤ boostWeightSubmodule l) : - X * Y ≤ boostWeightSubmodule m := by - rw [← hm] - exact Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy) - -/-- The products `F_{μν} F_{μ'ν'}` of two field strengths. -/ -def fieldStrengthPairs : Set JetAlgebra := - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} - -/-- The products of two field strengths which are of boost weight zero: a weight-`2` light-cone - field strength against a weight-`-2` one, or a pair drawn from `F_{xy}` and `F_{0z}`. -/ -def fieldStrengthPairsWeightZero : Set JetAlgebra := - {fieldStrengthPlusX * fieldStrengthMinusX, fieldStrengthPlusX * fieldStrengthMinusY, - fieldStrengthPlusY * fieldStrengthMinusX, fieldStrengthPlusY * fieldStrengthMinusY, - fieldStrengthTransverse * fieldStrengthTransverse, - fieldStrengthTransverse * fieldStrengthLongitudinal, - fieldStrengthLongitudinal * fieldStrengthLongitudinal} - -/-- The span of the products of two field strengths is the product of the field-strength span - with itself. -/ -lemma span_fieldStrengthPairs : - Submodule.span ℂ fieldStrengthPairs = fieldStrengthSpan * fieldStrengthSpan := by - rw [fieldStrengthSpan, Submodule.span_mul_span] - congr 1 - ext x - constructor - · rintro ⟨μ, ν, μ', ν', rfl⟩ - exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ - · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩ - exact ⟨μ, ν, μ', ν', rfl⟩ - -/-- A weight-`2` field strength times a weight-`-2` one is one of the weight-zero pairs. -/ -lemma fieldStrengthSpanTwo_mul_NegTwo_le : - fieldStrengthSpanTwo * fieldStrengthSpanNegTwo ≤ - Submodule.span ℂ fieldStrengthPairsWeightZero := by - rw [fieldStrengthSpanTwo, fieldStrengthSpanNegTwo, Submodule.span_mul_span] - refine Submodule.span_le.2 ?_ - rintro x ⟨a, ha, b, hb, rfl⟩ - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb - rcases ha with rfl | rfl <;> rcases hb with rfl | rfl <;> - exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - -/-- The same product in the other order, using that the field strengths commute. -/ -lemma fieldStrengthSpanNegTwo_mul_Two_le : - fieldStrengthSpanNegTwo * fieldStrengthSpanTwo ≤ - Submodule.span ℂ fieldStrengthPairsWeightZero := by - rw [fieldStrengthSpanTwo, fieldStrengthSpanNegTwo, Submodule.span_mul_span] - refine Submodule.span_le.2 ?_ - rintro x ⟨a, ha, b, hb, rfl⟩ - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb - rcases ha with rfl | rfl <;> rcases hb with rfl | rfl <;> beta_reduce - · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusX_mem_span - fieldStrengthPlusX_mem_span] - exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusX_mem_span - fieldStrengthPlusY_mem_span] - exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusY_mem_span - fieldStrengthPlusX_mem_span] - exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthMinusY_mem_span - fieldStrengthPlusY_mem_span] - exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - -/-- Two transverse field strengths multiply into the weight-zero pairs. -/ -lemma fieldStrengthSpanZero_mul_Zero_le : - fieldStrengthSpanZero * fieldStrengthSpanZero ≤ - Submodule.span ℂ fieldStrengthPairsWeightZero := by - rw [fieldStrengthSpanZero, Submodule.span_mul_span] - refine Submodule.span_le.2 ?_ - rintro x ⟨a, ha, b, hb, rfl⟩ - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb - rcases ha with rfl | rfl <;> rcases hb with rfl | rfl <;> beta_reduce - · exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - · exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - · rw [mul_comm_of_mem_fieldStrengthSpan fieldStrengthLongitudinal_mem_span - fieldStrengthTransverse_mem_span] - exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - · exact Submodule.subset_span (by simp [fieldStrengthPairsWeightZero]) - -/-- The span of the products of two field strengths, split into its boost weights: the - weight-zero pairs together with the weights `±2` and `±4`. -/ -lemma span_fieldStrengthPairs_le : - Submodule.span ℂ fieldStrengthPairs ≤ - Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ - ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := by - have hrest : ∀ k : ℤ, k ≠ 0 → boostWeightSubmodule k ≤ - ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := - fun k hk => le_iSup_of_le k (le_iSup_of_le hk le_rfl) - rw [span_fieldStrengthPairs] - refine (Submodule.mul_le.2 fun _ hx _ hy => - Submodule.mul_mem_mul (fieldStrengthSpan_le hx) (fieldStrengthSpan_le hy)).trans ?_ - simp only [Submodule.sup_mul, Submodule.mul_sup] - repeat' apply sup_le - · -- `(+2) + (+2) = 4` - exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanTwo_le - fieldStrengthSpanTwo_le).trans (hrest _ (by norm_num))) - · -- `0 + (+2) = 2` - exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanZero_le - fieldStrengthSpanTwo_le).trans (hrest _ (by norm_num))) - · -- `(-2) + (+2) = 0` - exact le_sup_of_le_left fieldStrengthSpanNegTwo_mul_Two_le - · -- `(+2) + 0 = 2` - exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanTwo_le - fieldStrengthSpanZero_le).trans (hrest _ (by norm_num))) - · -- `0 + 0 = 0` - exact le_sup_of_le_left fieldStrengthSpanZero_mul_Zero_le - · -- `(-2) + 0 = -2` - exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanNegTwo_le - fieldStrengthSpanZero_le).trans (hrest _ (by norm_num))) - · -- `(+2) + (-2) = 0` - exact le_sup_of_le_left fieldStrengthSpanTwo_mul_NegTwo_le - · -- `0 + (-2) = -2` - exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanZero_le - fieldStrengthSpanNegTwo_le).trans (hrest _ (by norm_num))) - · -- `(-2) + (-2) = -4` - exact le_sup_of_le_right ((mul_le_boostWeightSubmodule rfl fieldStrengthSpanNegTwo_le - fieldStrengthSpanNegTwo_le).trans (hrest _ (by norm_num))) - -/-- The weight-zero pairs have boost weight zero. -/ -lemma span_fieldStrengthPairsWeightZero_le_boostWeightSubmodule : - Submodule.span ℂ fieldStrengthPairsWeightZero ≤ boostWeightSubmodule 0 := by - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) - · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusX_mem - fieldStrengthMinusX_mem - · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusX_mem - fieldStrengthMinusY_mem - · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusY_mem - fieldStrengthMinusX_mem - · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthPlusY_mem - fieldStrengthMinusY_mem - · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthTransverse_mem - fieldStrengthTransverse_mem - · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthTransverse_mem - fieldStrengthLongitudinal_mem - · exact mul_mem_boostWeightSubmodule' (by norm_num) fieldStrengthLongitudinal_mem - fieldStrengthLongitudinal_mem - -/-- The weight-zero pairs are products of two field strengths. -/ -lemma span_fieldStrengthPairsWeightZero_le : - Submodule.span ℂ fieldStrengthPairsWeightZero ≤ Submodule.span ℂ fieldStrengthPairs := by - rw [span_fieldStrengthPairs] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) - · exact Submodule.mul_mem_mul fieldStrengthPlusX_mem_span fieldStrengthMinusX_mem_span - · exact Submodule.mul_mem_mul fieldStrengthPlusX_mem_span fieldStrengthMinusY_mem_span - · exact Submodule.mul_mem_mul fieldStrengthPlusY_mem_span fieldStrengthMinusX_mem_span - · exact Submodule.mul_mem_mul fieldStrengthPlusY_mem_span fieldStrengthMinusY_mem_span - · exact Submodule.mul_mem_mul fieldStrengthTransverse_mem_span fieldStrengthTransverse_mem_span - · exact Submodule.mul_mem_mul fieldStrengthTransverse_mem_span - fieldStrengthLongitudinal_mem_span - · exact Submodule.mul_mem_mul fieldStrengthLongitudinal_mem_span - fieldStrengthLongitudinal_mem_span - -/-! - -## D. The weight zero part of the photon pairs - --/ - /-- **The boost weight zero part of the photon pairs.** An element of the span of the products - `F_{μν} F_{μ'ν'}` has boost weight zero exactly when it is a combination of the seven products - of `fieldStrengthPairsWeightZero`. - - The inclusion of the right-hand side is the two membership lemmas above. For the other, the - span of the products decomposes into the weights `0, ±2, ±4` by `span_fieldStrengthPairs_le`; - boost weight zero is disjoint from the sum of the nonzero weights by - `boostWeightSubmodule_iSupIndep`, and the modular law removes it. -/ + `F_{μν} F_{μ'ν'}` of two field strengths has boost weight zero exactly when it is a combination + of the seven products of a weight-`2` light-cone field strength `F_{0x} - F_{zx}`, + `F_{0y} - F_{zy}` with a weight-`-2` one `F_{0x} + F_{zx}`, `F_{0y} + F_{zy}`, and of the + weight-zero components `F_{xy}` and `F_{0z}` with each other. -/ theorem boostWeight_inter_fieldStrength : - boostWeightSubmodule 0 ⊓ Submodule.span ℂ fieldStrengthPairs = - Submodule.span ℂ fieldStrengthPairsWeightZero := by - refine le_antisymm ?_ (le_inf span_fieldStrengthPairsWeightZero_le_boostWeightSubmodule - span_fieldStrengthPairsWeightZero_le) - calc boostWeightSubmodule 0 ⊓ Submodule.span ℂ fieldStrengthPairs - ≤ boostWeightSubmodule 0 ⊓ (Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ - ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j) := - inf_le_inf_left _ span_fieldStrengthPairs_le - _ = (Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ - ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j) ⊓ boostWeightSubmodule 0 := inf_comm _ _ - _ = Submodule.span ℂ fieldStrengthPairsWeightZero ⊔ - ((⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j) ⊓ boostWeightSubmodule 0) := - sup_inf_assoc_of_le _ span_fieldStrengthPairsWeightZero_le_boostWeightSubmodule - _ = Submodule.span ℂ fieldStrengthPairsWeightZero := by - rw [disjoint_iff.mp (boostWeightSubmodule_iSupIndep 0).symm, sup_bot_eq] + boostWeightSubmodule 0 ⊓ Submodule.span ℂ + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = + Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)), + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1), + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)} := by + -- ### A. The boost eigenvectors among the field strengths + -- The light-cone combinations `F_{0i} ∓ F_{zi}` have weight `±2`; `F_{xy}` and `F_{0z}`, with + -- no free light-cone index, have weight `0`. + set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hPX + set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hPY + set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hMX + set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hMY + set T := fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hT + set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) with hL + set FF : Set JetAlgebra := + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF + set S : Set JetAlgebra := {PX * MX, PX * MY, PY * MX, PY * MY, T * T, T * L, L * L} with hS + have hPXw : PX ∈ boostWeightSubmodule 2 := fieldStrengthDeriv_lightCone_mem_two + have hMXw : MX ∈ boostWeightSubmodule (-2) := fieldStrengthDeriv_lightCone_mem_neg_two + have hTw : T ∈ boostWeightSubmodule 0 := fieldStrengthDeriv_transverse_mem_zero + obtain ⟨hPYw, hMYw, hLw⟩ : PY ∈ boostWeightSubmodule 2 ∧ MY ∈ boostWeightSubmodule (-2) ∧ + L ∈ boostWeightSubmodule 0 := by + refine ⟨?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hPY, hMY, hL, map_sub, map_add, repLorentzGroup_fieldStrengthDeriv_nil, + toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + boostMatZ, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + try rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] + push_cast + match_scalars <;> (field_simp; ring) + -- ### B. Every field strength is a combination of the eigenvectors + -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its + -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. + set A := Submodule.span ℂ {PX, PY} with hA + set B := Submodule.span ℂ {T, L} with hB + set C := Submodule.span ℂ {MX, MY} with hC + set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV + have hAle : A ≤ boostWeightSubmodule 2 := by + rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) + have hBle : B ≤ boostWeightSubmodule 0 := by + rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) + have hCle : C ≤ boostWeightSubmodule (-2) := by + rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) + have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left + have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left + have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right + have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) + have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) + have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) + have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) + have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) + have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) + have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → + x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by + rintro u v x c d hu hv rfl + exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) + have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → + v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → + fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by + intro u v c d μ ν hu hv h + rw [fieldStrengthDeriv_antisymm, h] + exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) + have hVle : V ≤ A ⊔ B ⊔ C := by + rw [hV] + refine Submodule.span_le.2 ?_ + rintro x ⟨μ, ν, rfl⟩ + match μ, ν with + | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 + | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ + | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 2, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 0, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 2, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 1, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 0, Sum.inr 1 => exact hTV + | Sum.inr 1, Sum.inr 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV + | Sum.inl 0, Sum.inr 2 => exact hLV + | Sum.inr 2, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV + -- ### C. Products of two field strengths + -- The span of the products is `V * V ≤ (A ⊔ B ⊔ C) * (A ⊔ B ⊔ C)`, nine products of weight + -- spaces each of a single weight: `A * C`, `C * A` and `B * B` land in the seven products + -- (using that the field strengths commute), the other six in the nonzero weights. + have hFV : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ V := fun μ ν => by + rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩ + have hPXV' : PX ∈ V := by rw [hPX]; exact sub_mem (hFV _ _) (hFV _ _) + have hPYV' : PY ∈ V := by rw [hPY]; exact sub_mem (hFV _ _) (hFV _ _) + have hMXV' : MX ∈ V := by rw [hMX]; exact add_mem (hFV _ _) (hFV _ _) + have hMYV' : MY ∈ V := by rw [hMY]; exact add_mem (hFV _ _) (hFV _ _) + have hTV' : T ∈ V := hFV _ _ + have hLV' : L ∈ V := hFV _ _ + have hcomm : ∀ x ∈ V, ∀ y ∈ V, x * y = y * x := by + intro x hx y hy + rw [hV] at hx hy + induction hx, hy using Submodule.span_induction₂ with + | mem_mem a b ha hb => + obtain ⟨μ, ν, rfl⟩ := ha; obtain ⟨μ', ν', rfl⟩ := hb + exact fieldStrengthDeriv_mul_comm _ _ _ _ _ _ + | zero_left => rw [zero_mul, mul_zero] + | zero_right => rw [zero_mul, mul_zero] + | add_left _ _ _ _ _ _ h₁ h₂ => rw [add_mul, mul_add, h₁, h₂] + | add_right _ _ _ _ _ _ h₁ h₂ => rw [mul_add, add_mul, h₁, h₂] + | smul_left _ _ _ _ _ h => rw [smul_mul_assoc, mul_smul_comm, h] + | smul_right _ _ _ _ _ h => rw [mul_smul_comm, smul_mul_assoc, h] + have hspan : Submodule.span ℂ FF = V * V := by + rw [hV, hFF, Submodule.span_mul_span] + congr 1 + ext x + constructor + · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ + · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ + have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule k → + Y ≤ boostWeightSubmodule l → k + l ≠ 0 → + X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := + fun hX hY h => le_sup_of_le_right + ((Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy)).trans + (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) + have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → + a * b ∈ Submodule.span ℂ S := fun ha hb h => by + rw [hcomm _ ha _ hb]; exact Submodule.subset_span h + obtain ⟨hAC, hCA, hBB⟩ : A * C ≤ Submodule.span ℂ S ∧ C * A ≤ Submodule.span ℂ S ∧ + B * B ≤ Submodule.span ℂ S := by + refine ⟨?_, ?_, ?_⟩ <;> + simp only [hA, hB, hC, Submodule.span_mul_span] <;> + refine Submodule.span_le.2 ?_ <;> + rintro x ⟨a, rfl | rfl, b, rfl | rfl, rfl⟩ + -- `A * C` and `B * B` are products in `S`; `C * A` needs one commutation each + exacts [Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + hsub hMXV' hPXV' (by simp [hS]), hsub hMXV' hPYV' (by simp [hS]), + hsub hMYV' hPXV' (by simp [hS]), hsub hMYV' hPYV' (by simp [hS]), + Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] + have hkey : Submodule.span ℂ FF ≤ + Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := by + rw [hspan] + refine (Submodule.mul_le.2 fun _ hx _ hy => + Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ + simp only [Submodule.sup_mul, Submodule.mul_sup] + repeat' apply sup_le + -- the weights `AA, BA, CA, AB, BB, CB, AC, BC, CC = 4, 2, 0, 2, 0, -2, 0, -2, -4` + exacts [hne hAle hAle (by norm_num), hne hBle hAle (by norm_num), le_sup_of_le_left hCA, + hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), + le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] + -- ### D. The weight zero part of the photon pairs + -- The seven products have weight zero and are photon pairs, which is one inclusion. For the + -- other, weight zero is disjoint from the sum of the nonzero weights by + -- `boostWeightSubmodule_iSupIndep`, and the modular law removes it from the splitting above. + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule k → + y ∈ boostWeightSubmodule l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> + exact hz (by assumption) (by assumption) (by norm_num) + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hspan, hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> + exact Submodule.mul_mem_mul (by assumption) (by assumption) + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep 0).symm, sup_bot_eq] + +/-- **The boost weight zero part of the fermion kinetic bilinears.** An element of the span of + the products `ψ̄_α ∂_μ ψ_β` has boost weight zero exactly when it is a combination of the six + bilinears listed. Both spinor indices carry `z`-boost weight `∓1` for the index `0, 1` and the + derivative index carries `±2` on the light-cone combinations `∂_0 ∓ ∂_z` and `0` on `∂_x, ∂_y`, + so the weight-zero bilinears pair the spinor indices `(0,0)` and `(1,1)` with the matching + light-cone derivative and the mixed spinor indices with a transverse derivative. + + The six spanning elements are chosen with the later restriction by the boost weights in the + `x`- and `y`-directions in mind: they pair into a `∂_0/∂_z` block and `∂_x` and `∂_y` blocks, + and in each transverse block the two sign combinations `ψ̄_0 ∂_i ψ_1 ± ψ̄_1 ∂_i ψ_0` split the + spinor content into the part that is diagonal for the boost in the `i`-direction and the part + that is not, so their weight decompositions in those directions are immediate. -/ +theorem boostWeight_inter_fermionic_kinetic_term : + boostWeightSubmodule 0 ⊓ Submodule.span ℂ + {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = + Submodule.span ℂ + {Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) + + Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), + Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) - + Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), + Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0, + Dbarψ [] 0 * Dψ [Sum.inr 0] 1 - Dbarψ [] 1 * Dψ [Sum.inr 0] 0, + Dbarψ [] 0 * Dψ [Sum.inr 1] 1 + Dbarψ [] 1 * Dψ [Sum.inr 1] 0, + Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0} := by + -- ### A. The boost eigenvectors among the first-order fermion coordinates + -- `ψ̄_α` is an eigenvector of weight `∓1` for `α = 0, 1`; on `∂_μ ψ_β` the spinor index + -- contributes `∓1` and the light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. + set B0 := Dbarψ [] 0 with hB0 + set B1 := Dbarψ [] 1 with hB1 + set P0 := Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0 with hP0 + set P1 := Dψ [Sum.inl 0] 1 - Dψ [Sum.inr 2] 1 with hP1 + set M0 := Dψ [Sum.inl 0] 0 + Dψ [Sum.inr 2] 0 with hM0 + set M1 := Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1 with hM1 + set X0 := Dψ [Sum.inr 0] 0 with hX0 + set X1 := Dψ [Sum.inr 0] 1 with hX1 + set Y0 := Dψ [Sum.inr 1] 0 with hY0 + set Y1 := Dψ [Sum.inr 1] 1 with hY1 + set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF + set S : Set JetAlgebra := {B0 * P0 + B1 * M1, B0 * P0 - B1 * M1, B0 * X1 + B1 * X0, + B0 * X1 - B1 * X0, B0 * Y1 + B1 * Y0, B0 * Y1 - B1 * Y0} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j with hW + have hB0w : B0 ∈ boostWeightSubmodule (-1) := Dbarψ_nil_zero_mem_neg_one + have hB1w : B1 ∈ boostWeightSubmodule 1 := Dbarψ_nil_one_mem_one + obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : + P0 ∈ boostWeightSubmodule 1 ∧ P1 ∈ boostWeightSubmodule 3 ∧ + M0 ∈ boostWeightSubmodule (-3) ∧ M1 ∈ boostWeightSubmodule (-1) ∧ + X0 ∈ boostWeightSubmodule (-1) ∧ X1 ∈ boostWeightSubmodule 1 ∧ + Y0 ∈ boostWeightSubmodule (-1) ∧ Y1 ∈ boostWeightSubmodule 1 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hP0, hP1, hM0, hM1, hX0, hX1, hY0, hY1, map_sub, map_add, + repLorentzGroup_Dψ_singleton, toLorentzGroup_boostZel, boostZel_inv_coe, boostMatZ, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, star_zero, Complex.conj_ofReal, Complex.ofReal_zero, + Complex.ofReal_one, mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, + add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. The six weight-zero bilinears lie in the span of the pairs + have hSW : Submodule.span ℂ S ≤ W := le_sup_left + have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by + intro u v h₁ h₂ + have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) + have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + obtain ⟨k1, k8⟩ : B0 * P0 ∈ W ∧ B1 * M1 ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨kx0, kx1⟩ : B0 * X1 ∈ W ∧ B1 * X0 ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨ky0, ky1⟩ : B0 * Y1 ∈ W ∧ B1 * Y0 ∈ W := hpm (by simp [hS]) (by simp [hS]) + -- ### C. Every bilinear splits into eigen bilinears of a single weight + -- The ten bilinears of nonzero weight, and the decomposition of `∂_0 ψ_β` and `∂_z ψ_β` into + -- the light-cone combinations. + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule k → + y ∈ boostWeightSubmodule l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + have k2 : B0 * M0 ∈ W := hm hB0w hM0w (by norm_num) + have k3 : B0 * P1 ∈ W := hm hB0w hP1w (by norm_num) + have k4 : B0 * M1 ∈ W := hm hB0w hM1w (by norm_num) + have k5 : B1 * P0 ∈ W := hm hB1w hP0w (by norm_num) + have k6 : B1 * M0 ∈ W := hm hB1w hM0w (by norm_num) + have k7 : B1 * P1 ∈ W := hm hB1w hP1w (by norm_num) + have key : ∀ {a u v : JetAlgebra} (c d : ℂ) {y : JetAlgebra}, a * u ∈ W → a * v ∈ W → + y = c • u + d • v → a * y ∈ W := by + rintro a u v c d y hu hv rfl + rw [mul_add, mul_smul_comm, mul_smul_comm] + exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) + have hkey : Submodule.span ℂ FF ≤ W := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨α, μ, β, rfl⟩ + match α, μ, β with + | 0, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) + | 0, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) + | 0, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) + | 0, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) + | 1, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) + | 1, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) + | 1, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) + | 1, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) + | 0, Sum.inr 0, 0 => exact hm hB0w hX0w (by norm_num) + | 0, Sum.inr 0, 1 => exact kx0 + | 0, Sum.inr 1, 0 => exact hm hB0w hY0w (by norm_num) + | 0, Sum.inr 1, 1 => exact ky0 + | 1, Sum.inr 0, 0 => exact kx1 + | 1, Sum.inr 0, 1 => exact hm hB1w hX1w (by norm_num) + | 1, Sum.inr 1, 0 => exact ky1 + | 1, Sum.inr 1, 1 => exact hm hB1w hY1w (by norm_num) + -- ### D. The intersection + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule k → + y ∈ boostWeightSubmodule l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) + exacts [add_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), + sub_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), + add_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), + sub_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), + add_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num)), + sub_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num))] + have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by + rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> + simp only [hB0, hB1, hP0, hM1, hX0, hX1, hY0, hY1, mul_sub, mul_add] <;> + repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep 0).symm, sup_bot_eq] end JetAlgebra From 6867c00e655c81da350957adfccc050ccf29ef75 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:29:44 +0100 Subject: [PATCH 126/254] feat: Boost weights -> Invariants Co-Authored-By: Claude --- .../FermionicKineticTerm/BoostWeight.lean | 715 ++++++++++++++++++ .../LinearIndependence.lean | 173 +++++ .../BoostWeight.lean} | 185 +---- .../JetAlgebra/Grading/BoostWeight.lean | 680 ++++++++++------- 4 files changed, 1341 insertions(+), 412 deletions(-) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean rename Physlib/Particles/LeptonGaugeSector/JetAlgebra/{Grading/BoostWeightSubMod.lean => GaugeKineticTerm/BoostWeight.lean} (59%) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean new file mode 100644 index 000000000..ecff45e7c --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean @@ -0,0 +1,715 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.LinearIndependence +/-! +# The boost weight zero parts of the photon pairs and the fermion kinetic bilinears + +The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra, as do +the fermion kinetic bilinears `ψ̄_α ∂_μ ψ_β`. This file computes the intersections of these spans +with the boost weight zero submodule: they are spanned by seven, respectively six, explicit +products, and both spans are written out in the statements of the two theorems below. + +*The proof is a certificate.* Rather than deducing the intersection abstractly, the span of the +products is expanded into boost eigenvectors. The coordinate components `F_{μν}` are not boost +eigenvectors, but six combinations of them are: the light-cone combinations `F_{0x} - F_{zx}` and +`F_{0y} - F_{zy}` of weight `2`, their partners `F_{0x} + F_{zx}` and `F_{0y} + F_{zy}` of weight +`-2`, and the two components with no free light-cone index, `F_{xy}` and `F_{0z}`, of weight `0`. +Every `F_{μν}` is a combination of these six — the sixteen cases of step B — so the span of the +products lies in the sum of the nine products of the three weight spaces, of weights `0, ±2, ±4`. +The three of weight zero — a weight-`2` field strength against a weight-`-2` one, and two +weight-zero ones — are exactly the seven products listed. + +The intersection then follows formally, with no linear independence of the products needed. The +weight submodules are independent (`boostWeightSubmodule_iSupIndep`), so boost weight zero is +disjoint from the span of the weights `±2, ±4`; since the weight-zero part sits inside boost +weight zero, the modular law cuts the intersection down to it. + +The fermion bilinears follow the same pattern with less bookkeeping: the left factors `ψ̄_α` are +already eigenvectors of weight `∓1`, and on `∂_μ ψ_β` the spinor index contributes `∓1` while the +light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. The six weight-zero bilinears are +listed as `±`-pairs grouped into a `∂_0/∂_z` block and `∂_x`, `∂_y` blocks, adapted to a later +restriction by the boost weights in the `x`- and `y`-directions. + +## i. Overview + +Each proof runs in four steps, marked in its source. Step A exhibits the boost eigenvectors, +step B decomposes the coordinate components (or, for the bilinears, spans the weight-zero +products), step C splits every product into eigen products of a single weight, and step D +assembles the intersection. + +## ii. Key results + +- `JetAlgebra.boostWeight_inter_fieldStrength` : the intersection of boost weight zero with the + span of the products `F_{μν} F_{μ'ν'}` is the span of the seven weight-zero products. +- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term` : the intersection of boost weight zero + with the span of the bilinears `ψ̄_α ∂_μ ψ_β` is the span of six explicit bilinears, paired + into blocks adapted to the boosts in the `x`- and `y`-directions. +- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term_full` : imposing boost weight zero along + all three axes at once leaves only the multiples of the fermion kinetic term. This last step + is not a certificate: the three six-dimensional spans are intersected by comparing + coefficients, using the linear independence of the sixteen bilinears. + +-/ + +@[expose] public section + +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false +set_option linter.unnecessarySeqFocus false + +namespace LeptonGaugeSector +open TensorProduct StandardModel +open scoped minkowskiMatrix PauliMatrix Pointwise +open Matrix MatrixGroups + +namespace JetAlgebra + +private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl + +/-- **The boost weight zero part of the fermion kinetic bilinears.** An element of the span of + the products `ψ̄_α ∂_μ ψ_β` has boost weight zero exactly when it is a combination of the six + bilinears listed. Both spinor indices carry `z`-boost weight `∓1` for the index `0, 1` and the + derivative index carries `±2` on the light-cone combinations `∂_0 ∓ ∂_z` and `0` on `∂_x, ∂_y`, + so the weight-zero bilinears pair the spinor indices `(0,0)` and `(1,1)` with the matching + light-cone derivative and the mixed spinor indices with a transverse derivative. + + The six spanning elements are chosen with the later restriction by the boost weights in the + `x`- and `y`-directions in mind: they pair into a `∂_0/∂_z` block and `∂_x` and `∂_y` blocks, + and in each transverse block the two sign combinations `ψ̄_0 ∂_i ψ_1 ± ψ̄_1 ∂_i ψ_0` split the + spinor content into the part that is diagonal for the boost in the `i`-direction and the part + that is not, so their weight decompositions in those directions are immediate. -/ +theorem boostWeight_inter_fermionic_kinetic_term : + boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = + Submodule.span ℂ + {Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) + + Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), + Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) - + Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), + Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0, + Dbarψ [] 0 * Dψ [Sum.inr 0] 1 - Dbarψ [] 1 * Dψ [Sum.inr 0] 0, + Dbarψ [] 0 * Dψ [Sum.inr 1] 1 + Dbarψ [] 1 * Dψ [Sum.inr 1] 0, + Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0} := by + -- ### A. The boost eigenvectors among the first-order fermion coordinates + -- `ψ̄_α` is an eigenvector of weight `∓1` for `α = 0, 1`; on `∂_μ ψ_β` the spinor index + -- contributes `∓1` and the light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. + set B0 := Dbarψ [] 0 with hB0 + set B1 := Dbarψ [] 1 with hB1 + set P0 := Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0 with hP0 + set P1 := Dψ [Sum.inl 0] 1 - Dψ [Sum.inr 2] 1 with hP1 + set M0 := Dψ [Sum.inl 0] 0 + Dψ [Sum.inr 2] 0 with hM0 + set M1 := Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1 with hM1 + set X0 := Dψ [Sum.inr 0] 0 with hX0 + set X1 := Dψ [Sum.inr 0] 1 with hX1 + set Y0 := Dψ [Sum.inr 1] 0 with hY0 + set Y1 := Dψ [Sum.inr 1] 1 with hY1 + set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF + set S : Set JetAlgebra := {B0 * P0 + B1 * M1, B0 * P0 - B1 * M1, B0 * X1 + B1 * X0, + B0 * X1 - B1 * X0, B0 * Y1 + B1 * Y0, B0 * Y1 - B1 * Y0} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j with hW + have hB0w : B0 ∈ boostWeightSubmodule 2 (-1) := Dbarψ_nil_zero_mem_neg_one + have hB1w : B1 ∈ boostWeightSubmodule 2 1 := Dbarψ_nil_one_mem_one + obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : + P0 ∈ boostWeightSubmodule 2 1 ∧ P1 ∈ boostWeightSubmodule 2 3 ∧ + M0 ∈ boostWeightSubmodule 2 (-3) ∧ M1 ∈ boostWeightSubmodule 2 (-1) ∧ + X0 ∈ boostWeightSubmodule 2 (-1) ∧ X1 ∈ boostWeightSubmodule 2 1 ∧ + Y0 ∈ boostWeightSubmodule 2 (-1) ∧ Y1 ∈ boostWeightSubmodule 2 1 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hP0, hP1, hM0, hM1, hX0, hX1, hY0, hY1, map_sub, map_add, boostAxis_two, + algebraMap_real_complex, + repLorentzGroup_Dψ_singleton, toLorentzGroup_boostZel, boostZel_inv_coe, boostMatZ, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, star_zero, Complex.conj_ofReal, Complex.ofReal_zero, + Complex.ofReal_one, mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, + add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. The six weight-zero bilinears lie in the span of the pairs + have hSW : Submodule.span ℂ S ≤ W := le_sup_left + have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by + intro u v h₁ h₂ + have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) + have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + obtain ⟨k1, k8⟩ : B0 * P0 ∈ W ∧ B1 * M1 ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨kx0, kx1⟩ : B0 * X1 ∈ W ∧ B1 * X0 ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨ky0, ky1⟩ : B0 * Y1 ∈ W ∧ B1 * Y0 ∈ W := hpm (by simp [hS]) (by simp [hS]) + -- ### C. Every bilinear splits into eigen bilinears of a single weight + -- The ten bilinears of nonzero weight, and the decomposition of `∂_0 ψ_β` and `∂_z ψ_β` into + -- the light-cone combinations. + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → + y ∈ boostWeightSubmodule 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + have k2 : B0 * M0 ∈ W := hm hB0w hM0w (by norm_num) + have k3 : B0 * P1 ∈ W := hm hB0w hP1w (by norm_num) + have k4 : B0 * M1 ∈ W := hm hB0w hM1w (by norm_num) + have k5 : B1 * P0 ∈ W := hm hB1w hP0w (by norm_num) + have k6 : B1 * M0 ∈ W := hm hB1w hM0w (by norm_num) + have k7 : B1 * P1 ∈ W := hm hB1w hP1w (by norm_num) + have key : ∀ {a u v : JetAlgebra} (c d : ℂ) {y : JetAlgebra}, a * u ∈ W → a * v ∈ W → + y = c • u + d • v → a * y ∈ W := by + rintro a u v c d y hu hv rfl + rw [mul_add, mul_smul_comm, mul_smul_comm] + exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) + have hkey : Submodule.span ℂ FF ≤ W := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨α, μ, β, rfl⟩ + match α, μ, β with + | 0, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) + | 0, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) + | 0, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) + | 0, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) + | 1, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) + | 1, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) + | 1, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) + | 1, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) + | 0, Sum.inr 0, 0 => exact hm hB0w hX0w (by norm_num) + | 0, Sum.inr 0, 1 => exact kx0 + | 0, Sum.inr 1, 0 => exact hm hB0w hY0w (by norm_num) + | 0, Sum.inr 1, 1 => exact ky0 + | 1, Sum.inr 0, 0 => exact kx1 + | 1, Sum.inr 0, 1 => exact hm hB1w hX1w (by norm_num) + | 1, Sum.inr 1, 0 => exact ky1 + | 1, Sum.inr 1, 1 => exact hm hB1w hY1w (by norm_num) + -- ### D. The intersection + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → + y ∈ boostWeightSubmodule 2 l → k + l = 0 → x * y ∈ boostWeightSubmodule 2 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) + exacts [add_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), + sub_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), + add_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), + sub_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), + add_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num)), + sub_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num))] + have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by + rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> + simp only [hB0, hB1, hP0, hM1, hX0, hX1, hY0, hY1, mul_sub, mul_add] <;> + repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] + + +/-- **The boost weight zero part of the fermion kinetic bilinears, `x`-direction.** The `x`-boost + is not diagonal on the coordinate spinors, so the eigenvectors are the combinations + `ψ̄_0 ± ψ̄_1` of weight `∓1`, and likewise on the spinor index of `∂_μ ψ_β`; the light-cone + derivative combinations are `∂_0 ∓ ∂_x`, and `∂_y`, `∂_z` are the transverse directions. -/ +theorem boostWeight_inter_fermionic_kinetic_term_x : + boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = + Submodule.span ℂ + {(Dbarψ [] 0 + Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1)) + + (Dbarψ [] 0 - Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1)), + (Dbarψ [] 0 + Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1)) - + (Dbarψ [] 0 - Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1)), + (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 - Dψ [Sum.inr 1] 1) + + (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 + Dψ [Sum.inr 1] 1), + (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 - Dψ [Sum.inr 1] 1) - + (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 + Dψ [Sum.inr 1] 1), + (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 - Dψ [Sum.inr 2] 1) + + (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 + Dψ [Sum.inr 2] 1), + (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 - Dψ [Sum.inr 2] 1) - + (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 + Dψ [Sum.inr 2] 1)} := by + -- ### A. The boost eigenvectors among the first-order fermion coordinates + set Bp := Dbarψ [] 0 + Dbarψ [] 1 with hBp + set Bm := Dbarψ [] 0 - Dbarψ [] 1 with hBm + set P := Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1) with hP + set Q := Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1) with hQ + set N := Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1) with hN + set M := Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1) with hM + set T0p := Dψ [Sum.inr 1] 0 + Dψ [Sum.inr 1] 1 with hT0p + set T0m := Dψ [Sum.inr 1] 0 - Dψ [Sum.inr 1] 1 with hT0m + set T1p := Dψ [Sum.inr 2] 0 + Dψ [Sum.inr 2] 1 with hT1p + set T1m := Dψ [Sum.inr 2] 0 - Dψ [Sum.inr 2] 1 with hT1m + set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF + set S : Set JetAlgebra := {Bp * P + Bm * M, Bp * P - Bm * M, Bp * T0m + Bm * T0p, + Bp * T0m - Bm * T0p, Bp * T1m + Bm * T1p, Bp * T1m - Bm * T1p} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j with hW + obtain ⟨hBpw, hBmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : + Bp ∈ boostWeightSubmodule 0 (-1) ∧ Bm ∈ boostWeightSubmodule 0 1 ∧ + P ∈ boostWeightSubmodule 0 1 ∧ Q ∈ boostWeightSubmodule 0 3 ∧ + N ∈ boostWeightSubmodule 0 (-3) ∧ M ∈ boostWeightSubmodule 0 (-1) ∧ + T0p ∈ boostWeightSubmodule 0 (-1) ∧ T0m ∈ boostWeightSubmodule 0 1 ∧ + T1p ∈ boostWeightSubmodule 0 (-1) ∧ T1m ∈ boostWeightSubmodule 0 1 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hBp, hBm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, + boostAxis_zero, toLorentzGroup_boostXel, boostXel_inv_coe, boostMatX, + algebraMap_real_complex, + repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, + Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, + mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. The six weight-zero bilinears lie in the span of the pairs + have hSW : Submodule.span ℂ S ≤ W := le_sup_left + have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by + intro u v h₁ h₂ + have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) + have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + obtain ⟨k1, k8⟩ : Bp * P ∈ W ∧ Bm * M ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨kx0, kx1⟩ : Bp * T0m ∈ W ∧ Bm * T0p ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨ky0, ky1⟩ : Bp * T1m ∈ W ∧ Bm * T1p ∈ W := hpm (by simp [hS]) (by simp [hS]) + -- ### C. Every bilinear splits into eigen bilinears of a single weight + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → + y ∈ boostWeightSubmodule 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + have hbil : ∀ x ∈ Submodule.span ℂ ({Bp, Bm} : Set JetAlgebra), + ∀ y ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), + x * y ∈ W := by + intro x hx + induction hx using Submodule.span_induction with + | mem a ha => + intro y hy + induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb + rcases ha with rfl | rfl <;> + rcases hb with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + exacts [k1, hm hBpw hQw (by norm_num), hm hBpw hNw (by norm_num), + hm hBpw hMw (by norm_num), hm hBpw hT0pw (by norm_num), kx0, + hm hBpw hT1pw (by norm_num), ky0, + hm hBmw hPw (by norm_num), hm hBmw hQw (by norm_num), hm hBmw hNw (by norm_num), k8, + kx1, hm hBmw hT0mw (by norm_num), ky1, hm hBmw hT1mw (by norm_num)] + | zero => simp + | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz + | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy + | zero => intro y _; simp + | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) + | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) + have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 c3 c4 z rfl + exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hkey : Submodule.span ℂ FF ≤ W := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨α, μ, β, rfl⟩ + refine hbil _ ?_ _ ?_ + · rw [Submodule.mem_span_pair] + match α with + | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hBp, hBm]; module⟩ + | 1 => exact ⟨2⁻¹, -2⁻¹, by rw [hBp, hBm]; module⟩ + · match μ, β with + | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inl 0, 1 => exact hc4 4⁻¹ (-4⁻¹) 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 0, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 0, 1 => exact hc4 (-4⁻¹) 4⁻¹ 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 1, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) + | Sum.inr 1, 1 => exact hc0 2⁻¹ (-2⁻¹) (by rw [hT0p, hT0m]; module) + | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) + | Sum.inr 2, 1 => exact hc1 2⁻¹ (-2⁻¹) (by rw [hT1p, hT1m]; module) + -- ### D. The intersection + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → + y ∈ boostWeightSubmodule 0 l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) + exacts [add_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), + sub_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), + add_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), + sub_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), + add_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num)), + sub_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num))] + have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by + rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> + simp only [hBp, hBm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, + mul_smul_comm, smul_mul_assoc] <;> + repeat' first + | exact hFm _ _ _ + | apply add_mem + | apply sub_mem + | apply neg_mem + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] + +/-- **The boost weight zero part of the fermion kinetic bilinears, `y`-direction.** As for the + `x`-boost, but the rotated spinor combinations now carry a factor of `i`: `ψ̄_0 ∓ i ψ̄_1` has + weight `∓1`, and on `∂_μ ψ_β` the combinations `∂_μ ψ_0 ± i ∂_μ ψ_1` carry the spinor weight + `∓1`; the light-cone derivative combinations are `∂_0 ∓ ∂_y`, and `∂_x`, `∂_z` are transverse. -/ +theorem boostWeight_inter_fermionic_kinetic_term_y : + boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = + Submodule.span ℂ + {(Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 - + (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1)) + + (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 + + (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1)), + (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 - + (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1)) - + (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 + + (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1)), + (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 0] 0 - Complex.I • Dψ [Sum.inr 0] 1) + + (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 0] 0 + Complex.I • Dψ [Sum.inr 0] 1), + (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 0] 0 - Complex.I • Dψ [Sum.inr 0] 1) - + (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 0] 0 + Complex.I • Dψ [Sum.inr 0] 1), + (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 2] 0 - Complex.I • Dψ [Sum.inr 2] 1) + + (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 2] 0 + Complex.I • Dψ [Sum.inr 2] 1), + (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 2] 0 - Complex.I • Dψ [Sum.inr 2] 1) - + (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * + (Dψ [Sum.inr 2] 0 + Complex.I • Dψ [Sum.inr 2] 1)} := by + -- ### A. The boost eigenvectors among the first-order fermion coordinates + set Bp := Dbarψ [] 0 - Complex.I • Dbarψ [] 1 with hBp + set Bm := Dbarψ [] 0 + Complex.I • Dbarψ [] 1 with hBm + set P := Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 - + (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1) with hP + set Q := Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 - + (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1) with hQ + set N := Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 + + (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1) with hN + set M := Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 + + (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1) with hM + set T0p := Dψ [Sum.inr 0] 0 + Complex.I • Dψ [Sum.inr 0] 1 with hT0p + set T0m := Dψ [Sum.inr 0] 0 - Complex.I • Dψ [Sum.inr 0] 1 with hT0m + set T1p := Dψ [Sum.inr 2] 0 + Complex.I • Dψ [Sum.inr 2] 1 with hT1p + set T1m := Dψ [Sum.inr 2] 0 - Complex.I • Dψ [Sum.inr 2] 1 with hT1m + set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF + set S : Set JetAlgebra := {Bp * P + Bm * M, Bp * P - Bm * M, Bp * T0m + Bm * T0p, + Bp * T0m - Bm * T0p, Bp * T1m + Bm * T1p, Bp * T1m - Bm * T1p} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j with hW + obtain ⟨hBpw, hBmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : + Bp ∈ boostWeightSubmodule 1 (-1) ∧ Bm ∈ boostWeightSubmodule 1 1 ∧ + P ∈ boostWeightSubmodule 1 1 ∧ Q ∈ boostWeightSubmodule 1 3 ∧ + N ∈ boostWeightSubmodule 1 (-3) ∧ M ∈ boostWeightSubmodule 1 (-1) ∧ + T0p ∈ boostWeightSubmodule 1 (-1) ∧ T0m ∈ boostWeightSubmodule 1 1 ∧ + T1p ∈ boostWeightSubmodule 1 (-1) ∧ T1m ∈ boostWeightSubmodule 1 1 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hBp, hBm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, + boostAxis_one, toLorentzGroup_boostYel, boostYel_inv_coe, boostMatY, + algebraMap_real_complex, + repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, + Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, + mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> field_simp <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf) + -- ### B. The six weight-zero bilinears lie in the span of the pairs + have hSW : Submodule.span ℂ S ≤ W := le_sup_left + have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by + intro u v h₁ h₂ + have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) + have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + obtain ⟨k1, k8⟩ : Bp * P ∈ W ∧ Bm * M ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨kx0, kx1⟩ : Bp * T0m ∈ W ∧ Bm * T0p ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨ky0, ky1⟩ : Bp * T1m ∈ W ∧ Bm * T1p ∈ W := hpm (by simp [hS]) (by simp [hS]) + -- ### C. Every bilinear splits into eigen bilinears of a single weight + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → + y ∈ boostWeightSubmodule 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + have hbil : ∀ x ∈ Submodule.span ℂ ({Bp, Bm} : Set JetAlgebra), + ∀ y ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), + x * y ∈ W := by + intro x hx + induction hx using Submodule.span_induction with + | mem a ha => + intro y hy + induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb + rcases ha with rfl | rfl <;> + rcases hb with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + exacts [k1, hm hBpw hQw (by norm_num), hm hBpw hNw (by norm_num), + hm hBpw hMw (by norm_num), hm hBpw hT0pw (by norm_num), kx0, + hm hBpw hT1pw (by norm_num), ky0, + hm hBmw hPw (by norm_num), hm hBmw hQw (by norm_num), hm hBmw hNw (by norm_num), k8, + kx1, hm hBmw hT0mw (by norm_num), ky1, hm hBmw hT1mw (by norm_num)] + | zero => simp + | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz + | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy + | zero => intro y _; simp + | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) + | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) + have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 c3 c4 z rfl + exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hkey : Submodule.span ℂ FF ≤ W := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨α, μ, β, rfl⟩ + refine hbil _ ?_ _ ?_ + · rw [Submodule.mem_span_pair] + match α with + | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hBp, hBm]; module⟩ + | 1 => + exact ⟨Complex.I / 2, -(Complex.I / 2), by + rw [hBp, hBm] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)⟩ + · match μ, β with + | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inl 0, 1 => + exact hc4 (-(Complex.I / 4)) (Complex.I / 4) (-(Complex.I / 4)) (Complex.I / 4) + (by rw [hP, hQ, hN, hM] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + | Sum.inr 1, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 1, 1 => + exact hc4 (Complex.I / 4) (-(Complex.I / 4)) (-(Complex.I / 4)) (Complex.I / 4) + (by rw [hP, hQ, hN, hM] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + | Sum.inr 0, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) + | Sum.inr 0, 1 => + exact hc0 (-(Complex.I / 2)) (Complex.I / 2) + (by rw [hT0p, hT0m] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) + | Sum.inr 2, 1 => + exact hc1 (-(Complex.I / 2)) (Complex.I / 2) + (by rw [hT1p, hT1m] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + -- ### D. The intersection + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → + y ∈ boostWeightSubmodule 1 l → k + l = 0 → x * y ∈ boostWeightSubmodule 1 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) + exacts [add_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), + sub_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), + add_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), + sub_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), + add_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num)), + sub_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num))] + have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by + rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> + simp only [hBp, hBm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, + mul_smul_comm, smul_mul_assoc] <;> + repeat' first + | apply add_mem + | apply sub_mem + | apply neg_mem + | apply Submodule.smul_mem + | exact hFm _ _ _ + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] + +/-- **The fermion kinetic term is the only bilinear of boost weight zero in every direction.** + An element of the span of the products `ψ̄_α D_μ ψ_β` has boost weight zero along all three + axes exactly when it is a multiple of `i ψ̄ σ̄^μ D_μ ψ`. + + *Here the proof is not a certificate.* The three one-axis theorems above cut the span of the + sixteen bilinears down to a six-dimensional space each, and the three sixes have to be + intersected; the intersection is read off from the coefficients, which is where the linear + independence of the bilinears (`fermionDual_apply`) enters. The `z`-axis theorem provides the + six coefficients `a₁, …, a₆`, and five functionals, each a combination of two of the duals + `fermionDual` chosen to annihilate the `x`- or the `y`-axis span, cut them down to one. -/ +lemma boostWeight_inter_fermionic_kinetic_term_full : + boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ + boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = + Submodule.span ℂ {fermionKineticTerm} := by + have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ + Submodule.span ℂ {x : JetAlgebra | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} := + fun α μ β => Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hinv : IsInvariant fermionKineticTerm := + ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ + refine le_antisymm ?_ ?_ + -- ### A. The three one-axis intersections + · intro x hx + rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx + obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx + have hz := boostWeight_inter_fermionic_kinetic_term.le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) + have hbx := boostWeight_inter_fermionic_kinetic_term_x.le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) + have hby := boostWeight_inter_fermionic_kinetic_term_y.le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) + -- ### B. Pairs of dual functionals annihilating the `x`- and `y`-axis spans + have hpair : ∀ (c₁ c₂ : ℂ) (q₁ q₂ : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) {T : Set JetAlgebra}, + (∀ s ∈ T, c₁ * fermionDual q₁ s + c₂ * fermionDual q₂ s = 0) → + ∀ y ∈ Submodule.span ℂ T, c₁ * fermionDual q₁ y + c₂ * fermionDual q₂ y = 0 := by + intro c₁ c₂ q₁ q₂ T hT y hy + induction hy using Submodule.span_induction with + | mem s hs => exact hT s hs + | zero => simp + | add u v _ _ hu hv => rw [map_add, map_add]; linear_combination hu + hv + | smul c u _ hu => + rw [map_smul, map_smul, smul_eq_mul, smul_eq_mul]; linear_combination c * hu + obtain ⟨e1, e2, e3⟩ : + (-1 : ℂ) * fermionDual (0, Sum.inl 0, 0) x + 1 * fermionDual (1, Sum.inl 0, 1) x = 0 ∧ + (1 : ℂ) * fermionDual (0, Sum.inl 0, 0) x + 1 * fermionDual (0, Sum.inr 0, 1) x = 0 ∧ + (1 : ℂ) * fermionDual (0, Sum.inl 0, 0) x + 1 * fermionDual (1, Sum.inr 0, 0) x = 0 := by + refine ⟨hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx⟩ <;> + intro s hs <;> + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> + simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, + smul_mul_assoc, mul_smul_comm, fermionDual_apply] <;> + simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, + if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] + obtain ⟨e4, e5⟩ : + Complex.I * fermionDual (0, Sum.inl 0, 0) x + + 1 * fermionDual (0, Sum.inr 1, 1) x = 0 ∧ + (-Complex.I) * fermionDual (0, Sum.inl 0, 0) x + + 1 * fermionDual (1, Sum.inr 1, 0) x = 0 := by + refine ⟨hpair _ _ _ _ ?_ x hby, hpair _ _ _ _ ?_ x hby⟩ <;> + intro s hs <;> + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> + simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, + smul_mul_assoc, mul_smul_comm, fermionDual_apply] <;> + simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, + if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] + -- ### C. The six coefficients of the `z`-axis span, and the five relations on them + rw [Submodule.mem_span_insert] at hz + obtain ⟨a1, y1, hy1, rfl⟩ := hz + rw [Submodule.mem_span_insert] at hy1 + obtain ⟨a2, y2, hy2, rfl⟩ := hy1 + rw [Submodule.mem_span_insert] at hy2 + obtain ⟨a3, y3, hy3, rfl⟩ := hy2 + rw [Submodule.mem_span_insert] at hy3 + obtain ⟨a4, y4, hy4, rfl⟩ := hy3 + rw [Submodule.mem_span_insert] at hy4 + obtain ⟨a5, y5, hy5, rfl⟩ := hy4 + obtain ⟨a6, rfl⟩ := Submodule.mem_span_singleton.1 hy5 + simp only [mul_add, mul_sub, add_mul, sub_mul, map_add, map_smul, map_sub, smul_eq_mul, + fermionDual_apply, Prod.mk.injEq, Sum.inr.injEq, Sum.inl.injEq, reduceCtorEq, Fin.isValue, + Fin.reduceEq, and_false, false_and, if_false, and_true, true_and, if_true, mul_zero, mul_one, + add_zero, zero_add, sub_zero, zero_sub] at e1 e2 e3 e4 e5 + -- ### D. One coefficient is left, and it is the kinetic term + have ha2 : a2 = 0 := by linear_combination -e1 / 2 + have ha4 : a4 = 0 := by linear_combination (e2 - e3) / 2 + have ha3 : a3 = -(a1 + a2) := by linear_combination (e2 + e3) / 2 + have ha5 : a5 = 0 := by linear_combination (e4 + e5) / 2 + have ha6 : a6 = -Complex.I * (a1 + a2) := by linear_combination (e4 - e5) / 2 + subst ha2 ha4 ha5 ha3 ha6 + rw [Submodule.mem_span_singleton] + refine ⟨-Complex.I * a1, ?_⟩ + rw [fermionKineticTerm_eq] + simp only [mul_add, mul_sub, add_zero] + have hI3 : Complex.I ^ 3 = -Complex.I := by rw [pow_succ, Complex.I_sq, neg_one_mul] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq, hI3]) <;> (try ring_nf) + -- ### E. The kinetic term is invariant, hence of weight zero along every axis + · rw [Submodule.span_le, Set.singleton_subset_iff] + refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinv, + mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, ?_⟩ + rw [fermionKineticTerm_eq] + exact Submodule.smul_mem _ _ (sub_mem (sub_mem (sub_mem + (add_mem (hFm _ _ _) (hFm _ _ _)) (add_mem (hFm _ _ _) (hFm _ _ _))) + (Submodule.smul_mem _ _ (sub_mem (hFm _ _ _) (hFm _ _ _)))) + (sub_mem (hFm _ _ _) (hFm _ _ _))) + +/-! + +## The key theorem + +-/ + +lemma mem_fermionic_kinetic_span_eq_kineticTerm_of_isInvariant {x : JetAlgebra} + (hx : IsInvariant x) (ht : x ∈ Submodule.span ℂ {y | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : + x ∈ Submodule.span ℂ {fermionKineticTerm} := by + rw [← boostWeight_inter_fermionic_kinetic_term_full] + exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean new file mode 100644 index 000000000..89f3ecd52 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean @@ -0,0 +1,173 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.CovariantDeriv +public import Mathlib.LinearAlgebra.ExteriorAlgebra.OfAlternating +/-! +# Linear independence of the fermion bilinears + +The sixteen products `ψ̄_α D_μ ψ_β` are linearly independent. Statements about +an explicit span of such products — the boost-weight-zero part of the fermion +kinetic sector, say — then reduce to linear algebra on coefficients, with no +need for a grading certificate. + +The proof exhibits a dual family. The lepton factor of the jet algebra is an +exterior algebra, so a pair of dual basis vectors `φ`, `ψ` on the jet component +space gives an alternating two-form `φ ⊗ ψ - ψ ⊗ φ`, and +`ExteriorAlgebra.liftAlternating` turns it into a functional picking out the +coefficient of `ι x * ι y`. Tensoring with the augmentation of the B-boson +factor gives a functional `fermionPairDual` on the whole jet algebra, and +`fermionPairDual_Dbarψ_mul_Dψ` shows it is dual to the sixteen bilinears: the +`- 6 i B_μ ψ_β` tail of `D_μ ψ_β` contributes nothing, because its fermionic +part carries no derivative index. + +## Key results + +- `fermionPairDual` : the functional dual to a chosen fermion bilinear. +- `Dbarψ_mul_Dψ_linearIndependent` : the sixteen bilinears are independent. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## A. An alternating two-form from a pair of functionals + +-/ + +/-- The alternating two-form `φ ∧ ψ` built from a pair of linear functionals. -/ +noncomputable def altPair {V : Type} [AddCommGroup V] [Module ℂ V] + (φ ψ : Module.Dual ℂ V) : V [⋀^Fin 2]→ₗ[ℂ] ℂ where + toFun v := φ (v 0) * ψ (v 1) - φ (v 1) * ψ (v 0) + map_update_add' v i x y := by fin_cases i <;> simp <;> ring + map_update_smul' v i c x := by fin_cases i <;> simp <;> ring + map_eq_zero_of_eq' v i j h hij := by + fin_cases i <;> fin_cases j <;> simp_all + +@[simp] +lemma altPair_apply {V : Type} [AddCommGroup V] [Module ℂ V] + (φ ψ : Module.Dual ℂ V) (x y : V) : + altPair φ ψ ![x, y] = φ x * ψ y - φ y * ψ x := rfl + +/-- The family of alternating forms that is `altPair φ ψ` in degree two and zero + elsewhere; the input to `ExteriorAlgebra.liftAlternating`. -/ +noncomputable def altPairFamily {V : Type} [AddCommGroup V] [Module ℂ V] + (φ ψ : Module.Dual ℂ V) : (i : ℕ) → V [⋀^Fin i]→ₗ[ℂ] ℂ + | 2 => altPair φ ψ + | _ => 0 + +/-- The functional on an exterior algebra picking out the coefficient of the + degree-two monomial dual to `φ` and `ψ`. -/ +noncomputable def extPairDual {V : Type} [AddCommGroup V] [Module ℂ V] + (φ ψ : Module.Dual ℂ V) : ExteriorAlgebra ℂ V →ₗ[ℂ] ℂ := + ExteriorAlgebra.liftAlternating (altPairFamily φ ψ) + +@[simp] +lemma extPairDual_ι_mul_ι {V : Type} [AddCommGroup V] [Module ℂ V] + (φ ψ : Module.Dual ℂ V) (x y : V) : + extPairDual φ ψ (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y) = + φ x * ψ y - φ y * ψ x := by + rw [extPairDual, ExteriorAlgebra.liftAlternating_ι_mul, + ExteriorAlgebra.liftAlternating_ι] + rfl + +/-! + +## B. The dual family for the fermion bilinears + +-/ + +/-- The augmentation of the B-boson factor: the algebra map to `ℂ` sending every + gauge-field generator to zero. -/ +noncomputable def augB : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] ℂ := + Algebra.TensorProduct.lift (AlgHom.id ℂ ℂ) + (SymmetricAlgebra.lift (0 : BBoson.JetComponentSpace →ₗ[ℝ] ℂ)) + (fun _ _ => Commute.all _ _) + +/-- The functional on the jet algebra dual to a chosen fermion bilinear: the + augmentation on the B-boson factor tensored with `extPairDual` on the lepton + factor. -/ +noncomputable def fermionPairDual + (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) : JetAlgebra →ₗ[ℂ] ℂ := + TensorProduct.lift + (((LinearMap.mul ℂ ℂ).comp augB.toLinearMap).compl₂ (extPairDual φ ψ)) + +@[simp] +lemma fermionPairDual_tmul (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + fermionPairDual φ ψ (a ⊗ⱼ b) = augB a * extPairDual φ ψ b := rfl + +/-- The augmentation kills a gauge-field generator. -/ +@[simp] +lemma augB_ofGenerator (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + augB (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) = 0 := by + simp [augB, BBoson.JetAlgebra.ofGenerator] + +/-- The augmentation is unital. -/ +@[simp] +lemma augB_one_tmul_one : augB (1 ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = 1 := by + rw [show (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) = 1 from rfl, map_one] + +/-- The functional dual to the fermion bilinear `ψ̄_α D_μ ψ_β`. -/ +noncomputable def fermionDual (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : + JetAlgebra →ₗ[ℂ] ℂ := + fermionPairDual + (LeptonSinglet.JetComponentSpace.basis.coord + (LeptonSinglet.JetGenerators.dbarψ {} q.1)) + (LeptonSinglet.JetComponentSpace.basis.coord + (LeptonSinglet.JetGenerators.dψ {q.2.1} q.2.2)) + +/-- `fermionDual` is dual to the sixteen fermion bilinears. The `- 6 i B_μ ψ_β` + tail of `D_μ ψ_β` drops out twice over: the augmentation kills its gauge-field + factor, and its fermionic factor carries no derivative index. -/ +lemma fermionDual_Dbarψ_mul_Dψ (q p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : + fermionDual q (Dbarψ [] p.1 * Dψ [p.2.1] p.2.2) = if p = q then 1 else 0 := by + obtain ⟨α₀, μ₀, β₀⟩ := q + obtain ⟨α, μ, β⟩ := p + rw [Dbarψ_nil, Dψ_singleton, mul_sub, mul_smul_comm, ← mul_assoc] + simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, + JetAlgebra.tmul_mul_tmul, mul_one, map_sub, map_smul, + fermionDual, fermionPairDual_tmul, + LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] + simp only [Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, + LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq, Prod.mk.injEq] + simp only [Multiset.singleton_inj, true_and, mul_ite, mul_one, mul_zero] + by_cases hα : α = α₀ <;> by_cases hμ : μ = μ₀ <;> by_cases hβ : β = β₀ <;> + simp [hα, hμ, hβ] + +/-- `fermionDual_Dbarψ_mul_Dψ` with the three indices given separately, so that + it fires on bilinears written out rather than through a product index. -/ +@[simp] +lemma fermionDual_apply (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) (α : Fin 2) + (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : + fermionDual q (Dbarψ [] α * Dψ [μ] β) = if (α, μ, β) = q then 1 else 0 := + fermionDual_Dbarψ_mul_Dψ q (α, μ, β) + +/-- The sixteen fermion bilinears `ψ̄_α D_μ ψ_β` are linearly independent. -/ +theorem Dbarψ_mul_Dψ_linearIndependent : + LinearIndependent ℂ (fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => + Dbarψ [] p.1 * Dψ [p.2.1] p.2.2) := by + rw [Fintype.linearIndependent_iff] + intro c hc q + have h := congrArg (fermionDual q) hc + rw [map_sum, map_zero] at h + simp only [map_smul, smul_eq_mul, fermionDual_Dbarψ_mul_Dψ, mul_ite, mul_one, + mul_zero, Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at h + exact h + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean similarity index 59% rename from Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean index bdc250821..2fe2159db 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeightSubMod.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.LinearIndependence /-! # The boost weight zero parts of the photon pairs and the fermion kinetic bilinears @@ -49,6 +50,10 @@ assembles the intersection. - `JetAlgebra.boostWeight_inter_fermionic_kinetic_term` : the intersection of boost weight zero with the span of the bilinears `ψ̄_α ∂_μ ψ_β` is the span of six explicit bilinears, paired into blocks adapted to the boosts in the `x`- and `y`-directions. +- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term_full` : imposing boost weight zero along + all three axes at once leaves only the multiples of the fermion kinetic term. This last step + is not a certificate: the three six-dimensional spans are intersected by comparing + coefficients, using the linear independence of the sixteen bilinears. -/ @@ -65,13 +70,15 @@ open Matrix MatrixGroups namespace JetAlgebra +private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl + /-- **The boost weight zero part of the photon pairs.** An element of the span of the products `F_{μν} F_{μ'ν'}` of two field strengths has boost weight zero exactly when it is a combination of the seven products of a weight-`2` light-cone field strength `F_{0x} - F_{zx}`, `F_{0y} - F_{zy}` with a weight-`-2` one `F_{0x} + F_{zx}`, `F_{0y} + F_{zy}`, and of the weight-zero components `F_{xy}` and `F_{0z}` with each other. -/ theorem boostWeight_inter_fieldStrength : - boostWeightSubmodule 0 ⊓ Submodule.span ℂ + boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) * @@ -111,15 +118,16 @@ theorem boostWeight_inter_fieldStrength : set FF : Set JetAlgebra := {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF set S : Set JetAlgebra := {PX * MX, PX * MY, PY * MX, PY * MY, T * T, T * L, L * L} with hS - have hPXw : PX ∈ boostWeightSubmodule 2 := fieldStrengthDeriv_lightCone_mem_two - have hMXw : MX ∈ boostWeightSubmodule (-2) := fieldStrengthDeriv_lightCone_mem_neg_two - have hTw : T ∈ boostWeightSubmodule 0 := fieldStrengthDeriv_transverse_mem_zero - obtain ⟨hPYw, hMYw, hLw⟩ : PY ∈ boostWeightSubmodule 2 ∧ MY ∈ boostWeightSubmodule (-2) ∧ - L ∈ boostWeightSubmodule 0 := by + have hPXw : PX ∈ boostWeightSubmodule 2 2 := fieldStrengthDeriv_lightCone_mem_two + have hMXw : MX ∈ boostWeightSubmodule 2 (-2) := fieldStrengthDeriv_lightCone_mem_neg_two + have hTw : T ∈ boostWeightSubmodule 2 0 := fieldStrengthDeriv_transverse_mem_zero + obtain ⟨hPYw, hMYw, hLw⟩ : PY ∈ boostWeightSubmodule 2 2 ∧ MY ∈ boostWeightSubmodule 2 (-2) ∧ + L ∈ boostWeightSubmodule 2 0 := by refine ⟨?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hPY, hMY, hL, map_sub, map_add, repLorentzGroup_fieldStrengthDeriv_nil, + simp only [hPY, hMY, hL, map_sub, map_add, boostAxis_two, + repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, zero_smul, smul_zero, add_zero, zero_add] @@ -135,11 +143,11 @@ theorem boostWeight_inter_fieldStrength : set B := Submodule.span ℂ {T, L} with hB set C := Submodule.span ℂ {MX, MY} with hC set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ boostWeightSubmodule 2 := by + have hAle : A ≤ boostWeightSubmodule 2 2 := by rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ boostWeightSubmodule 0 := by + have hBle : B ≤ boostWeightSubmodule 2 0 := by rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ boostWeightSubmodule (-2) := by + have hCle : C ≤ boostWeightSubmodule 2 (-2) := by rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left @@ -211,9 +219,9 @@ theorem boostWeight_inter_fieldStrength : constructor · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ - have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule k → - Y ≤ boostWeightSubmodule l → k + l ≠ 0 → - X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := + have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule 2 k → + Y ≤ boostWeightSubmodule 2 l → k + l ≠ 0 → + X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j := fun hX hY h => le_sup_of_le_right ((Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy)).trans (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) @@ -234,7 +242,7 @@ theorem boostWeight_inter_fieldStrength : Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] have hkey : Submodule.span ℂ FF ≤ - Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j := by + Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j := by rw [hspan] refine (Submodule.mul_le.2 fun _ hx _ hy => Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ @@ -248,11 +256,11 @@ theorem boostWeight_inter_fieldStrength : -- The seven products have weight zero and are photon pairs, which is one inclusion. For the -- other, weight zero is disjoint from the sum of the nonzero weights by -- `boostWeightSubmodule_iSupIndep`, and the modular law removes it from the splitting above. - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule k → - y ∈ boostWeightSubmodule l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → + y ∈ boostWeightSubmodule 2 l → k + l = 0 → x * y ∈ boostWeightSubmodule 2 0 := by intro k l x y hx hy h rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 := by + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> @@ -264,148 +272,7 @@ theorem boostWeight_inter_fieldStrength : exact Submodule.mul_mem_mul (by assumption) (by assumption) refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep 0).symm, sup_bot_eq] - -/-- **The boost weight zero part of the fermion kinetic bilinears.** An element of the span of - the products `ψ̄_α ∂_μ ψ_β` has boost weight zero exactly when it is a combination of the six - bilinears listed. Both spinor indices carry `z`-boost weight `∓1` for the index `0, 1` and the - derivative index carries `±2` on the light-cone combinations `∂_0 ∓ ∂_z` and `0` on `∂_x, ∂_y`, - so the weight-zero bilinears pair the spinor indices `(0,0)` and `(1,1)` with the matching - light-cone derivative and the mixed spinor indices with a transverse derivative. - - The six spanning elements are chosen with the later restriction by the boost weights in the - `x`- and `y`-directions in mind: they pair into a `∂_0/∂_z` block and `∂_x` and `∂_y` blocks, - and in each transverse block the two sign combinations `ψ̄_0 ∂_i ψ_1 ± ψ̄_1 ∂_i ψ_0` split the - spinor content into the part that is diagonal for the boost in the `i`-direction and the part - that is not, so their weight decompositions in those directions are immediate. -/ -theorem boostWeight_inter_fermionic_kinetic_term : - boostWeightSubmodule 0 ⊓ Submodule.span ℂ - {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = - Submodule.span ℂ - {Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) + - Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), - Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) - - Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), - Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0, - Dbarψ [] 0 * Dψ [Sum.inr 0] 1 - Dbarψ [] 1 * Dψ [Sum.inr 0] 0, - Dbarψ [] 0 * Dψ [Sum.inr 1] 1 + Dbarψ [] 1 * Dψ [Sum.inr 1] 0, - Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0} := by - -- ### A. The boost eigenvectors among the first-order fermion coordinates - -- `ψ̄_α` is an eigenvector of weight `∓1` for `α = 0, 1`; on `∂_μ ψ_β` the spinor index - -- contributes `∓1` and the light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. - set B0 := Dbarψ [] 0 with hB0 - set B1 := Dbarψ [] 1 with hB1 - set P0 := Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0 with hP0 - set P1 := Dψ [Sum.inl 0] 1 - Dψ [Sum.inr 2] 1 with hP1 - set M0 := Dψ [Sum.inl 0] 0 + Dψ [Sum.inr 2] 0 with hM0 - set M1 := Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1 with hM1 - set X0 := Dψ [Sum.inr 0] 0 with hX0 - set X1 := Dψ [Sum.inr 0] 1 with hX1 - set Y0 := Dψ [Sum.inr 1] 0 with hY0 - set Y1 := Dψ [Sum.inr 1] 1 with hY1 - set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF - set S : Set JetAlgebra := {B0 * P0 + B1 * M1, B0 * P0 - B1 * M1, B0 * X1 + B1 * X0, - B0 * X1 - B1 * X0, B0 * Y1 + B1 * Y0, B0 * Y1 - B1 * Y0} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule j with hW - have hB0w : B0 ∈ boostWeightSubmodule (-1) := Dbarψ_nil_zero_mem_neg_one - have hB1w : B1 ∈ boostWeightSubmodule 1 := Dbarψ_nil_one_mem_one - obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : - P0 ∈ boostWeightSubmodule 1 ∧ P1 ∈ boostWeightSubmodule 3 ∧ - M0 ∈ boostWeightSubmodule (-3) ∧ M1 ∈ boostWeightSubmodule (-1) ∧ - X0 ∈ boostWeightSubmodule (-1) ∧ X1 ∈ boostWeightSubmodule 1 ∧ - Y0 ∈ boostWeightSubmodule (-1) ∧ Y1 ∈ boostWeightSubmodule 1 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hP0, hP1, hM0, hM1, hX0, hX1, hY0, hY1, map_sub, map_add, - repLorentzGroup_Dψ_singleton, toLorentzGroup_boostZel, boostZel_inv_coe, boostMatZ, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, star_zero, Complex.conj_ofReal, Complex.ofReal_zero, - Complex.ofReal_one, mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, - add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. The six weight-zero bilinears lie in the span of the pairs - have hSW : Submodule.span ℂ S ≤ W := le_sup_left - have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by - intro u v h₁ h₂ - have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) - have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - obtain ⟨k1, k8⟩ : B0 * P0 ∈ W ∧ B1 * M1 ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨kx0, kx1⟩ : B0 * X1 ∈ W ∧ B1 * X0 ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨ky0, ky1⟩ : B0 * Y1 ∈ W ∧ B1 * Y0 ∈ W := hpm (by simp [hS]) (by simp [hS]) - -- ### C. Every bilinear splits into eigen bilinears of a single weight - -- The ten bilinears of nonzero weight, and the decomposition of `∂_0 ψ_β` and `∂_z ψ_β` into - -- the light-cone combinations. - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule k → - y ∈ boostWeightSubmodule l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => - Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) - have k2 : B0 * M0 ∈ W := hm hB0w hM0w (by norm_num) - have k3 : B0 * P1 ∈ W := hm hB0w hP1w (by norm_num) - have k4 : B0 * M1 ∈ W := hm hB0w hM1w (by norm_num) - have k5 : B1 * P0 ∈ W := hm hB1w hP0w (by norm_num) - have k6 : B1 * M0 ∈ W := hm hB1w hM0w (by norm_num) - have k7 : B1 * P1 ∈ W := hm hB1w hP1w (by norm_num) - have key : ∀ {a u v : JetAlgebra} (c d : ℂ) {y : JetAlgebra}, a * u ∈ W → a * v ∈ W → - y = c • u + d • v → a * y ∈ W := by - rintro a u v c d y hu hv rfl - rw [mul_add, mul_smul_comm, mul_smul_comm] - exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) - have hkey : Submodule.span ℂ FF ≤ W := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨α, μ, β, rfl⟩ - match α, μ, β with - | 0, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) - | 0, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) - | 0, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) - | 0, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) - | 1, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) - | 1, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) - | 1, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) - | 1, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) - | 0, Sum.inr 0, 0 => exact hm hB0w hX0w (by norm_num) - | 0, Sum.inr 0, 1 => exact kx0 - | 0, Sum.inr 1, 0 => exact hm hB0w hY0w (by norm_num) - | 0, Sum.inr 1, 1 => exact ky0 - | 1, Sum.inr 0, 0 => exact kx1 - | 1, Sum.inr 0, 1 => exact hm hB1w hX1w (by norm_num) - | 1, Sum.inr 1, 0 => exact ky1 - | 1, Sum.inr 1, 1 => exact hm hB1w hY1w (by norm_num) - -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule k → - y ∈ boostWeightSubmodule l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 := by - intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) - exacts [add_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), - sub_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), - add_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), - sub_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), - add_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num)), - sub_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num))] - have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by - rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> - simp only [hB0, hB1, hP0, hM1, hX0, hX1, hY0, hY1, mul_sub, mul_add] <;> - repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep 0).symm, sup_bot_eq] + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] end JetAlgebra diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index bed369543..ba0e71405 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -7,87 +7,92 @@ module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAverage /-! -# Grading by boost weight in the Z-direction - -The jet algebra is graded by the boost weight, corresponding to how the element scales under a -boost in the Z-direction: `x` has boost weight `k` when `ρ(boostZel t) x = t ^ k • x` for every -`t`. - -*Unlike the hypercharge grading, this one is not diagonal on the generators.* The gauge group -acts on each generator by a character, so `hyperchargePoly` could be defined by sending each -generator to `T ^ q` times itself. A boost does not: it mixes the time index with the `z` index, -so `∂_s B_μ` and `∂_s ψ_α` in the coordinate basis are not boost eigenvectors. For instance -`ρ(boostZel t) F_{0x} = ch F_{0x} - sh F_{zx}`. Only the light-cone combinations are homogeneous -— `F_{0x} ∓ F_{zx}` has boost weight `±2` — so a `LaurentPolynomial`-valued grading map in the -style of `Grading/Hypercharge` would first need a light-cone generating set. What is defined -here instead is the grading itself, as the family of weight submodules, which needs no change of -basis. - -With this grading we can define the subspace of boost weight zero. Any invariant under the -Lorentz group lies in it, since a boost fixes an invariant. - -*The grading is established.* `boostWeightSubmodule_isInternal` decomposes the jet algebra as an -internal direct sum of the weight submodules, and `GradedAlgebra boostWeightSubmodule` is an -instance. Independence comes from the weight spaces sitting inside the eigenspaces of a single -boost at the distinct eigenvalues `2 ^ k`. Exhaustiveness is the content of section O': it is -proved by descending to the component spaces, where the boost acts *linearly*. There the -statement propagates mechanically — the span of eigenvectors is closed under tensor products, -products, symmetric and exterior algebras, and base change — so the whole thing rests on -four-dimensional and two-dimensional base cases. For the spacetime-indexed spaces -`Module.Dual ℝ Lorentz.CoVector`, `Module.Dual ℂ Lorentz.CoℂModule` and `Module.Dual ℝ BBoson` -the eigenvectors are the light-cone combinations `b₀ ∓ b₃`, of weight `±2`, together with the -transverse directions, of weight `0`; on the spinor duals the boost is already diagonal, with -weights `∓1`. No covariance of `jetDeriv` is needed anywhere. +# Grading by boost weight + +The jet algebra is graded by the boost weight along each spatial axis: `x` has boost weight `k` +along the `i`-th axis when `ρ(boostAxis i t) x = t ^ k • x` for every `t`. This is proved: +`boostWeightSubmodule_isInternal` decomposes the jet algebra as an internal direct sum of the +weight submodules, and `GradedAlgebra (boostWeightSubmodule i)` is an instance for each of the +three axes. + +*It is not the hypercharge construction.* The gauge group acts on every generator by a +character, so `hyperchargePoly` can send each generator to `T ^ q` times itself. A boost does +not: it mixes the time index with the boost direction, so `∂_s B_μ` and `∂_s ψ_α` in the +coordinate basis are *not* boost eigenvectors — for the `z`-boost, +`ρ(boostZel t) F_{0x} = ch F_{0x} - sh F_{zx}`. Only the light-cone combinations are +homogeneous, so a `LaurentPolynomial`-valued grading map in the style of `Grading/Hypercharge` +would need a light-cone generating set. The grading is instead established as the family of +weight submodules, which needs no change of generators. + +*How exhaustiveness is proved.* Independence is immediate: the weight spaces sit inside the +eigenspaces of a single boost at the distinct eigenvalues `2 ^ k`. Exhaustiveness descends to +the component spaces, where the boost acts *linearly* and the statement propagates mechanically +— the span of eigenvectors is closed under tensor products, products, symmetric and exterior +algebras, and base change (section B). The recursion bottoms out at four- and two-dimensional +spaces: for `Module.Dual ℝ Lorentz.CoVector`, `Module.Dual ℂ Lorentz.CoℂModule` and +`Module.Dual ℝ BBoson` the eigenvectors are the light-cone combinations `b₀ ∓ b₃`, of weight +`±2`, together with the transverse directions, of weight `0`; on the spinor duals the boost is +already diagonal, with weights `∓1`. No covariance of `jetDeriv` is needed anywhere. + +*The three axes.* Everything is proved for the `z`-axis and transported. The axis boosts are +conjugate — a rotation by `π/2` carries the `z`-boost to the `x`- and `y`-boosts +(`boostXel_eq_conj`, `boostYel_eq_conj`) — so `isGraded_of_isGraded_two` moves the grading +between them without repeating the descent. + +With this grading we can single out the subspace of boost weight zero. Any invariant under the +Lorentz group lies in it, for every axis, since a boost fixes an invariant. The boost weight is bounded by the mass weight: a generator of mass weight `w` carries at most `w` units of boost weight. A bosonic generator `∂_s B_μ` of mass weight `2(1 + |s|)` has `1 + |s|` vector indices, each contributing at most `±2`; a fermionic generator `∂_s ψ_α` of mass weight `3 + 2|s|` has `|s|` vector indices and one spinor index, contributing at most -`2|s| + 1`. So `|boost weight| ≤ mass weight` throughout. +`2|s| + 1`. So `|boost weight| ≤ mass weight` throughout. Odd weights do occur: a single fermion +sits at `±1`. -The map `boostAvgZ` is this projection wherever the boost weights that occur are among -`0, ±2, ±4, ±6`: `boostAvgZ` acts on a weight-`k` element by the value at `k` of the -interpolating polynomial `boostAvgZWeight`, which is one at `k = 0` and vanishes at +The maps `boostAvgX`, `boostAvgY`, `boostAvgZ` are these projections wherever the boost weights +that occur are among `0, ±2, ±4, ±6`: each acts on a weight-`k` element by the value at `k` of +the interpolating polynomial `boostAvgZWeight`, which is one at `k = 0` and vanishes at `k = ±2, ±4, ±6`. On the covariant subalgebra in mass weight eight or less those are the only -weights that occur, so there it is exactly the projection onto boost weight zero. Note that this -is a statement about the *covariant* subalgebra, not about mass weight eight alone: the -mass-weight-eight element `∂_ρ ∂_σ ∂_τ B_μ` reaches boost weight `8`, and `boostAvgZWeight 8` is -not zero. +weights that occur, so there each is exactly the projection onto boost weight zero. Note that +this is a statement about the *covariant* subalgebra, not about mass weight eight alone: the +mass-weight-eight element `∂_ρ ∂_σ ∂_τ B_μ` reaches boost weight `8`, and +`boostAvgZWeight_eight_ne_zero`. ## i. Overview The weight submodules are defined by the eigenvector condition, so the multiplicative structure -is immediate: weights add under multiplication and the unit has weight zero. Relating them to -`boostAvgZ` is then a single computation, since `boostAvgZ` is a linear combination of boosts -and each acts on a weight-`k` element by a power of `t`. +is immediate: weights add under multiplication and the unit has weight zero. The work is +exhaustiveness, and it is done once for a general representation and then applied layer by +layer to the spaces the jet algebra is built from. ## ii. Key results -- `JetAlgebra.boostWeightSubmodule` : the elements of a given boost weight. +- `JetAlgebra.boostAxis` : the boost along a given spatial axis, and `boostXel_eq_conj`, + `boostYel_eq_conj` exhibiting the three as conjugate. +- `JetAlgebra.BoostWeight.IsGraded` and the transport lemmas of section B : the grading + propagates along tensor products, products, symmetric and exterior algebras, base change and + conjugation. +- `JetAlgebra.boostWeightSubmodule` : the elements of a given boost weight along a given axis. - `JetAlgebra.mul_mem_boostWeightSubmodule` : boost weights add under multiplication. - `JetAlgebra.mem_boostWeightSubmodule_zero_of_isInvariant` : an invariant has boost weight zero. -- `JetAlgebra.boostAvgZ_apply_of_mem` : `boostAvgZ` acts on a weight-`k` element by - `boostAvgZWeight k`. -- `JetAlgebra.boostAvgZ_apply_of_mem_zero` and `JetAlgebra.boostAvgZ_apply_eq_zero_of_mem` : - it is the identity on boost weight zero and annihilates weights `±2, ±4, ±6`. -- `JetAlgebra.boostWeightSubmodule_iSupIndep` : the weight spaces are independent. -- `JetAlgebra.boostWeightSubalgebra` : the subalgebra they span. -- `JetAlgebra.boostWeightSubmodule_isInternal` : the weight submodules decompose the jet - algebra as an internal direct sum, so `GradedAlgebra boostWeightSubmodule` holds. -- `JetAlgebra.BoostWeight.IsGraded` and the transport lemmas of section O : the grading - propagates along tensor products, products, symmetric and exterior algebras and base change. +- `JetAlgebra.boostWeightSubmodule_isInternal` : the weight submodules decompose the jet algebra + as an internal direct sum, so `GradedAlgebra (boostWeightSubmodule i)` holds. +- `JetAlgebra.boostAvgAxis_apply_of_mem` : the boost average along an axis acts on a weight-`k` + element by `boostAvgZWeight k`, hence is the identity on boost weight zero and annihilates + weights `±2, ±4, ±6`. ## iii. Table of contents -- O. Boost weights of a general representation -- O'. The component spaces are boost-graded -- A. The boost-weight submodules -- B. Homogeneous elements -- B'. Independence of the weight submodules -- B''. The span of the homogeneous elements is a subalgebra -- C. The interpolating polynomial of `boostAvgZ` -- D. `boostAvgZ` is the projection onto boost weight zero -- E. The grading +- A. The boosts along the three axes +- B. Boost weights of a general representation +- C. The component spaces are boost-graded +- D. The boost-weight submodules +- E. Homogeneous elements +- F. Independence of the weight submodules +- G. The span of the homogeneous elements is a subalgebra +- H. The interpolating polynomial of the boost averages +- I. The boost averages are the projections onto boost weight zero +- J. The grading -/ @@ -102,7 +107,97 @@ namespace JetAlgebra /-! -## O. Boost weights of a general representation +## A. The boosts along the three axes + +The three axis boosts are conjugate: a rotation by `π/2` carries the `z`-boost to the `x`- and +`y`-boosts. Everything below is therefore proved for the `z`-axis and transported, rather than +repeated three times. + +-/ + +/-- The boost along the `i`-th spatial axis. -/ +noncomputable def boostAxis : Fin 3 → (t : ℝ) → t ≠ 0 → SL(2,ℂ) + | 0, t, ht => boostXel t ht + | 1, t, ht => boostYel t ht + | 2, t, ht => boostZel t ht + +@[simp] lemma boostAxis_zero (t : ℝ) (ht : t ≠ 0) : boostAxis 0 t ht = boostXel t ht := rfl +@[simp] lemma boostAxis_one (t : ℝ) (ht : t ≠ 0) : boostAxis 1 t ht = boostYel t ht := rfl +@[simp] lemma boostAxis_two (t : ℝ) (ht : t ≠ 0) : boostAxis 2 t ht = boostZel t ht := rfl + +lemma boostAxis_inv (i : Fin 3) (t : ℝ) (ht : t ≠ 0) : + (boostAxis i t ht)⁻¹ = boostAxis i t⁻¹ (inv_ne_zero ht) := by + fin_cases i + · exact boostXel_inv t ht + · exact boostYel_inv t ht + · exact boostZel_inv t ht + +private lemma sqrtTwo_sq : (((Real.sqrt 2 : ℝ) : ℂ)) ^ 2 = 2 := by + rw [← Complex.ofReal_pow, Real.sq_sqrt (by norm_num : (0:ℝ) ≤ 2)] + norm_num + +private lemma sqrtTwo_ne_zero : (((Real.sqrt 2 : ℝ) : ℂ)) ≠ 0 := by + simp [] + +private lemma sqrtTwo_inv_mul : + ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹) * ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹) = 2⁻¹ := by + rw [← mul_inv, ← sq, sqrtTwo_sq] + +/-- The rotation by `π/2` about the `y`-axis, carrying the `z`-boost to the `x`-boost. -/ +noncomputable def rotZX : SL(2,ℂ) := + ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, -1; 1, 1], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow, sqrtTwo_sq] + norm_num⟩ + +/-- The rotation by `π/2` about the `x`-axis, carrying the `z`-boost to the `y`-boost. -/ +noncomputable def rotZY : SL(2,ℂ) := + ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, Complex.I; Complex.I, 1], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow, sqrtTwo_sq, + Complex.I_mul_I] + norm_num⟩ + +lemma boostXel_eq_conj (t : ℝ) (ht : t ≠ 0) : + boostXel t ht = rotZX * boostZel t ht * rotZX⁻¹ := by + have h0 := sqrtTwo_ne_zero + have hc := sqrtTwo_inv_mul + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Subtype.ext ?_ + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> + · simp [Matrix.SpecialLinearGroup.coe_mul, rotZX, boostZel, boostXel, + Matrix.mul_apply, Fin.sum_univ_two] + field_simp + simp only [sqrtTwo_sq] + try ring + +lemma boostYel_eq_conj (t : ℝ) (ht : t ≠ 0) : + boostYel t ht = rotZY * boostZel t ht * rotZY⁻¹ := by + have h0 := sqrtTwo_ne_zero + have hc := sqrtTwo_inv_mul + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Subtype.ext ?_ + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> + · simp [Matrix.SpecialLinearGroup.coe_mul, rotZY, boostZel, boostYel, + Matrix.mul_apply, Fin.sum_univ_two] + field_simp + simp only [sqrtTwo_sq, Complex.I_sq] + try ring + +/-- Every axis boost is a rotation of the `z`-boost. -/ +lemma exists_conj_boostAxis (i : Fin 3) : + ∃ R : SL(2,ℂ), ∀ (t : ℝ) (ht : t ≠ 0), + boostAxis i t ht = R * boostAxis 2 t ht * R⁻¹ := by + fin_cases i + · exact ⟨rotZX, fun t ht => boostXel_eq_conj t ht⟩ + · exact ⟨rotZY, fun t ht => boostYel_eq_conj t ht⟩ + · exact ⟨1, fun t ht => by simp⟩ + +/-! + +## B. Boost weights of a general representation The descent to the component spaces is uniform, so it is carried out once here for an arbitrary representation. The weight spaces are defined exactly as `boostWeightSubmodule` is, and @@ -118,49 +213,51 @@ namespace BoostWeight variable {K : Type*} [Field K] [Algebra ℝ K] variable {M N V : Type*} [AddCommGroup M] [Module K M] [AddCommGroup N] [Module K N] [AddCommGroup V] [Module K V] +variable {i : Fin 3} private lemma algebraMap_ne_zero {t : ℝ} (ht : t ≠ 0) : (algebraMap ℝ K t) ≠ 0 := fun h => ht ((algebraMap ℝ K).injective (by simpa using h)) /-- The weight-`w` space of a representation: the vectors scaling by `t ^ w` under the `z`-boost at parameter `t`. -/ -def space (rep : Representation K SL(2,ℂ) M) (w : ℤ) : Submodule K M where +def space (rep : Representation K SL(2,ℂ) M) (i : Fin 3) (w : ℤ) : Submodule K M where carrier := {x | ∀ (t : ℝ) (ht : t ≠ 0), - rep (boostZel t ht) x = (algebraMap ℝ K t) ^ w • x} + rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x} add_mem' {a b} ha hb := fun t ht => by rw [map_add, ha t ht, hb t ht, smul_add] zero_mem' := fun t ht => by rw [map_zero, smul_zero] smul_mem' c x hx := fun t ht => by rw [map_smul, hx t ht, smul_comm] -lemma mem_space {rep : Representation K SL(2,ℂ) M} {w : ℤ} {x : M} : - x ∈ space rep w ↔ ∀ (t : ℝ) (ht : t ≠ 0), - rep (boostZel t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl +lemma mem_space {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {w : ℤ} {x : M} : + x ∈ space rep i w ↔ ∀ (t : ℝ) (ht : t ≠ 0), + rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl /-- The span of all the weight spaces. -/ -def weightSpan (rep : Representation K SL(2,ℂ) M) : Submodule K M := ⨆ w, space rep w +def weightSpan (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Submodule K M := + ⨆ w, space rep i w /-- A representation is boost-graded when its weight spaces span. -/ -def IsGraded (rep : Representation K SL(2,ℂ) M) : Prop := weightSpan rep = ⊤ +def IsGraded (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Prop := weightSpan rep i = ⊤ lemma mem_weightSpan_of_mem_space {rep : Representation K SL(2,ℂ) M} {w : ℤ} {x : M} - (h : x ∈ space rep w) : x ∈ weightSpan rep := + (h : x ∈ space rep i w) : x ∈ weightSpan rep i := Submodule.mem_iSup_of_mem w h -lemma mem_weightSpan_of_isGraded {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep) (x : M) : - x ∈ weightSpan rep := by rw [IsGraded] at h; rw [h]; trivial +lemma mem_weightSpan_of_isGraded {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep i) (x : M) : + x ∈ weightSpan rep i := by rw [IsGraded] at h; rw [h]; trivial lemma isGraded_iff_forall_mem {rep : Representation K SL(2,ℂ) M} : - IsGraded rep ↔ ∀ x, x ∈ weightSpan rep := + IsGraded rep i ↔ ∀ x, x ∈ weightSpan rep i := ⟨mem_weightSpan_of_isGraded, fun h => eq_top_iff.mpr fun x _ => h x⟩ /-- A representation with a spanning family of vectors in the weight span is graded. -/ lemma isGraded_of_span {rep : Representation K SL(2,ℂ) M} {S : Set M} - (hS : Submodule.span K S = ⊤) (h : ∀ x ∈ S, x ∈ weightSpan rep) : IsGraded rep := + (hS : Submodule.span K S = ⊤) (h : ∀ x ∈ S, x ∈ weightSpan rep i) : IsGraded rep i := eq_top_iff.mpr (hS ▸ Submodule.span_le.mpr h) /-- A representation with a basis of vectors lying in the weight span is graded. -/ lemma isGraded_of_basis {ι : Type*} {rep : Representation K SL(2,ℂ) M} (b : Module.Basis ι K M) - (h : ∀ i, b i ∈ weightSpan rep) : IsGraded rep := - isGraded_of_span b.span_eq (by rintro _ ⟨i, rfl⟩; exact h i) + (h : ∀ n, b n ∈ weightSpan rep i) : IsGraded rep i := + isGraded_of_span b.span_eq (by rintro _ ⟨n, rfl⟩; exact h n) /-! @@ -169,8 +266,8 @@ lemma isGraded_of_basis {ι : Type*} {rep : Representation K SL(2,ℂ) M} (b : M -/ lemma tmul_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - {a b : ℤ} {x : M} {y : N} (hx : x ∈ space rep a) (hy : y ∈ space rep₂ b) : - x ⊗ₜ[K] y ∈ space (rep.tprod rep₂) (a + b) := by + {a b : ℤ} {x : M} {y : N} (hx : x ∈ space rep i a) (hy : y ∈ space rep₂ i b) : + x ⊗ₜ[K] y ∈ space (rep.tprod rep₂) i (a + b) := by intro t ht show (TensorProduct.map _ _) _ = _ rw [TensorProduct.map_tmul, hx t ht, hy t ht] @@ -178,7 +275,7 @@ lemma tmul_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representati rw [← zpow_add₀ (algebraMap_ne_zero (K := K) ht), add_comm b a] lemma isGraded_tprod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - (h₁ : IsGraded rep) (h₂ : IsGraded rep₂) : IsGraded (rep.tprod rep₂) := by + (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.tprod rep₂) i := by refine isGraded_iff_forall_mem.mpr fun z => ?_ induction z using TensorProduct.induction_on with | zero => exact Submodule.zero_mem _ @@ -203,22 +300,22 @@ lemma isGraded_tprod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representati -/ lemma inl_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - {a : ℤ} {x : M} (hx : x ∈ space rep a) : - ((x, 0) : M × N) ∈ space (rep.prod rep₂) a := by + {a : ℤ} {x : M} (hx : x ∈ space rep i a) : + ((x, 0) : M × N) ∈ space (rep.prod rep₂) i a := by intro t ht show ((rep _ x, rep₂ _ 0) : M × N) = _ rw [map_zero, hx t ht, Prod.smul_mk, smul_zero] lemma inr_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - {a : ℤ} {y : N} (hy : y ∈ space rep₂ a) : - ((0, y) : M × N) ∈ space (rep.prod rep₂) a := by + {a : ℤ} {y : N} (hy : y ∈ space rep₂ i a) : + ((0, y) : M × N) ∈ space (rep.prod rep₂) i a := by intro t ht show ((rep _ 0, rep₂ _ y) : M × N) = _ rw [map_zero, hy t ht, Prod.smul_mk, smul_zero] lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - (h₁ : IsGraded rep) (h₂ : IsGraded rep₂) : IsGraded (rep.prod rep₂) := by - have hleft : ∀ x : M, ((x, (0 : N))) ∈ weightSpan (rep.prod rep₂) := by + (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.prod rep₂) i := by + have hleft : ∀ x : M, ((x, (0 : N))) ∈ weightSpan (rep.prod rep₂) i := by intro x have hx := mem_weightSpan_of_isGraded h₁ x induction hx using Submodule.iSup_induction' with @@ -227,7 +324,7 @@ lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representatio | add u v _ _ ihu ihv => rw [show ((u + v, (0 : N))) = ((u, (0 : N))) + ((v, (0 : N))) from by ext <;> simp] exact Submodule.add_mem _ ihu ihv - have hright : ∀ y : N, (((0 : M), y)) ∈ weightSpan (rep.prod rep₂) := by + have hright : ∀ y : N, (((0 : M), y)) ∈ weightSpan (rep.prod rep₂) i := by intro y have hy := mem_weightSpan_of_isGraded h₂ y induction hy using Submodule.iSup_induction' with @@ -249,20 +346,20 @@ lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representatio variable {A : Type*} [Ring A] [Algebra K A] lemma one_mem_space {rep : Representation K SL(2,ℂ) A} (hone : ∀ Λ, rep Λ 1 = 1) : - (1 : A) ∈ space rep 0 := fun t _ => by rw [hone, zpow_zero, one_smul] + (1 : A) ∈ space rep i 0 := fun t _ => by rw [hone, zpow_zero, one_smul] lemma mul_mem_space {rep : Representation K SL(2,ℂ) A} (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) - {a b : ℤ} {x y : A} (hx : x ∈ space rep a) (hy : y ∈ space rep b) : - x * y ∈ space rep (a + b) := by + {a b : ℤ} {x y : A} (hx : x ∈ space rep i a) (hy : y ∈ space rep i b) : + x * y ∈ space rep i (a + b) := by intro t ht rw [hmul, hx t ht, hy t ht, smul_mul_smul_comm, zpow_add₀ (algebraMap_ne_zero (K := K) ht)] lemma mul_mem_weightSpan {rep : Representation K SL(2,ℂ) A} (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) - {x y : A} (hx : x ∈ weightSpan rep) (hy : y ∈ weightSpan rep) : - x * y ∈ weightSpan rep := by + {x y : A} (hx : x ∈ weightSpan rep i) (hy : y ∈ weightSpan rep i) : + x * y ∈ weightSpan rep i := by induction hx using Submodule.iSup_induction' with | mem a u hu => induction hy using Submodule.iSup_induction' with @@ -273,7 +370,7 @@ lemma mul_mem_weightSpan {rep : Representation K SL(2,ℂ) A} | add u v _ _ ihu ihv => rw [add_mul]; exact Submodule.add_mem _ ihu ihv lemma algebraMap_mem_weightSpan {rep : Representation K SL(2,ℂ) A} - (hone : ∀ Λ, rep Λ 1 = 1) (r : K) : algebraMap K A r ∈ weightSpan rep := by + (hone : ∀ Λ, rep Λ 1 = 1) (r : K) : algebraMap K A r ∈ weightSpan rep i := by rw [Algebra.algebraMap_eq_smul_one] exact Submodule.smul_mem _ _ (mem_weightSpan_of_mem_space (one_mem_space hone)) @@ -286,7 +383,7 @@ lemma isGraded_symmetricAlgebra {V : Type*} [AddCommGroup V] [Module K V] repA Λ (x * y) = repA Λ x * repA Λ y) (hι : ∀ (Λ : SL(2,ℂ)) (x : V), repA Λ (SymmetricAlgebra.ι K V x) = SymmetricAlgebra.ι K V (repV Λ x)) - (hV : IsGraded repV) : IsGraded repA := by + (hV : IsGraded repV i) : IsGraded repA i := by refine isGraded_iff_forall_mem.mpr fun x => ?_ induction x using SymmetricAlgebra.induction with | algebraMap r => exact algebraMap_mem_weightSpan hone r @@ -310,7 +407,7 @@ lemma isGraded_exteriorAlgebra {V : Type*} [AddCommGroup V] [Module K V] repA Λ (x * y) = repA Λ x * repA Λ y) (hι : ∀ (Λ : SL(2,ℂ)) (x : V), repA Λ (ExteriorAlgebra.ι K x) = ExteriorAlgebra.ι K (repV Λ x)) - (hV : IsGraded repV) : IsGraded repA := by + (hV : IsGraded repV i) : IsGraded repA i := by refine isGraded_iff_forall_mem.mpr fun x => ?_ induction x using ExteriorAlgebra.induction with | algebraMap r => exact algebraMap_mem_weightSpan hone r @@ -338,31 +435,32 @@ lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} (b : Module.Basis (Fin 1 ⊕ Fin 3) K M) (h : ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), rep Λ (b μ) = ∑ j, algebraMap ℝ K ((Lorentz.SL2C.toLorentzGroup Λ).1 j μ) • b j) : - IsGraded rep := by + IsGraded rep 2 := by haveI : CharZero K := charZero_of_injective_algebraMap (algebraMap ℝ K).injective have key : ∀ (t : ℝ) (ht : t ≠ 0) (μ : Fin 1 ⊕ Fin 3), - rep (boostZel t ht) (b μ) = + rep (boostAxis 2 t ht) (b μ) = ∑ j, algebraMap ℝ K (boostMatZ t j μ) • b j := by intro t ht μ rw [h] - exact Finset.sum_congr rfl fun j _ => by rw [toLorentzGroup_boostZel] - have hplus : b (Sum.inl 0) - b (Sum.inr 2) ∈ space rep 2 := by + exact Finset.sum_congr rfl fun j _ => by + rw [show boostAxis 2 t ht = boostZel t ht from rfl, toLorentzGroup_boostZel] + have hplus : b (Sum.inl 0) - b (Sum.inr 2) ∈ space rep 2 2 := by intro t ht have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht rw [map_sub, key t ht, key t ht] simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, map_div₀, map_sub, + map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, map_add, map_pow, map_inv₀, map_ofNat, map_neg] match_scalars <;> (field_simp; try ring_nf; try norm_num) - have hminus : b (Sum.inl 0) + b (Sum.inr 2) ∈ space rep (-2) := by + have hminus : b (Sum.inl 0) + b (Sum.inr 2) ∈ space rep 2 (-2) := by intro t ht have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht rw [map_add, key t ht, key t ht] simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, map_div₀, map_sub, + map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, map_add, map_pow, map_inv₀, map_ofNat, map_neg] match_scalars <;> (field_simp; try ring_nf; try norm_num) - have htr : ∀ i : Fin 3, i = 0 ∨ i = 1 → b (Sum.inr i) ∈ space rep 0 := by + have htr : ∀ i' : Fin 3, i' = 0 ∨ i' = 1 → b (Sum.inr i') ∈ space rep 2 0 := by rintro i (rfl | rfl) <;> · intro t ht rw [key t ht] @@ -392,9 +490,9 @@ lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} lemma isGraded_baseChange {A : Type*} [AddCommGroup A] [Module ℝ A] {repR : Representation ℝ SL(2,ℂ) A} {repC : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] A)} (h : ∀ (Λ : SL(2,ℂ)) (c : ℂ) (y : A), repC Λ (c ⊗ₜ[ℝ] y) = c ⊗ₜ[ℝ] repR Λ y) - (hR : IsGraded repR) : IsGraded repC := by - have htmul : ∀ (c : ℂ) (w : ℤ) (y : A), y ∈ space repR w → - (c ⊗ₜ[ℝ] y : ℂ ⊗[ℝ] A) ∈ space repC w := by + (hR : IsGraded repR i) : IsGraded repC i := by + have htmul : ∀ (c : ℂ) (w : ℤ) (y : A), y ∈ space repR i w → + (c ⊗ₜ[ℝ] y : ℂ ⊗[ℝ] A) ∈ space repC i w := by intro c w y hy t ht rw [h, hy t ht, TensorProduct.tmul_smul, show ((algebraMap ℝ ℝ) t) ^ w = t ^ w from by simp, @@ -410,11 +508,37 @@ lemma isGraded_baseChange {A : Type*} [AddCommGroup A] [Module ℝ A] | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv + +/-! + +### Transport between the three axes + +-/ + +/-- The axis boosts are conjugate, so being graded for one of them is being graded for all. -/ +lemma isGraded_of_isGraded_two {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep 2) + (i : Fin 3) : IsGraded rep i := by + obtain ⟨R, hR⟩ := exists_conj_boostAxis i + have hsurj : ∀ x : M, rep R (rep R⁻¹ x) = x := by + intro x + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] + have hmap : ∀ (w : ℤ) (u : M), u ∈ space rep 2 w → rep R u ∈ space rep i w := by + intro w u hu t ht + rw [← Module.End.mul_apply, ← map_mul, hR t ht, inv_mul_cancel_right, map_mul, + Module.End.mul_apply, hu t ht, map_smul] + refine isGraded_iff_forall_mem.mpr fun x => ?_ + obtain ⟨y, rfl⟩ : ∃ y, rep R y = x := ⟨rep R⁻¹ x, hsurj x⟩ + have hy := mem_weightSpan_of_isGraded h y + induction hy using Submodule.iSup_induction' with + | mem w u hu => exact mem_weightSpan_of_mem_space (hmap w u hu) + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv + end BoostWeight /-! -## O'. The component spaces are boost-graded +## C. The component spaces are boost-graded Each layer of the jet algebra is graded once the layer below it is: the two four-dimensional derivative and target spaces by `isGraded_of_lorentzColumns`, the spinor duals directly (the @@ -425,25 +549,25 @@ exterior-algebra transports. open BoostWeight in /-- The real dual covectors — the derivative slots — are boost-graded. -/ -lemma isGraded_coVectorDual : IsGraded (Lorentz.CoVector.sl2Rep.dual) := +lemma isGraded_coVectorDual : IsGraded (Lorentz.CoVector.sl2Rep.dual) 2 := isGraded_of_lorentzColumns Lorentz.CoVector.basis.dualBasis fun Λ μ => by simpa using Lorentz.CoVector.sl2Rep_dual_dualBasis Λ μ open BoostWeight in /-- The complex dual covectors are boost-graded. -/ -lemma isGraded_coℂModuleDual : IsGraded (Lorentz.CoℂModule.SL2CRep.dual) := +lemma isGraded_coℂModuleDual : IsGraded (Lorentz.CoℂModule.SL2CRep.dual) 2 := isGraded_of_lorentzColumns Lorentz.complexCoBasis.dualBasis fun Λ μ => by simpa using Lorentz.CoℂModule.SL2CRep_dual_dualBasis Λ μ open BoostWeight in /-- The dual B-boson target space is boost-graded. -/ -lemma isGraded_bBosonDual : IsGraded (BBoson.repLorentzGroup.dual) := +lemma isGraded_bBosonDual : IsGraded (BBoson.repLorentzGroup.dual) 2 := isGraded_of_lorentzColumns BBoson.basis.dualBasis fun Λ μ => by simpa using BBoson.repLorentzGroup_dual_dualBasis Λ μ open BoostWeight in /-- The real algebra of derivative symbols is boost-graded. -/ -lemma isGraded_derivAlgebraReal : IsGraded (DerivAlgebraReal.repLorentzGroup) := +lemma isGraded_derivAlgebraReal : IsGraded (DerivAlgebraReal.repLorentzGroup) 2 := isGraded_symmetricAlgebra (repV := Lorentz.CoVector.sl2Rep.dual) (fun Λ => by show (SymmetricAlgebra.lift @@ -458,7 +582,7 @@ lemma isGraded_derivAlgebraReal : IsGraded (DerivAlgebraReal.repLorentzGroup) := open BoostWeight in /-- The complex algebra of derivative symbols is boost-graded. -/ -lemma isGraded_derivAlgebraComplex : IsGraded (DerivAlgebraComplex.repLorentzGroup) := +lemma isGraded_derivAlgebraComplex : IsGraded (DerivAlgebraComplex.repLorentzGroup) 2 := isGraded_symmetricAlgebra (repV := Lorentz.CoℂModule.SL2CRep.dual) (fun Λ => DerivAlgebraComplex.repLorentzGroup_apply_one Λ) (fun Λ x y => DerivAlgebraComplex.repLorentzGroup_apply_mul Λ x y) @@ -468,12 +592,12 @@ lemma isGraded_derivAlgebraComplex : IsGraded (DerivAlgebraComplex.repLorentzGro open BoostWeight in /-- The B-boson jet component space is boost-graded. -/ lemma isGraded_bBosonJetComponentSpace : - IsGraded (BBoson.JetComponentSpace.repLorentzGroup) := + IsGraded (BBoson.JetComponentSpace.repLorentzGroup) 2 := isGraded_tprod isGraded_derivAlgebraReal isGraded_bBosonDual open BoostWeight in /-- The B-boson jet algebra is boost-graded. -/ -lemma isGraded_bBosonJetAlgebra : IsGraded (BBoson.JetAlgebra.repLorentzGroup) := +lemma isGraded_bBosonJetAlgebra : IsGraded (BBoson.JetAlgebra.repLorentzGroup) 2 := isGraded_symmetricAlgebra (repV := BBoson.JetComponentSpace.repLorentzGroup) (fun Λ => by show (SymmetricAlgebra.lift @@ -489,53 +613,57 @@ lemma isGraded_bBosonJetAlgebra : IsGraded (BBoson.JetAlgebra.repLorentzGroup) : open BoostWeight in /-- The complexified B-boson jet algebra is boost-graded. -/ lemma isGraded_complexBBosonJetAlgebra : - IsGraded (BBoson.JetAlgebra.complexRepLorentzGroup) := + IsGraded (BBoson.JetAlgebra.complexRepLorentzGroup) 2 := isGraded_baseChange (fun _ _ _ => rfl) isGraded_bBosonJetAlgebra open BoostWeight in /-- The dual charged-lepton spinors are boost-graded: the boost is already diagonal on them, with weights `∓1`. -/ -lemma isGraded_leptonSingletDual : IsGraded (LeptonSinglet.repLorentzGroup.dual) := by +lemma isGraded_leptonSingletDual : IsGraded (LeptonSinglet.repLorentzGroup.dual) 2 := by refine isGraded_of_basis LeptonSinglet.basis.dualBasis fun α => ?_ match α with | 0 => refine mem_weightSpan_of_mem_space (w := -1) fun t ht => ?_ - rw [LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] + rw [show boostAxis 2 t ht = boostZel t ht from rfl, + LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, add_zero, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, zero_smul, add_zero, Complex.conj_ofReal] rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] rfl | 1 => refine mem_weightSpan_of_mem_space (w := 1) fun t ht => ?_ - rw [LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] + rw [show boostAxis 2 t ht = boostZel t ht from rfl, + LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, zero_add, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, zero_smul, zero_add, Complex.conj_ofReal] rw [zpow_one] rfl open BoostWeight in /-- The dual conjugate charged-lepton spinors are boost-graded. -/ -lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.conj.dual) := by +lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.conj.dual) 2 := by refine isGraded_of_basis LeptonSinglet.basis.conj.dualBasis fun α => ?_ match α with | 0 => refine mem_weightSpan_of_mem_space (w := -1) fun t ht => ?_ - rw [LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] + rw [show boostAxis 2 t ht = boostZel t ht from rfl, + LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, zero_smul, add_zero] rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] rfl | 1 => refine mem_weightSpan_of_mem_space (w := 1) fun t ht => ?_ - rw [LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] + rw [show boostAxis 2 t ht = boostZel t ht from rfl, + LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, zero_smul, zero_add] rw [zpow_one] rfl @@ -543,13 +671,13 @@ lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.c open BoostWeight in /-- The charged-lepton jet component space is boost-graded. -/ lemma isGraded_leptonJetComponentSpace : - IsGraded (LeptonSinglet.JetComponentSpace.repLorentzGroup) := + IsGraded (LeptonSinglet.JetComponentSpace.repLorentzGroup) 2 := isGraded_prod (isGraded_tprod isGraded_derivAlgebraComplex isGraded_leptonSingletDual) (isGraded_tprod isGraded_derivAlgebraComplex isGraded_leptonSingletConjDual) open BoostWeight in /-- The charged-lepton jet algebra is boost-graded. -/ -lemma isGraded_leptonJetAlgebra : IsGraded (LeptonSinglet.JetAlgebra.repLorentzGroup) := +lemma isGraded_leptonJetAlgebra : IsGraded (LeptonSinglet.JetAlgebra.repLorentzGroup) 2 := isGraded_exteriorAlgebra (repV := LeptonSinglet.JetComponentSpace.repLorentzGroup) (fun Λ => by show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) 1 = 1 @@ -565,53 +693,52 @@ lemma isGraded_leptonJetAlgebra : IsGraded (LeptonSinglet.JetAlgebra.repLorentzG open BoostWeight in /-- The lepton–gauge-sector jet algebra is boost-graded. -/ -lemma isGraded_jetAlgebra : IsGraded (repLorentzGroup) := +lemma isGraded_jetAlgebra : IsGraded (repLorentzGroup) 2 := isGraded_tprod isGraded_complexBBosonJetAlgebra isGraded_leptonJetAlgebra /-! -## A. The boost-weight submodules +## D. The boost-weight submodules -/ -/-- The submodule of elements of boost weight `k`: those scaling by `t ^ k` under the `z`-boost - with parameter `t`. -/ -def boostWeightSubmodule (k : ℤ) : Submodule ℂ JetAlgebra where - carrier := {x | ∀ (t : ℝ) (ht : t ≠ 0), - repLorentzGroup (boostZel t ht) x = (((t : ℝ) : ℂ) ^ k) • x} - add_mem' {a b} ha hb := fun t ht => by rw [map_add, ha t ht, hb t ht, smul_add] - zero_mem' := fun t ht => by rw [map_zero, smul_zero] - smul_mem' c x hx := fun t ht => by rw [map_smul, hx t ht, smul_comm] +variable {i : Fin 3} + +/-- The scalar action of a real parameter on the jet algebra, in the form the weight condition + presents it. -/ +private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl + +/-- The submodule of elements of boost weight `k` along the `i`-th spatial axis: those scaling + by `t ^ k` under the boost with parameter `t`. -/ +noncomputable def boostWeightSubmodule (i : Fin 3) (k : ℤ) : Submodule ℂ JetAlgebra := + BoostWeight.space repLorentzGroup i k -@[simp] lemma mem_boostWeightSubmodule {k : ℤ} {x : JetAlgebra} : - x ∈ boostWeightSubmodule k ↔ ∀ (t : ℝ) (ht : t ≠ 0), - repLorentzGroup (boostZel t ht) x = (((t : ℝ) : ℂ) ^ k) • x := Iff.rfl + x ∈ boostWeightSubmodule i k ↔ ∀ (t : ℝ) (ht : t ≠ 0), + repLorentzGroup (boostAxis i t ht) x = (((t : ℝ) : ℂ) ^ k) • x := Iff.rfl /-- The unit has boost weight zero. -/ -lemma one_mem_boostWeightSubmodule : (1 : JetAlgebra) ∈ boostWeightSubmodule 0 := - fun t _ => by rw [repLorentzGroup_apply_one, zpow_zero, one_smul] +lemma one_mem_boostWeightSubmodule : (1 : JetAlgebra) ∈ boostWeightSubmodule i 0 := + BoostWeight.one_mem_space repLorentzGroup_apply_one /-- Boost weights add under multiplication. -/ lemma mul_mem_boostWeightSubmodule {k l : ℤ} {x y : JetAlgebra} - (hx : x ∈ boostWeightSubmodule k) (hy : y ∈ boostWeightSubmodule l) : - x * y ∈ boostWeightSubmodule (k + l) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_apply_mul, hx t ht, hy t ht, smul_mul_smul_comm, zpow_add₀ ht'] + (hx : x ∈ boostWeightSubmodule i k) (hy : y ∈ boostWeightSubmodule i l) : + x * y ∈ boostWeightSubmodule i (k + l) := + BoostWeight.mul_mem_space repLorentzGroup_apply_mul hx hy -instance : SetLike.GradedMonoid boostWeightSubmodule where +instance : SetLike.GradedMonoid (boostWeightSubmodule i) where one_mem := one_mem_boostWeightSubmodule mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy -/-- A Lorentz-invariant element has boost weight zero. -/ +/-- A Lorentz-invariant element has boost weight zero, along every axis. -/ lemma mem_boostWeightSubmodule_zero_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : - x ∈ boostWeightSubmodule 0 := - fun t ht => by rw [hx.2 (boostZel t ht), zpow_zero, one_smul] + x ∈ boostWeightSubmodule i 0 := + fun t ht => by rw [hx.2 (boostAxis i t ht), zpow_zero, one_smul] /-! -## B. Homogeneous elements +## E. Homogeneous elements The coordinate components of a field strength are not boost eigenvectors; the light-cone combinations are. The two components with both indices transverse to the boost — `F_{xy}` — and @@ -622,13 +749,14 @@ the one along it — `F_{0z}` — are invariant. /-- The light-cone combination `F_{0x} - F_{zx}` has boost weight `2`. -/ lemma fieldStrengthDeriv_lightCone_mem_two : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule 2 := by + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule 2 2 := by intro t ht + simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, Complex.ofReal_zero, Complex.ofReal_one, + mul_zero, mul_one, Complex.ofReal_zero, zero_smul, smul_zero, add_zero, zero_add] push_cast match_scalars <;> (field_simp; ring) @@ -636,110 +764,117 @@ lemma fieldStrengthDeriv_lightCone_mem_two : /-- The light-cone combination `F_{0x} + F_{zx}` has boost weight `-2`. -/ lemma fieldStrengthDeriv_lightCone_mem_neg_two : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule (-2) := by + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule 2 (-2) := by intro t ht + simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, Complex.ofReal_zero, Complex.ofReal_one, + mul_zero, mul_one, Complex.ofReal_zero, zero_smul, smul_zero, add_zero, zero_add] push_cast match_scalars <;> (field_simp; ring) /-- The transverse component `F_{xy}` has boost weight zero. -/ lemma fieldStrengthDeriv_transverse_mem_zero : - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ boostWeightSubmodule 0 := by + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ boostWeightSubmodule 2 0 := by intro t ht + simp only [algebraMap_real_complex] rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, zero_mul, mul_one, one_mul, Complex.ofReal_zero, Complex.ofReal_one, + mul_zero, mul_one, Complex.ofReal_zero, Complex.ofReal_one, zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> norm_num + match_scalars; norm_num /-- The zeroth-order lepton coordinate `ψ_0` has boost weight `-1`. -/ -lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ boostWeightSubmodule (-1) := by +lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ boostWeightSubmodule 2 (-1) := by intro t ht - rw [repLorentzGroup_Dψ_nil, boostZel_inv_coe] + simp only [algebraMap_real_complex] + rw [boostAxis_two, repLorentzGroup_Dψ_nil, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, add_zero, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, zero_smul, add_zero, Complex.conj_ofReal] rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] /-- The zeroth-order lepton coordinate `ψ_1` has boost weight `1`. -/ -lemma Dψ_nil_one_mem_one : Dψ [] 1 ∈ boostWeightSubmodule 1 := by +lemma Dψ_nil_one_mem_one : Dψ [] 1 ∈ boostWeightSubmodule 2 1 := by intro t ht - rw [repLorentzGroup_Dψ_nil, boostZel_inv_coe] + simp only [algebraMap_real_complex] + rw [boostAxis_two, repLorentzGroup_Dψ_nil, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, star_zero, zero_smul, zero_add, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Fin.isValue, Complex.star_def, map_zero, zero_smul, zero_add, Complex.conj_ofReal] rw [zpow_one] /-- The zeroth-order conjugate lepton coordinate `ψ̄_0` has boost weight `-1`. -/ -lemma Dbarψ_nil_zero_mem_neg_one : Dbarψ [] 0 ∈ boostWeightSubmodule (-1) := by +lemma Dbarψ_nil_zero_mem_neg_one : Dbarψ [] 0 ∈ boostWeightSubmodule 2 (-1) := by intro t ht - rw [repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] + simp only [algebraMap_real_complex] + rw [boostAxis_two, repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, zero_smul, add_zero] rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] /-- The zeroth-order conjugate lepton coordinate `ψ̄_1` has boost weight `1`. -/ -lemma Dbarψ_nil_one_mem_one : Dbarψ [] 1 ∈ boostWeightSubmodule 1 := by +lemma Dbarψ_nil_one_mem_one : Dbarψ [] 1 ∈ boostWeightSubmodule 2 1 := by intro t ht - rw [repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] + simp only [algebraMap_real_complex] + rw [boostAxis_two, repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, zero_smul, zero_add] rw [zpow_one] /-- The gauge potential in the light-cone direction, `B_0 - B_z`, has boost weight `2`. -/ lemma B_lightCone_mem_two : [JetGenerators.dB {} (Sum.inl 0)]ₐ - [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ - boostWeightSubmodule 2 := by + boostWeightSubmodule 2 2 := by intro t ht + simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_B, repLorentzGroup_B] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, Complex.ofReal_one, - zero_smul, add_zero, zero_add, one_smul] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, + zero_smul, add_zero, zero_add] push_cast match_scalars <;> (field_simp; ring) /-- The gauge potential in the other light-cone direction has boost weight `-2`. -/ lemma B_lightCone_mem_neg_two : [JetGenerators.dB {} (Sum.inl 0)]ₐ + [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ - boostWeightSubmodule (-2) := by + boostWeightSubmodule 2 (-2) := by intro t ht + simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_B, repLorentzGroup_B] - simp only [toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, Complex.ofReal_one, - zero_smul, add_zero, zero_add, one_smul] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, + zero_smul, add_zero, zero_add] push_cast match_scalars <;> (field_simp; ring) /-! -## B'. Independence of the weight submodules +## F. Independence of the weight submodules The weight submodules sit inside the eigenspaces of a single boost, `ρ(boostZel 2)`, at the pairwise distinct eigenvalues `2 ^ k`. Eigenspaces at distinct eigenvalues are independent, so the family is independent: an element has at most one decomposition into homogeneous parts. This is one of the two halves of `DirectSum.IsInternal`; the other, that the weight submodules -span, is section O'. +span, is section C. -/ /-- The weight submodule of weight `k` sits inside the `2 ^ k` eigenspace of the boost at parameter two. -/ lemma boostWeightSubmodule_le_eigenspace (k : ℤ) : - boostWeightSubmodule k ≤ - Module.End.eigenspace (repLorentzGroup (boostZel 2 two_ne_zero)) ((2 : ℂ) ^ k) := by + boostWeightSubmodule i k ≤ + Module.End.eigenspace (repLorentzGroup (boostAxis i 2 two_ne_zero)) ((2 : ℂ) ^ k) := by intro x hx rw [Module.End.mem_eigenspace_iff] have h := hx 2 two_ne_zero @@ -757,26 +892,26 @@ private lemma zpow_two_injective : Function.Injective (fun k : ℤ => ((2 : ℂ) /-- The boost-weight submodules are independent: a decomposition into homogeneous parts is unique when it exists. -/ -lemma boostWeightSubmodule_iSupIndep : iSupIndep boostWeightSubmodule := +lemma boostWeightSubmodule_iSupIndep : iSupIndep (boostWeightSubmodule i) := ((Module.End.eigenspaces_iSupIndep - (repLorentzGroup (boostZel 2 two_ne_zero) : Module.End ℂ JetAlgebra)).comp + (repLorentzGroup (boostAxis i 2 two_ne_zero) : Module.End ℂ JetAlgebra)).comp zpow_two_injective).mono boostWeightSubmodule_le_eigenspace /-! -## B''. The span of the homogeneous elements is a subalgebra +## G. The span of the homogeneous elements is a subalgebra -/ /-- The span of the homogeneous elements contains one. -/ lemma one_mem_iSup_boostWeightSubmodule : - (1 : JetAlgebra) ∈ ⨆ k, boostWeightSubmodule k := + (1 : JetAlgebra) ∈ ⨆ k, boostWeightSubmodule i k := Submodule.mem_iSup_of_mem 0 one_mem_boostWeightSubmodule /-- The span of the homogeneous elements is closed under multiplication. -/ lemma mul_mem_iSup_boostWeightSubmodule {x y : JetAlgebra} - (hx : x ∈ ⨆ k, boostWeightSubmodule k) (hy : y ∈ ⨆ k, boostWeightSubmodule k) : - x * y ∈ ⨆ k, boostWeightSubmodule k := by + (hx : x ∈ ⨆ k, boostWeightSubmodule i k) (hy : y ∈ ⨆ k, boostWeightSubmodule i k) : + x * y ∈ ⨆ k, boostWeightSubmodule i k := by induction hx using Submodule.iSup_induction' with | mem k a ha => induction hy using Submodule.iSup_induction' with @@ -788,20 +923,20 @@ lemma mul_mem_iSup_boostWeightSubmodule {x y : JetAlgebra} | add a b _ _ iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb /-- The homogeneous elements span a subalgebra of the jet algebra. -/ -noncomputable def boostWeightSubalgebra : Subalgebra ℂ JetAlgebra := - Submodule.toSubalgebra (⨆ k, boostWeightSubmodule k) one_mem_iSup_boostWeightSubmodule +noncomputable def boostWeightSubalgebra (i : Fin 3) : Subalgebra ℂ JetAlgebra := + Submodule.toSubalgebra (⨆ k, boostWeightSubmodule i k) one_mem_iSup_boostWeightSubmodule fun _ _ hx hy => mul_mem_iSup_boostWeightSubmodule hx hy @[simp] lemma mem_boostWeightSubalgebra {x : JetAlgebra} : - x ∈ boostWeightSubalgebra ↔ x ∈ ⨆ k, boostWeightSubmodule k := Iff.rfl + x ∈ boostWeightSubalgebra i ↔ x ∈ ⨆ k, boostWeightSubmodule i k := Iff.rfl /-- The homogeneous span contains the whole bosonic factor once it contains the generators. -/ private lemma inclB_mem_boostWeightSubalgebra - (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : inclB a ∈ boostWeightSubalgebra := by + (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra i) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : inclB a ∈ boostWeightSubalgebra i := by have hone : ∀ c : BBoson.JetAlgebra, - inclB ((1 : ℂ) ⊗ₜ[ℝ] c) ∈ boostWeightSubalgebra := by + inclB ((1 : ℂ) ⊗ₜ[ℝ] c) ∈ boostWeightSubalgebra i := by intro c induction c using SymmetricAlgebra.induction with | algebraMap r => @@ -821,7 +956,7 @@ private lemma inclB_mem_boostWeightSubalgebra obtain ⟨j, rfl⟩ := hy obtain ⟨s, μ⟩ := j exact h (JetGenerators.dB s μ) - | zero => simpa using Subalgebra.zero_mem _ + | zero => simp | add u w _ _ ihu ihw => simp only [map_add, TensorProduct.tmul_add] exact Subalgebra.add_mem _ ihu ihw @@ -842,7 +977,7 @@ private lemma inclB_mem_boostWeightSubalgebra simp only [TensorProduct.tmul_add, map_add] exact Subalgebra.add_mem _ ihu ihv induction a using TensorProduct.induction_on with - | zero => simpa using Subalgebra.zero_mem _ + | zero => simp | add u v hu hv => rw [map_add]; exact Subalgebra.add_mem _ hu hv | tmul z c => rw [show (z ⊗ₜ[ℝ] c : ℂ ⊗[ℝ] BBoson.JetAlgebra) = z • ((1 : ℂ) ⊗ₜ[ℝ] c) from by @@ -851,10 +986,10 @@ private lemma inclB_mem_boostWeightSubalgebra /-- The homogeneous span contains the whole fermionic factor once it contains the generators. -/ private lemma inclL_mem_boostWeightSubalgebra - (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra) - (b : LeptonSinglet.JetAlgebra) : inclL b ∈ boostWeightSubalgebra := by + (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra i) + (b : LeptonSinglet.JetAlgebra) : inclL b ∈ boostWeightSubalgebra i := by have hι : ∀ m : LeptonSinglet.JetComponentSpace, - inclL (ExteriorAlgebra.ι ℂ m) ∈ boostWeightSubalgebra := by + inclL (ExteriorAlgebra.ι ℂ m) ∈ boostWeightSubalgebra i := by intro m have hm : m ∈ Submodule.span ℂ (Set.range LeptonSinglet.JetComponentSpace.basis) := by rw [LeptonSinglet.JetComponentSpace.basis.span_eq] @@ -865,7 +1000,7 @@ private lemma inclL_mem_boostWeightSubalgebra cases j with | dψ s α => exact h (JetGenerators.dψ s α) | dbarψ s α => exact h (JetGenerators.dbarψ s α) - | zero => simpa using Subalgebra.zero_mem _ + | zero => simp | add u v _ _ ihu ihv => simp only [map_add] exact Subalgebra.add_mem _ ihu ihv @@ -881,7 +1016,7 @@ private lemma inclL_mem_boostWeightSubalgebra /-- Once every generator is a finite sum of boost eigenvectors, so is every element: the homogeneous elements then span the whole jet algebra. -/ theorem boostWeightSubalgebra_eq_top_of_forall_ofGenerator - (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra) : boostWeightSubalgebra = ⊤ := by + (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra i) : boostWeightSubalgebra i = ⊤ := by refine Algebra.eq_top_iff.mpr fun x => ?_ induction x using JetAlgebra.induction_on with | zero => exact Subalgebra.zero_mem _ @@ -895,19 +1030,19 @@ theorem boostWeightSubalgebra_eq_top_of_forall_ofGenerator homogeneous elements span. Independence always holds, so this isolates the one remaining obligation: that every element is a finite sum of boost eigenvectors. -/ theorem boostWeightSubmodule_isInternal_iff : - DirectSum.IsInternal boostWeightSubmodule ↔ (⨆ k, boostWeightSubmodule k) = ⊤ := by + DirectSum.IsInternal (boostWeightSubmodule i) ↔ (⨆ k, boostWeightSubmodule i k) = ⊤ := by rw [DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top] exact ⟨And.right, fun h => ⟨boostWeightSubmodule_iSupIndep, h⟩⟩ /-- The homogeneous elements span a subalgebra which the boost weights grade internally: the decomposition into weights is defined on it and is unique. -/ theorem boostWeightSubmodule_isInternal_of_top - (h : (⨆ k, boostWeightSubmodule k) = ⊤) : DirectSum.IsInternal boostWeightSubmodule := + (h : (⨆ k, boostWeightSubmodule i k) = ⊤) : DirectSum.IsInternal (boostWeightSubmodule i) := boostWeightSubmodule_isInternal_iff.mpr h /-! -## C. The interpolating polynomial of `boostAvgZ` +## H. The interpolating polynomial of the boost averages `boostAvgZ` is a fixed rational combination of the identity and the boosts at `t = 2, 3, 4` paired with their inverses, so on an element of boost weight `k` it acts by the scalar obtained @@ -952,75 +1087,114 @@ lemma boostAvgZWeight_eight_ne_zero : boostAvgZWeight 8 ≠ 0 := by /-! -## D. `boostAvgZ` is the projection onto boost weight zero +## I. The boost averages are the projections onto boost weight zero -/ -/-- `boostAvgZ` acts on an element of boost weight `k` by the scalar `boostAvgZWeight k`. -/ -lemma boostAvgZ_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule k) : - boostAvgZ x = boostAvgZWeight k • x := by +/-- The weighted boost average along the `i`-th spatial axis. -/ +noncomputable def boostAvgAxis : Fin 3 → Module.End ℂ JetAlgebra + | 0 => boostAvgX + | 1 => boostAvgY + | 2 => boostAvgZ + +@[simp] lemma boostAvgAxis_zero : boostAvgAxis 0 = boostAvgX := rfl +@[simp] lemma boostAvgAxis_one : boostAvgAxis 1 = boostAvgY := rfl +@[simp] lemma boostAvgAxis_two : boostAvgAxis 2 = boostAvgZ := rfl + +lemma boostAvgAxis_eq (i : Fin 3) : + boostAvgAxis i = (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostAxis i 2 (by norm_num)) + + repLorentzGroup ((boostAxis i 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostAxis i 3 (by norm_num)) + + repLorentzGroup ((boostAxis i 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostAxis i 4 (by norm_num)) + + repLorentzGroup ((boostAxis i 4 (by norm_num))⁻¹)) := by + fin_cases i <;> rfl + +/-- The boost average along an axis acts on an element of boost weight `k` for that axis by the + scalar `boostAvgZWeight k`. -/ +lemma boostAvgAxis_apply_of_mem {i : Fin 3} {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule i k) : + boostAvgAxis i x = boostAvgZWeight k • x := by have hinv : ∀ (t : ℝ) (ht : t ≠ 0), - repLorentzGroup ((boostZel t ht)⁻¹) x = ((((t : ℝ) : ℂ))⁻¹ ^ k) • x := by + repLorentzGroup ((boostAxis i t ht)⁻¹) x = ((((t : ℝ) : ℂ))⁻¹ ^ k) • x := by intro t ht - rw [boostZel_inv, hx t⁻¹ (inv_ne_zero ht), Complex.ofReal_inv] - simp only [boostAvgZ, LinearMap.add_apply, LinearMap.smul_apply, LinearMap.id_apply, + rw [boostAxis_inv, hx t⁻¹ (inv_ne_zero ht), algebraMap_real_complex, Complex.ofReal_inv] + simp only [boostAvgAxis_eq i, LinearMap.add_apply, LinearMap.smul_apply, LinearMap.id_apply, hx 2 (by norm_num), hx 3 (by norm_num), hx 4 (by norm_num), hinv 2 (by norm_num), hinv 3 (by norm_num), hinv 4 (by norm_num), - boostAvgZWeight] + algebraMap_real_complex, boostAvgZWeight] push_cast match_scalars - simp only [one_div, _root_.inv_zpow, ← _root_.zpow_neg] + simp only [_root_.inv_zpow, ← _root_.zpow_neg] ring -/-- On boost weight zero `boostAvgZ` is the identity. -/ -lemma boostAvgZ_apply_of_mem_zero {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 0) : - boostAvgZ x = x := by - rw [boostAvgZ_apply_of_mem hx, boostAvgZWeight_zero, one_smul] +/-- On boost weight zero the average is the identity. -/ +lemma boostAvgAxis_apply_of_mem_zero {i : Fin 3} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule i 0) : boostAvgAxis i x = x := by + rw [boostAvgAxis_apply_of_mem hx, boostAvgZWeight_zero, one_smul] -/-- `boostAvgZ` annihilates the boost weights `±2, ±4, ±6`. -/ -lemma boostAvgZ_apply_eq_zero_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule k) - (hk : k = 2 ∨ k = 4 ∨ k = 6 ∨ k = -2 ∨ k = -4 ∨ k = -6) : boostAvgZ x = 0 := by - rw [boostAvgZ_apply_of_mem hx] +/-- The average annihilates the boost weights `±2, ±4, ±6`. -/ +lemma boostAvgAxis_apply_eq_zero_of_mem {i : Fin 3} {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule i k) + (hk : k = 2 ∨ k = 4 ∨ k = 6 ∨ k = -2 ∨ k = -4 ∨ k = -6) : boostAvgAxis i x = 0 := by + rw [boostAvgAxis_apply_of_mem hx] rcases hk with rfl | rfl | rfl | rfl | rfl | rfl <;> simp -/-- `boostAvgZ` fixes every Lorentz-invariant element, as the projection onto boost weight zero - must. -/ -lemma boostAvgZ_apply_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : boostAvgZ x = x := - boostAvgZ_apply_of_mem_zero (mem_boostWeightSubmodule_zero_of_isInvariant hx) +/-- Each boost average fixes every Lorentz-invariant element, as the projection onto boost + weight zero must. -/ +lemma boostAvgAxis_apply_of_isInvariant (i : Fin 3) {x : JetAlgebra} (hx : IsInvariant x) : + boostAvgAxis i x = x := + boostAvgAxis_apply_of_mem_zero (i := i) (mem_boostWeightSubmodule_zero_of_isInvariant hx) + +/-- `boostAvgZ` acts on an element of `z`-boost weight `k` by `boostAvgZWeight k`. -/ +lemma boostAvgZ_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 2 k) : + boostAvgZ x = boostAvgZWeight k • x := boostAvgAxis_apply_of_mem hx + +/-- `boostAvgX` acts on an element of `x`-boost weight `k` by `boostAvgZWeight k`. -/ +lemma boostAvgX_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 0 k) : + boostAvgX x = boostAvgZWeight k • x := boostAvgAxis_apply_of_mem hx + +/-- `boostAvgY` acts on an element of `y`-boost weight `k` by `boostAvgZWeight k`. -/ +lemma boostAvgY_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 1 k) : + boostAvgY x = boostAvgZWeight k • x := boostAvgAxis_apply_of_mem hx /-! -## E. The grading +## J. The grading The weight submodules are independent (`boostWeightSubmodule_iSupIndep`) and, by the descent -through the component spaces of section O', they span. So they decompose the jet algebra -internally, and together with the graded-monoid structure of section A they make it a graded -algebra. +through the component spaces of section C transported along section A, they span. So they +decompose the jet algebra internally along every axis, and together with the graded-monoid +structure of section D they make it a graded algebra three times over. -/ -/-- The homogeneous elements span the jet algebra. -/ -theorem iSup_boostWeightSubmodule_eq_top : (⨆ k, boostWeightSubmodule k) = ⊤ := - isGraded_jetAlgebra +/-- The homogeneous elements span the jet algebra, for every axis. -/ +theorem iSup_boostWeightSubmodule_eq_top (i : Fin 3) : + (⨆ k, boostWeightSubmodule i k) = ⊤ := + BoostWeight.isGraded_of_isGraded_two isGraded_jetAlgebra i -/-- Every generator is a finite sum of boost eigenvectors. -/ -theorem ofGenerator_mem_boostWeightSubalgebra (j : JetGenerators) : - [j]ₐ ∈ boostWeightSubalgebra := by +/-- Every generator is a finite sum of boost eigenvectors, for every axis. -/ +theorem ofGenerator_mem_boostWeightSubalgebra (i : Fin 3) (j : JetGenerators) : + [j]ₐ ∈ boostWeightSubalgebra i := by rw [mem_boostWeightSubalgebra, iSup_boostWeightSubmodule_eq_top] trivial -/-- **The boost weight grades the jet algebra.** The weight submodules decompose it as an - internal direct sum: every element is a finite sum of boost eigenvectors, uniquely. -/ -theorem boostWeightSubmodule_isInternal : DirectSum.IsInternal boostWeightSubmodule := - boostWeightSubmodule_isInternal_iff.mpr iSup_boostWeightSubmodule_eq_top +/-- **The boost weight grades the jet algebra.** For each axis the weight submodules decompose + it as an internal direct sum: every element is a finite sum of boost eigenvectors, uniquely. -/ +theorem boostWeightSubmodule_isInternal (i : Fin 3) : + DirectSum.IsInternal (boostWeightSubmodule i) := + boostWeightSubmodule_isInternal_iff.mpr (iSup_boostWeightSubmodule_eq_top i) /-- The decomposition of an element of the jet algebra into its boost-weight components. -/ -noncomputable instance : DirectSum.Decomposition boostWeightSubmodule := - boostWeightSubmodule_isInternal.chooseDecomposition +noncomputable instance (i : Fin 3) : DirectSum.Decomposition (boostWeightSubmodule i) := + (boostWeightSubmodule_isInternal i).chooseDecomposition -/-- **The jet algebra is a graded algebra for the boost weight.** Weights add under - multiplication, the unit is neutral, and the weight components decompose every element. -/ -noncomputable instance : GradedAlgebra boostWeightSubmodule where +/-- **The jet algebra is a graded algebra for the boost weight along each axis.** Weights add + under multiplication, the unit is neutral, and the weight components decompose every + element. -/ +noncomputable instance (i : Fin 3) : GradedAlgebra (boostWeightSubmodule i) where one_mem := one_mem_boostWeightSubmodule mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy From 1337bc1001d05cbd2fbd6b3d9d3d25a6ca8e186f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:50:37 +0100 Subject: [PATCH 127/254] feat: Add Boost weight for gauge kinetic term. Co-Authored-By: Claude --- .../FermionicKineticTerm/BoostWeight.lean | 50 +- .../GaugeKineticTerm/BoostWeight.lean | 566 ++++++++++++++++-- .../GaugeKineticTerm/Invariance.lean | 58 ++ .../GaugeKineticTerm/LinearIndependence.lean | 160 +++++ 4 files changed, 752 insertions(+), 82 deletions(-) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean index ecff45e7c..b219954be 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean @@ -10,59 +10,13 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTer /-! # The boost weight zero parts of the photon pairs and the fermion kinetic bilinears -The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra, as do -the fermion kinetic bilinears `ψ̄_α ∂_μ ψ_β`. This file computes the intersections of these spans -with the boost weight zero submodule: they are spanned by seven, respectively six, explicit -products, and both spans are written out in the statements of the two theorems below. - -*The proof is a certificate.* Rather than deducing the intersection abstractly, the span of the -products is expanded into boost eigenvectors. The coordinate components `F_{μν}` are not boost -eigenvectors, but six combinations of them are: the light-cone combinations `F_{0x} - F_{zx}` and -`F_{0y} - F_{zy}` of weight `2`, their partners `F_{0x} + F_{zx}` and `F_{0y} + F_{zy}` of weight -`-2`, and the two components with no free light-cone index, `F_{xy}` and `F_{0z}`, of weight `0`. -Every `F_{μν}` is a combination of these six — the sixteen cases of step B — so the span of the -products lies in the sum of the nine products of the three weight spaces, of weights `0, ±2, ±4`. -The three of weight zero — a weight-`2` field strength against a weight-`-2` one, and two -weight-zero ones — are exactly the seven products listed. - -The intersection then follows formally, with no linear independence of the products needed. The -weight submodules are independent (`boostWeightSubmodule_iSupIndep`), so boost weight zero is -disjoint from the span of the weights `±2, ±4`; since the weight-zero part sits inside boost -weight zero, the modular law cuts the intersection down to it. - -The fermion bilinears follow the same pattern with less bookkeeping: the left factors `ψ̄_α` are -already eigenvectors of weight `∓1`, and on `∂_μ ψ_β` the spinor index contributes `∓1` while the -light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. The six weight-zero bilinears are -listed as `±`-pairs grouped into a `∂_0/∂_z` block and `∂_x`, `∂_y` blocks, adapted to a later -restriction by the boost weights in the `x`- and `y`-directions. - -## i. Overview - -Each proof runs in four steps, marked in its source. Step A exhibits the boost eigenvectors, -step B decomposes the coordinate components (or, for the bilinears, spans the weight-zero -products), step C splits every product into eigen products of a single weight, and step D -assembles the intersection. - -## ii. Key results - -- `JetAlgebra.boostWeight_inter_fieldStrength` : the intersection of boost weight zero with the - span of the products `F_{μν} F_{μ'ν'}` is the span of the seven weight-zero products. -- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term` : the intersection of boost weight zero - with the span of the bilinears `ψ̄_α ∂_μ ψ_β` is the span of six explicit bilinears, paired - into blocks adapted to the boosts in the `x`- and `y`-directions. -- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term_full` : imposing boost weight zero along - all three axes at once leaves only the multiples of the fermion kinetic term. This last step - is not a certificate: the three six-dimensional spans are intersected by comparing - coefficients, using the linear independence of the sixteen bilinears. +Boost weights give us the invariance under the Lorentz group. This is in the following +way. Consider all terms in the span of `ψ̄_α ∂_μ ψ_β`. -/ @[expose] public section -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false -set_option linter.unnecessarySeqFocus false - namespace LeptonGaugeSector open TensorProduct StandardModel open scoped minkowskiMatrix PauliMatrix Pointwise diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean index 2fe2159db..06000a8cb 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean @@ -6,54 +6,49 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.LinearIndependence +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.LinearIndependence /-! -# The boost weight zero parts of the photon pairs and the fermion kinetic bilinears +# The boost weight zero part of the photon pairs -The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra, as do -the fermion kinetic bilinears `ψ̄_α ∂_μ ψ_β`. This file computes the intersections of these spans -with the boost weight zero submodule: they are spanned by seven, respectively six, explicit -products, and both spans are written out in the statements of the two theorems below. +The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra. This +file computes the intersection of that span with the boost weight zero submodule of each of the +three axes: for one axis it is spanned by seven explicit products, written out in the statement +of the theorem; imposing all three at once leaves the Maxwell and theta terms. -*The proof is a certificate.* Rather than deducing the intersection abstractly, the span of the -products is expanded into boost eigenvectors. The coordinate components `F_{μν}` are not boost -eigenvectors, but six combinations of them are: the light-cone combinations `F_{0x} - F_{zx}` and -`F_{0y} - F_{zy}` of weight `2`, their partners `F_{0x} + F_{zx}` and `F_{0y} + F_{zy}` of weight -`-2`, and the two components with no free light-cone index, `F_{xy}` and `F_{0z}`, of weight `0`. -Every `F_{μν}` is a combination of these six — the sixteen cases of step B — so the span of the -products lies in the sum of the nine products of the three weight spaces, of weights `0, ±2, ±4`. -The three of weight zero — a weight-`2` field strength against a weight-`-2` one, and two -weight-zero ones — are exactly the seven products listed. +*The one-axis proof is a certificate.* Rather than deducing the intersection abstractly, the span +of the products is expanded into boost eigenvectors. For the `z`-boost the coordinate components +`F_{μν}` are not boost eigenvectors, but six combinations of them are: the light-cone +combinations `F_{0x} - F_{zx}` and `F_{0y} - F_{zy}` of weight `2`, their partners +`F_{0x} + F_{zx}` and `F_{0y} + F_{zy}` of weight `-2`, and the two components with no free +light-cone index, `F_{xy}` and `F_{0z}`, of weight `0`. Every `F_{μν}` is a combination of these +six — the sixteen cases of step B — so the span of the products lies in the sum of the nine +products of the three weight spaces, of weights `0, ±2, ±4`. The three of weight zero — a +weight-`2` field strength against a weight-`-2` one, and two weight-zero ones — are exactly the +seven products listed. The intersection then follows formally, with no linear independence of the products needed. The weight submodules are independent (`boostWeightSubmodule_iSupIndep`), so boost weight zero is disjoint from the span of the weights `±2, ±4`; since the weight-zero part sits inside boost -weight zero, the modular law cuts the intersection down to it. +weight zero, the modular law cuts the intersection down to it. The `x`- and `y`-axis theorems are +the same certificate with the light-cone pairs built on those axes instead. -The fermion bilinears follow the same pattern with less bookkeeping: the left factors `ψ̄_α` are -already eigenvectors of weight `∓1`, and on `∂_μ ψ_β` the spinor index contributes `∓1` while the -light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. The six weight-zero bilinears are -listed as `±`-pairs grouped into a `∂_0/∂_z` block and `∂_x`, `∂_y` blocks, adapted to a later -restriction by the boost weights in the `x`- and `y`-directions. +*The three-axis theorem is not a certificate.* The three seven-dimensional spans have to be +intersected, and that is done on coefficients, with the dual family of +`GaugeKineticTerm.LinearIndependence` reading them off. ## i. Overview -Each proof runs in four steps, marked in its source. Step A exhibits the boost eigenvectors, -step B decomposes the coordinate components (or, for the bilinears, spans the weight-zero -products), step C splits every product into eigen products of a single weight, and step D -assembles the intersection. +Each one-axis proof runs in four steps, marked in its source. Step A exhibits the boost +eigenvectors, step B decomposes the coordinate components, step C splits every product into +eigen products of a single weight, and step D assembles the intersection. ## ii. Key results - `JetAlgebra.boostWeight_inter_fieldStrength` : the intersection of boost weight zero with the - span of the products `F_{μν} F_{μ'ν'}` is the span of the seven weight-zero products. -- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term` : the intersection of boost weight zero - with the span of the bilinears `ψ̄_α ∂_μ ψ_β` is the span of six explicit bilinears, paired - into blocks adapted to the boosts in the `x`- and `y`-directions. -- `JetAlgebra.boostWeight_inter_fermionic_kinetic_term_full` : imposing boost weight zero along - all three axes at once leaves only the multiples of the fermion kinetic term. This last step - is not a certificate: the three six-dimensional spans are intersected by comparing - coefficients, using the linear independence of the sixteen bilinears. + span of the products `F_{μν} F_{μ'ν'}` is the span of the seven weight-zero products, and + `_x`, `_y` for the other two axes. +- `JetAlgebra.boostWeight_inter_fieldStrength_full` : imposing boost weight zero along all three + axes at once leaves the span of the Maxwell and theta terms. -/ @@ -135,7 +130,7 @@ theorem boostWeight_inter_fieldStrength : -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] push_cast - match_scalars <;> (field_simp; ring) + match_scalars <;> (field_simp; try ring) -- ### B. Every field strength is a combination of the eigenvectors -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. @@ -274,6 +269,509 @@ theorem boostWeight_inter_fieldStrength : rw [inf_comm, sup_inf_assoc_of_le _ hSw, disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] +/-- **The boost weight zero part of the photon pairs, `x`-direction.** As for the `z`-boost, + with the light-cone pairs now built on the `x`-axis: `F_{0y} ∓ F_{xy}` and `F_{0z} ∓ F_{xz}` + have weight `±2`, and `F_{yz}`, `F_{0x}` have weight zero. -/ +theorem boostWeight_inter_fieldStrength_x : + boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = + Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)), + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2), + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)} := by + -- ### A. The boost eigenvectors among the field strengths + set P1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hP1 + set P2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hP2 + set M1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hM1 + set M2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hM2 + set T := fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hT + set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) with hL + set FF : Set JetAlgebra := + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF + set S : Set JetAlgebra := {P1 * M1, P1 * M2, P2 * M1, P2 * M2, T * T, T * L, L * L} with hS + obtain ⟨hP1w, hP2w, hM1w, hM2w, hTw, hLw⟩ : + P1 ∈ boostWeightSubmodule 0 2 ∧ P2 ∈ boostWeightSubmodule 0 2 ∧ + M1 ∈ boostWeightSubmodule 0 (-2) ∧ M2 ∈ boostWeightSubmodule 0 (-2) ∧ + T ∈ boostWeightSubmodule 0 0 ∧ L ∈ boostWeightSubmodule 0 0 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hP1, hP2, hM1, hM2, hT, hL, map_sub, map_add, boostAxis_zero, + repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, + toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + boostMatX, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + try rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0)] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. Every field strength is a combination of the eigenvectors + set A := Submodule.span ℂ {P1, P2} with hA + set B := Submodule.span ℂ {T, L} with hB + set C := Submodule.span ℂ {M1, M2} with hC + set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV + have hAle : A ≤ boostWeightSubmodule 0 2 := by + rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hP1w, hP2w]) + have hBle : B ≤ boostWeightSubmodule 0 0 := by + rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) + have hCle : C ≤ boostWeightSubmodule 0 (-2) := by + rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hM1w, hM2w]) + have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left + have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left + have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right + have hP1V : P1 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) + have hP2V : P2 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) + have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) + have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) + have hM1V : M1 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) + have hM2V : M2 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) + have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → + x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by + rintro u v x c d hu hv rfl + exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) + have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → + v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → + fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by + intro u v c d μ ν hu hv h + rw [fieldStrengthDeriv_antisymm, h] + exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) + have hVle : V ≤ A ⊔ B ⊔ C := by + rw [hV] + refine Submodule.span_le.2 ?_ + rintro x ⟨μ, ν, rfl⟩ + match μ, ν with + | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 + | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ + | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 0, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inr 1, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inr 0, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 2, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 1, Sum.inr 2 => exact hTV + | Sum.inr 2, Sum.inr 1 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV + | Sum.inl 0, Sum.inr 0 => exact hLV + | Sum.inr 0, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV + -- ### C. Products of two field strengths + have hFV : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ V := fun μ ν => by + rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩ + have hP1V' : P1 ∈ V := by rw [hP1]; exact sub_mem (hFV _ _) (hFV _ _) + have hP2V' : P2 ∈ V := by rw [hP2]; exact sub_mem (hFV _ _) (hFV _ _) + have hM1V' : M1 ∈ V := by rw [hM1]; exact add_mem (hFV _ _) (hFV _ _) + have hM2V' : M2 ∈ V := by rw [hM2]; exact add_mem (hFV _ _) (hFV _ _) + have hTV' : T ∈ V := hFV _ _ + have hLV' : L ∈ V := hFV _ _ + have hcomm : ∀ x ∈ V, ∀ y ∈ V, x * y = y * x := by + intro x hx y hy + rw [hV] at hx hy + induction hx, hy using Submodule.span_induction₂ with + | mem_mem a b ha hb => + obtain ⟨μ, ν, rfl⟩ := ha; obtain ⟨μ', ν', rfl⟩ := hb + exact fieldStrengthDeriv_mul_comm _ _ _ _ _ _ + | zero_left => rw [zero_mul, mul_zero] + | zero_right => rw [zero_mul, mul_zero] + | add_left _ _ _ _ _ _ h₁ h₂ => rw [add_mul, mul_add, h₁, h₂] + | add_right _ _ _ _ _ _ h₁ h₂ => rw [mul_add, add_mul, h₁, h₂] + | smul_left _ _ _ _ _ h => rw [smul_mul_assoc, mul_smul_comm, h] + | smul_right _ _ _ _ _ h => rw [mul_smul_comm, smul_mul_assoc, h] + have hspan : Submodule.span ℂ FF = V * V := by + rw [hV, hFF, Submodule.span_mul_span] + congr 1 + ext x + constructor + · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ + · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ + have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule 0 k → + Y ≤ boostWeightSubmodule 0 l → k + l ≠ 0 → + X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j := + fun hX hY h => le_sup_of_le_right + ((Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy)).trans + (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) + have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → + a * b ∈ Submodule.span ℂ S := fun ha hb h => by + rw [hcomm _ ha _ hb]; exact Submodule.subset_span h + obtain ⟨hAC, hCA, hBB⟩ : A * C ≤ Submodule.span ℂ S ∧ C * A ≤ Submodule.span ℂ S ∧ + B * B ≤ Submodule.span ℂ S := by + refine ⟨?_, ?_, ?_⟩ <;> + simp only [hA, hB, hC, Submodule.span_mul_span] <;> + refine Submodule.span_le.2 ?_ <;> + rintro x ⟨a, rfl | rfl, b, rfl | rfl, rfl⟩ + exacts [Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + hsub hM1V' hP1V' (by simp [hS]), hsub hM1V' hP2V' (by simp [hS]), + hsub hM2V' hP1V' (by simp [hS]), hsub hM2V' hP2V' (by simp [hS]), + Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] + have hkey : Submodule.span ℂ FF ≤ + Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j := by + rw [hspan] + refine (Submodule.mul_le.2 fun _ hx _ hy => + Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ + simp only [Submodule.sup_mul, Submodule.mul_sup] + repeat' apply sup_le + exacts [hne hAle hAle (by norm_num), hne hBle hAle (by norm_num), le_sup_of_le_left hCA, + hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), + le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] + -- ### D. The weight zero part of the photon pairs + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → + y ∈ boostWeightSubmodule 0 l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> + exact hz (by assumption) (by assumption) (by norm_num) + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hspan, hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> + exact Submodule.mul_mem_mul (by assumption) (by assumption) + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] + +/-- **The boost weight zero part of the photon pairs, `y`-direction.** As for the `z`-boost, + with the light-cone pairs now built on the `y`-axis: `F_{0z} ∓ F_{yz}` and `F_{0x} ∓ F_{yx}` + have weight `±2`, and `F_{zx}`, `F_{0y}` have weight zero. -/ +theorem boostWeight_inter_fieldStrength_y : + boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = + Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)), + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) * + (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)), + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0), + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)} := by + -- ### A. The boost eigenvectors among the field strengths + set P1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hP1 + set P2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hP2 + set M1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hM1 + set M2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hM2 + set T := fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hT + set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) with hL + set FF : Set JetAlgebra := + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF + set S : Set JetAlgebra := {P1 * M1, P1 * M2, P2 * M1, P2 * M2, T * T, T * L, L * L} with hS + obtain ⟨hP1w, hP2w, hM1w, hM2w, hTw, hLw⟩ : + P1 ∈ boostWeightSubmodule 1 2 ∧ P2 ∈ boostWeightSubmodule 1 2 ∧ + M1 ∈ boostWeightSubmodule 1 (-2) ∧ M2 ∈ boostWeightSubmodule 1 (-2) ∧ + T ∈ boostWeightSubmodule 1 0 ∧ L ∈ boostWeightSubmodule 1 0 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hP1, hP2, hM1, hM2, hT, hL, map_sub, map_add, boostAxis_one, + repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, + toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + boostMatY, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + try rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1)] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. Every field strength is a combination of the eigenvectors + set A := Submodule.span ℂ {P1, P2} with hA + set B := Submodule.span ℂ {T, L} with hB + set C := Submodule.span ℂ {M1, M2} with hC + set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV + have hAle : A ≤ boostWeightSubmodule 1 2 := by + rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hP1w, hP2w]) + have hBle : B ≤ boostWeightSubmodule 1 0 := by + rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) + have hCle : C ≤ boostWeightSubmodule 1 (-2) := by + rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hM1w, hM2w]) + have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left + have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left + have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right + have hP1V : P1 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) + have hP2V : P2 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) + have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) + have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) + have hM1V : M1 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) + have hM2V : M2 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) + have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → + x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by + rintro u v x c d hu hv rfl + exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) + have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → + v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → + fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by + intro u v c d μ ν hu hv h + rw [fieldStrengthDeriv_antisymm, h] + exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) + have hVle : V ≤ A ⊔ B ⊔ C := by + rw [hV] + refine Submodule.span_le.2 ?_ + rintro x ⟨μ, ν, rfl⟩ + match μ, ν with + | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 + | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ + | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 1, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inr 2, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) + | Sum.inr 1, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 0, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) + | Sum.inr 2, Sum.inr 0 => exact hTV + | Sum.inr 0, Sum.inr 2 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV + | Sum.inl 0, Sum.inr 1 => exact hLV + | Sum.inr 1, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV + -- ### C. Products of two field strengths + have hFV : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ V := fun μ ν => by + rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩ + have hP1V' : P1 ∈ V := by rw [hP1]; exact sub_mem (hFV _ _) (hFV _ _) + have hP2V' : P2 ∈ V := by rw [hP2]; exact sub_mem (hFV _ _) (hFV _ _) + have hM1V' : M1 ∈ V := by rw [hM1]; exact add_mem (hFV _ _) (hFV _ _) + have hM2V' : M2 ∈ V := by rw [hM2]; exact add_mem (hFV _ _) (hFV _ _) + have hTV' : T ∈ V := hFV _ _ + have hLV' : L ∈ V := hFV _ _ + have hcomm : ∀ x ∈ V, ∀ y ∈ V, x * y = y * x := by + intro x hx y hy + rw [hV] at hx hy + induction hx, hy using Submodule.span_induction₂ with + | mem_mem a b ha hb => + obtain ⟨μ, ν, rfl⟩ := ha; obtain ⟨μ', ν', rfl⟩ := hb + exact fieldStrengthDeriv_mul_comm _ _ _ _ _ _ + | zero_left => rw [zero_mul, mul_zero] + | zero_right => rw [zero_mul, mul_zero] + | add_left _ _ _ _ _ _ h₁ h₂ => rw [add_mul, mul_add, h₁, h₂] + | add_right _ _ _ _ _ _ h₁ h₂ => rw [mul_add, add_mul, h₁, h₂] + | smul_left _ _ _ _ _ h => rw [smul_mul_assoc, mul_smul_comm, h] + | smul_right _ _ _ _ _ h => rw [mul_smul_comm, smul_mul_assoc, h] + have hspan : Submodule.span ℂ FF = V * V := by + rw [hV, hFF, Submodule.span_mul_span] + congr 1 + ext x + constructor + · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ + · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ + have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule 1 k → + Y ≤ boostWeightSubmodule 1 l → k + l ≠ 0 → + X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j := + fun hX hY h => le_sup_of_le_right + ((Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy)).trans + (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) + have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → + a * b ∈ Submodule.span ℂ S := fun ha hb h => by + rw [hcomm _ ha _ hb]; exact Submodule.subset_span h + obtain ⟨hAC, hCA, hBB⟩ : A * C ≤ Submodule.span ℂ S ∧ C * A ≤ Submodule.span ℂ S ∧ + B * B ≤ Submodule.span ℂ S := by + refine ⟨?_, ?_, ?_⟩ <;> + simp only [hA, hB, hC, Submodule.span_mul_span] <;> + refine Submodule.span_le.2 ?_ <;> + rintro x ⟨a, rfl | rfl, b, rfl | rfl, rfl⟩ + exacts [Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + hsub hM1V' hP1V' (by simp [hS]), hsub hM1V' hP2V' (by simp [hS]), + hsub hM2V' hP1V' (by simp [hS]), hsub hM2V' hP2V' (by simp [hS]), + Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), + hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] + have hkey : Submodule.span ℂ FF ≤ + Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j := by + rw [hspan] + refine (Submodule.mul_le.2 fun _ hx _ hy => + Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ + simp only [Submodule.sup_mul, Submodule.mul_sup] + repeat' apply sup_le + exacts [hne hAle hAle (by norm_num), hne hBle hAle (by norm_num), le_sup_of_le_left hCA, + hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), + le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] + -- ### D. The weight zero part of the photon pairs + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → + y ∈ boostWeightSubmodule 1 l → k + l = 0 → x * y ∈ boostWeightSubmodule 1 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> + exact hz (by assumption) (by assumption) (by norm_num) + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hspan, hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> + exact Submodule.mul_mem_mul (by assumption) (by assumption) + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] + +/-- **The Maxwell and theta terms are the only photon pairs of boost weight zero in every + direction.** An element of the span of the products `F_{μν} F_{μ'ν'}` has boost weight zero + along all three axes exactly when it is a combination of `F_{μν} F^{μν}` and + `ε^{μνρσ} F_{μν} F_{ρσ}`. + + *Here the proof is not a certificate.* The three one-axis theorems cut the span of the photon + pairs down to a seven-dimensional space each, and the three sevens have to be intersected; the + intersection is read off from the coefficients, which is where the dual family + `gaugeDual` enters. The `z`-axis theorem provides the seven coefficients `a₁, …, a₇`, and five + functionals, each a sum of at most two of the duals chosen to annihilate the `x`- or the + `y`-axis span, cut them down to two. -/ +theorem boostWeight_inter_fieldStrength_full : + boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ + boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = + Submodule.span ℂ {maxwellTerm, thetaTerm} := by + have hFm : ∀ μ ν μ' ν', fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν' ∈ + Submodule.span ℂ {x : JetAlgebra | ∃ μ ν μ' ν', + x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := + fun μ ν μ' ν' => Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩ + have hinvM : IsInvariant maxwellTerm := + ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ + have hinvT : IsInvariant thetaTerm := + ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ + refine le_antisymm ?_ ?_ + -- ### A. The three one-axis intersections + · intro x hx + rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx + obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx + have hz := boostWeight_inter_fieldStrength.le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) + have hbx := boostWeight_inter_fieldStrength_x.le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) + have hby := boostWeight_inter_fieldStrength_y.le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) + -- ### B. Dual functionals annihilating the `x`- and `y`-axis spans + have hann : ∀ (φ : JetAlgebra →ₗ[ℂ] ℂ) {T : Set JetAlgebra}, (∀ s ∈ T, φ s = 0) → + ∀ y ∈ Submodule.span ℂ T, φ y = 0 := by + intro φ T hT y hy + induction hy using Submodule.span_induction with + | mem s hs => exact hT s hs + | zero => simp + | add u v _ _ hu hv => rw [map_add, hu, hv, add_zero] + | smul c u _ hu => rw [map_smul, hu, smul_zero] + obtain ⟨e1, e2, e3, e4⟩ : + gaugeDual (Sum.inl 0, Sum.inr 0) (Sum.inl 0, Sum.inr 1) x = 0 ∧ + (gaugeDual (Sum.inl 0, Sum.inr 1) (Sum.inr 0, Sum.inr 2) + + gaugeDual (Sum.inl 0, Sum.inr 2) (Sum.inr 0, Sum.inr 1)) x = 0 ∧ + (gaugeDual (Sum.inl 0, Sum.inr 1) (Sum.inl 0, Sum.inr 1) + + gaugeDual (Sum.inr 0, Sum.inr 1) (Sum.inr 0, Sum.inr 1)) x = 0 ∧ + (gaugeDual (Sum.inl 0, Sum.inr 2) (Sum.inl 0, Sum.inr 2) + + gaugeDual (Sum.inr 0, Sum.inr 2) (Sum.inr 0, Sum.inr 2)) x = 0 := by + refine ⟨hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx⟩ <;> + intro s hs <;> + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + simp only [LinearMap.add_apply, mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, + gaugeDual_fieldStrength_mul, fsCoeff, Prod.mk.injEq, reduceCtorEq, Fin.isValue, + Fin.reduceEq, Sum.inr.injEq, Sum.inl.injEq, and_false, false_and, if_false, and_true, + true_and, if_true] <;> norm_num + have e5 : (gaugeDual (Sum.inl 0, Sum.inr 0) (Sum.inl 0, Sum.inr 0) + + gaugeDual (Sum.inr 0, Sum.inr 1) (Sum.inr 0, Sum.inr 1)) x = 0 := by + refine hann _ ?_ x hby + intro s hs + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + simp only [LinearMap.add_apply, mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, + gaugeDual_fieldStrength_mul, fsCoeff, Prod.mk.injEq, reduceCtorEq, Fin.isValue, + Fin.reduceEq, Sum.inr.injEq, Sum.inl.injEq, and_false, false_and, if_false, and_true, + true_and, if_true] <;> norm_num + -- ### C. The seven coefficients of the `z`-axis span, and the five relations on them + rw [Submodule.mem_span_insert] at hz + obtain ⟨a1, y1, hy1, rfl⟩ := hz + rw [Submodule.mem_span_insert] at hy1 + obtain ⟨a2, y2, hy2, rfl⟩ := hy1 + rw [Submodule.mem_span_insert] at hy2 + obtain ⟨a3, y3, hy3, rfl⟩ := hy2 + rw [Submodule.mem_span_insert] at hy3 + obtain ⟨a4, y4, hy4, rfl⟩ := hy3 + rw [Submodule.mem_span_insert] at hy4 + obtain ⟨a5, y5, hy5, rfl⟩ := hy4 + rw [Submodule.mem_span_insert] at hy5 + obtain ⟨a6, y6, hy6, rfl⟩ := hy5 + obtain ⟨a7, rfl⟩ := Submodule.mem_span_singleton.1 hy6 + simp only [LinearMap.add_apply, map_add, map_smul, smul_eq_mul, mul_add, add_mul, mul_sub, + sub_mul, map_sub, gaugeDual_fieldStrength_mul, fsCoeff, Prod.mk.injEq, reduceCtorEq, + Fin.isValue, Fin.reduceEq, Sum.inr.injEq, Sum.inl.injEq, and_false, false_and, if_false, + and_true, true_and, if_true, mul_zero, mul_one, add_zero, zero_add, sub_zero, + zero_sub] at e1 e2 e3 e4 e5 + -- ### D. Two coefficients are left: the Maxwell and theta terms + have ha3 : a3 = -a2 := by linear_combination e1 + have ha6 : a6 = -2 * a2 := by linear_combination e1 + e2 + have ha5 : a5 = -a1 := by linear_combination e5 / 2 + have ha4 : a4 = a1 := by linear_combination e3 / 2 - e5 / 2 + have ha7 : a7 = a1 := by linear_combination e4 / 2 + rw [ha3, ha4, ha5, ha6, ha7, Submodule.mem_span_pair] + refine ⟨-a1 / 2, -a2 / 4, ?_⟩ + rw [maxwellTerm_eq, thetaTerm_eq] + simp only [mul_add, add_mul, mul_sub, sub_mul, + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = + -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), + show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = + -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), + neg_mul, mul_neg, neg_neg, sub_neg_eq_add, + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 2), + fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] + match_scalars <;> ring + -- ### E. Both terms are invariant, hence of weight zero along every axis + · rw [Submodule.span_le] + rintro y (rfl | rfl) + · refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinvM, + mem_boostWeightSubmodule_zero_of_isInvariant hinvM⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hinvM⟩, ?_⟩ + rw [maxwellTerm_eq] + exact add_mem (add_mem (add_mem (add_mem (add_mem + (Submodule.smul_mem _ _ (hFm _ _ _ _)) (Submodule.smul_mem _ _ (hFm _ _ _ _))) + (Submodule.smul_mem _ _ (hFm _ _ _ _))) (Submodule.smul_mem _ _ (hFm _ _ _ _))) + (Submodule.smul_mem _ _ (hFm _ _ _ _))) (Submodule.smul_mem _ _ (hFm _ _ _ _)) + · refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinvT, + mem_boostWeightSubmodule_zero_of_isInvariant hinvT⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hinvT⟩, ?_⟩ + rw [thetaTerm_eq] + exact add_mem (add_mem (Submodule.smul_mem _ _ (hFm _ _ _ _)) + (Submodule.smul_mem _ _ (hFm _ _ _ _))) (Submodule.smul_mem _ _ (hFm _ _ _ _)) + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean new file mode 100644 index 000000000..9f26abe8e --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.BoostWeight +/-! +# The invariant photon pairs + +An invariant element of the span of the products `F_{μν} F_{μ'ν'}` is a combination of the +Maxwell term `F_{μν} F^{μν}` and the theta term `ε^{μνρσ} F_{μν} F_{ρσ}`: the gauge sector has +no other Lorentz invariant quadratic in the field strength. + +Only one implication of `boostWeight_inter_fieldStrength_full` is used, and only through the +boosts: an invariant element has boost weight zero along each of the three axes +(`mem_boostWeightSubmodule_zero_of_isInvariant`), which is already enough to pin it down. The +converse — that the two terms are invariant — is where the boost weight zero statement came +from in the first place. + +## Key results + +- `JetAlgebra.mem_gauge_kinetic_span_eq_maxwell_theta_of_isInvariant` : an invariant photon + pair is a combination of the Maxwell and theta terms. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## The key theorem + +-/ + +/-- **The invariant photon pairs are the Maxwell and theta terms.** An invariant element of the + span of the products `F_{μν} F_{μ'ν'}` lies in the span of `maxwellTerm` and `thetaTerm`. -/ +lemma mem_gauge_kinetic_span_eq_maxwell_theta_of_isInvariant {x : JetAlgebra} + (hx : IsInvariant x) + (ht : x ∈ Submodule.span ℂ + {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : + x ∈ Submodule.span ℂ {maxwellTerm, thetaTerm} := by + rw [← boostWeight_inter_fieldStrength_full] + exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean new file mode 100644 index 000000000..6ac787a4f --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FieldStrength +/-! +# A dual family for the photon pairs + +The products `F_{μν} F_{μ'ν'}` of two field strengths are not linearly independent — the field +strengths are antisymmetric and commute — but the coefficients of a combination of them can +still be read off one by one. This file constructs the functionals that read them: `gaugeDual p q` +picks out the coefficient of the product of the field strengths indexed by the generator pairs +`p` and `q`. Statements about an explicit span of photon pairs — the boost-weight-zero part of +the gauge sector, say — then reduce to linear algebra on coefficients. + +*The construction is a polarization.* The B-boson factor of the jet algebra is a symmetric +algebra, so a linear functional `φ` on the jet component space extends to an algebra map +`symEval φ` to `ℂ`, quadratic on the degree-two part. The second difference + +`symEval (φ + ψ) - symEval φ - symEval ψ + symEval 0` + +is linear, vanishes in degrees zero and one, and sends a degree-two monomial `u v` to +`φ u * ψ v + ψ u * φ v`: the dual of the symmetric product. Tensoring with the augmentation of +the lepton factor gives `gaugePairDual` on the whole jet algebra, and taking for `φ`, `ψ` the +coordinates of two gauge-field generators gives `gaugeDual`. + +## Key results + +- `gaugePairDual` : the polarization of `symEval`, dual to a symmetric product of generators. +- `gaugeDual_fieldStrength_mul` : the value of `gaugeDual p q` on a product of two field + strengths, in terms of the antisymmetric coefficient `fsCoeff`. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## A. Evaluating the B-boson factor + +-/ + +/-- The algebra map on the B-boson factor sending each gauge-field generator to its value + under `φ`. -/ +noncomputable def symEval (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : + (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] ℂ := + Algebra.TensorProduct.lift (AlgHom.id ℂ ℂ) (SymmetricAlgebra.lift φ) + (fun _ _ => Commute.all _ _) + +@[simp] +lemma symEval_tmul_ofGenerator (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (g : BBoson.JetGenerators) : + symEval φ (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) = + φ (BBoson.JetComponentSpace.basis g) := by + simp [symEval, BBoson.JetAlgebra.ofGenerator] + +/-- The augmentation of the lepton factor: the algebra map to `ℂ` sending every lepton + generator to zero. -/ +noncomputable def augL : LeptonSinglet.JetAlgebra →ₐ[ℂ] ℂ := + ExteriorAlgebra.lift ℂ ⟨0, fun m => by simp⟩ + +/-! + +## B. The polarization + +-/ + +/-- The second difference of `symEval`: the functional on the B-boson factor dual to the + degree-two monomial paired with `φ` and `ψ`. It is linear where `symEval` is quadratic, and + vanishes on the degrees zero and one where the second difference of a quadratic is blind. -/ +noncomputable def symPairDual (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : + (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ := + (symEval (φ + ψ)).toLinearMap - (symEval φ).toLinearMap - (symEval ψ).toLinearMap + + (symEval 0).toLinearMap + +lemma symPairDual_tmul_ofGenerator_mul (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (g h : BBoson.JetGenerators) : + symPairDual φ ψ ((1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) * + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator h)) = + φ (BBoson.JetComponentSpace.basis g) * ψ (BBoson.JetComponentSpace.basis h) + + ψ (BBoson.JetComponentSpace.basis g) * φ (BBoson.JetComponentSpace.basis h) := by + simp only [symPairDual, LinearMap.add_apply, LinearMap.sub_apply, AlgHom.toLinearMap_apply, + map_mul, symEval_tmul_ofGenerator, LinearMap.add_apply, LinearMap.zero_apply] + ring + +/-- The functional on the jet algebra dual to a symmetric product of two gauge-field + generators: the polarization on the B-boson factor tensored with the augmentation on the + lepton factor. -/ +noncomputable def gaugePairDual (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : + JetAlgebra →ₗ[ℂ] ℂ := + TensorProduct.lift (((LinearMap.mul ℂ ℂ).comp (symPairDual φ ψ)).compl₂ augL.toLinearMap) + +@[simp] +lemma gaugePairDual_tmul (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + gaugePairDual φ ψ (a ⊗ⱼ b) = symPairDual φ ψ a * augL b := rfl + +lemma gaugePairDual_ofGenerator_mul (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (s t : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + gaugePairDual φ ψ (ofGenerator (JetGenerators.dB s μ) * + ofGenerator (JetGenerators.dB t ν)) = + φ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB s μ)) * + ψ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB t ν)) + + ψ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB s μ)) * + φ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB t ν)) := by + rw [ofGenerator_B_eq, ofGenerator_B_eq, JetAlgebra.tmul_mul_tmul, mul_one, + gaugePairDual_tmul, symPairDual_tmul_ofGenerator_mul, map_one, mul_one] + +/-! + +## C. The dual family for the photon pairs + +-/ + +/-- The coefficient with which the field strength `F_{a b}` contains the gauge-field generator + `∂_{p.1} B_{p.2}`: `+1`, `-1` or `0`, by the antisymmetry of `F`. -/ +noncomputable def fsCoeff (p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) (a b : Fin 1 ⊕ Fin 3) : ℂ := + (if a = p.1 ∧ b = p.2 then 1 else 0) - (if b = p.1 ∧ a = p.2 then 1 else 0) + +/-- The functional dual to the product of the two field strengths indexed by the generator + pairs `p` and `q`. -/ +noncomputable def gaugeDual (p q : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : JetAlgebra →ₗ[ℂ] ℂ := + gaugePairDual ((BBoson.JetComponentSpace.basis.coord + (BBoson.JetGenerators.dB {p.1} p.2)).smulRight (1 : ℂ)) + ((BBoson.JetComponentSpace.basis.coord + (BBoson.JetGenerators.dB {q.1} q.2)).smulRight (1 : ℂ)) + +/-- A first-order field strength written out on the generators. -/ +lemma fieldStrengthDeriv_nil_eq (a b : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {} a b = + ofGenerator (JetGenerators.dB {a} b) - ofGenerator (JetGenerators.dB {b} a) := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, TensorProduct.tmul_sub, sub_tmul] + rfl + +/-- **`gaugeDual` is dual to the photon pairs.** The value on a product of two field strengths + is the symmetric pairing of the two antisymmetric coefficients. -/ +@[simp] +lemma gaugeDual_fieldStrength_mul (p q : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (a b c d : Fin 1 ⊕ Fin 3) : + gaugeDual p q (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = + fsCoeff p a b * fsCoeff q c d + fsCoeff q a b * fsCoeff p c d := by + simp only [fieldStrengthDeriv_nil_eq, sub_mul, mul_sub, map_sub, gaugeDual, + gaugePairDual_ofGenerator_mul, Module.Basis.coord_apply, Module.Basis.repr_self, + LinearMap.smulRight_apply, Finsupp.single_apply, BBoson.JetGenerators.dB.injEq, + Multiset.singleton_inj, fsCoeff, ite_smul, one_smul, zero_smul] + ring + +end JetAlgebra + +end LeptonGaugeSector + +end From 12551c2a9eefb048454aafb0016613bd953a54ac Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 11 Aug 2026 11:27:31 +0100 Subject: [PATCH 128/254] feat: Add bar kinetic term results. Co-Authored-By: Claude --- .../FermionicBarKineticTerm/BoostWeight.lean | 682 ++++++++++++++++++ .../FermionicBarKineticTerm/Closure.lean | 144 ++++ .../LinearIndependence.lean | 89 +++ .../FermionicKineticTerm/Closure.lean | 139 ++++ .../JetAlgebra/GaugeKineticTerm/Closure.lean | 152 ++++ 5 files changed, 1206 insertions(+) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean new file mode 100644 index 000000000..e7a5eda02 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean @@ -0,0 +1,682 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.LinearIndependence +/-! +# The boost weight zero part of the conjugate fermion kinetic bilinears + +The same analysis as for `ψ̄_α D_μ ψ_β`, carried out for the bilinears `(D̄_μ ψ̄)_α ψ_β` with the +derivative on the conjugate lepton. The mirror is not quite literal: the derivative now sits on +the factor that transforms by `Λ⁻¹` rather than by its conjugate, so in the `y`-direction the +spinor combinations of the two factors exchange the sign of `i`. + +-/ + +@[expose] public section + +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false +set_option linter.unnecessarySeqFocus false + +namespace LeptonGaugeSector +open TensorProduct StandardModel +open scoped minkowskiMatrix PauliMatrix Pointwise +open Matrix MatrixGroups + +namespace JetAlgebra + +private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl + +/-- **The boost weight zero part of the conjugate fermion kinetic bilinears.** An element of the + span of the products `(D̄_μ ψ̄)_α ψ_β` has boost weight zero exactly when it is a combination of + the six bilinears listed. Both spinor indices carry `z`-boost weight `∓1` for the index `0, 1` + and the derivative index carries `±2` on the light-cone combinations `∂_0 ∓ ∂_z` and `0` on + `∂_x, ∂_y`, so the weight-zero bilinears pair the spinor indices `(0,0)` and `(1,1)` with the + matching light-cone derivative and the mixed spinor indices with a transverse derivative. + + The six spanning elements are chosen with the later restriction by the boost weights in the + `x`- and `y`-directions in mind: they pair into a `∂_0/∂_z` block and `∂_x` and `∂_y` blocks. -/ +theorem boostWeight_inter_fermionic_bar_kinetic_term : + boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = + Submodule.span ℂ + {(Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inr 2] 0) * Dψ [] 0 + + (Dbarψ [Sum.inl 0] 1 + Dbarψ [Sum.inr 2] 1) * Dψ [] 1, + (Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inr 2] 0) * Dψ [] 0 - + (Dbarψ [Sum.inl 0] 1 + Dbarψ [Sum.inr 2] 1) * Dψ [] 1, + Dbarψ [Sum.inr 0] 1 * Dψ [] 0 + Dbarψ [Sum.inr 0] 0 * Dψ [] 1, + Dbarψ [Sum.inr 0] 1 * Dψ [] 0 - Dbarψ [Sum.inr 0] 0 * Dψ [] 1, + Dbarψ [Sum.inr 1] 1 * Dψ [] 0 + Dbarψ [Sum.inr 1] 0 * Dψ [] 1, + Dbarψ [Sum.inr 1] 1 * Dψ [] 0 - Dbarψ [Sum.inr 1] 0 * Dψ [] 1} := by + -- ### A. The boost eigenvectors among the first-order fermion coordinates + -- `ψ_β` is an eigenvector of weight `∓1` for `β = 0, 1`; on `D̄_μ ψ̄_α` the spinor index + -- contributes `∓1` and the light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ̄_α` add `±2`. + set C0 := Dψ [] 0 with hC0 + set C1 := Dψ [] 1 with hC1 + set P0 := Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inr 2] 0 with hP0 + set P1 := Dbarψ [Sum.inl 0] 1 - Dbarψ [Sum.inr 2] 1 with hP1 + set M0 := Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inr 2] 0 with hM0 + set M1 := Dbarψ [Sum.inl 0] 1 + Dbarψ [Sum.inr 2] 1 with hM1 + set X0 := Dbarψ [Sum.inr 0] 0 with hX0 + set X1 := Dbarψ [Sum.inr 0] 1 with hX1 + set Y0 := Dbarψ [Sum.inr 1] 0 with hY0 + set Y1 := Dbarψ [Sum.inr 1] 1 with hY1 + set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF + set S : Set JetAlgebra := {P0 * C0 + M1 * C1, P0 * C0 - M1 * C1, X1 * C0 + X0 * C1, + X1 * C0 - X0 * C1, Y1 * C0 + Y0 * C1, Y1 * C0 - Y0 * C1} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j with hW + have hC0w : C0 ∈ boostWeightSubmodule 2 (-1) := Dψ_nil_zero_mem_neg_one + have hC1w : C1 ∈ boostWeightSubmodule 2 1 := Dψ_nil_one_mem_one + obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : + P0 ∈ boostWeightSubmodule 2 1 ∧ P1 ∈ boostWeightSubmodule 2 3 ∧ + M0 ∈ boostWeightSubmodule 2 (-3) ∧ M1 ∈ boostWeightSubmodule 2 (-1) ∧ + X0 ∈ boostWeightSubmodule 2 (-1) ∧ X1 ∈ boostWeightSubmodule 2 1 ∧ + Y0 ∈ boostWeightSubmodule 2 (-1) ∧ Y1 ∈ boostWeightSubmodule 2 1 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hP0, hP1, hM0, hM1, hX0, hX1, hY0, hY1, map_sub, map_add, boostAxis_two, + algebraMap_real_complex, + repLorentzGroup_Dbarψ_singleton, toLorentzGroup_boostZel, boostZel_inv_coe, boostMatZ, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_zero, star_zero, Complex.conj_ofReal, Complex.ofReal_zero, + Complex.ofReal_one, mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, + add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. The six weight-zero bilinears lie in the span of the pairs + have hSW : Submodule.span ℂ S ≤ W := le_sup_left + have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by + intro u v h₁ h₂ + have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) + have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + obtain ⟨k1, k8⟩ : P0 * C0 ∈ W ∧ M1 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨kx0, kx1⟩ : X1 * C0 ∈ W ∧ X0 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨ky0, ky1⟩ : Y1 * C0 ∈ W ∧ Y0 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) + -- ### C. Every bilinear splits into eigen bilinears of a single weight + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → + y ∈ boostWeightSubmodule 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + have k2 : M0 * C0 ∈ W := hm hM0w hC0w (by norm_num) + have k3 : P0 * C1 ∈ W := hm hP0w hC1w (by norm_num) + have k4 : M0 * C1 ∈ W := hm hM0w hC1w (by norm_num) + have k5 : P1 * C0 ∈ W := hm hP1w hC0w (by norm_num) + have k6 : M1 * C0 ∈ W := hm hM1w hC0w (by norm_num) + have k7 : P1 * C1 ∈ W := hm hP1w hC1w (by norm_num) + have key : ∀ {a u v : JetAlgebra} (c d : ℂ) {y : JetAlgebra}, u * a ∈ W → v * a ∈ W → + y = c • u + d • v → y * a ∈ W := by + rintro a u v c d y hu hv rfl + rw [add_mul, smul_mul_assoc, smul_mul_assoc] + exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) + have hkey : Submodule.span ℂ FF ≤ W := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨α, μ, β, rfl⟩ + match α, μ, β with + | 0, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) + | 0, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) + | 0, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k3 k4 (by rw [hP0, hM0]; module) + | 0, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k3 k4 (by rw [hP0, hM0]; module) + | 1, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k5 k6 (by rw [hP1, hM1]; module) + | 1, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k5 k6 (by rw [hP1, hM1]; module) + | 1, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) + | 1, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) + | 0, Sum.inr 0, 0 => exact hm hX0w hC0w (by norm_num) + | 0, Sum.inr 0, 1 => exact kx1 + | 1, Sum.inr 0, 0 => exact kx0 + | 1, Sum.inr 0, 1 => exact hm hX1w hC1w (by norm_num) + | 0, Sum.inr 1, 0 => exact hm hY0w hC0w (by norm_num) + | 0, Sum.inr 1, 1 => exact ky1 + | 1, Sum.inr 1, 0 => exact ky0 + | 1, Sum.inr 1, 1 => exact hm hY1w hC1w (by norm_num) + -- ### D. The intersection + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → + y ∈ boostWeightSubmodule 2 l → k + l = 0 → x * y ∈ boostWeightSubmodule 2 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) + exacts [add_mem (hz hP0w hC0w (by norm_num)) (hz hM1w hC1w (by norm_num)), + sub_mem (hz hP0w hC0w (by norm_num)) (hz hM1w hC1w (by norm_num)), + add_mem (hz hX1w hC0w (by norm_num)) (hz hX0w hC1w (by norm_num)), + sub_mem (hz hX1w hC0w (by norm_num)) (hz hX0w hC1w (by norm_num)), + add_mem (hz hY1w hC0w (by norm_num)) (hz hY0w hC1w (by norm_num)), + sub_mem (hz hY1w hC0w (by norm_num)) (hz hY0w hC1w (by norm_num))] + have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ Submodule.span ℂ FF := fun α μ β => by + rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> + simp only [hC0, hC1, hP0, hM1, hX0, hX1, hY0, hY1, sub_mul, add_mul] <;> + repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] + +/-- **The boost weight zero part of the conjugate fermion kinetic bilinears, `x`-direction.** The + `x`-boost is not diagonal on the coordinate spinors, so the eigenvectors are the combinations + `ψ_0 ± ψ_1` of weight `∓1`, and likewise on the spinor index of `D̄_μ ψ̄_α`; the light-cone + derivative combinations are `∂_0 ∓ ∂_x`, and `∂_y`, `∂_z` are the transverse directions. -/ +theorem boostWeight_inter_fermionic_bar_kinetic_term_x : + boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = + Submodule.span ℂ + {(Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 + Dψ [] 1) + + (Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 - Dψ [] 1), + (Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 + Dψ [] 1) - + (Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 - Dψ [] 1), + (Dbarψ [Sum.inr 1] 0 - Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 + Dψ [] 1) + + (Dbarψ [Sum.inr 1] 0 + Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 - Dψ [] 1), + (Dbarψ [Sum.inr 1] 0 - Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 + Dψ [] 1) - + (Dbarψ [Sum.inr 1] 0 + Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 - Dψ [] 1), + (Dbarψ [Sum.inr 2] 0 - Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 + Dψ [] 1) + + (Dbarψ [Sum.inr 2] 0 + Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 - Dψ [] 1), + (Dbarψ [Sum.inr 2] 0 - Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 + Dψ [] 1) - + (Dbarψ [Sum.inr 2] 0 + Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 - Dψ [] 1)} := by + -- ### A. The boost eigenvectors among the first-order fermion coordinates + set Cp := Dψ [] 0 + Dψ [] 1 with hCp + set Cm := Dψ [] 0 - Dψ [] 1 with hCm + set P := Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1) with hP + set Q := Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1) with hQ + set N := Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1) with hN + set M := Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1) with hM + set T0p := Dbarψ [Sum.inr 1] 0 + Dbarψ [Sum.inr 1] 1 with hT0p + set T0m := Dbarψ [Sum.inr 1] 0 - Dbarψ [Sum.inr 1] 1 with hT0m + set T1p := Dbarψ [Sum.inr 2] 0 + Dbarψ [Sum.inr 2] 1 with hT1p + set T1m := Dbarψ [Sum.inr 2] 0 - Dbarψ [Sum.inr 2] 1 with hT1m + set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF + set S : Set JetAlgebra := {P * Cp + M * Cm, P * Cp - M * Cm, T0m * Cp + T0p * Cm, + T0m * Cp - T0p * Cm, T1m * Cp + T1p * Cm, T1m * Cp - T1p * Cm} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j with hW + obtain ⟨hCpw, hCmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : + Cp ∈ boostWeightSubmodule 0 (-1) ∧ Cm ∈ boostWeightSubmodule 0 1 ∧ + P ∈ boostWeightSubmodule 0 1 ∧ Q ∈ boostWeightSubmodule 0 3 ∧ + N ∈ boostWeightSubmodule 0 (-3) ∧ M ∈ boostWeightSubmodule 0 (-1) ∧ + T0p ∈ boostWeightSubmodule 0 (-1) ∧ T0m ∈ boostWeightSubmodule 0 1 ∧ + T1p ∈ boostWeightSubmodule 0 (-1) ∧ T1m ∈ boostWeightSubmodule 0 1 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hCp, hCm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, + boostAxis_zero, toLorentzGroup_boostXel, boostXel_inv_coe, boostMatX, + algebraMap_real_complex, + repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_singleton, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, + Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, + mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. The six weight-zero bilinears lie in the span of the pairs + have hSW : Submodule.span ℂ S ≤ W := le_sup_left + have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by + intro u v h₁ h₂ + have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) + have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + obtain ⟨k1, k8⟩ : P * Cp ∈ W ∧ M * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨kx0, kx1⟩ : T0m * Cp ∈ W ∧ T0p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨ky0, ky1⟩ : T1m * Cp ∈ W ∧ T1p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) + -- ### C. Every bilinear splits into eigen bilinears of a single weight + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → + y ∈ boostWeightSubmodule 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + have hbil : ∀ x ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), + ∀ y ∈ Submodule.span ℂ ({Cp, Cm} : Set JetAlgebra), x * y ∈ W := by + intro x hx + induction hx using Submodule.span_induction with + | mem a ha => + intro y hy + induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb + rcases ha with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + rcases hb with rfl | rfl + exacts [k1, hm hPw hCmw (by norm_num), + hm hQw hCpw (by norm_num), hm hQw hCmw (by norm_num), + hm hNw hCpw (by norm_num), hm hNw hCmw (by norm_num), + hm hMw hCpw (by norm_num), k8, + hm hT0pw hCpw (by norm_num), kx1, + kx0, hm hT0mw hCmw (by norm_num), + hm hT1pw hCpw (by norm_num), ky1, + ky0, hm hT1mw hCmw (by norm_num)] + | zero => simp + | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz + | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy + | zero => intro y _; simp + | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) + | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) + have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 c3 c4 z rfl + exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hkey : Submodule.span ℂ FF ≤ W := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨α, μ, β, rfl⟩ + refine hbil _ ?_ _ ?_ + · match μ, α with + | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inl 0, 1 => exact hc4 4⁻¹ (-4⁻¹) 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 0, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 0, 1 => exact hc4 (-4⁻¹) 4⁻¹ 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 1, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) + | Sum.inr 1, 1 => exact hc0 2⁻¹ (-2⁻¹) (by rw [hT0p, hT0m]; module) + | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) + | Sum.inr 2, 1 => exact hc1 2⁻¹ (-2⁻¹) (by rw [hT1p, hT1m]; module) + · rw [Submodule.mem_span_pair] + match β with + | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hCp, hCm]; module⟩ + | 1 => exact ⟨2⁻¹, -2⁻¹, by rw [hCp, hCm]; module⟩ + -- ### D. The intersection + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → + y ∈ boostWeightSubmodule 0 l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) + exacts [add_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), + sub_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), + add_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), + sub_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), + add_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num)), + sub_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num))] + have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ Submodule.span ℂ FF := fun α μ β => by + rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> + simp only [hCp, hCm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, + mul_smul_comm, smul_mul_assoc] <;> + repeat' first + | exact hFm _ _ _ + | apply add_mem + | apply sub_mem + | apply neg_mem + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] + +/-- **The boost weight zero part of the conjugate fermion kinetic bilinears, `y`-direction.** As + for the `x`-boost, but the rotated spinor combinations now carry a factor of `i`. The + conjugate lepton transforms by `Λ⁻¹` and the lepton by its conjugate, so the two factors take + opposite signs of `i`: `ψ̄_0 ∓ i ψ̄_1` and `ψ_0 ± i ψ_1` have weight `∓1`. -/ +theorem boostWeight_inter_fermionic_bar_kinetic_term_y : + boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = + Submodule.span ℂ + {(Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1)) * + (Dψ [] 0 + Complex.I • Dψ [] 1) + + (Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1)) * + (Dψ [] 0 - Complex.I • Dψ [] 1), + (Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1)) * + (Dψ [] 0 + Complex.I • Dψ [] 1) - + (Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1)) * + (Dψ [] 0 - Complex.I • Dψ [] 1), + (Dbarψ [Sum.inr 0] 0 + Complex.I • Dbarψ [Sum.inr 0] 1) * + (Dψ [] 0 + Complex.I • Dψ [] 1) + + (Dbarψ [Sum.inr 0] 0 - Complex.I • Dbarψ [Sum.inr 0] 1) * + (Dψ [] 0 - Complex.I • Dψ [] 1), + (Dbarψ [Sum.inr 0] 0 + Complex.I • Dbarψ [Sum.inr 0] 1) * + (Dψ [] 0 + Complex.I • Dψ [] 1) - + (Dbarψ [Sum.inr 0] 0 - Complex.I • Dbarψ [Sum.inr 0] 1) * + (Dψ [] 0 - Complex.I • Dψ [] 1), + (Dbarψ [Sum.inr 2] 0 + Complex.I • Dbarψ [Sum.inr 2] 1) * + (Dψ [] 0 + Complex.I • Dψ [] 1) + + (Dbarψ [Sum.inr 2] 0 - Complex.I • Dbarψ [Sum.inr 2] 1) * + (Dψ [] 0 - Complex.I • Dψ [] 1), + (Dbarψ [Sum.inr 2] 0 + Complex.I • Dbarψ [Sum.inr 2] 1) * + (Dψ [] 0 + Complex.I • Dψ [] 1) - + (Dbarψ [Sum.inr 2] 0 - Complex.I • Dbarψ [Sum.inr 2] 1) * + (Dψ [] 0 - Complex.I • Dψ [] 1)} := by + -- ### A. The boost eigenvectors among the first-order fermion coordinates + set Cp := Dψ [] 0 + Complex.I • Dψ [] 1 with hCp + set Cm := Dψ [] 0 - Complex.I • Dψ [] 1 with hCm + set P := Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1) with hP + set Q := Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 - + (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1) with hQ + set N := Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1) with hN + set M := Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 + + (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1) with hM + set T0p := Dbarψ [Sum.inr 0] 0 - Complex.I • Dbarψ [Sum.inr 0] 1 with hT0p + set T0m := Dbarψ [Sum.inr 0] 0 + Complex.I • Dbarψ [Sum.inr 0] 1 with hT0m + set T1p := Dbarψ [Sum.inr 2] 0 - Complex.I • Dbarψ [Sum.inr 2] 1 with hT1p + set T1m := Dbarψ [Sum.inr 2] 0 + Complex.I • Dbarψ [Sum.inr 2] 1 with hT1m + set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF + set S : Set JetAlgebra := {P * Cp + M * Cm, P * Cp - M * Cm, T0m * Cp + T0p * Cm, + T0m * Cp - T0p * Cm, T1m * Cp + T1p * Cm, T1m * Cp - T1p * Cm} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j with hW + obtain ⟨hCpw, hCmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : + Cp ∈ boostWeightSubmodule 1 (-1) ∧ Cm ∈ boostWeightSubmodule 1 1 ∧ + P ∈ boostWeightSubmodule 1 1 ∧ Q ∈ boostWeightSubmodule 1 3 ∧ + N ∈ boostWeightSubmodule 1 (-3) ∧ M ∈ boostWeightSubmodule 1 (-1) ∧ + T0p ∈ boostWeightSubmodule 1 (-1) ∧ T0m ∈ boostWeightSubmodule 1 1 ∧ + T1p ∈ boostWeightSubmodule 1 (-1) ∧ T1m ∈ boostWeightSubmodule 1 1 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hCp, hCm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, + boostAxis_one, toLorentzGroup_boostYel, boostYel_inv_coe, boostMatY, + algebraMap_real_complex, + repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_singleton, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, + Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, + Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, + mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> field_simp <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf) + -- ### B. The six weight-zero bilinears lie in the span of the pairs + have hSW : Submodule.span ℂ S ≤ W := le_sup_left + have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by + intro u v h₁ h₂ + have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) + have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) + obtain ⟨k1, k8⟩ : P * Cp ∈ W ∧ M * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨kx0, kx1⟩ : T0m * Cp ∈ W ∧ T0p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) + obtain ⟨ky0, ky1⟩ : T1m * Cp ∈ W ∧ T1p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) + -- ### C. Every bilinear splits into eigen bilinears of a single weight + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → + y ∈ boostWeightSubmodule 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + have hbil : ∀ x ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), + ∀ y ∈ Submodule.span ℂ ({Cp, Cm} : Set JetAlgebra), x * y ∈ W := by + intro x hx + induction hx using Submodule.span_induction with + | mem a ha => + intro y hy + induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb + rcases ha with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + rcases hb with rfl | rfl + exacts [k1, hm hPw hCmw (by norm_num), + hm hQw hCpw (by norm_num), hm hQw hCmw (by norm_num), + hm hNw hCpw (by norm_num), hm hNw hCmw (by norm_num), + hm hMw hCpw (by norm_num), k8, + hm hT0pw hCpw (by norm_num), kx1, + kx0, hm hT0mw hCmw (by norm_num), + hm hT1pw hCpw (by norm_num), ky1, + ky0, hm hT1mw hCmw (by norm_num)] + | zero => simp + | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz + | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy + | zero => intro y _; simp + | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) + | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) + have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 c3 c4 z rfl + exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → + z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by + rintro c1 c2 z rfl + exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) + have hkey : Submodule.span ℂ FF ≤ W := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨α, μ, β, rfl⟩ + refine hbil _ ?_ _ ?_ + · match μ, α with + | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inl 0, 1 => + exact hc4 (Complex.I / 4) (-(Complex.I / 4)) (Complex.I / 4) (-(Complex.I / 4)) + (by rw [hP, hQ, hN, hM] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + | Sum.inr 1, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) + | Sum.inr 1, 1 => + exact hc4 (-(Complex.I / 4)) (Complex.I / 4) (Complex.I / 4) (-(Complex.I / 4)) + (by rw [hP, hQ, hN, hM] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + | Sum.inr 0, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) + | Sum.inr 0, 1 => + exact hc0 (Complex.I / 2) (-(Complex.I / 2)) + (by rw [hT0p, hT0m] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) + | Sum.inr 2, 1 => + exact hc1 (Complex.I / 2) (-(Complex.I / 2)) + (by rw [hT1p, hT1m] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)) + · rw [Submodule.mem_span_pair] + match β with + | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hCp, hCm]; module⟩ + | 1 => + exact ⟨-(Complex.I / 2), Complex.I / 2, by + rw [hCp, hCm] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> + (try ring_nf)⟩ + -- ### D. The intersection + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → + y ∈ boostWeightSubmodule 1 l → k + l = 0 → x * y ∈ boostWeightSubmodule 1 0 := by + intro k l x y hx hy h + rw [← h]; exact mul_mem_boostWeightSubmodule hx hy + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) + exacts [add_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), + sub_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), + add_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), + sub_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), + add_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num)), + sub_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num))] + have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ Submodule.span ℂ FF := fun α μ β => by + rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> + simp only [hCp, hCm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, + mul_smul_comm, smul_mul_assoc] <;> + repeat' first + | apply add_mem + | apply sub_mem + | apply neg_mem + | apply Submodule.smul_mem + | exact hFm _ _ _ + refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] + +/-- **The conjugate fermion kinetic term is the only conjugate bilinear of boost weight zero in + every direction.** An element of the span of the products `(D̄_μ ψ̄)_α ψ_β` has boost weight + zero along all three axes exactly when it is a multiple of `-i (D̄_μ ψ̄) σ̄^μ ψ`. + + *Here the proof is not a certificate.* The three one-axis theorems above cut the span of the + sixteen bilinears down to a six-dimensional space each, and the three sixes have to be + intersected; the intersection is read off from the coefficients, which is where the linear + independence of the bilinears (`fermionBarDual_apply`) enters. The `z`-axis theorem provides + the six coefficients `a₁, …, a₆`, and five functionals, each a combination of two of the duals + `fermionBarDual` chosen to annihilate the `x`- or the `y`-axis span, cut them down to one. -/ +lemma boostWeight_inter_fermionic_bar_kinetic_term_full : + boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ + boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = + Submodule.span ℂ {fermionKineticTermBar} := by + have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ + Submodule.span ℂ {x : JetAlgebra | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} := + fun α μ β => Submodule.subset_span ⟨α, μ, β, rfl⟩ + have hinv : IsInvariant fermionKineticTermBar := + ⟨repJetGaugeGroupI_fermionKineticTermBar, repLorentzGroup_fermionKineticTermBar⟩ + refine le_antisymm ?_ ?_ + -- ### A. The three one-axis intersections + · intro x hx + rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx + obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx + have hz := boostWeight_inter_fermionic_bar_kinetic_term.le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) + have hbx := boostWeight_inter_fermionic_bar_kinetic_term_x.le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) + have hby := boostWeight_inter_fermionic_bar_kinetic_term_y.le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) + -- ### B. Pairs of dual functionals annihilating the `x`- and `y`-axis spans + have hpair : ∀ (c₁ c₂ : ℂ) (q₁ q₂ : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) {T : Set JetAlgebra}, + (∀ s ∈ T, c₁ * fermionBarDual q₁ s + c₂ * fermionBarDual q₂ s = 0) → + ∀ y ∈ Submodule.span ℂ T, c₁ * fermionBarDual q₁ y + c₂ * fermionBarDual q₂ y = 0 := by + intro c₁ c₂ q₁ q₂ T hT y hy + induction hy using Submodule.span_induction with + | mem s hs => exact hT s hs + | zero => simp + | add u v _ _ hu hv => rw [map_add, map_add]; linear_combination hu + hv + | smul c u _ hu => + rw [map_smul, map_smul, smul_eq_mul, smul_eq_mul]; linear_combination c * hu + obtain ⟨e1, e2, e3⟩ : + (-1 : ℂ) * fermionBarDual (0, Sum.inl 0, 0) x + + 1 * fermionBarDual (1, Sum.inl 0, 1) x = 0 ∧ + (1 : ℂ) * fermionBarDual (0, Sum.inl 0, 0) x + + 1 * fermionBarDual (0, Sum.inr 0, 1) x = 0 ∧ + (1 : ℂ) * fermionBarDual (0, Sum.inl 0, 0) x + + 1 * fermionBarDual (1, Sum.inr 0, 0) x = 0 := by + refine ⟨hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx⟩ <;> + intro s hs <;> + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> + simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, + smul_mul_assoc, mul_smul_comm, fermionBarDual_apply] <;> + simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, + if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] + obtain ⟨e4, e5⟩ : + Complex.I * fermionBarDual (0, Sum.inl 0, 0) x + + 1 * fermionBarDual (0, Sum.inr 1, 1) x = 0 ∧ + (-Complex.I) * fermionBarDual (0, Sum.inl 0, 0) x + + 1 * fermionBarDual (1, Sum.inr 1, 0) x = 0 := by + refine ⟨hpair _ _ _ _ ?_ x hby, hpair _ _ _ _ ?_ x hby⟩ <;> + intro s hs <;> + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> + simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, + smul_mul_assoc, mul_smul_comm, fermionBarDual_apply] <;> + simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, + if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] + -- ### C. The six coefficients of the `z`-axis span, and the five relations on them + rw [Submodule.mem_span_insert] at hz + obtain ⟨a1, y1, hy1, rfl⟩ := hz + rw [Submodule.mem_span_insert] at hy1 + obtain ⟨a2, y2, hy2, rfl⟩ := hy1 + rw [Submodule.mem_span_insert] at hy2 + obtain ⟨a3, y3, hy3, rfl⟩ := hy2 + rw [Submodule.mem_span_insert] at hy3 + obtain ⟨a4, y4, hy4, rfl⟩ := hy3 + rw [Submodule.mem_span_insert] at hy4 + obtain ⟨a5, y5, hy5, rfl⟩ := hy4 + obtain ⟨a6, rfl⟩ := Submodule.mem_span_singleton.1 hy5 + simp only [mul_add, mul_sub, add_mul, sub_mul, map_add, map_smul, map_sub, smul_eq_mul, + fermionBarDual_apply, Prod.mk.injEq, Sum.inr.injEq, Sum.inl.injEq, reduceCtorEq, + Fin.isValue, Fin.reduceEq, and_false, false_and, if_false, and_true, true_and, if_true, + mul_zero, mul_one, add_zero, zero_add, sub_zero, zero_sub] at e1 e2 e3 e4 e5 + -- ### D. One coefficient is left, and it is the conjugate kinetic term + have ha2 : a2 = 0 := by linear_combination -e1 / 2 + have ha4 : a4 = 0 := by linear_combination (e3 - e2) / 2 + have ha3 : a3 = -(a1 + a2) := by linear_combination (e2 + e3) / 2 + have ha5 : a5 = 0 := by linear_combination (e4 + e5) / 2 + have ha6 : a6 = Complex.I * (a1 + a2) := by linear_combination (e5 - e4) / 2 + subst ha2 ha4 ha5 ha3 ha6 + rw [Submodule.mem_span_singleton] + refine ⟨Complex.I * a1, ?_⟩ + rw [fermionKineticTermBar_eq] + simp only [add_mul, sub_mul, add_zero] + have hI3 : Complex.I ^ 3 = -Complex.I := by rw [pow_succ, Complex.I_sq, neg_one_mul] + match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq, hI3]) <;> (try ring_nf) + -- ### E. The kinetic term is invariant, hence of weight zero along every axis + · rw [Submodule.span_le, Set.singleton_subset_iff] + refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinv, + mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, ?_⟩ + rw [fermionKineticTermBar_eq] + exact Submodule.smul_mem _ _ (sub_mem (sub_mem (sub_mem + (add_mem (hFm _ _ _) (hFm _ _ _)) (add_mem (hFm _ _ _) (hFm _ _ _))) + (Submodule.smul_mem _ _ (sub_mem (hFm _ _ _) (hFm _ _ _)))) + (sub_mem (hFm _ _ _) (hFm _ _ _))) + +/-! + +## The key theorem + +-/ + +/-- **The invariant conjugate fermion bilinears are the multiples of the conjugate kinetic + term.** -/ +lemma mem_fermionic_bar_kinetic_span_eq_kineticTermBar_of_isInvariant {x : JetAlgebra} + (hx : IsInvariant x) (ht : x ∈ Submodule.span ℂ {y | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : + x ∈ Submodule.span ℂ {fermionKineticTermBar} := by + rw [← boostWeight_inter_fermionic_bar_kinetic_term_full] + exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean new file mode 100644 index 000000000..61b489dee --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms +/-! +# The conjugate fermion kinetic bilinears span a subrepresentation + +The span of the sixteen bilinears `(D̄_μ ψ̄)_α ψ_β` is carried to itself by both group actions on +the jet algebra. Statements proved for the span — that its boost-weight-zero part is the +conjugate fermion kinetic term, say — may therefore be combined with any operator built from the +group elements, an average or a projector among them, without leaving the span. + +*Both closures are covariance of the covariant derivative.* Under the Lorentz group `ψ_β` mixes +only with the `ψ_δ`, and `D̄_μ ψ̄_α` only with the `D̄_ν ψ̄_γ` — the `+ 6 i B_μ ψ̄_α` tail of the +conjugate covariant derivative transforms along with the derivative, which is the content of +`repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil` — so a bilinear goes to a combination of bilinears. +Under the gauge group each bilinear is not merely carried into the span but fixed: the +hypercharge characters of the lepton and of its conjugate cancel by unitarity +(`repJetGaugeGroupI_Dbarψ_mul_Dψ`), so the span is fixed pointwise. + +## Key results + +- `JetAlgebra.repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil` : the span is closed under the + Lorentz action, and `map_repLorentzGroup_span_Dbarψ_singleton_mul_Dψ_nil` states this as an + equality of submodules. +- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil` : the gauge group + fixes the span pointwise, whence `map_repJetGaugeGroupI_span_Dbarψ_singleton_mul_Dψ_nil`. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +## A. The generators + +-/ + +/-- A conjugate fermion kinetic bilinear lies in their span. -/ +lemma Dbarψ_singleton_mul_Dψ_nil_mem_span (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : + Dbarψ [μ] α * Dψ [] β ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := + Submodule.subset_span ⟨α, μ, β, rfl⟩ + +/-- The Lorentz action carries a conjugate fermion kinetic bilinear into the span of the + bilinears: the spinor indices are rotated among themselves and the derivative index along with + them. -/ +lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil_mem_span (Λ : SL(2,ℂ)) (α : Fin 2) + (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : + repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by + rw [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil] + exact Submodule.sum_mem _ fun ν _ => Submodule.sum_mem _ fun γ _ => + Submodule.sum_mem _ fun δ _ => + Submodule.smul_mem _ _ (Dbarψ_singleton_mul_Dψ_nil_mem_span γ ν δ) + +/-! + +## B. Closure under the Lorentz group + +-/ + +/-- **The span of the conjugate fermion kinetic bilinears is closed under the Lorentz action.** -/ +lemma repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : + repLorentzGroup Λ x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨α, μ, β, rfl⟩ := hy + exact repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil_mem_span Λ α μ β + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- **The span of the conjugate fermion kinetic bilinears is a subrepresentation of the Lorentz + group.** Closure under every element and its inverse upgrades + `repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil` to an equality. -/ +lemma map_repLorentzGroup_span_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) : + Submodule.map (repLorentzGroup Λ) + (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) = + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil Λ hu + · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil Λ⁻¹ hx, + repLorentzGroup.self_inv_apply Λ x⟩ + +/-! + +## C. Closure under the gauge group + +-/ + +/-- **The gauge group fixes the span of the conjugate fermion kinetic bilinears pointwise.** Each + bilinear pairs the lepton with its conjugate, and their hypercharge characters cancel. -/ +lemma repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil (U : JetGaugeGroupI) + {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : + repJetGaugeGroupI U x = x := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨α, μ, β, rfl⟩ := hy + exact repJetGaugeGroupI_Dbarψ_mul_Dψ U [μ] [] α β + | zero => rw [map_zero] + | add u v _ _ hu hv => rw [map_add, hu, hv] + | smul c u _ hu => rw [map_smul, hu] + +/-- **The span of the conjugate fermion kinetic bilinears is closed under the gauge action.** -/ +lemma repJetGaugeGroupI_mem_span_Dbarψ_singleton_mul_Dψ_nil (U : JetGaugeGroupI) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : + repJetGaugeGroupI U x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by + rw [repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil U hx] + exact hx + +/-- **The span of the conjugate fermion kinetic bilinears is a subrepresentation of the gauge + group.** -/ +lemma map_repJetGaugeGroupI_span_Dbarψ_singleton_mul_Dψ_nil (U : JetGaugeGroupI) : + Submodule.map (repJetGaugeGroupI U) + (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) = + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repJetGaugeGroupI_mem_span_Dbarψ_singleton_mul_Dψ_nil U hu + · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil U hx⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean new file mode 100644 index 000000000..3e67338bd --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.LinearIndependence +/-! +# Linear independence of the conjugate fermion bilinears + +The sixteen products `(D̄_μ ψ̄)_α ψ_β` — the derivative on the conjugate lepton rather than on +the lepton — are linearly independent. Statements about an explicit span of such products, the +boost-weight-zero part of the conjugate fermion kinetic sector say, then reduce to linear algebra +on coefficients. + +The dual family is the one of `FermionicKineticTerm.LinearIndependence`, evaluated at the other +pair of dual basis vectors: `fermionPairDual` pairs a functional on the conjugate lepton with one +on the lepton, and here the derivative index is carried by the first rather than the second. +The `+ 6 i B_μ ψ̄_α` tail of `D̄_μ ψ̄_α` again contributes nothing, because its conjugate-lepton +factor carries no derivative index. + +## Key results + +- `fermionBarDual` : the functional dual to a chosen conjugate fermion bilinear. +- `Dbarψ_singleton_mul_Dψ_nil_linearIndependent` : the sixteen bilinears are independent. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-- The functional dual to the conjugate fermion bilinear `(D̄_μ ψ̄)_α ψ_β`. -/ +noncomputable def fermionBarDual (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : + JetAlgebra →ₗ[ℂ] ℂ := + fermionPairDual + (LeptonSinglet.JetComponentSpace.basis.coord + (LeptonSinglet.JetGenerators.dbarψ {q.2.1} q.1)) + (LeptonSinglet.JetComponentSpace.basis.coord + (LeptonSinglet.JetGenerators.dψ {} q.2.2)) + +/-- `fermionBarDual` is dual to the sixteen conjugate fermion bilinears. The `+ 6 i B_μ ψ̄_α` + tail of `D̄_μ ψ̄_α` drops out twice over: the augmentation kills its gauge-field factor, and its + conjugate-lepton factor carries no derivative index. -/ +lemma fermionBarDual_Dbarψ_mul_Dψ (q p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : + fermionBarDual q (Dbarψ [p.2.1] p.1 * Dψ [] p.2.2) = if p = q then 1 else 0 := by + obtain ⟨α₀, μ₀, β₀⟩ := q + obtain ⟨α, μ, β⟩ := p + rw [Dbarψ_singleton, Dψ_nil, add_mul, smul_mul_assoc, mul_assoc] + simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, + JetAlgebra.tmul_mul_tmul, one_mul, map_add, map_smul, + fermionBarDual, fermionPairDual_tmul, + LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] + simp only [Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, + LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq, Prod.mk.injEq] + simp only [Multiset.singleton_inj, true_and, mul_ite, mul_one, mul_zero] + by_cases hα : α = α₀ <;> by_cases hμ : μ = μ₀ <;> by_cases hβ : β = β₀ <;> + simp [hα, hμ, hβ] + +/-- `fermionBarDual_Dbarψ_mul_Dψ` with the three indices given separately, so that it fires on + bilinears written out rather than through a product index. -/ +@[simp] +lemma fermionBarDual_apply (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) (α : Fin 2) + (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : + fermionBarDual q (Dbarψ [μ] α * Dψ [] β) = if (α, μ, β) = q then 1 else 0 := + fermionBarDual_Dbarψ_mul_Dψ q (α, μ, β) + +/-- The sixteen conjugate fermion bilinears `(D̄_μ ψ̄)_α ψ_β` are linearly independent. -/ +theorem Dbarψ_singleton_mul_Dψ_nil_linearIndependent : + LinearIndependent ℂ (fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => + Dbarψ [p.2.1] p.1 * Dψ [] p.2.2) := by + rw [Fintype.linearIndependent_iff] + intro c hc q + have h := congrArg (fermionBarDual q) hc + rw [map_sum, map_zero] at h + simp only [map_smul, smul_eq_mul, fermionBarDual_Dbarψ_mul_Dψ, mul_ite, mul_one, + mul_zero, Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at h + exact h + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean new file mode 100644 index 000000000..b179cf3d4 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms +/-! +# The fermion kinetic bilinears span a subrepresentation + +The span of the sixteen bilinears `ψ̄_α D_μ ψ_β` is carried to itself by both group actions on +the jet algebra. Statements proved for the span — that its boost-weight-zero part is the fermion +kinetic term, say — may therefore be combined with any operator built from the group elements, +an average or a projector among them, without leaving the span. + +*Both closures are covariance of the covariant derivative.* Under the Lorentz group `ψ̄_α` mixes +only with the `ψ̄_γ`, and `D_μ ψ_β` only with the `D_ν ψ_δ` — the `- 6 i B_μ ψ_β` tail of the +covariant derivative transforms along with the derivative, which is the content of +`repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton` — so a bilinear goes to a combination of bilinears. +Under the gauge group each bilinear is not merely carried into the span but fixed: the +hypercharge characters of the lepton and of its conjugate cancel by unitarity +(`repJetGaugeGroupI_Dbarψ_mul_Dψ`), so the span is fixed pointwise. + +## Key results + +- `JetAlgebra.repLorentzGroup_mem_span_Dbarψ_mul_Dψ` : the span is closed under the Lorentz + action, and `map_repLorentzGroup_span_Dbarψ_mul_Dψ` states this as an equality of submodules. +- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ` : the gauge group fixes the span + pointwise, whence `map_repJetGaugeGroupI_span_Dbarψ_mul_Dψ`. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +## A. The generators + +-/ + +/-- A fermion kinetic bilinear lies in their span. -/ +lemma Dbarψ_mul_Dψ_mem_span (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : + Dbarψ [] α * Dψ [μ] β ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := + Submodule.subset_span ⟨α, μ, β, rfl⟩ + +/-- The Lorentz action carries a fermion kinetic bilinear into the span of the bilinears: the + spinor indices are rotated among themselves and the derivative index along with them. -/ +lemma repLorentzGroup_Dbarψ_mul_Dψ_mem_span (Λ : SL(2,ℂ)) (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) + (β : Fin 2) : + repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by + rw [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton] + exact Submodule.sum_mem _ fun γ _ => Submodule.sum_mem _ fun ν _ => + Submodule.sum_mem _ fun δ _ => Submodule.smul_mem _ _ (Dbarψ_mul_Dψ_mem_span γ ν δ) + +/-! + +## B. Closure under the Lorentz group + +-/ + +/-- **The span of the fermion kinetic bilinears is closed under the Lorentz action.** -/ +lemma repLorentzGroup_mem_span_Dbarψ_mul_Dψ (Λ : SL(2,ℂ)) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : + repLorentzGroup Λ x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨α, μ, β, rfl⟩ := hy + exact repLorentzGroup_Dbarψ_mul_Dψ_mem_span Λ α μ β + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- **The span of the fermion kinetic bilinears is a subrepresentation of the Lorentz group.** + Closure under every element and its inverse upgrades `repLorentzGroup_mem_span_Dbarψ_mul_Dψ` + to an equality. -/ +lemma map_repLorentzGroup_span_Dbarψ_mul_Dψ (Λ : SL(2,ℂ)) : + Submodule.map (repLorentzGroup Λ) + (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) = + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repLorentzGroup_mem_span_Dbarψ_mul_Dψ Λ hu + · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_Dbarψ_mul_Dψ Λ⁻¹ hx, + repLorentzGroup.self_inv_apply Λ x⟩ + +/-! + +## C. Closure under the gauge group + +-/ + +/-- **The gauge group fixes the span of the fermion kinetic bilinears pointwise.** Each bilinear + pairs the lepton with its conjugate, and their hypercharge characters cancel. -/ +lemma repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ (U : JetGaugeGroupI) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : + repJetGaugeGroupI U x = x := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨α, μ, β, rfl⟩ := hy + exact repJetGaugeGroupI_Dbarψ_mul_Dψ U [] [μ] α β + | zero => rw [map_zero] + | add u v _ _ hu hv => rw [map_add, hu, hv] + | smul c u _ hu => rw [map_smul, hu] + +/-- **The span of the fermion kinetic bilinears is closed under the gauge action.** -/ +lemma repJetGaugeGroupI_mem_span_Dbarψ_mul_Dψ (U : JetGaugeGroupI) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : + repJetGaugeGroupI U x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by + rw [repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ U hx] + exact hx + +/-- **The span of the fermion kinetic bilinears is a subrepresentation of the gauge group.** -/ +lemma map_repJetGaugeGroupI_span_Dbarψ_mul_Dψ (U : JetGaugeGroupI) : + Submodule.map (repJetGaugeGroupI U) + (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) = + Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repJetGaugeGroupI_mem_span_Dbarψ_mul_Dψ U hu + · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ U hx⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean new file mode 100644 index 000000000..e5f936803 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction +/-! +# The photon pairs span a subrepresentation + +The span of the products `F_{μν} F_{μ'ν'}` of two field strengths is carried to itself by both +group actions on the jet algebra. Statements proved for the span — that its boost-weight-zero +part is spanned by the Maxwell and theta terms, say — may therefore be combined with any operator +built from the group elements, an average or a projector among them, without leaving the span. + +*Both closures are the covariance of the field strength.* Under the Lorentz group each `F_{μν}` +goes to a combination of the `F_{ab}` (`repLorentzGroup_fieldStrengthDeriv_nil`), so a product of +two of them goes to a combination of products, the Lorentz action being multiplicative. Under the +gauge group each `F_{μν}` is not merely carried into the span but fixed — the field strength is +gauge invariant (`repJetGaugeGroupI_fieldStrengthDeriv`) — so the span is fixed pointwise. + +## Key results + +- `JetAlgebra.repLorentzGroup_mem_span_fieldStrength_mul` : the span is closed under the Lorentz + action, and `map_repLorentzGroup_span_fieldStrength_mul` states this as an equality of + submodules. +- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul` : the gauge group fixes the + span pointwise, whence `map_repJetGaugeGroupI_span_fieldStrength_mul`. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +## A. The generators + +-/ + +/-- A product of two field strengths lies in the span of the photon pairs. -/ +lemma fieldStrength_mul_mem_span (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν' ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := + Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩ + +/-- The Lorentz action carries a photon pair into the span of the photon pairs: each factor goes + to a combination of field strengths, and the action is multiplicative. -/ +lemma repLorentzGroup_fieldStrength_mul_mem_span (Λ : SL(2,ℂ)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν') ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by + rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, + repLorentzGroup_fieldStrengthDeriv_nil] + simp only [sum_mul', mul_sum', smul_mul_assoc, mul_smul_comm] + exact Submodule.sum_mem _ fun a _ => Submodule.sum_mem _ fun b _ => + Submodule.smul_mem _ _ (Submodule.sum_mem _ fun c _ => Submodule.sum_mem _ fun d _ => + Submodule.smul_mem _ _ (fieldStrength_mul_mem_span c d a b)) + +/-! + +## B. Closure under the Lorentz group + +-/ + +/-- **The span of the photon pairs is closed under the Lorentz action.** -/ +lemma repLorentzGroup_mem_span_fieldStrength_mul (Λ : SL(2,ℂ)) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : + repLorentzGroup Λ x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨μ, ν, μ', ν', rfl⟩ := hy + exact repLorentzGroup_fieldStrength_mul_mem_span Λ μ ν μ' ν' + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- **The span of the photon pairs is a subrepresentation of the Lorentz group.** Closure under + every element and its inverse upgrades `repLorentzGroup_mem_span_fieldStrength_mul` to an + equality. -/ +lemma map_repLorentzGroup_span_fieldStrength_mul (Λ : SL(2,ℂ)) : + Submodule.map (repLorentzGroup Λ) + (Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) = + Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repLorentzGroup_mem_span_fieldStrength_mul Λ hu + · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_fieldStrength_mul Λ⁻¹ hx, + repLorentzGroup.self_inv_apply Λ x⟩ + +/-! + +## C. Closure under the gauge group + +-/ + +/-- **The gauge group fixes the span of the photon pairs pointwise.** The field strength of the + abelian gauge field is gauge invariant. -/ +lemma repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul (U : JetGaugeGroupI) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : + repJetGaugeGroupI U x = x := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨μ, ν, μ', ν', rfl⟩ := hy + rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, + repJetGaugeGroupI_fieldStrengthDeriv] + | zero => rw [map_zero] + | add u v _ _ hu hv => rw [map_add, hu, hv] + | smul c u _ hu => rw [map_smul, hu] + +/-- **The span of the photon pairs is closed under the gauge action.** -/ +lemma repJetGaugeGroupI_mem_span_fieldStrength_mul (U : JetGaugeGroupI) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : + repJetGaugeGroupI U x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by + rw [repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul U hx] + exact hx + +/-- **The span of the photon pairs is a subrepresentation of the gauge group.** -/ +lemma map_repJetGaugeGroupI_span_fieldStrength_mul (U : JetGaugeGroupI) : + Submodule.map (repJetGaugeGroupI U) + (Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) = + Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repJetGaugeGroupI_mem_span_fieldStrength_mul U hu + · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul U hx⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end From 442a2929a1f5e23f2b3c945977f26f7161031dd2 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:55:06 +0100 Subject: [PATCH 129/254] feat: Clean up invariants proof Co-Authored-By: Claude --- .../FermionicBarKineticTerm/BoostWeight.lean | 1 + .../FermionicKineticTerm/BoostWeight.lean | 1 + .../GaugeDoubleDeriv/BoostWeight.lean | 1802 +++++++++++++++++ .../JetAlgebra/GaugeDoubleDeriv/Closure.lean | 140 ++ .../GaugeDoubleDeriv/Invariance.lean | 58 + .../GaugeDoubleDeriv/LinearIndependence.lean | 151 ++ .../GaugeKineticTerm/BoostWeight.lean | 1 + .../Subgroups => Grading}/AxisBoosts.lean | 254 +-- .../JetAlgebra/Grading/BoostWeight.lean | 3 +- .../JetAlgebra/Invariants.lean | 239 --- .../Invariants/Averages/BoostAverage.lean | 439 ---- .../Averages/BoostAvgProjector.lean | 162 -- ...tAvgProjectorOnDerivativesAndFermions.lean | 1115 ---------- .../BoostAvgProjectorOnMonomials.lean | 311 --- .../BoostAvgProjectorOnPhotonPairs.lean | 355 ---- .../Invariants/Averages/RotationAverage.lean | 1233 ----------- .../Averages/RotationPiBoostAverage.lean | 164 -- .../JetAlgebra/Invariants/Basic.lean | 65 - .../Grading/MassWeightAndHypercharge.lean | 575 ------ .../Invariants/Grading/NeutralSectors.lean | 353 ---- .../JetAlgebra/Invariants/GroupAverage.lean | 170 -- .../Invariants/SpanOfRenormalizableTerms.lean | 1443 ------------- .../Invariants/Subgroups/RotationsPi.lean | 459 ----- .../JetAlgebra/JetDerivLorentz.lean | 247 +++ .../JetAlgebra/LorentzAction.lean | 2 +- .../JetAlgebra/MassDimFour/Basic.lean | 593 ++++++ .../MassDimFour/Classification.lean | 160 ++ .../MassDimFour/LinearIndependence.lean | 499 +++++ 28 files changed, 3744 insertions(+), 7251 deletions(-) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean rename Physlib/Particles/LeptonGaugeSector/JetAlgebra/{Invariants/Subgroups => Grading}/AxisBoosts.lean (53%) delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean index e7a5eda02..53467419f 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.LinearIndependence /-! # The boost weight zero part of the conjugate fermion kinetic bilinears diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean index b219954be..b29562cf8 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.LinearIndependence /-! # The boost weight zero parts of the photon pairs and the fermion kinetic bilinears diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean new file mode 100644 index 000000000..2e7a11591 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean @@ -0,0 +1,1802 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.JetDerivLorentz +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.Closure +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.LinearIndependence +/-! +# The boost weight of the second derivatives of the field strength + +The span of the monomials `∂_ρ ∂_τ F_{μν}` is analysed as the photon pairs are in +`GaugeKineticTerm.BoostWeight`, with one difference: there the two factors of a product carry +the weights and multiplication adds them, here the two derivatives carry the weights and the +light-cone derivative operators shift them. + +*The derivatives are Lorentz vectors.* `JetDerivLorentz` proves +`ρ(Λ) (∂_μ x) = ∑ a, Λ_{aμ} • ∂_a (ρ(Λ) x)` on the bosonic part of the jet algebra, which is +where these monomials live. For the boost along an axis the four derivative directions +diagonalise exactly as the field-strength indices do: the light-cone combinations `∂_0 ∓ ∂_i` +shift the weight by `±2` and the two transverse derivatives leave it alone. Composing the +shifts with the weights of the field strengths themselves gives the weight of every +`∂_a ∂_b F_c` without a separate computation for each. + +## Key results + +- `JetAlgebra.lcp_mem_boostWeight`, `lcn_mem_boostWeight`, `jetDeriv_transverse_mem` : the + light-cone derivatives shift the boost weight of their axis by `±2`, the transverse + derivatives preserve it. +- `JetAlgebra.boostWeight_inter_fieldStrengthDeriv_pair_le` and its `_x`, `_y` partners : along + each axis the boost weight zero part of the span of the monomials `∂_ρ ∂_τ F_{μν}` lies in + the span of sixteen explicit second derivatives. +- `JetAlgebra.boostWeight_inter_fieldStrengthDeriv_pair_full` : the three axes together leave + nothing — the intersection is `⊥`. + +-/ + +@[expose] public section + +set_option linter.unusedSimpArgs false +set_option linter.unusedTactic false + +namespace LeptonGaugeSector +open TensorProduct StandardModel +open scoped minkowskiMatrix PauliMatrix Pointwise +open Matrix MatrixGroups + +namespace JetAlgebra + +private lemma algebraMap_real_complex (t : ℝ) : + (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl + +/-! + +## A. The light-cone derivatives shift the `z`-boost weight + +-/ + +/-- **The light-cone derivative `∂_0 - ∂_z` raises the `z`-boost weight by two.** -/ +lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule 2 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k + 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, + repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] + rw [algebraMap_real_complex, zpow_add₀ ht'] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- **The light-cone derivative `∂_0 + ∂_z` lowers the `z`-boost weight by two.** -/ +lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule 2 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k - 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, + repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] + rw [algebraMap_real_complex, zpow_sub₀ ht'] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- **A transverse derivative leaves the `z`-boost weight alone.** -/ +lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 2) + (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule 2 k) : + jetDeriv (Sum.inr i) x ∈ boostWeightSubmodule 2 k := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] + fin_cases i + · + simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + · + simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + · exact absurd rfl hi + +/-! + +## B. The same shifts along the `x`- and `y`-axes + +-/ + +/-- **The light-cone derivative `∂_0 - ∂_x` raises the `x`-boost weight by two.** -/ +lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule 0 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k + 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, + repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] + rw [algebraMap_real_complex, zpow_add₀ ht'] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- **The light-cone derivative `∂_0 + ∂_x` lowers the `x`-boost weight by two.** -/ +lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule 0 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k - 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, + repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] + rw [algebraMap_real_complex, zpow_sub₀ ht'] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- **A transverse derivative leaves the `x`-boost weight alone.** -/ +lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 0) + (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule 0 k) : + jetDeriv (Sum.inr i) x ∈ boostWeightSubmodule 0 k := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] + fin_cases i + · exact absurd rfl hi + · + simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + · + simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + +/-- **The light-cone derivative `∂_0 - ∂_y` raises the `y`-boost weight by two.** -/ +lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule 1 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k + 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, + repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] + rw [algebraMap_real_complex, zpow_add₀ ht'] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- **The light-cone derivative `∂_0 + ∂_y` lowers the `y`-boost weight by two.** -/ +lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule 1 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k - 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, + repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] + rw [algebraMap_real_complex, zpow_sub₀ ht'] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- **A transverse derivative leaves the `y`-boost weight alone.** -/ +lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 1) + (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule 1 k) : + jetDeriv (Sum.inr i) x ∈ boostWeightSubmodule 1 k := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] + fin_cases i + · + simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + · exact absurd rfl hi + · + simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + +/-! + +## C. The jet derivative on the field strengths + +-/ + +/-- The jet derivative appends a derivative index to a gauge-field generator. -/ +lemma jetDeriv_ofGenerator_dB (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + jetDeriv ν (ofGenerator (JetGenerators.dB s μ)) = + ofGenerator (JetGenerators.dB (s + {ν}) μ) := by + simp only [ofGenerator_B_eq] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero, + BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] + +/-- **The jet derivative of a field-strength derivative is the next field-strength + derivative.** -/ +lemma jetDeriv_fieldStrengthDeriv (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (a b : Fin 1 ⊕ Fin 3) : + jetDeriv ν (fieldStrengthDeriv s a b) = fieldStrengthDeriv (s + {ν}) a b := by + rw [fieldStrengthDeriv_eq_sub, fieldStrengthDeriv_eq_sub, map_sub, + jetDeriv_ofGenerator_dB, jetDeriv_ofGenerator_dB, + show s + {a} + {ν} = s + {ν} + {a} from add_right_comm _ _ _, + show s + {b} + {ν} = s + {ν} + {b} from add_right_comm _ _ _] + +/-! + +## D. The light-cone derivative operators + +Along the axis `i` the four derivative directions regroup into the two light-cone combinations +`∂_0 ∓ ∂_i`, which shift the `i`-boost weight by `±2`, and the two transverse derivatives, which +preserve it. The three axes differ only through the shift lemmas of sections A and B, so the +operators, and everything algebraic about them, are set up once, parametrised by the axis. + +-/ + +/-- The light-cone derivative `∂_0 - ∂_i`, as an operator. -/ +noncomputable def lcp (i : Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i) + +/-- The light-cone derivative `∂_0 + ∂_i`, as an operator. -/ +noncomputable def lcn (i : Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i) + +lemma lcp_apply (i : Fin 3) (x : JetAlgebra) : + lcp i x = jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr i) x := rfl + +lemma lcn_apply (i : Fin 3) (x : JetAlgebra) : + lcn i x = jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr i) x := rfl + +/-- `∂_0 - ∂_i` raises the `i`-boost weight of a bosonic element by two. -/ +lemma lcp_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule i k) : lcp i x ∈ boostWeightSubmodule i (k + 2) := by + fin_cases i + · exact jetDeriv_lightConeX_pos_mem hb hx + · exact jetDeriv_lightConeY_pos_mem hb hx + · exact jetDeriv_lightConeZ_pos_mem hb hx + +/-- `∂_0 + ∂_i` lowers the `i`-boost weight of a bosonic element by two. -/ +lemma lcn_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) + (hx : x ∈ boostWeightSubmodule i k) : lcn i x ∈ boostWeightSubmodule i (k - 2) := by + fin_cases i + · exact jetDeriv_lightConeX_neg_mem hb hx + · exact jetDeriv_lightConeY_neg_mem hb hx + · exact jetDeriv_lightConeZ_neg_mem hb hx + +/-- A transverse derivative preserves the `i`-boost weight of a bosonic element. -/ +lemma jetDeriv_transverse_mem {i j : Fin 3} (hj : j ≠ i) {k : ℤ} {x : JetAlgebra} + (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule i k) : + jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule i k := by + fin_cases i + · exact jetDeriv_transverseX_mem hj hb hx + · exact jetDeriv_transverseY_mem hj hb hx + · exact jetDeriv_transverseZ_mem hj hb hx + +/-- The light-cone operators keep the bosonic part bosonic. -/ +lemma lcp_mem_bosonic {i : Fin 3} {x : JetAlgebra} (hx : x ∈ bosonic) : lcp i x ∈ bosonic := + sub_mem (jetDeriv_mem_bosonic _ hx) (jetDeriv_mem_bosonic _ hx) + +lemma lcn_mem_bosonic {i : Fin 3} {x : JetAlgebra} (hx : x ∈ bosonic) : lcn i x ∈ bosonic := + add_mem (jetDeriv_mem_bosonic _ hx) (jetDeriv_mem_bosonic _ hx) + +/-- A bosonic submodule of pure `i`-boost weight is carried by `∂_0 - ∂_i` to one of weight two + higher. -/ +lemma map_lcp_le {i : Fin 3} {k : ℤ} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) + (hw : P ≤ boostWeightSubmodule i k) : + Submodule.map (lcp i) P ≤ boostWeightSubmodule i (k + 2) := by + rintro y ⟨u, hu, rfl⟩ + exact lcp_mem_boostWeight (hb hu) (hw hu) + +/-- The partner of `map_lcp_le`: `∂_0 + ∂_i` lowers the weight by two. -/ +lemma map_lcn_le {i : Fin 3} {k : ℤ} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) + (hw : P ≤ boostWeightSubmodule i k) : + Submodule.map (lcn i) P ≤ boostWeightSubmodule i (k - 2) := by + rintro y ⟨u, hu, rfl⟩ + exact lcn_mem_boostWeight (hb hu) (hw hu) + +/-- A transverse derivative preserves the `i`-boost weight of a bosonic submodule. -/ +lemma map_jetDeriv_transverse_le {i j : Fin 3} (hj : j ≠ i) {k : ℤ} + {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) (hw : P ≤ boostWeightSubmodule i k) : + Submodule.map (jetDeriv (Sum.inr j)) P ≤ boostWeightSubmodule i k := by + rintro y ⟨u, hu, rfl⟩ + exact jetDeriv_transverse_mem hj (hb hu) (hw hu) + +lemma map_lcp_le_bosonic {i : Fin 3} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) : + Submodule.map (lcp i) P ≤ bosonic := by + rintro y ⟨u, hu, rfl⟩ + exact lcp_mem_bosonic (hb hu) + +lemma map_lcn_le_bosonic {i : Fin 3} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) : + Submodule.map (lcn i) P ≤ bosonic := by + rintro y ⟨u, hu, rfl⟩ + exact lcn_mem_bosonic (hb hu) + +lemma map_jetDeriv_le_bosonic (μ : Fin 1 ⊕ Fin 3) {P : Submodule ℂ JetAlgebra} + (hb : P ≤ bosonic) : Submodule.map (jetDeriv μ) P ≤ bosonic := by + rintro y ⟨u, hu, rfl⟩ + exact jetDeriv_mem_bosonic _ (hb hu) + +/-! + +## E. Every second derivative is a light-cone second derivative + +-/ + +/-- A second-derivative field strength is the second jet derivative of a field strength. -/ +lemma fieldStrengthDeriv_pair_eq_jetDeriv (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {ρ, τ} μ ν = + jetDeriv ρ (jetDeriv τ (fieldStrengthDeriv {} μ ν)) := by + rw [jetDeriv_fieldStrengthDeriv, jetDeriv_fieldStrengthDeriv] + congr 1 + simp only [Multiset.empty_eq_zero, zero_add, Multiset.singleton_add] + exact Multiset.cons_swap ρ τ 0 + +private lemma eq_or_eq_of_ne : ∀ {i t₁ t₂ j : Fin 3}, t₁ ≠ i → t₂ ≠ i → t₁ ≠ t₂ → j ≠ i → + j = t₁ ∨ j = t₂ := by decide + +/-- The four light-cone directions of the axis `i` span the derivatives: every `∂_μ` is a + combination of `∂_0 ∓ ∂_i` and the two transverse derivatives. -/ +lemma jetDeriv_mem_span_lightCone {i t₁ t₂ : Fin 3} (h₁ : t₁ ≠ i) (h₂ : t₂ ≠ i) + (h₁₂ : t₁ ≠ t₂) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv μ x ∈ Submodule.span ℂ + {lcp i x, lcn i x, jetDeriv (Sum.inr t₁) x, jetDeriv (Sum.inr t₂) x} := by + have hp : lcp i x ∈ Submodule.span ℂ + {lcp i x, lcn i x, jetDeriv (Sum.inr t₁) x, jetDeriv (Sum.inr t₂) x} := + Submodule.subset_span (by simp) + have hm : lcn i x ∈ Submodule.span ℂ + {lcp i x, lcn i x, jetDeriv (Sum.inr t₁) x, jetDeriv (Sum.inr t₂) x} := + Submodule.subset_span (by simp) + match μ with + | Sum.inl 0 => + rw [show jetDeriv (Sum.inl 0) x = (2⁻¹ : ℂ) • lcp i x + (2⁻¹ : ℂ) • lcn i x from by + rw [lcp_apply, lcn_apply]; module] + exact add_mem (Submodule.smul_mem _ _ hp) (Submodule.smul_mem _ _ hm) + | Sum.inr j => + by_cases hj : j = i + · subst hj + rw [show jetDeriv (Sum.inr j) x = (-2⁻¹ : ℂ) • lcp j x + (2⁻¹ : ℂ) • lcn j x from by + rw [lcp_apply, lcn_apply]; module] + exact add_mem (Submodule.smul_mem _ _ hp) (Submodule.smul_mem _ _ hm) + · rcases eq_or_eq_of_ne h₁ h₂ h₁₂ hj with rfl | rfl + · exact Submodule.subset_span (by simp) + · exact Submodule.subset_span (by simp) + +/-- The light-cone derivatives commute with every jet derivative. -/ +lemma lcp_jetDeriv_comm (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + lcp i (jetDeriv μ x) = jetDeriv μ (lcp i x) := by + rw [lcp_apply, lcp_apply, map_sub, jetDeriv_comm, jetDeriv_comm (Sum.inr i)] + +lemma lcn_jetDeriv_comm (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + lcn i (jetDeriv μ x) = jetDeriv μ (lcn i x) := by + rw [lcn_apply, lcn_apply, map_add, jetDeriv_comm, jetDeriv_comm (Sum.inr i)] + +/-- The two light-cone derivatives commute with each other. -/ +lemma lcn_lcp_comm (i : Fin 3) (x : JetAlgebra) : lcn i (lcp i x) = lcp i (lcn i x) := by + simp only [lcp_apply, lcn_apply, map_sub, map_add, jetDeriv_comm (Sum.inl 0) (Sum.inr i)] + abel + +/-- One step of the light-cone derivative expansion along the axis `i` with transverse + directions `t₁`, `t₂`: the four derivative directions applied to a submodule. -/ +noncomputable def stepAxis (i t₁ t₂ : Fin 3) (P : Submodule ℂ JetAlgebra) : + Submodule ℂ JetAlgebra := + Submodule.map (lcp i) P ⊔ Submodule.map (lcn i) P ⊔ + Submodule.map (jetDeriv (Sum.inr t₁)) P ⊔ Submodule.map (jetDeriv (Sum.inr t₂)) P + +lemma stepAxis_mono {i t₁ t₂ : Fin 3} {P Q : Submodule ℂ JetAlgebra} (h : P ≤ Q) : + stepAxis i t₁ t₂ P ≤ stepAxis i t₁ t₂ Q := + sup_le_sup (sup_le_sup (sup_le_sup (Submodule.map_mono h) (Submodule.map_mono h)) + (Submodule.map_mono h)) (Submodule.map_mono h) + +/-- Every jet derivative of an element of `P` lies in `stepAxis i t₁ t₂ P`. -/ +lemma jetDeriv_mem_stepAxis {i t₁ t₂ : Fin 3} (h₁ : t₁ ≠ i) (h₂ : t₂ ≠ i) (h₁₂ : t₁ ≠ t₂) + {P : Submodule ℂ JetAlgebra} {x : JetAlgebra} (hx : x ∈ P) (μ : Fin 1 ⊕ Fin 3) : + jetDeriv μ x ∈ stepAxis i t₁ t₂ P := by + refine Submodule.span_le.2 ?_ (jetDeriv_mem_span_lightCone h₁ h₂ h₁₂ μ x) + rintro y (rfl | rfl | rfl | rfl) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left ⟨x, hx, rfl⟩)) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨x, hx, rfl⟩)) + · exact Submodule.mem_sup_left (Submodule.mem_sup_right ⟨x, hx, rfl⟩) + · exact Submodule.mem_sup_right ⟨x, hx, rfl⟩ + +/-! + +## F. The boost weight zero part of the second derivatives + +-/ + +/-- **The boost weight zero part of the second derivatives of the field strength.** An element + of the span of the monomials `∂_ρ ∂_τ F_{μν}` of `z`-boost weight zero is a combination of the + sixteen listed second derivatives: the derivative pair and the field strength each carry a + weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the + converse is not recorded. -/ +lemma boostWeight_inter_fieldStrengthDeriv_pair_le : + boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ + Submodule.span ℂ + {lcp 2 (lcn 2 (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + lcp 2 (lcn 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), + jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), + jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), + jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), + lcp 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + lcp 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1))), + lcp 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + lcp 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1))), + lcn 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + lcn 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1))), + lcn 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + lcn 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)))} := by + set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hPX + set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hPY + set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hMX + set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hMY + set T := fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hT + set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) with hL + obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : + PX ∈ boostWeightSubmodule 2 2 ∧ PY ∈ boostWeightSubmodule 2 2 ∧ + MX ∈ boostWeightSubmodule 2 (-2) ∧ MY ∈ boostWeightSubmodule 2 (-2) ∧ + T ∈ boostWeightSubmodule 2 0 ∧ L ∈ boostWeightSubmodule 2 0 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hPX, hPY, hMX, hMY, hT, hL, map_sub, map_add, boostAxis_two, + repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, + toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + boostMatZ, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + try rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. Every field strength is a combination of the eigenvectors + -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its + -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. + set A := Submodule.span ℂ {PX, PY} with hA + set B := Submodule.span ℂ {T, L} with hB + set C := Submodule.span ℂ {MX, MY} with hC + set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV + have hAle : A ≤ boostWeightSubmodule 2 2 := by + rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) + have hBle : B ≤ boostWeightSubmodule 2 0 := by + rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) + have hCle : C ≤ boostWeightSubmodule 2 (-2) := by + rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) + have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left + have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left + have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right + have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert _ _)) + have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert _ _)) + have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert _ _)) + have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → + x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by + rintro u v x c d hu hv rfl + exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) + have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → + v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → + fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by + intro u v c d μ ν hu hv h + rw [fieldStrengthDeriv_antisymm, h] + exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) + have hVle : V ≤ A ⊔ B ⊔ C := by + rw [hV] + refine Submodule.span_le.2 ?_ + rintro x ⟨μ, ν, rfl⟩ + match μ, ν with + | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 + | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ + | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 2, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 0, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 2, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 1, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 0, Sum.inr 1 => exact hTV + | Sum.inr 1, Sum.inr 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV + | Sum.inl 0, Sum.inr 2 => exact hLV + | Sum.inr 2, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV + set FF : Set JetAlgebra := {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} with hFF + set S : Set JetAlgebra := + {lcp 2 (lcn 2 T), + lcp 2 (lcn 2 L), + (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) T), + (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) L), + (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 1)) T), + (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 1)) L), + (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) T), + (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) L), + lcp 2 ((jetDeriv (Sum.inr 0)) MX), + lcp 2 ((jetDeriv (Sum.inr 0)) MY), + lcp 2 ((jetDeriv (Sum.inr 1)) MX), + lcp 2 ((jetDeriv (Sum.inr 1)) MY), + lcn 2 ((jetDeriv (Sum.inr 0)) PX), + lcn 2 ((jetDeriv (Sum.inr 0)) PY), + lcn 2 ((jetDeriv (Sum.inr 1)) PX), + lcn 2 ((jetDeriv (Sum.inr 1)) PY)} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j with hW + -- the three weight spaces are bosonic + have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => + fieldStrengthDeriv_mem_bosonic _ _ _ + have hAb : A ≤ bosonic := by + rw [hA] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) + · rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) + have hBb : B ≤ bosonic := by + rw [hB] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hT]; exact hFb _ _ + · rw [hL]; exact hFb _ _ + have hCb : C ≤ bosonic := by + rw [hC] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) + · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) + have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → + P ≤ boostWeightSubmodule 2 j → P ≤ W := fun hj hP => + le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) + have bpA : Submodule.map (lcp 2) A ≤ bosonic := map_lcp_le_bosonic hAb + have wpA : Submodule.map (lcp 2) A ≤ + boostWeightSubmodule 2 (2 + 2) := map_lcp_le hAb hAle + have bpB : Submodule.map (lcp 2) B ≤ bosonic := map_lcp_le_bosonic hBb + have wpB : Submodule.map (lcp 2) B ≤ + boostWeightSubmodule 2 (0 + 2) := map_lcp_le hBb hBle + have bpC : Submodule.map (lcp 2) C ≤ bosonic := map_lcp_le_bosonic hCb + have wpC : Submodule.map (lcp 2) C ≤ + boostWeightSubmodule 2 (-2 + 2) := map_lcp_le hCb hCle + have bmA : Submodule.map (lcn 2) A ≤ bosonic := map_lcn_le_bosonic hAb + have wmA : Submodule.map (lcn 2) A ≤ + boostWeightSubmodule 2 (2 - 2) := map_lcn_le hAb hAle + have bmB : Submodule.map (lcn 2) B ≤ bosonic := map_lcn_le_bosonic hBb + have wmB : Submodule.map (lcn 2) B ≤ + boostWeightSubmodule 2 (0 - 2) := map_lcn_le hBb hBle + have bmC : Submodule.map (lcn 2) C ≤ bosonic := map_lcn_le_bosonic hCb + have wmC : Submodule.map (lcn 2) C ≤ + boostWeightSubmodule 2 (-2 - 2) := map_lcn_le hCb hCle + have bxA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hAb + have wxA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ + boostWeightSubmodule 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + have bxB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hBb + have wxB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ + boostWeightSubmodule 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + have bxC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hCb + have wxC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ + boostWeightSubmodule 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + have byA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hAb + have wyA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ + boostWeightSubmodule 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + have byB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hBb + have wyB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ + boostWeightSubmodule 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + have byC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hCb + have wyC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ + boostWeightSubmodule 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + have eppA : Submodule.map (lcp 2) (Submodule.map (lcp 2) A) ≤ W := + hN (by norm_num) (map_lcp_le bpA wpA) + have eppB : Submodule.map (lcp 2) (Submodule.map (lcp 2) B) ≤ W := + hN (by norm_num) (map_lcp_le bpB wpB) + have eppC : Submodule.map (lcp 2) (Submodule.map (lcp 2) C) ≤ W := + hN (by norm_num) (map_lcp_le bpC wpC) + have epmA : Submodule.map (lcp 2) (Submodule.map (lcn 2) A) ≤ W := + hN (by norm_num) (map_lcp_le bmA wmA) + have epmB : Submodule.map (lcp 2) (Submodule.map (lcn 2) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have epmC : Submodule.map (lcp 2) (Submodule.map (lcn 2) C) ≤ W := + hN (by norm_num) (map_lcp_le bmC wmC) + have epxA : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := + hN (by norm_num) (map_lcp_le bxA wxA) + have epxB : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := + hN (by norm_num) (map_lcp_le bxB wxB) + have epxC : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have epyA : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := + hN (by norm_num) (map_lcp_le byA wyA) + have epyB : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := + hN (by norm_num) (map_lcp_le byB wyB) + have epyC : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have empA : Submodule.map (lcn 2) (Submodule.map (lcp 2) A) ≤ W := + hN (by norm_num) (map_lcn_le bpA wpA) + have empB : Submodule.map (lcn 2) (Submodule.map (lcp 2) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [lcn_lcp_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have empC : Submodule.map (lcn 2) (Submodule.map (lcp 2) C) ≤ W := + hN (by norm_num) (map_lcn_le bpC wpC) + have emmA : Submodule.map (lcn 2) (Submodule.map (lcn 2) A) ≤ W := + hN (by norm_num) (map_lcn_le bmA wmA) + have emmB : Submodule.map (lcn 2) (Submodule.map (lcn 2) B) ≤ W := + hN (by norm_num) (map_lcn_le bmB wmB) + have emmC : Submodule.map (lcn 2) (Submodule.map (lcn 2) C) ≤ W := + hN (by norm_num) (map_lcn_le bmC wmC) + have emxA : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have emxB : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := + hN (by norm_num) (map_lcn_le bxB wxB) + have emxC : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := + hN (by norm_num) (map_lcn_le bxC wxC) + have emyA : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have emyB : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := + hN (by norm_num) (map_lcn_le byB wyB) + have emyC : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := + hN (by norm_num) (map_lcn_le byC wyC) + have expA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 2) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) + have expB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 2) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) + have expC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 2) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exmA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 2) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exmB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 2) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) + have exmC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 2) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) + have exxA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) + have exxB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exxC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) + have exyA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) + have exyB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exyC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) + have eypA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 2) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) + have eypB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 2) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) + have eypC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 2) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eymA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 2) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eymB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 2) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) + have eymC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 2) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) + have eyxA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) + have eyxB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [jetDeriv_comm (Sum.inr 1) (Sum.inr 0)] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eyxC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) + have eyyA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) + have eyyB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eyyC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) + -- every monomial is a second light-cone derivative of a field strength + have hFFle : Submodule.span ℂ FF ≤ stepAxis 2 0 1 (stepAxis 2 0 1 V) := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨ρ, τ, μ, ν, rfl⟩ + rw [fieldStrengthDeriv_pair_eq_jetDeriv] + exact jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) + (jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) + (by rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩) τ) ρ + have hmap4 : ∀ (f : JetAlgebra →ₗ[ℂ] JetAlgebra) (P Q R T : Submodule ℂ JetAlgebra), + Submodule.map f P ≤ W → Submodule.map f Q ≤ W → Submodule.map f R ≤ W → + Submodule.map f T ≤ W → Submodule.map f (P ⊔ Q ⊔ R ⊔ T) ≤ W := by + intro f P Q R T h1 h2 h3 h4 + simp only [Submodule.map_sup] + exact sup_le (sup_le (sup_le h1 h2) h3) h4 + have hin3 : ∀ (f g : JetAlgebra →ₗ[ℂ] JetAlgebra), + Submodule.map f (Submodule.map g A) ≤ W → Submodule.map f (Submodule.map g B) ≤ W → + Submodule.map f (Submodule.map g C) ≤ W → + Submodule.map f (Submodule.map g (A ⊔ B ⊔ C)) ≤ W := by + intro f g h1 h2 h3 + simp only [Submodule.map_sup] + exact sup_le (sup_le h1 h2) h3 + have hfin : stepAxis 2 0 1 (stepAxis 2 0 1 (A ⊔ B ⊔ C)) ≤ W := by + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · exact hmap4 _ _ _ _ _ (hin3 _ _ eppA eppB eppC) (hin3 _ _ epmA epmB epmC) + (hin3 _ _ epxA epxB epxC) (hin3 _ _ epyA epyB epyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ empA empB empC) (hin3 _ _ emmA emmB emmC) + (hin3 _ _ emxA emxB emxC) (hin3 _ _ emyA emyB emyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ expA expB expC) (hin3 _ _ exmA exmB exmC) + (hin3 _ _ exxA exxB exxC) (hin3 _ _ exyA exyB exyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ eypA eypB eypC) (hin3 _ _ eymA eymB eymC) + (hin3 _ _ eyxA eyxB eyxC) (hin3 _ _ eyyA eyyB eyyC) + have hkey : Submodule.span ℂ FF ≤ W := + le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) + -- the sixteen generators have weight zero + have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ boostWeightSubmodule 2 j → + y ∈ boostWeightSubmodule 2 0 := by rintro j y rfl h; exact h + have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ + have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ + have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) + have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) + have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) + have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | + rfl | rfl) + exacts [ + hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hTb) + (lcn_mem_boostWeight hTb hTw)), + hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hLb) + (lcn_mem_boostWeight hLb hLw)), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] + refine le_trans (inf_le_inf_left _ hkey) ?_ + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] +/-! + +## G. The boost weight zero part, `x`-direction + +-/ + +/-- **The boost weight zero part of the second derivatives of the field strength.** An element + of the span of the monomials `∂_ρ ∂_τ F_{μν}` of `x`-boost weight zero is a combination of the + sixteen listed second derivatives: the derivative pair and the field strength each carry a + weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the + converse is not recorded. -/ +lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : + boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ + Submodule.span ℂ + {lcp 0 (lcn 0 (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + lcp 0 (lcn 0 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), + jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), + jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), + jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), + lcp 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + lcp 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2))), + lcp 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + lcp 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2))), + lcn 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + lcn 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2))), + lcn 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), + lcn 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)))} := by + set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hPX + set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hPY + set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hMX + set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hMY + set T := fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hT + set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) with hL + obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : + PX ∈ boostWeightSubmodule 0 2 ∧ PY ∈ boostWeightSubmodule 0 2 ∧ + MX ∈ boostWeightSubmodule 0 (-2) ∧ MY ∈ boostWeightSubmodule 0 (-2) ∧ + T ∈ boostWeightSubmodule 0 0 ∧ L ∈ boostWeightSubmodule 0 0 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hPX, hPY, hMX, hMY, hT, hL, map_sub, map_add, boostAxis_zero, + repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, + toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + boostMatX, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + try rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0)] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. Every field strength is a combination of the eigenvectors + -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its + -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. + set A := Submodule.span ℂ {PX, PY} with hA + set B := Submodule.span ℂ {T, L} with hB + set C := Submodule.span ℂ {MX, MY} with hC + set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV + have hAle : A ≤ boostWeightSubmodule 0 2 := by + rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) + have hBle : B ≤ boostWeightSubmodule 0 0 := by + rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) + have hCle : C ≤ boostWeightSubmodule 0 (-2) := by + rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) + have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left + have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left + have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right + have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert _ _)) + have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert _ _)) + have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert _ _)) + have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → + x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by + rintro u v x c d hu hv rfl + exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) + have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → + v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → + fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by + intro u v c d μ ν hu hv h + rw [fieldStrengthDeriv_antisymm, h] + exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) + have hVle : V ≤ A ⊔ B ⊔ C := by + rw [hV] + refine Submodule.span_le.2 ?_ + rintro x ⟨μ, ν, rfl⟩ + match μ, ν with + | Sum.inl 0, Sum.inl 0 | Sum.inr 1, Sum.inr 1 | Sum.inr 2, Sum.inr 2 + | Sum.inr 0, Sum.inr 0 => rw [fieldStrengthDeriv_self]; exact zero_mem _ + | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 0, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 1, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 0, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 2, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 1, Sum.inr 2 => exact hTV + | Sum.inr 2, Sum.inr 1 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV + | Sum.inl 0, Sum.inr 0 => exact hLV + | Sum.inr 0, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV + set FF : Set JetAlgebra := {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} with hFF + set S : Set JetAlgebra := + {lcp 0 (lcn 0 T), + lcp 0 (lcn 0 L), + (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) T), + (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) L), + (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 2)) T), + (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 2)) L), + (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) T), + (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) L), + lcp 0 ((jetDeriv (Sum.inr 1)) MX), + lcp 0 ((jetDeriv (Sum.inr 1)) MY), + lcp 0 ((jetDeriv (Sum.inr 2)) MX), + lcp 0 ((jetDeriv (Sum.inr 2)) MY), + lcn 0 ((jetDeriv (Sum.inr 1)) PX), + lcn 0 ((jetDeriv (Sum.inr 1)) PY), + lcn 0 ((jetDeriv (Sum.inr 2)) PX), + lcn 0 ((jetDeriv (Sum.inr 2)) PY)} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j with hW + -- the three weight spaces are bosonic + have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => + fieldStrengthDeriv_mem_bosonic _ _ _ + have hAb : A ≤ bosonic := by + rw [hA] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) + · rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) + have hBb : B ≤ bosonic := by + rw [hB] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hT]; exact hFb _ _ + · rw [hL]; exact hFb _ _ + have hCb : C ≤ bosonic := by + rw [hC] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) + · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) + have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → + P ≤ boostWeightSubmodule 0 j → P ≤ W := fun hj hP => + le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) + have bpA : Submodule.map (lcp 0) A ≤ bosonic := map_lcp_le_bosonic hAb + have wpA : Submodule.map (lcp 0) A ≤ + boostWeightSubmodule 0 (2 + 2) := map_lcp_le hAb hAle + have bpB : Submodule.map (lcp 0) B ≤ bosonic := map_lcp_le_bosonic hBb + have wpB : Submodule.map (lcp 0) B ≤ + boostWeightSubmodule 0 (0 + 2) := map_lcp_le hBb hBle + have bpC : Submodule.map (lcp 0) C ≤ bosonic := map_lcp_le_bosonic hCb + have wpC : Submodule.map (lcp 0) C ≤ + boostWeightSubmodule 0 (-2 + 2) := map_lcp_le hCb hCle + have bmA : Submodule.map (lcn 0) A ≤ bosonic := map_lcn_le_bosonic hAb + have wmA : Submodule.map (lcn 0) A ≤ + boostWeightSubmodule 0 (2 - 2) := map_lcn_le hAb hAle + have bmB : Submodule.map (lcn 0) B ≤ bosonic := map_lcn_le_bosonic hBb + have wmB : Submodule.map (lcn 0) B ≤ + boostWeightSubmodule 0 (0 - 2) := map_lcn_le hBb hBle + have bmC : Submodule.map (lcn 0) C ≤ bosonic := map_lcn_le_bosonic hCb + have wmC : Submodule.map (lcn 0) C ≤ + boostWeightSubmodule 0 (-2 - 2) := map_lcn_le hCb hCle + have bxA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hAb + have wxA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ + boostWeightSubmodule 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + have bxB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hBb + have wxB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ + boostWeightSubmodule 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + have bxC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hCb + have wxC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ + boostWeightSubmodule 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + have byA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hAb + have wyA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ + boostWeightSubmodule 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + have byB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hBb + have wyB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ + boostWeightSubmodule 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + have byC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hCb + have wyC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ + boostWeightSubmodule 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + have eppA : Submodule.map (lcp 0) (Submodule.map (lcp 0) A) ≤ W := + hN (by norm_num) (map_lcp_le bpA wpA) + have eppB : Submodule.map (lcp 0) (Submodule.map (lcp 0) B) ≤ W := + hN (by norm_num) (map_lcp_le bpB wpB) + have eppC : Submodule.map (lcp 0) (Submodule.map (lcp 0) C) ≤ W := + hN (by norm_num) (map_lcp_le bpC wpC) + have epmA : Submodule.map (lcp 0) (Submodule.map (lcn 0) A) ≤ W := + hN (by norm_num) (map_lcp_le bmA wmA) + have epmB : Submodule.map (lcp 0) (Submodule.map (lcn 0) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have epmC : Submodule.map (lcp 0) (Submodule.map (lcn 0) C) ≤ W := + hN (by norm_num) (map_lcp_le bmC wmC) + have epxA : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := + hN (by norm_num) (map_lcp_le bxA wxA) + have epxB : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := + hN (by norm_num) (map_lcp_le bxB wxB) + have epxC : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have epyA : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := + hN (by norm_num) (map_lcp_le byA wyA) + have epyB : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := + hN (by norm_num) (map_lcp_le byB wyB) + have epyC : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have empA : Submodule.map (lcn 0) (Submodule.map (lcp 0) A) ≤ W := + hN (by norm_num) (map_lcn_le bpA wpA) + have empB : Submodule.map (lcn 0) (Submodule.map (lcp 0) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [lcn_lcp_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have empC : Submodule.map (lcn 0) (Submodule.map (lcp 0) C) ≤ W := + hN (by norm_num) (map_lcn_le bpC wpC) + have emmA : Submodule.map (lcn 0) (Submodule.map (lcn 0) A) ≤ W := + hN (by norm_num) (map_lcn_le bmA wmA) + have emmB : Submodule.map (lcn 0) (Submodule.map (lcn 0) B) ≤ W := + hN (by norm_num) (map_lcn_le bmB wmB) + have emmC : Submodule.map (lcn 0) (Submodule.map (lcn 0) C) ≤ W := + hN (by norm_num) (map_lcn_le bmC wmC) + have emxA : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have emxB : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := + hN (by norm_num) (map_lcn_le bxB wxB) + have emxC : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := + hN (by norm_num) (map_lcn_le bxC wxC) + have emyA : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have emyB : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := + hN (by norm_num) (map_lcn_le byB wyB) + have emyC : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := + hN (by norm_num) (map_lcn_le byC wyC) + have expA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 0) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) + have expB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 0) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) + have expC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 0) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exmA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 0) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exmB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 0) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) + have exmC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 0) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) + have exxA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) + have exxB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exxC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) + have exyA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) + have exyB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exyC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) + have eypA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 0) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) + have eypB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 0) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) + have eypC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 0) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eymA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 0) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eymB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 0) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) + have eymC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 0) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) + have eyxA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) + have eyxB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [jetDeriv_comm (Sum.inr 2) (Sum.inr 1)] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eyxC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) + have eyyA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) + have eyyB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eyyC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) + -- every monomial is a second light-cone derivative of a field strength + have hFFle : Submodule.span ℂ FF ≤ stepAxis 0 1 2 (stepAxis 0 1 2 V) := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨ρ, τ, μ, ν, rfl⟩ + rw [fieldStrengthDeriv_pair_eq_jetDeriv] + exact jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) + (jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) + (by rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩) τ) ρ + have hmap4 : ∀ (f : JetAlgebra →ₗ[ℂ] JetAlgebra) (P Q R T : Submodule ℂ JetAlgebra), + Submodule.map f P ≤ W → Submodule.map f Q ≤ W → Submodule.map f R ≤ W → + Submodule.map f T ≤ W → Submodule.map f (P ⊔ Q ⊔ R ⊔ T) ≤ W := by + intro f P Q R T h1 h2 h3 h4 + simp only [Submodule.map_sup] + exact sup_le (sup_le (sup_le h1 h2) h3) h4 + have hin3 : ∀ (f g : JetAlgebra →ₗ[ℂ] JetAlgebra), + Submodule.map f (Submodule.map g A) ≤ W → Submodule.map f (Submodule.map g B) ≤ W → + Submodule.map f (Submodule.map g C) ≤ W → + Submodule.map f (Submodule.map g (A ⊔ B ⊔ C)) ≤ W := by + intro f g h1 h2 h3 + simp only [Submodule.map_sup] + exact sup_le (sup_le h1 h2) h3 + have hfin : stepAxis 0 1 2 (stepAxis 0 1 2 (A ⊔ B ⊔ C)) ≤ W := by + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · exact hmap4 _ _ _ _ _ (hin3 _ _ eppA eppB eppC) (hin3 _ _ epmA epmB epmC) + (hin3 _ _ epxA epxB epxC) (hin3 _ _ epyA epyB epyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ empA empB empC) (hin3 _ _ emmA emmB emmC) + (hin3 _ _ emxA emxB emxC) (hin3 _ _ emyA emyB emyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ expA expB expC) (hin3 _ _ exmA exmB exmC) + (hin3 _ _ exxA exxB exxC) (hin3 _ _ exyA exyB exyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ eypA eypB eypC) (hin3 _ _ eymA eymB eymC) + (hin3 _ _ eyxA eyxB eyxC) (hin3 _ _ eyyA eyyB eyyC) + have hkey : Submodule.span ℂ FF ≤ W := + le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) + -- the sixteen generators have weight zero + have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ boostWeightSubmodule 0 j → + y ∈ boostWeightSubmodule 0 0 := by rintro j y rfl h; exact h + have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ + have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ + have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) + have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) + have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) + have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | + rfl | rfl) + exacts [ + hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hTb) + (lcn_mem_boostWeight hTb hTw)), + hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hLb) + (lcn_mem_boostWeight hLb hLw)), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] + refine le_trans (inf_le_inf_left _ hkey) ?_ + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] +/-! + +## H. The boost weight zero part, `y`-direction + +-/ + +/-- **The boost weight zero part of the second derivatives of the field strength.** An element + of the span of the monomials `∂_ρ ∂_τ F_{μν}` of `y`-boost weight zero is a combination of the + sixteen listed second derivatives: the derivative pair and the field strength each carry a + weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the + converse is not recorded. -/ +lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : + boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ + Submodule.span ℂ + {lcp 1 (lcn 1 (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + lcp 1 (lcn 1 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), + jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), + jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), + jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), + jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), + lcp 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + lcp 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0))), + lcp 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + lcp 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0))), + lcn 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + lcn 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0))), + lcn 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), + lcn 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)))} := by + set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hPX + set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hPY + set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hMX + set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hMY + set T := fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hT + set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) with hL + obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : + PX ∈ boostWeightSubmodule 1 2 ∧ PY ∈ boostWeightSubmodule 1 2 ∧ + MX ∈ boostWeightSubmodule 1 (-2) ∧ MY ∈ boostWeightSubmodule 1 (-2) ∧ + T ∈ boostWeightSubmodule 1 0 ∧ L ∈ boostWeightSubmodule 1 0 := by + refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht + all_goals + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [hPX, hPY, hMX, hMY, hT, hL, map_sub, map_add, boostAxis_one, + repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, + toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, + boostMatY, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + try rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = + -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1)] + push_cast + match_scalars <;> (field_simp; try ring) + -- ### B. Every field strength is a combination of the eigenvectors + -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its + -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. + set A := Submodule.span ℂ {PX, PY} with hA + set B := Submodule.span ℂ {T, L} with hB + set C := Submodule.span ℂ {MX, MY} with hC + set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV + have hAle : A ≤ boostWeightSubmodule 1 2 := by + rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) + have hBle : B ≤ boostWeightSubmodule 1 0 := by + rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) + have hCle : C ≤ boostWeightSubmodule 1 (-2) := by + rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) + have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left + have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left + have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right + have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert _ _)) + have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert _ _)) + have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert _ _)) + have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) + have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → + x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by + rintro u v x c d hu hv rfl + exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) + have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → + v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → + fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by + intro u v c d μ ν hu hv h + rw [fieldStrengthDeriv_antisymm, h] + exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) + have hVle : V ≤ A ⊔ B ⊔ C := by + rw [hV] + refine Submodule.span_le.2 ?_ + rintro x ⟨μ, ν, rfl⟩ + match μ, ν with + | Sum.inl 0, Sum.inl 0 | Sum.inr 2, Sum.inr 2 | Sum.inr 0, Sum.inr 0 + | Sum.inr 1, Sum.inr 1 => rw [fieldStrengthDeriv_self]; exact zero_mem _ + | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 1, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 2, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) + | Sum.inr 1, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 0, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) + | Sum.inr 2, Sum.inr 0 => exact hTV + | Sum.inr 0, Sum.inr 2 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV + | Sum.inl 0, Sum.inr 1 => exact hLV + | Sum.inr 1, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV + set FF : Set JetAlgebra := {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} with hFF + set S : Set JetAlgebra := + {lcp 1 (lcn 1 T), + lcp 1 (lcn 1 L), + (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) T), + (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) L), + (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 0)) T), + (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 0)) L), + (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) T), + (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) L), + lcp 1 ((jetDeriv (Sum.inr 2)) MX), + lcp 1 ((jetDeriv (Sum.inr 2)) MY), + lcp 1 ((jetDeriv (Sum.inr 0)) MX), + lcp 1 ((jetDeriv (Sum.inr 0)) MY), + lcn 1 ((jetDeriv (Sum.inr 2)) PX), + lcn 1 ((jetDeriv (Sum.inr 2)) PY), + lcn 1 ((jetDeriv (Sum.inr 0)) PX), + lcn 1 ((jetDeriv (Sum.inr 0)) PY)} with hS + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j with hW + -- the three weight spaces are bosonic + have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => + fieldStrengthDeriv_mem_bosonic _ _ _ + have hAb : A ≤ bosonic := by + rw [hA] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) + · rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) + have hBb : B ≤ bosonic := by + rw [hB] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hT]; exact hFb _ _ + · rw [hL]; exact hFb _ _ + have hCb : C ≤ bosonic := by + rw [hC] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl) + · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) + · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) + have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → + P ≤ boostWeightSubmodule 1 j → P ≤ W := fun hj hP => + le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) + have bpA : Submodule.map (lcp 1) A ≤ bosonic := map_lcp_le_bosonic hAb + have wpA : Submodule.map (lcp 1) A ≤ + boostWeightSubmodule 1 (2 + 2) := map_lcp_le hAb hAle + have bpB : Submodule.map (lcp 1) B ≤ bosonic := map_lcp_le_bosonic hBb + have wpB : Submodule.map (lcp 1) B ≤ + boostWeightSubmodule 1 (0 + 2) := map_lcp_le hBb hBle + have bpC : Submodule.map (lcp 1) C ≤ bosonic := map_lcp_le_bosonic hCb + have wpC : Submodule.map (lcp 1) C ≤ + boostWeightSubmodule 1 (-2 + 2) := map_lcp_le hCb hCle + have bmA : Submodule.map (lcn 1) A ≤ bosonic := map_lcn_le_bosonic hAb + have wmA : Submodule.map (lcn 1) A ≤ + boostWeightSubmodule 1 (2 - 2) := map_lcn_le hAb hAle + have bmB : Submodule.map (lcn 1) B ≤ bosonic := map_lcn_le_bosonic hBb + have wmB : Submodule.map (lcn 1) B ≤ + boostWeightSubmodule 1 (0 - 2) := map_lcn_le hBb hBle + have bmC : Submodule.map (lcn 1) C ≤ bosonic := map_lcn_le_bosonic hCb + have wmC : Submodule.map (lcn 1) C ≤ + boostWeightSubmodule 1 (-2 - 2) := map_lcn_le hCb hCle + have bxA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hAb + have wxA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ + boostWeightSubmodule 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + have bxB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hBb + have wxB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ + boostWeightSubmodule 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + have bxC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hCb + have wxC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ + boostWeightSubmodule 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + have byA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hAb + have wyA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ + boostWeightSubmodule 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + have byB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hBb + have wyB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ + boostWeightSubmodule 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + have byC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hCb + have wyC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ + boostWeightSubmodule 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + have eppA : Submodule.map (lcp 1) (Submodule.map (lcp 1) A) ≤ W := + hN (by norm_num) (map_lcp_le bpA wpA) + have eppB : Submodule.map (lcp 1) (Submodule.map (lcp 1) B) ≤ W := + hN (by norm_num) (map_lcp_le bpB wpB) + have eppC : Submodule.map (lcp 1) (Submodule.map (lcp 1) C) ≤ W := + hN (by norm_num) (map_lcp_le bpC wpC) + have epmA : Submodule.map (lcp 1) (Submodule.map (lcn 1) A) ≤ W := + hN (by norm_num) (map_lcp_le bmA wmA) + have epmB : Submodule.map (lcp 1) (Submodule.map (lcn 1) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have epmC : Submodule.map (lcp 1) (Submodule.map (lcn 1) C) ≤ W := + hN (by norm_num) (map_lcp_le bmC wmC) + have epxA : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := + hN (by norm_num) (map_lcp_le bxA wxA) + have epxB : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := + hN (by norm_num) (map_lcp_le bxB wxB) + have epxC : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have epyA : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := + hN (by norm_num) (map_lcp_le byA wyA) + have epyB : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := + hN (by norm_num) (map_lcp_le byB wyB) + have epyC : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have empA : Submodule.map (lcn 1) (Submodule.map (lcp 1) A) ≤ W := + hN (by norm_num) (map_lcn_le bpA wpA) + have empB : Submodule.map (lcn 1) (Submodule.map (lcp 1) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [lcn_lcp_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have empC : Submodule.map (lcn 1) (Submodule.map (lcp 1) C) ≤ W := + hN (by norm_num) (map_lcn_le bpC wpC) + have emmA : Submodule.map (lcn 1) (Submodule.map (lcn 1) A) ≤ W := + hN (by norm_num) (map_lcn_le bmA wmA) + have emmB : Submodule.map (lcn 1) (Submodule.map (lcn 1) B) ≤ W := + hN (by norm_num) (map_lcn_le bmB wmB) + have emmC : Submodule.map (lcn 1) (Submodule.map (lcn 1) C) ≤ W := + hN (by norm_num) (map_lcn_le bmC wmC) + have emxA : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have emxB : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := + hN (by norm_num) (map_lcn_le bxB wxB) + have emxC : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := + hN (by norm_num) (map_lcn_le bxC wxC) + have emyA : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have emyB : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := + hN (by norm_num) (map_lcn_le byB wyB) + have emyC : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := + hN (by norm_num) (map_lcn_le byC wyC) + have expA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 1) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) + have expB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 1) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) + have expC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 1) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exmA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 1) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exmB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 1) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) + have exmC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 1) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) + have exxA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) + have exxB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exxC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) + have exyA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) + have exyB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have exyC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) + have eypA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 1) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) + have eypB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 1) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) + have eypC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 1) C) ≤ W := by + simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eymA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 1) A) ≤ W := by + simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eymB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 1) B) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) + have eymC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 1) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) + have eyxA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) + have eyxB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> rw [jetDeriv_comm (Sum.inr 0) (Sum.inr 2)] <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eyxC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) + have eyyA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) + have eyyB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by + simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] + refine le_trans (Submodule.span_le.2 ?_) le_sup_left + rintro y (rfl | rfl) <;> exact Submodule.subset_span (by + simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, + eq_self_iff_true]) + have eyyC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := + hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) + -- every monomial is a second light-cone derivative of a field strength + have hFFle : Submodule.span ℂ FF ≤ stepAxis 1 2 0 (stepAxis 1 2 0 V) := by + rw [hFF] + refine Submodule.span_le.2 ?_ + rintro x ⟨ρ, τ, μ, ν, rfl⟩ + rw [fieldStrengthDeriv_pair_eq_jetDeriv] + exact jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) + (jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) + (by rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩) τ) ρ + have hmap4 : ∀ (f : JetAlgebra →ₗ[ℂ] JetAlgebra) (P Q R T : Submodule ℂ JetAlgebra), + Submodule.map f P ≤ W → Submodule.map f Q ≤ W → Submodule.map f R ≤ W → + Submodule.map f T ≤ W → Submodule.map f (P ⊔ Q ⊔ R ⊔ T) ≤ W := by + intro f P Q R T h1 h2 h3 h4 + simp only [Submodule.map_sup] + exact sup_le (sup_le (sup_le h1 h2) h3) h4 + have hin3 : ∀ (f g : JetAlgebra →ₗ[ℂ] JetAlgebra), + Submodule.map f (Submodule.map g A) ≤ W → Submodule.map f (Submodule.map g B) ≤ W → + Submodule.map f (Submodule.map g C) ≤ W → + Submodule.map f (Submodule.map g (A ⊔ B ⊔ C)) ≤ W := by + intro f g h1 h2 h3 + simp only [Submodule.map_sup] + exact sup_le (sup_le h1 h2) h3 + have hfin : stepAxis 1 2 0 (stepAxis 1 2 0 (A ⊔ B ⊔ C)) ≤ W := by + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · exact hmap4 _ _ _ _ _ (hin3 _ _ eppA eppB eppC) (hin3 _ _ epmA epmB epmC) + (hin3 _ _ epxA epxB epxC) (hin3 _ _ epyA epyB epyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ empA empB empC) (hin3 _ _ emmA emmB emmC) + (hin3 _ _ emxA emxB emxC) (hin3 _ _ emyA emyB emyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ expA expB expC) (hin3 _ _ exmA exmB exmC) + (hin3 _ _ exxA exxB exxC) (hin3 _ _ exyA exyB exyC) + · exact hmap4 _ _ _ _ _ (hin3 _ _ eypA eypB eypC) (hin3 _ _ eymA eymB eymC) + (hin3 _ _ eyxA eyxB eyxC) (hin3 _ _ eyyA eyyB eyyC) + have hkey : Submodule.span ℂ FF ≤ W := + le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) + -- the sixteen generators have weight zero + have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ boostWeightSubmodule 1 j → + y ∈ boostWeightSubmodule 1 0 := by rintro j y rfl h; exact h + have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ + have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ + have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) + have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) + have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) + have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) + have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + rw [hS] + refine Submodule.span_le.2 ?_ + rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | + rfl | rfl) + exacts [ + hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hTb) + (lcn_mem_boostWeight hTb hTw)), + hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hLb) + (lcn_mem_boostWeight hLb hLw)), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), + jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), + hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), + hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] + refine le_trans (inf_le_inf_left _ hkey) ?_ + rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] +/-! + +## I. The Bianchi identity and the three-axis intersection + +-/ + +/-- **The Bianchi identity.** -/ +lemma jetDeriv_fieldStrengthDeriv_bianchi (ρ μ ν : Fin 1 ⊕ Fin 3) : + jetDeriv ρ (fieldStrengthDeriv {} μ ν) = + jetDeriv μ (fieldStrengthDeriv {} ρ ν) - jetDeriv ν (fieldStrengthDeriv {} ρ μ) := by + simp only [fieldStrengthDeriv_eq_sub, map_sub, jetDeriv_ofGenerator_dB, + Multiset.empty_eq_zero, zero_add] + rw [add_comm ({μ} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, + add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {μ}] + abel + +lemma lcn_T_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = + jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) - + jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) := by + simp only [lcn_apply, map_add] + rw [jetDeriv_fieldStrengthDeriv_bianchi (Sum.inl 0) (Sum.inr 0) (Sum.inr 1), + jetDeriv_fieldStrengthDeriv_bianchi (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] + abel + +lemma lcn_PX_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) = + (2 : ℂ) • jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + lcp 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) := by + simp only [lcn_apply, lcp_apply, map_add, map_sub] + rw [jetDeriv_fieldStrengthDeriv_bianchi (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] + simp only [map_neg] + module + +lemma lcn_PY_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) = + (2 : ℂ) • jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + + lcp 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) := by + simp only [lcn_apply, lcp_apply, map_add, map_sub] + rw [jetDeriv_fieldStrengthDeriv_bianchi (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), + fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] + simp only [map_neg] + module + +theorem boostWeight_inter_fieldStrengthDeriv_pair_full : + boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ boostWeightSubmodule 2 0 ⊓ + Submodule.span ℂ {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} = ⊥ := by + refine le_antisymm (fun x hx => ?_) bot_le + rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx + obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx + have hz := boostWeight_inter_fieldStrengthDeriv_pair_le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) + have hbx := boostWeight_inter_fieldStrengthDeriv_pair_x_le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) + have hby := boostWeight_inter_fieldStrengthDeriv_pair_y_le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) + have hann : ∀ (φ : JetAlgebra →ₗ[ℂ] ℂ) {T : Set JetAlgebra}, (∀ s ∈ T, φ s = 0) → + ∀ y ∈ Submodule.span ℂ T, φ y = 0 := by + intro φ T hT y hy + induction hy using Submodule.span_induction with + | mem s hs => exact hT s hs + | zero => simp + | add u v _ _ hu hv => rw [map_add, hu, hv, add_zero] + | smul c u _ hu => rw [map_smul, hu, smul_zero] + obtain ⟨e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11⟩ : + gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inl 0}, Sum.inr 2) x = 0 ∧ + gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 0}, Sum.inr 0) x = 0 ∧ + gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 0}, Sum.inr 1) x = 0 ∧ + gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 1}, Sum.inr 0) x = 0 ∧ + gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 1}, Sum.inr 1) x = 0 ∧ + gaugeDerivDual ({Sum.inl 0, Sum.inr 0, Sum.inr 0}, Sum.inr 2) x = 0 ∧ + gaugeDerivDual ({Sum.inl 0, Sum.inr 0, Sum.inr 1}, Sum.inr 2) x = 0 ∧ + gaugeDerivDual ({Sum.inl 0, Sum.inr 1, Sum.inr 1}, Sum.inr 2) x = 0 ∧ + gaugeDerivDual ({Sum.inr 0, Sum.inr 0, Sum.inr 0}, Sum.inr 1) x = 0 ∧ + gaugeDerivDual ({Sum.inr 0, Sum.inr 1, Sum.inr 1}, Sum.inr 1) x = 0 ∧ + (gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 1}, Sum.inr 1) + + gaugeDerivDual ({Sum.inr 0, Sum.inr 0, Sum.inr 1}, Sum.inr 1)) x = 0 := by + refine ⟨hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hby, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx⟩ <;> + intro s hs <;> + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> + rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> + simp +decide only [lcp_apply, lcn_apply, map_add, map_sub, + LinearMap.add_apply, ← fieldStrengthDeriv_pair_eq_jetDeriv, + gaugeDerivDual_fieldStrengthDeriv, fsDerivCoeff, add_zero, zero_add, sub_zero, + zero_sub, sub_self, add_neg_cancel, neg_add_cancel] + rw [Submodule.mem_bot] + obtain ⟨a1, y1, hy1, rfl⟩ := Submodule.mem_span_insert.1 hz + obtain ⟨a2, y2, hy2, rfl⟩ := Submodule.mem_span_insert.1 hy1 + obtain ⟨a3, y3, hy3, rfl⟩ := Submodule.mem_span_insert.1 hy2 + obtain ⟨a4, y4, hy4, rfl⟩ := Submodule.mem_span_insert.1 hy3 + obtain ⟨a5, y5, hy5, rfl⟩ := Submodule.mem_span_insert.1 hy4 + obtain ⟨a6, y6, hy6, rfl⟩ := Submodule.mem_span_insert.1 hy5 + obtain ⟨a7, y7, hy7, rfl⟩ := Submodule.mem_span_insert.1 hy6 + obtain ⟨a8, y8, hy8, rfl⟩ := Submodule.mem_span_insert.1 hy7 + obtain ⟨a9, y9, hy9, rfl⟩ := Submodule.mem_span_insert.1 hy8 + obtain ⟨a10, y10, hy10, rfl⟩ := Submodule.mem_span_insert.1 hy9 + obtain ⟨a11, y11, hy11, rfl⟩ := Submodule.mem_span_insert.1 hy10 + obtain ⟨a12, y12, hy12, rfl⟩ := Submodule.mem_span_insert.1 hy11 + obtain ⟨a13, y13, hy13, rfl⟩ := Submodule.mem_span_insert.1 hy12 + obtain ⟨a14, y14, hy14, rfl⟩ := Submodule.mem_span_insert.1 hy13 + obtain ⟨a15, y15, hy15, rfl⟩ := Submodule.mem_span_insert.1 hy14 + obtain ⟨a16, rfl⟩ := Submodule.mem_span_singleton.1 hy15 + simp +decide only [map_add, map_smul, smul_eq_mul, LinearMap.add_apply, lcp_apply, + lcn_apply, map_sub, ← fieldStrengthDeriv_pair_eq_jetDeriv, + gaugeDerivDual_fieldStrengthDeriv, fsDerivCoeff, if_true, if_false, mul_zero, mul_one, + add_zero, zero_add, sub_zero, zero_sub, sub_self] at e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 + ring_nf at e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 + simp only [lcp_jetDeriv_comm, lcn_jetDeriv_comm] + simp only [lcn_T_eq, lcn_PX_eq, lcn_PY_eq] + simp only [map_add, map_sub, map_smul, lcp_jetDeriv_comm, lcn_jetDeriv_comm, + jetDeriv_comm (Sum.inr 1) (Sum.inr 0)] + match_scalars + · linear_combination e3 + · linear_combination e3 + · linear_combination e4 + · linear_combination e4 + · linear_combination e1 + · linear_combination e9 + · linear_combination e6 + e2 + · linear_combination e11 - e5 + · linear_combination e7 + e3 + e4 + · linear_combination e10 + · linear_combination e8 + e5 + · linear_combination e2 + · linear_combination e2 + · linear_combination e5 + · linear_combination e5 + +end JetAlgebra + +end LeptonGaugeSector + + + + + + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean new file mode 100644 index 000000000..d6f9fbf84 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction +/-! +# The second derivatives of the field strength span a subrepresentation + +The span of the monomials `∂_ρ ∂_τ F_{μν}` is carried to itself by both group actions on the jet +algebra. Statements proved for the span may therefore be combined with any operator built from +the group elements, an average or a projector among them, without leaving the span. + +*Both closures are the covariance of the field strength.* Under the Lorentz group each of the +four indices of `∂_ρ ∂_τ F_{μν}` is rotated into the others and nothing else +(`repLorentzGroup_fieldStrengthDeriv_pair`). Under the gauge group the field strength and its +derivatives are fixed outright (`repJetGaugeGroupI_fieldStrengthDeriv`), so the span is fixed +pointwise. + +## Key results + +- `JetAlgebra.repLorentzGroup_mem_span_fieldStrengthDeriv_pair` : the span is closed under the + Lorentz action, and `map_repLorentzGroup_span_fieldStrengthDeriv_pair` states this as an + equality of submodules. +- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair` : the gauge group + fixes the span pointwise, whence `map_repJetGaugeGroupI_span_fieldStrengthDeriv_pair`. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +/-! + +## A. The generators + +-/ + +/-- A second derivative of a field strength lies in their span. -/ +lemma fieldStrengthDeriv_pair_mem_span (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {ρ, τ} μ ν ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := + Submodule.subset_span ⟨ρ, τ, μ, ν, rfl⟩ + +/-- The Lorentz action carries a second derivative of a field strength into their span: each of + the four indices is rotated into the others. -/ +lemma repLorentzGroup_fieldStrengthDeriv_pair_mem_span (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by + rw [repLorentzGroup_fieldStrengthDeriv_pair] + exact Submodule.sum_mem _ fun r _ => Submodule.sum_mem _ fun s _ => + Submodule.sum_mem _ fun a _ => Submodule.sum_mem _ fun b _ => + Submodule.smul_mem _ _ (fieldStrengthDeriv_pair_mem_span r s a b) + +/-! + +## B. Closure under the Lorentz group + +-/ + +/-- **The span of the second derivatives of the field strength is closed under the Lorentz + action.** -/ +lemma repLorentzGroup_mem_span_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : + repLorentzGroup Λ x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨ρ, τ, μ, ν, rfl⟩ := hy + exact repLorentzGroup_fieldStrengthDeriv_pair_mem_span Λ ρ τ μ ν + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv + | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu + +/-- **The span of the second derivatives of the field strength is a subrepresentation of the + Lorentz group.** -/ +lemma map_repLorentzGroup_span_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) : + Submodule.map (repLorentzGroup Λ) + (Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) = + Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repLorentzGroup_mem_span_fieldStrengthDeriv_pair Λ hu + · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_fieldStrengthDeriv_pair Λ⁻¹ hx, + repLorentzGroup.self_inv_apply Λ x⟩ + +/-! + +## C. Closure under the gauge group + +-/ + +/-- **The gauge group fixes the span of the second derivatives of the field strength + pointwise.** -/ +lemma repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair (U : JetGaugeGroupI) + {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : + repJetGaugeGroupI U x = x := by + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨ρ, τ, μ, ν, rfl⟩ := hy + exact repJetGaugeGroupI_fieldStrengthDeriv U {ρ, τ} μ ν + | zero => rw [map_zero] + | add u v _ _ hu hv => rw [map_add, hu, hv] + | smul c u _ hu => rw [map_smul, hu] + +/-- **The span of the second derivatives of the field strength is closed under the gauge + action.** -/ +lemma repJetGaugeGroupI_mem_span_fieldStrengthDeriv_pair (U : JetGaugeGroupI) {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : + repJetGaugeGroupI U x ∈ + Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by + rw [repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair U hx] + exact hx + +/-- **The span of the second derivatives of the field strength is a subrepresentation of the + gauge group.** -/ +lemma map_repJetGaugeGroupI_span_fieldStrengthDeriv_pair (U : JetGaugeGroupI) : + Submodule.map (repJetGaugeGroupI U) + (Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) = + Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by + refine le_antisymm ?_ fun x hx => ?_ + · rintro x ⟨u, hu, rfl⟩ + exact repJetGaugeGroupI_mem_span_fieldStrengthDeriv_pair U hu + · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair U hx⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean new file mode 100644 index 000000000..9a07e44eb --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean @@ -0,0 +1,58 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.BoostWeight +/-! +# The invariant second derivatives of the field strength + +An invariant element of the span of the monomials `∂_ρ ∂_τ F_{μν}` is zero: the gauge sector has +no Lorentz invariant linear in the field strength. A scalar built from `∂_ρ ∂_τ F_{μν}` would +have to contract the symmetric derivative pair with the antisymmetric index pair of the field +strength, and that contraction vanishes. + +Only one implication of `boostWeight_inter_fieldStrengthDeriv_pair_full` is used, and only +through the boosts: an invariant element has boost weight zero along each of the three axes +(`mem_boostWeightSubmodule_zero_of_isInvariant`), which is already enough to force it to vanish. + +## Key results + +- `JetAlgebra.eq_zero_of_isInvariant_of_mem_span_fieldStrengthDeriv_pair` : an invariant second + derivative of the field strength is zero. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## The key theorem + +-/ + +/-- **There is no invariant second derivative of the field strength.** An invariant element of + the span of the monomials `∂_ρ ∂_τ F_{μν}` is zero. -/ +lemma eq_zero_of_isInvariant_of_mem_span_fieldStrengthDeriv_pair {x : JetAlgebra} + (hx : IsInvariant x) + (ht : x ∈ Submodule.span ℂ {y | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : + x = 0 := by + have hb : x ∈ (⊥ : Submodule ℂ JetAlgebra) := by + rw [← boostWeight_inter_fieldStrengthDeriv_pair_full] + exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, + mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ + simpa using hb + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean new file mode 100644 index 000000000..dc42d6686 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.LinearIndependence +/-! +# A dual family for the second derivatives of the field strength + +The monomials `∂_ρ ∂_τ F_{μν}` are not linearly independent — the Bianchi identity +`∂_ρ F_{μν} + ∂_μ F_{νρ} + ∂_ν F_{ρμ} = 0` holds identically, `F` being built from `B` — but the +coefficients of a combination of them, read in the gauge-field generators `∂_s B_μ`, can still +be extracted one by one. This file constructs the functionals that extract them. + +*The construction is the first polarization.* A field-strength derivative is linear, not +quadratic, in the gauge-field generators, so where `GaugeKineticTerm.LinearIndependence` needs a +second difference of `symEval` this file needs only the first: `symEval φ - symEval 0` is linear, +kills the constants and sends a degree-one monomial `ι v` to `φ v`. Tensored with the +augmentation of the lepton factor it gives `gaugeDerivDual`, dual to a single gauge-field +generator, and `gaugeDerivDual_fieldStrengthDeriv` evaluates it on a field-strength derivative of +any order. + +The second polarization of the same construction — the dual family of the photon pairs — is +recorded here to vanish on the field-strength derivatives +(`gaugePairDual_fieldStrengthDeriv`): a second difference is blind to a linear term. This is +what separates this sector from the photon pairs. + +## Key results + +- `gaugeDerivDual_fieldStrengthDeriv` : the value of the dual on `∂_s F_{μν}`. +- `gaugePairDual_fieldStrengthDeriv` : the photon-pair duals vanish on a single field-strength + derivative. + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## A. The first polarization + +-/ + +/-- The first difference of `symEval`: the functional on the B-boson factor dual to the + degree-one monomial `φ`. It kills the constants, where the first difference of an affine + function is blind. -/ +noncomputable def symLinDual (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : + (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ := + (symEval φ).toLinearMap - (symEval 0).toLinearMap + +lemma symLinDual_tmul_ofGenerator (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (g : BBoson.JetGenerators) : + symLinDual φ (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) = + φ (BBoson.JetComponentSpace.basis g) := by + simp only [symLinDual, LinearMap.sub_apply, AlgHom.toLinearMap_apply, symEval_tmul_ofGenerator, + LinearMap.zero_apply, sub_zero] + +/-- The functional on the jet algebra dual to a single gauge-field generator: the first + polarization on the B-boson factor tensored with the augmentation on the lepton factor. -/ +noncomputable def gaugeLinDual (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : JetAlgebra →ₗ[ℂ] ℂ := + TensorProduct.lift (((LinearMap.mul ℂ ℂ).comp (symLinDual φ)).compl₂ augL.toLinearMap) + +@[simp] +lemma gaugeLinDual_tmul (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + gaugeLinDual φ (a ⊗ⱼ b) = symLinDual φ a * augL b := rfl + +lemma gaugeLinDual_ofGenerator (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + gaugeLinDual φ (ofGenerator (JetGenerators.dB s μ)) = + φ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB s μ)) := by + rw [ofGenerator_B_eq, gaugeLinDual_tmul, symLinDual_tmul_ofGenerator, map_one, mul_one] + +/-! + +## B. The dual family for the field-strength derivatives + +-/ + +/-- The coefficient with which the field-strength derivative `∂_s F_{μ ν}` contains the + gauge-field generator `∂_{p.1} B_{p.2}`. -/ +noncomputable def fsDerivCoeff (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : ℂ := + (if s + {μ} = p.1 ∧ ν = p.2 then 1 else 0) - (if s + {ν} = p.1 ∧ μ = p.2 then 1 else 0) + +/-- The functional dual to the gauge-field generator indexed by `p`. -/ +noncomputable def gaugeDerivDual (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : + JetAlgebra →ₗ[ℂ] ℂ := + gaugeLinDual ((BBoson.JetComponentSpace.basis.coord + (BBoson.JetGenerators.dB p.1 p.2)).smulRight (1 : ℂ)) + +/-- A field-strength derivative written out on the generators. -/ +lemma fieldStrengthDeriv_eq_sub (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν = + ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, TensorProduct.tmul_sub, sub_tmul] + rfl + +/-- **`gaugeDerivDual` is dual to the gauge-field generators.** Its value on a field-strength + derivative of any order is the antisymmetric coefficient `fsDerivCoeff`. -/ +@[simp] +lemma gaugeDerivDual_fieldStrengthDeriv (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + gaugeDerivDual p (fieldStrengthDeriv s μ ν) = fsDerivCoeff p s μ ν := by + simp only [fieldStrengthDeriv_eq_sub, map_sub, gaugeDerivDual, gaugeLinDual_ofGenerator, + Module.Basis.coord_apply, Module.Basis.repr_self, LinearMap.smulRight_apply, + Finsupp.single_apply, BBoson.JetGenerators.dB.injEq, fsDerivCoeff, ite_smul, one_smul, + zero_smul] + +/-! + +## C. The photon-pair duals are blind to a single field strength + +-/ + +/-- A second difference vanishes on a degree-one monomial. -/ +lemma symPairDual_tmul_ofGenerator_eq_zero (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (g : BBoson.JetGenerators) : + symPairDual φ ψ (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) = 0 := by + simp only [symPairDual, LinearMap.add_apply, LinearMap.sub_apply, AlgHom.toLinearMap_apply, + symEval_tmul_ofGenerator, LinearMap.add_apply, LinearMap.zero_apply] + ring + +/-- **The photon-pair duals vanish on a field-strength derivative.** The dual family of + `GaugeKineticTerm` reads a quadratic coefficient, and a field-strength derivative is linear in + the gauge-field generators. -/ +@[simp] +lemma gaugePairDual_fieldStrengthDeriv (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + gaugePairDual φ ψ (fieldStrengthDeriv s μ ν) = 0 := by + simp only [fieldStrengthDeriv_eq_sub, map_sub, ofGenerator_B_eq, gaugePairDual_tmul, + symPairDual_tmul_ofGenerator_eq_zero, zero_mul, sub_zero, sub_self] + +@[simp] +lemma gaugeDual_fieldStrengthDeriv (p q : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + gaugeDual p q (fieldStrengthDeriv s μ ν) = 0 := + gaugePairDual_fieldStrengthDeriv _ _ s μ ν + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean index 06000a8cb..84f2c95d9 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.ThetaTerm public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.LinearIndependence /-! # The boost weight zero part of the photon pairs diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean similarity index 53% rename from Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean rename to Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean index a54970c24..a35b36702 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/AxisBoosts.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean @@ -5,19 +5,42 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.RotationsPi +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant /-! # The boosts along the coordinate axes -The one-parameter boosts `boostZel t`, `boostXel t`, `boostYel t` along the -three coordinate axes, the subgroups `boostSubgroupZ/X/Y` they generate, and -their Lorentz matrices; together with the two fixed `z`-boosts `boostZ2`, -`boostZ3` used to kill the weight-six sector. +## i. Overview + +The one-parameter boosts `boostZel t`, `boostXel t`, `boostYel t` along the three coordinate +axes, their Lorentz matrices, their inverses, and the weighted averages `boostAvgZ`, `boostAvgX`, +`boostAvgY` over finitely many of them. + +## ii. What they are for + +These are the boosts the boost-weight grading of `Grading/BoostWeight` is defined by: an element +has boost weight `k` along an axis when the corresponding one-parameter family acts on it by +`t ^ k`. The three averages are fixed rational combinations of the identity and the boosts at +`t = 2, 3, 4` paired with their inverses; `Grading/BoostWeight` shows that each acts on an +element of boost weight `k` by an explicit scalar, which is one at `k = 0` and zero at +`k = ± 2, ± 4, ± 6`, so that on the covariant subalgebra in mass weight eight they are the +projections onto boost weight zero. + +Being non-compact, the boosts admit no invariant average, which is why the weights have to be +chosen by hand rather than obtained by integration. + +## iii. Key results + +- `JetAlgebra.boostZel`, `JetAlgebra.boostXel`, `JetAlgebra.boostYel` : the one-parameter boosts. +- `JetAlgebra.toLorentzGroup_boostZel` and its two companions : their Lorentz matrices. +- `JetAlgebra.boostAvgZ`, `JetAlgebra.boostAvgX`, `JetAlgebra.boostAvgY` : the weighted averages. + +## iv. Table of contents + +- A. The boosts along the three axes +- B. Their Lorentz matrices +- C. Their inverses +- D. The weighted boost averages -These boosts are the subgroup that `Averages/BoostAverage` averages over; its -`boostAvg_calculator` tactic computes their action on the weight-eight monomials from the -`boostMat*` matrices below together with the transformation laws of `LorentzAction`. Being non-compact they admit no invariant average, which is why that -file has to weight them by hand. -/ @[expose] public section @@ -34,13 +57,14 @@ open Matrix MatrixGroups /-! -### Parametric boosts along the three axes +## A. The boosts along the three axes -The one-parameter families of boosts `diag(t, t⁻¹)` (along `z`) and their -conjugates along `x` and `y`, with symbolic Lorentz matrices in `t`. +The one-parameter families of boosts `diag(t, t⁻¹)` (along `z`) and their conjugates along `x` +and `y`. -/ + /-- The lift `diag(t, t⁻¹)` of the boost along the `z`-axis with rapidity `2 log t`. -/ noncomputable def boostZel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := @@ -81,55 +105,10 @@ noncomputable def boostYel (t : ℝ) (ht : t ≠ 0) : SL(2,ℂ) := /-! -### The boosts as one-parameter subgroups - -`t ↦ diag(t, t⁻¹)` is a homomorphism from the multiplicative group of nonzero -reals, so the `z`-boosts form a genuine subgroup of `SL(2,ℂ)`; the `x`- and -`y`-boosts are its conjugates. The averages of `Averages/BoostAverage` are taken -over finitely many elements of these subgroups. +## B. Their Lorentz matrices -/ -/-- The boosts along the `z`-axis as a homomorphism from the nonzero reals. -/ -noncomputable def boostHomZ : ℝˣ →* SL(2,ℂ) where - toFun u := boostZel (u : ℝ) u.ne_zero - map_one' := by - refine Subtype.ext ?_ - rw [boostZel, Matrix.SpecialLinearGroup.coe_one] - ext i j - fin_cases i <;> fin_cases j <;> simp [Matrix.one_apply] - map_mul' u v := by - refine Subtype.ext ?_ - rw [boostZel, boostZel, boostZel] - have hu : ((u : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr u.ne_zero - have hv : ((v : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr v.ne_zero - ext i j - fin_cases i <;> fin_cases j <;> - simp [Units.val_mul, mul_inv] <;> ring - -/-- The one-parameter subgroup of `SL(2,ℂ)` of boosts along the `z`-axis. -/ -noncomputable def boostSubgroupZ : Subgroup SL(2,ℂ) := boostHomZ.range - -lemma boostZel_mem_boostSubgroupZ (t : ℝ) (ht : t ≠ 0) : - boostZel t ht ∈ boostSubgroupZ := - ⟨Units.mk0 t ht, rfl⟩ - -/-- The subgroup of `SL(2,ℂ)` generated by the boosts along the `x`-axis. -/ -noncomputable def boostSubgroupX : Subgroup SL(2,ℂ) := - Subgroup.closure (Set.range fun u : ℝˣ => boostXel (u : ℝ) u.ne_zero) - -lemma boostXel_mem_boostSubgroupX (t : ℝ) (ht : t ≠ 0) : - boostXel t ht ∈ boostSubgroupX := - Subgroup.subset_closure ⟨Units.mk0 t ht, rfl⟩ - -/-- The subgroup of `SL(2,ℂ)` generated by the boosts along the `y`-axis. -/ -noncomputable def boostSubgroupY : Subgroup SL(2,ℂ) := - Subgroup.closure (Set.range fun u : ℝˣ => boostYel (u : ℝ) u.ne_zero) - -lemma boostYel_mem_boostSubgroupY (t : ℝ) (ht : t ≠ 0) : - boostYel t ht ∈ boostSubgroupY := - Subgroup.subset_closure ⟨Units.mk0 t ht, rfl⟩ - /-- The Lorentz matrix of `boostZel t`: `ch = (t² + t⁻²)/2` on the time-time and `zz` entries, `-sh = -(t² - t⁻²)/2` on the mixed entries. -/ noncomputable def boostMatZ (t : ℝ) : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ @@ -221,6 +200,13 @@ lemma toLorentzGroup_boostYel (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : try norm_num [Complex.I_sq, Complex.conj_ofNat] try ring + +/-! + +## C. Their inverses + +-/ + /-- The inverse of the parametric `z`-boost is the boost at the inverse parameter. -/ lemma boostZel_inv (t : ℝ) (ht : t ≠ 0) : @@ -250,22 +236,6 @@ lemma boostYel_inv (t : ℝ) (ht : t ≠ 0) : · simp [boostYel, Complex.ofReal_inv, inv_inv] try ring -/-- The matrix of the `z`-boost. -/ -lemma boostZel_coe (t : ℝ) (ht : t ≠ 0) : - ((boostZel t ht : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = - !![((t : ℝ) : ℂ), 0; 0, (((t : ℝ) : ℂ))⁻¹] := rfl - -/-- The matrix of the `x`-boost. -/ -lemma boostXel_coe (t : ℝ) (ht : t ≠ 0) : - ((boostXel t ht : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = - !![((t : ℂ) + (t : ℂ)⁻¹)/2, ((t : ℂ) - (t : ℂ)⁻¹)/2; - ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2] := rfl - -/-- The matrix of the `y`-boost. -/ -lemma boostYel_coe (t : ℝ) (ht : t ≠ 0) : - ((boostYel t ht : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = - !![((t : ℂ) + (t : ℂ)⁻¹)/2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2; - Complex.I * ((t : ℂ) - (t : ℂ)⁻¹)/2, ((t : ℂ) + (t : ℂ)⁻¹)/2] := rfl /-- The inverse of the parametric `z`-boost, entrywise, with real entries. -/ lemma boostZel_inv_coe (t : ℝ) (ht : t ≠ 0) : @@ -293,106 +263,58 @@ lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : ext i j fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring -/-- The Lorentz matrix of the inverse `z`-boost: the boost matrix at the - inverse parameter. -/ -lemma toLorentzGroup_boostZel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostZel t ht)⁻¹).1 a b = boostMatZ t⁻¹ a b := by - rw [boostZel_inv, toLorentzGroup_boostZel] - -/-- The Lorentz matrix of the inverse `x`-boost. -/ -lemma toLorentzGroup_boostXel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostXel t ht)⁻¹).1 a b = boostMatX t⁻¹ a b := by - rw [boostXel_inv, toLorentzGroup_boostXel] - -/-- The Lorentz matrix of the inverse `y`-boost. -/ -lemma toLorentzGroup_boostYel_inv (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup (boostYel t ht)⁻¹).1 a b = boostMatY t⁻¹ a b := by - rw [boostYel_inv, toLorentzGroup_boostYel] - - /-! -### The two fixed `z`-boosts +## D. The weighted boost averages -Two diagonal boosts `diag(t, t⁻¹)` with `t = 2, 3`. Together with the Klein -four-group of rotations by `π` they suffice to kill the neutral weight-six -sector: the rotation average projects onto the twelve surviving field-strength -components and the diagonal fermion pairs, and a rational combination of the -two boosts (with weights summing to one) annihilates all of them. That -combination is `rotationPiBoostAvg` of `Averages/RotationPiBoostAverage`. +Each average is the identity together with the paired boosts at `t = 2, 3, 4`, with weights +chosen so that the operator fixes the invariants and annihilates the boost weights +`± 2, ± 4, ± 6`. See `Grading/BoostWeight` for the scalar it acts by, `boostAvgZWeight`. -/ -/-- The lift `diag(2, 1/2)` of the boost along the `z`-axis with rapidity - `log 4`. -/ -noncomputable def boostZ2 : SL(2,ℂ) := - ⟨!![2, 0; 0, 2⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ - -/-- The lift `diag(3, 1/3)` of the boost along the `z`-axis with rapidity - `log 9`. -/ -noncomputable def boostZ3 : SL(2,ℂ) := - ⟨!![3, 0; 0, 3⁻¹], by norm_num [Matrix.det_fin_two_of]⟩ - -/-- The Lorentz matrix of `boostZ2`. -/ -noncomputable def boostMatA : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => 17/8 - | Sum.inl _, Sum.inr 2 => -(15/8) - | Sum.inr 2, Sum.inl _ => -(15/8) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 17/8 - | _, _ => 0 - -/-- The Lorentz matrix of `boostZ3`. -/ -noncomputable def boostMatB : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℝ - | Sum.inl _, Sum.inl _ => 41/9 - | Sum.inl _, Sum.inr 2 => -(40/9) - | Sum.inr 2, Sum.inl _ => -(40/9) - | Sum.inr 0, Sum.inr 0 => 1 - | Sum.inr 1, Sum.inr 1 => 1 - | Sum.inr 2, Sum.inr 2 => 41/9 - | _, _ => 0 - -set_option maxHeartbeats 2000000 in -/-- The Lorentz matrix of the first boost. -/ -lemma toLorentzGroup_boostZ2 (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup boostZ2).1 a b = boostMatA a b := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostZ2, boostMatA, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try norm_num [Complex.ext_iff] - -set_option maxHeartbeats 2000000 in -/-- The Lorentz matrix of the second boost. -/ -lemma toLorentzGroup_boostZ3 (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup boostZ3).1 a b = boostMatB a b := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · try simp [boostZ3, boostMatB, PauliMatrix.pauliSelfAdjoint', - PauliMatrix.pauliMatrix, Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.conjTranspose, Matrix.diag] - try simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - try norm_num [Complex.ext_iff] - -/-- The inverse of the first boost, entrywise, with real entries. -/ -lemma boostZ2_inv_coe : - (boostZ2⁻¹ : SL(2,ℂ)).1 = !![((2⁻¹ : ℝ) : ℂ), 0; 0, ((2 : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostZ2] -/-- The inverse of the second boost, entrywise, with real entries. -/ -lemma boostZ3_inv_coe : - (boostZ3⁻¹ : SL(2,ℂ)).1 = !![((3⁻¹ : ℝ) : ℂ), 0; 0, ((3 : ℝ) : ℂ)] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [boostZ3] +/-- The `Z`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the rotation-averaged single-axis + average on the weight-eight sector. -/ +noncomputable def boostAvgZ : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + + repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + + repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + + repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) + +/-- The `X`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the rotation-averaged single-axis + average on the weight-eight sector. -/ +noncomputable def boostAvgX : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + + repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + + repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + + repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) + +/-- The `Y`-axis boost-weighted average: the identity together with the + paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator + fixes invariant vectors and acts as the rotation-averaged single-axis + average on the weight-eight sector. -/ +noncomputable def boostAvgY : Module.End ℂ JetAlgebra := + (65359/21600 : ℂ) • LinearMap.id + + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + + repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) + + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + + repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) + + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + + repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) end JetAlgebra end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index ba0e71405..7da18b698 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -5,7 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAverage +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.AxisBoosts +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDim /-! # Grading by boost weight diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean deleted file mode 100644 index 2f3511e77..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants.lean +++ /dev/null @@ -1,239 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.SpanOfRenormalizableTerms -/-! -# Classification of the renormalizable Lagrangian densities of the lepton–gauge sector - -The gauge- and Lorentz-invariant elements of the lepton–gauge-sector jet algebra of mass -dimension at most four are exactly the linear combinations of the constants, -the Maxwell term, the theta term and the two fermion kinetic terms: - -`InvariantMassWeightSubmodule 8 = span ℂ massDimFourInvariants`. - -The inclusion `≥` is `span_massDimFourInvariants_le`. For `≤`, an invariant -`x` of weight `≤ 8` decomposes into `massWeightScale`-eigenvectors, each -lying in a `covMonomialSpan`; the rotation and hypercharge selection rules leave -only the neutral even-weight components, the weight-four and weight-six -sectors are killed by the rotation average and `rotationPiBoostAvg`, and the weight-eight -sector is pinned down by the projector `boostAvgScalarProj`. - -## The two techniques, and the layout of `Invariants/` - -Everything below the top level rests on one principle, proved in -`Invariants/GroupAverage`. If `T` is a linear operator built from the group -action which fixes every invariant vector, then for an invariant `y` lying in a -span, - -`y ∈ span S` and `T y = y` give `y = T y ∈ span (T '' S)`, - -so it suffices to compute `T v` for the finitely many `v ∈ S`. The operators -used are of two kinds: - -* genuine averages over a finite subgroup — `rotationPiAvg` is the Reynolds - operator of the Klein four-group `{1, R_x, R_y, R_z}` of rotations by `π`. - Such an average is idempotent, so it projects onto the invariants outright; -* weighted combinations whose weights sum to one, so that they still fix the - invariants, but which are engineered to annihilate the unwanted eigenvalues - of the operator they are built from. The boosts are non-compact and admit no - invariant average, so `boostAvgZ`, `boostAvgX`, `boostAvgY` pair `B(t)` with - `B(t)⁻¹` at `t = 2, 3, 4` with rational weights and `boostAvg` is their mean - over the three axes, while `rotationPiBoostAvg` weights the identity against - two `z`-boosts. Despite the names these are not idempotent, and the last step - of the argument needs one that is: `boostAvgScalarProj` is the degree-five - polynomial in `boostAvg` vanishing on each of its other five eigenvalues and - equal to one on the invariants — a spectral projector, not an average. - -Alongside these sit the reduction steps, which cut the problem down to a -finite spanning set before any operator is applied: separation of components -by a character (the powers `c ^ m` for the mass weight, roots of unity for the -hypercharge), selection rules read off a single group element (the gauge -element with `u 0 = i` kills every odd-weight component), and the explicit -monomial spanning sets of each sector. - -The subdirectories group the files by which of these they carry, and each -subgroup sits opposite the average taken over it. - -* `Invariants/GroupAverage` — the averaging principle itself, stated for an - arbitrary representation: the span lemma above, weighted sums of group - elements, the average over a finite subgroup, and the fact that a polynomial - with unit coefficient sum in an operator fixing `y` again fixes `y`. -* `Invariants/Grading/` — which grading is being used. - `MassWeightAndHypercharge` builds the two gradings, by mass weight and by - hypercharge, together with the selection rules that follow from them. - `NeutralSectors` reduces each charge-neutral sector of weight four, six and - eight to a finite explicit spanning family of monomials. -* `Invariants/Subgroups/` — which subgroup, acting on what. `RotationsPi` - defines the rotations by `π` and the subgroup they generate; `AxisBoosts` - defines the one-parameter boosts along the three coordinate axes and the two - fixed `z`-boosts. How the boosts move `F_{μν}`, `∂_ρ ∂_τ F_{μν}`, the products - `F F` and the fermion bilinears is not tabulated: it follows from the - transformation laws of `LorentzAction`, and the `boostAvg_calculator` tactic - of `Averages/BoostAverage` derives it on demand. -* `Invariants/Averages/` — the average over each of those subgroups, and what - it does to the monomials. `RotationAverage` stands opposite - `Subgroups/RotationsPi` and kills the weight-four sector; - `RotationPiBoostAverage` follows it with a weighting of the two `z`-boosts - and kills the weight-six sector; `BoostAverage` stands opposite - `Subgroups/AxisBoosts` and, the boosts being non-compact, replaces the - missing invariant average by the weighted combinations `boostAvgZ/X/Y` and - their mean `boostAvg`. `BoostAvgProjector` then turns `boostAvg` into a - genuine projector, and `BoostAvgProjectorOnPhotonPairs`, - `BoostAvgProjectorOnDerivativesAndFermions` and - `BoostAvgProjectorOnMonomials` evaluate it on each kind of weight-eight term. - -`Invariants/Basic` (the four renormalizable terms, defined one per file in -`LeptonGaugeSector/JetAlgebra/Terms/`, collected into one set together with the easy -inclusion) and `Invariants/SpanOfRenormalizableTerms` (the projected monomials -land in their span) bracket these and stay at the top level. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -set_option maxHeartbeats 4000000 in -/-- The weight-eight classification: a Lorentz-invariant neutral element of - mass weight eight is a combination of the Maxwell term, the theta term, and - the two fermion kinetic terms. -/ -lemma mem_span_of_mem_chargeCovSpan_eight {y : JetAlgebra} - (hy : y ∈ chargeCovSpan 8 0) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : - y ∈ Submodule.span ℂ massDimFourInvariants := by - have h := chargeCovSpan_eight_le hy - rw [Submodule.span_union, Submodule.span_union, Submodule.span_union, - Submodule.span_union, Submodule.span_union] at h - obtain ⟨u5, hu5, w6, hw6, hE6⟩ := Submodule.mem_sup.mp h - obtain ⟨u4, hu4, w5, hw5, hE5⟩ := Submodule.mem_sup.mp hu5 - obtain ⟨u3, hu3, w4, hw4, hE4⟩ := Submodule.mem_sup.mp hu4 - obtain ⟨u2, hu2, w3, hw3, hE3⟩ := Submodule.mem_sup.mp hu3 - obtain ⟨w1, hw1, w2, hw2, hE2⟩ := Submodule.mem_sup.mp hu2 - obtain ⟨c1, hc1⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw1 - obtain ⟨c2, hc2⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw2 - obtain ⟨c3, hc3⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw3 - obtain ⟨c4, hc4⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw4 - obtain ⟨c5, hc5⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw5 - obtain ⟨c6, hc6⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw6 - have hKy : rotationPiAvg y = y := by - rw [rotationPiAvg_apply, hinv rotationPiZ, hinv rotationPiY, hinv rotationPiX] - module - have hself : boostAvgScalarProj (rotationPiAvg y) = y := by - rw [hKy] - exact boostAvgScalarProj_apply_of_invariant hinv - rw [← hself, ← hE6, ← hE5, ← hE4, ← hE3, ← hE2, ← hc1, ← hc2, ← hc3, ← hc4, - ← hc5, ← hc6] - simp only [map_add, map_sum, map_smul] - refine Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ - (Submodule.add_mem _ (Submodule.add_mem _ ?_ ?_) ?_) ?_) ?_) ?_ - · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FF_mem p.1.1 p.1.2 p.2.1 p.2.2) - · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_DDF_mem p.1.1 p.1.2 p.2.1 p.2.2) - · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM1_mem p.2 p.1.1 p.1.2) - · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM1r_mem p.2 p.1.1 p.1.2) - · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM2r_mem p.2 p.1.1 p.1.2) - · exact Submodule.sum_mem _ fun p _ => - Submodule.smul_mem _ _ (boostAvgScalarProj_rotationPiAvg_FM2_mem p.2 p.1.2 p.1.1) - -/-- The classification of the renormalizable Lagrangian densities of the lepton–gauge sector: the - gauge- and Lorentz-invariant elements of mass weight at most eight are spanned - by the constants, the Maxwell term, the theta term, and the two fermion - kinetic terms. - - The inclusion `⊇` is `span_massDimFourInvariants_le`: each of the five - elements is invariant and of weight at most eight. - - The completeness direction `⊆` is proved as follows. - 1. By `InvariantSubmodule.mem_iff_isInvariant` and - `isInvariant_iff_mem_adjoin_invariantGenerators`, an invariant `x` of - weight at most eight lies in the algebra generated by the covariant - generators, is fixed by the jets of constant gauge transformations, and is - Lorentz invariant. - 2. Graded decomposition (`exists_covMonomialSpan_decomp`): `x` is a sum of - nine components `z m ∈ covMonomialSpan m` of exact weights `0, …, 8`, - using the homogeneity of the covariant monomials and the linear - independence of the powers `c ↦ c ^ m` - (`eq_zero_of_forall_sum_pow_smul_eq_zero`). - 3. Componentwise invariance: the mass-dimension scaling commutes with the - Lorentz action and with the constant gauge action, so each component - `z m` inherits both invariances, again by independence of powers. - 4. Sector analysis. `m = 0`: the weight-zero monomial span is the constants. - `m = 1, 2`: there are no covariant monomials of these weights, since the - generators have weights at least three. Odd `m = 3, 5, 7`: odd weight - forces an odd number of fermionic factors, and the constant gauge - transformation with `u(0) = i` acts on such a monomial by - `(i⁶)^{n_ψ} ((-i)⁶)^{n_ψ̄} = (-1)^{n_ψ + n_ψ̄} = -1`, so invariance forces - `z m = 0`. `m = 4, 6`: after splitting off the hypercharge `±12` sectors - with a further root of unity, the surviving monomials (`F_{μν}`; - `∂_ρ F_{μν}` and the zero-derivative fermion pairs `ψ̄_α ψ_β`) admit no - Lorentz invariant. `m = 8`: the charge-balanced monomials are `F · F`, - `∂∂F`, and the one-derivative fermion pairs; their Lorentz invariants are - spanned by the Maxwell term, the theta term, and the two σ-contracted - kinetic terms. - - Steps 3–4 remain to be formalized: they require the commutation of the - scaling with the two group actions at the sector level, the linear independence - of the covariant monomials, and the invariant theory of `SL(2,ℂ)` on the - finite-dimensional weight sectors. -/ -lemma invariantMassWeightSubmodule_eight_eq_span_massDimFourInvariants : - InvariantMassWeightSubmodule 8 = Submodule.span ℂ massDimFourInvariants := by - refine le_antisymm ?_ span_massDimFourInvariants_le - intro x hx - obtain ⟨hxw, hxinv⟩ := Submodule.mem_inf.mp hx - rw [InvariantSubmodule.mem_iff_isInvariant] at hxinv - obtain ⟨hadj, hconst, hlor⟩ := - (isInvariant_iff_mem_adjoin_invariantGenerators x).mp hxinv - obtain ⟨z, hzmem, hxeq⟩ := exists_covMonomialSpan_decomp hxw hadj - rw [hxeq] - refine Submodule.sum_mem _ fun m hm => ?_ - have hzlor : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ (z m) = z m := fun Λ => - repLorentzGroup_covComponent_eq hzmem Λ (by rw [← hxeq]; exact hlor Λ) hm - have hzconst : ∀ g : GaugeGroupI, - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z m) = z m := fun g => - repJetGaugeGroupI_ofConstant_covComponent_eq hzmem g - (by rw [← hxeq]; exact hconst g) hm - have hm9 := Finset.mem_range.mp hm - interval_cases m - · exact Submodule.span_mono (Set.singleton_subset_iff.mpr (Set.mem_insert _ _)) - (covMonomialSpan_zero_le (hzmem 0)) - · rw [show z 1 = 0 from (Submodule.mem_bot ℂ).mp - (covMonomialSpan_le_bot_of_lt_three le_rfl (by omega) (hzmem 1))] - exact Submodule.zero_mem _ - · rw [show z 2 = 0 from (Submodule.mem_bot ℂ).mp - (covMonomialSpan_le_bot_of_lt_three (by omega) (by omega) (hzmem 2))] - exact Submodule.zero_mem _ - · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 3) - (hzconst fermionParityGauge)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_mem_chargeCovSpan_four - (mem_chargeCovSpan_zero_of_invariant (hzmem 4) hzconst) hzlor] - exact Submodule.zero_mem _ - · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 5) - (hzconst fermionParityGauge)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_mem_chargeCovSpan_six - (mem_chargeCovSpan_zero_of_invariant (hzmem 6) hzconst) hzlor] - exact Submodule.zero_mem _ - · rw [eq_zero_of_mem_covMonomialSpan_odd (by norm_num) (hzmem 7) - (hzconst fermionParityGauge)] - exact Submodule.zero_mem _ - · exact mem_span_of_mem_chargeCovSpan_eight - (mem_chargeCovSpan_zero_of_invariant (hzmem 8) hzconst) hzlor -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean deleted file mode 100644 index 99738099f..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAverage.lean +++ /dev/null @@ -1,439 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.RotationPiBoostAverage -/-! -# The average over the boosts - -The average over the boosts of `Subgroups/AxisBoosts`. Their action on the weight-eight -monomials is not tabulated: the tactic `boostAvg_calculator` below computes it on demand from -the Lorentz transformation laws of `LorentzAction` and the boost matrices of `AxisBoosts`. - -A boost subgroup is non-compact, so it carries no invariant average. In its -place a rational combination of the boosts at `t = 2, 3, 4` paired with their -inverses, together with the identity (`boostAvgZ`, `boostAvgX`, `boostAvgY`), -has weights summing to one — so it still fixes every Lorentz-invariant vector — -while annihilating the unwanted boost eigenvalues. Their mean over the three -axes is `boostAvg`, which acts on the weight-eight monomials by an explicit rational -matrix (the `boostAvg_*` lemmas). --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The `Z`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the rotation-averaged single-axis - average on the weight-eight sector. -/ -noncomputable def boostAvgZ : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + - repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + - repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + - repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) - -/-- The `X`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the rotation-averaged single-axis - average on the weight-eight sector. -/ -noncomputable def boostAvgX : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + - repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + - repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + - repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) - -/-- The `Y`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the rotation-averaged single-axis - average on the weight-eight sector. -/ -noncomputable def boostAvgY : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + - repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + - repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + - repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) - -/-- The symmetrised boost average over the three axes. -/ -noncomputable def boostAvg : Module.End ℂ JetAlgebra := - (3⁻¹ : ℂ) • (boostAvgZ + boostAvgX + boostAvgY) - -/-! - -## The boost-average calculator - -The values of `boostAvg` on the weight-eight monomials below are not separate facts: they are -what the Lorentz transformation laws of `LorentzAction` give when the boost matrices of -`Subgroups/AxisBoosts` are substituted and the index sums expanded. The tactic -`boostAvg_calculator` performs exactly that, so each of the lemmas is proved by a single -invocation and nothing has to be tabulated in advance. - -The only step that is not mechanical is fixing a basis: a field strength is antisymmetric, so -the expansion produces both `F_{ab}` and `F_{ba}` and the two have to be identified. The three -lemmas below orient the spatial index pairs; `fieldStrengthDeriv_inr_inl` orients the mixed -ones and `fieldStrengthDeriv_self` kills the diagonal. All four are oriented, so they terminate. - --/ - -/-- Orientation of the `yx` field-strength component. -/ -lemma fieldStrengthDeriv_yx (s : Multiset (Fin 1 ⊕ Fin 3)) : - fieldStrengthDeriv s (Sum.inr 1) (Sum.inr 0) = - -fieldStrengthDeriv s (Sum.inr 0) (Sum.inr 1) := fieldStrengthDeriv_antisymm .. - -/-- Orientation of the `zx` field-strength component. -/ -lemma fieldStrengthDeriv_zx (s : Multiset (Fin 1 ⊕ Fin 3)) : - fieldStrengthDeriv s (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv s (Sum.inr 0) (Sum.inr 2) := fieldStrengthDeriv_antisymm .. - -/-- Orientation of the `zy` field-strength component. -/ -lemma fieldStrengthDeriv_zy (s : Multiset (Fin 1 ⊕ Fin 3)) : - fieldStrengthDeriv s (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv s (Sum.inr 1) (Sum.inr 2) := fieldStrengthDeriv_antisymm .. - -/-- Compute the boost average on an explicit weight-eight monomial, directly from the Lorentz - transformation laws: unfold the average, push the representation through the products, expand - each generator into its index sum, substitute the boost matrices, orient the basis, and - compare coefficients. -/ -scoped syntax "boostAvg_calculator" : tactic - -scoped macro_rules - | `(tactic| boostAvg_calculator) => - `(tactic| - (simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, - LinearMap.add_apply, LinearMap.smul_apply, LinearMap.id_apply, - repLorentzGroup_apply_mul, repLorentzGroup_apply_one, - repLorentzGroup_fieldStrengthDeriv_nil, - repLorentzGroup_fieldStrengthDeriv_singleton, - repLorentzGroup_fieldStrengthDeriv_pair, - repLorentzGroup_Dψ_nil, repLorentzGroup_Dψ_singleton, - repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dbarψ_singleton, - repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, - repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - map_add, map_sub, inv_inv, - boostZel_coe, boostXel_coe, boostYel_coe, - boostZel_inv_coe, boostXel_inv_coe, boostYel_inv_coe, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_mul, map_div₀, map_inv₀, map_ofNat, - map_zero, map_one, map_neg, Complex.conj_ofReal, Complex.conj_I, - star_zero, star_one, neg_neg, neg_zero, Complex.ofReal_neg, - toLorentzGroup_boostZel, toLorentzGroup_boostZel_inv, - toLorentzGroup_boostXel, toLorentzGroup_boostXel_inv, - toLorentzGroup_boostYel, toLorentzGroup_boostYel_inv, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_two, Fin.sum_univ_three, - boostMatZ, boostMatX, boostMatY, - fieldStrengthDeriv_self, fieldStrengthDeriv_inr_inl, - fieldStrengthDeriv_yx, fieldStrengthDeriv_zx, fieldStrengthDeriv_zy, - fieldStrengthDeriv_mul_comm, fieldStrengthDeriv_pair_swap, - mul_zero, zero_mul, mul_one, one_mul, - Complex.ofReal_zero, Complex.ofReal_one, - zero_smul, smul_zero, add_zero, zero_add, neg_mul, mul_neg, smul_neg, neg_smul, - add_mul, mul_add, smul_mul_assoc, mul_smul_comm, smul_smul] - push_cast - match_scalars <;> - (push_cast - first - | (norm_num; done) - | (ring_nf; simp only [Complex.I_sq]; ring_nf; done) - | (ring_nf; simp only [Complex.I_sq]; norm_num; done) - | (field_simp; ring)))) - -/-- The operator `boostAvg` fixes every Lorentz-invariant vector: each boost term - fixes it and the weights sum to one. -/ -lemma boostAvg_apply_of_invariant {y : JetAlgebra} - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : boostAvg y = y := by - simp only [boostAvg, boostAvgZ, boostAvgX, boostAvgY, LinearMap.smul_apply, - LinearMap.add_apply, LinearMap.id_apply, hinv] - match_scalars - norm_num - -/-- The boost average `boostAvg` on `F01 * F01`. -/ -lemma boostAvg_F01_F01 : - boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F01 * F23`. -/ -lemma boostAvg_F01_F23 : - boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F02 * F02`. -/ -lemma boostAvg_F02_F02 : - boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F02 * F13`. -/ -lemma boostAvg_F02_F13 : - boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F03 * F03`. -/ -lemma boostAvg_F03_F03 : - boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F03 * F12`. -/ -lemma boostAvg_F03_F12 : - boostAvg (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F12 * F12`. -/ -lemma boostAvg_F12_F12 : - boostAvg (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F13 * F13`. -/ -lemma boostAvg_F13_F13 : - boostAvg (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `F23 * F23`. -/ -lemma boostAvg_F23_F23 : - boostAvg (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F01` with derivative indices `(0, 1)`. -/ -lemma boostAvg_dd01_F01 : - boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F23` with derivative indices `(0, 1)`. -/ -lemma boostAvg_dd01_F23 : - boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F02` with derivative indices `(0, 2)`. -/ -lemma boostAvg_dd02_F02 : - boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F13` with derivative indices `(0, 2)`. -/ -lemma boostAvg_dd02_F13 : - boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F03` with derivative indices `(0, 3)`. -/ -lemma boostAvg_dd03_F03 : - boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F12` with derivative indices `(0, 3)`. -/ -lemma boostAvg_dd03_F12 : - boostAvg (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (1/3 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F03` with derivative indices `(1, 2)`. -/ -lemma boostAvg_dd12_F03 : - boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F12` with derivative indices `(1, 2)`. -/ -lemma boostAvg_dd12_F12 : - boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F02` with derivative indices `(1, 3)`. -/ -lemma boostAvg_dd13_F02 : - boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F13` with derivative indices `(1, 3)`. -/ -lemma boostAvg_dd13_F13 : - boostAvg (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F01` with derivative indices `(2, 3)`. -/ -lemma boostAvg_dd23_F01 : - boostAvg (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on `∂∂F23` with derivative indices `(2, 3)`. -/ -lemma boostAvg_dd23_F23 : - boostAvg (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (2/3 : ℂ) • (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) - + (1/6 : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) - + (-(1/6) : ℂ) • (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `u0`. -/ -lemma boostAvg_u0 : - boostAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - + (-(Complex.I/6)) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `u1`. -/ -lemma boostAvg_u1 : - boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `u2`. -/ -lemma boostAvg_u2 : - boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - + (Complex.I/6) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `u3`. -/ -lemma boostAvg_u3 : - boostAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (5/6 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) - + (-(1/6) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar0`. -/ -lemma boostAvg_ubar0 : - boostAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - + (-(Complex.I/6)) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar1`. -/ -lemma boostAvg_ubar1 : - boostAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar2`. -/ -lemma boostAvg_ubar2 : - boostAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - + (Complex.I/6) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - boostAvg_calculator - -/-- The boost average `boostAvg` on the σ-contracted fermion pair `ubar3`. -/ -lemma boostAvg_ubar3 : - boostAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (5/6 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) - + (-(1/6) : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - boostAvg_calculator - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean deleted file mode 100644 index 61e2042a0..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjector.lean +++ /dev/null @@ -1,162 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAverage -/-! -# The scalar projector built from the boost average - -`boostAvgScalarProj` is *not* an average. It is a polynomial in the boost -average `boostAvg` of `Averages/BoostAverage`, and the distinction matters. - -An average over a finite subgroup is idempotent, so it projects onto the -invariants outright. The boosts are not finite — not even compact — and -`boostAvg` is only a weighted combination with weights summing to one: it fixes -every Lorentz-invariant element, but it is not idempotent, and on the -rotation-averaged weight-eight sector it acts with the six eigenvalues -`1, 5/6, 2/3, 1/2, 1/3, 1/6`. The invariants are exactly the eigenvalue-one -eigenspace. - -Turning that operator into a projector is Sylvester's formula: for the unique -quintic `p` with `p 1 = 1` and `p λ = 0` at the other five eigenvalues, - -`p x = (324/5) (x - 5/6) (x - 2/3) (x - 1/2) (x - 1/3) (x - 1/6)` -` = -1 + (137/10) x - (135/2) x² + 153 x³ - 162 x⁴ + (324/5) x⁵,` - -the operator `p boostAvg` kills every other eigenspace and is the identity on -the invariants. That operator is `boostAvgScalarProj`. Its coefficients sum to -one, so `Module.End.sum_smul_pow_apply_of_apply_eq_self` of -`Invariants/GroupAverage` applies verbatim and it fixes Lorentz invariants just -as an average would (`boostAvgScalarProj_apply_of_invariant`); that is all the -averaging principle ever needs of it. - -Its values on the weight-eight monomials are computed in -`BoostAvgProjectorOnPhotonPairs`, `BoostAvgProjectorOnDerivativesAndFermions` -and `BoostAvgProjectorOnMonomials`. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## A. Sylvester's polynomial - -The projector is a polynomial in the boost average, so it acts on an eigenvector of that average -by the value of the polynomial at the eigenvalue. Since the polynomial was built to take the -value one at the eigenvalue one and to vanish at the other five, every computation of the -projector on a concrete vector reduces to a single linear-algebra step: decompose the vector -into eigenvectors of `boostAvg` and read off the eigenvalue-one part. No iterate of the operator -ever has to be computed. - --/ - -/-- Sylvester's interpolation polynomial for the spectrum of the boost average: - `(324/5) (c - 5/6) (c - 2/3) (c - 1/2) (c - 1/3) (c - 1/6)`, normalized to take the value one - at `c = 1`. -/ -noncomputable def sylvester (c : ℂ) : ℂ := - -1 + (137/10) * c + (-(135/2)) * c ^ 2 + 153 * c ^ 3 + (-162) * c ^ 4 + (324/5) * c ^ 5 - -@[simp] lemma sylvester_one : sylvester (1 : ℂ) = 1 := by norm_num [sylvester] -@[simp] lemma sylvester_five_sixths : sylvester (5/6 : ℂ) = 0 := by norm_num [sylvester] -@[simp] lemma sylvester_two_thirds : sylvester (2/3 : ℂ) = 0 := by norm_num [sylvester] -@[simp] lemma sylvester_half : sylvester (1/2 : ℂ) = 0 := by norm_num [sylvester] -@[simp] lemma sylvester_third : sylvester (1/3 : ℂ) = 0 := by norm_num [sylvester] -@[simp] lemma sylvester_sixth : sylvester (1/6 : ℂ) = 0 := by norm_num [sylvester] - -/-- Sylvester's polynomial evaluated on an endomorphism. Stated for an arbitrary module, since - nothing about the jet algebra is used. -/ -noncomputable def sylvesterEnd {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) : Module.End ℂ M := - (-1 : ℂ) • T ^ 0 + (137/10 : ℂ) • T ^ 1 + (-(135/2) : ℂ) • T ^ 2 + (153 : ℂ) • T ^ 3 - + (-162 : ℂ) • T ^ 4 + (324/5 : ℂ) • T ^ 5 - -lemma sylvesterEnd_apply {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) (v : M) : - sylvesterEnd T v = (-1 : ℂ) • v + (137/10 : ℂ) • T v + (-(135/2) : ℂ) • T (T v) - + (153 : ℂ) • T (T (T v)) + (-162 : ℂ) • T (T (T (T v))) - + (324/5 : ℂ) • T (T (T (T (T v)))) := by - simp [sylvesterEnd, pow_succ, Module.End.mul_apply] - -lemma pow_apply_of_eigen {M : Type*} [AddCommGroup M] [Module ℂ M] - {T : Module.End ℂ M} {c : ℂ} {v : M} (h : T v = c • v) (n : ℕ) : - (T ^ n) v = c ^ n • v := by - induction n with - | zero => simp - | succ n ih => - rw [pow_succ, Module.End.mul_apply, h, map_smul, ih, smul_smul, pow_succ] - ring_nf - -/-- On an eigenvector, a polynomial in the operator acts by the value of the polynomial at the - eigenvalue. This is the only fact about `sylvesterEnd` that the computations need. -/ -lemma sylvesterEnd_of_eigen {M : Type*} [AddCommGroup M] [Module ℂ M] - {T : Module.End ℂ M} {c : ℂ} {v : M} (h : T v = c • v) : - sylvesterEnd T v = sylvester c • v := by - simp only [sylvesterEnd, LinearMap.add_apply, LinearMap.smul_apply, pow_apply_of_eigen h, - smul_smul, sylvester] - module - -/-! - -## B. The projector - --/ - -/-- The spectral projector onto the Lorentz scalars, obtained from the boost - average `boostAvg` by Sylvester's formula. Not an average itself: it is the - unique quintic in `boostAvg` taking the value one at the eigenvalue one and - vanishing at the other five eigenvalues `5/6, 2/3, 1/2, 1/3, 1/6` of - `boostAvg` on the rotation-averaged weight-eight sector, namely - `(324/5) (x - 5/6) (x - 2/3) (x - 1/2) (x - 1/3) (x - 1/6)`. Unlike `boostAvg` - it is idempotent there, which is what pins the sector down. -/ -noncomputable def boostAvgScalarProj : Module.End ℂ JetAlgebra := - (-1 : ℂ) • (1 : Module.End ℂ JetAlgebra) + (137/10 : ℂ) • boostAvg - + (-(135/2) : ℂ) • (boostAvg * boostAvg) + (153 : ℂ) • (boostAvg * boostAvg * boostAvg) - + (-162 : ℂ) • (boostAvg * boostAvg * boostAvg * boostAvg) - + (324/5 : ℂ) • (boostAvg * boostAvg * boostAvg * boostAvg * boostAvg) - -/-- The projector polynomial, termwise. -/ -lemma boostAvgScalarProj_apply (v : JetAlgebra) : - boostAvgScalarProj v = (-1 : ℂ) • v + (137/10 : ℂ) • boostAvg v - + (-(135/2) : ℂ) • boostAvg (boostAvg v) + (153 : ℂ) • boostAvg (boostAvg (boostAvg v)) - + (-162 : ℂ) • boostAvg (boostAvg (boostAvg (boostAvg v))) - + (324/5 : ℂ) • boostAvg (boostAvg (boostAvg (boostAvg (boostAvg v)))) := by - simp only [boostAvgScalarProj, LinearMap.add_apply, LinearMap.smul_apply, Module.End.one_apply, - Module.End.mul_apply] - -/-- The projector is Sylvester's polynomial evaluated on the boost average. -/ -lemma boostAvgScalarProj_eq_sylvesterEnd : boostAvgScalarProj = sylvesterEnd boostAvg := by - simp [boostAvgScalarProj, sylvesterEnd, pow_succ] - -/-- On an eigenvector of the boost average the projector acts by the value of Sylvester's - polynomial at the eigenvalue. Together with `sylvester_one` and the four vanishing values - this reduces every evaluation of the projector to an eigenvector decomposition. -/ -lemma boostAvgScalarProj_of_eigen {c : ℂ} {v : JetAlgebra} (h : boostAvg v = c • v) : - boostAvgScalarProj v = sylvester c • v := by - rw [boostAvgScalarProj_eq_sylvesterEnd, sylvesterEnd_of_eigen h] - -/-- The projector fixes every Lorentz-invariant vector: `boostAvg` fixes it and the - coefficients sum to one. -/ -lemma boostAvgScalarProj_apply_of_invariant {y : JetAlgebra} - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : boostAvgScalarProj y = y := by - have hS : boostAvg y = y := boostAvg_apply_of_invariant hinv - rw [boostAvgScalarProj_apply] - simp only [hS] - match_scalars - norm_num - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean deleted file mode 100644 index efb39aff5..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnDerivativesAndFermions.lean +++ /dev/null @@ -1,1115 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjectorOnPhotonPairs -/-! -# The Lorentz-scalar projector on the derivative and fermion terms - -Evaluation of the projector polynomial `boostAvgScalarProj` on the eigenvalue patterns of -the second-derivative field strengths (`scalarProjDDF*`) and of the fermion -bilinears (`scalarProjFMu*`, `scalarProjFMubar*`). --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the DDF block. -/ -lemma scalarProjDDF0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (0 : M) := by - have i2 : T (T v0) = - (1/6 : ℂ) • (v0) - + (-(1/36) : ℂ) • (v2) - + (-(1/36) : ℂ) • (v4) - + (1/6 : ℂ) • (v7) - + (1/6 : ℂ) • (v9) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v0)) = - (1/9 : ℂ) • (v0) - + (-(1/27) : ℂ) • (v2) - + (-(1/27) : ℂ) • (v4) - + (31/216 : ℂ) • (v7) - + (31/216 : ℂ) • (v9) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v0))) = - (55/648 : ℂ) • (v0) - + (-(47/1296) : ℂ) • (v2) - + (-(47/1296) : ℂ) • (v4) - + (13/108 : ℂ) • (v7) - + (13/108 : ℂ) • (v9) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v0)))) = - (133/1944 : ℂ) • (v0) - + (-(125/3888) : ℂ) • (v2) - + (-(125/3888) : ℂ) • (v4) - + (781/7776 : ℂ) • (v7) - + (781/7776 : ℂ) • (v9) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h0] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the DDF block. -/ -lemma scalarProjDDF1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (0 : M) := by - have i2 : T (T v1) = - (1/6 : ℂ) • (v1) - + (1/36 : ℂ) • (v3) - + (-(1/36) : ℂ) • (v5) - + (-(1/6) : ℂ) • (v6) - + (1/6 : ℂ) • (v8) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v1)) = - (1/9 : ℂ) • (v1) - + (1/27 : ℂ) • (v3) - + (-(1/27) : ℂ) • (v5) - + (-(31/216) : ℂ) • (v6) - + (31/216 : ℂ) • (v8) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v1))) = - (55/648 : ℂ) • (v1) - + (47/1296 : ℂ) • (v3) - + (-(47/1296) : ℂ) • (v5) - + (-(13/108) : ℂ) • (v6) - + (13/108 : ℂ) • (v8) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v1)))) = - (133/1944 : ℂ) • (v1) - + (125/3888 : ℂ) • (v3) - + (-(125/3888) : ℂ) • (v5) - + (-(781/7776) : ℂ) • (v6) - + (781/7776 : ℂ) • (v8) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h1] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the DDF block. -/ -lemma scalarProjDDF2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (0 : M) := by - have i2 : T (T v2) = - (-(1/36) : ℂ) • (v0) - + (1/6 : ℂ) • (v2) - + (-(1/36) : ℂ) • (v4) - + (-(1/6) : ℂ) • (v7) - + (1/6 : ℂ) • (v11) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v2)) = - (-(1/27) : ℂ) • (v0) - + (1/9 : ℂ) • (v2) - + (-(1/27) : ℂ) • (v4) - + (-(31/216) : ℂ) • (v7) - + (31/216 : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v2))) = - (-(47/1296) : ℂ) • (v0) - + (55/648 : ℂ) • (v2) - + (-(47/1296) : ℂ) • (v4) - + (-(13/108) : ℂ) • (v7) - + (13/108 : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v2)))) = - (-(125/3888) : ℂ) • (v0) - + (133/1944 : ℂ) • (v2) - + (-(125/3888) : ℂ) • (v4) - + (-(781/7776) : ℂ) • (v7) - + (781/7776 : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h2] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the DDF block. -/ -lemma scalarProjDDF3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (0 : M) := by - have i2 : T (T v3) = - (1/36 : ℂ) • (v1) - + (1/6 : ℂ) • (v3) - + (1/36 : ℂ) • (v5) - + (-(1/6) : ℂ) • (v6) - + (1/6 : ℂ) • (v10) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v3)) = - (1/27 : ℂ) • (v1) - + (1/9 : ℂ) • (v3) - + (1/27 : ℂ) • (v5) - + (-(31/216) : ℂ) • (v6) - + (31/216 : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v3))) = - (47/1296 : ℂ) • (v1) - + (55/648 : ℂ) • (v3) - + (47/1296 : ℂ) • (v5) - + (-(13/108) : ℂ) • (v6) - + (13/108 : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v3)))) = - (125/3888 : ℂ) • (v1) - + (133/1944 : ℂ) • (v3) - + (125/3888 : ℂ) • (v5) - + (-(781/7776) : ℂ) • (v6) - + (781/7776 : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h3] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 4 of the DDF block. -/ -lemma scalarProjDDF4 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) - + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) - + (324/5 : ℂ) • T (T (T (T (T v4)))) = - (0 : M) := by - have i2 : T (T v4) = - (-(1/36) : ℂ) • (v0) - + (-(1/36) : ℂ) • (v2) - + (1/6 : ℂ) • (v4) - + (-(1/6) : ℂ) • (v9) - + (-(1/6) : ℂ) • (v11) := by - rw [h4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v4)) = - (-(1/27) : ℂ) • (v0) - + (-(1/27) : ℂ) • (v2) - + (1/9 : ℂ) • (v4) - + (-(31/216) : ℂ) • (v9) - + (-(31/216) : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v4))) = - (-(47/1296) : ℂ) • (v0) - + (-(47/1296) : ℂ) • (v2) - + (55/648 : ℂ) • (v4) - + (-(13/108) : ℂ) • (v9) - + (-(13/108) : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v4)))) = - (-(125/3888) : ℂ) • (v0) - + (-(125/3888) : ℂ) • (v2) - + (133/1944 : ℂ) • (v4) - + (-(781/7776) : ℂ) • (v9) - + (-(781/7776) : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h4] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 5 of the DDF block. -/ -lemma scalarProjDDF5 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) - + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) - + (324/5 : ℂ) • T (T (T (T (T v5)))) = - (0 : M) := by - have i2 : T (T v5) = - (-(1/36) : ℂ) • (v1) - + (1/36 : ℂ) • (v3) - + (1/6 : ℂ) • (v5) - + (-(1/6) : ℂ) • (v8) - + (1/6 : ℂ) • (v10) := by - rw [h5] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v5)) = - (-(1/27) : ℂ) • (v1) - + (1/27 : ℂ) • (v3) - + (1/9 : ℂ) • (v5) - + (-(31/216) : ℂ) • (v8) - + (31/216 : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v5))) = - (-(47/1296) : ℂ) • (v1) - + (47/1296 : ℂ) • (v3) - + (55/648 : ℂ) • (v5) - + (-(13/108) : ℂ) • (v8) - + (13/108 : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v5)))) = - (-(125/3888) : ℂ) • (v1) - + (125/3888 : ℂ) • (v3) - + (133/1944 : ℂ) • (v5) - + (-(781/7776) : ℂ) • (v8) - + (781/7776 : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h5] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 6 of the DDF block. -/ -lemma scalarProjDDF6 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) - + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) - + (324/5 : ℂ) • T (T (T (T (T v6)))) = - (0 : M) := by - have i2 : T (T v6) = - (-(1/6) : ℂ) • (v1) - + (-(1/6) : ℂ) • (v3) - + (1/2 : ℂ) • (v6) - + (-(1/36) : ℂ) • (v8) - + (-(1/36) : ℂ) • (v10) := by - rw [h6] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v6)) = - (-(31/216) : ℂ) • (v1) - + (-(31/216) : ℂ) • (v3) - + (7/18 : ℂ) • (v6) - + (-(5/108) : ℂ) • (v8) - + (-(5/108) : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v6))) = - (-(13/108) : ℂ) • (v1) - + (-(13/108) : ℂ) • (v3) - + (199/648 : ℂ) • (v6) - + (-(71/1296) : ℂ) • (v8) - + (-(71/1296) : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v6)))) = - (-(781/7776) : ℂ) • (v1) - + (-(781/7776) : ℂ) • (v3) - + (119/486 : ℂ) • (v6) - + (-(55/972) : ℂ) • (v8) - + (-(55/972) : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h6] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 7 of the DDF block. -/ -lemma scalarProjDDF7 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) - + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) - + (324/5 : ℂ) • T (T (T (T (T v7)))) = - (0 : M) := by - have i2 : T (T v7) = - (1/6 : ℂ) • (v0) - + (-(1/6) : ℂ) • (v2) - + (1/2 : ℂ) • (v7) - + (1/36 : ℂ) • (v9) - + (-(1/36) : ℂ) • (v11) := by - rw [h7] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v7)) = - (31/216 : ℂ) • (v0) - + (-(31/216) : ℂ) • (v2) - + (7/18 : ℂ) • (v7) - + (5/108 : ℂ) • (v9) - + (-(5/108) : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v7))) = - (13/108 : ℂ) • (v0) - + (-(13/108) : ℂ) • (v2) - + (199/648 : ℂ) • (v7) - + (71/1296 : ℂ) • (v9) - + (-(71/1296) : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v7)))) = - (781/7776 : ℂ) • (v0) - + (-(781/7776) : ℂ) • (v2) - + (119/486 : ℂ) • (v7) - + (55/972 : ℂ) • (v9) - + (-(55/972) : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h7] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 8 of the DDF block. -/ -lemma scalarProjDDF8 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) - + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) - + (324/5 : ℂ) • T (T (T (T (T v8)))) = - (0 : M) := by - have i2 : T (T v8) = - (1/6 : ℂ) • (v1) - + (-(1/6) : ℂ) • (v5) - + (-(1/36) : ℂ) • (v6) - + (1/2 : ℂ) • (v8) - + (-(1/36) : ℂ) • (v10) := by - rw [h8] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v8)) = - (31/216 : ℂ) • (v1) - + (-(31/216) : ℂ) • (v5) - + (-(5/108) : ℂ) • (v6) - + (7/18 : ℂ) • (v8) - + (-(5/108) : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v8))) = - (13/108 : ℂ) • (v1) - + (-(13/108) : ℂ) • (v5) - + (-(71/1296) : ℂ) • (v6) - + (199/648 : ℂ) • (v8) - + (-(71/1296) : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v8)))) = - (781/7776 : ℂ) • (v1) - + (-(781/7776) : ℂ) • (v5) - + (-(55/972) : ℂ) • (v6) - + (119/486 : ℂ) • (v8) - + (-(55/972) : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h8] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 9 of the DDF block. -/ -lemma scalarProjDDF9 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v9 + (137/10 : ℂ) • T v9 + (-(135/2) : ℂ) • T (T v9) - + (153 : ℂ) • T (T (T v9)) + (-162 : ℂ) • T (T (T (T v9))) - + (324/5 : ℂ) • T (T (T (T (T v9)))) = - (0 : M) := by - have i2 : T (T v9) = - (1/6 : ℂ) • (v0) - + (-(1/6) : ℂ) • (v4) - + (1/36 : ℂ) • (v7) - + (1/2 : ℂ) • (v9) - + (1/36 : ℂ) • (v11) := by - rw [h9] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v9)) = - (31/216 : ℂ) • (v0) - + (-(31/216) : ℂ) • (v4) - + (5/108 : ℂ) • (v7) - + (7/18 : ℂ) • (v9) - + (5/108 : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v9))) = - (13/108 : ℂ) • (v0) - + (-(13/108) : ℂ) • (v4) - + (71/1296 : ℂ) • (v7) - + (199/648 : ℂ) • (v9) - + (71/1296 : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v9)))) = - (781/7776 : ℂ) • (v0) - + (-(781/7776) : ℂ) • (v4) - + (55/972 : ℂ) • (v7) - + (119/486 : ℂ) • (v9) - + (55/972 : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h9] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 10 of the DDF block. -/ -lemma scalarProjDDF10 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v10 + (137/10 : ℂ) • T v10 + (-(135/2) : ℂ) • T (T v10) - + (153 : ℂ) • T (T (T v10)) + (-162 : ℂ) • T (T (T (T v10))) - + (324/5 : ℂ) • T (T (T (T (T v10)))) = - (0 : M) := by - have i2 : T (T v10) = - (1/6 : ℂ) • (v3) - + (1/6 : ℂ) • (v5) - + (-(1/36) : ℂ) • (v6) - + (-(1/36) : ℂ) • (v8) - + (1/2 : ℂ) • (v10) := by - rw [h10] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v10)) = - (31/216 : ℂ) • (v3) - + (31/216 : ℂ) • (v5) - + (-(5/108) : ℂ) • (v6) - + (-(5/108) : ℂ) • (v8) - + (7/18 : ℂ) • (v10) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v10))) = - (13/108 : ℂ) • (v3) - + (13/108 : ℂ) • (v5) - + (-(71/1296) : ℂ) • (v6) - + (-(71/1296) : ℂ) • (v8) - + (199/648 : ℂ) • (v10) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v10)))) = - (781/7776 : ℂ) • (v3) - + (781/7776 : ℂ) • (v5) - + (-(55/972) : ℂ) • (v6) - + (-(55/972) : ℂ) • (v8) - + (119/486 : ℂ) • (v10) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h10] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 11 of the DDF block. -/ -lemma scalarProjDDF11 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 : M} - (h0 : T v0 = (1/3 : ℂ) • v0 + (1/6 : ℂ) • v7 + (1/6 : ℂ) • v9) - (h1 : T v1 = (1/3 : ℂ) • v1 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v8) - (h2 : T v2 = (1/3 : ℂ) • v2 + (-(1/6) : ℂ) • v7 + (1/6 : ℂ) • v11) - (h3 : T v3 = (1/3 : ℂ) • v3 + (-(1/6) : ℂ) • v6 + (1/6 : ℂ) • v10) - (h4 : T v4 = (1/3 : ℂ) • v4 + (-(1/6) : ℂ) • v9 + (-(1/6) : ℂ) • v11) - (h5 : T v5 = (1/3 : ℂ) • v5 + (-(1/6) : ℂ) • v8 + (1/6 : ℂ) • v10) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h7 : T v7 = (2/3 : ℂ) • v7 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h8 : T v8 = (2/3 : ℂ) • v8 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h9 : T v9 = (2/3 : ℂ) • v9 + (1/6 : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h10 : T v10 = (2/3 : ℂ) • v10 + (1/6 : ℂ) • v3 + (1/6 : ℂ) • v5) - (h11 : T v11 = (2/3 : ℂ) • v11 + (1/6 : ℂ) • v2 + (-(1/6) : ℂ) • v4) : - (-1 : ℂ) • v11 + (137/10 : ℂ) • T v11 + (-(135/2) : ℂ) • T (T v11) - + (153 : ℂ) • T (T (T v11)) + (-162 : ℂ) • T (T (T (T v11))) - + (324/5 : ℂ) • T (T (T (T (T v11)))) = - (0 : M) := by - have i2 : T (T v11) = - (1/6 : ℂ) • (v2) - + (-(1/6) : ℂ) • (v4) - + (-(1/36) : ℂ) • (v7) - + (1/36 : ℂ) • (v9) - + (1/2 : ℂ) • (v11) := by - rw [h11] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i3 : T (T (T v11)) = - (31/216 : ℂ) • (v2) - + (-(31/216) : ℂ) • (v4) - + (-(5/108) : ℂ) • (v7) - + (5/108 : ℂ) • (v9) - + (7/18 : ℂ) • (v11) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i4 : T (T (T (T v11))) = - (13/108 : ℂ) • (v2) - + (-(13/108) : ℂ) • (v4) - + (-(71/1296) : ℂ) • (v7) - + (71/1296 : ℂ) • (v9) - + (199/648 : ℂ) • (v11) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - have i5 : T (T (T (T (T v11)))) = - (781/7776 : ℂ) • (v2) - + (-(781/7776) : ℂ) • (v4) - + (-(55/972) : ℂ) • (v7) - + (55/972 : ℂ) • (v9) - + (119/486 : ℂ) • (v11) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11] - match_scalars <;> norm_num - rw [i5, i4, i3, i2, h11] - match_scalars <;> norm_num - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the FMu block. -/ -lemma scalarProjFMu0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (-(Complex.I/4)) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v0) = - (1/3 : ℂ) • (v0) - + (-(2/9) : ℂ) • (v1) - + ((-(2/9) : ℂ) * Complex.I) • (v2) - + (-(2/9) : ℂ) • (v3) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v0)) = - (5/18 : ℂ) • (v0) - + (-(13/54) : ℂ) • (v1) - + ((-(13/54) : ℂ) * Complex.I) • (v2) - + (-(13/54) : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v0))) = - (7/27 : ℂ) • (v0) - + (-(20/81) : ℂ) • (v1) - + ((-(20/81) : ℂ) * Complex.I) • (v2) - + (-(20/81) : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v0)))) = - (41/162 : ℂ) • (v0) - + (-(121/486) : ℂ) • (v1) - + ((-(121/486) : ℂ) * Complex.I) • (v2) - + (-(121/486) : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h0] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the FMu block. -/ -lemma scalarProjFMu1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v1) = - (-(2/9) : ℂ) • (v0) - + (13/18 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (1/36 : ℂ) • (v3) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v1)) = - (-(13/54) : ℂ) • (v0) - + (23/36 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (13/216 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v1))) = - (-(20/81) : ℂ) • (v0) - + (371/648 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (13/144 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v1)))) = - (-(121/486) : ℂ) • (v0) - + (2015/3888 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (905/7776 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h1] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the FMu block. -/ -lemma scalarProjFMu2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (1/4 : ℂ) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v2) = - ((2/9 : ℂ) * Complex.I) • (v0) - + ((-(1/36) : ℂ) * Complex.I) • (v1) - + (13/18 : ℂ) • (v2) - + ((-(1/36) : ℂ) * Complex.I) • (v3) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v2)) = - ((13/54 : ℂ) * Complex.I) • (v0) - + ((-(13/216) : ℂ) * Complex.I) • (v1) - + (23/36 : ℂ) • (v2) - + ((-(13/216) : ℂ) * Complex.I) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v2))) = - ((20/81 : ℂ) * Complex.I) • (v0) - + ((-(13/144) : ℂ) * Complex.I) • (v1) - + (371/648 : ℂ) • (v2) - + ((-(13/144) : ℂ) * Complex.I) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v2)))) = - ((121/486 : ℂ) * Complex.I) • (v0) - + ((-(905/7776) : ℂ) * Complex.I) • (v1) - + (2015/3888 : ℂ) • (v2) - + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h2] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the FMu block. -/ -lemma scalarProjFMu3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (Complex.I/4) • (Complex.I • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v3) = - (-(2/9) : ℂ) • (v0) - + (1/36 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (13/18 : ℂ) • (v3) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v3)) = - (-(13/54) : ℂ) • (v0) - + (13/216 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (23/36 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v3))) = - (-(20/81) : ℂ) • (v0) - + (13/144 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (371/648 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v3)))) = - (-(121/486) : ℂ) • (v0) - + (905/7776 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (2015/3888 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 0 of the FMubar block. -/ -lemma scalarProjFMubar0 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (Complex.I/4) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v0) = - (1/3 : ℂ) • (v0) - + (-(2/9) : ℂ) • (v1) - + ((-(2/9) : ℂ) * Complex.I) • (v2) - + (-(2/9) : ℂ) • (v3) := by - rw [h0] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v0)) = - (5/18 : ℂ) • (v0) - + (-(13/54) : ℂ) • (v1) - + ((-(13/54) : ℂ) * Complex.I) • (v2) - + (-(13/54) : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v0))) = - (7/27 : ℂ) • (v0) - + (-(20/81) : ℂ) • (v1) - + ((-(20/81) : ℂ) * Complex.I) • (v2) - + (-(20/81) : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v0)))) = - (41/162 : ℂ) • (v0) - + (-(121/486) : ℂ) • (v1) - + ((-(121/486) : ℂ) * Complex.I) • (v2) - + (-(121/486) : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h0] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 1 of the FMubar block. -/ -lemma scalarProjFMubar1 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v1) = - (-(2/9) : ℂ) • (v0) - + (13/18 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (1/36 : ℂ) • (v3) := by - rw [h1] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v1)) = - (-(13/54) : ℂ) • (v0) - + (23/36 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (13/216 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v1))) = - (-(20/81) : ℂ) • (v0) - + (371/648 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (13/144 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v1)))) = - (-(121/486) : ℂ) • (v0) - + (2015/3888 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (905/7776 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h1] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 2 of the FMubar block. -/ -lemma scalarProjFMubar2 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (-(1/4) : ℂ) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v2) = - ((2/9 : ℂ) * Complex.I) • (v0) - + ((-(1/36) : ℂ) * Complex.I) • (v1) - + (13/18 : ℂ) • (v2) - + ((-(1/36) : ℂ) * Complex.I) • (v3) := by - rw [h2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v2)) = - ((13/54 : ℂ) * Complex.I) • (v0) - + ((-(13/216) : ℂ) * Complex.I) • (v1) - + (23/36 : ℂ) • (v2) - + ((-(13/216) : ℂ) * Complex.I) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v2))) = - ((20/81 : ℂ) * Complex.I) • (v0) - + ((-(13/144) : ℂ) * Complex.I) • (v1) - + (371/648 : ℂ) • (v2) - + ((-(13/144) : ℂ) * Complex.I) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v2)))) = - ((121/486 : ℂ) * Complex.I) • (v0) - + ((-(905/7776) : ℂ) * Complex.I) • (v1) - + (2015/3888 : ℂ) • (v2) - + ((-(905/7776) : ℂ) * Complex.I) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h2] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 2000000 in -/-- The abstract projector computation for column 3 of the FMubar block. -/ -lemma scalarProjFMubar3 {M : Type*} [AddCommGroup M] [Module ℂ M] - (T : Module.End ℂ M) {v0 v1 v2 v3 : M} - (h0 : T v0 = (1/2 : ℂ) • v0 + (-(1/6) : ℂ) • v1 + (-(Complex.I/6)) • v2 + (-(1/6) : ℂ) • v3) - (h1 : T v1 = (5/6 : ℂ) • v1 + (-(1/6) : ℂ) • v0) - (h2 : T v2 = (5/6 : ℂ) • v2 + (Complex.I/6) • v0) - (h3 : T v3 = (5/6 : ℂ) • v3 + (-(1/6) : ℂ) • v0) : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (-(Complex.I/4)) • ((-Complex.I) • (v0 - v1 - Complex.I • v2 - v3)) := by - have i2 : T (T v3) = - (-(2/9) : ℂ) • (v0) - + (1/36 : ℂ) • (v1) - + ((1/36 : ℂ) * Complex.I) • (v2) - + (13/18 : ℂ) • (v3) := by - rw [h3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i3 : T (T (T v3)) = - (-(13/54) : ℂ) • (v0) - + (13/216 : ℂ) • (v1) - + ((13/216 : ℂ) * Complex.I) • (v2) - + (23/36 : ℂ) • (v3) := by - rw [i2] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i4 : T (T (T (T v3))) = - (-(20/81) : ℂ) • (v0) - + (13/144 : ℂ) • (v1) - + ((13/144 : ℂ) * Complex.I) • (v2) - + (371/648 : ℂ) • (v3) := by - rw [i3] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - have i5 : T (T (T (T (T v3)))) = - (-(121/486) : ℂ) • (v0) - + (905/7776 : ℂ) • (v1) - + ((905/7776 : ℂ) * Complex.I) • (v2) - + (2015/3888 : ℂ) • (v3) := by - rw [i4] - simp only [map_add, map_smul, h0, h1, h2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - rw [i5, i4, i3, i2, h3] - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean deleted file mode 100644 index 2db81364a..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnMonomials.lean +++ /dev/null @@ -1,311 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjectorOnDerivativesAndFermions -/-! -# The Lorentz-scalar projector on the weight-eight monomials - -The values of `boostAvgScalarProj` on the weight-eight monomials, the entries of the Lorentz -matrices of the rotations by `π`, and the values of the rotation average -`rotationPiAvg` on the weight-eight monomials. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F01_F01`. -/ -lemma boostAvgScalarProj_F01_F01 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF0 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F01_F23`. -/ -lemma boostAvgScalarProj_F01_F23 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (1/24 : ℂ) • thetaTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF1 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F02_F02`. -/ -lemma boostAvgScalarProj_F02_F02 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF2 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F02_F13`. -/ -lemma boostAvgScalarProj_F02_F13 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (-(1/24) : ℂ) • thetaTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF3 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F03_F03`. -/ -lemma boostAvgScalarProj_F03_F03 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) = - (-(1/12) : ℂ) • maxwellTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF4 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F03_F12`. -/ -lemma boostAvgScalarProj_F03_F12 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (1/24 : ℂ) • thetaTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF5 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← thetaTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F12_F12`. -/ -lemma boostAvgScalarProj_F12_F12 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - (1/12 : ℂ) • maxwellTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF6 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F13_F13`. -/ -lemma boostAvgScalarProj_F13_F13 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) = - (1/12 : ℂ) • maxwellTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF7 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the field-strength square `F23_F23`. -/ -lemma boostAvgScalarProj_F23_F23 : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) = - (1/12 : ℂ) • maxwellTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFF8 boostAvg boostAvg_F01_F01 boostAvg_F01_F23 boostAvg_F02_F02 boostAvg_F02_F13 boostAvg_F03_F03 boostAvg_F03_F12 boostAvg_F12_F12 - boostAvg_F13_F13 boostAvg_F23_F23, - ← maxwellTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd01_F01`. -/ -lemma boostAvgScalarProj_dd01_F01 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF0 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd01_F23`. -/ -lemma boostAvgScalarProj_dd01_F23 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF1 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd02_F02`. -/ -lemma boostAvgScalarProj_dd02_F02 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF2 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd02_F13`. -/ -lemma boostAvgScalarProj_dd02_F13 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF3 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd03_F03`. -/ -lemma boostAvgScalarProj_dd03_F03 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF4 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd03_F12`. -/ -lemma boostAvgScalarProj_dd03_F12 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF5 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd12_F03`. -/ -lemma boostAvgScalarProj_dd12_F03 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF6 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd12_F12`. -/ -lemma boostAvgScalarProj_dd12_F12 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF7 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd13_F02`. -/ -lemma boostAvgScalarProj_dd13_F02 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF8 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd13_F13`. -/ -lemma boostAvgScalarProj_dd13_F13 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF9 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd23_F01`. -/ -lemma boostAvgScalarProj_dd23_F01 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF10 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` annihilates the derivative monomial `dd23_F23`. -/ -lemma boostAvgScalarProj_dd23_F23 : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) = - (0 : JetAlgebra) := by - rw [boostAvgScalarProj_apply, - scalarProjDDF11 boostAvg boostAvg_dd01_F01 boostAvg_dd01_F23 boostAvg_dd02_F02 boostAvg_dd02_F13 boostAvg_dd03_F03 boostAvg_dd03_F12 - boostAvg_dd12_F03 boostAvg_dd12_F12 boostAvg_dd13_F02 boostAvg_dd13_F13 boostAvg_dd23_F01 boostAvg_dd23_F23] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u0`. -/ -lemma boostAvgScalarProj_u0 : - boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (-(Complex.I/4)) • fermionKineticTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFMu0 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u1`. -/ -lemma boostAvgScalarProj_u1 : - boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (Complex.I/4) • fermionKineticTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFMu1 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u2`. -/ -lemma boostAvgScalarProj_u2 : - boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (1/4 : ℂ) • fermionKineticTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFMu2 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `u3`. -/ -lemma boostAvgScalarProj_u3 : - boostAvgScalarProj (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (Complex.I/4) • fermionKineticTerm := by - rw [boostAvgScalarProj_apply, - scalarProjFMu3 boostAvg boostAvg_u0 boostAvg_u1 boostAvg_u2 boostAvg_u3, - ← fermionKineticTerm_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar0`. -/ -lemma boostAvgScalarProj_ubar0 : - boostAvgScalarProj (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (Complex.I/4) • fermionKineticTermBar := by - rw [boostAvgScalarProj_apply, - scalarProjFMubar0 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar1`. -/ -lemma boostAvgScalarProj_ubar1 : - boostAvgScalarProj (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (-(Complex.I/4)) • fermionKineticTermBar := by - rw [boostAvgScalarProj_apply, - scalarProjFMubar1 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar2`. -/ -lemma boostAvgScalarProj_ubar2 : - boostAvgScalarProj (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (-(1/4) : ℂ) • fermionKineticTermBar := by - rw [boostAvgScalarProj_apply, - scalarProjFMubar2 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, - ← fermionKineticTermBar_eq] - -set_option maxHeartbeats 2000000 in -/-- The projector `boostAvgScalarProj` on the σ-contracted fermion pair `ubar3`. -/ -lemma boostAvgScalarProj_ubar3 : - boostAvgScalarProj (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (-(Complex.I/4)) • fermionKineticTermBar := by - rw [boostAvgScalarProj_apply, - scalarProjFMubar3 boostAvg boostAvg_ubar0 boostAvg_ubar1 boostAvg_ubar2 boostAvg_ubar3, - ← fermionKineticTermBar_eq] -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean deleted file mode 100644 index 16b6d0c65..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/BoostAvgProjectorOnPhotonPairs.lean +++ /dev/null @@ -1,355 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjector -/-! -# The Lorentz-scalar projector on the photon pairs - -`boostAvgScalarProj` is the polynomial in `boostAvg` that annihilates every eigenvalue of -`boostAvg` other than `1`; it therefore fixes the Lorentz-invariant vectors and projects the -weight-eight monomials onto the invariant subspace. The `scalarProjFF*` lemmas evaluate that -polynomial on the nine products of two field strengths. - -Each is proved by decomposing the monomial into eigenvectors of the average and applying -`sylvesterEnd_of_eigen`: the polynomial was built to kill the five non-unit eigenvalues, so only -the eigenvalue-one part survives. On the six squares `F01_F01, …, F23_F23` the average acts as -`2/3 - (1/6) A` for `A` the adjacency of the six-cycle `F01, F12, F02, F23, F03, F13`, whose -eigenvalues `2, 1, 1, -1, -1, -2` give the average the eigenvalues `1/3, 1/2, 1/2, 5/6, 5/6, 1`; -the alternating vector around that cycle is the Maxwell term. On the three products -`F01_F23, F02_F13, F03_F12` the average has eigenvalues `1/2, 1/2, 1`, the invariant being the -theta term. - -No iterate of the operator is computed: every proof applies the average once, inside the -eigenvector lemmas, which is why no heartbeat bump is needed here. --/ - -@[expose] public section - -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -variable {M : Type*} [AddCommGroup M] [Module ℂ M] -variable (T : Module.End ℂ M) {v0 v1 v2 v3 v4 v5 v6 v7 v8 : M} -variable - (h0 : T v0 = (2/3 : ℂ) • v0 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v7) - (h1 : T v1 = (2/3 : ℂ) • v1 + (-(1/6) : ℂ) • v3 + (1/6 : ℂ) • v5) - (h2 : T v2 = (2/3 : ℂ) • v2 + (-(1/6) : ℂ) • v6 + (-(1/6) : ℂ) • v8) - (h3 : T v3 = (2/3 : ℂ) • v3 + (-(1/6) : ℂ) • v1 + (-(1/6) : ℂ) • v5) - (h4 : T v4 = (2/3 : ℂ) • v4 + (-(1/6) : ℂ) • v7 + (-(1/6) : ℂ) • v8) - (h5 : T v5 = (2/3 : ℂ) • v5 + (1/6 : ℂ) • v1 + (-(1/6) : ℂ) • v3) - (h6 : T v6 = (2/3 : ℂ) • v6 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v2) - (h7 : T v7 = (2/3 : ℂ) • v7 + (-(1/6) : ℂ) • v0 + (-(1/6) : ℂ) • v4) - (h8 : T v8 = (2/3 : ℂ) • v8 + (-(1/6) : ℂ) • v2 + (-(1/6) : ℂ) • v4) - -/-! - -## A. The eigenvectors of the average on the field-strength squares - --/ - -include h0 h2 h4 h6 h7 h8 in -/-- The Maxwell combination is invariant: the alternating vector on the six-cycle. -/ -lemma ffEigenMaxwell : T (v0 + v2 + v4 - v6 - v7 - v8) = (1 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by - simp only [map_add, map_sub, h0, h2, h4, h6, h7, h8] - module - -include h0 h2 h4 h6 h7 h8 in -/-- The total sum of the squares is an eigenvector of eigenvalue `1/3`. -/ -lemma ffEigenTrace : T (v0 + v2 + v4 + v6 + v7 + v8) = (1/3 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) := by - simp only [map_add, h0, h2, h4, h6, h7, h8] - module - -include h0 h2 h4 h6 h7 h8 in -/-- First eigenvector of eigenvalue `1/2`. -/ -lemma ffEigenHalf₁ : T ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) = - (1/2 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) := by - simp only [map_add, map_sub, map_smul, h0, h2, h4, h6, h7, h8] - module - -include h2 h4 h6 h7 in -/-- Second eigenvector of eigenvalue `1/2`. -/ -lemma ffEigenHalf₂ : T (v2 - v4 + v6 - v7) = (1/2 : ℂ) • (v2 - v4 + v6 - v7) := by - simp only [map_add, map_sub, h2, h4, h6, h7] - module - -include h0 h2 h4 h6 h7 h8 in -/-- First eigenvector of eigenvalue `5/6`. -/ -lemma ffEigenFiveSixths₁ : T ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) = - (5/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) := by - simp only [map_add, map_sub, map_smul, h0, h2, h4, h6, h7, h8] - module - -include h2 h4 h6 h7 in -/-- Second eigenvector of eigenvalue `5/6`. -/ -lemma ffEigenFiveSixths₂ : T (-v2 + v4 + v6 - v7) = (5/6 : ℂ) • (-v2 + v4 + v6 - v7) := by - simp only [map_add, map_sub, map_neg, h2, h4, h6, h7] - module - -/-! - -## B. The eigenvectors of the average on the dual pairs - --/ - -include h1 h3 h5 in -/-- The theta combination is invariant. -/ -lemma ffEigenTheta : T (v1 - v3 + v5) = (1 : ℂ) • (v1 - v3 + v5) := by - simp only [map_add, map_sub, h1, h3, h5] - module - -include h1 h3 in -/-- First eigenvector of eigenvalue `1/2` on the dual pairs. -/ -lemma ffEigenThetaHalf₁ : T (v1 + v3) = (1/2 : ℂ) • (v1 + v3) := by - simp only [map_add, h1, h3] - module - -include h1 h5 in -/-- Second eigenvector of eigenvalue `1/2` on the dual pairs. -/ -lemma ffEigenThetaHalf₂ : T (-v1 + v5) = (1/2 : ℂ) • (-v1 + v5) := by - simp only [map_add, map_neg, h1, h5] - module - -/-! - -## C. The projector on each column - --/ - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 0 of the FF block, the field-strength square `F01_F01`. -/ -lemma scalarProjFF0 : - (-1 : ℂ) • v0 + (137/10 : ℂ) • T v0 + (-(135/2) : ℂ) • T (T v0) - + (153 : ℂ) • T (T (T v0)) + (-162 : ℂ) • T (T (T (T v0))) - + (324/5 : ℂ) • T (T (T (T (T v0)))) = - (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + - (2 : ℂ) • v8) := by - have key : sylvesterEnd T v0 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by - conv_lhs => - rw [show v0 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) - + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) - + (1/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) - + (1/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), - sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 1 of the FF block, the field-strength product `F01_F23`. -/ -lemma scalarProjFF1 : - (-1 : ℂ) • v1 + (137/10 : ℂ) • T v1 + (-(135/2) : ℂ) • T (T v1) - + (153 : ℂ) • T (T (T v1)) + (-162 : ℂ) • T (T (T (T v1))) - + (324/5 : ℂ) • T (T (T (T (T v1)))) = - (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have key : sylvesterEnd T v1 = (1/3 : ℂ) • (v1 - v3 + v5) := by - conv_lhs => - rw [show v1 = (1/3 : ℂ) • (v1 - v3 + v5) - + (1/3 : ℂ) • (v1 + v3) - + (-(1/3) : ℂ) • (-v1 + v5) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenTheta T h1 h3 h5), - sylvesterEnd_of_eigen (ffEigenThetaHalf₁ T h1 h3), - sylvesterEnd_of_eigen (ffEigenThetaHalf₂ T h1 h5), - sylvester_one, sylvester_half] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 2 of the FF block, the field-strength square `F02_F02`. -/ -lemma scalarProjFF2 : - (-1 : ℂ) • v2 + (137/10 : ℂ) • T v2 + (-(135/2) : ℂ) • T (T v2) - + (153 : ℂ) • T (T (T v2)) + (-162 : ℂ) • T (T (T (T v2))) - + (324/5 : ℂ) • T (T (T (T (T v2)))) = - (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + - (2 : ℂ) • v8) := by - have key : sylvesterEnd T v2 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by - conv_lhs => - rw [show v2 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) - + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) - + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) - + (1/4 : ℂ) • (v2 - v4 + v6 - v7) - + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) - + (-(1/4) : ℂ) • (-v2 + v4 + v6 - v7) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), - sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), - sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 3 of the FF block, the field-strength product `F02_F13`. -/ -lemma scalarProjFF3 : - (-1 : ℂ) • v3 + (137/10 : ℂ) • T v3 + (-(135/2) : ℂ) • T (T v3) - + (153 : ℂ) • T (T (T v3)) + (-162 : ℂ) • T (T (T (T v3))) - + (324/5 : ℂ) • T (T (T (T (T v3)))) = - (-(1/24) : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have key : sylvesterEnd T v3 = (-(1/3) : ℂ) • (v1 - v3 + v5) := by - conv_lhs => - rw [show v3 = (-(1/3) : ℂ) • (v1 - v3 + v5) - + (2/3 : ℂ) • (v1 + v3) - + (1/3 : ℂ) • (-v1 + v5) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenTheta T h1 h3 h5), - sylvesterEnd_of_eigen (ffEigenThetaHalf₁ T h1 h3), - sylvesterEnd_of_eigen (ffEigenThetaHalf₂ T h1 h5), - sylvester_one, sylvester_half] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 4 of the FF block, the field-strength square `F03_F03`. -/ -lemma scalarProjFF4 : - (-1 : ℂ) • v4 + (137/10 : ℂ) • T v4 + (-(135/2) : ℂ) • T (T v4) - + (153 : ℂ) • T (T (T v4)) + (-162 : ℂ) • T (T (T (T v4))) - + (324/5 : ℂ) • T (T (T (T (T v4)))) = - (-(1/12) : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + - (2 : ℂ) • v8) := by - have key : sylvesterEnd T v4 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by - conv_lhs => - rw [show v4 = (1/6 : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) - + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) - + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) - + (-(1/4) : ℂ) • (v2 - v4 + v6 - v7) - + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) - + (1/4 : ℂ) • (-v2 + v4 + v6 - v7) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), - sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), - sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 5 of the FF block, the field-strength product `F03_F12`. -/ -lemma scalarProjFF5 : - (-1 : ℂ) • v5 + (137/10 : ℂ) • T v5 + (-(135/2) : ℂ) • T (T v5) - + (153 : ℂ) • T (T (T v5)) + (-162 : ℂ) • T (T (T (T v5))) - + (324/5 : ℂ) • T (T (T (T (T v5)))) = - (1/24 : ℂ) • ((8 : ℂ) • v1 + (-8 : ℂ) • v3 + (8 : ℂ) • v5) := by - have key : sylvesterEnd T v5 = (1/3 : ℂ) • (v1 - v3 + v5) := by - conv_lhs => - rw [show v5 = (1/3 : ℂ) • (v1 - v3 + v5) - + (1/3 : ℂ) • (v1 + v3) - + (2/3 : ℂ) • (-v1 + v5) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenTheta T h1 h3 h5), - sylvesterEnd_of_eigen (ffEigenThetaHalf₁ T h1 h3), - sylvesterEnd_of_eigen (ffEigenThetaHalf₂ T h1 h5), - sylvester_one, sylvester_half] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 6 of the FF block, the field-strength square `F12_F12`. -/ -lemma scalarProjFF6 : - (-1 : ℂ) • v6 + (137/10 : ℂ) • T v6 + (-(135/2) : ℂ) • T (T v6) - + (153 : ℂ) • T (T (T v6)) + (-162 : ℂ) • T (T (T (T v6))) - + (324/5 : ℂ) • T (T (T (T (T v6)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + - (2 : ℂ) • v8) := by - have key : sylvesterEnd T v6 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by - conv_lhs => - rw [show v6 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) - + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) - + (1/12 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) - + (1/4 : ℂ) • (v2 - v4 + v6 - v7) - + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) - + (1/4 : ℂ) • (-v2 + v4 + v6 - v7) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), - sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), - sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 7 of the FF block, the field-strength square `F13_F13`. -/ -lemma scalarProjFF7 : - (-1 : ℂ) • v7 + (137/10 : ℂ) • T v7 + (-(135/2) : ℂ) • T (T v7) - + (153 : ℂ) • T (T (T v7)) + (-162 : ℂ) • T (T (T (T v7))) - + (324/5 : ℂ) • T (T (T (T (T v7)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + - (2 : ℂ) • v8) := by - have key : sylvesterEnd T v7 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by - conv_lhs => - rw [show v7 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) - + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) - + (1/12 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) - + (-(1/4) : ℂ) • (v2 - v4 + v6 - v7) - + (-(1/12) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) - + (-(1/4) : ℂ) • (-v2 + v4 + v6 - v7) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₂ T h2 h4 h6 h7), - sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenFiveSixths₂ T h2 h4 h6 h7), - sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] - module - rw [← sylvesterEnd_apply, key] - module - -include h0 h1 h2 h3 h4 h5 h6 h7 h8 in -/-- The projector polynomial on column 8 of the FF block, the field-strength square `F23_F23`. -/ -lemma scalarProjFF8 : - (-1 : ℂ) • v8 + (137/10 : ℂ) • T v8 + (-(135/2) : ℂ) • T (T v8) - + (153 : ℂ) • T (T (T v8)) + (-162 : ℂ) • T (T (T (T v8))) - + (324/5 : ℂ) • T (T (T (T (T v8)))) = - (1/12 : ℂ) • ((-2 : ℂ) • v0 + (-2 : ℂ) • v2 + (-2 : ℂ) • v4 + (2 : ℂ) • v6 + (2 : ℂ) • v7 + - (2 : ℂ) • v8) := by - have key : sylvesterEnd T v8 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) := by - conv_lhs => - rw [show v8 = (-(1/6) : ℂ) • (v0 + v2 + v4 - v6 - v7 - v8) - + (1/6 : ℂ) • (v0 + v2 + v4 + v6 + v7 + v8) - + (-(1/6) : ℂ) • ((2 : ℂ) • v0 - v2 - v4 + v6 + v7 - (2 : ℂ) • v8) - + (1/6 : ℂ) • ((2 : ℂ) • v0 - v2 - v4 - v6 - v7 + (2 : ℂ) • v8) from by module] - simp only [map_add, map_smul, - sylvesterEnd_of_eigen (ffEigenMaxwell T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenTrace T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenHalf₁ T h0 h2 h4 h6 h7 h8), - sylvesterEnd_of_eigen (ffEigenFiveSixths₁ T h0 h2 h4 h6 h7 h8), - sylvester_one, sylvester_third, sylvester_half, sylvester_five_sixths] - module - rw [← sylvesterEnd_apply, key] - module - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean deleted file mode 100644 index 2b8d3a302..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationAverage.lean +++ /dev/null @@ -1,1233 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Subgroups.AxisBoosts -/-! -# The average over the rotations by `π` - -The average `rotationPiAvg` over the Klein four-group of rotations by `π` -defined in `Subgroups/RotationsPi`. Being a finite subgroup it admits an honest -invariant average — the Reynolds operator — unlike the boosts of -`Averages/BoostAverage`. - -By the averaging principle of `Invariants/GroupAverage` an invariant element of -the span of a family lies in the span of the averages of that family, so it -suffices to evaluate `rotationPiAvg` on the monomials of `Grading/NeutralSectors`. -Every field strength averages to zero, which already settles the weight-four -sector (`eq_zero_of_mem_chargeCovSpan_four`); the values on the weight-eight -monomials are tabulated in the rest of the file. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The average over the rotations by `π`: the mean of the identity and the three - lifted rotations, an honest average over the Klein four-group (its lift to - `SL(2,ℂ)` is the quaternion group, which acts through the same four operators on - the even sectors met here). -/ -noncomputable def rotationPiAvg : Module.End ℂ JetAlgebra := - (4 : ℂ)⁻¹ • (LinearMap.id + repLorentzGroup rotationPiZ + - repLorentzGroup rotationPiY + repLorentzGroup rotationPiX) - -/-- The rotation average, termwise. -/ -lemma rotationPiAvg_apply (v : JetAlgebra) : - rotationPiAvg v = (4 : ℂ)⁻¹ • (v + repLorentzGroup rotationPiZ v + - repLorentzGroup rotationPiY v + repLorentzGroup rotationPiX v) := by - simp only [rotationPiAvg, LinearMap.smul_apply, LinearMap.add_apply, - LinearMap.id_apply] - -/-- The rotation average fixes every Lorentz-invariant element. Its four weights sum - to one, so this is the instance of `Representation.weightedSum_apply_of_invariant` - at the four lifted rotations by `π`. -/ -lemma rotationPiAvg_apply_of_invariant {y : JetAlgebra} - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : rotationPiAvg y = y := by - rw [rotationPiAvg_apply, hinv, hinv, hinv] - module - -/-- The averaging principle for the rotation average: a Lorentz-invariant element of - the span of a family lies in the span of the rotation averages of that family. - This is `Submodule.mem_span_range_of_apply_eq_self` for `rotationPiAvg`. -/ -lemma mem_span_range_rotationPiAvg {ι : Type} {v : ι → JetAlgebra} {y : JetAlgebra} - (hy : y ∈ Submodule.span ℂ (Set.range v)) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : - y ∈ Submodule.span ℂ (Set.range fun i => rotationPiAvg (v i)) := - Submodule.mem_span_range_of_apply_eq_self hy (rotationPiAvg_apply_of_invariant hinv) - -set_option maxHeartbeats 2000000 in -/-- The rotation average annihilates every field strength: `F_{μμ}` vanishes, and for - `μ ≠ ν` the pair `F_{μν}` is odd under two of the three rotations by `π`, so the - four signs cancel. -/ -lemma rotationPiAvg_fieldStrengthDeriv_nil (μ ν : Fin 1 ⊕ Fin 3) : - rotationPiAvg (fieldStrengthDeriv {} μ ν) = 0 := by - rw [rotationPiAvg_apply] - rcases eq_or_ne μ ν with hp | hp - · rw [hp, fieldStrengthDeriv_self] - simp - · rw [repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiZ, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiY, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiX] - have hs : (1 : ℂ) + ((rotationPiSignZ μ * rotationPiSignZ ν : ℝ) : ℂ) + - ((rotationPiSignY μ * rotationPiSignY ν : ℝ) : ℂ) + - ((rotationPiSignX μ * rotationPiSignX ν : ℝ) : ℂ) = 0 := by - rcases μ with μ | μ <;> rcases ν with ν | ν <;> - first - | (exact absurd rfl (by simpa using hp)) - | (fin_cases μ <;> fin_cases ν <;> - simp_all [rotationPiSignZ, rotationPiSignY, rotationPiSignX] <;> - norm_num [Complex.ext_iff] <;> ring) - have hcomb : ∀ (a b c : ℂ) (x : JetAlgebra), - x + a • x + b • x + c • x = (1 + a + b + c) • x := by - intro a b c x - module - rw [hcomb, hs, zero_smul, smul_zero] - -/-- No Lorentz invariant of mass weight four: an invariant combination of the - field strengths `F_{μν}` lies, by the averaging principle, in the span of their - rotation averages, and each of those vanishes. -/ -lemma eq_zero_of_mem_chargeCovSpan_four {y : JetAlgebra} - (hy : y ∈ chargeCovSpan 4 0) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by - have h := mem_span_range_rotationPiAvg (chargeCovSpan_four_le hy) hinv - have hle : Submodule.span ℂ (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - rotationPiAvg (fieldStrengthDeriv {} p.1 p.2)) ≤ ⊥ := by - rw [Submodule.span_le] - rintro _ ⟨p, rfl⟩ - simpa using rotationPiAvg_fieldStrengthDeriv_nil p.1 p.2 - exact (Submodule.mem_bot ℂ).mp (hle h) - - -set_option maxHeartbeats 2000000 in -/-- The rotation average acts diagonally on products of two field strengths, by - the average of the four parity signs. -/ -lemma rotationPiAvg_fieldStrengthDeriv_nil_mul (a b c d : Fin 1 ⊕ Fin 3) : - rotationPiAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = - (((1 + rotationPiSignZ a * rotationPiSignZ b * (rotationPiSignZ c * rotationPiSignZ d) + - rotationPiSignY a * rotationPiSignY b * (rotationPiSignY c * rotationPiSignY d) + - rotationPiSignX a * rotationPiSignX b * (rotationPiSignX c * rotationPiSignX d)) / 4 : ℝ) : ℂ) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_apply_mul, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiZ, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiY, - repLorentzGroup_diag_fieldStrengthDeriv toLorentzGroup_rotationPiX, - smul_mul_smul_comm] - push_cast - module - -/-- Under a diagonal Lorentz transformation the second-derivative field - strength scales by the product of the signs of its four indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv_pair {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {ρ, τ} μ ν) = - ((sgn ρ * (sgn τ * (sgn μ * sgn ν)) : ℝ) : ℂ) • - fieldStrengthDeriv {ρ, τ} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_pair] - rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun s _ => - Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by - rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ρ) h)] - rw [Finset.sum_eq_single τ (fun s _ hs => Finset.sum_eq_zero fun a _ => - Finset.sum_eq_zero fun b _ => by - rw [hM s τ, if_neg hs, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ τ) h)] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, mul_zero, mul_zero, Complex.ofReal_zero, - zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, mul_zero, mul_zero, Complex.ofReal_zero, - zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM ρ ρ, if_pos rfl, hM τ τ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, - if_pos rfl] - -/-- The rotation average acts diagonally on the second-derivative field - strengths. -/ -lemma rotationPiAvg_fieldStrengthDeriv_pair (r t a b : Fin 1 ⊕ Fin 3) : - rotationPiAvg (fieldStrengthDeriv {r, t} a b) = - (((1 + rotationPiSignZ r * (rotationPiSignZ t * (rotationPiSignZ a * rotationPiSignZ b)) + - rotationPiSignY r * (rotationPiSignY t * (rotationPiSignY a * rotationPiSignY b)) + - rotationPiSignX r * (rotationPiSignX t * (rotationPiSignX a * rotationPiSignX b))) / 4 : ℝ) : ℂ) • - fieldStrengthDeriv {r, t} a b := by - rw [rotationPiAvg_apply, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_rotationPiZ, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_rotationPiY, - repLorentzGroup_diag_fieldStrengthDeriv_pair toLorentzGroup_rotationPiX] - push_cast - module - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,0,0]` (u-family). -/ -lemma rotationPiAvg_u_e000 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,0,1]` (u-family). -/ -lemma rotationPiAvg_u_e001 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,1,0]` (u-family). -/ -lemma rotationPiAvg_u_e010 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,1,1]` (u-family). -/ -lemma rotationPiAvg_u_e011 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,0,0]` (u-family). -/ -lemma rotationPiAvg_u_e100 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,0,1]` (u-family). -/ -lemma rotationPiAvg_u_e101 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,1,0]` (u-family). -/ -lemma rotationPiAvg_u_e110 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,1,1]` (u-family). -/ -lemma rotationPiAvg_u_e111 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,0,0]` (u-family). -/ -lemma rotationPiAvg_u_e200 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,0,1]` (u-family). -/ -lemma rotationPiAvg_u_e201 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,1,0]` (u-family). -/ -lemma rotationPiAvg_u_e210 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0) = - (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,1,1]` (u-family). -/ -lemma rotationPiAvg_u_e211 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,0,0]` (u-family). -/ -lemma rotationPiAvg_u_e300 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0) = - (1/2 : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,0,1]` (u-family). -/ -lemma rotationPiAvg_u_e301 : - rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,1,0]` (u-family). -/ -lemma rotationPiAvg_u_e310 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,1,1]` (u-family). -/ -lemma rotationPiAvg_u_e311 : - rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1) = - (-(1/2) : ℂ) • (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [] 0 * Dψ [Sum.inl 0] 0 : JetAlgebra) = X0, (Dbarψ [] 1 * Dψ [Sum.inl 0] 1 : - JetAlgebra) = X1, (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 : JetAlgebra) = X2, (Dbarψ [] 1 * Dψ [Sum.inr - 0] 0 : JetAlgebra) = X3, (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 : JetAlgebra) = X4, (Dbarψ [] 1 * Dψ - [Sum.inr 1] 0 : JetAlgebra) = X5, (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 : JetAlgebra) = X6, (Dbarψ [] - 1 * Dψ [Sum.inr 2] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,0,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e000 : - rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,0,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e001 : - rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,1,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e010 : - rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[0,1,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e011 : - rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,0,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e100 : - rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,0,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e101 : - rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,1,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e110 : - rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[1,1,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e111 : - rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,0,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e200 : - rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,0,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e201 : - rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,1,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e210 : - rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0) = - (-(1/2) : ℂ) • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[2,1,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e211 : - rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,0,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e300 : - rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0) = - (1/2 : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,0,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e301 : - rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,1,0]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e310 : - rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0) = - 0 := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) - -set_option maxHeartbeats 4000000 in -/-- The rotation average of the fermion pair monomial `e[3,1,1]` (ubar-family). -/ -lemma rotationPiAvg_ubar_e311 : - rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1) = - (-(1/2) : ℂ) • (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1) := by - rw [rotationPiAvg_apply] - simp only [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil, - rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - rotationPiMatZ_00, rotationPiMatZ_01, rotationPiMatZ_02, rotationPiMatZ_03, rotationPiMatZ_10, rotationPiMatZ_11, - rotationPiMatZ_12, rotationPiMatZ_13, rotationPiMatZ_20, rotationPiMatZ_21, rotationPiMatZ_22, rotationPiMatZ_23, - rotationPiMatZ_30, rotationPiMatZ_31, rotationPiMatZ_32, rotationPiMatZ_33, rotationPiMatX_00, rotationPiMatX_01, - rotationPiMatX_02, rotationPiMatX_03, rotationPiMatX_10, rotationPiMatX_11, rotationPiMatX_12, rotationPiMatX_13, - rotationPiMatX_20, rotationPiMatX_21, rotationPiMatX_22, rotationPiMatX_23, rotationPiMatX_30, rotationPiMatX_31, - rotationPiMatX_32, rotationPiMatX_33, rotationPiMatY_00, rotationPiMatY_01, rotationPiMatY_02, rotationPiMatY_03, - rotationPiMatY_10, rotationPiMatY_11, rotationPiMatY_12, rotationPiMatY_13, rotationPiMatY_20, rotationPiMatY_21, - rotationPiMatY_22, rotationPiMatY_23, rotationPiMatY_30, rotationPiMatY_31, rotationPiMatY_32, rotationPiMatY_33, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, map_one, map_neg, - Complex.conj_ofReal, Complex.conj_I, star_zero, star_neg, star_one, - mul_zero, zero_mul, mul_one, one_mul, neg_mul, mul_neg, neg_neg, - Complex.ofReal_zero, Complex.ofReal_one, Complex.ofReal_neg, - zero_smul, smul_zero, smul_neg, neg_smul, add_zero, zero_add, neg_zero, - Complex.I_mul_I] - generalize (Dbarψ [Sum.inl 0] 0 * Dψ [] 0 : JetAlgebra) = X0, (Dbarψ [Sum.inl 0] 1 * Dψ [] 1 : - JetAlgebra) = X1, (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 : JetAlgebra) = X2, (Dbarψ [Sum.inr 0] 1 * Dψ - [] 0 : JetAlgebra) = X3, (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 : JetAlgebra) = X4, (Dbarψ [Sum.inr 1] - 1 * Dψ [] 0 : JetAlgebra) = X5, (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 : JetAlgebra) = X6, (Dbarψ - [Sum.inr 2] 1 * Dψ [] 1 : JetAlgebra) = X7 - match_scalars <;> (try norm_num; try ring_nf; try norm_num [Complex.I_sq]) -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean deleted file mode 100644 index 394d4034a..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Averages/RotationPiBoostAverage.lean +++ /dev/null @@ -1,164 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.RotationAverage -/-! -# The rotation average weighted against two boosts - -The operator `rotationPiBoostAvg`: the rotation average of -`Averages/RotationAverage` followed by a weighting of the identity against the -two `z`-boosts `boostZ2`, `boostZ3` of `Subgroups/AxisBoosts`. - -The three weights `-13/24, 8/3, -9/8` sum to one, so the operator still fixes -every Lorentz-invariant element, but they are chosen so that -`w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}`, which kills -both eigendirections of the two boosts. Since the boosts are non-compact this -weighting is what stands in for an invariant average — the same device that -`Averages/BoostAverage` uses on the weight-eight sector. It annihilates the -neutral weight-six sector outright (`eq_zero_of_mem_chargeCovSpan_six`). --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The boost-weighted rotation average: an operator fixing every - Lorentz-invariant vector and annihilating the neutral weight-six sector. - The weights `-13/24, 8/3, -9/8` sum to one and are chosen so that - `w₁ + w₂ t² + w₃ s² = 0` for `t² ∈ {4, 1/4}` and `s² ∈ {9, 1/9}` - respectively, killing both eigendirections of the two boosts. -/ -noncomputable def rotationPiBoostAvg : Module.End ℂ JetAlgebra := - ((-13/24 : ℂ) • LinearMap.id + (8/3 : ℂ) • repLorentzGroup boostZ2 + - (-9/8 : ℂ) • repLorentzGroup boostZ3) ∘ₗ rotationPiAvg - -/-- The kill operator, termwise. -/ -lemma rotationPiBoostAvg_apply (v : JetAlgebra) : - rotationPiBoostAvg v = (-13/24 : ℂ) • rotationPiAvg v + - (8/3 : ℂ) • repLorentzGroup boostZ2 (rotationPiAvg v) + - (-9/8 : ℂ) • repLorentzGroup boostZ3 (rotationPiAvg v) := by - simp only [rotationPiBoostAvg, LinearMap.comp_apply, LinearMap.add_apply, - LinearMap.smul_apply, LinearMap.id_apply] - -set_option maxHeartbeats 8000000 in -/-- The kill operator annihilates every embedded derivative field strength: - the rotation average kills every component with an odd index pattern, and the - boost combination kills the twelve surviving components. -/ -lemma rotationPiBoostAvg_fieldStrengthDeriv_singleton (ρ μ ν : Fin 1 ⊕ Fin 3) : - rotationPiBoostAvg (fieldStrengthDeriv {ρ} μ ν) = 0 := by - rcases eq_or_ne μ ν with rfl | hμν - · rw [fieldStrengthDeriv_self] - exact map_zero _ - · have hK : rotationPiAvg (fieldStrengthDeriv {ρ} μ ν) = - (((1 + rotationPiSignZ ρ * (rotationPiSignZ μ * rotationPiSignZ ν) + - rotationPiSignY ρ * (rotationPiSignY μ * rotationPiSignY ν) + - rotationPiSignX ρ * (rotationPiSignX μ * rotationPiSignX ν)) / 4 : ℝ) : ℂ) • - fieldStrengthDeriv {ρ} μ ν := by - rw [rotationPiAvg_apply, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_rotationPiZ, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_rotationPiY, - repLorentzGroup_diag_fieldStrengthDeriv_singleton toLorentzGroup_rotationPiX] - push_cast - module - rw [rotationPiBoostAvg_apply, hK, map_smul, map_smul] - rcases ρ with ρ | ρ <;> rcases μ with μ | μ <;> rcases ν with ν | ν <;> - fin_cases ρ <;> fin_cases μ <;> fin_cases ν <;> - first - | (simp only [fieldStrengthDeriv_self, map_zero, smul_zero, add_zero]; done) - | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX]; done) - | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX] - rw [repLorentzGroup_fieldStrengthDeriv_singleton boostZ2, - repLorentzGroup_fieldStrengthDeriv_singleton boostZ3] - simp only [Fintype.sum_sum_type, Fin.sum_univ_three, Fin.sum_univ_one, - toLorentzGroup_boostZ2, toLorentzGroup_boostZ3] - norm_num [boostMatA, boostMatB, fieldStrengthDeriv_self, - fieldStrengthDeriv_inr_inl] - push_cast - module) - -set_option maxHeartbeats 4000000 in -/-- The kill operator annihilates every zero-derivative pair `ψ̄_α ψ_β`: the - rotation average kills the off-diagonal pairs and symmetrises the diagonal - ones, which the boost combination then kills. -/ -lemma rotationPiBoostAvg_Dbarψ_mul_Dψ (α β : Fin 2) : - rotationPiBoostAvg (Dbarψ [] α * Dψ [] β) = 0 := by - rw [rotationPiBoostAvg_apply, rotationPiAvg_apply] - fin_cases α <;> fin_cases β <;> - · simp only [repLorentzGroup_Dbarψ_nil_mul_Dψ_nil, map_add, map_smul, - map_sum, rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - boostZ2_inv_coe, boostZ3_inv_coe, Fin.sum_univ_two, Fin.zero_eta, - Fin.mk_one, Matrix.of_apply, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, - star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, - Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, - neg_neg, - zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, - Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] - try push_cast - try module - -set_option maxHeartbeats 4000000 in -/-- The kill operator annihilates every zero-derivative pair `ψ_α ψ̄_β`. -/ -lemma rotationPiBoostAvg_Dψ_mul_Dbarψ (α β : Fin 2) : - rotationPiBoostAvg (Dψ [] α * Dbarψ [] β) = 0 := by - rw [rotationPiBoostAvg_apply, rotationPiAvg_apply] - fin_cases α <;> fin_cases β <;> - · simp only [repLorentzGroup_Dψ_nil_mul_Dbarψ_nil, map_add, map_smul, - map_sum, rotationPiZ_inv_coe, rotationPiY_inv_coe, rotationPiX_inv_coe, - boostZ2_inv_coe, boostZ3_inv_coe, Fin.sum_univ_two, Fin.zero_eta, - Fin.mk_one, Matrix.of_apply, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.head_cons, Matrix.head_fin_const, Matrix.empty_val', - Matrix.cons_val_fin_one, - star_zero, star_neg, star_one, Complex.star_def, Complex.conj_I, - Complex.conj_ofReal, map_one, map_zero, map_neg, neg_mul, mul_neg, - neg_neg, - zero_mul, mul_zero, zero_smul, smul_zero, add_zero, zero_add, - Complex.I_mul_I, one_mul, mul_one, smul_add, smul_smul, Finset.smul_sum] - try push_cast - try module - -/-- No Lorentz invariant of mass weight six: an invariant combination of the - field-strength derivatives `∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β` - vanishes. -/ -lemma eq_zero_of_mem_chargeCovSpan_six {y : JetAlgebra} - (hy : y ∈ chargeCovSpan 6 0) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) : y = 0 := by - have h := chargeCovSpan_six_le hy - rw [Submodule.span_union, Submodule.span_union] at h - obtain ⟨u, hu, w, hw, hy'⟩ := Submodule.mem_sup.mp h - obtain ⟨u1, hu1, u2, hu2, hu'⟩ := Submodule.mem_sup.mp hu - obtain ⟨a, ha⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu1 - obtain ⟨d, hd⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hu2 - obtain ⟨e, he⟩ := (Submodule.mem_span_range_iff_exists_fun ℂ).mp hw - have hKy : rotationPiAvg y = y := by - rw [rotationPiAvg_apply, hinv rotationPiZ, hinv rotationPiY, hinv rotationPiX] - module - have hself : rotationPiBoostAvg y = y := by - rw [rotationPiBoostAvg_apply, hKy, hinv boostZ2, hinv boostZ3] - module - have hkill : rotationPiBoostAvg y = 0 := by - rw [← hy', ← hu', ← ha, ← hd, ← he] - simp only [map_add, map_sum, map_smul, rotationPiBoostAvg_fieldStrengthDeriv_singleton, - rotationPiBoostAvg_Dbarψ_mul_Dψ, rotationPiBoostAvg_Dψ_mul_Dbarψ, smul_zero, - Finset.sum_const_zero, add_zero] - exact hself.symm.trans hkill - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean deleted file mode 100644 index 75732f447..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Basic.lean +++ /dev/null @@ -1,65 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Invariants.GroupAverage -/-! -# The renormalizable terms of the lepton–gauge-sector jet algebra - -The four gauge- and Lorentz-invariant elements of mass dimension at most four — -the Maxwell term, the theta term and the two fermion kinetic terms, defined in -`Terms/` — collected into one set, together with the easy half of the -classification: their span is contained in `InvariantMassWeightSubmodule 8`. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The invariants of the lepton–gauge-sector jet algebra of mass dimension at most four: the - constants and the four kinetic terms. These span - `InvariantMassWeightSubmodule 8`, the renormalizable Lagrangian densities of the lepton–gauge sector. -/ -def massDimFourInvariants : Set JetAlgebra := - {1, maxwellTerm, thetaTerm, fermionKineticTerm, fermionKineticTermBar} - -/-- Every element of `massDimFourInvariants` is gauge and Lorentz invariant. -/ -lemma isInvariant_of_mem_massDimFourInvariants {x : JetAlgebra} - (hx : x ∈ massDimFourInvariants) : IsInvariant x := by - rcases hx with rfl | rfl | rfl | rfl | rfl - · exact ⟨fun U => (repJetGaugeGroupI_eq_repAlgHom U 1).trans (repAlgHom U).map_one, - repLorentzGroup_apply_one⟩ - · exact ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ - · exact ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ - · exact ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ - · exact ⟨repJetGaugeGroupI_fermionKineticTermBar, - repLorentzGroup_fermionKineticTermBar⟩ - -lemma span_massDimFourInvariants_le : - Submodule.span ℂ massDimFourInvariants ≤ InvariantMassWeightSubmodule 8 := by - rw [Submodule.span_le] - intro x hx - refine Submodule.mem_inf.mpr ⟨?_, Submodule.subset_span - (isInvariant_of_mem_massDimFourInvariants hx)⟩ - rcases hx with rfl | rfl | rfl | rfl | rfl - · exact mem_massWeightLESubmodule_of_mem (m := 0) (Nat.zero_le 8) - (SetLike.one_mem_graded massWeightSubmodule) - · exact maxwellTerm_mem_massWeightLESubmodule - · exact thetaTerm_mem_massWeightLESubmodule - · exact fermionKineticTerm_mem_massWeightLESubmodule - · exact fermionKineticTermBar_mem_massWeightLESubmodule - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean deleted file mode 100644 index 4fee87ba9..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/MassWeightAndHypercharge.lean +++ /dev/null @@ -1,575 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Basic -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.Hypercharge -/-! -# The mass-weight and hypercharge gradings - -The machinery for the converse inclusion. That an element of -`MassWeightLESubmodule n` decomposes into its homogeneous pieces is not special to the -invariants and lives with the grading itself, in -`LeptonGaugeSector.JetAlgebra.eq_sum_coeff_of_mem_massWeightLESubmodule` in -`LeptonGaugeSector/JetAlgebra/MassDim`, as the coefficients of the mass-weight polynomial. -What is added here is the refinement specific to the classification: -each eigenvector lies in the span `covMonomialSpan w` of covariant monomials of -exact weight `w`, and each of those decomposes further into hypercharge -eigenspaces `chargeCovSpan w k`. Both decompositions are compatible with the -Lorentz and gauge actions, so an invariant element is a sum of invariant -components. - -The selection rules `eq_zero_of_eq_smul_of_ne_one`, `eq_zero_of_charge_ne_zero` -and the parity rule `eq_zero_of_mem_covMonomialSpan_odd` kill all components -except those of even weight and zero charge. - -The hypercharge grading itself, together with the unit-circle machinery that makes the charge -decomposition work — `u1Gauge`, `exp_mul_I_mem_unitary`, `exp_mul_I_injOn` and the -independence of the circle characters — now lives upstream in -`LeptonGaugeSector/JetAlgebra/Grading/Hypercharge`, which also carries the canonical form of -the neutral selection rule, `mem_hyperchargeSubmodule_zero_of_isInvariant`. What is left here -is only the refinement that keeps track of the *monomial* structure alongside the charge, -which the classification needs and the grading alone does not give. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## Towards completeness: graded decomposition - -The powers `c ↦ c ^ w` are linearly independent functions of `c`, so the -weight components of an element are unique: a vanishing combination of -eigenvectors weighted by powers has vanishing components, and every element of -the weight-`≤ n` submodule decomposes into exact-weight eigenvectors. - --/ - -/-- The span of the covariant monomials of exact mass weight `w`: products of - field-strength derivatives and covariant derivatives of total weight `w`. -/ -noncomputable def covMonomialSpan (w : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ - y ∈ massWeightSubmodule w} - -/-- Every covariant monomial is homogeneous. -/ -lemma exists_weight_of_mem_closure {y : JetAlgebra} - (hy : y ∈ Submonoid.closure invariantGenerators) : - ∃ w, y ∈ massWeightSubmodule w := by - induction hy using Submonoid.closure_induction with - | mem z hz => - rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact ⟨4 + 2 * Multiset.card p.1, - fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2⟩ - · exact ⟨3 + 2 * p.1.length, Dψ_mem_massWeightSubmodule p.1 p.2⟩ - · exact ⟨3 + 2 * p.1.length, Dbarψ_mem_massWeightSubmodule p.1 p.2⟩ - | one => exact ⟨0, SetLike.one_mem_graded massWeightSubmodule⟩ - | mul a b ha hb iha ihb => - obtain ⟨wa, hwa⟩ := iha - obtain ⟨wb, hwb⟩ := ihb - exact ⟨wa + wb, mul_mem_massWeightSubmodule hwa hwb⟩ - -/-- Elements of the weight-`w` covariant monomial span are homogeneous of weight `w`. -/ -lemma mem_massWeightSubmodule_of_mem_covMonomialSpan {w : ℕ} {y : JetAlgebra} - (hy : y ∈ covMonomialSpan w) : y ∈ massWeightSubmodule w := - Submodule.span_le.mpr (fun _ hz => hz.2) hy - -/-- Reading a weight component off a decomposition into homogeneous pieces. -/ -lemma coeff_massWeightPoly_sum {n : ℕ} {z : ℕ → JetAlgebra} - (hz : ∀ k, z k ∈ massWeightSubmodule k) {m : ℕ} (hm : m ∈ Finset.range n) : - (massWeightPoly (∑ k ∈ Finset.range n, z k)).coeff m = z m := by - rw [map_sum, Polynomial.finsetSum_coeff, - Finset.sum_eq_single m (fun k _ hk => coeff_massWeightPoly_of_mem_ne hk (hz k)) - (fun h => absurd hm h)] - exact coeff_massWeightPoly_of_mem (hz m) - -/-- A vanishing tail extends a truncated sum. -/ -lemma sum_range_succ_ext {N M : ℕ} (z : ℕ → JetAlgebra) (hNM : N ≤ M) - (hz : ∀ m, N < m → z m = 0) : - ∑ m ∈ Finset.range (N + 1), z m = ∑ m ∈ Finset.range (M + 1), z m := by - refine Finset.sum_subset ?_ ?_ - · intro m hm - simp only [Finset.mem_range] at hm ⊢ - omega - intro m hm hms - refine hz m ?_ - simp only [Finset.mem_range] at hm hms - omega - -/-- Every element of the algebra generated by the covariant generators - decomposes into covariant monomial components of bounded weight. -/ -lemma exists_bound_decomp_of_mem_adjoin {x : JetAlgebra} - (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : - ∃ (N : ℕ) (z : ℕ → JetAlgebra), (∀ m, z m ∈ covMonomialSpan m) ∧ - (∀ m, N < m → z m = 0) ∧ x = ∑ m ∈ Finset.range (N + 1), z m := by - have hx' : x ∈ Subalgebra.toSubmodule (Algebra.adjoin ℂ invariantGenerators) := hadj - rw [Algebra.adjoin_eq_span] at hx' - clear hadj - induction hx' using Submodule.span_induction with - | mem y hy => - obtain ⟨w, hw⟩ := exists_weight_of_mem_closure hy - refine ⟨w, fun k => if k = w then y else 0, fun k => ?_, fun k hk => ?_, ?_⟩ - · by_cases hkw : k = w - · subst hkw - show (if k = k then y else 0) ∈ covMonomialSpan k - rw [if_pos rfl] - exact Submodule.subset_span ⟨hy, hw⟩ - · show (if k = w then y else 0) ∈ covMonomialSpan k - rw [if_neg hkw] - exact Submodule.zero_mem _ - · show (if k = w then y else 0) = 0 - rw [if_neg (show ¬ k = w by omega)] - · show y = ∑ m ∈ Finset.range (w + 1), (if m = w then y else 0) - rw [Finset.sum_ite_eq' (Finset.range (w + 1)) w fun _ => y, - if_pos (Finset.mem_range.mpr (Nat.lt_succ_self w))] - | zero => - exact ⟨0, fun _ => 0, fun m => Submodule.zero_mem _, fun _ _ => rfl, by simp⟩ - | add a b ha hb iha ihb => - obtain ⟨N₁, z₁, hz₁, hs₁, rfl⟩ := iha - obtain ⟨N₂, z₂, hz₂, hs₂, rfl⟩ := ihb - refine ⟨max N₁ N₂, z₁ + z₂, fun m => Submodule.add_mem _ (hz₁ m) (hz₂ m), - fun m hm => ?_, ?_⟩ - · simp only [Pi.add_apply, hs₁ m (lt_of_le_of_lt (le_max_left _ _) hm), - hs₂ m (lt_of_le_of_lt (le_max_right _ _) hm), add_zero] - · rw [sum_range_succ_ext z₁ (le_max_left N₁ N₂) hs₁, - sum_range_succ_ext z₂ (le_max_right N₁ N₂) hs₂, - ← Finset.sum_add_distrib] - rfl - | smul c a ha iha => - obtain ⟨N, z, hz, hs, rfl⟩ := iha - refine ⟨N, c • z, fun m => Submodule.smul_mem _ _ (hz m), - fun m hm => ?_, ?_⟩ - · simp only [Pi.smul_apply, hs m hm, smul_zero] - · rw [Finset.smul_sum] - rfl - -/-- The master decomposition: an element of the adjoin of the covariant - generators of mass weight at most eight is a sum of nine covariant monomial - components of weights `0, …, 8`. -/ -lemma exists_covMonomialSpan_decomp {x : JetAlgebra} - (hx : x ∈ MassWeightLESubmodule 8) - (hadj : x ∈ Algebra.adjoin ℂ invariantGenerators) : - ∃ z : ℕ → JetAlgebra, (∀ m, z m ∈ covMonomialSpan m) ∧ - x = ∑ m ∈ Finset.range 9, z m := by - obtain ⟨N, z, hzmem, hzsupp, hzx⟩ := exists_bound_decomp_of_mem_adjoin hadj - refine ⟨z, hzmem, ?_⟩ - have hzw : ∀ k, z k ∈ massWeightSubmodule k := - fun k => mem_massWeightSubmodule_of_mem_covMonomialSpan (hzmem k) - set M := max N 8 with hM - have h1 : x = ∑ m ∈ Finset.range (M + 1), z m := - hzx.trans (sum_range_succ_ext z (le_max_left N 8) hzsupp) - have hkill : ∀ m, 8 < m → z m = 0 := by - intro m hm - by_cases hmM : m ≤ M - · have hc : (massWeightPoly x).coeff m = z m := by - rw [h1] - exact coeff_massWeightPoly_sum hzw (Finset.mem_range.mpr (by omega)) - rw [← hc, coeff_massWeightPoly_eq_zero_of_mem_massWeightLESubmodule hx (by omega)] - · exact hzsupp m (by omega) - rw [h1, show (9 : ℕ) = 8 + 1 from rfl, sum_range_succ_ext z (le_max_right N 8) hkill] - -/-! - -## Componentwise invariance - -The scaling at real scalars commutes with the Lorentz action and (at all -scalars) with the constant gauge action, so the weight components of an -invariant element are themselves invariant. - --/ - - -/-- The weight components of a Lorentz-invariant covariant decomposition are - Lorentz invariant: taking the weight-`m` part commutes with the Lorentz action. -/ -lemma repLorentzGroup_covComponent_eq {z : ℕ → JetAlgebra} - (hz : ∀ m, z m ∈ covMonomialSpan m) (Λ : SL(2,ℂ)) - (hx : repLorentzGroup Λ (∑ m ∈ Finset.range 9, z m) = - ∑ m ∈ Finset.range 9, z m) - {m : ℕ} (hm : m ∈ Finset.range 9) : - repLorentzGroup Λ (z m) = z m := by - have hc : (massWeightPoly (∑ k ∈ Finset.range 9, z k)).coeff m = z m := - coeff_massWeightPoly_sum - (fun k => mem_massWeightSubmodule_of_mem_covMonomialSpan (hz k)) hm - rw [← hc, repLorentzGroup_coeff_massWeightPoly, hx] - -/-- The weight components of a constant-gauge-invariant covariant decomposition - are constant-gauge invariant: the constant gauge action preserves mass weights. -/ -lemma repJetGaugeGroupI_ofConstant_covComponent_eq {z : ℕ → JetAlgebra} - (hz : ∀ m, z m ∈ covMonomialSpan m) (g : GaugeGroupI) - (hx : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (∑ m ∈ Finset.range 9, z m) = ∑ m ∈ Finset.range 9, z m) - {m : ℕ} (hm : m ∈ Finset.range 9) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (z m) = z m := by - have hc : (massWeightPoly (∑ k ∈ Finset.range 9, z k)).coeff m = z m := - coeff_massWeightPoly_sum - (fun k => mem_massWeightSubmodule_of_mem_covMonomialSpan (hz k)) hm - rw [← hc, repJetGaugeGroupI_ofConstant_coeff_massWeightPoly, hx] - -/-! - -## The low-weight sectors - --/ - -/-- An element with two distinct exact weights vanishes. -/ -lemma eq_zero_of_eigen_ne {y : JetAlgebra} {m n : ℕ} - (hm : y ∈ massWeightSubmodule m) (hn : y ∈ massWeightSubmodule n) (hmn : m ≠ n) : - y = 0 := - (coeff_massWeightPoly_of_mem hm).symm.trans - (coeff_massWeightPoly_of_mem_ne (Ne.symm hmn) hn) - -/-- Every covariant monomial is the unit or homogeneous of weight at least - three. -/ -lemma mem_closure_weight_cases {y : JetAlgebra} - (hy : y ∈ Submonoid.closure invariantGenerators) : - y = 1 ∨ ∃ w, 3 ≤ w ∧ y ∈ massWeightSubmodule w := by - induction hy using Submonoid.closure_induction with - | mem z hz => - rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact Or.inr ⟨4 + 2 * Multiset.card p.1, by omega, - fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2⟩ - · exact Or.inr ⟨3 + 2 * p.1.length, by omega, - Dψ_mem_massWeightSubmodule p.1 p.2⟩ - · exact Or.inr ⟨3 + 2 * p.1.length, by omega, - Dbarψ_mem_massWeightSubmodule p.1 p.2⟩ - | one => exact Or.inl rfl - | mul a b ha hb iha ihb => - rcases iha with rfl | ⟨wa, hwa3, hwa⟩ - · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ - · exact Or.inl (one_mul (1 : JetAlgebra)) - · exact Or.inr ⟨wb, hwb3, by rwa [one_mul]⟩ - · rcases ihb with rfl | ⟨wb, hwb3, hwb⟩ - · exact Or.inr ⟨wa, hwa3, by rwa [mul_one]⟩ - · exact Or.inr ⟨wa + wb, by omega, mul_mem_massWeightSubmodule hwa hwb⟩ - -/-- The weight-zero covariant monomial span consists of the constants. -/ -lemma covMonomialSpan_zero_le : - covMonomialSpan 0 ≤ Submodule.span ℂ {(1 : JetAlgebra)} := by - rw [covMonomialSpan, Submodule.span_le] - rintro y ⟨hy, hy0⟩ - rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ - · exact Submodule.subset_span rfl - · rw [show y = 0 from eq_zero_of_eigen_ne hwe hy0 (by omega)] - exact Submodule.zero_mem _ - -/-- There are no covariant monomials of weights one or two. -/ -lemma covMonomialSpan_le_bot_of_lt_three {m : ℕ} (hm1 : 1 ≤ m) (hm2 : m < 3) : - covMonomialSpan m ≤ ⊥ := by - rw [covMonomialSpan, Submodule.span_le] - rintro y ⟨hy, hym⟩ - rcases mem_closure_weight_cases hy with rfl | ⟨w, hw3, hwe⟩ - · have := eq_zero_of_eigen_ne (SetLike.one_mem_graded massWeightSubmodule) hym (by omega) - simp [this] - · rw [show y = 0 from eq_zero_of_eigen_ne hwe hym (by omega)] - simp - -/-! - -## The parity selection rule - -Every covariant monomial is an eigenvector of the constant gauge action with a -hypercharge character whose parity equals that of its mass weight: bosonic -generators have even weight and charge zero, fermionic generators odd weight -and charge `±6`. The constant gauge transformation with `u(0) = i` therefore -acts on odd-weight monomials by `-1`, and no odd-weight sector contains a -gauge invariant. - --/ - -/-- Every covariant monomial is an eigenvector of the constant gauge action, - with character exponent of the same parity as its mass weight. -/ -lemma rep_ofConstant_eigen_of_mem_closure {y : JetAlgebra} - (hy : y ∈ Submonoid.closure invariantGenerators) : - ∃ (w : ℕ) (k : ℤ), k.natAbs ≤ w ∧ (w : ℤ) % 2 = k % 2 ∧ - y ∈ massWeightSubmodule w ∧ - ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - (((g.2.2 : ℂ)) ^ (6 * k)) • y := by - have hz : ∀ g : GaugeGroupI, ((g.2.2 : ℂ)) ≠ 0 := by - intro g h - have h1 := (Unitary.mem_iff.mp (g.2.2).2).1 - rw [h, mul_zero] at h1 - exact zero_ne_one h1 - induction hy using Submonoid.closure_induction with - | mem z hzz => - rcases hzz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · refine ⟨4 + 2 * Multiset.card p.1, 0, by simp, by omega, - fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2, fun g => ?_⟩ - rw [repJetGaugeGroupI_fieldStrengthDeriv, mul_zero, zpow_zero, one_smul] - · refine ⟨3 + 2 * p.1.length, 1, by omega, by omega, - Dψ_mem_massWeightSubmodule p.1 p.2, fun g => ?_⟩ - rw [repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, - SubmonoidClass.coe_pow, mul_one, - show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] - · refine ⟨3 + 2 * p.1.length, -1, by omega, by omega, - Dbarψ_mem_massWeightSubmodule p.1 p.2, fun g => ?_⟩ - rw [repJetGaugeGroupI_Dbarψ, JetGaugeGroupI.eval_ofConstant, - Submonoid.smul_def, SubmonoidClass.coe_pow, Unitary.coe_star] - congr 1 - have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := - eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 - rw [hinv, show (6 : ℤ) * (-1) = -(6 : ℤ) from by ring, _root_.zpow_neg, - show ((g.2.2 : ℂ)) ^ (6 : ℤ) = ((g.2.2 : ℂ)) ^ (6 : ℕ) from zpow_natCast _ 6] - exact inv_pow _ 6 - | one => - refine ⟨0, 0, by simp, rfl, SetLike.one_mem_graded massWeightSubmodule, fun g => ?_⟩ - rw [mul_zero, zpow_zero, one_smul] - exact (repJetGaugeGroupI_eq_repAlgHom _ 1).trans - (repAlgHom (JetGaugeGroupI.ofConstant g)).map_one - | mul a b ha hb iha ihb => - obtain ⟨wa, ka, hba, hpa, hea, hga⟩ := iha - obtain ⟨wb, kb, hbb, hpb, heb, hgb⟩ := ihb - refine ⟨wa + wb, ka + kb, by - have := Int.natAbs_add_le ka kb - omega, by omega, mul_mem_massWeightSubmodule hea heb, fun g => ?_⟩ - rw [repJetGaugeGroupI_mul', hga g, hgb g, smul_mul_smul_comm, - show (6 : ℤ) * (ka + kb) = 6 * ka + 6 * kb from by ring, - zpow_add₀ (hz g)] - -/-- The constant gauge transformation with `u(0) = i`. -/ -noncomputable def fermionParityGauge : GaugeGroupI := - (1, 1, ⟨Complex.I, by - rw [Unitary.mem_iff] - constructor <;> - simp [Complex.star_def, Complex.conj_I]⟩) - -/-- The parity gauge transformation acts by `-1` on every odd-weight covariant - monomial. -/ -lemma rep_fermionParityGauge_eq_neg_of_mem_covMonomialSpan {m : ℕ} (hm : m % 2 = 1) - {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant fermionParityGauge) y = -y := by - induction hy using Submodule.span_induction with - | mem u hu => - obtain ⟨hu1, hu2⟩ := hu - obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 - by_cases hu0 : u = 0 - · rw [hu0, map_zero, neg_zero] - · have hwm : w = m := by - by_contra hne - exact hu0 (eq_zero_of_eigen_ne he hu2 hne) - have hkodd : Odd k := by - rw [Int.odd_iff] - omega - rw [hg fermionParityGauge, - show ((fermionParityGauge.2.2 : ℂ)) = Complex.I from rfl, - show (6 : ℤ) * k = 2 * (3 * k) from by ring, _root_.zpow_mul, - show Complex.I ^ (2 : ℤ) = -1 from by - rw [show (2 : ℤ) = ((2 : ℕ) : ℤ) from rfl, zpow_natCast, Complex.I_sq], - show (-1 : ℂ) ^ (3 * k) = -1 from Odd.neg_one_zpow (by - rcases hkodd with ⟨j, hj⟩ - exact ⟨3 * j + 1, by omega⟩)] - exact neg_one_smul ℂ u - | zero => rw [map_zero, neg_zero] - | add u v hu hv ihu ihv => rw [map_add, ihu, ihv, neg_add] - | smul c u hu ihu => rw [map_smul, ihu, smul_neg] - -/-- Odd-weight covariant monomial spans contain no constant-gauge - invariants. -/ -lemma eq_zero_of_mem_covMonomialSpan_odd {m : ℕ} (hm : m % 2 = 1) - {y : JetAlgebra} (hy : y ∈ covMonomialSpan m) - (hinv : repJetGaugeGroupI (JetGaugeGroupI.ofConstant fermionParityGauge) y = y) : - y = 0 := by - have h := (rep_fermionParityGauge_eq_neg_of_mem_covMonomialSpan hm hy).symm.trans hinv - have h2 : (2 : ℂ) • y = 0 := by - calc (2 : ℂ) • y = y + y := two_smul ℂ y - _ = -y + y := congrArg (· + y) h.symm - _ = 0 := neg_add_cancel y - rcases smul_eq_zero.mp h2 with h3 | h3 - · exact absurd h3 two_ne_zero - · exact h3 - -/-! - -## The master selection rules - -An invariant which is also an eigenvector with a nontrivial eigenvalue must -vanish. Specialized to the constant gauge action at a root of unity this is the -hypercharge selection rule; specialized to diagonal Lorentz transformations it -kills the non-scalar Lorentz components. - --/ - -/-- The master selection rule: an element that scales by a factor other than - one vanishes. -/ -lemma eq_zero_of_eq_smul_of_ne_one {y : JetAlgebra} {c : ℂ} - (h1 : y = c • y) (hc : c ≠ 1) : y = 0 := by - have h2 : (c - 1) • y = 0 := - (sub_smul c 1 y).trans (by rw [one_smul, ← h1, sub_self]) - rcases smul_eq_zero.mp h2 with h3 | h3 - · exact absurd (sub_eq_zero.mp h3) hc - · exact h3 - -/-- The hypercharge selection rule: a constant-gauge eigenvector of nonzero - charge admits no invariant. -/ -lemma eq_zero_of_charge_ne_zero {y : JetAlgebra} {k : ℤ} (hk : k ≠ 0) - (hy : ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - ((g.2.2 : ℂ)) ^ (6 * k) • y) - (hinv : ∀ g : GaugeGroupI, - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : y = 0 := by - have h6k : ((6 * k : ℤ) : ℝ) ≠ 0 := by - simp only [ne_eq, Int.cast_eq_zero] - omega - set θ : ℝ := Real.pi / ((6 * k : ℤ) : ℝ) with hθ - set g : GaugeGroupI := u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) - (exp_mul_I_mem_unitary θ) with hg - have hval : ((g.2.2 : ℂ)) = Complex.exp ((θ : ℂ) * Complex.I) := rfl - have hchar : ((g.2.2 : ℂ)) ^ (6 * k) = -1 := by - rw [hval, ← Complex.exp_int_mul, - show ((6 * k : ℤ) : ℂ) * ((θ : ℂ) * Complex.I) = - (((6 * k : ℤ) : ℝ) * θ : ℝ) * Complex.I from by push_cast; ring, - show ((6 * k : ℤ) : ℝ) * θ = Real.pi from mul_div_cancel₀ Real.pi h6k ▸ rfl] - exact Complex.exp_pi_mul_I - exact eq_zero_of_eq_smul_of_ne_one - ((hinv g).symm.trans ((hy g).trans (by rw [hchar]))) - (by - intro h - norm_num at h) - -/-! - -## Charge decomposition - -The constant gauge characters at distinct charges are linearly independent -along the unit circle, so every element of a weight sector decomposes into -charge components, and a constant-gauge invariant equals its neutral component. - --/ - -/-- The charge-`6k` part of a weight sector: the span of the covariant - monomials of weight `m` and hypercharge `6 k`. -/ -noncomputable def chargeCovSpan (m : ℕ) (k : ℤ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {y | y ∈ Submonoid.closure invariantGenerators ∧ - y ∈ massWeightSubmodule m ∧ - ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - ((g.2.2 : ℂ)) ^ (6 * k) • y} - -/-- Elements of the charge component are eigenvectors of the constant gauge - action. -/ -lemma forall_rep_ofConstant_of_mem_chargeCovSpan {m : ℕ} {k : ℤ} - {y : JetAlgebra} (hy : y ∈ chargeCovSpan m k) (g : GaugeGroupI) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = - ((g.2.2 : ℂ)) ^ (6 * k) • y := by - induction hy using Submodule.span_induction with - | mem u hu => exact hu.2.2 g - | zero => simp - | add a b ha hb iha ihb => rw [map_add, iha, ihb, smul_add] - | smul c a ha iha => rw [map_smul, iha, smul_comm] - -/-- The charge components sit inside the weight sector. -/ -lemma chargeCovSpan_le_covMonomialSpan {m : ℕ} {k : ℤ} : - chargeCovSpan m k ≤ covMonomialSpan m := - Submodule.span_mono fun y hy => ⟨hy.1, hy.2.1⟩ - -/-- Charge decomposition within a weight sector. -/ -lemma exists_charge_decomp_of_mem_covMonomialSpan {m : ℕ} {y : JetAlgebra} - (hy : y ∈ covMonomialSpan m) : - ∃ v : ℤ → JetAlgebra, (∀ j, v j ∈ chargeCovSpan m j) ∧ - y = ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), v j := by - induction hy using Submodule.span_induction with - | mem u hu => - obtain ⟨hu1, hu2⟩ := hu - obtain ⟨w, k, hb, hp, he, hg⟩ := rep_ofConstant_eigen_of_mem_closure hu1 - by_cases hu0 : u = 0 - · exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp [hu0]⟩ - · have hwm : w = m := by - by_contra hne - exact hu0 (eq_zero_of_eigen_ne he hu2 hne) - have hkm : k ∈ Finset.Icc (-(m : ℤ)) (m : ℤ) := by - rw [Finset.mem_Icc] - omega - refine ⟨fun j => if j = k then u else 0, fun j => ?_, ?_⟩ - · show (if j = k then u else 0) ∈ chargeCovSpan m j - by_cases hjk : j = k - · subst hjk - rw [if_pos rfl] - exact Submodule.subset_span ⟨hu1, hu2, hg⟩ - · rw [if_neg hjk] - exact Submodule.zero_mem _ - · rw [show (∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), - (fun j => if j = k then u else 0) j) = - ∑ j ∈ Finset.Icc (-(m : ℤ)) (m : ℤ), (if j = k then u else 0) from rfl, - Finset.sum_ite_eq' _ k fun _ => u, if_pos hkm] - | zero => - exact ⟨fun _ => 0, fun j => Submodule.zero_mem _, by simp⟩ - | add a b ha hb iha ihb => - obtain ⟨v₁, hv₁, rfl⟩ := iha - obtain ⟨v₂, hv₂, rfl⟩ := ihb - exact ⟨v₁ + v₂, fun j => Submodule.add_mem _ (hv₁ j) (hv₂ j), - by rw [← Finset.sum_add_distrib]; rfl⟩ - | smul c a ha iha => - obtain ⟨v, hv, rfl⟩ := iha - exact ⟨c • v, fun j => Submodule.smul_mem _ _ (hv j), - by rw [Finset.smul_sum]; rfl⟩ - -/-- The neutral-charge selection rule: a constant-gauge-invariant element of a - weight sector lies in the charge-zero component, since the characters - `u ↦ u^{6j}` of distinct charges are linearly independent along the unit - circle. -/ -lemma mem_chargeCovSpan_zero_of_invariant {m : ℕ} {y : JetAlgebra} - (hy : y ∈ covMonomialSpan m) - (hinv : ∀ g : GaugeGroupI, - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) y = y) : - y ∈ chargeCovSpan m 0 := by - obtain ⟨v, hv, hyeq⟩ := exists_charge_decomp_of_mem_covMonomialSpan hy - set S : Finset ℤ := Finset.Icc (-(m : ℤ)) (m : ℤ) with hS - have hchar : ∀ θ : ℝ, ∑ j ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * j) • - v j = ∑ j ∈ S, v j := by - intro θ - have hval : (((u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) - (exp_mul_I_mem_unitary θ)).2.2 : ℂ)) = - Complex.exp ((θ : ℂ) * Complex.I) := rfl - have h1 := hinv (u1Gauge (Complex.exp ((θ : ℂ) * Complex.I)) - (exp_mul_I_mem_unitary θ)) - rw [hyeq, map_sum] at h1 - rw [← h1] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [forall_rep_ofConstant_of_mem_chargeCovSpan (hv j), hval] - have hkill : ∀ j ∈ S, j ≠ 0 → v j = 0 := by - intro j hj hj0 - have h6 : Function.Injective (fun k : ℤ => 6 * k) := fun a b hab => by - simpa using hab - set w : ℤ → JetAlgebra := fun k => v (k / 6) - - (if k = 0 then ∑ i ∈ S, v i else 0) with hw - have hzero : ∀ θ : ℝ, ∑ k ∈ S.image (fun j => 6 * j), - (Complex.exp ((θ : ℂ) * Complex.I)) ^ k • w k = 0 := by - intro θ - rw [Finset.sum_image fun a _ b _ h => h6 h] - have hterm : ∀ i ∈ S, (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • - w (6 * i) = (Complex.exp ((θ : ℂ) * Complex.I)) ^ (6 * i) • v i - - (if i = 0 then ∑ i ∈ S, v i else 0) := by - intro i _ - rw [hw] - simp only [Int.mul_ediv_cancel_left i (by norm_num : (6 : ℤ) ≠ 0), - show 6 * i = 0 ↔ i = 0 from by omega] - by_cases hi : i = 0 - · rw [if_pos hi, smul_sub, hi] - norm_num - · rw [if_neg hi] - simp - rw [Finset.sum_congr rfl hterm, Finset.sum_sub_distrib, hchar θ, - Finset.sum_ite_eq' S (0 : ℤ) fun _ => ∑ i ∈ S, v i, - if_pos (by simp [hS] : (0 : ℤ) ∈ S), sub_self] - have h0 := eq_zero_of_forall_circle_sum_zpow_smul_eq_zero _ _ hzero - (Finset.mem_image_of_mem (fun j => 6 * j) hj) - rw [hw] at h0 - simpa [Int.mul_ediv_cancel_left j (by norm_num : (6 : ℤ) ≠ 0), - show ¬ (6 * j = 0) from by omega] using h0 - have hy0 : y = v 0 := by - rw [hyeq, Finset.sum_eq_single 0 (fun j hj hj0 => hkill j hj hj0) - (fun h => absurd (by simp [hS] : (0 : ℤ) ∈ S) h)] - rw [hy0] - exact hv 0 -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean deleted file mode 100644 index f902ef1fd..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Grading/NeutralSectors.lean +++ /dev/null @@ -1,353 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Grading.MassWeightAndHypercharge -/-! -# The neutral sectors of weight at most eight - -The charge-zero covariant monomials of each even weight up to eight: the field -strengths `F_{μν}` at weight four, the derivatives `∂_ρ F_{μν}` and the fermion -pairs `ψ̄_α ψ_β` at weight six, and the products `F F`, the second derivatives -`∂_ρ ∂_τ F_{μν}` and the one-derivative fermion pairs at weight eight -(`chargeCovSpan_four_le`, `chargeCovSpan_six_le`, `chargeCovSpan_eight_le`). - -This is the reduction step of the classification: it replaces "an invariant of -weight `m` and hypercharge zero" by a *finite explicit spanning family*, on -which the subgroups of `Subgroups/` and the averages of `Averages/` can then be -computed one monomial at a time. That the weight-four and weight-six sectors -contain no invariant at all is proved where the relevant average is defined, in -`Averages/RotationAverage` and `Averages/RotationPiBoostAverage`. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## The Lorentz analysis of the neutral sectors - -TODO: the remaining sector lemmas. The charge-zero covariant monomials of -weight four are the field strengths `F_{μν}`, of weight six the derivatives -`∂_ρ F_{μν}` and the fermion pairs `ψ̄_α ψ_β`, of weight eight the products -`F F`, the second derivatives `∂_ρ ∂_τ F_{μν}`, and the one-derivative fermion -pairs. Lorentz invariance kills the weight-four and weight-six sectors and -reduces the weight-eight sector to the span of the Maxwell term, the theta -term, and the two fermion kinetic terms. - --/ - -/-- Each invariant generator is a weight eigenvector of weight at least - three. -/ -lemma exists_weight_of_mem_invariantGenerators {g : JetAlgebra} - (hg : g ∈ invariantGenerators) : - ∃ w, 3 ≤ w ∧ g ∈ massWeightSubmodule w := by - rcases hg with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact ⟨4 + 2 * Multiset.card p.1, by omega, - fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, Dψ_mem_massWeightSubmodule p.1 p.2⟩ - · exact ⟨3 + 2 * p.1.length, by omega, Dbarψ_mem_massWeightSubmodule p.1 p.2⟩ - -/-- The product of a list of invariant generators is a weight eigenvector of - weight at least three times the length. -/ -lemma exists_weight_of_list_prod {l : List JetAlgebra} - (hl : ∀ g ∈ l, g ∈ invariantGenerators) : - ∃ w, 3 * l.length ≤ w ∧ l.prod ∈ massWeightSubmodule w := by - induction l with - | nil => - exact ⟨0, by simp, by - rw [List.prod_nil] - exact SetLike.one_mem_graded massWeightSubmodule⟩ - | cons g l ih => - obtain ⟨wg, hwg3, hwg⟩ := exists_weight_of_mem_invariantGenerators - (hl g List.mem_cons_self) - obtain ⟨wl, hwl3, hwl⟩ := ih fun x hx => hl x (List.mem_cons_of_mem g hx) - refine ⟨wg + wl, by simp only [List.length_cons]; omega, ?_⟩ - rw [List.prod_cons] - exact mul_mem_massWeightSubmodule hwg hwl - -/-- The constant gauge character of a product of two lepton factors: charge - two. -/ -lemma rep_ofConstant_Dψ_mul_Dψ (g : GaugeGroupI) (l l' : List (Fin 1 ⊕ Fin 3)) - (α β : Fin 2) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dψ l α * Dψ l' β) = - ((g.2.2 : ℂ)) ^ (6 * (2 : ℤ)) • (Dψ l α * Dψ l' β) := by - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, - JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, - SubmonoidClass.coe_pow, smul_mul_smul_comm, ← pow_add, - show (6 * (2 : ℤ)) = ((12 : ℕ) : ℤ) from rfl, zpow_natCast] - -/-- The constant gauge character of a product of two conjugate lepton factors: - charge minus two. -/ -lemma rep_ofConstant_Dbarψ_mul_Dbarψ (g : GaugeGroupI) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (Dbarψ l α * Dbarψ l' β) = - ((g.2.2 : ℂ)) ^ (6 * (-2 : ℤ)) • (Dbarψ l α * Dbarψ l' β) := by - have hinv : star ((g.2.2 : ℂ)) = ((g.2.2 : ℂ))⁻¹ := - eq_inv_of_mul_eq_one_left (Unitary.mem_iff.mp (g.2.2).2).1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, - JetGaugeGroupI.eval_ofConstant, Submonoid.smul_def, Submonoid.smul_def, - SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← pow_add, - hinv, inv_pow, show (6 + 6 : ℕ) = 12 from rfl, - show (6 * (-2 : ℤ)) = -((12 : ℕ) : ℤ) from rfl, _root_.zpow_neg, zpow_natCast] - -/-- The weight-four neutral sector: spanned by the embedded field strengths. -/ -lemma chargeCovSpan_four_le : - chargeCovSpan 4 0 ≤ Submodule.span ℂ - (Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {} p.1 p.2) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, -⟩ - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', t⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (SetLike.one_mem_graded massWeightSubmodule) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 0 - · rw [Multiset.card_eq_zero.mp hcard] - exact Submodule.subset_span ⟨(p.2.1, p.2.2), rfl⟩ - · rw [eq_zero_of_eigen_ne - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (Dψ_mem_massWeightSubmodule p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (Dbarψ_mem_massWeightSubmodule p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - rw [eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega)] - exact Submodule.zero_mem _ - -set_option maxHeartbeats 4000000 in -/-- The weight-six neutral sector: spanned by the first derivatives of the - field strength and the zero-derivative lepton pairs. -/ -lemma chargeCovSpan_six_le : - chargeCovSpan 6 0 ≤ Submodule.span ℂ - ((Set.range fun p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {p.1} p.2.1 p.2.2) ∪ - (Set.range fun p : Fin 2 × Fin 2 => Dbarψ [] p.1 * Dψ [] p.2) ∪ - (Set.range fun p : Fin 2 × Fin 2 => Dψ [] p.1 * Dbarψ [] p.2)) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, hy3⟩ - simp only [mul_zero, zpow_zero, one_smul] at hy3 - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (SetLike.one_mem_graded massWeightSubmodule) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 1 - · obtain ⟨ρ, hρ⟩ := Multiset.card_eq_one.mp hcard - rw [hρ] - exact Submodule.subset_span (Or.inl (Or.inl ⟨(ρ, p.2.1, p.2.2), rfl⟩)) - · rw [eq_zero_of_eigen_ne - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (Dψ_mem_massWeightSubmodule p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (Dbarψ_mem_massWeightSubmodule p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with - (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> - dsimp only at hy2 hy3 ⊢ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) - (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) - (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) - (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dψ_mem_massWeightSubmodule p.1 p.2) - (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) - (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 - · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] - exact Submodule.subset_span (Or.inr ⟨(p.2, q.2), rfl⟩) - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dψ_mem_massWeightSubmodule p.1 p.2) - (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dbarψ_mem_massWeightSubmodule p.1 p.2) - (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 0 - · rw [List.length_eq_zero_iff.mp hlen.1, List.length_eq_zero_iff.mp hlen.2] - exact Submodule.subset_span (Or.inl (Or.inr ⟨(p.2, q.2), rfl⟩)) - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dbarψ_mem_massWeightSubmodule p.1 p.2) - (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) - (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - rw [eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega)] - exact Submodule.zero_mem _ - -set_option maxHeartbeats 4000000 in -/-- The weight-eight neutral sector: spanned by the field-strength squares, the - second derivatives of the field strength, and the one-derivative lepton - pairs. -/ -lemma chargeCovSpan_eight_le : - chargeCovSpan 8 0 ≤ Submodule.span ℂ - ((Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × - (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {} p.1.1 p.1.2 * fieldStrengthDeriv {} p.2.1 p.2.2) ∪ - (Set.range fun p : ((Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) × - (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv {p.1.1, p.1.2} p.2.1 p.2.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dbarψ [] p.1.1 * Dψ [p.2] p.1.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dψ [p.2] p.1.2 * Dbarψ [] p.1.1) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dψ [] p.1.1 * Dbarψ [p.2] p.1.2) ∪ - (Set.range fun p : (Fin 2 × Fin 2) × (Fin 1 ⊕ Fin 3) => - Dbarψ [p.2] p.1.2 * Dψ [] p.1.1)) := by - rw [chargeCovSpan, Submodule.span_le] - rintro y ⟨hy1, hy2, hy3⟩ - simp only [mul_zero, zpow_zero, one_smul] at hy3 - obtain ⟨l, hl, hprod⟩ := Submonoid.exists_list_of_mem_closure hy1 - subst hprod - rcases l with _ | ⟨g, _ | ⟨g', _ | ⟨g'', t⟩⟩⟩ - · rw [List.prod_nil] at hy2 ⊢ - rw [eq_zero_of_eigen_ne (m := 0) - (SetLike.one_mem_graded massWeightSubmodule) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_nil, mul_one] at hy2 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - dsimp only at hy2 ⊢ - · by_cases hcard : Multiset.card p.1 = 2 - · obtain ⟨ρ, τ, hρτ⟩ := Multiset.card_eq_two.mp hcard - rw [hρτ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl - (Or.inr ⟨((ρ, τ), p.2.1, p.2.2), rfl⟩))))) - · rw [eq_zero_of_eigen_ne - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (Dψ_mem_massWeightSubmodule p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (Dbarψ_mem_massWeightSubmodule p.1 p.2) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [List.prod_cons, List.prod_cons, List.prod_nil, mul_one] at hy2 hy3 ⊢ - rcases hl g List.mem_cons_self with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ <;> - rcases hl g' (List.mem_cons_of_mem _ List.mem_cons_self) with - (⟨q, rfl⟩ | ⟨q, rfl⟩) | ⟨q, rfl⟩ <;> - dsimp only at hy2 hy3 ⊢ - · by_cases hcard : Multiset.card p.1 = 0 ∧ Multiset.card q.1 = 0 - · rw [Multiset.card_eq_zero.mp hcard.1, Multiset.card_eq_zero.mp hcard.2] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inl - (Or.inl ⟨((p.2.1, p.2.2), q.2.1, q.2.2), rfl⟩))))) - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) - (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) - (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (fieldStrengthDeriv_mem_massWeightSubmodule p.1 p.2.1 p.2.2) - (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dψ_mem_massWeightSubmodule p.1 p.2) - (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := 2) (by omega) - (fun gc => rep_ofConstant_Dψ_mul_Dψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 - rw [List.length_eq_zero_iff.mp hlen.1, hμ] - exact Submodule.subset_span (Or.inl (Or.inr ⟨((p.2, q.2), μ), rfl⟩)) - · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 - rw [List.length_eq_zero_iff.mp hlen'.2, hμ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inr - ⟨((q.2, p.2), μ), rfl⟩))) - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dψ_mem_massWeightSubmodule p.1 p.2) - (Dbarψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dbarψ_mem_massWeightSubmodule p.1 p.2) - (fieldStrengthDeriv_mem_massWeightSubmodule q.1 q.2.1 q.2.2)) hy2 - (by omega)] - exact Submodule.zero_mem _ - · by_cases hlen : p.1.length = 0 ∧ q.1.length = 1 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen.2 - rw [List.length_eq_zero_iff.mp hlen.1, hμ] - exact Submodule.subset_span (Or.inl (Or.inl (Or.inl (Or.inr - ⟨((p.2, q.2), μ), rfl⟩)))) - · by_cases hlen' : p.1.length = 1 ∧ q.1.length = 0 - · obtain ⟨μ, hμ⟩ := List.length_eq_one_iff.mp hlen'.1 - rw [List.length_eq_zero_iff.mp hlen'.2, hμ] - exact Submodule.subset_span (Or.inr ⟨((q.2, p.2), μ), rfl⟩) - · rw [eq_zero_of_eigen_ne (mul_mem_massWeightSubmodule - (Dbarψ_mem_massWeightSubmodule p.1 p.2) - (Dψ_mem_massWeightSubmodule q.1 q.2)) hy2 (by omega)] - exact Submodule.zero_mem _ - · rw [eq_zero_of_charge_ne_zero (k := -2) (by omega) - (fun gc => rep_ofConstant_Dbarψ_mul_Dbarψ gc p.1 q.1 p.2 q.2) hy3] - exact Submodule.zero_mem _ - · have h0 : (g :: g' :: g'' :: t).prod = 0 := by - obtain ⟨w, hw, hweig⟩ := exists_weight_of_list_prod hl - exact eq_zero_of_eigen_ne hweig hy2 (by - simp only [List.length_cons] at hw - omega) - exact Set.mem_of_eq_of_mem h0 (Submodule.zero_mem _) - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean deleted file mode 100644 index 2792396bb..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/GroupAverage.lean +++ /dev/null @@ -1,170 +0,0 @@ -/- -Copyright (c) 2026 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 Mathlib.RepresentationTheory.Basic -public import Mathlib.LinearAlgebra.Span.Basic -/-! -# Averaging an invariant vector over a spanning set - -The classification of invariants of a representation rests on a single -observation. Suppose a vector `y` is known to lie in the span of a set `s`, and -suppose `f` is a linear operator built from the group action which fixes `y`. -Then - -`y = f y ∈ f '' (span s) = span (f '' s)`, - -so `y` already lies in the span of the *transformed* set, and it suffices to -compute `f v` for the — usually far fewer, or far simpler — elements `v` of `s`. -This is `Submodule.mem_span_image_of_apply_eq_self`. - -The operators `f` to which this is applied come in two flavours, both provided -here. - -* The average `Representation.subgroupAverage` over a finite subgroup `S`, the - Reynolds operator `α_S = |S|⁻¹ ∑_{g ∈ S} ρ g`. Every `S`-invariant vector is - fixed by it, giving the theorem in its familiar form: an invariant `y` in the - span of `v i` lies in the span of the averages `α_S (v i)` - (`Representation.mem_span_range_subgroupAverage`). -* More generally `Representation.weightedSum`, a combination `∑ w i • ρ (g i)` - of finitely many group elements whose weights sum to one. This still fixes - every invariant vector, but does not require the elements to form a finite - subgroup — which matters when the group is non-compact and carries no - invariant average, as for the Lorentz boosts. The weights are then free - parameters, and can be chosen to annihilate whatever else one wishes. - -Polynomials in an operator that fixes `y` again fix `y` provided their -coefficients sum to one (`Module.End.sum_smul_pow_apply_of_apply_eq_self`), so -spectral projectors built this way are covered too — `boostAvgScalarProj` of -`Averages/BoostAvgProjector` is one. - -Nothing here is specific to this sector; the file sits at the root of `Invariants/` -because that is where the principle is used, and every other file in the -folder is an instance of it. --/ - -@[expose] public section - -namespace Submodule - -variable {R M : Type*} [Semiring R] [AddCommMonoid M] [Module R M] - -/-- **The averaging principle.** A vector in the span of `s` which is fixed by a - linear endomorphism `f` lies in the span of the image `f '' s`. -/ -theorem mem_span_image_of_apply_eq_self {s : Set M} {f : M →ₗ[R] M} {y : M} - (hy : y ∈ span R s) (hfy : f y = y) : y ∈ span R (f '' s) := by - rw [span_image] - exact ⟨y, hy, hfy⟩ - -/-- The averaging principle for a spanning family: a vector in the span of the - `v i` which is fixed by `f` lies in the span of the `f (v i)`. -/ -theorem mem_span_range_of_apply_eq_self {ι : Type*} {v : ι → M} {f : M →ₗ[R] M} {y : M} - (hy : y ∈ span R (Set.range v)) (hfy : f y = y) : - y ∈ span R (Set.range fun i => f (v i)) := by - rw [show (Set.range fun i => f (v i)) = f '' Set.range v from Set.range_comp f v] - exact mem_span_image_of_apply_eq_self hy hfy - -end Submodule - -namespace Module.End - -variable {R M ι : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] - -/-- A power of an operator fixing `v` fixes `v`. -/ -lemma pow_apply_of_apply_eq_self {f : Module.End R M} {v : M} (hf : f v = v) : - ∀ n : ℕ, (f ^ n) v = v - | 0 => by simp - | n + 1 => by - rw [pow_succ, Module.End.mul_apply, hf, pow_apply_of_apply_eq_self hf n] - -/-- A polynomial in an operator fixing `v`, with coefficients summing to one, fixes - `v`. Spectral projectors are of this form. -/ -lemma sum_smul_pow_apply_of_apply_eq_self {f : Module.End R M} {v : M} (hf : f v = v) - {s : Finset ι} {c : ι → R} {n : ι → ℕ} (hc : ∑ i ∈ s, c i = 1) : - (∑ i ∈ s, c i • f ^ n i) v = v := by - rw [LinearMap.sum_apply, - Finset.sum_congr rfl fun i _ => by - rw [LinearMap.smul_apply, pow_apply_of_apply_eq_self hf], ← Finset.sum_smul, hc, one_smul] - -end Module.End - -namespace Representation - -variable {R G M ι : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] - -section Monoid - -variable [Monoid G] - -/-- A weighted combination `∑ w i • ρ (g i)` of the operators of a representation. -/ -noncomputable def weightedSum (ρ : Representation R G M) (s : Finset ι) (w : ι → R) (g : ι → G) : - M →ₗ[R] M := - ∑ i ∈ s, w i • ρ (g i) - -lemma weightedSum_apply (ρ : Representation R G M) (s : Finset ι) (w : ι → R) (g : ι → G) (v : M) : - ρ.weightedSum s w g v = ∑ i ∈ s, w i • ρ (g i) v := by - simp [weightedSum, LinearMap.sum_apply] - -/-- A weighted combination of group elements whose weights sum to one fixes every - vector invariant under those elements. No subgroup, and no compactness, is - needed. -/ -lemma weightedSum_apply_of_invariant {ρ : Representation R G M} {s : Finset ι} {w : ι → R} - {g : ι → G} {v : M} (hw : ∑ i ∈ s, w i = 1) (hv : ∀ i ∈ s, ρ (g i) v = v) : - ρ.weightedSum s w g v = v := by - rw [weightedSum_apply, Finset.sum_congr rfl fun i hi => by rw [hv i hi], ← Finset.sum_smul, hw, - one_smul] - -/-- An invariant vector in the span of `s` lies in the span of the image of `s` under - any weighted combination of group elements fixing it. -/ -theorem mem_span_image_weightedSum {ρ : Representation R G M} {s : Finset ι} {w : ι → R} - {g : ι → G} {t : Set M} {y : M} (hy : y ∈ Submodule.span R t) (hw : ∑ i ∈ s, w i = 1) - (hv : ∀ i ∈ s, ρ (g i) y = y) : - y ∈ Submodule.span R (ρ.weightedSum s w g '' t) := - Submodule.mem_span_image_of_apply_eq_self hy (weightedSum_apply_of_invariant hw hv) - -end Monoid - -section Subgroup - -variable [Group G] - -/-- The average of a representation over a finite subgroup, `α_S = |S|⁻¹ ∑_{g ∈ S} ρ g`. -/ -noncomputable def subgroupAverage (ρ : Representation R G M) (S : Subgroup G) [Fintype S] - [Invertible (Fintype.card S : R)] : M →ₗ[R] M := - ρ.weightedSum Finset.univ (fun _ : S => ⅟(Fintype.card S : R)) (fun h => (h : G)) - -lemma subgroupAverage_apply (ρ : Representation R G M) (S : Subgroup G) [Fintype S] - [Invertible (Fintype.card S : R)] (v : M) : - ρ.subgroupAverage S v = ∑ g : S, ⅟(Fintype.card S : R) • ρ (g : G) v := - weightedSum_apply _ _ _ _ v - -/-- The average over a subgroup fixes every vector invariant under that subgroup. -/ -lemma subgroupAverage_apply_of_invariant {ρ : Representation R G M} {S : Subgroup G} [Fintype S] - [Invertible (Fintype.card S : R)] {v : M} (hv : ∀ g ∈ S, ρ g v = v) : - ρ.subgroupAverage S v = v := by - refine weightedSum_apply_of_invariant ?_ fun g _ => hv (g : G) g.2 - rw [Finset.sum_const, Finset.card_univ, nsmul_eq_mul, mul_invOf_self] - -/-- **Averaging over a subgroup.** If `y` lies in the span of `t` and is invariant - under a finite subgroup `S`, then `y` lies in the span of the averaged set - `α_S '' t`. -/ -theorem mem_span_image_subgroupAverage {ρ : Representation R G M} {S : Subgroup G} [Fintype S] - [Invertible (Fintype.card S : R)] {t : Set M} {y : M} (hy : y ∈ Submodule.span R t) - (hinv : ∀ g ∈ S, ρ g y = y) : - y ∈ Submodule.span R (ρ.subgroupAverage S '' t) := - Submodule.mem_span_image_of_apply_eq_self hy (subgroupAverage_apply_of_invariant hinv) - -/-- **Averaging over a subgroup**, for a spanning family: an invariant `y` in the span - of the `v i` lies in the span of the averages `α_S (v i)`. -/ -theorem mem_span_range_subgroupAverage {ρ : Representation R G M} {S : Subgroup G} [Fintype S] - [Invertible (Fintype.card S : R)] {v : ι → M} {y : M} - (hy : y ∈ Submodule.span R (Set.range v)) (hinv : ∀ g ∈ S, ρ g y = y) : - y ∈ Submodule.span R (Set.range fun i => ρ.subgroupAverage S (v i)) := - Submodule.mem_span_range_of_apply_eq_self hy (subgroupAverage_apply_of_invariant hinv) - -end Subgroup - -end Representation diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean deleted file mode 100644 index cdf2cf909..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/SpanOfRenormalizableTerms.lean +++ /dev/null @@ -1,1443 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Averages.BoostAvgProjectorOnMonomials -/-! -# The projected weight-eight monomials lie in the span - -Every weight-eight monomial, after averaging over the rotations by `π` and applying the projector -`boostAvgScalarProj`, lands in the span of the four renormalizable invariants. Together with -`boostAvgScalarProj_apply_of_invariant` this is the last input to the classification -theorem. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The Maxwell term lies in the span of the invariants. -/ -lemma maxwellTerm_mem_span : - maxwellTerm ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- The theta term lies in the span of the invariants. -/ -lemma thetaTerm_mem_span : - thetaTerm ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- The fermion kinetic term lies in the span of the invariants. -/ -lemma fermionKineticTerm_mem_span : - fermionKineticTerm ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- The conjugate fermion kinetic term lies in the span of the invariants. -/ -lemma fermionKineticTermBar_mem_span : - fermionKineticTermBar ∈ Submodule.span ℂ massDimFourInvariants := - Submodule.subset_span (by simp [massDimFourInvariants]) - -/-- Pulling a sign out of a jet-algebra product on the right. The generic - `mul_neg` does not fire here: the multiplication comes from the tensor-product - instance, which typeclass search does not connect to `HasDistribNeg`. -/ -lemma jetMul_neg (u v : JetAlgebra) : u * -v = -(u * v) := by grind - -/-- Pulling a sign out of a jet-algebra product on the left; see `jetMul_neg`. -/ -lemma jetNeg_mul (u v : JetAlgebra) : -u * v = -(u * v) := by grind - -/-- Projector membership for the ordered square `F01 * F01`. -/ -lemma boostAvgScalarProj_FF_c0101_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F01_F01] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F01 * F10`. -/ -lemma boostAvgScalarProj_FF_c0110_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F01_F01] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F01`. -/ -lemma boostAvgScalarProj_FF_c1001_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F01_F01] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F10`. -/ -lemma boostAvgScalarProj_FF_c1010_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F01_F01] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F01 * F23`. -/ -lemma boostAvgScalarProj_FF_c0123_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F01 * F32`. -/ -lemma boostAvgScalarProj_FF_c0132_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F23`. -/ -lemma boostAvgScalarProj_FF_c1023_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F10 * F32`. -/ -lemma boostAvgScalarProj_FF_c1032_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F01`. -/ -lemma boostAvgScalarProj_FF_c2301_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F10`. -/ -lemma boostAvgScalarProj_FF_c2310_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F01`. -/ -lemma boostAvgScalarProj_FF_c3201_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F01_F23] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F10`. -/ -lemma boostAvgScalarProj_FF_c3210_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F01_F23] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F23`. -/ -lemma boostAvgScalarProj_FF_c2323_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F23_F23] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F23 * F32`. -/ -lemma boostAvgScalarProj_FF_c2332_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F23_F23] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F23`. -/ -lemma boostAvgScalarProj_FF_c3223_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F23_F23] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F32 * F32`. -/ -lemma boostAvgScalarProj_FF_c3232_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F23_F23] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F02`. -/ -lemma boostAvgScalarProj_FF_c0202_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F02_F02] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F20`. -/ -lemma boostAvgScalarProj_FF_c0220_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F02_F02] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F02`. -/ -lemma boostAvgScalarProj_FF_c2002_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F02_F02] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F20`. -/ -lemma boostAvgScalarProj_FF_c2020_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F02_F02] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F13`. -/ -lemma boostAvgScalarProj_FF_c0213_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F02 * F31`. -/ -lemma boostAvgScalarProj_FF_c0231_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F13`. -/ -lemma boostAvgScalarProj_FF_c2013_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F20 * F31`. -/ -lemma boostAvgScalarProj_FF_c2031_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F02`. -/ -lemma boostAvgScalarProj_FF_c1302_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F20`. -/ -lemma boostAvgScalarProj_FF_c1320_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F02`. -/ -lemma boostAvgScalarProj_FF_c3102_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F02_F13] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F20`. -/ -lemma boostAvgScalarProj_FF_c3120_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F02_F13] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F13`. -/ -lemma boostAvgScalarProj_FF_c1313_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F13_F13] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F13 * F31`. -/ -lemma boostAvgScalarProj_FF_c1331_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F13_F13] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F13`. -/ -lemma boostAvgScalarProj_FF_c3113_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F13_F13] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F31 * F31`. -/ -lemma boostAvgScalarProj_FF_c3131_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F13_F13] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F03`. -/ -lemma boostAvgScalarProj_FF_c0303_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F03_F03] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F30`. -/ -lemma boostAvgScalarProj_FF_c0330_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F03_F03] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F03`. -/ -lemma boostAvgScalarProj_FF_c3003_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F03_F03] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F30`. -/ -lemma boostAvgScalarProj_FF_c3030_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F03_F03] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F12`. -/ -lemma boostAvgScalarProj_FF_c0312_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F03 * F21`. -/ -lemma boostAvgScalarProj_FF_c0321_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F12`. -/ -lemma boostAvgScalarProj_FF_c3012_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F30 * F21`. -/ -lemma boostAvgScalarProj_FF_c3021_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F03`. -/ -lemma boostAvgScalarProj_FF_c1203_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F30`. -/ -lemma boostAvgScalarProj_FF_c1230_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F03`. -/ -lemma boostAvgScalarProj_FF_c2103_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F03_F12] - exact neg_mem (Submodule.smul_mem _ _ thetaTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F30`. -/ -lemma boostAvgScalarProj_FF_c2130_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [fieldStrengthDeriv_mul_comm] - rw [boostAvgScalarProj_F03_F12] - exact Submodule.smul_mem _ _ thetaTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F12`. -/ -lemma boostAvgScalarProj_FF_c1212_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_F12_F12] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered square `F12 * F21`. -/ -lemma boostAvgScalarProj_FF_c1221_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F12_F12] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F12`. -/ -lemma boostAvgScalarProj_FF_c2112_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F12_F12] - exact neg_mem (Submodule.smul_mem _ _ maxwellTerm_mem_span) - -/-- Projector membership for the ordered square `F21 * F21`. -/ -lemma boostAvgScalarProj_FF_c2121_mem : - boostAvgScalarProj (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - simp only [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) from fieldStrengthDeriv_antisymm {} _ _, - jetNeg_mul, jetMul_neg, neg_neg, map_neg] - rw [boostAvgScalarProj_F12_F12] - exact Submodule.smul_mem _ _ maxwellTerm_mem_span - -/-- Projector membership for the ordered derivative monomial `dd01 F01`. -/ -lemma boostAvgScalarProj_DDF_c0101_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd01_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd01 F10`. -/ -lemma boostAvgScalarProj_DDF_c0110_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, boostAvgScalarProj_dd01_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F01`. -/ -lemma boostAvgScalarProj_DDF_c1001_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [boostAvgScalarProj_dd01_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F10`. -/ -lemma boostAvgScalarProj_DDF_c1010_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inl 0) (Sum.inr 0)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, boostAvgScalarProj_dd01_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd01 F23`. -/ -lemma boostAvgScalarProj_DDF_c0123_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd01_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd01 F32`. -/ -lemma boostAvgScalarProj_DDF_c0132_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, boostAvgScalarProj_dd01_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F23`. -/ -lemma boostAvgScalarProj_DDF_c1023_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [boostAvgScalarProj_dd01_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd10 F32`. -/ -lemma boostAvgScalarProj_DDF_c1032_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inl 0} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 0) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 0} (Sum.inr 1) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 0} _ _] - rw [map_neg, boostAvgScalarProj_dd01_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F02`. -/ -lemma boostAvgScalarProj_DDF_c0202_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd02_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F20`. -/ -lemma boostAvgScalarProj_DDF_c0220_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd02_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F02`. -/ -lemma boostAvgScalarProj_DDF_c2002_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [boostAvgScalarProj_dd02_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F20`. -/ -lemma boostAvgScalarProj_DDF_c2020_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd02_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F13`. -/ -lemma boostAvgScalarProj_DDF_c0213_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd02_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd02 F31`. -/ -lemma boostAvgScalarProj_DDF_c0231_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd02_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F13`. -/ -lemma boostAvgScalarProj_DDF_c2013_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [boostAvgScalarProj_dd02_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd20 F31`. -/ -lemma boostAvgScalarProj_DDF_c2031_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inl 0} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd02_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F03`. -/ -lemma boostAvgScalarProj_DDF_c0303_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd03_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F30`. -/ -lemma boostAvgScalarProj_DDF_c0330_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd03_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F03`. -/ -lemma boostAvgScalarProj_DDF_c3003_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [boostAvgScalarProj_dd03_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F30`. -/ -lemma boostAvgScalarProj_DDF_c3030_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd03_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F12`. -/ -lemma boostAvgScalarProj_DDF_c0312_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd03_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd03 F21`. -/ -lemma boostAvgScalarProj_DDF_c0321_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd03_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F12`. -/ -lemma boostAvgScalarProj_DDF_c3012_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [boostAvgScalarProj_dd03_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd30 F21`. -/ -lemma boostAvgScalarProj_DDF_c3021_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inl 0} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inl 0)] - rw [show fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inl 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inl 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd03_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F03`. -/ -lemma boostAvgScalarProj_DDF_c1203_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd12_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F30`. -/ -lemma boostAvgScalarProj_DDF_c1230_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd12_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F03`. -/ -lemma boostAvgScalarProj_DDF_c2103_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inl 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [boostAvgScalarProj_dd12_F03] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F30`. -/ -lemma boostAvgScalarProj_DDF_c2130_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 2) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 2) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inl 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd12_F03, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F12`. -/ -lemma boostAvgScalarProj_DDF_c1212_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd12_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd12 F21`. -/ -lemma boostAvgScalarProj_DDF_c1221_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd12_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F12`. -/ -lemma boostAvgScalarProj_DDF_c2112_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [boostAvgScalarProj_dd12_F12] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd21 F21`. -/ -lemma boostAvgScalarProj_DDF_c2121_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 0} (Sum.inr 1) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 1) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 1) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 1} (Sum.inr 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 1} _ _] - rw [map_neg, boostAvgScalarProj_dd12_F12, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F02`. -/ -lemma boostAvgScalarProj_DDF_c1302_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd13_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F20`. -/ -lemma boostAvgScalarProj_DDF_c1320_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd13_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F02`. -/ -lemma boostAvgScalarProj_DDF_c3102_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inl 0) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [boostAvgScalarProj_dd13_F02] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F20`. -/ -lemma boostAvgScalarProj_DDF_c3120_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 1) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 1) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inl 0) (Sum.inr 1)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd13_F02, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F13`. -/ -lemma boostAvgScalarProj_DDF_c1313_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd13_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd13 F31`. -/ -lemma boostAvgScalarProj_DDF_c1331_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd13_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F13`. -/ -lemma boostAvgScalarProj_DDF_c3113_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 0) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [boostAvgScalarProj_dd13_F13] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd31 F31`. -/ -lemma boostAvgScalarProj_DDF_c3131_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 0} (Sum.inr 2) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 0)] - rw [show fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 2) (Sum.inr 0) = - -(fieldStrengthDeriv {Sum.inr 0, Sum.inr 2} (Sum.inr 0) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inr 0, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd13_F13, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F01`. -/ -lemma boostAvgScalarProj_DDF_c2301_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd23_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F10`. -/ -lemma boostAvgScalarProj_DDF_c2310_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd23_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F01`. -/ -lemma boostAvgScalarProj_DDF_c3201_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inl 0) (Sum.inr 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [boostAvgScalarProj_dd23_F01] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F10`. -/ -lemma boostAvgScalarProj_DDF_c3210_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 0) (Sum.inl 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 0) (Sum.inl 0) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inl 0) (Sum.inr 0)) from - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd23_F01, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F23`. -/ -lemma boostAvgScalarProj_DDF_c2323_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [boostAvgScalarProj_dd23_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd23 F32`. -/ -lemma boostAvgScalarProj_DDF_c2332_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd23_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F23`. -/ -lemma boostAvgScalarProj_DDF_c3223_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 1) (Sum.inr 2)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [boostAvgScalarProj_dd23_F23] - exact Submodule.zero_mem _ - -/-- Projector membership for the ordered derivative monomial `dd32 F32`. -/ -lemma boostAvgScalarProj_DDF_c3232_mem : - boostAvgScalarProj (fieldStrengthDeriv {Sum.inr 2, Sum.inr 1} (Sum.inr 2) (Sum.inr 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [fieldStrengthDeriv_pair_swap (Sum.inr 2) (Sum.inr 1)] - rw [show fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 2) (Sum.inr 1) = - -(fieldStrengthDeriv {Sum.inr 1, Sum.inr 2} (Sum.inr 1) (Sum.inr 2)) from - fieldStrengthDeriv_antisymm {Sum.inr 1, Sum.inr 2} _ _] - rw [map_neg, boostAvgScalarProj_dd23_F23, neg_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[0,0,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u000_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e000, map_smul, boostAvgScalarProj_u0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[0,0,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u001_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inl 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e001, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[0,1,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u010_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e010, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[0,1,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u011_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inl 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e011, map_smul, boostAvgScalarProj_u0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[1,0,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u100_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e100, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[1,0,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u101_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e101, map_smul, boostAvgScalarProj_u1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[1,1,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u110_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e110, map_smul, boostAvgScalarProj_u1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[1,1,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u111_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 0] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e111, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[2,0,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u200_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e200, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[2,0,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u201_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 1] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e201, map_smul, boostAvgScalarProj_u2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[2,1,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u210_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e210, map_smul, boostAvgScalarProj_u2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[2,1,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u211_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 1] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e211, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[3,0,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u300_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e300, map_smul, boostAvgScalarProj_u3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[3,0,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u301_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 0 * Dψ [Sum.inr 2] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e301, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[3,1,0]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u310_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e310, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[3,1,1]` (u-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_u311_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_u_e311, map_smul, boostAvgScalarProj_u3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTerm_mem_span) - -/-- Projected rotation average of `e[0,0,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar000_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e000, map_smul, boostAvgScalarProj_ubar0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected rotation average of `e[0,0,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar001_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e001, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[0,1,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar010_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e010, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[0,1,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar011_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inl 0] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e011, map_smul, boostAvgScalarProj_ubar0] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected rotation average of `e[1,0,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar100_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e100, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[1,0,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar101_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e101, map_smul, boostAvgScalarProj_ubar1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected rotation average of `e[1,1,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar110_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e110, map_smul, boostAvgScalarProj_ubar1] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected rotation average of `e[1,1,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar111_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 0] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e111, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[2,0,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar200_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e200, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[2,0,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar201_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e201, map_smul, boostAvgScalarProj_ubar2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected rotation average of `e[2,1,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar210_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e210, map_smul, boostAvgScalarProj_ubar2] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected rotation average of `e[2,1,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar211_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 1] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e211, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[3,0,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar300_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e300, map_smul, boostAvgScalarProj_ubar3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -/-- Projected rotation average of `e[3,0,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar301_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 0 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e301, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[3,1,0]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar310_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 0)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e310, map_zero] - exact Submodule.zero_mem _ - -/-- Projected rotation average of `e[3,1,1]` (ubar-family) lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_ubar311_mem : - boostAvgScalarProj (rotationPiAvg (Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_ubar_e311, map_smul, boostAvgScalarProj_ubar3] - exact Submodule.smul_mem _ _ (Submodule.smul_mem _ _ fermionKineticTermBar_mem_span) - -attribute [local irreducible] Dψ Dbarψ fieldStrengthDeriv - -set_option maxHeartbeats 16000000 in -set_option maxRecDepth 8192 in -/-- The projected rotation average of any product of two field strengths lies in - the span of the invariants. -/ -lemma boostAvgScalarProj_rotationPiAvg_FF_mem (a b c d : Fin 1 ⊕ Fin 3) : - boostAvgScalarProj (rotationPiAvg (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_fieldStrengthDeriv_nil_mul, map_smul] - rcases a with a | a <;> rcases b with b | b <;> rcases c with c | c <;> - rcases d with d | d <;> fin_cases a <;> fin_cases b <;> fin_cases c <;> - fin_cases d <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | (rw [fieldStrengthDeriv_self] - simp only [zero_mul, mul_zero, map_zero, smul_zero] - exact Submodule.zero_mem _) - | (refine Submodule.smul_mem _ _ ?_ - first - | exact boostAvgScalarProj_FF_c0101_mem - | exact boostAvgScalarProj_FF_c0110_mem - | exact boostAvgScalarProj_FF_c1001_mem - | exact boostAvgScalarProj_FF_c1010_mem - | exact boostAvgScalarProj_FF_c0123_mem - | exact boostAvgScalarProj_FF_c0132_mem - | exact boostAvgScalarProj_FF_c1023_mem - | exact boostAvgScalarProj_FF_c1032_mem - | exact boostAvgScalarProj_FF_c2301_mem - | exact boostAvgScalarProj_FF_c2310_mem - | exact boostAvgScalarProj_FF_c3201_mem - | exact boostAvgScalarProj_FF_c3210_mem - | exact boostAvgScalarProj_FF_c2323_mem - | exact boostAvgScalarProj_FF_c2332_mem - | exact boostAvgScalarProj_FF_c3223_mem - | exact boostAvgScalarProj_FF_c3232_mem - | exact boostAvgScalarProj_FF_c0202_mem - | exact boostAvgScalarProj_FF_c0220_mem - | exact boostAvgScalarProj_FF_c2002_mem - | exact boostAvgScalarProj_FF_c2020_mem - | exact boostAvgScalarProj_FF_c0213_mem - | exact boostAvgScalarProj_FF_c0231_mem - | exact boostAvgScalarProj_FF_c2013_mem - | exact boostAvgScalarProj_FF_c2031_mem - | exact boostAvgScalarProj_FF_c1302_mem - | exact boostAvgScalarProj_FF_c1320_mem - | exact boostAvgScalarProj_FF_c3102_mem - | exact boostAvgScalarProj_FF_c3120_mem - | exact boostAvgScalarProj_FF_c1313_mem - | exact boostAvgScalarProj_FF_c1331_mem - | exact boostAvgScalarProj_FF_c3113_mem - | exact boostAvgScalarProj_FF_c3131_mem - | exact boostAvgScalarProj_FF_c0303_mem - | exact boostAvgScalarProj_FF_c0330_mem - | exact boostAvgScalarProj_FF_c3003_mem - | exact boostAvgScalarProj_FF_c3030_mem - | exact boostAvgScalarProj_FF_c0312_mem - | exact boostAvgScalarProj_FF_c0321_mem - | exact boostAvgScalarProj_FF_c3012_mem - | exact boostAvgScalarProj_FF_c3021_mem - | exact boostAvgScalarProj_FF_c1203_mem - | exact boostAvgScalarProj_FF_c1230_mem - | exact boostAvgScalarProj_FF_c2103_mem - | exact boostAvgScalarProj_FF_c2130_mem - | exact boostAvgScalarProj_FF_c1212_mem - | exact boostAvgScalarProj_FF_c1221_mem - | exact boostAvgScalarProj_FF_c2112_mem - | exact boostAvgScalarProj_FF_c2121_mem) - | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX] - first - | done - | exact Submodule.zero_mem _) - -set_option maxHeartbeats 16000000 in -set_option maxRecDepth 8192 in -/-- The projected rotation average of any second-derivative field strength lies - in the span of the invariants. -/ -lemma boostAvgScalarProj_rotationPiAvg_DDF_mem (r t a b : Fin 1 ⊕ Fin 3) : - boostAvgScalarProj (rotationPiAvg (fieldStrengthDeriv {r, t} a b)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [rotationPiAvg_fieldStrengthDeriv_pair, map_smul] - rcases r with r | r <;> rcases t with t | t <;> rcases a with a | a <;> - rcases b with b | b <;> fin_cases r <;> fin_cases t <;> fin_cases a <;> - fin_cases b <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | (rw [fieldStrengthDeriv_self] - simp only [map_zero, smul_zero] - exact Submodule.zero_mem _) - | (refine Submodule.smul_mem _ _ ?_ - first - | exact boostAvgScalarProj_DDF_c0101_mem - | exact boostAvgScalarProj_DDF_c0110_mem - | exact boostAvgScalarProj_DDF_c1001_mem - | exact boostAvgScalarProj_DDF_c1010_mem - | exact boostAvgScalarProj_DDF_c0123_mem - | exact boostAvgScalarProj_DDF_c0132_mem - | exact boostAvgScalarProj_DDF_c1023_mem - | exact boostAvgScalarProj_DDF_c1032_mem - | exact boostAvgScalarProj_DDF_c0202_mem - | exact boostAvgScalarProj_DDF_c0220_mem - | exact boostAvgScalarProj_DDF_c2002_mem - | exact boostAvgScalarProj_DDF_c2020_mem - | exact boostAvgScalarProj_DDF_c0213_mem - | exact boostAvgScalarProj_DDF_c0231_mem - | exact boostAvgScalarProj_DDF_c2013_mem - | exact boostAvgScalarProj_DDF_c2031_mem - | exact boostAvgScalarProj_DDF_c0303_mem - | exact boostAvgScalarProj_DDF_c0330_mem - | exact boostAvgScalarProj_DDF_c3003_mem - | exact boostAvgScalarProj_DDF_c3030_mem - | exact boostAvgScalarProj_DDF_c0312_mem - | exact boostAvgScalarProj_DDF_c0321_mem - | exact boostAvgScalarProj_DDF_c3012_mem - | exact boostAvgScalarProj_DDF_c3021_mem - | exact boostAvgScalarProj_DDF_c1203_mem - | exact boostAvgScalarProj_DDF_c1230_mem - | exact boostAvgScalarProj_DDF_c2103_mem - | exact boostAvgScalarProj_DDF_c2130_mem - | exact boostAvgScalarProj_DDF_c1212_mem - | exact boostAvgScalarProj_DDF_c1221_mem - | exact boostAvgScalarProj_DDF_c2112_mem - | exact boostAvgScalarProj_DDF_c2121_mem - | exact boostAvgScalarProj_DDF_c1302_mem - | exact boostAvgScalarProj_DDF_c1320_mem - | exact boostAvgScalarProj_DDF_c3102_mem - | exact boostAvgScalarProj_DDF_c3120_mem - | exact boostAvgScalarProj_DDF_c1313_mem - | exact boostAvgScalarProj_DDF_c1331_mem - | exact boostAvgScalarProj_DDF_c3113_mem - | exact boostAvgScalarProj_DDF_c3131_mem - | exact boostAvgScalarProj_DDF_c2301_mem - | exact boostAvgScalarProj_DDF_c2310_mem - | exact boostAvgScalarProj_DDF_c3201_mem - | exact boostAvgScalarProj_DDF_c3210_mem - | exact boostAvgScalarProj_DDF_c2323_mem - | exact boostAvgScalarProj_DDF_c2332_mem - | exact boostAvgScalarProj_DDF_c3223_mem - | exact boostAvgScalarProj_DDF_c3232_mem) - | (norm_num [rotationPiSignZ, rotationPiSignY, rotationPiSignX] - first - | done - | exact Submodule.zero_mem _) - -set_option maxHeartbeats 16000000 in -set_option maxRecDepth 8192 in -/-- The projected rotation average of any `ψ̄ (Dψ)` pair lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_FM1_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - boostAvgScalarProj (rotationPiAvg (Dbarψ [] α * Dψ [μ] β)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | exact boostAvgScalarProj_rotationPiAvg_u000_mem - | exact boostAvgScalarProj_rotationPiAvg_u001_mem - | exact boostAvgScalarProj_rotationPiAvg_u010_mem - | exact boostAvgScalarProj_rotationPiAvg_u011_mem - | exact boostAvgScalarProj_rotationPiAvg_u100_mem - | exact boostAvgScalarProj_rotationPiAvg_u101_mem - | exact boostAvgScalarProj_rotationPiAvg_u110_mem - | exact boostAvgScalarProj_rotationPiAvg_u111_mem - | exact boostAvgScalarProj_rotationPiAvg_u200_mem - | exact boostAvgScalarProj_rotationPiAvg_u201_mem - | exact boostAvgScalarProj_rotationPiAvg_u210_mem - | exact boostAvgScalarProj_rotationPiAvg_u211_mem - | exact boostAvgScalarProj_rotationPiAvg_u300_mem - | exact boostAvgScalarProj_rotationPiAvg_u301_mem - | exact boostAvgScalarProj_rotationPiAvg_u310_mem - | exact boostAvgScalarProj_rotationPiAvg_u311_mem - -set_option maxHeartbeats 16000000 in -set_option maxRecDepth 8192 in -/-- The projected rotation average of any `(D̄ψ̄) ψ` pair lies in the span. -/ -lemma boostAvgScalarProj_rotationPiAvg_FM2_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - boostAvgScalarProj (rotationPiAvg (Dbarψ [μ] α * Dψ [] β)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rcases μ with m | m <;> fin_cases m <;> fin_cases α <;> fin_cases β <;> - (try simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk]) <;> - first - | exact boostAvgScalarProj_rotationPiAvg_ubar000_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar001_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar010_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar011_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar100_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar101_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar110_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar111_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar200_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar201_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar210_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar211_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar300_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar301_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar310_mem - | exact boostAvgScalarProj_rotationPiAvg_ubar311_mem - -/-- The reversed pair `(Dψ) ψ̄`, via anticommutation. -/ -lemma boostAvgScalarProj_rotationPiAvg_FM1r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - boostAvgScalarProj (rotationPiAvg (Dψ [μ] β * Dbarψ [] α)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] - exact neg_mem (boostAvgScalarProj_rotationPiAvg_FM1_mem μ α β) - -/-- The reversed pair `ψ (D̄ψ̄)`, via anticommutation. -/ -lemma boostAvgScalarProj_rotationPiAvg_FM2r_mem (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - boostAvgScalarProj (rotationPiAvg (Dψ [] α * Dbarψ [μ] β)) ∈ - Submodule.span ℂ massDimFourInvariants := by - rw [Dψ_mul_Dbarψ_anticomm, map_neg, map_neg] - exact neg_mem (boostAvgScalarProj_rotationPiAvg_FM2_mem μ β α) -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean deleted file mode 100644 index 51ec9756f..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Invariants/Subgroups/RotationsPi.lean +++ /dev/null @@ -1,459 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Invariants.Grading.NeutralSectors -/-! -# The rotations by `π` about the coordinate axes - -The three rotations by `π` about the coordinate axes, lifted to `SL(2,ℂ)` as -`i σ_k`, and the subgroup `rotationPiSubgroup` they generate. Their Lorentz -matrices are the diagonal sign matrices fixing the time axis and the rotation -axis and reversing the two others, recorded here entry by entry. - -This is the finite subgroup of the classification; `Averages/RotationAverage` -is the average taken over it. Being finite it admits an honest invariant -average, unlike the boosts of `AxisBoosts`. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -### The rotations by `π` - -The three rotations by `π` about the coordinate axes lift to `SL(2,ℂ)` as -`i σ_k`; their Lorentz matrices are the diagonal sign matrices fixing the time -axis and the rotation axis and reversing the two others. Averaging over this -Klein four-group kills every tensor component with an odd index pattern; since -every antisymmetric index pair is odd under exactly two of the three parities, -the weight-four sector admits no invariant. - --/ - -/-- The lift `diag(i, -i)` of the rotation by `π` about the `z`-axis. -/ -noncomputable def rotationPiZ : SL(2,ℂ) := - ⟨!![Complex.I, 0; 0, -Complex.I], by - simp [Matrix.det_fin_two_of]⟩ - -/-- The lift `i σ1` of the rotation by `π` about the `x`-axis. -/ -noncomputable def rotationPiX : SL(2,ℂ) := - ⟨!![0, Complex.I; Complex.I, 0], by - simp [Matrix.det_fin_two_of]⟩ - -/-- The lift `i σ2` of the rotation by `π` about the `y`-axis. -/ -noncomputable def rotationPiY : SL(2,ℂ) := - ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ - -/-- The subgroup of `SL(2,ℂ)` generated by the lifted rotations by `π` about the - three coordinate axes. In `SL(2,ℂ)` this is the quaternion group `Q₈`: each - lift squares to `-1` rather than to `1`, so it is the double cover of the Klein - four-group `{1, R_x, R_y, R_z}` of rotations by `π` inside the rotation group. - `rotationPiAvg` averages the representation over the four elements - `1, R_z, R_y, R_x`, which is the average over that Klein four-group. -/ -noncomputable def rotationPiSubgroup : Subgroup SL(2,ℂ) := - Subgroup.closure {rotationPiZ, rotationPiX, rotationPiY} - -lemma rotationPiZ_mem_rotationPiSubgroup : rotationPiZ ∈ rotationPiSubgroup := - Subgroup.subset_closure (by simp) - -lemma rotationPiX_mem_rotationPiSubgroup : rotationPiX ∈ rotationPiSubgroup := - Subgroup.subset_closure (by simp) - -lemma rotationPiY_mem_rotationPiSubgroup : rotationPiY ∈ rotationPiSubgroup := - Subgroup.subset_closure (by simp) - -/-- The sign pattern of the rotation by `π` about the `z`-axis. -/ -def rotationPiSignZ : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => -1 - | Sum.inr 1 => -1 - | Sum.inr 2 => 1 - -/-- The sign pattern of the rotation by `π` about the `x`-axis. -/ -def rotationPiSignX : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => 1 - | Sum.inr 1 => -1 - | Sum.inr 2 => -1 - -/-- The sign pattern of the rotation by `π` about the `y`-axis. -/ -def rotationPiSignY : Fin 1 ⊕ Fin 3 → ℝ - | Sum.inl _ => 1 - | Sum.inr 0 => -1 - | Sum.inr 1 => 1 - | Sum.inr 2 => -1 - -/-- The Lorentz matrix of the `z`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_rotationPiZ (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 a b = - if a = b then rotationPiSignZ a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [rotationPiZ, rotationPiSignZ, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- The Lorentz matrix of the `x`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_rotationPiX (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 a b = - if a = b then rotationPiSignX a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [rotationPiX, rotationPiSignX, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- The Lorentz matrix of the `y`-parity is the diagonal sign matrix. -/ -lemma toLorentzGroup_rotationPiY (a b : Fin 1 ⊕ Fin 3) : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 a b = - if a = b then rotationPiSignY a else 0 := by - refine Complex.ofReal_injective ?_ - rw [Lorentz.SL2C.toLorentzGroup_eq_trace] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - · simp [rotationPiY, rotationPiSignY, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.trace, Matrix.mul_apply, Fin.sum_univ_two, Matrix.conjTranspose, - Matrix.diag] - simp [Matrix.vecMul, Matrix.vecHead, Matrix.vecTail] - -/-- The inverse of the `z`-parity, entrywise. -/ -lemma rotationPiZ_inv_coe : - (rotationPiZ⁻¹ : SL(2,ℂ)).1 = !![-Complex.I, 0; 0, Complex.I] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [rotationPiZ] - -/-- The inverse of the `y`-parity, entrywise. -/ -lemma rotationPiY_inv_coe : - (rotationPiY⁻¹ : SL(2,ℂ)).1 = !![0, -1; 1, 0] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [rotationPiY] - -/-- The inverse of the `x`-parity, entrywise. -/ -lemma rotationPiX_inv_coe : - (rotationPiX⁻¹ : SL(2,ℂ)).1 = !![0, -Complex.I; -Complex.I, 0] := by - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> simp [rotationPiX] - - -/-! - -### The Lorentz matrices of the rotations, entry by entry - --/ - -/-- Entries of the Lorentz matrix of `rotationPiZ`. -/ -lemma rotationPiMatZ_00 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_01 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_02 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_03 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_10 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_11 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inr 0) = -1 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_12 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_13 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_20 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_21 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_22 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inr 1) = -1 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_23 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_30 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_31 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_32 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -lemma rotationPiMatZ_33 : - (Lorentz.SL2C.toLorentzGroup rotationPiZ).1 (Sum.inr 2) (Sum.inr 2) = 1 := by - rw [toLorentzGroup_rotationPiZ] - norm_num [rotationPiSignZ] - all_goals decide - -/-- Entries of the Lorentz matrix of `rotationPiX`. -/ -lemma rotationPiMatX_00 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_01 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_02 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_03 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_10 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_11 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inr 0) = 1 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_12 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_13 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_20 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_21 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_22 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inr 1) = -1 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_23 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_30 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_31 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_32 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -lemma rotationPiMatX_33 : - (Lorentz.SL2C.toLorentzGroup rotationPiX).1 (Sum.inr 2) (Sum.inr 2) = -1 := by - rw [toLorentzGroup_rotationPiX] - norm_num [rotationPiSignX] - all_goals decide - -/-- Entries of the Lorentz matrix of `rotationPiY`. -/ -lemma rotationPiMatY_00 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inl 0) = 1 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_01 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_02 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_03 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inl 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_10 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_11 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inr 0) = -1 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_12 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_13 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 0) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_20 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_21 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_22 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inr 1) = 1 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_23 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 1) (Sum.inr 2) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_30 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inl 0) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_31 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inr 0) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_32 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inr 1) = 0 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -lemma rotationPiMatY_33 : - (Lorentz.SL2C.toLorentzGroup rotationPiY).1 (Sum.inr 2) (Sum.inr 2) = -1 := by - rw [toLorentzGroup_rotationPiY] - norm_num [rotationPiSignY] - all_goals decide - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean new file mode 100644 index 000000000..c570536c9 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean @@ -0,0 +1,247 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction +/-! +# The jet derivative is a Lorentz vector + +The total derivative `∂_μ` on the jet algebra carries a spacetime index, and this file proves +that it carries it covariantly: + +`ρ(Λ) (∂_μ x) = ∑ a, Λ_{aμ} • ∂_a (ρ(Λ) x)`. + +*The proof follows the derivation.* On the B-boson factor the jet algebra is the symmetric +algebra of the component space, `∂_μ` is the derivation determined by appending `μ` to the +derivative multiset, and appending is, at the component level, multiplication of the +derivative-symbol factor by `∂_μ` (`JetComponentSpace.shiftLin`). The representation is +multiplicative there, and `∂_μ` transforms as a dual covector +(`Lorentz.CoVector.sl2Rep_dual_dualBasis`), which gives the identity on the component space; +the symmetric-algebra induction then carries it to the jet algebra, the Leibniz rule handling +the products. Base change to `ℂ` and the tensor decomposition of the lepton–gauge-sector jet +algebra give the statement on the purely bosonic part, which is where the derivatives of the +field strength live. + +## Key results + +- `StandardModel.BBoson.JetAlgebra.repLorentzGroup_jetDeriv` : the covariance on the B-boson + jet algebra. +- `LeptonGaugeSector.JetAlgebra.repLorentzGroup_jetDeriv_tmul_one` : the covariance on the + bosonic part of the lepton–gauge-sector jet algebra. + +-/ + +@[expose] public section + +namespace StandardModel +open TensorProduct Matrix MatrixGroups + +namespace BBoson + +/-- The real derivative-algebra representation is multiplicative: it is the lift of a linear + map to the symmetric algebra. -/ +lemma _root_.DerivAlgebraReal.repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) + (a b : DerivAlgebraReal) : + DerivAlgebraReal.repLorentzGroup Λ (a * b) = + DerivAlgebraReal.repLorentzGroup Λ a * DerivAlgebraReal.repLorentzGroup Λ b := by + simp [DerivAlgebraReal.repLorentzGroup] + +namespace JetComponentSpace + +/-- Appending a derivative index, as a linear map on the B-boson jet component space: it + multiplies the derivative-symbol factor by the symbol `∂_μ`. -/ +noncomputable def shiftLin (μ : Fin 1 ⊕ Fin 3) : JetComponentSpace →ₗ[ℝ] JetComponentSpace := + TensorProduct.map + (LinearMap.mulRight ℝ (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _))) + LinearMap.id + +lemma shiftLin_tmul (μ : Fin 1 ⊕ Fin 3) + (p : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) + (f : Module.Dual ℝ BBoson) : + shiftLin μ (p ⊗ₜ[ℝ] f) = + (p * LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) ⊗ₜ[ℝ] f := rfl + +/-- On the basis, the shift appends the derivative index. -/ +@[simp] +lemma shiftLin_basis (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) : + shiftLin μ (JetComponentSpace.basis (.dB s ν)) = + JetComponentSpace.basis (.dB (s + {μ}) ν) := by + rw [jetComponentSpace_basis_dB, shiftLin_tmul, dualRealJetAlgebraBasis_mul, + jetComponentSpace_basis_dB] + + +/-- **The shift is Lorentz covariant on the component space.** Appending `∂_μ` and then acting + is acting and then appending the transformed `∂_μ`, which is a combination of the `∂_a`. -/ +lemma repLorentzGroup_shiftLin (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + JetComponentSpace.repLorentzGroup Λ (shiftLin μ v) = + ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • + shiftLin a (JetComponentSpace.repLorentzGroup Λ v) := by + have hsym : DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) = + ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • + LagrangianTheory.dualRealJetAlgebraBasis ({a} : Multiset _) := by + rw [dualRealJetAlgebraBasis_singleton, DerivAlgebraReal.repLorentzGroup_apply_ι, + Lorentz.CoVector.sl2Rep_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, dualRealJetAlgebraBasis_singleton] + induction v using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul p f => + have hrep : ∀ q : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector), + JetComponentSpace.repLorentzGroup Λ (q ⊗ₜ[ℝ] f) = + (DerivAlgebraReal.repLorentzGroup Λ q) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ f) := fun _ => rfl + rw [shiftLin_tmul, hrep, hrep, DerivAlgebraReal.repLorentzGroup_apply_mul, hsym, + Finset.mul_sum, TensorProduct.sum_tmul] + exact Finset.sum_congr rfl fun a _ => by + rw [mul_smul_comm, shiftLin_tmul, TensorProduct.smul_tmul'] + +end JetComponentSpace + +namespace JetAlgebra + +/-- The jet derivative on a linear generator is the component-space shift. -/ +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + jetDeriv μ (SymmetricAlgebra.ι ℝ JetComponentSpace v) = + SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.shiftLin μ v) := by + have key : (jetDeriv μ) ∘ₗ (SymmetricAlgebra.ι ℝ JetComponentSpace) = + (SymmetricAlgebra.ι ℝ JetComponentSpace) ∘ₗ (JetComponentSpace.shiftLin μ) := by + refine JetComponentSpace.basis.ext fun g => ?_ + cases g with + | dB s ν => + simp only [LinearMap.coe_comp, Function.comp_apply, + show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis (.dB s ν)) = + ofGenerator (.dB s ν) from rfl, + jetDeriv_ofGenerator, JetGenerators.shift_dB, + JetComponentSpace.shiftLin_basis] + rfl + exact DFunLike.congr_fun key v + +set_option maxHeartbeats 4000000 in +/-- **The jet derivative on the B-boson jet algebra is a Lorentz vector.** -/ +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + repLorentzGroup Λ (jetDeriv μ x) = + ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • jetDeriv a (repLorentzGroup Λ x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => + have h1 : jetDeriv μ (algebraMap ℝ JetAlgebra r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] + rw [h1, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, repLorentzGroup_apply_ι, repLorentzGroup_apply_ι, + JetComponentSpace.repLorentzGroup_shiftLin, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + + +set_option maxHeartbeats 1000000 in +/-- **The complexified jet derivative is a Lorentz vector.** -/ +lemma complexRepLorentzGroup_baseChange_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (p : ℂ ⊗[ℝ] JetAlgebra) : + complexRepLorentzGroup Λ (LinearMap.baseChange ℂ (jetDeriv μ) p) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + LinearMap.baseChange ℂ (jetDeriv a) (complexRepLorentzGroup Λ p) := by + have hrep : ∀ (c : ℂ) (y : JetAlgebra), complexRepLorentzGroup Λ (c ⊗ₜ[ℝ] y) = + c ⊗ₜ[ℝ] repLorentzGroup Λ y := fun _ _ => rfl + induction p using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul c y => + rw [LinearMap.baseChange_tmul, hrep, hrep, repLorentzGroup_jetDeriv, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [TensorProduct.tmul_smul, LinearMap.baseChange_tmul, + ← algebraMap_smul (R := ℝ) ℂ] + rfl + +end JetAlgebra + +end BBoson + +end StandardModel + +namespace LeptonGaugeSector +open TensorProduct StandardModel Matrix MatrixGroups + +namespace JetAlgebra + +set_option maxHeartbeats 1000000 in +/-- **The jet derivative of a gauge-field element is a Lorentz vector.** On the purely bosonic + part of the jet algebra — where the second derivatives of the field strength live — the total + derivative `∂_μ` transforms as a covector, mixing the spacetime directions by the columns of + the Lorentz matrix. -/ +lemma repLorentzGroup_jetDeriv_tmul_one (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + repLorentzGroup Λ (jetDeriv μ (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra))) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup Λ (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra))) := by + have hone : LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra) = 1 := + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one Λ + have hd : ∀ (q : ℂ ⊗[ℝ] BBoson.JetAlgebra) (ν : Fin 1 ⊕ Fin 3), + jetDeriv ν (q ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = + (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv ν) q) ⊗ⱼ + (1 : LeptonSinglet.JetAlgebra) := fun q ν => by + rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero] + rw [hd, repLorentzGroup_tmul, repLorentzGroup_tmul, hone, + BBoson.JetAlgebra.complexRepLorentzGroup_baseChange_jetDeriv, sum_tmul] + exact Finset.sum_congr rfl fun a _ => by rw [hd, smul_tmul'] + +/-! + +## The bosonic part and the light-cone derivatives + +-/ + +/-- The purely bosonic part of the jet algebra: the elements whose lepton factor is trivial. + The derivatives of the field strength live here. -/ +noncomputable def bosonic : Submodule ℂ JetAlgebra := + LinearMap.range ((TensorProduct.mk ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) + LeptonSinglet.JetAlgebra).flip (1 : LeptonSinglet.JetAlgebra)) + +/-- Membership of the bosonic part, unfolded. -/ +lemma mem_bosonic {x : JetAlgebra} : + x ∈ bosonic ↔ ∃ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, + p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = x := Iff.rfl + +lemma fieldStrengthDeriv_mem_bosonic (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν ∈ bosonic := mem_bosonic.2 ⟨_, rfl⟩ + +lemma jetDeriv_mem_bosonic (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} (hx : x ∈ bosonic) : + jetDeriv μ x ∈ bosonic := by + obtain ⟨p, rfl⟩ := mem_bosonic.1 hx + refine mem_bosonic.2 ⟨LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p, ?_⟩ + rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero] + +/-- The covariance of the jet derivative on the bosonic part. -/ +lemma repLorentzGroup_jetDeriv_of_mem_bosonic (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + {x : JetAlgebra} (hx : x ∈ bosonic) : + repLorentzGroup Λ (jetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup Λ x) := by + obtain ⟨p, rfl⟩ := mem_bosonic.1 hx + exact repLorentzGroup_jetDeriv_tmul_one Λ μ p + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean index 0a9830e97..0c7ca24d7 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean @@ -261,7 +261,7 @@ The embedded field-strength derivatives are tensors: every index, the derivative indices included, transforms by the Lorentz matrix. For a *diagonal* Lorentz matrix this collapses to a scaling by the product of the signs carried by the indices, which is what the parity and boost arguments of -`Invariants/` use. +`FermionicParity` and `Grading/BoostWeight` use. -/ diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean new file mode 100644 index 000000000..5919f3f32 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean @@ -0,0 +1,593 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.Hypercharge +/-! +# Where an invariant of mass weight eight lives + +## i. Overview + +A Lagrangian density of mass dimension four — mass weight eight — which is covariant is a +combination of terms drawn from exactly six sectors: + +- the fermionic kinetic terms `D̄_μ ψ̄_α ψ_β` with the derivative on the conjugate lepton, +- the fermionic kinetic terms `ψ̄_α D_μ ψ_β` with the derivative on the lepton, +- the second derivatives of the field strength `∂_ρ ∂_τ F_{μν}`, +- the photon pairs `F_{μν} F_{μ'ν'}`, +- the like-species fermionic pairs `ψ_α D_μ ψ_β` and `ψ̄_α D̄_μ ψ̄_β`. + +This is the sector decomposition. Only gauge covariance and the mass weight are used; each +sector is cut down to its invariants elsewhere, Lorentz invariance being what does that. + +The last two sectors carry hypercharge `± 12`, so an invariant — being a charge singlet — has +no component in them, and the hypercharge grading removes them: +`mem_massDimFour_neutral_sectors_of_isInvariant` is the same statement with four sectors. + +## ii. The argument + +An invariant lies in the covariant subalgebra (`isInvariant_iff_mem_covariantAlgebra`), which +is generated by `∂_s F_{μν}`, `D_l ψ_α` and `D̄_l ψ̄_α`. These generators are homogeneous of +mass weights `4 + 2|s|`, `3 + 2|l|` and `3 + 2|l|`, so the subalgebra is spanned by monomials of +definite weight, `covWeightSpan`. Reading off the coefficient of `X ^ 8` of the mass-weight +polynomial — which on an element of weight eight returns the element itself — puts a covariant +term of weight eight in the span of the monomials of weight eight. + +The weights of the generators are at least three, so such a monomial has at most two factors, +and the possible weight profiles are only `8`, `4 + 4` and `3 + 5`. A weight-`8` factor must be +bosonic, the fermionic weights being odd; `4 + 4` is a photon pair; and `3 + 5` is a pair of +fermionic generators, one undifferentiated and one carrying a single derivative, in one of the +four species pairings. There is no mixed profile: a bosonic factor of weight four and a +fermionic one of weight three sum to the odd number seven. + +The two orders of each fermionic pair are traded for one another by anticommutativity, which is +why each of the four fermionic sectors is spanned by the products with the derivative on the +second factor alone. + +The last step reads off the hypercharges. Only lists of length zero and one occur, so no +induction is needed: the field strength is neutral, lying in the B-boson factor, and +`Dψ_singleton` writes `D_μ ψ_α` as `∂_μ ψ_α - 6 i B_μ ψ_α`, both summands of charge `6` since +`B_μ` is neutral. Projecting the sector decomposition onto the charge singlets then fixes the +four neutral sectors and kills the two like-species ones. + +## iii. Key results + +- `JetAlgebra.covWeightSpan` : the span of the monomials of a given mass weight in the + covariant generators. +- `JetAlgebra.mem_covWeightSpan_of_mem_covariantAlgebra` : an element of the covariant + subalgebra which is homogeneous of mass weight `n` lies in the span of the monomials of + weight `n`. +- `JetAlgebra.covWeightSpan_eight_le` : the weight-eight monomials are exhausted by the six + families. +- `JetAlgebra.mem_massDimFour_sectors_of_isInvariant` : **the sector decomposition** — an + invariant of mass weight eight lies in the join of the six sector spans. +- `JetAlgebra.Dψ_singleton_mem_hyperchargeSubmodule` and its three companions : the fermionic + generators of weight three and five carry hypercharge `± 6`. +- `JetAlgebra.mem_massDimFour_neutral_sectors_of_isInvariant` : **the neutral sector + decomposition** — an invariant of mass weight eight lies in the join of the four neutral + sector spans. + +## iv. Table of contents + +- A. The covariant generators, indexed +- B. The span of the monomials of a given mass weight +- C. The mass-weight-eight monomials +- D. The sector decomposition +- E. The hypercharges of the covariant generators +- F. Removing the charged sectors + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +/-! + +## A. The covariant generators, indexed + +The generators of the covariant subalgebra form three families, and the classification below is +a case analysis on which family a factor comes from together with how many derivatives it +carries. An index type for the generators makes that case analysis available, and gives the +mass weight as a function of the index rather than of the element. + +-/ + +/-- An index for the generators of the covariant subalgebra: a derivative of the field + strength, a covariant derivative of the lepton, or a covariant derivative of the conjugate + lepton. -/ +inductive CovGen where + /-- The field-strength derivative `∂_s F_{μν}`. -/ + | fieldStrength (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : CovGen + /-- The covariant derivative `D_l ψ_α` of the lepton. -/ + | lepton (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : CovGen + /-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton. -/ + | conjLepton (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : CovGen + +/-- The mass weight of a covariant generator: `4 + 2 |s|` for `∂_s F_{μν}`, and `3 + 2 |l|` for + the covariant derivatives, matching `MassWeight`. -/ +def CovGen.weight : CovGen → ℕ + | .fieldStrength s _ _ => 4 + 2 * Multiset.card s + | .lepton l _ => 3 + 2 * l.length + | .conjLepton l _ => 3 + 2 * l.length + +/-- Every covariant generator has mass weight at least three: this is what bounds the number of + factors in a monomial of given weight. -/ +lemma CovGen.three_le_weight (g : CovGen) : 3 ≤ g.weight := by + cases g <;> simp only [CovGen.weight] <;> omega + +namespace JetAlgebra + +/-- The element of the jet algebra associated with a covariant-generator index. -/ +noncomputable def covGenVal : CovGen → JetAlgebra + | .fieldStrength s μ ν => fieldStrengthDeriv s μ ν + | .lepton l α => Dψ l α + | .conjLepton l α => Dbarψ l α + +/-- The covariant generators generate the covariant subalgebra. -/ +lemma covGenVal_mem_covariantAlgebra (g : CovGen) : covGenVal g ∈ CovariantAlgebra := by + cases g with + | fieldStrength s μ ν => exact fieldStrengthDeriv_mem_covariantAlgebra s μ ν + | lepton l α => exact Dψ_mem_covariantAlgebra l α + | conjLepton l α => exact Dbarψ_mem_covariantAlgebra l α + +/-- Each covariant generator is homogeneous of its stated mass weight. -/ +lemma covGenVal_mem_massWeightSubmodule (g : CovGen) : + covGenVal g ∈ massWeightSubmodule g.weight := by + cases g with + | fieldStrength s μ ν => exact fieldStrengthDeriv_mem_massWeightSubmodule s μ ν + | lepton l α => exact Dψ_mem_massWeightSubmodule l α + | conjLepton l α => exact Dbarψ_mem_massWeightSubmodule l α + +/-! + +## B. The span of the monomials of a given mass weight + +The covariant subalgebra is generated by homogeneous elements, so it is spanned by the monomials +of definite mass weight. Taking the weight-`n` part of an element of the subalgebra therefore +lands in the span of the weight-`n` monomials, and on an element which is already homogeneous of +weight `n` that operation is the identity. + +-/ + +/-- The span of the products of covariant generators whose mass weights sum to `n`. -/ +noncomputable def covWeightSpan (n : ℕ) : Submodule ℂ JetAlgebra := + Submodule.span ℂ {x : JetAlgebra | ∃ l : List CovGen, (l.map CovGen.weight).sum = n ∧ + x = (l.map covGenVal).prod} + +/-- A product of covariant generators is homogeneous, of the sum of their weights. -/ +lemma prod_covGenVal_mem_massWeightSubmodule (l : List CovGen) : + (l.map covGenVal).prod ∈ massWeightSubmodule ((l.map CovGen.weight).sum) := by + induction l with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil] + exact SetLike.GradedOne.one_mem + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + exact mul_mem_massWeightSubmodule (covGenVal_mem_massWeightSubmodule g) ih + +/-- The monomials of weight `n` are homogeneous of mass weight `n`. -/ +lemma covWeightSpan_le_massWeightSubmodule (n : ℕ) : + covWeightSpan n ≤ massWeightSubmodule n := by + refine Submodule.span_le.mpr ?_ + rintro x ⟨l, hl, rfl⟩ + exact hl ▸ prod_covGenVal_mem_massWeightSubmodule l + +/-- The unit is a monomial of weight zero: the empty product. -/ +lemma one_mem_covWeightSpan_zero : (1 : JetAlgebra) ∈ covWeightSpan 0 := + Submodule.subset_span ⟨[], by simp, by simp⟩ + +/-- A covariant generator is a monomial of its own weight. -/ +lemma covGenVal_mem_covWeightSpan (g : CovGen) : covGenVal g ∈ covWeightSpan g.weight := + Submodule.subset_span ⟨[g], by simp, by simp⟩ + +/-- Weights add under multiplication of monomials: the index lists concatenate. -/ +lemma mul_mem_covWeightSpan {m n : ℕ} {x y : JetAlgebra} (hx : x ∈ covWeightSpan m) + (hy : y ∈ covWeightSpan n) : x * y ∈ covWeightSpan (m + n) := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := distrib_add_mul + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := distrib_mul_add + have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u + have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u + have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := + fun r u v => smul_mul_assoc r u v + have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := + fun r u v => mul_smul_comm r u v + induction hx using Submodule.span_induction with + | mem x' hx' => + induction hy using Submodule.span_induction with + | mem y' hy' => + obtain ⟨l, hl, rfl⟩ := hx' + obtain ⟨l', hl', rfl⟩ := hy' + refine Submodule.subset_span ⟨l ++ l', ?_, ?_⟩ + · rw [List.map_append, List.sum_append, hl, hl'] + · rw [List.map_append, List.prod_append] + | zero => rw [hz₂]; exact zero_mem _ + | add u v _ _ ihu ihv => rw [hd₂]; exact add_mem ihu ihv + | smul r u _ ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih + | zero => rw [hz₁]; exact zero_mem _ + | add u v _ _ ihu ihv => rw [hd₁]; exact add_mem ihu ihv + | smul r u _ ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih + +/-- The join of the monomial spans is closed under multiplication. -/ +lemma mul_mem_iSup_covWeightSpan {x y : JetAlgebra} (hx : x ∈ ⨆ n, covWeightSpan n) + (hy : y ∈ ⨆ n, covWeightSpan n) : x * y ∈ ⨆ n, covWeightSpan n := by + have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := distrib_add_mul + have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := distrib_mul_add + induction hx using Submodule.iSup_induction' with + | mem m u hu => + induction hy using Submodule.iSup_induction' with + | mem n v hv => exact Submodule.mem_iSup_of_mem _ (mul_mem_covWeightSpan hu hv) + | zero => rw [mul_zero]; exact zero_mem _ + | add v w _ _ ihv ihw => rw [hd₂]; exact add_mem ihv ihw + | zero => rw [zero_mul]; exact zero_mem _ + | add u v _ _ ihu ihv => rw [hd₁]; exact add_mem ihu ihv + +/-- Every element of the covariant subalgebra is a sum of monomials of definite mass weight. -/ +lemma mem_iSup_covWeightSpan_of_mem_covariantAlgebra {x : JetAlgebra} + (hx : x ∈ CovariantAlgebra) : x ∈ ⨆ n, covWeightSpan n := by + induction hx using CovariantAlgebra.induction_on with + | fieldStrength s μ ν => + exact Submodule.mem_iSup_of_mem _ + (covGenVal_mem_covWeightSpan (CovGen.fieldStrength s μ ν)) + | lepton l α => + exact Submodule.mem_iSup_of_mem _ (covGenVal_mem_covWeightSpan (CovGen.lepton l α)) + | conjLepton l α => + exact Submodule.mem_iSup_of_mem _ (covGenVal_mem_covWeightSpan (CovGen.conjLepton l α)) + | algebraMap r => + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem 0 one_mem_covWeightSpan_zero) + | add u v _ _ ihu ihv => exact add_mem ihu ihv + | mul u v _ _ ihu ihv => exact mul_mem_iSup_covWeightSpan ihu ihv + +/-- Taking the weight-`m` part of a sum of monomials of definite weight leaves the monomial + span: each summand either survives unchanged or is killed. -/ +lemma coeff_massWeightPoly_mem_covWeightSpan {x : JetAlgebra} + (hx : x ∈ ⨆ n, covWeightSpan n) (m : ℕ) : + (massWeightPoly x).coeff m ∈ covWeightSpan m := by + induction hx using Submodule.iSup_induction' with + | mem n u hu => + by_cases hmn : m = n + · subst hmn + rwa [coeff_massWeightPoly_of_mem (covWeightSpan_le_massWeightSubmodule m hu)] + · rw [coeff_massWeightPoly_of_mem_ne (fun h => hmn h.symm) + (covWeightSpan_le_massWeightSubmodule n hu)] + exact zero_mem _ + | zero => rw [map_zero, Polynomial.coeff_zero]; exact zero_mem _ + | add u v _ _ ihu ihv => rw [map_add, Polynomial.coeff_add]; exact add_mem ihu ihv + +/-- An element of the covariant subalgebra which is homogeneous of mass weight `n` lies in the + span of the monomials of weight `n`. -/ +lemma mem_covWeightSpan_of_mem_covariantAlgebra {n : ℕ} {x : JetAlgebra} + (hmem : x ∈ CovariantAlgebra) (hx : x ∈ massWeightSubmodule n) : x ∈ covWeightSpan n := by + have h := coeff_massWeightPoly_mem_covWeightSpan + (mem_iSup_covWeightSpan_of_mem_covariantAlgebra hmem) n + rwa [coeff_massWeightPoly_of_mem hx] at h + +/-! + +## C. The mass-weight-eight monomials + +Every generator has weight at least three, so a monomial of weight eight has at most two +factors. A single factor of weight eight must be a field strength, the fermionic weights being +odd; and eight splits as `4 + 4` or `3 + 5` only, a bosonic factor of weight four and a +fermionic one of weight three summing to the odd number seven. So the weight-eight monomials +are the second derivatives of the field strength, the photon pairs, and the products of an +undifferentiated fermionic generator with a singly-differentiated one, in each of the four +species pairings; the order of the two fermionic factors is normalised by anticommutativity. + +-/ + +/-- The covariant lepton derivatives anticommute among themselves: they are odd elements of the + linear-matter submodule. -/ +lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dψ l α * Dψ l' β = -(Dψ l' β * Dψ l α) := + eq_neg_of_add_eq_zero_left + (mul_add_swap_of_mem (Dψ_mem_LinearMatterSubmodule l α) + (Dψ_mem_LinearMatterSubmodule l' β)) + +/-- The conjugate covariant lepton derivatives anticommute among themselves. -/ +lemma Dbarψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + Dbarψ l α * Dbarψ l' β = -(Dbarψ l' β * Dbarψ l α) := + eq_neg_of_add_eq_zero_left + (mul_add_swap_of_mem (Dbarψ_mem_LinearMatterSubmodule l α) + (Dbarψ_mem_LinearMatterSubmodule l' β)) + +/-- **The weight-eight monomials.** A monomial of mass weight eight in the covariant generators + is a second derivative of the field strength, a photon pair, or a product of two fermionic + generators one of which carries a single derivative. The six families are presented as + membership hypotheses so that the caller may take the target submodule to be any join + containing them. -/ +lemma covWeightSpan_eight_le {W : Submodule ℂ JetAlgebra} + (hbar : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dbarψ [μ] α * Dψ [] β ∈ W) + (hkin : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dbarψ [] α * Dψ [μ] β ∈ W) + (hdd : ∀ ρ τ μ ν : Fin 1 ⊕ Fin 3, fieldStrengthDeriv {ρ, τ} μ ν ∈ W) + (hff : ∀ μ ν μ' ν' : Fin 1 ⊕ Fin 3, + fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν' ∈ W) + (hpp : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dψ [] α * Dψ [μ] β ∈ W) + (hbb : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dbarψ [] α * Dbarψ [μ] β ∈ W) : + covWeightSpan 8 ≤ W := by + refine Submodule.span_le.mpr ?_ + rintro x ⟨l, hl, rfl⟩ + rcases l with _ | ⟨a, _ | ⟨b, _ | ⟨c, t⟩⟩⟩ + · simp at hl + · simp only [List.map_cons, List.map_nil, List.sum_cons, List.sum_nil, add_zero] at hl + simp only [List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, mul_one, + SetLike.mem_coe] + cases a with + | fieldStrength s μ ν => + have hs : Multiset.card s = 2 := by simp only [CovGen.weight] at hl; omega + obtain ⟨ρ, τ, rfl⟩ := Multiset.card_eq_two.mp hs + exact hdd ρ τ μ ν + | lepton l α => exfalso; simp only [CovGen.weight] at hl; omega + | conjLepton l α => exfalso; simp only [CovGen.weight] at hl; omega + · simp only [List.map_cons, List.map_nil, List.sum_cons, List.sum_nil, add_zero] at hl + simp only [List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, mul_one, + SetLike.mem_coe] + have hpair : ∀ (l l' : List (Fin 1 ⊕ Fin 3)), 3 + 2 * l.length + (3 + 2 * l'.length) = 8 → + (l = [] ∧ ∃ μ, l' = [μ]) ∨ ((∃ μ, l = [μ]) ∧ l' = []) := by + intro l l' h + by_cases hl0 : l.length = 0 + · exact Or.inl ⟨List.length_eq_zero_iff.mp hl0, + List.length_eq_one_iff.mp (by omega)⟩ + · exact Or.inr ⟨List.length_eq_one_iff.mp (by omega), + List.length_eq_zero_iff.mp (by omega)⟩ + cases a with + | fieldStrength s μ ν => + cases b with + | fieldStrength s' μ' ν' => + have hs : Multiset.card s = 0 ∧ Multiset.card s' = 0 := by + simp only [CovGen.weight] at hl; omega + obtain rfl := Multiset.card_eq_zero.mp hs.1 + obtain rfl := Multiset.card_eq_zero.mp hs.2 + exact hff μ ν μ' ν' + | lepton l α => exfalso; simp only [CovGen.weight] at hl; omega + | conjLepton l α => exfalso; simp only [CovGen.weight] at hl; omega + | lepton l α => + cases b with + | fieldStrength s' μ' ν' => exfalso; simp only [CovGen.weight] at hl; omega + | lepton l' β => + show Dψ l α * Dψ l' β ∈ W + simp only [CovGen.weight] at hl + rcases hpair l l' (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ + · exact hpp α ν β + · rw [Dψ_mul_Dψ_anticomm] + exact neg_mem (hpp β ν α) + | conjLepton l' β => + show Dψ l α * Dbarψ l' β ∈ W + rw [Dψ_mul_Dbarψ_anticomm] + refine neg_mem ?_ + simp only [CovGen.weight] at hl + rcases hpair l' l (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ + · exact hkin β ν α + · exact hbar β ν α + | conjLepton l α => + cases b with + | fieldStrength s' μ' ν' => exfalso; simp only [CovGen.weight] at hl; omega + | lepton l' β => + show Dbarψ l α * Dψ l' β ∈ W + simp only [CovGen.weight] at hl + rcases hpair l l' (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ + · exact hkin α ν β + · exact hbar α ν β + | conjLepton l' β => + show Dbarψ l α * Dbarψ l' β ∈ W + simp only [CovGen.weight] at hl + rcases hpair l l' (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ + · exact hbb α ν β + · rw [Dbarψ_mul_Dbarψ_anticomm] + exact neg_mem (hbb β ν α) + · exfalso + have ha := a.three_le_weight + have hb := b.three_le_weight + have hc := c.three_le_weight + simp only [List.map_cons, List.sum_cons] at hl + omega + +/-! + +## D. The sector decomposition + +Assembling the two halves: an invariant lies in the covariant subalgebra, so if it is +homogeneous of mass weight eight it lies in the span of the weight-eight monomials, and those +are exhausted by the six families. + +The two like-species families `ψψ` and `ψ̄ψ̄` carry hypercharge `± 12` and so contain no +invariant; they are kept here because nothing but covariance and the mass weight has been used +to get this far. + +-/ + +/-- **Where a covariant term of mass dimension four lives.** An element of the covariant + subalgebra which is homogeneous of mass weight eight — mass dimension four — lies in the join + of the six sector spans: the two fermionic kinetic sectors, the second derivatives of the + field strength, the photon pairs, and the two like-species fermionic pairs. -/ +theorem mem_massDimFour_sectors_of_mem_covariantAlgebra {x : JetAlgebra} + (hmem : x ∈ CovariantAlgebra) (h8 : x ∈ massWeightSubmodule 8) : + x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dψ [] α * Dψ [μ] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dbarψ [μ] β} := by + refine covWeightSpan_eight_le ?_ ?_ ?_ ?_ ?_ ?_ + (mem_covWeightSpan_of_mem_covariantAlgebra hmem h8) + · exact fun α μ β => Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.subset_span ⟨α, μ, β, rfl⟩))))) + · exact fun α μ β => Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.subset_span ⟨α, μ, β, rfl⟩))))) + · exact fun ρ τ μ ν => Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.subset_span ⟨ρ, τ, μ, ν, rfl⟩)))) + · exact fun μ ν μ' ν' => Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩))) + · exact fun α μ β => Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.subset_span ⟨α, μ, β, rfl⟩)) + · exact fun α μ β => Submodule.mem_sup_right (Submodule.subset_span ⟨α, μ, β, rfl⟩) + +/-- **Where an invariant of mass dimension four lives.** An invariant of mass weight eight — + mass dimension four — lies in the join of the six sector spans. + + Only gauge invariance is used, and only through the covariant subalgebra + (`isInvariant_iff_mem_covariantAlgebra`); Lorentz invariance plays no part here. It is what + cuts each sector down to its invariants: the two kinetic sectors to the kinetic terms, the + photon pairs to the Maxwell and theta terms, the second derivatives of the field strength to + zero, and — by hypercharge — the two like-species sectors to zero. -/ +theorem mem_massDimFour_sectors_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) + (h8 : x ∈ massWeightSubmodule 8) : + x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dψ [] α * Dψ [μ] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dbarψ [μ] β} := + mem_massDimFour_sectors_of_mem_covariantAlgebra + ((isInvariant_iff_mem_covariantAlgebra x).mp hx).1 h8 + +/-! + +## E. The hypercharges of the covariant generators + +To remove the two like-species sectors their hypercharge is needed, and hence the hypercharge +of each generator occurring in a weight-eight monomial. Those are few: the field-strength +derivatives, which lie in the neutral bosonic factor, and the covariant derivatives along a +list of length zero or one. The latter are written out by `Dψ_singleton` and `Dbarψ_singleton` +as a generator plus a gauge-field term, and the gauge field is neutral, so both summands carry +the charge of the fermionic generator. No induction along the list is needed, and hence no +statement that the total derivative preserves the hypercharge grading. + +-/ + +/-- Hypercharges add, with the sum evaluated: this is `mul_mem_hyperchargeSubmodule` in the form + the products below want it. -/ +lemma mul_mem_hyperchargeSubmodule_of_add_eq {p q r : ℤ} (hr : p + q = r) {x y : JetAlgebra} + (hx : x ∈ hyperchargeSubmodule p) (hy : y ∈ hyperchargeSubmodule q) : + x * y ∈ hyperchargeSubmodule r := + hr ▸ mul_mem_hyperchargeSubmodule hx hy + +/-- The lepton component function carries hypercharge `6`. -/ +lemma Dψ_nil_mem_hyperchargeSubmodule (α : Fin 2) : Dψ [] α ∈ hyperchargeSubmodule 6 := by + rw [Dψ_nil] + exact ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dψ {} α) + +/-- The first covariant derivative of the lepton carries hypercharge `6`: the gauge-field term + `- 6 i B_μ ψ_α` it adds to `∂_μ ψ_α` is neutral times charge `6`. -/ +lemma Dψ_singleton_mem_hyperchargeSubmodule (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + Dψ [μ] α ∈ hyperchargeSubmodule 6 := by + rw [Dψ_singleton] + refine Submodule.sub_mem _ (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dψ {μ} α)) + (Submodule.smul_mem _ _ (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num [Hypercharge]) + (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dB {} μ)) + (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dψ {} α)))) + +/-- The conjugate-lepton component function carries hypercharge `-6`. -/ +lemma Dbarψ_nil_mem_hyperchargeSubmodule (α : Fin 2) : + Dbarψ [] α ∈ hyperchargeSubmodule (-6) := by + rw [Dbarψ_nil] + exact ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dbarψ {} α) + +/-- The first covariant derivative of the conjugate lepton carries hypercharge `-6`. -/ +lemma Dbarψ_singleton_mem_hyperchargeSubmodule (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + Dbarψ [μ] α ∈ hyperchargeSubmodule (-6) := by + rw [Dbarψ_singleton] + refine Submodule.add_mem _ + (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dbarψ {μ} α)) + (Submodule.smul_mem _ _ (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num [Hypercharge]) + (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dB {} μ)) + (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dbarψ {} α)))) + +/-- Elements of the B-boson factor are neutral. -/ +lemma inclB_mem_hyperchargeSubmodule (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : + inclB a ∈ hyperchargeSubmodule 0 := by + rw [mem_hyperchargeSubmodule, hyperchargePoly_inclB, LaurentPolynomial.T_zero, mul_one] + +/-- The field strength is neutral: for an abelian gauge field it lies in the B-boson factor. -/ +lemma fieldStrengthDeriv_mem_hyperchargeSubmodule (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ ν ∈ hyperchargeSubmodule 0 := + inclB_mem_hyperchargeSubmodule ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) + +/-! + +## F. Removing the charged sectors + +An invariant is a charge singlet, so it is fixed by `chargeComponent 0`. Applying that +projection to the sector decomposition leaves the four neutral families untouched and kills the +two like-species ones, which are homogeneous of hypercharge `± 12`. + +-/ + +/-- **Where an invariant of mass dimension four lives.** An invariant of mass weight eight — + mass dimension four — lies in the join of the four neutral sector spans: the two fermionic + kinetic sectors, the second derivatives of the field strength, and the photon pairs. + + This refines `mem_massDimFour_sectors_of_isInvariant` by the hypercharge grading: the two + like-species fermionic sectors of that statement carry hypercharge `± 12`, and an invariant, + being a charge singlet, has no component in them. -/ +theorem mem_massDimFour_neutral_sectors_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) + (h8 : x ∈ massWeightSubmodule 8) : + x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by + have hcov : x ∈ covWeightSpan 8 := + mem_covWeightSpan_of_mem_covariantAlgebra + ((isInvariant_iff_mem_covariantAlgebra x).mp hx).1 h8 + have hle := covWeightSpan_eight_le + (W := Submodule.comap (chargeComponent 0) + (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} + ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'})) + ?_ ?_ ?_ ?_ ?_ ?_ + · have h := hle hcov + rwa [Submodule.mem_comap, + chargeComponent_of_mem (mem_hyperchargeSubmodule_zero_of_isInvariant hx)] at h + · intro α μ β + rw [Submodule.mem_comap, chargeComponent_of_mem + (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) + (Dbarψ_singleton_mem_hyperchargeSubmodule μ α) (Dψ_nil_mem_hyperchargeSubmodule β))] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.subset_span ⟨α, μ, β, rfl⟩))) + · intro α μ β + rw [Submodule.mem_comap, chargeComponent_of_mem + (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) + (Dbarψ_nil_mem_hyperchargeSubmodule α) (Dψ_singleton_mem_hyperchargeSubmodule μ β))] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.subset_span ⟨α, μ, β, rfl⟩))) + · intro ρ τ μ ν + rw [Submodule.mem_comap, + chargeComponent_of_mem (fieldStrengthDeriv_mem_hyperchargeSubmodule {ρ, τ} μ ν)] + exact Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.subset_span ⟨ρ, τ, μ, ν, rfl⟩)) + · intro μ ν μ' ν' + rw [Submodule.mem_comap, chargeComponent_of_mem + (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) + (fieldStrengthDeriv_mem_hyperchargeSubmodule {} μ ν) + (fieldStrengthDeriv_mem_hyperchargeSubmodule {} μ' ν'))] + exact Submodule.mem_sup_right (Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩) + · intro α μ β + rw [Submodule.mem_comap, chargeComponent_of_mem_ne (show (12 : ℤ) ≠ 0 by norm_num) + (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) + (Dψ_nil_mem_hyperchargeSubmodule α) (Dψ_singleton_mem_hyperchargeSubmodule μ β))] + exact zero_mem _ + · intro α μ β + rw [Submodule.mem_comap, chargeComponent_of_mem_ne (show (-12 : ℤ) ≠ 0 by norm_num) + (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) + (Dbarψ_nil_mem_hyperchargeSubmodule α) + (Dbarψ_singleton_mem_hyperchargeSubmodule μ β))] + exact zero_mem _ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean new file mode 100644 index 000000000..382cc10e5 --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.MassDimFour.Basic +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDimFour.LinearIndependence +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.Closure +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.Closure +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.Invariance +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.Closure +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.Invariance +/-! +# The renormalizable Lagrangian densities of the lepton–gauge sector + +## i. Overview + +**An invariant of mass dimension four is a combination of the two fermion kinetic terms, the +Maxwell term and the theta term** — `mem_span_renormalizableTerms_of_isInvariant`. This is the +classification theorem for the lepton–gauge sector, and it is the last step: everything it uses +is proved elsewhere. + +## ii. The argument + +`mem_massDimFour_neutral_sectors_of_isInvariant` puts an invariant of mass weight eight in the +join of four sector spans, and each sector has already been cut down to its invariants: + +| sector | invariants | proved in | +|---|---|---| +| `D̄_μ ψ̄_α ψ_β` | `fermionKineticTermBar` | `FermionicBarKineticTerm.BoostWeight` | +| `ψ̄_α D_μ ψ_β` | `fermionKineticTerm` | `FermionicKineticTerm.BoostWeight` | +| `∂_ρ ∂_τ F_{μν}` | none | `GaugeDoubleDeriv.Invariance` | +| `F_{μν} F_{μ'ν'}` | `maxwellTerm`, `thetaTerm` | `GaugeKineticTerm.Invariance` | + +Those four results are about a single sector at a time, so they apply to the four summands of +`x = a + b + c + d` only once each summand is known to be invariant, which is what section A +establishes. Two ingredients go into it. Each sector is carried to itself by the Lorentz action +and fixed pointwise by the gauge action (the `Closure` files), so `ρ(Λ) a - a` lies in the first +sector again and the four such differences sum to `ρ(Λ) x - x = 0`. And the four sectors are +independent (`MassDimFour.LinearIndependence`), so those four differences are individually zero. + +## iii. Key results + +- `JetAlgebra.isInvariant_of_massDimFour_decomp` : the sector components of an invariant are + themselves invariant. +- `JetAlgebra.mem_span_renormalizableTerms_of_isInvariant` : **the classification** — an + invariant of mass weight eight lies in + `span ℂ {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm}`. + +## iv. Table of contents + +- A. The sector components of an invariant are invariant +- B. The classification + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open Matrix MatrixGroups + +/-! + +## A. The sector components of an invariant are invariant + +The gauge half is immediate: each sector is fixed pointwise by the gauge action, so every +element of it — the components included — is gauge invariant. The Lorentz half is where the +independence of the sectors is spent: `ρ(Λ) a - a` lies in the first sector again, and likewise +for the other three, and the four differences sum to `ρ(Λ) x - x = 0`. + +-/ + +/-- **The sector components of an invariant are themselves invariant.** -/ +lemma isInvariant_of_massDimFour_decomp {x a b c d : JetAlgebra} (hx : IsInvariant x) + (ha : a ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) + (hb : b ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) + (hc : c ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) + (hd : d ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) + (hsum : a + b + c + d = x) : + IsInvariant a ∧ IsInvariant b ∧ IsInvariant c ∧ IsInvariant d := by + have hlor : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ a = a ∧ repLorentzGroup Λ b = b ∧ + repLorentzGroup Λ c = c ∧ repLorentzGroup Λ d = d := by + intro Λ + have hzero : (repLorentzGroup Λ a - a) + (repLorentzGroup Λ b - b) + + (repLorentzGroup Λ c - c) + (repLorentzGroup Λ d - d) = 0 := by + have h1 : repLorentzGroup Λ a + repLorentzGroup Λ b + repLorentzGroup Λ c + + repLorentzGroup Λ d = x := by + rw [← map_add, ← map_add, ← map_add, hsum, hx.2 Λ] + rw [show (repLorentzGroup Λ a - a) + (repLorentzGroup Λ b - b) + + (repLorentzGroup Λ c - c) + (repLorentzGroup Λ d - d) = + (repLorentzGroup Λ a + repLorentzGroup Λ b + repLorentzGroup Λ c + + repLorentzGroup Λ d) - (a + b + c + d) from by abel, + h1, hsum, sub_self] + obtain ⟨e1, e2, e3, e4⟩ := eq_zero_of_massDimFour_sum_eq_zero + (sub_mem (repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil Λ ha) ha) + (sub_mem (repLorentzGroup_mem_span_Dbarψ_mul_Dψ Λ hb) hb) + (sub_mem (repLorentzGroup_mem_span_fieldStrengthDeriv_pair Λ hc) hc) + (sub_mem (repLorentzGroup_mem_span_fieldStrength_mul Λ hd) hd) hzero + exact ⟨sub_eq_zero.mp e1, sub_eq_zero.mp e2, sub_eq_zero.mp e3, sub_eq_zero.mp e4⟩ + exact ⟨⟨fun U => repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil U ha, + fun Λ => (hlor Λ).1⟩, + ⟨fun U => repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ U hb, fun Λ => (hlor Λ).2.1⟩, + ⟨fun U => repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair U hc, + fun Λ => (hlor Λ).2.2.1⟩, + ⟨fun U => repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul U hd, + fun Λ => (hlor Λ).2.2.2⟩⟩ + +/-! + +## B. The classification + +-/ + +/-- **The renormalizable Lagrangian densities of the lepton–gauge sector.** An invariant of mass + weight eight — mass dimension four — is a linear combination of the fermion kinetic term, the + conjugate fermion kinetic term, the Maxwell term and the theta term. + + Every ingredient is proved elsewhere: `mem_massDimFour_neutral_sectors_of_isInvariant` for the + decomposition into sectors, `MassDimFour.LinearIndependence` and the four `Closure` files for + the invariance of the components, and the four sector theorems for what each sector + contributes. The second derivatives of the field strength contribute nothing. -/ +theorem mem_span_renormalizableTerms_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) + (h8 : x ∈ massWeightSubmodule 8) : + x ∈ Submodule.span ℂ + {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm} := by + obtain ⟨u, hu, d, hd, rfl⟩ := Submodule.mem_sup.mp + (mem_massDimFour_neutral_sectors_of_isInvariant hx h8) + obtain ⟨v, hv, c, hc, rfl⟩ := Submodule.mem_sup.mp hu + obtain ⟨a, ha, b, hb, rfl⟩ := Submodule.mem_sup.mp hv + obtain ⟨hai, hbi, hci, hdi⟩ := isInvariant_of_massDimFour_decomp hx ha hb hc hd rfl + have hmono : ∀ S : Set JetAlgebra, + S ⊆ {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm} → + Submodule.span ℂ S ≤ Submodule.span ℂ + {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm} := + fun _ hS => Submodule.span_mono hS + refine add_mem (add_mem (add_mem ?_ ?_) ?_) ?_ + · exact hmono _ (by simp) (mem_fermionic_bar_kinetic_span_eq_kineticTermBar_of_isInvariant + hai ha) + · exact hmono _ (by simp) (mem_fermionic_kinetic_span_eq_kineticTerm_of_isInvariant hbi hb) + · rw [eq_zero_of_isInvariant_of_mem_span_fieldStrengthDeriv_pair hci hc] + exact zero_mem _ + · refine hmono _ (fun y hy => ?_) + (mem_gauge_kinetic_span_eq_maxwell_theta_of_isInvariant hdi hd) + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hy ⊢ + tauto + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean new file mode 100644 index 000000000..3d3b59e4e --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean @@ -0,0 +1,499 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.LinearIndependence +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.LinearIndependence +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.CovariantAlgebra +/-! +# Independence of the four mass-dimension-four sectors + +## i. Overview + +The four sectors an invariant of mass dimension four decomposes into — + +| sector | spanned by | +|---|---| +| `A` | `D̄_μ ψ̄_α ψ_β` | +| `B` | `ψ̄_α D_μ ψ_β` | +| `C` | `∂_ρ ∂_τ F_{μν}` | +| `D` | `F_{μν} F_{μ'ν'}` | + +— are independent: `eq_zero_of_massDimFour_sum_eq_zero` says that if one element of each sums to +zero then all four are zero. Equivalently the sum `A ⊔ B ⊔ C ⊔ D` is direct. + +## ii. Why it is wanted + +Each sector has been cut down to its invariants separately, and those four results are combined +in `MassDimFour.Classification`. They do not compose without this file: membership of the join +gives a decomposition `x = a + b + c + d`, but every sector theorem needs *its own* summand to be +invariant, and invariance of `x` says nothing about the summands unless the decomposition is +unique. Independence is exactly that uniqueness. + +Only one of the three splittings is genuinely delicate. Fermionic against bosonic is the lepton +exterior degree, `2` against `0`; `∂∂F` against `F F` is the gauge-field degree, `1` against `2`. +But `A` against `B` — whether the derivative sits on `ψ̄` or on `ψ` — is separated by no grading +at all: `D̄_μ ψ̄_α ψ_β = ∂_μ ψ̄_α ψ_β + 6 i B_μ ψ̄_α ψ_β` is inhomogeneous for every grading in +sight, the covariant derivative being what mixes them. It needs a dual family. + +## iii. The dual families + +Each sector file already carries a family of functionals dual to its own spanning set. What is +added here is that each family is blind to the other three sectors. + +- `fermionDual` reads a coefficient of `ψ̄_α D_μ ψ_β`. Being an exterior *degree-two* functional + it kills the two bosonic sectors outright; and on `D̄_μ ψ̄_α ψ_β` it vanishes because it looks + for a derivative index on the unbarred factor, where there is none. +- `fermionBarDual` is the mirror image. +- `gaugeDerivDual'` reads a coefficient of a gauge-field generator. It is built here as the + *linear part* of the gauge-field evaluation — `gaugeDerivDual` corrected by half the second + polarization — so that, unlike `gaugeDerivDual` itself, it annihilates the photon pairs. The + augmentation of the lepton factor it carries kills the two fermionic sectors. + +## iv. Key results + +- `JetAlgebra.gaugeDerivDual'` : the linear part of the gauge-field evaluation. +- `JetAlgebra.eq_zero_of_forall_fermionDual_eq_zero` and its two companions : each family + separates its own sector. +- `JetAlgebra.eq_zero_of_massDimFour_sum_eq_zero` : **the four sectors are independent**. + +## v. Table of contents + +- A. The fermionic duals are blind to the other sectors +- B. The gauge duals are blind to the fermionic sectors +- C. The linear part of the gauge-field evaluation +- D. Each family separates its own sector +- E. Independence of the four sectors + +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +/-! + +## A. The fermionic duals are blind to the other sectors + +`fermionPairDual` is an exterior degree-two functional on the lepton factor, so it vanishes on +anything whose lepton factor is trivial — which is what the two bosonic sectors are. On the +opposite fermionic sector it vanishes for a different reason: `fermionDual` looks for a +derivative index on the unbarred factor, and in `D̄_μ ψ̄_α ψ_β` there is none. + +-/ + +/-- The degree-two functional vanishes on the unit: the alternating family defining it is zero + outside degree two. -/ +@[simp] +lemma extPairDual_one {V : Type} [AddCommGroup V] [Module ℂ V] + (φ ψ : Module.Dual ℂ V) : extPairDual φ ψ 1 = 0 := by + rw [extPairDual, ExteriorAlgebra.liftAlternating_one] + rfl + +/-- The fermionic duals vanish on an element with trivial lepton factor. -/ +@[simp] +lemma fermionPairDual_tmul_one (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : fermionPairDual φ ψ (a ⊗ⱼ 1) = 0 := by + rw [fermionPairDual_tmul, extPairDual_one, mul_zero] + +/-- The fermionic duals vanish on a field-strength derivative. -/ +@[simp] +lemma fermionPairDual_fieldStrengthDeriv (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fermionPairDual φ ψ (fieldStrengthDeriv s μ ν) = 0 := + fermionPairDual_tmul_one φ ψ _ + +/-- The fermionic duals vanish on a photon pair. -/ +@[simp] +lemma fermionPairDual_fieldStrengthDeriv_mul + (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) + (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + fermionPairDual φ ψ (fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' μ' ν') = 0 := by + rw [fieldStrengthDeriv, fieldStrengthDeriv, tmul_mul_tmul, mul_one, fermionPairDual_tmul_one] + +/-- **`fermionDual` is blind to the conjugate kinetic sector.** It reads the coefficient of + `ψ̄_α D_μ ψ_β`, where the derivative index sits on the unbarred factor; in `D̄_μ ψ̄_α ψ_β` it + sits on the barred one, so neither term of the product matches. -/ +@[simp] +lemma fermionDual_Dbarψ_singleton_mul_Dψ_nil (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) + (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : + fermionDual q (Dbarψ [μ] α * Dψ [] β) = 0 := by + obtain ⟨α₀, μ₀, β₀⟩ := q + rw [Dbarψ_singleton, Dψ_nil, add_mul, smul_mul_assoc, mul_assoc] + simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, + JetAlgebra.tmul_mul_tmul, one_mul, map_add, map_smul, + fermionDual, fermionPairDual_tmul, + LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] + simp only [Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, + LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq] + simp + +/-- **`fermionBarDual` is blind to the kinetic sector.** The mirror image of + `fermionDual_Dbarψ_singleton_mul_Dψ_nil`. -/ +@[simp] +lemma fermionBarDual_Dbarψ_nil_mul_Dψ_singleton (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) + (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : + fermionBarDual q (Dbarψ [] α * Dψ [μ] β) = 0 := by + obtain ⟨α₀, μ₀, β₀⟩ := q + rw [Dbarψ_nil, Dψ_singleton, mul_sub, mul_smul_comm, ← mul_assoc] + simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, + JetAlgebra.tmul_mul_tmul, mul_one, map_sub, map_smul, + fermionBarDual, fermionPairDual_tmul, + LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] + simp only [Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, + LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq] + simp + +/-! + +## B. The gauge duals are blind to the fermionic sectors + +Both gauge dual families are a functional on the B-boson factor tensored with the augmentation +`augL` of the lepton factor. The augmentation kills a single lepton component function, so such +a dual vanishes on a product of two linear-matter elements — which is what a fermion bilinear +is. + +-/ + +/-- A functional on the B-boson factor, extended to the jet algebra by the augmentation of the + lepton factor. Both `gaugeLinDual` and `gaugePairDual` are of this form. -/ +noncomputable def augLDual (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) : JetAlgebra →ₗ[ℂ] ℂ := + TensorProduct.lift (((LinearMap.mul ℂ ℂ).comp f).compl₂ augL.toLinearMap) + +@[simp] +lemma augLDual_tmul (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : + augLDual f (a ⊗ⱼ b) = f a * augL b := rfl + +lemma gaugePairDual_eq (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : + gaugePairDual φ ψ = augLDual (symPairDual φ ψ) := rfl + +lemma gaugeLinDual_eq (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : + gaugeLinDual φ = augLDual (symLinDual φ) := rfl + +/-- The augmentation kills a lepton component function. -/ +@[simp] +lemma augL_ι (m : LeptonSinglet.JetComponentSpace) : augL (ExteriorAlgebra.ι ℂ m) = 0 := by + rw [augL, ExteriorAlgebra.lift_ι_apply] + rfl + +/-- **The gauge duals vanish on a product of two linear-matter elements.** The lepton factor of + such a product has exterior degree two, and the augmentation kills it. -/ +lemma augLDual_mul_of_mem_LinearMatterSubmodule (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) + {u v : JetAlgebra} (hu : u ∈ LinearMatterSubmodule) (hv : v ∈ LinearMatterSubmodule) : + augLDual f (u * v) = 0 := by + have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := distrib_add_mul + have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := distrib_mul_add + have hs₁ : ∀ (r : ℂ) (a b : JetAlgebra), (r • a) * b = r • (a * b) := + fun r a b => smul_mul_assoc r a b + have hs₂ : ∀ (r : ℂ) (a b : JetAlgebra), a * (r • b) = r • (a * b) := + fun r a b => mul_smul_comm r a b + induction hu using Submodule.span_induction with + | mem z hz => + obtain ⟨p, m, rfl⟩ := hz + induction hv using Submodule.span_induction with + | mem w hw => + obtain ⟨q, n, rfl⟩ := hw + rw [tmul_mul_tmul, augLDual_tmul, map_mul augL, augL_ι, zero_mul, mul_zero] + | zero => rw [mul_zero, map_zero] + | add a b _ _ ha hb => rw [hd₂, map_add, ha, hb, add_zero] + | smul r a _ ha => rw [hs₂, map_smul, ha, smul_zero] + | zero => rw [zero_mul, map_zero] + | add a b _ _ ha hb => rw [hd₁, map_add, ha, hb, add_zero] + | smul r a _ ha => rw [hs₁, map_smul, ha, smul_zero] + +/-- The gauge duals vanish on a fermion bilinear. -/ +lemma augLDual_Dbarψ_mul_Dψ (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + augLDual f (Dbarψ l α * Dψ l' β) = 0 := + augLDual_mul_of_mem_LinearMatterSubmodule f (Dbarψ_mem_LinearMatterSubmodule l α) + (Dψ_mem_LinearMatterSubmodule l' β) + +/-! + +## C. The linear part of the gauge-field evaluation + +`gaugeDerivDual` reads the coefficient of a gauge-field generator, but it is the *affine* +difference `symEval φ - symEval 0`, which on a degree-two monomial `g h` returns `φ g · φ h` +rather than zero. Subtracting half the second polarization, which returns `2 φ g · φ h` there +and vanishes in degree one, leaves the genuine linear part: `gaugeDerivDual'` still reads the +coefficient of a generator, and now annihilates the photon pairs as well. + +-/ + +/-- The coordinate functional at the gauge-field generator `p`, valued in `ℂ`. -/ +noncomputable def bCoord (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : + BBoson.JetComponentSpace →ₗ[ℝ] ℂ := + (BBoson.JetComponentSpace.basis.coord (BBoson.JetGenerators.dB p.1 p.2)).smulRight (1 : ℂ) + +@[simp] +lemma bCoord_basis (p q : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : + bCoord p (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB q.1 q.2)) = + if q = p then 1 else 0 := by + rw [bCoord, LinearMap.smulRight_apply, Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply] + by_cases h : q = p + · subst h + simp + · have hne : ¬ BBoson.JetGenerators.dB q.1 q.2 = BBoson.JetGenerators.dB p.1 p.2 := by + rw [BBoson.JetGenerators.dB.injEq] + exact fun hg => h (Prod.ext hg.1 hg.2) + rw [if_neg hne, if_neg h, zero_smul] + +/-- `gaugeDerivDual` is the affine difference at the coordinate functional. -/ +lemma gaugeDerivDual_eq (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : + gaugeDerivDual p = gaugeLinDual (bCoord p) := rfl + +/-- **The linear part of the gauge-field evaluation.** It reads the coefficient of the + gauge-field generator `p`, and is blind to the degrees zero and two. -/ +noncomputable def gaugeDerivDual' (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : + JetAlgebra →ₗ[ℂ] ℂ := + gaugeDerivDual p - (2⁻¹ : ℂ) • gaugePairDual (bCoord p) (bCoord p) + +lemma gaugeDerivDual'_apply (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) (x : JetAlgebra) : + gaugeDerivDual' p x = + gaugeDerivDual p x - (2⁻¹ : ℂ) * gaugePairDual (bCoord p) (bCoord p) x := by + rw [gaugeDerivDual', LinearMap.sub_apply, LinearMap.smul_apply, smul_eq_mul] + +/-- On a field-strength derivative the correction term vanishes, and the linear part reads the + same antisymmetric coefficient as `gaugeDerivDual`. -/ +@[simp] +lemma gaugeDerivDual'_fieldStrengthDeriv (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + gaugeDerivDual' p (fieldStrengthDeriv s μ ν) = fsDerivCoeff p s μ ν := by + rw [gaugeDerivDual'_apply, gaugeDerivDual_fieldStrengthDeriv, + gaugePairDual_fieldStrengthDeriv, mul_zero, sub_zero] + +/-- The linear part reads the coefficient of a gauge-field generator. -/ +@[simp] +lemma gaugeDerivDual'_ofGenerator (p q : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : + gaugeDerivDual' p (ofGenerator (JetGenerators.dB q.1 q.2)) = if q = p then 1 else 0 := by + rw [gaugeDerivDual'_apply, gaugeDerivDual_eq, gaugeLinDual_ofGenerator, + show gaugePairDual (bCoord p) (bCoord p) (ofGenerator (JetGenerators.dB q.1 q.2)) = 0 from by + rw [ofGenerator_B_eq, gaugePairDual_tmul, symPairDual_tmul_ofGenerator_eq_zero, zero_mul], + mul_zero, sub_zero, bCoord_basis] + +/-- The affine difference on a degree-two monomial is the product of the two values. -/ +lemma symLinDual_tmul_ofGenerator_mul (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) + (g h : BBoson.JetGenerators) : + symLinDual φ ((1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) * + (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator h)) = + φ (BBoson.JetComponentSpace.basis g) * φ (BBoson.JetComponentSpace.basis h) := by + simp only [symLinDual, LinearMap.sub_apply, AlgHom.toLinearMap_apply, map_mul, + symEval_tmul_ofGenerator, LinearMap.zero_apply] + ring + +/-- **The linear part annihilates a product of two gauge-field generators.** The affine + difference returns `φ g · φ h` there and half the second polarization returns the same. -/ +lemma gaugeDerivDual'_ofGenerator_mul (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (g h : BBoson.JetGenerators) : + gaugeDerivDual' p (ofGenerator (JetGenerators.dB g.1 g.2) * + ofGenerator (JetGenerators.dB h.1 h.2)) = 0 := by + obtain ⟨s, μ⟩ := g + obtain ⟨t, ν⟩ := h + rw [gaugeDerivDual'_apply, gaugeDerivDual_eq, gaugeLinDual_eq, gaugePairDual_eq, + ofGenerator_B_eq, ofGenerator_B_eq, tmul_mul_tmul, mul_one, augLDual_tmul, augLDual_tmul, + map_one, mul_one, mul_one, symLinDual_tmul_ofGenerator_mul, + symPairDual_tmul_ofGenerator_mul] + ring + +/-- The linear part annihilates a photon pair: each field strength is a difference of two + gauge-field generators, so the product is a combination of degree-two monomials. -/ +@[simp] +lemma gaugeDerivDual'_fieldStrengthDeriv_mul (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + gaugeDerivDual' p (fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' μ' ν') = 0 := by + have hg : ∀ (a b : Multiset (Fin 1 ⊕ Fin 3)) (σ τ : Fin 1 ⊕ Fin 3), + gaugeDerivDual' p (ofGenerator (JetGenerators.dB a σ) * + ofGenerator (JetGenerators.dB b τ)) = 0 := + fun a b σ τ => gaugeDerivDual'_ofGenerator_mul p + (BBoson.JetGenerators.dB a σ) (BBoson.JetGenerators.dB b τ) + rw [fieldStrengthDeriv_eq_sub, fieldStrengthDeriv_eq_sub, sub_mul, mul_sub, mul_sub, + map_sub, map_sub, map_sub, + hg (s + {μ}) (s' + {μ'}) ν ν', hg (s + {μ}) (s' + {ν'}) ν μ', + hg (s + {ν}) (s' + {μ'}) μ ν', hg (s + {ν}) (s' + {ν'}) μ μ'] + ring + +/-- The linear part annihilates a fermion bilinear: it carries the augmentation of the lepton + factor. -/ +@[simp] +lemma gaugeDerivDual'_Dbarψ_mul_Dψ (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) + (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + gaugeDerivDual' p (Dbarψ l α * Dψ l' β) = 0 := by + rw [gaugeDerivDual'_apply, gaugeDerivDual_eq, gaugeLinDual_eq, gaugePairDual_eq, + augLDual_Dbarψ_mul_Dψ, augLDual_Dbarψ_mul_Dψ, mul_zero, sub_zero] + +/-! + +## D. Each family separates its own sector + +A functional vanishing on a spanning set vanishes on the span, so the cross-vanishing above +extends from the generators to the sectors. In the other direction each family is dual to its +own spanning set, so an element of that sector on which the whole family vanishes is zero. + +-/ + +/-- A functional vanishing on a spanning set vanishes on the span. -/ +lemma apply_eq_zero_of_mem_span {f : JetAlgebra →ₗ[ℂ] ℂ} {S : Set JetAlgebra} + (hS : ∀ y ∈ S, f y = 0) {x : JetAlgebra} (hx : x ∈ Submodule.span ℂ S) : f x = 0 := + Submodule.span_le.mpr (fun y hy => LinearMap.mem_ker.mpr (hS y hy)) hx + +/-- The kinetic sector, presented as the span of a family indexed by a finite type. -/ +lemma span_Dbarψ_nil_mul_Dψ_singleton_eq : + {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} = + Set.range fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ [] p.1 * Dψ [p.2.1] p.2.2 := + Set.ext fun _ => ⟨fun ⟨α, μ, β, h⟩ => ⟨(α, μ, β), h.symm⟩, + fun ⟨p, h⟩ => ⟨p.1, p.2.1, p.2.2, h.symm⟩⟩ + +/-- The conjugate kinetic sector, presented as the span of a family indexed by a finite type. -/ +lemma span_Dbarψ_singleton_mul_Dψ_nil_eq : + {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} = + Set.range fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ [p.2.1] p.1 * Dψ [] p.2.2 := + Set.ext fun _ => ⟨fun ⟨α, μ, β, h⟩ => ⟨(α, μ, β), h.symm⟩, + fun ⟨p, h⟩ => ⟨p.1, p.2.1, p.2.2, h.symm⟩⟩ + +/-- **`fermionDual` separates the kinetic sector.** -/ +lemma eq_zero_of_forall_fermionDual_eq_zero {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) + (h : ∀ q, fermionDual q x = 0) : x = 0 := by + rw [span_Dbarψ_nil_mul_Dψ_singleton_eq, Submodule.mem_span_range_iff_exists_fun] at hx + obtain ⟨c, rfl⟩ := hx + have hc : ∀ q, c q = 0 := by + intro q + have hq := h q + rw [map_sum] at hq + simp only [map_smul, smul_eq_mul, fermionDual_Dbarψ_mul_Dψ, mul_ite, mul_one, mul_zero, + Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at hq + exact hq + simp only [hc, zero_smul, Finset.sum_const_zero] + +/-- **`fermionBarDual` separates the conjugate kinetic sector.** -/ +lemma eq_zero_of_forall_fermionBarDual_eq_zero {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) + (h : ∀ q, fermionBarDual q x = 0) : x = 0 := by + rw [span_Dbarψ_singleton_mul_Dψ_nil_eq, Submodule.mem_span_range_iff_exists_fun] at hx + obtain ⟨c, rfl⟩ := hx + have hc : ∀ q, c q = 0 := by + intro q + have hq := h q + rw [map_sum] at hq + simp only [map_smul, smul_eq_mul, fermionBarDual_Dbarψ_mul_Dψ, mul_ite, mul_one, mul_zero, + Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at hq + exact hq + simp only [hc, zero_smul, Finset.sum_const_zero] + +/-- The span of the gauge-field generators: the elements linear in the gauge field. -/ +noncomputable def gaugeGenSpan : Submodule ℂ JetAlgebra := + Submodule.span ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + ofGenerator (JetGenerators.dB p.1 p.2)) + +/-- A gauge-field generator is linear in the gauge field. -/ +lemma ofGenerator_dB_mem_gaugeGenSpan (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + ofGenerator (JetGenerators.dB s μ) ∈ gaugeGenSpan := + Submodule.subset_span ⟨(s, μ), rfl⟩ + +/-- A field-strength derivative is linear in the gauge field. -/ +lemma fieldStrengthDeriv_mem_gaugeGenSpan (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ ν ∈ gaugeGenSpan := by + rw [fieldStrengthDeriv_eq_sub] + exact sub_mem (ofGenerator_dB_mem_gaugeGenSpan _ _) (ofGenerator_dB_mem_gaugeGenSpan _ _) + +/-- **The linear parts separate the elements linear in the gauge field.** -/ +lemma eq_zero_of_mem_gaugeGenSpan_of_forall_gaugeDerivDual' {x : JetAlgebra} + (hx : x ∈ gaugeGenSpan) (h : ∀ p, gaugeDerivDual' p x = 0) : x = 0 := by + classical + rw [gaugeGenSpan, Finsupp.mem_span_range_iff_exists_finsupp] at hx + obtain ⟨c, rfl⟩ := hx + have hc : ∀ p, c p = 0 := by + intro p + have hp := h p + rw [Finsupp.sum, map_sum] at hp + simp only [map_smul, smul_eq_mul, gaugeDerivDual'_ofGenerator, mul_ite, mul_one, mul_zero, + Finset.sum_ite_eq' c.support p c] at hp + by_cases hs : p ∈ c.support + · rwa [if_pos hs] at hp + · exact Finsupp.notMem_support_iff.mp hs + rw [show c = 0 from Finsupp.ext hc, Finsupp.sum_zero_index] + +/-- **The linear parts separate the sector of second derivatives of the field strength.** -/ +lemma eq_zero_of_forall_gaugeDerivDual'_eq_zero {x : JetAlgebra} + (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) + (h : ∀ p, gaugeDerivDual' p x = 0) : x = 0 := by + refine eq_zero_of_mem_gaugeGenSpan_of_forall_gaugeDerivDual' (Submodule.span_le.mpr ?_ hx) h + rintro _ ⟨ρ, τ, μ, ν, rfl⟩ + exact fieldStrengthDeriv_mem_gaugeGenSpan {ρ, τ} μ ν + +/-! + +## E. Independence of the four sectors + +Each family kills the three sectors that are not its own, so applying it to a vanishing sum of +four sector elements leaves only its own summand, which it then separates. The photon pairs are +reached last, by subtraction. + +-/ + +/-- **The four mass-dimension-four sectors are independent.** If one element of each sums to + zero then all four vanish; equivalently the join of the four sector spans is direct. This is + what makes the sector components of an invariant well defined, and hence invariant. -/ +theorem eq_zero_of_massDimFour_sum_eq_zero {a b c d : JetAlgebra} + (ha : a ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) + (hb : b ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) + (hc : c ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) + (hd : d ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', + y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) + (h : a + b + c + d = 0) : a = 0 ∧ b = 0 ∧ c = 0 ∧ d = 0 := by + have hb0 : b = 0 := by + refine eq_zero_of_forall_fermionDual_eq_zero hb fun q => ?_ + have hqa : fermionDual q a = 0 := + apply_eq_zero_of_mem_span (by rintro _ ⟨α, μ, β, rfl⟩; exact + fermionDual_Dbarψ_singleton_mul_Dψ_nil q α μ β) ha + have hqc : fermionDual q c = 0 := + apply_eq_zero_of_mem_span (by rintro _ ⟨ρ, τ, μ, ν, rfl⟩; exact + fermionPairDual_fieldStrengthDeriv _ _ _ _ _) hc + have hqd : fermionDual q d = 0 := + apply_eq_zero_of_mem_span (by rintro _ ⟨μ, ν, μ', ν', rfl⟩; exact + fermionPairDual_fieldStrengthDeriv_mul _ _ _ _ _ _ _ _) hd + have hsum := congrArg (fermionDual q) h + rw [map_add, map_add, map_add, map_zero, hqa, hqc, hqd] at hsum + simpa using hsum + have ha0 : a = 0 := by + refine eq_zero_of_forall_fermionBarDual_eq_zero ha fun q => ?_ + have hqb : fermionBarDual q b = 0 := + apply_eq_zero_of_mem_span (by rintro _ ⟨α, μ, β, rfl⟩; exact + fermionBarDual_Dbarψ_nil_mul_Dψ_singleton q α μ β) hb + have hqc : fermionBarDual q c = 0 := + apply_eq_zero_of_mem_span (by rintro _ ⟨ρ, τ, μ, ν, rfl⟩; exact + fermionPairDual_fieldStrengthDeriv _ _ _ _ _) hc + have hqd : fermionBarDual q d = 0 := + apply_eq_zero_of_mem_span (by rintro _ ⟨μ, ν, μ', ν', rfl⟩; exact + fermionPairDual_fieldStrengthDeriv_mul _ _ _ _ _ _ _ _) hd + have hsum := congrArg (fermionBarDual q) h + rw [map_add, map_add, map_add, map_zero, hqb, hqc, hqd] at hsum + simpa using hsum + have hc0 : c = 0 := by + refine eq_zero_of_forall_gaugeDerivDual'_eq_zero hc fun p => ?_ + have hpd : gaugeDerivDual' p d = 0 := + apply_eq_zero_of_mem_span (by rintro _ ⟨μ, ν, μ', ν', rfl⟩; exact + gaugeDerivDual'_fieldStrengthDeriv_mul _ _ _ _ _ _ _) hd + have hcd : c + d = 0 := by rw [ha0, hb0, zero_add, zero_add] at h; exact h + have hsum := congrArg (gaugeDerivDual' p) hcd + rw [map_add, map_zero, hpd, add_zero] at hsum + exact hsum + refine ⟨ha0, hb0, hc0, ?_⟩ + rw [ha0, hb0, hc0, zero_add, zero_add, zero_add] at h + exact h + +end JetAlgebra + +end LeptonGaugeSector + +end From bbfba16a48e8ea1407d90ef1d31e8b231c660cab Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 12 Aug 2026 06:39:52 +0100 Subject: [PATCH 130/254] feat: Partial clean up --- .../JetAlgebra/DerivativeOrder.lean | 69 ++--- .../JetAlgebra/FieldStrength.lean | 8 + .../GaugeDoubleDeriv/BoostWeight.lean | 44 ---- .../GaugeDoubleDeriv/LinearIndependence.lean | 6 - .../JetAlgebra/Grading/AxisBoosts.lean | 50 ---- .../JetAlgebra/Grading/BoostWeight.lean | 185 +++++-------- .../JetAlgebra/JetDeriv.lean | 40 +++ .../JetAlgebra/JetDerivLorentz.lean | 143 ----------- .../GaugeBosons/BBoson/Basic.lean | 242 +++++++++++++----- Physlib/Relativity/DerivAlgebra.lean | 13 + 10 files changed, 340 insertions(+), 460 deletions(-) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean index ffd68a3af..43cc6e286 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean @@ -537,7 +537,6 @@ lemma covSubst_surjective : Function.Surjective covSubst := by obtain ⟨d, hd⟩ := exists_mem_filt x exact exists_covSubst_eq hd -set_option maxHeartbeats 2000000 in /-- Every gauge invariant of the lepton–gauge-sector jet algebra lies in the algebra generated by the field-strength derivatives and the covariant derivatives of the lepton and its conjugate. @@ -550,6 +549,13 @@ lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq x ∈ CovariantAlgebra := by classical obtain ⟨y, rfl⟩ := covSubst_surjective x + -- The tensor inclusion and the B-boson field-strength generators, elaborated once: spelling + -- either of them out at each use is what puts this proof over the default heartbeat budget. + obtain ⟨mkT, hmkT⟩ : ∃ m, m = TensorProduct.mk ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) + LeptonSinglet.JetAlgebra := ⟨_, rfl⟩ + obtain ⟨Fs, hFs⟩ : ∃ s : Set (ℂ ⊗[ℝ] BBoson.JetAlgebra), s = + Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 := ⟨_, rfl⟩ have hyU : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI (BBoson.JetAlgebra.expUnitary a w hw)) LinearMap.id y = y := by @@ -563,43 +569,27 @@ lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq let F : Translation → Module.End ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) := fun p => BBoson.JetAlgebra.complexRepJetGaugeGroupI (BBoson.JetAlgebra.expUnitary p.1.1 p.1.2 p.2) - have hyFixed : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetAlgebra from y) ∈ ⨅ p : Translation, - LinearMap.eqLocus ((F p).rTensor LeptonSinglet.JetAlgebra) LinearMap.id := by - refine (Submodule.mem_iInf _).2 ?_ - intro p - refine LinearMap.mem_eqLocus.mpr ?_ + -- proved in the `rTensor` form the rewrite leaves behind, so that form is elaborated once + have hyTensor : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra from y) ∈ + Submodule.map₂ mkT (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ⊤ := by + rw [hmkT, ← LinearMap.iInf_eqLocus_rTensor F] + refine (Submodule.mem_iInf _).2 fun p => LinearMap.mem_eqLocus.mpr ?_ simpa only [LinearMap.id_apply, LinearMap.rTensor_def, F] using hyU p.1.1 p.1.2 p.2 - have hyTensor : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetAlgebra from y) ∈ Submodule.map₂ (TensorProduct.mk ℂ - (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) - (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ⊤ := by - rw [← LinearMap.iInf_eqLocus_rTensor F] - exact hyFixed have hB : (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ≤ - (Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] BBoson.JetAlgebra))).toSubmodule := by + (Algebra.adjoin ℂ Fs).toSubmodule := by intro c hc + rw [hFs] refine BBoson.JetAlgebra.mem_adjoin_of_forall_expUnitary_complex c fun a w hw => ?_ simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hc exact hc (⟨(a, w), hw⟩ : Translation) - have hyField : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] - LeptonSinglet.JetAlgebra from y) ∈ Submodule.map₂ (TensorProduct.mk ℂ - (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) - (Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] BBoson.JetAlgebra))).toSubmodule ⊤ := - Submodule.map₂_le_map₂_left - (f := TensorProduct.mk ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) hB hyTensor - set S : Set JetAlgebra := (Set.range fun p : + -- `obtain`, not `set`: `set` would rescan every hypothesis above for occurrences of this + -- union, and the defeq checks that provokes are what exhausted the heartbeat budget. + obtain ⟨S, hS⟩ : ∃ S : Set JetAlgebra, S = (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ (Set.range fun g : LeptonSinglet.JetGenerators => ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra)) with hS + LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra)) := ⟨_, rfl⟩ have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p have honeL : ∀ l : LeptonSinglet.JetAlgebra, 1 * l = l := fun l => one_mul l have hone_tmul : ∀ l : LeptonSinglet.JetAlgebra, @@ -635,15 +625,12 @@ lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq | add u v hu hv => rw [tmul_add] exact add_mem hu hv - have hleft : ∀ c ∈ Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] BBoson.JetAlgebra)), - ((c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ - Algebra.adjoin ℂ S := by + have hleft : ∀ c ∈ Algebra.adjoin ℂ Fs, + ((c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ Algebra.adjoin ℂ S := by intro c hc induction hc using Algebra.adjoin_induction with | mem z hz => + rw [hFs] at hz obtain ⟨p, rfl⟩ := hz refine Algebra.subset_adjoin ?_ rw [hS] @@ -662,16 +649,14 @@ lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq (v ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) from by rw [tmul_mul_tmul, honeL]] exact mul_mem ihu ihv + -- the two inclusions are composed on the spot: naming the intermediate membership would cost + -- another elaboration of the `map₂` type have hyMem : y ∈ Algebra.adjoin ℂ S := by - apply (show Submodule.map₂ (TensorProduct.mk ℂ - (ℂ ⊗[ℝ] BBoson.JetAlgebra) LeptonSinglet.JetAlgebra) - (Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] BBoson.JetAlgebra))).toSubmodule ⊤ ≤ - (Algebra.adjoin ℂ S).toSubmodule from ?_) hyField + apply (show Submodule.map₂ mkT (Algebra.adjoin ℂ Fs).toSubmodule ⊤ ≤ + (Algebra.adjoin ℂ S).toSubmodule from ?_) (Submodule.map₂_le_map₂_left hB hyTensor) rw [Submodule.map₂_le] intro c hc l _ + rw [hmkT] change c ⊗ⱼ l ∈ Algebra.adjoin ℂ S rw [show (c ⊗ⱼ l : JetAlgebra) = (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * @@ -683,6 +668,7 @@ lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq rw [AlgHom.map_adjoin] at himg refine Algebra.adjoin_le ?_ himg rintro z ⟨w, hw, rfl⟩ + rw [hS] at hw rcases hw with ⟨p, rfl⟩ | ⟨g, rfl⟩ · show covSubst (fieldStrengthDeriv p.1 p.2.1 p.2.2) ∈ Algebra.adjoin ℂ invariantGenerators @@ -705,6 +691,7 @@ lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq | dbarψ s α => exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from Set.mem_union_right _ ⟨(sortList s, α), rfl⟩) + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean index 4c0169590..341823f09 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean @@ -39,6 +39,14 @@ lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : have h : ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) = {s, r} := Multiset.cons_swap r s 0 rw [h] + +/-- A field-strength derivative written out on the generators. -/ +lemma fieldStrengthDeriv_eq_sub (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv s μ ν = + ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) := by + rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, TensorProduct.tmul_sub, sub_tmul] + rfl + /-- Antisymmetry of the embedded field-strength derivatives in the two field indices. -/ lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean index 2e7a11591..d1633cf11 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean @@ -231,32 +231,6 @@ lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i /-! -## C. The jet derivative on the field strengths - --/ - -/-- The jet derivative appends a derivative index to a gauge-field generator. -/ -lemma jetDeriv_ofGenerator_dB (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : - jetDeriv ν (ofGenerator (JetGenerators.dB s μ)) = - ofGenerator (JetGenerators.dB (s + {ν}) μ) := by - simp only [ofGenerator_B_eq] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero, - BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] - -/-- **The jet derivative of a field-strength derivative is the next field-strength - derivative.** -/ -lemma jetDeriv_fieldStrengthDeriv (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (a b : Fin 1 ⊕ Fin 3) : - jetDeriv ν (fieldStrengthDeriv s a b) = fieldStrengthDeriv (s + {ν}) a b := by - rw [fieldStrengthDeriv_eq_sub, fieldStrengthDeriv_eq_sub, map_sub, - jetDeriv_ofGenerator_dB, jetDeriv_ofGenerator_dB, - show s + {a} + {ν} = s + {ν} + {a} from add_right_comm _ _ _, - show s + {b} + {ν} = s + {ν} + {b} from add_right_comm _ _ _] - -/-! - ## D. The light-cone derivative operators Along the axis `i` the four derivative directions regroup into the two light-cone combinations @@ -355,15 +329,6 @@ lemma map_jetDeriv_le_bosonic (μ : Fin 1 ⊕ Fin 3) {P : Submodule ℂ JetAlgeb -/ -/-- A second-derivative field strength is the second jet derivative of a field strength. -/ -lemma fieldStrengthDeriv_pair_eq_jetDeriv (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {ρ, τ} μ ν = - jetDeriv ρ (jetDeriv τ (fieldStrengthDeriv {} μ ν)) := by - rw [jetDeriv_fieldStrengthDeriv, jetDeriv_fieldStrengthDeriv] - congr 1 - simp only [Multiset.empty_eq_zero, zero_add, Multiset.singleton_add] - exact Multiset.cons_swap ρ τ 0 - private lemma eq_or_eq_of_ne : ∀ {i t₁ t₂ j : Fin 3}, t₁ ≠ i → t₂ ≠ i → t₁ ≠ t₂ → j ≠ i → j = t₁ ∨ j = t₂ := by decide @@ -1667,15 +1632,6 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : -/ -/-- **The Bianchi identity.** -/ -lemma jetDeriv_fieldStrengthDeriv_bianchi (ρ μ ν : Fin 1 ⊕ Fin 3) : - jetDeriv ρ (fieldStrengthDeriv {} μ ν) = - jetDeriv μ (fieldStrengthDeriv {} ρ ν) - jetDeriv ν (fieldStrengthDeriv {} ρ μ) := by - simp only [fieldStrengthDeriv_eq_sub, map_sub, jetDeriv_ofGenerator_dB, - Multiset.empty_eq_zero, zero_add] - rw [add_comm ({μ} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, - add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {μ}] - abel lemma lcn_T_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean index dc42d6686..80acb67fb 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean @@ -96,12 +96,6 @@ noncomputable def gaugeDerivDual (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ F gaugeLinDual ((BBoson.JetComponentSpace.basis.coord (BBoson.JetGenerators.dB p.1 p.2)).smulRight (1 : ℂ)) -/-- A field-strength derivative written out on the generators. -/ -lemma fieldStrengthDeriv_eq_sub (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν = - ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, TensorProduct.tmul_sub, sub_tmul] - rfl /-- **`gaugeDerivDual` is dual to the gauge-field generators.** Its value on a field-strength derivative of any order is the antisymmetric coefficient `fsDerivCoeff`. -/ diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean index a35b36702..3ec4ca223 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean @@ -263,56 +263,6 @@ lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : ext i j fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring -/-! - -## D. The weighted boost averages - -Each average is the identity together with the paired boosts at `t = 2, 3, 4`, with weights -chosen so that the operator fixes the invariants and annihilates the boost weights -`± 2, ± 4, ± 6`. See `Grading/BoostWeight` for the scalar it acts by, `boostAvgZWeight`. - --/ - - -/-- The `Z`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the rotation-averaged single-axis - average on the weight-eight sector. -/ -noncomputable def boostAvgZ : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostZel 2 (by norm_num)) + - repLorentzGroup ((boostZel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostZel 3 (by norm_num)) + - repLorentzGroup ((boostZel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostZel 4 (by norm_num)) + - repLorentzGroup ((boostZel 4 (by norm_num))⁻¹)) - -/-- The `X`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the rotation-averaged single-axis - average on the weight-eight sector. -/ -noncomputable def boostAvgX : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostXel 2 (by norm_num)) + - repLorentzGroup ((boostXel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostXel 3 (by norm_num)) + - repLorentzGroup ((boostXel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostXel 4 (by norm_num)) + - repLorentzGroup ((boostXel 4 (by norm_num))⁻¹)) - -/-- The `Y`-axis boost-weighted average: the identity together with the - paired boosts at `t = 2, 3, 4`, with weights chosen so that the operator - fixes invariant vectors and acts as the rotation-averaged single-axis - average on the weight-eight sector. -/ -noncomputable def boostAvgY : Module.End ℂ JetAlgebra := - (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostYel 2 (by norm_num)) + - repLorentzGroup ((boostYel 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostYel 3 (by norm_num)) + - repLorentzGroup ((boostYel 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostYel 4 (by norm_num)) + - repLorentzGroup ((boostYel 4 (by norm_num))⁻¹)) - end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index 7da18b698..336ba7b79 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -728,6 +728,12 @@ lemma mul_mem_boostWeightSubmodule {k l : ℤ} {x y : JetAlgebra} x * y ∈ boostWeightSubmodule i (k + l) := BoostWeight.mul_mem_space repLorentzGroup_apply_mul hx hy +/-- Boost weights add under multiplication, with the sum of the weights given explicitly. -/ +lemma mul_mem_boostWeightSubmodule' {k l n : ℤ} {x y : JetAlgebra} + (hx : x ∈ boostWeightSubmodule i k) (hy : y ∈ boostWeightSubmodule i l) + (hkl : k + l = n) : x * y ∈ boostWeightSubmodule i n := + hkl ▸ mul_mem_boostWeightSubmodule hx hy + instance : SetLike.GradedMonoid (boostWeightSubmodule i) where one_mem := one_mem_boostWeightSubmodule mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy @@ -898,6 +904,66 @@ lemma boostWeightSubmodule_iSupIndep : iSupIndep (boostWeightSubmodule i) := (repLorentzGroup (boostAxis i 2 two_ne_zero) : Module.End ℂ JetAlgebra)).comp zpow_two_injective).mono boostWeightSubmodule_le_eigenspace +/-- Recover the two summands from the sum and difference: if `u + v` and `u - v` lie in a + submodule then so do `u` and `v`. This inverts the passage from a pair of homogeneous + elements to the pair of their sum and difference, which is used to present the weight-zero + generators. -/ +lemma mem_of_add_mem_of_sub_mem {p : Submodule ℂ JetAlgebra} {u v : JetAlgebra} + (h₁ : u + v ∈ p) (h₂ : u - v ∈ p) : u ∈ p ∧ v ∈ p := by + constructor + · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] + exact add_mem (Submodule.smul_mem _ _ h₁) (Submodule.smul_mem _ _ h₂) + · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] + exact sub_mem (Submodule.smul_mem _ _ h₁) (Submodule.smul_mem _ _ h₂) + +/-- Multiply a two-term linear decomposition into a submodule: if `a * u` and `a * v` lie in a + submodule then so does `a * y` for `y` any combination of `u` and `v`. -/ +lemma mul_mem_of_eq_smul_add_smul {p : Submodule ℂ JetAlgebra} {a u v y : JetAlgebra} + (c d : ℂ) (hu : a * u ∈ p) (hv : a * v ∈ p) (hy : y = c • u + d • v) : a * y ∈ p := by + subst hy + rw [mul_add, mul_smul_comm, mul_smul_comm] + exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) + +/-- A product of two submodules of pure weights `k` and `l` with `k + l ≠ n` lands in the span + of the weights other than `n`. -/ +lemma mul_le_iSup_boostWeightSubmodule_of_ne {X Y : Submodule ℂ JetAlgebra} {k l n : ℤ} + (hX : X ≤ boostWeightSubmodule i k) (hY : Y ≤ boostWeightSubmodule i l) + (h : k + l ≠ n) : + X * Y ≤ ⨆ (j : ℤ) (_ : j ≠ n), boostWeightSubmodule i j := + Submodule.mul_le.2 fun _ hx _ hy => Submodule.mem_iSup_of_mem (k + l) + (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule (hX hx) (hY hy))) + +/-- **Extracting the weight-`k` part of a submodule.** If `V` contains a submodule `S` of pure + weight `k` and is contained in `S` together with the other weights, then the weight-`k` part + of `V` is exactly `S`. This is the modular law of the submodule lattice combined with the + independence of the weight submodules; it is the general skeleton behind the computations of + the weight-zero parts of the spans of kinetic-term monomials. -/ +lemma boostWeightSubmodule_inf_eq {k : ℤ} {S V : Submodule ℂ JetAlgebra} + (hS0 : S ≤ boostWeightSubmodule i k) (hSV : S ≤ V) + (hV : V ≤ S ⊔ ⨆ (j : ℤ) (_ : j ≠ k), boostWeightSubmodule i j) : + boostWeightSubmodule i k ⊓ V = S := by + refine le_antisymm ((inf_le_inf_left _ hV).trans ?_) (le_inf hS0 hSV) + rw [inf_comm, sup_inf_assoc_of_le _ hS0, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := i) k).symm, sup_bot_eq] + +/-- **Extracting the weight-`k` part of a span of homogeneous elements.** If a submodule `V` is + sandwiched between `span ℂ S` and `span ℂ (S ∪ T)`, where the elements of `S` have weight `k` + and the elements of `T` have some weight other than `k`, then the weight-`k` part of `V` is + exactly `span ℂ S`. A theorem about the weight-`k` part of a span of monomials reduces to + exhibiting the weights of a homogeneous generating set. -/ +lemma boostWeightSubmodule_inf_eq_span {k : ℤ} {S T : Set JetAlgebra} + {V : Submodule ℂ JetAlgebra} + (hS : ∀ x ∈ S, x ∈ boostWeightSubmodule i k) + (hT : ∀ x ∈ T, ∃ j ≠ k, x ∈ boostWeightSubmodule i j) + (hSV : Submodule.span ℂ S ≤ V) (hV : V ≤ Submodule.span ℂ (S ∪ T)) : + boostWeightSubmodule i k ⊓ V = Submodule.span ℂ S := by + refine boostWeightSubmodule_inf_eq (Submodule.span_le.2 hS) hSV (hV.trans ?_) + rw [Submodule.span_union] + refine sup_le le_sup_left (le_sup_of_le_right (Submodule.span_le.2 ?_)) + intro x hx + obtain ⟨j, hj, hxj⟩ := hT x hx + exact Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem hj hxj) + /-! ## G. The span of the homogeneous elements is a subalgebra @@ -1043,125 +1109,6 @@ theorem boostWeightSubmodule_isInternal_of_top /-! -## H. The interpolating polynomial of the boost averages - -`boostAvgZ` is a fixed rational combination of the identity and the boosts at `t = 2, 3, 4` -paired with their inverses, so on an element of boost weight `k` it acts by the scalar obtained -by substituting `t ^ k + t ^ (-k)` for each pair. The weights were chosen to make that scalar -one at `k = 0` and zero at `k = 2, 4, 6`; being a function of `t ^ k + t ^ (-k)` it is -automatically even in `k`, so it vanishes at `k = -2, -4, -6` as well. - --/ - -/-- The scalar by which `boostAvgZ` acts on an element of boost weight `k`. -/ -noncomputable def boostAvgZWeight (k : ℤ) : ℂ := - (65359/21600 : ℂ) - + (-133264/99225 : ℂ) * ((2 : ℂ) ^ k + (2 : ℂ) ^ (-k)) - + (384183/1019200 : ℂ) * ((3 : ℂ) ^ k + (3 : ℂ) ^ (-k)) - + (-60416/1289925 : ℂ) * ((4 : ℂ) ^ k + (4 : ℂ) ^ (-k)) - -/-- The interpolating scalar is even in the weight. -/ -lemma boostAvgZWeight_neg (k : ℤ) : boostAvgZWeight (-k) = boostAvgZWeight k := by - simp only [boostAvgZWeight, neg_neg] - ring - -@[simp] lemma boostAvgZWeight_zero : boostAvgZWeight 0 = 1 := by norm_num [boostAvgZWeight] -@[simp] lemma boostAvgZWeight_two : boostAvgZWeight 2 = 0 := by norm_num [boostAvgZWeight] -@[simp] lemma boostAvgZWeight_four : boostAvgZWeight 4 = 0 := by norm_num [boostAvgZWeight] -@[simp] lemma boostAvgZWeight_six : boostAvgZWeight 6 = 0 := by norm_num [boostAvgZWeight] - -/-- The interpolating scalar does *not* vanish at weight eight. This is why `boostAvgZ` is the - projection only where the boost weights are among `0, ±2, ±4, ±6` — on the covariant - subalgebra in mass weight eight — and not on all of mass weight eight, which contains the - weight-eight element `∂_ρ ∂_σ ∂_τ B_μ`. -/ -lemma boostAvgZWeight_eight_ne_zero : boostAvgZWeight 8 ≠ 0 := by - norm_num [boostAvgZWeight] - -@[simp] lemma boostAvgZWeight_neg_two : boostAvgZWeight (-2) = 0 := by - rw [boostAvgZWeight_neg, boostAvgZWeight_two] - -@[simp] lemma boostAvgZWeight_neg_four : boostAvgZWeight (-4) = 0 := by - rw [boostAvgZWeight_neg, boostAvgZWeight_four] - -@[simp] lemma boostAvgZWeight_neg_six : boostAvgZWeight (-6) = 0 := by - rw [boostAvgZWeight_neg, boostAvgZWeight_six] - -/-! - -## I. The boost averages are the projections onto boost weight zero - --/ - -/-- The weighted boost average along the `i`-th spatial axis. -/ -noncomputable def boostAvgAxis : Fin 3 → Module.End ℂ JetAlgebra - | 0 => boostAvgX - | 1 => boostAvgY - | 2 => boostAvgZ - -@[simp] lemma boostAvgAxis_zero : boostAvgAxis 0 = boostAvgX := rfl -@[simp] lemma boostAvgAxis_one : boostAvgAxis 1 = boostAvgY := rfl -@[simp] lemma boostAvgAxis_two : boostAvgAxis 2 = boostAvgZ := rfl - -lemma boostAvgAxis_eq (i : Fin 3) : - boostAvgAxis i = (65359/21600 : ℂ) • LinearMap.id - + (-133264/99225 : ℂ) • (repLorentzGroup (boostAxis i 2 (by norm_num)) + - repLorentzGroup ((boostAxis i 2 (by norm_num))⁻¹)) - + (384183/1019200 : ℂ) • (repLorentzGroup (boostAxis i 3 (by norm_num)) + - repLorentzGroup ((boostAxis i 3 (by norm_num))⁻¹)) - + (-60416/1289925 : ℂ) • (repLorentzGroup (boostAxis i 4 (by norm_num)) + - repLorentzGroup ((boostAxis i 4 (by norm_num))⁻¹)) := by - fin_cases i <;> rfl - -/-- The boost average along an axis acts on an element of boost weight `k` for that axis by the - scalar `boostAvgZWeight k`. -/ -lemma boostAvgAxis_apply_of_mem {i : Fin 3} {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule i k) : - boostAvgAxis i x = boostAvgZWeight k • x := by - have hinv : ∀ (t : ℝ) (ht : t ≠ 0), - repLorentzGroup ((boostAxis i t ht)⁻¹) x = ((((t : ℝ) : ℂ))⁻¹ ^ k) • x := by - intro t ht - rw [boostAxis_inv, hx t⁻¹ (inv_ne_zero ht), algebraMap_real_complex, Complex.ofReal_inv] - simp only [boostAvgAxis_eq i, LinearMap.add_apply, LinearMap.smul_apply, LinearMap.id_apply, - hx 2 (by norm_num), hx 3 (by norm_num), hx 4 (by norm_num), - hinv 2 (by norm_num), hinv 3 (by norm_num), hinv 4 (by norm_num), - algebraMap_real_complex, boostAvgZWeight] - push_cast - match_scalars - simp only [_root_.inv_zpow, ← _root_.zpow_neg] - ring - -/-- On boost weight zero the average is the identity. -/ -lemma boostAvgAxis_apply_of_mem_zero {i : Fin 3} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule i 0) : boostAvgAxis i x = x := by - rw [boostAvgAxis_apply_of_mem hx, boostAvgZWeight_zero, one_smul] - -/-- The average annihilates the boost weights `±2, ±4, ±6`. -/ -lemma boostAvgAxis_apply_eq_zero_of_mem {i : Fin 3} {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule i k) - (hk : k = 2 ∨ k = 4 ∨ k = 6 ∨ k = -2 ∨ k = -4 ∨ k = -6) : boostAvgAxis i x = 0 := by - rw [boostAvgAxis_apply_of_mem hx] - rcases hk with rfl | rfl | rfl | rfl | rfl | rfl <;> simp - -/-- Each boost average fixes every Lorentz-invariant element, as the projection onto boost - weight zero must. -/ -lemma boostAvgAxis_apply_of_isInvariant (i : Fin 3) {x : JetAlgebra} (hx : IsInvariant x) : - boostAvgAxis i x = x := - boostAvgAxis_apply_of_mem_zero (i := i) (mem_boostWeightSubmodule_zero_of_isInvariant hx) - -/-- `boostAvgZ` acts on an element of `z`-boost weight `k` by `boostAvgZWeight k`. -/ -lemma boostAvgZ_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 2 k) : - boostAvgZ x = boostAvgZWeight k • x := boostAvgAxis_apply_of_mem hx - -/-- `boostAvgX` acts on an element of `x`-boost weight `k` by `boostAvgZWeight k`. -/ -lemma boostAvgX_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 0 k) : - boostAvgX x = boostAvgZWeight k • x := boostAvgAxis_apply_of_mem hx - -/-- `boostAvgY` acts on an element of `y`-boost weight `k` by `boostAvgZWeight k`. -/ -lemma boostAvgY_apply_of_mem {k : ℤ} {x : JetAlgebra} (hx : x ∈ boostWeightSubmodule 1 k) : - boostAvgY x = boostAvgZWeight k • x := boostAvgAxis_apply_of_mem hx - -/-! - ## J. The grading The weight submodules are independent (`boostWeightSubmodule_iSupIndep`) and, by the descent diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean index 35c5b1f4f..48a99e754 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean @@ -97,6 +97,46 @@ instance : LeftCommutative simp only [LinearMap.coe_comp, Function.comp_apply] exact jetDeriv_comm ν₁ ν₂ (A x) + +/-- The jet derivative appends a derivative index to a gauge-field generator. -/ +lemma jetDeriv_ofGenerator_dB (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + jetDeriv ν (ofGenerator (JetGenerators.dB s μ)) = + ofGenerator (JetGenerators.dB (s + {ν}) μ) := by + simp only [ofGenerator_B_eq] + rw [jetDeriv_tmul, LinearMap.baseChange_tmul] + simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero, + BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] + +/-- **The jet derivative of a field-strength derivative is the next field-strength + derivative.** -/ +lemma jetDeriv_fieldStrengthDeriv (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (a b : Fin 1 ⊕ Fin 3) : + jetDeriv ν (fieldStrengthDeriv s a b) = fieldStrengthDeriv (s + {ν}) a b := by + rw [fieldStrengthDeriv_eq_sub, fieldStrengthDeriv_eq_sub, map_sub, + jetDeriv_ofGenerator_dB, jetDeriv_ofGenerator_dB, + show s + {a} + {ν} = s + {ν} + {a} from add_right_comm _ _ _, + show s + {b} + {ν} = s + {ν} + {b} from add_right_comm _ _ _] + +/-- **The Bianchi identity.** -/ +lemma jetDeriv_fieldStrengthDeriv_bianchi (ρ μ ν : Fin 1 ⊕ Fin 3) : + jetDeriv ρ (fieldStrengthDeriv {} μ ν) = + jetDeriv μ (fieldStrengthDeriv {} ρ ν) - jetDeriv ν (fieldStrengthDeriv {} ρ μ) := by + simp only [fieldStrengthDeriv_eq_sub, map_sub, jetDeriv_ofGenerator_dB, + Multiset.empty_eq_zero, zero_add] + rw [add_comm ({μ} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, + add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {μ}] + abel + +/-- A second-derivative field strength is the second jet derivative of a field strength. -/ +lemma fieldStrengthDeriv_pair_eq_jetDeriv (ρ τ μ ν : Fin 1 ⊕ Fin 3) : + fieldStrengthDeriv {ρ, τ} μ ν = + jetDeriv ρ (jetDeriv τ (fieldStrengthDeriv {} μ ν)) := by + rw [jetDeriv_fieldStrengthDeriv, jetDeriv_fieldStrengthDeriv] + congr 1 + simp only [Multiset.empty_eq_zero, zero_add, Multiset.singleton_add] + exact Multiset.cons_swap ρ τ 0 + /-! ## Jet derivatives over a multiset. diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean index c570536c9..24211436f 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean @@ -36,149 +36,6 @@ field strength live. @[expose] public section -namespace StandardModel -open TensorProduct Matrix MatrixGroups - -namespace BBoson - -/-- The real derivative-algebra representation is multiplicative: it is the lift of a linear - map to the symmetric algebra. -/ -lemma _root_.DerivAlgebraReal.repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) - (a b : DerivAlgebraReal) : - DerivAlgebraReal.repLorentzGroup Λ (a * b) = - DerivAlgebraReal.repLorentzGroup Λ a * DerivAlgebraReal.repLorentzGroup Λ b := by - simp [DerivAlgebraReal.repLorentzGroup] - -namespace JetComponentSpace - -/-- Appending a derivative index, as a linear map on the B-boson jet component space: it - multiplies the derivative-symbol factor by the symbol `∂_μ`. -/ -noncomputable def shiftLin (μ : Fin 1 ⊕ Fin 3) : JetComponentSpace →ₗ[ℝ] JetComponentSpace := - TensorProduct.map - (LinearMap.mulRight ℝ (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _))) - LinearMap.id - -lemma shiftLin_tmul (μ : Fin 1 ⊕ Fin 3) - (p : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) - (f : Module.Dual ℝ BBoson) : - shiftLin μ (p ⊗ₜ[ℝ] f) = - (p * LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) ⊗ₜ[ℝ] f := rfl - -/-- On the basis, the shift appends the derivative index. -/ -@[simp] -lemma shiftLin_basis (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) : - shiftLin μ (JetComponentSpace.basis (.dB s ν)) = - JetComponentSpace.basis (.dB (s + {μ}) ν) := by - rw [jetComponentSpace_basis_dB, shiftLin_tmul, dualRealJetAlgebraBasis_mul, - jetComponentSpace_basis_dB] - - -/-- **The shift is Lorentz covariant on the component space.** Appending `∂_μ` and then acting - is acting and then appending the transformed `∂_μ`, which is a combination of the `∂_a`. -/ -lemma repLorentzGroup_shiftLin (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : - JetComponentSpace.repLorentzGroup Λ (shiftLin μ v) = - ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • - shiftLin a (JetComponentSpace.repLorentzGroup Λ v) := by - have hsym : DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) = - ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • - LagrangianTheory.dualRealJetAlgebraBasis ({a} : Multiset _) := by - rw [dualRealJetAlgebraBasis_singleton, DerivAlgebraReal.repLorentzGroup_apply_ι, - Lorentz.CoVector.sl2Rep_dual_dualBasis, map_sum] - exact Finset.sum_congr rfl fun a _ => by - rw [map_smul, dualRealJetAlgebraBasis_singleton] - induction v using TensorProduct.induction_on with - | zero => simp - | add x y hx hy => - rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] - | tmul p f => - have hrep : ∀ q : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector), - JetComponentSpace.repLorentzGroup Λ (q ⊗ₜ[ℝ] f) = - (DerivAlgebraReal.repLorentzGroup Λ q) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ f) := fun _ => rfl - rw [shiftLin_tmul, hrep, hrep, DerivAlgebraReal.repLorentzGroup_apply_mul, hsym, - Finset.mul_sum, TensorProduct.sum_tmul] - exact Finset.sum_congr rfl fun a _ => by - rw [mul_smul_comm, shiftLin_tmul, TensorProduct.smul_tmul'] - -end JetComponentSpace - -namespace JetAlgebra - -/-- The jet derivative on a linear generator is the component-space shift. -/ -lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : - jetDeriv μ (SymmetricAlgebra.ι ℝ JetComponentSpace v) = - SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.shiftLin μ v) := by - have key : (jetDeriv μ) ∘ₗ (SymmetricAlgebra.ι ℝ JetComponentSpace) = - (SymmetricAlgebra.ι ℝ JetComponentSpace) ∘ₗ (JetComponentSpace.shiftLin μ) := by - refine JetComponentSpace.basis.ext fun g => ?_ - cases g with - | dB s ν => - simp only [LinearMap.coe_comp, Function.comp_apply, - show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis (.dB s ν)) = - ofGenerator (.dB s ν) from rfl, - jetDeriv_ofGenerator, JetGenerators.shift_dB, - JetComponentSpace.shiftLin_basis] - rfl - exact DFunLike.congr_fun key v - -set_option maxHeartbeats 4000000 in -/-- **The jet derivative on the B-boson jet algebra is a Lorentz vector.** -/ -lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - repLorentzGroup Λ (jetDeriv μ x) = - ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • jetDeriv a (repLorentzGroup Λ x) := by - induction x using SymmetricAlgebra.induction with - | algebraMap r => - have h1 : jetDeriv μ (algebraMap ℝ JetAlgebra r) = 0 := by - rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] - rw [h1, map_zero] - refine (Finset.sum_eq_zero fun a _ => ?_).symm - rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, - jetDeriv_one, smul_zero, smul_zero] - | ι v => - rw [jetDeriv_ι, repLorentzGroup_apply_ι, repLorentzGroup_apply_ι, - JetComponentSpace.repLorentzGroup_shiftLin, map_sum] - exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] - | mul a b ha hb => - rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, - Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] - refine Finset.sum_congr rfl fun c _ => ?_ - rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] - | add a b ha hb => - rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] - - -set_option maxHeartbeats 1000000 in -/-- **The complexified jet derivative is a Lorentz vector.** -/ -lemma complexRepLorentzGroup_baseChange_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (p : ℂ ⊗[ℝ] JetAlgebra) : - complexRepLorentzGroup Λ (LinearMap.baseChange ℂ (jetDeriv μ) p) = - ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - LinearMap.baseChange ℂ (jetDeriv a) (complexRepLorentzGroup Λ p) := by - have hrep : ∀ (c : ℂ) (y : JetAlgebra), complexRepLorentzGroup Λ (c ⊗ₜ[ℝ] y) = - c ⊗ₜ[ℝ] repLorentzGroup Λ y := fun _ _ => rfl - induction p using TensorProduct.induction_on with - | zero => simp - | add x y hx hy => - rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] - | tmul c y => - rw [LinearMap.baseChange_tmul, hrep, hrep, repLorentzGroup_jetDeriv, - TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [TensorProduct.tmul_smul, LinearMap.baseChange_tmul, - ← algebraMap_smul (R := ℝ) ℂ] - rfl - -end JetAlgebra - -end BBoson - -end StandardModel - namespace LeptonGaugeSector open TensorProduct StandardModel Matrix MatrixGroups diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index 242389985..0f3e61158 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -452,6 +452,46 @@ lemma shiftMulti_shift (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) end JetGenerators + +/-- The multiset basis of the dual derivative symbols, as a basis vector of the + symmetric algebra at the corresponding multi-index. -/ +lemma dualRealJetAlgebraBasis_apply' (s : Multiset (Fin 1 ⊕ Fin 3)) : + LagrangianTheory.dualRealJetAlgebraBasis s = + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by + rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] + rfl + +/-- The multiset basis vectors of the real dual derivative slots multiply by + adding the multisets. -/ +lemma _root_.StandardModel.BBoson.dualRealJetAlgebraBasis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : + LagrangianTheory.dualRealJetAlgebraBasis s * + LagrangianTheory.dualRealJetAlgebraBasis t = + LagrangianTheory.dualRealJetAlgebraBasis (s + t) := by + rw [dualRealJetAlgebraBasis_apply', dualRealJetAlgebraBasis_apply', + dualRealJetAlgebraBasis_apply', map_add] + simp only [Module.Basis.symmetricAlgebra, Module.Basis.map_apply, + show ∀ p, (SymmetricAlgebra.equivMvPolynomial + Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = + (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p + from fun _ => rfl, + ← map_mul, MvPolynomial.coe_basisMonomials] + simp only [MvPolynomial.monomial_mul, mul_one] + + +/-- The multiset basis of the real dual derivative slots at a singleton index. -/ +lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : + LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis μ) := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (Finsupp.single μ 1) = + MvPolynomial.X μ := rfl + rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, + Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + Finsupp.single μ 1 by simp, + Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] + simp + /-! ## B.2. The jet component space @@ -471,6 +511,40 @@ noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponent (LagrangianTheory.dualRealJetAlgebraBasis.tensorProduct BBoson.basis.dualBasis).reindex JetGenerators.equiv.symm +namespace JetComponentSpace + + +/-- The jet component basis vector at a generator, as a pure tensor. -/ +lemma basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) : + JetComponentSpace.basis (.dB s ρ) = + LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] BBoson.basis.dualBasis ρ := by + rw [JetComponentSpace.basis, Module.Basis.reindex_apply, Equiv.symm_symm] + exact Module.Basis.tensorProduct_apply' _ _ _ + +/-- Appending a derivative index, as a linear map on the B-boson jet component space: it + multiplies the derivative-symbol factor by the symbol `∂_μ`. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetComponentSpace →ₗ[ℝ] JetComponentSpace := + TensorProduct.map + (LinearMap.mulRight ℝ (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _))) + LinearMap.id + +lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) + (p : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) + (f : Module.Dual ℝ BBoson) : + jetDeriv μ (p ⊗ₜ[ℝ] f) = + (p * LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) ⊗ₜ[ℝ] f := rfl + +/-- On the basis, the shift appends the derivative index. -/ +@[simp] +lemma jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ν : Fin 1 ⊕ Fin 3) : + jetDeriv μ (JetComponentSpace.basis (.dB s ν)) = + JetComponentSpace.basis (.dB (s + {μ}) ν) := by + rw [JetComponentSpace.basis_dB, jetDeriv_tmul, dualRealJetAlgebraBasis_mul, + JetComponentSpace.basis_dB] + + +end JetComponentSpace /-! @@ -505,6 +579,36 @@ noncomputable def JetComponentSpace.repLorentzGroup : DerivAlgebraReal.repLorentzGroup.tprod BBoson.repLorentzGroup.dual +/-- **The shift is Lorentz covariant on the component space.** Appending `∂_μ` and then acting + is acting and then appending the transformed `∂_μ`, which is a combination of the `∂_a`. -/ +lemma JetComponentSpace.repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + JetComponentSpace.repLorentzGroup Λ (jetDeriv μ v) = + ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • + jetDeriv a (JetComponentSpace.repLorentzGroup Λ v) := by + have hsym : DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) = + ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • + LagrangianTheory.dualRealJetAlgebraBasis ({a} : Multiset _) := by + rw [dualRealJetAlgebraBasis_singleton, DerivAlgebraReal.repLorentzGroup_apply_ι, + Lorentz.CoVector.sl2Rep_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, dualRealJetAlgebraBasis_singleton] + induction v using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul p f => + have hrep : ∀ q : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector), + JetComponentSpace.repLorentzGroup Λ (q ⊗ₜ[ℝ] f) = + (DerivAlgebraReal.repLorentzGroup Λ q) ⊗ₜ[ℝ] + (BBoson.repLorentzGroup.dual Λ f) := fun _ => rfl + rw [jetDeriv_tmul, hrep, hrep, DerivAlgebraReal.repLorentzGroup_apply_mul, hsym, + Finset.mul_sum, TensorProduct.sum_tmul] + exact Finset.sum_congr rfl fun a _ => by + rw [mul_smul_comm, jetDeriv_tmul, TensorProduct.smul_tmul'] + + /-! ### B.5. The gauge action on the component space: `mcShift` @@ -548,21 +652,6 @@ noncomputable def mcShift (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩)) -/-- The multiset basis of the dual derivative symbols, as a basis vector of the - symmetric algebra at the corresponding multi-index. -/ -lemma dualRealJetAlgebraBasis_apply' (s : Multiset (Fin 1 ⊕ Fin 3)) : - LagrangianTheory.dualRealJetAlgebraBasis s = - Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by - rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] - rfl - -/-- The jet component basis vector at a generator, as a pure tensor. -/ -lemma jetComponentSpace_basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) : - JetComponentSpace.basis (.dB s ρ) = - LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] BBoson.basis.dualBasis ρ := by - rw [JetComponentSpace.basis, Module.Basis.reindex_apply, Equiv.symm_symm] - exact Module.Basis.tensorProduct_apply' _ _ _ - /-- The Maurer–Cartan shift on a pure tensor over a derivative-symbol basis vector: minus the component function evaluated on the B boson of factorial-weighted Taylor coefficients of the Maurer–Cartan series. -/ @@ -584,7 +673,7 @@ lemma mcShift_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) mcShift U (JetComponentSpace.basis (.dB s ν)) = - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s))) := by - rw [jetComponentSpace_basis_dB, mcShift_tmul_basis, neg_inj, + rw [JetComponentSpace.basis_dB, mcShift_tmul_basis, neg_inj, show (⟨∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = @@ -954,22 +1043,6 @@ lemma _root_.StandardModel.BBoson.dualRealJetAlgebraBasis_nil : Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] simp -/-- The multiset basis vectors of the real dual derivative slots multiply by - adding the multisets. -/ -lemma _root_.StandardModel.BBoson.dualRealJetAlgebraBasis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : - LagrangianTheory.dualRealJetAlgebraBasis s * - LagrangianTheory.dualRealJetAlgebraBasis t = - LagrangianTheory.dualRealJetAlgebraBasis (s + t) := by - rw [dualRealJetAlgebraBasis_apply', dualRealJetAlgebraBasis_apply', - dualRealJetAlgebraBasis_apply', map_add] - simp only [Module.Basis.symmetricAlgebra, Module.Basis.map_apply, - show ∀ p, (SymmetricAlgebra.equivMvPolynomial - Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = - (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p - from fun _ => rfl, - ← map_mul, MvPolynomial.coe_basisMonomials] - simp only [MvPolynomial.monomial_mul, mul_one] - /-- The Lorentz action on the zeroth-order B-boson generator of the B-boson jet algebra: the covector transformation. -/ @@ -979,7 +1052,7 @@ lemma repLorentzGroup_ofGenerator_dB_nil (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) ∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ • BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} ν) := by rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.jetComponentSpace_basis_dB, + BBoson.JetComponentSpace.basis_dB, show BBoson.JetComponentSpace.repLorentzGroup Λ (LagrangianTheory.dualRealJetAlgebraBasis {} ⊗ₜ[ℝ] StandardModel.BBoson.basis.dualBasis μ) = @@ -994,7 +1067,7 @@ lemma repLorentzGroup_ofGenerator_dB_nil (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) BBoson.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum, map_sum] refine Finset.sum_congr rfl fun ν _ => ?_ rw [TensorProduct.tmul_smul, map_smul, BBoson.JetAlgebra.ofGenerator, - BBoson.jetComponentSpace_basis_dB, BBoson.dualRealJetAlgebraBasis_nil] + BBoson.JetComponentSpace.basis_dB, BBoson.dualRealJetAlgebraBasis_nil] /-! @@ -1126,7 +1199,7 @@ lemma repJetGaugeGroupI_apply_B (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : repJetGaugeGroupI U (ofGenerator (.dB {} μ)) = .ofGenerator (.dB {} μ) + (mcShift U (.basis (.dB {} μ))) • 1 := by rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repJetGaugeGroupI_ι, - BBoson.jetComponentSpace_basis_dB] + BBoson.JetComponentSpace.basis_dB] simp only [Multiset.empty_eq_zero, Basis.coe_dualBasis, add_right_inj] exact Algebra.algebraMap_eq_smul_one ((mcShift U) (dualRealJetAlgebraBasis 0 ⊗ₜ[ℝ] basis.coord μ)) @@ -1134,7 +1207,7 @@ lemma repJetGaugeGroupI_apply_ofGenerator (U : JetGaugeGroupI) (s : List (Fin 1 (μ : Fin 1 ⊕ Fin 3) : repJetGaugeGroupI U (ofGenerator (.dB s μ)) = .ofGenerator (.dB s μ) + (mcShift U (.basis (.dB s μ))) • 1 := by rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repJetGaugeGroupI_ι, - BBoson.jetComponentSpace_basis_dB] + BBoson.JetComponentSpace.basis_dB] simp only [Basis.coe_dualBasis, add_right_inj] exact Algebra.algebraMap_eq_smul_one ((mcShift U) (dualRealJetAlgebraBasis ↑s ⊗ₜ[ℝ] basis.coord μ)) @@ -1314,6 +1387,24 @@ lemma jetDeriv_ofGenerator (μ : Fin 1 ⊕ Fin 3) (g : JetGenerators) : lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by simp [jetDeriv] + +/-- The jet derivative on a linear generator is the component-space shift. -/ +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + jetDeriv μ (SymmetricAlgebra.ι ℝ JetComponentSpace v) = + SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.jetDeriv μ v) := by + have key : (jetDeriv μ) ∘ₗ (SymmetricAlgebra.ι ℝ JetComponentSpace) = + (SymmetricAlgebra.ι ℝ JetComponentSpace) ∘ₗ (JetComponentSpace.jetDeriv μ) := by + refine JetComponentSpace.basis.ext fun g => ?_ + cases g with + | dB s ν => + simp only [LinearMap.coe_comp, Function.comp_apply, + show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis (.dB s ν)) = + ofGenerator (.dB s ν) from rfl, + jetDeriv_ofGenerator, JetGenerators.shift_dB, + JetComponentSpace.jetDeriv_basis] + rfl + exact DFunLike.congr_fun key v + /-- The total derivative is a derivation: the Leibniz rule on the jet algebra. -/ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by @@ -2546,20 +2637,6 @@ end JetAlgebra -/ -/-- The multiset basis of the real dual derivative slots at a singleton index. -/ -lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : - LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis μ) := by - have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (Finsupp.single μ 1) = - MvPolynomial.X μ := rfl - rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, - Equiv.symm_symm, - show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - Finsupp.single μ 1 by simp, - Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] - simp - /-- The degree scaling multiplies the multiset basis vector at `s` by `t ^ |s|`. -/ lemma gradeScale_dualRealJetAlgebraBasis (t : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) : @@ -2593,7 +2670,7 @@ lemma JetComponentSpace.massWeightScale_repLorentzGroup (c : ℝ) (Λ : SL(2,ℂ rw [pow_mul] ring rw [JetComponentSpace.massWeightScale_basis, hscal] - simp only [jetComponentSpace_basis_dB, TensorProduct.map_tmul, + simp only [JetComponentSpace.basis_dB, TensorProduct.map_tmul, AlgHom.toLinearMap_apply, LinearMap.smul_apply, LinearMap.id_apply, gradeScale_dualRealJetAlgebraBasis, TensorProduct.tmul_smul, TensorProduct.smul_tmul', smul_smul] @@ -2627,12 +2704,12 @@ lemma JetComponentSpace.repLorentzGroup_basis_dB_singleton (Λ : SL(2,ℂ)) (DerivAlgebraReal.repLorentzGroup Λ (LagrangianTheory.dualRealJetAlgebraBasis {μ})) ⊗ₜ[ℝ] (BBoson.repLorentzGroup.dual Λ (BBoson.basis.dualBasis ν)) := rfl - rw [jetComponentSpace_basis_dB, happ, dualRealJetAlgebraBasis_singleton, + rw [JetComponentSpace.basis_dB, happ, dualRealJetAlgebraBasis_singleton, DerivAlgebraReal.repLorentzGroup_apply_ι, Lorentz.CoVector.sl2Rep_dual_dualBasis, BBoson.repLorentzGroup_dual_dualBasis] simp only [map_sum, map_smul, TensorProduct.sum_tmul, TensorProduct.tmul_sum, TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, smul_smul, - jetComponentSpace_basis_dB, dualRealJetAlgebraBasis_singleton] + JetComponentSpace.basis_dB, dualRealJetAlgebraBasis_singleton] rw [Finset.sum_comm] refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ congr 2 @@ -2673,7 +2750,7 @@ lemma JetComponentSpace.repLorentzGroup_basis_dB_pair (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ})) ⊗ₜ[ℝ] (BBoson.repLorentzGroup.dual Λ (StandardModel.BBoson.basis.dualBasis ν)) := rfl - rw [BBoson.jetComponentSpace_basis_dB, happ, hpair, hmul, + rw [BBoson.JetComponentSpace.basis_dB, happ, hpair, hmul, DerivAlgebraReal.repLorentzGroup_apply_ι, DerivAlgebraReal.repLorentzGroup_apply_ι, Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, @@ -2681,7 +2758,7 @@ lemma JetComponentSpace.repLorentzGroup_basis_dB_pair simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, - smul_smul, BBoson.jetComponentSpace_basis_dB, hpair] + smul_smul, BBoson.JetComponentSpace.basis_dB, hpair] conv_lhs => rw [Finset.sum_comm] conv_lhs => enter [2, j]; rw [Finset.sum_comm] conv_lhs => rw [Finset.sum_comm] @@ -2729,7 +2806,7 @@ lemma JetComponentSpace.repLorentzGroup_basis_dB_triple (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ})) ⊗ₜ[ℝ] (BBoson.repLorentzGroup.dual Λ (StandardModel.BBoson.basis.dualBasis ν)) := rfl - rw [BBoson.jetComponentSpace_basis_dB, happ, htriple, hmul, hmul, + rw [BBoson.JetComponentSpace.basis_dB, happ, htriple, hmul, hmul, DerivAlgebraReal.repLorentzGroup_apply_ι, DerivAlgebraReal.repLorentzGroup_apply_ι, DerivAlgebraReal.repLorentzGroup_apply_ι, @@ -2739,7 +2816,7 @@ lemma JetComponentSpace.repLorentzGroup_basis_dB_triple simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, - smul_smul, BBoson.jetComponentSpace_basis_dB, htriple] + smul_smul, BBoson.JetComponentSpace.basis_dB, htriple] conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] conv_lhs => enter [2, i]; rw [Finset.sum_comm] conv_lhs => rw [Finset.sum_comm] @@ -2975,6 +3052,57 @@ lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_pair] simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] + + +set_option maxHeartbeats 4000000 in +/-- **The jet derivative on the B-boson jet algebra is a Lorentz vector.** -/ +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + repLorentzGroup Λ (jetDeriv μ x) = + ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • jetDeriv a (repLorentzGroup Λ x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => + have h1 : jetDeriv μ (algebraMap ℝ JetAlgebra r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] + rw [h1, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, repLorentzGroup_apply_ι, repLorentzGroup_apply_ι, + JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + + +set_option maxHeartbeats 1000000 in +/-- **The complexified jet derivative is a Lorentz vector.** -/ +lemma complexRepLorentzGroup_baseChange_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (p : ℂ ⊗[ℝ] JetAlgebra) : + complexRepLorentzGroup Λ (LinearMap.baseChange ℂ (jetDeriv μ) p) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + LinearMap.baseChange ℂ (jetDeriv a) (complexRepLorentzGroup Λ p) := by + have hrep : ∀ (c : ℂ) (y : JetAlgebra), complexRepLorentzGroup Λ (c ⊗ₜ[ℝ] y) = + c ⊗ₜ[ℝ] repLorentzGroup Λ y := fun _ _ => rfl + induction p using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul c y => + rw [LinearMap.baseChange_tmul, hrep, hrep, repLorentzGroup_jetDeriv, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [TensorProduct.tmul_smul, LinearMap.baseChange_tmul, + ← algebraMap_smul (R := ℝ) ℂ] + rfl + end JetAlgebra end BBoson diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index ebe8682cf..771f37c98 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -720,6 +720,19 @@ lemma repLorentzGroup_apply_ι (Λ : SL(2,ℂ)) (x : Module.Dual ℝ Lorentz.CoV (Lorentz.CoVector.sl2Rep.dual Λ x) := by simp [repLorentzGroup] +/-- The real derivative-algebra representation is multiplicative: it is the lift of a linear + map to the symmetric algebra. -/ +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) + (a b : DerivAlgebraReal) : + DerivAlgebraReal.repLorentzGroup Λ (a * b) = + DerivAlgebraReal.repLorentzGroup Λ a * DerivAlgebraReal.repLorentzGroup Λ b := by + simp [DerivAlgebraReal.repLorentzGroup] + +@[simp] +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + DerivAlgebraReal.repLorentzGroup Λ 1 = 1 := by + simp [DerivAlgebraReal.repLorentzGroup] + /-- The components of the dual covector action on the dual basis: the dual derivative slots transform contravariantly, by the columns of the Lorentz matrix. -/ From 20e544141950d286b736989263cd35bd4a3d4c8f Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Wed, 12 Aug 2026 11:33:35 +0400 Subject: [PATCH 131/254] feat: Add lepton singlet covariantization compatibility --- Physlib.lean | 1 + .../JetAlgebra/Covariantization.lean | 442 ++++++++++++++++++ .../LeptonSinglet/JetAlgebra/GaugeAction.lean | 66 ++- scripts/MetaPrograms/spellingWords.txt | 3 + 4 files changed, 511 insertions(+), 1 deletion(-) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean diff --git a/Physlib.lean b/Physlib.lean index 11be091ca..279adf61a 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -185,6 +185,7 @@ public import Physlib.Particles.FlavorPhysics.CKMMatrix.Relations public import Physlib.Particles.FlavorPhysics.CKMMatrix.Rows public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.Basic public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.StandardParameters +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Covariantization public import Physlib.Particles.NeutrinoPhysics.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.FamilyMaps diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean new file mode 100644 index 000000000..8b1d47fed --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean @@ -0,0 +1,442 @@ +/- +Copyright (c) 2026 Nathaneal Sajan. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Nathaneal Sajan +-/ +module + +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms +/-! +# Covariantization of charged-lepton jets + +This file provides compatibility properties of `covExtHom` (defined in `CovariantAlgebra.lean`), +which sends ordinary charged-lepton jets to ordered covariant derivatives in the mixed +lepton–gauge-sector jet algebra. + +The map is distinct from `covSubst` as `covExtHom` acts only on the matter algebra, while `covSubst` +extends it over the B-boson factor as a coordinate equivalence of the whole mixed algebra. + +At derivative order two and above, `covExtHom` uses `sortList` to choose an ordering of covariant +derivatives. Consequently, the Lorentz compatibility API in this file is restricted to derivative +orders zero and one. +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open Matrix MatrixGroups + +/-! + +## A. Gauge compatibility + +-/ + +/-- Applying a jet gauge transformation after covariantization is the same as first applying its +value at the base point to the ordinary lepton jets and then covariantizing the result. -/ +lemma repJetGaugeGroupI_covExtHom (U : JetGaugeGroupI) + (x : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U (covExtHom x) = + covExtHom (LeptonSinglet.JetAlgebra.repGaugeGroupI U.eval x) := by + have hhom : (repAlgHom U).comp covExtHom = + covExtHom.comp (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom + (JetGaugeGroupI.ofConstant U.eval)) := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) + simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, + AlgHom.toLinearMap_apply, covExtHom_ι] + have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = + covExtHom.toLinearMap ∘ₗ + (LeptonSinglet.JetAlgebra.repGaugeGroupI U.eval ∘ₗ ExteriorAlgebra.ι ℂ) := by + refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearMap.comp_apply, covMap_basis, + AlgHom.toLinearMap_apply, AlgHom.toLinearMap_apply, + ← repJetGaugeGroupI_eq_repAlgHom] + cases g with + | dψ s α => + rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, + repJetGaugeGroupI_Dψ] + rw [show ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) = + LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) from rfl, + LeptonSinglet.JetAlgebra.repGaugeGroupI_ofGenerator_ψ, map_smul] + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) = + ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) from rfl, + covExtHom_ι, covMap_basis] + rfl + | dbarψ s α => + rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, + repJetGaugeGroupI_Dbarψ] + rw [show ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) = + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) from rfl, + LeptonSinglet.JetAlgebra.repGaugeGroupI_ofGenerator_barψ, map_smul] + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) = + ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) from rfl, + covExtHom_ι, covMap_basis] + rfl + exact LinearMap.congr_fun hlin m + rw [repJetGaugeGroupI_eq_repAlgHom] + exact AlgHom.congr_fun hhom x + +/-- A gauge jet whose value at the base point is the identity fixes every covariantized +charged-lepton expression. -/ +lemma repJetGaugeGroupI_covExtHom_of_eval_eq_one (U : JetGaugeGroupI) + (hU : U.eval = 1) (x : LeptonSinglet.JetAlgebra) : + repJetGaugeGroupI U (covExtHom x) = covExtHom x := by + rw [repJetGaugeGroupI_covExtHom, hU, map_one, Module.End.one_apply] + +/-- An ordinary charged-lepton expression invariant under constant gauge transformations becomes +invariant under all jet gauge transformations after covariantization. -/ +lemma repJetGaugeGroupI_covExtHom_eq_self (x : LeptonSinglet.JetAlgebra) + (hx : ∀ g : GaugeGroupI, LeptonSinglet.JetAlgebra.repGaugeGroupI g x = x) + (U : JetGaugeGroupI) : + repJetGaugeGroupI U (covExtHom x) = covExtHom x := by + rw [repJetGaugeGroupI_covExtHom, hx U.eval] + +/-! + +## B. Mass-weight compatibility + +-/ + +/-- Covariantization preserves the mass-weight polynomial. -/ +lemma massWeightPoly_covExtHom (x : LeptonSinglet.JetAlgebra) : + massWeightPoly (covExtHom x) = + Polynomial.mapAlgHom covExtHom (LeptonSinglet.JetAlgebra.massWeightPoly x) := by + have hhom : massWeightPoly.comp covExtHom = + (Polynomial.mapAlgHom covExtHom).comp LeptonSinglet.JetAlgebra.massWeightPoly := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) + simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, + AlgHom.toLinearMap_apply, covExtHom_ι] + have hlin : massWeightPoly.toLinearMap ∘ₗ covMap = + (Polynomial.mapAlgHom covExtHom).toLinearMap ∘ₗ + (LeptonSinglet.JetAlgebra.massWeightPoly.toLinearMap ∘ₗ ExteriorAlgebra.ι ℂ) := by + refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ + simp only [LinearMap.comp_apply, AlgHom.toLinearMap_apply, covMap_basis] + cases g with + | dψ s α => + rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl] + rw [show ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) = + LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) from rfl, + LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, + Polynomial.mapAlgHom_monomial] + rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α)) = + Dψ (sortList s) α from by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) = + ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) from rfl, + covExtHom_ι, covMap_basis] + rfl] + have h := Dψ_mem_massWeightSubmodule (sortList s) α + rw [mem_massWeightSubmodule] at h + simpa [LeptonSinglet.JetGenerators.massWeight, length_sortList] using h + | dbarψ s α => + rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl] + rw [show ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) = + LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) from rfl, + LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, + Polynomial.mapAlgHom_monomial] + rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α)) = + Dbarψ (sortList s) α from by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) = + ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) from rfl, + covExtHom_ι, covMap_basis] + rfl] + have h := Dbarψ_mem_massWeightSubmodule (sortList s) α + rw [mem_massWeightSubmodule] at h + simpa [LeptonSinglet.JetGenerators.massWeight, length_sortList] using h + exact LinearMap.congr_fun hlin m + exact AlgHom.congr_fun hhom x + +/-! + +## C. Lorentz compatibility at derivative orders zero and one + +-/ + +/-- Covariantization is compatible with Lorentz transformations on a zeroth-order lepton +generator. -/ +lemma repLorentzGroup_covExtHom_ofGenerator_ψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ + (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α))) = + covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α))) := by + rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α)) = Dψ [] α from by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ {} α)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList]] + rw [repLorentzGroup_Dψ_nil, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul] + congr 1 + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} β) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ {} β)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList] + +/-- Covariantization is compatible with Lorentz transformations on a first-order lepton +generator. -/ +lemma repLorentzGroup_covExtHom_ofGenerator_ψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repLorentzGroup Λ + (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α))) = + covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α))) := by + rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α)) = Dψ [μ] α from by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ {μ} α)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList]] + rw [repLorentzGroup_Dψ_singleton, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul] + congr 1 + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {ν} β) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ {ν} β)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList] + +/-- Covariantization is compatible with Lorentz transformations on a zeroth-order conjugate +lepton generator. -/ +lemma repLorentzGroup_covExtHom_ofGenerator_barψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : + repLorentzGroup Λ + (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α))) = + covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α))) := by + rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α)) = + Dbarψ [] α from by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList]] + rw [repLorentzGroup_Dbarψ_nil, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul] + congr 1 + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} β) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} β)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList] + +/-- Covariantization is compatible with Lorentz transformations on a first-order conjugate +lepton generator. -/ +lemma repLorentzGroup_covExtHom_ofGenerator_barψ_singleton (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : + repLorentzGroup Λ + (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α))) = + covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α))) := by + rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α)) = + Dbarψ [μ] α from by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ {μ} α)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList]] + rw [repLorentzGroup_Dbarψ_singleton, + LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul] + congr 1 + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {ν} β) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ {ν} β)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList] + +end JetAlgebra + +end LeptonGaugeSector + +namespace StandardModel + +namespace LeptonSinglet + +namespace JetAlgebra + +open Matrix MatrixGroups + +/-! + +## D. The fermion kinetic term + +-/ + +/-- The ordinary-jet charged-lepton kinetic expression. Covariantization sends this expression to +`LeptonGaugeSector.JetAlgebra.fermionKineticTerm`. -/ +noncomputable def fermionKineticTerm : LeptonSinglet.JetAlgebra := + Complex.I • ∑ μ, ∑ α, ∑ β, LeptonGaugeSector.JetAlgebra.kineticPauli μ α β • + (ofGenerator (.dbarψ {} α) * ofGenerator (.dψ {μ} β)) + +/-- The hypercharge factors of an ordinary conjugate-lepton/lepton generator pair cancel. -/ +lemma repGaugeGroupI_barψ_mul_ψ + (g : GaugeGroupI) (s t : Multiset (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : + repGaugeGroupI g (ofGenerator (.dbarψ s α) * ofGenerator (.dψ t β)) = + ofGenerator (.dbarψ s α) * ofGenerator (.dψ t β) := by + have hz : star ((g.toU1 : unitary ℂ) : ℂ) * ((g.toU1 : unitary ℂ) : ℂ) = 1 := + (Unitary.mem_iff.mp g.toU1.2).1 + rw [repGaugeGroupI_apply_mul, repGaugeGroupI_ofGenerator_barψ, + repGaugeGroupI_ofGenerator_ψ, smul_mul_smul_comm, ← mul_pow, hz, one_pow, one_smul] + +/-- Constant-gauge invariance of the ordinary-jet charged-lepton kinetic expression. -/ +lemma repGaugeGroupI_fermionKineticTerm + (g : GaugeGroupI) : + repGaugeGroupI g fermionKineticTerm = fermionKineticTerm := by + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, repGaugeGroupI_barψ_mul_ψ] + +/-- Lorentz invariance of the ordinary-jet charged-lepton kinetic expression. -/ +lemma repLorentzGroup_fermionKineticTerm + (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by + have hsmF : ∀ (f : Fin 2 → LeptonSinglet.JetAlgebra) (y : LeptonSinglet.JetAlgebra), + (∑ x, f x) * y = ∑ x, f x * y := fun f y => by + rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → LeptonSinglet.JetAlgebra) + (y : LeptonSinglet.JetAlgebra), y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hmsF : ∀ (f : Fin 2 → LeptonSinglet.JetAlgebra) (y : LeptonSinglet.JetAlgebra), + y * (∑ x, f x) = ∑ x, y * f x := fun f y => by + rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] + rfl + have hsmul : ∀ (c d : ℂ) (x y : LeptonSinglet.JetAlgebra), + (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by + rw [smul_mul_smul_comm] + rw [fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_ofGenerator_barψ_nil, + repLorentzGroup_ofGenerator_ψ_singleton] + simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] + -- Move the transformed indices outside the original contraction sums. + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, α']; rw [Finset.sum_comm] + conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] + conv_rhs => rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => + Finset.sum_congr rfl fun β' _ => ?_ + conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] + conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] + rw [← Finset.sum_smul] + -- The remaining scalar coefficient is the existing Pauli-matrix contraction identity. + rw [show (∑ μ, ∑ α, ∑ β, LeptonGaugeSector.JetAlgebra.kineticPauli μ α β * + ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * + star ((Λ⁻¹).1 β β')))) = + LeptonGaugeSector.JetAlgebra.kineticPauli ν α' β' from + LeptonGaugeSector.JetAlgebra.sum_kineticPauli_contraction Λ ν α' β'] + +end JetAlgebra + +end LeptonSinglet + +end StandardModel + +namespace LeptonGaugeSector +open TensorProduct StandardModel + +namespace JetAlgebra + +open Matrix MatrixGroups + +/-- Covariantization maps the ordinary-jet kinetic expression to the existing covariant kinetic +term in the mixed algebra. -/ +lemma covExtHom_fermionKineticTerm : + covExtHom LeptonSinglet.JetAlgebra.fermionKineticTerm = fermionKineticTerm := by + rw [LeptonSinglet.JetAlgebra.fermionKineticTerm, fermionKineticTerm, map_smul] + congr 1 + rw [map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, map_mul] + have hbar : covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α)) = + Dbarψ [] α := by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList] + have hψ : covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} β)) = Dψ [μ] β := by + rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} β) = ExteriorAlgebra.ι ℂ + (LeptonSinglet.JetComponentSpace.basis (.dψ {μ} β)) from rfl, + covExtHom_ι, covMap_basis] + simp [covGenerator, sortList] + rw [hbar, hψ] + +/-- Lorentz compatibility of covariantization on the ordinary-jet kinetic expression, obtained +from the order-zero and order-one generator compatibility lemmas. -/ +lemma repLorentzGroup_covExtHom_fermionKineticTerm (Λ : SL(2,ℂ)) : + repLorentzGroup Λ (covExtHom LeptonSinglet.JetAlgebra.fermionKineticTerm) = + covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ + LeptonSinglet.JetAlgebra.fermionKineticTerm) := by + rw [LeptonSinglet.JetAlgebra.fermionKineticTerm] + simp only [map_smul] + congr 1 + conv_lhs => rw [map_sum, map_sum] + conv_rhs => rw [map_sum, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + conv_lhs => rw [map_sum, map_sum] + conv_rhs => rw [map_sum, map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + conv_lhs => rw [map_sum, map_sum] + conv_rhs => rw [map_sum, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + simp only [map_smul] + congr 1 + rw [map_mul, repLorentzGroup_apply_mul, + LeptonSinglet.JetAlgebra.repLorentzGroup_apply_mul, map_mul, + repLorentzGroup_covExtHom_ofGenerator_barψ_nil, + repLorentzGroup_covExtHom_ofGenerator_ψ_singleton] + +/-- A modular gauge-invariance proof of the existing covariant kinetic term through +`covExtHom`. The existing direct proof remains available. -/ +lemma repJetGaugeGroupI_fermionKineticTerm_via_covExtHom (U : JetGaugeGroupI) : + repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by + rw [← covExtHom_fermionKineticTerm, repJetGaugeGroupI_covExtHom, + LeptonSinglet.JetAlgebra.repGaugeGroupI_fermionKineticTerm] + +/-- A modular Lorentz-invariance proof of the existing covariant kinetic term through +`covExtHom`. The existing direct proof remains available. -/ +lemma repLorentzGroup_fermionKineticTerm_via_covExtHom (Λ : SL(2,ℂ)) : + repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by + rw [← covExtHom_fermionKineticTerm, repLorentzGroup_covExtHom_fermionKineticTerm, + LeptonSinglet.JetAlgebra.repLorentzGroup_fermionKineticTerm] + +end JetAlgebra + +end LeptonGaugeSector diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean index 943565134..6391dc853 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean @@ -88,7 +88,7 @@ lemma repJetGaugeGroupI_ofGenerator_ψ_nil (g : JetGaugeGroupI) (α : Fin 2) : /-- The action of the gauge group on ∂_μ ψ takes it to g • (∂_μ ψ + 6 i (maurerCartanU1Coeff g μ 0) • ψ)-/ lemma repJetGaugeGroupI_ofGenerator_ψ_singleton (g : JetGaugeGroupI) - (μ : (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + (μ : (Fin 1 ⊕ Fin 3)) (α : Fin 2) : repJetGaugeGroupI g (ofGenerator (.dψ {μ} α)) = g.eval.2.2 ^ 6 • ofGenerator (.dψ {μ} α) - ((6 : ℂ) * Complex.I * (maurerCartanU1Coeff g μ 0 : ℂ) * (g.eval.2.2 : ℂ) ^ 6) • @@ -163,6 +163,70 @@ noncomputable def repJetGaugeGroupIAlgHom (g : JetGaugeGroupI) : map_zero' := LinearMap.map_zero _ commutes' := fun r => by simp [repJetGaugeGroupI_apply] +/-! + +## B. Constant gauge transformations + +-/ + +/-- The action of constant gauge transformations on the charged-lepton jet algebra, obtained by +including a gauge transformation as a constant gauge jet. -/ +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI JetAlgebra := + repJetGaugeGroupI.comp JetGaugeGroupI.ofConstant + +/-- The constant gauge action is multiplicative. -/ +lemma repGaugeGroupI_apply_mul (g : GaugeGroupI) (x y : JetAlgebra) : + repGaugeGroupI g (x * y) = repGaugeGroupI g x * repGaugeGroupI g y := + repJetGaugeGroupI_apply_mul (JetGaugeGroupI.ofConstant g) x y + +/-- A constant gauge transformation acts on every ordinary lepton-jet generator through the +`U(1)` character determined by its hypercharge. -/ +lemma repGaugeGroupI_ofGenerator_ψ (g : GaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repGaugeGroupI g (ofGenerator (.dψ s α)) = + (g.toU1 : ℂ) ^ 6 • ofGenerator (.dψ s α) := by + change repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (ofGenerator (.dψ s α)) = + (g.toU1 : ℂ) ^ 6 • ofGenerator (.dψ s α) + rw [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι] + have hu : ((((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing)) : JetRing) = + MvPowerSeries.C (g.toU1 : ℂ) := rfl + simp only [JetComponentSpace.basis_dψ] + rw [JetComponentSpace.repJetGaugeGroupI_inl, hu, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp only [LinearMap.smul_apply, LinearMap.id_apply] + have hpair : + ((((g.toU1 : ℂ) ^ 6 • DerivAlgebraComplex.basis s) ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α, 0) : JetComponentSpace) = + (g.toU1 : ℂ) ^ 6 • + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + LeptonSinglet.basis.dualBasis α, 0) : JetComponentSpace) := by + simp only [TensorProduct.smul_tmul', Prod.smul_mk, smul_zero] + rw [hpair, map_smul] + +/-- A constant gauge transformation acts on every conjugate ordinary lepton-jet generator through +the conjugate `U(1)` character determined by its hypercharge. -/ +lemma repGaugeGroupI_ofGenerator_barψ (g : GaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : + repGaugeGroupI g (ofGenerator (.dbarψ s α)) = + (star g.toU1 : ℂ) ^ 6 • ofGenerator (.dbarψ s α) := by + change repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) (ofGenerator (.dbarψ s α)) = + (star g.toU1 : ℂ) ^ 6 • ofGenerator (.dbarψ s α) + rw [ofGenerator, repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι] + have hu : ((((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing)) : JetRing) = + MvPowerSeries.C (g.toU1 : ℂ) := rfl + simp only [JetComponentSpace.basis_dbarψ] + rw [JetComponentSpace.repJetGaugeGroupI_inr, hu, JetRing.star_C, ← map_pow, + DerivAlgebraComplex.jetRingAction_C] + simp only [LinearMap.smul_apply, LinearMap.id_apply] + have hpair : + ((0, ((star g.toU1 : ℂ) ^ 6 • DerivAlgebraComplex.basis s) ⊗ₜ[ℂ] + LeptonSinglet.basis.conj.dualBasis α) : JetComponentSpace) = + (star g.toU1 : ℂ) ^ 6 • + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + LeptonSinglet.basis.conj.dualBasis α) : JetComponentSpace) := by + simp only [TensorProduct.smul_tmul', Prod.smul_mk, smul_zero] + rw [hpair, map_smul] + end JetAlgebra end LeptonSinglet diff --git a/scripts/MetaPrograms/spellingWords.txt b/scripts/MetaPrograms/spellingWords.txt index 3500be8da..5160fc5b4 100644 --- a/scripts/MetaPrograms/spellingWords.txt +++ b/scripts/MetaPrograms/spellingWords.txt @@ -620,6 +620,9 @@ coupling couplings covariance covariant +covariantization +covariantized +covariantizing covector covectors cover From 75d2c5fd5b674ff80d4d78b688d5b6f45d0a1856 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:56:00 +0100 Subject: [PATCH 132/254] feat: Clean up boost proof Co-Authored-By: Claude --- .../JetAlgebra/Boosts/FieldStrength.lean | 373 +++++++++++++ .../GaugeKineticTerm/BoostWeight.lean | 191 +------ .../JetAlgebra/Grading/BoostWeight.lean | 502 ++++++++++++++++++ .../JetAlgebra/JetDerivLorentz.lean | 31 ++ .../JetAlgebra/LorentzAction.lean | 30 ++ .../LeptonSinglet/JetComponentSpace.lean | 107 ++++ 6 files changed, 1063 insertions(+), 171 deletions(-) create mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean new file mode 100644 index 000000000..39c2422bd --- /dev/null +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean @@ -0,0 +1,373 @@ +/- +Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.LinearIndependence +/-! +# Relation between field strength and boosts +-/ + +@[expose] public section + +namespace LeptonGaugeSector +open TensorProduct StandardModel +open scoped minkowskiMatrix PauliMatrix Pointwise +open Matrix MatrixGroups + +namespace JetAlgebra + +/-! + +## A. The homogeneous combinations + +-/ + +/-- The scalar action of a real parameter on the jet algebra, in the form the weight condition + presents it. -/ +private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl + + +/-! + +## B. Boosts in given directions + +-/ + +/-! + +## B.3. Boosts in the z-direction + +-/ + +/-- The light-cone combination `F_{0y} - F_{zy}` has boost weight `2`. -/ +lemma fieldStrengthDeriv_lightCone_y_mem_two : + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ boostWeightSubmodule 2 2 := by + intro t ht + simp only [algebraMap_real_complex] + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- The light-cone combination `F_{0y} + F_{zy}` has boost weight `-2`. -/ +lemma fieldStrengthDeriv_lightCone_y_mem_neg_two : + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ boostWeightSubmodule 2 (-2) := by + intro t ht + simp only [algebraMap_real_complex] + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- The component along the boost, `F_{0z}`, has boost weight zero: the boost acts on the two + indices by inverse scalings, which cancel. -/ +lemma fieldStrengthDeriv_longitudinal_mem_zero : + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) ∈ boostWeightSubmodule 2 0 := by + intro t ht + simp only [algebraMap_real_complex] + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, fieldStrengthDeriv_inr_inl, + mul_zero, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +lemma fieldStrengthDeriv_nil_span_le_decompose_boostWeight_z : + Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} ≤ + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by + rw [Submodule.span_le] + rintro _ ⟨μ, ν, rfl⟩ + simp only [SetLike.mem_coe, Submodule.mem_span_insert, Submodule.mem_span_singleton] + match μ, ν with + | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 | Sum.inr 2, Sum.inr 2 => + exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by simp⟩ + | Sum.inl 0, Sum.inr 0 => + exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ + | Sum.inl 0, Sum.inr 1 => + exact ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ + | Sum.inl 0, Sum.inr 2 => + exact ⟨1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ + | Sum.inr 0, Sum.inl 0 => + exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨-2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by + rw [fieldStrengthDeriv_antisymm]; module⟩ + | Sum.inr 0, Sum.inr 1 => + exact ⟨0, _, ⟨1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ + | Sum.inr 0, Sum.inr 2 => + exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨-2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by + rw [fieldStrengthDeriv_antisymm]; module⟩ + | Sum.inr 1, Sum.inl 0 => + exact ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by + rw [fieldStrengthDeriv_antisymm]; module⟩ + | Sum.inr 1, Sum.inr 0 => + exact ⟨0, _, ⟨-1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by + rw [fieldStrengthDeriv_antisymm]; module⟩ + | Sum.inr 1, Sum.inr 2 => + exact ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by + rw [fieldStrengthDeriv_antisymm]; module⟩ + | Sum.inr 2, Sum.inl 0 => + exact ⟨-1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by + rw [fieldStrengthDeriv_antisymm]; module⟩ + | Sum.inr 2, Sum.inr 0 => + exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ + | Sum.inr 2, Sum.inr 1 => + exact ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ + +/-- **The field strengths, organised by `z`-boost weight.** The span of the `F_{μν}` is the sup + of its weight-zero, weight-two and weight-minus-two pieces. -/ +lemma fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z : + Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} = + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} ⊔ + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ⊔ + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by + refine le_antisymm (fieldStrengthDeriv_nil_span_le_decompose_boostWeight_z.trans ?_) ?_ + · rw [Submodule.span_le] + rintro _ (rfl | rfl | rfl | rfl | rfl | rfl) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) + · exact Submodule.mem_sup_right (Submodule.subset_span (by simp)) + · exact Submodule.mem_sup_right (Submodule.subset_span (by simp)) + · refine sup_le (sup_le ?_ ?_) ?_ <;> refine Submodule.span_le.2 ?_ <;> rintro _ (rfl | rfl) + · exact Submodule.subset_span ⟨_, _, rfl⟩ + · exact Submodule.subset_span ⟨_, _, rfl⟩ + · exact sub_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) + · exact sub_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) + · exact add_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) + · exact add_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) + +/-- The longitudinal and transverse components span a subspace of `z`-boost weight zero. -/ +lemma fieldStrengthDeriv_span_pair_zero_le : + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} ≤ boostWeightSubmodule 2 0 := + Submodule.span_le.2 (by + rintro _ (rfl | rfl) + exacts [fieldStrengthDeriv_longitudinal_mem_zero, fieldStrengthDeriv_transverse_mem_zero]) + +/-- The two light-cone differences span a subspace of `z`-boost weight two. -/ +lemma fieldStrengthDeriv_span_pair_two_le : + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ boostWeightSubmodule 2 2 := + Submodule.span_le.2 (by + rintro _ (rfl | rfl) + exacts [fieldStrengthDeriv_lightCone_y_mem_two, fieldStrengthDeriv_lightCone_mem_two]) + +/-- The two light-cone sums span a subspace of `z`-boost weight minus two. -/ +lemma fieldStrengthDeriv_span_pair_neg_two_le : + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ boostWeightSubmodule 2 (-2) := + Submodule.span_le.2 (by + rintro _ (rfl | rfl) + exacts [fieldStrengthDeriv_lightCone_y_mem_neg_two, fieldStrengthDeriv_lightCone_mem_neg_two]) + +lemma boostProj_z_zero_map_fieldStrengthDeriv_span : + Submodule.map (boostProj 2 0) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} := by + rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, + map_boostProj_of_le fieldStrengthDeriv_span_pair_zero_le, + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_two_le (by decide), + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_neg_two_le (by decide), + sup_bot_eq, sup_bot_eq] + +lemma boostProj_z_two_map_fieldStrengthDeriv_span : + Submodule.map (boostProj 2 2) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by + rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_zero_le (by decide), + map_boostProj_of_le fieldStrengthDeriv_span_pair_two_le, + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_neg_two_le (by decide), + bot_sup_eq, sup_bot_eq] + +lemma boostProj_z_neg_two_map_fieldStrengthDeriv_span : + Submodule.map (boostProj 2 (-2)) + (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = + Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by + rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_zero_le (by decide), + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_two_le (by decide), + map_boostProj_of_le fieldStrengthDeriv_span_pair_neg_two_le, + sup_bot_eq, bot_sup_eq] + +/-- Away from the weights `0`, `±2` the projection of the field-strength span vanishes. -/ +lemma boostProj_z_map_fieldStrengthDeriv_span_of_ne (k : ℤ) (h0 : k ≠ 0) (h2 : k ≠ 2) + (hn2 : k ≠ -2) : + Submodule.map (boostProj 2 k) + (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = ⊥ := by + rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_zero_le (Ne.symm h0), + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_two_le (Ne.symm h2), + map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_neg_two_le (Ne.symm hn2), + sup_bot_eq, sup_bot_eq] + +/-! + +## The Kinetic terms + +-/ + +lemma fieldStrengthDeriv_mul_span_eq_mul_span : + Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * + fieldStrengthDeriv {} μ' ν'} = Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} * + Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} := by + rw [Submodule.span_mul_span] + refine Submodule.span_eq_span ?_ ?_ + · rintro _ ⟨μ, ν, μ', ν', rfl⟩ + apply Submodule.mem_span_of_mem + refine Set.mul_mem_mul ?_ ?_ + · refine Set.mem_setOf.mpr ?_ + exact ⟨μ, ν, rfl⟩ + · refine Set.mem_setOf.mpr ?_ + exact ⟨μ', ν', rfl⟩ + · rintro _ ⟨u, ⟨μ, ν, rfl⟩, v, ⟨μ', ν', rfl⟩, rfl⟩ + apply Submodule.mem_span_of_mem + refine Set.mem_setOf.mpr ?_ + exact ⟨μ, ν, μ', ν', rfl⟩ + +TODO "Generalize the below result for any axis" + +/-- Every weight projection of the field-strength span stays inside the span. -/ +lemma boostProj_z_map_fieldStrengthDeriv_span_le (l : ℤ) : + (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (boostProj 2 l) ≤ + Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} := by + have hd : Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} = _ ⊔ _ ⊔ _ := + fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z + by_cases h0 : l = 0 + · subst h0 + rw [boostProj_z_zero_map_fieldStrengthDeriv_span, hd] + exact le_sup_left.trans le_sup_left + by_cases h2 : l = 2 + · subst h2 + rw [boostProj_z_two_map_fieldStrengthDeriv_span, hd] + exact le_sup_right.trans le_sup_left + by_cases hn2 : l = -2 + · subst hn2 + rw [boostProj_z_neg_two_map_fieldStrengthDeriv_span, hd] + exact le_sup_right + · rw [boostProj_z_map_fieldStrengthDeriv_span_of_ne l h0 h2 hn2] + exact bot_le + +lemma boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts : + let V0 := Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} + let V2 := (Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * + fieldStrengthDeriv {} μ' ν'}) + V2.map (boostProj 2 0) = V0.map (boostProj 2 0) * V0.map (boostProj 2 0) + + V0.map (boostProj 2 2) * V0.map (boostProj 2 (-2)) := by + intro V0 V2 + have hcl : ∀ l : ℤ, V0.map (boostProj 2 l) ≤ V0 := + boostProj_z_map_fieldStrengthDeriv_span_le + have hbot : ∀ l : ℤ, l ≠ 0 → l ≠ 2 → l ≠ -2 → + V0.map (boostProj 2 l) * V0.map (boostProj 2 (0 - l)) = ⊥ := by + intro l h0 h2 hn2 + rw [show V0.map (boostProj 2 l) = ⊥ from + boostProj_z_map_fieldStrengthDeriv_span_of_ne l h0 h2 hn2, Submodule.bot_mul] + have hbos : V0.map (boostProj 2 (-2)) ≤ bosonic := by + rw [show V0.map (boostProj 2 (-2)) = _ from boostProj_z_neg_two_map_fieldStrengthDeriv_span] + refine Submodule.span_le.2 ?_ + rintro _ (rfl | rfl) <;> + exact add_mem (fieldStrengthDeriv_mem_bosonic _ _ _) (fieldStrengthDeriv_mem_bosonic _ _ _) + have hV2 : V2 = V0 * V0 := fieldStrengthDeriv_mul_span_eq_mul_span + rw [hV2, boostProj_map_mul_submodule 0 hcl hcl, iSup_eq_sup_zero_two_neg_two _ hbot] + simp only [sub_self, zero_sub, neg_neg] + rw [Submodule.add_eq_sup, mul_comm_of_le_bosonic hbos, sup_assoc, sup_idem] + +/-- The weight-zero projection keeps the photon-pair span inside itself. -/ +lemma boostProj_z_map_fieldStrengthDeriv_mul_span_le : + (Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * + fieldStrengthDeriv {} μ' ν'}).map (boostProj 2 0) ≤ + Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * + fieldStrengthDeriv {} μ' ν'} := by + have hmul : _ = _ := boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts + rw [hmul, fieldStrengthDeriv_mul_span_eq_mul_span, Submodule.add_eq_sup] + exact sup_le + (Submodule.mul_le.2 fun a ha b hb => Submodule.mul_mem_mul + (boostProj_z_map_fieldStrengthDeriv_span_le 0 ha) + (boostProj_z_map_fieldStrengthDeriv_span_le 0 hb)) + (Submodule.mul_le.2 fun a ha b hb => Submodule.mul_mem_mul + (boostProj_z_map_fieldStrengthDeriv_span_le 2 ha) + (boostProj_z_map_fieldStrengthDeriv_span_le (-2) hb)) + +/-! + +## The double derivative terms. + +-/ +lemma fieldStrengthDeriv_two_deriv_eq_map_span : + Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν} = + ∑ α, (∑ β, (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (jetDeriv β)).map + (jetDeriv α) := by + refine le_antisymm ?_ ?_ + · rw [Submodule.span_le] + rintro _ ⟨α, β, μ, ν, rfl⟩ + rw [fieldStrengthDeriv_pair_eq_jetDeriv] + exact Finset.single_le_sum (f := fun γ => + (∑ δ, (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map + (jetDeriv δ)).map (jetDeriv γ)) + (fun i _ => by rw [Submodule.zero_eq_bot]; exact bot_le) (Finset.mem_univ α) + (Submodule.mem_map_of_mem + (Finset.single_le_sum (f := fun δ => + (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (jetDeriv δ)) + (fun i _ => by rw [Submodule.zero_eq_bot]; exact bot_le) (Finset.mem_univ β) + (Submodule.mem_map_of_mem (Submodule.subset_span ⟨μ, ν, rfl⟩)))) + · refine Finset.sum_induction _ (· ≤ _) (fun a b ha hb => ?_) ?_ fun γ _ => ?_ + · rw [Submodule.add_eq_sup] + exact sup_le ha hb + · rw [Submodule.zero_eq_bot] + exact bot_le + · rw [Submodule.map_le_iff_le_comap] + refine Finset.sum_induction _ (· ≤ _) (fun a b ha hb => ?_) ?_ fun δ _ => ?_ + · rw [Submodule.add_eq_sup] + exact sup_le ha hb + · rw [Submodule.zero_eq_bot] + exact bot_le + · rw [← Submodule.map_le_iff_le_comap, Submodule.map_span, Submodule.map_span, + Submodule.span_le] + rintro _ ⟨_, ⟨_, ⟨μ, ν, rfl⟩, rfl⟩, rfl⟩ + exact Submodule.subset_span + ⟨γ, δ, μ, ν, (fieldStrengthDeriv_pair_eq_jetDeriv γ δ μ ν).symm⟩ + +end JetAlgebra + +end LeptonGaugeSector + +end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean index 84f2c95d9..5a4c44a54 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Boosts.FieldStrength public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.ThetaTerm public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.LinearIndependence /-! @@ -98,177 +99,25 @@ theorem boostWeight_inter_fieldStrength : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2), fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)} := by - -- ### A. The boost eigenvectors among the field strengths - -- The light-cone combinations `F_{0i} ∓ F_{zi}` have weight `±2`; `F_{xy}` and `F_{0z}`, with - -- no free light-cone index, have weight `0`. - set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hPX - set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hPY - set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hMX - set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hMY - set T := fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hT - set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) with hL - set FF : Set JetAlgebra := - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF - set S : Set JetAlgebra := {PX * MX, PX * MY, PY * MX, PY * MY, T * T, T * L, L * L} with hS - have hPXw : PX ∈ boostWeightSubmodule 2 2 := fieldStrengthDeriv_lightCone_mem_two - have hMXw : MX ∈ boostWeightSubmodule 2 (-2) := fieldStrengthDeriv_lightCone_mem_neg_two - have hTw : T ∈ boostWeightSubmodule 2 0 := fieldStrengthDeriv_transverse_mem_zero - obtain ⟨hPYw, hMYw, hLw⟩ : PY ∈ boostWeightSubmodule 2 2 ∧ MY ∈ boostWeightSubmodule 2 (-2) ∧ - L ∈ boostWeightSubmodule 2 0 := by - refine ⟨?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hPY, hMY, hL, map_sub, map_add, boostAxis_two, - repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, - toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - boostMatZ, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - try rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. Every field strength is a combination of the eigenvectors - -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its - -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. - set A := Submodule.span ℂ {PX, PY} with hA - set B := Submodule.span ℂ {T, L} with hB - set C := Submodule.span ℂ {MX, MY} with hC - set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ boostWeightSubmodule 2 2 := by - rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ boostWeightSubmodule 2 0 := by - rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ boostWeightSubmodule 2 (-2) := by - rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) - have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left - have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left - have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right - have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) - have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) - have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) - have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) - have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) - have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) - have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → - x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by - rintro u v x c d hu hv rfl - exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) - have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → - v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → - fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by - intro u v c d μ ν hu hv h - rw [fieldStrengthDeriv_antisymm, h] - exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) - have hVle : V ≤ A ⊔ B ⊔ C := by - rw [hV] - refine Submodule.span_le.2 ?_ - rintro x ⟨μ, ν, rfl⟩ - match μ, ν with - | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 - | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ - | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 2, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 0, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 2, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 1, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 0, Sum.inr 1 => exact hTV - | Sum.inr 1, Sum.inr 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV - | Sum.inl 0, Sum.inr 2 => exact hLV - | Sum.inr 2, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV - -- ### C. Products of two field strengths - -- The span of the products is `V * V ≤ (A ⊔ B ⊔ C) * (A ⊔ B ⊔ C)`, nine products of weight - -- spaces each of a single weight: `A * C`, `C * A` and `B * B` land in the seven products - -- (using that the field strengths commute), the other six in the nonzero weights. - have hFV : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ V := fun μ ν => by - rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩ - have hPXV' : PX ∈ V := by rw [hPX]; exact sub_mem (hFV _ _) (hFV _ _) - have hPYV' : PY ∈ V := by rw [hPY]; exact sub_mem (hFV _ _) (hFV _ _) - have hMXV' : MX ∈ V := by rw [hMX]; exact add_mem (hFV _ _) (hFV _ _) - have hMYV' : MY ∈ V := by rw [hMY]; exact add_mem (hFV _ _) (hFV _ _) - have hTV' : T ∈ V := hFV _ _ - have hLV' : L ∈ V := hFV _ _ - have hcomm : ∀ x ∈ V, ∀ y ∈ V, x * y = y * x := by - intro x hx y hy - rw [hV] at hx hy - induction hx, hy using Submodule.span_induction₂ with - | mem_mem a b ha hb => - obtain ⟨μ, ν, rfl⟩ := ha; obtain ⟨μ', ν', rfl⟩ := hb - exact fieldStrengthDeriv_mul_comm _ _ _ _ _ _ - | zero_left => rw [zero_mul, mul_zero] - | zero_right => rw [zero_mul, mul_zero] - | add_left _ _ _ _ _ _ h₁ h₂ => rw [add_mul, mul_add, h₁, h₂] - | add_right _ _ _ _ _ _ h₁ h₂ => rw [mul_add, add_mul, h₁, h₂] - | smul_left _ _ _ _ _ h => rw [smul_mul_assoc, mul_smul_comm, h] - | smul_right _ _ _ _ _ h => rw [mul_smul_comm, smul_mul_assoc, h] - have hspan : Submodule.span ℂ FF = V * V := by - rw [hV, hFF, Submodule.span_mul_span] - congr 1 - ext x - constructor - · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ - · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ - have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule 2 k → - Y ≤ boostWeightSubmodule 2 l → k + l ≠ 0 → - X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j := - fun hX hY h => le_sup_of_le_right - ((Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy)).trans - (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) - have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → - a * b ∈ Submodule.span ℂ S := fun ha hb h => by - rw [hcomm _ ha _ hb]; exact Submodule.subset_span h - obtain ⟨hAC, hCA, hBB⟩ : A * C ≤ Submodule.span ℂ S ∧ C * A ≤ Submodule.span ℂ S ∧ - B * B ≤ Submodule.span ℂ S := by - refine ⟨?_, ?_, ?_⟩ <;> - simp only [hA, hB, hC, Submodule.span_mul_span] <;> - refine Submodule.span_le.2 ?_ <;> - rintro x ⟨a, rfl | rfl, b, rfl | rfl, rfl⟩ - -- `A * C` and `B * B` are products in `S`; `C * A` needs one commutation each - exacts [Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - hsub hMXV' hPXV' (by simp [hS]), hsub hMXV' hPYV' (by simp [hS]), - hsub hMYV' hPXV' (by simp [hS]), hsub hMYV' hPYV' (by simp [hS]), - Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] - have hkey : Submodule.span ℂ FF ≤ - Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j := by - rw [hspan] - refine (Submodule.mul_le.2 fun _ hx _ hy => - Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ - simp only [Submodule.sup_mul, Submodule.mul_sup] - repeat' apply sup_le - -- the weights `AA, BA, CA, AB, BB, CB, AC, BC, CC = 4, 2, 0, 2, 0, -2, 0, -2, -4` - exacts [hne hAle hAle (by norm_num), hne hBle hAle (by norm_num), le_sup_of_le_left hCA, - hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), - le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] - -- ### D. The weight zero part of the photon pairs - -- The seven products have weight zero and are photon pairs, which is one inclusion. For the - -- other, weight zero is disjoint from the sum of the nonzero weights by - -- `boostWeightSubmodule_iSupIndep`, and the modular law removes it from the splitting above. - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → - y ∈ boostWeightSubmodule 2 l → k + l = 0 → x * y ∈ boostWeightSubmodule 2 0 := by - intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> - exact hz (by assumption) (by assumption) (by norm_num) - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hspan, hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> - exact Submodule.mul_mem_mul (by assumption) (by assumption) - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] + have hmul : _ = _ := boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts + rw [boostProj_z_zero_map_fieldStrengthDeriv_span, + boostProj_z_two_map_fieldStrengthDeriv_span, + boostProj_z_neg_two_map_fieldStrengthDeriv_span] at hmul + have hclosed := boostProj_z_map_fieldStrengthDeriv_mul_span_le + rw [inf_boostWeightSubmodule_eq_map hclosed, hmul, Submodule.span_mul_span, + Submodule.span_mul_span, Submodule.add_eq_sup, ← Submodule.span_union] + refine Submodule.span_eq_span ?_ ?_ + · rintro x (⟨a, (rfl | rfl), b, (rfl | rfl), rfl⟩ | ⟨a, (rfl | rfl), b, (rfl | rfl), rfl⟩) <;> + exact Submodule.subset_span (by + simp [fieldStrengthDeriv_mul_comm 0 0 (Sum.inl 0) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)]) + · rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) + exacts [Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), + Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), + Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), + Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), + Submodule.subset_span (Set.mem_union_left _ (Set.mul_mem_mul (by simp) (by simp))), + Submodule.subset_span (Set.mem_union_left _ (Set.mul_mem_mul (by simp) (by simp))), + Submodule.subset_span (Set.mem_union_left _ (Set.mul_mem_mul (by simp) (by simp)))] /-- **The boost weight zero part of the photon pairs, `x`-direction.** As for the `z`-boost, with the light-cone pairs now built on the `x`-axis: `F_{0y} ∓ F_{xy}` and `F_{0z} ∓ F_{xz}` diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index 336ba7b79..1fb079b20 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.AxisBoosts public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDim +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.JetDerivLorentz /-! # Grading by boost weight @@ -1146,6 +1147,507 @@ noncomputable instance (i : Fin 3) : GradedAlgebra (boostWeightSubmodule i) wher one_mem := one_mem_boostWeightSubmodule mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy +/-! + +## K. The projection onto a boost weight + +The grading of section J writes every element as a *unique* finite sum of homogeneous ones, so it +supplies a projection onto each weight, `boostProj i k` — in particular onto boost weight zero, +where the invariants live. + +The projection is exact, for every weight and every element. What it is not is a formula in the +group action: it is defined through the decomposition, so nothing here says it preserves a +subspace merely because that subspace is carried to itself by the Lorentz action. A combination +of finitely many boosts would give that for free, but only interpolates the weight-zero +projection correctly across a bounded range of weights. + +-/ + +/-- The projection of the jet algebra onto its part of boost weight `k` along the `i`-th axis, + read off from the boost-weight decomposition. -/ +noncomputable def boostProj (i : Fin 3) (k : ℤ) : JetAlgebra →ₗ[ℂ] JetAlgebra := + (boostWeightSubmodule i k).subtype ∘ₗ + DirectSum.component ℂ ℤ (fun k => (boostWeightSubmodule i k : Submodule ℂ JetAlgebra)) k ∘ₗ + (DirectSum.decomposeLinearEquiv (boostWeightSubmodule i)).toLinearMap + +lemma boostProj_apply (i : Fin 3) (k : ℤ) (x : JetAlgebra) : + boostProj i k x = (DirectSum.decompose (boostWeightSubmodule i) x k : JetAlgebra) := rfl + +/-- The projection lands in the weight it projects onto. -/ +lemma boostProj_mem (i : Fin 3) (k : ℤ) (x : JetAlgebra) : + boostProj i k x ∈ boostWeightSubmodule i k := + (DirectSum.decompose (boostWeightSubmodule i) x k).2 + +/-- On an element of weight `k` the weight-`k` projection is the identity. -/ +@[simp] +lemma boostProj_of_mem {i : Fin 3} {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule i k) : boostProj i k x = x := + DirectSum.decompose_of_mem_same _ hx + +/-- On an element of another weight the projection vanishes. -/ +lemma boostProj_of_mem_ne {i : Fin 3} {k l : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule i l) (hlk : l ≠ k) : boostProj i k x = 0 := + DirectSum.decompose_of_mem_ne _ hx hlk + +/-- An element is of weight `k` exactly when the weight-`k` projection fixes it. -/ +lemma boostProj_eq_self_iff {i : Fin 3} {k : ℤ} {x : JetAlgebra} : + boostProj i k x = x ↔ x ∈ boostWeightSubmodule i k := + ⟨fun h => h ▸ boostProj_mem i k x, boostProj_of_mem⟩ + +/-- The projections are idempotent. -/ +@[simp] +lemma boostProj_boostProj (i : Fin 3) (k : ℤ) (x : JetAlgebra) : + boostProj i k (boostProj i k x) = boostProj i k x := + boostProj_of_mem (boostProj_mem i k x) + +/-- Distinct projections are orthogonal. -/ +lemma boostProj_boostProj_of_ne {i : Fin 3} {k l : ℤ} (hlk : l ≠ k) (x : JetAlgebra) : + boostProj i k (boostProj i l x) = 0 := + boostProj_of_mem_ne (boostProj_mem i l x) hlk + +/-- The image of the weight-`k` projection is the weight-`k` submodule. -/ +lemma range_boostProj (i : Fin 3) (k : ℤ) : + LinearMap.range (boostProj i k) = boostWeightSubmodule i k := by + refine le_antisymm (LinearMap.range_le_iff_comap.mpr (le_top.antisymm fun x _ => ?_)) fun x hx => + ⟨x, boostProj_of_mem hx⟩ + exact boostProj_mem i k x + +/-- An invariant is fixed by the weight-zero projection, along every axis. -/ +lemma boostProj_zero_of_isInvariant (i : Fin 3) {x : JetAlgebra} (hx : IsInvariant x) : + boostProj i 0 x = x := + boostProj_of_mem (mem_boostWeightSubmodule_zero_of_isInvariant hx) + +/-- An invariant has no component of nonzero weight. -/ +lemma boostProj_of_isInvariant_ne {i : Fin 3} {k : ℤ} (hk : (0 : ℤ) ≠ k) {x : JetAlgebra} + (hx : IsInvariant x) : boostProj i k x = 0 := + boostProj_of_mem_ne (mem_boostWeightSubmodule_zero_of_isInvariant hx) hk + +/-- The weight-`k` projection fixes a submodule of pure weight `k`. -/ +lemma map_boostProj_of_le {i : Fin 3} {k : ℤ} {W : Submodule ℂ JetAlgebra} + (h : W ≤ boostWeightSubmodule i k) : W.map (boostProj i k) = W := by + refine le_antisymm ?_ fun x hx => ⟨x, hx, boostProj_of_mem (h hx)⟩ + rintro _ ⟨x, hx, rfl⟩ + rw [boostProj_of_mem (h hx)] + exact hx + +/-- The weight-`k` projection annihilates a submodule of pure weight `l ≠ k`. -/ +lemma map_boostProj_of_le_ne {i : Fin 3} {k l : ℤ} {W : Submodule ℂ JetAlgebra} + (h : W ≤ boostWeightSubmodule i l) (hlk : l ≠ k) : W.map (boostProj i k) = ⊥ := by + rw [eq_bot_iff] + rintro _ ⟨x, hx, rfl⟩ + rw [boostProj_of_mem_ne (h hx) hlk] + exact zero_mem ⊥ + +/-! + +## L. The projections and the jet derivatives + +The boost-weight parts of the span of all jet derivatives of a submodule. Along the axis `i` +the four derivative directions regroup into the light-cone combinations `∂_0 ∓ ∂_i`, which +shift every boost weight by `±2`, and the two transverse derivatives, which preserve it. So +the weight-`k` part of `∑ α, ∂_α V` is exactly the light-cone derivatives of the +weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives of its weight-`k` +part. Everything rests on the covariance `repLorentzGroup_jetDeriv` of the jet derivative, +so no bosonicity assumption is needed. + +-/ + +section + +set_option linter.unusedSimpArgs false + +/-- A transverse derivative leaves the `x`-boost weight alone. -/ +private lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 0) + (hx : x ∈ boostWeightSubmodule 0 k) : + jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule 0 k := by + intro t ht + rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] + fin_cases j + · exact absurd rfl hj + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + +/-- A transverse derivative leaves the `y`-boost weight alone. -/ +private lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 1) + (hx : x ∈ boostWeightSubmodule 1 k) : + jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule 1 k := by + intro t ht + rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] + fin_cases j + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + · exact absurd rfl hj + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + +/-- A transverse derivative leaves the `z`-boost weight alone. -/ +private lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 2) + (hx : x ∈ boostWeightSubmodule 2 k) : + jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule 2 k := by + intro t ht + rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] + fin_cases j + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add] + · exact absurd rfl hj + +/-- The light-cone derivative `∂_0 - ∂_x` raises the `x`-boost weight by two. -/ +private lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule 0 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k + 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] + rw [algebraMap_real_complex, zpow_add₀ ht'] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- The light-cone derivative `∂_0 + ∂_x` lowers the `x`-boost weight by two. -/ +private lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule 0 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k - 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] + rw [algebraMap_real_complex, zpow_sub₀ ht'] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- The light-cone derivative `∂_0 - ∂_y` raises the `y`-boost weight by two. -/ +private lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule 1 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k + 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] + rw [algebraMap_real_complex, zpow_add₀ ht'] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- The light-cone derivative `∂_0 + ∂_y` lowers the `y`-boost weight by two. -/ +private lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule 1 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k - 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] + rw [algebraMap_real_complex, zpow_sub₀ ht'] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- The light-cone derivative `∂_0 - ∂_z` raises the `z`-boost weight by two. -/ +private lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule 2 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k + 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] + rw [algebraMap_real_complex, zpow_add₀ ht'] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- The light-cone derivative `∂_0 + ∂_z` lowers the `z`-boost weight by two. -/ +private lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} + (hx : x ∈ boostWeightSubmodule 2 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k - 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] + rw [algebraMap_real_complex, zpow_sub₀ ht'] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- An operator shifting every boost weight by `k - l` carries the weight-`l` component to + the weight-`k` component: the two sides agree on every homogeneous piece, and the pieces + span. -/ +private lemma boostProj_comm_aux {i : Fin 3} {D : JetAlgebra →ₗ[ℂ] JetAlgebra} (k l : ℤ) + (hD : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → + D y ∈ boostWeightSubmodule i (w + k - l)) + (x : JetAlgebra) : + boostProj i k (D x) = D (boostProj i l x) := by + have hx : x ∈ ⨆ m, boostWeightSubmodule i m := by + rw [iSup_boostWeightSubmodule_eq_top]; trivial + induction hx using Submodule.iSup_induction' with + | mem w y hyw => + have hd := hD hyw + by_cases hwl : w = l + · subst hwl + rw [show w + k - w = k from by ring] at hd + rw [boostProj_of_mem hd, boostProj_of_mem hyw] + · rw [boostProj_of_mem_ne hyw hwl, map_zero, + boostProj_of_mem_ne hd (show w + k - l ≠ k from by omega)] + | zero => simp only [map_zero] + | add y₁ y₂ _ _ ih₁ ih₂ => simp only [map_add, ih₁, ih₂] + +/-- Two composites agreeing on a submodule have the same double image. -/ +private lemma map_map_eq_of_forall_mem {f g f' g' : JetAlgebra →ₗ[ℂ] JetAlgebra} + {V : Submodule ℂ JetAlgebra} (h : ∀ x ∈ V, g (f x) = g' (f' x)) : + (V.map f).map g = (V.map f').map g' := by + refine le_antisymm ?_ ?_ + · rintro _ ⟨_, ⟨v, hv, rfl⟩, rfl⟩ + exact ⟨f' v, ⟨v, hv, rfl⟩, (h v hv).symm⟩ + · rintro _ ⟨_, ⟨v, hv, rfl⟩, rfl⟩ + exact ⟨f v, ⟨v, hv, rfl⟩, h v hv⟩ + +/-- The images under `∂_0` and `∂_i` span the same submodule as the images under the two + light-cone derivatives `∂_0 ∓ ∂_i`. -/ +private lemma map_jetDeriv_pair_eq_lightCone (i : Fin 3) (V : Submodule ℂ JetAlgebra) : + V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr i)) = + V.map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) + + V.map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) := by + rw [Submodule.add_eq_sup, Submodule.add_eq_sup] + refine le_antisymm (sup_le ?_ ?_) (sup_le ?_ ?_) + · rintro _ ⟨v, hv, rfl⟩ + rw [show jetDeriv (Sum.inl 0) v = + (2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) v + + (2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) v from by + simp only [LinearMap.sub_apply, LinearMap.add_apply]; module] + exact add_mem (Submodule.smul_mem _ _ (Submodule.mem_sup_left ⟨v, hv, rfl⟩)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right ⟨v, hv, rfl⟩)) + · rintro _ ⟨v, hv, rfl⟩ + rw [show jetDeriv (Sum.inr i) v = + (-2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) v + + (2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) v from by + simp only [LinearMap.sub_apply, LinearMap.add_apply]; module] + exact add_mem (Submodule.smul_mem _ _ (Submodule.mem_sup_left ⟨v, hv, rfl⟩)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right ⟨v, hv, rfl⟩)) + · rintro _ ⟨v, hv, rfl⟩ + rw [LinearMap.sub_apply] + exact sub_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) + (Submodule.mem_sup_right ⟨v, hv, rfl⟩) + · rintro _ ⟨v, hv, rfl⟩ + rw [LinearMap.add_apply] + exact add_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) + (Submodule.mem_sup_right ⟨v, hv, rfl⟩) + +/-- The engine behind the three axis lemmas: given the weight shifts of the two light-cone + derivatives and the weight preservation of the two transverse ones, the projection of the + four derivative images redistributes onto the shifted projections of `V`. -/ +private lemma boostProj_map_submodule_aux {i t₁ t₂ : Fin 3} (k : ℤ) + (V : Submodule ℂ JetAlgebra) + (hpos : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → + jetDeriv (Sum.inl 0) y - jetDeriv (Sum.inr i) y ∈ boostWeightSubmodule i (w + 2)) + (hneg : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → + jetDeriv (Sum.inl 0) y + jetDeriv (Sum.inr i) y ∈ boostWeightSubmodule i (w - 2)) + (ht₁ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → + jetDeriv (Sum.inr t₁) y ∈ boostWeightSubmodule i w) + (ht₂ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → + jetDeriv (Sum.inr t₂) y ∈ boostWeightSubmodule i w) : + (V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr i)) + + V.map (jetDeriv (Sum.inr t₁)) + V.map (jetDeriv (Sum.inr t₂))).map (boostProj i k) = + (V.map (boostProj i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) + + (V.map (boostProj i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) + + (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₁)) + + (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₂)) := by + have hlcp : (V.map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i))).map (boostProj i k) = + (V.map (boostProj i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine boostProj_comm_aux k (k - 2) (fun {w} {y} hyw => ?_) v + rw [show w + k - (k - 2) = w + 2 from by ring] + simp only [LinearMap.sub_apply] + exact hpos hyw + have hlcn : (V.map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i))).map (boostProj i k) = + (V.map (boostProj i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine boostProj_comm_aux k (k + 2) (fun {w} {y} hyw => ?_) v + rw [show w + k - (k + 2) = w - 2 from by ring] + simp only [LinearMap.add_apply] + exact hneg hyw + have hd₁ : (V.map (jetDeriv (Sum.inr t₁))).map (boostProj i k) = + (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₁)) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine boostProj_comm_aux k k (fun {w} {y} hyw => ?_) v + rw [show w + k - k = w from by ring] + exact ht₁ hyw + have hd₂ : (V.map (jetDeriv (Sum.inr t₂))).map (boostProj i k) = + (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₂)) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine boostProj_comm_aux k k (fun {w} {y} hyw => ?_) v + rw [show w + k - k = w from by ring] + exact ht₂ hyw + rw [map_jetDeriv_pair_eq_lightCone] + simp only [Submodule.add_eq_sup, Submodule.map_sup, hlcp, hlcn, hd₁, hd₂] + +end + +/-- **The `x`-boost projections of the derivative span.** The weight-`k` part of the span of + all jet derivatives of `V` is spanned by the light-cone derivatives `∂_0 ∓ ∂_x` of the + weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_y`, `∂_z` of its + weight-`k` part. -/ +lemma boostProj_map_submodule_jetDeriv_x (k : ℤ) (V : Submodule ℂ JetAlgebra) : + (∑ α, V.map (jetDeriv α)).map (boostProj 0 k) = + (V.map (boostProj 0 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 0)) + + (V.map (boostProj 0 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 0)) + + (V.map (boostProj 0 k)).map (jetDeriv (Sum.inr 1)) + + (V.map (boostProj 0 k)).map (jetDeriv (Sum.inr 2)) := by + rw [show (∑ α, V.map (jetDeriv α)) = + V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 0)) + + V.map (jetDeriv (Sum.inr 1)) + V.map (jetDeriv (Sum.inr 2)) from by + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] + exact boostProj_map_submodule_aux k V + (fun hyw => jetDeriv_lightConeX_pos_mem hyw) + (fun hyw => jetDeriv_lightConeX_neg_mem hyw) + (fun hyw => jetDeriv_transverseX_mem (by decide) hyw) + (fun hyw => jetDeriv_transverseX_mem (by decide) hyw) + +/-- **The `y`-boost projections of the derivative span.** The weight-`k` part of the span of + all jet derivatives of `V` is spanned by the light-cone derivatives `∂_0 ∓ ∂_y` of the + weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_x`, `∂_z` of its + weight-`k` part. -/ +lemma boostProj_map_submodule_jetDeriv_y (k : ℤ) (V : Submodule ℂ JetAlgebra) : + (∑ α, V.map (jetDeriv α)).map (boostProj 1 k) = + (V.map (boostProj 1 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 1)) + + (V.map (boostProj 1 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 1)) + + (V.map (boostProj 1 k)).map (jetDeriv (Sum.inr 0)) + + (V.map (boostProj 1 k)).map (jetDeriv (Sum.inr 2)) := by + rw [show (∑ α, V.map (jetDeriv α)) = + V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 1)) + + V.map (jetDeriv (Sum.inr 0)) + V.map (jetDeriv (Sum.inr 2)) from by + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] + exact boostProj_map_submodule_aux k V + (fun hyw => jetDeriv_lightConeY_pos_mem hyw) + (fun hyw => jetDeriv_lightConeY_neg_mem hyw) + (fun hyw => jetDeriv_transverseY_mem (by decide) hyw) + (fun hyw => jetDeriv_transverseY_mem (by decide) hyw) + +/-- **The `z`-boost projections of the derivative span.** The weight-`k` part of the span of + all jet derivatives of `V` is spanned by the light-cone derivatives `∂_0 ∓ ∂_z` of the + weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_x`, `∂_y` of its + weight-`k` part. -/ +lemma boostProj_map_submodule_jetDeriv_z (k : ℤ) (V : Submodule ℂ JetAlgebra) : + (∑ α, V.map (jetDeriv α)).map (boostProj 2 k) = + (V.map (boostProj 2 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + + (V.map (boostProj 2 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + + (V.map (boostProj 2 k)).map (jetDeriv (Sum.inr 0)) + + (V.map (boostProj 2 k)).map (jetDeriv (Sum.inr 1)) := by + rw [show (∑ α, V.map (jetDeriv α)) = + V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 2)) + + V.map (jetDeriv (Sum.inr 0)) + V.map (jetDeriv (Sum.inr 1)) from by + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] + exact boostProj_map_submodule_aux k V + (fun hyw => jetDeriv_lightConeZ_pos_mem hyw) + (fun hyw => jetDeriv_lightConeZ_neg_mem hyw) + (fun hyw => jetDeriv_transverseZ_mem (by decide) hyw) + (fun hyw => jetDeriv_transverseZ_mem (by decide) hyw) + +/-! + +## The multiplication of submodules + +-/ + +/-- The submodule image of `boostProj i k` is unchanged by projecting again. -/ +lemma map_boostProj_idem (i : Fin 3) (k : ℤ) (X : Submodule ℂ JetAlgebra) : + (X.map (boostProj i k)).map (boostProj i k) = X.map (boostProj i k) := + map_boostProj_of_le (by rintro _ ⟨y, _, rfl⟩; exact boostProj_mem i k y) + +/-- The weight-`k` part of a projection-closed submodule is its `boostProj` image. -/ +lemma inf_boostWeightSubmodule_eq_map {i : Fin 3} {k : ℤ} {X : Submodule ℂ JetAlgebra} + (h : X.map (boostProj i k) ≤ X) : + boostWeightSubmodule i k ⊓ X = X.map (boostProj i k) := by + refine le_antisymm (fun x hx => ⟨x, hx.2, boostProj_of_mem hx.1⟩) (le_inf ?_ h) + rintro _ ⟨y, _, rfl⟩ + exact boostProj_mem i k y + +/-- A submodule product with a bosonic left factor commutes. -/ +lemma mul_comm_of_le_bosonic {A B : Submodule ℂ JetAlgebra} (hA : A ≤ bosonic) : + A * B = B * A := by + refine le_antisymm (Submodule.mul_le.2 fun a ha b hb => ?_) + (Submodule.mul_le.2 fun b hb a ha => ?_) + · rw [mul_comm_of_mem_bosonic (hA ha)] + exact Submodule.mul_mem_mul hb ha + · rw [← mul_comm_of_mem_bosonic (hA ha)] + exact Submodule.mul_mem_mul ha hb + +/-- An integer-indexed supremum of submodules supported on the weights `0`, `2`, `-2` + collapses to the three corresponding terms. -/ +lemma iSup_eq_sup_zero_two_neg_two (f : ℤ → Submodule ℂ JetAlgebra) + (hf : ∀ l : ℤ, l ≠ 0 → l ≠ 2 → l ≠ -2 → f l = ⊥) : + (⨆ l, f l) = f 0 ⊔ f 2 ⊔ f (-2) := by + refine le_antisymm (iSup_le fun l => ?_) + (sup_le (sup_le (le_iSup f 0) (le_iSup f 2)) (le_iSup f (-2))) + by_cases h0 : l = 0 + · subst h0; exact le_sup_left.trans le_sup_left + by_cases h2 : l = 2 + · subst h2; exact le_sup_right.trans le_sup_left + by_cases hn2 : l = -2 + · subst hn2; exact le_sup_right + · rw [hf l h0 h2 hn2]; exact bot_le + +/-- The weight-`k` part of a product of submodules is bounded by the products of the weight + parts pairing to `k`: the projection of `v * w` is the sum of the products of the components + of `v` and `w` whose weights add to `k`. This is an inequality only — the individual + products of components need not come from `V * W` itself. -/ +lemma boostProj_map_mul_submodule_le {i : Fin 3} (k : ℤ) (V W : Submodule ℂ JetAlgebra) : + (V * W).map (boostProj i k) ≤ + ⨆ (l : ℤ), (V.map (boostProj i l)) * (W.map (boostProj i (k - l))) := by + classical + rw [Submodule.map_le_iff_le_comap] + refine Submodule.mul_le.2 fun v hv w hw => ?_ + rw [Submodule.mem_comap, boostProj_apply, DirectSum.decompose_mul, DirectSum.coe_mul_apply] + refine sum_mem fun ij hij => ?_ + have hk : k - ij.1 = ij.2 := by + have := (Finset.mem_filter.1 hij).2 + omega + refine Submodule.mem_iSup_of_mem ij.1 ?_ + rw [hk] + exact Submodule.mul_mem_mul ⟨v, hv, rfl⟩ ⟨w, hw, rfl⟩ + +/-- For submodules closed under the weight projections the bound of + `boostProj_map_mul_submodule_le` is an equality: each product of components has pure weight + `k` and lies in `V * W`, so it is its own projection. -/ +lemma boostProj_map_mul_submodule {i : Fin 3} (k : ℤ) {V W : Submodule ℂ JetAlgebra} + (hV : ∀ l : ℤ, V.map (boostProj i l) ≤ V) (hW : ∀ l : ℤ, W.map (boostProj i l) ≤ W) : + (V * W).map (boostProj i k) = + ⨆ (l : ℤ), (V.map (boostProj i l)) * (W.map (boostProj i (k - l))) := by + refine le_antisymm (boostProj_map_mul_submodule_le k V W) (iSup_le fun l => ?_) + refine Submodule.mul_le.2 fun v' hv' w' hw' => ?_ + refine ⟨v' * w', Submodule.mul_mem_mul (hV l hv') (hW (k - l) hw'), ?_⟩ + obtain ⟨v, hv, rfl⟩ := hv' + obtain ⟨w, hw, rfl⟩ := hw' + exact boostProj_of_mem (mul_mem_boostWeightSubmodule' (boostProj_mem i l v) + (boostProj_mem i (k - l) w) (by ring)) + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean index 24211436f..c619fdb83 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean @@ -88,6 +88,16 @@ lemma jetDeriv_mem_bosonic (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} (hx : x ∈ b refine mem_bosonic.2 ⟨LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p, ?_⟩ rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero] +/-- Bosonic elements are central in the jet algebra: the bosonic factor is commutative, and + it commutes with the lepton factor across the tensor product. -/ +lemma mul_comm_of_mem_bosonic {x : JetAlgebra} (hx : x ∈ bosonic) (y : JetAlgebra) : + x * y = y * x := by + obtain ⟨p, rfl⟩ := mem_bosonic.1 hx + induction y using JetAlgebra.induction_on with + | zero => rw [mul_zero, zero_mul] + | add u v hu hv => rw [mul_add, add_mul, hu, hv] + | tmul b l => rw [tmul_mul_tmul, tmul_mul_tmul, mul_one, one_mul, mul_comm p b] + /-- The covariance of the jet derivative on the bosonic part. -/ lemma repLorentzGroup_jetDeriv_of_mem_bosonic (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} (hx : x ∈ bosonic) : @@ -97,6 +107,27 @@ lemma repLorentzGroup_jetDeriv_of_mem_bosonic (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ F obtain ⟨p, rfl⟩ := mem_bosonic.1 hx exact repLorentzGroup_jetDeriv_tmul_one Λ μ p +set_option maxHeartbeats 4000000 in +/-- **The jet derivative on the lepton–gauge-sector jet algebra is a Lorentz vector.** The + covariance of `repLorentzGroup_jetDeriv_of_mem_bosonic`, extended to the whole jet algebra + by combining the covariance on the two tensor factors through the Leibniz rule. -/ +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + repLorentzGroup Λ (jetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup Λ x) := by + induction x using JetAlgebra.induction_on with + | zero => simp + | add u v hu hv => + rw [map_add, map_add, map_add, hu, hv, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul p l => + rw [jetDeriv_tmul, map_add, repLorentzGroup_tmul, repLorentzGroup_tmul, + repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_baseChange_jetDeriv, + LeptonSinglet.JetAlgebra.repLorentzGroup_jetDeriv, sum_tmul, tmul_sum, + ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [jetDeriv_tmul, smul_add, smul_tmul', tmul_smul] + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean index 8dca259b2..0c762f470 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.JetDeriv /-! # The Lorentz action on the charged-lepton jet algebra @@ -125,6 +126,35 @@ noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : map_mul' := repLorentzGroup_apply_mul Λ commutes' r := by simp [repLorentzGroup_apply] +set_option maxHeartbeats 4000000 in +/-- **The jet derivative on the charged-lepton jet algebra is a Lorentz vector.** -/ +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + repLorentzGroup Λ (jetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup Λ x) := by + have hι : ∀ v : JetComponentSpace, repLorentzGroup Λ (ExteriorAlgebra.ι ℂ v) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.repLorentzGroup Λ v) := fun v => by + rw [repLorentzGroup_apply, ExteriorAlgebra.map_apply_ι] + induction x using ExteriorAlgebra.induction with + | algebraMap r => + have h1 : jetDeriv μ (algebraMap ℂ JetAlgebra r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] + rw [h1, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, hι, hι, JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + end JetAlgebra end LeptonSinglet diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean index 82d9f47fc..addede9cc 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean @@ -550,6 +550,113 @@ lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (v : JetComponen grind exact DFunLike.congr_fun h v +/-- The total derivative acts on each factor of the component space as multiplication by the + derivative symbol `∂_μ` on the dual jet algebra, leaving the spinor factor alone. -/ +lemma JetComponentSpace.jetDeriv_eq_prodMap (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace.jetDeriv μ = + LinearMap.prodMap + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id) + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id) := by + refine JetComponentSpace.basis.ext fun j => ?_ + match j with + | .dψ s α => + rw [JetComponentSpace.jetDeriv_basis] + show JetComponentSpace.basis (.dψ (s + {μ}) α) = _ + rw [JetComponentSpace.basis_dψ, JetComponentSpace.basis_dψ] + refine Prod.ext ?_ ?_ + · simp only [LinearMap.prodMap_apply, TensorProduct.map_tmul, LinearMap.mulRight_apply, + LinearMap.id_apply, DerivAlgebraComplex.basis_mul] + · simp only [LinearMap.prodMap_apply, map_zero] + | .dbarψ s α => + rw [JetComponentSpace.jetDeriv_basis] + show JetComponentSpace.basis (.dbarψ (s + {μ}) α) = _ + rw [JetComponentSpace.basis_dbarψ, JetComponentSpace.basis_dbarψ] + refine Prod.ext ?_ ?_ + · simp only [LinearMap.prodMap_apply, map_zero] + · simp only [LinearMap.prodMap_apply, TensorProduct.map_tmul, LinearMap.mulRight_apply, + LinearMap.id_apply, DerivAlgebraComplex.basis_mul] + +lemma JetComponentSpace.jetDeriv_fst (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + (JetComponentSpace.jetDeriv μ v).1 = + TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id v.1 := by + rw [JetComponentSpace.jetDeriv_eq_prodMap]; rfl + +lemma JetComponentSpace.jetDeriv_snd (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : + (JetComponentSpace.jetDeriv μ v).2 = + TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id v.2 := by + rw [JetComponentSpace.jetDeriv_eq_prodMap]; rfl + +lemma JetComponentSpace.repLorentzGroup_fst (Λ : SL(2,ℂ)) (v : JetComponentSpace) : + (JetComponentSpace.repLorentzGroup Λ v).1 = + (DerivAlgebraComplex.repLorentzGroup.tprod LeptonSinglet.repLorentzGroup.dual) Λ v.1 := + rfl + +lemma JetComponentSpace.repLorentzGroup_snd (Λ : SL(2,ℂ)) (v : JetComponentSpace) : + (JetComponentSpace.repLorentzGroup Λ v).2 = + (DerivAlgebraComplex.repLorentzGroup.tprod + LeptonSinglet.repLorentzGroup.conj.dual) Λ v.2 := + rfl + +/-- The covariance of the derivative-symbol multiplication on one tensor factor of the + component space, for an arbitrary representation on the other factor. -/ +private lemma repLorentzGroup_tprod_mulRight_jetSymbol {W : Type*} [AddCommGroup W] + [Module ℂ W] (ρ : Representation ℂ SL(2,ℂ) W) (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (w : DerivAlgebraComplex ⊗[ℂ] W) : + (DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id w) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({a} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id ((DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ w) := by + have hsym : DerivAlgebraComplex.repLorentzGroup Λ + (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + DerivAlgebraComplex.basis ({a} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [DerivAlgebraComplex.basis_singleton, DerivAlgebraComplex.repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, DerivAlgebraComplex.basis_singleton] + have hrep : ∀ (q : DerivAlgebraComplex) (f : W), + (DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ (q ⊗ₜ[ℂ] f) = + (DerivAlgebraComplex.repLorentzGroup Λ q) ⊗ₜ[ℂ] (ρ Λ f) := fun _ _ => rfl + induction w using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul q f => + rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, hrep, hrep, + DerivAlgebraComplex.repLorentzGroup_apply_mul, hsym, Finset.mul_sum, + TensorProduct.sum_tmul] + exact Finset.sum_congr rfl fun a _ => by + rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, + mul_smul_comm, TensorProduct.smul_tmul'] + +/-- **The shift is Lorentz covariant on the component space.** Appending `∂_μ` and then acting + is acting and then appending the transformed `∂_μ`, which is a combination of the `∂_a`. -/ +lemma JetComponentSpace.repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.jetDeriv μ v) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + JetComponentSpace.jetDeriv a (JetComponentSpace.repLorentzGroup Λ v) := by + refine Prod.ext ?_ ?_ + · simp only [Prod.fst_sum, Prod.smul_fst, JetComponentSpace.repLorentzGroup_fst, + JetComponentSpace.jetDeriv_fst] + exact repLorentzGroup_tprod_mulRight_jetSymbol _ Λ μ v.1 + · simp only [Prod.snd_sum, Prod.smul_snd, JetComponentSpace.repLorentzGroup_snd, + JetComponentSpace.jetDeriv_snd] + exact repLorentzGroup_tprod_mulRight_jetSymbol _ Λ μ v.2 + /-! ## C. The mass-weight scaling on the component functions From 52cd823584f547c3fedf316a014580509e25d1f5 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:58:26 +0100 Subject: [PATCH 133/254] feat: Clean up boost weight Co-Authored-By: Claude --- Physlib.lean | 2 + .../JetAlgebra/Boosts/FieldStrength.lean | 66 +- .../FermionicBarKineticTerm/BoostWeight.lean | 98 +- .../FermionicKineticTerm/BoostWeight.lean | 98 +- .../GaugeDoubleDeriv/BoostWeight.lean | 210 ++-- .../GaugeKineticTerm/BoostWeight.lean | 80 +- .../JetAlgebra/Grading/BoostWeight.lean | 920 ++---------------- .../LorentzGroup/Boosts/Axis.lean} | 128 ++- .../LorentzGroup/Boosts/WeightGrading.lean | 691 +++++++++++++ 9 files changed, 1167 insertions(+), 1126 deletions(-) rename Physlib/{Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean => Relativity/LorentzGroup/Boosts/Axis.lean} (67%) create mode 100644 Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean diff --git a/Physlib.lean b/Physlib.lean index 279adf61a..2a558526d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -375,6 +375,8 @@ public import Physlib.Relativity.LorentzAlgebra.Basis public import Physlib.Relativity.LorentzAlgebra.ExponentialMap public import Physlib.Relativity.LorentzGroup.Basic public import Physlib.Relativity.LorentzGroup.Boosts.Apply +public import Physlib.Relativity.LorentzGroup.Boosts.Axis +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Relativity.LorentzGroup.Boosts.Basic public import Physlib.Relativity.LorentzGroup.Boosts.Generalized public import Physlib.Relativity.LorentzGroup.FermionicParity diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean index 39c2422bd..45473939f 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean @@ -15,7 +15,7 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTer @[expose] public section namespace LeptonGaugeSector -open TensorProduct StandardModel +open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix Pointwise open Matrix MatrixGroups @@ -47,7 +47,7 @@ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : /-- The light-cone combination `F_{0y} - F_{zy}` has boost weight `2`. -/ lemma fieldStrengthDeriv_lightCone_y_mem_two : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ boostWeightSubmodule 2 2 := by + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by intro t ht simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -62,7 +62,7 @@ lemma fieldStrengthDeriv_lightCone_y_mem_two : /-- The light-cone combination `F_{0y} + F_{zy}` has boost weight `-2`. -/ lemma fieldStrengthDeriv_lightCone_y_mem_neg_two : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ boostWeightSubmodule 2 (-2) := by + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by intro t ht simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -77,7 +77,7 @@ lemma fieldStrengthDeriv_lightCone_y_mem_neg_two : /-- The component along the boost, `F_{0z}`, has boost weight zero: the boost acts on the two indices by inverse scalings, which cancel. -/ lemma fieldStrengthDeriv_longitudinal_mem_zero : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) ∈ boostWeightSubmodule 2 0 := by + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by intro t ht simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -169,7 +169,7 @@ lemma fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z : /-- The longitudinal and transverse components span a subspace of `z`-boost weight zero. -/ lemma fieldStrengthDeriv_span_pair_zero_le : Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} ≤ boostWeightSubmodule 2 0 := + fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := Submodule.span_le.2 (by rintro _ (rfl | rfl) exacts [fieldStrengthDeriv_longitudinal_mem_zero, fieldStrengthDeriv_transverse_mem_zero]) @@ -179,7 +179,7 @@ lemma fieldStrengthDeriv_span_pair_two_le : Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ boostWeightSubmodule 2 2 := + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := Submodule.span_le.2 (by rintro _ (rfl | rfl) exacts [fieldStrengthDeriv_lightCone_y_mem_two, fieldStrengthDeriv_lightCone_mem_two]) @@ -189,55 +189,55 @@ lemma fieldStrengthDeriv_span_pair_neg_two_le : Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ boostWeightSubmodule 2 (-2) := + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := Submodule.span_le.2 (by rintro _ (rfl | rfl) exacts [fieldStrengthDeriv_lightCone_y_mem_neg_two, fieldStrengthDeriv_lightCone_mem_neg_two]) lemma boostProj_z_zero_map_fieldStrengthDeriv_span : - Submodule.map (boostProj 2 0) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = + Submodule.map (BoostWeight.boostProj repLorentzGroup 2 0) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} := by rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - map_boostProj_of_le fieldStrengthDeriv_span_pair_zero_le, - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_two_le (by decide), - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_neg_two_le (by decide), + BoostWeight.map_boostProj_of_le repLorentzGroup fieldStrengthDeriv_span_pair_zero_le, + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_two_le (by decide), + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le (by decide), sup_bot_eq, sup_bot_eq] lemma boostProj_z_two_map_fieldStrengthDeriv_span : - Submodule.map (boostProj 2 2) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = + Submodule.map (BoostWeight.boostProj repLorentzGroup 2 2) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_zero_le (by decide), - map_boostProj_of_le fieldStrengthDeriv_span_pair_two_le, - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_neg_two_le (by decide), + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_zero_le (by decide), + BoostWeight.map_boostProj_of_le repLorentzGroup fieldStrengthDeriv_span_pair_two_le, + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le (by decide), bot_sup_eq, sup_bot_eq] lemma boostProj_z_neg_two_map_fieldStrengthDeriv_span : - Submodule.map (boostProj 2 (-2)) + Submodule.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_zero_le (by decide), - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_two_le (by decide), - map_boostProj_of_le fieldStrengthDeriv_span_pair_neg_two_le, + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_zero_le (by decide), + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_two_le (by decide), + BoostWeight.map_boostProj_of_le repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le, sup_bot_eq, bot_sup_eq] /-- Away from the weights `0`, `±2` the projection of the field-strength span vanishes. -/ lemma boostProj_z_map_fieldStrengthDeriv_span_of_ne (k : ℤ) (h0 : k ≠ 0) (h2 : k ≠ 2) (hn2 : k ≠ -2) : - Submodule.map (boostProj 2 k) + Submodule.map (BoostWeight.boostProj repLorentzGroup 2 k) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = ⊥ := by rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_zero_le (Ne.symm h0), - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_two_le (Ne.symm h2), - map_boostProj_of_le_ne fieldStrengthDeriv_span_pair_neg_two_le (Ne.symm hn2), + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_zero_le (Ne.symm h0), + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_two_le (Ne.symm h2), + BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le (Ne.symm hn2), sup_bot_eq, sup_bot_eq] /-! @@ -268,7 +268,7 @@ TODO "Generalize the below result for any axis" /-- Every weight projection of the field-strength span stays inside the span. -/ lemma boostProj_z_map_fieldStrengthDeriv_span_le (l : ℤ) : - (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (boostProj 2 l) ≤ + (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (BoostWeight.boostProj repLorentzGroup 2 l) ≤ Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} := by have hd : Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} = _ ⊔ _ ⊔ _ := fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z @@ -291,30 +291,30 @@ lemma boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts : let V0 := Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} let V2 := (Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) - V2.map (boostProj 2 0) = V0.map (boostProj 2 0) * V0.map (boostProj 2 0) - + V0.map (boostProj 2 2) * V0.map (boostProj 2 (-2)) := by + V2.map (BoostWeight.boostProj repLorentzGroup 2 0) = V0.map (BoostWeight.boostProj repLorentzGroup 2 0) * V0.map (BoostWeight.boostProj repLorentzGroup 2 0) + + V0.map (BoostWeight.boostProj repLorentzGroup 2 2) * V0.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) := by intro V0 V2 - have hcl : ∀ l : ℤ, V0.map (boostProj 2 l) ≤ V0 := + have hcl : ∀ l : ℤ, V0.map (BoostWeight.boostProj repLorentzGroup 2 l) ≤ V0 := boostProj_z_map_fieldStrengthDeriv_span_le have hbot : ∀ l : ℤ, l ≠ 0 → l ≠ 2 → l ≠ -2 → - V0.map (boostProj 2 l) * V0.map (boostProj 2 (0 - l)) = ⊥ := by + V0.map (BoostWeight.boostProj repLorentzGroup 2 l) * V0.map (BoostWeight.boostProj repLorentzGroup 2 (0 - l)) = ⊥ := by intro l h0 h2 hn2 - rw [show V0.map (boostProj 2 l) = ⊥ from + rw [show V0.map (BoostWeight.boostProj repLorentzGroup 2 l) = ⊥ from boostProj_z_map_fieldStrengthDeriv_span_of_ne l h0 h2 hn2, Submodule.bot_mul] - have hbos : V0.map (boostProj 2 (-2)) ≤ bosonic := by - rw [show V0.map (boostProj 2 (-2)) = _ from boostProj_z_neg_two_map_fieldStrengthDeriv_span] + have hbos : V0.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) ≤ bosonic := by + rw [show V0.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) = _ from boostProj_z_neg_two_map_fieldStrengthDeriv_span] refine Submodule.span_le.2 ?_ rintro _ (rfl | rfl) <;> exact add_mem (fieldStrengthDeriv_mem_bosonic _ _ _) (fieldStrengthDeriv_mem_bosonic _ _ _) have hV2 : V2 = V0 * V0 := fieldStrengthDeriv_mul_span_eq_mul_span - rw [hV2, boostProj_map_mul_submodule 0 hcl hcl, iSup_eq_sup_zero_two_neg_two _ hbot] + rw [hV2, BoostWeight.boostProj_map_mul repLorentzGroup 0 hcl hcl, BoostWeight.iSup_eq_sup_zero_two_neg_two repLorentzGroup _ hbot] simp only [sub_self, zero_sub, neg_neg] rw [Submodule.add_eq_sup, mul_comm_of_le_bosonic hbos, sup_assoc, sup_idem] /-- The weight-zero projection keeps the photon-pair span inside itself. -/ lemma boostProj_z_map_fieldStrengthDeriv_mul_span_le : (Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * - fieldStrengthDeriv {} μ' ν'}).map (boostProj 2 0) ≤ + fieldStrengthDeriv {} μ' ν'}).map (BoostWeight.boostProj repLorentzGroup 2 0) ≤ Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by have hmul : _ = _ := boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean index 53467419f..409982dba 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean @@ -25,7 +25,7 @@ set_option linter.unusedTactic false set_option linter.unnecessarySeqFocus false namespace LeptonGaugeSector -open TensorProduct StandardModel +open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix Pointwise open Matrix MatrixGroups @@ -43,7 +43,7 @@ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : The six spanning elements are chosen with the later restriction by the boost weights in the `x`- and `y`-directions in mind: they pair into a `∂_0/∂_z` block and `∂_x` and `∂_y` blocks. -/ theorem boostWeight_inter_fermionic_bar_kinetic_term : - boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = Submodule.span ℂ {(Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inr 2] 0) * Dψ [] 0 + @@ -70,14 +70,14 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term : set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF set S : Set JetAlgebra := {P0 * C0 + M1 * C1, P0 * C0 - M1 * C1, X1 * C0 + X0 * C1, X1 * C0 - X0 * C1, Y1 * C0 + Y0 * C1, Y1 * C0 - Y0 * C1} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j with hW - have hC0w : C0 ∈ boostWeightSubmodule 2 (-1) := Dψ_nil_zero_mem_neg_one - have hC1w : C1 ∈ boostWeightSubmodule 2 1 := Dψ_nil_one_mem_one + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 2 j with hW + have hC0w : C0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := Dψ_nil_zero_mem_neg_one + have hC1w : C1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := Dψ_nil_one_mem_one obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : - P0 ∈ boostWeightSubmodule 2 1 ∧ P1 ∈ boostWeightSubmodule 2 3 ∧ - M0 ∈ boostWeightSubmodule 2 (-3) ∧ M1 ∈ boostWeightSubmodule 2 (-1) ∧ - X0 ∈ boostWeightSubmodule 2 (-1) ∧ X1 ∈ boostWeightSubmodule 2 1 ∧ - Y0 ∈ boostWeightSubmodule 2 (-1) ∧ Y1 ∈ boostWeightSubmodule 2 1 := by + P0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 3 ∧ + M0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-3) ∧ M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ + X0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ X1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ + Y0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ Y1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -107,10 +107,10 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term : obtain ⟨kx0, kx1⟩ : X1 * C0 ∈ W ∧ X0 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) obtain ⟨ky0, ky1⟩ : Y1 * C0 ∈ W ∧ Y0 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → - y ∈ boostWeightSubmodule 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) have k2 : M0 * C0 ∈ W := hm hM0w hC0w (by norm_num) have k3 : P0 * C1 ∈ W := hm hP0w hC1w (by norm_num) have k4 : M0 * C1 ∈ W := hm hM0w hC1w (by norm_num) @@ -144,11 +144,11 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term : | 1, Sum.inr 1, 0 => exact ky0 | 1, Sum.inr 1, 1 => exact hm hY1w hC1w (by norm_num) -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → - y ∈ boostWeightSubmodule 2 l → k + l = 0 → x * y ∈ boostWeightSubmodule 2 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl) @@ -168,14 +168,14 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term : repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 2) 0).symm, sup_bot_eq] /-- **The boost weight zero part of the conjugate fermion kinetic bilinears, `x`-direction.** The `x`-boost is not diagonal on the coordinate spinors, so the eigenvectors are the combinations `ψ_0 ± ψ_1` of weight `∓1`, and likewise on the spinor index of `D̄_μ ψ̄_α`; the light-cone derivative combinations are `∂_0 ∓ ∂_x`, and `∂_y`, `∂_z` are the transverse directions. -/ theorem boostWeight_inter_fermionic_bar_kinetic_term_x : - boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = Submodule.span ℂ {(Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 - @@ -212,13 +212,13 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_x : set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF set S : Set JetAlgebra := {P * Cp + M * Cm, P * Cp - M * Cm, T0m * Cp + T0p * Cm, T0m * Cp - T0p * Cm, T1m * Cp + T1p * Cm, T1m * Cp - T1p * Cm} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j with hW + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j with hW obtain ⟨hCpw, hCmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Cp ∈ boostWeightSubmodule 0 (-1) ∧ Cm ∈ boostWeightSubmodule 0 1 ∧ - P ∈ boostWeightSubmodule 0 1 ∧ Q ∈ boostWeightSubmodule 0 3 ∧ - N ∈ boostWeightSubmodule 0 (-3) ∧ M ∈ boostWeightSubmodule 0 (-1) ∧ - T0p ∈ boostWeightSubmodule 0 (-1) ∧ T0m ∈ boostWeightSubmodule 0 1 ∧ - T1p ∈ boostWeightSubmodule 0 (-1) ∧ T1m ∈ boostWeightSubmodule 0 1 := by + Cp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ Cm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ + P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 3 ∧ + N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ + T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ + T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -249,10 +249,10 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_x : obtain ⟨kx0, kx1⟩ : T0m * Cp ∈ W ∧ T0p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) obtain ⟨ky0, ky1⟩ : T1m * Cp ∈ W ∧ T1p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → - y ∈ boostWeightSubmodule 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) have hbil : ∀ x ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), ∀ y ∈ Submodule.span ℂ ({Cp, Cm} : Set JetAlgebra), x * y ∈ W := by intro x hx @@ -314,11 +314,11 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_x : | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hCp, hCm]; module⟩ | 1 => exact ⟨2⁻¹, -2⁻¹, by rw [hCp, hCm]; module⟩ -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → - y ∈ boostWeightSubmodule 0 l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl) @@ -343,14 +343,14 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_x : | apply neg_mem refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] /-- **The boost weight zero part of the conjugate fermion kinetic bilinears, `y`-direction.** As for the `x`-boost, but the rotated spinor combinations now carry a factor of `i`. The conjugate lepton transforms by `Λ⁻¹` and the lepton by its conjugate, so the two factors take opposite signs of `i`: `ψ̄_0 ∓ i ψ̄_1` and `ψ_0 ± i ψ_1` have weight `∓1`. -/ theorem boostWeight_inter_fermionic_bar_kinetic_term_y : - boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = Submodule.span ℂ {(Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 - @@ -399,13 +399,13 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_y : set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF set S : Set JetAlgebra := {P * Cp + M * Cm, P * Cp - M * Cm, T0m * Cp + T0p * Cm, T0m * Cp - T0p * Cm, T1m * Cp + T1p * Cm, T1m * Cp - T1p * Cm} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j with hW + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j with hW obtain ⟨hCpw, hCmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Cp ∈ boostWeightSubmodule 1 (-1) ∧ Cm ∈ boostWeightSubmodule 1 1 ∧ - P ∈ boostWeightSubmodule 1 1 ∧ Q ∈ boostWeightSubmodule 1 3 ∧ - N ∈ boostWeightSubmodule 1 (-3) ∧ M ∈ boostWeightSubmodule 1 (-1) ∧ - T0p ∈ boostWeightSubmodule 1 (-1) ∧ T0m ∈ boostWeightSubmodule 1 1 ∧ - T1p ∈ boostWeightSubmodule 1 (-1) ∧ T1m ∈ boostWeightSubmodule 1 1 := by + Cp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ Cm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ + P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 3 ∧ + N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ + T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ + T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -437,10 +437,10 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_y : obtain ⟨kx0, kx1⟩ : T0m * Cp ∈ W ∧ T0p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) obtain ⟨ky0, ky1⟩ : T1m * Cp ∈ W ∧ T1p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → - y ∈ boostWeightSubmodule 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) have hbil : ∀ x ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), ∀ y ∈ Submodule.span ℂ ({Cp, Cm} : Set JetAlgebra), x * y ∈ W := by intro x hx @@ -522,11 +522,11 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_y : match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> (try ring_nf)⟩ -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → - y ∈ boostWeightSubmodule 1 l → k + l = 0 → x * y ∈ boostWeightSubmodule 1 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl) @@ -552,7 +552,7 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_y : | exact hFm _ _ _ refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] /-- **The conjugate fermion kinetic term is the only conjugate bilinear of boost weight zero in every direction.** An element of the span of the products `(D̄_μ ψ̄)_α ψ_β` has boost weight @@ -565,8 +565,8 @@ theorem boostWeight_inter_fermionic_bar_kinetic_term_y : the six coefficients `a₁, …, a₆`, and five functionals, each a combination of two of the duals `fermionBarDual` chosen to annihilate the `x`- or the `y`-axis span, cut them down to one. -/ lemma boostWeight_inter_fermionic_bar_kinetic_term_full : - boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ - boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ + BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = Submodule.span ℂ {fermionKineticTermBar} := by have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ Submodule.span ℂ {x : JetAlgebra | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} := diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean index b29562cf8..032729d74 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean @@ -19,7 +19,7 @@ way. Consider all terms in the span of `ψ̄_α ∂_μ ψ_β`. @[expose] public section namespace LeptonGaugeSector -open TensorProduct StandardModel +open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix Pointwise open Matrix MatrixGroups @@ -40,7 +40,7 @@ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : spinor content into the part that is diagonal for the boost in the `i`-direction and the part that is not, so their weight decompositions in those directions are immediate. -/ theorem boostWeight_inter_fermionic_kinetic_term : - boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = Submodule.span ℂ {Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) + @@ -67,14 +67,14 @@ theorem boostWeight_inter_fermionic_kinetic_term : set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF set S : Set JetAlgebra := {B0 * P0 + B1 * M1, B0 * P0 - B1 * M1, B0 * X1 + B1 * X0, B0 * X1 - B1 * X0, B0 * Y1 + B1 * Y0, B0 * Y1 - B1 * Y0} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j with hW - have hB0w : B0 ∈ boostWeightSubmodule 2 (-1) := Dbarψ_nil_zero_mem_neg_one - have hB1w : B1 ∈ boostWeightSubmodule 2 1 := Dbarψ_nil_one_mem_one + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 2 j with hW + have hB0w : B0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := Dbarψ_nil_zero_mem_neg_one + have hB1w : B1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := Dbarψ_nil_one_mem_one obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : - P0 ∈ boostWeightSubmodule 2 1 ∧ P1 ∈ boostWeightSubmodule 2 3 ∧ - M0 ∈ boostWeightSubmodule 2 (-3) ∧ M1 ∈ boostWeightSubmodule 2 (-1) ∧ - X0 ∈ boostWeightSubmodule 2 (-1) ∧ X1 ∈ boostWeightSubmodule 2 1 ∧ - Y0 ∈ boostWeightSubmodule 2 (-1) ∧ Y1 ∈ boostWeightSubmodule 2 1 := by + P0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 3 ∧ + M0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-3) ∧ M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ + X0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ X1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ + Y0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ Y1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -106,10 +106,10 @@ theorem boostWeight_inter_fermionic_kinetic_term : -- ### C. Every bilinear splits into eigen bilinears of a single weight -- The ten bilinears of nonzero weight, and the decomposition of `∂_0 ψ_β` and `∂_z ψ_β` into -- the light-cone combinations. - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → - y ∈ boostWeightSubmodule 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) have k2 : B0 * M0 ∈ W := hm hB0w hM0w (by norm_num) have k3 : B0 * P1 ∈ W := hm hB0w hP1w (by norm_num) have k4 : B0 * M1 ∈ W := hm hB0w hM1w (by norm_num) @@ -143,11 +143,11 @@ theorem boostWeight_inter_fermionic_kinetic_term : | 1, Sum.inr 1, 0 => exact ky1 | 1, Sum.inr 1, 1 => exact hm hB1w hY1w (by norm_num) -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 2 k → - y ∈ boostWeightSubmodule 2 l → k + l = 0 → x * y ∈ boostWeightSubmodule 2 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl) @@ -167,7 +167,7 @@ theorem boostWeight_inter_fermionic_kinetic_term : repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 2) 0).symm, sup_bot_eq] /-- **The boost weight zero part of the fermion kinetic bilinears, `x`-direction.** The `x`-boost @@ -175,7 +175,7 @@ theorem boostWeight_inter_fermionic_kinetic_term : `ψ̄_0 ± ψ̄_1` of weight `∓1`, and likewise on the spinor index of `∂_μ ψ_β`; the light-cone derivative combinations are `∂_0 ∓ ∂_x`, and `∂_y`, `∂_z` are the transverse directions. -/ theorem boostWeight_inter_fermionic_kinetic_term_x : - boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = Submodule.span ℂ {(Dbarψ [] 0 + Dbarψ [] 1) * @@ -208,13 +208,13 @@ theorem boostWeight_inter_fermionic_kinetic_term_x : set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF set S : Set JetAlgebra := {Bp * P + Bm * M, Bp * P - Bm * M, Bp * T0m + Bm * T0p, Bp * T0m - Bm * T0p, Bp * T1m + Bm * T1p, Bp * T1m - Bm * T1p} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j with hW + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j with hW obtain ⟨hBpw, hBmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Bp ∈ boostWeightSubmodule 0 (-1) ∧ Bm ∈ boostWeightSubmodule 0 1 ∧ - P ∈ boostWeightSubmodule 0 1 ∧ Q ∈ boostWeightSubmodule 0 3 ∧ - N ∈ boostWeightSubmodule 0 (-3) ∧ M ∈ boostWeightSubmodule 0 (-1) ∧ - T0p ∈ boostWeightSubmodule 0 (-1) ∧ T0m ∈ boostWeightSubmodule 0 1 ∧ - T1p ∈ boostWeightSubmodule 0 (-1) ∧ T1m ∈ boostWeightSubmodule 0 1 := by + Bp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ Bm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ + P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 3 ∧ + N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ + T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ + T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -245,10 +245,10 @@ theorem boostWeight_inter_fermionic_kinetic_term_x : obtain ⟨kx0, kx1⟩ : Bp * T0m ∈ W ∧ Bm * T0p ∈ W := hpm (by simp [hS]) (by simp [hS]) obtain ⟨ky0, ky1⟩ : Bp * T1m ∈ W ∧ Bm * T1p ∈ W := hpm (by simp [hS]) (by simp [hS]) -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → - y ∈ boostWeightSubmodule 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) have hbil : ∀ x ∈ Submodule.span ℂ ({Bp, Bm} : Set JetAlgebra), ∀ y ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), x * y ∈ W := by @@ -308,11 +308,11 @@ theorem boostWeight_inter_fermionic_kinetic_term_x : | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) | Sum.inr 2, 1 => exact hc1 2⁻¹ (-2⁻¹) (by rw [hT1p, hT1m]; module) -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → - y ∈ boostWeightSubmodule 0 l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl) @@ -337,14 +337,14 @@ theorem boostWeight_inter_fermionic_kinetic_term_x : | apply neg_mem refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] /-- **The boost weight zero part of the fermion kinetic bilinears, `y`-direction.** As for the `x`-boost, but the rotated spinor combinations now carry a factor of `i`: `ψ̄_0 ∓ i ψ̄_1` has weight `∓1`, and on `∂_μ ψ_β` the combinations `∂_μ ψ_0 ± i ∂_μ ψ_1` carry the spinor weight `∓1`; the light-cone derivative combinations are `∂_0 ∓ ∂_y`, and `∂_x`, `∂_z` are transverse. -/ theorem boostWeight_inter_fermionic_kinetic_term_y : - boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = Submodule.span ℂ {(Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * @@ -393,13 +393,13 @@ theorem boostWeight_inter_fermionic_kinetic_term_y : set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF set S : Set JetAlgebra := {Bp * P + Bm * M, Bp * P - Bm * M, Bp * T0m + Bm * T0p, Bp * T0m - Bm * T0p, Bp * T1m + Bm * T1p, Bp * T1m - Bm * T1p} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j with hW + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j with hW obtain ⟨hBpw, hBmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Bp ∈ boostWeightSubmodule 1 (-1) ∧ Bm ∈ boostWeightSubmodule 1 1 ∧ - P ∈ boostWeightSubmodule 1 1 ∧ Q ∈ boostWeightSubmodule 1 3 ∧ - N ∈ boostWeightSubmodule 1 (-3) ∧ M ∈ boostWeightSubmodule 1 (-1) ∧ - T0p ∈ boostWeightSubmodule 1 (-1) ∧ T0m ∈ boostWeightSubmodule 1 1 ∧ - T1p ∈ boostWeightSubmodule 1 (-1) ∧ T1m ∈ boostWeightSubmodule 1 1 := by + Bp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ Bm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ + P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 3 ∧ + N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ + T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ + T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -431,10 +431,10 @@ theorem boostWeight_inter_fermionic_kinetic_term_y : obtain ⟨kx0, kx1⟩ : Bp * T0m ∈ W ∧ Bm * T0p ∈ W := hpm (by simp [hS]) (by simp [hS]) obtain ⟨ky0, ky1⟩ : Bp * T1m ∈ W ∧ Bm * T1p ∈ W := hpm (by simp [hS]) (by simp [hS]) -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → - y ∈ boostWeightSubmodule 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => + have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule hx hy))) + (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) have hbil : ∀ x ∈ Submodule.span ℂ ({Bp, Bm} : Set JetAlgebra), ∀ y ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), x * y ∈ W := by @@ -514,11 +514,11 @@ theorem boostWeight_inter_fermionic_kinetic_term_y : match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> (try ring_nf)) -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → - y ∈ boostWeightSubmodule 1 l → k + l = 0 → x * y ∈ boostWeightSubmodule 1 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl) @@ -544,7 +544,7 @@ theorem boostWeight_inter_fermionic_kinetic_term_y : | exact hFm _ _ _ refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] /-- **The fermion kinetic term is the only bilinear of boost weight zero in every direction.** An element of the span of the products `ψ̄_α D_μ ψ_β` has boost weight zero along all three @@ -557,8 +557,8 @@ theorem boostWeight_inter_fermionic_kinetic_term_y : six coefficients `a₁, …, a₆`, and five functionals, each a combination of two of the duals `fermionDual` chosen to annihilate the `x`- or the `y`-axis span, cut them down to one. -/ lemma boostWeight_inter_fermionic_kinetic_term_full : - boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ - boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ + BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = Submodule.span ℂ {fermionKineticTerm} := by have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ {x : JetAlgebra | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} := diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean index d1633cf11..52c4516ef 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean @@ -44,7 +44,7 @@ set_option linter.unusedSimpArgs false set_option linter.unusedTactic false namespace LeptonGaugeSector -open TensorProduct StandardModel +open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix Pointwise open Matrix MatrixGroups @@ -61,8 +61,8 @@ private lemma algebraMap_real_complex (t : ℝ) : /-- **The light-cone derivative `∂_0 - ∂_z` raises the `z`-boost weight by two.** -/ lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule 2 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k + 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k + 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, @@ -77,8 +77,8 @@ lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic /-- **The light-cone derivative `∂_0 + ∂_z` lowers the `z`-boost weight by two.** -/ lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule 2 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k - 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k - 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, @@ -93,8 +93,8 @@ lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic /-- **A transverse derivative leaves the `z`-boost weight alone.** -/ lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 2) - (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule 2 k) : - jetDeriv (Sum.inr i) x ∈ boostWeightSubmodule 2 k := by + (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : + jetDeriv (Sum.inr i) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] @@ -119,8 +119,8 @@ lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i /-- **The light-cone derivative `∂_0 - ∂_x` raises the `x`-boost weight by two.** -/ lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule 0 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k + 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k + 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, @@ -135,8 +135,8 @@ lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic /-- **The light-cone derivative `∂_0 + ∂_x` lowers the `x`-boost weight by two.** -/ lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule 0 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k - 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k - 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, @@ -151,8 +151,8 @@ lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic /-- **A transverse derivative leaves the `x`-boost weight alone.** -/ lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 0) - (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule 0 k) : - jetDeriv (Sum.inr i) x ∈ boostWeightSubmodule 0 k := by + (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : + jetDeriv (Sum.inr i) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] @@ -175,8 +175,8 @@ lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i /-- **The light-cone derivative `∂_0 - ∂_y` raises the `y`-boost weight by two.** -/ lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule 1 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k + 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k + 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, @@ -191,8 +191,8 @@ lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic /-- **The light-cone derivative `∂_0 + ∂_y` lowers the `y`-boost weight by two.** -/ lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule 1 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k - 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k - 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, @@ -207,8 +207,8 @@ lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic /-- **A transverse derivative leaves the `y`-boost weight alone.** -/ lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 1) - (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule 1 k) : - jetDeriv (Sum.inr i) x ∈ boostWeightSubmodule 1 k := by + (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : + jetDeriv (Sum.inr i) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] @@ -256,7 +256,7 @@ lemma lcn_apply (i : Fin 3) (x : JetAlgebra) : /-- `∂_0 - ∂_i` raises the `i`-boost weight of a bosonic element by two. -/ lemma lcp_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule i k) : lcp i x ∈ boostWeightSubmodule i (k + 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : lcp i x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (k + 2) := by fin_cases i · exact jetDeriv_lightConeX_pos_mem hb hx · exact jetDeriv_lightConeY_pos_mem hb hx @@ -264,7 +264,7 @@ lemma lcp_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bos /-- `∂_0 + ∂_i` lowers the `i`-boost weight of a bosonic element by two. -/ lemma lcn_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ boostWeightSubmodule i k) : lcn i x ∈ boostWeightSubmodule i (k - 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : lcn i x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (k - 2) := by fin_cases i · exact jetDeriv_lightConeX_neg_mem hb hx · exact jetDeriv_lightConeY_neg_mem hb hx @@ -272,8 +272,8 @@ lemma lcn_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bos /-- A transverse derivative preserves the `i`-boost weight of a bosonic element. -/ lemma jetDeriv_transverse_mem {i j : Fin 3} (hj : j ≠ i) {k : ℤ} {x : JetAlgebra} - (hb : x ∈ bosonic) (hx : x ∈ boostWeightSubmodule i k) : - jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule i k := by + (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : + jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k := by fin_cases i · exact jetDeriv_transverseX_mem hj hb hx · exact jetDeriv_transverseY_mem hj hb hx @@ -289,22 +289,22 @@ lemma lcn_mem_bosonic {i : Fin 3} {x : JetAlgebra} (hx : x ∈ bosonic) : lcn i /-- A bosonic submodule of pure `i`-boost weight is carried by `∂_0 - ∂_i` to one of weight two higher. -/ lemma map_lcp_le {i : Fin 3} {k : ℤ} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) - (hw : P ≤ boostWeightSubmodule i k) : - Submodule.map (lcp i) P ≤ boostWeightSubmodule i (k + 2) := by + (hw : P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : + Submodule.map (lcp i) P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i (k + 2) := by rintro y ⟨u, hu, rfl⟩ exact lcp_mem_boostWeight (hb hu) (hw hu) /-- The partner of `map_lcp_le`: `∂_0 + ∂_i` lowers the weight by two. -/ lemma map_lcn_le {i : Fin 3} {k : ℤ} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) - (hw : P ≤ boostWeightSubmodule i k) : - Submodule.map (lcn i) P ≤ boostWeightSubmodule i (k - 2) := by + (hw : P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : + Submodule.map (lcn i) P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i (k - 2) := by rintro y ⟨u, hu, rfl⟩ exact lcn_mem_boostWeight (hb hu) (hw hu) /-- A transverse derivative preserves the `i`-boost weight of a bosonic submodule. -/ lemma map_jetDeriv_transverse_le {i j : Fin 3} (hj : j ≠ i) {k : ℤ} - {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) (hw : P ≤ boostWeightSubmodule i k) : - Submodule.map (jetDeriv (Sum.inr j)) P ≤ boostWeightSubmodule i k := by + {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) (hw : P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : + Submodule.map (jetDeriv (Sum.inr j)) P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k := by rintro y ⟨u, hu, rfl⟩ exact jetDeriv_transverse_mem hj (hb hu) (hw hu) @@ -408,7 +408,7 @@ lemma jetDeriv_mem_stepAxis {i t₁ t₂ : Fin 3} (h₁ : t₁ ≠ i) (h₂ : t weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the converse is not recorded. -/ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : - boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ Submodule.span ℂ {lcp 2 (lcn 2 (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), @@ -438,9 +438,9 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : set T := fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hT set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) with hL obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : - PX ∈ boostWeightSubmodule 2 2 ∧ PY ∈ boostWeightSubmodule 2 2 ∧ - MX ∈ boostWeightSubmodule 2 (-2) ∧ MY ∈ boostWeightSubmodule 2 (-2) ∧ - T ∈ boostWeightSubmodule 2 0 ∧ L ∈ boostWeightSubmodule 2 0 := by + PX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 ∧ PY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 ∧ + MX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) ∧ MY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) ∧ + T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -461,11 +461,11 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : set B := Submodule.span ℂ {T, L} with hB set C := Submodule.span ℂ {MX, MY} with hC set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ boostWeightSubmodule 2 2 := by + have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ boostWeightSubmodule 2 0 := by + have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ boostWeightSubmodule 2 (-2) := by + have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left @@ -523,7 +523,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : lcn 2 ((jetDeriv (Sum.inr 0)) PY), lcn 2 ((jetDeriv (Sum.inr 1)) PX), lcn 2 ((jetDeriv (Sum.inr 1)) PY)} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 2 j with hW + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 2 j with hW -- the three weight spaces are bosonic have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => fieldStrengthDeriv_mem_bosonic _ _ _ @@ -546,44 +546,44 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → - P ≤ boostWeightSubmodule 2 j → P ≤ W := fun hj hP => + P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 j → P ≤ W := fun hj hP => le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) have bpA : Submodule.map (lcp 2) A ≤ bosonic := map_lcp_le_bosonic hAb have wpA : Submodule.map (lcp 2) A ≤ - boostWeightSubmodule 2 (2 + 2) := map_lcp_le hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2 + 2) := map_lcp_le hAb hAle have bpB : Submodule.map (lcp 2) B ≤ bosonic := map_lcp_le_bosonic hBb have wpB : Submodule.map (lcp 2) B ≤ - boostWeightSubmodule 2 (0 + 2) := map_lcp_le hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0 + 2) := map_lcp_le hBb hBle have bpC : Submodule.map (lcp 2) C ≤ bosonic := map_lcp_le_bosonic hCb have wpC : Submodule.map (lcp 2) C ≤ - boostWeightSubmodule 2 (-2 + 2) := map_lcp_le hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2 + 2) := map_lcp_le hCb hCle have bmA : Submodule.map (lcn 2) A ≤ bosonic := map_lcn_le_bosonic hAb have wmA : Submodule.map (lcn 2) A ≤ - boostWeightSubmodule 2 (2 - 2) := map_lcn_le hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2 - 2) := map_lcn_le hAb hAle have bmB : Submodule.map (lcn 2) B ≤ bosonic := map_lcn_le_bosonic hBb have wmB : Submodule.map (lcn 2) B ≤ - boostWeightSubmodule 2 (0 - 2) := map_lcn_le hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0 - 2) := map_lcn_le hBb hBle have bmC : Submodule.map (lcn 2) C ≤ bosonic := map_lcn_le_bosonic hCb have wmC : Submodule.map (lcn 2) C ≤ - boostWeightSubmodule 2 (-2 - 2) := map_lcn_le hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2 - 2) := map_lcn_le hCb hCle have bxA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hAb have wxA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ - boostWeightSubmodule 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle have bxB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hBb have wxB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ - boostWeightSubmodule 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle have bxC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hCb have wxC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ - boostWeightSubmodule 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle have byA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hAb have wyA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ - boostWeightSubmodule 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle have byB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hBb have wyB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ - boostWeightSubmodule 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle have byC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hCb have wyC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ - boostWeightSubmodule 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle have eppA : Submodule.map (lcp 2) (Submodule.map (lcp 2) A) ≤ W := hN (by norm_num) (map_lcp_le bpA wpA) have eppB : Submodule.map (lcp 2) (Submodule.map (lcp 2) B) ≤ W := @@ -771,15 +771,15 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : have hkey : Submodule.span ℂ FF ≤ W := le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) -- the sixteen generators have weight zero - have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ boostWeightSubmodule 2 j → - y ∈ boostWeightSubmodule 2 0 := by rintro j y rfl h; exact h + have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 j → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by rintro j y rfl h; exact h have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 2 0 := by + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | @@ -805,7 +805,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] refine le_trans (inf_le_inf_left _ hkey) ?_ rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 2) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 2) 0).symm, sup_bot_eq] /-! ## G. The boost weight zero part, `x`-direction @@ -818,7 +818,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_le : weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the converse is not recorded. -/ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : - boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ Submodule.span ℂ {lcp 0 (lcn 0 (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), @@ -848,9 +848,9 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : set T := fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hT set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) with hL obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : - PX ∈ boostWeightSubmodule 0 2 ∧ PY ∈ boostWeightSubmodule 0 2 ∧ - MX ∈ boostWeightSubmodule 0 (-2) ∧ MY ∈ boostWeightSubmodule 0 (-2) ∧ - T ∈ boostWeightSubmodule 0 0 ∧ L ∈ boostWeightSubmodule 0 0 := by + PX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ PY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ + MX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ MY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ + T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -871,11 +871,11 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : set B := Submodule.span ℂ {T, L} with hB set C := Submodule.span ℂ {MX, MY} with hC set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ boostWeightSubmodule 0 2 := by + have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 := by rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ boostWeightSubmodule 0 0 := by + have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ boostWeightSubmodule 0 (-2) := by + have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := by rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left @@ -933,7 +933,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : lcn 0 ((jetDeriv (Sum.inr 1)) PY), lcn 0 ((jetDeriv (Sum.inr 2)) PX), lcn 0 ((jetDeriv (Sum.inr 2)) PY)} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j with hW + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j with hW -- the three weight spaces are bosonic have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => fieldStrengthDeriv_mem_bosonic _ _ _ @@ -956,44 +956,44 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → - P ≤ boostWeightSubmodule 0 j → P ≤ W := fun hj hP => + P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 j → P ≤ W := fun hj hP => le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) have bpA : Submodule.map (lcp 0) A ≤ bosonic := map_lcp_le_bosonic hAb have wpA : Submodule.map (lcp 0) A ≤ - boostWeightSubmodule 0 (2 + 2) := map_lcp_le hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2 + 2) := map_lcp_le hAb hAle have bpB : Submodule.map (lcp 0) B ≤ bosonic := map_lcp_le_bosonic hBb have wpB : Submodule.map (lcp 0) B ≤ - boostWeightSubmodule 0 (0 + 2) := map_lcp_le hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0 + 2) := map_lcp_le hBb hBle have bpC : Submodule.map (lcp 0) C ≤ bosonic := map_lcp_le_bosonic hCb have wpC : Submodule.map (lcp 0) C ≤ - boostWeightSubmodule 0 (-2 + 2) := map_lcp_le hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2 + 2) := map_lcp_le hCb hCle have bmA : Submodule.map (lcn 0) A ≤ bosonic := map_lcn_le_bosonic hAb have wmA : Submodule.map (lcn 0) A ≤ - boostWeightSubmodule 0 (2 - 2) := map_lcn_le hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2 - 2) := map_lcn_le hAb hAle have bmB : Submodule.map (lcn 0) B ≤ bosonic := map_lcn_le_bosonic hBb have wmB : Submodule.map (lcn 0) B ≤ - boostWeightSubmodule 0 (0 - 2) := map_lcn_le hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0 - 2) := map_lcn_le hBb hBle have bmC : Submodule.map (lcn 0) C ≤ bosonic := map_lcn_le_bosonic hCb have wmC : Submodule.map (lcn 0) C ≤ - boostWeightSubmodule 0 (-2 - 2) := map_lcn_le hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2 - 2) := map_lcn_le hCb hCle have bxA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hAb have wxA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ - boostWeightSubmodule 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle have bxB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hBb have wxB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ - boostWeightSubmodule 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle have bxC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hCb have wxC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ - boostWeightSubmodule 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle have byA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hAb have wyA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ - boostWeightSubmodule 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle have byB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hBb have wyB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ - boostWeightSubmodule 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle have byC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hCb have wyC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ - boostWeightSubmodule 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle have eppA : Submodule.map (lcp 0) (Submodule.map (lcp 0) A) ≤ W := hN (by norm_num) (map_lcp_le bpA wpA) have eppB : Submodule.map (lcp 0) (Submodule.map (lcp 0) B) ≤ W := @@ -1181,15 +1181,15 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : have hkey : Submodule.span ℂ FF ≤ W := le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) -- the sixteen generators have weight zero - have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ boostWeightSubmodule 0 j → - y ∈ boostWeightSubmodule 0 0 := by rintro j y rfl h; exact h + have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 j → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rintro j y rfl h; exact h have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | @@ -1215,7 +1215,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] refine le_trans (inf_le_inf_left _ hkey) ?_ rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] /-! ## H. The boost weight zero part, `y`-direction @@ -1228,7 +1228,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the converse is not recorded. -/ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : - boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ Submodule.span ℂ {lcp 1 (lcn 1 (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), @@ -1258,9 +1258,9 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : set T := fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hT set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) with hL obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : - PX ∈ boostWeightSubmodule 1 2 ∧ PY ∈ boostWeightSubmodule 1 2 ∧ - MX ∈ boostWeightSubmodule 1 (-2) ∧ MY ∈ boostWeightSubmodule 1 (-2) ∧ - T ∈ boostWeightSubmodule 1 0 ∧ L ∈ boostWeightSubmodule 1 0 := by + PX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ PY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ + MX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ MY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ + T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -1281,11 +1281,11 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : set B := Submodule.span ℂ {T, L} with hB set C := Submodule.span ℂ {MX, MY} with hC set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ boostWeightSubmodule 1 2 := by + have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 := by rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ boostWeightSubmodule 1 0 := by + have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ boostWeightSubmodule 1 (-2) := by + have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := by rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left @@ -1343,7 +1343,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : lcn 1 ((jetDeriv (Sum.inr 2)) PY), lcn 1 ((jetDeriv (Sum.inr 0)) PX), lcn 1 ((jetDeriv (Sum.inr 0)) PY)} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j with hW + set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j with hW -- the three weight spaces are bosonic have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => fieldStrengthDeriv_mem_bosonic _ _ _ @@ -1366,44 +1366,44 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → - P ≤ boostWeightSubmodule 1 j → P ≤ W := fun hj hP => + P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 j → P ≤ W := fun hj hP => le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) have bpA : Submodule.map (lcp 1) A ≤ bosonic := map_lcp_le_bosonic hAb have wpA : Submodule.map (lcp 1) A ≤ - boostWeightSubmodule 1 (2 + 2) := map_lcp_le hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2 + 2) := map_lcp_le hAb hAle have bpB : Submodule.map (lcp 1) B ≤ bosonic := map_lcp_le_bosonic hBb have wpB : Submodule.map (lcp 1) B ≤ - boostWeightSubmodule 1 (0 + 2) := map_lcp_le hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0 + 2) := map_lcp_le hBb hBle have bpC : Submodule.map (lcp 1) C ≤ bosonic := map_lcp_le_bosonic hCb have wpC : Submodule.map (lcp 1) C ≤ - boostWeightSubmodule 1 (-2 + 2) := map_lcp_le hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2 + 2) := map_lcp_le hCb hCle have bmA : Submodule.map (lcn 1) A ≤ bosonic := map_lcn_le_bosonic hAb have wmA : Submodule.map (lcn 1) A ≤ - boostWeightSubmodule 1 (2 - 2) := map_lcn_le hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2 - 2) := map_lcn_le hAb hAle have bmB : Submodule.map (lcn 1) B ≤ bosonic := map_lcn_le_bosonic hBb have wmB : Submodule.map (lcn 1) B ≤ - boostWeightSubmodule 1 (0 - 2) := map_lcn_le hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0 - 2) := map_lcn_le hBb hBle have bmC : Submodule.map (lcn 1) C ≤ bosonic := map_lcn_le_bosonic hCb have wmC : Submodule.map (lcn 1) C ≤ - boostWeightSubmodule 1 (-2 - 2) := map_lcn_le hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2 - 2) := map_lcn_le hCb hCle have bxA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hAb have wxA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ - boostWeightSubmodule 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle have bxB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hBb have wxB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ - boostWeightSubmodule 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle have bxC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hCb have wxC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ - boostWeightSubmodule 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle have byA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hAb have wyA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ - boostWeightSubmodule 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle have byB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hBb have wyB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ - boostWeightSubmodule 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle have byC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hCb have wyC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ - boostWeightSubmodule 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle + BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle have eppA : Submodule.map (lcp 1) (Submodule.map (lcp 1) A) ≤ W := hN (by norm_num) (map_lcp_le bpA wpA) have eppB : Submodule.map (lcp 1) (Submodule.map (lcp 1) B) ≤ W := @@ -1591,15 +1591,15 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : have hkey : Submodule.span ℂ FF ≤ W := le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) -- the sixteen generators have weight zero - have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ boostWeightSubmodule 1 j → - y ∈ boostWeightSubmodule 1 0 := by rintro j y rfl h; exact h + have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 j → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rintro j y rfl h; exact h have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | @@ -1625,7 +1625,7 @@ lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] refine le_trans (inf_le_inf_left _ hkey) ?_ rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] /-! ## I. The Bianchi identity and the three-axis intersection @@ -1666,7 +1666,7 @@ lemma lcn_PY_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - module theorem boostWeight_inter_fieldStrengthDeriv_pair_full : - boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ boostWeightSubmodule 2 0 ⊓ + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} = ⊥ := by refine le_antisymm (fun x hx => ?_) bot_le rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean index 5a4c44a54..f0718e64c 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean @@ -29,7 +29,7 @@ weight-`2` field strength against a weight-`-2` one, and two weight-zero ones seven products listed. The intersection then follows formally, with no linear independence of the products needed. The -weight submodules are independent (`boostWeightSubmodule_iSupIndep`), so boost weight zero is +weight submodules are independent (`BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup`), so boost weight zero is disjoint from the span of the weights `±2, ±4`; since the weight-zero part sits inside boost weight zero, the modular law cuts the intersection down to it. The `x`- and `y`-axis theorems are the same certificate with the light-cone pairs built on those axes instead. @@ -61,7 +61,7 @@ set_option linter.unusedTactic false set_option linter.unnecessarySeqFocus false namespace LeptonGaugeSector -open TensorProduct StandardModel +open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix Pointwise open Matrix MatrixGroups @@ -75,7 +75,7 @@ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : `F_{0y} - F_{zy}` with a weight-`-2` one `F_{0x} + F_{zx}`, `F_{0y} + F_{zy}`, and of the weight-zero components `F_{xy}` and `F_{0z}` with each other. -/ theorem boostWeight_inter_fieldStrength : - boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) * @@ -104,7 +104,7 @@ theorem boostWeight_inter_fieldStrength : boostProj_z_two_map_fieldStrengthDeriv_span, boostProj_z_neg_two_map_fieldStrengthDeriv_span] at hmul have hclosed := boostProj_z_map_fieldStrengthDeriv_mul_span_le - rw [inf_boostWeightSubmodule_eq_map hclosed, hmul, Submodule.span_mul_span, + rw [BoostWeight.inf_boostWeightSubmodule_eq_map repLorentzGroup hclosed, hmul, Submodule.span_mul_span, Submodule.span_mul_span, Submodule.add_eq_sup, ← Submodule.span_union] refine Submodule.span_eq_span ?_ ?_ · rintro x (⟨a, (rfl | rfl), b, (rfl | rfl), rfl⟩ | ⟨a, (rfl | rfl), b, (rfl | rfl), rfl⟩) <;> @@ -123,7 +123,7 @@ theorem boostWeight_inter_fieldStrength : with the light-cone pairs now built on the `x`-axis: `F_{0y} ∓ F_{xy}` and `F_{0z} ∓ F_{xz}` have weight `±2`, and `F_{yz}`, `F_{0x}` have weight zero. -/ theorem boostWeight_inter_fieldStrength_x : - boostWeightSubmodule 0 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) * @@ -162,9 +162,9 @@ theorem boostWeight_inter_fieldStrength_x : {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF set S : Set JetAlgebra := {P1 * M1, P1 * M2, P2 * M1, P2 * M2, T * T, T * L, L * L} with hS obtain ⟨hP1w, hP2w, hM1w, hM2w, hTw, hLw⟩ : - P1 ∈ boostWeightSubmodule 0 2 ∧ P2 ∈ boostWeightSubmodule 0 2 ∧ - M1 ∈ boostWeightSubmodule 0 (-2) ∧ M2 ∈ boostWeightSubmodule 0 (-2) ∧ - T ∈ boostWeightSubmodule 0 0 ∧ L ∈ boostWeightSubmodule 0 0 := by + P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ P2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ + M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ M2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ + T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -183,11 +183,11 @@ theorem boostWeight_inter_fieldStrength_x : set B := Submodule.span ℂ {T, L} with hB set C := Submodule.span ℂ {M1, M2} with hC set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ boostWeightSubmodule 0 2 := by + have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 := by rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hP1w, hP2w]) - have hBle : B ≤ boostWeightSubmodule 0 0 := by + have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ boostWeightSubmodule 0 (-2) := by + have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := by rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hM1w, hM2w]) have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left @@ -256,11 +256,11 @@ theorem boostWeight_inter_fieldStrength_x : constructor · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ - have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule 0 k → - Y ≤ boostWeightSubmodule 0 l → k + l ≠ 0 → - X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j := + have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → + Y ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l ≠ 0 → + X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j := fun hX hY h => le_sup_of_le_right - ((Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy)).trans + ((Submodule.mul_le.2 fun _ hx _ hy => BoostWeight.mul_mem repLorentzGroup (hX hx) (hY hy)).trans (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → a * b ∈ Submodule.span ℂ S := fun ha hb h => by @@ -278,7 +278,7 @@ theorem boostWeight_inter_fieldStrength_x : Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] have hkey : Submodule.span ℂ FF ≤ - Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 0 j := by + Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j := by rw [hspan] refine (Submodule.mul_le.2 fun _ hx _ hy => Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ @@ -288,11 +288,11 @@ theorem boostWeight_inter_fieldStrength_x : hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] -- ### D. The weight zero part of the photon pairs - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 0 k → - y ∈ boostWeightSubmodule 0 l → k + l = 0 → x * y ∈ boostWeightSubmodule 0 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 0 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> @@ -304,13 +304,13 @@ theorem boostWeight_inter_fieldStrength_x : exact Submodule.mul_mem_mul (by assumption) (by assumption) refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 0) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] /-- **The boost weight zero part of the photon pairs, `y`-direction.** As for the `z`-boost, with the light-cone pairs now built on the `y`-axis: `F_{0z} ∓ F_{yz}` and `F_{0x} ∓ F_{yx}` have weight `±2`, and `F_{zx}`, `F_{0y}` have weight zero. -/ theorem boostWeight_inter_fieldStrength_y : - boostWeightSubmodule 1 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) * @@ -349,9 +349,9 @@ theorem boostWeight_inter_fieldStrength_y : {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF set S : Set JetAlgebra := {P1 * M1, P1 * M2, P2 * M1, P2 * M2, T * T, T * L, L * L} with hS obtain ⟨hP1w, hP2w, hM1w, hM2w, hTw, hLw⟩ : - P1 ∈ boostWeightSubmodule 1 2 ∧ P2 ∈ boostWeightSubmodule 1 2 ∧ - M1 ∈ boostWeightSubmodule 1 (-2) ∧ M2 ∈ boostWeightSubmodule 1 (-2) ∧ - T ∈ boostWeightSubmodule 1 0 ∧ L ∈ boostWeightSubmodule 1 0 := by + P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ P2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ + M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ M2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ + T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht all_goals have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -370,11 +370,11 @@ theorem boostWeight_inter_fieldStrength_y : set B := Submodule.span ℂ {T, L} with hB set C := Submodule.span ℂ {M1, M2} with hC set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ boostWeightSubmodule 1 2 := by + have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 := by rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hP1w, hP2w]) - have hBle : B ≤ boostWeightSubmodule 1 0 := by + have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ boostWeightSubmodule 1 (-2) := by + have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := by rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hM1w, hM2w]) have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left @@ -443,11 +443,11 @@ theorem boostWeight_inter_fieldStrength_y : constructor · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ - have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ boostWeightSubmodule 1 k → - Y ≤ boostWeightSubmodule 1 l → k + l ≠ 0 → - X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j := + have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → + Y ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l ≠ 0 → + X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j := fun hX hY h => le_sup_of_le_right - ((Submodule.mul_le.2 fun _ hx _ hy => mul_mem_boostWeightSubmodule (hX hx) (hY hy)).trans + ((Submodule.mul_le.2 fun _ hx _ hy => BoostWeight.mul_mem repLorentzGroup (hX hx) (hY hy)).trans (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → a * b ∈ Submodule.span ℂ S := fun ha hb h => by @@ -465,7 +465,7 @@ theorem boostWeight_inter_fieldStrength_y : Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] have hkey : Submodule.span ℂ FF ≤ - Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), boostWeightSubmodule 1 j := by + Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j := by rw [hspan] refine (Submodule.mul_le.2 fun _ hx _ hy => Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ @@ -475,11 +475,11 @@ theorem boostWeight_inter_fieldStrength_y : hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] -- ### D. The weight zero part of the photon pairs - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ boostWeightSubmodule 1 k → - y ∈ boostWeightSubmodule 1 l → k + l = 0 → x * y ∈ boostWeightSubmodule 1 0 := by + have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → + y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by intro k l x y hx hy h - rw [← h]; exact mul_mem_boostWeightSubmodule hx hy - have hSw : Submodule.span ℂ S ≤ boostWeightSubmodule 1 0 := by + rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy + have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rw [hS] refine Submodule.span_le.2 ?_ rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> @@ -491,7 +491,7 @@ theorem boostWeight_inter_fieldStrength_y : exact Submodule.mul_mem_mul (by assumption) (by assumption) refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) rw [inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := 1) 0).symm, sup_bot_eq] + disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] /-- **The Maxwell and theta terms are the only photon pairs of boost weight zero in every direction.** An element of the span of the products `F_{μν} F_{μ'ν'}` has boost weight zero @@ -505,8 +505,8 @@ theorem boostWeight_inter_fieldStrength_y : functionals, each a sum of at most two of the duals chosen to annihilate the `x`- or the `y`-axis span, cut them down to two. -/ theorem boostWeight_inter_fieldStrength_full : - boostWeightSubmodule 0 0 ⊓ boostWeightSubmodule 1 0 ⊓ - boostWeightSubmodule 2 0 ⊓ Submodule.span ℂ + BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ + BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = Submodule.span ℂ {maxwellTerm, thetaTerm} := by have hFm : ∀ μ ν μ' ν', fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν' ∈ diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index 1fb079b20..a9200c03e 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -5,7 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Grading.AxisBoosts +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDim public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.JetDerivLorentz /-! @@ -14,7 +15,7 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.JetDerivLorentz The jet algebra is graded by the boost weight along each spatial axis: `x` has boost weight `k` along the `i`-th axis when `ρ(boostAxis i t) x = t ^ k • x` for every `t`. This is proved: `boostWeightSubmodule_isInternal` decomposes the jet algebra as an internal direct sum of the -weight submodules, and `GradedAlgebra (boostWeightSubmodule i)` is an instance for each of the +weight submodules, and `GradedAlgebra (BoostWeight.boostWeightSubmodule repLorentzGroup i)` is an instance for each of the three axes. *It is not the hypercharge construction.* The gauge group acts on every generator by a @@ -78,7 +79,7 @@ layer to the spaces the jet algebra is built from. - `JetAlgebra.mul_mem_boostWeightSubmodule` : boost weights add under multiplication. - `JetAlgebra.mem_boostWeightSubmodule_zero_of_isInvariant` : an invariant has boost weight zero. - `JetAlgebra.boostWeightSubmodule_isInternal` : the weight submodules decompose the jet algebra - as an internal direct sum, so `GradedAlgebra (boostWeightSubmodule i)` holds. + as an internal direct sum, so `GradedAlgebra (BoostWeight.boostWeightSubmodule repLorentzGroup i)` holds. - `JetAlgebra.boostAvgAxis_apply_of_mem` : the boost average along an axis acts on a weight-`k` element by `boostAvgZWeight k`, hence is the identity on boost weight zero and annihilates weights `±2, ±4, ±6`. @@ -101,7 +102,7 @@ layer to the spaces the jet algebra is built from. @[expose] public section namespace LeptonGaugeSector -open TensorProduct StandardModel +open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix open Matrix MatrixGroups @@ -109,437 +110,6 @@ namespace JetAlgebra /-! -## A. The boosts along the three axes - -The three axis boosts are conjugate: a rotation by `π/2` carries the `z`-boost to the `x`- and -`y`-boosts. Everything below is therefore proved for the `z`-axis and transported, rather than -repeated three times. - --/ - -/-- The boost along the `i`-th spatial axis. -/ -noncomputable def boostAxis : Fin 3 → (t : ℝ) → t ≠ 0 → SL(2,ℂ) - | 0, t, ht => boostXel t ht - | 1, t, ht => boostYel t ht - | 2, t, ht => boostZel t ht - -@[simp] lemma boostAxis_zero (t : ℝ) (ht : t ≠ 0) : boostAxis 0 t ht = boostXel t ht := rfl -@[simp] lemma boostAxis_one (t : ℝ) (ht : t ≠ 0) : boostAxis 1 t ht = boostYel t ht := rfl -@[simp] lemma boostAxis_two (t : ℝ) (ht : t ≠ 0) : boostAxis 2 t ht = boostZel t ht := rfl - -lemma boostAxis_inv (i : Fin 3) (t : ℝ) (ht : t ≠ 0) : - (boostAxis i t ht)⁻¹ = boostAxis i t⁻¹ (inv_ne_zero ht) := by - fin_cases i - · exact boostXel_inv t ht - · exact boostYel_inv t ht - · exact boostZel_inv t ht - -private lemma sqrtTwo_sq : (((Real.sqrt 2 : ℝ) : ℂ)) ^ 2 = 2 := by - rw [← Complex.ofReal_pow, Real.sq_sqrt (by norm_num : (0:ℝ) ≤ 2)] - norm_num - -private lemma sqrtTwo_ne_zero : (((Real.sqrt 2 : ℝ) : ℂ)) ≠ 0 := by - simp [] - -private lemma sqrtTwo_inv_mul : - ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹) * ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹) = 2⁻¹ := by - rw [← mul_inv, ← sq, sqrtTwo_sq] - -/-- The rotation by `π/2` about the `y`-axis, carrying the `z`-boost to the `x`-boost. -/ -noncomputable def rotZX : SL(2,ℂ) := - ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, -1; 1, 1], by - rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow, sqrtTwo_sq] - norm_num⟩ - -/-- The rotation by `π/2` about the `x`-axis, carrying the `z`-boost to the `y`-boost. -/ -noncomputable def rotZY : SL(2,ℂ) := - ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, Complex.I; Complex.I, 1], by - rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow, sqrtTwo_sq, - Complex.I_mul_I] - norm_num⟩ - -lemma boostXel_eq_conj (t : ℝ) (ht : t ≠ 0) : - boostXel t ht = rotZX * boostZel t ht * rotZX⁻¹ := by - have h0 := sqrtTwo_ne_zero - have hc := sqrtTwo_inv_mul - have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Subtype.ext ?_ - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> - · simp [Matrix.SpecialLinearGroup.coe_mul, rotZX, boostZel, boostXel, - Matrix.mul_apply, Fin.sum_univ_two] - field_simp - simp only [sqrtTwo_sq] - try ring - -lemma boostYel_eq_conj (t : ℝ) (ht : t ≠ 0) : - boostYel t ht = rotZY * boostZel t ht * rotZY⁻¹ := by - have h0 := sqrtTwo_ne_zero - have hc := sqrtTwo_inv_mul - have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - refine Subtype.ext ?_ - rw [Matrix.SpecialLinearGroup.SL2_inv_expl] - ext i j - fin_cases i <;> fin_cases j <;> - · simp [Matrix.SpecialLinearGroup.coe_mul, rotZY, boostZel, boostYel, - Matrix.mul_apply, Fin.sum_univ_two] - field_simp - simp only [sqrtTwo_sq, Complex.I_sq] - try ring - -/-- Every axis boost is a rotation of the `z`-boost. -/ -lemma exists_conj_boostAxis (i : Fin 3) : - ∃ R : SL(2,ℂ), ∀ (t : ℝ) (ht : t ≠ 0), - boostAxis i t ht = R * boostAxis 2 t ht * R⁻¹ := by - fin_cases i - · exact ⟨rotZX, fun t ht => boostXel_eq_conj t ht⟩ - · exact ⟨rotZY, fun t ht => boostYel_eq_conj t ht⟩ - · exact ⟨1, fun t ht => by simp⟩ - -/-! - -## B. Boost weights of a general representation - -The descent to the component spaces is uniform, so it is carried out once here for an arbitrary -representation. The weight spaces are defined exactly as `boostWeightSubmodule` is, and -`IsGraded` says that they span. The point of the section is that `IsGraded` propagates along -every construction the jet algebra is built from: tensor products, products, symmetric algebras, -exterior algebras and base change. The recursion bottoms out at a finite-dimensional space with -an eigenbasis, where the light-cone combinations do the work. - --/ - -namespace BoostWeight - -variable {K : Type*} [Field K] [Algebra ℝ K] -variable {M N V : Type*} [AddCommGroup M] [Module K M] [AddCommGroup N] [Module K N] - [AddCommGroup V] [Module K V] -variable {i : Fin 3} - -private lemma algebraMap_ne_zero {t : ℝ} (ht : t ≠ 0) : (algebraMap ℝ K t) ≠ 0 := - fun h => ht ((algebraMap ℝ K).injective (by simpa using h)) - -/-- The weight-`w` space of a representation: the vectors scaling by `t ^ w` under the - `z`-boost at parameter `t`. -/ -def space (rep : Representation K SL(2,ℂ) M) (i : Fin 3) (w : ℤ) : Submodule K M where - carrier := {x | ∀ (t : ℝ) (ht : t ≠ 0), - rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x} - add_mem' {a b} ha hb := fun t ht => by rw [map_add, ha t ht, hb t ht, smul_add] - zero_mem' := fun t ht => by rw [map_zero, smul_zero] - smul_mem' c x hx := fun t ht => by rw [map_smul, hx t ht, smul_comm] - -lemma mem_space {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {w : ℤ} {x : M} : - x ∈ space rep i w ↔ ∀ (t : ℝ) (ht : t ≠ 0), - rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl - -/-- The span of all the weight spaces. -/ -def weightSpan (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Submodule K M := - ⨆ w, space rep i w - -/-- A representation is boost-graded when its weight spaces span. -/ -def IsGraded (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Prop := weightSpan rep i = ⊤ - -lemma mem_weightSpan_of_mem_space {rep : Representation K SL(2,ℂ) M} {w : ℤ} {x : M} - (h : x ∈ space rep i w) : x ∈ weightSpan rep i := - Submodule.mem_iSup_of_mem w h - -lemma mem_weightSpan_of_isGraded {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep i) (x : M) : - x ∈ weightSpan rep i := by rw [IsGraded] at h; rw [h]; trivial - -lemma isGraded_iff_forall_mem {rep : Representation K SL(2,ℂ) M} : - IsGraded rep i ↔ ∀ x, x ∈ weightSpan rep i := - ⟨mem_weightSpan_of_isGraded, fun h => eq_top_iff.mpr fun x _ => h x⟩ - -/-- A representation with a spanning family of vectors in the weight span is graded. -/ -lemma isGraded_of_span {rep : Representation K SL(2,ℂ) M} {S : Set M} - (hS : Submodule.span K S = ⊤) (h : ∀ x ∈ S, x ∈ weightSpan rep i) : IsGraded rep i := - eq_top_iff.mpr (hS ▸ Submodule.span_le.mpr h) - -/-- A representation with a basis of vectors lying in the weight span is graded. -/ -lemma isGraded_of_basis {ι : Type*} {rep : Representation K SL(2,ℂ) M} (b : Module.Basis ι K M) - (h : ∀ n, b n ∈ weightSpan rep i) : IsGraded rep i := - isGraded_of_span b.span_eq (by rintro _ ⟨n, rfl⟩; exact h n) - -/-! - -### Tensor products - --/ - -lemma tmul_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - {a b : ℤ} {x : M} {y : N} (hx : x ∈ space rep i a) (hy : y ∈ space rep₂ i b) : - x ⊗ₜ[K] y ∈ space (rep.tprod rep₂) i (a + b) := by - intro t ht - show (TensorProduct.map _ _) _ = _ - rw [TensorProduct.map_tmul, hx t ht, hy t ht] - simp only [TensorProduct.tmul_smul, TensorProduct.smul_tmul', smul_smul] - rw [← zpow_add₀ (algebraMap_ne_zero (K := K) ht), add_comm b a] - -lemma isGraded_tprod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.tprod rep₂) i := by - refine isGraded_iff_forall_mem.mpr fun z => ?_ - induction z using TensorProduct.induction_on with - | zero => exact Submodule.zero_mem _ - | add u v hu hv => exact Submodule.add_mem _ hu hv - | tmul x y => - have hx := mem_weightSpan_of_isGraded h₁ x - have hy := mem_weightSpan_of_isGraded h₂ y - induction hx using Submodule.iSup_induction' with - | mem a x' hx' => - induction hy using Submodule.iSup_induction' with - | mem b y' hy' => exact mem_weightSpan_of_mem_space (tmul_mem_space hx' hy') - | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv - | zero => rw [TensorProduct.zero_tmul]; exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ ihu ihv - - -/-! - -### Products - --/ - -lemma inl_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - {a : ℤ} {x : M} (hx : x ∈ space rep i a) : - ((x, 0) : M × N) ∈ space (rep.prod rep₂) i a := by - intro t ht - show ((rep _ x, rep₂ _ 0) : M × N) = _ - rw [map_zero, hx t ht, Prod.smul_mk, smul_zero] - -lemma inr_mem_space {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - {a : ℤ} {y : N} (hy : y ∈ space rep₂ i a) : - ((0, y) : M × N) ∈ space (rep.prod rep₂) i a := by - intro t ht - show ((rep _ 0, rep₂ _ y) : M × N) = _ - rw [map_zero, hy t ht, Prod.smul_mk, smul_zero] - -lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.prod rep₂) i := by - have hleft : ∀ x : M, ((x, (0 : N))) ∈ weightSpan (rep.prod rep₂) i := by - intro x - have hx := mem_weightSpan_of_isGraded h₁ x - induction hx using Submodule.iSup_induction' with - | mem a u hu => exact mem_weightSpan_of_mem_space (inl_mem_space hu) - | zero => exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => - rw [show ((u + v, (0 : N))) = ((u, (0 : N))) + ((v, (0 : N))) from by ext <;> simp] - exact Submodule.add_mem _ ihu ihv - have hright : ∀ y : N, (((0 : M), y)) ∈ weightSpan (rep.prod rep₂) i := by - intro y - have hy := mem_weightSpan_of_isGraded h₂ y - induction hy using Submodule.iSup_induction' with - | mem a u hu => exact mem_weightSpan_of_mem_space (inr_mem_space hu) - | zero => exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => - rw [show (((0 : M), u + v)) = (((0 : M), u)) + (((0 : M), v)) from by ext <;> simp] - exact Submodule.add_mem _ ihu ihv - refine isGraded_iff_forall_mem.mpr fun z => ?_ - rw [show z = ((z.1, (0 : N))) + (((0 : M), z.2)) from by ext <;> simp] - exact Submodule.add_mem _ (hleft z.1) (hright z.2) - -/-! - -### Algebras generated in degree one - --/ - -variable {A : Type*} [Ring A] [Algebra K A] - -lemma one_mem_space {rep : Representation K SL(2,ℂ) A} (hone : ∀ Λ, rep Λ 1 = 1) : - (1 : A) ∈ space rep i 0 := fun t _ => by rw [hone, zpow_zero, one_smul] - -lemma mul_mem_space {rep : Representation K SL(2,ℂ) A} - (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) - {a b : ℤ} {x y : A} (hx : x ∈ space rep i a) (hy : y ∈ space rep i b) : - x * y ∈ space rep i (a + b) := by - intro t ht - rw [hmul, hx t ht, hy t ht, smul_mul_smul_comm, - zpow_add₀ (algebraMap_ne_zero (K := K) ht)] - -lemma mul_mem_weightSpan {rep : Representation K SL(2,ℂ) A} - (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) - {x y : A} (hx : x ∈ weightSpan rep i) (hy : y ∈ weightSpan rep i) : - x * y ∈ weightSpan rep i := by - induction hx using Submodule.iSup_induction' with - | mem a u hu => - induction hy using Submodule.iSup_induction' with - | mem b v hv => exact mem_weightSpan_of_mem_space (mul_mem_space hmul hu hv) - | zero => rw [mul_zero]; exact Submodule.zero_mem _ - | add v w _ _ ihv ihw => rw [mul_add]; exact Submodule.add_mem _ ihv ihw - | zero => rw [zero_mul]; exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => rw [add_mul]; exact Submodule.add_mem _ ihu ihv - -lemma algebraMap_mem_weightSpan {rep : Representation K SL(2,ℂ) A} - (hone : ∀ Λ, rep Λ 1 = 1) (r : K) : algebraMap K A r ∈ weightSpan rep i := by - rw [Algebra.algebraMap_eq_smul_one] - exact Submodule.smul_mem _ _ (mem_weightSpan_of_mem_space (one_mem_space hone)) - -/-- A symmetric algebra is boost-graded as soon as its degree-one part is. -/ -lemma isGraded_symmetricAlgebra {V : Type*} [AddCommGroup V] [Module K V] - {repV : Representation K SL(2,ℂ) V} - {repA : Representation K SL(2,ℂ) (SymmetricAlgebra K V)} - (hone : ∀ Λ, repA Λ 1 = 1) - (hmul : ∀ (Λ : SL(2,ℂ)) (x y : SymmetricAlgebra K V), - repA Λ (x * y) = repA Λ x * repA Λ y) - (hι : ∀ (Λ : SL(2,ℂ)) (x : V), - repA Λ (SymmetricAlgebra.ι K V x) = SymmetricAlgebra.ι K V (repV Λ x)) - (hV : IsGraded repV i) : IsGraded repA i := by - refine isGraded_iff_forall_mem.mpr fun x => ?_ - induction x using SymmetricAlgebra.induction with - | algebraMap r => exact algebraMap_mem_weightSpan hone r - | ι v => - have hv := mem_weightSpan_of_isGraded hV v - induction hv using Submodule.iSup_induction' with - | mem a u hu => - refine mem_weightSpan_of_mem_space (w := a) fun t ht => ?_ - rw [hι, hu t ht, map_smul] - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv - | mul u v ihu ihv => exact mul_mem_weightSpan hmul ihu ihv - | add u v ihu ihv => exact Submodule.add_mem _ ihu ihv - -/-- An exterior algebra is boost-graded as soon as its degree-one part is. -/ -lemma isGraded_exteriorAlgebra {V : Type*} [AddCommGroup V] [Module K V] - {repV : Representation K SL(2,ℂ) V} - {repA : Representation K SL(2,ℂ) (ExteriorAlgebra K V)} - (hone : ∀ Λ, repA Λ 1 = 1) - (hmul : ∀ (Λ : SL(2,ℂ)) (x y : ExteriorAlgebra K V), - repA Λ (x * y) = repA Λ x * repA Λ y) - (hι : ∀ (Λ : SL(2,ℂ)) (x : V), - repA Λ (ExteriorAlgebra.ι K x) = ExteriorAlgebra.ι K (repV Λ x)) - (hV : IsGraded repV i) : IsGraded repA i := by - refine isGraded_iff_forall_mem.mpr fun x => ?_ - induction x using ExteriorAlgebra.induction with - | algebraMap r => exact algebraMap_mem_weightSpan hone r - | ι v => - have hv := mem_weightSpan_of_isGraded hV v - induction hv using Submodule.iSup_induction' with - | mem a u hu => - refine mem_weightSpan_of_mem_space (w := a) fun t ht => ?_ - rw [hι, hu t ht, map_smul] - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv - | mul u v ihu ihv => exact mul_mem_weightSpan hmul ihu ihv - | add u v ihu ihv => exact Submodule.add_mem _ ihu ihv - -/-! - -### The light-cone eigenbasis of a spacetime-indexed space - --/ - -/-- A space with a basis indexed by spacetime directions transforming by the columns of the - Lorentz matrix is boost-graded: the light-cone combinations `b₀ ∓ b₃` are eigenvectors of - weight `±2` and the transverse directions are invariant. -/ -lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} - (b : Module.Basis (Fin 1 ⊕ Fin 3) K M) - (h : ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), rep Λ (b μ) = - ∑ j, algebraMap ℝ K ((Lorentz.SL2C.toLorentzGroup Λ).1 j μ) • b j) : - IsGraded rep 2 := by - haveI : CharZero K := charZero_of_injective_algebraMap (algebraMap ℝ K).injective - have key : ∀ (t : ℝ) (ht : t ≠ 0) (μ : Fin 1 ⊕ Fin 3), - rep (boostAxis 2 t ht) (b μ) = - ∑ j, algebraMap ℝ K (boostMatZ t j μ) • b j := by - intro t ht μ - rw [h] - exact Finset.sum_congr rfl fun j _ => by - rw [show boostAxis 2 t ht = boostZel t ht from rfl, toLorentzGroup_boostZel] - have hplus : b (Sum.inl 0) - b (Sum.inr 2) ∈ space rep 2 2 := by - intro t ht - have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht - rw [map_sub, key t ht, key t ht] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, - map_add, map_pow, map_inv₀, map_ofNat, map_neg] - match_scalars <;> (field_simp; try ring_nf; try norm_num) - have hminus : b (Sum.inl 0) + b (Sum.inr 2) ∈ space rep 2 (-2) := by - intro t ht - have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht - rw [map_add, key t ht, key t ht] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, - map_add, map_pow, map_inv₀, map_ofNat, map_neg] - match_scalars <;> (field_simp; try ring_nf; try norm_num) - have htr : ∀ i' : Fin 3, i' = 0 ∨ i' = 1 → b (Sum.inr i') ∈ space rep 2 0 := by - rintro i (rfl | rfl) <;> - · intro t ht - rw [key t ht] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, zpow_zero] - refine isGraded_of_basis b fun μ => ?_ - match μ with - | Sum.inl 0 => - rw [show b (Sum.inl 0) = (2⁻¹ : K) • ((b (Sum.inl 0) - b (Sum.inr 2)) - + (b (Sum.inl 0) + b (Sum.inr 2))) from by match_scalars <;> (field_simp; try ring)] - exact Submodule.smul_mem _ _ (Submodule.add_mem _ - (mem_weightSpan_of_mem_space hplus) (mem_weightSpan_of_mem_space hminus)) - | Sum.inr 0 => exact mem_weightSpan_of_mem_space (htr 0 (Or.inl rfl)) - | Sum.inr 1 => exact mem_weightSpan_of_mem_space (htr 1 (Or.inr rfl)) - | Sum.inr 2 => - rw [show b (Sum.inr 2) = (2⁻¹ : K) • ((b (Sum.inl 0) + b (Sum.inr 2)) - - (b (Sum.inl 0) - b (Sum.inr 2))) from by match_scalars <;> (field_simp; try ring)] - exact Submodule.smul_mem _ _ (Submodule.sub_mem _ - (mem_weightSpan_of_mem_space hminus) (mem_weightSpan_of_mem_space hplus)) - -/-! - -### Base change from the real to the complex scalars - --/ - -lemma isGraded_baseChange {A : Type*} [AddCommGroup A] [Module ℝ A] - {repR : Representation ℝ SL(2,ℂ) A} {repC : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] A)} - (h : ∀ (Λ : SL(2,ℂ)) (c : ℂ) (y : A), repC Λ (c ⊗ₜ[ℝ] y) = c ⊗ₜ[ℝ] repR Λ y) - (hR : IsGraded repR i) : IsGraded repC i := by - have htmul : ∀ (c : ℂ) (w : ℤ) (y : A), y ∈ space repR i w → - (c ⊗ₜ[ℝ] y : ℂ ⊗[ℝ] A) ∈ space repC i w := by - intro c w y hy t ht - rw [h, hy t ht, TensorProduct.tmul_smul, - show ((algebraMap ℝ ℝ) t) ^ w = t ^ w from by simp, - ← algebraMap_smul (R := ℝ) ℂ (t ^ w) (c ⊗ₜ[ℝ] y), map_zpow₀] - refine isGraded_iff_forall_mem.mpr fun z => ?_ - induction z using TensorProduct.induction_on with - | zero => exact Submodule.zero_mem _ - | add u v hu hv => exact Submodule.add_mem _ hu hv - | tmul c y => - have hy := mem_weightSpan_of_isGraded hR y - induction hy using Submodule.iSup_induction' with - | mem w u hu => exact mem_weightSpan_of_mem_space (htmul c w u hu) - | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv - - -/-! - -### Transport between the three axes - --/ - -/-- The axis boosts are conjugate, so being graded for one of them is being graded for all. -/ -lemma isGraded_of_isGraded_two {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep 2) - (i : Fin 3) : IsGraded rep i := by - obtain ⟨R, hR⟩ := exists_conj_boostAxis i - have hsurj : ∀ x : M, rep R (rep R⁻¹ x) = x := by - intro x - rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] - have hmap : ∀ (w : ℤ) (u : M), u ∈ space rep 2 w → rep R u ∈ space rep i w := by - intro w u hu t ht - rw [← Module.End.mul_apply, ← map_mul, hR t ht, inv_mul_cancel_right, map_mul, - Module.End.mul_apply, hu t ht, map_smul] - refine isGraded_iff_forall_mem.mpr fun x => ?_ - obtain ⟨y, rfl⟩ : ∃ y, rep R y = x := ⟨rep R⁻¹ x, hsurj x⟩ - have hy := mem_weightSpan_of_isGraded h y - induction hy using Submodule.iSup_induction' with - | mem w u hu => exact mem_weightSpan_of_mem_space (hmap w u hu) - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv - -end BoostWeight - -/-! - ## C. The component spaces are boost-graded Each layer of the jet algebra is graded once the layer below it is: the two four-dimensional @@ -626,7 +196,7 @@ lemma isGraded_leptonSingletDual : IsGraded (LeptonSinglet.repLorentzGroup.dual) refine isGraded_of_basis LeptonSinglet.basis.dualBasis fun α => ?_ match α with | 0 => - refine mem_weightSpan_of_mem_space (w := -1) fun t ht => ?_ + refine mem_weightSpan_of_mem_boostWeightSubmodule (w := -1) fun t ht => ?_ rw [show boostAxis 2 t ht = boostZel t ht from rfl, LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, @@ -636,7 +206,7 @@ lemma isGraded_leptonSingletDual : IsGraded (LeptonSinglet.repLorentzGroup.dual) rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] rfl | 1 => - refine mem_weightSpan_of_mem_space (w := 1) fun t ht => ?_ + refine mem_weightSpan_of_mem_boostWeightSubmodule (w := 1) fun t ht => ?_ rw [show boostAxis 2 t ht = boostZel t ht from rfl, LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, @@ -652,7 +222,7 @@ lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.c refine isGraded_of_basis LeptonSinglet.basis.conj.dualBasis fun α => ?_ match α with | 0 => - refine mem_weightSpan_of_mem_space (w := -1) fun t ht => ?_ + refine mem_weightSpan_of_mem_boostWeightSubmodule (w := -1) fun t ht => ?_ rw [show boostAxis 2 t ht = boostZel t ht from rfl, LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, @@ -661,7 +231,7 @@ lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.c rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] rfl | 1 => - refine mem_weightSpan_of_mem_space (w := 1) fun t ht => ?_ + refine mem_weightSpan_of_mem_boostWeightSubmodule (w := 1) fun t ht => ?_ rw [show boostAxis 2 t ht = boostZel t ht from rfl, LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, @@ -698,6 +268,13 @@ open BoostWeight in lemma isGraded_jetAlgebra : IsGraded (repLorentzGroup) 2 := isGraded_tprod isGraded_complexBBosonJetAlgebra isGraded_leptonJetAlgebra +/-- **The lepton–gauge-sector jet algebra is boost-graded**: the Lorentz action is by algebra + automorphisms, and along every axis the weight spaces span, by the descent of section C + transported between the axes. -/ +instance : BoostWeight.IsBoostGraded (repLorentzGroup) := + ⟨repLorentzGroup_apply_one, repLorentzGroup_apply_mul, + fun i => BoostWeight.isGraded_of_isGraded_two isGraded_jetAlgebra i⟩ + /-! ## D. The boost-weight submodules @@ -710,38 +287,9 @@ variable {i : Fin 3} presents it. -/ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl -/-- The submodule of elements of boost weight `k` along the `i`-th spatial axis: those scaling - by `t ^ k` under the boost with parameter `t`. -/ -noncomputable def boostWeightSubmodule (i : Fin 3) (k : ℤ) : Submodule ℂ JetAlgebra := - BoostWeight.space repLorentzGroup i k - -lemma mem_boostWeightSubmodule {k : ℤ} {x : JetAlgebra} : - x ∈ boostWeightSubmodule i k ↔ ∀ (t : ℝ) (ht : t ≠ 0), - repLorentzGroup (boostAxis i t ht) x = (((t : ℝ) : ℂ) ^ k) • x := Iff.rfl - -/-- The unit has boost weight zero. -/ -lemma one_mem_boostWeightSubmodule : (1 : JetAlgebra) ∈ boostWeightSubmodule i 0 := - BoostWeight.one_mem_space repLorentzGroup_apply_one - -/-- Boost weights add under multiplication. -/ -lemma mul_mem_boostWeightSubmodule {k l : ℤ} {x y : JetAlgebra} - (hx : x ∈ boostWeightSubmodule i k) (hy : y ∈ boostWeightSubmodule i l) : - x * y ∈ boostWeightSubmodule i (k + l) := - BoostWeight.mul_mem_space repLorentzGroup_apply_mul hx hy - -/-- Boost weights add under multiplication, with the sum of the weights given explicitly. -/ -lemma mul_mem_boostWeightSubmodule' {k l n : ℤ} {x y : JetAlgebra} - (hx : x ∈ boostWeightSubmodule i k) (hy : y ∈ boostWeightSubmodule i l) - (hkl : k + l = n) : x * y ∈ boostWeightSubmodule i n := - hkl ▸ mul_mem_boostWeightSubmodule hx hy - -instance : SetLike.GradedMonoid (boostWeightSubmodule i) where - one_mem := one_mem_boostWeightSubmodule - mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy - /-- A Lorentz-invariant element has boost weight zero, along every axis. -/ lemma mem_boostWeightSubmodule_zero_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : - x ∈ boostWeightSubmodule i 0 := + x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i 0 := fun t ht => by rw [hx.2 (boostAxis i t ht), zpow_zero, one_smul] /-! @@ -757,7 +305,7 @@ the one along it — `F_{0z}` — are invariant. /-- The light-cone combination `F_{0x} - F_{zx}` has boost weight `2`. -/ lemma fieldStrengthDeriv_lightCone_mem_two : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule 2 2 := by + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by intro t ht simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -772,7 +320,7 @@ lemma fieldStrengthDeriv_lightCone_mem_two : /-- The light-cone combination `F_{0x} + F_{zx}` has boost weight `-2`. -/ lemma fieldStrengthDeriv_lightCone_mem_neg_two : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ boostWeightSubmodule 2 (-2) := by + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by intro t ht simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -786,7 +334,7 @@ lemma fieldStrengthDeriv_lightCone_mem_neg_two : /-- The transverse component `F_{xy}` has boost weight zero. -/ lemma fieldStrengthDeriv_transverse_mem_zero : - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ boostWeightSubmodule 2 0 := by + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by intro t ht simp only [algebraMap_real_complex] rw [repLorentzGroup_fieldStrengthDeriv_nil] @@ -797,7 +345,7 @@ lemma fieldStrengthDeriv_transverse_mem_zero : match_scalars; norm_num /-- The zeroth-order lepton coordinate `ψ_0` has boost weight `-1`. -/ -lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ boostWeightSubmodule 2 (-1) := by +lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := by intro t ht simp only [algebraMap_real_complex] rw [boostAxis_two, repLorentzGroup_Dψ_nil, boostZel_inv_coe] @@ -808,7 +356,7 @@ lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ boostWeightSubmodule 2 (-1) := by rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] /-- The zeroth-order lepton coordinate `ψ_1` has boost weight `1`. -/ -lemma Dψ_nil_one_mem_one : Dψ [] 1 ∈ boostWeightSubmodule 2 1 := by +lemma Dψ_nil_one_mem_one : Dψ [] 1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by intro t ht simp only [algebraMap_real_complex] rw [boostAxis_two, repLorentzGroup_Dψ_nil, boostZel_inv_coe] @@ -819,7 +367,7 @@ lemma Dψ_nil_one_mem_one : Dψ [] 1 ∈ boostWeightSubmodule 2 1 := by rw [zpow_one] /-- The zeroth-order conjugate lepton coordinate `ψ̄_0` has boost weight `-1`. -/ -lemma Dbarψ_nil_zero_mem_neg_one : Dbarψ [] 0 ∈ boostWeightSubmodule 2 (-1) := by +lemma Dbarψ_nil_zero_mem_neg_one : Dbarψ [] 0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := by intro t ht simp only [algebraMap_real_complex] rw [boostAxis_two, repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] @@ -829,7 +377,7 @@ lemma Dbarψ_nil_zero_mem_neg_one : Dbarψ [] 0 ∈ boostWeightSubmodule 2 (-1) rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] /-- The zeroth-order conjugate lepton coordinate `ψ̄_1` has boost weight `1`. -/ -lemma Dbarψ_nil_one_mem_one : Dbarψ [] 1 ∈ boostWeightSubmodule 2 1 := by +lemma Dbarψ_nil_one_mem_one : Dbarψ [] 1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by intro t ht simp only [algebraMap_real_complex] rw [boostAxis_two, repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] @@ -841,7 +389,7 @@ lemma Dbarψ_nil_one_mem_one : Dbarψ [] 1 ∈ boostWeightSubmodule 2 1 := by /-- The gauge potential in the light-cone direction, `B_0 - B_z`, has boost weight `2`. -/ lemma B_lightCone_mem_two : [JetGenerators.dB {} (Sum.inl 0)]ₐ - [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ - boostWeightSubmodule 2 2 := by + BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by intro t ht simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -855,7 +403,7 @@ lemma B_lightCone_mem_two : /-- The gauge potential in the other light-cone direction has boost weight `-2`. -/ lemma B_lightCone_mem_neg_two : [JetGenerators.dB {} (Sum.inl 0)]ₐ + [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ - boostWeightSubmodule 2 (-2) := by + BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by intro t ht simp only [algebraMap_real_complex] have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht @@ -878,126 +426,19 @@ span, is section C. -/ -/-- The weight submodule of weight `k` sits inside the `2 ^ k` eigenspace of the boost at - parameter two. -/ -lemma boostWeightSubmodule_le_eigenspace (k : ℤ) : - boostWeightSubmodule i k ≤ - Module.End.eigenspace (repLorentzGroup (boostAxis i 2 two_ne_zero)) ((2 : ℂ) ^ k) := by - intro x hx - rw [Module.End.mem_eigenspace_iff] - have h := hx 2 two_ne_zero - norm_num at h ⊢ - exact h - -private lemma zpow_two_injective : Function.Injective (fun k : ℤ => ((2 : ℂ) ^ k)) := by - have hcast : ∀ k : ℤ, ((2 : ℂ) ^ k) = (((2 : ℝ) ^ k : ℝ) : ℂ) := by - intro k - rw [Complex.ofReal_zpow] - norm_num - intro a b hab - simp only [hcast] at hab - exact zpow_right_injective₀ (by norm_num) (by norm_num) (Complex.ofReal_injective hab) - -/-- The boost-weight submodules are independent: a decomposition into homogeneous parts is - unique when it exists. -/ -lemma boostWeightSubmodule_iSupIndep : iSupIndep (boostWeightSubmodule i) := - ((Module.End.eigenspaces_iSupIndep - (repLorentzGroup (boostAxis i 2 two_ne_zero) : Module.End ℂ JetAlgebra)).comp - zpow_two_injective).mono boostWeightSubmodule_le_eigenspace - -/-- Recover the two summands from the sum and difference: if `u + v` and `u - v` lie in a - submodule then so do `u` and `v`. This inverts the passage from a pair of homogeneous - elements to the pair of their sum and difference, which is used to present the weight-zero - generators. -/ -lemma mem_of_add_mem_of_sub_mem {p : Submodule ℂ JetAlgebra} {u v : JetAlgebra} - (h₁ : u + v ∈ p) (h₂ : u - v ∈ p) : u ∈ p ∧ v ∈ p := by - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ h₁) (Submodule.smul_mem _ _ h₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ h₁) (Submodule.smul_mem _ _ h₂) - -/-- Multiply a two-term linear decomposition into a submodule: if `a * u` and `a * v` lie in a - submodule then so does `a * y` for `y` any combination of `u` and `v`. -/ -lemma mul_mem_of_eq_smul_add_smul {p : Submodule ℂ JetAlgebra} {a u v y : JetAlgebra} - (c d : ℂ) (hu : a * u ∈ p) (hv : a * v ∈ p) (hy : y = c • u + d • v) : a * y ∈ p := by - subst hy - rw [mul_add, mul_smul_comm, mul_smul_comm] - exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) - -/-- A product of two submodules of pure weights `k` and `l` with `k + l ≠ n` lands in the span - of the weights other than `n`. -/ -lemma mul_le_iSup_boostWeightSubmodule_of_ne {X Y : Submodule ℂ JetAlgebra} {k l n : ℤ} - (hX : X ≤ boostWeightSubmodule i k) (hY : Y ≤ boostWeightSubmodule i l) - (h : k + l ≠ n) : - X * Y ≤ ⨆ (j : ℤ) (_ : j ≠ n), boostWeightSubmodule i j := - Submodule.mul_le.2 fun _ hx _ hy => Submodule.mem_iSup_of_mem (k + l) - (Submodule.mem_iSup_of_mem h (mul_mem_boostWeightSubmodule (hX hx) (hY hy))) - -/-- **Extracting the weight-`k` part of a submodule.** If `V` contains a submodule `S` of pure - weight `k` and is contained in `S` together with the other weights, then the weight-`k` part - of `V` is exactly `S`. This is the modular law of the submodule lattice combined with the - independence of the weight submodules; it is the general skeleton behind the computations of - the weight-zero parts of the spans of kinetic-term monomials. -/ -lemma boostWeightSubmodule_inf_eq {k : ℤ} {S V : Submodule ℂ JetAlgebra} - (hS0 : S ≤ boostWeightSubmodule i k) (hSV : S ≤ V) - (hV : V ≤ S ⊔ ⨆ (j : ℤ) (_ : j ≠ k), boostWeightSubmodule i j) : - boostWeightSubmodule i k ⊓ V = S := by - refine le_antisymm ((inf_le_inf_left _ hV).trans ?_) (le_inf hS0 hSV) - rw [inf_comm, sup_inf_assoc_of_le _ hS0, - disjoint_iff.mp (boostWeightSubmodule_iSupIndep (i := i) k).symm, sup_bot_eq] - -/-- **Extracting the weight-`k` part of a span of homogeneous elements.** If a submodule `V` is - sandwiched between `span ℂ S` and `span ℂ (S ∪ T)`, where the elements of `S` have weight `k` - and the elements of `T` have some weight other than `k`, then the weight-`k` part of `V` is - exactly `span ℂ S`. A theorem about the weight-`k` part of a span of monomials reduces to - exhibiting the weights of a homogeneous generating set. -/ -lemma boostWeightSubmodule_inf_eq_span {k : ℤ} {S T : Set JetAlgebra} - {V : Submodule ℂ JetAlgebra} - (hS : ∀ x ∈ S, x ∈ boostWeightSubmodule i k) - (hT : ∀ x ∈ T, ∃ j ≠ k, x ∈ boostWeightSubmodule i j) - (hSV : Submodule.span ℂ S ≤ V) (hV : V ≤ Submodule.span ℂ (S ∪ T)) : - boostWeightSubmodule i k ⊓ V = Submodule.span ℂ S := by - refine boostWeightSubmodule_inf_eq (Submodule.span_le.2 hS) hSV (hV.trans ?_) - rw [Submodule.span_union] - refine sup_le le_sup_left (le_sup_of_le_right (Submodule.span_le.2 ?_)) - intro x hx - obtain ⟨j, hj, hxj⟩ := hT x hx - exact Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem hj hxj) - /-! ## G. The span of the homogeneous elements is a subalgebra -/ -/-- The span of the homogeneous elements contains one. -/ -lemma one_mem_iSup_boostWeightSubmodule : - (1 : JetAlgebra) ∈ ⨆ k, boostWeightSubmodule i k := - Submodule.mem_iSup_of_mem 0 one_mem_boostWeightSubmodule - -/-- The span of the homogeneous elements is closed under multiplication. -/ -lemma mul_mem_iSup_boostWeightSubmodule {x y : JetAlgebra} - (hx : x ∈ ⨆ k, boostWeightSubmodule i k) (hy : y ∈ ⨆ k, boostWeightSubmodule i k) : - x * y ∈ ⨆ k, boostWeightSubmodule i k := by - induction hx using Submodule.iSup_induction' with - | mem k a ha => - induction hy using Submodule.iSup_induction' with - | mem l b hb => - exact Submodule.mem_iSup_of_mem (k + l) (mul_mem_boostWeightSubmodule ha hb) - | zero => rw [mul_zero]; exact Submodule.zero_mem _ - | add b c _ _ ihb ihc => rw [mul_add]; exact Submodule.add_mem _ ihb ihc - | zero => rw [zero_mul]; exact Submodule.zero_mem _ - | add a b _ _ iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb - /-- The homogeneous elements span a subalgebra of the jet algebra. -/ noncomputable def boostWeightSubalgebra (i : Fin 3) : Subalgebra ℂ JetAlgebra := - Submodule.toSubalgebra (⨆ k, boostWeightSubmodule i k) one_mem_iSup_boostWeightSubmodule - fun _ _ hx hy => mul_mem_iSup_boostWeightSubmodule hx hy + BoostWeight.subalgebra repLorentzGroup i @[simp] lemma mem_boostWeightSubalgebra {x : JetAlgebra} : - x ∈ boostWeightSubalgebra i ↔ x ∈ ⨆ k, boostWeightSubmodule i k := Iff.rfl + x ∈ boostWeightSubalgebra i ↔ x ∈ ⨆ k, BoostWeight.boostWeightSubmodule repLorentzGroup i k := Iff.rfl /-- The homogeneous span contains the whole bosonic factor once it contains the generators. -/ private lemma inclB_mem_boostWeightSubalgebra @@ -1094,65 +535,29 @@ theorem boostWeightSubalgebra_eq_top_of_forall_ofGenerator exact Subalgebra.mul_mem _ (inclB_mem_boostWeightSubalgebra h a) (inclL_mem_boostWeightSubalgebra h b) -/-- The decomposition of the jet algebra into boost-weight spaces is internal exactly when the - homogeneous elements span. Independence always holds, so this isolates the one remaining - obligation: that every element is a finite sum of boost eigenvectors. -/ -theorem boostWeightSubmodule_isInternal_iff : - DirectSum.IsInternal (boostWeightSubmodule i) ↔ (⨆ k, boostWeightSubmodule i k) = ⊤ := by - rw [DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top] - exact ⟨And.right, fun h => ⟨boostWeightSubmodule_iSupIndep, h⟩⟩ - -/-- The homogeneous elements span a subalgebra which the boost weights grade internally: the - decomposition into weights is defined on it and is unique. -/ -theorem boostWeightSubmodule_isInternal_of_top - (h : (⨆ k, boostWeightSubmodule i k) = ⊤) : DirectSum.IsInternal (boostWeightSubmodule i) := - boostWeightSubmodule_isInternal_iff.mpr h - /-! ## J. The grading -The weight submodules are independent (`boostWeightSubmodule_iSupIndep`) and, by the descent +The weight submodules are independent (`BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup`) and, by the descent through the component spaces of section C transported along section A, they span. So they decompose the jet algebra internally along every axis, and together with the graded-monoid structure of section D they make it a graded algebra three times over. -/ -/-- The homogeneous elements span the jet algebra, for every axis. -/ -theorem iSup_boostWeightSubmodule_eq_top (i : Fin 3) : - (⨆ k, boostWeightSubmodule i k) = ⊤ := - BoostWeight.isGraded_of_isGraded_two isGraded_jetAlgebra i - /-- Every generator is a finite sum of boost eigenvectors, for every axis. -/ theorem ofGenerator_mem_boostWeightSubalgebra (i : Fin 3) (j : JetGenerators) : [j]ₐ ∈ boostWeightSubalgebra i := by - rw [mem_boostWeightSubalgebra, iSup_boostWeightSubmodule_eq_top] + rw [mem_boostWeightSubalgebra, BoostWeight.iSup_boostWeightSubmodule_eq_top repLorentzGroup] trivial -/-- **The boost weight grades the jet algebra.** For each axis the weight submodules decompose - it as an internal direct sum: every element is a finite sum of boost eigenvectors, uniquely. -/ -theorem boostWeightSubmodule_isInternal (i : Fin 3) : - DirectSum.IsInternal (boostWeightSubmodule i) := - boostWeightSubmodule_isInternal_iff.mpr (iSup_boostWeightSubmodule_eq_top i) - -/-- The decomposition of an element of the jet algebra into its boost-weight components. -/ -noncomputable instance (i : Fin 3) : DirectSum.Decomposition (boostWeightSubmodule i) := - (boostWeightSubmodule_isInternal i).chooseDecomposition - -/-- **The jet algebra is a graded algebra for the boost weight along each axis.** Weights add - under multiplication, the unit is neutral, and the weight components decompose every - element. -/ -noncomputable instance (i : Fin 3) : GradedAlgebra (boostWeightSubmodule i) where - one_mem := one_mem_boostWeightSubmodule - mul_mem _ _ _ _ hx hy := mul_mem_boostWeightSubmodule hx hy - /-! ## K. The projection onto a boost weight The grading of section J writes every element as a *unique* finite sum of homogeneous ones, so it -supplies a projection onto each weight, `boostProj i k` — in particular onto boost weight zero, +supplies a projection onto each weight, `BoostWeight.boostProj repLorentzGroup i k` — in particular onto boost weight zero, where the invariants live. The projection is exact, for every weight and every element. What it is not is a formula in the @@ -1163,80 +568,15 @@ projection correctly across a bounded range of weights. -/ -/-- The projection of the jet algebra onto its part of boost weight `k` along the `i`-th axis, - read off from the boost-weight decomposition. -/ -noncomputable def boostProj (i : Fin 3) (k : ℤ) : JetAlgebra →ₗ[ℂ] JetAlgebra := - (boostWeightSubmodule i k).subtype ∘ₗ - DirectSum.component ℂ ℤ (fun k => (boostWeightSubmodule i k : Submodule ℂ JetAlgebra)) k ∘ₗ - (DirectSum.decomposeLinearEquiv (boostWeightSubmodule i)).toLinearMap - -lemma boostProj_apply (i : Fin 3) (k : ℤ) (x : JetAlgebra) : - boostProj i k x = (DirectSum.decompose (boostWeightSubmodule i) x k : JetAlgebra) := rfl - -/-- The projection lands in the weight it projects onto. -/ -lemma boostProj_mem (i : Fin 3) (k : ℤ) (x : JetAlgebra) : - boostProj i k x ∈ boostWeightSubmodule i k := - (DirectSum.decompose (boostWeightSubmodule i) x k).2 - -/-- On an element of weight `k` the weight-`k` projection is the identity. -/ -@[simp] -lemma boostProj_of_mem {i : Fin 3} {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule i k) : boostProj i k x = x := - DirectSum.decompose_of_mem_same _ hx - -/-- On an element of another weight the projection vanishes. -/ -lemma boostProj_of_mem_ne {i : Fin 3} {k l : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule i l) (hlk : l ≠ k) : boostProj i k x = 0 := - DirectSum.decompose_of_mem_ne _ hx hlk - -/-- An element is of weight `k` exactly when the weight-`k` projection fixes it. -/ -lemma boostProj_eq_self_iff {i : Fin 3} {k : ℤ} {x : JetAlgebra} : - boostProj i k x = x ↔ x ∈ boostWeightSubmodule i k := - ⟨fun h => h ▸ boostProj_mem i k x, boostProj_of_mem⟩ - -/-- The projections are idempotent. -/ -@[simp] -lemma boostProj_boostProj (i : Fin 3) (k : ℤ) (x : JetAlgebra) : - boostProj i k (boostProj i k x) = boostProj i k x := - boostProj_of_mem (boostProj_mem i k x) - -/-- Distinct projections are orthogonal. -/ -lemma boostProj_boostProj_of_ne {i : Fin 3} {k l : ℤ} (hlk : l ≠ k) (x : JetAlgebra) : - boostProj i k (boostProj i l x) = 0 := - boostProj_of_mem_ne (boostProj_mem i l x) hlk - -/-- The image of the weight-`k` projection is the weight-`k` submodule. -/ -lemma range_boostProj (i : Fin 3) (k : ℤ) : - LinearMap.range (boostProj i k) = boostWeightSubmodule i k := by - refine le_antisymm (LinearMap.range_le_iff_comap.mpr (le_top.antisymm fun x _ => ?_)) fun x hx => - ⟨x, boostProj_of_mem hx⟩ - exact boostProj_mem i k x - /-- An invariant is fixed by the weight-zero projection, along every axis. -/ lemma boostProj_zero_of_isInvariant (i : Fin 3) {x : JetAlgebra} (hx : IsInvariant x) : - boostProj i 0 x = x := - boostProj_of_mem (mem_boostWeightSubmodule_zero_of_isInvariant hx) + BoostWeight.boostProj repLorentzGroup i 0 x = x := + BoostWeight.boostProj_of_mem repLorentzGroup (mem_boostWeightSubmodule_zero_of_isInvariant hx) /-- An invariant has no component of nonzero weight. -/ lemma boostProj_of_isInvariant_ne {i : Fin 3} {k : ℤ} (hk : (0 : ℤ) ≠ k) {x : JetAlgebra} - (hx : IsInvariant x) : boostProj i k x = 0 := - boostProj_of_mem_ne (mem_boostWeightSubmodule_zero_of_isInvariant hx) hk - -/-- The weight-`k` projection fixes a submodule of pure weight `k`. -/ -lemma map_boostProj_of_le {i : Fin 3} {k : ℤ} {W : Submodule ℂ JetAlgebra} - (h : W ≤ boostWeightSubmodule i k) : W.map (boostProj i k) = W := by - refine le_antisymm ?_ fun x hx => ⟨x, hx, boostProj_of_mem (h hx)⟩ - rintro _ ⟨x, hx, rfl⟩ - rw [boostProj_of_mem (h hx)] - exact hx - -/-- The weight-`k` projection annihilates a submodule of pure weight `l ≠ k`. -/ -lemma map_boostProj_of_le_ne {i : Fin 3} {k l : ℤ} {W : Submodule ℂ JetAlgebra} - (h : W ≤ boostWeightSubmodule i l) (hlk : l ≠ k) : W.map (boostProj i k) = ⊥ := by - rw [eq_bot_iff] - rintro _ ⟨x, hx, rfl⟩ - rw [boostProj_of_mem_ne (h hx) hlk] - exact zero_mem ⊥ + (hx : IsInvariant x) : BoostWeight.boostProj repLorentzGroup i k x = 0 := + BoostWeight.boostProj_of_mem_ne repLorentzGroup (mem_boostWeightSubmodule_zero_of_isInvariant hx) hk /-! @@ -1258,8 +598,8 @@ set_option linter.unusedSimpArgs false /-- A transverse derivative leaves the `x`-boost weight alone. -/ private lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 0) - (hx : x ∈ boostWeightSubmodule 0 k) : - jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule 0 k := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : + jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k := by intro t ht rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] fin_cases j @@ -1275,8 +615,8 @@ private lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (h /-- A transverse derivative leaves the `y`-boost weight alone. -/ private lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 1) - (hx : x ∈ boostWeightSubmodule 1 k) : - jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule 1 k := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : + jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k := by intro t ht rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] fin_cases j @@ -1292,8 +632,8 @@ private lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (h /-- A transverse derivative leaves the `z`-boost weight alone. -/ private lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 2) - (hx : x ∈ boostWeightSubmodule 2 k) : - jetDeriv (Sum.inr j) x ∈ boostWeightSubmodule 2 k := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : + jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k := by intro t ht rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] fin_cases j @@ -1309,8 +649,8 @@ private lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (h /-- The light-cone derivative `∂_0 - ∂_x` raises the `x`-boost weight by two. -/ private lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule 0 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k + 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k + 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] @@ -1324,8 +664,8 @@ private lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} /-- The light-cone derivative `∂_0 + ∂_x` lowers the `x`-boost weight by two. -/ private lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule 0 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ boostWeightSubmodule 0 (k - 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k - 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] @@ -1339,8 +679,8 @@ private lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} /-- The light-cone derivative `∂_0 - ∂_y` raises the `y`-boost weight by two. -/ private lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule 1 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k + 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k + 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] @@ -1354,8 +694,8 @@ private lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} /-- The light-cone derivative `∂_0 + ∂_y` lowers the `y`-boost weight by two. -/ private lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule 1 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ boostWeightSubmodule 1 (k - 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k - 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] @@ -1369,8 +709,8 @@ private lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} /-- The light-cone derivative `∂_0 - ∂_z` raises the `z`-boost weight by two. -/ private lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule 2 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k + 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : + jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k + 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] @@ -1384,8 +724,8 @@ private lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} /-- The light-cone derivative `∂_0 + ∂_z` lowers the `z`-boost weight by two. -/ private lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ boostWeightSubmodule 2 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ boostWeightSubmodule 2 (k - 2) := by + (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : + jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k - 2) := by intro t ht have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] @@ -1401,23 +741,11 @@ private lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} the weight-`k` component: the two sides agree on every homogeneous piece, and the pieces span. -/ private lemma boostProj_comm_aux {i : Fin 3} {D : JetAlgebra →ₗ[ℂ] JetAlgebra} (k l : ℤ) - (hD : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → - D y ∈ boostWeightSubmodule i (w + k - l)) + (hD : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → + D y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (w + k - l)) (x : JetAlgebra) : - boostProj i k (D x) = D (boostProj i l x) := by - have hx : x ∈ ⨆ m, boostWeightSubmodule i m := by - rw [iSup_boostWeightSubmodule_eq_top]; trivial - induction hx using Submodule.iSup_induction' with - | mem w y hyw => - have hd := hD hyw - by_cases hwl : w = l - · subst hwl - rw [show w + k - w = k from by ring] at hd - rw [boostProj_of_mem hd, boostProj_of_mem hyw] - · rw [boostProj_of_mem_ne hyw hwl, map_zero, - boostProj_of_mem_ne hd (show w + k - l ≠ k from by omega)] - | zero => simp only [map_zero] - | add y₁ y₂ _ _ ih₁ ih₂ => simp only [map_add, ih₁, ih₂] + BoostWeight.boostProj repLorentzGroup i k (D x) = D (BoostWeight.boostProj repLorentzGroup i l x) := + BoostWeight.boostProj_comm repLorentzGroup k l hD x /-- Two composites agreeing on a submodule have the same double image. -/ private lemma map_map_eq_of_forall_mem {f g f' g' : JetAlgebra →ₗ[ℂ] JetAlgebra} @@ -1465,42 +793,42 @@ private lemma map_jetDeriv_pair_eq_lightCone (i : Fin 3) (V : Submodule ℂ JetA four derivative images redistributes onto the shifted projections of `V`. -/ private lemma boostProj_map_submodule_aux {i t₁ t₂ : Fin 3} (k : ℤ) (V : Submodule ℂ JetAlgebra) - (hpos : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → - jetDeriv (Sum.inl 0) y - jetDeriv (Sum.inr i) y ∈ boostWeightSubmodule i (w + 2)) - (hneg : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → - jetDeriv (Sum.inl 0) y + jetDeriv (Sum.inr i) y ∈ boostWeightSubmodule i (w - 2)) - (ht₁ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → - jetDeriv (Sum.inr t₁) y ∈ boostWeightSubmodule i w) - (ht₂ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ boostWeightSubmodule i w → - jetDeriv (Sum.inr t₂) y ∈ boostWeightSubmodule i w) : + (hpos : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → + jetDeriv (Sum.inl 0) y - jetDeriv (Sum.inr i) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (w + 2)) + (hneg : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → + jetDeriv (Sum.inl 0) y + jetDeriv (Sum.inr i) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (w - 2)) + (ht₁ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → + jetDeriv (Sum.inr t₁) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w) + (ht₂ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → + jetDeriv (Sum.inr t₂) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w) : (V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr i)) + - V.map (jetDeriv (Sum.inr t₁)) + V.map (jetDeriv (Sum.inr t₂))).map (boostProj i k) = - (V.map (boostProj i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) + - (V.map (boostProj i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) + - (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₁)) + - (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₂)) := by - have hlcp : (V.map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i))).map (boostProj i k) = - (V.map (boostProj i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) := by + V.map (jetDeriv (Sum.inr t₁)) + V.map (jetDeriv (Sum.inr t₂))).map (BoostWeight.boostProj repLorentzGroup i k) = + (V.map (BoostWeight.boostProj repLorentzGroup i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) + + (V.map (BoostWeight.boostProj repLorentzGroup i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) + + (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₁)) + + (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₂)) := by + have hlcp : (V.map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i))).map (BoostWeight.boostProj repLorentzGroup i k) = + (V.map (BoostWeight.boostProj repLorentzGroup i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) := by refine map_map_eq_of_forall_mem fun v _ => ?_ refine boostProj_comm_aux k (k - 2) (fun {w} {y} hyw => ?_) v rw [show w + k - (k - 2) = w + 2 from by ring] simp only [LinearMap.sub_apply] exact hpos hyw - have hlcn : (V.map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i))).map (boostProj i k) = - (V.map (boostProj i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) := by + have hlcn : (V.map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i))).map (BoostWeight.boostProj repLorentzGroup i k) = + (V.map (BoostWeight.boostProj repLorentzGroup i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) := by refine map_map_eq_of_forall_mem fun v _ => ?_ refine boostProj_comm_aux k (k + 2) (fun {w} {y} hyw => ?_) v rw [show w + k - (k + 2) = w - 2 from by ring] simp only [LinearMap.add_apply] exact hneg hyw - have hd₁ : (V.map (jetDeriv (Sum.inr t₁))).map (boostProj i k) = - (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₁)) := by + have hd₁ : (V.map (jetDeriv (Sum.inr t₁))).map (BoostWeight.boostProj repLorentzGroup i k) = + (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₁)) := by refine map_map_eq_of_forall_mem fun v _ => ?_ refine boostProj_comm_aux k k (fun {w} {y} hyw => ?_) v rw [show w + k - k = w from by ring] exact ht₁ hyw - have hd₂ : (V.map (jetDeriv (Sum.inr t₂))).map (boostProj i k) = - (V.map (boostProj i k)).map (jetDeriv (Sum.inr t₂)) := by + have hd₂ : (V.map (jetDeriv (Sum.inr t₂))).map (BoostWeight.boostProj repLorentzGroup i k) = + (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₂)) := by refine map_map_eq_of_forall_mem fun v _ => ?_ refine boostProj_comm_aux k k (fun {w} {y} hyw => ?_) v rw [show w + k - k = w from by ring] @@ -1515,11 +843,11 @@ end weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_y`, `∂_z` of its weight-`k` part. -/ lemma boostProj_map_submodule_jetDeriv_x (k : ℤ) (V : Submodule ℂ JetAlgebra) : - (∑ α, V.map (jetDeriv α)).map (boostProj 0 k) = - (V.map (boostProj 0 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 0)) - + (V.map (boostProj 0 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 0)) - + (V.map (boostProj 0 k)).map (jetDeriv (Sum.inr 1)) - + (V.map (boostProj 0 k)).map (jetDeriv (Sum.inr 2)) := by + (∑ α, V.map (jetDeriv α)).map (BoostWeight.boostProj repLorentzGroup 0 k) = + (V.map (BoostWeight.boostProj repLorentzGroup 0 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 0)) + + (V.map (BoostWeight.boostProj repLorentzGroup 0 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 0)) + + (V.map (BoostWeight.boostProj repLorentzGroup 0 k)).map (jetDeriv (Sum.inr 1)) + + (V.map (BoostWeight.boostProj repLorentzGroup 0 k)).map (jetDeriv (Sum.inr 2)) := by rw [show (∑ α, V.map (jetDeriv α)) = V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 0)) + V.map (jetDeriv (Sum.inr 1)) + V.map (jetDeriv (Sum.inr 2)) from by @@ -1535,11 +863,11 @@ lemma boostProj_map_submodule_jetDeriv_x (k : ℤ) (V : Submodule ℂ JetAlgebra weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_x`, `∂_z` of its weight-`k` part. -/ lemma boostProj_map_submodule_jetDeriv_y (k : ℤ) (V : Submodule ℂ JetAlgebra) : - (∑ α, V.map (jetDeriv α)).map (boostProj 1 k) = - (V.map (boostProj 1 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 1)) - + (V.map (boostProj 1 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 1)) - + (V.map (boostProj 1 k)).map (jetDeriv (Sum.inr 0)) - + (V.map (boostProj 1 k)).map (jetDeriv (Sum.inr 2)) := by + (∑ α, V.map (jetDeriv α)).map (BoostWeight.boostProj repLorentzGroup 1 k) = + (V.map (BoostWeight.boostProj repLorentzGroup 1 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 1)) + + (V.map (BoostWeight.boostProj repLorentzGroup 1 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 1)) + + (V.map (BoostWeight.boostProj repLorentzGroup 1 k)).map (jetDeriv (Sum.inr 0)) + + (V.map (BoostWeight.boostProj repLorentzGroup 1 k)).map (jetDeriv (Sum.inr 2)) := by rw [show (∑ α, V.map (jetDeriv α)) = V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 1)) + V.map (jetDeriv (Sum.inr 0)) + V.map (jetDeriv (Sum.inr 2)) from by @@ -1555,11 +883,11 @@ lemma boostProj_map_submodule_jetDeriv_y (k : ℤ) (V : Submodule ℂ JetAlgebra weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_x`, `∂_y` of its weight-`k` part. -/ lemma boostProj_map_submodule_jetDeriv_z (k : ℤ) (V : Submodule ℂ JetAlgebra) : - (∑ α, V.map (jetDeriv α)).map (boostProj 2 k) = - (V.map (boostProj 2 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) - + (V.map (boostProj 2 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) - + (V.map (boostProj 2 k)).map (jetDeriv (Sum.inr 0)) - + (V.map (boostProj 2 k)).map (jetDeriv (Sum.inr 1)) := by + (∑ α, V.map (jetDeriv α)).map (BoostWeight.boostProj repLorentzGroup 2 k) = + (V.map (BoostWeight.boostProj repLorentzGroup 2 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + + (V.map (BoostWeight.boostProj repLorentzGroup 2 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + + (V.map (BoostWeight.boostProj repLorentzGroup 2 k)).map (jetDeriv (Sum.inr 0)) + + (V.map (BoostWeight.boostProj repLorentzGroup 2 k)).map (jetDeriv (Sum.inr 1)) := by rw [show (∑ α, V.map (jetDeriv α)) = V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 2)) + V.map (jetDeriv (Sum.inr 0)) + V.map (jetDeriv (Sum.inr 1)) from by @@ -1576,19 +904,6 @@ lemma boostProj_map_submodule_jetDeriv_z (k : ℤ) (V : Submodule ℂ JetAlgebra -/ -/-- The submodule image of `boostProj i k` is unchanged by projecting again. -/ -lemma map_boostProj_idem (i : Fin 3) (k : ℤ) (X : Submodule ℂ JetAlgebra) : - (X.map (boostProj i k)).map (boostProj i k) = X.map (boostProj i k) := - map_boostProj_of_le (by rintro _ ⟨y, _, rfl⟩; exact boostProj_mem i k y) - -/-- The weight-`k` part of a projection-closed submodule is its `boostProj` image. -/ -lemma inf_boostWeightSubmodule_eq_map {i : Fin 3} {k : ℤ} {X : Submodule ℂ JetAlgebra} - (h : X.map (boostProj i k) ≤ X) : - boostWeightSubmodule i k ⊓ X = X.map (boostProj i k) := by - refine le_antisymm (fun x hx => ⟨x, hx.2, boostProj_of_mem hx.1⟩) (le_inf ?_ h) - rintro _ ⟨y, _, rfl⟩ - exact boostProj_mem i k y - /-- A submodule product with a bosonic left factor commutes. -/ lemma mul_comm_of_le_bosonic {A B : Submodule ℂ JetAlgebra} (hA : A ≤ bosonic) : A * B = B * A := by @@ -1599,55 +914,6 @@ lemma mul_comm_of_le_bosonic {A B : Submodule ℂ JetAlgebra} (hA : A ≤ bosoni · rw [← mul_comm_of_mem_bosonic (hA ha)] exact Submodule.mul_mem_mul ha hb -/-- An integer-indexed supremum of submodules supported on the weights `0`, `2`, `-2` - collapses to the three corresponding terms. -/ -lemma iSup_eq_sup_zero_two_neg_two (f : ℤ → Submodule ℂ JetAlgebra) - (hf : ∀ l : ℤ, l ≠ 0 → l ≠ 2 → l ≠ -2 → f l = ⊥) : - (⨆ l, f l) = f 0 ⊔ f 2 ⊔ f (-2) := by - refine le_antisymm (iSup_le fun l => ?_) - (sup_le (sup_le (le_iSup f 0) (le_iSup f 2)) (le_iSup f (-2))) - by_cases h0 : l = 0 - · subst h0; exact le_sup_left.trans le_sup_left - by_cases h2 : l = 2 - · subst h2; exact le_sup_right.trans le_sup_left - by_cases hn2 : l = -2 - · subst hn2; exact le_sup_right - · rw [hf l h0 h2 hn2]; exact bot_le - -/-- The weight-`k` part of a product of submodules is bounded by the products of the weight - parts pairing to `k`: the projection of `v * w` is the sum of the products of the components - of `v` and `w` whose weights add to `k`. This is an inequality only — the individual - products of components need not come from `V * W` itself. -/ -lemma boostProj_map_mul_submodule_le {i : Fin 3} (k : ℤ) (V W : Submodule ℂ JetAlgebra) : - (V * W).map (boostProj i k) ≤ - ⨆ (l : ℤ), (V.map (boostProj i l)) * (W.map (boostProj i (k - l))) := by - classical - rw [Submodule.map_le_iff_le_comap] - refine Submodule.mul_le.2 fun v hv w hw => ?_ - rw [Submodule.mem_comap, boostProj_apply, DirectSum.decompose_mul, DirectSum.coe_mul_apply] - refine sum_mem fun ij hij => ?_ - have hk : k - ij.1 = ij.2 := by - have := (Finset.mem_filter.1 hij).2 - omega - refine Submodule.mem_iSup_of_mem ij.1 ?_ - rw [hk] - exact Submodule.mul_mem_mul ⟨v, hv, rfl⟩ ⟨w, hw, rfl⟩ - -/-- For submodules closed under the weight projections the bound of - `boostProj_map_mul_submodule_le` is an equality: each product of components has pure weight - `k` and lies in `V * W`, so it is its own projection. -/ -lemma boostProj_map_mul_submodule {i : Fin 3} (k : ℤ) {V W : Submodule ℂ JetAlgebra} - (hV : ∀ l : ℤ, V.map (boostProj i l) ≤ V) (hW : ∀ l : ℤ, W.map (boostProj i l) ≤ W) : - (V * W).map (boostProj i k) = - ⨆ (l : ℤ), (V.map (boostProj i l)) * (W.map (boostProj i (k - l))) := by - refine le_antisymm (boostProj_map_mul_submodule_le k V W) (iSup_le fun l => ?_) - refine Submodule.mul_le.2 fun v' hv' w' hw' => ?_ - refine ⟨v' * w', Submodule.mul_mem_mul (hV l hv') (hW (k - l) hw'), ?_⟩ - obtain ⟨v, hv, rfl⟩ := hv' - obtain ⟨w, hw, rfl⟩ := hw' - exact boostProj_of_mem (mul_mem_boostWeightSubmodule' (boostProj_mem i l v) - (boostProj_mem i (k - l) w) (by ring)) - end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean b/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean similarity index 67% rename from Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean rename to Physlib/Relativity/LorentzGroup/Boosts/Axis.lean index 3ec4ca223..a530217c7 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/AxisBoosts.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean @@ -5,41 +5,39 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Relativity.PauliMatrices.Basic +public import Physlib.Relativity.MinkowskiMatrix /-! # The boosts along the coordinate axes ## i. Overview The one-parameter boosts `boostZel t`, `boostXel t`, `boostYel t` along the three coordinate -axes, their Lorentz matrices, their inverses, and the weighted averages `boostAvgZ`, `boostAvgX`, -`boostAvgY` over finitely many of them. +axes as elements of `SL(2,ℂ)`, their Lorentz matrices, their inverses, the uniform +parametrisation `boostAxis`, and the rotations conjugating the `z`-boost into the `x`- and +`y`-boosts. ## ii. What they are for -These are the boosts the boost-weight grading of `Grading/BoostWeight` is defined by: an element -has boost weight `k` along an axis when the corresponding one-parameter family acts on it by -`t ^ k`. The three averages are fixed rational combinations of the identity and the boosts at -`t = 2, 3, 4` paired with their inverses; `Grading/BoostWeight` shows that each acts on an -element of boost weight `k` by an explicit scalar, which is one at `k = 0` and zero at -`k = ± 2, ± 4, ± 6`, so that on the covariant subalgebra in mass weight eight they are the -projections onto boost weight zero. - -Being non-compact, the boosts admit no invariant average, which is why the weights have to be -chosen by hand rather than obtained by integration. +These are the boosts boost-weight gradings are defined by: an element of a representation has +boost weight `k` along an axis when the corresponding one-parameter family acts on it by +`t ^ k`. The conjugations `boostXel_eq_conj`, `boostYel_eq_conj` let facts proved for the +`z`-axis be transported to the other two. ## iii. Key results -- `JetAlgebra.boostZel`, `JetAlgebra.boostXel`, `JetAlgebra.boostYel` : the one-parameter boosts. -- `JetAlgebra.toLorentzGroup_boostZel` and its two companions : their Lorentz matrices. -- `JetAlgebra.boostAvgZ`, `JetAlgebra.boostAvgX`, `JetAlgebra.boostAvgY` : the weighted averages. +- `Lorentz.boostZel`, `Lorentz.boostXel`, `Lorentz.boostYel` : the one-parameter boosts. +- `Lorentz.toLorentzGroup_boostZel` and its two companions : their Lorentz matrices. +- `Lorentz.boostAxis` : the boost along the `i`-th axis. +- `Lorentz.exists_conj_boostAxis` : every axis boost is a rotation of the `z`-boost. ## iv. Table of contents - A. The boosts along the three axes - B. Their Lorentz matrices - C. Their inverses -- D. The weighted boost averages +- D. The uniform parametrisation and the conjugations -/ @@ -47,10 +45,7 @@ chosen by hand rather than obtained by integration. set_option maxHeartbeats 1000000 -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra +namespace Lorentz open scoped minkowskiMatrix PauliMatrix open Matrix MatrixGroups @@ -263,8 +258,95 @@ lemma boostYel_inv_coe (t : ℝ) (ht : t ≠ 0) : ext i j fin_cases i <;> fin_cases j <;> · simp [boostYel]; try ring -end JetAlgebra +/-! + +## D. The uniform parametrisation and the conjugations + +The three axis boosts are conjugate: a rotation by `π/2` carries the `z`-boost to the `x`- and +`y`-boosts, so facts about the `z`-boost transport to the other axes. + +-/ + +/-- The boost along the `i`-th spatial axis. -/ +noncomputable def boostAxis : Fin 3 → (t : ℝ) → t ≠ 0 → SL(2,ℂ) + | 0, t, ht => boostXel t ht + | 1, t, ht => boostYel t ht + | 2, t, ht => boostZel t ht + +@[simp] lemma boostAxis_zero (t : ℝ) (ht : t ≠ 0) : boostAxis 0 t ht = boostXel t ht := rfl +@[simp] lemma boostAxis_one (t : ℝ) (ht : t ≠ 0) : boostAxis 1 t ht = boostYel t ht := rfl +@[simp] lemma boostAxis_two (t : ℝ) (ht : t ≠ 0) : boostAxis 2 t ht = boostZel t ht := rfl + +lemma boostAxis_inv (i : Fin 3) (t : ℝ) (ht : t ≠ 0) : + (boostAxis i t ht)⁻¹ = boostAxis i t⁻¹ (inv_ne_zero ht) := by + fin_cases i + · exact boostXel_inv t ht + · exact boostYel_inv t ht + · exact boostZel_inv t ht + +private lemma sqrtTwo_sq : (((Real.sqrt 2 : ℝ) : ℂ)) ^ 2 = 2 := by + rw [← Complex.ofReal_pow, Real.sq_sqrt (by norm_num : (0:ℝ) ≤ 2)] + norm_num + +private lemma sqrtTwo_ne_zero : (((Real.sqrt 2 : ℝ) : ℂ)) ≠ 0 := by + simp [] + +private lemma sqrtTwo_inv_mul : + ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹) * ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹) = 2⁻¹ := by + rw [← mul_inv, ← sq, sqrtTwo_sq] + +/-- The rotation by `π/2` about the `y`-axis, carrying the `z`-boost to the `x`-boost. -/ +noncomputable def rotZX : SL(2,ℂ) := + ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, -1; 1, 1], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow, sqrtTwo_sq] + norm_num⟩ + +/-- The rotation by `π/2` about the `x`-axis, carrying the `z`-boost to the `y`-boost. -/ +noncomputable def rotZY : SL(2,ℂ) := + ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, Complex.I; Complex.I, 1], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow, sqrtTwo_sq, + Complex.I_mul_I] + norm_num⟩ + +lemma boostXel_eq_conj (t : ℝ) (ht : t ≠ 0) : + boostXel t ht = rotZX * boostZel t ht * rotZX⁻¹ := by + have h0 := sqrtTwo_ne_zero + have hc := sqrtTwo_inv_mul + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Subtype.ext ?_ + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> + · simp [Matrix.SpecialLinearGroup.coe_mul, rotZX, boostZel, boostXel, + Matrix.mul_apply, Fin.sum_univ_two] + field_simp + simp only [sqrtTwo_sq] + try ring + +lemma boostYel_eq_conj (t : ℝ) (ht : t ≠ 0) : + boostYel t ht = rotZY * boostZel t ht * rotZY⁻¹ := by + have h0 := sqrtTwo_ne_zero + have hc := sqrtTwo_inv_mul + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Subtype.ext ?_ + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + ext i j + fin_cases i <;> fin_cases j <;> + · simp [Matrix.SpecialLinearGroup.coe_mul, rotZY, boostZel, boostYel, + Matrix.mul_apply, Fin.sum_univ_two] + field_simp + simp only [sqrtTwo_sq, Complex.I_sq] + try ring + +/-- Every axis boost is a rotation of the `z`-boost. -/ +lemma exists_conj_boostAxis (i : Fin 3) : + ∃ R : SL(2,ℂ), ∀ (t : ℝ) (ht : t ≠ 0), + boostAxis i t ht = R * boostAxis 2 t ht * R⁻¹ := by + fin_cases i + · exact ⟨rotZX, fun t ht => boostXel_eq_conj t ht⟩ + · exact ⟨rotZY, fun t ht => boostYel_eq_conj t ht⟩ + · exact ⟨1, fun t ht => by simp⟩ -end LeptonGaugeSector +end Lorentz end diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean new file mode 100644 index 000000000..f1c928864 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -0,0 +1,691 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Boosts.Axis +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.RingTheory.GradedAlgebra.Basic +public import Mathlib.Algebra.DirectSum.Internal +public import Mathlib.LinearAlgebra.Eigenspace.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Boost-weight gradings of representations of `SL(2,ℂ)` + +An element of a representation has boost weight `k` along the `i`-th spatial axis when the +one-parameter boost family acts on it by `t ^ k`; `boostWeightSubmodule rep i k` collects these elements. +`IsBoostGraded rep` says the representation acts on an algebra by algebra automorphisms and +that the weight spaces span along every axis. Given it, the weight spaces are independent +(they sit in eigenspaces of a single boost at distinct eigenvalues), so they decompose the +algebra as an internal direct sum, grade it as a graded algebra, and support the weight +projections `boostProj` together with their calculus: how projections interact with submodules, +weight-shifting operators, and products. + +The section-A transports (`isGraded_tprod`, `isGraded_prod`, `isGraded_symmetricAlgebra`, +`isGraded_exteriorAlgebra`, `isGraded_baseChange`, `isGraded_of_isGraded_two`) are the tools +for establishing `IsBoostGraded` for a concrete algebra, by descending to the spaces it is +built from. + +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups TensorProduct + +/-! + +## A. Boost weights of a general representation + +The descent to the component spaces is uniform, so it is carried out once here for an arbitrary +representation. The weight spaces are defined exactly as `boostWeightSubmodule` is, and +`IsGraded` says that they span. The point of the section is that `IsGraded` propagates along +every construction the jet algebra is built from: tensor products, products, symmetric algebras, +exterior algebras and base change. The recursion bottoms out at a finite-dimensional space with +an eigenbasis, where the light-cone combinations do the work. + +-/ + +namespace BoostWeight + +variable {K : Type*} [Field K] [Algebra ℝ K] +variable {M N V : Type*} [AddCommGroup M] [Module K M] [AddCommGroup N] [Module K N] + [AddCommGroup V] [Module K V] +variable {i : Fin 3} + +private lemma algebraMap_ne_zero {t : ℝ} (ht : t ≠ 0) : (algebraMap ℝ K t) ≠ 0 := + fun h => ht ((algebraMap ℝ K).injective (by simpa using h)) + +/-- The weight-`w` space of a representation: the vectors scaling by `t ^ w` under the + `z`-boost at parameter `t`. -/ +def boostWeightSubmodule (rep : Representation K SL(2,ℂ) M) (i : Fin 3) (w : ℤ) : Submodule K M where + carrier := {x | ∀ (t : ℝ) (ht : t ≠ 0), + rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x} + add_mem' {a b} ha hb := fun t ht => by rw [map_add, ha t ht, hb t ht, smul_add] + zero_mem' := fun t ht => by rw [map_zero, smul_zero] + smul_mem' c x hx := fun t ht => by rw [map_smul, hx t ht, smul_comm] + +lemma mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {w : ℤ} {x : M} : + x ∈ boostWeightSubmodule rep i w ↔ ∀ (t : ℝ) (ht : t ≠ 0), + rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl + +/-- The span of all the weight spaces. -/ +def weightSpan (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Submodule K M := + ⨆ w, boostWeightSubmodule rep i w + +/-- A representation is boost-graded when its weight spaces span. -/ +def IsGraded (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Prop := weightSpan rep i = ⊤ + +/-- A representation of `SL(2,ℂ)` on an algebra is **boost-graded** when it acts by algebra + automorphisms and its boost-weight spaces span, along every coordinate axis. This is the + interface behind the boost-weight grading: given it, the weight spaces decompose the algebra + as an internal direct sum, grade it as an algebra, and support the projections `boostProj` with + their calculus. -/ +class IsBoostGraded {A : Type*} [Ring A] [Algebra K A] + (rep : Representation K SL(2,ℂ) A) : Prop where + apply_one : ∀ Λ, rep Λ 1 = 1 + apply_mul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y + isGraded : ∀ i : Fin 3, IsGraded rep i + +lemma mem_weightSpan_of_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {w : ℤ} {x : M} + (h : x ∈ boostWeightSubmodule rep i w) : x ∈ weightSpan rep i := + Submodule.mem_iSup_of_mem w h + +lemma mem_weightSpan_of_isGraded {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep i) (x : M) : + x ∈ weightSpan rep i := by rw [IsGraded] at h; rw [h]; trivial + +lemma isGraded_iff_forall_mem {rep : Representation K SL(2,ℂ) M} : + IsGraded rep i ↔ ∀ x, x ∈ weightSpan rep i := + ⟨mem_weightSpan_of_isGraded, fun h => eq_top_iff.mpr fun x _ => h x⟩ + +/-- A representation with a spanning family of vectors in the weight span is graded. -/ +lemma isGraded_of_span {rep : Representation K SL(2,ℂ) M} {S : Set M} + (hS : Submodule.span K S = ⊤) (h : ∀ x ∈ S, x ∈ weightSpan rep i) : IsGraded rep i := + eq_top_iff.mpr (hS ▸ Submodule.span_le.mpr h) + +/-- A representation with a basis of vectors lying in the weight span is graded. -/ +lemma isGraded_of_basis {ι : Type*} {rep : Representation K SL(2,ℂ) M} (b : Module.Basis ι K M) + (h : ∀ n, b n ∈ weightSpan rep i) : IsGraded rep i := + isGraded_of_span b.span_eq (by rintro _ ⟨n, rfl⟩; exact h n) + +/-! + +### Tensor products + +-/ + +lemma tmul_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + {a b : ℤ} {x : M} {y : N} (hx : x ∈ boostWeightSubmodule rep i a) (hy : y ∈ boostWeightSubmodule rep₂ i b) : + x ⊗ₜ[K] y ∈ boostWeightSubmodule (rep.tprod rep₂) i (a + b) := by + intro t ht + show (TensorProduct.map _ _) _ = _ + rw [TensorProduct.map_tmul, hx t ht, hy t ht] + simp only [TensorProduct.tmul_smul, TensorProduct.smul_tmul', smul_smul] + rw [← zpow_add₀ (algebraMap_ne_zero (K := K) ht), add_comm b a] + +lemma isGraded_tprod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.tprod rep₂) i := by + refine isGraded_iff_forall_mem.mpr fun z => ?_ + induction z using TensorProduct.induction_on with + | zero => exact Submodule.zero_mem _ + | add u v hu hv => exact Submodule.add_mem _ hu hv + | tmul x y => + have hx := mem_weightSpan_of_isGraded h₁ x + have hy := mem_weightSpan_of_isGraded h₂ y + induction hx using Submodule.iSup_induction' with + | mem a x' hx' => + induction hy using Submodule.iSup_induction' with + | mem b y' hy' => exact mem_weightSpan_of_mem_boostWeightSubmodule (tmul_mem_boostWeightSubmodule hx' hy') + | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv + | zero => rw [TensorProduct.zero_tmul]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ ihu ihv + + +/-! + +### Products + +-/ + +lemma inl_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + {a : ℤ} {x : M} (hx : x ∈ boostWeightSubmodule rep i a) : + ((x, 0) : M × N) ∈ boostWeightSubmodule (rep.prod rep₂) i a := by + intro t ht + show ((rep _ x, rep₂ _ 0) : M × N) = _ + rw [map_zero, hx t ht, Prod.smul_mk, smul_zero] + +lemma inr_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + {a : ℤ} {y : N} (hy : y ∈ boostWeightSubmodule rep₂ i a) : + ((0, y) : M × N) ∈ boostWeightSubmodule (rep.prod rep₂) i a := by + intro t ht + show ((rep _ 0, rep₂ _ y) : M × N) = _ + rw [map_zero, hy t ht, Prod.smul_mk, smul_zero] + +lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} + (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.prod rep₂) i := by + have hleft : ∀ x : M, ((x, (0 : N))) ∈ weightSpan (rep.prod rep₂) i := by + intro x + have hx := mem_weightSpan_of_isGraded h₁ x + induction hx using Submodule.iSup_induction' with + | mem a u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (inl_mem_boostWeightSubmodule hu) + | zero => exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => + rw [show ((u + v, (0 : N))) = ((u, (0 : N))) + ((v, (0 : N))) from by ext <;> simp] + exact Submodule.add_mem _ ihu ihv + have hright : ∀ y : N, (((0 : M), y)) ∈ weightSpan (rep.prod rep₂) i := by + intro y + have hy := mem_weightSpan_of_isGraded h₂ y + induction hy using Submodule.iSup_induction' with + | mem a u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (inr_mem_boostWeightSubmodule hu) + | zero => exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => + rw [show (((0 : M), u + v)) = (((0 : M), u)) + (((0 : M), v)) from by ext <;> simp] + exact Submodule.add_mem _ ihu ihv + refine isGraded_iff_forall_mem.mpr fun z => ?_ + rw [show z = ((z.1, (0 : N))) + (((0 : M), z.2)) from by ext <;> simp] + exact Submodule.add_mem _ (hleft z.1) (hright z.2) + +/-! + +### Algebras generated in degree one + +-/ + +variable {A : Type*} [Ring A] [Algebra K A] + +lemma one_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) A} (hone : ∀ Λ, rep Λ 1 = 1) : + (1 : A) ∈ boostWeightSubmodule rep i 0 := fun t _ => by rw [hone, zpow_zero, one_smul] + +lemma mul_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) A} + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) + {a b : ℤ} {x y : A} (hx : x ∈ boostWeightSubmodule rep i a) (hy : y ∈ boostWeightSubmodule rep i b) : + x * y ∈ boostWeightSubmodule rep i (a + b) := by + intro t ht + rw [hmul, hx t ht, hy t ht, smul_mul_smul_comm, + zpow_add₀ (algebraMap_ne_zero (K := K) ht)] + +lemma mul_mem_weightSpan {rep : Representation K SL(2,ℂ) A} + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) + {x y : A} (hx : x ∈ weightSpan rep i) (hy : y ∈ weightSpan rep i) : + x * y ∈ weightSpan rep i := by + induction hx using Submodule.iSup_induction' with + | mem a u hu => + induction hy using Submodule.iSup_induction' with + | mem b v hv => exact mem_weightSpan_of_mem_boostWeightSubmodule (mul_mem_boostWeightSubmodule hmul hu hv) + | zero => rw [mul_zero]; exact Submodule.zero_mem _ + | add v w _ _ ihv ihw => rw [mul_add]; exact Submodule.add_mem _ ihv ihw + | zero => rw [zero_mul]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [add_mul]; exact Submodule.add_mem _ ihu ihv + +lemma algebraMap_mem_weightSpan {rep : Representation K SL(2,ℂ) A} + (hone : ∀ Λ, rep Λ 1 = 1) (r : K) : algebraMap K A r ∈ weightSpan rep i := by + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ (mem_weightSpan_of_mem_boostWeightSubmodule (one_mem_boostWeightSubmodule hone)) + +/-- A symmetric algebra is boost-graded as soon as its degree-one part is. -/ +lemma isGraded_symmetricAlgebra {V : Type*} [AddCommGroup V] [Module K V] + {repV : Representation K SL(2,ℂ) V} + {repA : Representation K SL(2,ℂ) (SymmetricAlgebra K V)} + (hone : ∀ Λ, repA Λ 1 = 1) + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : SymmetricAlgebra K V), + repA Λ (x * y) = repA Λ x * repA Λ y) + (hι : ∀ (Λ : SL(2,ℂ)) (x : V), + repA Λ (SymmetricAlgebra.ι K V x) = SymmetricAlgebra.ι K V (repV Λ x)) + (hV : IsGraded repV i) : IsGraded repA i := by + refine isGraded_iff_forall_mem.mpr fun x => ?_ + induction x using SymmetricAlgebra.induction with + | algebraMap r => exact algebraMap_mem_weightSpan hone r + | ι v => + have hv := mem_weightSpan_of_isGraded hV v + induction hv using Submodule.iSup_induction' with + | mem a u hu => + refine mem_weightSpan_of_mem_boostWeightSubmodule (w := a) fun t ht => ?_ + rw [hι, hu t ht, map_smul] + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv + | mul u v ihu ihv => exact mul_mem_weightSpan hmul ihu ihv + | add u v ihu ihv => exact Submodule.add_mem _ ihu ihv + +/-- An exterior algebra is boost-graded as soon as its degree-one part is. -/ +lemma isGraded_exteriorAlgebra {V : Type*} [AddCommGroup V] [Module K V] + {repV : Representation K SL(2,ℂ) V} + {repA : Representation K SL(2,ℂ) (ExteriorAlgebra K V)} + (hone : ∀ Λ, repA Λ 1 = 1) + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : ExteriorAlgebra K V), + repA Λ (x * y) = repA Λ x * repA Λ y) + (hι : ∀ (Λ : SL(2,ℂ)) (x : V), + repA Λ (ExteriorAlgebra.ι K x) = ExteriorAlgebra.ι K (repV Λ x)) + (hV : IsGraded repV i) : IsGraded repA i := by + refine isGraded_iff_forall_mem.mpr fun x => ?_ + induction x using ExteriorAlgebra.induction with + | algebraMap r => exact algebraMap_mem_weightSpan hone r + | ι v => + have hv := mem_weightSpan_of_isGraded hV v + induction hv using Submodule.iSup_induction' with + | mem a u hu => + refine mem_weightSpan_of_mem_boostWeightSubmodule (w := a) fun t ht => ?_ + rw [hι, hu t ht, map_smul] + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv + | mul u v ihu ihv => exact mul_mem_weightSpan hmul ihu ihv + | add u v ihu ihv => exact Submodule.add_mem _ ihu ihv + +/-! + +### The light-cone eigenbasis of a spacetime-indexed space + +-/ + +/-- A space with a basis indexed by spacetime directions transforming by the columns of the + Lorentz matrix is boost-graded: the light-cone combinations `b₀ ∓ b₃` are eigenvectors of + weight `±2` and the transverse directions are invariant. -/ +lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} + (b : Module.Basis (Fin 1 ⊕ Fin 3) K M) + (h : ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), rep Λ (b μ) = + ∑ j, algebraMap ℝ K ((Lorentz.SL2C.toLorentzGroup Λ).1 j μ) • b j) : + IsGraded rep 2 := by + haveI : CharZero K := charZero_of_injective_algebraMap (algebraMap ℝ K).injective + have key : ∀ (t : ℝ) (ht : t ≠ 0) (μ : Fin 1 ⊕ Fin 3), + rep (boostAxis 2 t ht) (b μ) = + ∑ j, algebraMap ℝ K (boostMatZ t j μ) • b j := by + intro t ht μ + rw [h] + exact Finset.sum_congr rfl fun j _ => by + rw [show boostAxis 2 t ht = boostZel t ht from rfl, toLorentzGroup_boostZel] + have hplus : b (Sum.inl 0) - b (Sum.inr 2) ∈ boostWeightSubmodule rep 2 2 := by + intro t ht + have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht + rw [map_sub, key t ht, key t ht] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, + map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, + map_add, map_pow, map_inv₀, map_ofNat, map_neg] + match_scalars <;> (field_simp; try ring_nf; try norm_num) + have hminus : b (Sum.inl 0) + b (Sum.inr 2) ∈ boostWeightSubmodule rep 2 (-2) := by + intro t ht + have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht + rw [map_add, key t ht, key t ht] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, + map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, + map_add, map_pow, map_inv₀, map_ofNat, map_neg] + match_scalars <;> (field_simp; try ring_nf; try norm_num) + have htr : ∀ i' : Fin 3, i' = 0 ∨ i' = 1 → b (Sum.inr i') ∈ boostWeightSubmodule rep 2 0 := by + rintro i (rfl | rfl) <;> + · intro t ht + rw [key t ht] + simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, + map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, zpow_zero] + refine isGraded_of_basis b fun μ => ?_ + match μ with + | Sum.inl 0 => + rw [show b (Sum.inl 0) = (2⁻¹ : K) • ((b (Sum.inl 0) - b (Sum.inr 2)) + + (b (Sum.inl 0) + b (Sum.inr 2))) from by match_scalars <;> (field_simp; try ring)] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ + (mem_weightSpan_of_mem_boostWeightSubmodule hplus) (mem_weightSpan_of_mem_boostWeightSubmodule hminus)) + | Sum.inr 0 => exact mem_weightSpan_of_mem_boostWeightSubmodule (htr 0 (Or.inl rfl)) + | Sum.inr 1 => exact mem_weightSpan_of_mem_boostWeightSubmodule (htr 1 (Or.inr rfl)) + | Sum.inr 2 => + rw [show b (Sum.inr 2) = (2⁻¹ : K) • ((b (Sum.inl 0) + b (Sum.inr 2)) + - (b (Sum.inl 0) - b (Sum.inr 2))) from by match_scalars <;> (field_simp; try ring)] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ + (mem_weightSpan_of_mem_boostWeightSubmodule hminus) (mem_weightSpan_of_mem_boostWeightSubmodule hplus)) + +/-! + +### Base change from the real to the complex scalars + +-/ + +lemma isGraded_baseChange {A : Type*} [AddCommGroup A] [Module ℝ A] + {repR : Representation ℝ SL(2,ℂ) A} {repC : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] A)} + (h : ∀ (Λ : SL(2,ℂ)) (c : ℂ) (y : A), repC Λ (c ⊗ₜ[ℝ] y) = c ⊗ₜ[ℝ] repR Λ y) + (hR : IsGraded repR i) : IsGraded repC i := by + have htmul : ∀ (c : ℂ) (w : ℤ) (y : A), y ∈ boostWeightSubmodule repR i w → + (c ⊗ₜ[ℝ] y : ℂ ⊗[ℝ] A) ∈ boostWeightSubmodule repC i w := by + intro c w y hy t ht + rw [h, hy t ht, TensorProduct.tmul_smul, + show ((algebraMap ℝ ℝ) t) ^ w = t ^ w from by simp, + ← algebraMap_smul (R := ℝ) ℂ (t ^ w) (c ⊗ₜ[ℝ] y), map_zpow₀] + refine isGraded_iff_forall_mem.mpr fun z => ?_ + induction z using TensorProduct.induction_on with + | zero => exact Submodule.zero_mem _ + | add u v hu hv => exact Submodule.add_mem _ hu hv + | tmul c y => + have hy := mem_weightSpan_of_isGraded hR y + induction hy using Submodule.iSup_induction' with + | mem w u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (htmul c w u hu) + | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv + + +/-! + +### Transport between the three axes + +-/ + +/-- The axis boosts are conjugate, so being graded for one of them is being graded for all. -/ +lemma isGraded_of_isGraded_two {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep 2) + (i : Fin 3) : IsGraded rep i := by + obtain ⟨R, hR⟩ := exists_conj_boostAxis i + have hsurj : ∀ x : M, rep R (rep R⁻¹ x) = x := by + intro x + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] + have hmap : ∀ (w : ℤ) (u : M), u ∈ boostWeightSubmodule rep 2 w → rep R u ∈ boostWeightSubmodule rep i w := by + intro w u hu t ht + rw [← Module.End.mul_apply, ← map_mul, hR t ht, inv_mul_cancel_right, map_mul, + Module.End.mul_apply, hu t ht, map_smul] + refine isGraded_iff_forall_mem.mpr fun x => ?_ + obtain ⟨y, rfl⟩ : ∃ y, rep R y = x := ⟨rep R⁻¹ x, hsurj x⟩ + have hy := mem_weightSpan_of_isGraded h y + induction hy using Submodule.iSup_induction' with + | mem w u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (hmap w u hu) + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv + +/-! + +## B. The graded-algebra theory of a boost-graded representation + +-/ + +section Theory + +omit [Algebra ℝ K] in +/-- Multiply a two-term linear decomposition into a submodule. -/ +lemma mul_mem_of_eq_smul_add_smul {p : Submodule K A} {a u v y : A} + (c d : K) (hu : a * u ∈ p) (hv : a * v ∈ p) (hy : y = c • u + d • v) : a * y ∈ p := by + subst hy + rw [mul_add, mul_smul_comm, mul_smul_comm] + exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) + +omit [Algebra ℝ K] in +/-- An integer-indexed supremum of submodules supported on the weights `0`, `2`, `-2` + collapses to the three corresponding terms. -/ +lemma iSup_eq_sup_zero_two_neg_two (f : ℤ → Submodule K M) + (hf : ∀ l : ℤ, l ≠ 0 → l ≠ 2 → l ≠ -2 → f l = ⊥) : + (⨆ l, f l) = f 0 ⊔ f 2 ⊔ f (-2) := by + refine le_antisymm (iSup_le fun l => ?_) + (sup_le (sup_le (le_iSup f 0) (le_iSup f 2)) (le_iSup f (-2))) + by_cases h0 : l = 0 + · subst h0; exact le_sup_left.trans le_sup_left + by_cases h2 : l = 2 + · subst h2; exact le_sup_right.trans le_sup_left + by_cases hn2 : l = -2 + · subst hn2; exact le_sup_right + · rw [hf l h0 h2 hn2]; exact bot_le + +variable (rep : Representation K SL(2,ℂ) A) + +/-- The unit has boost weight zero. -/ +lemma one_mem [IsBoostGraded rep] : (1 : A) ∈ boostWeightSubmodule rep i 0 := + one_mem_boostWeightSubmodule (IsBoostGraded.apply_one (rep := rep)) + +/-- Boost weights add under multiplication. -/ +lemma mul_mem [IsBoostGraded rep] {k l : ℤ} {x y : A} (hx : x ∈ boostWeightSubmodule rep i k) + (hy : y ∈ boostWeightSubmodule rep i l) : x * y ∈ boostWeightSubmodule rep i (k + l) := + mul_mem_boostWeightSubmodule (IsBoostGraded.apply_mul (rep := rep)) hx hy + +/-- Boost weights add under multiplication, with the sum of the weights given explicitly. -/ +lemma mul_mem' [IsBoostGraded rep] {k l n : ℤ} {x y : A} (hx : x ∈ boostWeightSubmodule rep i k) + (hy : y ∈ boostWeightSubmodule rep i l) (hkl : k + l = n) : x * y ∈ boostWeightSubmodule rep i n := + hkl ▸ mul_mem rep hx hy + +instance [IsBoostGraded rep] : SetLike.GradedMonoid (boostWeightSubmodule rep i) where + one_mem := one_mem rep + mul_mem _ _ _ _ hx hy := mul_mem rep hx hy + +/-- The weight space of weight `k` sits inside the `2 ^ k` eigenspace of the boost at + parameter two. -/ +lemma boostWeightSubmodule_le_eigenspace (k : ℤ) : + boostWeightSubmodule rep i k ≤ Module.End.eigenspace (rep (boostAxis i 2 two_ne_zero)) + ((algebraMap ℝ K 2) ^ k) := by + intro x hx + rw [Module.End.mem_eigenspace_iff] + exact hx 2 two_ne_zero + +private lemma zpow_algebraMap_two_injective : + Function.Injective (fun k : ℤ => ((algebraMap ℝ K 2) ^ k)) := by + intro a b hab + simp only [← map_zpow₀] at hab + exact zpow_right_injective₀ (by norm_num) (by norm_num) ((algebraMap ℝ K).injective hab) + +/-- The weight spaces are independent: a decomposition into homogeneous parts is unique when + it exists. -/ +lemma boostWeightSubmodule_iSupIndep : iSupIndep (boostWeightSubmodule rep i) := + ((Module.End.eigenspaces_iSupIndep + (rep (boostAxis i 2 two_ne_zero) : Module.End K A)).comp + zpow_algebraMap_two_injective).mono fun k => boostWeightSubmodule_le_eigenspace rep k + +/-- Recover the two summands from the sum and difference: if `u + v` and `u - v` lie in a + submodule then so do `u` and `v`. -/ +lemma mem_of_add_mem_of_sub_mem {p : Submodule K M} {u v : M} + (h₁ : u + v ∈ p) (h₂ : u - v ∈ p) : u ∈ p ∧ v ∈ p := by + haveI : CharZero K := charZero_of_injective_algebraMap (algebraMap ℝ K).injective + constructor + · rw [show u = (2⁻¹ : K) • (u + v) + (2⁻¹ : K) • (u - v) from by + match_scalars <;> (field_simp; try norm_num)] + exact add_mem (Submodule.smul_mem _ _ h₁) (Submodule.smul_mem _ _ h₂) + · rw [show v = (2⁻¹ : K) • (u + v) - (2⁻¹ : K) • (u - v) from by + match_scalars <;> (field_simp; try norm_num)] + exact sub_mem (Submodule.smul_mem _ _ h₁) (Submodule.smul_mem _ _ h₂) + +/-- A product of two submodules of pure weights `k` and `l` with `k + l ≠ n` lands in the span + of the weights other than `n`. -/ +lemma mul_le_iSup_boostWeightSubmodule_of_ne [IsBoostGraded rep] {X Y : Submodule K A} {k l n : ℤ} + (hX : X ≤ boostWeightSubmodule rep i k) (hY : Y ≤ boostWeightSubmodule rep i l) (h : k + l ≠ n) : + X * Y ≤ ⨆ (j : ℤ) (_ : j ≠ n), boostWeightSubmodule rep i j := + Submodule.mul_le.2 fun _ hx _ hy => Submodule.mem_iSup_of_mem (k + l) + (Submodule.mem_iSup_of_mem h (mul_mem rep (hX hx) (hY hy))) + +/-- **Extracting the weight-`k` part of a submodule.** -/ +lemma boostWeightSubmodule_inf_eq {k : ℤ} {S V : Submodule K A} + (hS0 : S ≤ boostWeightSubmodule rep i k) (hSV : S ≤ V) + (hV : V ≤ S ⊔ ⨆ (j : ℤ) (_ : j ≠ k), boostWeightSubmodule rep i j) : + boostWeightSubmodule rep i k ⊓ V = S := by + refine le_antisymm ((inf_le_inf_left _ hV).trans ?_) (le_inf hS0 hSV) + rw [inf_comm, sup_inf_assoc_of_le _ hS0, + disjoint_iff.mp (boostWeightSubmodule_iSupIndep rep (i := i) k).symm, sup_bot_eq] + +/-- **Extracting the weight-`k` part of a span of homogeneous elements.** -/ +lemma boostWeightSubmodule_inf_eq_span {k : ℤ} {S T : Set A} {V : Submodule K A} + (hS : ∀ x ∈ S, x ∈ boostWeightSubmodule rep i k) + (hT : ∀ x ∈ T, ∃ j ≠ k, x ∈ boostWeightSubmodule rep i j) + (hSV : Submodule.span K S ≤ V) (hV : V ≤ Submodule.span K (S ∪ T)) : + boostWeightSubmodule rep i k ⊓ V = Submodule.span K S := by + refine boostWeightSubmodule_inf_eq rep (Submodule.span_le.2 hS) hSV (hV.trans ?_) + rw [Submodule.span_union] + refine sup_le le_sup_left (le_sup_of_le_right (Submodule.span_le.2 ?_)) + intro x hx + obtain ⟨j, hj, hxj⟩ := hT x hx + exact Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem hj hxj) + +/-- The span of the homogeneous elements contains one. -/ +lemma one_mem_iSup_boostWeightSubmodule [IsBoostGraded rep] : (1 : A) ∈ ⨆ k, boostWeightSubmodule rep i k := + Submodule.mem_iSup_of_mem 0 (one_mem rep) + +/-- The span of the homogeneous elements is closed under multiplication. -/ +lemma mul_mem_iSup_boostWeightSubmodule [IsBoostGraded rep] {x y : A} + (hx : x ∈ ⨆ k, boostWeightSubmodule rep i k) (hy : y ∈ ⨆ k, boostWeightSubmodule rep i k) : + x * y ∈ ⨆ k, boostWeightSubmodule rep i k := by + induction hx using Submodule.iSup_induction' with + | mem k a ha => + induction hy using Submodule.iSup_induction' with + | mem l b hb => exact Submodule.mem_iSup_of_mem (k + l) (mul_mem rep ha hb) + | zero => rw [mul_zero]; exact Submodule.zero_mem _ + | add b c _ _ ihb ihc => rw [mul_add]; exact Submodule.add_mem _ ihb ihc + | zero => rw [zero_mul]; exact Submodule.zero_mem _ + | add a b _ _ iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb + +/-- The homogeneous elements span a subalgebra. -/ +noncomputable def subalgebra [IsBoostGraded rep] (i : Fin 3) : Subalgebra K A := + Submodule.toSubalgebra (⨆ k, boostWeightSubmodule rep i k) (one_mem_iSup_boostWeightSubmodule rep) + fun _ _ hx hy => mul_mem_iSup_boostWeightSubmodule rep hx hy + +@[simp] +lemma mem_subalgebra [IsBoostGraded rep] {i : Fin 3} {x : A} : + x ∈ subalgebra rep i ↔ x ∈ ⨆ k, boostWeightSubmodule rep i k := Iff.rfl + +/-- The decomposition into weight spaces is internal exactly when the homogeneous elements + span; independence always holds. -/ +theorem isInternal_iff : + DirectSum.IsInternal (boostWeightSubmodule rep i) ↔ (⨆ k, boostWeightSubmodule rep i k) = ⊤ := by + rw [DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top] + exact ⟨And.right, fun h => ⟨boostWeightSubmodule_iSupIndep rep, h⟩⟩ + +/-- The homogeneous elements of a boost-graded representation span, along every axis. -/ +theorem iSup_boostWeightSubmodule_eq_top [IsBoostGraded rep] : (⨆ k, boostWeightSubmodule rep i k) = ⊤ := + IsBoostGraded.isGraded (rep := rep) i + +/-- **The boost weight grades the algebra.** For each axis the weight spaces decompose a + boost-graded representation as an internal direct sum. -/ +theorem boostWeightSubmodule_isInternal [IsBoostGraded rep] : DirectSum.IsInternal (boostWeightSubmodule rep i) := + (isInternal_iff rep).mpr (iSup_boostWeightSubmodule_eq_top rep) + +/-- The decomposition into boost-weight components. -/ +noncomputable instance [IsBoostGraded rep] (i : Fin 3) : + DirectSum.Decomposition (boostWeightSubmodule rep i) := + (boostWeightSubmodule_isInternal rep (i := i)).chooseDecomposition + +/-- **A boost-graded representation is a graded algebra along each axis.** -/ +noncomputable instance [IsBoostGraded rep] (i : Fin 3) : GradedAlgebra (boostWeightSubmodule rep i) where + one_mem := one_mem rep + mul_mem _ _ _ _ hx hy := mul_mem rep hx hy + +/-- The projection onto the part of boost weight `k` along the `i`-th axis, read off from the + boost-weight decomposition. -/ +noncomputable def boostProj [IsBoostGraded rep] (i : Fin 3) (k : ℤ) : A →ₗ[K] A := + (boostWeightSubmodule rep i k).subtype ∘ₗ + DirectSum.component K ℤ (fun k => (boostWeightSubmodule rep i k : Submodule K A)) k ∘ₗ + (DirectSum.decomposeLinearEquiv (boostWeightSubmodule rep i)).toLinearMap + +variable [IsBoostGraded rep] + +lemma boostProj_apply (i : Fin 3) (k : ℤ) (x : A) : + boostProj rep i k x = (DirectSum.decompose (boostWeightSubmodule rep i) x k : A) := rfl + +/-- The projection lands in the weight it projects onto. -/ +lemma boostProj_mem (i : Fin 3) (k : ℤ) (x : A) : boostProj rep i k x ∈ boostWeightSubmodule rep i k := + (DirectSum.decompose (boostWeightSubmodule rep i) x k).2 + +/-- On an element of weight `k` the weight-`k` projection is the identity. -/ +@[simp] +lemma boostProj_of_mem {k : ℤ} {x : A} (hx : x ∈ boostWeightSubmodule rep i k) : boostProj rep i k x = x := + DirectSum.decompose_of_mem_same _ hx + +/-- On an element of another weight the projection vanishes. -/ +lemma boostProj_of_mem_ne {k l : ℤ} {x : A} (hx : x ∈ boostWeightSubmodule rep i l) (hlk : l ≠ k) : + boostProj rep i k x = 0 := + DirectSum.decompose_of_mem_ne _ hx hlk + +/-- An element is of weight `k` exactly when the weight-`k` projection fixes it. -/ +lemma boostProj_eq_self_iff {k : ℤ} {x : A} : boostProj rep i k x = x ↔ x ∈ boostWeightSubmodule rep i k := + ⟨fun h => h ▸ boostProj_mem rep i k x, boostProj_of_mem rep⟩ + +/-- The projections are idempotent. -/ +@[simp] +lemma boostProj_boostProj (i : Fin 3) (k : ℤ) (x : A) : + boostProj rep i k (boostProj rep i k x) = boostProj rep i k x := + boostProj_of_mem rep (boostProj_mem rep i k x) + +/-- Distinct projections are orthogonal. -/ +lemma boostProj_boostProj_of_ne {k l : ℤ} (hlk : l ≠ k) (x : A) : + boostProj rep i k (boostProj rep i l x) = 0 := + boostProj_of_mem_ne rep (boostProj_mem rep i l x) hlk + +/-- The image of the weight-`k` projection is the weight-`k` space. -/ +lemma range_boostProj (i : Fin 3) (k : ℤ) : LinearMap.range (boostProj rep i k) = boostWeightSubmodule rep i k := by + refine le_antisymm (LinearMap.range_le_iff_comap.mpr (le_top.antisymm fun x _ => ?_)) + fun x hx => ⟨x, boostProj_of_mem rep hx⟩ + exact boostProj_mem rep i k x + +/-- The weight-`k` projection fixes a submodule of pure weight `k`. -/ +lemma map_boostProj_of_le {k : ℤ} {W : Submodule K A} (h : W ≤ boostWeightSubmodule rep i k) : + W.map (boostProj rep i k) = W := by + refine le_antisymm ?_ fun x hx => ⟨x, hx, boostProj_of_mem rep (h hx)⟩ + rintro _ ⟨x, hx, rfl⟩ + rw [boostProj_of_mem rep (h hx)] + exact hx + +/-- The weight-`k` projection annihilates a submodule of pure weight `l ≠ k`. -/ +lemma map_boostProj_of_le_ne {k l : ℤ} {W : Submodule K A} (h : W ≤ boostWeightSubmodule rep i l) + (hlk : l ≠ k) : W.map (boostProj rep i k) = ⊥ := by + rw [eq_bot_iff] + rintro _ ⟨x, hx, rfl⟩ + rw [boostProj_of_mem_ne rep (h hx) hlk] + exact zero_mem ⊥ + +/-- The submodule image of a projection is unchanged by projecting again. -/ +lemma map_boostProj_idem (i : Fin 3) (k : ℤ) (X : Submodule K A) : + (X.map (boostProj rep i k)).map (boostProj rep i k) = X.map (boostProj rep i k) := + map_boostProj_of_le rep (by rintro _ ⟨y, _, rfl⟩; exact boostProj_mem rep i k y) + +/-- The weight-`k` part of a projection-closed submodule is its projection image. -/ +lemma inf_boostWeightSubmodule_eq_map {k : ℤ} {X : Submodule K A} (h : X.map (boostProj rep i k) ≤ X) : + boostWeightSubmodule rep i k ⊓ X = X.map (boostProj rep i k) := by + refine le_antisymm (fun x hx => ⟨x, hx.2, boostProj_of_mem rep hx.1⟩) (le_inf ?_ h) + rintro _ ⟨y, _, rfl⟩ + exact boostProj_mem rep i k y + +/-- An operator shifting every boost weight by `k - l` carries the weight-`l` component to + the weight-`k` component: the two sides agree on every homogeneous piece, and the pieces + span. -/ +lemma boostProj_comm {D : A →ₗ[K] A} (k l : ℤ) + (hD : ∀ {w : ℤ} {y : A}, y ∈ boostWeightSubmodule rep i w → D y ∈ boostWeightSubmodule rep i (w + k - l)) + (x : A) : boostProj rep i k (D x) = D (boostProj rep i l x) := by + have hx : x ∈ ⨆ m, boostWeightSubmodule rep i m := by rw [iSup_boostWeightSubmodule_eq_top rep]; trivial + induction hx using Submodule.iSup_induction' with + | mem w y hyw => + have hd := hD hyw + by_cases hwl : w = l + · subst hwl + rw [show w + k - w = k from by ring] at hd + rw [boostProj_of_mem rep hd, boostProj_of_mem rep hyw] + · rw [boostProj_of_mem_ne rep hyw hwl, map_zero, + boostProj_of_mem_ne rep hd (show w + k - l ≠ k from by omega)] + | zero => simp only [map_zero] + | add y₁ y₂ _ _ ih₁ ih₂ => simp only [map_add, ih₁, ih₂] + +/-- The weight-`k` part of a product of submodules is bounded by the products of the weight + parts pairing to `k`. -/ +lemma boostProj_map_mul_le (k : ℤ) (V W : Submodule K A) : + (V * W).map (boostProj rep i k) ≤ + ⨆ (l : ℤ), (V.map (boostProj rep i l)) * (W.map (boostProj rep i (k - l))) := by + classical + rw [Submodule.map_le_iff_le_comap] + refine Submodule.mul_le.2 fun v hv w hw => ?_ + rw [Submodule.mem_comap, boostProj_apply, DirectSum.decompose_mul, DirectSum.coe_mul_apply] + refine sum_mem fun ij hij => ?_ + have hk : k - ij.1 = ij.2 := by + have := (Finset.mem_filter.1 hij).2 + omega + refine Submodule.mem_iSup_of_mem ij.1 ?_ + rw [hk] + exact Submodule.mul_mem_mul ⟨v, hv, rfl⟩ ⟨w, hw, rfl⟩ + +/-- For submodules closed under the weight projections the bound of `boostProj_map_mul_le` is an + equality. -/ +lemma boostProj_map_mul (k : ℤ) {V W : Submodule K A} + (hV : ∀ l : ℤ, V.map (boostProj rep i l) ≤ V) (hW : ∀ l : ℤ, W.map (boostProj rep i l) ≤ W) : + (V * W).map (boostProj rep i k) = + ⨆ (l : ℤ), (V.map (boostProj rep i l)) * (W.map (boostProj rep i (k - l))) := by + refine le_antisymm (boostProj_map_mul_le rep k V W) (iSup_le fun l => ?_) + refine Submodule.mul_le.2 fun v' hv' w' hw' => ?_ + refine ⟨v' * w', Submodule.mul_mem_mul (hV l hv') (hW (k - l) hw'), ?_⟩ + obtain ⟨v, hv, rfl⟩ := hv' + obtain ⟨w, hw, rfl⟩ := hw' + exact boostProj_of_mem rep (mul_mem' rep (boostProj_mem rep i l v) (boostProj_mem rep i (k - l) w) + (by ring)) + +end Theory + +end BoostWeight + +end Lorentz + +end From abd01b3a92db3dcc78a0c6f174e5884f0516142d Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Wed, 12 Aug 2026 12:31:48 -0400 Subject: [PATCH 134/254] feat: Add QED formalization Formalize quantum electrodynamics in Physlib.Particles.QED, built on the photon jet algebra of Physlib.Electromagnetism and a Dirac electron: - Basic: jet algebras of the photon (moved from LeptonGaugeSector/Photon.lean) and the Dirac electron (exterior algebra), their tensor product, the gauge jets with their commutative monoid structure, the gauge, Lorentz and mass-scaling actions, the total derivative, and the evaluation on a potential. - Fields, Lagrangian: the jet coordinates, field strength, gamma matrices, covariant derivatives, Dirac current, equations-of-motion elements and the QED Lagrangian L = -1/4 F^2 + i psibar gamma^mu D_mu psi - m psibar psi. - Theorem files (no definitions): fermion statistics, Bianchi identity, Clifford algebra and hermiticity of the gamma matrices, gauge invariance (including the monoid action law), Lorentz invariance, mass-dimension power counting, completeness of the field strength for gauge invariance, minimal coupling and Noether current conservation, and the evaluation bridges to honest electromagnetism (E and B fields, Maxwell Lagrangian, homogeneous Maxwell equations from the Bianchi identity, the action principle for the inhomogeneous Maxwell equations, and compatibility with concrete gauge and Lorentz transformations). Remaining directions are recorded as TODO items. Co-Authored-By: Claude Fable 5 --- Physlib.lean | 12 + .../Particles/LeptonGaugeSector/Photon.lean | 395 ----- Physlib/Particles/QED/Basic.lean | 1519 +++++++++++++++++ Physlib/Particles/QED/CurrentCoupling.lean | 250 +++ Physlib/Particles/QED/Evaluation.lean | 449 +++++ Physlib/Particles/QED/FermionStatistics.lean | 146 ++ Physlib/Particles/QED/FieldStrength.lean | 202 +++ Physlib/Particles/QED/Fields.lean | 176 ++ Physlib/Particles/QED/GammaMatrices.lean | 168 ++ Physlib/Particles/QED/GaugeInvariance.lean | 501 ++++++ Physlib/Particles/QED/JetCompleteness.lean | 216 +++ Physlib/Particles/QED/Lagrangian.lean | 145 ++ Physlib/Particles/QED/LorentzInvariance.lean | 606 +++++++ Physlib/Particles/QED/MassDimension.lean | 254 +++ scripts/style-exceptions.txt | 1 + 15 files changed, 4645 insertions(+), 395 deletions(-) delete mode 100644 Physlib/Particles/LeptonGaugeSector/Photon.lean create mode 100644 Physlib/Particles/QED/Basic.lean create mode 100644 Physlib/Particles/QED/CurrentCoupling.lean create mode 100644 Physlib/Particles/QED/Evaluation.lean create mode 100644 Physlib/Particles/QED/FermionStatistics.lean create mode 100644 Physlib/Particles/QED/FieldStrength.lean create mode 100644 Physlib/Particles/QED/Fields.lean create mode 100644 Physlib/Particles/QED/GammaMatrices.lean create mode 100644 Physlib/Particles/QED/GaugeInvariance.lean create mode 100644 Physlib/Particles/QED/JetCompleteness.lean create mode 100644 Physlib/Particles/QED/Lagrangian.lean create mode 100644 Physlib/Particles/QED/LorentzInvariance.lean create mode 100644 Physlib/Particles/QED/MassDimension.lean diff --git a/Physlib.lean b/Physlib.lean index 2a558526d..bcdde3de4 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -187,6 +187,18 @@ public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.StandardParameters public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Covariantization public import Physlib.Particles.NeutrinoPhysics.Basic +public import Physlib.Particles.QED.Basic +public import Physlib.Particles.QED.CurrentCoupling +public import Physlib.Particles.QED.Evaluation +public import Physlib.Particles.QED.FermionStatistics +public import Physlib.Particles.QED.FieldStrength +public import Physlib.Particles.QED.Fields +public import Physlib.Particles.QED.GammaMatrices +public import Physlib.Particles.QED.GaugeInvariance +public import Physlib.Particles.QED.JetCompleteness +public import Physlib.Particles.QED.Lagrangian +public import Physlib.Particles.QED.LorentzInvariance +public import Physlib.Particles.QED.MassDimension public import Physlib.Particles.StandardModel.AnomalyCancellation.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.FamilyMaps public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.Basic diff --git a/Physlib/Particles/LeptonGaugeSector/Photon.lean b/Physlib/Particles/LeptonGaugeSector/Photon.lean deleted file mode 100644 index a85b798bf..000000000 --- a/Physlib/Particles/LeptonGaugeSector/Photon.lean +++ /dev/null @@ -1,395 +0,0 @@ -/- -Copyright (c) 2026 Jinzheng Li. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Jinzheng Li --/ -module - -public import Physlib.Electromagnetism.Kinematics.GaugeTransformation -public import Physlib.Electromagnetism.Dynamics.KineticTerm -/-! -# The jet algebra of the photon - -## i. Overview - -This file builds, from scratch, the jet algebra of the electromagnetic potential -of `Physlib.Electromagnetism`: the free commutative algebra on formal symbols -`∂_s A_μ`, one for every multiset `s` of spacetime directions and every Lorentz -index `μ`, together with the `U(1)_em` gauge action on those symbols and the -evaluation of the algebra on an honest potential. - -It deliberately does *not* use `Physlib.Particles.StandardModel.GaugeBosons.BBoson`. -The `B` boson is the gauge boson of `U(1)_Y`, defined before electroweak symmetry -breaking; the photon is the mixed combination `A = cos θ_W B + sin θ_W W³`, and -the two are not the same field. Building the photon jet algebra directly on -`ElectromagneticPotential` avoids that identification, and also avoids inheriting -the Standard Model charge normalisation `6Y`, which has no meaning for `U(1)_em`. - -The two results the file is built around are: - -* the field strength and the Maxwell term are invariant under the formal gauge - action, and the proof is exactly the commutativity of multiset addition - (`gaugeAction_fieldStrength`); -* evaluated on any differentiable potential `A`, the formal Maxwell term - `F_{μν} F^{μν}` is `-4 μ₀` times `ElectromagneticPotential.kineticTerm` - (`evalPotential_maxwellTerm`). - -Nothing here involves the charged lepton. Note that a faithful QED matter -sector needs a *Dirac* electron, that is two Weyl spinors of the same chirality -with charges `±Q`, which is what makes the dimension-three mass term -`m ψ̄ ψ` available; a single Weyl fermion admits no such term. - -## ii. Key results - -- `JetGenerators`, `JetAlgebra` : the formal jet coordinates `∂_s A_μ` and the - algebra of real polynomials in them. -- `fieldStrength` : the formal field strength `∂_s F_{μν}`. -- `maxwellTerm` : the formal Maxwell term `F_{μν} F^{μν}`. -- `gaugeAction` : the `U(1)_em` gauge action `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. -- `gaugeAction_fieldStrength`, `gaugeAction_maxwellTerm` : gauge invariance. -- `derivMultiset` : the iterated partial derivative `∂_s` along a multiset. -- `evalPotential` : the evaluation of the jet algebra on a potential. -- `evalPotential_maxwellTerm` : the formal Maxwell term is the Maxwell - Lagrangian of `Physlib.Electromagnetism`. -- `evalPotential_fieldStrength_gaugeTransform` : the evaluation is compatible - with the concrete gauge transformation `A ↦ A + ∂χ`. - -## iii. Table of contents - -- A. The jet coordinates of the photon - - A.1. The field strength - - A.2. The Maxwell term -- B. The gauge action - - B.1. Gauge invariance of the field strength and the Maxwell term -- C. Iterated derivatives indexed by a multiset -- D. Evaluation on a potential - - D.1. Evaluation of the field strength - - D.2. The Maxwell term is the Maxwell Lagrangian - - D.3. Compatibility with concrete gauge transformations - -## iv. References - -The concrete side is `Physlib/Electromagnetism/Kinematics/GaugeTransformation.lean` -and `Physlib/Electromagnetism/Dynamics/KineticTerm.lean`. - --/ - -@[expose] public section - -namespace LeptonGaugeSector - -open Electromagnetism SpaceTime minkowskiMatrix - -attribute [-simp] Fintype.sum_sum_type - -namespace Photon - -/-! - -## A. The jet coordinates of the photon - -A jet coordinate is a formal symbol `∂_s A_μ`, where `s` is a *multiset* of -spacetime directions: for a smooth potential the partial derivatives commute, so -only the number of times each direction occurs matters. The jet algebra is the -algebra of real polynomials in these symbols. - --/ - -/-- The jet coordinates of the electromagnetic potential: the symbol `∂_s A_μ`, - the `s`-th derivative of the `μ`-th covariant component. -/ -inductive JetGenerators where - /-- The jet coordinate `∂_s A_μ`. -/ - | dA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetGenerators - deriving DecidableEq - -/-- The jet algebra of the photon: real polynomials in the jet coordinates. -/ -abbrev JetAlgebra : Type := MvPolynomial JetGenerators ℝ - -namespace JetAlgebra - -/-- The jet coordinate `∂_s A_μ` as an element of the jet algebra. -/ -noncomputable def coord (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetAlgebra := - MvPolynomial.X (JetGenerators.dA s μ) - -/-! - -### A.1. The field strength - --/ - -/-- The formal field strength `∂_s F_{μν} = ∂_s ∂_μ A_ν - ∂_s ∂_ν A_μ`. -/ -noncomputable def fieldStrength (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - JetAlgebra := - coord (s + {μ}) ν - coord (s + {ν}) μ - -lemma fieldStrength_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrength s μ ν = -fieldStrength s ν μ := by - simp [fieldStrength] - -@[simp] -lemma fieldStrength_self (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - fieldStrength s μ μ = 0 := by - simp [fieldStrength] - -/-! - -### A.2. The Maxwell term - --/ - -/-- The formal Maxwell term `F_{μν} F^{μν}`, both indices raised with the - (diagonal) Minkowski metric. -/ -noncomputable def maxwellTerm : JetAlgebra := - ∑ μ, ∑ ν, (η μ μ * η ν ν) • (fieldStrength 0 μ ν * fieldStrength 0 μ ν) - -/-! - -## B. The gauge action - -A `U(1)_em` gauge transformation sends `A_μ ↦ A_μ + ∂_μ χ`, hence on jet -coordinates `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. All that the jet algebra sees of -the gauge function `χ` is the family of its symmetrised derivatives at the base -point, which is what `GaugeJet` records; the shift of `∂_s A_μ` is then the -value of that family at `s + {μ}`. - --/ - -/-- A gauge jet: the family `s ↦ ∂_s χ` of symmetrised derivatives of a gauge - function at the base point. This is all the jet algebra sees of a gauge - transformation. -/ -abbrev GaugeJet : Type := Multiset (Fin 1 ⊕ Fin 3) → ℝ - -/-- The gauge action on the jet algebra: the algebra map determined by - `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. -/ -noncomputable def gaugeAction (c : GaugeJet) : JetAlgebra →ₐ[ℝ] JetAlgebra := - MvPolynomial.aeval fun j => match j with - | JetGenerators.dA s μ => coord s μ + MvPolynomial.C (c (s + {μ})) - -@[simp] -lemma gaugeAction_coord (c : GaugeJet) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - gaugeAction c (coord s μ) = coord s μ + MvPolynomial.C (c (s + {μ})) := by - rw [coord, gaugeAction, MvPolynomial.aeval_X] - rfl - -@[simp] -lemma gaugeAction_C (c : GaugeJet) (r : ℝ) : - gaugeAction c (MvPolynomial.C r) = MvPolynomial.C r := by - rw [gaugeAction, MvPolynomial.aeval_C, MvPolynomial.algebraMap_eq] - -/-- Gauge jets compose by addition: the gauge transformations form a group - acting on the jet algebra. -/ -lemma gaugeAction_comp (c₁ c₂ : GaugeJet) : - (gaugeAction c₁).comp (gaugeAction c₂) = gaugeAction (c₁ + c₂) := by - refine MvPolynomial.algHom_ext fun j => ?_ - obtain ⟨s, μ⟩ := j - rw [AlgHom.comp_apply] - show gaugeAction c₁ (gaugeAction c₂ (coord s μ)) = gaugeAction (c₁ + c₂) (coord s μ) - rw [gaugeAction_coord, gaugeAction_coord, map_add, gaugeAction_coord, gaugeAction_C, - add_assoc, ← MvPolynomial.C_add] - rfl - -@[simp] -lemma gaugeAction_zero : gaugeAction 0 = AlgHom.id ℝ JetAlgebra := by - refine MvPolynomial.algHom_ext fun j => ?_ - obtain ⟨s, μ⟩ := j - show gaugeAction 0 (coord s μ) = coord s μ - simp - -/-! - -### B.1. Gauge invariance of the field strength and the Maxwell term - -The field strength is gauge invariant, and the reason is exactly that multiset -addition is commutative: the two shifts are `∂_s ∂_μ ∂_ν χ` and -`∂_s ∂_ν ∂_μ χ`, indexed by `s + {μ} + {ν}` and `s + {ν} + {μ}`. Clairaut's -theorem is built into the indexing. - --/ - -@[simp] -theorem gaugeAction_fieldStrength (c : GaugeJet) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - gaugeAction c (fieldStrength s μ ν) = fieldStrength s μ ν := by - have hcomm : s + {μ} + {ν} = s + {ν} + {μ} := by - rw [add_assoc, add_assoc, add_comm ({μ} : Multiset _)] - rw [fieldStrength, map_sub, gaugeAction_coord, gaugeAction_coord, hcomm] - ring - -@[simp] -theorem gaugeAction_maxwellTerm (c : GaugeJet) : gaugeAction c maxwellTerm = maxwellTerm := by - rw [maxwellTerm, map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_smul, map_mul, gaugeAction_fieldStrength] - -/-! - -## C. Iterated derivatives indexed by a multiset - -To evaluate a jet coordinate on a potential we must differentiate along a -multiset of directions, so we must choose an order; we choose the canonical one, -sorting `s` through `Fin 1 ⊕ Fin 3 ≃ Fin 4`. For a `C^∞` potential the choice -is immaterial, by Clairaut's theorem (`SpaceTime.deriv_commute`). - --/ - -/-- The iterated partial derivative `∂_s f` along a multiset `s` of spacetime - directions, taken in the canonical order obtained by sorting `s`. -/ -noncomputable def derivMultiset (s : Multiset (Fin 1 ⊕ Fin 3)) (f : SpaceTime 3 → ℝ) : - SpaceTime 3 → ℝ := - ((s.map (finSumFinEquiv (m := 1) (n := 3))).sort).foldr - (fun i g => ∂_ ((finSumFinEquiv (m := 1) (n := 3)).symm i) g) f - -@[simp] -lemma derivMultiset_zero (f : SpaceTime 3 → ℝ) : derivMultiset 0 f = f := by - simp [derivMultiset] - -@[simp] -lemma derivMultiset_singleton (μ : Fin 1 ⊕ Fin 3) (f : SpaceTime 3 → ℝ) : - derivMultiset {μ} f = ∂_ μ f := by - simp [derivMultiset] - -/-! - -## D. Evaluation on a potential - -`ElectromagneticPotential` stores the contravariant components `A^μ`, whereas a -gauge potential carries a lower index, so the jet coordinate `∂_s A_μ` evaluates -to the `s`-th derivative of `A_μ = η_{μμ} A^μ`. - --/ - -/-- The covariant components `A_μ = η_{μμ} A^μ` of an electromagnetic potential. -/ -noncomputable def coPotential (A : ElectromagneticPotential 3) (μ : Fin 1 ⊕ Fin 3) : - SpaceTime 3 → ℝ := fun x => η μ μ * A x μ - -/-- The evaluation of the photon jet algebra at an electromagnetic potential `A`: - the algebra map sending the formal jet coordinate `∂_s A_μ` to the honest - function `∂_s A_μ` on spacetime. -/ -noncomputable def evalPotential (A : ElectromagneticPotential 3) : - JetAlgebra →ₐ[ℝ] (SpaceTime 3 → ℝ) := - MvPolynomial.aeval fun j => match j with - | JetGenerators.dA s μ => derivMultiset s (coPotential A μ) - -@[simp] -lemma evalPotential_coord (A : ElectromagneticPotential 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : - evalPotential A (coord s μ) = derivMultiset s (coPotential A μ) := by - rw [coord, evalPotential, MvPolynomial.aeval_X] - -/-! - -### D.1. Evaluation of the field strength - --/ - -/-- The derivative of a covariant component. Differentiability is needed to move - the constant `η_{νν}` through the derivative. -/ -lemma deriv_coPotential (A : ElectromagneticPotential 3) (hA : Differentiable ℝ A) - (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : - ∂_ μ (coPotential A ν) x = η ν ν * ∂_ μ A x ν := by - have hd : Differentiable ℝ (fun y => A y ν) := (SpaceTime.differentiable_vector _).mpr hA ν - rw [SpaceTime.deriv_apply_eq μ ν _ hA x] - show fderiv ℝ (fun y => η ν ν * A y ν) x (Lorentz.Vector.basis μ) = _ - rw [fderiv_const_mul (hd x)] - simp - -lemma evalPotential_fieldStrength_zero_apply (A : ElectromagneticPotential 3) - (hA : Differentiable ℝ A) (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : - evalPotential A (fieldStrength 0 μ ν) x = η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ := by - rw [fieldStrength, map_sub] - simp only [zero_add, evalPotential_coord, derivMultiset_singleton, Pi.sub_apply] - rw [deriv_coPotential A hA μ ν x, deriv_coPotential A hA ν μ x] - -/-- The formal field strength evaluates to the field strength of the potential - with both indices lowered, `F_{μν} = η_{μμ} η_{νν} F^{μν}`. -/ -lemma evalPotential_fieldStrength_zero (A : ElectromagneticPotential 3) - (hA : Differentiable ℝ A) (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : - evalPotential A (fieldStrength 0 μ ν) x = - η μ μ * η ν ν * A.fieldStrengthMatrix x (μ, ν) := by - rw [evalPotential_fieldStrength_zero_apply A hA μ ν x, - ElectromagneticPotential.toFieldStrength_basis_repr_apply_eq_single (μν := (μ, ν))] - rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag μ) with h1 | h1 <;> - rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with h2 | h2 <;> - rw [h1, h2] <;> ring - -/-! - -### D.2. The Maxwell term is the Maxwell Lagrangian - --/ - -/-- **The formal Maxwell term is the Maxwell Lagrangian.** Evaluated on any - differentiable electromagnetic potential, the gauge-invariant jet polynomial - `F_{μν} F^{μν}` is `-4 μ₀` times the kinetic term - `- 1/(4 μ₀) F_{μν} F^{μν}` of `Physlib.Electromagnetism`. -/ -theorem evalPotential_maxwellTerm (𝓕 : FreeSpace) (A : ElectromagneticPotential 3) - (hA : Differentiable ℝ A) (x : SpaceTime 3) : - evalPotential A maxwellTerm x = -(4 * 𝓕.μ₀) * A.kineticTerm 𝓕 x := by - rw [ElectromagneticPotential.kineticTerm_eq_sum_potential, maxwellTerm, map_sum] - simp only [Finset.sum_apply, map_sum, map_smul, Pi.smul_apply, smul_eq_mul, map_mul, - Pi.mul_apply] - simp only [evalPotential_fieldStrength_zero_apply A hA] - /- Both sides are now explicit double sums in `∂_ μ A x ν`. -/ - have key : ∀ μ ν : Fin 1 ⊕ Fin 3, - η μ μ * η ν ν * ((η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ) * - (η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ)) = - (η μ μ * η ν ν * (∂_ μ A x ν) ^ 2 - ∂_ μ A x ν * ∂_ ν A x μ) + - (η ν ν * η μ μ * (∂_ ν A x μ) ^ 2 - ∂_ ν A x μ * ∂_ μ A x ν) := by - intro μ ν - rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag μ) with h1 | h1 <;> - rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with h2 | h2 <;> - rw [h1, h2] <;> ring - rw [Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun ν _ => key μ ν] - simp only [Finset.sum_add_distrib] - rw [Finset.sum_comm (s := Finset.univ) (t := Finset.univ) - (f := fun μ ν : Fin 1 ⊕ Fin 3 => - η ν ν * η μ μ * (∂_ ν A x μ) ^ 2 - ∂_ ν A x μ * ∂_ μ A x ν)] - have hμ₀ : 𝓕.μ₀ ≠ 0 := ne_of_gt 𝓕.μ₀_pos - field_simp - ring - -/-! - -### D.3. Compatibility with concrete gauge transformations - -The formal gauge invariance of section B.1 is matched on the concrete side: the -evaluation of the field strength, and hence of the Maxwell term, is unchanged -when the potential is replaced by `A + ∂χ`. - --/ - -lemma differentiable_gaugeTransform {A : ElectromagneticPotential 3} {χ : SpaceTime 3 → ℝ} - (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) : - Differentiable ℝ (ElectromagneticPotential.gaugeTransform χ A) := - hA.add (ElectromagneticPotential.differentiable_ofGradient hχ) - -/-- The evaluated field strength is invariant under the concrete gauge - transformation `A ↦ A + ∂χ`, matching `gaugeAction_fieldStrength`. -/ -theorem evalPotential_fieldStrength_gaugeTransform (A : ElectromagneticPotential 3) - (χ : SpaceTime 3 → ℝ) (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) - (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : - evalPotential (ElectromagneticPotential.gaugeTransform χ A) (fieldStrength 0 μ ν) x = - evalPotential A (fieldStrength 0 μ ν) x := by - rw [evalPotential_fieldStrength_zero _ (differentiable_gaugeTransform hA hχ), - evalPotential_fieldStrength_zero A hA, - ElectromagneticPotential.fieldStrengthMatrix_gaugeTransform A χ hA hχ] - -/-- The Maxwell Lagrangian is gauge invariant, as read off from the jet algebra. -/ -theorem evalPotential_maxwellTerm_gaugeTransform (A : ElectromagneticPotential 3) - (χ : SpaceTime 3 → ℝ) (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) - (x : SpaceTime 3) : - evalPotential (ElectromagneticPotential.gaugeTransform χ A) maxwellTerm x = - evalPotential A maxwellTerm x := by - rw [maxwellTerm, map_sum, map_sum] - simp only [Finset.sum_apply, map_sum, map_smul, Pi.smul_apply, smul_eq_mul, map_mul, - Pi.mul_apply] - refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun ν _ => ?_ - rw [evalPotential_fieldStrength_gaugeTransform A χ hA hχ] - -end JetAlgebra - -end Photon - -end LeptonGaugeSector diff --git a/Physlib/Particles/QED/Basic.lean b/Physlib/Particles/QED/Basic.lean new file mode 100644 index 000000000..0a599bd49 --- /dev/null +++ b/Physlib/Particles/QED/Basic.lean @@ -0,0 +1,1519 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Electromagnetism.Kinematics.GaugeTransformation +public import Physlib.Electromagnetism.Dynamics.KineticTerm +public import Physlib.Relativity.SL2C.Basic +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +public import Mathlib.LinearAlgebra.Finsupp.LSum +public import Mathlib.Data.Multiset.Antidiagonal +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.Algebra.MvPolynomial.Derivation +public import Mathlib.Algebra.TrivSqZeroExt.Basic +/-! +# The jet algebras of quantum electrodynamics + +## i. Overview + +This file contains *all the definitions* of the jet-algebra formulation of +quantum electrodynamics: the jet algebras of the photon and of the Dirac +electron, their tensor product — the QED jet algebra — the data of a gauge +transformation as seen by jets, the gauge actions on all three algebras, and +the evaluation of the photon jet algebra on an honest electromagnetic +potential. + +The *fields* of QED (the jet coordinates, the field strength, the γ matrices +and the covariant derivatives) are defined on top of these algebras in +`Physlib.Particles.QED.Fields`, and the Lagrangian in `Physlib.Particles.QED.Lagrangian`. All +theorems about them are proved in the definition-free files +`Physlib.Particles.QED.FermionStatistics`, `Physlib.Particles.QED.FieldStrength`, +`Physlib.Particles.QED.GammaMatrices`, `Physlib.Particles.QED.GaugeInvariance` and +`Physlib.Particles.QED.Evaluation`. + +The design choices: + +* The photon jet algebra is the free commutative algebra on formal symbols + `∂_s A_μ`, one for every multiset `s` of spacetime directions and every + Lorentz index `μ`, built directly on the electromagnetic potential of + `Physlib.Electromagnetism`. It deliberately does *not* use + `Physlib.Particles.StandardModel.GaugeBosons.BBoson`: the `B` boson is the + gauge boson of `U(1)_Y` before electroweak symmetry breaking, the photon is + the mixed combination `A = cos θ_W B + sin θ_W W³`, and the two are not the + same field. Building directly on `ElectromagneticPotential` also avoids + inheriting the Standard Model charge normalisation `6Y`, which has no + meaning for `U(1)_em`. + +* The electron jet algebra is the free *exterior* algebra on formal symbols + `∂_s ψ_α`, `∂_s ψ̄_α` with `α : Fin 2 ⊕ Fin 2` a Dirac index in the chiral + representation; the exterior product implements fermionic statistics. A + faithful QED matter sector needs a *Dirac* electron — equivalently two Weyl + spinors of the same chirality with charges `±1` — which is what makes the + dimension-three mass term `m ψ̄ ψ` possible; a single Weyl fermion admits no + such term. + +* A gauge transformation is recorded by its jets: the derivative jets + `∂_s χ` of the real gauge function together with the derivative jets + `∂_s (exp (I e χ))` of its unitary phase, related by the formal Leibniz + identity `∂_μ u = I e (∂_μ χ) u`. The action on the photon coordinates is + the affine shift `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`, and on the electron + coordinates the Leibniz expansion of `∂_s (ū ψ)` over + `Multiset.antidiagonal s`, whose multiplicities are exactly the multinomial + coefficients of the Leibniz rule. + +This construction mirrors `Physlib.Particles.LeptonGaugeSector`, where the +analogous algebra for a single charged Weyl fermion is built from +representation-theoretic data. + +## ii. Key results + +- `Photon.JetGenerators`, `Photon.JetAlgebra`, `Photon.JetAlgebra.coord` : + the photon jet coordinates `∂_s A_μ` and their polynomial algebra. +- `Photon.JetAlgebra.gaugeAction` : the affine gauge action on the photon jet + algebra. +- `Photon.JetAlgebra.evalPotential` : the evaluation of the photon jet + algebra on an electromagnetic potential. +- `GaugeJet` : the jets of a `U(1)_em` gauge transformation with coupling `e`. +- `Electron.JetGenerators`, `Electron.JetAlgebra` : the electron jet + coordinates `∂_s ψ_α`, `∂_s ψ̄_α` and their exterior algebra. +- `Electron.JetAlgebra.gaugeAction` : the Leibniz gauge action on the + electron jet algebra. +- `JetAlgebra` : the QED jet algebra, the tensor product of the complexified + photon jet algebra with the electron jet algebra. +- `JetAlgebra.gaugeAction` : the gauge action on the QED jet algebra. +- `JetAlgebra.lorentzAction` : the Lorentz action on the QED jet algebra, + through the covering map `Lorentz.SL2C.toLorentzGroup` on the photon factor + and the Dirac spinor representation `Electron.JetAlgebra.spinorRep` on the + electron factor. +- `JetAlgebra.massScale` : the mass-weight scaling on the QED jet algebra. + +## iii. Table of contents + +- 0. Transport of derivative indices along a Lorentz transformation +- A. The jet algebra of the photon + - A.1. The jet coordinates + - A.2. The gauge action on the photon jet algebra + - A.3. Iterated derivatives indexed by a multiset + - A.4. Evaluation on a potential + - A.5. The Lorentz action on the photon jet algebra + - A.6. The mass-weight scaling on the photon jet algebra +- B. The gauge jet of a `U(1)_em` transformation + - B.1. Low-order consequences of the Leibniz identity +- C. The jet algebra of the electron + - C.1. The jet coordinates + - C.2. The gauge action on the electron jet algebra + - C.3. The action on the low-order jet coordinates + - C.4. The Lorentz action on the electron jet algebra + - C.5. The mass-weight scaling on the electron jet algebra +- D. The jet algebra of QED + - D.1. Pure tensors and their arithmetic + - D.2. The inclusions of the two factors + - D.3. The gauge action on the QED jet algebra + - D.4. The Lorentz action on the QED jet algebra + - D.5. The mass-weight scaling on the QED jet algebra + +## iv. References + +The concrete electromagnetic side is +`Physlib/Electromagnetism/Kinematics/GaugeTransformation.lean` and +`Physlib/Electromagnetism/Dynamics/KineticTerm.lean`. + +-/ + +@[expose] public section + +namespace QED + +open Electromagnetism SpaceTime minkowskiMatrix TensorProduct +open Matrix MatrixGroups + +/-! + +## 0. Transport of derivative indices along a Lorentz transformation + +A jet coordinate carries a multiset of derivative indices, each of which +transforms with `Λ⁻¹` under a Lorentz transformation (the chain rule for +`x ↦ Λ⁻¹ x`). To sum over the transformed indices without summing over +functions on a multiset, the transport recurses along the *canonical sorted +list* of the multiset, threading the chosen indices through a continuation. + +-/ + +/-- The canonical sorted list of a multiset of spacetime directions, sorted + through `Fin 1 ⊕ Fin 3 ≃ Fin 4`. -/ +noncomputable def indexList (s : Multiset (Fin 1 ⊕ Fin 3)) : List (Fin 1 ⊕ Fin 3) := + ((s.map (finSumFinEquiv (m := 1) (n := 3))).sort).map + (finSumFinEquiv (m := 1) (n := 3)).symm + +@[simp] +lemma indexList_zero : indexList 0 = [] := by + simp [indexList] + +@[simp] +lemma indexList_singleton (μ : Fin 1 ⊕ Fin 3) : indexList {μ} = [μ] := by + simp [indexList] + +lemma mem_indexList {t : Multiset (Fin 1 ⊕ Fin 3)} {a : Fin 1 ⊕ Fin 3} : + a ∈ indexList t ↔ a ∈ t := by + simp only [indexList, List.mem_map, Multiset.mem_sort, Multiset.mem_map] + constructor + · rintro ⟨b, ⟨c, hc, rfl⟩, rfl⟩ + simpa using hc + · intro ha + exact ⟨finSumFinEquiv a, ⟨a, ha, rfl⟩, by simp⟩ + +lemma indexList_length (t : Multiset (Fin 1 ⊕ Fin 3)) : + (indexList t).length = Multiset.card t := by + simp [indexList, Multiset.length_sort] + +/-- The canonical representative of a nonempty multiset of spacetime + directions: the head of its canonical sorted list. -/ +noncomputable def classRep (t : Multiset (Fin 1 ⊕ Fin 3)) : Fin 1 ⊕ Fin 3 := + (indexList t).headI + +lemma classRep_mem {t : Multiset (Fin 1 ⊕ Fin 3)} (ht : t ≠ 0) : classRep t ∈ t := by + have hne : indexList t ≠ [] := by + intro h + refine ht (Multiset.card_eq_zero.mp ?_) + rw [← indexList_length t, h, List.length_nil] + rw [← mem_indexList, classRep] + cases hl : indexList t with + | nil => exact absurd hl hne + | cons a l => simp + +attribute [irreducible] classRep + +/-- The Lorentz transport of a family indexed by derivative multisets along a + list of derivative directions: each direction in the list is summed against + a row of `Λ⁻¹`, and the chosen directions accumulate in the multiset + argument of the continuation `k`. -/ +noncomputable def derivSum {M : Type*} [AddCommMonoid M] [Module ℝ M] + (Λ : LorentzGroup 3) : + List (Fin 1 ⊕ Fin 3) → (Multiset (Fin 1 ⊕ Fin 3) → M) → M + | [], k => k 0 + | σ :: l, k => ∑ τ, (Λ⁻¹).1 τ σ • derivSum Λ l fun t => k (t + {τ}) + +@[simp] +lemma derivSum_nil {M : Type*} [AddCommMonoid M] [Module ℝ M] + (Λ : LorentzGroup 3) (k : Multiset (Fin 1 ⊕ Fin 3) → M) : + derivSum Λ [] k = k 0 := rfl + +@[simp] +lemma derivSum_cons {M : Type*} [AddCommMonoid M] [Module ℝ M] + (Λ : LorentzGroup 3) (σ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) + (k : Multiset (Fin 1 ⊕ Fin 3) → M) : + derivSum Λ (σ :: l) k = + ∑ τ, (Λ⁻¹).1 τ σ • derivSum Λ l fun t => k (t + {τ}) := rfl + +namespace Photon + +/-! + +## A. The jet algebra of the photon + +### A.1. The jet coordinates + +A jet coordinate is a formal symbol `∂_s A_μ`, where `s` is a *multiset* of +spacetime directions: for a smooth potential the partial derivatives commute, +so only the number of times each direction occurs matters. The jet algebra is +the algebra of real polynomials in these symbols. + +-/ + +/-- The jet coordinates of the electromagnetic potential: the symbol `∂_s A_μ`, + the `s`-th derivative of the `μ`-th covariant component. -/ +inductive JetGenerators where + /-- The jet coordinate `∂_s A_μ`. -/ + | dA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetGenerators + deriving DecidableEq + +/-- The mass weight (twice the mass dimension) of a photon jet coordinate: + the potential has mass dimension one and each derivative adds one. -/ +def JetGenerators.massWeight : JetGenerators → ℕ + | .dA s _ => 2 + 2 * s.card + +/-- The symmetrized-index class of a photon jet coordinate: under a gauge + transformation `∂_s A_μ` shifts by `∂_s ∂_μ χ`, which depends only on the + multiset `s + {μ}`. Coordinates in a common class shift together. -/ +def JetGenerators.indexClass : JetGenerators → Multiset (Fin 1 ⊕ Fin 3) + | .dA s μ => s + {μ} + +/-- The canonical jet coordinate of a symmetrized-index class: the coordinate + whose Lorentz index is the canonical representative of the class. -/ +noncomputable def JetGenerators.classProj (j : JetGenerators) : JetGenerators := + .dA (j.indexClass.erase (classRep j.indexClass)) (classRep j.indexClass) + +/-- The jet algebra of the photon: real polynomials in the jet coordinates. -/ +abbrev JetAlgebra : Type := MvPolynomial JetGenerators ℝ + +namespace JetAlgebra + +/-- The jet coordinate `∂_s A_μ` as an element of the jet algebra. -/ +noncomputable def coord (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetAlgebra := + MvPolynomial.X (JetGenerators.dA s μ) + +/-! + +### A.2. The gauge action on the photon jet algebra + +A `U(1)_em` gauge transformation sends `A_μ ↦ A_μ + ∂_μ χ`, hence on jet +coordinates `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. All that the photon jet algebra +sees of the gauge function `χ` is the family of its symmetrised derivatives at +the base point, which is what `GaugeJet` records; the shift of `∂_s A_μ` is +then the value of that family at `s + {μ}`. + +-/ + +/-- A photon gauge jet: the family `s ↦ ∂_s χ` of symmetrised derivatives of a + gauge function at the base point. This is all the photon jet algebra sees of + a gauge transformation. -/ +abbrev GaugeJet : Type := Multiset (Fin 1 ⊕ Fin 3) → ℝ + +/-- The gauge action on the photon jet algebra: the algebra map determined by + `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. -/ +noncomputable def gaugeAction (c : GaugeJet) : JetAlgebra →ₐ[ℝ] JetAlgebra := + MvPolynomial.aeval fun j => match j with + | JetGenerators.dA s μ => coord s μ + MvPolynomial.C (c (s + {μ})) + +@[simp] +lemma gaugeAction_coord (c : GaugeJet) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + gaugeAction c (coord s μ) = coord s μ + MvPolynomial.C (c (s + {μ})) := by + rw [coord, gaugeAction, MvPolynomial.aeval_X] + rfl + +@[simp] +lemma gaugeAction_C (c : GaugeJet) (r : ℝ) : + gaugeAction c (MvPolynomial.C r) = MvPolynomial.C r := by + rw [gaugeAction, MvPolynomial.aeval_C, MvPolynomial.algebraMap_eq] + +/-! + +### A.3. Iterated derivatives indexed by a multiset + +To evaluate a jet coordinate on a potential we must differentiate along a +multiset of directions, so we must choose an order; we choose the canonical +one, sorting `s` through `Fin 1 ⊕ Fin 3 ≃ Fin 4`. For a `C^∞` potential the +choice is immaterial, by Clairaut's theorem (`SpaceTime.deriv_commute`). + +-/ + +/-- The iterated partial derivative `∂_s f` along a multiset `s` of spacetime + directions, taken in the canonical order obtained by sorting `s`. -/ +noncomputable def derivMultiset (s : Multiset (Fin 1 ⊕ Fin 3)) (f : SpaceTime 3 → ℝ) : + SpaceTime 3 → ℝ := + ((s.map (finSumFinEquiv (m := 1) (n := 3))).sort).foldr + (fun i g => ∂_ ((finSumFinEquiv (m := 1) (n := 3)).symm i) g) f + +@[simp] +lemma derivMultiset_zero (f : SpaceTime 3 → ℝ) : derivMultiset 0 f = f := by + simp [derivMultiset] + +@[simp] +lemma derivMultiset_singleton (μ : Fin 1 ⊕ Fin 3) (f : SpaceTime 3 → ℝ) : + derivMultiset {μ} f = ∂_ μ f := by + simp [derivMultiset] + +/-! + +### A.4. Evaluation on a potential + +`ElectromagneticPotential` stores the contravariant components `A^μ`, whereas +a gauge potential carries a lower index, so the jet coordinate `∂_s A_μ` +evaluates to the `s`-th derivative of `A_μ = η_{μμ} A^μ`. + +-/ + +/-- The covariant components `A_μ = η_{μμ} A^μ` of an electromagnetic potential. -/ +noncomputable def coPotential (A : ElectromagneticPotential 3) (μ : Fin 1 ⊕ Fin 3) : + SpaceTime 3 → ℝ := fun x => η μ μ * A x μ + +/-- The evaluation of the photon jet algebra at an electromagnetic potential `A`: + the algebra map sending the formal jet coordinate `∂_s A_μ` to the honest + function `∂_s A_μ` on spacetime. -/ +noncomputable def evalPotential (A : ElectromagneticPotential 3) : + JetAlgebra →ₐ[ℝ] (SpaceTime 3 → ℝ) := + MvPolynomial.aeval fun j => match j with + | JetGenerators.dA s μ => derivMultiset s (coPotential A μ) + +@[simp] +lemma evalPotential_coord (A : ElectromagneticPotential 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + evalPotential A (coord s μ) = derivMultiset s (coPotential A μ) := by + rw [coord, evalPotential, MvPolynomial.aeval_X] + +/-! + +### A.5. The Lorentz action on the photon jet algebra + +Under a Lorentz transformation the potential transforms as a covector field, +`A'(x) = (Λ⁻¹)ᵀ A (Λ⁻¹ x)`, so every lower index of the jet coordinate +`∂_s A_μ` — the index `μ` and each derivative index in `s` — is summed +against a row of `Λ⁻¹`. + +-/ + +/-- The Lorentz action on the photon jet algebra: the algebra map transporting + every lower index of `∂_s A_μ` with `Λ⁻¹`. -/ +noncomputable def lorentzAction (Λ : LorentzGroup 3) : JetAlgebra →ₐ[ℝ] JetAlgebra := + MvPolynomial.aeval fun j => match j with + | JetGenerators.dA s μ => + derivSum Λ (indexList s) fun t => ∑ ν, (Λ⁻¹).1 ν μ • coord t ν + +@[simp] +lemma lorentzAction_coord (Λ : LorentzGroup 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + lorentzAction Λ (coord s μ) = + derivSum Λ (indexList s) fun t => ∑ ν, (Λ⁻¹).1 ν μ • coord t ν := by + rw [coord, lorentzAction, MvPolynomial.aeval_X] + +lemma lorentzAction_coord_zero (Λ : LorentzGroup 3) (μ : Fin 1 ⊕ Fin 3) : + lorentzAction Λ (coord 0 μ) = ∑ ν, (Λ⁻¹).1 ν μ • coord 0 ν := by + rw [lorentzAction_coord, indexList_zero, derivSum_nil] + +lemma lorentzAction_coord_singleton (Λ : LorentzGroup 3) (σ μ : Fin 1 ⊕ Fin 3) : + lorentzAction Λ (coord {σ} μ) = + ∑ τ, ∑ ν, ((Λ⁻¹).1 τ σ * (Λ⁻¹).1 ν μ) • coord {τ} ν := by + rw [lorentzAction_coord, indexList_singleton, derivSum_cons] + refine Finset.sum_congr rfl fun τ _ => ?_ + rw [derivSum_nil, Finset.smul_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [smul_smul, zero_add] + +/-! + +### A.6. The mass-weight scaling on the photon jet algebra + +-/ + +/-- The mass-weight scaling on the photon jet algebra: the algebra map + multiplying each jet coordinate by `c` to the power of its mass weight. -/ +noncomputable def massScale (c : ℝ) : JetAlgebra →ₐ[ℝ] JetAlgebra := + MvPolynomial.aeval fun j => c ^ j.massWeight • MvPolynomial.X j + +@[simp] +lemma massScale_coord (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + massScale c (coord s μ) = c ^ (2 + 2 * Multiset.card s) • coord s μ := by + rw [coord, massScale, MvPolynomial.aeval_X] + rfl + +/-! + +### A.7. The formal total derivative on the photon jet algebra + +-/ + +/-- The formal total spacetime derivative on the photon jet algebra in the + direction `ρ`: the derivation appending the derivative index, + `∂_s A_μ ↦ ∂_{s + {ρ}} A_μ`. -/ +noncomputable def jetDeriv (ρ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℝ] JetAlgebra := + (MvPolynomial.mkDerivation ℝ fun j => match j with + | JetGenerators.dA s μ => coord (s + {ρ}) μ : Derivation ℝ JetAlgebra JetAlgebra) + +@[simp] +lemma jetDeriv_coord (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + jetDeriv ρ (coord s μ) = coord (s + {ρ}) μ := by + rw [coord] + exact MvPolynomial.mkDerivation_X _ _ _ + +@[simp] +lemma jetDeriv_one (ρ : Fin 1 ⊕ Fin 3) : jetDeriv ρ (1 : JetAlgebra) = 0 := + Derivation.map_one_eq_zero _ + +/-- The total derivative is a derivation on the photon jet algebra. -/ +lemma jetDeriv_mul (ρ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv ρ (x * y) = jetDeriv ρ x * y + x * jetDeriv ρ y := by + have h : jetDeriv ρ (x * y) = x • jetDeriv ρ y + y • jetDeriv ρ x := + Derivation.leibniz _ x y + rw [h, smul_eq_mul, smul_eq_mul] + ring + +/-- The Leibniz rule for the complexified total derivative. -/ +lemma jetDeriv_baseChange_mul (ρ : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] JetAlgebra) : + LinearMap.baseChange ℂ (jetDeriv ρ) (x * y) = + LinearMap.baseChange ℂ (jetDeriv ρ) x * y + + x * LinearMap.baseChange ℂ (jetDeriv ρ) y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + abel + | tmul c p => + induction y using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => + simp only [mul_add, map_add, ha, hb] + abel + | tmul c' p' => + simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, + jetDeriv_mul, TensorProduct.tmul_add] + +end JetAlgebra + +end Photon + +/-! + +## B. The gauge jet of a `U(1)_em` transformation + +A gauge transformation with gauge function `χ` acts on the photon by +`A_μ ↦ A_μ + ∂_μ χ` and on a field of charge `q` by `ψ ↦ exp (I q e χ) ψ`. +All that the jet algebras see of `χ` are its derivative jets `c s = ∂_s χ`, +and all they see of the phase are the derivative jets +`u s = ∂_s (exp (I e χ))`. The two families are not independent: +differentiating the exponential gives `∂_μ u = I e (∂_μ χ) u`, whose `s`-th +derivative is a Leibniz sum over the splittings of `s`. +`Multiset.antidiagonal` counts each splitting with its multiplicity, which is +exactly the multinomial weight of the Leibniz rule. + +-/ + +/-- Summing an indicator supported on the splittings `(0, t)` over the + antidiagonal of `t` picks out `f t`: the splitting `(0, t)` occurs exactly + once in `Multiset.antidiagonal t`. -/ +lemma sum_map_antidiagonal_ite {M : Type*} [AddCommMonoid M] + (t : Multiset (Fin 1 ⊕ Fin 3)) (f : Multiset (Fin 1 ⊕ Fin 3) → M) : + ((t.antidiagonal).map fun p => if p.1 = 0 then f p.2 else 0).sum = f t := by + induction t using Multiset.induction_on generalizing f with + | empty => simp + | cons a s ih => + rw [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Multiset.map_map] + have h2 : ((s.antidiagonal).map + ((fun p => if p.1 = 0 then f p.2 else 0) ∘ + Prod.map (Multiset.cons a) id)).sum = 0 := + Multiset.sum_eq_zero fun x hx => by + obtain ⟨p, _, rfl⟩ := Multiset.mem_map.mp hx + simp + rw [h2, add_zero, + show ((fun p => if p.1 = 0 then f p.2 else 0) ∘ Prod.map id (Multiset.cons a)) = + fun p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3) => + if p.1 = 0 then f (a ::ₘ p.2) else 0 from rfl] + exact ih fun u => f (a ::ₘ u) + +/-- The Leibniz convolution of a phase family against a module-valued family + of jets, over the antidiagonal of the derivative multiset: the formal + expansion `∂_s (u ⬝ f) = ∑_{x + y = s} (∂_x u) (∂_y f)`, with the + multiplicities of `Multiset.antidiagonal` supplying the multinomial + weights. -/ +noncomputable def phaseAct {M : Type*} [AddCommMonoid M] [Module ℂ M] + (u : Multiset (Fin 1 ⊕ Fin 3) → ℂ) (f : Multiset (Fin 1 ⊕ Fin 3) → M) : + Multiset (Fin 1 ⊕ Fin 3) → M := + fun s => (s.antidiagonal.map fun p => u p.1 • f p.2).sum + +section PhaseAct + +variable {M : Type*} [AddCommMonoid M] [Module ℂ M] +variable (u u₁ u₂ v : Multiset (Fin 1 ⊕ Fin 3) → ℂ) +variable (f g : Multiset (Fin 1 ⊕ Fin 3) → M) + +@[simp] +lemma phaseAct_zero_arg : phaseAct u f 0 = u 0 • f 0 := by + simp [phaseAct] + +/-- The convolution as a literal antidiagonal sum of products, for + scalar-valued families. -/ +lemma phaseAct_eq_sum (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct u v s = (s.antidiagonal.map fun p => u p.1 * v p.2).sum := rfl + +/-- The Leibniz rule of the convolution: differentiating a convolution + differentiates one factor at a time. -/ +lemma phaseAct_add_singleton (a : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct u f (s + {a}) = + phaseAct u (fun t => f (t + {a})) s + + phaseAct (fun t => u (t + {a})) f s := by + rw [phaseAct, show s + {a} = a ::ₘ s from by + rw [Multiset.add_comm, Multiset.singleton_add], + Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Multiset.map_map] + congr 1 + · refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + rw [Multiset.add_comm, Multiset.singleton_add] + · refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + rw [Multiset.add_comm, Multiset.singleton_add] + +lemma phaseAct_add_left (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct (fun t => u₁ t + u₂ t) f s = phaseAct u₁ f s + phaseAct u₂ f s := by + rw [phaseAct, phaseAct, phaseAct, ← Multiset.sum_map_add] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => add_smul _ _ _) + +lemma phaseAct_add_right (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct u (fun t => f t + g t) s = phaseAct u f s + phaseAct u g s := by + rw [phaseAct, phaseAct, phaseAct, ← Multiset.sum_map_add] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => smul_add _ _ _) + +lemma phaseAct_smul_left (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct (fun t => c * u t) f s = c • phaseAct u f s := by + rw [phaseAct, phaseAct, Multiset.smul_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply] + exact mul_smul _ _ _ + +lemma phaseAct_smul_right (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct u (fun t => c • f t) s = c • phaseAct u f s := by + rw [phaseAct, phaseAct, Multiset.smul_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply] + exact smul_comm _ _ _ + +/-- Associativity of the convolution: acting by `u` after `v` is acting by + the convolution `u ⋆ v`. -/ +lemma phaseAct_assoc (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct u (phaseAct v f) s = phaseAct (phaseAct u v) f s := by + induction s using Multiset.induction_on generalizing u v f with + | empty => + simp [smul_smul] + | cons a s ih => + rw [show a ::ₘ s = s + {a} from by + rw [Multiset.add_comm, Multiset.singleton_add]] + rw [phaseAct_add_singleton, phaseAct_add_singleton, + show (fun t => phaseAct v f (t + {a})) = fun t => + phaseAct v (fun t' => f (t' + {a})) t + + phaseAct (fun t' => v (t' + {a})) f t from + funext fun t => phaseAct_add_singleton v f a t, + phaseAct_add_right, ih, ih, ih, + show (fun t => phaseAct u v (t + {a})) = fun t => + phaseAct u (fun t' => v (t' + {a})) t + + phaseAct (fun t' => u (t' + {a})) v t from + funext fun t => phaseAct_add_singleton u v a t, + phaseAct_add_left] + abel + +/-- Commutativity of the scalar convolution. -/ +lemma phaseAct_comm (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct u v s = phaseAct v u s := by + induction s using Multiset.induction_on generalizing u v with + | empty => simp [smul_eq_mul, mul_comm] + | cons a s ih => + rw [show a ::ₘ s = s + {a} from by + rw [Multiset.add_comm, Multiset.singleton_add]] + rw [phaseAct_add_singleton, phaseAct_add_singleton, + ih u fun t => v (t + {a}), ih (fun t => u (t + {a})) v] + exact add_comm (phaseAct (fun t => v (t + {a})) u s) + (phaseAct v (fun t => u (t + {a})) s) + +/-- A linear map passes through the convolution. -/ +lemma map_phaseAct {N : Type*} [AddCommMonoid N] [Module ℂ N] (L : M →ₗ[ℂ] N) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + L (phaseAct u f s) = phaseAct u (fun t => L (f t)) s := by + rw [phaseAct, phaseAct, map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => map_smul L _ _) + +/-- The convolution against the indicator of the empty multiset is the + identity: the splitting `(0, t)` occurs exactly once in the + antidiagonal. -/ +lemma phaseAct_indicator (s : Multiset (Fin 1 ⊕ Fin 3)) : + phaseAct (fun t => if t = 0 then 1 else 0) f s = f s := by + rw [phaseAct, show (s.antidiagonal.map fun p => + (if p.1 = 0 then (1 : ℂ) else 0) • f p.2) = + s.antidiagonal.map fun p => if p.1 = 0 then f p.2 else 0 from + Multiset.map_congr rfl fun p _ => by + by_cases h : p.1 = 0 <;> simp [h]] + exact sum_map_antidiagonal_ite s f + +/-- The star of a convolution is the convolution of the stars. -/ +lemma star_phaseAct (s : Multiset (Fin 1 ⊕ Fin 3)) : + star (phaseAct u v s) = + phaseAct (fun t => star (u t)) (fun t => star (v t)) s := by + rw [phaseAct_eq_sum, phaseAct_eq_sum, ← starRingEnd_apply, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply, map_mul, starRingEnd_apply] + +end PhaseAct + +/-- The jets of a `U(1)_em` gauge transformation with coupling `e`: the + derivative jets `χjet s = ∂_s χ` of the real gauge function and + `phase s = ∂_s (exp (I e χ))` of its unitary phase at the base point, + subject to the two identities every honest gauge function satisfies: + the phase has unit norm at the base point, and its derivatives obey the + formal Leibniz expansion of `∂_μ (exp (I e χ)) = I e (∂_μ χ) exp (I e χ)`. -/ +structure GaugeJet (e : ℝ) where + /-- The derivative jets `∂_s χ` of the gauge function. -/ + χjet : Multiset (Fin 1 ⊕ Fin 3) → ℝ + /-- The derivative jets `∂_s (exp (I e χ))` of the unitary phase. -/ + phase : Multiset (Fin 1 ⊕ Fin 3) → ℂ + /-- The phase is unitary at the base point. -/ + phase_zero_unitary : phase 0 * star (phase 0) = 1 + /-- The formal Leibniz identity `∂_s ∂_μ u = I e ∂_s ((∂_μ χ) u)`. -/ + phase_deriv : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), + phase (s + {μ}) = Complex.I * e * + ((s.antidiagonal.map fun p => (χjet (p.1 + {μ}) : ℂ) * phase p.2).sum) + +namespace GaugeJet + +variable {e : ℝ} (g : GaugeJet e) + +/-! + +### B.1. Low-order consequences of the Leibniz identity + +The QED Lagrangian only involves jet coordinates of derivative order at most +one, so its gauge invariance only uses the Leibniz identity at order zero, +together with unitarity at the base point. + +-/ + +lemma star_phase_zero_unitary : star (g.phase 0) * g.phase 0 = 1 := by + rw [mul_comm] + exact g.phase_zero_unitary + +/-- The first derivative of the phase: the `s = 0` case of the Leibniz + identity, `∂_μ u = I e (∂_μ χ) u` at the base point. -/ +lemma phase_singleton (μ : Fin 1 ⊕ Fin 3) : + g.phase {μ} = Complex.I * e * (g.χjet {μ} * g.phase 0) := by + simpa using g.phase_deriv 0 μ + +/-- The first derivative of the conjugate phase, + `∂_μ ū = -I e (∂_μ χ) ū` at the base point. -/ +lemma star_phase_singleton (μ : Fin 1 ⊕ Fin 3) : + star (g.phase {μ}) = -(Complex.I * e * (g.χjet {μ} * star (g.phase 0))) := by + rw [g.phase_singleton μ] + simp only [star_mul', Complex.star_def, Complex.conj_I, Complex.conj_ofReal] + ring + +/-- The trivial gauge jet: the jets of the constant gauge function `χ = 0`. -/ +noncomputable def trivial (e : ℝ) : GaugeJet e where + χjet := 0 + phase s := if s = 0 then 1 else 0 + phase_zero_unitary := by simp + phase_deriv s μ := by + rw [if_neg (by simp)] + rw [show ((s.antidiagonal.map fun p => + ((0 : Multiset (Fin 1 ⊕ Fin 3) → ℝ) (p.1 + {μ}) : ℂ) * + (if p.2 = 0 then (1 : ℂ) else 0)).sum) = 0 from + Multiset.sum_eq_zero fun x hx => by + obtain ⟨p, _, rfl⟩ := Multiset.mem_map.mp hx + simp] + ring + +/-! + +### B.2. The commutative monoid of gauge jets + +Gauge jets compose: the gauge functions add and the phases convolve by the +Leibniz rule. Closure of the two axioms under this product is a consistency +check on the axiomatisation of `GaugeJet`. + +-/ + +lemma ext {g₁ g₂ : GaugeJet e} (h1 : g₁.χjet = g₂.χjet) + (h2 : g₁.phase = g₂.phase) : g₁ = g₂ := by + cases g₁ + cases g₂ + simp_all + +/-- The composite of two gauge jets: the gauge functions add and the phases + convolve by the Leibniz rule. -/ +noncomputable instance : Mul (GaugeJet e) where + mul g₁ g₂ := + { χjet := g₁.χjet + g₂.χjet + phase := phaseAct g₁.phase g₂.phase + phase_zero_unitary := by + rw [phaseAct_zero_arg, smul_eq_mul, star_mul'] + calc g₁.phase 0 * g₂.phase 0 * (star (g₁.phase 0) * star (g₂.phase 0)) + = g₁.phase 0 * star (g₁.phase 0) * + (g₂.phase 0 * star (g₂.phase 0)) := by ring + _ = 1 := by rw [g₁.phase_zero_unitary, g₂.phase_zero_unitary, one_mul] + phase_deriv := by + intro s μ + rw [phaseAct_add_singleton, + show (fun t => g₂.phase (t + {μ})) = fun t => (Complex.I * e) • + phaseAct (fun x => (g₂.χjet (x + {μ}) : ℂ)) g₂.phase t from + funext fun t => by + rw [g₂.phase_deriv t μ, phaseAct_eq_sum, smul_eq_mul, mul_assoc], + show (fun t => g₁.phase (t + {μ})) = fun t => Complex.I * ↑e * + phaseAct (fun x => (g₁.χjet (x + {μ}) : ℂ)) g₁.phase t from + funext fun t => by + rw [g₁.phase_deriv t μ, phaseAct_eq_sum, mul_assoc], + phaseAct_smul_right, phaseAct_smul_left, + phaseAct_assoc g₁.phase _ g₂.phase, + show phaseAct g₁.phase (fun x => (g₂.χjet (x + {μ}) : ℂ)) = + phaseAct (fun x => (g₂.χjet (x + {μ}) : ℂ)) g₁.phase from + funext fun t => phaseAct_comm _ _ t, + ← phaseAct_assoc, ← phaseAct_assoc, ← smul_add, + show phaseAct (fun x => (g₂.χjet (x + {μ}) : ℂ)) + (phaseAct g₁.phase g₂.phase) s + + phaseAct (fun x => (g₁.χjet (x + {μ}) : ℂ)) + (phaseAct g₁.phase g₂.phase) s = + phaseAct (fun x => (((g₁.χjet + g₂.χjet) (x + {μ}) : ℝ) : ℂ)) + (phaseAct g₁.phase g₂.phase) s from by + rw [← phaseAct_add_left] + refine congrFun (congrArg + (fun w => phaseAct w (phaseAct g₁.phase g₂.phase)) + (funext fun x => ?_)) s + rw [Pi.add_apply] + push_cast + ring, + phaseAct_eq_sum, smul_eq_mul, mul_assoc] } + +@[simp] +lemma mul_χjet (g₁ g₂ : GaugeJet e) : (g₁ * g₂).χjet = g₁.χjet + g₂.χjet := rfl + +@[simp] +lemma mul_phase (g₁ g₂ : GaugeJet e) : + (g₁ * g₂).phase = phaseAct g₁.phase g₂.phase := rfl + +noncomputable instance : One (GaugeJet e) := ⟨trivial e⟩ + +@[simp] +lemma one_χjet : (1 : GaugeJet e).χjet = 0 := rfl + +@[simp] +lemma one_phase : + (1 : GaugeJet e).phase = fun s => if s = 0 then (1 : ℂ) else 0 := rfl + +/-- **The gauge jets form a commutative monoid**: the gauge symmetry data of + QED composes associatively, with the trivial gauge jet as the unit. -/ +noncomputable instance : CommMonoid (GaugeJet e) where + mul_assoc g₁ g₂ g₃ := by + refine ext (add_assoc _ _ _) (funext fun s => ?_) + exact (phaseAct_assoc g₁.phase g₂.phase g₃.phase s).symm + one_mul g := by + refine ext (zero_add _) (funext fun s => ?_) + exact phaseAct_indicator g.phase s + mul_one g := by + refine ext (add_zero _) (funext fun s => ?_) + rw [mul_phase, one_phase, phaseAct_comm] + exact phaseAct_indicator g.phase s + mul_comm g₁ g₂ := by + refine ext (add_comm _ _) (funext fun s => ?_) + exact phaseAct_comm g₁.phase g₂.phase s + +end GaugeJet + +namespace Electron + +/-! + +## C. The jet algebra of the electron + +### C.1. The jet coordinates + +A jet coordinate is a formal symbol `∂_s ψ_α` or `∂_s ψ̄_α`, where `s` is a +*multiset* of spacetime directions (partial derivatives of a smooth field +commute) and `α : Fin 2 ⊕ Fin 2` is a Dirac spinor index in the chiral +representation: `Sum.inl` indexes the left-handed and `Sum.inr` the +right-handed Weyl component. + +-/ + +/-- The jet coordinates of the Dirac electron: the symbols `∂_s ψ_α` and + `∂_s ψ̄_α`, the `s`-th derivatives of the Dirac components and their + conjugates. The electron has electric charge `-1`; its conjugate has + charge `+1`. -/ +inductive JetGenerators where + /-- The jet coordinate `∂_s ψ_α` of the electron. -/ + | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : JetGenerators + /-- The jet coordinate `∂_s ψ̄_α` of the conjugate electron. -/ + | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : JetGenerators + deriving DecidableEq + +/-- The mass weight (twice the mass dimension) of an electron jet coordinate: + a fermion has mass dimension `3/2` and each derivative adds one. -/ +def JetGenerators.massWeight : JetGenerators → ℕ + | .dψ s _ => 3 + 2 * s.card + | .dbarψ s _ => 3 + 2 * s.card + +/-- The jet component space of the electron: the free complex module on the + jet coordinates. -/ +abbrev JetComponentSpace : Type := JetGenerators →₀ ℂ + +/-- The jet algebra of the electron: the exterior algebra on the free module + over the jet coordinates. The exterior product implements the fermionic + anticommutativity of the electron field. -/ +abbrev JetAlgebra : Type := ExteriorAlgebra ℂ JetComponentSpace + +namespace JetAlgebra + +/-- The jet coordinate `∂_s ψ_α` or `∂_s ψ̄_α` as an element of the jet + algebra. -/ +noncomputable def ofGenerator (j : JetGenerators) : JetAlgebra := + ExteriorAlgebra.ι ℂ (Finsupp.single j 1) + +/-! + +### C.2. The gauge action on the electron jet algebra + +A gauge transformation sends the electron (charge `-1`) to `ū ψ` and its +conjugate to `u ψ̄`, where `u = exp (I e χ)`. On jet coordinates this is the +Leibniz expansion + +`∂_s ψ_α ↦ ∑_{x + y = s} (∂_x ū) (∂_y ψ_α)`, + +the sum running over `Multiset.antidiagonal s`, whose multiplicities are the +multinomial coefficients of the Leibniz rule. The action is linear on the jet +component space and extends functorially to an algebra map of the exterior +algebra. + +-/ + +/-- The gauge action on a single electron jet coordinate: the Leibniz + expansion of `∂_s (ū ψ_α)` and `∂_s (u ψ̄_α)` over the splittings of `s`. -/ +noncomputable def gaugeActionGenerator {e : ℝ} (g : GaugeJet e) : + JetGenerators → JetComponentSpace + | .dψ t α => (t.antidiagonal.map fun p => + Finsupp.single (JetGenerators.dψ p.2 α) (star (g.phase p.1))).sum + | .dbarψ t α => (t.antidiagonal.map fun p => + Finsupp.single (JetGenerators.dbarψ p.2 α) (g.phase p.1)).sum + +/-- The gauge action on the jet component space: the linear extension of the + Leibniz expansion on the jet coordinates. -/ +noncomputable def gaugeActionCS {e : ℝ} (g : GaugeJet e) : + JetComponentSpace →ₗ[ℂ] JetComponentSpace := + Finsupp.lift JetComponentSpace ℂ JetGenerators (gaugeActionGenerator g) + +@[simp] +lemma gaugeActionCS_single {e : ℝ} (g : GaugeJet e) (j : JetGenerators) : + gaugeActionCS g (Finsupp.single j 1) = gaugeActionGenerator g j := by + rw [gaugeActionCS, Finsupp.lift_apply, Finsupp.sum_single_index (by simp), one_smul] + +/-- The gauge action on the electron jet algebra: the algebra map induced by + the Leibniz expansion on the jet coordinates. -/ +noncomputable def gaugeAction {e : ℝ} (g : GaugeJet e) : + JetAlgebra →ₐ[ℂ] JetAlgebra := + ExteriorAlgebra.map (gaugeActionCS g) + +lemma gaugeAction_ofGenerator_dψ {e : ℝ} (g : GaugeJet e) + (t : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ofGenerator (.dψ t α)) = + (t.antidiagonal.map fun p => + star (g.phase p.1) • ofGenerator (.dψ p.2 α)).sum := by + rw [gaugeAction, ofGenerator, ExteriorAlgebra.map_apply_ι, gaugeActionCS_single, + gaugeActionGenerator, map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, ← Finsupp.smul_single_one, map_smul] + rfl + +lemma gaugeAction_ofGenerator_dbarψ {e : ℝ} (g : GaugeJet e) + (t : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ofGenerator (.dbarψ t α)) = + (t.antidiagonal.map fun p => + g.phase p.1 • ofGenerator (.dbarψ p.2 α)).sum := by + rw [gaugeAction, ofGenerator, ExteriorAlgebra.map_apply_ι, gaugeActionCS_single, + gaugeActionGenerator, map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, ← Finsupp.smul_single_one, map_smul] + rfl + +/-! + +### C.3. The action on the low-order jet coordinates + +The QED Lagrangian involves only the jet coordinates of derivative order at +most one, for which the antidiagonal sums are short: `antidiagonal 0` is the +single splitting `(0, 0)`, and `antidiagonal {μ}` the two splittings +`(0, {μ})` and `({μ}, 0)`. + +-/ + +lemma antidiagonal_singleton (μ : Fin 1 ⊕ Fin 3) : + ({μ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = {(0, {μ}), ({μ}, 0)} := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, + Multiset.antidiagonal_cons, Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.map_singleton, Multiset.singleton_add] + rfl + +@[simp] +lemma gaugeAction_ofGenerator_dψ_zero {e : ℝ} (g : GaugeJet e) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ofGenerator (.dψ 0 α)) = + star (g.phase 0) • ofGenerator (.dψ 0 α) := by + rw [gaugeAction_ofGenerator_dψ] + simp + +@[simp] +lemma gaugeAction_ofGenerator_dbarψ_zero {e : ℝ} (g : GaugeJet e) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ofGenerator (.dbarψ 0 α)) = + g.phase 0 • ofGenerator (.dbarψ 0 α) := by + rw [gaugeAction_ofGenerator_dbarψ] + simp + +lemma gaugeAction_ofGenerator_dψ_singleton {e : ℝ} (g : GaugeJet e) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ofGenerator (.dψ {μ} α)) = + star (g.phase 0) • ofGenerator (.dψ {μ} α) + + star (g.phase {μ}) • ofGenerator (.dψ 0 α) := by + rw [gaugeAction_ofGenerator_dψ, antidiagonal_singleton] + simp + +lemma gaugeAction_ofGenerator_dbarψ_singleton {e : ℝ} (g : GaugeJet e) + (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ofGenerator (.dbarψ {μ} α)) = + g.phase 0 • ofGenerator (.dbarψ {μ} α) + + g.phase {μ} • ofGenerator (.dbarψ 0 α) := by + rw [gaugeAction_ofGenerator_dbarψ, antidiagonal_singleton] + simp + +/-! + +### C.4. The Lorentz action on the electron jet algebra + +Under `M : SL(2,ℂ)` the Dirac spinor transforms in the chiral basis by the +block-diagonal matrix `S(M) = ((M, 0), (0, (M†)⁻¹))`, its conjugate by the +entrywise conjugate of `S(M)`, and every derivative index by `Λ(M)⁻¹`, where +`Λ(M)` is the image of `M` under the covering map +`Lorentz.SL2C.toLorentzGroup`. + +-/ + +/-- The Dirac spinor representation of `SL(2,ℂ)` in the chiral basis: the two + Weyl components transform in the two conjugate-dual fundamental + representations, `S(M) = ((M, 0), (0, (M†)⁻¹))`, the assignment being fixed + by the conventions of `Lorentz.SL2C.toLorentzGroup`. -/ +noncomputable def spinorRep (M : SL(2,ℂ)) : + Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ := + Matrix.fromBlocks M.1 0 0 ((M⁻¹).1)ᴴ + +/-- The Lorentz action on a single electron jet coordinate: the spinor index + is rotated by the spinor representation (its conjugate for `∂_s ψ̄`) and the + derivative indices are transported with `Λ(M)⁻¹`. -/ +noncomputable def lorentzActionGenerator (M : SL(2,ℂ)) : + JetGenerators → JetComponentSpace + | .dψ t α => derivSum (Lorentz.SL2C.toLorentzGroup M) (indexList t) fun t' => + ∑ β, spinorRep M α β • Finsupp.single (JetGenerators.dψ t' β) 1 + | .dbarψ t α => derivSum (Lorentz.SL2C.toLorentzGroup M) (indexList t) fun t' => + ∑ β, star (spinorRep M α β) • Finsupp.single (JetGenerators.dbarψ t' β) 1 + +/-- The Lorentz action on the jet component space. -/ +noncomputable def lorentzActionCS (M : SL(2,ℂ)) : + JetComponentSpace →ₗ[ℂ] JetComponentSpace := + Finsupp.lift JetComponentSpace ℂ JetGenerators (lorentzActionGenerator M) + +@[simp] +lemma lorentzActionCS_single (M : SL(2,ℂ)) (j : JetGenerators) : + lorentzActionCS M (Finsupp.single j 1) = lorentzActionGenerator M j := by + rw [lorentzActionCS, Finsupp.lift_apply, Finsupp.sum_single_index (by simp), one_smul] + +/-- The Lorentz action on the electron jet algebra: the algebra map induced by + the action on the jet coordinates. -/ +noncomputable def lorentzAction (M : SL(2,ℂ)) : JetAlgebra →ₐ[ℂ] JetAlgebra := + ExteriorAlgebra.map (lorentzActionCS M) + +@[simp] +lemma lorentzAction_ofGenerator_dψ_zero (M : SL(2,ℂ)) (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (ofGenerator (.dψ 0 α)) = + ∑ β, spinorRep M α β • ofGenerator (.dψ 0 β) := by + rw [lorentzAction, ofGenerator, ExteriorAlgebra.map_apply_ι, lorentzActionCS_single, + lorentzActionGenerator, indexList_zero, derivSum_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul] + rfl + +@[simp] +lemma lorentzAction_ofGenerator_dbarψ_zero (M : SL(2,ℂ)) (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (ofGenerator (.dbarψ 0 α)) = + ∑ β, star (spinorRep M α β) • ofGenerator (.dbarψ 0 β) := by + rw [lorentzAction, ofGenerator, ExteriorAlgebra.map_apply_ι, lorentzActionCS_single, + lorentzActionGenerator, indexList_zero, derivSum_nil, map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul] + rfl + +lemma lorentzAction_ofGenerator_dψ_singleton (M : SL(2,ℂ)) (σ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (ofGenerator (.dψ {σ} α)) = + ∑ τ, ∑ β, ((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ σ : ℝ) • spinorRep M α β) • + ofGenerator (.dψ {τ} β) := by + rw [lorentzAction, ofGenerator, ExteriorAlgebra.map_apply_ι, lorentzActionCS_single, + lorentzActionGenerator, indexList_singleton, derivSum_cons] + rw [map_sum] + refine Finset.sum_congr rfl fun τ _ => ?_ + rw [derivSum_nil, ← algebraMap_smul ℂ (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ σ), + map_smul, map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, smul_smul, ← algebraMap_smul (R := ℝ) ℂ + (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ σ) (spinorRep M α β), smul_eq_mul, zero_add] + rfl + +lemma lorentzAction_ofGenerator_dbarψ_singleton (M : SL(2,ℂ)) (σ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (ofGenerator (.dbarψ {σ} α)) = + ∑ τ, ∑ β, ((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ σ : ℝ) • + star (spinorRep M α β)) • ofGenerator (.dbarψ {τ} β) := by + rw [lorentzAction, ofGenerator, ExteriorAlgebra.map_apply_ι, lorentzActionCS_single, + lorentzActionGenerator, indexList_singleton, derivSum_cons] + rw [map_sum] + refine Finset.sum_congr rfl fun τ _ => ?_ + rw [derivSum_nil, ← algebraMap_smul ℂ (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ σ), + map_smul, map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, smul_smul, ← algebraMap_smul (R := ℝ) ℂ + (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ σ) (star (spinorRep M α β)), smul_eq_mul, + zero_add] + rfl + +/-! + +### C.5. The mass-weight scaling on the electron jet algebra + +-/ + +/-- The mass-weight scaling on the jet component space: the diagonal map + multiplying each jet coordinate by `c` to the power of its mass weight. -/ +noncomputable def massScaleCS (c : ℝ) : JetComponentSpace →ₗ[ℂ] JetComponentSpace := + Finsupp.lift JetComponentSpace ℂ JetGenerators fun j => + ((c : ℂ) ^ j.massWeight) • Finsupp.single j 1 + +/-- The mass-weight scaling on the electron jet algebra. -/ +noncomputable def massScale (c : ℝ) : JetAlgebra →ₐ[ℂ] JetAlgebra := + ExteriorAlgebra.map (massScaleCS c) + +@[simp] +lemma massScale_ofGenerator (c : ℝ) (j : JetGenerators) : + massScale c (ofGenerator j) = (c : ℂ) ^ j.massWeight • ofGenerator j := by + rw [massScale, ofGenerator, ExteriorAlgebra.map_apply_ι, massScaleCS, + Finsupp.lift_apply, Finsupp.sum_single_index (by simp), one_smul, map_smul] + +end JetAlgebra + +/-! + +### C.6. The formal total derivative on the electron jet algebra + +The total derivative extends from the jet coordinates to the whole exterior +algebra as an *even* derivation, `∂_ρ (x y) = (∂_ρ x) y + x (∂_ρ y)` with no +Koszul signs. It is constructed by lifting `ι x ↦ (ι x, ι (∂_ρ x))` to an +algebra homomorphism into the trivial square-zero extension of the jet +algebra, following +`Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.JetDeriv`. + +-/ + +/-- The jet coordinate with one further derivative in the direction `ρ`. -/ +def JetGenerators.shift (ρ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators + | .dψ s α => .dψ (s + {ρ}) α + | .dbarψ s α => .dbarψ (s + {ρ}) α + +namespace JetAlgebra + +/-- The total derivative on the jet component space: the shift of the + derivative multi-index. -/ +noncomputable def jetDerivCS (ρ : Fin 1 ⊕ Fin 3) : + JetComponentSpace →ₗ[ℂ] JetComponentSpace := + Finsupp.lift JetComponentSpace ℂ JetGenerators fun j => + Finsupp.single (JetGenerators.shift ρ j) 1 + +@[simp] +lemma jetDerivCS_single (ρ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + jetDerivCS ρ (Finsupp.single j 1) = + Finsupp.single (JetGenerators.shift ρ j) 1 := by + rw [jetDerivCS, Finsupp.lift_apply, Finsupp.sum_single_index (by simp), one_smul] + +/-- The generator map of the total derivative into the trivial square-zero + extension of the jet algebra: `ι x ↦ (ι x, ι (∂_ρ x))`. -/ +noncomputable def jetDerivGen (ρ : Fin 1 ⊕ Fin 3) : + JetComponentSpace →ₗ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra where + toFun x := (ExteriorAlgebra.ι ℂ x, ExteriorAlgebra.ι ℂ (jetDerivCS ρ x)) + map_add' x y := by + simp only [map_add] + rfl + map_smul' c x := by + simp only [map_smul, RingHom.id_apply] + rfl + +@[simp] +lemma jetDerivGen_fst (ρ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + (jetDerivGen ρ x).fst = ExteriorAlgebra.ι ℂ x := rfl + +@[simp] +lemma jetDerivGen_snd (ρ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + (jetDerivGen ρ x).snd = ExteriorAlgebra.ι ℂ (jetDerivCS ρ x) := rfl + +/-- The generator map squares to zero: degree-one elements of the exterior + algebra anticommute. -/ +lemma jetDerivGen_mul_self (ρ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDerivGen ρ x * jetDerivGen ρ x = 0 := by + refine TrivSqZeroExt.ext ?_ ?_ + · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, + TrivSqZeroExt.fst_zero] + · rw [TrivSqZeroExt.snd_mul, jetDerivGen_fst, jetDerivGen_snd, TrivSqZeroExt.snd_zero, + smul_eq_mul, op_smul_eq_mul] + exact ExteriorAlgebra.ι_add_mul_swap x (jetDerivCS ρ x) + +/-- The lift of the total derivative to the trivial square-zero extension of + the jet algebra: the algebra homomorphism `x ↦ (x, ∂_ρ x)`. -/ +noncomputable def jetDerivHom (ρ : Fin 1 ⊕ Fin 3) : + JetAlgebra →ₐ[ℂ] TrivSqZeroExt JetAlgebra JetAlgebra := + ExteriorAlgebra.lift ℂ ⟨jetDerivGen ρ, jetDerivGen_mul_self ρ⟩ + +@[simp] +lemma jetDerivHom_ι (ρ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDerivHom ρ (ExteriorAlgebra.ι ℂ x) = jetDerivGen ρ x := by + rw [jetDerivHom, ExteriorAlgebra.lift_ι_apply] + +/-- The first component of the square-zero lift is the identity. -/ +@[simp] +lemma jetDerivHom_fst (ρ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + (jetDerivHom ρ x).fst = x := by + have h : (TrivSqZeroExt.fstHom ℂ JetAlgebra JetAlgebra).comp (jetDerivHom ρ) = + AlgHom.id ℂ JetAlgebra := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) + simp + exact DFunLike.congr_fun h x + +/-- The formal total spacetime derivative on the electron jet algebra in the + direction `ρ`: the even derivation extending the shift + `∂_s ψ_α ↦ ∂_{s + {ρ}} ψ_α` of the jet coordinates. -/ +noncomputable def jetDeriv (ρ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra where + toFun x := (jetDerivHom ρ x).snd + map_add' x y := congrArg TrivSqZeroExt.snd (map_add (jetDerivHom ρ) x y) + map_smul' c x := congrArg TrivSqZeroExt.snd (map_smul (jetDerivHom ρ) c x) + +lemma jetDeriv_apply (ρ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + jetDeriv ρ x = (jetDerivHom ρ x).snd := rfl + +@[simp] +lemma jetDeriv_ι (ρ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace) : + jetDeriv ρ (ExteriorAlgebra.ι ℂ x) = + ExteriorAlgebra.ι ℂ (jetDerivCS ρ x) := by + rw [jetDeriv_apply, jetDerivHom_ι, jetDerivGen_snd] + +/-- The total derivative appends the derivative index to each jet + coordinate. -/ +@[simp] +lemma jetDeriv_ofGenerator (ρ : Fin 1 ⊕ Fin 3) (j : JetGenerators) : + jetDeriv ρ (ofGenerator j) = ofGenerator (JetGenerators.shift ρ j) := by + rw [ofGenerator, jetDeriv_ι, jetDerivCS_single] + rfl + +@[simp] +lemma jetDeriv_one (ρ : Fin 1 ⊕ Fin 3) : jetDeriv ρ (1 : JetAlgebra) = 0 := + congrArg TrivSqZeroExt.snd (map_one (jetDerivHom ρ)) + +/-- The total derivative is an even derivation: the Leibniz rule holds on the + electron jet algebra with no Koszul signs. -/ +lemma jetDeriv_mul (ρ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv ρ (x * y) = jetDeriv ρ x * y + x * jetDeriv ρ y := by + have h : jetDeriv ρ (x * y) = + (jetDerivHom ρ x).fst * jetDeriv ρ y + jetDeriv ρ x * (jetDerivHom ρ y).fst := + congrArg TrivSqZeroExt.snd (map_mul (jetDerivHom ρ) x y) + rw [jetDerivHom_fst, jetDerivHom_fst] at h + exact h.trans (add_comm _ _) + +end JetAlgebra + +end Electron + +/-! + +## D. The jet algebra of QED + +-/ + +/-- The jet algebra of quantum electrodynamics: the tensor product of the + complexified photon jet algebra with the electron jet algebra. + + This is a `def` rather than an `abbrev`, and its algebraic structure is fixed + by the single `Ring` and `Algebra` instances below, so that every algebraic + class projects from one root. On the bare tensor product `One`, `Mul`, + `Zero`, `Add`, `SMul` and `Module` are instead supplied by standalone + `TensorProduct.*` instances rather than as projections of the semiring; those + are definitionally the projections, but not syntactically, so a generic lemma + whose type argument is not pinned by an explicit argument (such as `one_pow`) + cannot be unified against a goal. Rooting the structure here keeps the + generic algebraic lemmas usable. -/ +def JetAlgebra : Type := (ℂ ⊗[ℝ] Photon.JetAlgebra) ⊗[ℂ] Electron.JetAlgebra + +noncomputable instance : Ring JetAlgebra := + inferInstanceAs (Ring ((ℂ ⊗[ℝ] Photon.JetAlgebra) ⊗[ℂ] Electron.JetAlgebra)) + +noncomputable instance : Algebra ℂ JetAlgebra := + inferInstanceAs (Algebra ℂ ((ℂ ⊗[ℝ] Photon.JetAlgebra) ⊗[ℂ] Electron.JetAlgebra)) + +namespace JetAlgebra + +/-! + +### D.1. Pure tensors and their arithmetic + +-/ + +/-- A pure tensor, as an element of the jet algebra. + + Writing `a ⊗ₜ[ℂ] b` builds an element of the *underlying* tensor product, + which is only definitionally an element of `JetAlgebra`. A goal mixing such + a term with the jet algebra's own operations is then not type-correct at + `instances` transparency, and no rewrite can fire on it. This constructor + keeps pure tensors typed at `JetAlgebra`. -/ +noncomputable def tmul (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + JetAlgebra := a ⊗ₜ[ℂ] b + +@[inherit_doc] scoped infixl:100 " ⊗ⱼ " => JetAlgebra.tmul + +/-- `tmul` is the pure tensor of the underlying tensor product; use this to + move between the jet algebra and lemmas stated for the tensor product. -/ +lemma tmul_eq (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + a ⊗ⱼ b = a ⊗ₜ[ℂ] b := rfl + +lemma one_eq_tmul : (1 : JetAlgebra) = (1 : ℂ ⊗[ℝ] Photon.JetAlgebra) ⊗ⱼ 1 := rfl + +/-- Multiplication of pure tensors. `Algebra.TensorProduct.tmul_mul_tmul` does + not rewrite here, even though it is definitionally the same statement. -/ +@[simp] +lemma tmul_mul_tmul (a₁ a₂ : ℂ ⊗[ℝ] Photon.JetAlgebra) + (b₁ b₂ : Electron.JetAlgebra) : + (a₁ ⊗ⱼ b₁) * (a₂ ⊗ⱼ b₂) = (a₁ * a₂) ⊗ⱼ (b₁ * b₂) := + Algebra.TensorProduct.tmul_mul_tmul _ _ _ _ + +@[simp] +lemma zero_tmul (b : Electron.JetAlgebra) : + (0 : ℂ ⊗[ℝ] Photon.JetAlgebra) ⊗ⱼ b = 0 := TensorProduct.zero_tmul _ b + +@[simp] +lemma tmul_zero (a : ℂ ⊗[ℝ] Photon.JetAlgebra) : + a ⊗ⱼ (0 : Electron.JetAlgebra) = 0 := TensorProduct.tmul_zero _ a + +@[simp] +lemma add_tmul (a₁ a₂ : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + (a₁ + a₂) ⊗ⱼ b = a₁ ⊗ⱼ b + a₂ ⊗ⱼ b := TensorProduct.add_tmul a₁ a₂ b + +@[simp] +lemma tmul_add (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b₁ b₂ : Electron.JetAlgebra) : + a ⊗ⱼ (b₁ + b₂) = a ⊗ⱼ b₁ + a ⊗ⱼ b₂ := TensorProduct.tmul_add a b₁ b₂ + +@[simp] +lemma sub_tmul (a₁ a₂ : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + (a₁ - a₂) ⊗ⱼ b = a₁ ⊗ⱼ b - a₂ ⊗ⱼ b := TensorProduct.sub_tmul a₁ a₂ b + +@[simp] +lemma tmul_sub (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b₁ b₂ : Electron.JetAlgebra) : + a ⊗ⱼ (b₁ - b₂) = a ⊗ⱼ b₁ - a ⊗ⱼ b₂ := TensorProduct.tmul_sub a b₁ b₂ + +@[simp] +lemma neg_tmul (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + (-a) ⊗ⱼ b = -(a ⊗ⱼ b) := TensorProduct.neg_tmul a b + +@[simp] +lemma tmul_neg (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + a ⊗ⱼ (-b) = -(a ⊗ⱼ b) := TensorProduct.tmul_neg a b + +lemma tmul_sum {ι : Type*} (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (s : Finset ι) + (f : ι → Electron.JetAlgebra) : a ⊗ⱼ (∑ i ∈ s, f i) = ∑ i ∈ s, a ⊗ⱼ f i := + TensorProduct.tmul_sum a s f + +lemma sum_tmul {ι : Type*} (s : Finset ι) (f : ι → ℂ ⊗[ℝ] Photon.JetAlgebra) + (b : Electron.JetAlgebra) : (∑ i ∈ s, f i) ⊗ⱼ b = ∑ i ∈ s, f i ⊗ⱼ b := + TensorProduct.sum_tmul s f b + +@[simp] +lemma tmul_smul (r : ℂ) (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + a ⊗ⱼ (r • b) = r • (a ⊗ⱼ b) := TensorProduct.tmul_smul r a b + +@[simp] +lemma smul_tmul' (r : ℂ) (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra) : + (r • a) ⊗ⱼ b = r • (a ⊗ⱼ b) := TensorProduct.smul_tmul' r a b + +/-- An `ℝ`-scalar on the photon factor is a `ℂ`-scalar of the jet algebra. -/ +lemma real_smul_tmul (r : ℝ) (a : ℂ ⊗[ℝ] Photon.JetAlgebra) + (b : Electron.JetAlgebra) : + (r • a) ⊗ⱼ b = (r : ℂ) • (a ⊗ⱼ b) := by + rw [show r • a = (r : ℂ) • a by rw [← Complex.coe_algebraMap, algebraMap_smul], + smul_tmul'] + +/-- A constant of the photon factor is a scalar of the jet algebra. -/ +lemma tmul_C_eq_smul_one (r : ℝ) : + ((1 : ℂ) ⊗ₜ[ℝ] (MvPolynomial.C r : Photon.JetAlgebra)) ⊗ⱼ + (1 : Electron.JetAlgebra) = (r : ℂ) • (1 : JetAlgebra) := by + rw [show (MvPolynomial.C r : Photon.JetAlgebra) = r • 1 by + rw [MvPolynomial.smul_eq_C_mul, mul_one], + TensorProduct.tmul_smul, + show r • ((1 : ℂ) ⊗ₜ[ℝ] (1 : Photon.JetAlgebra)) = + (r : ℂ) • (1 : ℂ ⊗[ℝ] Photon.JetAlgebra) by + rw [← Complex.coe_algebraMap, algebraMap_smul, + Algebra.TensorProduct.one_def], + smul_tmul', ← one_eq_tmul] + +/-- Induction on the jet algebra, stated for `JetAlgebra` itself. Using + `TensorProduct.induction_on` directly leaves the zero, the sum and the pure + tensors in the goals carrying the tensor product's structure rather than the + jet algebra's, which makes those goals unrewritable. -/ +@[elab_as_elim] +lemma induction_on {motive : JetAlgebra → Prop} (x : JetAlgebra) (zero : motive 0) + (tmul : ∀ (a : ℂ ⊗[ℝ] Photon.JetAlgebra) (b : Electron.JetAlgebra), + motive (a ⊗ⱼ b)) + (add : ∀ x y : JetAlgebra, motive x → motive y → motive (x + y)) : motive x := + TensorProduct.induction_on x zero tmul add + +/-! + +### D.2. The inclusions of the two factors + +-/ + +/-- The photon factor included into the QED jet algebra. -/ +noncomputable abbrev inclA : (ℂ ⊗[ℝ] Photon.JetAlgebra) →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.includeLeft + +/-- The electron factor included into the QED jet algebra. -/ +noncomputable abbrev inclE : Electron.JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.includeRight + +lemma inclA_apply (a : ℂ ⊗[ℝ] Photon.JetAlgebra) : inclA a = a ⊗ⱼ 1 := rfl + +lemma inclE_apply (b : Electron.JetAlgebra) : inclE b = 1 ⊗ⱼ b := rfl + +/-! + +### D.3. The gauge action on the QED jet algebra + +A gauge jet acts on the photon factor by the affine shift +`∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`, complexified, and on the electron factor by +the Leibniz expansion of `∂_s (ū ψ)` and `∂_s (u ψ̄)`; the action on the full +jet algebra is the tensor product of the two, an algebra map. + +-/ + +/-- The gauge action on the complexified photon jet algebra: the + complexification of the affine action `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. -/ +noncomputable def gaugeActionPhoton (c : Photon.JetAlgebra.GaugeJet) : + (ℂ ⊗[ℝ] Photon.JetAlgebra) →ₐ[ℂ] ℂ ⊗[ℝ] Photon.JetAlgebra := + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (Photon.JetAlgebra.gaugeAction c) + +@[simp] +lemma gaugeActionPhoton_tmul (c : Photon.JetAlgebra.GaugeJet) (x : ℂ) + (p : Photon.JetAlgebra) : + gaugeActionPhoton c (x ⊗ₜ[ℝ] p) = x ⊗ₜ[ℝ] Photon.JetAlgebra.gaugeAction c p := + rfl + +/-- The gauge action on the QED jet algebra: the tensor product of the affine + action on the photon factor with the Leibniz phase rotation on the electron + factor. -/ +noncomputable def gaugeAction {e : ℝ} (g : GaugeJet e) : + JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (gaugeActionPhoton g.χjet) + (Electron.JetAlgebra.gaugeAction g) + +lemma gaugeAction_tmul {e : ℝ} (g : GaugeJet e) (a : ℂ ⊗[ℝ] Photon.JetAlgebra) + (b : Electron.JetAlgebra) : + gaugeAction g (a ⊗ⱼ b) = + gaugeActionPhoton g.χjet a ⊗ⱼ Electron.JetAlgebra.gaugeAction g b := + rfl + +/-! + +### D.4. The Lorentz action on the QED jet algebra + +An `M : SL(2,ℂ)` acts on the photon factor through its image `Λ(M)` in the +Lorentz group, complexified, and on the electron factor through the spinor +representation; the action on the full jet algebra is the tensor product of +the two. + +-/ + +/-- The Lorentz action on the complexified photon jet algebra. -/ +noncomputable def lorentzActionPhoton (Λ : LorentzGroup 3) : + (ℂ ⊗[ℝ] Photon.JetAlgebra) →ₐ[ℂ] ℂ ⊗[ℝ] Photon.JetAlgebra := + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (Photon.JetAlgebra.lorentzAction Λ) + +@[simp] +lemma lorentzActionPhoton_tmul (Λ : LorentzGroup 3) (x : ℂ) (p : Photon.JetAlgebra) : + lorentzActionPhoton Λ (x ⊗ₜ[ℝ] p) = x ⊗ₜ[ℝ] Photon.JetAlgebra.lorentzAction Λ p := + rfl + +/-- The Lorentz action on the QED jet algebra: the tensor product of the + photon action through the covering map with the electron spinor action. -/ +noncomputable def lorentzAction (M : SL(2,ℂ)) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (lorentzActionPhoton (Lorentz.SL2C.toLorentzGroup M)) + (Electron.JetAlgebra.lorentzAction M) + +lemma lorentzAction_tmul (M : SL(2,ℂ)) (a : ℂ ⊗[ℝ] Photon.JetAlgebra) + (b : Electron.JetAlgebra) : + lorentzAction M (a ⊗ⱼ b) = + lorentzActionPhoton (Lorentz.SL2C.toLorentzGroup M) a ⊗ⱼ + Electron.JetAlgebra.lorentzAction M b := + rfl + +/-! TODO: Prove the composition law of the Lorentz action. Being a pullback on coordinates it -/ +/-! TODO: is a right action, `lorentzAction M ∘ lorentzAction N = lorentzAction (N * M)`; the -/ +/-! TODO: proof needs permutation-invariance and functoriality of `derivSum` over sorted lists. -/ +/-! TODO: Define an antilinear star on the QED jet algebra with `star ψ = ψ̄`, `star A = A`, and -/ +/-! TODO: prove hermiticity of the Lagrangian up to the total derivative of the kinetic term. -/ + +/-! + +### D.5. The mass-weight scaling on the QED jet algebra + +-/ + +/-- The mass-weight scaling on the complexified photon jet algebra. -/ +noncomputable def massScalePhoton (c : ℝ) : + (ℂ ⊗[ℝ] Photon.JetAlgebra) →ₐ[ℂ] ℂ ⊗[ℝ] Photon.JetAlgebra := + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (Photon.JetAlgebra.massScale c) + +@[simp] +lemma massScalePhoton_tmul (c : ℝ) (x : ℂ) (p : Photon.JetAlgebra) : + massScalePhoton c (x ⊗ₜ[ℝ] p) = x ⊗ₜ[ℝ] Photon.JetAlgebra.massScale c p := + rfl + +/-- The mass-weight scaling on the QED jet algebra: the algebra map + multiplying each jet coordinate by `c` to the power of its mass weight, + i.e. `c` squared to the power of its mass dimension. -/ +noncomputable def massScale (c : ℝ) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map (massScalePhoton c) (Electron.JetAlgebra.massScale c) + +lemma massScale_tmul (c : ℝ) (a : ℂ ⊗[ℝ] Photon.JetAlgebra) + (b : Electron.JetAlgebra) : + massScale c (a ⊗ⱼ b) = + massScalePhoton c a ⊗ⱼ Electron.JetAlgebra.massScale c b := + rfl + +/-! + +### D.6. The formal total derivative on the QED jet algebra + +-/ + +/-- The formal total spacetime derivative on the QED jet algebra in the + direction `ρ`: the Leibniz extension of the total derivatives of the photon + and electron factors. -/ +noncomputable def jetDeriv (ρ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + TensorProduct.map (LinearMap.baseChange ℂ (Photon.JetAlgebra.jetDeriv ρ)) + LinearMap.id + + TensorProduct.map LinearMap.id (Electron.JetAlgebra.jetDeriv ρ) + +lemma jetDeriv_tmul (ρ : Fin 1 ⊕ Fin 3) (a : ℂ ⊗[ℝ] Photon.JetAlgebra) + (b : Electron.JetAlgebra) : + jetDeriv ρ (a ⊗ⱼ b) = + (LinearMap.baseChange ℂ (Photon.JetAlgebra.jetDeriv ρ) a) ⊗ⱼ b + + a ⊗ⱼ Electron.JetAlgebra.jetDeriv ρ b := rfl + +@[simp] +lemma jetDeriv_one (ρ : Fin 1 ⊕ Fin 3) : jetDeriv ρ (1 : JetAlgebra) = 0 := by + have hB : LinearMap.baseChange ℂ (Photon.JetAlgebra.jetDeriv ρ) + (1 : ℂ ⊗[ℝ] Photon.JetAlgebra) = 0 := by + rw [show (1 : ℂ ⊗[ℝ] Photon.JetAlgebra) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : Photon.JetAlgebra) from rfl, + LinearMap.baseChange_tmul, Photon.JetAlgebra.jetDeriv_one, + TensorProduct.tmul_zero] + rw [one_eq_tmul, jetDeriv_tmul, hB, Electron.JetAlgebra.jetDeriv_one, zero_tmul, + tmul_zero, add_zero] + +/-- The total derivative is an even derivation on the QED jet algebra: the + Leibniz rule holds with no Koszul signs. -/ +lemma jetDeriv_mul (ρ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv ρ (x * y) = jetDeriv ρ x * y + x * jetDeriv ρ y := by + induction x using JetAlgebra.induction_on with + | zero => simp + | add a b ha hb => + simp only [add_mul, map_add, ha, hb] + abel + | tmul p l => + induction y using JetAlgebra.induction_on with + | zero => simp + | add a' b' ha' hb' => + simp only [mul_add, map_add, ha', hb'] + abel + | tmul p' l' => + simp only [tmul_mul_tmul, jetDeriv_tmul, add_mul, mul_add, + Photon.JetAlgebra.jetDeriv_baseChange_mul, Electron.JetAlgebra.jetDeriv_mul, + add_tmul, tmul_add, tmul_mul_tmul] + abel + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/CurrentCoupling.lean b/Physlib/Particles/QED/CurrentCoupling.lean new file mode 100644 index 000000000..6b86205a5 --- /dev/null +++ b/Physlib/Particles/QED/CurrentCoupling.lean @@ -0,0 +1,250 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Lagrangian +public import Physlib.Particles.QED.FermionStatistics +public import Physlib.Particles.QED.GaugeInvariance +public import Physlib.Particles.QED.FieldStrength +/-! +# The current coupling of quantum electrodynamics + +## i. Overview + +The interaction of QED is *minimal coupling to the Dirac current*: expanding +the covariant derivative inside the Dirac kinetic term, + +`i ψ̄ γ^μ D_μ ψ = i ψ̄ γ^μ ∂_μ ψ - e J^μ A_μ` with `J^μ = ψ̄ γ^μ ψ`. + +This is the jet-algebra counterpart of the current coupling `J^μ A_μ` of +`Physlib.Electromagnetism.Dynamics.Lagrangian`: the photon couples to matter +only through a conserved current contracted with the potential, with the +electron supplying `J^μ = ψ̄ γ^μ ψ`. + +The current is gauge invariant (`gaugeAction_diracCurrent`) — the electron +and its conjugate carry opposite charges, so the phases cancel — which is +what makes it a physically meaningful source for the photon. + +This file contains no definitions, only theorems about the fields of +`Physlib.Particles.QED.Fields` and the Lagrangian of `Physlib.Particles.QED.Lagrangian`. + +## ii. Key results + +- `JetAlgebra.diracKineticTerm_eq_free_add_current` : **minimal coupling** — + the Dirac kinetic term is the free kinetic term plus `- e J^μ A_μ`. +- `JetAlgebra.gaugeAction_diracCurrent` : the Dirac current is gauge + invariant. + +## iii. Table of contents + +- A. The minimal-coupling decomposition of the kinetic term +- B. Gauge invariance of the Dirac current + +## iv. References + +The current is defined in `Physlib.Particles.QED.Lagrangian`; the concrete +electromagnetic current coupling is +`Physlib.Electromagnetism.Dynamics.Lagrangian`. + +-/ + +@[expose] public section + +/-! TODO: Connect the QED matter content to `Physlib.QFT.QED.AnomalyCancellation`: the electron -/ +/-! TODO: spectrum is vector-like (charges `±1`), so it satisfies the gravitational and cubic -/ +/-! TODO: anomaly cancellation conditions. -/ + +namespace QED + +namespace JetAlgebra + +/-! + +## A. The minimal-coupling decomposition of the kinetic term + +The photon coordinates commute with the fermion coordinates +(`Physlib.Particles.QED.FermionStatistics`), so the interaction inside the kinetic term +reorganises into the potential times the Dirac current. + +-/ + +/-- The photon potential times the Dirac current, written through the fermion + bilinears. -/ +lemma A_mul_diracCurrent (μ : Fin 1 ⊕ Fin 3) : + A 0 μ * diracCurrent μ = + ∑ α, ∑ β, kineticGamma μ α β • (A 0 μ * (barψ 0 α * ψ 0 β)) := by + rw [diracCurrent, Finset.mul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [mul_smul_comm] + +/-- **Minimal coupling**: the Dirac kinetic term with coupling `e` is the free + Dirac kinetic term plus the current coupling `- e J^μ A_μ`. All of the + interaction of QED is the photon contracted with the Dirac current, the + jet-algebra counterpart of the current coupling of + `Physlib.Electromagnetism.Dynamics`. -/ +theorem diracKineticTerm_eq_free_add_current (e : ℝ) : + diracKineticTerm e = diracKineticTerm 0 + + (-e : ℂ) • ∑ μ, A 0 μ * diracCurrent μ := by + have hsplit : ∀ (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2 ⊕ Fin 2), + barψ 0 α * covDψ e μ β = + barψ 0 α * covDψ 0 μ β + + (Complex.I * e) • (A 0 μ * (barψ 0 α * ψ 0 β)) := by + intro μ α β + rw [covDψ, covDψ, Complex.ofReal_zero, mul_zero, zero_smul, add_zero, mul_add, + mul_smul_comm, ← mul_assoc, ← A_mul_barψ_comm, mul_assoc] + rw [diracKineticTerm, diracKineticTerm, + Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun α _ => + Finset.sum_congr rfl fun β _ => by rw [hsplit μ α β, smul_add]] + simp only [Finset.sum_add_distrib, smul_add] + congr 1 + rw [Finset.sum_congr rfl fun μ (_ : μ ∈ Finset.univ) => A_mul_diracCurrent μ, + Finset.smul_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.smul_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Finset.smul_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [smul_smul, smul_smul, smul_smul] + refine congrArg (· • _) ?_ + ring_nf + rw [Complex.I_sq] + ring + +/-! + +## B. Gauge invariance of the Dirac current + +-/ + +/-- **The Dirac current is gauge invariant**: the electron and its conjugate + carry opposite charges, so the phases cancel by unitarity. This is what + makes `J^μ` a physically meaningful source for the photon. -/ +@[simp] +theorem gaugeAction_diracCurrent {e : ℝ} (g : GaugeJet e) (μ : Fin 1 ⊕ Fin 3) : + gaugeAction g (diracCurrent μ) = diracCurrent μ := by + rw [diracCurrent, map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, + gaugeAction_mul_phase_cancel g (gaugeAction_barψ_zero g α) + (gaugeAction_ψ_zero g β)] + +/-! + +## C. Noether: conservation of the Dirac current on-shell + +-/ + +set_option maxHeartbeats 1000000 in +/-- **Noether's identity for the Dirac current**: the divergence of the + current is a combination of the Dirac-equation elements, + `i ∂_μ J^μ = ψ̄ ⬝ (Dirac eq) + (adjoint Dirac eq) ⬝ ψ`. + On solutions of the Dirac equations the current is conserved, + `∂_μ J^μ = 0` — for every coupling `e` and mass `m`: the gauge interaction + and the mass drop out of the divergence identically. -/ +theorem current_conservation (e m : ℝ) : + Complex.I • ∑ μ, jetDeriv μ (diracCurrent μ) = + ∑ α, barψ 0 α * diracEquation e m α + + ∑ β, diracAdjEquation e m β * ψ 0 β := by + have hL : ∀ μ : Fin 1 ⊕ Fin 3, jetDeriv μ (diracCurrent μ) = + (∑ α, ∑ β, kineticGamma μ α β • (barψ {μ} α * ψ 0 β)) + + ∑ α, ∑ β, kineticGamma μ α β • (barψ 0 α * ψ {μ} β) := by + intro μ + rw [diracCurrent, map_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, jetDeriv_mul, jetDeriv_barψ, jetDeriv_ψ, zero_add, smul_add] + have hT1 : ∀ α : Fin 2 ⊕ Fin 2, barψ 0 α * diracEquation e m α = + Complex.I • (∑ μ, ∑ β, kineticGamma μ α β • (barψ 0 α * ψ {μ} β)) + + (Complex.I * (Complex.I * ↑e)) • (∑ μ, ∑ β, kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β))) - + (m : ℂ) • ∑ β, gammaMatrix (Sum.inl 0) α β • (barψ 0 α * ψ 0 β) := by + intro α + rw [diracEquation, mul_sub, mul_smul_comm, mul_smul_comm, Finset.mul_sum, + Finset.mul_sum] + congr 1 + · rw [Finset.sum_congr rfl fun μ (_ : μ ∈ Finset.univ) => Finset.mul_sum _ _ _, + show (∑ μ, ∑ β, barψ 0 α * (kineticGamma μ α β • covDψ e μ β)) = + ∑ μ, ∑ β, (kineticGamma μ α β • (barψ 0 α * ψ {μ} β) + + (Complex.I * ↑e) • (kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β)))) from + Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun β _ => by + rw [mul_smul_comm, covDψ, mul_add, smul_add, mul_smul_comm, + ← mul_assoc, ← A_mul_barψ_comm, mul_assoc, smul_comm + (Complex.I * (e : ℂ)) (kineticGamma μ α β)]] + rw [Finset.sum_congr rfl fun μ (_ : μ ∈ Finset.univ) => + Finset.sum_add_distrib, Finset.sum_add_distrib, smul_add] + congr 1 + rw [show (∑ μ, ∑ β, (Complex.I * (e : ℂ)) • (kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β)))) = + (Complex.I * (e : ℂ)) • ∑ μ, ∑ β, kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β)) from by + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun μ _ => Finset.smul_sum.symm] + rw [smul_smul] + · refine congrArg _ (Finset.sum_congr rfl fun β _ => ?_) + rw [mul_smul_comm] + have hT3 : ∀ β : Fin 2 ⊕ Fin 2, diracAdjEquation e m β * ψ 0 β = + Complex.I • (∑ μ, ∑ α, kineticGamma μ α β • (barψ {μ} α * ψ 0 β)) - + (Complex.I * (Complex.I * ↑e)) • (∑ μ, ∑ α, kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β))) + + (m : ℂ) • ∑ α, gammaMatrix (Sum.inl 0) α β • (barψ 0 α * ψ 0 β) := by + intro β + rw [diracAdjEquation, add_mul, smul_mul_assoc, smul_mul_assoc, Finset.sum_mul, + Finset.sum_mul] + congr 1 + · rw [show (∑ μ, (∑ α, kineticGamma μ α β • covDbarψ e μ α) * ψ 0 β) = + ∑ μ, ∑ α, (kineticGamma μ α β • (barψ {μ} α * ψ 0 β) - + (Complex.I * ↑e) • (kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β)))) from + Finset.sum_congr rfl fun μ _ => by + rw [Finset.sum_mul] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [smul_mul_assoc, covDbarψ, sub_mul, smul_sub, smul_mul_assoc, + mul_assoc, smul_comm (Complex.I * (e : ℂ)) (kineticGamma μ α β)]] + rw [Finset.sum_congr rfl fun μ (_ : μ ∈ Finset.univ) => + Finset.sum_sub_distrib _ _, Finset.sum_sub_distrib _ _, smul_sub] + congr 1 + rw [show (∑ μ, ∑ α, (Complex.I * (e : ℂ)) • (kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β)))) = + (Complex.I * (e : ℂ)) • ∑ μ, ∑ α, kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β)) from by + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun μ _ => Finset.smul_sum.symm] + rw [smul_smul] + · refine congrArg _ (Finset.sum_congr rfl fun α _ => ?_) + rw [smul_mul_assoc] + rw [Finset.sum_congr rfl fun α (_ : α ∈ Finset.univ) => hT1 α, + Finset.sum_congr rfl fun β (_ : β ∈ Finset.univ) => hT3 β] + simp only [Finset.sum_add_distrib, Finset.sum_sub_distrib, ← Finset.smul_sum] + rw [Finset.sum_congr rfl fun μ (_ : μ ∈ Finset.univ) => hL μ] + rw [Finset.sum_comm (f := fun α μ => ∑ β, kineticGamma μ α β • + (barψ 0 α * ψ {μ} β)), + Finset.sum_comm (f := fun β μ => ∑ α, kineticGamma μ α β • + (barψ {μ} α * ψ 0 β)), + Finset.sum_comm (f := fun α μ => ∑ β, kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β))), + Finset.sum_comm (f := fun β μ => ∑ α, kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β)))] + rw [Finset.sum_congr rfl fun μ (_ : μ ∈ Finset.univ) => + (Finset.sum_comm (f := fun β α => kineticGamma μ α β • + (A 0 μ * (barψ 0 α * ψ 0 β))))] + rw [Finset.sum_congr rfl fun μ (_ : μ ∈ Finset.univ) => + (Finset.sum_comm (f := fun β α => kineticGamma μ α β • + (barψ {μ} α * ψ 0 β)))] + rw [Finset.sum_comm (f := fun β α => gammaMatrix (Sum.inl 0) α β • + (barψ 0 α * ψ 0 β))] + simp only [smul_add, Finset.smul_sum] + rw [Finset.sum_add_distrib] + abel + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/Evaluation.lean b/Physlib/Particles/QED/Evaluation.lean new file mode 100644 index 000000000..259e728a9 --- /dev/null +++ b/Physlib/Particles/QED/Evaluation.lean @@ -0,0 +1,449 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Fields +public import Physlib.Particles.QED.FieldStrength +public import Physlib.Particles.QED.LorentzInvariance +public import Physlib.Electromagnetism.Kinematics.ElectricField +public import Physlib.Electromagnetism.Kinematics.MagneticField +public import Physlib.Electromagnetism.Dynamics.IsExtrema +/-! +# Evaluation of the photon jet algebra on a potential + +## i. Overview + +The theorems tying the formal photon jet algebra of QED to the honest +electromagnetism of `Physlib.Electromagnetism`, through the evaluation map +`Photon.JetAlgebra.evalPotential` of `Physlib.Particles.QED.Basic`: + +* evaluated on any differentiable potential, the formal field strength is the + field strength of the potential with both indices lowered; +* evaluated on any differentiable potential, the formal Maxwell term + `F_{μν} F^{μν}` is `-4 μ₀` times `ElectromagneticPotential.kineticTerm`; +* the evaluation is compatible with concrete gauge transformations + `A ↦ A + ∂χ`, matching the formal gauge invariance of + `Physlib.Particles.QED.GaugeInvariance` on the concrete side. + +Only the photon sector evaluates: fermionic jet coordinates would have to be +evaluated on anticommuting (Grassmann-valued) fields, which have no +realisation as honest functions on spacetime. + +This file contains no definitions, only theorems. + +## ii. Key results + +- `Photon.JetAlgebra.evalPotential_fieldStrength_zero` : the formal field + strength evaluates to the field strength. +- `Photon.JetAlgebra.evalPotential_maxwellTerm` : **the formal Maxwell term + is the Maxwell Lagrangian**. +- `Photon.JetAlgebra.electricField_eq_evalPotential_fieldStrength`, + `Photon.JetAlgebra.magneticField_eq_evalPotential_fieldStrength` : the + time–space and space–space components of the evaluated formal field + strength are the electric and magnetic fields. +- `Photon.JetAlgebra.evalPotential_neg_quarter_maxwellTerm` : the Maxwell + part of the QED Lagrangian is `μ₀` times the electromagnetic kinetic term. +- `Photon.JetAlgebra.evalPotential_fieldStrength_gaugeTransform`, + `Photon.JetAlgebra.evalPotential_maxwellTerm_gaugeTransform` : + compatibility with concrete gauge transformations. +- `Photon.JetAlgebra.evalPotential_maxwell_homogeneous` : **the homogeneous + Maxwell equations**, as the evaluation of the formal Bianchi identity. +- `Photon.JetAlgebra.evalPotential_fieldStrength_lorentzAction` : + compatibility of the formal and concrete Lorentz actions. + +## iii. Table of contents + +- A. Evaluation of the field strength +- B. The Maxwell term is the Maxwell Lagrangian +- B'. The electric and magnetic fields from the jet algebra +- B''. The Maxwell part of the QED Lagrangian +- D. First-order jets and the homogeneous Maxwell equations +- E. Compatibility with concrete Lorentz transformations +- C. Compatibility with concrete gauge transformations + +## iv. References + +The evaluation map is defined in `Physlib.Particles.QED.Basic`; the concrete side is +`Physlib/Electromagnetism/Kinematics/GaugeTransformation.lean` and +`Physlib/Electromagnetism/Dynamics/KineticTerm.lean`. + +-/ + +@[expose] public section + +namespace QED + +open Electromagnetism SpaceTime minkowskiMatrix ContDiff + +attribute [-simp] Fintype.sum_sum_type + +namespace Photon + +namespace JetAlgebra + +/-! + +## A. Evaluation of the field strength + +-/ + +/-- The derivative of a covariant component. Differentiability is needed to move + the constant `η_{νν}` through the derivative. -/ +lemma deriv_coPotential (A : ElectromagneticPotential 3) (hA : Differentiable ℝ A) + (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + ∂_ μ (coPotential A ν) x = η ν ν * ∂_ μ A x ν := by + have hd : Differentiable ℝ (fun y => A y ν) := (SpaceTime.differentiable_vector _).mpr hA ν + rw [SpaceTime.deriv_apply_eq μ ν _ hA x] + show fderiv ℝ (fun y => η ν ν * A y ν) x (Lorentz.Vector.basis μ) = _ + rw [fderiv_const_mul (hd x)] + simp + +lemma evalPotential_fieldStrength_zero_apply (A : ElectromagneticPotential 3) + (hA : Differentiable ℝ A) (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + evalPotential A (fieldStrength 0 μ ν) x = η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ := by + rw [fieldStrength, map_sub] + simp only [zero_add, evalPotential_coord, derivMultiset_singleton, Pi.sub_apply] + rw [deriv_coPotential A hA μ ν x, deriv_coPotential A hA ν μ x] + +/-- The formal field strength evaluates to the field strength of the potential + with both indices lowered, `F_{μν} = η_{μμ} η_{νν} F^{μν}`. -/ +theorem evalPotential_fieldStrength_zero (A : ElectromagneticPotential 3) + (hA : Differentiable ℝ A) (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + evalPotential A (fieldStrength 0 μ ν) x = + η μ μ * η ν ν * A.fieldStrengthMatrix x (μ, ν) := by + rw [evalPotential_fieldStrength_zero_apply A hA μ ν x, + ElectromagneticPotential.toFieldStrength_basis_repr_apply_eq_single (μν := (μ, ν))] + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag μ) with h1 | h1 <;> + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with h2 | h2 <;> + rw [h1, h2] <;> ring + +/-! + +## B. The Maxwell term is the Maxwell Lagrangian + +-/ + +/-- **The formal Maxwell term is the Maxwell Lagrangian.** Evaluated on any + differentiable electromagnetic potential, the gauge-invariant jet polynomial + `F_{μν} F^{μν}` is `-4 μ₀` times the kinetic term + `- 1/(4 μ₀) F_{μν} F^{μν}` of `Physlib.Electromagnetism`. -/ +theorem evalPotential_maxwellTerm (𝓕 : FreeSpace) (A : ElectromagneticPotential 3) + (hA : Differentiable ℝ A) (x : SpaceTime 3) : + evalPotential A maxwellTerm x = -(4 * 𝓕.μ₀) * A.kineticTerm 𝓕 x := by + rw [ElectromagneticPotential.kineticTerm_eq_sum_potential, maxwellTerm, map_sum] + simp only [Finset.sum_apply, map_sum, map_smul, Pi.smul_apply, smul_eq_mul, map_mul, + Pi.mul_apply] + simp only [evalPotential_fieldStrength_zero_apply A hA] + /- Both sides are now explicit double sums in `∂_ μ A x ν`. -/ + have key : ∀ μ ν : Fin 1 ⊕ Fin 3, + η μ μ * η ν ν * ((η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ) * + (η ν ν * ∂_ μ A x ν - η μ μ * ∂_ ν A x μ)) = + (η μ μ * η ν ν * (∂_ μ A x ν) ^ 2 - ∂_ μ A x ν * ∂_ ν A x μ) + + (η ν ν * η μ μ * (∂_ ν A x μ) ^ 2 - ∂_ ν A x μ * ∂_ μ A x ν) := by + intro μ ν + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag μ) with h1 | h1 <;> + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with h2 | h2 <;> + rw [h1, h2] <;> ring + rw [Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun ν _ => key μ ν] + simp only [Finset.sum_add_distrib] + rw [Finset.sum_comm (s := Finset.univ) (t := Finset.univ) + (f := fun μ ν : Fin 1 ⊕ Fin 3 => + η ν ν * η μ μ * (∂_ ν A x μ) ^ 2 - ∂_ ν A x μ * ∂_ μ A x ν)] + have hμ₀ : 𝓕.μ₀ ≠ 0 := ne_of_gt 𝓕.μ₀_pos + field_simp + ring + +/-! + +## B'. The electric and magnetic fields from the jet algebra + +Splitting spacetime into time and space through `toTimeAndSpace`, the +time–space components of the evaluated formal field strength are the electric +field and the space–space components the magnetic field of +`Physlib.Electromagnetism`. + +-/ + +/-- The electric field is (the speed of light times) the evaluated time–space + components of the formal field strength: `E_i = c ∂_0 A_i - c ∂_i A_0` + with lowered indices. -/ +theorem electricField_eq_evalPotential_fieldStrength (c : SpeedOfLight) + (A : ElectromagneticPotential 3) (hA : Differentiable ℝ A) (t : Time) + (x : Space) (i : Fin 3) : + A.electricField c t x i = + c * evalPotential A (fieldStrength 0 (Sum.inl 0) (Sum.inr i)) + ((toTimeAndSpace c).symm (t, x)) := by + rw [evalPotential_fieldStrength_zero A hA, + ElectromagneticPotential.electricField_eq_fieldStrengthMatrix A t x i hA] + simp only [inl_0_inl_0, inr_i_inr_i, one_mul, neg_mul] + ring + +/-- The magnetic field is the evaluated space–space components of the formal + field strength, `B_i = - F_{(i+1)(i+2)}` with lowered indices. -/ +theorem magneticField_eq_evalPotential_fieldStrength (c : SpeedOfLight) + (A : ElectromagneticPotential 3) (hA : Differentiable ℝ A) (t : Time) + (x : Space) (i : Fin 3) : + A.magneticField c t x i = + - evalPotential A (fieldStrength 0 (Sum.inr (i + 1)) (Sum.inr (i + 2))) + ((toTimeAndSpace c).symm (t, x)) := by + rw [evalPotential_fieldStrength_zero A hA, + ElectromagneticPotential.magneticField_coord_eq_fieldStrengthMatrix A t x hA] + simp only [inr_i_inr_i, neg_mul, one_mul, neg_neg] + +/-! + +## B''. The Maxwell part of the QED Lagrangian + +-/ + +/-- The Maxwell part `- 1/4 F_{μν} F^{μν}` of the QED Lagrangian evaluates to + `μ₀` times the electromagnetic kinetic term of + `Physlib.Electromagnetism.Dynamics`: the two Lagrangians agree up to the + choice of units absorbed into the field normalisation. -/ +theorem evalPotential_neg_quarter_maxwellTerm (𝓕 : FreeSpace) + (A : ElectromagneticPotential 3) (hA : Differentiable ℝ A) (x : SpaceTime 3) : + evalPotential A ((-(1 : ℝ)/4) • maxwellTerm) x = 𝓕.μ₀ * A.kineticTerm 𝓕 x := by + rw [map_smul] + have h := evalPotential_maxwellTerm 𝓕 A hA x + rw [Pi.smul_apply, smul_eq_mul, h] + ring + +/-! + +## D. First-order jets and the homogeneous Maxwell equations + +Evaluation intertwines the first-order jet of the field strength with the +honest spacetime derivative — for a `C²` potential the sorted iterated +derivative is symmetric by Clairaut's theorem — and hence the formal Bianchi +identity of `Physlib.Particles.QED.FieldStrength` evaluates to **the homogeneous +Maxwell equations** in covariant form. + +-/ + +lemma contDiff_coPotential {A : ElectromagneticPotential 3} (hA : ContDiff ℝ 2 A) + (ν : Fin 1 ⊕ Fin 3) : ContDiff ℝ 2 (coPotential A ν) := by + have h : ContDiff ℝ 2 fun x => A x ν := (SpaceTime.contDiff_vector _).mpr hA ν + exact contDiff_const.mul h + +/-- The iterated derivative along a pair of directions, in either order: for a + `C²` function the canonical sorted order is immaterial by Clairaut's + theorem. -/ +lemma derivMultiset_pair (a b : Fin 1 ⊕ Fin 3) (f : SpaceTime 3 → ℝ) + (hf : ContDiff ℝ 2 f) : + derivMultiset {a, b} f = ∂_ a (∂_ b f) := by + have key : ∀ u v : Fin 1 ⊕ Fin 3, + finSumFinEquiv (m := 1) (n := 3) u ≤ finSumFinEquiv (m := 1) (n := 3) v → + derivMultiset {u, v} f = ∂_ u (∂_ v f) := by + intro u v huv + have hsort : ((finSumFinEquiv (m := 1) (n := 3) u ::ₘ + {finSumFinEquiv (m := 1) (n := 3) v}).sort fun a b => a ≤ b) = + [finSumFinEquiv (m := 1) (n := 3) u, finSumFinEquiv (m := 1) (n := 3) v] := by + rw [Multiset.sort_cons] + · rw [Multiset.sort_singleton] + · intro c hc + rw [Multiset.mem_singleton] at hc + rw [hc] + exact huv + rw [derivMultiset, show ({u, v} : Multiset (Fin 1 ⊕ Fin 3)).map + (finSumFinEquiv (m := 1) (n := 3)) = + finSumFinEquiv (m := 1) (n := 3) u ::ₘ {finSumFinEquiv (m := 1) (n := 3) v} from by + simp, hsort] + simp + rcases le_total (finSumFinEquiv (m := 1) (n := 3) a) (finSumFinEquiv (m := 1) (n := 3) b) + with h | h + · exact key a b h + · rw [show ({a, b} : Multiset (Fin 1 ⊕ Fin 3)) = {b, a} from Multiset.pair_comm a b, + key b a h, SpaceTime.deriv_commute b a f hf] + +lemma deriv_sub_eq {f g : SpaceTime 3 → ℝ} (lam : Fin 1 ⊕ Fin 3) + (hf : Differentiable ℝ f) (hg : Differentiable ℝ g) : + ∂_ lam (f - g) = ∂_ lam f - ∂_ lam g := by + ext x + rw [Pi.sub_apply, SpaceTime.deriv_eq, SpaceTime.deriv_eq, SpaceTime.deriv_eq, + fderiv_sub (hf x) (hg x)] + simp + +/-- Evaluation intertwines the first-order jet with the spacetime derivative: + the evaluated `∂_lam F_{μν}` is the derivative of the evaluated `F_{μν}`. -/ +theorem evalPotential_fieldStrength_singleton (A : ElectromagneticPotential 3) + (hA : ContDiff ℝ 2 A) (lam μ ν : Fin 1 ⊕ Fin 3) : + evalPotential A (fieldStrength {lam} μ ν) = + ∂_ lam (evalPotential A (fieldStrength 0 μ ν)) := by + have hsub : evalPotential A (fieldStrength 0 μ ν) = + ∂_ μ (coPotential A ν) - ∂_ ν (coPotential A μ) := by + rw [fieldStrength, map_sub] + simp only [zero_add, evalPotential_coord, derivMultiset_singleton] + rw [hsub, deriv_sub_eq lam + (SpaceTime.differentiable_deriv μ _ (contDiff_coPotential hA ν)) + (SpaceTime.differentiable_deriv ν _ (contDiff_coPotential hA μ)), + fieldStrength, map_sub] + simp only [evalPotential_coord, Multiset.singleton_add] + simp only [← Multiset.insert_eq_cons] + rw [derivMultiset_pair lam μ _ (contDiff_coPotential hA ν), + derivMultiset_pair lam ν _ (contDiff_coPotential hA μ)] + +/-- **The homogeneous Maxwell equations** in covariant form, + `∂_lam F_{μν} + ∂_μ F_{ν lam} + ∂_ν F_{lam μ} = 0`, as the evaluation of the + formal Bianchi identity of `Physlib.Particles.QED.FieldStrength`: Faraday's law and + the absence of magnetic monopoles are its time–space–space and + space–space–space components. -/ +theorem evalPotential_maxwell_homogeneous (A : ElectromagneticPotential 3) + (hA : ContDiff ℝ 2 A) (lam μ ν : Fin 1 ⊕ Fin 3) : + ∂_ lam (evalPotential A (fieldStrength 0 μ ν)) + + ∂_ μ (evalPotential A (fieldStrength 0 ν lam)) + + ∂_ ν (evalPotential A (fieldStrength 0 lam μ)) = 0 := by + rw [← evalPotential_fieldStrength_singleton A hA lam μ ν, + ← evalPotential_fieldStrength_singleton A hA μ ν lam, + ← evalPotential_fieldStrength_singleton A hA ν lam μ, ← map_add, ← map_add, + show fieldStrength {lam} μ ν + fieldStrength {μ} ν lam + + fieldStrength {ν} lam μ = 0 from by + simpa using fieldStrength_bianchi 0 lam μ ν, + map_zero] + +/-! + +## D'. The inhomogeneous Maxwell equations and the action principle + +The concrete side (`Physlib.Electromagnetism.Dynamics.IsExtrema`) proves +variationally that a potential extremises the electromagnetic action exactly +when `∂_μ F^{μν} = μ₀ J^ν`. The left-hand side is the evaluation of the +formal Maxwell operator of `Physlib.Particles.QED.Fields`, so the action +principle can be read entirely through the jet algebra. + +-/ + +lemma deriv_const_mul_apply (c : ℝ) {f : SpaceTime 3 → ℝ} (ρ : Fin 1 ⊕ Fin 3) + (hf : Differentiable ℝ f) (x : SpaceTime 3) : + ∂_ ρ (fun y => c * f y) x = c * ∂_ ρ f x := by + rw [SpaceTime.deriv_eq, SpaceTime.deriv_eq, fderiv_const_mul (hf x)] + simp + +/-- **The action principle through the jet algebra**: an electromagnetic + potential extremises the Maxwell action with source `J` exactly when the + evaluated formal Maxwell operator equals `μ₀ J` — the inhomogeneous Maxwell + equations `∂_μ F^{μν} = μ₀ J^ν`. -/ +theorem isExtrema_iff_evalPotential_maxwellOperator (𝓕 : FreeSpace) + (A : ElectromagneticPotential 3) (hA : ContDiff ℝ ∞ A) + (J : LorentzCurrentDensity 3) (hJ : ContDiff ℝ ∞ J) : + ElectromagneticPotential.IsExtrema 𝓕 A J ↔ + ∀ x ν, evalPotential A (maxwellOperator ν) x = 𝓕.μ₀ * J x ν := by + have h2 : ContDiff ℝ 2 A := hA.of_le ENat.LEInfty.out + have hdiffF : ∀ μ' ν' : Fin 1 ⊕ Fin 3, + Differentiable ℝ (evalPotential A (fieldStrength 0 μ' ν')) := by + intro μ' ν' + rw [show evalPotential A (fieldStrength 0 μ' ν') = + ∂_ μ' (coPotential A ν') - ∂_ ν' (coPotential A μ') from by + rw [fieldStrength, map_sub] + simp only [zero_add, evalPotential_coord, derivMultiset_singleton]] + exact (SpaceTime.differentiable_deriv _ _ (contDiff_coPotential h2 ν')).sub + (SpaceTime.differentiable_deriv _ _ (contDiff_coPotential h2 μ')) + rw [ElectromagneticPotential.isExtrema_iff_fieldStrengthMatrix A hA J hJ] + refine forall_congr' fun x => forall_congr' fun ν => Iff.of_eq ?_ + refine congrArg (· = 𝓕.μ₀ * J x ν) ?_ + have hFmat : ∀ μ' : Fin 1 ⊕ Fin 3, (fun y => A.fieldStrengthMatrix y (μ', ν)) = + fun y => (η μ' μ' * η ν ν) * evalPotential A (fieldStrength 0 μ' ν) y := by + intro μ' + funext y + rw [evalPotential_fieldStrength_zero A (h2.differentiable two_ne_zero) μ' ν y] + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag μ') with + h1 | h1 <;> + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with + h2' | h2' <;> + rw [h1, h2'] <;> ring + calc ∑ μ, ∂_ μ (A.fieldStrengthMatrix · (μ, ν)) x + = ∑ μ, (η μ μ * η ν ν) * ∂_ μ (evalPotential A (fieldStrength 0 μ ν)) x := by + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [show (fun y => A.fieldStrengthMatrix y (μ, ν)) = + fun y => (η μ μ * η ν ν) * evalPotential A (fieldStrength 0 μ ν) y from + hFmat μ, deriv_const_mul_apply _ _ (hdiffF μ ν)] + _ = evalPotential A (maxwellOperator ν) x := by + rw [maxwellOperator, map_sum, Finset.sum_apply] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_smul, Pi.smul_apply, smul_eq_mul, + evalPotential_fieldStrength_singleton A h2 μ μ ν] + +/-! + +## E. Compatibility with concrete Lorentz transformations + +The formal Lorentz action of `Physlib.Particles.QED.Basic` is matched by the concrete +action `(Λ • A) x = Λ • A (Λ⁻¹ • x)` of `Physlib.Electromagnetism`: +evaluating the field strength on the transformed potential is evaluating the +Lorentz-transformed jet on the original potential at the transformed point. + +-/ + +/-- **Compatibility of the formal and concrete Lorentz actions**: the + evaluation of the field strength on `Λ • A` at `x` is the evaluation of its + formal Lorentz transform on `A` at `Λ⁻¹ • x`, matching the equivariance + `Physlib.Electromagnetism.Kinematics.FieldStrength.toFieldStrength_equivariant` + on the concrete side. -/ +theorem evalPotential_fieldStrength_lorentzAction (Λ : LorentzGroup 3) + (A : ElectromagneticPotential 3) (hA : Differentiable ℝ A) + (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + evalPotential (Λ • A) (fieldStrength 0 μ ν) x = + evalPotential A (lorentzAction Λ (fieldStrength 0 μ ν)) (Λ⁻¹ • x) := by + have hinv : ∀ a μ' : Fin 1 ⊕ Fin 3, (Λ⁻¹).1 a μ' = η a a * Λ.1 μ' a * η μ' μ' := by + intro a μ' + rw [LorentzGroup.inv_eq_dual] + exact minkowskiMatrix.dual_apply _ a μ' + have hΛA : Differentiable ℝ (Λ • A) := + ElectromagneticPotential.differentiable_action Λ A hA + rw [evalPotential_fieldStrength_zero _ hΛA μ ν x, + ElectromagneticPotential.fieldStrengthMatrix_equivariant A Λ hA, + lorentzAction_fieldStrength_zero] + simp only [map_sum, map_smul, Finset.sum_apply, Pi.smul_apply, smul_eq_mul] + simp only [evalPotential_fieldStrength_zero A hA] + simp only [Finset.mul_sum] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag a) with h1 | h1 <;> + rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag b) with h2 | h2 <;> + rw [hinv a μ, hinv b ν, h1, h2] <;> ring + +/-! + +## C. Compatibility with concrete gauge transformations + +The formal gauge invariance of `Physlib.Particles.QED.GaugeInvariance` is matched on +the concrete side: the evaluation of the field strength, and hence of the +Maxwell term, is unchanged when the potential is replaced by `A + ∂χ`. + +-/ + +lemma differentiable_gaugeTransform {A : ElectromagneticPotential 3} {χ : SpaceTime 3 → ℝ} + (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) : + Differentiable ℝ (ElectromagneticPotential.gaugeTransform χ A) := + hA.add (ElectromagneticPotential.differentiable_ofGradient hχ) + +/-- The evaluated field strength is invariant under the concrete gauge + transformation `A ↦ A + ∂χ`, matching the formal gauge invariance + `Physlib.Particles.QED.GaugeInvariance.Photon.JetAlgebra.gaugeAction_fieldStrength`. -/ +theorem evalPotential_fieldStrength_gaugeTransform (A : ElectromagneticPotential 3) + (χ : SpaceTime 3 → ℝ) (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) + (μ ν : Fin 1 ⊕ Fin 3) (x : SpaceTime 3) : + evalPotential (ElectromagneticPotential.gaugeTransform χ A) (fieldStrength 0 μ ν) x = + evalPotential A (fieldStrength 0 μ ν) x := by + rw [evalPotential_fieldStrength_zero _ (differentiable_gaugeTransform hA hχ), + evalPotential_fieldStrength_zero A hA, + ElectromagneticPotential.fieldStrengthMatrix_gaugeTransform A χ hA hχ] + +/-- The Maxwell Lagrangian is gauge invariant, as read off from the jet algebra. -/ +theorem evalPotential_maxwellTerm_gaugeTransform (A : ElectromagneticPotential 3) + (χ : SpaceTime 3 → ℝ) (hA : Differentiable ℝ A) (hχ : ContDiff ℝ 2 χ) + (x : SpaceTime 3) : + evalPotential (ElectromagneticPotential.gaugeTransform χ A) maxwellTerm x = + evalPotential A maxwellTerm x := by + rw [maxwellTerm, map_sum, map_sum] + simp only [Finset.sum_apply, map_sum, map_smul, Pi.smul_apply, smul_eq_mul, map_mul, + Pi.mul_apply] + refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun ν _ => ?_ + rw [evalPotential_fieldStrength_gaugeTransform A χ hA hχ] + +end JetAlgebra + +end Photon + +end QED diff --git a/Physlib/Particles/QED/FermionStatistics.lean b/Physlib/Particles/QED/FermionStatistics.lean new file mode 100644 index 000000000..027692826 --- /dev/null +++ b/Physlib/Particles/QED/FermionStatistics.lean @@ -0,0 +1,146 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Fields +/-! +# Spin-statistics of the QED fields + +## i. Overview + +The statistics of the fields of QED, as encoded in the QED jet algebra: the +electron jet coordinates anticommute among themselves and square to zero +(fermionic statistics), while the photon jet coordinates commute with +everything (bosonic statistics). + +This file contains no definitions, only theorems about the fields of +`Physlib.Particles.QED.Fields`. + +## ii. Key results + +- `Electron.JetAlgebra.ofGenerator_mul_self`, + `Electron.JetAlgebra.ofGenerator_anticommute` : fermionic statistics of the + electron jet coordinates. +- `JetAlgebra.ψ_mul_ψ_anticomm`, `JetAlgebra.ψ_mul_barψ_anticomm`, + `JetAlgebra.barψ_mul_barψ_anticomm` : the electron coordinates anticommute + in the QED jet algebra. +- `JetAlgebra.ψ_mul_self`, `JetAlgebra.barψ_mul_self` : Pauli exclusion for + the jet coordinates. +- `JetAlgebra.A_mul_A_comm`, `JetAlgebra.A_mul_ψ_comm`, + `JetAlgebra.A_mul_barψ_comm` : the photon coordinates are bosonic. + +## iii. Table of contents + +- A. Fermionic statistics of the electron jet coordinates +- B. Fermionic statistics in the QED jet algebra +- C. Bosonic statistics of the photon jet coordinates + +## iv. References + +The fields are defined in `Physlib.Particles.QED.Fields`. + +-/ + +@[expose] public section + +namespace QED + +/-! + +## A. Fermionic statistics of the electron jet coordinates + +-/ + +namespace Electron + +namespace JetAlgebra + +@[simp] +lemma ofGenerator_mul_self (j : JetGenerators) : + ofGenerator j * ofGenerator j = 0 := + ExteriorAlgebra.ι_sq_zero _ + +/-- The jet coordinates of the electron anticommute: the electron is a + fermion. -/ +theorem ofGenerator_anticommute (i j : JetGenerators) : + ofGenerator i * ofGenerator j = -(ofGenerator j * ofGenerator i) := by + have h := ExteriorAlgebra.ι_sq_zero (R := ℂ) (M := JetComponentSpace) + (Finsupp.single i 1 + Finsupp.single j 1) + rw [map_add, add_mul, mul_add, mul_add, ExteriorAlgebra.ι_sq_zero, + ExteriorAlgebra.ι_sq_zero, zero_add, add_zero] at h + exact eq_neg_of_add_eq_zero_left h + +end JetAlgebra + +end Electron + +namespace JetAlgebra + +/-! + +## B. Fermionic statistics in the QED jet algebra + +-/ + +/-- The electron jet coordinates anticommute. -/ +theorem ψ_mul_ψ_anticomm (s t : Multiset (Fin 1 ⊕ Fin 3)) (α β : Fin 2 ⊕ Fin 2) : + ψ s α * ψ t β = -(ψ t β * ψ s α) := by + simp only [ψ, tmul_mul_tmul, one_mul] + rw [Electron.JetAlgebra.ofGenerator_anticommute, tmul_neg] + +/-- The electron and conjugate-electron jet coordinates anticommute. -/ +theorem ψ_mul_barψ_anticomm (s t : Multiset (Fin 1 ⊕ Fin 3)) (α β : Fin 2 ⊕ Fin 2) : + ψ s α * barψ t β = -(barψ t β * ψ s α) := by + simp only [ψ, barψ, tmul_mul_tmul, one_mul] + rw [Electron.JetAlgebra.ofGenerator_anticommute, tmul_neg] + +/-- The conjugate-electron jet coordinates anticommute. -/ +theorem barψ_mul_barψ_anticomm (s t : Multiset (Fin 1 ⊕ Fin 3)) (α β : Fin 2 ⊕ Fin 2) : + barψ s α * barψ t β = -(barψ t β * barψ s α) := by + simp only [barψ, tmul_mul_tmul, one_mul] + rw [Electron.JetAlgebra.ofGenerator_anticommute, tmul_neg] + +/-- Pauli exclusion: an electron jet coordinate squares to zero. -/ +@[simp] +theorem ψ_mul_self (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + ψ s α * ψ s α = 0 := by + simp [ψ] + +/-- Pauli exclusion: a conjugate electron jet coordinate squares to zero. -/ +@[simp] +theorem barψ_mul_self (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + barψ s α * barψ s α = 0 := by + simp [barψ] + +/-! + +## C. Bosonic statistics of the photon jet coordinates + +-/ + +/-- The photon jet coordinates commute among themselves: the photon is a + boson. -/ +theorem A_mul_A_comm (s t : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + A s μ * A t ν = A t ν * A s μ := by + simp only [A, tmul_mul_tmul, mul_one] + rw [mul_comm] + +/-- The photon jet coordinates commute with the electron jet coordinates. -/ +theorem A_mul_ψ_comm (s t : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + A s μ * ψ t α = ψ t α * A s μ := by + simp only [A, ψ, tmul_mul_tmul, one_mul, mul_one] + +/-- The photon jet coordinates commute with the conjugate electron jet + coordinates. -/ +theorem A_mul_barψ_comm (s t : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + A s μ * barψ t α = barψ t α * A s μ := by + simp only [A, barψ, tmul_mul_tmul, one_mul, mul_one] + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/FieldStrength.lean b/Physlib/Particles/QED/FieldStrength.lean new file mode 100644 index 000000000..0ddd25e4f --- /dev/null +++ b/Physlib/Particles/QED/FieldStrength.lean @@ -0,0 +1,202 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Fields +/-! +# Properties of the field strength + +## i. Overview + +The structural theorems about the electromagnetic field strength in the jet +algebras of QED: antisymmetry, the expression of the field strength through +the potential coordinates, and the **Bianchi identity** + +`∂_λ F_{μν} + ∂_μ F_{νλ} + ∂_ν F_{λμ} = 0`, + +the homogeneous half of Maxwell's equations. In the jet algebra the Bianchi +identity is exact and purely combinatorial: each term is a difference of +second-derivative coordinates, and the six coordinates cancel in pairs because +multiset addition is commutative — Clairaut's theorem is built into the +indexing. + +This file contains no definitions, only theorems about the fields of +`Physlib.Particles.QED.Fields`. + +## ii. Key results + +- `Photon.JetAlgebra.fieldStrength_antisymm`, + `JetAlgebra.fieldStrength_antisymm` : antisymmetry of the field strength. +- `JetAlgebra.fieldStrength_eq_sub` : the field strength through the + potential coordinates, `F_{μν} = ∂_μ A_ν - ∂_ν A_μ`. +- `Photon.JetAlgebra.fieldStrength_bianchi`, + `JetAlgebra.fieldStrength_bianchi` : **the Bianchi identity**. + +## iii. Table of contents + +- A. The field strength in the photon jet algebra + - A.1. Antisymmetry + - A.2. The Bianchi identity +- B. The field strength in the QED jet algebra + +## iv. References + +The fields are defined in `Physlib.Particles.QED.Fields`. The inhomogeneous half of +Maxwell's equations is dynamical (it needs the variation of the Lagrangian) +and is not part of the jet-algebra kinematics. + +-/ + +@[expose] public section + +namespace QED + +open TensorProduct + +namespace Photon + +namespace JetAlgebra + +/-! + +## A. The field strength in the photon jet algebra + +### A.1. Antisymmetry + +-/ + +theorem fieldStrength_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength s μ ν = -fieldStrength s ν μ := by + simp [fieldStrength] + +@[simp] +theorem fieldStrength_self (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + fieldStrength s μ μ = 0 := by + simp [fieldStrength] + +/-! + +### A.2. The Bianchi identity + +Each field strength is a difference of two second-derivative coordinates; the +cyclic sum produces six coordinates which cancel in pairs, because the +multisets `s + {μ} + {ν}` and `s + {ν} + {μ}` are equal. + +-/ + +/-- **The Bianchi identity** `∂_lam F_{μν} + ∂_μ F_{ν lam} + ∂_ν F_{lam μ} = 0` + in the photon jet algebra: the homogeneous Maxwell equations hold exactly, + for every derivative order `s`. -/ +theorem fieldStrength_bianchi (s : Multiset (Fin 1 ⊕ Fin 3)) + (lam μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength (s + {lam}) μ ν + fieldStrength (s + {μ}) ν lam + + fieldStrength (s + {ν}) lam μ = 0 := by + have h : ∀ a b : Fin 1 ⊕ Fin 3, s + {a} + {b} = s + {b} + {a} := fun a b => by + rw [add_assoc, add_assoc, add_comm ({a} : Multiset (Fin 1 ⊕ Fin 3))] + simp only [fieldStrength] + rw [h lam μ, h lam ν, h μ ν] + ring + +end JetAlgebra + +end Photon + +namespace JetAlgebra + +/-! + +## B. The field strength in the QED jet algebra + +The theorems of section A, transported through the inclusion of the photon +factor into the QED jet algebra. + +-/ + +/-- The field strength is the antisymmetrised derivative of the potential, + `∂_s F_{μν} = ∂_s ∂_μ A_ν - ∂_s ∂_ν A_μ`. -/ +theorem fieldStrength_eq_sub (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength s μ ν = A (s + {μ}) ν - A (s + {ν}) μ := by + rw [fieldStrength, Photon.JetAlgebra.fieldStrength, TensorProduct.tmul_sub, + sub_tmul] + rfl + +theorem fieldStrength_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength s μ ν = -fieldStrength s ν μ := by + simp only [fieldStrength] + rw [Photon.JetAlgebra.fieldStrength_antisymm, TensorProduct.tmul_neg, neg_tmul] + +@[simp] +theorem fieldStrength_self (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + fieldStrength s μ μ = 0 := by + simp only [fieldStrength, Photon.JetAlgebra.fieldStrength_self, + TensorProduct.tmul_zero, zero_tmul] + +/-- **The Bianchi identity** in the QED jet algebra. -/ +theorem fieldStrength_bianchi (s : Multiset (Fin 1 ⊕ Fin 3)) + (lam μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength (s + {lam}) μ ν + fieldStrength (s + {μ}) ν lam + + fieldStrength (s + {ν}) lam μ = 0 := by + simp only [fieldStrength] + rw [← add_tmul, ← add_tmul, ← TensorProduct.tmul_add, ← TensorProduct.tmul_add, + Photon.JetAlgebra.fieldStrength_bianchi, TensorProduct.tmul_zero, zero_tmul] + +/-! + +## C. The total derivative on the fields + +-/ + +/-- The first-order field-strength jet is the total derivative of the + zeroth-order one, in the photon jet algebra. -/ +theorem _root_.QED.Photon.JetAlgebra.fieldStrength_singleton_eq_jetDeriv + (ρ μ ν : Fin 1 ⊕ Fin 3) : + Photon.JetAlgebra.fieldStrength {ρ} μ ν = + Photon.JetAlgebra.jetDeriv ρ (Photon.JetAlgebra.fieldStrength 0 μ ν) := by + rw [Photon.JetAlgebra.fieldStrength, Photon.JetAlgebra.fieldStrength, map_sub, + Photon.JetAlgebra.jetDeriv_coord, Photon.JetAlgebra.jetDeriv_coord, + zero_add, zero_add, + show ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = {μ} + {ρ} from + Multiset.add_comm _ _, + show ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) + {ν} = {ν} + {ρ} from + Multiset.add_comm _ _] + +/-- The total derivative appends the derivative index to the photon jet + coordinate. -/ +@[simp] +theorem jetDeriv_A (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + jetDeriv ρ (A s μ) = A (s + {ρ}) μ := by + simp only [A] + rw [jetDeriv_tmul, Electron.JetAlgebra.jetDeriv_one, tmul_zero, add_zero, + LinearMap.baseChange_tmul, Photon.JetAlgebra.jetDeriv_coord] + +/-- The total derivative appends the derivative index to the electron jet + coordinate. -/ +@[simp] +theorem jetDeriv_ψ (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (α : Fin 2 ⊕ Fin 2) : + jetDeriv ρ (ψ s α) = ψ (s + {ρ}) α := by + simp only [ψ] + rw [jetDeriv_tmul, show (1 : ℂ ⊗[ℝ] Photon.JetAlgebra) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : Photon.JetAlgebra) from rfl, LinearMap.baseChange_tmul, + Photon.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, zero_tmul, zero_add, + Electron.JetAlgebra.jetDeriv_ofGenerator] + rfl + +@[simp] +theorem jetDeriv_barψ (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (α : Fin 2 ⊕ Fin 2) : + jetDeriv ρ (barψ s α) = barψ (s + {ρ}) α := by + simp only [barψ] + rw [jetDeriv_tmul, show (1 : ℂ ⊗[ℝ] Photon.JetAlgebra) = + (1 : ℂ) ⊗ₜ[ℝ] (1 : Photon.JetAlgebra) from rfl, LinearMap.baseChange_tmul, + Photon.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, zero_tmul, zero_add, + Electron.JetAlgebra.jetDeriv_ofGenerator] + rfl + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/Fields.lean b/Physlib/Particles/QED/Fields.lean new file mode 100644 index 000000000..5cc83c441 --- /dev/null +++ b/Physlib/Particles/QED/Fields.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Basic +public import Physlib.Relativity.PauliMatrices.Basic +/-! +# The fields of quantum electrodynamics + +## i. Overview + +The fields of QED, defined on top of the jet algebras of `Physlib.Particles.QED.Basic`: +the photon and electron jet coordinates as elements of the QED jet algebra, +the field strength, the Maxwell term, the Dirac γ matrices in the chiral +representation, and the covariant derivatives of the electron and its +conjugate. + +This file contains only definitions; the theorems about these fields are +proved in `Physlib.Particles.QED.FermionStatistics`, `Physlib.Particles.QED.FieldStrength`, +`Physlib.Particles.QED.GammaMatrices`, `Physlib.Particles.QED.GaugeInvariance` and +`Physlib.Particles.QED.Evaluation`, and the Lagrangian built from them is defined in +`Physlib.Particles.QED.Lagrangian`. + +## ii. Key results + +- `Photon.JetAlgebra.fieldStrength`, `Photon.JetAlgebra.maxwellTerm` : the + field strength and the Maxwell term in the photon jet algebra. +- `JetAlgebra.A`, `JetAlgebra.ψ`, `JetAlgebra.barψ` : the jet coordinates of + QED. +- `JetAlgebra.fieldStrength`, `JetAlgebra.maxwellTerm` : the field strength + and the Maxwell term in the QED jet algebra. +- `JetAlgebra.gammaMatrix`, `JetAlgebra.kineticGamma` : the γ matrices in the + chiral representation and the contraction matrices `γ⁰ γ^μ`. +- `JetAlgebra.covDψ`, `JetAlgebra.covDbarψ` : the covariant derivatives. + +## iii. Table of contents + +- A. The field strength and Maxwell term of the photon +- B. The jet coordinates of QED +- C. The γ matrices in the chiral representation +- D. The covariant derivatives + +## iv. References + +The jet algebras are defined in `Physlib.Particles.QED.Basic`; the Lagrangian is +defined in `Physlib.Particles.QED.Lagrangian`. + +-/ + +@[expose] public section + +namespace QED + +open minkowskiMatrix +open scoped PauliMatrix + +namespace Photon + +namespace JetAlgebra + +/-! + +## A. The field strength and Maxwell term of the photon + +-/ + +/-- The formal field strength `∂_s F_{μν} = ∂_s ∂_μ A_ν - ∂_s ∂_ν A_μ`. -/ +noncomputable def fieldStrength (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + JetAlgebra := + coord (s + {μ}) ν - coord (s + {ν}) μ + +/-- The formal Maxwell term `F_{μν} F^{μν}`, both indices raised with the + (diagonal) Minkowski metric. -/ +noncomputable def maxwellTerm : JetAlgebra := + ∑ μ, ∑ ν, (η μ μ * η ν ν) • (fieldStrength 0 μ ν * fieldStrength 0 μ ν) + +/-- The Maxwell operator `∂_μ F^{μν}`: the divergence of the field strength + with raised indices. Its vanishing is the vacuum Maxwell equation; its + evaluation on an honest potential is the Euler–Lagrange gradient of the + Maxwell action — see `Physlib.Particles.QED.Evaluation`. -/ +noncomputable def maxwellOperator (ν : Fin 1 ⊕ Fin 3) : JetAlgebra := + ∑ μ, (η μ μ * η ν ν) • fieldStrength {μ} μ ν + +end JetAlgebra + +end Photon + +namespace JetAlgebra + +/-! + +## B. The jet coordinates of QED + +The photon jet coordinate `∂_s A_μ` and the electron jet coordinates +`∂_s ψ_α`, `∂_s ψ̄_α`, as elements of the QED jet algebra, together with the +field strength and the Maxwell term. + +-/ + +/-- The photon jet coordinate `∂_s A_μ` in the QED jet algebra. -/ +noncomputable def A (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + JetAlgebra := + ((1 : ℂ) ⊗ₜ[ℝ] Photon.JetAlgebra.coord s μ) ⊗ⱼ 1 + +/-- The electron jet coordinate `∂_s ψ_α` in the QED jet algebra. -/ +noncomputable def ψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + JetAlgebra := + 1 ⊗ⱼ Electron.JetAlgebra.ofGenerator (.dψ s α) + +/-- The conjugate electron jet coordinate `∂_s ψ̄_α` in the QED jet algebra. -/ +noncomputable def barψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + JetAlgebra := + 1 ⊗ⱼ Electron.JetAlgebra.ofGenerator (.dbarψ s α) + +/-- The formal field strength `∂_s F_{μν}` in the QED jet algebra. -/ +noncomputable def fieldStrength (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := + ((1 : ℂ) ⊗ₜ[ℝ] Photon.JetAlgebra.fieldStrength s μ ν) ⊗ⱼ 1 + +/-- The formal Maxwell term `F_{μν} F^{μν}` in the QED jet algebra. Its + evaluation on an honest electromagnetic potential is the Maxwell Lagrangian; + see `Physlib.Particles.QED.Evaluation`. -/ +noncomputable def maxwellTerm : JetAlgebra := + ((1 : ℂ) ⊗ₜ[ℝ] Photon.JetAlgebra.maxwellTerm) ⊗ⱼ 1 + +/-! + +## C. The γ matrices in the chiral representation + +In the chiral representation `γ^μ = ((0, σ^μ), (σ̄^μ, 0))` with +`σ^μ = (1, σ^i)` and `σ̄^μ = (1, -σ^i)`; since the Minkowski matrix is +diagonal, `σ̄^μ = η_{μμ} σ^μ` with no sum over `μ`. + +-/ + +/-- The Dirac γ matrices in the chiral (Weyl) representation: + `γ^μ = ((0, σ^μ), (σ̄^μ, 0))`, acting on the Dirac index `Fin 2 ⊕ Fin 2` + whose summands are the left- and right-handed Weyl components. -/ +noncomputable def gammaMatrix (μ : Fin 1 ⊕ Fin 3) : + Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ := + Matrix.fromBlocks 0 (σ μ) (η μ μ • σ μ) 0 + +/-- The contraction matrices `γ⁰ γ^μ = ((σ̄^μ, 0), (0, σ^μ))` of the Dirac + kinetic term `i ψ† (γ⁰ γ^μ) D_μ ψ`; see + `Physlib.Particles.QED.GammaMatrices.kineticGamma_eq_gammaMatrix_mul`. -/ +noncomputable def kineticGamma (μ : Fin 1 ⊕ Fin 3) : + Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ := + Matrix.fromBlocks (η μ μ • σ μ) 0 0 (σ μ) + +/-! + +## D. The covariant derivatives + +The electron has electric charge `-1`, so `D_μ ψ = ∂_μ ψ + i e A_μ ψ` and +`D_μ ψ̄ = ∂_μ ψ̄ - i e A_μ ψ̄`, with `e` the electric coupling. + +-/ + +/-- The covariant derivative jet `(D_μ ψ)_α = ∂_μ ψ_α + i e A_μ ψ_α` of the + electron. -/ +noncomputable def covDψ (e : ℝ) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + JetAlgebra := + ψ {μ} α + (Complex.I * e) • (A 0 μ * ψ 0 α) + +/-- The covariant derivative jet `(D_μ ψ̄)_α = ∂_μ ψ̄_α - i e A_μ ψ̄_α` of the + conjugate electron. -/ +noncomputable def covDbarψ (e : ℝ) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + JetAlgebra := + barψ {μ} α - (Complex.I * e) • (A 0 μ * barψ 0 α) + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/GammaMatrices.lean b/Physlib/Particles/QED/GammaMatrices.lean new file mode 100644 index 000000000..c5d91604a --- /dev/null +++ b/Physlib/Particles/QED/GammaMatrices.lean @@ -0,0 +1,168 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Fields +/-! +# Properties of the γ matrices + +## i. Overview + +The defining properties of the Dirac γ matrices of `Physlib.Particles.QED.Fields`, in +the chiral representation: + +* the **Clifford algebra relation** `γ^μ γ^ν + γ^ν γ^μ = 2 η^{μν} 1`, which + makes the Dirac operator a square root of the wave operator; +* the hermiticity properties `(γ⁰ γ^μ)† = γ⁰ γ^μ` and + `(γ^μ)† = γ⁰ γ^μ γ⁰`, which make the Dirac Lagrangian hermitian; +* the factorisation `γ⁰ γ^μ` of the contraction matrices of the kinetic term. + +This file contains no definitions, only theorems about the fields of +`Physlib.Particles.QED.Fields`. + +## ii. Key results + +- `JetAlgebra.gammaMatrix_mul_add_swap` : **the Clifford algebra relation**. +- `JetAlgebra.kineticGamma_eq_gammaMatrix_mul` : the contraction matrices of + the kinetic term are `γ⁰ γ^μ`. +- `JetAlgebra.kineticGamma_conjTranspose` : the contraction matrices are + self-adjoint. +- `JetAlgebra.gammaMatrix_conjTranspose` : `(γ^μ)† = γ⁰ γ^μ γ⁰`. + +## iii. Table of contents + +- A. The Pauli anticommutators +- B. The Clifford algebra relation +- C. Hermiticity + +## iv. References + +The γ matrices are defined in `Physlib.Particles.QED.Fields`; the Pauli matrices are +those of `Physlib.Relativity.PauliMatrices`. + +-/ + +@[expose] public section + +namespace QED + +namespace JetAlgebra + +open Matrix minkowskiMatrix +open scoped PauliMatrix + +/-! + +## A. The Pauli anticommutators + +The two block identities behind the Clifford relation: +`σ^μ σ̄^ν + σ^ν σ̄^μ = 2 η^{μν} 1` and `σ̄^μ σ^ν + σ̄^ν σ^μ = 2 η^{μν} 1`, +with `σ̄^μ = η_{μμ} σ^μ` (no sum). Both reduce to the anticommutation +relations of the Pauli matrices. + +-/ + +lemma pauliMatrix_mul_smul_add_swap (μ ν : Fin 1 ⊕ Fin 3) : + σ μ * (η ν ν • σ ν) + σ ν * (η μ μ • σ μ) = + (2 * η μ ν) • (1 : Matrix (Fin 2) (Fin 2) ℂ) := by + fin_cases μ <;> fin_cases ν <;> + simp [PauliMatrix.pauliMatrix_mul_self, two_smul, + PauliMatrix.pauliMatrix_inl_zero_eq_one] + +lemma smul_pauliMatrix_mul_add_swap (μ ν : Fin 1 ⊕ Fin 3) : + (η μ μ • σ μ) * σ ν + (η ν ν • σ ν) * σ μ = + (2 * η μ ν) • (1 : Matrix (Fin 2) (Fin 2) ℂ) := by + fin_cases μ <;> fin_cases ν <;> + simp [PauliMatrix.pauliMatrix_mul_self, two_smul, + PauliMatrix.pauliMatrix_inl_zero_eq_one] + +/-! + +## B. The Clifford algebra relation + +-/ + +/-- **The Clifford algebra relation** of the Dirac γ matrices: + `γ^μ γ^ν + γ^ν γ^μ = 2 η^{μν} 1`. This is the algebraic identity that + makes the Dirac operator a square root of the wave operator, and hence the + Dirac equation relativistic. -/ +theorem gammaMatrix_mul_add_swap (μ ν : Fin 1 ⊕ Fin 3) : + gammaMatrix μ * gammaMatrix ν + gammaMatrix ν * gammaMatrix μ = + (2 * η μ ν) • (1 : Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ) := by + rw [gammaMatrix, gammaMatrix, Matrix.fromBlocks_multiply, + Matrix.fromBlocks_multiply, Matrix.fromBlocks_add, + show ((2 * η μ ν) • (1 : Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ)) = + Matrix.fromBlocks ((2 * η μ ν) • 1) 0 0 ((2 * η μ ν) • 1) by + rw [← Matrix.fromBlocks_one, Matrix.fromBlocks_smul, smul_zero]] + congr 1 + · simpa using pauliMatrix_mul_smul_add_swap μ ν + · simp + · simp + · simpa using smul_pauliMatrix_mul_add_swap μ ν + +/-- The square of a γ matrix: `(γ^μ)² = η^{μμ} 1` (no sum). -/ +theorem gammaMatrix_sq (μ : Fin 1 ⊕ Fin 3) : + gammaMatrix μ * gammaMatrix μ = + (η μ μ) • (1 : Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ) := by + rw [gammaMatrix, Matrix.fromBlocks_multiply, + show ((η μ μ) • (1 : Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ)) = + Matrix.fromBlocks ((η μ μ) • 1) 0 0 ((η μ μ) • 1) by + rw [← Matrix.fromBlocks_one, Matrix.fromBlocks_smul, smul_zero]] + congr 1 <;> simp [PauliMatrix.pauliMatrix_mul_self] + +/-- The γ matrices of distinct indices anticommute. -/ +theorem gammaMatrix_anticommute {μ ν : Fin 1 ⊕ Fin 3} (h : μ ≠ ν) : + gammaMatrix μ * gammaMatrix ν = -(gammaMatrix ν * gammaMatrix μ) := by + have hc := gammaMatrix_mul_add_swap μ ν + rw [off_diag_zero h] at hc + simp only [mul_zero, zero_smul] at hc + exact eq_neg_of_add_eq_zero_left hc + +/-! + +## C. Hermiticity + +-/ + +/-- `γ⁰` in the chiral representation is the block off-diagonal identity. -/ +theorem gammaMatrix_inl_zero : + gammaMatrix (Sum.inl 0) = Matrix.fromBlocks 0 1 1 0 := by + rw [gammaMatrix] + simp [PauliMatrix.pauliMatrix_inl_zero_eq_one] + +/-- The contraction matrices of the kinetic term are `γ⁰ γ^μ`. -/ +theorem kineticGamma_eq_gammaMatrix_mul (μ : Fin 1 ⊕ Fin 3) : + kineticGamma μ = gammaMatrix (Sum.inl 0) * gammaMatrix μ := by + rw [kineticGamma, gammaMatrix, gammaMatrix, Matrix.fromBlocks_multiply] + simp [PauliMatrix.pauliMatrix_inl_zero_eq_one] + +/-- The contraction matrices `γ⁰ γ^μ` of the kinetic term are self-adjoint; + this is what makes the Dirac kinetic term hermitian up to a total + derivative. -/ +theorem kineticGamma_conjTranspose (μ : Fin 1 ⊕ Fin 3) : + (kineticGamma μ)ᴴ = kineticGamma μ := by + fin_cases μ <;> + simp [kineticGamma, Matrix.fromBlocks_conjTranspose, + PauliMatrix.pauliMatrix_selfAdjoint] + +/-- `γ⁰` is self-adjoint. -/ +theorem gammaMatrix_zero_conjTranspose : + (gammaMatrix (Sum.inl 0))ᴴ = gammaMatrix (Sum.inl 0) := by + simp [gammaMatrix, Matrix.fromBlocks_conjTranspose, + PauliMatrix.pauliMatrix_inl_zero_eq_one] + +/-- The hermiticity relation of the γ matrices, `(γ^μ)† = γ⁰ γ^μ γ⁰`. -/ +theorem gammaMatrix_conjTranspose (μ : Fin 1 ⊕ Fin 3) : + (gammaMatrix μ)ᴴ = + gammaMatrix (Sum.inl 0) * gammaMatrix μ * gammaMatrix (Sum.inl 0) := by + fin_cases μ <;> + simp [gammaMatrix, Matrix.fromBlocks_conjTranspose, + Matrix.fromBlocks_multiply, PauliMatrix.pauliMatrix_selfAdjoint, + PauliMatrix.pauliMatrix_inl_zero_eq_one] + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/GaugeInvariance.lean b/Physlib/Particles/QED/GaugeInvariance.lean new file mode 100644 index 000000000..4e833a9d9 --- /dev/null +++ b/Physlib/Particles/QED/GaugeInvariance.lean @@ -0,0 +1,501 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Lagrangian +public import Mathlib.Tactic.Module +/-! +# Gauge invariance of quantum electrodynamics + +## i. Overview + +The gauge-theoretic theorems of QED, culminating in the gauge invariance of +the QED Lagrangian, `gaugeAction_lagrangian`. The chain of results +decomposes exactly as in the physics texts: + +* on the photon jet algebra the gauge transformations form a group acting by + affine shifts (`Photon.JetAlgebra.gaugeAction_comp`), and the field + strength and the Maxwell term are invariant because the shift of `∂_s A_μ` + is symmetric in the derivative indices — Clairaut's theorem is built into + the multiset indexing (`Photon.JetAlgebra.gaugeAction_fieldStrength`); +* the electron coordinates rotate by the phase and its conjugate, and the + trivial gauge jet acts trivially (`Electron.JetAlgebra.gaugeAction_trivial`); +* the covariant derivative is covariant, `D_μ ψ ↦ ū D_μ ψ`, because the + photon shift `∂_μ χ` cancels the derivative `∂_μ ū = -i e (∂_μ χ) ū` of + the phase (`gaugeAction_covDψ`); +* every charge-neutral fermion bilinear is invariant because the phases of + the electron and its conjugate cancel by unitarity + (`gaugeAction_mul_phase_cancel`); +* the Lagrangian, being built from invariant pieces, is invariant + (`gaugeAction_lagrangian`). + +This file contains no definitions, only theorems about the jet algebras of +`Physlib.Particles.QED.Basic`, the fields of `Physlib.Particles.QED.Fields` and the Lagrangian of +`Physlib.Particles.QED.Lagrangian`. + +## ii. Key results + +- `Photon.JetAlgebra.gaugeAction_comp`, `Photon.JetAlgebra.gaugeAction_zero` : + the photon gauge transformations form a group acting on the photon jet + algebra. +- `Photon.JetAlgebra.gaugeAction_fieldStrength`, + `Photon.JetAlgebra.gaugeAction_maxwellTerm` : gauge invariance of the field + strength and the Maxwell term. +- `Electron.JetAlgebra.gaugeAction_trivial`, `JetAlgebra.gaugeAction_trivial` : + the trivial gauge jet acts trivially. +- `JetAlgebra.gaugeAction_A`, `JetAlgebra.gaugeAction_ψ_zero`, + `JetAlgebra.gaugeAction_ψ_singleton` (and the `barψ` versions) : the action + on the jet coordinates of QED. +- `JetAlgebra.gaugeAction_covDψ`, `JetAlgebra.gaugeAction_covDbarψ` : gauge + covariance of the covariant derivatives. +- `JetAlgebra.gaugeAction_diracKineticTerm`, + `JetAlgebra.gaugeAction_electronMassTerm` : gauge invariance of the terms + of the Lagrangian. +- `JetAlgebra.gaugeAction_lagrangian` : **gauge invariance of the QED + Lagrangian**. + +## iii. Table of contents + +- A. The gauge group acting on the photon jet algebra + - A.1. Gauge invariance of the field strength and the Maxwell term +- B. The trivial gauge jet acts trivially +- C. The action on the jet coordinates of QED + - C.1. The photon coordinates + - C.2. The electron coordinates + - C.3. The field strength and the Maxwell term +- D. Gauge covariance of the covariant derivatives +- E. Gauge invariance of the Lagrangian + - E.1. Cancellation of the phases in fermion bilinears + - E.2. Invariance of each term + - E.3. Invariance of the QED Lagrangian + +## iv. References + +The jet algebras and gauge actions are defined in `Physlib.Particles.QED.Basic`, the +fields in `Physlib.Particles.QED.Fields` and the Lagrangian in +`Physlib.Particles.QED.Lagrangian`. + +-/ + +@[expose] public section + +namespace QED + +open TensorProduct + +namespace Photon + +namespace JetAlgebra + +/-! + +## A. The gauge group acting on the photon jet algebra + +-/ + +/-- Photon gauge jets compose by addition: the gauge transformations form a + group acting on the photon jet algebra. -/ +theorem gaugeAction_comp (c₁ c₂ : GaugeJet) : + (gaugeAction c₁).comp (gaugeAction c₂) = gaugeAction (c₁ + c₂) := by + refine MvPolynomial.algHom_ext fun j => ?_ + obtain ⟨s, μ⟩ := j + rw [AlgHom.comp_apply] + show gaugeAction c₁ (gaugeAction c₂ (coord s μ)) = gaugeAction (c₁ + c₂) (coord s μ) + rw [gaugeAction_coord, gaugeAction_coord, map_add, gaugeAction_coord, gaugeAction_C, + add_assoc, ← MvPolynomial.C_add] + rfl + +@[simp] +theorem gaugeAction_zero : gaugeAction 0 = AlgHom.id ℝ JetAlgebra := by + refine MvPolynomial.algHom_ext fun j => ?_ + obtain ⟨s, μ⟩ := j + show gaugeAction 0 (coord s μ) = coord s μ + simp + +/-! + +### A.1. Gauge invariance of the field strength and the Maxwell term + +The field strength is gauge invariant, and the reason is exactly that +multiset addition is commutative: the two shifts are `∂_s ∂_μ ∂_ν χ` and +`∂_s ∂_ν ∂_μ χ`, indexed by `s + {μ} + {ν}` and `s + {ν} + {μ}`. Clairaut's +theorem is built into the indexing. + +-/ + +@[simp] +theorem gaugeAction_fieldStrength (c : GaugeJet) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + gaugeAction c (fieldStrength s μ ν) = fieldStrength s μ ν := by + have hcomm : s + {μ} + {ν} = s + {ν} + {μ} := by + rw [add_assoc, add_assoc, add_comm ({μ} : Multiset _)] + rw [fieldStrength, map_sub, gaugeAction_coord, gaugeAction_coord, hcomm] + ring + +@[simp] +theorem gaugeAction_maxwellTerm (c : GaugeJet) : gaugeAction c maxwellTerm = maxwellTerm := by + rw [maxwellTerm, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul, map_mul, gaugeAction_fieldStrength] + +end JetAlgebra + +end Photon + +/-! + +## B. The trivial gauge jet acts trivially + +The key combinatorial fact: in the Leibniz sum over the antidiagonal of `t`, +the splitting `(0, t)` occurs exactly once, so an indicator supported at the +zero multiset picks out the identity. + +-/ + +namespace Electron + +namespace JetAlgebra + +/-- The trivial gauge jet acts trivially on the electron jet algebra: the + gauge action is unital. -/ +theorem gaugeAction_trivial (e : ℝ) : + gaugeAction (GaugeJet.trivial e) = AlgHom.id ℂ JetAlgebra := by + refine ExteriorAlgebra.hom_ext (Finsupp.lhom_ext fun j b => ?_) + simp only [LinearMap.coe_comp, Function.comp_apply, AlgHom.toLinearMap_apply, + AlgHom.coe_id, id_eq] + rw [← Finsupp.smul_single_one, map_smul, map_smul] + congr 1 + show gaugeAction (GaugeJet.trivial e) (ofGenerator j) = ofGenerator j + cases j with + | dψ t α => + rw [gaugeAction_ofGenerator_dψ, + show (t.antidiagonal.map fun p => + star ((GaugeJet.trivial e).phase p.1) • ofGenerator (.dψ p.2 α)) = + t.antidiagonal.map fun p => + if p.1 = 0 then ofGenerator (.dψ p.2 α) else 0 from + Multiset.map_congr rfl fun p _ => by + by_cases h : p.1 = 0 <;> simp [GaugeJet.trivial, h], + sum_map_antidiagonal_ite t fun u => ofGenerator (.dψ u α)] + | dbarψ t α => + rw [gaugeAction_ofGenerator_dbarψ, + show (t.antidiagonal.map fun p => + (GaugeJet.trivial e).phase p.1 • ofGenerator (.dbarψ p.2 α)) = + t.antidiagonal.map fun p => + if p.1 = 0 then ofGenerator (.dbarψ p.2 α) else 0 from + Multiset.map_congr rfl fun p _ => by + by_cases h : p.1 = 0 <;> simp [GaugeJet.trivial, h], + sum_map_antidiagonal_ite t fun u => ofGenerator (.dbarψ u α)] + +end JetAlgebra + +end Electron + +namespace JetAlgebra + +/-- The trivial gauge jet acts trivially on the QED jet algebra: the gauge + action is unital. -/ +theorem gaugeAction_trivial (e : ℝ) : + gaugeAction (GaugeJet.trivial e) = AlgHom.id ℂ JetAlgebra := by + have hP : gaugeActionPhoton (GaugeJet.trivial e).χjet = + AlgHom.id ℂ (ℂ ⊗[ℝ] Photon.JetAlgebra) := by + rw [show (GaugeJet.trivial e).χjet = 0 from rfl, gaugeActionPhoton, + Photon.JetAlgebra.gaugeAction_zero, Algebra.TensorProduct.map_id] + simp only [gaugeAction, hP, Electron.JetAlgebra.gaugeAction_trivial] + exact Algebra.TensorProduct.map_id + +/-- The electron gauge actions compose through the monoid of gauge jets. -/ +theorem _root_.QED.Electron.JetAlgebra.gaugeAction_mul {e : ℝ} (g₁ g₂ : GaugeJet e) : + (Electron.JetAlgebra.gaugeAction g₁).comp (Electron.JetAlgebra.gaugeAction g₂) = + Electron.JetAlgebra.gaugeAction (g₁ * g₂) := by + refine ExteriorAlgebra.hom_ext (Finsupp.lhom_ext fun j b => ?_) + simp only [LinearMap.coe_comp, Function.comp_apply, AlgHom.toLinearMap_apply, + AlgHom.comp_apply] + rw [← Finsupp.smul_single_one, map_smul, map_smul, map_smul, map_smul] + congr 1 + show Electron.JetAlgebra.gaugeAction g₁ (Electron.JetAlgebra.gaugeAction g₂ + (Electron.JetAlgebra.ofGenerator j)) = + Electron.JetAlgebra.gaugeAction (g₁ * g₂) (Electron.JetAlgebra.ofGenerator j) + cases j with + | dψ t α => + rw [Electron.JetAlgebra.gaugeAction_ofGenerator_dψ, + show (t.antidiagonal.map fun p => star (g₂.phase p.1) • + Electron.JetAlgebra.ofGenerator (.dψ p.2 α)).sum = + phaseAct (fun x => star (g₂.phase x)) + (fun t' => Electron.JetAlgebra.ofGenerator (.dψ t' α)) t from rfl, + show Electron.JetAlgebra.gaugeAction g₁ (phaseAct (fun x => star (g₂.phase x)) + (fun t' => Electron.JetAlgebra.ofGenerator (.dψ t' α)) t) = + phaseAct (fun x => star (g₂.phase x)) + (fun t' => Electron.JetAlgebra.gaugeAction g₁ + (Electron.JetAlgebra.ofGenerator (.dψ t' α))) t from + map_phaseAct _ _ (Electron.JetAlgebra.gaugeAction g₁).toLinearMap t, + show (fun t' => Electron.JetAlgebra.gaugeAction g₁ + (Electron.JetAlgebra.ofGenerator (.dψ t' α))) = + fun t' => phaseAct (fun x => star (g₁.phase x)) + (fun t'' => Electron.JetAlgebra.ofGenerator (.dψ t'' α)) t' from + funext fun t' => Electron.JetAlgebra.gaugeAction_ofGenerator_dψ g₁ t' α, + phaseAct_assoc, Electron.JetAlgebra.gaugeAction_ofGenerator_dψ, + show (t.antidiagonal.map fun p => star ((g₁ * g₂).phase p.1) • + Electron.JetAlgebra.ofGenerator (.dψ p.2 α)).sum = + phaseAct (fun x => star ((g₁ * g₂).phase x)) + (fun t' => Electron.JetAlgebra.ofGenerator (.dψ t' α)) t from rfl] + refine congrFun (congrArg (fun w => phaseAct w + (fun t' => Electron.JetAlgebra.ofGenerator (.dψ t' α))) (funext fun x => ?_)) t + rw [GaugeJet.mul_phase, star_phaseAct, phaseAct_comm] + | dbarψ t α => + rw [Electron.JetAlgebra.gaugeAction_ofGenerator_dbarψ, + show (t.antidiagonal.map fun p => g₂.phase p.1 • + Electron.JetAlgebra.ofGenerator (.dbarψ p.2 α)).sum = + phaseAct g₂.phase + (fun t' => Electron.JetAlgebra.ofGenerator (.dbarψ t' α)) t from rfl, + show Electron.JetAlgebra.gaugeAction g₁ (phaseAct g₂.phase + (fun t' => Electron.JetAlgebra.ofGenerator (.dbarψ t' α)) t) = + phaseAct g₂.phase + (fun t' => Electron.JetAlgebra.gaugeAction g₁ + (Electron.JetAlgebra.ofGenerator (.dbarψ t' α))) t from + map_phaseAct _ _ (Electron.JetAlgebra.gaugeAction g₁).toLinearMap t, + show (fun t' => Electron.JetAlgebra.gaugeAction g₁ + (Electron.JetAlgebra.ofGenerator (.dbarψ t' α))) = + fun t' => phaseAct g₁.phase + (fun t'' => Electron.JetAlgebra.ofGenerator (.dbarψ t'' α)) t' from + funext fun t' => Electron.JetAlgebra.gaugeAction_ofGenerator_dbarψ g₁ t' α, + phaseAct_assoc, Electron.JetAlgebra.gaugeAction_ofGenerator_dbarψ, + show (t.antidiagonal.map fun p => (g₁ * g₂).phase p.1 • + Electron.JetAlgebra.ofGenerator (.dbarψ p.2 α)).sum = + phaseAct ((g₁ * g₂).phase) + (fun t' => Electron.JetAlgebra.ofGenerator (.dbarψ t' α)) t from rfl] + refine congrFun (congrArg (fun w => phaseAct w + (fun t' => Electron.JetAlgebra.ofGenerator (.dbarψ t' α))) (funext fun x => ?_)) t + rw [GaugeJet.mul_phase, phaseAct_comm] + +/-- The complexified photon gauge actions compose by addition of the gauge + jets. -/ +theorem gaugeActionPhoton_comp (c₁ c₂ : Photon.JetAlgebra.GaugeJet) : + (gaugeActionPhoton c₁).comp (gaugeActionPhoton c₂) = + gaugeActionPhoton (c₁ + c₂) := by + rw [gaugeActionPhoton, gaugeActionPhoton, gaugeActionPhoton, + ← Algebra.TensorProduct.map_comp, AlgHom.comp_id, + Photon.JetAlgebra.gaugeAction_comp] + +/-- **The gauge actions compose through the monoid of gauge jets**: the QED + gauge action is a monoid action on the jet algebra. -/ +theorem gaugeAction_mul {e : ℝ} (g₁ g₂ : GaugeJet e) : + (gaugeAction g₁).comp (gaugeAction g₂) = gaugeAction (g₁ * g₂) := by + simp only [gaugeAction, GaugeJet.mul_χjet] + rw [← gaugeActionPhoton_comp, ← Electron.JetAlgebra.gaugeAction_mul] + exact (Algebra.TensorProduct.map_comp _ _ _ _).symm + +theorem gaugeAction_mul_apply {e : ℝ} (g₁ g₂ : GaugeJet e) (x : JetAlgebra) : + gaugeAction (g₁ * g₂) x = gaugeAction g₁ (gaugeAction g₂ x) := + (DFunLike.congr_fun (gaugeAction_mul g₁ g₂) x).symm + +/-! + +## C. The action on the jet coordinates of QED + +### C.1. The photon coordinates + +The photon coordinate shifts by a *constant* of the jet algebra, the jet +`∂_s ∂_μ χ` of the gauge function; in the full algebra the constant is the +scalar multiple `(∂_s ∂_μ χ) • 1`. + +-/ + +/-- The gauge action on the photon jet coordinate: the affine shift + `∂_s A_μ ↦ ∂_s A_μ + ∂_s ∂_μ χ`. -/ +theorem gaugeAction_A {e : ℝ} (g : GaugeJet e) (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) : + gaugeAction g (A s μ) = A s μ + (g.χjet (s + {μ}) : ℂ) • 1 := by + simp only [A] + rw [gaugeAction_tmul, map_one, gaugeActionPhoton_tmul, + Photon.JetAlgebra.gaugeAction_coord, TensorProduct.tmul_add, add_tmul, + tmul_C_eq_smul_one] + +/-! + +### C.2. The electron coordinates + +The electron (charge `-1`) rotates by the conjugate phase, its conjugate +(charge `+1`) by the phase; on first-order jets the Leibniz rule feeds the +first derivative of the phase into the zeroth-order coordinate. + +-/ + +@[simp] +theorem gaugeAction_ψ_zero {e : ℝ} (g : GaugeJet e) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ψ 0 α) = star (g.phase 0) • ψ 0 α := by + simp only [ψ] + rw [gaugeAction_tmul, map_one, + Electron.JetAlgebra.gaugeAction_ofGenerator_dψ_zero, tmul_smul] + +@[simp] +theorem gaugeAction_barψ_zero {e : ℝ} (g : GaugeJet e) (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (barψ 0 α) = g.phase 0 • barψ 0 α := by + simp only [barψ] + rw [gaugeAction_tmul, map_one, + Electron.JetAlgebra.gaugeAction_ofGenerator_dbarψ_zero, tmul_smul] + +theorem gaugeAction_ψ_singleton {e : ℝ} (g : GaugeJet e) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (ψ {μ} α) = + star (g.phase 0) • ψ {μ} α + star (g.phase {μ}) • ψ 0 α := by + simp only [ψ] + rw [gaugeAction_tmul, map_one, + Electron.JetAlgebra.gaugeAction_ofGenerator_dψ_singleton, tmul_add, + tmul_smul, tmul_smul] + +theorem gaugeAction_barψ_singleton {e : ℝ} (g : GaugeJet e) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (barψ {μ} α) = + g.phase 0 • barψ {μ} α + g.phase {μ} • barψ 0 α := by + simp only [barψ] + rw [gaugeAction_tmul, map_one, + Electron.JetAlgebra.gaugeAction_ofGenerator_dbarψ_singleton, tmul_add, + tmul_smul, tmul_smul] + +/-! + +### C.3. The field strength and the Maxwell term + +Both invariances are inherited from the photon jet algebra, where the proof +is the commutativity of multiset addition. + +-/ + +@[simp] +theorem gaugeAction_fieldStrength {e : ℝ} (g : GaugeJet e) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + gaugeAction g (fieldStrength s μ ν) = fieldStrength s μ ν := by + simp only [fieldStrength] + rw [gaugeAction_tmul, map_one, gaugeActionPhoton_tmul, + Photon.JetAlgebra.gaugeAction_fieldStrength] + +@[simp] +theorem gaugeAction_maxwellTerm {e : ℝ} (g : GaugeJet e) : + gaugeAction g maxwellTerm = maxwellTerm := by + simp only [maxwellTerm] + rw [gaugeAction_tmul, map_one, gaugeActionPhoton_tmul, + Photon.JetAlgebra.gaugeAction_maxwellTerm] + +/-! + +## D. Gauge covariance of the covariant derivatives + +Under a gauge transformation the photon coordinate shifts by `∂_μ χ` while +the first-order electron coordinate picks up the derivative +`∂_μ ū = -i e (∂_μ χ) ū` of the phase by the Leibniz rule; the two +contributions cancel and the covariant derivative rotates like the field +itself. + +-/ + +/-- **Gauge covariance of the covariant derivative**: `D_μ ψ` rotates by the + conjugate phase, exactly like `ψ` itself. The shift of the photon + coordinate cancels the derivative of the phase. -/ +theorem gaugeAction_covDψ {e : ℝ} (g : GaugeJet e) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (covDψ e μ α) = star (g.phase 0) • covDψ e μ α := by + rw [covDψ, map_add, map_smul, map_mul, gaugeAction_ψ_singleton, + gaugeAction_ψ_zero, gaugeAction_A, g.star_phase_singleton μ, + show (0 : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = {μ} from zero_add _] + simp only [add_mul, smul_mul_assoc, one_mul, mul_smul_comm, smul_add, + smul_smul, neg_smul] + module + +/-- Gauge covariance of the conjugate covariant derivative: `D_μ ψ̄` rotates + by the phase, exactly like `ψ̄` itself. -/ +theorem gaugeAction_covDbarψ {e : ℝ} (g : GaugeJet e) (μ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + gaugeAction g (covDbarψ e μ α) = g.phase 0 • covDbarψ e μ α := by + rw [covDbarψ, map_sub, map_smul, map_mul, gaugeAction_barψ_singleton, + gaugeAction_barψ_zero, gaugeAction_A, g.phase_singleton μ, + show (0 : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = {μ} from zero_add _] + simp only [add_mul, smul_mul_assoc, one_mul, mul_smul_comm, smul_add, + smul_sub, smul_smul] + module + +/-! + +## E. Gauge invariance of the Lagrangian + +### E.1. Cancellation of the phases in fermion bilinears + +-/ + +/-- A product of a factor rotating by the phase and a factor rotating by the + conjugate phase is gauge invariant: the phases cancel by unitarity. This is + the reason every charge-neutral fermion bilinear of QED is gauge + invariant. -/ +theorem gaugeAction_mul_phase_cancel {e : ℝ} (g : GaugeJet e) {x y : JetAlgebra} + (hx : gaugeAction g x = g.phase 0 • x) + (hy : gaugeAction g y = star (g.phase 0) • y) : + gaugeAction g (x * y) = x * y := by + rw [map_mul, hx, hy, smul_mul_smul_comm, g.phase_zero_unitary, one_smul] + +/-! + +### E.2. Invariance of each term + +-/ + +@[simp] +theorem gaugeAction_diracKineticTerm {e : ℝ} (g : GaugeJet e) : + gaugeAction g (diracKineticTerm e) = diracKineticTerm e := by + rw [diracKineticTerm, map_smul, map_sum] + congr 1 + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, + gaugeAction_mul_phase_cancel g (gaugeAction_barψ_zero g α) + (gaugeAction_covDψ g μ β)] + +@[simp] +theorem gaugeAction_diracKineticTermBar {e : ℝ} (g : GaugeJet e) : + gaugeAction g (diracKineticTermBar e) = diracKineticTermBar e := by + rw [diracKineticTermBar, map_smul, map_sum] + congr 1 + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, + gaugeAction_mul_phase_cancel g (gaugeAction_covDbarψ g μ α) + (gaugeAction_ψ_zero g β)] + +@[simp] +theorem gaugeAction_electronMassTerm {e : ℝ} (g : GaugeJet e) : + gaugeAction g electronMassTerm = electronMassTerm := by + rw [electronMassTerm, map_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, + gaugeAction_mul_phase_cancel g (gaugeAction_barψ_zero g α) + (gaugeAction_ψ_zero g β)] + +/-! + +### E.3. Invariance of the QED Lagrangian + +-/ + +/-- **Gauge invariance of the QED Lagrangian.** The Maxwell term is invariant + by the symmetry of the photon shift in its derivative indices, the kinetic + term by the covariance of the covariant derivative, and the mass term by the + unitarity of the phase. -/ +theorem gaugeAction_lagrangian {e : ℝ} (g : GaugeJet e) (m : ℝ) : + gaugeAction g (lagrangian e m) = lagrangian e m := by + rw [lagrangian, map_sub, map_add, map_smul, map_smul, gaugeAction_maxwellTerm, + gaugeAction_diracKineticTerm, gaugeAction_electronMassTerm] + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/JetCompleteness.lean b/Physlib/Particles/QED/JetCompleteness.lean new file mode 100644 index 000000000..1b51540d2 --- /dev/null +++ b/Physlib/Particles/QED/JetCompleteness.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.GaugeInvariance +public import Physlib.Mathematics.MvPolynomialTranslation +/-! +# Completeness of the field strength for gauge invariance + +## i. Overview + +The classification of the gauge invariants of the photon jet algebra: +**an element of the photon jet algebra is invariant under every gauge +transformation if and only if it is a polynomial in the derivatives +`∂_s F_{μν}` of the field strength** — +`gaugeInvariant_iff_mem_adjoin_fieldStrength`. + +One direction is the gauge invariance of the field strength. For the other, +the gauge action translates all jet coordinates with the same symmetrized +index class `s + {μ}` by a common arbitrary amount, so an invariant is a +polynomial in differences of same-class coordinates +(`MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq`), and every +such difference is a derivative of the field strength. + +This is the abelian counterpart of the fixed-algebra theorems of +`Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness`. + +This file contains no definitions, only theorems about the jet algebras of +`Physlib.Particles.QED.Basic`. + +## ii. Key results + +- `Photon.JetAlgebra.gaugeInvariant_iff_mem_adjoin_fieldStrength` : **the + gauge invariants of the photon jet algebra are exactly the polynomials in + the derivatives of the field strength**. + +## iii. Table of contents + +- A. The symmetrized-index class projection +- B. Differences of same-class coordinates are field strengths +- C. The completeness theorem + +## iv. References + +The class projection is defined in `Physlib.Particles.QED.Basic`; the +translation-invariance engine is `Physlib.Mathematics.MvPolynomialTranslation`; +the non-abelian analogue is +`Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness`. + +-/ + +@[expose] public section + +/-! TODO: Classify the gauge- and Lorentz-invariant elements of mass dimension at most four of -/ +/-! TODO: the full QED jet algebra: the analogue for the Dirac electron of the classification -/ +/-! TODO: `LeptonGaugeSector.JetAlgebra.MassDimFour.Classification`, showing the QED Lagrangian -/ +/-! TODO: is the most general renormalizable choice. -/ + +namespace QED + +namespace Photon + +open MvPolynomial + +/-! + +## A. The symmetrized-index class projection + +-/ + +namespace JetGenerators + +lemma indexClass_dA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + (JetGenerators.dA s μ).indexClass = s + {μ} := rfl + +lemma indexClass_ne_zero (j : JetGenerators) : j.indexClass ≠ 0 := by + obtain ⟨s, μ⟩ := j + rw [indexClass_dA] + intro h + have := congrArg Multiset.card h + simp at this + +/-- Erasing the class representative and putting it back as the Lorentz index + preserves the class. -/ +lemma indexClass_classProj (j : JetGenerators) : + j.classProj.indexClass = j.indexClass := by + rw [classProj, indexClass_dA, Multiset.add_comm, Multiset.singleton_add, + Multiset.cons_erase (classRep_mem (indexClass_ne_zero j))] + +/-- The class projection is idempotent. -/ +lemma classProj_idem (j : JetGenerators) : j.classProj.classProj = j.classProj := by + conv_lhs => rw [classProj] + rw [indexClass_classProj] + rfl + +/-- Two jet coordinates have the same class projection exactly when they lie + in the same symmetrized-index class. -/ +lemma classProj_eq_classProj_iff (j j' : JetGenerators) : + j.classProj = j'.classProj ↔ j.indexClass = j'.indexClass := by + constructor + · intro h + rw [← indexClass_classProj j, ← indexClass_classProj j', h] + · intro h + rw [classProj, classProj, h] + +end JetGenerators + +namespace JetAlgebra + +/-! + +## B. Differences of same-class coordinates are field strengths + +-/ + +/-- A jet coordinate minus the canonical coordinate of its class is a + derivative of the field strength. -/ +lemma coord_sub_classProj (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (h : (JetGenerators.dA s μ).classProj ≠ JetGenerators.dA s μ) : + (X (JetGenerators.dA s μ) : JetAlgebra) - X ((JetGenerators.dA s μ).classProj) = + fieldStrength (s.erase (classRep (s + {μ}))) (classRep (s + {μ})) μ := by + set r := classRep (s + {μ}) with hr + have hrs : r ∈ s := by + have hmem : r ∈ s + {μ} := + classRep_mem (JetGenerators.indexClass_ne_zero (.dA s μ)) + rcases Multiset.mem_add.mp hmem with hmem | hmem + · exact hmem + · exfalso + refine h ?_ + rw [Multiset.mem_singleton] at hmem + rw [JetGenerators.classProj, JetGenerators.indexClass_dA, ← hr, hmem, + show (s + {μ}).erase μ = s from by + rw [Multiset.add_comm, Multiset.singleton_add, Multiset.erase_cons_head]] + have h1 : s.erase r + {r} = s := by + rw [Multiset.add_comm, Multiset.singleton_add, Multiset.cons_erase hrs] + have h2 : s.erase r + {μ} = (s + {μ}).erase r := by + rw [Multiset.erase_add_left_pos _ hrs] + rw [fieldStrength, h1, h2, JetGenerators.classProj, JetGenerators.indexClass_dA] + rfl + +/-- Every field-strength jet lies in the range of the field-strength family. -/ +lemma fieldStrength_mem_range (t : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength t μ ν ∈ Set.range (fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrength p.1 p.2.1 p.2.2) := + ⟨⟨t, μ, ν⟩, rfl⟩ + +/-! + +## C. The completeness theorem + +-/ + +set_option maxHeartbeats 1600000 in +/-- **Completeness of the field strength for gauge invariance**: an element of + the photon jet algebra is invariant under every gauge transformation if and + only if it is a polynomial in the derivatives `∂_s F_{μν}` of the field + strength. The field strength does not just provide *some* gauge invariants + — it generates *all* of them. -/ +theorem gaugeInvariant_iff_mem_adjoin_fieldStrength (x : JetAlgebra) : + (∀ c : GaugeJet, gaugeAction c x = x) ↔ + x ∈ Algebra.adjoin ℝ (Set.range fun p : + Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => + fieldStrength p.1 p.2.1 p.2.2) := by + constructor + · intro hx + have key := MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq + (R := ℝ) (I := JetGenerators) JetGenerators.classProj + JetGenerators.classProj_idem x ?_ + · refine Algebra.adjoin_le ?_ key + rintro y ⟨j, rfl⟩ + obtain ⟨s, μ⟩ := j + show (X (JetGenerators.dA s μ) : JetAlgebra) - + X (JetGenerators.dA s μ).classProj ∈ _ + rcases eq_or_ne (JetGenerators.dA s μ).classProj (JetGenerators.dA s μ) with + hproj | hproj + · rw [hproj, sub_self] + exact Subalgebra.zero_mem _ + · rw [coord_sub_classProj s μ hproj] + exact Algebra.subset_adjoin (fieldStrength_mem_range _ _ _) + · intro i₀ r + obtain ⟨s₀, μ₀⟩ := i₀ + have hfun : (fun i => (X i : JetAlgebra) + + C (if i.classProj = (JetGenerators.dA s₀ μ₀).classProj then r else 0)) = + fun j => match j with + | JetGenerators.dA s μ => coord s μ + + C ((fun t => if t = s₀ + {μ₀} then r else 0) (s + {μ})) := by + funext j + obtain ⟨s, μ⟩ := j + show (X (JetGenerators.dA s μ) : JetAlgebra) + _ = coord s μ + _ + rw [coord] + congr 1 + exact congrArg C (if_congr (Iff.trans + (JetGenerators.classProj_eq_classProj_iff _ _) + (by rw [JetGenerators.indexClass_dA, JetGenerators.indexClass_dA])) rfl rfl) + rw [congrArg MvPolynomial.aeval hfun] + exact hx fun t => if t = s₀ + {μ₀} then r else 0 + · intro hx c + refine Algebra.adjoin_induction ?_ ?_ ?_ ?_ hx + · rintro y ⟨⟨s, μ, ν⟩, rfl⟩ + exact gaugeAction_fieldStrength c s μ ν + · intro a + exact (gaugeAction c).commutes a + · intro a b _ _ ha hb + rw [map_add, ha, hb] + · intro a b _ _ ha hb + rw [map_mul, ha, hb] + +end JetAlgebra + +end Photon + +end QED diff --git a/Physlib/Particles/QED/Lagrangian.lean b/Physlib/Particles/QED/Lagrangian.lean new file mode 100644 index 000000000..132521b9a --- /dev/null +++ b/Physlib/Particles/QED/Lagrangian.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Fields +/-! +# The QED Lagrangian + +## i. Overview + +The Lagrangian of quantum electrodynamics as an element of the QED jet +algebra: + +`L = - 1/4 F_{μν} F^{μν} + i ψ̄ γ^μ D_μ ψ - m ψ̄ ψ`, + +with `D_μ ψ = ∂_μ ψ + i e A_μ ψ` the covariant derivative of the electron +(electric charge `-1`) and the γ matrices taken in the chiral (Weyl) +representation. Here `ψ̄` denotes the conjugate jet coordinates `ψ†`; the +`γ⁰` of `ψ̄ = ψ† γ⁰` is kept explicitly in the contraction matrices +`γ⁰ γ^μ` and `γ⁰`. + +This file contains only definitions; the gauge invariance of every term and +of the full Lagrangian is proved in `Physlib.Particles.QED.GaugeInvariance`. + +## ii. Key results + +- `JetAlgebra.diracKineticTerm`, `JetAlgebra.diracKineticTermBar` : the Dirac + kinetic terms `i ψ̄ γ^μ D_μ ψ` and `-i (D_μ ψ̄) γ⁰ γ^μ ψ`. +- `JetAlgebra.electronMassTerm` : the Dirac mass term `ψ̄ ψ`. +- `JetAlgebra.diracCurrent` : the Dirac current `J^μ = ψ̄ γ^μ ψ`. +- `JetAlgebra.lagrangian` : the QED Lagrangian. + +## iii. Table of contents + +- A. The Dirac kinetic terms and the mass term +- B. The QED Lagrangian + +## iv. References + +The fields are defined in `Physlib.Particles.QED.Fields`; gauge invariance is proved in +`Physlib.Particles.QED.GaugeInvariance`. + +-/ + +@[expose] public section + +namespace QED + +open minkowskiMatrix + +namespace JetAlgebra + +/-! + +## A. The Dirac kinetic terms and the mass term + +-/ + +/-- The Dirac kinetic term `i ψ̄ γ^μ D_μ ψ = i ψ†_α (γ⁰ γ^μ)_{αβ} (D_μ ψ)_β` + of the electron. -/ +noncomputable def diracKineticTerm (e : ℝ) : JetAlgebra := + Complex.I • ∑ μ, ∑ α, ∑ β, kineticGamma μ α β • (barψ 0 α * covDψ e μ β) + +/-- The conjugate Dirac kinetic term + `-i (D_μ ψ̄) γ⁰ γ^μ ψ = -i (D_μ ψ̄)_α (γ⁰ γ^μ)_{αβ} ψ_β`; the hermitian form + of the kinetic term is the average of `diracKineticTerm` and this term. -/ +noncomputable def diracKineticTermBar (e : ℝ) : JetAlgebra := + (-Complex.I) • ∑ μ, ∑ α, ∑ β, kineticGamma μ α β • (covDbarψ e μ α * ψ 0 β) + +/-- The Dirac mass term `ψ̄ ψ = ψ†_α (γ⁰)_{αβ} ψ_β` of the electron. This is + the dimension-three term available because the electron is a Dirac fermion: + its two Weyl components have the same electric charge, so the bilinear + pairing them against the conjugate components is charge neutral. -/ +noncomputable def electronMassTerm : JetAlgebra := + ∑ α, ∑ β, gammaMatrix (Sum.inl 0) α β • (barψ 0 α * ψ 0 β) + +/-- The Dirac current `J^μ = ψ̄ γ^μ ψ = ψ†_α (γ⁰ γ^μ)_{αβ} ψ_β` of the + electron: the Noether current of the `U(1)_em` phase symmetry. Its coupling + `- e J^μ A_μ` to the photon is the entire interaction of QED — this is the + jet-algebra counterpart of the current coupling of + `Physlib.Electromagnetism.Dynamics`; see `Physlib.Particles.QED.CurrentCoupling`. -/ +noncomputable def diracCurrent (μ : Fin 1 ⊕ Fin 3) : JetAlgebra := + ∑ α, ∑ β, kineticGamma μ α β • (barψ 0 α * ψ 0 β) + +/-! + +## B. The QED Lagrangian + +-/ + +/-! + +## B'. The equations of motion + +The Euler–Lagrange equations of the QED Lagrangian, as elements of the jet +algebra whose vanishing expresses the equations of motion. Deriving them +*variationally* from `lagrangian` requires a variational calculus on the jet +algebra, which is future work; here they are definitions, and +`Physlib.Particles.QED.CurrentCoupling` proves the Noether identity that the +divergence of the Dirac current is a combination of them. + +-/ + +/-- The Dirac-equation element `γ⁰ (i γ^μ D_μ - m) ψ`, row `α`: its vanishing + is the interacting Dirac equation. -/ +noncomputable def diracEquation (e m : ℝ) (α : Fin 2 ⊕ Fin 2) : JetAlgebra := + Complex.I • ∑ μ, ∑ β, kineticGamma μ α β • covDψ e μ β - + (m : ℂ) • ∑ β, gammaMatrix (Sum.inl 0) α β • ψ 0 β + +/-- The adjoint Dirac-equation element `i (D_μ ψ̄) γ⁰ γ^μ + m ψ̄ γ⁰`, + column `β`: its vanishing is the interacting adjoint Dirac equation. -/ +noncomputable def diracAdjEquation (e m : ℝ) (β : Fin 2 ⊕ Fin 2) : JetAlgebra := + Complex.I • ∑ μ, ∑ α, kineticGamma μ α β • covDbarψ e μ α + + (m : ℂ) • ∑ α, gammaMatrix (Sum.inl 0) α β • barψ 0 α + +/-! TODO: Derive `diracEquation`, `diracAdjEquation` and `qedMaxwellEquation` variationally: -/ +/-! TODO: define the Euler–Lagrange operator on the jet algebra (the variational derivative -/ +/-! TODO: with respect to each jet coordinate) and prove they are the EL equations of -/ +/-! TODO: `lagrangian`, following `Physlib.Electromagnetism.Dynamics.IsExtrema` concretely. -/ +/-! TODO: Define the theta term `θ ε^{μνρσ} F_{μν} F_{ρσ}` and prove it is gauge invariant and -/ +/-! TODO: a total derivative for `jetDeriv`, as in the lepton–gauge sector's theta term. -/ +/-! TODO: Quantize: instantiate the field species of `Physlib.QFT.PerturbationTheory` with the -/ +/-! TODO: photon and electron of this file, towards the Feynman rules of QED. -/ + +/-- The QED Maxwell-equation element `∂_μ F^{μν} - e J^ν`: its vanishing is + the inhomogeneous Maxwell equation sourced by the Dirac current. -/ +noncomputable def qedMaxwellEquation (e : ℝ) (ν : Fin 1 ⊕ Fin 3) : JetAlgebra := + (∑ μ, ((η μ μ * η ν ν : ℝ) : ℂ) • fieldStrength {μ} μ ν) - + (e : ℂ) • diracCurrent ν + +/-- The QED Lagrangian + `L = - 1/4 F_{μν} F^{μν} + i ψ̄ γ^μ D_μ ψ - m ψ̄ ψ` + with electric coupling `e` and electron mass `m`, as an element of the QED + jet algebra. Evaluated on an honest electromagnetic potential, the first + term is the Maxwell Lagrangian of `Physlib.Electromagnetism`; see + `Physlib.Particles.QED.Evaluation`. -/ +noncomputable def lagrangian (e m : ℝ) : JetAlgebra := + (-(1 : ℂ)/4) • maxwellTerm + diracKineticTerm e - (m : ℂ) • electronMassTerm + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/LorentzInvariance.lean b/Physlib/Particles/QED/LorentzInvariance.lean new file mode 100644 index 000000000..5df57c309 --- /dev/null +++ b/Physlib/Particles/QED/LorentzInvariance.lean @@ -0,0 +1,606 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Lagrangian +public import Physlib.Particles.QED.GammaMatrices +/-! +# Lorentz invariance of quantum electrodynamics + +## i. Overview + +The Lorentz-theoretic theorems of QED, culminating in the Lorentz invariance +of the QED Lagrangian, `lorentzAction_lagrangian`. The chain of results: + +* the covering map `Lorentz.SL2C.toLorentzGroup` intertwines the conjugation + of the covariant Pauli matrices with the Lorentz transformation of their + index; combined with the defining property `Λ η Λᵀ = η` of the Lorentz + group this yields the two contraction identities of the spinor + representation (`sum_lorentz_inv_conjTranspose_pauli_conj` and + `sum_lorentz_inv_eta_pauli_conj`), which assemble block-diagonally into + the contraction identity of the kinetic matrices `γ⁰ γ^μ` + (`sum_kineticGamma_contraction`); +* the jet coordinates of QED transform as tensors and spinors + (`lorentzAction_A_zero`, `lorentzAction_ψ_singleton`, …), and the covariant + derivative transforms exactly like the first-order jet + (`lorentzAction_covDψ`); +* the Maxwell term is invariant because `Λ⁻¹ η (Λ⁻¹)ᵀ = η` + (`Photon.JetAlgebra.lorentzAction_maxwellTerm`), the mass term because the + spinor representation preserves `γ⁰` + (`spinorRep_conjTranspose_gammaZero_spinorRep`), and the kinetic term by + the contraction identity; +* the Lagrangian, being built from invariant pieces, is invariant + (`lorentzAction_lagrangian`). + +This file contains no definitions, only theorems about the jet algebras of +`Physlib.Particles.QED.Basic`, the fields of `Physlib.Particles.QED.Fields` and the Lagrangian of +`Physlib.Particles.QED.Lagrangian`. + +## ii. Key results + +- `sum_kineticGamma_contraction` : the Lorentz contraction identity of the + matrices `γ⁰ γ^μ` under the spinor representation. +- `spinorRep_conjTranspose_gammaZero_spinorRep` : the spinor representation + preserves `γ⁰`. +- `JetAlgebra.lorentzAction_A_zero`, `JetAlgebra.lorentzAction_ψ_zero`, + `JetAlgebra.lorentzAction_ψ_singleton`, … : the transformation laws of the + jet coordinates. +- `JetAlgebra.lorentzAction_covDψ` : Lorentz covariance of the covariant + derivative. +- `Photon.JetAlgebra.lorentzAction_maxwellTerm`, + `JetAlgebra.lorentzAction_maxwellTerm` : Lorentz invariance of the Maxwell + term. +- `JetAlgebra.lorentzAction_electronMassTerm`, + `JetAlgebra.lorentzAction_diracKineticTerm` : Lorentz invariance of the + fermionic terms. +- `JetAlgebra.lorentzAction_lagrangian` : **Lorentz invariance of the QED + Lagrangian**. + +## iii. Table of contents + +- A. Contractions of the Minkowski metric with a Lorentz transformation +- B. The intertwining identities of the spinor representation + - B.1. Conjugation of the covariant Pauli matrices + - B.2. The two block identities + - B.3. The contraction identity of the kinetic matrices + - B.4. The spinor representation preserves `γ⁰` +- C. The transformation laws of the jet coordinates +- D. Lorentz invariance of the Maxwell term +- E. Lorentz covariance of the covariant derivative +- F. Lorentz invariance of the fermionic terms +- G. Lorentz invariance of the QED Lagrangian + +## iv. References + +The Lorentz actions are defined in `Physlib.Particles.QED.Basic`; the corresponding +machinery for the lepton–gauge sector is +`Physlib.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction`. + +-/ + +@[expose] public section + +namespace QED + +open Matrix MatrixGroups minkowskiMatrix TensorProduct +open scoped PauliMatrix + +attribute [-simp] Fintype.sum_sum_type + +/-! + +## A. Contractions of the Minkowski metric with a Lorentz transformation + +-/ + +/-- The defining property of the Lorentz group in index form: contracting two + rows of `Λ⁻¹` with the Minkowski metric reproduces the metric. -/ +lemma sum_eta_inv_inv (Λ : LorentzGroup 3) (τ τ' : Fin 1 ⊕ Fin 3) : + ∑ μ, η μ μ * ((Λ⁻¹).1 τ μ * (Λ⁻¹).1 τ' μ) = η τ τ' := by + have h := congrArg (fun A : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ => A τ τ') + (LorentzGroup.mul_minkowskiMatrix_mul_transpose (Λ := Λ⁻¹)) + simp only [Matrix.mul_apply, Matrix.transpose_apply] at h + rw [← h] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.sum_eq_single μ (fun a _ ha => by rw [off_diag_zero ha, mul_zero]) + (fun h => absurd (Finset.mem_univ μ) h)] + ring + +/-! + +## B. The intertwining identities of the spinor representation + +### B.1. Conjugation of the covariant Pauli matrices + +-/ + +/-- The covariant Pauli matrices are `σ̄^μ = η_{μμ} σ^μ` (no sum). -/ +lemma pauliSelfAdjoint'_coe (μ : Fin 1 ⊕ Fin 3) : + (PauliMatrix.pauliSelfAdjoint' μ).1 = η μ μ • σ μ := by + fin_cases μ <;> simp [PauliMatrix.pauliSelfAdjoint'] + +/-- The kinetic matrices through the covariant Pauli matrices: + `γ⁰ γ^μ = ((σ̄^μ, 0), (0, η_{μμ} σ̄^μ))`. -/ +lemma kineticGamma_eq_fromBlocks_pauliSelfAdjoint' (μ : Fin 1 ⊕ Fin 3) : + JetAlgebra.kineticGamma μ = + Matrix.fromBlocks (PauliMatrix.pauliSelfAdjoint' μ).1 0 0 + (η μ μ • (PauliMatrix.pauliSelfAdjoint' μ).1) := by + rw [JetAlgebra.kineticGamma, pauliSelfAdjoint'_coe, smul_smul, + minkowskiMatrix.η_apply_mul_η_apply_diag, one_smul] + +/-- Conjugating a covariant Pauli matrix by `N : SL(2,ℂ)` transforms its + index by the image of `N` in the Lorentz group; this is the defining + property of the covering map. -/ +lemma sl2c_conj_pauliSelfAdjoint' (N : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + N.1 * (PauliMatrix.pauliSelfAdjoint' μ).1 * N.1ᴴ = + ∑ ν, (Lorentz.SL2C.toLorentzGroup N).1 ν μ • + (PauliMatrix.pauliSelfAdjoint' ν).1 := by + have h := congrArg Subtype.val (Lorentz.SL2C.toSelfAdjointMap_basis (M := N) μ) + simpa only [Lorentz.SL2C.toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', + Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, selfAdjoint.val_smul] using h + +/-- A block matrix summed over the diagonal blocks. -/ +lemma sum_fromBlocks {ι : Type*} (s : Finset ι) + (A : ι → Matrix (Fin 2) (Fin 2) ℂ) (D : ι → Matrix (Fin 2) (Fin 2) ℂ) : + ∑ i ∈ s, Matrix.fromBlocks (A i) 0 0 (D i) = + Matrix.fromBlocks (∑ i ∈ s, A i) 0 0 (∑ i ∈ s, D i) := by + induction s using Finset.cons_induction with + | empty => simp + | cons a s ha ih => + rw [Finset.sum_cons, Finset.sum_cons, Finset.sum_cons, ih, + Matrix.fromBlocks_add, add_zero] + +/-! + +### B.2. The two block identities + +The left Weyl block: transporting the index of `σ̄^μ` with `Λ(M)⁻¹` cancels +the conjugation by `M`, through `Λ(M†) = Λ(M)ᵀ`. + +-/ + +lemma sum_lorentz_inv_conjTranspose_pauli_conj (M : SL(2,ℂ)) (τ : Fin 1 ⊕ Fin 3) : + ∑ μ, ((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ • + (M.1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * M.1) = + (PauliMatrix.pauliSelfAdjoint' τ).1 := by + have hdet : Matrix.det (M.1ᴴ) = 1 := by + rw [Matrix.det_conjTranspose, Matrix.SpecialLinearGroup.det_coe] + exact star_one ℂ + have hswap : ∀ μ, M.1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * M.1 = + ∑ ν, (Lorentz.SL2C.toLorentzGroup M).1 μ ν • + (PauliMatrix.pauliSelfAdjoint' ν).1 := by + intro μ + have h := sl2c_conj_pauliSelfAdjoint' ⟨M.1ᴴ, hdet⟩ μ + rw [show ((⟨M.1ᴴ, hdet⟩ : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ)ᴴ = M.1 from + Matrix.conjTranspose_conjTranspose _] at h + rw [show ((⟨M.1ᴴ, hdet⟩ : SL(2,ℂ)) : Matrix (Fin 2) (Fin 2) ℂ) = M.1ᴴ from rfl] at h + rw [h] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Lorentz.SL2C.toLorentzGroup_conjTranspose (M := M) rfl, Matrix.transpose_apply] + rw [Finset.sum_congr rfl fun μ _ => by rw [hswap μ, Finset.smul_sum], Finset.sum_comm] + rw [Finset.sum_congr rfl fun ν _ => show + (∑ μ, ((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ • + ((Lorentz.SL2C.toLorentzGroup M).1 μ ν • (PauliMatrix.pauliSelfAdjoint' ν).1)) = + ((1 : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) τ ν) • + (PauliMatrix.pauliSelfAdjoint' ν).1 from by + rw [Finset.sum_congr rfl fun μ _ => smul_smul (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ) + ((Lorentz.SL2C.toLorentzGroup M).1 μ ν) (PauliMatrix.pauliSelfAdjoint' ν).1, + ← Finset.sum_smul, ← Matrix.mul_apply, ← lorentzGroupIsGroup_mul_coe, + inv_mul_cancel, lorentzGroupIsGroup_one_coe]] + rw [Finset.sum_eq_single τ + (fun ν _ hν => by rw [Matrix.one_apply_ne (Ne.symm hν), zero_smul]) + (fun h => absurd (Finset.mem_univ τ) h), Matrix.one_apply_eq, one_smul] + +/-- The right Weyl block: transporting the index of `η_{μμ} σ̄^μ` with + `Λ(M)⁻¹` cancels the conjugation by `(M⁻¹)†`, through `Λ⁻¹ η (Λ⁻¹)ᵀ = η`. -/ +lemma sum_lorentz_inv_eta_pauli_conj (M : SL(2,ℂ)) (τ : Fin 1 ⊕ Fin 3) : + ∑ μ, (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ * η μ μ) • + ((M⁻¹).1 * (PauliMatrix.pauliSelfAdjoint' μ).1 * ((M⁻¹).1)ᴴ) = + η τ τ • (PauliMatrix.pauliSelfAdjoint' τ).1 := by + have hswap : ∀ μ, (M⁻¹).1 * (PauliMatrix.pauliSelfAdjoint' μ).1 * ((M⁻¹).1)ᴴ = + ∑ ν, ((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 ν μ • + (PauliMatrix.pauliSelfAdjoint' ν).1 := by + intro μ + rw [sl2c_conj_pauliSelfAdjoint' M⁻¹ μ] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_inv] + rw [Finset.sum_congr rfl fun μ _ => by rw [hswap μ, Finset.smul_sum], Finset.sum_comm] + rw [Finset.sum_congr rfl fun ν _ => show + (∑ μ, (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ * η μ μ) • + (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 ν μ • (PauliMatrix.pauliSelfAdjoint' ν).1)) = + (η τ ν) • (PauliMatrix.pauliSelfAdjoint' ν).1 from by + rw [Finset.sum_congr rfl fun μ _ => + smul_smul ((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ * η μ μ)) + (((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 ν μ) (PauliMatrix.pauliSelfAdjoint' ν).1, + ← Finset.sum_smul, + show (∑ μ, ((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ * η μ μ * + ((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 ν μ) = η τ ν from by + rw [← sum_eta_inv_inv (Lorentz.SL2C.toLorentzGroup M) τ ν] + exact Finset.sum_congr rfl fun μ _ => by ring]] + rw [Finset.sum_eq_single τ + (fun ν _ hν => by rw [off_diag_zero (Ne.symm hν), zero_smul]) + (fun h => absurd (Finset.mem_univ τ) h)] + +/-! + +### B.3. The contraction identity of the kinetic matrices + +-/ + +/-- The matrix form of the contraction identity: transporting the vector index + of `γ⁰ γ^μ` with `Λ(M)⁻¹` cancels the conjugation by the spinor + representation. -/ +lemma sum_lorentz_inv_spinorRep_kineticGamma (M : SL(2,ℂ)) (τ : Fin 1 ⊕ Fin 3) : + ∑ μ, ((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ • + ((Electron.JetAlgebra.spinorRep M)ᴴ * JetAlgebra.kineticGamma μ * + Electron.JetAlgebra.spinorRep M) = + JetAlgebra.kineticGamma τ := by + have hS : (Electron.JetAlgebra.spinorRep M)ᴴ = + Matrix.fromBlocks M.1ᴴ 0 0 ((M⁻¹).1) := by + rw [Electron.JetAlgebra.spinorRep, Matrix.fromBlocks_conjTranspose] + simp + have hblock : ∀ μ, (Electron.JetAlgebra.spinorRep M)ᴴ * JetAlgebra.kineticGamma μ * + Electron.JetAlgebra.spinorRep M = + Matrix.fromBlocks (M.1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * M.1) 0 0 + (η μ μ • ((M⁻¹).1 * (PauliMatrix.pauliSelfAdjoint' μ).1 * ((M⁻¹).1)ᴴ)) := by + intro μ + rw [hS, Electron.JetAlgebra.spinorRep, kineticGamma_eq_fromBlocks_pauliSelfAdjoint', + Matrix.fromBlocks_multiply, Matrix.fromBlocks_multiply] + congr 1 <;> simp + rw [Finset.sum_congr rfl fun μ _ => by + rw [hblock μ, Matrix.fromBlocks_smul, smul_zero, smul_smul]] + rw [sum_fromBlocks, sum_lorentz_inv_conjTranspose_pauli_conj, + sum_lorentz_inv_eta_pauli_conj, kineticGamma_eq_fromBlocks_pauliSelfAdjoint'] + +/-- **The contraction identity of the Dirac kinetic term**: the index form of + `∑_μ (Λ⁻¹)_{τμ} S(M)† (γ⁰ γ^μ) S(M) = γ⁰ γ^τ`. This is the identity that + makes `i ψ̄ γ^μ D_μ ψ` a Lorentz scalar. -/ +lemma sum_kineticGamma_contraction (M : SL(2,ℂ)) (τ : Fin 1 ⊕ Fin 3) + (α' β' : Fin 2 ⊕ Fin 2) : + ∑ μ, ∑ α, ∑ β, JetAlgebra.kineticGamma μ α β * + (star (Electron.JetAlgebra.spinorRep M α α') * + (((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ : ℝ) : ℂ) * + Electron.JetAlgebra.spinorRep M β β')) = + JetAlgebra.kineticGamma τ α' β' := by + have h := congrArg (fun A : Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ => A α' β') + (sum_lorentz_inv_spinorRep_kineticGamma M τ) + simp only [Matrix.sum_apply, Matrix.smul_apply, Matrix.mul_apply, + Matrix.conjTranspose_apply, Complex.real_smul] at h + rw [← h] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.mul_sum, Finset.sum_comm] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [Finset.sum_mul, Finset.mul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + ring + +/-! + +### B.4. The spinor representation preserves `γ⁰` + +-/ + +/-- The spinor representation preserves `γ⁰`: `S(M)† γ⁰ S(M) = γ⁰`. This is + the identity that makes the Dirac mass term `m ψ̄ ψ` a Lorentz scalar. -/ +lemma spinorRep_conjTranspose_gammaZero_spinorRep (M : SL(2,ℂ)) : + (Electron.JetAlgebra.spinorRep M)ᴴ * JetAlgebra.gammaMatrix (Sum.inl 0) * + Electron.JetAlgebra.spinorRep M = JetAlgebra.gammaMatrix (Sum.inl 0) := by + have h1 : M.1ᴴ * ((M⁻¹).1)ᴴ = 1 := by + rw [← Matrix.conjTranspose_mul, ← Matrix.SpecialLinearGroup.coe_mul, + inv_mul_cancel, Matrix.SpecialLinearGroup.coe_one, Matrix.conjTranspose_one] + have h2 : (M⁻¹).1 * M.1 = 1 := by + rw [← Matrix.SpecialLinearGroup.coe_mul, inv_mul_cancel, + Matrix.SpecialLinearGroup.coe_one] + rw [Electron.JetAlgebra.spinorRep, JetAlgebra.gammaMatrix_inl_zero, + Matrix.fromBlocks_conjTranspose, Matrix.fromBlocks_multiply, + Matrix.fromBlocks_multiply] + simp only [Matrix.conjTranspose_zero, Matrix.conjTranspose_conjTranspose, + Matrix.mul_zero, Matrix.zero_mul, Matrix.mul_one, add_zero, + zero_add] + rw [h1, h2] + +/-- The index form of `S(M)† γ⁰ S(M) = γ⁰`. -/ +lemma sum_gammaZero_contraction (M : SL(2,ℂ)) (α' β' : Fin 2 ⊕ Fin 2) : + ∑ α, ∑ β, JetAlgebra.gammaMatrix (Sum.inl 0) α β * + (star (Electron.JetAlgebra.spinorRep M α α') * + Electron.JetAlgebra.spinorRep M β β') = + JetAlgebra.gammaMatrix (Sum.inl 0) α' β' := by + have h := congrArg (fun A : Matrix (Fin 2 ⊕ Fin 2) (Fin 2 ⊕ Fin 2) ℂ => A α' β') + (spinorRep_conjTranspose_gammaZero_spinorRep M) + simp only [Matrix.mul_apply, Matrix.conjTranspose_apply] at h + rw [← h, Finset.sum_comm] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [Finset.sum_mul] + refine Finset.sum_congr rfl fun α _ => ?_ + ring + +/-! + +## C. The transformation laws of the jet coordinates + +-/ + +namespace JetAlgebra + +/-- The photon jet coordinate transforms as a covector. -/ +theorem lorentzAction_A_zero (M : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + lorentzAction M (A 0 μ) = + ∑ ν, ((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 ν μ : ℝ) : ℂ) • A 0 ν := by + simp only [A] + rw [lorentzAction_tmul, map_one, lorentzActionPhoton_tmul, + Photon.JetAlgebra.lorentzAction_coord_zero, TensorProduct.tmul_sum, sum_tmul] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_smul, real_smul_tmul] + +/-- The first-order photon jet coordinate transforms as a two-tensor. -/ +theorem lorentzAction_A_singleton (M : SL(2,ℂ)) (ρ μ : Fin 1 ⊕ Fin 3) : + lorentzAction M (A {ρ} μ) = + ∑ τ, ∑ ν, ((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ ρ * + ((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 ν μ : ℝ) : ℂ) • A {τ} ν := by + simp only [A] + rw [lorentzAction_tmul, map_one, lorentzActionPhoton_tmul, + Photon.JetAlgebra.lorentzAction_coord_singleton] + rw [TensorProduct.tmul_sum, sum_tmul] + refine Finset.sum_congr rfl fun τ _ => ?_ + rw [TensorProduct.tmul_sum, sum_tmul] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_smul, real_smul_tmul] + +/-- The electron jet coordinate transforms in the spinor representation. -/ +theorem lorentzAction_ψ_zero (M : SL(2,ℂ)) (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (ψ 0 α) = + ∑ β, Electron.JetAlgebra.spinorRep M α β • ψ 0 β := by + simp only [ψ] + rw [lorentzAction_tmul, map_one, + Electron.JetAlgebra.lorentzAction_ofGenerator_dψ_zero, tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [tmul_smul] + +/-- The conjugate electron jet coordinate transforms in the conjugate spinor + representation. -/ +theorem lorentzAction_barψ_zero (M : SL(2,ℂ)) (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (barψ 0 α) = + ∑ β, star (Electron.JetAlgebra.spinorRep M α β) • barψ 0 β := by + simp only [barψ] + rw [lorentzAction_tmul, map_one, + Electron.JetAlgebra.lorentzAction_ofGenerator_dbarψ_zero, tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [tmul_smul] + +/-- The first-order electron jet coordinate transforms as a spinor with a + covector derivative index. -/ +theorem lorentzAction_ψ_singleton (M : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (ψ {ρ} α) = + ∑ τ, ∑ β, (((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ ρ : ℝ) : ℂ) * + Electron.JetAlgebra.spinorRep M α β) • ψ {τ} β := by + simp only [ψ] + rw [lorentzAction_tmul, map_one, + Electron.JetAlgebra.lorentzAction_ofGenerator_dψ_singleton, tmul_sum] + refine Finset.sum_congr rfl fun τ _ => ?_ + rw [tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [tmul_smul, Complex.real_smul] + +theorem lorentzAction_barψ_singleton (M : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + (α : Fin 2 ⊕ Fin 2) : + lorentzAction M (barψ {ρ} α) = + ∑ τ, ∑ β, (((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ ρ : ℝ) : ℂ) * + star (Electron.JetAlgebra.spinorRep M α β)) • barψ {τ} β := by + simp only [barψ] + rw [lorentzAction_tmul, map_one, + Electron.JetAlgebra.lorentzAction_ofGenerator_dbarψ_singleton, tmul_sum] + refine Finset.sum_congr rfl fun τ _ => ?_ + rw [tmul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [tmul_smul, Complex.real_smul] + +end JetAlgebra + +/-! + +## D. Lorentz invariance of the Maxwell term + +-/ + +namespace Photon + +namespace JetAlgebra + +/-- The formal field strength transforms as an antisymmetric two-tensor. -/ +lemma lorentzAction_fieldStrength_zero (Λ : LorentzGroup 3) (μ ν : Fin 1 ⊕ Fin 3) : + lorentzAction Λ (fieldStrength 0 μ ν) = + ∑ a, ∑ b, ((Λ⁻¹).1 a μ * (Λ⁻¹).1 b ν) • fieldStrength 0 a b := by + rw [fieldStrength, zero_add, zero_add, map_sub, lorentzAction_coord_singleton, + lorentzAction_coord_singleton, + Finset.sum_comm (f := fun a b => ((Λ⁻¹).1 a ν * (Λ⁻¹).1 b μ) • coord {a} b), + ← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [fieldStrength, zero_add, zero_add, smul_sub] + congr 1 + rw [mul_comm] + +set_option maxHeartbeats 4000000 in +/-- **Lorentz invariance of the Maxwell term** in the photon jet algebra: + the two metric contractions absorb the four transformation matrices through + `Λ⁻¹ η (Λ⁻¹)ᵀ = η`. -/ +theorem lorentzAction_maxwellTerm (Λ : LorentzGroup 3) : + lorentzAction Λ maxwellTerm = maxwellTerm := by + have hcoef : ∀ a b c d : Fin 1 ⊕ Fin 3, + (∑ μ, ∑ ν, (η μ μ * η ν ν) * + ((Λ⁻¹).1 c μ * (Λ⁻¹).1 d ν * ((Λ⁻¹).1 a μ * (Λ⁻¹).1 b ν))) = + η c a * η d b := by + intro a b c d + calc (∑ μ, ∑ ν, (η μ μ * η ν ν) * + ((Λ⁻¹).1 c μ * (Λ⁻¹).1 d ν * ((Λ⁻¹).1 a μ * (Λ⁻¹).1 b ν))) + = ∑ μ, ∑ ν, (η μ μ * ((Λ⁻¹).1 c μ * (Λ⁻¹).1 a μ)) * + (η ν ν * ((Λ⁻¹).1 d ν * (Λ⁻¹).1 b ν)) := by + refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun ν _ => ?_ + ring + _ = (∑ μ, η μ μ * ((Λ⁻¹).1 c μ * (Λ⁻¹).1 a μ)) * + (∑ ν, η ν ν * ((Λ⁻¹).1 d ν * (Λ⁻¹).1 b ν)) := by + rw [Finset.sum_mul_sum] + _ = η c a * η d b := by rw [sum_eta_inv_inv, sum_eta_inv_inv] + have hinner : ∀ a b c d : Fin 1 ⊕ Fin 3, + (∑ μ, ∑ ν, ((η μ μ * η ν ν) * + ((Λ⁻¹).1 c μ * (Λ⁻¹).1 d ν * ((Λ⁻¹).1 a μ * (Λ⁻¹).1 b ν))) • + (fieldStrength 0 c d * fieldStrength 0 a b)) = + (η c a * η d b) • (fieldStrength 0 c d * fieldStrength 0 a b) := by + intro a b c d + rw [← hcoef a b c d, Finset.sum_smul] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.sum_smul] + rw [maxwellTerm, map_sum] + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, ν] + rw [map_smul, map_mul, lorentzAction_fieldStrength_zero] + simp only [Finset.sum_mul, Finset.mul_sum, smul_mul_smul_comm, Finset.smul_sum, + smul_smul] + -- reorder the six sums from `μ ν a b c d` to `a b c d μ ν` + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ, 2, a, 2, b, 2, c]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, a]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] + conv_lhs => enter [2, a, 2, b, 2, c]; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + calc (∑ c, ∑ d, ∑ μ, ∑ ν, ((η μ μ * η ν ν) * + ((Λ⁻¹).1 c μ * (Λ⁻¹).1 d ν * ((Λ⁻¹).1 a μ * (Λ⁻¹).1 b ν))) • + (fieldStrength 0 c d * fieldStrength 0 a b)) + = ∑ c, ∑ d, (η c a * η d b) • (fieldStrength 0 c d * fieldStrength 0 a b) := + Finset.sum_congr rfl fun c _ => Finset.sum_congr rfl fun d _ => hinner a b c d + _ = (η a a * η b b) • (fieldStrength 0 a b * fieldStrength 0 a b) := by + rw [Finset.sum_eq_single a (fun c _ hc => Finset.sum_eq_zero fun d _ => by + rw [off_diag_zero hc, zero_mul, zero_smul]) + (fun h => absurd (Finset.mem_univ a) h), + Finset.sum_eq_single b (fun d _ hd => by + rw [off_diag_zero hd, mul_zero, zero_smul]) + (fun h => absurd (Finset.mem_univ b) h)] + +end JetAlgebra + +end Photon + +namespace JetAlgebra + +/-- **Lorentz invariance of the Maxwell term** in the QED jet algebra, + inherited from the photon jet algebra. -/ +theorem lorentzAction_maxwellTerm (M : SL(2,ℂ)) : + lorentzAction M maxwellTerm = maxwellTerm := by + simp only [maxwellTerm] + rw [lorentzAction_tmul, map_one, lorentzActionPhoton_tmul, + Photon.JetAlgebra.lorentzAction_maxwellTerm] + +/-! + +## E. Lorentz covariance of the covariant derivative + +-/ + +/-- The covariant derivative transforms exactly like the first-order jet + coordinate: as a spinor with a covector derivative index. -/ +theorem lorentzAction_covDψ (M : SL(2,ℂ)) (e : ℝ) (μ : Fin 1 ⊕ Fin 3) + (β : Fin 2 ⊕ Fin 2) : + lorentzAction M (covDψ e μ β) = + ∑ τ, ∑ β', (((((Lorentz.SL2C.toLorentzGroup M)⁻¹).1 τ μ : ℝ) : ℂ) * + Electron.JetAlgebra.spinorRep M β β') • covDψ e τ β' := by + rw [covDψ, map_add, map_smul, map_mul, lorentzAction_ψ_singleton, + lorentzAction_A_zero, lorentzAction_ψ_zero, Finset.sum_mul_sum] + simp only [smul_mul_smul_comm, Finset.smul_sum, smul_smul, smul_add, + Finset.sum_add_distrib, covDψ] + congr 1 + all_goals + refine Finset.sum_congr rfl fun τ _ => Finset.sum_congr rfl fun β' _ => ?_ + first + | rfl + | exact congrArg (· • _) (by ring) + +/-! + +## F. Lorentz invariance of the fermionic terms + +-/ + +set_option maxHeartbeats 2000000 in +/-- **Lorentz invariance of the Dirac mass term**: the spinor phases of the + electron and its conjugate cancel through `S(M)† γ⁰ S(M) = γ⁰`. -/ +theorem lorentzAction_electronMassTerm (M : SL(2,ℂ)) : + lorentzAction M electronMassTerm = electronMassTerm := by + rw [electronMassTerm, map_sum] + conv_lhs => enter [2, α]; rw [map_sum] + conv_lhs => + enter [2, α, 2, β] + rw [map_smul, map_mul, lorentzAction_barψ_zero, lorentzAction_ψ_zero] + simp only [Finset.sum_mul, Finset.mul_sum, smul_mul_smul_comm, Finset.smul_sum, + smul_smul] + -- reorder the four sums from `α β β' α'` to `α' β' α β` + conv_lhs => enter [2, α, 2, β]; rw [Finset.sum_comm] + conv_lhs => enter [2, α]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, α', 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, α']; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun β' _ => ?_ + rw [← sum_gammaZero_contraction M α' β', Finset.sum_smul] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Finset.sum_smul] + +set_option maxHeartbeats 2000000 in +/-- **Lorentz invariance of the Dirac kinetic term**: the transformation of + the two spinor slots and the derivative slot cancels through the contraction + identity of the matrices `γ⁰ γ^μ`. -/ +theorem lorentzAction_diracKineticTerm (M : SL(2,ℂ)) (e : ℝ) : + lorentzAction M (diracKineticTerm e) = diracKineticTerm e := by + rw [diracKineticTerm, map_smul, map_sum] + congr 1 + conv_lhs => enter [2, μ]; rw [map_sum] + conv_lhs => enter [2, μ, 2, α]; rw [map_sum] + conv_lhs => + enter [2, μ, 2, α, 2, β] + rw [map_smul, map_mul, lorentzAction_barψ_zero, lorentzAction_covDψ] + simp only [Finset.sum_mul, Finset.mul_sum, smul_mul_smul_comm, Finset.smul_sum, + smul_smul] + -- reorder the six sums from `μ α β τ β' α'` to `τ α' β' μ α β` + conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, μ]; rw [Finset.sum_comm] + conv_lhs => rw [Finset.sum_comm] + conv_lhs => enter [2, τ, 2, μ, 2, α, 2, β]; rw [Finset.sum_comm] + conv_lhs => enter [2, τ, 2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, τ, 2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, τ]; rw [Finset.sum_comm] + conv_lhs => enter [2, τ, 2, α', 2, μ, 2, α]; rw [Finset.sum_comm] + conv_lhs => enter [2, τ, 2, α', 2, μ]; rw [Finset.sum_comm] + conv_lhs => enter [2, τ, 2, α']; rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun τ _ => Finset.sum_congr rfl fun α' _ => + Finset.sum_congr rfl fun β' _ => ?_ + rw [← sum_kineticGamma_contraction M τ α' β', Finset.sum_smul] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [Finset.sum_smul] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [Finset.sum_smul] + +/-! + +## G. Lorentz invariance of the QED Lagrangian + +-/ + +/-- **Lorentz invariance of the QED Lagrangian.** The Maxwell term is + invariant through `Λ⁻¹ η (Λ⁻¹)ᵀ = η`, the kinetic term through the + contraction identity of `γ⁰ γ^μ` under the spinor representation, and the + mass term through `S(M)† γ⁰ S(M) = γ⁰`. -/ +theorem lorentzAction_lagrangian (M : SL(2,ℂ)) (e m : ℝ) : + lorentzAction M (lagrangian e m) = lagrangian e m := by + rw [lagrangian, map_sub, map_add, map_smul, map_smul, lorentzAction_maxwellTerm, + lorentzAction_diracKineticTerm, lorentzAction_electronMassTerm] + +end JetAlgebra + +end QED diff --git a/Physlib/Particles/QED/MassDimension.lean b/Physlib/Particles/QED/MassDimension.lean new file mode 100644 index 000000000..61b130618 --- /dev/null +++ b/Physlib/Particles/QED/MassDimension.lean @@ -0,0 +1,254 @@ +/- +Copyright (c) 2026 Jinzheng Li. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li +-/ +module + +public import Physlib.Particles.QED.Lagrangian +public import Physlib.Particles.QED.FieldStrength +public import Mathlib.Tactic.Module +/-! +# Mass dimensions in quantum electrodynamics + +## i. Overview + +The mass-dimension bookkeeping of QED, through the mass-weight scaling of +`Physlib.Particles.QED.Basic` (the algebra map multiplying each jet coordinate by `c` +to twice its mass dimension): the photon has dimension one, the electron +`3/2`, and each derivative adds one. The theorems of this file identify the +composite fields and the terms of the Lagrangian as eigenvectors of the +scaling: + +* the covariant derivative `D_μ ψ` is homogeneous of weight five — this is + the statement that the electric coupling `e` is dimensionless, which is + what makes QED renormalizable; +* the Maxwell term and the Dirac kinetic term have weight eight (mass + dimension four), and the mass term weight six (dimension three); +* consequently `L(e, c² m)` scales to `c⁸ L(e, m)`: the Lagrangian has mass + dimension four with the electron mass a coefficient of dimension one. + +This file contains no definitions, only theorems. + +## ii. Key results + +- `JetAlgebra.massScale_A_zero`, `JetAlgebra.massScale_ψ`, … : the scaling of + the jet coordinates. +- `JetAlgebra.massScale_covDψ` : the covariant derivative is homogeneous of + weight five; the coupling is dimensionless. +- `JetAlgebra.massScale_maxwellTerm`, `JetAlgebra.massScale_diracKineticTerm`, + `JetAlgebra.massScale_electronMassTerm` : the weights of the terms. +- `JetAlgebra.massScale_lagrangian` : **the QED Lagrangian has mass dimension + four**. + +## iii. Table of contents + +- A. The scaling of the jet coordinates +- B. Homogeneity of the field strength and the covariant derivative +- C. The weights of the terms of the Lagrangian +- D. The mass dimension of the QED Lagrangian + +## iv. References + +The scaling maps are defined in `Physlib.Particles.QED.Basic`; the corresponding +grading for the lepton–gauge sector is +`Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDim`. + +-/ + +@[expose] public section + +/-! TODO: Upgrade the mass-weight scaling to a genuine filtration by submodules, following -/ +/-! TODO: `LeptonGaugeSector.JetAlgebra.MassDim` (`MassWeightLESubmodule`), together with the -/ +/-! TODO: derivative-order and fermion-parity gradings needed for classification arguments. -/ + +namespace QED + +open TensorProduct + +namespace Photon + +namespace JetAlgebra + +/-! + +## A. The scaling of the jet coordinates + +The photon-level scaling of the field strength and the Maxwell term, used to +lift the weight of the Maxwell term to the QED jet algebra. + +-/ + +/-- The photon-level field strength has mass dimension two. -/ +lemma massScale_fieldStrength_zero (c : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : + massScale c (fieldStrength 0 μ ν) = c ^ 4 • fieldStrength 0 μ ν := by + rw [fieldStrength, zero_add, zero_add, map_sub, massScale_coord, massScale_coord, + smul_sub] + norm_num + +/-- The photon-level Maxwell term has mass dimension four. -/ +theorem massScale_maxwellTerm (c : ℝ) : + massScale c maxwellTerm = c ^ 8 • maxwellTerm := by + rw [maxwellTerm, map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_smul, map_mul, massScale_fieldStrength_zero, smul_mul_smul_comm, + ← pow_add, smul_comm] + +end JetAlgebra + +end Photon + +namespace JetAlgebra + +theorem massScale_A (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + massScale c (A s μ) = (c : ℂ) ^ (2 + 2 * Multiset.card s) • A s μ := by + simp only [A] + rw [massScale_tmul, map_one, massScalePhoton_tmul, + Photon.JetAlgebra.massScale_coord, TensorProduct.tmul_smul, real_smul_tmul, + Complex.ofReal_pow] + +theorem massScale_ψ (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + massScale c (ψ s α) = (c : ℂ) ^ (3 + 2 * Multiset.card s) • ψ s α := by + simp only [ψ] + rw [massScale_tmul, map_one, Electron.JetAlgebra.massScale_ofGenerator, tmul_smul] + rfl + +theorem massScale_barψ (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2 ⊕ Fin 2) : + massScale c (barψ s α) = (c : ℂ) ^ (3 + 2 * Multiset.card s) • barψ s α := by + simp only [barψ] + rw [massScale_tmul, map_one, Electron.JetAlgebra.massScale_ofGenerator, tmul_smul] + rfl + +/-- The photon jet coordinate has mass dimension one. -/ +theorem massScale_A_zero (c : ℝ) (μ : Fin 1 ⊕ Fin 3) : + massScale c (A 0 μ) = (c : ℂ) ^ 2 • A 0 μ := by + rw [massScale_A] + norm_num + +/-- The electron jet coordinate has mass dimension `3/2`. -/ +theorem massScale_ψ_zero (c : ℝ) (α : Fin 2 ⊕ Fin 2) : + massScale c (ψ 0 α) = (c : ℂ) ^ 3 • ψ 0 α := by + rw [massScale_ψ] + norm_num + +theorem massScale_barψ_zero (c : ℝ) (α : Fin 2 ⊕ Fin 2) : + massScale c (barψ 0 α) = (c : ℂ) ^ 3 • barψ 0 α := by + rw [massScale_barψ] + norm_num + +theorem massScale_ψ_singleton (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + massScale c (ψ {μ} α) = (c : ℂ) ^ 5 • ψ {μ} α := by + rw [massScale_ψ] + norm_num + +theorem massScale_barψ_singleton (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + massScale c (barψ {μ} α) = (c : ℂ) ^ 5 • barψ {μ} α := by + rw [massScale_barψ] + norm_num + +/-! + +## B. Homogeneity of the field strength and the covariant derivative + +-/ + +/-- The field strength has mass dimension two. -/ +theorem massScale_fieldStrength_zero (c : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : + massScale c (fieldStrength 0 μ ν) = (c : ℂ) ^ 4 • fieldStrength 0 μ ν := by + rw [fieldStrength_eq_sub, map_sub, massScale_A, massScale_A, smul_sub] + norm_num + +/-- **The covariant derivative is homogeneous**, of the same weight as the + plain derivative: the electric coupling `e` is dimensionless. This is the + power-counting statement behind the renormalizability of QED. -/ +theorem massScale_covDψ (c : ℝ) (e : ℝ) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + massScale c (covDψ e μ α) = (c : ℂ) ^ 5 • covDψ e μ α := by + rw [covDψ, map_add, map_smul, map_mul, massScale_ψ_singleton, massScale_A_zero, + massScale_ψ_zero] + simp only [smul_mul_smul_comm, smul_add, smul_smul] + module + +theorem massScale_covDbarψ (c : ℝ) (e : ℝ) (μ : Fin 1 ⊕ Fin 3) (α : Fin 2 ⊕ Fin 2) : + massScale c (covDbarψ e μ α) = (c : ℂ) ^ 5 • covDbarψ e μ α := by + rw [covDbarψ, map_sub, map_smul, map_mul, massScale_barψ_singleton, + massScale_A_zero, massScale_barψ_zero] + simp only [smul_mul_smul_comm, smul_sub, smul_smul] + module + +/-! + +## C. The weights of the terms of the Lagrangian + +-/ + +/-- The Maxwell term has mass dimension four. -/ +theorem massScale_maxwellTerm (c : ℝ) : + massScale c maxwellTerm = (c : ℂ) ^ 8 • maxwellTerm := by + simp only [maxwellTerm] + rw [massScale_tmul, map_one, massScalePhoton_tmul, + Photon.JetAlgebra.massScale_maxwellTerm, TensorProduct.tmul_smul, + real_smul_tmul, Complex.ofReal_pow] + +/-- The Dirac kinetic term has mass dimension four. -/ +theorem massScale_diracKineticTerm (c : ℝ) (e : ℝ) : + massScale c (diracKineticTerm e) = (c : ℂ) ^ 8 • diracKineticTerm e := by + rw [diracKineticTerm, map_smul, map_sum, smul_smul, + mul_comm ((c : ℂ) ^ 8) Complex.I, ← smul_smul] + congr 1 + rw [Finset.smul_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, map_mul, massScale_barψ_zero, massScale_covDψ, smul_mul_smul_comm, + ← pow_add, smul_comm] + +/-- The conjugate Dirac kinetic term has mass dimension four. -/ +theorem massScale_diracKineticTermBar (c : ℝ) (e : ℝ) : + massScale c (diracKineticTermBar e) = (c : ℂ) ^ 8 • diracKineticTermBar e := by + rw [diracKineticTermBar, map_smul, map_sum, smul_smul, + mul_comm ((c : ℂ) ^ 8) (-Complex.I), ← smul_smul] + congr 1 + rw [Finset.smul_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, map_mul, massScale_covDbarψ, massScale_ψ_zero, smul_mul_smul_comm, + ← pow_add, smul_comm] + +/-- The Dirac mass term has mass dimension three. -/ +theorem massScale_electronMassTerm (c : ℝ) : + massScale c electronMassTerm = (c : ℂ) ^ 6 • electronMassTerm := by + rw [electronMassTerm, map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun α _ => ?_ + rw [map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [map_smul, map_mul, massScale_barψ_zero, massScale_ψ_zero, smul_mul_smul_comm, + ← pow_add, smul_comm] + +/-! + +## D. The mass dimension of the QED Lagrangian + +-/ + +/-- **The QED Lagrangian has mass dimension four.** Rescaling all fields by + their mass weights takes `L(e, c² m)` to `c⁸ L(e, m)`: the coupling `e` is + dimensionless and the electron mass is a coefficient of dimension one, so + every term of the Lagrangian is renormalizable. -/ +theorem massScale_lagrangian (c : ℝ) (e m : ℝ) : + massScale c (lagrangian e (c ^ 2 * m)) = (c : ℂ) ^ 8 • lagrangian e m := by + rw [lagrangian, lagrangian, map_sub, map_add, map_smul, map_smul, + massScale_maxwellTerm, massScale_diracKineticTerm, massScale_electronMassTerm] + simp only [smul_smul, smul_add, smul_sub] + push_cast + module + +end JetAlgebra + +end QED diff --git a/scripts/style-exceptions.txt b/scripts/style-exceptions.txt index e69de29bb..80c49ab83 100644 --- a/scripts/style-exceptions.txt +++ b/scripts/style-exceptions.txt @@ -0,0 +1 @@ +Physlib/Particles/QED/Basic.lean : line 1 : ERR_NUM_LIN : 1700 file contains 1519 lines, try to split it up From 0338fae0555838e54bcbe893396a896b80d5318d Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 13 Aug 2026 06:40:06 +0100 Subject: [PATCH 135/254] feat: Clean up boost weights --- .../JetAlgebra/Boosts/FieldStrength.lean | 112 ++++++++++++- .../JetAlgebra/Grading/BoostWeight.lean | 155 +++++++----------- .../LorentzGroup/Boosts/WeightGrading.lean | 96 ++++++----- 3 files changed, 211 insertions(+), 152 deletions(-) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean index 45473939f..716023f53 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean @@ -17,7 +17,7 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTer namespace LeptonGaugeSector open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix Pointwise -open Matrix MatrixGroups +open Matrix MatrixGroups BoostWeight namespace JetAlgebra @@ -44,6 +44,48 @@ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : -/ +/-- The light-cone combination `F_{0x} - F_{zx}` has boost weight `2`. -/ +lemma fieldStrengthDeriv_lightCone_mem_two : + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by + intro t ht + simp only [algebraMap_real_complex] + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_sub, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- The light-cone combination `F_{0x} + F_{zx}` has boost weight `-2`. -/ +lemma fieldStrengthDeriv_lightCone_mem_neg_two : + fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by + intro t ht + simp only [algebraMap_real_complex] + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [map_add, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, mul_one, Complex.ofReal_zero, + zero_smul, smul_zero, add_zero, zero_add] + push_cast + match_scalars <;> (field_simp; ring) + +/-- The transverse component `F_{xy}` has boost weight zero. -/ +lemma fieldStrengthDeriv_transverse_mem_zero : + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by + intro t ht + simp only [algebraMap_real_complex] + rw [repLorentzGroup_fieldStrengthDeriv_nil] + simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, + Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, + mul_zero, mul_one, Complex.ofReal_zero, Complex.ofReal_one, + zero_smul, smul_zero, add_zero, zero_add] + match_scalars; norm_num + /-- The light-cone combination `F_{0y} - F_{zy}` has boost weight `2`. -/ lemma fieldStrengthDeriv_lightCone_y_mem_two : fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - @@ -307,7 +349,8 @@ lemma boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts : rintro _ (rfl | rfl) <;> exact add_mem (fieldStrengthDeriv_mem_bosonic _ _ _) (fieldStrengthDeriv_mem_bosonic _ _ _) have hV2 : V2 = V0 * V0 := fieldStrengthDeriv_mul_span_eq_mul_span - rw [hV2, BoostWeight.boostProj_map_mul repLorentzGroup 0 hcl hcl, BoostWeight.iSup_eq_sup_zero_two_neg_two repLorentzGroup _ hbot] + rw [hV2, BoostWeight.boostProj_map_mul repLorentzGroup 0 hcl hcl, + BoostWeight.iSup_eq_sup_zero_two_neg_two _ hbot] simp only [sub_self, zero_sub, neg_neg] rw [Submodule.add_eq_sup, mul_comm_of_le_bosonic hbos, sup_assoc, sup_idem] @@ -366,6 +409,71 @@ lemma fieldStrengthDeriv_two_deriv_eq_map_span : exact Submodule.subset_span ⟨γ, δ, μ, ν, (fieldStrengthDeriv_pair_eq_jetDeriv γ δ μ ν).symm⟩ +/-- **The weight-zero part of the twice-differentiated field strengths.** Projecting the span + of the `F_{{α,β}μν}` onto `z`-boost weight zero redistributes the two derivatives into the + light-cone combinations `∂_0 ∓ ∂_z`, which shift the weight by `±2`, and the transverse + derivatives `∂_x`, `∂_y`, which preserve it, applied to the weight-`0`, `±2` parts of the + span of the `F_{μν}` so that the total weight vanishes. Both orders of each pair of + derivatives appear separately: no commutation of derivatives is used. -/ +lemma boostProj_z_map_fieldStrengthDeriv_jetDeriv_span_eq : + let D2V0 := Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν} + let V0 := Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} + D2V0.map (boostProj repLorentzGroup 2 0) = + ((V0.map (boostProj repLorentzGroup 2 0)).map + (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2))).map + (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + + ((V0.map (boostProj repLorentzGroup 2 (-2))).map + (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 0)) + + ((V0.map (boostProj repLorentzGroup 2 (-2))).map + (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 1)) + + ((V0.map (boostProj repLorentzGroup 2 0)).map + (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2))).map + (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + + ((V0.map (boostProj repLorentzGroup 2 2)).map + (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 0)) + + ((V0.map (boostProj repLorentzGroup 2 2)).map + (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 1)) + + ((V0.map (boostProj repLorentzGroup 2 (-2))).map (jetDeriv (Sum.inr 0))).map + (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + + ((V0.map (boostProj repLorentzGroup 2 2)).map (jetDeriv (Sum.inr 0))).map + (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 0))).map + (jetDeriv (Sum.inr 0)) + + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 0))).map + (jetDeriv (Sum.inr 1)) + + ((V0.map (boostProj repLorentzGroup 2 (-2))).map (jetDeriv (Sum.inr 1))).map + (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + + ((V0.map (boostProj repLorentzGroup 2 2)).map (jetDeriv (Sum.inr 1))).map + (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 1))).map + (jetDeriv (Sum.inr 0)) + + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 1))).map + (jetDeriv (Sum.inr 1)) := by + intro D2V0 V0 + have hbot : ∀ k : ℤ, k ≠ 0 → k ≠ 2 → k ≠ -2 → + V0.map (BoostWeight.boostProj repLorentzGroup 2 k) = ⊥ := + boostProj_z_map_fieldStrengthDeriv_span_of_ne + rw [show D2V0 = ∑ α, (∑ β, V0.map (jetDeriv β)).map (jetDeriv α) from + fieldStrengthDeriv_two_deriv_eq_map_span] + simp only [boostProj_map_submodule_jetDeriv_z, + show (0 : ℤ) - 2 = -2 from by decide, show (0 : ℤ) + 2 = 2 from by decide, + show (-2 : ℤ) - 2 = -4 from by decide, show (-2 : ℤ) + 2 = 0 from by decide, + show (2 : ℤ) - 2 = 0 from by decide, show (2 : ℤ) + 2 = 4 from by decide] + rw [hbot (-4) (by decide) (by decide) (by decide), + hbot 4 (by decide) (by decide) (by decide)] + simp only [Submodule.map_bot, Submodule.add_eq_sup, Submodule.map_sup, bot_sup_eq, + sup_bot_eq] + simp only [← Submodule.add_eq_sup] + abel + +lemma boostProj_z_map_fieldStrengthDeriv_jetDeriv_span_le : + (Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν}).map + (BoostWeight.boostProj repLorentzGroup 2 0) ≤ + Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν} := by + sorry + + + end JetAlgebra end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index a9200c03e..174b2a550 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -39,7 +39,7 @@ already diagonal, with weights `∓1`. No covariance of `jetDeriv` is needed any *The three axes.* Everything is proved for the `z`-axis and transported. The axis boosts are conjugate — a rotation by `π/2` carries the `z`-boost to the `x`- and `y`-boosts -(`boostXel_eq_conj`, `boostYel_eq_conj`) — so `isGraded_of_isGraded_two` moves the grading +(`boostXel_eq_conj`, `boostYel_eq_conj`) — so `weightSpan_eq_top_of_two` moves the grading between them without repeating the descent. With this grading we can single out the subspace of boost weight zero. Any invariant under the @@ -72,7 +72,7 @@ layer to the spaces the jet algebra is built from. - `JetAlgebra.boostAxis` : the boost along a given spatial axis, and `boostXel_eq_conj`, `boostYel_eq_conj` exhibiting the three as conjugate. -- `JetAlgebra.BoostWeight.IsGraded` and the transport lemmas of section B : the grading +- `weightSpan rep i = ⊤` and the transport lemmas of section B : the grading propagates along tensor products, products, symmetric and exterior algebras, base change and conjugation. - `JetAlgebra.boostWeightSubmodule` : the elements of a given boost weight along a given axis. @@ -113,7 +113,7 @@ namespace JetAlgebra ## C. The component spaces are boost-graded Each layer of the jet algebra is graded once the layer below it is: the two four-dimensional -derivative and target spaces by `isGraded_of_lorentzColumns`, the spinor duals directly (the +derivative and target spaces by `weightSpan_eq_top_of_lorentzColumns`, the spinor duals directly (the boost is already diagonal on them), and everything above by the tensor, product, symmetric- and exterior-algebra transports. @@ -121,26 +121,26 @@ exterior-algebra transports. open BoostWeight in /-- The real dual covectors — the derivative slots — are boost-graded. -/ -lemma isGraded_coVectorDual : IsGraded (Lorentz.CoVector.sl2Rep.dual) 2 := - isGraded_of_lorentzColumns Lorentz.CoVector.basis.dualBasis fun Λ μ => by +lemma weightSpan_coVectorDual_eq_top : weightSpan (Lorentz.CoVector.sl2Rep.dual) 2 = ⊤ := + weightSpan_eq_top_of_lorentzColumns Lorentz.CoVector.basis.dualBasis fun Λ μ => by simpa using Lorentz.CoVector.sl2Rep_dual_dualBasis Λ μ open BoostWeight in /-- The complex dual covectors are boost-graded. -/ -lemma isGraded_coℂModuleDual : IsGraded (Lorentz.CoℂModule.SL2CRep.dual) 2 := - isGraded_of_lorentzColumns Lorentz.complexCoBasis.dualBasis fun Λ μ => by +lemma weightSpan_coℂModuleDual_eq_top : weightSpan (Lorentz.CoℂModule.SL2CRep.dual) 2 = ⊤ := + weightSpan_eq_top_of_lorentzColumns Lorentz.complexCoBasis.dualBasis fun Λ μ => by simpa using Lorentz.CoℂModule.SL2CRep_dual_dualBasis Λ μ open BoostWeight in /-- The dual B-boson target space is boost-graded. -/ -lemma isGraded_bBosonDual : IsGraded (BBoson.repLorentzGroup.dual) 2 := - isGraded_of_lorentzColumns BBoson.basis.dualBasis fun Λ μ => by +lemma weightSpan_bBosonDual_eq_top : weightSpan (BBoson.repLorentzGroup.dual) 2 = ⊤ := + weightSpan_eq_top_of_lorentzColumns BBoson.basis.dualBasis fun Λ μ => by simpa using BBoson.repLorentzGroup_dual_dualBasis Λ μ open BoostWeight in /-- The real algebra of derivative symbols is boost-graded. -/ -lemma isGraded_derivAlgebraReal : IsGraded (DerivAlgebraReal.repLorentzGroup) 2 := - isGraded_symmetricAlgebra (repV := Lorentz.CoVector.sl2Rep.dual) +lemma weightSpan_derivAlgebraReal_eq_top : weightSpan (DerivAlgebraReal.repLorentzGroup) 2 = ⊤ := + weightSpan_symmetricAlgebra_eq_top (repV := Lorentz.CoVector.sl2Rep.dual) (fun Λ => by show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)) 1 = 1 @@ -150,27 +150,28 @@ lemma isGraded_derivAlgebraReal : IsGraded (DerivAlgebraReal.repLorentzGroup) 2 (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)) (x * y) = _ exact map_mul _ _ _) (fun Λ x => DerivAlgebraReal.repLorentzGroup_apply_ι Λ x) - isGraded_coVectorDual + weightSpan_coVectorDual_eq_top open BoostWeight in /-- The complex algebra of derivative symbols is boost-graded. -/ -lemma isGraded_derivAlgebraComplex : IsGraded (DerivAlgebraComplex.repLorentzGroup) 2 := - isGraded_symmetricAlgebra (repV := Lorentz.CoℂModule.SL2CRep.dual) +lemma weightSpan_derivAlgebraComplex_eq_top : + weightSpan (DerivAlgebraComplex.repLorentzGroup) 2 = ⊤ := + weightSpan_symmetricAlgebra_eq_top (repV := Lorentz.CoℂModule.SL2CRep.dual) (fun Λ => DerivAlgebraComplex.repLorentzGroup_apply_one Λ) (fun Λ x y => DerivAlgebraComplex.repLorentzGroup_apply_mul Λ x y) (fun Λ x => DerivAlgebraComplex.repLorentzGroup_apply_ι Λ x) - isGraded_coℂModuleDual + weightSpan_coℂModuleDual_eq_top open BoostWeight in /-- The B-boson jet component space is boost-graded. -/ -lemma isGraded_bBosonJetComponentSpace : - IsGraded (BBoson.JetComponentSpace.repLorentzGroup) 2 := - isGraded_tprod isGraded_derivAlgebraReal isGraded_bBosonDual +lemma weightSpan_bBosonJetComponentSpace_eq_top : + weightSpan (BBoson.JetComponentSpace.repLorentzGroup) 2 = ⊤ := + weightSpan_tprod_eq_top weightSpan_derivAlgebraReal_eq_top weightSpan_bBosonDual_eq_top open BoostWeight in /-- The B-boson jet algebra is boost-graded. -/ -lemma isGraded_bBosonJetAlgebra : IsGraded (BBoson.JetAlgebra.repLorentzGroup) 2 := - isGraded_symmetricAlgebra (repV := BBoson.JetComponentSpace.repLorentzGroup) +lemma weightSpan_bBosonJetAlgebra_eq_top : weightSpan (BBoson.JetAlgebra.repLorentzGroup) 2 = ⊤ := + weightSpan_symmetricAlgebra_eq_top (repV := BBoson.JetComponentSpace.repLorentzGroup) (fun Λ => by show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ BBoson.JetComponentSpace.repLorentzGroup Λ)) 1 = 1 @@ -180,20 +181,21 @@ lemma isGraded_bBosonJetAlgebra : IsGraded (BBoson.JetAlgebra.repLorentzGroup) 2 (SymmetricAlgebra.ι ℝ _ ∘ₗ BBoson.JetComponentSpace.repLorentzGroup Λ)) (x * y) = _ exact map_mul _ _ _) (fun Λ x => BBoson.JetAlgebra.repLorentzGroup_apply_ι Λ x) - isGraded_bBosonJetComponentSpace + weightSpan_bBosonJetComponentSpace_eq_top open BoostWeight in /-- The complexified B-boson jet algebra is boost-graded. -/ -lemma isGraded_complexBBosonJetAlgebra : - IsGraded (BBoson.JetAlgebra.complexRepLorentzGroup) 2 := - isGraded_baseChange (fun _ _ _ => rfl) isGraded_bBosonJetAlgebra +lemma weightSpan_complexBBosonJetAlgebra_eq_top : + weightSpan (BBoson.JetAlgebra.complexRepLorentzGroup) 2 = ⊤ := + weightSpan_baseChange_eq_top (fun _ _ _ => rfl) weightSpan_bBosonJetAlgebra_eq_top open BoostWeight in /-- The dual charged-lepton spinors are boost-graded: the boost is already diagonal on them, with weights `∓1`. -/ -lemma isGraded_leptonSingletDual : IsGraded (LeptonSinglet.repLorentzGroup.dual) 2 := by - refine isGraded_of_basis LeptonSinglet.basis.dualBasis fun α => ?_ +lemma weightSpan_leptonSingletDual_eq_top : + weightSpan (LeptonSinglet.repLorentzGroup.dual) 2 = ⊤ := by + refine weightSpan_eq_top_of_basis LeptonSinglet.basis.dualBasis fun α => ?_ match α with | 0 => refine mem_weightSpan_of_mem_boostWeightSubmodule (w := -1) fun t ht => ?_ @@ -218,8 +220,9 @@ lemma isGraded_leptonSingletDual : IsGraded (LeptonSinglet.repLorentzGroup.dual) open BoostWeight in /-- The dual conjugate charged-lepton spinors are boost-graded. -/ -lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.conj.dual) 2 := by - refine isGraded_of_basis LeptonSinglet.basis.conj.dualBasis fun α => ?_ +lemma weightSpan_leptonSingletConjDual_eq_top : + weightSpan (LeptonSinglet.repLorentzGroup.conj.dual) 2 = ⊤ := by + refine weightSpan_eq_top_of_basis LeptonSinglet.basis.conj.dualBasis fun α => ?_ match α with | 0 => refine mem_weightSpan_of_mem_boostWeightSubmodule (w := -1) fun t ht => ?_ @@ -242,15 +245,16 @@ lemma isGraded_leptonSingletConjDual : IsGraded (LeptonSinglet.repLorentzGroup.c open BoostWeight in /-- The charged-lepton jet component space is boost-graded. -/ -lemma isGraded_leptonJetComponentSpace : - IsGraded (LeptonSinglet.JetComponentSpace.repLorentzGroup) 2 := - isGraded_prod (isGraded_tprod isGraded_derivAlgebraComplex isGraded_leptonSingletDual) - (isGraded_tprod isGraded_derivAlgebraComplex isGraded_leptonSingletConjDual) +lemma weightSpan_leptonJetComponentSpace_eq_top : + weightSpan (LeptonSinglet.JetComponentSpace.repLorentzGroup) 2 = ⊤ := + weightSpan_prod_eq_top (weightSpan_tprod_eq_top weightSpan_derivAlgebraComplex_eq_top weightSpan_leptonSingletDual_eq_top) + (weightSpan_tprod_eq_top weightSpan_derivAlgebraComplex_eq_top weightSpan_leptonSingletConjDual_eq_top) open BoostWeight in /-- The charged-lepton jet algebra is boost-graded. -/ -lemma isGraded_leptonJetAlgebra : IsGraded (LeptonSinglet.JetAlgebra.repLorentzGroup) 2 := - isGraded_exteriorAlgebra (repV := LeptonSinglet.JetComponentSpace.repLorentzGroup) +lemma weightSpan_leptonJetAlgebra_eq_top : + weightSpan (LeptonSinglet.JetAlgebra.repLorentzGroup) 2 = ⊤ := + weightSpan_exteriorAlgebra_eq_top (repV := LeptonSinglet.JetComponentSpace.repLorentzGroup) (fun Λ => by show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) 1 = 1 exact map_one _) @@ -261,19 +265,19 @@ lemma isGraded_leptonJetAlgebra : IsGraded (LeptonSinglet.JetAlgebra.repLorentzG show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) (ExteriorAlgebra.ι ℂ x) = _ exact ExteriorAlgebra.map_apply_ι _ _) - isGraded_leptonJetComponentSpace + weightSpan_leptonJetComponentSpace_eq_top open BoostWeight in /-- The lepton–gauge-sector jet algebra is boost-graded. -/ -lemma isGraded_jetAlgebra : IsGraded (repLorentzGroup) 2 := - isGraded_tprod isGraded_complexBBosonJetAlgebra isGraded_leptonJetAlgebra +lemma weightSpan_jetAlgebra_eq_top : weightSpan (repLorentzGroup) 2 = ⊤ := + weightSpan_tprod_eq_top weightSpan_complexBBosonJetAlgebra_eq_top weightSpan_leptonJetAlgebra_eq_top /-- **The lepton–gauge-sector jet algebra is boost-graded**: the Lorentz action is by algebra automorphisms, and along every axis the weight spaces span, by the descent of section C transported between the axes. -/ instance : BoostWeight.IsBoostGraded (repLorentzGroup) := ⟨repLorentzGroup_apply_one, repLorentzGroup_apply_mul, - fun i => BoostWeight.isGraded_of_isGraded_two isGraded_jetAlgebra i⟩ + fun i => BoostWeight.weightSpan_eq_top_of_two weightSpan_jetAlgebra_eq_top i⟩ /-! @@ -296,54 +300,12 @@ lemma mem_boostWeightSubmodule_zero_of_isInvariant {x : JetAlgebra} (hx : IsInva ## E. Homogeneous elements -The coordinate components of a field strength are not boost eigenvectors; the light-cone -combinations are. The two components with both indices transverse to the boost — `F_{xy}` — and -the one along it — `F_{0z}` — are invariant. +The coordinate components of the gauge potential are not boost eigenvectors; the light-cone +combinations `B_0 ∓ B_z` are, of weight `±2`. The zeroth-order lepton coordinates are +eigenvectors of weight `∓1`. -/ -/-- The light-cone combination `F_{0x} - F_{zx}` has boost weight `2`. -/ -lemma fieldStrengthDeriv_lightCone_mem_two : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- The light-cone combination `F_{0x} + F_{zx}` has boost weight `-2`. -/ -lemma fieldStrengthDeriv_lightCone_mem_neg_two : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- The transverse component `F_{xy}` has boost weight zero. -/ -lemma fieldStrengthDeriv_transverse_mem_zero : - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - intro t ht - simp only [algebraMap_real_complex] - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, Complex.ofReal_one, - zero_smul, smul_zero, add_zero, zero_add] - match_scalars; norm_num - /-- The zeroth-order lepton coordinate `ψ_0` has boost weight `-1`. -/ lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := by intro t ht @@ -432,20 +394,12 @@ span, is section C. -/ -/-- The homogeneous elements span a subalgebra of the jet algebra. -/ -noncomputable def boostWeightSubalgebra (i : Fin 3) : Subalgebra ℂ JetAlgebra := - BoostWeight.subalgebra repLorentzGroup i - -@[simp] -lemma mem_boostWeightSubalgebra {x : JetAlgebra} : - x ∈ boostWeightSubalgebra i ↔ x ∈ ⨆ k, BoostWeight.boostWeightSubmodule repLorentzGroup i k := Iff.rfl - /-- The homogeneous span contains the whole bosonic factor once it contains the generators. -/ private lemma inclB_mem_boostWeightSubalgebra - (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra i) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : inclB a ∈ boostWeightSubalgebra i := by + (h : ∀ j : JetGenerators, [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i) + (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : inclB a ∈ BoostWeight.subalgebra repLorentzGroup i := by have hone : ∀ c : BBoson.JetAlgebra, - inclB ((1 : ℂ) ⊗ₜ[ℝ] c) ∈ boostWeightSubalgebra i := by + inclB ((1 : ℂ) ⊗ₜ[ℝ] c) ∈ BoostWeight.subalgebra repLorentzGroup i := by intro c induction c using SymmetricAlgebra.induction with | algebraMap r => @@ -495,10 +449,10 @@ private lemma inclB_mem_boostWeightSubalgebra /-- The homogeneous span contains the whole fermionic factor once it contains the generators. -/ private lemma inclL_mem_boostWeightSubalgebra - (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra i) - (b : LeptonSinglet.JetAlgebra) : inclL b ∈ boostWeightSubalgebra i := by + (h : ∀ j : JetGenerators, [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i) + (b : LeptonSinglet.JetAlgebra) : inclL b ∈ BoostWeight.subalgebra repLorentzGroup i := by have hι : ∀ m : LeptonSinglet.JetComponentSpace, - inclL (ExteriorAlgebra.ι ℂ m) ∈ boostWeightSubalgebra i := by + inclL (ExteriorAlgebra.ι ℂ m) ∈ BoostWeight.subalgebra repLorentzGroup i := by intro m have hm : m ∈ Submodule.span ℂ (Set.range LeptonSinglet.JetComponentSpace.basis) := by rw [LeptonSinglet.JetComponentSpace.basis.span_eq] @@ -525,7 +479,8 @@ private lemma inclL_mem_boostWeightSubalgebra /-- Once every generator is a finite sum of boost eigenvectors, so is every element: the homogeneous elements then span the whole jet algebra. -/ theorem boostWeightSubalgebra_eq_top_of_forall_ofGenerator - (h : ∀ j : JetGenerators, [j]ₐ ∈ boostWeightSubalgebra i) : boostWeightSubalgebra i = ⊤ := by + (h : ∀ j : JetGenerators, [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i) : + BoostWeight.subalgebra repLorentzGroup i = ⊤ := by refine Algebra.eq_top_iff.mpr fun x => ?_ induction x using JetAlgebra.induction_on with | zero => exact Subalgebra.zero_mem _ @@ -548,8 +503,8 @@ structure of section D they make it a graded algebra three times over. /-- Every generator is a finite sum of boost eigenvectors, for every axis. -/ theorem ofGenerator_mem_boostWeightSubalgebra (i : Fin 3) (j : JetGenerators) : - [j]ₐ ∈ boostWeightSubalgebra i := by - rw [mem_boostWeightSubalgebra, BoostWeight.iSup_boostWeightSubmodule_eq_top repLorentzGroup] + [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i := by + rw [BoostWeight.mem_subalgebra, BoostWeight.iSup_boostWeightSubmodule_eq_top repLorentzGroup] trivial /-! diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index f1c928864..db1e953ac 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -25,8 +25,9 @@ algebra as an internal direct sum, grade it as a graded algebra, and support the projections `boostProj` together with their calculus: how projections interact with submodules, weight-shifting operators, and products. -The section-A transports (`isGraded_tprod`, `isGraded_prod`, `isGraded_symmetricAlgebra`, -`isGraded_exteriorAlgebra`, `isGraded_baseChange`, `isGraded_of_isGraded_two`) are the tools +The section-A transports (`weightSpan_tprod_eq_top`, `weightSpan_prod_eq_top`, +`weightSpan_symmetricAlgebra_eq_top`, `weightSpan_exteriorAlgebra_eq_top`, +`weightSpan_baseChange_eq_top`, `weightSpan_eq_top_of_two`) are the tools for establishing `IsBoostGraded` for a concrete algebra, by descending to the spaces it is built from. @@ -44,7 +45,8 @@ open Matrix MatrixGroups TensorProduct The descent to the component spaces is uniform, so it is carried out once here for an arbitrary representation. The weight spaces are defined exactly as `boostWeightSubmodule` is, and -`IsGraded` says that they span. The point of the section is that `IsGraded` propagates along +`weightSpan rep i = ⊤` says that they span. The point of the section is that this condition +propagates along every construction the jet algebra is built from: tensor products, products, symmetric algebras, exterior algebras and base change. The recursion bottoms out at a finite-dimensional space with an eigenbasis, where the light-cone combinations do the work. @@ -78,9 +80,6 @@ lemma mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {i : Fin 3} def weightSpan (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Submodule K M := ⨆ w, boostWeightSubmodule rep i w -/-- A representation is boost-graded when its weight spaces span. -/ -def IsGraded (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Prop := weightSpan rep i = ⊤ - /-- A representation of `SL(2,ℂ)` on an algebra is **boost-graded** when it acts by algebra automorphisms and its boost-weight spaces span, along every coordinate axis. This is the interface behind the boost-weight grading: given it, the weight spaces decompose the algebra @@ -90,28 +89,22 @@ class IsBoostGraded {A : Type*} [Ring A] [Algebra K A] (rep : Representation K SL(2,ℂ) A) : Prop where apply_one : ∀ Λ, rep Λ 1 = 1 apply_mul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y - isGraded : ∀ i : Fin 3, IsGraded rep i + weightSpan_eq_top : ∀ i : Fin 3, weightSpan rep i = ⊤ lemma mem_weightSpan_of_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {w : ℤ} {x : M} (h : x ∈ boostWeightSubmodule rep i w) : x ∈ weightSpan rep i := Submodule.mem_iSup_of_mem w h -lemma mem_weightSpan_of_isGraded {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep i) (x : M) : - x ∈ weightSpan rep i := by rw [IsGraded] at h; rw [h]; trivial - -lemma isGraded_iff_forall_mem {rep : Representation K SL(2,ℂ) M} : - IsGraded rep i ↔ ∀ x, x ∈ weightSpan rep i := - ⟨mem_weightSpan_of_isGraded, fun h => eq_top_iff.mpr fun x _ => h x⟩ - /-- A representation with a spanning family of vectors in the weight span is graded. -/ -lemma isGraded_of_span {rep : Representation K SL(2,ℂ) M} {S : Set M} - (hS : Submodule.span K S = ⊤) (h : ∀ x ∈ S, x ∈ weightSpan rep i) : IsGraded rep i := +lemma weightSpan_eq_top_of_span {rep : Representation K SL(2,ℂ) M} {S : Set M} + (hS : Submodule.span K S = ⊤) (h : ∀ x ∈ S, x ∈ weightSpan rep i) : + weightSpan rep i = ⊤ := eq_top_iff.mpr (hS ▸ Submodule.span_le.mpr h) /-- A representation with a basis of vectors lying in the weight span is graded. -/ -lemma isGraded_of_basis {ι : Type*} {rep : Representation K SL(2,ℂ) M} (b : Module.Basis ι K M) - (h : ∀ n, b n ∈ weightSpan rep i) : IsGraded rep i := - isGraded_of_span b.span_eq (by rintro _ ⟨n, rfl⟩; exact h n) +lemma weightSpan_eq_top_of_basis {ι : Type*} {rep : Representation K SL(2,ℂ) M} + (b : Module.Basis ι K M) (h : ∀ n, b n ∈ weightSpan rep i) : weightSpan rep i = ⊤ := + weightSpan_eq_top_of_span b.span_eq (by rintro _ ⟨n, rfl⟩; exact h n) /-! @@ -128,15 +121,16 @@ lemma tmul_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {rep₂ simp only [TensorProduct.tmul_smul, TensorProduct.smul_tmul', smul_smul] rw [← zpow_add₀ (algebraMap_ne_zero (K := K) ht), add_comm b a] -lemma isGraded_tprod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.tprod rep₂) i := by - refine isGraded_iff_forall_mem.mpr fun z => ?_ +lemma weightSpan_tprod_eq_top {rep : Representation K SL(2,ℂ) M} + {rep₂ : Representation K SL(2,ℂ) N} (h₁ : weightSpan rep i = ⊤) + (h₂ : weightSpan rep₂ i = ⊤) : weightSpan (rep.tprod rep₂) i = ⊤ := by + refine Submodule.eq_top_iff'.mpr fun z => ?_ induction z using TensorProduct.induction_on with | zero => exact Submodule.zero_mem _ | add u v hu hv => exact Submodule.add_mem _ hu hv | tmul x y => - have hx := mem_weightSpan_of_isGraded h₁ x - have hy := mem_weightSpan_of_isGraded h₂ y + have hx := Submodule.eq_top_iff'.mp h₁ x + have hy := Submodule.eq_top_iff'.mp h₂ y induction hx using Submodule.iSup_induction' with | mem a x' hx' => induction hy using Submodule.iSup_induction' with @@ -167,11 +161,12 @@ lemma inr_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {rep₂ show ((rep _ 0, rep₂ _ y) : M × N) = _ rw [map_zero, hy t ht, Prod.smul_mk, smul_zero] -lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representation K SL(2,ℂ) N} - (h₁ : IsGraded rep i) (h₂ : IsGraded rep₂ i) : IsGraded (rep.prod rep₂) i := by +lemma weightSpan_prod_eq_top {rep : Representation K SL(2,ℂ) M} + {rep₂ : Representation K SL(2,ℂ) N} (h₁ : weightSpan rep i = ⊤) + (h₂ : weightSpan rep₂ i = ⊤) : weightSpan (rep.prod rep₂) i = ⊤ := by have hleft : ∀ x : M, ((x, (0 : N))) ∈ weightSpan (rep.prod rep₂) i := by intro x - have hx := mem_weightSpan_of_isGraded h₁ x + have hx := Submodule.eq_top_iff'.mp h₁ x induction hx using Submodule.iSup_induction' with | mem a u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (inl_mem_boostWeightSubmodule hu) | zero => exact Submodule.zero_mem _ @@ -180,14 +175,14 @@ lemma isGraded_prod {rep : Representation K SL(2,ℂ) M} {rep₂ : Representatio exact Submodule.add_mem _ ihu ihv have hright : ∀ y : N, (((0 : M), y)) ∈ weightSpan (rep.prod rep₂) i := by intro y - have hy := mem_weightSpan_of_isGraded h₂ y + have hy := Submodule.eq_top_iff'.mp h₂ y induction hy using Submodule.iSup_induction' with | mem a u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (inr_mem_boostWeightSubmodule hu) | zero => exact Submodule.zero_mem _ | add u v _ _ ihu ihv => rw [show (((0 : M), u + v)) = (((0 : M), u)) + (((0 : M), v)) from by ext <;> simp] exact Submodule.add_mem _ ihu ihv - refine isGraded_iff_forall_mem.mpr fun z => ?_ + refine Submodule.eq_top_iff'.mpr fun z => ?_ rw [show z = ((z.1, (0 : N))) + (((0 : M), z.2)) from by ext <;> simp] exact Submodule.add_mem _ (hleft z.1) (hright z.2) @@ -229,7 +224,7 @@ lemma algebraMap_mem_weightSpan {rep : Representation K SL(2,ℂ) A} exact Submodule.smul_mem _ _ (mem_weightSpan_of_mem_boostWeightSubmodule (one_mem_boostWeightSubmodule hone)) /-- A symmetric algebra is boost-graded as soon as its degree-one part is. -/ -lemma isGraded_symmetricAlgebra {V : Type*} [AddCommGroup V] [Module K V] +lemma weightSpan_symmetricAlgebra_eq_top {V : Type*} [AddCommGroup V] [Module K V] {repV : Representation K SL(2,ℂ) V} {repA : Representation K SL(2,ℂ) (SymmetricAlgebra K V)} (hone : ∀ Λ, repA Λ 1 = 1) @@ -237,12 +232,12 @@ lemma isGraded_symmetricAlgebra {V : Type*} [AddCommGroup V] [Module K V] repA Λ (x * y) = repA Λ x * repA Λ y) (hι : ∀ (Λ : SL(2,ℂ)) (x : V), repA Λ (SymmetricAlgebra.ι K V x) = SymmetricAlgebra.ι K V (repV Λ x)) - (hV : IsGraded repV i) : IsGraded repA i := by - refine isGraded_iff_forall_mem.mpr fun x => ?_ + (hV : weightSpan repV i = ⊤) : weightSpan repA i = ⊤ := by + refine Submodule.eq_top_iff'.mpr fun x => ?_ induction x using SymmetricAlgebra.induction with | algebraMap r => exact algebraMap_mem_weightSpan hone r | ι v => - have hv := mem_weightSpan_of_isGraded hV v + have hv := Submodule.eq_top_iff'.mp hV v induction hv using Submodule.iSup_induction' with | mem a u hu => refine mem_weightSpan_of_mem_boostWeightSubmodule (w := a) fun t ht => ?_ @@ -253,7 +248,7 @@ lemma isGraded_symmetricAlgebra {V : Type*} [AddCommGroup V] [Module K V] | add u v ihu ihv => exact Submodule.add_mem _ ihu ihv /-- An exterior algebra is boost-graded as soon as its degree-one part is. -/ -lemma isGraded_exteriorAlgebra {V : Type*} [AddCommGroup V] [Module K V] +lemma weightSpan_exteriorAlgebra_eq_top {V : Type*} [AddCommGroup V] [Module K V] {repV : Representation K SL(2,ℂ) V} {repA : Representation K SL(2,ℂ) (ExteriorAlgebra K V)} (hone : ∀ Λ, repA Λ 1 = 1) @@ -261,12 +256,12 @@ lemma isGraded_exteriorAlgebra {V : Type*} [AddCommGroup V] [Module K V] repA Λ (x * y) = repA Λ x * repA Λ y) (hι : ∀ (Λ : SL(2,ℂ)) (x : V), repA Λ (ExteriorAlgebra.ι K x) = ExteriorAlgebra.ι K (repV Λ x)) - (hV : IsGraded repV i) : IsGraded repA i := by - refine isGraded_iff_forall_mem.mpr fun x => ?_ + (hV : weightSpan repV i = ⊤) : weightSpan repA i = ⊤ := by + refine Submodule.eq_top_iff'.mpr fun x => ?_ induction x using ExteriorAlgebra.induction with | algebraMap r => exact algebraMap_mem_weightSpan hone r | ι v => - have hv := mem_weightSpan_of_isGraded hV v + have hv := Submodule.eq_top_iff'.mp hV v induction hv using Submodule.iSup_induction' with | mem a u hu => refine mem_weightSpan_of_mem_boostWeightSubmodule (w := a) fun t ht => ?_ @@ -285,11 +280,11 @@ lemma isGraded_exteriorAlgebra {V : Type*} [AddCommGroup V] [Module K V] /-- A space with a basis indexed by spacetime directions transforming by the columns of the Lorentz matrix is boost-graded: the light-cone combinations `b₀ ∓ b₃` are eigenvectors of weight `±2` and the transverse directions are invariant. -/ -lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} +lemma weightSpan_eq_top_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} (b : Module.Basis (Fin 1 ⊕ Fin 3) K M) (h : ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), rep Λ (b μ) = ∑ j, algebraMap ℝ K ((Lorentz.SL2C.toLorentzGroup Λ).1 j μ) • b j) : - IsGraded rep 2 := by + weightSpan rep 2 = ⊤ := by haveI : CharZero K := charZero_of_injective_algebraMap (algebraMap ℝ K).injective have key : ∀ (t : ℝ) (ht : t ≠ 0) (μ : Fin 1 ⊕ Fin 3), rep (boostAxis 2 t ht) (b μ) = @@ -320,7 +315,7 @@ lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} rw [key t ht] simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, zpow_zero] - refine isGraded_of_basis b fun μ => ?_ + refine weightSpan_eq_top_of_basis b fun μ => ?_ match μ with | Sum.inl 0 => rw [show b (Sum.inl 0) = (2⁻¹ : K) • ((b (Sum.inl 0) - b (Sum.inr 2)) @@ -341,22 +336,22 @@ lemma isGraded_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} -/ -lemma isGraded_baseChange {A : Type*} [AddCommGroup A] [Module ℝ A] +lemma weightSpan_baseChange_eq_top {A : Type*} [AddCommGroup A] [Module ℝ A] {repR : Representation ℝ SL(2,ℂ) A} {repC : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] A)} (h : ∀ (Λ : SL(2,ℂ)) (c : ℂ) (y : A), repC Λ (c ⊗ₜ[ℝ] y) = c ⊗ₜ[ℝ] repR Λ y) - (hR : IsGraded repR i) : IsGraded repC i := by + (hR : weightSpan repR i = ⊤) : weightSpan repC i = ⊤ := by have htmul : ∀ (c : ℂ) (w : ℤ) (y : A), y ∈ boostWeightSubmodule repR i w → (c ⊗ₜ[ℝ] y : ℂ ⊗[ℝ] A) ∈ boostWeightSubmodule repC i w := by intro c w y hy t ht rw [h, hy t ht, TensorProduct.tmul_smul, show ((algebraMap ℝ ℝ) t) ^ w = t ^ w from by simp, ← algebraMap_smul (R := ℝ) ℂ (t ^ w) (c ⊗ₜ[ℝ] y), map_zpow₀] - refine isGraded_iff_forall_mem.mpr fun z => ?_ + refine Submodule.eq_top_iff'.mpr fun z => ?_ induction z using TensorProduct.induction_on with | zero => exact Submodule.zero_mem _ | add u v hu hv => exact Submodule.add_mem _ hu hv | tmul c y => - have hy := mem_weightSpan_of_isGraded hR y + have hy := Submodule.eq_top_iff'.mp hR y induction hy using Submodule.iSup_induction' with | mem w u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (htmul c w u hu) | zero => rw [TensorProduct.tmul_zero]; exact Submodule.zero_mem _ @@ -369,9 +364,10 @@ lemma isGraded_baseChange {A : Type*} [AddCommGroup A] [Module ℝ A] -/ -/-- The axis boosts are conjugate, so being graded for one of them is being graded for all. -/ -lemma isGraded_of_isGraded_two {rep : Representation K SL(2,ℂ) M} (h : IsGraded rep 2) - (i : Fin 3) : IsGraded rep i := by +/-- The axis boosts are conjugate, so the weight spaces span along every axis as soon as they + span along the `z`-axis. -/ +lemma weightSpan_eq_top_of_two {rep : Representation K SL(2,ℂ) M} (h : weightSpan rep 2 = ⊤) + (i : Fin 3) : weightSpan rep i = ⊤ := by obtain ⟨R, hR⟩ := exists_conj_boostAxis i have hsurj : ∀ x : M, rep R (rep R⁻¹ x) = x := by intro x @@ -380,9 +376,9 @@ lemma isGraded_of_isGraded_two {rep : Representation K SL(2,ℂ) M} (h : IsGrade intro w u hu t ht rw [← Module.End.mul_apply, ← map_mul, hR t ht, inv_mul_cancel_right, map_mul, Module.End.mul_apply, hu t ht, map_smul] - refine isGraded_iff_forall_mem.mpr fun x => ?_ + refine Submodule.eq_top_iff'.mpr fun x => ?_ obtain ⟨y, rfl⟩ : ∃ y, rep R y = x := ⟨rep R⁻¹ x, hsurj x⟩ - have hy := mem_weightSpan_of_isGraded h y + have hy := Submodule.eq_top_iff'.mp h y induction hy using Submodule.iSup_induction' with | mem w u hu => exact mem_weightSpan_of_mem_boostWeightSubmodule (hmap w u hu) | zero => rw [map_zero]; exact Submodule.zero_mem _ @@ -540,7 +536,7 @@ theorem isInternal_iff : /-- The homogeneous elements of a boost-graded representation span, along every axis. -/ theorem iSup_boostWeightSubmodule_eq_top [IsBoostGraded rep] : (⨆ k, boostWeightSubmodule rep i k) = ⊤ := - IsBoostGraded.isGraded (rep := rep) i + IsBoostGraded.weightSpan_eq_top (rep := rep) i /-- **The boost weight grades the algebra.** For each axis the weight spaces decompose a boost-graded representation as an internal direct sum. -/ From a345d497f2de1e29e6578394b6bf5f6aa6415e77 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 13 Aug 2026 06:40:24 +0100 Subject: [PATCH 136/254] feat: add IsLorentzDeriv --- Physlib/Relativity/IsLorentzDeriv.lean | 56 ++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 Physlib/Relativity/IsLorentzDeriv.lean diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean new file mode 100644 index 000000000..1679e5d57 --- /dev/null +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Boosts.WeightGrading +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.RingTheory.GradedAlgebra.Basic +public import Mathlib.Algebra.DirectSum.Internal +public import Mathlib.LinearAlgebra.Eigenspace.Basic +public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Class IsLorentzDeriv + +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups TensorProduct + +variable {A : Type} [Ring A] [Algebra ℂ A] + +class IsLorentzDeriv (rep : Representation ℂ SL(2,ℂ) A) (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) where + rep_deriv {Λ μ x} : rep Λ (D μ x) = ∑ a, (SL2C.toLorentzGroup Λ).1 a μ • D a (rep Λ x) + +namespace IsLorentzDeriv + +/-! + +## Light cone derivatives + +-/ + +def lightConePlus (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) : A →ₗ[ℂ] A := + D (Sum.inl 0) - D (Sum.inr i) + +def lightConeMinus (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) : A →ₗ[ℂ] A := + D (Sum.inl 0) + D (Sum.inr i) + +/-! + +## Relationship to boost weights + +-/ + +end IsLorentzDeriv + +end Lorentz + +end From ff4c9fb0f3b38e5dac108fae326c666d1127aa48 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 13 Aug 2026 08:05:54 +0100 Subject: [PATCH 137/254] feat: IsLorentzDeriv more results --- .../JetAlgebra/Boosts/FieldStrength.lean | 28 +- .../JetAlgebra/Grading/BoostWeight.lean | 323 +----------------- Physlib/Relativity/IsLorentzDeriv.lean | 245 ++++++++++++- 3 files changed, 267 insertions(+), 329 deletions(-) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean index 716023f53..d01efeffc 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean @@ -17,7 +17,7 @@ public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTer namespace LeptonGaugeSector open TensorProduct StandardModel Lorentz open scoped minkowskiMatrix PauliMatrix Pointwise -open Matrix MatrixGroups BoostWeight +open Matrix MatrixGroups BoostWeight IsLorentzDeriv namespace JetAlgebra @@ -420,31 +420,31 @@ lemma boostProj_z_map_fieldStrengthDeriv_jetDeriv_span_eq : let V0 := Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} D2V0.map (boostProj repLorentzGroup 2 0) = ((V0.map (boostProj repLorentzGroup 2 0)).map - (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2))).map - (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + (lightConePlus jetDeriv 2)).map + (lightConeMinus jetDeriv 2) + ((V0.map (boostProj repLorentzGroup 2 (-2))).map - (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 0)) + (lightConePlus jetDeriv 2)).map (jetDeriv (Sum.inr 0)) + ((V0.map (boostProj repLorentzGroup 2 (-2))).map - (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 1)) + (lightConePlus jetDeriv 2)).map (jetDeriv (Sum.inr 1)) + ((V0.map (boostProj repLorentzGroup 2 0)).map - (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2))).map - (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + (lightConeMinus jetDeriv 2)).map + (lightConePlus jetDeriv 2) + ((V0.map (boostProj repLorentzGroup 2 2)).map - (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 0)) + (lightConeMinus jetDeriv 2)).map (jetDeriv (Sum.inr 0)) + ((V0.map (boostProj repLorentzGroup 2 2)).map - (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2))).map (jetDeriv (Sum.inr 1)) + (lightConeMinus jetDeriv 2)).map (jetDeriv (Sum.inr 1)) + ((V0.map (boostProj repLorentzGroup 2 (-2))).map (jetDeriv (Sum.inr 0))).map - (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + (lightConePlus jetDeriv 2) + ((V0.map (boostProj repLorentzGroup 2 2)).map (jetDeriv (Sum.inr 0))).map - (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + (lightConeMinus jetDeriv 2) + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 0))).map (jetDeriv (Sum.inr 0)) + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 0))).map (jetDeriv (Sum.inr 1)) + ((V0.map (boostProj repLorentzGroup 2 (-2))).map (jetDeriv (Sum.inr 1))).map - (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) + (lightConePlus jetDeriv 2) + ((V0.map (boostProj repLorentzGroup 2 2)).map (jetDeriv (Sum.inr 1))).map - (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) + (lightConeMinus jetDeriv 2) + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 1))).map (jetDeriv (Sum.inr 0)) + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 1))).map @@ -455,7 +455,7 @@ lemma boostProj_z_map_fieldStrengthDeriv_jetDeriv_span_eq : boostProj_z_map_fieldStrengthDeriv_span_of_ne rw [show D2V0 = ∑ α, (∑ β, V0.map (jetDeriv β)).map (jetDeriv α) from fieldStrengthDeriv_two_deriv_eq_map_span] - simp only [boostProj_map_submodule_jetDeriv_z, + simp only [boostProj_map_submodule_z, show (0 : ℤ) - 2 = -2 from by decide, show (0 : ℤ) + 2 = 2 from by decide, show (-2 : ℤ) - 2 = -4 from by decide, show (-2 : ℤ) + 2 = 0 from by decide, show (2 : ℤ) - 2 = 0 from by decide, show (2 : ℤ) + 2 = 4 from by decide] diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index 174b2a550..5ac1d9df8 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDim public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.JetDerivLorentz /-! @@ -535,323 +536,19 @@ lemma boostProj_of_isInvariant_ne {i : Fin 3} {k : ℤ} (hk : (0 : ℤ) ≠ k) { /-! -## L. The projections and the jet derivatives +## L. The jet derivatives are a Lorentz derivative -The boost-weight parts of the span of all jet derivatives of a submodule. Along the axis `i` -the four derivative directions regroup into the light-cone combinations `∂_0 ∓ ∂_i`, which -shift every boost weight by `±2`, and the two transverse derivatives, which preserve it. So -the weight-`k` part of `∑ α, ∂_α V` is exactly the light-cone derivatives of the -weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives of its weight-`k` -part. Everything rests on the covariance `repLorentzGroup_jetDeriv` of the jet derivative, -so no bosonicity assumption is needed. +The covariance `repLorentzGroup_jetDeriv` makes the jet derivatives an instance of +`Lorentz.IsLorentzDeriv`. The weight shifts of the light-cone combinations, the weight +preservation of the transverse derivatives, and the boost projections of the span of all +jet derivatives of a submodule (`IsLorentzDeriv.boostProj_map_submodule_x/y/z`) are +inherited from the general theory. -/ -section - -set_option linter.unusedSimpArgs false - -/-- A transverse derivative leaves the `x`-boost weight alone. -/ -private lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 0) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : - jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k := by - intro t ht - rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] - fin_cases j - · exact absurd rfl hj - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - -/-- A transverse derivative leaves the `y`-boost weight alone. -/ -private lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 1) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : - jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k := by - intro t ht - rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] - fin_cases j - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - · exact absurd rfl hj - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - -/-- A transverse derivative leaves the `z`-boost weight alone. -/ -private lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {j : Fin 3} (hj : j ≠ 2) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : - jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k := by - intro t ht - rw [repLorentzGroup_jetDeriv, hx t ht, algebraMap_real_complex] - fin_cases j - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - · exact absurd rfl hj - -/-- The light-cone derivative `∂_0 - ∂_x` raises the `x`-boost weight by two. -/ -private lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k + 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] - rw [algebraMap_real_complex, zpow_add₀ ht'] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- The light-cone derivative `∂_0 + ∂_x` lowers the `x`-boost weight by two. -/ -private lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k - 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] - rw [algebraMap_real_complex, zpow_sub₀ ht'] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- The light-cone derivative `∂_0 - ∂_y` raises the `y`-boost weight by two. -/ -private lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k + 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] - rw [algebraMap_real_complex, zpow_add₀ ht'] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- The light-cone derivative `∂_0 + ∂_y` lowers the `y`-boost weight by two. -/ -private lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k - 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] - rw [algebraMap_real_complex, zpow_sub₀ ht'] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- The light-cone derivative `∂_0 - ∂_z` raises the `z`-boost weight by two. -/ -private lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k + 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] - rw [algebraMap_real_complex, zpow_add₀ ht'] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- The light-cone derivative `∂_0 + ∂_z` lowers the `z`-boost weight by two. -/ -private lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k - 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_jetDeriv, repLorentzGroup_jetDeriv, hx t ht] - rw [algebraMap_real_complex, zpow_sub₀ ht'] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- An operator shifting every boost weight by `k - l` carries the weight-`l` component to - the weight-`k` component: the two sides agree on every homogeneous piece, and the pieces - span. -/ -private lemma boostProj_comm_aux {i : Fin 3} {D : JetAlgebra →ₗ[ℂ] JetAlgebra} (k l : ℤ) - (hD : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → - D y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (w + k - l)) - (x : JetAlgebra) : - BoostWeight.boostProj repLorentzGroup i k (D x) = D (BoostWeight.boostProj repLorentzGroup i l x) := - BoostWeight.boostProj_comm repLorentzGroup k l hD x - -/-- Two composites agreeing on a submodule have the same double image. -/ -private lemma map_map_eq_of_forall_mem {f g f' g' : JetAlgebra →ₗ[ℂ] JetAlgebra} - {V : Submodule ℂ JetAlgebra} (h : ∀ x ∈ V, g (f x) = g' (f' x)) : - (V.map f).map g = (V.map f').map g' := by - refine le_antisymm ?_ ?_ - · rintro _ ⟨_, ⟨v, hv, rfl⟩, rfl⟩ - exact ⟨f' v, ⟨v, hv, rfl⟩, (h v hv).symm⟩ - · rintro _ ⟨_, ⟨v, hv, rfl⟩, rfl⟩ - exact ⟨f v, ⟨v, hv, rfl⟩, h v hv⟩ - -/-- The images under `∂_0` and `∂_i` span the same submodule as the images under the two - light-cone derivatives `∂_0 ∓ ∂_i`. -/ -private lemma map_jetDeriv_pair_eq_lightCone (i : Fin 3) (V : Submodule ℂ JetAlgebra) : - V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr i)) = - V.map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) + - V.map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) := by - rw [Submodule.add_eq_sup, Submodule.add_eq_sup] - refine le_antisymm (sup_le ?_ ?_) (sup_le ?_ ?_) - · rintro _ ⟨v, hv, rfl⟩ - rw [show jetDeriv (Sum.inl 0) v = - (2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) v + - (2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) v from by - simp only [LinearMap.sub_apply, LinearMap.add_apply]; module] - exact add_mem (Submodule.smul_mem _ _ (Submodule.mem_sup_left ⟨v, hv, rfl⟩)) - (Submodule.smul_mem _ _ (Submodule.mem_sup_right ⟨v, hv, rfl⟩)) - · rintro _ ⟨v, hv, rfl⟩ - rw [show jetDeriv (Sum.inr i) v = - (-2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) v + - (2⁻¹ : ℂ) • (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) v from by - simp only [LinearMap.sub_apply, LinearMap.add_apply]; module] - exact add_mem (Submodule.smul_mem _ _ (Submodule.mem_sup_left ⟨v, hv, rfl⟩)) - (Submodule.smul_mem _ _ (Submodule.mem_sup_right ⟨v, hv, rfl⟩)) - · rintro _ ⟨v, hv, rfl⟩ - rw [LinearMap.sub_apply] - exact sub_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) - (Submodule.mem_sup_right ⟨v, hv, rfl⟩) - · rintro _ ⟨v, hv, rfl⟩ - rw [LinearMap.add_apply] - exact add_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) - (Submodule.mem_sup_right ⟨v, hv, rfl⟩) - -/-- The engine behind the three axis lemmas: given the weight shifts of the two light-cone - derivatives and the weight preservation of the two transverse ones, the projection of the - four derivative images redistributes onto the shifted projections of `V`. -/ -private lemma boostProj_map_submodule_aux {i t₁ t₂ : Fin 3} (k : ℤ) - (V : Submodule ℂ JetAlgebra) - (hpos : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → - jetDeriv (Sum.inl 0) y - jetDeriv (Sum.inr i) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (w + 2)) - (hneg : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → - jetDeriv (Sum.inl 0) y + jetDeriv (Sum.inr i) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (w - 2)) - (ht₁ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → - jetDeriv (Sum.inr t₁) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w) - (ht₂ : ∀ {w : ℤ} {y : JetAlgebra}, y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w → - jetDeriv (Sum.inr t₂) y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i w) : - (V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr i)) + - V.map (jetDeriv (Sum.inr t₁)) + V.map (jetDeriv (Sum.inr t₂))).map (BoostWeight.boostProj repLorentzGroup i k) = - (V.map (BoostWeight.boostProj repLorentzGroup i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) + - (V.map (BoostWeight.boostProj repLorentzGroup i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) + - (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₁)) + - (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₂)) := by - have hlcp : (V.map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i))).map (BoostWeight.boostProj repLorentzGroup i k) = - (V.map (BoostWeight.boostProj repLorentzGroup i (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i)) := by - refine map_map_eq_of_forall_mem fun v _ => ?_ - refine boostProj_comm_aux k (k - 2) (fun {w} {y} hyw => ?_) v - rw [show w + k - (k - 2) = w + 2 from by ring] - simp only [LinearMap.sub_apply] - exact hpos hyw - have hlcn : (V.map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i))).map (BoostWeight.boostProj repLorentzGroup i k) = - (V.map (BoostWeight.boostProj repLorentzGroup i (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i)) := by - refine map_map_eq_of_forall_mem fun v _ => ?_ - refine boostProj_comm_aux k (k + 2) (fun {w} {y} hyw => ?_) v - rw [show w + k - (k + 2) = w - 2 from by ring] - simp only [LinearMap.add_apply] - exact hneg hyw - have hd₁ : (V.map (jetDeriv (Sum.inr t₁))).map (BoostWeight.boostProj repLorentzGroup i k) = - (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₁)) := by - refine map_map_eq_of_forall_mem fun v _ => ?_ - refine boostProj_comm_aux k k (fun {w} {y} hyw => ?_) v - rw [show w + k - k = w from by ring] - exact ht₁ hyw - have hd₂ : (V.map (jetDeriv (Sum.inr t₂))).map (BoostWeight.boostProj repLorentzGroup i k) = - (V.map (BoostWeight.boostProj repLorentzGroup i k)).map (jetDeriv (Sum.inr t₂)) := by - refine map_map_eq_of_forall_mem fun v _ => ?_ - refine boostProj_comm_aux k k (fun {w} {y} hyw => ?_) v - rw [show w + k - k = w from by ring] - exact ht₂ hyw - rw [map_jetDeriv_pair_eq_lightCone] - simp only [Submodule.add_eq_sup, Submodule.map_sup, hlcp, hlcn, hd₁, hd₂] - -end - -/-- **The `x`-boost projections of the derivative span.** The weight-`k` part of the span of - all jet derivatives of `V` is spanned by the light-cone derivatives `∂_0 ∓ ∂_x` of the - weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_y`, `∂_z` of its - weight-`k` part. -/ -lemma boostProj_map_submodule_jetDeriv_x (k : ℤ) (V : Submodule ℂ JetAlgebra) : - (∑ α, V.map (jetDeriv α)).map (BoostWeight.boostProj repLorentzGroup 0 k) = - (V.map (BoostWeight.boostProj repLorentzGroup 0 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 0)) - + (V.map (BoostWeight.boostProj repLorentzGroup 0 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 0)) - + (V.map (BoostWeight.boostProj repLorentzGroup 0 k)).map (jetDeriv (Sum.inr 1)) - + (V.map (BoostWeight.boostProj repLorentzGroup 0 k)).map (jetDeriv (Sum.inr 2)) := by - rw [show (∑ α, V.map (jetDeriv α)) = - V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 0)) + - V.map (jetDeriv (Sum.inr 1)) + V.map (jetDeriv (Sum.inr 2)) from by - rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] - exact boostProj_map_submodule_aux k V - (fun hyw => jetDeriv_lightConeX_pos_mem hyw) - (fun hyw => jetDeriv_lightConeX_neg_mem hyw) - (fun hyw => jetDeriv_transverseX_mem (by decide) hyw) - (fun hyw => jetDeriv_transverseX_mem (by decide) hyw) - -/-- **The `y`-boost projections of the derivative span.** The weight-`k` part of the span of - all jet derivatives of `V` is spanned by the light-cone derivatives `∂_0 ∓ ∂_y` of the - weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_x`, `∂_z` of its - weight-`k` part. -/ -lemma boostProj_map_submodule_jetDeriv_y (k : ℤ) (V : Submodule ℂ JetAlgebra) : - (∑ α, V.map (jetDeriv α)).map (BoostWeight.boostProj repLorentzGroup 1 k) = - (V.map (BoostWeight.boostProj repLorentzGroup 1 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 1)) - + (V.map (BoostWeight.boostProj repLorentzGroup 1 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 1)) - + (V.map (BoostWeight.boostProj repLorentzGroup 1 k)).map (jetDeriv (Sum.inr 0)) - + (V.map (BoostWeight.boostProj repLorentzGroup 1 k)).map (jetDeriv (Sum.inr 2)) := by - rw [show (∑ α, V.map (jetDeriv α)) = - V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 1)) + - V.map (jetDeriv (Sum.inr 0)) + V.map (jetDeriv (Sum.inr 2)) from by - rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] - exact boostProj_map_submodule_aux k V - (fun hyw => jetDeriv_lightConeY_pos_mem hyw) - (fun hyw => jetDeriv_lightConeY_neg_mem hyw) - (fun hyw => jetDeriv_transverseY_mem (by decide) hyw) - (fun hyw => jetDeriv_transverseY_mem (by decide) hyw) - -/-- **The `z`-boost projections of the derivative span.** The weight-`k` part of the span of - all jet derivatives of `V` is spanned by the light-cone derivatives `∂_0 ∓ ∂_z` of the - weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives `∂_x`, `∂_y` of its - weight-`k` part. -/ -lemma boostProj_map_submodule_jetDeriv_z (k : ℤ) (V : Submodule ℂ JetAlgebra) : - (∑ α, V.map (jetDeriv α)).map (BoostWeight.boostProj repLorentzGroup 2 k) = - (V.map (BoostWeight.boostProj repLorentzGroup 2 (k - 2))).map (jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr 2)) - + (V.map (BoostWeight.boostProj repLorentzGroup 2 (k + 2))).map (jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr 2)) - + (V.map (BoostWeight.boostProj repLorentzGroup 2 k)).map (jetDeriv (Sum.inr 0)) - + (V.map (BoostWeight.boostProj repLorentzGroup 2 k)).map (jetDeriv (Sum.inr 1)) := by - rw [show (∑ α, V.map (jetDeriv α)) = - V.map (jetDeriv (Sum.inl 0)) + V.map (jetDeriv (Sum.inr 2)) + - V.map (jetDeriv (Sum.inr 0)) + V.map (jetDeriv (Sum.inr 1)) from by - rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] - exact boostProj_map_submodule_aux k V - (fun hyw => jetDeriv_lightConeZ_pos_mem hyw) - (fun hyw => jetDeriv_lightConeZ_neg_mem hyw) - (fun hyw => jetDeriv_transverseZ_mem (by decide) hyw) - (fun hyw => jetDeriv_transverseZ_mem (by decide) hyw) +/-- The jet derivatives transform as a Lorentz covector. -/ +instance : IsLorentzDeriv repLorentzGroup jetDeriv where + rep_deriv {Λ μ x} := repLorentzGroup_jetDeriv Λ μ x /-! diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 1679e5d57..c2cea9a20 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -16,6 +16,17 @@ public import Mathlib.RingTheory.TensorProduct.Basic /-! # Class IsLorentzDeriv +A family of operators indexed by the four spacetime directions is a **Lorentz derivative** +when the representation of `SL(2,ℂ)` intertwines it through the columns of the Lorentz +matrix, as the jet derivatives on a jet algebra do. + +Along the `i`-th spatial axis the four operators regroup into the two light-cone +combinations `lightConePlus D i = D_0 - D_i` and `lightConeMinus D i = D_0 + D_i`, which +shift every boost weight by `+2` and `-2` respectively, and the two transverse operators, +which preserve it. Consequently the weight-`k` part of the span of all derivative images of +a submodule redistributes onto the shifted weight projections +(`boostProj_map_submodule_x/y/z`). + -/ @[expose] public section @@ -27,19 +38,29 @@ open Matrix MatrixGroups TensorProduct variable {A : Type} [Ring A] [Algebra ℂ A] class IsLorentzDeriv (rep : Representation ℂ SL(2,ℂ) A) (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) where - rep_deriv {Λ μ x} : rep Λ (D μ x) = ∑ a, (SL2C.toLorentzGroup Λ).1 a μ • D a (rep Λ x) + rep_deriv {Λ μ x} : rep Λ (D μ x) = + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • D a (rep Λ x) namespace IsLorentzDeriv +variable {rep : Representation ℂ SL(2,ℂ) A} {D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A} + +/-- The scalar action of a real parameter, in the form the weight condition presents it. -/ +private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl + /-! -## Light cone derivatives +## Light cone derivatives -/ +/-- The light-cone combination `D_0 - D_i`, raising every boost weight along the `i`-th + axis by two (`lightConePlus_mem`). -/ def lightConePlus (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) : A →ₗ[ℂ] A := D (Sum.inl 0) - D (Sum.inr i) +/-- The light-cone combination `D_0 + D_i`, lowering every boost weight along the `i`-th + axis by two (`lightConeMinus_mem`). -/ def lightConeMinus (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) : A →ₗ[ℂ] A := D (Sum.inl 0) + D (Sum.inr i) @@ -49,6 +70,226 @@ def lightConeMinus (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) : A -/ +section + +set_option linter.unusedSimpArgs false + +/-- A transverse Lorentz derivative leaves the boost weight along the `i`-th axis alone. -/ +lemma transverse_mem [IsLorentzDeriv rep D] {i j : Fin 3} (hij : j ≠ i) {k : ℤ} {x : A} + (hx : x ∈ BoostWeight.boostWeightSubmodule rep i k) : + D (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule rep i k := by + intro t ht + rw [rep_deriv, hx t ht, algebraMap_real_complex] + fin_cases i <;> fin_cases j <;> + first + | exact absurd rfl hij + | simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk, + boostAxis_zero, toLorentzGroup_boostXel, boostMatX, + boostAxis_one, toLorentzGroup_boostYel, boostMatY, + boostAxis_two, toLorentzGroup_boostZel, boostMatZ, + Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, map_smul, + Complex.ofReal_zero, zero_smul, Complex.ofReal_one, one_smul, add_zero, zero_add] + +/-- The light-cone combination `D_0 - D_i` raises the boost weight along the `i`-th axis + by two. -/ +lemma lightConePlus_mem [IsLorentzDeriv rep D] {i : Fin 3} {k : ℤ} {x : A} + (hx : x ∈ BoostWeight.boostWeightSubmodule rep i k) : + lightConePlus D i x ∈ BoostWeight.boostWeightSubmodule rep i (k + 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [lightConePlus, LinearMap.sub_apply] + rw [map_sub, rep_deriv, rep_deriv, hx t ht] + rw [algebraMap_real_complex, zpow_add₀ ht'] + fin_cases i + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +/-- The light-cone combination `D_0 + D_i` lowers the boost weight along the `i`-th axis + by two. -/ +lemma lightConeMinus_mem [IsLorentzDeriv rep D] {i : Fin 3} {k : ℤ} {x : A} + (hx : x ∈ BoostWeight.boostWeightSubmodule rep i k) : + lightConeMinus D i x ∈ BoostWeight.boostWeightSubmodule rep i (k - 2) := by + intro t ht + have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [lightConeMinus, LinearMap.add_apply] + rw [map_add, rep_deriv, rep_deriv, hx t ht] + rw [algebraMap_real_complex, zpow_sub₀ ht'] + fin_cases i + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] + simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, + Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, + Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, + Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, + Complex.ofReal_ofNat] + match_scalars <;> (field_simp; ring) + +end + +/-! + +## The boost projections of the span of the derivative images + +-/ + +/-- Two composites agreeing on a submodule have the same double image. -/ +private lemma map_map_eq_of_forall_mem {f g f' g' : A →ₗ[ℂ] A} + {V : Submodule ℂ A} (h : ∀ x ∈ V, g (f x) = g' (f' x)) : + (V.map f).map g = (V.map f').map g' := by + refine le_antisymm ?_ ?_ + · rintro _ ⟨_, ⟨v, hv, rfl⟩, rfl⟩ + exact ⟨f' v, ⟨v, hv, rfl⟩, (h v hv).symm⟩ + · rintro _ ⟨_, ⟨v, hv, rfl⟩, rfl⟩ + exact ⟨f v, ⟨v, hv, rfl⟩, h v hv⟩ + +/-- The images under `D_0` and `D_i` span the same submodule as the images under the two + light-cone combinations. -/ +lemma map_pair_eq_lightCone (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) + (V : Submodule ℂ A) : + V.map (D (Sum.inl 0)) + V.map (D (Sum.inr i)) = + V.map (lightConePlus D i) + V.map (lightConeMinus D i) := by + rw [Submodule.add_eq_sup, Submodule.add_eq_sup] + refine le_antisymm (sup_le ?_ ?_) (sup_le ?_ ?_) + · rintro _ ⟨v, hv, rfl⟩ + rw [show D (Sum.inl 0) v = + (2⁻¹ : ℂ) • lightConePlus D i v + (2⁻¹ : ℂ) • lightConeMinus D i v from by + simp only [lightConePlus, lightConeMinus, LinearMap.sub_apply, LinearMap.add_apply] + module] + exact add_mem (Submodule.smul_mem _ _ (Submodule.mem_sup_left ⟨v, hv, rfl⟩)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right ⟨v, hv, rfl⟩)) + · rintro _ ⟨v, hv, rfl⟩ + rw [show D (Sum.inr i) v = + (-2⁻¹ : ℂ) • lightConePlus D i v + (2⁻¹ : ℂ) • lightConeMinus D i v from by + simp only [lightConePlus, lightConeMinus, LinearMap.sub_apply, LinearMap.add_apply] + module] + exact add_mem (Submodule.smul_mem _ _ (Submodule.mem_sup_left ⟨v, hv, rfl⟩)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right ⟨v, hv, rfl⟩)) + · rintro _ ⟨v, hv, rfl⟩ + simp only [lightConePlus, LinearMap.sub_apply] + exact sub_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) + (Submodule.mem_sup_right ⟨v, hv, rfl⟩) + · rintro _ ⟨v, hv, rfl⟩ + simp only [lightConeMinus, LinearMap.add_apply] + exact add_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) + (Submodule.mem_sup_right ⟨v, hv, rfl⟩) + +/-- The engine behind the three axis lemmas: the projection of the four derivative images + redistributes onto the shifted projections of `V`. -/ +private lemma boostProj_map_submodule_aux [BoostWeight.IsBoostGraded rep] + [IsLorentzDeriv rep D] {i t₁ t₂ : Fin 3} (ht₁ : t₁ ≠ i) (ht₂ : t₂ ≠ i) (k : ℤ) + (V : Submodule ℂ A) : + (V.map (D (Sum.inl 0)) + V.map (D (Sum.inr i)) + V.map (D (Sum.inr t₁)) + + V.map (D (Sum.inr t₂))).map (BoostWeight.boostProj rep i k) = + (V.map (BoostWeight.boostProj rep i (k - 2))).map (lightConePlus D i) + + (V.map (BoostWeight.boostProj rep i (k + 2))).map (lightConeMinus D i) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr t₁)) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr t₂)) := by + have hlcp : (V.map (lightConePlus D i)).map (BoostWeight.boostProj rep i k) = + (V.map (BoostWeight.boostProj rep i (k - 2))).map (lightConePlus D i) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine BoostWeight.boostProj_comm rep k (k - 2) (fun {w} {y} hyw => ?_) v + rw [show w + k - (k - 2) = w + 2 from by ring] + exact lightConePlus_mem hyw + have hlcn : (V.map (lightConeMinus D i)).map (BoostWeight.boostProj rep i k) = + (V.map (BoostWeight.boostProj rep i (k + 2))).map (lightConeMinus D i) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine BoostWeight.boostProj_comm rep k (k + 2) (fun {w} {y} hyw => ?_) v + rw [show w + k - (k + 2) = w - 2 from by ring] + exact lightConeMinus_mem hyw + have hd₁ : (V.map (D (Sum.inr t₁))).map (BoostWeight.boostProj rep i k) = + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr t₁)) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine BoostWeight.boostProj_comm rep k k (fun {w} {y} hyw => ?_) v + rw [show w + k - k = w from by ring] + exact transverse_mem ht₁ hyw + have hd₂ : (V.map (D (Sum.inr t₂))).map (BoostWeight.boostProj rep i k) = + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr t₂)) := by + refine map_map_eq_of_forall_mem fun v _ => ?_ + refine BoostWeight.boostProj_comm rep k k (fun {w} {y} hyw => ?_) v + rw [show w + k - k = w from by ring] + exact transverse_mem ht₂ hyw + rw [map_pair_eq_lightCone] + simp only [Submodule.add_eq_sup, Submodule.map_sup, hlcp, hlcn, hd₁, hd₂] + +/-- **The `x`-boost projections of the span of Lorentz derivatives.** The weight-`k` part of + the span of the four derivative images of `V` is spanned by the light-cone combinations + applied to the weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives of + its weight-`k` part. -/ +lemma boostProj_map_submodule_x [BoostWeight.IsBoostGraded rep] [IsLorentzDeriv rep D] + (k : ℤ) (V : Submodule ℂ A) : + (∑ α, V.map (D α)).map (BoostWeight.boostProj rep 0 k) = + (V.map (BoostWeight.boostProj rep 0 (k - 2))).map (lightConePlus D 0) + + (V.map (BoostWeight.boostProj rep 0 (k + 2))).map (lightConeMinus D 0) + + (V.map (BoostWeight.boostProj rep 0 k)).map (D (Sum.inr 1)) + + (V.map (BoostWeight.boostProj rep 0 k)).map (D (Sum.inr 2)) := by + rw [show (∑ α, V.map (D α)) = + V.map (D (Sum.inl 0)) + V.map (D (Sum.inr 0)) + + V.map (D (Sum.inr 1)) + V.map (D (Sum.inr 2)) from by + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] + exact boostProj_map_submodule_aux (by decide) (by decide) k V + +/-- **The `y`-boost projections of the span of Lorentz derivatives.** As for the `x`-boost, + with the transverse derivatives now `D_x`, `D_z`. -/ +lemma boostProj_map_submodule_y [BoostWeight.IsBoostGraded rep] [IsLorentzDeriv rep D] + (k : ℤ) (V : Submodule ℂ A) : + (∑ α, V.map (D α)).map (BoostWeight.boostProj rep 1 k) = + (V.map (BoostWeight.boostProj rep 1 (k - 2))).map (lightConePlus D 1) + + (V.map (BoostWeight.boostProj rep 1 (k + 2))).map (lightConeMinus D 1) + + (V.map (BoostWeight.boostProj rep 1 k)).map (D (Sum.inr 0)) + + (V.map (BoostWeight.boostProj rep 1 k)).map (D (Sum.inr 2)) := by + rw [show (∑ α, V.map (D α)) = + V.map (D (Sum.inl 0)) + V.map (D (Sum.inr 1)) + + V.map (D (Sum.inr 0)) + V.map (D (Sum.inr 2)) from by + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] + exact boostProj_map_submodule_aux (by decide) (by decide) k V + +/-- **The `z`-boost projections of the span of Lorentz derivatives.** As for the `x`-boost, + with the transverse derivatives now `D_x`, `D_y`. -/ +lemma boostProj_map_submodule_z [BoostWeight.IsBoostGraded rep] [IsLorentzDeriv rep D] + (k : ℤ) (V : Submodule ℂ A) : + (∑ α, V.map (D α)).map (BoostWeight.boostProj rep 2 k) = + (V.map (BoostWeight.boostProj rep 2 (k - 2))).map (lightConePlus D 2) + + (V.map (BoostWeight.boostProj rep 2 (k + 2))).map (lightConeMinus D 2) + + (V.map (BoostWeight.boostProj rep 2 k)).map (D (Sum.inr 0)) + + (V.map (BoostWeight.boostProj rep 2 k)).map (D (Sum.inr 1)) := by + rw [show (∑ α, V.map (D α)) = + V.map (D (Sum.inl 0)) + V.map (D (Sum.inr 2)) + + V.map (D (Sum.inr 0)) + V.map (D (Sum.inr 1)) from by + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] + exact boostProj_map_submodule_aux (by decide) (by decide) k V + end IsLorentzDeriv end Lorentz From dff096d452954f27273c9696595de0ad277f5fe7 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 14 Aug 2026 09:02:28 +0100 Subject: [PATCH 138/254] generalize some lemmas around IsLorentzDeriv --- Physlib.lean | 1 + .../JetAlgebra/Boosts/FieldStrength.lean | 3 +- .../JetAlgebra/Grading/BoostWeight.lean | 2 +- Physlib/Relativity/IsLorentzDeriv.lean | 101 +++++++++--------- 4 files changed, 57 insertions(+), 50 deletions(-) diff --git a/Physlib.lean b/Physlib.lean index bcdde3de4..79ae165ea 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -185,6 +185,7 @@ public import Physlib.Particles.FlavorPhysics.CKMMatrix.Relations public import Physlib.Particles.FlavorPhysics.CKMMatrix.Rows public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.Basic public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.StandardParameters +public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Boosts.FieldStrength public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Covariantization public import Physlib.Particles.NeutrinoPhysics.Basic public import Physlib.Particles.QED.Basic diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean index d01efeffc..83240be96 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean @@ -455,7 +455,8 @@ lemma boostProj_z_map_fieldStrengthDeriv_jetDeriv_span_eq : boostProj_z_map_fieldStrengthDeriv_span_of_ne rw [show D2V0 = ∑ α, (∑ β, V0.map (jetDeriv β)).map (jetDeriv α) from fieldStrengthDeriv_two_deriv_eq_map_span] - simp only [boostProj_map_submodule_z, + simp only [IsLorentzDeriv.boostProj_map_deriv_map_submodule, + show (2 + 1 : Fin 3) = 0 from rfl, show (2 + 2 : Fin 3) = 1 from rfl, show (0 : ℤ) - 2 = -2 from by decide, show (0 : ℤ) + 2 = 2 from by decide, show (-2 : ℤ) - 2 = -4 from by decide, show (-2 : ℤ) + 2 = 0 from by decide, show (2 : ℤ) - 2 = 0 from by decide, show (2 : ℤ) + 2 = 4 from by decide] diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean index 5ac1d9df8..c48834dbe 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean @@ -541,7 +541,7 @@ lemma boostProj_of_isInvariant_ne {i : Fin 3} {k : ℤ} (hk : (0 : ℤ) ≠ k) { The covariance `repLorentzGroup_jetDeriv` makes the jet derivatives an instance of `Lorentz.IsLorentzDeriv`. The weight shifts of the light-cone combinations, the weight preservation of the transverse derivatives, and the boost projections of the span of all -jet derivatives of a submodule (`IsLorentzDeriv.boostProj_map_submodule_x/y/z`) are +jet derivatives of a submodule (`IsLorentzDeriv.boostProj_map_submodule`) are inherited from the general theory. -/ diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index c2cea9a20..715f603d8 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -50,7 +50,7 @@ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : /-! -## Light cone derivatives +## A. Light cone derivatives -/ @@ -66,7 +66,7 @@ def lightConeMinus (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) : A /-! -## Relationship to boost weights +## B. Relationship to boost weights -/ @@ -243,52 +243,57 @@ private lemma boostProj_map_submodule_aux [BoostWeight.IsBoostGraded rep] rw [map_pair_eq_lightCone] simp only [Submodule.add_eq_sup, Submodule.map_sup, hlcp, hlcn, hd₁, hd₂] -/-- **The `x`-boost projections of the span of Lorentz derivatives.** The weight-`k` part of - the span of the four derivative images of `V` is spanned by the light-cone combinations - applied to the weight-`(k ∓ 2)` parts of `V` together with the transverse derivatives of - its weight-`k` part. -/ -lemma boostProj_map_submodule_x [BoostWeight.IsBoostGraded rep] [IsLorentzDeriv rep D] - (k : ℤ) (V : Submodule ℂ A) : - (∑ α, V.map (D α)).map (BoostWeight.boostProj rep 0 k) = - (V.map (BoostWeight.boostProj rep 0 (k - 2))).map (lightConePlus D 0) - + (V.map (BoostWeight.boostProj rep 0 (k + 2))).map (lightConeMinus D 0) - + (V.map (BoostWeight.boostProj rep 0 k)).map (D (Sum.inr 1)) - + (V.map (BoostWeight.boostProj rep 0 k)).map (D (Sum.inr 2)) := by - rw [show (∑ α, V.map (D α)) = - V.map (D (Sum.inl 0)) + V.map (D (Sum.inr 0)) + - V.map (D (Sum.inr 1)) + V.map (D (Sum.inr 2)) from by - rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] - exact boostProj_map_submodule_aux (by decide) (by decide) k V - -/-- **The `y`-boost projections of the span of Lorentz derivatives.** As for the `x`-boost, - with the transverse derivatives now `D_x`, `D_z`. -/ -lemma boostProj_map_submodule_y [BoostWeight.IsBoostGraded rep] [IsLorentzDeriv rep D] - (k : ℤ) (V : Submodule ℂ A) : - (∑ α, V.map (D α)).map (BoostWeight.boostProj rep 1 k) = - (V.map (BoostWeight.boostProj rep 1 (k - 2))).map (lightConePlus D 1) - + (V.map (BoostWeight.boostProj rep 1 (k + 2))).map (lightConeMinus D 1) - + (V.map (BoostWeight.boostProj rep 1 k)).map (D (Sum.inr 0)) - + (V.map (BoostWeight.boostProj rep 1 k)).map (D (Sum.inr 2)) := by - rw [show (∑ α, V.map (D α)) = - V.map (D (Sum.inl 0)) + V.map (D (Sum.inr 1)) + - V.map (D (Sum.inr 0)) + V.map (D (Sum.inr 2)) from by - rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] - exact boostProj_map_submodule_aux (by decide) (by decide) k V - -/-- **The `z`-boost projections of the span of Lorentz derivatives.** As for the `x`-boost, - with the transverse derivatives now `D_x`, `D_y`. -/ -lemma boostProj_map_submodule_z [BoostWeight.IsBoostGraded rep] [IsLorentzDeriv rep D] - (k : ℤ) (V : Submodule ℂ A) : - (∑ α, V.map (D α)).map (BoostWeight.boostProj rep 2 k) = - (V.map (BoostWeight.boostProj rep 2 (k - 2))).map (lightConePlus D 2) - + (V.map (BoostWeight.boostProj rep 2 (k + 2))).map (lightConeMinus D 2) - + (V.map (BoostWeight.boostProj rep 2 k)).map (D (Sum.inr 0)) - + (V.map (BoostWeight.boostProj rep 2 k)).map (D (Sum.inr 1)) := by - rw [show (∑ α, V.map (D α)) = - V.map (D (Sum.inl 0)) + V.map (D (Sum.inr 2)) + - V.map (D (Sum.inr 0)) + V.map (D (Sum.inr 1)) from by - rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three]; abel] - exact boostProj_map_submodule_aux (by decide) (by decide) k V +/-- **The boost projections of the span of Lorentz derivatives, along any axis.** The + weight-`k` part of the span of the four derivative images of `V` is spanned by the + light-cone combinations applied to the weight-`(k ∓ 2)` parts of `V` together with the two + transverse derivatives, at directions `i + 1` and `i + 2`, of its weight-`k` part. -/ +lemma boostProj_map_deriv_map_submodule [BoostWeight.IsBoostGraded rep] + [IsLorentzDeriv rep D] (k : ℤ) (V : Submodule ℂ A) (i : Fin 3) : + (∑ α, V.map (D α)).map (BoostWeight.boostProj rep i k) = + (V.map (BoostWeight.boostProj rep i (k - 2))).map (lightConePlus D i) + + (V.map (BoostWeight.boostProj rep i (k + 2))).map (lightConeMinus D i) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr (i + 1))) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr (i + 2))) := by + have hsum : (∑ α, V.map (D α)) = + V.map (D (Sum.inl 0)) + V.map (D (Sum.inr i)) + V.map (D (Sum.inr (i + 1))) + + V.map (D (Sum.inr (i + 2))) := by + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three] + fin_cases i <;> + (simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk, Fin.reduceAdd]; abel) + rw [hsum] + exact boostProj_map_submodule_aux (by fin_cases i <;> decide) (by fin_cases i <;> decide) k V + +/-- **Two derivative layers.** The weight-`k` part of the span of all second derivative + images of `V` redistributes onto the weight `k - 4, …, k + 4` parts of `V`, hit by the + light-cone and transverse operators twice over: `boostProj_map_deriv_map_submodule` + applied at the outer layer and then to each of the three inner projected spans. -/ +lemma boostProj_map_deriv_map_deriv_map [BoostWeight.IsBoostGraded rep] [IsLorentzDeriv rep D] + (k : ℤ) (V : Submodule ℂ A) (i : Fin 3) : + (∑ β, (∑ α, V.map (D α)).map (D β)).map (BoostWeight.boostProj rep i k) = + ((V.map (BoostWeight.boostProj rep i (k - 4))).map (lightConePlus D i) + + (V.map (BoostWeight.boostProj rep i k)).map (lightConeMinus D i) + + (V.map (BoostWeight.boostProj rep i (k - 2))).map (D (Sum.inr (i + 1))) + + (V.map (BoostWeight.boostProj rep i (k - 2))).map (D (Sum.inr (i + 2)))).map + (lightConePlus D i) + + ((V.map (BoostWeight.boostProj rep i k)).map (lightConePlus D i) + + (V.map (BoostWeight.boostProj rep i (k + 4))).map (lightConeMinus D i) + + (V.map (BoostWeight.boostProj rep i (k + 2))).map (D (Sum.inr (i + 1))) + + (V.map (BoostWeight.boostProj rep i (k + 2))).map (D (Sum.inr (i + 2)))).map + (lightConeMinus D i) + + ((V.map (BoostWeight.boostProj rep i (k - 2))).map (lightConePlus D i) + + (V.map (BoostWeight.boostProj rep i (k + 2))).map (lightConeMinus D i) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr (i + 1))) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr (i + 2)))).map + (D (Sum.inr (i + 1))) + + ((V.map (BoostWeight.boostProj rep i (k - 2))).map (lightConePlus D i) + + (V.map (BoostWeight.boostProj rep i (k + 2))).map (lightConeMinus D i) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr (i + 1))) + + (V.map (BoostWeight.boostProj rep i k)).map (D (Sum.inr (i + 2)))).map + (D (Sum.inr (i + 2))) := by + rw [boostProj_map_deriv_map_submodule k _ i, boostProj_map_deriv_map_submodule (k - 2) V i, + boostProj_map_deriv_map_submodule (k + 2) V i, boostProj_map_deriv_map_submodule k V i, + show k - 2 - 2 = k - 4 from by ring, show k - 2 + 2 = k from by ring, + show k + 2 - 2 = k from by ring, show k + 2 + 2 = k + 4 from by ring] end IsLorentzDeriv From 923217967843566efc32b3a9079af814e1da7ca3 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 14 Aug 2026 10:18:28 +0100 Subject: [PATCH 139/254] feat: Add WeightDecomposition --- .../JetAlgebra/Boosts/FieldStrength.lean | 70 +++++++++----- Physlib/Relativity/IsLorentzDeriv.lean | 43 +++++++++ .../LorentzGroup/Boosts/WeightGrading.lean | 96 +++++++++++++++++++ 3 files changed, 186 insertions(+), 23 deletions(-) diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean index 83240be96..1ae887d21 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean @@ -236,6 +236,48 @@ lemma fieldStrengthDeriv_span_pair_neg_two_le : rintro _ (rfl | rfl) exacts [fieldStrengthDeriv_lightCone_y_mem_neg_two, fieldStrengthDeriv_lightCone_mem_neg_two]) +/-- **The field-strength span, weight decomposed along the `z`-axis**: weight-zero piece + `{F_{0z}, F_{xy}}`, weight `±2` pieces the light-cone differences and sums. The projection + images, weight intersections and closure properties all follow from the generic + `WeightDecomposition` lemmas. -/ +noncomputable def fieldStrengthDerivWeightDecompositionZ : + BoostWeight.WeightDecomposition repLorentzGroup 2 + (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) where + piece k := + if k = 0 then Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), + fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} + else if k = 2 then Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} + else if k = -2 then Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), + fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} + else ⊥ + supp := {0, 2, -2} + piece_le k := by + by_cases h0 : k = 0 + · subst h0 + simpa using fieldStrengthDeriv_span_pair_zero_le + by_cases h2 : k = 2 + · subst h2 + simpa [h0] using fieldStrengthDeriv_span_pair_two_le + by_cases hn2 : k = -2 + · subst hn2 + simpa [h0, h2] using fieldStrengthDeriv_span_pair_neg_two_le + · simp [h0, h2, hn2] + piece_eq_bot k hk := by + simp only [Finset.mem_insert, Finset.mem_singleton] at hk + push_neg at hk + simp [hk.1, hk.2.1, hk.2.2] + iSup_piece := by + rw [BoostWeight.iSup_eq_sup_zero_two_neg_two _ (fun l h0 h2 hn2 => by simp [h0, h2, hn2])] + simp only [reduceIte, show ((2 : ℤ) = 0) = False from by simp, + show ((-2 : ℤ) = 0) = False from by simp, show ((-2 : ℤ) = 2) = False from by simp, + iff_false, if_false] + exact fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z.symm + lemma boostProj_z_zero_map_fieldStrengthDeriv_span : Submodule.map (BoostWeight.boostProj repLorentzGroup 2 0) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), @@ -275,12 +317,9 @@ lemma boostProj_z_neg_two_map_fieldStrengthDeriv_span : lemma boostProj_z_map_fieldStrengthDeriv_span_of_ne (k : ℤ) (h0 : k ≠ 0) (h2 : k ≠ 2) (hn2 : k ≠ -2) : Submodule.map (BoostWeight.boostProj repLorentzGroup 2 k) - (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = ⊥ := by - rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_zero_le (Ne.symm h0), - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_two_le (Ne.symm h2), - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le (Ne.symm hn2), - sup_bot_eq, sup_bot_eq] + (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = ⊥ := + fieldStrengthDerivWeightDecompositionZ.map_boostProj_of_notMem + (show k ∉ ({0, 2, -2} : Finset ℤ) from by simp [h0, h2, hn2]) /-! @@ -311,23 +350,8 @@ TODO "Generalize the below result for any axis" /-- Every weight projection of the field-strength span stays inside the span. -/ lemma boostProj_z_map_fieldStrengthDeriv_span_le (l : ℤ) : (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (BoostWeight.boostProj repLorentzGroup 2 l) ≤ - Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} := by - have hd : Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} = _ ⊔ _ ⊔ _ := - fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z - by_cases h0 : l = 0 - · subst h0 - rw [boostProj_z_zero_map_fieldStrengthDeriv_span, hd] - exact le_sup_left.trans le_sup_left - by_cases h2 : l = 2 - · subst h2 - rw [boostProj_z_two_map_fieldStrengthDeriv_span, hd] - exact le_sup_right.trans le_sup_left - by_cases hn2 : l = -2 - · subst hn2 - rw [boostProj_z_neg_two_map_fieldStrengthDeriv_span, hd] - exact le_sup_right - · rw [boostProj_z_map_fieldStrengthDeriv_span_of_ne l h0 h2 hn2] - exact bot_le + Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} := + fieldStrengthDerivWeightDecompositionZ.map_boostProj_le l lemma boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts : let V0 := Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 715f603d8..7800c0f78 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -34,6 +34,7 @@ a submodule redistributes onto the shifted weight projections namespace Lorentz open Matrix MatrixGroups TensorProduct +open scoped Pointwise variable {A : Type} [Ring A] [Algebra ℂ A] @@ -295,6 +296,48 @@ lemma boostProj_map_deriv_map_deriv_map [BoostWeight.IsBoostGraded rep] [IsLoren show k - 2 - 2 = k - 4 from by ring, show k - 2 + 2 = k from by ring, show k + 2 - 2 = k from by ring, show k + 2 + 2 = k + 4 from by ring] +/-- The span of the derivative images of a weight-decomposed submodule is weight decomposed: + the projections stay inside it and the support widens by the light-cone shifts `±2`. -/ +noncomputable def _root_.Lorentz.BoostWeight.WeightDecomposition.deriv + [BoostWeight.IsBoostGraded rep] {i : Fin 3} {V : Submodule ℂ A} + (d : BoostWeight.WeightDecomposition rep i V) + (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) [IsLorentzDeriv rep D] : + BoostWeight.WeightDecomposition rep i (∑ α, V.map (D α)) := by + classical + have hV : ∀ μ, V.map (D μ) ≤ ∑ α, V.map (D α) := fun μ => + Finset.single_le_sum (f := fun α => V.map (D α)) + (fun _ _ => by rw [Submodule.zero_eq_bot]; exact bot_le) (Finset.mem_univ μ) + have hsub : ∀ f g : A →ₗ[ℂ] A, V.map (f - g) ≤ V.map f ⊔ V.map g := by + rintro f g _ ⟨v, hv, rfl⟩ + rw [LinearMap.sub_apply] + exact sub_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) + (Submodule.mem_sup_right ⟨v, hv, rfl⟩) + have hadd : ∀ f g : A →ₗ[ℂ] A, V.map (f + g) ≤ V.map f ⊔ V.map g := by + rintro f g _ ⟨v, hv, rfl⟩ + rw [LinearMap.add_apply] + exact add_mem (Submodule.mem_sup_left ⟨v, hv, rfl⟩) + (Submodule.mem_sup_right ⟨v, hv, rfl⟩) + refine BoostWeight.WeightDecomposition.ofMapClosed rep (d.supp + ({-2, 0, 2} : Finset ℤ)) + (fun k => ?_) (fun k hk => ?_) + · rw [boostProj_map_deriv_map_submodule k V i] + simp only [Submodule.add_eq_sup] + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · exact (Submodule.map_mono (d.map_boostProj_le _)).trans + ((hsub _ _).trans (sup_le (hV _) (hV _))) + · exact (Submodule.map_mono (d.map_boostProj_le _)).trans + ((hadd _ _).trans (sup_le (hV _) (hV _))) + · exact (Submodule.map_mono (d.map_boostProj_le _)).trans (hV _) + · exact (Submodule.map_mono (d.map_boostProj_le _)).trans (hV _) + · have h₁ : k - 2 ∉ d.supp := fun h => hk (by + simpa using Finset.add_mem_add h (show (2 : ℤ) ∈ ({-2, 0, 2} : Finset ℤ) by decide)) + have h₂ : k + 2 ∉ d.supp := fun h => hk (by + simpa using Finset.add_mem_add h (show (-2 : ℤ) ∈ ({-2, 0, 2} : Finset ℤ) by decide)) + have h₀ : k ∉ d.supp := fun h => hk (by + simpa using Finset.add_mem_add h (show (0 : ℤ) ∈ ({-2, 0, 2} : Finset ℤ) by decide)) + rw [boostProj_map_deriv_map_submodule k V i, d.map_boostProj_of_notMem h₁, + d.map_boostProj_of_notMem h₂, d.map_boostProj_of_notMem h₀] + simp + end IsLorentzDeriv end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index db1e953ac..3cc7e72a4 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -13,6 +13,7 @@ public import Mathlib.LinearAlgebra.Eigenspace.Basic public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.Algebra.Group.Pointwise.Finset.Basic /-! # Boost-weight gradings of representations of `SL(2,ℂ)` @@ -680,6 +681,101 @@ lemma boostProj_map_mul (k : ℤ) {V W : Submodule K A} end Theory +/-! + +## C. Weight decompositions of submodules + +-/ + +/-- A **weight decomposition** of a submodule `V`: a finitely supported family of subspaces of + pure boost weight whose supremum is `V`. Exhibiting one collapses all the per-span + boilerplate: the projection images, the weight intersections, projection-closure and the + off-support vanishing become the generic lemmas below. -/ +structure WeightDecomposition (rep : Representation K SL(2,ℂ) A) (i : Fin 3) + (V : Submodule K A) where + /-- The weight-`k` piece of the decomposition. -/ + piece : ℤ → Submodule K A + /-- The finite set of weights that occur. -/ + supp : Finset ℤ + piece_le : ∀ k, piece k ≤ boostWeightSubmodule rep i k + piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ + iSup_piece : (⨆ k, piece k) = V + +namespace WeightDecomposition + +variable {rep : Representation K SL(2,ℂ) A} [IsBoostGraded rep] {i : Fin 3} + {V : Submodule K A} (d : WeightDecomposition rep i V) + +include d + +/-- Each piece sits inside the decomposed submodule. -/ +lemma piece_le_self (k : ℤ) : d.piece k ≤ V := + le_of_le_of_eq (le_iSup d.piece k) d.iSup_piece + +/-- The weight-`k` projection image of `V` is the weight-`k` piece. -/ +lemma map_boostProj (k : ℤ) : V.map (boostProj rep i k) = d.piece k := by + have h := congrArg (Submodule.map (boostProj rep i k)) d.iSup_piece + rw [← h, Submodule.map_iSup] + refine le_antisymm (iSup_le fun l => ?_) + (le_iSup_of_le k (map_boostProj_of_le rep (d.piece_le k)).ge) + by_cases hlk : l = k + · subst hlk + exact (map_boostProj_of_le rep (d.piece_le l)).le + · rw [map_boostProj_of_le_ne rep (d.piece_le l) hlk] + exact bot_le + +/-- A decomposed submodule is closed under every weight projection. -/ +lemma map_boostProj_le (k : ℤ) : V.map (boostProj rep i k) ≤ V := by + rw [d.map_boostProj] + exact d.piece_le_self k + +/-- The weight-`k` part of a decomposed submodule is the weight-`k` piece. -/ +lemma inf_eq (k : ℤ) : boostWeightSubmodule rep i k ⊓ V = d.piece k := by + rw [inf_boostWeightSubmodule_eq_map rep (d.map_boostProj_le k), d.map_boostProj] + +/-- Off the support the projection image vanishes. -/ +lemma map_boostProj_of_notMem {k : ℤ} (h : k ∉ d.supp) : + V.map (boostProj rep i k) = ⊥ := by + rw [d.map_boostProj, d.piece_eq_bot k h] + +/-- A projection-closed submodule whose projections vanish off a finite set is weight + decomposed by its projection images. -/ +noncomputable def ofMapClosed (rep : Representation K SL(2,ℂ) A) [IsBoostGraded rep] + {i : Fin 3} {V : Submodule K A} (s : Finset ℤ) + (hcl : ∀ k, V.map (boostProj rep i k) ≤ V) + (hbot : ∀ k ∉ s, V.map (boostProj rep i k) = ⊥) : + WeightDecomposition rep i V where + piece k := V.map (boostProj rep i k) + supp := s + piece_le k := by + rintro _ ⟨y, _, rfl⟩ + exact boostProj_mem rep i k y + piece_eq_bot := hbot + iSup_piece := by + classical + refine le_antisymm (iSup_le hcl) fun x hx => ?_ + rw [← DirectSum.sum_support_decompose (boostWeightSubmodule rep i) x] + exact sum_mem fun k _ => Submodule.mem_iSup_of_mem k ⟨x, hx, rfl⟩ + +open scoped Pointwise in +/-- The convolution decomposition of a product of decomposed submodules. -/ +noncomputable def mul {W : Submodule K A} (d₁ : WeightDecomposition rep i V) + (d₂ : WeightDecomposition rep i W) : WeightDecomposition rep i (V * W) := + ofMapClosed rep (d₁.supp + d₂.supp) + (fun k => by + rw [boostProj_map_mul rep k d₁.map_boostProj_le d₂.map_boostProj_le] + exact iSup_le fun l => Submodule.mul_le.2 fun a ha b hb => + Submodule.mul_mem_mul (d₁.map_boostProj_le l ha) (d₂.map_boostProj_le (k - l) hb)) + (fun k hk => by + rw [boostProj_map_mul rep k d₁.map_boostProj_le d₂.map_boostProj_le] + refine iSup_eq_bot.mpr fun l => ?_ + by_cases hl : l ∈ d₁.supp + · rw [d₂.map_boostProj, d₂.piece_eq_bot (k - l) + (fun hmem => hk (by simpa using Finset.add_mem_add hl hmem)), Submodule.mul_bot] + · rw [d₁.map_boostProj, d₁.piece_eq_bot l hl, Submodule.bot_mul]) + +end WeightDecomposition + end BoostWeight end Lorentz From 12315daa90509065f96492213ac61e0e8336c378 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:06:48 +0100 Subject: [PATCH 140/254] feat: Add start to JetGaugeALgebra --- .../GaugeGroup/JetGaugeAlgebra.lean | 76 +++++++++++++++++++ Physlib/Relativity/DerivAlgebra.lean | 4 + 2 files changed, 80 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean new file mode 100644 index 000000000..d5f5b215d --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# The jet gauge algebra + +-/ + +@[expose] public section +namespace StandardModel +open MvPowerSeries Matrix + +/-- The jet gauge algebra: the Lie-algebra analogue of `JetGaugeGroupI`, with one factor per + gauge group factor — self-adjoint `3 × 3` and `2 × 2` matrices and a self-adjoint scalar, + all with coefficients in the ring `JetRing` of formal power series in the spacetime + coordinates. The Maurer–Cartan forms of the jet gauge group are valued here, hermiticity + being `star_maurerCartanSU3` and its companions. -/ +abbrev JetGaugeAlgebra := + selfAdjoint (Matrix (Fin 3) (Fin 3) JetRing) × + selfAdjoint (Matrix (Fin 2) (Fin 2) JetRing) × selfAdjoint JetRing + +namespace JetGaugeAlgebra + +/-! + +## Basic projections + +-/ + +/-- The `su(3)`-factor component of an element of the jet gauge algebra. -/ +def toSU3 (a : JetGaugeAlgebra) : selfAdjoint (Matrix (Fin 3) (Fin 3) JetRing) := a.1 + +/-- The `su(2)`-factor component of an element of the jet gauge algebra. -/ +def toSU2 (a : JetGaugeAlgebra) : selfAdjoint (Matrix (Fin 2) (Fin 2) JetRing) := a.2.1 + +/-- The `u(1)`-factor component of an element of the jet gauge algebra. -/ +def toU1 (a : JetGaugeAlgebra) : selfAdjoint JetRing := a.2.2 + +/-! + +## The basis + +-/ + +TODO "Define the basis of the jet gauge algebra." + + +/-! + +## The adjoint representation of Jet Gauge group + +-/ + +TODO "Define the adjoint representation of the jet gauge group on the jet gauge algebra." + +TODO "Change the Maurer–Cartan forms to be valued in the jet gauge algebra" + +end JetGaugeAlgebra + +end StandardModel diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index 771f37c98..a547cfac3 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -72,6 +72,10 @@ instance : StarRing JetRing where exact Finset.sum_congr rfl fun p _ => by rw [star_mul', coeff_star, coeff_star] rw [h, mul_comm] +/-- Real scalars commute with the coefficientwise conjugation. -/ +instance : StarModule ℝ JetRing where + star_smul r f := funext fun n => star_smul r (f n) + @[simp] lemma constantCoeff_star (f : JetRing) : constantCoeff (star f) = star (constantCoeff f) := rfl From 1e9e0270707a7560704bcf788c1128ccf8bd0a6e Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:15:26 +0100 Subject: [PATCH 141/254] feat: Add TODOs to MaurerCartan --- Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index caf442d9f..edd31a148 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -43,6 +43,10 @@ open MvPowerSeries -/ +TODO "The maurerCartan form should be defined for the whole gauge group, + and it should live in the jet Lie algebra." + +TODO "Define the symmetrized maurerCartan forms." /-- The `U(1)` Maurer–Cartan form of a jet of gauge transformations in the direction `ν`: the series `i (∂_ν u) ū` for `u` the hypercharge factor of the jet. -/ From 4e2a4d01c2331938bc6de6255c76010736d7efa9 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:36:25 +0100 Subject: [PATCH 142/254] docs: Maurer Cartan --- .../GaugeGroup/MaurerCartan.lean | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index edd31a148..a2e6d95a2 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -20,16 +20,20 @@ public import Mathlib.Algebra.MvPolynomial.Derivation /-! # The Maurer–Cartan forms of the jet gauge group -The Maurer–Cartan forms `i (∂_ν U) U†` of a jet of gauge transformations, one for -each factor of the Standard Model gauge group: the scalar-valued `U(1)` form and -the matrix-valued `SU(3)` and `SU(2)` forms. These are the inhomogeneous terms in -the local gauge transformations of the corresponding gauge bosons. +The Maurer-Cartan form is a map +`ω : JetGaugeGroupI → (Fin 1 ⊕ Fin 3) → JetLieAlgebra` +defined as `ω_μ(U) := i (∂_μ U) U†`. -The abelian `U(1)` form is an additive cocycle; the nonabelian forms satisfy the -twisted cocycle law `mc(UV) = mc(U) + U mc(V) U†`. Each form satisfies its -Maurer–Cartan structure equation, relating the antisymmetrized derivative to the -commutator; in the abelian case the derivative is symmetric, i.e. the form is -closed. +We will use `ω^a_ν` to denote the `a`-th component of the Maurer–Cartan form in the +basis of the jet Lie algebra, and `f^a_{b c}` to denote the structure constants of the +jet Lie algebra in that basis. + +It satisfies the following properties: +- *Cocycle law*: `ω_μ(UV) = ω_μ(U) + U ω_μ(V) U†` +- *Value on the identity*: `ω_μ(1) = 0` +- *Value on constant gauge transformations*: `ω_μ(U₀) = 0` +- *Value on the inverse*: `ω_μ(U⁻¹) = -U⁻¹ ω_μ(U) U` +- *Structural equation*: `∂_μ ω^a_ν(U) − ∂_ν ω^a_μ(U) = ∑_{b c} f^a_{b c} · ω^b_μ(U) · ω^c_ν(U)` -/ @@ -47,6 +51,7 @@ TODO "The maurerCartan form should be defined for the whole gauge group, and it should live in the jet Lie algebra." TODO "Define the symmetrized maurerCartan forms." + /-- The `U(1)` Maurer–Cartan form of a jet of gauge transformations in the direction `ν`: the series `i (∂_ν u) ū` for `u` the hypercharge factor of the jet. -/ From 965145044ad2b69bec05bd558f208b63af671dab Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:36:40 +0100 Subject: [PATCH 143/254] docs: Jet Gauge Algebra --- .../GaugeGroup/JetGaugeAlgebra.lean | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean index d5f5b215d..4990724e1 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean @@ -20,9 +20,35 @@ public import Mathlib.Algebra.MvPolynomial.Derivation /-! # The jet gauge algebra +We define `JetGaugeAlgebra` as the Lie algebra of `JetGaugeGroupI`, +defined explicitly via self-adjoint matrices, and giving it an instance `LieAlgebra`. + +Note here that `JetGaugeAlgebra` is a module over `ℝ` not `ℂ` or `JetRing`. + +On this Lie algebra define a prefered basis, `basis`, indexed by `basisIndex`. +TODO: add discussion about the basis + +We let `structuralConstant` be the structure constants of the Lie algebra with respect to this +prefered basis, so that +``` + [basis i, basis j] = i * ∑ k, structuralConstant i j k • basis k +``` + +On `JetGaugeAlgebra` we define the adjoint representation of `JetGaugeGroupI`, +`adjointRep`, which acts via `x ↦ g * x * g⁻¹`. + +There is also a derivative `deriv : Fin 1 ⊕ Fin 3 → JetLieAlgebra →ₗ[ℝ] JetLieAlgebra` +whose action can be defined componentwise. + +The derivative acts on brackets via the Leibniz rule: +``` + deriv μ [x, y] = [deriv μ x, y] + [x, deriv μ y] +``` + -/ @[expose] public section +TODO "Make the API here match what is in the doc-string." namespace StandardModel open MvPowerSeries Matrix @@ -54,6 +80,14 @@ def toU1 (a : JetGaugeAlgebra) : selfAdjoint JetRing := a.2.2 /-! +## The Lie algebra instance + +-/ + +TODO "Define the Lie algebra instance on `JetGaugeAlgebra`." + +/-! + ## The basis -/ @@ -69,8 +103,6 @@ TODO "Define the basis of the jet gauge algebra." TODO "Define the adjoint representation of the jet gauge group on the jet gauge algebra." -TODO "Change the Maurer–Cartan forms to be valued in the jet gauge algebra" - end JetGaugeAlgebra end StandardModel From bd9a23d1c6bca60e05c74a9319a2b61bedfd9b2b Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 16 Aug 2026 00:14:00 +0400 Subject: [PATCH 144/254] feat: Add script tracking the TODOs this branch introduces --- scripts/todos.py | 235 +++++++++++++++++++++++++++++++++++++++++++++++ todos.md | 46 ++++++++++ 2 files changed, 281 insertions(+) create mode 100644 scripts/todos.py create mode 100644 todos.md diff --git a/scripts/todos.py b/scripts/todos.py new file mode 100644 index 000000000..ab7baaa90 --- /dev/null +++ b/scripts/todos.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python3 +""" +todos.py -- list the TODOs this branch introduces, relative to its merge-base. + +Scans two git refs with the same matcher and subtracts the sets, so the output +is "what this PR adds", not "every TODO in Physlib". Reads blobs straight out +of the object store: no checkout, no branch switching, working tree untouched. + + python scripts/todos.py # to the terminal + python scripts/todos.py --md todos.md + python scripts/todos.py --head origin/my-branch +""" + +import argparse +import re +import subprocess +import sys +import textwrap + +DEFAULT_HEAD = "HEAD" +DEFAULT_MASTER = "upstream/master" +DEFAULT_ROOT = "Physlib" + +# Physlib/Meta/TODO/ implements the TODO command; it is *about* todos and would +# otherwise dominate the output. scripts/ likewise. QuantumInfo/ is a separate +# subproject with its own `--TODO` convention and is out of scope. +EXCLUDE = re.compile(r"(^|/)(Meta|scripts)/") + +CMD_START = re.compile(r'^\s*TODO\s+"') # TODO "..." (Lean command) +DOC_LINE = re.compile(r"^\s*/-!\s*TODO:\s*") # /-! TODO: ... -/ +LOOSE = re.compile(r"todo", re.I) + +# Matches `todo` but is not a work item: section headings, and identifiers that +# merely contain the word. +NOISE = re.compile( + r"(^\s*#{1,6}\s*TODO\b)" # '## TODO' section heading + r"|(Physlib\.Meta\.TODO)" + r"|(TODO_to_yml|FullTODO|todoExtension|todoInfo|allTODO)" + # Prose *about* todos, mostly in module docstrings, not work items. + r"|(collecting TODO items)|(contains only TODO items)" + r"|(is a TODO to)|(Open TODO items)|(see the `TODO`)", + re.I, +) + + +def git(repo, *args): + out = subprocess.run(["git", "-C", repo, *args], capture_output=True, check=True) + return out.stdout.decode("utf-8", "replace") + + +def list_files(repo, ref, root): + paths = git(repo, "ls-tree", "-r", "--name-only", ref, "--", root).splitlines() + return [p for p in paths if p.endswith(".lean") and not EXCLUDE.search(p)] + + +def read_blobs(repo, ref, paths): + """Bulk-read many blobs in one subprocess. Returns {path: text}.""" + proc = subprocess.Popen( + ["git", "-C", repo, "cat-file", "--batch"], + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + ) + out, _ = proc.communicate("".join(f"{ref}:{p}\n" for p in paths).encode()) + + blobs, pos = {}, 0 + for path in paths: + nl = out.find(b"\n", pos) + if nl == -1: + break + header = out[pos:nl].decode("utf-8", "replace") + pos = nl + 1 + if header.endswith(("missing", "ambiguous")): + continue + size = int(header.rsplit(" ", 1)[1]) + blobs[path] = out[pos:pos + size].decode("utf-8", "replace") + pos += size + 1 # trailing newline after the blob + return blobs + + +def parse_file(path, text): + """Yield (path, line, kind, content) items, coalescing wrapped ones.""" + lines = text.splitlines() + items, unclassified = [], [] + i = 0 + while i < len(lines): + line = lines[i] + + # --- TODO "..." command; the string may span several lines ----------- + if CMD_START.match(line): + start = i + body = line[line.index('"') + 1:] + while '"' not in body.replace('\\"', ""): + i += 1 + if i >= len(lines): + break + body += " " + lines[i].strip() + if '"' in body: + body = body[:body.rindex('"')] + items.append((path, start + 1, "cmd", " ".join(body.split()))) + i += 1 + continue + + # --- /-! TODO: ... -/ runs; capitalised first word starts a new item -- + if DOC_LINE.match(line): + start = i + body = DOC_LINE.sub("", line).replace("-/", "").strip() + while i + 1 < len(lines) and DOC_LINE.match(lines[i + 1]): + nxt = DOC_LINE.sub("", lines[i + 1]).replace("-/", "").strip() + first = nxt.split(" ", 1)[0] if nxt else "" + if first[:1].isupper(): # heuristic: new sentence, new item + break + body += " " + nxt + i += 1 + items.append((path, start + 1, "doc", " ".join(body.split()))) + i += 1 + continue + + if LOOSE.search(line) and not NOISE.search(line): + unclassified.append((path, i + 1, "?", line.strip())) + i += 1 + + return items, unclassified + + +def scan(repo, ref, root): + paths = list_files(repo, ref, root) + items, unknown = [], [] + for path, text in read_blobs(repo, ref, paths).items(): + a, b = parse_file(path, text) + items += a + unknown += b + return items, unknown, len(paths) + + +def key(content): + """Identity of a TODO: its text, path-independent so moves aren't churn.""" + return " ".join(content.lower().split()).rstrip(".") + + +def group_by_dir(items): + by_dir = {} + for path, line, _, content in sorted(items): + by_dir.setdefault(path.rsplit("/", 1)[0], []).append((path, line, content)) + return by_dir + + +def emit_terminal(items, unknown, meta, plain): + print("# TODOs introduced by this branch") + print(f"# base {meta['base'][:8]} -> head {meta['head'][:8]} ({meta['date']})") + print(f"# {meta['files']} files - {len(items)} new\n") + + for directory, group in sorted(group_by_dir(items).items()): + if plain: + for path, _, content in group: + print(f"{path} | {content}") + continue + print(directory.replace("Physlib/", "")) + for path, line, content in group: + name = path.rsplit("/", 1)[1] + head, *rest = textwrap.wrap(content, 62) or [""] + label = f"{name}:{line}" + print(f" {label:<34} {head}") + for cont in rest: + print(f" {'':<34} {cont}") + print() + + if unknown: + print(f"UNCLASSIFIED ({len(unknown)}) - matched /todo/i, no known form:") + for path, line, _, content in sorted(unknown): + print(f" {path}:{line} {content[:70]}") + + +def md_escape(text): + """Brackets would terminate the link text early.""" + return text.replace("[", "\\[").replace("]", "\\]") + + +def emit_md(items, meta, repo_url, link_ref): + out = [ + "# TODOs introduced by this branch", + "", + f"{len(items)} open · as of `{meta['head'][:8]}` ({meta['date']})", + "", + "> Regenerate with `python scripts/todos.py --md todos.md` after adding or", + "> resolving a TODO, and commit it in the same commit.", + "", + ] + for directory, group in sorted(group_by_dir(items).items()): + out += [f"### `{directory.replace('Physlib/', '')}`", ""] + for path, line, content in group: + name = path.rsplit("/", 1)[1] + link = f"{repo_url}/blob/{link_ref}/{path}#L{line}" + out.append(f"- {md_escape(content)}  [`{name}:{line}`]({link})") + out.append("") + + return "\n".join(out) + + +def main(): + # Lean sources are full of ℂ, ℝ, ψ; the Windows console defaults to cp1252. + sys.stdout.reconfigure(encoding="utf-8", errors="replace") + + ap = argparse.ArgumentParser() + ap.add_argument("--repo", default=".") + ap.add_argument("--head", default=DEFAULT_HEAD) + ap.add_argument("--base", default=None, help="defaults to merge-base with master") + ap.add_argument("--master", default=DEFAULT_MASTER) + ap.add_argument("--root", default=DEFAULT_ROOT) + ap.add_argument("--plain", action="store_true", help="no line numbers; diff-friendly") + ap.add_argument("--md") + ap.add_argument("--repo-url", default="https://github.com/jstoobysmith/JTSphyslib") + # Link against the branch, not the head SHA: a SHA in every URL would rewrite + # every line of todos.md on each push, even when no TODO changed. + ap.add_argument("--link-ref", default="AddPotentialAlgebra") + args = ap.parse_args() + + head_sha = git(args.repo, "rev-parse", args.head).strip() + date = git(args.repo, "log", "-1", "--format=%ad", "--date=short", args.head).strip() + base = args.base or git(args.repo, "merge-base", args.master, args.head).strip() + + items, unknown, nfiles = scan(args.repo, args.head, args.root) + base_items, _, _ = scan(args.repo, base, args.root) + + base_keys = {key(c) for *_, c in base_items} + items = [it for it in items if key(it[3]) not in base_keys] + + meta = {"base": base, "head": head_sha, "date": date, "files": nfiles} + + emit_terminal(items, unknown, meta, args.plain) + if args.md: + with open(args.md, "w", encoding="utf-8") as fh: + fh.write(emit_md(items, meta, args.repo_url, args.link_ref)) + + +if __name__ == "__main__": + main() diff --git a/todos.md b/todos.md new file mode 100644 index 000000000..3020d5f65 --- /dev/null +++ b/todos.md @@ -0,0 +1,46 @@ +# TODOs introduced by this branch + +19 open · as of `96514504` (2026-08-14) + +> Regenerate with `python scripts/todos.py --md todos.md` after adding or +> resolving a TODO, and commit it in the same commit. + +### `Particles/LeptonGaugeSector/JetAlgebra/Boosts` + +- Generalize the below result for any axis  [`FieldStrength.lean:348`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean#L348) + +### `Particles/PureFermionic` + +- Move the diagonal `SL(2, ℂ)` material `diagSL`, `diagSL_inv`, `diagSL_neg_one` and `twoI` to `Physlib.Relativity.SL2C.Basic`, their canonical home, when the effective-potential development is split up.  [`EFTLagrangianExclDeriv.lean:162`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean#L162) + +### `Particles/QED` + +- Prove the composition law of the Lorentz action. Being a pullback on coordinates it is a right action, `lorentzAction M ∘ lorentzAction N = lorentzAction (N * M)`; the proof needs permutation-invariance and functoriality of `derivSum` over sorted lists.  [`Basic.lean:1431`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/Basic.lean#L1431) +- Define an antilinear star on the QED jet algebra with `star ψ = ψ̄`, `star A = A`, and prove hermiticity of the Lagrangian up to the total derivative of the kinetic term.  [`Basic.lean:1434`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/Basic.lean#L1434) +- Connect the QED matter content to `Physlib.QFT.QED.AnomalyCancellation`: the electron spectrum is vector-like (charges `±1`), so it satisfies the gravitational and cubic anomaly cancellation conditions.  [`CurrentCoupling.lean:56`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/CurrentCoupling.lean#L56) +- Classify the gauge- and Lorentz-invariant elements of mass dimension at most four of the full QED jet algebra: the analogue for the Dirac electron of the classification `LeptonGaugeSector.JetAlgebra.MassDimFour.Classification`, showing the QED Lagrangian is the most general renormalizable choice.  [`JetCompleteness.lean:57`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/JetCompleteness.lean#L57) +- Derive `diracEquation`, `diracAdjEquation` and `qedMaxwellEquation` variationally: define the Euler–Lagrange operator on the jet algebra (the variational derivative with respect to each jet coordinate) and prove they are the EL equations of `lagrangian`, following `Physlib.Electromagnetism.Dynamics.IsExtrema` concretely.  [`Lagrangian.lean:119`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/Lagrangian.lean#L119) +- Define the theta term `θ ε^{μνρσ} F_{μν} F_{ρσ}` and prove it is gauge invariant and a total derivative for `jetDeriv`, as in the lepton–gauge sector's theta term.  [`Lagrangian.lean:123`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/Lagrangian.lean#L123) +- Quantize: instantiate the field species of `Physlib.QFT.PerturbationTheory` with the photon and electron of this file, towards the Feynman rules of QED.  [`Lagrangian.lean:125`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/Lagrangian.lean#L125) +- Upgrade the mass-weight scaling to a genuine filtration by submodules, following `LeptonGaugeSector.JetAlgebra.MassDim` (`MassWeightLESubmodule`), together with the derivative-order and fermion-parity gradings needed for classification arguments.  [`MassDimension.lean:61`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/MassDimension.lean#L61) + +### `Particles/StandardModel/GaugeBosons/BBoson` + +- Show invariance of the mass weights with repsect to the Lorentz group.  [`MassDim.lean:310`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean#L310) + +### `Particles/StandardModel/GaugeGroup` + +- Make the API here match what is in the doc-string.  [`JetGaugeAlgebra.lean:51`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L51) +- Define the Lie algebra instance on `JetGaugeAlgebra`.  [`JetGaugeAlgebra.lean:87`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L87) +- Define the basis of the jet gauge algebra.  [`JetGaugeAlgebra.lean:95`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L95) +- Define the adjoint representation of the jet gauge group on the jet gauge algebra.  [`JetGaugeAlgebra.lean:104`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L104) +- The maurerCartan form should be defined for the whole gauge group, and it should live in the jet Lie algebra.  [`MaurerCartan.lean:50`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean#L50) +- Define the symmetrized maurerCartan forms.  [`MaurerCartan.lean:53`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean#L53) + +### `Particles/WessZumino/EFTLagrangianExclDeriv` + +- Define ComplexScalarEFTExclDeriv.rep  [`Basic.lean:280`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean#L280) + +### `Relativity/Fermions/Weyl` + +- Relate `DualLeftHandedWeyl` to `LeftHandedWeyl` via `Module.dual`.  [`DualLeftHanded.lean:35`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean#L35) From 4390daa5821c56691c05b74f82048b668bae930f Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 16 Aug 2026 00:22:55 +0400 Subject: [PATCH 145/254] docs: Note the expected TODO format in todos.md --- scripts/todos.py | 2 ++ todos.md | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/todos.py b/scripts/todos.py index ab7baaa90..899030cd0 100644 --- a/scripts/todos.py +++ b/scripts/todos.py @@ -183,6 +183,8 @@ def emit_md(items, meta, repo_url, link_ref): "> Regenerate with `python scripts/todos.py --md todos.md` after adding or", "> resolving a TODO, and commit it in the same commit.", "", + '**Format.** Use the `TODO "…"` command', + "", ] for directory, group in sorted(group_by_dir(items).items()): out += [f"### `{directory.replace('Physlib/', '')}`", ""] diff --git a/todos.md b/todos.md index 3020d5f65..e37b53589 100644 --- a/todos.md +++ b/todos.md @@ -1,10 +1,12 @@ # TODOs introduced by this branch -19 open · as of `96514504` (2026-08-14) +19 open · as of `bd9a23d1` (2026-08-16) > Regenerate with `python scripts/todos.py --md todos.md` after adding or > resolving a TODO, and commit it in the same commit. +**Format.** Use the `TODO "…"` command + ### `Particles/LeptonGaugeSector/JetAlgebra/Boosts` - Generalize the below result for any axis  [`FieldStrength.lean:348`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean#L348) From 5c4cb4538f7cf256c502b6ce001bf3ddf6b3330e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 16 Aug 2026 00:24:48 +0400 Subject: [PATCH 146/254] feat: Convert the basis TODO in JetGaugeAlgebra to the TODO command --- .../GaugeGroup/JetGaugeAlgebra.lean | 2 +- scripts/todos.py | 51 +++++++++++++++---- todos.md | 5 +- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean index 4990724e1..8df00778d 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean @@ -26,7 +26,6 @@ defined explicitly via self-adjoint matrices, and giving it an instance `LieAlge Note here that `JetGaugeAlgebra` is a module over `ℝ` not `ℂ` or `JetRing`. On this Lie algebra define a prefered basis, `basis`, indexed by `basisIndex`. -TODO: add discussion about the basis We let `structuralConstant` be the structure constants of the Lie algebra with respect to this prefered basis, so that @@ -49,6 +48,7 @@ The derivative acts on brackets via the Leibniz rule: @[expose] public section TODO "Make the API here match what is in the doc-string." +TODO "Add discussion about the basis." namespace StandardModel open MvPowerSeries Matrix diff --git a/scripts/todos.py b/scripts/todos.py index 899030cd0..48b7b694f 100644 --- a/scripts/todos.py +++ b/scripts/todos.py @@ -2,22 +2,26 @@ """ todos.py -- list the TODOs this branch introduces, relative to its merge-base. -Scans two git refs with the same matcher and subtracts the sets, so the output -is "what this PR adds", not "every TODO in Physlib". Reads blobs straight out -of the object store: no checkout, no branch switching, working tree untouched. +Scans the working tree and the merge-base with the same matcher and subtracts +the sets, so the output is "what this PR adds", not "every TODO in Physlib". +The default scans the working tree, so uncommitted edits are visible and the +file can be regenerated in the same commit that changes a TODO. + +Pass --head to read another ref instead, straight out of the object store: no +checkout, no branch switching, working tree untouched. python scripts/todos.py # to the terminal python scripts/todos.py --md todos.md - python scripts/todos.py --head origin/my-branch + python scripts/todos.py --head joseph/AddPotentialAlgebra """ import argparse +import os import re import subprocess import sys import textwrap -DEFAULT_HEAD = "HEAD" DEFAULT_MASTER = "upstream/master" DEFAULT_ROOT = "Physlib" @@ -121,10 +125,33 @@ def parse_file(path, text): return items, unclassified +def list_files_worktree(repo, root): + paths = git(repo, "ls-files", "--", root).splitlines() + return [p for p in paths if p.endswith(".lean") and not EXCLUDE.search(p)] + + +def read_worktree(repo, paths): + blobs = {} + for path in paths: + try: + with open(os.path.join(repo, path), encoding="utf-8") as fh: + blobs[path] = fh.read() + except OSError: + continue + return blobs + + def scan(repo, ref, root): - paths = list_files(repo, ref, root) + """ref=None scans the working tree, so uncommitted edits are visible.""" + if ref is None: + paths = list_files_worktree(repo, root) + blobs = read_worktree(repo, paths) + else: + paths = list_files(repo, ref, root) + blobs = read_blobs(repo, ref, paths) + items, unknown = [], [] - for path, text in read_blobs(repo, ref, paths).items(): + for path, text in blobs.items(): a, b = parse_file(path, text) items += a unknown += b @@ -203,7 +230,7 @@ def main(): ap = argparse.ArgumentParser() ap.add_argument("--repo", default=".") - ap.add_argument("--head", default=DEFAULT_HEAD) + ap.add_argument("--head", default=None, help="defaults to the working tree") ap.add_argument("--base", default=None, help="defaults to merge-base with master") ap.add_argument("--master", default=DEFAULT_MASTER) ap.add_argument("--root", default=DEFAULT_ROOT) @@ -215,9 +242,11 @@ def main(): ap.add_argument("--link-ref", default="AddPotentialAlgebra") args = ap.parse_args() - head_sha = git(args.repo, "rev-parse", args.head).strip() - date = git(args.repo, "log", "-1", "--format=%ad", "--date=short", args.head).strip() - base = args.base or git(args.repo, "merge-base", args.master, args.head).strip() + head_sha = git(args.repo, "rev-parse", args.head or "HEAD").strip() + date = git(args.repo, "log", "-1", "--format=%ad", "--date=short", + args.head or "HEAD").strip() + base = args.base or git(args.repo, "merge-base", args.master, + args.head or "HEAD").strip() items, unknown, nfiles = scan(args.repo, args.head, args.root) base_items, _, _ = scan(args.repo, base, args.root) diff --git a/todos.md b/todos.md index e37b53589..520d98257 100644 --- a/todos.md +++ b/todos.md @@ -1,6 +1,6 @@ # TODOs introduced by this branch -19 open · as of `bd9a23d1` (2026-08-16) +20 open · as of `4390daa5` (2026-08-16) > Regenerate with `python scripts/todos.py --md todos.md` after adding or > resolving a TODO, and commit it in the same commit. @@ -32,7 +32,8 @@ ### `Particles/StandardModel/GaugeGroup` -- Make the API here match what is in the doc-string.  [`JetGaugeAlgebra.lean:51`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L51) +- Make the API here match what is in the doc-string.  [`JetGaugeAlgebra.lean:50`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L50) +- Add discussion about the basis.  [`JetGaugeAlgebra.lean:51`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L51) - Define the Lie algebra instance on `JetGaugeAlgebra`.  [`JetGaugeAlgebra.lean:87`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L87) - Define the basis of the jet gauge algebra.  [`JetGaugeAlgebra.lean:95`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L95) - Define the adjoint representation of the jet gauge group on the jet gauge algebra.  [`JetGaugeAlgebra.lean:104`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L104) From 54f740d4825c3474aa1c824024010c811889300b Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 16 Aug 2026 00:51:29 +0400 Subject: [PATCH 147/254] refactor: Drop the commit SHA from the todos.md header --- scripts/todos.py | 2 +- todos.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/todos.py b/scripts/todos.py index 48b7b694f..b557f9aaf 100644 --- a/scripts/todos.py +++ b/scripts/todos.py @@ -205,7 +205,7 @@ def emit_md(items, meta, repo_url, link_ref): out = [ "# TODOs introduced by this branch", "", - f"{len(items)} open · as of `{meta['head'][:8]}` ({meta['date']})", + f"{len(items)} open · as of {meta['date']}", "", "> Regenerate with `python scripts/todos.py --md todos.md` after adding or", "> resolving a TODO, and commit it in the same commit.", diff --git a/todos.md b/todos.md index 520d98257..9027027e6 100644 --- a/todos.md +++ b/todos.md @@ -1,6 +1,6 @@ # TODOs introduced by this branch -20 open · as of `4390daa5` (2026-08-16) +20 open · as of 2026-08-16 > Regenerate with `python scripts/todos.py --md todos.md` after adding or > resolving a TODO, and commit it in the same commit. From e53ddf9f0b35f656fe36539061048c04001f1264 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 05:56:40 +0100 Subject: [PATCH 148/254] feat: Improve docs around JetGaugeAlgebra --- .../StandardModel/GaugeGroup/JetGaugeAlgebra.lean | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean index 8df00778d..2867314c0 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean @@ -21,14 +21,19 @@ public import Mathlib.Algebra.MvPolynomial.Derivation # The jet gauge algebra We define `JetGaugeAlgebra` as the Lie algebra of `JetGaugeGroupI`, -defined explicitly via self-adjoint matrices, and giving it an instance `LieAlgebra`. +defined explicitly as traceless self-adjoint matrices, and giving it an instance `LieAlgebra`. +This is a matrix Lie algebra, so the bracket is given by the commutator of matrices. Note here that `JetGaugeAlgebra` is a module over `ℝ` not `ℂ` or `JetRing`. On this Lie algebra define a prefered basis, `basis`, indexed by `basisIndex`. +Here `basisIndex` is the sum `Fin 8 ⊕ Fin 3 ⊕ Fin 1`. The first factor +corresponds to the Gell-Mann matrices which form a basis of `su(3)`, +the second factor corresponds to the Pauli matrices which form a basis of `su(2)`, +and the third factor corresponds to the identity matrix which forms a basis of `u(1)`. -We let `structuralConstant` be the structure constants of the Lie algebra with respect to this -prefered basis, so that +We let `structuralConstant` (typically called `f`) be the structure constants of the Lie algebra +with respect to this prefered basis, so that ``` [basis i, basis j] = i * ∑ k, structuralConstant i j k • basis k ``` @@ -37,7 +42,7 @@ On `JetGaugeAlgebra` we define the adjoint representation of `JetGaugeGroupI`, `adjointRep`, which acts via `x ↦ g * x * g⁻¹`. There is also a derivative `deriv : Fin 1 ⊕ Fin 3 → JetLieAlgebra →ₗ[ℝ] JetLieAlgebra` -whose action can be defined componentwise. +whose action can be defined componentwise in terms of the basis. The derivative acts on brackets via the Leibniz rule: ``` From 41fbe745b4a6a7225ade289a9d56261543429e5a Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 06:14:38 +0100 Subject: [PATCH 149/254] feat: Add PureJet --- .../StandardModel/GaugeGroup/PureJet.lean | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean diff --git a/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean b/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean new file mode 100644 index 000000000..821f2d6aa --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# The pure Jet gauge group + +Within `JetGaugeGroupI` there is a subgroup for which `U₀ = 1`, +that is those elements whose constant part is the identity. We call this +the pure Jet gauge group, and denote it `PureJetGaugeGroup`. +This is simply the kernel of the map `JetGaugeGroupI → GaugeGroupI` given by `U ↦ U₀`, +and therefore is a normal subgroup of `JetGaugeGroupI`. + +Every element `U ∈ PureJetGaugeGroup` uniquely factors as `U = (U U₀⁻¹) · U₀` with +`U U₀⁻¹ : PureJetGaugeGroup`. This gives a splitting of `JetGaugeGroupI` as as +a semi-direct product of `PureJetGaugeGroup` and `GaugeGroupI`. + +There exists a map: +``` + maurerCartanCoeff : PureJetGaugeGroup → { r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0 } → JetLieAlgebra +``` +Defined through the symmetrised Maurer-Cartan form, as +``` + U, r ↦ 1/|r| ∑_{ν ∈ r} ∂_{r − ν}| ω_ν(U). +``` +This map is a bijection, i.e. `Function.Bijective maurerCartanCoeff`. +This is the uncurried version i.e. `U ↦ (r ↦ maurerCartanCoeff U r)`. + +-/ + +@[expose] public section From 3c08e085b456d9b5382a838855de222e5d90bf25 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 06:48:08 +0100 Subject: [PATCH 150/254] docs: Add file for the normal Gauge algebra --- .../StandardModel/GaugeAlgebra/Basic.lean | 34 +++++++++++++++++++ .../JetGaugeAlgebra.lean | 3 +- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean rename Physlib/Particles/StandardModel/{GaugeGroup => GaugeAlgebra}/JetGaugeAlgebra.lean (98%) diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean new file mode 100644 index 000000000..db88cb3fd --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# The gauge algebra of the Standard Model + +The gauge algebra of the Standard Model is the Lie algebra of +`GaugeGroupI`, which is the direct sum of the Lie algebras of `SU(3)`, `SU(2)` and `U(1)`. +This is a matrix Lie algebra, so the bracket is given by the commutator of matrices. + +-/ + +@[expose] public section + +namespace StandardModel +open MvPowerSeries Matrix + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean similarity index 98% rename from Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean rename to Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 2867314c0..3a9458b26 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -26,7 +26,8 @@ This is a matrix Lie algebra, so the bracket is given by the commutator of matri Note here that `JetGaugeAlgebra` is a module over `ℝ` not `ℂ` or `JetRing`. -On this Lie algebra define a prefered basis, `basis`, indexed by `basisIndex`. +On this Lie algebra define a prefered basis, `basis`, indexed by +`basisIndex × Multiset (Fin 1 ⊕ Fin 3)`. Here `basisIndex` is the sum `Fin 8 ⊕ Fin 3 ⊕ Fin 1`. The first factor corresponds to the Gell-Mann matrices which form a basis of `su(3)`, the second factor corresponds to the Pauli matrices which form a basis of `su(2)`, From 53a1e51d8775602a33ad2a96b9ae8e171501c5c3 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 09:06:14 +0100 Subject: [PATCH 151/254] docs: Add outline --- Outline.md | 273 ++++++++++++++++++ .../StandardModel/GaugeGroup/PureJet.lean | 2 +- 2 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 Outline.md diff --git a/Outline.md b/Outline.md new file mode 100644 index 000000000..3c131fc2a --- /dev/null +++ b/Outline.md @@ -0,0 +1,273 @@ +# Outline of the full derivation + +Basic rules of this outline: +- Everything should be bullet points. +- Each bullet point contain a single logical concept. +- The distance between two bullet points in locical jumps should be small. + +## Goal + +- The goal of this project is to formalize the Standard Model Lagrangian. + + + + + + +- Let B be an algebra. + +## Jet ring + +- Let `JetRing` be the ring of jets. +- For `φ : JetRing`, and `p : Multiset (Fin 1 ⊕ Fin 3)` we let `∂_p| φ` be the + `p`-th Taylor coefficient of `φ` at the base point. + +## Jet gauge group + +- Let`JetGaugeGroup` be a (matrix) jet gauge group + +### The jet Lie algebra + +- Let `JetLieAlgebra` be the Lie algebra of `JetGaugeGroup`. +- Let `κ : Type` be the indexing set of a basis `T_a` of `JetLieAlgebra`. +- We let `f : κ → κ → κ → ℂ` be the structure constants of the Lie algebra + with respect to the basis `T_a`, so that: + `[T_a, T_b] = i ∑_c f^c_{a b} · T_c` +- An element `X : JetLieAlgebra` has components `X^a : JetRing` with respect to the + basis `T_a`. +- There is a derivative `∂ : Fin 1 ⊕ Fin 3 → JetLieAlgebra → JetLieAlgebra`, acting + componentwise: `(∂_μ X)^a = ∂_μ (X^a)`. +- Each `∂_μ` is a derivation of the bracket: `∂_μ [X, Y] = [∂_μ X, Y] + [X, ∂_μ Y]`. +- Taylor coefficients act componentwise too: `∂_s| X` is the constant Lie algebra + element with components `∂_s|(X^a) : ℂ`. + +### Maurer-Cartan form + +- There is a map `ω : JetGaugeGroup → (Fin 1 ⊕ Fin 3) → JetLieAlgebra` + defined by `ω_μ(U) := i (∂_μ U) U†`. This mp is called the Maurer-Cartan form. +- We let `ω^a_μ(U)` for `a : κ` denote the component of `ω` with respect to the `a`th + basis element. +- The adjoint action is the action of`JetGaugeGroup` on `JetLieAlgebra` by conjugation. +- We denote the components of this action as `Ad(U)^a_b` for `U : JetGaugeGroup`. +- The Maurer–Cartan form is a twisted cocycle: for `U V : JetGaugeGroup`, + + `ω_μ(U * V) = ω_μ(U) + U ω_μ(V) U†`. +- In components this reads as: + `ω^a_μ(U * V) = ω^a_μ(U) + ∑_b Ad(U)^a_b ω^b_μ(V)`. +- Two consequences: `ω_μ(1) = 0`, and `ω_μ(U⁻¹) = − Ad(U⁻¹) ω_μ(U)`. +- The Maurer–Cartan form satisfies the structure equation: for any `U`, + + `∂_μ ω^a_ν(U) − ∂_ν ω^a_μ(U) = ∑_{b c} f^a_{b c} · ω^b_μ(U) · ω^c_ν(U)` + +- Define `sym(∂_s| ω^a_μ(U)) := (1/(|s|+1)) ∑_{ν ∈ s+μ} ∂_{(s+μ)−ν}| ω^a_ν(U)`. +- We have that: + `∂_s| ω^a_μ − sym(∂_s| ω^a_μ) ∈ ℂ-span{ ∂_{s'}|(∂_ν ω^a_λ − ∂_λ ω^a_ν) : s' + ν + λ = s + μ }`. + +### Pure jet subgroup + +- For `U : JetGaugeGroup` we write `U₀` for its base-point value, viewed as a + constant jet. +- Let `PureJetGaugeGroup ⊆ JetGaugeGroup` be the subgroup of `U` with `U₀ = 1`. +- Every `U` factors uniquely as `U = (U U₀⁻¹) · U₀` with `U U₀⁻¹ : PureJetGaugeGroup`. +- Hence `JetGaugeGroup = PureJetGaugeGroup ⋊ G`, with `G` the subgroup of constant + jets. + +- By the structure equation and the multiplication rule, each spanning element equals + `∑_{b c} f^a_{b c} ∑_{p + q = s'} C(s', p) · ∂_p| ω^b_ν · ∂_q| ω^c_λ`, + in which every factor has order `≤ |s'| = |s| − 1`. +- Hence, by induction on order: for each `(s, μ, a)` there is a polynomial `P^a_{s μ}` + over `ℂ`, in commuting variables `X^b_{r ν}` indexed by multisets `r` with `|r| ≤ |s|`, + such that for every pure jet `U`: + + `∂_s| ω^a_μ(U) = P^a_{s μ}[ X^b_{r ν} := sym(∂_r| ω^b_ν(U)) ]` + +- The point is that `P^a_{s μ}` does not depend on `U`: the same polynomial works for + every pure jet. +- The recursion defining `P^a_{s μ}`: start from `X^a_{s μ}`, add the span-decomposition + correction with each antisymmetrized pair replaced via the structure equation, and + substitute lower-order `P`'s for the `∂_p| ω` factors that appear. +- A pure jet is recovered from its Maurer–Cartan form by the coefficient recursion + `∂_{s+μ}| U = −i ∑_{p + q = s} C(s, p) ∂_p| ω_μ(U) · ∂_q| U`, with `∂_0| U = 1`. +- Injectivity: two pure jets with the same symmetric parts have the same `ω` (previous + induction), hence the same recursion, hence are equal. +- Surjectivity: given a symmetric family, define the coefficients of `ω` order by + order — symmetric parts as prescribed, the complement by the structure equation — + and then define `U` by the recursion; the structure equation is exactly the + consistency condition making both recursions well-defined. +- Note `sym(∂_s| ω^a_μ(U))` depends only on the combined multiset `r := s + μ`, + so the symmetric data of `U` is a function of `(a, r)` with `r` nonempty. +- Define + + `symMC : PureJetGaugeGroup → κ → { r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0 } → ℂ` + + `symMC U a r := (1/|r|) ∑_{ν ∈ r} ∂_{r − ν}| ω^a_ν(U)` + +- Total symmetry is automatic: the codomain is indexed by the multiset `r`, so there + is no symmetry side-condition to impose. +- Lemma (freeness): `Function.Bijective symMC`. +- Remark: this is the `sym(d_s A)` argument with the roles reversed — for `ω` the + "field strength" vanishes identically (the structure equation), so nothing survives + except the symmetric parts. + +### Jet representations + +- We define a representation of `JetGaugeGroup` as the following data: + - a homomorphism `jρ : JetGaugeGroup → Matrix ι ι JetRing` + - A map `dρ : κ → Matrix ι ι ℂ` such that: + - `[dρ_a, dρ_b] = i ∑_c f^c_{a b} · dρ_c`. + - Equivariance: `∂_0| jρ(U) · dρ_a · ∂_0| jρ(U)⁻¹ = ∑_b Ad(U₀⁻¹)^a_b · dρ_b` + such that + - `∂_μ jρ(U) = -i ∑_a ω^a_μ(U) · dρ_a · ∂_0| jρ(U)` +- We will denote a Jet representation as `jρ`, dropping the `dρ` dat for notational + ease. +- The general derivatives of `jρ(U)` are then given by: + `∂_{s + μ}|(jρ(U)) = -i ∑_{p + q = s} C(s, p) ∑_a ∂_p|(ω^a_μ(U)) · dρ_a · ∂_q|(jρ(U))` +- We let `ρ₀(U) := ∂_0|(jρ(U))` +## The algebra + +- Let `B` be an algebra over `ℂ`. +- Let `JetGaugeGroup` act on `B` via algebra homomorphisms +- We write `U · x` for the action of `U : JetGaugeGroup` and `x : B`. + +## Gauge bosons + +- We say collection `A : Fin 1 ⊕ Fin 3 → κ → B` is a collection of gauge bosons + if they transform as: + - `U · (d_s A^a_μ) = ∑_{p + q = s} C(s, p) ∑_b ∂_p|(Ad(U)_{a b}) · d_q A^b_μ + ∂_s(ω^a_μ(U)) · 1` + +## Transforms under a rep + +- We say a collection `ψ : ι → B` transforms under `jρ` if + `U · (d_s ψ_i) = ∑_{p + q = s} C(s, p) ∑_j ∂_p|(jρ(U)_{i j}) · d_q ψ_j` + which can be seen as the expansion of `d_s (∑_j jρ(U)_{i j} · ψ_j)`. +- In terms of `dρ` this is equivalent to: the base case + + `U · ψ_i = ∑_j ρ₀(U)_{i j} · ψ_j` + + together with the recursion + + `U · (d_{s + μ} ψ_i) = d_μ (U · (d_s ψ_i)) − i ∑_{p + q = s} C(s, p) ∑_a ∂_p|(ω^a_μ(U)) ∑_j (dρ_a)_{i j} · (U · (d_q ψ_j))` + + which determines the transformation of each derivative from those of lower order, + with the admixture governed only by the Maurer–Cartan jets and `dρ`. +- At `s = 0` the recursion reads + + `U · (d_μ ψ_i) = d_μ (U · ψ_i) − i ∑_a ∂_0|(ω^a_μ(U)) ∑_j (dρ_a)_{i j} · (U · ψ_j)` + + i.e. the action fails to commute with `d_μ` exactly by the `dρ`-admixture at the + base-point Maurer–Cartan coefficient. + +## The covariant derivative + +- For a representation `jρ` based on the indexing set `ι` we define the covariant + derivative as a map `𝒟 : Fin 1 ⊕ Fin 3 → (ι → B) → (ι → B)` such that + `(𝒟_μ ψ)_i = d_μ ψ_i + i ∑_a ∑_j (dρ_a)_{i j} · A^a_μ · ψ_j`. +- We and iterate `𝒟` to define the covariant tower + `𝒟_l ψ` for lists `l`. + +### The transformation of covariant dervatives + +- Theorem: if `ψ` transforms under `jρ` then `𝒟_μ ψ` transforms under `jρ`. + +### The unitriangularity of covariant derivatives + +- Write `⟨A⟩ := adjoin({ d_p A^a_μ })` for the subalgebra of `B` generated by the + gauge bosons and their derivatives. +- For `S ⊆ B`, the `⟨A⟩`-span of `S` is the left `⟨A⟩`-submodule + `{ ∑_k P_k · x_k : P_k ∈ ⟨A⟩, x_k ∈ S }`. +- Lemma (unitriangularity): for every list `l`, + + `𝒟_s ψ_i − d_l ψ_i ∈ ⟨A⟩-span of { d_q ψ_j : |q| < |l|, j : ι }` + + i.e. the covariant derivative equals the ordinary one plus `⟨A⟩`-combinations of + strictly lower-order derivatives. +- This is the whole content; the useful consequences follow by induction on order: + - For every `n`, the families `{ d_q ψ_j : |q| ≤ n }` and `{ 𝒟_q ψ_j : |q| ≤ n }` + span the same left `⟨A⟩`-module — the change of generators is invertible and + triangular. + - Hence for every `n`: + + `adjoin( ⟨A⟩ ∪ { d_q ψ_j : |q| ≤ n } ) = adjoin( ⟨A⟩ ∪ { 𝒟_q ψ_j : |q| ≤ n } )` + + and taking the union over all `n`, the two towers generate the same subalgebra of + `B` relative to the connection. + +## Field strengths + +- We define the field strengths `F : κ → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → B` as follows: + `F^a_{μν} = d_μ A^a_ν − d_ν A^a_μ − ∑_{b c} f^a_{b c} · A^b_μ · A^c_ν` +- They transform with under to the (jet version) of the adjoint-representation. +- We thus have the covariant tower `𝒟_q F^a_{μν}`. + +## Symmetrized indices of adjoints + +- Define the symmetrized index + `sym(d_s A^a_μ) := (1/(|s|+1)) ∑_{ν ∈ s+μ} d_{(s+μ)−ν} A^a_ν` +- Note that `d_s A^a_μ − sym(d_s A^a_μ) = (1/(|s|+1)) ∑_{ν ∈ s+μ} (d_s A^a_μ − d_{(s+μ)−ν} A^a_ν)`, + and each summand is a pair of terms differing only in which index carries the `A`: + moving the `A`-index from `ν` to `μ` gives `d_{s'}(d_ν A^a_μ − d_μ A^a_ν)` with + `s' = (s + μ) − ν − μ`. +- Then + `d_s A^a_μ − sym(d_s A^a_μ) ∈ ℂ-span{ d_{s'}(d_ν A^a_λ − d_λ A^a_ν) : s' + ν + λ = s + μ }` +- But we have: + `d_{s'}(d_ν A^a_λ − d_λ A^a_ν) = d_{s'} F^a_{νλ} + ∑_{b c} f^a_{b c} · d_{s'}(A^b_ν · A^c_λ)` +- By the multiplication rule the last term expands as + `d_{s'}(A^b_ν · A^c_λ) = ∑_{p + q = s'} C(s', p) · d_p A^b_ν · d_q A^c_λ` + in which every factor has order `≤ |s'| = |s| − 1`. +- So: + `d_{s'}(d_ν A^a_λ − d_λ A^a_ν) − d_{s'} F^a_{νλ} ∈ adjoin({ d_p A^b_ν : |p| < |s| })`. +- Since `F` transforms in the adjoint, the unitriangularity lemma applies to it: + `d_{s'} F^a_{νλ} − 𝒟_{s'} F^a_{νλ} ∈ ⟨A⟩-span{ d_q F^a_{νλ} : |q| < |s'| }` + and (inspecting the coefficients produced by iterating `𝒟`) everything on the + right lies in `adjoin({ d_p A : |p| < |s| })`. +- Chaining the three memberships: + `d_s A^a_μ ∈ ℂ-span{ sym(d_s A^a_μ) } + ℂ-span{ 𝒟_{s'} F^a_{νλ} : |s'| = |s| − 1 } + adjoin({ d_p A : |p| < |s| })`. +- By induction on order (base case: `A^a_μ = sym(A^a_μ)`): + `adjoin({ d_p A : |p| ≤ n }) = adjoin({ sym(d_p A) : |p| ≤ n } ∪ { 𝒟_q F : |q| < n })`. + +## Pure jets and the free action + +- Let `N ⊆ JetGaugeGroup` be the subgroup of pure jets: those `U` with `U₀ = 1`. +- Every `U` factors as `U = (U U₀⁻¹) · U₀` with `U U₀⁻¹ ∈ N`, so + `JetGaugeGroup = N ⋊ G` with `G` the constant jets. +- If an element of `B` transforms only through `U₀` — e.g. the covariant towers + `𝒟_q ψ` and `𝒟_q F` — then `N` acts trivially on it. +- On a symmetric part, `U ∈ N` acts through the gauge boson law (applied to the + ℂ-linear combination defining `sym`): + + `U · sym(d_s A^a_μ) = sym(d_s A^a_μ) + sym(∂_s| ω^a_μ(U)) + (terms in { d_p A^b_ν : |p| < |s| })` + + i.e. a shift by the symmetrized Maurer–Cartan jet, up to lower order (the + lower-order terms carry `∂_p|(Ad(U))` coefficients with `p ≠ 0`). +- Lemma (freeness): the map + + `N → { totally symmetric families c^a_{s+μ} } : U ↦ ( sym(∂_s| ω^a_μ(U)) )_{s, μ, a}` + + is a bijection — the symmetrized Maurer–Cartan jets of a pure jet can be + prescribed freely and independently, order by order. + +## Invariants factor through the field strength + +- Let `S ⊆ B` be a set of elements each transforming only through `U₀` — e.g. the + covariant tower `{ 𝒟_q ψ_j }`. +- Theorem: + + `invariants of adjoin({ d_p A^a_μ } ∪ S) under JetGaugeGroup = invariants of adjoin({ 𝒟_q F^a_{μν} } ∪ S) under G` + +- Easy direction (⊇): `𝒟_q F` lies in `adjoin({ d_p A } ∪ S)` by construction and + transforms through `U₀` alone, so a `G`-invariant built from `{ 𝒟_q F } ∪ S` is + `JetGaugeGroup`-invariant. +- Hard direction (⊆): let `x ∈ adjoin({ d_p A } ∪ S)` be `JetGaugeGroup`-invariant. +- By the change of generators, write `x` as a polynomial in the symmetric parts + `sym(d_p A)` with coefficients in `adjoin({ 𝒟_q F } ∪ S)`. +- Act with `U ∈ N`: the coefficients are fixed, and each symmetric part is shifted + by the free constant `sym(∂_p| ω(U))` of the lemma, up to lower-order symmetric + parts — so work by downward induction on the top order appearing in `x`. +- Invariance under all of `N`, with the shifts freely prescribable, forces `x` to be + constant in every symmetric variable: substitute the shift and compare + coefficients — equivalently, evaluate on the "slice" where all symmetric parts are + set to zero. +- Hence `x ∈ adjoin({ 𝒟_q F } ∪ S)`. +- Finally, by `JetGaugeGroup = N ⋊ G`, the remaining invariance is under the + constant jets, which act through `U₀` — i.e. `x` is a `G`-invariant of + `adjoin({ 𝒟_q F } ∪ S)`, completing the equality. diff --git a/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean b/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean index 821f2d6aa..12a23ffab 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean @@ -27,7 +27,7 @@ This is simply the kernel of the map `JetGaugeGroupI → GaugeGroupI` given by ` and therefore is a normal subgroup of `JetGaugeGroupI`. Every element `U ∈ PureJetGaugeGroup` uniquely factors as `U = (U U₀⁻¹) · U₀` with -`U U₀⁻¹ : PureJetGaugeGroup`. This gives a splitting of `JetGaugeGroupI` as as +`U U₀⁻¹ : PureJetGaugeGroup`. This gives a splitting of `JetGaugeGroupI` as a semi-direct product of `PureJetGaugeGroup` and `GaugeGroupI`. There exists a map: From e5bcc61d492b519fd38d582b7f9a3edb4071f2ce Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 09:45:37 +0100 Subject: [PATCH 152/254] Update Outline.md --- Outline.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/Outline.md b/Outline.md index 3c131fc2a..803af40af 100644 --- a/Outline.md +++ b/Outline.md @@ -7,14 +7,21 @@ Basic rules of this outline: ## Goal -- The goal of this project is to formalize the Standard Model Lagrangian. - - - - - - -- Let B be an algebra. +- The goal of this project is to formalize the form of the + Standard Model Lagrangian at an implicit point `x₀`. +- The lagrangian depends only on the fields and their derivatives at `x₀`. +- In reality, the EFT lagrangian is a formal infinite sum of terms of all + mass dimensions. +- However, the questions physicists ask are about truncations of this sum, + for example: "what is the form of the SM lagrangian up to mass dimension `n`?". +- Such truncations are always finite polynomials in the fields and their + derivatives, because at each mass dimension there are only finitely many + independent terms. +- It therefore suffices to work with finite polynomials: classifying the + invariant terms at each mass dimension answers every truncated question. +- If ever needed, the full infinite sum can be recovered as a formal series + over mass dimensions (the graded completion), without changing the + underlying algebra of finite polynomials. ## Jet ring @@ -22,6 +29,51 @@ Basic rules of this outline: - For `φ : JetRing`, and `p : Multiset (Fin 1 ⊕ Fin 3)` we let `∂_p| φ` be the `p`-th Taylor coefficient of `φ` at the base point. +## Jet component spaces + +- For a vector space `V`, the space `JetRing ⊗[ℂ] V` describes the jets of all functions `f : SpaceTime → V`. +- As an example, consider a theory for a field valued in `V`. +- The lagrangian at `x₀` is a function of the field: it takes the jet of the + field at `x₀` and returns a number. +- The lagrangian therefore does not live in `JetRing ⊗[ℂ] V` itself, but in an + algebra of functions on `JetRing ⊗[ℂ] V`. +- A polynomial function on a vector space is a polynomial in linear + functionals on that space, i.e. in coordinate functions. +- The physicists' symbols `d_s ψ_α` are exactly such coordinate functions: + `d_s ψ_α` sends a jet `f` to its Taylor coefficient `∂_s| f_α`. +- Not every linear functional on `JetRing ⊗[ℂ] V` is of this form: the full + dual also contains functionals depending on infinitely many Taylor + coefficients at once — for example, the formal evaluation of the field at + a point other than `x₀`. +- Locality excludes these: each term of the lagrangian may depend on only + finitely many derivatives of the field at `x₀`. +- The allowed linear functionals are therefore the finite linear + combinations of the `d_s ψ_α`. +- Their span is called the jet component space, `JetComponentSpace`; it has + a basis indexed by the pairs `(s, α)`. +- Formally, `JetComponentSpace = DerivAlgebra ⊗[ℂ] Module.Dual ℂ V`, where + `DerivAlgebra` is the restricted (polynomial) dual of `JetRing`, spanned by + the functionals `∂_s|`. +- The lagrangian is then an element of the symmetric (for bosons) or + exterior (for fermions) algebra over `JetComponentSpace`. + +### The group action on coordinate functions + +- Suppose a group acts on the field by `f ↦ ρ(U) f`. +- The physicists' transformation rule is the substitution + `S_U : ψ_α ↦ ∑_β ρ(U)_{α β} ψ_β` applied to the symbols in the lagrangian. +- On coordinate functions, `S_U` is precomposition with `ρ(U)`: + `S_U(φ) = φ ∘ ρ(U)`. +- Substitution composes in the reversed order: `S_V(S_U(ψ_α)) = S_{U V}(ψ_α)`, + not `S_{V U}(ψ_α)`; the substitution rule is a right action. +- To obtain a left action (a `Representation`), one inverse must be + inserted: `U · φ := φ ∘ ρ(U)⁻¹`, the contragredient (dual) representation. +- The coordinate functions thus transform with `U⁻¹`, opposite to the field + itself — the familiar upper-index versus lower-index distinction. +- This changes nothing physical: invariance is quantified over the whole + group, so a lagrangian is invariant under all `S_U` if and only if it is + invariant under the contragredient action of all `U`. + ## Jet gauge group - Let`JetGaugeGroup` be a (matrix) jet gauge group From f96aa0ac9ea5db0bf970a2901977aa4ed114c043 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 10:35:50 +0100 Subject: [PATCH 153/254] feat: Update JetComponentSpace --- Outline.md | 106 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 40 deletions(-) diff --git a/Outline.md b/Outline.md index 803af40af..6a22e0c2a 100644 --- a/Outline.md +++ b/Outline.md @@ -33,46 +33,69 @@ Basic rules of this outline: - For a vector space `V`, the space `JetRing ⊗[ℂ] V` describes the jets of all functions `f : SpaceTime → V`. - As an example, consider a theory for a field valued in `V`. -- The lagrangian at `x₀` is a function of the field: it takes the jet of the - field at `x₀` and returns a number. -- The lagrangian therefore does not live in `JetRing ⊗[ℂ] V` itself, but in an - algebra of functions on `JetRing ⊗[ℂ] V`. -- A polynomial function on a vector space is a polynomial in linear - functionals on that space, i.e. in coordinate functions. -- The physicists' symbols `d_s ψ_α` are exactly such coordinate functions: - `d_s ψ_α` sends a jet `f` to its Taylor coefficient `∂_s| f_α`. -- Not every linear functional on `JetRing ⊗[ℂ] V` is of this form: the full - dual also contains functionals depending on infinitely many Taylor - coefficients at once — for example, the formal evaluation of the field at - a point other than `x₀`. -- Locality excludes these: each term of the lagrangian may depend on only - finitely many derivatives of the field at `x₀`. -- The allowed linear functionals are therefore the finite linear - combinations of the `d_s ψ_α`. -- Their span is called the jet component space, `JetComponentSpace`; it has - a basis indexed by the pairs `(s, α)`. -- Formally, `JetComponentSpace = DerivAlgebra ⊗[ℂ] Module.Dual ℂ V`, where - `DerivAlgebra` is the restricted (polynomial) dual of `JetRing`, spanned by - the functionals `∂_s|`. -- The lagrangian is then an element of the symmetric (for bosons) or - exterior (for fermions) algebra over `JetComponentSpace`. - -### The group action on coordinate functions - -- Suppose a group acts on the field by `f ↦ ρ(U) f`. -- The physicists' transformation rule is the substitution - `S_U : ψ_α ↦ ∑_β ρ(U)_{α β} ψ_β` applied to the symbols in the lagrangian. -- On coordinate functions, `S_U` is precomposition with `ρ(U)`: - `S_U(φ) = φ ∘ ρ(U)`. -- Substitution composes in the reversed order: `S_V(S_U(ψ_α)) = S_{U V}(ψ_α)`, - not `S_{V U}(ψ_α)`; the substitution rule is a right action. -- To obtain a left action (a `Representation`), one inverse must be - inserted: `U · φ := φ ∘ ρ(U)⁻¹`, the contragredient (dual) representation. -- The coordinate functions thus transform with `U⁻¹`, opposite to the field - itself — the familiar upper-index versus lower-index distinction. -- This changes nothing physical: invariance is quantified over the whole - group, so a lagrangian is invariant under all `S_U` if and only if it is - invariant under the contragredient action of all `U`. +- A physicist writes the lagrangian as a polynomial in symbols such as + `ψ_α`, `d_μ ψ_α`, `d_μ d_ν ψ_α`. +- To formalize the lagrangian, we must first say what kind of object a + symbol `d_s ψ_α` is. +- The symbol `d_s ψ_α` is a machine which takes a field and returns a + number: the `s`-th derivative of its `α`-th component at `x₀`. +- A field enters only through its jet, so `d_s ψ_α` is a linear functional + on `JetRing ⊗[ℂ] V`: it sends the jet `f` to its Taylor coefficient + `∂_s| f_α`. +- In other words, the symbols are the coordinate functions on the space of + jets. +- When `V` is a complex vector space, the physicist also writes conjugate + symbols `d_s ψ̄_α`, e.g. in the mass term `ψ̄ ψ`. +- These are genuinely new: a polynomial in the `d_s ψ_α` alone depends + holomorphically on the field, and real terms like `ψ̄ ψ` are not + holomorphic. +- The symbol `d_s ψ̄_α` sends the jet `f` to the complex conjugate of + `∂_s| f_α`; it is conjugate-linear in `f`, i.e. a linear functional on + the conjugate space of `JetRing ⊗[ℂ] V`. +- The physicists' practice of treating `ψ` and `ψ̄` as independent + variables is exactly this: conjugation is not complex-linear, so the + conjugate symbols cannot be built from the `d_s ψ_α` and enter as + independent coordinate functions. +- We define the jet component space `JetComponentSpace` to be the span of + the symbols `d_s ψ_α` and `d_s ψ̄_α` together; they form a basis, indexed + by the pairs `(s, α)` with a bar/no-bar tag. +- This span is smaller than the full dual of `JetRing ⊗[ℂ] V`, which also + contains non-local functionals — e.g. evaluation of the field at a point + other than `x₀` — depending on infinitely many derivatives at once; + locality is precisely the restriction to the span of the symbols. +- Formally, `JetComponentSpace = (DerivAlgebra ⊗[ℂ] Module.Dual ℂ V) × + (DerivAlgebra ⊗[ℂ] Module.Dual ℂ (ConjModule V))`, where `DerivAlgebra` + is the span of the functionals `∂_s|` on `JetRing`, and the second factor + is dropped when `V` is real (its conjugate is then not independent). +- The lagrangian — a polynomial in the symbols — is then an element of the + symmetric (for bosons) or exterior (for fermions) algebra over + `JetComponentSpace`. + +### The group action on the symbols + +- Let a group act on fields by `f ↦ ρ(U) f`. +- Because the symbols are functions of the field, their transformation is + not extra data — it is inherited: the transformed symbol is the symbol + evaluated on the transformed field. +- Evaluating on the transformed field gives + `ψ_α(ρ(U) f) = ∑_β ρ(U)_{α β} ψ_β(f)` — exactly the physicists' + substitution rule, now derived rather than postulated. +- As an operation on symbols this is precomposition, `φ ↦ φ ∘ ρ(U)`, which + composes in reverse order: acting with `U` then `V` yields `ρ(U V)`, not + `ρ(V U)` — a right action. +- A `Representation` is a left action, so one inverse must be inserted: + `U · φ := φ ∘ ρ(U)⁻¹`. +- This inverse is the familiar one in `φ'(x) = φ(Λ⁻¹ x)` for a scalar + field: a function transforms with the inverse of the transformation of + its argument. +- The symbols therefore transform in the dual (contragredient) + representation, opposite to the field itself. +- The conjugate symbols inherit their transformation the same way: + `ψ̄_α(ρ(U) f) = ∑_β conj(ρ(U)_{α β}) ψ̄_β(f)` — the physicists' rule + `ψ̄ ↦ ψ̄ U†` for a unitary representation. +- Invariance is unaffected: a lagrangian is invariant under all `U` if and + only if it is invariant under all `U⁻¹`, so both conventions single out + exactly the same invariant lagrangians. ## Jet gauge group @@ -323,3 +346,6 @@ Basic rules of this outline: - Finally, by `JetGaugeGroup = N ⋊ G`, the remaining invariance is under the constant jets, which act through `U₀` — i.e. `x` is a `G`-invariant of `adjoin({ 𝒟_q F } ∪ S)`, completing the equality. + + +## SU(3)-invariants. From f75b17a2da1a7fb71bc36b3e471cb8cf10bd1229 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 11:25:56 +0100 Subject: [PATCH 154/254] docs: Update outline. --- Outline.md | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/Outline.md b/Outline.md index 6a22e0c2a..700798c63 100644 --- a/Outline.md +++ b/Outline.md @@ -23,6 +23,13 @@ Basic rules of this outline: over mass dimensions (the graded completion), without changing the underlying algebra of finite polynomials. +- To make our API widly useable we however, generalize a lot of the arguments here. + +- The broad symmetry argument falls into three categories: + - The covariant reduction + - The Lorentz invariance + - The global gauge group invariance. + ## Jet ring - Let `JetRing` be the ring of jets. @@ -232,7 +239,9 @@ Basic rules of this outline: i.e. the action fails to commute with `d_μ` exactly by the `dρ`-admixture at the base-point Maurer–Cartan coefficient. -## The covariant derivative +# B. The covariance reduction + +## B.1. The covariant derivative - For a representation `jρ` based on the indexing set `ι` we define the covariant derivative as a map `𝒟 : Fin 1 ⊕ Fin 3 → (ι → B) → (ι → B)` such that @@ -240,11 +249,11 @@ Basic rules of this outline: - We and iterate `𝒟` to define the covariant tower `𝒟_l ψ` for lists `l`. -### The transformation of covariant dervatives +### B.1.2 The transformation of covariant dervatives - Theorem: if `ψ` transforms under `jρ` then `𝒟_μ ψ` transforms under `jρ`. -### The unitriangularity of covariant derivatives +### B.1.3 The unitriangularity of covariant derivatives - Write `⟨A⟩ := adjoin({ d_p A^a_μ })` for the subalgebra of `B` generated by the gauge bosons and their derivatives. @@ -267,14 +276,14 @@ Basic rules of this outline: and taking the union over all `n`, the two towers generate the same subalgebra of `B` relative to the connection. -## Field strengths +## B.2 Field strengths - We define the field strengths `F : κ → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → B` as follows: `F^a_{μν} = d_μ A^a_ν − d_ν A^a_μ − ∑_{b c} f^a_{b c} · A^b_μ · A^c_ν` - They transform with under to the (jet version) of the adjoint-representation. - We thus have the covariant tower `𝒟_q F^a_{μν}`. -## Symmetrized indices of adjoints +## B.3 Symmetrized indices of adjoints - Define the symmetrized index `sym(d_s A^a_μ) := (1/(|s|+1)) ∑_{ν ∈ s+μ} d_{(s+μ)−ν} A^a_ν` @@ -300,7 +309,7 @@ Basic rules of this outline: - By induction on order (base case: `A^a_μ = sym(A^a_μ)`): `adjoin({ d_p A : |p| ≤ n }) = adjoin({ sym(d_p A) : |p| ≤ n } ∪ { 𝒟_q F : |q| < n })`. -## Pure jets and the free action +## B.4 Pure jets and the free action - Let `N ⊆ JetGaugeGroup` be the subgroup of pure jets: those `U` with `U₀ = 1`. - Every `U` factors as `U = (U U₀⁻¹) · U₀` with `U U₀⁻¹ ∈ N`, so @@ -321,7 +330,7 @@ Basic rules of this outline: is a bijection — the symmetrized Maurer–Cartan jets of a pure jet can be prescribed freely and independently, order by order. -## Invariants factor through the field strength +## B.5 Invariants factor through the field strength - Let `S ⊆ B` be a set of elements each transforming only through `U₀` — e.g. the covariant tower `{ 𝒟_q ψ_j }`. @@ -348,4 +357,14 @@ Basic rules of this outline: `adjoin({ 𝒟_q F } ∪ S)`, completing the equality. -## SU(3)-invariants. +## C. Lorentz Invariance + +- Within the Standard model, after the covarance-reduction + there are +## C.1. Boost weights + +## C.2 IsLorentzFieldStrength + +## C.3 IsLorentzFermion + +## D. The global gauge group invariants From e4ca5caf929c852479f793d6274575fbfc81b74f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 12:42:29 +0100 Subject: [PATCH 155/254] feat: Add pure subgroup --- Outline.md | 8 ++- .../{PureJet.lean => Jet/Pure.lean} | 61 +++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) rename Physlib/Particles/StandardModel/GaugeGroup/{PureJet.lean => Jet/Pure.lean} (53%) diff --git a/Outline.md b/Outline.md index 700798c63..fa3f337f9 100644 --- a/Outline.md +++ b/Outline.md @@ -360,11 +360,15 @@ Basic rules of this outline: ## C. Lorentz Invariance - Within the Standard model, after the covarance-reduction - there are + there are on three types of particles, field-strengths, + LH weyl fermions and RH weyl fermions. +- We want to define collections of these objects in + arbitary groups. + ## C.1. Boost weights ## C.2 IsLorentzFieldStrength -## C.3 IsLorentzFermion +## C.3 IsLorentzLeftFermion ## D. The global gauge group invariants diff --git a/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean similarity index 53% rename from Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean rename to Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean index 12a23ffab..a7975a0fb 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/PureJet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean @@ -44,3 +44,64 @@ This is the uncurried version i.e. `U ↦ (r ↦ maurerCartanCoeff U r)`. -/ @[expose] public section + +namespace StandardModel + +namespace JetGaugeGroup + +/-- The subgroup of `JetGaugeGroupI` consisting of those gauge transformations + where the constant part is unity: the kernel of evaluation at the base + point, `JetGaugeGroupI.eval`. -/ +noncomputable def PureSubgroup : Subgroup JetGaugeGroupI := JetGaugeGroupI.eval.ker + +namespace PureSubgroup + +instance : Subgroup.Normal (PureSubgroup) := + inferInstanceAs (Subgroup.Normal (JetGaugeGroupI.eval.ker)) + +lemma mem_iff {U : JetGaugeGroupI} : U ∈ PureSubgroup ↔ U.eval = 1 := by + rw [PureSubgroup] + rfl + +@[simp] +lemma eval_ceo_mem (U : PureSubgroup) : U.1.eval = 1 := by + rcases U with ⟨U, hU⟩ + rw [mem_iff] at hU + exact hU + +lemma self_mul_ofConstant_eval_mem (U : JetGaugeGroupI) : + U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ ∈ PureSubgroup := by + rw [mem_iff] + simp + +/-! + +## The projection from `JetGaugeGroupI` onto `PureSubgroup` + +-/ + +/-- The projection from `JetGaugeGroupI` onto `PureSubgroup`. This is + not a group homomorphism. -/ +noncomputable def proj (U : JetGaugeGroupI) : PureSubgroup := + ⟨U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ , self_mul_ofConstant_eval_mem U⟩ + +lemma proj_surjective : Function.Surjective proj := by + intro U + use (U : JetGaugeGroupI) + simp [proj] + +lemma proj_eq_one_iff_constant {U : JetGaugeGroupI} : + proj U = 1 ↔ ∃ c, U = .ofConstant c := by + constructor + · intro h + refine ⟨U.eval, ?_⟩ + have h1 : U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ = 1 := congrArg Subtype.val h + exact mul_inv_eq_one.mp h1 + · rintro ⟨c, rfl⟩ + apply Subtype.ext + simp [proj] + +end PureSubgroup + +end JetGaugeGroup +end StandardModel From 3d4a3c3665f2ea6d6103af8296e2845b19e5bcf0 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 14:19:30 +0100 Subject: [PATCH 156/254] feat: Starts on Jet Gauge Algebra --- .../GaugeAlgebra/JetGaugeAlgebra.lean | 113 ++++++++++- .../StandardModel/GaugeGroup/Jet.lean | 184 ++++++++++++++++++ .../GaugeGroup/MaurerCartan.lean | 79 +++++++- .../GaugeGroup/MaurerCartan/Basic.lean | 65 +++++++ 4 files changed, 430 insertions(+), 11 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 3a9458b26..8e3b435d6 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -17,6 +17,9 @@ public import Physlib.Particles.LagrangianTheory.Basic public import Physlib.Mathematics.MvPowerSeriesDerivative public import Physlib.Mathematics.MvPolynomialTranslation public import Mathlib.Algebra.MvPolynomial.Derivation +public import Mathlib.Analysis.Normed.Algebra.Exponential +public import Mathlib.RingTheory.MvPowerSeries.PiTopology +public import Mathlib.Topology.Instances.Matrix /-! # The jet gauge algebra @@ -59,13 +62,14 @@ namespace StandardModel open MvPowerSeries Matrix /-- The jet gauge algebra: the Lie-algebra analogue of `JetGaugeGroupI`, with one factor per - gauge group factor — self-adjoint `3 × 3` and `2 × 2` matrices and a self-adjoint scalar, - all with coefficients in the ring `JetRing` of formal power series in the spacetime + gauge group factor — traceless self-adjoint `3 × 3` and `2 × 2` matrices and a self-adjoint + scalar, all with coefficients in the ring `JetRing` of formal power series in the spacetime coordinates. The Maurer–Cartan forms of the jet gauge group are valued here, hermiticity being `star_maurerCartanSU3` and its companions. -/ -abbrev JetGaugeAlgebra := - selfAdjoint (Matrix (Fin 3) (Fin 3) JetRing) × - selfAdjoint (Matrix (Fin 2) (Fin 2) JetRing) × selfAdjoint JetRing +def JetGaugeAlgebra := + { A : Matrix (Fin 3) (Fin 3) JetRing // star A = A ∧ A.trace = 0 } × + { A : Matrix (Fin 2) (Fin 2) JetRing // star A = A ∧ A.trace = 0 } × + selfAdjoint JetRing namespace JetGaugeAlgebra @@ -76,13 +80,49 @@ namespace JetGaugeAlgebra -/ /-- The `su(3)`-factor component of an element of the jet gauge algebra. -/ -def toSU3 (a : JetGaugeAlgebra) : selfAdjoint (Matrix (Fin 3) (Fin 3) JetRing) := a.1 +def toSU3Matrix (a : JetGaugeAlgebra) : Matrix (Fin 3) (Fin 3) JetRing := a.1 /-- The `su(2)`-factor component of an element of the jet gauge algebra. -/ -def toSU2 (a : JetGaugeAlgebra) : selfAdjoint (Matrix (Fin 2) (Fin 2) JetRing) := a.2.1 +def toSU2Matrix (a : JetGaugeAlgebra) : Matrix (Fin 2) (Fin 2) JetRing := a.2.1 /-- The `u(1)`-factor component of an element of the jet gauge algebra. -/ -def toU1 (a : JetGaugeAlgebra) : selfAdjoint JetRing := a.2.2 +def toU1Value (a : JetGaugeAlgebra) : JetRing := a.2.2 + +@[ext] +lemma ext_of_matrix {a b : JetGaugeAlgebra} (h1 : a.toSU3Matrix = b.toSU3Matrix) + (h2 : a.toSU2Matrix = b.toSU2Matrix) (h3 : a.toU1Value = b.toU1Value) : a = b := by + cases a; cases b + simp only [toSU3Matrix, toSU2Matrix, toU1Value] at h1 h2 h3 + grind + +/-! + +## Constructor from a product of matrices + +-/ + +def ofMatrixProd (A : Matrix (Fin 3) (Fin 3) JetRing × + Matrix (Fin 2) (Fin 2) JetRing × JetRing) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : JetGaugeAlgebra := + ⟨⟨A.1, hA⟩, ⟨A.2.1, hB⟩, ⟨A.2.2, hC⟩⟩ + +@[simp] +lemma ofMatrixProd_toSU3Matrix (A : Matrix (Fin 3) (Fin 3) JetRing × + Matrix (Fin 2) (Fin 2) JetRing × JetRing) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : + (ofMatrixProd A hA hB hC).toSU3Matrix = A.1 := by rfl + +@[simp] +lemma ofMatrixProd_toSU2Matrix (A : Matrix (Fin 3) (Fin 3) JetRing × + Matrix (Fin 2) (Fin 2) JetRing × JetRing) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : + (ofMatrixProd A hA hB hC).toSU2Matrix = A.2.1 := by rfl + +@[simp] +lemma ofMatrixProd_toU1Value (A : Matrix (Fin 3) (Fin 3) JetRing × + Matrix (Fin 2) (Fin 2) JetRing × JetRing) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : + (ofMatrixProd A hA hB hC).toU1Value = A.2.2 := by rfl /-! @@ -90,7 +130,62 @@ def toU1 (a : JetGaugeAlgebra) : selfAdjoint JetRing := a.2.2 -/ -TODO "Define the Lie algebra instance on `JetGaugeAlgebra`." +noncomputable instance : Add JetGaugeAlgebra where + add a b := + ⟨⟨a.1.1 + b.1.1, + by rw [star_add, a.1.2.1, b.1.2.1], + by rw [trace_add, a.1.2.2, b.1.2.2, add_zero]⟩, + ⟨a.2.1.1 + b.2.1.1, + by rw [star_add, a.2.1.2.1, b.2.1.2.1], + by rw [trace_add, a.2.1.2.2, b.2.1.2.2, add_zero]⟩, + a.2.2 + b.2.2⟩ + +@[simp] +lemma add_toSU3Matrix (a b : JetGaugeAlgebra) : + (a + b).toSU3Matrix = a.toSU3Matrix + b.toSU3Matrix := by rfl + +@[simp] +lemma add_toSU2Matrix (a b : JetGaugeAlgebra) : + (a + b).toSU2Matrix = a.toSU2Matrix + b.toSU2Matrix := by rfl + +@[simp] +lemma add_toU1Value (a b : JetGaugeAlgebra) : + (a + b).toU1Value = a.toU1Value + b.toU1Value := by rfl + +noncomputable instance : Zero JetGaugeAlgebra where + zero := ⟨⟨0, by simp, by simp⟩, ⟨0, by simp, by simp⟩, 0⟩ + +@[simp] +lemma zero_toSU3Matrix : (0 : JetGaugeAlgebra).toSU3Matrix = 0 := by rfl + +@[simp] +lemma zero_toSU2Matrix : (0 : JetGaugeAlgebra).toSU2Matrix = 0 := by rfl + +@[simp] +lemma zero_toU1Value : (0 : JetGaugeAlgebra).toU1Value = 0 := by rfl + +noncomputable instance : SMul ℝ JetGaugeAlgebra where + smul r a := + ⟨⟨r • a.1.1, + by rw [star_smul, star_trivial, a.1.2.1], + by rw [trace_smul, a.1.2.2, smul_zero]⟩, + ⟨r • a.2.1.1, + by rw [star_smul, star_trivial, a.2.1.2.1], + by rw [trace_smul, a.2.1.2.2, smul_zero]⟩, + r • a.2.2⟩ + +@[simp] +lemma smul_toSU3Matrix (r : ℝ) (a : JetGaugeAlgebra) : + (r • a).toSU3Matrix = r • a.toSU3Matrix := by rfl + +@[simp] +lemma smul_toSU2Matrix (r : ℝ) (a : JetGaugeAlgebra) : + (r • a).toSU2Matrix = r • a.toSU2Matrix := by rfl + +@[simp] +lemma smul_toU1Value (r : ℝ) (a : JetGaugeAlgebra) : + (r • a).toU1Value = r • a.toU1Value := by rfl + /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index 49245aca0..97ed8f3c1 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -120,6 +120,11 @@ abbrev JetGaugeGroupI : Type := namespace JetGaugeGroupI + +/-- The underlying matrix value of an element of `JetGaugeGroupI`. -/ +def toVal (U : JetGaugeGroupI) : Matrix (Fin 3) (Fin 3) JetRing × Matrix (Fin 2) (Fin 2) JetRing × JetRing := + (U.1.1, U.2.1.1, U.2.2.1) + /-! ## C. Evaluation at the base point @@ -173,6 +178,185 @@ noncomputable def eval : JetGaugeGroupI →* GaugeGroupI := /-! +## The derivative + +We define the derivative of an element of `JetGaugeGroupI` as a product of matrices, +and give some properties of it related to the Maurer–Cartan form. + +-/ + +/-- The derivative of an element of `JetGaugeGroupI` returning + a product of matrices. -/ +noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : + Matrix (Fin 3) (Fin 3) JetRing × Matrix (Fin 2) (Fin 2) JetRing × JetRing := + (U.1.1.map (pderiv ℂ μ), U.2.1.1.map (pderiv ℂ μ), pderiv ℂ μ U.2.2.1) + + +lemma deriv_mul (μ : Fin 1 ⊕ Fin 3) (U V : JetGaugeGroupI) : + deriv μ (U * V) = deriv μ U * V.toVal + U.toVal * deriv μ V := by + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show (U.1.1 * V.1.1).map (pderiv ℂ μ) = + U.1.1.map (pderiv ℂ μ) * V.1.1 + U.1.1 * V.1.1.map (pderiv ℂ μ) + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + · show (U.2.1.1 * V.2.1.1).map (pderiv ℂ μ) = + U.2.1.1.map (pderiv ℂ μ) * V.2.1.1 + U.2.1.1 * V.2.1.1.map (pderiv ℂ μ) + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + · show pderiv ℂ μ (U.2.2.1 * V.2.2.1) = + pderiv ℂ μ U.2.2.1 * V.2.2.1 + U.2.2.1 * pderiv ℂ μ V.2.2.1 + rw [Derivation.leibniz] + simp only [smul_eq_mul] + ring + +@[simp] +lemma deriv_one (μ : Fin 1 ⊕ Fin 3) : deriv μ (1 : JetGaugeGroupI) = 0 := by + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show (1 : Matrix (Fin 3) (Fin 3) JetRing).map (pderiv ℂ μ) = 0 + ext i j : 1 + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ μ)] + · show (1 : Matrix (Fin 2) (Fin 2) JetRing).map (pderiv ℂ μ) = 0 + ext i j : 1 + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ μ)] + · show pderiv ℂ μ (1 : JetRing) = 0 + exact pderiv_one + +lemma star_deriv (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : + star (deriv μ U) = deriv μ (star U) := by + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show star (U.1.1.map (pderiv ℂ μ)) = (star U.1.1).map (pderiv ℂ μ) + ext i j : 1 + simp only [Matrix.star_apply, Matrix.map_apply] + exact (JetRing.pderiv_star μ (U.1.1 j i)).symm + · show star (U.2.1.1.map (pderiv ℂ μ)) = (star U.2.1.1).map (pderiv ℂ μ) + ext i j : 1 + simp only [Matrix.star_apply, Matrix.map_apply] + exact (JetRing.pderiv_star μ (U.2.1.1 j i)).symm + · show star (pderiv ℂ μ U.2.2.1) = pderiv ℂ μ (star U.2.2.1) + exact (JetRing.pderiv_star μ U.2.2.1).symm + +lemma deriv_mul_inv_toVal_SU3_traceless (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : + (Complex.I • (deriv μ U * (U⁻¹).toVal)).1.trace = 0 := by + set A : Matrix (Fin 3) (Fin 3) JetRing := U.1.1 with hA + have hU : A * star A = 1 := by + have h := (mem_specialUnitaryGroup_iff.mp U.1.2).1 + rwa [mem_unitaryGroup_iff] at h + have hdet : A.det = 1 := (mem_specialUnitaryGroup_iff.mp U.1.2).2 + have hadj : star A = A.adjugate := by + have h1 : star A * A = 1 := mul_eq_one_comm.mp hU + calc star A = star A * (A * A.adjugate) := by + rw [Matrix.mul_adjugate, hdet, one_smul, mul_one] + _ = star A * A * A.adjugate := by rw [mul_assoc] + _ = A.adjugate := by rw [h1, one_mul] + have jacobi : (A.map (pderiv ℂ μ) * A.adjugate).trace = pderiv ℂ μ A.det := by + rw [Matrix.det_fin_three] + simp only [Matrix.trace_fin_three, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.map_apply, Matrix.adjugate_fin_three, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.head_cons, + Matrix.tail_cons, Matrix.head_fin_const, Matrix.empty_val', Matrix.cons_val_fin_one, + map_sub, map_add, Derivation.leibniz, smul_eq_mul] + ring + rw [show (Complex.I • (deriv μ U * (U⁻¹).toVal)).1 = + Complex.I • (A.map (pderiv ℂ μ) * star A) from rfl, + Matrix.trace_smul, hadj, jacobi, hdet, pderiv_one, smul_zero] + +lemma deriv_mul_inv_toVal_SU2_traceless (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : + (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.1.trace = 0 := by + set A : Matrix (Fin 2) (Fin 2) JetRing := U.2.1.1 with hA + have hU : A * star A = 1 := by + have h := (mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rwa [mem_unitaryGroup_iff] at h + have hdet : A.det = 1 := (mem_specialUnitaryGroup_iff.mp U.2.1.2).2 + have hadj : star A = A.adjugate := by + have h1 : star A * A = 1 := mul_eq_one_comm.mp hU + calc star A = star A * (A * A.adjugate) := by + rw [Matrix.mul_adjugate, hdet, one_smul, mul_one] + _ = star A * A * A.adjugate := by rw [mul_assoc] + _ = A.adjugate := by rw [h1, one_mul] + have jacobi : (A.map (pderiv ℂ μ) * A.adjugate).trace = pderiv ℂ μ A.det := by + rw [Matrix.det_fin_two] + simp only [adjugate_fin_two, trace_fin_two, Matrix.mul_apply, map_apply, of_apply, cons_val', + cons_val_zero, empty_val', cons_val_fin_one, Fin.sum_univ_two, cons_val_one, map_sub, + Derivation.leibniz, smul_eq_mul] + ring + rw [show (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.1 = + Complex.I • (A.map (pderiv ℂ μ) * star A) from rfl, + Matrix.trace_smul, hadj, jacobi, hdet, pderiv_one, smul_zero] + +lemma star_deriv_mul_inv_toVal_SU3 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : + star ((Complex.I • (deriv μ U * (U⁻¹).toVal)).1) = + (Complex.I • (deriv μ U * (U⁻¹).toVal)).1 := by + set A : Matrix (Fin 3) (Fin 3) JetRing := U.1.1 with hA + -- differentiate the unitarity relation `U U⁻¹ = 1` with the Leibniz rule `deriv_mul` + have h := deriv_mul μ U U⁻¹ + rw [mul_inv_cancel, deriv_one] at h + have hq : A * ((star A).map (pderiv ℂ μ)) = -(A.map (pderiv ℂ μ) * star A) := + congrArg (fun p => p.1) (eq_neg_of_add_eq_zero_right h.symm) + have hstarmap : star (A.map (pderiv ℂ μ)) = (star A).map (pderiv ℂ μ) := + congrArg (fun p => p.1) (star_deriv μ U) + -- rewrite the `ℂ`-scalar `i` as the constant series `C i`, acting through `JetRing` + have hCs : (Complex.I • (deriv μ U * (U⁻¹).toVal)).1 = + (MvPowerSeries.C Complex.I : JetRing) • (A.map (pderiv ℂ μ) * star A) := by + rw [show (Complex.I • (deriv μ U * (U⁻¹).toVal)).1 = + Complex.I • (A.map (pderiv ℂ μ) * star A) from rfl] + ext i j + simp only [Matrix.smul_apply, smul_eq_mul, Algebra.smul_def, + MvPowerSeries.algebraMap_apply] + simp + -- the star flips `i` to `-i` and the differentiated unitarity flips the product back + rw [hCs, star_smul, star_mul, star_star, hstarmap, hq, JetRing.star_C, + show (star Complex.I) = -Complex.I by simp, map_neg, neg_smul, smul_neg, neg_neg] + +lemma star_deriv_mul_inv_toVal_SU2 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : + star ((Complex.I • (deriv μ U * (U⁻¹).toVal)).2.1) = + (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.1 := by + set A : Matrix (Fin 2) (Fin 2) JetRing := U.2.1.1 with hA + -- differentiate the unitarity relation `U U⁻¹ = 1` with the Leibniz rule `deriv_mul` + have h := deriv_mul μ U U⁻¹ + rw [mul_inv_cancel, deriv_one] at h + have hq : A * ((star A).map (pderiv ℂ μ)) = -(A.map (pderiv ℂ μ) * star A) := + congrArg (fun p => p.2.1) (eq_neg_of_add_eq_zero_right h.symm) + have hstarmap : star (A.map (pderiv ℂ μ)) = (star A).map (pderiv ℂ μ) := + congrArg (fun p => p.2.1) (star_deriv μ U) + -- rewrite the `ℂ`-scalar `i` as the constant series `C i`, acting through `JetRing` + have hCs : (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.1 = + (MvPowerSeries.C Complex.I : JetRing) • (A.map (pderiv ℂ μ) * star A) := by + rw [show (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.1 = + Complex.I • (A.map (pderiv ℂ μ) * star A) from rfl] + ext i j + simp only [Matrix.smul_apply, smul_eq_mul, Algebra.smul_def, + MvPowerSeries.algebraMap_apply] + simp + -- the star flips `i` to `-i` and the differentiated unitarity flips the product back + rw [hCs, star_smul, star_mul, star_star, hstarmap, hq, JetRing.star_C, + show (star Complex.I) = -Complex.I by simp, map_neg, neg_smul, smul_neg, neg_neg] + +lemma star_deriv_mul_inv_toVal_U1 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : + star ((Complex.I • (deriv μ U * (U⁻¹).toVal)).2.2) = + (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.2 := by + set u : JetRing := U.2.2.1 with hu' + -- differentiate the unitarity relation `U U⁻¹ = 1` with the Leibniz rule `deriv_mul` + have h := deriv_mul μ U U⁻¹ + rw [mul_inv_cancel, deriv_one] at h + have hq : pderiv ℂ μ (star u) * u = -(pderiv ℂ μ u * star u) := + (mul_comm _ _).trans (congrArg (fun p => p.2.2) (eq_neg_of_add_eq_zero_right h.symm)) + -- rewrite the `ℂ`-scalar `i` as the constant series `C i`, acting through `JetRing` + have hCs : (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.2 = + (MvPowerSeries.C Complex.I : JetRing) * (pderiv ℂ μ u * star u) := by + rw [show (Complex.I • (deriv μ U * (U⁻¹).toVal)).2.2 = + Complex.I • (pderiv ℂ μ u * star u) from rfl, + Algebra.smul_def, MvPowerSeries.algebraMap_apply] + simp + -- the star flips `i` to `-i` and the differentiated unitarity flips the product back + rw [hCs, star_mul', JetRing.star_C, star_mul', star_star, ← JetRing.pderiv_star, hq, + show (star Complex.I) = -Complex.I by simp, map_neg, neg_mul, mul_neg, neg_neg] + +/-! + ## D. Constant jets The constant power series embed the gauge group `GaugeGroupI` into the jet gauge diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index a2e6d95a2..9e1226dc4 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation @@ -41,14 +42,15 @@ It satisfies the following properties: namespace StandardModel open MvPowerSeries + + /-! ## The Maurer–Cartan forms of the jet gauge group -/ -TODO "The maurerCartan form should be defined for the whole gauge group, - and it should live in the jet Lie algebra." + TODO "Define the symmetrized maurerCartan forms." @@ -289,6 +291,79 @@ lemma star_maurerCartanSU2 (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : /-! +### The Maurer–Cartan form valued in the jet gauge algebra + +-/ + +/-- The Maurer–Cartan form `ω_μ(U) := i (∂_μ U) U†` of the jet gauge group, valued in + the jet gauge algebra. Componentwise it is the triple of the `SU(3)`, `SU(2)` and + `U(1)` Maurer–Cartan forms. Hermiticity of each factor is `star_maurerCartanSU3` and + its companions; tracelessness of the two `SU` factors is Jacobi's formula, + `tr ((∂_μ U) U†) = tr ((∂_μ U) · adjugate U) = ∂_μ (det U) = ∂_μ 1 = 0`, + using `U† = adjugate U` for a special unitary `U`. -/ +noncomputable def maurerCartan (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : JetGaugeAlgebra := + ⟨⟨maurerCartanSU3 U μ, + -- hermitian: differentiate the unitarity relation `U U† = 1` + star_maurerCartanSU3 U μ, + -- traceless: Jacobi's formula on the `3 × 3` factor + by + set A : Matrix (Fin 3) (Fin 3) JetRing := (U.1 : Matrix (Fin 3) (Fin 3) JetRing) with hA + have hU : A * star A = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hdet : A.det = 1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).2 + -- for a special unitary matrix, the conjugate transpose is the adjugate + have hadj : star A = A.adjugate := by + have h1 : star A * A = 1 := mul_eq_one_comm.mp hU + calc star A = star A * (A * A.adjugate) := by + rw [Matrix.mul_adjugate, hdet, one_smul, mul_one] + _ = star A * A * A.adjugate := by rw [mul_assoc] + _ = A.adjugate := by rw [h1, one_mul] + -- Jacobi's formula, by explicit computation on the `3 × 3` entries + have jacobi : (A.map (pderiv ℂ μ) * A.adjugate).trace = pderiv ℂ μ A.det := by + rw [Matrix.det_fin_three] + simp only [Matrix.trace_fin_three, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.map_apply, Matrix.adjugate_fin_three, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.head_cons, + Matrix.tail_cons, Matrix.head_fin_const, Matrix.empty_val', Matrix.cons_val_fin_one, + map_sub, map_add, Derivation.leibniz, smul_eq_mul] + ring + rw [show maurerCartanSU3 U μ = (MvPowerSeries.C Complex.I : JetRing) • + (A.map (pderiv ℂ μ) * star A) from rfl, + Matrix.trace_smul, hadj, jacobi, hdet, pderiv_one, smul_zero]⟩, + ⟨maurerCartanSU2 U μ, + -- hermitian: differentiate the unitarity relation `U U† = 1` + star_maurerCartanSU2 U μ, + -- traceless: Jacobi's formula on the `2 × 2` factor + by + set A : Matrix (Fin 2) (Fin 2) JetRing := (U.2.1 : Matrix (Fin 2) (Fin 2) JetRing) with hA + have hU : A * star A = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hdet : A.det = 1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).2 + have hadj : star A = A.adjugate := by + have h1 : star A * A = 1 := mul_eq_one_comm.mp hU + calc star A = star A * (A * A.adjugate) := by + rw [Matrix.mul_adjugate, hdet, one_smul, mul_one] + _ = star A * A * A.adjugate := by rw [mul_assoc] + _ = A.adjugate := by rw [h1, one_mul] + have jacobi : (A.map (pderiv ℂ μ) * A.adjugate).trace = pderiv ℂ μ A.det := by + rw [Matrix.det_fin_two] + simp only [Matrix.trace_fin_two, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.map_apply, Matrix.adjugate_fin_two, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.head_fin_const, + Matrix.empty_val', Matrix.cons_val_fin_one, map_sub, map_add, map_neg, + Derivation.leibniz, smul_eq_mul] + ring + rw [show maurerCartanSU2 U μ = (MvPowerSeries.C Complex.I : JetRing) • + (A.map (pderiv ℂ μ) * star A) from rfl, + Matrix.trace_smul, hadj, jacobi, hdet, pderiv_one, smul_zero]⟩, + ⟨maurerCartanU1 U μ, + -- hermitian: differentiate the unitarity relation `u ū = 1` + by rw [selfAdjoint.mem_iff]; exact star_maurerCartanU1 U μ⟩⟩ + +/-! + ### Derivatives of the Maurer–Cartan forms -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean new file mode 100644 index 000000000..135835c97 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# The Maurer–Cartan forms of the jet gauge group + +The Maurer-Cartan form is a map +`ω : JetGaugeGroupI → (Fin 1 ⊕ Fin 3) → JetGaugeAlgebra` +defined as `ω_μ(U) := i (∂_μ U) U†`. + +We will use `ω^a_ν` to denote the `a`-th component of the Maurer–Cartan form in the +basis of the jet Lie algebra, and `f^a_{b c}` to denote the structure constants of the +jet Lie algebra in that basis. + +It satisfies the following properties: +- *Cocycle law*: `ω_μ(UV) = ω_μ(U) + U ω_μ(V) U†` +- *Value on the identity*: `ω_μ(1) = 0` +- *Value on constant gauge transformations*: `ω_μ(U₀) = 0` +- *Value on the inverse*: `ω_μ(U⁻¹) = -U⁻¹ ω_μ(U) U` +- *Structural equation*: `∂_μ ω^a_ν(U) − ∂_ν ω^a_μ(U) = ∑_{b c} f^a_{b c} · ω^b_μ(U) · ω^c_ν(U)` + +-/ + +@[expose] public section +namespace StandardModel +open MvPowerSeries + +/-! + +## The Maurer–Cartan form of the jet gauge group + +-/ + +/-- The Maurer–Cartan form `ω_μ(U) := i (∂_μ U) U⁻¹` of the jet gauge group, valued + in the jet gauge algebra. -/ +noncomputable def maurerCartanForm (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : JetGaugeAlgebra := + JetGaugeAlgebra.ofMatrixProd (Complex.I • (JetGaugeGroupI.deriv μ U * (U⁻¹).toVal)) + ⟨JetGaugeGroupI.star_deriv_mul_inv_toVal_SU3 μ U, + JetGaugeGroupI.deriv_mul_inv_toVal_SU3_traceless μ U⟩ + ⟨JetGaugeGroupI.star_deriv_mul_inv_toVal_SU2 μ U, + JetGaugeGroupI.deriv_mul_inv_toVal_SU2_traceless μ U⟩ + (JetGaugeGroupI.star_deriv_mul_inv_toVal_U1 μ U) + +@[simp] +lemma maurerCartanForm_one (μ : Fin 1 ⊕ Fin 3) : maurerCartanForm μ (1 : JetGaugeGroupI) = 0 := by + ext <;> simp [maurerCartanForm,JetGaugeGroupI.deriv_one] + +end StandardModel From 7556727bbe6fb6aa3ea03c366b5ad16baec9903a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 14:21:19 +0100 Subject: [PATCH 157/254] Update MaurerCartan.lean --- Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index 9e1226dc4..c468e8aef 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -45,6 +45,10 @@ open MvPowerSeries /-! +# THis file is OLD!!!!!!!!!!! + + +!!!!!!!!!!!!! ## The Maurer–Cartan forms of the jet gauge group From 5901955b1e265f8fb5fc07b3c548bf92301c3748 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 17 Aug 2026 14:59:08 +0100 Subject: [PATCH 158/254] feat: Improve API --- .../GaugeAlgebra/JetGaugeAlgebra.lean | 72 +++++++++++------- .../StandardModel/GaugeGroup/Jet.lean | 13 ++++ .../GaugeGroup/MaurerCartan.lean | 73 ------------------- .../GaugeGroup/MaurerCartan/Basic.lean | 58 ++++++++++++++- 4 files changed, 115 insertions(+), 101 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 8e3b435d6..fea266a85 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -66,9 +66,11 @@ open MvPowerSeries Matrix scalar, all with coefficients in the ring `JetRing` of formal power series in the spacetime coordinates. The Maurer–Cartan forms of the jet gauge group are valued here, hermiticity being `star_maurerCartanSU3` and its companions. -/ -def JetGaugeAlgebra := - { A : Matrix (Fin 3) (Fin 3) JetRing // star A = A ∧ A.trace = 0 } × - { A : Matrix (Fin 2) (Fin 2) JetRing // star A = A ∧ A.trace = 0 } × +abbrev JetGaugeAlgebra := + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 3) (Fin 3) JetRing) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 3) ℝ JetRing)) × + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 2) (Fin 2) JetRing) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 2) ℝ JetRing)) × selfAdjoint JetRing namespace JetGaugeAlgebra @@ -130,16 +132,6 @@ lemma ofMatrixProd_toU1Value (A : Matrix (Fin 3) (Fin 3) JetRing × -/ -noncomputable instance : Add JetGaugeAlgebra where - add a b := - ⟨⟨a.1.1 + b.1.1, - by rw [star_add, a.1.2.1, b.1.2.1], - by rw [trace_add, a.1.2.2, b.1.2.2, add_zero]⟩, - ⟨a.2.1.1 + b.2.1.1, - by rw [star_add, a.2.1.2.1, b.2.1.2.1], - by rw [trace_add, a.2.1.2.2, b.2.1.2.2, add_zero]⟩, - a.2.2 + b.2.2⟩ - @[simp] lemma add_toSU3Matrix (a b : JetGaugeAlgebra) : (a + b).toSU3Matrix = a.toSU3Matrix + b.toSU3Matrix := by rfl @@ -152,9 +144,6 @@ lemma add_toSU2Matrix (a b : JetGaugeAlgebra) : lemma add_toU1Value (a b : JetGaugeAlgebra) : (a + b).toU1Value = a.toU1Value + b.toU1Value := by rfl -noncomputable instance : Zero JetGaugeAlgebra where - zero := ⟨⟨0, by simp, by simp⟩, ⟨0, by simp, by simp⟩, 0⟩ - @[simp] lemma zero_toSU3Matrix : (0 : JetGaugeAlgebra).toSU3Matrix = 0 := by rfl @@ -164,16 +153,6 @@ lemma zero_toSU2Matrix : (0 : JetGaugeAlgebra).toSU2Matrix = 0 := by rfl @[simp] lemma zero_toU1Value : (0 : JetGaugeAlgebra).toU1Value = 0 := by rfl -noncomputable instance : SMul ℝ JetGaugeAlgebra where - smul r a := - ⟨⟨r • a.1.1, - by rw [star_smul, star_trivial, a.1.2.1], - by rw [trace_smul, a.1.2.2, smul_zero]⟩, - ⟨r • a.2.1.1, - by rw [star_smul, star_trivial, a.2.1.2.1], - by rw [trace_smul, a.2.1.2.2, smul_zero]⟩, - r • a.2.2⟩ - @[simp] lemma smul_toSU3Matrix (r : ℝ) (a : JetGaugeAlgebra) : (r • a).toSU3Matrix = r • a.toSU3Matrix := by rfl @@ -189,6 +168,47 @@ lemma smul_toU1Value (r : ℝ) (a : JetGaugeAlgebra) : /-! +## The derivative on the jet gauge algebra + +-/ + +/-- The formal derivative in the direction `μ` on the jet gauge algebra, acting + entrywise on each factor. It preserves hermiticity since `star` commutes with + `pderiv`, and tracelessness since the trace of the entrywise derivative is the + derivative of the trace. -/ +noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetGaugeAlgebra →ₗ[ℝ] JetGaugeAlgebra where + toFun a := ofMatrixProd + (a.toSU3Matrix.map (pderiv ℂ μ), a.toSU2Matrix.map (pderiv ℂ μ), + pderiv ℂ μ a.toU1Value) + ⟨by + ext i j : 1 + simpa [Matrix.star_apply, Matrix.map_apply, ← JetRing.pderiv_star] using + congrArg (fun M => pderiv ℂ μ (M i j)) + (show star a.toSU3Matrix = a.toSU3Matrix from a.1.2.1), + by rw [← AddMonoidHom.map_trace, show a.toSU3Matrix.trace = 0 from a.1.2.2, map_zero]⟩ + ⟨by + ext i j : 1 + simpa [Matrix.star_apply, Matrix.map_apply, ← JetRing.pderiv_star] using + congrArg (fun M => pderiv ℂ μ (M i j)) + (show star a.toSU2Matrix = a.toSU2Matrix from a.2.1.2.1), + by rw [← AddMonoidHom.map_trace, show a.toSU2Matrix.trace = 0 from a.2.1.2.2, map_zero]⟩ + (by rw [← JetRing.pderiv_star, show star a.toU1Value = a.toU1Value from a.2.2.2]) + map_add' a b := by + ext <;> simp [Matrix.map_apply] + map_smul' r a := by + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [ofMatrixProd_toSU3Matrix, ofMatrixProd_toSU2Matrix, ofMatrixProd_toU1Value, + smul_toSU3Matrix, smul_toSU2Matrix, smul_toU1Value, RingHom.id_apply] + · ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply] + rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul] + · ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply] + rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul] + · rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul] + +/-! + ## The basis -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index 97ed8f3c1..e2eb00d61 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -415,6 +415,19 @@ lemma eval_ofConstant (g : GaugeGroupI) : eval (ofConstant g) = g := by RingHom.mapMatrix_apply, Matrix.map_apply] · simp [eval, ofConstant, evalU1, ofConstantU1] +@[simp] +lemma deriv_ofConstant (μ : Fin 1 ⊕ Fin 3) (U₀ : GaugeGroupI) : + deriv μ (JetGaugeGroupI.ofConstant U₀) = 0 := by + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show ((C : ℂ →+* JetRing).mapMatrix U₀.1.1).map (pderiv ℂ μ) = 0 + ext i j : 1 + simp [RingHom.mapMatrix_apply, Matrix.map_apply, pderiv_C] + · show ((C : ℂ →+* JetRing).mapMatrix U₀.2.1.1).map (pderiv ℂ μ) = 0 + ext i j : 1 + simp [RingHom.mapMatrix_apply, Matrix.map_apply, pderiv_C] + · show pderiv ℂ μ (C U₀.2.2.1 : JetRing) = 0 + simp [pderiv_C] + end JetGaugeGroupI end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index c468e8aef..f24780c74 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -295,79 +295,6 @@ lemma star_maurerCartanSU2 (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : /-! -### The Maurer–Cartan form valued in the jet gauge algebra - --/ - -/-- The Maurer–Cartan form `ω_μ(U) := i (∂_μ U) U†` of the jet gauge group, valued in - the jet gauge algebra. Componentwise it is the triple of the `SU(3)`, `SU(2)` and - `U(1)` Maurer–Cartan forms. Hermiticity of each factor is `star_maurerCartanSU3` and - its companions; tracelessness of the two `SU` factors is Jacobi's formula, - `tr ((∂_μ U) U†) = tr ((∂_μ U) · adjugate U) = ∂_μ (det U) = ∂_μ 1 = 0`, - using `U† = adjugate U` for a special unitary `U`. -/ -noncomputable def maurerCartan (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : JetGaugeAlgebra := - ⟨⟨maurerCartanSU3 U μ, - -- hermitian: differentiate the unitarity relation `U U† = 1` - star_maurerCartanSU3 U μ, - -- traceless: Jacobi's formula on the `3 × 3` factor - by - set A : Matrix (Fin 3) (Fin 3) JetRing := (U.1 : Matrix (Fin 3) (Fin 3) JetRing) with hA - have hU : A * star A = 1 := by - have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 - rwa [Matrix.mem_unitaryGroup_iff] at h - have hdet : A.det = 1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).2 - -- for a special unitary matrix, the conjugate transpose is the adjugate - have hadj : star A = A.adjugate := by - have h1 : star A * A = 1 := mul_eq_one_comm.mp hU - calc star A = star A * (A * A.adjugate) := by - rw [Matrix.mul_adjugate, hdet, one_smul, mul_one] - _ = star A * A * A.adjugate := by rw [mul_assoc] - _ = A.adjugate := by rw [h1, one_mul] - -- Jacobi's formula, by explicit computation on the `3 × 3` entries - have jacobi : (A.map (pderiv ℂ μ) * A.adjugate).trace = pderiv ℂ μ A.det := by - rw [Matrix.det_fin_three] - simp only [Matrix.trace_fin_three, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.map_apply, Matrix.adjugate_fin_three, Matrix.of_apply, Matrix.cons_val', - Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.head_cons, - Matrix.tail_cons, Matrix.head_fin_const, Matrix.empty_val', Matrix.cons_val_fin_one, - map_sub, map_add, Derivation.leibniz, smul_eq_mul] - ring - rw [show maurerCartanSU3 U μ = (MvPowerSeries.C Complex.I : JetRing) • - (A.map (pderiv ℂ μ) * star A) from rfl, - Matrix.trace_smul, hadj, jacobi, hdet, pderiv_one, smul_zero]⟩, - ⟨maurerCartanSU2 U μ, - -- hermitian: differentiate the unitarity relation `U U† = 1` - star_maurerCartanSU2 U μ, - -- traceless: Jacobi's formula on the `2 × 2` factor - by - set A : Matrix (Fin 2) (Fin 2) JetRing := (U.2.1 : Matrix (Fin 2) (Fin 2) JetRing) with hA - have hU : A * star A = 1 := by - have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 - rwa [Matrix.mem_unitaryGroup_iff] at h - have hdet : A.det = 1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).2 - have hadj : star A = A.adjugate := by - have h1 : star A * A = 1 := mul_eq_one_comm.mp hU - calc star A = star A * (A * A.adjugate) := by - rw [Matrix.mul_adjugate, hdet, one_smul, mul_one] - _ = star A * A * A.adjugate := by rw [mul_assoc] - _ = A.adjugate := by rw [h1, one_mul] - have jacobi : (A.map (pderiv ℂ μ) * A.adjugate).trace = pderiv ℂ μ A.det := by - rw [Matrix.det_fin_two] - simp only [Matrix.trace_fin_two, Matrix.mul_apply, Fin.sum_univ_two, - Matrix.map_apply, Matrix.adjugate_fin_two, Matrix.of_apply, Matrix.cons_val', - Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.head_fin_const, - Matrix.empty_val', Matrix.cons_val_fin_one, map_sub, map_add, map_neg, - Derivation.leibniz, smul_eq_mul] - ring - rw [show maurerCartanSU2 U μ = (MvPowerSeries.C Complex.I : JetRing) • - (A.map (pderiv ℂ μ) * star A) from rfl, - Matrix.trace_smul, hadj, jacobi, hdet, pderiv_one, smul_zero]⟩, - ⟨maurerCartanU1 U μ, - -- hermitian: differentiate the unitarity relation `u ū = 1` - by rw [selfAdjoint.mem_iff]; exact star_maurerCartanU1 U μ⟩⟩ - -/-! - ### Derivatives of the Maurer–Cartan forms -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 135835c97..47b662519 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -50,7 +50,7 @@ open MvPowerSeries /-- The Maurer–Cartan form `ω_μ(U) := i (∂_μ U) U⁻¹` of the jet gauge group, valued in the jet gauge algebra. -/ -noncomputable def maurerCartanForm (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : JetGaugeAlgebra := +noncomputable def maurerCartanForm (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : JetGaugeAlgebra := JetGaugeAlgebra.ofMatrixProd (Complex.I • (JetGaugeGroupI.deriv μ U * (U⁻¹).toVal)) ⟨JetGaugeGroupI.star_deriv_mul_inv_toVal_SU3 μ U, JetGaugeGroupI.deriv_mul_inv_toVal_SU3_traceless μ U⟩ @@ -59,7 +59,61 @@ noncomputable def maurerCartanForm (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : (JetGaugeGroupI.star_deriv_mul_inv_toVal_U1 μ U) @[simp] -lemma maurerCartanForm_one (μ : Fin 1 ⊕ Fin 3) : maurerCartanForm μ (1 : JetGaugeGroupI) = 0 := by +lemma maurerCartanForm_one : maurerCartanForm (1 : JetGaugeGroupI) = 0 := by ext <;> simp [maurerCartanForm,JetGaugeGroupI.deriv_one] +lemma maurerCartanForm_ofConstant (U₀ : GaugeGroupI) : + maurerCartanForm (JetGaugeGroupI.ofConstant U₀) = 0 := by + ext <;> simp [maurerCartanForm,JetGaugeGroupI.deriv_ofConstant] + +lemma deriv_zero_of_maurerCartanForm_zero (U : JetGaugeGroupI) (h : maurerCartanForm U = 0) : + ∀ μ, U.deriv μ = 0 := by + intro μ + have h1 : maurerCartanForm U μ = 0 := congrFun h μ + -- extract the underlying value triple of the vanishing algebra element + have h2 : Complex.I • (JetGaugeGroupI.deriv μ U * (U⁻¹).toVal) = 0 := + Prod.ext (congrArg (fun a => a.1.1) h1) + (Prod.ext (congrArg (fun a => a.2.1.1) h1) (congrArg (fun a => a.2.2.1) h1)) + -- cancel the scalar `i` + have hml : (-Complex.I) * Complex.I = 1 := by simp [neg_mul, Complex.I_mul_I] + have h3 : JetGaugeGroupI.deriv μ U * (U⁻¹).toVal = 0 := by + have h4 := congrArg (fun X => (-Complex.I) • X) h2 + simpa [smul_smul, hml] using h4 + -- cancel `U⁻¹` on the right + have h5 : (U⁻¹).toVal * U.toVal = 1 := by + rw [show (U⁻¹).toVal * U.toVal = (U⁻¹ * U).toVal from rfl, inv_mul_cancel] + rfl + calc JetGaugeGroupI.deriv μ U + = JetGaugeGroupI.deriv μ U * ((U⁻¹).toVal * U.toVal) := by rw [h5, mul_one] + _ = JetGaugeGroupI.deriv μ U * (U⁻¹).toVal * U.toVal := by rw [mul_assoc] + _ = 0 := by rw [h3, zero_mul] + +lemma maurerCartanForm_eq_zero_iff_ofConstant (U : JetGaugeGroupI) : + maurerCartanForm U = 0 ↔ ∃ c, U = JetGaugeGroupI.ofConstant c := by + constructor + · intro h + -- Step 1: all first derivatives of `U` vanish. + have hderiv := deriv_zero_of_maurerCartanForm_zero U h + -- Step 2: a jet with vanishing first derivatives is the constant jet of its value. + have hconst : ∀ f : JetRing, (∀ μ, pderiv ℂ μ f = 0) → f = C (constantCoeff f) := by + intro f hf + refine pderiv.ext (fun i => ?_) ?_ + · rw [hf i, pderiv_C] + · rw [constantCoeff_C] + refine ⟨U.eval, Prod.ext (Subtype.ext ?_) (Prod.ext (Subtype.ext ?_) (Subtype.ext ?_))⟩ + · show U.1.1 = ((JetGaugeGroupI.ofConstant U.eval).1 : Matrix (Fin 3) (Fin 3) JetRing) + ext i j : 1 + exact hconst (U.1.1 i j) fun μ => by + simpa [JetGaugeGroupI.deriv, Matrix.map_apply] using + congrArg (fun p => (p.1 : Matrix (Fin 3) (Fin 3) JetRing) i j) (hderiv μ) + · show U.2.1.1 = ((JetGaugeGroupI.ofConstant U.eval).2.1 : Matrix (Fin 2) (Fin 2) JetRing) + ext i j : 1 + exact hconst (U.2.1.1 i j) fun μ => by + simpa [JetGaugeGroupI.deriv, Matrix.map_apply] using + congrArg (fun p => (p.2.1 : Matrix (Fin 2) (Fin 2) JetRing) i j) (hderiv μ) + · show U.2.2.1 = ((JetGaugeGroupI.ofConstant U.eval).2.2 : JetRing) + exact hconst U.2.2.1 fun μ => congrArg (fun p => (p.2.2 : JetRing)) (hderiv μ) + · rintro ⟨c, rfl⟩ + exact maurerCartanForm_ofConstant c + end StandardModel From 1ed0c465a12a8e889c61dbce97a2a673435bd1d6 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 18 Aug 2026 05:51:49 +0100 Subject: [PATCH 159/254] feat: API around Gauge group and Gauge Algebra --- .../GaugeAlgebra/JetGaugeAlgebra.lean | 150 +++++++++++++++++- .../StandardModel/GaugeGroup/Jet/Pure.lean | 2 +- .../GaugeGroup/MaurerCartan/Basic.lean | 68 +++++++- Physlib/Relativity/DerivAlgebra.lean | 4 + 4 files changed, 221 insertions(+), 3 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index fea266a85..70cd3cd61 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -165,6 +165,59 @@ lemma smul_toSU2Matrix (r : ℝ) (a : JetGaugeAlgebra) : lemma smul_toU1Value (r : ℝ) (a : JetGaugeAlgebra) : (r • a).toU1Value = r • a.toU1Value := by rfl +/-- The bracket on the jet gauge algebra: `I` times the matrix commutator on the + `su(3)` and `su(2)` factors, and zero on the (commutative) `u(1)` factor. The + factor of `I` is what makes the bracket of two hermitian matrices hermitian + again; it is also why the bracket is only `ℝ`-bilinear, not `ℂ`-bilinear. -/ +noncomputable instance : Bracket JetGaugeAlgebra JetGaugeAlgebra where + bracket a b := ofMatrixProd + (Complex.I • (a.toSU3Matrix * b.toSU3Matrix - b.toSU3Matrix * a.toSU3Matrix), + Complex.I • (a.toSU2Matrix * b.toSU2Matrix - b.toSU2Matrix * a.toSU2Matrix), + 0) + ⟨by + rw [star_smul, star_sub, star_mul, star_mul, + show star a.toSU3Matrix = a.toSU3Matrix from a.1.2.1, + show star b.toSU3Matrix = b.toSU3Matrix from b.1.2.1, + Complex.star_def, Complex.conj_I, neg_smul, ← smul_neg, neg_sub], + by rw [Matrix.trace_smul, Matrix.trace_sub, Matrix.trace_mul_comm, sub_self, smul_zero]⟩ + ⟨by + rw [star_smul, star_sub, star_mul, star_mul, + show star a.toSU2Matrix = a.toSU2Matrix from a.2.1.2.1, + show star b.toSU2Matrix = b.toSU2Matrix from b.2.1.2.1, + Complex.star_def, Complex.conj_I, neg_smul, ← smul_neg, neg_sub], + by rw [Matrix.trace_smul, Matrix.trace_sub, Matrix.trace_mul_comm, sub_self, smul_zero]⟩ + (star_zero _) + +@[simp] +lemma bracket_toSU3Matrix (a b : JetGaugeAlgebra) : + ⁅a, b⁆.toSU3Matrix = + Complex.I • (a.toSU3Matrix * b.toSU3Matrix - b.toSU3Matrix * a.toSU3Matrix) := rfl + +@[simp] +lemma bracket_toSU2Matrix (a b : JetGaugeAlgebra) : + ⁅a, b⁆.toSU2Matrix = + Complex.I • (a.toSU2Matrix * b.toSU2Matrix - b.toSU2Matrix * a.toSU2Matrix) := rfl + +@[simp] +lemma bracket_toU1Value (a b : JetGaugeAlgebra) : + ⁅a, b⁆.toU1Value = 0 := rfl + +noncomputable instance : LieRing JetGaugeAlgebra where + add_lie a b c := by + ext <;> simp [add_mul, mul_add, smul_add, smul_sub] <;> abel + lie_add a b c := by + ext <;> simp [add_mul, mul_add, smul_add, smul_sub] <;> abel + lie_self a := by + ext <;> simp + leibniz_lie a b c := by + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [bracket_toSU3Matrix, bracket_toSU2Matrix, bracket_toU1Value, + add_toSU3Matrix, add_toSU2Matrix, add_toU1Value, mul_smul_comm, smul_mul_assoc, + smul_smul, Complex.I_mul_I, smul_sub, mul_sub, sub_mul, mul_assoc, add_zero] <;> + module + +noncomputable instance : LieAlgebra ℝ JetGaugeAlgebra where + lie_smul r a b := by refine ext_of_matrix ?_ ?_ ?_ <;> simp <;> module /-! @@ -207,6 +260,47 @@ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetGaugeAlgebra →ₗ[ℝ] Jet rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul] · rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul] +@[simp] +lemma deriv_toSU3Matrix (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + (deriv μ a).toSU3Matrix = a.toSU3Matrix.map (pderiv ℂ μ) := rfl + +@[simp] +lemma deriv_toSU2Matrix (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + (deriv μ a).toSU2Matrix = a.toSU2Matrix.map (pderiv ℂ μ) := rfl + +@[simp] +lemma deriv_toU1Value (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + (deriv μ a).toU1Value = pderiv ℂ μ a.toU1Value := rfl + +/-- Formal derivatives on the jet gauge algebra commute. -/ +lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + deriv μ (deriv ν a) = deriv ν (deriv μ a) := by + refine ext_of_matrix ?_ ?_ ?_ + · ext i j : 1 + simp [Matrix.map_apply, JetRing.pderiv_comm μ ν] + · ext i j : 1 + simp [Matrix.map_apply, JetRing.pderiv_comm μ ν] + · exact JetRing.pderiv_comm μ ν _ + +/-- Post-composition with `deriv` is right-commutative, since formal derivatives + commute (`deriv_comm`). This is what allows iterated derivatives to be indexed by a + `Multiset` of directions. -/ +instance : RightCommutative + (fun (D : JetGaugeAlgebra →ₗ[ℝ] JetGaugeAlgebra) (μ : Fin 1 ⊕ Fin 3) => D.comp (deriv μ)) where + right_comm D μ ν := by + refine LinearMap.ext fun a => ?_ + exact congrArg D (deriv_comm μ ν a) + +/-- The iterated formal derivative on the jet gauge algebra, in the (unordered, since + derivatives commute) directions given by the multiset `μs`. -/ +noncomputable def iteratedDeriv (μs : Multiset (Fin 1 ⊕ Fin 3)) : + JetGaugeAlgebra →ₗ[ℝ] JetGaugeAlgebra := + μs.foldl (fun D μ => D.comp (deriv μ)) LinearMap.id + +@[simp] +lemma iteratedDeriv_zero : iteratedDeriv 0 = LinearMap.id := by + simp [iteratedDeriv] + /-! ## The basis @@ -222,7 +316,61 @@ TODO "Define the basis of the jet gauge algebra." -/ -TODO "Define the adjoint representation of the jet gauge group on the jet gauge algebra." +/-- The adjoint action of an element `U` of the jet gauge group on the jet gauge algebra, + acting on the `su(3)` and `su(2)` factors by `a ↦ U a U⁻¹`, with `U⁻¹ = star U` by + unitarity, and trivially on the `u(1)` factor since `JetRing` is commutative. + Hermiticity is preserved since `star (U a (star U)) = U (star a) (star U)`, and + tracelessness since the trace is invariant under conjugation. -/ +noncomputable def adjointMap (U : JetGaugeGroupI) : JetGaugeAlgebra →ₗ[ℝ] JetGaugeAlgebra where + toFun a := ofMatrixProd + (U.1.1 * a.toSU3Matrix * star U.1.1, + U.2.1.1 * a.toSU2Matrix * star U.2.1.1, + a.toU1Value) + ⟨by + rw [star_mul, star_mul, star_star, + show star a.toSU3Matrix = a.toSU3Matrix from a.1.2.1, mul_assoc], + by + rw [Matrix.trace_mul_comm, ← mul_assoc, + show star U.1.1 * U.1.1 = 1 from mem_unitaryGroup_iff'.mp + (mem_specialUnitaryGroup_iff.mp U.1.2).1, + one_mul, show a.toSU3Matrix.trace = 0 from a.1.2.2]⟩ + ⟨by + rw [star_mul, star_mul, star_star, + show star a.toSU2Matrix = a.toSU2Matrix from a.2.1.2.1] + exact (mul_assoc _ _ _).symm, + by + rw [Matrix.trace_mul_comm, ← mul_assoc, + show star U.2.1.1 * U.2.1.1 = 1 from mem_unitaryGroup_iff'.mp + (mem_specialUnitaryGroup_iff.mp U.2.1.2).1, + one_mul, show a.toSU2Matrix.trace = 0 from a.2.1.2.2]⟩ + (show star a.toU1Value = a.toU1Value from a.2.2.2) + map_add' a b := by + ext <;> simp [mul_add, add_mul] + map_smul' r a := by + ext <;> simp + +@[simp] +lemma adjointMap_toSU3Matrix (U : JetGaugeGroupI) (a : JetGaugeAlgebra) : + (adjointMap U a).toSU3Matrix = U.1.1 * a.toSU3Matrix * star U.1.1 := rfl + +@[simp] +lemma adjointMap_toSU2Matrix (U : JetGaugeGroupI) (a : JetGaugeAlgebra) : + (adjointMap U a).toSU2Matrix = U.2.1.1 * a.toSU2Matrix * star U.2.1.1 := rfl + +@[simp] +lemma adjointMap_toU1Value (U : JetGaugeGroupI) (a : JetGaugeAlgebra) : + (adjointMap U a).toU1Value = a.toU1Value := rfl + +/-- The adjoint representation of the jet gauge group on the jet gauge algebra, + `U ↦ (a ↦ U a U⁻¹)` factorwise. -/ +noncomputable def adjoint : Representation ℝ JetGaugeGroupI JetGaugeAlgebra where + toFun := adjointMap + map_one' := by + refine LinearMap.ext fun a => ?_ + ext <;> simp + map_mul' U V := by + refine LinearMap.ext fun a => ?_ + ext <;> simp [star_mul, mul_assoc] end JetGaugeAlgebra diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean index a7975a0fb..384bc54a0 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean @@ -32,7 +32,7 @@ a semi-direct product of `PureJetGaugeGroup` and `GaugeGroupI`. There exists a map: ``` - maurerCartanCoeff : PureJetGaugeGroup → { r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0 } → JetLieAlgebra + maurerCartanCoeff : PureJetGaugeGroup → { r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0 } → LieAlgebra ``` Defined through the symmetrised Maurer-Cartan form, as ``` diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 47b662519..32a1b796d 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -40,7 +40,7 @@ It satisfies the following properties: @[expose] public section namespace StandardModel -open MvPowerSeries +open MvPowerSeries JetGaugeAlgebra /-! @@ -58,6 +58,21 @@ noncomputable def maurerCartanForm (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : JetGaugeGroupI.deriv_mul_inv_toVal_SU2_traceless μ U⟩ (JetGaugeGroupI.star_deriv_mul_inv_toVal_U1 μ U) +@[simp] +lemma maurerCartanForm_toSU3Matrix (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (maurerCartanForm U μ).toSU3Matrix = + Complex.I • (U.1.1.map (pderiv ℂ μ) * star U.1.1) := rfl + +@[simp] +lemma maurerCartanForm_toSU2Matrix (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (maurerCartanForm U μ).toSU2Matrix = + Complex.I • (U.2.1.1.map (pderiv ℂ μ) * star U.2.1.1) := rfl + +@[simp] +lemma maurerCartanForm_toU1Value (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (maurerCartanForm U μ).toU1Value = + Complex.I • (pderiv ℂ μ U.2.2.1 * star U.2.2.1) := rfl + @[simp] lemma maurerCartanForm_one : maurerCartanForm (1 : JetGaugeGroupI) = 0 := by ext <;> simp [maurerCartanForm,JetGaugeGroupI.deriv_one] @@ -66,6 +81,31 @@ lemma maurerCartanForm_ofConstant (U₀ : GaugeGroupI) : maurerCartanForm (JetGaugeGroupI.ofConstant U₀) = 0 := by ext <;> simp [maurerCartanForm,JetGaugeGroupI.deriv_ofConstant] +lemma maurerCartanForm_cocycle (U V : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + maurerCartanForm (U * V) μ = maurerCartanForm U μ + adjoint U (maurerCartanForm V μ) := by + -- Since `(X⁻¹).toVal` is definitionally the componentwise `star`, the whole identity + -- can be proven once in the ring of value-triples and transferred componentwise. + have h1 : V.toVal * (V⁻¹).toVal = 1 := by + rw [show V.toVal * (V⁻¹).toVal = (V * V⁻¹).toVal from rfl, mul_inv_cancel]; rfl + have key : Complex.I • (JetGaugeGroupI.deriv μ (U * V) * ((U * V)⁻¹).toVal) = + Complex.I • (JetGaugeGroupI.deriv μ U * (U⁻¹).toVal) + + U.toVal * (Complex.I • (JetGaugeGroupI.deriv μ V * (V⁻¹).toVal)) * (U⁻¹).toVal := by + rw [show ((U * V)⁻¹).toVal = (V⁻¹).toVal * (U⁻¹).toVal from by rw [mul_inv_rev]; rfl, + JetGaugeGroupI.deriv_mul, add_mul, smul_add, mul_smul_comm, smul_mul_assoc] + congr 1 + · rw [mul_assoc (JetGaugeGroupI.deriv μ U), ← mul_assoc V.toVal, h1, one_mul] + · simp [mul_assoc] + refine ext_of_matrix (congrArg (fun p => p.1) key) (congrArg (fun p => p.2.1) key) ?_ + -- on the commutative `u(1)` factor the adjoint action is trivial only up to + -- commutativity and unitarity, so this component is not definitional + have h22 : (maurerCartanForm (U * V) μ).toU1Value = + (maurerCartanForm U μ).toU1Value + + U.2.2.1 * (maurerCartanForm V μ).toU1Value * star U.2.2.1 := + congrArg (fun p => p.2.2) key + rw [h22, mul_comm (U.2.2.1 : JetRing) ((maurerCartanForm V μ).toU1Value), mul_assoc, + (Unitary.mem_iff.mp U.2.2.2).2, mul_one] + rfl + lemma deriv_zero_of_maurerCartanForm_zero (U : JetGaugeGroupI) (h : maurerCartanForm U = 0) : ∀ μ, U.deriv μ = 0 := by intro μ @@ -116,4 +156,30 @@ lemma maurerCartanForm_eq_zero_iff_ofConstant (U : JetGaugeGroupI) : · rintro ⟨c, rfl⟩ exact maurerCartanForm_ofConstant c +/-! + +## The symmeterized Maurer–Cartan form + +-/ + +TODO "The symmetrizedMaurerCartanForm should actually land in the normal gauge algebra." +noncomputable def symmetrizedMaurerCartanForm (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) : JetGaugeAlgebra := + (1/(r.card : ℝ) : ℝ) • (r.map fun μ => (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).sum + +@[simp] +lemma symmetrizedMaurerCartanForm_zero (U : JetGaugeGroupI) : + symmetrizedMaurerCartanForm U 0 = 0 := by + simp [symmetrizedMaurerCartanForm] + +@[simp] +lemma symmetrizedMaurerCartanForm_ofConstant (U₀ : GaugeGroupI) : + symmetrizedMaurerCartanForm (JetGaugeGroupI.ofConstant U₀) = 0 := by + ext <;> simp [symmetrizedMaurerCartanForm, maurerCartanForm_ofConstant] + +@[simp] +lemma symmetrizedMaurerCartanForm_singleton (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + symmetrizedMaurerCartanForm U {μ} = maurerCartanForm U μ := by + simp [symmetrizedMaurerCartanForm, iteratedDeriv_zero] + end StandardModel diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index a547cfac3..a47b76545 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -76,6 +76,10 @@ instance : StarRing JetRing where instance : StarModule ℝ JetRing where star_smul r f := funext fun n => star_smul r (f n) +/-- Complex scalars conjugate under the coefficientwise conjugation. -/ +instance : StarModule ℂ JetRing where + star_smul c f := funext fun n => star_smul c (f n) + @[simp] lemma constantCoeff_star (f : JetRing) : constantCoeff (star f) = star (constantCoeff f) := rfl From 9a05b578a41b31136d08c3b06918aab06237b328 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 18 Aug 2026 06:01:11 +0100 Subject: [PATCH 160/254] feat: Add Maurer Cartan Lemma --- .../StandardModel/GaugeGroup/MaurerCartan/Basic.lean | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 32a1b796d..2fc6244a2 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -83,8 +83,6 @@ lemma maurerCartanForm_ofConstant (U₀ : GaugeGroupI) : lemma maurerCartanForm_cocycle (U V : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : maurerCartanForm (U * V) μ = maurerCartanForm U μ + adjoint U (maurerCartanForm V μ) := by - -- Since `(X⁻¹).toVal` is definitionally the componentwise `star`, the whole identity - -- can be proven once in the ring of value-triples and transferred componentwise. have h1 : V.toVal * (V⁻¹).toVal = 1 := by rw [show V.toVal * (V⁻¹).toVal = (V * V⁻¹).toVal from rfl, mul_inv_cancel]; rfl have key : Complex.I • (JetGaugeGroupI.deriv μ (U * V) * ((U * V)⁻¹).toVal) = @@ -96,8 +94,6 @@ lemma maurerCartanForm_cocycle (U V : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : · rw [mul_assoc (JetGaugeGroupI.deriv μ U), ← mul_assoc V.toVal, h1, one_mul] · simp [mul_assoc] refine ext_of_matrix (congrArg (fun p => p.1) key) (congrArg (fun p => p.2.1) key) ?_ - -- on the commutative `u(1)` factor the adjoint action is trivial only up to - -- commutativity and unitarity, so this component is not definitional have h22 : (maurerCartanForm (U * V) μ).toU1Value = (maurerCartanForm U μ).toU1Value + U.2.2.1 * (maurerCartanForm V μ).toU1Value * star U.2.2.1 := @@ -106,6 +102,10 @@ lemma maurerCartanForm_cocycle (U V : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : (Unitary.mem_iff.mp U.2.2.2).2, mul_one] rfl +lemma maurerCartanForm_inv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + maurerCartanForm (U⁻¹) μ = - adjoint U⁻¹ (maurerCartanForm U μ) := by + linear_combination (norm := simp) -(maurerCartanForm_cocycle U⁻¹ U μ) + lemma deriv_zero_of_maurerCartanForm_zero (U : JetGaugeGroupI) (h : maurerCartanForm U = 0) : ∀ μ, U.deriv μ = 0 := by intro μ From c03949be08a362fafc4757112eb553693fc1fb91 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 18 Aug 2026 06:44:34 +0100 Subject: [PATCH 161/254] feat: More API --- .../StandardModel/GaugeAlgebra/Basic.lean | 162 ++++++++++++++++++ .../GaugeAlgebra/JetGaugeAlgebra.lean | 92 ++++++++++ .../StandardModel/GaugeGroup/Jet.lean | 19 ++ .../GaugeGroup/MaurerCartan/Basic.lean | 43 ++++- 4 files changed, 312 insertions(+), 4 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean index db88cb3fd..d82ac46b0 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean @@ -31,4 +31,166 @@ This is a matrix Lie algebra, so the bracket is given by the commutator of matri namespace StandardModel open MvPowerSeries Matrix +/-- The gauge algebra of the Standard Model: the Lie algebra of `GaugeGroupI`, with one + factor per gauge group factor — traceless self-adjoint `3 × 3` and `2 × 2` complex + matrices and a self-adjoint (i.e. real) scalar. This is the constant-coefficient + analogue of `JetGaugeAlgebra`, and the value at the base point of the jets it contains. -/ +abbrev GaugeAlgebra := + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 3) (Fin 3) ℂ) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 3) ℝ ℂ)) × + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 2) (Fin 2) ℂ) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 2) ℝ ℂ)) × + selfAdjoint ℂ + +namespace GaugeAlgebra + +/-! + +## Basic projections + +-/ + +/-- The `su(3)`-factor component of an element of the gauge algebra. -/ +def toSU3Matrix (a : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ := a.1 + +/-- The `su(2)`-factor component of an element of the gauge algebra. -/ +def toSU2Matrix (a : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ := a.2.1 + +/-- The `u(1)`-factor component of an element of the gauge algebra. -/ +def toU1Value (a : GaugeAlgebra) : ℂ := a.2.2 + +@[ext] +lemma ext_of_matrix {a b : GaugeAlgebra} (h1 : a.toSU3Matrix = b.toSU3Matrix) + (h2 : a.toSU2Matrix = b.toSU2Matrix) (h3 : a.toU1Value = b.toU1Value) : a = b := by + cases a; cases b + simp only [toSU3Matrix, toSU2Matrix, toU1Value] at h1 h2 h3 + grind + +/-! + +## Constructor from a product of matrices + +-/ + +/-- The element of the gauge algebra constructed from a triple of matrices satisfying + the relevant hermiticity and tracelessness conditions. -/ +def ofMatrixProd (A : Matrix (Fin 3) (Fin 3) ℂ × + Matrix (Fin 2) (Fin 2) ℂ × ℂ) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : GaugeAlgebra := + ⟨⟨A.1, hA⟩, ⟨A.2.1, hB⟩, ⟨A.2.2, hC⟩⟩ + +@[simp] +lemma ofMatrixProd_toSU3Matrix (A : Matrix (Fin 3) (Fin 3) ℂ × + Matrix (Fin 2) (Fin 2) ℂ × ℂ) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : + (ofMatrixProd A hA hB hC).toSU3Matrix = A.1 := by rfl + +@[simp] +lemma ofMatrixProd_toSU2Matrix (A : Matrix (Fin 3) (Fin 3) ℂ × + Matrix (Fin 2) (Fin 2) ℂ × ℂ) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : + (ofMatrixProd A hA hB hC).toSU2Matrix = A.2.1 := by rfl + +@[simp] +lemma ofMatrixProd_toU1Value (A : Matrix (Fin 3) (Fin 3) ℂ × + Matrix (Fin 2) (Fin 2) ℂ × ℂ) (hA : star A.1 = A.1 ∧ A.1.trace = 0) + (hB : star A.2.1 = A.2.1 ∧ A.2.1.trace = 0) (hC : star A.2.2 = A.2.2) : + (ofMatrixProd A hA hB hC).toU1Value = A.2.2 := by rfl + +/-! + +## The Lie algebra instance + +-/ + +@[simp] +lemma add_toSU3Matrix (a b : GaugeAlgebra) : + (a + b).toSU3Matrix = a.toSU3Matrix + b.toSU3Matrix := by rfl + +@[simp] +lemma add_toSU2Matrix (a b : GaugeAlgebra) : + (a + b).toSU2Matrix = a.toSU2Matrix + b.toSU2Matrix := by rfl + +@[simp] +lemma add_toU1Value (a b : GaugeAlgebra) : + (a + b).toU1Value = a.toU1Value + b.toU1Value := by rfl + +@[simp] +lemma zero_toSU3Matrix : (0 : GaugeAlgebra).toSU3Matrix = 0 := by rfl + +@[simp] +lemma zero_toSU2Matrix : (0 : GaugeAlgebra).toSU2Matrix = 0 := by rfl + +@[simp] +lemma zero_toU1Value : (0 : GaugeAlgebra).toU1Value = 0 := by rfl + +@[simp] +lemma smul_toSU3Matrix (r : ℝ) (a : GaugeAlgebra) : + (r • a).toSU3Matrix = r • a.toSU3Matrix := by rfl + +@[simp] +lemma smul_toSU2Matrix (r : ℝ) (a : GaugeAlgebra) : + (r • a).toSU2Matrix = r • a.toSU2Matrix := by rfl + +@[simp] +lemma smul_toU1Value (r : ℝ) (a : GaugeAlgebra) : + (r • a).toU1Value = r • a.toU1Value := by rfl + +/-- The bracket on the gauge algebra: `I` times the matrix commutator on the + `su(3)` and `su(2)` factors, and zero on the (commutative) `u(1)` factor. The + factor of `I` is what makes the bracket of two hermitian matrices hermitian + again; it is also why the bracket is only `ℝ`-bilinear, not `ℂ`-bilinear. -/ +noncomputable instance : Bracket GaugeAlgebra GaugeAlgebra where + bracket a b := ofMatrixProd + (Complex.I • (a.toSU3Matrix * b.toSU3Matrix - b.toSU3Matrix * a.toSU3Matrix), + Complex.I • (a.toSU2Matrix * b.toSU2Matrix - b.toSU2Matrix * a.toSU2Matrix), + 0) + ⟨by + rw [star_smul, star_sub, star_mul, star_mul, + show star a.toSU3Matrix = a.toSU3Matrix from a.1.2.1, + show star b.toSU3Matrix = b.toSU3Matrix from b.1.2.1, + Complex.star_def, Complex.conj_I, neg_smul, ← smul_neg, neg_sub], + by rw [Matrix.trace_smul, Matrix.trace_sub, Matrix.trace_mul_comm, sub_self, smul_zero]⟩ + ⟨by + rw [star_smul, star_sub, star_mul, star_mul, + show star a.toSU2Matrix = a.toSU2Matrix from a.2.1.2.1, + show star b.toSU2Matrix = b.toSU2Matrix from b.2.1.2.1, + Complex.star_def, Complex.conj_I, neg_smul, ← smul_neg, neg_sub], + by rw [Matrix.trace_smul, Matrix.trace_sub, Matrix.trace_mul_comm, sub_self, smul_zero]⟩ + (star_zero _) + +@[simp] +lemma bracket_toSU3Matrix (a b : GaugeAlgebra) : + ⁅a, b⁆.toSU3Matrix = + Complex.I • (a.toSU3Matrix * b.toSU3Matrix - b.toSU3Matrix * a.toSU3Matrix) := rfl + +@[simp] +lemma bracket_toSU2Matrix (a b : GaugeAlgebra) : + ⁅a, b⁆.toSU2Matrix = + Complex.I • (a.toSU2Matrix * b.toSU2Matrix - b.toSU2Matrix * a.toSU2Matrix) := rfl + +@[simp] +lemma bracket_toU1Value (a b : GaugeAlgebra) : + ⁅a, b⁆.toU1Value = 0 := rfl + +noncomputable instance : LieRing GaugeAlgebra where + add_lie a b c := by + ext <;> simp [add_mul, mul_add, smul_sub] <;> ring + lie_add a b c := by + ext <;> simp [add_mul, mul_add, smul_sub] <;> ring + lie_self a := by + ext <;> simp + leibniz_lie a b c := by + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [bracket_toSU3Matrix, bracket_toSU2Matrix, bracket_toU1Value, + add_toSU3Matrix, add_toSU2Matrix, add_toU1Value, mul_smul_comm, smul_mul_assoc, + smul_smul, Complex.I_mul_I, smul_sub, mul_sub, sub_mul, mul_assoc, add_zero] <;> + module + +noncomputable instance : LieAlgebra ℝ GaugeAlgebra where + lie_smul t a b := by + ext <;> simp [smul_sub] <;> ring + +end GaugeAlgebra + end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 70cd3cd61..29ae79a1c 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic @@ -301,6 +302,97 @@ noncomputable def iteratedDeriv (μs : Multiset (Fin 1 ⊕ Fin 3)) : lemma iteratedDeriv_zero : iteratedDeriv 0 = LinearMap.id := by simp [iteratedDeriv] +lemma iteratedDeriv_cons (μ : Fin 1 ⊕ Fin 3) (μs : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedDeriv (μ ::ₘ μs) = (deriv μ).comp (iteratedDeriv μs) := by + have h : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (D : JetGaugeAlgebra →ₗ[ℝ] JetGaugeAlgebra), + s.foldl (fun D μ => D.comp (deriv μ)) D = D.comp (iteratedDeriv s) := by + intro s + induction s using Multiset.induction_on with + | empty => intro D; simp [iteratedDeriv] + | cons κ t ih => + intro D + rw [iteratedDeriv, Multiset.foldl_cons, Multiset.foldl_cons, ih, ih] + simp [LinearMap.comp_assoc] + rw [iteratedDeriv, Multiset.foldl_cons, h] + simp + +/-! + +## Taylor coefficients and evaluation at the base point + +-/ + +/-- The Taylor coefficient of an element of the jet gauge algebra at the monomial + given by the multiset `r` of spacetime directions, taken entrywise, as an + `ℝ`-linear map to the constant gauge algebra `GaugeAlgebra`. + + For `r ≠ 0` this is only linear: the coefficient of a product is a convolution of + coefficients, so it does not respect the bracket. The zeroth coefficient does; see + `eval` for that morphism of Lie algebras. -/ +noncomputable def taylorCoeff (r : Multiset (Fin 1 ⊕ Fin 3)) : + JetGaugeAlgebra →ₗ[ℝ] GaugeAlgebra where + toFun a := GaugeAlgebra.ofMatrixProd + (a.toSU3Matrix.map (coeff r.toFinsupp), a.toSU2Matrix.map (coeff r.toFinsupp), + coeff r.toFinsupp a.toU1Value) + ⟨by + ext i j : 1 + simpa [Matrix.star_apply, Matrix.map_apply] using + congrArg (fun M => coeff r.toFinsupp (M i j)) + (show star a.toSU3Matrix = a.toSU3Matrix from a.1.2.1), + by rw [← AddMonoidHom.map_trace, show a.toSU3Matrix.trace = 0 from a.1.2.2, map_zero]⟩ + ⟨by + ext i j : 1 + simpa [Matrix.star_apply, Matrix.map_apply] using + congrArg (fun M => coeff r.toFinsupp (M i j)) + (show star a.toSU2Matrix = a.toSU2Matrix from a.2.1.2.1), + by rw [← AddMonoidHom.map_trace, show a.toSU2Matrix.trace = 0 from a.2.1.2.2, map_zero]⟩ + (by rw [← JetRing.coeff_star, show star a.toU1Value = a.toU1Value from a.2.2.2]) + map_add' a b := by + ext <;> simp [Matrix.map_apply] + map_smul' t a := by + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ <;> + simp only [GaugeAlgebra.ofMatrixProd_toSU3Matrix, GaugeAlgebra.ofMatrixProd_toSU2Matrix, + GaugeAlgebra.ofMatrixProd_toU1Value, smul_toSU3Matrix, smul_toSU2Matrix, smul_toU1Value, + GaugeAlgebra.smul_toSU3Matrix, GaugeAlgebra.smul_toSU2Matrix, GaugeAlgebra.smul_toU1Value, + RingHom.id_apply] + · ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply] + rw [← algebraMap_smul ℂ t, map_smul, algebraMap_smul] + · ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply] + rw [← algebraMap_smul ℂ t, map_smul, algebraMap_smul] + · rw [← algebraMap_smul ℂ t, map_smul, algebraMap_smul] + +@[simp] +lemma taylorCoeff_toSU3Matrix (r : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (taylorCoeff r a).toSU3Matrix = a.toSU3Matrix.map (coeff r.toFinsupp) := rfl + +@[simp] +lemma taylorCoeff_toSU2Matrix (r : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (taylorCoeff r a).toSU2Matrix = a.toSU2Matrix.map (coeff r.toFinsupp) := rfl + +@[simp] +lemma taylorCoeff_toU1Value (r : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (taylorCoeff r a).toU1Value = coeff r.toFinsupp a.toU1Value := rfl + +/-- The zeroth Taylor coefficient respects the bracket, since the constant coefficient + of a product of jets is the product of the constant coefficients. -/ +lemma taylorCoeff_zero_bracket (a b : JetGaugeAlgebra) : + taylorCoeff 0 ⁅a, b⁆ = ⁅taylorCoeff 0 a, taylorCoeff 0 b⁆ := by + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · ext i j : 1 + simp [Matrix.map_apply, Matrix.mul_apply, smul_eq_mul, + coeff_zero_eq_constantCoeff, map_sum, Finset.mul_sum, mul_sub] + · ext i j : 1 + simp [Matrix.map_apply, Matrix.mul_apply, smul_eq_mul, + coeff_zero_eq_constantCoeff, mul_sub] + · simp + +/-- Evaluation of the jet gauge algebra at the base point: the zeroth Taylor + coefficient, as a morphism of Lie algebras. -/ +noncomputable def eval : JetGaugeAlgebra →ₗ⁅ℝ⁆ GaugeAlgebra := + { taylorCoeff 0 with map_lie' := taylorCoeff_zero_bracket _ _ } + /-! ## The basis diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean index e2eb00d61..d9b8f3ea4 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean @@ -176,6 +176,7 @@ noncomputable def evalU1 : unitary JetRing →* unitary ℂ where noncomputable def eval : JetGaugeGroupI →* GaugeGroupI := (evalSU (Fin 3)).prodMap ((evalSU (Fin 2)).prodMap evalU1) + /-! ## The derivative @@ -355,6 +356,24 @@ lemma star_deriv_mul_inv_toVal_U1 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : rw [hCs, star_mul', JetRing.star_C, star_mul', star_star, ← JetRing.pderiv_star, hq, show (star Complex.I) = -Complex.I by simp, map_neg, neg_mul, mul_neg, neg_neg] + +/-- Application of `pderiv` is right-commutative, since formal partial derivatives + commute (`JetRing.pderiv_comm`). This allows iterating them over a `Multiset` of + directions. -/ +instance : RightCommutative (fun (f : JetRing) (μ : Fin 1 ⊕ Fin 3) => pderiv ℂ μ f) where + right_comm f μ ν := JetRing.pderiv_comm ν μ f + +/-- The iterated formal derivative, in the (unordered) directions given by the + multiset `s`, of the value of a jet gauge transformation, taken entrywise on each + factor. This is the derivative-normalized Taylor coefficient of `U` at `s`, as a jet: + its value at the base point is `∏ (s.count μ)!` times the power-series coefficient + of `U` at the monomial `s`. -/ +noncomputable def iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) : + Matrix (Fin 3) (Fin 3) JetRing × Matrix (Fin 2) (Fin 2) JetRing × JetRing := + (U.1.1.map fun f => s.foldl (fun f μ => pderiv ℂ μ f) f, + U.2.1.1.map fun f => s.foldl (fun f μ => pderiv ℂ μ f) f, + s.foldl (fun f μ => pderiv ℂ μ f) U.2.2.1) + /-! ## D. Constant jets diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 2fc6244a2..156718484 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -162,16 +162,22 @@ lemma maurerCartanForm_eq_zero_iff_ofConstant (U : JetGaugeGroupI) : -/ -TODO "The symmetrizedMaurerCartanForm should actually land in the normal gauge algebra." + noncomputable def symmetrizedMaurerCartanForm (U : JetGaugeGroupI) (r : Multiset (Fin 1 ⊕ Fin 3)) : JetGaugeAlgebra := - (1/(r.card : ℝ) : ℝ) • (r.map fun μ => (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).sum + ((1/(r.card : ℝ) : ℝ) • (r.map fun μ => + (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).sum) @[simp] -lemma symmetrizedMaurerCartanForm_zero (U : JetGaugeGroupI) : +lemma symmetrizedMaurerCartanForm_apply_zero (U : JetGaugeGroupI) : symmetrizedMaurerCartanForm U 0 = 0 := by simp [symmetrizedMaurerCartanForm] +@[simp] +lemma symmetrizedMaurerCartanForm_one : + symmetrizedMaurerCartanForm (1 : JetGaugeGroupI) = 0 := by + ext <;> simp [symmetrizedMaurerCartanForm] + @[simp] lemma symmetrizedMaurerCartanForm_ofConstant (U₀ : GaugeGroupI) : symmetrizedMaurerCartanForm (JetGaugeGroupI.ofConstant U₀) = 0 := by @@ -179,7 +185,36 @@ lemma symmetrizedMaurerCartanForm_ofConstant (U₀ : GaugeGroupI) : @[simp] lemma symmetrizedMaurerCartanForm_singleton (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - symmetrizedMaurerCartanForm U {μ} = maurerCartanForm U μ := by + symmetrizedMaurerCartanForm U {μ} = (maurerCartanForm U μ) := by simp [symmetrizedMaurerCartanForm, iteratedDeriv_zero] +/-- The recursion for the symmetrized Maurer–Cartan form: peeling one direction off the + multiset. -/ +lemma symmetrizedMaurerCartanForm_cons (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (r : Multiset (Fin 1 ⊕ Fin 3)) : symmetrizedMaurerCartanForm U (μ ::ₘ r) = + (1/(r.card + 1 : ℝ) : ℝ) • (iteratedDeriv r (maurerCartanForm U μ)) + + ((r.card : ℝ)/(r.card + 1 : ℝ)) • deriv μ (symmetrizedMaurerCartanForm U r) := by + by_cases hr : r = 0 + · subst hr + simp + · have hn : (r.card : ℝ) ≠ 0 := + Nat.cast_ne_zero.mpr fun h => hr (Multiset.card_eq_zero.mp h) + have herase : ∀ ν ∈ r, (μ ::ₘ r).erase ν = μ ::ₘ r.erase ν := by + intro ν hν + rcases eq_or_ne ν μ with rfl | h + · rw [Multiset.erase_cons_head, Multiset.cons_erase hν] + · rw [Multiset.erase_cons_tail _ h.symm] + rw [symmetrizedMaurerCartanForm, symmetrizedMaurerCartanForm, Multiset.map_cons, + Multiset.sum_cons, Multiset.card_cons, Multiset.sub_singleton, Multiset.erase_cons_head, + Multiset.map_congr rfl fun ν hν => by + rw [Multiset.sub_singleton, herase ν hν, iteratedDeriv_cons, LinearMap.comp_apply, + ← Multiset.sub_singleton], + show (r.map fun ν => deriv μ (iteratedDeriv (r - {ν}) (maurerCartanForm U ν))) = + (r.map fun ν => iteratedDeriv (r - {ν}) (maurerCartanForm U ν)).map (deriv μ) from + (Multiset.map_map _ _ _).symm, + ← map_multiset_sum, smul_add, map_smul, smul_smul, + show ((r.card + 1 : ℕ) : ℝ) = (r.card : ℝ) + 1 by push_cast; ring, + show (r.card : ℝ)/((r.card : ℝ) + 1) * (1/(r.card : ℝ)) = 1/((r.card : ℝ) + 1) by + field_simp] + end StandardModel From dfd2e721ff85d1dbf65dfdde0c976e02a1e60ef1 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 18 Aug 2026 06:56:37 +0100 Subject: [PATCH 162/254] feat: More API --- .../StandardModel/GaugeGroup/Jet/Pure.lean | 8 ++++ .../GaugeGroup/MaurerCartan/Pure.lean | 42 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean index 384bc54a0..be925201e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean @@ -101,6 +101,14 @@ lemma proj_eq_one_iff_constant {U : JetGaugeGroupI} : apply Subtype.ext simp [proj] +lemma proj_ofConstant (c : GaugeGroupI) : proj (JetGaugeGroupI.ofConstant c) = 1 := by + rw [proj_eq_one_iff_constant] + exact ⟨c, rfl⟩ + +lemma eq_proj_mul_ofConstant (U : JetGaugeGroupI) : + U = proj U * JetGaugeGroupI.ofConstant U.eval := by + simp [proj] + end PureSubgroup end JetGaugeGroup diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean new file mode 100644 index 000000000..1004fb673 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean @@ -0,0 +1,42 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Pure +public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# The Maurer–Cartan forms and the pure subgroup +-/ + +@[expose] public section +namespace StandardModel +open MvPowerSeries JetGaugeAlgebra +namespace JetGaugeGroup +namespace PureSubgroup + +/-- Projecting onto the pure subgroup does not change the Maurer–Cartan form: by the + cocycle law, right-multiplication by a constant gauge transformation drops out. -/ +lemma maurerCartanForm_proj (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + maurerCartanForm (proj U : JetGaugeGroupI) μ = maurerCartanForm U μ := by + rw [show (proj U : JetGaugeGroupI) = U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ from rfl, + ← map_inv, maurerCartanForm_cocycle, maurerCartanForm_ofConstant] + simp + +end PureSubgroup +end JetGaugeGroup +end StandardModel From c0d519a1cd6330d599f0f5e439e509cff562de7a Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:50:03 +0100 Subject: [PATCH 163/254] feat: More API --- Outline.md | 6 +- .../LeptonGaugeSector/JetAlgebra/Basic.lean | 2 +- .../StandardModel/Fermions/LeptonDoublet.lean | 2 +- .../LeptonSinglet/JetComponentSpace.lean | 2 +- .../StandardModel/GaugeAlgebra/Basic.lean | 2 +- .../GaugeAlgebra/JetGaugeAlgebra.lean | 171 +++++++++++- .../GaugeBosons/BBoson/Basic.lean | 2 +- .../StandardModel/GaugeBosons/Gluons.lean | 2 +- .../GaugeGroup/{Jet.lean => Jet/Basic.lean} | 0 .../StandardModel/GaugeGroup/Jet/Pure.lean | 115 -------- .../GaugeGroup/Jet/Truncation.lean | 250 ++++++++++++++++++ .../GaugeGroup/MaurerCartan.lean | 2 +- .../GaugeGroup/MaurerCartan/Basic.lean | 170 +++++++++++- .../GaugeGroup/MaurerCartan/Pure.lean | 42 --- .../GaugeGroup/MaurerCartan/Truncation.lean | 104 ++++++++ Physlib/Relativity/DerivAlgebra.lean | 127 +++++++++ 16 files changed, 830 insertions(+), 169 deletions(-) rename Physlib/Particles/StandardModel/GaugeGroup/{Jet.lean => Jet/Basic.lean} (100%) delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean diff --git a/Outline.md b/Outline.md index fa3f337f9..57f3c93f1 100644 --- a/Outline.md +++ b/Outline.md @@ -180,13 +180,13 @@ Basic rules of this outline: so the symmetric data of `U` is a function of `(a, r)` with `r` nonempty. - Define - `symMC : PureJetGaugeGroup → κ → { r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0 } → ℂ` + `symmetrizedMaurerCartanCoeff : PureJetGaugeGroup → κ → { r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0 } → ℂ` - `symMC U a r := (1/|r|) ∑_{ν ∈ r} ∂_{r − ν}| ω^a_ν(U)` + `symmetrizedMaurerCartanCoeff U a r := (1/|r|) ∑_{ν ∈ r} ∂_{r − ν}| ω^a_ν(U)` - Total symmetry is automatic: the codomain is indexed by the multiset `r`, so there is no symmetry side-condition to impose. -- Lemma (freeness): `Function.Bijective symMC`. +- Lemma (freeness): `Function.Bijective symmetrizedMaurerCartanCoeff`. - Remark: this is the `sym(d_s A)` argument with the roles reversed — for `ω` the "field strength" vanishes identically (the structure equation), so nothing survives except the symmetric parts. diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean index 3367bb0bc..4eee7c4cf 100644 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean +++ b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic public import Mathlib.RingTheory.TensorProduct.Basic public import Mathlib.LinearAlgebra.DirectSum.Finsupp diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index 325642e7e..d7f7be0d4 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -6,7 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic /-! # Lepton doublets diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean index addede9cc..3320ac8b0 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean @@ -6,7 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.LagrangianTheory.Basic public import Mathlib.RingTheory.TensorProduct.Basic /-! diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean index d82ac46b0..b21b91d16 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 29ae79a1c..fc05210be 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation @@ -166,6 +166,18 @@ lemma smul_toSU2Matrix (r : ℝ) (a : JetGaugeAlgebra) : lemma smul_toU1Value (r : ℝ) (a : JetGaugeAlgebra) : (r • a).toU1Value = r • a.toU1Value := by rfl +@[simp] +lemma sub_toSU3Matrix (a b : JetGaugeAlgebra) : + (a - b).toSU3Matrix = a.toSU3Matrix - b.toSU3Matrix := by rfl + +@[simp] +lemma sub_toSU2Matrix (a b : JetGaugeAlgebra) : + (a - b).toSU2Matrix = a.toSU2Matrix - b.toSU2Matrix := by rfl + +@[simp] +lemma sub_toU1Value (a b : JetGaugeAlgebra) : + (a - b).toU1Value = a.toU1Value - b.toU1Value := by rfl + /-- The bracket on the jet gauge algebra: `I` times the matrix commutator on the `su(3)` and `su(2)` factors, and zero on the (commutative) `u(1)` factor. The factor of `I` is what makes the bracket of two hermitian matrices hermitian @@ -283,6 +295,37 @@ lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : simp [Matrix.map_apply, JetRing.pderiv_comm μ ν] · exact JetRing.pderiv_comm μ ν _ +/-- The derivative is a derivation of the bracket: the Leibniz rule + `deriv μ ⁅x, y⁆ = ⁅deriv μ x, y⁆ + ⁅x, deriv μ y⁆`. -/ +lemma deriv_bracket (μ : Fin 1 ⊕ Fin 3) (x y : JetGaugeAlgebra) : + deriv μ ⁅x, y⁆ = ⁅deriv μ x, y⁆ + ⁅x, deriv μ y⁆ := by + have hleib : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (M N : Matrix κ κ JetRing), + (M * N).map (pderiv ℂ μ) = M.map (pderiv ℂ μ) * N + M * N.map (pderiv ℂ μ) := by + intro κ _ _ M N + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + have hsmul : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (c : ℂ) (M : Matrix κ κ JetRing), + (c • M).map (pderiv ℂ μ) = c • M.map (pderiv ℂ μ) := + fun _ _ _ _ _ => Matrix.ext fun _ _ => Derivation.map_smul _ _ _ + have hsub : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (M N : Matrix κ κ JetRing), + (M - N).map (pderiv ℂ μ) = M.map (pderiv ℂ μ) - N.map (pderiv ℂ μ) := by + intro κ _ _ M N + ext i j : 1 + simp only [Matrix.map_apply, Matrix.sub_apply, map_sub] + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [deriv_toSU3Matrix, deriv_toSU2Matrix, deriv_toU1Value, bracket_toSU3Matrix, + bracket_toSU2Matrix, bracket_toU1Value, add_toSU3Matrix, add_toSU2Matrix, + add_toU1Value, hsmul, hsub, hleib, map_zero, add_zero] + · rw [← smul_add] + congr 1 + abel + · rw [← smul_add] + congr 1 + abel + + /-- Post-composition with `deriv` is right-commutative, since formal derivatives commute (`deriv_comm`). This is what allows iterated derivatives to be indexed by a `Multiset` of directions. -/ @@ -316,6 +359,23 @@ lemma iteratedDeriv_cons (μ : Fin 1 ⊕ Fin 3) (μs : Multiset (Fin 1 ⊕ Fin 3 rw [iteratedDeriv, Multiset.foldl_cons, h] simp +/-- The iterated derivative is additive in the multiset of directions: deriving + along `s + t` is deriving along `t` and then along `s`. -/ +lemma iteratedDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedDeriv (s + t) = (iteratedDeriv s).comp (iteratedDeriv t) := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ s ih => + rw [Multiset.cons_add, iteratedDeriv_cons, iteratedDeriv_cons, ih, + LinearMap.comp_assoc] + +@[simp] +lemma iteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + iteratedDeriv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = deriv μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, iteratedDeriv_cons, + iteratedDeriv_zero, LinearMap.comp_id] + + /-! ## Taylor coefficients and evaluation at the base point @@ -393,6 +453,115 @@ lemma taylorCoeff_zero_bracket (a b : JetGaugeAlgebra) : noncomputable def eval : JetGaugeAlgebra →ₗ⁅ℝ⁆ GaugeAlgebra := { taylorCoeff 0 with map_lie' := taylorCoeff_zero_bracket _ _ } +/-- Taylor determinacy: a jet gauge algebra element is determined by the base-point + values of its iterated derivatives. -/ +theorem ext_of_eval_iteratedDeriv {x y : JetGaugeAlgebra} + (h : ∀ s, eval (iteratedDeriv s x) = eval (iteratedDeriv s y)) : x = y := by + have key : ∀ (n : ℕ) (x y : JetGaugeAlgebra), + (∀ s, eval (iteratedDeriv s x) = eval (iteratedDeriv s y)) → + ∀ m : (Fin 1 ⊕ Fin 3) →₀ ℕ, Finsupp.degree m = n → + (∀ i j, coeff m (x.toSU3Matrix i j) = coeff m (y.toSU3Matrix i j)) ∧ + (∀ i j, coeff m (x.toSU2Matrix i j) = coeff m (y.toSU2Matrix i j)) ∧ + coeff m x.toU1Value = coeff m y.toU1Value := by + intro n + induction n with + | zero => + intro x y hxy m hm + have hm0 : m = 0 := (Finsupp.degree_eq_zero_iff m).mp hm + subst hm0 + have h0 := hxy 0 + rw [iteratedDeriv_zero] at h0 + simp only [LinearMap.id_coe, id_eq] at h0 + have h0' : taylorCoeff 0 x = taylorCoeff 0 y := h0 + refine ⟨fun i j => ?_, fun i j => ?_, ?_⟩ + · simpa [Matrix.map_apply] using + congrArg (fun g => GaugeAlgebra.toSU3Matrix g i j) h0' + · simpa [Matrix.map_apply] using + congrArg (fun g => GaugeAlgebra.toSU2Matrix g i j) h0' + · simpa using congrArg GaugeAlgebra.toU1Value h0' + | succ n ih => + intro x y hxy m hm + -- pick a direction occurring in `m` and peel one derivative off + have hm0 : m ≠ 0 := fun h0 => by simp [h0] at hm + obtain ⟨μ, hμ⟩ := Finsupp.ne_iff.mp hm0 + simp only [Finsupp.coe_zero, Pi.zero_apply] at hμ + have hle : Finsupp.single μ 1 ≤ m := by + rw [Finsupp.single_le_iff] + omega + have hm'' : m - Finsupp.single μ 1 + Finsupp.single μ 1 = m := + tsub_add_cancel_of_le hle + have hdeg' : Finsupp.degree (m - Finsupp.single μ 1) = n := by + have h1 := congrArg Finsupp.degree hm'' + rw [map_add, Finsupp.degree_single, hm] at h1 + omega + -- the derivative pair inherits the hypothesis, by additivity of `iteratedDeriv` + have hd : ∀ s, eval (iteratedDeriv s (deriv μ x)) = + eval (iteratedDeriv s (deriv μ y)) := by + intro s + have h1 := hxy (s + {μ}) + rwa [iteratedDeriv_add, LinearMap.comp_apply, iteratedDeriv_singleton] at h1 + obtain ⟨k3, k2, k1⟩ := ih (deriv μ x) (deriv μ y) hd (m - Finsupp.single μ 1) hdeg' + refine ⟨fun i j => ?_, fun i j => ?_, ?_⟩ + · have hk := k3 i j + simp only [deriv_toSU3Matrix, Matrix.map_apply] at hk + rw [coeff_pderiv, coeff_pderiv, hm''] at hk + exact mul_right_cancel₀ (Nat.cast_add_one_ne_zero _) hk + · have hk := k2 i j + simp only [deriv_toSU2Matrix, Matrix.map_apply] at hk + rw [coeff_pderiv, coeff_pderiv, hm''] at hk + exact mul_right_cancel₀ (Nat.cast_add_one_ne_zero _) hk + · have hk := k1 + simp only [deriv_toU1Value] at hk + rw [coeff_pderiv, coeff_pderiv, hm''] at hk + exact mul_right_cancel₀ (Nat.cast_add_one_ne_zero _) hk + refine ext_of_matrix ?_ ?_ ?_ + · ext i j : 1 + ext m + exact (key (Finsupp.degree m) x y h m rfl).1 i j + · ext i j : 1 + ext m + exact (key (Finsupp.degree m) x y h m rfl).2.1 i j + · ext m + exact (key (Finsupp.degree m) x y h m rfl).2.2 + +/-- Bracket congruence: the base-point Taylor data of an iterated derivative of a + bracket depends only on the corresponding Taylor data of the two arguments. -/ +lemma eval_iteratedDeriv_bracket_congr (w : Multiset (Fin 1 ⊕ Fin 3)) + (a b a' b' : JetGaugeAlgebra) + (ha : ∀ p ≤ w, eval (iteratedDeriv p a) = eval (iteratedDeriv p a')) + (hb : ∀ p ≤ w, eval (iteratedDeriv p b) = eval (iteratedDeriv p b')) : + eval (iteratedDeriv w ⁅a, b⁆) = eval (iteratedDeriv w ⁅a', b'⁆) := by + induction w using Multiset.induction_on generalizing a b a' b' with + | empty => + have ha0 := ha 0 le_rfl + have hb0 := hb 0 le_rfl + rw [iteratedDeriv_zero] at ha0 hb0 ⊢ + simp only [LinearMap.id_coe, id_eq] at ha0 hb0 ⊢ + rw [LieHom.map_lie, LieHom.map_lie, ha0, hb0] + | cons ρ w ihw => + have hcons : ∀ c : JetGaugeAlgebra, + iteratedDeriv (ρ ::ₘ w) c = iteratedDeriv w (deriv ρ c) := by + intro c + rw [show (ρ ::ₘ w : Multiset (Fin 1 ⊕ Fin 3)) = w + {ρ} from by + rw [add_comm, Multiset.singleton_add], + iteratedDeriv_add, LinearMap.comp_apply, iteratedDeriv_singleton] + have htrans : ∀ (c c' : JetGaugeAlgebra), + (∀ p ≤ ρ ::ₘ w, eval (iteratedDeriv p c) = eval (iteratedDeriv p c')) → + ∀ p ≤ w, eval (iteratedDeriv p (deriv ρ c)) = eval (iteratedDeriv p (deriv ρ c')) := by + intro c c' hc p hp + have h1 := hc (p + {ρ}) (by + rw [show (ρ ::ₘ w : Multiset (Fin 1 ⊕ Fin 3)) = w + {ρ} from by + rw [add_comm, Multiset.singleton_add]] + exact add_le_add hp le_rfl) + rwa [iteratedDeriv_add, LinearMap.comp_apply, iteratedDeriv_singleton] at h1 + have hrest : ∀ (c c' : JetGaugeAlgebra), + (∀ p ≤ ρ ::ₘ w, eval (iteratedDeriv p c) = eval (iteratedDeriv p c')) → + ∀ p ≤ w, eval (iteratedDeriv p c) = eval (iteratedDeriv p c') := + fun c c' hc p hp => hc p (hp.trans (Multiset.le_cons_self w ρ)) + rw [hcons, hcons, deriv_bracket, deriv_bracket, map_add, map_add, map_add, map_add] + rw [ihw _ _ _ _ (htrans a a' ha) (hrest b b' hb), + ihw _ _ _ _ (hrest a a' ha) (htrans b b' hb)] + /-! ## The basis diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean index 0f3e61158..8193f3bbb 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean index f9338d469..984f77160 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/GaugeGroup/Jet.lean rename to Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean deleted file mode 100644 index be925201e..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Pure.lean +++ /dev/null @@ -1,115 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation -public import Physlib.Relativity.SL2C.Basic -public import Physlib.Mathematics.ConjModule -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Particles.LagrangianTheory.Basic -public import Physlib.Mathematics.MvPowerSeriesDerivative -public import Physlib.Mathematics.MvPolynomialTranslation -public import Mathlib.Algebra.MvPolynomial.Derivation -/-! -# The pure Jet gauge group - -Within `JetGaugeGroupI` there is a subgroup for which `U₀ = 1`, -that is those elements whose constant part is the identity. We call this -the pure Jet gauge group, and denote it `PureJetGaugeGroup`. -This is simply the kernel of the map `JetGaugeGroupI → GaugeGroupI` given by `U ↦ U₀`, -and therefore is a normal subgroup of `JetGaugeGroupI`. - -Every element `U ∈ PureJetGaugeGroup` uniquely factors as `U = (U U₀⁻¹) · U₀` with -`U U₀⁻¹ : PureJetGaugeGroup`. This gives a splitting of `JetGaugeGroupI` as -a semi-direct product of `PureJetGaugeGroup` and `GaugeGroupI`. - -There exists a map: -``` - maurerCartanCoeff : PureJetGaugeGroup → { r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0 } → LieAlgebra -``` -Defined through the symmetrised Maurer-Cartan form, as -``` - U, r ↦ 1/|r| ∑_{ν ∈ r} ∂_{r − ν}| ω_ν(U). -``` -This map is a bijection, i.e. `Function.Bijective maurerCartanCoeff`. -This is the uncurried version i.e. `U ↦ (r ↦ maurerCartanCoeff U r)`. - --/ - -@[expose] public section - -namespace StandardModel - -namespace JetGaugeGroup - -/-- The subgroup of `JetGaugeGroupI` consisting of those gauge transformations - where the constant part is unity: the kernel of evaluation at the base - point, `JetGaugeGroupI.eval`. -/ -noncomputable def PureSubgroup : Subgroup JetGaugeGroupI := JetGaugeGroupI.eval.ker - -namespace PureSubgroup - -instance : Subgroup.Normal (PureSubgroup) := - inferInstanceAs (Subgroup.Normal (JetGaugeGroupI.eval.ker)) - -lemma mem_iff {U : JetGaugeGroupI} : U ∈ PureSubgroup ↔ U.eval = 1 := by - rw [PureSubgroup] - rfl - -@[simp] -lemma eval_ceo_mem (U : PureSubgroup) : U.1.eval = 1 := by - rcases U with ⟨U, hU⟩ - rw [mem_iff] at hU - exact hU - -lemma self_mul_ofConstant_eval_mem (U : JetGaugeGroupI) : - U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ ∈ PureSubgroup := by - rw [mem_iff] - simp - -/-! - -## The projection from `JetGaugeGroupI` onto `PureSubgroup` - --/ - -/-- The projection from `JetGaugeGroupI` onto `PureSubgroup`. This is - not a group homomorphism. -/ -noncomputable def proj (U : JetGaugeGroupI) : PureSubgroup := - ⟨U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ , self_mul_ofConstant_eval_mem U⟩ - -lemma proj_surjective : Function.Surjective proj := by - intro U - use (U : JetGaugeGroupI) - simp [proj] - -lemma proj_eq_one_iff_constant {U : JetGaugeGroupI} : - proj U = 1 ↔ ∃ c, U = .ofConstant c := by - constructor - · intro h - refine ⟨U.eval, ?_⟩ - have h1 : U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ = 1 := congrArg Subtype.val h - exact mul_inv_eq_one.mp h1 - · rintro ⟨c, rfl⟩ - apply Subtype.ext - simp [proj] - -lemma proj_ofConstant (c : GaugeGroupI) : proj (JetGaugeGroupI.ofConstant c) = 1 := by - rw [proj_eq_one_iff_constant] - exact ⟨c, rfl⟩ - -lemma eq_proj_mul_ofConstant (U : JetGaugeGroupI) : - U = proj U * JetGaugeGroupI.ofConstant U.eval := by - simp [proj] - -end PureSubgroup - -end JetGaugeGroup -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean new file mode 100644 index 000000000..d380bc1e3 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean @@ -0,0 +1,250 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# Truncation of the Jet gauge group + +-/ + +@[expose] public section + +open MvPowerSeries + +namespace StandardModel + +namespace JetGaugeGroupI + +/-- The `n`-th truncation of a jet of a gauge transformation: componentwise, all + Taylor coefficients of total degree greater than `n` are set to zero. + + This is a plain function into the underlying matrix data, not a homomorphism + into `JetGaugeGroupI`: deleting the coefficients above order `n` breaks both + unitarity and multiplicativity at the orders between `n + 1` and `2 n` — the + relations `U U† = 1` and `(U V)_m = ∑ U_p V_q` at those orders depend on the + deleted coefficients. The homomorphic packaging of truncation is the quotient + of `JetGaugeGroupI` by the normal subgroup of jets agreeing with `1` up to + order `n`, not a self-map. -/ +noncomputable def truncation (n : ℕ) (U : JetGaugeGroupI) : + Matrix (Fin 3) (Fin 3) JetRing × Matrix (Fin 2) (Fin 2) JetRing × JetRing := + (U.1.1.map (JetRing.truncation n), U.2.1.1.map (JetRing.truncation n), + JetRing.truncation n U.2.2.1) + +/-- Truncation of the identity jet is the identity value triple. -/ +@[simp] +lemma truncation_one (n : ℕ) : truncation n (1 : JetGaugeGroupI) = 1 := + Prod.ext (Matrix.map_one _ (JetRing.truncation_zero n) (JetRing.truncation_one n)) + (Prod.ext (Matrix.map_one _ (JetRing.truncation_zero n) (JetRing.truncation_one n)) + (JetRing.truncation_one n)) + +/-! + +## The kernel of truncation + +-/ + + +/-- The subgroup of jets agreeing with the identity up to order `n`: the kernel of + the `n`-th truncation. These form the natural descending filtration of + `JetGaugeGroupI` whose quotients are the finite-order jet groups; the `n = 0` + member is the pure jet gauge group. -/ +noncomputable def truncationKer (n : ℕ) : Subgroup JetGaugeGroupI where + carrier := {U | truncation n U = truncation n 1} + one_mem' := rfl + mul_mem' {a b} ha hb := by + have ha3 : a.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.1) ha + have hb3 : b.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.1) hb + have ha2 : a.2.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.2.1) ha + have hb2 : b.2.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.2.1) hb + have ha1 : JetRing.truncation n a.2.2.1 = JetRing.truncation n 1 := + congrArg (fun p => p.2.2) ha + have hb1 : JetRing.truncation n b.2.2.1 = JetRing.truncation n 1 := + congrArg (fun p => p.2.2) hb + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show (a.1.1 * b.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) + rw [JetRing.matrix_truncation_mul_congr ha3 hb3, one_mul] + · show (a.2.1.1 * b.2.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) + rw [JetRing.matrix_truncation_mul_congr ha2 hb2, one_mul] + · show JetRing.truncation n (a.2.2.1 * b.2.2.1) = JetRing.truncation n 1 + rw [JetRing.truncation_mul_congr ha1 hb1, one_mul] + inv_mem' {a} ha := by + have ha3 : a.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.1) ha + have ha2 : a.2.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.2.1) ha + have ha1 : JetRing.truncation n a.2.2.1 = JetRing.truncation n 1 := + congrArg (fun p => p.2.2) ha + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show (star a.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) + rw [JetRing.matrix_truncation_star, ha3, ← JetRing.matrix_truncation_star, star_one] + · show (star a.2.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) + rw [JetRing.matrix_truncation_star, ha2, ← JetRing.matrix_truncation_star, star_one] + · show JetRing.truncation n (star a.2.2.1) = JetRing.truncation n 1 + rw [JetRing.truncation_star, ha1, ← JetRing.truncation_star, star_one] + +lemma mem_truncationKer_iff {n : ℕ} {U : JetGaugeGroupI} : + U ∈ truncationKer n ↔ truncation n U = truncation n 1 := Iff.rfl + +/-- Membership in the kernel of truncation, stated against the identity value. -/ +lemma mem_truncationKer_iff_eq_one {n : ℕ} {U : JetGaugeGroupI} : + U ∈ truncationKer n ↔ truncation n U = 1 := by + rw [mem_truncationKer_iff, truncation_one] + +/-- The kernel of truncation is normal: conjugating a jet that agrees with `1` up + to order `n` leaves it agreeing with `1` up to order `n`, since to that order + the conjugation collapses to `g * g⁻¹ = 1` by unitarity. -/ +instance truncationKer_normal (n : ℕ) : (truncationKer n).Normal where + conj_mem a ha g := by + have ha3 : a.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.1) ha + have ha2 : a.2.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.2.1) ha + have ha1 : JetRing.truncation n a.2.2.1 = JetRing.truncation n 1 := + congrArg (fun p => p.2.2) ha + have hg3 : g.1.1 * star g.1.1 = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp g.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hg2 : g.2.1.1 * star g.2.1.1 = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp g.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hg1 : g.2.2.1 * star g.2.2.1 = 1 := (Unitary.mem_iff.mp g.2.2.2).2 + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show ((g.1.1 * a.1.1) * star g.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) + rw [JetRing.matrix_truncation_mul_congr + (JetRing.matrix_truncation_mul_congr rfl ha3) rfl, mul_one, hg3] + · show ((g.2.1.1 * a.2.1.1) * star g.2.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) + rw [JetRing.matrix_truncation_mul_congr + (JetRing.matrix_truncation_mul_congr rfl ha2) rfl, mul_one, hg2] + · show JetRing.truncation n ((g.2.2.1 * a.2.2.1) * star g.2.2.1) = + JetRing.truncation n 1 + rw [JetRing.truncation_mul_congr (JetRing.truncation_mul_congr rfl ha1) rfl, + mul_one, hg1] + +/-! + +## The zeroth truncation kernel: the pure jet gauge group + +The kernel of the zeroth truncation consists of the jets whose value at the base +point is the identity — what was previously called the pure jet gauge group. + +-/ + +/-- Membership in the zeroth truncation kernel is having identity value at the + base point. -/ +lemma mem_truncationKer_zero_iff {U : JetGaugeGroupI} : + U ∈ truncationKer 0 ↔ U.eval = 1 := by + rw [mem_truncationKer_iff] + constructor + · intro h + refine Prod.ext (Subtype.ext ?_) (Prod.ext (Subtype.ext ?_) (Subtype.ext ?_)) + · ext i j : 1 + have h3 := congrArg (fun p => (p.1 : Matrix (Fin 3) (Fin 3) JetRing) i j) h + simpa [Matrix.one_apply, apply_ite constantCoeff] using + JetRing.truncation_zero_eq_iff.mp h3 + · ext i j : 1 + have h2 := congrArg (fun p => (p.2.1 : Matrix (Fin 2) (Fin 2) JetRing) i j) h + simpa [Matrix.one_apply, apply_ite constantCoeff] using + JetRing.truncation_zero_eq_iff.mp h2 + · simpa using + JetRing.truncation_zero_eq_iff.mp (congrArg (fun p => (p.2.2 : JetRing)) h) + · intro h + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show U.1.1.map (JetRing.truncation 0) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation 0) + ext i j : 1 + refine JetRing.truncation_zero_eq_iff.mpr ?_ + have h3 := congrArg (fun p => (p.1 : Matrix (Fin 3) (Fin 3) ℂ) i j) h + simpa [Matrix.one_apply, apply_ite constantCoeff] using h3 + · show U.2.1.1.map (JetRing.truncation 0) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation 0) + ext i j : 1 + refine JetRing.truncation_zero_eq_iff.mpr ?_ + have h2 := congrArg (fun p => (p.2.1 : Matrix (Fin 2) (Fin 2) ℂ) i j) h + simpa [Matrix.one_apply, apply_ite constantCoeff] using h2 + · show JetRing.truncation 0 U.2.2.1 = JetRing.truncation 0 (1 : JetRing) + refine JetRing.truncation_zero_eq_iff.mpr ?_ + simpa using congrArg (fun p => (p.2.2 : ℂ)) h + +@[simp] +lemma eval_coe_of_mem_truncationKer_zero (U : truncationKer 0) : U.1.eval = 1 := + mem_truncationKer_zero_iff.mp U.2 + +lemma self_mul_ofConstant_eval_mem (U : JetGaugeGroupI) : + U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ ∈ truncationKer 0 := by + rw [mem_truncationKer_zero_iff] + simp + +/-! + +## The projection onto the zeroth truncation kernel + +-/ + +/-- The projection from `JetGaugeGroupI` onto the kernel of the zeroth truncation, + stripping the constant part: `U ↦ U · (U₀)⁻¹`. This is not a group homomorphism; + it is the group-level cocycle of the semidirect splitting of `JetGaugeGroupI` + by the constant jets. -/ +noncomputable def truncationProjZero (U : JetGaugeGroupI) : truncationKer 0 := + ⟨U * (JetGaugeGroupI.ofConstant U.eval)⁻¹, self_mul_ofConstant_eval_mem U⟩ + +lemma truncationProjZero_surjective : Function.Surjective truncationProjZero := by + intro V + refine ⟨V.1, Subtype.ext ?_⟩ + have h1 : V.1.eval = 1 := mem_truncationKer_zero_iff.mp V.2 + simp [truncationProjZero, h1] + +lemma truncationProjZero_eq_one_iff_constant {U : JetGaugeGroupI} : + truncationProjZero U = 1 ↔ ∃ c, U = .ofConstant c := by + constructor + · intro h + refine ⟨U.eval, ?_⟩ + have h1 : U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ = 1 := congrArg Subtype.val h + exact mul_inv_eq_one.mp h1 + · rintro ⟨c, rfl⟩ + apply Subtype.ext + simp [truncationProjZero] + +lemma truncationProjZero_ofConstant (c : GaugeGroupI) : + truncationProjZero (JetGaugeGroupI.ofConstant c) = 1 := by + rw [truncationProjZero_eq_one_iff_constant] + exact ⟨c, rfl⟩ + +lemma eq_truncationProjZero_mul_ofConstant (U : JetGaugeGroupI) : + U = truncationProjZero U * JetGaugeGroupI.ofConstant U.eval := by + simp [truncationProjZero] + +end JetGaugeGroupI +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index f24780c74..3c1fc4112 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 156718484..25edf181f 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic @@ -158,6 +158,96 @@ lemma maurerCartanForm_eq_zero_iff_ofConstant (U : JetGaugeGroupI) : /-! +## The structural equation + +-/ + +/-- The structural (Maurer–Cartan) equation, basis-independently: the Maurer–Cartan + form is flat, + + `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`. + + In components with respect to a basis of the jet gauge algebra this is + `∂_μ ω^a_ν − ∂_ν ω^a_μ = ∑_{b c} f^a_{b c} · ω^b_μ · ω^c_ν`. On each matrix + factor the second-derivative terms cancel by symmetry of mixed partials, the + derivative of `A†` is rewritten through the differentiated unitarity relation, + and the surviving first-order terms form the commutator; on the abelian `U(1)` + factor the commutator is absent and only the symmetry of mixed partials + remains. -/ +lemma maurerCartanForm_structure (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : + deriv μ (maurerCartanForm U ν) - deriv ν (maurerCartanForm U μ) + + ⁅maurerCartanForm U μ, maurerCartanForm U ν⁆ = 0 := by + -- pulling the scalar `i` out of the entrywise formal derivative + have hmap : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (ρ : Fin 1 ⊕ Fin 3) (c : ℂ) + (M : Matrix κ κ JetRing), (c • M).map (pderiv ℂ ρ) = c • M.map (pderiv ℂ ρ) := + fun _ _ _ _ _ _ => Matrix.ext fun _ _ => Derivation.map_smul _ _ _ + -- the matrix-level structural identity, generic in the size of the factor + have key : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (A : Matrix κ κ JetRing), + A * star A = 1 → + (A.map (pderiv ℂ ν) * star A).map (pderiv ℂ μ) - + (A.map (pderiv ℂ μ) * star A).map (pderiv ℂ ν) = + A.map (pderiv ℂ μ) * star A * (A.map (pderiv ℂ ν) * star A) - + A.map (pderiv ℂ ν) * star A * (A.map (pderiv ℂ μ) * star A) := by + intro κ _ _ A hU + have hleib : ∀ (ρ : Fin 1 ⊕ Fin 3) (M N : Matrix κ κ JetRing), + (M * N).map (pderiv ℂ ρ) = M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := by + intro ρ M N + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + -- the derivative of `A†` through differentiated unitarity + have hq : ∀ ρ : Fin 1 ⊕ Fin 3, + (star A).map (pderiv ℂ ρ) = -(star A * A.map (pderiv ℂ ρ) * star A) := by + intro ρ + have h1 : A * (star A).map (pderiv ℂ ρ) = -(A.map (pderiv ℂ ρ) * star A) := + eq_neg_of_add_eq_zero_right (by + rw [← hleib ρ A (star A), hU] + exact Matrix.ext fun i j => by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ρ)]) + calc (star A).map (pderiv ℂ ρ) + = star A * A * (star A).map (pderiv ℂ ρ) := by + rw [mul_eq_one_comm.mp hU, one_mul] + _ = -(star A * A.map (pderiv ℂ ρ) * star A) := by + rw [mul_assoc, h1, mul_neg, ← mul_assoc] + rw [hleib μ (A.map (pderiv ℂ ν)) (star A), hleib ν (A.map (pderiv ℂ μ)) (star A), + show (A.map (pderiv ℂ ν)).map (pderiv ℂ μ) = (A.map (pderiv ℂ μ)).map (pderiv ℂ ν) + from Matrix.ext fun _ _ => JetRing.pderiv_comm μ ν _, hq μ, hq ν] + simp only [mul_neg, ← mul_assoc] + abel + -- the abelian `U(1)` identity: no commutator, pure symmetry of mixed partials + have keyU1 : pderiv ℂ μ (pderiv ℂ ν U.2.2.1 * star U.2.2.1) = + pderiv ℂ ν (pderiv ℂ μ U.2.2.1 * star U.2.2.1) := by + have hu : U.2.2.1 * star U.2.2.1 = 1 := (Unitary.mem_iff.mp U.2.2.2).2 + have hstar : ∀ ρ : Fin 1 ⊕ Fin 3, pderiv ℂ ρ (star U.2.2.1) = + -(star U.2.2.1 * pderiv ℂ ρ U.2.2.1 * star U.2.2.1) := by + intro ρ + have h0 : pderiv ℂ ρ (U.2.2.1 * star U.2.2.1) = 0 := by rw [hu, pderiv_one] + rw [Derivation.leibniz] at h0 + simp only [smul_eq_mul] at h0 + linear_combination star U.2.2.1 * h0 - + pderiv ℂ ρ (star U.2.2.1) * ((mul_comm _ _).trans hu) + simp only [Derivation.leibniz, smul_eq_mul] + rw [hstar μ, hstar ν, JetRing.pderiv_comm μ ν] + ring + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [add_toSU3Matrix, add_toSU2Matrix, add_toU1Value, sub_toSU3Matrix, + sub_toSU2Matrix, sub_toU1Value, deriv_toSU3Matrix, deriv_toSU2Matrix, + deriv_toU1Value, bracket_toSU3Matrix, bracket_toSU2Matrix, bracket_toU1Value, + maurerCartanForm_toSU3Matrix, maurerCartanForm_toSU2Matrix, + maurerCartanForm_toU1Value, zero_toSU3Matrix, zero_toSU2Matrix, zero_toU1Value, + hmap, smul_mul_smul_comm, Complex.I_mul_I, neg_one_smul, Derivation.map_smul, + add_zero] + · rw [← smul_sub, ← smul_add, key _ U.1.1 + (Matrix.mem_unitaryGroup_iff.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1)] + exact smul_eq_zero_of_right _ (by abel) + · rw [← smul_sub, ← smul_add, key _ U.2.1.1 + (Matrix.mem_unitaryGroup_iff.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1)] + exact smul_eq_zero_of_right _ (by abel) + · rw [keyU1, sub_self] + +/-! + ## The symmeterized Maurer–Cartan form -/ @@ -217,4 +307,82 @@ lemma symmetrizedMaurerCartanForm_cons (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin show (r.card : ℝ)/((r.card : ℝ) + 1) * (1/(r.card : ℝ)) = 1/((r.card : ℝ) + 1) by field_simp] +/-! + +## Determination of the Maurer–Cartan form by its symmetrized coefficients + +-/ + + +/-- The symmetrization defect of the Maurer–Cartan form: an iterated derivative of + `ω` is the corresponding symmetrized form plus an average of iterated derivatives + of brackets of `ω` in strictly fewer directions. This is the jet-level form of the + outline's span statement, with the structure equation already substituted. -/ +lemma iteratedDeriv_maurerCartanForm_eq_symmetrized_add (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + iteratedDeriv s (maurerCartanForm U μ) = + symmetrizedMaurerCartanForm U (μ ::ₘ s) + + (1/(s.card + 1 : ℝ)) • (s.map fun ν => + iteratedDeriv (s.erase ν) ⁅maurerCartanForm U μ, maurerCartanForm U ν⁆).sum := by + -- each bracket term is a difference of two iterated derivatives of `ω` + have hswap : ∀ ν ∈ s, + iteratedDeriv (s.erase ν) ⁅maurerCartanForm U μ, maurerCartanForm U ν⁆ = + iteratedDeriv s (maurerCartanForm U μ) - + iteratedDeriv (μ ::ₘ s.erase ν) (maurerCartanForm U ν) := by + intro ν hν + have hb : ⁅maurerCartanForm U μ, maurerCartanForm U ν⁆ = + deriv ν (maurerCartanForm U μ) - deriv μ (maurerCartanForm U ν) := by + have h1 : deriv μ (maurerCartanForm U ν) - deriv ν (maurerCartanForm U μ) = + -⁅maurerCartanForm U μ, maurerCartanForm U ν⁆ := + eq_neg_of_add_eq_zero_left (maurerCartanForm_structure U μ ν) + rw [← neg_sub, h1, neg_neg] + rw [hb, map_sub] + congr 1 + · conv_rhs => rw [← Multiset.cons_erase hν] + rw [show (ν ::ₘ s.erase ν : Multiset (Fin 1 ⊕ Fin 3)) = s.erase ν + {ν} from by + rw [add_comm, Multiset.singleton_add], + iteratedDeriv_add, LinearMap.comp_apply, iteratedDeriv_singleton] + · rw [show (μ ::ₘ s.erase ν : Multiset (Fin 1 ⊕ Fin 3)) = s.erase ν + {μ} from by + rw [add_comm, Multiset.singleton_add], + iteratedDeriv_add, LinearMap.comp_apply, iteratedDeriv_singleton] + have herase : ∀ ν ∈ s, (μ ::ₘ s).erase ν = μ ::ₘ s.erase ν := by + intro ν hν + rcases eq_or_ne ν μ with rfl | hne + · rw [Multiset.erase_cons_head, Multiset.cons_erase hν] + · rw [Multiset.erase_cons_tail _ hne.symm] + rw [symmetrizedMaurerCartanForm, Multiset.map_cons, Multiset.sum_cons, + Multiset.card_cons, Multiset.sub_singleton, Multiset.erase_cons_head, + Multiset.map_congr rfl fun ν hν => by rw [Multiset.sub_singleton, herase ν hν], + Multiset.map_congr rfl hswap, Multiset.sum_map_sub, Multiset.map_const', + Multiset.sum_replicate, ← Nat.cast_smul_eq_nsmul ℝ] + push_cast + match_scalars <;> field_simp <;> ring + +/-- Determination step: if the base-point symmetrized Maurer–Cartan data of `U` and + `V` agree, and their Maurer–Cartan Taylor data agree in fewer than `n` directions, + then they agree in `n` directions. -/ +lemma eval_iteratedDeriv_maurerCartanForm_eq_of_symmetrized_eq (U V : JetGaugeGroupI) (n : ℕ) + (hsym : ∀ r, eval (symmetrizedMaurerCartanForm U r) = + eval (symmetrizedMaurerCartanForm V r)) + (ih : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card < n → + eval (iteratedDeriv s (maurerCartanForm U μ)) = + eval (iteratedDeriv s (maurerCartanForm V μ))) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (hs : s.card = n) : + eval (iteratedDeriv s (maurerCartanForm U μ)) = + eval (iteratedDeriv s (maurerCartanForm V μ)) := by + rw [iteratedDeriv_maurerCartanForm_eq_symmetrized_add U s μ, + iteratedDeriv_maurerCartanForm_eq_symmetrized_add V s μ, + map_add, map_add, map_smul, map_smul, hsym] + refine congrArg (fun z => eval (symmetrizedMaurerCartanForm V (μ ::ₘ s)) + + (1/(s.card + 1 : ℝ)) • z) ?_ + rw [map_multiset_sum, map_multiset_sum, Multiset.map_map, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun ν hν => ?_) + have hlt : ∀ p : Multiset (Fin 1 ⊕ Fin 3), p ≤ s.erase ν → p.card < n := by + intro p hp + have h1 := Multiset.card_le_card hp + have h2 := Multiset.card_erase_add_one hν + omega + exact eval_iteratedDeriv_bracket_congr (s.erase ν) _ _ _ _ + (fun p hp => ih p μ (hlt p hp)) (fun p hp => ih p ν (hlt p hp)) + end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean deleted file mode 100644 index 1004fb673..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Pure.lean +++ /dev/null @@ -1,42 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Pure -public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation -public import Physlib.Relativity.SL2C.Basic -public import Physlib.Mathematics.ConjModule -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Particles.LagrangianTheory.Basic -public import Physlib.Mathematics.MvPowerSeriesDerivative -public import Physlib.Mathematics.MvPolynomialTranslation -public import Mathlib.Algebra.MvPolynomial.Derivation -/-! -# The Maurer–Cartan forms and the pure subgroup --/ - -@[expose] public section -namespace StandardModel -open MvPowerSeries JetGaugeAlgebra -namespace JetGaugeGroup -namespace PureSubgroup - -/-- Projecting onto the pure subgroup does not change the Maurer–Cartan form: by the - cocycle law, right-multiplication by a constant gauge transformation drops out. -/ -lemma maurerCartanForm_proj (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - maurerCartanForm (proj U : JetGaugeGroupI) μ = maurerCartanForm U μ := by - rw [show (proj U : JetGaugeGroupI) = U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ from rfl, - ← map_inv, maurerCartanForm_cocycle, maurerCartanForm_ofConstant] - simp - -end PureSubgroup -end JetGaugeGroup -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean new file mode 100644 index 000000000..67b088582 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Truncation +public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.ConjModule +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis +public import Physlib.Particles.LagrangianTheory.Basic +public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.MvPolynomialTranslation +public import Mathlib.Algebra.MvPolynomial.Derivation +/-! +# The Maurer–Cartan forms and the truncation kernels +-/ + +@[expose] public section +namespace StandardModel +open MvPowerSeries JetGaugeAlgebra +/-- Projecting onto the zeroth truncation kernel does not change the Maurer–Cartan + form: by the cocycle law, right-multiplication by a constant gauge transformation + drops out. -/ +lemma maurerCartanForm_truncationProjZero (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + maurerCartanForm (JetGaugeGroupI.truncationProjZero U : JetGaugeGroupI) μ = + maurerCartanForm U μ := by + rw [show (JetGaugeGroupI.truncationProjZero U : JetGaugeGroupI) = + U * (JetGaugeGroupI.ofConstant U.eval)⁻¹ from rfl, + ← map_inv, maurerCartanForm_cocycle, maurerCartanForm_ofConstant] + simp + +/-- A pure jet is determined by its Maurer–Cartan form: on the kernel of the zeroth + truncation, `U ↦ ω(U)` is injective. By the cocycle and inverse laws + `ω(V⁻¹ U) = Ad_{V⁻¹}(ω(U) − ω(V)) = 0`, so `V⁻¹ U` is a constant jet, and purity + of `U` and `V` forces that constant to be the identity. -/ +lemma maurerCartanForm_injOn_truncationKer_zero {U V : JetGaugeGroupI} + (hU : U ∈ JetGaugeGroupI.truncationKer 0) (hV : V ∈ JetGaugeGroupI.truncationKer 0) + (h : maurerCartanForm U = maurerCartanForm V) : U = V := by + have h1 : maurerCartanForm (V⁻¹ * U) = 0 := by + funext μ + rw [maurerCartanForm_cocycle, maurerCartanForm_inv, congrFun h μ] + simp + obtain ⟨c, hc⟩ := (maurerCartanForm_eq_zero_iff_ofConstant _).mp h1 + have hc1 : c = 1 := by + have he := congrArg JetGaugeGroupI.eval hc + rw [map_mul, map_inv, JetGaugeGroupI.mem_truncationKer_zero_iff.mp hU, + JetGaugeGroupI.mem_truncationKer_zero_iff.mp hV, JetGaugeGroupI.eval_ofConstant] at he + simpa using he.symm + rw [hc1, map_one] at hc + exact (inv_mul_eq_one.mp hc).symm + +/-! + +## Freeness: injectivity of the symmetrized Maurer–Cartan data + +-/ + +/-- The symmetrized Maurer–Cartan data of a pure jet: the base-point values of its + symmetrized Maurer–Cartan forms, indexed by nonempty multisets of directions. + Total symmetry is automatic from the multiset indexing. -/ +noncomputable def symmetrizedMaurerCartanCoeff (U : JetGaugeGroupI.truncationKer 0) + (r : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0}) : GaugeAlgebra := + eval (symmetrizedMaurerCartanForm U.1 r.1) + +/-- Freeness, injectivity half: a pure jet is determined by its symmetrized + Maurer–Cartan data. The symmetrized data determine all Maurer–Cartan Taylor data + by strong induction with `eval_iteratedDeriv_maurerCartanForm_eq_of_symmetrized_eq`, + hence the Maurer–Cartan form itself by Taylor determinacy, hence the pure jet by + `maurerCartanForm_injOn_truncationKer_zero`. -/ +lemma symmetrizedMaurerCartanCoeff_injective : Function.Injective symmetrizedMaurerCartanCoeff := by + intro U V h + -- the hypothesis extends to all multisets, the empty one trivially + have hsym : ∀ r, eval (symmetrizedMaurerCartanForm U.1 r) = + eval (symmetrizedMaurerCartanForm V.1 r) := by + intro r + by_cases hr : r = 0 + · subst hr + simp + · exact congrFun h ⟨r, hr⟩ + -- all Maurer–Cartan Taylor data agree, by strong induction on the number of directions + have hall : ∀ (n : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card = n → + eval (iteratedDeriv s (maurerCartanForm U.1 μ)) = + eval (iteratedDeriv s (maurerCartanForm V.1 μ)) := by + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro s μ hs + exact eval_iteratedDeriv_maurerCartanForm_eq_of_symmetrized_eq U.1 V.1 n hsym + (fun p ν hp => ih p.card hp p ν rfl) s μ hs + -- hence the Maurer–Cartan forms agree, by Taylor determinacy + have hmc : maurerCartanForm U.1 = maurerCartanForm V.1 := by + funext μ + exact ext_of_eval_iteratedDeriv fun s => hall s.card s μ rfl + exact Subtype.ext (maurerCartanForm_injOn_truncationKer_zero U.2 V.2 hmc) + +end StandardModel diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index a47b76545..73b00d400 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -11,6 +11,7 @@ public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Mathlib.Algebra.TrivSqZeroExt.Basic public import Mathlib.Data.Finsupp.Multiset +public import Mathlib.Data.Finsupp.Weight public import Physlib.Particles.StandardModel.Basic public import Mathlib.RingTheory.MvPowerSeries.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic @@ -157,6 +158,132 @@ lemma pderiv_comm (μ ν : Fin 1 ⊕ Fin 3) (f : JetRing) : push_cast ring +/-! + +### Truncation of jets + +-/ +/-- The `n`-th truncation of a jet: the Taylor coefficients of total degree + greater than `n` are set to zero. -/ +noncomputable def truncation (n : ℕ) (f : JetRing) : JetRing := + fun m => if Finsupp.degree m ≤ n then f m else 0 + +@[simp] +lemma coeff_truncation_of_le {n : ℕ} {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} + (h : Finsupp.degree m ≤ n) (f : JetRing) : + coeff m (truncation n f) = coeff m f := if_pos h + +@[simp] +lemma coeff_truncation_of_gt {n : ℕ} {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} + (h : n < Finsupp.degree m) (f : JetRing) : + coeff m (truncation n f) = 0 := if_neg (not_le.mpr h) + +lemma truncation_add (n : ℕ) (f g : JetRing) : + truncation n (f + g) = truncation n f + truncation n g := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm, map_add, map_add, + coeff_truncation_of_le hm, coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), map_add, + coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm), add_zero] + +lemma truncation_sum {ι : Type} (n : ℕ) (s : Finset ι) (f : ι → JetRing) : + truncation n (∑ i ∈ s, f i) = ∑ i ∈ s, truncation n (f i) := + map_sum (AddMonoidHom.mk' (truncation n) (truncation_add n)) f s + +/-- Truncation of a product only sees the factors through their truncations: the + coefficients of `f * g` in degree at most `n` involve only coefficients of `f` + and `g` in degree at most `n`. -/ +lemma truncation_mul (n : ℕ) (f g : JetRing) : + truncation n (f * g) = truncation n (truncation n f * truncation n g) := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm, coeff_truncation_of_le hm, coeff_mul, coeff_mul] + refine Finset.sum_congr rfl fun p hp => ?_ + have hpq : p.1 + p.2 = m := Finset.mem_antidiagonal.mp hp + have h1 : Finsupp.degree p.1 ≤ n := by + refine le_trans ?_ hm + rw [← hpq, map_add] + exact Nat.le_add_right _ _ + have h2 : Finsupp.degree p.2 ≤ n := by + refine le_trans ?_ hm + rw [← hpq, map_add] + exact Nat.le_add_left _ _ + rw [coeff_truncation_of_le h1, coeff_truncation_of_le h2] + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm)] + +/-- The congruence principle for truncated products. -/ +lemma truncation_mul_congr {n : ℕ} {f f' g g' : JetRing} + (hf : truncation n f = truncation n f') (hg : truncation n g = truncation n g') : + truncation n (f * g) = truncation n (f' * g') := by + rw [truncation_mul, hf, hg, ← truncation_mul] + +lemma truncation_star (n : ℕ) (f : JetRing) : + truncation n (star f) = star (truncation n f) := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm, coeff_star, coeff_star, coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_star, + coeff_truncation_of_gt (not_le.mp hm), star_zero] + +/-- Entrywise truncation of a matrix product only sees the factors through their + entrywise truncations. -/ +lemma matrix_truncation_mul {κ : Type} [Fintype κ] [DecidableEq κ] (n : ℕ) + (A B : Matrix κ κ JetRing) : + (A * B).map (truncation n) = + (A.map (truncation n) * B.map (truncation n)).map (truncation n) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply] + rw [truncation_sum, truncation_sum] + exact Finset.sum_congr rfl fun k _ => truncation_mul n _ _ + +/-- The congruence principle for entrywise-truncated matrix products. -/ +lemma matrix_truncation_mul_congr {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} + {A A' B B' : Matrix κ κ JetRing} + (hA : A.map (truncation n) = A'.map (truncation n)) + (hB : B.map (truncation n) = B'.map (truncation n)) : + (A * B).map (truncation n) = (A' * B').map (truncation n) := by + rw [matrix_truncation_mul, hA, hB, ← matrix_truncation_mul] + +lemma matrix_truncation_star {κ : Type} [Fintype κ] [DecidableEq κ] (n : ℕ) + (A : Matrix κ κ JetRing) : + (star A).map (truncation n) = star (A.map (truncation n)) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.star_apply] + exact truncation_star n (A j i) + +@[simp] +lemma truncation_zero (n : ℕ) : truncation n (0 : JetRing) = 0 := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), map_zero] + +/-- Truncation fixes the identity: a constant series has its only nonzero Taylor + coefficient in degree zero, which every truncation keeps. -/ +@[simp] +lemma truncation_one (n : ℕ) : truncation n (1 : JetRing) = 1 := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_one, + if_neg (by rintro rfl; simp at hm)] + +/-- Two jets have the same zeroth truncation exactly when they have the same + value at the base point. -/ +lemma truncation_zero_eq_iff {f g : JetRing} : + truncation 0 f = truncation 0 g ↔ constantCoeff f = constantCoeff g := by + constructor + · intro h + simpa using congrArg (coeff (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) h + · intro h + ext m + by_cases hm : Finsupp.degree m ≤ 0 + · have hm0 : m = 0 := (Finsupp.degree_eq_zero_iff m).mp (Nat.le_zero.mp hm) + subst hm0 + simpa using h + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm)] + end JetRing /-! From 7b6f2512c227d9e69bdc5df780c9c89bc294d9fe Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:20:10 +0100 Subject: [PATCH 164/254] feat: Some long proofs, but more API --- Outline.md | 41 ++++- .../GaugeAlgebra/JetGaugeAlgebra.lean | 19 ++- .../GaugeGroup/Jet/Truncation.lean | 16 +- .../GaugeGroup/MaurerCartan/Basic.lean | 132 +++++++++++++++ .../GaugeGroup/MaurerCartan/Truncation.lean | 10 ++ Physlib/Relativity/DerivAlgebra.lean | 160 ++++++++++++++++++ 6 files changed, 365 insertions(+), 13 deletions(-) diff --git a/Outline.md b/Outline.md index 57f3c93f1..2f492edd4 100644 --- a/Outline.md +++ b/Outline.md @@ -195,16 +195,45 @@ Basic rules of this outline: - We define a representation of `JetGaugeGroup` as the following data: - a homomorphism `jρ : JetGaugeGroup → Matrix ι ι JetRing` - - A map `dρ : κ → Matrix ι ι ℂ` such that: - - `[dρ_a, dρ_b] = i ∑_c f^c_{a b} · dρ_c`. - - Equivariance: `∂_0| jρ(U) · dρ_a · ∂_0| jρ(U)⁻¹ = ∑_b Ad(U₀⁻¹)^a_b · dρ_b` + - an `ℝ`-linear map `dρ : GaugeAlgebra →ₗ[ℝ] Matrix ι ι ℂ` such that: + - Bracket: `dρ ⁅X, Y⁆ = i (dρ X · dρ Y − dρ Y · dρ X)`. + Equivalently, `X ↦ i • dρ X` is a morphism of real Lie algebras into + `Matrix ι ι ℂ` with the commutator bracket. + - Equivariance: `ρ₀(U) · dρ X · ρ₀(U)⁻¹ = dρ (Ad(U₀) X)` such that - - `∂_μ jρ(U) = -i ∑_a ω^a_μ(U) · dρ_a · ∂_0| jρ(U)` -- We will denote a Jet representation as `jρ`, dropping the `dρ` dat for notational + - Compatibility: `∂_μ jρ(U) = -i · dρ̂(ω_μ(U)) · jρ(U)` +- Here `dρ̂ : JetGaugeAlgebra → Matrix ι ι JetRing` is the coefficientwise + (`JetRing`-linear) extension of `dρ`, characterized by + `∂_r|(dρ̂ Z) = dρ (∂_r| Z)` for every multiset `r`. In the basis `T_a` it is + `dρ̂ Z = ∑_a Z^a • dρ_a` with `dρ_a := dρ T_a`, and the conditions above + recover the component form: `[dρ_a, dρ_b] = i ∑_c f^c_{a b} · dρ_c`. +- We will denote a Jet representation as `jρ`, dropping the `dρ` data for notational ease. - The general derivatives of `jρ(U)` are then given by: `∂_{s + μ}|(jρ(U)) = -i ∑_{p + q = s} C(s, p) ∑_a ∂_p|(ω^a_μ(U)) · dρ_a · ∂_q|(jρ(U))` -- We let `ρ₀(U) := ∂_0|(jρ(U))` +- We let `ρ₀(U) := ∂_0|(jρ(U))`; note `ρ₀(U)` depends only on the base value `U₀`. + +#### `dρ` is determined by `jρ` + +- For `X : GaugeAlgebra` and a coordinate `μ`, let `U_X := exp(-i x^μ • X)` be the + corresponding linear pure jet (a formal power-series exponential; it is a unitary + jet since `X` is hermitian, has base value `1`, and `∂_0| ω_ν(U_X) = δ_{ν μ} X`). +- Evaluating compatibility at the base point gives `∂_μ|(jρ(U_X)) = -i · dρ X`, so + + `dρ X = i ∂_μ|(jρ(U_X))`. + +- Hence `dρ` is uniquely determined by `jρ`: two jet representations with the same + `jρ` are equal. We nevertheless carry `dρ` as data — an abstract homomorphism + cannot be differentiated, so a `jρ`-only definition would have to existentially + quantify over `dρ`; carrying the field with this uniqueness lemma is more + convenient. +- The bracket and equivariance conditions are then derivable from the homomorphism + property together with compatibility (so they may be demoted to lemmas when + constructing instances): + - equivariance by applying compatibility to `U₀ V U₀⁻¹`, using the cocycle + identity `ω_μ(U₀ V U₀⁻¹) = Ad(U₀) ω_μ(V)` for constant `U₀`; + - the bracket from the symmetry of `∂_μ ∂_ν` together with the structure + equation, tested on the linear jets `U_X`. ## The algebra - Let `B` be an algebra over `ℂ`. diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index fc05210be..66b02e847 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -21,6 +21,8 @@ public import Mathlib.Algebra.MvPolynomial.Derivation public import Mathlib.Analysis.Normed.Algebra.Exponential public import Mathlib.RingTheory.MvPowerSeries.PiTopology public import Mathlib.Topology.Instances.Matrix +public import Mathlib.RingTheory.PowerSeries.Derivative +public import Mathlib.RingTheory.PowerSeries.Basic /-! # The jet gauge algebra @@ -91,6 +93,21 @@ def toSU2Matrix (a : JetGaugeAlgebra) : Matrix (Fin 2) (Fin 2) JetRing := a.2.1 /-- The `u(1)`-factor component of an element of the jet gauge algebra. -/ def toU1Value (a : JetGaugeAlgebra) : JetRing := a.2.2 +/-- The underlying matrix value of an element of the jet gauge algebra, as a + product of matrices. -/ +def toVal (a : JetGaugeAlgebra) : + Matrix (Fin 3) (Fin 3) JetRing × Matrix (Fin 2) (Fin 2) JetRing × JetRing := + (a.toSU3Matrix, a.toSU2Matrix, a.toU1Value) + +@[simp] +lemma toVal_fst (a : JetGaugeAlgebra) : a.toVal.1 = a.toSU3Matrix := rfl + +@[simp] +lemma toVal_snd_fst (a : JetGaugeAlgebra) : a.toVal.2.1 = a.toSU2Matrix := rfl + +@[simp] +lemma toVal_snd_snd (a : JetGaugeAlgebra) : a.toVal.2.2 = a.toU1Value := rfl + @[ext] lemma ext_of_matrix {a b : JetGaugeAlgebra} (h1 : a.toSU3Matrix = b.toSU3Matrix) (h2 : a.toSU2Matrix = b.toSU2Matrix) (h3 : a.toU1Value = b.toU1Value) : a = b := by @@ -478,7 +495,7 @@ theorem ext_of_eval_iteratedDeriv {x y : JetGaugeAlgebra} congrArg (fun g => GaugeAlgebra.toSU3Matrix g i j) h0' · simpa [Matrix.map_apply] using congrArg (fun g => GaugeAlgebra.toSU2Matrix g i j) h0' - · simpa using congrArg GaugeAlgebra.toU1Value h0' + · simpa using congrArg GaugeAlgebra.toU1Value h0' | succ n ih => intro x y hxy m hm -- pick a direction occurring in `m` and peel one derivative off diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean index d380bc1e3..353aa895e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean @@ -172,13 +172,15 @@ lemma mem_truncationKer_zero_iff {U : JetGaugeGroupI} : refine Prod.ext (Subtype.ext ?_) (Prod.ext (Subtype.ext ?_) (Subtype.ext ?_)) · ext i j : 1 have h3 := congrArg (fun p => (p.1 : Matrix (Fin 3) (Fin 3) JetRing) i j) h - simpa [Matrix.one_apply, apply_ite constantCoeff] using + simpa [eval, evalSU, RingHom.mapMatrix_apply, Matrix.map_apply, + Matrix.one_apply, apply_ite constantCoeff] using JetRing.truncation_zero_eq_iff.mp h3 · ext i j : 1 have h2 := congrArg (fun p => (p.2.1 : Matrix (Fin 2) (Fin 2) JetRing) i j) h - simpa [Matrix.one_apply, apply_ite constantCoeff] using + simpa [eval, evalSU, RingHom.mapMatrix_apply, Matrix.map_apply, + Matrix.one_apply, apply_ite constantCoeff] using JetRing.truncation_zero_eq_iff.mp h2 - · simpa using + · simpa [eval, evalU1] using JetRing.truncation_zero_eq_iff.mp (congrArg (fun p => (p.2.2 : JetRing)) h) · intro h refine Prod.ext ?_ (Prod.ext ?_ ?_) @@ -187,16 +189,18 @@ lemma mem_truncationKer_zero_iff {U : JetGaugeGroupI} : ext i j : 1 refine JetRing.truncation_zero_eq_iff.mpr ?_ have h3 := congrArg (fun p => (p.1 : Matrix (Fin 3) (Fin 3) ℂ) i j) h - simpa [Matrix.one_apply, apply_ite constantCoeff] using h3 + simpa [eval, evalSU, RingHom.mapMatrix_apply, Matrix.map_apply, + Matrix.one_apply, apply_ite constantCoeff] using h3 · show U.2.1.1.map (JetRing.truncation 0) = (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation 0) ext i j : 1 refine JetRing.truncation_zero_eq_iff.mpr ?_ have h2 := congrArg (fun p => (p.2.1 : Matrix (Fin 2) (Fin 2) ℂ) i j) h - simpa [Matrix.one_apply, apply_ite constantCoeff] using h2 + simpa [eval, evalSU, RingHom.mapMatrix_apply, Matrix.map_apply, + Matrix.one_apply, apply_ite constantCoeff] using h2 · show JetRing.truncation 0 U.2.2.1 = JetRing.truncation 0 (1 : JetRing) refine JetRing.truncation_zero_eq_iff.mpr ?_ - simpa using congrArg (fun p => (p.2.2 : ℂ)) h + simpa [eval, evalU1] using congrArg (fun p => (p.2.2 : ℂ)) h @[simp] lemma eval_coe_of_mem_truncationKer_zero (U : truncationKer 0) : U.1.eval = 1 := diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 25edf181f..e6f38fcbb 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -248,6 +248,138 @@ lemma maurerCartanForm_structure (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) /-! +## Integrating the structural equation + +-/ + +/-- The integration step of the converse to the structural equation: a flat jet + 1-form `ω` is the logarithmic derivative of a jet of gauge transformations based + at the identity, `∂_μ U = −i ω_μ · U` with `U(0) = 1`. Combined with unitarity + this says `ω_μ = i (∂_μ U) U⁻¹`, i.e. `ω` is the Maurer–Cartan form of a pure + jet; existence there is `exists_maurerCartanForm_eq_of_structure`. -/ +lemma exists_deriv_eq_of_maurerCartanForm_structure + (ω : (Fin 1 ⊕ Fin 3) → JetGaugeAlgebra) + (hω : ∀ μ ν, deriv μ (ω ν) - deriv ν (ω μ) + ⁅ω μ, ω ν⁆ = 0) : + ∃ U : JetGaugeGroupI, U.eval = 1 ∧ ∀ μ, + JetGaugeGroupI.deriv μ U = (-Complex.I) • (ω μ).toVal * U.toVal := by + -- entrywise toolkit: `pderiv` through scalars, products, stars; constancy of jets + have hmap : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (ρ : Fin 1 ⊕ Fin 3) (c : ℂ) + (M : Matrix κ κ JetRing), (c • M).map (pderiv ℂ ρ) = c • M.map (pderiv ℂ ρ) := + fun _ _ _ _ _ _ => Matrix.ext fun _ _ => Derivation.map_smul _ _ _ + have hleib : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (ρ : Fin 1 ⊕ Fin 3) + (M N : Matrix κ κ JetRing), + (M * N).map (pderiv ℂ ρ) = M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := by + intro κ _ _ ρ M N + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + have hstarmap : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (ρ : Fin 1 ⊕ Fin 3) + (M : Matrix κ κ JetRing), (star M).map (pderiv ℂ ρ) = star (M.map (pderiv ℂ ρ)) := + fun _ _ _ ρ M => Matrix.ext fun i j => JetRing.pderiv_star ρ (M j i) + have hconst : ∀ f : JetRing, (∀ μ, pderiv ℂ μ f = 0) → f = C (constantCoeff f) := + fun f hf => pderiv.ext (fun i => by rw [hf i, pderiv_C]) (by rw [constantCoeff_C]) + have hconstM : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (M : Matrix κ κ JetRing), + (constantCoeff : JetRing →+* ℂ).mapMatrix M = 1 → + (∀ μ, M.map (pderiv ℂ μ) = 0) → M = 1 := by + intro κ _ _ M h1 hM + ext i j + rw [hconst (M i j) fun μ => congrArg (fun N => N i j) (hM μ), + show constantCoeff (M i j) = (1 : Matrix κ κ ℂ) i j from congrArg (fun N => N i j) h1] + simp [Matrix.one_apply, apply_ite (fun c : ℂ => (C c : JetRing))] + -- generic integration: flat hermitian data has a unitary Wilson line based at `1` + have hmain : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] + (X : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing), (∀ μ, star (X μ) = X μ) → + (∀ μ ν, (X ν).map (pderiv ℂ μ) - (X μ).map (pderiv ℂ ν) + + Complex.I • (X μ * X ν - X ν * X μ) = 0) → + ∃ F : Matrix κ κ JetRing, (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 ∧ + F * star F = 1 ∧ ∀ μ, F.map (pderiv ℂ μ) = (-Complex.I) • X μ * F := by + intro κ _ _ X hXstar hXflat + obtain ⟨F, hF0, hF⟩ := JetRing.exists_parallelTransport (fun μ => (-Complex.I) • X μ) + (fun μ ν => by + simp only [hmap, smul_mul_smul_comm] + linear_combination (norm := module) (-Complex.I) • hXflat μ ν) + replace hF : ∀ μ, F.map (pderiv ℂ μ) = (-Complex.I) • X μ * F := hF + have hA : ∀ μ, star ((-Complex.I) • X μ) = -((-Complex.I) • X μ) := fun μ => by + rw [star_smul, hXstar μ] + simp + refine ⟨F, hF0, mul_eq_one_comm.mp (hconstM _ _ ?_ fun μ => ?_), hF⟩ + · rw [map_mul, JetGaugeGroupI.mapMatrix_constantCoeff_star, hF0, star_one, one_mul] + · rw [hleib, hstarmap, hF, star_mul, hA, mul_neg, neg_mul, mul_assoc, neg_add_cancel] + -- the determinant of a Wilson line of traceless data is constant, hence `1` + have hdet : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] + (X : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing) (F : Matrix κ κ JetRing), + (∀ (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3), + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace) → + (∀ μ, (X μ).trace = 0) → (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 → + (∀ μ, F.map (pderiv ℂ μ) = (-Complex.I) • X μ * F) → F.det = 1 := by + intro κ _ _ X F hjac htr h0 hF + rw [hconst F.det fun μ => by + rw [hjac F μ, hF μ, Matrix.mul_assoc, Matrix.mul_adjugate, mul_smul_comm, mul_one, + Matrix.trace_smul, Matrix.trace_smul, htr μ, smul_zero, smul_zero], + RingHom.map_det, h0, Matrix.det_one, map_one] + -- Jacobi's formula on each matrix factor + have hjac3 : ∀ (M : Matrix (Fin 3) (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3), + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + intro M μ + rw [Matrix.det_fin_three] + simp only [Matrix.trace_fin_three, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.map_apply, Matrix.adjugate_fin_three, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.head_cons, + Matrix.tail_cons, Matrix.head_fin_const, Matrix.empty_val', Matrix.cons_val_fin_one, + map_sub, map_add, Derivation.leibniz, smul_eq_mul] + ring + have hjac2 : ∀ (M : Matrix (Fin 2) (Fin 2) JetRing) (μ : Fin 1 ⊕ Fin 3), + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + intro M μ + rw [Matrix.det_fin_two] + simp only [Matrix.adjugate_fin_two, Matrix.trace_fin_two, Matrix.mul_apply, + Matrix.map_apply, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, + Matrix.empty_val', Matrix.cons_val_fin_one, Fin.sum_univ_two, Matrix.cons_val_one, + map_sub, Derivation.leibniz, smul_eq_mul] + ring + -- integrate each factor + obtain ⟨F₃, hF₃0, hF₃u, hF₃⟩ := hmain (Fin 3) (fun μ => (ω μ).toSU3Matrix) + (fun μ => show star (ω μ).toSU3Matrix = (ω μ).toSU3Matrix from (ω μ).1.2.1) + (fun μ ν => by + simpa only [sub_toSU3Matrix, add_toSU3Matrix, deriv_toSU3Matrix, bracket_toSU3Matrix, + zero_toSU3Matrix] using congrArg toSU3Matrix (hω μ ν)) + obtain ⟨F₂, hF₂0, hF₂u, hF₂⟩ := hmain (Fin 2) (fun μ => (ω μ).toSU2Matrix) + (fun μ => show star (ω μ).toSU2Matrix = (ω μ).toSU2Matrix from (ω μ).2.1.2.1) + (fun μ ν => by + simpa only [sub_toSU2Matrix, add_toSU2Matrix, deriv_toSU2Matrix, bracket_toSU2Matrix, + zero_toSU2Matrix] using congrArg toSU2Matrix (hω μ ν)) + obtain ⟨F₁, hF₁0, hF₁u, hF₁⟩ := hmain (Fin 1) + (fun μ => Matrix.of fun _ _ => (ω μ).toU1Value) + (fun μ => Matrix.ext fun _ _ => (ω μ).2.2.2) + (fun μ ν => by + have h := congrArg toU1Value (hω μ ν) + simp only [sub_toU1Value, add_toU1Value, deriv_toU1Value, bracket_toU1Value, + zero_toU1Value, add_zero] at h + ext i j + simp [Matrix.mul_apply, mul_comm, h]) + have hd₃ : F₃.det = 1 := hdet (Fin 3) (fun μ => (ω μ).toSU3Matrix) F₃ hjac3 + (fun μ => show ((ω μ).toSU3Matrix).trace = 0 from (ω μ).1.2.2) hF₃0 hF₃ + have hd₂ : F₂.det = 1 := hdet (Fin 2) (fun μ => (ω μ).toSU2Matrix) F₂ hjac2 + (fun μ => show ((ω μ).toSU2Matrix).trace = 0 from (ω μ).2.1.2.2) hF₂0 hF₂ + -- extract the `U(1)` scalar + have hu1 : F₁ 0 0 * star (F₁ 0 0) = 1 := by + simpa [Matrix.mul_apply] using congrArg (fun M => M (0 : Fin 1) (0 : Fin 1)) hF₁u + have hu0 : constantCoeff (F₁ 0 0) = 1 := by + simpa using congrArg (fun M => M (0 : Fin 1) (0 : Fin 1)) hF₁0 + -- assemble the jet gauge transformation + refine ⟨⟨⟨F₃, Matrix.mem_specialUnitaryGroup_iff.mpr + ⟨Matrix.mem_unitaryGroup_iff.mpr hF₃u, hd₃⟩⟩, + ⟨F₂, Matrix.mem_specialUnitaryGroup_iff.mpr + ⟨Matrix.mem_unitaryGroup_iff.mpr hF₂u, hd₂⟩⟩, + ⟨F₁ 0 0, Unitary.mem_iff.mpr ⟨by rw [mul_comm]; exact hu1, hu1⟩⟩⟩, + Prod.ext (Subtype.ext hF₃0) (Prod.ext (Subtype.ext hF₂0) (Subtype.ext hu0)), + fun μ => Prod.ext (hF₃ μ) (Prod.ext (hF₂ μ) ?_)⟩ + show pderiv ℂ μ (F₁ 0 0) = (-Complex.I) • (ω μ).toU1Value * F₁ 0 0 + simpa [Matrix.mul_apply] using congrArg (fun M => M (0 : Fin 1) (0 : Fin 1)) (hF₁ μ) + +/-! + ## The symmeterized Maurer–Cartan form -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean index 67b088582..1902bc7b9 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -57,6 +57,13 @@ lemma maurerCartanForm_injOn_truncationKer_zero {U V : JetGaugeGroupI} rw [hc1, map_one] at hc exact (inv_mul_eq_one.mp hc).symm +lemma exists_maurerCartanForm_eq_of_structure + (ω : (Fin 1 ⊕ Fin 3) → JetGaugeAlgebra) + (hω : ∀ μ ν, deriv μ (ω ν) - deriv ν (ω μ) + ⁅ω μ, ω ν⁆ = 0) : + ∃ U ∈ JetGaugeGroupI.truncationKer 0, maurerCartanForm U = ω := by + sorry + + /-! ## Freeness: injectivity of the symmetrized Maurer–Cartan data @@ -101,4 +108,7 @@ lemma symmetrizedMaurerCartanCoeff_injective : Function.Injective symmetrizedMau exact ext_of_eval_iteratedDeriv fun s => hall s.card s μ rfl exact Subtype.ext (maurerCartanForm_injOn_truncationKer_zero U.2 V.2 hmc) +lemma symmetrizedMaurerCartanCoeff_surjective : Function.Surjective symmetrizedMaurerCartanCoeff := by + sorry + end StandardModel diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index 73b00d400..90eda1387 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -284,6 +284,166 @@ lemma truncation_zero_eq_iff {f g : JetRing} : simpa using h · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm)] +/-! + +### Parallel transport + +The formal Frobenius theorem for the jet ring: a flat family of matrices `A_μ` is +the logarithmic derivative `(∂_μ F) F⁻¹` of a formal fundamental solution `F`, +unique once its value at the base point is fixed. Uniqueness is the vanishing +principle for first-order linear systems; existence is the Euler (radial) +recursion, with flatness entering to make the radial solution solve every +direction. + +-/ + +/-- The vanishing principle for first-order linear systems of jets: a matrix of + jets vanishing at the base point and satisfying a linear first-order system + `∂_μ F = A_μ F + F B_μ` vanishes identically. Each Taylor coefficient of `F` is + determined by the coefficients of strictly smaller degree through the system, + so all vanish by strong induction on the degree. + + This is the uniqueness half of the formal Frobenius theorem + (`JetRing.exists_parallelTransport`); the two-sided form with independent + left and right coefficients also yields unitarity of parallel transport along + an anti-hermitian connection, applied to `F Fᴴ − 1`. -/ +lemma matrix_eq_zero_of_pderiv_eq_mul_add_mul {κ : Type} [Fintype κ] [DecidableEq κ] + {F : Matrix κ κ JetRing} (A B : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing) + (h0 : (constantCoeff : JetRing →+* ℂ).mapMatrix F = 0) + (hF : ∀ μ, F.map (pderiv ℂ μ) = A μ * F + F * B μ) : + F = 0 := by + sorry + +/-- A flat gauge field is pure gauge, at the level of jets: if `A_μ` has vanishing + field strength, `∂_μ A_ν − ∂_ν A_μ − [A_μ, A_ν] = 0`, then `A_μ = (∂_μ F) F⁻¹` + for a Wilson line `F` based at the identity: `∂_μ F = A_μ F` with `F(0) = 1`. + Here a Wilson line means the parallel transport of `A` from the base point — + the path-ordered exponential `P exp(∫ A_μ dx^μ)`, path-independent since `A` is + flat. `F` is built order-by-order in its Taylor expansion; it is unique by + `JetRing.matrix_eq_zero_of_pderiv_eq_mul_add_mul`. -/ +lemma exists_parallelTransport {κ : Type} [Fintype κ] [DecidableEq κ] + (A : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing) + (hA : ∀ μ ν, (A ν).map (pderiv ℂ μ) - (A μ).map (pderiv ℂ ν) = + A μ * A ν - A ν * A μ) : + ∃ F : Matrix κ κ JetRing, (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 ∧ + ∀ μ, F.map (pderiv ℂ μ) = A μ * F := by + open Finsupp Finset in + set B : Matrix κ κ JetRing := ∑ ρ, (X ρ : JetRing) • A ρ with hB + have hBlow : ∀ (M N : Matrix κ κ JetRing) p, (∀ i j q, degree q < degree p → + coeff q (M i j) = coeff q (N i j)) → + ∀ i j, coeff p ((B * M) i j) = coeff p ((B * N) i j) := fun M N p h i j => by + simp only [Matrix.mul_apply, map_sum, coeff_mul] + refine Finset.sum_congr rfl fun k _ => Finset.sum_congr rfl fun q hq => ?_ + rcases eq_or_ne q.1 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, show constantCoeff (B i k) = 0 from by + simp [hB, Matrix.sum_apply, Matrix.smul_apply, smul_eq_mul, constantCoeff_X], + zero_mul, zero_mul] + · have h4 : degree q.1 + degree q.2 = degree p := by rw [← map_add, mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((degree_eq_zero_iff _).mp hc) + rw [h _ _ _ (by omega)] + set T : Matrix κ κ JetRing → Matrix κ κ JetRing := fun M => 1 + (B * M).map fun f => + show JetRing from fun m => if m = 0 then 0 else ((degree m : ℕ) : ℂ)⁻¹ * f m with hT + set F : Matrix κ κ JetRing := + Matrix.of fun i j => show JetRing from fun m => (T^[degree m + 1] 1) i j m with hFd + have hFco : ∀ p i j, coeff p (F i j) = coeff p ((T^[degree p + 1] 1) i j) := fun _ _ _ => rfl + have hTco : ∀ (M : Matrix κ κ JetRing) i j p, + coeff p ((T M) i j) = coeff p ((1 : Matrix κ κ JetRing) i j) + + if p = 0 then 0 else ((degree p : ℕ) : ℂ)⁻¹ * coeff p ((B * M) i j) := + fun M i j p => by simp only [hT]; rw [Matrix.add_apply, map_add, Matrix.map_apply]; rfl + have hmain : ∀ n p, degree p = n → ∀ k, n < k → ∀ i j, + coeff p ((T^[k] 1) i j) = coeff p ((T F) i j) := fun n => by + induction n using Nat.strong_induction_on with + | _ n ih => + intro p hp k hk i j; obtain ⟨k, rfl⟩ : ∃ k', k = k' + 1 := ⟨k - 1, by omega⟩ + rw [Function.iterate_succ_apply', hTco, hTco]; rcases eq_or_ne p 0 with h0 | h0 + · rw [if_pos h0, if_pos h0] + · rw [if_neg h0, if_neg h0, hBlow _ F _ (fun i' j' q hq => ?_) i j] + rw [hFco, ih (degree q) (hp ▸ hq) q rfl k (by omega) i' j', + ih (degree q) (hp ▸ hq) q rfl (degree q + 1) (by omega) i' j'] + have hkey := fun p (i j : κ) => (hFco p i j).trans (hmain _ p rfl _ (Nat.lt_succ_self _) i j) + have hFone : (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 := by + ext i j; simpa [hTco, Matrix.one_apply, apply_ite, coeff_one] using hkey 0 i j + have hEco : ∀ (M : Matrix κ κ JetRing) p i j, + coeff p ((∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = + ((degree p : ℕ) : ℂ) * coeff p (M i j) := fun M p i j => by + have ht : ∀ ρ, coeff p (((X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = + (p ρ : ℂ) * coeff p (M i j) := fun ρ => by + rw [Matrix.smul_apply, Matrix.map_apply, smul_eq_mul, + show (X ρ : JetRing) = monomial (single ρ 1) 1 from rfl, coeff_monomial_mul] + by_cases h : single ρ 1 ≤ p + · have hρ : 1 ≤ p ρ := by simpa using single_le_iff.mp h + rw [if_pos h, one_mul, coeff_pderiv, tsub_add_cancel_of_le h, tsub_apply, + single_eq_same, Nat.cast_sub hρ]; push_cast; ring + · have hρ : p ρ = 0 := by by_contra hc; exact h (single_le_iff.mpr (by omega)) + rw [if_neg h, hρ]; simp + rw [Matrix.sum_apply, map_sum, Finset.sum_congr rfl fun ρ _ => ht ρ, ← Finset.sum_mul, + ← Nat.cast_sum, ← degree_eq_sum] + have hleib : ∀ ρ (M N : Matrix κ κ JetRing), (M * N).map (pderiv ℂ ρ) = + M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := fun ρ M N => by + ext i j : 1; simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans sum_add_distrib + set G := fun ν : Fin 1 ⊕ Fin 3 => F.map (pderiv ℂ ν) - A ν * F with hG + have hstar : ∀ μ ν, (G ν).map (pderiv ℂ μ) = + (G μ).map (pderiv ℂ ν) + (A μ * G ν - A ν * G μ) := fun μ ν => by + have hcm : ∀ (M : Matrix κ κ JetRing), (M.map (pderiv ℂ ν)).map (pderiv ℂ μ) = + (M.map (pderiv ℂ μ)).map (pderiv ℂ ν) := + fun M => Matrix.ext fun _ _ => pderiv_comm _ _ _ + simp only [hG] + rw [Matrix.map_sub _ (fun a b => map_sub _ a b), Matrix.map_sub _ (fun a b => map_sub _ a b), + hcm, hleib μ (A ν) F, hleib ν (A μ) F, sub_eq_iff_eq_add.mp (hA μ ν)] + noncomm_ring + have hG0 : (∑ ρ, (X ρ : JetRing) • G ρ) = 0 := by + have h1 : (∑ ρ, (X ρ : JetRing) • G ρ) = + (∑ ρ, (X ρ : JetRing) • F.map (pderiv ℂ ρ)) - B * F := by + rw [hB, Finset.sum_mul, ← sum_sub_distrib] + exact Finset.sum_congr rfl fun ρ _ => by rw [hG]; rw [smul_sub, Matrix.smul_mul] + rw [h1, sub_eq_zero]; ext i j : 1; ext p; rw [hEco] + rcases eq_or_ne p 0 with rfl | h0 + · have h := hBlow F 0 0 (fun _ _ q hq => absurd hq (by simp)) i j + simp only [mul_zero, Matrix.zero_apply, map_zero] at h; simp [h] + · rw [hkey p i j, hTco, show coeff p ((1 : Matrix κ κ JetRing) i j) = 0 from by + simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, if_neg h0, ← mul_assoc, + mul_inv_cancel₀ (Nat.cast_ne_zero.mpr fun hc => h0 ((degree_eq_zero_iff p).mp hc)), + one_mul] + have hS2 : ∀ ν, (∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν)) = - G ν := by + intro ν + have hmap : ((∑ ρ, (X ρ : JetRing) • G ρ).map (pderiv ℂ ν)) = + G ν + ∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν) := by + ext i j : 1; simp only [Matrix.map_apply, Matrix.sum_apply, Matrix.smul_apply, + smul_eq_mul, map_sum, Derivation.leibniz, Matrix.add_apply] + rw [sum_add_distrib, sum_eq_single_of_mem (f := fun ρ => G ρ i j * pderiv ℂ ν (X ρ)) + ν (mem_univ ν) fun b _ hb => by rw [pderiv_X_of_ne hb, mul_zero]] + rw [pderiv_X_self, mul_one]; exact add_comm _ _ + rw [hG0, Matrix.map_zero _ (map_zero _)] at hmap + exact eq_neg_of_add_eq_zero_right hmap.symm + have halg : ∀ ν p i j, + (((degree p : ℕ) : ℂ) + 1) * coeff p (G ν i j) = coeff p ((B * G ν) i j) := by + intro ν p i j; have hs1 : (∑ ρ, (X ρ : JetRing) • (G ν).map (pderiv ℂ ρ)) = + (∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν)) + + (B * G ν - A ν * ∑ ρ, (X ρ : JetRing) • G ρ) := by + rw [Finset.sum_congr rfl fun ρ _ => congrArg ((X ρ : JetRing) • ·) (hstar ρ ν)] + simp only [smul_add, smul_sub, sum_add_distrib, sum_sub_distrib] + congr 1; congr 1 + · rw [hB, Finset.sum_mul]; exact Finset.sum_congr rfl fun _ _ => (Matrix.smul_mul _ _ _).symm + · rw [Finset.mul_sum]; exact Finset.sum_congr rfl fun _ _ => (Matrix.mul_smul _ _ _).symm + rw [hG0, mul_zero, sub_zero, hS2] at hs1 + have h := congrArg (fun M => coeff p (M i j)) hs1 + simp only [Matrix.add_apply, Matrix.neg_apply, map_add, map_neg] at h + rw [hEco] at h; linear_combination h + have hzero : ∀ ν, G ν = 0 := fun ν => by + have hm : ∀ n q, degree q = n → ∀ i j, coeff q (G ν i j) = 0 := fun n => by + induction n using Nat.strong_induction_on with + | _ n ih => + intro q hq i j; have h := halg ν q i j + rw [hBlow (G ν) 0 q (fun i' j' r hr => by + rw [ih (degree r) (hq ▸ hr) r rfl i' j', Matrix.zero_apply, map_zero]) i j, + mul_zero] at h + simp only [Matrix.zero_apply, map_zero] at h + exact (mul_eq_zero.mp h).resolve_left (by exact_mod_cast Nat.succ_ne_zero (degree q)) + ext i j : 1; ext p; rw [hm (degree p) p rfl i j, Matrix.zero_apply, map_zero] + exact ⟨F, hFone, fun ν => sub_eq_zero.mp (hzero ν)⟩ + end JetRing /-! From 3fe9c2ec2a4715daf650bee00c59ba313dc1c4b6 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 18 Aug 2026 15:13:18 +0100 Subject: [PATCH 165/254] feat: Add surjectivty proof --- .../GaugeGroup/MaurerCartan/Truncation.lean | 784 +++++++++++++++++- 1 file changed, 781 insertions(+), 3 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean index 1902bc7b9..b4fef149f 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -61,7 +61,31 @@ lemma exists_maurerCartanForm_eq_of_structure (ω : (Fin 1 ⊕ Fin 3) → JetGaugeAlgebra) (hω : ∀ μ ν, deriv μ (ω ν) - deriv ν (ω μ) + ⁅ω μ, ω ν⁆ = 0) : ∃ U ∈ JetGaugeGroupI.truncationKer 0, maurerCartanForm U = ω := by - sorry + obtain ⟨U, hU0, hU⟩ := exists_deriv_eq_of_maurerCartanForm_structure ω hω + refine ⟨U, JetGaugeGroupI.mem_truncationKer_zero_iff.mpr hU0, funext fun μ => ?_⟩ + have hu3 : U.1.1 * star U.1.1 = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hu2 : U.2.1.1 * star U.2.1.1 = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff] at h + have hu1 : U.2.2.1 * star U.2.2.1 = 1 := (Unitary.mem_iff.mp U.2.2.2).2 + refine ext_of_matrix ?_ ?_ ?_ + · rw [maurerCartanForm_toSU3Matrix, + show U.1.1.map (pderiv ℂ μ) = (-Complex.I) • (ω μ).toSU3Matrix * U.1.1 from + congrArg (fun p => p.1) (hU μ), + smul_mul_assoc, smul_mul_assoc, mul_assoc, hu3, mul_one, smul_smul] + simp + · rw [maurerCartanForm_toSU2Matrix, + show U.2.1.1.map (pderiv ℂ μ) = (-Complex.I) • (ω μ).toSU2Matrix * U.2.1.1 from + congrArg (fun p => p.2.1) (hU μ), + smul_mul_assoc, smul_mul_assoc, mul_assoc, hu2, mul_one, smul_smul] + simp + · rw [maurerCartanForm_toU1Value, + show pderiv ℂ μ U.2.2.1 = (-Complex.I) • (ω μ).toU1Value * U.2.2.1 from + congrArg (fun p => p.2.2) (hU μ), + smul_mul_assoc, smul_mul_assoc, mul_assoc, hu1, mul_one, smul_smul] + simp /-! @@ -108,7 +132,761 @@ lemma symmetrizedMaurerCartanCoeff_injective : Function.Injective symmetrizedMau exact ext_of_eval_iteratedDeriv fun s => hall s.card s μ rfl exact Subtype.ext (maurerCartanForm_injOn_truncationKer_zero U.2 V.2 hmc) -lemma symmetrizedMaurerCartanCoeff_surjective : Function.Surjective symmetrizedMaurerCartanCoeff := by - sorry +TODO "The below code needs cleaning up and moving to the correct place." +/-! + +## The Euler operator toolkit + +-/ + +/-- The formal coordinates of the jet ring are self-adjoint. -/ +lemma jetRing_star_X (ρ : Fin 1 ⊕ Fin 3) : star (X ρ : JetRing) = X ρ := by + ext m + rw [JetRing.coeff_star, show (X ρ : JetRing) = monomial (Finsupp.single ρ 1) 1 from rfl, + coeff_monomial] + split_ifs <;> simp + +/-- The Taylor coefficients of a jet multiplied by a formal coordinate: the + coefficient shifts down by one in that direction. -/ +lemma coeff_X_smul (ρ : Fin 1 ⊕ Fin 3) (f : JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + coeff p ((X ρ : JetRing) • f) = + if Finsupp.single ρ 1 ≤ p then coeff (p - Finsupp.single ρ 1) f else 0 := by + rw [smul_eq_mul, show (X ρ : JetRing) = monomial (Finsupp.single ρ 1) 1 from rfl, + coeff_monomial_mul] + split_ifs <;> simp + +/-- The Euler (radial) operator acts on Taylor coefficients as multiplication by the + total degree. -/ +lemma coeff_sum_X_smul_pderiv (f : JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + coeff p (∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f) = + ((Finsupp.degree p : ℕ) : ℂ) * coeff p f := by + classical + rw [map_sum] + have ht : ∀ ρ, coeff p ((X ρ : JetRing) • pderiv ℂ ρ f) = (p ρ : ℂ) * coeff p f := by + intro ρ + rw [coeff_X_smul] + by_cases h : Finsupp.single ρ 1 ≤ p + · have hρ : 1 ≤ p ρ := by simpa using Finsupp.single_le_iff.mp h + rw [if_pos h, coeff_pderiv, tsub_add_cancel_of_le h, Finsupp.coe_tsub, Pi.sub_apply, + Finsupp.single_eq_same, Nat.cast_sub hρ] + push_cast + ring + · have hρ : p ρ = 0 := by + by_contra hc + exact h (Finsupp.single_le_iff.mpr (by omega)) + rw [if_neg h, hρ] + simp + rw [Finset.sum_congr rfl fun ρ _ => ht ρ, ← Finset.sum_mul, ← Nat.cast_sum, + ← Finsupp.degree_eq_sum] + +/-- The Euler operator on matrices of jets acts entrywise on Taylor coefficients as + multiplication by the total degree. -/ +lemma coeff_sum_X_smul_map_pderiv {κ : Type} [Fintype κ] [DecidableEq κ] + (M : Matrix κ κ JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) (i j : κ) : + coeff p ((∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = + ((Finsupp.degree p : ℕ) : ℂ) * coeff p (M i j) := by + rw [show (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j + = ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (M i j) from by + rw [Matrix.sum_apply] + exact Finset.sum_congr rfl fun ρ _ => rfl] + exact coeff_sum_X_smul_pderiv (M i j) p + +/-- The vanishing principle for the Euler operator: a matrix of jets vanishing at the + base point and satisfying `E W = A W + W B` with `A`, `B` vanishing at the base point + is zero. Each Taylor coefficient of `W` is a multiple of coefficients of strictly + smaller degree, so all vanish by strong induction on the degree. -/ +lemma matrix_eq_zero_of_euler_eq_mul_add_mul {κ : Type} [Fintype κ] [DecidableEq κ] + {W : Matrix κ κ JetRing} (A B : Matrix κ κ JetRing) + (hA : ∀ i j, constantCoeff (A i j) = 0) (hB : ∀ i j, constantCoeff (B i j) = 0) + (h0 : ∀ i j, constantCoeff (W i j) = 0) + (hW : ∑ ρ, (X ρ : JetRing) • W.map (pderiv ℂ ρ) = A * W + W * B) : + W = 0 := by + classical + have hlow : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, + (∀ (i : κ) (j : κ) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), + Finsupp.degree q < Finsupp.degree p → coeff q (W i j) = 0) → + ∀ i j, coeff p ((A * W + W * B) i j) = 0 := by + intro p hp i j + have hAW : coeff p ((A * W) i j) = 0 := by + rw [Matrix.mul_apply, map_sum] + refine Finset.sum_eq_zero fun k _ => ?_ + rw [coeff_mul] + refine Finset.sum_eq_zero fun q hq => ?_ + rcases eq_or_ne q.1 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, hA, zero_mul] + · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by + rw [← map_add, Finset.mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) + rw [hp _ _ q.2 (by omega), mul_zero] + have hWB : coeff p ((W * B) i j) = 0 := by + rw [Matrix.mul_apply, map_sum] + refine Finset.sum_eq_zero fun k _ => ?_ + rw [coeff_mul] + refine Finset.sum_eq_zero fun q hq => ?_ + rcases eq_or_ne q.2 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, hB, mul_zero] + · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by + rw [← map_add, Finset.mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) + rw [hp _ _ q.1 (by omega), zero_mul] + rw [Matrix.add_apply, map_add, hAW, hWB, add_zero] + have hm : ∀ (n : ℕ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree p = n → + ∀ i j, coeff p (W i j) = 0 := by + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro p hp i j + rcases Nat.eq_zero_or_pos n with hn | hn + · have hp0 : p = 0 := (Finsupp.degree_eq_zero_iff _).mp (by omega) + rw [hp0, coeff_zero_eq_constantCoeff] + exact h0 i j + · have h : coeff p ((∑ ρ, (X ρ : JetRing) • W.map (pderiv ℂ ρ)) i j) = + coeff p ((A * W + W * B) i j) := congrArg (fun M => coeff p (M i j)) hW + rw [coeff_sum_X_smul_map_pderiv, + hlow p (fun i' j' q hq => ih (Finsupp.degree q) (by omega) q rfl i' j') i j] at h + have hne : ((Finsupp.degree p : ℕ) : ℂ) ≠ 0 := by + rw [hp] + exact_mod_cast hn.ne' + exact (mul_eq_zero.mp h).resolve_left hne + ext i j : 1 + ext p + rw [hm (Finsupp.degree p) p rfl i j] + simp + +/-- The Euler (radial) transport of a jet matrix `R` vanishing at the base point: + a fundamental solution of the radial system `E U = R U` based at the identity, + built order-by-order by the Euler recursion. -/ +lemma exists_matrix_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] + (R : Matrix κ κ JetRing) (hR0 : ∀ i j, constantCoeff (R i j) = 0) : + ∃ U : Matrix κ κ JetRing, (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1 ∧ + ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U := by + classical + have hRlow : ∀ (M N : Matrix κ κ JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), + (∀ (i : κ) (j : κ) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), + Finsupp.degree q < Finsupp.degree p → coeff q (M i j) = coeff q (N i j)) → + ∀ i j, coeff p ((R * M) i j) = coeff p ((R * N) i j) := fun M N p h i j => by + simp only [Matrix.mul_apply, map_sum, coeff_mul] + refine Finset.sum_congr rfl fun k _ => Finset.sum_congr rfl fun q hq => ?_ + rcases eq_or_ne q.1 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, hR0, zero_mul, zero_mul] + · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by + rw [← map_add, Finset.mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) + rw [h _ _ _ (by omega)] + set T : Matrix κ κ JetRing → Matrix κ κ JetRing := fun M => 1 + (R * M).map fun f => + show JetRing from fun m => if m = 0 then 0 else ((Finsupp.degree m : ℕ) : ℂ)⁻¹ * f m + with hT + set U : Matrix κ κ JetRing := + Matrix.of fun i j => show JetRing from fun m => (T^[Finsupp.degree m + 1] 1) i j m with hUd + have hUco : ∀ (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) i j, + coeff p (U i j) = coeff p ((T^[Finsupp.degree p + 1] 1) i j) := fun _ _ _ => rfl + have hTco : ∀ (M : Matrix κ κ JetRing) i j (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), + coeff p ((T M) i j) = coeff p ((1 : Matrix κ κ JetRing) i j) + + if p = 0 then 0 else ((Finsupp.degree p : ℕ) : ℂ)⁻¹ * coeff p ((R * M) i j) := + fun M i j p => by + simp only [hT] + rw [Matrix.add_apply, map_add, Matrix.map_apply] + rfl + have hmain : ∀ (n : ℕ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree p = n → ∀ k, n < k → + ∀ i j, coeff p ((T^[k] 1) i j) = coeff p ((T U) i j) := fun n => by + induction n using Nat.strong_induction_on with + | _ n ih => + intro p hp k hk i j + obtain ⟨k, rfl⟩ : ∃ k', k = k' + 1 := ⟨k - 1, by omega⟩ + rw [Function.iterate_succ_apply', hTco, hTco] + rcases eq_or_ne p 0 with h0 | h0 + · rw [if_pos h0, if_pos h0] + · rw [if_neg h0, if_neg h0, hRlow _ U _ (fun i' j' q hq => ?_) i j] + rw [hUco, ih (Finsupp.degree q) (by omega) q rfl k (by omega) i' j', + ih (Finsupp.degree q) (by omega) q rfl (Finsupp.degree q + 1) (by omega) i' j'] + have hkey := fun (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) (i j : κ) => + (hUco p i j).trans (hmain _ p rfl _ (Nat.lt_succ_self _) i j) + have hUone : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1 := by + ext i j + simpa [hTco, Matrix.one_apply, apply_ite, coeff_one] using hkey 0 i j + refine ⟨U, hUone, ?_⟩ + ext i j : 1 + ext p + rw [coeff_sum_X_smul_map_pderiv] + rcases eq_or_ne p 0 with rfl | h0 + · rw [show ((Finsupp.degree (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) : ℕ) : ℂ) = 0 by simp, zero_mul] + rw [Matrix.mul_apply, map_sum] + exact (Finset.sum_eq_zero fun k _ => by + rw [coeff_zero_eq_constantCoeff, map_mul, hR0, zero_mul]).symm + · rw [hkey p i j, hTco, show coeff p ((1 : Matrix κ κ JetRing) i j) = 0 from by + simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, if_neg h0, ← mul_assoc, + mul_inv_cancel₀ (Nat.cast_ne_zero.mpr fun hc => h0 ((Finsupp.degree_eq_zero_iff p).mp hc)), + one_mul] + +/-! + +## Unitarity and determinant of the Euler transport + +-/ + +/-- The entrywise Leibniz rule for matrix products of jets. -/ +lemma matrix_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] (ρ : Fin 1 ⊕ Fin 3) + (M N : Matrix κ κ JetRing) : + (M * N).map (pderiv ℂ ρ) = M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + +/-- The Euler operator on matrices of jets is a derivation. -/ +lemma sum_X_smul_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] + (M N : Matrix κ κ JetRing) : + ∑ ρ, (X ρ : JetRing) • (M * N).map (pderiv ℂ ρ) = + (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) * N + + M * ∑ ρ, (X ρ : JetRing) • N.map (pderiv ℂ ρ) := by + rw [Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun ρ _ => ?_ + rw [matrix_map_pderiv_mul, smul_add, Matrix.smul_mul, Matrix.mul_smul] + +/-- The Euler operator commutes with the conjugate transpose. -/ +lemma sum_X_smul_map_pderiv_star {κ : Type} [Fintype κ] [DecidableEq κ] + (M : Matrix κ κ JetRing) : + ∑ ρ, (X ρ : JetRing) • (star M).map (pderiv ℂ ρ) = + star (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) := by + ext i j : 1 + simp only [Matrix.sum_apply, Matrix.star_apply, Matrix.smul_apply, Matrix.map_apply, + smul_eq_mul, star_sum, star_mul', jetRing_star_X, ← JetRing.pderiv_star] + +/-- The Euler operator kills the identity matrix. -/ +lemma sum_X_smul_map_pderiv_one {κ : Type} [Fintype κ] [DecidableEq κ] : + ∑ ρ, (X ρ : JetRing) • (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) = 0 := by + refine Finset.sum_eq_zero fun ρ _ => ?_ + rw [show (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) = 0 from Matrix.ext fun i j => by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ρ)], smul_zero] + +/-- A fundamental solution of the radial system `E U = R U` based at the identity is + unitary when `R` is anti-hermitian: `U U† − 1` vanishes at the base point and + satisfies a homogeneous linear radial system, so it vanishes identically. -/ +lemma eulerTransport_mul_star {κ : Type} [Fintype κ] [DecidableEq κ] + {R U : Matrix κ κ JetRing} (hRstar : star R = -R) + (hR0 : ∀ i j, constantCoeff (R i j) = 0) + (hU0 : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1) + (hEU : ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U) : + U * star U = 1 := by + have hEstar : ∑ ρ, (X ρ : JetRing) • (star U).map (pderiv ℂ ρ) = -(star U * R) := by + rw [sum_X_smul_map_pderiv_star, hEU, star_mul, hRstar, Matrix.mul_neg] + have hW0 : (constantCoeff : JetRing →+* ℂ).mapMatrix (U * star U - 1) = 0 := by + rw [map_sub, map_mul, JetGaugeGroupI.mapMatrix_constantCoeff_star, hU0, star_one, + mul_one, map_one, sub_self] + have h0 : ∀ i j, constantCoeff ((U * star U - 1) i j) = 0 := fun i j => by + simpa [RingHom.mapMatrix_apply, Matrix.map_apply] using congrArg (fun M => M i j) hW0 + have hB : ∀ i j, constantCoeff ((-R) i j) = 0 := fun i j => by + simp [hR0 i j] + have hEW : ∑ ρ, (X ρ : JetRing) • (U * star U - 1).map (pderiv ℂ ρ) = + R * (U * star U - 1) + (U * star U - 1) * (-R) := by + have hsub : ∀ ρ : Fin 1 ⊕ Fin 3, (U * star U - 1).map (pderiv ℂ ρ) = + (U * star U).map (pderiv ℂ ρ) - (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) := + fun ρ => Matrix.ext fun i j => by simp [Matrix.map_apply] + simp only [hsub, smul_sub, Finset.sum_sub_distrib] + rw [sum_X_smul_map_pderiv_mul, hEU, hEstar, sum_X_smul_map_pderiv_one, sub_zero] + noncomm_ring + exact sub_eq_zero.mp (matrix_eq_zero_of_euler_eq_mul_add_mul R (-R) hR0 hB h0 hEW) + +/-- The scalar vanishing principle for the Euler operator: a jet vanishing at the base + point that is killed by the Euler operator is zero. -/ +lemma eq_zero_of_sum_X_smul_pderiv_eq_zero {f : JetRing} (h0 : constantCoeff f = 0) + (hf : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f = 0) : f = 0 := by + ext p + rcases eq_or_ne p 0 with rfl | hp + · simpa [coeff_zero_eq_constantCoeff] using h0 + · have h := congrArg (coeff p) hf + rw [coeff_sum_X_smul_pderiv, map_zero] at h + have hne : ((Finsupp.degree p : ℕ) : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr fun hc => hp ((Finsupp.degree_eq_zero_iff p).mp hc) + simpa using (mul_eq_zero.mp h).resolve_left hne + +/-- A fundamental solution of the radial system `E U = R U` based at the identity has + determinant one when `R` is traceless: by Jacobi's formula the determinant is killed + by the Euler operator, so it is the constant `1`. -/ +lemma eulerTransport_det {κ : Type} [Fintype κ] [DecidableEq κ] + {R U : Matrix κ κ JetRing} + (hjac : ∀ (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3), + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace) + (hRtr : R.trace = 0) + (hU0 : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1) + (hEU : ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U) : + U.det = 1 := by + have hEdet : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det = 0 := by + calc ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det + = ∑ ρ, (X ρ : JetRing) • (U.map (pderiv ℂ ρ) * U.adjugate).trace := by + exact Finset.sum_congr rfl fun ρ _ => by rw [hjac] + _ = ((∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ)) * U.adjugate).trace := by + rw [Finset.sum_mul, Matrix.trace_sum] + exact Finset.sum_congr rfl fun ρ _ => by + rw [Matrix.smul_mul, Matrix.trace_smul] + _ = (R * (U.det • (1 : Matrix κ κ JetRing))).trace := by + rw [hEU, Matrix.mul_assoc, Matrix.mul_adjugate] + _ = 0 := by + rw [mul_smul_comm, mul_one, Matrix.trace_smul, hRtr, smul_zero] + have hd0 : constantCoeff (U.det - 1) = 0 := by + rw [map_sub, map_one, RingHom.map_det, hU0, Matrix.det_one, sub_self] + have hEd : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (U.det - 1) = 0 := by + calc ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (U.det - 1) + = ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det := by + exact Finset.sum_congr rfl fun ρ _ => by rw [map_sub, pderiv_one, sub_zero] + _ = 0 := hEdet + exact sub_eq_zero.mp (eq_zero_of_sum_X_smul_pderiv_eq_zero hd0 hEd) + +/-! + +## Multiset derivative bookkeeping + +-/ + +/-- Iterated formal derivatives over a multiset commute with a single derivative. -/ +lemma foldl_pderiv_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (f : JetRing) : + s.foldl (fun f ρ => pderiv ℂ ρ f) (pderiv ℂ μ f) = + pderiv ℂ μ (s.foldl (fun f ρ => pderiv ℂ ρ f) f) := by + induction s using Multiset.induction_on generalizing f with + | empty => simp + | cons a t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, JetRing.pderiv_comm, ih] + +/-- The base-point value of an iterated formal derivative is the corresponding Taylor + coefficient with the factorial normalization. -/ +lemma constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + constantCoeff (s.foldl (fun f ρ => pderiv ℂ ρ f) f) = + ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) * coeff s.toFinsupp f := by + induction s using Multiset.induction_on generalizing f with + | empty => simp [coeff_zero_eq_constantCoeff] + | cons a t ih => + rw [Multiset.foldl_cons, ih, coeff_pderiv] + have hfin : (a ::ₘ t).toFinsupp = t.toFinsupp + Finsupp.single a 1 := by + rw [show (a ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = {a} + t from + (Multiset.singleton_add a t).symm, map_add, Multiset.toFinsupp_singleton, add_comm] + have hfac : (∏ ν, Nat.factorial ((a ::ₘ t).count ν) : ℕ) = + (t.count a + 1) * ∏ ν, Nat.factorial (t.count ν) := by + rw [show (∏ ν, Nat.factorial ((a ::ₘ t).count ν) : ℕ) = + ∏ ν, ((if ν = a then t.count a + 1 else 1) * Nat.factorial (t.count ν)) from + Finset.prod_congr rfl fun ν _ => by + rcases eq_or_ne ν a with rfl | h + · rw [Multiset.count_cons_self, Nat.factorial_succ, if_pos rfl] + · rw [Multiset.count_cons_of_ne h, if_neg h, one_mul], + Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ a] + simp + rw [hfin, hfac, Multiset.toFinsupp_apply] + push_cast + ring + +/-- The key combinatorial identity behind the symmetrized Maurer–Cartan data: the sum + over a multiset `r` of base-point values of iterated derivatives of `g` in the + complementary directions is, up to factorials, the Taylor coefficient at `r` of the + radial contraction `∑ μ x_μ g_μ`. -/ +lemma sum_constantCoeff_foldl_erase (g : (Fin 1 ⊕ Fin 3) → JetRing) + (r : Multiset (Fin 1 ⊕ Fin 3)) : + (r.map fun μ => constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) (g μ))).sum = + ((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * + coeff r.toFinsupp (∑ μ, (X μ : JetRing) • g μ) := by + classical + rw [Finset.sum_multiset_map_count, + Finset.sum_subset (Finset.subset_univ r.toFinset) (fun x _ hx => by + rw [Multiset.count_eq_zero.mpr fun hmem => hx (Multiset.mem_toFinset.mpr hmem), + zero_smul]), + map_sum, Finset.mul_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [coeff_X_smul, constantCoeff_foldl_pderiv] + by_cases hμ : μ ∈ r + · rw [if_pos (Finsupp.single_le_iff.mpr (by + rw [Multiset.toFinsupp_apply] + exact Multiset.one_le_count_iff_mem.mpr hμ))] + have herase : (r.erase μ).toFinsupp = r.toFinsupp - Finsupp.single μ 1 := by + ext ν + rw [Multiset.toFinsupp_apply, Finsupp.coe_tsub, Pi.sub_apply, Multiset.toFinsupp_apply, + Finsupp.single_apply] + rcases eq_or_ne μ ν with rfl | h + · rw [Multiset.count_erase_self, if_pos rfl] + · rw [Multiset.count_erase_of_ne h.symm, if_neg h, Nat.sub_zero] + have hfac : r.count μ * ∏ ν, Nat.factorial ((r.erase μ).count ν) = + ∏ ν, Nat.factorial (r.count ν) := by + rw [← Finset.mul_prod_erase Finset.univ + (fun ν => Nat.factorial ((r.erase μ).count ν)) (Finset.mem_univ μ), + ← Finset.mul_prod_erase Finset.univ + (fun ν => Nat.factorial (r.count ν)) (Finset.mem_univ μ), + Multiset.count_erase_self, + Finset.prod_congr rfl fun ν hν => + congrArg Nat.factorial + (Multiset.count_erase_of_ne (Finset.mem_erase.mp hν).1 r), + ← mul_assoc, Nat.mul_factorial_pred (Multiset.count_pos.mpr hμ).ne'] + rw [herase, nsmul_eq_mul, ← mul_assoc, ← Nat.cast_mul, hfac] + · rw [if_neg fun hle => hμ (Multiset.one_le_count_iff_mem.mp (by + simpa [Multiset.toFinsupp_apply] using Finsupp.single_le_iff.mp hle)), + mul_zero, Multiset.count_eq_zero.mpr hμ, zero_smul] + +/-! + +## Componentwise iterated derivatives on the jet gauge algebra + +-/ + +namespace JetGaugeAlgebra + +lemma iteratedDeriv_toSU3Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (iteratedDeriv s a).toSU3Matrix = + a.toSU3Matrix.map fun f => s.foldl (fun f ρ => pderiv ℂ ρ f) f := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toSU3Matrix, ih] + ext i j : 1 + simp only [Matrix.map_apply, Multiset.foldl_cons] + exact (foldl_pderiv_pderiv t μ _).symm + +lemma iteratedDeriv_toSU2Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (iteratedDeriv s a).toSU2Matrix = + a.toSU2Matrix.map fun f => s.foldl (fun f ρ => pderiv ℂ ρ f) f := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toSU2Matrix, ih] + ext i j : 1 + simp only [Matrix.map_apply, Multiset.foldl_cons] + exact (foldl_pderiv_pderiv t μ _).symm + +lemma iteratedDeriv_toU1Value (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (iteratedDeriv s a).toU1Value = s.foldl (fun f ρ => pderiv ℂ ρ f) a.toU1Value := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toU1Value, ih, + Multiset.foldl_cons, foldl_pderiv_pderiv] + +lemma eval_toSU3Matrix_apply (a : JetGaugeAlgebra) (i j : Fin 3) : + (eval a).toSU3Matrix i j = constantCoeff (a.toSU3Matrix i j) := by + rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toSU3Matrix, Matrix.map_apply, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, + coeff_zero_eq_constantCoeff] + +lemma eval_toSU2Matrix_apply (a : JetGaugeAlgebra) (i j : Fin 2) : + (eval a).toSU2Matrix i j = constantCoeff (a.toSU2Matrix i j) := by + rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toSU2Matrix, Matrix.map_apply, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, + coeff_zero_eq_constantCoeff] + +lemma eval_toU1Value_eq (a : JetGaugeAlgebra) : + (eval a).toU1Value = constantCoeff a.toU1Value := by + rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toU1Value, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, + coeff_zero_eq_constantCoeff] + +end JetGaugeAlgebra + +/-- The `su(3)`-entry of the evaluated symmetrized Maurer–Cartan form, as a sum of + base-point values of iterated derivatives of the Maurer–Cartan form entries. -/ +lemma eval_symmetrizedMaurerCartanForm_toSU3_apply (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) (i j : Fin 3) : + (eval (symmetrizedMaurerCartanForm U r)).toSU3Matrix i j = + (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl + (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toSU3Matrix i j))).sum := by + set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' + (fun a => (eval a).toSU3Matrix i j) + (fun a b => by simp [map_add, GaugeAlgebra.add_toSU3Matrix]) with hΦ + have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = + constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) + ((maurerCartanForm U μ).toSU3Matrix i j)) := by + intro μ hμ + show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toSU3Matrix i j = _ + rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply, + Multiset.sub_singleton] + rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toSU3Matrix, + Matrix.smul_apply] + congr 1 + rw [show (eval ((r.map fun μ => + iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toSU3Matrix i j + = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, + map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) + +/-- The `su(2)`-entry of the evaluated symmetrized Maurer–Cartan form. -/ +lemma eval_symmetrizedMaurerCartanForm_toSU2_apply (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) (i j : Fin 2) : + (eval (symmetrizedMaurerCartanForm U r)).toSU2Matrix i j = + (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl + (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toSU2Matrix i j))).sum := by + set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' + (fun a => (eval a).toSU2Matrix i j) + (fun a b => by simp [map_add, GaugeAlgebra.add_toSU2Matrix]) with hΦ + have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = + constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) + ((maurerCartanForm U μ).toSU2Matrix i j)) := by + intro μ hμ + show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toSU2Matrix i j = _ + rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply, + Multiset.sub_singleton] + rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toSU2Matrix, + Matrix.smul_apply] + congr 1 + rw [show (eval ((r.map fun μ => + iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toSU2Matrix i j + = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, + map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) + +/-- The `u(1)`-value of the evaluated symmetrized Maurer–Cartan form. -/ +lemma eval_symmetrizedMaurerCartanForm_toU1Value (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) : + (eval (symmetrizedMaurerCartanForm U r)).toU1Value = + (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl + (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toU1Value))).sum := by + set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' + (fun a => (eval a).toU1Value) + (fun a b => by simp [map_add, GaugeAlgebra.add_toU1Value]) with hΦ + have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = + constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) + ((maurerCartanForm U μ).toU1Value)) := by + intro μ hμ + show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toU1Value = _ + rw [eval_toU1Value_eq, iteratedDeriv_toU1Value, Multiset.sub_singleton] + rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toU1Value] + congr 1 + rw [show (eval ((r.map fun μ => + iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toU1Value + = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, + map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) + +/-! + +## Jacobi's formula on the matrix factors, and degree bookkeeping + +-/ + +lemma jacobi_fin3 (M : Matrix (Fin 3) (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + rw [Matrix.det_fin_three] + simp only [Matrix.trace_fin_three, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.map_apply, Matrix.adjugate_fin_three, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.head_cons, + Matrix.tail_cons, Matrix.head_fin_const, Matrix.empty_val', Matrix.cons_val_fin_one, + map_sub, map_add, Derivation.leibniz, smul_eq_mul] + ring + +lemma jacobi_fin2 (M : Matrix (Fin 2) (Fin 2) JetRing) (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + rw [Matrix.det_fin_two] + simp only [Matrix.adjugate_fin_two, Matrix.trace_fin_two, Matrix.mul_apply, + Matrix.map_apply, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, + Matrix.empty_val', Matrix.cons_val_fin_one, Fin.sum_univ_two, Matrix.cons_val_one, + map_sub, Derivation.leibniz, smul_eq_mul] + ring + +lemma degree_toFinsupp_eq_card (r : Multiset (Fin 1 ⊕ Fin 3)) : + Finsupp.degree (Multiset.toFinsupp r) = Multiset.card r := by + rw [Finsupp.degree_eq_sum, Finset.sum_congr rfl fun ν _ => Multiset.toFinsupp_apply r ν, + ← Finset.sum_subset (Finset.subset_univ r.toFinset) (fun x _ hx => + Multiset.count_eq_zero.mpr fun hmem => hx (Multiset.mem_toFinset.mpr hmem)), + Multiset.toFinset_sum_count_eq] + +/-! + +## The symmetrized data through the radial Maurer–Cartan component + +-/ + +lemma symmetrizedMaurerCartanCoeff_apply (U : JetGaugeGroupI.truncationKer 0) + (x : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0}) : + symmetrizedMaurerCartanCoeff U x = eval (symmetrizedMaurerCartanForm U.1 x.1) := rfl + +lemma symmetrizedMaurerCartanCoeff_toSU3_eq (U : JetGaugeGroupI.truncationKer 0) + (P : Matrix (Fin 3) (Fin 3) JetRing) + (hrad : ∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toSU3Matrix = P) + (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) (i j : Fin 3) : + (symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toSU3Matrix i j = + (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * + coeff (Multiset.toFinsupp r) (P i j)) := by + have hentry : (∑ μ, (X μ : JetRing) • ((maurerCartanForm U.1 μ).toSU3Matrix i j)) = + P i j := by + have h1 : (∑ μ, (X μ : JetRing) • ((maurerCartanForm U.1 μ).toSU3Matrix i j)) = + (∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toSU3Matrix) i j := by + rw [Matrix.sum_apply] + exact Finset.sum_congr rfl fun μ _ => rfl + rw [h1, hrad] + rw [symmetrizedMaurerCartanCoeff_apply, eval_symmetrizedMaurerCartanForm_toSU3_apply, + sum_constantCoeff_foldl_erase, hentry] + +lemma symmetrizedMaurerCartanCoeff_toSU2_eq (U : JetGaugeGroupI.truncationKer 0) + (P : Matrix (Fin 2) (Fin 2) JetRing) + (hrad : ∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toSU2Matrix = P) + (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) (i j : Fin 2) : + (symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toSU2Matrix i j = + (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * + coeff (Multiset.toFinsupp r) (P i j)) := by + have hentry : (∑ μ, (X μ : JetRing) • ((maurerCartanForm U.1 μ).toSU2Matrix i j)) = + P i j := by + have h1 : (∑ μ, (X μ : JetRing) • ((maurerCartanForm U.1 μ).toSU2Matrix i j)) = + (∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toSU2Matrix) i j := by + rw [Matrix.sum_apply] + exact Finset.sum_congr rfl fun μ _ => rfl + rw [h1, hrad] + rw [symmetrizedMaurerCartanCoeff_apply, eval_symmetrizedMaurerCartanForm_toSU2_apply, + sum_constantCoeff_foldl_erase, hentry] + +lemma symmetrizedMaurerCartanCoeff_toU1_eq (U : JetGaugeGroupI.truncationKer 0) + (p : JetRing) + (hrad : ∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toU1Value = p) + (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) : + (symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toU1Value = + (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * + coeff (Multiset.toFinsupp r) p) := by + rw [symmetrizedMaurerCartanCoeff_apply, eval_symmetrizedMaurerCartanForm_toU1Value, + sum_constantCoeff_foldl_erase, hrad] + +/-! + +## Freeness: surjectivity of the symmetrized Maurer–Cartan data + +-/ + +/-- Freeness, surjectivity half: every prescribed family of symmetrized Maurer–Cartan + data is realized by a pure jet. The radial component `ρ := ∑ μ x_μ ω_μ` of the + Maurer–Cartan form carries exactly the symmetrized data, so it suffices to solve the + radial (Euler) system `E U = −i ρ U`, `U(0) = 1` for a prescribed `ρ`; this is done + factorwise by `exists_matrix_eulerTransport`, with unitarity and determinant one from + the Euler vanishing principle. -/ +lemma symmetrizedMaurerCartanCoeff_surjective : + Function.Surjective symmetrizedMaurerCartanCoeff := by + classical + intro c + -- the factorwise construction: a unitary Euler transport with prescribed radial data + have hcore : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] + (E : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → Matrix κ κ ℂ), + (∀ x, star (E x) = E x) → + ∃ V P : Matrix κ κ JetRing, + (constantCoeff : JetRing →+* ℂ).mapMatrix V = 1 ∧ + V * star V = 1 ∧ + (∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv ℂ μ) * star V)) = P) ∧ + ((∀ x, (E x).trace = 0) → + (∀ (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3), + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace) → V.det = 1) ∧ + (∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) (i j : κ), + coeff (Multiset.toFinsupp r) (P i j) = + (((Multiset.card r : ℕ) : ℂ) / + ((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ)) * E ⟨r, hr⟩ i j) := by + intro κ _ _ E hEstar + set P : Matrix κ κ JetRing := Matrix.of fun i j => + show JetRing from fun m => + if h : Finsupp.toMultiset m = 0 then 0 + else (((Finsupp.degree m : ℕ) : ℂ) / ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)) * + E ⟨Finsupp.toMultiset m, h⟩ i j with hP + have hPcoeff : ∀ (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (i j : κ), coeff m (P i j) = + if h : Finsupp.toMultiset m = 0 then 0 + else (((Finsupp.degree m : ℕ) : ℂ) / ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)) * + E ⟨Finsupp.toMultiset m, h⟩ i j := fun _ _ _ => rfl + have hP0 : ∀ i j, constantCoeff (P i j) = 0 := fun i j => by + rw [← coeff_zero_eq_constantCoeff, hPcoeff, dif_pos (by simp)] + have hPstar : star P = P := by + ext i j : 1 + ext m + rw [Matrix.star_apply, JetRing.coeff_star, hPcoeff, hPcoeff] + split_ifs with h + · simp + · rw [star_mul', show star (E ⟨Finsupp.toMultiset m, h⟩ j i) + = E ⟨Finsupp.toMultiset m, h⟩ i j from by + conv_rhs => rw [← hEstar ⟨Finsupp.toMultiset m, h⟩] + exact (Matrix.star_apply _ _ _).symm, + star_div₀, star_natCast, star_natCast] + have hR0 : ∀ i j, constantCoeff (((-Complex.I) • P) i j) = 0 := fun i j => by + rw [Matrix.smul_apply, ← coeff_zero_eq_constantCoeff, map_smul, + coeff_zero_eq_constantCoeff, hP0, smul_zero] + have hRstar : star ((-Complex.I) • P) = -((-Complex.I) • P) := by + rw [star_smul, hPstar] + simp + obtain ⟨V, hV0, hEV⟩ := exists_matrix_eulerTransport ((-Complex.I) • P) hR0 + have hVu : V * star V = 1 := eulerTransport_mul_star hRstar hR0 hV0 hEV + refine ⟨V, P, hV0, hVu, ?_, ?_, ?_⟩ + · calc ∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv ℂ μ) * star V)) + = Complex.I • ((∑ μ, (X μ : JetRing) • V.map (pderiv ℂ μ)) * star V) := by + rw [Finset.sum_mul, Finset.smul_sum] + exact Finset.sum_congr rfl fun μ _ => by + rw [Matrix.smul_mul, smul_comm Complex.I] + _ = P := by + rw [hEV, Matrix.smul_mul, Matrix.smul_mul, Matrix.mul_assoc, hVu, mul_one, + smul_smul] + simp + · intro hEtr hjac + have hPtr : P.trace = 0 := by + ext m + rw [show coeff m P.trace = ∑ i, coeff m (P i i) from by + rw [show P.trace = ∑ i, P i i from rfl, map_sum], + map_zero, Finset.sum_congr rfl fun i _ => hPcoeff m i i] + by_cases h : Finsupp.toMultiset m = 0 + · simp [h] + · simp only [dif_neg h] + rw [← Finset.mul_sum, + show (∑ i, E ⟨Finsupp.toMultiset m, h⟩ i i) = (E ⟨Finsupp.toMultiset m, h⟩).trace + from rfl, + hEtr, mul_zero] + have hRtr : ((-Complex.I) • P).trace = 0 := by + rw [Matrix.trace_smul, hPtr, smul_zero] + exact eulerTransport_det hjac hRtr hV0 hEV + · intro r hr i j + have hround : Finsupp.toMultiset (Multiset.toFinsupp r) = r := by simp + rw [hPcoeff, dif_neg (show ¬Finsupp.toMultiset (Multiset.toFinsupp r) = 0 from by + rw [hround]; exact hr), + show (∏ ν, Nat.factorial ((Multiset.toFinsupp r) ν)) = ∏ ν, Nat.factorial (r.count ν) + from Finset.prod_congr rfl fun ν _ => by rw [Multiset.toFinsupp_apply], + degree_toFinsupp_eq_card] + exact congrArg (fun x => (((Multiset.card r : ℕ) : ℂ) / + ((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ)) * E x i j) (Subtype.ext hround) + -- apply the construction on each factor + obtain ⟨V₃, P₃, hV₃0, hV₃u, hrad₃, hdet₃, hcoeff₃⟩ := + hcore (Fin 3) (fun x => (c x).toSU3Matrix) + (fun x => show star (c x).toSU3Matrix = (c x).toSU3Matrix from (c x).1.2.1) + obtain ⟨V₂, P₂, hV₂0, hV₂u, hrad₂, hdet₂, hcoeff₂⟩ := + hcore (Fin 2) (fun x => (c x).toSU2Matrix) + (fun x => show star (c x).toSU2Matrix = (c x).toSU2Matrix from (c x).2.1.2.1) + obtain ⟨V₁, P₁, hV₁0, hV₁u, hrad₁, _, hcoeff₁⟩ := + hcore (Fin 1) (fun x => Matrix.of fun _ _ => (c x).toU1Value) + (fun x => Matrix.ext fun _ _ => (c x).2.2.2) + have hd₃ : V₃.det = 1 := hdet₃ + (fun x => show ((c x).toSU3Matrix).trace = 0 from (c x).1.2.2) jacobi_fin3 + have hd₂ : V₂.det = 1 := hdet₂ + (fun x => show ((c x).toSU2Matrix).trace = 0 from (c x).2.1.2.2) jacobi_fin2 + have hu1 : V₁ 0 0 * star (V₁ 0 0) = 1 := by + simpa [Matrix.mul_apply] using congrArg (fun M => M (0 : Fin 1) (0 : Fin 1)) hV₁u + have hu0 : constantCoeff (V₁ 0 0) = 1 := by + simpa using congrArg (fun M => M (0 : Fin 1) (0 : Fin 1)) hV₁0 + -- the scalar radial identity for the `U(1)` factor + have hrad₁' : ∑ μ, (X μ : JetRing) • + (Complex.I • (pderiv ℂ μ (V₁ 0 0) * star (V₁ 0 0))) = P₁ 0 0 := by + have h := congrArg (fun M => M (0 : Fin 1) (0 : Fin 1)) hrad₁ + simpa [Matrix.sum_apply, Matrix.mul_apply] using h + refine ⟨⟨(⟨V₃, Matrix.mem_specialUnitaryGroup_iff.mpr + ⟨Matrix.mem_unitaryGroup_iff.mpr hV₃u, hd₃⟩⟩, + ⟨V₂, Matrix.mem_specialUnitaryGroup_iff.mpr + ⟨Matrix.mem_unitaryGroup_iff.mpr hV₂u, hd₂⟩⟩, + ⟨V₁ 0 0, Unitary.mem_iff.mpr ⟨by rw [mul_comm]; exact hu1, hu1⟩⟩), + JetGaugeGroupI.mem_truncationKer_zero_iff.mpr + (Prod.ext (Subtype.ext hV₃0) (Prod.ext (Subtype.ext hV₂0) (Subtype.ext hu0)))⟩, ?_⟩ + funext x + obtain ⟨r, hr⟩ := x + have hcard : ((Multiset.card r : ℕ) : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr fun hc => hr (Multiset.card_eq_zero.mp hc) + have hfacne : ((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _) + have hfacne' : (∏ ν, ((Nat.factorial (r.count ν) : ℕ) : ℂ)) ≠ 0 := + Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero _) + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · ext i j : 1 + rw [symmetrizedMaurerCartanCoeff_toSU3_eq _ P₃ + (by simp only [maurerCartanForm_toSU3Matrix]; exact hrad₃) r hr i j, + hcoeff₃ r hr i j, Complex.real_smul] + push_cast + field_simp + · ext i j : 1 + rw [symmetrizedMaurerCartanCoeff_toSU2_eq _ P₂ + (by simp only [maurerCartanForm_toSU2Matrix]; exact hrad₂) r hr i j, + hcoeff₂ r hr i j, Complex.real_smul] + push_cast + field_simp + · rw [symmetrizedMaurerCartanCoeff_toU1_eq _ (P₁ 0 0) + (by simp only [maurerCartanForm_toU1Value]; exact hrad₁') r hr, + hcoeff₁ r hr 0 0, Complex.real_smul, Matrix.of_apply] + push_cast + field_simp end StandardModel From 6fbcf0f03998342eccd54f2f3d261399cc59114e Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 19 Aug 2026 06:05:09 +0100 Subject: [PATCH 166/254] feat: Bit of a clean up --- .../GaugeAlgebra/JetGaugeAlgebra.lean | 57 ++ .../StandardModel/GaugeBosons/Gluons.lean | 2 +- .../StandardModel/GaugeGroup/Jet/Basic.lean | 6 - .../GaugeGroup/MaurerCartan/Basic.lean | 76 ++- .../GaugeGroup/MaurerCartan/Truncation.lean | 550 +----------------- Physlib/Relativity/DerivAlgebra.lean | 418 +------------ Physlib/Relativity/JetRing/Basic.lean | 415 +++++++++++++ Physlib/Relativity/JetRing/Matrix.lean | 475 +++++++++++++++ 8 files changed, 1025 insertions(+), 974 deletions(-) create mode 100644 Physlib/Relativity/JetRing/Basic.lean create mode 100644 Physlib/Relativity/JetRing/Matrix.lean diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 66b02e847..702c0b62b 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -342,7 +342,11 @@ lemma deriv_bracket (μ : Fin 1 ⊕ Fin 3) (x y : JetGaugeAlgebra) : congr 1 abel +/-! + +## The iterated derivative +-/ /-- Post-composition with `deriv` is right-commutative, since formal derivatives commute (`deriv_comm`). This is what allows iterated derivatives to be indexed by a `Multiset` of directions. -/ @@ -393,6 +397,39 @@ lemma iteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : iteratedDeriv_zero, LinearMap.comp_id] + + +lemma iteratedDeriv_toSU3Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (iteratedDeriv s a).toSU3Matrix = + a.toSU3Matrix.map fun f => s.foldl (fun f ρ => pderiv ℂ ρ f) f := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toSU3Matrix, ih] + ext i j : 1 + simp only [Matrix.map_apply, Multiset.foldl_cons] + exact (JetRing.foldl_pderiv_pderiv t μ _).symm + +lemma iteratedDeriv_toSU2Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (iteratedDeriv s a).toSU2Matrix = + a.toSU2Matrix.map fun f => s.foldl (fun f ρ => pderiv ℂ ρ f) f := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toSU2Matrix, ih] + ext i j : 1 + simp only [Matrix.map_apply, Multiset.foldl_cons] + exact (JetRing.foldl_pderiv_pderiv t μ _).symm + +lemma iteratedDeriv_toU1Value (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (iteratedDeriv s a).toU1Value = s.foldl (fun f ρ => pderiv ℂ ρ f) a.toU1Value := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toU1Value, ih, + Multiset.foldl_cons, JetRing.foldl_pderiv_pderiv] + + /-! ## Taylor coefficients and evaluation at the base point @@ -470,6 +507,26 @@ lemma taylorCoeff_zero_bracket (a b : JetGaugeAlgebra) : noncomputable def eval : JetGaugeAlgebra →ₗ⁅ℝ⁆ GaugeAlgebra := { taylorCoeff 0 with map_lie' := taylorCoeff_zero_bracket _ _ } + +lemma eval_toSU3Matrix_apply (a : JetGaugeAlgebra) (i j : Fin 3) : + (eval a).toSU3Matrix i j = constantCoeff (a.toSU3Matrix i j) := by + rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toSU3Matrix, Matrix.map_apply, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, + coeff_zero_eq_constantCoeff] + +lemma eval_toSU2Matrix_apply (a : JetGaugeAlgebra) (i j : Fin 2) : + (eval a).toSU2Matrix i j = constantCoeff (a.toSU2Matrix i j) := by + rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toSU2Matrix, Matrix.map_apply, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, + coeff_zero_eq_constantCoeff] + +lemma eval_toU1Value_eq (a : JetGaugeAlgebra) : + (eval a).toU1Value = constantCoeff a.toU1Value := by + rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toU1Value, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, + coeff_zero_eq_constantCoeff] + + /-- Taylor determinacy: a jet gauge algebra element is determined by the base-point values of its iterated derivatives. -/ theorem ext_of_eval_iteratedDeriv {x y : JetGaugeAlgebra} diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean index 984f77160..55df1269f 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean @@ -213,7 +213,7 @@ lemma jetValue_mul (A B : Matrix (Fin 3) (Fin 3) JetRing) : lemma jetValue_star (A : Matrix (Fin 3) (Fin 3) JetRing) : jetValue (star A) = star (jetValue A) := by simpa [jetValue, RingHom.mapMatrix_apply] using - JetGaugeGroupI.mapMatrix_constantCoeff_star A + JetRing.mapMatrix_constantCoeff_star A /-- The unitarity of a jet of a special-unitary gauge transformation, as a matrix identity over the jet ring. -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean index d9b8f3ea4..7b5b9de6d 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean @@ -357,12 +357,6 @@ lemma star_deriv_mul_inv_toVal_U1 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : show (star Complex.I) = -Complex.I by simp, map_neg, neg_mul, mul_neg, neg_neg] -/-- Application of `pderiv` is right-commutative, since formal partial derivatives - commute (`JetRing.pderiv_comm`). This allows iterating them over a `Multiset` of - directions. -/ -instance : RightCommutative (fun (f : JetRing) (μ : Fin 1 ⊕ Fin 3) => pderiv ℂ μ f) where - right_comm f μ ν := JetRing.pderiv_comm ν μ f - /-- The iterated formal derivative, in the (unordered) directions given by the multiset `s`, of the value of a jet gauge transformation, taken entrywise on each factor. This is the derivative-normalized Taylor coefficient of `U` at `s`, as a jet: diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index e6f38fcbb..2efab1cd6 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -304,7 +304,7 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure rw [star_smul, hXstar μ] simp refine ⟨F, hF0, mul_eq_one_comm.mp (hconstM _ _ ?_ fun μ => ?_), hF⟩ - · rw [map_mul, JetGaugeGroupI.mapMatrix_constantCoeff_star, hF0, star_one, one_mul] + · rw [map_mul, JetRing.mapMatrix_constantCoeff_star, hF0, star_one, one_mul] · rw [hleib, hstarmap, hF, star_mul, hA, mul_neg, neg_mul, mul_assoc, neg_add_cancel] -- the determinant of a Wilson line of traceless data is constant, hence `1` have hdet : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] @@ -490,6 +490,80 @@ lemma iteratedDeriv_maurerCartanForm_eq_symmetrized_add (U : JetGaugeGroupI) push_cast match_scalars <;> field_simp <;> ring + +/-- The `su(3)`-entry of the evaluated symmetrized Maurer–Cartan form, as a sum of + base-point values of iterated derivatives of the Maurer–Cartan form entries. -/ +lemma eval_symmetrizedMaurerCartanForm_toSU3_apply (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) (i j : Fin 3) : + (eval (symmetrizedMaurerCartanForm U r)).toSU3Matrix i j = + (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl + (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toSU3Matrix i j))).sum := by + set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' + (fun a => (eval a).toSU3Matrix i j) + (fun a b => by simp [map_add, GaugeAlgebra.add_toSU3Matrix]) with hΦ + have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = + constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) + ((maurerCartanForm U μ).toSU3Matrix i j)) := by + intro μ hμ + show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toSU3Matrix i j = _ + rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply, + Multiset.sub_singleton] + rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toSU3Matrix, + Matrix.smul_apply] + congr 1 + rw [show (eval ((r.map fun μ => + iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toSU3Matrix i j + = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, + map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) + +/-- The `su(2)`-entry of the evaluated symmetrized Maurer–Cartan form. -/ +lemma eval_symmetrizedMaurerCartanForm_toSU2_apply (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) (i j : Fin 2) : + (eval (symmetrizedMaurerCartanForm U r)).toSU2Matrix i j = + (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl + (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toSU2Matrix i j))).sum := by + set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' + (fun a => (eval a).toSU2Matrix i j) + (fun a b => by simp [map_add, GaugeAlgebra.add_toSU2Matrix]) with hΦ + have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = + constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) + ((maurerCartanForm U μ).toSU2Matrix i j)) := by + intro μ hμ + show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toSU2Matrix i j = _ + rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply, + Multiset.sub_singleton] + rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toSU2Matrix, + Matrix.smul_apply] + congr 1 + rw [show (eval ((r.map fun μ => + iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toSU2Matrix i j + = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, + map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) + +/-- The `u(1)`-value of the evaluated symmetrized Maurer–Cartan form. -/ +lemma eval_symmetrizedMaurerCartanForm_toU1Value (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) : + (eval (symmetrizedMaurerCartanForm U r)).toU1Value = + (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl + (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toU1Value))).sum := by + set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' + (fun a => (eval a).toU1Value) + (fun a b => by simp [map_add, GaugeAlgebra.add_toU1Value]) with hΦ + have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = + constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) + ((maurerCartanForm U μ).toU1Value)) := by + intro μ hμ + show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toU1Value = _ + rw [eval_toU1Value_eq, iteratedDeriv_toU1Value, Multiset.sub_singleton] + rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toU1Value] + congr 1 + rw [show (eval ((r.map fun μ => + iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toU1Value + = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, + map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) /-- Determination step: if the base-point symmetrized Maurer–Cartan data of `U` and `V` agree, and their Maurer–Cartan Taylor data agree in fewer than `n` directions, then they agree in `n` directions. -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean index b4fef149f..218a5db1f 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -25,7 +25,7 @@ public import Mathlib.Algebra.MvPolynomial.Derivation @[expose] public section namespace StandardModel -open MvPowerSeries JetGaugeAlgebra +open MvPowerSeries JetGaugeAlgebra JetRing /-- Projecting onto the zeroth truncation kernel does not change the Maurer–Cartan form: by the cocycle law, right-multiplication by a constant gauge transformation drops out. -/ @@ -135,554 +135,6 @@ lemma symmetrizedMaurerCartanCoeff_injective : Function.Injective symmetrizedMau TODO "The below code needs cleaning up and moving to the correct place." /-! -## The Euler operator toolkit - --/ - -/-- The formal coordinates of the jet ring are self-adjoint. -/ -lemma jetRing_star_X (ρ : Fin 1 ⊕ Fin 3) : star (X ρ : JetRing) = X ρ := by - ext m - rw [JetRing.coeff_star, show (X ρ : JetRing) = monomial (Finsupp.single ρ 1) 1 from rfl, - coeff_monomial] - split_ifs <;> simp - -/-- The Taylor coefficients of a jet multiplied by a formal coordinate: the - coefficient shifts down by one in that direction. -/ -lemma coeff_X_smul (ρ : Fin 1 ⊕ Fin 3) (f : JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - coeff p ((X ρ : JetRing) • f) = - if Finsupp.single ρ 1 ≤ p then coeff (p - Finsupp.single ρ 1) f else 0 := by - rw [smul_eq_mul, show (X ρ : JetRing) = monomial (Finsupp.single ρ 1) 1 from rfl, - coeff_monomial_mul] - split_ifs <;> simp - -/-- The Euler (radial) operator acts on Taylor coefficients as multiplication by the - total degree. -/ -lemma coeff_sum_X_smul_pderiv (f : JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - coeff p (∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f) = - ((Finsupp.degree p : ℕ) : ℂ) * coeff p f := by - classical - rw [map_sum] - have ht : ∀ ρ, coeff p ((X ρ : JetRing) • pderiv ℂ ρ f) = (p ρ : ℂ) * coeff p f := by - intro ρ - rw [coeff_X_smul] - by_cases h : Finsupp.single ρ 1 ≤ p - · have hρ : 1 ≤ p ρ := by simpa using Finsupp.single_le_iff.mp h - rw [if_pos h, coeff_pderiv, tsub_add_cancel_of_le h, Finsupp.coe_tsub, Pi.sub_apply, - Finsupp.single_eq_same, Nat.cast_sub hρ] - push_cast - ring - · have hρ : p ρ = 0 := by - by_contra hc - exact h (Finsupp.single_le_iff.mpr (by omega)) - rw [if_neg h, hρ] - simp - rw [Finset.sum_congr rfl fun ρ _ => ht ρ, ← Finset.sum_mul, ← Nat.cast_sum, - ← Finsupp.degree_eq_sum] - -/-- The Euler operator on matrices of jets acts entrywise on Taylor coefficients as - multiplication by the total degree. -/ -lemma coeff_sum_X_smul_map_pderiv {κ : Type} [Fintype κ] [DecidableEq κ] - (M : Matrix κ κ JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) (i j : κ) : - coeff p ((∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = - ((Finsupp.degree p : ℕ) : ℂ) * coeff p (M i j) := by - rw [show (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j - = ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (M i j) from by - rw [Matrix.sum_apply] - exact Finset.sum_congr rfl fun ρ _ => rfl] - exact coeff_sum_X_smul_pderiv (M i j) p - -/-- The vanishing principle for the Euler operator: a matrix of jets vanishing at the - base point and satisfying `E W = A W + W B` with `A`, `B` vanishing at the base point - is zero. Each Taylor coefficient of `W` is a multiple of coefficients of strictly - smaller degree, so all vanish by strong induction on the degree. -/ -lemma matrix_eq_zero_of_euler_eq_mul_add_mul {κ : Type} [Fintype κ] [DecidableEq κ] - {W : Matrix κ κ JetRing} (A B : Matrix κ κ JetRing) - (hA : ∀ i j, constantCoeff (A i j) = 0) (hB : ∀ i j, constantCoeff (B i j) = 0) - (h0 : ∀ i j, constantCoeff (W i j) = 0) - (hW : ∑ ρ, (X ρ : JetRing) • W.map (pderiv ℂ ρ) = A * W + W * B) : - W = 0 := by - classical - have hlow : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, - (∀ (i : κ) (j : κ) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), - Finsupp.degree q < Finsupp.degree p → coeff q (W i j) = 0) → - ∀ i j, coeff p ((A * W + W * B) i j) = 0 := by - intro p hp i j - have hAW : coeff p ((A * W) i j) = 0 := by - rw [Matrix.mul_apply, map_sum] - refine Finset.sum_eq_zero fun k _ => ?_ - rw [coeff_mul] - refine Finset.sum_eq_zero fun q hq => ?_ - rcases eq_or_ne q.1 0 with h1 | h1 - · rw [h1, coeff_zero_eq_constantCoeff, hA, zero_mul] - · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by - rw [← map_add, Finset.mem_antidiagonal.mp hq] - have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) - rw [hp _ _ q.2 (by omega), mul_zero] - have hWB : coeff p ((W * B) i j) = 0 := by - rw [Matrix.mul_apply, map_sum] - refine Finset.sum_eq_zero fun k _ => ?_ - rw [coeff_mul] - refine Finset.sum_eq_zero fun q hq => ?_ - rcases eq_or_ne q.2 0 with h1 | h1 - · rw [h1, coeff_zero_eq_constantCoeff, hB, mul_zero] - · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by - rw [← map_add, Finset.mem_antidiagonal.mp hq] - have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) - rw [hp _ _ q.1 (by omega), zero_mul] - rw [Matrix.add_apply, map_add, hAW, hWB, add_zero] - have hm : ∀ (n : ℕ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree p = n → - ∀ i j, coeff p (W i j) = 0 := by - intro n - induction n using Nat.strong_induction_on with - | _ n ih => - intro p hp i j - rcases Nat.eq_zero_or_pos n with hn | hn - · have hp0 : p = 0 := (Finsupp.degree_eq_zero_iff _).mp (by omega) - rw [hp0, coeff_zero_eq_constantCoeff] - exact h0 i j - · have h : coeff p ((∑ ρ, (X ρ : JetRing) • W.map (pderiv ℂ ρ)) i j) = - coeff p ((A * W + W * B) i j) := congrArg (fun M => coeff p (M i j)) hW - rw [coeff_sum_X_smul_map_pderiv, - hlow p (fun i' j' q hq => ih (Finsupp.degree q) (by omega) q rfl i' j') i j] at h - have hne : ((Finsupp.degree p : ℕ) : ℂ) ≠ 0 := by - rw [hp] - exact_mod_cast hn.ne' - exact (mul_eq_zero.mp h).resolve_left hne - ext i j : 1 - ext p - rw [hm (Finsupp.degree p) p rfl i j] - simp - -/-- The Euler (radial) transport of a jet matrix `R` vanishing at the base point: - a fundamental solution of the radial system `E U = R U` based at the identity, - built order-by-order by the Euler recursion. -/ -lemma exists_matrix_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] - (R : Matrix κ κ JetRing) (hR0 : ∀ i j, constantCoeff (R i j) = 0) : - ∃ U : Matrix κ κ JetRing, (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1 ∧ - ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U := by - classical - have hRlow : ∀ (M N : Matrix κ κ JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), - (∀ (i : κ) (j : κ) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), - Finsupp.degree q < Finsupp.degree p → coeff q (M i j) = coeff q (N i j)) → - ∀ i j, coeff p ((R * M) i j) = coeff p ((R * N) i j) := fun M N p h i j => by - simp only [Matrix.mul_apply, map_sum, coeff_mul] - refine Finset.sum_congr rfl fun k _ => Finset.sum_congr rfl fun q hq => ?_ - rcases eq_or_ne q.1 0 with h1 | h1 - · rw [h1, coeff_zero_eq_constantCoeff, hR0, zero_mul, zero_mul] - · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by - rw [← map_add, Finset.mem_antidiagonal.mp hq] - have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) - rw [h _ _ _ (by omega)] - set T : Matrix κ κ JetRing → Matrix κ κ JetRing := fun M => 1 + (R * M).map fun f => - show JetRing from fun m => if m = 0 then 0 else ((Finsupp.degree m : ℕ) : ℂ)⁻¹ * f m - with hT - set U : Matrix κ κ JetRing := - Matrix.of fun i j => show JetRing from fun m => (T^[Finsupp.degree m + 1] 1) i j m with hUd - have hUco : ∀ (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) i j, - coeff p (U i j) = coeff p ((T^[Finsupp.degree p + 1] 1) i j) := fun _ _ _ => rfl - have hTco : ∀ (M : Matrix κ κ JetRing) i j (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), - coeff p ((T M) i j) = coeff p ((1 : Matrix κ κ JetRing) i j) + - if p = 0 then 0 else ((Finsupp.degree p : ℕ) : ℂ)⁻¹ * coeff p ((R * M) i j) := - fun M i j p => by - simp only [hT] - rw [Matrix.add_apply, map_add, Matrix.map_apply] - rfl - have hmain : ∀ (n : ℕ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree p = n → ∀ k, n < k → - ∀ i j, coeff p ((T^[k] 1) i j) = coeff p ((T U) i j) := fun n => by - induction n using Nat.strong_induction_on with - | _ n ih => - intro p hp k hk i j - obtain ⟨k, rfl⟩ : ∃ k', k = k' + 1 := ⟨k - 1, by omega⟩ - rw [Function.iterate_succ_apply', hTco, hTco] - rcases eq_or_ne p 0 with h0 | h0 - · rw [if_pos h0, if_pos h0] - · rw [if_neg h0, if_neg h0, hRlow _ U _ (fun i' j' q hq => ?_) i j] - rw [hUco, ih (Finsupp.degree q) (by omega) q rfl k (by omega) i' j', - ih (Finsupp.degree q) (by omega) q rfl (Finsupp.degree q + 1) (by omega) i' j'] - have hkey := fun (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) (i j : κ) => - (hUco p i j).trans (hmain _ p rfl _ (Nat.lt_succ_self _) i j) - have hUone : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1 := by - ext i j - simpa [hTco, Matrix.one_apply, apply_ite, coeff_one] using hkey 0 i j - refine ⟨U, hUone, ?_⟩ - ext i j : 1 - ext p - rw [coeff_sum_X_smul_map_pderiv] - rcases eq_or_ne p 0 with rfl | h0 - · rw [show ((Finsupp.degree (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) : ℕ) : ℂ) = 0 by simp, zero_mul] - rw [Matrix.mul_apply, map_sum] - exact (Finset.sum_eq_zero fun k _ => by - rw [coeff_zero_eq_constantCoeff, map_mul, hR0, zero_mul]).symm - · rw [hkey p i j, hTco, show coeff p ((1 : Matrix κ κ JetRing) i j) = 0 from by - simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, if_neg h0, ← mul_assoc, - mul_inv_cancel₀ (Nat.cast_ne_zero.mpr fun hc => h0 ((Finsupp.degree_eq_zero_iff p).mp hc)), - one_mul] - -/-! - -## Unitarity and determinant of the Euler transport - --/ - -/-- The entrywise Leibniz rule for matrix products of jets. -/ -lemma matrix_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] (ρ : Fin 1 ⊕ Fin 3) - (M N : Matrix κ κ JetRing) : - (M * N).map (pderiv ℂ ρ) = M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := by - ext i j : 1 - simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, - Derivation.leibniz, smul_eq_mul] - exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib - -/-- The Euler operator on matrices of jets is a derivation. -/ -lemma sum_X_smul_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] - (M N : Matrix κ κ JetRing) : - ∑ ρ, (X ρ : JetRing) • (M * N).map (pderiv ℂ ρ) = - (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) * N + - M * ∑ ρ, (X ρ : JetRing) • N.map (pderiv ℂ ρ) := by - rw [Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib] - refine Finset.sum_congr rfl fun ρ _ => ?_ - rw [matrix_map_pderiv_mul, smul_add, Matrix.smul_mul, Matrix.mul_smul] - -/-- The Euler operator commutes with the conjugate transpose. -/ -lemma sum_X_smul_map_pderiv_star {κ : Type} [Fintype κ] [DecidableEq κ] - (M : Matrix κ κ JetRing) : - ∑ ρ, (X ρ : JetRing) • (star M).map (pderiv ℂ ρ) = - star (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) := by - ext i j : 1 - simp only [Matrix.sum_apply, Matrix.star_apply, Matrix.smul_apply, Matrix.map_apply, - smul_eq_mul, star_sum, star_mul', jetRing_star_X, ← JetRing.pderiv_star] - -/-- The Euler operator kills the identity matrix. -/ -lemma sum_X_smul_map_pderiv_one {κ : Type} [Fintype κ] [DecidableEq κ] : - ∑ ρ, (X ρ : JetRing) • (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) = 0 := by - refine Finset.sum_eq_zero fun ρ _ => ?_ - rw [show (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) = 0 from Matrix.ext fun i j => by - simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ρ)], smul_zero] - -/-- A fundamental solution of the radial system `E U = R U` based at the identity is - unitary when `R` is anti-hermitian: `U U† − 1` vanishes at the base point and - satisfies a homogeneous linear radial system, so it vanishes identically. -/ -lemma eulerTransport_mul_star {κ : Type} [Fintype κ] [DecidableEq κ] - {R U : Matrix κ κ JetRing} (hRstar : star R = -R) - (hR0 : ∀ i j, constantCoeff (R i j) = 0) - (hU0 : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1) - (hEU : ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U) : - U * star U = 1 := by - have hEstar : ∑ ρ, (X ρ : JetRing) • (star U).map (pderiv ℂ ρ) = -(star U * R) := by - rw [sum_X_smul_map_pderiv_star, hEU, star_mul, hRstar, Matrix.mul_neg] - have hW0 : (constantCoeff : JetRing →+* ℂ).mapMatrix (U * star U - 1) = 0 := by - rw [map_sub, map_mul, JetGaugeGroupI.mapMatrix_constantCoeff_star, hU0, star_one, - mul_one, map_one, sub_self] - have h0 : ∀ i j, constantCoeff ((U * star U - 1) i j) = 0 := fun i j => by - simpa [RingHom.mapMatrix_apply, Matrix.map_apply] using congrArg (fun M => M i j) hW0 - have hB : ∀ i j, constantCoeff ((-R) i j) = 0 := fun i j => by - simp [hR0 i j] - have hEW : ∑ ρ, (X ρ : JetRing) • (U * star U - 1).map (pderiv ℂ ρ) = - R * (U * star U - 1) + (U * star U - 1) * (-R) := by - have hsub : ∀ ρ : Fin 1 ⊕ Fin 3, (U * star U - 1).map (pderiv ℂ ρ) = - (U * star U).map (pderiv ℂ ρ) - (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) := - fun ρ => Matrix.ext fun i j => by simp [Matrix.map_apply] - simp only [hsub, smul_sub, Finset.sum_sub_distrib] - rw [sum_X_smul_map_pderiv_mul, hEU, hEstar, sum_X_smul_map_pderiv_one, sub_zero] - noncomm_ring - exact sub_eq_zero.mp (matrix_eq_zero_of_euler_eq_mul_add_mul R (-R) hR0 hB h0 hEW) - -/-- The scalar vanishing principle for the Euler operator: a jet vanishing at the base - point that is killed by the Euler operator is zero. -/ -lemma eq_zero_of_sum_X_smul_pderiv_eq_zero {f : JetRing} (h0 : constantCoeff f = 0) - (hf : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f = 0) : f = 0 := by - ext p - rcases eq_or_ne p 0 with rfl | hp - · simpa [coeff_zero_eq_constantCoeff] using h0 - · have h := congrArg (coeff p) hf - rw [coeff_sum_X_smul_pderiv, map_zero] at h - have hne : ((Finsupp.degree p : ℕ) : ℂ) ≠ 0 := - Nat.cast_ne_zero.mpr fun hc => hp ((Finsupp.degree_eq_zero_iff p).mp hc) - simpa using (mul_eq_zero.mp h).resolve_left hne - -/-- A fundamental solution of the radial system `E U = R U` based at the identity has - determinant one when `R` is traceless: by Jacobi's formula the determinant is killed - by the Euler operator, so it is the constant `1`. -/ -lemma eulerTransport_det {κ : Type} [Fintype κ] [DecidableEq κ] - {R U : Matrix κ κ JetRing} - (hjac : ∀ (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3), - pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace) - (hRtr : R.trace = 0) - (hU0 : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1) - (hEU : ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U) : - U.det = 1 := by - have hEdet : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det = 0 := by - calc ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det - = ∑ ρ, (X ρ : JetRing) • (U.map (pderiv ℂ ρ) * U.adjugate).trace := by - exact Finset.sum_congr rfl fun ρ _ => by rw [hjac] - _ = ((∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ)) * U.adjugate).trace := by - rw [Finset.sum_mul, Matrix.trace_sum] - exact Finset.sum_congr rfl fun ρ _ => by - rw [Matrix.smul_mul, Matrix.trace_smul] - _ = (R * (U.det • (1 : Matrix κ κ JetRing))).trace := by - rw [hEU, Matrix.mul_assoc, Matrix.mul_adjugate] - _ = 0 := by - rw [mul_smul_comm, mul_one, Matrix.trace_smul, hRtr, smul_zero] - have hd0 : constantCoeff (U.det - 1) = 0 := by - rw [map_sub, map_one, RingHom.map_det, hU0, Matrix.det_one, sub_self] - have hEd : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (U.det - 1) = 0 := by - calc ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (U.det - 1) - = ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det := by - exact Finset.sum_congr rfl fun ρ _ => by rw [map_sub, pderiv_one, sub_zero] - _ = 0 := hEdet - exact sub_eq_zero.mp (eq_zero_of_sum_X_smul_pderiv_eq_zero hd0 hEd) - -/-! - -## Multiset derivative bookkeeping - --/ - -/-- Iterated formal derivatives over a multiset commute with a single derivative. -/ -lemma foldl_pderiv_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (f : JetRing) : - s.foldl (fun f ρ => pderiv ℂ ρ f) (pderiv ℂ μ f) = - pderiv ℂ μ (s.foldl (fun f ρ => pderiv ℂ ρ f) f) := by - induction s using Multiset.induction_on generalizing f with - | empty => simp - | cons a t ih => - rw [Multiset.foldl_cons, Multiset.foldl_cons, JetRing.pderiv_comm, ih] - -/-- The base-point value of an iterated formal derivative is the corresponding Taylor - coefficient with the factorial normalization. -/ -lemma constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : - constantCoeff (s.foldl (fun f ρ => pderiv ℂ ρ f) f) = - ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) * coeff s.toFinsupp f := by - induction s using Multiset.induction_on generalizing f with - | empty => simp [coeff_zero_eq_constantCoeff] - | cons a t ih => - rw [Multiset.foldl_cons, ih, coeff_pderiv] - have hfin : (a ::ₘ t).toFinsupp = t.toFinsupp + Finsupp.single a 1 := by - rw [show (a ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = {a} + t from - (Multiset.singleton_add a t).symm, map_add, Multiset.toFinsupp_singleton, add_comm] - have hfac : (∏ ν, Nat.factorial ((a ::ₘ t).count ν) : ℕ) = - (t.count a + 1) * ∏ ν, Nat.factorial (t.count ν) := by - rw [show (∏ ν, Nat.factorial ((a ::ₘ t).count ν) : ℕ) = - ∏ ν, ((if ν = a then t.count a + 1 else 1) * Nat.factorial (t.count ν)) from - Finset.prod_congr rfl fun ν _ => by - rcases eq_or_ne ν a with rfl | h - · rw [Multiset.count_cons_self, Nat.factorial_succ, if_pos rfl] - · rw [Multiset.count_cons_of_ne h, if_neg h, one_mul], - Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ a] - simp - rw [hfin, hfac, Multiset.toFinsupp_apply] - push_cast - ring - -/-- The key combinatorial identity behind the symmetrized Maurer–Cartan data: the sum - over a multiset `r` of base-point values of iterated derivatives of `g` in the - complementary directions is, up to factorials, the Taylor coefficient at `r` of the - radial contraction `∑ μ x_μ g_μ`. -/ -lemma sum_constantCoeff_foldl_erase (g : (Fin 1 ⊕ Fin 3) → JetRing) - (r : Multiset (Fin 1 ⊕ Fin 3)) : - (r.map fun μ => constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) (g μ))).sum = - ((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * - coeff r.toFinsupp (∑ μ, (X μ : JetRing) • g μ) := by - classical - rw [Finset.sum_multiset_map_count, - Finset.sum_subset (Finset.subset_univ r.toFinset) (fun x _ hx => by - rw [Multiset.count_eq_zero.mpr fun hmem => hx (Multiset.mem_toFinset.mpr hmem), - zero_smul]), - map_sum, Finset.mul_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [coeff_X_smul, constantCoeff_foldl_pderiv] - by_cases hμ : μ ∈ r - · rw [if_pos (Finsupp.single_le_iff.mpr (by - rw [Multiset.toFinsupp_apply] - exact Multiset.one_le_count_iff_mem.mpr hμ))] - have herase : (r.erase μ).toFinsupp = r.toFinsupp - Finsupp.single μ 1 := by - ext ν - rw [Multiset.toFinsupp_apply, Finsupp.coe_tsub, Pi.sub_apply, Multiset.toFinsupp_apply, - Finsupp.single_apply] - rcases eq_or_ne μ ν with rfl | h - · rw [Multiset.count_erase_self, if_pos rfl] - · rw [Multiset.count_erase_of_ne h.symm, if_neg h, Nat.sub_zero] - have hfac : r.count μ * ∏ ν, Nat.factorial ((r.erase μ).count ν) = - ∏ ν, Nat.factorial (r.count ν) := by - rw [← Finset.mul_prod_erase Finset.univ - (fun ν => Nat.factorial ((r.erase μ).count ν)) (Finset.mem_univ μ), - ← Finset.mul_prod_erase Finset.univ - (fun ν => Nat.factorial (r.count ν)) (Finset.mem_univ μ), - Multiset.count_erase_self, - Finset.prod_congr rfl fun ν hν => - congrArg Nat.factorial - (Multiset.count_erase_of_ne (Finset.mem_erase.mp hν).1 r), - ← mul_assoc, Nat.mul_factorial_pred (Multiset.count_pos.mpr hμ).ne'] - rw [herase, nsmul_eq_mul, ← mul_assoc, ← Nat.cast_mul, hfac] - · rw [if_neg fun hle => hμ (Multiset.one_le_count_iff_mem.mp (by - simpa [Multiset.toFinsupp_apply] using Finsupp.single_le_iff.mp hle)), - mul_zero, Multiset.count_eq_zero.mpr hμ, zero_smul] - -/-! - -## Componentwise iterated derivatives on the jet gauge algebra - --/ - -namespace JetGaugeAlgebra - -lemma iteratedDeriv_toSU3Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : - (iteratedDeriv s a).toSU3Matrix = - a.toSU3Matrix.map fun f => s.foldl (fun f ρ => pderiv ℂ ρ f) f := by - induction s using Multiset.induction_on with - | empty => simp [iteratedDeriv_zero] - | cons μ t ih => - rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toSU3Matrix, ih] - ext i j : 1 - simp only [Matrix.map_apply, Multiset.foldl_cons] - exact (foldl_pderiv_pderiv t μ _).symm - -lemma iteratedDeriv_toSU2Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : - (iteratedDeriv s a).toSU2Matrix = - a.toSU2Matrix.map fun f => s.foldl (fun f ρ => pderiv ℂ ρ f) f := by - induction s using Multiset.induction_on with - | empty => simp [iteratedDeriv_zero] - | cons μ t ih => - rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toSU2Matrix, ih] - ext i j : 1 - simp only [Matrix.map_apply, Multiset.foldl_cons] - exact (foldl_pderiv_pderiv t μ _).symm - -lemma iteratedDeriv_toU1Value (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : - (iteratedDeriv s a).toU1Value = s.foldl (fun f ρ => pderiv ℂ ρ f) a.toU1Value := by - induction s using Multiset.induction_on with - | empty => simp [iteratedDeriv_zero] - | cons μ t ih => - rw [iteratedDeriv_cons, LinearMap.comp_apply, deriv_toU1Value, ih, - Multiset.foldl_cons, foldl_pderiv_pderiv] - -lemma eval_toSU3Matrix_apply (a : JetGaugeAlgebra) (i j : Fin 3) : - (eval a).toSU3Matrix i j = constantCoeff (a.toSU3Matrix i j) := by - rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toSU3Matrix, Matrix.map_apply, - show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, - coeff_zero_eq_constantCoeff] - -lemma eval_toSU2Matrix_apply (a : JetGaugeAlgebra) (i j : Fin 2) : - (eval a).toSU2Matrix i j = constantCoeff (a.toSU2Matrix i j) := by - rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toSU2Matrix, Matrix.map_apply, - show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, - coeff_zero_eq_constantCoeff] - -lemma eval_toU1Value_eq (a : JetGaugeAlgebra) : - (eval a).toU1Value = constantCoeff a.toU1Value := by - rw [show eval a = taylorCoeff 0 a from rfl, taylorCoeff_toU1Value, - show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, - coeff_zero_eq_constantCoeff] - -end JetGaugeAlgebra - -/-- The `su(3)`-entry of the evaluated symmetrized Maurer–Cartan form, as a sum of - base-point values of iterated derivatives of the Maurer–Cartan form entries. -/ -lemma eval_symmetrizedMaurerCartanForm_toSU3_apply (U : JetGaugeGroupI) - (r : Multiset (Fin 1 ⊕ Fin 3)) (i j : Fin 3) : - (eval (symmetrizedMaurerCartanForm U r)).toSU3Matrix i j = - (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl - (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toSU3Matrix i j))).sum := by - set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' - (fun a => (eval a).toSU3Matrix i j) - (fun a b => by simp [map_add, GaugeAlgebra.add_toSU3Matrix]) with hΦ - have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = - constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) - ((maurerCartanForm U μ).toSU3Matrix i j)) := by - intro μ hμ - show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toSU3Matrix i j = _ - rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply, - Multiset.sub_singleton] - rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toSU3Matrix, - Matrix.smul_apply] - congr 1 - rw [show (eval ((r.map fun μ => - iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toSU3Matrix i j - = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, - map_multiset_sum, Multiset.map_map] - exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) - -/-- The `su(2)`-entry of the evaluated symmetrized Maurer–Cartan form. -/ -lemma eval_symmetrizedMaurerCartanForm_toSU2_apply (U : JetGaugeGroupI) - (r : Multiset (Fin 1 ⊕ Fin 3)) (i j : Fin 2) : - (eval (symmetrizedMaurerCartanForm U r)).toSU2Matrix i j = - (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl - (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toSU2Matrix i j))).sum := by - set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' - (fun a => (eval a).toSU2Matrix i j) - (fun a b => by simp [map_add, GaugeAlgebra.add_toSU2Matrix]) with hΦ - have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = - constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) - ((maurerCartanForm U μ).toSU2Matrix i j)) := by - intro μ hμ - show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toSU2Matrix i j = _ - rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply, - Multiset.sub_singleton] - rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toSU2Matrix, - Matrix.smul_apply] - congr 1 - rw [show (eval ((r.map fun μ => - iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toSU2Matrix i j - = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, - map_multiset_sum, Multiset.map_map] - exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) - -/-- The `u(1)`-value of the evaluated symmetrized Maurer–Cartan form. -/ -lemma eval_symmetrizedMaurerCartanForm_toU1Value (U : JetGaugeGroupI) - (r : Multiset (Fin 1 ⊕ Fin 3)) : - (eval (symmetrizedMaurerCartanForm U r)).toU1Value = - (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl - (fun f ρ => pderiv ℂ ρ f) ((maurerCartanForm U μ).toU1Value))).sum := by - set Φ : JetGaugeAlgebra →+ ℂ := AddMonoidHom.mk' - (fun a => (eval a).toU1Value) - (fun a b => by simp [map_add, GaugeAlgebra.add_toU1Value]) with hΦ - have hΦiter : ∀ μ ∈ r, Φ (iteratedDeriv (r - {μ}) (maurerCartanForm U μ)) = - constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) - ((maurerCartanForm U μ).toU1Value)) := by - intro μ hμ - show (eval (iteratedDeriv (r - {μ}) (maurerCartanForm U μ))).toU1Value = _ - rw [eval_toU1Value_eq, iteratedDeriv_toU1Value, Multiset.sub_singleton] - rw [symmetrizedMaurerCartanForm, map_smul, GaugeAlgebra.smul_toU1Value] - congr 1 - rw [show (eval ((r.map fun μ => - iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum)).toU1Value - = Φ ((r.map fun μ => iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum) from rfl, - map_multiset_sum, Multiset.map_map] - exact congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => hΦiter μ hμ) - -/-! - -## Jacobi's formula on the matrix factors, and degree bookkeeping - --/ - -lemma jacobi_fin3 (M : Matrix (Fin 3) (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by - rw [Matrix.det_fin_three] - simp only [Matrix.trace_fin_three, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.map_apply, Matrix.adjugate_fin_three, Matrix.of_apply, Matrix.cons_val', - Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.head_cons, - Matrix.tail_cons, Matrix.head_fin_const, Matrix.empty_val', Matrix.cons_val_fin_one, - map_sub, map_add, Derivation.leibniz, smul_eq_mul] - ring - -lemma jacobi_fin2 (M : Matrix (Fin 2) (Fin 2) JetRing) (μ : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by - rw [Matrix.det_fin_two] - simp only [Matrix.adjugate_fin_two, Matrix.trace_fin_two, Matrix.mul_apply, - Matrix.map_apply, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, - Matrix.empty_val', Matrix.cons_val_fin_one, Fin.sum_univ_two, Matrix.cons_val_one, - map_sub, Derivation.leibniz, smul_eq_mul] - ring - -lemma degree_toFinsupp_eq_card (r : Multiset (Fin 1 ⊕ Fin 3)) : - Finsupp.degree (Multiset.toFinsupp r) = Multiset.card r := by - rw [Finsupp.degree_eq_sum, Finset.sum_congr rfl fun ν _ => Multiset.toFinsupp_apply r ν, - ← Finset.sum_subset (Finset.subset_univ r.toFinset) (fun x _ hx => - Multiset.count_eq_zero.mpr fun hmem => hx (Multiset.mem_toFinset.mpr hmem)), - Multiset.toFinset_sum_count_eq] - -/-! - ## The symmetrized data through the radial Maurer–Cartan component -/ diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index 90eda1387..f43ca120b 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -20,6 +20,7 @@ public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis public import Mathlib.RepresentationTheory.Basic public import Mathlib.RingTheory.TensorProduct.Basic public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Relativity.JetRing.Matrix public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.Tensors.RealTensor.CoVector.Representation /-! @@ -31,423 +32,6 @@ public import Physlib.Relativity.Tensors.RealTensor.CoVector.Representation /-! -## A. The Jet ring - --/ - -/-- The ring of formal power series in the four spacetime coordinates, with complex - coefficients. Jets of fields and of gauge transformations at a spacetime point are - valued in this ring. The star operation is coefficientwise complex conjugation, so - the spacetime coordinates themselves are self-adjoint. -/ -abbrev JetRing : Type := MvPowerSeries (Fin 1 ⊕ Fin 3) ℂ - -/-! - -### A.1. The star structure on the jet ring - -The star operation on the jet ring is coefficientwise complex conjugation, fixing -the formal variables. In particular the spacetime coordinates are self-adjoint. - --/ - -namespace JetRing - -open MvPowerSeries - -instance : Star JetRing where - star f := fun n => star (f n) - -@[simp] -lemma coeff_star (n : (Fin 1 ⊕ Fin 3) →₀ ℕ) (f : JetRing) : - coeff n (star f) = star (coeff n f) := rfl - -instance : StarRing JetRing where - star_involutive f := funext fun n => star_star (f n) - star_add f g := funext fun n => star_add (f n) (g n) - star_mul f g := by - have h : ∀ a b : JetRing, star (a * b) = star a * star b := by - intro a b - ext n - classical - rw [coeff_star, coeff_mul, coeff_mul, star_sum] - exact Finset.sum_congr rfl fun p _ => by rw [star_mul', coeff_star, coeff_star] - rw [h, mul_comm] - -/-- Real scalars commute with the coefficientwise conjugation. -/ -instance : StarModule ℝ JetRing where - star_smul r f := funext fun n => star_smul r (f n) - -/-- Complex scalars conjugate under the coefficientwise conjugation. -/ -instance : StarModule ℂ JetRing where - star_smul c f := funext fun n => star_smul c (f n) - -@[simp] -lemma constantCoeff_star (f : JetRing) : - constantCoeff (star f) = star (constantCoeff f) := rfl - -@[simp] -lemma star_C (a : ℂ) : - star (C a : JetRing) = C (star a) := by - ext n - classical - rw [coeff_star, coeff_C, coeff_C] - split_ifs <;> simp - -/-- The first-order Leibniz rule: the degree-one Taylor coefficient, in the - direction `μ`, of a product of jets. This is the coefficient-level statement - that the first jet of a product is given by the product rule. -/ -lemma coeff_single_one_mul (μ : Fin 1 ⊕ Fin 3) (f g : JetRing) : - coeff (Finsupp.single μ 1) (f * g) = - coeff (Finsupp.single μ 1) f * constantCoeff g + - constantCoeff f * coeff (Finsupp.single μ 1) g := by - classical - rw [coeff_mul, Finsupp.antidiagonal_single, - show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, - Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), - Finset.sum_singleton] - simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, - Finsupp.single_zero, coeff_zero_eq_constantCoeff] - ring - -/-- The first-order power rule: the degree-one Taylor coefficient, in the direction - `μ`, of a power of a jet. -/ -lemma coeff_single_one_pow (μ : Fin 1 ⊕ Fin 3) (f : JetRing) (n : ℕ) : - coeff (Finsupp.single μ 1) (f ^ n) = - (n : ℂ) * constantCoeff f ^ (n - 1) * coeff (Finsupp.single μ 1) f := by - classical - induction n with - | zero => - simp [coeff_one, Finsupp.single_eq_zero] - | succ n ih => - rw [pow_succ, coeff_single_one_mul, ih, map_pow, Nat.add_sub_cancel] - rcases Nat.eq_zero_or_pos n with hn | hn - · subst hn - simp - · have hpow : constantCoeff f ^ (n - 1) * constantCoeff f = constantCoeff f ^ n := by - rw [← pow_succ, Nat.sub_add_cancel hn] - push_cast - linear_combination ((n : ℂ) * coeff (Finsupp.single μ 1) f) * hpow - -/-! - -### A.2. The formal partial derivative on the jet ring - --/ - -/-- The formal partial derivative commutes with the coefficientwise star. -/ -lemma pderiv_star (ν : Fin 1 ⊕ Fin 3) (f : JetRing) : - pderiv ℂ ν (star f) = star (pderiv ℂ ν f) := by - ext s - rw [coeff_pderiv, coeff_star, coeff_star, coeff_pderiv, star_mul'] - congr 1 - simp - -/-- Formal partial derivatives commute. -/ -lemma pderiv_comm (μ ν : Fin 1 ⊕ Fin 3) (f : JetRing) : - pderiv ℂ μ (pderiv ℂ ν f) = pderiv ℂ ν (pderiv ℂ μ f) := by - classical - ext s - rw [coeff_pderiv, coeff_pderiv, coeff_pderiv, coeff_pderiv, - show s + Finsupp.single μ 1 + Finsupp.single ν 1 = - s + Finsupp.single ν 1 + Finsupp.single μ 1 from by - rw [add_assoc, add_assoc, add_comm (Finsupp.single μ 1)]] - rcases eq_or_ne μ ν with rfl | h - · rfl - · rw [Finsupp.add_apply, Finsupp.add_apply, Finsupp.single_eq_of_ne h.symm, - Finsupp.single_eq_of_ne h] - push_cast - ring - -/-! - -### Truncation of jets - --/ -/-- The `n`-th truncation of a jet: the Taylor coefficients of total degree - greater than `n` are set to zero. -/ -noncomputable def truncation (n : ℕ) (f : JetRing) : JetRing := - fun m => if Finsupp.degree m ≤ n then f m else 0 - -@[simp] -lemma coeff_truncation_of_le {n : ℕ} {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} - (h : Finsupp.degree m ≤ n) (f : JetRing) : - coeff m (truncation n f) = coeff m f := if_pos h - -@[simp] -lemma coeff_truncation_of_gt {n : ℕ} {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} - (h : n < Finsupp.degree m) (f : JetRing) : - coeff m (truncation n f) = 0 := if_neg (not_le.mpr h) - -lemma truncation_add (n : ℕ) (f g : JetRing) : - truncation n (f + g) = truncation n f + truncation n g := by - ext m - by_cases hm : Finsupp.degree m ≤ n - · rw [coeff_truncation_of_le hm, map_add, map_add, - coeff_truncation_of_le hm, coeff_truncation_of_le hm] - · rw [coeff_truncation_of_gt (not_le.mp hm), map_add, - coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm), add_zero] - -lemma truncation_sum {ι : Type} (n : ℕ) (s : Finset ι) (f : ι → JetRing) : - truncation n (∑ i ∈ s, f i) = ∑ i ∈ s, truncation n (f i) := - map_sum (AddMonoidHom.mk' (truncation n) (truncation_add n)) f s - -/-- Truncation of a product only sees the factors through their truncations: the - coefficients of `f * g` in degree at most `n` involve only coefficients of `f` - and `g` in degree at most `n`. -/ -lemma truncation_mul (n : ℕ) (f g : JetRing) : - truncation n (f * g) = truncation n (truncation n f * truncation n g) := by - ext m - by_cases hm : Finsupp.degree m ≤ n - · rw [coeff_truncation_of_le hm, coeff_truncation_of_le hm, coeff_mul, coeff_mul] - refine Finset.sum_congr rfl fun p hp => ?_ - have hpq : p.1 + p.2 = m := Finset.mem_antidiagonal.mp hp - have h1 : Finsupp.degree p.1 ≤ n := by - refine le_trans ?_ hm - rw [← hpq, map_add] - exact Nat.le_add_right _ _ - have h2 : Finsupp.degree p.2 ≤ n := by - refine le_trans ?_ hm - rw [← hpq, map_add] - exact Nat.le_add_left _ _ - rw [coeff_truncation_of_le h1, coeff_truncation_of_le h2] - · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm)] - -/-- The congruence principle for truncated products. -/ -lemma truncation_mul_congr {n : ℕ} {f f' g g' : JetRing} - (hf : truncation n f = truncation n f') (hg : truncation n g = truncation n g') : - truncation n (f * g) = truncation n (f' * g') := by - rw [truncation_mul, hf, hg, ← truncation_mul] - -lemma truncation_star (n : ℕ) (f : JetRing) : - truncation n (star f) = star (truncation n f) := by - ext m - by_cases hm : Finsupp.degree m ≤ n - · rw [coeff_truncation_of_le hm, coeff_star, coeff_star, coeff_truncation_of_le hm] - · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_star, - coeff_truncation_of_gt (not_le.mp hm), star_zero] - -/-- Entrywise truncation of a matrix product only sees the factors through their - entrywise truncations. -/ -lemma matrix_truncation_mul {κ : Type} [Fintype κ] [DecidableEq κ] (n : ℕ) - (A B : Matrix κ κ JetRing) : - (A * B).map (truncation n) = - (A.map (truncation n) * B.map (truncation n)).map (truncation n) := by - ext i j : 1 - simp only [Matrix.map_apply, Matrix.mul_apply] - rw [truncation_sum, truncation_sum] - exact Finset.sum_congr rfl fun k _ => truncation_mul n _ _ - -/-- The congruence principle for entrywise-truncated matrix products. -/ -lemma matrix_truncation_mul_congr {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} - {A A' B B' : Matrix κ κ JetRing} - (hA : A.map (truncation n) = A'.map (truncation n)) - (hB : B.map (truncation n) = B'.map (truncation n)) : - (A * B).map (truncation n) = (A' * B').map (truncation n) := by - rw [matrix_truncation_mul, hA, hB, ← matrix_truncation_mul] - -lemma matrix_truncation_star {κ : Type} [Fintype κ] [DecidableEq κ] (n : ℕ) - (A : Matrix κ κ JetRing) : - (star A).map (truncation n) = star (A.map (truncation n)) := by - ext i j : 1 - simp only [Matrix.map_apply, Matrix.star_apply] - exact truncation_star n (A j i) - -@[simp] -lemma truncation_zero (n : ℕ) : truncation n (0 : JetRing) = 0 := by - ext m - by_cases hm : Finsupp.degree m ≤ n - · rw [coeff_truncation_of_le hm] - · rw [coeff_truncation_of_gt (not_le.mp hm), map_zero] - -/-- Truncation fixes the identity: a constant series has its only nonzero Taylor - coefficient in degree zero, which every truncation keeps. -/ -@[simp] -lemma truncation_one (n : ℕ) : truncation n (1 : JetRing) = 1 := by - ext m - by_cases hm : Finsupp.degree m ≤ n - · rw [coeff_truncation_of_le hm] - · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_one, - if_neg (by rintro rfl; simp at hm)] - -/-- Two jets have the same zeroth truncation exactly when they have the same - value at the base point. -/ -lemma truncation_zero_eq_iff {f g : JetRing} : - truncation 0 f = truncation 0 g ↔ constantCoeff f = constantCoeff g := by - constructor - · intro h - simpa using congrArg (coeff (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) h - · intro h - ext m - by_cases hm : Finsupp.degree m ≤ 0 - · have hm0 : m = 0 := (Finsupp.degree_eq_zero_iff m).mp (Nat.le_zero.mp hm) - subst hm0 - simpa using h - · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm)] - -/-! - -### Parallel transport - -The formal Frobenius theorem for the jet ring: a flat family of matrices `A_μ` is -the logarithmic derivative `(∂_μ F) F⁻¹` of a formal fundamental solution `F`, -unique once its value at the base point is fixed. Uniqueness is the vanishing -principle for first-order linear systems; existence is the Euler (radial) -recursion, with flatness entering to make the radial solution solve every -direction. - --/ - -/-- The vanishing principle for first-order linear systems of jets: a matrix of - jets vanishing at the base point and satisfying a linear first-order system - `∂_μ F = A_μ F + F B_μ` vanishes identically. Each Taylor coefficient of `F` is - determined by the coefficients of strictly smaller degree through the system, - so all vanish by strong induction on the degree. - - This is the uniqueness half of the formal Frobenius theorem - (`JetRing.exists_parallelTransport`); the two-sided form with independent - left and right coefficients also yields unitarity of parallel transport along - an anti-hermitian connection, applied to `F Fᴴ − 1`. -/ -lemma matrix_eq_zero_of_pderiv_eq_mul_add_mul {κ : Type} [Fintype κ] [DecidableEq κ] - {F : Matrix κ κ JetRing} (A B : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing) - (h0 : (constantCoeff : JetRing →+* ℂ).mapMatrix F = 0) - (hF : ∀ μ, F.map (pderiv ℂ μ) = A μ * F + F * B μ) : - F = 0 := by - sorry - -/-- A flat gauge field is pure gauge, at the level of jets: if `A_μ` has vanishing - field strength, `∂_μ A_ν − ∂_ν A_μ − [A_μ, A_ν] = 0`, then `A_μ = (∂_μ F) F⁻¹` - for a Wilson line `F` based at the identity: `∂_μ F = A_μ F` with `F(0) = 1`. - Here a Wilson line means the parallel transport of `A` from the base point — - the path-ordered exponential `P exp(∫ A_μ dx^μ)`, path-independent since `A` is - flat. `F` is built order-by-order in its Taylor expansion; it is unique by - `JetRing.matrix_eq_zero_of_pderiv_eq_mul_add_mul`. -/ -lemma exists_parallelTransport {κ : Type} [Fintype κ] [DecidableEq κ] - (A : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing) - (hA : ∀ μ ν, (A ν).map (pderiv ℂ μ) - (A μ).map (pderiv ℂ ν) = - A μ * A ν - A ν * A μ) : - ∃ F : Matrix κ κ JetRing, (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 ∧ - ∀ μ, F.map (pderiv ℂ μ) = A μ * F := by - open Finsupp Finset in - set B : Matrix κ κ JetRing := ∑ ρ, (X ρ : JetRing) • A ρ with hB - have hBlow : ∀ (M N : Matrix κ κ JetRing) p, (∀ i j q, degree q < degree p → - coeff q (M i j) = coeff q (N i j)) → - ∀ i j, coeff p ((B * M) i j) = coeff p ((B * N) i j) := fun M N p h i j => by - simp only [Matrix.mul_apply, map_sum, coeff_mul] - refine Finset.sum_congr rfl fun k _ => Finset.sum_congr rfl fun q hq => ?_ - rcases eq_or_ne q.1 0 with h1 | h1 - · rw [h1, coeff_zero_eq_constantCoeff, show constantCoeff (B i k) = 0 from by - simp [hB, Matrix.sum_apply, Matrix.smul_apply, smul_eq_mul, constantCoeff_X], - zero_mul, zero_mul] - · have h4 : degree q.1 + degree q.2 = degree p := by rw [← map_add, mem_antidiagonal.mp hq] - have h3 := Nat.pos_of_ne_zero fun hc => h1 ((degree_eq_zero_iff _).mp hc) - rw [h _ _ _ (by omega)] - set T : Matrix κ κ JetRing → Matrix κ κ JetRing := fun M => 1 + (B * M).map fun f => - show JetRing from fun m => if m = 0 then 0 else ((degree m : ℕ) : ℂ)⁻¹ * f m with hT - set F : Matrix κ κ JetRing := - Matrix.of fun i j => show JetRing from fun m => (T^[degree m + 1] 1) i j m with hFd - have hFco : ∀ p i j, coeff p (F i j) = coeff p ((T^[degree p + 1] 1) i j) := fun _ _ _ => rfl - have hTco : ∀ (M : Matrix κ κ JetRing) i j p, - coeff p ((T M) i j) = coeff p ((1 : Matrix κ κ JetRing) i j) + - if p = 0 then 0 else ((degree p : ℕ) : ℂ)⁻¹ * coeff p ((B * M) i j) := - fun M i j p => by simp only [hT]; rw [Matrix.add_apply, map_add, Matrix.map_apply]; rfl - have hmain : ∀ n p, degree p = n → ∀ k, n < k → ∀ i j, - coeff p ((T^[k] 1) i j) = coeff p ((T F) i j) := fun n => by - induction n using Nat.strong_induction_on with - | _ n ih => - intro p hp k hk i j; obtain ⟨k, rfl⟩ : ∃ k', k = k' + 1 := ⟨k - 1, by omega⟩ - rw [Function.iterate_succ_apply', hTco, hTco]; rcases eq_or_ne p 0 with h0 | h0 - · rw [if_pos h0, if_pos h0] - · rw [if_neg h0, if_neg h0, hBlow _ F _ (fun i' j' q hq => ?_) i j] - rw [hFco, ih (degree q) (hp ▸ hq) q rfl k (by omega) i' j', - ih (degree q) (hp ▸ hq) q rfl (degree q + 1) (by omega) i' j'] - have hkey := fun p (i j : κ) => (hFco p i j).trans (hmain _ p rfl _ (Nat.lt_succ_self _) i j) - have hFone : (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 := by - ext i j; simpa [hTco, Matrix.one_apply, apply_ite, coeff_one] using hkey 0 i j - have hEco : ∀ (M : Matrix κ κ JetRing) p i j, - coeff p ((∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = - ((degree p : ℕ) : ℂ) * coeff p (M i j) := fun M p i j => by - have ht : ∀ ρ, coeff p (((X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = - (p ρ : ℂ) * coeff p (M i j) := fun ρ => by - rw [Matrix.smul_apply, Matrix.map_apply, smul_eq_mul, - show (X ρ : JetRing) = monomial (single ρ 1) 1 from rfl, coeff_monomial_mul] - by_cases h : single ρ 1 ≤ p - · have hρ : 1 ≤ p ρ := by simpa using single_le_iff.mp h - rw [if_pos h, one_mul, coeff_pderiv, tsub_add_cancel_of_le h, tsub_apply, - single_eq_same, Nat.cast_sub hρ]; push_cast; ring - · have hρ : p ρ = 0 := by by_contra hc; exact h (single_le_iff.mpr (by omega)) - rw [if_neg h, hρ]; simp - rw [Matrix.sum_apply, map_sum, Finset.sum_congr rfl fun ρ _ => ht ρ, ← Finset.sum_mul, - ← Nat.cast_sum, ← degree_eq_sum] - have hleib : ∀ ρ (M N : Matrix κ κ JetRing), (M * N).map (pderiv ℂ ρ) = - M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := fun ρ M N => by - ext i j : 1; simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, - Derivation.leibniz, smul_eq_mul] - exact (Finset.sum_congr rfl fun k _ => by ring).trans sum_add_distrib - set G := fun ν : Fin 1 ⊕ Fin 3 => F.map (pderiv ℂ ν) - A ν * F with hG - have hstar : ∀ μ ν, (G ν).map (pderiv ℂ μ) = - (G μ).map (pderiv ℂ ν) + (A μ * G ν - A ν * G μ) := fun μ ν => by - have hcm : ∀ (M : Matrix κ κ JetRing), (M.map (pderiv ℂ ν)).map (pderiv ℂ μ) = - (M.map (pderiv ℂ μ)).map (pderiv ℂ ν) := - fun M => Matrix.ext fun _ _ => pderiv_comm _ _ _ - simp only [hG] - rw [Matrix.map_sub _ (fun a b => map_sub _ a b), Matrix.map_sub _ (fun a b => map_sub _ a b), - hcm, hleib μ (A ν) F, hleib ν (A μ) F, sub_eq_iff_eq_add.mp (hA μ ν)] - noncomm_ring - have hG0 : (∑ ρ, (X ρ : JetRing) • G ρ) = 0 := by - have h1 : (∑ ρ, (X ρ : JetRing) • G ρ) = - (∑ ρ, (X ρ : JetRing) • F.map (pderiv ℂ ρ)) - B * F := by - rw [hB, Finset.sum_mul, ← sum_sub_distrib] - exact Finset.sum_congr rfl fun ρ _ => by rw [hG]; rw [smul_sub, Matrix.smul_mul] - rw [h1, sub_eq_zero]; ext i j : 1; ext p; rw [hEco] - rcases eq_or_ne p 0 with rfl | h0 - · have h := hBlow F 0 0 (fun _ _ q hq => absurd hq (by simp)) i j - simp only [mul_zero, Matrix.zero_apply, map_zero] at h; simp [h] - · rw [hkey p i j, hTco, show coeff p ((1 : Matrix κ κ JetRing) i j) = 0 from by - simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, if_neg h0, ← mul_assoc, - mul_inv_cancel₀ (Nat.cast_ne_zero.mpr fun hc => h0 ((degree_eq_zero_iff p).mp hc)), - one_mul] - have hS2 : ∀ ν, (∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν)) = - G ν := by - intro ν - have hmap : ((∑ ρ, (X ρ : JetRing) • G ρ).map (pderiv ℂ ν)) = - G ν + ∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν) := by - ext i j : 1; simp only [Matrix.map_apply, Matrix.sum_apply, Matrix.smul_apply, - smul_eq_mul, map_sum, Derivation.leibniz, Matrix.add_apply] - rw [sum_add_distrib, sum_eq_single_of_mem (f := fun ρ => G ρ i j * pderiv ℂ ν (X ρ)) - ν (mem_univ ν) fun b _ hb => by rw [pderiv_X_of_ne hb, mul_zero]] - rw [pderiv_X_self, mul_one]; exact add_comm _ _ - rw [hG0, Matrix.map_zero _ (map_zero _)] at hmap - exact eq_neg_of_add_eq_zero_right hmap.symm - have halg : ∀ ν p i j, - (((degree p : ℕ) : ℂ) + 1) * coeff p (G ν i j) = coeff p ((B * G ν) i j) := by - intro ν p i j; have hs1 : (∑ ρ, (X ρ : JetRing) • (G ν).map (pderiv ℂ ρ)) = - (∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν)) + - (B * G ν - A ν * ∑ ρ, (X ρ : JetRing) • G ρ) := by - rw [Finset.sum_congr rfl fun ρ _ => congrArg ((X ρ : JetRing) • ·) (hstar ρ ν)] - simp only [smul_add, smul_sub, sum_add_distrib, sum_sub_distrib] - congr 1; congr 1 - · rw [hB, Finset.sum_mul]; exact Finset.sum_congr rfl fun _ _ => (Matrix.smul_mul _ _ _).symm - · rw [Finset.mul_sum]; exact Finset.sum_congr rfl fun _ _ => (Matrix.mul_smul _ _ _).symm - rw [hG0, mul_zero, sub_zero, hS2] at hs1 - have h := congrArg (fun M => coeff p (M i j)) hs1 - simp only [Matrix.add_apply, Matrix.neg_apply, map_add, map_neg] at h - rw [hEco] at h; linear_combination h - have hzero : ∀ ν, G ν = 0 := fun ν => by - have hm : ∀ n q, degree q = n → ∀ i j, coeff q (G ν i j) = 0 := fun n => by - induction n using Nat.strong_induction_on with - | _ n ih => - intro q hq i j; have h := halg ν q i j - rw [hBlow (G ν) 0 q (fun i' j' r hr => by - rw [ih (degree r) (hq ▸ hr) r rfl i' j', Matrix.zero_apply, map_zero]) i j, - mul_zero] at h - simp only [Matrix.zero_apply, map_zero] at h - exact (mul_eq_zero.mp h).resolve_left (by exact_mod_cast Nat.succ_ne_zero (degree q)) - ext i j : 1; ext p; rw [hm (degree p) p rfl i j, Matrix.zero_apply, map_zero] - exact ⟨F, hFone, fun ν => sub_eq_zero.mp (hzero ν)⟩ - -end JetRing - -/-! - ## B. The complex derivative algebra -/ diff --git a/Physlib/Relativity/JetRing/Basic.lean b/Physlib/Relativity/JetRing/Basic.lean new file mode 100644 index 000000000..c6ddfe870 --- /dev/null +++ b/Physlib/Relativity/JetRing/Basic.lean @@ -0,0 +1,415 @@ +/- +Copyright (c) 2026 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 Mathlib.Data.Complex.Basic +public import Mathlib.LinearAlgebra.Complex.Module +public import Mathlib.Algebra.Star.BigOperators +public import Mathlib.Tactic.LinearCombination +public import Mathlib.RingTheory.MvPowerSeries.Basic +public import Mathlib.Data.Finsupp.Multiset +public import Mathlib.Data.Finsupp.Weight +public import Physlib.Mathematics.MvPowerSeriesDerivative +/-! +# The jet ring + +The ring `JetRing` of formal power series in the four spacetime coordinates, in +which jets of fields and of gauge transformations at a spacetime point are valued. + +This file contains the definition of `JetRing`, its star structure, first-order +coefficient identities, the formal partial derivative, and the truncation of jets. +Results about matrices over `JetRing` are in +`Physlib.Relativity.JetRing.Matrix`. +-/ + +@[expose] public section +/-! + +## A. The Jet ring + +-/ + +/-- The ring of formal power series in the four spacetime coordinates, with complex + coefficients. Jets of fields and of gauge transformations at a spacetime point are + valued in this ring. The star operation is coefficientwise complex conjugation, so + the spacetime coordinates themselves are self-adjoint. -/ +abbrev JetRing : Type := MvPowerSeries (Fin 1 ⊕ Fin 3) ℂ + +/-! + +### A.1. The star structure on the jet ring + +The star operation on the jet ring is coefficientwise complex conjugation, fixing +the formal variables. In particular the spacetime coordinates are self-adjoint. + +-/ + +namespace JetRing + +open MvPowerSeries + +instance : Star JetRing where + star f := fun n => star (f n) + +@[simp] +lemma coeff_star (n : (Fin 1 ⊕ Fin 3) →₀ ℕ) (f : JetRing) : + coeff n (star f) = star (coeff n f) := rfl + +instance : StarRing JetRing where + star_involutive f := funext fun n => star_star (f n) + star_add f g := funext fun n => star_add (f n) (g n) + star_mul f g := by + have h : ∀ a b : JetRing, star (a * b) = star a * star b := by + intro a b + ext n + classical + rw [coeff_star, coeff_mul, coeff_mul, star_sum] + exact Finset.sum_congr rfl fun p _ => by rw [star_mul', coeff_star, coeff_star] + rw [h, mul_comm] + +/-- Real scalars commute with the coefficientwise conjugation. -/ +instance : StarModule ℝ JetRing where + star_smul r f := funext fun n => star_smul r (f n) + +/-- Complex scalars conjugate under the coefficientwise conjugation. -/ +instance : StarModule ℂ JetRing where + star_smul c f := funext fun n => star_smul c (f n) + +@[simp] +lemma constantCoeff_star (f : JetRing) : + constantCoeff (star f) = star (constantCoeff f) := rfl + +@[simp] +lemma star_C (a : ℂ) : + star (C a : JetRing) = C (star a) := by + ext n + classical + rw [coeff_star, coeff_C, coeff_C] + split_ifs <;> simp + +/-- The first-order Leibniz rule: the degree-one Taylor coefficient, in the + direction `μ`, of a product of jets. This is the coefficient-level statement + that the first jet of a product is given by the product rule. -/ +lemma coeff_single_one_mul (μ : Fin 1 ⊕ Fin 3) (f g : JetRing) : + coeff (Finsupp.single μ 1) (f * g) = + coeff (Finsupp.single μ 1) f * constantCoeff g + + constantCoeff f * coeff (Finsupp.single μ 1) g := by + classical + rw [coeff_mul, Finsupp.antidiagonal_single, + show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, Finset.map_insert, + Finset.map_singleton, Finset.sum_insert (by simp [Finsupp.single_eq_zero]), + Finset.sum_singleton] + simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, + Finsupp.single_zero, coeff_zero_eq_constantCoeff] + ring + +/-- The first-order power rule: the degree-one Taylor coefficient, in the direction + `μ`, of a power of a jet. -/ +lemma coeff_single_one_pow (μ : Fin 1 ⊕ Fin 3) (f : JetRing) (n : ℕ) : + coeff (Finsupp.single μ 1) (f ^ n) = + (n : ℂ) * constantCoeff f ^ (n - 1) * coeff (Finsupp.single μ 1) f := by + classical + induction n with + | zero => + simp [coeff_one, Finsupp.single_eq_zero] + | succ n ih => + rw [pow_succ, coeff_single_one_mul, ih, map_pow, Nat.add_sub_cancel] + rcases Nat.eq_zero_or_pos n with hn | hn + · subst hn + simp + · have hpow : constantCoeff f ^ (n - 1) * constantCoeff f = constantCoeff f ^ n := by + rw [← pow_succ, Nat.sub_add_cancel hn] + push_cast + linear_combination ((n : ℂ) * coeff (Finsupp.single μ 1) f) * hpow + +/-! + +### A.2. The formal partial derivative on the jet ring + +-/ + +/-- The formal partial derivative commutes with the coefficientwise star. -/ +lemma pderiv_star (ν : Fin 1 ⊕ Fin 3) (f : JetRing) : + pderiv ℂ ν (star f) = star (pderiv ℂ ν f) := by + ext s + rw [coeff_pderiv, coeff_star, coeff_star, coeff_pderiv, star_mul'] + congr 1 + simp + +/-- Formal partial derivatives commute. -/ +lemma pderiv_comm (μ ν : Fin 1 ⊕ Fin 3) (f : JetRing) : + pderiv ℂ μ (pderiv ℂ ν f) = pderiv ℂ ν (pderiv ℂ μ f) := by + classical + ext s + rw [coeff_pderiv, coeff_pderiv, coeff_pderiv, coeff_pderiv, + show s + Finsupp.single μ 1 + Finsupp.single ν 1 = + s + Finsupp.single ν 1 + Finsupp.single μ 1 from by + rw [add_assoc, add_assoc, add_comm (Finsupp.single μ 1)]] + rcases eq_or_ne μ ν with rfl | h + · rfl + · rw [Finsupp.add_apply, Finsupp.add_apply, Finsupp.single_eq_of_ne h.symm, + Finsupp.single_eq_of_ne h] + push_cast + ring + +/-- Application of `pderiv` is right-commutative, since formal partial derivatives + commute (`JetRing.pderiv_comm`). This allows iterating them over a `Multiset` of + directions. -/ +instance : RightCommutative (fun (f : JetRing) (μ : Fin 1 ⊕ Fin 3) => pderiv ℂ μ f) where + right_comm f μ ν := JetRing.pderiv_comm ν μ f + +/-- Iterated formal derivatives over a multiset commute with a single derivative. -/ +lemma foldl_pderiv_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (f : JetRing) : + s.foldl (fun f ρ => pderiv ℂ ρ f) (pderiv ℂ μ f) = + pderiv ℂ μ (s.foldl (fun f ρ => pderiv ℂ ρ f) f) := by + induction s using Multiset.induction_on generalizing f with + | empty => simp + | cons a t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, JetRing.pderiv_comm, ih] + +/-! + +### Truncation of jets + +-/ +/-- The `n`-th truncation of a jet: the Taylor coefficients of total degree + greater than `n` are set to zero. -/ +noncomputable def truncation (n : ℕ) (f : JetRing) : JetRing := + fun m => if Finsupp.degree m ≤ n then f m else 0 + +@[simp] +lemma coeff_truncation_of_le {n : ℕ} {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} + (h : Finsupp.degree m ≤ n) (f : JetRing) : + coeff m (truncation n f) = coeff m f := if_pos h + +@[simp] +lemma coeff_truncation_of_gt {n : ℕ} {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} + (h : n < Finsupp.degree m) (f : JetRing) : + coeff m (truncation n f) = 0 := if_neg (not_le.mpr h) + +lemma truncation_add (n : ℕ) (f g : JetRing) : + truncation n (f + g) = truncation n f + truncation n g := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm, map_add, map_add, + coeff_truncation_of_le hm, coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), map_add, + coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm), add_zero] + +lemma truncation_sum {ι : Type} (n : ℕ) (s : Finset ι) (f : ι → JetRing) : + truncation n (∑ i ∈ s, f i) = ∑ i ∈ s, truncation n (f i) := + map_sum (AddMonoidHom.mk' (truncation n) (truncation_add n)) f s + +/-- Truncation of a product only sees the factors through their truncations: the + coefficients of `f * g` in degree at most `n` involve only coefficients of `f` + and `g` in degree at most `n`. -/ +lemma truncation_mul (n : ℕ) (f g : JetRing) : + truncation n (f * g) = truncation n (truncation n f * truncation n g) := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm, coeff_truncation_of_le hm, coeff_mul, coeff_mul] + refine Finset.sum_congr rfl fun p hp => ?_ + have hpq : p.1 + p.2 = m := Finset.mem_antidiagonal.mp hp + have h1 : Finsupp.degree p.1 ≤ n := by + refine le_trans ?_ hm + rw [← hpq, map_add] + exact Nat.le_add_right _ _ + have h2 : Finsupp.degree p.2 ≤ n := by + refine le_trans ?_ hm + rw [← hpq, map_add] + exact Nat.le_add_left _ _ + rw [coeff_truncation_of_le h1, coeff_truncation_of_le h2] + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm)] + +/-- The congruence principle for truncated products. -/ +lemma truncation_mul_congr {n : ℕ} {f f' g g' : JetRing} + (hf : truncation n f = truncation n f') (hg : truncation n g = truncation n g') : + truncation n (f * g) = truncation n (f' * g') := by + rw [truncation_mul, hf, hg, ← truncation_mul] + +lemma truncation_star (n : ℕ) (f : JetRing) : + truncation n (star f) = star (truncation n f) := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm, coeff_star, coeff_star, coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_star, + coeff_truncation_of_gt (not_le.mp hm), star_zero] +@[simp] +lemma truncation_zero (n : ℕ) : truncation n (0 : JetRing) = 0 := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), map_zero] + +/-- Truncation fixes the identity: a constant series has its only nonzero Taylor + coefficient in degree zero, which every truncation keeps. -/ +@[simp] +lemma truncation_one (n : ℕ) : truncation n (1 : JetRing) = 1 := by + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [coeff_truncation_of_le hm] + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_one, + if_neg (by rintro rfl; simp at hm)] + +/-- Two jets have the same zeroth truncation exactly when they have the same + value at the base point. -/ +lemma truncation_zero_eq_iff {f g : JetRing} : + truncation 0 f = truncation 0 g ↔ constantCoeff f = constantCoeff g := by + constructor + · intro h + simpa using congrArg (coeff (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) h + · intro h + ext m + by_cases hm : Finsupp.degree m ≤ 0 + · have hm0 : m = 0 := (Finsupp.degree_eq_zero_iff m).mp (Nat.le_zero.mp hm) + subst hm0 + simpa using h + · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_truncation_of_gt (not_le.mp hm)] + + +/-! + +## The Euler operator toolkit + +-/ + +/-- The formal coordinates of the jet ring are self-adjoint. -/ +lemma star_X (ρ : Fin 1 ⊕ Fin 3) : star (X ρ : JetRing) = X ρ := by + ext m + rw [JetRing.coeff_star, show (X ρ : JetRing) = monomial (Finsupp.single ρ 1) 1 from rfl, + coeff_monomial] + split_ifs <;> simp + +/-- The Taylor coefficients of a jet multiplied by a formal coordinate: the + coefficient shifts down by one in that direction. -/ +lemma coeff_X_smul (ρ : Fin 1 ⊕ Fin 3) (f : JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + coeff p ((X ρ : JetRing) • f) = + if Finsupp.single ρ 1 ≤ p then coeff (p - Finsupp.single ρ 1) f else 0 := by + rw [smul_eq_mul, show (X ρ : JetRing) = monomial (Finsupp.single ρ 1) 1 from rfl, + coeff_monomial_mul] + split_ifs <;> simp + +/-- The Euler (radial) operator acts on Taylor coefficients as multiplication by the + total degree. -/ +lemma coeff_sum_X_smul_pderiv (f : JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + coeff p (∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f) = + ((Finsupp.degree p : ℕ) : ℂ) * coeff p f := by + classical + rw [map_sum] + have ht : ∀ ρ, coeff p ((X ρ : JetRing) • pderiv ℂ ρ f) = (p ρ : ℂ) * coeff p f := by + intro ρ + rw [coeff_X_smul] + by_cases h : Finsupp.single ρ 1 ≤ p + · have hρ : 1 ≤ p ρ := by simpa using Finsupp.single_le_iff.mp h + rw [if_pos h, coeff_pderiv, tsub_add_cancel_of_le h, Finsupp.coe_tsub, Pi.sub_apply, + Finsupp.single_eq_same, Nat.cast_sub hρ] + push_cast + ring + · have hρ : p ρ = 0 := by + by_contra hc + exact h (Finsupp.single_le_iff.mpr (by omega)) + rw [if_neg h, hρ] + simp + rw [Finset.sum_congr rfl fun ρ _ => ht ρ, ← Finset.sum_mul, ← Nat.cast_sum, + ← Finsupp.degree_eq_sum] + +/-- The scalar vanishing principle for the Euler operator: a jet vanishing at the base + point that is killed by the Euler operator is zero. -/ +lemma eq_zero_of_sum_X_smul_pderiv_eq_zero {f : JetRing} (h0 : constantCoeff f = 0) + (hf : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f = 0) : f = 0 := by + ext p + rcases eq_or_ne p 0 with rfl | hp + · simpa [coeff_zero_eq_constantCoeff] using h0 + · have h := congrArg (coeff p) hf + rw [coeff_sum_X_smul_pderiv, map_zero] at h + have hne : ((Finsupp.degree p : ℕ) : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr fun hc => hp ((Finsupp.degree_eq_zero_iff p).mp hc) + simpa using (mul_eq_zero.mp h).resolve_left hne + +/-! + +## Multiset derivative bookkeeping + +-/ + +/-- The base-point value of an iterated formal derivative is the corresponding Taylor + coefficient with the factorial normalization. -/ +lemma constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + constantCoeff (s.foldl (fun f ρ => pderiv ℂ ρ f) f) = + ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) * coeff s.toFinsupp f := by + induction s using Multiset.induction_on generalizing f with + | empty => simp [coeff_zero_eq_constantCoeff] + | cons a t ih => + rw [Multiset.foldl_cons, ih, coeff_pderiv] + have hfin : (a ::ₘ t).toFinsupp = t.toFinsupp + Finsupp.single a 1 := by + rw [show (a ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = {a} + t from + (Multiset.singleton_add a t).symm, map_add, Multiset.toFinsupp_singleton, add_comm] + have hfac : (∏ ν, Nat.factorial ((a ::ₘ t).count ν) : ℕ) = + (t.count a + 1) * ∏ ν, Nat.factorial (t.count ν) := by + rw [show (∏ ν, Nat.factorial ((a ::ₘ t).count ν) : ℕ) = + ∏ ν, ((if ν = a then t.count a + 1 else 1) * Nat.factorial (t.count ν)) from + Finset.prod_congr rfl fun ν _ => by + rcases eq_or_ne ν a with rfl | h + · rw [Multiset.count_cons_self, Nat.factorial_succ, if_pos rfl] + · rw [Multiset.count_cons_of_ne h, if_neg h, one_mul], + Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ a] + simp + rw [hfin, hfac, Multiset.toFinsupp_apply] + push_cast + ring + +/-- The key combinatorial identity behind the symmetrized Maurer–Cartan data: the sum + over a multiset `r` of base-point values of iterated derivatives of `g` in the + complementary directions is, up to factorials, the Taylor coefficient at `r` of the + radial contraction `∑ μ x_μ g_μ`. -/ +lemma sum_constantCoeff_foldl_erase (g : (Fin 1 ⊕ Fin 3) → JetRing) + (r : Multiset (Fin 1 ⊕ Fin 3)) : + (r.map fun μ => constantCoeff ((r.erase μ).foldl (fun f ρ => pderiv ℂ ρ f) (g μ))).sum = + ((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * + coeff r.toFinsupp (∑ μ, (X μ : JetRing) • g μ) := by + classical + rw [Finset.sum_multiset_map_count, + Finset.sum_subset (Finset.subset_univ r.toFinset) (fun x _ hx => by + rw [Multiset.count_eq_zero.mpr fun hmem => hx (Multiset.mem_toFinset.mpr hmem), + zero_smul]), + map_sum, Finset.mul_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [coeff_X_smul, constantCoeff_foldl_pderiv] + by_cases hμ : μ ∈ r + · rw [if_pos (Finsupp.single_le_iff.mpr (by + rw [Multiset.toFinsupp_apply] + exact Multiset.one_le_count_iff_mem.mpr hμ))] + have herase : (r.erase μ).toFinsupp = r.toFinsupp - Finsupp.single μ 1 := by + ext ν + rw [Multiset.toFinsupp_apply, Finsupp.coe_tsub, Pi.sub_apply, Multiset.toFinsupp_apply, + Finsupp.single_apply] + rcases eq_or_ne μ ν with rfl | h + · rw [Multiset.count_erase_self, if_pos rfl] + · rw [Multiset.count_erase_of_ne h.symm, if_neg h, Nat.sub_zero] + have hfac : r.count μ * ∏ ν, Nat.factorial ((r.erase μ).count ν) = + ∏ ν, Nat.factorial (r.count ν) := by + rw [← Finset.mul_prod_erase Finset.univ + (fun ν => Nat.factorial ((r.erase μ).count ν)) (Finset.mem_univ μ), + ← Finset.mul_prod_erase Finset.univ + (fun ν => Nat.factorial (r.count ν)) (Finset.mem_univ μ), + Multiset.count_erase_self, + Finset.prod_congr rfl fun ν hν => + congrArg Nat.factorial + (Multiset.count_erase_of_ne (Finset.mem_erase.mp hν).1 r), + ← mul_assoc, Nat.mul_factorial_pred (Multiset.count_pos.mpr hμ).ne'] + rw [herase, nsmul_eq_mul, ← mul_assoc, ← Nat.cast_mul, hfac] + · rw [if_neg fun hle => hμ (Multiset.one_le_count_iff_mem.mp (by + simpa [Multiset.toFinsupp_apply] using Finsupp.single_le_iff.mp hle)), + mul_zero, Multiset.count_eq_zero.mpr hμ, zero_smul] + +lemma degree_toFinsupp_eq_card (r : Multiset (Fin 1 ⊕ Fin 3)) : + Finsupp.degree (Multiset.toFinsupp r) = Multiset.card r := by + rw [Finsupp.degree_eq_sum, Finset.sum_congr rfl fun ν _ => Multiset.toFinsupp_apply r ν, + ← Finset.sum_subset (Finset.subset_univ r.toFinset) (fun x _ hx => + Multiset.count_eq_zero.mpr fun hmem => hx (Multiset.mem_toFinset.mpr hmem)), + Multiset.toFinset_sum_count_eq] + +end JetRing diff --git a/Physlib/Relativity/JetRing/Matrix.lean b/Physlib/Relativity/JetRing/Matrix.lean new file mode 100644 index 000000000..0efbccab6 --- /dev/null +++ b/Physlib/Relativity/JetRing/Matrix.lean @@ -0,0 +1,475 @@ +/- +Copyright (c) 2026 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.JetRing.Basic +public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +public import Mathlib.LinearAlgebra.Matrix.Adjugate +public import Mathlib.LinearAlgebra.Matrix.Trace +/-! +# Matrices over the jet ring + +Results about matrices with entries in `JetRing`: entrywise truncation of matrix +products, and the formal Frobenius theorem (parallel transport): a flat family of +matrices is the logarithmic derivative of a formal fundamental solution. +-/ + +@[expose] public section + +namespace JetRing + +open MvPowerSeries + +/-- Entrywise truncation of a matrix product only sees the factors through their + entrywise truncations. -/ +lemma matrix_truncation_mul {κ : Type} [Fintype κ] [DecidableEq κ] (n : ℕ) + (A B : Matrix κ κ JetRing) : + (A * B).map (truncation n) = + (A.map (truncation n) * B.map (truncation n)).map (truncation n) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply] + rw [truncation_sum, truncation_sum] + exact Finset.sum_congr rfl fun k _ => truncation_mul n _ _ + +/-- The congruence principle for entrywise-truncated matrix products. -/ +lemma matrix_truncation_mul_congr {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} + {A A' B B' : Matrix κ κ JetRing} + (hA : A.map (truncation n) = A'.map (truncation n)) + (hB : B.map (truncation n) = B'.map (truncation n)) : + (A * B).map (truncation n) = (A' * B').map (truncation n) := by + rw [matrix_truncation_mul, hA, hB, ← matrix_truncation_mul] + +lemma matrix_truncation_star {κ : Type} [Fintype κ] [DecidableEq κ] (n : ℕ) + (A : Matrix κ κ JetRing) : + (star A).map (truncation n) = star (A.map (truncation n)) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.star_apply] + exact truncation_star n (A j i) +/-! + +### Parallel transport + +The formal Frobenius theorem for the jet ring: a flat family of matrices `A_μ` is +the logarithmic derivative `(∂_μ F) F⁻¹` of a formal fundamental solution `F`, +unique once its value at the base point is fixed. Uniqueness is the vanishing +principle for first-order linear systems; existence is the Euler (radial) +recursion, with flatness entering to make the radial solution solve every +direction. + +-/ + + +/-- A flat gauge field is pure gauge, at the level of jets: if `A_μ` has vanishing + field strength, `∂_μ A_ν − ∂_ν A_μ − [A_μ, A_ν] = 0`, then `A_μ = (∂_μ F) F⁻¹` + for a Wilson line `F` based at the identity: `∂_μ F = A_μ F` with `F(0) = 1`. + Here a Wilson line means the parallel transport of `A` from the base point — + the path-ordered exponential `P exp(∫ A_μ dx^μ)`, path-independent since `A` is + flat. `F` is built order-by-order in its Taylor expansion; it is unique by + `JetRing.matrix_eq_zero_of_pderiv_eq_mul_add_mul`. -/ +lemma exists_parallelTransport {κ : Type} [Fintype κ] [DecidableEq κ] + (A : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing) + (hA : ∀ μ ν, (A ν).map (pderiv ℂ μ) - (A μ).map (pderiv ℂ ν) = + A μ * A ν - A ν * A μ) : + ∃ F : Matrix κ κ JetRing, (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 ∧ + ∀ μ, F.map (pderiv ℂ μ) = A μ * F := by + open Finsupp Finset in + set B : Matrix κ κ JetRing := ∑ ρ, (X ρ : JetRing) • A ρ with hB + have hBlow : ∀ (M N : Matrix κ κ JetRing) p, (∀ i j q, degree q < degree p → + coeff q (M i j) = coeff q (N i j)) → + ∀ i j, coeff p ((B * M) i j) = coeff p ((B * N) i j) := fun M N p h i j => by + simp only [Matrix.mul_apply, map_sum, coeff_mul] + refine Finset.sum_congr rfl fun k _ => Finset.sum_congr rfl fun q hq => ?_ + rcases eq_or_ne q.1 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, show constantCoeff (B i k) = 0 from by + simp [hB, Matrix.sum_apply, Matrix.smul_apply, smul_eq_mul, constantCoeff_X], + zero_mul, zero_mul] + · have h4 : degree q.1 + degree q.2 = degree p := by rw [← map_add, mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((degree_eq_zero_iff _).mp hc) + rw [h _ _ _ (by omega)] + set T : Matrix κ κ JetRing → Matrix κ κ JetRing := fun M => 1 + (B * M).map fun f => + show JetRing from fun m => if m = 0 then 0 else ((degree m : ℕ) : ℂ)⁻¹ * f m with hT + set F : Matrix κ κ JetRing := + Matrix.of fun i j => show JetRing from fun m => (T^[degree m + 1] 1) i j m with hFd + have hFco : ∀ p i j, coeff p (F i j) = coeff p ((T^[degree p + 1] 1) i j) := fun _ _ _ => rfl + have hTco : ∀ (M : Matrix κ κ JetRing) i j p, + coeff p ((T M) i j) = coeff p ((1 : Matrix κ κ JetRing) i j) + + if p = 0 then 0 else ((degree p : ℕ) : ℂ)⁻¹ * coeff p ((B * M) i j) := + fun M i j p => by simp only [hT]; rw [Matrix.add_apply, map_add, Matrix.map_apply]; rfl + have hmain : ∀ n p, degree p = n → ∀ k, n < k → ∀ i j, + coeff p ((T^[k] 1) i j) = coeff p ((T F) i j) := fun n => by + induction n using Nat.strong_induction_on with + | _ n ih => + intro p hp k hk i j; obtain ⟨k, rfl⟩ : ∃ k', k = k' + 1 := ⟨k - 1, by omega⟩ + rw [Function.iterate_succ_apply', hTco, hTco]; rcases eq_or_ne p 0 with h0 | h0 + · rw [if_pos h0, if_pos h0] + · rw [if_neg h0, if_neg h0, hBlow _ F _ (fun i' j' q hq => ?_) i j] + rw [hFco, ih (degree q) (hp ▸ hq) q rfl k (by omega) i' j', + ih (degree q) (hp ▸ hq) q rfl (degree q + 1) (by omega) i' j'] + have hkey := fun p (i j : κ) => (hFco p i j).trans (hmain _ p rfl _ (Nat.lt_succ_self _) i j) + have hFone : (constantCoeff : JetRing →+* ℂ).mapMatrix F = 1 := by + ext i j; simpa [hTco, Matrix.one_apply, apply_ite, coeff_one] using hkey 0 i j + have hEco : ∀ (M : Matrix κ κ JetRing) p i j, + coeff p ((∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = + ((degree p : ℕ) : ℂ) * coeff p (M i j) := fun M p i j => by + have ht : ∀ ρ, coeff p (((X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = + (p ρ : ℂ) * coeff p (M i j) := fun ρ => by + rw [Matrix.smul_apply, Matrix.map_apply, smul_eq_mul, + show (X ρ : JetRing) = monomial (single ρ 1) 1 from rfl, coeff_monomial_mul] + by_cases h : single ρ 1 ≤ p + · have hρ : 1 ≤ p ρ := by simpa using single_le_iff.mp h + rw [if_pos h, one_mul, coeff_pderiv, tsub_add_cancel_of_le h, tsub_apply, + single_eq_same, Nat.cast_sub hρ]; push_cast; ring + · have hρ : p ρ = 0 := by by_contra hc; exact h (single_le_iff.mpr (by omega)) + rw [if_neg h, hρ]; simp + rw [Matrix.sum_apply, map_sum, Finset.sum_congr rfl fun ρ _ => ht ρ, ← Finset.sum_mul, + ← Nat.cast_sum, ← degree_eq_sum] + have hleib : ∀ ρ (M N : Matrix κ κ JetRing), (M * N).map (pderiv ℂ ρ) = + M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := fun ρ M N => by + ext i j : 1; simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans sum_add_distrib + set G := fun ν : Fin 1 ⊕ Fin 3 => F.map (pderiv ℂ ν) - A ν * F with hG + have hstar : ∀ μ ν, (G ν).map (pderiv ℂ μ) = + (G μ).map (pderiv ℂ ν) + (A μ * G ν - A ν * G μ) := fun μ ν => by + have hcm : ∀ (M : Matrix κ κ JetRing), (M.map (pderiv ℂ ν)).map (pderiv ℂ μ) = + (M.map (pderiv ℂ μ)).map (pderiv ℂ ν) := + fun M => Matrix.ext fun _ _ => pderiv_comm _ _ _ + simp only [hG] + rw [Matrix.map_sub _ (fun a b => map_sub _ a b), Matrix.map_sub _ (fun a b => map_sub _ a b), + hcm, hleib μ (A ν) F, hleib ν (A μ) F, sub_eq_iff_eq_add.mp (hA μ ν)] + noncomm_ring + have hG0 : (∑ ρ, (X ρ : JetRing) • G ρ) = 0 := by + have h1 : (∑ ρ, (X ρ : JetRing) • G ρ) = + (∑ ρ, (X ρ : JetRing) • F.map (pderiv ℂ ρ)) - B * F := by + rw [hB, Finset.sum_mul, ← sum_sub_distrib] + exact Finset.sum_congr rfl fun ρ _ => by rw [hG]; rw [smul_sub, Matrix.smul_mul] + rw [h1, sub_eq_zero]; ext i j : 1; ext p; rw [hEco] + rcases eq_or_ne p 0 with rfl | h0 + · have h := hBlow F 0 0 (fun _ _ q hq => absurd hq (by simp)) i j + simp only [mul_zero, Matrix.zero_apply, map_zero] at h; simp [h] + · rw [hkey p i j, hTco, show coeff p ((1 : Matrix κ κ JetRing) i j) = 0 from by + simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, if_neg h0, ← mul_assoc, + mul_inv_cancel₀ (Nat.cast_ne_zero.mpr fun hc => h0 ((degree_eq_zero_iff p).mp hc)), + one_mul] + have hS2 : ∀ ν, (∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν)) = - G ν := by + intro ν + have hmap : ((∑ ρ, (X ρ : JetRing) • G ρ).map (pderiv ℂ ν)) = + G ν + ∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν) := by + ext i j : 1; simp only [Matrix.map_apply, Matrix.sum_apply, Matrix.smul_apply, + smul_eq_mul, map_sum, Derivation.leibniz, Matrix.add_apply] + rw [sum_add_distrib, sum_eq_single_of_mem (f := fun ρ => G ρ i j * pderiv ℂ ν (X ρ)) + ν (mem_univ ν) fun b _ hb => by rw [pderiv_X_of_ne hb, mul_zero]] + rw [pderiv_X_self, mul_one]; exact add_comm _ _ + rw [hG0, Matrix.map_zero _ (map_zero _)] at hmap + exact eq_neg_of_add_eq_zero_right hmap.symm + have halg : ∀ ν p i j, + (((degree p : ℕ) : ℂ) + 1) * coeff p (G ν i j) = coeff p ((B * G ν) i j) := by + intro ν p i j; have hs1 : (∑ ρ, (X ρ : JetRing) • (G ν).map (pderiv ℂ ρ)) = + (∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν)) + + (B * G ν - A ν * ∑ ρ, (X ρ : JetRing) • G ρ) := by + rw [Finset.sum_congr rfl fun ρ _ => congrArg ((X ρ : JetRing) • ·) (hstar ρ ν)] + simp only [smul_add, smul_sub, sum_add_distrib, sum_sub_distrib] + congr 1; congr 1 + · rw [hB, Finset.sum_mul]; exact Finset.sum_congr rfl fun _ _ => (Matrix.smul_mul _ _ _).symm + · rw [Finset.mul_sum]; exact Finset.sum_congr rfl fun _ _ => (Matrix.mul_smul _ _ _).symm + rw [hG0, mul_zero, sub_zero, hS2] at hs1 + have h := congrArg (fun M => coeff p (M i j)) hs1 + simp only [Matrix.add_apply, Matrix.neg_apply, map_add, map_neg] at h + rw [hEco] at h; linear_combination h + have hzero : ∀ ν, G ν = 0 := fun ν => by + have hm : ∀ n q, degree q = n → ∀ i j, coeff q (G ν i j) = 0 := fun n => by + induction n using Nat.strong_induction_on with + | _ n ih => + intro q hq i j; have h := halg ν q i j + rw [hBlow (G ν) 0 q (fun i' j' r hr => by + rw [ih (degree r) (hq ▸ hr) r rfl i' j', Matrix.zero_apply, map_zero]) i j, + mul_zero] at h + simp only [Matrix.zero_apply, map_zero] at h + exact (mul_eq_zero.mp h).resolve_left (by exact_mod_cast Nat.succ_ne_zero (degree q)) + ext i j : 1; ext p; rw [hm (degree p) p rfl i j, Matrix.zero_apply, map_zero] + exact ⟨F, hFone, fun ν => sub_eq_zero.mp (hzero ν)⟩ + + +/-! + +## The Euler operator toolkit on matrices + +-/ + +/-- Entrywise evaluation at the base point commutes with the conjugate transpose. -/ +lemma mapMatrix_constantCoeff_star {n : Type} [Fintype n] [DecidableEq n] + (A : Matrix n n JetRing) : + (constantCoeff : JetRing →+* ℂ).mapMatrix (star A) = + star ((constantCoeff : JetRing →+* ℂ).mapMatrix A) := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] + +/-- The Euler operator on matrices of jets acts entrywise on Taylor coefficients as + multiplication by the total degree. -/ +lemma coeff_sum_X_smul_map_pderiv {κ : Type} [Fintype κ] [DecidableEq κ] + (M : Matrix κ κ JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) (i j : κ) : + coeff p ((∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j) = + ((Finsupp.degree p : ℕ) : ℂ) * coeff p (M i j) := by + rw [show (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) i j + = ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (M i j) from by + rw [Matrix.sum_apply] + exact Finset.sum_congr rfl fun ρ _ => rfl] + exact coeff_sum_X_smul_pderiv (M i j) p + +/-- The vanishing principle for the Euler operator: a matrix of jets vanishing at the + base point and satisfying `E W = A W + W B` with `A`, `B` vanishing at the base point + is zero. Each Taylor coefficient of `W` is a multiple of coefficients of strictly + smaller degree, so all vanish by strong induction on the degree. -/ +lemma matrix_eq_zero_of_euler_eq_mul_add_mul {κ : Type} [Fintype κ] [DecidableEq κ] + {W : Matrix κ κ JetRing} (A B : Matrix κ κ JetRing) + (hA : ∀ i j, constantCoeff (A i j) = 0) (hB : ∀ i j, constantCoeff (B i j) = 0) + (h0 : ∀ i j, constantCoeff (W i j) = 0) + (hW : ∑ ρ, (X ρ : JetRing) • W.map (pderiv ℂ ρ) = A * W + W * B) : + W = 0 := by + classical + have hlow : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, + (∀ (i : κ) (j : κ) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), + Finsupp.degree q < Finsupp.degree p → coeff q (W i j) = 0) → + ∀ i j, coeff p ((A * W + W * B) i j) = 0 := by + intro p hp i j + have hAW : coeff p ((A * W) i j) = 0 := by + rw [Matrix.mul_apply, map_sum] + refine Finset.sum_eq_zero fun k _ => ?_ + rw [coeff_mul] + refine Finset.sum_eq_zero fun q hq => ?_ + rcases eq_or_ne q.1 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, hA, zero_mul] + · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by + rw [← map_add, Finset.mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) + rw [hp _ _ q.2 (by omega), mul_zero] + have hWB : coeff p ((W * B) i j) = 0 := by + rw [Matrix.mul_apply, map_sum] + refine Finset.sum_eq_zero fun k _ => ?_ + rw [coeff_mul] + refine Finset.sum_eq_zero fun q hq => ?_ + rcases eq_or_ne q.2 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, hB, mul_zero] + · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by + rw [← map_add, Finset.mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) + rw [hp _ _ q.1 (by omega), zero_mul] + rw [Matrix.add_apply, map_add, hAW, hWB, add_zero] + have hm : ∀ (n : ℕ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree p = n → + ∀ i j, coeff p (W i j) = 0 := by + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro p hp i j + rcases Nat.eq_zero_or_pos n with hn | hn + · have hp0 : p = 0 := (Finsupp.degree_eq_zero_iff _).mp (by omega) + rw [hp0, coeff_zero_eq_constantCoeff] + exact h0 i j + · have h : coeff p ((∑ ρ, (X ρ : JetRing) • W.map (pderiv ℂ ρ)) i j) = + coeff p ((A * W + W * B) i j) := congrArg (fun M => coeff p (M i j)) hW + rw [coeff_sum_X_smul_map_pderiv, + hlow p (fun i' j' q hq => ih (Finsupp.degree q) (by omega) q rfl i' j') i j] at h + have hne : ((Finsupp.degree p : ℕ) : ℂ) ≠ 0 := by + rw [hp] + exact_mod_cast hn.ne' + exact (mul_eq_zero.mp h).resolve_left hne + ext i j : 1 + ext p + rw [hm (Finsupp.degree p) p rfl i j] + simp + +/-- The Euler (radial) transport of a jet matrix `R` vanishing at the base point: + a fundamental solution of the radial system `E U = R U` based at the identity, + built order-by-order by the Euler recursion. -/ +lemma exists_matrix_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] + (R : Matrix κ κ JetRing) (hR0 : ∀ i j, constantCoeff (R i j) = 0) : + ∃ U : Matrix κ κ JetRing, (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1 ∧ + ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U := by + classical + have hRlow : ∀ (M N : Matrix κ κ JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), + (∀ (i : κ) (j : κ) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), + Finsupp.degree q < Finsupp.degree p → coeff q (M i j) = coeff q (N i j)) → + ∀ i j, coeff p ((R * M) i j) = coeff p ((R * N) i j) := fun M N p h i j => by + simp only [Matrix.mul_apply, map_sum, coeff_mul] + refine Finset.sum_congr rfl fun k _ => Finset.sum_congr rfl fun q hq => ?_ + rcases eq_or_ne q.1 0 with h1 | h1 + · rw [h1, coeff_zero_eq_constantCoeff, hR0, zero_mul, zero_mul] + · have h4 : Finsupp.degree q.1 + Finsupp.degree q.2 = Finsupp.degree p := by + rw [← map_add, Finset.mem_antidiagonal.mp hq] + have h3 := Nat.pos_of_ne_zero fun hc => h1 ((Finsupp.degree_eq_zero_iff _).mp hc) + rw [h _ _ _ (by omega)] + set T : Matrix κ κ JetRing → Matrix κ κ JetRing := fun M => 1 + (R * M).map fun f => + show JetRing from fun m => if m = 0 then 0 else ((Finsupp.degree m : ℕ) : ℂ)⁻¹ * f m + with hT + set U : Matrix κ κ JetRing := + Matrix.of fun i j => show JetRing from fun m => (T^[Finsupp.degree m + 1] 1) i j m with hUd + have hUco : ∀ (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) i j, + coeff p (U i j) = coeff p ((T^[Finsupp.degree p + 1] 1) i j) := fun _ _ _ => rfl + have hTco : ∀ (M : Matrix κ κ JetRing) i j (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), + coeff p ((T M) i j) = coeff p ((1 : Matrix κ κ JetRing) i j) + + if p = 0 then 0 else ((Finsupp.degree p : ℕ) : ℂ)⁻¹ * coeff p ((R * M) i j) := + fun M i j p => by + simp only [hT] + rw [Matrix.add_apply, map_add, Matrix.map_apply] + rfl + have hmain : ∀ (n : ℕ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree p = n → ∀ k, n < k → + ∀ i j, coeff p ((T^[k] 1) i j) = coeff p ((T U) i j) := fun n => by + induction n using Nat.strong_induction_on with + | _ n ih => + intro p hp k hk i j + obtain ⟨k, rfl⟩ : ∃ k', k = k' + 1 := ⟨k - 1, by omega⟩ + rw [Function.iterate_succ_apply', hTco, hTco] + rcases eq_or_ne p 0 with h0 | h0 + · rw [if_pos h0, if_pos h0] + · rw [if_neg h0, if_neg h0, hRlow _ U _ (fun i' j' q hq => ?_) i j] + rw [hUco, ih (Finsupp.degree q) (by omega) q rfl k (by omega) i' j', + ih (Finsupp.degree q) (by omega) q rfl (Finsupp.degree q + 1) (by omega) i' j'] + have hkey := fun (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) (i j : κ) => + (hUco p i j).trans (hmain _ p rfl _ (Nat.lt_succ_self _) i j) + have hUone : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1 := by + ext i j + simpa [hTco, Matrix.one_apply, apply_ite, coeff_one] using hkey 0 i j + refine ⟨U, hUone, ?_⟩ + ext i j : 1 + ext p + rw [coeff_sum_X_smul_map_pderiv] + rcases eq_or_ne p 0 with rfl | h0 + · rw [show ((Finsupp.degree (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) : ℕ) : ℂ) = 0 by simp, zero_mul] + rw [Matrix.mul_apply, map_sum] + exact (Finset.sum_eq_zero fun k _ => by + rw [coeff_zero_eq_constantCoeff, map_mul, hR0, zero_mul]).symm + · rw [hkey p i j, hTco, show coeff p ((1 : Matrix κ κ JetRing) i j) = 0 from by + simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, if_neg h0, ← mul_assoc, + mul_inv_cancel₀ (Nat.cast_ne_zero.mpr fun hc => h0 ((Finsupp.degree_eq_zero_iff p).mp hc)), + one_mul] + +/-! + +## Unitarity and determinant of the Euler transport + +-/ + +/-- The entrywise Leibniz rule for matrix products of jets. -/ +lemma matrix_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] (ρ : Fin 1 ⊕ Fin 3) + (M N : Matrix κ κ JetRing) : + (M * N).map (pderiv ℂ ρ) = M.map (pderiv ℂ ρ) * N + M * N.map (pderiv ℂ ρ) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + +/-- The Euler operator on matrices of jets is a derivation. -/ +lemma sum_X_smul_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] + (M N : Matrix κ κ JetRing) : + ∑ ρ, (X ρ : JetRing) • (M * N).map (pderiv ℂ ρ) = + (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) * N + + M * ∑ ρ, (X ρ : JetRing) • N.map (pderiv ℂ ρ) := by + rw [Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun ρ _ => ?_ + rw [matrix_map_pderiv_mul, smul_add, Matrix.smul_mul, Matrix.mul_smul] + +/-- The Euler operator commutes with the conjugate transpose. -/ +lemma sum_X_smul_map_pderiv_star {κ : Type} [Fintype κ] [DecidableEq κ] + (M : Matrix κ κ JetRing) : + ∑ ρ, (X ρ : JetRing) • (star M).map (pderiv ℂ ρ) = + star (∑ ρ, (X ρ : JetRing) • M.map (pderiv ℂ ρ)) := by + ext i j : 1 + simp only [Matrix.sum_apply, Matrix.star_apply, Matrix.smul_apply, Matrix.map_apply, + smul_eq_mul, star_sum, star_mul', star_X, ← JetRing.pderiv_star] + +/-- The Euler operator kills the identity matrix. -/ +lemma sum_X_smul_map_pderiv_one {κ : Type} [Fintype κ] [DecidableEq κ] : + ∑ ρ, (X ρ : JetRing) • (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) = 0 := by + refine Finset.sum_eq_zero fun ρ _ => ?_ + rw [show (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) = 0 from Matrix.ext fun i j => by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ ρ)], smul_zero] + +/-- A fundamental solution of the radial system `E U = R U` based at the identity is + unitary when `R` is anti-hermitian: `U U† − 1` vanishes at the base point and + satisfies a homogeneous linear radial system, so it vanishes identically. -/ +lemma eulerTransport_mul_star {κ : Type} [Fintype κ] [DecidableEq κ] + {R U : Matrix κ κ JetRing} (hRstar : star R = -R) + (hR0 : ∀ i j, constantCoeff (R i j) = 0) + (hU0 : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1) + (hEU : ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U) : + U * star U = 1 := by + have hEstar : ∑ ρ, (X ρ : JetRing) • (star U).map (pderiv ℂ ρ) = -(star U * R) := by + rw [sum_X_smul_map_pderiv_star, hEU, star_mul, hRstar, Matrix.mul_neg] + have hW0 : (constantCoeff : JetRing →+* ℂ).mapMatrix (U * star U - 1) = 0 := by + rw [map_sub, map_mul, mapMatrix_constantCoeff_star, hU0, star_one, + mul_one, map_one, sub_self] + have h0 : ∀ i j, constantCoeff ((U * star U - 1) i j) = 0 := fun i j => by + simpa [RingHom.mapMatrix_apply, Matrix.map_apply] using congrArg (fun M => M i j) hW0 + have hB : ∀ i j, constantCoeff ((-R) i j) = 0 := fun i j => by + simp [hR0 i j] + have hEW : ∑ ρ, (X ρ : JetRing) • (U * star U - 1).map (pderiv ℂ ρ) = + R * (U * star U - 1) + (U * star U - 1) * (-R) := by + have hsub : ∀ ρ : Fin 1 ⊕ Fin 3, (U * star U - 1).map (pderiv ℂ ρ) = + (U * star U).map (pderiv ℂ ρ) - (1 : Matrix κ κ JetRing).map (pderiv ℂ ρ) := + fun ρ => Matrix.ext fun i j => by simp [Matrix.map_apply] + simp only [hsub, smul_sub, Finset.sum_sub_distrib] + rw [sum_X_smul_map_pderiv_mul, hEU, hEstar, sum_X_smul_map_pderiv_one, sub_zero] + noncomm_ring + exact sub_eq_zero.mp (matrix_eq_zero_of_euler_eq_mul_add_mul R (-R) hR0 hB h0 hEW) + +/-- A fundamental solution of the radial system `E U = R U` based at the identity has + determinant one when `R` is traceless: by Jacobi's formula the determinant is killed + by the Euler operator, so it is the constant `1`. -/ +lemma eulerTransport_det {κ : Type} [Fintype κ] [DecidableEq κ] + {R U : Matrix κ κ JetRing} + (hjac : ∀ (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3), + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace) + (hRtr : R.trace = 0) + (hU0 : (constantCoeff : JetRing →+* ℂ).mapMatrix U = 1) + (hEU : ∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ) = R * U) : + U.det = 1 := by + have hEdet : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det = 0 := by + calc ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det + = ∑ ρ, (X ρ : JetRing) • (U.map (pderiv ℂ ρ) * U.adjugate).trace := by + exact Finset.sum_congr rfl fun ρ _ => by rw [hjac] + _ = ((∑ ρ, (X ρ : JetRing) • U.map (pderiv ℂ ρ)) * U.adjugate).trace := by + rw [Finset.sum_mul, Matrix.trace_sum] + exact Finset.sum_congr rfl fun ρ _ => by + rw [Matrix.smul_mul, Matrix.trace_smul] + _ = (R * (U.det • (1 : Matrix κ κ JetRing))).trace := by + rw [hEU, Matrix.mul_assoc, Matrix.mul_adjugate] + _ = 0 := by + rw [mul_smul_comm, mul_one, Matrix.trace_smul, hRtr, smul_zero] + have hd0 : constantCoeff (U.det - 1) = 0 := by + rw [map_sub, map_one, RingHom.map_det, hU0, Matrix.det_one, sub_self] + have hEd : ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (U.det - 1) = 0 := by + calc ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ (U.det - 1) + = ∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ U.det := by + exact Finset.sum_congr rfl fun ρ _ => by rw [map_sub, pderiv_one, sub_zero] + _ = 0 := hEdet + exact sub_eq_zero.mp (eq_zero_of_sum_X_smul_pderiv_eq_zero hd0 hEd) + +/-! + +## Jacobi's formula on the matrix factors, and degree bookkeeping + +-/ + +lemma jacobi_fin3 (M : Matrix (Fin 3) (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + rw [Matrix.det_fin_three] + simp only [Matrix.trace_fin_three, Matrix.mul_apply, Fin.sum_univ_three, + Matrix.map_apply, Matrix.adjugate_fin_three, Matrix.of_apply, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.head_cons, + Matrix.tail_cons, Matrix.head_fin_const, Matrix.empty_val', Matrix.cons_val_fin_one, + map_sub, map_add, Derivation.leibniz, smul_eq_mul] + ring + +lemma jacobi_fin2 (M : Matrix (Fin 2) (Fin 2) JetRing) (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + rw [Matrix.det_fin_two] + simp only [Matrix.adjugate_fin_two, Matrix.trace_fin_two, Matrix.mul_apply, + Matrix.map_apply, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, + Matrix.empty_val', Matrix.cons_val_fin_one, Fin.sum_univ_two, Matrix.cons_val_one, + map_sub, Derivation.leibniz, smul_eq_mul] + ring + +end JetRing From d8bc48b6fb08a2447ba3d0fe1d401f1360601680 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 19 Aug 2026 06:50:38 +0100 Subject: [PATCH 167/254] feat: Start ALgebra valued gauge bosons --- .../GaugeAlgebra/JetGaugeAlgebra.lean | 61 ++++++++ .../GaugeBosons/AlgebraValued/Basic.lean | 133 ++++++++++++++++++ Physlib/Relativity/IsLorentzDeriv.lean | 9 ++ 3 files changed, 203 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 702c0b62b..f2f4bb054 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -507,6 +507,67 @@ lemma taylorCoeff_zero_bracket (a b : JetGaugeAlgebra) : noncomputable def eval : JetGaugeAlgebra →ₗ⁅ℝ⁆ GaugeAlgebra := { taylorCoeff 0 with map_lie' := taylorCoeff_zero_bracket _ _ } +/-- The inclusion of the constant gauge algebra into the jet gauge algebra: the jets + with no spacetime dependence, given entrywise by the constant power series. This is + a section of `eval`. -/ +noncomputable def ofConstant : GaugeAlgebra →ₗ[ℝ] JetGaugeAlgebra where + toFun a := ofMatrixProd + (a.toSU3Matrix.map (C : ℂ → JetRing), a.toSU2Matrix.map (C : ℂ → JetRing), + C a.toU1Value) + ⟨by + ext i j : 1 + simpa [Matrix.star_apply, Matrix.map_apply] using + congrArg (fun M => (C (M i j) : JetRing)) + (show star a.toSU3Matrix = a.toSU3Matrix from a.1.2.1), + by rw [← AddMonoidHom.map_trace, show a.toSU3Matrix.trace = 0 from a.1.2.2, map_zero]⟩ + ⟨by + ext i j : 1 + simpa [Matrix.star_apply, Matrix.map_apply] using + congrArg (fun M => (C (M i j) : JetRing)) + (show star a.toSU2Matrix = a.toSU2Matrix from a.2.1.2.1), + by rw [← AddMonoidHom.map_trace, show a.toSU2Matrix.trace = 0 from a.2.1.2.2, map_zero]⟩ + (by rw [JetRing.star_C, show star a.toU1Value = a.toU1Value from a.2.2.2]) + map_add' a b := by + ext <;> simp [Matrix.map_apply] + map_smul' t a := by + have hC : ∀ x : ℂ, (C (t • x) : JetRing) = t • C x := fun x => by + rw [Algebra.smul_def, Algebra.smul_def, map_mul, MvPowerSeries.algebraMap_apply] + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [ofMatrixProd_toSU3Matrix, ofMatrixProd_toSU2Matrix, ofMatrixProd_toU1Value, + GaugeAlgebra.smul_toSU3Matrix, GaugeAlgebra.smul_toSU2Matrix, + GaugeAlgebra.smul_toU1Value, smul_toSU3Matrix, smul_toSU2Matrix, smul_toU1Value, + RingHom.id_apply] + · ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply] + exact hC _ + · ext i j : 1 + simp only [Matrix.map_apply, Matrix.smul_apply] + exact hC _ + · exact hC _ + +@[simp] +lemma ofConstant_toSU3Matrix (a : GaugeAlgebra) : + (ofConstant a).toSU3Matrix = a.toSU3Matrix.map (C : ℂ → JetRing) := rfl + +@[simp] +lemma ofConstant_toSU2Matrix (a : GaugeAlgebra) : + (ofConstant a).toSU2Matrix = a.toSU2Matrix.map (C : ℂ → JetRing) := rfl + +@[simp] +lemma ofConstant_toU1Value (a : GaugeAlgebra) : + (ofConstant a).toU1Value = C a.toU1Value := rfl + +lemma eval_apply (a : JetGaugeAlgebra) : eval a = taylorCoeff 0 a := rfl + +@[simp] +lemma eval_ofConstant (a : GaugeAlgebra) : eval (ofConstant a) = a := by + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · ext i j : 1 + simp [Matrix.map_apply, eval_apply, coeff_zero_eq_constantCoeff, constantCoeff_C] + · ext i j : 1 + simp [Matrix.map_apply, eval_apply, coeff_zero_eq_constantCoeff, constantCoeff_C] + · simp [coeff_zero_eq_constantCoeff, eval_apply, constantCoeff_C] + lemma eval_toSU3Matrix_apply (a : JetGaugeAlgebra) (i j : Fin 3) : (eval a).toSU3Matrix i j = constantCoeff (a.toSU3Matrix i j) := by diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean new file mode 100644 index 000000000..243e2a5af --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +/-! +# Algebra valued gauge bosons + +An algebra `B` (for instance a jet algebra of Lagrangian terms) may contain a family of +elements playing the role of the gauge-field symbols `[∂_s A_μ^a]`. This file defines +what it means for such a family to *be* a set of gauge bosons: the structure +`IsGaugeField` records the transformation laws that the physicists' gauge field +satisfies, with nothing postulated beyond them. + +## The physics + +Let `A_μ^a` be a gauge field for the gauge group `G`, with `μ` a spacetime (covector) +index and `a` an adjoint index. Under a gauge transformation `g` the field transforms as + + `A_μ ↦ Ad_g A_μ + mc(g)_μ`, + +where `mc(g)_μ = i (∂_μ g) g⁻¹` is the Maurer–Cartan form. The symbols `[∂_s A_μ^a]` +are coordinate functions on the space of field configurations, so the induced (left) +action is the pullback along `g⁻¹`: one substitutes `g⁻¹` into the field law and +differentiates `s` times with the Leibniz rule: + + `g • [∂_s A_μ^a] = ∑_{x+y=s} C(x,y) (∂_x (Ad_{g⁻¹})^a_b)| [∂_y A_μ^b]` + ` + (∂_s mc(g⁻¹)_μ^a)|`, + +where `C(x,y)` is the multinomial coefficient of the splitting and `|` denotes +evaluation at the base point. All the data on the right is carried by the *jet* of the +gauge transformation, which is why the gauge representation below is a representation +of `JetGaugeGroupI` and not merely of `GaugeGroupI`. + +## The formalization dictionary + +* `A μ φ` is the symbol `A_μ^a` contracted with a dual adjoint vector `φ`; the + derivative symbols `[∂_s A_μ^a]` are its images `iteratedD D deriv_comm s (A μ φ)` under the + total derivative `D`. +* `∂_x (Ad_{g⁻¹})^a_b|` acting on the dual index is `adjointDualCoeff g⁻¹ x φ`: + include the constant algebra element into jets, act by the adjoint of `g⁻¹`, + differentiate `x` times, evaluate at the base point, and pair with `φ`. +* The sum `∑_{x+y=s} C(x,y)` is the sum over `s.antidiagonal`: a splitting `(x, y)` + occurs in the antidiagonal of the multiset `s` with multiplicity exactly `C(x,y)`. +* `(∂_s mc(g⁻¹)_μ)|` is `JetGaugeAlgebra.eval (iteratedDeriv s (maurerCartanForm g⁻¹ μ))`, + a constant algebra element, paired with `φ` and embedded in `B` as a scalar. + +-/ + +@[expose] public section + +namespace StandardModel +open Matrix MatrixGroups +variable {B : Type} [Ring B] [Algebra ℂ B] + +/-- The physicists' `∂_x (Ad_{U})^a_b|` acting on the dual adjoint index of a + gauge-field symbol: precomposition of `φ` with the constant inclusion into jets, + followed by the adjoint action of `U`, `x` formal derivatives, and evaluation at + the base point. For `x = 0` this is the dual (contragredient) adjoint action of + the value `U₀`; for `x ≠ 0` it sees the derivatives of the gauge transformation. -/ +noncomputable def adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : Module.Dual ℝ GaugeAlgebra := + φ ∘ₗ JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv x ∘ₗ + JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant + +/-- The family `A` of symbols in the algebra `B` is a gauge field for the total + derivative `D`, the Lorentz representation `repLorentz` and the gauge representation + `repGauge`, when it satisfies the transformation laws of the physicists' gauge field: + + * it presupposes (as arguments, not fields) that `D` is a Lorentz derivative — the + instance `Lorentz.IsLorentzDeriv repLorentz D` — and that its components commute + (`deriv_comm`), as total derivatives do; + * the symbol `A_μ^a` carries one covector index, transforming through the columns of + the Lorentz matrix (`lorentz_A`); + * under a gauge jet `U` the derivative symbols `[∂_s A_μ^a]` transform by the + Leibniz expansion of `A_μ ↦ Ad_{U⁻¹} A_μ + mc(U⁻¹)_μ` (`gauge_A`) — the adjoint + convolution plus the inhomogeneous Maurer–Cartan shift. The inverse makes the + action a left action, exactly as in `φ'(x) = φ(Λ⁻¹ x)`. -/ +structure IsGaugeField (repLorentz : Representation ℂ SL(2,ℂ) B) + (repGauge : Representation ℂ JetGaugeGroupI B) + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + [Lorentz.IsLorentzDeriv repLorentz D] + (deriv_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) : Prop where + /-- The gauge-field symbol carries one covector Lorentz index. -/ + lorentz_apply : ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (A μ φ) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • A a φ + /-- The gauge transformation of the derivative symbols `[∂_s A_μ^a]`: the Leibniz + convolution of the dual adjoint action of `U⁻¹` against lower derivative symbols + (the multiset antidiagonal carries the multinomial coefficients), plus the + base-point value of the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ + gauge_apply_deriv : ∀ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + repGauge U (Lorentz.iteratedD D deriv_comm s (A μ φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D deriv_comm p.2 (A μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + + algebraMap ℂ B + (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s (maurerCartanForm U⁻¹ μ)))) + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} +variable [Lorentz.IsLorentzDeriv repLorentz D] +variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} + +/-- The gauge transformation of the underived symbol `A_μ^φ`: the special case `s = 0` + of `gauge_apply_deriv`, with no Leibniz convolution left over — the dual adjoint + action of the value of `U⁻¹` plus the Maurer–Cartan shift. -/ +lemma gauge_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) (U : JetGaugeGroupI) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (A μ φ) = A μ (adjointDualCoeff U⁻¹ ∅ φ) + + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ))) := by + simpa [Lorentz.iteratedD, show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using + hA.gauge_apply_deriv U 0 μ φ + +end IsGaugeField + +end StandardModel diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 7800c0f78..4922bdc39 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -38,6 +38,15 @@ open scoped Pointwise variable {A : Type} [Ring A] [Algebra ℂ A] +/-- The iterated operator `D_s = D_{ν₁} ⋯ D_{νₙ}` of a pairwise-commuting family of + endomorphisms along a multiset `s` of indices. Commutativity is what makes the + operator well-defined on a multiset, i.e. independent of any ordering of `s`. -/ +def iteratedD {ι : Type*} (D : ι → A →ₗ[ℂ] A) + (hD : ∀ i j, (D i).comp (D j) = (D j).comp (D i)) (s : Multiset ι) : A →ₗ[ℂ] A := + letI : LeftCommutative (fun (ν : ι) (L : A →ₗ[ℂ] A) => (D ν).comp L) := + ⟨fun i j L => by rw [← LinearMap.comp_assoc, ← LinearMap.comp_assoc, hD]⟩ + s.foldr (fun ν L => (D ν).comp L) LinearMap.id + class IsLorentzDeriv (rep : Representation ℂ SL(2,ℂ) A) (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) where rep_deriv {Λ μ x} : rep Λ (D μ x) = ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • D a (rep Λ x) From 2c3d26f2ea62e00ce4e24babdcdd22bc4306d6d7 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 19 Aug 2026 08:34:59 +0100 Subject: [PATCH 168/254] refactor: Commutator --- .../StandardModel/GaugeAlgebra/Basic.lean | 7 + .../GaugeAlgebra/JetGaugeAlgebra.lean | 44 +++ .../GaugeBosons/AlgebraValued/Basic.lean | 250 +++++++++++++++++- 3 files changed, 296 insertions(+), 5 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean index b21b91d16..e3f5a1adb 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean @@ -42,6 +42,13 @@ abbrev GaugeAlgebra := LinearMap.ker (Matrix.traceLinearMap (Fin 2) ℝ ℂ)) × selfAdjoint ℂ +/-- The self-adjoint scalars form a finite-dimensional real vector space, through the + identification with the corresponding submodule. -/ +instance : Module.Finite ℝ (selfAdjoint ℂ) := + inferInstanceAs (Module.Finite ℝ (selfAdjoint.submodule ℝ ℂ)) + +instance : Module.Finite ℝ GaugeAlgebra := by infer_instance + namespace GaugeAlgebra /-! diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index f2f4bb054..5c8d3367f 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -768,6 +768,50 @@ noncomputable def adjoint : Representation ℝ JetGaugeGroupI JetGaugeAlgebra wh refine LinearMap.ext fun a => ?_ ext <;> simp [star_mul, mul_assoc] +/-- The constant inclusion is a morphism of Lie algebras: constants bracket to + constants. -/ +lemma ofConstant_lie (a b : GaugeAlgebra) : + ofConstant ⁅a, b⁆ = ⁅ofConstant a, ofConstant b⁆ := by + refine ext_of_matrix ?_ ?_ ?_ + · ext i j : 1 + simp [Matrix.map_apply, Matrix.mul_apply, Matrix.smul_apply, smul_eq_mul, + MvPowerSeries.smul_eq_C_mul, map_sum, Finset.mul_sum, mul_sub] + · ext i j : 1 + simp [Matrix.map_apply, Matrix.mul_apply, Matrix.smul_apply, smul_eq_mul, + MvPowerSeries.smul_eq_C_mul, mul_sub] + · simp + +/-- The adjoint action preserves the bracket: conjugation is an automorphism of the + Lie algebra, using unitarity to cancel the inner `U† U` factors. -/ +lemma adjointMap_lie (U : JetGaugeGroupI) (x y : JetGaugeAlgebra) : + adjointMap U ⁅x, y⁆ = ⁅adjointMap U x, adjointMap U y⁆ := by + refine ext_of_matrix ?_ ?_ ?_ + · have hU : star U.1.1 * U.1.1 = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h + have key : ∀ X Y : Matrix (Fin 3) (Fin 3) JetRing, + (U.1.1 * X * star U.1.1) * (U.1.1 * Y * star U.1.1) = + U.1.1 * (X * Y) * star U.1.1 := by + intro X Y + simp only [mul_assoc] + rw [show star U.1.1 * (U.1.1 * (Y * star U.1.1)) = Y * star U.1.1 from by + rw [← mul_assoc, hU, one_mul]] + simp only [adjointMap_toSU3Matrix, bracket_toSU3Matrix, mul_smul_comm, smul_mul_assoc] + rw [key, key, mul_sub, sub_mul] + · have hU : star U.2.1.1 * U.2.1.1 = 1 := by + have h := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h + have key : ∀ X Y : Matrix (Fin 2) (Fin 2) JetRing, + (U.2.1.1 * X * star U.2.1.1) * (U.2.1.1 * Y * star U.2.1.1) = + U.2.1.1 * (X * Y) * star U.2.1.1 := by + intro X Y + simp only [mul_assoc] + rw [show star U.2.1.1 * (U.2.1.1 * (Y * star U.2.1.1)) = Y * star U.2.1.1 from by + rw [← mul_assoc, hU, one_mul]] + simp only [adjointMap_toSU2Matrix, bracket_toSU2Matrix, mul_smul_comm, smul_mul_assoc] + rw [key, key, mul_sub, sub_mul] + · simp + end JetGaugeAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index 243e2a5af..11b2d9990 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -61,18 +61,19 @@ of `JetGaugeGroupI` and not merely of `GaugeGroupI`. @[expose] public section namespace StandardModel -open Matrix MatrixGroups +open Matrix MatrixGroups TensorProduct variable {B : Type} [Ring B] [Algebra ℂ B] + /-- The physicists' `∂_x (Ad_{U})^a_b|` acting on the dual adjoint index of a gauge-field symbol: precomposition of `φ` with the constant inclusion into jets, followed by the adjoint action of `U`, `x` formal derivatives, and evaluation at the base point. For `x = 0` this is the dual (contragredient) adjoint action of the value `U₀`; for `x ≠ 0` it sees the derivatives of the gauge transformation. -/ -noncomputable def adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ GaugeAlgebra) : Module.Dual ℝ GaugeAlgebra := - φ ∘ₗ JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv x ∘ₗ - JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant +noncomputable def adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] Module.Dual ℝ GaugeAlgebra := + (JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv x ∘ₗ + JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant).dualMap /-- The family `A` of symbols in the algebra `B` is a gauge field for the total derivative `D`, the Lorentz representation `repLorentz` and the gauge representation @@ -108,6 +109,10 @@ structure IsGaugeField (repLorentz : Representation ℂ SL(2,ℂ) B) Lorentz.iteratedD D deriv_comm p.2 (A μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s (maurerCartanForm U⁻¹ μ)))) + /-- The gauge action preserves products: gauge transformations act on the algebra of + local expressions as algebra homomorphisms. -/ + gauge_mul : ∀ (U : JetGaugeGroupI) (b₁ b₂ : B), + repGauge U (b₁ * b₂) = repGauge U b₁ * repGauge U b₂ namespace IsGaugeField @@ -118,6 +123,35 @@ variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} variable [Lorentz.IsLorentzDeriv repLorentz D] variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} +/-- The canonical equivalence, through finite-dimensional duality, between + algebra-valued fields `B ⊗ 𝔤` and their component families `φ ↦ A^φ`: the element + `b ⊗ a` corresponds to the family `φ ↦ φ(a) b`. -/ +noncomputable def dualPairEquiv : + (B ⊗[ℝ] GaugeAlgebra) ≃ₗ[ℝ] (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) := + TensorProduct.comm ℝ B GaugeAlgebra ≪≫ₗ + TensorProduct.congr (Module.evalEquiv ℝ GaugeAlgebra) (LinearEquiv.refl ℝ B) ≪≫ₗ + dualTensorHomEquiv ℝ (Module.Dual ℝ GaugeAlgebra) B + +/-- The bracket of two algebra-valued fields: multiplication in `B` on the first + factors, the Lie bracket of the gauge algebra on the second, so that on pure + tensors `⁅b₁ ⊗ a₁, b₂ ⊗ a₂⁆ = (b₁ b₂) ⊗ ⁅a₁, a₂⁆`. -/ +noncomputable def tensorBracket : + (B ⊗[ℝ] GaugeAlgebra) →ₗ[ℝ] (B ⊗[ℝ] GaugeAlgebra) →ₗ[ℝ] B ⊗[ℝ] GaugeAlgebra := + TensorProduct.curry + ((TensorProduct.map (TensorProduct.lift (LinearMap.mul ℝ B)) + (TensorProduct.lift (LinearMap.mk₂ ℝ (fun a b => ⁅a, b⁆) + (fun a a' b => add_lie a a' b) (fun t a b => smul_lie t a b) + (fun a b b' => lie_add a b b') (fun t a b => lie_smul t a b)))) ∘ₗ + (TensorProduct.tensorTensorTensorComm ℝ B GaugeAlgebra B GaugeAlgebra).toLinearMap) + +/-- The commutator term `⁅A_μ, A_ν⁆` of the field strength, as a component family: + the physicists' `f^a_{bc} A_μ^b A_ν^c` contracted with a dual adjoint vector, but + basis-free — the two fields are assembled into `B ⊗ 𝔤` by `dualPairEquiv.symm`, + bracketed there by `tensorBracket`, and read back out as components. -/ +noncomputable def commutator (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + dualPairEquiv (tensorBracket (dualPairEquiv.symm (A μ)) (dualPairEquiv.symm (A ν))) + /-- The gauge transformation of the underived symbol `A_μ^φ`: the special case `s = 0` of `gauge_apply_deriv`, with no Leibniz convolution left over — the dual adjoint action of the value of `U⁻¹` plus the Maurer–Cartan shift. -/ @@ -128,6 +162,212 @@ lemma gauge_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) (U : JetGau simpa [Lorentz.iteratedD, show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using hA.gauge_apply_deriv U 0 μ φ +/-! + +## Pure-tensor computations for `dualPairEquiv` and `tensorBracket` + +-/ + +@[simp] +lemma dualPairEquiv_tmul (b : B) (a : GaugeAlgebra) (φ : Module.Dual ℝ GaugeAlgebra) : + dualPairEquiv (b ⊗ₜ[ℝ] a) φ = φ a • b := by + simp [dualPairEquiv, dualTensorHomEquiv, Module.evalEquiv_apply] + +@[simp] +lemma tensorBracket_tmul (b₁ b₂ : B) (a₁ a₂ : GaugeAlgebra) : + tensorBracket (b₁ ⊗ₜ[ℝ] a₁) (b₂ ⊗ₜ[ℝ] a₂) = (b₁ * b₂) ⊗ₜ[ℝ] ⁅a₁, a₂⁆ := by + simp [tensorBracket, TensorProduct.tensorTensorTensorComm_tmul] + +lemma dualPairEquiv_map_left (Φ : B →ₗ[ℝ] B) (t : B ⊗[ℝ] GaugeAlgebra) + (φ : Module.Dual ℝ GaugeAlgebra) : + dualPairEquiv ((TensorProduct.map Φ LinearMap.id) t) φ = Φ (dualPairEquiv t φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +lemma dualPairEquiv_map_right (T : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (t : B ⊗[ℝ] GaugeAlgebra) (φ : Module.Dual ℝ GaugeAlgebra) : + dualPairEquiv ((TensorProduct.map LinearMap.id T) t) φ = + dualPairEquiv t (T.dualMap φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +lemma dualPairEquiv_one_tmul (c : GaugeAlgebra) (φ : Module.Dual ℝ GaugeAlgebra) : + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] c) φ = algebraMap ℂ B (φ c) := by + rw [dualPairEquiv_tmul, Algebra.algebraMap_eq_smul_one, + show ((φ c : ℝ) : ℂ) = algebraMap ℝ ℂ (φ c) from rfl, algebraMap_smul] + +lemma symm_comp_left (Φ : B →ₗ[ℝ] B) (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + dualPairEquiv.symm (Φ ∘ₗ f) = + (TensorProduct.map Φ LinearMap.id) (dualPairEquiv.symm f) := by + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquiv_map_left, LinearEquiv.apply_symm_apply] + rfl + +lemma symm_comp_right (T : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + dualPairEquiv.symm (f ∘ₗ T.dualMap) = + (TensorProduct.map LinearMap.id T) (dualPairEquiv.symm f) := by + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquiv_map_right, LinearEquiv.apply_symm_apply] + rfl + +lemma tensorBracket_map_left (Φ : B →ₗ[ℝ] B) + (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) (s t : B ⊗[ℝ] GaugeAlgebra) : + tensorBracket ((TensorProduct.map Φ LinearMap.id) s) + ((TensorProduct.map Φ LinearMap.id) t) = + (TensorProduct.map Φ LinearMap.id) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hΦ] + | add x y hx hy => + simp only [map_add] + rw [hx, hy] + | add x y hx hy => simp [hx, hy] + +lemma tensorBracket_map_right (T : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (hT : ∀ a b, T ⁅a, b⁆ = ⁅T a, T b⁆) (s t : B ⊗[ℝ] GaugeAlgebra) : + tensorBracket ((TensorProduct.map LinearMap.id T) s) + ((TensorProduct.map LinearMap.id T) t) = + (TensorProduct.map LinearMap.id T) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hT] + | add x y hx hy => + simp only [map_add] + rw [hx, hy] + | add x y hx hy => simp [hx, hy] + +lemma tensorBracket_one_right (c : GaugeAlgebra) (s : B ⊗[ℝ] GaugeAlgebra) : + tensorBracket s ((1 : B) ⊗ₜ[ℝ] c) = + -(TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ GaugeAlgebra c)) s := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b a => + rw [tensorBracket_tmul, mul_one, ← lie_skew, TensorProduct.tmul_neg] + simp + | add x y hx hy => + simp only [map_add, LinearMap.add_apply] + rw [hx, hy] + abel + +lemma tensorBracket_one_left (c : GaugeAlgebra) (t : B ⊗[ℝ] GaugeAlgebra) : + tensorBracket ((1 : B) ⊗ₜ[ℝ] c) t = + (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ GaugeAlgebra c)) t := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +/-! + +## The gauge transformation of the commutator + +-/ + +set_option maxHeartbeats 1000000 in +/-- The gauge transformation law of the commutator term: writing the field law as + `A_μ ↦ Ad₀ A_μ + c_μ` with `Ad₀` the base-point adjoint of `U₀⁻¹` and + `c_μ = mc(U⁻¹)_μ|₀` the constant Maurer–Cartan shift, bilinearity of the bracket + gives + + `⁅A_μ, A_ν⁆ ↦ Ad₀ ⁅A_μ, A_ν⁆ + ⁅Ad₀ A_μ, c_ν⁆ + ⁅c_μ, Ad₀ A_ν⁆ + ⁅c_μ, c_ν⁆`: + + the adjoint-transported commutator, two cross terms linear in the field (the + bracket against `c` acting on the dual index through `ad`), and the constant + commutator of the two Maurer–Cartan shifts. Uses that the gauge action is by + algebra homomorphisms (`gauge_mul`) and that the base-point adjoint transport is a + morphism of Lie algebras. -/ +lemma gauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (commutator A μ ν φ) = + commutator A μ ν (adjointDualCoeff U⁻¹ 0 φ) + - A μ (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)))) + + A ν (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ)))) + + algebraMap ℂ B (φ ⁅JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ), + JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)⁆) := by + -- the linear maps and constants of the transformation law + set Φ : B →ₗ[ℝ] B := (repGauge U).restrictScalars ℝ with hΦdef + set T₀ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := + JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv 0 ∘ₗ + JetGaugeAlgebra.adjointMap U⁻¹ ∘ₗ JetGaugeAlgebra.ofConstant with hT₀def + set cμ : GaugeAlgebra := JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ) with hcμ + set cν : GaugeAlgebra := JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν) with hcν + set s : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm (A μ) with hs + set t : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm (A ν) with ht + have hcoeff : adjointDualCoeff U⁻¹ 0 = T₀.dualMap := by rw [hT₀def]; rfl + -- the base-point adjoint transport is a Lie algebra morphism + have hT₀lie : ∀ a b : GaugeAlgebra, T₀ ⁅a, b⁆ = ⁅T₀ a, T₀ b⁆ := by + intro a b + simp [hT₀def, JetGaugeAlgebra.ofConstant_lie, JetGaugeAlgebra.adjointMap_lie, + LieHom.map_lie] + -- the transformed component families in tensor form + have hfam : ∀ (ρ : Fin 1 ⊕ Fin 3), + Φ ∘ₗ A ρ = A ρ ∘ₗ T₀.dualMap + + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ρ)) := by + intro ρ + refine LinearMap.ext fun ψ => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hA.gauge_apply U ρ ψ, dualPairEquiv_one_tmul, ← hcoeff] + rfl + have hsμ : (TensorProduct.map Φ LinearMap.id) s = + (TensorProduct.map LinearMap.id T₀) s + (1 : B) ⊗ₜ[ℝ] cμ := by + rw [hs, ← symm_comp_left, hfam μ, map_add, symm_comp_right, + LinearEquiv.symm_apply_apply, hcμ] + have htν : (TensorProduct.map Φ LinearMap.id) t = + (TensorProduct.map LinearMap.id T₀) t + (1 : B) ⊗ₜ[ℝ] cν := by + rw [ht, ← symm_comp_left, hfam ν, map_add, symm_comp_right, + LinearEquiv.symm_apply_apply, hcν] + -- record the pairing identities, then make the local definitions opaque + have hcomm_pair : dualPairEquiv (tensorBracket s t) = commutator A μ ν := by + rw [hs, ht]; rfl + have hπs : dualPairEquiv s = A μ := by + rw [hs]; exact dualPairEquiv.apply_symm_apply _ + have hπt : dualPairEquiv t = A ν := by + rw [ht]; exact dualPairEquiv.apply_symm_apply _ + have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => + hA.gauge_mul U b₁ b₂ + clear_value Φ T₀ cμ cν s t + -- the tensor-level transformation of the bracket + have htensor : (TensorProduct.map Φ LinearMap.id) (tensorBracket s t) = + (TensorProduct.map LinearMap.id T₀) (tensorBracket s t) + - (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ GaugeAlgebra cν)) + ((TensorProduct.map LinearMap.id T₀) s) + + (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ GaugeAlgebra cμ)) + ((TensorProduct.map LinearMap.id T₀) t) + + (1 : B) ⊗ₜ[ℝ] ⁅cμ, cν⁆ := by + refine (tensorBracket_map_left Φ hΦmul s t).symm.trans + ((congrArg₂ (fun X Y => tensorBracket X Y) hsμ htν).trans ?_) + simp only [map_add, LinearMap.add_apply] + rw [tensorBracket_map_right T₀ hT₀lie, tensorBracket_one_right, + tensorBracket_one_left, tensorBracket_tmul, one_mul] + abel + -- read the tensor identity back through the pairing + have hread := congrArg (fun z => dualPairEquiv z φ) htensor + simp only [map_add, map_sub, map_neg, LinearMap.add_apply, LinearMap.sub_apply, + dualPairEquiv_map_left, dualPairEquiv_map_right, + dualPairEquiv_one_tmul] at hread + rw [show repGauge U (commutator A μ ν φ) = Φ (dualPairEquiv (tensorBracket s t) φ) from by + rw [← hcomm_pair, hΦdef]; rfl, + hread, hcoeff, hcomm_pair, hπs, hπt] + rfl + end IsGaugeField end StandardModel From 0d7f908f757faefb18f822a61db9de507cfd9405 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 19 Aug 2026 11:59:53 +0100 Subject: [PATCH 169/254] feat: Covariant derivatives --- .../GaugeAlgebra/JetGaugeAlgebra.lean | 21 + .../GaugeBosons/AlgebraValued/Basic.lean | 823 +++++++++++++++- .../AlgebraValued/CovariantDeriv.lean | 889 ++++++++++++++++++ .../AlgebraValued/FieldStrength.lean | 326 +++++++ .../AlgebraValued/TransformsInAdjoint.lean | 288 ++++++ .../GaugeGroup/MaurerCartan/Basic.lean | 62 ++ Physlib/Relativity/IsLorentzDeriv.lean | 20 + 7 files changed, 2426 insertions(+), 3 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 5c8d3367f..d7585606d 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -396,6 +396,27 @@ lemma iteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, iteratedDeriv_cons, iteratedDeriv_zero, LinearMap.comp_id] +/-- The iterated Leibniz rule for the bracket: the iterated derivative of a bracket + is the antidiagonal convolution of iterated derivatives of the two arguments. -/ +lemma iteratedDeriv_bracket (s : Multiset (Fin 1 ⊕ Fin 3)) (a b : JetGaugeAlgebra) : + iteratedDeriv s ⁅a, b⁆ = + (s.antidiagonal.map fun p => ⁅iteratedDeriv p.1 a, iteratedDeriv p.2 b⁆).sum := by + induction s using Multiset.induction_on with + | empty => simp [Multiset.antidiagonal_zero] + | cons κ s ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, ih, map_multiset_sum, + Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, deriv_bracket, + show deriv κ (iteratedDeriv p.1 a) = iteratedDeriv (κ ::ₘ p.1) a from by + rw [iteratedDeriv_cons]; rfl, + show deriv κ (iteratedDeriv p.2 b) = iteratedDeriv (κ ::ₘ p.2) b from by + rw [iteratedDeriv_cons]; rfl]), + Multiset.sum_map_add] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + abel + diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index 11b2d9990..615c16b58 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -75,6 +75,26 @@ noncomputable def adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ (JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv x ∘ₗ JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant).dualMap +/-- The dual adjoint coefficient at a single derivative: since + `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆` (`deriv_adjointMap`) and constants + have vanishing derivative, the once-derived coefficient is minus the underived + coefficient precomposed (on the dual index) with `ad` of the base-point + Maurer–Cartan form. This is what cancels the Leibniz cross terms of + `gauge_apply_deriv` against the commutator cross terms in the field strength. -/ +lemma adjointDualCoeff_singleton (U : JetGaugeGroupI) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + adjointDualCoeff U {μ} φ = + -adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + (JetGaugeAlgebra.eval (maurerCartanForm U μ))) := by + refine LinearMap.ext fun a => ?_ + simp only [adjointDualCoeff, LinearMap.dualMap_apply, LinearMap.neg_apply, + LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, + JetGaugeAlgebra.iteratedDeriv_singleton, JetGaugeAlgebra.iteratedDeriv_zero, + LinearMap.id_coe, id_eq] + rw [deriv_adjointMap, JetGaugeAlgebra.deriv_ofConstant, map_zero, zero_sub, map_neg, + map_neg, LieHom.map_lie] + simp + /-- The family `A` of symbols in the algebra `B` is a gauge field for the total derivative `D`, the Lorentz representation `repLorentz` and the gauge representation `repGauge`, when it satisfies the transformation laws of the physicists' gauge field: @@ -155,13 +175,43 @@ noncomputable def commutator (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlg /-- The gauge transformation of the underived symbol `A_μ^φ`: the special case `s = 0` of `gauge_apply_deriv`, with no Leibniz convolution left over — the dual adjoint action of the value of `U⁻¹` plus the Maurer–Cartan shift. -/ -lemma gauge_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) (U : JetGaugeGroupI) +lemma repGauge_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : repGauge U (A μ φ) = A μ (adjointDualCoeff U⁻¹ ∅ φ) + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ))) := by simpa [Lorentz.iteratedD, show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using hA.gauge_apply_deriv U 0 μ φ + +/-- The gauge transformation of the once-derived symbol `∂_ρ A_σ`: the case `s = {ρ}` + of `gauge_apply_deriv` — the two Leibniz splittings of one derivative, plus the + base-point value of the derived Maurer–Cartan form. -/ +lemma repGauge_deriv_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (D ρ (A σ φ)) = + D ρ (A σ (adjointDualCoeff U⁻¹ 0 φ)) + A σ (adjointDualCoeff U⁻¹ {ρ} φ) + + algebraMap ℂ B (φ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ σ)))) := by + have hzero : Lorentz.iteratedD D D_comm (0 : Multiset (Fin 1 ⊕ Fin 3)) = + LinearMap.id := by + simp only [Lorentz.iteratedD, Multiset.foldr_zero] + have hsingle : Lorentz.iteratedD D D_comm ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = D ρ := by + rw [show ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = ρ ::ₘ 0 from rfl] + simp only [Lorentz.iteratedD, Multiset.foldr_cons, Multiset.foldr_zero, + LinearMap.comp_id] + have hanti : ({ρ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = + {((0 : Multiset (Fin 1 ⊕ Fin 3)), ({ρ} : Multiset (Fin 1 ⊕ Fin 3))), + (({ρ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by + rw [show ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = ρ ::ₘ 0 from rfl, + Multiset.antidiagonal_cons, Multiset.antidiagonal_zero] + simp + have h := hA.gauge_apply_deriv U {ρ} σ φ + rw [hanti] at h + simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, + Multiset.sum_cons, Multiset.sum_singleton, hzero, hsingle, + JetGaugeAlgebra.iteratedDeriv_singleton, LinearMap.id_coe, id_eq] at h + exact h + /-! ## Pure-tensor computations for `dualPairEquiv` and `tensorBracket` @@ -291,7 +341,7 @@ set_option maxHeartbeats 1000000 in commutator of the two Maurer–Cartan shifts. Uses that the gauge action is by algebra homomorphisms (`gauge_mul`) and that the base-point adjoint transport is a morphism of Lie algebras. -/ -lemma gauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : repGauge U (commutator A μ ν φ) = commutator A μ ν (adjointDualCoeff U⁻¹ 0 φ) @@ -324,7 +374,7 @@ lemma gauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) refine LinearMap.ext fun ψ => ?_ simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, LinearMap.restrictScalars_apply] - rw [hA.gauge_apply U ρ ψ, dualPairEquiv_one_tmul, ← hcoeff] + rw [hA.repGauge_apply U ρ ψ, dualPairEquiv_one_tmul, ← hcoeff] rfl have hsμ : (TensorProduct.map Φ LinearMap.id) s = (TensorProduct.map LinearMap.id T₀) s + (1 : B) ⊗ₜ[ℝ] cμ := by @@ -368,6 +418,773 @@ lemma gauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) hread, hcoeff, hcomm_pair, hπs, hπt] rfl +/-! + +## Second derivatives of the gauge field + +-/ + +/-- The dual adjoint coefficient at two derivatives: iterating + `∂ (Ad_U x) = Ad_U (∂ x) − ⁅ω(U), Ad_U x⁆` once more, the twice-derived coefficient + decomposes into the underived coefficient against `ad` of the derived Maurer–Cartan + form, and the once-derived coefficient against `ad` of the Maurer–Cartan form + itself. This is the two-derivative analogue of `adjointDualCoeff_singleton`. -/ +lemma _root_.StandardModel.adjointDualCoeff_pair (U : JetGaugeGroupI) + (ρ μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + adjointDualCoeff U (ρ ::ₘ {μ}) φ = + -adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ (maurerCartanForm U μ)))) + - adjointDualCoeff U {ρ} (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + (JetGaugeAlgebra.eval (maurerCartanForm U μ))) := by + refine LinearMap.ext fun a => ?_ + have hderiv : ∀ τ : Fin 1 ⊕ Fin 3, + JetGaugeAlgebra.deriv τ (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)) = + -⁅maurerCartanForm U τ, + JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)⁆ := + fun τ => by rw [deriv_adjointMap, JetGaugeAlgebra.deriv_ofConstant, map_zero, zero_sub] + have hkey : JetGaugeAlgebra.iteratedDeriv (ρ ::ₘ {μ}) + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)) = + -⁅JetGaugeAlgebra.deriv ρ (maurerCartanForm U μ), + JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)⁆ + + ⁅maurerCartanForm U μ, ⁅maurerCartanForm U ρ, + JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)⁆⁆ := by + rw [JetGaugeAlgebra.iteratedDeriv_cons, LinearMap.comp_apply, + JetGaugeAlgebra.iteratedDeriv_singleton, hderiv μ, map_neg, + JetGaugeAlgebra.deriv_bracket, hderiv ρ, lie_neg] + abel + simp only [adjointDualCoeff, LinearMap.dualMap_apply, LinearMap.sub_apply, + LinearMap.neg_apply, LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, + JetGaugeAlgebra.iteratedDeriv_zero, JetGaugeAlgebra.iteratedDeriv_singleton, + LinearMap.id_coe, id_eq] + rw [hkey, map_add, map_neg, LieHom.map_lie, LieHom.map_lie, LieHom.map_lie, + hderiv ρ, map_neg, LieHom.map_lie] + simp only [map_add, map_neg, LieAlgebra.ad_apply] + abel + +/-- The gauge transformation of the twice-derived symbol `∂_ρ ∂_σ A_τ`: the case + `s = ρ ::ₘ {σ}` of `gauge_apply_deriv` — the four Leibniz splittings of two + derivatives, plus the base-point value of the twice-derived Maurer–Cartan form. -/ +lemma repGauge_deriv_deriv_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (D ρ (D σ (A τ φ))) = + D ρ (D σ (A τ (adjointDualCoeff U⁻¹ 0 φ))) + + D ρ (A τ (adjointDualCoeff U⁻¹ {σ} φ)) + + D σ (A τ (adjointDualCoeff U⁻¹ {ρ} φ)) + + A τ (adjointDualCoeff U⁻¹ (ρ ::ₘ {σ}) φ) + + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ + (JetGaugeAlgebra.deriv σ (maurerCartanForm U⁻¹ τ))))) := by + have hzero : Lorentz.iteratedD D D_comm (0 : Multiset (Fin 1 ⊕ Fin 3)) = + LinearMap.id := by + simp only [Lorentz.iteratedD, Multiset.foldr_zero] + have hsingle : ∀ κ : Fin 1 ⊕ Fin 3, + Lorentz.iteratedD D D_comm ({κ} : Multiset (Fin 1 ⊕ Fin 3)) = D κ := by + intro κ + rw [show ({κ} : Multiset (Fin 1 ⊕ Fin 3)) = κ ::ₘ 0 from rfl] + simp only [Lorentz.iteratedD, Multiset.foldr_cons, Multiset.foldr_zero, + LinearMap.comp_id] + have hpair : Lorentz.iteratedD D D_comm (ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3))) = + (D ρ).comp (D σ) := by + rw [show ({σ} : Multiset (Fin 1 ⊕ Fin 3)) = σ ::ₘ 0 from rfl] + simp only [Lorentz.iteratedD, Multiset.foldr_cons, Multiset.foldr_zero, + LinearMap.comp_id] + have hanti₁ : ({σ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = + {((0 : Multiset (Fin 1 ⊕ Fin 3)), ({σ} : Multiset (Fin 1 ⊕ Fin 3))), + (({σ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by + rw [show ({σ} : Multiset (Fin 1 ⊕ Fin 3)) = σ ::ₘ 0 from rfl, + Multiset.antidiagonal_cons, Multiset.antidiagonal_zero] + simp + have hanti : (ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3))).antidiagonal = + {(({ρ} : Multiset (Fin 1 ⊕ Fin 3)), ({σ} : Multiset (Fin 1 ⊕ Fin 3))), + ((0 : Multiset (Fin 1 ⊕ Fin 3)), ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3))), + (({σ} : Multiset (Fin 1 ⊕ Fin 3)), ({ρ} : Multiset (Fin 1 ⊕ Fin 3))), + (ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by + rw [Multiset.antidiagonal_cons, hanti₁] + simp [Multiset.insert_eq_cons] + have h := hA.gauge_apply_deriv U (ρ ::ₘ {σ}) τ φ + rw [hanti] at h + simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, + Multiset.sum_cons, Multiset.sum_singleton, hzero, hsingle, hpair, + LinearMap.comp_apply, JetGaugeAlgebra.iteratedDeriv_cons, + JetGaugeAlgebra.iteratedDeriv_singleton, LinearMap.id_coe, id_eq] at h + refine h.trans ?_ + abel + +/-! + +## The bracket of general component families + +-/ + +/-- The bracket of two arbitrary component families, generalizing `commutator` (which + is the case of two field symbols): assemble into `B ⊗ 𝔤` by `dualPairEquiv.symm`, + bracket by `tensorBracket`, read back out as components. -/ +noncomputable def bracketFam (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + dualPairEquiv (tensorBracket (dualPairEquiv.symm f) (dualPairEquiv.symm g)) + +lemma commutator_eq_bracketFam (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : commutator A μ ν = bracketFam (A μ) (A ν) := rfl + +lemma bracketFam_add_left (f₁ f₂ g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + bracketFam (f₁ + f₂) g = bracketFam f₁ g + bracketFam f₂ g := by + simp only [bracketFam, map_add, LinearMap.add_apply] + +lemma bracketFam_add_right (f g₁ g₂ : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + bracketFam f (g₁ + g₂) = bracketFam f g₁ + bracketFam f g₂ := by + simp only [bracketFam, map_add] + +/-- The bracket of families against a common Lie-algebra morphism on the dual index. -/ +lemma bracketFam_comp_dualMap (T : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (hT : ∀ a b, T ⁅a, b⁆ = ⁅T a, T b⁆) (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + bracketFam (f ∘ₗ T.dualMap) (g ∘ₗ T.dualMap) = bracketFam f g ∘ₗ T.dualMap := by + refine LinearMap.ext fun φ => ?_ + show dualPairEquiv (tensorBracket (dualPairEquiv.symm (f ∘ₗ T.dualMap)) + (dualPairEquiv.symm (g ∘ₗ T.dualMap))) φ = bracketFam f g (T.dualMap φ) + rw [symm_comp_right, symm_comp_right, tensorBracket_map_right T hT, + dualPairEquiv_map_right] + rfl + +/-- `tensorBracket` is a derivation in the algebra factor: for `Δ` satisfying the + Leibniz rule on `B`, applying `Δ ⊗ id` to a bracket distributes over the two + arguments. -/ +lemma tensorBracket_map_left_derivation (Δ : B →ₗ[ℝ] B) + (hΔ : ∀ b₁ b₂, Δ (b₁ * b₂) = Δ b₁ * b₂ + b₁ * Δ b₂) (s t : B ⊗[ℝ] GaugeAlgebra) : + (TensorProduct.map Δ LinearMap.id) (tensorBracket s t) = + tensorBracket ((TensorProduct.map Δ LinearMap.id) s) t + + tensorBracket s ((TensorProduct.map Δ LinearMap.id) t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hΔ, TensorProduct.add_tmul] + | add x y hx hy => + simp only [map_add, hx, hy] + abel + | add x y hx hy => + simp only [map_add, LinearMap.add_apply, hx, hy] + abel + +/-- `tensorBracket` under a relative derivation on the Lie factor: if + `T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆`, the two mixed brackets sum to the + `T₁`-image of the bracket. This is how the once-derived adjoint transport + distributes over the commutator. -/ +lemma tensorBracket_map_right_derivation (T₀ T₁ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (hT : ∀ a b, T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆) (s t : B ⊗[ℝ] GaugeAlgebra) : + tensorBracket ((TensorProduct.map LinearMap.id T₁) s) + ((TensorProduct.map LinearMap.id T₀) t) + + tensorBracket ((TensorProduct.map LinearMap.id T₀) s) + ((TensorProduct.map LinearMap.id T₁) t) = + (TensorProduct.map LinearMap.id T₁) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hT, TensorProduct.tmul_add] + | add x y hx hy => + simp only [map_add] + rw [← hx, ← hy] + abel + | add x y hx hy => + simp only [map_add, LinearMap.add_apply] + rw [← hx, ← hy] + abel + +/-- The family-level form of `tensorBracket_map_right_derivation`: a relative + derivation on the dual index distributes over the bracket of families. -/ +lemma bracketFam_dualMap_derivation (T₀ T₁ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (hT : ∀ a b, T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆) + (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + bracketFam (f ∘ₗ T₁.dualMap) (g ∘ₗ T₀.dualMap) + + bracketFam (f ∘ₗ T₀.dualMap) (g ∘ₗ T₁.dualMap) = + bracketFam f g ∘ₗ T₁.dualMap := by + refine LinearMap.ext fun φ => ?_ + show dualPairEquiv (tensorBracket (dualPairEquiv.symm (f ∘ₗ T₁.dualMap)) + (dualPairEquiv.symm (g ∘ₗ T₀.dualMap))) φ + + dualPairEquiv (tensorBracket (dualPairEquiv.symm (f ∘ₗ T₀.dualMap)) + (dualPairEquiv.symm (g ∘ₗ T₁.dualMap))) φ = + bracketFam f g (T₁.dualMap φ) + rw [symm_comp_right, symm_comp_right, symm_comp_right, symm_comp_right, + ← LinearMap.add_apply, ← map_add, tensorBracket_map_right_derivation T₀ T₁ hT, + dualPairEquiv_map_right] + rfl + +/-- With `D` a derivation (Leibniz rule on `B`), the derivative of the commutator + term distributes: `∂_ρ ⁅A_μ, A_ν⁆ = ⁅∂_ρ A_μ, A_ν⁆ + ⁅A_μ, ∂_ρ A_ν⁆`. -/ +lemma deriv_commutator (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (ρ μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + D ρ (commutator A μ ν φ) = + bracketFam ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν) φ + + bracketFam (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν) φ := by + have h := congrArg (fun z => dualPairEquiv z φ) + (tensorBracket_map_left_derivation ((D ρ).restrictScalars ℝ) + (fun b₁ b₂ => hD ρ b₁ b₂) (dualPairEquiv.symm (A μ)) (dualPairEquiv.symm (A ν))) + simp only [map_add, LinearMap.add_apply, dualPairEquiv_map_left] at h + rw [← symm_comp_left, ← symm_comp_left] at h + exact h + +set_option maxHeartbeats 1000000 in +/-- The gauge transformation of the bracket of two component families with affine + transformation laws `f ↦ f' + φ(c_f)·1` and `g ↦ g' + φ(c_g)·1`: the bracket of the + transformed families, two `ad` cross terms, and the constant bracket `⁅c_f, c_g⁆`. + Pure bilinearity, with `tensorBracket_one_left/right` computing the cross terms; + `repGauge_commutator` is the special case of two field symbols. -/ +lemma repGauge_bracketFam (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) {f g f' g' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {cf cg : GaugeAlgebra} + (hf : ∀ ψ : Module.Dual ℝ GaugeAlgebra, + repGauge U (f ψ) = f' ψ + algebraMap ℂ B (ψ cf)) + (hg : ∀ ψ : Module.Dual ℝ GaugeAlgebra, + repGauge U (g ψ) = g' ψ + algebraMap ℂ B (ψ cg)) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (bracketFam f g φ) = + bracketFam f' g' φ + + g' (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra cf) + - f' (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra cg) + + algebraMap ℂ B (φ ⁅cf, cg⁆) := by + set Φ : B →ₗ[ℝ] B := (repGauge U).restrictScalars ℝ with hΦdef + have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => + hA.gauge_mul U b₁ b₂ + set s : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm f with hs + set t : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm g with ht + set s' : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm f' with hs' + set t' : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm g' with ht' + have hfm : (TensorProduct.map Φ LinearMap.id) s = s' + (1 : B) ⊗ₜ[ℝ] cf := by + rw [hs, hs', ← symm_comp_left, + show Φ ∘ₗ f = f' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cf) from + LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hf ψ, dualPairEquiv_one_tmul], + map_add, LinearEquiv.symm_apply_apply] + have hgm : (TensorProduct.map Φ LinearMap.id) t = t' + (1 : B) ⊗ₜ[ℝ] cg := by + rw [ht, ht', ← symm_comp_left, + show Φ ∘ₗ g = g' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cg) from + LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hg ψ, dualPairEquiv_one_tmul], + map_add, LinearEquiv.symm_apply_apply] + have hbra : dualPairEquiv (tensorBracket s t) = bracketFam f g := by + rw [hs, ht]; rfl + have hbra' : dualPairEquiv (tensorBracket s' t') = bracketFam f' g' := by + rw [hs', ht']; rfl + have hπs' : dualPairEquiv s' = f' := by + rw [hs']; exact dualPairEquiv.apply_symm_apply _ + have hπt' : dualPairEquiv t' = g' := by + rw [ht']; exact dualPairEquiv.apply_symm_apply _ + clear_value Φ s t s' t' + have htensor : (TensorProduct.map Φ LinearMap.id) (tensorBracket s t) = + tensorBracket s' t' + + (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ GaugeAlgebra cf)) t' + - (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ GaugeAlgebra cg)) s' + + (1 : B) ⊗ₜ[ℝ] ⁅cf, cg⁆ := by + refine (tensorBracket_map_left Φ hΦmul s t).symm.trans + ((congrArg₂ (fun X Y => tensorBracket X Y) hfm hgm).trans ?_) + simp only [map_add, LinearMap.add_apply] + rw [tensorBracket_one_right, tensorBracket_one_left, tensorBracket_tmul, one_mul] + abel + have hread := congrArg (fun z => dualPairEquiv z φ) htensor + simp only [map_add, map_sub, LinearMap.add_apply, LinearMap.sub_apply, + dualPairEquiv_map_left, dualPairEquiv_map_right, dualPairEquiv_one_tmul] at hread + rw [show repGauge U (bracketFam f g φ) = Φ (dualPairEquiv (tensorBracket s t) φ) from by + rw [hbra, hΦdef]; rfl, + hread, hbra', hπs', hπt'] + rfl + + +/-! + +## Multiset combinatorics for iterated Leibniz sums + +The convolution sums of the iterated transformation laws are indexed by the multiset +antidiagonal. The two lemmas below are the coassociativity and cocommutativity-exchange +of this "comultiplication": a sum over splittings-of-splittings does not depend on the +grouping. Both are proven by a cons-induction with the summand universally quantified, +so that the inductive hypothesis absorbs the modified summands. + +-/ + +/-- Coassociativity of antidiagonal sums: summing over `s = u + v` and then `u = x + y` + is summing over `s = x + t` and then `t = y + v`. -/ +lemma _root_.Multiset.sum_antidiagonal_assoc {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => h q.1 q.2 p.2).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun q => h p.1 q.1 q.2).sum).sum := by + induction s using Multiset.induction_on generalizing h with + | empty => simp + | cons κ s ih => + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq, + Multiset.sum_map_add] + rw [ih (fun x y v => h x y (κ ::ₘ v)), ih (fun x y v => h x (κ ::ₘ y) v), + ih (fun x y v => h (κ ::ₘ x) y v)] + abel + +/-- The exchange law of doubly-split antidiagonal sums: splitting `s = u + v` and then + `u = x + y`, `v = z + w` is, with the middle parts exchanged, splitting `s = u' + v'` + and then `u' = x + z`, `v' = y + w`. -/ +lemma _root_.Multiset.sum_antidiagonal_exchange {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => h q.1 q.2 r.1 r.2).sum).sum).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => h q.1 r.1 q.2 r.2).sum).sum).sum := by + induction s using Multiset.induction_on generalizing h with + | empty => simp + | cons κ s ih => + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq, + Multiset.sum_map_add] + rw [ih (fun x y z w => h x y z (κ ::ₘ w)), ih (fun x y z w => h x y (κ ::ₘ z) w), + ih (fun x y z w => h x (κ ::ₘ y) z w), ih (fun x y z w => h (κ ::ₘ x) y z w)] + abel + +/-- A multiset sum of linear maps, applied: the sum of the applications. -/ +lemma _root_.Multiset.sum_linearMap_apply {R M N : Type*} [Semiring R] [AddCommMonoid M] + [AddCommMonoid N] [Module R M] [Module R N] (S : Multiset (M →ₗ[R] N)) (x : M) : + S.sum x = (S.map fun f => f x).sum := by + induction S using Multiset.induction_on with + | empty => simp + | cons f S ih => simp [ih] + +/-- A pure tensor against a multiset sum distributes over the sum. -/ +lemma _root_.Multiset.tmul_sum {R M N : Type*} [CommSemiring R] [AddCommMonoid M] + [AddCommMonoid N] [Module R M] [Module R N] (m : M) (S : Multiset N) : + m ⊗ₜ[R] S.sum = (S.map fun n => m ⊗ₜ[R] n).sum := by + induction S using Multiset.induction_on with + | empty => simp + | cons n S ih => simp [TensorProduct.tmul_add, ih] + +/-! + +## Iterated Leibniz expansions + +-/ + +lemma bracketFam_zero_left (g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + bracketFam 0 g = 0 := by + simp [bracketFam] + +lemma bracketFam_zero_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + bracketFam f 0 = 0 := by + simp [bracketFam] + +lemma bracketFam_sum_left (S : Multiset (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B)) + (g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + bracketFam S.sum g = (S.map fun f => bracketFam f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [bracketFam_zero_left] + | cons f S ih => simp [bracketFam_add_left, ih] + +lemma bracketFam_sum_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (S : Multiset (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B)) : + bracketFam f S.sum = (S.map fun g => bracketFam f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [bracketFam_zero_right] + | cons g S ih => simp [bracketFam_add_right, ih] + +/-- With `D` a derivation, the one-step Leibniz rule for the bracket of arbitrary + component families. -/ +lemma deriv_bracketFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (κ : Fin 1 ⊕ Fin 3) + (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) : + D κ (bracketFam f g φ) = + bracketFam ((D κ).restrictScalars ℝ ∘ₗ f) g φ + + bracketFam f ((D κ).restrictScalars ℝ ∘ₗ g) φ := by + have h := congrArg (fun z => dualPairEquiv z φ) + (tensorBracket_map_left_derivation ((D κ).restrictScalars ℝ) + (fun b₁ b₂ => hD κ b₁ b₂) (dualPairEquiv.symm f) (dualPairEquiv.symm g)) + simp only [map_add, LinearMap.add_apply, dualPairEquiv_map_left] at h + rw [← symm_comp_left, ← symm_comp_left] at h + exact h + +/-- The iterated Leibniz rule for the bracket of component families: the iterated + derivative of `⁅f, g⁆` is the antidiagonal convolution of derived brackets. -/ +lemma iteratedD_bracketFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (s : Multiset (Fin 1 ⊕ Fin 3)) + (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) : + Lorentz.iteratedD D D_comm s (bracketFam f g φ) = + (s.antidiagonal.map fun p => + bracketFam ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) + ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) φ).sum := by + induction s using Multiset.induction_on generalizing f g with + | empty => + simp [Lorentz.iteratedD_zero, Multiset.antidiagonal_zero, + show (LinearMap.id : B →ₗ[ℂ] B).restrictScalars ℝ = LinearMap.id from rfl] + | cons κ s ih => + rw [Lorentz.iteratedD_cons, LinearMap.comp_apply, ih f g, map_multiset_sum, + Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, deriv_bracketFam hD κ, + show (D κ).restrictScalars ℝ ∘ₗ + ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) = + (Lorentz.iteratedD D D_comm (κ ::ₘ p.1)).restrictScalars ℝ ∘ₗ f from by + rw [Lorentz.iteratedD_cons]; rfl, + show (D κ).restrictScalars ℝ ∘ₗ + ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) = + (Lorentz.iteratedD D D_comm (κ ::ₘ p.2)).restrictScalars ℝ ∘ₗ g from by + rw [Lorentz.iteratedD_cons]; rfl]), + Multiset.sum_map_add] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + abel + +/-! + +## The all-orders transport, coefficient, and structural identities + +-/ + +/-- The all-orders derivation property of the base-point adjoint transport: the + transport of a bracket is the antidiagonal convolution of transports, by the + iterated Leibniz rule for the jet bracket. -/ +lemma _root_.StandardModel.adjointTransport_bracket (U : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) (a b : GaugeAlgebra) : + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv x + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant ⁅a, b⁆))) = + (x.antidiagonal.map fun p => + ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a))), + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.2 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant b)))⁆).sum := by + rw [JetGaugeAlgebra.ofConstant_lie, JetGaugeAlgebra.adjointMap_lie, + JetGaugeAlgebra.iteratedDeriv_bracket, map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [Function.comp_apply, LieHom.map_lie]) + +/-- `tensorBracket` under an antidiagonal family of transports on the Lie factor: + if `T x` distributes over the bracket as the antidiagonal convolution of the + `T m`, so does `id ⊗ T x` over `tensorBracket`. -/ +lemma tensorBracket_map_right_antidiagonal + (T : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (x : Multiset (Fin 1 ⊕ Fin 3)) + (hT : ∀ a b : GaugeAlgebra, T x ⁅a, b⁆ = + (x.antidiagonal.map fun p => ⁅T p.1 a, T p.2 b⁆).sum) + (s t : B ⊗[ℝ] GaugeAlgebra) : + (x.antidiagonal.map fun p => + tensorBracket ((TensorProduct.map LinearMap.id (T p.1)) s) + ((TensorProduct.map LinearMap.id (T p.2)) t)).sum = + (TensorProduct.map LinearMap.id (T x)) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => + simp only [tensorBracket_tmul, TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [hT, Multiset.tmul_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + simp) + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by rw [map_add, map_add]), + Multiset.sum_map_add, hy, hz, ← map_add, ← map_add] + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by + rw [map_add, map_add, LinearMap.add_apply]), + Multiset.sum_map_add, hy, hz, ← map_add, ← LinearMap.add_apply, ← map_add] + +/-- The bracket of families against an iterated dual adjoint coefficient: the + antidiagonal convolution — the all-orders form of `bracketFam_comp_dualMap` and + `bracketFam_dualMap_derivation`. -/ +lemma bracketFam_adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) : + bracketFam f g (adjointDualCoeff U x φ) = + (x.antidiagonal.map fun p => + bracketFam (f ∘ₗ adjointDualCoeff U p.1) (g ∘ₗ adjointDualCoeff U p.2) φ).sum := by + set T : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := fun m => + JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv m ∘ₗ + JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant with hTdef + have hcoeff : ∀ m, adjointDualCoeff U m = (T m).dualMap := fun m => rfl + have hT : ∀ a b : GaugeAlgebra, T x ⁅a, b⁆ = + (x.antidiagonal.map fun p => ⁅T p.1 a, T p.2 b⁆).sum := by + intro a b + simp only [hTdef, LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + exact adjointTransport_bracket U x a b + rw [hcoeff x, + show bracketFam f g ((T x).dualMap φ) = + dualPairEquiv ((TensorProduct.map LinearMap.id (T x)) (tensorBracket + (dualPairEquiv.symm f) (dualPairEquiv.symm g))) φ from + (dualPairEquiv_map_right (T x) _ φ).symm, + ← tensorBracket_map_right_antidiagonal T x hT, map_multiset_sum, + Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + simp only [Function.comp_apply] + rw [← symm_comp_right, ← symm_comp_right, hcoeff p.1, hcoeff p.2] + rfl + +/-- The all-orders decomposition of the dual adjoint coefficient with one extra + derivative — the generalization of `adjointDualCoeff_singleton` and + `adjointDualCoeff_pair`: differentiating the adjoint once produces minus the + bracket with the Maurer–Cartan form, and the remaining derivatives distribute over + it by the Leibniz rule. -/ +lemma _root_.StandardModel.adjointDualCoeff_cons (U : JetGaugeGroupI) + (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + adjointDualCoeff U (μ ::ₘ x) φ = + -((x.antidiagonal.map fun p => + adjointDualCoeff U p.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))))).sum) := by + refine LinearMap.ext fun a => ?_ + have hkey : JetGaugeAlgebra.iteratedDeriv (μ ::ₘ x) + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)) = + -((x.antidiagonal.map fun p => + ⁅JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U μ), + JetGaugeAlgebra.iteratedDeriv p.2 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a))⁆).sum) := by + rw [show (μ ::ₘ x : Multiset (Fin 1 ⊕ Fin 3)) = x + {μ} from by + rw [add_comm, Multiset.singleton_add], + JetGaugeAlgebra.iteratedDeriv_add, LinearMap.comp_apply, + JetGaugeAlgebra.iteratedDeriv_singleton, deriv_adjointMap, + JetGaugeAlgebra.deriv_ofConstant, map_zero, zero_sub, map_neg, + JetGaugeAlgebra.iteratedDeriv_bracket] + simp only [adjointDualCoeff, LinearMap.dualMap_apply, LinearMap.neg_apply, + LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + rw [hkey, map_neg, map_neg, map_multiset_sum, map_multiset_sum, + Multiset.map_map, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_)) + simp only [Function.comp_apply, LieHom.map_lie] + rfl + +/-- The all-orders structural equation of the Maurer–Cartan form, at the base point: + the `s`-th derivative of `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`, with the bracket + expanded by the iterated Leibniz rule. -/ +lemma _root_.StandardModel.eval_iteratedDeriv_maurerCartan_structure + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (μ ::ₘ s) (maurerCartanForm U ν)) = + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (ν ::ₘ s) (maurerCartanForm U μ)) + - (s.antidiagonal.map fun p => + ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U μ)), + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.2 + (maurerCartanForm U ν))⁆).sum := by + have hconv : ∀ (κ : Fin 1 ⊕ Fin 3) (z : JetGaugeAlgebra), + JetGaugeAlgebra.iteratedDeriv s (JetGaugeAlgebra.deriv κ z) = + JetGaugeAlgebra.iteratedDeriv (κ ::ₘ s) z := by + intro κ z + rw [show (κ ::ₘ s : Multiset (Fin 1 ⊕ Fin 3)) = s + {κ} from by + rw [add_comm, Multiset.singleton_add], + JetGaugeAlgebra.iteratedDeriv_add, LinearMap.comp_apply, + JetGaugeAlgebra.iteratedDeriv_singleton] + have h0 := congrArg (fun z => JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s z)) + (maurerCartanForm_structure U μ ν) + simp only [map_add, map_sub, map_zero] at h0 + rw [hconv, hconv, JetGaugeAlgebra.iteratedDeriv_bracket, map_multiset_sum, + Multiset.map_map] at h0 + rw [Multiset.map_congr rfl (fun p hp => by rw [Function.comp_apply, LieHom.map_lie])] at h0 + refine eq_sub_of_add_eq ?_ + calc JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (μ ::ₘ s) (maurerCartanForm U ν)) + + (s.antidiagonal.map fun p => + ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U μ)), + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.2 + (maurerCartanForm U ν))⁆).sum + = (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (μ ::ₘ s) (maurerCartanForm U ν)) + - JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (ν ::ₘ s) (maurerCartanForm U μ)) + + (s.antidiagonal.map fun p => + ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U μ)), + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.2 + (maurerCartanForm U ν))⁆).sum) + + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (ν ::ₘ s) (maurerCartanForm U μ)) := by + abel + _ = JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (ν ::ₘ s) (maurerCartanForm U μ)) := by + rw [h0, zero_add] + +/-- Antidiagonal sums are symmetric under swapping the two parts. -/ +lemma _root_.Multiset.sum_antidiagonal_swap {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => h p.1 p.2).sum = + (s.antidiagonal.map fun p => h p.2 p.1).sum := by + induction s using Multiset.induction_on generalizing h with + | empty => simp + | cons κ s ih => + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + rw [ih (fun a b => h a (κ ::ₘ b)), ih (fun a b => h (κ ::ₘ a) b)] + abel + +/-- A multiset sum of negations is the negation of the sum. -/ +lemma _root_.Multiset.sum_map_neg'' {ι M : Type*} [AddCommGroup M] + (s : Multiset ι) (f : ι → M) : + (s.map fun i => -f i).sum = -(s.map f).sum := by + induction s using Multiset.induction_on with + | empty => simp + | cons i s ih => + simp only [Multiset.map_cons, Multiset.sum_cons, ih] + abel + +/-! + +## The gauge transformation of iterated derivatives + +-/ + +/-- The `κ ::ₘ s` case of `gauge_apply_deriv` with the extra derivative traced through: + the Leibniz splittings where `κ` stays a derivative, minus (by + `adjointDualCoeff_cons`) the splittings where `κ` hits the adjoint — an `ad` of the + derived Maurer–Cartan form — plus the derived Maurer–Cartan shift. -/ +lemma repGauge_iteratedD_cons_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (A τ φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (A τ (adjointDualCoeff U⁻¹ p.1 φ))).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (A τ (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ κ))))))).sum).sum + + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (κ ::ₘ s) + (maurerCartanForm U⁻¹ τ)))) := by + rw [hA.gauge_apply_deriv U (κ ::ₘ s) τ φ] + congr 1 + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 + (A τ (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = + -(s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (A τ (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + rw [← Multiset.sum_map_neg''] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, + Multiset.map_map, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) + rw [hsec, sub_eq_add_neg] + +set_option maxHeartbeats 2000000 in +/-- The all-orders gauge transformation of the derived commutator term: the Leibniz + convolution of the transformed commutator, the two `ad` cross-term convolutions, + and the convolution of Maurer–Cartan bracket shifts. This is `repGauge_commutator` + at every derivative order simultaneously; the regrouping of the four-fold splitting + is `Multiset.sum_antidiagonal_exchange`. -/ +lemma repGauge_iteratedD_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (Lorentz.iteratedD D D_comm s (commutator A μ ν φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (commutator A μ ν + (adjointDualCoeff U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (A ν (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ))))))).sum).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν))))))).sum).sum + + (s.antidiagonal.map fun p => + algebraMap ℂ B (φ ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ μ)), + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.2 + (maurerCartanForm U⁻¹ ν))⁆)).sum := by + -- the affine transformation law of the derived symbols, with the Leibniz sum as a map + have hAlaw : ∀ (τ : Fin 1 ⊕ Fin 3) (u : Multiset (Fin 1 ⊕ Fin 3)) + (ψ : Module.Dual ℝ GaugeAlgebra), + repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A τ) ψ) = + ((u.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A τ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ τ)))) := by + intro τ u ψ + show repGauge U (Lorentz.iteratedD D D_comm u (A τ ψ)) = _ + rw [hA.gauge_apply_deriv U u τ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + -- the convolution triple sum in its two groupings + have hMa : (s.antidiagonal.map fun p => + bracketFam ((p.1.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A μ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ + adjointDualCoeff U⁻¹ r.1).sum) φ).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A μ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ + adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [bracketFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [bracketFam_sum_right, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + have hMc : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (commutator A μ ν + (adjointDualCoeff U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A μ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ + adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [commutator_eq_bracketFam, bracketFam_adjointDualCoeff U⁻¹ p.1 (A μ) (A ν) φ, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [iteratedD_bracketFam hD p.2 (A μ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (A ν ∘ₗ adjointDualCoeff U⁻¹ q.2) φ] + have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => + bracketFam ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A μ ∘ₗ + adjointDualCoeff U⁻¹ a) + ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ A ν ∘ₗ + adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) + -- the cross-term sums, applied + have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ + adjointDualCoeff U⁻¹ r.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)))) = + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (A ν (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ))))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] + have hCf : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.1.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A μ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν)))) = + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν))))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] + -- expand the left side and split the four convolutions + rw [commutator_eq_bracketFam, iteratedD_bracketFam hD s (A μ) (A ν) φ, + map_multiset_sum, Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, hA.repGauge_bracketFam U (hAlaw μ p.1) (hAlaw ν p.2) φ, + hCg p, hCf p]), + Multiset.sum_map_add, Multiset.sum_map_sub, Multiset.sum_map_add, hM, + commutator_eq_bracketFam] + + end IsGaugeField end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean new file mode 100644 index 000000000..9b9b64a99 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean @@ -0,0 +1,889 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint +/-! + +# Gauge tensors in a general representation + +The adjoint story of `TransformsInAdjoint` generalizes to an arbitrary representation +of the jet gauge group: a matter field valued in a representation space `V` has +symbols `[∂_s ψ^i]` contracted against duals of `V`, and its transformation law is +the Leibniz convolution of the base-point Taylor coefficients of the representation. + +Since the gauge transformations are jets, the representation must act on `V`-valued +jets `JetRing ⊗[ℂ] V` — the value of `rep U` at a constant vector is spacetime +dependent, and the derivative symbols see its Taylor coefficients. This file provides +the toolkit for `V`-valued jets: + +* `jetOfConstant` — the inclusion of constants, `v ↦ 1 ⊗ v`; +* `jetDeriv`/`jetIteratedDeriv` — the formal derivative, acting on the jet factor; +* `jetEval` — evaluation at the base point, `f ⊗ v ↦ (constant coefficient of f) • v`; + +and with them + +* `repDualCoeff rep U x` — the physicists' `∂_x (rep U)^i_j|₀` transposed to the dual + of `V`, the analogue of `adjointDualCoeff` for a general representation; +* `TransformsIn` — the generalization of `TransformsInAdjoint`: the derivative + symbols of the family transform by the Leibniz convolution of `repDualCoeff`, with + no inhomogeneous term. + +## The covariant derivative + +The covariant derivative `∇_ρ F = D_ρ F + (A_ρ acting on the value index)` requires +the *infinitesimal* action of the gauge algebra on the value space — physicists' +`i dρ(T^a)` — which cannot be extracted from the abstract group representation `rep` +(there is no differentiable structure to differentiate it). It is therefore taken as +data: an `ℝ`-bilinear action `act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W`. The layer is +built for an arbitrary finite-dimensional real value space `W`, so that the adjoint +case `act = adAction` (the bracket as a bilinear map) literally specializes: +`covDerivAction A adAction F D ρ = covDerivAdjoint A F D ρ` holds definitionally +(`covDerivAction_adAction`). + +The compatibility between `rep` and `act` is the structure `IsInfinitesimalActionOf`: +its two fields are the Leibniz law of the representation coefficients in the +Maurer–Cartan form (`repCoeff_cons`, the analogue of `adjointDualCoeff_cons`) and +the intertwining of `act` by the transports (`repCoeff_act`, the analogue of +`adjointTransport_bracket`). Under it the covariant derivative preserves the gauge +tensors: `TransformsIn.covDerivAction`. + +-/ + +@[expose] public section + +namespace StandardModel +open Matrix MatrixGroups TensorProduct MvPowerSeries +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## `V`-valued jets + +-/ + +/-- The constant-coefficient evaluation of a jet, as a `ℂ`-linear map. -/ +noncomputable def _root_.JetRing.constantCoeffₗ : JetRing →ₗ[ℂ] ℂ where + toFun := constantCoeff + map_add' f g := by simp + map_smul' c f := by simp [smul_eq_C_mul] + +@[simp] +lemma _root_.JetRing.constantCoeffₗ_apply (f : JetRing) : + JetRing.constantCoeffₗ f = constantCoeff f := rfl + +/-- The inclusion of constants into `V`-valued jets: `v ↦ 1 ⊗ v`. -/ +noncomputable def jetOfConstant : V →ₗ[ℂ] JetRing ⊗[ℂ] V := + TensorProduct.mk ℂ JetRing V 1 + +@[simp] +lemma jetOfConstant_apply (v : V) : jetOfConstant v = (1 : JetRing) ⊗ₜ[ℂ] v := rfl + +/-- The formal derivative on `V`-valued jets in the direction `μ`, acting on the jet + factor. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : + JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V := + LinearMap.rTensor V (pderiv ℂ μ).toLinearMap + +@[simp] +lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : JetRing) (v : V) : + jetDeriv μ (f ⊗ₜ[ℂ] v) = pderiv ℂ μ f ⊗ₜ[ℂ] v := rfl + +/-- Formal derivatives on `V`-valued jets commute, since the partial derivatives of + jets do. -/ +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (jetDeriv (V := V) μ).comp (jetDeriv ν) = (jetDeriv ν).comp (jetDeriv μ) := by + rw [jetDeriv, jetDeriv, ← LinearMap.rTensor_comp, ← LinearMap.rTensor_comp] + exact congrArg (LinearMap.rTensor V) + (LinearMap.ext fun f => JetRing.pderiv_comm μ ν f) + +/-- Post-composition with `jetDeriv` is right-commutative, which is what allows + iterated derivatives to be indexed by a `Multiset` of directions. -/ +instance : RightCommutative (fun (L : JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V) + (μ : Fin 1 ⊕ Fin 3) => L.comp (jetDeriv μ)) where + right_comm L μ ν := by + refine LinearMap.ext fun x => ?_ + have h := LinearMap.congr_fun (jetDeriv_comm μ ν) x + simp only [LinearMap.coe_comp, Function.comp_apply] at h ⊢ + exact congrArg L h + +/-- The iterated formal derivative on `V`-valued jets, in the (unordered) directions + given by the multiset `μs`. -/ +noncomputable def jetIteratedDeriv (μs : Multiset (Fin 1 ⊕ Fin 3)) : + JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V := + μs.foldl (fun L μ => L.comp (jetDeriv μ)) LinearMap.id + +@[simp] +lemma jetIteratedDeriv_zero : + jetIteratedDeriv (V := V) (0 : Multiset (Fin 1 ⊕ Fin 3)) = LinearMap.id := by + simp [jetIteratedDeriv] + +lemma jetIteratedDeriv_cons (μ : Fin 1 ⊕ Fin 3) (μs : Multiset (Fin 1 ⊕ Fin 3)) : + jetIteratedDeriv (V := V) (μ ::ₘ μs) = (jetDeriv μ).comp (jetIteratedDeriv μs) := by + have h : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (L : JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V), + s.foldl (fun L μ => L.comp (jetDeriv μ)) L = L.comp (jetIteratedDeriv s) := by + intro s + induction s using Multiset.induction_on with + | empty => intro L; simp [jetIteratedDeriv] + | cons κ t ih => + intro L + rw [jetIteratedDeriv, Multiset.foldl_cons, Multiset.foldl_cons, ih, ih] + simp [LinearMap.comp_assoc] + rw [jetIteratedDeriv, Multiset.foldl_cons, h] + simp + +/-- The iterated derivative is additive in the multiset of directions. -/ +lemma jetIteratedDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + jetIteratedDeriv (V := V) (s + t) = + (jetIteratedDeriv s).comp (jetIteratedDeriv t) := by + induction s using Multiset.induction_on with + | empty => simp + | cons μ s ih => + rw [Multiset.cons_add, jetIteratedDeriv_cons, jetIteratedDeriv_cons, ih, + LinearMap.comp_assoc] + +@[simp] +lemma jetIteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + jetIteratedDeriv (V := V) ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = jetDeriv μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, jetIteratedDeriv_cons, + jetIteratedDeriv_zero, LinearMap.comp_id] + +/-- Evaluation of a `V`-valued jet at the base point: + `f ⊗ v ↦ (constant coefficient of f) • v`. This is a retraction of + `jetOfConstant`. -/ +noncomputable def jetEval : JetRing ⊗[ℂ] V →ₗ[ℂ] V := + TensorProduct.lift ((LinearMap.lsmul ℂ V).comp JetRing.constantCoeffₗ) + +@[simp] +lemma jetEval_tmul (f : JetRing) (v : V) : + jetEval (f ⊗ₜ[ℂ] v) = constantCoeff f • v := rfl + +@[simp] +lemma jetEval_jetOfConstant (v : V) : jetEval (jetOfConstant v) = v := by + simp + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} +variable [Lorentz.IsLorentzDeriv repLorentz D] +variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} + +/-! + +## The dual representation coefficients and gauge tensors in a representation + +-/ + +/-- The base-point adjoint transport at `x` derivatives, un-dualized: the map on the + gauge algebra whose transpose is `adjointDualCoeff`. -/ +noncomputable def adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := + JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv x ∘ₗ + JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant + +lemma adjointDualCoeff_eq_dualMap (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + adjointDualCoeff U x = (adjointCoeff U x).dualMap := rfl + +/-- The physicists' `∂_x (rep U)^i_j|₀`, un-dualized: include the constant vector + into `V`-valued jets, act by `rep U`, differentiate `x` times, evaluate at the base + point — the base-point Taylor coefficient of the representation, as a real-linear + map on the value space. -/ +noncomputable def repCoeff (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : V →ₗ[ℝ] V := + (jetEval ∘ₗ jetIteratedDeriv x ∘ₗ rep U ∘ₗ jetOfConstant).restrictScalars ℝ + +/-- The physicists' `∂_x (rep U)^i_j|₀` acting on the dual index of a matter-field + symbol: the transpose of `repCoeff`. This is the analogue of `adjointDualCoeff` + for a general representation of the jet gauge group; for `x = 0` it is the dual + (contragredient) action of the value of `U`, and for `x ≠ 0` it sees the + derivatives of the gauge transformation. -/ +noncomputable def repDualCoeff (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ V →ₗ[ℝ] Module.Dual ℝ V := + (repCoeff rep U x).dualMap + +/-- A component family `F`, with values in `B` and index in the dual of the + representation space `V`, *transforms in* the representation `rep` of the jet gauge + group when each derivative symbol `[∂_s F^φ]` transforms by the Leibniz convolution + of the dual representation coefficients against lower derivative symbols, with no + inhomogeneous term — the generalization of `TransformsInAdjoint` from the adjoint + representation to an arbitrary one. -/ +def TransformsIn (_hA : IsGaugeField repLorentz repGauge A D D_comm) + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (F : Module.Dual ℝ V →ₗ[ℝ] B) : Prop := + ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℝ V) (s : Multiset (Fin 1 ⊕ Fin 3)), + repGauge U (Lorentz.iteratedD D D_comm s (F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + +/-! + +## The infinitesimal action underlying a representation + +-/ + +/-- `act` is the *infinitesimal action* of the gauge algebra underlying the + representation `rep` of the jet gauge group, when the base-point Taylor + coefficients of `rep` satisfy the two laws forced by `rep` being generated by + `act`: + + * `repCoeff_cons` — the Leibniz rule in the Maurer–Cartan form: differentiating + the representation once produces minus the action of the Maurer–Cartan form, + with the remaining derivatives distributed over the antidiagonal (for the + adjoint representation this is `adjointDualCoeff_cons`); + * `repCoeff_act` — the transports of `rep` intertwine `act` with the adjoint + transports, as an antidiagonal convolution (for the adjoint representation this + is `adjointTransport_bracket`); at `x = 0` it is the classical equivariance + `rep(U)|₀ ∘ act c = act (Ad(U) c)|₀ ∘ rep(U)|₀`. + + These are exactly the identities consumed by the proof that the covariant + derivative `covDerivAction` preserves `TransformsIn`. -/ +structure IsInfinitesimalActionOf (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V) + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) : Prop where + repCoeff_cons : ∀ (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)), + repCoeff rep U (μ ::ₘ x) = + -((x.antidiagonal.map fun p => + act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) ∘ₗ repCoeff rep U p.2).sum) + repCoeff_act : ∀ (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) + (c : GaugeAlgebra), + repCoeff rep U x ∘ₗ act c = + ((x.antidiagonal.map fun p => + act (adjointCoeff U p.1 c) ∘ₗ repCoeff rep U p.2).sum) + +/-- The dual form of the Leibniz law: the once-more-derived dual coefficient is + minus the antidiagonal convolution of dual coefficients against `act` of the + derived Maurer–Cartan form — the analogue of `adjointDualCoeff_cons`. -/ +lemma IsInfinitesimalActionOf.repDualCoeff_cons + {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ V) : + repDualCoeff rep U (μ ::ₘ x) φ = + -((x.antidiagonal.map fun p => + repDualCoeff rep U p.2 (φ ∘ₗ act (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U μ))))).sum) := by + refine LinearMap.ext fun v => ?_ + have h1 := LinearMap.congr_fun (h.repCoeff_cons U μ x) v + simp only [LinearMap.neg_apply, Multiset.sum_linearMap_apply, Multiset.map_map, + Function.comp_apply, LinearMap.coe_comp] at h1 + simp only [repDualCoeff, LinearMap.dualMap_apply, LinearMap.neg_apply, + Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_apply, + LinearMap.coe_comp] + rw [h1, map_neg, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => rfl)) + +/-! + +## The covariant derivative through an infinitesimal action + +-/ + +section Action + +variable {W : Type} [AddCommGroup W] [Module ℝ W] + +/-- The action of an adjoint-valued field on a `W`-valued field at the tensor level: + multiplication in `B` on the first factors, the infinitesimal action `act` of the + gauge algebra on `W` on the second, so that on pure tensors + `(b₁ ⊗ c) · (b₂ ⊗ w) = (b₁ b₂) ⊗ act c w`. For `W` the gauge algebra and `act` the + adjoint action this is `tensorBracket` (`tensorAction_ad`). -/ +noncomputable def tensorAction (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) : + (B ⊗[ℝ] GaugeAlgebra) →ₗ[ℝ] (B ⊗[ℝ] W) →ₗ[ℝ] B ⊗[ℝ] W := + TensorProduct.curry + ((TensorProduct.map (TensorProduct.lift (LinearMap.mul ℝ B)) + (TensorProduct.lift act)) ∘ₗ + (TensorProduct.tensorTensorTensorComm ℝ B GaugeAlgebra B W).toLinearMap) + +@[simp] +lemma tensorAction_tmul (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (b₁ b₂ : B) + (c : GaugeAlgebra) (w : W) : + tensorAction act (b₁ ⊗ₜ[ℝ] c) (b₂ ⊗ₜ[ℝ] w) = (b₁ * b₂) ⊗ₜ[ℝ] act c w := by + simp [tensorAction, TensorProduct.tensorTensorTensorComm_tmul] + +/-- The gauge-algebra bracket as a bilinear map — the infinitesimal adjoint + action. -/ +noncomputable def adAction : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := + LinearMap.mk₂ ℝ (fun a b => ⁅a, b⁆) (fun a a' b => add_lie a a' b) + (fun t a b => smul_lie t a b) (fun a b b' => lie_add a b b') + (fun t a b => lie_smul t a b) + +@[simp] +lemma adAction_apply (a b : GaugeAlgebra) : adAction a b = ⁅a, b⁆ := rfl + +/-- On the gauge algebra, the tensor action through the adjoint is the tensor + bracket. -/ +lemma tensorAction_adAction : tensorAction (B := B) adAction = tensorBracket := rfl + +lemma tensorAction_map_left (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (Φ : B →ₗ[ℝ] B) + (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) (s : B ⊗[ℝ] GaugeAlgebra) + (t : B ⊗[ℝ] W) : + tensorAction act ((TensorProduct.map Φ LinearMap.id) s) + ((TensorProduct.map Φ LinearMap.id) t) = + (TensorProduct.map Φ LinearMap.id) (tensorAction act s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hΦ] + | add x y hx hy => + simp only [map_add] + rw [hx, hy] + | add x y hx hy => simp [hx, hy] + +lemma tensorAction_one_left (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (c : GaugeAlgebra) + (t : B ⊗[ℝ] W) : + tensorAction act ((1 : B) ⊗ₜ[ℝ] c) t = + (TensorProduct.map LinearMap.id (act c)) t := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +/-- `tensorAction` is a derivation in the algebra factor: for `Δ` satisfying the + Leibniz rule on `B`, applying `Δ ⊗ id` distributes over the two arguments. -/ +lemma tensorAction_map_left_derivation (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (Δ : B →ₗ[ℝ] B) (hΔ : ∀ b₁ b₂, Δ (b₁ * b₂) = Δ b₁ * b₂ + b₁ * Δ b₂) + (s : B ⊗[ℝ] GaugeAlgebra) (t : B ⊗[ℝ] W) : + (TensorProduct.map Δ LinearMap.id) (tensorAction act s t) = + tensorAction act ((TensorProduct.map Δ LinearMap.id) s) t + + tensorAction act s ((TensorProduct.map Δ LinearMap.id) t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hΔ, TensorProduct.add_tmul] + | add x y hx hy => + simp only [map_add, hx, hy] + abel + | add x y hx hy => + simp only [map_add, LinearMap.add_apply, hx, hy] + abel + +/-- `tensorAction` under an antidiagonal pair of transport families: if the + `W`-transports intertwine `act` with the `GaugeAlgebra`-transports as an + antidiagonal convolution, so do `id ⊗ ·` over `tensorAction`. -/ +lemma tensorAction_map_right_antidiagonal (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (Tg : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) + (Tv : Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[ℝ] W) (x : Multiset (Fin 1 ⊕ Fin 3)) + (hT : ∀ (c : GaugeAlgebra) (w : W), Tv x (act c w) = + (x.antidiagonal.map fun p => act (Tg p.1 c) (Tv p.2 w)).sum) + (s : B ⊗[ℝ] GaugeAlgebra) (t : B ⊗[ℝ] W) : + (x.antidiagonal.map fun p => + tensorAction act ((TensorProduct.map LinearMap.id (Tg p.1)) s) + ((TensorProduct.map LinearMap.id (Tv p.2)) t)).sum = + (TensorProduct.map LinearMap.id (Tv x)) (tensorAction act s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => + simp only [tensorAction_tmul, TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [hT, Multiset.tmul_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + simp) + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by rw [map_add, map_add]), + Multiset.sum_map_add, hy, hz, ← map_add, ← map_add] + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by + rw [map_add, map_add, LinearMap.add_apply]), + Multiset.sum_map_add, hy, hz, ← map_add, ← LinearMap.add_apply, ← map_add] + +variable [FiniteDimensional ℝ W] + +/-- The canonical equivalence between `W`-valued fields `B ⊗ W` and their component + families `φ ↦ F^φ` — `dualPairEquiv` for a general finite-dimensional value + space. -/ +noncomputable def dualPairEquivW : (B ⊗[ℝ] W) ≃ₗ[ℝ] (Module.Dual ℝ W →ₗ[ℝ] B) := + TensorProduct.comm ℝ B W ≪≫ₗ + TensorProduct.congr (Module.evalEquiv ℝ W) (LinearEquiv.refl ℝ B) ≪≫ₗ + dualTensorHomEquiv ℝ (Module.Dual ℝ W) B + +@[simp] +lemma dualPairEquivW_tmul (b : B) (w : W) (φ : Module.Dual ℝ W) : + dualPairEquivW (b ⊗ₜ[ℝ] w) φ = φ w • b := by + simp [dualPairEquivW, dualTensorHomEquiv, Module.evalEquiv_apply] + +/-- On the gauge algebra, `dualPairEquivW` is `dualPairEquiv`. -/ +lemma dualPairEquivW_gaugeAlgebra : + (dualPairEquivW : (B ⊗[ℝ] GaugeAlgebra) ≃ₗ[ℝ] _) = dualPairEquiv := rfl + +lemma dualPairEquivW_map_left (Φ : B →ₗ[ℝ] B) (t : B ⊗[ℝ] W) + (φ : Module.Dual ℝ W) : + dualPairEquivW ((TensorProduct.map Φ LinearMap.id) t) φ = + Φ (dualPairEquivW t φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b w => simp + | add x y hx hy => simp [hx, hy] + +lemma dualPairEquivW_map_right (T : W →ₗ[ℝ] W) (t : B ⊗[ℝ] W) + (φ : Module.Dual ℝ W) : + dualPairEquivW ((TensorProduct.map LinearMap.id T) t) φ = + dualPairEquivW t (T.dualMap φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b w => simp + | add x y hx hy => simp [hx, hy] + +lemma symm_comp_left_W (Φ : B →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) : + dualPairEquivW.symm (Φ ∘ₗ g) = + (TensorProduct.map Φ LinearMap.id) (dualPairEquivW.symm g) := by + apply dualPairEquivW.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquivW_map_left, LinearEquiv.apply_symm_apply] + rfl + +lemma symm_comp_right_W (T : W →ₗ[ℝ] W) (g : Module.Dual ℝ W →ₗ[ℝ] B) : + dualPairEquivW.symm (g ∘ₗ T.dualMap) = + (TensorProduct.map LinearMap.id T) (dualPairEquivW.symm g) := by + apply dualPairEquivW.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquivW_map_right, LinearEquiv.apply_symm_apply] + rfl + +/-- The action of an adjoint-indexed component family on a `W`-indexed one, through + the infinitesimal action `act`: assemble both into fields, act by `tensorAction`, + read back out as components. This is the physicists' `f^a (T_a)^i_j g^j` with + `T = act`, basis-free; for the adjoint action it is `bracketFam` + (`actionFam_ad`). -/ +noncomputable def actionFam (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) : + Module.Dual ℝ W →ₗ[ℝ] B := + dualPairEquivW (tensorAction act (dualPairEquiv.symm f) (dualPairEquivW.symm g)) + +/-- On the gauge algebra, the action family through the adjoint is the bracket + family. -/ +lemma actionFam_adAction (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + actionFam adAction f g = bracketFam f g := rfl + +variable {act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W} + +lemma actionFam_add_left (f₁ f₂ : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (g : Module.Dual ℝ W →ₗ[ℝ] B) : + actionFam act (f₁ + f₂) g = actionFam act f₁ g + actionFam act f₂ g := by + simp only [actionFam, map_add, LinearMap.add_apply] + +lemma actionFam_add_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (g₁ g₂ : Module.Dual ℝ W →ₗ[ℝ] B) : + actionFam act f (g₁ + g₂) = actionFam act f g₁ + actionFam act f g₂ := by + simp only [actionFam, map_add] + +lemma actionFam_zero_left (g : Module.Dual ℝ W →ₗ[ℝ] B) : + actionFam act 0 g = 0 := by + simp [actionFam] + +lemma actionFam_zero_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + actionFam act f 0 = 0 := by + simp [actionFam] + +lemma actionFam_sum_left (S : Multiset (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B)) + (g : Module.Dual ℝ W →ₗ[ℝ] B) : + actionFam act S.sum g = (S.map fun f => actionFam act f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [actionFam_zero_left] + | cons f S ih => simp [actionFam_add_left, ih] + +lemma actionFam_sum_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (S : Multiset (Module.Dual ℝ W →ₗ[ℝ] B)) : + actionFam act f S.sum = (S.map fun g => actionFam act f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [actionFam_zero_right] + | cons g S ih => simp [actionFam_add_right, ih] + +/-- With `D` a derivation, the one-step Leibniz rule for the action of families. -/ +lemma deriv_actionFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (κ : Fin 1 ⊕ Fin 3) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) + (φ : Module.Dual ℝ W) : + D κ (actionFam act f g φ) = + actionFam act ((D κ).restrictScalars ℝ ∘ₗ f) g φ + + actionFam act f ((D κ).restrictScalars ℝ ∘ₗ g) φ := by + have h := congrArg (fun z => dualPairEquivW z φ) + (tensorAction_map_left_derivation act ((D κ).restrictScalars ℝ) + (fun b₁ b₂ => hD κ b₁ b₂) (dualPairEquiv.symm f) (dualPairEquivW.symm g)) + simp only [map_add, LinearMap.add_apply, dualPairEquivW_map_left] at h + rw [← symm_comp_left, ← symm_comp_left_W] at h + exact h + +/-- The iterated Leibniz rule for the action of families: the iterated derivative of + `A · F` is the antidiagonal convolution of derived actions. -/ +lemma iteratedD_actionFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (s : Multiset (Fin 1 ⊕ Fin 3)) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) + (φ : Module.Dual ℝ W) : + Lorentz.iteratedD D D_comm s (actionFam act f g φ) = + (s.antidiagonal.map fun p => + actionFam act ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) + ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) φ).sum := by + induction s using Multiset.induction_on generalizing f g with + | empty => + simp [Lorentz.iteratedD_zero, Multiset.antidiagonal_zero, + show (LinearMap.id : B →ₗ[ℂ] B).restrictScalars ℝ = LinearMap.id from rfl] + | cons κ s ih => + rw [Lorentz.iteratedD_cons, LinearMap.comp_apply, ih f g, map_multiset_sum, + Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, deriv_actionFam hD κ, + show (D κ).restrictScalars ℝ ∘ₗ + ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) = + (Lorentz.iteratedD D D_comm (κ ::ₘ p.1)).restrictScalars ℝ ∘ₗ f from by + rw [Lorentz.iteratedD_cons]; rfl, + show (D κ).restrictScalars ℝ ∘ₗ + ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) = + (Lorentz.iteratedD D D_comm (κ ::ₘ p.2)).restrictScalars ℝ ∘ₗ g from by + rw [Lorentz.iteratedD_cons]; rfl]), + Multiset.sum_map_add] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + abel + +set_option maxHeartbeats 1000000 in +/-- The gauge transformation of the action of an affinely-transforming + adjoint-indexed family on a linearly-transforming `W`-indexed family: the action of + the transformed families plus one `ad`-type cross term through `act`. This is + `repGauge_bracketFam` with a homogeneous second slot and the bracket replaced by + a general action. -/ +lemma repGauge_actionFam (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) {f f' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {g g' : Module.Dual ℝ W →ₗ[ℝ] B} {cf : GaugeAlgebra} + (hf : ∀ ψ : Module.Dual ℝ GaugeAlgebra, + repGauge U (f ψ) = f' ψ + algebraMap ℂ B (ψ cf)) + (hg : ∀ ψ : Module.Dual ℝ W, repGauge U (g ψ) = g' ψ) + (φ : Module.Dual ℝ W) : + repGauge U (actionFam act f g φ) = + actionFam act f' g' φ + g' (φ ∘ₗ act cf) := by + set Φ : B →ₗ[ℝ] B := (repGauge U).restrictScalars ℝ with hΦdef + have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => + hA.gauge_mul U b₁ b₂ + set s : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm f with hs + set t : B ⊗[ℝ] W := dualPairEquivW.symm g with ht + set s' : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm f' with hs' + set t' : B ⊗[ℝ] W := dualPairEquivW.symm g' with ht' + have hfm : (TensorProduct.map Φ LinearMap.id) s = s' + (1 : B) ⊗ₜ[ℝ] cf := by + rw [hs, hs', ← symm_comp_left, + show Φ ∘ₗ f = f' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cf) from + LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hf ψ, dualPairEquiv_one_tmul], + map_add, LinearEquiv.symm_apply_apply] + have hgm : (TensorProduct.map Φ LinearMap.id) t = t' := by + rw [ht, ht', ← symm_comp_left_W, + show Φ ∘ₗ g = g' from LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, hΦdef, LinearMap.restrictScalars_apply] + rw [hg ψ]] + have hact : dualPairEquivW (tensorAction act s t) = actionFam act f g := by + rw [hs, ht]; rfl + have hact' : dualPairEquivW (tensorAction act s' t') = actionFam act f' g' := by + rw [hs', ht']; rfl + have hπt' : dualPairEquivW t' = g' := by + rw [ht']; exact dualPairEquivW.apply_symm_apply _ + clear_value Φ s t s' t' + have htensor : (TensorProduct.map Φ LinearMap.id) (tensorAction act s t) = + tensorAction act s' t' + + (TensorProduct.map LinearMap.id (act cf)) t' := by + refine (tensorAction_map_left act Φ hΦmul s t).symm.trans + ((congrArg₂ (fun X Y => tensorAction act X Y) hfm hgm).trans ?_) + rw [map_add, LinearMap.add_apply, tensorAction_one_left] + have hread := congrArg (fun z => dualPairEquivW z φ) htensor + simp only [map_add, LinearMap.add_apply, dualPairEquivW_map_left, + dualPairEquivW_map_right] at hread + rw [show repGauge U (actionFam act f g φ) = + Φ (dualPairEquivW (tensorAction act s t) φ) from by + rw [hact, hΦdef]; rfl, + hread, hact', hπt'] + rfl + +/-- The covariant derivative of a `W`-indexed component family through the + infinitesimal action `act` of the gauge algebra on `W`: + + `∇_ρ F = D_ρ F + A_ρ · F`, + + the total derivative plus the action of the gauge field on the value index. With + the physicists' factor of `i` absorbed into `act` (as it is in the gauge-algebra + bracket), this is `∂_ρ F + i A_ρ^a T_a F` in the `D = ∂ + i A` convention. For the + adjoint action it is `covDerivAdjoint` (`covDerivAction_ad`). -/ +noncomputable def covDerivAction + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ W →ₗ[ℝ] B := + (D ρ).restrictScalars ℝ ∘ₗ F + actionFam act (A ρ) F + +@[simp] +lemma covDerivAction_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ W) : + covDerivAction A act F D ρ φ = D ρ (F φ) + actionFam act (A ρ) F φ := rfl + +/-- Through the adjoint action, the general covariant derivative is the adjoint + one. -/ +lemma covDerivAction_adAction (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) : + covDerivAction A adAction F D ρ = covDerivAdjoint A F D ρ := rfl + +end Action + +/-! + +## The covariant derivative preserves `TransformsIn` + +-/ + +section MatterCovariance + +variable {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} +variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} +variable [FiniteDimensional ℝ V] + +/-- The action of families against the dual representation coefficients: the + antidiagonal convolution mixing the adjoint transport on the field slot with the + representation transport on the matter slot — the family-level form of + `IsInfinitesimalActionOf.repCoeff_act`, and the analogue of + `bracketFam_adjointDualCoeff`. -/ +lemma IsInfinitesimalActionOf.actionFam_repDualCoeff + (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (g : Module.Dual ℝ V →ₗ[ℝ] B) (φ : Module.Dual ℝ V) : + actionFam act f g (repDualCoeff rep U x φ) = + (x.antidiagonal.map fun p => + actionFam act (f ∘ₗ adjointDualCoeff U p.1) + (g ∘ₗ repDualCoeff rep U p.2) φ).sum := by + have hT : ∀ (c : GaugeAlgebra) (v : V), repCoeff rep U x (act c v) = + (x.antidiagonal.map fun p => + act (adjointCoeff U p.1 c) (repCoeff rep U p.2 v)).sum := by + intro c v + have h1 := LinearMap.congr_fun (h.repCoeff_act U x c) v + simpa [Multiset.sum_linearMap_apply, Multiset.map_map, LinearMap.coe_comp, + Function.comp_apply] using h1 + rw [show repDualCoeff rep U x = (repCoeff rep U x).dualMap from rfl, + show actionFam act f g ((repCoeff rep U x).dualMap φ) = + dualPairEquivW ((TensorProduct.map LinearMap.id (repCoeff rep U x)) + (tensorAction act (dualPairEquiv.symm f) (dualPairEquivW.symm g))) φ from + (dualPairEquivW_map_right (repCoeff rep U x) _ φ).symm, + ← tensorAction_map_right_antidiagonal act (adjointCoeff U) (repCoeff rep U) x hT, + map_multiset_sum, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + simp only [Function.comp_apply] + rw [← symm_comp_right, ← symm_comp_right_W] + rfl + +omit [FiniteDimensional ℝ V] in +/-- If `F` transforms in `rep`, so do its `κ ::ₘ s`-derived symbols, with the extra + derivative traced through `IsInfinitesimalActionOf.repDualCoeff_cons`: the Leibniz + splittings where `κ` stays a derivative, minus the convolution where `κ` hits the + representation — `act` of the derived Maurer–Cartan form. -/ +lemma TransformsIn.repGauge_iteratedD_cons + {hA : IsGaugeField repLorentz repGauge A D D_comm} + {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + (hact : IsInfinitesimalActionOf act rep) + (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ V) : + repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + rw [hF U φ (κ ::ₘ s)] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 + (F (repDualCoeff rep U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = + -(s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + rw [← Multiset.sum_map_neg''] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [hact.repDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, + Multiset.map_map, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) + rw [hsec, sub_eq_add_neg] + +set_option maxHeartbeats 2000000 in +/-- The all-orders gauge transformation of the derived action `A_ρ · F` for `F` + transforming in `rep`: since `F` transforms homogeneously, only one cross-term + convolution through `act` survives — the analogue of + `repGauge_iteratedD_commutator` with a matter field in the second slot. -/ +lemma TransformsIn.repGauge_iteratedD_action + {hA : IsGaugeField repLorentz repGauge A D D_comm} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + (hact : IsInfinitesimalActionOf act rep) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ V) : + repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F + (repDualCoeff rep U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum := by + have hAlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), + repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A ρ) ψ) = + ((u.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ ρ)))) := by + intro u ψ + show repGauge U (Lorentz.iteratedD D D_comm u (A ρ ψ)) = _ + rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ V), + repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ F) ψ) = + ((u.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1).sum) ψ := by + intro u ψ + show repGauge U (Lorentz.iteratedD D D_comm u (F ψ)) = _ + rw [hF U ψ u, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + have hMa : (s.antidiagonal.map fun p => + actionFam act ((p.1.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1).sum) φ).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + actionFam act ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [actionFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [actionFam_sum_right, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + have hMc : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F + (repDualCoeff rep U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + actionFam act ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ q.2) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [hact.actionFam_repDualCoeff U⁻¹ p.1 (A ρ) F φ, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [iteratedD_actionFam hD p.2 (A ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F ∘ₗ repDualCoeff rep U⁻¹ q.2) φ] + have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => + actionFam act ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ a) + ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ c) φ).trans hMc.symm) + have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1).sum) + (φ ∘ₗ act (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] + rw [iteratedD_actionFam hD s (A ρ) F φ, map_multiset_sum, Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, repGauge_actionFam hA U (hAlaw p.1) (hFlaw p.2) φ, + hCg p]), + Multiset.sum_map_add, hM] + +set_option maxHeartbeats 2000000 in +/-- **The covariant derivative preserves `TransformsIn`**: if `F` transforms in the + representation `rep` and `act` is the infinitesimal action underlying `rep`, then + `∇_ρ F = D_ρ F + A_ρ · F` transforms in `rep`. The single inhomogeneous + convolution of `∂_{ρ ::ₘ s} F` cancels the single `act` cross-term convolution of + `A_ρ · F` through the coassociativity of the antidiagonal — the matter-field + analogue of `TransformsInAdjoint.covDerivAdjoint`. -/ +theorem TransformsIn.covDerivAction + {hA : IsGaugeField repLorentz repGauge A D D_comm} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + (hact : IsInfinitesimalActionOf act rep) (ρ : Fin 1 ⊕ Fin 3) : + hA.TransformsIn rep (covDerivAction A act F D ρ) := by + intro U φ s + have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), + Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by + intro κ t b + rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by + rw [add_comm, Multiset.singleton_add], + Lorentz.iteratedD_add, LinearMap.comp_apply] + congr 1 + have hL : repGauge U (Lorentz.iteratedD D D_comm s + (IsGaugeField.covDerivAction A act F D ρ φ)) = + repGauge U (Lorentz.iteratedD D D_comm (ρ ::ₘ s) (F φ)) + + repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) := by + rw [covDerivAction_apply, map_add, hDcomp ρ s, map_add] + have hR : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (IsGaugeField.covDerivAction A act F D ρ + (repDualCoeff rep U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (ρ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F + (repDualCoeff rep U⁻¹ p.1 φ))).sum := by + rw [← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [covDerivAction_apply, map_add, hDcomp ρ p.2] + have hcancel : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum := + Multiset.sum_antidiagonal_assoc s (fun a b c => + Lorentz.iteratedD D D_comm c (F (repDualCoeff rep U⁻¹ b + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv a + (maurerCartanForm U⁻¹ ρ))))))) + rw [hL, hF.repGauge_iteratedD_cons hact U ρ s φ, + hF.repGauge_iteratedD_action hD hact U s ρ φ, hR, hcancel] + abel + +end MatterCovariance + +end IsGaugeField + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean new file mode 100644 index 000000000..3f3a6e079 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean @@ -0,0 +1,326 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint +/-! + +# The field strength + +The field strength is defined as +``` + F_{μν} = D_μ A_ν − D_ν A_μ + ⁅A_μ, A_ν⁆ +``` +with `⁅·,·⁆` the gauge-algebra bracket, which already carries the physicists' factor +of `i` (on the matrix factors `⁅a, b⁆ = i(ab − ba)`). In terms of the plain matrix +commutator this is `F_{μν} = D_μ A_ν − D_ν A_μ + i [A_μ, A_ν]`, the sign forced by +the convention `ω_μ(g) = i (∂_μ g) g⁻¹` for the Maurer–Cartan form (equivalently, by +its structural equation `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`): only with this +coefficient do the inhomogeneous terms cancel. It transforms under the gauge +transformation covariantly via the adjoint action (`repGauge_fieldStrength`). + +-/ + +@[expose] public section + +namespace StandardModel +open Matrix MatrixGroups TensorProduct +variable {B : Type} [Ring B] [Algebra ℂ B] + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} +variable [Lorentz.IsLorentzDeriv repLorentz D] +variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} + +/-- The field strength `F_μν = D_μ A_ν − D_ν A_μ + ⁅A_μ, A_ν⁆` of a family of + gauge-field symbols, as a component family: the derivative terms through the total + derivative `D`, the commutator term through `commutator`. This is the physicists' + `F_μν^a = ∂_μ A_ν^a − ∂_ν A_μ^a + f^a_{bc} A_μ^b A_ν^c`: the gauge-algebra bracket + already carries the physicists' factor of `i`, so no explicit factor appears — the + same normalization as in the structural equation of the Maurer–Cartan form, which + is exactly what makes the field strength transform without inhomogeneous terms + (`repGauge_fieldStrength`). -/ +noncomputable def fieldStrength (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + (D μ).restrictScalars ℝ ∘ₗ A ν - (D ν).restrictScalars ℝ ∘ₗ A μ + commutator A μ ν + +@[simp] +lemma fieldStrength_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + fieldStrength A D μ ν φ = D μ (A ν φ) - D ν (A μ φ) + commutator A μ ν φ := rfl + + +set_option maxHeartbeats 400000 in +/-- **The field strength transforms in the adjoint.** Under a gauge jet `U` all + inhomogeneous terms in the transformation of `F_μν = D_μ A_ν − D_ν A_μ + ⁅A_μ, A_ν⁆` + cancel: the Leibniz cross terms of the derivatives against the commutator cross + terms (`adjointDualCoeff_singleton`), and the derived Maurer–Cartan shifts against + the bracket of the two shifts (the structural equation of the Maurer–Cartan form). + What remains is the base-point dual adjoint action of `U⁻¹` on the adjoint index. -/ +lemma repGauge_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (fieldStrength A D μ ν φ) = fieldStrength A D μ ν (adjointDualCoeff U⁻¹ 0 φ) := by + -- the structural equation of the Maurer–Cartan form, under `φ ∘ eval` + have hstruct : + φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv μ (maurerCartanForm U⁻¹ ν))) = + φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ν (maurerCartanForm U⁻¹ μ))) + - φ ⁅JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ), + JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)⁆ := by + have h0 := congrArg (fun z => φ (JetGaugeAlgebra.eval z)) + (maurerCartanForm_structure U⁻¹ μ ν) + simp only [map_add, map_sub, map_zero, LieHom.map_lie] at h0 + linarith + rw [fieldStrength_apply, fieldStrength_apply, map_add, map_sub, + hA.repGauge_deriv_apply U μ ν φ, hA.repGauge_deriv_apply U ν μ φ, + hA.repGauge_commutator U μ ν φ, adjointDualCoeff_singleton U⁻¹ μ φ, + adjointDualCoeff_singleton U⁻¹ ν φ, map_neg, map_neg, hstruct, + Complex.ofReal_sub, map_sub] + abel + +set_option maxHeartbeats 1000000 in +/-- **The transformation law of the derived field strength**: for `D` a derivation + (Leibniz rule, taken as the hypothesis `hD` since `IsGaugeField` does not postulate + it), the once-derived field strength transforms by the Leibniz convolution of the + dual adjoint action against the underived field strength — with *no* Maurer–Cartan + shift, since the field strength itself transforms homogeneously: + + `U • ∂_ρ F_μν^φ = ∂_ρ (F_μν^{Ad₀* φ}) + F_μν^{(∂_ρ Ad)* φ}`. + + All inhomogeneous terms cancel: the two-derivative Leibniz terms of the fields + against the cross terms of the derived commutator (`adjointDualCoeff_pair` and + `adjointDualCoeff_singleton`), and the twice-derived Maurer–Cartan shifts against + the brackets of shifts (the `∂_ρ`-derivative of the structural equation). -/ +theorem repGauge_deriv_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (U : JetGaugeGroupI) (ρ μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (D ρ (fieldStrength A D μ ν φ)) = + D ρ (fieldStrength A D μ ν (adjointDualCoeff U⁻¹ 0 φ)) + + fieldStrength A D μ ν (adjointDualCoeff U⁻¹ {ρ} φ) := by + -- the base-point and once-derived adjoint transports, as maps on the gauge algebra + set T₀ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := + JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv 0 ∘ₗ + JetGaugeAlgebra.adjointMap U⁻¹ ∘ₗ JetGaugeAlgebra.ofConstant with hT₀def + set T₁ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := + JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv {ρ} ∘ₗ + JetGaugeAlgebra.adjointMap U⁻¹ ∘ₗ JetGaugeAlgebra.ofConstant with hT₁def + have hcoeff0 : adjointDualCoeff U⁻¹ 0 = T₀.dualMap := by rw [hT₀def]; rfl + have hcoeff1 : adjointDualCoeff U⁻¹ ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = T₁.dualMap := by + rw [hT₁def]; rfl + have hT₀lie : ∀ a b : GaugeAlgebra, T₀ ⁅a, b⁆ = ⁅T₀ a, T₀ b⁆ := by + intro a b + simp [hT₀def, JetGaugeAlgebra.ofConstant_lie, JetGaugeAlgebra.adjointMap_lie, + LieHom.map_lie] + have hT₁rel : ∀ a b : GaugeAlgebra, T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆ := by + intro a b + simp only [hT₁def, hT₀def, LinearMap.coe_comp, Function.comp_apply, + LieHom.coe_toLinearMap, JetGaugeAlgebra.iteratedDeriv_singleton, + JetGaugeAlgebra.iteratedDeriv_zero, LinearMap.id_coe, id_eq] + rw [JetGaugeAlgebra.ofConstant_lie, JetGaugeAlgebra.adjointMap_lie, + JetGaugeAlgebra.deriv_bracket, map_add, LieHom.map_lie, LieHom.map_lie] + -- brackets against the transported families + have hbr0 : ∀ f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B, + bracketFam (f ∘ₗ adjointDualCoeff U⁻¹ 0) (g ∘ₗ adjointDualCoeff U⁻¹ 0) φ = + bracketFam f g (adjointDualCoeff U⁻¹ 0 φ) := by + intro f g + rw [hcoeff0, bracketFam_comp_dualMap T₀ hT₀lie f g] + rfl + have hbrρ : ∀ f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B, + bracketFam (f ∘ₗ adjointDualCoeff U⁻¹ {ρ}) (g ∘ₗ adjointDualCoeff U⁻¹ 0) φ + + bracketFam (f ∘ₗ adjointDualCoeff U⁻¹ 0) (g ∘ₗ adjointDualCoeff U⁻¹ {ρ}) φ = + bracketFam f g (adjointDualCoeff U⁻¹ {ρ} φ) := by + intro f g + rw [hcoeff0, hcoeff1, ← LinearMap.add_apply, + bracketFam_dualMap_derivation T₀ T₁ hT₁rel f g] + rfl + -- the affine transformation laws of the four families entering the bracket terms + have hAμ0 : ∀ ψ : Module.Dual ℝ GaugeAlgebra, + repGauge U (A μ ψ) = (A μ ∘ₗ adjointDualCoeff U⁻¹ 0) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ))) := + fun ψ => hA.repGauge_apply U μ ψ + have hAν0 : ∀ ψ : Module.Dual ℝ GaugeAlgebra, + repGauge U (A ν ψ) = (A ν ∘ₗ adjointDualCoeff U⁻¹ 0) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν))) := + fun ψ => hA.repGauge_apply U ν ψ + have hDμ : ∀ ψ : Module.Dual ℝ GaugeAlgebra, + repGauge U (((D ρ).restrictScalars ℝ ∘ₗ A μ) ψ) = + (((D ρ).restrictScalars ℝ ∘ₗ A μ) ∘ₗ adjointDualCoeff U⁻¹ 0 + + A μ ∘ₗ adjointDualCoeff U⁻¹ {ρ}) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ μ)))) := + fun ψ => hA.repGauge_deriv_apply U ρ μ ψ + have hDν : ∀ ψ : Module.Dual ℝ GaugeAlgebra, + repGauge U (((D ρ).restrictScalars ℝ ∘ₗ A ν) ψ) = + (((D ρ).restrictScalars ℝ ∘ₗ A ν) ∘ₗ adjointDualCoeff U⁻¹ 0 + + A ν ∘ₗ adjointDualCoeff U⁻¹ {ρ}) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ ν)))) := + fun ψ => hA.repGauge_deriv_apply U ρ ν ψ + -- the transformed pieces + have h1 := hA.repGauge_deriv_deriv_apply U ρ μ ν φ + have h2 := hA.repGauge_deriv_deriv_apply U ρ ν μ φ + have h3 := hA.repGauge_bracketFam U hDμ hAν0 φ + have h4 := hA.repGauge_bracketFam U hAμ0 hDν φ + -- the split of both sides through the Leibniz rule + have hL : repGauge U (D ρ (fieldStrength A D μ ν φ)) = + repGauge U (D ρ (D μ (A ν φ))) - repGauge U (D ρ (D ν (A μ φ))) + + (repGauge U (bracketFam ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν) φ) + + repGauge U (bracketFam (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν) φ)) := by + rw [fieldStrength_apply, map_add, map_sub, deriv_commutator hD ρ μ ν φ, + map_add, map_sub, map_add] + have hR : D ρ (fieldStrength A D μ ν (adjointDualCoeff U⁻¹ 0 φ)) + + fieldStrength A D μ ν (adjointDualCoeff U⁻¹ {ρ} φ) = + (D ρ (D μ (A ν (adjointDualCoeff U⁻¹ 0 φ))) + - D ρ (D ν (A μ (adjointDualCoeff U⁻¹ 0 φ))) + + (bracketFam ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν) (adjointDualCoeff U⁻¹ 0 φ) + + bracketFam (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν) + (adjointDualCoeff U⁻¹ 0 φ))) + + (D μ (A ν (adjointDualCoeff U⁻¹ {ρ} φ)) + - D ν (A μ (adjointDualCoeff U⁻¹ {ρ} φ)) + + commutator A μ ν (adjointDualCoeff U⁻¹ {ρ} φ)) := by + rw [fieldStrength_apply, map_add, map_sub, + deriv_commutator hD ρ μ ν (adjointDualCoeff U⁻¹ 0 φ), fieldStrength_apply] + -- the `∂_ρ`-derivative of the structural equation, under `φ ∘ eval` + have hstruct2 : + φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ + (JetGaugeAlgebra.deriv μ (maurerCartanForm U⁻¹ ν)))) = + φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ + (JetGaugeAlgebra.deriv ν (maurerCartanForm U⁻¹ μ)))) + - φ ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ μ)), + JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)⁆ + - φ ⁅JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ), + JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ ν))⁆ := by + have h0 := congrArg (fun z => φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ z))) + (maurerCartanForm_structure U⁻¹ μ ν) + simp only [map_add, map_sub, map_zero, JetGaugeAlgebra.deriv_bracket, + LieHom.map_lie] at h0 + linarith + -- assemble + rw [hL, h1, h2, h3, h4, hR, commutator_eq_bracketFam, ← hbrρ (A μ) (A ν)] + simp only [bracketFam_add_left, bracketFam_add_right, LinearMap.add_apply, + LinearMap.comp_apply, LinearMap.restrictScalars_apply] + rw [hbr0 ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν), + hbr0 (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν), + adjointDualCoeff_singleton U⁻¹ μ φ, adjointDualCoeff_singleton U⁻¹ ν φ, + adjointDualCoeff_pair U⁻¹ ρ μ φ, adjointDualCoeff_pair U⁻¹ ρ ν φ] + simp only [map_sub, map_neg] + rw [hstruct2, Complex.ofReal_sub, Complex.ofReal_sub, map_sub, map_sub] + abel + +set_option maxHeartbeats 2000000 in +/-- **The general transformation law of iterated derivatives of the field strength**: + for `D` a derivation, every derivative symbol of `F_μν` transforms by the pure + Leibniz convolution of the dual adjoint action over the multiset antidiagonal — + the exact analogue of `gauge_apply_deriv` with *no* Maurer–Cartan shift, since the + field strength transforms homogeneously. The `κ`-into-the-adjoint splittings of the + derivative terms (`repGauge_iteratedD_cons_apply`) cancel the `ad` cross-term + convolutions of the commutator (`repGauge_iteratedD_commutator`) through the + coassociativity and swap of the antidiagonal, and the derived Maurer–Cartan shifts + cancel the bracket-shift convolution through the all-orders structural equation. -/ +lemma repGauge_iteratedD_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (Lorentz.iteratedD D D_comm s (fieldStrength A D μ ν φ)) = + (s.antidiagonal.map fun p => Lorentz.iteratedD D D_comm p.2 (fieldStrength A D μ ν + (adjointDualCoeff U⁻¹ p.1 φ))).sum := by + have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), + Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by + intro κ t b + rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by + rw [add_comm, Multiset.singleton_add], + Lorentz.iteratedD_add, LinearMap.comp_apply] + congr 1 + have hL : repGauge U (Lorentz.iteratedD D D_comm s (fieldStrength A D μ ν φ)) = + repGauge U (Lorentz.iteratedD D D_comm (μ ::ₘ s) (A ν φ)) + - repGauge U (Lorentz.iteratedD D D_comm (ν ::ₘ s) (A μ φ)) + + repGauge U (Lorentz.iteratedD D D_comm s (commutator A μ ν φ)) := by + rw [fieldStrength_apply, map_add, map_sub, hDcomp μ s, hDcomp ν s, map_add, map_sub] + have hR : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (fieldStrength A D μ ν + (adjointDualCoeff U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (μ ::ₘ p.2) (A ν (adjointDualCoeff U⁻¹ p.1 φ))).sum + - (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (ν ::ₘ p.2) (A μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (commutator A μ ν + (adjointDualCoeff U⁻¹ p.1 φ))).sum := by + rw [← Multiset.sum_map_sub, ← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [fieldStrength_apply, map_add, map_sub, hDcomp μ p.2, hDcomp ν p.2] + have hcancel₁ : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (A ν (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ μ))))))).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (A ν (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ))))))).sum).sum := + Multiset.sum_antidiagonal_assoc s (fun a b c => + Lorentz.iteratedD D D_comm c (A ν (adjointDualCoeff U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ μ))))))) + have hcancel₂ : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ ν))))))).sum).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν))))))).sum).sum := by + refine (Multiset.sum_antidiagonal_assoc s (fun a b c => + Lorentz.iteratedD D D_comm c (A μ (adjointDualCoeff U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ν)))))))).trans ?_ + exact Multiset.sum_antidiagonal_swap s (fun a b => + (b.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ν))))))).sum) + set Θ : GaugeAlgebra →+ B := ((algebraMap ℂ B).toAddMonoidHom.comp + ((Complex.ofRealHom : ℝ →+* ℂ).toAddMonoidHom.comp φ.toAddMonoidHom)) with hΘdef + have hΘ : ∀ z : GaugeAlgebra, algebraMap ℂ B ((φ z : ℝ) : ℂ) = Θ z := fun z => rfl + have hconst : Θ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (μ ::ₘ s) + (maurerCartanForm U⁻¹ ν))) = + Θ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (ν ::ₘ s) + (maurerCartanForm U⁻¹ μ))) + - (s.antidiagonal.map fun p => + Θ ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ μ)), + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.2 + (maurerCartanForm U⁻¹ ν))⁆).sum := by + rw [eval_iteratedDeriv_maurerCartan_structure U⁻¹ s μ ν, map_sub, map_multiset_sum, + Multiset.map_map] + congr 1 + rw [hL, repGauge_iteratedD_cons_apply hA U μ s ν φ, + repGauge_iteratedD_cons_apply hA U ν s μ φ, + hA.repGauge_iteratedD_commutator hD U s μ ν φ, hR] + simp only [hΘ] + rw [hconst, hcancel₁, hcancel₂] + abel + +/-- **The field strength is an adjoint gauge tensor**: the packaging of + `repGauge_iteratedD_fieldStrength` as `TransformsInAdjoint` — the base case of the + covariant-derivative recursion `TransformsInAdjoint.covDerivAdjoint`. -/ +theorem transformsInAdjoint_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (μ ν : Fin 1 ⊕ Fin 3) : hA.TransformsInAdjoint (fieldStrength A D μ ν) := + fun U φ s => hA.repGauge_iteratedD_fieldStrength hD U s μ ν φ + +end IsGaugeField + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean new file mode 100644 index 000000000..aa178f893 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean @@ -0,0 +1,288 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +/-! + +# Adjoint gauge tensors and the covariant derivative + +A component family is an *adjoint gauge tensor* when all its derivative symbols +transform by the pure Leibniz convolution of the dual adjoint action, with no +inhomogeneous term. The convolution is forced: the gauge group acts on the +derivative symbols by substitution and the chain rule, so `U • [∂_s F^φ]` produces +every splitting `s = x + y` — `x` derivatives hitting the adjoint, `y` remaining on +`F`; the naive law `U • [∂_s F^φ] = F^{(∂_s Ad)^* φ}` holds only at `s = 0`. + +The two theorems of this section: the field strength is an adjoint gauge tensor +(`transformsInAdjoint_fieldStrength`), and adjoint gauge tensors are closed under +the covariant derivative `∇_ρ = D_ρ + ⁅A_ρ, ·⁆` +(`TransformsInAdjoint.covDerivAdjoint`) — so by recursion every iterated covariant +derivative of the field strength is an adjoint gauge tensor. + +-/ + +@[expose] public section + +namespace StandardModel +open Matrix MatrixGroups TensorProduct +variable {B : Type} [Ring B] [Algebra ℂ B] + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} +variable [Lorentz.IsLorentzDeriv repLorentz D] +variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} + +/-- A component family `F` *transforms in the adjoint* (is an adjoint gauge tensor) + for the gauge field `hA` when each derivative symbol `[∂_s F^φ]` transforms by the + Leibniz convolution of the dual adjoint coefficients against lower derivative + symbols — the shape of `gauge_apply_deriv` with no Maurer–Cartan shift. At `s = 0` + this is the homogeneous law `U • F^φ = F^{Ad₀^* φ}`. The `hA` argument pins the + representations and derivative to the gauge-field setting. -/ +def TransformsInAdjoint (_hA : IsGaugeField repLorentz repGauge A D D_comm) + (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : Prop := + ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℝ GaugeAlgebra) (s : Multiset (Fin 1 ⊕ Fin 3)), + repGauge U (Lorentz.iteratedD D D_comm s (F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ p.1 φ))).sum + +/-- The covariant derivative `∇_ρ F = D_ρ F + ⁅A_ρ, F⁆` of an adjoint-valued + component family: the total derivative plus the bracket against the gauge field. + The gauge-algebra bracket carries the physicists' `i`, so in matrix terms this is + `∂_ρ F + i [A_ρ, F]` — the adjoint-representation covariant derivative in the same + `D = ∂ + i A` convention as the field strength. It preserves `TransformsInAdjoint` + (`TransformsInAdjoint.covDerivAdjoint`). -/ +noncomputable def covDerivAdjoint + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + (D ρ).restrictScalars ℝ ∘ₗ F + bracketFam (A ρ) F + +@[simp] +lemma covDerivAdjoint_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + covDerivAdjoint A F D ρ φ = D ρ (F φ) + bracketFam (A ρ) F φ := rfl + +/-! + +## The iterated covariance of the covariant derivative + +-/ + +/-- If `F` transforms in the adjoint, so do its `κ ::ₘ s`-derived symbols with the + extra derivative traced through `adjointDualCoeff_cons`: the Leibniz splittings + where `κ` stays a derivative, minus the convolution where `κ` hits the adjoint — + an `ad` of the derived Maurer–Cartan form. -/ +lemma TransformsInAdjoint.repGauge_iteratedD_cons + {hA : IsGaugeField repLorentz repGauge A D D_comm} + {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) + (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (F (adjointDualCoeff U⁻¹ p.1 φ))).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + rw [hF U φ (κ ::ₘ s)] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 + (F (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = + -(s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + rw [← Multiset.sum_map_neg''] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, + Multiset.map_map, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) + rw [hsec, sub_eq_add_neg] + +set_option maxHeartbeats 2000000 in +/-- The all-orders gauge transformation of the derived bracket `⁅A_ρ, F⁆` against an + adjoint gauge tensor `F`: since `F` transforms homogeneously, only one `ad` + cross-term convolution survives — the analogue of `repGauge_iteratedD_commutator` + with a gauge tensor in the second slot. -/ +lemma TransformsInAdjoint.repGauge_iteratedD_bracket + {hA : IsGaugeField repLorentz repGauge A D D_comm} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (Lorentz.iteratedD D D_comm s (bracketFam (A ρ) F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (bracketFam (A ρ) F + (adjointDualCoeff U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum := by + have hAlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), + repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A ρ) ψ) = + ((u.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ ρ)))) := by + intro u ψ + show repGauge U (Lorentz.iteratedD D D_comm u (A ρ ψ)) = _ + rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), + repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ F) ψ) = + ((u.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + adjointDualCoeff U⁻¹ r.1).sum) ψ + + algebraMap ℂ B (ψ (0 : GaugeAlgebra)) := by + intro u ψ + show repGauge U (Lorentz.iteratedD D D_comm u (F ψ)) = _ + rw [hF U ψ u, Multiset.sum_linearMap_apply, Multiset.map_map] + simp only [map_zero, Complex.ofReal_zero, add_zero] + congr 1 + have hMa : (s.antidiagonal.map fun p => + bracketFam ((p.1.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + adjointDualCoeff U⁻¹ r.1).sum) φ).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [bracketFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [bracketFam_sum_right, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + have hMc : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (bracketFam (A ρ) F + (adjointDualCoeff U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [bracketFam_adjointDualCoeff U⁻¹ p.1 (A ρ) F φ, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [iteratedD_bracketFam hD p.2 (A ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F ∘ₗ adjointDualCoeff U⁻¹ q.2) φ] + have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => + bracketFam ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ a) + ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ F ∘ₗ + adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) + have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + adjointDualCoeff U⁻¹ r.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ))))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] + rw [iteratedD_bracketFam hD s (A ρ) F φ, map_multiset_sum, Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, hA.repGauge_bracketFam U (hAlaw p.1) (hFlaw p.2) φ, + hCg p, map_zero, LinearMap.comp_zero, map_zero, sub_zero, lie_zero, map_zero, + Complex.ofReal_zero, map_zero, add_zero]), + Multiset.sum_map_add, hM] + +set_option maxHeartbeats 2000000 in +/-- **Adjoint gauge tensors are closed under the covariant derivative**: if `F` + transforms in the adjoint, so does `∇_ρ F = D_ρ F + ⁅A_ρ, F⁆`. The single + inhomogeneous convolution of `∂_{ρ ::ₘ s} F` + (`TransformsInAdjoint.repGauge_iteratedD_cons`) cancels the single `ad` cross-term + convolution of `⁅A_ρ, F⁆` (`TransformsInAdjoint.repGauge_iteratedD_bracket`) + through the coassociativity of the antidiagonal; no structural equation is needed. + Together with `transformsInAdjoint_fieldStrength` this makes every iterated + covariant derivative of the field strength an adjoint gauge tensor, by recursion. -/ +theorem TransformsInAdjoint.covDerivAdjoint + {hA : IsGaugeField repLorentz repGauge A D D_comm} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) + (ρ : Fin 1 ⊕ Fin 3) : + hA.TransformsInAdjoint (covDerivAdjoint A F D ρ) := by + intro U φ s + have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), + Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by + intro κ t b + rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by + rw [add_comm, Multiset.singleton_add], + Lorentz.iteratedD_add, LinearMap.comp_apply] + congr 1 + have hL : repGauge U (Lorentz.iteratedD D D_comm s + (IsGaugeField.covDerivAdjoint A F D ρ φ)) = + repGauge U (Lorentz.iteratedD D D_comm (ρ ::ₘ s) (F φ)) + + repGauge U (Lorentz.iteratedD D D_comm s (bracketFam (A ρ) F φ)) := by + rw [covDerivAdjoint_apply, map_add, hDcomp ρ s, map_add] + have hR : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (IsGaugeField.covDerivAdjoint A F D ρ + (adjointDualCoeff U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (ρ ::ₘ p.2) (F (adjointDualCoeff U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (bracketFam (A ρ) F + (adjointDualCoeff U⁻¹ p.1 φ))).sum := by + rw [← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [covDerivAdjoint_apply, map_add, hDcomp ρ p.2] + have hcancel : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum := + Multiset.sum_antidiagonal_assoc s (fun a b c => + Lorentz.iteratedD D D_comm c (F (adjointDualCoeff U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ρ))))))) + rw [hL, hF.repGauge_iteratedD_cons U ρ s φ, hF.repGauge_iteratedD_bracket hD U s ρ φ, + hR, hcancel] + abel + +end IsGaugeField + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 2efab1cd6..0b89d4d6f 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -591,4 +591,66 @@ lemma eval_iteratedDeriv_maurerCartanForm_eq_of_symmetrized_eq (U V : JetGaugeGr exact eval_iteratedDeriv_bracket_congr (s.erase ν) _ _ _ _ (fun p hp => ih p μ (hlt p hp)) (fun p hp => ih p ν (hlt p hp)) +/-! + +## The derivative of the adjoint action + +-/ + +/-- The constant inclusion has vanishing formal derivative: constants have no + spacetime dependence. -/ +@[simp] +lemma JetGaugeAlgebra.deriv_ofConstant (μ : Fin 1 ⊕ Fin 3) (a : GaugeAlgebra) : + deriv μ (ofConstant a) = 0 := by + ext <;> simp [Matrix.map_apply, pderiv_C] + +/-- The formal derivative intertwines the adjoint action through the Maurer–Cartan + form: `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆`. On the matrix factors this + is the Leibniz rule with the derivative of `U†` rewritten through the + differentiated unitarity relation; on the abelian `u(1)` factor the adjoint action + is trivial and the bracket is absent. -/ +lemma deriv_adjointMap (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetGaugeAlgebra) : + deriv μ (adjointMap U x) = + adjointMap U (deriv μ x) - ⁅maurerCartanForm U μ, adjointMap U x⁆ := by + have hleib : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (M N : Matrix κ κ JetRing), + (M * N).map (pderiv ℂ μ) = M.map (pderiv ℂ μ) * N + M * N.map (pderiv ℂ μ) := by + intro κ _ _ M N + ext i j : 1 + simp only [Matrix.map_apply, Matrix.mul_apply, Matrix.add_apply, map_sum, + Derivation.leibniz, smul_eq_mul] + exact (Finset.sum_congr rfl fun k _ => by ring).trans Finset.sum_add_distrib + have key : ∀ (κ : Type) [Fintype κ] [DecidableEq κ] (V X : Matrix κ κ JetRing), + V * star V = 1 → + (V * X * star V).map (pderiv ℂ μ) = + V * X.map (pderiv ℂ μ) * star V - + Complex.I • (Complex.I • (V.map (pderiv ℂ μ) * star V) * (V * X * star V) - + (V * X * star V) * (Complex.I • (V.map (pderiv ℂ μ) * star V))) := by + intro κ _ _ V X hV + have hVV : star V * V = 1 := mul_eq_one_comm.mp hV + have hq : (star V).map (pderiv ℂ μ) = -(star V * V.map (pderiv ℂ μ) * star V) := by + have h1 : V * (star V).map (pderiv ℂ μ) = -(V.map (pderiv ℂ μ) * star V) := + eq_neg_of_add_eq_zero_right (by + rw [← hleib _ V (star V), hV] + exact Matrix.ext fun i j => by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ μ)]) + calc (star V).map (pderiv ℂ μ) + = star V * V * (star V).map (pderiv ℂ μ) := by rw [hVV, one_mul] + _ = -(star V * V.map (pderiv ℂ μ) * star V) := by + rw [mul_assoc, h1, mul_neg, ← mul_assoc] + rw [hleib _ (V * X) (star V), hleib _ V X, hq] + simp only [smul_mul_assoc, mul_smul_comm, ← smul_sub, smul_smul, Complex.I_mul_I, + neg_one_smul, sub_neg_eq_add, add_mul, mul_neg, ← mul_assoc] + rw [mul_assoc (V.map (pderiv ℂ μ)) (star V) V, hVV, mul_one] + abel + refine ext_of_matrix ?_ ?_ ?_ + · simpa only [deriv_toSU3Matrix, adjointMap_toSU3Matrix, sub_toSU3Matrix, + bracket_toSU3Matrix, maurerCartanForm_toSU3Matrix] using + key _ U.1.1 x.toSU3Matrix (Matrix.mem_unitaryGroup_iff.mp + (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1) + · simpa only [deriv_toSU2Matrix, adjointMap_toSU2Matrix, sub_toSU2Matrix, + bracket_toSU2Matrix, maurerCartanForm_toSU2Matrix] using + key _ U.2.1.1 x.toSU2Matrix (Matrix.mem_unitaryGroup_iff.mp + (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1) + · simp + end StandardModel diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 4922bdc39..0bc6adcea 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -47,6 +47,26 @@ def iteratedD {ι : Type*} (D : ι → A →ₗ[ℂ] A) ⟨fun i j L => by rw [← LinearMap.comp_assoc, ← LinearMap.comp_assoc, hD]⟩ s.foldr (fun ν L => (D ν).comp L) LinearMap.id +lemma iteratedD_zero {ι : Type*} (D : ι → A →ₗ[ℂ] A) + (hD : ∀ i j, (D i).comp (D j) = (D j).comp (D i)) : + iteratedD D hD (0 : Multiset ι) = LinearMap.id := by + simp only [iteratedD, Multiset.foldr_zero] + +lemma iteratedD_cons {ι : Type*} (D : ι → A →ₗ[ℂ] A) + (hD : ∀ i j, (D i).comp (D j) = (D j).comp (D i)) (κ : ι) (s : Multiset ι) : + iteratedD D hD (κ ::ₘ s) = (D κ).comp (iteratedD D hD s) := by + simp only [iteratedD, Multiset.foldr_cons] + +/-- The iterated operator is additive in the multiset of directions: applying along + `s + t` is applying along `t` and then along `s`. -/ +lemma iteratedD_add {ι : Type*} (D : ι → A →ₗ[ℂ] A) + (hD : ∀ i j, (D i).comp (D j) = (D j).comp (D i)) (s t : Multiset ι) : + iteratedD D hD (s + t) = (iteratedD D hD s).comp (iteratedD D hD t) := by + induction s using Multiset.induction_on with + | empty => rw [zero_add, iteratedD_zero, LinearMap.id_comp] + | cons κ s ih => + rw [Multiset.cons_add, iteratedD_cons, iteratedD_cons, ih, LinearMap.comp_assoc] + class IsLorentzDeriv (rep : Representation ℂ SL(2,ℂ) A) (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) where rep_deriv {Λ μ x} : rep Λ (D μ x) = ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • D a (rep Λ x) From fabf839c1f03fbbd473a53ba23874d2067ff22c9 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 19 Aug 2026 12:13:41 +0100 Subject: [PATCH 170/254] feat: Add covariant derivative span theorem. --- .../AlgebraValued/CovariantDeriv.lean | 213 ++++++++++++++++++ 1 file changed, 213 insertions(+) diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean index 9b9b64a99..61b89422f 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean @@ -7,6 +7,8 @@ module public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint +public import Mathlib.LinearAlgebra.Basis.Defs +public import Mathlib.LinearAlgebra.Dimension.Free /-! # Gauge tensors in a general representation @@ -639,6 +641,217 @@ lemma covDerivAction_adAction (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (ρ : Fin 1 ⊕ Fin 3) : covDerivAction A adAction F D ρ = covDerivAdjoint A F D ρ := rfl +/-! + +## The span lemma + +Replacing derivatives of a matter family by covariant derivatives does not change +the generated algebra of symbols: the correction terms are products of gauge-field +components with matter components. Note the statement is about generated +*subalgebras*, not linear spans — `∇_ρ F − ∂_ρ F` is a sum of products `A · F`, +which lies in the algebra generated by the symbols but not in their linear span. + +-/ + +/-- Decomposition of an assembled family along a basis of the value space: the + components against the dual basis, tensored with the basis vectors. -/ +lemma dualPairEquivW_symm_eq_sum {ι : Type*} [Fintype ι] (bW : Module.Basis ι ℝ W) + (g : Module.Dual ℝ W →ₗ[ℝ] B) : + dualPairEquivW.symm g = ∑ i, g (bW.coord i) ⊗ₜ[ℝ] bW i := by + apply dualPairEquivW.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + symm + rw [map_sum, LinearMap.sum_apply] + simp only [dualPairEquivW_tmul] + have hdual : (∑ i, φ (bW i) • bW.coord i) = φ := by + refine bW.ext fun j => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, + smul_eq_mul] + rw [Finset.sum_eq_single j + (fun i _ hij => by simp [Ne.symm hij]) + (fun h => absurd (Finset.mem_univ j) h)] + simp + calc ∑ i, φ (bW i) • g (bW.coord i) + = g (∑ i, φ (bW i) • bW.coord i) := by rw [map_sum]; simp + _ = g φ := by rw [hdual] + +/-- The value of an action of families lies in any subalgebra containing the values + of both families: the action is a finite sum of products of components. -/ +lemma actionFam_apply_mem {act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W} {P : Subalgebra ℂ B} + {f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {g : Module.Dual ℝ W →ₗ[ℝ] B} + (hf : ∀ ψ, f ψ ∈ P) (hg : ∀ χ, g χ ∈ P) (φ : Module.Dual ℝ W) : + actionFam act f g φ ∈ P := by + rw [actionFam, + show dualPairEquiv.symm f = ∑ i, + f ((Module.finBasis ℝ GaugeAlgebra).coord i) ⊗ₜ[ℝ] + (Module.finBasis ℝ GaugeAlgebra) i from by + rw [← dualPairEquivW_gaugeAlgebra] + exact dualPairEquivW_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) f, + dualPairEquivW_symm_eq_sum (Module.finBasis ℝ W) g] + simp only [map_sum, LinearMap.sum_apply, tensorAction_tmul, dualPairEquivW_tmul] + refine sum_mem fun i _ => sum_mem fun j _ => ?_ + rw [← algebraMap_smul ℂ] + exact P.smul_mem (mul_mem (hf _) (hg _)) _ + +/-- Iterated covariant derivatives along a list of directions. -/ +noncomputable def covDerivIter (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (l : List (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ W →ₗ[ℝ] B := + l.foldr (fun ρ G => covDerivAction A act G D ρ) F + +@[simp] +lemma covDerivIter_nil (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (F : Module.Dual ℝ W →ₗ[ℝ] B) : covDerivIter A act F D [] = F := rfl + +@[simp] +lemma covDerivIter_cons (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (F : Module.Dual ℝ W →ₗ[ℝ] B) (ρ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) : + covDerivIter A act F D (ρ :: l) = + covDerivAction A act (covDerivIter A act F D l) D ρ := rfl + +/-- With `D` a derivation, `D` kills the scalars. -/ +lemma deriv_algebraMap_eq_zero (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (κ : Fin 1 ⊕ Fin 3) (c : ℂ) : + D κ (algebraMap ℂ B c) = 0 := by + have h1 : D κ (1 : B) = 0 := by + have h := hD κ 1 1 + rw [one_mul, one_mul, mul_one] at h + have h2 : D κ (1 : B) + 0 = D κ (1 : B) + D κ (1 : B) := by rw [add_zero]; exact h + exact (add_left_cancel h2).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, h1, smul_zero] + +/-- A subalgebra generated by a `D`-stable set of generators is `D`-stable. -/ +lemma adjoin_deriv_mem {S : Set B} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (hS : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ S, D κ x ∈ Algebra.adjoin ℂ S) + (κ : Fin 1 ⊕ Fin 3) {x : B} (hx : x ∈ Algebra.adjoin ℂ S) : + D κ x ∈ Algebra.adjoin ℂ S := by + induction hx using Algebra.adjoin_induction with + | mem y hy => exact hS κ y hy + | algebraMap c => + rw [deriv_algebraMap_eq_zero hD κ c] + exact zero_mem _ + | add y z hy hz ihy ihz => + rw [map_add] + exact add_mem ihy ihz + | mul y z hy hz ihy ihz => + rw [hD κ y z] + exact add_mem (mul_mem ihy hz) (mul_mem hy ihz) + +/-- A subalgebra generated by a `D`-stable set of generators is stable under + iterated derivatives. -/ +lemma adjoin_iteratedD_mem {S : Set B} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (hS : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ S, D κ x ∈ Algebra.adjoin ℂ S) + (s : Multiset (Fin 1 ⊕ Fin 3)) {x : B} (hx : x ∈ Algebra.adjoin ℂ S) : + Lorentz.iteratedD D D_comm s x ∈ Algebra.adjoin ℂ S := by + induction s using Multiset.induction_on with + | empty => rw [Lorentz.iteratedD_zero]; exact hx + | cons κ t ih => + rw [Lorentz.iteratedD_cons, LinearMap.comp_apply] + exact adjoin_deriv_mem hD hS κ ih + +set_option maxHeartbeats 1000000 in +/-- **The span lemma**: the algebra of symbols generated by the gauge field with its + derivatives together with a matter family with its *derivatives* equals the one + generated by the gauge field with its derivatives together with the matter family + with its *covariant* derivatives. The correction `∇_ρ − ∂_ρ` is the action of the + gauge field — a sum of products of symbols, absorbed by the algebra structure. -/ +theorem adjoin_iteratedD_eq_adjoin_covDerivIter + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) : + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + b = Lorentz.iteratedD D D_comm s (F φ)}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + b = covDerivIter A act F D l φ}) := by + have hA0 : ∀ (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), + A μ ψ = Lorentz.iteratedD D D_comm 0 (A μ ψ) := fun μ ψ => by + rw [Lorentz.iteratedD_zero]; rfl + have hDA : ∀ (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (y : B), + D κ (Lorentz.iteratedD D D_comm s y) = + Lorentz.iteratedD D D_comm (κ ::ₘ s) y := fun κ s y => by + rw [Lorentz.iteratedD_cons]; rfl + -- `D`-stability of the generators on the covariant side + have hS₂ : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ l φ, b = covDerivIter A act F D l φ}), + D κ x ∈ Algebra.adjoin ℂ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := by + rintro κ x (⟨s, μ, ψ, rfl⟩ | ⟨l, φ, rfl⟩) + · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨κ ::ₘ s, μ, ψ, hDA κ s _⟩) + · have hsplit : D κ (covDerivIter A act F D l φ) = + covDerivIter A act F D (κ :: l) φ + - actionFam act (A κ) (covDerivIter A act F D l) φ := by + rw [covDerivIter_cons, covDerivAction_apply] + abel + rw [hsplit] + have hmem₁ : covDerivIter A act F D (κ :: l) φ ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := + Set.mem_union_right _ ⟨κ :: l, φ, rfl⟩ + have hmemA : ∀ ψ' : Module.Dual ℝ GaugeAlgebra, A κ ψ' ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := + fun ψ' => Set.mem_union_left _ ⟨0, κ, ψ', hA0 κ ψ'⟩ + have hmemC : ∀ χ : Module.Dual ℝ W, covDerivIter A act F D l χ ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := + fun χ => Set.mem_union_right _ ⟨l, χ, rfl⟩ + exact sub_mem (Algebra.subset_adjoin hmem₁) + (actionFam_apply_mem (fun ψ' => Algebra.subset_adjoin (hmemA ψ')) + (fun χ => Algebra.subset_adjoin (hmemC χ)) φ) + -- `D`-stability of the generators on the derivative side + have hS₁ : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}), + D κ x ∈ Algebra.adjoin ℂ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}) := by + rintro κ x (⟨s, μ, ψ, rfl⟩ | ⟨s, φ, rfl⟩) + · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨κ ::ₘ s, μ, ψ, hDA κ s _⟩) + · exact Algebra.subset_adjoin (Set.mem_union_right _ ⟨κ ::ₘ s, φ, hDA κ s _⟩) + refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) + · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨s, φ, rfl⟩) + · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨s, μ, ψ, rfl⟩) + · refine adjoin_iteratedD_mem hD hS₂ s ?_ + have hmem : F φ ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := + Set.mem_union_right _ ⟨[], φ, by rw [covDerivIter_nil]⟩ + exact Algebra.subset_adjoin hmem + · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨l, φ, rfl⟩) + · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨s, μ, ψ, rfl⟩) + · induction l generalizing φ with + | nil => + have hmem : covDerivIter A act F D [] φ ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}) := + Set.mem_union_right _ + ⟨0, φ, by rw [Lorentz.iteratedD_zero, covDerivIter_nil]; rfl⟩ + exact Algebra.subset_adjoin hmem + | cons κ l ih => + rw [covDerivIter_cons, covDerivAction_apply] + have hmemA : ∀ ψ' : Module.Dual ℝ GaugeAlgebra, A κ ψ' ∈ + ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}) := + fun ψ' => Set.mem_union_left _ ⟨0, κ, ψ', hA0 κ ψ'⟩ + exact add_mem (adjoin_deriv_mem hD hS₁ κ (ih φ)) + (actionFam_apply_mem (fun ψ' => Algebra.subset_adjoin (hmemA ψ')) + (fun χ => ih χ) φ) + end Action /-! From 597f06f838d83737d113c3e33e0077546b8bb84d Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 20 Aug 2026 06:47:20 +0100 Subject: [PATCH 171/254] feat: Start on symmeterized derivative argument --- .../GaugeBosons/AlgebraValued/Basic.lean | 117 ++++ .../AlgebraValued/FieldStrength.lean | 9 + .../AlgebraValued/Symmeterized.lean | 585 ++++++++++++++++++ Physlib/Relativity/IsLorentzDeriv.lean | 44 ++ 4 files changed, 755 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index 615c16b58..89a98ed64 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -143,6 +143,28 @@ variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} variable [Lorentz.IsLorentzDeriv repLorentz D] variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} +lemma iteratedD_sub_pair (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (s : Multiset (Fin 1 ⊕ Fin 3)) {ν : Fin 1 ⊕ Fin 3} (hν : ν ∈ s) + (μ : Fin 1 ⊕ Fin 3) + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : + Lorentz.iteratedD D D_comm s (A μ φ) - + Lorentz.iteratedD D D_comm (μ ::ₘ s - {ν}) (A ν φ) = + Lorentz.iteratedD D D_comm (s - {ν}) (D ν (A μ φ) - D μ (A ν φ)) := by + obtain ⟨t, rfl⟩ : ∃ t, s = ν ::ₘ t := ⟨s.erase ν, (Multiset.cons_erase hν).symm⟩ + have h1 : ∀ (κ : Fin 1 ⊕ Fin 3) (x : B), + Lorentz.iteratedD D D_comm (κ ::ₘ t) x = Lorentz.iteratedD D D_comm t (D κ x) := by + intro κ x + rw [show (κ ::ₘ t) = t + {κ} from by rw [← Multiset.singleton_add, add_comm], + Lorentz.iteratedD_add, LinearMap.comp_apply] + congr 1 + rw [show ν ::ₘ t - {ν} = t from by + rw [Multiset.sub_singleton, Multiset.erase_cons_head], + show μ ::ₘ ν ::ₘ t - {ν} = μ ::ₘ t from by + rw [Multiset.cons_swap, Multiset.sub_singleton, Multiset.erase_cons_head], + h1 ν, h1 μ, ← map_sub] + /-- The canonical equivalence, through finite-dimensional duality, between algebra-valued fields `B ⊗ 𝔤` and their component families `φ ↦ A^φ`: the element `b ⊗ a` corresponds to the family `φ ↦ φ(a) b`. -/ @@ -533,6 +555,40 @@ lemma bracketFam_add_right (f g₁ g₂ : Module.Dual ℝ GaugeAlgebra →ₗ[ bracketFam f (g₁ + g₂) = bracketFam f g₁ + bracketFam f g₂ := by simp only [bracketFam, map_add] +/-- The bracket of two component families expanded through a basis of the gauge + algebra: the physicists' `f^a_{bc} f^b g^c`, with `φ⁅e_j, e_k⁆` the structure + constants contracted with the dual vector. -/ +lemma bracketFam_apply_eq_sum (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : + bracketFam f g φ = ∑ j, ∑ k, + φ ⁅Module.Free.chooseBasis ℝ GaugeAlgebra j, + Module.Free.chooseBasis ℝ GaugeAlgebra k⁆ • + (f ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord j) * + g ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord k)) := by + classical + set bv := Module.Free.chooseBasis ℝ GaugeAlgebra with hbv + have hdual : ∀ ψ : Module.Dual ℝ GaugeAlgebra, ∑ j, ψ (bv j) • bv.coord j = ψ := by + intro ψ + refine LinearMap.ext fun x => ?_ + conv_rhs => rw [← bv.sum_repr x, map_sum] + simp only [LinearMap.sum_apply, LinearMap.smul_apply, Module.Basis.coord_apply, + smul_eq_mul, map_smul] + exact Finset.sum_congr rfl fun j _ => mul_comm _ _ + have hbasis : ∀ h : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B, + dualPairEquiv.symm h = ∑ j, h (bv.coord j) ⊗ₜ[ℝ] bv j := by + intro h + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun ψ => ?_ + calc h ψ = h (∑ j, ψ (bv j) • bv.coord j) := by rw [hdual] + _ = ∑ j, ψ (bv j) • h (bv.coord j) := by + rw [map_sum] + exact Finset.sum_congr rfl fun j _ => map_smul h _ _ + _ = dualPairEquiv (∑ j, h (bv.coord j) ⊗ₜ[ℝ] bv j) ψ := by simp + rw [bracketFam, hbasis f, hbasis g] + simp [tensorBracket_tmul, dualPairEquiv_tmul] + rw [Finset.sum_comm] + /-- The bracket of families against a common Lie-algebra morphism on the dual index. -/ lemma bracketFam_comp_dualMap (T : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) (hT : ∀ a b, T ⁅a, b⁆ = ⁅T a, T b⁆) (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : @@ -625,6 +681,67 @@ lemma deriv_commutator (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), rw [← symm_comp_left, ← symm_comp_left] at h exact h +/-- Every derivative of the commutator term is a polynomial in + strictly lower-order derivative symbols, by the Leibniz expansion — each factor of + `d_{s'}(A^b_ν A^c_λ)` has order at most `|s'|`. -/ +lemma iteratedD_commutator_mem (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + Lorentz.iteratedD D D_comm s' (commutator A ν lam φ) ∈ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ s'.card ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + classical + set bv := Module.Free.chooseBasis ℝ GaugeAlgebra with hbv + -- a dual vector is recovered from its values on the basis + have hdual : ∀ ψ : Module.Dual ℝ GaugeAlgebra, ∑ j, ψ (bv j) • bv.coord j = ψ := by + intro ψ + refine LinearMap.ext fun x => ?_ + conv_rhs => rw [← bv.sum_repr x, map_sum] + simp only [LinearMap.sum_apply, LinearMap.smul_apply, Module.Basis.coord_apply, + smul_eq_mul, map_smul] + exact Finset.sum_congr rfl fun j _ => mul_comm _ _ + -- the tensor form of any component family, expanded through the basis + have hbasis : ∀ f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B, + dualPairEquiv.symm f = ∑ j, f (bv.coord j) ⊗ₜ[ℝ] bv j := by + intro f + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun ψ => ?_ + calc f ψ = f (∑ j, ψ (bv j) • bv.coord j) := by rw [hdual] + _ = ∑ j, ψ (bv j) • f (bv.coord j) := by + rw [map_sum] + exact Finset.sum_congr rfl fun j _ => map_smul f _ _ + _ = dualPairEquiv (∑ j, f (bv.coord j) ⊗ₜ[ℝ] bv j) ψ := by simp + -- the commutator as an explicit double sum of products of symbols + have hcomm : commutator A ν lam φ = + ∑ j, ∑ k, φ ⁅bv j, bv k⁆ • (A ν (bv.coord j) * A lam (bv.coord k)) := by + rw [show commutator A ν lam = dualPairEquiv (tensorBracket + (dualPairEquiv.symm (A ν)) (dualPairEquiv.symm (A lam))) from rfl, + hbasis (A ν), hbasis (A lam)] + simp [tensorBracket_tmul, dualPairEquiv_tmul] + rw [Finset.sum_comm] + rw [hcomm, map_sum] + refine Subalgebra.sum_mem _ fun j _ => ?_ + rw [map_sum] + refine Subalgebra.sum_mem _ fun k _ => ?_ + rw [LinearMap.map_smul_of_tower, ← algebraMap_smul ℂ (φ ⁅bv j, bv k⁆)] + refine Subalgebra.smul_mem _ ?_ _ + rw [Lorentz.iteratedD_mul D D_comm D_mul] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle := Multiset.mem_antidiagonal.mp hp + refine mul_mem + (Algebra.subset_adjoin ⟨p.1, ν, bv.coord j, ?_, rfl⟩) + (Algebra.subset_adjoin ⟨p.2, lam, bv.coord k, ?_, rfl⟩) + · exact hle ▸ Multiset.card_le_card (Multiset.le_add_right _ _) + · exact hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) + + set_option maxHeartbeats 1000000 in /-- The gauge transformation of the bracket of two component families with affine transformation laws `f ↦ f' + φ(c_f)·1` and `g ↦ g' + φ(c_g)·1`: the bracket of the diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean index 3f3a6e079..791fbef32 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean @@ -59,6 +59,15 @@ lemma fieldStrength_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebr (φ : Module.Dual ℝ GaugeAlgebra) : fieldStrength A D μ ν φ = D μ (A ν φ) - D ν (A μ φ) + commutator A μ ν φ := rfl +/-- The antisymmetrized pair is the field strength minus its + commutator term. -/ +lemma pair_eq_fieldStrength_sub_commutator + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ν μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + D ν (A μ φ) - D μ (A ν φ) = fieldStrength A D ν μ φ - commutator A ν μ φ := by + rw [fieldStrength_apply, add_sub_cancel_right] + set_option maxHeartbeats 400000 in /-- **The field strength transforms in the adjoint.** Under a gauge jet `U` all diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean new file mode 100644 index 000000000..8eef1d5be --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean @@ -0,0 +1,585 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.FieldStrength +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation +public import Mathlib.LinearAlgebra.Basis.Defs +public import Mathlib.LinearAlgebra.Dimension.Free +/-! + +# The symmetrized field strength tensor + +We define the symmetrized derivatives of the gauge field as +`sym(d_s A^a_μ) := (1/(|s|+1)) ∑_{ν ∈ s+μ} d_{(s+μ)−ν} A^a_ν` +The reason for this is two fold. + +Firstly, the algebra generated by `d_s A^a_μ` is the same as the algebra generated by +`sym(d_s A^a_μ)` and `𝒟_s F^a_{μν}`. + +Secondly, while the `0`th-truncated ker gauge group acts +trivially on `𝒟_s F^a_{μν}` and all other covariant derivatives it acts freely on `sym(d_s A^a_μ)`. +This means that this group can be used to gauge away the `sym(d_s A^a_μ)`. +This free action results from the map `symmetrizedMaurerCartanCoeff` which +is itself a bijection. + +-/ + +@[expose] public section + +namespace StandardModel +namespace IsGaugeField +open Matrix MatrixGroups TensorProduct MvPowerSeries +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} +variable [Lorentz.IsLorentzDeriv repLorentz D] +variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} + +noncomputable def symmetrizedDeriv (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (s : Multiset (Fin 1 ⊕ Fin 3)) + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : B:= + ((1/(s.card : ℝ) : ℝ) • (s.map fun μ => + (Lorentz.iteratedD D D_comm (s - {μ}) (A μ φ))).sum) + +@[simp] +lemma symmetrizedDeriv_singleton (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (μ : Fin 1 ⊕ Fin 3) (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : + symmetrizedDeriv D D_comm ({μ}) A φ = A μ φ := by + simp [symmetrizedDeriv, Lorentz.iteratedD] + +@[simp] +lemma symmetrizedDeriv_empty (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : + symmetrizedDeriv D D_comm 0 A φ = 0 := by + simp [symmetrizedDeriv] + +/-- The recursion for the symmetrized derivative: peeling one direction off the + multiset. The factor `card s / (card s + 1)` on the derivative term comes from the + mismatch of the symmetrization factors `1/(card s + 1)` and `1/card s`. -/ +lemma symmetrizedDeriv_cons (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : + symmetrizedDeriv D D_comm (μ ::ₘ s) A φ = + (1/(s.card + 1 : ℝ) : ℝ) • (Lorentz.iteratedD D D_comm s (A μ φ)) + + ((s.card : ℝ)/(s.card + 1 : ℝ)) • D μ (symmetrizedDeriv D D_comm s A φ) := by + by_cases hs : s = 0 + · subst hs + simp [Lorentz.iteratedD_zero] + · have hn : (s.card : ℝ) ≠ 0 := + Nat.cast_ne_zero.mpr fun h => hs (Multiset.card_eq_zero.mp h) + have herase : ∀ ν ∈ s, (μ ::ₘ s).erase ν = μ ::ₘ s.erase ν := by + intro ν hν + rcases eq_or_ne ν μ with rfl | h + · rw [Multiset.erase_cons_head, Multiset.cons_erase hν] + · rw [Multiset.erase_cons_tail _ h.symm] + rw [symmetrizedDeriv, symmetrizedDeriv, Multiset.map_cons, Multiset.sum_cons, + Multiset.card_cons, Multiset.sub_singleton, Multiset.erase_cons_head, + Multiset.map_congr rfl (fun ν hν => by + rw [Multiset.sub_singleton, herase ν hν, Lorentz.iteratedD_cons, + LinearMap.comp_apply, ← Multiset.sub_singleton]), + show (s.map fun ν => D μ (Lorentz.iteratedD D D_comm (s - {ν}) (A ν φ))) = + (s.map fun ν => Lorentz.iteratedD D D_comm (s - {ν}) (A ν φ)).map (⇑(D μ)) from + (Multiset.map_map _ _ _).symm, + ← map_multiset_sum, smul_add, LinearMap.map_smul_of_tower, smul_smul, + show ((s.card + 1 : ℕ) : ℝ) = (s.card : ℝ) + 1 by push_cast; ring, + show (s.card : ℝ)/((s.card : ℝ) + 1) * (1/(s.card : ℝ)) = 1/((s.card : ℝ) + 1) by + field_simp] + +lemma deriv_sub_symmetrizedDeriv_eq_sum (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (s : Multiset (Fin 1 ⊕ Fin 3)) + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) + (μ : Fin 1 ⊕ Fin 3) : + Lorentz.iteratedD D D_comm s (A μ φ) - symmetrizedDeriv D D_comm (μ ::ₘ s) A φ = + ((1/(s.card + 1 : ℝ)) • ((s.map fun ν => Lorentz.iteratedD D D_comm s (A μ φ) - + Lorentz.iteratedD D D_comm (μ ::ₘ s - {ν}) (A ν φ)).sum)) := by + have hn1 : (s.card : ℝ) + 1 ≠ 0 := by positivity + rw [symmetrizedDeriv, Multiset.map_cons, Multiset.sum_cons, Multiset.card_cons, + Multiset.sub_singleton, Multiset.erase_cons_head, Multiset.sum_map_sub, + Multiset.map_const', Multiset.sum_replicate, + ← Nat.cast_smul_eq_nsmul ℝ s.card, + show ((s.card + 1 : ℕ) : ℝ) = (s.card : ℝ) + 1 by push_cast; ring] + match_scalars <;> (field_simp; try ring) + +/-! + +## The generation theorem: symbols = symmetrized symbols + field strength + +The chain of lemmas below implements the outline in the module docstring, leading to + + `adjoin({ d_p A }) = adjoin({ sym(d_p A) } ∪ { 𝒟_q F })`. + +Throughout, `D_mul` is the Leibniz rule for the total derivative — a property of `D` +on the algebra `B` that `IsGaugeField` does not currently record, taken here as an +explicit hypothesis. + +-/ + +/-- The iterated covariant derivative `𝒟_l F` of an adjoint component family along a + *list* of directions: covariant derivatives do not commute (their commutator is an + `ad F` term), so the iteration is order-dependent and indexed by a list. -/ +noncomputable def iteratedCovDerivAdjoint + (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) : + List (Fin 1 ⊕ Fin 3) → (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B + | [], F => F + | ρ :: l, F => covDerivAdjoint A (iteratedCovDerivAdjoint A D l F) D ρ + + +/-- Symbol subalgebras are monotone in the order bound. -/ +lemma adjoin_symbols_mono {n m : ℕ} (hnm : n ≤ m) : + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} ≤ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + refine Algebra.adjoin_mono fun b => ?_ + rintro ⟨p, μ, φ, h, rfl⟩ + exact ⟨p, μ, φ, h.trans hnm, rfl⟩ + +/-- The total derivative raises the order of a symbol polynomial by at most one: + it maps the subalgebra of order-`n` symbols into the order-`n + 1` one, by the + Leibniz rule. -/ +lemma deriv_mem_adjoin_symbols + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (ρ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : B} + (hx : x ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)}) : + D ρ x ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n + 1 ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + induction hx using Algebra.adjoin_induction with + | mem b hb => + obtain ⟨p, κ, ψ, hpc, rfl⟩ := hb + refine Algebra.subset_adjoin ⟨ρ ::ₘ p, κ, ψ, ?_, ?_⟩ + · simpa using Nat.succ_le_succ hpc + · rw [Lorentz.iteratedD_cons] + rfl + | algebraMap c => + have h1 : D ρ (1 : B) = 0 := by + have h := D_mul ρ 1 1 + simp only [one_mul, mul_one] at h + have h3 : D ρ (1 : B) + 0 = D ρ 1 + D ρ 1 := by rw [add_zero]; exact h + exact (add_left_cancel h3).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, h1, smul_zero] + exact zero_mem _ + | add x y hx hy ihx ihy => + rw [map_add] + exact add_mem ihx ihy + | mul x y hx hy ihx ihy => + rw [D_mul] + exact add_mem (mul_mem ihx (adjoin_symbols_mono (Nat.le_succ n) hy)) + (mul_mem (adjoin_symbols_mono (Nat.le_succ n) hx) ihy) + +/-- The bracket of two component families whose components are order-`n` symbol + polynomials is again an order-`n` symbol polynomial, componentwise. -/ +lemma bracketFam_mem_adjoin_symbols {n : ℕ} + {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hf : ∀ ψ, f ψ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)}) + (hg : ∀ ψ, g ψ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)}) + (φ : Module.Dual ℝ GaugeAlgebra) : + bracketFam f g φ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + rw [bracketFam_apply_eq_sum] + refine Subalgebra.sum_mem _ fun j _ => Subalgebra.sum_mem _ fun k _ => ?_ + rw [← algebraMap_smul ℂ] + exact Subalgebra.smul_mem _ (mul_mem (hf _) (hg _)) _ + +/-- Every iterated derivative of the field strength is a symbol polynomial of order + one higher than the number of derivatives. -/ +lemma iteratedD_fieldStrength_mem + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (q : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + Lorentz.iteratedD D D_comm q (fieldStrength A D ν lam φ) ∈ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ q.card + 1 ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + rw [fieldStrength_apply, map_add, map_sub] + refine add_mem (sub_mem ?_ ?_) ?_ + · rw [show Lorentz.iteratedD D D_comm q (D ν (A lam φ)) = + Lorentz.iteratedD D D_comm (ν ::ₘ q) (A lam φ) from by + rw [Lorentz.iteratedD_cons']; rfl] + exact Algebra.subset_adjoin ⟨ν ::ₘ q, lam, φ, by simp, rfl⟩ + · rw [show Lorentz.iteratedD D D_comm q (D lam (A ν φ)) = + Lorentz.iteratedD D D_comm (lam ::ₘ q) (A ν φ) from by + rw [Lorentz.iteratedD_cons']; rfl] + exact Algebra.subset_adjoin ⟨lam ::ₘ q, ν, φ, by simp, rfl⟩ + · exact adjoin_symbols_mono (Nat.le_succ q.card) + (iteratedD_commutator_mem A D D_comm D_mul q ν lam φ) + +/-- **Outline step 6** (unitriangularity of the covariant tower): the covariant and + plain iterated derivatives of the field strength differ by an element of the + subalgebra generated by lower-order symbols and lower-order plain derivatives of + the field strength; consequently the two towers generate the same subalgebras. + Stated as the membership needed for the induction. -/ +lemma iteratedCovDerivAdjoint_sub_iteratedD_mem + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ - + Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ) ∈ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ l.length ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + induction l generalizing φ with + | nil => + simp only [iteratedCovDerivAdjoint, + show (Multiset.ofList ([] : List (Fin 1 ⊕ Fin 3))) = 0 from rfl, + Lorentz.iteratedD_zero, LinearMap.id_coe, id_eq, sub_self] + exact zero_mem _ + | cons ρ l ih => + have hsplit : iteratedCovDerivAdjoint A D (ρ :: l) (fieldStrength A D ν lam) φ - + Lorentz.iteratedD D D_comm (Multiset.ofList (ρ :: l)) (fieldStrength A D ν lam φ) = + D ρ (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ - + Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ)) + + bracketFam (A ρ) (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) φ := by + rw [show (Multiset.ofList (ρ :: l)) = ρ ::ₘ Multiset.ofList l from rfl, + Lorentz.iteratedD_cons, LinearMap.comp_apply, map_sub, + show iteratedCovDerivAdjoint A D (ρ :: l) (fieldStrength A D ν lam) φ = + D ρ (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ) + + bracketFam (A ρ) (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) φ + from rfl] + abel + rw [hsplit] + refine add_mem (deriv_mem_adjoin_symbols D_mul ρ (ih φ)) ?_ + refine bracketFam_mem_adjoin_symbols (fun ψ => ?_) (fun ψ => ?_) φ + · exact Algebra.subset_adjoin ⟨0, ρ, ψ, by simp, by rw [Lorentz.iteratedD_zero]; rfl⟩ + · have h3 : iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) ψ = + (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) ψ - + Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam ψ)) + + Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam ψ) := by + abel + rw [h3] + refine add_mem (adjoin_symbols_mono (Nat.le_succ l.length) (ih ψ)) ?_ + simpa using iteratedD_fieldStrength_mem (A := A) D_mul (Multiset.ofList l) ν lam ψ + +/-- **Outline step 7** (chaining the memberships): every derivative symbol of order + `n + 1` lies in the subalgebra generated by its symmetrization, the covariant + derivatives of the field strength of order `n`, and the symbols of order at most + `n`. This is the inductive step of the generation theorem. -/ +lemma iteratedD_mem_symFieldAdjoin_sup + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + Lorentz.iteratedD D D_comm s (A μ φ) ∈ + Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ s.card + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), l.length < s.card ∧ + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) ⊔ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ (s.card - 1) ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + rw [sub_eq_iff_eq_add.mp (deriv_sub_symmetrizedDeriv_eq_sum D D_comm s A φ μ)] + refine add_mem ?_ ?_ + · -- the antisymmetric remainder: field strength plus lower-order terms + rw [← algebraMap_smul ℂ ((1 : ℝ)/(s.card + 1 : ℝ))] + refine Subalgebra.smul_mem _ ?_ _ + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨ν, hν, rfl⟩ := Multiset.mem_map.mp hx + have hpos : 0 < s.card := + Multiset.card_pos.mpr fun h => Multiset.notMem_zero ν (h ▸ hν) + have hcard : (s - {ν}).card = s.card - 1 := by + rw [Multiset.sub_singleton, Multiset.card_erase_of_mem hν, Nat.pred_eq_sub_one] + rw [iteratedD_sub_pair D D_comm s hν μ A φ, pair_eq_fieldStrength_sub_commutator, + map_sub] + refine sub_mem ?_ ?_ + · -- the field-strength part, through the covariant tower + set l := (s - {ν}).toList with hl' + have hl : (Multiset.ofList l) = s - {ν} := Multiset.coe_toList _ + have hlen : l.length = s.card - 1 := by rw [← Multiset.coe_card, hl, hcard] + rw [show Lorentz.iteratedD D D_comm (s - {ν}) (fieldStrength A D ν μ φ) = + iteratedCovDerivAdjoint A D l (fieldStrength A D ν μ) φ - + (iteratedCovDerivAdjoint A D l (fieldStrength A D ν μ) φ - + Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν μ φ)) + from by rw [hl]; abel] + refine sub_mem ?_ ?_ + · refine SetLike.le_def.mp le_sup_left + (Algebra.subset_adjoin (Or.inr ⟨l, ν, μ, φ, ?_, rfl⟩)) + omega + · refine SetLike.le_def.mp le_sup_right (adjoin_symbols_mono ?_ + (iteratedCovDerivAdjoint_sub_iteratedD_mem (D_mul := D_mul) l ν μ φ)) + omega + · -- the commutator part is strictly lower order + refine SetLike.le_def.mp le_sup_right (adjoin_symbols_mono ?_ + (iteratedD_commutator_mem A D D_comm D_mul (s - {ν}) ν μ φ)) + omega + · -- the symmetrized symbol is a generator + exact SetLike.le_def.mp le_sup_left + (Algebra.subset_adjoin (Or.inl ⟨μ ::ₘ s, φ, Multiset.cons_ne_zero, by simp, rfl⟩)) + +/-- **The generation theorem** (outline final step, by strong induction on the + order): the derivative symbols of order at most `n` and the symmetrized symbols + together with the covariant field-strength tower generate the same subalgebra, + + `adjoin({ d_p A : |p| ≤ n }) = adjoin({ sym(d_p A) : |p| ≤ n } ∪ { 𝒟_q F : |q| < n })`. -/ +theorem symbolAdjoin_eq_symFieldAdjoin + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (n : ℕ) : + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} = + Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + refine le_antisymm ?_ ?_ + · -- symbols are generated by symmetrized symbols and the covariant tower, + -- by strong induction on the order + have main : ∀ m, ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m → m ≤ n → + Lorentz.iteratedD D D_comm p (A μ φ) ∈ Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + intro m + induction m using Nat.strong_induction_on with + | _ m ih => + intro p μ φ hpm hmn + have hSF : Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ p.card + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), l.length < p.card ∧ + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) ≤ + Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + refine Algebra.adjoin_mono ?_ + rintro b (⟨r, ψ, h0, hc, rfl⟩ | ⟨l, ν, lam, ψ, hl, rfl⟩) + · exact Or.inl ⟨r, ψ, h0, by omega, rfl⟩ + · exact Or.inr ⟨l, ν, lam, ψ, by omega, rfl⟩ + have hAdj : Algebra.adjoin ℂ {b : B | ∃ (q : Multiset (Fin 1 ⊕ Fin 3)) + (κ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), q.card ≤ (p.card - 1) ∧ + b = Lorentz.iteratedD D D_comm q (A κ ψ)} ≤ + Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + refine Algebra.adjoin_le ?_ + rintro b ⟨q, κ, ψ, hqc, rfl⟩ + rcases Nat.eq_zero_or_pos q.card with hq0 | hqpos + · obtain rfl : q = 0 := Multiset.card_eq_zero.mp hq0 + rw [Lorentz.iteratedD_zero] + refine Algebra.subset_adjoin (Or.inl ⟨{κ}, ψ, by simp, by simp, ?_⟩) + rw [symmetrizedDeriv_singleton] + rfl + · exact ih q.card (by omega) q κ ψ (le_refl _) (by omega) + exact sup_le hSF hAdj (iteratedD_mem_symFieldAdjoin_sup D_mul p μ φ) + refine Algebra.adjoin_le ?_ + rintro b ⟨p, μ, φ, hpc, rfl⟩ + exact main n p μ φ hpc (le_refl n) + · -- symmetrized symbols and the covariant tower are symbol polynomials + refine Algebra.adjoin_le ?_ + rintro b (⟨r, φ, hr0, hrc, rfl⟩ | ⟨l, ν, lam, φ, hl, rfl⟩) + · rw [symmetrizedDeriv, ← algebraMap_smul ℂ ((1 : ℝ)/(r.card : ℝ))] + refine Subalgebra.smul_mem _ ?_ _ + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨ν, hν, rfl⟩ := Multiset.mem_map.mp hx + refine Algebra.subset_adjoin ⟨r - {ν}, ν, φ, ?_, rfl⟩ + have : (r - {ν}).card = r.card - 1 := by + rw [Multiset.sub_singleton, Multiset.card_erase_of_mem hν, Nat.pred_eq_sub_one] + omega + · have h6 := iteratedCovDerivAdjoint_sub_iteratedD_mem (A := A) (D_comm := D_comm) + D_mul l ν lam φ + have hF := iteratedD_fieldStrength_mem (A := A) (D_comm := D_comm) D_mul + (Multiset.ofList l) ν lam φ + rw [show iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ = + (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ - + Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ)) + + Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ) + from by abel] + refine add_mem (adjoin_symbols_mono (by omega) h6) + (adjoin_symbols_mono ?_ hF) + simp only [Multiset.coe_card] + omega + +/-- **The generation theorem, unbounded version**: the derivative symbols of the gauge + field of all orders, and the symmetrized symbols together with the full covariant + field-strength tower, generate the same subalgebra of local expressions, + + `adjoin({ d_p A }) = adjoin({ sym(d_p A) } ∪ { 𝒟_q F })`. + + It follows from the graded version `symbolAdjoin_eq_symFieldAdjoin` since every + generator on either side appears at some finite order. -/ +theorem symbolAdjoin_eq_symFieldAdjoin_top + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) : + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm p (A μ φ)} = + Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) + · rintro b ⟨p, μ, φ, rfl⟩ + have h := (symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul p.card).le + (Algebra.subset_adjoin ⟨p, μ, φ, le_refl _, rfl⟩) + refine Algebra.adjoin_mono ?_ h + rintro b (⟨r, ψ, h0, _, rfl⟩ | ⟨l, ν, lam, ψ, _, rfl⟩) + · exact Or.inl ⟨r, ψ, h0, rfl⟩ + · exact Or.inr ⟨l, ν, lam, ψ, rfl⟩ + · have hmono : ∀ n : ℕ, Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} ≤ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + intro n + refine Algebra.adjoin_mono ?_ + rintro b ⟨p, μ, ψ, _, rfl⟩ + exact ⟨p, μ, ψ, rfl⟩ + rintro b (⟨r, φ, hr0, rfl⟩ | ⟨l, ν, lam, φ, rfl⟩) + · have hcard : 1 ≤ r.card := + Nat.one_le_iff_ne_zero.mpr fun h => hr0 (Multiset.card_eq_zero.mp h) + exact hmono (r.card - 1) + ((symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul (r.card - 1)).ge + (Algebra.subset_adjoin (Or.inl ⟨r, φ, hr0, by omega, rfl⟩))) + · exact hmono (l.length + 1) + ((symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul (l.length + 1)).ge + (Algebra.subset_adjoin (Or.inr ⟨l, ν, lam, φ, by omega, rfl⟩))) + +/-! + +## The group action on the symmetrized derivatives + +-/ + + +/-! + +## The gauge action on the symmetrized derivatives + +-/ + +/-- **The gauge transformation of the symmetrized derivatives**: averaging the + transformation law `gauge_apply_deriv` of the individual derivative symbols over + the multiset `s`, the homogeneous part is the symmetrized adjoint convolution and + the inhomogeneous Maurer–Cartan shifts average to exactly the base-point value of + the *symmetrized Maurer–Cartan form* of `U⁻¹`: + + `U • sym(d_s A)^φ = (1/|s|) ∑_{μ ∈ s} ∑_{x+y=s−μ} d_y A_μ^{∂_x Ad*(U⁻¹) φ}` + ` + φ( sym(mc(U⁻¹))_s |₀ )`. + + This is the symbol-level counterpart of `symmetrizedMaurerCartanForm`: the gauge + group acts on the symmetrized derivative coordinates through the symmetrized + Maurer–Cartan data. -/ +lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (symmetrizedDeriv D D_comm s A φ) = + (1/(s.card : ℝ)) • (s.map fun μ => + ((s - {μ}).antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff U⁻¹ p.1 φ))).sum).sum + + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (symmetrizedMaurerCartanForm U⁻¹ s))) := by + set L : JetGaugeAlgebra →ₗ[ℝ] B := + (Algebra.linearMap ℂ B).restrictScalars ℝ ∘ₗ Algebra.linearMap ℝ ℂ ∘ₗ + φ ∘ₗ JetGaugeAlgebra.eval.toLinearMap with hL + rw [symmetrizedDeriv, LinearMap.map_smul_of_tower, map_multiset_sum, Multiset.map_map] + simp only [Function.comp_def] + rw [Multiset.map_congr rfl (fun μ _ => hA.gauge_apply_deriv U (s - {μ}) μ φ), + Multiset.sum_map_add, smul_add] + congr 1 + calc (1/(s.card : ℝ)) • (s.map fun μ => algebraMap ℂ B (φ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv (s - {μ}) (maurerCartanForm U⁻¹ μ))))).sum + = (1/(s.card : ℝ)) • (s.map fun μ => + L (JetGaugeAlgebra.iteratedDeriv (s - {μ}) (maurerCartanForm U⁻¹ μ))).sum := rfl + _ = L ((1/(s.card : ℝ)) • (s.map fun μ => + JetGaugeAlgebra.iteratedDeriv (s - {μ}) (maurerCartanForm U⁻¹ μ)).sum) := by + rw [map_smul, map_multiset_sum, Multiset.map_map] + simp only [Function.comp_def] + _ = algebraMap ℂ B (φ (JetGaugeAlgebra.eval (symmetrizedMaurerCartanForm U⁻¹ s))) := by + rw [symmetrizedMaurerCartanForm] + rfl + +/-- **The action of the truncation kernel on the symmetrized derivatives is through + the symmetrized Maurer–Cartan coefficients**: for a gauge jet `U` whose value at + the base point is the identity, the inhomogeneous shift of `sym(d_s A)^φ` is the + pairing of `φ` with the symmetrized Maurer–Cartan coefficient of `U⁻¹` at `s` — + the very data that classifies pure jets (`symmetrizedMaurerCartanCoeff_injective`). + This is the mechanism by which the truncation kernel can be used to gauge away the + symmetrized derivative coordinates. -/ +lemma repGauge_symmetrizedDeriv_truncationKer + (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U.1 (symmetrizedDeriv D D_comm s A φ) = + (1/(s.card : ℝ)) • (s.map fun μ => + ((s - {μ}).antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff (U.1)⁻¹ p.1 φ))).sum).sum + + algebraMap ℂ B (φ (symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by + rw [repGauge_symmetrizedDeriv hA U.1 s φ] + rfl + +/-- **The truncation kernel realizes arbitrary translations of the symmetrized + derivative coordinates**: for any prescribed family `c` of gauge-algebra values, + there is a gauge jet `U` in the kernel of the zeroth truncation whose action shifts + every symmetrized derivative symbol by exactly `φ (c s)` — by the surjectivity of + the symmetrized Maurer–Cartan coefficients. + + This is the freeness/transitivity statement behind "gauging away" the symmetrized + coordinates: since the action of `U` is invertible on `B`, no symbol is literally + sent to zero, but on any fixed field configuration (a point of `Spec B`) the shift + `c` can be chosen to cancel the configuration's symmetrized derivative values. -/ +lemma exists_repGauge_symmetrizedDeriv_shift + (hA : IsGaugeField repLorentz repGauge A D D_comm) + (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → GaugeAlgebra) : + ∃ U : JetGaugeGroupI.truncationKer 0, + ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (φ : Module.Dual ℝ GaugeAlgebra), + repGauge U.1 (symmetrizedDeriv D D_comm s A φ) = + (1/(s.card : ℝ)) • (s.map fun μ => + ((s - {μ}).antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff (U.1)⁻¹ p.1 φ))).sum).sum + + algebraMap ℂ B (φ (c ⟨s, hs⟩)) := by + obtain ⟨V, hV⟩ := symmetrizedMaurerCartanCoeff_surjective c + refine ⟨V⁻¹, fun s hs φ => ?_⟩ + rw [repGauge_symmetrizedDeriv_truncationKer hA V⁻¹ s hs φ, inv_inv, hV] + +end IsGaugeField + +end StandardModel diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 0bc6adcea..e34aabf88 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -57,6 +57,13 @@ lemma iteratedD_cons {ι : Type*} (D : ι → A →ₗ[ℂ] A) iteratedD D hD (κ ::ₘ s) = (D κ).comp (iteratedD D hD s) := by simp only [iteratedD, Multiset.foldr_cons] +/-- The iterated operator of a singleton is the operator itself. -/ +lemma iteratedD_singleton {ι : Type*} (D : ι → A →ₗ[ℂ] A) + (hD : ∀ i j, (D i).comp (D j) = (D j).comp (D i)) (κ : ι) : + iteratedD D hD {κ} = D κ := by + rw [show ({κ} : Multiset ι) = κ ::ₘ 0 from rfl, iteratedD_cons, iteratedD_zero, + LinearMap.comp_id] + /-- The iterated operator is additive in the multiset of directions: applying along `s + t` is applying along `t` and then along `s`. -/ lemma iteratedD_add {ι : Type*} (D : ι → A →ₗ[ℂ] A) @@ -67,6 +74,43 @@ lemma iteratedD_add {ι : Type*} (D : ι → A →ₗ[ℂ] A) | cons κ s ih => rw [Multiset.cons_add, iteratedD_cons, iteratedD_cons, ih, LinearMap.comp_assoc] +/-- The companion of `iteratedD_cons`, peeling the new operator on the inside: for a + commuting family the extra operator may equally be applied first. -/ +lemma iteratedD_cons' {ι : Type*} (D : ι → A →ₗ[ℂ] A) + (hD : ∀ i j, (D i).comp (D j) = (D j).comp (D i)) (κ : ι) (s : Multiset ι) : + iteratedD D hD (κ ::ₘ s) = (iteratedD D hD s).comp (D κ) := by + rw [show (κ ::ₘ s) = s + {κ} from by rw [← Multiset.singleton_add, add_comm], + iteratedD_add, iteratedD_singleton] + +lemma iteratedD_mul (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : A), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (s : Multiset (Fin 1 ⊕ Fin 3)) (b₁ b₂ : A) : + Lorentz.iteratedD D D_comm s (b₁ * b₂) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.1 b₁ * Lorentz.iteratedD D D_comm p.2 b₂).sum := by + induction s using Multiset.induction_on with + | empty => simp [Lorentz.iteratedD_zero] + | cons κ s ih => + have hterm : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + D κ (Lorentz.iteratedD D D_comm p.1 b₁ * Lorentz.iteratedD D D_comm p.2 b₂) = + Lorentz.iteratedD D D_comm (κ ::ₘ p.1) b₁ * Lorentz.iteratedD D D_comm p.2 b₂ + + Lorentz.iteratedD D D_comm p.1 b₁ * + Lorentz.iteratedD D D_comm (κ ::ₘ p.2) b₂ := by + intro p + rw [D_mul, Lorentz.iteratedD_cons, Lorentz.iteratedD_cons, + LinearMap.comp_apply, LinearMap.comp_apply] + rw [Lorentz.iteratedD_cons, LinearMap.comp_apply, ih, map_multiset_sum, + Multiset.map_map] + simp only [Function.comp_def] + rw [Multiset.map_congr rfl fun p _ => hterm p, Multiset.sum_map_add, + Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, Multiset.map_map, + Multiset.map_map] + simp only [Function.comp_def, Prod.map, id_eq] + abel + + class IsLorentzDeriv (rep : Representation ℂ SL(2,ℂ) A) (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) where rep_deriv {Λ μ x} : rep Λ (D μ x) = ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • D a (rep Λ x) From 2ae6b727239be90a8bfd44b212cd824a8c12c101 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 20 Aug 2026 08:04:46 +0100 Subject: [PATCH 172/254] update: Symmeterized --- .../GaugeBosons/AlgebraValued/Basic.lean | 43 ++- .../AlgebraValued/Symmeterized.lean | 268 ++++++++++++++++++ 2 files changed, 310 insertions(+), 1 deletion(-) diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index 89a98ed64..50eaf799a 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -61,7 +61,7 @@ of `JetGaugeGroupI` and not merely of `GaugeGroupI`. @[expose] public section namespace StandardModel -open Matrix MatrixGroups TensorProduct +open Matrix MatrixGroups TensorProduct MvPowerSeries variable {B : Type} [Ring B] [Algebra ℂ B] @@ -75,6 +75,47 @@ noncomputable def adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ (JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv x ∘ₗ JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant).dualMap +/-- For a gauge jet whose value at the base point is the identity, the zeroth dual + adjoint coefficient is trivial: the base-point adjoint action `Ad_{U₀}` is the + identity. -/ +lemma adjointDualCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : + adjointDualCoeff U 0 = LinearMap.id := by + have h3 : (constantCoeff : JetRing →+* ℂ).mapMatrix U.1.1 = 1 := + congrArg (fun g : GaugeGroupI => (g.1.1 : Matrix (Fin 3) (Fin 3) ℂ)) hU + have h2 : (constantCoeff : JetRing →+* ℂ).mapMatrix U.2.1.1 = 1 := + congrArg (fun g : GaugeGroupI => (g.2.1.1 : Matrix (Fin 2) (Fin 2) ℂ)) hU + have hmap : ∀ {n : Type} [Fintype n] [DecidableEq n] (M : Matrix n n JetRing), + M.map (coeff (Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)))) = + (constantCoeff : JetRing →+* ℂ).mapMatrix M := by + intro n _ _ M + ext i j + simp [Matrix.map_apply, RingHom.mapMatrix_apply, coeff_zero_eq_constantCoeff] + have key : ∀ a : GaugeAlgebra, + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv 0 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a))) = a := by + intro a + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · simp only [JetGaugeAlgebra.iteratedDeriv_zero, LinearMap.id_coe, id_eq, + JetGaugeAlgebra.eval_apply, JetGaugeAlgebra.taylorCoeff_toSU3Matrix, + JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.ofConstant_toSU3Matrix] + rw [hmap, map_mul, map_mul, h3, one_mul, JetRing.mapMatrix_constantCoeff_star, h3, + star_one, mul_one] + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] + · simp only [JetGaugeAlgebra.iteratedDeriv_zero, LinearMap.id_coe, id_eq, + JetGaugeAlgebra.eval_apply, JetGaugeAlgebra.taylorCoeff_toSU2Matrix, + JetGaugeAlgebra.adjointMap_toSU2Matrix, JetGaugeAlgebra.ofConstant_toSU2Matrix] + rw [hmap, map_mul, map_mul, h2, one_mul, JetRing.mapMatrix_constantCoeff_star, h2, + star_one, mul_one] + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] + · simp [JetGaugeAlgebra.iteratedDeriv_zero, JetGaugeAlgebra.eval_apply, + coeff_zero_eq_constantCoeff, constantCoeff_C] + refine LinearMap.ext fun φ => LinearMap.ext fun a => ?_ + show φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv 0 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)))) = φ a + rw [key a] + /-- The dual adjoint coefficient at a single derivative: since `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆` (`deriv_adjointMap`) and constants have vanishing derivative, the once-derived coefficient is minus the underived diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean index 8eef1d5be..a8d355f21 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean @@ -580,6 +580,274 @@ lemma exists_repGauge_symmetrizedDeriv_shift refine ⟨V⁻¹, fun s hs φ => ?_⟩ rw [repGauge_symmetrizedDeriv_truncationKer hA V⁻¹ s hs φ, inv_inv, hV] +/-! + +## Centrality of the gauge-field symbols, and invariants of the truncation kernel + +Throughout, `hc` is the hypothesis that all derivative symbols of the gauge field are +central in `B` — the statement that the gauge field is bosonic. Everything built from +the symbols by the total derivative and the bracket is then central as well. + +-/ + +/-- Scalars are central. -/ +lemma algebraMap_mem_center (c : ℂ) : algebraMap ℂ B c ∈ Subring.center B := + Subring.mem_center_iff.mpr fun b => (Algebra.commutes c b).symm + +/-- Real multiples of central elements are central. -/ +lemma smul_mem_center (r : ℝ) {x : B} (hx : x ∈ Subring.center B) : + r • x ∈ Subring.center B := by + rw [← algebraMap_smul ℂ r x, Algebra.smul_def] + exact Subring.mul_mem _ (algebraMap_mem_center _) hx + +/-- The total derivative of a central element is central, by the Leibniz rule. -/ +lemma deriv_mem_center + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + {x : B} (hx : x ∈ Subring.center B) (ρ : Fin 1 ⊕ Fin 3) : + D ρ x ∈ Subring.center B := by + rw [Subring.mem_center_iff] at hx ⊢ + intro b + have h := congrArg (D ρ) (hx b) + rw [D_mul, D_mul, hx (D ρ b), add_comm (D ρ x * b)] at h + exact add_left_cancel h + +/-- The bracket of component families with central components is central. -/ +lemma bracketFam_mem_center {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hf : ∀ ψ, f ψ ∈ Subring.center B) (hg : ∀ ψ, g ψ ∈ Subring.center B) + (φ : Module.Dual ℝ GaugeAlgebra) : + bracketFam f g φ ∈ Subring.center B := by + rw [bracketFam_apply_eq_sum] + refine Subring.sum_mem _ fun j _ => Subring.sum_mem _ fun k _ => ?_ + exact smul_mem_center _ (Subring.mul_mem _ (hf _) (hg _)) + +/-- **1.** If the derivative symbols of the gauge field are central, so are the + covariant derivatives of the field strength. -/ +lemma iteratedCovDerivAdjoint_fieldStrength_mem_center + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + Lorentz.iteratedD D D_comm p (A μ φ) ∈ Subring.center B) + (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ ∈ Subring.center B := by + have hc0 : ∀ (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), + A μ ψ ∈ Subring.center B := by + intro μ ψ + have := hc 0 μ ψ + rwa [Lorentz.iteratedD_zero] at this + induction l generalizing φ with + | nil => + show fieldStrength A D ν lam φ ∈ Subring.center B + rw [fieldStrength_apply, commutator_eq_bracketFam] + exact Subring.add_mem _ + (Subring.sub_mem _ (deriv_mem_center D_mul (hc0 lam φ) ν) + (deriv_mem_center D_mul (hc0 ν φ) lam)) + (bracketFam_mem_center (hc0 ν) (hc0 lam) φ) + | cons ρ l ih => + rw [show iteratedCovDerivAdjoint A D (ρ :: l) (fieldStrength A D ν lam) φ = + D ρ (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ) + + bracketFam (A ρ) (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) φ + from rfl] + exact Subring.add_mem _ (deriv_mem_center D_mul (ih φ) ρ) + (bracketFam_mem_center (hc0 ρ) (fun ψ => ih ψ) φ) + +/-- **2.** If the derivative symbols of the gauge field are central, so are the + symmetrized derivative symbols. -/ +lemma symmetrizedDeriv_mem_center + (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + Lorentz.iteratedD D D_comm p (A μ φ) ∈ Subring.center B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + symmetrizedDeriv D D_comm s A φ ∈ Subring.center B := by + rw [symmetrizedDeriv] + refine smul_mem_center _ (multiset_sum_mem _ fun x hx => ?_) + obtain ⟨μ, hμ, rfl⟩ := Multiset.mem_map.mp hx + exact hc _ _ _ + +/-- **3.** Anything that transforms in the adjoint is invariant under the kernel of + the zeroth truncation: at `s = 0` the transformation law is the dual adjoint action + of the base-point value `U₀⁻¹ = 1`, which is trivial. -/ +lemma TransformsInAdjoint.repGauge_eq_of_mem_truncationKer_zero + {hA : IsGaugeField repLorentz repGauge A D D_comm} + {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) + (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U.1 (F φ) = F φ := by + have hinv : ((U.1)⁻¹).eval = 1 := by + rw [map_inv, JetGaugeGroupI.mem_truncationKer_zero_iff.mp U.2, inv_one] + simpa [Lorentz.iteratedD_zero, adjointDualCoeff_zero_of_eval_eq_one hinv] using + hF U.1 φ 0 + +/-- **4.** The covariant derivatives of the field strength are invariant under the + kernel of the zeroth truncation: they transform in the adjoint, and the truncation + kernel acts through the trivial base-point adjoint. -/ +lemma repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero + (hA : IsGaugeField repLorentz repGauge A D D_comm) + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (U : JetGaugeGroupI.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) + (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U.1 (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ) = + iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ := by + have hadj : hA.TransformsInAdjoint + (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) := by + induction l with + | nil => exact transformsInAdjoint_fieldStrength hA D_mul ν lam + | cons ρ l ih => exact TransformsInAdjoint.covDerivAdjoint D_mul ih ρ + exact hadj.repGauge_eq_of_mem_truncationKer_zero U φ + +/-! + +## The classification of invariants + +The goal of this section is the classification theorem: a gauge-invariant element of +the subalgebra generated by the gauge-field symbols together with a set `S` of +`truncationKer 0`-fixed elements lies in the subalgebra generated by the covariant +field-strength tower together with `S` — assuming only that the gauge-field symbols +are central (bosonic), with **no algebraic-independence hypothesis**. + +The strategy, by downward induction on the top symbol order `N` present in `x`: + +* By the generation theorem (relativized to `S`), `x` is a polynomial expression in + the symmetrized symbols of order `≤ N`, the covariant field-strength tower, and `S`. +* Using the surjectivity of the symmetrized Maurer–Cartan coefficients, choose gauge + jets whose coefficients are supported at exactly order `N`. The Maurer–Cartan + triangularity places such jets in the deep truncation kernel `truncationKer (N-1)`, + which kills all dual adjoint coefficients of positive order `< N`. Consequently + such a jet fixes every generator of order `< N`, fixes the covariant tower and `S`, + and acts on the order-`N` symmetrized symbols by a *pure translation* with an + arbitrary prescribable scalar family. +* The extraction step needs no independence: pick *any* representation of `x` as a + polynomial in the top symbols over the fixed subalgebra. Invariance under all + translations gives, for every shift vector, a polynomial identity; evaluating at + sufficiently many shifts (a Vandermonde argument — pure linear algebra in `B`, no + freeness) forces the top coefficient of *the chosen representation* to vanish, and + downward induction kills every nonconstant coefficient. Hence `x` lies in the fixed + subalgebra, completing the induction step. + +-/ + +/-- The generation theorem relativized to an arbitrary set `S` of extra generators: + a corollary of `symbolAdjoin_eq_symFieldAdjoin` since `adjoin (X ∪ S)` is + determined by `adjoin X` and `S`. -/ +theorem symbolAdjoin_union_eq_symFieldAdjoin_union + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (n : ℕ) (S : Set B) : + Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) = + Algebra.adjoin ℂ + (({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) ∪ S) := by + sorry + +/-- Finite order bound: membership in the subalgebra generated by all symbols and `S` + uses only finitely many generators, hence symbols of some bounded order. -/ +lemma exists_le_of_mem_adjoin_symbols_union (S : Set B) {x : B} + (hx : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S)) : + ∃ n : ℕ, x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) := by + sorry + +/-- **Maurer–Cartan triangularity** (suggested home: + `GaugeGroup.MaurerCartan.Truncation`): a pure jet whose symmetrized Maurer–Cartan + coefficients vanish up to order `n` lies in the `n`-th truncation kernel. -/ +theorem mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero + (U : JetGaugeGroupI.truncationKer 0) (n : ℕ) + (h : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0), r.card ≤ n → + symmetrizedMaurerCartanCoeff U ⟨r, hr⟩ = 0) : + U.1 ∈ JetGaugeGroupI.truncationKer n := by + sorry + +/-- **Deep kernels kill the positive dual adjoint coefficients** (suggested home: + `AlgebraValued.Basic`): for a jet trivial to order `n`, all derivatives of the + adjoint action up to order `n` vanish. -/ +theorem adjointDualCoeff_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} {n : ℕ} + (hU : U ∈ JetGaugeGroupI.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} + (hx : x ≠ 0) (hxn : x.card ≤ n) : + adjointDualCoeff U x = 0 := by + sorry + +/-- **Pure translation**: when all positive dual adjoint coefficients of `U⁻¹` below + the order of `s` vanish, the adjoint convolution in the transformation of the + symmetrized symbol collapses to the symbol itself, and the action is an honest + translation by the symmetrized Maurer–Cartan coefficient. -/ +theorem repGauge_symmetrizedDeriv_translation + (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) + (hU : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < s.card → + adjointDualCoeff (U.1)⁻¹ x = 0) + (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U.1 (symmetrizedDeriv D D_comm s A φ) = + symmetrizedDeriv D D_comm s A φ + + algebraMap ℂ B (φ (symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by + sorry + +/-- **Realization of top-order translations**: any coefficient family supported at + exactly order `N` is realized by a jet in the deep truncation kernel — surjectivity + of the symmetrized Maurer–Cartan coefficients together with the triangularity and + vanishing theorems above. -/ +theorem exists_translation_of_support + (N : ℕ) (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → GaugeAlgebra) + (hcN : ∀ r, r.1.card ≠ N → c r = 0) : + ∃ U : JetGaugeGroupI.truncationKer 0, + symmetrizedMaurerCartanCoeff U⁻¹ = c ∧ + ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < N → + adjointDualCoeff (U.1)⁻¹ x = 0 := by + sorry + +/-- **The abstract extraction theorem** — pure ring theory, no gauge input and no + independence hypothesis: if a family of unital ring endomorphisms fixes a + subalgebra `R` pointwise and translates finitely many central elements `y i` by + arbitrary prescribable scalars, then any element of the subalgebra generated by + `R` and the `y i` that is invariant under the whole family lies in `R`. + + Proof idea: choose any representation of `x` as a polynomial in the `y i` over `R`; + invariance at sufficiently many shift vectors and a Vandermonde argument force the + nonconstant coefficients of the chosen representation to vanish, top degree first. -/ +theorem mem_of_translationInvariant {ι : Type} [Fintype ι] + (R : Subalgebra ℂ B) (y : ι → B) + (hy : ∀ i, y i ∈ Subring.center B) + (Φ : (ι → ℝ) → (B →+* B)) + (hΦR : ∀ t, ∀ z ∈ R, Φ t z = z) + (hΦy : ∀ t i, Φ t (y i) = y i + algebraMap ℂ B (t i)) + {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ (Set.range y)) + (hinv : ∀ t, Φ t x = x) : + x ∈ R := by + sorry + +/-- **The classification of invariants**: a gauge-invariant element of the subalgebra + generated by the gauge-field symbols and a set `S` of `truncationKer 0`-fixed + elements is a polynomial in the covariant derivatives of the field strength and the + elements of `S`. Requires only centrality of the symbols (the gauge field is + bosonic); no independence hypothesis. -/ +theorem invariant_mem_adjoin_fieldStrength + (hA : IsGaugeField repLorentz repGauge A D D_comm) + (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), + D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + Lorentz.iteratedD D D_comm p (A μ φ) ∈ Subring.center B) + (S : Set B) + (hS : ∀ y ∈ S, ∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 y = y) + {x : B} + (hx : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S)) + (hinv : ∀ U : JetGaugeGroupI, repGauge U x = x) : + x ∈ Algebra.adjoin ℂ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S) := by + sorry + end IsGaugeField end StandardModel From 042e29eb751ed30f7f86c95894e3d2c58f3e4e04 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 20 Aug 2026 09:09:26 +0100 Subject: [PATCH 173/254] fefat: Add finial step of convariantization --- Outline.md | 83 ++- .../GaugeBosons/AlgebraValued/Basic.lean | 77 ++- .../AlgebraValued/Symmeterized.lean | 606 +++++++++++++++++- .../GaugeGroup/MaurerCartan/Truncation.lean | 221 +++++++ 4 files changed, 960 insertions(+), 27 deletions(-) diff --git a/Outline.md b/Outline.md index 2f492edd4..9e20b7e60 100644 --- a/Outline.md +++ b/Outline.md @@ -39,6 +39,7 @@ Basic rules of this outline: ## Jet component spaces - For a vector space `V`, the space `JetRing ⊗[ℂ] V` describes the jets of all functions `f : SpaceTime → V`. + - As an example, consider a theory for a field valued in `V`. - A physicist writes the lagrangian as a polynomial in symbols such as `ψ_α`, `d_μ ψ_α`, `d_μ d_ν ψ_α`. @@ -270,6 +271,22 @@ Basic rules of this outline: # B. The covariance reduction +- In practice we never want to use the full gauge group, instead just the global gauge + group. +- To do this we do what we call the `covariance reduction`. This corresponds + to replacing gauge bosons with field strengths and derivatives with + covariant derivatives. +- This covariant reduction turns into three disinct theorems: + 1. `Span(d_s ψ_i, d_s A^μ) = Span(∇_l ψ_i, d_s A^μ )` + This replaces derivatives of fermions or complex scalars with covariant + derivatives. + 2. `Adjoin(d_s A^μ) = Adjoin(symm_s A, ∇_l F^μν)` + This replaces derivatives of gauge bosons with field strengths, their + covariant derivatives and symmetrized derivatives of gauge bosons. + 3. `Invariants(Adjoin(d_s A^μ, S)) = Invariants(Adjoin(∇_l F^μν, S))` + if `S` only transform through the base value of the gauge group. + + ## B.1. The covariant derivative - For a representation `jρ` based on the indexing set `ι` we define the covariant @@ -400,4 +417,68 @@ Basic rules of this outline: ## C.3 IsLorentzLeftFermion -## D. The global gauge group invariants +## D. The Standard Model +Once covariance has been taken care of, the algebra +generated by the following: +- Fermions: `u`, `d`, `L`, `Q`, `e`, their conjugates and their covariant deriatives +- Bosons: `H` (the higgs), its conjugate, and its covariant derivatives +- Gauge bosons: the field strenghts of `G`, `B` and `W`, and their covariant derivatives. + +Every term with half-integer mass-dimension is zero. + +Up to dimension 4, and taking no symmetry into consideration we have the following +collection of terms: + +- Mass dimensions of the letters: `[H] = 1`, `[ψ] = 3/2` (for `ψ ∈ {u, d, L, Q, e}` + or a conjugate), `[F] = 2` (for `F ∈ {G, B, W}`), and each `d_μ` adds `1`. +- A "term" is a multiset of letters `d_s H`, `d_s ψ`, `d_s F` (any `s`) whose + dimensions sum to at most `4`; enumerating by letter-count gives a finite list. + +### One `H` + +- `H`, `d_μ H`, `d_{μν} H`, `d_{μνλ} H` — dimensions `1, 2, 3, 4`. + +### Two `H`'s + +- `H H` — dimension `2`. +- `H (d_μ H)` — dimension `3`. +- `(d_μ H)(d_ν H)` and `H (d_{μν} H)` — dimension `4`. + +### Three `H`'s + +- `H H H` — dimension `3`. +- `H H (d_μ H)` — dimension `4`. + +### Four `H`'s + +- `H H H H` — dimension `4`. + +### One `F` + +- `F_{μν}`, `d_λ F_{μν}`, `d_{λρ} F_{μν}` — dimensions `2, 3, 4`. + +### `H` together with `F` + +- `H F_{μν}` — dimension `3`. +- `(d_μ H) F_{νλ}` and `H (d_λ F_{μν})` — dimension `4`. +- `H H F_{μν}` — dimension `4`. + +### Two `F`'s + +- `F_{μν} F_{λρ}` — dimension `4`. + +### Two `ψ`'s + +- `ψ_i ψ̄_j` — dimension `3`. +- `(d_μ ψ_i) ψ̄_j` — dimension `4`. + +### `H` together with two `ψ`'s + +- `H ψ_i ψ̄_j` — dimension `4`. + +- No term with four or more `ψ`'s, or with a `ψ` together with an `F`, fits within + dimension `4` (`4 · 3/2 = 6 > 4`, and `3/2 + 2 = 7/2` is already odd-dimensional + and cannot appear alone). +- This list is purely a dimension count: it does not yet select which index + contractions are Lorentz scalars or gauge singlets — that reduction is the work + of sections B and C. diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index 50eaf799a..e22e4a4e5 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Truncation public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic public import Physlib.Relativity.IsLorentzDeriv @@ -136,6 +136,81 @@ lemma adjointDualCoeff_singleton (U : JetGaugeGroupI) map_neg, LieHom.map_lie] simp +/-- **Deep kernels kill the positive dual adjoint coefficients**: for a jet trivial to order `n`, all derivatives of the + adjoint action up to order `n` vanish. -/ +lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} {n : ℕ} + (hU : U ∈ JetGaugeGroupI.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} + (hx : x ≠ 0) (hxn : x.card ≤ n) : adjointDualCoeff U x = 0 := by + have hprod := JetGaugeGroupI.mem_truncationKer_iff.mp hU + -- the truncations of the matrix factors of `U` agree with `1` + have h3 : U.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.1) hprod + have h2 : U.2.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) := + congrArg (fun p => p.2.1) hprod + have hs3 : (star U.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) := by + rw [JetRing.matrix_truncation_star, h3, ← JetRing.matrix_truncation_star, star_one] + have hs2 : (star U.2.1.1).map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) := by + rw [JetRing.matrix_truncation_star, h2, ← JetRing.matrix_truncation_star, star_one] + -- conjugation by `U` is invisible to the `n`-th truncation + have hconj3 : ∀ M : Matrix (Fin 3) (Fin 3) JetRing, + ((U.1.1 * M) * star U.1.1).map (JetRing.truncation n) = + M.map (JetRing.truncation n) := by + intro M + rw [JetRing.matrix_truncation_mul_congr + (JetRing.matrix_truncation_mul_congr h3 rfl) hs3, one_mul, mul_one] + have hconj2 : ∀ M : Matrix (Fin 2) (Fin 2) JetRing, + ((U.2.1.1 * M) * star U.2.1.1).map (JetRing.truncation n) = + M.map (JetRing.truncation n) := by + intro M + rw [JetRing.matrix_truncation_mul_congr + (JetRing.matrix_truncation_mul_congr h2 rfl) hs2, one_mul, mul_one] + -- the multiset `x` sits in the truncation window, in nonzero degree + have hdeg : Finsupp.degree (Multiset.toFinsupp x) ≤ n := by + rw [JetRing.degree_toFinsupp_eq_card]; exact hxn + have hne : Multiset.toFinsupp x ≠ 0 := fun hc => + hx (by simpa using congrArg Finsupp.toMultiset hc) + -- the underlying derivative of the adjoint transport vanishes at the base point + have key : ∀ b : GaugeAlgebra, + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv x + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant b))) = 0 := by + intro b + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · ext i j : 1 + rw [JetGaugeAlgebra.eval_toSU3Matrix_apply, JetGaugeAlgebra.iteratedDeriv_toSU3Matrix, + Matrix.map_apply, JetRing.constantCoeff_foldl_pderiv, + JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.ofConstant_toSU3Matrix] + have h1 := congrArg (fun M : Matrix (Fin 3) (Fin 3) JetRing => M i j) + (hconj3 (b.toSU3Matrix.map (C : ℂ → JetRing))) + simp only [Matrix.map_apply] at h1 + have hcoeff := congrArg (fun f => coeff (Multiset.toFinsupp x) f) h1 + simp only [JetRing.coeff_truncation_of_le hdeg] at hcoeff + rw [hcoeff, coeff_C, if_neg hne, mul_zero, + GaugeAlgebra.zero_toSU3Matrix, Matrix.zero_apply] + · ext i j : 1 + rw [JetGaugeAlgebra.eval_toSU2Matrix_apply, JetGaugeAlgebra.iteratedDeriv_toSU2Matrix, + Matrix.map_apply, JetRing.constantCoeff_foldl_pderiv, + JetGaugeAlgebra.adjointMap_toSU2Matrix, JetGaugeAlgebra.ofConstant_toSU2Matrix] + have h1 := congrArg (fun M : Matrix (Fin 2) (Fin 2) JetRing => M i j) + (hconj2 (b.toSU2Matrix.map (C : ℂ → JetRing))) + simp only [Matrix.map_apply] at h1 + have hcoeff := congrArg (fun f => coeff (Multiset.toFinsupp x) f) h1 + simp only [JetRing.coeff_truncation_of_le hdeg] at hcoeff + rw [hcoeff, coeff_C, if_neg hne, mul_zero, + GaugeAlgebra.zero_toSU2Matrix, Matrix.zero_apply] + · rw [JetGaugeAlgebra.eval_toU1Value_eq, JetGaugeAlgebra.iteratedDeriv_toU1Value, + JetGaugeAlgebra.adjointMap_toU1Value, JetGaugeAlgebra.ofConstant_toU1Value, + JetRing.constantCoeff_foldl_pderiv, coeff_C, if_neg hne, mul_zero, + GaugeAlgebra.zero_toU1Value] + refine LinearMap.ext fun φ => LinearMap.ext fun b => ?_ + simp only [LinearMap.zero_apply] + show φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv x + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant b)))) = 0 + rw [key b, map_zero] + /-- The family `A` of symbols in the algebra `B` is a gauge field for the total derivative `D`, the Lorentz representation `repLorentz` and the gauge representation `repGauge`, when it satisfies the transformation laws of the physicists' gauge field: diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean index a8d355f21..3565eb44d 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean @@ -744,7 +744,8 @@ theorem symbolAdjoin_union_eq_symFieldAdjoin_union {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) ∪ S) := by - sorry + rw [Algebra.adjoin_union, Algebra.adjoin_union, + symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul n] /-- Finite order bound: membership in the subalgebra generated by all symbols and `S` uses only finitely many generators, hence symbols of some bounded order. -/ @@ -755,26 +756,31 @@ lemma exists_le_of_mem_adjoin_symbols_union (S : Set B) {x : B} ∃ n : ℕ, x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) := by - sorry - -/-- **Maurer–Cartan triangularity** (suggested home: - `GaugeGroup.MaurerCartan.Truncation`): a pure jet whose symmetrized Maurer–Cartan - coefficients vanish up to order `n` lies in the `n`-th truncation kernel. -/ -theorem mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero - (U : JetGaugeGroupI.truncationKer 0) (n : ℕ) - (h : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0), r.card ≤ n → - symmetrizedMaurerCartanCoeff U ⟨r, hr⟩ = 0) : - U.1 ∈ JetGaugeGroupI.truncationKer n := by - sorry - -/-- **Deep kernels kill the positive dual adjoint coefficients** (suggested home: - `AlgebraValued.Basic`): for a jet trivial to order `n`, all derivatives of the - adjoint action up to order `n` vanish. -/ -theorem adjointDualCoeff_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} {n : ℕ} - (hU : U ∈ JetGaugeGroupI.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} - (hx : x ≠ 0) (hxn : x.card ≤ n) : - adjointDualCoeff U x = 0 := by - sorry + have hmono : ∀ {n m : ℕ}, n ≤ m → + Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) ≤ + Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) := by + intro n m hnm + refine Algebra.adjoin_mono (Set.union_subset_union_left S ?_) + rintro b ⟨p, μ, φ, h, rfl⟩ + exact ⟨p, μ, φ, h.trans hnm, rfl⟩ + induction hx using Algebra.adjoin_induction with + | mem b hb => + rcases hb with ⟨p, μ, φ, rfl⟩ | hbS + · exact ⟨p.card, Algebra.subset_adjoin (Or.inl ⟨p, μ, φ, le_refl _, rfl⟩)⟩ + · exact ⟨0, Algebra.subset_adjoin (Or.inr hbS)⟩ + | algebraMap c => exact ⟨0, Subalgebra.algebraMap_mem _ c⟩ + | add u v hu hv ihu ihv => + obtain ⟨n₁, h₁⟩ := ihu + obtain ⟨n₂, h₂⟩ := ihv + exact ⟨max n₁ n₂, add_mem (hmono (le_max_left _ _) h₁) (hmono (le_max_right _ _) h₂)⟩ + | mul u v hu hv ihu ihv => + obtain ⟨n₁, h₁⟩ := ihu + obtain ⟨n₂, h₂⟩ := ihv + exact ⟨max n₁ n₂, mul_mem (hmono (le_max_left _ _) h₁) (hmono (le_max_right _ _) h₂)⟩ /-- **Pure translation**: when all positive dual adjoint coefficients of `U⁻¹` below the order of `s` vanish, the adjoint convolution in the transformation of the @@ -789,7 +795,59 @@ theorem repGauge_symmetrizedDeriv_translation repGauge U.1 (symmetrizedDeriv D D_comm s A φ) = symmetrizedDeriv D D_comm s A φ + algebraMap ℂ B (φ (symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by - sorry + -- collapsing principle: a sum over the antidiagonal whose terms vanish off the + -- `(0, t)` splitting reduces to the `(0, t)` term + have hcollapse : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) + (g : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3) → B), + (∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + p.1 + p.2 = t → p.1 ≠ 0 → g p = 0) → + (t.antidiagonal.map g).sum = g (0, t) := by + intro t + induction t using Multiset.induction_on with + | empty => + intro g hg + simp [Multiset.antidiagonal_zero] + | cons a t ih => + intro g hg + rw [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Multiset.map_map] + have h1 : ((t.antidiagonal.map (g ∘ Prod.map (a ::ₘ ·) id)).sum) = 0 := by + refine Multiset.sum_eq_zero fun z hz => ?_ + obtain ⟨q, hq, rfl⟩ := Multiset.mem_map.mp hz + have hq' := Multiset.mem_antidiagonal.mp hq + refine hg _ ?_ (Multiset.cons_ne_zero) + show (a ::ₘ q.1) + q.2 = a ::ₘ t + rw [Multiset.cons_add, hq'] + have h2 : ((t.antidiagonal.map (g ∘ Prod.map id (a ::ₘ ·))).sum) = + g (0, a ::ₘ t) := by + rw [ih (g ∘ Prod.map id (a ::ₘ ·)) fun p hp hp1 => ?_] + · rfl + · refine hg _ ?_ hp1 + show p.1 + (a ::ₘ p.2) = a ::ₘ t + rw [Multiset.add_cons, hp] + rw [h1, h2, add_zero] + rw [repGauge_symmetrizedDeriv_truncationKer hA U s hs φ] + congr 1 + have hinv1 : ((U.1)⁻¹).eval = 1 := by + rw [map_inv, JetGaugeGroupI.eval_coe_of_mem_truncationKer_zero U, inv_one] + have hid := adjointDualCoeff_zero_of_eval_eq_one hinv1 + rw [symmetrizedDeriv] + congr 1 + refine congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => ?_) + have hvan : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + p.1 + p.2 = s - {μ} → p.1 ≠ 0 → + Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff (U.1)⁻¹ p.1 φ)) = 0 := by + intro p hp hp1 + have hcard : p.1.card < s.card := by + have h1 : p.1.card + p.2.card = (s - {μ}).card := by rw [← Multiset.card_add, hp] + have h2 : (s - {μ}).card = s.card - 1 := by + rw [Multiset.sub_singleton, Multiset.card_erase_of_mem hμ, Nat.pred_eq_sub_one] + have h3 : s.card ≠ 0 := fun h => hs (Multiset.card_eq_zero.mp h) + omega + rw [hU p.1 hp1 hcard] + simp + rw [hcollapse (s - {μ}) _ hvan, hid] + rfl /-- **Realization of top-order translations**: any coefficient family supported at exactly order `N` is realized by a jet in the deep truncation kernel — surjectivity @@ -802,7 +860,240 @@ theorem exists_translation_of_support symmetrizedMaurerCartanCoeff U⁻¹ = c ∧ ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < N → adjointDualCoeff (U.1)⁻¹ x = 0 := by - sorry + obtain ⟨V, hV⟩ := symmetrizedMaurerCartanCoeff_surjective c + -- the realizing jet is deep in the truncation filtration, by triangularity + have hVmem : V.1 ∈ JetGaugeGroupI.truncationKer (N - 1) := by + refine mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero V (N - 1) ?_ + intro r hr hrcard + rw [hV] + refine hcN ⟨r, hr⟩ ?_ + show r.card ≠ N + have hne : r.card ≠ 0 := fun h => hr (Multiset.card_eq_zero.mp h) + omega + refine ⟨V⁻¹, by rw [inv_inv, hV], fun x hx hxN => ?_⟩ + have hcoe : ((V⁻¹ : JetGaugeGroupI.truncationKer 0).1)⁻¹ = V.1 := by simp + rw [hcoe] + exact adjointDualCoeff_eq_zero_of_mem_truncationKer hVmem hx (by omega) + +/-- A `B`-valued polynomial function of one real variable that vanishes identically + has vanishing coefficients: pair with real-linear functionals, which separate + points, and use that a real polynomial vanishing everywhere is zero. -/ +lemma eq_zero_of_forall_sum_smul_pow_eq_zero {n : ℕ} {b : ℕ → B} + (h : ∀ t : ℝ, ∑ m ∈ Finset.range n, t ^ m • b m = 0) : + ∀ m ∈ Finset.range n, b m = 0 := by + intro m hm + rw [← Module.forall_dual_apply_eq_zero_iff ℝ] + intro f + have hpz : (∑ j ∈ Finset.range n, Polynomial.C (f (b j)) * Polynomial.X ^ j : + Polynomial ℝ) = 0 := by + refine Polynomial.zero_of_eval_zero _ fun t => ?_ + have h1 := congrArg f (h t) + rw [map_sum, map_zero] at h1 + rw [Polynomial.eval_finsetSum] + simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_pow, + Polynomial.eval_X] + rw [← h1] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul, smul_eq_mul, mul_comm] + have hcoeff := congrArg (fun q => Polynomial.coeff q m) hpz + simp only [Polynomial.finsetSum_coeff, Polynomial.coeff_C_mul, Polynomial.coeff_X_pow, + Polynomial.coeff_zero, mul_ite, mul_one, mul_zero] at hcoeff + rwa [Finset.sum_ite_eq (Finset.range n) m (fun j => f (b j)), if_pos hm] at hcoeff + +/-- Any element of the subalgebra generated by a subalgebra `R` and a single central + element `y` is a polynomial in `y` with coefficients in `R`. -/ +lemma exists_polynomial_rep (R : Subalgebra ℂ B) (y : B) (hy : y ∈ Subring.center B) + {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ {y}) : + ∃ (n : ℕ) (r : ℕ → B), (∀ k, r k ∈ R) ∧ x = ∑ k ∈ Finset.range n, r k * y ^ k := by + classical + have hx' : x ∈ Algebra.adjoin ℂ (↑R ∪ {y}) := by + rw [Algebra.adjoin_union, Algebra.adjoin_eq] + exact hx + clear hx + -- single monomials are representable + have hmono : ∀ z : B, z ∈ R → ∀ k : ℕ, ∃ (n : ℕ) (r : ℕ → B), (∀ j, r j ∈ R) ∧ + z * y ^ k = ∑ j ∈ Finset.range n, r j * y ^ j := by + intro z hz k + refine ⟨k + 1, fun j => if j = k then z else 0, + fun j => by show (if j = k then z else 0) ∈ R; split_ifs; exacts [hz, zero_mem R], ?_⟩ + rw [Finset.sum_congr rfl fun j _ => by rw [ite_mul, zero_mul], + Finset.sum_ite_eq' (Finset.range (k + 1)) k (fun j => z * y ^ j), + if_pos (Finset.self_mem_range_succ k)] + -- representability is closed under addition + have hadd : ∀ x₁ x₂ : B, + (∃ (n : ℕ) (r : ℕ → B), (∀ j, r j ∈ R) ∧ x₁ = ∑ j ∈ Finset.range n, r j * y ^ j) → + (∃ (n : ℕ) (r : ℕ → B), (∀ j, r j ∈ R) ∧ x₂ = ∑ j ∈ Finset.range n, r j * y ^ j) → + ∃ (n : ℕ) (r : ℕ → B), (∀ j, r j ∈ R) ∧ + x₁ + x₂ = ∑ j ∈ Finset.range n, r j * y ^ j := by + rintro x₁ x₂ ⟨n₁, r₁, h₁, rfl⟩ ⟨n₂, r₂, h₂, rfl⟩ + have hext : ∀ (n m : ℕ) (r : ℕ → B), n ≤ m → + (∑ j ∈ Finset.range n, r j * y ^ j) = + ∑ j ∈ Finset.range m, (if j < n then r j else 0) * y ^ j := + fun n m r hnm => + (Finset.sum_congr rfl fun j hj => by + rw [if_pos (Finset.mem_range.mp hj)]).trans + (Finset.sum_subset (Finset.range_subset_range.mpr hnm) fun j _ hj => by + rw [if_neg fun h => hj (Finset.mem_range.mpr h), zero_mul]) + refine ⟨max n₁ n₂, + fun j => (if j < n₁ then r₁ j else 0) + (if j < n₂ then r₂ j else 0), + fun j => add_mem (by split_ifs; exacts [h₁ j, zero_mem R]) + (by split_ifs; exacts [h₂ j, zero_mem R]), ?_⟩ + rw [hext n₁ (max n₁ n₂) r₁ (le_max_left _ _), hext n₂ (max n₁ n₂) r₂ (le_max_right _ _), + ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun j _ => by rw [add_mul] + -- representability is closed under finite sums + have hsum : ∀ (κ : Type) (s : Finset κ) (f : κ → B), + (∀ i ∈ s, ∃ (n : ℕ) (r : ℕ → B), (∀ j, r j ∈ R) ∧ + f i = ∑ j ∈ Finset.range n, r j * y ^ j) → + ∃ (n : ℕ) (r : ℕ → B), (∀ j, r j ∈ R) ∧ + (∑ i ∈ s, f i) = ∑ j ∈ Finset.range n, r j * y ^ j := by + intro κ s f hf + classical + induction s using Finset.induction_on with + | empty => exact ⟨0, fun _ => 0, fun _ => zero_mem R, by simp⟩ + | insert i s his ih => + rw [Finset.sum_insert his] + exact hadd _ _ (hf i (Finset.mem_insert_self i s)) + (ih fun i' hi' => hf i' (Finset.mem_insert_of_mem hi')) + induction hx' using Algebra.adjoin_induction with + | mem b hb => + rcases hb with hbR | hby + · obtain ⟨n, r, hr, hrep⟩ := hmono b hbR 0 + exact ⟨n, r, hr, by rw [← hrep, pow_zero, mul_one]⟩ + · rw [Set.mem_singleton_iff] at hby + subst hby + obtain ⟨n, r, hr, hrep⟩ := hmono 1 (one_mem R) 1 + exact ⟨n, r, hr, by rw [← hrep, pow_one, one_mul]⟩ + | algebraMap c => + obtain ⟨n, r, hr, hrep⟩ := hmono (algebraMap ℂ B c) (Subalgebra.algebraMap_mem R c) 0 + exact ⟨n, r, hr, by rw [← hrep, pow_zero, mul_one]⟩ + | add u v hu hv ihu ihv => exact hadd u v ihu ihv + | mul u v hu hv ihu ihv => + obtain ⟨n₁, r₁, h₁, rfl⟩ := ihu + obtain ⟨n₂, r₂, h₂, rfl⟩ := ihv + rw [Finset.sum_mul_sum] + refine hsum _ _ _ fun k _ => hsum _ _ _ fun l _ => ?_ + have hcomm : y ^ k * r₂ l = r₂ l * y ^ k := + (Subring.mem_center_iff.mp (pow_mem hy k) (r₂ l)).symm + have hterm : (r₁ k * y ^ k) * (r₂ l * y ^ l) = (r₁ k * r₂ l) * y ^ (k + l) := by + rw [← mul_assoc, mul_assoc (r₁ k), hcomm, ← mul_assoc, mul_assoc, ← pow_add] + rw [hterm] + exact hmono _ (mul_mem (h₁ k) (h₂ l)) (k + l) + +/-- The single-variable extraction: an element of `R[y]` invariant under a family of + ring endomorphisms fixing `R` pointwise and translating the central element `y` by + arbitrary prescribable real scalars lies in `R`. Invariance forces the top + coefficient of any chosen polynomial representation to vanish, by expanding the + translated polynomial and extracting the top power of the shift. -/ +lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) + (hy : y ∈ Subring.center B) (Φ : ℝ → B →+* B) + (hΦR : ∀ t : ℝ, ∀ z ∈ R, Φ t z = z) + (hΦy : ∀ t : ℝ, Φ t y = y + algebraMap ℂ B (t : ℂ)) + {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ {y}) (hinv : ∀ t, Φ t x = x) : x ∈ R := by + -- scalars pull out of products against the algebra + have hpull : ∀ (z : ℂ) (w : B), w * algebraMap ℂ B z = z • w := fun z w => by + rw [← Algebra.commutes z w, ← Algebra.smul_def] + -- the binomial expansion of the translate of a single monomial + have hterm : ∀ (r : ℕ → B), (∀ k, r k ∈ R) → ∀ (t : ℝ) (k : ℕ), Φ t (r k * y ^ k) = + ∑ j ∈ Finset.range (k + 1), t ^ j • ((k.choose j : ℂ) • (r k * y ^ (k - j))) := by + intro r hrR t k + rw [map_mul, map_pow, hΦR t _ (hrR k), hΦy t, + Commute.add_pow ((Algebra.commute_algebraMap_left ((t : ℝ) : ℂ) y).symm) k, + Finset.mul_sum] + conv_rhs => rw [← Finset.sum_range_reflect] + simp only [Nat.add_sub_cancel] + refine Finset.sum_congr rfl fun i hi => ?_ + have hik : i ≤ k := Nat.lt_succ_iff.mp (Finset.mem_range.mp hi) + rw [Nat.choose_symm hik, Nat.sub_sub_self hik, ← map_pow, + ← map_natCast (algebraMap ℂ B) (k.choose i), mul_assoc (y ^ i), ← map_mul, + ← mul_assoc, hpull, mul_smul, ← Complex.ofReal_pow, Complex.coe_smul] + suffices h : ∀ (n : ℕ) (r : ℕ → B), (∀ k, r k ∈ R) → + (∀ t, Φ t (∑ k ∈ Finset.range n, r k * y ^ k) = ∑ k ∈ Finset.range n, r k * y ^ k) → + (∑ k ∈ Finset.range n, r k * y ^ k) ∈ R by + obtain ⟨n, r, hrR, rfl⟩ := exists_polynomial_rep R y hy hx + exact h n r hrR hinv + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro r hrR hinv + rcases n with _ | n + · simp + rcases n with _ | m + · have h1 : (∑ k ∈ Finset.range 1, r k * y ^ k) = r 0 := by + rw [Finset.sum_range_one, pow_zero, mul_one] + rw [h1] + exact hrR 0 + -- top order `m + 1 ≥ 1`: the collected coefficients of the shift powers + set b : ℕ → B := fun j => ∑ k ∈ Finset.range (m + 2), + if j ≤ k then (k.choose j : ℂ) • (r k * y ^ (k - j)) else 0 with hbdef + have hexp : ∀ t : ℝ, Φ t (∑ k ∈ Finset.range (m + 2), r k * y ^ k) = + ∑ j ∈ Finset.range (m + 2), t ^ j • b j := by + intro t + calc Φ t (∑ k ∈ Finset.range (m + 2), r k * y ^ k) + = ∑ k ∈ Finset.range (m + 2), Φ t (r k * y ^ k) := map_sum _ _ _ + _ = ∑ k ∈ Finset.range (m + 2), ∑ j ∈ Finset.range (k + 1), + t ^ j • ((k.choose j : ℂ) • (r k * y ^ (k - j))) := + Finset.sum_congr rfl fun k _ => hterm r hrR t k + _ = ∑ k ∈ Finset.range (m + 2), ∑ j ∈ Finset.range (m + 2), + (if j ≤ k then t ^ j • ((k.choose j : ℂ) • (r k * y ^ (k - j))) else 0) := by + refine Finset.sum_congr rfl fun k hk => ?_ + refine ((Finset.sum_congr rfl fun j hj => ?_).trans + (Finset.sum_subset (Finset.range_subset_range.mpr + (Nat.succ_le_succ (Nat.lt_succ_iff.mp (Finset.mem_range.mp hk)))) + fun j _ hj => if_neg fun h => + hj (Finset.mem_range.mpr (Nat.lt_succ_of_le h)))) + rw [if_pos (Nat.lt_succ_iff.mp (Finset.mem_range.mp hj))] + _ = ∑ j ∈ Finset.range (m + 2), ∑ k ∈ Finset.range (m + 2), + (if j ≤ k then t ^ j • ((k.choose j : ℂ) • (r k * y ^ (k - j))) else 0) := + Finset.sum_comm + _ = ∑ j ∈ Finset.range (m + 2), t ^ j • b j := by + refine Finset.sum_congr rfl fun j _ => ?_ + rw [hbdef] + dsimp only + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun k _ => (smul_ite_zero _ _ _).symm + have hconst : ∀ t : ℝ, ∑ j ∈ Finset.range (m + 2), t ^ j • b j = + ∑ k ∈ Finset.range (m + 2), r k * y ^ k := fun t => by rw [← hexp t, hinv t] + -- evaluate at zero to identify the constant coefficient + have hb0 : b 0 = ∑ k ∈ Finset.range (m + 2), r k * y ^ k := by + have h := hconst 0 + rwa [Finset.sum_eq_single 0 (fun j _ hj => by rw [zero_pow hj, zero_smul]) + (fun h0 => absurd (Finset.mem_range.mpr (Nat.succ_pos _)) h0), pow_zero, + one_smul] at h + -- all positive-order coefficients vanish + have hvan : ∀ j ∈ Finset.range (m + 2), (if j = 0 then 0 else b j) = 0 := by + refine eq_zero_of_forall_sum_smul_pow_eq_zero fun t => ?_ + rw [Finset.sum_range_succ' + (fun j => t ^ j • (if j = 0 then (0 : B) else b j)) (m + 1)] + simp only [Nat.succ_ne_zero, ite_false, ite_true, smul_zero, add_zero] + have h := hconst t + rw [Finset.sum_range_succ' (fun j => t ^ j • b j) (m + 1), pow_zero, one_smul, + ← hb0] at h + have h2 := congrArg (fun z => z - b 0) h + simpa using h2 + -- the top coefficient of the representation is the top `b` + have hbtop : b (m + 1) = r (m + 1) := by + have h1 : ∀ k ∈ Finset.range (m + 2), + (if m + 1 ≤ k then (k.choose (m + 1) : ℂ) • (r k * y ^ (k - (m + 1))) else 0) = + (if k = m + 1 then (k.choose (m + 1) : ℂ) • (r k * y ^ (k - (m + 1))) else 0) := by + intro k hk + have hk' := Finset.mem_range.mp hk + simp only [show (m + 1 ≤ k) ↔ k = m + 1 by omega] + rw [hbdef] + dsimp only + rw [Finset.sum_congr rfl h1, + Finset.sum_ite_eq' (Finset.range (m + 2)) (m + 1) + (fun k => (k.choose (m + 1) : ℂ) • (r k * y ^ (k - (m + 1)))), + if_pos (Finset.self_mem_range_succ _), Nat.choose_self, Nat.sub_self, pow_zero, + mul_one, Nat.cast_one, one_smul] + have hrtop : r (m + 1) = 0 := by + have h := hvan (m + 1) (Finset.self_mem_range_succ _) + rwa [if_neg (Nat.succ_ne_zero m), hbtop] at h + -- strip the top term and recurse + have hstrip : (∑ k ∈ Finset.range (m + 2), r k * y ^ k) = + ∑ k ∈ Finset.range (m + 1), r k * y ^ k := by + rw [Finset.sum_range_succ, hrtop, zero_mul, add_zero] + rw [hstrip] at hinv ⊢ + exact ih (m + 1) (Nat.lt_succ_self _) r hrR hinv /-- **The abstract extraction theorem** — pure ring theory, no gauge input and no independence hypothesis: if a family of unital ring endomorphisms fixes a @@ -822,7 +1113,45 @@ theorem mem_of_translationInvariant {ι : Type} [Fintype ι] {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ (Set.range y)) (hinv : ∀ t, Φ t x = x) : x ∈ R := by - sorry + classical + suffices h : ∀ s : Finset ι, ∀ x : B, x ∈ R ⊔ Algebra.adjoin ℂ (y '' ↑s) → + (∀ t, Φ t x = x) → x ∈ R by + refine h Finset.univ x ?_ hinv + rwa [Finset.coe_univ, Set.image_univ] + intro s + induction s using Finset.induction_on with + | empty => + intro x hx hinv + simpa [Algebra.adjoin_empty] using hx + | insert i s his ih => + intro x hx hinv + -- rearrange the generators: the coordinate `i` is adjoined last + have hxR' : x ∈ (R ⊔ Algebra.adjoin ℂ (y '' ↑s)) ⊔ Algebra.adjoin ℂ {y i} := by + have hset : (y '' ↑(insert i s) : Set B) = {y i} ∪ y '' ↑s := by + rw [Finset.coe_insert, Set.image_insert_eq, Set.insert_eq] + rwa [hset, Algebra.adjoin_union, sup_comm (Algebra.adjoin ℂ {y i}), + ← sup_assoc] at hx + -- the single-coordinate translations fix the enlarged base subalgebra + have hfix : ∀ u : ℝ, ∀ z ∈ R ⊔ Algebra.adjoin ℂ (y '' ↑s), + Φ (Pi.single i u) z = z := by + intro u z hz + rw [← Algebra.adjoin_eq R, ← Algebra.adjoin_union] at hz + induction hz using Algebra.adjoin_induction with + | mem b hb => + rcases hb with hbR | ⟨j, hj, rfl⟩ + · exact hΦR _ b hbR + · have hji : j ≠ i := fun h => his (by rw [← h]; exact Finset.mem_coe.mp hj) + rw [hΦy (Pi.single i u) j, Pi.single_eq_of_ne hji] + simp + | algebraMap c => exact hΦR _ _ (Subalgebra.algebraMap_mem R c) + | add a b _ _ iha ihb => rw [map_add, iha, ihb] + | mul a b _ _ iha ihb => rw [map_mul, iha, ihb] + have hxmid : x ∈ R ⊔ Algebra.adjoin ℂ (y '' ↑s) := + mem_of_translationInvariant_single (R ⊔ Algebra.adjoin ℂ (y '' ↑s)) (y i) (hy i) + (fun u => Φ (Pi.single i u)) hfix + (fun u => by rw [hΦy (Pi.single i u) i, Pi.single_eq_same]) + hxR' (fun u => hinv _) + exact ih x hxmid hinv /-- **The classification of invariants**: a gauge-invariant element of the subalgebra generated by the gauge-field symbols and a set `S` of `truncationKer 0`-fixed @@ -846,7 +1175,234 @@ theorem invariant_mem_adjoin_fieldStrength x ∈ Algebra.adjoin ℂ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S) := by - sorry + classical + -- every element of the covariant tower together with `S` is fixed by the + -- truncation kernel + have hS' : ∀ y ∈ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S), + ∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 y = y := by + rintro y (⟨l, ν, lam, φ, rfl⟩ | hyS) U + · exact repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero + hA D_mul U l ν lam φ + · exact hS y hyS U + -- the gauge action preserves the unit, hence acts by ring endomorphisms + have hone : ∀ U : JetGaugeGroupI, repGauge U (1 : B) = 1 := by + intro U + have h2 : repGauge U (repGauge U⁻¹ (1 : B)) = 1 := by + have h3 : repGauge U * repGauge U⁻¹ = 1 := by + rw [← map_mul, mul_inv_cancel, map_one] + calc repGauge U (repGauge U⁻¹ (1 : B)) = (repGauge U * repGauge U⁻¹) (1 : B) := rfl + _ = 1 := by rw [h3]; rfl + have h1 := hA.gauge_mul U (repGauge U⁻¹ (1 : B)) 1 + rw [mul_one, h2, one_mul] at h1 + exact h1.symm + -- the descent: invariance strips the top symmetrized order + have hdescent : ∀ (m : ℕ) (z : B), + z ∈ Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ m + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) → + (∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 z = z) → + z ∈ Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) := by + intro m z hz hzinv + set bv := Module.Free.chooseBasis ℝ GaugeAlgebra with hbv + set R₀ : Subalgebra ℂ B := Algebra.adjoin ℂ + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) with hR₀ + set Y : Sym (Fin 1 ⊕ Fin 3) (m + 1) × Module.Free.ChooseBasisIndex ℝ GaugeAlgebra → B := + fun p => symmetrizedDeriv D D_comm (p.1 : Multiset (Fin 1 ⊕ Fin 3)) A (bv.coord p.2) + with hYdef + -- the translating jets realizing an arbitrary top-order shift + have hUt' : ∀ t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × + Module.Free.ChooseBasisIndex ℝ GaugeAlgebra → ℝ, + ∃ U : JetGaugeGroupI.truncationKer 0, + symmetrizedMaurerCartanCoeff U⁻¹ = (fun r => + if h : Multiset.card r.1 = m + 1 then ∑ j, t (⟨r.1, h⟩, j) • bv j else 0) ∧ + ∀ x' : Multiset (Fin 1 ⊕ Fin 3), x' ≠ 0 → x'.card < m + 1 → + adjointDualCoeff (U.1)⁻¹ x' = 0 := + fun t => exists_translation_of_support (m + 1) _ (fun r hr => dif_neg hr) + choose Ut hUt1 hUt2 using hUt' + -- the family of ring endomorphisms + set Φ : (Sym (Fin 1 ⊕ Fin 3) (m + 1) × + Module.Free.ChooseBasisIndex ℝ GaugeAlgebra → ℝ) → B →+* B := + fun t => + { toFun := repGauge (Ut t).1 + map_one' := hone (Ut t).1 + map_mul' := hA.gauge_mul (Ut t).1 + map_zero' := map_zero _ + map_add' := fun a b => map_add _ a b } with hΦdef + -- the endomorphisms fix the lower-order subalgebra pointwise + have hfixR₀ : ∀ t, ∀ w ∈ R₀, Φ t w = w := by + intro t w hw + rw [hR₀] at hw + induction hw using Algebra.adjoin_induction with + | mem b hb => + show repGauge (Ut t).1 b = b + rcases hb with ⟨r, φ, hr0, hrm, rfl⟩ | hb' + · have hUvan : ∀ x' : Multiset (Fin 1 ⊕ Fin 3), x' ≠ 0 → x'.card < r.card → + adjointDualCoeff ((Ut t).1)⁻¹ x' = 0 := + fun x' hx' hxc => hUt2 t x' hx' (by omega) + rw [repGauge_symmetrizedDeriv_translation hA (Ut t) r hr0 hUvan φ] + have hshift : symmetrizedMaurerCartanCoeff (Ut t)⁻¹ ⟨r, hr0⟩ = 0 := by + simp only [hUt1 t] + exact dif_neg (show ¬ Multiset.card r = m + 1 by omega) + rw [hshift, map_zero] + simp + · exact hS' b hb' (Ut t) + | algebraMap c => + show repGauge (Ut t).1 (algebraMap ℂ B c) = algebraMap ℂ B c + rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] + | add a b _ _ iha ihb => rw [map_add, iha, ihb] + | mul a b _ _ iha ihb => rw [map_mul, iha, ihb] + -- the endomorphisms translate the top-order coordinates by the prescribed shifts + have hΦy : ∀ t p, Φ t (Y p) = Y p + algebraMap ℂ B ((t p : ℝ) : ℂ) := by + rintro t ⟨ps, j⟩ + have hps : Multiset.card (ps : Multiset (Fin 1 ⊕ Fin 3)) = m + 1 := + Sym.card_coe (s := ps) + have hp0 : (ps : Multiset (Fin 1 ⊕ Fin 3)) ≠ 0 := by + intro h + rw [h] at hps + simp at hps + have hUvan : ∀ x' : Multiset (Fin 1 ⊕ Fin 3), x' ≠ 0 → + x'.card < (ps : Multiset (Fin 1 ⊕ Fin 3)).card → + adjointDualCoeff ((Ut t).1)⁻¹ x' = 0 := + fun x' hx' hxc => hUt2 t x' hx' (by omega) + have hval : bv.coord j (symmetrizedMaurerCartanCoeff (Ut t)⁻¹ + ⟨(ps : Multiset (Fin 1 ⊕ Fin 3)), hp0⟩) = t (ps, j) := by + have hcoeff : symmetrizedMaurerCartanCoeff (Ut t)⁻¹ + ⟨(ps : Multiset (Fin 1 ⊕ Fin 3)), hp0⟩ = ∑ j', t (ps, j') • bv j' := by + simp only [hUt1 t] + rw [dif_pos hps] + exact Finset.sum_congr rfl fun j' _ => + congrArg (fun q : Sym (Fin 1 ⊕ Fin 3) (m + 1) => t (q, j') • bv j') + (Sym.ext rfl) + rw [hcoeff, map_sum] + simp only [map_smul, Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply, smul_eq_mul, mul_ite, mul_one, mul_zero] + rw [Finset.sum_ite_eq' Finset.univ j (fun j' => t (ps, j'))] + simp + show repGauge (Ut t).1 (symmetrizedDeriv D D_comm (ps : Multiset (Fin 1 ⊕ Fin 3)) A + (bv.coord j)) = symmetrizedDeriv D D_comm (ps : Multiset (Fin 1 ⊕ Fin 3)) A + (bv.coord j) + algebraMap ℂ B ((t (ps, j) : ℝ) : ℂ) + rw [repGauge_symmetrizedDeriv_translation hA (Ut t) _ hp0 hUvan (bv.coord j), hval] + -- the coordinate expansion of a top-order symmetrized symbol in the chosen basis + have hdual : ∀ ψ : Module.Dual ℝ GaugeAlgebra, ∑ j, ψ (bv j) • bv.coord j = ψ := by + intro ψ + refine LinearMap.ext fun v => ?_ + conv_rhs => rw [← bv.sum_repr v, map_sum] + simp only [LinearMap.sum_apply, LinearMap.smul_apply, Module.Basis.coord_apply, + smul_eq_mul, map_smul] + exact Finset.sum_congr rfl fun j _ => mul_comm _ _ + have hexpand : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + symmetrizedDeriv D D_comm r A φ = + ∑ j, φ (bv j) • symmetrizedDeriv D D_comm r A (bv.coord j) := by + intro r φ + set L : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + { toFun := fun ψ => symmetrizedDeriv D D_comm r A ψ, + map_add' := fun ψ ψ' => by + simp only [symmetrizedDeriv, map_add] + rw [← smul_add, ← Multiset.sum_map_add] + map_smul' := fun c ψ => by + simp only [symmetrizedDeriv, map_smul, RingHom.id_apply, + LinearMap.map_smul_of_tower] + rw [show (r.map fun μ => c • Lorentz.iteratedD D D_comm (r - {μ}) (A μ ψ)) = + (r.map fun μ => Lorentz.iteratedD D D_comm (r - {μ}) (A μ ψ)).map + (fun w => c • w) from (Multiset.map_map _ _ _).symm, + ← Multiset.smul_sum, smul_comm] } with hL + have hLcalc : L φ = ∑ j, φ (bv j) • L (bv.coord j) := by + conv_lhs => rw [← hdual φ, map_sum] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul] + exact hLcalc + -- the invariant lies in the sup of the lower-order subalgebra and the coordinates + have hzsup : z ∈ R₀ ⊔ Algebra.adjoin ℂ (Set.range Y) := by + refine Algebra.adjoin_le ?_ hz + rintro b (⟨r, φ, hr0, hrm1, rfl⟩ | hb) + · by_cases hcm : r.card ≤ m + · exact SetLike.le_def.mp le_sup_left + (Algebra.subset_adjoin (Or.inl ⟨r, φ, hr0, hcm, rfl⟩)) + · have hcard : Multiset.card r = m + 1 := by omega + rw [hexpand r φ] + refine Subalgebra.sum_mem _ fun j _ => ?_ + rw [← algebraMap_smul ℂ (φ (bv j))] + refine Subalgebra.smul_mem _ ?_ _ + exact SetLike.le_def.mp le_sup_right + (Algebra.subset_adjoin ⟨(⟨r, hcard⟩, j), rfl⟩) + · exact SetLike.le_def.mp le_sup_left (Algebra.subset_adjoin (Or.inr hb)) + -- extraction: the invariant lies in the lower-order subalgebra + have hzR₀ : z ∈ R₀ := + mem_of_translationInvariant R₀ Y + (fun p => symmetrizedDeriv_mem_center hc _ _) Φ hfixR₀ hΦy hzsup + (fun t => hzinv (Ut t)) + rw [hR₀] at hzR₀ + exact hzR₀ + -- bound the symbol order of the invariant, working relative to the full tower + have hxS' : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) := + Algebra.adjoin_mono (Set.union_subset_union_right _ Set.subset_union_right) hx + obtain ⟨n, hxn⟩ := exists_le_of_mem_adjoin_symbols_union _ hxS' + -- convert bounded symbols to symmetrized symbols, absorbing the tower + have hconv : ∀ (k : ℕ) (z : B), + z ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ k ∧ + b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) → + z ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra), r ≠ 0 ∧ r.card ≤ k + 1 ∧ + b = symmetrizedDeriv D D_comm r A φ} ∪ + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) := by + intro k z hzk + rw [symbolAdjoin_union_eq_symFieldAdjoin_union D_mul k + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)] at hzk + refine Algebra.adjoin_mono ?_ hzk + rintro b ((⟨r, φ, h0, hcr, rfl⟩ | ⟨l, ν, lam, φ, _, rfl⟩) | hb) + · exact Or.inl ⟨r, φ, h0, hcr, rfl⟩ + · exact Or.inr (Or.inl ⟨l, ν, lam, φ, rfl⟩) + · exact Or.inr hb + -- iterate the descent from the top order down to zero + have hiter : ∀ (k : ℕ) (z : B), + z ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra), r ≠ 0 ∧ r.card ≤ k ∧ + b = symmetrizedDeriv D D_comm r A φ} ∪ + ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) → + (∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 z = z) → + z ∈ Algebra.adjoin ℂ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S) := by + intro k + induction k with + | zero => + intro z hz0 _ + refine Algebra.adjoin_mono ?_ hz0 + rintro b (⟨r, φ, hr0, hrc, rfl⟩ | hb) + · exact absurd (Multiset.card_eq_zero.mp (Nat.le_zero.mp hrc)) hr0 + · exact hb + | succ k ih => + intro z hzk hzinv + exact ih z (hdescent k z hzk hzinv) hzinv + exact hiter (n + 1) x (hconv n x hxn) fun U => hinv U.1 end IsGaugeField diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean index 218a5db1f..09500ce38 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -341,4 +341,225 @@ lemma symmetrizedMaurerCartanCoeff_surjective : push_cast field_simp + +/-- **Maurer–Cartan triangularity**: a pure jet whose symmetrized Maurer–Cartan + coefficients vanish up to order `n` lies in the `n`-th truncation kernel. -/ +lemma mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero + (U : JetGaugeGroupI.truncationKer 0) (n : ℕ) + (h : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0), r.card ≤ n → + symmetrizedMaurerCartanCoeff U ⟨r, hr⟩ = 0) : + U.1 ∈ JetGaugeGroupI.truncationKer n := by + classical + -- Step 1: the base-point Maurer–Cartan Taylor data vanish below order `n`, by + -- strong induction with the symmetrization defect formula. + have hall : ∀ (k : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), + s.card = k → k < n → eval (iteratedDeriv s (maurerCartanForm U.1 μ)) = 0 := by + intro k + induction k using Nat.strong_induction_on with + | _ k ih => + intro s μ hs hk + rw [iteratedDeriv_maurerCartanForm_eq_symmetrized_add U.1 s μ, map_add, map_smul] + have h1 : eval (symmetrizedMaurerCartanForm U.1 (μ ::ₘ s)) = 0 := by + have hle : (μ ::ₘ s).card ≤ n := by rw [Multiset.card_cons, hs]; omega + have h2 := h (μ ::ₘ s) (Multiset.cons_ne_zero) hle + rwa [symmetrizedMaurerCartanCoeff_apply] at h2 + have h2 : eval ((s.map fun ν => iteratedDeriv (s.erase ν) + ⁅maurerCartanForm U.1 μ, maurerCartanForm U.1 ν⁆).sum) = 0 := by + rw [map_multiset_sum, Multiset.map_map] + refine Multiset.sum_eq_zero fun x hx => ?_ + obtain ⟨ν, hν, rfl⟩ := Multiset.mem_map.mp hx + have hzero : ∀ (ρ : Fin 1 ⊕ Fin 3) (p : Multiset (Fin 1 ⊕ Fin 3)), + p ≤ s.erase ν → eval (iteratedDeriv p (maurerCartanForm U.1 ρ)) = + eval (iteratedDeriv p (0 : JetGaugeAlgebra)) := by + intro ρ p hp + have hcard : p.card < k := by + have h3 := Multiset.card_le_card hp + have h4 := Multiset.card_erase_add_one hν + omega + rw [ih p.card hcard p ρ rfl (hcard.trans hk), map_zero, map_zero] + simp only [Function.comp_apply] + rw [eval_iteratedDeriv_bracket_congr (s.erase ν) _ _ 0 0 (hzero μ) (hzero ν)] + simp + rw [h1, h2] + simp + -- Step 2: the Taylor coefficients of the Maurer–Cartan form components vanish in + -- all degrees below `n`. + have hfac : ∀ s : Multiset (Fin 1 ⊕ Fin 3), + ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) ≠ 0 := fun s => + Nat.cast_ne_zero.mpr (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _) + have hround : ∀ m : (Fin 1 ⊕ Fin 3) →₀ ℕ, + Multiset.toFinsupp (Finsupp.toMultiset m) = m := fun m => by simp + have hcardm : ∀ m : (Fin 1 ⊕ Fin 3) →₀ ℕ, + (Finsupp.toMultiset m).card = Finsupp.degree m := fun m => by + rw [← degree_toFinsupp_eq_card, hround] + have hω3 : ∀ (ρ : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree m < n → + ∀ i j, coeff m ((maurerCartanForm U.1 ρ).toSU3Matrix i j) = 0 := by + intro ρ m hm i j + have h0 := hall (Finsupp.toMultiset m).card (Finsupp.toMultiset m) ρ rfl + (by rw [hcardm m]; exact hm) + have h1 := congrArg (fun a => GaugeAlgebra.toSU3Matrix a i j) h0 + simp only [GaugeAlgebra.zero_toSU3Matrix, Matrix.zero_apply] at h1 + rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply, + constantCoeff_foldl_pderiv, hround] at h1 + exact (mul_eq_zero.mp h1).resolve_left (hfac _) + have hω2 : ∀ (ρ : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree m < n → + ∀ i j, coeff m ((maurerCartanForm U.1 ρ).toSU2Matrix i j) = 0 := by + intro ρ m hm i j + have h0 := hall (Finsupp.toMultiset m).card (Finsupp.toMultiset m) ρ rfl + (by rw [hcardm m]; exact hm) + have h1 := congrArg (fun a => GaugeAlgebra.toSU2Matrix a i j) h0 + simp only [GaugeAlgebra.zero_toSU2Matrix, Matrix.zero_apply] at h1 + rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply, + constantCoeff_foldl_pderiv, hround] at h1 + exact (mul_eq_zero.mp h1).resolve_left (hfac _) + have hω1 : ∀ (ρ : Fin 1 ⊕ Fin 3) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree m < n → + coeff m ((maurerCartanForm U.1 ρ).toU1Value) = 0 := by + intro ρ m hm + have h0 := hall (Finsupp.toMultiset m).card (Finsupp.toMultiset m) ρ rfl + (by rw [hcardm m]; exact hm) + have h1 := congrArg GaugeAlgebra.toU1Value h0 + simp only [GaugeAlgebra.zero_toU1Value] at h1 + rw [eval_toU1Value_eq, iteratedDeriv_toU1Value, constantCoeff_foldl_pderiv, + hround] at h1 + exact (mul_eq_zero.mp h1).resolve_left (hfac _) + -- Step 3: the Euler operator toolkit. A product with a factor whose coefficients + -- vanish below degree `n` has vanishing coefficients below degree `n` ... + have hmul : ∀ (w v : JetRing), + (∀ q : (Fin 1 ⊕ Fin 3) →₀ ℕ, Finsupp.degree q < n → coeff q w = 0) → + ∀ q : (Fin 1 ⊕ Fin 3) →₀ ℕ, Finsupp.degree q < n → coeff q (w * v) = 0 := by + intro w v hw q hq + rw [coeff_mul] + refine Finset.sum_eq_zero fun p hp => ?_ + have hpq : p.1 + p.2 = q := Finset.mem_antidiagonal.mp hp + have hdeg : Finsupp.degree p.1 ≤ Finsupp.degree q := by + rw [← hpq, map_add] + exact Nat.le_add_right _ _ + rw [hw p.1 (lt_of_le_of_lt hdeg hq), zero_mul] + -- ... and a jet whose derivatives have vanishing coefficients below degree `n` has + -- vanishing coefficients in all nonzero degrees up to `n`, by the Euler identity. + have hvanish : ∀ f : JetRing, + (∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → + coeff q (pderiv ℂ ρ f) = 0) → + ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, p ≠ 0 → Finsupp.degree p ≤ n → coeff p f = 0 := by + intro f hf p hp hpn + have h1 := JetRing.coeff_sum_X_smul_pderiv f p + have h2 : coeff p (∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f) = 0 := by + rw [map_sum] + refine Finset.sum_eq_zero fun ρ _ => ?_ + rw [JetRing.coeff_X_smul] + split_ifs with hle + · refine hf ρ _ ?_ + have hd := congrArg Finsupp.degree (tsub_add_cancel_of_le hle) + rw [map_add, Finsupp.degree_single] at hd + omega + · rfl + rw [h2] at h1 + have hne : ((Finsupp.degree p : ℕ) : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr fun hc => hp ((Finsupp.degree_eq_zero_iff p).mp hc) + exact (mul_eq_zero.mp h1.symm).resolve_left hne + -- the radial derivative relation `∂_μ U = (−i ω_μ) U` on each factor + have hstar3 : star U.1.1.1 * U.1.1.1 = 1 := by + have h1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h1 + have hstar2 : star U.1.2.1.1 * U.1.2.1.1 = 1 := by + have h1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h1 + have hstar1 : star U.1.2.2.1 * U.1.2.2.1 = 1 := (Unitary.mem_iff.mp U.1.2.2.2).1 + have hd3 : ∀ ρ, U.1.1.1.map (pderiv ℂ ρ) = + ((-Complex.I) • (maurerCartanForm U.1 ρ).toSU3Matrix) * U.1.1.1 := by + intro ρ + rw [maurerCartanForm_toSU3Matrix, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, + one_smul, mul_assoc, hstar3, mul_one] + have hd2 : ∀ ρ, U.1.2.1.1.map (pderiv ℂ ρ) = + ((-Complex.I) • (maurerCartanForm U.1 ρ).toSU2Matrix) * U.1.2.1.1 := by + intro ρ + rw [maurerCartanForm_toSU2Matrix, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, + one_smul, mul_assoc, hstar2, mul_one] + have hd1 : ∀ ρ, pderiv ℂ ρ U.1.2.2.1 = + ((-Complex.I) • (maurerCartanForm U.1 ρ).toU1Value) * U.1.2.2.1 := by + intro ρ + rw [maurerCartanForm_toU1Value, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, + one_smul, mul_assoc, hstar1, mul_one] + -- coefficient vanishing for the entries of `U` in nonzero degree up to `n` + have hU3 : ∀ (i j : Fin 3) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), p ≠ 0 → + Finsupp.degree p ≤ n → coeff p (U.1.1.1 i j) = 0 := by + intro i j p hp hpn + refine hvanish _ (fun ρ q hq => ?_) p hp hpn + have h1 : pderiv ℂ ρ (U.1.1.1 i j) = + (((-Complex.I) • (maurerCartanForm U.1 ρ).toSU3Matrix) * U.1.1.1) i j := by + rw [← hd3 ρ, Matrix.map_apply] + rw [h1, Matrix.mul_apply, map_sum] + refine Finset.sum_eq_zero fun k _ => ?_ + refine hmul _ _ (fun q' hq' => ?_) q hq + rw [Matrix.smul_apply, map_smul, hω3 ρ q' hq' i k, smul_zero] + have hU2 : ∀ (i j : Fin 2) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), p ≠ 0 → + Finsupp.degree p ≤ n → coeff p (U.1.2.1.1 i j) = 0 := by + intro i j p hp hpn + refine hvanish _ (fun ρ q hq => ?_) p hp hpn + have h1 : pderiv ℂ ρ (U.1.2.1.1 i j) = + (((-Complex.I) • (maurerCartanForm U.1 ρ).toSU2Matrix) * U.1.2.1.1) i j := by + rw [← hd2 ρ, Matrix.map_apply] + rw [h1, Matrix.mul_apply, map_sum] + refine Finset.sum_eq_zero fun k _ => ?_ + refine hmul _ _ (fun q' hq' => ?_) q hq + rw [Matrix.smul_apply, map_smul, hω2 ρ q' hq' i k, smul_zero] + have hU1 : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, p ≠ 0 → Finsupp.degree p ≤ n → + coeff p U.1.2.2.1 = 0 := by + intro p hp hpn + refine hvanish _ (fun ρ q hq => ?_) p hp hpn + rw [hd1 ρ] + refine hmul _ _ (fun q' hq' => ?_) q hq + rw [map_smul, hω1 ρ q' hq', smul_zero] + -- assemble: agreement with the identity jet in all degrees up to `n` + have heval : U.1.eval = 1 := JetGaugeGroupI.eval_coe_of_mem_truncationKer_zero U + rw [JetGaugeGroupI.mem_truncationKer_iff] + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · show U.1.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 3) (Fin 3) JetRing).map (JetRing.truncation n) + ext i j : 1 + simp only [Matrix.map_apply] + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [JetRing.coeff_truncation_of_le hm, JetRing.coeff_truncation_of_le hm] + rcases eq_or_ne m 0 with rfl | hm0 + · have h3 := congrArg (fun p => (p.1 : Matrix (Fin 3) (Fin 3) ℂ) i j) heval + simpa [JetGaugeGroupI.eval, JetGaugeGroupI.evalSU, RingHom.mapMatrix_apply, + Matrix.map_apply, Matrix.one_apply, apply_ite constantCoeff, + coeff_zero_eq_constantCoeff] using h3 + · rw [hU3 i j m hm0 hm] + rcases eq_or_ne i j with rfl | hij + · rw [Matrix.one_apply_eq, coeff_one, if_neg hm0] + · rw [Matrix.one_apply_ne hij, map_zero] + · rw [JetRing.coeff_truncation_of_gt (not_le.mp hm), + JetRing.coeff_truncation_of_gt (not_le.mp hm)] + · show U.1.2.1.1.map (JetRing.truncation n) = + (1 : Matrix (Fin 2) (Fin 2) JetRing).map (JetRing.truncation n) + ext i j : 1 + simp only [Matrix.map_apply] + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [JetRing.coeff_truncation_of_le hm, JetRing.coeff_truncation_of_le hm] + rcases eq_or_ne m 0 with rfl | hm0 + · have h3 := congrArg (fun p => (p.2.1 : Matrix (Fin 2) (Fin 2) ℂ) i j) heval + simpa [JetGaugeGroupI.eval, JetGaugeGroupI.evalSU, RingHom.mapMatrix_apply, + Matrix.map_apply, Matrix.one_apply, apply_ite constantCoeff, + coeff_zero_eq_constantCoeff] using h3 + · rw [hU2 i j m hm0 hm] + rcases eq_or_ne i j with rfl | hij + · rw [Matrix.one_apply_eq, coeff_one, if_neg hm0] + · rw [Matrix.one_apply_ne hij, map_zero] + · rw [JetRing.coeff_truncation_of_gt (not_le.mp hm), + JetRing.coeff_truncation_of_gt (not_le.mp hm)] + · show JetRing.truncation n U.1.2.2.1 = JetRing.truncation n (1 : JetRing) + ext m + by_cases hm : Finsupp.degree m ≤ n + · rw [JetRing.coeff_truncation_of_le hm, JetRing.coeff_truncation_of_le hm] + rcases eq_or_ne m 0 with rfl | hm0 + · have h3 := congrArg (fun p => (p.2.2 : ℂ)) heval + simpa [JetGaugeGroupI.eval, JetGaugeGroupI.evalU1, + coeff_zero_eq_constantCoeff] using h3 + · rw [hU1 m hm0 hm, coeff_one, if_neg hm0] + · rw [JetRing.coeff_truncation_of_gt (not_le.mp hm), + JetRing.coeff_truncation_of_gt (not_le.mp hm)] + end StandardModel From 8eeacdaeead29c15fb7810f47691105f54db4a1e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Thu, 20 Aug 2026 16:09:33 +0400 Subject: [PATCH 174/254] update outline with JetRing --- Outline.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/Outline.md b/Outline.md index 9e20b7e60..d02c5f5a0 100644 --- a/Outline.md +++ b/Outline.md @@ -32,9 +32,78 @@ Basic rules of this outline: ## Jet ring -- Let `JetRing` be the ring of jets. -- For `φ : JetRing`, and `p : Multiset (Fin 1 ⊕ Fin 3)` we let `∂_p| φ` be the - `p`-th Taylor coefficient of `φ` at the base point. +- Fix a spacetime point `x₀`, called the base point, at which all field values and + derivatives appearing below are evaluated. +- A local lagrangian evaluated at `x₀` depends on a field only through the values of + its derivatives at `x₀`. +- For a complex-valued field `φ`, its infinite formal jet at `x₀` is the collection + of all these derivative values. +- The type `Fin 1 ⊕ Fin 3` indexes the four spacetime directions: one temporal + direction and three spatial directions. +- A multi-index records how many derivatives are taken in each spacetime direction. +- We represent such a multi-index by `s : Multiset (Fin 1 ⊕ Fin 3)`. +- A multiset is an unordered collection with repetitions, where the multiplicity of + a direction records how many derivatives are taken in that direction. +- For example, the multiset containing `μ` twice and `ν` once represents the + derivative `∂_μ ∂_μ ∂_ν`. +- A multiset is sufficient because ordinary partial derivatives commute, so only + the multiplicity of each direction matters, not their order. +- We model this derivative data by a formal power series in four spacetime variables. +- We define `JetRing := MvPowerSeries (Fin 1 ⊕ Fin 3) ℂ`. +- The word "formal" means that the spacetime variables are indeterminates: they + record spacetime directions and derivative orders but are not assigned numerical + coordinate values. +- A formal power series is therefore treated as an arbitrary family of coefficients + equipped with algebraic operations, rather than as an infinite sum that must be + evaluated. +- In particular, no convergence or analyticity condition is imposed. +- Thus an element of `JetRing` records local Taylor data rather than a function + defined on all of spacetime. +- Here "jet" means a formal Taylor jet at a point and is unrelated to the particle + jets of collider physics. +- The constant coefficient of `φ : JetRing` represents the value `φ(x₀)`. +- The coefficient at a multi-index `s` records the corresponding Taylor-series + coefficient. +- For `s : Multiset (Fin 1 ⊕ Fin 3)`, let `∂_s| φ` denote the base-point value of + the iterated formal derivative in the directions recorded by `s`. +- The value `∂_s| φ` is the coefficient at `s` multiplied by the corresponding + product of factorials. +- Formal partial differentiation advances the derivative tower by one spacetime + direction. +- More precisely, differentiating in direction `μ` sends the derivative value + indexed by `s` to the value indexed by `s + {μ}`. +- The formal partial derivatives on `JetRing` commute, matching the multiset + representation of ordinary derivatives introduced above. +- Addition in `JetRing` records addition of local Taylor data. +- Multiplication in `JetRing` models multiplication of local functions at the level + of their Taylor data. +- When a derivative indexed by `s` is applied to a product, the derivatives recorded + by `s` are distributed between the two factors. +- We write `p + q = s` when `p` records the derivatives assigned to the first factor + and `q` records those assigned to the second. +- Here addition means combining the two multisets of derivative directions, + including their repetitions. +- For each decomposition `p + q = s`, the coefficient of the first factor at `p` is + multiplied by the coefficient of the second factor at `q`. +- Summing these products over all decompositions `p + q = s` defines the standard + convolution product of formal power series. +- When expressed in terms of the base-point derivative values `∂_s|`, each + decomposition is weighted by the corresponding multinomial coefficient `C(s, p)`. +- Thus multiplication in `JetRing` reproduces the usual higher-order Leibniz rule. +- Complex conjugation acts coefficientwise on `JetRing`. +- The formal spacetime variables are fixed by complex conjugation. +- For `n : ℕ`, truncation at order `n` discards all coefficients of total derivative + order greater than `n`. +- Truncation is not a ring homomorphism into `JetRing`, because multiplying truncated + series can produce terms above order `n`. +- Nevertheless, a product through order `n` depends only on its factors through + order `n`. +- The infinite ring lets one define a single symmetry action for every derivative + order. +- Any individual finite polynomial lagrangian uses only finitely many components of + this infinite derivative tower. +- Vector-valued field jets and matrix-valued gauge-transformation jets are + constructed from this scalar coefficient ring. ## Jet component spaces From 82444d9ac73a1ee7f227594f55142e8041897ae5 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:38:21 +0100 Subject: [PATCH 175/254] feat: Start general Jet Component Space --- Physlib.lean | 1 + Physlib/Mathematics/ConjModule.lean | 138 +++++ .../StandardModel/Fermions/DownSinglet.lean | 139 +++++ .../Matter/JetComponentSpace/Basic.lean | 584 ++++++++++++++++++ Physlib/Relativity/JetRing/Basic.lean | 20 + 5 files changed, 882 insertions(+) create mode 100644 Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean diff --git a/Physlib.lean b/Physlib.lean index 79ae165ea..873e1470c 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -222,6 +222,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.Potential +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Mathematics/ConjModule.lean b/Physlib/Mathematics/ConjModule.lean index 0e1102274..4ecc317c0 100644 --- a/Physlib/Mathematics/ConjModule.lean +++ b/Physlib/Mathematics/ConjModule.lean @@ -10,6 +10,7 @@ public import Mathlib.Algebra.Star.Module public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.Tactic.Ring public import Mathlib.RepresentationTheory.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Basic /-! # The conjugate module @@ -36,6 +37,7 @@ conjugate-linear identity `conjEquiv : M ≃ₛₗ[starRingEnd k] ConjModule M`, @[expose] public section open Module +open scoped TensorProduct variable {k : Type*} [CommRing k] [StarRing k] variable {M : Type*} [AddCommGroup M] [Module k M] @@ -162,6 +164,142 @@ lemma _root_.Representation.conj_apply {G} [Group G] (ρ : Representation k G M) (m : ConjModule M) : ρ.conj g m = conjEquiv (k := k) (M := M) (ρ g ((conjEquiv (k := k) (M := M)).symm m)) := rfl +/-! + +## Functoriality, and conjugation of tensor products + +Conjugation is monoidal: `ConjModule M ⊗ ConjModule N ≃ ConjModule (M ⊗ N)`, the identity +on pure tensors. The map is honestly `k`-linear because the twist on each factor cancels +against the twist on the target. + +Everything below routes through `conjEquiv` rather than relying on definitional unfolding +of the `ConjModule` synonym. Writing `m ⊗ₜ n` for `m : ConjModule M` makes elaboration +pick the *twisted* module instances, landing in the wrong tensor product; converting +explicitly with `conjEquiv` fixes every instance by construction. + +-/ + +variable {N : Type*} [AddCommGroup N] [Module k N] + +/-- Functoriality of conjugation: a `k`-linear map induces a `k`-linear map of the +conjugate modules, given by the same underlying function. -/ +def map (f : M →ₗ[k] N) : ConjModule M →ₗ[k] ConjModule N where + toFun := f + map_add' := f.map_add + map_smul' c x := f.map_smul (star c) x + +@[simp] +lemma map_apply (f : M →ₗ[k] N) (x : ConjModule M) : map f x = f x := rfl + +/-- The conjugate module of a finite free module is finite: the conjugated basis +`Module.Basis.conj` is indexed by the same type. -/ +instance instFinite [Module.Free k M] [Module.Finite k M] : + Module.Finite k (ConjModule M) := + Module.Finite.of_basis (Module.Basis.conj (Module.Free.chooseBasis k M)) + +/-- The canonical `k`-linear map `ConjModule M ⊗ ConjModule N → ConjModule (M ⊗ N)`, +the identity on pure tensors. -/ +noncomputable def tensorHom : ConjModule M ⊗[k] ConjModule N →ₗ[k] ConjModule (M ⊗[k] N) := + TensorProduct.lift + { toFun := fun m => + { toFun := fun n => conjEquiv (k := k) (M := M ⊗[k] N) + ((conjEquiv (k := k) (M := M)).symm m ⊗ₜ[k] (conjEquiv (k := k) (M := N)).symm n) + map_add' := by + intro n₁ n₂ + rw [map_add, TensorProduct.tmul_add, map_add] + map_smul' := by + intro c n + rw [map_smulₛₗ, TensorProduct.tmul_smul, map_smulₛₗ] + simp } + map_add' := by + intro m₁ m₂ + ext n + simp only [LinearMap.coe_mk, AddHom.coe_mk, LinearMap.add_apply] + rw [map_add, TensorProduct.add_tmul, map_add] + map_smul' := by + intro c m + ext n + simp only [LinearMap.coe_mk, AddHom.coe_mk, LinearMap.smul_apply, RingHom.id_apply] + rw [map_smulₛₗ, ← TensorProduct.smul_tmul', map_smulₛₗ] + simp } + +@[simp] +lemma tensorHom_tmul (m : ConjModule M) (n : ConjModule N) : + tensorHom (k := k) (m ⊗ₜ[k] n) + = conjEquiv (k := k) (M := M ⊗[k] N) + ((conjEquiv (k := k) (M := M)).symm m ⊗ₜ[k] (conjEquiv (k := k) (M := N)).symm n) := + rfl + +/-- The inverse map `ConjModule (M ⊗ N) → ConjModule M ⊗ ConjModule N`, again the identity +on pure tensors. A `k`-linear map out of `ConjModule X` is the same data as a `k`-linear +map into `ConjModule` of the target, which is what `map` and `involution` package here. -/ +noncomputable def tensorInv : ConjModule (M ⊗[k] N) →ₗ[k] ConjModule M ⊗[k] ConjModule N := + (involution (k := k) (M := ConjModule M ⊗[k] ConjModule N)).toLinearMap ∘ₗ + map (TensorProduct.lift + { toFun := fun m => + { toFun := fun n => conjEquiv (k := k) (M := ConjModule M ⊗[k] ConjModule N) + (conjEquiv (k := k) (M := M) m ⊗ₜ[k] conjEquiv (k := k) (M := N) n) + map_add' := by + intro n₁ n₂ + rw [map_add, TensorProduct.tmul_add, map_add] + map_smul' := by + intro c n + rw [map_smulₛₗ, TensorProduct.tmul_smul, map_smulₛₗ] + simp } + map_add' := by + intro m₁ m₂ + ext n + simp only [LinearMap.coe_mk, AddHom.coe_mk, LinearMap.add_apply] + rw [map_add, TensorProduct.add_tmul, map_add] + map_smul' := by + intro c m + ext n + simp only [LinearMap.coe_mk, AddHom.coe_mk, LinearMap.smul_apply, RingHom.id_apply] + rw [map_smulₛₗ, ← TensorProduct.smul_tmul', map_smulₛₗ] + simp }) + +/-- **Conjugation is monoidal.** `ConjModule M ⊗ ConjModule N ≃ₗ[k] ConjModule (M ⊗ N)`, +the identity on pure tensors. Injectivity comes from `tensorInv` being a left inverse; +surjectivity from every element of `M ⊗ N` being a sum of pure tensors. -/ +noncomputable def tensorEquiv : + ConjModule M ⊗[k] ConjModule N ≃ₗ[k] ConjModule (M ⊗[k] N) := + LinearEquiv.ofBijective tensorHom + ⟨by + have h : ∀ w : ConjModule M ⊗[k] ConjModule N, tensorInv (tensorHom w) = w := by + intro w + induction w using TensorProduct.induction_on with + | zero => simp + | tmul m n => rfl + | add x y hx hy => rw [map_add, map_add, hx, hy] + exact Function.LeftInverse.injective h, + by + intro z + induction z using TensorProduct.induction_on with + | zero => exact ⟨0, map_zero _⟩ + | tmul m n => + exact ⟨conjEquiv (k := k) (M := M) m ⊗ₜ[k] conjEquiv (k := k) (M := N) n, rfl⟩ + | add x y hx hy => + obtain ⟨w₁, h₁⟩ := hx + obtain ⟨w₂, h₂⟩ := hy + refine ⟨w₁ + w₂, ?_⟩ + rw [map_add, h₁, h₂] + rfl⟩ + +@[simp] +lemma tensorEquiv_tmul (m : ConjModule M) (n : ConjModule N) : + tensorEquiv (k := k) (m ⊗ₜ[k] n) + = conjEquiv (k := k) (M := M ⊗[k] N) + ((conjEquiv (k := k) (M := M)).symm m ⊗ₜ[k] (conjEquiv (k := k) (M := N)).symm n) := + rfl + +@[simp] +lemma tensorEquiv_symm_conjEquiv_tmul (m : M) (n : N) : + (tensorEquiv (k := k) (M := M) (N := N)).symm + (conjEquiv (k := k) (M := M ⊗[k] N) (m ⊗ₜ[k] n)) + = conjEquiv (k := k) (M := M) m ⊗ₜ[k] conjEquiv (k := k) (M := N) n := by + rw [LinearEquiv.symm_apply_eq, tensorEquiv_tmul] + simp + end ConjModule end diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 3389967a3..d5a2dc806 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -6,7 +6,13 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps /-! # Down-type singlets @@ -298,6 +304,139 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) +/-! + +## The action of the Gauge algebra + +-/ + + +/-! + +## The representation of the jet gauge group +-/ + +/-- Absorbs the jet ring into the colour index: a jet of a down-type singlet is the +same thing as a right-handed Weyl spinor tensored with a `JetRing`-valued colour +vector, + + `JetRing ⊗[ℂ] DownSinglet ≃ RightHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 3)`. + +-/ +noncomputable def jetValLinEquiv : + JetRing ⊗[ℂ] DownSinglet ≃ₗ[ℂ] + Fermion.RightHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 3) := + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) valLinEquiv).trans <| + (TensorProduct.leftComm ℂ JetRing Fermion.RightHandedWeyl + (EuclideanSpace ℂ (Fin 3))).trans <| + TensorProduct.congr (LinearEquiv.refl ℂ Fermion.RightHandedWeyl) <| + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) + (WithLp.linearEquiv 2 ℂ (Fin 3 → ℂ))).trans <| + ((TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 3)).trans + (WithLp.linearEquiv 2 JetRing (Fin 3 → JetRing)).symm).restrictScalars ℂ + +/-- The `(3, 1)_{-2}` action of the jet gauge group on the jet space of the down-type +singlet. Through `jetValLinEquiv` the colour matrix of the gauge jet, carrying the +`-2` hypercharge phase `(star u) ^ 2`, acts `JetRing`-linearly on the colour factor by +matrix-vector multiplication, while the Weyl factor is untouched. + +Both monoid laws come from bundled algebra maps — `Matrix.toLpLinAlgEquiv` and +`Module.End.lTensorAlgHom` are morphisms of algebras — so only the multiplicativity of +the colour-times-hypercharge matrix itself is checked. Note `Matrix.toLpLinAlgEquiv 2` +is the same map as the `Matrix.toEuclideanLin` used by `repGaugeGroupI`, which is an +abbreviation for `Matrix.toLpLin 2 2`, taken at the `CommRing` generality that +`JetRing` needs. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] DownSinglet) where + toFun U := + jetValLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 + (((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing))).restrictScalars ℂ) ∘ₗ + jetValLinEquiv.toLinearMap + map_one' := by + have hres : (1 : Module.End JetRing (EuclideanSpace JetRing (Fin 3))).restrictScalars ℂ + = 1 := rfl + rw [show (((star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 2) • + (((1 : JetGaugeGroupI).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) = 1 from by simp, + map_one, hres, map_one] + ext d x + simp [-valLinEquiv_apply] + map_mul' U₁ U₂ := by + have hres : ∀ f g : Module.End JetRing (EuclideanSpace JetRing (Fin 3)), + (f * g).restrictScalars ℂ = f.restrictScalars ℂ * g.restrictScalars ℂ := + fun _ _ => rfl + have hM : (((star (((U₁ * U₂).2.2 : unitary JetRing) : JetRing)) ^ 2) • + (((U₁ * U₂).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) = + (((star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U₁.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) * + (((star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U₂.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) := by + rw [show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, + show (((U₁ * U₂).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) = + ((U₁.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) * + ((U₂.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + from rfl, + star_mul', mul_pow, Matrix.smul_mul, Matrix.mul_smul, smul_smul] + rw [hM, map_mul, hres, map_mul] + ext d x + simp + +/-- On jets of constant gauge transformations the jet action reduces to the global +gauge action on the fibre: the `(3, 1)_{-2}` action on the down-singlet factor, and the +trivial action on the jet ring. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + TensorProduct.map LinearMap.id (repGaugeGroupI g) := by + ext d x + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => simp [show ({ val := 0 } : DownSinglet) = 0 from rfl] + | tmul psi c => + apply jetValLinEquiv.injective + simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + have hu : star (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) + = MvPowerSeries.C ((starRingEnd ℂ) (g.toU1.1 : ℂ)) := by + rw [show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) + = MvPowerSeries.C ((g.toU1.1 : ℂ)) from rfl, JetRing.star_C] + rfl + have hM : ∀ i j, (((JetGaugeGroupI.ofConstant g).1 : + specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) i j + = MvPowerSeries.C (g.toSU3.1 i j) := fun _ _ => rfl + have halg : ∀ A : Matrix (Fin 3) (Fin 3) JetRing, + (Matrix.toLpLinAlgEquiv 2 A : + Module.End JetRing (EuclideanSpace JetRing (Fin 3))) + = Matrix.toLpLin 2 2 A := fun _ => rfl + have hvec : ∀ i : Fin 3, + (∑ x, MvPowerSeries.C ((g.toSU3.1) i x) * (MvPowerSeries.C (c.ofLp x) * d)) + = MvPowerSeries.C (∑ x, (g.toSU3.1) i x * c.ofLp x) * d := by + intro i + rw [map_sum, Finset.sum_mul] + exact Finset.sum_congr rfl fun x _ => by rw [← mul_assoc, ← map_mul] + rw [TensorProduct.liftAux_tmul, ← TensorProduct.tmul_smul] + simp only [LinearMap.compl₂_apply, TensorProduct.mk_apply, LinearMap.smul_apply, + LinearMap.restrictScalars_apply, halg, Matrix.toLpLin_toLp] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + simp only [WithLp.ofLp_smul, Pi.smul_apply, Matrix.toLin'_apply, + Matrix.mulVec_apply_eq_sum, hM, Algebra.smul_def, MvPowerSeries.algebraMap_apply, + hu, map_pow, Algebra.algebraMap_self_apply] + rw [hvec i] + | add a b ha hb => + simp only [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + map_add, ha, hb] + + end DownSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean new file mode 100644 index 000000000..501aba4a1 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean @@ -0,0 +1,584 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Mathlib.LinearAlgebra.Contraction +/-! +# The jet component space of a matter field + +## i. Overview + +For a matter field valued in a complex vector space `V`, the *jet component space* is the +span of the derivative symbols `∂_s ψ_α` and their conjugates `∂_s ψ̄_α`: the local +coordinate functions on the space of jets of the field. This file defines that space and +constructs the action of the jet gauge group on it, induced from an action on the jets +`JetRing ⊗[ℂ] V` of the field itself. + +The construction needs two hypotheses on the jet action `rep`: + +* `hlin` — that `rep` is *fibrewise*, `rep U (χ • z) = χ • rep U z`, the statement that a + gauge transformation acts on the values of the field over the identity on spacetime. + This is what makes the induced action local (a finite Leibniz convolution) and what + makes `rep` determined by its restriction to constant jets. +* finite dimensionality of `V`, which makes that restriction a *matrix of power series*, + an element of `JetRing ⊗ End V`. + +## ii. Key results + +- `JetComponentSpace` : the space of component functions. +- `jetCoeff` : the coefficient of a fibrewise action, in `JetRing ⊗ End V`. +- `coeff_mul_of_smul_comm` : the coefficient is multiplicative. +- `symbolAction`, `symbolAction_mul` : its action on symbols, an anti-homomorphism. +- `repDual` : the induced action on the unconjugated symbols. +- `repConj`, `repConj_smul_comm` : the action on the jets of the conjugate field. +- `JetComponentSpace.repJetGaugeGroupI` : the action on the full component space. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups TensorProduct + +variable {V : Type _} [AddCommGroup V] [Module ℂ V] + +variable {V : Type _} [AddCommGroup V] [Module ℂ V] + + +/-- The space of component functions of a `V`-valued matter field: the span of the +symbols `∂_s ψ_α` and their conjugates `∂_s ψ̄_α`. The first factor holds the +unconjugated symbols, the second the conjugate ones; in each, `DerivAlgebraComplex` +carries the derivative label `s` and the dual factor the target component `α`. -/ +abbrev JetComponentSpace (V : Type _) [AddCommGroup V] [Module ℂ V] := + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) × + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) + +/-- **A fibrewise action is determined by its values on constant jets.** If the gauge +action commutes with multiplication by scalar jets — the statement that it acts on the +values of the field, over the identity on spacetime — then its value on a general jet +`f ⊗ₜ v` is the constant-jet value `rep U (1 ⊗ₜ v)` scaled by `f`. -/ +lemma rep_tmul_of_smul_comm + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (f : JetRing) (v : V) : + rep U (f ⊗ₜ[ℂ] v) = f • rep U (jetOfConstant v) := by + rw [← hlin U f (jetOfConstant v), jetOfConstant_apply, + show f • ((1 : JetRing) ⊗ₜ[ℂ] v) = f ⊗ₜ[ℂ] v from by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one]] + +/-- **The canonical evaluation is a right module map.** Writing `ev` for the canonical +`JetRing ⊗ End V → (V →ₗ JetRing ⊗ V)`, `g ⊗ T ↦ (v ↦ g ⊗ₜ T v)`, multiplying on the +right by `b ⊗ T` applies `T` to the argument and scales the value by `b`. -/ +lemma lift_mul_tmul (x : JetRing ⊗[ℂ] Module.End ℂ V) + (b : JetRing) (T : Module.End ℂ V) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (x * (b ⊗ₜ[ℂ] T)) v + = b • TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) x (T v) := by + induction x using TensorProduct.induction_on with + | zero => + have h0 : (0 : JetRing ⊗[ℂ] Module.End ℂ V) * (b ⊗ₜ[ℂ] T) = 0 := by exact zero_mul (b ⊗ₜ[ℂ] T) + rw [h0] + simp + | tmul a S => + rw [Algebra.TensorProduct.tmul_mul_tmul] + show (a * b) ⊗ₜ[ℂ] (S * T) v = b • (a ⊗ₜ[ℂ] S (T v)) + rw [Module.End.mul_apply, TensorProduct.smul_tmul', smul_eq_mul, mul_comm b a] + | add p q hp hq => + have hd : (p + q) * (b ⊗ₜ[ℂ] T) = p * (b ⊗ₜ[ℂ] T) + q * (b ⊗ₜ[ℂ] T) := by + exact Distrib.right_distrib p q (b ⊗ₜ[ℂ] T) + rw [hd, map_add, LinearMap.add_apply, hp, hq, map_add, LinearMap.add_apply, + smul_add] + +/-- **A fibrewise action is the `JetRing`-linear extension of its coefficient.** If the +element `x` of `JetRing ⊗ End V` records `rep U` on constant jets, then `rep U` agrees +with left multiplication by `x` on every coefficient `y`. -/ +lemma rep_lift_of_smul_comm + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (x : JetRing ⊗[ℂ] Module.End ℂ V) + (hx : ∀ v : V, TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) x v = rep U (jetOfConstant v)) + (y : JetRing ⊗[ℂ] Module.End ℂ V) (v : V) : + rep U (TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) y v) + = TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (x * y) v := by + induction y using TensorProduct.induction_on with + | zero => + have h0 : x * (0 : JetRing ⊗[ℂ] Module.End ℂ V) = 0 := by exact mul_zero x + rw [h0] + simp + | tmul b T => + rw [lift_mul_tmul x b T v, + show TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (b ⊗ₜ[ℂ] T) v = b ⊗ₜ[ℂ] T v from rfl, + rep_tmul_of_smul_comm hlin U b (T v), hx (T v)] + | add p q hp hq => + have hd : x * (p + q) = x * p + x * q := by exact Distrib.left_distrib x p q + rw [hd, map_add, LinearMap.add_apply, map_add, map_add, LinearMap.add_apply, + hp, hq] + +/-- **The coefficient of a fibrewise action is multiplicative.** Recording `rep` on +constant jets as a family `c` in `JetRing ⊗ End V`, group multiplication becomes +multiplication in that algebra. This is the identity that makes the induced action on +the symbols a representation, and it needs no basis. -/ +lemma coeff_mul_of_smul_comm + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (c : JetGaugeGroupI → JetRing ⊗[ℂ] Module.End ℂ V) + (hc : ∀ (U : JetGaugeGroupI) (v : V), + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (c U) v = rep U (jetOfConstant v)) + (U W : JetGaugeGroupI) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (c U * c W) v + = rep (U * W) (jetOfConstant v) := by + rw [← rep_lift_of_smul_comm hlin U (c U) (hc U) (c W) v, hc W v, map_mul, + Module.End.mul_apply] + +/-- **The symbol action of a coefficient is an anti-homomorphism.** Let `Θ` send a +coefficient `g ⊗ T` in `JetRing ⊗ End V` to the endomorphism `jetRingAction g ⊗ Tᵀ` of +the symbol space `DerivAlgebraComplex ⊗ Dual V`. Then `Θ` reverses products: the jet-ring +factor is multiplicative (`jetRingAction_mul`, and `JetRing` is commutative) while the +target factor is contravariant (`Module.Dual.transpose_comp`). Composed with `U ↦ U⁻¹` +this is exactly what makes the induced action a representation, with no induction over +the antidiagonal. -/ +lemma symbolAction_mul + (Θ : (JetRing ⊗[ℂ] Module.End ℂ V) →ₗ[ℂ] + Module.End ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V)) + (hΘ : ∀ (g : JetRing) (T : Module.End ℂ V), + Θ (g ⊗ₜ[ℂ] T) = TensorProduct.map (DerivAlgebraComplex.jetRingAction g) + (Module.Dual.transpose T)) + (x y : JetRing ⊗[ℂ] Module.End ℂ V) : + Θ (x * y) = Θ y ∘ₗ Θ x := by + induction x using TensorProduct.induction_on with + | zero => + have h0 : (0 : JetRing ⊗[ℂ] Module.End ℂ V) * y = 0 := by exact zero_mul y + rw [h0, map_zero] + simp + | tmul a S => + induction y using TensorProduct.induction_on with + | zero => + have h0 : (a ⊗ₜ[ℂ] S) * (0 : JetRing ⊗[ℂ] Module.End ℂ V) = 0 := by + exact mul_zero (a ⊗ₜ[ℂ] S) + rw [h0, map_zero] + simp + | tmul b T => + rw [Algebra.TensorProduct.tmul_mul_tmul, hΘ, hΘ, hΘ, + ← TensorProduct.map_comp, ← DerivAlgebraComplex.jetRingAction_mul, + ← Module.Dual.transpose_comp, Module.End.mul_eq_comp, mul_comm a b] + | add p q hp hq => + have hd : (a ⊗ₜ[ℂ] S) * (p + q) = (a ⊗ₜ[ℂ] S) * p + (a ⊗ₜ[ℂ] S) * q := by + exact Distrib.left_distrib (a ⊗ₜ[ℂ] S) p q + rw [hd, map_add, map_add, LinearMap.add_comp, hp, hq] + | add p q hp hq => + have hd : (p + q) * y = p * y + q * y := by exact Distrib.right_distrib p q y + rw [hd, map_add, map_add, LinearMap.comp_add, hp, hq] + +/-- **The coefficient of a linear map, canonically.** For finite-dimensional `V` the +canonical `JetRing ⊗ End V → (V →ₗ JetRing ⊗ V)` is inverted by reassociating the +contraction `Dual V ⊗ (JetRing ⊗ V) ≃ JetRing ⊗ (Dual V ⊗ V) ≃ JetRing ⊗ End V`. This is +the finite-rank input, obtained from `dualTensorHomEquiv` rather than from a basis. -/ +lemma lift_congr_leftComm [Module.Free ℂ V] [Module.Finite ℂ V] + (G : Module.Dual ℂ V ⊗[ℂ] (JetRing ⊗[ℂ] V)) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) + ((TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V)) + (TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V G)) v + = dualTensorHom ℂ V (JetRing ⊗[ℂ] V) G v := by + induction G using TensorProduct.induction_on with + | zero => simp + | tmul phi z => + induction z using TensorProduct.induction_on with + | zero => simp + | tmul g w => + rw [TensorProduct.leftComm_tmul, TensorProduct.congr_tmul, + LinearEquiv.refl_apply] + show g ⊗ₜ[ℂ] (dualTensorHomEquiv ℂ V V (phi ⊗ₜ[ℂ] w)) v = _ + rw [show dualTensorHomEquiv ℂ V V (phi ⊗ₜ[ℂ] w) + = dualTensorHom ℂ V V (phi ⊗ₜ[ℂ] w) from rfl, + dualTensorHom_apply, dualTensorHom_apply, TensorProduct.tmul_smul] + | add z₁ z₂ h₁ h₂ => + rw [TensorProduct.tmul_add, map_add, map_add, map_add, LinearMap.add_apply, + map_add, LinearMap.add_apply, h₁, h₂] + | add G₁ G₂ h₁ h₂ => + rw [map_add, map_add, map_add, LinearMap.add_apply, map_add, + LinearMap.add_apply, h₁, h₂] + +/-- **The conjugate jet action.** Given a gauge action on the jets of a `V`-valued field, +this is the induced action on the jets of the *conjugate* field. + +It is `Representation.conj rep` — the same underlying maps, read on `ConjModule` — carried +across the identification + + `ConjModule (JetRing ⊗[ℂ] V) ≃ₗ[ℂ] JetRing ⊗[ℂ] ConjModule V` + +which is `ConjModule.tensorEquiv` (conjugation is monoidal) followed by +`JetRing.starConjEquiv` on the jet-ring factor (the real structure of the jet ring). On +pure tensors the composite is `f ⊗ₜ v ↦ star f ⊗ₜ v`, so `repConj` carries the conjugate +gauge matrix — the physicists' `ψ̄ ↦ ψ̄ U†`. + +Being a representation is free: `LinearEquiv.conjRingEquiv` is a ring equivalence of +endomorphism rings, hence multiplicative. -/ +noncomputable def repConj (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] ConjModule V) where + toFun U := LinearEquiv.conjRingEquiv + ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (rep.conj U) + map_one' := by rw [map_one, map_one] + map_mul' U W := by rw [map_mul, map_mul] + + +/-- On pure tensors the conjugate jet action conjugates the jet factor: it is `rep` +evaluated at `star f ⊗ₜ v`, read back through the same identification. -/ +lemma repConj_apply_tmul (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (U : JetGaugeGroupI) (f : JetRing) (v : V) : + repConj rep U (f ⊗ₜ[ℂ] conjEquiv (k := ℂ) (M := V) v) + = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U (star f ⊗ₜ[ℂ] v))) := rfl + +/-- **The identification conjugates the jet-ring action.** Carrying a `V`-valued jet over +to the conjugate side turns multiplication by `star χ` into multiplication by `χ`: the +`star` on the jet-ring factor is exactly what absorbs the conjugation. -/ +lemma tensorEquiv_congr_conjEquiv_smul (χ : JetRing) (y : JetRing ⊗[ℂ] V) : + ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (star χ • y)) + = χ • ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) y) := by + induction y using TensorProduct.induction_on with + | zero => simp + | tmul g w => + rw [TensorProduct.smul_tmul', smul_eq_mul] + simp only [LinearEquiv.trans_apply, ConjModule.tensorEquiv_symm_conjEquiv_tmul, + TensorProduct.congr_tmul, LinearEquiv.refl_apply, JetRing.starConjEquiv_apply, + LinearEquiv.symm_apply_apply, TensorProduct.smul_tmul', smul_eq_mul] + rw [star_mul', star_star, mul_comm] + | add a b ha hb => + rw [smul_add, map_add, map_add, ha, hb, map_add, map_add, smul_add] + +/-- **The conjugate jet action is fibrewise-linear whenever the original is.** This is +what lets the coefficient machinery of `coeff_mul_of_smul_comm` be instantiated at +`ConjModule V`, giving the conjugate half of the symbol action. -/ +lemma repConj_smul_comm + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] ConjModule V) : + repConj rep U (χ • z) = χ • repConj rep U z := by + have key : ∀ w : JetRing ⊗[ℂ] V, + repConj rep U (((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)) + = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U w)) := by + intro w + show ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) ((rep.conj U) ((((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V))))).symm + (((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)))) = _ + rw [LinearEquiv.symm_apply_apply, Representation.conj_apply, + LinearEquiv.symm_apply_apply] + obtain ⟨y, rfl⟩ : ∃ y : JetRing ⊗[ℂ] V, + z = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) y) := + ⟨(conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V)).symm ((((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V))))).symm z), by simp⟩ + rw [← tensorEquiv_congr_conjEquiv_smul, key, key, hlin, + tensorEquiv_congr_conjEquiv_smul] + +/-- **The coefficient is determined by its action on constants.** For finite-dimensional +`V` the canonical evaluation `JetRing ⊗ End V → (V →ₗ JetRing ⊗ V)` is injective. -/ +lemma lift_injective [Module.Free ℂ V] [Module.Finite ℂ V] + {x y : JetRing ⊗[ℂ] Module.End ℂ V} + (h : ∀ v : V, TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) x v = TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) y v) : x = y := by + obtain ⟨G, rfl⟩ := ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V))).surjective x + obtain ⟨G', rfl⟩ := ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V))).surjective y + refine congrArg _ ((dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).injective + (LinearMap.ext fun v => ?_)) + rw [show (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)) G + = dualTensorHom ℂ V (JetRing ⊗[ℂ] V) G from rfl, + show (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)) G' + = dualTensorHom ℂ V (JetRing ⊗[ℂ] V) G' from rfl, + ← lift_congr_leftComm, ← lift_congr_leftComm] + exact h v + +/-- **The coefficient of a fibrewise gauge action.** For finite-dimensional `V`, the +restriction of `rep U` to constant jets is an element of `JetRing ⊗ End V` — a matrix of +power series, obtained canonically from `dualTensorHomEquiv` rather than from a basis. -/ +noncomputable def jetCoeff [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) : + JetRing ⊗[ℂ] Module.End ℂ V := + ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V))) + ((dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).symm ((rep U).comp jetOfConstant)) + +/-- The coefficient reproduces `rep U` on constant jets. -/ +lemma jetCoeff_spec [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (jetCoeff rep U) v = rep U (jetOfConstant v) := by + rw [jetCoeff, LinearEquiv.trans_apply, lift_congr_leftComm, + show dualTensorHom ℂ V (JetRing ⊗[ℂ] V) + ((dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).symm ((rep U).comp jetOfConstant)) + = (rep U).comp jetOfConstant from + (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).apply_symm_apply _] + rfl + +/-- **The action of a coefficient on the symbols.** A coefficient `g ⊗ T` acts by +`jetRingAction g` on the derivative label — the Leibniz convolution redistributing +derivatives between the gauge transformation and the field — and by the transpose `Tᵀ` on +the target index. -/ +noncomputable def symbolAction : + (JetRing ⊗[ℂ] Module.End ℂ V) →ₗ[ℂ] + Module.End ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) := + TensorProduct.lift + { toFun := fun g => + { toFun := fun T => TensorProduct.map (DerivAlgebraComplex.jetRingAction g) + (Module.Dual.transpose T) + map_add' := fun T₁ T₂ => by rw [map_add, TensorProduct.map_add_right] + map_smul' := fun c T => by + rw [map_smul, TensorProduct.map_smul_right, RingHom.id_apply] } + map_add' := fun g₁ g₂ => by + refine LinearMap.ext fun T => ?_ + show TensorProduct.map (DerivAlgebraComplex.jetRingAction (g₁ + g₂)) _ = _ + rw [DerivAlgebraComplex.jetRingAction_add, TensorProduct.map_add_left] + rfl + map_smul' := fun c g => by + refine LinearMap.ext fun T => ?_ + show TensorProduct.map (DerivAlgebraComplex.jetRingAction (c • g)) _ = _ + rw [show DerivAlgebraComplex.jetRingAction (c • g) + = c • DerivAlgebraComplex.jetRingAction g from by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + DerivAlgebraComplex.jetRingAction_mul, DerivAlgebraComplex.jetRingAction_C, + LinearMap.smul_comp, LinearMap.id_comp, Algebra.algebraMap_self_apply], + TensorProduct.map_smul_left] + rfl } + +@[simp] +lemma symbolAction_tmul (g : JetRing) (T : Module.End ℂ V) : + symbolAction (g ⊗ₜ[ℂ] T) + = TensorProduct.map (DerivAlgebraComplex.jetRingAction g) (Module.Dual.transpose T) := + rfl + +/-- **The gauge action on the symbols.** Given a fibrewise gauge action on the jets of a +`V`-valued field, this is the induced (contragredient) action on the derivative symbols +`∂_s ψ_α`, which span `DerivAlgebraComplex ⊗ Module.Dual ℂ V`. + +Multiplicativity is bookkeeping: `coeff_mul_of_smul_comm` makes the coefficient +multiplicative, `symbolAction_mul` makes its action an anti-homomorphism, and the inverse +flips that back. -/ +noncomputable def repDual [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ JetGaugeGroupI (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) where + toFun U := symbolAction (jetCoeff rep U⁻¹) + map_one' := by + have h1 : jetCoeff rep (1 : JetGaugeGroupI)⁻¹ = 1 := by + refine lift_injective fun v => ?_ + rw [jetCoeff_spec rep] + show rep (1 : JetGaugeGroupI)⁻¹ ((1 : JetRing) ⊗ₜ[ℂ] v) = (1 : JetRing) ⊗ₜ[ℂ] v + rw [inv_one, map_one] + rfl + rw [h1, Algebra.TensorProduct.one_def, symbolAction_tmul, + DerivAlgebraComplex.jetRingAction_one, + show Module.Dual.transpose (1 : Module.End ℂ V) = LinearMap.id from rfl, + TensorProduct.map_id] + rfl + map_mul' U W := by + have hmul : jetCoeff rep (U * W)⁻¹ = jetCoeff rep W⁻¹ * jetCoeff rep U⁻¹ := by + refine lift_injective fun v => ?_ + rw [jetCoeff_spec, + coeff_mul_of_smul_comm hlin (fun A => jetCoeff rep A) (jetCoeff_spec rep) W⁻¹ U⁻¹ v, + _root_.mul_inv_rev] + rw [hmul, symbolAction_mul symbolAction (fun g T => rfl)] + rfl + + +/-- **The gauge action on the jet component space.** Given a fibrewise gauge action on the +jets of a `V`-valued field, this is the induced action on the full space of component +functions — the symbols `∂_s ψ_α` together with their conjugates `∂_s ψ̄_α`. + +The unconjugated half is `repDual rep`, the contragredient action on the symbols. The +conjugate half is the *same* construction applied to `repConj rep`, the action on the jets +of the conjugate field; `repConj_smul_comm` supplies the fibrewise-linearity it needs. The +conjugate half therefore carries `star` of the gauge matrix, which is the physicists' +`ψ̄ ↦ ψ̄ U†`. -/ +noncomputable def JetComponentSpace.repJetGaugeGroupI [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ JetGaugeGroupI (JetComponentSpace V) := + (repDual rep hlin).prod (repDual (repConj rep) (repConj_smul_comm hlin)) + +@[simp] +lemma JetComponentSpace.repJetGaugeGroupI_fst [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (x : JetComponentSpace V) : + (JetComponentSpace.repJetGaugeGroupI rep hlin U x).1 = repDual rep hlin U x.1 := rfl + +@[simp] +lemma JetComponentSpace.repJetGaugeGroupI_snd [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (x : JetComponentSpace V) : + (JetComponentSpace.repJetGaugeGroupI rep hlin U x).2 + = repDual (repConj rep) (repConj_smul_comm hlin) U x.2 := rfl + +/-! + +## The representation of the Lorentz group + +-/ + + +/-! + +## The Lorentz action on the component space + +-/ + +/-- **The Lorentz action on the jet component space.** Under a Lorentz transformation a +matter field transforms as `ψ(x) ↦ ρ(Λ) ψ(Λ⁻¹ x)`, so a derivative symbol `∂_s ψ_α` is +acted on in *both* of its labels: the derivative multiset `s` by the Lorentz action on +covectors, extended to `DerivAlgebraComplex`, and the target index `α` by the +contragredient of `ρ`. + +Unlike the gauge action, this needs no fibrewise-linearity or finite-dimensionality +hypothesis: the two labels transform independently, so the action is simply a tensor +product of representations. The conjugate half is the same with `ρ` replaced by its +conjugate, the symbols `∂_s ψ̄_α` transforming by `star` of the spinor matrix. -/ +noncomputable def JetComponentSpace.repLorentzGroup + (repV : Representation ℂ SL(2,ℂ) V) : + Representation ℂ SL(2,ℂ) (JetComponentSpace V) := + (DerivAlgebraComplex.repLorentzGroup.tprod repV.dual).prod + (DerivAlgebraComplex.repLorentzGroup.tprod repV.conj.dual) + +@[simp] +lemma JetComponentSpace.repLorentzGroup_fst (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (x : JetComponentSpace V) : + (JetComponentSpace.repLorentzGroup repV Λ x).1 + = (DerivAlgebraComplex.repLorentzGroup.tprod repV.dual) Λ x.1 := rfl + +@[simp] +lemma JetComponentSpace.repLorentzGroup_snd (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (x : JetComponentSpace V) : + (JetComponentSpace.repLorentzGroup repV Λ x).2 + = (DerivAlgebraComplex.repLorentzGroup.tprod repV.conj.dual) Λ x.2 := rfl + +/-- On a pure symbol the Lorentz action is diagonal in the two labels: the derivative +label transforms in `DerivAlgebraComplex`, the target index contragrediently. -/ +@[simp] +lemma JetComponentSpace.repLorentzGroup_fst_tmul (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (a : DerivAlgebraComplex) (φ : Module.Dual ℂ V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.repLorentzGroup repV Λ (a ⊗ₜ[ℂ] φ, y)).1 + = DerivAlgebraComplex.repLorentzGroup Λ a ⊗ₜ[ℂ] (φ ∘ₗ repV Λ⁻¹) := rfl + +/-! + +## The jet derivative + +-/ + +/-- the derivative of components in the jet component space, + in the direction `μ`: the shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the derivative label, + and likewise on the conjugate components. + + This is right multiplication by the degree-one element `∂_μ` on the + `DerivAlgebraComplex` factor, leaving the target index untouched. It uses a basis of + the Lorentz covectors — that is what the index `μ` is — but no basis of `V`. -/ +noncomputable def JetComponentSpace.jetDeriv (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace V →ₗ[ℂ] JetComponentSpace V := + LinearMap.prodMap + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id) + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id) + +@[simp] +lemma JetComponentSpace.jetDeriv_fst_tmul (μ : Fin 1 ⊕ Fin 3) + (a : DerivAlgebraComplex) (φ : Module.Dual ℂ V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.jetDeriv μ (a ⊗ₜ[ℂ] φ, y)).1 + = (a * DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℂ] φ := rfl + +@[simp] +lemma JetComponentSpace.jetDeriv_snd_tmul (μ : Fin 1 ⊕ Fin 3) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (a : DerivAlgebraComplex) (φ : Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.jetDeriv μ (x, a ⊗ₜ[ℂ] φ)).2 + = (a * DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℂ] φ := rfl + +/-- **Total derivatives commute.** Mixed partials agree because the derivative labels + live in a *symmetric* algebra; no basis of `V` is involved. -/ +lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (JetComponentSpace.jetDeriv (V := V) μ).comp (JetComponentSpace.jetDeriv ν) + = (JetComponentSpace.jetDeriv (V := V) ν).comp (JetComponentSpace.jetDeriv μ) := by + have hmul : ∀ b c : DerivAlgebraComplex, + (LinearMap.mulRight ℂ b).comp (LinearMap.mulRight ℂ c) + = LinearMap.mulRight ℂ (c * b) := + fun b c => LinearMap.ext fun x => by + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.mulRight_apply, mul_assoc] + rw [JetComponentSpace.jetDeriv, JetComponentSpace.jetDeriv, LinearMap.prodMap_comp, + LinearMap.prodMap_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp, + ← TensorProduct.map_comp, ← TensorProduct.map_comp, hmul, hmul, mul_comm] + +/-- The element being multiplied in is the degree-one derivative symbol `∂_μ`, the image + of the dual basis covector under `SymmetricAlgebra.ι`. -/ +lemma JetComponentSpace.jetDeriv_eq_ι (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace.jetDeriv (V := V) μ + = LinearMap.prodMap + (TensorProduct.map + (LinearMap.mulRight ℂ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ))) LinearMap.id) + (TensorProduct.map + (LinearMap.mulRight ℂ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ))) LinearMap.id) := by + rw [JetComponentSpace.jetDeriv, DerivAlgebraComplex.basis_singleton] + +/-! + +## C. The fermionic algebra + +-/ + +abbrev FermionicAlgebra (V : Type _) [AddCommGroup V] [Module ℂ V] : Type := + ExteriorAlgebra ℂ (JetComponentSpace V) + +namespace FermionicAlgebra + +@[simp] +lemma adjoin_ι_eq_top : + Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace V))) = ⊤ := + CliffordAlgebra.adjoin_range_ι + +/-! + +## The jet derivative + +-/ +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Relativity/JetRing/Basic.lean b/Physlib/Relativity/JetRing/Basic.lean index c6ddfe870..d1317bbc1 100644 --- a/Physlib/Relativity/JetRing/Basic.lean +++ b/Physlib/Relativity/JetRing/Basic.lean @@ -13,6 +13,7 @@ public import Mathlib.RingTheory.MvPowerSeries.Basic public import Mathlib.Data.Finsupp.Multiset public import Mathlib.Data.Finsupp.Weight public import Physlib.Mathematics.MvPowerSeriesDerivative +public import Physlib.Mathematics.ConjModule /-! # The jet ring @@ -90,6 +91,25 @@ lemma star_C (a : ℂ) : rw [coeff_star, coeff_C, coeff_C] split_ifs <;> simp +/-- **The real structure of the jet ring.** Coefficientwise conjugation is a `ℂ`-linear +equivalence from the conjugate module of the jet ring back to the jet ring itself. It is +honestly `ℂ`-linear, not merely semilinear, because the conjugate-linearity of `star` +cancels against the twisted scalar action of `ConjModule`. + +This is what identifies the jets of a conjugate field with the conjugates of the jets: +`ConjModule (JetRing ⊗[ℂ] V)` and `JetRing ⊗[ℂ] ConjModule V` differ exactly by this +equivalence on the jet-ring factor. -/ +noncomputable def starConjEquiv : ConjModule JetRing ≃ₗ[ℂ] JetRing := + (conjEquiv (k := ℂ) (M := JetRing)).symm.trans (starLinearEquiv ℂ) + +@[simp] +lemma starConjEquiv_apply (f : ConjModule JetRing) : + starConjEquiv f = star ((conjEquiv (k := ℂ) (M := JetRing)).symm f) := rfl + +@[simp] +lemma starConjEquiv_symm_apply (f : JetRing) : + starConjEquiv.symm f = conjEquiv (k := ℂ) (M := JetRing) (star f) := rfl + /-- The first-order Leibniz rule: the degree-one Taylor coefficient, in the direction `μ`, of a product of jets. This is the coefficient-level statement that the first jet of a product is given by the product rule. -/ From 83f8aaddb1c50c2ca9a46316df8773682a2437cf Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 20 Aug 2026 15:11:38 +0100 Subject: [PATCH 176/254] feat: Fermionic Algebra --- Physlib.lean | 4 + .../StandardModel/JetAlgebra/Basic.lean | 0 .../Matter/FermionicAlgebra/Basic.lean | 134 +++++++ .../Matter/FermionicAlgebra/GaugeAction.lean | 241 +++++++++++ .../Matter/FermionicAlgebra/JetDeriv.lean | 374 ++++++++++++++++++ .../FermionicAlgebra/LorentzAction.lean | 185 +++++++++ .../Matter/JetComponentSpace/Basic.lean | 129 +++++- 7 files changed, 1050 insertions(+), 17 deletions(-) create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean diff --git a/Physlib.lean b/Physlib.lean index 873e1470c..34ca2c94c 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -222,6 +222,10 @@ public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.Potential +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Basic +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.LorentzAction public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean new file mode 100644 index 000000000..e69de29bb diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean new file mode 100644 index 000000000..e74c8a2d5 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean @@ -0,0 +1,134 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +/-! +# The fermionic algebra of a matter field + +## i. Overview + +For a matter field valued in a complex vector space `V`, the *fermionic algebra* is the +exterior algebra on the jet component space `JetComponentSpace V`. It is the algebra in +which the `V`-part of a Lagrangian lives: the generators are the component functions +`∂_s ψ_α` and their conjugates `∂_s ψ̄_α`, and the exterior product implements the +anticommutativity of fermionic fields. + +Everything the component space carries lifts to the fermionic algebra by functoriality of +the exterior algebra: the Lorentz action (`FermionicAlgebra.repLorentzGroup`), the jet +gauge action (`FermionicAlgebra.repJetGaugeGroupI`), and the formal total derivative +(`FermionicAlgebra.jetDeriv`), which extends as an even derivation rather than by +functoriality. Those live in the sibling files `LorentzAction`, `GaugeAction` and +`JetDeriv`. + +## ii. Key results + +- `FermionicAlgebra` : the exterior algebra on the jet component space. +- `FermionicAlgebra.adjoin_ι_eq_top` : the algebra is generated by the component functions. +- `FermionicAlgebra.ofField`, `FermionicAlgebra.ofConjField` : the field and its conjugate. + +## iii. Table of contents + +- A. The fermionic algebra + - A.1. The generators of the fermionic algebra + - A.2. The field and its conjugate + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The fermionic algebra + +-/ + +/-- The fermionic algebra of a `V`-valued matter field: the exterior algebra on the space + of component functions `∂_s ψ_α` and `∂_s ψ̄_α`. The exterior product is the product of + fermionic fields, its anticommutativity the Fermi statistics. -/ +abbrev FermionicAlgebra (V : Type) [AddCommGroup V] [Module ℂ V] : Type := + ExteriorAlgebra ℂ (JetComponentSpace V) + +namespace FermionicAlgebra + +/-! + +### A.1. The generators of the fermionic algebra + +-/ + +/-- **The fermionic algebra is generated by the component functions.** Every element is a + polynomial in the degree-one elements — the symbols `∂_s ψ_α` and `∂_s ψ̄_α` themselves. + This is the algebraic form of "every Lagrangian term is a polynomial in the component + functions". -/ +@[simp] +lemma adjoin_ι_eq_top : + Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace V))) = ⊤ := + CliffordAlgebra.adjoin_range_ι + +/-- A component function squares to zero: no fermionic field appears twice. -/ +lemma ι_sq_zero (x : JetComponentSpace V) : + ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ x = (0 : FermionicAlgebra V) := + ExteriorAlgebra.ι_sq_zero x + +/-- Two component functions anticommute. -/ +lemma ι_mul_ι_swap (x y : JetComponentSpace V) : + (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y : FermionicAlgebra V) + = - (ExteriorAlgebra.ι ℂ y * ExteriorAlgebra.ι ℂ x) := + eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap (R := ℂ) x y) + +/-! + +### A.2. The field and its conjugate + +The undifferentiated component functions sit inside the fermionic algebra as the two +inclusions below. A component function is a *covector* on the target space: `ofField φ` is +the component of the field `ψ` along `φ`, the element written `ψ_α` when `φ` is the `α`-th +coordinate. The conjugate field is a covector on `ConjModule V`, whose scalar action is +twisted by complex conjugation — that twist is exactly the statement that `ψ̄` transforms +by the conjugate of the representation carried by `ψ`. + +Every other generator of the algebra is an iterated derivative of one of these, which is +the content of `FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top`. + +-/ + +/-- **The component function `ψ_φ` of the matter field** along the covector `φ` on `V`: the + undifferentiated generator, sitting at the empty derivative label in the unconjugated half + of the component space. -/ +noncomputable def ofField : Module.Dual ℂ V →ₗ[ℂ] FermionicAlgebra V := + (ExteriorAlgebra.ι ℂ).comp + ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ V) 1)) + +/-- **The component function `ψ̄_φ` of the conjugate matter field** along the covector `φ` on + `ConjModule V`: the undifferentiated generator in the conjugate half of the component + space. -/ +noncomputable def ofConjField : Module.Dual ℂ (ConjModule V) →ₗ[ℂ] FermionicAlgebra V := + (ExteriorAlgebra.ι ℂ).comp + ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule V)) 1)) + +lemma ofField_apply (φ : Module.Dual ℂ V) : + ofField φ = ExteriorAlgebra.ι ℂ + (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := rfl + +lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule V)) : + ofConjField φ = ExteriorAlgebra.ι ℂ + ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace V) := rfl + +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean new file mode 100644 index 000000000..4db30dbf3 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean @@ -0,0 +1,241 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.FermionicAlgebra.Basic +/-! +# The gauge action on the fermionic algebra + +## i. Overview + +Given a fibrewise action of the jet gauge group on the jets `JetRing ⊗[ℂ] V` of a matter +field, the jet gauge group acts on the fermionic algebra by the exterior-algebra functor +applied to the induced action on the jet component space. On a component function `∂_s ψ_α` +the action is the all-orders Leibniz rule: each splitting of the derivative multiset +contributes a Taylor coefficient of the gauge jet against a lower component function. + +Restricting along `JetGaugeGroupI.ofConstant` gives the action of the constant — that is, +global — gauge transformations, which is diagonal in the derivative label. + +## ii. Key results + +- `FermionicAlgebra.repJetGaugeGroupI` : the jet gauge action on the fermionic algebra. +- `FermionicAlgebra.repJetGaugeGroupIAlgHom` : the action as an algebra homomorphism. +- `FermionicAlgebra.repJetGaugeGroupI_ofField` : `ofField` is gauge equivariant, for the + value of the gauge transformation at the base point. +- `FermionicAlgebra.repGaugeGroupI` : the action of the constant gauge transformations. + +## iii. Table of contents + +- A. The action of the jet gauge group + - A.1. Equivariance of the field and its conjugate +- B. Constant gauge transformations + +-/ + +@[expose] public section + +namespace StandardModel + +namespace FermionicAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] + +/-! + +## A. The action of the jet gauge group + +-/ + +/-- **The jet gauge action on the fermionic algebra** of a `V`-valued matter field, induced + from a fibrewise action `rep` on the jets of the field: the exterior-algebra functor + applied to the gauge action on the jet component space. The hypothesis `hlin` is the + statement that a gauge transformation acts on the *values* of the field, over the + identity on spacetime. -/ +noncomputable def repJetGaugeGroupI + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ JetGaugeGroupI (FermionicAlgebra V) where + toFun U := + (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI rep hlin U)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' U W := by + simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repJetGaugeGroupI_apply + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (x : FermionicAlgebra V) : + repJetGaugeGroupI rep hlin U x = + ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI rep hlin U) x := rfl + +@[simp] +lemma repJetGaugeGroupI_apply_one + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) : + repJetGaugeGroupI rep hlin U (1 : FermionicAlgebra V) = 1 := by + simp [repJetGaugeGroupI_apply] + +lemma repJetGaugeGroupI_apply_mul + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (x y : FermionicAlgebra V) : + repJetGaugeGroupI rep hlin U (x * y) = + repJetGaugeGroupI rep hlin U x * repJetGaugeGroupI rep hlin U y := by + simp [repJetGaugeGroupI_apply] + +/-- On a component function the jet gauge action is the action on the component space. -/ +@[simp] +lemma repJetGaugeGroupI_ι + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (v : JetComponentSpace V) : + repJetGaugeGroupI rep hlin U (ExteriorAlgebra.ι ℂ v) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.repJetGaugeGroupI rep hlin U v) := by + rw [repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι] + +/-- The jet gauge action as an algebra homomorphism: a gauge transformation acts on a + Lagrangian term factor by factor. -/ +noncomputable def repJetGaugeGroupIAlgHom + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) : FermionicAlgebra V →ₐ[ℂ] FermionicAlgebra V where + toFun := repJetGaugeGroupI rep hlin U + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repJetGaugeGroupI_apply_one rep hlin U + map_mul' := repJetGaugeGroupI_apply_mul rep hlin U + commutes' r := by simp [repJetGaugeGroupI_apply] + +/-! + +### A.1. Equivariance of the field and its conjugate + +Unlike a derivative generator `∂_s ψ_φ`, which mixes with lower generators through the +Taylor coefficients of the gauge jet, the undifferentiated generator `ψ_φ` transforms by +the *value* of the gauge transformation at the base point alone. So `ofField` and +`ofConjField` are equivariant on the nose, for the contragredient of that value. + +-/ + +/-- **`ofField` is gauge equivariant.** The undifferentiated component functions transform + by the contragredient of the value of the gauge transformation at the base point; no + derivative of the gauge jet contributes. -/ +lemma repJetGaugeGroupI_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) : + repJetGaugeGroupI rep hlin U (ofField φ) = + ofField (Module.Dual.transpose (jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant) φ) := by + rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · exact repDual_one_tmul rep hlin U φ + · rw [JetComponentSpace.repJetGaugeGroupI_snd] + exact map_zero _ + +/-- **`ofConjField` is gauge equivariant**, for the conjugate action `repConj rep` on the + jets of the conjugate field — which is the physicists' `ψ̄ ↦ ψ̄ U†`. -/ +lemma repJetGaugeGroupI_ofConjField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : + repJetGaugeGroupI rep hlin U (ofConjField φ) = + ofConjField (Module.Dual.transpose + (jetEval ∘ₗ (repConj rep U⁻¹).comp jetOfConstant) φ) := by + rw [ofConjField_apply, repJetGaugeGroupI_ι, ofConjField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repJetGaugeGroupI_fst] + exact map_zero _ + · exact repDual_one_tmul (repConj rep) (repConj_smul_comm hlin) U φ + +/-! + +## B. Constant gauge transformations + +-/ + +/-- The action of the constant — that is, global — gauge transformations on the fermionic + algebra, obtained by including a gauge transformation as a constant gauge jet. -/ +noncomputable def repGaugeGroupI + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ GaugeGroupI (FermionicAlgebra V) := + (repJetGaugeGroupI rep hlin).comp JetGaugeGroupI.ofConstant + +lemma repGaugeGroupI_apply + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (x : FermionicAlgebra V) : + repGaugeGroupI rep hlin g x = + repJetGaugeGroupI rep hlin (JetGaugeGroupI.ofConstant g) x := rfl + +@[simp] +lemma repGaugeGroupI_apply_one + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) : + repGaugeGroupI rep hlin g (1 : FermionicAlgebra V) = 1 := + repJetGaugeGroupI_apply_one rep hlin _ + +lemma repGaugeGroupI_apply_mul + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (x y : FermionicAlgebra V) : + repGaugeGroupI rep hlin g (x * y) = + repGaugeGroupI rep hlin g x * repGaugeGroupI rep hlin g y := + repJetGaugeGroupI_apply_mul rep hlin _ x y + +/-- A constant gauge transformation acts on the undifferentiated field by the + contragredient of its value — which for a constant jet is the transformation itself. -/ +lemma repGaugeGroupI_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (φ : Module.Dual ℂ V) : + repGaugeGroupI rep hlin g (ofField φ) = + ofField (Module.Dual.transpose + (jetEval ∘ₗ (rep (JetGaugeGroupI.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + have h : (JetGaugeGroupI.ofConstant g)⁻¹ = JetGaugeGroupI.ofConstant g⁻¹ := + (map_inv JetGaugeGroupI.ofConstant g).symm + rw [repGaugeGroupI_apply, repJetGaugeGroupI_ofField, h] + +/-- A constant gauge transformation acts on the undifferentiated conjugate field by the + conjugate contragredient of its value. -/ +lemma repGaugeGroupI_ofConjField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : + repGaugeGroupI rep hlin g (ofConjField φ) = + ofConjField (Module.Dual.transpose + (jetEval ∘ₗ (repConj rep (JetGaugeGroupI.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + have h : (JetGaugeGroupI.ofConstant g)⁻¹ = JetGaugeGroupI.ofConstant g⁻¹ := + (map_inv JetGaugeGroupI.ofConstant g).symm + rw [repGaugeGroupI_apply, repJetGaugeGroupI_ofConjField, h] + +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean new file mode 100644 index 000000000..59429c9cd --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean @@ -0,0 +1,374 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.FermionicAlgebra.Basic +public import Physlib.Relativity.IsLorentzDeriv +public import Mathlib.Algebra.TrivSqZeroExt.Basic +/-! +# The formal total derivative on the fermionic algebra + +## i. Overview + +The formal total spacetime derivative extends from the component functions to the whole +fermionic algebra as an even derivation. It is constructed by lifting the generator map +`ι x ↦ (ι x, ι (∂_μ x))` to an algebra homomorphism into the trivial square-zero extension +of the fermionic algebra; the square-zero condition holds because degree-one elements of an +exterior algebra anticommute. + +The four directional derivatives commute, so they iterate along a *multiset* of directions +through `Lorentz.iteratedD`. On a component function the iterate is multiplication by the +derivative symbol `∂_s` in the `DerivAlgebraComplex` factor, and on a product it obeys the +all-orders Leibniz rule over the antidiagonal of the multiset. + +## ii. Key results + +- `FermionicAlgebra.jetDeriv` : the formal total spacetime derivative. +- `FermionicAlgebra.jetDeriv_mul` : the Leibniz rule. +- `FermionicAlgebra.jetDeriv_comm` : total derivatives commute. +- `FermionicAlgebra.iteratedJetDeriv` : the iterated derivative along a multiset. +- `FermionicAlgebra.iteratedJetDeriv_mul` : the all-orders Leibniz rule. +- `FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top` : the algebra is generated by the field, + its conjugate, and their derivatives. + +## iii. Table of contents + +- A. The formal total derivative on the fermionic algebra +- B. The iterated total derivative +- C. Generation by the field and its derivatives + +-/ + +@[expose] public section + +namespace StandardModel + +namespace FermionicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The formal total derivative on the fermionic algebra + +The formal total spacetime derivative extends from the component functions to the whole +fermionic algebra as an even derivation: `∂_μ (x y) = (∂_μ x) y + x (∂_μ y)`, with no +Koszul signs. + +-/ + +/-- The generator map of the total derivative into the trivial square-zero extension of the + fermionic algebra: `ι x ↦ (ι x, ι (∂_μ x))`. -/ +noncomputable def jetDerivGen (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace V →ₗ[ℂ] TrivSqZeroExt (FermionicAlgebra V) (FermionicAlgebra V) where + toFun x := (ExteriorAlgebra.ι ℂ x, + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x)) + map_add' x y := by + simp only [map_add] + rfl + map_smul' c x := by + simp only [map_smul, RingHom.id_apply] + rfl + +@[simp] +lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl + +@[simp] +lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + (jetDerivGen μ x).snd = ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := rfl + +/-- The generator map squares to zero: degree-one elements of the exterior algebra + anticommute. -/ +lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDerivGen μ x * jetDerivGen μ x = 0 := by + refine TrivSqZeroExt.ext ?_ ?_ + · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, + TrivSqZeroExt.fst_zero] + · rw [TrivSqZeroExt.snd_mul, jetDerivGen_fst, jetDerivGen_snd, TrivSqZeroExt.snd_zero, + smul_eq_mul, op_smul_eq_mul] + exact ExteriorAlgebra.ι_add_mul_swap x (JetComponentSpace.jetDeriv μ x) + +/-- The lift of the total derivative to the trivial square-zero extension of the fermionic + algebra: the algebra homomorphism `x ↦ (x, ∂_μ x)`. -/ +noncomputable def jetDerivHom (μ : Fin 1 ⊕ Fin 3) : + FermionicAlgebra V →ₐ[ℂ] TrivSqZeroExt (FermionicAlgebra V) (FermionicAlgebra V) := + ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ + +@[simp] +lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDerivHom μ (ExteriorAlgebra.ι ℂ x) = jetDerivGen μ x := by + rw [jetDerivHom, ExteriorAlgebra.lift_ι_apply] + +/-- The first component of the square-zero lift is the identity. -/ +@[simp] +lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : + (jetDerivHom μ x).fst = x := by + have h : (TrivSqZeroExt.fstHom ℂ (FermionicAlgebra V) (FermionicAlgebra V)).comp + (jetDerivHom μ) = AlgHom.id ℂ (FermionicAlgebra V) := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) + simp + exact DFunLike.congr_fun h x + +/-- The formal total spacetime derivative on the fermionic algebra of a `V`-valued matter + field in the direction `μ`: the even derivation extending the shift + `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the component functions. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : + FermionicAlgebra V →ₗ[ℂ] FermionicAlgebra V where + toFun x := (jetDerivHom μ x).snd + map_add' x y := congrArg TrivSqZeroExt.snd (map_add (jetDerivHom μ) x y) + map_smul' c x := congrArg TrivSqZeroExt.snd (map_smul (jetDerivHom μ) c x) + +lemma jetDeriv_apply (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : + jetDeriv μ x = (jetDerivHom μ x).snd := rfl + +/-- On a component function the total derivative is the shift of the derivative label. -/ +@[simp] +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDeriv μ (ExteriorAlgebra.ι ℂ x) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := by + rw [jetDeriv_apply, jetDerivHom_ι, jetDerivGen_snd] + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (V := V) μ (1 : FermionicAlgebra V) = 0 := + congrArg TrivSqZeroExt.snd (map_one (jetDerivHom (V := V) μ)) + +@[simp] +lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : + jetDeriv (V := V) μ (algebraMap ℂ (FermionicAlgebra V) r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] + +/-- The total derivative is an even derivation: the Leibniz rule holds on the fermionic + algebra with no Koszul signs. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : FermionicAlgebra V) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + have h : jetDeriv μ (x * y) = + (jetDerivHom μ x).fst * jetDeriv μ y + jetDeriv μ x * (jetDerivHom μ y).fst := + congrArg TrivSqZeroExt.snd (map_mul (jetDerivHom μ) x y) + rw [jetDerivHom_fst, jetDerivHom_fst] at h + exact h.trans (add_comm _ _) + +/-- **Mixed partials agree.** The derivative labels live in a *symmetric* algebra, so the + total derivatives in different directions commute. -/ +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => simp + | ι v => + rw [jetDeriv_ι, jetDeriv_ι, jetDeriv_ι, jetDeriv_ι] + exact congrArg (ExteriorAlgebra.ι ℂ) + (DFunLike.congr_fun (JetComponentSpace.jetDeriv_comm (V := V) μ ν) v) + | mul x y hx hy => + simp only [jetDeriv_mul, map_add, hx, hy] + abel + | add x y hx hy => simp only [map_add, hx, hy] + +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (jetDeriv (V := V) μ).comp (jetDeriv ν) = (jetDeriv (V := V) ν).comp (jetDeriv μ) := + LinearMap.ext fun x => jetDeriv_comm_apply μ ν x + +/-! + +## B. The iterated total derivative + +-/ + +/-- The iterated total derivative `∂_s = ∂_{ν₁} ⋯ ∂_{νₙ}` along a multiset `s` of + directions. It is well defined on a multiset — i.e. independent of the order in which the + directions are listed — because the directional derivatives commute. -/ +noncomputable def iteratedJetDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : + FermionicAlgebra V →ₗ[ℂ] FermionicAlgebra V := + Lorentz.iteratedD jetDeriv jetDeriv_comm s + +@[simp] +lemma iteratedJetDeriv_zero : + iteratedJetDeriv (0 : Multiset (Fin 1 ⊕ Fin 3)) + = LinearMap.id (R := ℂ) (M := FermionicAlgebra V) := + Lorentz.iteratedD_zero jetDeriv jetDeriv_comm + +lemma iteratedJetDeriv_cons (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (V := V) (μ ::ₘ s) = (jetDeriv μ).comp (iteratedJetDeriv s) := + Lorentz.iteratedD_cons jetDeriv jetDeriv_comm μ s + +/-- The companion of `iteratedJetDeriv_cons`, peeling the extra derivative on the inside. -/ +lemma iteratedJetDeriv_cons' (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (V := V) (μ ::ₘ s) = (iteratedJetDeriv s).comp (jetDeriv μ) := + Lorentz.iteratedD_cons' jetDeriv jetDeriv_comm μ s + +@[simp] +lemma iteratedJetDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + iteratedJetDeriv (V := V) {μ} = jetDeriv μ := + Lorentz.iteratedD_singleton jetDeriv jetDeriv_comm μ + +/-- The iterated derivative is additive in the multiset of directions: differentiating + along `s + t` is differentiating along `t` and then along `s`. -/ +lemma iteratedJetDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (V := V) (s + t) + = (iteratedJetDeriv s).comp (iteratedJetDeriv t) := + Lorentz.iteratedD_add jetDeriv jetDeriv_comm s t + +/-- **The all-orders Leibniz rule.** The iterated derivative of a product distributes over + the antidiagonal of the multiset of directions: each way of splitting the derivatives + between the two factors contributes one term. -/ +lemma iteratedJetDeriv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : FermionicAlgebra V) : + iteratedJetDeriv s (x * y) = + (s.antidiagonal.map fun p => + iteratedJetDeriv p.1 x * iteratedJetDeriv p.2 y).sum := + Lorentz.iteratedD_mul jetDeriv jetDeriv_comm jetDeriv_mul s x y + +/-- A nonempty iterated derivative kills the constants. -/ +lemma iteratedJetDeriv_one_of_ne_zero {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s ≠ 0) : + iteratedJetDeriv (V := V) s (1 : FermionicAlgebra V) = 0 := by + obtain ⟨μ, hμ⟩ := Multiset.exists_mem_of_ne_zero hs + obtain ⟨t, rfl⟩ := Multiset.exists_cons_of_mem hμ + rw [iteratedJetDeriv_cons', LinearMap.comp_apply, jetDeriv_one, map_zero] + +/-- **On a component function the iterated derivative is the derivative symbol `∂_s`.** + Both halves of the component space — the field and its conjugate — are multiplied by the + degree-`|s|` element `∂_s` of `DerivAlgebraComplex` in their derivative-label factor, + with the target index untouched. -/ +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpace V) : + iteratedJetDeriv s (ExteriorAlgebra.ι ℂ x) = + ExteriorAlgebra.ι ℂ + (TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) + LinearMap.id x.1, + TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) + LinearMap.id x.2) := by + have hmul : ∀ t u : Multiset (Fin 1 ⊕ Fin 3), + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis t)).comp + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis u)) + = LinearMap.mulRight ℂ (DerivAlgebraComplex.basis (u + t)) := fun t u => + LinearMap.ext fun a => by + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.mulRight_apply, mul_assoc, + DerivAlgebraComplex.basis_mul] + have hone : LinearMap.mulRight ℂ (1 : DerivAlgebraComplex) = LinearMap.id := + LinearMap.ext fun a => mul_one a + have hnil : DerivAlgebraComplex.basis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := + DerivAlgebraComplex.basis_nil + induction s using Multiset.induction_on with + | empty => + rw [iteratedJetDeriv_zero, LinearMap.id_apply, hnil, hone] + simp only [TensorProduct.map_id, LinearMap.id_apply] + | cons μ s ih => + have hs : s + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ s := by + rw [add_comm, Multiset.singleton_add] + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, ih, jetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.jetDeriv_fst, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, hmul, hs] + · rw [JetComponentSpace.jetDeriv_snd, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, hmul, hs] + +/-! + +## C. Generation by the field and its derivatives + +-/ + +/-- The iterated derivative of the field is the generator carrying the derivative symbol + `∂_s`: applying `∂_s` to `ψ_φ` writes the label `s` into the derivative factor. -/ +@[simp] +lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + iteratedJetDeriv s (ofField φ) = + ExteriorAlgebra.ι ℂ ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := by + rw [ofField_apply, iteratedJetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, one_mul, LinearMap.id_apply] + · rw [map_zero] + +/-- The iterated derivative of the conjugate field is the conjugate generator carrying the + derivative symbol `∂_s`. -/ +@[simp] +lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule V)) : + iteratedJetDeriv s (ofConjField φ) = + ExteriorAlgebra.ι ℂ ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) := by + rw [ofConjField_apply, iteratedJetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [map_zero] + · rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, one_mul, LinearMap.id_apply] + +/-- **The fermionic algebra is generated by the field, its conjugate, and their + derivatives.** As a `ℂ`-algebra, `FermionicAlgebra V` is the algebra adjoined by the + iterated total derivatives `∂_s ψ_φ` and `∂_s ψ̄_φ` of the undifferentiated component + functions. Physically: every Lagrangian term for a `V`-valued matter field is a + polynomial in the field, its conjugate, and their spacetime derivatives — nothing else is + available to write down. + + This sharpens `adjoin_ι_eq_top`, which only says the algebra is generated by the + component functions; here the component functions are themselves produced from the two + inclusions `ofField` and `ofConjField` by differentiating. -/ +theorem adjoin_iteratedJetDeriv_eq_top : + Algebra.adjoin ℂ + (⋃ s : Multiset (Fin 1 ⊕ Fin 3), + Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + iteratedJetDeriv s (ofConjField φ))) + = (⊤ : Subalgebra ℂ (FermionicAlgebra V)) := by + set S : Set (FermionicAlgebra V) := + ⋃ s : Multiset (Fin 1 ⊕ Fin 3), + Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + iteratedJetDeriv s (ofConjField φ)) with hS + /- The two half-inclusions of the component space into the fermionic algebra. -/ + let gField : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] FermionicAlgebra V := + (ExteriorAlgebra.ι ℂ).comp (LinearMap.inl ℂ _ _) + let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] + FermionicAlgebra V := + (ExteriorAlgebra.ι ℂ).comp (LinearMap.inr ℂ _ _) + /- On a derivative monomial each half-inclusion is one of the adjoined generators. -/ + have hbasisField : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + gField (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by + intro s φ + have h : gField (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) = iteratedJetDeriv s (ofField φ) := + (iteratedJetDeriv_ofField s φ).symm + rw [h, hS] + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨s, Or.inl ⟨φ, rfl⟩⟩) + have hbasisConj : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule V)), + gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by + intro s φ + have h : gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) + = iteratedJetDeriv s (ofConjField φ) := (iteratedJetDeriv_ofConjField s φ).symm + rw [h, hS] + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨s, Or.inr ⟨φ, rfl⟩⟩) + /- The derivative monomials span, so each half-inclusion lands in the adjoined algebra. -/ + have hhalf : ∀ {W : Type} [AddCommGroup W] [Module ℂ W] + (g : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra V), + (∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (w : W), + g (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] w) ∈ Algebra.adjoin ℂ S) → + ∀ y, g y ∈ Algebra.adjoin ℂ S := by + intro W _ _ g hg y + induction y using TensorProduct.induction_on with + | zero => rw [map_zero]; exact zero_mem _ + | add y z hy hz => rw [map_add]; exact add_mem hy hz + | tmul a w => + have ha : a ∈ Submodule.span ℂ (Set.range DerivAlgebraComplex.basis) := by + rw [DerivAlgebraComplex.basis.span_eq]; trivial + induction ha using Submodule.span_induction with + | mem b hb => obtain ⟨s, rfl⟩ := hb; exact hg s w + | zero => rw [TensorProduct.zero_tmul, map_zero]; exact zero_mem _ + | add b c _ _ hb hc => rw [TensorProduct.add_tmul, map_add]; exact add_mem hb hc + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul] + exact Subalgebra.smul_mem _ hb c + /- Every component function is a sum of its two halves. -/ + refine top_le_iff.mp ?_ + rw [← adjoin_ι_eq_top (V := V)] + refine Algebra.adjoin_le ?_ + rintro _ ⟨x, rfl⟩ + have hx : x = LinearMap.inl ℂ _ _ x.1 + LinearMap.inr ℂ _ _ x.2 := by + refine Prod.ext ?_ ?_ <;> simp + rw [hx, map_add] + exact add_mem (hhalf gField hbasisField x.1) (hhalf gConj hbasisConj x.2) + +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean new file mode 100644 index 000000000..de334ec09 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean @@ -0,0 +1,185 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv +/-! +# The Lorentz action on the fermionic algebra + +## i. Overview + +Given a representation of `SL(2,ℂ)` on the target space `V` of a matter field, the Lorentz +group acts on the fermionic algebra by the exterior-algebra functor applied to its action +on the jet component space. On a component function `∂_s ψ_α` the derivative labels +transform by the Lorentz matrix and the target index contragrediently by `V`. + +The formal total derivative is a Lorentz vector for this action, which is exactly the +content of the class `Lorentz.IsLorentzDeriv`; the instance is registered here, so all the +boost-weight machinery of `Physlib.Relativity.IsLorentzDeriv` applies to the fermionic +algebra of any matter field. + +## ii. Key results + +- `FermionicAlgebra.repLorentzGroup` : the Lorentz action on the fermionic algebra. +- `FermionicAlgebra.repLorentzGroupAlgHom` : the action as an algebra homomorphism. +- `FermionicAlgebra.repLorentzGroup_ofField` : `ofField` is `SL(2,ℂ)`-equivariant. +- `FermionicAlgebra.repLorentzGroup_jetDeriv` : the total derivative is a Lorentz vector. +- `FermionicAlgebra.instIsLorentzDeriv` : the resulting `Lorentz.IsLorentzDeriv` instance. + +## iii. Table of contents + +- A. The action of the Lorentz group + - A.1. Equivariance of the field and its conjugate +- B. Lorentz covariance of the total derivative + +-/ + +@[expose] public section + +namespace StandardModel + +namespace FermionicAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The action of the Lorentz group + +-/ + +/-- **The Lorentz action on the fermionic algebra** of a `V`-valued matter field, induced + from a representation `repV` of `SL(2,ℂ)` on `V`: the exterior-algebra functor applied to + the Lorentz action on the jet component space. -/ +noncomputable def repLorentzGroup (repV : Representation ℂ SL(2,ℂ) V) : + Representation ℂ SL(2,ℂ) (FermionicAlgebra V) where + toFun Λ := (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup repV Λ)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' Λ₁ Λ₂ := by + simp only [map_mul, Module.End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repLorentzGroup_apply (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (x : FermionicAlgebra V) : + repLorentzGroup repV Λ x = + ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup repV Λ) x := rfl + +@[simp] +lemma repLorentzGroup_apply_one (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : + repLorentzGroup repV Λ (1 : FermionicAlgebra V) = 1 := by + simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_mul (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (x y : FermionicAlgebra V) : + repLorentzGroup repV Λ (x * y) + = repLorentzGroup repV Λ x * repLorentzGroup repV Λ y := by + simp [repLorentzGroup_apply] + +/-- On a component function the Lorentz action is the action on the component space. -/ +@[simp] +lemma repLorentzGroup_ι (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (v : JetComponentSpace V) : + repLorentzGroup repV Λ (ExteriorAlgebra.ι ℂ v) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.repLorentzGroup repV Λ v) := by + rw [repLorentzGroup_apply, ExteriorAlgebra.map_apply_ι] + +/-- The Lorentz action as an algebra homomorphism: it preserves the exterior product, so a + Lorentz transformation acts on a Lagrangian term factor by factor. -/ +noncomputable def repLorentzGroupAlgHom (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : + FermionicAlgebra V →ₐ[ℂ] FermionicAlgebra V where + toFun := repLorentzGroup repV Λ + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repLorentzGroup_apply_one repV Λ + map_mul' := repLorentzGroup_apply_mul repV Λ + commutes' r := by simp [repLorentzGroup_apply] + +/-! + +### A.1. Equivariance of the field and its conjugate + +-/ + +/-- **`ofField` is `SL(2,ℂ)`-equivariant.** The undifferentiated component functions carry + the contragredient of the representation on the target space, and no derivative labels + are generated: `ofField` intertwines `repV.dual` with the action on the fermionic + algebra. -/ +@[simp] +lemma repLorentzGroup_ofField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ V) : + repLorentzGroup repV Λ (ofField φ) = ofField (repV.dual Λ φ) := by + rw [ofField_apply, repLorentzGroup_ι, ofField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repLorentzGroup_fst_tmul, + DerivAlgebraComplex.repLorentzGroup_apply_one] + rfl + · rw [JetComponentSpace.repLorentzGroup_snd] + exact map_zero _ + +/-- **`ofConjField` is `SL(2,ℂ)`-equivariant**, for the conjugate of the representation on + the target space: the conjugate component functions transform by `star` of the spinor + matrix. -/ +@[simp] +lemma repLorentzGroup_ofConjField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ (ConjModule V)) : + repLorentzGroup repV Λ (ofConjField φ) = ofConjField (repV.conj.dual Λ φ) := by + rw [ofConjField_apply, repLorentzGroup_ι, ofConjField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repLorentzGroup_fst] + exact map_zero _ + · rw [JetComponentSpace.repLorentzGroup_snd] + show (DerivAlgebraComplex.repLorentzGroup Λ 1) ⊗ₜ[ℂ] (repV.conj.dual Λ φ) = _ + rw [DerivAlgebraComplex.repLorentzGroup_apply_one] + +/-! + +## B. Lorentz covariance of the total derivative + +-/ + +set_option maxHeartbeats 4000000 in +/-- **The total derivative on the fermionic algebra is a Lorentz vector.** The four + derivations `∂_μ` transform into each other by the columns of the Lorentz matrix of `Λ`, + exactly as the covector index `μ` should. -/ +lemma repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : + repLorentzGroup repV Λ (jetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup repV Λ x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + rw [jetDeriv_algebraMap, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, repLorentzGroup_ι, repLorentzGroup_ι, + JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + +/-- The total derivatives on the fermionic algebra form a Lorentz derivative, giving access + to the boost-weight machinery of `Physlib.Relativity.IsLorentzDeriv`. -/ +instance instIsLorentzDeriv (repV : Representation ℂ SL(2,ℂ) V) : + Lorentz.IsLorentzDeriv (repLorentzGroup repV) (jetDeriv (V := V)) where + rep_deriv := repLorentzGroup_jetDeriv repV _ _ _ + +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean index 501aba4a1..66573e88a 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean @@ -37,6 +37,10 @@ The construction needs two hypotheses on the jet action `rep`: - `repDual` : the induced action on the unconjugated symbols. - `repConj`, `repConj_smul_comm` : the action on the jets of the conjugate field. - `JetComponentSpace.repJetGaugeGroupI` : the action on the full component space. +- `JetComponentSpace.repLorentzGroup` : the Lorentz action on the component space. +- `JetComponentSpace.jetDeriv` : the shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the label. +- `JetComponentSpace.jetDeriv_comm` : the shifts in different directions commute. +- `JetComponentSpace.repLorentzGroup_jetDeriv` : the shift is a Lorentz vector. -/ @@ -48,8 +52,6 @@ open Matrix MatrixGroups TensorProduct variable {V : Type _} [AddCommGroup V] [Module ℂ V] -variable {V : Type _} [AddCommGroup V] [Module ℂ V] - /-- The space of component functions of a `V`-valued matter field: the span of the symbols `∂_s ψ_α` and their conjugates `∂_s ψ̄_α`. The first factor holds the @@ -376,6 +378,28 @@ lemma symbolAction_tmul (g : JetRing) (T : Module.End ℂ V) : = TensorProduct.map (DerivAlgebraComplex.jetRingAction g) (Module.Dual.transpose T) := rfl +/-- **A coefficient acts on the undifferentiated symbol through its value at the base +point.** On `1 ⊗ φ` — the symbol `ψ_φ` carrying no derivatives — only the constant term of +the power-series coefficient survives, so the result is again undifferentiated and the +target index is acted on by the transpose of the base-point value. -/ +lemma symbolAction_one_tmul (c : JetRing ⊗[ℂ] Module.End ℂ V) (φ : Module.Dual ℂ V) : + symbolAction c ((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) + = (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] + Module.Dual.transpose (jetEval ∘ₗ TensorProduct.lift + ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) c) φ := by + induction c using TensorProduct.induction_on with + | zero => simp + | add c₁ c₂ h₁ h₂ => + rw [map_add, LinearMap.add_apply, h₁, h₂, map_add, LinearMap.comp_add, map_add, + LinearMap.add_apply, TensorProduct.tmul_add] + | tmul g T => + rw [symbolAction_tmul, TensorProduct.map_tmul, + DerivAlgebraComplex.jetRingAction_apply_one, TensorProduct.smul_tmul] + congr 1 + refine LinearMap.ext fun v => ?_ + simp [Module.Dual.transpose] + /-- **The gauge action on the symbols.** Given a fibrewise gauge action on the jets of a `V`-valued field, this is the induced (contragredient) action on the derivative symbols `∂_s ψ_α`, which span `DerivAlgebraComplex ⊗ Module.Dual ℂ V`. @@ -410,6 +434,25 @@ noncomputable def repDual [Module.Free ℂ V] [Module.Finite ℂ V] rw [hmul, symbolAction_mul symbolAction (fun g T => rfl)] rfl +/-- **The undifferentiated symbol transforms by the value of the gauge transformation at +the base point.** No derivative of the gauge jet contributes: the symbol `ψ_φ` is acted on +by the contragredient of `rep U⁻¹` restricted to constant jets and evaluated at the base +point. -/ +lemma repDual_one_tmul [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) : + repDual rep hlin U ((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) + = (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] + Module.Dual.transpose (jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant) φ := by + have h : jetEval ∘ₗ TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (jetCoeff rep U⁻¹) + = jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant := + LinearMap.ext fun v => congrArg jetEval (jetCoeff_spec rep U⁻¹ v) + rw [show repDual rep hlin U = symbolAction (jetCoeff rep U⁻¹) from rfl, + symbolAction_one_tmul, h] + /-- **The gauge action on the jet component space.** Given a fibrewise gauge action on the jets of a `V`-valued field, this is the induced action on the full space of component @@ -558,27 +601,79 @@ lemma JetComponentSpace.jetDeriv_eq_ι (μ : Fin 1 ⊕ Fin 3) : (Lorentz.complexCoBasis.dualBasis μ))) LinearMap.id) := by rw [JetComponentSpace.jetDeriv, DerivAlgebraComplex.basis_singleton] -/-! - -## C. The fermionic algebra - --/ - -abbrev FermionicAlgebra (V : Type _) [AddCommGroup V] [Module ℂ V] : Type := - ExteriorAlgebra ℂ (JetComponentSpace V) - -namespace FermionicAlgebra +@[simp] +lemma JetComponentSpace.jetDeriv_fst (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace V) : + (JetComponentSpace.jetDeriv μ v).1 + = TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id v.1 := rfl @[simp] -lemma adjoin_ι_eq_top : - Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace V))) = ⊤ := - CliffordAlgebra.adjoin_range_ι +lemma JetComponentSpace.jetDeriv_snd (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace V) : + (JetComponentSpace.jetDeriv μ v).2 + = TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id v.2 := rfl /-! -## The jet derivative +## Lorentz covariance of the jet derivative -/ -end FermionicAlgebra + +/-- The covariance of the derivative-symbol multiplication on one tensor factor of the + component space, for an arbitrary representation on the other factor. -/ +private lemma repLorentzGroup_tprod_mulRight_jetSymbol {W : Type*} [AddCommGroup W] + [Module ℂ W] (ρ : Representation ℂ SL(2,ℂ) W) (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (w : DerivAlgebraComplex ⊗[ℂ] W) : + (DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id w) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({a} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id ((DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ w) := by + have hsym : DerivAlgebraComplex.repLorentzGroup Λ + (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + DerivAlgebraComplex.basis ({a} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [DerivAlgebraComplex.basis_singleton, DerivAlgebraComplex.repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, DerivAlgebraComplex.basis_singleton] + have hrep : ∀ (q : DerivAlgebraComplex) (f : W), + (DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ (q ⊗ₜ[ℂ] f) = + (DerivAlgebraComplex.repLorentzGroup Λ q) ⊗ₜ[ℂ] (ρ Λ f) := fun _ _ => rfl + induction w using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul q f => + rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, hrep, hrep, + DerivAlgebraComplex.repLorentzGroup_apply_mul, hsym, Finset.mul_sum, + TensorProduct.sum_tmul] + exact Finset.sum_congr rfl fun a _ => by + rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, + mul_smul_comm, TensorProduct.smul_tmul'] + +/-- **The jet derivative is a Lorentz vector on the component space.** Appending `∂_μ` and + then acting is acting and then appending the transformed `∂_μ`, which is a combination of + the `∂_a`. Both halves of the component space are covered by the same argument: the + derivative label lives in the first tensor factor, and what sits in the second factor — + `repV.dual` or `repV.conj.dual` — plays no role. -/ +lemma JetComponentSpace.repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace V) : + JetComponentSpace.repLorentzGroup repV Λ (JetComponentSpace.jetDeriv μ v) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + JetComponentSpace.jetDeriv a (JetComponentSpace.repLorentzGroup repV Λ v) := by + refine Prod.ext ?_ ?_ + · simp only [Prod.fst_sum, Prod.smul_fst, JetComponentSpace.repLorentzGroup_fst, + JetComponentSpace.jetDeriv_fst] + exact repLorentzGroup_tprod_mulRight_jetSymbol _ Λ μ v.1 + · simp only [Prod.snd_sum, Prod.smul_snd, JetComponentSpace.repLorentzGroup_snd, + JetComponentSpace.jetDeriv_snd] + exact repLorentzGroup_tprod_mulRight_jetSymbol _ Λ μ v.2 end StandardModel From d5fcbf868756037954f1b1a4fe0574491dfb5b00 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 20 Aug 2026 15:49:05 +0100 Subject: [PATCH 177/254] feat: Add Fermionic algebra --- Physlib.lean | 2 + Physlib/Mathematics/ConjModule.lean | 15 + .../GaugeBosons/GaugeFieldAlglebra/Basic.lean | 14 + .../StandardModel/JetAlgebra/Basic.lean | 343 ++++++++++++++++++ .../Matter/FermionicAlgebra/Basic.lean | 54 +++ .../Matter/FermionicAlgebra/JetDeriv.lean | 37 ++ .../Matter/FermionicAlgebra/Prod.lean | 121 ++++++ .../Matter/JetComponentSpace/Basic.lean | 63 ++++ 8 files changed, 649 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean diff --git a/Physlib.lean b/Physlib.lean index 34ca2c94c..1921ead65 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -222,10 +222,12 @@ public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.Potential +public import Physlib.Particles.StandardModel.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 diff --git a/Physlib/Mathematics/ConjModule.lean b/Physlib/Mathematics/ConjModule.lean index 4ecc317c0..9ff05c4a0 100644 --- a/Physlib/Mathematics/ConjModule.lean +++ b/Physlib/Mathematics/ConjModule.lean @@ -191,6 +191,21 @@ def map (f : M →ₗ[k] N) : ConjModule M →ₗ[k] ConjModule N where @[simp] lemma map_apply (f : M →ₗ[k] N) (x : ConjModule M) : map f x = f x := rfl +/-- **Conjugation commutes with finite products.** The conjugate of a product is the product +of the conjugates, by the identity underlying function: the twisted scalar action is applied +componentwise. -/ +def prodEquiv : ConjModule (M × N) ≃ₗ[k] ConjModule M × ConjModule N where + toFun x := (map (LinearMap.fst k M N) x, map (LinearMap.snd k M N) x) + map_add' _ _ := rfl + map_smul' _ _ := rfl + invFun x := (x.1, x.2) + left_inv _ := rfl + right_inv _ := rfl + +@[simp] +lemma prodEquiv_apply (x : ConjModule (M × N)) : + prodEquiv (k := k) x = (map (LinearMap.fst k M N) x, map (LinearMap.snd k M N) x) := rfl + /-- The conjugate module of a finite free module is finite: the conjugated basis `Module.Basis.conj` is indexed by the same type. -/ instance instFinite [Module.Free k M] [Module.Finite k M] : diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean new file mode 100644 index 000000000..37ab7c4b6 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean @@ -0,0 +1,14 @@ +/-! + +## The gauge field algebra + +Similar to the algebra of the `BBoson`, we define the symmetric algebra +for all the gauge bosons in the Standard model. + +This should include seperate files for: +1. The Lie group action +2. The Gauge group action +3. The derivative. +4. The mass dimension grading etc. + +-/ diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean index e69de29bb..e4990c46e 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -0,0 +1,343 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.FermionicAlgebra.Prod +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.Fermions.DownSinglet +/-! +# The fermionic jet algebra of the Standard Model + +## i. Overview + +The jet algebra of the Standard Model is the algebra in which a Lagrangian lives: the free +algebra on the component functions of every field and all their spacetime derivatives, +subject only to the statistics of the fields. + +This file builds its fermionic factor, `FermionJetAlgebra`; the bosonic factors — the gauge +fields and the Higgs — commute with everything and will enter as separate tensor factors. + +The Standard Model carries five fermion species — the lepton doublet, the charged-lepton +singlet, the quark doublet, and the up- and down-type quark singlets — each in three +generations, and the fermionic jet algebra is the *exterior product* of their individual +fermionic algebras: generators anticommute, and they do so **across species and generations +as well as within a species**, since all of them are fermionic. + +That exterior product is *realized* here as a single exterior algebra on the direct sum of +the fifteen target spaces, and then *identified* with the graded tensor product of the +species algebras by `FermionicAlgebra.prodEquiv`, applied once per species +(`FermionJetAlgebra.exteriorProductLeptonDoublet` and its siblings below). The +identification is genuine, not a convention: the exterior algebra of a direct sum is the +graded (super) tensor product of the exterior algebras of the summands. An ordinary tensor +product `⊗[ℂ]` would instead make generators of different species *commute*, which is wrong +for fermions. + +The direct sum is taken as the definition rather than the graded tensor product because +Mathlib's `GradedTensorProduct` carries no `GradedAlgebra` instance, so a graded tensor +product of three or more factors cannot currently be written down as a type; the peeled +form, one species at a time, is as far as the type-level statement goes. Working inside a +single `ExteriorAlgebra` also keeps every algebraic class projecting from one root, and lets +the whole `FermionicAlgebra` API — the Lorentz action, the jet gauge action, the total +derivative and its iterates — apply to `FermionJetAlgebra` unchanged. + +## ii. Key results + +- `FermionSpace` : the total target space of the Standard Model fermions. +- `FermionSpace.leptonDoubletProj`, … : the projections onto a species and generation. +- `FermionSpace.leptonDoubletIncl`, … : the inclusions of a species and generation. +- `FermionJetAlgebra` : the jet algebra of the Standard Model fermions. +- `FermionJetAlgebra.ofLeptonDoublet`, … : the component functions of each species and + generation. +- `FermionJetAlgebra.exteriorProductLeptonDoublet`, … : the jet algebra as the exterior + product of the species algebras. + +## iii. Table of contents + +- A. The target space of the Standard Model fermions + - A.1. The projections onto the species + - A.2. The inclusions onto the species + - A.3. The action of the Lorentz group + - A.4. The action of the global gauge group + - A.5. The action of the jet gauge group +- B. The fermionic jet algebra + - B.1. The component functions of each species + - B.2. The exterior product decomposition + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The target space of the Standard Model fermions + +-/ + +/-- The total target space of the Standard Model fermions: the direct sum of three + generations each of the lepton doublet, the charged-lepton singlet, the quark doublet, and + the up- and down-type quark singlets. The three generations of a species sit together, so + that a species can be split off the jet algebra as a single exterior factor. -/ +abbrev FermionSpace : Type := + (Fin 3 → LeptonDoublet) × (Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × + (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet) + +namespace FermionSpace + +/-! + +### A.1. The projections onto the species + +The component functions of a field are *covectors* on its target space, so it is the +projections — not the inclusions — that carry the individual species into the jet algebra. +Each projection takes a generation index `i : Fin 3`. + +-/ + +/-- The projection onto the `i`-th generation of the lepton doublet. -/ +def leptonDoubletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] LeptonDoublet := + (LinearMap.proj i).comp (LinearMap.fst ℂ _ _) + +/-- The projection onto the `i`-th generation of the charged-lepton singlet. -/ +def leptonSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] LeptonSinglet := + (LinearMap.proj i).comp ((LinearMap.fst ℂ _ _).comp (LinearMap.snd ℂ _ _)) + +/-- The projection onto the `i`-th generation of the quark doublet. -/ +def quarkDoubletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] QuarkDoublet := + (LinearMap.proj i).comp + ((LinearMap.fst ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _))) + +/-- The projection onto the `i`-th generation of the up-type quark singlet. -/ +def upSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] UpSinglet := + (LinearMap.proj i).comp ((LinearMap.fst ℂ _ _).comp + ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _)))) + +/-- The projection onto the `i`-th generation of the down-type quark singlet. -/ +def downSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] DownSinglet := + (LinearMap.proj i).comp ((LinearMap.snd ℂ _ _).comp + ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _)))) + +/-! + +### A.2. The inclusions onto the species + +The one-sided inverses of the projections: the inclusion of a single species and generation +as a summand of the total target space, zero in every other slot. `…Proj i ∘ …Incl i` is the +identity, and every other composite of a projection with an inclusion vanishes. + +-/ + +/-- The inclusion of the `i`-th generation lepton doublet as a summand. -/ +def leptonDoubletIncl (i : Fin 3) : LeptonDoublet →ₗ[ℂ] FermionSpace := + (LinearMap.inl ℂ _ _).comp (LinearMap.single ℂ (fun _ : Fin 3 => LeptonDoublet) i) + +/-- The inclusion of the `i`-th generation charged-lepton singlet as a summand. -/ +def leptonSingletIncl (i : Fin 3) : LeptonSinglet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inl ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => LeptonSinglet) i)) + +/-- The inclusion of the `i`-th generation quark doublet as a summand. -/ +def quarkDoubletIncl (i : Fin 3) : QuarkDoublet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp + ((LinearMap.inl ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => QuarkDoublet) i))) + +/-- The inclusion of the `i`-th generation up-type quark singlet as a summand. -/ +def upSingletIncl (i : Fin 3) : UpSinglet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp + ((LinearMap.inl ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => UpSinglet) i)))) + +/-- The inclusion of the `i`-th generation down-type quark singlet as a summand. -/ +def downSingletIncl (i : Fin 3) : DownSinglet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp + ((LinearMap.inr ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => DownSinglet) i)))) + +@[simp] +lemma leptonDoubletProj_comp_leptonDoubletIncl (i : Fin 3) : + (leptonDoubletProj i).comp (leptonDoubletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [leptonDoubletProj, leptonDoubletIncl] + +@[simp] +lemma leptonSingletProj_comp_leptonSingletIncl (i : Fin 3) : + (leptonSingletProj i).comp (leptonSingletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [leptonSingletProj, leptonSingletIncl] + +@[simp] +lemma quarkDoubletProj_comp_quarkDoubletIncl (i : Fin 3) : + (quarkDoubletProj i).comp (quarkDoubletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [quarkDoubletProj, quarkDoubletIncl] + +@[simp] +lemma upSingletProj_comp_upSingletIncl (i : Fin 3) : + (upSingletProj i).comp (upSingletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [upSingletProj, upSingletIncl] + +@[simp] +lemma downSingletProj_comp_downSingletIncl (i : Fin 3) : + (downSingletProj i).comp (downSingletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [downSingletProj, downSingletIncl] + +/-! + +### A.3. The action of the Lorentz group + +-/ + +/-! + +### A.4. Th action of the global gauge group + +-/ + +/-! + +### A.5. The action of Jet gauge group. + +-/ +end FermionSpace + +/-! + +## B. The fermionic jet algebra + +-/ + +/-- **The jet algebra of the Standard Model fermions**: the exterior product of the fermionic + algebras of the five species, realized as the fermionic algebra of their direct sum. Its + generators are the component functions `∂_s ψ_φ` and `∂_s ψ̄_φ` of every species and + generation, and any two of them anticommute — within a species and across species alike. + + This is the fermionic factor of the full Standard Model jet algebra; the gauge and Higgs + factors are bosonic and commute with it. -/ +abbrev FermionJetAlgebra : Type := FermionicAlgebra FermionSpace + +namespace FermionJetAlgebra + +/-! + +### B.1. The component functions of each species + +Each species and generation enters through its projection out of `FermionSpace`: a covector +on the species pulls back to a covector on the total target space, and thence to a generator +of the jet algebra. Their iterated derivatives `FermionicAlgebra.iteratedJetDeriv` are the +higher generators. + +-/ + +/-- The component functions of the `i`-th generation lepton doublet inside the Standard + Model jet algebra. -/ +noncomputable def ofLeptonDoublet (i : Fin 3) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.leptonDoubletProj i)) + +/-- The component functions of the `i`-th generation charged-lepton singlet. -/ +noncomputable def ofLeptonSinglet (i : Fin 3) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.leptonSingletProj i)) + +/-- The component functions of the `i`-th generation quark doublet. -/ +noncomputable def ofQuarkDoublet (i : Fin 3) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.quarkDoubletProj i)) + +/-- The component functions of the `i`-th generation up-type quark singlet. -/ +noncomputable def ofUpSinglet (i : Fin 3) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.upSingletProj i)) + +/-- The component functions of the `i`-th generation down-type quark singlet. -/ +noncomputable def ofDownSinglet (i : Fin 3) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.downSingletProj i)) + +/-- The conjugate component functions of the `i`-th generation lepton doublet. -/ +noncomputable def ofConjLeptonDoublet (i : Fin 3) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonDoubletProj i))) + +/-- The conjugate component functions of the `i`-th generation charged-lepton singlet. -/ +noncomputable def ofConjLeptonSinglet (i : Fin 3) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonSingletProj i))) + +/-- The conjugate component functions of the `i`-th generation quark doublet. -/ +noncomputable def ofConjQuarkDoublet (i : Fin 3) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.quarkDoubletProj i))) + +/-- The conjugate component functions of the `i`-th generation up-type quark singlet. -/ +noncomputable def ofConjUpSinglet (i : Fin 3) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.upSingletProj i))) + +/-- The conjugate component functions of the `i`-th generation down-type quark singlet. -/ +noncomputable def ofConjDownSinglet (i : Fin 3) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.downSingletProj i))) + +/-! + +### B.2. The exterior product decomposition + +`FermionicAlgebra.prodEquiv` identifies the fermionic algebra of a direct sum with the +graded tensor product of the two fermionic algebras. Applied repeatedly it exhibits the jet +algebra as the exterior product of the five species algebras, peeling off one species — all +three of its generations at once — at a time. It has to be stated one species at a time: +`GradedTensorProduct` carries no `GradedAlgebra` instance in Mathlib, so the fully nested +five-fold graded tensor product is not expressible as a type. + +-/ + +open scoped TensorProduct + +/-- The fermionic jet algebra as the exterior product of the three-generation + lepton-doublet algebra with the algebra of the remaining four species. -/ +noncomputable def exteriorProductLeptonDoublet : + FermionJetAlgebra ≃ₐ[ℂ] (FermionicAlgebra.evenOdd (Fin 3 → LeptonDoublet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × + (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet))) := + FermionicAlgebra.prodEquiv _ _ + +/-- The charged-lepton singlets split off the remaining three species. -/ +noncomputable def exteriorProductLeptonSinglet : + FermionicAlgebra ((Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × + (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet)) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (Fin 3 → LeptonSinglet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((Fin 3 → QuarkDoublet) × (Fin 3 → UpSinglet) × + (Fin 3 → DownSinglet))) := + FermionicAlgebra.prodEquiv _ _ + +/-- The quark doublets split off the two quark singlets. -/ +noncomputable def exteriorProductQuarkDoublet : + FermionicAlgebra ((Fin 3 → QuarkDoublet) × (Fin 3 → UpSinglet) × + (Fin 3 → DownSinglet)) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (Fin 3 → QuarkDoublet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((Fin 3 → UpSinglet) × (Fin 3 → DownSinglet))) := + FermionicAlgebra.prodEquiv _ _ + +/-- The two quark singlets as an exterior product. -/ +noncomputable def exteriorProductUpSinglet : + FermionicAlgebra ((Fin 3 → UpSinglet) × (Fin 3 → DownSinglet)) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (Fin 3 → UpSinglet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd (Fin 3 → DownSinglet)) := + FermionicAlgebra.prodEquiv _ _ + +end FermionJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean index e74c8a2d5..6b28fdab6 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean @@ -30,12 +30,14 @@ functoriality. Those live in the sibling files `LorentzAction`, `GaugeAction` an - `FermionicAlgebra` : the exterior algebra on the jet component space. - `FermionicAlgebra.adjoin_ι_eq_top` : the algebra is generated by the component functions. - `FermionicAlgebra.ofField`, `FermionicAlgebra.ofConjField` : the field and its conjugate. +- `FermionicAlgebra.comap` : the inclusion of a species, contravariant in the target space. ## iii. Table of contents - A. The fermionic algebra - A.1. The generators of the fermionic algebra - A.2. The field and its conjugate + - A.3. Inclusion of a species -/ @@ -129,6 +131,58 @@ lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule V)) : ofConjField φ = ExteriorAlgebra.ι ℂ ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace V) := rfl +/-! + +### A.3. Inclusion of a species + +A field valued in `V` that is one *species* among several — i.e. `V` is a summand of a +larger target space `U` — has its fermionic algebra sitting inside the fermionic algebra of +`U`. The inclusion is induced by the *projection* `U →ₗ[ℂ] V`, because component functions +are covectors on the target and therefore transpose. `comap` is that induced map, and it is +functorial and compatible with everything the algebra carries. + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The fermionic algebra is contravariant in the target space.** A linear map + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `FermionicAlgebra W →ₐ[ℂ] FermionicAlgebra V` + by pulling back component functions. Applied to a *projection* out of a multi-species target + space, this is the inclusion of one species' algebra into the whole. -/ +noncomputable def comap (f : V →ₗ[ℂ] W) : FermionicAlgebra W →ₐ[ℂ] FermionicAlgebra V := + ExteriorAlgebra.map (JetComponentSpace.comap f) + +@[simp] +lemma comap_ι (f : V →ₗ[ℂ] W) (x : JetComponentSpace W) : + comap f (ExteriorAlgebra.ι ℂ x) + = ExteriorAlgebra.ι ℂ (JetComponentSpace.comap f x) := by + rw [comap, ExteriorAlgebra.map_apply_ι] + +@[simp] +lemma comap_id : comap (LinearMap.id : V →ₗ[ℂ] V) = AlgHom.id ℂ (FermionicAlgebra V) := by + rw [comap, JetComponentSpace.comap_id, ExteriorAlgebra.map_id] + +/-- Functoriality: the order reverses, as it must for a contravariant construction. -/ +lemma comap_comp {U : Type} [AddCommGroup U] [Module ℂ U] (f : V →ₗ[ℂ] W) (g : W →ₗ[ℂ] U) : + comap (g.comp f) = (comap f).comp (comap g) := by + rw [comap, comap, comap, JetComponentSpace.comap_comp, ← ExteriorAlgebra.map_comp_map] + +/-- The inclusion sends a component function of the species to the corresponding component + function of the whole. -/ +@[simp] +lemma comap_ofField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ W) : + comap f (ofField φ) = ofField (φ ∘ₗ f) := by + rw [ofField_apply, comap_ι, ofField_apply] + congr 1 + +/-- The inclusion sends a conjugate component function of the species to the corresponding + conjugate component function of the whole. -/ +@[simp] +lemma comap_ofConjField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ (ConjModule W)) : + comap f (ofConjField φ) = ofConjField (φ ∘ₗ ConjModule.map f) := by + rw [ofConjField_apply, comap_ι, ofConjField_apply] + congr 1 + end FermionicAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean index 59429c9cd..b93f93377 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean @@ -33,12 +33,15 @@ all-orders Leibniz rule over the antidiagonal of the multiset. - `FermionicAlgebra.iteratedJetDeriv_mul` : the all-orders Leibniz rule. - `FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top` : the algebra is generated by the field, its conjugate, and their derivatives. +- `FermionicAlgebra.comap_jetDeriv` : the inclusion of a species commutes with the + derivative. ## iii. Table of contents - A. The formal total derivative on the fermionic algebra - B. The iterated total derivative - C. Generation by the field and its derivatives +- D. Compatibility with the inclusion of a species -/ @@ -369,6 +372,40 @@ theorem adjoin_iteratedJetDeriv_eq_top : rw [hx, map_add] exact add_mem (hhalf gField hbasisField x.1) (hhalf gConj hbasisConj x.2) +/-! + +## D. Compatibility with the inclusion of a species + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The inclusion of a species is a map of differential algebras.** Pulling back along a + map of target spaces commutes with the total derivative: the two act on different labels + of a component function. -/ +lemma comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra W) : + comap f (jetDeriv μ x) = jetDeriv μ (comap f x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => + rw [jetDeriv_algebraMap, map_zero, AlgHom.commutes, jetDeriv_algebraMap] + | ι v => + rw [jetDeriv_ι, comap_ι, comap_ι, jetDeriv_ι] + exact congrArg (ExteriorAlgebra.ι ℂ) + (DFunLike.congr_fun (JetComponentSpace.comap_jetDeriv f μ) v) + | mul a b ha hb => simp only [jetDeriv_mul, map_add, map_mul, ha, hb] + | add a b ha hb => simp only [map_add, ha, hb] + +/-- The inclusion of a species commutes with the iterated total derivative. -/ +lemma comap_iteratedJetDeriv (f : V →ₗ[ℂ] W) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : FermionicAlgebra W) : + comap f (iteratedJetDeriv s x) = iteratedJetDeriv s (comap f x) := by + induction s using Multiset.induction_on generalizing x with + | empty => rw [iteratedJetDeriv_zero, LinearMap.id_apply, iteratedJetDeriv_zero, + LinearMap.id_apply] + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, comap_jetDeriv, ih, + iteratedJetDeriv_cons, LinearMap.comp_apply] + end FermionicAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean new file mode 100644 index 000000000..b83f7e483 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.FermionicAlgebra.Basic +public import Mathlib.LinearAlgebra.CliffordAlgebra.Prod +public import Mathlib.LinearAlgebra.TensorProduct.Prod +/-! +# The fermionic algebra of a direct sum + +## i. Overview + +Two matter fields, valued in `V` and `W`, are jointly a single matter field valued in +`V × W`; its fermionic algebra is the **exterior product** of the two individual fermionic +algebras. That is the content of `FermionicAlgebra.prodEquiv`: an algebra equivalence + +`FermionicAlgebra (V × W) ≃ₐ[ℂ] (evenOdd V ᵍ⊗[ℂ] evenOdd W)` + +onto the graded tensor product of the two algebras with respect to their Fermi-parity +gradings. The graded — as opposed to ordinary — tensor product is what makes generators of +*different* species anticommute, as fermions must. + +The proof is two steps. First the component space of a direct sum is the direct sum of the +component spaces (`JetComponentSpace.prodEquiv`) — duals and conjugates both split. Then the +exterior algebra of a direct sum is the graded tensor product of the exterior algebras, +which is `CliffordAlgebra.prodEquiv` specialized to the zero quadratic form. + +## ii. Key results + +- `JetComponentSpace.prodEquiv` : the component space of a direct sum splits. +- `FermionicAlgebra.evenOdd` : the Fermi-parity grading. +- `FermionicAlgebra.prodEquiv` : the fermionic algebra of a direct sum is the exterior + product of the fermionic algebras. + +## iii. Table of contents + +- A. The component space of a direct sum +- B. The Fermi-parity grading +- C. The exterior product decomposition + +-/ + +@[expose] public section + +open scoped TensorProduct + +/-- Transport of an exterior algebra along a linear equivalence of the underlying module. -/ +noncomputable def ExteriorAlgebra.congr {R A B : Type*} [CommRing R] [AddCommGroup A] + [Module R A] [AddCommGroup B] [Module R B] (e : A ≃ₗ[R] B) : + ExteriorAlgebra R A ≃ₐ[R] ExteriorAlgebra R B := + CliffordAlgebra.equivOfIsometry ⟨e, fun _ => rfl⟩ + +namespace StandardModel + +variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ℂ W] + +/-! + +## A. The component space of a direct sum + +-/ + +/-- **The component space of a direct sum splits.** The component functions of a + `(V × W)`-valued field are those of a `V`-valued field together with those of a + `W`-valued field: the dual and the conjugate both distribute over the finite product, and + the derivative label is untouched. -/ +noncomputable def JetComponentSpace.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] : + JetComponentSpace (V × W) ≃ₗ[ℂ] JetComponentSpace V × JetComponentSpace W := + (LinearEquiv.prodCongr + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (Module.dualProdDualEquivDual ℂ V W).symm) + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (((ConjModule.prodEquiv (k := ℂ) (M := V) (N := W)).symm.dualMap).trans + (Module.dualProdDualEquivDual ℂ (ConjModule V) (ConjModule W)).symm))).trans <| + (LinearEquiv.prodCongr (TensorProduct.prodRight ℂ ℂ _ _ _) + (TensorProduct.prodRight ℂ ℂ _ _ _)).trans + (LinearEquiv.prodProdProdComm ℂ _ _ _ _) + +/-! + +## B. The Fermi-parity grading + +-/ + +/-- **The Fermi-parity grading** of the fermionic algebra: the `ZMod 2` grading of the + exterior algebra by the number of component functions in a monomial. An even element + commutes with everything; two odd elements anticommute. -/ +abbrev FermionicAlgebra.evenOdd (V : Type) [AddCommGroup V] [Module ℂ V] : + ZMod 2 → Submodule ℂ (FermionicAlgebra V) := + CliffordAlgebra.evenOdd (0 : QuadraticForm ℂ (JetComponentSpace V)) + +/-! + +## C. The exterior product decomposition + +-/ + +/-- **The fermionic algebra of a direct sum is the exterior product of the fermionic + algebras.** Two matter fields taken together are one field valued in the direct sum of + their target spaces, and its fermionic algebra is the graded tensor product of theirs. + + The tensor product must be the *graded* one `ᵍ⊗`: an ordinary `⊗[ℂ]` would make a + generator of the first field commute with a generator of the second, whereas fermionic + generators anticommute across species just as they do within one. -/ +noncomputable def FermionicAlgebra.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] : + FermionicAlgebra (V × W) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd V ᵍ⊗[ℂ] FermionicAlgebra.evenOdd W) := + (ExteriorAlgebra.congr (JetComponentSpace.prodEquiv V W)).trans <| + (CliffordAlgebra.equivOfIsometry + (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace V × JetComponentSpace W))) + (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace V)).prod + (0 : QuadraticForm ℂ (JetComponentSpace W))) + ⟨LinearEquiv.refl ℂ _, fun _ => by simp⟩).trans + (CliffordAlgebra.prodEquiv _ _) + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean index 66573e88a..937283152 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean @@ -41,6 +41,7 @@ The construction needs two hypotheses on the jet action `rep`: - `JetComponentSpace.jetDeriv` : the shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the label. - `JetComponentSpace.jetDeriv_comm` : the shifts in different directions commute. - `JetComponentSpace.repLorentzGroup_jetDeriv` : the shift is a Lorentz vector. +- `JetComponentSpace.comap` : functoriality, contravariant in the target space. -/ @@ -676,4 +677,66 @@ lemma JetComponentSpace.repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2 JetComponentSpace.jetDeriv_snd] exact repLorentzGroup_tprod_mulRight_jetSymbol _ Λ μ v.2 +/-! + +## Functoriality in the target space + +-/ + +variable {W : Type _} [AddCommGroup W] [Module ℂ W] + +/-- **The component space is contravariant in the target space.** A linear map `f : V →ₗ W` + of target spaces pulls the component functions of a `W`-valued field back to component + functions of a `V`-valued field: a component function is a *covector* on the target, so it + transposes. The derivative label is untouched, and the conjugate half transposes the + conjugate of `f`. -/ +noncomputable def JetComponentSpace.comap (f : V →ₗ[ℂ] W) : + JetComponentSpace W →ₗ[ℂ] JetComponentSpace V := + LinearMap.prodMap + (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + (TensorProduct.map LinearMap.id (Module.Dual.transpose (ConjModule.map f))) + +@[simp] +lemma JetComponentSpace.comap_fst_tmul (f : V →ₗ[ℂ] W) (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ W) (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule W)) : + (JetComponentSpace.comap f (a ⊗ₜ[ℂ] φ, y)).1 = a ⊗ₜ[ℂ] (φ ∘ₗ f) := rfl + +@[simp] +lemma JetComponentSpace.comap_snd_tmul (f : V →ₗ[ℂ] W) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ W) (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ (ConjModule W)) : + (JetComponentSpace.comap f (x, a ⊗ₜ[ℂ] φ)).2 = a ⊗ₜ[ℂ] (φ ∘ₗ ConjModule.map f) := rfl + +@[simp] +lemma JetComponentSpace.comap_id : + JetComponentSpace.comap (LinearMap.id : V →ₗ[ℂ] V) = LinearMap.id := by + rw [JetComponentSpace.comap, + show Module.Dual.transpose (LinearMap.id : V →ₗ[ℂ] V) = LinearMap.id from rfl, + show ConjModule.map (LinearMap.id : V →ₗ[ℂ] V) = LinearMap.id from rfl, + show Module.Dual.transpose (LinearMap.id : ConjModule V →ₗ[ℂ] ConjModule V) + = LinearMap.id from rfl, TensorProduct.map_id, TensorProduct.map_id] + rfl + +/-- Functoriality: pulling back along `g ∘ f` is pulling back along `g` and then along `f`. + The order reverses, as it must for a contravariant construction. -/ +lemma JetComponentSpace.comap_comp {U : Type _} [AddCommGroup U] [Module ℂ U] + (f : V →ₗ[ℂ] W) (g : W →ₗ[ℂ] U) : + JetComponentSpace.comap (g.comp f) + = (JetComponentSpace.comap f).comp (JetComponentSpace.comap g) := by + rw [JetComponentSpace.comap, JetComponentSpace.comap, JetComponentSpace.comap, + LinearMap.prodMap_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp, + LinearMap.id_comp] + rfl + +/-- **The pullback commutes with the jet derivative.** The two act on different tensor + factors — the derivative label and the target index — so an inclusion of species is a map + of differential algebras. -/ +lemma JetComponentSpace.comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) : + (JetComponentSpace.comap f).comp (JetComponentSpace.jetDeriv μ) + = (JetComponentSpace.jetDeriv μ).comp (JetComponentSpace.comap f) := by + rw [JetComponentSpace.comap, JetComponentSpace.jetDeriv, JetComponentSpace.jetDeriv, + LinearMap.prodMap_comp, LinearMap.prodMap_comp, ← TensorProduct.map_comp, + ← TensorProduct.map_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp] + simp only [LinearMap.comp_id, LinearMap.id_comp] + end StandardModel From 522da8f3489a4d6887e99adf43fdfec88de63ddb Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 21 Aug 2026 05:17:17 +0100 Subject: [PATCH 178/254] feat: AI filling other algebras Got claude to fill in details of the other algebras. Co-Authored-By: Claude --- Physlib.lean | 21 + Physlib/Mathematics/SymmetricAlgebra.lean | 258 +++++ Physlib/Particles/LagrangianTheory/Basic.lean | 55 + .../StandardModel/Fermions/DownSinglet.lean | 71 ++ .../Fermions/JetAlgebra/Basic.lean | 543 +++++++++ .../StandardModel/Fermions/LeptonDoublet.lean | 343 +++--- .../Fermions/LeptonSinglet/Basic.lean | 85 ++ .../StandardModel/Fermions/QuarkDoublet.lean | 281 +++++ .../StandardModel/Fermions/UpSinglet.lean | 192 ++++ .../StandardModel/GaugeAlgebra/Basic.lean | 91 ++ .../GaugeBosons/GaugeFieldAlglebra/Basic.lean | 14 - .../GaugeBosons/GaugeJetAlgebra/Basic.lean | 257 +++++ .../GaugeJetAlgebra/GaugeAction.lean | 1002 +++++++++++++++++ .../GaugeJetAlgebra/Invariants.lean | 133 +++ .../GaugeBosons/GaugeJetAlgebra/JetDeriv.lean | 370 ++++++ .../GaugeJetAlgebra/LorentzAction.lean | 307 +++++ .../GaugeBosons/GaugeJetAlgebra/MassDim.lean | 148 +++ .../HiggsBoson/JetAlgebra/Basic.lean | 321 ++++++ .../StandardModel/JetAlgebra/Basic.lean | 390 ++----- .../StandardModel/JetAlgebra/GaugeAction.lean | 111 ++ .../StandardModel/JetAlgebra/Invariants.lean | 186 +++ .../StandardModel/JetAlgebra/JetDeriv.lean | 275 +++++ .../JetAlgebra/LorentzAction.lean | 196 ++++ .../StandardModel/JetAlgebra/MassDim.lean | 68 ++ .../Matter/BosonicAlgebra/Basic.lean | 183 +++ .../Matter/BosonicAlgebra/GaugeAction.lean | 241 ++++ .../Matter/BosonicAlgebra/JetDeriv.lean | 332 ++++++ .../Matter/BosonicAlgebra/LorentzAction.lean | 184 +++ .../Matter/BosonicAlgebra/MassDim.lean | 128 +++ .../Matter/BosonicAlgebra/Prod.lean | 62 + .../Matter/FermionicAlgebra/MassDim.lean | 131 +++ .../Matter/FermionicAlgebra/Prod.lean | 21 +- .../Matter/JetComponentSpace/Basic.lean | 109 ++ Physlib/Relativity/IsLorentzDeriv.lean | 7 +- 34 files changed, 6633 insertions(+), 483 deletions(-) create mode 100644 Physlib/Mathematics/SymmetricAlgebra.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/JetDeriv.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/LorentzAction.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/MassDim.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean diff --git a/Physlib.lean b/Physlib.lean index 1921ead65..35041102a 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -131,6 +131,7 @@ public import Physlib.Mathematics.Resolvent public import Physlib.Mathematics.SO3.Basic public import Physlib.Mathematics.SchurTriangulation public import Physlib.Mathematics.SpecialFunctions.PhysHermite +public import Physlib.Mathematics.SymmetricAlgebra public import Physlib.Mathematics.TensorProduct public import Physlib.Mathematics.Trigonometry.Tanh public import Physlib.Mathematics.VariationalCalculus.Basic @@ -208,6 +209,7 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.Lin public import Physlib.Particles.StandardModel.AnomalyCancellation.Permutations public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.Basic @@ -218,15 +220,34 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra. public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetComponentSpace public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invariants +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential +public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.Potential public import Physlib.Particles.StandardModel.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.JetAlgebra.Invariants +public import Physlib.Particles.StandardModel.JetAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.JetAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.JetAlgebra.MassDim +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Basic +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Representations diff --git a/Physlib/Mathematics/SymmetricAlgebra.lean b/Physlib/Mathematics/SymmetricAlgebra.lean new file mode 100644 index 000000000..b196e6c54 --- /dev/null +++ b/Physlib/Mathematics/SymmetricAlgebra.lean @@ -0,0 +1,258 @@ +/- +Copyright (c) 2026 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 Mathlib.LinearAlgebra.SymmetricAlgebra.Basic +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.Algebra.TrivSqZeroExt.Basic +/-! +# Functoriality of the symmetric algebra + +## i. Overview + +Mathlib's `SymmetricAlgebra` carries the universal property `SymmetricAlgebra.lift` but no +functorial API. This file provides it: the algebra homomorphism induced by a linear map, the +algebra equivalence induced by a linear equivalence, generation by the degree-one elements, +and the decomposition of the symmetric algebra of a direct sum as a tensor product — the +bosonic analogue of `CliffordAlgebra.prodEquiv`, with the ordinary rather than the graded +tensor product because everything commutes. + +## ii. Key results + +- `SymmetricAlgebra.map` : the algebra homomorphism induced by a linear map. +- `SymmetricAlgebra.congr` : the algebra equivalence induced by a linear equivalence. +- `SymmetricAlgebra.adjoin_range_ι` : the symmetric algebra is generated by `ι`. +- `SymmetricAlgebra.prodEquiv` : the symmetric algebra of a direct sum is the tensor + product of the symmetric algebras. + +## iii. Table of contents + +- A. Functoriality of the symmetric algebra +- B. Generation by the degree-one elements +- C. The symmetric algebra of a direct sum +- D. The derivation extending a linear endomorphism + +-/ + +@[expose] public section + +namespace SymmetricAlgebra + +variable {R M N P : Type*} [CommRing R] [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] [AddCommGroup P] [Module R P] + +/-! + +## A. Functoriality of the symmetric algebra + +-/ + +/-- The algebra homomorphism between symmetric algebras induced by a linear map of the + underlying modules. -/ +def map (f : M →ₗ[R] N) : SymmetricAlgebra R M →ₐ[R] SymmetricAlgebra R N := + lift ((ι R N) ∘ₗ f) + +@[simp] +lemma map_apply_ι (f : M →ₗ[R] N) (x : M) : map f (ι R M x) = ι R N (f x) := + lift_ι_apply _ x + +@[simp] +lemma map_id : map (LinearMap.id : M →ₗ[R] M) = AlgHom.id R (SymmetricAlgebra R M) := + algHom_ext (LinearMap.ext fun x => by simp) + +lemma map_comp_map (f : N →ₗ[R] P) (g : M →ₗ[R] N) : + (map f).comp (map g) = map (f ∘ₗ g) := + algHom_ext (LinearMap.ext fun x => by simp) + +/-- The algebra equivalence between symmetric algebras induced by a linear equivalence of + the underlying modules. -/ +def congr (e : M ≃ₗ[R] N) : SymmetricAlgebra R M ≃ₐ[R] SymmetricAlgebra R N := + AlgEquiv.ofAlgHom (map e.toLinearMap) (map e.symm.toLinearMap) + (by rw [map_comp_map]; simp) + (by rw [map_comp_map]; simp) + +@[simp] +lemma congr_apply_ι (e : M ≃ₗ[R] N) (x : M) : congr e (ι R M x) = ι R N (e x) := + map_apply_ι _ x + +/-! + +## B. Generation by the degree-one elements + +-/ + +/-- The symmetric algebra is generated, as an `R`-algebra, by the degree-one elements. -/ +@[simp] +lemma adjoin_range_ι : + Algebra.adjoin R (Set.range (ι R M)) = (⊤ : Subalgebra R (SymmetricAlgebra R M)) := by + have h : ∀ x : SymmetricAlgebra R M, x ∈ Algebra.adjoin R (Set.range (ι R M)) := by + intro x + induction x using SymmetricAlgebra.induction with + | algebraMap r => exact Subalgebra.algebraMap_mem _ r + | ι x => exact Algebra.subset_adjoin ⟨x, rfl⟩ + | mul a b ha hb => exact mul_mem ha hb + | add a b ha hb => exact add_mem ha hb + exact top_le_iff.mp fun x _ => h x + +/-! + +## C. The symmetric algebra of a direct sum + +The symmetric algebra of `M × N` is the tensor product of the symmetric algebras of the +summands. Unlike the exterior-algebra analogue this is the *ordinary* tensor product: the +generators of the two factors commute, as bosonic generators must. + +-/ + +open TensorProduct + +/-- The forward half of `prodEquiv`: a generator `(m, n)` is sent to + `ι m ⊗ 1 + 1 ⊗ ι n`. -/ +noncomputable def prodToTensor : + SymmetricAlgebra R (M × N) →ₐ[R] SymmetricAlgebra R M ⊗[R] SymmetricAlgebra R N := + lift (LinearMap.coprod + ((Algebra.TensorProduct.includeLeft.toLinearMap : SymmetricAlgebra R M →ₗ[R] _) ∘ₗ ι R M) + ((Algebra.TensorProduct.includeRight.toLinearMap : SymmetricAlgebra R N →ₗ[R] _) ∘ₗ ι R N)) + +@[simp] +lemma prodToTensor_ι (x : M × N) : + prodToTensor (ι R (M × N) x) + = ι R M x.1 ⊗ₜ[R] 1 + (1 : SymmetricAlgebra R M) ⊗ₜ[R] ι R N x.2 := + lift_ι_apply _ x + +/-- The backward half of `prodEquiv`: the two inclusions of the factors, multiplied + together. -/ +noncomputable def tensorToProd : + SymmetricAlgebra R M ⊗[R] SymmetricAlgebra R N →ₐ[R] SymmetricAlgebra R (M × N) := + Algebra.TensorProduct.lift (map (LinearMap.inl R M N)) (map (LinearMap.inr R M N)) + fun _ _ => Commute.all _ _ + +@[simp] +lemma tensorToProd_tmul (a : SymmetricAlgebra R M) (b : SymmetricAlgebra R N) : + tensorToProd (a ⊗ₜ[R] b) = map (LinearMap.inl R M N) a * map (LinearMap.inr R M N) b := + Algebra.TensorProduct.lift_tmul _ _ _ _ _ + +/-- **The symmetric algebra of a direct sum is the tensor product of the symmetric + algebras.** Two bosonic fields taken together are one field valued in the direct sum of + their target spaces; their generators commute, so the ordinary tensor product suffices — + no grading is needed, in contrast to the exterior-algebra analogue. -/ +noncomputable def prodEquiv : + SymmetricAlgebra R (M × N) ≃ₐ[R] SymmetricAlgebra R M ⊗[R] SymmetricAlgebra R N := + AlgEquiv.ofAlgHom prodToTensor tensorToProd + (Algebra.TensorProduct.ext + (algHom_ext (LinearMap.ext fun m => by + simp [Algebra.TensorProduct.includeLeft_apply])) + (algHom_ext (LinearMap.ext fun n => by + simp [Algebra.TensorProduct.includeRight_apply]))) + (algHom_ext (LinearMap.ext fun x => by + have hx : ((x.1, (0 : N)) : M × N) + ((0 : M), x.2) = x := by + refine Prod.ext ?_ ?_ <;> simp + calc (tensorToProd.comp prodToTensor) (ι R (M × N) x) + = tensorToProd (ι R M x.1 ⊗ₜ[R] 1 + (1 : SymmetricAlgebra R M) ⊗ₜ[R] ι R N x.2) := by + rw [AlgHom.comp_apply, prodToTensor_ι] + _ = ι R (M × N) (x.1, 0) + ι R (M × N) (0, x.2) := by + rw [map_add, tensorToProd_tmul, tensorToProd_tmul, map_one, map_one, mul_one, + one_mul, map_apply_ι, map_apply_ι] + rfl + _ = ι R (M × N) x := by rw [← map_add, hx] + _ = (AlgHom.id R (SymmetricAlgebra R (M × N))) (ι R (M × N) x) := rfl)) + +@[simp] +lemma prodEquiv_ι (x : M × N) : + prodEquiv (ι R (M × N) x) + = ι R M x.1 ⊗ₜ[R] 1 + (1 : SymmetricAlgebra R M) ⊗ₜ[R] ι R N x.2 := + prodToTensor_ι x + +/-! + +## D. The derivation extending a linear endomorphism + +A linear endomorphism `d` of `M` extends uniquely to a derivation of the symmetric algebra: +the map obeying the Leibniz rule whose value on a generator `ι x` is `ι (d x)`. It is built +by lifting the generator map `ι x ↦ (ι x, ι (d x))` to an algebra homomorphism into the +trivial square-zero extension and taking the second component. + +-/ + +section Derivation + +variable (d : M →ₗ[R] M) + +/-- The lift of the derivation extending `d` to the trivial square-zero extension of the + symmetric algebra: the algebra homomorphism `x ↦ (x, derivationOfLinear d x)`. -/ +noncomputable def derivationHom : + SymmetricAlgebra R M →ₐ[R] + TrivSqZeroExt (SymmetricAlgebra R M) (SymmetricAlgebra R M) := + lift + { toFun := fun x => (ι R M x, ι R M (d x)) + map_add' := fun x y => by simp only [map_add]; rfl + map_smul' := fun c x => by simp only [map_smul, RingHom.id_apply]; rfl } + +@[simp] +lemma derivationHom_ι (x : M) : + derivationHom d (ι R M x) = (ι R M x, ι R M (d x)) := + lift_ι_apply _ x + +/-- The first component of the square-zero lift is the identity. -/ +@[simp] +lemma derivationHom_fst (x : SymmetricAlgebra R M) : (derivationHom d x).fst = x := by + have h : (TrivSqZeroExt.fstHom R (SymmetricAlgebra R M) (SymmetricAlgebra R M)).comp + (derivationHom d) = AlgHom.id R (SymmetricAlgebra R M) := + algHom_ext (LinearMap.ext fun x => by simp) + exact DFunLike.congr_fun h x + +/-- **The derivation of the symmetric algebra extending a linear endomorphism** `d` of `M`: + the map obeying the Leibniz rule whose value on a generator `ι x` is `ι (d x)`. -/ +noncomputable def derivationOfLinear : SymmetricAlgebra R M →ₗ[R] SymmetricAlgebra R M where + toFun x := (derivationHom d x).snd + map_add' x y := congrArg TrivSqZeroExt.snd (map_add (derivationHom d) x y) + map_smul' c x := congrArg TrivSqZeroExt.snd (map_smul (derivationHom d) c x) + +@[simp] +lemma derivationOfLinear_ι (x : M) : + derivationOfLinear d (ι R M x) = ι R M (d x) := by + rw [show derivationOfLinear d (ι R M x) = (derivationHom d (ι R M x)).snd from rfl, + derivationHom_ι] + rfl + +@[simp] +lemma derivationOfLinear_one : derivationOfLinear d (1 : SymmetricAlgebra R M) = 0 := + congrArg TrivSqZeroExt.snd (map_one (derivationHom d)) + +@[simp] +lemma derivationOfLinear_algebraMap (r : R) : + derivationOfLinear d (algebraMap R (SymmetricAlgebra R M) r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, derivationOfLinear_one, smul_zero] + +/-- The Leibniz rule for the derivation extending `d`. -/ +lemma derivationOfLinear_mul (x y : SymmetricAlgebra R M) : + derivationOfLinear d (x * y) + = derivationOfLinear d x * y + x * derivationOfLinear d y := by + have h : derivationOfLinear d (x * y) = + (derivationHom d x).fst * derivationOfLinear d y + + derivationOfLinear d x * (derivationHom d y).fst := + congrArg TrivSqZeroExt.snd (map_mul (derivationHom d) x y) + rw [derivationHom_fst, derivationHom_fst] at h + exact h.trans (add_comm _ _) + +/-- Derivations extending commuting endomorphisms commute. -/ +lemma derivationOfLinear_comm_apply {d₁ d₂ : M →ₗ[R] M} (h : d₁ ∘ₗ d₂ = d₂ ∘ₗ d₁) + (x : SymmetricAlgebra R M) : + derivationOfLinear d₁ (derivationOfLinear d₂ x) + = derivationOfLinear d₂ (derivationOfLinear d₁ x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => simp + | ι v => + simp only [derivationOfLinear_ι] + exact congrArg (ι R M) (DFunLike.congr_fun h v) + | mul x y hx hy => + simp only [derivationOfLinear_mul, map_add, hx, hy] + exact add_add_add_comm _ _ _ _ + | add x y hx hy => simp only [map_add, hx, hy] + +end Derivation + +end SymmetricAlgebra diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index ecc019590..aabcdf66e 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -802,6 +802,61 @@ noncomputable def dualRealJetAlgebraBasis : Basis (Multiset (Fin 1 ⊕ Fin 3)) ℝ (SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) := Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.reindex Multiset.toFinsupp.toEquiv.symm +/-- The multiset basis of the dual derivative symbols, as a basis vector of the + symmetric algebra at the corresponding multi-index. -/ +lemma dualRealJetAlgebraBasis_apply (s : Multiset (Fin 1 ⊕ Fin 3)) : + dualRealJetAlgebraBasis s = + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by + rw [dualRealJetAlgebraBasis, Basis.reindex_apply, Equiv.symm_symm] + rfl + +/-- The multiset basis vectors of the real dual derivative slots multiply by adding the + multisets. -/ +lemma dualRealJetAlgebraBasis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : + dualRealJetAlgebraBasis s * dualRealJetAlgebraBasis t = + dualRealJetAlgebraBasis (s + t) := by + rw [dualRealJetAlgebraBasis_apply, dualRealJetAlgebraBasis_apply, + dualRealJetAlgebraBasis_apply, map_add] + simp only [Basis.symmetricAlgebra, Basis.map_apply, + show ∀ p, (SymmetricAlgebra.equivMvPolynomial + Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = + (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p + from fun _ => rfl, + ← map_mul, MvPolynomial.coe_basisMonomials] + simp only [MvPolynomial.monomial_mul, mul_one] + +/-- The multiset basis of the real dual derivative slots at the empty multiset is the + unit. -/ +lemma dualRealJetAlgebraBasis_nil : + dualRealJetAlgebraBasis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by + rw [dualRealJetAlgebraBasis_apply, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp, + Basis.symmetricAlgebra, Basis.map_apply, + show (SymmetricAlgebra.equivMvPolynomial + Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv + ((MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) 0) = + (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm + ((MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) 0) from rfl, + show (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) + = 1 from by + rw [MvPolynomial.coe_basisMonomials] + show MvPolynomial.monomial 0 1 = 1 + rw [MvPolynomial.monomial_zero', MvPolynomial.C_1], + map_one] + +/-- The multiset basis of the real dual derivative slots at a singleton index. -/ +lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : + dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis μ) := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (Finsupp.single μ 1) = + MvPolynomial.X μ := rfl + rw [dualRealJetAlgebraBasis, Basis.reindex_apply, Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + Finsupp.single μ 1 by simp, + Basis.symmetricAlgebra, Basis.map_apply, h] + simp + noncomputable def RealBosonJetComponentSpace.basis : Basis L.RealBosonJetGenerator ℝ L.RealBosonJetComponentSpace := (dualRealJetAlgebraBasis.tensorProduct diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index d5a2dc806..863337e45 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -123,6 +123,10 @@ noncomputable def basis : Module.Basis (Fin 2 × Fin 3) ℂ DownSinglet := (Fermion.RightHandedWeyl.basis.tensorProduct (EuclideanSpace.basisFun (Fin 3) ℂ).toBasis).map valLinEquiv.symm +instance : Module.Finite ℂ DownSinglet := Module.Finite.of_basis basis + +instance : Module.Free ℂ DownSinglet := Module.Free.of_basis basis + /-! ## C. Lorentz action @@ -391,6 +395,73 @@ noncomputable def repJetGaugeGroupI : ext d x simp +/-- The identification of the jets of the down-type singlet intertwines multiplication by +a scalar jet with the `JetRing`-scalar action on the colour coordinates. -/ +lemma jetValLinEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] DownSinglet) : + jetValLinEquiv (χ • z) + = Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 3)) χ).restrictScalars ℂ) + (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [smul_add, map_add, ha, hb, map_add, map_add] + | tmul f x => + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero, + smul_zero, map_zero, map_zero] + | tmul ψ c => + rw [TensorProduct.smul_tmul', smul_eq_mul, + show jetValLinEquiv ((χ * f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (χ * f)) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + show Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 3)) χ).restrictScalars ℂ) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f)) + = ψ ⊗ₜ[ℂ] (χ • WithLp.toLp 2 fun i => c.ofLp i • f) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + show c.ofLp i • (χ * f) = χ * (c.ofLp i • f) + rw [Algebra.mul_smul_comm] + | add a b ha hb => + rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, smul_add, map_add, ha, hb, map_add, map_add] + +/-- **The jet gauge action on the jets of the down-type singlet is fibrewise**: it +commutes with multiplication by scalar jets, acting on the values of the field over the +identity on spacetime. -/ +lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) + (z : JetRing ⊗[ℂ] DownSinglet) : + repJetGaugeGroupI U (χ • z) = χ • repJetGaugeGroupI U z := by + set S : Module.End JetRing (EuclideanSpace JetRing (Fin 3)) := + LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 3)) χ with hS + set M : Module.End JetRing (EuclideanSpace JetRing (Fin 3)) := + (Matrix.toLpLinAlgEquiv 2 + (((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) : + Module.End JetRing (EuclideanSpace JetRing (Fin 3))) with hM + have hMS : M * S = S * M := LinearMap.ext fun e => by + simp only [Module.End.mul_apply, hS, LinearMap.lsmul_apply, map_smul] + apply jetValLinEquiv.injective + rw [show repJetGaugeGroupI U (χ • z) + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.RightHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv (χ • z))) from rfl, + LinearEquiv.apply_symm_apply, jetValLinEquiv_smul, + show repJetGaugeGroupI U z + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.RightHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv z)) from rfl, + jetValLinEquiv_smul, LinearEquiv.apply_symm_apply, ← Module.End.mul_apply, + ← Module.End.mul_apply, ← map_mul, ← map_mul, + show M.restrictScalars ℂ * S.restrictScalars ℂ = (M * S).restrictScalars ℂ from rfl, + show S.restrictScalars ℂ * M.restrictScalars ℂ = (S * M).restrictScalars ℂ from rfl, + hMS] + /-- On jets of constant gauge transformations the jet action reduces to the global gauge action on the fibre: the `(3, 1)_{-2}` action on the down-singlet factor, and the trivial action on the jet ring. -/ diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean new file mode 100644 index 000000000..f45156512 --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean @@ -0,0 +1,543 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.FermionicAlgebra.Prod +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.Fermions.DownSinglet +/-! +# The fermionic jet algebra of the Standard Model + +## i. Overview + +The jet algebra of the Standard Model is the algebra in which a Lagrangian lives: the free +algebra on the component functions of every field and all their spacetime derivatives, +subject only to the statistics of the fields. + +This file builds its fermionic factor, `FermionJetAlgebra`; the bosonic factors — the gauge +fields and the Higgs — commute with everything and will enter as separate tensor factors. + +The Standard Model carries five fermion species — the lepton doublet, the charged-lepton +singlet, the quark doublet, and the up- and down-type quark singlets — each in three +generations, and the fermionic jet algebra is the *exterior product* of their individual +fermionic algebras: generators anticommute, and they do so **across species and generations +as well as within a species**, since all of them are fermionic. + +That exterior product is *realized* here as a single exterior algebra on the direct sum of +the fifteen target spaces, and then *identified* with the graded tensor product of the +species algebras by `FermionicAlgebra.prodEquiv`, applied once per species +(`FermionJetAlgebra.exteriorProductLeptonDoublet` and its siblings below). The +identification is genuine, not a convention: the exterior algebra of a direct sum is the +graded (super) tensor product of the exterior algebras of the summands. An ordinary tensor +product `⊗[ℂ]` would instead make generators of different species *commute*, which is wrong +for fermions. + +The direct sum is taken as the definition rather than the graded tensor product because +Mathlib's `GradedTensorProduct` carries no `GradedAlgebra` instance, so a graded tensor +product of three or more factors cannot currently be written down as a type; the peeled +form, one species at a time, is as far as the type-level statement goes. Working inside a +single `ExteriorAlgebra` also keeps every algebraic class projecting from one root, and lets +the whole `FermionicAlgebra` API — the Lorentz action, the jet gauge action, the total +derivative and its iterates — apply to `FermionJetAlgebra` unchanged. + +## ii. Key results + +- `FermionSpace` : the total target space of the Standard Model fermions. +- `FermionSpace.leptonDoubletProj`, … : the projections onto a species and generation. +- `FermionSpace.leptonDoubletIncl`, … : the inclusions of a species and generation. +- `FermionJetAlgebra` : the jet algebra of the Standard Model fermions. +- `FermionJetAlgebra.ofLeptonDoublet`, … : the component functions of each species and + generation. +- `FermionJetAlgebra.exteriorProductLeptonDoublet`, … : the jet algebra as the exterior + product of the species algebras. + +## iii. Table of contents + +- A. The target space of the Standard Model fermions + - A.1. The projections onto the species + - A.2. The inclusions onto the species + - A.3. The action of the Lorentz group + - A.4. The action of the global gauge group + - A.5. The action of the jet gauge group +- B. The fermionic jet algebra + - B.1. The component functions of each species + - B.2. The exterior product decomposition + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The target space of the Standard Model fermions + +-/ + +/-- The total target space of the Standard Model fermions: the direct sum of three + generations each of the lepton doublet, the charged-lepton singlet, the quark doublet, and + the up- and down-type quark singlets. The three generations of a species sit together, so + that a species can be split off the jet algebra as a single exterior factor. -/ +abbrev FermionSpace : Type := + (Fin 3 → LeptonDoublet) × (Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × + (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet) + +namespace FermionSpace + +/-! + +### A.1. The projections onto the species + +The component functions of a field are *covectors* on its target space, so it is the +projections — not the inclusions — that carry the individual species into the jet algebra. +Each projection takes a generation index `i : Fin 3`. + +-/ + +/-- The projection onto the `i`-th generation of the lepton doublet. -/ +def leptonDoubletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] LeptonDoublet := + (LinearMap.proj i).comp (LinearMap.fst ℂ _ _) + +/-- The projection onto the `i`-th generation of the charged-lepton singlet. -/ +def leptonSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] LeptonSinglet := + (LinearMap.proj i).comp ((LinearMap.fst ℂ _ _).comp (LinearMap.snd ℂ _ _)) + +/-- The projection onto the `i`-th generation of the quark doublet. -/ +def quarkDoubletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] QuarkDoublet := + (LinearMap.proj i).comp + ((LinearMap.fst ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _))) + +/-- The projection onto the `i`-th generation of the up-type quark singlet. -/ +def upSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] UpSinglet := + (LinearMap.proj i).comp ((LinearMap.fst ℂ _ _).comp + ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _)))) + +/-- The projection onto the `i`-th generation of the down-type quark singlet. -/ +def downSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] DownSinglet := + (LinearMap.proj i).comp ((LinearMap.snd ℂ _ _).comp + ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _)))) + +/-! + +### A.2. The inclusions onto the species + +The one-sided inverses of the projections: the inclusion of a single species and generation +as a summand of the total target space, zero in every other slot. `…Proj i ∘ …Incl i` is the +identity, and every other composite of a projection with an inclusion vanishes. + +-/ + +/-- The inclusion of the `i`-th generation lepton doublet as a summand. -/ +def leptonDoubletIncl (i : Fin 3) : LeptonDoublet →ₗ[ℂ] FermionSpace := + (LinearMap.inl ℂ _ _).comp (LinearMap.single ℂ (fun _ : Fin 3 => LeptonDoublet) i) + +/-- The inclusion of the `i`-th generation charged-lepton singlet as a summand. -/ +def leptonSingletIncl (i : Fin 3) : LeptonSinglet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inl ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => LeptonSinglet) i)) + +/-- The inclusion of the `i`-th generation quark doublet as a summand. -/ +def quarkDoubletIncl (i : Fin 3) : QuarkDoublet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp + ((LinearMap.inl ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => QuarkDoublet) i))) + +/-- The inclusion of the `i`-th generation up-type quark singlet as a summand. -/ +def upSingletIncl (i : Fin 3) : UpSinglet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp + ((LinearMap.inl ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => UpSinglet) i)))) + +/-- The inclusion of the `i`-th generation down-type quark singlet as a summand. -/ +def downSingletIncl (i : Fin 3) : DownSinglet →ₗ[ℂ] FermionSpace := + (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp + ((LinearMap.inr ℂ _ _).comp + (LinearMap.single ℂ (fun _ : Fin 3 => DownSinglet) i)))) + +@[simp] +lemma leptonDoubletProj_comp_leptonDoubletIncl (i : Fin 3) : + (leptonDoubletProj i).comp (leptonDoubletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [leptonDoubletProj, leptonDoubletIncl] + +@[simp] +lemma leptonSingletProj_comp_leptonSingletIncl (i : Fin 3) : + (leptonSingletProj i).comp (leptonSingletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [leptonSingletProj, leptonSingletIncl] + +@[simp] +lemma quarkDoubletProj_comp_quarkDoubletIncl (i : Fin 3) : + (quarkDoubletProj i).comp (quarkDoubletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [quarkDoubletProj, quarkDoubletIncl] + +@[simp] +lemma upSingletProj_comp_upSingletIncl (i : Fin 3) : + (upSingletProj i).comp (upSingletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [upSingletProj, upSingletIncl] + +@[simp] +lemma downSingletProj_comp_downSingletIncl (i : Fin 3) : + (downSingletProj i).comp (downSingletIncl i) = LinearMap.id := + LinearMap.ext fun _ => by simp [downSingletProj, downSingletIncl] + +/-! + +### A.3. The action of the Lorentz group + +-/ + +/-- The pointwise representation on a finite power of the representation space. -/ +noncomputable def _root_.Representation.pi {k G V : Type*} (ι : Type*) [CommSemiring k] + [Monoid G] [AddCommMonoid V] [Module k V] (ρ : Representation k G V) : + Representation k G (ι → V) where + toFun g := LinearMap.piMap fun _ => ρ g + map_one' := by + refine LinearMap.ext fun v => funext fun i => ?_ + simp + map_mul' g₁ g₂ := by + refine LinearMap.ext fun v => funext fun i => ?_ + simp [Module.End.mul_apply] + +open Matrix MatrixGroups in +/-- The Lorentz action on the total fermionic target space: each species and generation + transforms in its own Lorentz representation. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) FermionSpace := + ((LeptonDoublet.repLorentzGroup.pi (Fin 3)).prod + ((LeptonSinglet.repLorentzGroup.pi (Fin 3)).prod + ((QuarkDoublet.repLorentzGroup.pi (Fin 3)).prod + ((UpSinglet.repLorentzGroup.pi (Fin 3)).prod + (DownSinglet.repLorentzGroup.pi (Fin 3)))))) + +/-! + +### A.4. The action of the global gauge group + +-/ + +/-- The global gauge action on the total fermionic target space: each species and + generation transforms in its own representation of the gauge group. -/ +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI FermionSpace := + ((LeptonDoublet.repGaugeGroupI.pi (Fin 3)).prod + ((LeptonSinglet.repGaugeGroupI.pi (Fin 3)).prod + ((QuarkDoublet.repGaugeGroupI.pi (Fin 3)).prod + ((UpSinglet.repGaugeGroupI.pi (Fin 3)).prod + (DownSinglet.repGaugeGroupI.pi (Fin 3)))))) + +/-! + +### A.5. The action of the jet gauge group + +The jets of the total fermionic field split as the product of the jets of the species, +generation by generation; a jet of gauge transformations acts on each factor through the +species' own jet action. The identification is `JetRing`-linear, so the fibrewise +linearity of the species actions is inherited by the product. + +-/ + +open TensorProduct in +/-- The jets of the total fermionic field as the product of the jets of the species and + generations. The identification is `JetRing`-linear. -/ +noncomputable def jetEquiv : + JetRing ⊗[ℂ] FermionSpace ≃ₗ[JetRing] + (Fin 3 → JetRing ⊗[ℂ] LeptonDoublet) × + ((Fin 3 → JetRing ⊗[ℂ] LeptonSinglet) × + ((Fin 3 → JetRing ⊗[ℂ] QuarkDoublet) × + ((Fin 3 → JetRing ⊗[ℂ] UpSinglet) × + (Fin 3 → JetRing ⊗[ℂ] DownSinglet)))) := + (TensorProduct.prodRight ℂ JetRing JetRing _ _).trans <| + LinearEquiv.prodCongr (TensorProduct.piRight ℂ JetRing JetRing _) <| + (TensorProduct.prodRight ℂ JetRing JetRing _ _).trans <| + LinearEquiv.prodCongr (TensorProduct.piRight ℂ JetRing JetRing _) <| + (TensorProduct.prodRight ℂ JetRing JetRing _ _).trans <| + LinearEquiv.prodCongr (TensorProduct.piRight ℂ JetRing JetRing _) <| + (TensorProduct.prodRight ℂ JetRing JetRing _ _).trans <| + LinearEquiv.prodCongr (TensorProduct.piRight ℂ JetRing JetRing _) + (TensorProduct.piRight ℂ JetRing JetRing _) + +open TensorProduct in +/-- The map through which a jet of gauge transformations acts on the jets of the total + fermionic field: the species actions, factor by factor. -/ +noncomputable def jetActionMap (U : JetGaugeGroupI) : + ((Fin 3 → JetRing ⊗[ℂ] LeptonDoublet) × + ((Fin 3 → JetRing ⊗[ℂ] LeptonSinglet) × + ((Fin 3 → JetRing ⊗[ℂ] QuarkDoublet) × + ((Fin 3 → JetRing ⊗[ℂ] UpSinglet) × + (Fin 3 → JetRing ⊗[ℂ] DownSinglet))))) →ₗ[ℂ] + ((Fin 3 → JetRing ⊗[ℂ] LeptonDoublet) × + ((Fin 3 → JetRing ⊗[ℂ] LeptonSinglet) × + ((Fin 3 → JetRing ⊗[ℂ] QuarkDoublet) × + ((Fin 3 → JetRing ⊗[ℂ] UpSinglet) × + (Fin 3 → JetRing ⊗[ℂ] DownSinglet))))) := + LinearMap.prodMap (LinearMap.piMap fun _ => LeptonDoublet.repJetGaugeGroupI U) + (LinearMap.prodMap (LinearMap.piMap fun _ => LeptonSinglet.repJetGaugeGroupI U) + (LinearMap.prodMap (LinearMap.piMap fun _ => QuarkDoublet.repJetGaugeGroupI U) + (LinearMap.prodMap (LinearMap.piMap fun _ => UpSinglet.repJetGaugeGroupI U) + (LinearMap.piMap fun _ => DownSinglet.repJetGaugeGroupI U)))) + +/-- The pointwise lift of the identity maps is the identity. -/ +lemma _root_.LinearMap.piMap_id {R ι : Type*} {φ : ι → Type*} [Semiring R] + [∀ i, AddCommMonoid (φ i)] [∀ i, Module R (φ i)] : + LinearMap.piMap (fun i => (LinearMap.id : φ i →ₗ[R] φ i)) = LinearMap.id := + LinearMap.ext fun _ => funext fun _ => rfl + +/-- The pointwise lift of compositions is the composition of the pointwise lifts. -/ +lemma _root_.LinearMap.piMap_comp_piMap {R ι : Type*} {φ ψ ω : ι → Type*} [Semiring R] + [∀ i, AddCommMonoid (φ i)] [∀ i, Module R (φ i)] + [∀ i, AddCommMonoid (ψ i)] [∀ i, Module R (ψ i)] + [∀ i, AddCommMonoid (ω i)] [∀ i, Module R (ω i)] + (f : ∀ i, ψ i →ₗ[R] ω i) (g : ∀ i, φ i →ₗ[R] ψ i) : + (LinearMap.piMap f).comp (LinearMap.piMap g) + = LinearMap.piMap fun i => (f i).comp (g i) := + LinearMap.ext fun _ => funext fun _ => rfl + +open TensorProduct in +/-- The map of jets of the identity is the identity. -/ +lemma jetActionMap_one : jetActionMap 1 = LinearMap.id := by + rw [jetActionMap] + simp only [map_one, Module.End.one_eq_id, LinearMap.piMap_id, LinearMap.prodMap_id] + +open TensorProduct in +/-- The map of jets of a product is the composition of the maps of jets. -/ +lemma jetActionMap_mul (U V : JetGaugeGroupI) : + jetActionMap (U * V) = (jetActionMap U).comp (jetActionMap V) := by + rw [jetActionMap, jetActionMap, jetActionMap, LinearMap.prodMap_comp, + LinearMap.prodMap_comp, LinearMap.prodMap_comp, LinearMap.prodMap_comp, + LinearMap.piMap_comp_piMap, LinearMap.piMap_comp_piMap, LinearMap.piMap_comp_piMap, + LinearMap.piMap_comp_piMap, LinearMap.piMap_comp_piMap] + simp only [map_mul, Module.End.mul_eq_comp] + +open TensorProduct in +set_option maxRecDepth 4000 in +/-- **The jet gauge action on the jets of the total fermionic field**: the species + actions, transported through the splitting of the jets. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] FermionSpace) where + toFun U := (jetEquiv.restrictScalars ℂ).symm.toLinearMap ∘ₗ jetActionMap U ∘ₗ + (jetEquiv.restrictScalars ℂ).toLinearMap + map_one' := by + refine LinearMap.ext fun z => ?_ + show (jetEquiv.restrictScalars ℂ).symm (jetActionMap 1 + ((jetEquiv.restrictScalars ℂ) z)) = z + rw [jetActionMap_one, LinearMap.id_apply] + exact (jetEquiv.restrictScalars ℂ).symm_apply_apply z + map_mul' U V := by + refine LinearMap.ext fun z => ?_ + show (jetEquiv.restrictScalars ℂ).symm (jetActionMap (U * V) + ((jetEquiv.restrictScalars ℂ) z)) + = (jetEquiv.restrictScalars ℂ).symm (jetActionMap U ((jetEquiv.restrictScalars ℂ) + ((jetEquiv.restrictScalars ℂ).symm (jetActionMap V + ((jetEquiv.restrictScalars ℂ) z))))) + rw [(jetEquiv.restrictScalars ℂ).apply_symm_apply, jetActionMap_mul, + LinearMap.comp_apply] + +open TensorProduct in +set_option maxRecDepth 4000 in +/-- **The jet gauge action on the jets of the total fermionic field is fibrewise**: it + commutes with multiplication by scalar jets, because the splitting of the jets is + `JetRing`-linear and each species action is fibrewise. -/ +lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) + (z : JetRing ⊗[ℂ] FermionSpace) : + repJetGaugeGroupI U (χ • z) = χ • repJetGaugeGroupI U z := by + have hact : ∀ w, jetActionMap U (χ • w) = χ • jetActionMap U w := by + intro w + refine Prod.ext (funext fun i => ?_) (Prod.ext (funext fun i => ?_) + (Prod.ext (funext fun i => ?_) (Prod.ext (funext fun i => ?_) + (funext fun i => ?_)))) + · exact LeptonDoublet.repJetGaugeGroupI_smul U χ _ + · exact LeptonSinglet.repJetGaugeGroupI_smul U χ _ + · exact QuarkDoublet.repJetGaugeGroupI_smul U χ _ + · exact UpSinglet.repJetGaugeGroupI_smul U χ _ + · exact DownSinglet.repJetGaugeGroupI_smul U χ _ + show (jetEquiv.restrictScalars ℂ).symm (jetActionMap U + ((jetEquiv.restrictScalars ℂ) (χ • z))) + = χ • (jetEquiv.restrictScalars ℂ).symm (jetActionMap U + ((jetEquiv.restrictScalars ℂ) z)) + rw [show (jetEquiv.restrictScalars ℂ) (χ • z) = χ • (jetEquiv.restrictScalars ℂ) z from + map_smul jetEquiv χ z, + hact, + show (jetEquiv.restrictScalars ℂ).symm (χ • jetActionMap U + ((jetEquiv.restrictScalars ℂ) z)) + = χ • (jetEquiv.restrictScalars ℂ).symm (jetActionMap U + ((jetEquiv.restrictScalars ℂ) z)) from + map_smul jetEquiv.symm χ _] + +end FermionSpace + +/-! + +## B. The fermionic jet algebra + +-/ + +/-- **The jet algebra of the Standard Model fermions**: the exterior product of the fermionic + algebras of the five species, realized as the fermionic algebra of their direct sum. Its + generators are the component functions `∂_s ψ_φ` and `∂_s ψ̄_φ` of every species and + generation, and any two of them anticommute — within a species and across species alike. + + This is the fermionic factor of the full Standard Model jet algebra; the gauge and Higgs + factors are bosonic and commute with it. -/ +abbrev FermionJetAlgebra : Type := FermionicAlgebra FermionSpace + +namespace FermionJetAlgebra + +/-! + +### B.1. The component functions of each species + +Each species and generation enters through its projection out of `FermionSpace`: a covector +on the species pulls back to a covector on the total target space, and thence to a generator +of the jet algebra. Their iterated derivatives `FermionicAlgebra.iteratedJetDeriv` are the +higher generators. + +-/ + +/-- The component functions of the `i`-th generation lepton doublet inside the Standard + Model jet algebra. -/ +noncomputable def ofLeptonDoublet (i : Fin 3) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.leptonDoubletProj i)) + +/-- The component functions of the `i`-th generation charged-lepton singlet. -/ +noncomputable def ofLeptonSinglet (i : Fin 3) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.leptonSingletProj i)) + +/-- The component functions of the `i`-th generation quark doublet. -/ +noncomputable def ofQuarkDoublet (i : Fin 3) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.quarkDoubletProj i)) + +/-- The component functions of the `i`-th generation up-type quark singlet. -/ +noncomputable def ofUpSinglet (i : Fin 3) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.upSingletProj i)) + +/-- The component functions of the `i`-th generation down-type quark singlet. -/ +noncomputable def ofDownSinglet (i : Fin 3) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.downSingletProj i)) + +/-- The conjugate component functions of the `i`-th generation lepton doublet. -/ +noncomputable def ofConjLeptonDoublet (i : Fin 3) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonDoubletProj i))) + +/-- The conjugate component functions of the `i`-th generation charged-lepton singlet. -/ +noncomputable def ofConjLeptonSinglet (i : Fin 3) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonSingletProj i))) + +/-- The conjugate component functions of the `i`-th generation quark doublet. -/ +noncomputable def ofConjQuarkDoublet (i : Fin 3) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.quarkDoubletProj i))) + +/-- The conjugate component functions of the `i`-th generation up-type quark singlet. -/ +noncomputable def ofConjUpSinglet (i : Fin 3) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.upSingletProj i))) + +/-- The conjugate component functions of the `i`-th generation down-type quark singlet. -/ +noncomputable def ofConjDownSinglet (i : Fin 3) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] FermionJetAlgebra := + FermionicAlgebra.ofConjField.comp + (Module.Dual.transpose (ConjModule.map (FermionSpace.downSingletProj i))) + +/-! + +### B.2. The exterior product decomposition + +`FermionicAlgebra.prodEquiv` identifies the fermionic algebra of a direct sum with the +graded tensor product of the two fermionic algebras. Applied repeatedly it exhibits the jet +algebra as the exterior product of the five species algebras, peeling off one species — all +three of its generations at once — at a time. It has to be stated one species at a time: +`GradedTensorProduct` carries no `GradedAlgebra` instance in Mathlib, so the fully nested +five-fold graded tensor product is not expressible as a type. + +-/ + +open scoped TensorProduct + +/-- The fermionic jet algebra as the exterior product of the three-generation + lepton-doublet algebra with the algebra of the remaining four species. -/ +noncomputable def exteriorProductLeptonDoublet : + FermionJetAlgebra ≃ₐ[ℂ] (FermionicAlgebra.evenOdd (Fin 3 → LeptonDoublet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × + (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet))) := + FermionicAlgebra.prodEquiv _ _ + +/-- The charged-lepton singlets split off the remaining three species. -/ +noncomputable def exteriorProductLeptonSinglet : + FermionicAlgebra ((Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × + (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet)) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (Fin 3 → LeptonSinglet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((Fin 3 → QuarkDoublet) × (Fin 3 → UpSinglet) × + (Fin 3 → DownSinglet))) := + FermionicAlgebra.prodEquiv _ _ + +/-- The quark doublets split off the two quark singlets. -/ +noncomputable def exteriorProductQuarkDoublet : + FermionicAlgebra ((Fin 3 → QuarkDoublet) × (Fin 3 → UpSinglet) × + (Fin 3 → DownSinglet)) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (Fin 3 → QuarkDoublet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((Fin 3 → UpSinglet) × (Fin 3 → DownSinglet))) := + FermionicAlgebra.prodEquiv _ _ + +/-- The two quark singlets as an exterior product. -/ +noncomputable def exteriorProductUpSinglet : + FermionicAlgebra ((Fin 3 → UpSinglet) × (Fin 3 → DownSinglet)) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (Fin 3 → UpSinglet) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd (Fin 3 → DownSinglet)) := + FermionicAlgebra.prodEquiv _ _ + +/-! + +### B.3. The actions on the fermionic jet algebra + +-/ + +open Matrix MatrixGroups in +/-- The Lorentz action on the fermionic jet algebra of the Standard Model. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) FermionJetAlgebra := + FermionicAlgebra.repLorentzGroup FermionSpace.repLorentzGroup + +/-- The jet gauge action on the fermionic jet algebra of the Standard Model. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI FermionJetAlgebra := + FermionicAlgebra.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI + FermionSpace.repJetGaugeGroupI_smul + +/-- The global gauge action on the fermionic jet algebra of the Standard Model. -/ +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI FermionJetAlgebra := + FermionicAlgebra.repGaugeGroupI FermionSpace.repJetGaugeGroupI + FermionSpace.repJetGaugeGroupI_smul + +/-! + +### B.4. The mass-dimension scaling + +-/ + +/-- The mass-dimension scaling on the fermionic jet algebra: every Standard Model fermion + has mass dimension `3/2`, that is mass weight three, and each derivative adds mass + weight two. -/ +noncomputable def massWeightScale (c : ℂ) : FermionJetAlgebra →ₐ[ℂ] FermionJetAlgebra := + FermionicAlgebra.massWeightScale 3 c + +end FermionJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index d7f7be0d4..6ccef0fe2 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -7,7 +7,11 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps /-! # Lepton doublets @@ -120,6 +124,10 @@ noncomputable def basis : Module.Basis (Fin 2 × Fin 2) ℂ LeptonDoublet := (Fermion.LeftHandedWeyl.basis.tensorProduct (EuclideanSpace.basisFun (Fin 2) ℂ).toBasis).map valLinEquiv.symm +instance : Module.Finite ℂ LeptonDoublet := Module.Finite.of_basis basis + +instance : Module.Free ℂ LeptonDoublet := Module.Free.of_basis basis + /-! ## C. Lorentz action @@ -310,181 +318,194 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → ## G. Jet gauge action -The `(1, 2)_{-3}` representation extends verbatim to jets: the hypercharge power -series `star u ^ 3` and the `SU(2)` power-series matrix of a jet of gauge -transformations combine into a matrix of jets, `jetGaugeMatrix`. This matrix acts -on the polynomial jet space -`SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet` through the entrywise -derivative action `DerivAlgebraComplex.jetRingAction` on the derivative symbols, moving the weak index -and leaving the Weyl factor fixed: the value of the jet acts by the gauge matrix, -while its derivative coordinates lower derivative symbols by the Leibniz rule. On -jets of constant gauge transformations the action reduces to the global gauge -action, trivial on the derivative symbols. +The `(1, 2)_{-3}` representation extends verbatim to jets, in the same way as for the +quark singlets: the jet ring is absorbed into the weak index, and the `SU(2)` +power-series matrix of a jet of gauge transformations, scaled by the hypercharge power +series `star u ^ 3`, acts `JetRing`-linearly on the weak factor. On jets of constant +gauge transformations the action reduces to the global gauge action. -/ -/-- The matrix of jets through which a jet of gauge transformations acts on the - lepton doublet: the `SU(2)` power-series matrix scaled by the hypercharge power - series `star u ^ 3`. -/ -noncomputable def jetGaugeMatrix (U : JetGaugeGroupI) : Matrix (Fin 2) (Fin 2) JetRing := - ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • - ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) - -lemma jetGaugeMatrix_one : jetGaugeMatrix 1 = 1 := by - simp [jetGaugeMatrix] - -lemma jetGaugeMatrix_mul (U₁ U₂ : JetGaugeGroupI) : - jetGaugeMatrix (U₁ * U₂) = jetGaugeMatrix U₁ * jetGaugeMatrix U₂ := by - rw [jetGaugeMatrix, jetGaugeMatrix, jetGaugeMatrix, - show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) = - ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) from rfl, - show (((U₁ * U₂).2.1 : specialUnitaryGroup (Fin 2) JetRing) : - Matrix (Fin 2) (Fin 2) JetRing) = - ((U₁.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) * - ((U₂.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) - from rfl, - star_mul', mul_pow, Matrix.smul_mul, Matrix.mul_smul, smul_smul] - @[simp] lemma mk_zero : (⟨0⟩ : LeptonDoublet) = 0 := rfl -/-- The evaluation of the `SU(2)` matrix unit on a weak basis vector. -/ -lemma toEuclideanLin_single_single (i j j' : Fin 2) : - (Matrix.single i j' (1 : ℂ)).toEuclideanLin (EuclideanSpace.single j (1 : ℂ)) = - if j' = j then EuclideanSpace.single i (1 : ℂ) else 0 := by - ext i' - rcases eq_or_ne j' j with h | h - · subst h - simp [Matrix.toEuclideanLin, Matrix.single_apply, eq_comm] - · simp [Matrix.toEuclideanLin, h] - -/-- The action of a matrix of jets on the jet space of the lepton doublet: each - entry acts through the derivative action `DerivAlgebraComplex.jetRingAction` on the derivative symbols - while moving the weak index; the Weyl factor is fixed. -/ -noncomputable def jetMatrixAction (A : Matrix (Fin 2) (Fin 2) JetRing) : - SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet →ₗ[ℂ] - SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet := - ∑ i, ∑ j, - TensorProduct.map (DerivAlgebraComplex.jetRingAction (A i j)) - (valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map LinearMap.id ((Matrix.single i j (1 : ℂ)).toEuclideanLin) ∘ₗ - valLinEquiv.toLinearMap) - -/-- The action of a matrix of jets on a generator of the jet space. -/ -lemma jetMatrixAction_tmul (A : Matrix (Fin 2) (Fin 2) JetRing) - (p : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) (w : Fermion.LeftHandedWeyl) (j : Fin 2) : - jetMatrixAction A (p ⊗ₜ[ℂ] ⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩) = - ∑ i, DerivAlgebraComplex.jetRingAction (A i j) p ⊗ₜ[ℂ] - (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet) := by - rw [jetMatrixAction, LinearMap.sum_apply] - refine Finset.sum_congr rfl fun i _ => ?_ - rw [LinearMap.sum_apply, Finset.sum_eq_single j] - · simp [valLinEquiv_symm_apply, toEuclideanLin_single_single] - · intro j' _ hj' - simp [valLinEquiv_symm_apply, toEuclideanLin_single_single, hj'] - · simp - -/-- The lepton-doublet basis as explicit spinor–weak tensors. -/ -lemma basis_apply (k j : Fin 2) : - (basis (k, j) : LeptonDoublet) = - ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩ := by - simp [basis, Module.Basis.tensorProduct_apply, valLinEquiv_symm_apply] - -lemma jetMatrixAction_one : jetMatrixAction 1 = LinearMap.id := by - apply (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.tensorProduct basis).ext - rintro ⟨m, k, j⟩ - rw [Module.Basis.tensorProduct_apply', basis_apply, jetMatrixAction_tmul] - fin_cases j <;> simp [Matrix.one_apply, apply_ite DerivAlgebraComplex.jetRingAction] - -lemma jetMatrixAction_mul (A B : Matrix (Fin 2) (Fin 2) JetRing) : - jetMatrixAction (A * B) = jetMatrixAction A ∘ₗ jetMatrixAction B := by - apply (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.tensorProduct basis).ext - rintro ⟨m, k, j⟩ - rw [Module.Basis.tensorProduct_apply', basis_apply] - simp only [LinearMap.coe_comp, Function.comp_apply] - rw [jetMatrixAction_tmul, jetMatrixAction_tmul, map_sum] - simp only [jetMatrixAction_tmul] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun i _ => ?_ - rw [← TensorProduct.sum_tmul] - congr 1 - have h : DerivAlgebraComplex.jetRingAction ((A * B) i j) = ∑ l, DerivAlgebraComplex.jetRingAction (A i l) * DerivAlgebraComplex.jetRingAction (B l j) := by - rw [Matrix.mul_apply, - show DerivAlgebraComplex.jetRingAction (∑ l, A i l * B l j) = DerivAlgebraComplex.jetRingActionHom (∑ l, A i l * B l j) from rfl, - map_sum] - exact Finset.sum_congr rfl fun l _ => map_mul DerivAlgebraComplex.jetRingActionHom _ _ - rw [h, LinearMap.sum_apply] - exact Finset.sum_congr rfl fun l _ => rfl - -/-- The `(1, 2)_{-3}` action of the jet gauge group on the polynomial jet space of - the lepton doublet: a jet of gauge transformations acts through the entrywise - derivative action of its gauge matrix of power series on the derivative symbols, - moving the weak index and fixing the Weyl factor. Its value acts by the gauge - matrix, and its derivative coordinates act by the Leibniz rule. -/ +/-- Absorbs the jet ring into the weak index: a jet of a lepton doublet is the same +thing as a left-handed Weyl spinor tensored with a `JetRing`-valued weak vector, + + `JetRing ⊗[ℂ] LeptonDoublet ≃ LeftHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 2)`. + +-/ +noncomputable def jetValLinEquiv : + JetRing ⊗[ℂ] LeptonDoublet ≃ₗ[ℂ] + Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 2) := + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) valLinEquiv).trans <| + (TensorProduct.leftComm ℂ JetRing Fermion.LeftHandedWeyl + (EuclideanSpace ℂ (Fin 2))).trans <| + TensorProduct.congr (LinearEquiv.refl ℂ Fermion.LeftHandedWeyl) <| + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) + (WithLp.linearEquiv 2 ℂ (Fin 2 → ℂ))).trans <| + ((TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 2)).trans + (WithLp.linearEquiv 2 JetRing (Fin 2 → JetRing)).symm).restrictScalars ℂ + +/-- The `(1, 2)_{-3}` action of the jet gauge group on the jet space of the lepton +doublet. Through `jetValLinEquiv` the weak matrix of the gauge jet, carrying the `-3` +hypercharge phase `(star u) ^ 3`, acts `JetRing`-linearly on the weak factor by +matrix-vector multiplication, while the Weyl factor is untouched. -/ noncomputable def repJetGaugeGroupI : - Representation ℂ JetGaugeGroupI - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet) where - toFun U := jetMatrixAction (jetGaugeMatrix U) + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] LeptonDoublet) where + toFun U := + jetValLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 2)) Fermion.LeftHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 + (((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing))).restrictScalars ℂ) ∘ₗ + jetValLinEquiv.toLinearMap map_one' := by - rw [jetGaugeMatrix_one, jetMatrixAction_one] - rfl + have hres : (1 : Module.End JetRing (EuclideanSpace JetRing (Fin 2))).restrictScalars ℂ + = 1 := rfl + rw [show (((star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 3) • + (((1 : JetGaugeGroupI).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)) = 1 from by simp, + map_one, hres, map_one] + ext d x + simp [-valLinEquiv_apply] map_mul' U₁ U₂ := by - rw [jetGaugeMatrix_mul, jetMatrixAction_mul] - rfl - -@[simp] -lemma repJetGaugeGroupI_apply (U : JetGaugeGroupI) - (x : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] LeptonDoublet) : - repJetGaugeGroupI U x = jetMatrixAction (jetGaugeMatrix U) x := rfl - -/-- The entries of the gauge matrix of a jet of a constant gauge transformation are - the constant power series with the global gauge coefficients. -/ -lemma jetGaugeMatrix_ofConstant (g : GaugeGroupI) (i j : Fin 2) : - jetGaugeMatrix (JetGaugeGroupI.ofConstant g) i j = - MvPowerSeries.C ((star (g.toU1.1 : ℂ)) ^ 3 * g.toSU2.1 i j) := by - rw [jetGaugeMatrix, Matrix.smul_apply, - show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = - MvPowerSeries.C ((g.toU1.1 : ℂ)) from rfl, - show (((JetGaugeGroupI.ofConstant g).2.1 : specialUnitaryGroup (Fin 2) JetRing) : - Matrix (Fin 2) (Fin 2) JetRing) i j = - MvPowerSeries.C (g.toSU2.1 i j) from rfl, - JetRing.star_C, ← map_pow, smul_eq_mul, ← map_mul] + have hres : ∀ f g : Module.End JetRing (EuclideanSpace JetRing (Fin 2)), + (f * g).restrictScalars ℂ = f.restrictScalars ℂ * g.restrictScalars ℂ := + fun _ _ => rfl + have hM : (((star (((U₁ * U₂).2.2 : unitary JetRing) : JetRing)) ^ 3) • + (((U₁ * U₂).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)) = + (((star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U₁.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)) * + (((star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U₂.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)) := by + rw [show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, + show (((U₁ * U₂).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) = + ((U₁.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) * + ((U₂.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + from rfl, + star_mul', mul_pow, Matrix.smul_mul, Matrix.mul_smul, smul_smul] + rw [hM, map_mul, hres, map_mul] + ext d x + simp + +/-- The identification of the jets of the lepton doublet intertwines multiplication by +a scalar jet with the `JetRing`-scalar action on the weak coordinates. -/ +lemma jetValLinEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] LeptonDoublet) : + jetValLinEquiv (χ • z) + = Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 2)) + Fermion.LeftHandedWeyl + ((LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 2)) χ).restrictScalars ℂ) + (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [smul_add, map_add, ha, hb, map_add, map_add] + | tmul f x => + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : LeptonDoublet) = 0 from rfl, TensorProduct.tmul_zero, + smul_zero, map_zero, map_zero] + | tmul ψ c => + rw [TensorProduct.smul_tmul', smul_eq_mul, + show jetValLinEquiv ((χ * f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (χ * f)) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + show Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 2)) + Fermion.LeftHandedWeyl + ((LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 2)) χ).restrictScalars ℂ) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f)) + = ψ ⊗ₜ[ℂ] (χ • WithLp.toLp 2 fun i => c.ofLp i • f) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + show c.ofLp i • (χ * f) = χ * (c.ofLp i • f) + rw [Algebra.mul_smul_comm] + | add a b ha hb => + rw [show ({ val := a + b } : LeptonDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, smul_add, map_add, ha, hb, map_add, map_add] + +/-- **The jet gauge action on the jets of the lepton doublet is fibrewise**: it commutes +with multiplication by scalar jets. -/ +lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) + (z : JetRing ⊗[ℂ] LeptonDoublet) : + repJetGaugeGroupI U (χ • z) = χ • repJetGaugeGroupI U z := by + set S : Module.End JetRing (EuclideanSpace JetRing (Fin 2)) := + LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 2)) χ with hS + set M : Module.End JetRing (EuclideanSpace JetRing (Fin 2)) := + (Matrix.toLpLinAlgEquiv 2 + (((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)) : + Module.End JetRing (EuclideanSpace JetRing (Fin 2))) with hM + have hMS : M * S = S * M := LinearMap.ext fun e => by + simp only [Module.End.mul_apply, hS, LinearMap.lsmul_apply, map_smul] + apply jetValLinEquiv.injective + rw [show repJetGaugeGroupI U (χ • z) + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.LeftHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv (χ • z))) from rfl, + LinearEquiv.apply_symm_apply, jetValLinEquiv_smul, + show repJetGaugeGroupI U z + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.LeftHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv z)) from rfl, + jetValLinEquiv_smul, LinearEquiv.apply_symm_apply, ← Module.End.mul_apply, + ← Module.End.mul_apply, ← map_mul, ← map_mul, + show M.restrictScalars ℂ * S.restrictScalars ℂ = (M * S).restrictScalars ℂ from rfl, + show S.restrictScalars ℂ * M.restrictScalars ℂ = (S * M).restrictScalars ℂ from rfl, + hMS] /-- On jets of constant gauge transformations the jet action reduces to the global - gauge action on the jet space: the `(1, 2)_{-3}` action on the target factor and - the trivial action on the derivative symbols. -/ +gauge action on the fibre: the `(1, 2)_{-3}` action on the lepton-doublet factor, and +the trivial action on the jet ring. -/ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = TensorProduct.map LinearMap.id (repGaugeGroupI g) := by - apply (Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.tensorProduct basis).ext - rintro ⟨m, k, j⟩ - rw [Module.Basis.tensorProduct_apply', basis_apply, repJetGaugeGroupI_apply, - jetMatrixAction_tmul, TensorProduct.map_tmul, LinearMap.id_apply, - repGaugeGroupI_tmul_basis_eq_sum, TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun i _ => ?_ - rw [jetGaugeMatrix_ofConstant, DerivAlgebraComplex.jetRingAction_C, LinearMap.smul_apply, LinearMap.id_apply] - exact TensorProduct.smul_tmul _ _ _ - -/-- The jet action on a first-order derivative symbol is the Leibniz rule: the - value of the gauge matrix multiplies the first-derivative symbol, and its first - derivative feeds the field symbol, `∂_μ ψ_j ↦ ∑ i, A(0)_{ij} ∂_μ ψ_i + - (∂_μ A)(0)_{ij} ψ_i` for `A = jetGaugeMatrix U`. -/ -lemma repJetGaugeGroupI_ι_tmul (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (w : Fermion.LeftHandedWeyl) (j : Fin 2) : - repJetGaugeGroupI U - (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) (Lorentz.complexCoBasis.dualBasis μ) ⊗ₜ[ℂ] - ⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩) = - ∑ i, - (MvPowerSeries.constantCoeff (jetGaugeMatrix U i j) • - (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) (Lorentz.complexCoBasis.dualBasis μ) ⊗ₜ[ℂ] - (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet)) + - MvPowerSeries.coeff (Finsupp.single μ 1) (jetGaugeMatrix U i j) • - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] - (⟨w ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ i⟩ : LeptonDoublet))) := by - rw [repJetGaugeGroupI_apply, jetMatrixAction_tmul] - refine Finset.sum_congr rfl fun i _ => ?_ - rw [DerivAlgebraComplex.jetRingAction_apply_ι, TensorProduct.add_tmul, TensorProduct.smul_tmul', - TensorProduct.smul_tmul'] + ext d x + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => simp [show ({ val := 0 } : LeptonDoublet) = 0 from rfl] + | tmul psi c => + apply jetValLinEquiv.injective + simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + have hu : star (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) + = MvPowerSeries.C ((starRingEnd ℂ) (g.toU1.1 : ℂ)) := by + rw [show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) + = MvPowerSeries.C ((g.toU1.1 : ℂ)) from rfl, JetRing.star_C] + rfl + have hM : ∀ i j, (((JetGaugeGroupI.ofConstant g).2.1 : + specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) i j + = MvPowerSeries.C (g.toSU2.1 i j) := fun _ _ => rfl + have halg : ∀ A : Matrix (Fin 2) (Fin 2) JetRing, + (Matrix.toLpLinAlgEquiv 2 A : + Module.End JetRing (EuclideanSpace JetRing (Fin 2))) + = Matrix.toLpLin 2 2 A := fun _ => rfl + have hvec : ∀ i : Fin 2, + (∑ x, MvPowerSeries.C ((g.toSU2.1) i x) * (MvPowerSeries.C (c.ofLp x) * d)) + = MvPowerSeries.C (∑ x, (g.toSU2.1) i x * c.ofLp x) * d := by + intro i + rw [map_sum, Finset.sum_mul] + exact Finset.sum_congr rfl fun x _ => by rw [← mul_assoc, ← map_mul] + rw [TensorProduct.liftAux_tmul, ← TensorProduct.tmul_smul] + simp only [LinearMap.compl₂_apply, TensorProduct.mk_apply, LinearMap.smul_apply, + LinearMap.restrictScalars_apply, halg, Matrix.toLpLin_toLp] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + simp only [WithLp.ofLp_smul, Pi.smul_apply, Matrix.toLin'_apply, + Matrix.mulVec_apply_eq_sum, hM, Algebra.smul_def, MvPowerSeries.algebraMap_apply, + hu, map_pow, Algebra.algebraMap_self_apply] + rw [hvec i] + | add a b ha hb => + simp only [show ({ val := a + b } : LeptonDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + map_add, ha, hb] end LeptonDoublet diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index 2e15d34e7..37796b232 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.DerivAlgebra public import Physlib.Mathematics.ConjModule @@ -115,6 +116,10 @@ lemma val_smul (r : ℂ) (l : LeptonSinglet) : (r • l).val = r • l.val := rf noncomputable def basis : Module.Basis (Fin 2) ℂ LeptonSinglet := Fermion.RightHandedWeyl.basis.map valLinEquiv.symm +instance : Module.Finite ℂ LeptonSinglet := Module.Finite.of_basis basis + +instance : Module.Free ℂ LeptonSinglet := Module.Free.of_basis basis + /-! ## C. Lorentz action @@ -269,6 +274,86 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) +/-! + +## G. The representation of the jet gauge group + +The charged-lepton singlet carries no colour or weak index, so a jet of gauge +transformations acts on its jets purely through the hypercharge power series +`(star u) ^ 6`, multiplying the jet-ring factor and leaving the Weyl factor untouched. + +-/ + +open TensorProduct in +/-- The `(1, 1)_{-6}` action of the jet gauge group on the jet space of the charged-lepton +singlet: multiplication of the jet-ring factor by the hypercharge power series +`(star u) ^ 6`. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] LeptonSinglet) where + toFun U := LinearMap.rTensor LeptonSinglet + (LinearMap.mulLeft ℂ ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6)) + map_one' := by + rw [show (star (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing)) ^ 6 + = 1 from by simp, LinearMap.mulLeft_one, LinearMap.rTensor_id] + rfl + map_mul' U₁ U₂ := by + rw [show (star (((U₁ * U₂).2.2 : unitary JetRing) : JetRing)) ^ 6 + = (star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6 + * (star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6 from by + rw [show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) + = ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, star_mul', mul_pow, mul_comm], + show LinearMap.mulLeft ℂ + ((star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6 + * (star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6) + = (LinearMap.mulLeft ℂ ((star ((U₁.2.2 : unitary JetRing) : JetRing)) ^ 6)) ∘ₗ + (LinearMap.mulLeft ℂ ((star ((U₂.2.2 : unitary JetRing) : JetRing)) ^ 6)) from + LinearMap.ext fun z => mul_assoc _ _ z, + LinearMap.rTensor_comp] + rfl + +open TensorProduct in +/-- The jet gauge action on a pure tensor of the jet space of the charged-lepton +singlet. -/ +lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (f : JetRing) (ψ : LeptonSinglet) : + repJetGaugeGroupI U (f ⊗ₜ[ℂ] ψ) + = ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6 * f) ⊗ₜ[ℂ] ψ := + LinearMap.rTensor_tmul _ _ _ _ + +open TensorProduct in +/-- **The jet gauge action on the jets of the charged-lepton singlet is fibrewise**: it +commutes with multiplication by scalar jets. -/ +lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) + (z : JetRing ⊗[ℂ] LeptonSinglet) : + repJetGaugeGroupI U (χ • z) = χ • repJetGaugeGroupI U z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [smul_add, map_add, ha, hb, map_add, smul_add] + | tmul f ψ => + rw [TensorProduct.smul_tmul', smul_eq_mul, repJetGaugeGroupI_tmul, + repJetGaugeGroupI_tmul, TensorProduct.smul_tmul', smul_eq_mul, mul_left_comm] + +open TensorProduct in +/-- On jets of constant gauge transformations the jet action reduces to the global +gauge action on the fibre: the `(1, 1)_{-6}` action on the lepton-singlet factor, and +the trivial action on the jet ring. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + TensorProduct.map LinearMap.id (repGaugeGroupI g) := by + ext f x + obtain ⟨ψ⟩ := x + have hu : (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) + = MvPowerSeries.C ((g.toU1.1 : ℂ)) := rfl + simp only [TensorProduct.AlgebraTensorModule.curry_apply, TensorProduct.curry_apply, + LinearMap.restrictScalars_apply, repJetGaugeGroupI_tmul, hu, JetRing.star_C, ← map_pow, + TensorProduct.map_tmul, LinearMap.id_apply, repGaugeGroupI_apply] + rw [show (⟨(star (g.toU1.1 : ℂ) ^ 6) • ψ⟩ : LeptonSinglet) + = (star (g.toU1.1 : ℂ) ^ 6) • (⟨ψ⟩ : LeptonSinglet) from rfl, + TensorProduct.tmul_smul, + show (MvPowerSeries.C (star (g.toU1.1 : ℂ) ^ 6) * f) = (star (g.toU1.1 : ℂ) ^ 6) • f from + by rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, Algebra.algebraMap_self_apply], + TensorProduct.smul_tmul'] + end LeptonSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean index 8fd55c0f9..28c1f528b 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean @@ -6,10 +6,16 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.RightHanded public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded public import Physlib.Relativity.Fermions.Weyl.DualRightHanded +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.LinearAlgebra.Matrix.Kronecker +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps /-! # The type corresponding to quark doublets @@ -94,6 +100,10 @@ noncomputable def basis : Module.Basis (Fin 2 × Fin 3 × Fin 2) ℂ QuarkDouble (EuclideanSpace.basisFun (Fin 2) ℂ).toBasis).map valLinEquiv.symm).reindex (Equiv.prodAssoc (Fin 2) (Fin 3) (Fin 2))) +instance : Module.Finite ℂ QuarkDoublet := Module.Finite.of_basis basis + +instance : Module.Free ℂ QuarkDoublet := Module.Free.of_basis basis + /-! ## Lorentz group representation @@ -247,6 +257,277 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) +/-! + +## The representation of the jet gauge group + +The colour and weak indices are combined into the single index `Fin 3 × Fin 2`, on which +the `SU(3)` and `SU(2)` power-series matrices of a jet of gauge transformations act +together through their Kronecker product, scaled by the hypercharge power series `u`. + +-/ + +open Kronecker + +/-- The colour and weak factors of the quark doublet combined into a single Euclidean +factor over `Fin 3 × Fin 2`. -/ +noncomputable def colourWeakEquiv : + EuclideanSpace ℂ (Fin 3) ⊗[ℂ] EuclideanSpace ℂ (Fin 2) ≃ₗ[ℂ] (Fin 3 × Fin 2 → ℂ) := + (TensorProduct.congr (WithLp.linearEquiv 2 ℂ (Fin 3 → ℂ)) + (WithLp.linearEquiv 2 ℂ (Fin 2 → ℂ))).trans <| + (TensorProduct.piScalarRight ℂ ℂ (Fin 3 → ℂ) (Fin 2)).trans <| + (LinearEquiv.curry ℂ ℂ (Fin 2) (Fin 3)).symm.trans <| + LinearEquiv.piCongrLeft' ℂ (fun _ => ℂ) (Equiv.prodComm (Fin 2) (Fin 3)) + +@[simp] +lemma colourWeakEquiv_tmul (c : EuclideanSpace ℂ (Fin 3)) (w : EuclideanSpace ℂ (Fin 2)) + (p : Fin 3 × Fin 2) : + colourWeakEquiv (c ⊗ₜ[ℂ] w) p = c.ofLp p.1 * w.ofLp p.2 := by + simp [colourWeakEquiv, Function.uncurry, Algebra.algebraMap_eq_smul_one, mul_comm] + +/-- Absorbs the jet ring into the combined colour–weak index: a jet of a quark doublet is +the same thing as a left-handed Weyl spinor tensored with a `JetRing`-valued +colour–weak vector, + + `JetRing ⊗[ℂ] QuarkDoublet ≃ LeftHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 3 × Fin 2)`. + +-/ +noncomputable def jetValLinEquiv : + JetRing ⊗[ℂ] QuarkDoublet ≃ₗ[ℂ] + Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 3 × Fin 2) := + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) + (valLinEquiv.trans (TensorProduct.assoc ℂ Fermion.LeftHandedWeyl + (EuclideanSpace ℂ (Fin 3)) (EuclideanSpace ℂ (Fin 2))))).trans <| + (TensorProduct.leftComm ℂ JetRing Fermion.LeftHandedWeyl + (EuclideanSpace ℂ (Fin 3) ⊗[ℂ] EuclideanSpace ℂ (Fin 2))).trans <| + TensorProduct.congr (LinearEquiv.refl ℂ Fermion.LeftHandedWeyl) <| + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) colourWeakEquiv).trans <| + ((TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 3 × Fin 2)).trans + (WithLp.linearEquiv 2 JetRing (Fin 3 × Fin 2 → JetRing)).symm).restrictScalars ℂ + +/-- The matrix of jets through which a jet of gauge transformations acts on the combined +colour–weak index of the quark doublet: the Kronecker product of the `SU(3)` and `SU(2)` +power-series matrices, scaled by the hypercharge power series `u`. -/ +noncomputable def jetGaugeMatrix (U : JetGaugeGroupI) : + Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) JetRing := + ((U.2.2 : unitary JetRing) : JetRing) • + (((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) ⊗ₖ + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing)) + +lemma jetGaugeMatrix_one : jetGaugeMatrix 1 = 1 := by + rw [jetGaugeMatrix, + show (((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) = 1 from rfl, + show ((((1 : JetGaugeGroupI).1 : specialUnitaryGroup (Fin 3) JetRing)) : + Matrix (Fin 3) (Fin 3) JetRing) = 1 from rfl, + show ((((1 : JetGaugeGroupI).2.1 : specialUnitaryGroup (Fin 2) JetRing)) : + Matrix (Fin 2) (Fin 2) JetRing) = 1 from rfl, + Matrix.one_kronecker_one, one_smul] + +lemma jetGaugeMatrix_mul (U₁ U₂ : JetGaugeGroupI) : + jetGaugeMatrix (U₁ * U₂) = jetGaugeMatrix U₁ * jetGaugeMatrix U₂ := by + rw [jetGaugeMatrix, jetGaugeMatrix, jetGaugeMatrix, + show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) from rfl, + show (((U₁ * U₂).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) = + ((U₁.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) * + ((U₂.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + from rfl, + show (((U₁ * U₂).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) = + ((U₁.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) * + ((U₂.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + from rfl, + Matrix.mul_kronecker_mul, Matrix.smul_mul, Matrix.mul_smul, smul_smul] + +/-- The `(3, 2)_{1}` action of the jet gauge group on the jet space of the quark doublet. +Through `jetValLinEquiv` the Kronecker matrix of the gauge jet, carrying the hypercharge +phase `u`, acts `JetRing`-linearly on the combined colour–weak factor by matrix-vector +multiplication, while the Weyl factor is untouched. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] QuarkDoublet) where + toFun U := + jetValLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3 × Fin 2)) + Fermion.LeftHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)).restrictScalars ℂ) ∘ₗ + jetValLinEquiv.toLinearMap + map_one' := by + have hres : (1 : Module.End JetRing + (EuclideanSpace JetRing (Fin 3 × Fin 2))).restrictScalars ℂ = 1 := rfl + rw [jetGaugeMatrix_one, map_one, hres, map_one] + ext d x + simp [-valLinEquiv_apply] + map_mul' U₁ U₂ := by + have hres : ∀ f g : Module.End JetRing (EuclideanSpace JetRing (Fin 3 × Fin 2)), + (f * g).restrictScalars ℂ = f.restrictScalars ℂ * g.restrictScalars ℂ := + fun _ _ => rfl + rw [jetGaugeMatrix_mul, map_mul, hres, map_mul] + ext d x + simp + +/-- The entries of the gauge matrix of a jet of a constant gauge transformation are the +constant power series with the global gauge coefficients. -/ +lemma jetGaugeMatrix_ofConstant (g : GaugeGroupI) (p q : Fin 3 × Fin 2) : + jetGaugeMatrix (JetGaugeGroupI.ofConstant g) p q = + MvPowerSeries.C ((g.toU1.1 : ℂ) * (g.toSU3.1 p.1 q.1 * g.toSU2.1 p.2 q.2)) := by + rw [jetGaugeMatrix, Matrix.smul_apply, + show (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = + MvPowerSeries.C ((g.toU1.1 : ℂ)) from rfl] + rw [Matrix.kroneckerMap_apply, + show (((JetGaugeGroupI.ofConstant g).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) p.1 q.1 = + MvPowerSeries.C (g.toSU3.1 p.1 q.1) from rfl, + show (((JetGaugeGroupI.ofConstant g).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) p.2 q.2 = + MvPowerSeries.C (g.toSU2.1 p.2 q.2) from rfl, + smul_eq_mul, ← map_mul, ← map_mul] + +/-- The identification of the jets of the quark doublet intertwines multiplication by a +scalar jet with the `JetRing`-scalar action on the colour–weak coordinates. -/ +lemma jetValLinEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] QuarkDoublet) : + jetValLinEquiv (χ • z) + = Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3 × Fin 2)) + Fermion.LeftHandedWeyl + ((LinearMap.lsmul JetRing + (EuclideanSpace JetRing (Fin 3 × Fin 2)) χ).restrictScalars ℂ) + (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [smul_add, map_add, ha, hb, map_add, map_add] + | tmul f x => + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : QuarkDoublet) = 0 from rfl, TensorProduct.tmul_zero, + smul_zero, map_zero, map_zero] + | tmul vc w => + induction vc using TensorProduct.induction_on with + | zero => + rw [show ({ val := (0 : Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 3)) + ⊗ₜ[ℂ] w } : QuarkDoublet) = 0 from by + rw [TensorProduct.zero_tmul]; rfl, TensorProduct.tmul_zero, smul_zero, + map_zero, map_zero] + | tmul ψ c => + rw [TensorProduct.smul_tmul', smul_eq_mul, + show jetValLinEquiv ((χ * f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (c ⊗ₜ[ℂ] w) q • (χ * f)) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (c ⊗ₜ[ℂ] w) q • f) from rfl, + show Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3 × Fin 2)) + Fermion.LeftHandedWeyl + ((LinearMap.lsmul JetRing + (EuclideanSpace JetRing (Fin 3 × Fin 2)) χ).restrictScalars ℂ) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => colourWeakEquiv (c ⊗ₜ[ℂ] w) q • f)) + = ψ ⊗ₜ[ℂ] (χ • WithLp.toLp 2 fun q => + colourWeakEquiv (c ⊗ₜ[ℂ] w) q • f) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext q + show colourWeakEquiv (c ⊗ₜ[ℂ] w) q • (χ * f) + = χ * (colourWeakEquiv (c ⊗ₜ[ℂ] w) q • f) + rw [Algebra.mul_smul_comm] + | add a b ha hb => + rw [show ({ val := (a + b) ⊗ₜ[ℂ] w } : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ from by + rw [show (⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w + b ⊗ₜ[ℂ] w⟩ from rfl, TensorProduct.add_tmul], + TensorProduct.tmul_add, smul_add, map_add, ha, hb, map_add, map_add] + | add a b ha hb => + rw [show ({ val := a + b } : QuarkDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, smul_add, map_add, ha, hb, map_add, map_add] + +/-- **The jet gauge action on the jets of the quark doublet is fibrewise**: it commutes +with multiplication by scalar jets. -/ +lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) + (z : JetRing ⊗[ℂ] QuarkDoublet) : + repJetGaugeGroupI U (χ • z) = χ • repJetGaugeGroupI U z := by + set S : Module.End JetRing (EuclideanSpace JetRing (Fin 3 × Fin 2)) := + LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 3 × Fin 2)) χ with hS + set M : Module.End JetRing (EuclideanSpace JetRing (Fin 3 × Fin 2)) := + (Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U) : + Module.End JetRing (EuclideanSpace JetRing (Fin 3 × Fin 2))) with hM + have hMS : M * S = S * M := LinearMap.ext fun e => by + simp only [Module.End.mul_apply, hS, LinearMap.lsmul_apply, map_smul] + apply jetValLinEquiv.injective + rw [show repJetGaugeGroupI U (χ • z) + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.LeftHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv (χ • z))) from rfl, + LinearEquiv.apply_symm_apply, jetValLinEquiv_smul, + show repJetGaugeGroupI U z + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.LeftHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv z)) from rfl, + jetValLinEquiv_smul, LinearEquiv.apply_symm_apply, ← Module.End.mul_apply, + ← Module.End.mul_apply, ← map_mul, ← map_mul, + show M.restrictScalars ℂ * S.restrictScalars ℂ = (M * S).restrictScalars ℂ from rfl, + show S.restrictScalars ℂ * M.restrictScalars ℂ = (S * M).restrictScalars ℂ from rfl, + hMS] + +/-- On jets of constant gauge transformations the jet action reduces to the global gauge +action on the fibre: the `(3, 2)_{1}` action on the quark-doublet factor, and the trivial +action on the jet ring. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + TensorProduct.map LinearMap.id (repGaugeGroupI g) := by + ext d x + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => simp [show ({ val := 0 } : QuarkDoublet) = 0 from rfl] + | tmul vc w => + induction vc using TensorProduct.induction_on with + | zero => + have h : ({ val := (0 : Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 3)) + ⊗ₜ[ℂ] w } : QuarkDoublet) = 0 := by + rw [TensorProduct.zero_tmul] + rfl + rw [h] + simp + | tmul psi c => + apply jetValLinEquiv.injective + simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + have halg : ∀ A : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) JetRing, + (Matrix.toLpLinAlgEquiv 2 A : + Module.End JetRing (EuclideanSpace JetRing (Fin 3 × Fin 2))) + = Matrix.toLpLin 2 2 A := fun _ => rfl + rw [TensorProduct.liftAux_tmul] + simp only [LinearMap.compl₂_apply, TensorProduct.mk_apply, LinearMap.smul_apply, + LinearMap.restrictScalars_apply, halg, Matrix.toLpLin_toLp] + rw [← TensorProduct.tmul_smul] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext p + simp only [WithLp.ofLp_smul, Pi.smul_apply, Matrix.toLin'_apply, + Matrix.mulVec_apply_eq_sum, jetGaugeMatrix_ofConstant, Algebra.smul_def, + MvPowerSeries.algebraMap_apply, Algebra.algebraMap_self_apply] + rw [Finset.sum_congr rfl fun q _ => by + rw [show MvPowerSeries.C ((g.toU1.1 : ℂ) * (g.toSU3.1 p.1 q.1 * g.toSU2.1 p.2 q.2)) + * (MvPowerSeries.C (c.ofLp q.1 * w.ofLp q.2) * d) + = MvPowerSeries.C ((g.toU1.1 : ℂ) * (g.toSU3.1 p.1 q.1 * g.toSU2.1 p.2 q.2) + * (c.ofLp q.1 * w.ofLp q.2)) * d from by + rw [← mul_assoc, ← map_mul]], ← Finset.sum_mul, ← map_sum] + rw [← mul_assoc, ← map_mul] + congr 1 + rw [Fintype.sum_prod_type, + show (∑ j, g.toSU3.1 p.1 j * c.ofLp j) * (∑ j, g.toSU2.1 p.2 j * w.ofLp j) + = ∑ i, ∑ j, (g.toSU3.1 p.1 i * c.ofLp i) * (g.toSU2.1 p.2 j * w.ofLp j) from + Finset.sum_mul_sum _ _ _ _, Finset.mul_sum] + congr 1 + refine Finset.sum_congr rfl fun i _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + ring + | add a b ha hb => + simp only [show ({ val := (a + b) ⊗ₜ[ℂ] w } : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ from by + rw [show (⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w + b ⊗ₜ[ℂ] w⟩ from rfl, TensorProduct.add_tmul], + map_add, ha, hb] + | add a b ha hb => + simp only [show ({ val := a + b } : QuarkDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + map_add, ha, hb] + end QuarkDoublet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean index 387f33629..4982c14b0 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean @@ -6,7 +6,12 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps /-! # Up-type singlets @@ -86,6 +91,10 @@ noncomputable def basis : Module.Basis (Fin 2 × Fin 3) ℂ UpSinglet := (Fermion.RightHandedWeyl.basis.tensorProduct (EuclideanSpace.basisFun (Fin 3) ℂ).toBasis).map valLinEquiv.symm +instance : Module.Finite ℂ UpSinglet := Module.Finite.of_basis basis + +instance : Module.Free ℂ UpSinglet := Module.Free.of_basis basis + /-! ## Lorentz group representation @@ -217,6 +226,189 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → | .ℤ₂ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₂) | .ℤ₃ => QuotientGroup.lift _ repGaugeGroupI (gaugeGroup_subgroup_le_ker_repGaugeGroupI .ℤ₃) +/-! + +## The representation of the jet gauge group + +-/ + +/-- Absorbs the jet ring into the colour index: a jet of an up-type singlet is the +same thing as a right-handed Weyl spinor tensored with a `JetRing`-valued colour +vector, + + `JetRing ⊗[ℂ] UpSinglet ≃ RightHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 3)`. + +-/ +noncomputable def jetValLinEquiv : + JetRing ⊗[ℂ] UpSinglet ≃ₗ[ℂ] + Fermion.RightHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 3) := + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) valLinEquiv).trans <| + (TensorProduct.leftComm ℂ JetRing Fermion.RightHandedWeyl + (EuclideanSpace ℂ (Fin 3))).trans <| + TensorProduct.congr (LinearEquiv.refl ℂ Fermion.RightHandedWeyl) <| + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) + (WithLp.linearEquiv 2 ℂ (Fin 3 → ℂ))).trans <| + ((TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 3)).trans + (WithLp.linearEquiv 2 JetRing (Fin 3 → JetRing)).symm).restrictScalars ℂ + +open Matrix in +/-- The `(3, 1)_{4}` action of the jet gauge group on the jet space of the up-type +singlet. Through `jetValLinEquiv` the colour matrix of the gauge jet, carrying the +`4` hypercharge phase `u ^ 4`, acts `JetRing`-linearly on the colour factor by +matrix-vector multiplication, while the Weyl factor is untouched. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] UpSinglet) where + toFun U := + jetValLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 + ((((U.2.2 : unitary JetRing) : JetRing)) ^ 4 • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing))).restrictScalars ℂ) ∘ₗ + jetValLinEquiv.toLinearMap + map_one' := by + have hres : (1 : Module.End JetRing (EuclideanSpace JetRing (Fin 3))).restrictScalars ℂ + = 1 := rfl + rw [show ((((1 : JetGaugeGroupI).2.2 : unitary JetRing) : JetRing) ^ 4 • + (((1 : JetGaugeGroupI).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) = 1 from by simp, + map_one, hres, map_one] + ext d x + simp [-valLinEquiv_apply] + map_mul' U₁ U₂ := by + have hres : ∀ f g : Module.End JetRing (EuclideanSpace JetRing (Fin 3)), + (f * g).restrictScalars ℂ = f.restrictScalars ℂ * g.restrictScalars ℂ := + fun _ _ => rfl + have hM : ((((U₁ * U₂).2.2 : unitary JetRing) : JetRing) ^ 4 • + (((U₁ * U₂).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) = + (((U₁.2.2 : unitary JetRing) : JetRing) ^ 4 • + ((U₁.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) * + (((U₂.2.2 : unitary JetRing) : JetRing) ^ 4 • + ((U₂.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) := by + rw [show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) + from rfl, + show (((U₁ * U₂).1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) = + ((U₁.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) * + ((U₂.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + from rfl, + mul_pow, Matrix.smul_mul, Matrix.mul_smul, smul_smul] + rw [hM, map_mul, hres, map_mul] + ext d x + simp + +/-- The identification of the jets of the up-type singlet intertwines multiplication by +a scalar jet with the `JetRing`-scalar action on the colour coordinates. -/ +lemma jetValLinEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] UpSinglet) : + jetValLinEquiv (χ • z) + = Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 3)) χ).restrictScalars ℂ) + (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [smul_add, map_add, ha, hb, map_add, map_add] + | tmul f x => + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : UpSinglet) = 0 from rfl, TensorProduct.tmul_zero, + smul_zero, map_zero, map_zero] + | tmul ψ c => + rw [TensorProduct.smul_tmul', smul_eq_mul, + show jetValLinEquiv ((χ * f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (χ * f)) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + show Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 3)) χ).restrictScalars ℂ) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f)) + = ψ ⊗ₜ[ℂ] (χ • WithLp.toLp 2 fun i => c.ofLp i • f) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + show c.ofLp i • (χ * f) = χ * (c.ofLp i • f) + rw [Algebra.mul_smul_comm] + | add a b ha hb => + rw [show ({ val := a + b } : UpSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, smul_add, map_add, ha, hb, map_add, map_add] + +/-- **The jet gauge action on the jets of the up-type singlet is fibrewise**: it commutes +with multiplication by scalar jets. -/ +lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) + (z : JetRing ⊗[ℂ] UpSinglet) : + repJetGaugeGroupI U (χ • z) = χ • repJetGaugeGroupI U z := by + set S : Module.End JetRing (EuclideanSpace JetRing (Fin 3)) := + LinearMap.lsmul JetRing (EuclideanSpace JetRing (Fin 3)) χ with hS + set M : Module.End JetRing (EuclideanSpace JetRing (Fin 3)) := + (Matrix.toLpLinAlgEquiv 2 + ((((U.2.2 : unitary JetRing) : JetRing)) ^ 4 • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)) : + Module.End JetRing (EuclideanSpace JetRing (Fin 3))) with hM + have hMS : M * S = S * M := LinearMap.ext fun e => by + simp only [Module.End.mul_apply, hS, LinearMap.lsmul_apply, map_smul] + apply jetValLinEquiv.injective + rw [show repJetGaugeGroupI U (χ • z) + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.RightHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv (χ • z))) from rfl, + LinearEquiv.apply_symm_apply, jetValLinEquiv_smul, + show repJetGaugeGroupI U z + = jetValLinEquiv.symm (Module.End.lTensorAlgHom ℂ _ Fermion.RightHandedWeyl + (M.restrictScalars ℂ) (jetValLinEquiv z)) from rfl, + jetValLinEquiv_smul, LinearEquiv.apply_symm_apply, ← Module.End.mul_apply, + ← Module.End.mul_apply, ← map_mul, ← map_mul, + show M.restrictScalars ℂ * S.restrictScalars ℂ = (M * S).restrictScalars ℂ from rfl, + show S.restrictScalars ℂ * M.restrictScalars ℂ = (S * M).restrictScalars ℂ from rfl, + hMS] + +/-- On jets of constant gauge transformations the jet action reduces to the global +gauge action on the fibre: the `(3, 1)_{4}` action on the up-singlet factor, and the +trivial action on the jet ring. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + TensorProduct.map LinearMap.id (repGaugeGroupI g) := by + ext d x + obtain ⟨v⟩ := x + induction v using TensorProduct.induction_on with + | zero => simp [show ({ val := 0 } : UpSinglet) = 0 from rfl] + | tmul psi c => + apply jetValLinEquiv.injective + simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + have hu : (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) + = MvPowerSeries.C ((g.toU1.1 : ℂ)) := rfl + have hM : ∀ i j, (((JetGaugeGroupI.ofConstant g).1 : + specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) i j + = MvPowerSeries.C (g.toSU3.1 i j) := fun _ _ => rfl + have halg : ∀ A : Matrix (Fin 3) (Fin 3) JetRing, + (Matrix.toLpLinAlgEquiv 2 A : + Module.End JetRing (EuclideanSpace JetRing (Fin 3))) + = Matrix.toLpLin 2 2 A := fun _ => rfl + have hvec : ∀ i : Fin 3, + (∑ x, MvPowerSeries.C ((g.toSU3.1) i x) * (MvPowerSeries.C (c.ofLp x) * d)) + = MvPowerSeries.C (∑ x, (g.toSU3.1) i x * c.ofLp x) * d := by + intro i + rw [map_sum, Finset.sum_mul] + exact Finset.sum_congr rfl fun x _ => by rw [← mul_assoc, ← map_mul] + rw [TensorProduct.liftAux_tmul, ← TensorProduct.tmul_smul] + simp only [LinearMap.compl₂_apply, TensorProduct.mk_apply, LinearMap.smul_apply, + LinearMap.restrictScalars_apply, halg, Matrix.toLpLin_toLp] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + simp only [WithLp.ofLp_smul, Pi.smul_apply, Matrix.toLin'_apply, + Matrix.mulVec_apply_eq_sum, hM, Algebra.smul_def, MvPowerSeries.algebraMap_apply, + hu, map_pow, Algebra.algebraMap_self_apply] + rw [hvec i] + | add a b ha hb => + simp only [show ({ val := a + b } : UpSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + map_add, ha, hb] + end UpSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean index e3f5a1adb..706e255d2 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean @@ -198,6 +198,97 @@ noncomputable instance : LieAlgebra ℝ GaugeAlgebra where lie_smul t a b := by ext <;> simp [smul_sub] <;> ring +/-! + +## The adjoint action of the global gauge group + +-/ + +/-- The conjugate of a hermitian traceless matrix by a unitary matrix is hermitian and + traceless. -/ +lemma conj_mem {n : ℕ} {U A : Matrix (Fin n) (Fin n) ℂ} + (hU : U ∈ Matrix.unitaryGroup (Fin n) ℂ) (hA : star A = A) (htr : A.trace = 0) : + star (U * A * star U) = U * A * star U ∧ (U * A * star U).trace = 0 := by + constructor + · rw [star_mul, star_mul, star_star, hA, mul_assoc] + · rw [Matrix.trace_mul_cycle, Matrix.mem_unitaryGroup_iff'.mp hU, one_mul, htr] + +/-- The linear map by which one gauge group element acts on the gauge algebra in the + adjoint action: conjugation by the corresponding unitary on the `su(3)` and `su(2)` + factors, and the identity on the commutative `u(1)` factor. -/ +noncomputable def adjointMap (g : GaugeGroupI) : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra where + toFun a := ofMatrixProd + (g.toSU3.1 * a.toSU3Matrix * star g.toSU3.1, + g.toSU2.1 * a.toSU2Matrix * star g.toSU2.1, + a.toU1Value) + (conj_mem g.toSU3.2.1 a.1.2.1 a.1.2.2) + (conj_mem g.toSU2.2.1 a.2.1.2.1 a.2.1.2.2) + a.2.2.2 + map_add' a b := by + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [ofMatrixProd_toSU3Matrix, ofMatrixProd_toSU2Matrix, ofMatrixProd_toU1Value, + add_toSU3Matrix, add_toSU2Matrix, add_toU1Value, mul_add, add_mul] + map_smul' r a := by + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [ofMatrixProd_toSU3Matrix, ofMatrixProd_toSU2Matrix, ofMatrixProd_toU1Value, + smul_toSU3Matrix, smul_toSU2Matrix, smul_toU1Value, RingHom.id_apply, + Matrix.mul_smul, Matrix.smul_mul] + +@[simp] +lemma adjointMap_toSU3Matrix (g : GaugeGroupI) (a : GaugeAlgebra) : + (adjointMap g a).toSU3Matrix = g.toSU3.1 * a.toSU3Matrix * star g.toSU3.1 := rfl + +@[simp] +lemma adjointMap_toSU2Matrix (g : GaugeGroupI) (a : GaugeAlgebra) : + (adjointMap g a).toSU2Matrix = g.toSU2.1 * a.toSU2Matrix * star g.toSU2.1 := rfl + +@[simp] +lemma adjointMap_toU1Value (g : GaugeGroupI) (a : GaugeAlgebra) : + (adjointMap g a).toU1Value = a.toU1Value := rfl + +/-- **The adjoint action of the global gauge group on its gauge algebra**: conjugation by + the corresponding unitary on the `su(3)` and `su(2)` factors, and the trivial action on + the commutative `u(1)` factor. -/ +noncomputable def adjoint : Representation ℝ GaugeGroupI GaugeAlgebra where + toFun := adjointMap + map_one' := by + refine LinearMap.ext fun a => ext_of_matrix ?_ ?_ ?_ + · rw [adjointMap_toSU3Matrix, + show ((1 : GaugeGroupI).toSU3.1 : Matrix (Fin 3) (Fin 3) ℂ) = 1 from rfl, + one_mul, star_one, mul_one] + rfl + · rw [adjointMap_toSU2Matrix, + show ((1 : GaugeGroupI).toSU2.1 : Matrix (Fin 2) (Fin 2) ℂ) = 1 from rfl, + one_mul, star_one, mul_one] + rfl + · rfl + map_mul' g₁ g₂ := by + refine LinearMap.ext fun a => ext_of_matrix ?_ ?_ ?_ + · rw [Module.End.mul_apply, adjointMap_toSU3Matrix, adjointMap_toSU3Matrix, + adjointMap_toSU3Matrix, + show ((g₁ * g₂).toSU3.1 : Matrix (Fin 3) (Fin 3) ℂ) = g₁.toSU3.1 * g₂.toSU3.1 from rfl, + star_mul] + simp only [mul_assoc] + · rw [Module.End.mul_apply, adjointMap_toSU2Matrix, adjointMap_toSU2Matrix, + adjointMap_toSU2Matrix, + show ((g₁ * g₂).toSU2.1 : Matrix (Fin 2) (Fin 2) ℂ) = g₁.toSU2.1 * g₂.toSU2.1 from rfl, + star_mul] + simp only [mul_assoc] + · rw [Module.End.mul_apply, adjointMap_toU1Value, adjointMap_toU1Value, + adjointMap_toU1Value] + +@[simp] +lemma adjoint_toSU3Matrix (g : GaugeGroupI) (a : GaugeAlgebra) : + (adjoint g a).toSU3Matrix = g.toSU3.1 * a.toSU3Matrix * star g.toSU3.1 := rfl + +@[simp] +lemma adjoint_toSU2Matrix (g : GaugeGroupI) (a : GaugeAlgebra) : + (adjoint g a).toSU2Matrix = g.toSU2.1 * a.toSU2Matrix * star g.toSU2.1 := rfl + +@[simp] +lemma adjoint_toU1Value (g : GaugeGroupI) (a : GaugeAlgebra) : + (adjoint g a).toU1Value = a.toU1Value := rfl + end GaugeAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean deleted file mode 100644 index 37ab7c4b6..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeFieldAlglebra/Basic.lean +++ /dev/null @@ -1,14 +0,0 @@ -/-! - -## The gauge field algebra - -Similar to the algebra of the `BBoson`, we define the symmetric algebra -for all the gauge bosons in the Standard model. - -This should include seperate files for: -1. The Lie group action -2. The Gauge group action -3. The derivative. -4. The mass dimension grading etc. - --/ diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean new file mode 100644 index 000000000..070d660be --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean @@ -0,0 +1,257 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra +public import Physlib.Relativity.DerivAlgebra +public import Physlib.Mathematics.SymmetricAlgebra +public import Mathlib.LinearAlgebra.Dual.Lemmas +/-! +# The jet algebra of the Standard Model gauge bosons + +## i. Overview + +The gauge bosons of the Standard Model are jointly one bosonic field valued in +`Lorentz.CoVector ⊗[ℝ] GaugeAlgebra`: a spacetime covector with values in the gauge +algebra. Its *jet algebra* — the algebra in which the gauge-boson part of a Lagrangian +lives — is the free commutative algebra on the component functions `∂_s A_μ^φ` and is +built here in the same way as the `BBoson` jet algebra, but non-abelian and **without a +basis of the gauge algebra**: the adjoint index is carried by an abstract covector +`φ : Module.Dual ℝ GaugeAlgebra` throughout, following the dual-family formulation of +`Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued`. + +Following the split promised for this directory, the structure is: +1. this file — the target space, the jet component space, and the jet algebra with its + generators; +2. `LorentzAction` — the action of the Lorentz group; +3. `GaugeAction` — the action of the jet gauge group; +4. `JetDeriv` — the formal total derivative; +5. `MassDim` — the mass-dimension grading. + +## ii. Key results + +- `GaugeBoson` : the target space of the gauge-boson field. +- `GaugeBoson.repLorentzGroup` : the Lorentz action on the target space. +- `GaugeBoson.repGaugeGroupI` : the global (adjoint) gauge action on the target space. +- `GaugeBoson.JetComponentSpace` : the span of the component functions `∂_s A_μ^φ`. +- `GaugeJetAlgebra` : the jet algebra of the gauge bosons. +- `GaugeJetAlgebra.ofComponent`, `GaugeJetAlgebra.ofA` : the generators. + +## iii. Table of contents + +- A. The target space of the gauge-boson field + - A.1. Linear structure + - A.2. The Lorentz action on the target space + - A.3. The global gauge action on the target space +- B. The jet component space + - B.1. The component covectors +- C. The jet algebra + - C.1. The generators + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The target space of the gauge-boson field + +-/ + +/-- The target vector space of the Standard Model gauge-boson field: a spacetime covector + with values in the gauge algebra. Its components are the fields `A_μ^a`; here the + adjoint index is kept abstract, as the gauge-algebra factor. -/ +@[ext] +structure GaugeBoson where + /-- The underlying covector-valued gauge algebra element. -/ + val : Lorentz.CoVector ⊗[ℝ] GaugeAlgebra + +namespace GaugeBoson + +/-! + +### A.1. Linear structure + +-/ + +/-- Identifies a gauge boson with its underlying tensor-product value. -/ +def valEquiv : GaugeBoson ≃ Lorentz.CoVector ⊗[ℝ] GaugeAlgebra where + toFun := val + invFun := fun m => ⟨m⟩ + +noncomputable instance : AddCommGroup GaugeBoson := Equiv.addCommGroup valEquiv + +noncomputable instance : Module ℝ GaugeBoson := Equiv.module ℝ valEquiv + +/-- The linear identification with the underlying tensor product. -/ +def valLinEquiv : GaugeBoson ≃ₗ[ℝ] Lorentz.CoVector ⊗[ℝ] GaugeAlgebra where + toFun := val + invFun := fun m => ⟨m⟩ + map_add' := by intros; rfl + map_smul' := by intros; rfl + +@[simp] +lemma valLinEquiv_apply (v : GaugeBoson) : valLinEquiv v = v.val := rfl + +lemma valLinEquiv_symm_apply (m : Lorentz.CoVector ⊗[ℝ] GaugeAlgebra) : + valLinEquiv.symm m = ⟨m⟩ := rfl + +@[simp] +lemma val_add (v₁ v₂ : GaugeBoson) : (v₁ + v₂).val = v₁.val + v₂.val := rfl + +@[simp] +lemma val_smul (r : ℝ) (v : GaugeBoson) : (r • v).val = r • v.val := rfl + +instance : Module.Finite ℝ GaugeBoson := + Module.Finite.equiv valLinEquiv.symm + +/-! + +### A.2. The Lorentz action on the target space + +-/ + +open Matrix MatrixGroups + +/-- The Lorentz action on the gauge-boson target space: the covector action on the + spacetime index, and the trivial action on the gauge-algebra factor. -/ +noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) GaugeBoson where + toFun Λ := valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map (Lorentz.CoVector.sl2Rep Λ) LinearMap.id ∘ₗ + valLinEquiv.toLinearMap + map_one' := by + refine LinearMap.ext fun v => ?_ + simp [Module.End.one_eq_id, TensorProduct.map_id] + map_mul' Λ₁ Λ₂ := by + refine LinearMap.ext fun v => ?_ + simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + Module.End.mul_apply, LinearEquiv.apply_symm_apply, map_mul] + congr 1 + rw [← LinearMap.comp_apply, ← TensorProduct.map_comp, LinearMap.id_comp] + rfl + +/-! + +### A.3. The global gauge action on the target space + +-/ + +/-- The global gauge action on the gauge-boson target space: the adjoint action on the + gauge-algebra factor, and the trivial action on the spacetime index. -/ +noncomputable def repGaugeGroupI : Representation ℝ GaugeGroupI GaugeBoson where + toFun g := valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id (GaugeAlgebra.adjoint g) ∘ₗ + valLinEquiv.toLinearMap + map_one' := by + refine LinearMap.ext fun v => ?_ + simp [Module.End.one_eq_id, TensorProduct.map_id] + map_mul' g₁ g₂ := by + refine LinearMap.ext fun v => ?_ + simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + Module.End.mul_apply, LinearEquiv.apply_symm_apply, map_mul] + congr 1 + rw [← LinearMap.comp_apply, ← TensorProduct.map_comp, LinearMap.id_comp] + rfl + +/-! + +## B. The jet component space + +-/ + +/-- The jet component space of the gauge-boson field: the span of the component functions + `∂_s A_μ^φ`. The `DerivAlgebraReal` factor carries the derivative label `s`, and the + dual factor the spacetime and adjoint indices — the latter as an abstract covector on + the gauge algebra, with no basis chosen. Unlike a matter field, the gauge boson is real, + so there is no conjugate half. -/ +abbrev JetComponentSpace : Type := + DerivAlgebraReal ⊗[ℝ] Module.Dual ℝ GaugeBoson + +/-! + +### B.1. The component covectors + +-/ + +/-- The covector on the gauge-boson target space pairing the spacetime index against a + covector `ω` and the adjoint index against `φ`. -/ +noncomputable def componentDual : + Module.Dual ℝ Lorentz.CoVector →ₗ[ℝ] + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] Module.Dual ℝ GaugeBoson where + toFun ω := (Module.Dual.transpose (M := GaugeBoson) valLinEquiv.toLinearMap).comp + ((TensorProduct.dualDistrib ℝ Lorentz.CoVector GaugeAlgebra).comp + (TensorProduct.mk ℝ (Module.Dual ℝ Lorentz.CoVector) (Module.Dual ℝ GaugeAlgebra) ω)) + map_add' ω₁ ω₂ := by + refine LinearMap.ext fun φ => ?_ + simp [TensorProduct.add_tmul] + map_smul' r ω := by + refine LinearMap.ext fun φ => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, TensorProduct.mk_apply, + RingHom.id_apply, LinearMap.smul_apply] + rw [← TensorProduct.smul_tmul', map_smul, map_smul] + +@[simp] +lemma componentDual_apply_val_tmul (ω : Module.Dual ℝ Lorentz.CoVector) + (φ : Module.Dual ℝ GaugeAlgebra) (v : Lorentz.CoVector) (a : GaugeAlgebra) : + componentDual ω φ ⟨v ⊗ₜ[ℝ] a⟩ = ω v * φ a := by + simp [componentDual, Module.Dual.transpose_apply, valLinEquiv_symm_apply] + +end GaugeBoson + +/-! + +## C. The jet algebra + +-/ + +/-- **The jet algebra of the Standard Model gauge bosons**: the free commutative algebra + on the component functions `∂_s A_μ^φ` of the gauge-boson field, realized as the + symmetric algebra on the jet component space. The commutativity of the product is the + Bose statistics of the gauge fields. -/ +abbrev GaugeJetAlgebra : Type := SymmetricAlgebra ℝ GaugeBoson.JetComponentSpace + +namespace GaugeJetAlgebra + +/-! + +### C.1. The generators + +-/ + +/-- The undifferentiated component function `A^φ` of the gauge-boson field along a + covector `φ` on the target space. -/ +noncomputable def ofComponent : Module.Dual ℝ GaugeBoson →ₗ[ℝ] GaugeJetAlgebra := + (SymmetricAlgebra.ι ℝ _).comp + (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ GaugeBoson) 1) + +lemma ofComponent_apply (φ : Module.Dual ℝ GaugeBoson) : + ofComponent φ = SymmetricAlgebra.ι ℝ _ ((1 : DerivAlgebraReal) ⊗ₜ[ℝ] φ) := rfl + +/-- **The component function `A_μ^φ` of the gauge-boson field**: the spacetime index `μ` + paired against the Lorentz coordinate basis, the adjoint index against the abstract + covector `φ` on the gauge algebra. These are the generators the ambient theory sees; + no basis of the gauge algebra is involved. -/ +noncomputable def ofA (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] GaugeJetAlgebra := + ofComponent.comp (GaugeBoson.componentDual (Lorentz.CoVector.basis.dualBasis μ)) + +lemma ofA_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + ofA μ φ = ofComponent (GaugeBoson.componentDual + (Lorentz.CoVector.basis.dualBasis μ) φ) := rfl + +/-- The jet algebra is generated by the component functions. -/ +@[simp] +lemma adjoin_ι_eq_top : + Algebra.adjoin ℝ (Set.range (SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace)) = ⊤ := + SymmetricAlgebra.adjoin_range_ι + +end GaugeJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean new file mode 100644 index 000000000..56191e732 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean @@ -0,0 +1,1002 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +/-! +# The gauge action on the gauge-boson jet algebra + +## i. Overview + +A jet of gauge transformations `U` acts on the gauge field by +`A_μ ↦ Ad_U A_μ + mc(U)_μ`, so on a component function `∂_s A_μ^φ` it acts affinely: the +linear part is the all-orders Leibniz convolution of the Taylor coefficients of `Ad(U⁻¹)` +against lower component functions, and the constant part is the Taylor coefficient of the +Maurer–Cartan form of `U⁻¹`. The action extends to the whole jet algebra as the +substitution homomorphism determined by this affine action on the generators. + +The heart of the file is the *Taylor–Leibniz theorem* for the adjoint action +(`JetGaugeAlgebra.eval_iteratedDeriv_adjointMap`): the base-point Taylor coefficients of +`Ad_U Y` are the convolution of the coefficients of `Ad_U` — the `adjointCoeff` of the +covariance machinery — with those of `Y`. Multiplicativity of the transport and the +cocycle identity for the Maurer–Cartan shift are both corollaries. + +## ii. Key results + +- `JetGaugeAlgebra.eval_iteratedDeriv_adjointMap` : the Taylor–Leibniz theorem for the + adjoint action on jets. +- `IsGaugeField.adjointCoeff_mul` : the Taylor coefficients of `Ad` are multiplicative up + to convolution. +- `GaugeJetAlgebra.transport` : the linear part of the gauge action on the component + space. +- `GaugeJetAlgebra.mcShift` : the Maurer–Cartan shift. +- `GaugeJetAlgebra.repJetGaugeGroupI` : the action of the jet gauge group on the jet + algebra. +- `GaugeJetAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofA` : the transformation law of + the derivative generators, in the form used by `IsGaugeField`. + +## iii. Table of contents + +- A. Taylor–Leibniz for jets + - A.1. The scalar Leibniz rule for iterated derivatives + - A.2. The matrix Leibniz rule at the base point +- B. The Taylor–Leibniz theorem for the adjoint action + - B.1. Collapsing convolutions against constants + - B.2. The theorem + - B.3. Multiplicativity of the adjoint Taylor coefficients +- C. The transport on the component space +- D. The Maurer–Cartan shift +- E. The action of the jet gauge group + - E.1. The transformation law of the generators + +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace StandardModel + +open TensorProduct MvPowerSeries + +/-! + +## A. Taylor–Leibniz for jets + +-/ + +/-! + +### A.1. The scalar Leibniz rule for iterated derivatives + +-/ + +namespace JetRing + +/-- The iterated formal derivative is additive. -/ +lemma foldl_pderiv_add (s : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : + s.foldl (fun h ρ => pderiv ℂ ρ h) (f + g) + = s.foldl (fun h ρ => pderiv ℂ ρ h) f + s.foldl (fun h ρ => pderiv ℂ ρ h) g := by + induction s using Multiset.induction_on generalizing f g with + | empty => rfl + | cons μ t ih => rw [Multiset.foldl_cons, Multiset.foldl_cons, Multiset.foldl_cons, + map_add, ih] + +@[simp] +lemma foldl_pderiv_zero (s : Multiset (Fin 1 ⊕ Fin 3)) : + s.foldl (fun h ρ => pderiv ℂ ρ h) (0 : JetRing) = 0 := by + induction s using Multiset.induction_on with + | empty => rfl + | cons μ t ih => rw [Multiset.foldl_cons, map_zero, ih] + +/-- The iterated formal derivative of a finite sum. -/ +lemma foldl_pderiv_sum {κ : Type*} (s : Multiset (Fin 1 ⊕ Fin 3)) (t : Finset κ) + (f : κ → JetRing) : + s.foldl (fun h ρ => pderiv ℂ ρ h) (∑ k ∈ t, f k) + = ∑ k ∈ t, s.foldl (fun h ρ => pderiv ℂ ρ h) (f k) := by + classical + induction t using Finset.induction_on with + | empty => simp + | insert a t ha ih => rw [Finset.sum_insert ha, foldl_pderiv_add, ih, + Finset.sum_insert ha] + +/-- **The all-orders Leibniz rule for the iterated formal derivative** on the jet ring: + the derivative of a product distributes over the antidiagonal of the multiset of + directions. -/ +lemma foldl_pderiv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : + s.foldl (fun h ρ => pderiv ℂ ρ h) (f * g) + = (s.antidiagonal.map fun p => + p.1.foldl (fun h ρ => pderiv ℂ ρ h) f * + p.2.foldl (fun h ρ => pderiv ℂ ρ h) g).sum := by + induction s using Multiset.induction_on generalizing f g with + | empty => simp [Multiset.antidiagonal_zero] + | cons μ t ih => + rw [Multiset.foldl_cons, + show pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g from by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g], + foldl_pderiv_add, ih, ih, + Multiset.map_congr rfl (fun p hp => by + rw [show p.1.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) + = (μ ::ₘ p.1).foldl (fun h ρ => pderiv ℂ ρ h) f from + (Multiset.foldl_cons _ _ _ _).symm]), + show (t.antidiagonal.map fun p => + p.1.foldl (fun h ρ => pderiv ℂ ρ h) f * + p.2.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ g)).sum + = (t.antidiagonal.map fun p => + p.1.foldl (fun h ρ => pderiv ℂ ρ h) f * + (μ ::ₘ p.2).foldl (fun h ρ => pderiv ℂ ρ h) g).sum from + congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [show (μ ::ₘ p.2).foldl (fun h ρ => pderiv ℂ ρ h) g + = p.2.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ g) from + Multiset.foldl_cons _ _ _ _])] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + exact add_comm _ _ + +/-- The base-point Taylor coefficient of a product: the convolution of the base-point + Taylor coefficients. -/ +lemma constantCoeff_foldl_pderiv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : + constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (f * g)) + = (s.antidiagonal.map fun p => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f) * + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) g)).sum := by + rw [foldl_pderiv_mul, map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => map_mul _ _ _) + +/-- The iterated derivative of a constant jet vanishes for a nonempty multiset of + directions. -/ +lemma foldl_pderiv_C_of_ne_zero {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s ≠ 0) (c : ℂ) : + s.foldl (fun h ρ => pderiv ℂ ρ h) (C c : JetRing) = 0 := by + obtain ⟨μ, hμ⟩ := Multiset.exists_mem_of_ne_zero hs + obtain ⟨t, rfl⟩ := Multiset.exists_cons_of_mem hμ + rw [Multiset.foldl_cons, pderiv_C, foldl_pderiv_zero] + +end JetRing + +/-! + +### A.2. The matrix Leibniz rule at the base point + +-/ + +/-- The exchange of a finite sum with a multiset sum. -/ +lemma _root_.Multiset.sum_map_finsetSum {α β M : Type*} [AddCommMonoid M] + (m : Multiset α) (t : Finset β) (f : β → α → M) : + (m.map fun a => ∑ b ∈ t, f b a).sum = ∑ b ∈ t, (m.map (f b)).sum := by + induction m using Multiset.induction_on with + | empty => simp + | cons a s ih => + rw [Multiset.map_cons, Multiset.sum_cons, ih, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun b _ => by rw [Multiset.map_cons, Multiset.sum_cons] + +/-- The entry of a multiset sum of matrices is the multiset sum of the entries. -/ +lemma matrix_multiset_sum_apply {κ α : Type*} [AddCommMonoid α] + (m : Multiset (Matrix κ κ α)) (i j : κ) : + m.sum i j = (m.map fun A => A i j).sum := by + induction m using Multiset.induction_on with + | empty => rfl + | cons A t ih => + rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, ← ih, Matrix.add_apply] + +/-- **The matrix Leibniz rule at the base point**: the base-point Taylor coefficients of + a product of matrices of jets are the convolution of the base-point coefficients of the + factors. -/ +lemma matrix_constantCoeff_foldl_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] + (s : Multiset (Fin 1 ⊕ Fin 3)) (M N : Matrix κ κ JetRing) : + ((M * N).map fun f => constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (s.antidiagonal.map fun p => + (M.map fun f => constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (N.map fun f => constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + ext i j + rw [Matrix.map_apply, Matrix.mul_apply, JetRing.foldl_pderiv_sum, map_sum] + simp only [JetRing.constantCoeff_foldl_pderiv_mul] + rw [← Multiset.sum_map_finsetSum, matrix_multiset_sum_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, Matrix.mul_apply] + exact Finset.sum_congr rfl fun k _ => by rw [Matrix.map_apply, Matrix.map_apply] + +/-! + +## B. The Taylor–Leibniz theorem for the adjoint action + +-/ + +/-! + +### B.1. Collapsing convolutions against constants + +-/ + +/-- A sum over the antidiagonal of a family vanishing off `p.1 = 0` collapses to the + single term at `(0, s)`. -/ +lemma _root_.Multiset.sum_antidiagonal_eq_of_fst_ne_zero {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (F : Multiset ι × Multiset ι → M) + (hF : ∀ p : Multiset ι × Multiset ι, p.1 ≠ 0 → F p = 0) : + (s.antidiagonal.map F).sum = F (0, s) := by + induction s using Multiset.induction_on generalizing F with + | empty => simp [Multiset.antidiagonal_zero] + | cons a t ih => + rw [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, Multiset.map_map, + Multiset.map_map, + show ((t.antidiagonal.map (F ∘ Prod.map (Multiset.cons a) id)).sum) = 0 from + Multiset.sum_eq_zero fun x hx => by + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + exact hF _ (Multiset.cons_ne_zero), + add_zero, ih (F ∘ Prod.map id (Multiset.cons a)) fun p hp => hF _ hp] + rfl + +/-- A sum over the antidiagonal of a family vanishing off `p.2 = 0` collapses to the + single term at `(s, 0)`. -/ +lemma _root_.Multiset.sum_antidiagonal_eq_of_snd_ne_zero {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (F : Multiset ι × Multiset ι → M) + (hF : ∀ p : Multiset ι × Multiset ι, p.2 ≠ 0 → F p = 0) : + (s.antidiagonal.map F).sum = F (s, 0) := by + rw [show (s.antidiagonal.map F).sum + = (s.antidiagonal.map fun p => (fun a b => F (b, a)) p.2 p.1).sum from rfl, + ← Multiset.sum_antidiagonal_swap s (fun a b => F (b, a))] + exact Multiset.sum_antidiagonal_eq_of_fst_ne_zero s (fun p => F (p.2, p.1)) + fun p hp => hF _ hp + +/-- The exchange of the second and third slot in a nested antidiagonal sum. -/ +lemma _root_.Multiset.sum_antidiagonal_middle_exchange {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => h q.1 q.2 p.2).sum).sum + = (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => h q.1 p.2 q.2).sum).sum := by + rw [Multiset.sum_antidiagonal_assoc s h, + Multiset.sum_antidiagonal_assoc s (fun a b c => h a c b)] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + exact Multiset.sum_antidiagonal_swap p.2 (fun a b => h p.1 a b) + +/-- The convolution against a constant middle matrix: only the empty derivative multiset + survives on the constant factor. -/ +lemma matrix_cc_foldl_conj_const {κ : Type} [Fintype κ] [DecidableEq κ] + (p : Multiset (Fin 1 ⊕ Fin 3)) (P Q : Matrix κ κ JetRing) (b : Matrix κ κ ℂ) : + ((P * b.map (C : ℂ → JetRing) * Q).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (p.antidiagonal.map fun r => + (P.map fun f => constantCoeff (r.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * b * + (Q.map fun f => constantCoeff (r.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have hconst : ∀ m : Multiset (Fin 1 ⊕ Fin 3), + ((b.map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then b else 0 := by + intro m + rcases eq_or_ne m 0 with rfl | hm + · ext i j + simp [Matrix.map_apply, constantCoeff_C] + · ext i j + simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] + rw [matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun q hq => by + rw [matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun r hr => by rw [hconst r.2]), + Multiset.sum_antidiagonal_eq_of_snd_ne_zero q.1 + (fun r => (P.map fun f => + constantCoeff (r.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if r.2 = 0 then b else 0)) + (fun r hr => by rw [if_neg hr, Matrix.mul_zero]), + if_pos rfl])] + +/-! + +### B.2. The theorem + +-/ + +namespace GaugeAlgebra + +/-- The `su(3)` component of a multiset sum. -/ +lemma multiset_sum_toSU3Matrix (m : Multiset GaugeAlgebra) : + m.sum.toSU3Matrix = (m.map GaugeAlgebra.toSU3Matrix).sum := by + induction m using Multiset.induction_on with + | empty => rfl + | cons a t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, ← ih, + GaugeAlgebra.add_toSU3Matrix] + +/-- The `su(2)` component of a multiset sum. -/ +lemma multiset_sum_toSU2Matrix (m : Multiset GaugeAlgebra) : + m.sum.toSU2Matrix = (m.map GaugeAlgebra.toSU2Matrix).sum := by + induction m using Multiset.induction_on with + | empty => rfl + | cons a t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, ← ih, + GaugeAlgebra.add_toSU2Matrix] + +/-- The `u(1)` component of a multiset sum. -/ +lemma multiset_sum_toU1Value (m : Multiset GaugeAlgebra) : + m.sum.toU1Value = (m.map GaugeAlgebra.toU1Value).sum := by + induction m using Multiset.induction_on with + | empty => rfl + | cons a t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, ← ih, + GaugeAlgebra.add_toU1Value] + +end GaugeAlgebra + +namespace JetGaugeAlgebra + +/-- The `su(3)` component of the base-point Taylor coefficients. -/ +lemma eval_iteratedDeriv_toSU3Matrix (x : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (eval (iteratedDeriv x a)).toSU3Matrix + = a.toSU3Matrix.map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + ext i j + rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply, Matrix.map_apply] + +/-- The `su(2)` component of the base-point Taylor coefficients. -/ +lemma eval_iteratedDeriv_toSU2Matrix (x : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (eval (iteratedDeriv x a)).toSU2Matrix + = a.toSU2Matrix.map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + ext i j + rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply, Matrix.map_apply] + +/-- The `u(1)` component of the base-point Taylor coefficients. -/ +lemma eval_iteratedDeriv_toU1Value (x : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + (eval (iteratedDeriv x a)).toU1Value + = constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) a.toU1Value) := by + rw [eval_toU1Value_eq, iteratedDeriv_toU1Value] + +/-- The `su(3)` component of the adjoint Taylor coefficient. -/ +lemma _root_.StandardModel.IsGaugeField.adjointCoeff_toSU3Matrix (U : JetGaugeGroupI) + (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : + (IsGaugeField.adjointCoeff U p b).toSU3Matrix + = ((U.1.1 * b.toSU3Matrix.map (C : ℂ → JetRing) * star U.1.1).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + rw [IsGaugeField.adjointCoeff] + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + rw [eval_iteratedDeriv_toSU3Matrix, adjointMap_toSU3Matrix, ofConstant_toSU3Matrix] + +/-- The `su(2)` component of the adjoint Taylor coefficient. -/ +lemma _root_.StandardModel.IsGaugeField.adjointCoeff_toSU2Matrix (U : JetGaugeGroupI) + (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : + (IsGaugeField.adjointCoeff U p b).toSU2Matrix + = ((U.2.1.1 * b.toSU2Matrix.map (C : ℂ → JetRing) * star U.2.1.1).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + rw [IsGaugeField.adjointCoeff] + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + rw [eval_iteratedDeriv_toSU2Matrix, adjointMap_toSU2Matrix, ofConstant_toSU2Matrix] + +/-- The `u(1)` component of the adjoint Taylor coefficient. -/ +lemma _root_.StandardModel.IsGaugeField.adjointCoeff_toU1Value (U : JetGaugeGroupI) + (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : + (IsGaugeField.adjointCoeff U p b).toU1Value + = constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (C b.toU1Value)) := by + rw [IsGaugeField.adjointCoeff] + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + rw [eval_iteratedDeriv_toU1Value, adjointMap_toU1Value, ofConstant_toU1Value] + +/-- **The Taylor–Leibniz theorem for the adjoint action on jets**: the base-point Taylor + coefficients of `Ad_U Y` are the antidiagonal convolution of the Taylor coefficients of + `Ad_U` — the `IsGaugeField.adjointCoeff` of the covariance machinery — with those of + `Y`. -/ +theorem eval_iteratedDeriv_adjointMap (U : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) (Y : JetGaugeAlgebra) : + eval (iteratedDeriv x (adjointMap U Y)) + = (x.antidiagonal.map fun p => + IsGaugeField.adjointCoeff U p.1 (eval (iteratedDeriv p.2 Y))).sum := by + have hmat : ∀ {κ : Type} [Fintype κ] [DecidableEq κ] + (P Q W : Matrix κ κ JetRing), + ((P * W * Q).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (x.antidiagonal.map fun p => + (p.1.antidiagonal.map fun r => + (P.map fun f => constantCoeff (r.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (W.map fun f => constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (Q.map fun f => + constantCoeff (r.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum).sum := by + intro κ _ _ P Q W + rw [matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun p hp => by + rw [matrix_constantCoeff_foldl_pderiv_mul, ← Multiset.sum_map_mul_right])] + exact Multiset.sum_antidiagonal_middle_exchange x fun a b c => + (P.map fun f => constantCoeff (a.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (W.map fun f => constantCoeff (b.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (Q.map fun f => constantCoeff (c.foldl (fun h ρ => pderiv ℂ ρ h) f)) + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · rw [GaugeAlgebra.multiset_sum_toSU3Matrix, Multiset.map_map, + eval_iteratedDeriv_toSU3Matrix, adjointMap_toSU3Matrix, hmat U.1.1 (star U.1.1) + Y.toSU3Matrix] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, IsGaugeField.adjointCoeff_toSU3Matrix, + matrix_cc_foldl_conj_const, eval_iteratedDeriv_toSU3Matrix] + · rw [GaugeAlgebra.multiset_sum_toSU2Matrix, Multiset.map_map, + eval_iteratedDeriv_toSU2Matrix, adjointMap_toSU2Matrix, hmat U.2.1.1 (star U.2.1.1) + Y.toSU2Matrix] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, IsGaugeField.adjointCoeff_toSU2Matrix, + matrix_cc_foldl_conj_const, eval_iteratedDeriv_toSU2Matrix] + · rw [GaugeAlgebra.multiset_sum_toU1Value, Multiset.map_map, + eval_iteratedDeriv_toU1Value, adjointMap_toU1Value, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, IsGaugeField.adjointCoeff_toU1Value]), + Multiset.sum_antidiagonal_eq_of_fst_ne_zero x + (fun p => constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) + (C ((eval (iteratedDeriv p.2 Y)).toU1Value)))) + (fun p hp => by rw [JetRing.foldl_pderiv_C_of_ne_zero hp, map_zero]), + show ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) + (C ((eval (iteratedDeriv x Y)).toU1Value))) + = C ((eval (iteratedDeriv x Y)).toU1Value) from rfl, + constantCoeff_C, eval_iteratedDeriv_toU1Value] + +/-! + +### B.3. Multiplicativity of the adjoint Taylor coefficients + +-/ + +/-- **The adjoint Taylor coefficients are multiplicative up to convolution**: the + coefficient of a product of jets of gauge transformations is the antidiagonal + convolution of the coefficients of the factors. -/ +lemma _root_.StandardModel.IsGaugeField.adjointCoeff_mul (U V : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.adjointCoeff (U * V) x + = (x.antidiagonal.map fun p => + IsGaugeField.adjointCoeff U p.1 ∘ₗ IsGaugeField.adjointCoeff V p.2).sum := by + refine LinearMap.ext fun a => ?_ + rw [Multiset.sum_linearMap_apply, Multiset.map_map, + show IsGaugeField.adjointCoeff (U * V) x a + = eval (iteratedDeriv x (adjointMap U (adjointMap V (ofConstant a)))) from by + rw [IsGaugeField.adjointCoeff] + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + rw [show adjointMap (U * V) (ofConstant a) + = adjointMap U (adjointMap V (ofConstant a)) from by + rw [show adjointMap (U * V) = JetGaugeAlgebra.adjoint (U * V) from rfl, map_mul] + rfl], + eval_iteratedDeriv_adjointMap] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [Function.comp_apply, LinearMap.comp_apply] + rfl) + +/-- The iterated derivative of a constant jet vanishes for a nonempty multiset of + directions. -/ +lemma iteratedDeriv_ofConstant_of_ne_zero {p : Multiset (Fin 1 ⊕ Fin 3)} (hp : p ≠ 0) + (a : GaugeAlgebra) : iteratedDeriv p (ofConstant a) = 0 := by + induction p using Multiset.induction_on with + | empty => exact absurd rfl hp + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply] + rcases eq_or_ne t 0 with rfl | ht + · rw [iteratedDeriv_zero, LinearMap.id_apply, JetGaugeAlgebra.deriv_ofConstant] + · rw [ih ht, map_zero] + +/-- The adjoint Taylor coefficient of the identity: only the base point survives. -/ +lemma _root_.StandardModel.IsGaugeField.adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.adjointCoeff (1 : JetGaugeGroupI) p + = if p = 0 then LinearMap.id else 0 := by + refine LinearMap.ext fun a => ?_ + rw [IsGaugeField.adjointCoeff] + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + rw [show adjointMap (1 : JetGaugeGroupI) (ofConstant a) = ofConstant a from by + rw [show adjointMap (1 : JetGaugeGroupI) = JetGaugeAlgebra.adjoint 1 from rfl, map_one] + rfl] + rcases eq_or_ne p 0 with rfl | hp + · rw [iteratedDeriv_zero, LinearMap.id_apply, eval_ofConstant, if_pos rfl, + LinearMap.id_apply] + · rw [iteratedDeriv_ofConstant_of_ne_zero hp, map_zero, if_neg hp, LinearMap.zero_apply] + +end JetGaugeAlgebra + +/-! + +## C. The transport on the component space + +-/ + +namespace GaugeBoson + +/-- The adjoint transport on the gauge-boson target space at `p` derivatives: the adjoint + Taylor coefficient on the gauge-algebra factor, the identity on the spacetime index. -/ +noncomputable def adjointTransport (U : JetGaugeGroupI) (p : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeBoson →ₗ[ℝ] GaugeBoson := + valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff U p) ∘ₗ + valLinEquiv.toLinearMap + +lemma adjointTransport_mk_tmul (U : JetGaugeGroupI) (p : Multiset (Fin 1 ⊕ Fin 3)) + (v : Lorentz.CoVector) (a : GaugeAlgebra) : + adjointTransport U p ⟨v ⊗ₜ[ℝ] a⟩ = ⟨v ⊗ₜ[ℝ] IsGaugeField.adjointCoeff U p a⟩ := rfl + +/-- The adjoint transport at the identity: only the base point survives. -/ +lemma adjointTransport_one (p : Multiset (Fin 1 ⊕ Fin 3)) : + adjointTransport 1 p = if p = 0 then LinearMap.id else 0 := by + rw [adjointTransport, IsGaugeField.adjointCoeff_one] + rcases eq_or_ne p 0 with rfl | hp + · rw [if_pos rfl, if_pos rfl, TensorProduct.map_id] + refine LinearMap.ext fun v => ?_ + simp + · rw [if_neg hp, if_neg hp] + refine LinearMap.ext fun v => ?_ + rw [show TensorProduct.map (LinearMap.id (M := Lorentz.CoVector)) + (0 : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) = 0 from by + refine TensorProduct.ext' fun x a => ?_ + rw [TensorProduct.map_tmul, LinearMap.zero_apply, TensorProduct.tmul_zero] + rfl] + simp + +/-- The adjoint transport of a product: the antidiagonal convolution of transports. -/ +lemma adjointTransport_mul (U V : JetGaugeGroupI) (p : Multiset (Fin 1 ⊕ Fin 3)) : + adjointTransport (U * V) p + = (p.antidiagonal.map fun r => + adjointTransport U r.1 ∘ₗ adjointTransport V r.2).sum := by + refine LinearMap.ext fun v => ?_ + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : GaugeBoson) = 0 from rfl, map_zero] + refine (Multiset.sum_eq_zero fun x hx => ?_).symm + obtain ⟨r, hr, rfl⟩ := Multiset.mem_map.mp hx + simp + | tmul x a => + apply valLinEquiv.injective + rw [adjointTransport_mk_tmul, map_multiset_sum, Multiset.map_map, valLinEquiv_apply, + show ((⟨x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff (U * V) p a⟩ : GaugeBoson)).val + = x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff (U * V) p a from rfl, + IsGaugeField.adjointCoeff_mul, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.tmul_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.comp_apply, adjointTransport_mk_tmul, + valLinEquiv_apply] + | add m₁ m₂ h₁ h₂ => + rw [show (⟨m₁ + m₂⟩ : GaugeBoson) = (⟨m₁⟩ : GaugeBoson) + ⟨m₂⟩ from rfl, map_add, h₁, + h₂, ← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + exact (map_add _ _ _).symm + +/-- The dual transport carries a component covector to the component covector of the + transported adjoint index: the spacetime slot is untouched. -/ +lemma dualMap_adjointTransport_componentDual (U : JetGaugeGroupI) + (p : Multiset (Fin 1 ⊕ Fin 3)) (ω : Module.Dual ℝ Lorentz.CoVector) + (φ : Module.Dual ℝ GaugeAlgebra) : + (adjointTransport U p).dualMap (componentDual ω φ) + = componentDual ω (φ ∘ₗ IsGaugeField.adjointCoeff U p) := by + refine LinearMap.ext fun v => ?_ + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : GaugeBoson) = 0 from rfl, map_zero, map_zero] + | tmul x a => + rw [LinearMap.dualMap_apply, adjointTransport_mk_tmul, + componentDual_apply_val_tmul, componentDual_apply_val_tmul] + rfl + | add m₁ m₂ h₁ h₂ => + rw [show (⟨m₁ + m₂⟩ : GaugeBoson) = (⟨m₁⟩ : GaugeBoson) + ⟨m₂⟩ from rfl, map_add, + map_add, h₁, h₂] + +end GaugeBoson + +namespace GaugeJetAlgebra + +/-- The value of the transport on the derivative symbol at `s`: the all-orders Leibniz + convolution of the dual adjoint transports against lower derivative symbols. -/ +noncomputable def transportFun (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ GaugeBoson →ₗ[ℝ] GaugeBoson.JetComponentSpace := + (s.antidiagonal.map fun p => + (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ GaugeBoson) + (LagrangianTheory.dualRealJetAlgebraBasis p.2)).comp + ((GaugeBoson.adjointTransport U p.1).dualMap)).sum + +/-- **The linear part of the gauge action on the jet component space**: on a component + function `∂_s A^ψ` it is the all-orders Leibniz convolution of the Taylor coefficients + of the adjoint action of `U` against the lower component functions. -/ +noncomputable def transport (U : JetGaugeGroupI) : + GaugeBoson.JetComponentSpace →ₗ[ℝ] GaugeBoson.JetComponentSpace := + TensorProduct.lift (LagrangianTheory.dualRealJetAlgebraBasis.constr ℝ (transportFun U)) + +lemma transport_basis_tmul (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ψ : Module.Dual ℝ GaugeBoson) : + transport U (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ) + = (s.antidiagonal.map fun p => + LagrangianTheory.dualRealJetAlgebraBasis p.2 ⊗ₜ[ℝ] + (GaugeBoson.adjointTransport U p.1).dualMap ψ).sum := by + rw [transport, TensorProduct.lift.tmul, Module.Basis.constr_basis, transportFun, + Multiset.sum_linearMap_apply, Multiset.map_map] + rfl + +/-- Two maps out of the jet component space agree if they agree on the components + `∂_s A^ψ` with `s` a derivative multiset and `ψ` an arbitrary covector. -/ +lemma _root_.StandardModel.GaugeBoson.JetComponentSpace.ext_of_basis + {M : Type*} [AddCommMonoid M] [Module ℝ M] + {F G : GaugeBoson.JetComponentSpace →ₗ[ℝ] M} + (h : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeBoson), + F (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ) + = G (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ)) : F = G := by + refine LinearMap.ext fun x => ?_ + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb] + | tmul a ψ => + have ha : a ∈ Submodule.span ℝ + (Set.range LagrangianTheory.dualRealJetAlgebraBasis) := by + rw [LagrangianTheory.dualRealJetAlgebraBasis.span_eq]; trivial + induction ha using Submodule.span_induction with + | mem b hb => obtain ⟨s, rfl⟩ := hb; exact h s ψ + | zero => rw [TensorProduct.zero_tmul, map_zero, map_zero] + | add b c _ _ hb hc => rw [TensorProduct.add_tmul, map_add, map_add, hb, hc] + | smul c b _ hb => rw [← TensorProduct.smul_tmul', map_smul, map_smul, hb] + +/-- The transport of the identity is the identity. -/ +lemma transport_one : transport (1 : JetGaugeGroupI) = LinearMap.id := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + rw [transport_basis_tmul, + Multiset.map_congr rfl (fun p hp => by rw [GaugeBoson.adjointTransport_one]), + Multiset.sum_antidiagonal_eq_of_fst_ne_zero s + (fun p => LagrangianTheory.dualRealJetAlgebraBasis p.2 ⊗ₜ[ℝ] + ((if p.1 = 0 then LinearMap.id else 0) : + GaugeBoson →ₗ[ℝ] GaugeBoson).dualMap ψ) + (fun p hp => by + rw [if_neg hp, show ((0 : GaugeBoson →ₗ[ℝ] GaugeBoson)).dualMap ψ = 0 from + LinearMap.ext fun v => by simp, TensorProduct.tmul_zero]), + if_pos rfl, LinearMap.id_apply, + show (LinearMap.id : GaugeBoson →ₗ[ℝ] GaugeBoson).dualMap ψ = ψ from + LinearMap.ext fun v => rfl] + +/-- **The transport is an anti-homomorphism**: the transport of a product is the reverse + composite. Composed with the inverse, it becomes the linear part of the gauge + representation. -/ +lemma transport_mul (U V : JetGaugeGroupI) : + transport (U * V) = transport V ∘ₗ transport U := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + have hdual : ∀ (p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3)), + (GaugeBoson.adjointTransport (U * V) p.1).dualMap ψ + = (p.1.antidiagonal.map fun r => + (GaugeBoson.adjointTransport V r.2).dualMap + ((GaugeBoson.adjointTransport U r.1).dualMap ψ)).sum := by + intro p + rw [GaugeBoson.adjointTransport_mul] + refine LinearMap.ext fun v => ?_ + rw [LinearMap.dualMap_apply, Multiset.sum_linearMap_apply, Multiset.map_map, + map_multiset_sum, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + rfl + have hLHS : transport (U * V) (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ) + = (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + LagrangianTheory.dualRealJetAlgebraBasis p.2 ⊗ₜ[ℝ] + (GaugeBoson.adjointTransport V q.2).dualMap + ((GaugeBoson.adjointTransport U q.1).dualMap ψ)).sum).sum := by + rw [transport_basis_tmul] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [hdual p, Multiset.tmul_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl) + have hRHS : (transport V ∘ₗ transport U) + (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ) + = (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun q => + LagrangianTheory.dualRealJetAlgebraBasis q.2 ⊗ₜ[ℝ] + (GaugeBoson.adjointTransport V q.1).dualMap + ((GaugeBoson.adjointTransport U p.1).dualMap ψ)).sum).sum := by + rw [LinearMap.comp_apply, transport_basis_tmul, map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + exact transport_basis_tmul V p.2 _ + rw [hLHS, hRHS] + exact Multiset.sum_antidiagonal_assoc s fun a b c => + LagrangianTheory.dualRealJetAlgebraBasis c ⊗ₜ[ℝ] + (GaugeBoson.adjointTransport V b).dualMap + ((GaugeBoson.adjointTransport U a).dualMap ψ) + +end GaugeJetAlgebra + +/-! + +## D. The Maurer–Cartan shift + +-/ + +namespace GaugeJetAlgebra + +/-- The Taylor coefficient of the Maurer–Cartan form of `U` at the derivative multiset + `s`, packaged as a gauge boson: the spacetime index runs over the coordinate + directions, the adjoint index over the base-point Taylor coefficients of the + Maurer–Cartan form. -/ +noncomputable def mcBosonCoeff (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeBoson := + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s (maurerCartanForm U μ))⟩ + +@[simp] +lemma mcBosonCoeff_one (s : Multiset (Fin 1 ⊕ Fin 3)) : mcBosonCoeff 1 s = 0 := by + rw [show (0 : GaugeBoson) = ⟨0⟩ from rfl, mcBosonCoeff] + congr 1 + refine Finset.sum_eq_zero fun μ _ => ?_ + rw [show maurerCartanForm 1 μ = 0 from congrFun maurerCartanForm_one μ, map_zero, + map_zero, TensorProduct.tmul_zero] + +/-- The Maurer–Cartan Taylor coefficients of a product: the cocycle identity, with the + adjoint transport convoluted in by the Taylor–Leibniz theorem. -/ +lemma mcBosonCoeff_mul (U V : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : + mcBosonCoeff (U * V) s + = mcBosonCoeff U s + + (s.antidiagonal.map fun p => + GaugeBoson.adjointTransport U p.1 (mcBosonCoeff V p.2)).sum := by + apply GaugeBoson.valLinEquiv.injective + have hE : ∀ (W : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)), + GaugeBoson.valLinEquiv (mcBosonCoeff W t) + = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv t + (maurerCartanForm W μ)) := fun W t => rfl + have hB : ∀ p q : Multiset (Fin 1 ⊕ Fin 3), + GaugeBoson.valLinEquiv (GaugeBoson.adjointTransport U p (mcBosonCoeff V q)) + = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + IsGaugeField.adjointCoeff U p (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv q (maurerCartanForm V μ))) := by + intro p q + rw [show GaugeBoson.valLinEquiv (GaugeBoson.adjointTransport U p (mcBosonCoeff V q)) + = TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff U p) + (GaugeBoson.valLinEquiv (mcBosonCoeff V q)) from by + rw [GaugeBoson.adjointTransport] + simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + LinearEquiv.apply_symm_apply], + hE, map_sum] + exact Finset.sum_congr rfl fun μ _ => by + rw [TensorProduct.map_tmul, LinearMap.id_apply] + have hA : GaugeBoson.valLinEquiv (mcBosonCoeff (U * V) s) + = ∑ μ, (Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s (maurerCartanForm U μ)) + + (s.antidiagonal.map fun p => + Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + IsGaugeField.adjointCoeff U p.1 (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm V μ)))).sum) := by + rw [hE] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [show maurerCartanForm (U * V) μ + = maurerCartanForm U μ + JetGaugeAlgebra.adjoint U (maurerCartanForm V μ) from + maurerCartanForm_cocycle U V μ, + map_add, map_add, + show JetGaugeAlgebra.adjoint U (maurerCartanForm V μ) + = JetGaugeAlgebra.adjointMap U (maurerCartanForm V μ) from rfl, + JetGaugeAlgebra.eval_iteratedDeriv_adjointMap, TensorProduct.tmul_add, + Multiset.tmul_sum, Multiset.map_map] + exact congrArg (fun z => _ + z) + (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => rfl)) + rw [hA, Finset.sum_add_distrib, map_add, map_multiset_sum, Multiset.map_map, ← hE, + ← Multiset.sum_map_finsetSum] + congr 1 + +/-- **The Maurer–Cartan shift**: the linear functional on the component space pairing a + component `∂_s A^ψ` with the Taylor coefficient of the Maurer–Cartan form of `U`. It is + the constant part of the affine gauge action. -/ +noncomputable def mcShift (U : JetGaugeGroupI) : GaugeBoson.JetComponentSpace →ₗ[ℝ] ℝ := + TensorProduct.lift (LagrangianTheory.dualRealJetAlgebraBasis.constr ℝ fun s => + Module.Dual.eval ℝ GaugeBoson (mcBosonCoeff U s)) + +lemma mcShift_basis_tmul (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ψ : Module.Dual ℝ GaugeBoson) : + mcShift U (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ) + = ψ (mcBosonCoeff U s) := by + rw [mcShift, TensorProduct.lift.tmul, Module.Basis.constr_basis] + rfl + +@[simp] +lemma mcShift_one : mcShift (1 : JetGaugeGroupI) = 0 := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + rw [mcShift_basis_tmul, mcBosonCoeff_one, map_zero, LinearMap.zero_apply] + +/-- **The cocycle identity for the Maurer–Cartan shift.** -/ +lemma mcShift_mul (U V : JetGaugeGroupI) : + mcShift (U * V) = mcShift V ∘ₗ transport U + mcShift U := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + rw [LinearMap.add_apply, LinearMap.comp_apply, mcShift_basis_tmul, mcBosonCoeff_mul, + map_add, add_comm] + congr 1 + · rw [map_multiset_sum, Multiset.map_map, transport_basis_tmul, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, Function.comp_apply, mcShift_basis_tmul] + rfl + · exact (mcShift_basis_tmul U s ψ).symm + +/-! + +## E. The action of the jet gauge group + +-/ + +/-- The affine action of a jet of gauge transformations on the generators of the jet + algebra: the transported component plus the Maurer–Cartan shift, both of `U⁻¹` — the + contragredient convention for an action on component functions. -/ +noncomputable def gaugeGen (U : JetGaugeGroupI) : + GaugeBoson.JetComponentSpace →ₗ[ℝ] GaugeJetAlgebra := + (SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace).comp (transport U⁻¹) + + (Algebra.linearMap ℝ GaugeJetAlgebra).comp (mcShift U⁻¹) + +lemma gaugeGen_apply (U : JetGaugeGroupI) (x : GaugeBoson.JetComponentSpace) : + gaugeGen U x = SymmetricAlgebra.ι ℝ _ (transport U⁻¹ x) + + algebraMap ℝ GaugeJetAlgebra (mcShift U⁻¹ x) := rfl + +/-- **The action of the jet gauge group on the gauge-boson jet algebra**: the substitution + homomorphism determined by the affine action on the generators, `∂_s A^ψ` going to its + transported convolution plus the Maurer–Cartan shift of `U⁻¹`. -/ +noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI GaugeJetAlgebra where + toFun U := (SymmetricAlgebra.lift (gaugeGen U)).toLinearMap + map_one' := by + suffices h : SymmetricAlgebra.lift (gaugeGen 1) = AlgHom.id ℝ GaugeJetAlgebra by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + show SymmetricAlgebra.lift (gaugeGen 1) (SymmetricAlgebra.ι ℝ _ x) + = AlgHom.id ℝ GaugeJetAlgebra (SymmetricAlgebra.ι ℝ _ x) + rw [SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, inv_one, transport_one, + mcShift_one, LinearMap.id_apply, LinearMap.zero_apply, map_zero, add_zero] + rfl + map_mul' U V := by + suffices h : SymmetricAlgebra.lift (gaugeGen (U * V)) + = (SymmetricAlgebra.lift (gaugeGen U)).comp (SymmetricAlgebra.lift (gaugeGen V)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + show SymmetricAlgebra.lift (gaugeGen (U * V)) (SymmetricAlgebra.ι ℝ _ x) + = ((SymmetricAlgebra.lift (gaugeGen U)).comp (SymmetricAlgebra.lift (gaugeGen V))) + (SymmetricAlgebra.ι ℝ _ x) + rw [SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, AlgHom.comp_apply, + SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, map_add, + SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, AlgHom.commutes, + mul_inv_rev, transport_mul, mcShift_mul, LinearMap.comp_apply, + LinearMap.add_apply, LinearMap.comp_apply, map_add, add_assoc] + +/-- The action of `U` as an algebra homomorphism: a jet of gauge transformations acts on + a Lagrangian term factor by factor. -/ +noncomputable def repJetGaugeGroupIAlgHom (U : JetGaugeGroupI) : + GaugeJetAlgebra →ₐ[ℝ] GaugeJetAlgebra := + SymmetricAlgebra.lift (gaugeGen U) + +@[simp] +lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : GaugeBoson.JetComponentSpace) : + repJetGaugeGroupI U (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.ι ℝ _ (transport U⁻¹ x) + + algebraMap ℝ GaugeJetAlgebra (mcShift U⁻¹ x) := by + rw [show repJetGaugeGroupI U (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.lift (gaugeGen U) (SymmetricAlgebra.ι ℝ _ x) from rfl, + SymmetricAlgebra.lift_ι_apply, gaugeGen_apply] + +@[simp] +lemma repJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : + repJetGaugeGroupI U (1 : GaugeJetAlgebra) = 1 := by + rw [show repJetGaugeGroupI U (1 : GaugeJetAlgebra) + = SymmetricAlgebra.lift (gaugeGen U) 1 from rfl, map_one] + +lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : GaugeJetAlgebra) : + repJetGaugeGroupI U (x * y) = repJetGaugeGroupI U x * repJetGaugeGroupI U y := by + rw [show repJetGaugeGroupI U (x * y) + = SymmetricAlgebra.lift (gaugeGen U) (x * y) from rfl, map_mul] + rfl + +@[simp] +lemma repJetGaugeGroupI_algebraMap (U : JetGaugeGroupI) (r : ℝ) : + repJetGaugeGroupI U (algebraMap ℝ GaugeJetAlgebra r) + = algebraMap ℝ GaugeJetAlgebra r := by + rw [show repJetGaugeGroupI U (algebraMap ℝ GaugeJetAlgebra r) + = SymmetricAlgebra.lift (gaugeGen U) (algebraMap ℝ GaugeJetAlgebra r) from rfl, + AlgHom.commutes] + +/-! + +### E.1. The transformation law of the generators + +-/ + +/-- The component covector at `μ` picks the `μ`-th Maurer–Cartan Taylor coefficient out + of the shift. -/ +lemma componentDual_dualBasis_mcBosonCoeff (W : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + GaugeBoson.componentDual (Lorentz.CoVector.basis.dualBasis μ) φ (mcBosonCoeff W s) + = φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s + (maurerCartanForm W μ))) := by + have hsum : mcBosonCoeff W s + = ∑ ν, (⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s + (maurerCartanForm W ν))⟩ : GaugeBoson) := by + apply GaugeBoson.valLinEquiv.injective + rw [map_sum] + rfl + rw [hsum, map_sum] + rw [Finset.sum_congr rfl fun ν _ => GaugeBoson.componentDual_apply_val_tmul _ _ _ _] + rw [Finset.sum_congr rfl fun ν _ => by + rw [Module.Basis.dualBasis_apply_self, ite_mul, one_mul, zero_mul]] + rw [Finset.sum_ite_eq' Finset.univ μ + (fun ν => φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s + (maurerCartanForm W ν)))), if_pos (Finset.mem_univ μ)] + +/-- **The transformation law of the derivative generators**, in the form used by + `IsGaugeField`: a jet of gauge transformations acts on `∂_s A_μ^φ` by the all-orders + Leibniz convolution of the adjoint Taylor coefficients of `U⁻¹` against lower + generators, plus the Taylor coefficient of the Maurer–Cartan form of `U⁻¹`. -/ +theorem repJetGaugeGroupI_iteratedJetDeriv_ofA (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repJetGaugeGroupI U (iteratedJetDeriv s (ofA μ φ)) + = (s.antidiagonal.map fun p => + iteratedJetDeriv p.2 (ofA μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + + algebraMap ℝ GaugeJetAlgebra + (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s + (maurerCartanForm U⁻¹ μ)))) := by + rw [iteratedJetDeriv_ofA, repJetGaugeGroupI_ι, transport_basis_tmul, mcShift_basis_tmul, + componentDual_dualBasis_mcBosonCoeff, map_multiset_sum, Multiset.map_map] + congr 1 + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, GaugeBoson.dualMap_adjointTransport_componentDual, + iteratedJetDeriv_ofA] + rfl + +/-! + +### E.2. The complexified action + +-/ + +/-- The action of the jet gauge group on the complexified gauge-boson jet algebra, by + base change. -/ +noncomputable def complexRepJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (ℂ ⊗[ℝ] GaugeJetAlgebra) where + toFun U := LinearMap.baseChange ℂ (repJetGaugeGroupI U) + map_one' := by + rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] + map_mul' U V := by + rw [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp, Module.End.mul_eq_comp] + +@[simp] +lemma complexRepJetGaugeGroupI_tmul (U : JetGaugeGroupI) (z : ℂ) (x : GaugeJetAlgebra) : + complexRepJetGaugeGroupI U (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repJetGaugeGroupI U x := rfl + +lemma complexRepJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) + (x y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + complexRepJetGaugeGroupI U (x * y) + = complexRepJetGaugeGroupI U x * complexRepJetGaugeGroupI U y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => rw [add_mul, map_add, map_add, h₁, h₂, add_mul] + | tmul z₁ a₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => rw [mul_add, map_add, map_add, h₁, h₂, mul_add] + | tmul z₂ a₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, complexRepJetGaugeGroupI_tmul, + complexRepJetGaugeGroupI_tmul, complexRepJetGaugeGroupI_tmul, + repJetGaugeGroupI_apply_mul, Algebra.TensorProduct.tmul_mul_tmul] + +/-- The iterated complexified derivative of a real element is the complexification of the + iterated real derivative. -/ +lemma iteratedD_complexJetDeriv_one_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : GaugeJetAlgebra) : + Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm s ((1 : ℂ) ⊗ₜ[ℝ] x) + = (1 : ℂ) ⊗ₜ[ℝ] iteratedJetDeriv s x := by + induction s using Multiset.induction_on generalizing x with + | empty => rw [Lorentz.iteratedD_zero, iteratedJetDeriv_zero]; rfl + | cons μ s ih => + rw [Lorentz.iteratedD_cons, LinearMap.comp_apply, ih, complexJetDeriv_tmul, + iteratedJetDeriv_cons, LinearMap.comp_apply] + +/-- A real scalar in the complexified jet algebra is the corresponding complex scalar. -/ +lemma one_tmul_algebraMap (r : ℝ) : + (1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ GaugeJetAlgebra r) + = algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra) ((r : ℝ) : ℂ) := by + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, + Algebra.algebraMap_eq_smul_one, + show ((r : ℝ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : GaugeJetAlgebra))) + = (((r : ℝ) : ℂ)) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : GaugeJetAlgebra)) from + (algebraMap_smul ℂ r _).symm, Algebra.TensorProduct.one_def] + +/-- **The transformation law of the derivative generators on the complexification**: the + form consumed by the `IsGaugeField` structure of the ambient Lagrangian theory. -/ +theorem complexRepJetGaugeGroupI_iteratedD_one_tmul_ofA (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + complexRepJetGaugeGroupI U (Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm s + ((1 : ℂ) ⊗ₜ[ℝ] ofA μ φ)) + = (s.antidiagonal.map fun p => + Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm p.2 + ((1 : ℂ) ⊗ₜ[ℝ] ofA μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + + algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra) + (((φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s + (maurerCartanForm U⁻¹ μ))) : ℝ)) : ℂ) := by + rw [iteratedD_complexJetDeriv_one_tmul, complexRepJetGaugeGroupI_tmul, + repJetGaugeGroupI_iteratedJetDeriv_ofA, TensorProduct.tmul_add, Multiset.tmul_sum, + Multiset.map_map, one_tmul_algebraMap] + congr 1 + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [Function.comp_apply, iteratedD_complexJetDeriv_one_tmul]) + +end GaugeJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean new file mode 100644 index 000000000..725df00cd --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized +/-! +# Gauge invariants of the gauge-boson jet algebra + +## i. Overview + +The gauge-boson jet algebra, complexified, together with its Lorentz action, jet gauge +action, gauge-field generators and total derivative, is a *gauge field* in the sense of +the abstract covariance machinery of +`Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued`: the structure `IsGaugeField` +holds. This file establishes that instance and instantiates the abstract classification +of invariants: + +**a gauge-invariant element of the subalgebra generated by the gauge-field symbols +`∂_s A_μ^φ` — together with any set `S` of elements fixed by the pure jets — is a +polynomial in the covariant derivatives of the field strength and the elements of `S`.** + +This is the covariance reduction for the gauge sector: after it, only the field +strengths, their covariant derivatives, and the matter content `S` remain. + +## ii. Key results + +- `GaugeJetAlgebra.gaugeField` : the gauge-field generators, as a family over the dual of + the gauge algebra. +- `GaugeJetAlgebra.isGaugeField` : the complexified gauge-boson jet algebra is a gauge + field. +- `GaugeJetAlgebra.invariant_mem_adjoin_fieldStrength` : the classification of gauge + invariants. + +## iii. Table of contents + +- A. The gauge-field structure + - A.1. The gauge-field generators + - A.2. The `IsGaugeField` instance +- B. The classification of gauge invariants + +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace StandardModel + +namespace GaugeJetAlgebra + +open TensorProduct Matrix MatrixGroups + +/-! + +## A. The gauge-field structure + +-/ + +/-! + +### A.1. The gauge-field generators + +-/ + +/-- The gauge-field generators of the complexified gauge-boson jet algebra, as a family + over the spacetime index and the dual of the gauge algebra — the form consumed by the + abstract covariance machinery. -/ +noncomputable def gaugeField (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra := + (TensorProduct.mk ℝ ℂ GaugeJetAlgebra 1).comp (ofA μ) + +@[simp] +lemma gaugeField_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + gaugeField μ φ = (1 : ℂ) ⊗ₜ[ℝ] ofA μ φ := rfl + +/-! + +### A.2. The `IsGaugeField` instance + +-/ + +/-- **The complexified gauge-boson jet algebra is a gauge field**: its generators are + Lorentz covectors, transform under the jet gauge group by the all-orders Leibniz + convolution of the adjoint Taylor coefficients plus the Maurer–Cartan shift, and the + gauge action is multiplicative. -/ +theorem isGaugeField : + IsGaugeField complexRepLorentzGroup complexRepJetGaugeGroupI gaugeField + complexJetDeriv complexJetDeriv_comm where + lorentz_apply Λ μ φ := complexRepLorentzGroup_one_tmul_ofA Λ μ φ + gauge_apply_deriv U s μ φ := complexRepJetGaugeGroupI_iteratedD_one_tmul_ofA U s μ φ + gauge_mul U b₁ b₂ := complexRepJetGaugeGroupI_apply_mul U b₁ b₂ + +/-! + +## B. The classification of gauge invariants + +-/ + +/-- **The classification of gauge invariants of the gauge-boson jet algebra**: a + gauge-invariant element of the subalgebra generated by the gauge-field symbols + `∂_s A_μ^φ` and a set `S` of elements fixed by the pure jets — for instance, the + covariant towers of matter fields — is a polynomial in the covariant derivatives of the + field strength and the elements of `S`. + + This is the covariance reduction of the gauge sector: invariance eliminates the bare + gauge-field symbols in favour of the field strength and its covariant derivatives. -/ +theorem invariant_mem_adjoin_fieldStrength + (S : Set (ℂ ⊗[ℝ] GaugeJetAlgebra)) + (hS : ∀ y ∈ S, ∀ U : JetGaugeGroupI.truncationKer 0, + complexRepJetGaugeGroupI U.1 y = y) + {x : ℂ ⊗[ℝ] GaugeJetAlgebra} + (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra | + ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm p (gaugeField μ φ)} ∪ S)) + (hinv : ∀ U : JetGaugeGroupI, complexRepJetGaugeGroupI U x = x) : + x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra | + ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = IsGaugeField.iteratedCovDerivAdjoint gaugeField complexJetDeriv l + (IsGaugeField.fieldStrength gaugeField complexJetDeriv ν lam) φ} ∪ S) := + IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField complexJetDeriv_mul + (fun p μ φ => Subring.mem_center_iff.mpr fun y => mul_comm _ _) + S hS hx hinv + +end GaugeJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/JetDeriv.lean new file mode 100644 index 000000000..54349c19d --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/JetDeriv.lean @@ -0,0 +1,370 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic +public import Physlib.Particles.LagrangianTheory.Basic +/-! +# The formal total derivative on the gauge-boson jet algebra + +## i. Overview + +The formal total spacetime derivative extends from the component functions of the gauge +bosons to their whole jet algebra as a derivation: it is +`SymmetricAlgebra.derivationOfLinear` applied to the shift `∂_s A_μ^φ ↦ ∂_{s + {ν}} A_μ^φ` +on the jet component space, which is right multiplication by the derivative symbol `∂_ν` +on the `DerivAlgebraReal` factor. + +The four directional derivatives commute and iterate along a multiset of directions. The +jet algebra is generated by the gauge fields and their iterated derivatives, and the +derivative extends to the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra` by base change, where +the ambient Lagrangian theory uses it. + +## ii. Key results + +- `GaugeBoson.JetComponentSpace.jetDeriv` : the derivative shift on the component space. +- `GaugeJetAlgebra.jetDeriv` : the formal total derivative, a derivation. +- `GaugeJetAlgebra.iteratedJetDeriv` : the iterated derivative along a multiset. +- `GaugeJetAlgebra.iteratedJetDeriv_ofA` : `∂_s A_μ^φ` as a generator. +- `GaugeJetAlgebra.adjoin_iteratedJetDeriv_eq_top` : the algebra is generated by the + gauge fields and their derivatives. +- `GaugeJetAlgebra.complexJetDeriv` : the derivative on the complexification. + +## iii. Table of contents + +- A. The derivative on the jet component space +- B. The total derivative on the jet algebra +- C. The iterated total derivative +- D. Generation by the gauge fields and their derivatives +- E. The derivative on the complexification + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The derivative on the jet component space + +-/ + +namespace GaugeBoson + +/-- The derivative of components in the jet component space, in the direction `ν`: the + shift `∂_s A_μ^φ ↦ ∂_{s + {ν}} A_μ^φ` of the derivative label, i.e. right multiplication + by the degree-one symbol `∂_ν` on the `DerivAlgebraReal` factor. -/ +noncomputable def JetComponentSpace.jetDeriv (ν : Fin 1 ⊕ Fin 3) : + JetComponentSpace →ₗ[ℝ] JetComponentSpace := + TensorProduct.map + (LinearMap.mulRight ℝ + (LagrangianTheory.dualRealJetAlgebraBasis ({ν} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id + +@[simp] +lemma JetComponentSpace.jetDeriv_tmul (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebraReal) + (φ : Module.Dual ℝ GaugeBoson) : + JetComponentSpace.jetDeriv ν (a ⊗ₜ[ℝ] φ) + = (a * LagrangianTheory.dualRealJetAlgebraBasis + ({ν} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℝ] φ := rfl + +/-- Total derivatives commute on the component space: the derivative labels live in a + symmetric algebra. -/ +lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (JetComponentSpace.jetDeriv μ).comp (JetComponentSpace.jetDeriv ν) + = (JetComponentSpace.jetDeriv ν).comp (JetComponentSpace.jetDeriv μ) := by + have hmul : ∀ b c : DerivAlgebraReal, + (LinearMap.mulRight ℝ b).comp (LinearMap.mulRight ℝ c) + = LinearMap.mulRight ℝ (c * b) := + fun b c => LinearMap.ext fun x => by + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.mulRight_apply, + mul_assoc] + rw [JetComponentSpace.jetDeriv, JetComponentSpace.jetDeriv, ← TensorProduct.map_comp, + ← TensorProduct.map_comp, hmul, hmul, mul_comm] + +end GaugeBoson + +namespace GaugeJetAlgebra + +/-! + +## B. The total derivative on the jet algebra + +-/ + +/-- The formal total spacetime derivative on the gauge-boson jet algebra in the direction + `ν`: the derivation extending the shift `∂_s A_μ^φ ↦ ∂_{s + {ν}} A_μ^φ` of the component + functions. -/ +noncomputable def jetDeriv (ν : Fin 1 ⊕ Fin 3) : GaugeJetAlgebra →ₗ[ℝ] GaugeJetAlgebra := + SymmetricAlgebra.derivationOfLinear (GaugeBoson.JetComponentSpace.jetDeriv ν) + +@[simp] +lemma jetDeriv_ι (ν : Fin 1 ⊕ Fin 3) (x : GaugeBoson.JetComponentSpace) : + jetDeriv ν (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.ι ℝ _ (GaugeBoson.JetComponentSpace.jetDeriv ν x) := + SymmetricAlgebra.derivationOfLinear_ι _ x + +@[simp] +lemma jetDeriv_one (ν : Fin 1 ⊕ Fin 3) : jetDeriv ν (1 : GaugeJetAlgebra) = 0 := + SymmetricAlgebra.derivationOfLinear_one _ + +@[simp] +lemma jetDeriv_algebraMap (ν : Fin 1 ⊕ Fin 3) (r : ℝ) : + jetDeriv ν (algebraMap ℝ GaugeJetAlgebra r) = 0 := + SymmetricAlgebra.derivationOfLinear_algebraMap _ r + +/-- The total derivative is a derivation: the Leibniz rule. -/ +lemma jetDeriv_mul (ν : Fin 1 ⊕ Fin 3) (x y : GaugeJetAlgebra) : + jetDeriv ν (x * y) = jetDeriv ν x * y + x * jetDeriv ν y := + SymmetricAlgebra.derivationOfLinear_mul _ x y + +/-- Mixed partials agree on the jet algebra. -/ +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : GaugeJetAlgebra) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := + SymmetricAlgebra.derivationOfLinear_comm_apply + (GaugeBoson.JetComponentSpace.jetDeriv_comm μ ν) x + +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (jetDeriv μ).comp (jetDeriv ν) = (jetDeriv ν).comp (jetDeriv μ) := + LinearMap.ext fun x => jetDeriv_comm_apply μ ν x + +/-! + +## C. The iterated total derivative + +-/ + +instance : RightCommutative + (fun (D : GaugeJetAlgebra →ₗ[ℝ] GaugeJetAlgebra) (μ : Fin 1 ⊕ Fin 3) => + D.comp (jetDeriv μ)) where + right_comm D μ ν := by + show (D.comp (jetDeriv μ)).comp (jetDeriv ν) = (D.comp (jetDeriv ν)).comp (jetDeriv μ) + rw [LinearMap.comp_assoc, LinearMap.comp_assoc, jetDeriv_comm] + +/-- The iterated total derivative `∂_s` along a multiset `s` of directions, well defined + because the directional derivatives commute. -/ +noncomputable def iteratedJetDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeJetAlgebra →ₗ[ℝ] GaugeJetAlgebra := + s.foldl (fun D μ => D.comp (jetDeriv μ)) LinearMap.id + +@[simp] +lemma iteratedJetDeriv_zero : + iteratedJetDeriv (0 : Multiset (Fin 1 ⊕ Fin 3)) = LinearMap.id := rfl + +/-- Any initial map factors out of the fold defining the iterated derivative. -/ +lemma foldl_comp_eq (s : Multiset (Fin 1 ⊕ Fin 3)) : + ∀ D : GaugeJetAlgebra →ₗ[ℝ] GaugeJetAlgebra, + s.foldl (fun D μ => D.comp (jetDeriv μ)) D = D ∘ₗ iteratedJetDeriv s := by + induction s using Multiset.induction_on with + | empty => + intro D + rw [iteratedJetDeriv_zero] + rfl + | cons ν t ih => + intro D + rw [iteratedJetDeriv, Multiset.foldl_cons, Multiset.foldl_cons, ih, ih, + LinearMap.id_comp, LinearMap.comp_assoc] + +lemma iteratedJetDeriv_cons (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (μ ::ₘ s) = jetDeriv μ ∘ₗ iteratedJetDeriv s := by + rw [iteratedJetDeriv, Multiset.foldl_cons, foldl_comp_eq, LinearMap.id_comp] + +@[simp] +lemma iteratedJetDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + iteratedJetDeriv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = jetDeriv μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, iteratedJetDeriv_cons, + iteratedJetDeriv_zero, LinearMap.comp_id] + +/-- Differentiating along `s + t` is differentiating along `t` and then along `s`. -/ +lemma iteratedJetDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (s + t) = iteratedJetDeriv t ∘ₗ iteratedJetDeriv s := by + induction t using Multiset.induction_on with + | empty => rw [add_zero, iteratedJetDeriv_zero, LinearMap.id_comp] + | cons μ t ih => + rw [show s + μ ::ₘ t = μ ::ₘ (s + t) from by + rw [← Multiset.singleton_add, ← Multiset.singleton_add, ← add_assoc, + add_comm s ({μ} : Multiset (Fin 1 ⊕ Fin 3)), add_assoc], + iteratedJetDeriv_cons, ih, iteratedJetDeriv_cons, LinearMap.comp_assoc] + +/-- On a component function the iterated derivative writes the derivative symbol `∂_s` + into the derivative label. -/ +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (a : DerivAlgebraReal) + (φ : Module.Dual ℝ GaugeBoson) : + iteratedJetDeriv s (SymmetricAlgebra.ι ℝ _ (a ⊗ₜ[ℝ] φ)) + = SymmetricAlgebra.ι ℝ _ + ((a * LagrangianTheory.dualRealJetAlgebraBasis s) ⊗ₜ[ℝ] φ) := by + induction s using Multiset.induction_on generalizing a with + | empty => + rw [iteratedJetDeriv_zero, LinearMap.id_apply, + LagrangianTheory.dualRealJetAlgebraBasis_nil, mul_one] + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, ih, jetDeriv_ι, + GaugeBoson.JetComponentSpace.jetDeriv_tmul, mul_assoc, + LagrangianTheory.dualRealJetAlgebraBasis_mul, + show s + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ s from by + rw [add_comm, Multiset.singleton_add]] + +/-- **The derivative generator `∂_s A_μ^φ`**: the iterated derivative of the gauge-field + component function. -/ +lemma iteratedJetDeriv_ofA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + iteratedJetDeriv s (ofA μ φ) + = SymmetricAlgebra.ι ℝ _ + (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] + GaugeBoson.componentDual (Lorentz.CoVector.basis.dualBasis μ) φ) := by + rw [ofA_apply, ofComponent_apply, iteratedJetDeriv_ι, one_mul] + +/-! + +## D. Generation by the gauge fields and their derivatives + +-/ + +/-- Every covector on the gauge-boson target space decomposes along the Lorentz coordinate + directions into component covectors: the spacetime index is expanded in the coordinate + basis, while the adjoint index stays abstract. -/ +lemma _root_.StandardModel.GaugeBoson.dual_eq_sum_componentDual + (ψ : Module.Dual ℝ GaugeBoson) : + ψ = ∑ μ, GaugeBoson.componentDual (Lorentz.CoVector.basis.dualBasis μ) + (ψ ∘ₗ GaugeBoson.valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.mk ℝ Lorentz.CoVector GaugeAlgebra (Lorentz.CoVector.basis μ)) := by + refine LinearMap.ext fun v => ?_ + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : GaugeBoson) = 0 from rfl] + simp + | tmul x a => + rw [LinearMap.sum_apply] + have hx : (⟨x ⊗ₜ[ℝ] a⟩ : GaugeBoson) + = ∑ μ, Lorentz.CoVector.basis.dualBasis μ x • + (⟨Lorentz.CoVector.basis μ ⊗ₜ[ℝ] a⟩ : GaugeBoson) := by + apply GaugeBoson.valLinEquiv.injective + rw [map_sum] + conv_lhs => + rw [GaugeBoson.valLinEquiv_apply, + show (⟨x ⊗ₜ[ℝ] a⟩ : GaugeBoson).val = x ⊗ₜ[ℝ] a from rfl, + ← Lorentz.CoVector.basis.sum_repr x, TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_smul, GaugeBoson.valLinEquiv_apply, + show (⟨Lorentz.CoVector.basis μ ⊗ₜ[ℝ] a⟩ : GaugeBoson).val + = Lorentz.CoVector.basis μ ⊗ₜ[ℝ] a from rfl, ← TensorProduct.smul_tmul', + Module.Basis.dualBasis_apply] + conv_lhs => rw [hx, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_smul, GaugeBoson.componentDual_apply_val_tmul, smul_eq_mul] + rfl + | add m₁ m₂ h₁ h₂ => + simp only [show (⟨m₁ + m₂⟩ : GaugeBoson) = (⟨m₁⟩ : GaugeBoson) + ⟨m₂⟩ from rfl, + map_add, LinearMap.sum_apply] at h₁ h₂ ⊢ + rw [h₁, h₂, ← Finset.sum_add_distrib] + +set_option maxHeartbeats 1000000 in +/-- **The jet algebra is generated by the gauge fields and their derivatives.** Every + element is a polynomial in the derivative generators `∂_s A_μ^φ` — nothing else is + available to write down for the gauge sector of a Lagrangian. -/ +theorem adjoin_iteratedJetDeriv_eq_top : + Algebra.adjoin ℝ + (⋃ s : Multiset (Fin 1 ⊕ Fin 3), ⋃ μ : Fin 1 ⊕ Fin 3, + Set.range (fun φ : Module.Dual ℝ GaugeAlgebra => iteratedJetDeriv s (ofA μ φ))) + = (⊤ : Subalgebra ℝ GaugeJetAlgebra) := by + set S : Set GaugeJetAlgebra := + ⋃ s : Multiset (Fin 1 ⊕ Fin 3), ⋃ μ : Fin 1 ⊕ Fin 3, + Set.range (fun φ : Module.Dual ℝ GaugeAlgebra => iteratedJetDeriv s (ofA μ φ)) + with hS + /- The derivative generators lie in the adjoined set. -/ + have hgen : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + SymmetricAlgebra.ι ℝ _ (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] + GaugeBoson.componentDual (Lorentz.CoVector.basis.dualBasis μ) φ) + ∈ Algebra.adjoin ℝ S := by + intro s μ φ + rw [← iteratedJetDeriv_ofA, hS] + exact Algebra.subset_adjoin + (Set.mem_iUnion.mpr ⟨s, Set.mem_iUnion.mpr ⟨μ, ⟨φ, rfl⟩⟩⟩) + /- Any covector slot: expand the spacetime index in the coordinate basis. -/ + have hcomp : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeBoson), + SymmetricAlgebra.ι ℝ _ (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ) + ∈ Algebra.adjoin ℝ S := by + intro s ψ + rw [show LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] ψ + = ∑ μ, LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] + GaugeBoson.componentDual (Lorentz.CoVector.basis.dualBasis μ) + (ψ ∘ₗ GaugeBoson.valLinEquiv.symm.toLinearMap ∘ₗ + TensorProduct.mk ℝ Lorentz.CoVector GaugeAlgebra + (Lorentz.CoVector.basis μ)) from by + conv_lhs => rw [GaugeBoson.dual_eq_sum_componentDual ψ] + rw [TensorProduct.tmul_sum], map_sum] + exact Subalgebra.sum_mem _ fun μ _ => hgen s μ _ + /- The derivative monomials span the `DerivAlgebraReal` factor. -/ + refine top_le_iff.mp ?_ + rw [← adjoin_ι_eq_top] + refine Algebra.adjoin_le ?_ + rintro _ ⟨x, rfl⟩ + induction x using TensorProduct.induction_on with + | zero => rw [map_zero]; exact zero_mem _ + | add y z hy hz => rw [map_add]; exact add_mem hy hz + | tmul a ψ => + have ha : a ∈ Submodule.span ℝ (Set.range LagrangianTheory.dualRealJetAlgebraBasis) := by + rw [LagrangianTheory.dualRealJetAlgebraBasis.span_eq]; trivial + induction ha using Submodule.span_induction with + | mem b hb => obtain ⟨s, rfl⟩ := hb; exact hcomp s ψ + | zero => rw [TensorProduct.zero_tmul, map_zero]; exact zero_mem _ + | add b c _ _ hb hc => rw [TensorProduct.add_tmul, map_add]; exact add_mem hb hc + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul] + exact Subalgebra.smul_mem _ hb c + +/-! + +## E. The derivative on the complexification + +-/ + +/-- The formal total derivative on the complexified gauge-boson jet algebra, by base + change. This is the derivative the ambient Lagrangian theory uses. -/ +noncomputable def complexJetDeriv (ν : Fin 1 ⊕ Fin 3) : + ℂ ⊗[ℝ] GaugeJetAlgebra →ₗ[ℂ] ℂ ⊗[ℝ] GaugeJetAlgebra := + LinearMap.baseChange ℂ (jetDeriv ν) + +@[simp] +lemma complexJetDeriv_tmul (ν : Fin 1 ⊕ Fin 3) (z : ℂ) (x : GaugeJetAlgebra) : + complexJetDeriv ν (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] jetDeriv ν x := rfl + +set_option maxHeartbeats 1000000 in +/-- The Leibniz rule on the complexification. -/ +lemma complexJetDeriv_mul (ν : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + complexJetDeriv ν (x * y) + = complexJetDeriv ν x * y + x * complexJetDeriv ν y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => + rw [add_mul, map_add, map_add, h₁, h₂, add_mul, add_mul] + abel + | tmul z₁ a₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => + rw [mul_add, map_add, map_add, h₁, h₂, mul_add, mul_add] + abel + | tmul z₂ a₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, complexJetDeriv_tmul, complexJetDeriv_tmul, + complexJetDeriv_tmul, jetDeriv_mul, TensorProduct.tmul_add, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul] + +/-- The complexified total derivatives commute. -/ +lemma complexJetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (complexJetDeriv μ).comp (complexJetDeriv ν) + = (complexJetDeriv ν).comp (complexJetDeriv μ) := by + rw [complexJetDeriv, complexJetDeriv, ← LinearMap.baseChange_comp, + ← LinearMap.baseChange_comp, jetDeriv_comm] + +end GaugeJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/LorentzAction.lean new file mode 100644 index 000000000..91405ae33 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/LorentzAction.lean @@ -0,0 +1,307 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv +public import Physlib.Relativity.IsLorentzDeriv +/-! +# The Lorentz action on the gauge-boson jet algebra + +## i. Overview + +The Lorentz group acts on the jet algebra of the gauge bosons by the symmetric-algebra +functor applied to its action on the jet component space: the derivative labels transform +in `DerivAlgebraReal` and the target index contragrediently through the covector action on +`GaugeBoson`. The formal total derivative is a Lorentz vector for this action; on the +complexification this is packaged as a `Lorentz.IsLorentzDeriv` instance, giving access to +the boost-weight machinery. + +## ii. Key results + +- `GaugeBoson.JetComponentSpace.repLorentzGroup` : the Lorentz action on the component + space. +- `GaugeJetAlgebra.repLorentzGroup` : the Lorentz action on the jet algebra. +- `GaugeJetAlgebra.repLorentzGroup_jetDeriv` : the total derivative is a Lorentz vector. +- `GaugeJetAlgebra.complexRepLorentzGroup` : the action on the complexification. +- `GaugeJetAlgebra.instIsLorentzDeriv` : the `Lorentz.IsLorentzDeriv` instance. + +## iii. Table of contents + +- A. The Lorentz action on the component space + - A.1. Covariance of the derivative shift +- B. The Lorentz action on the jet algebra +- C. Lorentz covariance of the total derivative +- D. The complexified action + +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups + +/-! + +## A. The Lorentz action on the component space + +-/ + +namespace GaugeBoson + +/-- The Lorentz action on the jet component space of the gauge bosons: the derivative + label transforms in `DerivAlgebraReal`, the target index contragrediently. -/ +noncomputable def JetComponentSpace.repLorentzGroup : + Representation ℝ SL(2,ℂ) JetComponentSpace := + DerivAlgebraReal.repLorentzGroup.tprod GaugeBoson.repLorentzGroup.dual + +/-! + +### A.1. Covariance of the derivative shift + +-/ + +/-- The Lorentz action on the singleton derivative symbol: the derivative slot transforms + by the columns of the Lorentz matrix. -/ +lemma _root_.StandardModel.DerivAlgebraReal.repLorentzGroup_basis_singleton + (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + DerivAlgebraReal.repLorentzGroup Λ + (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • + LagrangianTheory.dualRealJetAlgebraBasis ({a} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [LagrangianTheory.dualRealJetAlgebraBasis_singleton, + DerivAlgebraReal.repLorentzGroup_apply_ι, Lorentz.CoVector.sl2Rep_dual_dualBasis, + map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, LagrangianTheory.dualRealJetAlgebraBasis_singleton] + +/-- **The derivative shift is a Lorentz vector on the component space**: appending `∂_μ` + and then acting is acting and then appending the transformed `∂_μ`. -/ +lemma JetComponentSpace.repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace) : + JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.jetDeriv μ v) = + ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • + JetComponentSpace.jetDeriv a (JetComponentSpace.repLorentzGroup Λ v) := by + induction v using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul q f => + rw [JetComponentSpace.jetDeriv_tmul, + show JetComponentSpace.repLorentzGroup Λ + ((q * LagrangianTheory.dualRealJetAlgebraBasis + ({μ} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℝ] f) + = (DerivAlgebraReal.repLorentzGroup Λ + (q * LagrangianTheory.dualRealJetAlgebraBasis + ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) ⊗ₜ[ℝ] + (GaugeBoson.repLorentzGroup.dual Λ f) from rfl, + DerivAlgebraReal.repLorentzGroup_apply_mul, + DerivAlgebraReal.repLorentzGroup_basis_singleton, Finset.mul_sum, + TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [mul_smul_comm, ← TensorProduct.smul_tmul', + show JetComponentSpace.repLorentzGroup Λ (q ⊗ₜ[ℝ] f) + = (DerivAlgebraReal.repLorentzGroup Λ q) ⊗ₜ[ℝ] + (GaugeBoson.repLorentzGroup.dual Λ f) from rfl, + JetComponentSpace.jetDeriv_tmul] + +end GaugeBoson + +namespace GaugeJetAlgebra + +/-! + +## B. The Lorentz action on the jet algebra + +-/ + +/-- **The Lorentz action on the gauge-boson jet algebra**: the symmetric-algebra functor + applied to the Lorentz action on the jet component space. -/ +noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) GaugeJetAlgebra where + toFun Λ := + (SymmetricAlgebra.map (GaugeBoson.JetComponentSpace.repLorentzGroup Λ)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, SymmetricAlgebra.map_id, AlgHom.toLinearMap_id] + map_mul' Λ₁ Λ₂ := by + simp only [map_mul, Module.End.mul_eq_comp, ← SymmetricAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : GaugeJetAlgebra) : + repLorentzGroup Λ x = + SymmetricAlgebra.map (GaugeBoson.JetComponentSpace.repLorentzGroup Λ) x := rfl + +@[simp] +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + repLorentzGroup Λ (1 : GaugeJetAlgebra) = 1 := by + simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : GaugeJetAlgebra) : + repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := by + simp [repLorentzGroup_apply] + +@[simp] +lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (v : GaugeBoson.JetComponentSpace) : + repLorentzGroup Λ (SymmetricAlgebra.ι ℝ _ v) = + SymmetricAlgebra.ι ℝ _ (GaugeBoson.JetComponentSpace.repLorentzGroup Λ v) := by + rw [repLorentzGroup_apply, SymmetricAlgebra.map_apply_ι] + +/-! + +## C. Lorentz covariance of the total derivative + +-/ + +/-- **The total derivative on the gauge-boson jet algebra is a Lorentz vector.** -/ +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : GaugeJetAlgebra) : + repLorentzGroup Λ (jetDeriv μ x) = + ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • + jetDeriv a (repLorentzGroup Λ x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => + rw [jetDeriv_algebraMap, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, repLorentzGroup_ι, repLorentzGroup_ι, + GaugeBoson.JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + +/-! + +## D. The complexified action + +-/ + +/-- The Lorentz action on the complexified gauge-boson jet algebra, by base change. -/ +noncomputable def complexRepLorentzGroup : + Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] GaugeJetAlgebra) where + toFun Λ := LinearMap.baseChange ℂ (repLorentzGroup Λ) + map_one' := by + rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] + map_mul' Λ₁ Λ₂ := by + rw [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp, Module.End.mul_eq_comp] + +@[simp] +lemma complexRepLorentzGroup_tmul (Λ : SL(2,ℂ)) (z : ℂ) (x : GaugeJetAlgebra) : + complexRepLorentzGroup Λ (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repLorentzGroup Λ x := rfl + +lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + complexRepLorentzGroup Λ (x * y) + = complexRepLorentzGroup Λ x * complexRepLorentzGroup Λ y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => rw [add_mul, map_add, map_add, h₁, h₂, add_mul] + | tmul z₁ a₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => rw [mul_add, map_add, map_add, h₁, h₂, mul_add] + | tmul z₂ a₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, complexRepLorentzGroup_tmul, + complexRepLorentzGroup_tmul, complexRepLorentzGroup_tmul, + repLorentzGroup_apply_mul, Algebra.TensorProduct.tmul_mul_tmul] + +/-- **The complexified total derivative is a Lorentz vector.** -/ +lemma complexRepLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (x : ℂ ⊗[ℝ] GaugeJetAlgebra) : + complexRepLorentzGroup Λ (complexJetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + complexJetDeriv a (complexRepLorentzGroup Λ x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul z a => + rw [complexJetDeriv_tmul, complexRepLorentzGroup_tmul, repLorentzGroup_jetDeriv, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [TensorProduct.tmul_smul, complexRepLorentzGroup_tmul, complexJetDeriv_tmul, + show ((((Lorentz.SL2C.toLorentzGroup Λ).1 c μ : ℝ)) : ℂ) + = algebraMap ℝ ℂ ((Lorentz.SL2C.toLorentzGroup Λ).1 c μ) from rfl, + algebraMap_smul] + +/-- The complexified total derivatives form a Lorentz derivative, giving access to the + boost-weight machinery. -/ +instance instIsLorentzDeriv : + Lorentz.IsLorentzDeriv complexRepLorentzGroup complexJetDeriv where + rep_deriv := complexRepLorentzGroup_jetDeriv _ _ _ + +/-! + +## E. The Lorentz law of the gauge-field generators + +-/ + +/-- The contragredient Lorentz action passes through a component covector to its spacetime + slot: the adjoint index is Lorentz-inert. -/ +lemma _root_.StandardModel.GaugeBoson.repLorentzGroup_dual_componentDual (Λ : SL(2,ℂ)) + (ω : Module.Dual ℝ Lorentz.CoVector) (φ : Module.Dual ℝ GaugeAlgebra) : + GaugeBoson.repLorentzGroup.dual Λ (GaugeBoson.componentDual ω φ) + = GaugeBoson.componentDual (Lorentz.CoVector.sl2Rep.dual Λ ω) φ := by + refine LinearMap.ext fun v => ?_ + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : GaugeBoson) = 0 from rfl, map_zero, map_zero] + | tmul x a => + rw [Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply, + show GaugeBoson.repLorentzGroup Λ⁻¹ (⟨x ⊗ₜ[ℝ] a⟩ : GaugeBoson) + = ⟨(Lorentz.CoVector.sl2Rep Λ⁻¹ x) ⊗ₜ[ℝ] a⟩ from rfl, + GaugeBoson.componentDual_apply_val_tmul, GaugeBoson.componentDual_apply_val_tmul, + Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply] + | add m₁ m₂ h₁ h₂ => + rw [show (⟨m₁ + m₂⟩ : GaugeBoson) = (⟨m₁⟩ : GaugeBoson) + ⟨m₂⟩ from rfl, map_add, + map_add, h₁, h₂] + +/-- **The gauge field is a Lorentz covector**: the generator `A_μ^φ` mixes into the `A_a^φ` + by the columns of the Lorentz matrix, with the adjoint index untouched. -/ +lemma repLorentzGroup_ofA (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + repLorentzGroup Λ (ofA μ φ) + = ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • ofA a φ := by + rw [ofA_apply, ofComponent_apply, repLorentzGroup_ι, + show GaugeBoson.JetComponentSpace.repLorentzGroup Λ + ((1 : DerivAlgebraReal) ⊗ₜ[ℝ] GaugeBoson.componentDual + (Lorentz.CoVector.basis.dualBasis μ) φ) + = (DerivAlgebraReal.repLorentzGroup Λ (1 : DerivAlgebraReal)) ⊗ₜ[ℝ] + (GaugeBoson.repLorentzGroup.dual Λ (GaugeBoson.componentDual + (Lorentz.CoVector.basis.dualBasis μ) φ)) from rfl, + DerivAlgebraReal.repLorentzGroup_apply_one, + GaugeBoson.repLorentzGroup_dual_componentDual, + Lorentz.CoVector.sl2Rep_dual_dualBasis, map_sum, LinearMap.sum_apply, + TensorProduct.tmul_sum, map_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_smul, LinearMap.smul_apply, TensorProduct.tmul_smul, map_smul, ofA_apply, + ofComponent_apply] + +/-- The Lorentz law of the gauge-field generators on the complexification. -/ +lemma complexRepLorentzGroup_one_tmul_ofA (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] ofA μ φ) + = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] ofA a φ) := by + rw [complexRepLorentzGroup_tmul, repLorentzGroup_ofA, TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [TensorProduct.tmul_smul, + show ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ)) : ℂ) + = algebraMap ℝ ℂ ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) from rfl, + algebraMap_smul] + +end GaugeJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean new file mode 100644 index 000000000..546642472 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean @@ -0,0 +1,148 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv +/-! +# Mass dimension on the gauge-boson jet algebra + +## i. Overview + +The mass dimension of the gauge bosons is tracked multiplicatively through the +*mass-weight scaling*: the algebra endomorphism multiplying each generator `∂_s A_μ^φ` by +`c ^ (2 + 2 |s|)` — the gauge field has mass dimension one, i.e. mass weight two, and each +derivative adds mass weight two. A monomial of total mass weight `n` is scaled by `c ^ n`, +so the scaling records the mass-weight grading of the jet algebra. This mirrors +`Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim`, on the real, single-half +component space of the gauge bosons. + +## ii. Key results + +- `GaugeBoson.JetComponentSpace.massWeightScale` : the scaling on the component space. +- `GaugeJetAlgebra.massWeightScale` : the mass-weight scaling. +- `GaugeJetAlgebra.massWeightScale_ofA` : the gauge field carries mass weight two. +- `GaugeJetAlgebra.massWeightScale_jetDeriv` : a derivative adds mass weight two. +- `GaugeJetAlgebra.massWeightScale_iteratedJetDeriv` : `∂_s` adds mass weight `2 |s|`. + +## iii. Table of contents + +- A. The mass-weight scaling on the component space +- B. The mass-weight scaling on the jet algebra +- C. The mass weight of the gauge field and its derivatives + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +/-! + +## A. The mass-weight scaling on the component space + +-/ + +namespace GaugeBoson + +/-- The mass-weight scaling on the jet component space of the gauge bosons: the generator + `∂_s A_μ^φ` is scaled by `c ^ (2 + 2 |s|)`, through the derivative-degree scaling + `DerivAlgebraReal.gradeScale` on the derivative label. -/ +noncomputable def JetComponentSpace.massWeightScale (c : ℝ) : + JetComponentSpace →ₗ[ℝ] JetComponentSpace := + c ^ 2 • TensorProduct.map (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap LinearMap.id + +lemma JetComponentSpace.massWeightScale_tmul (c : ℝ) (a : DerivAlgebraReal) + (φ : Module.Dual ℝ GaugeBoson) : + JetComponentSpace.massWeightScale c (a ⊗ₜ[ℝ] φ) + = c ^ 2 • (DerivAlgebraReal.gradeScale (c ^ 2) a ⊗ₜ[ℝ] φ) := rfl + +/-- **The derivative shift carries mass weight two** on the component space. -/ +lemma JetComponentSpace.massWeightScale_jetDeriv (c : ℝ) (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace) : + JetComponentSpace.massWeightScale c (JetComponentSpace.jetDeriv μ v) + = c ^ 2 • JetComponentSpace.jetDeriv μ (JetComponentSpace.massWeightScale c v) := by + induction v using TensorProduct.induction_on with + | zero => simp only [map_zero, smul_zero] + | add x y hx hy => simp only [map_add, hx, hy, smul_add] + | tmul a φ => + rw [JetComponentSpace.jetDeriv_tmul, JetComponentSpace.massWeightScale_tmul, map_mul, + LagrangianTheory.dualRealJetAlgebraBasis_singleton, + DerivAlgebraReal.gradeScale_ι, ← LagrangianTheory.dualRealJetAlgebraBasis_singleton, + JetComponentSpace.massWeightScale_tmul, map_smul, JetComponentSpace.jetDeriv_tmul, + mul_smul_comm, TensorProduct.smul_tmul', smul_smul, smul_smul, mul_comm (c ^ 2)] + rfl + +end GaugeBoson + +namespace GaugeJetAlgebra + +/-! + +## B. The mass-weight scaling on the jet algebra + +-/ + +/-- **The mass-weight scaling on the gauge-boson jet algebra**: the algebra endomorphism + scaling the generator `∂_s A_μ^φ` by `c ^ (2 + 2 |s|)`, the functorial lift of the + scaling on the jet component space. -/ +noncomputable def massWeightScale (c : ℝ) : GaugeJetAlgebra →ₐ[ℝ] GaugeJetAlgebra := + SymmetricAlgebra.map (GaugeBoson.JetComponentSpace.massWeightScale c) + +@[simp] +lemma massWeightScale_ι (c : ℝ) (x : GaugeBoson.JetComponentSpace) : + massWeightScale c (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.ι ℝ _ (GaugeBoson.JetComponentSpace.massWeightScale c x) := + SymmetricAlgebra.map_apply_ι _ x + +/-! + +## C. The mass weight of the gauge field and its derivatives + +-/ + +/-- **The gauge field carries mass weight two** — mass dimension one. -/ +@[simp] +lemma massWeightScale_ofA (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + massWeightScale c (ofA μ φ) = c ^ 2 • ofA μ φ := by + rw [ofA_apply, ofComponent_apply, massWeightScale_ι, + GaugeBoson.JetComponentSpace.massWeightScale_tmul, map_one, map_smul] + +/-- **A total derivative adds mass weight two.** -/ +lemma massWeightScale_jetDeriv (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (x : GaugeJetAlgebra) : + massWeightScale c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale c x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => rw [jetDeriv_algebraMap, map_zero, AlgHom.commutes, jetDeriv_algebraMap, + smul_zero] + | ι v => + rw [jetDeriv_ι, massWeightScale_ι, massWeightScale_ι, jetDeriv_ι, ← map_smul] + exact congrArg (SymmetricAlgebra.ι ℝ _) + (GaugeBoson.JetComponentSpace.massWeightScale_jetDeriv c μ v) + | mul a b ha hb => + simp only [jetDeriv_mul, map_add, map_mul, ha, hb, smul_add, smul_mul_assoc, + mul_smul_comm] + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + +/-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ +lemma massWeightScale_iteratedJetDeriv (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : GaugeJetAlgebra) : + massWeightScale c (iteratedJetDeriv s x) + = c ^ (2 * Multiset.card s) • iteratedJetDeriv s (massWeightScale c x) := by + induction s using Multiset.induction_on generalizing x with + | empty => simp + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, massWeightScale_jetDeriv, + show massWeightScale c (iteratedJetDeriv s x) + = c ^ (2 * Multiset.card s) • iteratedJetDeriv s (massWeightScale c x) from ih x, + map_smul, LinearMap.comp_apply, smul_smul, ← pow_add] + congr 2 + rw [Multiset.card_cons] + ring + +end GaugeJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean new file mode 100644 index 000000000..9c9f2b713 --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean @@ -0,0 +1,321 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.HiggsBoson.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# The jet algebra of the Higgs field + +## i. Overview + +The Higgs field is a bosonic matter field valued in `HiggsVec`, so its jet algebra is the +bosonic algebra `BosonicAlgebra HiggsVec`: the symmetric algebra on the component +functions `∂_s H_α` and `∂_s H̄_α`, commuting as bosons do. + +The file first equips the jets `JetRing ⊗[ℂ] HiggsVec` of the Higgs field with the action +of the jet gauge group, following the same pattern as the fermion species (see +`Physlib.Particles.StandardModel.Fermions.DownSinglet`): the `SU(2)` power-series matrix, +scaled by the hypercharge power series `u ^ 3`, acts `JetRing`-linearly through the +identification `JetRing ⊗[ℂ] HiggsVec ≃ EuclideanSpace JetRing (Fin 2)`. Everything the +generic bosonic algebra provides — the total derivative, the Lorentz action (trivial: the +Higgs is a Lorentz scalar), the jet gauge action, and the mass-weight scaling at the Higgs +mass weight `2` — is then instantiated. + +## ii. Key results + +- `HiggsVec.jetValLinEquiv` : the jets of the Higgs field as a `JetRing`-valued doublet. +- `HiggsVec.repJetGaugeGroupI` : the jet gauge action on the jets of the Higgs field. +- `HiggsVec.repJetGaugeGroupI_smul` : the action is fibrewise. +- `HiggsVec.repJetGaugeGroupI_ofConstant` : constant jets act by the global gauge action. +- `HiggsJetAlgebra` : the jet algebra of the Higgs field. +- `HiggsJetAlgebra.ofHiggs`, `HiggsJetAlgebra.ofConjHiggs` : the component functions. +- `HiggsJetAlgebra.repLorentzGroup`, `HiggsJetAlgebra.repJetGaugeGroupI` : the actions. +- `HiggsJetAlgebra.massWeightScale` : the mass-dimension scaling at mass weight `2`. + +## iii. Table of contents + +- A. The jet gauge action on the jets of the Higgs field + - A.1. The jets of the Higgs field + - A.2. The action of the jet gauge group + - A.3. Fibrewise linearity + - A.4. Constant jets act by the global gauge action +- B. The jet algebra of the Higgs field + - B.1. The component functions + - B.2. The Lorentz action + - B.3. The jet gauge action + - B.4. The mass-dimension scaling + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix + +namespace HiggsVec + +/-! + +## A. The jet gauge action on the jets of the Higgs field + +-/ + +/-! + +### A.1. The jets of the Higgs field + +-/ + +/-- Absorbs the jet ring into the weak index: a jet of the Higgs field is the same thing +as a `JetRing`-valued weak doublet, + + `JetRing ⊗[ℂ] HiggsVec ≃ EuclideanSpace JetRing (Fin 2)`. + +-/ +noncomputable def jetValLinEquiv : + JetRing ⊗[ℂ] HiggsVec ≃ₗ[ℂ] EuclideanSpace JetRing (Fin 2) := + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) + (WithLp.linearEquiv 2 ℂ (Fin 2 → ℂ))).trans <| + ((TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 2)).trans + (WithLp.linearEquiv 2 JetRing (Fin 2 → JetRing)).symm).restrictScalars ℂ + +lemma jetValLinEquiv_tmul (f : JetRing) (v : HiggsVec) : + jetValLinEquiv (f ⊗ₜ[ℂ] v) = WithLp.toLp 2 fun i => v.ofLp i • f := rfl + +/-- The identification of the jets of the Higgs field is `JetRing`-linear: multiplying a + jet by a scalar jet multiplies each of its weak components. -/ +lemma jetValLinEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] HiggsVec) : + jetValLinEquiv (χ • z) = χ • jetValLinEquiv z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [smul_add, map_add, ha, hb, map_add, smul_add] + | tmul f v => + rw [TensorProduct.smul_tmul', smul_eq_mul, jetValLinEquiv_tmul, jetValLinEquiv_tmul] + refine WithLp.ofLp_injective 2 ?_ + funext i + show v.ofLp i • (χ * f) = χ * (v.ofLp i • f) + rw [Algebra.mul_smul_comm] + +lemma jetValLinEquiv_symm_smul (χ : JetRing) (y : EuclideanSpace JetRing (Fin 2)) : + jetValLinEquiv.symm (χ • y) = χ • jetValLinEquiv.symm y := by + apply jetValLinEquiv.injective + rw [LinearEquiv.apply_symm_apply, jetValLinEquiv_smul, LinearEquiv.apply_symm_apply] + +/-! + +### A.2. The action of the jet gauge group + +-/ + +/-- The matrix of jets through which a jet of gauge transformations acts on the Higgs + doublet: the `SU(2)` power-series matrix scaled by the hypercharge power series + `u ^ 3`. -/ +noncomputable def jetGaugeMatrix (U : JetGaugeGroupI) : Matrix (Fin 2) (Fin 2) JetRing := + (((U.2.2 : unitary JetRing) : JetRing) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + +lemma jetGaugeMatrix_one : jetGaugeMatrix 1 = 1 := by + simp [jetGaugeMatrix] + +lemma jetGaugeMatrix_mul (U₁ U₂ : JetGaugeGroupI) : + jetGaugeMatrix (U₁ * U₂) = jetGaugeMatrix U₁ * jetGaugeMatrix U₂ := by + rw [jetGaugeMatrix, jetGaugeMatrix, jetGaugeMatrix, + show (((U₁ * U₂).2.2 : unitary JetRing) : JetRing) = + ((U₁.2.2 : unitary JetRing) : JetRing) * ((U₂.2.2 : unitary JetRing) : JetRing) from rfl, + show (((U₁ * U₂).2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) = + ((U₁.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) * + ((U₂.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + from rfl, + mul_pow, Matrix.smul_mul, Matrix.mul_smul, smul_smul] + +/-- The `2_{3}` action of the jet gauge group on the jets of the Higgs field. Through +`jetValLinEquiv` the weak matrix of the gauge jet, carrying the `3` hypercharge phase +`u ^ 3`, acts `JetRing`-linearly by matrix-vector multiplication. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] HiggsVec) where + toFun U := + jetValLinEquiv.symm.toLinearMap ∘ₗ + ((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)).restrictScalars ℂ : + EuclideanSpace JetRing (Fin 2) →ₗ[ℂ] EuclideanSpace JetRing (Fin 2)) ∘ₗ + jetValLinEquiv.toLinearMap + map_one' := by + have hres : (1 : Module.End JetRing (EuclideanSpace JetRing (Fin 2))).restrictScalars ℂ + = 1 := rfl + rw [jetGaugeMatrix_one, map_one, hres] + ext z + simp + map_mul' U₁ U₂ := by + have hres : ∀ f g : Module.End JetRing (EuclideanSpace JetRing (Fin 2)), + (f * g).restrictScalars ℂ = f.restrictScalars ℂ * g.restrictScalars ℂ := + fun _ _ => rfl + rw [jetGaugeMatrix_mul, map_mul, hres] + ext z + simp + +lemma repJetGaugeGroupI_apply (U : JetGaugeGroupI) (z : JetRing ⊗[ℂ] HiggsVec) : + repJetGaugeGroupI U z = + jetValLinEquiv.symm + (Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U) (jetValLinEquiv z)) := rfl + +/-! + +### A.3. Fibrewise linearity + +-/ + +/-- **The jet gauge action on the jets of the Higgs field is fibrewise**: it commutes + with multiplication by scalar jets, acting on the values of the field over the identity + on spacetime. This is the hypothesis under which the action lifts to the bosonic + algebra. -/ +lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) + (z : JetRing ⊗[ℂ] HiggsVec) : + repJetGaugeGroupI U (χ • z) = χ • repJetGaugeGroupI U z := by + rw [repJetGaugeGroupI_apply, repJetGaugeGroupI_apply, jetValLinEquiv_smul, map_smul, + jetValLinEquiv_symm_smul] + +/-! + +### A.4. Constant jets act by the global gauge action + +-/ + +/-- On jets of constant gauge transformations the jet action reduces to the global gauge +action on the fibre: the action `HiggsVec.repGaugeGroupI` on the Higgs factor, and the +trivial action on the jet ring. -/ +lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : + repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) = + TensorProduct.map LinearMap.id (repGaugeGroupI g) := by + ext f v + have hu : (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) + = MvPowerSeries.C ((g.toU1.1 : ℂ)) := rfl + have hM : ∀ i j, (((JetGaugeGroupI.ofConstant g).2.1 : + specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) i j + = MvPowerSeries.C (g.toSU2.1 i j) := fun _ _ => rfl + simp only [TensorProduct.AlgebraTensorModule.curry_apply, TensorProduct.curry_apply, + LinearMap.restrictScalars_apply, repJetGaugeGroupI_apply, TensorProduct.map_tmul, + LinearMap.id_apply] + apply jetValLinEquiv.injective + rw [LinearEquiv.apply_symm_apply, jetValLinEquiv_tmul, jetValLinEquiv_tmul] + have halg : (Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix (JetGaugeGroupI.ofConstant g)) : + Module.End JetRing (EuclideanSpace JetRing (Fin 2))) + = Matrix.toLpLin 2 2 (jetGaugeMatrix (JetGaugeGroupI.ofConstant g)) := rfl + rw [halg] + refine WithLp.ofLp_injective 2 ?_ + funext i + simp only [Matrix.toLpLin_toLp, Matrix.toLin'_apply, Matrix.mulVec_apply_eq_sum] + rw [show (repGaugeGroupI g v).ofLp = g.toU1 ^ 3 • (g.toSU2.1 *ᵥ v.ofLp) from rfl] + simp only [jetGaugeMatrix, Matrix.smul_apply, hu, hM, ← map_pow, smul_eq_mul, ← map_mul, + Pi.smul_apply, Matrix.mulVec_apply_eq_sum, Submonoid.smul_def, smul_eq_mul, + Finset.mul_sum, Finset.sum_smul, smul_smul] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [mul_smul_comm, + show (MvPowerSeries.C (((GaugeGroupI.toU1 g : unitary ℂ) : ℂ) ^ 3 + * (g.toSU2.1 i j)) : JetRing) * f + = (((GaugeGroupI.toU1 g : unitary ℂ) : ℂ) ^ 3 * (g.toSU2.1 i j)) • f from by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, Algebra.algebraMap_self_apply], + smul_smul] + congr 1 + rw [show ((GaugeGroupI.toU1 (g ^ 3) : unitary ℂ) : ℂ) + = ((GaugeGroupI.toU1 g : unitary ℂ) : ℂ) ^ 3 from rfl] + ring + +end HiggsVec + +/-! + +## B. The jet algebra of the Higgs field + +-/ + +/-- **The jet algebra of the Higgs field**: the bosonic algebra of the `HiggsVec`-valued + Higgs field. Its generators are the component functions `∂_s H_α` and `∂_s H̄_α`, and + they commute — the Higgs is a boson. -/ +abbrev HiggsJetAlgebra : Type := BosonicAlgebra HiggsVec + +namespace HiggsJetAlgebra + +/-! + +### B.1. The component functions + +-/ + +/-- The component functions of the Higgs field inside its jet algebra. -/ +noncomputable def ofHiggs : Module.Dual ℂ HiggsVec →ₗ[ℂ] HiggsJetAlgebra := + BosonicAlgebra.ofField + +/-- The conjugate component functions of the Higgs field inside its jet algebra. -/ +noncomputable def ofConjHiggs : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] HiggsJetAlgebra := + BosonicAlgebra.ofConjField + +/-! + +### B.2. The Lorentz action + +-/ + +open Matrix MatrixGroups in +/-- The Lorentz action on the jet algebra of the Higgs field: the Higgs is a Lorentz + scalar, so the Lorentz group acts on the component functions only through their + derivative labels. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) HiggsJetAlgebra := + BosonicAlgebra.repLorentzGroup (Representation.trivial ℂ SL(2,ℂ) HiggsVec) + +/-! + +### B.3. The jet gauge action + +-/ + +/-- The jet gauge action on the jet algebra of the Higgs field, lifted from the fibrewise + action on its jets. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI HiggsJetAlgebra := + BosonicAlgebra.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI + HiggsVec.repJetGaugeGroupI_smul + +/-- The action of the constant — global — gauge transformations on the jet algebra of the + Higgs field. -/ +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI HiggsJetAlgebra := + BosonicAlgebra.repGaugeGroupI HiggsVec.repJetGaugeGroupI + HiggsVec.repJetGaugeGroupI_smul + +/-! + +### B.4. The mass-dimension scaling + +-/ + +/-- The mass-dimension scaling on the jet algebra of the Higgs field: the Higgs has mass + dimension one, that is mass weight two, and each derivative adds mass weight two. -/ +noncomputable def massWeightScale (c : ℂ) : HiggsJetAlgebra →ₐ[ℂ] HiggsJetAlgebra := + BosonicAlgebra.massWeightScale 2 c + +/-- The Higgs field carries mass weight two — mass dimension one. -/ +@[simp] +lemma massWeightScale_ofHiggs (c : ℂ) (φ : Module.Dual ℂ HiggsVec) : + massWeightScale c (ofHiggs φ) = c ^ 2 • ofHiggs φ := + BosonicAlgebra.massWeightScale_ofField 2 c φ + +/-- A derivative of the Higgs field adds mass weight two. -/ +lemma massWeightScale_jetDeriv (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : HiggsJetAlgebra) : + massWeightScale c (BosonicAlgebra.jetDeriv μ x) + = c ^ 2 • BosonicAlgebra.jetDeriv μ (massWeightScale c x) := + BosonicAlgebra.massWeightScale_jetDeriv 2 c μ x + +end HiggsJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean index e4990c46e..573caf344 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -5,339 +5,151 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet -public import Physlib.Particles.StandardModel.Fermions.UpSinglet -public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic /-! -# The fermionic jet algebra of the Standard Model +# The jet algebra of the Standard Model ## i. Overview -The jet algebra of the Standard Model is the algebra in which a Lagrangian lives: the free -algebra on the component functions of every field and all their spacetime derivatives, -subject only to the statistics of the fields. - -This file builds its fermionic factor, `FermionJetAlgebra`; the bosonic factors — the gauge -fields and the Higgs — commute with everything and will enter as separate tensor factors. - -The Standard Model carries five fermion species — the lepton doublet, the charged-lepton -singlet, the quark doublet, and the up- and down-type quark singlets — each in three -generations, and the fermionic jet algebra is the *exterior product* of their individual -fermionic algebras: generators anticommute, and they do so **across species and generations -as well as within a species**, since all of them are fermionic. - -That exterior product is *realized* here as a single exterior algebra on the direct sum of -the fifteen target spaces, and then *identified* with the graded tensor product of the -species algebras by `FermionicAlgebra.prodEquiv`, applied once per species -(`FermionJetAlgebra.exteriorProductLeptonDoublet` and its siblings below). The -identification is genuine, not a convention: the exterior algebra of a direct sum is the -graded (super) tensor product of the exterior algebras of the summands. An ordinary tensor -product `⊗[ℂ]` would instead make generators of different species *commute*, which is wrong -for fermions. - -The direct sum is taken as the definition rather than the graded tensor product because -Mathlib's `GradedTensorProduct` carries no `GradedAlgebra` instance, so a graded tensor -product of three or more factors cannot currently be written down as a type; the peeled -form, one species at a time, is as far as the type-level statement goes. Working inside a -single `ExteriorAlgebra` also keeps every algebraic class projecting from one root, and lets -the whole `FermionicAlgebra` API — the Lorentz action, the jet gauge action, the total -derivative and its iterates — apply to `FermionJetAlgebra` unchanged. +The full jet algebra of the Standard Model — the algebra in which a Standard Model +Lagrangian lives — is the tensor product of its three sector algebras: the fermionic jet +algebra `FermionJetAlgebra`, the Higgs jet algebra `HiggsJetAlgebra`, and the +(complexified) gauge-boson jet algebra `GaugeJetAlgebra`. The bosonic factors commute with +everything, so the ordinary tensor product is correct; the anticommutativity of the +fermions lives entirely inside the fermionic factor. + +This file defines the algebra and its three sector inclusions, and proves that the gauge +sector is central. The Lorentz action, the jet gauge action, the formal total derivative +and the mass-dimension scaling are assembled factorwise in the sibling files. ## ii. Key results -- `FermionSpace` : the total target space of the Standard Model fermions. -- `FermionSpace.leptonDoubletProj`, … : the projections onto a species and generation. -- `FermionSpace.leptonDoubletIncl`, … : the inclusions of a species and generation. -- `FermionJetAlgebra` : the jet algebra of the Standard Model fermions. -- `FermionJetAlgebra.ofLeptonDoublet`, … : the component functions of each species and - generation. -- `FermionJetAlgebra.exteriorProductLeptonDoublet`, … : the jet algebra as the exterior - product of the species algebras. +- `JetAlgebra` : the jet algebra of the Standard Model. +- `JetAlgebra.includeFermion`, `includeHiggs`, `includeGauge` : the sector inclusions. +- `JetAlgebra.includeGauge_commute` : the gauge sector is central. +- `Representation.tprod_apply_mul` : multiplicativity of tensor-product representations, + the generic assembly used by the action files. ## iii. Table of contents -- A. The target space of the Standard Model fermions - - A.1. The projections onto the species - - A.2. The inclusions onto the species - - A.3. The action of the Lorentz group - - A.4. The action of the global gauge group - - A.5. The action of the jet gauge group -- B. The fermionic jet algebra - - B.1. The component functions of each species - - B.2. The exterior product decomposition +- A. The jet algebra of the Standard Model + - A.1. The sector inclusions + - A.2. Centrality of the gauge sector +- B. Tensor products of multiplicative representations -/ @[expose] public section -namespace StandardModel - -open TensorProduct - -/-! - -## A. The target space of the Standard Model fermions - --/ - -/-- The total target space of the Standard Model fermions: the direct sum of three - generations each of the lepton doublet, the charged-lepton singlet, the quark doublet, and - the up- and down-type quark singlets. The three generations of a species sit together, so - that a species can be split off the jet algebra as a single exterior factor. -/ -abbrev FermionSpace : Type := - (Fin 3 → LeptonDoublet) × (Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × - (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet) - -namespace FermionSpace - -/-! - -### A.1. The projections onto the species - -The component functions of a field are *covectors* on its target space, so it is the -projections — not the inclusions — that carry the individual species into the jet algebra. -Each projection takes a generation index `i : Fin 3`. - --/ - -/-- The projection onto the `i`-th generation of the lepton doublet. -/ -def leptonDoubletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] LeptonDoublet := - (LinearMap.proj i).comp (LinearMap.fst ℂ _ _) - -/-- The projection onto the `i`-th generation of the charged-lepton singlet. -/ -def leptonSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] LeptonSinglet := - (LinearMap.proj i).comp ((LinearMap.fst ℂ _ _).comp (LinearMap.snd ℂ _ _)) +set_option maxHeartbeats 8000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 -/-- The projection onto the `i`-th generation of the quark doublet. -/ -def quarkDoubletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] QuarkDoublet := - (LinearMap.proj i).comp - ((LinearMap.fst ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _))) - -/-- The projection onto the `i`-th generation of the up-type quark singlet. -/ -def upSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] UpSinglet := - (LinearMap.proj i).comp ((LinearMap.fst ℂ _ _).comp - ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _)))) - -/-- The projection onto the `i`-th generation of the down-type quark singlet. -/ -def downSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] DownSinglet := - (LinearMap.proj i).comp ((LinearMap.snd ℂ _ _).comp - ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _)))) - -/-! - -### A.2. The inclusions onto the species - -The one-sided inverses of the projections: the inclusion of a single species and generation -as a summand of the total target space, zero in every other slot. `…Proj i ∘ …Incl i` is the -identity, and every other composite of a projection with an inclusion vanishes. - --/ +namespace StandardModel -/-- The inclusion of the `i`-th generation lepton doublet as a summand. -/ -def leptonDoubletIncl (i : Fin 3) : LeptonDoublet →ₗ[ℂ] FermionSpace := - (LinearMap.inl ℂ _ _).comp (LinearMap.single ℂ (fun _ : Fin 3 => LeptonDoublet) i) - -/-- The inclusion of the `i`-th generation charged-lepton singlet as a summand. -/ -def leptonSingletIncl (i : Fin 3) : LeptonSinglet →ₗ[ℂ] FermionSpace := - (LinearMap.inr ℂ _ _).comp ((LinearMap.inl ℂ _ _).comp - (LinearMap.single ℂ (fun _ : Fin 3 => LeptonSinglet) i)) - -/-- The inclusion of the `i`-th generation quark doublet as a summand. -/ -def quarkDoubletIncl (i : Fin 3) : QuarkDoublet →ₗ[ℂ] FermionSpace := - (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp - ((LinearMap.inl ℂ _ _).comp - (LinearMap.single ℂ (fun _ : Fin 3 => QuarkDoublet) i))) - -/-- The inclusion of the `i`-th generation up-type quark singlet as a summand. -/ -def upSingletIncl (i : Fin 3) : UpSinglet →ₗ[ℂ] FermionSpace := - (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp - ((LinearMap.inl ℂ _ _).comp - (LinearMap.single ℂ (fun _ : Fin 3 => UpSinglet) i)))) - -/-- The inclusion of the `i`-th generation down-type quark singlet as a summand. -/ -def downSingletIncl (i : Fin 3) : DownSinglet →ₗ[ℂ] FermionSpace := - (LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp ((LinearMap.inr ℂ _ _).comp - ((LinearMap.inr ℂ _ _).comp - (LinearMap.single ℂ (fun _ : Fin 3 => DownSinglet) i)))) - -@[simp] -lemma leptonDoubletProj_comp_leptonDoubletIncl (i : Fin 3) : - (leptonDoubletProj i).comp (leptonDoubletIncl i) = LinearMap.id := - LinearMap.ext fun _ => by simp [leptonDoubletProj, leptonDoubletIncl] - -@[simp] -lemma leptonSingletProj_comp_leptonSingletIncl (i : Fin 3) : - (leptonSingletProj i).comp (leptonSingletIncl i) = LinearMap.id := - LinearMap.ext fun _ => by simp [leptonSingletProj, leptonSingletIncl] - -@[simp] -lemma quarkDoubletProj_comp_quarkDoubletIncl (i : Fin 3) : - (quarkDoubletProj i).comp (quarkDoubletIncl i) = LinearMap.id := - LinearMap.ext fun _ => by simp [quarkDoubletProj, quarkDoubletIncl] - -@[simp] -lemma upSingletProj_comp_upSingletIncl (i : Fin 3) : - (upSingletProj i).comp (upSingletIncl i) = LinearMap.id := - LinearMap.ext fun _ => by simp [upSingletProj, upSingletIncl] - -@[simp] -lemma downSingletProj_comp_downSingletIncl (i : Fin 3) : - (downSingletProj i).comp (downSingletIncl i) = LinearMap.id := - LinearMap.ext fun _ => by simp [downSingletProj, downSingletIncl] +open TensorProduct Matrix MatrixGroups /-! -### A.3. The action of the Lorentz group +## A. The jet algebra of the Standard Model -/ -/-! - -### A.4. Th action of the global gauge group +/-- **The jet algebra of the Standard Model**: the tensor product of the fermionic, Higgs + and gauge-boson jet algebras. A Standard Model Lagrangian is an element of this + algebra. -/ +abbrev JetAlgebra : Type := + (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) ⊗[ℂ] (ℂ ⊗[ℝ] GaugeJetAlgebra) --/ +namespace JetAlgebra /-! -### A.5. The action of Jet gauge group. +### A.1. The sector inclusions -/ -end FermionSpace -/-! +/-- The inclusion of the fermionic sector. -/ +noncomputable def includeFermion : FermionJetAlgebra →ₐ[ℂ] JetAlgebra := + (Algebra.TensorProduct.includeLeft + (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] GaugeJetAlgebra)).comp + Algebra.TensorProduct.includeLeft -## B. The fermionic jet algebra +/-- The inclusion of the Higgs sector. -/ +noncomputable def includeHiggs : HiggsJetAlgebra →ₐ[ℂ] JetAlgebra := + (Algebra.TensorProduct.includeLeft + (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] GaugeJetAlgebra)).comp + Algebra.TensorProduct.includeRight --/ +/-- The inclusion of the gauge sector. -/ +noncomputable def includeGauge : (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.includeRight -/-- **The jet algebra of the Standard Model fermions**: the exterior product of the fermionic - algebras of the five species, realized as the fermionic algebra of their direct sum. Its - generators are the component functions `∂_s ψ_φ` and `∂_s ψ̄_φ` of every species and - generation, and any two of them anticommute — within a species and across species alike. - - This is the fermionic factor of the full Standard Model jet algebra; the gauge and Higgs - factors are bosonic and commute with it. -/ -abbrev FermionJetAlgebra : Type := FermionicAlgebra FermionSpace - -namespace FermionJetAlgebra +lemma includeGauge_apply (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + includeGauge y + = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] y := rfl /-! -### B.1. The component functions of each species - -Each species and generation enters through its projection out of `FermionSpace`: a covector -on the species pulls back to a covector on the total target space, and thence to a generator -of the jet algebra. Their iterated derivatives `FermionicAlgebra.iteratedJetDeriv` are the -higher generators. +### A.2. Centrality of the gauge sector -/ -/-- The component functions of the `i`-th generation lepton doublet inside the Standard - Model jet algebra. -/ -noncomputable def ofLeptonDoublet (i : Fin 3) : - Module.Dual ℂ LeptonDoublet →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.leptonDoubletProj i)) - -/-- The component functions of the `i`-th generation charged-lepton singlet. -/ -noncomputable def ofLeptonSinglet (i : Fin 3) : - Module.Dual ℂ LeptonSinglet →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.leptonSingletProj i)) - -/-- The component functions of the `i`-th generation quark doublet. -/ -noncomputable def ofQuarkDoublet (i : Fin 3) : - Module.Dual ℂ QuarkDoublet →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.quarkDoubletProj i)) - -/-- The component functions of the `i`-th generation up-type quark singlet. -/ -noncomputable def ofUpSinglet (i : Fin 3) : - Module.Dual ℂ UpSinglet →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.upSingletProj i)) - -/-- The component functions of the `i`-th generation down-type quark singlet. -/ -noncomputable def ofDownSinglet (i : Fin 3) : - Module.Dual ℂ DownSinglet →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofField.comp (Module.Dual.transpose (FermionSpace.downSingletProj i)) - -/-- The conjugate component functions of the `i`-th generation lepton doublet. -/ -noncomputable def ofConjLeptonDoublet (i : Fin 3) : - Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofConjField.comp - (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonDoubletProj i))) - -/-- The conjugate component functions of the `i`-th generation charged-lepton singlet. -/ -noncomputable def ofConjLeptonSinglet (i : Fin 3) : - Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofConjField.comp - (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonSingletProj i))) - -/-- The conjugate component functions of the `i`-th generation quark doublet. -/ -noncomputable def ofConjQuarkDoublet (i : Fin 3) : - Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofConjField.comp - (Module.Dual.transpose (ConjModule.map (FermionSpace.quarkDoubletProj i))) - -/-- The conjugate component functions of the `i`-th generation up-type quark singlet. -/ -noncomputable def ofConjUpSinglet (i : Fin 3) : - Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofConjField.comp - (Module.Dual.transpose (ConjModule.map (FermionSpace.upSingletProj i))) - -/-- The conjugate component functions of the `i`-th generation down-type quark singlet. -/ -noncomputable def ofConjDownSinglet (i : Fin 3) : - Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] FermionJetAlgebra := - FermionicAlgebra.ofConjField.comp - (Module.Dual.transpose (ConjModule.map (FermionSpace.downSingletProj i))) +/-- The right factor of a tensor product with a commutative right factor is central: + the abstract statement, proved by tensor induction at abstract types so that it can be + instantiated on the jet algebra without rewriting inside it. -/ +private lemma tensor_includeRight_comm {A B : Type*} [Ring A] [Algebra ℂ A] + [CommRing B] [Algebra ℂ B] (y : B) (x : A ⊗[ℂ] B) : + x * Algebra.TensorProduct.includeRight (R := ℂ) (A := A) y + = Algebra.TensorProduct.includeRight (R := ℂ) (A := A) y * x := by + induction x using TensorProduct.induction_on with + | zero => rw [zero_mul, mul_zero] + | add a b ha hb => rw [add_mul, mul_add, ha, hb] + | tmul w g => + rw [show (Algebra.TensorProduct.includeRight (R := ℂ) (A := A) y : A ⊗[ℂ] B) + = (1 : A) ⊗ₜ[ℂ] y from rfl, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + mul_one, one_mul, mul_comm g y] + +/-- The image of the gauge sector is central: gauge-boson symbols commute with + everything, as bosons must. -/ +lemma includeGauge_commute (y : ℂ ⊗[ℝ] GaugeJetAlgebra) (x : JetAlgebra) : + x * includeGauge y = includeGauge y * x := + tensor_includeRight_comm y x /-! -### B.2. The exterior product decomposition - -`FermionicAlgebra.prodEquiv` identifies the fermionic algebra of a direct sum with the -graded tensor product of the two fermionic algebras. Applied repeatedly it exhibits the jet -algebra as the exterior product of the five species algebras, peeling off one species — all -three of its generations at once — at a time. It has to be stated one species at a time: -`GradedTensorProduct` carries no `GradedAlgebra` instance in Mathlib, so the fully nested -five-fold graded tensor product is not expressible as a type. +## B. Tensor products of multiplicative representations -/ -open scoped TensorProduct - -/-- The fermionic jet algebra as the exterior product of the three-generation - lepton-doublet algebra with the algebra of the remaining four species. -/ -noncomputable def exteriorProductLeptonDoublet : - FermionJetAlgebra ≃ₐ[ℂ] (FermionicAlgebra.evenOdd (Fin 3 → LeptonDoublet) ᵍ⊗[ℂ] - FermionicAlgebra.evenOdd ((Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × - (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet))) := - FermionicAlgebra.prodEquiv _ _ - -/-- The charged-lepton singlets split off the remaining three species. -/ -noncomputable def exteriorProductLeptonSinglet : - FermionicAlgebra ((Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × - (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet)) ≃ₐ[ℂ] - (FermionicAlgebra.evenOdd (Fin 3 → LeptonSinglet) ᵍ⊗[ℂ] - FermionicAlgebra.evenOdd ((Fin 3 → QuarkDoublet) × (Fin 3 → UpSinglet) × - (Fin 3 → DownSinglet))) := - FermionicAlgebra.prodEquiv _ _ - -/-- The quark doublets split off the two quark singlets. -/ -noncomputable def exteriorProductQuarkDoublet : - FermionicAlgebra ((Fin 3 → QuarkDoublet) × (Fin 3 → UpSinglet) × - (Fin 3 → DownSinglet)) ≃ₐ[ℂ] - (FermionicAlgebra.evenOdd (Fin 3 → QuarkDoublet) ᵍ⊗[ℂ] - FermionicAlgebra.evenOdd ((Fin 3 → UpSinglet) × (Fin 3 → DownSinglet))) := - FermionicAlgebra.prodEquiv _ _ - -/-- The two quark singlets as an exterior product. -/ -noncomputable def exteriorProductUpSinglet : - FermionicAlgebra ((Fin 3 → UpSinglet) × (Fin 3 → DownSinglet)) ≃ₐ[ℂ] - (FermionicAlgebra.evenOdd (Fin 3 → UpSinglet) ᵍ⊗[ℂ] - FermionicAlgebra.evenOdd (Fin 3 → DownSinglet)) := - FermionicAlgebra.prodEquiv _ _ - -end FermionJetAlgebra +/-- The tensor product of two multiplicative representations on algebras is + multiplicative. -/ +lemma _root_.Representation.tprod_apply_mul {k G A B : Type*} [CommSemiring k] [Monoid G] + [Ring A] [Algebra k A] [Ring B] [Algebra k B] + (ρ : Representation k G A) (σ : Representation k G B) + (hρ : ∀ (g : G) (x y : A), ρ g (x * y) = ρ g x * ρ g y) + (hσ : ∀ (g : G) (x y : B), σ g (x * y) = σ g x * σ g y) + (g : G) (x y : A ⊗[k] B) : + (ρ.tprod σ) g (x * y) = (ρ.tprod σ) g x * (ρ.tprod σ) g y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => rw [add_mul, map_add, map_add, h₁, h₂, add_mul] + | tmul a₁ b₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => rw [mul_add, map_add, map_add, h₁, h₂, mul_add] + | tmul a₂ b₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, + show (ρ.tprod σ) g (a₁ ⊗ₜ[k] b₁) = ρ g a₁ ⊗ₜ[k] σ g b₁ from rfl, + show (ρ.tprod σ) g (a₂ ⊗ₜ[k] b₂) = ρ g a₂ ⊗ₜ[k] σ g b₂ from rfl, + show (ρ.tprod σ) g ((a₁ * a₂) ⊗ₜ[k] (b₁ * b₂)) + = ρ g (a₁ * a₂) ⊗ₜ[k] σ g (b₁ * b₂) from rfl, + hρ, hσ, Algebra.TensorProduct.tmul_mul_tmul] + +end JetAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean new file mode 100644 index 000000000..88a25dd59 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean @@ -0,0 +1,111 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +/-! +# The jet gauge action on the jet algebra of the Standard Model + +## i. Overview + +The jet gauge group acts on the jet algebra of the Standard Model sector by sector: the +tensor product of the fermionic, Higgs and complexified gauge-boson actions. The action is +multiplicative — a jet of gauge transformations acts on a Lagrangian term factor by +factor — and restricts to the gauge sector's own substitution action through the sector +inclusion. + +## ii. Key results + +- `JetAlgebra.repJetGaugeGroupI` : the jet gauge action. +- `JetAlgebra.repJetGaugeGroupI_apply_mul` : the action is multiplicative. +- `JetAlgebra.repJetGaugeGroupI_includeGauge` : the restriction to the gauge sector. + +## iii. Table of contents + +- A. The action of the jet gauge group + - A.1. Multiplicativity + - A.2. The action on the gauge sector + +-/ + +@[expose] public section + +set_option maxHeartbeats 8000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups + +namespace JetAlgebra + +/-! + +## A. The action of the jet gauge group + +-/ + +/-- The jet gauge action on the jet algebra of the Standard Model: the three sectors + transform independently. -/ +noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := + (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI).tprod + GaugeJetAlgebra.complexRepJetGaugeGroupI + +@[simp] +lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) + (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (g : ℂ ⊗[ℝ] GaugeJetAlgebra) : + repJetGaugeGroupI U (w ⊗ₜ[ℂ] g) + = ((FermionJetAlgebra.repJetGaugeGroupI.tprod + HiggsJetAlgebra.repJetGaugeGroupI) U w) + ⊗ₜ[ℂ] (GaugeJetAlgebra.complexRepJetGaugeGroupI U g) := rfl + +/-! + +### A.1. Multiplicativity + +-/ + +/-- The jet gauge action on the jet algebra is multiplicative: a jet of gauge + transformations acts on a Lagrangian term factor by factor. -/ +lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : + repJetGaugeGroupI U (x * y) = repJetGaugeGroupI U x * repJetGaugeGroupI U y := + Representation.tprod_apply_mul _ _ + (Representation.tprod_apply_mul _ _ + (FermionicAlgebra.repJetGaugeGroupI_apply_mul _ _) + (BosonicAlgebra.repJetGaugeGroupI_apply_mul _ _)) + GaugeJetAlgebra.complexRepJetGaugeGroupI_apply_mul U x y + +/-! + +### A.2. The action on the gauge sector + +-/ + +/-- The jet gauge action restricts to the gauge sector's own action. -/ +lemma repJetGaugeGroupI_includeGauge (U : JetGaugeGroupI) + (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + repJetGaugeGroupI U (includeGauge y) + = includeGauge (GaugeJetAlgebra.complexRepJetGaugeGroupI U y) := by + rw [includeGauge_apply, repJetGaugeGroupI_tmul, + show (FermionJetAlgebra.repJetGaugeGroupI.tprod + HiggsJetAlgebra.repJetGaugeGroupI) U + ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + = (FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra)) from rfl, + show HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra) = 1 from + BosonicAlgebra.repJetGaugeGroupI_apply_one _ _ U, + show FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra) = 1 from + FermionicAlgebra.repJetGaugeGroupI_apply_one _ _ U, + includeGauge_apply] + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean new file mode 100644 index 000000000..8e34e0414 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -0,0 +1,186 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.JetAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invariants +/-! +# Gauge invariants of the jet algebra of the Standard Model + +## i. Overview + +The jet algebra of the Standard Model, with its Lorentz action, jet gauge action, the +gauge-field generators included from the gauge sector, and the total derivative, is a +*gauge field* in the sense of the abstract covariance machinery of +`Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued`. This file establishes that +instance and instantiates the abstract classification of invariants on the full algebra: + +**a gauge-invariant element of the subalgebra generated by the gauge-field symbols +`∂_s A_μ^φ` — together with any set `S` of elements fixed by the pure jets, such as the +covariant towers of the fermion and Higgs fields — is a polynomial in the covariant +derivatives of the field strength and the elements of `S`.** + +This is the covariance reduction of the Standard Model jet algebra: gauge invariance +eliminates the bare gauge-field symbols in favour of field strengths and covariant +derivatives. + +## ii. Key results + +- `JetAlgebra.gaugeField` : the gauge-field generators inside the full jet algebra. +- `JetAlgebra.isGaugeField` : the jet algebra of the Standard Model is a gauge field. +- `JetAlgebra.invariant_mem_adjoin_fieldStrength` : the classification of gauge + invariants. + +## iii. Table of contents + +- A. The gauge field inside the jet algebra + - A.1. The gauge-field generators + - A.2. Iterated derivatives through the gauge inclusion + - A.3. Centrality +- B. The `IsGaugeField` instance +- C. The classification of gauge invariants + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +namespace JetAlgebra + +open TensorProduct Matrix MatrixGroups + +/-! + +## A. The gauge field inside the jet algebra + +-/ + +/-! + +### A.1. The gauge-field generators + +-/ + +/-- The gauge-field generators of the jet algebra of the Standard Model: the gauge + sector's generators, included into the full algebra. -/ +noncomputable def gaugeField (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] JetAlgebra where + toFun φ := includeGauge (GaugeJetAlgebra.gaugeField μ φ) + map_add' φ ψ := by rw [map_add, map_add] + map_smul' r φ := by + rw [map_smul, ← algebraMap_smul ℂ r (GaugeJetAlgebra.gaugeField μ φ), map_smul, + algebraMap_smul, RingHom.id_apply] + +@[simp] +lemma gaugeField_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + gaugeField μ φ = includeGauge (GaugeJetAlgebra.gaugeField μ φ) := rfl + +/-! + +### A.2. Iterated derivatives through the gauge inclusion + +-/ + +/-- The iterated total derivative acts on the gauge sector through the gauge sector's + own iterated derivative. -/ +lemma iteratedD_includeGauge (s : Multiset (Fin 1 ⊕ Fin 3)) + (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeGauge y) + = includeGauge (Lorentz.iteratedD GaugeJetAlgebra.complexJetDeriv + GaugeJetAlgebra.complexJetDeriv_comm s y) := by + induction s using Multiset.induction_on with + | empty => + rw [Lorentz.iteratedD_zero, Lorentz.iteratedD_zero, LinearMap.id_apply, + LinearMap.id_apply] + | cons κ s ih => + rw [Lorentz.iteratedD_cons, Lorentz.iteratedD_cons, LinearMap.comp_apply, + LinearMap.comp_apply, ih, jetDeriv_includeGauge] + +/-! + +### A.3. Centrality + +-/ + +/-- The gauge sector lands in the centre of the jet algebra. -/ +lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + includeGauge y ∈ Subring.center JetAlgebra := + Subring.mem_center_iff.mpr fun z => includeGauge_commute y z + +/-! + +## B. The `IsGaugeField` instance + +-/ + +/-- **The jet algebra of the Standard Model is a gauge field**: its gauge-field + generators are Lorentz covectors, transform under the jet gauge group by the + all-orders Leibniz convolution of the adjoint Taylor coefficients plus the + Maurer–Cartan shift, and the gauge action is multiplicative. All three laws transport + from the gauge sector through the central inclusion. -/ +theorem isGaugeField : + IsGaugeField (B := JetAlgebra) repLorentzGroup repJetGaugeGroupI gaugeField jetDeriv + jetDeriv_comm where + lorentz_apply Λ μ φ := + (repLorentzGroup_includeGauge Λ (GaugeJetAlgebra.gaugeField μ φ)).trans <| + (congrArg includeGauge (GaugeJetAlgebra.isGaugeField.lorentz_apply Λ μ φ)).trans <| + (map_sum includeGauge _ Finset.univ).trans <| + Finset.sum_congr rfl fun a _ => map_smul includeGauge _ _ + gauge_apply_deriv U s μ φ := + (congrArg (fun z => repJetGaugeGroupI U z) + (iteratedD_includeGauge s (GaugeJetAlgebra.gaugeField μ φ))).trans <| + (repJetGaugeGroupI_includeGauge U _).trans <| + (congrArg includeGauge + (GaugeJetAlgebra.isGaugeField.gauge_apply_deriv U s μ φ)).trans <| by + rw [map_add, map_multiset_sum, Multiset.map_map, AlgHom.commutes] + exact congrArg₂ (· + ·) + (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => + (iteratedD_includeGauge p.2 _).symm)) rfl + gauge_mul U b₁ b₂ := repJetGaugeGroupI_apply_mul U b₁ b₂ + +/-! + +## C. The classification of gauge invariants + +-/ + +/-- **The classification of gauge invariants of the jet algebra of the Standard Model**: + a gauge-invariant element of the subalgebra generated by the gauge-field symbols + `∂_s A_μ^φ` and a set `S` of elements fixed by the pure jets — such as the covariant + towers of the fermion and Higgs fields — is a polynomial in the covariant derivatives + of the field strength and the elements of `S`. + + This is the covariance reduction of the Standard Model jet algebra: gauge invariance + eliminates the bare gauge-field symbols in favour of the field strength, its covariant + derivatives, and the matter content `S`. -/ +theorem invariant_mem_adjoin_fieldStrength (S : Set JetAlgebra) + (hS : ∀ y ∈ S, ∀ U : JetGaugeGroupI.truncationKer 0, repJetGaugeGroupI U.1 y = y) + {x : JetAlgebra} + (hx : x ∈ Algebra.adjoin ℂ ({b : JetAlgebra | + ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = Lorentz.iteratedD jetDeriv jetDeriv_comm p (gaugeField μ φ)} ∪ S)) + (hinv : ∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) : + x ∈ Algebra.adjoin ℂ ({b : JetAlgebra | + ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + b = IsGaugeField.iteratedCovDerivAdjoint gaugeField jetDeriv l + (IsGaugeField.fieldStrength gaugeField jetDeriv ν lam) φ} ∪ S) := + IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField jetDeriv_mul + (fun p μ φ => (iteratedD_includeGauge p (GaugeJetAlgebra.gaugeField μ φ)) ▸ + includeGauge_mem_center _) + S hS hx hinv + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean new file mode 100644 index 000000000..10fb23697 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -0,0 +1,275 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv +/-! +# The total derivative on the jet algebra of the Standard Model + +## i. Overview + +The formal total derivative on the jet algebra of the Standard Model is the sum of the +total derivatives of the three sector algebras, each acting on its own tensor factor. It +obeys the Leibniz rule, its components commute, and it restricts to the gauge sector's own +derivative through the sector inclusion. + +The Leibniz rule and the commutation are assembled from the sector facts through abstract +lemmas proved at small types, instantiated in term mode — rewriting inside the full tensor +product is prohibitively slow. + +## ii. Key results + +- `JetAlgebra.jetDeriv` : the formal total derivative. +- `JetAlgebra.jetDeriv_mul` : the Leibniz rule. +- `JetAlgebra.jetDeriv_comm` : the total derivatives commute. +- `JetAlgebra.jetDeriv_includeGauge` : the restriction to the gauge sector. + +## iii. Table of contents + +- A. The formal total derivative + - A.1. The action on pure tensors and the gauge sector +- B. Derivations on tensor products +- C. The Leibniz rule +- D. Commutativity + +-/ + +@[expose] public section + +set_option maxHeartbeats 8000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups + +namespace JetAlgebra + +/-! + +## A. The formal total derivative + +-/ + +/-- **The formal total derivative on the jet algebra of the Standard Model**: the sum of + the total derivatives of the three sectors, each acting on its own factor. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := + TensorProduct.map (TensorProduct.map (FermionicAlgebra.jetDeriv μ) LinearMap.id) + LinearMap.id + + TensorProduct.map (TensorProduct.map LinearMap.id (BosonicAlgebra.jetDeriv μ)) + LinearMap.id + + TensorProduct.map LinearMap.id (GaugeJetAlgebra.complexJetDeriv μ) + +/-! + +### A.1. The action on pure tensors and the gauge sector + +-/ + +lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) (h : HiggsJetAlgebra) + (g : ℂ ⊗[ℝ] GaugeJetAlgebra) : + jetDeriv μ ((f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g) + = ((FermionicAlgebra.jetDeriv μ f) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g + + (f ⊗ₜ[ℂ] (BosonicAlgebra.jetDeriv μ h)) ⊗ₜ[ℂ] g + + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] (GaugeJetAlgebra.complexJetDeriv μ g) := rfl + +/-- The derivative acts on the gauge sector through the gauge sector's own derivative. -/ +lemma jetDeriv_includeGauge (μ : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + jetDeriv μ (includeGauge y) = includeGauge (GaugeJetAlgebra.complexJetDeriv μ y) := by + rw [includeGauge_apply, jetDeriv_tmul, + show FermionicAlgebra.jetDeriv (V := FermionSpace) μ (1 : FermionJetAlgebra) = 0 from + FermionicAlgebra.jetDeriv_one μ, + show BosonicAlgebra.jetDeriv (V := HiggsVec) μ (1 : HiggsJetAlgebra) = 0 from + BosonicAlgebra.jetDeriv_one μ, + TensorProduct.zero_tmul, TensorProduct.zero_tmul, TensorProduct.tmul_zero, + TensorProduct.zero_tmul, zero_add, zero_add, includeGauge_apply] + +/-! + +## B. Derivations on tensor products + +-/ + +/-- A derivation of the left factor extends to a derivation of the tensor product. -/ +lemma _root_.TensorProduct.map_derivation_left {A B : Type*} [Ring A] [Algebra ℂ A] + [Ring B] [Algebra ℂ B] (D : A →ₗ[ℂ] A) + (hD : ∀ x y, D (x * y) = D x * y + x * D y) (x y : A ⊗[ℂ] B) : + TensorProduct.map D LinearMap.id (x * y) + = TensorProduct.map D LinearMap.id x * y + + x * TensorProduct.map D LinearMap.id y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => + rw [add_mul, map_add, map_add, h₁, h₂, add_mul, add_mul] + abel + | tmul a₁ b₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => + rw [mul_add, map_add, map_add, h₁, h₂, mul_add, mul_add] + abel + | tmul a₂ b₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, TensorProduct.map_tmul, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, LinearMap.id_apply, hD, TensorProduct.add_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul] + +/-- A derivation of the right factor extends to a derivation of the tensor product. -/ +lemma _root_.TensorProduct.map_derivation_right {A B : Type*} [Ring A] [Algebra ℂ A] + [Ring B] [Algebra ℂ B] (D : B →ₗ[ℂ] B) + (hD : ∀ x y, D (x * y) = D x * y + x * D y) (x y : A ⊗[ℂ] B) : + TensorProduct.map LinearMap.id D (x * y) + = TensorProduct.map LinearMap.id D x * y + + x * TensorProduct.map LinearMap.id D y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => + rw [add_mul, map_add, map_add, h₁, h₂, add_mul, add_mul] + abel + | tmul a₁ b₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => + rw [mul_add, map_add, map_add, h₁, h₂, mul_add, mul_add] + abel + | tmul a₂ b₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, TensorProduct.map_tmul, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, LinearMap.id_apply, hD, TensorProduct.tmul_add, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul] + +/-! + +## C. The Leibniz rule + +-/ + +/-- The sum of three derivations is a derivation: the purely additive assembly, stated + abstractly so it can be instantiated without rewriting inside a large type. -/ +private lemma add₃_derivation {R : Type*} [NonUnitalNonAssocRing R] + {D₁ D₂ D₃ : R → R} {x y : R} + (h₁ : D₁ (x * y) = D₁ x * y + x * D₁ y) + (h₂ : D₂ (x * y) = D₂ x * y + x * D₂ y) + (h₃ : D₃ (x * y) = D₃ x * y + x * D₃ y) : + D₁ (x * y) + D₂ (x * y) + D₃ (x * y) + = (D₁ x + D₂ x + D₃ x) * y + x * (D₁ y + D₂ y + D₃ y) := by + rw [h₁, h₂, h₃, add_mul, add_mul, mul_add, mul_add] + abel + +/-- **The Leibniz rule** for the total derivative on the jet algebra. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + have h₁ := TensorProduct.map_derivation_left + (B := ℂ ⊗[ℝ] GaugeJetAlgebra) + (TensorProduct.map (FermionicAlgebra.jetDeriv μ) LinearMap.id) + (TensorProduct.map_derivation_left (FermionicAlgebra.jetDeriv μ) + (FermionicAlgebra.jetDeriv_mul μ)) x y + have h₂ := TensorProduct.map_derivation_left + (B := ℂ ⊗[ℝ] GaugeJetAlgebra) + (TensorProduct.map LinearMap.id (BosonicAlgebra.jetDeriv μ)) + (TensorProduct.map_derivation_right (BosonicAlgebra.jetDeriv μ) + (BosonicAlgebra.jetDeriv_mul μ)) x y + have h₃ := TensorProduct.map_derivation_right + (A := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) + (GaugeJetAlgebra.complexJetDeriv μ) + (GaugeJetAlgebra.complexJetDeriv_mul μ) x y + exact add₃_derivation h₁ h₂ h₃ + +/-! + +## D. Commutativity + +-/ + +/-- The sum of three maps pairwise commuting with the sum of three others commutes with + it: the purely additive assembly, stated abstractly so it can be instantiated without + rewriting inside a large type. -/ +private lemma add₃_comp_comm {M : Type*} [AddCommMonoid M] [Module ℂ M] + {A₁ A₂ A₃ B₁ B₂ B₃ : M →ₗ[ℂ] M} + (h11 : A₁.comp B₁ = B₁.comp A₁) (h12 : A₁.comp B₂ = B₂.comp A₁) + (h13 : A₁.comp B₃ = B₃.comp A₁) (h21 : A₂.comp B₁ = B₁.comp A₂) + (h22 : A₂.comp B₂ = B₂.comp A₂) (h23 : A₂.comp B₃ = B₃.comp A₂) + (h31 : A₃.comp B₁ = B₁.comp A₃) (h32 : A₃.comp B₂ = B₂.comp A₃) + (h33 : A₃.comp B₃ = B₃.comp A₃) : + (A₁ + A₂ + A₃).comp (B₁ + B₂ + B₃) = (B₁ + B₂ + B₃).comp (A₁ + A₂ + A₃) := by + simp only [LinearMap.add_comp, LinearMap.comp_add, h11, h12, h13, h21, h22, h23, h31, + h32, h33] + abel + +/-- The total derivatives on the jet algebra commute. -/ +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (jetDeriv μ).comp (jetDeriv ν) = (jetDeriv ν).comp (jetDeriv μ) := by + have hW : ∀ D D' : (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) →ₗ[ℂ] + (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra), + (TensorProduct.map D (LinearMap.id (M := ℂ ⊗[ℝ] GaugeJetAlgebra))).comp + (TensorProduct.map D' LinearMap.id) + = TensorProduct.map (D.comp D') LinearMap.id := fun D D' => by + rw [← TensorProduct.map_comp, LinearMap.id_comp] + have hG : ∀ D D' : (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₗ[ℂ] (ℂ ⊗[ℝ] GaugeJetAlgebra), + (TensorProduct.map (LinearMap.id (M := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra)) + D).comp (TensorProduct.map LinearMap.id D') + = TensorProduct.map LinearMap.id (D.comp D') := fun D D' => by + rw [← TensorProduct.map_comp, LinearMap.id_comp] + have hWG : ∀ (D : (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) →ₗ[ℂ] + (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra)) + (D' : (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₗ[ℂ] (ℂ ⊗[ℝ] GaugeJetAlgebra)), + (TensorProduct.map D LinearMap.id).comp (TensorProduct.map LinearMap.id D') + = (TensorProduct.map LinearMap.id D').comp (TensorProduct.map D LinearMap.id) := + fun D D' => by + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, + LinearMap.id_comp, LinearMap.comp_id, LinearMap.comp_id] + have hFH : ∀ (D : FermionJetAlgebra →ₗ[ℂ] FermionJetAlgebra) + (D' : HiggsJetAlgebra →ₗ[ℂ] HiggsJetAlgebra), + (TensorProduct.map D LinearMap.id).comp (TensorProduct.map LinearMap.id D') + = (TensorProduct.map LinearMap.id D').comp (TensorProduct.map D LinearMap.id) := + fun D D' => by + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, + LinearMap.id_comp, LinearMap.comp_id, LinearMap.comp_id] + have hFF : ∀ D D' : FermionJetAlgebra →ₗ[ℂ] FermionJetAlgebra, + (TensorProduct.map D (LinearMap.id (M := HiggsJetAlgebra))).comp + (TensorProduct.map D' LinearMap.id) + = TensorProduct.map (D.comp D') LinearMap.id := fun D D' => by + rw [← TensorProduct.map_comp, LinearMap.id_comp] + have hHH : ∀ D D' : HiggsJetAlgebra →ₗ[ℂ] HiggsJetAlgebra, + (TensorProduct.map (LinearMap.id (M := FermionJetAlgebra)) D).comp + (TensorProduct.map LinearMap.id D') + = TensorProduct.map LinearMap.id (D.comp D') := fun D D' => by + rw [← TensorProduct.map_comp, LinearMap.id_comp] + have h11 := (hW _ _).trans + ((congrArg (fun m => TensorProduct.map m (LinearMap.id (M := ℂ ⊗[ℝ] GaugeJetAlgebra))) + ((hFF _ _).trans + ((congrArg (fun d => TensorProduct.map d (LinearMap.id (M := HiggsJetAlgebra))) + (FermionicAlgebra.jetDeriv_comm μ ν)).trans (hFF _ _).symm))).trans + (hW _ _).symm) + have h22 := (hW _ _).trans + ((congrArg (fun m => TensorProduct.map m (LinearMap.id (M := ℂ ⊗[ℝ] GaugeJetAlgebra))) + ((hHH _ _).trans + ((congrArg (fun d => TensorProduct.map (LinearMap.id (M := FermionJetAlgebra)) d) + (BosonicAlgebra.jetDeriv_comm μ ν)).trans (hHH _ _).symm))).trans + (hW _ _).symm) + have h33 := (hG _ _).trans + ((congrArg (fun d => TensorProduct.map + (LinearMap.id (M := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra)) d) + (GaugeJetAlgebra.complexJetDeriv_comm μ ν)).trans (hG _ _).symm) + have h12 := (hW _ _).trans + ((congrArg (fun m => TensorProduct.map m (LinearMap.id (M := ℂ ⊗[ℝ] GaugeJetAlgebra))) + (hFH (FermionicAlgebra.jetDeriv μ) (BosonicAlgebra.jetDeriv ν))).trans + (hW _ _).symm) + have h21 := (hW _ _).trans + ((congrArg (fun m => TensorProduct.map m (LinearMap.id (M := ℂ ⊗[ℝ] GaugeJetAlgebra))) + (hFH (FermionicAlgebra.jetDeriv ν) (BosonicAlgebra.jetDeriv μ)).symm).trans + (hW _ _).symm) + exact add₃_comp_comm h11 h12 (hWG _ _) h21 h22 (hWG _ _) (hWG _ _).symm + (hWG _ _).symm h33 + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean new file mode 100644 index 000000000..571ee8db5 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean @@ -0,0 +1,196 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.JetAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction +/-! +# The Lorentz action on the jet algebra of the Standard Model + +## i. Overview + +The Lorentz group acts on the jet algebra of the Standard Model sector by sector: the +tensor product of the fermionic, Higgs and complexified gauge-boson actions. The action is +multiplicative, restricts to the gauge sector's own action through the sector inclusion, +and intertwines the total derivative through the columns of the Lorentz matrix — the +total derivative is a Lorentz vector, packaged as a `Lorentz.IsLorentzDeriv` instance. + +The covariance of the derivative is assembled from the sector facts through an abstract +two-factor lemma proved at small types, instantiated in term mode — rewriting inside the +full tensor product is prohibitively slow. + +## ii. Key results + +- `JetAlgebra.repLorentzGroup` : the Lorentz action. +- `JetAlgebra.repLorentzGroup_apply_mul` : the action is multiplicative. +- `JetAlgebra.repLorentzGroup_includeGauge` : the restriction to the gauge sector. +- `JetAlgebra.repLorentzGroup_jetDeriv`, `JetAlgebra.instIsLorentzDeriv` : the total + derivative is a Lorentz vector. + +## iii. Table of contents + +- A. The action of the Lorentz group + - A.1. Multiplicativity + - A.2. The action on the gauge sector +- B. The total derivative is a Lorentz vector + +-/ + +@[expose] public section + +set_option maxHeartbeats 8000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups + +namespace JetAlgebra + +/-! + +## A. The action of the Lorentz group + +-/ + +/-- The Lorentz action on the jet algebra of the Standard Model: the three sectors + transform independently. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) JetAlgebra := + (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup).tprod + GaugeJetAlgebra.complexRepLorentzGroup + +@[simp] +lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) + (g : ℂ ⊗[ℝ] GaugeJetAlgebra) : + repLorentzGroup Λ (w ⊗ₜ[ℂ] g) + = ((FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ w) + ⊗ₜ[ℂ] (GaugeJetAlgebra.complexRepLorentzGroup Λ g) := rfl + +/-! + +### A.1. Multiplicativity + +-/ + +/-- The Lorentz action on the jet algebra is multiplicative. -/ +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : JetAlgebra) : + repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := + Representation.tprod_apply_mul _ _ + (Representation.tprod_apply_mul _ _ + (FermionicAlgebra.repLorentzGroup_apply_mul _) + (BosonicAlgebra.repLorentzGroup_apply_mul _)) + GaugeJetAlgebra.complexRepLorentzGroup_apply_mul Λ x y + +/-! + +### A.2. The action on the gauge sector + +-/ + +/-- The Lorentz action restricts to the gauge sector's own action. -/ +lemma repLorentzGroup_includeGauge (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + repLorentzGroup Λ (includeGauge y) + = includeGauge (GaugeJetAlgebra.complexRepLorentzGroup Λ y) := by + rw [includeGauge_apply, repLorentzGroup_tmul, + show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ + ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + = (FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra)) from rfl, + show HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra) = 1 from + BosonicAlgebra.repLorentzGroup_apply_one _ Λ, + show FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra) = 1 from + FermionicAlgebra.repLorentzGroup_apply_one _ Λ, + includeGauge_apply] + +/-! + +## B. The total derivative is a Lorentz vector + +-/ + +/-- A factorwise sum of Lorentz-vector derivatives on a tensor product is a Lorentz + vector: the abstract two-factor assembly, proved by tensor induction at abstract types + so that it can be instantiated on the jet algebra without rewriting inside it. -/ +private lemma tprod_deriv_sum {M N : Type} [AddCommGroup M] [Module ℂ M] + [AddCommGroup N] [Module ℂ N] + (ρ : Representation ℂ SL(2,ℂ) M) (σ : Representation ℂ SL(2,ℂ) N) + (D : (Fin 1 ⊕ Fin 3) → M →ₗ[ℂ] M) (E : (Fin 1 ⊕ Fin 3) → N →ₗ[ℂ] N) + (c : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℂ) (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (hD : ∀ ν x, ρ Λ (D ν x) = ∑ a, c a ν • D a (ρ Λ x)) + (hE : ∀ ν x, σ Λ (E ν x) = ∑ a, c a ν • E a (σ Λ x)) (x : M ⊗[ℂ] N) : + (ρ.tprod σ) Λ + ((TensorProduct.map (D μ) (LinearMap.id (M := N)) + + TensorProduct.map (LinearMap.id (M := M)) (E μ)) x) + = ∑ a, c a μ • + (TensorProduct.map (D a) (LinearMap.id (M := N)) + + TensorProduct.map (LinearMap.id (M := M)) (E a)) + ((ρ.tprod σ) Λ x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul m n => + rw [LinearMap.add_apply, TensorProduct.map_tmul, TensorProduct.map_tmul, + LinearMap.id_apply, LinearMap.id_apply, map_add, + show (ρ.tprod σ) Λ ((D μ m) ⊗ₜ[ℂ] n) = (ρ Λ (D μ m)) ⊗ₜ[ℂ] (σ Λ n) from rfl, + show (ρ.tprod σ) Λ (m ⊗ₜ[ℂ] (E μ n)) = (ρ Λ m) ⊗ₜ[ℂ] (σ Λ (E μ n)) from rfl, + hD, hE, TensorProduct.sum_tmul, TensorProduct.tmul_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [LinearMap.add_apply, + show (ρ.tprod σ) Λ (m ⊗ₜ[ℂ] n) = (ρ Λ m) ⊗ₜ[ℂ] (σ Λ n) from rfl, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, smul_add, ← TensorProduct.smul_tmul', + TensorProduct.tmul_smul] + +/-- **The total derivative on the jet algebra is a Lorentz vector.** -/ +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : + repLorentzGroup Λ (jetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup Λ x) := by + have e : ∀ ν, TensorProduct.map + (TensorProduct.map (FermionicAlgebra.jetDeriv ν) LinearMap.id + + TensorProduct.map LinearMap.id (BosonicAlgebra.jetDeriv ν)) + (LinearMap.id (M := ℂ ⊗[ℝ] GaugeJetAlgebra)) + + TensorProduct.map LinearMap.id (GaugeJetAlgebra.complexJetDeriv ν) + = jetDeriv ν := fun ν => + congrArg (fun m => m + TensorProduct.map LinearMap.id + (GaugeJetAlgebra.complexJetDeriv ν)) (TensorProduct.map_add_left _ _ _) + have hFH : ∀ (ν : Fin 1 ⊕ Fin 3) (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra), + (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ + ((TensorProduct.map (FermionicAlgebra.jetDeriv (V := FermionSpace) ν) + (LinearMap.id (M := HiggsJetAlgebra)) + + TensorProduct.map (LinearMap.id (M := FermionJetAlgebra)) + (BosonicAlgebra.jetDeriv (V := HiggsVec) ν)) w) + = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a ν : ℝ) : ℂ) • + (TensorProduct.map (FermionicAlgebra.jetDeriv (V := FermionSpace) a) + (LinearMap.id (M := HiggsJetAlgebra)) + + TensorProduct.map (LinearMap.id (M := FermionJetAlgebra)) + (BosonicAlgebra.jetDeriv (V := HiggsVec) a)) + ((FermionJetAlgebra.repLorentzGroup.tprod + HiggsJetAlgebra.repLorentzGroup) Λ w) := fun ν w => + tprod_deriv_sum _ _ _ _ _ Λ ν + (fun κ z => FermionicAlgebra.repLorentzGroup_jetDeriv _ Λ κ z) + (fun κ z => BosonicAlgebra.repLorentzGroup_jetDeriv _ Λ κ z) w + refine (congrArg (fun (L : JetAlgebra →ₗ[ℂ] JetAlgebra) => repLorentzGroup Λ (L x)) + (e μ).symm).trans ((tprod_deriv_sum _ _ _ _ _ Λ μ hFH + (fun κ z => GaugeJetAlgebra.complexRepLorentzGroup_jetDeriv Λ κ z) x).trans + (Finset.sum_congr rfl fun a _ => congrArg + (fun (L : JetAlgebra →ₗ[ℂ] JetAlgebra) => + (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • L (repLorentzGroup Λ x)) + (e a))) + +/-- The total derivatives on the jet algebra form a Lorentz derivative. -/ +instance instIsLorentzDeriv : Lorentz.IsLorentzDeriv repLorentzGroup jetDeriv where + rep_deriv := repLorentzGroup_jetDeriv _ _ _ + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassDim.lean new file mode 100644 index 000000000..dc047a53e --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/MassDim.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim +/-! +# The mass-dimension scaling on the jet algebra of the Standard Model + +## i. Overview + +The mass-dimension scaling on the jet algebra of the Standard Model acts sector by +sector: fermions carry mass weight three, the Higgs weight two, the gauge fields weight +two, and every derivative weight two. A monomial of total mass weight `w` is scaled by +`r ^ w`; the terms of a Lagrangian of mass dimension four are exactly those scaling with +`r ^ 8`. + +## ii. Key results + +- `JetAlgebra.complexGaugeMassWeightScale` : the scaling on the complexified gauge + sector. +- `JetAlgebra.massWeightScale` : the mass-dimension scaling on the jet algebra. + +## iii. Table of contents + +- A. The mass-dimension scaling + +-/ + +@[expose] public section + +set_option maxHeartbeats 8000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct + +namespace JetAlgebra + +/-! + +## A. The mass-dimension scaling + +-/ + +/-- The mass-dimension scaling on the complexified gauge sector. -/ +noncomputable def complexGaugeMassWeightScale (r : ℝ) : + (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₐ[ℂ] (ℂ ⊗[ℝ] GaugeJetAlgebra) := + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (GaugeJetAlgebra.massWeightScale r) + +/-- **The mass-dimension scaling on the jet algebra of the Standard Model**: each sector + scales by its own mass weights — fermions carry weight three, the Higgs weight two, the + gauge fields weight two, and every derivative weight two. -/ +noncomputable def massWeightScale (r : ℝ) : JetAlgebra →ₐ[ℂ] JetAlgebra := + Algebra.TensorProduct.map + (Algebra.TensorProduct.map (FermionJetAlgebra.massWeightScale (r : ℂ)) + (HiggsJetAlgebra.massWeightScale (r : ℂ))) + (complexGaugeMassWeightScale r) + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean new file mode 100644 index 000000000..625eddffb --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.Mathematics.SymmetricAlgebra +/-! +# The bosonic algebra of a matter field + +## i. Overview + +For a bosonic matter field valued in a complex vector space `V`, the *bosonic algebra* is +the symmetric algebra on the jet component space `JetComponentSpace V`. It is the algebra +in which the `V`-part of a Lagrangian lives: the generators are the component functions +`∂_s φ_α` and their conjugates `∂_s φ̄_α`, and the symmetric product implements the +commutativity of bosonic fields. It is the bosonic mirror of `FermionicAlgebra`, with the +symmetric algebra in place of the exterior algebra. + +Everything the component space carries lifts to the bosonic algebra by functoriality of +the symmetric algebra: the Lorentz action (`BosonicAlgebra.repLorentzGroup`), the jet +gauge action (`BosonicAlgebra.repJetGaugeGroupI`), and the formal total derivative +(`BosonicAlgebra.jetDeriv`), which extends as a derivation rather than by functoriality. +Those live in the sibling files `LorentzAction`, `GaugeAction` and `JetDeriv`. + +## ii. Key results + +- `BosonicAlgebra` : the symmetric algebra on the jet component space. +- `BosonicAlgebra.adjoin_ι_eq_top` : the algebra is generated by the component functions. +- `BosonicAlgebra.ofField`, `BosonicAlgebra.ofConjField` : the field and its conjugate. +- `BosonicAlgebra.comap` : the inclusion of a species, contravariant in the target space. + +## iii. Table of contents + +- A. The bosonic algebra + - A.1. The generators of the bosonic algebra + - A.2. The field and its conjugate + - A.3. Inclusion of a species + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The bosonic algebra + +-/ + +/-- The bosonic algebra of a `V`-valued matter field: the symmetric algebra on the space + of component functions `∂_s φ_α` and `∂_s φ̄_α`. The symmetric product is the product of + bosonic fields, its commutativity the Bose statistics. -/ +abbrev BosonicAlgebra (V : Type) [AddCommGroup V] [Module ℂ V] : Type := + SymmetricAlgebra ℂ (JetComponentSpace V) + +namespace BosonicAlgebra + +/-! + +### A.1. The generators of the bosonic algebra + +-/ + +/-- **The bosonic algebra is generated by the component functions.** Every element is a + polynomial in the degree-one elements — the symbols `∂_s φ_α` and `∂_s φ̄_α` themselves. + This is the algebraic form of "every Lagrangian term is a polynomial in the component + functions". -/ +@[simp] +lemma adjoin_ι_eq_top : + Algebra.adjoin ℂ (Set.range (SymmetricAlgebra.ι ℂ (JetComponentSpace V))) = ⊤ := + SymmetricAlgebra.adjoin_range_ι + +/-- Two component functions commute: Bose statistics. -/ +lemma ι_mul_ι_comm (x y : JetComponentSpace V) : + (SymmetricAlgebra.ι ℂ _ x * SymmetricAlgebra.ι ℂ _ y : BosonicAlgebra V) + = SymmetricAlgebra.ι ℂ _ y * SymmetricAlgebra.ι ℂ _ x := + mul_comm _ _ + +/-! + +### A.2. The field and its conjugate + +The undifferentiated component functions sit inside the bosonic algebra as the two +inclusions below. A component function is a *covector* on the target space: `ofField φ` is +the component of the field `ψ` along `φ`, the element written `ψ_α` when `φ` is the `α`-th +coordinate. The conjugate field is a covector on `ConjModule V`, whose scalar action is +twisted by complex conjugation — that twist is exactly the statement that `ψ̄` transforms +by the conjugate of the representation carried by `ψ`. + +Every other generator of the algebra is an iterated derivative of one of these, which is +the content of `BosonicAlgebra.adjoin_iteratedJetDeriv_eq_top`. + +-/ + +/-- **The component function `ψ_φ` of the matter field** along the covector `φ` on `V`: the + undifferentiated generator, sitting at the empty derivative label in the unconjugated half + of the component space. -/ +noncomputable def ofField : Module.Dual ℂ V →ₗ[ℂ] BosonicAlgebra V := + (SymmetricAlgebra.ι ℂ _).comp + ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ V) 1)) + +/-- **The component function `ψ̄_φ` of the conjugate matter field** along the covector `φ` + on `ConjModule V`: the undifferentiated generator in the conjugate half of the component + space. -/ +noncomputable def ofConjField : Module.Dual ℂ (ConjModule V) →ₗ[ℂ] BosonicAlgebra V := + (SymmetricAlgebra.ι ℂ _).comp + ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule V)) 1)) + +lemma ofField_apply (φ : Module.Dual ℂ V) : + ofField φ = SymmetricAlgebra.ι ℂ _ + (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := rfl + +lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule V)) : + ofConjField φ = SymmetricAlgebra.ι ℂ _ + ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace V) := rfl + +/-! + +### A.3. Inclusion of a species + +A field valued in `V` that is one *species* among several — i.e. `V` is a summand of a +larger target space `W` — has its bosonic algebra sitting inside the bosonic algebra of +`W`. The inclusion is induced by the *projection* `W →ₗ[ℂ] V`, because component functions +are covectors on the target and therefore transpose. `comap` is that induced map, and it is +functorial and compatible with everything the algebra carries. + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The bosonic algebra is contravariant in the target space.** A linear map + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `BosonicAlgebra W →ₐ[ℂ] BosonicAlgebra V` + by pulling back component functions. Applied to a *projection* out of a multi-species + target space, this is the inclusion of one species' algebra into the whole. -/ +noncomputable def comap (f : V →ₗ[ℂ] W) : BosonicAlgebra W →ₐ[ℂ] BosonicAlgebra V := + SymmetricAlgebra.map (JetComponentSpace.comap f) + +@[simp] +lemma comap_ι (f : V →ₗ[ℂ] W) (x : JetComponentSpace W) : + comap f (SymmetricAlgebra.ι ℂ _ x) + = SymmetricAlgebra.ι ℂ _ (JetComponentSpace.comap f x) := + SymmetricAlgebra.map_apply_ι _ x + +@[simp] +lemma comap_id : comap (LinearMap.id : V →ₗ[ℂ] V) = AlgHom.id ℂ (BosonicAlgebra V) := by + rw [comap, JetComponentSpace.comap_id, SymmetricAlgebra.map_id] + +/-- Functoriality: the order reverses, as it must for a contravariant construction. -/ +lemma comap_comp {U : Type} [AddCommGroup U] [Module ℂ U] (f : V →ₗ[ℂ] W) (g : W →ₗ[ℂ] U) : + comap (g.comp f) = (comap f).comp (comap g) := by + rw [comap, comap, comap, JetComponentSpace.comap_comp, ← SymmetricAlgebra.map_comp_map] + +/-- The inclusion sends a component function of the species to the corresponding component + function of the whole. -/ +@[simp] +lemma comap_ofField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ W) : + comap f (ofField φ) = ofField (φ ∘ₗ f) := by + rw [ofField_apply, comap_ι, ofField_apply] + congr 1 + +/-- The inclusion sends a conjugate component function of the species to the corresponding + conjugate component function of the whole. -/ +@[simp] +lemma comap_ofConjField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ (ConjModule W)) : + comap f (ofConjField φ) = ofConjField (φ ∘ₗ ConjModule.map f) := by + rw [ofConjField_apply, comap_ι, ofConjField_apply] + congr 1 + +end BosonicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean new file mode 100644 index 000000000..54f2db96b --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean @@ -0,0 +1,241 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.BosonicAlgebra.Basic +/-! +# The gauge action on the bosonic algebra + +## i. Overview + +Given a fibrewise action of the jet gauge group on the jets `JetRing ⊗[ℂ] V` of a bosonic +matter field, the jet gauge group acts on the bosonic algebra by the symmetric-algebra +functor applied to the induced action on the jet component space. On a component function +`∂_s φ_α` the action is the all-orders Leibniz rule: each splitting of the derivative +multiset contributes a Taylor coefficient of the gauge jet against a lower component +function. + +Restricting along `JetGaugeGroupI.ofConstant` gives the action of the constant — that is, +global — gauge transformations, which is diagonal in the derivative label. + +## ii. Key results + +- `BosonicAlgebra.repJetGaugeGroupI` : the jet gauge action on the bosonic algebra. +- `BosonicAlgebra.repJetGaugeGroupIAlgHom` : the action as an algebra homomorphism. +- `BosonicAlgebra.repJetGaugeGroupI_ofField` : `ofField` is gauge equivariant, for the + value of the gauge transformation at the base point. +- `BosonicAlgebra.repGaugeGroupI` : the action of the constant gauge transformations. + +## iii. Table of contents + +- A. The action of the jet gauge group + - A.1. Equivariance of the field and its conjugate +- B. Constant gauge transformations + +-/ + +@[expose] public section + +namespace StandardModel + +namespace BosonicAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] + +/-! + +## A. The action of the jet gauge group + +-/ + +/-- **The jet gauge action on the bosonic algebra** of a `V`-valued matter field, induced + from a fibrewise action `rep` on the jets of the field: the symmetric-algebra functor + applied to the gauge action on the jet component space. The hypothesis `hlin` is the + statement that a gauge transformation acts on the *values* of the field, over the + identity on spacetime. -/ +noncomputable def repJetGaugeGroupI + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ JetGaugeGroupI (BosonicAlgebra V) where + toFun U := + (SymmetricAlgebra.map (JetComponentSpace.repJetGaugeGroupI rep hlin U)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, SymmetricAlgebra.map_id, AlgHom.toLinearMap_id] + map_mul' U W := by + simp only [map_mul, Module.End.mul_eq_comp, ← SymmetricAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repJetGaugeGroupI_apply + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (x : BosonicAlgebra V) : + repJetGaugeGroupI rep hlin U x = + SymmetricAlgebra.map (JetComponentSpace.repJetGaugeGroupI rep hlin U) x := rfl + +@[simp] +lemma repJetGaugeGroupI_apply_one + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) : + repJetGaugeGroupI rep hlin U (1 : BosonicAlgebra V) = 1 := by + simp [repJetGaugeGroupI_apply] + +lemma repJetGaugeGroupI_apply_mul + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (x y : BosonicAlgebra V) : + repJetGaugeGroupI rep hlin U (x * y) = + repJetGaugeGroupI rep hlin U x * repJetGaugeGroupI rep hlin U y := by + simp [repJetGaugeGroupI_apply] + +/-- On a component function the jet gauge action is the action on the component space. -/ +@[simp] +lemma repJetGaugeGroupI_ι + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (v : JetComponentSpace V) : + repJetGaugeGroupI rep hlin U (SymmetricAlgebra.ι ℂ _ v) = + SymmetricAlgebra.ι ℂ _ (JetComponentSpace.repJetGaugeGroupI rep hlin U v) := by + rw [repJetGaugeGroupI_apply, SymmetricAlgebra.map_apply_ι] + +/-- The jet gauge action as an algebra homomorphism: a gauge transformation acts on a + Lagrangian term factor by factor. -/ +noncomputable def repJetGaugeGroupIAlgHom + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) : BosonicAlgebra V →ₐ[ℂ] BosonicAlgebra V where + toFun := repJetGaugeGroupI rep hlin U + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repJetGaugeGroupI_apply_one rep hlin U + map_mul' := repJetGaugeGroupI_apply_mul rep hlin U + commutes' r := by simp [repJetGaugeGroupI_apply] + +/-! + +### A.1. Equivariance of the field and its conjugate + +Unlike a derivative generator `∂_s φ_α`, which mixes with lower generators through the +Taylor coefficients of the gauge jet, the undifferentiated generator `φ_α` transforms by +the *value* of the gauge transformation at the base point alone. So `ofField` and +`ofConjField` are equivariant on the nose, for the contragredient of that value. + +-/ + +/-- **`ofField` is gauge equivariant.** The undifferentiated component functions transform + by the contragredient of the value of the gauge transformation at the base point; no + derivative of the gauge jet contributes. -/ +lemma repJetGaugeGroupI_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) : + repJetGaugeGroupI rep hlin U (ofField φ) = + ofField (Module.Dual.transpose (jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant) φ) := by + rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · exact repDual_one_tmul rep hlin U φ + · rw [JetComponentSpace.repJetGaugeGroupI_snd] + exact map_zero _ + +/-- **`ofConjField` is gauge equivariant**, for the conjugate action `repConj rep` on the + jets of the conjugate field — which is the physicists' `φ̄ ↦ φ̄ U†`. -/ +lemma repJetGaugeGroupI_ofConjField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : + repJetGaugeGroupI rep hlin U (ofConjField φ) = + ofConjField (Module.Dual.transpose + (jetEval ∘ₗ (repConj rep U⁻¹).comp jetOfConstant) φ) := by + rw [ofConjField_apply, repJetGaugeGroupI_ι, ofConjField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repJetGaugeGroupI_fst] + exact map_zero _ + · exact repDual_one_tmul (repConj rep) (repConj_smul_comm hlin) U φ + +/-! + +## B. Constant gauge transformations + +-/ + +/-- The action of the constant — that is, global — gauge transformations on the bosonic + algebra, obtained by including a gauge transformation as a constant gauge jet. -/ +noncomputable def repGaugeGroupI + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ GaugeGroupI (BosonicAlgebra V) := + (repJetGaugeGroupI rep hlin).comp JetGaugeGroupI.ofConstant + +lemma repGaugeGroupI_apply + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (x : BosonicAlgebra V) : + repGaugeGroupI rep hlin g x = + repJetGaugeGroupI rep hlin (JetGaugeGroupI.ofConstant g) x := rfl + +@[simp] +lemma repGaugeGroupI_apply_one + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) : + repGaugeGroupI rep hlin g (1 : BosonicAlgebra V) = 1 := + repJetGaugeGroupI_apply_one rep hlin _ + +lemma repGaugeGroupI_apply_mul + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (x y : BosonicAlgebra V) : + repGaugeGroupI rep hlin g (x * y) = + repGaugeGroupI rep hlin g x * repGaugeGroupI rep hlin g y := + repJetGaugeGroupI_apply_mul rep hlin _ x y + +/-- A constant gauge transformation acts on the undifferentiated field by the + contragredient of its value — which for a constant jet is the transformation itself. -/ +lemma repGaugeGroupI_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (φ : Module.Dual ℂ V) : + repGaugeGroupI rep hlin g (ofField φ) = + ofField (Module.Dual.transpose + (jetEval ∘ₗ (rep (JetGaugeGroupI.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + have h : (JetGaugeGroupI.ofConstant g)⁻¹ = JetGaugeGroupI.ofConstant g⁻¹ := + (map_inv JetGaugeGroupI.ofConstant g).symm + rw [repGaugeGroupI_apply, repJetGaugeGroupI_ofField, h] + +/-- A constant gauge transformation acts on the undifferentiated conjugate field by the + conjugate contragredient of its value. -/ +lemma repGaugeGroupI_ofConjField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : + repGaugeGroupI rep hlin g (ofConjField φ) = + ofConjField (Module.Dual.transpose + (jetEval ∘ₗ (repConj rep (JetGaugeGroupI.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + have h : (JetGaugeGroupI.ofConstant g)⁻¹ = JetGaugeGroupI.ofConstant g⁻¹ := + (map_inv JetGaugeGroupI.ofConstant g).symm + rw [repGaugeGroupI_apply, repJetGaugeGroupI_ofConjField, h] + +end BosonicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean new file mode 100644 index 000000000..eb8cf600a --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean @@ -0,0 +1,332 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.BosonicAlgebra.Basic +public import Physlib.Relativity.IsLorentzDeriv +/-! +# The formal total derivative on the bosonic algebra + +## i. Overview + +The formal total spacetime derivative extends from the component functions to the whole +bosonic algebra as a derivation: it is `SymmetricAlgebra.derivationOfLinear` applied to the +shift `∂_s φ_α ↦ ∂_{s + {μ}} φ_α` on the jet component space. + +The four directional derivatives commute, so they iterate along a *multiset* of directions +through `Lorentz.iteratedD`. On a component function the iterate is multiplication by the +derivative symbol `∂_s` in the `DerivAlgebraComplex` factor, and on a product it obeys the +all-orders Leibniz rule over the antidiagonal of the multiset. + +## ii. Key results + +- `BosonicAlgebra.jetDeriv` : the formal total spacetime derivative. +- `BosonicAlgebra.jetDeriv_mul` : the Leibniz rule. +- `BosonicAlgebra.jetDeriv_comm` : total derivatives commute. +- `BosonicAlgebra.iteratedJetDeriv` : the iterated derivative along a multiset. +- `BosonicAlgebra.iteratedJetDeriv_mul` : the all-orders Leibniz rule. +- `BosonicAlgebra.adjoin_iteratedJetDeriv_eq_top` : the algebra is generated by the field, + its conjugate, and their derivatives. +- `BosonicAlgebra.comap_jetDeriv` : the inclusion of a species commutes with the + derivative. + +## iii. Table of contents + +- A. The formal total derivative on the bosonic algebra +- B. The iterated total derivative +- C. Generation by the field and its derivatives +- D. Compatibility with the inclusion of a species + +-/ + +@[expose] public section + +namespace StandardModel + +namespace BosonicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The formal total derivative on the bosonic algebra + +-/ + +/-- The formal total spacetime derivative on the bosonic algebra of a `V`-valued matter + field in the direction `μ`: the derivation extending the shift + `∂_s φ_α ↦ ∂_{s + {μ}} φ_α` of the component functions. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : + BosonicAlgebra V →ₗ[ℂ] BosonicAlgebra V := + SymmetricAlgebra.derivationOfLinear (JetComponentSpace.jetDeriv μ) + +/-- On a component function the total derivative is the shift of the derivative label. -/ +@[simp] +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDeriv μ (SymmetricAlgebra.ι ℂ _ x) = + SymmetricAlgebra.ι ℂ _ (JetComponentSpace.jetDeriv μ x) := + SymmetricAlgebra.derivationOfLinear_ι _ x + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (V := V) μ (1 : BosonicAlgebra V) = 0 := + SymmetricAlgebra.derivationOfLinear_one _ + +@[simp] +lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : + jetDeriv (V := V) μ (algebraMap ℂ (BosonicAlgebra V) r) = 0 := + SymmetricAlgebra.derivationOfLinear_algebraMap _ r + +/-- The total derivative is a derivation: the Leibniz rule holds on the bosonic + algebra. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : BosonicAlgebra V) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := + SymmetricAlgebra.derivationOfLinear_mul _ x y + +/-- **Mixed partials agree.** The derivative labels live in a *symmetric* algebra, so the + total derivatives in different directions commute. -/ +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra V) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := + SymmetricAlgebra.derivationOfLinear_comm_apply + (JetComponentSpace.jetDeriv_comm μ ν) x + +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (jetDeriv (V := V) μ).comp (jetDeriv ν) = (jetDeriv (V := V) ν).comp (jetDeriv μ) := + LinearMap.ext fun x => jetDeriv_comm_apply μ ν x + +/-! + +## B. The iterated total derivative + +-/ + +/-- The iterated total derivative `∂_s = ∂_{ν₁} ⋯ ∂_{νₙ}` along a multiset `s` of + directions. It is well defined on a multiset — i.e. independent of the order in which the + directions are listed — because the directional derivatives commute. -/ +noncomputable def iteratedJetDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : + BosonicAlgebra V →ₗ[ℂ] BosonicAlgebra V := + Lorentz.iteratedD jetDeriv jetDeriv_comm s + +@[simp] +lemma iteratedJetDeriv_zero : + iteratedJetDeriv (0 : Multiset (Fin 1 ⊕ Fin 3)) + = LinearMap.id (R := ℂ) (M := BosonicAlgebra V) := + Lorentz.iteratedD_zero jetDeriv jetDeriv_comm + +lemma iteratedJetDeriv_cons (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (V := V) (μ ::ₘ s) = (jetDeriv μ).comp (iteratedJetDeriv s) := + Lorentz.iteratedD_cons jetDeriv jetDeriv_comm μ s + +/-- The companion of `iteratedJetDeriv_cons`, peeling the extra derivative on the inside. -/ +lemma iteratedJetDeriv_cons' (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (V := V) (μ ::ₘ s) = (iteratedJetDeriv s).comp (jetDeriv μ) := + Lorentz.iteratedD_cons' jetDeriv jetDeriv_comm μ s + +@[simp] +lemma iteratedJetDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + iteratedJetDeriv (V := V) {μ} = jetDeriv μ := + Lorentz.iteratedD_singleton jetDeriv jetDeriv_comm μ + +/-- The iterated derivative is additive in the multiset of directions: differentiating + along `s + t` is differentiating along `t` and then along `s`. -/ +lemma iteratedJetDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (V := V) (s + t) + = (iteratedJetDeriv s).comp (iteratedJetDeriv t) := + Lorentz.iteratedD_add jetDeriv jetDeriv_comm s t + +/-- **The all-orders Leibniz rule.** The iterated derivative of a product distributes over + the antidiagonal of the multiset of directions: each way of splitting the derivatives + between the two factors contributes one term. -/ +lemma iteratedJetDeriv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : BosonicAlgebra V) : + iteratedJetDeriv s (x * y) = + (s.antidiagonal.map fun p => + iteratedJetDeriv p.1 x * iteratedJetDeriv p.2 y).sum := + Lorentz.iteratedD_mul jetDeriv jetDeriv_comm jetDeriv_mul s x y + +/-- A nonempty iterated derivative kills the constants. -/ +lemma iteratedJetDeriv_one_of_ne_zero {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s ≠ 0) : + iteratedJetDeriv (V := V) s (1 : BosonicAlgebra V) = 0 := by + obtain ⟨μ, hμ⟩ := Multiset.exists_mem_of_ne_zero hs + obtain ⟨t, rfl⟩ := Multiset.exists_cons_of_mem hμ + rw [iteratedJetDeriv_cons', LinearMap.comp_apply, jetDeriv_one, map_zero] + +/-- **On a component function the iterated derivative is the derivative symbol `∂_s`.** + Both halves of the component space — the field and its conjugate — are multiplied by the + degree-`|s|` element `∂_s` of `DerivAlgebraComplex` in their derivative-label factor, + with the target index untouched. -/ +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpace V) : + iteratedJetDeriv s (SymmetricAlgebra.ι ℂ _ x) = + SymmetricAlgebra.ι ℂ _ + (TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) + LinearMap.id x.1, + TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) + LinearMap.id x.2) := by + have hmul : ∀ t u : Multiset (Fin 1 ⊕ Fin 3), + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis t)).comp + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis u)) + = LinearMap.mulRight ℂ (DerivAlgebraComplex.basis (u + t)) := fun t u => + LinearMap.ext fun a => by + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.mulRight_apply, mul_assoc, + DerivAlgebraComplex.basis_mul] + have hone : LinearMap.mulRight ℂ (1 : DerivAlgebraComplex) = LinearMap.id := + LinearMap.ext fun a => mul_one a + have hnil : DerivAlgebraComplex.basis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := + DerivAlgebraComplex.basis_nil + induction s using Multiset.induction_on with + | empty => + rw [iteratedJetDeriv_zero, LinearMap.id_apply, hnil, hone] + simp only [TensorProduct.map_id, LinearMap.id_apply] + | cons μ s ih => + have hs : s + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ s := by + rw [add_comm, Multiset.singleton_add] + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, ih, jetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.jetDeriv_fst, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, hmul, hs] + · rw [JetComponentSpace.jetDeriv_snd, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, hmul, hs] + +/-! + +## C. Generation by the field and its derivatives + +-/ + +/-- The iterated derivative of the field is the generator carrying the derivative symbol + `∂_s`: applying `∂_s` to `ψ_φ` writes the label `s` into the derivative factor. -/ +@[simp] +lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + iteratedJetDeriv s (ofField φ) = + SymmetricAlgebra.ι ℂ _ + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := by + rw [ofField_apply, iteratedJetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, one_mul, LinearMap.id_apply] + · rw [map_zero] + +/-- The iterated derivative of the conjugate field is the conjugate generator carrying the + derivative symbol `∂_s`. -/ +@[simp] +lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule V)) : + iteratedJetDeriv s (ofConjField φ) = + SymmetricAlgebra.ι ℂ _ + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) := by + rw [ofConjField_apply, iteratedJetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [map_zero] + · rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, one_mul, LinearMap.id_apply] + +/-- **The bosonic algebra is generated by the field, its conjugate, and their + derivatives.** As a `ℂ`-algebra, `BosonicAlgebra V` is the algebra adjoined by the + iterated total derivatives `∂_s ψ_φ` and `∂_s ψ̄_φ` of the undifferentiated component + functions. Physically: every Lagrangian term for a `V`-valued bosonic matter field is a + polynomial in the field, its conjugate, and their spacetime derivatives — nothing else is + available to write down. -/ +theorem adjoin_iteratedJetDeriv_eq_top : + Algebra.adjoin ℂ + (⋃ s : Multiset (Fin 1 ⊕ Fin 3), + Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + iteratedJetDeriv s (ofConjField φ))) + = (⊤ : Subalgebra ℂ (BosonicAlgebra V)) := by + set S : Set (BosonicAlgebra V) := + ⋃ s : Multiset (Fin 1 ⊕ Fin 3), + Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + iteratedJetDeriv s (ofConjField φ)) with hS + /- The two half-inclusions of the component space into the bosonic algebra. -/ + let gField : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] BosonicAlgebra V := + (SymmetricAlgebra.ι ℂ _).comp (LinearMap.inl ℂ _ _) + let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] + BosonicAlgebra V := + (SymmetricAlgebra.ι ℂ _).comp (LinearMap.inr ℂ _ _) + /- On a derivative monomial each half-inclusion is one of the adjoined generators. -/ + have hbasisField : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + gField (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by + intro s φ + have h : gField (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) = iteratedJetDeriv s (ofField φ) := + (iteratedJetDeriv_ofField s φ).symm + rw [h, hS] + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨s, Or.inl ⟨φ, rfl⟩⟩) + have hbasisConj : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule V)), + gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by + intro s φ + have h : gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) + = iteratedJetDeriv s (ofConjField φ) := (iteratedJetDeriv_ofConjField s φ).symm + rw [h, hS] + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨s, Or.inr ⟨φ, rfl⟩⟩) + /- The derivative monomials span, so each half-inclusion lands in the adjoined algebra. -/ + have hhalf : ∀ {W : Type} [AddCommGroup W] [Module ℂ W] + (g : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra V), + (∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (w : W), + g (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] w) ∈ Algebra.adjoin ℂ S) → + ∀ y, g y ∈ Algebra.adjoin ℂ S := by + intro W _ _ g hg y + induction y using TensorProduct.induction_on with + | zero => rw [map_zero]; exact zero_mem _ + | add y z hy hz => rw [map_add]; exact add_mem hy hz + | tmul a w => + have ha : a ∈ Submodule.span ℂ (Set.range DerivAlgebraComplex.basis) := by + rw [DerivAlgebraComplex.basis.span_eq]; trivial + induction ha using Submodule.span_induction with + | mem b hb => obtain ⟨s, rfl⟩ := hb; exact hg s w + | zero => rw [TensorProduct.zero_tmul, map_zero]; exact zero_mem _ + | add b c _ _ hb hc => rw [TensorProduct.add_tmul, map_add]; exact add_mem hb hc + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul] + exact Subalgebra.smul_mem _ hb c + /- Every component function is a sum of its two halves. -/ + refine top_le_iff.mp ?_ + rw [← adjoin_ι_eq_top (V := V)] + refine Algebra.adjoin_le ?_ + rintro _ ⟨x, rfl⟩ + have hx : x = LinearMap.inl ℂ _ _ x.1 + LinearMap.inr ℂ _ _ x.2 := by + refine Prod.ext ?_ ?_ <;> simp + rw [hx, map_add] + exact add_mem (hhalf gField hbasisField x.1) (hhalf gConj hbasisConj x.2) + +/-! + +## D. Compatibility with the inclusion of a species + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The inclusion of a species is a map of differential algebras.** Pulling back along a + map of target spaces commutes with the total derivative: the two act on different labels + of a component function. -/ +lemma comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra W) : + comap f (jetDeriv μ x) = jetDeriv μ (comap f x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => + rw [jetDeriv_algebraMap, map_zero, AlgHom.commutes, jetDeriv_algebraMap] + | ι v => + rw [jetDeriv_ι, comap_ι, comap_ι, jetDeriv_ι] + exact congrArg (SymmetricAlgebra.ι ℂ _) + (DFunLike.congr_fun (JetComponentSpace.comap_jetDeriv f μ) v) + | mul a b ha hb => simp only [jetDeriv_mul, map_add, map_mul, ha, hb] + | add a b ha hb => simp only [map_add, ha, hb] + +/-- The inclusion of a species commutes with the iterated total derivative. -/ +lemma comap_iteratedJetDeriv (f : V →ₗ[ℂ] W) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : BosonicAlgebra W) : + comap f (iteratedJetDeriv s x) = iteratedJetDeriv s (comap f x) := by + induction s using Multiset.induction_on generalizing x with + | empty => rw [iteratedJetDeriv_zero, LinearMap.id_apply, iteratedJetDeriv_zero, + LinearMap.id_apply] + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, comap_jetDeriv, ih, + iteratedJetDeriv_cons, LinearMap.comp_apply] + +end BosonicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean new file mode 100644 index 000000000..bf3bfc44e --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +/-! +# The Lorentz action on the bosonic algebra + +## i. Overview + +Given a representation of `SL(2,ℂ)` on the target space `V` of a bosonic matter field, the +Lorentz group acts on the bosonic algebra by the symmetric-algebra functor applied to its +action on the jet component space. On a component function `∂_s φ_α` the derivative labels +transform by the Lorentz matrix and the target index contragrediently by `V`. + +The formal total derivative is a Lorentz vector for this action, which is exactly the +content of the class `Lorentz.IsLorentzDeriv`; the instance is registered here, so all the +boost-weight machinery of `Physlib.Relativity.IsLorentzDeriv` applies to the bosonic +algebra of any matter field. + +## ii. Key results + +- `BosonicAlgebra.repLorentzGroup` : the Lorentz action on the bosonic algebra. +- `BosonicAlgebra.repLorentzGroupAlgHom` : the action as an algebra homomorphism. +- `BosonicAlgebra.repLorentzGroup_ofField` : `ofField` is `SL(2,ℂ)`-equivariant. +- `BosonicAlgebra.repLorentzGroup_jetDeriv` : the total derivative is a Lorentz vector. +- `BosonicAlgebra.instIsLorentzDeriv` : the resulting `Lorentz.IsLorentzDeriv` instance. + +## iii. Table of contents + +- A. The action of the Lorentz group + - A.1. Equivariance of the field and its conjugate +- B. Lorentz covariance of the total derivative + +-/ + +@[expose] public section + +namespace StandardModel + +namespace BosonicAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The action of the Lorentz group + +-/ + +/-- **The Lorentz action on the bosonic algebra** of a `V`-valued matter field, induced + from a representation `repV` of `SL(2,ℂ)` on `V`: the symmetric-algebra functor applied + to the Lorentz action on the jet component space. -/ +noncomputable def repLorentzGroup (repV : Representation ℂ SL(2,ℂ) V) : + Representation ℂ SL(2,ℂ) (BosonicAlgebra V) where + toFun Λ := (SymmetricAlgebra.map (JetComponentSpace.repLorentzGroup repV Λ)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, SymmetricAlgebra.map_id, AlgHom.toLinearMap_id] + map_mul' Λ₁ Λ₂ := by + simp only [map_mul, Module.End.mul_eq_comp, ← SymmetricAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repLorentzGroup_apply (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (x : BosonicAlgebra V) : + repLorentzGroup repV Λ x = + SymmetricAlgebra.map (JetComponentSpace.repLorentzGroup repV Λ) x := rfl + +@[simp] +lemma repLorentzGroup_apply_one (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : + repLorentzGroup repV Λ (1 : BosonicAlgebra V) = 1 := by + simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_mul (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (x y : BosonicAlgebra V) : + repLorentzGroup repV Λ (x * y) + = repLorentzGroup repV Λ x * repLorentzGroup repV Λ y := by + simp [repLorentzGroup_apply] + +/-- On a component function the Lorentz action is the action on the component space. -/ +@[simp] +lemma repLorentzGroup_ι (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (v : JetComponentSpace V) : + repLorentzGroup repV Λ (SymmetricAlgebra.ι ℂ _ v) = + SymmetricAlgebra.ι ℂ _ (JetComponentSpace.repLorentzGroup repV Λ v) := by + rw [repLorentzGroup_apply, SymmetricAlgebra.map_apply_ι] + +/-- The Lorentz action as an algebra homomorphism: it preserves the symmetric product, so a + Lorentz transformation acts on a Lagrangian term factor by factor. -/ +noncomputable def repLorentzGroupAlgHom (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : + BosonicAlgebra V →ₐ[ℂ] BosonicAlgebra V where + toFun := repLorentzGroup repV Λ + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repLorentzGroup_apply_one repV Λ + map_mul' := repLorentzGroup_apply_mul repV Λ + commutes' r := by simp [repLorentzGroup_apply] + +/-! + +### A.1. Equivariance of the field and its conjugate + +-/ + +/-- **`ofField` is `SL(2,ℂ)`-equivariant.** The undifferentiated component functions carry + the contragredient of the representation on the target space, and no derivative labels + are generated: `ofField` intertwines `repV.dual` with the action on the bosonic + algebra. -/ +@[simp] +lemma repLorentzGroup_ofField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ V) : + repLorentzGroup repV Λ (ofField φ) = ofField (repV.dual Λ φ) := by + rw [ofField_apply, repLorentzGroup_ι, ofField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repLorentzGroup_fst_tmul, + DerivAlgebraComplex.repLorentzGroup_apply_one] + rfl + · rw [JetComponentSpace.repLorentzGroup_snd] + exact map_zero _ + +/-- **`ofConjField` is `SL(2,ℂ)`-equivariant**, for the conjugate of the representation on + the target space: the conjugate component functions transform by `star` of the spinor + matrix. -/ +@[simp] +lemma repLorentzGroup_ofConjField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ (ConjModule V)) : + repLorentzGroup repV Λ (ofConjField φ) = ofConjField (repV.conj.dual Λ φ) := by + rw [ofConjField_apply, repLorentzGroup_ι, ofConjField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repLorentzGroup_fst] + exact map_zero _ + · rw [JetComponentSpace.repLorentzGroup_snd] + show (DerivAlgebraComplex.repLorentzGroup Λ 1) ⊗ₜ[ℂ] (repV.conj.dual Λ φ) = _ + rw [DerivAlgebraComplex.repLorentzGroup_apply_one] + +/-! + +## B. Lorentz covariance of the total derivative + +-/ + +set_option maxHeartbeats 4000000 in +/-- **The total derivative on the bosonic algebra is a Lorentz vector.** The four + derivations `∂_μ` transform into each other by the columns of the Lorentz matrix of `Λ`, + exactly as the covector index `μ` should. -/ +lemma repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra V) : + repLorentzGroup repV Λ (jetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup repV Λ x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => + rw [jetDeriv_algebraMap, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, repLorentzGroup_ι, repLorentzGroup_ι, + JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + +/-- The total derivatives on the bosonic algebra form a Lorentz derivative, giving access + to the boost-weight machinery of `Physlib.Relativity.IsLorentzDeriv`. -/ +instance instIsLorentzDeriv (repV : Representation ℂ SL(2,ℂ) V) : + Lorentz.IsLorentzDeriv (repLorentzGroup repV) (jetDeriv (V := V)) where + rep_deriv := repLorentzGroup_jetDeriv repV _ _ _ + +end BosonicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean new file mode 100644 index 000000000..ac5c26bf2 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean @@ -0,0 +1,128 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +/-! +# Mass dimension on the bosonic algebra + +## i. Overview + +The mass dimension of a bosonic matter field is tracked multiplicatively through the +*mass-weight scaling*: the algebra endomorphism multiplying each generator `∂_s φ_α` by +`c ^ (w + 2 |s|)`, where `w` is the mass weight of the field — twice its mass dimension, +kept integral so the same machinery serves the fermions of dimension `3/2`. A monomial of +total mass weight `n` is scaled by `c ^ n`, so the scaling records the mass-weight grading +of the algebra, and its interaction with the total derivative says that a derivative +carries mass weight two. + +## ii. Key results + +- `BosonicAlgebra.massWeightScale` : the mass-weight scaling. +- `BosonicAlgebra.massWeightScale_ofField` : the field carries its own mass weight. +- `BosonicAlgebra.massWeightScale_jetDeriv` : a derivative adds mass weight two. +- `BosonicAlgebra.massWeightScale_iteratedJetDeriv` : `∂_s` adds mass weight `2 |s|`. + +## iii. Table of contents + +- A. The mass-weight scaling +- B. The mass weight of the field and its derivatives + +-/ + +@[expose] public section + +namespace StandardModel + +namespace BosonicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The mass-weight scaling + +-/ + +/-- **The mass-weight scaling on the bosonic algebra** of a field of mass weight `w`: + the algebra endomorphism scaling the generator `∂_s φ_α` by `c ^ (w + 2 |s|)`, the + functorial lift of the scaling on the jet component space. -/ +noncomputable def massWeightScale (w : ℕ) (c : ℂ) : BosonicAlgebra V →ₐ[ℂ] BosonicAlgebra V := + SymmetricAlgebra.map (JetComponentSpace.massWeightScale w c) + +@[simp] +lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : + massWeightScale w c (SymmetricAlgebra.ι ℂ _ x) + = SymmetricAlgebra.ι ℂ _ (JetComponentSpace.massWeightScale w c x) := + SymmetricAlgebra.map_apply_ι _ x + +/-! + +## B. The mass weight of the field and its derivatives + +-/ + +/-- The undifferentiated field carries its own mass weight. -/ +@[simp] +lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : + massWeightScale w c (ofField φ) = c ^ w • ofField φ := by + rw [ofField_apply, massWeightScale_ι, ← map_smul] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.massWeightScale_fst] + simp only [TensorProduct.map_tmul, AlgHom.toLinearMap_apply, map_one, + LinearMap.id_apply, Prod.smul_fst, TensorProduct.smul_tmul'] + · rw [JetComponentSpace.massWeightScale_snd] + simp + +/-- The undifferentiated conjugate field carries the same mass weight as the field. -/ +@[simp] +lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule V)) : + massWeightScale w c (ofConjField φ) = c ^ w • ofConjField φ := by + rw [ofConjField_apply, massWeightScale_ι, ← map_smul] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.massWeightScale_fst] + simp + · rw [JetComponentSpace.massWeightScale_snd] + simp only [TensorProduct.map_tmul, AlgHom.toLinearMap_apply, map_one, + LinearMap.id_apply, Prod.smul_snd, TensorProduct.smul_tmul'] + +/-- **A total derivative adds mass weight two**: the scaling intertwines the total + derivative up to a factor `c ^ 2`. -/ +lemma massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra V) : + massWeightScale w c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale w c x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => rw [jetDeriv_algebraMap, map_zero, AlgHom.commutes, jetDeriv_algebraMap, + smul_zero] + | ι v => + rw [jetDeriv_ι, massWeightScale_ι, massWeightScale_ι, jetDeriv_ι, ← map_smul] + exact congrArg (SymmetricAlgebra.ι ℂ _) + (LinearMap.congr_fun (JetComponentSpace.massWeightScale_jetDeriv w c μ) v) + | mul a b ha hb => + simp only [jetDeriv_mul, map_add, map_mul, ha, hb, smul_add, smul_mul_assoc, + mul_smul_comm] + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + +/-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ +lemma massWeightScale_iteratedJetDeriv (w : ℕ) (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : BosonicAlgebra V) : + massWeightScale w c (iteratedJetDeriv s x) + = c ^ (2 * Multiset.card s) • iteratedJetDeriv s (massWeightScale w c x) := by + induction s using Multiset.induction_on generalizing x with + | empty => simp + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, massWeightScale_jetDeriv, ih, + map_smul, LinearMap.comp_apply, smul_smul, ← pow_add] + congr 2 + rw [Multiset.card_cons] + ring + +end BosonicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean new file mode 100644 index 000000000..659faa4ac --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.BosonicAlgebra.Basic +/-! +# The bosonic algebra of a direct sum + +## i. Overview + +Two bosonic matter fields, valued in `V` and `W`, are jointly a single matter field valued +in `V × W`; its bosonic algebra is the **tensor product** of the two individual bosonic +algebras. That is the content of `BosonicAlgebra.prodEquiv`: an algebra equivalence + +`BosonicAlgebra (V × W) ≃ₐ[ℂ] BosonicAlgebra V ⊗[ℂ] BosonicAlgebra W`. + +Unlike the fermionic analogue `FermionicAlgebra.prodEquiv`, the *ordinary* tensor product +suffices: bosonic generators of different species commute, so no grading is needed. + +The proof is two steps. First the component space of a direct sum is the direct sum of the +component spaces (`JetComponentSpace.prodEquiv`). Then the symmetric algebra of a direct +sum is the tensor product of the symmetric algebras, which is +`SymmetricAlgebra.prodEquiv`. + +## ii. Key results + +- `BosonicAlgebra.prodEquiv` : the bosonic algebra of a direct sum is the tensor product + of the bosonic algebras. + +## iii. Table of contents + +- A. The tensor product decomposition + +-/ + +@[expose] public section + +open scoped TensorProduct + +namespace StandardModel + +/-! + +## A. The tensor product decomposition + +-/ + +/-- **The bosonic algebra of a direct sum is the tensor product of the bosonic algebras.** + Two bosonic matter fields taken together are one field valued in the direct sum of their + target spaces, and its bosonic algebra is the tensor product of theirs. The ordinary — + rather than the graded — tensor product is correct here: bosonic generators commute + across species just as they do within one. -/ +noncomputable def BosonicAlgebra.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] : + BosonicAlgebra (V × W) ≃ₐ[ℂ] BosonicAlgebra V ⊗[ℂ] BosonicAlgebra W := + (SymmetricAlgebra.congr (JetComponentSpace.prodEquiv V W)).trans + SymmetricAlgebra.prodEquiv + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean new file mode 100644 index 000000000..640e37d73 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean @@ -0,0 +1,131 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv +/-! +# Mass dimension on the fermionic algebra + +## i. Overview + +The mass dimension of a fermionic matter field is tracked multiplicatively through the +*mass-weight scaling*: the algebra endomorphism multiplying each generator `∂_s ψ_α` by +`c ^ (w + 2 |s|)`, where `w` is the mass weight of the field — twice its mass dimension, +kept integral because a fermion has mass dimension `3/2` and hence mass weight `3`. A +monomial of total mass weight `n` is scaled by `c ^ n`, so the scaling records the +mass-weight grading of the algebra, and its interaction with the total derivative says +that a derivative carries mass weight two. This mirrors +`Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim`. + +## ii. Key results + +- `FermionicAlgebra.massWeightScale` : the mass-weight scaling. +- `FermionicAlgebra.massWeightScale_ofField` : the field carries its own mass weight. +- `FermionicAlgebra.massWeightScale_jetDeriv` : a derivative adds mass weight two. +- `FermionicAlgebra.massWeightScale_iteratedJetDeriv` : `∂_s` adds mass weight `2 |s|`. + +## iii. Table of contents + +- A. The mass-weight scaling +- B. The mass weight of the field and its derivatives + +-/ + +@[expose] public section + +namespace StandardModel + +namespace FermionicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The mass-weight scaling + +-/ + +/-- **The mass-weight scaling on the fermionic algebra** of a field of mass weight `w`: + the algebra endomorphism scaling the generator `∂_s ψ_α` by `c ^ (w + 2 |s|)`, the + functorial lift of the scaling on the jet component space. -/ +noncomputable def massWeightScale (w : ℕ) (c : ℂ) : + FermionicAlgebra V →ₐ[ℂ] FermionicAlgebra V := + ExteriorAlgebra.map (JetComponentSpace.massWeightScale w c) + +@[simp] +lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : + massWeightScale w c (ExteriorAlgebra.ι ℂ x) + = ExteriorAlgebra.ι ℂ (JetComponentSpace.massWeightScale w c x) := by + rw [massWeightScale, ExteriorAlgebra.map_apply_ι] + +/-! + +## B. The mass weight of the field and its derivatives + +-/ + +/-- The undifferentiated field carries its own mass weight. -/ +@[simp] +lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : + massWeightScale w c (ofField φ) = c ^ w • ofField φ := by + rw [ofField_apply, massWeightScale_ι, ← map_smul] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.massWeightScale_fst] + simp only [TensorProduct.map_tmul, AlgHom.toLinearMap_apply, map_one, + LinearMap.id_apply, Prod.smul_fst, TensorProduct.smul_tmul'] + · rw [JetComponentSpace.massWeightScale_snd] + simp + +/-- The undifferentiated conjugate field carries the same mass weight as the field. -/ +@[simp] +lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule V)) : + massWeightScale w c (ofConjField φ) = c ^ w • ofConjField φ := by + rw [ofConjField_apply, massWeightScale_ι, ← map_smul] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.massWeightScale_fst] + simp + · rw [JetComponentSpace.massWeightScale_snd] + simp only [TensorProduct.map_tmul, AlgHom.toLinearMap_apply, map_one, + LinearMap.id_apply, Prod.smul_snd, TensorProduct.smul_tmul'] + +/-- **A total derivative adds mass weight two**: the scaling intertwines the total + derivative up to a factor `c ^ 2`. -/ +lemma massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) + (x : FermionicAlgebra V) : + massWeightScale w c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale w c x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => rw [jetDeriv_algebraMap, map_zero, AlgHom.commutes, jetDeriv_algebraMap, + smul_zero] + | ι v => + rw [jetDeriv_ι, massWeightScale_ι, massWeightScale_ι, jetDeriv_ι, ← map_smul] + exact congrArg (ExteriorAlgebra.ι ℂ) + (LinearMap.congr_fun (JetComponentSpace.massWeightScale_jetDeriv w c μ) v) + | mul a b ha hb => + simp only [jetDeriv_mul, map_add, map_mul, ha, hb, smul_add, smul_mul_assoc, + mul_smul_comm] + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + +/-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ +lemma massWeightScale_iteratedJetDeriv (w : ℕ) (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : FermionicAlgebra V) : + massWeightScale w c (iteratedJetDeriv s x) + = c ^ (2 * Multiset.card s) • iteratedJetDeriv s (massWeightScale w c x) := by + induction s using Multiset.induction_on generalizing x with + | empty => simp + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, massWeightScale_jetDeriv, ih, + map_smul, LinearMap.comp_apply, smul_smul, ← pow_add] + congr 2 + rw [Multiset.card_cons] + ring + +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index b83f7e483..a71cf57d5 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -30,7 +30,6 @@ which is `CliffordAlgebra.prodEquiv` specialized to the zero quadratic form. ## ii. Key results -- `JetComponentSpace.prodEquiv` : the component space of a direct sum splits. - `FermionicAlgebra.evenOdd` : the Fermi-parity grading. - `FermionicAlgebra.prodEquiv` : the fermionic algebra of a direct sum is the exterior product of the fermionic algebras. @@ -61,24 +60,10 @@ variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ## A. The component space of a direct sum --/ +The splitting `JetComponentSpace.prodEquiv` of the component space of a direct sum lives +with the component space itself, in `Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic`. -/-- **The component space of a direct sum splits.** The component functions of a - `(V × W)`-valued field are those of a `V`-valued field together with those of a - `W`-valued field: the dual and the conjugate both distribute over the finite product, and - the derivative label is untouched. -/ -noncomputable def JetComponentSpace.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] - [AddCommGroup W] [Module ℂ W] : - JetComponentSpace (V × W) ≃ₗ[ℂ] JetComponentSpace V × JetComponentSpace W := - (LinearEquiv.prodCongr - (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) - (Module.dualProdDualEquivDual ℂ V W).symm) - (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) - (((ConjModule.prodEquiv (k := ℂ) (M := V) (N := W)).symm.dualMap).trans - (Module.dualProdDualEquivDual ℂ (ConjModule V) (ConjModule W)).symm))).trans <| - (LinearEquiv.prodCongr (TensorProduct.prodRight ℂ ℂ _ _ _) - (TensorProduct.prodRight ℂ ℂ _ _ _)).trans - (LinearEquiv.prodProdProdComm ℂ _ _ _ _) +-/ /-! diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean index 937283152..339a4241e 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv public import Mathlib.LinearAlgebra.Contraction +public import Mathlib.LinearAlgebra.TensorProduct.Prod /-! # The jet component space of a matter field @@ -739,4 +740,112 @@ lemma JetComponentSpace.comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin ← TensorProduct.map_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp] simp only [LinearMap.comp_id, LinearMap.id_comp] +/-! + +## The mass-weight scaling + +The mass dimension is tracked multiplicatively, through a scaling action: for a field of +*mass weight* `w` — twice the mass dimension, kept integral so that fermions of dimension +`3/2` carry weight `3` — the generator `∂_s φ_α` scales by `c ^ (w + 2 |s|)`, one factor +of `c ^ 2` per derivative. The scaling on the component space below lifts functorially to +the bosonic and fermionic algebras, where it defines their mass-dimension grading. + +-/ + +/-- The mass-weight scaling on the jet component space of a field of mass weight `w` + (twice the mass dimension): the generator `∂_s φ_α` and its conjugate are scaled by + `c ^ (w + 2 |s|)`, through the derivative-degree scaling `DerivAlgebraComplex.gradeScale` + on the derivative label. -/ +noncomputable def JetComponentSpace.massWeightScale (w : ℕ) (c : ℂ) : + JetComponentSpace V →ₗ[ℂ] JetComponentSpace V := + c ^ w • LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id) + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id) + +/-- On an unconjugated component function `∂_s φ_α` the mass-weight scaling is + multiplication by `c ^ (w + 2 |s|)`. -/ +lemma JetComponentSpace.massWeightScale_fst_basis_tmul (w : ℕ) (c : ℂ) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.massWeightScale w c + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, y) : JetComponentSpace V)).1 + = c ^ (w + 2 * Multiset.card s) • (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) := by + simp only [massWeightScale, LinearMap.smul_apply, Prod.smul_fst, LinearMap.prodMap_apply, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, DerivAlgebraComplex.gradeScale_basis, + LinearMap.id_apply, TensorProduct.smul_tmul', ← pow_mul, pow_add, mul_smul, + mul_comm 2 (Multiset.card s)] + +@[simp] +lemma JetComponentSpace.massWeightScale_fst (w : ℕ) (c : ℂ) (v : JetComponentSpace V) : + (JetComponentSpace.massWeightScale w c v).1 + = c ^ w • TensorProduct.map + (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id v.1 := rfl + +@[simp] +lemma JetComponentSpace.massWeightScale_snd (w : ℕ) (c : ℂ) (v : JetComponentSpace V) : + (JetComponentSpace.massWeightScale w c v).2 + = c ^ w • TensorProduct.map + (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id v.2 := rfl + +/-- The derivative-degree scaling intertwines multiplication by a single derivative + symbol up to one factor of the scaling parameter, on either half of the component + space. -/ +private lemma gradeScale_map_mulRight_basis {W : Type*} [AddCommGroup W] [Module ℂ W] + (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : DerivAlgebraComplex ⊗[ℂ] W) : + TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id + (TensorProduct.map (LinearMap.mulRight ℂ + (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) LinearMap.id x) + = c ^ 2 • TensorProduct.map (LinearMap.mulRight ℂ + (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) LinearMap.id + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + LinearMap.id x) := by + induction x using TensorProduct.induction_on with + | zero => simp only [map_zero, smul_zero] + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + | tmul a y => + simp only [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, + AlgHom.toLinearMap_apply, map_mul, DerivAlgebraComplex.gradeScale_basis, + Multiset.card_singleton, pow_one, mul_smul_comm, TensorProduct.smul_tmul'] + +/-- **The total derivative carries mass weight two** on the component space: the scaling + intertwines the derivative shift up to a factor `c ^ 2`. -/ +lemma JetComponentSpace.massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : + (JetComponentSpace.massWeightScale (V := V) w c).comp (JetComponentSpace.jetDeriv μ) + = c ^ 2 • (JetComponentSpace.jetDeriv μ).comp + (JetComponentSpace.massWeightScale w c) := by + have key := fun {W : Type _} [AddCommGroup W] [Module ℂ W] + (x : DerivAlgebraComplex ⊗[ℂ] W) => gradeScale_map_mulRight_basis c μ x + refine LinearMap.ext fun v => Prod.ext ?_ ?_ + · simp only [LinearMap.comp_apply, LinearMap.smul_apply, Prod.smul_fst, + JetComponentSpace.massWeightScale_fst, JetComponentSpace.jetDeriv_fst, map_smul] + exact (congrArg (fun z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V => c ^ w • z) + (key v.1)).trans (smul_comm _ _ _) + · simp only [LinearMap.comp_apply, LinearMap.smul_apply, Prod.smul_snd, + JetComponentSpace.massWeightScale_snd, JetComponentSpace.jetDeriv_snd, map_smul] + exact (congrArg (fun z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) => + c ^ w • z) (key v.2)).trans (smul_comm _ _ _) + +/-! + +## The component space of a direct sum + +-/ + +/-- **The component space of a direct sum splits.** The component functions of a + `(V × W)`-valued field are those of a `V`-valued field together with those of a + `W`-valued field: the dual and the conjugate both distribute over the finite product, and + the derivative label is untouched. -/ +noncomputable def JetComponentSpace.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] : + JetComponentSpace (V × W) ≃ₗ[ℂ] JetComponentSpace V × JetComponentSpace W := + (LinearEquiv.prodCongr + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (Module.dualProdDualEquivDual ℂ V W).symm) + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (((ConjModule.prodEquiv (k := ℂ) (M := V) (N := W)).symm.dualMap).trans + (Module.dualProdDualEquivDual ℂ (ConjModule V) (ConjModule W)).symm))).trans <| + (LinearEquiv.prodCongr (TensorProduct.prodRight ℂ ℂ _ _ _) + (TensorProduct.prodRight ℂ ℂ _ _ _)).trans + (LinearEquiv.prodProdProdComm ℂ _ _ _ _) + end StandardModel diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index e34aabf88..e5a148c73 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -111,7 +111,12 @@ lemma iteratedD_mul (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) abel -class IsLorentzDeriv (rep : Representation ℂ SL(2,ℂ) A) (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) where +/-- A family of operators indexed by the spacetime directions is a **Lorentz derivative** + when the representation of `SL(2,ℂ)` intertwines it through the columns of the Lorentz + matrix. The class needs only the module structure, so it applies uniformly to any + representation space. -/ +class IsLorentzDeriv {M : Type} [AddCommMonoid M] [Module ℂ M] + (rep : Representation ℂ SL(2,ℂ) M) (D : (Fin 1 ⊕ Fin 3) → M →ₗ[ℂ] M) where rep_deriv {Λ μ x} : rep Λ (D μ x) = ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • D a (rep Λ x) From 56d3fab01650b13480bf415abbc6386a5b6a08e6 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 21 Aug 2026 05:43:14 +0100 Subject: [PATCH 179/254] refactor: Move results --- Physlib.lean | 3 + .../StandardModel/Fermions/DownSinglet.lean | 3 +- .../StandardModel/Fermions/LeptonDoublet.lean | 2 +- .../StandardModel/Fermions/QuarkDoublet.lean | 2 +- .../StandardModel/Fermions/UpSinglet.lean | 2 +- .../GaugeJetAlgebra/GaugeAction.lean | 2 +- .../Matter/JetComponentSpace/Basic.lean | 2 +- .../JetComponentSpace}/CovariantDeriv.lean | 309 +-------------- .../InfinitesimalAction.lean | 356 ++++++++++++++++++ 9 files changed, 368 insertions(+), 313 deletions(-) rename Physlib/Particles/StandardModel/{GaugeBosons/AlgebraValued => Matter/JetComponentSpace}/CovariantDeriv.lean (69%) create mode 100644 Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean diff --git a/Physlib.lean b/Physlib.lean index 35041102a..f57676d56 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -232,6 +232,7 @@ public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.Potential public import Physlib.Particles.StandardModel.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.Covariance.Basic public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.JetAlgebra.Invariants public import Physlib.Particles.StandardModel.JetAlgebra.JetDeriv @@ -250,6 +251,8 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.LorentzAct public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.InfinitesimalAction public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 863337e45..602d6d9ae 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi @@ -314,7 +314,6 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → -/ - /-! ## The representation of the jet gauge group diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index 6ccef0fe2..29d813884 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean index 28c1f528b..e427e87e9 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.RightHanded public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean index 4982c14b0..350abbd87 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean index 56191e732..3bb1418f6 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic /-! # The gauge action on the gauge-boson jet algebra diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean index 339a4241e..6fc02e221 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Mathlib.LinearAlgebra.Contraction public import Mathlib.LinearAlgebra.TensorProduct.Prod /-! diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean similarity index 69% rename from Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean rename to Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index 61b89422f..d80315b9c 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -47,12 +47,9 @@ case `act = adAction` (the bracket as a bilinear map) literally specializes: `covDerivAction A adAction F D ρ = covDerivAdjoint A F D ρ` holds definitionally (`covDerivAction_adAction`). -The compatibility between `rep` and `act` is the structure `IsInfinitesimalActionOf`: -its two fields are the Leibniz law of the representation coefficients in the -Maurer–Cartan form (`repCoeff_cons`, the analogue of `adjointDualCoeff_cons`) and -the intertwining of `act` by the transports (`repCoeff_act`, the analogue of -`adjointTransport_bracket`). Under it the covariant derivative preserves the gauge -tensors: `TransformsIn.covDerivAction`. +The compatibility between `rep` and `act` — the structure `IsInfinitesimalActionOf` — +and the theorem that under it the covariant derivative preserves the gauge tensors live +in `Physlib.Particles.StandardModel.Matter.JetComponentSpace.InfinitesimalAction`. -/ @@ -228,64 +225,6 @@ def TransformsIn (_hA : IsGaugeField repLorentz repGauge A D D_comm) /-! -## The infinitesimal action underlying a representation - --/ - -/-- `act` is the *infinitesimal action* of the gauge algebra underlying the - representation `rep` of the jet gauge group, when the base-point Taylor - coefficients of `rep` satisfy the two laws forced by `rep` being generated by - `act`: - - * `repCoeff_cons` — the Leibniz rule in the Maurer–Cartan form: differentiating - the representation once produces minus the action of the Maurer–Cartan form, - with the remaining derivatives distributed over the antidiagonal (for the - adjoint representation this is `adjointDualCoeff_cons`); - * `repCoeff_act` — the transports of `rep` intertwine `act` with the adjoint - transports, as an antidiagonal convolution (for the adjoint representation this - is `adjointTransport_bracket`); at `x = 0` it is the classical equivariance - `rep(U)|₀ ∘ act c = act (Ad(U) c)|₀ ∘ rep(U)|₀`. - - These are exactly the identities consumed by the proof that the covariant - derivative `covDerivAction` preserves `TransformsIn`. -/ -structure IsInfinitesimalActionOf (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V) - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) : Prop where - repCoeff_cons : ∀ (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (x : Multiset (Fin 1 ⊕ Fin 3)), - repCoeff rep U (μ ::ₘ x) = - -((x.antidiagonal.map fun p => - act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U μ))) ∘ₗ repCoeff rep U p.2).sum) - repCoeff_act : ∀ (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) - (c : GaugeAlgebra), - repCoeff rep U x ∘ₗ act c = - ((x.antidiagonal.map fun p => - act (adjointCoeff U p.1 c) ∘ₗ repCoeff rep U p.2).sum) - -/-- The dual form of the Leibniz law: the once-more-derived dual coefficient is - minus the antidiagonal convolution of dual coefficients against `act` of the - derived Maurer–Cartan form — the analogue of `adjointDualCoeff_cons`. -/ -lemma IsInfinitesimalActionOf.repDualCoeff_cons - {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} - {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} - (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ V) : - repDualCoeff rep U (μ ::ₘ x) φ = - -((x.antidiagonal.map fun p => - repDualCoeff rep U p.2 (φ ∘ₗ act (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U μ))))).sum) := by - refine LinearMap.ext fun v => ?_ - have h1 := LinearMap.congr_fun (h.repCoeff_cons U μ x) v - simp only [LinearMap.neg_apply, Multiset.sum_linearMap_apply, Multiset.map_map, - Function.comp_apply, LinearMap.coe_comp] at h1 - simp only [repDualCoeff, LinearMap.dualMap_apply, LinearMap.neg_apply, - Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_apply, - LinearMap.coe_comp] - rw [h1, map_neg, map_multiset_sum, Multiset.map_map] - exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => rfl)) - -/-! - ## The covariant derivative through an infinitesimal action -/ @@ -854,248 +793,6 @@ theorem adjoin_iteratedD_eq_adjoin_covDerivIter end Action -/-! - -## The covariant derivative preserves `TransformsIn` - --/ - -section MatterCovariance - -variable {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} -variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} -variable [FiniteDimensional ℝ V] - -/-- The action of families against the dual representation coefficients: the - antidiagonal convolution mixing the adjoint transport on the field slot with the - representation transport on the matter slot — the family-level form of - `IsInfinitesimalActionOf.repCoeff_act`, and the analogue of - `bracketFam_adjointDualCoeff`. -/ -lemma IsInfinitesimalActionOf.actionFam_repDualCoeff - (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) - (x : Multiset (Fin 1 ⊕ Fin 3)) (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (g : Module.Dual ℝ V →ₗ[ℝ] B) (φ : Module.Dual ℝ V) : - actionFam act f g (repDualCoeff rep U x φ) = - (x.antidiagonal.map fun p => - actionFam act (f ∘ₗ adjointDualCoeff U p.1) - (g ∘ₗ repDualCoeff rep U p.2) φ).sum := by - have hT : ∀ (c : GaugeAlgebra) (v : V), repCoeff rep U x (act c v) = - (x.antidiagonal.map fun p => - act (adjointCoeff U p.1 c) (repCoeff rep U p.2 v)).sum := by - intro c v - have h1 := LinearMap.congr_fun (h.repCoeff_act U x c) v - simpa [Multiset.sum_linearMap_apply, Multiset.map_map, LinearMap.coe_comp, - Function.comp_apply] using h1 - rw [show repDualCoeff rep U x = (repCoeff rep U x).dualMap from rfl, - show actionFam act f g ((repCoeff rep U x).dualMap φ) = - dualPairEquivW ((TensorProduct.map LinearMap.id (repCoeff rep U x)) - (tensorAction act (dualPairEquiv.symm f) (dualPairEquivW.symm g))) φ from - (dualPairEquivW_map_right (repCoeff rep U x) _ φ).symm, - ← tensorAction_map_right_antidiagonal act (adjointCoeff U) (repCoeff rep U) x hT, - map_multiset_sum, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - simp only [Function.comp_apply] - rw [← symm_comp_right, ← symm_comp_right_W] - rfl - -omit [FiniteDimensional ℝ V] in -/-- If `F` transforms in `rep`, so do its `κ ::ₘ s`-derived symbols, with the extra - derivative traced through `IsInfinitesimalActionOf.repDualCoeff_cons`: the Leibniz - splittings where `κ` stays a derivative, minus the convolution where `κ` hits the - representation — `act` of the derived Maurer–Cartan form. -/ -lemma TransformsIn.repGauge_iteratedD_cons - {hA : IsGaugeField repLorentz repGauge A D D_comm} - {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) - (hact : IsInfinitesimalActionOf act rep) - (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ V) : - repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (F φ)) = - (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum - - (s.antidiagonal.map fun p => - (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ))))))).sum).sum := by - rw [hF U φ (κ ::ₘ s)] - simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, - Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] - have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 - (F (repDualCoeff rep U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = - -(s.antidiagonal.map fun p => - (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ))))))).sum).sum := by - rw [← Multiset.sum_map_neg''] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [hact.repDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, - Multiset.map_map, map_multiset_sum, Multiset.map_map] - exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) - rw [hsec, sub_eq_add_neg] - -set_option maxHeartbeats 2000000 in -/-- The all-orders gauge transformation of the derived action `A_ρ · F` for `F` - transforming in `rep`: since `F` transforms homogeneously, only one cross-term - convolution through `act` survives — the analogue of - `repGauge_iteratedD_commutator` with a matter field in the second slot. -/ -lemma TransformsIn.repGauge_iteratedD_action - {hA : IsGaugeField repLorentz repGauge A D D_comm} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) - (hact : IsInfinitesimalActionOf act rep) - (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ V) : - repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) = - (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F - (repDualCoeff rep U⁻¹ p.1 φ))).sum - + (s.antidiagonal.map fun p => - (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum := by - have hAlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), - repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A ρ) ψ) = - ((u.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) ψ - + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ ρ)))) := by - intro u ψ - show repGauge U (Lorentz.iteratedD D D_comm u (A ρ ψ)) = _ - rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] - congr 1 - have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ V), - repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ F) ψ) = - ((u.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1).sum) ψ := by - intro u ψ - show repGauge U (Lorentz.iteratedD D D_comm u (F ψ)) = _ - rw [hF U ψ u, Multiset.sum_linearMap_apply, Multiset.map_map] - congr 1 - have hMa : (s.antidiagonal.map fun p => - actionFam act ((p.1.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) - ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1).sum) φ).sum = - (s.antidiagonal.map fun p => - (p.1.antidiagonal.map fun q => - (p.2.antidiagonal.map fun r => - actionFam act ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1) φ).sum).sum).sum := by - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [actionFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, - Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) - simp only [Function.comp_apply] - rw [actionFam_sum_right, Multiset.sum_linearMap_apply, Multiset.map_map, - Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) - simp only [Function.comp_apply] - have hMc : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F - (repDualCoeff rep U⁻¹ p.1 φ))).sum = - (s.antidiagonal.map fun p => - (p.1.antidiagonal.map fun q => - (p.2.antidiagonal.map fun r => - actionFam act ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ q.2) φ).sum).sum).sum := by - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [hact.actionFam_repDualCoeff U⁻¹ p.1 (A ρ) F φ, map_multiset_sum, - Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) - simp only [Function.comp_apply] - rw [iteratedD_actionFam hD p.2 (A ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) - (F ∘ₗ repDualCoeff rep U⁻¹ q.2) φ] - have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => - actionFam act ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ a) - ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ c) φ).trans hMc.symm) - have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), - ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1).sum) - (φ ∘ₗ act (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = - (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum := by - intro p - rw [Multiset.sum_linearMap_apply, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) - simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] - rw [iteratedD_actionFam hD s (A ρ) F φ, map_multiset_sum, Multiset.map_map, - Multiset.map_congr rfl (fun p hp => by - rw [Function.comp_apply, repGauge_actionFam hA U (hAlaw p.1) (hFlaw p.2) φ, - hCg p]), - Multiset.sum_map_add, hM] - -set_option maxHeartbeats 2000000 in -/-- **The covariant derivative preserves `TransformsIn`**: if `F` transforms in the - representation `rep` and `act` is the infinitesimal action underlying `rep`, then - `∇_ρ F = D_ρ F + A_ρ · F` transforms in `rep`. The single inhomogeneous - convolution of `∂_{ρ ::ₘ s} F` cancels the single `act` cross-term convolution of - `A_ρ · F` through the coassociativity of the antidiagonal — the matter-field - analogue of `TransformsInAdjoint.covDerivAdjoint`. -/ -theorem TransformsIn.covDerivAction - {hA : IsGaugeField repLorentz repGauge A D D_comm} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) - (hact : IsInfinitesimalActionOf act rep) (ρ : Fin 1 ⊕ Fin 3) : - hA.TransformsIn rep (covDerivAction A act F D ρ) := by - intro U φ s - have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), - Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by - intro κ t b - rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by - rw [add_comm, Multiset.singleton_add], - Lorentz.iteratedD_add, LinearMap.comp_apply] - congr 1 - have hL : repGauge U (Lorentz.iteratedD D D_comm s - (IsGaugeField.covDerivAction A act F D ρ φ)) = - repGauge U (Lorentz.iteratedD D D_comm (ρ ::ₘ s) (F φ)) - + repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) := by - rw [covDerivAction_apply, map_add, hDcomp ρ s, map_add] - have hR : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (IsGaugeField.covDerivAction A act F D ρ - (repDualCoeff rep U⁻¹ p.1 φ))).sum = - (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (ρ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum - + (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F - (repDualCoeff rep U⁻¹ p.1 φ))).sum := by - rw [← Multiset.sum_map_add] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [covDerivAction_apply, map_add, hDcomp ρ p.2] - have hcancel : (s.antidiagonal.map fun p => - (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum = - (s.antidiagonal.map fun p => - (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum := - Multiset.sum_antidiagonal_assoc s (fun a b c => - Lorentz.iteratedD D D_comm c (F (repDualCoeff rep U⁻¹ b - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv a - (maurerCartanForm U⁻¹ ρ))))))) - rw [hL, hF.repGauge_iteratedD_cons hact U ρ s φ, - hF.repGauge_iteratedD_action hD hact U s ρ φ, hR, hcancel] - abel - -end MatterCovariance end IsGaugeField diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean new file mode 100644 index 000000000..a260df9d8 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean @@ -0,0 +1,356 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +/-! +# The infinitesimal action underlying a matter representation + +## i. Overview + +The covariant derivative `∇_ρ F = D_ρ F + A_ρ · F` of a matter family is built from an +`ℝ`-bilinear action `act` of the gauge algebra on the value space. For the covariant +derivative to transform covariantly, `act` must be the *infinitesimal action* underlying +the representation `rep` of the jet gauge group in which the family transforms — the +physicists' statement that the matrices `i dρ(T^a)` generate `ρ`. This file packages +that compatibility as the structure `IsInfinitesimalActionOf`, and proves the theorem it +exists for: the covariant derivative preserves the gauge tensors, +`TransformsIn.covDerivAction`. + +## ii. Key results + +- `IsGaugeField.IsInfinitesimalActionOf` : `act` is the infinitesimal action underlying + `rep`. +- `IsGaugeField.TransformsIn.covDerivAction` : the covariant derivative preserves + `TransformsIn`. + +## iii. Table of contents + +- A. The infinitesimal action underlying a representation +- B. The covariant derivative preserves `TransformsIn` + +-/ + +@[expose] public section + +namespace StandardModel +open Matrix MatrixGroups TensorProduct MvPowerSeries +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} +variable [Lorentz.IsLorentzDeriv repLorentz D] +variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} + +/-! + +## A. The infinitesimal action underlying a representation + +-/ + +/-- `act` is the *infinitesimal action* of the gauge algebra underlying the + representation `rep` of the jet gauge group, when the base-point Taylor + coefficients of `rep` satisfy the two laws forced by `rep` being generated by + `act`: + + * `repCoeff_cons` — the Leibniz rule in the Maurer–Cartan form: differentiating + the representation once produces minus the action of the Maurer–Cartan form, + with the remaining derivatives distributed over the antidiagonal (for the + adjoint representation this is `adjointDualCoeff_cons`); + * `repCoeff_act` — the transports of `rep` intertwine `act` with the adjoint + transports, as an antidiagonal convolution (for the adjoint representation this + is `adjointTransport_bracket`); at `x = 0` it is the classical equivariance + `rep(U)|₀ ∘ act c = act (Ad(U) c)|₀ ∘ rep(U)|₀`. + + These are exactly the identities consumed by the proof that the covariant + derivative `covDerivAction` preserves `TransformsIn`. -/ +structure IsInfinitesimalActionOf (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V) + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) : Prop where + repCoeff_cons : ∀ (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)), + repCoeff rep U (μ ::ₘ x) = + -((x.antidiagonal.map fun p => + act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) ∘ₗ repCoeff rep U p.2).sum) + repCoeff_act : ∀ (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) + (c : GaugeAlgebra), + repCoeff rep U x ∘ₗ act c = + ((x.antidiagonal.map fun p => + act (adjointCoeff U p.1 c) ∘ₗ repCoeff rep U p.2).sum) + +/-- The dual form of the Leibniz law: the once-more-derived dual coefficient is + minus the antidiagonal convolution of dual coefficients against `act` of the + derived Maurer–Cartan form — the analogue of `adjointDualCoeff_cons`. -/ +lemma IsInfinitesimalActionOf.repDualCoeff_cons + {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ V) : + repDualCoeff rep U (μ ::ₘ x) φ = + -((x.antidiagonal.map fun p => + repDualCoeff rep U p.2 (φ ∘ₗ act (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U μ))))).sum) := by + refine LinearMap.ext fun v => ?_ + have h1 := LinearMap.congr_fun (h.repCoeff_cons U μ x) v + simp only [LinearMap.neg_apply, Multiset.sum_linearMap_apply, Multiset.map_map, + Function.comp_apply, LinearMap.coe_comp] at h1 + simp only [repDualCoeff, LinearMap.dualMap_apply, LinearMap.neg_apply, + Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_apply, + LinearMap.coe_comp] + rw [h1, map_neg, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => rfl)) + +/-! + +## B. The covariant derivative preserves `TransformsIn` + +-/ + +section MatterCovariance + +variable {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} +variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} +variable [FiniteDimensional ℝ V] + +/-- The action of families against the dual representation coefficients: the + antidiagonal convolution mixing the adjoint transport on the field slot with the + representation transport on the matter slot — the family-level form of + `IsInfinitesimalActionOf.repCoeff_act`, and the analogue of + `bracketFam_adjointDualCoeff`. -/ +lemma IsInfinitesimalActionOf.actionFam_repDualCoeff + (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (g : Module.Dual ℝ V →ₗ[ℝ] B) (φ : Module.Dual ℝ V) : + actionFam act f g (repDualCoeff rep U x φ) = + (x.antidiagonal.map fun p => + actionFam act (f ∘ₗ adjointDualCoeff U p.1) + (g ∘ₗ repDualCoeff rep U p.2) φ).sum := by + have hT : ∀ (c : GaugeAlgebra) (v : V), repCoeff rep U x (act c v) = + (x.antidiagonal.map fun p => + act (adjointCoeff U p.1 c) (repCoeff rep U p.2 v)).sum := by + intro c v + have h1 := LinearMap.congr_fun (h.repCoeff_act U x c) v + simpa [Multiset.sum_linearMap_apply, Multiset.map_map, LinearMap.coe_comp, + Function.comp_apply] using h1 + rw [show repDualCoeff rep U x = (repCoeff rep U x).dualMap from rfl, + show actionFam act f g ((repCoeff rep U x).dualMap φ) = + dualPairEquivW ((TensorProduct.map LinearMap.id (repCoeff rep U x)) + (tensorAction act (dualPairEquiv.symm f) (dualPairEquivW.symm g))) φ from + (dualPairEquivW_map_right (repCoeff rep U x) _ φ).symm, + ← tensorAction_map_right_antidiagonal act (adjointCoeff U) (repCoeff rep U) x hT, + map_multiset_sum, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + simp only [Function.comp_apply] + rw [← symm_comp_right, ← symm_comp_right_W] + rfl + +omit [FiniteDimensional ℝ V] in +/-- If `F` transforms in `rep`, so do its `κ ::ₘ s`-derived symbols, with the extra + derivative traced through `IsInfinitesimalActionOf.repDualCoeff_cons`: the Leibniz + splittings where `κ` stays a derivative, minus the convolution where `κ` hits the + representation — `act` of the derived Maurer–Cartan form. -/ +lemma TransformsIn.repGauge_iteratedD_cons + {hA : IsGaugeField repLorentz repGauge A D D_comm} + {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + (hact : IsInfinitesimalActionOf act rep) + (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ V) : + repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + rw [hF U φ (κ ::ₘ s)] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 + (F (repDualCoeff rep U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = + -(s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + rw [← Multiset.sum_map_neg''] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [hact.repDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, + Multiset.map_map, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) + rw [hsec, sub_eq_add_neg] + +set_option maxHeartbeats 2000000 in +/-- The all-orders gauge transformation of the derived action `A_ρ · F` for `F` + transforming in `rep`: since `F` transforms homogeneously, only one cross-term + convolution through `act` survives — the analogue of + `repGauge_iteratedD_commutator` with a matter field in the second slot. -/ +lemma TransformsIn.repGauge_iteratedD_action + {hA : IsGaugeField repLorentz repGauge A D D_comm} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + (hact : IsInfinitesimalActionOf act rep) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ V) : + repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F + (repDualCoeff rep U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum := by + have hAlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), + repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A ρ) ψ) = + ((u.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ ρ)))) := by + intro u ψ + show repGauge U (Lorentz.iteratedD D D_comm u (A ρ ψ)) = _ + rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ V), + repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ F) ψ) = + ((u.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1).sum) ψ := by + intro u ψ + show repGauge U (Lorentz.iteratedD D D_comm u (F ψ)) = _ + rw [hF U ψ u, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + have hMa : (s.antidiagonal.map fun p => + actionFam act ((p.1.antidiagonal.map fun q => + (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1).sum) φ).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + actionFam act ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [actionFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [actionFam_sum_right, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + have hMc : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F + (repDualCoeff rep U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + actionFam act ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ q.1) + ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ q.2) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [hact.actionFam_repDualCoeff U⁻¹ p.1 (A ρ) F φ, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [iteratedD_actionFam hD p.2 (A ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F ∘ₗ repDualCoeff rep U⁻¹ q.2) φ] + have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => + actionFam act ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A ρ ∘ₗ + adjointDualCoeff U⁻¹ a) + ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ c) φ).trans hMc.symm) + have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.2.antidiagonal.map fun r => + (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ + repDualCoeff rep U⁻¹ r.1).sum) + (φ ∘ₗ act (JetGaugeAlgebra.eval + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] + rw [iteratedD_actionFam hD s (A ρ) F φ, map_multiset_sum, Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, repGauge_actionFam hA U (hAlaw p.1) (hFlaw p.2) φ, + hCg p]), + Multiset.sum_map_add, hM] + +set_option maxHeartbeats 2000000 in +/-- **The covariant derivative preserves `TransformsIn`**: if `F` transforms in the + representation `rep` and `act` is the infinitesimal action underlying `rep`, then + `∇_ρ F = D_ρ F + A_ρ · F` transforms in `rep`. The single inhomogeneous + convolution of `∂_{ρ ::ₘ s} F` cancels the single `act` cross-term convolution of + `A_ρ · F` through the coassociativity of the antidiagonal — the matter-field + analogue of `TransformsInAdjoint.covDerivAdjoint`. -/ +theorem TransformsIn.covDerivAction + {hA : IsGaugeField repLorentz repGauge A D D_comm} + (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) + {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + (hact : IsInfinitesimalActionOf act rep) (ρ : Fin 1 ⊕ Fin 3) : + hA.TransformsIn rep (covDerivAction A act F D ρ) := by + intro U φ s + have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), + Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by + intro κ t b + rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by + rw [add_comm, Multiset.singleton_add], + Lorentz.iteratedD_add, LinearMap.comp_apply] + congr 1 + have hL : repGauge U (Lorentz.iteratedD D D_comm s + (IsGaugeField.covDerivAction A act F D ρ φ)) = + repGauge U (Lorentz.iteratedD D D_comm (ρ ::ₘ s) (F φ)) + + repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) := by + rw [covDerivAction_apply, map_add, hDcomp ρ s, map_add] + have hR : (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (IsGaugeField.covDerivAction A act F D ρ + (repDualCoeff rep U⁻¹ p.1 φ))).sum = + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm (ρ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + + (s.antidiagonal.map fun p => + Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F + (repDualCoeff rep U⁻¹ p.1 φ))).sum := by + rw [← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [covDerivAction_apply, map_add, hDcomp ρ p.2] + have hcancel : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U⁻¹ ρ))))))).sum).sum := + Multiset.sum_antidiagonal_assoc s (fun a b c => + Lorentz.iteratedD D D_comm c (F (repDualCoeff rep U⁻¹ b + (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv a + (maurerCartanForm U⁻¹ ρ))))))) + rw [hL, hF.repGauge_iteratedD_cons hact U ρ s φ, + hF.repGauge_iteratedD_action hD hact U s ρ φ, hR, hcancel] + abel + +end MatterCovariance + +end IsGaugeField + +end StandardModel From 984a959f9e41a621ed3356beabbd6919c0ef6026 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 21 Aug 2026 06:52:47 +0100 Subject: [PATCH 180/254] feat: Add Hypercharge Grading --- .../GaugeGroup/HyperchargeGraded.lean | 358 ++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean diff --git a/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean b/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean new file mode 100644 index 000000000..c8cf87409 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean @@ -0,0 +1,358 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.LinearAlgebra.Eigenspace.Basic +public import Mathlib.RingTheory.GradedAlgebra.Basic +public import Mathlib.Analysis.Real.Pi.Irrational +public import Mathlib.Analysis.SpecialFunctions.Complex.Log +/-! +# The hypercharge grading + +## i. Overview + +A representation of the global gauge group on a module has, for each integer `n`, a +**hypercharge weight space**: the vectors scaling by `u ^ n` under the pure `U(1)` +transformations. Charges are normalized as `6Y` throughout. + +On an algebra, the representation is **hypercharge-graded** — `IsHyperchargeGraded` — +when it acts by algebra automorphisms and its weight spaces span. Multiplicativity makes +the weight spaces a graded monoid (weights add under products, the unit is neutral); the +spanning axiom is genuinely extra, since an abstract action of `U(1)` need not be +diagonalizable. Independence of the weight spaces, by contrast, is automatic: each weight +space lies in an eigenspace of the single transformation by `exp i`, whose powers are +pairwise distinct because `π` is irrational. Together these produce the internal direct +sum decomposition, the graded-algebra structure, and the projections onto each charge. + +The charge-zero projection is the projection onto the charge singlets, which every +gauge-invariant element must survive. + +## ii. Key results + +- `GaugeGroupI.ofU1` : the inclusion of the `U(1)` factor of the gauge group. +- `hyperchargeSubmodule` : the weight space of a given hypercharge. +- `IsHyperchargeGraded` : the representation acts by algebra automorphisms and its + weight spaces span. +- `hyperchargeSubmodule_iSupIndep` : the weight spaces are always independent. +- `GradedAlgebra (hyperchargeSubmodule rep)` : the hypercharge grading. +- `hyperchargeProj` : the projection onto a given hypercharge. + +## iii. Table of contents + +- A. The `U(1)` factor of the gauge group +- B. The hypercharge weight spaces + - B.1. Weight spaces under multiplication + - B.2. The span of the weight spaces + - B.3. Tensor products +- C. Hypercharge-graded representations +- D. Independence of the weight spaces +- E. The grading +- F. The hypercharge projections + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. The `U(1)` factor of the gauge group + +-/ + +/-- The inclusion of the `U(1)` factor of the global gauge group: `u ↦ (1, 1, u)`. + + This is the subgroup against which hypercharge is read off. It is not the subgroup + `GaugeGroupI.ofU1Subgroup`, which mixes a weak-isospin rotation into the `SU(2)` + factor to be compatible with the discrete quotients. -/ +def GaugeGroupI.ofU1 : unitary ℂ →* GaugeGroupI where + toFun u := ⟨1, 1, u⟩ + map_one' := rfl + map_mul' u v := by + refine GaugeGroupI.ext ?_ ?_ ?_ <;> simp [GaugeGroupI.toSU3, GaugeGroupI.toSU2, + GaugeGroupI.toU1] + +/-- The underlying complex number of a unitary scalar is nonzero. -/ +lemma unitary_coe_ne_zero (u : unitary ℂ) : ((u : ℂ)) ≠ 0 := fun h0 => by + have h := Unitary.mul_star_self_of_mem u.2 + rw [h0, zero_mul] at h + exact zero_ne_one h + +/-! + +## B. The hypercharge weight spaces + +-/ + +variable {M N : Type*} [AddCommGroup M] [Module ℂ M] [AddCommGroup N] [Module ℂ N] + +/-- The hypercharge-`n` weight space of a representation of the global gauge group: the + vectors scaling by `u ^ n` under the pure `U(1)` transformations. Charges are + normalized as `6Y`. -/ +def hyperchargeSubmodule (rep : Representation ℂ GaugeGroupI M) (n : ℤ) : + Submodule ℂ M where + carrier := {x | ∀ u : unitary ℂ, rep (GaugeGroupI.ofU1 u) x = ((u : ℂ) ^ n) • x} + add_mem' {a b} ha hb := fun u => by rw [map_add, ha u, hb u, smul_add] + zero_mem' := fun u => by rw [map_zero, smul_zero] + smul_mem' c x hx := fun u => by rw [map_smul, hx u, smul_comm] + +lemma mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI M} {n : ℤ} {x : M} : + x ∈ hyperchargeSubmodule rep n + ↔ ∀ u : unitary ℂ, rep (GaugeGroupI.ofU1 u) x = ((u : ℂ) ^ n) • x := Iff.rfl + +/-! + +### B.1. Weight spaces under multiplication + +-/ + +variable {B : Type*} [Ring B] [Algebra ℂ B] + +/-- The unit is a charge singlet, for a unital action of the `U(1)` factor. -/ +lemma one_mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI B} + (h : ∀ u : unitary ℂ, rep (GaugeGroupI.ofU1 u) 1 = 1) : + (1 : B) ∈ hyperchargeSubmodule rep 0 := fun u => by + rw [h u, zpow_zero, one_smul] + +/-- Hypercharges add under multiplication, for a multiplicative action of the `U(1)` + factor. -/ +lemma mul_mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI B} + (h : ∀ (u : unitary ℂ) (x y : B), + rep (GaugeGroupI.ofU1 u) (x * y) + = rep (GaugeGroupI.ofU1 u) x * rep (GaugeGroupI.ofU1 u) y) + {m n : ℤ} {x y : B} (hx : x ∈ hyperchargeSubmodule rep m) + (hy : y ∈ hyperchargeSubmodule rep n) : + x * y ∈ hyperchargeSubmodule rep (m + n) := fun u => by + rw [h u, hx u, hy u, smul_mul_smul_comm, ← zpow_add₀ (unitary_coe_ne_zero u)] + +/-! + +### B.2. The span of the weight spaces + +-/ + +/-- The span of all the hypercharge weight spaces. -/ +def hyperchargeSpan (rep : Representation ℂ GaugeGroupI M) : Submodule ℂ M := + ⨆ n, hyperchargeSubmodule rep n + +lemma mem_hyperchargeSpan_of_mem_hyperchargeSubmodule + {rep : Representation ℂ GaugeGroupI M} {n : ℤ} {x : M} + (h : x ∈ hyperchargeSubmodule rep n) : x ∈ hyperchargeSpan rep := + Submodule.mem_iSup_of_mem n h + +/-- A representation with a spanning family of vectors in the hypercharge span is + graded. -/ +lemma hyperchargeSpan_eq_top_of_span {rep : Representation ℂ GaugeGroupI M} {S : Set M} + (hS : Submodule.span ℂ S = ⊤) (h : ∀ x ∈ S, x ∈ hyperchargeSpan rep) : + hyperchargeSpan rep = ⊤ := + eq_top_iff.mpr (hS ▸ Submodule.span_le.mpr h) + +/-- A representation with a basis of vectors lying in the hypercharge span is graded. -/ +lemma hyperchargeSpan_eq_top_of_basis {ι : Type*} {rep : Representation ℂ GaugeGroupI M} + (b : Module.Basis ι ℂ M) (h : ∀ n, b n ∈ hyperchargeSpan rep) : + hyperchargeSpan rep = ⊤ := + hyperchargeSpan_eq_top_of_span b.span_eq (by rintro _ ⟨n, rfl⟩; exact h n) + +/-! + +### B.3. Tensor products + +-/ + +open TensorProduct in +/-- Hypercharges add under tensor products. -/ +lemma tmul_mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI M} + {rep₂ : Representation ℂ GaugeGroupI N} {a b : ℤ} {x : M} {y : N} + (hx : x ∈ hyperchargeSubmodule rep a) (hy : y ∈ hyperchargeSubmodule rep₂ b) : + x ⊗ₜ[ℂ] y ∈ hyperchargeSubmodule (rep.tprod rep₂) (a + b) := by + intro u + show (TensorProduct.map _ _) _ = _ + rw [TensorProduct.map_tmul, hx u, hy u, TensorProduct.smul_tmul', + TensorProduct.tmul_smul, TensorProduct.smul_tmul', smul_smul, + mul_comm (((u : ℂ)) ^ b), ← zpow_add₀ (unitary_coe_ne_zero u)] + +/-! + +## C. Hypercharge-graded representations + +-/ + +/-- A representation of the global gauge group on an algebra is **hypercharge-graded** + when it acts by algebra automorphisms and its hypercharge weight spaces span. + + Multiplicativity makes the weight spaces a graded monoid; the spanning axiom is the + genuinely extra condition, since an abstract linear action of `U(1)` need not be + diagonalizable. Independence of the weight spaces is automatic + (`hyperchargeSubmodule_iSupIndep`), so together these grade the algebra. -/ +class IsHyperchargeGraded (rep : Representation ℂ GaugeGroupI B) : Prop where + apply_one : ∀ g, rep g 1 = 1 + apply_mul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y + hyperchargeSpan_eq_top : hyperchargeSpan rep = ⊤ + +variable (rep : Representation ℂ GaugeGroupI B) + +/-- The unit is a charge singlet. -/ +lemma one_mem [IsHyperchargeGraded rep] : (1 : B) ∈ hyperchargeSubmodule rep 0 := + one_mem_hyperchargeSubmodule fun u => IsHyperchargeGraded.apply_one (GaugeGroupI.ofU1 u) + +/-- Hypercharges add under multiplication. -/ +lemma mul_mem [IsHyperchargeGraded rep] {m n : ℤ} {x y : B} + (hx : x ∈ hyperchargeSubmodule rep m) (hy : y ∈ hyperchargeSubmodule rep n) : + x * y ∈ hyperchargeSubmodule rep (m + n) := + mul_mem_hyperchargeSubmodule + (fun u => IsHyperchargeGraded.apply_mul (GaugeGroupI.ofU1 u)) hx hy + +instance [IsHyperchargeGraded rep] : SetLike.GradedMonoid (hyperchargeSubmodule rep) where + one_mem := one_mem rep + mul_mem _ _ _ _ hx hy := mul_mem rep hx hy + +/-! + +## D. Independence of the weight spaces + +The weight spaces are independent with no assumption on the representation: each lies in +an eigenspace of the single transformation by `exp i`, and the powers of `exp i` are +pairwise distinct because `π` is irrational. + +-/ + +/-- The unitary scalar `exp i`: a point of the unit circle of infinite order. -/ +noncomputable def expI : unitary ℂ := + ⟨Complex.exp Complex.I, by + have hstar : star (Complex.exp Complex.I) = Complex.exp (-Complex.I) := by + rw [show star (Complex.exp Complex.I) + = (starRingEnd ℂ) (Complex.exp Complex.I) from rfl, ← Complex.exp_conj, + Complex.conj_I] + constructor + · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] + · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero]⟩ + +/-- The powers of `exp i` are pairwise distinct: `exp i` is not a root of unity, by the + irrationality of `π`. -/ +lemma expI_zpow_injective : Function.Injective fun n : ℤ => ((expI : ℂ) ^ n) := by + intro a b hab + simp only [show ((expI : ℂ)) = Complex.exp Complex.I from rfl, + ← Complex.exp_int_mul] at hab + obtain ⟨k, hk⟩ := Complex.exp_eq_exp_iff_exists_int.mp hab + have hℂ : ((a : ℂ)) = b + k * (2 * (Real.pi : ℂ)) := by + refine mul_right_cancel₀ Complex.I_ne_zero ?_ + rw [hk] + ring + have hℝ : ((a : ℝ)) = b + k * (2 * Real.pi) := by + have h := congrArg Complex.re hℂ + simpa using h + rcases eq_or_ne k 0 with rfl | hk0 + · exact_mod_cast (by simpa using hℝ : ((a : ℝ)) = b) + · exfalso + refine irrational_pi ⟨(a - b) / (2 * k), ?_⟩ + have h2k : ((2 * k : ℝ)) ≠ 0 := + mul_ne_zero two_ne_zero (Int.cast_ne_zero.mpr hk0) + push_cast + rw [div_eq_iff h2k] + linarith [hℝ] + +/-- The hypercharge-`n` weight space lies in the `(exp i) ^ n` eigenspace of the + transformation by `exp i`. -/ +lemma hyperchargeSubmodule_le_eigenspace (rep : Representation ℂ GaugeGroupI M) + (n : ℤ) : + hyperchargeSubmodule rep n + ≤ Module.End.eigenspace (rep (GaugeGroupI.ofU1 expI)) ((expI : ℂ) ^ n) := + fun _ hx => Module.End.mem_eigenspace_iff.mpr (hx expI) + +/-- **The hypercharge weight spaces are independent**: a decomposition into homogeneous + parts is unique when it exists. This holds with no assumption on the + representation. -/ +lemma hyperchargeSubmodule_iSupIndep (rep : Representation ℂ GaugeGroupI M) : + iSupIndep (hyperchargeSubmodule rep) := + ((Module.End.eigenspaces_iSupIndep + (rep (GaugeGroupI.ofU1 expI) : Module.End ℂ M)).comp + expI_zpow_injective).mono fun n => hyperchargeSubmodule_le_eigenspace rep n + +/-! + +## E. The grading + +-/ + +/-- **The hypercharge grades the algebra**: the weight spaces of a hypercharge-graded + representation decompose the algebra as an internal direct sum. -/ +theorem hyperchargeSubmodule_isInternal [IsHyperchargeGraded rep] : + DirectSum.IsInternal (hyperchargeSubmodule rep) := + (DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top _).mpr + ⟨hyperchargeSubmodule_iSupIndep rep, + IsHyperchargeGraded.hyperchargeSpan_eq_top⟩ + +/-- The decomposition into hypercharge components. -/ +noncomputable instance [IsHyperchargeGraded rep] : + DirectSum.Decomposition (hyperchargeSubmodule rep) := + (hyperchargeSubmodule_isInternal rep).chooseDecomposition + +/-- **A hypercharge-graded representation is a graded algebra.** -/ +noncomputable instance [IsHyperchargeGraded rep] : + GradedAlgebra (hyperchargeSubmodule rep) where + one_mem := one_mem rep + mul_mem _ _ _ _ hx hy := mul_mem rep hx hy + +/-! + +## F. The hypercharge projections + +-/ + +/-- The projection onto the part of hypercharge `n`, read off from the hypercharge + decomposition. The charge-zero projection `hyperchargeProj rep 0` is the projection + onto the charge singlets. -/ +noncomputable def hyperchargeProj [IsHyperchargeGraded rep] (n : ℤ) : B →ₗ[ℂ] B := + (hyperchargeSubmodule rep n).subtype ∘ₗ + DirectSum.component ℂ ℤ (fun n => (hyperchargeSubmodule rep n : Submodule ℂ B)) n ∘ₗ + (DirectSum.decomposeLinearEquiv (hyperchargeSubmodule rep)).toLinearMap + +variable [IsHyperchargeGraded rep] + +lemma hyperchargeProj_apply (n : ℤ) (x : B) : + hyperchargeProj rep n x + = (DirectSum.decompose (hyperchargeSubmodule rep) x n : B) := rfl + +/-- The projection lands in the hypercharge it projects onto. -/ +lemma hyperchargeProj_mem (n : ℤ) (x : B) : + hyperchargeProj rep n x ∈ hyperchargeSubmodule rep n := + (DirectSum.decompose (hyperchargeSubmodule rep) x n).2 + +/-- On an element of hypercharge `n` the hypercharge-`n` projection is the identity. -/ +@[simp] +lemma hyperchargeProj_of_mem {n : ℤ} {x : B} (hx : x ∈ hyperchargeSubmodule rep n) : + hyperchargeProj rep n x = x := + DirectSum.decompose_of_mem_same _ hx + +/-- On an element of another hypercharge the projection vanishes. -/ +lemma hyperchargeProj_of_mem_ne {n m : ℤ} {x : B} + (hx : x ∈ hyperchargeSubmodule rep m) (hmn : m ≠ n) : + hyperchargeProj rep n x = 0 := + DirectSum.decompose_of_mem_ne _ hx hmn + +/-- An element is of hypercharge `n` exactly when the hypercharge-`n` projection fixes + it. -/ +lemma hyperchargeProj_eq_self_iff {n : ℤ} {x : B} : + hyperchargeProj rep n x = x ↔ x ∈ hyperchargeSubmodule rep n := + ⟨fun h => h ▸ hyperchargeProj_mem rep n x, hyperchargeProj_of_mem rep⟩ + +/-- The projections are idempotent. -/ +@[simp] +lemma hyperchargeProj_hyperchargeProj (n : ℤ) (x : B) : + hyperchargeProj rep n (hyperchargeProj rep n x) = hyperchargeProj rep n x := + hyperchargeProj_of_mem rep (hyperchargeProj_mem rep n x) + +/-- Distinct projections are orthogonal. -/ +lemma hyperchargeProj_hyperchargeProj_of_ne {n m : ℤ} (hmn : m ≠ n) (x : B) : + hyperchargeProj rep n (hyperchargeProj rep m x) = 0 := + hyperchargeProj_of_mem_ne rep (hyperchargeProj_mem rep m x) hmn + +end StandardModel From d514bfea4d0ad76e95a00302f3d1fa03b4ce77a7 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 21 Aug 2026 06:53:19 +0100 Subject: [PATCH 181/254] feat: Add algebra valued Higgs --- .../HiggsBoson/AlgebraValued/Basic.lean | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean new file mode 100644 index 000000000..58727b3ea --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -0,0 +1,54 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.HiggsBoson.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# The algebra valued Higgs boson + +We suppose that we have an equivariant map +under the global gauge group, and the Lorentz group +`H : Module.dual HiggsSpace →ₗ[ℂ] B` +and +`barH : Module.dual (Conj HiggsSpace) →ₗ[ℂ] B` +from the dual of the Higgs space to some algebra `B`. + +We define `IsHiggsAlgebraValued` to be the property that these maps are equivariant under +the gauge group and the Lorentz group, and there images commute with one another. + +We let `higgsSubModule` be the submodule of `B` generated by the images of `H`, +and `barHiggsSubModule` be the submodule of `B` generated by the images of `barH`. + +The algebra `B` carries a grading due to hypercharge, through its representation +of the global gauge group. This grading can be used to eliminate +a large collection of the possible terms in the lagrangian. + +We want to consider invariants within +- `higgsSubModule * barHiggsSubModule` + +We also want to consider derivatives. + +The invariance involving the Higgs fields, up to +mass-dimension 4 are given by: +`H^† D_μ D_μ H`,`H D_μ D_μ H^†`, `D_μ H D_μ H^†`, `H H^†` and `(H^† H)^2`. +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix + + +end StandardModel From 0fdee1814fb281644b531f13ccf6a0cdc14e45e8 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 21 Aug 2026 06:53:30 +0100 Subject: [PATCH 182/254] feat: Add infinitissmal action --- Physlib.lean | 2 +- .../StandardModel/Fermions/DownSinglet.lean | 602 +++++++++++++++++- .../Fermions/JetAlgebra/Basic.lean | 4 + .../StandardModel/JetAlgebra/JetDeriv.lean | 9 + 4 files changed, 615 insertions(+), 2 deletions(-) diff --git a/Physlib.lean b/Physlib.lean index f57676d56..932ce1d0f 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -227,12 +227,12 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDer public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness +public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeGraded public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.Potential public import Physlib.Particles.StandardModel.JetAlgebra.Basic -public import Physlib.Particles.StandardModel.JetAlgebra.Covariance.Basic public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.JetAlgebra.Invariants public import Physlib.Particles.StandardModel.JetAlgebra.JetDeriv diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 602d6d9ae..33fc14b0f 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -8,7 +8,9 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.InfinitesimalAction public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix @@ -39,6 +41,10 @@ Model gauge group. - `mem_repGaugeGroupI_ker_iff_eq` : the kernel of the full-group action. - `gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI` : triviality of the central `ℤ₆`. - `repGaugeGroup` : the action descended to every supported gauge-group quotient. +- `gaugeAlgebraAction` : the infinitesimal `(3, 1)_{-2}` action of the gauge algebra. +- `repJetGaugeGroupI` : the jet gauge action on jets of the down singlet. +- `isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal action + underlying the jet gauge action. ## iii. Table of contents @@ -48,6 +54,9 @@ Model gauge group. - D. Gauge action - E. Kernel of the gauge action - F. Descent to quotient gauge groups +- G. The action of the gauge algebra +- H. The representation of the jet gauge group +- I. The infinitesimal action underlies the jet gauge action -/ @@ -310,10 +319,97 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → /-! -## The action of the Gauge algebra +## The action of the gauge algebra + +The infinitesimal `(3, 1)_{-2}` action of the gauge algebra on the down-type singlet: +the colour part of the algebra element acts on the colour index and the hypercharge +part scales, both through the physicists' factor of `i`, matching the group action +`(star u) ^ 2 • U₃` infinitesimally. The compatibility with the jet gauge action — +`IsGaugeField.IsInfinitesimalActionOf` — is proved at the end of this file. -/ +/-- The endomorphism of the down singlet defined by a `3 × 3` complex matrix acting on + the colour index, with the Weyl factor untouched. -/ +noncomputable def colourEnd (A : Matrix (Fin 3) (Fin 3) ℂ) : + DownSinglet →ₗ[ℂ] DownSinglet := + valLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ valLinEquiv.toLinearMap + +lemma colourEnd_apply_mk (A : Matrix (Fin 3) (Fin 3) ℂ) (v : DownSinglet) : + colourEnd A v + = valLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) (valLinEquiv v)) := rfl + +lemma colourEnd_add (A B : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (A + B) = colourEnd A + colourEnd B := by + rw [colourEnd, colourEnd, colourEnd, map_add, map_add, LinearMap.add_comp, + LinearMap.comp_add] + +lemma colourEnd_smul (z : ℂ) (A : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (z • A) = z • colourEnd A := by + rw [colourEnd, colourEnd, map_smul, map_smul, LinearMap.smul_comp, + LinearMap.comp_smul] + +lemma colourEnd_zero : colourEnd 0 = 0 := by + rw [colourEnd, map_zero, map_zero, LinearMap.zero_comp, LinearMap.comp_zero] + +lemma colourEnd_neg (A : Matrix (Fin 3) (Fin 3) ℂ) : colourEnd (-A) = -colourEnd A := by + rw [show (-A : Matrix (Fin 3) (Fin 3) ℂ) = (-1 : ℂ) • A from by rw [neg_one_smul], + colourEnd_smul, neg_one_smul] + +lemma colourEnd_multiset_sum (m : Multiset (Matrix (Fin 3) (Fin 3) ℂ)) : + colourEnd m.sum = (m.map colourEnd).sum := by + induction m using Multiset.induction_on with + | empty => simp [colourEnd_zero] + | cons A t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + colourEnd_add, ih] + +/-- The colour endomorphisms compose through matrix multiplication. -/ +lemma colourEnd_mul (A B : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (A * B) = colourEnd A ∘ₗ colourEnd B := by + refine LinearMap.ext fun v => ?_ + rw [colourEnd_apply_mk, map_mul, map_mul, LinearMap.comp_apply, colourEnd_apply_mk, + colourEnd_apply_mk, LinearEquiv.apply_symm_apply] + rfl + +/-- The matrix of the infinitesimal `(3, 1)_{-2}` action of a gauge algebra element on + the colour index: `i` times the colour part, shifted by `i` times `-2` the + hypercharge. -/ +noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ := + Complex.I • (c.toSU3Matrix - ((2 : ℂ) • c.toU1Value) • 1) + +/-- **The infinitesimal action of the gauge algebra on the down-type singlet**: the + derivative of the `(3, 1)_{-2}` action of the gauge group, as a real-bilinear action + of the gauge algebra. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℝ] DownSinglet where + toFun c := (colourEnd (actionMatrix c)).restrictScalars ℝ + map_add' c₁ c₂ := by + rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by + rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU3Matrix, + GaugeAlgebra.add_toU1Value] + module] + rw [colourEnd_add] + rfl + map_smul' r c := by + rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by + rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU3Matrix, + GaugeAlgebra.smul_toU1Value, + show (r • c.toSU3Matrix : Matrix (Fin 3) (Fin 3) ℂ) + = (r : ℂ) • c.toSU3Matrix from by + rw [← algebraMap_smul ℂ r c.toSU3Matrix]; rfl, + show r • c.toU1Value = (r : ℂ) • c.toU1Value from by + rw [← algebraMap_smul ℂ r c.toU1Value]; rfl] + module, + colourEnd_smul] + refine LinearMap.ext fun v => ?_ + rw [RingHom.id_apply] + show (r : ℂ) • colourEnd (actionMatrix c) v = r • colourEnd (actionMatrix c) v + rw [show ((r : ℝ) : ℂ) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] + /-! ## The representation of the jet gauge group @@ -506,6 +602,510 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : simp only [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, map_add, ha, hb] +/-! + +## The infinitesimal action underlies the jet gauge action + +The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action underlying the +jet gauge action, in the sense of `IsGaugeField.IsInfinitesimalActionOf`: the base-point +Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and +intertwine the action with the adjoint transports. The proofs work through the colour +matrix of the jet action and the all-orders matrix Leibniz rule at the base point. + +-/ + +section InfinitesimalAction + +open MvPowerSeries + +/-- A single formal derivative commutes with the iterated one. -/ +private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f : JetRing) : + pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) f) + = x.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, ih, JetRing.pderiv_comm] + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) + = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] + +/-- The iterated formal derivative of a difference. -/ +private lemma foldl_pderiv_sub (x : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (f - g) + = x.foldl (fun h ρ => pderiv ℂ ρ h) f - x.foldl (fun h ρ => pderiv ℂ ρ h) g := by + induction x using Multiset.induction_on generalizing f g with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_sub, ih, Multiset.foldl_cons, + Multiset.foldl_cons] + +/-- The jet-valued matrix of the infinitesimal `(3, 1)_{-2}` action of a jet of gauge + algebra elements: the jet analogue of `actionMatrix`. -/ +noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 3) (Fin 3) JetRing := + Complex.I • (a.toSU3Matrix - ((2 : ℂ) • a.toU1Value) • 1) + +/-- The base-point Taylor coefficients of the jet action matrix are the action matrices + of the base-point Taylor coefficients. -/ +lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + ((jetActionMatrix a).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := by + ext i j + rw [Matrix.map_apply, jetActionMatrix, actionMatrix, Matrix.smul_apply, + Matrix.sub_apply, Matrix.smul_apply, Matrix.smul_apply, Matrix.sub_apply, + Matrix.smul_apply, foldl_pderiv_smul, constantCoeff_smul, foldl_pderiv_sub, + map_sub, JetGaugeAlgebra.eval_iteratedDeriv_toSU3Matrix, Matrix.map_apply] + congr 2 + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq, smul_eq_mul, mul_one, smul_eq_mul, + mul_one, foldl_pderiv_smul, constantCoeff_smul, + JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + JetRing.foldl_pderiv_zero, map_zero] + +/-- The `JetRing`-valued colour matrix of the jet gauge action on the down singlet: the + colour matrix of the gauge jet carrying the `-2` hypercharge phase. -/ +noncomputable def downMatrix (U : JetGaugeGroupI) : Matrix (Fin 3) (Fin 3) JetRing := + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + +lemma repJetGaugeGroupI_eq_downMatrix (U : JetGaugeGroupI) + (z : JetRing ⊗[ℂ] DownSinglet) : + repJetGaugeGroupI U z + = jetValLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)).restrictScalars ℂ) + (jetValLinEquiv z)) := rfl + +/-- The entrywise formal derivative on the colour coordinates, as a `ℂ`-linear map. -/ +private noncomputable def pderivColour (μ : Fin 1 ⊕ Fin 3) : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where + toFun v := WithLp.toLp 2 fun i => pderiv ℂ μ (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact Derivation.map_smul _ _ _ + +/-- The entrywise iterated formal derivative on the colour coordinates. -/ +private noncomputable def foldColour (x : Multiset (Fin 1 ⊕ Fin 3)) : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where + toFun v := WithLp.toLp 2 fun i => x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact JetRing.foldl_pderiv_add x _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact foldl_pderiv_smul x z _ + +/-- The entrywise base-point evaluation on the colour coordinates. -/ +private noncomputable def ccColour : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace ℂ (Fin 3) where + toFun v := WithLp.toLp 2 fun i => constantCoeff (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact constantCoeff_smul _ _ + +private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + pderivColour μ ∘ₗ foldColour x = foldColour (μ ::ₘ x) := by + refine LinearMap.ext fun v => ?_ + refine WithLp.ofLp_injective 2 ?_ + funext i + show pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i)) + = (μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + rw [Multiset.foldl_cons, pderiv_foldl] + +/-- The identification of down-singlet jets intertwines the formal derivative with the + entrywise derivative on the colour coordinates. -/ +private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (z : JetRing ⊗[ℂ] DownSinglet) : + jetValLinEquiv (StandardModel.jetDeriv μ z) + = (TensorProduct.map LinearMap.id (pderivColour μ)) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero, + map_zero, map_zero, map_zero] + | tmul ψ c => + rw [show StandardModel.jetDeriv μ (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) from rfl, + show jetValLinEquiv ((pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • pderiv ℂ μ f) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + exact (Derivation.map_smul (pderiv ℂ μ) (c.ofLp i) f).symm + | add a b ha hb => + rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +/-- The identification of down-singlet jets intertwines the iterated formal derivative + with the entrywise iterated derivative on the colour coordinates. -/ +private lemma jetValLinEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] DownSinglet) : + jetValLinEquiv (StandardModel.jetIteratedDeriv x z) + = (TensorProduct.map LinearMap.id (foldColour x)) (jetValLinEquiv z) := by + induction x using Multiset.induction_on with + | empty => + rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, + show foldColour 0 = LinearMap.id from LinearMap.ext fun v => + WithLp.ofLp_injective 2 rfl, + TensorProduct.map_id, LinearMap.id_apply] + | cons μ t ih => + rw [StandardModel.jetIteratedDeriv_cons, LinearMap.comp_apply, + jetValLinEquiv_jetDeriv, ih, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, pderivColour_comp_foldColour] + +/-- The base-point evaluation of a down-singlet jet through the colour coordinates. -/ +private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] DownSinglet) : + valLinEquiv (StandardModel.jetEval z) + = (TensorProduct.map LinearMap.id ccColour) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp; rfl + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rfl + | tmul ψ c => + rw [StandardModel.jetEval_tmul, map_smul, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) = ψ ⊗ₜ[ℂ] c from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply, ← TensorProduct.tmul_smul] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + show (constantCoeff f • c).ofLp i = constantCoeff (c.ofLp i • f) + simp [constantCoeff_smul, mul_comm] + | add a b ha hb => + rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +set_option maxHeartbeats 1000000 in +/-- **The derivative identity** for the colour matrix of the jet gauge action: the + formal derivative of the colour matrix is minus the jet action matrix of the + Maurer–Cartan form times the colour matrix. -/ +lemma downMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (downMatrix U).map (fun f => pderiv ℂ μ f) + = -(jetActionMatrix (maurerCartanForm U μ) * downMatrix U) := by + have hleib : ∀ f g : JetRing, + pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] + have huu : ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + have h0 : pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) = 0 := by + have h := congrArg (pderiv ℂ μ) huu + rw [hleib, Derivation.map_one_eq_zero] at h + exact h + have hsu : pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) + = -(pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * (star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing))) := by + have h1 : star ((U.2.2 : unitary JetRing) : JetRing) + * (pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing))) = 0 := by + rw [h0, mul_zero] + linear_combination h1 + - pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) * huu + have hm₃U₃ : (maurerCartanForm U μ).toSU3Matrix * U.1.1 + = Complex.I • U.1.1.map (pderiv ℂ μ) := by + rw [maurerCartanForm_toSU3Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₃u, + Matrix.mul_one] + have hiC : (algebraMap ℂ JetRing) Complex.I * (algebraMap ℂ JetRing) Complex.I + = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + have hmap : ((((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)).map fun f => pderiv ℂ μ f) + = (pderiv ℂ μ ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2)) • U.1.1 + + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) + • (U.1.1.map (pderiv ℂ μ)) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] + exact hleib _ _ + rw [downMatrix, jetActionMatrix, hmap, Matrix.smul_mul, Matrix.sub_mul, + Matrix.mul_smul, hm₃U₃, Matrix.smul_mul, Matrix.one_mul, + smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) Complex.I, + smul_sub, smul_smul Complex.I Complex.I, Complex.I_mul_I, neg_one_smul, + ← smul_assoc, neg_sub, sub_neg_eq_add, smul_smul] + congr 1 + congr 1 + rw [maurerCartanForm_toU1Value, sq, hleib, hsu, Algebra.smul_def, + Algebra.smul_def, Algebra.smul_def, map_ofNat] + linear_combination (-(2 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing))) * hiC + +/-- **The equivariance identity** for the colour matrix of the jet gauge action: the + colour matrix intertwines the constant jet action matrix with its adjoint + transform. -/ +lemma downMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : + downMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = jetActionMatrix (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c)) + * downMatrix U := by + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rw [downMatrix, jetActionMatrix, jetActionMatrix, + JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.adjointMap_toU1Value] + conv_lhs => rw [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_sub, Matrix.mul_smul, + Matrix.mul_one] + conv_rhs => rw [Matrix.smul_mul, Matrix.sub_mul, Matrix.mul_smul, + Matrix.smul_mul, Matrix.one_mul, Matrix.mul_assoc, hU₃u, Matrix.mul_one] + rw [smul_sub, smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) + ((2 : ℂ) • (JetGaugeAlgebra.ofConstant c).toU1Value)] + +/-- The iterated formal derivative of a negation. -/ +private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) + = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] + +private lemma restrictScalars_multiset_sum + (m : Multiset (DownSinglet →ₗ[ℂ] DownSinglet)) : + LinearMap.restrictScalars ℝ m.sum + = (m.map (LinearMap.restrictScalars ℝ)).sum := by + induction m using Multiset.induction_on with + | empty => rfl + | cons f t ih => + rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, ← ih] + rfl + +set_option maxHeartbeats 1000000 in +/-- **The base-point Taylor coefficients of the jet gauge action** on the down-type + singlet are the colour endomorphisms of the base-point Taylor coefficients of the + colour matrix. -/ +lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff repJetGaugeGroupI U x + = (colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))).restrictScalars ℝ := by + refine LinearMap.ext fun d => ?_ + apply valLinEquiv.injective + rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x d + = StandardModel.jetEval (StandardModel.jetIteratedDeriv x + (repJetGaugeGroupI U (StandardModel.jetOfConstant d))) from rfl, + valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, + show (LinearMap.restrictScalars ℝ (colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) d + = colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) d from rfl, + colourEnd_apply_mk, LinearEquiv.apply_symm_apply, + repJetGaugeGroupI_eq_downMatrix, LinearEquiv.apply_symm_apply, + StandardModel.jetOfConstant_apply] + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rw [show (0 : DownSinglet).val = 0 from rfl, map_zero] + | add a b ha hb => + rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, map_add, map_add, ha, hb, map_add, + map_add] + | tmul ψ c => + rw [show jetValLinEquiv ((1 : JetRing) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing)) from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)).restrictScalars ℂ)) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) from rfl, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) = ψ ⊗ₜ[ℂ] c from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) + Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) (ψ ⊗ₜ[ℂ] c) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext j + show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + (((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j)) + = ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + rw [show ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j + = ∑ k, downMatrix U j k * (c.ofLp k • (1 : JetRing)) from by + simp [Matrix.toLpLin_toLp, Matrix.toLin'_apply, Matrix.mulVec_eq_sum, + Finset.sum_apply, mul_comm], + show ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + = ∑ k, constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (downMatrix U j k)) + * c.ofLp k from by + simp [Matrix.toLpLin_toLp, Matrix.toLin'_apply, Matrix.mulVec_eq_sum, + Finset.sum_apply, mul_comm], + JetRing.foldl_pderiv_sum, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, + mul_comm] + +set_option maxHeartbeats 1000000 in +/-- **The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action + underlying the jet gauge action on the down-type singlet**: its base-point Taylor + coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the + adjoint transports. -/ +theorem isInfinitesimalActionOf : + IsGaugeField.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + constructor + · intro U μ x + have hMcons : ((downMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -((x.antidiagonal.map fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((downMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + rw [show ((downMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (((downMatrix U).map fun f => pderiv ℂ μ f).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.map_apply, Matrix.map_apply, + Multiset.foldl_cons], + downMatrix_map_pderiv, + show ((-(jetActionMatrix (maurerCartanForm U μ) * downMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -(((jetActionMatrix (maurerCartanForm U μ) * downMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.neg_apply, Matrix.neg_apply, + Matrix.map_apply, foldl_pderiv_neg, map_neg], + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [jetActionMatrix_map_cc_foldl])) + rw [repCoeff_eq, hMcons, colourEnd_neg, colourEnd_multiset_sum, Multiset.map_map, + show LinearMap.restrictScalars ℝ + (-((x.antidiagonal.map (colourEnd ∘ fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((downMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f)))).sum)) + = -(LinearMap.restrictScalars ℝ + ((x.antidiagonal.map (colourEnd ∘ fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((downMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f)))).sum)) from + rfl, + restrictScalars_multiset_sum, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => ?_)) + rw [Function.comp_apply, Function.comp_apply, colourEnd_mul, repCoeff_eq] + rfl + · intro U x c + have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + Algebra.algebraMap_self_apply, ← map_mul] + have hconst : jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = (actionMatrix c).map (C : ℂ → JetRing) := by + refine Matrix.ext fun i j => ?_ + rw [jetActionMatrix, actionMatrix, JetGaugeAlgebra.ofConstant_toSU3Matrix, + JetGaugeAlgebra.ofConstant_toU1Value, Matrix.map_apply, Matrix.smul_apply, + Matrix.sub_apply, Matrix.map_apply, Matrix.smul_apply, Matrix.smul_apply, + Matrix.sub_apply, Matrix.smul_apply] + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq] + simp only [smul_eq_mul, mul_one] + rw [hCsmul, ← map_sub, hCsmul] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + sub_zero, sub_zero, hCsmul] + exact congrArg C (by ring) + have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), + (((actionMatrix c).map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then actionMatrix c else 0 := by + intro m + rcases eq_or_ne m 0 with rfl | hm + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, constantCoeff_C] + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] + have hMact : ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c + = (x.antidiagonal.map fun p => + actionMatrix (IsGaugeField.adjointCoeff U p.1 c) + * ((downMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have h1 : ((downMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c := by + rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun p hp => by rw [hcollapse p.2]), + Multiset.sum_antidiagonal_eq_of_snd_ne_zero x + (fun p => ((downMatrix U).map fun f => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if p.2 = 0 then actionMatrix c else 0)) + (fun p hp => by rw [if_neg hp, Matrix.mul_zero]), + if_pos rfl] + rw [← h1, downMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [jetActionMatrix_map_cc_foldl, + show JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) + = IsGaugeField.adjointCoeff U p.1 c from rfl]) + rw [repCoeff_eq, + show ((colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))).restrictScalars ℝ) + ∘ₗ gaugeAlgebraAction c + = (colourEnd (((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c)).restrictScalars ℝ from by + rw [colourEnd_mul]; rfl, + hMact, colourEnd_multiset_sum, Multiset.map_map, restrictScalars_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, Function.comp_apply, colourEnd_mul, repCoeff_eq] + rfl + +end InfinitesimalAction end DownSinglet diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean index f45156512..1c66ecb01 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean @@ -86,6 +86,10 @@ open TensorProduct -/ +TODO "Move FermionSpace to a seperate file by itself." + +TODO "For FermionSpace define the infinitismal action." + /-- The total target space of the Standard Model fermions: the direct sum of three generations each of the lepton doublet, the charged-lepton singlet, the quark doublet, and the up- and down-type quark singlets. The three generations of a species sit together, so diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean index 10fb23697..73e5ef88b 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -270,6 +270,15 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : exact add₃_comp_comm h11 h12 (hWG _ _) h21 h22 (hWG _ _) (hWG _ _).symm (hWG _ _).symm h33 +/-! + +## The iterated derivative + +-/ + +TODO "Define the iterated derivative, and show that the iterated derivatives span + the adjoin to give the whole algebra." + end JetAlgebra end StandardModel From a500ea92e56c78a121e1af35b1f87e3e9d7916ef Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 21 Aug 2026 10:08:14 +0400 Subject: [PATCH 183/254] update JetRing outline with Borel's theorem --- Outline.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Outline.md b/Outline.md index d02c5f5a0..4847e9e61 100644 --- a/Outline.md +++ b/Outline.md @@ -36,8 +36,8 @@ Basic rules of this outline: derivatives appearing below are evaluated. - A local lagrangian evaluated at `x₀` depends on a field only through the values of its derivatives at `x₀`. -- For a complex-valued field `φ`, its infinite formal jet at `x₀` is the collection - of all these derivative values. +- For a smooth complex-valued field `φ`, its infinite formal jet at `x₀` is the + collection of all these derivative values. - The type `Fin 1 ⊕ Fin 3` indexes the four spacetime directions: one temporal direction and three spatial directions. - A multi-index records how many derivatives are taken in each spacetime direction. @@ -56,7 +56,6 @@ Basic rules of this outline: - A formal power series is therefore treated as an arbitrary family of coefficients equipped with algebraic operations, rather than as an infinite sum that must be evaluated. -- In particular, no convergence or analyticity condition is imposed. - Thus an element of `JetRing` records local Taylor data rather than a function defined on all of spacetime. - Here "jet" means a formal Taylor jet at a point and is unrelated to the particle @@ -74,6 +73,20 @@ Basic rules of this outline: indexed by `s` to the value indexed by `s + {μ}`. - The formal partial derivatives on `JetRing` commute, matching the multiset representation of ordinary derivatives introduced above. +- Every smooth complex-valued field `f` determines an element of `JetRing` by taking + its formal Taylor series at `x₀`. +- Borel's theorem states that every element of `JetRing` is the formal Taylor series + at `x₀` of at least one smooth complex-valued field. +- In the notation above, Borel's theorem states: + + `∀ Φ : JetRing, ∃ f ∈ C∞(ℝ⁴, ℂ), ∀ s : Multiset (Fin 1 ⊕ Fin 3), ∂_s f(x₀) = ∂_s| Φ`. + +- No convergence condition is required, so this includes formal Taylor series with + radius of convergence zero. +- Therefore, `JetRing` contains all possible derivative towers of smooth + complex-valued fields at the base point. +- Two fields with the same jet at `x₀` are indistinguishable to a local Lagrangian + evaluated at `x₀`. - Addition in `JetRing` records addition of local Taylor data. - Multiplication in `JetRing` models multiplication of local functions at the level of their Taylor data. From 7ca05ca62e8a49f4392442bd398618ff5b33dfed Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 21 Aug 2026 10:38:45 +0400 Subject: [PATCH 184/254] update todo.md --- todos.md | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/todos.md b/todos.md index 9027027e6..e6ba33187 100644 --- a/todos.md +++ b/todos.md @@ -1,6 +1,6 @@ # TODOs introduced by this branch -20 open · as of 2026-08-16 +21 open · as of 2026-08-21 > Regenerate with `python scripts/todos.py --md todos.md` after adding or > resolving a TODO, and commit it in the same commit. @@ -26,19 +26,32 @@ - Quantize: instantiate the field species of `Physlib.QFT.PerturbationTheory` with the photon and electron of this file, towards the Feynman rules of QED.  [`Lagrangian.lean:125`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/Lagrangian.lean#L125) - Upgrade the mass-weight scaling to a genuine filtration by submodules, following `LeptonGaugeSector.JetAlgebra.MassDim` (`MassWeightLESubmodule`), together with the derivative-order and fermion-parity gradings needed for classification arguments.  [`MassDimension.lean:61`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/QED/MassDimension.lean#L61) +### `Particles/StandardModel/Fermions/JetAlgebra` + +- Move FermionSpace to a seperate file by itself.  [`Basic.lean:89`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean#L89) +- For FermionSpace define the infinitismal action.  [`Basic.lean:91`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean#L91) + +### `Particles/StandardModel/GaugeAlgebra` + +- Make the API here match what is in the doc-string.  [`JetGaugeAlgebra.lean:62`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean#L62) +- Add discussion about the basis.  [`JetGaugeAlgebra.lean:63`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean#L63) +- Define the basis of the jet gauge algebra.  [`JetGaugeAlgebra.lean:727`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean#L727) + ### `Particles/StandardModel/GaugeBosons/BBoson` - Show invariance of the mass weights with repsect to the Lorentz group.  [`MassDim.lean:310`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean#L310) ### `Particles/StandardModel/GaugeGroup` -- Make the API here match what is in the doc-string.  [`JetGaugeAlgebra.lean:50`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L50) -- Add discussion about the basis.  [`JetGaugeAlgebra.lean:51`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L51) -- Define the Lie algebra instance on `JetGaugeAlgebra`.  [`JetGaugeAlgebra.lean:87`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L87) -- Define the basis of the jet gauge algebra.  [`JetGaugeAlgebra.lean:95`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L95) -- Define the adjoint representation of the jet gauge group on the jet gauge algebra.  [`JetGaugeAlgebra.lean:104`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeAlgebra.lean#L104) -- The maurerCartan form should be defined for the whole gauge group, and it should live in the jet Lie algebra.  [`MaurerCartan.lean:50`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean#L50) -- Define the symmetrized maurerCartan forms.  [`MaurerCartan.lean:53`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean#L53) +- Define the symmetrized maurerCartan forms.  [`MaurerCartan.lean:59`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean#L59) + +### `Particles/StandardModel/GaugeGroup/MaurerCartan` + +- The below code needs cleaning up and moving to the correct place.  [`Truncation.lean:135`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean#L135) + +### `Particles/StandardModel/JetAlgebra` + +- Define the iterated derivative, and show that the iterated derivatives span the adjoin to give the whole algebra.  [`JetDeriv.lean:279`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean#L279) ### `Particles/WessZumino/EFTLagrangianExclDeriv` From 68eba1db528e6eaba395011b4c427d61108509c5 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:54:17 +0100 Subject: [PATCH 185/254] feat: Decompositions --- Physlib.lean | 4 +- .../Fermions/LeptonSector/Basic.lean | 15 + .../GaugeGroup/GaugeWeightDecomposition.lean | 447 +++++++++++++ .../GaugeGroup/HyperchargeDecomposition.lean | 173 +++++ .../GaugeGroup/HyperchargeGraded.lean | 358 ----------- .../GaugeGroup/IsospinDecomposition.lean | 183 ++++++ .../GaugeGroup/SU2PermDecomposition.lean | 0 .../HiggsBoson/AlgebraValued/Basic.lean | 593 +++++++++++++++++- 8 files changed, 1411 insertions(+), 362 deletions(-) create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean diff --git a/Physlib.lean b/Physlib.lean index 932ce1d0f..c835d62da 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -227,7 +227,9 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDer public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness -public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeGraded +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean new file mode 100644 index 000000000..4c74b650e --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean @@ -0,0 +1,15 @@ +/-! + +## Lepton sector + +We consider the lepton sector, which consits +of the Lepton doublet and lepton singlet, as well as the higgs. + +We will show in a very general setting, the yukawa terms allowed +in the lepton sector. + +In this file we define: +- The vector Letpon sector vector space, the action of the gauge group on it, + and the Lorentz group. + +-/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean new file mode 100644 index 000000000..f6ea245d5 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -0,0 +1,447 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.IsospinDecomposition +/-! +# Gauge weight decompositions + +## i. Overview + +A **gauge weight decomposition** of a submodule `V` is a finitely supported family of +subspaces of pure gauge weight whose supremum is `V`. A gauge weight is a quadruple + + `(colour₁, colour₂, isospin, hypercharge) : ℤ × ℤ × ℤ × ℤ`, + +the four exponents recording how a vector scales under the four generators of the maximal +torus of `SU(3) × SU(2) × U(1)` — two for the rank-two colour Cartan, one for weak isospin +(normalized as `2T₃`), one for hypercharge (normalized as `6Y`). + +This merges `HyperchargeDecomposition` and `IsospinDecomposition` into a single object, and +adds colour. That merge is legitimate because the four generators *commute*: they live in +different factors of the product group, and the two colour generators are both diagonal. So +the four gradings are simultaneously realizable, and there is no loss in carrying them +together. + +## ii. Independence, and why it is not immediate + +For a single generator, independence of the weight spaces is free: they sit in eigenspaces +of one operator at the pairwise distinct eigenvalues `(exp i) ^ k`. At rank four no single +generator separates the weights, so the argument has to be iterated. `mem_iSup_of_eigenvector` +is the one-generator refinement step — an eigenvector at exponent zero lying in the span of +the pieces already lies in the span of those pieces whose corresponding coordinate vanishes — +and `mem_zero_of_invariant` applies it once per generator, peeling off one coordinate at a +time until only the zero weight survives. + +## iii. Key results + +- `gaugeTorusGen` : the four commuting torus generators. +- `GaugeWeightDecomposition` : a finitely supported family of pure-weight subspaces with + supremum `V`. +- `GaugeWeightDecomposition.sup` : decompositions combine weightwise along `V ⊔ V'`. +- `GaugeWeightDecomposition.mul` : weights add under multiplication, decomposing `V * V'`. +- `GaugeWeightDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the + zero-weight piece. + +## iv. Table of contents + +- A. The colour torus generators +- B. The four torus generators and gauge weights +- C. Gauge weight decompositions +- D. Joins +- E. Products +- F. Invariants + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix Pointwise + +/-! + +## A. The colour torus generators + +-/ + +/-- The first colour torus generator, `diag (exp i, exp (-i), 1)`. -/ +noncomputable def su3ExpIOne : specialUnitaryGroup (Fin 3) ℂ := + ⟨!![(expI : ℂ), 0, 0; 0, star (expI : ℂ), 0; 0, 0, 1], by + have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := + Unitary.mul_star_self_of_mem expI.2 + have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := + Unitary.star_mul_self_of_mem expI.2 + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_three, star_eq_conjTranspose, + Matrix.conjTranspose_apply, hms, hsm] + · simp [Matrix.det_fin_three, hms]⟩ + +/-- The second colour torus generator, `diag (1, exp i, exp (-i))`. -/ +noncomputable def su3ExpITwo : specialUnitaryGroup (Fin 3) ℂ := + ⟨!![1, 0, 0; 0, (expI : ℂ), 0; 0, 0, star (expI : ℂ)], by + have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := + Unitary.mul_star_self_of_mem expI.2 + have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := + Unitary.star_mul_self_of_mem expI.2 + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_three, star_eq_conjTranspose, + Matrix.conjTranspose_apply, hms, hsm] + · simp [Matrix.det_fin_three, hms]⟩ + +/-! + +## B. The four torus generators and gauge weights + +-/ + +/-- The four generators of the maximal torus of the gauge group. They pairwise commute: the + colour, isospin and hypercharge generators sit in different factors of the product, and the + two colour generators are both diagonal. -/ +noncomputable def gaugeTorusGen : Fin 4 → GaugeGroupI := + ![⟨su3ExpIOne, 1, 1⟩, ⟨su3ExpITwo, 1, 1⟩, ⟨1, su2ExpI, 1⟩, ⟨1, 1, expI⟩] + +/-- A **gauge weight**: the four exponents `(colour₁, colour₂, isospin, hypercharge)` + recording how a vector scales under `gaugeTorusGen`. Isospin is normalized as `2T₃` and + hypercharge as `6Y`. -/ +abbrev GaugeWeight : Type := ℤ × ℤ × ℤ × ℤ + +/-- The exponent of a gauge weight against the `i`-th torus generator. -/ +def GaugeWeight.coord (w : GaugeWeight) : Fin 4 → ℤ := ![w.1, w.2.1, w.2.2.1, w.2.2.2] + +@[simp] lemma GaugeWeight.coord_zero (w : GaugeWeight) : w.coord 0 = w.1 := rfl +@[simp] lemma GaugeWeight.coord_one (w : GaugeWeight) : w.coord 1 = w.2.1 := rfl +@[simp] lemma GaugeWeight.coord_two (w : GaugeWeight) : w.coord 2 = w.2.2.1 := rfl +@[simp] lemma GaugeWeight.coord_three (w : GaugeWeight) : w.coord 3 = w.2.2.2 := rfl + +lemma GaugeWeight.coord_add (w w' : GaugeWeight) (i : Fin 4) : + (w + w').coord i = w.coord i + w'.coord i := by + fin_cases i <;> rfl + +/-- `exp i` is nonzero. -/ +lemma expI_ne_zero : ((expI : ℂ)) ≠ 0 := fun h0 => by + have h := Unitary.mul_star_self_of_mem expI.2 + rw [h0, zero_mul] at h + exact zero_ne_one h + +/-! + +## C. Gauge weight decompositions + +-/ + +variable {B : Type*} [Ring B] [Algebra ℂ B] + +/-- A **gauge weight decomposition** of a submodule `V`: a finitely supported family of + subspaces of pure gauge weight whose supremum is `V`. Purity is recorded against the four + commuting torus generators simultaneously. -/ +structure GaugeWeightDecomposition (rep : Representation ℂ GaugeGroupI B) + (V : Submodule ℂ B) where + /-- The piece of gauge weight `w`. -/ + piece : GaugeWeight → Submodule ℂ B + /-- The finite set of gauge weights that occur. -/ + supp : Finset GaugeWeight + /-- Each piece is of pure gauge weight, as seen by all four torus generators. -/ + piece_le : ∀ w, ∀ x, x ∈ piece w → ∀ i, + rep (gaugeTorusGen i) x = ((expI : ℂ) ^ w.coord i) • x + /-- Only the gauge weights in `supp` occur. -/ + piece_eq_bot : ∀ w ∉ supp, piece w = ⊥ + /-- The pieces exhaust `V`. -/ + iSup_piece : (⨆ w, piece w) = V + +namespace GaugeWeightDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} + +/-- The weight-`w` piece lies in the eigenspace of the `i`-th torus generator at the + eigenvalue `(exp i) ^ (w.coord i)`. This is `piece_le` phrased as an inequality of + submodules. -/ +lemma piece_le_eigenspace (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) (i : Fin 4) : + d.piece w ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) ((expI : ℂ) ^ w.coord i) := + fun _ hy => Module.End.mem_eigenspace_iff.mpr (d.piece_le w _ hy i) + +lemma piece_eq_zero_of_not_mem_supp (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) + (hw : w ∉ d.supp) : d.piece w = ⊥ := d.piece_eq_bot w hw + +/-- Transport a decomposition along an equality of submodules. -/ +def copy (d : GaugeWeightDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + GaugeWeightDecomposition rep W where + piece := d.piece + supp := d.supp + piece_le := d.piece_le + piece_eq_bot := d.piece_eq_bot + iSup_piece := by rw [d.iSup_piece, hW] + +@[simp] +lemma copy_piece (d : GaugeWeightDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + (d.copy W hW).piece = d.piece := rfl + +/-! + +## D. Joins + +-/ + +/-- The join of two gauge weight decompositions: the pieces, supports and suprema all + combine weightwise, decomposing `V ⊔ V'`. -/ +noncomputable def sup (d : GaugeWeightDecomposition rep V) + (d' : GaugeWeightDecomposition rep V') : GaugeWeightDecomposition rep (V ⊔ V') where + piece w := d.piece w ⊔ d'.piece w + supp := d.supp ∪ d'.supp + piece_le w x hx i := + Module.End.mem_eigenspace_iff.mp + (sup_le (d.piece_le_eigenspace w i) (d'.piece_le_eigenspace w i) hx) + piece_eq_bot w hw := by + rw [Finset.mem_union, not_or] at hw + rw [d.piece_eq_bot w hw.1, d'.piece_eq_bot w hw.2, bot_sup_eq] + iSup_piece := by + rw [iSup_sup_eq, d.iSup_piece, d'.iSup_piece] + +@[simp] +lemma sup_piece (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') + (w : GaugeWeight) : (d.sup d').piece w = d.piece w ⊔ d'.piece w := rfl + +/-! + +## E. Products + +-/ + +/-- The product of two gauge weight decompositions: gauge weights **add** under + multiplication, so the weight-`w` piece of `V * V'` is spanned by the products of pieces + whose weights sum to `w`, and the support is the pointwise sum of the supports. + + Multiplicativity of the representation is a hypothesis rather than a field: a + `Representation` records only a linear action. -/ +noncomputable def mul (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') : + GaugeWeightDecomposition rep (V * V') where + piece w := ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, d.piece w₁ * d'.piece w₂ + supp := d.supp + d'.supp + piece_le w x hx i := by + have key : (⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, d.piece w₁ * d'.piece w₂) + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) ((expI : ℂ) ^ w.coord i) := by + refine iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_ + refine Submodule.mul_le.mpr fun m hm n hn => ?_ + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [hmul, d.piece_le w₁ m hm i, d'.piece_le w₂ n hn i, smul_mul_smul_comm, + ← zpow_add₀ expI_ne_zero, ← GaugeWeight.coord_add, hw] + exact Module.End.mem_eigenspace_iff.mp (key hx) + piece_eq_bot w hw := by + refine le_antisymm (iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hsum => ?_) bot_le + by_cases h1 : w₁ ∈ d.supp + · by_cases h2 : w₂ ∈ d'.supp + · exact absurd (hsum ▸ Finset.add_mem_add h1 h2) hw + · rw [d'.piece_eq_bot w₂ h2, Submodule.mul_bot] + · rw [d.piece_eq_bot w₁ h1, Submodule.bot_mul] + iSup_piece := by + refine le_antisymm (iSup_le fun w => iSup_le fun w₁ => iSup_le fun w₂ => + iSup_le fun _ => ?_) ?_ + · exact mul_le_mul' ((le_iSup d.piece w₁).trans d.iSup_piece.le) + ((le_iSup d'.piece w₂).trans d'.iSup_piece.le) + · have hV : (⨆ w₁, d.piece w₁) * (⨆ w₂, d'.piece w₂) = V * V' := by + rw [d.iSup_piece, d'.iSup_piece] + rw [← hV, Submodule.iSup_mul] + refine iSup_le fun w₁ => ?_ + rw [Submodule.mul_iSup] + refine iSup_le fun w₂ => ?_ + exact le_iSup_of_le (w₁ + w₂) + (le_iSup_of_le w₁ (le_iSup_of_le w₂ (le_iSup_of_le rfl le_rfl))) + +lemma mul_supp (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') : + (d.mul hmul d').supp = d.supp + d'.supp := rfl + +lemma mul_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') + (w : GaugeWeight) : + (d.mul hmul d').piece w = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, d.piece w₁ * d'.piece w₂ := rfl + +lemma mul_piece_eq_sub (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') + (w : GaugeWeight) : + (d.mul hmul d').piece w = ⨆ w₁ ∈ d.supp, d.piece w₁ * d'.piece (w - w₁) := by + rw [mul_piece] + refine le_antisymm (iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_) ?_ + · by_cases h1 : w₁ ∈ d.supp + · refine le_iSup₂_of_le w₁ h1 ?_ + rw [eq_sub_of_add_eq' hw] + · rw [d.piece_eq_bot w₁ h1, Submodule.bot_mul] + exact bot_le + · exact iSup₂_le fun w₁ _ => + le_iSup_of_le w₁ (le_iSup_of_le (w - w₁) (le_iSup_of_le (add_sub_cancel w₁ w) le_rfl)) + +lemma mul_piece_eq_sub' (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') + (w : GaugeWeight) : + (d.mul hmul d').piece w = ⨆ w₂ ∈ d'.supp, d.piece (w - w₂) * d'.piece w₂ := by + rw [mul_piece] + refine le_antisymm (iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_) ?_ + · by_cases h2 : w₂ ∈ d'.supp + · refine le_iSup₂_of_le w₂ h2 ?_ + rw [eq_sub_of_add_eq hw] + · rw [d'.piece_eq_bot w₂ h2, Submodule.mul_bot] + exact bot_le + · exact iSup₂_le fun w₂ _ => + le_iSup_of_le (w - w₂) (le_iSup_of_le w₂ (le_iSup_of_le (sub_add_cancel w w₂) le_rfl)) + + +/-- The unit submodule is of weight zero: the identity of `B` is a gauge singlet, provided + the representation preserves the unit. -/ +noncomputable def one (hone : ∀ g : GaugeGroupI, rep g 1 = 1) : + GaugeWeightDecomposition rep (1 : Submodule ℂ B) where + piece w := if w = 0 then 1 else ⊥ + supp := {0} + piece_le := by + intro w x hx i + rcases eq_or_ne w 0 with rfl | hw + · rw [if_pos rfl, Submodule.one_eq_span, Submodule.mem_span_singleton] at hx + obtain ⟨c, rfl⟩ := hx + have h0 : GaugeWeight.coord 0 i = 0 := by fin_cases i <;> rfl + rw [map_smul, hone, h0, zpow_zero, one_smul] + · rw [if_neg hw, Submodule.mem_bot] at hx + subst hx + simp + piece_eq_bot w hw := by rw [if_neg (by simpa using hw)] + iSup_piece := by + refine le_antisymm (iSup_le fun w => ?_) (le_iSup_of_le 0 (le_of_eq (if_pos rfl).symm)) + by_cases hw : w = 0 + · rw [if_pos hw] + · rw [if_neg hw] + exact bot_le + +/-- When the right factor vanishes off a finite set `S` of weights, the weight-`w` piece of + a product collapses to a join over `S`, pairing `w - v` against `v`. This is what makes the + pieces of an iterated product computable: the double `⨆` over all of `ℤ⁴` becomes a finite + join. -/ +lemma mul_piece_of_supp (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') + (S : Finset GaugeWeight) (hS : ∀ v ∉ S, d'.piece v = ⊥) (w : GaugeWeight) : + (d.mul hmul d').piece w = ⨆ v ∈ S, d.piece (w - v) * d'.piece v := by + rw [mul_piece] + refine le_antisymm (iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_) ?_ + · by_cases hv : w₂ ∈ S + · refine le_iSup₂_of_le w₂ hv ?_ + rw [eq_sub_of_add_eq hw] + · rw [hS w₂ hv, Submodule.mul_bot] + exact bot_le + · exact iSup₂_le fun v _ => + le_iSup_of_le (w - v) (le_iSup_of_le v (le_iSup_of_le (sub_add_cancel w v) le_rfl)) + +@[simp] +lemma one_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) (w : GaugeWeight) : + (one (B := B) (rep := rep) hone).piece w = if w = 0 then 1 else ⊥ := rfl + +/-- Powers of a decomposed submodule: gauge weights add, so `V ^ k` inherits a + decomposition, built by iterating `mul` from `one`. -/ +noncomputable def pow (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) : + (k : ℕ) → GaugeWeightDecomposition rep (V ^ k) + | 0 => (one hone).copy _ (pow_zero V) + | (k + 1) => ((pow hone hmul d k).mul hmul d).copy _ (pow_succ V k) + +@[simp] +lemma pow_zero_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : + (d.pow hone hmul 0).piece w = if w = 0 then 1 else ⊥ := rfl + +@[simp] +lemma pow_succ_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (k : ℕ) (w : GaugeWeight) : + (d.pow hone hmul (k + 1)).piece w + = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, (d.pow hone hmul k).piece w₁ * d.piece w₂ := rfl + +/-- The `mul_piece_of_supp` collapse, applied to a power: only the weights in `S` that the + decomposition actually carries contribute at each step. -/ +lemma pow_succ_piece_of_supp (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : GaugeWeightDecomposition rep V) (S : Finset GaugeWeight) + (hS : ∀ v ∉ S, d.piece v = ⊥) (k : ℕ) (w : GaugeWeight) : + (d.pow hone hmul (k + 1)).piece w + = ⨆ v ∈ S, (d.pow hone hmul k).piece (w - v) * d.piece v := + mul_piece_of_supp hmul _ d S hS w + +/-! + +## F. Invariants + +-/ + +/-- **The one-generator refinement step.** If a family of subspaces is graded along a single + torus generator — the value of `f` at an index giving the eigenvalue exponent — then a + vector fixed by that generator and lying in the span of the family already lies in the span + of just those pieces on which `f` vanishes. + + This is the whole content of `mem_zero_of_invariant`, applied once per generator. At rank + four no single generator separates the gauge weights, so the coordinates have to be peeled + off one at a time rather than all at once. -/ +lemma mem_iSup_of_fixed {ι : Type*} {T : Module.End ℂ B} {p : ι → Submodule ℂ B} {f : ι → ℤ} + (hp : ∀ j, p j ≤ Module.End.eigenspace T ((expI : ℂ) ^ f j)) + {x : B} (hx : x ∈ ⨆ j, p j) (hT : T x = x) : + x ∈ ⨆ j, ⨆ _ : f j = 0, p j := by + have hQle : ∀ k : ℤ, (⨆ j, ⨆ _ : f j = k, p j) + ≤ Module.End.eigenspace T ((expI : ℂ) ^ k) := + fun k => iSup₂_le fun j hj => hj ▸ hp j + have hQsup : (⨆ k : ℤ, ⨆ j, ⨆ _ : f j = k, p j) = ⨆ j, p j := by + rw [iSup_comm] + exact iSup_congr fun j => + le_antisymm (iSup₂_le fun _ _ => le_rfl) (le_iSup₂_of_le (f j) rfl le_rfl) + have hdisj : Disjoint (Module.End.eigenspace T ((expI : ℂ) ^ (0 : ℤ))) + (⨆ k : ℤ, ⨆ _ : k ≠ (0 : ℤ), ⨆ j, ⨆ _ : f j = k, p j) := + (((Module.End.eigenspaces_iSupIndep T).comp expI_zpow_injective) 0).mono_right + (iSup₂_mono fun k _ => hQle k) + have key : (⨆ k : ℤ, ⨆ j, ⨆ _ : f j = k, p j) + ⊓ Module.End.eigenspace T ((expI : ℂ) ^ (0 : ℤ)) ≤ ⨆ j, ⨆ _ : f j = 0, p j := by + rw [iSup_split_single (fun k : ℤ => ⨆ j, ⨆ _ : f j = k, p j) 0, + sup_inf_assoc_of_le _ (hQle 0)] + exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) + refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ + · rw [hQsup] + exact hx + · rw [zpow_zero, one_smul] + exact hT + +/-- **A gauge-invariant element sits in the zero-weight piece.** Only invariance under the + four torus generators is used. -/ +lemma mem_zero_of_invariant (d : GaugeWeightDecomposition rep V) {x : B} (hx : x ∈ V) + (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ d.piece 0 := by + have s0 : x ∈ ⨆ w, d.piece w := by rw [d.iSup_piece]; exact hx + have s1 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 0) + (fun w => d.piece_le_eigenspace w 0) s0 (hV _) + have s2 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 1) + (fun w => iSup_le fun _ => d.piece_le_eigenspace w 1) s1 (hV _) + have s3 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 2) + (fun w => iSup_le fun _ => iSup_le fun _ => d.piece_le_eigenspace w 2) s2 (hV _) + have s4 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 3) + (fun w => iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => + d.piece_le_eigenspace w 3) s3 (hV _) + have hfin : ∀ w : GaugeWeight, (⨆ _ : w.coord 3 = 0, ⨆ _ : w.coord 2 = 0, + ⨆ _ : w.coord 1 = 0, ⨆ _ : w.coord 0 = 0, d.piece w) ≤ d.piece 0 := by + rintro ⟨a, b, c, e⟩ + refine iSup_le fun h3 => iSup_le fun h2 => iSup_le fun h1 => iSup_le fun h0 => ?_ + simp only [GaugeWeight.coord_zero, GaugeWeight.coord_one, GaugeWeight.coord_two, + GaugeWeight.coord_three] at h0 h1 h2 h3 + subst h0 + subst h1 + subst h2 + subst h3 + exact le_rfl + exact iSup_le hfin s4 + +end GaugeWeightDecomposition +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean new file mode 100644 index 000000000..4ef18c68c --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean @@ -0,0 +1,173 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.LinearAlgebra.Eigenspace.Basic +public import Mathlib.Analysis.Real.Pi.Irrational +public import Mathlib.Analysis.SpecialFunctions.Complex.Log +/-! +# Hypercharge decompositions + +## i. Overview + +A **hypercharge decomposition** of a submodule `V` is a finitely supported family of +subspaces of pure hypercharge whose supremum is `V`. Charges are normalized as `6Y`. + +Purity is recorded against a *single* group element, the transformation by `exp i`: the +hypercharge-`k` piece consists of the vectors scaled by `(exp i) ^ k`. That is already +enough to make the pieces independent, with no assumption on the representation, because +`exp i` is not a root of unity — the powers `(exp i) ^ k` are pairwise distinct by the +irrationality of `π`, so the pieces sit in eigenspaces of one operator at pairwise +distinct eigenvalues. + +Exhibiting a decomposition therefore collapses the per-span boilerplate. The chief +consequence is that a gauge-invariant element of `V` lies in the hypercharge-zero piece; +only invariance under the transformation by `exp i` is used. + +## ii. Key results + +- `expI` : the unitary scalar `exp i`, a point of the unit circle of infinite order. +- `expI_zpow_injective` : the powers of `exp i` are pairwise distinct. +- `HyperchargeDecomposition` : a finitely supported family of pure-hypercharge subspaces + with supremum `V`. +- `HyperchargeDecomposition.sup` : two decompositions combine weightwise into one of + `V ⊔ V'`. +- `HyperchargeDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the + hypercharge-zero piece. + +## iii. Table of contents + +- A. The transformation by `exp i` +- B. Hypercharge decompositions +- C. Invariants + +-/ + +@[expose] public section + +namespace StandardModel + +/-! + +## A. The transformation by `exp i` + +-/ + +/-- The unitary scalar `exp i`: a point of the unit circle of infinite order. -/ +noncomputable def expI : unitary ℂ := + ⟨Complex.exp Complex.I, by + have hstar : star (Complex.exp Complex.I) = Complex.exp (-Complex.I) := by + rw [show star (Complex.exp Complex.I) + = (starRingEnd ℂ) (Complex.exp Complex.I) from rfl, ← Complex.exp_conj, + Complex.conj_I] + constructor + · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] + · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero]⟩ + +/-- The powers of `exp i` are pairwise distinct: `exp i` is not a root of unity, by the + irrationality of `π`. -/ +lemma expI_zpow_injective : Function.Injective fun n : ℤ => ((expI : ℂ) ^ n) := by + intro a b hab + simp only [show ((expI : ℂ)) = Complex.exp Complex.I from rfl, + ← Complex.exp_int_mul] at hab + obtain ⟨k, hk⟩ := Complex.exp_eq_exp_iff_exists_int.mp hab + have hℂ : ((a : ℂ)) = b + k * (2 * (Real.pi : ℂ)) := by + refine mul_right_cancel₀ Complex.I_ne_zero ?_ + rw [hk] + ring + have hℝ : ((a : ℝ)) = b + k * (2 * Real.pi) := by + have h := congrArg Complex.re hℂ + simpa using h + rcases eq_or_ne k 0 with rfl | hk0 + · exact_mod_cast (by simpa using hℝ : ((a : ℝ)) = b) + · exfalso + refine irrational_pi ⟨(a - b) / (2 * k), ?_⟩ + have h2k : ((2 * k : ℝ)) ≠ 0 := + mul_ne_zero two_ne_zero (Int.cast_ne_zero.mpr hk0) + push_cast + rw [div_eq_iff h2k] + linarith [hℝ] + +/-! + +## B. Hypercharge decompositions + +-/ + +variable {B : Type*} [Ring B] [Algebra ℂ B] + +/-- A **hypercharge decomposition** of a submodule `V`: a finitely supported family of + subspaces of pure hypercharge whose supremum is `V`. Purity is recorded against the + single transformation by `exp i`, which is enough to force the pieces to be + independent. -/ +structure HyperchargeDecomposition (rep : Representation ℂ GaugeGroupI B) + (V : Submodule ℂ B) where + /-- The hypercharge `k` piece of the decomposition. -/ + piece : ℤ → Submodule ℂ B + /-- The finite set of hypercharges that occur. -/ + supp : Finset ℤ + /-- Each piece is of pure hypercharge, as seen by the transformation by `exp i`. -/ + piece_le : ∀ k, ∀ x, x ∈ piece k → rep ⟨1, 1, expI⟩ x = ((expI : ℂ) ^ k) • x + /-- Only the hypercharges in `supp` occur. -/ + piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ + /-- The pieces exhaust `V`. -/ + iSup_piece : (⨆ k, piece k) = V + +namespace HyperchargeDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} + +/-- The hypercharge-`k` piece lies in the `(exp i) ^ k` eigenspace of the transformation + by `exp i`. This is `piece_le` phrased as an inequality of submodules. -/ +lemma piece_le_eigenspace (h : HyperchargeDecomposition rep V) (k : ℤ) : + h.piece k ≤ Module.End.eigenspace (rep ⟨1, 1, expI⟩) ((expI : ℂ) ^ k) := + fun _ hy => Module.End.mem_eigenspace_iff.mpr (h.piece_le k _ hy) + +/-- The join of two hypercharge decompositions: the pieces, supports and suprema all + combine weightwise, decomposing `V ⊔ V'`. -/ +noncomputable def sup (h : HyperchargeDecomposition rep V) (h' : HyperchargeDecomposition rep V') : + HyperchargeDecomposition rep (V ⊔ V') where + piece k := h.piece k ⊔ h'.piece k + supp := h.supp ∪ h'.supp + piece_le k x hx := + Module.End.mem_eigenspace_iff.mp + (sup_le (h.piece_le_eigenspace k) (h'.piece_le_eigenspace k) hx) + piece_eq_bot k hk := by + rw [Finset.mem_union, not_or] at hk + rw [h.piece_eq_bot k hk.1, h'.piece_eq_bot k hk.2, bot_sup_eq] + iSup_piece := by + rw [iSup_sup_eq, h.iSup_piece, h'.iSup_piece] + +/-! + +## C. Invariants + +-/ + +/-- **A gauge-invariant element sits in the hypercharge-zero piece.** Only invariance + under the single `U(1)` transformation by `exp i` is used: the other pieces lie in + eigenspaces for the eigenvalues `(exp i) ^ k`, all distinct from `1`. -/ +lemma mem_zero_of_invariant (h : HyperchargeDecomposition rep V) {x : B} (hx : x ∈ V) + (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ h.piece 0 := by + have hdisj : Disjoint + (Module.End.eigenspace (rep ⟨1, 1, expI⟩) ((expI : ℂ) ^ (0 : ℤ))) + (⨆ k, ⨆ _ : k ≠ (0 : ℤ), h.piece k) := + (((Module.End.eigenspaces_iSupIndep (rep ⟨1, 1, expI⟩ : Module.End ℂ B)).comp + expI_zpow_injective) 0).mono_right (iSup₂_mono fun k _ => h.piece_le_eigenspace k) + have key : (⨆ k, h.piece k) + ⊓ Module.End.eigenspace (rep ⟨1, 1, expI⟩) ((expI : ℂ) ^ (0 : ℤ)) ≤ h.piece 0 := by + rw [iSup_split_single h.piece 0, sup_inf_assoc_of_le _ (h.piece_le_eigenspace 0)] + exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) + refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ + · rw [h.iSup_piece] + exact hx + · rw [zpow_zero, one_smul] + exact hV _ + +end HyperchargeDecomposition +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean b/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean deleted file mode 100644 index c8cf87409..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeGraded.lean +++ /dev/null @@ -1,358 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Mathlib.RepresentationTheory.Basic -public import Mathlib.LinearAlgebra.Eigenspace.Basic -public import Mathlib.RingTheory.GradedAlgebra.Basic -public import Mathlib.Analysis.Real.Pi.Irrational -public import Mathlib.Analysis.SpecialFunctions.Complex.Log -/-! -# The hypercharge grading - -## i. Overview - -A representation of the global gauge group on a module has, for each integer `n`, a -**hypercharge weight space**: the vectors scaling by `u ^ n` under the pure `U(1)` -transformations. Charges are normalized as `6Y` throughout. - -On an algebra, the representation is **hypercharge-graded** — `IsHyperchargeGraded` — -when it acts by algebra automorphisms and its weight spaces span. Multiplicativity makes -the weight spaces a graded monoid (weights add under products, the unit is neutral); the -spanning axiom is genuinely extra, since an abstract action of `U(1)` need not be -diagonalizable. Independence of the weight spaces, by contrast, is automatic: each weight -space lies in an eigenspace of the single transformation by `exp i`, whose powers are -pairwise distinct because `π` is irrational. Together these produce the internal direct -sum decomposition, the graded-algebra structure, and the projections onto each charge. - -The charge-zero projection is the projection onto the charge singlets, which every -gauge-invariant element must survive. - -## ii. Key results - -- `GaugeGroupI.ofU1` : the inclusion of the `U(1)` factor of the gauge group. -- `hyperchargeSubmodule` : the weight space of a given hypercharge. -- `IsHyperchargeGraded` : the representation acts by algebra automorphisms and its - weight spaces span. -- `hyperchargeSubmodule_iSupIndep` : the weight spaces are always independent. -- `GradedAlgebra (hyperchargeSubmodule rep)` : the hypercharge grading. -- `hyperchargeProj` : the projection onto a given hypercharge. - -## iii. Table of contents - -- A. The `U(1)` factor of the gauge group -- B. The hypercharge weight spaces - - B.1. Weight spaces under multiplication - - B.2. The span of the weight spaces - - B.3. Tensor products -- C. Hypercharge-graded representations -- D. Independence of the weight spaces -- E. The grading -- F. The hypercharge projections - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix - -/-! - -## A. The `U(1)` factor of the gauge group - --/ - -/-- The inclusion of the `U(1)` factor of the global gauge group: `u ↦ (1, 1, u)`. - - This is the subgroup against which hypercharge is read off. It is not the subgroup - `GaugeGroupI.ofU1Subgroup`, which mixes a weak-isospin rotation into the `SU(2)` - factor to be compatible with the discrete quotients. -/ -def GaugeGroupI.ofU1 : unitary ℂ →* GaugeGroupI where - toFun u := ⟨1, 1, u⟩ - map_one' := rfl - map_mul' u v := by - refine GaugeGroupI.ext ?_ ?_ ?_ <;> simp [GaugeGroupI.toSU3, GaugeGroupI.toSU2, - GaugeGroupI.toU1] - -/-- The underlying complex number of a unitary scalar is nonzero. -/ -lemma unitary_coe_ne_zero (u : unitary ℂ) : ((u : ℂ)) ≠ 0 := fun h0 => by - have h := Unitary.mul_star_self_of_mem u.2 - rw [h0, zero_mul] at h - exact zero_ne_one h - -/-! - -## B. The hypercharge weight spaces - --/ - -variable {M N : Type*} [AddCommGroup M] [Module ℂ M] [AddCommGroup N] [Module ℂ N] - -/-- The hypercharge-`n` weight space of a representation of the global gauge group: the - vectors scaling by `u ^ n` under the pure `U(1)` transformations. Charges are - normalized as `6Y`. -/ -def hyperchargeSubmodule (rep : Representation ℂ GaugeGroupI M) (n : ℤ) : - Submodule ℂ M where - carrier := {x | ∀ u : unitary ℂ, rep (GaugeGroupI.ofU1 u) x = ((u : ℂ) ^ n) • x} - add_mem' {a b} ha hb := fun u => by rw [map_add, ha u, hb u, smul_add] - zero_mem' := fun u => by rw [map_zero, smul_zero] - smul_mem' c x hx := fun u => by rw [map_smul, hx u, smul_comm] - -lemma mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI M} {n : ℤ} {x : M} : - x ∈ hyperchargeSubmodule rep n - ↔ ∀ u : unitary ℂ, rep (GaugeGroupI.ofU1 u) x = ((u : ℂ) ^ n) • x := Iff.rfl - -/-! - -### B.1. Weight spaces under multiplication - --/ - -variable {B : Type*} [Ring B] [Algebra ℂ B] - -/-- The unit is a charge singlet, for a unital action of the `U(1)` factor. -/ -lemma one_mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI B} - (h : ∀ u : unitary ℂ, rep (GaugeGroupI.ofU1 u) 1 = 1) : - (1 : B) ∈ hyperchargeSubmodule rep 0 := fun u => by - rw [h u, zpow_zero, one_smul] - -/-- Hypercharges add under multiplication, for a multiplicative action of the `U(1)` - factor. -/ -lemma mul_mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI B} - (h : ∀ (u : unitary ℂ) (x y : B), - rep (GaugeGroupI.ofU1 u) (x * y) - = rep (GaugeGroupI.ofU1 u) x * rep (GaugeGroupI.ofU1 u) y) - {m n : ℤ} {x y : B} (hx : x ∈ hyperchargeSubmodule rep m) - (hy : y ∈ hyperchargeSubmodule rep n) : - x * y ∈ hyperchargeSubmodule rep (m + n) := fun u => by - rw [h u, hx u, hy u, smul_mul_smul_comm, ← zpow_add₀ (unitary_coe_ne_zero u)] - -/-! - -### B.2. The span of the weight spaces - --/ - -/-- The span of all the hypercharge weight spaces. -/ -def hyperchargeSpan (rep : Representation ℂ GaugeGroupI M) : Submodule ℂ M := - ⨆ n, hyperchargeSubmodule rep n - -lemma mem_hyperchargeSpan_of_mem_hyperchargeSubmodule - {rep : Representation ℂ GaugeGroupI M} {n : ℤ} {x : M} - (h : x ∈ hyperchargeSubmodule rep n) : x ∈ hyperchargeSpan rep := - Submodule.mem_iSup_of_mem n h - -/-- A representation with a spanning family of vectors in the hypercharge span is - graded. -/ -lemma hyperchargeSpan_eq_top_of_span {rep : Representation ℂ GaugeGroupI M} {S : Set M} - (hS : Submodule.span ℂ S = ⊤) (h : ∀ x ∈ S, x ∈ hyperchargeSpan rep) : - hyperchargeSpan rep = ⊤ := - eq_top_iff.mpr (hS ▸ Submodule.span_le.mpr h) - -/-- A representation with a basis of vectors lying in the hypercharge span is graded. -/ -lemma hyperchargeSpan_eq_top_of_basis {ι : Type*} {rep : Representation ℂ GaugeGroupI M} - (b : Module.Basis ι ℂ M) (h : ∀ n, b n ∈ hyperchargeSpan rep) : - hyperchargeSpan rep = ⊤ := - hyperchargeSpan_eq_top_of_span b.span_eq (by rintro _ ⟨n, rfl⟩; exact h n) - -/-! - -### B.3. Tensor products - --/ - -open TensorProduct in -/-- Hypercharges add under tensor products. -/ -lemma tmul_mem_hyperchargeSubmodule {rep : Representation ℂ GaugeGroupI M} - {rep₂ : Representation ℂ GaugeGroupI N} {a b : ℤ} {x : M} {y : N} - (hx : x ∈ hyperchargeSubmodule rep a) (hy : y ∈ hyperchargeSubmodule rep₂ b) : - x ⊗ₜ[ℂ] y ∈ hyperchargeSubmodule (rep.tprod rep₂) (a + b) := by - intro u - show (TensorProduct.map _ _) _ = _ - rw [TensorProduct.map_tmul, hx u, hy u, TensorProduct.smul_tmul', - TensorProduct.tmul_smul, TensorProduct.smul_tmul', smul_smul, - mul_comm (((u : ℂ)) ^ b), ← zpow_add₀ (unitary_coe_ne_zero u)] - -/-! - -## C. Hypercharge-graded representations - --/ - -/-- A representation of the global gauge group on an algebra is **hypercharge-graded** - when it acts by algebra automorphisms and its hypercharge weight spaces span. - - Multiplicativity makes the weight spaces a graded monoid; the spanning axiom is the - genuinely extra condition, since an abstract linear action of `U(1)` need not be - diagonalizable. Independence of the weight spaces is automatic - (`hyperchargeSubmodule_iSupIndep`), so together these grade the algebra. -/ -class IsHyperchargeGraded (rep : Representation ℂ GaugeGroupI B) : Prop where - apply_one : ∀ g, rep g 1 = 1 - apply_mul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y - hyperchargeSpan_eq_top : hyperchargeSpan rep = ⊤ - -variable (rep : Representation ℂ GaugeGroupI B) - -/-- The unit is a charge singlet. -/ -lemma one_mem [IsHyperchargeGraded rep] : (1 : B) ∈ hyperchargeSubmodule rep 0 := - one_mem_hyperchargeSubmodule fun u => IsHyperchargeGraded.apply_one (GaugeGroupI.ofU1 u) - -/-- Hypercharges add under multiplication. -/ -lemma mul_mem [IsHyperchargeGraded rep] {m n : ℤ} {x y : B} - (hx : x ∈ hyperchargeSubmodule rep m) (hy : y ∈ hyperchargeSubmodule rep n) : - x * y ∈ hyperchargeSubmodule rep (m + n) := - mul_mem_hyperchargeSubmodule - (fun u => IsHyperchargeGraded.apply_mul (GaugeGroupI.ofU1 u)) hx hy - -instance [IsHyperchargeGraded rep] : SetLike.GradedMonoid (hyperchargeSubmodule rep) where - one_mem := one_mem rep - mul_mem _ _ _ _ hx hy := mul_mem rep hx hy - -/-! - -## D. Independence of the weight spaces - -The weight spaces are independent with no assumption on the representation: each lies in -an eigenspace of the single transformation by `exp i`, and the powers of `exp i` are -pairwise distinct because `π` is irrational. - --/ - -/-- The unitary scalar `exp i`: a point of the unit circle of infinite order. -/ -noncomputable def expI : unitary ℂ := - ⟨Complex.exp Complex.I, by - have hstar : star (Complex.exp Complex.I) = Complex.exp (-Complex.I) := by - rw [show star (Complex.exp Complex.I) - = (starRingEnd ℂ) (Complex.exp Complex.I) from rfl, ← Complex.exp_conj, - Complex.conj_I] - constructor - · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] - · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero]⟩ - -/-- The powers of `exp i` are pairwise distinct: `exp i` is not a root of unity, by the - irrationality of `π`. -/ -lemma expI_zpow_injective : Function.Injective fun n : ℤ => ((expI : ℂ) ^ n) := by - intro a b hab - simp only [show ((expI : ℂ)) = Complex.exp Complex.I from rfl, - ← Complex.exp_int_mul] at hab - obtain ⟨k, hk⟩ := Complex.exp_eq_exp_iff_exists_int.mp hab - have hℂ : ((a : ℂ)) = b + k * (2 * (Real.pi : ℂ)) := by - refine mul_right_cancel₀ Complex.I_ne_zero ?_ - rw [hk] - ring - have hℝ : ((a : ℝ)) = b + k * (2 * Real.pi) := by - have h := congrArg Complex.re hℂ - simpa using h - rcases eq_or_ne k 0 with rfl | hk0 - · exact_mod_cast (by simpa using hℝ : ((a : ℝ)) = b) - · exfalso - refine irrational_pi ⟨(a - b) / (2 * k), ?_⟩ - have h2k : ((2 * k : ℝ)) ≠ 0 := - mul_ne_zero two_ne_zero (Int.cast_ne_zero.mpr hk0) - push_cast - rw [div_eq_iff h2k] - linarith [hℝ] - -/-- The hypercharge-`n` weight space lies in the `(exp i) ^ n` eigenspace of the - transformation by `exp i`. -/ -lemma hyperchargeSubmodule_le_eigenspace (rep : Representation ℂ GaugeGroupI M) - (n : ℤ) : - hyperchargeSubmodule rep n - ≤ Module.End.eigenspace (rep (GaugeGroupI.ofU1 expI)) ((expI : ℂ) ^ n) := - fun _ hx => Module.End.mem_eigenspace_iff.mpr (hx expI) - -/-- **The hypercharge weight spaces are independent**: a decomposition into homogeneous - parts is unique when it exists. This holds with no assumption on the - representation. -/ -lemma hyperchargeSubmodule_iSupIndep (rep : Representation ℂ GaugeGroupI M) : - iSupIndep (hyperchargeSubmodule rep) := - ((Module.End.eigenspaces_iSupIndep - (rep (GaugeGroupI.ofU1 expI) : Module.End ℂ M)).comp - expI_zpow_injective).mono fun n => hyperchargeSubmodule_le_eigenspace rep n - -/-! - -## E. The grading - --/ - -/-- **The hypercharge grades the algebra**: the weight spaces of a hypercharge-graded - representation decompose the algebra as an internal direct sum. -/ -theorem hyperchargeSubmodule_isInternal [IsHyperchargeGraded rep] : - DirectSum.IsInternal (hyperchargeSubmodule rep) := - (DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top _).mpr - ⟨hyperchargeSubmodule_iSupIndep rep, - IsHyperchargeGraded.hyperchargeSpan_eq_top⟩ - -/-- The decomposition into hypercharge components. -/ -noncomputable instance [IsHyperchargeGraded rep] : - DirectSum.Decomposition (hyperchargeSubmodule rep) := - (hyperchargeSubmodule_isInternal rep).chooseDecomposition - -/-- **A hypercharge-graded representation is a graded algebra.** -/ -noncomputable instance [IsHyperchargeGraded rep] : - GradedAlgebra (hyperchargeSubmodule rep) where - one_mem := one_mem rep - mul_mem _ _ _ _ hx hy := mul_mem rep hx hy - -/-! - -## F. The hypercharge projections - --/ - -/-- The projection onto the part of hypercharge `n`, read off from the hypercharge - decomposition. The charge-zero projection `hyperchargeProj rep 0` is the projection - onto the charge singlets. -/ -noncomputable def hyperchargeProj [IsHyperchargeGraded rep] (n : ℤ) : B →ₗ[ℂ] B := - (hyperchargeSubmodule rep n).subtype ∘ₗ - DirectSum.component ℂ ℤ (fun n => (hyperchargeSubmodule rep n : Submodule ℂ B)) n ∘ₗ - (DirectSum.decomposeLinearEquiv (hyperchargeSubmodule rep)).toLinearMap - -variable [IsHyperchargeGraded rep] - -lemma hyperchargeProj_apply (n : ℤ) (x : B) : - hyperchargeProj rep n x - = (DirectSum.decompose (hyperchargeSubmodule rep) x n : B) := rfl - -/-- The projection lands in the hypercharge it projects onto. -/ -lemma hyperchargeProj_mem (n : ℤ) (x : B) : - hyperchargeProj rep n x ∈ hyperchargeSubmodule rep n := - (DirectSum.decompose (hyperchargeSubmodule rep) x n).2 - -/-- On an element of hypercharge `n` the hypercharge-`n` projection is the identity. -/ -@[simp] -lemma hyperchargeProj_of_mem {n : ℤ} {x : B} (hx : x ∈ hyperchargeSubmodule rep n) : - hyperchargeProj rep n x = x := - DirectSum.decompose_of_mem_same _ hx - -/-- On an element of another hypercharge the projection vanishes. -/ -lemma hyperchargeProj_of_mem_ne {n m : ℤ} {x : B} - (hx : x ∈ hyperchargeSubmodule rep m) (hmn : m ≠ n) : - hyperchargeProj rep n x = 0 := - DirectSum.decompose_of_mem_ne _ hx hmn - -/-- An element is of hypercharge `n` exactly when the hypercharge-`n` projection fixes - it. -/ -lemma hyperchargeProj_eq_self_iff {n : ℤ} {x : B} : - hyperchargeProj rep n x = x ↔ x ∈ hyperchargeSubmodule rep n := - ⟨fun h => h ▸ hyperchargeProj_mem rep n x, hyperchargeProj_of_mem rep⟩ - -/-- The projections are idempotent. -/ -@[simp] -lemma hyperchargeProj_hyperchargeProj (n : ℤ) (x : B) : - hyperchargeProj rep n (hyperchargeProj rep n x) = hyperchargeProj rep n x := - hyperchargeProj_of_mem rep (hyperchargeProj_mem rep n x) - -/-- Distinct projections are orthogonal. -/ -lemma hyperchargeProj_hyperchargeProj_of_ne {n m : ℤ} (hmn : m ≠ n) (x : B) : - hyperchargeProj rep n (hyperchargeProj rep m x) = 0 := - hyperchargeProj_of_mem_ne rep (hyperchargeProj_mem rep m x) hmn - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean new file mode 100644 index 000000000..2562a7caa --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition +/-! +# Isospin decompositions + +## i. Overview + +An **isospin decomposition** of a submodule `V` is a finitely supported family of subspaces +of pure weak isospin whose supremum is `V`. Weights are normalized as `2T₃`, so the two +components of a doublet carry weights `+1` and `-1`. + +This is the weak-isospin twin of `HyperchargeDecomposition`, and it is built the same way. +Purity is recorded against a single element of the maximal torus of the `SU(2)` factor, the +transformation by `diag (exp i, exp (-i))`: the isospin-`k` piece consists of the vectors +scaled by `(exp i) ^ k`. Because that element has infinite order, the eigenvalues +`(exp i) ^ k` are pairwise distinct — `expI_zpow_injective`, the very same lemma the +hypercharge file uses — so the pieces are independent with no assumption on the +representation. + +## ii. A warning: weight zero is weaker than invariance + +For the abelian `U(1)` factor, hypercharge zero *is* the charge singlet condition. For the +non-abelian `SU(2)` factor this fails: `mem_zero_of_invariant` below is a genuine one-way +implication and there is no converse. The torus does not separate the isospin singlet from +the neutral component of a higher isospin multiplet — `H†H` and `H†σ³H` both have isospin +weight zero, but only the first is invariant. + +So this file provides a *sieve*, not a characterization: it narrows the candidates for an +invariant, and the survivors must still be checked directly. The same caveat attaches to the +boost-weight grading in `Grading/BoostWeight.lean`, and for the same reason. + +## iii. Key results + +- `su2ExpI` : the `SU(2)` torus element `diag (exp i, exp (-i))`, of infinite order. +- `IsospinDecomposition` : a finitely supported family of pure-isospin subspaces with + supremum `V`. +- `IsospinDecomposition.sup` : two decompositions combine weightwise into one of `V ⊔ V'`. +- `IsospinDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the + isospin-zero piece. + +## iv. Table of contents + +- A. The `SU(2)` torus element +- B. Isospin decompositions +- C. Invariants + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. The `SU(2)` torus element + +-/ + +/-- The `SU(2)` torus element `diag (exp i, exp (-i))`. Like `expI` it has infinite order, + so its powers are pairwise distinct and it separates the isospin weights. -/ +noncomputable def su2ExpI : specialUnitaryGroup (Fin 2) ℂ := + ⟨!![(expI : ℂ), 0; 0, star (expI : ℂ)], by + have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := + Unitary.mul_star_self_of_mem expI.2 + have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := + Unitary.star_mul_self_of_mem expI.2 + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply, hms, hsm] + · simp [Matrix.det_fin_two_of, hms]⟩ + +/-- The inverse of `exp i` is its star. -/ +lemma expI_inv_eq_star : ((expI : ℂ))⁻¹ = star (expI : ℂ) := + inv_eq_of_mul_eq_one_right (Unitary.mul_star_self_of_mem expI.2) + +lemma su2ExpI_coe : + (su2ExpI : specialUnitaryGroup (Fin 2) ℂ).1 = !![(expI : ℂ), 0; 0, star (expI : ℂ)] := rfl + +/-- The inverse torus element is `diag (exp (-i), exp i)`: on a doublet the two components + are scaled by `(exp i) ^ (-1)` and `(exp i) ^ 1`. -/ +lemma su2ExpI_inv_coe : + (su2ExpI⁻¹ : specialUnitaryGroup (Fin 2) ℂ).1 + = !![star (expI : ℂ), 0; 0, (expI : ℂ)] := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star, su2ExpI_coe] + ext a b + fin_cases a <;> fin_cases b <;> simp + +/-! + +## B. Isospin decompositions + +-/ + +variable {B : Type*} [Ring B] [Algebra ℂ B] + +/-- An **isospin decomposition** of a submodule `V`: a finitely supported family of + subspaces of pure weak isospin whose supremum is `V`. Purity is recorded against the + single torus transformation `su2ExpI`, which is enough to force the pieces to be + independent. + + Isospin weight zero is necessary but *not* sufficient for `SU(2)` invariance; see the + warning in the module docstring. -/ +structure IsospinDecomposition (rep : Representation ℂ GaugeGroupI B) + (V : Submodule ℂ B) where + /-- The isospin `k` piece of the decomposition, at weight `k = 2T₃`. -/ + piece : ℤ → Submodule ℂ B + /-- The finite set of isospin weights that occur. -/ + supp : Finset ℤ + /-- Each piece is of pure isospin, as seen by the torus transformation `su2ExpI`. -/ + piece_le : ∀ k, ∀ x, x ∈ piece k → rep ⟨1, su2ExpI, 1⟩ x = ((expI : ℂ) ^ k) • x + /-- Only the isospin weights in `supp` occur. -/ + piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ + /-- The pieces exhaust `V`. -/ + iSup_piece : (⨆ k, piece k) = V + +namespace IsospinDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} + +/-- The isospin-`k` piece lies in the `(exp i) ^ k` eigenspace of the torus transformation + `su2ExpI`. This is `piece_le` phrased as an inequality of submodules. -/ +lemma piece_le_eigenspace (h : IsospinDecomposition rep V) (k : ℤ) : + h.piece k ≤ Module.End.eigenspace (rep ⟨1, su2ExpI, 1⟩) ((expI : ℂ) ^ k) := + fun _ hy => Module.End.mem_eigenspace_iff.mpr (h.piece_le k _ hy) + +/-- The join of two isospin decompositions: the pieces, supports and suprema all combine + weightwise, decomposing `V ⊔ V'`. -/ +noncomputable def sup (h : IsospinDecomposition rep V) (h' : IsospinDecomposition rep V') : + IsospinDecomposition rep (V ⊔ V') where + piece k := h.piece k ⊔ h'.piece k + supp := h.supp ∪ h'.supp + piece_le k x hx := + Module.End.mem_eigenspace_iff.mp + (sup_le (h.piece_le_eigenspace k) (h'.piece_le_eigenspace k) hx) + piece_eq_bot k hk := by + rw [Finset.mem_union, not_or] at hk + rw [h.piece_eq_bot k hk.1, h'.piece_eq_bot k hk.2, bot_sup_eq] + iSup_piece := by + rw [iSup_sup_eq, h.iSup_piece, h'.iSup_piece] + +/-! + +## C. Invariants + +-/ + +/-- **A gauge-invariant element sits in the isospin-zero piece.** Only invariance under the + single torus transformation `su2ExpI` is used: the other pieces lie in eigenspaces for the + eigenvalues `(exp i) ^ k`, all distinct from `1`. + + There is no converse: the isospin-zero piece is strictly larger than the `SU(2)` + invariants whenever a higher isospin multiplet occurs in `V`. -/ +lemma mem_zero_of_invariant (h : IsospinDecomposition rep V) {x : B} (hx : x ∈ V) + (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ h.piece 0 := by + have hdisj : Disjoint + (Module.End.eigenspace (rep ⟨1, su2ExpI, 1⟩) ((expI : ℂ) ^ (0 : ℤ))) + (⨆ k, ⨆ _ : k ≠ (0 : ℤ), h.piece k) := + (((Module.End.eigenspaces_iSupIndep (rep ⟨1, su2ExpI, 1⟩ : Module.End ℂ B)).comp + expI_zpow_injective) 0).mono_right (iSup₂_mono fun k _ => h.piece_le_eigenspace k) + have key : (⨆ k, h.piece k) + ⊓ Module.End.eigenspace (rep ⟨1, su2ExpI, 1⟩) ((expI : ℂ) ^ (0 : ℤ)) ≤ h.piece 0 := by + rw [iSup_split_single h.piece 0, sup_inf_assoc_of_le _ (h.piece_le_eigenspace 0)] + exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) + refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ + · rw [h.iSup_piece] + exact hx + · rw [zpow_zero, one_smul] + exact hV _ + +end IsospinDecomposition +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean new file mode 100644 index 000000000..e69de29bb diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index 58727b3ea..beed33bd1 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -7,6 +7,9 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction @@ -19,10 +22,11 @@ public import Mathlib.RingTheory.TensorProduct.Maps We suppose that we have an equivariant map under the global gauge group, and the Lorentz group -`H : Module.dual HiggsSpace →ₗ[ℂ] B` +`H : Module.Dual ℂ HiggsVec →ₗ[ℂ] B` and -`barH : Module.dual (Conj HiggsSpace) →ₗ[ℂ] B` -from the dual of the Higgs space to some algebra `B`. +`barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B` +from the dual of the Higgs space to some algebra `B`. The Higgs is a Lorentz scalar, so +Lorentz equivariance carries no content for `H` itself and is not recorded as a field. We define `IsHiggsAlgebraValued` to be the property that these maps are equivariant under the gauge group and the Lorentz group, and there images commute with one another. @@ -51,4 +55,587 @@ namespace StandardModel open TensorProduct Matrix +/-- The pair of symbol maps `H`, `barH` in the algebra `B` is an *algebra-valued Higgs* for + the gauge representation `rep` when it satisfies the defining properties of the physicists' + Higgs doublet: + + * the symbol `H_φ` transforms contragrediently to `HiggsVec` — under a gauge transformation + `g` it is acted on by the dual representation `HiggsVec.repGaugeGroupI.dual` + (`H_equivariant`), and `barH_φ` by the conjugate-dual (`barH_equivariant`). These are the + physicists' `H ↦ g H` and `H^† ↦ H^† g^†`, read on the component functions; + * the Higgs is a *boson*, so all of its component symbols commute with one another + (`H_comm_H`, `H_comm_barH`, `barH_comm_barH`). This is what distinguishes an + algebra-valued Higgs from an algebra-valued fermion, whose symbols anticommute. -/ +structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] + (rep : Representation ℂ GaugeGroupI B) (H : Module.Dual ℂ HiggsVec →ₗ[ℂ] B) + (barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) : Prop where + /-- The Higgs symbol carries the dual of the gauge representation on `HiggsVec`: the + `SU(2)` index transforms contragrediently, and the hypercharge character by `u⁻³`. -/ + H_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ HiggsVec), + rep g (H φ) = H (HiggsVec.repGaugeGroupI.dual g φ) + /-- The conjugate Higgs symbol carries the conjugate-dual of the gauge representation: + the physicists' `H^† ↦ H^† g^†`. -/ + barH_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + rep g (barH φ) = barH (HiggsVec.repGaugeGroupI.conj.dual g φ) + /-- The Higgs is bosonic: two Higgs symbols commute. -/ + H_comm_H : ∀ φ ψ, Commute (H φ) (H ψ) + /-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ + H_comm_barH : ∀ φ ψ, Commute (H φ) (barH ψ) + /-- Two conjugate Higgs symbols commute. -/ + barH_comm_barH : ∀ φ ψ, Commute (barH φ) (barH ψ) + +namespace IsHiggsAlgebraValued + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} {H : Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + (h : IsHiggsAlgebraValued B rep H barH) + +/-! + +## The generators + +Written in coordinates, a Lagrangian is a polynomial in the component symbols `H^α` and +`H̄^α`. These are the values of `H` and `barH` on the dual of the standard orthonormal basis +of `HiggsVec` — and, for the conjugate, on the dual of its conjugated basis +`Module.Basis.conj`. + +-/ + +set_option linter.unusedVariables false in +/-- The component symbol `H^i` of the Higgs: the value of the symbol map on the `i`-th + covector of the standard basis of `HiggsVec`. -/ +noncomputable def higgsComponent (h : IsHiggsAlgebraValued B rep H barH) (i : Fin 2) : B := + H (HiggsVec.orthonormBasis.toBasis.dualBasis i) + +lemma rep_higgsComponent (g : GaugeGroupI) (i : Fin 2) : + rep g (h.higgsComponent i) = + ∑ j, (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j) • h.higgsComponent j := by + have key : HiggsVec.repGaugeGroupI.dual g (HiggsVec.orthonormBasis.toBasis.dualBasis i) + = ∑ j, (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j) • + HiggsVec.orthonormBasis.toBasis.dualBasis j := by + refine HiggsVec.orthonormBasis.toBasis.ext fun k => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, smul_eq_mul, Module.Basis.dualBasis_apply_self, + mul_ite, mul_one, mul_zero, Finset.sum_ite_eq] + simp [Representation.dual, HiggsVec.repGaugeGroupI_apply, HiggsVec.orthonormBasis, + Submonoid.smul_def, -inv_pow] + rw [higgsComponent, h.H_equivariant, key, map_sum] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl + +set_option linter.unusedVariables false in +/-- The component symbol `H̄^i` of the conjugate Higgs. -/ +noncomputable def barHiggsComponent (h : IsHiggsAlgebraValued B rep H barH) (i : Fin 2) : B := + barH (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) + +lemma rep_barHiggsComponent (g : GaugeGroupI) (i : Fin 2) : + rep g (h.barHiggsComponent i) = + ∑ j, (starRingEnd ℂ (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j)) • + h.barHiggsComponent j := by + have key : HiggsVec.repGaugeGroupI.conj.dual g + (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) + = ∑ j, (starRingEnd ℂ (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j)) • + HiggsVec.orthonormBasis.toBasis.conj.dualBasis j := by + refine HiggsVec.orthonormBasis.toBasis.conj.ext fun k => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, smul_eq_mul, Module.Basis.dualBasis_apply_self, + mul_ite, mul_one, mul_zero, Finset.sum_ite_eq] + simp [Representation.dual, Representation.conj_apply, HiggsVec.repGaugeGroupI_apply, + HiggsVec.orthonormBasis, Submonoid.smul_def, -inv_pow] + rw [barHiggsComponent, h.barH_equivariant, key, map_sum] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl + +/-! + +## The submodules + +Everything below is stated relative to a fixed `h : IsHiggsAlgebraValued B rep H barH`, and +takes it as its first explicit argument, so that the submodules and terms are reached by dot +notation — `h.higgsSubmodule`, `h.massTerm` — and the data `B`, `rep`, `H` and `barH` are +recovered from `h` rather than passed by hand. + +-/ + +set_option linter.unusedVariables false in +/-- The submodule of `B` spanned by the Higgs symbols `H_φ`: the terms of mass dimension one + and hypercharge `+3`. -/ +def higgsSubmodule (h : IsHiggsAlgebraValued B rep H barH) : Submodule ℂ B := + LinearMap.range H + +lemma higgsSubmodule_eq_span_higgsComponents : + h.higgsSubmodule = Submodule.span ℂ (Set.range h.higgsComponent) := by + rw [higgsSubmodule, LinearMap.range_eq_map, + ← (HiggsVec.orthonormBasis.toBasis.dualBasis).span_eq, Submodule.map_span, + ← Set.range_comp] + rfl + +lemma higgsComponent_mem_higgsSubmodule (i : Fin 2) : + h.higgsComponent i ∈ h.higgsSubmodule := + LinearMap.mem_range_self _ _ + +set_option linter.unusedVariables false in +/-- The submodule of `B` spanned by the conjugate Higgs symbols `H̄_φ`: the terms of mass + dimension one and hypercharge `-3`. -/ +def barHiggsSubmodule (h : IsHiggsAlgebraValued B rep H barH) : Submodule ℂ B := + LinearMap.range barH + +lemma barHiggsSubmodule_eq_span_barHiggsComponents : + h.barHiggsSubmodule = Submodule.span ℂ (Set.range h.barHiggsComponent) := by + rw [barHiggsSubmodule, LinearMap.range_eq_map, + ← (HiggsVec.orthonormBasis.toBasis.conj.dualBasis).span_eq, Submodule.map_span, + ← Set.range_comp] + rfl + +lemma barHiggsComponent_mem_barHiggsSubmodule (i : Fin 2) : + h.barHiggsComponent i ∈ h.barHiggsSubmodule := + LinearMap.mem_range_self _ _ + +/-- The terms of mass dimension exactly one: a Higgs symbol or a conjugate Higgs symbol. -/ +def scalarSubmoduleOne : Submodule ℂ B := h.higgsSubmodule ⊔ h.barHiggsSubmodule + +/-- **All terms of mass dimension at most `n`** built from the Higgs and its conjugate. -/ +def scalarSubmodule (n : ℕ) : Submodule ℂ B := + ∑ k ∈ Finset.range (n + 1), h.scalarSubmoduleOne ^ k + +@[simp] +lemma scalarSubmodule_zero : h.scalarSubmodule 0 = 1 := by + rw [scalarSubmodule] + simp + +/-- Raising the mass dimension by one adjoins the products of `n + 1` symbols. -/ +lemma scalarSubmodule_succ (n : ℕ) : + h.scalarSubmodule (n + 1) = h.scalarSubmodule n ⊔ h.scalarSubmoduleOne ^ (n + 1) := by + rw [scalarSubmodule, scalarSubmodule, Finset.sum_range_succ, Submodule.add_eq_sup] + +lemma scalarSubmoduleOne_pow_le_scalarSubmodule {k n : ℕ} (hk : k ≤ n) : + h.scalarSubmoduleOne ^ k ≤ h.scalarSubmodule n := by + rw [scalarSubmodule] + exact Finset.single_le_sum (f := fun k => h.scalarSubmoduleOne ^ k) + (fun _ _ => bot_le) (Finset.mem_range.mpr (Nat.lt_succ_of_le hk)) + +lemma scalarSubmoduleOne_le_scalarSubmodule {n : ℕ} (hn : 1 ≤ n) : + h.scalarSubmoduleOne ≤ h.scalarSubmodule n := by + rw [← pow_one h.scalarSubmoduleOne] + exact h.scalarSubmoduleOne_pow_le_scalarSubmodule hn + +/-- All terms in the algebra made from up to four combinations + of `H` and `barH` -/ +def scalarPotentialSubmodule : Submodule ℂ B := h.scalarSubmodule 4 + +/-! + +## Closure under the gauge action + +Each of the submodules above is *stable* under the gauge action on `B`: a gauge +transformation moves a Higgs symbol to a combination of Higgs symbols and nothing else. For +the two spans of symbols and their join this is exactly the equivariance recorded in +`IsHiggsAlgebraValued`. For the higher mass dimensions it needs, in addition, that a gauge +transformation acts on `B` by an *algebra* map; that is not among the fields of +`IsHiggsAlgebraValued`, so it is taken as the hypothesis `rep_mul` below — the analogue of +`IsGaugeField.gauge_mul` — and packaged as `repAlgHom`, after which `Submodule.mapHom` +carries the closure through products, powers and sums. + +-/ + +lemma higgsSubmodule_map_le (g : GaugeGroupI) : + h.higgsSubmodule.map (rep g) ≤ h.higgsSubmodule := by + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + exact ⟨HiggsVec.repGaugeGroupI.dual g φ, (h.H_equivariant g φ).symm⟩ + +lemma barHiggsSubmodule_map_le (g : GaugeGroupI) : + h.barHiggsSubmodule.map (rep g) ≤ h.barHiggsSubmodule := by + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + exact ⟨HiggsVec.repGaugeGroupI.conj.dual g φ, (h.barH_equivariant g φ).symm⟩ + +/-- The Higgs symbols are closed under the gauge action.-/ +lemma higgsSubmodule_closure (g : GaugeGroupI) : + h.higgsSubmodule.map (rep g) = h.higgsSubmodule := + le_antisymm (h.higgsSubmodule_map_le g) fun b hb => + ⟨rep g⁻¹ b, h.higgsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + +/-- The conjugate Higgs symbols are closed under the gauge action. -/ +lemma barHiggsSubmodule_closure (g : GaugeGroupI) : + h.barHiggsSubmodule.map (rep g) = h.barHiggsSubmodule := + le_antisymm (h.barHiggsSubmodule_map_le g) fun b hb => + ⟨rep g⁻¹ b, h.barHiggsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + +/-- The mass-dimension-one terms are closed under the gauge action. -/ +lemma scalarSubmoduleOne_closure (g : GaugeGroupI) : + h.scalarSubmoduleOne.map (rep g) = h.scalarSubmoduleOne := by + rw [scalarSubmoduleOne, Submodule.map_sup, h.higgsSubmodule_closure g, + h.barHiggsSubmodule_closure g] + +variable (rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + rep g (b₁ * b₂) = rep g b₁ * rep g b₂) +include rep_mul + +set_option linter.unusedVariables false in +/-- A gauge transformation as an algebra homomorphism of `B`. Only linearity is built into + `Representation`; `rep_mul` supplies multiplicativity, and the unit is preserved because a + gauge transformation is invertible. -/ +def repAlgHom (h : IsHiggsAlgebraValued B rep H barH) (g : GaugeGroupI) : B →ₐ[ℂ] B := + AlgHom.ofLinearMap (rep g) + (by + obtain ⟨c, hc⟩ := (rep.apply_bijective g).2 1 + calc rep g 1 = rep g 1 * rep g c := by rw [hc, mul_one] + _ = rep g (1 * c) := (rep_mul g 1 c).symm + _ = 1 := by rw [one_mul, hc]) + (rep_mul g) + +lemma repAlgHom_toLinearMap (g : GaugeGroupI) : + (h.repAlgHom rep_mul g).toLinearMap = rep g := rfl + +/-- The terms of mass dimension at most `n` are closed under the gauge action. -/ +lemma scalarSubmodule_closure (g : GaugeGroupI) (n : ℕ) : + (h.scalarSubmodule n).map (rep g) = h.scalarSubmodule n := by + have hmap : ∀ S : Submodule ℂ B, + S.map (rep g) = Submodule.mapHom (h.repAlgHom rep_mul g) S := fun _ => rfl + rw [scalarSubmodule, hmap, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [map_pow, ← hmap, h.scalarSubmoduleOne_closure g] + +/-- The scalar potential terms are closed under the gauge action. -/ +lemma scalarPotentialSubmodule_closure (g : GaugeGroupI) : + (h.scalarPotentialSubmodule).map (rep g) = h.scalarPotentialSubmodule := + h.scalarSubmodule_closure rep_mul g 4 + +omit rep_mul in +/-- **The scalar potential terms, written out.** `scalarSubmodule 4` is the join of the + powers `scalarSubmoduleOne ^ k` for `k ≤ 4`; expanding each power distributes over the + join, and the Higgs and conjugate-Higgs symbols commute, so every ordered product equals + the one with all `H` factors to the left. -/ +lemma scalarPotentialSubmodule_eq_higgs (h : IsHiggsAlgebraValued B rep H barH) : + h.scalarPotentialSubmodule = + 1 ⊔ h.higgsSubmodule + ⊔ h.barHiggsSubmodule + ⊔ h.higgsSubmodule * h.higgsSubmodule + ⊔ h.higgsSubmodule * h.barHiggsSubmodule + ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule + ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule + ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule + ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule + ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule + ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule + ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule + ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule + ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule + ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by + have hcomm : h.higgsSubmodule * h.barHiggsSubmodule = h.barHiggsSubmodule * h.higgsSubmodule := by + refine le_antisymm (Submodule.mul_le.mpr fun m hm n hn => ?_) + (Submodule.mul_le.mpr fun m hm n hn => ?_) + · obtain ⟨φ, rfl⟩ := hm + obtain ⟨ψ, rfl⟩ := hn + rw [(h.H_comm_barH φ ψ).eq] + exact Submodule.mul_mem_mul (LinearMap.mem_range_self _ _) (LinearMap.mem_range_self _ _) + · obtain ⟨ψ, rfl⟩ := hm + obtain ⟨φ, rfl⟩ := hn + rw [← (h.H_comm_barH φ ψ).eq] + exact Submodule.mul_mem_mul (LinearMap.mem_range_self _ _) (LinearMap.mem_range_self _ _) + have hcm : Commute h.higgsSubmodule h.barHiggsSubmodule := hcomm + have hCCA : Commute (h.barHiggsSubmodule * h.barHiggsSubmodule) h.higgsSubmodule := hcm.symm.mul_left hcm.symm + have s1 : h.higgsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule := by + rw [mul_assoc, hcm.symm.eq, ← mul_assoc] + have s2 : h.barHiggsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by + rw [hCCA.eq, ← mul_assoc] + have s3 : h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule := by + rw [mul_assoc (h.higgsSubmodule * h.higgsSubmodule) h.barHiggsSubmodule h.higgsSubmodule, hcm.symm.eq, ← mul_assoc] + have s4 : h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by + rw [mul_assoc h.higgsSubmodule h.barHiggsSubmodule h.barHiggsSubmodule, mul_assoc h.higgsSubmodule (h.barHiggsSubmodule * h.barHiggsSubmodule) h.higgsSubmodule, hCCA.eq, ← mul_assoc, + ← mul_assoc] + have s5 : h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by + rw [(hCCA.mul_left hcm.symm).eq, ← mul_assoc, ← mul_assoc] + have e2 : h.scalarSubmoduleOne ^ 2 + = h.higgsSubmodule * h.higgsSubmodule ⊔ h.higgsSubmodule * h.barHiggsSubmodule ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule := by + rw [pow_two, scalarSubmoduleOne, Submodule.sup_mul, Submodule.mul_sup, Submodule.mul_sup, + ← hcomm] + simp only [sup_assoc, sup_left_idem] + have e3 : h.scalarSubmoduleOne ^ 3 + = h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by + rw [pow_succ, e2, scalarSubmoduleOne, Submodule.sup_mul, Submodule.sup_mul, + Submodule.mul_sup, Submodule.mul_sup, Submodule.mul_sup, s1, s2] + simp only [sup_assoc, sup_left_idem] + have e4 : h.scalarSubmoduleOne ^ 4 + = h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule + ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by + rw [pow_succ, e3, scalarSubmoduleOne, Submodule.sup_mul, Submodule.sup_mul, + Submodule.sup_mul, Submodule.mul_sup, Submodule.mul_sup, Submodule.mul_sup, + Submodule.mul_sup, s3, s4, s5] + simp only [sup_assoc, sup_left_idem] + rw [scalarPotentialSubmodule, scalarSubmodule, Finset.sum_range_succ, Finset.sum_range_succ, + Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_one, Submodule.add_eq_sup, + Submodule.add_eq_sup, Submodule.add_eq_sup, Submodule.add_eq_sup, pow_zero, pow_one, + e2, e3, e4, scalarSubmoduleOne] + simp only [sup_assoc] + + +/-! + +## Gauge weight decomposition + +-/ + +omit rep_mul in +/-- The component symbol `H^0` is a joint eigenvector of all four torus generators, at the + gauge weight `(0, 0, -1, -3)`. The Higgs is a colour singlet, so both colour exponents + vanish; the symbol transforms contragrediently to the doublet, so its isospin weight is + `-1` and its hypercharge `-3`. -/ +lemma rep_gaugeTorusGen_higgsComponent_zero (i : Fin 4) : + rep (gaugeTorusGen i) (h.higgsComponent 0) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, -3) i) • h.higgsComponent 0 := by + have hstar : ((starRingEnd ℂ) (expI : ℂ)) ^ 3 = (((expI : ℂ)) ^ 3)⁻¹ := by + rw [← inv_pow] + congr 1 + exact expI_inv_eq_star.symm + rw [h.rep_higgsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, expI_inv_eq_star, Matrix.one_apply, Unitary.coe_inv, hstar] + rfl + +omit rep_mul in +/-- The component symbol `H^1` is a joint eigenvector of all four torus generators, at the + gauge weight `(0, 0, 1, -3)`. -/ +lemma rep_gaugeTorusGen_higgsComponent_one (i : Fin 4) : + rep (gaugeTorusGen i) (h.higgsComponent 1) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, -3) i) • h.higgsComponent 1 := by + have hstar : ((starRingEnd ℂ) (expI : ℂ)) ^ 3 = (((expI : ℂ)) ^ 3)⁻¹ := by + rw [← inv_pow] + congr 1 + exact expI_inv_eq_star.symm + rw [h.rep_higgsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, expI_inv_eq_star, Matrix.one_apply, Unitary.coe_inv, hstar] + rfl + +omit rep_mul in +/-- The gauge weight decomposition on the submodule `higgsSubmodule`. + + The Higgs is a colour singlet of hypercharge `-3`, but it is *not* of pure isospin: the + submodule splits into the two component lines `span {H^0}` and `span {H^1}`, at the gauge + weights `(0, 0, -1, -3)` and `(0, 0, 1, -3)`. + + In particular the zero-weight piece is `⊥`, so `mem_zero_of_invariant` says here that no + nonzero term linear in the Higgs is gauge invariant. -/ +noncomputable def higgsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : + GaugeWeightDecomposition rep h.higgsSubmodule where + piece := fun w => + if w = (0, 0, -1, -3) then Submodule.span ℂ {h.higgsComponent 0} + else if w = (0, 0, 1, -3) then Submodule.span ℂ {h.higgsComponent 1} else ⊥ + supp := {(0, 0, -1, -3), (0, 0, 1, -3)} + piece_le := by + have hz : ∀ i : Fin 4, Submodule.span ℂ {h.higgsComponent 0} + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, -3) i) := fun i => + (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_higgsComponent_zero i)) + have ho : ∀ i : Fin 4, Submodule.span ℂ {h.higgsComponent 1} + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, -3) i) := fun i => + (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_higgsComponent_one i)) + intro w x hx i + rcases eq_or_ne w (0, 0, -1, -3) with rfl | hw0 + · rw [if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (hz i hx) + · rcases eq_or_ne w (0, 0, 1, -3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (ho i hx) + · rw [if_neg hw0, if_neg hw1, Submodule.mem_bot] at hx + subst hx + simp + piece_eq_bot := by + intro w hw + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hw + rw [if_neg hw.1, if_neg hw.2] + iSup_piece := by + refine le_antisymm (iSup_le fun w => ?_) ?_ + · rcases eq_or_ne w (0, 0, -1, -3) with rfl | hw0 + · rw [if_pos rfl] + exact (Submodule.span_singleton_le_iff_mem _ _).mpr + (h.higgsComponent_mem_higgsSubmodule 0) + · rcases eq_or_ne w (0, 0, 1, -3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] + exact (Submodule.span_singleton_le_iff_mem _ _).mpr + (h.higgsComponent_mem_higgsSubmodule 1) + · rw [if_neg hw0, if_neg hw1] + exact bot_le + · rw [h.higgsSubmodule_eq_span_higgsComponents, Submodule.span_le] + rintro _ ⟨j, rfl⟩ + fin_cases j + · refine Submodule.mem_iSup_of_mem (0, 0, -1, -3) ?_ + rw [if_pos rfl] + exact Submodule.mem_span_singleton_self _ + · refine Submodule.mem_iSup_of_mem (0, 0, 1, -3) ?_ + rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_span_singleton_self _ + +omit rep_mul in +/-- The conjugate component symbol `H̄^0` is a joint eigenvector of all four torus + generators, at the gauge weight `(0, 0, 1, 3)`. Conjugation negates every exponent, so the + weights here are the negatives of those of `H^0` and `H^1` — with the isospin weights + exchanged between the two components. -/ +lemma rep_gaugeTorusGen_barHiggsComponent_zero (i : Fin 4) : + rep (gaugeTorusGen i) (h.barHiggsComponent 0) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, 3) i) • h.barHiggsComponent 0 := by + have hc : (starRingEnd ℂ) (expI : ℂ) = ((expI : ℂ))⁻¹ := expI_inv_eq_star.symm + rw [h.rep_barHiggsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, Matrix.one_apply, Unitary.coe_inv, hc] + rfl + +omit rep_mul in +/-- The conjugate component symbol `H̄^1` is a joint eigenvector of all four torus + generators, at the gauge weight `(0, 0, -1, 3)`. -/ +lemma rep_gaugeTorusGen_barHiggsComponent_one (i : Fin 4) : + rep (gaugeTorusGen i) (h.barHiggsComponent 1) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, 3) i) • h.barHiggsComponent 1 := by + have hc : (starRingEnd ℂ) (expI : ℂ) = ((expI : ℂ))⁻¹ := expI_inv_eq_star.symm + rw [h.rep_barHiggsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, Matrix.one_apply, Unitary.coe_inv, hc] + rfl + +omit rep_mul in +/-- The gauge weight decomposition on the submodule `barHiggsSubmodule`. + + The conjugate Higgs is a colour singlet of hypercharge `+3`, and its two component symbols + carry isospin weights `+1` and `-1`; so the submodule splits into the two weight lines + `span {H̄^0}` and `span {H̄^1}`, at `(0, 0, 1, 3)` and `(0, 0, -1, 3)`. + + As for `higgsSubmoduleGaugeWeight` the zero-weight piece is `⊥`, so no nonzero term linear + in the conjugate Higgs is gauge invariant. -/ +noncomputable def barHiggsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : + GaugeWeightDecomposition rep h.barHiggsSubmodule where + piece := fun w => + if w = (0, 0, 1, 3) then Submodule.span ℂ {h.barHiggsComponent 0} + else if w = (0, 0, -1, 3) then Submodule.span ℂ {h.barHiggsComponent 1} else ⊥ + supp := {(0, 0, 1, 3), (0, 0, -1, 3)} + piece_le := by + have hz : ∀ i : Fin 4, Submodule.span ℂ {h.barHiggsComponent 0} + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, 3) i) := fun i => + (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_barHiggsComponent_zero i)) + have ho : ∀ i : Fin 4, Submodule.span ℂ {h.barHiggsComponent 1} + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, 3) i) := fun i => + (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_barHiggsComponent_one i)) + intro w x hx i + rcases eq_or_ne w (0, 0, 1, 3) with rfl | hw0 + · rw [if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (hz i hx) + · rcases eq_or_ne w (0, 0, -1, 3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (ho i hx) + · rw [if_neg hw0, if_neg hw1, Submodule.mem_bot] at hx + subst hx + simp + piece_eq_bot := by + intro w hw + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hw + rw [if_neg hw.1, if_neg hw.2] + iSup_piece := by + refine le_antisymm (iSup_le fun w => ?_) ?_ + · rcases eq_or_ne w (0, 0, 1, 3) with rfl | hw0 + · rw [if_pos rfl] + exact (Submodule.span_singleton_le_iff_mem _ _).mpr + (h.barHiggsComponent_mem_barHiggsSubmodule 0) + · rcases eq_or_ne w (0, 0, -1, 3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] + exact (Submodule.span_singleton_le_iff_mem _ _).mpr + (h.barHiggsComponent_mem_barHiggsSubmodule 1) + · rw [if_neg hw0, if_neg hw1] + exact bot_le + · rw [h.barHiggsSubmodule_eq_span_barHiggsComponents, Submodule.span_le] + rintro _ ⟨j, rfl⟩ + fin_cases j + · refine Submodule.mem_iSup_of_mem (0, 0, 1, 3) ?_ + rw [if_pos rfl] + exact Submodule.mem_span_singleton_self _ + · refine Submodule.mem_iSup_of_mem (0, 0, -1, 3) ?_ + rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_span_singleton_self _ + +omit rep_mul in +lemma higgsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH) : + (h.higgsSubmoduleGaugeWeight).supp = {(0, 0, -1, -3), (0, 0, 1, -3)} := by + rfl + +omit rep_mul in +lemma barHiggsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH) : + (h.barHiggsSubmoduleGaugeWeight).supp = {(0, 0, 1, 3), (0, 0, -1, 3)} := by + rfl + +/-- **The gauge weight decomposition of the scalar potential terms.** Read straight off + `scalarPotentialSubmodule_eq_higgs`: the unit contributes `one`, the two symbol spans + contribute their own decompositions, every product of them is handled by `mul`, and the + fifteen summands are joined by `sup`. -/ +noncomputable def scalarPotentialSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : + GaugeWeightDecomposition rep h.scalarPotentialSubmodule := + let d := h.higgsSubmoduleGaugeWeight + let d' := h.barHiggsSubmoduleGaugeWeight + (((((((((((((((GaugeWeightDecomposition.one (fun g => map_one (h.repAlgHom rep_mul g))).sup + d).sup + d').sup + (d.mul rep_mul d)).sup + (d.mul rep_mul d')).sup + (d'.mul rep_mul d')).sup + ((d.mul rep_mul d).mul rep_mul d)).sup + ((d.mul rep_mul d).mul rep_mul d')).sup + ((d.mul rep_mul d').mul rep_mul d')).sup + ((d'.mul rep_mul d').mul rep_mul d')).sup + (((d.mul rep_mul d).mul rep_mul d).mul rep_mul d)).sup + (((d.mul rep_mul d).mul rep_mul d).mul rep_mul d')).sup + (((d.mul rep_mul d).mul rep_mul d').mul rep_mul d')).sup + (((d.mul rep_mul d').mul rep_mul d').mul rep_mul d')).sup + (((d'.mul rep_mul d').mul rep_mul d').mul rep_mul d')).copy _ + h.scalarPotentialSubmodule_eq_higgs + +def higgsQuadraticZeroGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : Submodule ℂ B := + Submodule.span ℂ + {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} + +open GaugeWeightDecomposition in +lemma scalarPotentialSubmoduleGaugeWeight_peice_zero (h : IsHiggsAlgebraValued B rep H barH) : + let H2 := Submodule.span ℂ + {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} + (h.scalarPotentialSubmoduleGaugeWeight rep_mul).piece 0 = + 1 ⊔ H2 ⊔ H2 * H2 := by + dsimp only [scalarPotentialSubmoduleGaugeWeight, GaugeWeightDecomposition.copy_piece, + GaugeWeightDecomposition.sup_piece, GaugeWeightDecomposition.one_piece, ↓dreduceIte, + Submodule.zero_eq_bot] + simp (disch := (try simp only [higgsSubmoduleGaugeWeight, barHiggsSubmoduleGaugeWeight, + GaugeWeightDecomposition.one, GaugeWeightDecomposition.mul_supp]; try decide)) only + [GaugeWeightDecomposition.piece_eq_zero_of_not_mem_supp, sup_bot_eq] + simp only [GaugeWeightDecomposition.mul_piece_eq_sub', barHiggsSubmoduleGaugeWeight_supp + , higgsSubmoduleGaugeWeight_supp, Finset.iSup_insert, Finset.iSup_singleton] + simp (disch := (try simp only [higgsSubmoduleGaugeWeight, barHiggsSubmoduleGaugeWeight, + GaugeWeightDecomposition.one, GaugeWeightDecomposition.mul_supp]; try decide)) + [GaugeWeightDecomposition.piece_eq_zero_of_not_mem_supp] + simp [barHiggsSubmoduleGaugeWeight, higgsSubmoduleGaugeWeight, Submodule.span_mul_span] + rw [← Submodule.span_mul_span, Submodule.span_insert] + simp only [Submodule.sup_mul, Submodule.mul_sup, Submodule.span_mul_span, + Set.singleton_mul_singleton] + have hHH : ∀ i j, h.higgsComponent i * h.higgsComponent j + = h.higgsComponent j * h.higgsComponent i := fun i j => (h.H_comm_H _ _).eq + have hbH : ∀ i j, h.barHiggsComponent i * h.higgsComponent j + = h.higgsComponent j * h.barHiggsComponent i := fun i j => (h.H_comm_barH _ _).symm.eq + have hbb : ∀ i j, h.barHiggsComponent i * h.barHiggsComponent j + = h.barHiggsComponent j * h.barHiggsComponent i := fun i j => (h.barH_comm_barH _ _).eq + have hHH' : ∀ i j (x : B), h.higgsComponent i * (h.higgsComponent j * x) + = h.higgsComponent j * (h.higgsComponent i * x) := fun i j x => by + rw [← mul_assoc, hHH, mul_assoc] + have hbH' : ∀ i j (x : B), h.barHiggsComponent i * (h.higgsComponent j * x) + = h.higgsComponent j * (h.barHiggsComponent i * x) := fun i j x => by + rw [← mul_assoc, hbH, mul_assoc] + simp only [mul_assoc, hHH, hHH', hbH', hbb] + simp only [sup_idem] + + +end IsHiggsAlgebraValued + end StandardModel From 2cdd72f49c033132df9e6cb372100fff0ca1bbbe Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 21 Aug 2026 15:36:17 +0100 Subject: [PATCH 186/254] feat: Add Higgs decomp --- Physlib.lean | 1 + .../GaugeGroup/SU2PermDecomposition.lean | 372 ++++++++++++++++++ .../HiggsBoson/AlgebraValued/Basic.lean | 347 ++++++++++++++++ 3 files changed, 720 insertions(+) diff --git a/Physlib.lean b/Physlib.lean index c835d62da..1e42f70b3 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -230,6 +230,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean index e69de29bb..4b62c3b46 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean @@ -0,0 +1,372 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +/-! +# `SU(2)` permutation decompositions + +## i. Overview + +An **`SU(2)` permutation decomposition** of a submodule `V` is a `ZMod 4`-indexed family of +subspaces whose supremum is `V`, the grade-`k` piece scaled by `i ^ k` under the `SU(2)` +element + + `su2Perm = !![0, -1; 1, 0]`, + +the Weyl reflection of `SU(2)`. On a doublet it sends `(a, b)` to `(-b, a)`: it exchanges +the two isospin components, and so exchanges the isospin weights `+1` and `-1` that +`IsospinDecomposition` records. + +`su2Perm` squares to `-1`, so it has order four in `SU(2)` and `rep gaugeSU2Perm` satisfies +`T ^ 4 = 1`. Its spectrum is therefore contained in the fourth roots of unity, and the index +group is `ZMod 4` with eigenvalue `i ^ k` — multiplicative in `k`, which is what makes the +grading add under multiplication, exactly as gauge weights do in `GaugeWeightDecomposition`. +Because `ZMod 4` is finite there is no support field: the finiteness that +`GaugeWeightDecomposition.supp` has to record is automatic here. + +The four grades split by Higgs degree. On a product of an even number of Higgs symbols +`su2Perm` acts as an involution, so only the grades `0` and `2` occur — the eigenvalues `±1` +— and the `SU(2)` invariants sit in grade `0`. The grades `1` and `3`, at `±i`, are where the +odd-degree terms live: the Higgs doublet itself is spanned by `H⁰ - i H¹` in grade `1` and +`H⁰ + i H¹` in grade `3`. A `ZMod 2` version of this file would have nothing to say about +those sectors, and so nothing to say about the Yukawa terms. + +## ii. A warning: grade zero is weaker than invariance + +Like the isospin grading, this is a *sieve* rather than a characterization: +`mem_zero_of_invariant` says an invariant element has grade zero, and there is no converse. +What it buys is a genuine sharpening of `IsospinDecomposition`, whose weight-zero piece +cannot separate the isospin singlet from the neutral component of a higher multiplet: +`su2Perm` exchanges the two isospin components, so it acts on the isospin-zero subspace and +its grade-`2` part is thrown away by this sieve. + +The sieve cannot be pushed further by grading alone. A grading sees only the abelian +subgroup generated by the elements it uses, and for any abelian subgroup of `SU(2)` the +invariants of that subgroup are strictly larger than the `SU(2)` invariants in high isospin — +the square of the neutral triplet component survives every such sieve. Cutting that down +needs the continuous symmetry, not another grading. + +## iii. Key results + +- `su2Perm` : the `SU(2)` Weyl element `!![0, -1; 1, 0]`, and `gaugeSU2Perm` its image in + the gauge group. +- `su2PermSign` : the character `k ↦ i ^ k` on `ZMod 4`, injective and multiplicative. +- `SU2PermDecomposition` : a `ZMod 4`-graded family of pure-sign subspaces with supremum `V`. +- `SU2PermDecomposition.sup` : two decompositions combine gradewise into one of `V ⊔ V'`. +- `SU2PermDecomposition.mul` : grades add under multiplication, decomposing `V * V'`. +- `SU2PermDecomposition.mem_zero_of_invariant` : a gauge-invariant element has grade zero. + +## iv. Table of contents + +- A. The `SU(2)` Weyl element +- B. The sign character of `ZMod 4` +- C. `SU(2)` permutation decompositions +- D. Joins +- E. Products +- F. Invariants + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. The `SU(2)` Weyl element + +-/ + +/-- The `SU(2)` Weyl element `!![0, -1; 1, 0]`. On a doublet it sends `(a, b)` to `(-b, a)`, + exchanging the two isospin components; it squares to `-1`, so it has order four in + `SU(2)`. -/ +noncomputable def su2Perm : specialUnitaryGroup (Fin 2) ℂ := + ⟨!![0, -1; 1, 0], by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply] + · simp [Matrix.det_fin_two_of]⟩ + +lemma su2Perm_coe : (su2Perm : specialUnitaryGroup (Fin 2) ℂ).1 = !![0, -1; 1, 0] := rfl + +/-- The inverse Weyl element is `!![0, 1; -1, 0]`. -/ +lemma su2Perm_inv_coe : + (su2Perm⁻¹ : specialUnitaryGroup (Fin 2) ℂ).1 = !![0, 1; -1, 0] := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star, su2Perm_coe] + ext a b + fin_cases a <;> fin_cases b <;> simp + +/-- The Weyl element as a gauge transformation: trivial on colour and hypercharge. -/ +noncomputable def gaugeSU2Perm : GaugeGroupI := ⟨1, su2Perm, 1⟩ + +/-! + +## B. The sign character of `ZMod 4` + +-/ + +/-- The fourth root of unity `i ^ k` attached to a grade `k : ZMod 4`: the eigenvalue of the + Weyl element on the `k` piece of a decomposition. -/ +noncomputable def su2PermSign (k : ZMod 4) : ℂ := + if k = 0 then 1 else if k = 1 then Complex.I else if k = 2 then -1 else -Complex.I + +@[simp] lemma su2PermSign_zero : su2PermSign 0 = 1 := rfl + +@[simp] lemma su2PermSign_one : su2PermSign 1 = Complex.I := rfl + +@[simp] lemma su2PermSign_two : su2PermSign 2 = -1 := rfl + +@[simp] lemma su2PermSign_three : su2PermSign 3 = -Complex.I := rfl + +/-- The sign is a character: grades **add** under multiplication because the fourth roots of + unity multiply. -/ +lemma su2PermSign_add (k l : ZMod 4) : + su2PermSign (k + l) = su2PermSign k * su2PermSign l := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + rcases hcases k with rfl | rfl | rfl | rfl <;> rcases hcases l with rfl | rfl | rfl | rfl <;> + simp [show (1 + 1 : ZMod 4) = 2 from by decide, + show (1 + 2 : ZMod 4) = 3 from by decide, show (1 + 3 : ZMod 4) = 0 from by decide, + show (2 + 1 : ZMod 4) = 3 from by decide, show (2 + 2 : ZMod 4) = 0 from by decide, + show (2 + 3 : ZMod 4) = 1 from by decide, show (3 + 1 : ZMod 4) = 0 from by decide, + show (3 + 2 : ZMod 4) = 1 from by decide, show (3 + 3 : ZMod 4) = 2 from by decide, + Complex.I_mul_I] + +lemma su2PermSign_ne_zero (k : ZMod 4) : su2PermSign k ≠ 0 := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + rcases hcases k with rfl | rfl | rfl | rfl <;> simp + +/-- The four fourth roots of unity are distinct, so the pieces of a decomposition sit in + eigenspaces at distinct eigenvalues and are automatically independent. -/ +lemma su2PermSign_injective : Function.Injective su2PermSign := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + intro k l hkl + rcases hcases k with rfl | rfl | rfl | rfl <;> rcases hcases l with rfl | rfl | rfl | rfl <;> + simp_all [Complex.ext_iff] <;> norm_num at hkl + +/-! + +## C. `SU(2)` permutation decompositions + +-/ + +variable {B : Type*} [Ring B] [Algebra ℂ B] + +/-- An **`SU(2)` permutation decomposition** of a submodule `V`: a `ZMod 4`-graded family of + subspaces of pure sign under the Weyl element `gaugeSU2Perm`, whose supremum is `V`. + + Unlike `GaugeWeightDecomposition` there is no support field — `ZMod 4` is finite, so the + finiteness condition is automatic. The four grades carry the four fourth roots of unity; + even-degree terms occupy grades `0` and `2`, odd-degree terms grades `1` and `3`. -/ +structure SU2PermDecomposition (rep : Representation ℂ GaugeGroupI B) + (V : Submodule ℂ B) where + /-- The grade `k` piece of the decomposition. -/ + piece : ZMod 4 → Submodule ℂ B + /-- Each piece is of pure sign under the Weyl element. -/ + piece_le : ∀ k, ∀ x, x ∈ piece k → rep gaugeSU2Perm x = su2PermSign k • x + /-- The pieces exhaust `V`. -/ + iSup_piece : (⨆ k, piece k) = V + +namespace SU2PermDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} + +/-- The grade-`k` piece lies in the `su2PermSign k` eigenspace of the Weyl element. This is + `piece_le` phrased as an inequality of submodules. -/ +lemma piece_le_eigenspace (d : SU2PermDecomposition rep V) (k : ZMod 4) : + d.piece k ≤ Module.End.eigenspace (rep gaugeSU2Perm) (su2PermSign k) := + fun _ hy => Module.End.mem_eigenspace_iff.mpr (d.piece_le k _ hy) + +/-- Transport a decomposition along an equality of submodules. -/ +def copy (d : SU2PermDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + SU2PermDecomposition rep W where + piece := d.piece + piece_le := d.piece_le + iSup_piece := by rw [d.iSup_piece, hW] + +@[simp] +lemma copy_piece (d : SU2PermDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + (d.copy W hW).piece = d.piece := rfl + +/-! + +## D. Joins + +-/ + +/-- The join of two decompositions: the pieces and suprema combine gradewise, decomposing + `V ⊔ V'`. -/ +noncomputable def sup (d : SU2PermDecomposition rep V) (d' : SU2PermDecomposition rep V') : + SU2PermDecomposition rep (V ⊔ V') where + piece k := d.piece k ⊔ d'.piece k + piece_le k x hx := + Module.End.mem_eigenspace_iff.mp + (sup_le (d.piece_le_eigenspace k) (d'.piece_le_eigenspace k) hx) + iSup_piece := by + rw [iSup_sup_eq, d.iSup_piece, d'.iSup_piece] + +@[simp] +lemma sup_piece (d : SU2PermDecomposition rep V) (d' : SU2PermDecomposition rep V') + (k : ZMod 4) : (d.sup d').piece k = d.piece k ⊔ d'.piece k := rfl + +/-! + +## E. Products + +-/ + +/-- The product of two decompositions: grades **add** under multiplication, so the grade-`k` + piece of `V * V'` is spanned by the products of pieces whose grades sum to `k`. + + Multiplicativity of the representation is a hypothesis rather than a field: a + `Representation` records only a linear action. -/ +noncomputable def mul (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU2PermDecomposition rep V) (d' : SU2PermDecomposition rep V') : + SU2PermDecomposition rep (V * V') where + piece k := ⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, d.piece k₁ * d'.piece k₂ + piece_le k x hx := by + have key : (⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, d.piece k₁ * d'.piece k₂) + ≤ Module.End.eigenspace (rep gaugeSU2Perm) (su2PermSign k) := by + refine iSup_le fun k₁ => iSup_le fun k₂ => iSup_le fun hk => ?_ + refine Submodule.mul_le.mpr fun m hm n hn => ?_ + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [hmul, d.piece_le k₁ m hm, d'.piece_le k₂ n hn, smul_mul_smul_comm, + ← su2PermSign_add, hk] + exact Module.End.mem_eigenspace_iff.mp (key hx) + iSup_piece := by + refine le_antisymm (iSup_le fun k => iSup_le fun k₁ => iSup_le fun k₂ => + iSup_le fun _ => ?_) ?_ + · exact mul_le_mul' ((le_iSup d.piece k₁).trans d.iSup_piece.le) + ((le_iSup d'.piece k₂).trans d'.iSup_piece.le) + · have hV : (⨆ k₁, d.piece k₁) * (⨆ k₂, d'.piece k₂) = V * V' := by + rw [d.iSup_piece, d'.iSup_piece] + rw [← hV, Submodule.iSup_mul] + refine iSup_le fun k₁ => ?_ + rw [Submodule.mul_iSup] + refine iSup_le fun k₂ => ?_ + exact le_iSup_of_le (k₁ + k₂) + (le_iSup_of_le k₁ (le_iSup_of_le k₂ (le_iSup_of_le rfl le_rfl))) + +lemma mul_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU2PermDecomposition rep V) (d' : SU2PermDecomposition rep V') (k : ZMod 4) : + (d.mul hmul d').piece k = ⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, d.piece k₁ * d'.piece k₂ := rfl + +/-- The grade-`k` piece of a product, with the second grade solved for: the double join + collapses to a single one. -/ +lemma mul_piece_eq_sub + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU2PermDecomposition rep V) (d' : SU2PermDecomposition rep V') (k : ZMod 4) : + (d.mul hmul d').piece k = ⨆ k₁, d.piece k₁ * d'.piece (k - k₁) := by + rw [mul_piece] + refine le_antisymm (iSup_le fun k₁ => iSup_le fun k₂ => iSup_le fun hk => ?_) ?_ + · exact le_iSup_of_le k₁ (by rw [eq_sub_of_add_eq' hk]) + · exact iSup_le fun k₁ => + le_iSup_of_le k₁ (le_iSup_of_le (k - k₁) (le_iSup_of_le (add_sub_cancel k₁ k) le_rfl)) + +/-- **The grade-`k` piece of a product, written out.** `ZMod 4` has four elements, so the + join is a four-term one. -/ +lemma mul_piece_eq (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU2PermDecomposition rep V) (d' : SU2PermDecomposition rep V') (k : ZMod 4) : + (d.mul hmul d').piece k + = d.piece 0 * d'.piece k ⊔ d.piece 1 * d'.piece (k - 1) + ⊔ d.piece 2 * d'.piece (k - 2) ⊔ d.piece 3 * d'.piece (k - 3) := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + rw [mul_piece_eq_sub] + refine le_antisymm (iSup_le fun k₁ => ?_) (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) + · rcases hcases k₁ with rfl | rfl | rfl | rfl + · rw [sub_zero] + exact le_sup_of_le_left (le_sup_of_le_left le_sup_left) + · exact le_sup_of_le_left (le_sup_of_le_left le_sup_right) + · exact le_sup_of_le_left le_sup_right + · exact le_sup_right + · exact le_iSup_of_le 0 (by rw [sub_zero]) + · exact le_iSup_of_le 1 le_rfl + · exact le_iSup_of_le 2 le_rfl + · exact le_iSup_of_le 3 le_rfl + +/-- The unit submodule has grade zero: the identity of `B` is fixed by every gauge + transformation, provided the representation preserves the unit. -/ +noncomputable def one (hone : ∀ g : GaugeGroupI, rep g 1 = 1) : + SU2PermDecomposition rep (1 : Submodule ℂ B) where + piece k := if k = 0 then 1 else ⊥ + piece_le := by + intro k x hx + rcases eq_or_ne k 0 with rfl | hk + · rw [if_pos rfl, Submodule.one_eq_span, Submodule.mem_span_singleton] at hx + obtain ⟨c, rfl⟩ := hx + rw [map_smul, hone, su2PermSign_zero, one_smul] + · rw [if_neg hk, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + refine le_antisymm (iSup_le fun k => ?_) (le_iSup_of_le 0 (le_of_eq (if_pos rfl).symm)) + by_cases hk : k = 0 + · rw [if_pos hk] + · rw [if_neg hk] + exact bot_le + +@[simp] +lemma one_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) (k : ZMod 4) : + (one (B := B) (rep := rep) hone).piece k = if k = 0 then 1 else ⊥ := rfl + +/-- Powers of a decomposed submodule: grades add, so `V ^ n` inherits a decomposition, built + by iterating `mul` from `one`. -/ +noncomputable def pow (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU2PermDecomposition rep V) : + (n : ℕ) → SU2PermDecomposition rep (V ^ n) + | 0 => (one hone).copy _ (pow_zero V) + | (n + 1) => ((pow hone hmul d n).mul hmul d).copy _ (pow_succ V n) + +@[simp] +lemma pow_zero_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU2PermDecomposition rep V) (k : ZMod 4) : + (d.pow hone hmul 0).piece k = if k = 0 then 1 else ⊥ := rfl + +@[simp] +lemma pow_succ_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU2PermDecomposition rep V) (n : ℕ) (k : ZMod 4) : + (d.pow hone hmul (n + 1)).piece k + = ⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, (d.pow hone hmul n).piece k₁ * d.piece k₂ := rfl + +/-! + +## F. Invariants + +-/ + +/-- **A gauge-invariant element has grade zero.** Only invariance under the single Weyl + element `gaugeSU2Perm` is used: the other pieces lie in eigenspaces at `i`, `-1` and `-i`, + all distinct from `1`. + + There is no converse; see the warning in the module docstring. -/ +lemma mem_zero_of_invariant (d : SU2PermDecomposition rep V) {x : B} (hx : x ∈ V) + (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ d.piece 0 := by + have hdisj : Disjoint + (Module.End.eigenspace (rep gaugeSU2Perm) (su2PermSign 0)) + (⨆ k, ⨆ _ : k ≠ (0 : ZMod 4), d.piece k) := + (((Module.End.eigenspaces_iSupIndep (rep gaugeSU2Perm : Module.End ℂ B)).comp + su2PermSign_injective) 0).mono_right (iSup₂_mono fun k _ => d.piece_le_eigenspace k) + have key : (⨆ k, d.piece k) + ⊓ Module.End.eigenspace (rep gaugeSU2Perm) (su2PermSign 0) ≤ d.piece 0 := by + rw [iSup_split_single d.piece 0, sup_inf_assoc_of_le _ (d.piece_le_eigenspace 0)] + exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) + refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ + · rw [d.iSup_piece] + exact hx + · rw [su2PermSign_zero, one_smul] + exact hV _ + +end SU2PermDecomposition +end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index beed33bd1..f1536c98d 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv @@ -636,6 +637,352 @@ lemma scalarPotentialSubmoduleGaugeWeight_peice_zero (h : IsHiggsAlgebraValued B simp only [sup_idem] +/-! + +## SU(2) permutation decomposition + +-/ + +omit rep_mul in +/-- The Weyl element sends `H⁰` to `H¹`. -/ +lemma rep_gaugeSU2Perm_higgsComponent_zero : + rep gaugeSU2Perm (h.higgsComponent 0) = h.higgsComponent 1 := by + rw [h.rep_higgsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, + Fin.sum_univ_two] + +omit rep_mul in +/-- The Weyl element sends `H¹` to `-H⁰`. -/ +lemma rep_gaugeSU2Perm_higgsComponent_one : + rep gaugeSU2Perm (h.higgsComponent 1) = -h.higgsComponent 0 := by + rw [h.rep_higgsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, + Fin.sum_univ_two] + +omit rep_mul in +/-- The Weyl element sends `H̄⁰` to `H̄¹`. -/ +lemma rep_gaugeSU2Perm_barHiggsComponent_zero : + rep gaugeSU2Perm (h.barHiggsComponent 0) = h.barHiggsComponent 1 := by + rw [h.rep_barHiggsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, + Fin.sum_univ_two] + +omit rep_mul in +/-- The Weyl element sends `H̄¹` to `-H̄⁰`. -/ +lemma rep_gaugeSU2Perm_barHiggsComponent_one : + rep gaugeSU2Perm (h.barHiggsComponent 1) = -h.barHiggsComponent 0 := by + rw [h.rep_barHiggsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, + Fin.sum_univ_two] + +/-- **The Weyl decomposition of the zero-weight quadratic.** The Weyl element exchanges + `H⁰H̄⁰` and `H¹H̄¹`, so the two-dimensional space `higgsQuadraticZeroGaugeWeight` splits + into the even line spanned by `H⁰H̄⁰ + H¹H̄¹` — this is `H†H`, the genuine invariant — and + the odd line spanned by `H⁰H̄⁰ - H¹H̄¹`, which is `H†σ³H`, the neutral component of the + isospin triplet. Only the first survives `mem_zero_of_invariant`. -/ +noncomputable def higgsQuadraticZeroGaugeWeightSU2Perm (h : IsHiggsAlgebraValued B rep H barH) : + SU2PermDecomposition rep h.higgsQuadraticZeroGaugeWeight where + piece := fun w => + if w = 0 then Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1} + else if w = 2 then Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1} + else ⊥ + piece_le := by + have hplus : rep gaugeSU2Perm (h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1) + = h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1 := by + rw [map_add, rep_mul, rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, + h.rep_gaugeSU2Perm_barHiggsComponent_zero, h.rep_gaugeSU2Perm_higgsComponent_one, + h.rep_gaugeSU2Perm_barHiggsComponent_one, neg_mul_neg, add_comm] + have hminus : rep gaugeSU2Perm (h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1) + = -(h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1) := by + rw [map_sub, rep_mul, rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, + h.rep_gaugeSU2Perm_barHiggsComponent_zero, h.rep_gaugeSU2Perm_higgsComponent_one, + h.rep_gaugeSU2Perm_barHiggsComponent_one, neg_mul_neg, neg_sub] + intro k x hx + rcases eq_or_ne k 0 with rfl | hk0 + · rw [if_pos rfl, Submodule.mem_span_singleton] at hx + obtain ⟨c, rfl⟩ := hx + rw [map_smul, hplus, su2PermSign_zero, one_smul] + · rcases eq_or_ne k 2 with rfl | hk2 + · rw [if_neg hk0, if_pos rfl, Submodule.mem_span_singleton] at hx + obtain ⟨c, rfl⟩ := hx + rw [map_smul, hminus, su2PermSign_two, smul_neg, neg_smul, one_smul] + · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) ?_ + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [if_pos rfl, higgsQuadraticZeroGaugeWeight, Submodule.span_le, + Set.singleton_subset_iff] + exact Submodule.add_mem _ (Submodule.subset_span (by simp)) + (Submodule.subset_span (by simp)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [if_neg (by decide), if_pos rfl, higgsQuadraticZeroGaugeWeight, Submodule.span_le, + Set.singleton_subset_iff] + exact Submodule.sub_mem _ (Submodule.subset_span (by simp)) + (Submodule.subset_span (by simp)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · refine le_trans ?_ (sup_le (le_iSup _ (0 : ZMod 4)) (le_iSup _ (2 : ZMod 4))) + rw [if_pos rfl, if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl, + higgsQuadraticZeroGaugeWeight, Submodule.span_le] + have hp := Submodule.mem_sup_left (S := Submodule.span ℂ + {h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1}) + (T := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1}) + (Submodule.mem_span_singleton_self _) + have hm := Submodule.mem_sup_right (S := Submodule.span ℂ + {h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1}) + (T := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1}) + (Submodule.mem_span_singleton_self _) + rintro x (rfl | rfl) + · have hs := Submodule.smul_mem _ (2⁻¹ : ℂ) (Submodule.add_mem _ hp hm) + rwa [show (2⁻¹ : ℂ) • ((h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1) + + (h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1)) + = h.higgsComponent 0 * h.barHiggsComponent 0 from by module] at hs + · have hs := Submodule.smul_mem _ (2⁻¹ : ℂ) (Submodule.sub_mem _ hp hm) + rwa [show (2⁻¹ : ℂ) • ((h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1) + - (h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1)) + = h.higgsComponent 1 * h.barHiggsComponent 1 from by module] at hs + +/-- **The Weyl decomposition of the invariant candidates.** Read straight off + `scalarPotentialSubmoduleGaugeWeight_peice_zero`: the constants contribute `one`, the + quadratic `H†H` sector contributes `higgsQuadraticZeroGaugeWeightSU2Perm`, the quartic + sector is its `mul` with itself, and the three are joined by `sup`. -/ +noncomputable def scalarPotentialSubmoduleGaugeWeightZeroSU2Perm + (h : IsHiggsAlgebraValued B rep H barH) : + SU2PermDecomposition rep ((h.scalarPotentialSubmoduleGaugeWeight rep_mul).piece 0) := + let d := h.higgsQuadraticZeroGaugeWeightSU2Perm rep_mul + (((SU2PermDecomposition.one (fun g => map_one (h.repAlgHom rep_mul g))).sup d).sup + (d.mul rep_mul d)).copy _ + (h.scalarPotentialSubmoduleGaugeWeight_peice_zero rep_mul) + +/-- The gauge-invariant quadratic `H†H`, the Higgs mass term. -/ +noncomputable def massTerm : B := h.higgsComponent 0 * h.barHiggsComponent 0 + + h.higgsComponent 1 * h.barHiggsComponent 1 + +/-- The neutral component `H†σ³H` of the isospin triplet. It has gauge weight zero and is + odd under the Weyl element, so it is discarded by `SU2PermDecomposition`; its *square* is + even, and survives both sieves without being gauge invariant. -/ +noncomputable def tripletTerm : B := h.higgsComponent 0 * h.barHiggsComponent 0 + - h.higgsComponent 1 * h.barHiggsComponent 1 + +/-- **The mass term is gauge invariant.** `H†H` is fixed by every gauge transformation: + the hypercharge phases cancel between `H` and `H̄`, and the `SU(2)` matrix cancels against + its conjugate by unitarity. -/ +lemma massTerm_invariant (h : IsHiggsAlgebraValued B rep H barH) (g : GaugeGroupI) : + rep g h.massTerm = h.massTerm := by + have hu : ((g⁻¹).toU1 : ℂ) * (starRingEnd ℂ) ((g⁻¹).toU1 : ℂ) = 1 := + Unitary.mul_star_self_of_mem (g⁻¹).toU1.2 + have hM : star ((g⁻¹).toSU2.1) * (g⁻¹).toSU2.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (g⁻¹).toSU2.2.1 + have hM00 := congrFun (congrFun hM 0) 0 + have hM01 := congrFun (congrFun hM 0) 1 + have hM10 := congrFun (congrFun hM 1) 0 + have hM11 := congrFun (congrFun hM 1) 1 + simp only [Matrix.mul_apply, Fin.sum_univ_two, Matrix.one_apply, star_eq_conjTranspose, + Matrix.conjTranspose_apply, reduceIte, Complex.star_def, + show ¬((0 : Fin 2) = 1) from by decide, + show ¬((1 : Fin 2) = 0) from by decide] at hM00 hM01 hM10 hM11 + have hM01' := congrArg (starRingEnd ℂ) hM01 + have hM10' := congrArg (starRingEnd ℂ) hM10 + simp only [map_add, map_mul, Complex.conj_conj, map_zero] at hM01' hM10' + have hu3 : ((g⁻¹).toU1 : ℂ) ^ 3 * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3) = 1 := by + rw [map_pow, ← mul_pow, hu, one_pow] + have key : ∀ a b : ℂ, (((g⁻¹).toU1 : ℂ) ^ 3 * a) * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3 * b) + = a * (starRingEnd ℂ) b := by + intro a b + rw [map_mul] + calc (((g⁻¹).toU1 : ℂ) ^ 3 * a) * ((starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3) + * (starRingEnd ℂ) b) + = (((g⁻¹).toU1 : ℂ) ^ 3 * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3)) + * (a * (starRingEnd ℂ) b) := by ring + _ = a * (starRingEnd ℂ) b := by rw [hu3, one_mul] + rw [massTerm, map_add, rep_mul, rep_mul, h.rep_higgsComponent, h.rep_barHiggsComponent, + h.rep_higgsComponent, h.rep_barHiggsComponent] + simp only [Fin.sum_univ_two, add_mul, mul_add, smul_mul_smul_comm, key] + match_scalars + · linear_combination hM00 + · linear_combination hM10' + · linear_combination hM01' + · linear_combination hM11 + +/-- **The even part of the weight-zero potential terms.** Note the fourth generator: the + quartic sector contributes `odd * odd` as well as `even * even`, so `(H†σ³H)²` is here + alongside `1`, `H†H` and `(H†H)²`. -/ +lemma scalarPotentialSubmoduleGaugeWeightZeroSU2Perm_piece_zero + (h : IsHiggsAlgebraValued B rep H barH) : + (h.scalarPotentialSubmoduleGaugeWeightZeroSU2Perm rep_mul).piece 0 = + Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, + h.tripletTerm * h.tripletTerm} := by + dsimp only [scalarPotentialSubmoduleGaugeWeightZeroSU2Perm, SU2PermDecomposition.copy_piece, + SU2PermDecomposition.sup_piece, SU2PermDecomposition.one_piece] + rw [SU2PermDecomposition.mul_piece_eq] + dsimp only [higgsQuadraticZeroGaugeWeightSU2Perm] + simp only [show ((0 : ZMod 4) - 1) = 3 from by decide, + show ((0 : ZMod 4) - 2) = 2 from by decide, show ((0 : ZMod 4) - 3) = 1 from by decide, + show ¬((1 : ZMod 4) = 0) from by decide, show ¬((1 : ZMod 4) = 2) from by decide, + show ¬((2 : ZMod 4) = 0) from by decide, show ¬((3 : ZMod 4) = 0) from by decide, + show ¬((3 : ZMod 4) = 2) from by decide, + reduceIte, Submodule.mul_bot, sup_bot_eq, + Submodule.span_mul_span, Set.singleton_mul_singleton] + rw [massTerm, tripletTerm, Submodule.one_eq_span] + simp only [Submodule.span_insert, sup_assoc] + +lemma invariant_mem_span_massTerm_of_mem_scalarPotentialSubmodule + (h : IsHiggsAlgebraValued B rep H barH) (x : B) + (hx : x ∈ h.scalarPotentialSubmodule) (x_inv : ∀ g, rep g x = x) : + x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by + have hmem : !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; + (1 - Complex.I) / 2, (1 + Complex.I) / 2] ∈ specialUnitaryGroup (Fin 2) ℂ := by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply, map_div₀, map_ofNat, + Complex.ext_iff] <;> norm_num + · rw [Matrix.det_fin_two_of] + simp [Complex.ext_iff] + norm_num + set g : GaugeGroupI := ⟨1, ⟨_, hmem⟩, 1⟩ with hg + have hginv : ((g⁻¹).toSU2 : Matrix (Fin 2) (Fin 2) ℂ) + = !![(1 + Complex.I)/2, (1 + Complex.I)/2; (-1 + Complex.I)/2, (1 - Complex.I)/2] := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + ext a b + fin_cases a <;> fin_cases b <;> + simp [hg, GaugeGroupI.toSU2, Complex.conj_I, Complex.ext_iff] + have hU1 : ((g⁻¹).toU1 : ℂ) = 1 := by simp [hg, GaugeGroupI.toU1] + have hH0 : rep g (h.higgsComponent 0) + = ((1 + Complex.I)/2) • h.higgsComponent 0 + ((1 + Complex.I)/2) • h.higgsComponent 1 := by + rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hginv] + simp + have hH1 : rep g (h.higgsComponent 1) + = ((-1 + Complex.I)/2) • h.higgsComponent 0 + ((1 - Complex.I)/2) • h.higgsComponent 1 := by + rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hginv] + simp + have hB0 : rep g (h.barHiggsComponent 0) + = ((1 - Complex.I)/2) • h.barHiggsComponent 0 + + ((1 - Complex.I)/2) • h.barHiggsComponent 1 := by + rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hginv] + simp [map_div₀, Complex.conj_I, map_ofNat] + module + have hB1 : rep g (h.barHiggsComponent 1) + = ((-1 - Complex.I)/2) • h.barHiggsComponent 0 + + ((1 + Complex.I)/2) • h.barHiggsComponent 1 := by + rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hginv] + simp [map_div₀, Complex.conj_I, map_ofNat] + module + have hn3 : rep g h.tripletTerm = h.higgsComponent 0 * h.barHiggsComponent 1 + + h.higgsComponent 1 * h.barHiggsComponent 0 := by + rw [tripletTerm, map_sub, rep_mul, rep_mul, hH0, hB0, hH1, hB1] + simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm] + match_scalars <;> simp [Complex.ext_iff] <;> norm_num + have hn1 : rep g (h.higgsComponent 0 * h.barHiggsComponent 1 + + h.higgsComponent 1 * h.barHiggsComponent 0) + = Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 + - h.higgsComponent 1 * h.barHiggsComponent 0) := by + rw [map_add, rep_mul, rep_mul, hH0, hB0, hH1, hB1] + simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm, smul_sub] + match_scalars <;> simp [Complex.ext_iff] <;> norm_num + have hHH : ∀ i j, h.higgsComponent i * h.higgsComponent j + = h.higgsComponent j * h.higgsComponent i := fun i j => (h.H_comm_H _ _).eq + have hbH : ∀ i j, h.barHiggsComponent i * h.higgsComponent j + = h.higgsComponent j * h.barHiggsComponent i := fun i j => (h.H_comm_barH _ _).symm.eq + have hbb : ∀ i j, h.barHiggsComponent i * h.barHiggsComponent j + = h.barHiggsComponent j * h.barHiggsComponent i := fun i j => (h.barH_comm_barH _ _).eq + have hHH' : ∀ i j (y : B), h.higgsComponent i * (h.higgsComponent j * y) + = h.higgsComponent j * (h.higgsComponent i * y) := fun i j y => by + rw [← mul_assoc, hHH, mul_assoc] + have hbH' : ∀ i j (y : B), h.barHiggsComponent i * (h.higgsComponent j * y) + = h.higgsComponent j * (h.barHiggsComponent i * y) := fun i j y => by + rw [← mul_assoc, hbH, mul_assoc] + have fierz : h.tripletTerm * h.tripletTerm + + (h.higgsComponent 0 * h.barHiggsComponent 1 + h.higgsComponent 1 * h.barHiggsComponent 0) + * (h.higgsComponent 0 * h.barHiggsComponent 1 + + h.higgsComponent 1 * h.barHiggsComponent 0) + + (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 + - h.higgsComponent 1 * h.barHiggsComponent 0)) + * (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 + - h.higgsComponent 1 * h.barHiggsComponent 0)) + = h.massTerm * h.massTerm := by + rw [tripletTerm, massTerm] + simp only [sub_mul, mul_sub, add_mul, mul_add, smul_mul_assoc, mul_smul_comm, + mul_assoc, hHH', hbH', hbb] + match_scalars <;> simp [Complex.ext_iff] + have hT3 : ∀ y : B, rep (g * g) y = rep g (rep g y) := by + intro y + rw [map_mul] + rfl + have e1 : rep g (h.tripletTerm * h.tripletTerm) + = (h.higgsComponent 0 * h.barHiggsComponent 1 + h.higgsComponent 1 * h.barHiggsComponent 0) + * (h.higgsComponent 0 * h.barHiggsComponent 1 + + h.higgsComponent 1 * h.barHiggsComponent 0) := by + rw [rep_mul, hn3] + have e2 : rep (g * g) (h.tripletTerm * h.tripletTerm) + = (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 + - h.higgsComponent 1 * h.barHiggsComponent 0)) + * (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 + - h.higgsComponent 1 * h.barHiggsComponent 0)) := by + rw [hT3, e1, rep_mul, hn1] + have hone : ∀ k : GaugeGroupI, rep k (1 : B) = 1 := fun k => map_one (h.repAlgHom rep_mul k) + have hm : ∀ k : GaugeGroupI, rep k h.massTerm = h.massTerm := massTerm_invariant rep_mul h + have hmm : ∀ k : GaugeGroupI, rep k (h.massTerm * h.massTerm) = h.massTerm * h.massTerm := + fun k => by rw [rep_mul, hm] + -- the two sieves put `x` in a four-generator span + have hspan : x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, + h.tripletTerm * h.tripletTerm} := by + rw [← h.scalarPotentialSubmoduleGaugeWeightZeroSU2Perm_piece_zero rep_mul] + exact SU2PermDecomposition.mem_zero_of_invariant _ + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx x_inv) x_inv + -- averaging over the three axes maps that span into the three-generator one + have s1 : (1 : B) ∈ Submodule.span ℂ ({1, h.massTerm, h.massTerm * h.massTerm} : Set B) := + Submodule.subset_span (by simp) + have s2 : h.massTerm ∈ Submodule.span ℂ ({1, h.massTerm, h.massTerm * h.massTerm} : Set B) := + Submodule.subset_span (by simp) + have s3 : h.massTerm * h.massTerm + ∈ Submodule.span ℂ ({1, h.massTerm, h.massTerm * h.massTerm} : Set B) := + Submodule.subset_span (by simp) + set T : B →ₗ[ℂ] B := LinearMap.id + rep g + rep (g * g) with hT + have hTapp : ∀ y : B, T y = y + rep g y + rep (g * g) y := fun y => rfl + have hmaple : Submodule.map T (Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, + h.tripletTerm * h.tripletTerm}) + ≤ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by + rw [Submodule.map_span_le] + rintro y (rfl | rfl | rfl | rfl) <;> rw [hTapp] + · rw [hone, hone] + exact Submodule.add_mem _ (Submodule.add_mem _ s1 s1) s1 + · rw [hm, hm] + exact Submodule.add_mem _ (Submodule.add_mem _ s2 s2) s2 + · rw [hmm, hmm] + exact Submodule.add_mem _ (Submodule.add_mem _ s3 s3) s3 + · rw [e1, e2, fierz] + exact s3 + have hx3 : T x = (3 : ℂ) • x := by + rw [hTapp, x_inv, x_inv] + module + have hfin : (3 : ℂ) • x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by + rw [← hx3] + exact hmaple ⟨x, hspan, rfl⟩ + have hfin' := Submodule.smul_mem _ ((3 : ℂ)⁻¹) hfin + rwa [smul_smul, inv_mul_cancel₀ (by norm_num : (3 : ℂ) ≠ 0), one_smul] at hfin' + end IsHiggsAlgebraValued end StandardModel From 87f74d5cd9f297550641a292b8e12ce622cb06a5 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 24 Aug 2026 06:10:06 +0100 Subject: [PATCH 187/254] feat: Add massWeight --- .../HiggsBoson/AlgebraValued/Basic.lean | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index f1536c98d..bbe857965 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.HiggsBoson.Basic +public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition @@ -69,7 +70,8 @@ open TensorProduct Matrix algebra-valued Higgs from an algebra-valued fermion, whose symbols anticommute. -/ structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] (rep : Representation ℂ GaugeGroupI B) (H : Module.Dual ℂ HiggsVec →ₗ[ℂ] B) - (barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) : Prop where + (barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) + (massWeightPoly : B →ₐ[ℂ] Polynomial B) : Prop where /-- The Higgs symbol carries the dual of the gauge representation on `HiggsVec`: the `SU(2)` index transforms contragrediently, and the hypercharge character by `u⁻³`. -/ H_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ HiggsVec), @@ -84,13 +86,18 @@ structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] H_comm_barH : ∀ φ ψ, Commute (H φ) (barH ψ) /-- Two conjugate Higgs symbols commute. -/ barH_comm_barH : ∀ φ ψ, Commute (barH φ) (barH ψ) + H_massWeight : ∀ φ, massWeightPoly (H φ) = Polynomial.monomial 2 (H φ) + barH_massWeight : ∀ φ, massWeightPoly (barH φ) = Polynomial.monomial 2 (barH φ) + namespace IsHiggsAlgebraValued variable {B : Type*} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {H : Module.Dual ℂ HiggsVec →ₗ[ℂ] B} {barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} - (h : IsHiggsAlgebraValued B rep H barH) + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) + /-! @@ -106,7 +113,7 @@ of `HiggsVec` — and, for the conjugate, on the dual of its conjugated basis set_option linter.unusedVariables false in /-- The component symbol `H^i` of the Higgs: the value of the symbol map on the `i`-th covector of the standard basis of `HiggsVec`. -/ -noncomputable def higgsComponent (h : IsHiggsAlgebraValued B rep H barH) (i : Fin 2) : B := +noncomputable def higgsComponent (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (i : Fin 2) : B := H (HiggsVec.orthonormBasis.toBasis.dualBasis i) lemma rep_higgsComponent (g : GaugeGroupI) (i : Fin 2) : @@ -126,7 +133,7 @@ lemma rep_higgsComponent (g : GaugeGroupI) (i : Fin 2) : set_option linter.unusedVariables false in /-- The component symbol `H̄^i` of the conjugate Higgs. -/ -noncomputable def barHiggsComponent (h : IsHiggsAlgebraValued B rep H barH) (i : Fin 2) : B := +noncomputable def barHiggsComponent (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (i : Fin 2) : B := barH (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) lemma rep_barHiggsComponent (g : GaugeGroupI) (i : Fin 2) : @@ -160,7 +167,7 @@ recovered from `h` rather than passed by hand. set_option linter.unusedVariables false in /-- The submodule of `B` spanned by the Higgs symbols `H_φ`: the terms of mass dimension one and hypercharge `+3`. -/ -def higgsSubmodule (h : IsHiggsAlgebraValued B rep H barH) : Submodule ℂ B := +def higgsSubmodule (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : Submodule ℂ B := LinearMap.range H lemma higgsSubmodule_eq_span_higgsComponents : @@ -177,7 +184,7 @@ lemma higgsComponent_mem_higgsSubmodule (i : Fin 2) : set_option linter.unusedVariables false in /-- The submodule of `B` spanned by the conjugate Higgs symbols `H̄_φ`: the terms of mass dimension one and hypercharge `-3`. -/ -def barHiggsSubmodule (h : IsHiggsAlgebraValued B rep H barH) : Submodule ℂ B := +def barHiggsSubmodule (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : Submodule ℂ B := LinearMap.range barH lemma barHiggsSubmodule_eq_span_barHiggsComponents : @@ -274,7 +281,7 @@ set_option linter.unusedVariables false in /-- A gauge transformation as an algebra homomorphism of `B`. Only linearity is built into `Representation`; `rep_mul` supplies multiplicativity, and the unit is preserved because a gauge transformation is invertible. -/ -def repAlgHom (h : IsHiggsAlgebraValued B rep H barH) (g : GaugeGroupI) : B →ₐ[ℂ] B := +def repAlgHom (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (g : GaugeGroupI) : B →ₐ[ℂ] B := AlgHom.ofLinearMap (rep g) (by obtain ⟨c, hc⟩ := (rep.apply_bijective g).2 1 @@ -305,7 +312,7 @@ omit rep_mul in powers `scalarSubmoduleOne ^ k` for `k ≤ 4`; expanding each power distributes over the join, and the Higgs and conjugate-Higgs symbols commute, so every ordered product equals the one with all `H` factors to the left. -/ -lemma scalarPotentialSubmodule_eq_higgs (h : IsHiggsAlgebraValued B rep H barH) : +lemma scalarPotentialSubmodule_eq_higgs (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : h.scalarPotentialSubmodule = 1 ⊔ h.higgsSubmodule ⊔ h.barHiggsSubmodule @@ -418,7 +425,7 @@ omit rep_mul in In particular the zero-weight piece is `⊥`, so `mem_zero_of_invariant` says here that no nonzero term linear in the Higgs is gauge invariant. -/ -noncomputable def higgsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : +noncomputable def higgsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : GaugeWeightDecomposition rep h.higgsSubmodule where piece := fun w => if w = (0, 0, -1, -3) then Submodule.span ℂ {h.higgsComponent 0} @@ -508,7 +515,7 @@ omit rep_mul in As for `higgsSubmoduleGaugeWeight` the zero-weight piece is `⊥`, so no nonzero term linear in the conjugate Higgs is gauge invariant. -/ -noncomputable def barHiggsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : +noncomputable def barHiggsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : GaugeWeightDecomposition rep h.barHiggsSubmodule where piece := fun w => if w = (0, 0, 1, 3) then Submodule.span ℂ {h.barHiggsComponent 0} @@ -562,12 +569,12 @@ noncomputable def barHiggsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H exact Submodule.mem_span_singleton_self _ omit rep_mul in -lemma higgsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH) : +lemma higgsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : (h.higgsSubmoduleGaugeWeight).supp = {(0, 0, -1, -3), (0, 0, 1, -3)} := by rfl omit rep_mul in -lemma barHiggsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH) : +lemma barHiggsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : (h.barHiggsSubmoduleGaugeWeight).supp = {(0, 0, 1, 3), (0, 0, -1, 3)} := by rfl @@ -575,7 +582,7 @@ lemma barHiggsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH) `scalarPotentialSubmodule_eq_higgs`: the unit contributes `one`, the two symbol spans contribute their own decompositions, every product of them is handled by `mul`, and the fifteen summands are joined by `sup`. -/ -noncomputable def scalarPotentialSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : +noncomputable def scalarPotentialSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : GaugeWeightDecomposition rep h.scalarPotentialSubmodule := let d := h.higgsSubmoduleGaugeWeight let d' := h.barHiggsSubmoduleGaugeWeight @@ -596,12 +603,12 @@ noncomputable def scalarPotentialSubmoduleGaugeWeight (h : IsHiggsAlgebraValued (((d'.mul rep_mul d').mul rep_mul d').mul rep_mul d')).copy _ h.scalarPotentialSubmodule_eq_higgs -def higgsQuadraticZeroGaugeWeight (h : IsHiggsAlgebraValued B rep H barH) : Submodule ℂ B := +def higgsQuadraticZeroGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : Submodule ℂ B := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} open GaugeWeightDecomposition in -lemma scalarPotentialSubmoduleGaugeWeight_peice_zero (h : IsHiggsAlgebraValued B rep H barH) : +lemma scalarPotentialSubmoduleGaugeWeight_peice_zero (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : let H2 := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} (h.scalarPotentialSubmoduleGaugeWeight rep_mul).piece 0 = @@ -680,7 +687,7 @@ lemma rep_gaugeSU2Perm_barHiggsComponent_one : into the even line spanned by `H⁰H̄⁰ + H¹H̄¹` — this is `H†H`, the genuine invariant — and the odd line spanned by `H⁰H̄⁰ - H¹H̄¹`, which is `H†σ³H`, the neutral component of the isospin triplet. Only the first survives `mem_zero_of_invariant`. -/ -noncomputable def higgsQuadraticZeroGaugeWeightSU2Perm (h : IsHiggsAlgebraValued B rep H barH) : +noncomputable def higgsQuadraticZeroGaugeWeightSU2Perm (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : SU2PermDecomposition rep h.higgsQuadraticZeroGaugeWeight where piece := fun w => if w = 0 then Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 @@ -765,7 +772,7 @@ noncomputable def higgsQuadraticZeroGaugeWeightSU2Perm (h : IsHiggsAlgebraValued quadratic `H†H` sector contributes `higgsQuadraticZeroGaugeWeightSU2Perm`, the quartic sector is its `mul` with itself, and the three are joined by `sup`. -/ noncomputable def scalarPotentialSubmoduleGaugeWeightZeroSU2Perm - (h : IsHiggsAlgebraValued B rep H barH) : + (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : SU2PermDecomposition rep ((h.scalarPotentialSubmoduleGaugeWeight rep_mul).piece 0) := let d := h.higgsQuadraticZeroGaugeWeightSU2Perm rep_mul (((SU2PermDecomposition.one (fun g => map_one (h.repAlgHom rep_mul g))).sup d).sup @@ -785,7 +792,7 @@ noncomputable def tripletTerm : B := h.higgsComponent 0 * h.barHiggsComponent 0 /-- **The mass term is gauge invariant.** `H†H` is fixed by every gauge transformation: the hypercharge phases cancel between `H` and `H̄`, and the `SU(2)` matrix cancels against its conjugate by unitarity. -/ -lemma massTerm_invariant (h : IsHiggsAlgebraValued B rep H barH) (g : GaugeGroupI) : +lemma massTerm_invariant (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (g : GaugeGroupI) : rep g h.massTerm = h.massTerm := by have hu : ((g⁻¹).toU1 : ℂ) * (starRingEnd ℂ) ((g⁻¹).toU1 : ℂ) = 1 := Unitary.mul_star_self_of_mem (g⁻¹).toU1.2 @@ -826,7 +833,7 @@ lemma massTerm_invariant (h : IsHiggsAlgebraValued B rep H barH) (g : GaugeGroup quartic sector contributes `odd * odd` as well as `even * even`, so `(H†σ³H)²` is here alongside `1`, `H†H` and `(H†H)²`. -/ lemma scalarPotentialSubmoduleGaugeWeightZeroSU2Perm_piece_zero - (h : IsHiggsAlgebraValued B rep H barH) : + (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : (h.scalarPotentialSubmoduleGaugeWeightZeroSU2Perm rep_mul).piece 0 = Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, h.tripletTerm * h.tripletTerm} := by @@ -845,7 +852,7 @@ lemma scalarPotentialSubmoduleGaugeWeightZeroSU2Perm_piece_zero simp only [Submodule.span_insert, sup_assoc] lemma invariant_mem_span_massTerm_of_mem_scalarPotentialSubmodule - (h : IsHiggsAlgebraValued B rep H barH) (x : B) + (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (x : B) (hx : x ∈ h.scalarPotentialSubmodule) (x_inv : ∀ g, rep g x = x) : x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by have hmem : !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; From 1595d6da2dbccb603bb2325feff225d781b5671c Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 24 Aug 2026 06:54:43 +0100 Subject: [PATCH 188/254] refactor: HIggs in terms of mass weight --- .../HiggsBoson/AlgebraValued/Basic.lean | 420 ++++++++++++------ 1 file changed, 292 insertions(+), 128 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index bbe857965..053ecee9f 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -201,119 +201,176 @@ lemma barHiggsComponent_mem_barHiggsSubmodule (i : Fin 2) : /-- The terms of mass dimension exactly one: a Higgs symbol or a conjugate Higgs symbol. -/ def scalarSubmoduleOne : Submodule ℂ B := h.higgsSubmodule ⊔ h.barHiggsSubmodule -/-- **All terms of mass dimension at most `n`** built from the Higgs and its conjugate. -/ -def scalarSubmodule (n : ℕ) : Submodule ℂ B := - ∑ k ∈ Finset.range (n + 1), h.scalarSubmoduleOne ^ k - -@[simp] -lemma scalarSubmodule_zero : h.scalarSubmodule 0 = 1 := by - rw [scalarSubmodule] - simp - -/-- Raising the mass dimension by one adjoins the products of `n + 1` symbols. -/ -lemma scalarSubmodule_succ (n : ℕ) : - h.scalarSubmodule (n + 1) = h.scalarSubmodule n ⊔ h.scalarSubmoduleOne ^ (n + 1) := by - rw [scalarSubmodule, scalarSubmodule, Finset.sum_range_succ, Submodule.add_eq_sup] - -lemma scalarSubmoduleOne_pow_le_scalarSubmodule {k n : ℕ} (hk : k ≤ n) : - h.scalarSubmoduleOne ^ k ≤ h.scalarSubmodule n := by - rw [scalarSubmodule] - exact Finset.single_le_sum (f := fun k => h.scalarSubmoduleOne ^ k) - (fun _ _ => bot_le) (Finset.mem_range.mpr (Nat.lt_succ_of_le hk)) - -lemma scalarSubmoduleOne_le_scalarSubmodule {n : ℕ} (hn : 1 ≤ n) : - h.scalarSubmoduleOne ≤ h.scalarSubmodule n := by - rw [← pow_one h.scalarSubmoduleOne] - exact h.scalarSubmoduleOne_pow_le_scalarSubmodule hn - -/-- All terms in the algebra made from up to four combinations - of `H` and `barH` -/ -def scalarPotentialSubmodule : Submodule ℂ B := h.scalarSubmodule 4 - /-! -## Closure under the gauge action +## The mass weight submodules -Each of the submodules above is *stable* under the gauge action on `B`: a gauge -transformation moves a Higgs symbol to a combination of Higgs symbols and nothing else. For -the two spans of symbols and their join this is exactly the equivariance recorded in -`IsHiggsAlgebraValued`. For the higher mass dimensions it needs, in addition, that a gauge -transformation acts on `B` by an *algebra* map; that is not among the fields of -`IsHiggsAlgebraValued`, so it is taken as the hypothesis `rep_mul` below — the analogue of -`IsGaugeField.gauge_mul` — and packaged as `repAlgHom`, after which `Submodule.mapHom` -carries the closure through products, powers and sums. +A Lagrangian term is constrained by its mass dimension, and the mass-weight scaling records +that counting intrinsically: `massWeightPoly` places the part of a term of mass weight `w` +in degree `w`, so a term has mass weight at most `n` exactly when its mass-weight polynomial +is its own truncation at degree `n`. A Higgs symbol carries mass weight two, so a term of +mass dimension `d` is one of mass weight `2 * d`, and the scalar potential — the terms of +mass dimension at most four — is `higgsMassWeightSubmodule 8`. -/ -lemma higgsSubmodule_map_le (g : GaugeGroupI) : - h.higgsSubmodule.map (rep g) ≤ h.higgsSubmodule := by - rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ - exact ⟨HiggsVec.repGaugeGroupI.dual g φ, (h.H_equivariant g φ).symm⟩ - -lemma barHiggsSubmodule_map_le (g : GaugeGroupI) : - h.barHiggsSubmodule.map (rep g) ≤ h.barHiggsSubmodule := by - rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ - exact ⟨HiggsVec.repGaugeGroupI.conj.dual g φ, (h.barH_equivariant g φ).symm⟩ - -/-- The Higgs symbols are closed under the gauge action.-/ -lemma higgsSubmodule_closure (g : GaugeGroupI) : - h.higgsSubmodule.map (rep g) = h.higgsSubmodule := - le_antisymm (h.higgsSubmodule_map_le g) fun b hb => - ⟨rep g⁻¹ b, h.higgsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ - -/-- The conjugate Higgs symbols are closed under the gauge action. -/ -lemma barHiggsSubmodule_closure (g : GaugeGroupI) : - h.barHiggsSubmodule.map (rep g) = h.barHiggsSubmodule := - le_antisymm (h.barHiggsSubmodule_map_le g) fun b hb => - ⟨rep g⁻¹ b, h.barHiggsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ - -/-- The mass-dimension-one terms are closed under the gauge action. -/ -lemma scalarSubmoduleOne_closure (g : GaugeGroupI) : - h.scalarSubmoduleOne.map (rep g) = h.scalarSubmoduleOne := by - rw [scalarSubmoduleOne, Submodule.map_sup, h.higgsSubmodule_closure g, - h.barHiggsSubmodule_closure g] - -variable (rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), - rep g (b₁ * b₂) = rep g b₁ * rep g b₂) -include rep_mul - set_option linter.unusedVariables false in -/-- A gauge transformation as an algebra homomorphism of `B`. Only linearity is built into - `Representation`; `rep_mul` supplies multiplicativity, and the unit is preserved because a - gauge transformation is invertible. -/ -def repAlgHom (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (g : GaugeGroupI) : B →ₐ[ℂ] B := - AlgHom.ofLinearMap (rep g) - (by - obtain ⟨c, hc⟩ := (rep.apply_bijective g).2 1 - calc rep g 1 = rep g 1 * rep g c := by rw [hc, mul_one] - _ = rep g (1 * c) := (rep_mul g 1 c).symm - _ = 1 := by rw [one_mul, hc]) - (rep_mul g) - -lemma repAlgHom_toLinearMap (g : GaugeGroupI) : - (h.repAlgHom rep_mul g).toLinearMap = rep g := rfl - -/-- The terms of mass dimension at most `n` are closed under the gauge action. -/ -lemma scalarSubmodule_closure (g : GaugeGroupI) (n : ℕ) : - (h.scalarSubmodule n).map (rep g) = h.scalarSubmodule n := by - have hmap : ∀ S : Submodule ℂ B, - S.map (rep g) = Submodule.mapHom (h.repAlgHom rep_mul g) S := fun _ => rfl - rw [scalarSubmodule, hmap, map_sum] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [map_pow, ← hmap, h.scalarSubmoduleOne_closure g] - -/-- The scalar potential terms are closed under the gauge action. -/ -lemma scalarPotentialSubmodule_closure (g : GaugeGroupI) : - (h.scalarPotentialSubmodule).map (rep g) = h.scalarPotentialSubmodule := - h.scalarSubmodule_closure rep_mul g 4 - -omit rep_mul in -/-- **The scalar potential terms, written out.** `scalarSubmodule 4` is the join of the - powers `scalarSubmoduleOne ^ k` for `k ≤ 4`; expanding each power distributes over the - join, and the Higgs and conjugate-Higgs symbols commute, so every ordered product equals - the one with all `H` factors to the left. -/ -lemma scalarPotentialSubmodule_eq_higgs (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - h.scalarPotentialSubmodule = +/-- All terms created from Higgs fields of mass weight less then n. -/ +noncomputable def higgsMassWeightSubmodule (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) + (n : ℕ) : + Submodule ℂ B := + (Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)))).toSubmodule + ⊓ Submodule.comap massWeightPoly.toLinearMap + ((Polynomial.degreeLE B (n : WithBot ℕ)).restrictScalars ℂ) + +/-- Membership in `higgsMassWeightSubmodule`, unfolded: a term of the subalgebra generated + by the symbols whose mass-weight polynomial has degree at most `n`. -/ +lemma mem_higgsMassWeightSubmodule {n : ℕ} {x : B} : + x ∈ h.higgsMassWeightSubmodule n ↔ + x ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ))) ∧ + (massWeightPoly x).degree ≤ (n : WithBot ℕ) := + Submodule.mem_inf.trans (and_congr_right fun _ => Polynomial.mem_degreeLE) + +/-- A term of mass dimension one has mass weight two: its mass-weight polynomial is a + monomial of degree two. -/ +lemma massWeightPoly_of_mem_scalarSubmoduleOne {y : B} (hy : y ∈ h.scalarSubmoduleOne) : + massWeightPoly y = Polynomial.monomial 2 y := by + obtain ⟨_, ⟨φ, rfl⟩, _, ⟨ψ, rfl⟩, rfl⟩ := Submodule.mem_sup.1 hy + simp [map_add, h.H_massWeight, h.barH_massWeight] + +/-- A product of `k` symbols has mass weight `2 * k`. -/ +lemma massWeightPoly_of_mem_pow (k : ℕ) {y : B} (hy : y ∈ h.scalarSubmoduleOne ^ k) : + massWeightPoly y = Polynomial.monomial (2 * k) y := by + induction k generalizing y with + | zero => + rw [pow_zero] at hy + obtain ⟨c, rfl⟩ := Submodule.mem_one.1 hy + simp [AlgHom.commutes] + | succ k ih => + rw [pow_succ] at hy + refine Submodule.mul_induction_on hy (fun a ha b hb => ?_) (fun x y hx hy => ?_) + · rw [show 2 * (k + 1) = 2 * k + 2 from by omega, map_mul, ih ha, + h.massWeightPoly_of_mem_scalarSubmoduleOne hb, Polynomial.monomial_mul_monomial] + · simp [map_add, hx, hy] + +/-- A product of `k` symbols has mass weight `2 * k`, so it is a term of mass weight at + most `n` as soon as `2 * k ≤ n`. -/ +lemma scalarSubmoduleOne_pow_le_higgsMassWeightSubmodule {k n : ℕ} (hk : 2 * k ≤ n) : + h.scalarSubmoduleOne ^ k ≤ h.higgsMassWeightSubmodule n := by + have hsub : h.scalarSubmoduleOne ≤ (Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ + Set.range (fun φ => (barH φ)))).toSubmodule := by + refine sup_le ?_ ?_ + · rintro _ ⟨φ, rfl⟩ + exact Algebra.subset_adjoin (Or.inl ⟨φ, rfl⟩) + · rintro _ ⟨φ, rfl⟩ + exact Algebra.subset_adjoin (Or.inr ⟨φ, rfl⟩) + have hadj : ∀ m : ℕ, h.scalarSubmoduleOne ^ m ≤ (Algebra.adjoin ℂ + (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)))).toSubmodule := by + intro m + induction m with + | zero => + rw [pow_zero] + rintro x hx + obtain ⟨c, rfl⟩ := Submodule.mem_one.1 hx + exact Subalgebra.algebraMap_mem _ c + | succ m ih => + rw [pow_succ] + refine Submodule.mul_le.2 fun a ha b hb => ?_ + show a * b ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ + Set.range (fun φ => (barH φ))) + exact mul_mem (ih ha) (hsub hb) + intro y hy + refine h.mem_higgsMassWeightSubmodule.2 ⟨hadj k hy, ?_⟩ + rw [h.massWeightPoly_of_mem_pow k hy] + exact (Polynomial.degree_monomial_le _ _).trans (by exact_mod_cast hk) + +/-- **The terms of mass weight at most `2 * n` are the combinations of products of at most + `n` symbols.** One inclusion is the mass-dimension counting read forwards: a product of + `k ≤ n` symbols sits in degree `2 * k`. The other is the counting read backwards, and is + the substance of the statement: the mass-weight polynomial of a term of the subalgebra is + supported in even degrees, with the coefficient in degree `2 * k` a combination of + products of `k` symbols, and the term is the sum of its own coefficients. A degree bound + therefore caps the number of symbols. -/ +lemma higgsMassWeightSubmodule_eq_sum_pow (n : ℕ) : + h.higgsMassWeightSubmodule (2 * n) + = ∑ k ∈ Finset.range (n + 1), h.scalarSubmoduleOne ^ k := by + refine le_antisymm (fun x hx => ?_) ?_ + · obtain ⟨hadj, hdeg⟩ := h.mem_higgsMassWeightSubmodule.1 hx + have hmul : ∀ p q : Polynomial B, (p * q).eval 1 = p.eval 1 * q.eval 1 := fun _ _ => + Polynomial.eval₂_mul_noncomm _ _ fun _ => Commute.one_right _ + have key : ∀ y ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ + Set.range (fun φ => (barH φ))), (massWeightPoly y).eval 1 = y ∧ + (∀ j, (massWeightPoly y).coeff j ∈ h.scalarSubmoduleOne ^ (j / 2)) ∧ + (∀ j, ¬ 2 ∣ j → (massWeightPoly y).coeff j = 0) := by + intro y hy + induction hy using Algebra.adjoin_induction with + | mem y hy => + have hy1 : y ∈ h.scalarSubmoduleOne := by + rcases hy with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · exact Submodule.mem_sup_left (LinearMap.mem_range_self _ _) + · exact Submodule.mem_sup_right (LinearMap.mem_range_self _ _) + rw [h.massWeightPoly_of_mem_scalarSubmoduleOne hy1] + refine ⟨by simp, fun j => ?_, fun j hj => ?_⟩ + · rw [Polynomial.coeff_monomial] + split_ifs with h2 + · subst h2 + simpa using hy1 + · exact zero_mem _ + · rw [Polynomial.coeff_monomial, if_neg (by omega)] + | algebraMap c => + rw [AlgHom.commutes, show algebraMap ℂ (Polynomial B) c + = Polynomial.C (algebraMap ℂ B c) from rfl] + refine ⟨by simp, fun j => ?_, fun j hj => ?_⟩ + · rcases Nat.eq_zero_or_pos j with rfl | hj0 + · simp + · rw [Polynomial.coeff_C, if_neg (by omega)] + exact zero_mem _ + · rw [Polynomial.coeff_C, if_neg (by omega)] + | add y z _ _ ihy ihz => + rw [map_add] + exact ⟨by rw [Polynomial.eval_add, ihy.1, ihz.1], + fun j => by rw [Polynomial.coeff_add]; exact add_mem (ihy.2.1 j) (ihz.2.1 j), + fun j hj => by rw [Polynomial.coeff_add, ihy.2.2 j hj, ihz.2.2 j hj, add_zero]⟩ + | mul y z _ _ ihy ihz => + rw [map_mul] + refine ⟨by rw [hmul, ihy.1, ihz.1], fun j => ?_, fun j hj => ?_⟩ + · rw [Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun q hq => ?_ + have hq' : q.1 + q.2 = j := Finset.mem_antidiagonal.1 hq + by_cases ha : 2 ∣ q.1 + · by_cases hb : 2 ∣ q.2 + · rw [show j / 2 = q.1 / 2 + q.2 / 2 from by omega, pow_add] + exact Submodule.mul_mem_mul (ihy.2.1 _) (ihz.2.1 _) + · rw [ihz.2.2 _ hb, mul_zero] + exact zero_mem _ + · rw [ihy.2.2 _ ha, zero_mul] + exact zero_mem _ + · rw [Polynomial.coeff_mul] + refine Finset.sum_eq_zero fun q hq => ?_ + have hq' : q.1 + q.2 = j := Finset.mem_antidiagonal.1 hq + by_cases ha : 2 ∣ q.1 + · rw [ihz.2.2 _ (by omega), mul_zero] + · rw [ihy.2.2 _ ha, zero_mul] + obtain ⟨heval, hcoeff, -⟩ := key x hadj + rw [← heval, Polynomial.eval_eq_sum_range' + (Nat.lt_succ_of_le (Polynomial.natDegree_le_iff_degree_le.2 hdeg))] + refine Submodule.sum_mem _ fun i hi => ?_ + have hi' := Finset.mem_range.1 hi + rw [one_pow, mul_one] + exact Finset.single_le_sum (f := fun k => h.scalarSubmoduleOne ^ k) + (fun _ _ => bot_le) (Finset.mem_range.mpr (by omega)) (hcoeff i) + · refine Finset.sum_induction _ (· ≤ h.higgsMassWeightSubmodule (2 * n)) + (fun a b ha hb => by rw [Submodule.add_eq_sup]; exact sup_le ha hb) bot_le fun k hk => ?_ + exact h.scalarSubmoduleOne_pow_le_higgsMassWeightSubmodule + (by have := Finset.mem_range.1 hk; omega) + +/-- **The terms of mass weight at most eight, written out.** A Higgs symbol carries mass + weight two, so mass weight eight is mass dimension four: the join of the powers + `scalarSubmoduleOne ^ k` for `k ≤ 4`. Expanding each power distributes over the join, and + the Higgs and conjugate-Higgs symbols commute, so every ordered product equals the one + with all `H` factors to the left. -/ +lemma higgsMassWeightSubmodule_eq_higgs : + h.higgsMassWeightSubmodule 8 = 1 ⊔ h.higgsSubmodule ⊔ h.barHiggsSubmodule ⊔ h.higgsSubmodule * h.higgsSubmodule @@ -369,13 +426,119 @@ lemma scalarPotentialSubmodule_eq_higgs (h : IsHiggsAlgebraValued B rep H barH m Submodule.sup_mul, Submodule.mul_sup, Submodule.mul_sup, Submodule.mul_sup, Submodule.mul_sup, s3, s4, s5] simp only [sup_assoc, sup_left_idem] - rw [scalarPotentialSubmodule, scalarSubmodule, Finset.sum_range_succ, Finset.sum_range_succ, - Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_one, Submodule.add_eq_sup, - Submodule.add_eq_sup, Submodule.add_eq_sup, Submodule.add_eq_sup, pow_zero, pow_one, - e2, e3, e4, scalarSubmoduleOne] + rw [show (8 : ℕ) = 2 * 4 from rfl, h.higgsMassWeightSubmodule_eq_sum_pow, + Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_succ, + Finset.sum_range_one, Submodule.add_eq_sup, Submodule.add_eq_sup, Submodule.add_eq_sup, + Submodule.add_eq_sup, pow_zero, pow_one, e2, e3, e4, scalarSubmoduleOne] simp only [sup_assoc] + +/-! + +## Closure under the gauge action + +Each of the submodules above is *stable* under the gauge action on `B`: a gauge +transformation moves a Higgs symbol to a combination of Higgs symbols and nothing else. For +the two spans of symbols and their join this is exactly the equivariance recorded in +`IsHiggsAlgebraValued`. For the higher mass dimensions it needs, in addition, that a gauge +transformation acts on `B` by an *algebra* map; that is not among the fields of +`IsHiggsAlgebraValued`, so it is taken as the hypothesis `rep_mul` below — the analogue of +`IsGaugeField.gauge_mul` — and packaged as `repAlgHom`, after which `Submodule.mapHom` +carries the closure through products, powers and sums. + +-/ + +lemma higgsSubmodule_map_le (g : GaugeGroupI) : + h.higgsSubmodule.map (rep g) ≤ h.higgsSubmodule := by + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + exact ⟨HiggsVec.repGaugeGroupI.dual g φ, (h.H_equivariant g φ).symm⟩ + +lemma barHiggsSubmodule_map_le (g : GaugeGroupI) : + h.barHiggsSubmodule.map (rep g) ≤ h.barHiggsSubmodule := by + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + exact ⟨HiggsVec.repGaugeGroupI.conj.dual g φ, (h.barH_equivariant g φ).symm⟩ + +/-- The Higgs symbols are closed under the gauge action.-/ +lemma higgsSubmodule_closure (g : GaugeGroupI) : + h.higgsSubmodule.map (rep g) = h.higgsSubmodule := + le_antisymm (h.higgsSubmodule_map_le g) fun b hb => + ⟨rep g⁻¹ b, h.higgsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + +/-- The conjugate Higgs symbols are closed under the gauge action. -/ +lemma barHiggsSubmodule_closure (g : GaugeGroupI) : + h.barHiggsSubmodule.map (rep g) = h.barHiggsSubmodule := + le_antisymm (h.barHiggsSubmodule_map_le g) fun b hb => + ⟨rep g⁻¹ b, h.barHiggsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + +/-- The mass-dimension-one terms are closed under the gauge action. -/ +lemma scalarSubmoduleOne_closure (g : GaugeGroupI) : + h.scalarSubmoduleOne.map (rep g) = h.scalarSubmoduleOne := by + rw [scalarSubmoduleOne, Submodule.map_sup, h.higgsSubmodule_closure g, + h.barHiggsSubmodule_closure g] + +variable (rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + rep g (b₁ * b₂) = rep g b₁ * rep g b₂) +include rep_mul + +set_option linter.unusedVariables false in +/-- A gauge transformation as an algebra homomorphism of `B`. Only linearity is built into + `Representation`; `rep_mul` supplies multiplicativity, and the unit is preserved because a + gauge transformation is invertible. -/ +def repAlgHom (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (g : GaugeGroupI) : B →ₐ[ℂ] B := + AlgHom.ofLinearMap (rep g) + (by + obtain ⟨c, hc⟩ := (rep.apply_bijective g).2 1 + calc rep g 1 = rep g 1 * rep g c := by rw [hc, mul_one] + _ = rep g (1 * c) := (rep_mul g 1 c).symm + _ = 1 := by rw [one_mul, hc]) + (rep_mul g) + +lemma repAlgHom_toLinearMap (g : GaugeGroupI) : + (h.repAlgHom rep_mul g).toLinearMap = rep g := rfl + +lemma higgsMassWeightSubmodule_closure (g : GaugeGroupI) (n : ℕ) : + (h.higgsMassWeightSubmodule n).map (rep g) = h.higgsMassWeightSubmodule n := by + have hgen : ∀ (u : GaugeGroupI) (y : B), + y ∈ Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)) → + rep u y ∈ Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)) := by + rintro u _ (⟨φ, rfl⟩ | ⟨φ, rfl⟩) + · exact Or.inl ⟨_, (h.H_equivariant u φ).symm⟩ + · exact Or.inr ⟨_, (h.barH_equivariant u φ).symm⟩ + have key : ∀ (u : GaugeGroupI) (y : B), + y ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ))) → + rep u y ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ + Set.range (fun φ => (barH φ))) ∧ + massWeightPoly (rep u y) = + Polynomial.mapAlgHom (h.repAlgHom rep_mul u) (massWeightPoly y) := by + intro u y hy + have hf : ∀ b : B, (h.repAlgHom rep_mul u) b = rep u b := fun _ => rfl + induction hy using Algebra.adjoin_induction with + | mem y hy => + refine ⟨Algebra.subset_adjoin (hgen u y hy), ?_⟩ + rcases hy with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · simp [hf, h.H_equivariant, h.H_massWeight] + · simp [hf, h.barH_equivariant, h.barH_massWeight] + | algebraMap c => + have hc : rep u (algebraMap ℂ B c) = algebraMap ℂ B c := + (h.repAlgHom rep_mul u).commutes c + rw [hc] + exact ⟨Subalgebra.algebraMap_mem _ c, by simp [AlgHom.commutes]⟩ + | add y z _ _ ihy ihz => + exact ⟨by rw [map_add]; exact add_mem ihy.1 ihz.1, by simp [ihy.2, ihz.2]⟩ + | mul y z _ _ ihy ihz => + rw [rep_mul] + exact ⟨mul_mem ihy.1 ihz.1, by rw [map_mul, ihy.2, ihz.2, map_mul, map_mul]⟩ + have hle : ∀ u : GaugeGroupI, + (h.higgsMassWeightSubmodule n).map (rep u) ≤ h.higgsMassWeightSubmodule n := by + rintro u _ ⟨y, ⟨hy₁, hy₂⟩, rfl⟩ + refine ⟨(key u y hy₁).1, Polynomial.mem_degreeLE.2 ?_⟩ + show (massWeightPoly (rep u y)).degree ≤ (n : WithBot ℕ) + rw [(key u y hy₁).2, Polynomial.coe_mapAlgHom] + exact Polynomial.degree_map_le.trans (Polynomial.mem_degreeLE.1 hy₂) + exact le_antisymm (hle g) fun b hb => + ⟨rep g⁻¹ b, hle g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + /-! ## Gauge weight decomposition @@ -578,12 +741,13 @@ lemma barHiggsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH m (h.barHiggsSubmoduleGaugeWeight).supp = {(0, 0, 1, 3), (0, 0, -1, 3)} := by rfl -/-- **The gauge weight decomposition of the scalar potential terms.** Read straight off - `scalarPotentialSubmodule_eq_higgs`: the unit contributes `one`, the two symbol spans +/-- **The gauge weight decomposition of the scalar potential terms**, the terms of mass + weight at most eight. Read straight off + `higgsMassWeightSubmodule_eq_higgs`: the unit contributes `one`, the two symbol spans contribute their own decompositions, every product of them is handled by `mul`, and the fifteen summands are joined by `sup`. -/ -noncomputable def scalarPotentialSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - GaugeWeightDecomposition rep h.scalarPotentialSubmodule := +noncomputable def higgsMassWeightGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : + GaugeWeightDecomposition rep (h.higgsMassWeightSubmodule 8) := let d := h.higgsSubmoduleGaugeWeight let d' := h.barHiggsSubmoduleGaugeWeight (((((((((((((((GaugeWeightDecomposition.one (fun g => map_one (h.repAlgHom rep_mul g))).sup @@ -601,19 +765,19 @@ noncomputable def scalarPotentialSubmoduleGaugeWeight (h : IsHiggsAlgebraValued (((d.mul rep_mul d).mul rep_mul d').mul rep_mul d')).sup (((d.mul rep_mul d').mul rep_mul d').mul rep_mul d')).sup (((d'.mul rep_mul d').mul rep_mul d').mul rep_mul d')).copy _ - h.scalarPotentialSubmodule_eq_higgs + h.higgsMassWeightSubmodule_eq_higgs def higgsQuadraticZeroGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : Submodule ℂ B := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} open GaugeWeightDecomposition in -lemma scalarPotentialSubmoduleGaugeWeight_peice_zero (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : +lemma higgsMassWeightGaugeWeight_piece_zero (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : let H2 := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} - (h.scalarPotentialSubmoduleGaugeWeight rep_mul).piece 0 = + (h.higgsMassWeightGaugeWeight rep_mul).piece 0 = 1 ⊔ H2 ⊔ H2 * H2 := by - dsimp only [scalarPotentialSubmoduleGaugeWeight, GaugeWeightDecomposition.copy_piece, + dsimp only [higgsMassWeightGaugeWeight, GaugeWeightDecomposition.copy_piece, GaugeWeightDecomposition.sup_piece, GaugeWeightDecomposition.one_piece, ↓dreduceIte, Submodule.zero_eq_bot] simp (disch := (try simp only [higgsSubmoduleGaugeWeight, barHiggsSubmoduleGaugeWeight, @@ -768,16 +932,16 @@ noncomputable def higgsQuadraticZeroGaugeWeightSU2Perm (h : IsHiggsAlgebraValued = h.higgsComponent 1 * h.barHiggsComponent 1 from by module] at hs /-- **The Weyl decomposition of the invariant candidates.** Read straight off - `scalarPotentialSubmoduleGaugeWeight_peice_zero`: the constants contribute `one`, the + `higgsMassWeightGaugeWeight_piece_zero`: the constants contribute `one`, the quadratic `H†H` sector contributes `higgsQuadraticZeroGaugeWeightSU2Perm`, the quartic sector is its `mul` with itself, and the three are joined by `sup`. -/ -noncomputable def scalarPotentialSubmoduleGaugeWeightZeroSU2Perm +noncomputable def higgsMassWeightGaugeWeightZeroSU2Perm (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - SU2PermDecomposition rep ((h.scalarPotentialSubmoduleGaugeWeight rep_mul).piece 0) := + SU2PermDecomposition rep ((h.higgsMassWeightGaugeWeight rep_mul).piece 0) := let d := h.higgsQuadraticZeroGaugeWeightSU2Perm rep_mul (((SU2PermDecomposition.one (fun g => map_one (h.repAlgHom rep_mul g))).sup d).sup (d.mul rep_mul d)).copy _ - (h.scalarPotentialSubmoduleGaugeWeight_peice_zero rep_mul) + (h.higgsMassWeightGaugeWeight_piece_zero rep_mul) /-- The gauge-invariant quadratic `H†H`, the Higgs mass term. -/ noncomputable def massTerm : B := h.higgsComponent 0 * h.barHiggsComponent 0 @@ -832,12 +996,12 @@ lemma massTerm_invariant (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) /-- **The even part of the weight-zero potential terms.** Note the fourth generator: the quartic sector contributes `odd * odd` as well as `even * even`, so `(H†σ³H)²` is here alongside `1`, `H†H` and `(H†H)²`. -/ -lemma scalarPotentialSubmoduleGaugeWeightZeroSU2Perm_piece_zero +lemma higgsMassWeightGaugeWeightZeroSU2Perm_piece_zero (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - (h.scalarPotentialSubmoduleGaugeWeightZeroSU2Perm rep_mul).piece 0 = + (h.higgsMassWeightGaugeWeightZeroSU2Perm rep_mul).piece 0 = Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, h.tripletTerm * h.tripletTerm} := by - dsimp only [scalarPotentialSubmoduleGaugeWeightZeroSU2Perm, SU2PermDecomposition.copy_piece, + dsimp only [higgsMassWeightGaugeWeightZeroSU2Perm, SU2PermDecomposition.copy_piece, SU2PermDecomposition.sup_piece, SU2PermDecomposition.one_piece] rw [SU2PermDecomposition.mul_piece_eq] dsimp only [higgsQuadraticZeroGaugeWeightSU2Perm] @@ -851,9 +1015,9 @@ lemma scalarPotentialSubmoduleGaugeWeightZeroSU2Perm_piece_zero rw [massTerm, tripletTerm, Submodule.one_eq_span] simp only [Submodule.span_insert, sup_assoc] -lemma invariant_mem_span_massTerm_of_mem_scalarPotentialSubmodule +lemma invariant_mem_span_massTerm_of_mem_higgsMassWeightSubmodule (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (x : B) - (hx : x ∈ h.scalarPotentialSubmodule) (x_inv : ∀ g, rep g x = x) : + (hx : x ∈ h.higgsMassWeightSubmodule 8) (x_inv : ∀ g, rep g x = x) : x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by have hmem : !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; (1 - Complex.I) / 2, (1 + Complex.I) / 2] ∈ specialUnitaryGroup (Fin 2) ℂ := by @@ -955,7 +1119,7 @@ lemma invariant_mem_span_massTerm_of_mem_scalarPotentialSubmodule -- the two sieves put `x` in a four-generator span have hspan : x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, h.tripletTerm * h.tripletTerm} := by - rw [← h.scalarPotentialSubmoduleGaugeWeightZeroSU2Perm_piece_zero rep_mul] + rw [← h.higgsMassWeightGaugeWeightZeroSU2Perm_piece_zero rep_mul] exact SU2PermDecomposition.mem_zero_of_invariant _ (GaugeWeightDecomposition.mem_zero_of_invariant _ hx x_inv) x_inv -- averaging over the three axes maps that span into the three-generator one From 4bd341c86e7b6f798597d6c928e907c533262fe9 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 24 Aug 2026 09:22:51 +0400 Subject: [PATCH 189/254] feat(PauliMatrices): add Pauli trace pairing lemmas, remove SL2C duplicate --- .../Relativity/PauliMatrices/SelfAdjoint.lean | 36 ++++++++++++++++++- Physlib/Relativity/SL2C/Basic.lean | 17 +-------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean b/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean index 41748ad77..f16ddd3b9 100644 --- a/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean +++ b/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean @@ -7,6 +7,7 @@ module public import Physlib.Relativity.PauliMatrices.Basic public import Physlib.Relativity.MinkowskiMatrix +public import Physlib.Mathematics.KroneckerDelta.Basic /-! ## Interaction of Pauli matrices with self-adjoint matrices @@ -15,7 +16,7 @@ public import Physlib.Relativity.MinkowskiMatrix @[expose] public section namespace PauliMatrix -open Matrix Module +open Matrix Module KroneckerDelta /-- The trace of a pauli-matrix multiplied by a self-adjoint `2×2` matrix is real. -/ lemma trace_pauliMatrix_mul_selfAdjoint_re (μ : Fin 1 ⊕ Fin 3) @@ -96,6 +97,12 @@ lemma pauliSelfAdjoint_linearly_independent : LinearIndependent ℝ pauliSelfAdj trace_add, trace_smul, ZeroMemClass.coe_zero, mul_zero, trace_zero] at h1 fin_cases i <;> simpa [pauliMatrix] using h1 +/-- Pauli matrices are orthogonal with respect to the trace pairing: `tr(σ_μ σ_ν) = 2 δ_μν`. -/ +@[simp] +lemma trace_pauliMatrix_mul_pauliMatrix (μ ν : Fin 1 ⊕ Fin 3) : + Matrix.trace (pauliMatrix μ * pauliMatrix ν) = ((2 * kroneckerDelta μ ν : ℕ) : ℂ) := by + fin_cases μ <;> fin_cases ν <;> simp [kroneckerDelta, pauliMatrix] <;> norm_num + /-- The Pauli matrices span all self-adjoint matrices. -/ lemma pauliSelfAdjoint_span : ⊤ ≤ Submodule.span ℝ (Set.range pauliSelfAdjoint) := by refine (Submodule.top_le_span_range_iff_forall_exists_fun ℝ).mpr ?_ @@ -148,6 +155,33 @@ def pauliSelfAdjoint' (i : Fin 1 ⊕ Fin 3) : selfAdjoint (Matrix (Fin 2) (Fin 2 | Sum.inr 1 => ⟨-σ2, by rw [AddSubgroup.neg_mem_iff]; exact pauliMatrix_selfAdjoint _⟩ | Sum.inr 2 => ⟨-σ3, by rw [AddSubgroup.neg_mem_iff]; exact pauliMatrix_selfAdjoint _⟩ +/-- Trace orthogonality of the covariant Pauli basis: + `tr (σ'_a σ'_b) = 2 δ_{a b}`. -/ +lemma trace_pauliSelfAdjoint'_mul (a b : Fin 1 ⊕ Fin 3) : + Matrix.trace ((pauliSelfAdjoint' a).1 * (pauliSelfAdjoint' b).1) = + if a = b then 2 else 0 := by + rcases a with a | a <;> rcases b with b | b <;> + fin_cases a <;> fin_cases b <;> + simp only [pauliSelfAdjoint', Matrix.neg_mul, Matrix.mul_neg, + Matrix.trace_neg, neg_neg, trace_pauliMatrix_mul_pauliMatrix, + KroneckerDelta.kroneckerDelta] <;> + simp + +/-- The trace pairing of a covariant Pauli matrix with an arbitrary matrix, expressed through the +matrix entries. -/ +lemma trace_pauliSelfAdjoint'_mul_apply (l : Fin 1 ⊕ Fin 3) + (N : Matrix (Fin 2) (Fin 2) ℂ) : + Matrix.trace ((pauliSelfAdjoint' l).1 * N) = + match l with + | Sum.inl 0 => N 0 0 + N 1 1 + | Sum.inr 0 => -(N 0 1 + N 1 0) + | Sum.inr 1 => -(Complex.I * (N 0 1 - N 1 0)) + | Sum.inr 2 => -(N 0 0 - N 1 1) := by + rcases l with l | l <;> fin_cases l <;> + simp [pauliSelfAdjoint', pauliMatrix, Matrix.trace, Matrix.mul_apply, + Fin.sum_univ_two, Matrix.diag] <;> + ring + /-- The Pauli matrices where `σi` are negated are linearly independent. -/ lemma pauliSelfAdjoint'_linearly_independent : LinearIndependent ℝ pauliSelfAdjoint' := by apply Fintype.linearIndependent_iff.mpr diff --git a/Physlib/Relativity/SL2C/Basic.lean b/Physlib/Relativity/SL2C/Basic.lean index d7a33da3e..d379397f3 100644 --- a/Physlib/Relativity/SL2C/Basic.lean +++ b/Physlib/Relativity/SL2C/Basic.lean @@ -203,21 +203,6 @@ lemma toSelfAdjointMap_pauliBasis (i : Fin 1 ⊕ Fin 3) : apply congrArg exact Eq.symm (minkowskiMatrix.dual_apply_minkowskiMatrix ((toLorentzGroup M).1) i j) -set_option linter.unusedSimpArgs false in -/-- Trace orthogonality of the covariant Pauli basis: - `tr (σ'_a σ'_b) = 2 δ_{a b}`. -/ -lemma trace_pauliSelfAdjoint'_mul (a b : Fin 1 ⊕ Fin 3) : - Matrix.trace ((PauliMatrix.pauliSelfAdjoint' a).1 * - (PauliMatrix.pauliSelfAdjoint' b).1) = if a = b then 2 else 0 := by - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - simp [PauliMatrix.pauliSelfAdjoint', Matrix.neg_mul, Matrix.mul_neg, - PauliMatrix.σ0_σ0_trace, PauliMatrix.σ0_σ1_trace, PauliMatrix.σ0_σ2_trace, - PauliMatrix.σ0_σ3_trace, PauliMatrix.σ1_σ0_trace, PauliMatrix.σ1_σ1_trace, - PauliMatrix.σ1_σ2_trace, PauliMatrix.σ1_σ3_trace, PauliMatrix.σ2_σ0_trace, - PauliMatrix.σ2_σ1_trace, PauliMatrix.σ2_σ2_trace, PauliMatrix.σ2_σ3_trace, - PauliMatrix.σ3_σ0_trace, PauliMatrix.σ3_σ1_trace, PauliMatrix.σ3_σ2_trace, - PauliMatrix.σ3_σ3_trace] - /-- The matrix elements of the covering map through the trace pairing: `L(M)_{l i} = ½ tr (σ'_l · M σ'_i M†)`. -/ lemma toLorentzGroup_eq_trace (M : SL(2,ℂ)) (l i : Fin 1 ⊕ Fin 3) : @@ -230,7 +215,7 @@ lemma toLorentzGroup_eq_trace (M : SL(2,ℂ)) (l i : Fin 1 ⊕ Fin 3) : simp only [toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, selfAdjoint.val_smul, Matrix.mul_sum, Matrix.trace_sum, Matrix.mul_smul, Matrix.trace_smul, - trace_pauliSelfAdjoint'_mul, smul_ite, smul_zero, Finset.sum_ite_eq, + PauliMatrix.trace_pauliSelfAdjoint'_mul, smul_ite, smul_zero, Finset.sum_ite_eq, Finset.mem_univ, if_true] at h rw [h, real_smul] ring From ab5d87ca7c145a243ab74d261e8e70608d9f037d Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 24 Aug 2026 14:25:03 +0400 Subject: [PATCH 190/254] feat(SL2C): add coordinate-axis rotations file, but keep current rotation definitions --- Physlib.lean | 1 + Physlib/Relativity/SL2C/AxisRotations.lean | 127 +++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 Physlib/Relativity/SL2C/AxisRotations.lean diff --git a/Physlib.lean b/Physlib.lean index 1e42f70b3..298185dcf 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -440,6 +440,7 @@ public import Physlib.Relativity.PauliMatrices.CliffordAlgebra public import Physlib.Relativity.PauliMatrices.Relations public import Physlib.Relativity.PauliMatrices.SelfAdjoint public import Physlib.Relativity.PauliMatrices.ToTensor +public import Physlib.Relativity.SL2C.AxisRotations public import Physlib.Relativity.SL2C.Basic public import Physlib.Relativity.SL2C.SelfAdjoint public import Physlib.Relativity.Special.ProperTime diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean new file mode 100644 index 000000000..a4b8022ff --- /dev/null +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -0,0 +1,127 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Jinzheng Li, Nathaneal Sajan, Joseph Tooby-Smith +-/ +module + +public import Physlib.Relativity.SL2C.Basic +/-! +# Coordinate-axis rotations in `SL(2,ℂ)` + +This file defines chosen `SL(2,ℂ)` rotations carrying the `z`-axis to a selected coordinate axis. +The spatial-axis convention is `0 = x`, `1 = y`, and `2 = z`; consequently, the rotation associated +with axis `2` is the identity. + +Conjugation by these rotations transports a matrix written in the diagonal `z`-axis basis to +the corresponding coordinate-axis basis. This provides the common change of basis used by +coordinate-axis boosts and later constructions based on diagonal representatives. + +The main declarations are: + +- `rotationZToAxis`, the indexed family of rotations; +- `rotationZToAxis_zero_apply` and its companions, their matrix entries; +- `rotationZToAxis_zero_mul_diagonal_mul_inv` and its companions, their action on a + diagonal matrix. +-/ + +@[expose] public section + +namespace Lorentz.SL2C + +open Matrix MatrixGroups + +/-- The `SL(2,ℂ)` rotation carrying the `z`-axis to axis `i`. -/ +noncomputable def rotationZToAxis : Fin 3 → SL(2,ℂ) + | 0 => + ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, -1; 1, 1], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow] + norm_num [← Complex.ofReal_pow, Real.sq_sqrt]⟩ + | 1 => + ⟨(((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, Complex.I; Complex.I, 1], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin, inv_pow, + Complex.I_mul_I] + norm_num [← Complex.ofReal_pow, Real.sq_sqrt]⟩ + | 2 => 1 + +/-- The matrix entries of the rotation carrying the `z`-axis to the `x`-axis. -/ +@[simp] lemma rotationZToAxis_zero_apply (j k : Fin 2) : + (rotationZToAxis 0).1 j k = + ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, -1; 1, 1]) j k := rfl + +/-- The matrix entries of the rotation carrying the `z`-axis to the `y`-axis. -/ +@[simp] lemma rotationZToAxis_one_apply (j k : Fin 2) : + (rotationZToAxis 1).1 j k = + ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, Complex.I; Complex.I, 1]) j k := rfl + +/-- The rotation carrying the `z`-axis to itself is the identity matrix. -/ +@[simp] lemma rotationZToAxis_two_apply (j k : Fin 2) : + (rotationZToAxis 2).1 j k = (1 : Matrix (Fin 2) (Fin 2) ℂ) j k := rfl + +/-- The matrix entries of the inverse rotation from the `x`-axis to the `z`-axis. -/ +@[simp] lemma rotationZToAxis_zero_inv_apply (j k : Fin 2) : + ((rotationZToAxis 0)⁻¹).1 j k = + ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, 1; -1, 1]) j k := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases j <;> fin_cases k <;> simp [rotationZToAxis] + +/-- The matrix entries of the inverse rotation from the `y`-axis to the `z`-axis. -/ +@[simp] lemma rotationZToAxis_one_inv_apply (j k : Fin 2) : + ((rotationZToAxis 1)⁻¹).1 j k = + ((((Real.sqrt 2 : ℝ) : ℂ))⁻¹ • !![1, -Complex.I; -Complex.I, 1]) j k := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases j <;> fin_cases k <;> simp [rotationZToAxis] + +/-- The inverse rotation from the `z`-axis to itself is the identity matrix. -/ +@[simp] lemma rotationZToAxis_two_inv_apply (j k : Fin 2) : + ((rotationZToAxis 2)⁻¹).1 j k = (1 : Matrix (Fin 2) (Fin 2) ℂ) j k := by + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases j <;> fin_cases k <;> simp [rotationZToAxis] + +/-- Conjugating `diag(a, b)` by the rotation to the `x`-axis expresses it in the `x`-axis +basis. -/ +lemma rotationZToAxis_zero_mul_diagonal_mul_inv (a b : ℂ) : + (rotationZToAxis 0).1 * !![a, 0; 0, b] * ((rotationZToAxis 0)⁻¹).1 = + !![(a + b) / 2, (a - b) / 2; (a - b) / 2, (a + b) / 2] := by + have hsqrt_ne : (((Real.sqrt 2 : ℝ) : ℂ)) ≠ 0 := by simp + ext j k + fin_cases j <;> fin_cases k <;> + simp only [Matrix.mul_apply, Fin.sum_univ_two, rotationZToAxis_zero_apply, + rotationZToAxis_zero_inv_apply] <;> + simp <;> + field_simp <;> + norm_num [← Complex.ofReal_pow, Real.sq_sqrt] <;> + ring + +/-- Conjugating `diag(a, b)` by the rotation to the `y`-axis expresses it in the `y`-axis +basis. -/ +lemma rotationZToAxis_one_mul_diagonal_mul_inv (a b : ℂ) : + (rotationZToAxis 1).1 * !![a, 0; 0, b] * ((rotationZToAxis 1)⁻¹).1 = + !![(a + b) / 2, -Complex.I * (a - b) / 2; + Complex.I * (a - b) / 2, (a + b) / 2] := by + have hsqrt_ne : (((Real.sqrt 2 : ℝ) : ℂ)) ≠ 0 := by simp + ext j k + fin_cases j <;> fin_cases k + all_goals + simp only [Matrix.mul_apply, Fin.sum_univ_two, rotationZToAxis_one_apply, + rotationZToAxis_one_inv_apply] + simp only [Fin.zero_eta, Fin.isValue, Matrix.smul_apply, of_apply, cons_val', + cons_val_zero, cons_val_fin_one, smul_eq_mul, mul_one, cons_val_one, mul_zero, + add_zero, zero_add, mul_neg, neg_mul, Fin.mk_one] + field_simp + norm_num [← Complex.ofReal_pow, Real.sq_sqrt] + all_goals ring + +/-- Conjugating `diag(a, b)` by the identity rotation leaves it unchanged. -/ +lemma rotationZToAxis_two_mul_diagonal_mul_inv (a b : ℂ) : + (rotationZToAxis 2).1 * !![a, 0; 0, b] * ((rotationZToAxis 2)⁻¹).1 = + !![a, 0; 0, b] := by + ext j k + fin_cases j <;> fin_cases k <;> + simp only [Matrix.mul_apply, Fin.sum_univ_two, rotationZToAxis_two_apply, + rotationZToAxis_two_inv_apply] <;> + simp [Matrix.one_apply] + +end Lorentz.SL2C + +end From 9e696239f2cb19f7ca07186389d413315f0bb288 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 24 Aug 2026 15:10:00 +0400 Subject: [PATCH 191/254] feat(Relativity): add indexed coordinate axis boost API, but keep the old API --- .../Relativity/LorentzGroup/Boosts/Axis.lean | 148 +++++++++++++++++- 1 file changed, 147 insertions(+), 1 deletion(-) diff --git a/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean b/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean index a530217c7..7082cf047 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.SL2C.Basic +public import Physlib.Relativity.SL2C.AxisRotations public import Physlib.Relativity.PauliMatrices.Basic public import Physlib.Relativity.MinkowskiMatrix /-! @@ -43,6 +43,152 @@ boost weight `k` along an axis when the corresponding one-parameter family acts @[expose] public section +open scoped minkowskiMatrix PauliMatrix +open Matrix MatrixGroups + +namespace Lorentz.SL2C + +/-- The `SL(2,ℂ)` lift of the boost along spatial axis `i`, with `0 = x`, `1 = y`, and +`2 = z`. The parameter `t` is multiplicative, and for `t > 0` the rapidity is `2 * log t`. -/ +noncomputable def boostAxis : Fin 3 → (t : ℝ) → t ≠ 0 → SL(2,ℂ) + | 0, t, ht => + ⟨!![((t : ℂ) + (t : ℂ)⁻¹) / 2, ((t : ℂ) - (t : ℂ)⁻¹) / 2; + ((t : ℂ) - (t : ℂ)⁻¹) / 2, ((t : ℂ) + (t : ℂ)⁻¹) / 2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + field_simp + ring⟩ + | 1, t, ht => + ⟨!![((t : ℂ) + (t : ℂ)⁻¹) / 2, -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2; + Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2, ((t : ℂ) + (t : ℂ)⁻¹) / 2], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have h2 : -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) = + ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + have hI : -Complex.I * Complex.I = 1 := by + rw [neg_mul, Complex.I_mul_I, neg_neg] + calc -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2 * + (Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2) + = (-Complex.I * Complex.I) * + (((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2)) := by + ring + _ = ((t : ℂ) - (t : ℂ)⁻¹) / 2 * (((t : ℂ) - (t : ℂ)⁻¹) / 2) := by + rw [hI, one_mul] + rw [Matrix.det_fin_two_of, h2] + field_simp + ring⟩ + | 2, t, ht => + ⟨!![(t : ℂ), 0; 0, (t : ℂ)⁻¹], by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [Matrix.det_fin_two_of] + simp [mul_inv_cancel₀ htc]⟩ + +/-- The matrix entries of the `SL(2,ℂ)` boost lift along the `x`-axis. -/ +@[simp] lemma boostAxis_zero_apply (t : ℝ) (ht : t ≠ 0) (j k : Fin 2) : + (boostAxis 0 t ht).1 j k = + (!![((t : ℂ) + (t : ℂ)⁻¹) / 2, ((t : ℂ) - (t : ℂ)⁻¹) / 2; + ((t : ℂ) - (t : ℂ)⁻¹) / 2, ((t : ℂ) + (t : ℂ)⁻¹) / 2]) j k := rfl + +/-- The matrix entries of the `SL(2,ℂ)` boost lift along the `y`-axis. -/ +@[simp] lemma boostAxis_one_apply (t : ℝ) (ht : t ≠ 0) (j k : Fin 2) : + (boostAxis 1 t ht).1 j k = + (!![((t : ℂ) + (t : ℂ)⁻¹) / 2, + -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2; + Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2, + ((t : ℂ) + (t : ℂ)⁻¹) / 2]) j k := rfl + +/-- The matrix entries of the diagonal `SL(2,ℂ)` boost lift along the `z`-axis. -/ +@[simp] lemma boostAxis_two_apply (t : ℝ) (ht : t ≠ 0) (j k : Fin 2) : + (boostAxis 2 t ht).1 j k = (!![(t : ℂ), 0; 0, (t : ℂ)⁻¹]) j k := rfl + +/-- Inverting an axis boost replaces its multiplicative parameter `t` by `t⁻¹`. -/ +lemma boostAxis_inv (i : Fin 3) (t : ℝ) (ht : t ≠ 0) : + (boostAxis i t ht)⁻¹ = boostAxis i t⁻¹ (inv_ne_zero ht) := by + fin_cases i + · ext j k + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases j <;> fin_cases k <;> + simp [boostAxis, Complex.ofReal_inv, inv_inv] <;> + ring + · ext j k + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases j <;> fin_cases k <;> + simp [boostAxis, Complex.ofReal_inv, inv_inv] <;> + ring + · ext j k + rw [Matrix.SpecialLinearGroup.SL2_inv_expl] + fin_cases j <;> fin_cases k <;> + simp [boostAxis, Complex.ofReal_inv, inv_inv] + +/-- The matrix underlying an axis-boost lift is Hermitian. -/ +lemma boostAxis_conjTranspose (i : Fin 3) (t : ℝ) (ht : t ≠ 0) : + (boostAxis i t ht).1ᴴ = (boostAxis i t ht).1 := by + fin_cases i <;> ext j k <;> fin_cases j <;> fin_cases k <;> simp [boostAxis] + +/-- Every axis boost is obtained by conjugating the `z`-axis boost by `rotationZToAxis`. -/ +lemma boostAxis_eq_conj (i : Fin 3) (t : ℝ) (ht : t ≠ 0) : + boostAxis i t ht = + rotationZToAxis i * boostAxis 2 t ht * (rotationZToAxis i)⁻¹ := by + fin_cases i + · refine Subtype.ext ?_ + change !![((t : ℂ) + (t : ℂ)⁻¹) / 2, ((t : ℂ) - (t : ℂ)⁻¹) / 2; + ((t : ℂ) - (t : ℂ)⁻¹) / 2, ((t : ℂ) + (t : ℂ)⁻¹) / 2] = + (rotationZToAxis 0).1 * !![(t : ℂ), 0; 0, (t : ℂ)⁻¹] * + ((rotationZToAxis 0)⁻¹).1 + rw [rotationZToAxis_zero_mul_diagonal_mul_inv] + · refine Subtype.ext ?_ + change !![((t : ℂ) + (t : ℂ)⁻¹) / 2, + -Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2; + Complex.I * ((t : ℂ) - (t : ℂ)⁻¹) / 2, + ((t : ℂ) + (t : ℂ)⁻¹) / 2] = + (rotationZToAxis 1).1 * !![(t : ℂ), 0; 0, (t : ℂ)⁻¹] * + ((rotationZToAxis 1)⁻¹).1 + rw [rotationZToAxis_one_mul_diagonal_mul_inv] + · refine Subtype.ext ?_ + change !![(t : ℂ), 0; 0, (t : ℂ)⁻¹] = + (rotationZToAxis 2).1 * !![(t : ℂ), 0; 0, (t : ℂ)⁻¹] * + ((rotationZToAxis 2)⁻¹).1 + rw [rotationZToAxis_two_mul_diagonal_mul_inv] + +/-- Every coordinate-axis boost is conjugate to the `z`-axis boost. -/ +lemma exists_conj_boostAxis (i : Fin 3) : + ∃ R : SL(2,ℂ), ∀ (t : ℝ) (ht : t ≠ 0), + boostAxis i t ht = R * boostAxis 2 t ht * R⁻¹ := by + exact ⟨rotationZToAxis i, fun t ht => boostAxis_eq_conj i t ht⟩ + +end Lorentz.SL2C + +namespace LorentzGroup + +/-- The Lorentz transformation induced by the multiplicatively parameterized `SL(2,ℂ)` boost +along spatial axis `i`. -/ +noncomputable def boostAxis (i : Fin 3) (t : ℝ) (ht : t ≠ 0) : LorentzGroup 3 := + Lorentz.SL2C.toLorentzGroup (Lorentz.SL2C.boostAxis i t ht) + +/-- The entries of an axis boost in the Lorentz group. -/ +lemma boostAxis_apply (i : Fin 3) (t : ℝ) (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (boostAxis i t ht).1 a b = + if a = Sum.inl 0 ∧ b = Sum.inl 0 then (t ^ 2 + (t⁻¹) ^ 2) / 2 + else if a = Sum.inl 0 ∧ b = Sum.inr i then -((t ^ 2 - (t⁻¹) ^ 2) / 2) + else if a = Sum.inr i ∧ b = Sum.inl 0 then -((t ^ 2 - (t⁻¹) ^ 2) / 2) + else if a = Sum.inr i ∧ b = Sum.inr i then (t ^ 2 + (t⁻¹) ^ 2) / 2 + else if a = b then 1 else 0 := by + have htc : (t : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + refine Complex.ofReal_injective ?_ + rw [boostAxis, Lorentz.SL2C.toLorentzGroup_eq_trace, + PauliMatrix.trace_pauliSelfAdjoint'_mul_apply, Lorentz.SL2C.boostAxis_conjTranspose] + fin_cases i + all_goals + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + simp [Lorentz.SL2C.boostAxis, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.mul_apply, Fin.sum_univ_two] <;> + field_simp <;> + ring_nf + all_goals simp only [Complex.I_sq, Complex.I_pow_four] + all_goals ring + +end LorentzGroup + set_option maxHeartbeats 1000000 namespace Lorentz From 4639695454166a526c4e5bbfe4c12f2d9b243c97 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:02:30 +0100 Subject: [PATCH 192/254] feat: Add gauge invariance of higgs --- .../GaugeGroup/GaugeWeightDecomposition.lean | 276 ++- .../HiggsBoson/AlgebraValued/Basic.lean | 2141 +++++++++++++++-- 2 files changed, 2152 insertions(+), 265 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index f6ea245d5..2f71650a5 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -146,13 +146,21 @@ variable {B : Type*} [Ring B] [Algebra ℂ B] /-- A **gauge weight decomposition** of a submodule `V`: a finitely supported family of subspaces of pure gauge weight whose supremum is `V`. Purity is recorded against the four - commuting torus generators simultaneously. -/ -structure GaugeWeightDecomposition (rep : Representation ℂ GaugeGroupI B) + commuting torus generators simultaneously. + + This is a class: a decomposition of a given submodule is registered once and found by + instance synthesis, and `mul` is itself an instance, so a decomposition of a product is + assembled automatically. The pieces do not depend on which decomposition is found — see + `piece_eq_inf` and `piece_congr`. -/ +class GaugeWeightDecomposition (rep : Representation ℂ GaugeGroupI B) (V : Submodule ℂ B) where /-- The piece of gauge weight `w`. -/ piece : GaugeWeight → Submodule ℂ B /-- The finite set of gauge weights that occur. -/ supp : Finset GaugeWeight + /-- Gauge transformations act by algebra maps. This is a property of `rep` alone; it is + carried here so that `mul` can be an instance. -/ + rep_mul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y /-- Each piece is of pure gauge weight, as seen by all four torus generators. -/ piece_le : ∀ w, ∀ x, x ∈ piece w → ∀ i, rep (gaugeTorusGen i) x = ((expI : ℂ) ^ w.coord i) • x @@ -176,17 +184,19 @@ lemma piece_eq_zero_of_not_mem_supp (d : GaugeWeightDecomposition rep V) (w : Ga (hw : w ∉ d.supp) : d.piece w = ⊥ := d.piece_eq_bot w hw /-- Transport a decomposition along an equality of submodules. -/ +@[implicit_reducible] def copy (d : GaugeWeightDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : GaugeWeightDecomposition rep W where piece := d.piece supp := d.supp + rep_mul := d.rep_mul piece_le := d.piece_le piece_eq_bot := d.piece_eq_bot iSup_piece := by rw [d.iSup_piece, hW] @[simp] lemma copy_piece (d : GaugeWeightDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : - (d.copy W hW).piece = d.piece := rfl + (copy d W hW).piece = d.piece := rfl /-! @@ -196,10 +206,12 @@ lemma copy_piece (d : GaugeWeightDecomposition rep V) (W : Submodule ℂ B) (hW /-- The join of two gauge weight decompositions: the pieces, supports and suprema all combine weightwise, decomposing `V ⊔ V'`. -/ -noncomputable def sup (d : GaugeWeightDecomposition rep V) - (d' : GaugeWeightDecomposition rep V') : GaugeWeightDecomposition rep (V ⊔ V') where +@[implicit_reducible] +noncomputable instance sup [d : GaugeWeightDecomposition rep V] + [d' : GaugeWeightDecomposition rep V'] : GaugeWeightDecomposition rep (V ⊔ V') where piece w := d.piece w ⊔ d'.piece w supp := d.supp ∪ d'.supp + rep_mul := d.rep_mul piece_le w x hx i := Module.End.mem_eigenspace_iff.mp (sup_le (d.piece_le_eigenspace w i) (d'.piece_le_eigenspace w i) hx) @@ -210,8 +222,72 @@ noncomputable def sup (d : GaugeWeightDecomposition rep V) rw [iSup_sup_eq, d.iSup_piece, d'.iSup_piece] @[simp] -lemma sup_piece (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') - (w : GaugeWeight) : (d.sup d').piece w = d.piece w ⊔ d'.piece w := rfl +lemma sup_piece [GaugeWeightDecomposition rep V] [GaugeWeightDecomposition rep V'] + (w : GaugeWeight) : piece rep (V ⊔ V') w = piece rep V w ⊔ piece rep V' w := rfl + +/-- The zero submodule carries the empty decomposition. -/ +@[implicit_reducible] +def bot (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : + GaugeWeightDecomposition rep (⊥ : Submodule ℂ B) where + piece _ := ⊥ + supp := ∅ + rep_mul := hmul + piece_le w x hx i := by + rw [Submodule.mem_bot] at hx + subst hx + simp + piece_eq_bot _ _ := rfl + iSup_piece := by simp + +@[simp] +lemma bot_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (w : GaugeWeight) : (bot hmul).piece w = ⊥ := rfl + +@[simp] +lemma bot_supp (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : + (bot hmul).supp = ∅ := rfl + +/-- **An indexed join of decompositions.** A family of decompositions indexed by a finite + type decomposes the supremum: the pieces are joined weightwise and the supports are + united. This is the arbitrary-arity form of `sup`. -/ +@[implicit_reducible] +noncomputable def iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : (a : ι) → GaugeWeightDecomposition rep (V a)) : + GaugeWeightDecomposition rep (⨆ a, V a) where + piece w := ⨆ a, (d a).piece w + supp := Finset.univ.biUnion fun a => (d a).supp + rep_mul := hmul + piece_le w x hx i := + Module.End.mem_eigenspace_iff.mp + (iSup_le (fun a => (d a).piece_le_eigenspace w i) hx) + piece_eq_bot w hw := by + simp only [Finset.mem_biUnion, Finset.mem_univ, true_and, not_exists] at hw + exact le_antisymm (iSup_le fun a => le_of_eq ((d a).piece_eq_bot w (hw a))) bot_le + iSup_piece := by + rw [iSup_comm] + exact iSup_congr fun a => (d a).iSup_piece + +@[simp] +lemma piece_iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : (a : ι) → GaugeWeightDecomposition rep (V a)) (w : GaugeWeight) : + (iSup hmul d).piece w = ⨆ a, (d a).piece w := rfl + +lemma supp_iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : (a : ι) → GaugeWeightDecomposition rep (V a)) : + (iSup hmul d).supp = Finset.univ.biUnion fun a => (d a).supp := rfl + +/-- **A join over a proposition.** `⨆ _ : p, V` is `V` when `p` holds and `⊥` otherwise, so + it is decomposed by the given decomposition or by `bot`. The argument is a function of the + proof, so the decomposition of `V` may itself depend on `p`. -/ +@[implicit_reducible] +noncomputable def iSupProp {p : Prop} [Decidable p] + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : p → GaugeWeightDecomposition rep V) : + GaugeWeightDecomposition rep (⨆ _ : p, V) := + if hp : p then copy (d hp) _ (iSup_pos hp) else copy (bot hmul) _ (iSup_neg hp) /-! @@ -223,20 +299,23 @@ lemma sup_piece (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposit multiplication, so the weight-`w` piece of `V * V'` is spanned by the products of pieces whose weights sum to `w`, and the support is the pointwise sum of the supports. - Multiplicativity of the representation is a hypothesis rather than a field: a - `Representation` records only a linear action. -/ -noncomputable def mul (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') : + Multiplicativity of `rep` comes from the `rep_mul` field, which is why this can be an + instance: a decomposition of a product is assembled from decompositions of the factors + without further input. -/ +@[implicit_reducible] +noncomputable instance mul [d : GaugeWeightDecomposition rep V] + [d' : GaugeWeightDecomposition rep V'] : GaugeWeightDecomposition rep (V * V') where piece w := ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, d.piece w₁ * d'.piece w₂ supp := d.supp + d'.supp + rep_mul := d.rep_mul piece_le w x hx i := by have key : (⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, d.piece w₁ * d'.piece w₂) ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) ((expI : ℂ) ^ w.coord i) := by refine iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_ refine Submodule.mul_le.mpr fun m hm n hn => ?_ refine Module.End.mem_eigenspace_iff.mpr ?_ - rw [hmul, d.piece_le w₁ m hm i, d'.piece_le w₂ n hn i, smul_mul_smul_comm, + rw [d.rep_mul, d.piece_le w₁ m hm i, d'.piece_le w₂ n hn i, smul_mul_smul_comm, ← zpow_add₀ expI_ne_zero, ← GaugeWeight.coord_add, hw] exact Module.End.mem_eigenspace_iff.mp (key hx) piece_eq_bot w hw := by @@ -260,19 +339,17 @@ noncomputable def mul (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = r exact le_iSup_of_le (w₁ + w₂) (le_iSup_of_le w₁ (le_iSup_of_le w₂ (le_iSup_of_le rfl le_rfl))) -lemma mul_supp (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') : - (d.mul hmul d').supp = d.supp + d'.supp := rfl +lemma mul_supp [GaugeWeightDecomposition rep V] [GaugeWeightDecomposition rep V'] : + supp rep (V * V') = supp rep V + supp rep V' := rfl -lemma mul_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') +lemma mul_piece [GaugeWeightDecomposition rep V] [GaugeWeightDecomposition rep V'] (w : GaugeWeight) : - (d.mul hmul d').piece w = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, d.piece w₁ * d'.piece w₂ := rfl + piece rep (V * V') w + = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, piece rep V w₁ * piece rep V' w₂ := rfl -lemma mul_piece_eq_sub (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') - (w : GaugeWeight) : - (d.mul hmul d').piece w = ⨆ w₁ ∈ d.supp, d.piece w₁ * d'.piece (w - w₁) := by +lemma mul_piece_eq_sub [d : GaugeWeightDecomposition rep V] + [d' : GaugeWeightDecomposition rep V'] (w : GaugeWeight) : + piece rep (V * V') w = ⨆ w₁ ∈ supp rep V, piece rep V w₁ * piece rep V' (w - w₁) := by rw [mul_piece] refine le_antisymm (iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_) ?_ · by_cases h1 : w₁ ∈ d.supp @@ -283,10 +360,9 @@ lemma mul_piece_eq_sub (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = · exact iSup₂_le fun w₁ _ => le_iSup_of_le w₁ (le_iSup_of_le (w - w₁) (le_iSup_of_le (add_sub_cancel w₁ w) le_rfl)) -lemma mul_piece_eq_sub' (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') - (w : GaugeWeight) : - (d.mul hmul d').piece w = ⨆ w₂ ∈ d'.supp, d.piece (w - w₂) * d'.piece w₂ := by +lemma mul_piece_eq_sub' [d : GaugeWeightDecomposition rep V] + [d' : GaugeWeightDecomposition rep V'] (w : GaugeWeight) : + piece rep (V * V') w = ⨆ w₂ ∈ supp rep V', piece rep V (w - w₂) * piece rep V' w₂ := by rw [mul_piece] refine le_antisymm (iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_) ?_ · by_cases h2 : w₂ ∈ d'.supp @@ -300,11 +376,18 @@ lemma mul_piece_eq_sub' (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = /-- The unit submodule is of weight zero: the identity of `B` is a gauge singlet, provided the representation preserves the unit. -/ -noncomputable def one (hone : ∀ g : GaugeGroupI, rep g 1 = 1) : +@[implicit_reducible] +noncomputable def one (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : GaugeWeightDecomposition rep (1 : Submodule ℂ B) where piece w := if w = 0 then 1 else ⊥ supp := {0} + rep_mul := hmul piece_le := by + have hone : ∀ g : GaugeGroupI, rep g 1 = 1 := by + intro g + have h1 := hmul g 1 (rep g⁻¹ 1) + rw [one_mul, rep.self_inv_apply, mul_one] at h1 + exact h1.symm intro w x hx i rcases eq_or_ne w 0 with rfl | hw · rw [if_pos rfl, Submodule.one_eq_span, Submodule.mem_span_singleton] at hx @@ -326,10 +409,10 @@ noncomputable def one (hone : ∀ g : GaugeGroupI, rep g 1 = 1) : a product collapses to a join over `S`, pairing `w - v` against `v`. This is what makes the pieces of an iterated product computable: the double `⨆` over all of `ℤ⁴` becomes a finite join. -/ -lemma mul_piece_of_supp (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (d' : GaugeWeightDecomposition rep V') - (S : Finset GaugeWeight) (hS : ∀ v ∉ S, d'.piece v = ⊥) (w : GaugeWeight) : - (d.mul hmul d').piece w = ⨆ v ∈ S, d.piece (w - v) * d'.piece v := by +lemma mul_piece_of_supp [d : GaugeWeightDecomposition rep V] + [d' : GaugeWeightDecomposition rep V'] (S : Finset GaugeWeight) + (hS : ∀ v ∉ S, piece rep V' v = ⊥) (w : GaugeWeight) : + piece rep (V * V') w = ⨆ v ∈ S, piece rep V (w - v) * piece rep V' v := by rw [mul_piece] refine le_antisymm (iSup_le fun w₁ => iSup_le fun w₂ => iSup_le fun hw => ?_) ?_ · by_cases hv : w₂ ∈ S @@ -341,40 +424,34 @@ lemma mul_piece_of_supp (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = le_iSup_of_le (w - v) (le_iSup_of_le v (le_iSup_of_le (sub_add_cancel w v) le_rfl)) @[simp] -lemma one_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) (w : GaugeWeight) : - (one (B := B) (rep := rep) hone).piece w = if w = 0 then 1 else ⊥ := rfl +lemma one_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (w : GaugeWeight) : + (one (B := B) (rep := rep) hmul).piece w = if w = 0 then 1 else ⊥ := rfl /-- Powers of a decomposed submodule: gauge weights add, so `V ^ k` inherits a decomposition, built by iterating `mul` from `one`. -/ -noncomputable def pow (hone : ∀ g : GaugeGroupI, rep g 1 = 1) - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) : +@[implicit_reducible] +noncomputable instance pow [d : GaugeWeightDecomposition rep V] : (k : ℕ) → GaugeWeightDecomposition rep (V ^ k) - | 0 => (one hone).copy _ (pow_zero V) - | (k + 1) => ((pow hone hmul d k).mul hmul d).copy _ (pow_succ V k) + | 0 => copy (one d.rep_mul) _ (pow_zero V) + | (k + 1) => copy (mul (d := pow (d := d) k) (d' := d)) _ (pow_succ V k) @[simp] -lemma pow_zero_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : - (d.pow hone hmul 0).piece w = if w = 0 then 1 else ⊥ := rfl +lemma pow_zero_piece [d : GaugeWeightDecomposition rep V] (w : GaugeWeight) : + (pow (d := d) 0).piece w = if w = 0 then 1 else ⊥ := rfl @[simp] -lemma pow_succ_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (k : ℕ) (w : GaugeWeight) : - (d.pow hone hmul (k + 1)).piece w - = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, (d.pow hone hmul k).piece w₁ * d.piece w₂ := rfl +lemma pow_succ_piece [d : GaugeWeightDecomposition rep V] (k : ℕ) (w : GaugeWeight) : + (pow (d := d) (k + 1)).piece w + = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, (pow (d := d) k).piece w₁ * piece rep V w₂ := rfl /-- The `mul_piece_of_supp` collapse, applied to a power: only the weights in `S` that the decomposition actually carries contribute at each step. -/ -lemma pow_succ_piece_of_supp (hone : ∀ g : GaugeGroupI, rep g 1 = 1) - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (d : GaugeWeightDecomposition rep V) (S : Finset GaugeWeight) - (hS : ∀ v ∉ S, d.piece v = ⊥) (k : ℕ) (w : GaugeWeight) : - (d.pow hone hmul (k + 1)).piece w - = ⨆ v ∈ S, (d.pow hone hmul k).piece (w - v) * d.piece v := - mul_piece_of_supp hmul _ d S hS w +lemma pow_succ_piece_of_supp [d : GaugeWeightDecomposition rep V] (S : Finset GaugeWeight) + (hS : ∀ v ∉ S, piece rep V v = ⊥) (k : ℕ) (w : GaugeWeight) : + (pow (d := d) (k + 1)).piece w + = ⨆ v ∈ S, (pow (d := d) k).piece (w - v) * piece rep V v := + mul_piece_of_supp (d := pow (d := d) k) (d' := d) S hS w /-! @@ -390,10 +467,10 @@ lemma pow_succ_piece_of_supp (hone : ∀ g : GaugeGroupI, rep g 1 = 1) This is the whole content of `mem_zero_of_invariant`, applied once per generator. At rank four no single generator separates the gauge weights, so the coordinates have to be peeled off one at a time rather than all at once. -/ -lemma mem_iSup_of_fixed {ι : Type*} {T : Module.End ℂ B} {p : ι → Submodule ℂ B} {f : ι → ℤ} - (hp : ∀ j, p j ≤ Module.End.eigenspace T ((expI : ℂ) ^ f j)) - {x : B} (hx : x ∈ ⨆ j, p j) (hT : T x = x) : - x ∈ ⨆ j, ⨆ _ : f j = 0, p j := by +lemma mem_iSup_of_eigenvector {ι : Type*} {T : Module.End ℂ B} {p : ι → Submodule ℂ B} + {f : ι → ℤ} (hp : ∀ j, p j ≤ Module.End.eigenspace T ((expI : ℂ) ^ f j)) + {x : B} (hx : x ∈ ⨆ j, p j) {n : ℤ} (hT : T x = ((expI : ℂ) ^ n) • x) : + x ∈ ⨆ j, ⨆ _ : f j = n, p j := by have hQle : ∀ k : ℤ, (⨆ j, ⨆ _ : f j = k, p j) ≤ Module.End.eigenspace T ((expI : ℂ) ^ k) := fun k => iSup₂_le fun j hj => hj ▸ hp j @@ -401,35 +478,80 @@ lemma mem_iSup_of_fixed {ι : Type*} {T : Module.End ℂ B} {p : ι → Submodul rw [iSup_comm] exact iSup_congr fun j => le_antisymm (iSup₂_le fun _ _ => le_rfl) (le_iSup₂_of_le (f j) rfl le_rfl) - have hdisj : Disjoint (Module.End.eigenspace T ((expI : ℂ) ^ (0 : ℤ))) - (⨆ k : ℤ, ⨆ _ : k ≠ (0 : ℤ), ⨆ j, ⨆ _ : f j = k, p j) := - (((Module.End.eigenspaces_iSupIndep T).comp expI_zpow_injective) 0).mono_right + have hdisj : Disjoint (Module.End.eigenspace T ((expI : ℂ) ^ n)) + (⨆ k : ℤ, ⨆ _ : k ≠ n, ⨆ j, ⨆ _ : f j = k, p j) := + (((Module.End.eigenspaces_iSupIndep T).comp expI_zpow_injective) n).mono_right (iSup₂_mono fun k _ => hQle k) have key : (⨆ k : ℤ, ⨆ j, ⨆ _ : f j = k, p j) - ⊓ Module.End.eigenspace T ((expI : ℂ) ^ (0 : ℤ)) ≤ ⨆ j, ⨆ _ : f j = 0, p j := by - rw [iSup_split_single (fun k : ℤ => ⨆ j, ⨆ _ : f j = k, p j) 0, - sup_inf_assoc_of_le _ (hQle 0)] + ⊓ Module.End.eigenspace T ((expI : ℂ) ^ n) ≤ ⨆ j, ⨆ _ : f j = n, p j := by + rw [iSup_split_single (fun k : ℤ => ⨆ j, ⨆ _ : f j = k, p j) n, + sup_inf_assoc_of_le _ (hQle n)] exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) - refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ - · rw [hQsup] - exact hx - · rw [zpow_zero, one_smul] - exact hT + exact key ⟨hQsup ▸ hx, Module.End.mem_eigenspace_iff.mpr hT⟩ + +/-- **The pieces are canonical.** The weight-`w` piece is exactly the part of `V` on which + the four torus generators act by the weight-`w` characters. In particular it does not + depend on which decomposition of `V` it was computed from — see `piece_congr`. -/ +lemma piece_eq_inf (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : + d.piece w + = V ⊓ ⨅ i, Module.End.eigenspace (rep (gaugeTorusGen i)) ((expI : ℂ) ^ w.coord i) := by + refine le_antisymm (le_inf ((le_iSup d.piece w).trans (le_of_eq d.iSup_piece)) + (le_iInf fun i => d.piece_le_eigenspace w i)) fun x hx => ?_ + obtain ⟨hxV, hxE'⟩ := hx + have hxE : ∀ i : Fin 4, x ∈ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ w.coord i) := fun i => Submodule.mem_iInf _ |>.mp hxE' i + have s0 : x ∈ ⨆ w', d.piece w' := by rw [d.iSup_piece]; exact hxV + have s1 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 0) + (fun w' => d.piece_le_eigenspace w' 0) s0 (Module.End.mem_eigenspace_iff.mp (hxE 0)) + have s2 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 1) + (fun w' => iSup_le fun _ => d.piece_le_eigenspace w' 1) s1 + (Module.End.mem_eigenspace_iff.mp (hxE 1)) + have s3 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 2) + (fun w' => iSup_le fun _ => iSup_le fun _ => d.piece_le_eigenspace w' 2) s2 + (Module.End.mem_eigenspace_iff.mp (hxE 2)) + have s4 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 3) + (fun w' => iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => + d.piece_le_eigenspace w' 3) s3 (Module.End.mem_eigenspace_iff.mp (hxE 3)) + have hfin : ∀ w' : GaugeWeight, (⨆ _ : w'.coord 3 = w.coord 3, ⨆ _ : w'.coord 2 = w.coord 2, + ⨆ _ : w'.coord 1 = w.coord 1, ⨆ _ : w'.coord 0 = w.coord 0, d.piece w') ≤ d.piece w := by + rintro ⟨a, b, c, e⟩ + obtain ⟨a', b', c', e'⟩ := w + refine iSup_le fun h3 => iSup_le fun h2 => iSup_le fun h1 => iSup_le fun h0 => ?_ + simp only [GaugeWeight.coord_zero, GaugeWeight.coord_one, GaugeWeight.coord_two, + GaugeWeight.coord_three] at h0 h1 h2 h3 + subst h0 + subst h1 + subst h2 + subst h3 + exact le_rfl + exact iSup_le hfin s4 + +/-- **The pieces depend only on the submodule.** Two decompositions of equal submodules have + the same pieces, so a computation of `piece` may be carried along any equality of + submodules. -/ +lemma piece_congr {W : Submodule ℂ B} [d : GaugeWeightDecomposition rep V] + [d' : GaugeWeightDecomposition rep W] (hVW : V = W) (w : GaugeWeight) : + d.piece w = d'.piece w := by + rw [d.piece_eq_inf, d'.piece_eq_inf, hVW] /-- **A gauge-invariant element sits in the zero-weight piece.** Only invariance under the four torus generators is used. -/ lemma mem_zero_of_invariant (d : GaugeWeightDecomposition rep V) {x : B} (hx : x ∈ V) (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ d.piece 0 := by have s0 : x ∈ ⨆ w, d.piece w := by rw [d.iSup_piece]; exact hx - have s1 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 0) - (fun w => d.piece_le_eigenspace w 0) s0 (hV _) - have s2 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 1) - (fun w => iSup_le fun _ => d.piece_le_eigenspace w 1) s1 (hV _) - have s3 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 2) - (fun w => iSup_le fun _ => iSup_le fun _ => d.piece_le_eigenspace w 2) s2 (hV _) - have s4 := mem_iSup_of_fixed (f := fun w : GaugeWeight => w.coord 3) + have hfix : ∀ i : Fin 4, rep (gaugeTorusGen i) x = ((expI : ℂ) ^ (0 : ℤ)) • x := by + intro i + rw [zpow_zero, one_smul] + exact hV _ + have s1 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 0) + (fun w => d.piece_le_eigenspace w 0) s0 (hfix 0) + have s2 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 1) + (fun w => iSup_le fun _ => d.piece_le_eigenspace w 1) s1 (hfix 1) + have s3 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 2) + (fun w => iSup_le fun _ => iSup_le fun _ => d.piece_le_eigenspace w 2) s2 (hfix 2) + have s4 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 3) (fun w => iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => - d.piece_le_eigenspace w 3) s3 (hV _) + d.piece_le_eigenspace w 3) s3 (hfix 3) have hfin : ∀ w : GaugeWeight, (⨆ _ : w.coord 3 = 0, ⨆ _ : w.coord 2 = 0, ⨆ _ : w.coord 1 = 0, ⨆ _ : w.coord 0 = 0, d.piece w) ≤ d.piece 0 := by rintro ⟨a, b, c, e⟩ diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index 053ecee9f..31d778cd1 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -54,7 +54,7 @@ mass-dimension 4 are given by: namespace StandardModel -open TensorProduct Matrix +open TensorProduct Matrix MatrixGroups Lorentz /-- The pair of symbol maps `H`, `barH` in the algebra `B` is an *algebra-valued Higgs* for @@ -67,37 +67,1970 @@ open TensorProduct Matrix physicists' `H ↦ g H` and `H^† ↦ H^† g^†`, read on the component functions; * the Higgs is a *boson*, so all of its component symbols commute with one another (`H_comm_H`, `H_comm_barH`, `barH_comm_barH`). This is what distinguishes an - algebra-valued Higgs from an algebra-valued fermion, whose symbols anticommute. -/ + algebra-valued Higgs from an algebra-valued fermion, whose symbols anticommute; + * a gauge transformation acts on `B` by an *algebra* map (`rep_mul`). A `Representation` + records only a linear action, so multiplicativity has to be demanded separately; it is + what lets the gauge action be transported through products of symbols. -/ structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] - (rep : Representation ℂ GaugeGroupI B) (H : Module.Dual ℂ HiggsVec →ₗ[ℂ] B) - (barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) + (rep : Representation ℂ GaugeGroupI B) + (repLorentz : Representation ℂ SL(2,ℂ) B) + (H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B) + (barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) (massWeightPoly : B →ₐ[ℂ] Polynomial B) : Prop where /-- The Higgs symbol carries the dual of the gauge representation on `HiggsVec`: the `SU(2)` index transforms contragrediently, and the hypercharge character by `u⁻³`. -/ - H_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ HiggsVec), - rep g (H φ) = H (HiggsVec.repGaugeGroupI.dual g φ) + H_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ HiggsVec) n l, + rep g (H n l φ) = H n l (HiggsVec.repGaugeGroupI.dual g φ) /-- The conjugate Higgs symbol carries the conjugate-dual of the gauge representation: the physicists' `H^† ↦ H^† g^†`. -/ - barH_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule HiggsVec)), - rep g (barH φ) = barH (HiggsVec.repGaugeGroupI.conj.dual g φ) + barH_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule HiggsVec)) n l, + rep g (barH n l φ) = barH n l (HiggsVec.repGaugeGroupI.conj.dual g φ) + /-- Gauge transformations act on `B` by algebra maps: the representation is + multiplicative. -/ + rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂ /-- The Higgs is bosonic: two Higgs symbols commute. -/ - H_comm_H : ∀ φ ψ, Commute (H φ) (H ψ) + H_comm_H : ∀ φ ψ n1 n2 l1 l2, Commute (H n1 l1 φ) (H n2 l2 ψ) /-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ - H_comm_barH : ∀ φ ψ, Commute (H φ) (barH ψ) + H_comm_barH : ∀ φ ψ n1 n2 l1 l2, Commute (H n1 l1 φ) (barH n2 l2 ψ) /-- Two conjugate Higgs symbols commute. -/ - barH_comm_barH : ∀ φ ψ, Commute (barH φ) (barH ψ) - H_massWeight : ∀ φ, massWeightPoly (H φ) = Polynomial.monomial 2 (H φ) - barH_massWeight : ∀ φ, massWeightPoly (barH φ) = Polynomial.monomial 2 (barH φ) + barH_comm_barH : ∀ φ ψ n1 n2 l1 l2, Commute (barH n1 l1 φ) (barH n2 l2 ψ) + H_massWeight : ∀ φ n l, massWeightPoly (H n l φ) = Polynomial.monomial (2 * (1 + n)) (H n l φ) + barH_massWeight : ∀ φ n l, massWeightPoly (barH n l φ) = Polynomial.monomial (2 * (1 + n)) (barH n l φ) + /-- The action of the Lorentz group on H. -/ + repLorentz_H : ∀ (g : SL(2,ℂ)) (φ : Module.Dual ℂ HiggsVec) n l, + repLorentz g (H n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • H n a φ + /-- The action of the Lorentz group on barH. -/ + repLorentz_barH : ∀ (g : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) n l, + repLorentz g (barH n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • barH n a φ + +set_option linter.unusedVariables false +namespace IsHiggsAlgebraValued + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) + + +/-! + +## A. The basic generators and the submodules generated by them. + +-/ + +/-- The component `∇_d H^i` in the algebra. -/ +noncomputable def higgs (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) + {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) :B := + H n d (HiggsVec.orthonormBasis.toBasis.dualBasis i) + +/-- The component `∇_d barH^i` in the algebra. -/ +noncomputable def barHiggs (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) + {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : B := + barH n d (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) + +/-! + +### A.1. The representation of the gauge group on the components + +-/ + + +lemma rep_higgsComponent (g : GaugeGroupI) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : + rep g (h.higgs d i) = + ∑ j, (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j) • h.higgs d j := by + have key : HiggsVec.repGaugeGroupI.dual g (HiggsVec.orthonormBasis.toBasis.dualBasis i) + = ∑ j, (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j) • + HiggsVec.orthonormBasis.toBasis.dualBasis j := by + refine HiggsVec.orthonormBasis.toBasis.ext fun k => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, smul_eq_mul, Module.Basis.dualBasis_apply_self, + mul_ite, mul_one, mul_zero, Finset.sum_ite_eq] + simp [Representation.dual, HiggsVec.repGaugeGroupI_apply, HiggsVec.orthonormBasis, + Submonoid.smul_def, -inv_pow] + rw [higgs, h.H_equivariant, key, map_sum] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl + + +lemma rep_barHiggsComponent (g : GaugeGroupI) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : + rep g (h.barHiggs d i) = + ∑ j, (starRingEnd ℂ (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j)) • h.barHiggs d j := by + have key : HiggsVec.repGaugeGroupI.conj.dual g + (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) + = ∑ j, (starRingEnd ℂ (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j)) • + HiggsVec.orthonormBasis.toBasis.conj.dualBasis j := by + refine HiggsVec.orthonormBasis.toBasis.conj.ext fun k => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, smul_eq_mul, Module.Basis.dualBasis_apply_self, + mul_ite, mul_one, mul_zero, Finset.sum_ite_eq] + simp [Representation.dual, Representation.conj_apply, HiggsVec.repGaugeGroupI_apply, + HiggsVec.orthonormBasis, Submonoid.smul_def, -inv_pow] + rw [barHiggs, h.barH_equivariant, key, map_sum] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl + +/-! + +### A.2. The submodules generated by the Higges and conjugate Higgs components + +-/ + +/-- The submodule of `B` generated by the Higgs symbols carrying `n` derivatives: the join, + over the Lorentz indices `d`, of the ranges of the symbol maps `H n d`. Its elements are + the terms linear in `∇_d H` — of mass dimension `1 + n`. -/ +def higgsSubmodule (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) (n : ℕ) : + Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (H n d) + +/-- The submodule of `B` generated by the conjugate Higgs symbols carrying `n` derivatives: + the join, over the Lorentz indices `d`, of the ranges of the symbol maps `barH n d`. -/ +def barHiggsSubmodule (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) + (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (barH n d) + +/-! + +### A.n. Commutativity of higgs and barHiggsSubmodules + +-/ + +@[simp] +lemma barHiggsSubmodule_comm_higgsSubmodule (n1 n2 : ℕ) : + (h.barHiggsSubmodule n1) * (h.higgsSubmodule n2) + = (h.higgsSubmodule n2) * (h.barHiggsSubmodule n1) := by + have gen : ∀ (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + h.higgsSubmodule n2 ≤ LinearMap.ker (LinearMap.mulLeft ℂ (barH n1 d1 φ) + - LinearMap.mulRight ℂ (barH n1 d1 φ)) := by + intro d1 φ + rw [higgsSubmodule] + refine iSup_le fun d2 => ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact (h.H_comm_barH ψ φ n2 n1 d2 d1).symm.eq + have key : ∀ x ∈ h.barHiggsSubmodule n1, ∀ y ∈ h.higgsSubmodule n2, x * y = y * x := by + intro x hx y hy + have step : h.barHiggsSubmodule n1 + ≤ LinearMap.ker (LinearMap.mulRight ℂ y - LinearMap.mulLeft ℂ y) := by + rw [barHiggsSubmodule] + refine iSup_le fun d1 => ?_ + rintro _ ⟨φ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] + have := gen d1 φ hy + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] using this + have := step hx + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] using this + refine le_antisymm (Submodule.mul_le.mpr fun x hx y hy => ?_) + (Submodule.mul_le.mpr fun y hy x hx => ?_) + · rw [key x hx y hy] + exact Submodule.mul_mem_mul hy hx + · rw [← key x hx y hy] + exact Submodule.mul_mem_mul hx hy + +lemma higgsSubmodule_comm_higgsSubmodule (n1 n2 : ℕ) (h1 : n1 < n2) : + (h.higgsSubmodule n1) * (h.higgsSubmodule n2) + = (h.higgsSubmodule n2) * (h.higgsSubmodule n1) := by + have gen : ∀ (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), + h.higgsSubmodule n2 ≤ LinearMap.ker (LinearMap.mulLeft ℂ (H n1 d1 φ) + - LinearMap.mulRight ℂ (H n1 d1 φ)) := by + intro d1 φ + rw [higgsSubmodule] + refine iSup_le fun d2 => ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact (h.H_comm_H φ ψ n1 n2 d1 d2).eq + have key : ∀ x ∈ h.higgsSubmodule n1, ∀ y ∈ h.higgsSubmodule n2, x * y = y * x := by + intro x hx y hy + have step : h.higgsSubmodule n1 + ≤ LinearMap.ker (LinearMap.mulRight ℂ y - LinearMap.mulLeft ℂ y) := by + rw [higgsSubmodule] + refine iSup_le fun d1 => ?_ + rintro _ ⟨φ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] + have := gen d1 φ hy + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] using this + have := step hx + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] using this + refine le_antisymm (Submodule.mul_le.mpr fun x hx y hy => ?_) + (Submodule.mul_le.mpr fun y hy x hx => ?_) + · rw [key x hx y hy] + exact Submodule.mul_mem_mul hy hx + · rw [← key x hx y hy] + exact Submodule.mul_mem_mul hx hy + +lemma barHiggsSubmodule_comm_barHiggsSubmodule (n1 n2 : ℕ) (h1 : n1 < n2) : + (h.barHiggsSubmodule n1) * (h.barHiggsSubmodule n2) + = (h.barHiggsSubmodule n2) * (h.barHiggsSubmodule n1) := by + have gen : ∀ (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + h.barHiggsSubmodule n2 ≤ LinearMap.ker (LinearMap.mulLeft ℂ (barH n1 d1 φ) + - LinearMap.mulRight ℂ (barH n1 d1 φ)) := by + intro d1 φ + rw [barHiggsSubmodule] + refine iSup_le fun d2 => ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact (h.barH_comm_barH φ ψ n1 n2 d1 d2).eq + have key : ∀ x ∈ h.barHiggsSubmodule n1, ∀ y ∈ h.barHiggsSubmodule n2, x * y = y * x := by + intro x hx y hy + have step : h.barHiggsSubmodule n1 + ≤ LinearMap.ker (LinearMap.mulRight ℂ y - LinearMap.mulLeft ℂ y) := by + rw [barHiggsSubmodule] + refine iSup_le fun d1 => ?_ + rintro _ ⟨φ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] + have := gen d1 φ hy + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] using this + have := step hx + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] using this + refine le_antisymm (Submodule.mul_le.mpr fun x hx y hy => ?_) + (Submodule.mul_le.mpr fun y hy x hx => ?_) + · rw [key x hx y hy] + exact Submodule.mul_mem_mul hy hx + · rw [← key x hx y hy] + exact Submodule.mul_mem_mul hx hy + +/-! + +### A.3. The closure of the Higgs and conjugate Higgs submodules under the gauge group + +-/ + +lemma higgsSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : + (h.higgsSubmodule n).map (rep g) ≤ h.higgsSubmodule n := by + rw [higgsSubmodule, Submodule.map_iSup] + refine iSup_le fun d => ?_ + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + exact Submodule.mem_iSup_of_mem d + ⟨HiggsVec.repGaugeGroupI.dual g φ, (h.H_equivariant g φ n d).symm⟩ + +/-- The Higgs symbols are closed under the gauge action.-/ +lemma higgsSubmodule_closure (n : ℕ) (g : GaugeGroupI) : + (h.higgsSubmodule n).map (rep g) = h.higgsSubmodule n := + le_antisymm (h.higgsSubmodule_map_rep_le n g) fun b hb => + ⟨rep g⁻¹ b, h.higgsSubmodule_map_rep_le n g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + +lemma barHiggsSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : + (h.barHiggsSubmodule n).map (rep g) ≤ h.barHiggsSubmodule n := by + rw [barHiggsSubmodule, Submodule.map_iSup] + refine iSup_le fun d => ?_ + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + exact Submodule.mem_iSup_of_mem d + ⟨HiggsVec.repGaugeGroupI.conj.dual g φ, (h.barH_equivariant g φ n d).symm⟩ + +/-- The conjugate Higgs symbols are closed under the gauge action. -/ +lemma barHiggsSubmodule_closure (n : ℕ) (g : GaugeGroupI) : + (h.barHiggsSubmodule n).map (rep g) = h.barHiggsSubmodule n := + le_antisymm (h.barHiggsSubmodule_map_rep_le n g) fun b hb => + ⟨rep g⁻¹ b, h.barHiggsSubmodule_map_rep_le n g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + +/-! + +### A.4. The gauge decomposition + +-/ + + +/-! + +#### A.4.1. The action of the gauge torus on the Higgs components + +-/ + +lemma rep_gaugeTorusGen_higgs_zero (i : Fin 4) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep (gaugeTorusGen i) (h.higgs d 0) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, -3) i) • h.higgs d 0 := by + have hstar : ((starRingEnd ℂ) (expI : ℂ)) ^ 3 = (((expI : ℂ)) ^ 3)⁻¹ := by + rw [← inv_pow] + congr 1 + exact expI_inv_eq_star.symm + rw [h.rep_higgsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, expI_inv_eq_star, Matrix.one_apply, Unitary.coe_inv, hstar] + rfl + +lemma rep_gaugeTorusGen_higg_one (i : Fin 4) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep (gaugeTorusGen i) (h.higgs d 1) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, -3) i) • h.higgs d 1 := by + have hstar : ((starRingEnd ℂ) (expI : ℂ)) ^ 3 = (((expI : ℂ)) ^ 3)⁻¹ := by + rw [← inv_pow] + congr 1 + exact expI_inv_eq_star.symm + rw [h.rep_higgsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, expI_inv_eq_star, Matrix.one_apply, Unitary.coe_inv, hstar] + rfl + +lemma rep_gaugeTorusGen_barHiggsComponent_zero (i : Fin 4) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep (gaugeTorusGen i) (h.barHiggs d 0) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, 3) i) • h.barHiggs d 0 := by + have hc : (starRingEnd ℂ) (expI : ℂ) = ((expI : ℂ))⁻¹ := expI_inv_eq_star.symm + rw [h.rep_barHiggsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, Matrix.one_apply, Unitary.coe_inv, hc] + rfl + +lemma rep_gaugeTorusGen_barHiggsComponent_one (i : Fin 4) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep (gaugeTorusGen i) (h.barHiggs d 1) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, 3) i) • h.barHiggs d 1 := by + have hc : (starRingEnd ℂ) (expI : ℂ) = ((expI : ℂ))⁻¹ := expI_inv_eq_star.symm + rw [h.rep_barHiggsComponent] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, Matrix.one_apply, Unitary.coe_inv, hc] + rfl + +/-! + +#### A.4.1b. The action of the Weyl element on the Higgs components + +-/ + +lemma rep_gaugeSU2Perm_higgsComponent_zero {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep gaugeSU2Perm (h.higgs d 0) = h.higgs d 1 := by + rw [h.rep_higgsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, Fin.sum_univ_two] + +lemma rep_gaugeSU2Perm_higgsComponent_one {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep gaugeSU2Perm (h.higgs d 1) = -h.higgs d 0 := by + rw [h.rep_higgsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, Fin.sum_univ_two] + +lemma rep_gaugeSU2Perm_barHiggsComponent_zero {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep gaugeSU2Perm (h.barHiggs d 0) = h.barHiggs d 1 := by + rw [h.rep_barHiggsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, Fin.sum_univ_two] + +lemma rep_gaugeSU2Perm_barHiggsComponent_one {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) : + rep gaugeSU2Perm (h.barHiggs d 1) = -h.barHiggs d 0 := by + rw [h.rep_barHiggsComponent] + simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, Fin.sum_univ_two] + +/-- The mass-term pairing `∇H⁰ ∇H̄⁰ + ∇H¹ ∇H̄¹` is invariant under the Weyl element, + for any derivative indices on the two factors. -/ +lemma rep_gaugeSU2Perm_higgsBarHiggs_add {n1 n2 : ℕ} (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) + (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + rep gaugeSU2Perm (h.higgs d1 0 * h.barHiggs d2 0 + h.higgs d1 1 * h.barHiggs d2 1) + = h.higgs d1 0 * h.barHiggs d2 0 + h.higgs d1 1 * h.barHiggs d2 1 := by + rw [map_add, h.rep_mul, h.rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, + h.rep_gaugeSU2Perm_barHiggsComponent_zero, h.rep_gaugeSU2Perm_higgsComponent_one, + h.rep_gaugeSU2Perm_barHiggsComponent_one, neg_mul_neg, add_comm] + +/-- The triplet-term pairing `∇H⁰ ∇H̄⁰ - ∇H¹ ∇H̄¹` changes sign under the Weyl element, + for any derivative indices on the two factors. -/ +lemma rep_gaugeSU2Perm_higgsBarHiggs_sub {n1 n2 : ℕ} (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) + (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + rep gaugeSU2Perm (h.higgs d1 0 * h.barHiggs d2 0 - h.higgs d1 1 * h.barHiggs d2 1) + = -(h.higgs d1 0 * h.barHiggs d2 0 - h.higgs d1 1 * h.barHiggs d2 1) := by + rw [map_sub, h.rep_mul, h.rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, + h.rep_gaugeSU2Perm_barHiggsComponent_zero, h.rep_gaugeSU2Perm_higgsComponent_one, + h.rep_gaugeSU2Perm_barHiggsComponent_one, neg_mul_neg, neg_sub] + +/-- The diagonal quartic combination `(H⁰H̄⁰)² + (H¹H̄¹)²` is invariant under the Weyl + element. -/ +lemma rep_gaugeSU2Perm_quartic_add : + rep gaugeSU2Perm (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + = h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1 := by + simp only [map_add, h.rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, + h.rep_gaugeSU2Perm_higgsComponent_one, h.rep_gaugeSU2Perm_barHiggsComponent_zero, + h.rep_gaugeSU2Perm_barHiggsComponent_one, mul_neg, neg_mul, neg_neg] + rw [add_comm] + +/-- The diagonal quartic combination `(H⁰H̄⁰)² - (H¹H̄¹)²` changes sign under the Weyl + element. -/ +lemma rep_gaugeSU2Perm_quartic_sub : + rep gaugeSU2Perm (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + - h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + = -(h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + - h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) := by + simp only [map_sub, h.rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, + h.rep_gaugeSU2Perm_higgsComponent_one, h.rep_gaugeSU2Perm_barHiggsComponent_zero, + h.rep_gaugeSU2Perm_barHiggsComponent_one, mul_neg, neg_mul, neg_neg] + rw [neg_sub] + +/-- The mixed quartic `H⁰H̄⁰H¹H̄¹` is invariant under the Weyl element. -/ +lemma rep_gaugeSU2Perm_quartic_mixed : + rep gaugeSU2Perm (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1) + = h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1 := by + have hbh2 : ∀ (a b : Fin 2), h.barHiggs ![] a * h.higgs ![] b + = h.higgs ![] b * h.barHiggs ![] a := + fun a b => ((h.H_comm_barH _ _ _ _ _ _).symm).eq + have hhh' : ∀ (c : B), h.higgs ![] 1 * (h.higgs ![] 0 * c) + = h.higgs ![] 0 * (h.higgs ![] 1 * c) := + fun c => (h.H_comm_H _ _ _ _ _ _).left_comm c + have hbb2 : h.barHiggs ![] 1 * h.barHiggs ![] 0 = h.barHiggs ![] 0 * h.barHiggs ![] 1 := + (h.barH_comm_barH _ _ _ _ _ _).eq + simp only [h.rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, + h.rep_gaugeSU2Perm_higgsComponent_one, h.rep_gaugeSU2Perm_barHiggsComponent_zero, + h.rep_gaugeSU2Perm_barHiggsComponent_one, mul_neg, neg_mul, neg_neg, + mul_assoc, hbh2, hhh', hbb2] + +/-! + +#### A.4.2. The gauge decomposition on the Higgs submodule + +-/ + +@[simps!] +noncomputable instance higgsSubmoduleGaugeWeight (n : ℕ) : + GaugeWeightDecomposition rep (h.higgsSubmodule n) where + rep_mul := h.rep_mul + piece := fun w => + if w = (0, 0, -1, -3) then ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.higgs d 0} + else if w = (0, 0, 1, -3) then ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.higgs d 1} + else ⊥ + supp := {(0, 0, -1, -3), (0, 0, 1, -3)} + piece_le := by + have hz : ∀ i : Fin 4, (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.higgs d 0}) + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, -3) i) := fun i => + iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_higgs_zero i d)) + have ho : ∀ i : Fin 4, (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.higgs d 1}) + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, -3) i) := fun i => + iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_higg_one i d)) + intro w x hx i + rcases eq_or_ne w (0, 0, -1, -3) with rfl | hw0 + · rw [if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (hz i hx) + · rcases eq_or_ne w (0, 0, 1, -3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (ho i hx) + · rw [if_neg hw0, if_neg hw1, Submodule.mem_bot] at hx + subst hx + simp + piece_eq_bot := by + intro w hw + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hw + rw [if_neg hw.1, if_neg hw.2] + iSup_piece := by + have hrange : ∀ d : Fin n → (Fin 1 ⊕ Fin 3), + LinearMap.range (H n d) = Submodule.span ℂ (Set.range (h.higgs d)) := fun d => by + rw [LinearMap.range_eq_map, ← (HiggsVec.orthonormBasis.toBasis.dualBasis).span_eq, + Submodule.map_span, ← Set.range_comp] + rfl + have hmem : ∀ (d : Fin n → (Fin 1 ⊕ Fin 3)) (j : Fin 2), + h.higgs d j ∈ h.higgsSubmodule n := fun d j => + Submodule.mem_iSup_of_mem d ⟨HiggsVec.orthonormBasis.toBasis.dualBasis j, rfl⟩ + refine le_antisymm (iSup_le fun w => ?_) ?_ + · rcases eq_or_ne w (0, 0, -1, -3) with rfl | hw0 + · rw [if_pos rfl] + exact iSup_le fun d => + (Submodule.span_singleton_le_iff_mem _ _).mpr (hmem d 0) + · rcases eq_or_ne w (0, 0, 1, -3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] + exact iSup_le fun d => + (Submodule.span_singleton_le_iff_mem _ _).mpr (hmem d 1) + · rw [if_neg hw0, if_neg hw1] + exact bot_le + · rw [higgsSubmodule] + refine iSup_le fun d => ?_ + rw [hrange d, Submodule.span_le] + rintro _ ⟨j, rfl⟩ + fin_cases j + · refine Submodule.mem_iSup_of_mem (0, 0, -1, -3) ?_ + rw [if_pos rfl] + exact Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) + · refine Submodule.mem_iSup_of_mem (0, 0, 1, -3) ?_ + rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) + +/-! + +#### A.4.2. The gauge decomposition on the conjugate Higgs submodule + +-/ + +@[simps!] +noncomputable instance barHiggsSubmoduleGaugeWeight (n : ℕ) : + GaugeWeightDecomposition rep (h.barHiggsSubmodule n) where + rep_mul := h.rep_mul + piece := fun w => + if w = (0, 0, 1, 3) then ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.barHiggs d 0} + else if w = (0, 0, -1, 3) then + ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.barHiggs d 1} + else ⊥ + supp := {(0, 0, 1, 3), (0, 0, -1, 3)} + piece_le := by + have hz : ∀ i : Fin 4, (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.barHiggs d 0}) + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, 3) i) := fun i => + iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_barHiggsComponent_zero i d)) + have ho : ∀ i : Fin 4, (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), Submodule.span ℂ {h.barHiggs d 1}) + ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) + ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, 3) i) := fun i => + iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_barHiggsComponent_one i d)) + intro w x hx i + rcases eq_or_ne w (0, 0, 1, 3) with rfl | hw0 + · rw [if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (hz i hx) + · rcases eq_or_ne w (0, 0, -1, 3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (ho i hx) + · rw [if_neg hw0, if_neg hw1, Submodule.mem_bot] at hx + subst hx + simp + piece_eq_bot := by + intro w hw + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hw + rw [if_neg hw.1, if_neg hw.2] + iSup_piece := by + have hrange : ∀ d : Fin n → (Fin 1 ⊕ Fin 3), + LinearMap.range (barH n d) = Submodule.span ℂ (Set.range (h.barHiggs d)) := fun d => by + rw [LinearMap.range_eq_map, ← (HiggsVec.orthonormBasis.toBasis.conj.dualBasis).span_eq, + Submodule.map_span, ← Set.range_comp] + rfl + have hmem : ∀ (d : Fin n → (Fin 1 ⊕ Fin 3)) (j : Fin 2), + h.barHiggs d j ∈ h.barHiggsSubmodule n := fun d j => + Submodule.mem_iSup_of_mem d ⟨HiggsVec.orthonormBasis.toBasis.conj.dualBasis j, rfl⟩ + refine le_antisymm (iSup_le fun w => ?_) ?_ + · rcases eq_or_ne w (0, 0, 1, 3) with rfl | hw0 + · rw [if_pos rfl] + exact iSup_le fun d => + (Submodule.span_singleton_le_iff_mem _ _).mpr (hmem d 0) + · rcases eq_or_ne w (0, 0, -1, 3) with rfl | hw1 + · rw [if_neg hw0, if_pos rfl] + exact iSup_le fun d => + (Submodule.span_singleton_le_iff_mem _ _).mpr (hmem d 1) + · rw [if_neg hw0, if_neg hw1] + exact bot_le + · rw [barHiggsSubmodule] + refine iSup_le fun d => ?_ + rw [hrange d, Submodule.span_le] + rintro _ ⟨j, rfl⟩ + fin_cases j + · refine Submodule.mem_iSup_of_mem (0, 0, 1, 3) ?_ + rw [if_pos rfl] + exact Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) + · refine Submodule.mem_iSup_of_mem (0, 0, -1, 3) ?_ + rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) + +/-! + +### A.5. The inner product of higges + +-/ + +noncomputable def dotGaugeHiggs (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) + (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + B := h.higgs d1 0 * h.barHiggs d2 0 + h.higgs d1 1 * h.barHiggs d2 1 + +lemma rep_dotGaugeHiggs (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + rep gaugeSU2Perm (h.dotGaugeHiggs d1 d2) = h.dotGaugeHiggs d1 d2 := by + rw [dotGaugeHiggs] + exact h.rep_gaugeSU2Perm_higgsBarHiggs_add d1 d2 +/-- **The inner product is gauge invariant.** `∇H†∇H` is fixed by every gauge + transformation: the hypercharge phases cancel between `H` and `H̄`, and the `SU(2)` + matrix cancels against its conjugate by unitarity. -/ +lemma rep_dotGaugeHiggs_invariant (g : GaugeGroupI) (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) + (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + rep g (h.dotGaugeHiggs d1 d2) = h.dotGaugeHiggs d1 d2 := by + have hu : ((g⁻¹).toU1 : ℂ) * (starRingEnd ℂ) ((g⁻¹).toU1 : ℂ) = 1 := + Unitary.mul_star_self_of_mem (g⁻¹).toU1.2 + have hM : star ((g⁻¹).toSU2.1) * (g⁻¹).toSU2.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (g⁻¹).toSU2.2.1 + have hM00 := congrFun (congrFun hM 0) 0 + have hM01 := congrFun (congrFun hM 0) 1 + have hM10 := congrFun (congrFun hM 1) 0 + have hM11 := congrFun (congrFun hM 1) 1 + simp only [Matrix.mul_apply, Fin.sum_univ_two, Matrix.one_apply, star_eq_conjTranspose, + Matrix.conjTranspose_apply, reduceIte, Complex.star_def, + show ¬((0 : Fin 2) = 1) from by decide, + show ¬((1 : Fin 2) = 0) from by decide] at hM00 hM01 hM10 hM11 + have hM01' := congrArg (starRingEnd ℂ) hM01 + have hM10' := congrArg (starRingEnd ℂ) hM10 + simp only [map_add, map_mul, Complex.conj_conj, map_zero] at hM01' hM10' + have hu3 : ((g⁻¹).toU1 : ℂ) ^ 3 * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3) = 1 := by + rw [map_pow, ← mul_pow, hu, one_pow] + have key : ∀ a b : ℂ, (((g⁻¹).toU1 : ℂ) ^ 3 * a) * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3 * b) + = a * (starRingEnd ℂ) b := by + intro a b + rw [map_mul] + calc (((g⁻¹).toU1 : ℂ) ^ 3 * a) * ((starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3) + * (starRingEnd ℂ) b) + = (((g⁻¹).toU1 : ℂ) ^ 3 * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3)) + * (a * (starRingEnd ℂ) b) := by ring + _ = a * (starRingEnd ℂ) b := by rw [hu3, one_mul] + rw [dotGaugeHiggs, map_add, h.rep_mul, h.rep_mul, h.rep_higgsComponent, + h.rep_barHiggsComponent, h.rep_higgsComponent, h.rep_barHiggsComponent] + simp only [Fin.sum_univ_two, add_mul, mul_add, smul_mul_smul_comm, key] + match_scalars + · linear_combination hM00 + · linear_combination hM10' + · linear_combination hM01' + · linear_combination hM11 + +/-! + +## B. The higgs algebra + +-/ + +/-- The algebra generated by the Higgs, it's conjugate and + all their derivatives. -/ +def higgsAlgebra (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) : + Subalgebra ℂ B := (Algebra.adjoin ℂ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (H k d) ∪ Set.range (barH k d))) + +/-! + +## B. Mass weight submodules + +-/ + +set_option linter.unusedVariables false in +/-- All terms built from the Higgs symbols and their derivatives which have mass weight + exactly `n`: the intersection of the algebra generated by every `∇_d H` and `∇_d H̄` with + the part on which `massWeightPoly` is the monomial `X ^ n`. -/ +noncomputable def massWeightSubmodule + (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) (n : ℕ) : + Submodule ℂ B := + h.higgsAlgebra.toSubmodule + ⊓ LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) + +/-- Any two elements of the algebra generated by the Higgs symbols commute. -/ +lemma commute_of_mem_higgsAlgebra {x y : B} (hx : x ∈ h.higgsAlgebra) (hy : y ∈ h.higgsAlgebra) : + Commute x y := by + have hgen : ∀ a ∈ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (H k d) ∪ Set.range (barH k d)), + ∀ b ∈ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (H k d) ∪ Set.range (barH k d)), Commute a b := by + intro a ha b hb + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at ha hb + obtain ⟨k1, d1, ⟨φ1, rfl⟩ | ⟨φ1, rfl⟩⟩ := ha <;> + obtain ⟨k2, d2, ⟨φ2, rfl⟩ | ⟨φ2, rfl⟩⟩ := hb + · exact h.H_comm_H _ _ _ _ _ _ + · exact h.H_comm_barH _ _ _ _ _ _ + · exact (h.H_comm_barH _ _ _ _ _ _).symm + · exact h.barH_comm_barH _ _ _ _ _ _ + rw [higgsAlgebra] at hx hy + refine Algebra.commute_of_mem_adjoin_of_forall_mem_commute hy fun b hb => ?_ + exact (Algebra.commute_of_mem_adjoin_of_forall_mem_commute hx fun a ha => hgen b hb a ha).symm + +lemma massWeightPoly_of_mem_massWeightSubmodule {n : ℕ} {x : B} (hx : x ∈ h.massWeightSubmodule n) : + massWeightPoly x = Polynomial.monomial n x := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + rcases hx with ⟨hx, hx'⟩ + rw [LinearMap.mem_ker] at hx' + simp at hx' + grind + +lemma mem_higgsAlgebra_of_mem_massWeightSubmodule {n : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule n) : x ∈ h.higgsAlgebra := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + exact hx.1 + +lemma massWeightSubmodule_mul_comm (n m : ℕ) : + h.massWeightSubmodule n * h.massWeightSubmodule m + = h.massWeightSubmodule m * h.massWeightSubmodule n := by + refine le_antisymm (Submodule.mul_le.mpr fun x hx y hy => ?_) + (Submodule.mul_le.mpr fun y hy x hx => ?_) + · rw [(h.commute_of_mem_higgsAlgebra (h.mem_higgsAlgebra_of_mem_massWeightSubmodule hx) + (h.mem_higgsAlgebra_of_mem_massWeightSubmodule hy)).eq] + exact Submodule.mul_mem_mul hy hx + · rw [← (h.commute_of_mem_higgsAlgebra (h.mem_higgsAlgebra_of_mem_massWeightSubmodule hx) + (h.mem_higgsAlgebra_of_mem_massWeightSubmodule hy)).eq] + exact Submodule.mul_mem_mul hx hy + +/-! + +### B.1. Basic grading properties of massWeightPoly + +-/ + +lemma one_le_massWeightSubmodule_zero : (1 : Submodule ℂ B) ≤ h.massWeightSubmodule 0 := by + rw [Submodule.one_eq_span, Submodule.span_le, Set.singleton_subset_iff, SetLike.mem_coe, + massWeightSubmodule, Submodule.mem_inf] + refine ⟨Subalgebra.one_mem _, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero, map_one] + simp + +lemma massWeightSubmodule_mul_le (m n : ℕ) : + h.massWeightSubmodule m * h.massWeightSubmodule n ≤ h.massWeightSubmodule (m + n) := by + rw [Submodule.mul_le] + intro x hx y hy + have hx' := hx + have hy' := hy + rw [massWeightSubmodule, Submodule.mem_inf] at hx hy + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Subalgebra.mul_mem _ hx.1 hy.1, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [map_mul, h.massWeightPoly_of_mem_massWeightSubmodule hx', + h.massWeightPoly_of_mem_massWeightSubmodule hy', Polynomial.monomial_mul_monomial] + +/-! + +### B.1. The closure of the mass weight submodules under the gauge group + +-/ + +lemma massWeightSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : + (h.massWeightSubmodule n).map (rep g) ≤ h.massWeightSubmodule n := by + have hone : rep g 1 = 1 := by + have h1 := h.rep_mul g 1 (rep g⁻¹ 1) + rw [one_mul, rep.self_inv_apply, mul_one] at h1 + exact h1.symm + let F : B →ₐ[ℂ] B := AlgHom.ofLinearMap (rep g) hone (h.rep_mul g) + have hFapp : ∀ x : B, F x = rep g x := fun _ => rfl + have hFring : ∀ x : B, F.toRingHom x = rep g x := fun _ => rfl + -- the generating symbols are permuted among themselves + have hmaps : ∀ x ∈ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (H k d) ∪ Set.range (barH k d)), F x ∈ h.higgsAlgebra := by + intro x hx + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hx + obtain ⟨k, d, (⟨φ, rfl⟩ | ⟨φ, rfl⟩)⟩ := hx + · refine Algebra.subset_adjoin ?_ + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] + exact ⟨k, d, Or.inl ⟨HiggsVec.repGaugeGroupI.dual g φ, + by rw [hFapp, h.H_equivariant]⟩⟩ + · refine Algebra.subset_adjoin ?_ + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] + exact ⟨k, d, Or.inr ⟨HiggsVec.repGaugeGroupI.conj.dual g φ, + by rw [hFapp, h.barH_equivariant]⟩⟩ + have hadj : h.higgsAlgebra.map F ≤ h.higgsAlgebra := by + rw [higgsAlgebra, AlgHom.map_adjoin] + exact Algebra.adjoin_le (by rintro _ ⟨x, hx, rfl⟩; exact hmaps x hx) + -- the grading is gauge invariant on the generated algebra + have key : ∀ b ∈ h.higgsAlgebra, + massWeightPoly (F b) = (massWeightPoly b).map F.toRingHom := by + intro b hb + rw [higgsAlgebra] at hb + induction hb using Algebra.adjoin_induction with + | mem x hx => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hx + obtain ⟨k, d, (⟨φ, rfl⟩ | ⟨φ, rfl⟩)⟩ := hx + · rw [hFapp, h.H_equivariant, h.H_massWeight, h.H_massWeight, + Polynomial.map_monomial, hFring, h.H_equivariant] + · rw [hFapp, h.barH_equivariant, h.barH_massWeight, h.barH_massWeight, + Polynomial.map_monomial, hFring, h.barH_equivariant] + | algebraMap r => simp + | add x y hx hy ihx ihy => rw [map_add, map_add, map_add, Polynomial.map_add, ihx, ihy] + | mul x y hx hy ihx ihy => rw [map_mul, map_mul, map_mul, Polynomial.map_mul, ihx, ihy] + rintro _ ⟨b, hb, rfl⟩ + rw [SetLike.mem_coe] at hb + have hb' := hb + rw [massWeightSubmodule, Submodule.mem_inf] at hb + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨hadj ⟨b, hb.1, rfl⟩, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [← hFapp, key b hb.1, h.massWeightPoly_of_mem_massWeightSubmodule hb', + Polynomial.map_monomial, hFring, hFapp] + +lemma massWeightSubmodule_closure (n : ℕ) (g : GaugeGroupI) : + (h.massWeightSubmodule n).map (rep g) = h.massWeightSubmodule n := + le_antisymm (h.massWeightSubmodule_map_rep_le n g) fun b hb => + ⟨rep g⁻¹ b, h.massWeightSubmodule_map_rep_le n g⁻¹ ⟨b, hb, rfl⟩, + rep.self_inv_apply g b⟩ + +/-! + +### B.2. The odd mass weight submodules + +Every term in the Higgs algebra has even mass weight, so the odd mass weight submodules are +trivial. +-/ + +lemma massWeightSubmodule_odd_eq_bot (n : ℕ) (hn : Odd n) : + h.massWeightSubmodule n = ⊥ := by + refine le_antisymm (fun b hb => ?_) bot_le + have hb' := hb + rw [massWeightSubmodule, Submodule.mem_inf] at hb + -- every generator has even mass weight, and weights add under multiplication + have key : ∀ x ∈ h.higgsAlgebra, ∀ i, Odd i → (massWeightPoly x).coeff i = 0 := by + intro x hx + rw [higgsAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨k, d, (⟨φ, rfl⟩ | ⟨φ, rfl⟩)⟩ := hy + · intro i hi + rw [h.H_massWeight, Polynomial.coeff_monomial, if_neg] + rintro rfl + obtain ⟨r, hr⟩ := hi + omega + · intro i hi + rw [h.barH_massWeight, Polynomial.coeff_monomial, if_neg] + rintro rfl + obtain ⟨r, hr⟩ := hi + omega + | algebraMap r => + intro i hi + have hi0 : i ≠ 0 := by rintro rfl; simp at hi + rw [AlgHom.commutes] + simp [Polynomial.algebraMap_apply, Polynomial.coeff_C, hi0] + | add x y hx hy ihx ihy => + intro i hi + rw [map_add, Polynomial.coeff_add, ihx i hi, ihy i hi, add_zero] + | mul x y hx hy ihx ihy => + intro i hi + rw [map_mul, Polynomial.coeff_mul] + refine Finset.sum_eq_zero fun p hp => ?_ + have hsum := Finset.mem_antidiagonal.mp hp + rcases Nat.even_or_odd p.1 with ⟨a, ha⟩ | ho + · obtain ⟨c, hc⟩ := hi + rw [ihy p.2 ⟨c - a, by omega⟩, mul_zero] + · rw [ihx p.1 ho, zero_mul] + have hcoeff := key b hb.1 n hn + rw [h.massWeightPoly_of_mem_massWeightSubmodule hb', Polynomial.coeff_monomial, + if_pos rfl] at hcoeff + exact hcoeff + +/-! + +### B.3. The inclusion of the Higgs and conjugate Higgs submodules in the mass weight submodule + +-/ + +lemma massWeightSubmodule_higgsSubmodule_le (n : ℕ) : + h.higgsSubmodule n ≤ h.massWeightSubmodule (2 * (1 + n)) := by + rw [higgsSubmodule] + refine iSup_le fun d => ?_ + rintro _ ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin ?_, ?_⟩ + · simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] + exact ⟨n, d, Or.inl ⟨φ, rfl⟩⟩ + · rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.H_massWeight] + +lemma massWeightSubmodule_barHiggsSubmodule_le (n : ℕ) : + h.barHiggsSubmodule n ≤ h.massWeightSubmodule (2 * (1 + n)) := by + rw [barHiggsSubmodule] + refine iSup_le fun d => ?_ + rintro _ ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin ?_, ?_⟩ + · simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] + exact ⟨n, d, Or.inr ⟨φ, rfl⟩⟩ + · rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.barH_massWeight] + +/-! + +### B.4. Decomposition of the mass weight submodule + +-/ + +lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : + h.massWeightSubmodule i + = (⨆ k ∈ Finset.univ.filter (fun k : Fin i => 2 * (1 + (k : ℕ)) = i), + h.higgsSubmodule (k : ℕ) ⊔ h.barHiggsSubmodule (k : ℕ)) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin i × Fin i => (p.1 : ℕ) + (p.2 : ℕ) = i), + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := by + refine le_antisymm (fun b hb => ?_) (sup_le ?_ ?_) + · -- the weight-zero component of an element of the algebra is a scalar + have hzero : ∀ x ∈ h.higgsAlgebra, (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B) := by + intro x hx + rw [higgsAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨k, d, (⟨φ, rfl⟩ | ⟨φ, rfl⟩)⟩ := hy + · rw [h.H_massWeight, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.barH_massWeight, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + | algebraMap r => + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] + exact Submodule.mem_one.mpr ⟨r, rfl⟩ + | add x y hx hy ihx ihy => + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ ihx ihy + | mul x y hx hy ihx ihy => + rw [map_mul, Polynomial.mul_coeff_zero] + have hmem := Submodule.mul_mem_mul ihx ihy + rwa [Submodule.one_mul] at hmem + -- the components of an element of the algebra are homogeneous + have hcomp : ∀ x ∈ h.higgsAlgebra, ∀ m, (massWeightPoly x).coeff m + ∈ h.massWeightSubmodule m := by + intro x hx + rw [higgsAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨k, d, (⟨φ, rfl⟩ | ⟨φ, rfl⟩)⟩ := hy + · intro m + rw [h.H_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.massWeightSubmodule_higgsSubmodule_le k + (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩) + · exact zero_mem _ + · intro m + rw [h.barH_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.massWeightSubmodule_barHiggsSubmodule_le k + (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩) + · exact zero_mem _ + | algebraMap r => + intro m + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs with hm + · subst hm + exact h.one_le_massWeightSubmodule_zero (Submodule.mem_one.mpr ⟨r, rfl⟩) + · exact zero_mem _ + | add x y hx hy ihx ihy => + intro m + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m) (ihy m) + | mul x y hx hy ihx ihy => + intro m + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + have hsum := Finset.mem_antidiagonal.mp hp + subst hsum + exact h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (ihx p.1) (ihy p.2)) + -- the weight-`m` component lands in the right-hand side, for every positive `m` + have main : ∀ x ∈ h.higgsAlgebra, ∀ m, 0 < m → (massWeightPoly x).coeff m + ∈ (⨆ k ∈ Finset.univ.filter (fun k : Fin m => 2 * (1 + (k : ℕ)) = m), + h.higgsSubmodule (k : ℕ) ⊔ h.barHiggsSubmodule (k : ℕ)) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin m × Fin m => (p.1 : ℕ) + (p.2 : ℕ) = m), + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := by + intro x hx + rw [higgsAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨k, d, (⟨φ, rfl⟩ | ⟨φ, rfl⟩)⟩ := hy + · intro m _ + rw [h.H_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_sup_left (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩)))) + · exact zero_mem _ + · intro m _ + rw [h.barH_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩)))) + · exact zero_mem _ + | algebraMap r => + intro m hm + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, if_neg (by omega : ¬ m = 0)] + exact zero_mem _ + | add x y hx hy ihx ihy => + intro m hm + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m hm) (ihy m hm) + | mul x y hx hy ihx ihy => + intro m hm + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + obtain ⟨j, l⟩ := p + have hsum := Finset.mem_antidiagonal.mp hp + simp only at hsum ⊢ + rcases Nat.eq_zero_or_pos j with rfl | hj + · have hlm : l = m := by omega + rw [hlm] + have hmem := Submodule.mul_mem_mul (hzero x hx) (ihy m hm) + rwa [Submodule.one_mul] at hmem + · rcases Nat.eq_zero_or_pos l with rfl | hl + · have hjm : j = m := by omega + rw [hjm] + have hmem := Submodule.mul_mem_mul (ihx m hm) (hzero y hy) + rwa [Submodule.mul_one] at hmem + · refine Submodule.mem_sup_right (Submodule.mem_iSup_of_mem + ((⟨⟨j, by omega⟩, ⟨l, by omega⟩⟩ : Fin m × Fin m)) + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hsum⟩) ?_)) + exact Submodule.mul_mem_mul (hcomp x hx j) (hcomp y hy l) + have hb' := hb + rw [massWeightSubmodule, Submodule.mem_inf] at hb + have hmain := main b hb.1 i hi + rwa [h.massWeightPoly_of_mem_massWeightSubmodule hb', Polynomial.coeff_monomial, + if_pos rfl] at hmain + · refine iSup_le fun k => iSup_le fun hk => ?_ + have hk' := (Finset.mem_filter.mp hk).2 + exact (sup_le (h.massWeightSubmodule_higgsSubmodule_le (k : ℕ)) + (h.massWeightSubmodule_barHiggsSubmodule_le (k : ℕ))).trans (le_of_eq (by rw [hk'])) + · refine iSup_le fun p => iSup_le fun hp => ?_ + have hp' := (Finset.mem_filter.mp hp).2 + exact (h.massWeightSubmodule_mul_le (p.1 : ℕ) (p.2 : ℕ)).trans (le_of_eq (by rw [hp'])) + +/-- **The gauge weight decomposition of the mass weight submodules.** By recursion on the + weight through `massWeightSubmodule_eq`: a term of weight `i` is either a symbol of that + weight — decomposed by `higgsSubmoduleGaugeWeight` and `barHiggsSubmoduleGaugeWeight` — or a + product of two terms of lower positive weight, decomposed by `mul` from the decompositions + supplied by the recursion. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeight : + (i : ℕ) → 0 < i → GaugeWeightDecomposition rep (h.massWeightSubmodule i) := by + intro i + induction i using Nat.strongRecOn with + | _ i ih => + intro hi + refine (GaugeWeightDecomposition.sup (d := ?_) (d' := ?_)).copy _ + (h.massWeightSubmodule_eq i hi) + · exact GaugeWeightDecomposition.iSup h.rep_mul fun k : Fin i => + GaugeWeightDecomposition.iSupProp h.rep_mul fun _ => + GaugeWeightDecomposition.sup (d := h.higgsSubmoduleGaugeWeight (k : ℕ)) + (d' := h.barHiggsSubmoduleGaugeWeight (k : ℕ)) + · exact GaugeWeightDecomposition.iSup h.rep_mul fun p : Fin i × Fin i => + GaugeWeightDecomposition.iSupProp h.rep_mul fun hp => + have hsum : (p.1 : ℕ) + (p.2 : ℕ) = i := (Finset.mem_filter.mp hp).2 + have hj : (p.1 : ℕ) < i := p.1.isLt + have hl : (p.2 : ℕ) < i := p.2.isLt + GaugeWeightDecomposition.mul (d := ih (p.1 : ℕ) hj (by omega)) + (d' := ih (p.2 : ℕ) hl (by omega)) + +/-- The `NeZero` form of `massWeightSubmoduleGaugeWeight`. -/ +noncomputable instance massWeightSubmoduleGaugeWeightOfNeZero (i : ℕ) [NeZero i] : + GaugeWeightDecomposition rep (h.massWeightSubmodule i) := + h.massWeightSubmoduleGaugeWeight i (Nat.pos_of_ne_zero (NeZero.ne i)) + +/-! + +### B.6. Expansion of the low dimensional cases + +-/ + +open GaugeWeightDecomposition + +lemma massWeightSubmodule_two_eq : + h.massWeightSubmodule 2 = h.higgsSubmodule 0 ⊔ h.barHiggsSubmodule 0 := by + rw [h.massWeightSubmodule_eq 2 (by decide)] + rw [show (Finset.univ.filter (fun k : Fin 2 => 2 * (1 + (k : ℕ)) = 2)) = {0} from by decide, + show (Finset.univ.filter (fun p : Fin 2 × Fin 2 => (p.1 : ℕ) + (p.2 : ℕ) = 2)) = {(1, 1)} + from by decide] + simp only [Fin.isValue, Finset.mem_singleton, iSup_iSup_eq_left, Fin.coe_ofNat_eq_mod, + Nat.zero_mod, Nat.mod_succ, h.massWeightSubmodule_odd_eq_bot 1 (by decide), Submodule.mul_bot, + bot_le, sup_of_le_left] + +lemma massWeightSubmodule_four_eq : + h.massWeightSubmodule 4 = h.higgsSubmodule 1 ⊔ h.barHiggsSubmodule 1 ⊔ + h.higgsSubmodule 0 * h.higgsSubmodule 0 ⊔ h.higgsSubmodule 0 * + h.barHiggsSubmodule 0 ⊔ h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0:= by + rw [h.massWeightSubmodule_eq 4 (by decide)] + rw [show (Finset.univ.filter (fun k : Fin 4 => 2 * (1 + (k : ℕ)) = 4)) = {1} from by decide, + show (Finset.univ.filter (fun p : Fin 4 × Fin 4 => (p.1 : ℕ) + (p.2 : ℕ) = 4)) = + {(1, 3), (3, 1), (2, 2)} from by decide] + simp [Fin.isValue, Finset.mem_singleton, iSup_iSup_eq_left, Fin.coe_ofNat_eq_mod, + Nat.one_mod,- Finset.mem_insert, Finset.iSup_insert, + h.massWeightSubmodule_odd_eq_bot 1 (by decide), + massWeightSubmodule_two_eq, ] + simp [Submodule.sup_mul, Submodule.mul_sup, Submodule.mul_sup, + barHiggsSubmodule_comm_higgsSubmodule, ← sup_assoc] + +lemma massWeightSubmodule_six_eq : h.massWeightSubmodule 6 = + -- The derivative terms + h.higgsSubmodule 2 ⊔ h.barHiggsSubmodule 2 ⊔ + h.higgsSubmodule 1 * h.higgsSubmodule 0 ⊔ + h.higgsSubmodule 1 * h.barHiggsSubmodule 0 ⊔ + h.barHiggsSubmodule 1 * h.higgsSubmodule 0 ⊔ + h.barHiggsSubmodule 1 * h.barHiggsSubmodule 0 ⊔ + -- The potential terms + h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.higgsSubmodule 0 ⊔ + h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + h.higgsSubmodule 0 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 := by + rw [h.massWeightSubmodule_eq 6 (by decide)] + rw [show (Finset.univ.filter (fun k : Fin 6 => 2 * (1 + (k : ℕ)) = 6)) = {2} from by decide, + show (Finset.univ.filter (fun p : Fin 6 × Fin 6 => (p.1 : ℕ) + (p.2 : ℕ) = 6)) = + {(1, 5), (5, 1), (2, 4), (4, 2), (3, 3)} from by decide] + simp (disch := decide) [Fin.isValue, Finset.mem_singleton, iSup_iSup_eq_left, Fin.coe_ofNat_eq_mod, + Nat.one_mod,- Finset.mem_insert, Finset.iSup_insert, + h.massWeightSubmodule_odd_eq_bot, h.massWeightSubmodule_mul_comm, + bot_sup_eq, sup_bot_eq, sup_idem] + rw [massWeightSubmodule_two_eq, massWeightSubmodule_four_eq] + have hlc : ∀ (n1 n2 : ℕ) (C : Submodule ℂ B), + h.barHiggsSubmodule n1 * (h.higgsSubmodule n2 * C) + = h.higgsSubmodule n2 * (h.barHiggsSubmodule n1 * C) := + fun n1 n2 C => Commute.left_comm (h.barHiggsSubmodule_comm_higgsSubmodule n1 n2) C + simp only [Submodule.sup_mul, Submodule.mul_sup, barHiggsSubmodule_comm_higgsSubmodule, + mul_assoc, hlc, h.higgsSubmodule_comm_higgsSubmodule 0 1 (by decide), + h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1 (by decide), ← sup_assoc, sup_right_idem] + +lemma massWeightSubmodule_eight_eq : + h.massWeightSubmodule 8 = + -- The derivative terms + h.higgsSubmodule 3 ⊔ h.barHiggsSubmodule 3 ⊔ + h.higgsSubmodule 2 * h.higgsSubmodule 0 ⊔ + h.higgsSubmodule 2 * h.barHiggsSubmodule 0 ⊔ + h.higgsSubmodule 0 * h.barHiggsSubmodule 2 ⊔ + h.barHiggsSubmodule 2 * h.barHiggsSubmodule 0 ⊔ + h.higgsSubmodule 1 * h.higgsSubmodule 1 ⊔ + h.higgsSubmodule 1 * h.barHiggsSubmodule 1 ⊔ + h.barHiggsSubmodule 1 * h.barHiggsSubmodule 1 ⊔ + h.higgsSubmodule 1 * h.higgsSubmodule 0 * h.higgsSubmodule 0 ⊔ + h.higgsSubmodule 1 * h.higgsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + h.higgsSubmodule 1 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.barHiggsSubmodule 1 ⊔ + h.higgsSubmodule 0 * h.barHiggsSubmodule 1 * h.barHiggsSubmodule 0 ⊔ + h.barHiggsSubmodule 1 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + -- The potential terms + h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.higgsSubmodule 0 ⊔ + h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + h.higgsSubmodule 0 * h.higgsSubmodule 0 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + h.higgsSubmodule 0 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 ⊔ + h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0 * + h.barHiggsSubmodule 0 := by + rw [h.massWeightSubmodule_eq 8 (by decide)] + rw [show (Finset.univ.filter (fun k : Fin 8 => 2 * (1 + (k : ℕ)) = 8)) = {3} from by decide, + show (Finset.univ.filter (fun p : Fin 8 × Fin 8 => (p.1 : ℕ) + (p.2 : ℕ) = 8)) = + {(1, 7), (7, 1), (2, 6), (6, 2), (3, 5), (5, 3), (4, 4)} from by decide] + simp (disch := decide) [Fin.isValue, Finset.mem_singleton, iSup_iSup_eq_left, Fin.coe_ofNat_eq_mod, + Nat.one_mod,- Finset.mem_insert, Finset.iSup_insert, + h.massWeightSubmodule_odd_eq_bot, h.massWeightSubmodule_mul_comm, + bot_sup_eq, sup_left_idem] + rw [massWeightSubmodule_two_eq, massWeightSubmodule_four_eq, massWeightSubmodule_six_eq] + have hlc : ∀ (n1 n2 : ℕ) (C : Submodule ℂ B), + h.barHiggsSubmodule n1 * (h.higgsSubmodule n2 * C) + = h.higgsSubmodule n2 * (h.barHiggsSubmodule n1 * C) := + fun n1 n2 C => Commute.left_comm (h.barHiggsSubmodule_comm_higgsSubmodule n1 n2) C + have hlcH : ∀ (C : Submodule ℂ B), + h.higgsSubmodule 0 * (h.higgsSubmodule 1 * C) + = h.higgsSubmodule 1 * (h.higgsSubmodule 0 * C) := + fun C => Commute.left_comm (h.higgsSubmodule_comm_higgsSubmodule 0 1 (by decide)) C + have hlcB : ∀ (C : Submodule ℂ B), + h.barHiggsSubmodule 0 * (h.barHiggsSubmodule 1 * C) + = h.barHiggsSubmodule 1 * (h.barHiggsSubmodule 0 * C) := + fun C => Commute.left_comm (h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1 (by decide)) C + simp only [Submodule.sup_mul, Submodule.mul_sup, barHiggsSubmodule_comm_higgsSubmodule, + mul_assoc, hlc, hlcH, hlcB, + h.higgsSubmodule_comm_higgsSubmodule 0 1 (by decide), + h.higgsSubmodule_comm_higgsSubmodule 0 2 (by decide), + h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1 (by decide), + h.barHiggsSubmodule_comm_barHiggsSubmodule 0 2 (by decide)] + generalize h.higgsSubmodule 3 = v1 + generalize h.barHiggsSubmodule 3 = v2 + generalize h.higgsSubmodule 2 * h.higgsSubmodule 0 = v3 + generalize h.higgsSubmodule 2 * h.barHiggsSubmodule 0 = v4 + generalize h.higgsSubmodule 0 * h.barHiggsSubmodule 2 = v5 + generalize h.barHiggsSubmodule 2 * h.barHiggsSubmodule 0 = v6 + generalize h.higgsSubmodule 1 * h.higgsSubmodule 1 = v7 + generalize h.higgsSubmodule 1 * h.barHiggsSubmodule 1 = v8 + generalize h.barHiggsSubmodule 1 * h.barHiggsSubmodule 1 = v9 + generalize h.higgsSubmodule 1 * (h.higgsSubmodule 0 * h.higgsSubmodule 0) = v10 + generalize h.higgsSubmodule 1 * (h.higgsSubmodule 0 * h.barHiggsSubmodule 0) = v11 + generalize h.higgsSubmodule 1 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0) = v12 + generalize h.higgsSubmodule 0 * (h.higgsSubmodule 0 * h.barHiggsSubmodule 1) = v13 + generalize h.higgsSubmodule 0 * (h.barHiggsSubmodule 1 * h.barHiggsSubmodule 0) = v14 + generalize h.barHiggsSubmodule 1 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0) = v15 + generalize h.higgsSubmodule 0 * (h.higgsSubmodule 0 * (h.higgsSubmodule 0 * + h.higgsSubmodule 0)) = v16 + generalize h.higgsSubmodule 0 * (h.higgsSubmodule 0 * (h.higgsSubmodule 0 * + h.barHiggsSubmodule 0)) = v17 + generalize h.higgsSubmodule 0 * (h.higgsSubmodule 0 * (h.barHiggsSubmodule 0 * + h.barHiggsSubmodule 0)) = v18 + generalize h.higgsSubmodule 0 * (h.barHiggsSubmodule 0 * (h.barHiggsSubmodule 0 * + h.barHiggsSubmodule 0)) = v19 + generalize h.barHiggsSubmodule 0 * (h.barHiggsSubmodule 0 * (h.barHiggsSubmodule 0 * + h.barHiggsSubmodule 0)) = v20 + simp only [sup_comm, sup_left_comm, sup_idem, sup_left_idem] + +/-! + +## C. Gauge invariance + +We now turn to the gauge invariance of the +different terms. + +-/ + +/-! + +### C.1. The weigh-zero pieces of the low-dimensional mass weight + +-/ + +lemma massWeightSubmodule_two_peice_zero : + piece rep (h.massWeightSubmodule 2) 0 = ⊥ := by + simp (disch := decide) [piece_congr h.massWeightSubmodule_two_eq, if_neg] + + +lemma massWeightSubmodule_four_peice_zero : + piece rep (h.massWeightSubmodule 4) 0 = Submodule.span ℂ + {h.higgs ![] 0 * h.barHiggs ![] 0, h.higgs ![] 1 * h.barHiggs ![] 1} := by + simp (disch := decide) [if_neg, piece_congr h.massWeightSubmodule_four_eq] + simp only [Std.le_refl, sup_of_le_left, mul_piece_eq_sub, supp, Int.reduceNeg, + higgsSubmoduleGaugeWeight_piece, Fin.isValue, ciSup_unique, barHiggsSubmoduleGaugeWeight_piece, + zero_sub, Finset.iSup_insert, Prod.mk.injEq, reduceCtorEq, and_self, and_false, ↓reduceIte, + bot_le, sup_of_le_right, Prod.neg_mk, neg_zero, neg_neg, and_true, Finset.mem_singleton, + iSup_iSup_eq_left, Matrix.empty_eq, Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_insert] + simp + +lemma massWeightSubmodule_six_peice_zero : + piece rep (h.massWeightSubmodule 6) 0 = + (⨆ (d : Fin 1 → _), ℂ ∙ h.higgs d 0 * h.barHiggs ![] 0) ⊔ + (⨆ (d : Fin 1 → _), ℂ ∙ h.higgs d 1 * h.barHiggs ![] 1) ⊔ + (⨆ (d : Fin 1 → _), ℂ ∙ h.barHiggs d 0 * h.higgs ![] 0) ⊔ + (⨆ (d : Fin 1 → _), ℂ ∙ h.barHiggs d 1 * h.higgs ![] 1) := by + simp (disch := decide) [if_neg, piece_congr h.massWeightSubmodule_six_eq] + simp only [mul_piece_eq_sub', supp, Finset.iSup_insert, Finset.iSup_singleton] + simp (disch := decide) [if_neg, sup_bot_eq, bot_sup_eq] + simp only [Matrix.empty_eq, Submodule.iSup_mul, Submodule.span_mul_span, + Set.singleton_mul_singleton, sup_assoc] + +lemma massWeightSubmodule_eight_peice_zero : + piece rep (h.massWeightSubmodule 8) 0 = + (⨆ (d : Fin 2 → _), ℂ ∙ h.higgs d 0 * h.barHiggs ![] 0) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ h.higgs d 1 * h.barHiggs ![] 1) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ h.barHiggs d 0 * h.higgs ![] 0) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ h.barHiggs d 1 * h.higgs ![] 1) ⊔ + (⨆ (d : Fin 1 → _), ⨆ (d2 : Fin 1 → _), ℂ ∙ h.higgs d 0 * h.barHiggs d2 0) ⊔ + (⨆ (d : Fin 1 → _), ⨆ (d2 : Fin 1 → _), ℂ ∙ h.higgs d 1 * h.barHiggs d2 1) ⊔ + ℂ ∙ h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 ⊔ + ℂ ∙ h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1 ⊔ + ℂ ∙ h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1 := by + simp (disch := decide) [if_neg, piece_congr h.massWeightSubmodule_eight_eq] + simp only [mul_piece_eq_sub', supp, Finset.iSup_insert, Finset.iSup_singleton] + simp (disch := decide) [if_neg, sup_bot_eq, bot_sup_eq] + have hbh2 : ∀ (n1 n2 : ℕ) (d1 : Fin n1 → Fin 1 ⊕ Fin 3) (d2 : Fin n2 → Fin 1 ⊕ Fin 3) + (a b : Fin 2), h.barHiggs d1 a * h.higgs d2 b = h.higgs d2 b * h.barHiggs d1 a := + fun n1 n2 d1 d2 a b => ((h.H_comm_barH _ _ _ _ _ _).symm).eq + have hhh2 : h.higgs ![] 1 * h.higgs ![] 0 = h.higgs ![] 0 * h.higgs ![] 1 := + (h.H_comm_H _ _ _ _ _ _).eq + have hbb2 : h.barHiggs ![] 1 * h.barHiggs ![] 0 = h.barHiggs ![] 0 * h.barHiggs ![] 1 := + (h.barH_comm_barH _ _ _ _ _ _).eq + simp only [Matrix.empty_eq, Submodule.sup_mul, Submodule.iSup_mul, + Submodule.mul_iSup, Submodule.span_mul_span, Set.singleton_mul_singleton, + mul_assoc, hbh2, hhh2, hbb2, ← sup_assoc, sup_idem, sup_right_idem] + have hswap : ∀ a : Fin 2, (⨆ i : Fin 1 → Fin 1 ⊕ Fin 3, ⨆ j : Fin 1 → Fin 1 ⊕ Fin 3, + ℂ ∙ h.higgs j a * h.barHiggs i a) + = ⨆ j : Fin 1 → Fin 1 ⊕ Fin 3, ⨆ i : Fin 1 → Fin 1 ⊕ Fin 3, + ℂ ∙ h.higgs j a * h.barHiggs i a := fun a => iSup_comm + rw [hswap 0, hswap 1] + +/-! + +### C.2. The instances of the SU2 Perm decompositions + +-/ + +noncomputable def massWeightFourPermDecomposition : + SU2PermDecomposition rep (piece rep (h.massWeightSubmodule 4) 0) where + piece := fun w => + if w = 0 then ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 + h.higgs ![] 1 * h.barHiggs ![] 1) + else if w = 2 then ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + else ⊥ + piece_le := by + intro k x hx + rcases eq_or_ne k 0 with rfl | hk0 + · rw [if_pos rfl, Submodule.mem_span_singleton] at hx + obtain ⟨c, rfl⟩ := hx + rw [map_smul, h.rep_gaugeSU2Perm_higgsBarHiggs_add, su2PermSign_zero, one_smul] + · rcases eq_or_ne k 2 with rfl | hk2 + · rw [if_neg hk0, if_pos rfl, Submodule.mem_span_singleton] at hx + obtain ⟨c, rfl⟩ := hx + rw [map_smul, h.rep_gaugeSU2Perm_higgsBarHiggs_sub, su2PermSign_two, smul_neg, + neg_smul, one_smul] + · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + rw [h.massWeightSubmodule_four_peice_zero] + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) ?_ + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [if_pos rfl, Submodule.span_le, Set.singleton_subset_iff] + exact Submodule.add_mem _ (Submodule.subset_span (by simp)) + (Submodule.subset_span (by simp)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [if_neg (by decide), if_pos rfl, Submodule.span_le, Set.singleton_subset_iff] + exact Submodule.sub_mem _ (Submodule.subset_span (by simp)) + (Submodule.subset_span (by simp)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · refine le_trans ?_ (sup_le (le_iSup _ (0 : ZMod 4)) (le_iSup _ (2 : ZMod 4))) + rw [if_pos rfl, if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl, Submodule.span_le] + have hp := Submodule.mem_sup_left + (S := ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 + h.higgs ![] 1 * h.barHiggs ![] 1)) + (T := ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + (Submodule.mem_span_singleton_self _) + have hm := Submodule.mem_sup_right + (S := ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 + h.higgs ![] 1 * h.barHiggs ![] 1)) + (T := ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + (Submodule.mem_span_singleton_self _) + rintro x (rfl | rfl) + · have hs := Submodule.smul_mem _ (2⁻¹ : ℂ) (Submodule.add_mem _ hp hm) + rwa [show (2⁻¹ : ℂ) • ((h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1) + + (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + = h.higgs ![] 0 * h.barHiggs ![] 0 from by module] at hs + · have hs := Submodule.smul_mem _ (2⁻¹ : ℂ) (Submodule.sub_mem _ hp hm) + rwa [show (2⁻¹ : ℂ) • ((h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1) + - (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + = h.higgs ![] 1 * h.barHiggs ![] 1 from by module] at hs -namespace IsHiggsAlgebraValued +noncomputable def massWeightSixPermDecomposition : + SU2PermDecomposition rep (piece rep (h.massWeightSubmodule 6) 0) where + piece := fun w => + if w = 0 then + (⨆ (d : Fin 1 → _), ℂ ∙ (h.higgs d 0 * h.barHiggs ![] 0 + + h.higgs d 1 * h.barHiggs ![] 1)) ⊔ + (⨆ (d : Fin 1 → _), ℂ ∙ (h.higgs ![] 0 * h.barHiggs d 0 + + h.higgs ![] 1 * h.barHiggs d 1)) + else if w = 2 then + (⨆ (d : Fin 1 → _), ℂ ∙ (h.higgs d 0 * h.barHiggs ![] 0 + - h.higgs d 1 * h.barHiggs ![] 1)) ⊔ + (⨆ (d : Fin 1 → _), ℂ ∙ (h.higgs ![] 0 * h.barHiggs d 0 + - h.higgs ![] 1 * h.barHiggs d 1)) + else ⊥ + piece_le := by + have key : ∀ (s : ℂ) (S : Submodule ℂ B), S ≤ Module.End.eigenspace (rep gaugeSU2Perm) s → + ∀ x ∈ S, rep gaugeSU2Perm x = s • x := + fun s S hS x hx => Module.End.mem_eigenspace_iff.mp (hS hx) + intro k x hx + rcases eq_or_ne k 0 with rfl | hk0 + · rw [if_pos rfl] at hx + refine key _ _ ?_ x hx + refine sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] <;> + exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_add, su2PermSign_zero, one_smul]) + · rcases eq_or_ne k 2 with rfl | hk2 + · rw [if_neg hk0, if_pos rfl] at hx + refine key _ _ ?_ x hx + refine sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] <;> + exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_sub, su2PermSign_two, neg_one_smul]) + · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + have hcomm : ∀ {n1 n2 : ℕ} (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) + (a b : Fin 2), h.barHiggs d1 a * h.higgs d2 b = h.higgs d2 b * h.barHiggs d1 a := + fun d1 d2 a b => ((h.H_comm_barH _ _ _ _ _ _).symm).eq + rw [h.massWeightSubmodule_six_peice_zero] + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) ?_ + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [if_pos rfl] + refine sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · exact add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + · rw [← hcomm d ![] 0 0, ← hcomm d ![] 1 1] + exact add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [if_neg (by decide), if_pos rfl] + refine sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + · rw [← hcomm d ![] 0 0, ← hcomm d ![] 1 1] + exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · refine le_trans ?_ (sup_le (le_iSup _ (0 : ZMod 4)) (le_iSup _ (2 : ZMod 4))) + rw [if_pos rfl, if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl] + refine sup_le (sup_le (sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_)) + (iSup_le fun d => ?_)) (iSup_le fun d => ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · rw [show h.higgs d 0 * h.barHiggs ![] 0 = (2⁻¹ : ℂ) • + ((h.higgs d 0 * h.barHiggs ![] 0 + h.higgs d 1 * h.barHiggs ![] 1) + + (h.higgs d 0 * h.barHiggs ![] 0 - h.higgs d 1 * h.barHiggs ![] 1)) + from by module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + · rw [show h.higgs d 1 * h.barHiggs ![] 1 = (2⁻¹ : ℂ) • + ((h.higgs d 0 * h.barHiggs ![] 0 + h.higgs d 1 * h.barHiggs ![] 1) + - (h.higgs d 0 * h.barHiggs ![] 0 - h.higgs d 1 * h.barHiggs ![] 1)) + from by module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + · rw [hcomm d ![] 0 0, show h.higgs ![] 0 * h.barHiggs d 0 = (2⁻¹ : ℂ) • + ((h.higgs ![] 0 * h.barHiggs d 0 + h.higgs ![] 1 * h.barHiggs d 1) + + (h.higgs ![] 0 * h.barHiggs d 0 - h.higgs ![] 1 * h.barHiggs d 1)) + from by module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + · rw [hcomm d ![] 1 1, show h.higgs ![] 1 * h.barHiggs d 1 = (2⁻¹ : ℂ) • + ((h.higgs ![] 0 * h.barHiggs d 0 + h.higgs ![] 1 * h.barHiggs d 1) + - (h.higgs ![] 0 * h.barHiggs d 0 - h.higgs ![] 1 * h.barHiggs d 1)) + from by module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + + +noncomputable def massWeightEightPermDecomposition : + SU2PermDecomposition rep (piece rep (h.massWeightSubmodule 8) 0) where + piece := fun w => + if w = 0 then + (⨆ (d : Fin 2 → _), ℂ ∙ (h.higgs d 0 * h.barHiggs ![] 0 + + h.higgs d 1 * h.barHiggs ![] 1)) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ (h.higgs ![] 0 * h.barHiggs d 0 + + h.higgs ![] 1 * h.barHiggs d 1)) ⊔ + (⨆ (d : Fin 1 → _), ⨆ (d2 : Fin 1 → _), ℂ ∙ (h.higgs d 0 * h.barHiggs d2 0 + + h.higgs d 1 * h.barHiggs d2 1)) ⊔ + ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) ⊔ + ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1) + else if w = 2 then + (⨆ (d : Fin 2 → _), ℂ ∙ (h.higgs d 0 * h.barHiggs ![] 0 + - h.higgs d 1 * h.barHiggs ![] 1)) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ (h.higgs ![] 0 * h.barHiggs d 0 + - h.higgs ![] 1 * h.barHiggs d 1)) ⊔ + (⨆ (d : Fin 1 → _), ⨆ (d2 : Fin 1 → _), ℂ ∙ (h.higgs d 0 * h.barHiggs d2 0 + - h.higgs d 1 * h.barHiggs d2 1)) ⊔ + ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + - h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + else ⊥ + piece_le := by + have key : ∀ (s : ℂ) (S : Submodule ℂ B), S ≤ Module.End.eigenspace (rep gaugeSU2Perm) s → + ∀ x ∈ S, rep gaugeSU2Perm x = s • x := + fun s S hS x hx => Module.End.mem_eigenspace_iff.mp (hS hx) + intro k x hx + rcases eq_or_ne k 0 with rfl | hk0 + · rw [if_pos rfl] at hx + refine key _ _ ?_ x hx + refine sup_le (sup_le (sup_le (sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_)) + (iSup_le fun d => iSup_le fun d2 => ?_)) ?_) ?_ <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_add, su2PermSign_zero, one_smul]) + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_add, su2PermSign_zero, one_smul]) + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_add, su2PermSign_zero, one_smul]) + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_quartic_add, su2PermSign_zero, one_smul]) + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_quartic_mixed, su2PermSign_zero, one_smul]) + · rcases eq_or_ne k 2 with rfl | hk2 + · rw [if_neg hk0, if_pos rfl] at hx + refine key _ _ ?_ x hx + refine sup_le (sup_le (sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_)) + (iSup_le fun d => iSup_le fun d2 => ?_)) ?_ <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_sub, su2PermSign_two, neg_one_smul]) + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_sub, su2PermSign_two, neg_one_smul]) + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_higgsBarHiggs_sub, su2PermSign_two, neg_one_smul]) + · exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.rep_gaugeSU2Perm_quartic_sub, su2PermSign_two, neg_one_smul]) + · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + have hcomm : ∀ {n1 n2 : ℕ} (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) + (a b : Fin 2), h.barHiggs d1 a * h.higgs d2 b = h.higgs d2 b * h.barHiggs d1 a := + fun d1 d2 a b => ((h.H_comm_barH _ _ _ _ _ _).symm).eq + rw [h.massWeightSubmodule_eight_peice_zero] + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) ?_ + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [if_pos rfl] + refine sup_le (sup_le (sup_le (sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_)) + (iSup_le fun d => iSup_le fun d2 => ?_)) ?_) ?_ <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · exact add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))))))) + · rw [← hcomm d ![] 0 0, ← hcomm d ![] 1 1] + exact add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))))) + · exact add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d2 + (Submodule.mem_span_singleton_self _)))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d2 + (Submodule.mem_span_singleton_self _))))))) + · exact add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · exact Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [if_neg (by decide), if_pos rfl] + refine sup_le (sup_le (sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_)) + (iSup_le fun d => iSup_le fun d2 => ?_)) ?_ <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))))))) + · rw [← hcomm d ![] 0 0, ← hcomm d ![] 1 1] + exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))))) + · exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d2 + (Submodule.mem_span_singleton_self _)))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d2 + (Submodule.mem_span_singleton_self _))))))) + · exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · refine le_trans ?_ (sup_le (le_iSup _ (0 : ZMod 4)) (le_iSup _ (2 : ZMod 4))) + rw [if_pos rfl, if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl] + set qp := h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1 with hqp + set qm := h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + - h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1 with hqm + refine sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + (iSup_le fun d => ?_) (iSup_le fun d => ?_)) (iSup_le fun d => ?_)) + (iSup_le fun d => ?_)) (iSup_le fun d => iSup_le fun d2 => ?_)) + (iSup_le fun d => iSup_le fun d2 => ?_)) ?_) ?_) ?_ <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · rw [show h.higgs d 0 * h.barHiggs ![] 0 = (2⁻¹ : ℂ) • + ((h.higgs d 0 * h.barHiggs ![] 0 + h.higgs d 1 * h.barHiggs ![] 1) + + (h.higgs d 0 * h.barHiggs ![] 0 - h.higgs d 1 * h.barHiggs ![] 1)) + from by module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + · rw [show h.higgs d 1 * h.barHiggs ![] 1 = (2⁻¹ : ℂ) • + ((h.higgs d 0 * h.barHiggs ![] 0 + h.higgs d 1 * h.barHiggs ![] 1) + - (h.higgs d 0 * h.barHiggs ![] 0 - h.higgs d 1 * h.barHiggs ![] 1)) + from by module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + · rw [hcomm d ![] 0 0, show h.higgs ![] 0 * h.barHiggs d 0 = (2⁻¹ : ℂ) • + ((h.higgs ![] 0 * h.barHiggs d 0 + h.higgs ![] 1 * h.barHiggs d 1) + + (h.higgs ![] 0 * h.barHiggs d 0 - h.higgs ![] 1 * h.barHiggs d 1)) + from by module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + · rw [hcomm d ![] 1 1, show h.higgs ![] 1 * h.barHiggs d 1 = (2⁻¹ : ℂ) • + ((h.higgs ![] 0 * h.barHiggs d 0 + h.higgs ![] 1 * h.barHiggs d 1) + - (h.higgs ![] 0 * h.barHiggs d 0 - h.higgs ![] 1 * h.barHiggs d 1)) + from by module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))))) + · rw [show h.higgs d 0 * h.barHiggs d2 0 = (2⁻¹ : ℂ) • + ((h.higgs d 0 * h.barHiggs d2 0 + h.higgs d 1 * h.barHiggs d2 1) + + (h.higgs d 0 * h.barHiggs d2 0 - h.higgs d 1 * h.barHiggs d2 1)) + from by module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d2 (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d2 (Submodule.mem_span_singleton_self _))))))) + · rw [show h.higgs d 1 * h.barHiggs d2 1 = (2⁻¹ : ℂ) • + ((h.higgs d 0 * h.barHiggs d2 0 + h.higgs d 1 * h.barHiggs d2 1) + - (h.higgs d 0 * h.barHiggs d2 0 - h.higgs d 1 * h.barHiggs d2 1)) + from by module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d2 (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d2 (Submodule.mem_span_singleton_self _))))))) + · rw [show h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + = (2⁻¹ : ℂ) • (qp + qm) from by rw [hqp, hqm]; module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _)))) + · exact Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · rw [show h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1 + = (2⁻¹ : ℂ) • (qp - qm) from by rw [hqp, hqm]; module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _)))) -variable {B : Type*} [Ring B] [Algebra ℂ B] - {rep : Representation ℂ GaugeGroupI B} {H : Module.Dual ℂ HiggsVec →ₗ[ℂ] B} - {barH : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} - {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) +/-! + +### C.3. The full invariance lemmas under the Gauge group for weight 4, 6, 8 + +-/ + + +lemma mem_of_mem_massWeightSubmodule_four_of_invariant {w : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule 4) (hginv : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ ℂ ∙ h.dotGaugeHiggs ![] ![] := by + have hspan : x ∈ (h.massWeightFourPermDecomposition).piece 0 := + SU2PermDecomposition.mem_zero_of_invariant h.massWeightFourPermDecomposition + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hginv) hginv + dsimp only [massWeightFourPermDecomposition] at hspan + rw [if_pos rfl] at hspan + exact hspan + +lemma mem_of_mem_massWeightSubmodule_six_of_invariant {w : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule 6) (hginv : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ (⨆ (d : Fin 1 → _), ℂ ∙ h.dotGaugeHiggs d ![]) ⊔ + (⨆ (d : Fin 1 → _), ℂ ∙ h.dotGaugeHiggs ![] d) := by + have hspan : x ∈ (h.massWeightSixPermDecomposition).piece 0 := + SU2PermDecomposition.mem_zero_of_invariant h.massWeightSixPermDecomposition + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hginv) hginv + dsimp only [massWeightSixPermDecomposition] at hspan + rw [if_pos rfl] at hspan + exact hspan + +lemma mem_of_mem_massWeightSubmodule_eight_of_invariant {w : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule 8) (hginv : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ (⨆ (d : Fin 2 → _), ℂ ∙ h.dotGaugeHiggs d ![]) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ h.dotGaugeHiggs ![] d) ⊔ + (⨆ (d : Fin 1 → _), ⨆ (d2 : Fin 1 → _), ℂ ∙ h.dotGaugeHiggs d d2) ⊔ + ℂ ∙ h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := by + -- the two sieves: `x` lies in the Weyl-grade-zero part of the gauge-weight-zero piece + have hspan : x ∈ (h.massWeightEightPermDecomposition).piece 0 := + SU2PermDecomposition.mem_zero_of_invariant h.massWeightEightPermDecomposition + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hginv) hginv + dsimp only [massWeightEightPermDecomposition] at hspan + rw [if_pos rfl, sup_assoc] at hspan + -- commutation lemmas for sorting quartic monomials + have hHH : ∀ i j, h.higgs ![] i * h.higgs ![] j = h.higgs ![] j * h.higgs ![] i := + fun i j => (h.H_comm_H _ _ _ _ _ _).eq + have hbH : ∀ i j, h.barHiggs ![] i * h.higgs ![] j = h.higgs ![] j * h.barHiggs ![] i := + fun i j => (h.H_comm_barH _ _ _ _ _ _).symm.eq + have hbb : ∀ i j, h.barHiggs ![] i * h.barHiggs ![] j + = h.barHiggs ![] j * h.barHiggs ![] i := fun i j => (h.barH_comm_barH _ _ _ _ _ _).eq + have hHH' : ∀ i j (y : B), h.higgs ![] i * (h.higgs ![] j * y) + = h.higgs ![] j * (h.higgs ![] i * y) := fun i j y => by rw [← mul_assoc, hHH, mul_assoc] + have hbH' : ∀ i j (y : B), h.barHiggs ![] i * (h.higgs ![] j * y) + = h.higgs ![] j * (h.barHiggs ![] i * y) := fun i j y => by rw [← mul_assoc, hbH, mul_assoc] + -- basis change in the quartic sector: `{u + w, v}` spans the same plane as `{(H†H)², (H†σ³H)²}` + have hmm : h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] + = (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + + (2 : ℂ) • (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1) := by + rw [dotGaugeHiggs] + simp only [add_mul, mul_add, mul_assoc, hHH', hbH', hbb] + match_scalars <;> norm_num + have htt : (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + = (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + - (2 : ℂ) • (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1) := by + simp only [sub_mul, mul_sub, mul_assoc, hHH', hbH', hbb] + match_scalars <;> norm_num + have hquart : (ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1)) ⊔ + (ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1)) + = (ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) ⊔ + (ℂ ∙ ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1))) := by + refine le_antisymm (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · rw [show h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1 + = (2⁻¹ : ℂ) • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] + + (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + from by rw [hmm, htt]; module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + · rw [show h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1 + = ((4 : ℂ)⁻¹) • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] + - (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + from by rw [hmm, htt]; module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + · rw [hmm] + exact add_mem (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + · rw [htt] + exact sub_mem (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + have hspan2 : x ∈ (((⨆ d : Fin 2 → (Fin 1 ⊕ Fin 3), ℂ ∙ h.dotGaugeHiggs d ![]) ⊔ + (⨆ d : Fin 2 → (Fin 1 ⊕ Fin 3), ℂ ∙ h.dotGaugeHiggs ![] d)) ⊔ + (⨆ d : Fin 1 → (Fin 1 ⊕ Fin 3), ⨆ d2 : Fin 1 → (Fin 1 ⊕ Fin 3), + ℂ ∙ h.dotGaugeHiggs d d2)) ⊔ + ((ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) ⊔ + (ℂ ∙ ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)))) := by + rw [hquart] at hspan + exact hspan + -- the cyclic `SU(2)` element implementing the quarter-turn about the diagonal axis + have hmem : !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; + (1 - Complex.I) / 2, (1 + Complex.I) / 2] ∈ specialUnitaryGroup (Fin 2) ℂ := by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply, map_div₀, map_ofNat, + Complex.ext_iff] <;> norm_num + · rw [Matrix.det_fin_two_of] + simp [Complex.ext_iff] + norm_num + set g : GaugeGroupI := ⟨1, ⟨_, hmem⟩, 1⟩ with hg + have hgmat : ((g⁻¹).toSU2 : Matrix (Fin 2) (Fin 2) ℂ) + = !![(1 + Complex.I)/2, (1 + Complex.I)/2; (-1 + Complex.I)/2, (1 - Complex.I)/2] := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + ext a b + fin_cases a <;> fin_cases b <;> + simp [hg, GaugeGroupI.toSU2, Complex.conj_I, Complex.ext_iff] + have hU1 : ((g⁻¹).toU1 : ℂ) = 1 := by simp [hg, GaugeGroupI.toU1] + have hH0 : rep g (h.higgs ![] 0) + = ((1 + Complex.I)/2) • h.higgs ![] 0 + ((1 + Complex.I)/2) • h.higgs ![] 1 := by + rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hgmat] + simp + have hH1 : rep g (h.higgs ![] 1) + = ((-1 + Complex.I)/2) • h.higgs ![] 0 + ((1 - Complex.I)/2) • h.higgs ![] 1 := by + rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hgmat] + simp + have hB0 : rep g (h.barHiggs ![] 0) + = ((1 - Complex.I)/2) • h.barHiggs ![] 0 + ((1 - Complex.I)/2) • h.barHiggs ![] 1 := by + rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hgmat] + simp [map_div₀, Complex.conj_I, map_ofNat] + module + have hB1 : rep g (h.barHiggs ![] 1) + = ((-1 - Complex.I)/2) • h.barHiggs ![] 0 + ((1 + Complex.I)/2) • h.barHiggs ![] 1 := by + rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hgmat] + simp [map_div₀, Complex.conj_I, map_ofNat] + module + -- the triplet term cycles: `n₃ ↦ n₁ ↦ i n₂`, and the Fierz identity closes the orbit + have hn3 : rep g (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + = h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0 := by + rw [map_sub, h.rep_mul, h.rep_mul, hH0, hB0, hH1, hB1] + simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm] + match_scalars <;> simp [Complex.ext_iff] <;> norm_num + have hn1 : rep g (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + = Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0) := by + rw [map_add, h.rep_mul, h.rep_mul, hH0, hB0, hH1, hB1] + simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm, smul_sub] + match_scalars <;> simp [Complex.ext_iff] <;> norm_num + have fierz : (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + + (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + * (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + + (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0)) + * (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0)) + = h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := by + rw [dotGaugeHiggs] + simp only [sub_mul, mul_sub, add_mul, mul_add, smul_mul_assoc, mul_smul_comm, + mul_assoc, hHH', hbH', hbb] + match_scalars <;> simp [Complex.ext_iff] + have hT3 : ∀ y : B, rep (g * g) y = rep g (rep g y) := by + intro y + rw [map_mul] + rfl + have e1 : rep g ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + = (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + * (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) := by + rw [h.rep_mul, hn3] + have e2 : rep (g * g) ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + = (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0)) + * (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0)) := by + rw [hT3, e1, h.rep_mul, hn1] + have hmm2 : ∀ k : GaugeGroupI, rep k (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) + = h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := fun k => by + rw [h.rep_mul, h.rep_dotGaugeHiggs_invariant] + -- averaging over `{1, g, g²}` projects onto the genuinely invariant span + set T : B →ₗ[ℂ] B := LinearMap.id + rep g + rep (g * g) with hT + have hTapp : ∀ y : B, T y = y + rep g y + rep (g * g) y := fun y => rfl + have hmaple : Submodule.map T ((((⨆ d : Fin 2 → (Fin 1 ⊕ Fin 3), ℂ ∙ h.dotGaugeHiggs d ![]) ⊔ + (⨆ d : Fin 2 → (Fin 1 ⊕ Fin 3), ℂ ∙ h.dotGaugeHiggs ![] d)) ⊔ + (⨆ d : Fin 1 → (Fin 1 ⊕ Fin 3), ⨆ d2 : Fin 1 → (Fin 1 ⊕ Fin 3), + ℂ ∙ h.dotGaugeHiggs d d2)) ⊔ + ((ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) ⊔ + (ℂ ∙ ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1))))) + ≤ (⨆ (d : Fin 2 → _), ℂ ∙ h.dotGaugeHiggs d ![]) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ h.dotGaugeHiggs ![] d) ⊔ + (⨆ (d : Fin 1 → _), ⨆ (d2 : Fin 1 → _), ℂ ∙ h.dotGaugeHiggs d d2) ⊔ + ℂ ∙ h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := by + simp only [Submodule.map_sup, Submodule.map_iSup, Submodule.map_span, Set.image_singleton] + refine sup_le (sup_le (sup_le (iSup_le fun d => ?_) (iSup_le fun d => ?_)) + (iSup_le fun d => iSup_le fun d2 => ?_)) (sup_le ?_ ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · rw [hTapp, h.rep_dotGaugeHiggs_invariant, h.rep_dotGaugeHiggs_invariant] + exact add_mem (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + · rw [hTapp, h.rep_dotGaugeHiggs_invariant, h.rep_dotGaugeHiggs_invariant] + exact add_mem (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))))) + · rw [hTapp, h.rep_dotGaugeHiggs_invariant, h.rep_dotGaugeHiggs_invariant] + exact add_mem (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d2 + (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d2 + (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d2 + (Submodule.mem_span_singleton_self _))))) + · rw [hTapp, hmm2, hmm2] + exact add_mem (add_mem + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · rw [hTapp, e1, e2, fierz] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have hfin := hmaple ⟨x, hspan2, rfl⟩ + rw [hTapp, hginv, hginv] at hfin + have hfin' := Submodule.smul_mem _ ((3 : ℂ)⁻¹) hfin + rwa [show ((3 : ℂ)⁻¹) • (x + x + x) = x from by module] at hfin' + +/-! + +### C.4. The full gauge invariant submodule up to mass weight 8 + +-/ + +/-! + +## D. Invariance under the Lorentz group + +Given the invariance under the the gauge group, +we now give the invariance under the Lorentz group. +-/ + +/-! + +### D.1. The decomposition under boost weights in the x-direction + +-/ + +/-! + +### D.2. The decomposition under boost weights in the y-direction + +-/ + +/-! + +### D.3. The decomposition under boost weights in the z-direction + +-/ + +/-! + +########################################### +# Below here is old. +########################################### /-! @@ -116,43 +2049,11 @@ set_option linter.unusedVariables false in noncomputable def higgsComponent (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (i : Fin 2) : B := H (HiggsVec.orthonormBasis.toBasis.dualBasis i) -lemma rep_higgsComponent (g : GaugeGroupI) (i : Fin 2) : - rep g (h.higgsComponent i) = - ∑ j, (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j) • h.higgsComponent j := by - have key : HiggsVec.repGaugeGroupI.dual g (HiggsVec.orthonormBasis.toBasis.dualBasis i) - = ∑ j, (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j) • - HiggsVec.orthonormBasis.toBasis.dualBasis j := by - refine HiggsVec.orthonormBasis.toBasis.ext fun k => ?_ - rw [LinearMap.sum_apply] - simp only [LinearMap.smul_apply, smul_eq_mul, Module.Basis.dualBasis_apply_self, - mul_ite, mul_one, mul_zero, Finset.sum_ite_eq] - simp [Representation.dual, HiggsVec.repGaugeGroupI_apply, HiggsVec.orthonormBasis, - Submonoid.smul_def, -inv_pow] - rw [higgsComponent, h.H_equivariant, key, map_sum] - exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl - set_option linter.unusedVariables false in /-- The component symbol `H̄^i` of the conjugate Higgs. -/ noncomputable def barHiggsComponent (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (i : Fin 2) : B := barH (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) -lemma rep_barHiggsComponent (g : GaugeGroupI) (i : Fin 2) : - rep g (h.barHiggsComponent i) = - ∑ j, (starRingEnd ℂ (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j)) • - h.barHiggsComponent j := by - have key : HiggsVec.repGaugeGroupI.conj.dual g - (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) - = ∑ j, (starRingEnd ℂ (((g⁻¹).toU1 : ℂ) ^ 3 * (g⁻¹).toSU2.1 i j)) • - HiggsVec.orthonormBasis.toBasis.conj.dualBasis j := by - refine HiggsVec.orthonormBasis.toBasis.conj.ext fun k => ?_ - rw [LinearMap.sum_apply] - simp only [LinearMap.smul_apply, smul_eq_mul, Module.Basis.dualBasis_apply_self, - mul_ite, mul_one, mul_zero, Finset.sum_ite_eq] - simp [Representation.dual, Representation.conj_apply, HiggsVec.repGaugeGroupI_apply, - HiggsVec.orthonormBasis, Submonoid.smul_def, -inv_pow] - rw [barHiggsComponent, h.barH_equivariant, key, map_sum] - exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl - /-! ## The submodules @@ -214,14 +2115,6 @@ mass dimension at most four — is `higgsMassWeightSubmodule 8`. -/ -set_option linter.unusedVariables false in -/-- All terms created from Higgs fields of mass weight less then n. -/ -noncomputable def higgsMassWeightSubmodule (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) - (n : ℕ) : - Submodule ℂ B := - (Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)))).toSubmodule - ⊓ Submodule.comap massWeightPoly.toLinearMap - ((Polynomial.degreeLE B (n : WithBot ℕ)).restrictScalars ℂ) /-- Membership in `higgsMassWeightSubmodule`, unfolded: a term of the subalgebra generated by the symbols whose mass-weight polynomial has degree at most `n`. -/ @@ -449,27 +2342,11 @@ carries the closure through products, powers and sums. -/ -lemma higgsSubmodule_map_le (g : GaugeGroupI) : - h.higgsSubmodule.map (rep g) ≤ h.higgsSubmodule := by - rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ - exact ⟨HiggsVec.repGaugeGroupI.dual g φ, (h.H_equivariant g φ).symm⟩ - lemma barHiggsSubmodule_map_le (g : GaugeGroupI) : h.barHiggsSubmodule.map (rep g) ≤ h.barHiggsSubmodule := by rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ exact ⟨HiggsVec.repGaugeGroupI.conj.dual g φ, (h.barH_equivariant g φ).symm⟩ -/-- The Higgs symbols are closed under the gauge action.-/ -lemma higgsSubmodule_closure (g : GaugeGroupI) : - h.higgsSubmodule.map (rep g) = h.higgsSubmodule := - le_antisymm (h.higgsSubmodule_map_le g) fun b hb => - ⟨rep g⁻¹ b, h.higgsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ - -/-- The conjugate Higgs symbols are closed under the gauge action. -/ -lemma barHiggsSubmodule_closure (g : GaugeGroupI) : - h.barHiggsSubmodule.map (rep g) = h.barHiggsSubmodule := - le_antisymm (h.barHiggsSubmodule_map_le g) fun b hb => - ⟨rep g⁻¹ b, h.barHiggsSubmodule_map_le g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ /-- The mass-dimension-one terms are closed under the gauge action. -/ lemma scalarSubmoduleOne_closure (g : GaugeGroupI) : @@ -546,39 +2423,6 @@ lemma higgsMassWeightSubmodule_closure (g : GaugeGroupI) (n : ℕ) : -/ omit rep_mul in -/-- The component symbol `H^0` is a joint eigenvector of all four torus generators, at the - gauge weight `(0, 0, -1, -3)`. The Higgs is a colour singlet, so both colour exponents - vanish; the symbol transforms contragrediently to the doublet, so its isospin weight is - `-1` and its hypercharge `-3`. -/ -lemma rep_gaugeTorusGen_higgsComponent_zero (i : Fin 4) : - rep (gaugeTorusGen i) (h.higgsComponent 0) - = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, -3) i) • h.higgsComponent 0 := by - have hstar : ((starRingEnd ℂ) (expI : ℂ)) ^ 3 = (((expI : ℂ)) ^ 3)⁻¹ := by - rw [← inv_pow] - congr 1 - exact expI_inv_eq_star.symm - rw [h.rep_higgsComponent] - fin_cases i <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, - Fin.sum_univ_two, expI_inv_eq_star, Matrix.one_apply, Unitary.coe_inv, hstar] - rfl - -omit rep_mul in -/-- The component symbol `H^1` is a joint eigenvector of all four torus generators, at the - gauge weight `(0, 0, 1, -3)`. -/ -lemma rep_gaugeTorusGen_higgsComponent_one (i : Fin 4) : - rep (gaugeTorusGen i) (h.higgsComponent 1) - = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, -3) i) • h.higgsComponent 1 := by - have hstar : ((starRingEnd ℂ) (expI : ℂ)) ^ 3 = (((expI : ℂ)) ^ 3)⁻¹ := by - rw [← inv_pow] - congr 1 - exact expI_inv_eq_star.symm - rw [h.rep_higgsComponent] - fin_cases i <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, - Fin.sum_univ_two, expI_inv_eq_star, Matrix.one_apply, Unitary.coe_inv, hstar] - rfl - omit rep_mul in /-- The gauge weight decomposition on the submodule `higgsSubmodule`. @@ -642,33 +2486,6 @@ noncomputable def higgsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H ba exact Submodule.mem_span_singleton_self _ omit rep_mul in -/-- The conjugate component symbol `H̄^0` is a joint eigenvector of all four torus - generators, at the gauge weight `(0, 0, 1, 3)`. Conjugation negates every exponent, so the - weights here are the negatives of those of `H^0` and `H^1` — with the isospin weights - exchanged between the two components. -/ -lemma rep_gaugeTorusGen_barHiggsComponent_zero (i : Fin 4) : - rep (gaugeTorusGen i) (h.barHiggsComponent 0) - = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, 3) i) • h.barHiggsComponent 0 := by - have hc : (starRingEnd ℂ) (expI : ℂ) = ((expI : ℂ))⁻¹ := expI_inv_eq_star.symm - rw [h.rep_barHiggsComponent] - fin_cases i <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, - Fin.sum_univ_two, Matrix.one_apply, Unitary.coe_inv, hc] - rfl - -omit rep_mul in -/-- The conjugate component symbol `H̄^1` is a joint eigenvector of all four torus - generators, at the gauge weight `(0, 0, -1, 3)`. -/ -lemma rep_gaugeTorusGen_barHiggsComponent_one (i : Fin 4) : - rep (gaugeTorusGen i) (h.barHiggsComponent 1) - = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, 3) i) • h.barHiggsComponent 1 := by - have hc : (starRingEnd ℂ) (expI : ℂ) = ((expI : ℂ))⁻¹ := expI_inv_eq_star.symm - rw [h.rep_barHiggsComponent] - fin_cases i <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, - Fin.sum_univ_two, Matrix.one_apply, Unitary.coe_inv, hc] - rfl - omit rep_mul in /-- The gauge weight decomposition on the submodule `barHiggsSubmodule`. @@ -678,58 +2495,6 @@ omit rep_mul in As for `higgsSubmoduleGaugeWeight` the zero-weight piece is `⊥`, so no nonzero term linear in the conjugate Higgs is gauge invariant. -/ -noncomputable def barHiggsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - GaugeWeightDecomposition rep h.barHiggsSubmodule where - piece := fun w => - if w = (0, 0, 1, 3) then Submodule.span ℂ {h.barHiggsComponent 0} - else if w = (0, 0, -1, 3) then Submodule.span ℂ {h.barHiggsComponent 1} else ⊥ - supp := {(0, 0, 1, 3), (0, 0, -1, 3)} - piece_le := by - have hz : ∀ i : Fin 4, Submodule.span ℂ {h.barHiggsComponent 0} - ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) - ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, 3) i) := fun i => - (Submodule.span_singleton_le_iff_mem _ _).mpr - (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_barHiggsComponent_zero i)) - have ho : ∀ i : Fin 4, Submodule.span ℂ {h.barHiggsComponent 1} - ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) - ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, 3) i) := fun i => - (Submodule.span_singleton_le_iff_mem _ _).mpr - (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_barHiggsComponent_one i)) - intro w x hx i - rcases eq_or_ne w (0, 0, 1, 3) with rfl | hw0 - · rw [if_pos rfl] at hx - exact Module.End.mem_eigenspace_iff.mp (hz i hx) - · rcases eq_or_ne w (0, 0, -1, 3) with rfl | hw1 - · rw [if_neg hw0, if_pos rfl] at hx - exact Module.End.mem_eigenspace_iff.mp (ho i hx) - · rw [if_neg hw0, if_neg hw1, Submodule.mem_bot] at hx - subst hx - simp - piece_eq_bot := by - intro w hw - simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hw - rw [if_neg hw.1, if_neg hw.2] - iSup_piece := by - refine le_antisymm (iSup_le fun w => ?_) ?_ - · rcases eq_or_ne w (0, 0, 1, 3) with rfl | hw0 - · rw [if_pos rfl] - exact (Submodule.span_singleton_le_iff_mem _ _).mpr - (h.barHiggsComponent_mem_barHiggsSubmodule 0) - · rcases eq_or_ne w (0, 0, -1, 3) with rfl | hw1 - · rw [if_neg hw0, if_pos rfl] - exact (Submodule.span_singleton_le_iff_mem _ _).mpr - (h.barHiggsComponent_mem_barHiggsSubmodule 1) - · rw [if_neg hw0, if_neg hw1] - exact bot_le - · rw [h.barHiggsSubmodule_eq_span_barHiggsComponents, Submodule.span_le] - rintro _ ⟨j, rfl⟩ - fin_cases j - · refine Submodule.mem_iSup_of_mem (0, 0, 1, 3) ?_ - rw [if_pos rfl] - exact Submodule.mem_span_singleton_self _ - · refine Submodule.mem_iSup_of_mem (0, 0, -1, 3) ?_ - rw [if_neg (by decide), if_pos rfl] - exact Submodule.mem_span_singleton_self _ omit rep_mul in lemma higgsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : @@ -1153,7 +2918,7 @@ lemma invariant_mem_span_massTerm_of_mem_higgsMassWeightSubmodule exact hmaple ⟨x, hspan, rfl⟩ have hfin' := Submodule.smul_mem _ ((3 : ℂ)⁻¹) hfin rwa [smul_smul, inv_mul_cancel₀ (by norm_num : (3 : ℂ) ≠ 0), one_smul] at hfin' - +-/ end IsHiggsAlgebraValued end StandardModel From 60ae0fed55a6bebb4125e291e8bddce657e9e674 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 24 Aug 2026 19:13:42 +0400 Subject: [PATCH 193/254] refactor(Relativity): migrate boost weights to indexed axis boosts Co-authored-by: Claude Opus 4.8 --- Physlib/Relativity/IsLorentzDeriv.lean | 63 ++++--------------- .../LorentzGroup/Boosts/WeightGrading.lean | 34 +++++----- 2 files changed, 28 insertions(+), 69 deletions(-) diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index e5a148c73..bc164141f 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -151,23 +151,18 @@ def lightConeMinus (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) (i : Fin 3) : A section -set_option linter.unusedSimpArgs false - /-- A transverse Lorentz derivative leaves the boost weight along the `i`-th axis alone. -/ lemma transverse_mem [IsLorentzDeriv rep D] {i j : Fin 3} (hij : j ≠ i) {k : ℤ} {x : A} (hx : x ∈ BoostWeight.boostWeightSubmodule rep i k) : D (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule rep i k := by intro t ht rw [rep_deriv, hx t ht, algebraMap_real_complex] + rw [show Lorentz.SL2C.toLorentzGroup (Lorentz.SL2C.boostAxis i t ht) = + LorentzGroup.boostAxis i t ht from rfl] fin_cases i <;> fin_cases j <;> first | exact absurd rfl hij - | simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk, - boostAxis_zero, toLorentzGroup_boostXel, boostMatX, - boostAxis_one, toLorentzGroup_boostYel, boostMatY, - boostAxis_two, toLorentzGroup_boostZel, boostMatZ, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, map_smul, - Complex.ofReal_zero, zero_smul, Complex.ofReal_one, one_smul, add_zero, zero_add] + | simp [LorentzGroup.boostAxis_apply] /-- The light-cone combination `D_0 - D_i` raises the boost weight along the `i`-th axis by two. -/ @@ -179,28 +174,12 @@ lemma lightConePlus_mem [IsLorentzDeriv rep D] {i : Fin 3} {k : ℤ} {x : A} simp only [lightConePlus, LinearMap.sub_apply] rw [map_sub, rep_deriv, rep_deriv, hx t ht] rw [algebraMap_real_complex, zpow_add₀ ht'] + rw [show Lorentz.SL2C.toLorentzGroup (Lorentz.SL2C.boostAxis i t ht) = + LorentzGroup.boostAxis i t ht from rfl] fin_cases i - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) + all_goals + simp [LorentzGroup.boostAxis_apply, Fintype.sum_sum_type, Fin.sum_univ_three] + match_scalars <;> (field_simp [ht']; noncomm_ring) /-- The light-cone combination `D_0 + D_i` lowers the boost weight along the `i`-th axis by two. -/ @@ -212,28 +191,12 @@ lemma lightConeMinus_mem [IsLorentzDeriv rep D] {i : Fin 3} {k : ℤ} {x : A} simp only [lightConeMinus, LinearMap.add_apply] rw [map_add, rep_deriv, rep_deriv, hx t ht] rw [algebraMap_real_complex, zpow_sub₀ ht'] + rw [show Lorentz.SL2C.toLorentzGroup (Lorentz.SL2C.boostAxis i t ht) = + LorentzGroup.boostAxis i t ht from rfl] fin_cases i - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - · simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) + all_goals + simp [LorentzGroup.boostAxis_apply, Fintype.sum_sum_type, Fin.sum_univ_three] + match_scalars <;> (field_simp [ht']; noncomm_ring) end diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index 3cc7e72a4..60d6d2129 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -68,14 +68,14 @@ private lemma algebraMap_ne_zero {t : ℝ} (ht : t ≠ 0) : (algebraMap ℝ K t) `z`-boost at parameter `t`. -/ def boostWeightSubmodule (rep : Representation K SL(2,ℂ) M) (i : Fin 3) (w : ℤ) : Submodule K M where carrier := {x | ∀ (t : ℝ) (ht : t ≠ 0), - rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x} + rep (Lorentz.SL2C.boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x} add_mem' {a b} ha hb := fun t ht => by rw [map_add, ha t ht, hb t ht, smul_add] zero_mem' := fun t ht => by rw [map_zero, smul_zero] smul_mem' c x hx := fun t ht => by rw [map_smul, hx t ht, smul_comm] lemma mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {w : ℤ} {x : M} : x ∈ boostWeightSubmodule rep i w ↔ ∀ (t : ℝ) (ht : t ≠ 0), - rep (boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl + rep (Lorentz.SL2C.boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl /-- The span of all the weight spaces. -/ def weightSpan (rep : Representation K SL(2,ℂ) M) (i : Fin 3) : Submodule K M := @@ -288,34 +288,29 @@ lemma weightSpan_eq_top_of_lorentzColumns {rep : Representation K SL(2,ℂ) M} weightSpan rep 2 = ⊤ := by haveI : CharZero K := charZero_of_injective_algebraMap (algebraMap ℝ K).injective have key : ∀ (t : ℝ) (ht : t ≠ 0) (μ : Fin 1 ⊕ Fin 3), - rep (boostAxis 2 t ht) (b μ) = - ∑ j, algebraMap ℝ K (boostMatZ t j μ) • b j := by + rep (Lorentz.SL2C.boostAxis 2 t ht) (b μ) = + ∑ j, algebraMap ℝ K ((LorentzGroup.boostAxis 2 t ht).1 j μ) • b j := by intro t ht μ rw [h] - exact Finset.sum_congr rfl fun j _ => by - rw [show boostAxis 2 t ht = boostZel t ht from rfl, toLorentzGroup_boostZel] + rfl have hplus : b (Sum.inl 0) - b (Sum.inr 2) ∈ boostWeightSubmodule rep 2 2 := by intro t ht have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht rw [map_sub, key t ht, key t ht] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, - map_add, map_pow, map_inv₀, map_ofNat, map_neg] - match_scalars <;> (field_simp; try ring_nf; try norm_num) + simp [Fintype.sum_sum_type, Fin.sum_univ_three, LorentzGroup.boostAxis_apply] + match_scalars <;> + (field_simp; try ring_nf; try norm_num; try simp only [map_ofNat, true_or]) have hminus : b (Sum.inl 0) + b (Sum.inr 2) ∈ boostWeightSubmodule rep 2 (-2) := by intro t ht have h0 : (algebraMap ℝ K t) ≠ 0 := algebraMap_ne_zero ht rw [map_add, key t ht, key t ht] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_div₀, map_sub, - map_add, map_pow, map_inv₀, map_ofNat, map_neg] - match_scalars <;> (field_simp; try ring_nf; try norm_num) + simp [Fintype.sum_sum_type, Fin.sum_univ_three, LorentzGroup.boostAxis_apply] + match_scalars <;> (field_simp; try ring_nf; try simp only [map_ofNat]) have htr : ∀ i' : Fin 3, i' = 0 ∨ i' = 1 → b (Sum.inr i') ∈ boostWeightSubmodule rep 2 0 := by rintro i (rfl | rfl) <;> · intro t ht rw [key t ht] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, boostMatZ, - map_zero, zero_smul, add_zero, zero_add, map_one, one_smul, zpow_zero] + simp [LorentzGroup.boostAxis_apply] refine weightSpan_eq_top_of_basis b fun μ => ?_ match μ with | Sum.inl 0 => @@ -369,7 +364,7 @@ lemma weightSpan_baseChange_eq_top {A : Type*} [AddCommGroup A] [Module ℝ A] span along the `z`-axis. -/ lemma weightSpan_eq_top_of_two {rep : Representation K SL(2,ℂ) M} (h : weightSpan rep 2 = ⊤) (i : Fin 3) : weightSpan rep i = ⊤ := by - obtain ⟨R, hR⟩ := exists_conj_boostAxis i + obtain ⟨R, hR⟩ := Lorentz.SL2C.exists_conj_boostAxis i have hsurj : ∀ x : M, rep R (rep R⁻¹ x) = x := by intro x rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] @@ -440,7 +435,8 @@ instance [IsBoostGraded rep] : SetLike.GradedMonoid (boostWeightSubmodule rep i) /-- The weight space of weight `k` sits inside the `2 ^ k` eigenspace of the boost at parameter two. -/ lemma boostWeightSubmodule_le_eigenspace (k : ℤ) : - boostWeightSubmodule rep i k ≤ Module.End.eigenspace (rep (boostAxis i 2 two_ne_zero)) + boostWeightSubmodule rep i k ≤ + Module.End.eigenspace (rep (Lorentz.SL2C.boostAxis i 2 two_ne_zero)) ((algebraMap ℝ K 2) ^ k) := by intro x hx rw [Module.End.mem_eigenspace_iff] @@ -456,7 +452,7 @@ private lemma zpow_algebraMap_two_injective : it exists. -/ lemma boostWeightSubmodule_iSupIndep : iSupIndep (boostWeightSubmodule rep i) := ((Module.End.eigenspaces_iSupIndep - (rep (boostAxis i 2 two_ne_zero) : Module.End K A)).comp + (rep (Lorentz.SL2C.boostAxis i 2 two_ne_zero) : Module.End K A)).comp zpow_algebraMap_two_injective).mono fun k => boostWeightSubmodule_le_eigenspace rep k /-- Recover the two summands from the sum and difference: if `u + v` and `u - v` lie in a From b165de533df35bb49d789a0ef5fcd616d8e49907 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 25 Aug 2026 12:31:33 +0100 Subject: [PATCH 194/254] feat: Full invaiance of the dim-3 case --- .../HiggsBoson/AlgebraValued/Basic.lean | 1884 +++++++++-------- .../LorentzGroup/Boosts/WeightGrading.lean | 38 +- 2 files changed, 1028 insertions(+), 894 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index 31d778cd1..10b486a22 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition @@ -19,6 +20,7 @@ public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.RepresentationTheory.Invariants /-! # The algebra valued Higgs boson @@ -88,6 +90,10 @@ structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] /-- Gauge transformations act on `B` by algebra maps: the representation is multiplicative. -/ rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂ + /-- Lorentz transformations act on `B` by algebra maps: the representation is + multiplicative. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ /-- The Higgs is bosonic: two Higgs symbols commute. -/ H_comm_H : ∀ φ ψ n1 n2 l1 l2, Commute (H n1 l1 φ) (H n2 l2 ψ) /-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ @@ -632,17 +638,37 @@ noncomputable instance barHiggsSubmoduleGaugeWeight (n : ℕ) : -/ +open Lorentz.BoostWeight + +noncomputable def dot (x y : Fin 2 → B) : B := x 0 * y 0 + x 1 * y 1 + + +include h in +/-- The boost weights of the two factors of an isospin contraction add. -/ +lemma dot_mem_boostWeightSubmodule {i : Fin 3} {a b : ℤ} {x y : Fin 2 → B} + (hx : ∀ j, x j ∈ boostWeightSubmodule repLorentz i a) + (hy : ∀ j, y j ∈ boostWeightSubmodule repLorentz i b) : + dot x y ∈ boostWeightSubmodule repLorentz i (a + b) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hc : (algebraMap ℝ ℂ) t ≠ 0 := by simpa using ht + rw [dot, map_add, h.repLorentz_mul, h.repLorentz_mul, + mem_boostWeightSubmodule.1 (hx 0) t ht, mem_boostWeightSubmodule.1 (hy 0) t ht, + mem_boostWeightSubmodule.1 (hx 1) t ht, mem_boostWeightSubmodule.1 (hy 1) t ht, + smul_mul_smul_comm, smul_mul_smul_comm, ← zpow_add₀ hc, ← smul_add] + + noncomputable def dotGaugeHiggs (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : B := h.higgs d1 0 * h.barHiggs d2 0 + h.higgs d1 1 * h.barHiggs d2 1 +lemma dotGaugeHiggs_eq_dot (d1 : Fin n1 → _) (d2 : Fin n2 → _) : + h.dotGaugeHiggs d1 d2 = dot (h.higgs d1) (h.barHiggs d2) := by rfl + lemma rep_dotGaugeHiggs (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : rep gaugeSU2Perm (h.dotGaugeHiggs d1 d2) = h.dotGaugeHiggs d1 d2 := by rw [dotGaugeHiggs] exact h.rep_gaugeSU2Perm_higgsBarHiggs_add d1 d2 -/-- **The inner product is gauge invariant.** `∇H†∇H` is fixed by every gauge - transformation: the hypercharge phases cancel between `H` and `H̄`, and the `SU(2)` - matrix cancels against its conjugate by unitarity. -/ + lemma rep_dotGaugeHiggs_invariant (g : GaugeGroupI) (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : rep g (h.dotGaugeHiggs d1 d2) = h.dotGaugeHiggs d1 d2 := by @@ -681,6 +707,555 @@ lemma rep_dotGaugeHiggs_invariant (g : GaugeGroupI) (d1 : Fin n1 → (Fin 1 ⊕ · linear_combination hM01' · linear_combination hM11 +/-! +### E + +An aside on derivatives and +boost weights (to be moved). + +-/ + +lemma succ_deriv_span {n : ℕ} (f : (Fin n.succ → (Fin 1 ⊕ Fin 3)) → B) : + ⨆ d, ℂ ∙ f d = ⨆ μ : Fin 1 ⊕ Fin 3, ⨆ d, ℂ ∙ f (Fin.cons μ d) := by + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun μ => iSup_le fun d => ?_) + · exact le_iSup_of_le (d 0) (le_iSup_of_le (Fin.tail d) (by rw [Fin.cons_self_tail])) + · exact le_iSup (fun d => ℂ ∙ f d) (Fin.cons μ d) + +lemma succ_dervi_span_eq_lightCone {n : ℕ} (f : (Fin n.succ → (Fin 1 ⊕ Fin 3)) → B) + (i : Fin 3) : + ⨆ d, ℂ ∙ f d = (⨆ d, ℂ ∙ (f (Fin.cons (Sum.inl 0) d) - f (Fin.cons (Sum.inr i) d))) ⊔ + (⨆ d, ℂ ∙ (f (Fin.cons (Sum.inl 0) d) + f (Fin.cons (Sum.inr i) d))) + ⊔ (⨆ d, ℂ ∙ f (Fin.cons (Sum.inr (i + 1)) d)) + ⊔ (⨆ d, ℂ ∙ f (Fin.cons (Sum.inr (i + 2)) d)) := by + have hcomb : ∀ (A C : B) (S : Submodule ℂ B), A - C ∈ S → A + C ∈ S → A ∈ S ∧ C ∈ S := by + refine fun A C S h1 h2 => ⟨?_, ?_⟩ + · rw [show A = (2⁻¹ : ℂ) • ((A - C) + (A + C)) from by module] + exact Submodule.smul_mem _ _ (add_mem h1 h2) + · rw [show C = (2⁻¹ : ℂ) • ((A + C) - (A - C)) from by module] + exact Submodule.smul_mem _ _ (sub_mem h2 h1) + have hax : ∀ a b : Fin 3, b = a ∨ b = a + 1 ∨ b = a + 2 := by decide + refine le_antisymm (le_trans (le_of_eq (succ_deriv_span f)) ?_) + (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) + · refine iSup_le fun μ => iSup_le fun d => ?_ + rcases μ with a | j + · rw [Subsingleton.elim a 0, Submodule.span_singleton_le_iff_mem] + refine (hcomb (f (Fin.cons (Sum.inl 0) d)) (f (Fin.cons (Sum.inr i) d)) _ ?_ ?_).1 + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + · rcases hax i j with hj | hj | hj <;> rw [hj, Submodule.span_singleton_le_iff_mem] + · refine (hcomb (f (Fin.cons (Sum.inl 0) d)) (f (Fin.cons (Sum.inr i) d)) _ ?_ ?_).2 + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _))) + · exact Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact sub_mem + (Submodule.mem_iSup_of_mem (Fin.cons (Sum.inl 0) d) (Submodule.mem_span_singleton_self _)) + (Submodule.mem_iSup_of_mem (Fin.cons (Sum.inr i) d) (Submodule.mem_span_singleton_self _)) + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact add_mem + (Submodule.mem_iSup_of_mem (Fin.cons (Sum.inl 0) d) (Submodule.mem_span_singleton_self _)) + (Submodule.mem_iSup_of_mem (Fin.cons (Sum.inr i) d) (Submodule.mem_span_singleton_self _)) + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact Submodule.mem_iSup_of_mem (Fin.cons (Sum.inr (i + 1)) d) + (Submodule.mem_span_singleton_self _) + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact Submodule.mem_iSup_of_mem (Fin.cons (Sum.inr (i + 2)) d) + (Submodule.mem_span_singleton_self _) + +structure IsDerivativeCollection {W} [AddCommGroup W] [Module ℂ W] + (repW : Representation ℂ SL(2,ℂ) W) (α : ℕ) + (f : (num : Fin α → ℕ) → (Fin (∑ i, num i) → (Fin 1 ⊕ Fin 3)) → W →ₗ[ℂ] B) where + /-- The symbol map intertwines the Lorentz action on `W` with the one on `B`, up to the + rotation of its derivative indices: each index is a Lorentz vector index. The partition + `num` of the indices among the `α` factors is a spectator — the rotation does not see + how the indices are grouped — so the law is one sum over one product. -/ + repLorentz_equiv : ∀ (g : SL(2,ℂ)) (num : Fin α → ℕ) + (d : Fin (∑ i, num i) → (Fin 1 ⊕ Fin 3)) (w : W), + repLorentz g (f num d w) = ∑ (a : Fin (∑ i, num i) → Fin 1 ⊕ Fin 3), + (∏ (j : Fin (∑ i, num i)), (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • + (f num a (repW g w)) + +namespace IsDerivativeCollection + +variable {W} [AddCommGroup W] [Module ℂ W] {repW : Representation ℂ SL(2,ℂ) W} + +/-- **One shape's worth of the rotation law**: every derivative index of `F` is a Lorentz + vector index. This is all the boost-weight development below uses, so it is taken as a + hypothesis; `IsDerivativeCollection.rotatesIndices` supplies it for each partition. -/ +abbrev RotatesIndices (repW : Representation ℂ SL(2,ℂ) W) + (repLorentz : Representation ℂ SL(2,ℂ) B) {n : ℕ} + (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) : Prop := + ∀ (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin 3) (w : W), + repLorentz g (F d w) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (j : Fin n), (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • F a (repW g w) + + +/-- The boost-weight decomposition of the symbols carrying no derivatives: with no Lorentz + index to rotate, the symbol map transports the decomposition of `W` unchanged. This is + the `n = 0` case of `boostDecomp`. -/ +noncomputable def boostDecompZero (F : (Fin 0 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (hF : RotatesIndices repW repLorentz F) (i : Fin 3) + (hw : WeightDecomposition (K := ℂ) repW i ⊤) : + WeightDecomposition repLorentz i (⨆ d : Fin 0 → Fin 1 ⊕ Fin 3, (F d).range) where + piece k := (hw.piece k).map (F ![]) + supp := hw.supp + piece_le k := by + have hf0 : ∀ a : Fin 0 → Fin 1 ⊕ Fin 3, F a = F ![] := fun a => by + rw [Subsingleton.elim a ![]] + rintro _ ⟨w, hwmem, rfl⟩ t ht + rw [hF] + simp only [Finset.univ_unique, Finset.sum_singleton, Finset.univ_eq_empty, + Finset.prod_empty, one_smul] + rw [hw.piece_le k hwmem t ht, map_smul, hf0] + piece_eq_bot k hk := by rw [hw.piece_eq_bot k hk, Submodule.map_bot] + iSup_piece := by + rw [← Submodule.map_iSup, hw.iSup_piece, Submodule.map_top] + exact le_antisymm (le_iSup (fun d => (F d).range) ![]) + (iSup_le fun d => le_of_eq (by rw [Subsingleton.elim d ![]])) + +/-- The four light-cone directions along the `i`-th axis, written as coefficient vectors on + the coordinate directions: `D₀ - Dᵢ`, `D₀ + Dᵢ`, and the two transverse directions. -/ +def lightConeCoeff (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℂ := + if κ = 0 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then -1 else 0) + else if κ = 1 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then 1 else 0) + else if κ = 2 then (if μ = Sum.inr (i + 1) then 1 else 0) + else (if μ = Sum.inr (i + 2) then 1 else 0) + +/-- The boost weight carried by each light-cone direction: `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, and `0` for the two transverse directions. -/ +def lightConeWeight (κ : Fin 4) : ℤ := if κ = 0 then 2 else if κ = 1 then -2 else 0 + +/-- **The light-cone directions are eigenvectors of the boost.** Along the `i`-th axis + `D₀ - Dᵢ` is scaled by `t²`, `D₀ + Dᵢ` by `t⁻²`, and the two transverse directions are + fixed. -/ +lemma sum_boostAxis_lightConeCoeff (i : Fin 3) (κ : Fin 4) (ν : Fin 1 ⊕ Fin 3) + {t : ℝ} (ht : t ≠ 0) : + ∑ μ : Fin 1 ⊕ Fin 3, + (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 ν μ : ℝ) : ℂ) * lightConeCoeff i κ μ + = ((t : ℝ) : ℂ) ^ (lightConeWeight κ) * lightConeCoeff i κ ν := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [show SL2C.toLorentzGroup (SL2C.boostAxis i t ht) = LorentzGroup.boostAxis i t ht from rfl] + rcases ν with a | j + · rw [Subsingleton.elim a 0] + fin_cases i <;> fin_cases κ + all_goals + simp [lightConeCoeff, lightConeWeight, Fintype.sum_sum_type, + LorentzGroup.boostAxis_apply] + all_goals try field_simp + all_goals try ring + · fin_cases i <;> fin_cases j <;> fin_cases κ + all_goals + simp [lightConeCoeff, lightConeWeight, Fintype.sum_sum_type, + LorentzGroup.boostAxis_apply] + all_goals try field_simp + all_goals try ring + +/-- The coordinate directions written back in the light-cone basis: `D₀` and `Dᵢ` are the + half-sum and half-difference of `D₀ ∓ Dᵢ`, and the transverse directions are themselves. -/ +noncomputable def lightConeCoeffInv (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℂ := + if μ = Sum.inl 0 then (if κ = 0 then 2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr i then (if κ = 0 then -2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr (i + 1) then (if κ = 2 then 1 else 0) + else (if κ = 3 then 1 else 0) + +/-- The light-cone basis is a basis: the two coefficient matrices are inverse. -/ +lemma sum_lightConeCoeffInv_mul (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + ∑ κ : Fin 4, lightConeCoeffInv i μ κ * lightConeCoeff i κ ν = if μ = ν then 1 else 0 := by + rcases μ with a | j + · rw [Subsingleton.elim a 0] + rcases ν with a' | j' + · rw [Subsingleton.elim a' 0] + fin_cases i <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] <;> norm_num + · fin_cases i <;> fin_cases j' <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] + · rcases ν with a' | j' + · rw [Subsingleton.elim a' 0] + fin_cases i <;> fin_cases j <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] + · fin_cases i <;> fin_cases j <;> fin_cases j' <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] <;> norm_num + +/-- The scalar behind `lightConeDeriv_mem`: the boost acts on a light-cone multi-index + slot by slot, so the product of the per-slot eigenvalues factors out. -/ +lemma sum_prod_lightConeCoeff (i : Fin 3) {n : ℕ} (c : Fin n → Fin 4) + (a : Fin n → Fin 1 ⊕ Fin 3) {t : ℝ} (ht : t ≠ 0) : + ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) + = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * ∏ j, lightConeCoeff i (c j) (a j) := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have hzpow : ∀ (s : Finset (Fin n)) (g : Fin n → ℤ), + ∏ j ∈ s, ((t : ℝ) : ℂ) ^ (g j) = ((t : ℝ) : ℂ) ^ (∑ j ∈ s, g j) := by + intro s g + induction s using Finset.induction with + | empty => simp + | insert a s ha ih => rw [Finset.prod_insert ha, Finset.sum_insert ha, ih, zpow_add₀ htc] + calc ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) + = ∑ d : Fin n → Fin 1 ⊕ Fin 3, ∏ j, (lightConeCoeff i (c j) (d j) * + (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) := + Finset.sum_congr rfl fun d _ => (Finset.prod_mul_distrib).symm + _ = ∏ j, ∑ μ : Fin 1 ⊕ Fin 3, (lightConeCoeff i (c j) μ * + (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) μ : ℝ) : ℂ)) := by + rw [Finset.prod_univ_sum, Fintype.piFinset_univ] + _ = ∏ j, (((t : ℝ) : ℂ) ^ (lightConeWeight (c j)) * lightConeCoeff i (c j) (a j)) := by + refine Finset.prod_congr rfl fun j _ => ?_ + simp_rw [mul_comm (lightConeCoeff i (c j) _)] + exact sum_boostAxis_lightConeCoeff i (c j) (a j) ht + _ = (∏ j, ((t : ℝ) : ℂ) ^ (lightConeWeight (c j))) * ∏ j, lightConeCoeff i (c j) (a j) := + Finset.prod_mul_distrib + _ = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * ∏ j, lightConeCoeff i (c j) (a j) := by + rw [hzpow] + +/-- **The symbol with its derivative indices in the light-cone basis.** Each slot `j` of the + multi-index carries a light-cone direction `c j` instead of a coordinate direction, so the + symbol is an eigenvector of the boost along the `i`-th axis, of weight + `∑ j, lightConeWeight (c j)`. -/ +noncomputable def lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (i : Fin 3) (c : Fin n → Fin 4) : W →ₗ[ℂ] B := + ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • F d + +/-- **A one-slot light-cone symbol**, written out as a combination of coordinate symbols. -/ +lemma lightConeDeriv_single (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) (κ : Fin 4) : + lightConeDeriv F i ![κ] = ∑ μ : Fin 1 ⊕ Fin 3, lightConeCoeff i κ μ • F ![μ] := by + rw [lightConeDeriv] + refine Fintype.sum_equiv (Equiv.funUnique (Fin 1) (Fin 1 ⊕ Fin 3)) _ _ fun d => ?_ + have hd : d = ![d 0] := by + funext j + fin_cases j + rfl + simp only [Fin.prod_univ_one, Matrix.cons_val_zero, Equiv.funUnique_apply, + Fin.default_eq_zero] + rw [← hd] + +/-- The light-cone combination `D₀ - Dᵢ` on one slot. -/ +lemma lightConeDeriv_zero (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0] = F ![Sum.inl 0] - F ![Sum.inr i] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff, Fintype.sum_sum_type] <;> module + +/-- The light-cone combination `D₀ + Dᵢ` on one slot. -/ +lemma lightConeDeriv_one (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1] = F ![Sum.inl 0] + F ![Sum.inr i] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff, Fintype.sum_sum_type] + +/-- The first transverse direction on one slot. -/ +lemma lightConeDeriv_two (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![2] = F ![Sum.inr (i + 1)] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff] + +/-- The second transverse direction on one slot. -/ +lemma lightConeDeriv_three (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3] = F ![Sum.inr (i + 2)] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff] + +/-- **The one-slot light-cone symbols of weight zero** are the two transverse directions: + the join of the weight-zero ranges on a single slot is the join of the ranges of the two + transverse symbols. -/ +lemma iSup_range_lightConeDeriv_single_weight_zero + (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 1 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ)), + LinearMap.range (lightConeDeriv F i c)) + = LinearMap.range (F ![Sum.inr (i + 1)]) ⊔ LinearMap.range (F ![Sum.inr (i + 2)]) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) (sup_le ?_ ?_) + · obtain ⟨κ, rfl⟩ : ∃ κ, c = ![κ] := ⟨c 0, funext fun j => by fin_cases j; rfl⟩ + rw [Fin.sum_univ_one] at hc + fin_cases κ + · simp [lightConeWeight] at hc + · simp [lightConeWeight] at hc + · exact le_sup_of_le_left (le_of_eq (congrArg LinearMap.range (lightConeDeriv_two F i))) + · exact le_sup_of_le_right (le_of_eq (congrArg LinearMap.range (lightConeDeriv_three F i))) + · exact le_iSup₂_of_le ![2] (by simp [lightConeWeight]) + (le_of_eq (by rw [lightConeDeriv_two])) + · exact le_iSup₂_of_le ![3] (by simp [lightConeWeight]) + (le_of_eq (by rw [lightConeDeriv_three])) + +/-- The scalar behind `f_eq_sum_lightConeDeriv`: the two coefficient matrices are inverse + slot by slot, hence inverse on multi-indices. -/ +lemma sum_prod_lightConeCoeffInv (i : Fin 3) {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) : + ∑ c : Fin n → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j)) = if d = e then 1 else 0 := by + calc ∑ c : Fin n → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j)) + = ∑ c : Fin n → Fin 4, + ∏ j, (lightConeCoeffInv i (d j) (c j) * lightConeCoeff i (c j) (e j)) := + Finset.sum_congr rfl fun c _ => (Finset.prod_mul_distrib).symm + _ = ∏ j, ∑ κ : Fin 4, (lightConeCoeffInv i (d j) κ * lightConeCoeff i κ (e j)) := by + rw [Finset.prod_univ_sum, Fintype.piFinset_univ] + _ = ∏ j, (if d j = e j then (1 : ℂ) else 0) := + Finset.prod_congr rfl fun j _ => sum_lightConeCoeffInv_mul i (d j) (e j) + _ = if d = e then 1 else 0 := by + by_cases hde : d = e + · subst hde + simp + · rw [if_neg hde] + obtain ⟨j, hj⟩ := Function.ne_iff.1 hde + exact Finset.prod_eq_zero (Finset.mem_univ j) (if_neg hj) + +/-- **The coordinate symbols in the light-cone basis.** The change of basis is invertible, + so the two families span the same submodule. -/ +lemma eq_sum_lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) + (d : Fin n → Fin 1 ⊕ Fin 3) : + F d = ∑ c : Fin n → Fin 4, + (∏ j, lightConeCoeffInv i (d j) (c j)) • lightConeDeriv F i c := by + simp only [lightConeDeriv, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + simp only [← Finset.sum_smul, sum_prod_lightConeCoeffInv i d, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + +/-- **The light-cone symbols have definite boost weight.** Each derivative slot contributes + the weight of its light-cone direction, on top of the weight the argument carries in + `W`. -/ +lemma lightConeDeriv_mem {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (hF : RotatesIndices repW repLorentz F) + (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} {w : W} + (hwm : w ∈ boostWeightSubmodule repW i b) : + lightConeDeriv F i c w ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := by + intro t ht + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have key : repLorentz (SL2C.boostAxis i t ht) (lightConeDeriv F i c w) + = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) • + lightConeDeriv F i c (repW (SL2C.boostAxis i t ht) w) := by + have hstep : ∀ x : Fin n → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • repLorentz (SL2C.boostAxis i t ht) (F x w) + = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (x j) : ℝ) : ℂ))) • + F a (repW (SL2C.boostAxis i t ht) w) := by + intro x + rw [hF, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + simp only [lightConeDeriv, LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply, + map_sum, map_smul] + rw [Finset.smul_sum] + simp only [hstep] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul, smul_smul] + congr 1 + exact sum_prod_lightConeCoeff i c a ht + rw [key, hwm t ht, map_smul, smul_smul, + show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, ← zpow_add₀ htc] + +/-- **The boost-weight decomposition of the symbols carrying `n` derivatives.** The + multi-index is read in the light-cone basis: a slot of type `c j` contributes + `lightConeWeight (c j)` — `+2` for `D₀ - Dᵢ`, `-2` for `D₀ + Dᵢ`, `0` for the two + transverse directions — on top of the weight the argument already carries in `W`. -/ +noncomputable def boostDecomp {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (hF : RotatesIndices repW repLorentz F) + (i : Fin 3) (hw : WeightDecomposition (K := ℂ) repW i ⊤) : + WeightDecomposition repLorentz i (⨆ d : Fin n → Fin 1 ⊕ Fin 3, (F d).range) where + piece k := ⨆ c : Fin n → Fin 4, + (hw.piece (k - ∑ j, lightConeWeight (c j))).map (lightConeDeriv F i c) + supp := (Finset.univ ×ˢ hw.supp).image + fun p : (Fin n → Fin 4) × ℤ => (∑ j, lightConeWeight (p.1 j)) + p.2 + piece_le k := by + refine iSup_le fun c => ?_ + rintro _ ⟨w, hwmem, rfl⟩ + have hmem := lightConeDeriv_mem F hF i c (hw.piece_le _ hwmem) + rwa [show (∑ j, lightConeWeight (c j)) + (k - ∑ j, lightConeWeight (c j)) = k from by ring] + at hmem + piece_eq_bot k hk := by + refine le_antisymm (iSup_le fun c => ?_) bot_le + have hb : k - (∑ j, lightConeWeight (c j)) ∉ hw.supp := fun hb => + hk (Finset.mem_image.2 ⟨(c, k - ∑ j, lightConeWeight (c j)), + Finset.mem_product.2 ⟨Finset.mem_univ c, hb⟩, by dsimp only; ring⟩) + rw [hw.piece_eq_bot _ hb, Submodule.map_bot] + iSup_piece := by + have hc : ∀ c : Fin n → Fin 4, + (⨆ k : ℤ, hw.piece (k - ∑ j, lightConeWeight (c j))) = ⊤ := by + intro c + refine le_antisymm le_top ?_ + calc (⊤ : Submodule ℂ W) = ⨆ b, hw.piece b := hw.iSup_piece.symm + _ ≤ ⨆ k : ℤ, hw.piece (k - ∑ j, lightConeWeight (c j)) := + iSup_le fun b => le_iSup_of_le (b + ∑ j, lightConeWeight (c j)) + (by rw [add_sub_cancel_right]) + rw [iSup_comm] + calc (⨆ c : Fin n → Fin 4, ⨆ k : ℤ, + (hw.piece (k - ∑ j, lightConeWeight (c j))).map (lightConeDeriv F i c)) + = ⨆ c : Fin n → Fin 4, LinearMap.range (lightConeDeriv F i c) := by + refine iSup_congr fun c => ?_ + rw [← Submodule.map_iSup, hc c, Submodule.map_top] + _ = ⨆ d : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (F d) := by + refine le_antisymm (iSup_le fun c => ?_) (iSup_le fun d => ?_) + · rintro _ ⟨w, rfl⟩ + rw [lightConeDeriv, LinearMap.sum_apply] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [LinearMap.smul_apply] + exact Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem d ⟨w, rfl⟩) + · rintro _ ⟨w, rfl⟩ + rw [eq_sum_lightConeDeriv F i d, LinearMap.sum_apply] + refine Submodule.sum_mem _ fun c _ => ?_ + rw [LinearMap.smul_apply] + exact Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem c ⟨w, rfl⟩) + +/-- Each shape of a derivative collection rotates its indices. -/ +lemma rotatesIndices {α : ℕ} + {f : (num : Fin α → ℕ) → (Fin (∑ i, num i) → (Fin 1 ⊕ Fin 3)) → W →ₗ[ℂ] B} + (hD : IsDerivativeCollection (repLorentz := repLorentz) repW α f) (num : Fin α → ℕ) : + RotatesIndices repW repLorentz (f num) := + fun g d w => hD.repLorentz_equiv g num d w + +/-- **The boost-weight decomposition of the symbols of one shape.** For a term built from + `α` factors carrying `num i` derivatives each, the span of the symbols decomposes into + boost weights along any axis. -/ +noncomputable def boostDecompOfNum {α : ℕ} + {f : (num : Fin α → ℕ) → (Fin (∑ i, num i) → (Fin 1 ⊕ Fin 3)) → W →ₗ[ℂ] B} + (hD : IsDerivativeCollection (repLorentz := repLorentz) repW α f) (num : Fin α → ℕ) + (i : Fin 3) (hw : WeightDecomposition (K := ℂ) repW i ⊤) : + WeightDecomposition repLorentz i (⨆ d, (f num d).range) := + boostDecomp (f num) (hD.rotatesIndices num) i hw + +/-- **The pieces of `boostDecompOfNum`.** The weight-`k` part is the join, over the + light-cone multi-indices `c`, of the images of the weight-`(k - ∑ lightConeWeight (c j))` + part of `W`: the derivative slots and the argument split the weight between them. -/ +lemma boostDecompOfNum_piece {α : ℕ} + {f : (num : Fin α → ℕ) → (Fin (∑ i, num i) → (Fin 1 ⊕ Fin 3)) → W →ₗ[ℂ] B} + (hD : IsDerivativeCollection (repLorentz := repLorentz) repW α f) (num : Fin α → ℕ) + (i : Fin 3) (hw : WeightDecomposition (K := ℂ) repW i ⊤) (k : ℤ) : + (hD.boostDecompOfNum num i hw).piece k + = ⨆ c : Fin (∑ i, num i) → Fin 4, + (hw.piece (k - ∑ j, lightConeWeight (c j))).map (lightConeDeriv (f num) i c) := + rfl + +/-- **The pieces when the argument is a Lorentz scalar.** If `W` sits entirely in weight + zero then the weight is carried by the derivative slots alone, and the weight-`k` piece is + spanned by the light-cone symbols whose slots have total weight `k`. -/ +lemma boostDecompOfNum_piece_of_weight_zero {α : ℕ} + {f : (num : Fin α → ℕ) → (Fin (∑ i, num i) → (Fin 1 ⊕ Fin 3)) → W →ₗ[ℂ] B} + (hD : IsDerivativeCollection (repLorentz := repLorentz) repW α f) (num : Fin α → ℕ) + (i : Fin 3) (hw : WeightDecomposition (K := ℂ) repW i ⊤) (hw0 : hw.piece 0 = ⊤) + (hwb : ∀ b : ℤ, b ≠ 0 → hw.piece b = ⊥) (k : ℤ) : + (hD.boostDecompOfNum num i hw).piece k + = ⨆ (c : Fin (∑ i, num i) → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), + LinearMap.range (lightConeDeriv (f num) i c) := by + rw [boostDecompOfNum_piece] + refine iSup_congr fun c => ?_ + by_cases hc : (∑ j, lightConeWeight (c j)) = k + · rw [show k - (∑ j, lightConeWeight (c j)) = 0 from by omega, hw0, Submodule.map_top, + iSup_pos hc] + · rw [hwb _ (by omega), Submodule.map_bot, iSup_neg hc] + +end IsDerivativeCollection + +/-! + +### E.1. The two-factor collection from the Higgs inner product + +The gauge-invariant inner product `dotGaugeHiggs` of a Higgs and a conjugate Higgs, each +carrying its own derivatives, is a two-factor derivative collection over `W = ℂ`: the +Lorentz group rotates the derivative indices of the two factors independently, and the +trivial action on `ℂ` records that the inner product itself is a Lorentz scalar. + +-/ + +/-- The Lorentz action rotates the derivative indices of a Higgs symbol. -/ +lemma repLorentz_higgs {n : ℕ} (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin 3) (k : Fin 2) : + repLorentz g (h.higgs d k) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + (∏ j, (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • h.higgs a k := by + simp only [higgs] + rw [h.repLorentz_H] + +/-- The Lorentz action rotates the derivative indices of a conjugate Higgs symbol. -/ +lemma repLorentz_barHiggs {n : ℕ} (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin 3) (k : Fin 2) : + repLorentz g (h.barHiggs d k) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + (∏ j, (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • h.barHiggs a k := by + simp only [barHiggs] + rw [h.repLorentz_barH] + +/-- **The Higgs inner product as a two-factor symbol map.** The first `num 0` derivative + indices go on the Higgs, the last `num 1` on its conjugate, and the scalar `w : ℂ` scales + the result — the inner product carries no Lorentz index of its own. -/ +noncomputable def dotSymbol (num : Fin 2 → ℕ) + (d : Fin (∑ i, num i) → (Fin 1 ⊕ Fin 3)) : ℂ →ₗ[ℂ] B := + LinearMap.toSpanSingleton ℂ B + (h.dotGaugeHiggs (fun j : Fin (num 0) => d (Fin.castAdd (num 1) j)) + (fun j : Fin (num 1) => d (Fin.natAdd (num 0) j))) + +/-- **The Lorentz action on the Higgs inner product.** The two factors' derivative indices + rotate independently; the inner product itself is a Lorentz scalar. -/ +lemma repLorentz_dotGaugeHiggs {m n : ℕ} (g : SL(2,ℂ)) + (d₁ : Fin m → Fin 1 ⊕ Fin 3) (d₂ : Fin n → Fin 1 ⊕ Fin 3) : + repLorentz g (h.dotGaugeHiggs d₁ d₂) = + ∑ a₁ : Fin m → Fin 1 ⊕ Fin 3, ∑ a₂ : Fin n → Fin 1 ⊕ Fin 3, + ((∏ j, (((SL2C.toLorentzGroup g).1 (a₁ j) (d₁ j) : ℝ) : ℂ)) * + (∏ j, (((SL2C.toLorentzGroup g).1 (a₂ j) (d₂ j) : ℝ) : ℂ))) • + h.dotGaugeHiggs a₁ a₂ := by + simp only [dotGaugeHiggs, map_add, h.repLorentz_mul, repLorentz_higgs, repLorentz_barHiggs, + Finset.sum_mul_sum, smul_mul_smul_comm, smul_add, Finset.sum_add_distrib] + +/-- The weight decomposition of `ℂ` under the trivial Lorentz action: every scalar has + boost weight zero. -/ +noncomputable def trivialWeightDecomposition (i : Fin 3) : + WeightDecomposition (1 : Representation ℂ SL(2,ℂ) ℂ) i ⊤ where + piece k := if k = 0 then ⊤ else ⊥ + supp := {0} + piece_le k := by + by_cases hk : k = 0 + · subst hk + rw [if_pos rfl] + intro x _ t ht + simp + · rw [if_neg hk] + exact bot_le + piece_eq_bot k hk := if_neg (by simpa using hk) + iSup_piece := le_antisymm le_top (le_iSup_of_le 0 (by rw [if_pos rfl])) + +@[simp] +lemma trivialWeightDecomposition_piece (i : Fin 3) (k : ℤ) : + (trivialWeightDecomposition i).piece k = if k = 0 then ⊤ else ⊥ := rfl + +/-- **The Higgs inner product is a two-factor derivative collection.** The Lorentz group + rotates the derivative indices of the two factors independently; the trivial action on + `ℂ` records that the inner product carries no Lorentz index of its own. -/ +lemma isDerivativeCollection_dotSymbol : + IsDerivativeCollection (repLorentz := repLorentz) (1 : Representation ℂ SL(2,ℂ) ℂ) 2 + h.dotSymbol where + repLorentz_equiv g num d w := by + calc repLorentz g (h.dotSymbol num d w) + = ∑ q : (Fin (num 0) → Fin 1 ⊕ Fin 3) × (Fin (num 1) → Fin 1 ⊕ Fin 3), + (w * ((∏ j, (((SL2C.toLorentzGroup g).1 (q.1 j) + (d (Fin.castAdd (num 1) j)) : ℝ) : ℂ)) * + (∏ j, (((SL2C.toLorentzGroup g).1 (q.2 j) + (d (Fin.natAdd (num 0) j)) : ℝ) : ℂ)))) • h.dotGaugeHiggs q.1 q.2 := by + rw [Fintype.sum_prod_type] + simp only [dotSymbol, LinearMap.toSpanSingleton_apply, map_smul, + repLorentz_dotGaugeHiggs, Finset.smul_sum, smul_smul] + _ = ∑ a : Fin (∑ i, num i) → Fin 1 ⊕ Fin 3, + (∏ j, (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • + h.dotSymbol num a ((1 : Representation ℂ SL(2,ℂ) ℂ) g w) := by + refine (Fintype.sum_equiv (Fin.appendEquiv (num 0) (num 1)).symm _ _ fun a => ?_).symm + have hprod : ∀ u : Fin (∑ i, num i) → Fin 1 ⊕ Fin 3, + (∏ x, (((SL2C.toLorentzGroup g).1 (u x) (d x) : ℝ) : ℂ)) + = (∏ j : Fin (num 0), (((SL2C.toLorentzGroup g).1 + (u (Fin.castAdd (num 1) j)) (d (Fin.castAdd (num 1) j)) : ℝ) : ℂ)) * + (∏ j : Fin (num 1), (((SL2C.toLorentzGroup g).1 + (u (Fin.natAdd (num 0) j)) (d (Fin.natAdd (num 0) j)) : ℝ) : ℂ)) := + fun u => Fin.prod_univ_add _ + simp only [dotSymbol, LinearMap.toSpanSingleton_apply, MonoidHom.one_apply, + Module.End.one_apply, hprod, Fin.appendEquiv_symm_apply, smul_smul, + mul_comm w, mul_assoc] + rfl + /-! ## B. The higgs algebra @@ -1999,6 +2574,86 @@ lemma mem_of_mem_massWeightSubmodule_eight_of_invariant {w : ℕ} {x : B} -/ +noncomputable def gaugeInvariantOfMassDim (M : ℕ) : Submodule ℂ B := + h.massWeightSubmodule M ⊓ Representation.invariants rep + +lemma gaugeInvariantOfMassDim_four_eq : + h.gaugeInvariantOfMassDim 4 = ℂ ∙ h.dotGaugeHiggs ![] ![] := by + refine le_antisymm (fun x hx => + h.mem_of_mem_massWeightSubmodule_four_of_invariant (w := 0) hx.1 hx.2) ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine ⟨?_, fun g => h.rep_dotGaugeHiggs_invariant g ![] ![]⟩ + have hH : ∀ i, h.higgs ![] i ∈ h.massWeightSubmodule 2 := fun i => + h.massWeightSubmodule_higgsSubmodule_le 0 + (Submodule.mem_iSup_of_mem ![] (LinearMap.mem_range_self _ _)) + have hbH : ∀ i, h.barHiggs ![] i ∈ h.massWeightSubmodule 2 := fun i => + h.massWeightSubmodule_barHiggsSubmodule_le 0 + (Submodule.mem_iSup_of_mem ![] (LinearMap.mem_range_self _ _)) + rw [dotGaugeHiggs] + exact add_mem (h.massWeightSubmodule_mul_le 2 2 (Submodule.mul_mem_mul (hH 0) (hbH 0))) + (h.massWeightSubmodule_mul_le 2 2 (Submodule.mul_mem_mul (hH 1) (hbH 1))) + +lemma gaugeInvariantOfMassDim_six_eq : + h.gaugeInvariantOfMassDim 6 = (⨆ (d : Fin 1 → _), ℂ ∙ h.dotGaugeHiggs d ![]) ⊔ + (⨆ (d : Fin 1 → _), ℂ ∙ h.dotGaugeHiggs ![] d) := by + have hH : ∀ (n : ℕ) (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2), + h.higgs d i ∈ h.massWeightSubmodule (2 * (1 + n)) := fun n d i => + h.massWeightSubmodule_higgsSubmodule_le n + (Submodule.mem_iSup_of_mem d (LinearMap.mem_range_self _ _)) + have hbH : ∀ (n : ℕ) (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2), + h.barHiggs d i ∈ h.massWeightSubmodule (2 * (1 + n)) := fun n d i => + h.massWeightSubmodule_barHiggsSubmodule_le n + (Submodule.mem_iSup_of_mem d (LinearMap.mem_range_self _ _)) + refine le_antisymm (fun x hx => + h.mem_of_mem_massWeightSubmodule_six_of_invariant (w := 0) hx.1 hx.2) (sup_le ?_ ?_) + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine ⟨?_, fun g => h.rep_dotGaugeHiggs_invariant g d ![]⟩ + rw [dotGaugeHiggs] + exact add_mem + (h.massWeightSubmodule_mul_le 4 2 (Submodule.mul_mem_mul (hH 1 d 0) (hbH 0 ![] 0))) + (h.massWeightSubmodule_mul_le 4 2 (Submodule.mul_mem_mul (hH 1 d 1) (hbH 0 ![] 1))) + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine ⟨?_, fun g => h.rep_dotGaugeHiggs_invariant g ![] d⟩ + rw [dotGaugeHiggs] + exact add_mem + (h.massWeightSubmodule_mul_le 2 4 (Submodule.mul_mem_mul (hH 0 ![] 0) (hbH 1 d 0))) + (h.massWeightSubmodule_mul_le 2 4 (Submodule.mul_mem_mul (hH 0 ![] 1) (hbH 1 d 1))) + +lemma gaugeInvariantOfMassDim_eight_eq : + h.gaugeInvariantOfMassDim 8 = (⨆ (d : Fin 2 → _), ℂ ∙ h.dotGaugeHiggs d ![]) ⊔ + (⨆ (d : Fin 2 → _), ℂ ∙ h.dotGaugeHiggs ![] d) ⊔ + (⨆ (d : Fin 1 → _), ⨆ (d2 : Fin 1 → _), ℂ ∙ h.dotGaugeHiggs d d2) ⊔ + ℂ ∙ h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := by + have hdot : ∀ {n1 n2 : ℕ} (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)), + h.dotGaugeHiggs d1 d2 ∈ h.massWeightSubmodule (2 * (1 + n1) + 2 * (1 + n2)) := by + intro n1 n2 d1 d2 + have hH : ∀ i, h.higgs d1 i ∈ h.massWeightSubmodule (2 * (1 + n1)) := fun i => + h.massWeightSubmodule_higgsSubmodule_le n1 + (Submodule.mem_iSup_of_mem d1 (LinearMap.mem_range_self _ _)) + have hbH : ∀ i, h.barHiggs d2 i ∈ h.massWeightSubmodule (2 * (1 + n2)) := fun i => + h.massWeightSubmodule_barHiggsSubmodule_le n2 + (Submodule.mem_iSup_of_mem d2 (LinearMap.mem_range_self _ _)) + rw [dotGaugeHiggs] + exact add_mem (h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (hH 0) (hbH 0))) + (h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (hH 1) (hbH 1))) + refine le_antisymm (fun x hx => + h.mem_of_mem_massWeightSubmodule_eight_of_invariant (w := 0) hx.1 hx.2) + (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact ⟨hdot d ![], fun g => h.rep_dotGaugeHiggs_invariant g d ![]⟩ + · refine iSup_le fun d => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact ⟨hdot ![] d, fun g => h.rep_dotGaugeHiggs_invariant g ![] d⟩ + · refine iSup_le fun d => iSup_le fun d2 => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact ⟨hdot d d2, fun g => h.rep_dotGaugeHiggs_invariant g d d2⟩ + · rw [Submodule.span_singleton_le_iff_mem] + exact ⟨h.massWeightSubmodule_mul_le 4 4 (Submodule.mul_mem_mul (hdot ![] ![]) (hdot ![] ![])), + fun g => by rw [h.rep_mul, h.rep_dotGaugeHiggs_invariant]⟩ + /-! ## D. Invariance under the Lorentz group @@ -2013,912 +2668,359 @@ we now give the invariance under the Lorentz group. ### D.1. The decomposition under boost weights in the x-direction -/ +open Lorentz.BoostWeight + +/-- With all derivatives on the Higgs, the two-factor symbol is scaling by + `dotGaugeHiggs d ![]`. -/ +lemma dotSymbol_left (d : Fin 1 → Fin 1 ⊕ Fin 3) : + h.dotSymbol ![1, 0] d = LinearMap.toSpanSingleton ℂ B (h.dotGaugeHiggs d ![]) := by + rw [dotSymbol] + congr 1 + congr 1 + exact funext fun j => j.elim0 + +/-- With all derivatives on the conjugate Higgs. -/ +lemma dotSymbol_right (d : Fin 1 → Fin 1 ⊕ Fin 3) : + h.dotSymbol ![0, 1] d = LinearMap.toSpanSingleton ℂ B (h.dotGaugeHiggs ![] d) := by + rw [dotSymbol] + congr 1 + congr 1 + all_goals first + | exact funext fun j => j.elim0 + | (funext j; congr 1; exact Fin.ext (by simp)) -/-! - -### D.2. The decomposition under boost weights in the y-direction - --/ - -/-! - -### D.3. The decomposition under boost weights in the z-direction - --/ - -/-! - -########################################### -# Below here is old. -########################################### - -/-! - -## The generators - -Written in coordinates, a Lagrangian is a polynomial in the component symbols `H^α` and -`H̄^α`. These are the values of `H` and `barH` on the dual of the standard orthonormal basis -of `HiggsVec` — and, for the conjugate, on the dual of its conjugated basis -`Module.Basis.conj`. - --/ - -set_option linter.unusedVariables false in -/-- The component symbol `H^i` of the Higgs: the value of the symbol map on the `i`-th - covector of the standard basis of `HiggsVec`. -/ -noncomputable def higgsComponent (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (i : Fin 2) : B := - H (HiggsVec.orthonormBasis.toBasis.dualBasis i) - -set_option linter.unusedVariables false in -/-- The component symbol `H̄^i` of the conjugate Higgs. -/ -noncomputable def barHiggsComponent (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (i : Fin 2) : B := - barH (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) - -/-! - -## The submodules - -Everything below is stated relative to a fixed `h : IsHiggsAlgebraValued B rep H barH`, and -takes it as its first explicit argument, so that the submodules and terms are reached by dot -notation — `h.higgsSubmodule`, `h.massTerm` — and the data `B`, `rep`, `H` and `barH` are -recovered from `h` rather than passed by hand. - --/ - -set_option linter.unusedVariables false in -/-- The submodule of `B` spanned by the Higgs symbols `H_φ`: the terms of mass dimension one - and hypercharge `+3`. -/ -def higgsSubmodule (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : Submodule ℂ B := - LinearMap.range H - -lemma higgsSubmodule_eq_span_higgsComponents : - h.higgsSubmodule = Submodule.span ℂ (Set.range h.higgsComponent) := by - rw [higgsSubmodule, LinearMap.range_eq_map, - ← (HiggsVec.orthonormBasis.toBasis.dualBasis).span_eq, Submodule.map_span, - ← Set.range_comp] - rfl - -lemma higgsComponent_mem_higgsSubmodule (i : Fin 2) : - h.higgsComponent i ∈ h.higgsSubmodule := - LinearMap.mem_range_self _ _ - -set_option linter.unusedVariables false in -/-- The submodule of `B` spanned by the conjugate Higgs symbols `H̄_φ`: the terms of mass - dimension one and hypercharge `-3`. -/ -def barHiggsSubmodule (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : Submodule ℂ B := - LinearMap.range barH - -lemma barHiggsSubmodule_eq_span_barHiggsComponents : - h.barHiggsSubmodule = Submodule.span ℂ (Set.range h.barHiggsComponent) := by - rw [barHiggsSubmodule, LinearMap.range_eq_map, - ← (HiggsVec.orthonormBasis.toBasis.conj.dualBasis).span_eq, Submodule.map_span, - ← Set.range_comp] - rfl - -lemma barHiggsComponent_mem_barHiggsSubmodule (i : Fin 2) : - h.barHiggsComponent i ∈ h.barHiggsSubmodule := - LinearMap.mem_range_self _ _ - -/-- The terms of mass dimension exactly one: a Higgs symbol or a conjugate Higgs symbol. -/ -def scalarSubmoduleOne : Submodule ℂ B := h.higgsSubmodule ⊔ h.barHiggsSubmodule - -/-! - -## The mass weight submodules - -A Lagrangian term is constrained by its mass dimension, and the mass-weight scaling records -that counting intrinsically: `massWeightPoly` places the part of a term of mass weight `w` -in degree `w`, so a term has mass weight at most `n` exactly when its mass-weight polynomial -is its own truncation at degree `n`. A Higgs symbol carries mass weight two, so a term of -mass dimension `d` is one of mass weight `2 * d`, and the scalar potential — the terms of -mass dimension at most four — is `higgsMassWeightSubmodule 8`. - --/ - - -/-- Membership in `higgsMassWeightSubmodule`, unfolded: a term of the subalgebra generated - by the symbols whose mass-weight polynomial has degree at most `n`. -/ -lemma mem_higgsMassWeightSubmodule {n : ℕ} {x : B} : - x ∈ h.higgsMassWeightSubmodule n ↔ - x ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ))) ∧ - (massWeightPoly x).degree ≤ (n : WithBot ℕ) := - Submodule.mem_inf.trans (and_congr_right fun _ => Polynomial.mem_degreeLE) - -/-- A term of mass dimension one has mass weight two: its mass-weight polynomial is a - monomial of degree two. -/ -lemma massWeightPoly_of_mem_scalarSubmoduleOne {y : B} (hy : y ∈ h.scalarSubmoduleOne) : - massWeightPoly y = Polynomial.monomial 2 y := by - obtain ⟨_, ⟨φ, rfl⟩, _, ⟨ψ, rfl⟩, rfl⟩ := Submodule.mem_sup.1 hy - simp [map_add, h.H_massWeight, h.barH_massWeight] - -/-- A product of `k` symbols has mass weight `2 * k`. -/ -lemma massWeightPoly_of_mem_pow (k : ℕ) {y : B} (hy : y ∈ h.scalarSubmoduleOne ^ k) : - massWeightPoly y = Polynomial.monomial (2 * k) y := by - induction k generalizing y with - | zero => - rw [pow_zero] at hy - obtain ⟨c, rfl⟩ := Submodule.mem_one.1 hy - simp [AlgHom.commutes] - | succ k ih => - rw [pow_succ] at hy - refine Submodule.mul_induction_on hy (fun a ha b hb => ?_) (fun x y hx hy => ?_) - · rw [show 2 * (k + 1) = 2 * k + 2 from by omega, map_mul, ih ha, - h.massWeightPoly_of_mem_scalarSubmoduleOne hb, Polynomial.monomial_mul_monomial] - · simp [map_add, hx, hy] - -/-- A product of `k` symbols has mass weight `2 * k`, so it is a term of mass weight at - most `n` as soon as `2 * k ≤ n`. -/ -lemma scalarSubmoduleOne_pow_le_higgsMassWeightSubmodule {k n : ℕ} (hk : 2 * k ≤ n) : - h.scalarSubmoduleOne ^ k ≤ h.higgsMassWeightSubmodule n := by - have hsub : h.scalarSubmoduleOne ≤ (Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ - Set.range (fun φ => (barH φ)))).toSubmodule := by - refine sup_le ?_ ?_ - · rintro _ ⟨φ, rfl⟩ - exact Algebra.subset_adjoin (Or.inl ⟨φ, rfl⟩) - · rintro _ ⟨φ, rfl⟩ - exact Algebra.subset_adjoin (Or.inr ⟨φ, rfl⟩) - have hadj : ∀ m : ℕ, h.scalarSubmoduleOne ^ m ≤ (Algebra.adjoin ℂ - (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)))).toSubmodule := by - intro m - induction m with - | zero => - rw [pow_zero] - rintro x hx - obtain ⟨c, rfl⟩ := Submodule.mem_one.1 hx - exact Subalgebra.algebraMap_mem _ c - | succ m ih => - rw [pow_succ] - refine Submodule.mul_le.2 fun a ha b hb => ?_ - show a * b ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ - Set.range (fun φ => (barH φ))) - exact mul_mem (ih ha) (hsub hb) - intro y hy - refine h.mem_higgsMassWeightSubmodule.2 ⟨hadj k hy, ?_⟩ - rw [h.massWeightPoly_of_mem_pow k hy] - exact (Polynomial.degree_monomial_le _ _).trans (by exact_mod_cast hk) - -/-- **The terms of mass weight at most `2 * n` are the combinations of products of at most - `n` symbols.** One inclusion is the mass-dimension counting read forwards: a product of - `k ≤ n` symbols sits in degree `2 * k`. The other is the counting read backwards, and is - the substance of the statement: the mass-weight polynomial of a term of the subalgebra is - supported in even degrees, with the coefficient in degree `2 * k` a combination of - products of `k` symbols, and the term is the sum of its own coefficients. A degree bound - therefore caps the number of symbols. -/ -lemma higgsMassWeightSubmodule_eq_sum_pow (n : ℕ) : - h.higgsMassWeightSubmodule (2 * n) - = ∑ k ∈ Finset.range (n + 1), h.scalarSubmoduleOne ^ k := by - refine le_antisymm (fun x hx => ?_) ?_ - · obtain ⟨hadj, hdeg⟩ := h.mem_higgsMassWeightSubmodule.1 hx - have hmul : ∀ p q : Polynomial B, (p * q).eval 1 = p.eval 1 * q.eval 1 := fun _ _ => - Polynomial.eval₂_mul_noncomm _ _ fun _ => Commute.one_right _ - have key : ∀ y ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ - Set.range (fun φ => (barH φ))), (massWeightPoly y).eval 1 = y ∧ - (∀ j, (massWeightPoly y).coeff j ∈ h.scalarSubmoduleOne ^ (j / 2)) ∧ - (∀ j, ¬ 2 ∣ j → (massWeightPoly y).coeff j = 0) := by - intro y hy - induction hy using Algebra.adjoin_induction with - | mem y hy => - have hy1 : y ∈ h.scalarSubmoduleOne := by - rcases hy with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ - · exact Submodule.mem_sup_left (LinearMap.mem_range_self _ _) - · exact Submodule.mem_sup_right (LinearMap.mem_range_self _ _) - rw [h.massWeightPoly_of_mem_scalarSubmoduleOne hy1] - refine ⟨by simp, fun j => ?_, fun j hj => ?_⟩ - · rw [Polynomial.coeff_monomial] - split_ifs with h2 - · subst h2 - simpa using hy1 - · exact zero_mem _ - · rw [Polynomial.coeff_monomial, if_neg (by omega)] - | algebraMap c => - rw [AlgHom.commutes, show algebraMap ℂ (Polynomial B) c - = Polynomial.C (algebraMap ℂ B c) from rfl] - refine ⟨by simp, fun j => ?_, fun j hj => ?_⟩ - · rcases Nat.eq_zero_or_pos j with rfl | hj0 - · simp - · rw [Polynomial.coeff_C, if_neg (by omega)] - exact zero_mem _ - · rw [Polynomial.coeff_C, if_neg (by omega)] - | add y z _ _ ihy ihz => - rw [map_add] - exact ⟨by rw [Polynomial.eval_add, ihy.1, ihz.1], - fun j => by rw [Polynomial.coeff_add]; exact add_mem (ihy.2.1 j) (ihz.2.1 j), - fun j hj => by rw [Polynomial.coeff_add, ihy.2.2 j hj, ihz.2.2 j hj, add_zero]⟩ - | mul y z _ _ ihy ihz => - rw [map_mul] - refine ⟨by rw [hmul, ihy.1, ihz.1], fun j => ?_, fun j hj => ?_⟩ - · rw [Polynomial.coeff_mul] - refine Submodule.sum_mem _ fun q hq => ?_ - have hq' : q.1 + q.2 = j := Finset.mem_antidiagonal.1 hq - by_cases ha : 2 ∣ q.1 - · by_cases hb : 2 ∣ q.2 - · rw [show j / 2 = q.1 / 2 + q.2 / 2 from by omega, pow_add] - exact Submodule.mul_mem_mul (ihy.2.1 _) (ihz.2.1 _) - · rw [ihz.2.2 _ hb, mul_zero] - exact zero_mem _ - · rw [ihy.2.2 _ ha, zero_mul] - exact zero_mem _ - · rw [Polynomial.coeff_mul] - refine Finset.sum_eq_zero fun q hq => ?_ - have hq' : q.1 + q.2 = j := Finset.mem_antidiagonal.1 hq - by_cases ha : 2 ∣ q.1 - · rw [ihz.2.2 _ (by omega), mul_zero] - · rw [ihy.2.2 _ ha, zero_mul] - obtain ⟨heval, hcoeff, -⟩ := key x hadj - rw [← heval, Polynomial.eval_eq_sum_range' - (Nat.lt_succ_of_le (Polynomial.natDegree_le_iff_degree_le.2 hdeg))] - refine Submodule.sum_mem _ fun i hi => ?_ - have hi' := Finset.mem_range.1 hi - rw [one_pow, mul_one] - exact Finset.single_le_sum (f := fun k => h.scalarSubmoduleOne ^ k) - (fun _ _ => bot_le) (Finset.mem_range.mpr (by omega)) (hcoeff i) - · refine Finset.sum_induction _ (· ≤ h.higgsMassWeightSubmodule (2 * n)) - (fun a b ha hb => by rw [Submodule.add_eq_sup]; exact sup_le ha hb) bot_le fun k hk => ?_ - exact h.scalarSubmoduleOne_pow_le_higgsMassWeightSubmodule - (by have := Finset.mem_range.1 hk; omega) - -/-- **The terms of mass weight at most eight, written out.** A Higgs symbol carries mass - weight two, so mass weight eight is mass dimension four: the join of the powers - `scalarSubmoduleOne ^ k` for `k ≤ 4`. Expanding each power distributes over the join, and - the Higgs and conjugate-Higgs symbols commute, so every ordered product equals the one - with all `H` factors to the left. -/ -lemma higgsMassWeightSubmodule_eq_higgs : - h.higgsMassWeightSubmodule 8 = - 1 ⊔ h.higgsSubmodule - ⊔ h.barHiggsSubmodule - ⊔ h.higgsSubmodule * h.higgsSubmodule - ⊔ h.higgsSubmodule * h.barHiggsSubmodule - ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule - ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule - ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule - ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule - ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule - ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule - ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule - ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule - ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule - ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by - have hcomm : h.higgsSubmodule * h.barHiggsSubmodule = h.barHiggsSubmodule * h.higgsSubmodule := by - refine le_antisymm (Submodule.mul_le.mpr fun m hm n hn => ?_) - (Submodule.mul_le.mpr fun m hm n hn => ?_) - · obtain ⟨φ, rfl⟩ := hm - obtain ⟨ψ, rfl⟩ := hn - rw [(h.H_comm_barH φ ψ).eq] - exact Submodule.mul_mem_mul (LinearMap.mem_range_self _ _) (LinearMap.mem_range_self _ _) - · obtain ⟨ψ, rfl⟩ := hm - obtain ⟨φ, rfl⟩ := hn - rw [← (h.H_comm_barH φ ψ).eq] - exact Submodule.mul_mem_mul (LinearMap.mem_range_self _ _) (LinearMap.mem_range_self _ _) - have hcm : Commute h.higgsSubmodule h.barHiggsSubmodule := hcomm - have hCCA : Commute (h.barHiggsSubmodule * h.barHiggsSubmodule) h.higgsSubmodule := hcm.symm.mul_left hcm.symm - have s1 : h.higgsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule := by - rw [mul_assoc, hcm.symm.eq, ← mul_assoc] - have s2 : h.barHiggsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by - rw [hCCA.eq, ← mul_assoc] - have s3 : h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule := by - rw [mul_assoc (h.higgsSubmodule * h.higgsSubmodule) h.barHiggsSubmodule h.higgsSubmodule, hcm.symm.eq, ← mul_assoc] - have s4 : h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by - rw [mul_assoc h.higgsSubmodule h.barHiggsSubmodule h.barHiggsSubmodule, mul_assoc h.higgsSubmodule (h.barHiggsSubmodule * h.barHiggsSubmodule) h.higgsSubmodule, hCCA.eq, ← mul_assoc, - ← mul_assoc] - have s5 : h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.higgsSubmodule = h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by - rw [(hCCA.mul_left hcm.symm).eq, ← mul_assoc, ← mul_assoc] - have e2 : h.scalarSubmoduleOne ^ 2 - = h.higgsSubmodule * h.higgsSubmodule ⊔ h.higgsSubmodule * h.barHiggsSubmodule ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule := by - rw [pow_two, scalarSubmoduleOne, Submodule.sup_mul, Submodule.mul_sup, Submodule.mul_sup, - ← hcomm] - simp only [sup_assoc, sup_left_idem] - have e3 : h.scalarSubmoduleOne ^ 3 - = h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by - rw [pow_succ, e2, scalarSubmoduleOne, Submodule.sup_mul, Submodule.sup_mul, - Submodule.mul_sup, Submodule.mul_sup, Submodule.mul_sup, s1, s2] - simp only [sup_assoc, sup_left_idem] - have e4 : h.scalarSubmoduleOne ^ 4 - = h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule ⊔ h.higgsSubmodule * h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule ⊔ h.higgsSubmodule * h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule - ⊔ h.higgsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule ⊔ h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule * h.barHiggsSubmodule := by - rw [pow_succ, e3, scalarSubmoduleOne, Submodule.sup_mul, Submodule.sup_mul, - Submodule.sup_mul, Submodule.mul_sup, Submodule.mul_sup, Submodule.mul_sup, - Submodule.mul_sup, s3, s4, s5] - simp only [sup_assoc, sup_left_idem] - rw [show (8 : ℕ) = 2 * 4 from rfl, h.higgsMassWeightSubmodule_eq_sum_pow, - Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_succ, - Finset.sum_range_one, Submodule.add_eq_sup, Submodule.add_eq_sup, Submodule.add_eq_sup, - Submodule.add_eq_sup, pow_zero, pow_one, e2, e3, e4, scalarSubmoduleOne] - simp only [sup_assoc] - - - -/-! - -## Closure under the gauge action - -Each of the submodules above is *stable* under the gauge action on `B`: a gauge -transformation moves a Higgs symbol to a combination of Higgs symbols and nothing else. For -the two spans of symbols and their join this is exactly the equivariance recorded in -`IsHiggsAlgebraValued`. For the higher mass dimensions it needs, in addition, that a gauge -transformation acts on `B` by an *algebra* map; that is not among the fields of -`IsHiggsAlgebraValued`, so it is taken as the hypothesis `rep_mul` below — the analogue of -`IsGaugeField.gauge_mul` — and packaged as `repAlgHom`, after which `Submodule.mapHom` -carries the closure through products, powers and sums. - --/ - -lemma barHiggsSubmodule_map_le (g : GaugeGroupI) : - h.barHiggsSubmodule.map (rep g) ≤ h.barHiggsSubmodule := by - rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ - exact ⟨HiggsVec.repGaugeGroupI.conj.dual g φ, (h.barH_equivariant g φ).symm⟩ - - -/-- The mass-dimension-one terms are closed under the gauge action. -/ -lemma scalarSubmoduleOne_closure (g : GaugeGroupI) : - h.scalarSubmoduleOne.map (rep g) = h.scalarSubmoduleOne := by - rw [scalarSubmoduleOne, Submodule.map_sup, h.higgsSubmodule_closure g, - h.barHiggsSubmodule_closure g] - -variable (rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), - rep g (b₁ * b₂) = rep g b₁ * rep g b₂) -include rep_mul - -set_option linter.unusedVariables false in -/-- A gauge transformation as an algebra homomorphism of `B`. Only linearity is built into - `Representation`; `rep_mul` supplies multiplicativity, and the unit is preserved because a - gauge transformation is invertible. -/ -def repAlgHom (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (g : GaugeGroupI) : B →ₐ[ℂ] B := - AlgHom.ofLinearMap (rep g) - (by - obtain ⟨c, hc⟩ := (rep.apply_bijective g).2 1 - calc rep g 1 = rep g 1 * rep g c := by rw [hc, mul_one] - _ = rep g (1 * c) := (rep_mul g 1 c).symm - _ = 1 := by rw [one_mul, hc]) - (rep_mul g) - -lemma repAlgHom_toLinearMap (g : GaugeGroupI) : - (h.repAlgHom rep_mul g).toLinearMap = rep g := rfl - -lemma higgsMassWeightSubmodule_closure (g : GaugeGroupI) (n : ℕ) : - (h.higgsMassWeightSubmodule n).map (rep g) = h.higgsMassWeightSubmodule n := by - have hgen : ∀ (u : GaugeGroupI) (y : B), - y ∈ Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)) → - rep u y ∈ Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ)) := by - rintro u _ (⟨φ, rfl⟩ | ⟨φ, rfl⟩) - · exact Or.inl ⟨_, (h.H_equivariant u φ).symm⟩ - · exact Or.inr ⟨_, (h.barH_equivariant u φ).symm⟩ - have key : ∀ (u : GaugeGroupI) (y : B), - y ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ Set.range (fun φ => (barH φ))) → - rep u y ∈ Algebra.adjoin ℂ (Set.range (fun φ => (H φ)) ⊔ - Set.range (fun φ => (barH φ))) ∧ - massWeightPoly (rep u y) = - Polynomial.mapAlgHom (h.repAlgHom rep_mul u) (massWeightPoly y) := by - intro u y hy - have hf : ∀ b : B, (h.repAlgHom rep_mul u) b = rep u b := fun _ => rfl - induction hy using Algebra.adjoin_induction with - | mem y hy => - refine ⟨Algebra.subset_adjoin (hgen u y hy), ?_⟩ - rcases hy with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ - · simp [hf, h.H_equivariant, h.H_massWeight] - · simp [hf, h.barH_equivariant, h.barH_massWeight] - | algebraMap c => - have hc : rep u (algebraMap ℂ B c) = algebraMap ℂ B c := - (h.repAlgHom rep_mul u).commutes c - rw [hc] - exact ⟨Subalgebra.algebraMap_mem _ c, by simp [AlgHom.commutes]⟩ - | add y z _ _ ihy ihz => - exact ⟨by rw [map_add]; exact add_mem ihy.1 ihz.1, by simp [ihy.2, ihz.2]⟩ - | mul y z _ _ ihy ihz => - rw [rep_mul] - exact ⟨mul_mem ihy.1 ihz.1, by rw [map_mul, ihy.2, ihz.2, map_mul, map_mul]⟩ - have hle : ∀ u : GaugeGroupI, - (h.higgsMassWeightSubmodule n).map (rep u) ≤ h.higgsMassWeightSubmodule n := by - rintro u _ ⟨y, ⟨hy₁, hy₂⟩, rfl⟩ - refine ⟨(key u y hy₁).1, Polynomial.mem_degreeLE.2 ?_⟩ - show (massWeightPoly (rep u y)).degree ≤ (n : WithBot ℕ) - rw [(key u y hy₁).2, Polynomial.coe_mapAlgHom] - exact Polynomial.degree_map_le.trans (Polynomial.mem_degreeLE.1 hy₂) - exact le_antisymm (hle g) fun b hb => - ⟨rep g⁻¹ b, hle g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ +@[simp] +lemma range_dotSymbol_left (d : Fin 1 → Fin 1 ⊕ Fin 3) : + (h.dotSymbol ![1, 0] d).range = ℂ ∙ h.dotGaugeHiggs d ![] := by + rw [h.dotSymbol_left d, ← LinearMap.span_singleton_eq_range] +@[simp] +lemma range_dotSymbol_right (d : Fin 1 → Fin 1 ⊕ Fin 3) : + (h.dotSymbol ![0, 1] d).range = ℂ ∙ h.dotGaugeHiggs ![] d := by + rw [h.dotSymbol_right d, ← LinearMap.span_singleton_eq_range] + +/-- The span of the two-factor symbols is the gauge-invariant submodule of mass weight + six: one derivative on the Higgs or one on its conjugate. -/ +lemma iSup_range_dotSymbol_eq : + ((⨆ d, (h.dotSymbol ![1, 0] d).range) ⊔ ⨆ d, (h.dotSymbol ![0, 1] d).range) + = h.gaugeInvariantOfMassDim 6 := by + rw [h.gaugeInvariantOfMassDim_six_eq] + congr 1 + · exact iSup_congr fun d => h.range_dotSymbol_left d + · exact iSup_congr fun d => h.range_dotSymbol_right d + + + + +/-- **The boost-weight decomposition of the gauge-invariant terms of mass weight six.** + The two families — one derivative on the Higgs, one on its conjugate — are each a + two-factor derivative collection over `ℂ`, so each carries a decomposition; the join of + the two is the decomposition of their join. -/ +noncomputable def boostWeightZeroSix (i : Fin 3) : + WeightDecomposition repLorentz i (h.gaugeInvariantOfMassDim 6) := + ((h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![1, 0] i + (trivialWeightDecomposition i)).sup + (h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![0, 1] i + (trivialWeightDecomposition i))).copy h.iSup_range_dotSymbol_eq /-! -## Gauge weight decomposition +### D.4. The zero parts of the boost weights -/ -omit rep_mul in -omit rep_mul in -/-- The gauge weight decomposition on the submodule `higgsSubmodule`. +lemma boostWeightZeroSix_piece_zero_eq (i : Fin 3) : + (h.boostWeightZeroSix i).piece 0 = + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 1)] ![] ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2)] ![]) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i + 1)] ⊔ ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i+ 2)]) := by + have h1 := IsDerivativeCollection.iSup_range_lightConeDeriv_single_weight_zero + (h.dotSymbol ![1, 0]) i + have h2 := IsDerivativeCollection.iSup_range_lightConeDeriv_single_weight_zero + (h.dotSymbol ![0, 1]) i + simp only [h.range_dotSymbol_left] at h1 + simp only [h.range_dotSymbol_right] at h2 + dsimp only [boostWeightZeroSix, WeightDecomposition.copy_piece, WeightDecomposition.sup_piece] + rw [h.isDerivativeCollection_dotSymbol.boostDecompOfNum_piece_of_weight_zero ![1, 0] i + (trivialWeightDecomposition i) (by simp) (fun b hb => by simp [hb]), + h.isDerivativeCollection_dotSymbol.boostDecompOfNum_piece_of_weight_zero ![0, 1] i + (trivialWeightDecomposition i) (by simp) (fun b hb => by simp [hb])] + exact congrArg₂ (· ⊔ ·) h1 h2 + +structure WeightDecompositionLE {K : Type u_1} [Field K] [Algebra ℝ K] {M : Type u_2} + [AddCommGroup M] [Module K M] (rep : Representation K SL(2, ℂ) M) (i : Fin 3) + (V : Submodule K M) where + /-- The weight-`k` piece of the decomposition. -/ + piece : ℤ → Submodule K M + /-- The finite set of weights that occur. -/ + supp : Finset ℤ + piece_le : ∀ k, piece k ≤ boostWeightSubmodule rep i k + piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ + iSup_piece : V ≤ (⨆ k, piece k) + +/-- A weight decomposition of `V` covers every submodule of `V`. -/ +noncomputable def _root_.Lorentz.BoostWeight.WeightDecomposition.toLE + {K : Type*} [Field K] [Algebra ℝ K] {M : Type*} [AddCommGroup M] [Module K M] + {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V V' : Submodule K M} + (d : WeightDecomposition rep i V) (hV' : V' ≤ V) : + WeightDecompositionLE rep i V' where + piece := d.piece + supp := d.supp + piece_le := d.piece_le + piece_eq_bot := d.piece_eq_bot + iSup_piece := hV'.trans d.iSup_piece.ge + +/-- **A weight-zero element of a covered submodule lies in the weight-zero piece**: the + boost-weight spaces are independent, so the pieces of nonzero weight cannot contribute + to it. -/ +lemma WeightDecompositionLE.mem_piece_zero_of_mem + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V : Submodule K A} + (d : WeightDecompositionLE rep i V) {x : A} + (hxV : x ∈ V) (hx0 : x ∈ boostWeightSubmodule rep i 0) : x ∈ d.piece 0 := by + have hcov : x ∈ d.piece 0 ⊔ ⨆ k, ⨆ (_ : k ≠ (0 : ℤ)), d.piece k := by + refine (d.iSup_piece.trans (iSup_le fun k => ?_)) hxV + by_cases hk : k = 0 + · subst hk + exact le_sup_left + · exact le_sup_of_le_right (le_iSup₂_of_le k hk le_rfl) + obtain ⟨y, hy, z, hz, hyz⟩ := Submodule.mem_sup.1 hcov + have hz1 : z ∈ ⨆ k, ⨆ (_ : k ≠ (0 : ℤ)), boostWeightSubmodule rep i k := + (iSup₂_le fun k hk => le_iSup₂_of_le k hk (d.piece_le k)) hz + have hz0 : z ∈ boostWeightSubmodule rep i 0 := by + rw [show z = x - y from by rw [← hyz]; abel] + exact sub_mem hx0 (d.piece_le 0 hy) + have hz' : z = 0 := + Submodule.disjoint_def.1 (iSupIndep_def.1 (boostWeightSubmodule_iSupIndep rep) 0) z hz0 hz1 + rw [← hyz, hz', add_zero] + exact hy + +/-- **If zero is not among the weights, an invariant element of the covered submodule + vanishes.** -/ +lemma WeightDecompositionLE.eq_zero_of_mem_of_zero_notMem_supp + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V : Submodule K A} + (d : WeightDecompositionLE rep i V) {x : A} (h0 : (0 : ℤ) ∉ d.supp) + (hxV : x ∈ V) (hx0 : x ∈ boostWeightSubmodule rep i 0) : x = 0 := by + have hx := d.mem_piece_zero_of_mem hxV hx0 + rwa [d.piece_eq_bot 0 h0, Submodule.mem_bot] at hx + +open IsDerivativeCollection in +/-- **The minimal `y`-boost covering of the `x`-weight-zero part** of the dimension-six + terms. The `z`-derivative terms have `y`-weight zero; the `y`-derivative terms are not + `y`-boost eigenvectors, so they are covered by the light-cone combinations `D₀ ∓ D₁`, + of weights `±2`. -/ +noncomputable def dimSixWeightDecompositionLE : + WeightDecompositionLE repLorentz 1 ((h.boostWeightZeroSix 0).piece 0) where + piece k := + if k = 0 then + ℂ ∙ h.dotGaugeHiggs ![Sum.inr 2] ![] ⊔ ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 2] + else if k = 2 then + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 1] ![]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 1]) + else if k = -2 then + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 1] ![]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 1]) + else ⊥ + supp := {-2, 0, 2} + piece_le k := by + have hbase : ∀ (F : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) + (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) (κ : Fin 4), + lightConeDeriv F 1 ![κ] 1 ∈ + boostWeightSubmodule repLorentz 1 (lightConeWeight κ) := fun F hF κ => by + simpa using lightConeDeriv_mem F hF 1 ![κ] (b := 0) (w := 1) + ((trivialWeightDecomposition 1).piece_le 0 (by simp)) + have hL := hbase (h.dotSymbol ![1, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 0]) + have hR := hbase (h.dotSymbol ![0, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 1]) + split_ifs with h0 h2 hm2 + · subst h0 + refine sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + · have e := hL 2 + rw [lightConeDeriv_two, h.dotSymbol_left, show ((1 : Fin 3) + 1) = 2 from rfl, + LinearMap.toSpanSingleton_apply, one_smul, + show lightConeWeight 2 = (0 : ℤ) from rfl] at e + exact e + · have e := hR 2 + rw [lightConeDeriv_two, h.dotSymbol_right, show ((1 : Fin 3) + 1) = 2 from rfl, + LinearMap.toSpanSingleton_apply, one_smul, + show lightConeWeight 2 = (0 : ℤ) from rfl] at e + exact e + · subst h2 + refine sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + · have e := hL 0 + rw [lightConeDeriv_zero, LinearMap.sub_apply, h.dotSymbol_left, h.dotSymbol_left, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 0 = (2 : ℤ) from rfl] at e + exact e + · have e := hR 0 + rw [lightConeDeriv_zero, LinearMap.sub_apply, h.dotSymbol_right, h.dotSymbol_right, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 0 = (2 : ℤ) from rfl] at e + exact e + · subst hm2 + refine sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + · have e := hL 1 + rw [lightConeDeriv_one, LinearMap.add_apply, h.dotSymbol_left, h.dotSymbol_left, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 1 = (-2 : ℤ) from rfl] at e + exact e + · have e := hR 1 + rw [lightConeDeriv_one, LinearMap.add_apply, h.dotSymbol_right, h.dotSymbol_right, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 1 = (-2 : ℤ) from rfl] at e + exact e + · exact bot_le + piece_eq_bot k hk := by + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hk + rw [if_neg hk.2.1, if_neg hk.2.2, if_neg hk.1] + iSup_piece := by + rw [h.boostWeightZeroSix_piece_zero_eq 0, show ((0 : Fin 3) + 1) = 1 from rfl, + show ((0 : Fin 3) + 2) = 2 from rfl] + set pL := h.dotGaugeHiggs ![Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 1] ![] with hpL + set mL := h.dotGaugeHiggs ![Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 1] ![] with hmL + set pR := h.dotGaugeHiggs ![] ![Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 1] with hpR + set mR := h.dotGaugeHiggs ![] ![Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 1] with hmR + refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · rw [show h.dotGaugeHiggs ![Sum.inr 1] ![] = (2⁻¹ : ℂ) • (pL - mL) from by + rw [hpL, hmL]; module] + refine Submodule.smul_mem _ _ (sub_mem (Submodule.mem_iSup_of_mem (-2) ?_) + (Submodule.mem_iSup_of_mem 2 ?_)) + · rw [if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + · rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + · refine Submodule.mem_iSup_of_mem 0 ?_ + rw [if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + · rw [show h.dotGaugeHiggs ![] ![Sum.inr 1] = (2⁻¹ : ℂ) • (pR - mR) from by + rw [hpR, hmR]; module] + refine Submodule.smul_mem _ _ (sub_mem (Submodule.mem_iSup_of_mem (-2) ?_) + (Submodule.mem_iSup_of_mem 2 ?_)) + · rw [if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + · rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + · refine Submodule.mem_iSup_of_mem 0 ?_ + rw [if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - The Higgs is a colour singlet of hypercharge `-3`, but it is *not* of pure isospin: the - submodule splits into the two component lines `span {H^0}` and `span {H^1}`, at the gauge - weights `(0, 0, -1, -3)` and `(0, 0, 1, -3)`. - In particular the zero-weight piece is `⊥`, so `mem_zero_of_invariant` says here that no - nonzero term linear in the Higgs is gauge invariant. -/ -noncomputable def higgsSubmoduleGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - GaugeWeightDecomposition rep h.higgsSubmodule where - piece := fun w => - if w = (0, 0, -1, -3) then Submodule.span ℂ {h.higgsComponent 0} - else if w = (0, 0, 1, -3) then Submodule.span ℂ {h.higgsComponent 1} else ⊥ - supp := {(0, 0, -1, -3), (0, 0, 1, -3)} - piece_le := by - have hz : ∀ i : Fin 4, Submodule.span ℂ {h.higgsComponent 0} - ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) - ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -1, -3) i) := fun i => - (Submodule.span_singleton_le_iff_mem _ _).mpr - (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_higgsComponent_zero i)) - have ho : ∀ i : Fin 4, Submodule.span ℂ {h.higgsComponent 1} - ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) - ((expI : ℂ) ^ GaugeWeight.coord (0, 0, 1, -3) i) := fun i => - (Submodule.span_singleton_le_iff_mem _ _).mpr - (Module.End.mem_eigenspace_iff.mpr (h.rep_gaugeTorusGen_higgsComponent_one i)) - intro w x hx i - rcases eq_or_ne w (0, 0, -1, -3) with rfl | hw0 - · rw [if_pos rfl] at hx - exact Module.End.mem_eigenspace_iff.mp (hz i hx) - · rcases eq_or_ne w (0, 0, 1, -3) with rfl | hw1 - · rw [if_neg hw0, if_pos rfl] at hx - exact Module.End.mem_eigenspace_iff.mp (ho i hx) - · rw [if_neg hw0, if_neg hw1, Submodule.mem_bot] at hx - subst hx - simp - piece_eq_bot := by - intro w hw - simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hw - rw [if_neg hw.1, if_neg hw.2] +lemma dimSixWeightDecompositionLE_piece_zero_eq : + (h.dimSixWeightDecompositionLE.piece 0) = + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr 2] ![] ⊔ ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 2]) := by + simp [dimSixWeightDecompositionLE] + +open IsDerivativeCollection in +/-- **The `z`-boost covering of the doubly-weight-zero part** of the dimension-six terms. + The remaining `z`-derivative terms lie along the boost axis, so nothing survives at + weight zero: they are covered entirely by the light-cone combinations `D₀ ∓ D₂`, of + weights `±2`. -/ +noncomputable def dimSixWeightDecompositionLELE : + WeightDecompositionLE repLorentz 2 (h.dimSixWeightDecompositionLE.piece 0) where + piece k := + if k = 2 then + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2] ![]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2]) + else if k = -2 then + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 2] ![]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 2]) + else ⊥ + supp := {-2, 2} + piece_le k := by + have hbase : ∀ (F : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) + (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) (κ : Fin 4), + lightConeDeriv F 2 ![κ] 1 ∈ + boostWeightSubmodule repLorentz 2 (lightConeWeight κ) := fun F hF κ => by + simpa using lightConeDeriv_mem F hF 2 ![κ] (b := 0) (w := 1) + ((trivialWeightDecomposition 2).piece_le 0 (by simp)) + have hL := hbase (h.dotSymbol ![1, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 0]) + have hR := hbase (h.dotSymbol ![0, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 1]) + split_ifs with h2 hm2 + · subst h2 + refine sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + · have e := hL 0 + rw [lightConeDeriv_zero, LinearMap.sub_apply, h.dotSymbol_left, h.dotSymbol_left, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 0 = (2 : ℤ) from rfl] at e + exact e + · have e := hR 0 + rw [lightConeDeriv_zero, LinearMap.sub_apply, h.dotSymbol_right, h.dotSymbol_right, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 0 = (2 : ℤ) from rfl] at e + exact e + · subst hm2 + refine sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + ((Submodule.span_singleton_le_iff_mem _ _).2 ?_) + · have e := hL 1 + rw [lightConeDeriv_one, LinearMap.add_apply, h.dotSymbol_left, h.dotSymbol_left, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 1 = (-2 : ℤ) from rfl] at e + exact e + · have e := hR 1 + rw [lightConeDeriv_one, LinearMap.add_apply, h.dotSymbol_right, h.dotSymbol_right, + LinearMap.toSpanSingleton_apply, LinearMap.toSpanSingleton_apply, one_smul, one_smul, + show lightConeWeight 1 = (-2 : ℤ) from rfl] at e + exact e + · exact bot_le + piece_eq_bot k hk := by + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hk + rw [if_neg hk.2, if_neg hk.1] iSup_piece := by - refine le_antisymm (iSup_le fun w => ?_) ?_ - · rcases eq_or_ne w (0, 0, -1, -3) with rfl | hw0 + rw [h.dimSixWeightDecompositionLE_piece_zero_eq] + set pL := h.dotGaugeHiggs ![Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 2] ![] with hpL + set mL := h.dotGaugeHiggs ![Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2] ![] with hmL + set pR := h.dotGaugeHiggs ![] ![Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 2] with hpR + set mR := h.dotGaugeHiggs ![] ![Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2] with hmR + refine sup_le ?_ ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · rw [show h.dotGaugeHiggs ![Sum.inr 2] ![] = (2⁻¹ : ℂ) • (pL - mL) from by + rw [hpL, hmL]; module] + refine Submodule.smul_mem _ _ (sub_mem (Submodule.mem_iSup_of_mem (-2) ?_) + (Submodule.mem_iSup_of_mem 2 ?_)) + · rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) · rw [if_pos rfl] - exact (Submodule.span_singleton_le_iff_mem _ _).mpr - (h.higgsComponent_mem_higgsSubmodule 0) - · rcases eq_or_ne w (0, 0, 1, -3) with rfl | hw1 - · rw [if_neg hw0, if_pos rfl] - exact (Submodule.span_singleton_le_iff_mem _ _).mpr - (h.higgsComponent_mem_higgsSubmodule 1) - · rw [if_neg hw0, if_neg hw1] - exact bot_le - · rw [h.higgsSubmodule_eq_span_higgsComponents, Submodule.span_le] - rintro _ ⟨j, rfl⟩ - fin_cases j - · refine Submodule.mem_iSup_of_mem (0, 0, -1, -3) ?_ - rw [if_pos rfl] - exact Submodule.mem_span_singleton_self _ - · refine Submodule.mem_iSup_of_mem (0, 0, 1, -3) ?_ - rw [if_neg (by decide), if_pos rfl] - exact Submodule.mem_span_singleton_self _ - -omit rep_mul in -omit rep_mul in -/-- The gauge weight decomposition on the submodule `barHiggsSubmodule`. - - The conjugate Higgs is a colour singlet of hypercharge `+3`, and its two component symbols - carry isospin weights `+1` and `-1`; so the submodule splits into the two weight lines - `span {H̄^0}` and `span {H̄^1}`, at `(0, 0, 1, 3)` and `(0, 0, -1, 3)`. - - As for `higgsSubmoduleGaugeWeight` the zero-weight piece is `⊥`, so no nonzero term linear - in the conjugate Higgs is gauge invariant. -/ - -omit rep_mul in -lemma higgsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - (h.higgsSubmoduleGaugeWeight).supp = {(0, 0, -1, -3), (0, 0, 1, -3)} := by - rfl - -omit rep_mul in -lemma barHiggsSubmoduleGaugeWeight_supp (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - (h.barHiggsSubmoduleGaugeWeight).supp = {(0, 0, 1, 3), (0, 0, -1, 3)} := by - rfl - -/-- **The gauge weight decomposition of the scalar potential terms**, the terms of mass - weight at most eight. Read straight off - `higgsMassWeightSubmodule_eq_higgs`: the unit contributes `one`, the two symbol spans - contribute their own decompositions, every product of them is handled by `mul`, and the - fifteen summands are joined by `sup`. -/ -noncomputable def higgsMassWeightGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - GaugeWeightDecomposition rep (h.higgsMassWeightSubmodule 8) := - let d := h.higgsSubmoduleGaugeWeight - let d' := h.barHiggsSubmoduleGaugeWeight - (((((((((((((((GaugeWeightDecomposition.one (fun g => map_one (h.repAlgHom rep_mul g))).sup - d).sup - d').sup - (d.mul rep_mul d)).sup - (d.mul rep_mul d')).sup - (d'.mul rep_mul d')).sup - ((d.mul rep_mul d).mul rep_mul d)).sup - ((d.mul rep_mul d).mul rep_mul d')).sup - ((d.mul rep_mul d').mul rep_mul d')).sup - ((d'.mul rep_mul d').mul rep_mul d')).sup - (((d.mul rep_mul d).mul rep_mul d).mul rep_mul d)).sup - (((d.mul rep_mul d).mul rep_mul d).mul rep_mul d')).sup - (((d.mul rep_mul d).mul rep_mul d').mul rep_mul d')).sup - (((d.mul rep_mul d').mul rep_mul d').mul rep_mul d')).sup - (((d'.mul rep_mul d').mul rep_mul d').mul rep_mul d')).copy _ - h.higgsMassWeightSubmodule_eq_higgs - -def higgsQuadraticZeroGaugeWeight (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : Submodule ℂ B := - Submodule.span ℂ - {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} - -open GaugeWeightDecomposition in -lemma higgsMassWeightGaugeWeight_piece_zero (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - let H2 := Submodule.span ℂ - {h.higgsComponent 0 * h.barHiggsComponent 0, h.higgsComponent 1 * h.barHiggsComponent 1} - (h.higgsMassWeightGaugeWeight rep_mul).piece 0 = - 1 ⊔ H2 ⊔ H2 * H2 := by - dsimp only [higgsMassWeightGaugeWeight, GaugeWeightDecomposition.copy_piece, - GaugeWeightDecomposition.sup_piece, GaugeWeightDecomposition.one_piece, ↓dreduceIte, - Submodule.zero_eq_bot] - simp (disch := (try simp only [higgsSubmoduleGaugeWeight, barHiggsSubmoduleGaugeWeight, - GaugeWeightDecomposition.one, GaugeWeightDecomposition.mul_supp]; try decide)) only - [GaugeWeightDecomposition.piece_eq_zero_of_not_mem_supp, sup_bot_eq] - simp only [GaugeWeightDecomposition.mul_piece_eq_sub', barHiggsSubmoduleGaugeWeight_supp - , higgsSubmoduleGaugeWeight_supp, Finset.iSup_insert, Finset.iSup_singleton] - simp (disch := (try simp only [higgsSubmoduleGaugeWeight, barHiggsSubmoduleGaugeWeight, - GaugeWeightDecomposition.one, GaugeWeightDecomposition.mul_supp]; try decide)) - [GaugeWeightDecomposition.piece_eq_zero_of_not_mem_supp] - simp [barHiggsSubmoduleGaugeWeight, higgsSubmoduleGaugeWeight, Submodule.span_mul_span] - rw [← Submodule.span_mul_span, Submodule.span_insert] - simp only [Submodule.sup_mul, Submodule.mul_sup, Submodule.span_mul_span, - Set.singleton_mul_singleton] - have hHH : ∀ i j, h.higgsComponent i * h.higgsComponent j - = h.higgsComponent j * h.higgsComponent i := fun i j => (h.H_comm_H _ _).eq - have hbH : ∀ i j, h.barHiggsComponent i * h.higgsComponent j - = h.higgsComponent j * h.barHiggsComponent i := fun i j => (h.H_comm_barH _ _).symm.eq - have hbb : ∀ i j, h.barHiggsComponent i * h.barHiggsComponent j - = h.barHiggsComponent j * h.barHiggsComponent i := fun i j => (h.barH_comm_barH _ _).eq - have hHH' : ∀ i j (x : B), h.higgsComponent i * (h.higgsComponent j * x) - = h.higgsComponent j * (h.higgsComponent i * x) := fun i j x => by - rw [← mul_assoc, hHH, mul_assoc] - have hbH' : ∀ i j (x : B), h.barHiggsComponent i * (h.higgsComponent j * x) - = h.higgsComponent j * (h.barHiggsComponent i * x) := fun i j x => by - rw [← mul_assoc, hbH, mul_assoc] - simp only [mul_assoc, hHH, hHH', hbH', hbb] - simp only [sup_idem] - + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + · rw [show h.dotGaugeHiggs ![] ![Sum.inr 2] = (2⁻¹ : ℂ) • (pR - mR) from by + rw [hpR, hmR]; module] + refine Submodule.smul_mem _ _ (sub_mem (Submodule.mem_iSup_of_mem (-2) ?_) + (Submodule.mem_iSup_of_mem 2 ?_)) + · rw [if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + · rw [if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) /-! -## SU(2) permutation decomposition +### D.3. The dim six invariants -/ -omit rep_mul in -/-- The Weyl element sends `H⁰` to `H¹`. -/ -lemma rep_gaugeSU2Perm_higgsComponent_zero : - rep gaugeSU2Perm (h.higgsComponent 0) = h.higgsComponent 1 := by - rw [h.rep_higgsComponent] - simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, - Fin.sum_univ_two] - -omit rep_mul in -/-- The Weyl element sends `H¹` to `-H⁰`. -/ -lemma rep_gaugeSU2Perm_higgsComponent_one : - rep gaugeSU2Perm (h.higgsComponent 1) = -h.higgsComponent 0 := by - rw [h.rep_higgsComponent] - simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, - Fin.sum_univ_two] - -omit rep_mul in -/-- The Weyl element sends `H̄⁰` to `H̄¹`. -/ -lemma rep_gaugeSU2Perm_barHiggsComponent_zero : - rep gaugeSU2Perm (h.barHiggsComponent 0) = h.barHiggsComponent 1 := by - rw [h.rep_barHiggsComponent] - simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, - Fin.sum_univ_two] - -omit rep_mul in -/-- The Weyl element sends `H̄¹` to `-H̄⁰`. -/ -lemma rep_gaugeSU2Perm_barHiggsComponent_one : - rep gaugeSU2Perm (h.barHiggsComponent 1) = -h.barHiggsComponent 0 := by - rw [h.rep_barHiggsComponent] - simp [gaugeSU2Perm, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2Perm_inv_coe, - Fin.sum_univ_two] - -/-- **The Weyl decomposition of the zero-weight quadratic.** The Weyl element exchanges - `H⁰H̄⁰` and `H¹H̄¹`, so the two-dimensional space `higgsQuadraticZeroGaugeWeight` splits - into the even line spanned by `H⁰H̄⁰ + H¹H̄¹` — this is `H†H`, the genuine invariant — and - the odd line spanned by `H⁰H̄⁰ - H¹H̄¹`, which is `H†σ³H`, the neutral component of the - isospin triplet. Only the first survives `mem_zero_of_invariant`. -/ -noncomputable def higgsQuadraticZeroGaugeWeightSU2Perm (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - SU2PermDecomposition rep h.higgsQuadraticZeroGaugeWeight where - piece := fun w => - if w = 0 then Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1} - else if w = 2 then Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1} - else ⊥ - piece_le := by - have hplus : rep gaugeSU2Perm (h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1) - = h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1 := by - rw [map_add, rep_mul, rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, - h.rep_gaugeSU2Perm_barHiggsComponent_zero, h.rep_gaugeSU2Perm_higgsComponent_one, - h.rep_gaugeSU2Perm_barHiggsComponent_one, neg_mul_neg, add_comm] - have hminus : rep gaugeSU2Perm (h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1) - = -(h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1) := by - rw [map_sub, rep_mul, rep_mul, h.rep_gaugeSU2Perm_higgsComponent_zero, - h.rep_gaugeSU2Perm_barHiggsComponent_zero, h.rep_gaugeSU2Perm_higgsComponent_one, - h.rep_gaugeSU2Perm_barHiggsComponent_one, neg_mul_neg, neg_sub] - intro k x hx - rcases eq_or_ne k 0 with rfl | hk0 - · rw [if_pos rfl, Submodule.mem_span_singleton] at hx - obtain ⟨c, rfl⟩ := hx - rw [map_smul, hplus, su2PermSign_zero, one_smul] - · rcases eq_or_ne k 2 with rfl | hk2 - · rw [if_neg hk0, if_pos rfl, Submodule.mem_span_singleton] at hx - obtain ⟨c, rfl⟩ := hx - rw [map_smul, hminus, su2PermSign_two, smul_neg, neg_smul, one_smul] - · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hx - subst hx - simp - iSup_piece := by - have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide - refine le_antisymm (iSup_le fun k => ?_) ?_ - · rcases hcases k with rfl | rfl | rfl | rfl - · rw [if_pos rfl, higgsQuadraticZeroGaugeWeight, Submodule.span_le, - Set.singleton_subset_iff] - exact Submodule.add_mem _ (Submodule.subset_span (by simp)) - (Submodule.subset_span (by simp)) - · rw [if_neg (by decide), if_neg (by decide)] - exact bot_le - · rw [if_neg (by decide), if_pos rfl, higgsQuadraticZeroGaugeWeight, Submodule.span_le, - Set.singleton_subset_iff] - exact Submodule.sub_mem _ (Submodule.subset_span (by simp)) - (Submodule.subset_span (by simp)) - · rw [if_neg (by decide), if_neg (by decide)] - exact bot_le - · refine le_trans ?_ (sup_le (le_iSup _ (0 : ZMod 4)) (le_iSup _ (2 : ZMod 4))) - rw [if_pos rfl, if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl, - higgsQuadraticZeroGaugeWeight, Submodule.span_le] - have hp := Submodule.mem_sup_left (S := Submodule.span ℂ - {h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1}) - (T := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1}) - (Submodule.mem_span_singleton_self _) - have hm := Submodule.mem_sup_right (S := Submodule.span ℂ - {h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1}) - (T := Submodule.span ℂ {h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1}) - (Submodule.mem_span_singleton_self _) - rintro x (rfl | rfl) - · have hs := Submodule.smul_mem _ (2⁻¹ : ℂ) (Submodule.add_mem _ hp hm) - rwa [show (2⁻¹ : ℂ) • ((h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1) - + (h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1)) - = h.higgsComponent 0 * h.barHiggsComponent 0 from by module] at hs - · have hs := Submodule.smul_mem _ (2⁻¹ : ℂ) (Submodule.sub_mem _ hp hm) - rwa [show (2⁻¹ : ℂ) • ((h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1) - - (h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1)) - = h.higgsComponent 1 * h.barHiggsComponent 1 from by module] at hs - -/-- **The Weyl decomposition of the invariant candidates.** Read straight off - `higgsMassWeightGaugeWeight_piece_zero`: the constants contribute `one`, the - quadratic `H†H` sector contributes `higgsQuadraticZeroGaugeWeightSU2Perm`, the quartic - sector is its `mul` with itself, and the three are joined by `sup`. -/ -noncomputable def higgsMassWeightGaugeWeightZeroSU2Perm - (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - SU2PermDecomposition rep ((h.higgsMassWeightGaugeWeight rep_mul).piece 0) := - let d := h.higgsQuadraticZeroGaugeWeightSU2Perm rep_mul - (((SU2PermDecomposition.one (fun g => map_one (h.repAlgHom rep_mul g))).sup d).sup - (d.mul rep_mul d)).copy _ - (h.higgsMassWeightGaugeWeight_piece_zero rep_mul) - -/-- The gauge-invariant quadratic `H†H`, the Higgs mass term. -/ -noncomputable def massTerm : B := h.higgsComponent 0 * h.barHiggsComponent 0 - + h.higgsComponent 1 * h.barHiggsComponent 1 - -/-- The neutral component `H†σ³H` of the isospin triplet. It has gauge weight zero and is - odd under the Weyl element, so it is discarded by `SU2PermDecomposition`; its *square* is - even, and survives both sieves without being gauge invariant. -/ -noncomputable def tripletTerm : B := h.higgsComponent 0 * h.barHiggsComponent 0 - - h.higgsComponent 1 * h.barHiggsComponent 1 - -/-- **The mass term is gauge invariant.** `H†H` is fixed by every gauge transformation: - the hypercharge phases cancel between `H` and `H̄`, and the `SU(2)` matrix cancels against - its conjugate by unitarity. -/ -lemma massTerm_invariant (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (g : GaugeGroupI) : - rep g h.massTerm = h.massTerm := by - have hu : ((g⁻¹).toU1 : ℂ) * (starRingEnd ℂ) ((g⁻¹).toU1 : ℂ) = 1 := - Unitary.mul_star_self_of_mem (g⁻¹).toU1.2 - have hM : star ((g⁻¹).toSU2.1) * (g⁻¹).toSU2.1 = 1 := - Matrix.mem_unitaryGroup_iff'.mp (g⁻¹).toSU2.2.1 - have hM00 := congrFun (congrFun hM 0) 0 - have hM01 := congrFun (congrFun hM 0) 1 - have hM10 := congrFun (congrFun hM 1) 0 - have hM11 := congrFun (congrFun hM 1) 1 - simp only [Matrix.mul_apply, Fin.sum_univ_two, Matrix.one_apply, star_eq_conjTranspose, - Matrix.conjTranspose_apply, reduceIte, Complex.star_def, - show ¬((0 : Fin 2) = 1) from by decide, - show ¬((1 : Fin 2) = 0) from by decide] at hM00 hM01 hM10 hM11 - have hM01' := congrArg (starRingEnd ℂ) hM01 - have hM10' := congrArg (starRingEnd ℂ) hM10 - simp only [map_add, map_mul, Complex.conj_conj, map_zero] at hM01' hM10' - have hu3 : ((g⁻¹).toU1 : ℂ) ^ 3 * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3) = 1 := by - rw [map_pow, ← mul_pow, hu, one_pow] - have key : ∀ a b : ℂ, (((g⁻¹).toU1 : ℂ) ^ 3 * a) * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3 * b) - = a * (starRingEnd ℂ) b := by - intro a b - rw [map_mul] - calc (((g⁻¹).toU1 : ℂ) ^ 3 * a) * ((starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3) - * (starRingEnd ℂ) b) - = (((g⁻¹).toU1 : ℂ) ^ 3 * (starRingEnd ℂ) (((g⁻¹).toU1 : ℂ) ^ 3)) - * (a * (starRingEnd ℂ) b) := by ring - _ = a * (starRingEnd ℂ) b := by rw [hu3, one_mul] - rw [massTerm, map_add, rep_mul, rep_mul, h.rep_higgsComponent, h.rep_barHiggsComponent, - h.rep_higgsComponent, h.rep_barHiggsComponent] - simp only [Fin.sum_univ_two, add_mul, mul_add, smul_mul_smul_comm, key] - match_scalars - · linear_combination hM00 - · linear_combination hM10' - · linear_combination hM01' - · linear_combination hM11 +/-- **There is no gauge- and Lorentz-invariant term of mass dimension three.** An invariant + element of the mass-weight-six sector has boost weight zero along every axis; the three + sieves — the `x`-weight decomposition, then the `y`- and `z`-boost coverings — leave no + room at weight zero. -/ +lemma gaugeInvariantOfMassDim_six_eq_boostWeightZero + (x : B) (hx : ∀ g, rep g x = x) (hLorentz : ∀ g, repLorentz g x = x) + (hdim : x ∈ h.massWeightSubmodule 6) : + x = 0 := by + have hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0 := fun i => + mem_boostWeightSubmodule.2 fun t ht => by rw [hLorentz]; simp + have h6 : x ∈ h.gaugeInvariantOfMassDim 6 := + Submodule.mem_inf.2 ⟨hdim, (Representation.mem_invariants rep x).2 hx⟩ + have h1 : x ∈ (h.boostWeightZeroSix 0).piece 0 := + ((h.boostWeightZeroSix 0).toLE le_rfl).mem_piece_zero_of_mem h6 (hw 0) + have h2 : x ∈ h.dimSixWeightDecompositionLE.piece 0 := + h.dimSixWeightDecompositionLE.mem_piece_zero_of_mem h1 (hw 1) + exact h.dimSixWeightDecompositionLELE.eq_zero_of_mem_of_zero_notMem_supp + (by simp [dimSixWeightDecompositionLELE]) h2 (hw 2) -/-- **The even part of the weight-zero potential terms.** Note the fourth generator: the - quartic sector contributes `odd * odd` as well as `even * even`, so `(H†σ³H)²` is here - alongside `1`, `H†H` and `(H†H)²`. -/ -lemma higgsMassWeightGaugeWeightZeroSU2Perm_piece_zero - (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) : - (h.higgsMassWeightGaugeWeightZeroSU2Perm rep_mul).piece 0 = - Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, - h.tripletTerm * h.tripletTerm} := by - dsimp only [higgsMassWeightGaugeWeightZeroSU2Perm, SU2PermDecomposition.copy_piece, - SU2PermDecomposition.sup_piece, SU2PermDecomposition.one_piece] - rw [SU2PermDecomposition.mul_piece_eq] - dsimp only [higgsQuadraticZeroGaugeWeightSU2Perm] - simp only [show ((0 : ZMod 4) - 1) = 3 from by decide, - show ((0 : ZMod 4) - 2) = 2 from by decide, show ((0 : ZMod 4) - 3) = 1 from by decide, - show ¬((1 : ZMod 4) = 0) from by decide, show ¬((1 : ZMod 4) = 2) from by decide, - show ¬((2 : ZMod 4) = 0) from by decide, show ¬((3 : ZMod 4) = 0) from by decide, - show ¬((3 : ZMod 4) = 2) from by decide, - reduceIte, Submodule.mul_bot, sup_bot_eq, - Submodule.span_mul_span, Set.singleton_mul_singleton] - rw [massTerm, tripletTerm, Submodule.one_eq_span] - simp only [Submodule.span_insert, sup_assoc] - -lemma invariant_mem_span_massTerm_of_mem_higgsMassWeightSubmodule - (h : IsHiggsAlgebraValued B rep H barH massWeightPoly) (x : B) - (hx : x ∈ h.higgsMassWeightSubmodule 8) (x_inv : ∀ g, rep g x = x) : - x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by - have hmem : !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; - (1 - Complex.I) / 2, (1 + Complex.I) / 2] ∈ specialUnitaryGroup (Fin 2) ℂ := by - rw [Matrix.mem_specialUnitaryGroup_iff] - refine ⟨?_, ?_⟩ - · rw [Matrix.mem_unitaryGroup_iff] - ext a b - fin_cases a <;> fin_cases b <;> - simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, - Matrix.conjTranspose_apply, map_div₀, map_ofNat, - Complex.ext_iff] <;> norm_num - · rw [Matrix.det_fin_two_of] - simp [Complex.ext_iff] - norm_num - set g : GaugeGroupI := ⟨1, ⟨_, hmem⟩, 1⟩ with hg - have hginv : ((g⁻¹).toSU2 : Matrix (Fin 2) (Fin 2) ℂ) - = !![(1 + Complex.I)/2, (1 + Complex.I)/2; (-1 + Complex.I)/2, (1 - Complex.I)/2] := by - rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] - ext a b - fin_cases a <;> fin_cases b <;> - simp [hg, GaugeGroupI.toSU2, Complex.conj_I, Complex.ext_iff] - have hU1 : ((g⁻¹).toU1 : ℂ) = 1 := by simp [hg, GaugeGroupI.toU1] - have hH0 : rep g (h.higgsComponent 0) - = ((1 + Complex.I)/2) • h.higgsComponent 0 + ((1 + Complex.I)/2) • h.higgsComponent 1 := by - rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hginv] - simp - have hH1 : rep g (h.higgsComponent 1) - = ((-1 + Complex.I)/2) • h.higgsComponent 0 + ((1 - Complex.I)/2) • h.higgsComponent 1 := by - rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hginv] - simp - have hB0 : rep g (h.barHiggsComponent 0) - = ((1 - Complex.I)/2) • h.barHiggsComponent 0 - + ((1 - Complex.I)/2) • h.barHiggsComponent 1 := by - rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hginv] - simp [map_div₀, Complex.conj_I, map_ofNat] - module - have hB1 : rep g (h.barHiggsComponent 1) - = ((-1 - Complex.I)/2) • h.barHiggsComponent 0 - + ((1 + Complex.I)/2) • h.barHiggsComponent 1 := by - rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hginv] - simp [map_div₀, Complex.conj_I, map_ofNat] - module - have hn3 : rep g h.tripletTerm = h.higgsComponent 0 * h.barHiggsComponent 1 - + h.higgsComponent 1 * h.barHiggsComponent 0 := by - rw [tripletTerm, map_sub, rep_mul, rep_mul, hH0, hB0, hH1, hB1] - simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm] - match_scalars <;> simp [Complex.ext_iff] <;> norm_num - have hn1 : rep g (h.higgsComponent 0 * h.barHiggsComponent 1 - + h.higgsComponent 1 * h.barHiggsComponent 0) - = Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 - - h.higgsComponent 1 * h.barHiggsComponent 0) := by - rw [map_add, rep_mul, rep_mul, hH0, hB0, hH1, hB1] - simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm, smul_sub] - match_scalars <;> simp [Complex.ext_iff] <;> norm_num - have hHH : ∀ i j, h.higgsComponent i * h.higgsComponent j - = h.higgsComponent j * h.higgsComponent i := fun i j => (h.H_comm_H _ _).eq - have hbH : ∀ i j, h.barHiggsComponent i * h.higgsComponent j - = h.higgsComponent j * h.barHiggsComponent i := fun i j => (h.H_comm_barH _ _).symm.eq - have hbb : ∀ i j, h.barHiggsComponent i * h.barHiggsComponent j - = h.barHiggsComponent j * h.barHiggsComponent i := fun i j => (h.barH_comm_barH _ _).eq - have hHH' : ∀ i j (y : B), h.higgsComponent i * (h.higgsComponent j * y) - = h.higgsComponent j * (h.higgsComponent i * y) := fun i j y => by - rw [← mul_assoc, hHH, mul_assoc] - have hbH' : ∀ i j (y : B), h.barHiggsComponent i * (h.higgsComponent j * y) - = h.higgsComponent j * (h.barHiggsComponent i * y) := fun i j y => by - rw [← mul_assoc, hbH, mul_assoc] - have fierz : h.tripletTerm * h.tripletTerm - + (h.higgsComponent 0 * h.barHiggsComponent 1 + h.higgsComponent 1 * h.barHiggsComponent 0) - * (h.higgsComponent 0 * h.barHiggsComponent 1 - + h.higgsComponent 1 * h.barHiggsComponent 0) - + (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 - - h.higgsComponent 1 * h.barHiggsComponent 0)) - * (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 - - h.higgsComponent 1 * h.barHiggsComponent 0)) - = h.massTerm * h.massTerm := by - rw [tripletTerm, massTerm] - simp only [sub_mul, mul_sub, add_mul, mul_add, smul_mul_assoc, mul_smul_comm, - mul_assoc, hHH', hbH', hbb] - match_scalars <;> simp [Complex.ext_iff] - have hT3 : ∀ y : B, rep (g * g) y = rep g (rep g y) := by - intro y - rw [map_mul] - rfl - have e1 : rep g (h.tripletTerm * h.tripletTerm) - = (h.higgsComponent 0 * h.barHiggsComponent 1 + h.higgsComponent 1 * h.barHiggsComponent 0) - * (h.higgsComponent 0 * h.barHiggsComponent 1 - + h.higgsComponent 1 * h.barHiggsComponent 0) := by - rw [rep_mul, hn3] - have e2 : rep (g * g) (h.tripletTerm * h.tripletTerm) - = (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 - - h.higgsComponent 1 * h.barHiggsComponent 0)) - * (Complex.I • (h.higgsComponent 0 * h.barHiggsComponent 1 - - h.higgsComponent 1 * h.barHiggsComponent 0)) := by - rw [hT3, e1, rep_mul, hn1] - have hone : ∀ k : GaugeGroupI, rep k (1 : B) = 1 := fun k => map_one (h.repAlgHom rep_mul k) - have hm : ∀ k : GaugeGroupI, rep k h.massTerm = h.massTerm := massTerm_invariant rep_mul h - have hmm : ∀ k : GaugeGroupI, rep k (h.massTerm * h.massTerm) = h.massTerm * h.massTerm := - fun k => by rw [rep_mul, hm] - -- the two sieves put `x` in a four-generator span - have hspan : x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, - h.tripletTerm * h.tripletTerm} := by - rw [← h.higgsMassWeightGaugeWeightZeroSU2Perm_piece_zero rep_mul] - exact SU2PermDecomposition.mem_zero_of_invariant _ - (GaugeWeightDecomposition.mem_zero_of_invariant _ hx x_inv) x_inv - -- averaging over the three axes maps that span into the three-generator one - have s1 : (1 : B) ∈ Submodule.span ℂ ({1, h.massTerm, h.massTerm * h.massTerm} : Set B) := - Submodule.subset_span (by simp) - have s2 : h.massTerm ∈ Submodule.span ℂ ({1, h.massTerm, h.massTerm * h.massTerm} : Set B) := - Submodule.subset_span (by simp) - have s3 : h.massTerm * h.massTerm - ∈ Submodule.span ℂ ({1, h.massTerm, h.massTerm * h.massTerm} : Set B) := - Submodule.subset_span (by simp) - set T : B →ₗ[ℂ] B := LinearMap.id + rep g + rep (g * g) with hT - have hTapp : ∀ y : B, T y = y + rep g y + rep (g * g) y := fun y => rfl - have hmaple : Submodule.map T (Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm, - h.tripletTerm * h.tripletTerm}) - ≤ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by - rw [Submodule.map_span_le] - rintro y (rfl | rfl | rfl | rfl) <;> rw [hTapp] - · rw [hone, hone] - exact Submodule.add_mem _ (Submodule.add_mem _ s1 s1) s1 - · rw [hm, hm] - exact Submodule.add_mem _ (Submodule.add_mem _ s2 s2) s2 - · rw [hmm, hmm] - exact Submodule.add_mem _ (Submodule.add_mem _ s3 s3) s3 - · rw [e1, e2, fierz] - exact s3 - have hx3 : T x = (3 : ℂ) • x := by - rw [hTapp, x_inv, x_inv] - module - have hfin : (3 : ℂ) • x ∈ Submodule.span ℂ {1, h.massTerm, h.massTerm * h.massTerm} := by - rw [← hx3] - exact hmaple ⟨x, hspan, rfl⟩ - have hfin' := Submodule.smul_mem _ ((3 : ℂ)⁻¹) hfin - rwa [smul_smul, inv_mul_cancel₀ (by norm_num : (3 : ℂ) ≠ 0), one_smul] at hfin' --/ end IsHiggsAlgebraValued end StandardModel diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index 60d6d2129..3f28ddb72 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -687,10 +687,10 @@ end Theory pure boost weight whose supremum is `V`. Exhibiting one collapses all the per-span boilerplate: the projection images, the weight intersections, projection-closure and the off-support vanishing become the generic lemmas below. -/ -structure WeightDecomposition (rep : Representation K SL(2,ℂ) A) (i : Fin 3) - (V : Submodule K A) where +structure WeightDecomposition (rep : Representation K SL(2,ℂ) M) (i : Fin 3) + (V : Submodule K M) where /-- The weight-`k` piece of the decomposition. -/ - piece : ℤ → Submodule K A + piece : ℤ → Submodule K M /-- The finite set of weights that occur. -/ supp : Finset ℤ piece_le : ∀ k, piece k ≤ boostWeightSubmodule rep i k @@ -699,6 +699,38 @@ structure WeightDecomposition (rep : Representation K SL(2,ℂ) A) (i : Fin 3) namespace WeightDecomposition +/-- Transport a weight decomposition along an equality of submodules. -/ +def copy {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V₁ V₂ : Submodule K M} + (d₁ : WeightDecomposition rep i V₁) (hV : V₁ = V₂) : WeightDecomposition rep i V₂ where + piece := d₁.piece + supp := d₁.supp + piece_le := d₁.piece_le + piece_eq_bot := d₁.piece_eq_bot + iSup_piece := d₁.iSup_piece.trans hV + +@[simp] +lemma copy_piece {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V₁ V₂ : Submodule K M} + (d₁ : WeightDecomposition rep i V₁) (hV : V₁ = V₂) (k : ℤ) : + (d₁.copy hV).piece k = d₁.piece k := rfl + +/-- **The join of two weight decompositions** along the same axis: the weight-`k` piece of + the join is the join of the weight-`k` pieces. -/ +def sup {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V₁ V₂ : Submodule K M} + (d₁ : WeightDecomposition rep i V₁) (d₂ : WeightDecomposition rep i V₂) : + WeightDecomposition rep i (V₁ ⊔ V₂) where + piece k := d₁.piece k ⊔ d₂.piece k + supp := d₁.supp ∪ d₂.supp + piece_le k := sup_le (d₁.piece_le k) (d₂.piece_le k) + piece_eq_bot k hk := by + rw [d₁.piece_eq_bot k fun hk' => hk (Finset.mem_union_left _ hk'), + d₂.piece_eq_bot k fun hk' => hk (Finset.mem_union_right _ hk'), bot_sup_eq] + iSup_piece := by rw [iSup_sup_eq, d₁.iSup_piece, d₂.iSup_piece] + +@[simp] +lemma sup_piece {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V₁ V₂ : Submodule K M} + (d₁ : WeightDecomposition rep i V₁) (d₂ : WeightDecomposition rep i V₂) (k : ℤ) : + (d₁.sup d₂).piece k = d₁.piece k ⊔ d₂.piece k := rfl + variable {rep : Representation K SL(2,ℂ) A} [IsBoostGraded rep] {i : Fin 3} {V : Submodule K A} (d : WeightDecomposition rep i V) From 9445653832b018dbb334a55921ac928ddf82f586 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 25 Aug 2026 12:38:15 +0100 Subject: [PATCH 195/254] feat: Add summary of Lorentz argument --- .../HiggsBoson/AlgebraValued/Basic.lean | 141 ++++++++++-------- 1 file changed, 81 insertions(+), 60 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index 10b486a22..e6e95f83b 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -50,6 +50,8 @@ We also want to consider derivatives. The invariance involving the Higgs fields, up to mass-dimension 4 are given by: `H^† D_μ D_μ H`,`H D_μ D_μ H^†`, `D_μ H D_μ H^†`, `H H^†` and `(H^† H)^2`. + + -/ @[expose] public section @@ -2656,11 +2658,88 @@ lemma gaugeInvariantOfMassDim_eight_eq : /-! +## F. Aside: WeightDecomposition +-/ + + +structure WeightDecompositionLE {K : Type u_1} [Field K] [Algebra ℝ K] {M : Type u_2} + [AddCommGroup M] [Module K M] (rep : Representation K SL(2, ℂ) M) (i : Fin 3) + (V : Submodule K M) where + /-- The weight-`k` piece of the decomposition. -/ + piece : ℤ → Submodule K M + /-- The finite set of weights that occur. -/ + supp : Finset ℤ + piece_le : ∀ k, piece k ≤ boostWeightSubmodule rep i k + piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ + iSup_piece : V ≤ (⨆ k, piece k) + +/-- A weight decomposition of `V` covers every submodule of `V`. -/ +noncomputable def _root_.Lorentz.BoostWeight.WeightDecomposition.toLE + {K : Type*} [Field K] [Algebra ℝ K] {M : Type*} [AddCommGroup M] [Module K M] + {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V V' : Submodule K M} + (d : WeightDecomposition rep i V) (hV' : V' ≤ V) : + WeightDecompositionLE rep i V' where + piece := d.piece + supp := d.supp + piece_le := d.piece_le + piece_eq_bot := d.piece_eq_bot + iSup_piece := hV'.trans d.iSup_piece.ge + +/-- **A weight-zero element of a covered submodule lies in the weight-zero piece**: the + boost-weight spaces are independent, so the pieces of nonzero weight cannot contribute + to it. -/ +lemma WeightDecompositionLE.mem_piece_zero_of_mem + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V : Submodule K A} + (d : WeightDecompositionLE rep i V) {x : A} + (hxV : x ∈ V) (hx0 : x ∈ boostWeightSubmodule rep i 0) : x ∈ d.piece 0 := by + have hcov : x ∈ d.piece 0 ⊔ ⨆ k, ⨆ (_ : k ≠ (0 : ℤ)), d.piece k := by + refine (d.iSup_piece.trans (iSup_le fun k => ?_)) hxV + by_cases hk : k = 0 + · subst hk + exact le_sup_left + · exact le_sup_of_le_right (le_iSup₂_of_le k hk le_rfl) + obtain ⟨y, hy, z, hz, hyz⟩ := Submodule.mem_sup.1 hcov + have hz1 : z ∈ ⨆ k, ⨆ (_ : k ≠ (0 : ℤ)), boostWeightSubmodule rep i k := + (iSup₂_le fun k hk => le_iSup₂_of_le k hk (d.piece_le k)) hz + have hz0 : z ∈ boostWeightSubmodule rep i 0 := by + rw [show z = x - y from by rw [← hyz]; abel] + exact sub_mem hx0 (d.piece_le 0 hy) + have hz' : z = 0 := + Submodule.disjoint_def.1 (iSupIndep_def.1 (boostWeightSubmodule_iSupIndep rep) 0) z hz0 hz1 + rw [← hyz, hz', add_zero] + exact hy + +/-- **If zero is not among the weights, an invariant element of the covered submodule + vanishes.** -/ +lemma WeightDecompositionLE.eq_zero_of_mem_of_zero_notMem_supp + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V : Submodule K A} + (d : WeightDecompositionLE rep i V) {x : A} (h0 : (0 : ℤ) ∉ d.supp) + (hxV : x ∈ V) (hx0 : x ∈ boostWeightSubmodule rep i 0) : x = 0 := by + have hx := d.mem_piece_zero_of_mem hxV hx0 + rwa [d.piece_eq_bot 0 h0, Submodule.mem_bot] at hx + + +/-! + ## D. Invariance under the Lorentz group Given the invariance under the the gauge group, we now give the invariance under the Lorentz group. +The Lorentz invariant argument is the following. +For a vector space `V` with a representation of the Lorentz group. +we decompose `V` into eigenvectors of the Lorentz boost along the `x`-axis. +`V = V₀ ⊕ V₁ ⊕ V₋₁ ⊕ V₂ ⊕ V₋₂ ⊕ ...`. +We then take a minimal extension `W` of `V₀` such that `V₀ ≤ W ≤ V` and that we can +decompose `W` based on the eigenvalues of the Lorentz boost along the `y`-axis: +`W = W₀ ⊕ W₁ ⊕ W₋₁ ⊕ W₂ ⊕ W₋₂ ⊕ ...`. +We now do the same with `W₀` finding a minimal extension `K` of `W₀` such that `W₀ ≤ K ≤ W` +and that we can decompose `K` based on the eigenvalues of the Lorentz boost along the `z`-axis: +`K = K₀ ⊕ K₁ ⊕ K₋₁ ⊕ K₂ ⊕ K₋₂ ⊕ ...`. +An element of `V` which is Lorentz invariant must be in `K₀`. +This is usually an if and only if statement. -/ /-! @@ -2710,8 +2789,6 @@ lemma iSup_range_dotSymbol_eq : · exact iSup_congr fun d => h.range_dotSymbol_right d - - /-- **The boost-weight decomposition of the gauge-invariant terms of mass weight six.** The two families — one derivative on the Higgs, one on its conjugate — are each a two-factor derivative collection over `ℂ`, so each carries a decomposition; the join of @@ -2722,6 +2799,8 @@ noncomputable def boostWeightZeroSix (i : Fin 3) : (trivialWeightDecomposition i)).sup (h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![0, 1] i (trivialWeightDecomposition i))).copy h.iSup_range_dotSymbol_eq + + /-! ### D.4. The zero parts of the boost weights @@ -2745,64 +2824,6 @@ lemma boostWeightZeroSix_piece_zero_eq (i : Fin 3) : (trivialWeightDecomposition i) (by simp) (fun b hb => by simp [hb])] exact congrArg₂ (· ⊔ ·) h1 h2 -structure WeightDecompositionLE {K : Type u_1} [Field K] [Algebra ℝ K] {M : Type u_2} - [AddCommGroup M] [Module K M] (rep : Representation K SL(2, ℂ) M) (i : Fin 3) - (V : Submodule K M) where - /-- The weight-`k` piece of the decomposition. -/ - piece : ℤ → Submodule K M - /-- The finite set of weights that occur. -/ - supp : Finset ℤ - piece_le : ∀ k, piece k ≤ boostWeightSubmodule rep i k - piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ - iSup_piece : V ≤ (⨆ k, piece k) - -/-- A weight decomposition of `V` covers every submodule of `V`. -/ -noncomputable def _root_.Lorentz.BoostWeight.WeightDecomposition.toLE - {K : Type*} [Field K] [Algebra ℝ K] {M : Type*} [AddCommGroup M] [Module K M] - {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V V' : Submodule K M} - (d : WeightDecomposition rep i V) (hV' : V' ≤ V) : - WeightDecompositionLE rep i V' where - piece := d.piece - supp := d.supp - piece_le := d.piece_le - piece_eq_bot := d.piece_eq_bot - iSup_piece := hV'.trans d.iSup_piece.ge - -/-- **A weight-zero element of a covered submodule lies in the weight-zero piece**: the - boost-weight spaces are independent, so the pieces of nonzero weight cannot contribute - to it. -/ -lemma WeightDecompositionLE.mem_piece_zero_of_mem - {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] - {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V : Submodule K A} - (d : WeightDecompositionLE rep i V) {x : A} - (hxV : x ∈ V) (hx0 : x ∈ boostWeightSubmodule rep i 0) : x ∈ d.piece 0 := by - have hcov : x ∈ d.piece 0 ⊔ ⨆ k, ⨆ (_ : k ≠ (0 : ℤ)), d.piece k := by - refine (d.iSup_piece.trans (iSup_le fun k => ?_)) hxV - by_cases hk : k = 0 - · subst hk - exact le_sup_left - · exact le_sup_of_le_right (le_iSup₂_of_le k hk le_rfl) - obtain ⟨y, hy, z, hz, hyz⟩ := Submodule.mem_sup.1 hcov - have hz1 : z ∈ ⨆ k, ⨆ (_ : k ≠ (0 : ℤ)), boostWeightSubmodule rep i k := - (iSup₂_le fun k hk => le_iSup₂_of_le k hk (d.piece_le k)) hz - have hz0 : z ∈ boostWeightSubmodule rep i 0 := by - rw [show z = x - y from by rw [← hyz]; abel] - exact sub_mem hx0 (d.piece_le 0 hy) - have hz' : z = 0 := - Submodule.disjoint_def.1 (iSupIndep_def.1 (boostWeightSubmodule_iSupIndep rep) 0) z hz0 hz1 - rw [← hyz, hz', add_zero] - exact hy - -/-- **If zero is not among the weights, an invariant element of the covered submodule - vanishes.** -/ -lemma WeightDecompositionLE.eq_zero_of_mem_of_zero_notMem_supp - {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] - {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V : Submodule K A} - (d : WeightDecompositionLE rep i V) {x : A} (h0 : (0 : ℤ) ∉ d.supp) - (hxV : x ∈ V) (hx0 : x ∈ boostWeightSubmodule rep i 0) : x = 0 := by - have hx := d.mem_piece_zero_of_mem hxV hx0 - rwa [d.piece_eq_bot 0 h0, Submodule.mem_bot] at hx - open IsDerivativeCollection in /-- **The minimal `y`-boost covering of the `x`-weight-zero part** of the dimension-six terms. The `z`-derivative terms have `y`-weight zero; the `y`-derivative terms are not From 257c79c27b6cf80171ed398358a4e853a462f53d Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:28:47 +0100 Subject: [PATCH 196/254] feat: Add dim-8 invariants --- .../HiggsBoson/AlgebraValued/Basic.lean | 2114 ++++++++++++++++- 1 file changed, 2112 insertions(+), 2 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index e6e95f83b..3df098519 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -52,6 +52,26 @@ mass-dimension 4 are given by: `H^† D_μ D_μ H`,`H D_μ D_μ H^†`, `D_μ H D_μ H^†`, `H H^†` and `(H^† H)^2`. + +So let +`x := a0 TT + a1 XX + a2 YY + a3 ZZ`. + +Write `M := TT - XX - YY - ZZ` for the target, and abbreviate the three coefficients +appearing in the conditions by +`u := a0 + a1`, `v := a0 + a2`, `w := a0 + a3`. +Expanding `M` gives the identity +`x = a0 M + u XX + v YY + w ZZ`. + +Rotational average gives +`x = a0 M + (u + v + w)/3 (XX + YY + ZZ)`. + +while the three boost conditions read `u (TT + XX) = 0`, `v (TT + YY) = 0` and +`w (TT + ZZ) = 0`, that is `u XX = - u TT`, `v YY = - v TT` and `w ZZ = - w TT`. +Substituting these in, +`x = a0 M - (u + v + w) TT`. + +So we must have that `(u+v+w) TT = (u+v+w) M / 4`, and hence +`x = ( a0 - (u + v + w) / 4 ) M`. -/ @[expose] public section @@ -871,6 +891,26 @@ noncomputable def lightConeCoeffInv (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin else if μ = Sum.inr (i + 1) then (if κ = 2 then 1 else 0) else (if κ = 3 then 1 else 0) +/-- The inverse coefficient toward the first transverse direction vanishes off it. -/ +lemma lightConeCoeffInv_two_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} + (hμ : μ ≠ Sum.inr (i + 1)) : lightConeCoeffInv i μ 2 = 0 := by + simp [lightConeCoeffInv, hμ] + +/-- The inverse coefficient toward the second transverse direction vanishes off it. -/ +lemma lightConeCoeffInv_three_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} + (hμ : μ ≠ Sum.inr (i + 2)) : lightConeCoeffInv i μ 3 = 0 := by + rcases μ with a | m + · rw [Subsingleton.elim a 0] + simp [lightConeCoeffInv] + · fin_cases i <;> fin_cases m <;> simp_all [lightConeCoeffInv] + +/-- The inverse coefficient of the first transverse direction is supported on its own + light-cone index. -/ +lemma lightConeCoeffInv_transverse_one_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} {κ : Fin 4} + (hμ : μ = Sum.inr (i + 1)) (hκ : κ ≠ 2) : lightConeCoeffInv i μ κ = 0 := by + subst hμ + fin_cases i <;> fin_cases κ <;> simp_all [lightConeCoeffInv] + /-- The light-cone basis is a basis: the two coefficient matrices are inverse. -/ lemma sum_lightConeCoeffInv_mul (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ∑ κ : Fin 4, lightConeCoeffInv i μ κ * lightConeCoeff i κ ν = if μ = ν then 1 else 0 := by @@ -969,6 +1009,247 @@ lemma lightConeDeriv_three (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) fin_cases i <;> simp [lightConeCoeff] +/-- **A two-slot light-cone symbol**, written out as a double sum over coordinate + symbols. -/ +lemma lightConeDeriv_pair (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) + (κ₀ κ₁ : Fin 4) : + lightConeDeriv F i ![κ₀, κ₁] = ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, + (lightConeCoeff i κ₀ μ * lightConeCoeff i κ₁ ν) • F ![μ, ν] := + calc lightConeDeriv F i ![κ₀, κ₁] + = ∑ p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + (lightConeCoeff i κ₀ p.1 * lightConeCoeff i κ₁ p.2) • F ![p.1, p.2] := by + rw [lightConeDeriv] + refine Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 1 ⊕ Fin 3) _ _ fun d => ?_ + have hd : ![d 0, d 1] = d := by + funext j + fin_cases j <;> rfl + rw [Fin.prod_univ_two] + simp only [piFinTwoEquiv_apply, Matrix.cons_val_zero, Matrix.cons_val_one, hd] + _ = _ := Fintype.sum_prod_type _ + +/-- The `(D₀ - Dᵢ)(D₀ + Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_zero_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0, 1] = F ![Sum.inl 0, Sum.inl 0] + F ![Sum.inl 0, Sum.inr i] + - F ![Sum.inr i, Sum.inl 0] - F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul] + module + +/-- The `(D₀ + Dᵢ)(D₀ - Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_one_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1, 0] = F ![Sum.inl 0, Sum.inl 0] - F ![Sum.inl 0, Sum.inr i] + + F ![Sum.inr i, Sum.inl 0] - F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul, neg_ite] + module + +/-- Both slots on the first transverse direction. -/ +lemma lightConeDeriv_pair_two_two (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![2, 2] = F ![Sum.inr (i + 1), Sum.inr (i + 1)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- The first then second transverse directions. -/ +lemma lightConeDeriv_pair_two_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![2, 3] = F ![Sum.inr (i + 1), Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- The second then first transverse directions. -/ +lemma lightConeDeriv_pair_three_two (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 2] = F ![Sum.inr (i + 2), Sum.inr (i + 1)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- Both slots on the second transverse direction. -/ +lemma lightConeDeriv_pair_three_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 3] = F ![Sum.inr (i + 2), Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- The `(D₀ - Dᵢ)(D₀ - Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_zero_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0, 0] = F ![Sum.inl 0, Sum.inl 0] - F ![Sum.inl 0, Sum.inr i] + - F ![Sum.inr i, Sum.inl 0] + F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul, neg_ite] + module + +/-- The `(D₀ + Dᵢ)(D₀ + Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_one_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1, 1] = F ![Sum.inl 0, Sum.inl 0] + F ![Sum.inl 0, Sum.inr i] + + F ![Sum.inr i, Sum.inl 0] + F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul] + module + +/-- The `(D₀ - Dᵢ)` then second transverse slot pair. -/ +lemma lightConeDeriv_pair_zero_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0, 3] = F ![Sum.inl 0, Sum.inr (i + 2)] + - F ![Sum.inr i, Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_ite_eq', ite_smul] + module + +/-- The second transverse then `(D₀ - Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_three_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 0] = F ![Sum.inr (i + 2), Sum.inl 0] + - F ![Sum.inr (i + 2), Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul, neg_ite] + module + +/-- The `(D₀ + Dᵢ)` then second transverse slot pair. -/ +lemma lightConeDeriv_pair_one_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1, 3] = F ![Sum.inl 0, Sum.inr (i + 2)] + + F ![Sum.inr i, Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_ite_eq', ite_smul] + +/-- The second transverse then `(D₀ + Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_three_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 1] = F ![Sum.inr (i + 2), Sum.inl 0] + + F ![Sum.inr (i + 2), Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul] + +/-- **The two-slot light-cone indices of weight zero**: the two mixed null pairs and the + four transverse pairs. -/ +lemma iSup_range_lightConeDeriv_pair_weight_zero + (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ)), + LinearMap.range (lightConeDeriv F i c)) + = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ + LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ + (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![2, 3]))) ⊔ + (LinearMap.range (lightConeDeriv F i ![3, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![3, 3])) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) + (sup_le (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) (sup_le ?_ ?_)) + · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := + ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ + rw [Fin.sum_univ_two] at hc + fin_cases κ₀ + · fin_cases κ₁ + · exact absurd hc (by decide) + · exact le_sup_of_le_left (le_sup_of_le_left le_sup_left) + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · fin_cases κ₁ + · exact le_sup_of_le_left (le_sup_of_le_left le_sup_right) + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · fin_cases κ₁ + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_left) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_right) + · fin_cases κ₁ + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · exact le_sup_of_le_right le_sup_left + · exact le_sup_of_le_right le_sup_right + · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl + · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 3] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl + +/-- **The weight-zero light-cone pairs avoiding the mixed transverse indices**: the two + null pairs and the two repeated transverse pairs. -/ +lemma iSup_range_lightConeDeriv_pair_weight_zero_notMixed + (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ) ∧ + ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), + LinearMap.range (lightConeDeriv F i c)) + = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ + LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ + (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![3, 3]))) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) + (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) + · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := + ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ + obtain ⟨hw, h23, h32⟩ := hc + rw [Fin.sum_univ_two] at hw + fin_cases κ₀ + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact le_sup_of_le_left le_sup_left + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact le_sup_of_le_left le_sup_right + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact le_sup_of_le_right le_sup_left + · exact absurd (by decide) h23 + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd (by decide) h32 + · exact le_sup_of_le_right le_sup_right + · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl + · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl + +/-- **The weight-zero light-cone pairs whose slots hit the first transverse direction + together or not at all**: the two null pairs and the two repeated transverse pairs. -/ +lemma iSup_range_lightConeDeriv_pair_weight_zero_sync + (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ) ∧ + ((c 0 = 2) ↔ (c 1 = 2))), + LinearMap.range (lightConeDeriv F i c)) + = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ + LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ + (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![3, 3]))) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) + (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) + · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := + ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ + obtain ⟨hw, hsync⟩ := hc + rw [Fin.sum_univ_two] at hw + fin_cases κ₀ + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact le_sup_of_le_left le_sup_left + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact le_sup_of_le_left le_sup_right + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact le_sup_of_le_right le_sup_left + · exact absurd hsync (by decide) + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd hsync (by decide) + · exact le_sup_of_le_right le_sup_right + · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl + · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl + /-- **The one-slot light-cone symbols of weight zero** are the two transverse directions: the join of the weight-zero ranges on a single slot is the join of the ranges of the two transverse symbols. -/ @@ -1058,6 +1339,39 @@ lemma lightConeDeriv_mem {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ rw [key, hwm t ht, map_smul, smul_smul, show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, ← zpow_add₀ htc] +/-- The range of a light-cone symbol over a Lorentz-scalar argument lies in the + boost-weight space of its total slot weight. -/ +lemma range_lightConeDeriv_le {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) + (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) + (i : Fin 3) (c : Fin n → Fin 4) : + LinearMap.range (lightConeDeriv F i c) ≤ + boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + rintro x ⟨w, rfl⟩ + simpa using lightConeDeriv_mem F hF i c (b := 0) (w := w) + (mem_boostWeightSubmodule.2 fun t ht => by simp) + +/-- The range of a light-cone symbol lies in the join of the coordinate ranges. -/ +lemma range_lightConeDeriv_le_iSup_range {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (i : Fin 3) (c : Fin n → Fin 4) : + LinearMap.range (lightConeDeriv F i c) ≤ ⨆ d, LinearMap.range (F d) := by + rintro x ⟨w, rfl⟩ + rw [lightConeDeriv] + simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (LinearMap.mem_range_self _ w)) + +/-- **The value of a two-slot light-cone symbol at `1`**, for a family over `ℂ`. -/ +noncomputable def lightConeDot (F : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) (i : Fin 3) + (c : Fin 2 → Fin 4) : B := + lightConeDeriv F i c (1 : ℂ) + +/-- A light-cone symbol value is a boost eigenvector of its total slot weight. -/ +lemma lightConeDot_mem (F : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) + (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) (i : Fin 3) + (c : Fin 2 → Fin 4) {k : ℤ} (hk : (∑ j, lightConeWeight (c j)) = k) : + lightConeDot F i c ∈ boostWeightSubmodule repLorentz i k := + hk ▸ range_lightConeDeriv_le (n := 2) F hF i c ⟨1, rfl⟩ + /-- **The boost-weight decomposition of the symbols carrying `n` derivatives.** The multi-index is read in the light-cone basis: a slot of type `c j` contributes `lightConeWeight (c j)` — `+2` for `D₀ - Dᵢ`, `-2` for `D₀ + Dᵢ`, `0` for the two @@ -2720,6 +3034,33 @@ lemma WeightDecompositionLE.eq_zero_of_mem_of_zero_notMem_supp have hx := d.mem_piece_zero_of_mem hxV hx0 rwa [d.piece_eq_bot 0 h0, Submodule.mem_bot] at hx +/-- **Uniqueness of boost-weight components**: if a weight-zero element is written as a sum + of two homogeneous pieces of distinct nonzero weights and a weight-zero remainder, the + homogeneous pieces vanish. -/ +lemma eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {a b : ℤ} {P N R : A} + (hP : P ∈ boostWeightSubmodule rep i a) (hN : N ∈ boostWeightSubmodule rep i b) + (hR : R ∈ boostWeightSubmodule rep i 0) + (hx : P + N + R ∈ boostWeightSubmodule rep i 0) + (ha : a ≠ 0) (hb : b ≠ 0) (hab : a ≠ b) : P = 0 ∧ N = 0 := by + have hPN : P + N ∈ boostWeightSubmodule rep i 0 := by + have h1 := sub_mem hx hR + rwa [add_sub_cancel_right] at h1 + have hP0 : P = 0 := by + refine Submodule.disjoint_def.1 + (iSupIndep_def.1 (boostWeightSubmodule_iSupIndep rep) a) P hP ?_ + have h2 : P = (P + N) - N := by abel + rw [h2] + exact sub_mem + (Submodule.mem_iSup_of_mem 0 (Submodule.mem_iSup_of_mem (Ne.symm ha) hPN)) + (Submodule.mem_iSup_of_mem b (Submodule.mem_iSup_of_mem (fun hba => hab hba.symm) hN)) + refine ⟨hP0, ?_⟩ + rw [hP0, zero_add] at hPN + exact Submodule.disjoint_def.1 + (iSupIndep_def.1 (boostWeightSubmodule_iSupIndep rep) b) N hN + (Submodule.mem_iSup_of_mem 0 (Submodule.mem_iSup_of_mem (Ne.symm hb) hPN)) + /-! @@ -2778,6 +3119,103 @@ lemma range_dotSymbol_right (d : Fin 1 → Fin 1 ⊕ Fin 3) : (h.dotSymbol ![0, 1] d).range = ℂ ∙ h.dotGaugeHiggs ![] d := by rw [h.dotSymbol_right d, ← LinearMap.span_singleton_eq_range] +/-- With both derivatives on the Higgs. -/ +lemma dotSymbol_left_two (d : Fin 2 → Fin 1 ⊕ Fin 3) : + h.dotSymbol ![2, 0] d = LinearMap.toSpanSingleton ℂ B (h.dotGaugeHiggs d ![]) := by + rw [dotSymbol] + congr 1 + congr 1 + exact funext fun j => j.elim0 + +/-- With both derivatives on the conjugate Higgs. -/ +lemma dotSymbol_right_two (d : Fin 2 → Fin 1 ⊕ Fin 3) : + h.dotSymbol ![0, 2] d = LinearMap.toSpanSingleton ℂ B (h.dotGaugeHiggs ![] d) := by + rw [dotSymbol] + congr 1 + congr 1 + all_goals first + | exact funext fun j => j.elim0 + | (funext j; congr 1; exact Fin.ext (by simp)) + +/-- With one derivative on each factor. -/ +lemma dotSymbol_one_one (d : Fin 2 → Fin 1 ⊕ Fin 3) : + h.dotSymbol ![1, 1] d = LinearMap.toSpanSingleton ℂ B (h.dotGaugeHiggs ![d 0] ![d 1]) := by + rw [dotSymbol] + congr 1 + congr 1 + all_goals funext j + all_goals fin_cases j + all_goals rfl + +@[simp] +lemma range_dotSymbol_left_two (d : Fin 2 → Fin 1 ⊕ Fin 3) : + (h.dotSymbol ![2, 0] d).range = ℂ ∙ h.dotGaugeHiggs d ![] := by + rw [h.dotSymbol_left_two d, ← LinearMap.span_singleton_eq_range] + +@[simp] +lemma range_dotSymbol_right_two (d : Fin 2 → Fin 1 ⊕ Fin 3) : + (h.dotSymbol ![0, 2] d).range = ℂ ∙ h.dotGaugeHiggs ![] d := by + rw [h.dotSymbol_right_two d, ← LinearMap.span_singleton_eq_range] + +@[simp] +lemma range_dotSymbol_one_one (d : Fin 2 → Fin 1 ⊕ Fin 3) : + (h.dotSymbol ![1, 1] d).range = ℂ ∙ h.dotGaugeHiggs ![d 0] ![d 1] := by + rw [h.dotSymbol_one_one d, ← LinearMap.span_singleton_eq_range] + +/-- The underived inner product is a Lorentz scalar. -/ +lemma repLorentz_dotGaugeHiggs_nil (g : SL(2,ℂ)) : + repLorentz g (h.dotGaugeHiggs ![] ![]) = h.dotGaugeHiggs ![] ![] := by + have hq : ∀ (a b : Fin 0 → Fin 1 ⊕ Fin 3), h.dotGaugeHiggs a b = h.dotGaugeHiggs ![] ![] := + fun a b => by rw [Subsingleton.elim a ![], Subsingleton.elim b ![]] + rw [h.repLorentz_dotGaugeHiggs] + simp only [Finset.univ_unique, Finset.sum_singleton, Finset.univ_eq_empty, + Finset.prod_empty, one_mul, one_smul, hq] + +/-- **The square of the inner product as a zero-index symbol map** over `ℂ`: the quartic + term of mass weight eight carries no Lorentz index. -/ +noncomputable def quarticSymbol (_ : Fin 0 → Fin 1 ⊕ Fin 3) : ℂ →ₗ[ℂ] B := + LinearMap.toSpanSingleton ℂ B (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) + +/-- The quartic symbol rotates trivially: it has no derivative indices and is a Lorentz + scalar. -/ +lemma rotatesIndices_quarticSymbol : + IsDerivativeCollection.RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz + h.quarticSymbol := fun g d w => by + simp only [quarticSymbol, LinearMap.toSpanSingleton_apply, map_smul, Finset.univ_unique, + Finset.sum_singleton, Finset.univ_eq_empty, Finset.prod_empty, one_smul, + MonoidHom.one_apply, Module.End.one_apply] + rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] + +@[simp] +lemma range_quarticSymbol (d : Fin 0 → Fin 1 ⊕ Fin 3) : + (h.quarticSymbol d).range + = ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + rw [quarticSymbol, ← LinearMap.span_singleton_eq_range] + +/-- The range of a `+ + - -` combination of scalings is the span of the combination. -/ +lemma range_toSpanSingleton_add_sub_sub (x y z w : B) : + LinearMap.range (LinearMap.toSpanSingleton ℂ B x + LinearMap.toSpanSingleton ℂ B y + - LinearMap.toSpanSingleton ℂ B z - LinearMap.toSpanSingleton ℂ B w) + = ℂ ∙ (x + y - z - w) := by + rw [show LinearMap.toSpanSingleton ℂ B x + LinearMap.toSpanSingleton ℂ B y + - LinearMap.toSpanSingleton ℂ B z - LinearMap.toSpanSingleton ℂ B w + = LinearMap.toSpanSingleton ℂ B (x + y - z - w) from by + ext + simp [smul_add, smul_sub]] + rw [← LinearMap.span_singleton_eq_range] + +/-- The range of a `+ - + -` combination of scalings is the span of the combination. -/ +lemma range_toSpanSingleton_sub_add_sub (x y z w : B) : + LinearMap.range (LinearMap.toSpanSingleton ℂ B x - LinearMap.toSpanSingleton ℂ B y + + LinearMap.toSpanSingleton ℂ B z - LinearMap.toSpanSingleton ℂ B w) + = ℂ ∙ (x - y + z - w) := by + rw [show LinearMap.toSpanSingleton ℂ B x - LinearMap.toSpanSingleton ℂ B y + + LinearMap.toSpanSingleton ℂ B z - LinearMap.toSpanSingleton ℂ B w + = LinearMap.toSpanSingleton ℂ B (x - y + z - w) from by + ext + simp [smul_add, smul_sub]] + rw [← LinearMap.span_singleton_eq_range] + /-- The span of the two-factor symbols is the gauge-invariant submodule of mass weight six: one derivative on the Higgs or one on its conjugate. -/ lemma iSup_range_dotSymbol_eq : @@ -2800,10 +3238,51 @@ noncomputable def boostWeightZeroSix (i : Fin 3) : (h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![0, 1] i (trivialWeightDecomposition i))).copy h.iSup_range_dotSymbol_eq +/-- The span of the two-derivative symbols, together with the square of the underived + inner product, is the gauge-invariant submodule of mass weight eight. -/ +lemma iSup_range_dotSymbol_eight_eq : + ((((⨆ d : Fin 2 → Fin 1 ⊕ Fin 3, (h.dotSymbol ![2, 0] d).range) ⊔ + ⨆ d : Fin 2 → Fin 1 ⊕ Fin 3, (h.dotSymbol ![0, 2] d).range) ⊔ + ⨆ d : Fin 2 → Fin 1 ⊕ Fin 3, (h.dotSymbol ![1, 1] d).range) ⊔ + ⨆ d : Fin 0 → Fin 1 ⊕ Fin 3, (h.quarticSymbol d).range) + = h.gaugeInvariantOfMassDim 8 := by + rw [h.gaugeInvariantOfMassDim_eight_eq] + congr 1 + · congr 1 + · congr 1 + · exact iSup_congr fun d => h.range_dotSymbol_left_two d + · exact iSup_congr fun d => h.range_dotSymbol_right_two d + · refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d1 => iSup_le fun d2 => ?_) + · rw [h.range_dotSymbol_one_one d] + exact le_iSup_of_le ![d 0] (le_iSup_of_le ![d 1] le_rfl) + · refine le_iSup_of_le ![d1 0, d2 0] (le_of_eq ?_) + rw [h.range_dotSymbol_one_one] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [show ![d1 0] = d1 from funext fun j => by fin_cases j; rfl, + show ![d2 0] = d2 from funext fun j => by fin_cases j; rfl] + · refine le_antisymm (iSup_le fun d => le_of_eq (h.range_quarticSymbol d)) ?_ + exact le_iSup_of_le ![] (le_of_eq (h.range_quarticSymbol ![]).symm) + +/-- **The boost-weight decomposition of the gauge-invariant terms of mass weight eight.** + The three two-derivative families are two-factor derivative collections over `ℂ`, so + each carries a decomposition; the square of the inner product is a Lorentz scalar, + carrying its trivial decomposition; the join of the four is the decomposition of their + join. -/ +noncomputable def boostWeightZeroEight (i : Fin 3) : + WeightDecomposition repLorentz i (h.gaugeInvariantOfMassDim 8) := + ((((h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![2, 0] i + (trivialWeightDecomposition i)).sup + (h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![0, 2] i + (trivialWeightDecomposition i))).sup + (h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![1, 1] i + (trivialWeightDecomposition i))).sup + (IsDerivativeCollection.boostDecompZero h.quarticSymbol h.rotatesIndices_quarticSymbol i + (trivialWeightDecomposition i))).copy h.iSup_range_dotSymbol_eight_eq + /-! -### D.4. The zero parts of the boost weights +### D.4. The zero parts of the boost weights in the x-direction -/ @@ -2824,6 +3303,86 @@ lemma boostWeightZeroSix_piece_zero_eq (i : Fin 3) : (trivialWeightDecomposition i) (by simp) (fun b hb => by simp [hb])] exact congrArg₂ (· ⊔ ·) h1 h2 +/-- **The weight-zero piece of the mass-weight-eight decomposition.** Per two-derivative + family: the two null combinations `(D₀ ∓ Dᵢ)(D₀ ± Dᵢ)` and the four transverse pairs; + and the square of the underived inner product. -/ +lemma boostWeightZeroEight_piece_zero_eq (i : Fin 3) : + (h.boostWeightZeroEight i).piece 0 = + (((ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + + h.dotGaugeHiggs ![Sum.inl 0, Sum.inr i] ![] + - h.dotGaugeHiggs ![Sum.inr i, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inr i, Sum.inr i] ![]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inl 0, Sum.inr i] ![] + + h.dotGaugeHiggs ![Sum.inr i, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inr i, Sum.inr i] ![])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 1), Sum.inr (i + 1)] ![] ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 1), Sum.inr (i + 2)] ![])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2), Sum.inr (i + 1)] ![] ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2), Sum.inr (i + 2)] ![])) ⊔ + (((ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + + h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr i] + - h.dotGaugeHiggs ![] ![Sum.inr i, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inr i, Sum.inr i]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr i] + + h.dotGaugeHiggs ![] ![Sum.inr i, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inr i, Sum.inr i])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i + 1), Sum.inr (i + 1)] ⊔ + ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i + 1), Sum.inr (i + 2)])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i + 2), Sum.inr (i + 1)] ⊔ + ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i + 2), Sum.inr (i + 2)])) ⊔ + (((ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + + h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr i] + - h.dotGaugeHiggs ![Sum.inr i] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inr i] ![Sum.inr i]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr i] + + h.dotGaugeHiggs ![Sum.inr i] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inr i] ![Sum.inr i])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 1)] ![Sum.inr (i + 1)] ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 1)] ![Sum.inr (i + 2)])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2)] ![Sum.inr (i + 1)] ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2)] ![Sum.inr (i + 2)])) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + have h1 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero + (h.dotSymbol ![2, 0]) i + have h2 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero + (h.dotSymbol ![0, 2]) i + have h3 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero + (h.dotSymbol ![1, 1]) i + simp only [IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_two_three, + IsDerivativeCollection.lightConeDeriv_pair_three_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + range_toSpanSingleton_add_sub_sub, range_toSpanSingleton_sub_add_sub, + ← LinearMap.span_singleton_eq_range] at h1 h2 h3 + have hq : (IsDerivativeCollection.boostDecompZero h.quarticSymbol + h.rotatesIndices_quarticSymbol i (trivialWeightDecomposition i)).piece 0 + = ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + dsimp only [IsDerivativeCollection.boostDecompZero, trivialWeightDecomposition_piece] + rw [if_pos rfl, Submodule.map_top, h.range_quarticSymbol] + dsimp only [boostWeightZeroEight, WeightDecomposition.copy_piece, + WeightDecomposition.sup_piece] + rw [h.isDerivativeCollection_dotSymbol.boostDecompOfNum_piece_of_weight_zero ![2, 0] i + (trivialWeightDecomposition i) (by simp) (fun b hb => by simp [hb]), + h.isDerivativeCollection_dotSymbol.boostDecompOfNum_piece_of_weight_zero ![0, 2] i + (trivialWeightDecomposition i) (by simp) (fun b hb => by simp [hb]), + h.isDerivativeCollection_dotSymbol.boostDecompOfNum_piece_of_weight_zero ![1, 1] i + (trivialWeightDecomposition i) (by simp) (fun b hb => by simp [hb]), hq] + exact congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) h1 h2) h3) rfl + +/-! + +### D.4. The decomposition along the x and y directions + +-/ + + open IsDerivativeCollection in /-- **The minimal `y`-boost covering of the `x`-weight-zero part** of the dimension-six terms. The `z`-derivative terms have `y`-weight zero; the `y`-derivative terms are not @@ -2935,6 +3494,334 @@ lemma dimSixWeightDecompositionLE_piece_zero_eq : (ℂ ∙ h.dotGaugeHiggs ![Sum.inr 2] ![] ⊔ ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 2]) := by simp [dimSixWeightDecompositionLE] + +/-- **The minimal `y`-boost pieces over the `x`-weight-zero part of the dimension-eight + terms**: per two-derivative family, the ranges of the axis-`1` light-cone symbols over + every index pair except the two mixed transverse ones — no generator of the + `x`-weight-zero part meets a mixed `z`–`x` monomial — together with the square of the + inner product at weight zero. -/ +noncomputable def dimEightPieceOne (k : ℤ) : Submodule ℂ B := + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k ∧ + ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), + LinearMap.range (IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c)) ⊔ + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k ∧ + ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), + LinearMap.range (IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c)) ⊔ + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k ∧ + ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), + LinearMap.range (IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c)) ⊔ + (if k = 0 then ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) else ⊥) + +/-- Each piece is a boost eigenspace slice of its weight. -/ +lemma dimEightPieceOne_le (k : ℤ) : + h.dimEightPieceOne k ≤ boostWeightSubmodule repLorentz 1 k := by + rw [dimEightPieceOne] + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · exact iSup₂_le fun c hc => hc.1 ▸ IsDerivativeCollection.range_lightConeDeriv_le (n := 2) + (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 c + · exact iSup₂_le fun c hc => hc.1 ▸ IsDerivativeCollection.range_lightConeDeriv_le (n := 2) + (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 c + · exact iSup₂_le fun c hc => hc.1 ▸ IsDerivativeCollection.range_lightConeDeriv_le (n := 2) + (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 c + · split_ifs with hk + · subst hk + rw [Submodule.span_singleton_le_iff_mem] + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] + simp + · exact bot_le + +/-- The pieces vanish outside the weights `{-4, -2, 0, 2, 4}`. -/ +lemma dimEightPieceOne_eq_bot (k : ℤ) (hk : k ∉ ({-4, -2, 0, 2, 4} : Finset ℤ)) : + h.dimEightPieceOne k = ⊥ := by + have hall : ∀ c : Fin 2 → Fin 4, + (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ∈ ({-4, -2, 0, 2, 4} : Finset ℤ) := by + decide + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hk + rw [dimEightPieceOne] + refine le_bot_iff.1 (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) + · exact iSup₂_le fun c hc => absurd (hc.1 ▸ hall c) (by + simp [Finset.mem_insert, Finset.mem_singleton, hk.1, hk.2.1, hk.2.2.1, hk.2.2.2.1, + hk.2.2.2.2]) + · exact iSup₂_le fun c hc => absurd (hc.1 ▸ hall c) (by + simp [Finset.mem_insert, Finset.mem_singleton, hk.1, hk.2.1, hk.2.2.1, hk.2.2.2.1, + hk.2.2.2.2]) + · exact iSup₂_le fun c hc => absurd (hc.1 ▸ hall c) (by + simp [Finset.mem_insert, Finset.mem_singleton, hk.1, hk.2.1, hk.2.2.1, hk.2.2.2.1, + hk.2.2.2.2]) + · rw [if_neg hk.2.2.1] + +/-- **A two-derivative Higgs monomial avoiding the mixed transverse pair lies in the join + of the minimal pieces**: the disallowed light-cone indices carry vanishing coefficient + in its light-cone expansion. -/ +lemma mem_iSup_dimEightPieceOne_left (d : Fin 2 → Fin 1 ⊕ Fin 3) + (h1 : ¬(d 0 = Sum.inr 2 ∧ d 1 = Sum.inr 0)) (h2 : ¬(d 0 = Sum.inr 0 ∧ d 1 = Sum.inr 2)) : + h.dotGaugeHiggs d ![] ∈ ⨆ k, h.dimEightPieceOne k := by + have he : h.dotGaugeHiggs d ![] = ∑ c : Fin 2 → Fin 4, + (∏ j, IsDerivativeCollection.lightConeCoeffInv 1 (d j) (c j)) • + IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c 1 := + calc h.dotGaugeHiggs d ![] = h.dotSymbol ![2, 0] d 1 := by + rw [h.dotSymbol_left_two, LinearMap.toSpanSingleton_apply, one_smul] + _ = _ := by + rw [IsDerivativeCollection.eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 d] + simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] + rw [he] + refine sum_mem fun c _ => ?_ + by_cases hc : ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2) + · refine Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem + (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ?_) + rw [dimEightPieceOne] + refine Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left ?_)) + exact Submodule.mem_iSup_of_mem c (Submodule.mem_iSup_of_mem ⟨rfl, hc⟩ + (LinearMap.mem_range_self _ 1)) + · rw [not_and_or, not_not, not_not] at hc + rcases hc with ⟨h20, h13⟩ | ⟨h30, h12⟩ + · rcases not_and_or.1 h1 with hd | hd + · rw [Fin.prod_univ_two, h20, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] + exact Submodule.zero_mem _ + · rw [Fin.prod_univ_two, h13, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] + exact Submodule.zero_mem _ + · rcases not_and_or.1 h2 with hd | hd + · rw [Fin.prod_univ_two, h30, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] + exact Submodule.zero_mem _ + · rw [Fin.prod_univ_two, h12, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] + exact Submodule.zero_mem _ + +/-- As `mem_iSup_dimEightPieceOne_left`, for the conjugate-Higgs family. -/ +lemma mem_iSup_dimEightPieceOne_right (d : Fin 2 → Fin 1 ⊕ Fin 3) + (h1 : ¬(d 0 = Sum.inr 2 ∧ d 1 = Sum.inr 0)) (h2 : ¬(d 0 = Sum.inr 0 ∧ d 1 = Sum.inr 2)) : + h.dotGaugeHiggs ![] d ∈ ⨆ k, h.dimEightPieceOne k := by + have he : h.dotGaugeHiggs ![] d = ∑ c : Fin 2 → Fin 4, + (∏ j, IsDerivativeCollection.lightConeCoeffInv 1 (d j) (c j)) • + IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c 1 := + calc h.dotGaugeHiggs ![] d = h.dotSymbol ![0, 2] d 1 := by + rw [h.dotSymbol_right_two, LinearMap.toSpanSingleton_apply, one_smul] + _ = _ := by + rw [IsDerivativeCollection.eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 d] + simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] + rw [he] + refine sum_mem fun c _ => ?_ + by_cases hc : ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2) + · refine Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem + (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ?_) + rw [dimEightPieceOne] + refine Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ?_)) + exact Submodule.mem_iSup_of_mem c (Submodule.mem_iSup_of_mem ⟨rfl, hc⟩ + (LinearMap.mem_range_self _ 1)) + · rw [not_and_or, not_not, not_not] at hc + rcases hc with ⟨h20, h13⟩ | ⟨h30, h12⟩ + · rcases not_and_or.1 h1 with hd | hd + · rw [Fin.prod_univ_two, h20, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] + exact Submodule.zero_mem _ + · rw [Fin.prod_univ_two, h13, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] + exact Submodule.zero_mem _ + · rcases not_and_or.1 h2 with hd | hd + · rw [Fin.prod_univ_two, h30, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] + exact Submodule.zero_mem _ + · rw [Fin.prod_univ_two, h12, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] + exact Submodule.zero_mem _ + +/-- As `mem_iSup_dimEightPieceOne_left`, for the mixed family. -/ +lemma mem_iSup_dimEightPieceOne_mixed (d : Fin 2 → Fin 1 ⊕ Fin 3) + (h1 : ¬(d 0 = Sum.inr 2 ∧ d 1 = Sum.inr 0)) (h2 : ¬(d 0 = Sum.inr 0 ∧ d 1 = Sum.inr 2)) : + h.dotGaugeHiggs ![d 0] ![d 1] ∈ ⨆ k, h.dimEightPieceOne k := by + have he : h.dotGaugeHiggs ![d 0] ![d 1] = ∑ c : Fin 2 → Fin 4, + (∏ j, IsDerivativeCollection.lightConeCoeffInv 1 (d j) (c j)) • + IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c 1 := + calc h.dotGaugeHiggs ![d 0] ![d 1] = h.dotSymbol ![1, 1] d 1 := by + rw [h.dotSymbol_one_one, LinearMap.toSpanSingleton_apply, one_smul] + _ = _ := by + rw [IsDerivativeCollection.eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 d] + simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] + rw [he] + refine sum_mem fun c _ => ?_ + by_cases hc : ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2) + · refine Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem + (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ?_) + rw [dimEightPieceOne] + refine Submodule.mem_sup_left (Submodule.mem_sup_right ?_) + exact Submodule.mem_iSup_of_mem c (Submodule.mem_iSup_of_mem ⟨rfl, hc⟩ + (LinearMap.mem_range_self _ 1)) + · rw [not_and_or, not_not, not_not] at hc + rcases hc with ⟨h20, h13⟩ | ⟨h30, h12⟩ + · rcases not_and_or.1 h1 with hd | hd + · rw [Fin.prod_univ_two, h20, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] + exact Submodule.zero_mem _ + · rw [Fin.prod_univ_two, h13, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] + exact Submodule.zero_mem _ + · rcases not_and_or.1 h2 with hd | hd + · rw [Fin.prod_univ_two, h30, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] + exact Submodule.zero_mem _ + · rw [Fin.prod_univ_two, h12, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] + exact Submodule.zero_mem _ + +/-- Each piece lies in the dimension-eight sector. -/ +lemma dimEightPieceOne_le_gaugeInvariant (k : ℤ) : + h.dimEightPieceOne k ≤ h.gaugeInvariantOfMassDim 8 := by + rw [← h.iSup_range_dotSymbol_eight_eq, dimEightPieceOne] + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · exact iSup₂_le fun c _ => + (IsDerivativeCollection.range_lightConeDeriv_le_iSup_range (n := 2) + (h.dotSymbol ![2, 0]) 1 c).trans + (le_sup_of_le_left (le_sup_of_le_left le_sup_left)) + · exact iSup₂_le fun c _ => + (IsDerivativeCollection.range_lightConeDeriv_le_iSup_range (n := 2) + (h.dotSymbol ![0, 2]) 1 c).trans + (le_sup_of_le_left (le_sup_of_le_left le_sup_right)) + · exact iSup₂_le fun c _ => + (IsDerivativeCollection.range_lightConeDeriv_le_iSup_range (n := 2) + (h.dotSymbol ![1, 1]) 1 c).trans + (le_sup_of_le_left le_sup_right) + · split_ifs with hk + · refine le_sup_of_le_right ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine Submodule.mem_iSup_of_mem ![] ?_ + rw [h.range_quarticSymbol] + exact Submodule.mem_span_singleton_self _ + · exact bot_le + +/-- **The minimal `y`-boost covering of the `x`-weight-zero part** of the dimension-eight + terms. -/ +noncomputable def dimEightWeightDecompositionLE : + WeightDecompositionLE repLorentz 1 ((h.boostWeightZeroEight 0).piece 0) where + piece := h.dimEightPieceOne + supp := {-4, -2, 0, 2, 4} + piece_le := h.dimEightPieceOne_le + piece_eq_bot := h.dimEightPieceOne_eq_bot + iSup_piece := by + rw [h.boostWeightZeroEight_piece_zero_eq 0, show ((0 : Fin 3) + 1) = 1 from rfl, + show ((0 : Fin 3) + 2) = 2 from rfl] + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · refine sup_le (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · exact sub_mem (sub_mem (add_mem + (h.mem_iSup_dimEightPieceOne_left ![Sum.inl 0, Sum.inl 0] (by decide) (by decide)) + (h.mem_iSup_dimEightPieceOne_left ![Sum.inl 0, Sum.inr 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_left ![Sum.inr 0, Sum.inl 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_left ![Sum.inr 0, Sum.inr 0] (by decide) (by decide)) + · exact sub_mem (add_mem (sub_mem + (h.mem_iSup_dimEightPieceOne_left ![Sum.inl 0, Sum.inl 0] (by decide) (by decide)) + (h.mem_iSup_dimEightPieceOne_left ![Sum.inl 0, Sum.inr 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_left ![Sum.inr 0, Sum.inl 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_left ![Sum.inr 0, Sum.inr 0] (by decide) (by decide)) + · exact h.mem_iSup_dimEightPieceOne_left ![Sum.inr 1, Sum.inr 1] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_left ![Sum.inr 1, Sum.inr 2] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_left ![Sum.inr 2, Sum.inr 1] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_left ![Sum.inr 2, Sum.inr 2] (by decide) (by decide) + · refine sup_le (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · exact sub_mem (sub_mem (add_mem + (h.mem_iSup_dimEightPieceOne_right ![Sum.inl 0, Sum.inl 0] (by decide) (by decide)) + (h.mem_iSup_dimEightPieceOne_right ![Sum.inl 0, Sum.inr 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_right ![Sum.inr 0, Sum.inl 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_right ![Sum.inr 0, Sum.inr 0] (by decide) (by decide)) + · exact sub_mem (add_mem (sub_mem + (h.mem_iSup_dimEightPieceOne_right ![Sum.inl 0, Sum.inl 0] (by decide) (by decide)) + (h.mem_iSup_dimEightPieceOne_right ![Sum.inl 0, Sum.inr 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_right ![Sum.inr 0, Sum.inl 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_right ![Sum.inr 0, Sum.inr 0] (by decide) (by decide)) + · exact h.mem_iSup_dimEightPieceOne_right ![Sum.inr 1, Sum.inr 1] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_right ![Sum.inr 1, Sum.inr 2] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_right ![Sum.inr 2, Sum.inr 1] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_right ![Sum.inr 2, Sum.inr 2] (by decide) (by decide) + · refine sup_le (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · exact sub_mem (sub_mem (add_mem + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inl 0, Sum.inl 0] (by decide) (by decide)) + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inl 0, Sum.inr 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 0, Sum.inl 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 0, Sum.inr 0] (by decide) (by decide)) + · exact sub_mem (add_mem (sub_mem + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inl 0, Sum.inl 0] (by decide) (by decide)) + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inl 0, Sum.inr 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 0, Sum.inl 0] (by decide) (by decide))) + (h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 0, Sum.inr 0] (by decide) (by decide)) + · exact h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 1, Sum.inr 1] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 1, Sum.inr 2] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 2, Sum.inr 1] (by decide) (by decide) + · exact h.mem_iSup_dimEightPieceOne_mixed ![Sum.inr 2, Sum.inr 2] (by decide) (by decide) + · rw [Submodule.span_singleton_le_iff_mem] + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceOne] + refine Submodule.mem_sup_right ?_ + rw [if_pos rfl] + exact Submodule.mem_span_singleton_self _ + +/-- **The weight-zero piece of the minimal `y`-covering**, explicitly: per family the two + `y`-null combinations and the repeated `z` and `x` monomials, and the square of the + inner product. -/ +lemma dimEightWeightDecompositionLE_piece_zero_eq : + h.dimEightWeightDecompositionLE.piece 0 = + (((ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + + h.dotGaugeHiggs ![Sum.inl 0, Sum.inr 1] ![] + - h.dotGaugeHiggs ![Sum.inr 1, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inl 0, Sum.inr 1] ![] + + h.dotGaugeHiggs ![Sum.inr 1, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![] ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]))) ⊔ + (((ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + + h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr 1] + - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr 1] + + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2] ⊔ + ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]))) ⊔ + (((ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + + h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr 1] + - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1]) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr 1] + + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1])) ⊔ + (ℂ ∙ h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2] ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0]))) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + have h1 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero_notMixed + (h.dotSymbol ![2, 0]) 1 + have h2 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero_notMixed + (h.dotSymbol ![0, 2]) 1 + have h3 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero_notMixed + (h.dotSymbol ![1, 1]) 1 + simp only [IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + range_toSpanSingleton_add_sub_sub, range_toSpanSingleton_sub_add_sub, + ← LinearMap.span_singleton_eq_range] at h1 h2 h3 + show h.dimEightPieceOne 0 = _ + rw [dimEightPieceOne, if_pos rfl] + exact congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) h1 h2) h3) rfl + + + +/-! + +### D.5. The decomposition along the x, y and z directions + +-/ + open IsDerivativeCollection in /-- **The `z`-boost covering of the doubly-weight-zero part** of the dimension-six terms. The remaining `z`-derivative terms lie along the boost axis, so nothing survives at @@ -3017,9 +3904,1224 @@ noncomputable def dimSixWeightDecompositionLELE : · rw [if_pos rfl] exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + +/-- **The minimal `z`-boost pieces over the doubly-weight-zero part** of the + dimension-eight terms, built from the `z`-weight components of its generators: per + family the null square at weight `±4`, the tied null–transverse difference at `±2`, + and at weight zero the symmetric null pair together with the repeated transverse + monomials and the square of the inner product. -/ +noncomputable def dimEightPieceTwo (k : ℤ) : Submodule ℂ B := + if k = 4 then + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] ⊔ + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] ⊔ + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] + else if k = 2 then + ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) ⊔ + ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) ⊔ + ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) + else if k = 0 then + ((ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) ⊔ + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] ⊔ ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2]) ⊔ + (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) ⊔ + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] ⊔ ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2]) ⊔ + (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) ⊔ + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] ⊔ ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2])) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) + else if k = -2 then + ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) ⊔ + ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) ⊔ + ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) + else if k = -4 then + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] ⊔ + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] ⊔ + ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] + else ⊥ + +/-- Each piece is a boost eigenspace slice of its weight. -/ +lemma dimEightPieceTwo_le (k : ℤ) : + h.dimEightPieceTwo k ≤ boostWeightSubmodule repLorentz 2 k := by + have hL := fun (c : Fin 2 → Fin 4) (k : ℤ) + (hk : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k) => + IsDerivativeCollection.lightConeDot_mem (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 c hk + have hR := fun (c : Fin 2 → Fin 4) (k : ℤ) + (hk : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k) => + IsDerivativeCollection.lightConeDot_mem (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 c hk + have hM := fun (c : Fin 2 → Fin 4) (k : ℤ) + (hk : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k) => + IsDerivativeCollection.lightConeDot_mem (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 c hk + rw [dimEightPieceTwo] + split_ifs with h4 h2 h0 hm2 hm4 + · subst h4 + refine sup_le (sup_le ?_ ?_) ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact hL _ _ (by decide) + · exact hR _ _ (by decide) + · exact hM _ _ (by decide) + · subst h2 + refine sup_le (sup_le ?_ ?_) ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact sub_mem (hL _ _ (by decide)) (hL _ _ (by decide)) + · exact sub_mem (hR _ _ (by decide)) (hR _ _ (by decide)) + · exact sub_mem (hM _ _ (by decide)) (hM _ _ (by decide)) + · subst h0 + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + rotate_right + · rw [Submodule.span_singleton_le_iff_mem] + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] + simp + all_goals refine sup_le (sup_le ?_ ?_) ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact add_mem (hL _ _ (by decide)) (hL _ _ (by decide)) + · exact hL _ _ (by decide) + · exact hL _ _ (by decide) + · exact add_mem (hR _ _ (by decide)) (hR _ _ (by decide)) + · exact hR _ _ (by decide) + · exact hR _ _ (by decide) + · exact add_mem (hM _ _ (by decide)) (hM _ _ (by decide)) + · exact hM _ _ (by decide) + · exact hM _ _ (by decide) + · subst hm2 + refine sup_le (sup_le ?_ ?_) ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact sub_mem (hL _ _ (by decide)) (hL _ _ (by decide)) + · exact sub_mem (hR _ _ (by decide)) (hR _ _ (by decide)) + · exact sub_mem (hM _ _ (by decide)) (hM _ _ (by decide)) + · subst hm4 + refine sup_le (sup_le ?_ ?_) ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact hL _ _ (by decide) + · exact hR _ _ (by decide) + · exact hM _ _ (by decide) + · exact bot_le + +/-- The pieces vanish outside the weights `{-4, -2, 0, 2, 4}`. -/ +lemma dimEightPieceTwo_eq_bot (k : ℤ) (hk : k ∉ ({-4, -2, 0, 2, 4} : Finset ℤ)) : + h.dimEightPieceTwo k = ⊥ := by + simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hk + rw [dimEightPieceTwo, if_neg hk.2.2.2.2, if_neg hk.2.2.2.1, if_neg hk.2.2.1, + if_neg hk.2.1, if_neg hk.1] + +set_option linter.unusedSimpArgs false in +/-- **The minimal `z`-boost covering of the doubly-weight-zero part** of the + dimension-eight terms: each generator splits into its `z`-weight components, which + generate the pieces. -/ +noncomputable def dimEightWeightDecompositionLELE : + WeightDecompositionLE repLorentz 2 (h.dimEightWeightDecompositionLE.piece 0) where + piece := h.dimEightPieceTwo + supp := {-4, -2, 0, 2, 4} + piece_le := h.dimEightPieceTwo_le + piece_eq_bot := h.dimEightPieceTwo_eq_bot + iSup_piece := by + have hL00 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 4 ?_ + rw [dimEightPieceTwo, if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + have hL03 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 2 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + have hL01 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _))))) + have hL33 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))))) + have hL22 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) + have hL13 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem (-2) ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), + if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + have hL11 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem (-4) ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), + if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + have hR00 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 4 ?_ + rw [dimEightPieceTwo, if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + have hR03 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 2 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + have hR01 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _))))) + have hR33 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))))) + have hR22 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) + have hR13 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem (-2) ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), + if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + have hR11 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem (-4) ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), + if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + have hM00 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 4 ?_ + rw [dimEightPieceTwo, if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have hM03 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 2 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have hM01 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)))) + have hM33 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) + have hM22 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + have hM13 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem (-2) ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), + if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have hM11 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + refine Submodule.mem_iSup_of_mem (-4) ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), + if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + rw [h.dimEightWeightDecompositionLE_piece_zero_eq] + refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ + · refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · rw [show h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + + h.dotGaugeHiggs ![Sum.inl 0, Sum.inr 1] ![] + - h.dotGaugeHiggs ![Sum.inr 1, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] + + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (add_mem (sub_mem (add_mem (add_mem + (Submodule.smul_mem _ _ hL00) (Submodule.smul_mem _ _ hL03)) + (Submodule.smul_mem _ _ hL01)) hL33) (Submodule.smul_mem _ _ hL13)) + (Submodule.smul_mem _ _ hL11) + · rw [show h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inl 0, Sum.inr 1] ![] + + h.dotGaugeHiggs ![Sum.inr 1, Sum.inl 0] ![] + - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] + - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (sub_mem (sub_mem (add_mem (sub_mem + (Submodule.smul_mem _ _ hL00) (Submodule.smul_mem _ _ hL03)) + (Submodule.smul_mem _ _ hL01)) hL33) (Submodule.smul_mem _ _ hL13)) + (Submodule.smul_mem _ _ hL11) + · rw [show h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] - (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (sub_mem (Submodule.smul_mem _ _ hL00) + (Submodule.smul_mem _ _ hL01)) (Submodule.smul_mem _ _ hL11) + · rw [show h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] = IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + exact hL22 + · refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · rw [show h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + + h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr 1] + - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] + + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (add_mem (sub_mem (add_mem (add_mem + (Submodule.smul_mem _ _ hR00) (Submodule.smul_mem _ _ hR03)) + (Submodule.smul_mem _ _ hR01)) hR33) (Submodule.smul_mem _ _ hR13)) + (Submodule.smul_mem _ _ hR11) + · rw [show h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr 1] + + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inl 0] + - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] + - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (sub_mem (sub_mem (add_mem (sub_mem + (Submodule.smul_mem _ _ hR00) (Submodule.smul_mem _ _ hR03)) + (Submodule.smul_mem _ _ hR01)) hR33) (Submodule.smul_mem _ _ hR13)) + (Submodule.smul_mem _ _ hR11) + · rw [show h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] - (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (sub_mem (Submodule.smul_mem _ _ hR00) + (Submodule.smul_mem _ _ hR01)) (Submodule.smul_mem _ _ hR11) + · rw [show h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] = IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + exact hR22 + · refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · rw [show h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + + h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr 1] + - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] + + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] + + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (add_mem (sub_mem (add_mem (add_mem + (Submodule.smul_mem _ _ hM00) (Submodule.smul_mem _ _ hM03)) + (Submodule.smul_mem _ _ hM01)) hM33) (Submodule.smul_mem _ _ hM13)) + (Submodule.smul_mem _ _ hM11) + · rw [show h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr 1] + + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inl 0] + - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] + - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] + - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (sub_mem (sub_mem (add_mem (sub_mem + (Submodule.smul_mem _ _ hM00) (Submodule.smul_mem _ _ hM03)) + (Submodule.smul_mem _ _ hM01)) hM33) (Submodule.smul_mem _ _ hM13)) + (Submodule.smul_mem _ _ hM11) + · rw [show h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2] + = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] - (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact add_mem (sub_mem (Submodule.smul_mem _ _ hM00) + (Submodule.smul_mem _ _ hM01)) (Submodule.smul_mem _ _ hM11) + · rw [show h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] = IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + exact hM22 + · rw [Submodule.span_singleton_le_iff_mem] + refine Submodule.mem_iSup_of_mem 0 ?_ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + +set_option linter.unusedSimpArgs false in +/-- **The weight-zero piece of the minimal `z`-covering**, explicitly: per family the + symmetric null combination `dotG(tt) - dotG(zz)` and the repeated `y` and `x` + monomials, and the square of the inner product. -/ +lemma dimEightWeightDecompositionLELE_piece_zero_eq : + h.dimEightWeightDecompositionLELE.piece 0 = + ((ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) ⊔ + (ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) ⊔ + ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] ⊔ ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) ⊔ + (ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) ⊔ + ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0])) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + have hL1 : (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0])) + = ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0] + = (2 : ℂ) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact Submodule.span_singleton_smul_eq (by norm_num : (2 : ℂ) ≠ 0).isUnit _ + have hL2 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] = h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + have hL3 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] = h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + have hR1 : (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0])) + = ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0] + = (2 : ℂ) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact Submodule.span_singleton_smul_eq (by norm_num : (2 : ℂ) ≠ 0).isUnit _ + have hR2 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] = h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + have hR3 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] = h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + have hM1 : (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0])) + = ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0] + = (2 : ℂ) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + exact Submodule.span_singleton_smul_eq (by norm_num : (2 : ℂ) ≠ 0).isUnit _ + have hM2 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] = h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + have hM3 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] := by + rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] = h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] from by + simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_three, + IsDerivativeCollection.lightConeDeriv_pair_three_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_three, + IsDerivativeCollection.lightConeDeriv_pair_three_one, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul]] + show h.dimEightPieceTwo 0 = _ + rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] + exact congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) + (congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) hL1 hL2) hL3) + (congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) hR1 hR2) hR3)) + (congrArg₂ (· ⊔ ·) (congrArg₂ (· ⊔ ·) hM1 hM2) hM3)) rfl + /-! -### D.3. The dim six invariants +### D.5. The rotational average + +The three boost sieves leave, per family, the span of `TT - ZZ`, `YY` and `XX` together +with the square of the inner product — strictly more than the invariants. The remaining +reduction uses the cyclic rotation `x → y → z → x`: averaging an invariant element over +its powers replaces the three transverse coefficients by their common mean, after which +the extreme boost-weight components along each axis tie that mean to the coefficient of +`TT`, collapsing each family onto its metric contraction. + +-/ + +/-- The cyclic permutation of the coordinate directions: time is fixed and the spatial + directions rotate `x → y → z → x`. -/ +def cycDir : Fin 1 ⊕ Fin 3 → Fin 1 ⊕ Fin 3 := Sum.map id (· + 1) + +@[simp] lemma cycDir_inl : cycDir (Sum.inl 0) = Sum.inl 0 := rfl + +@[simp] lemma cycDir_inr (m : Fin 3) : cycDir (Sum.inr m) = Sum.inr (m + 1) := rfl + +/-- Composing the cyclic direction with a two-slot index vector. -/ +lemma cycDir_comp_two (μ ν : Fin 1 ⊕ Fin 3) : + (fun j => cycDir (![μ, ν] j)) = ![cycDir μ, cycDir ν] := by + funext j + fin_cases j <;> rfl + +/-- Composing the cyclic direction with a one-slot index vector. -/ +lemma cycDir_comp_one (μ : Fin 1 ⊕ Fin 3) : + (fun j => cycDir (![μ] j)) = ![cycDir μ] := by + funext j + fin_cases j + rfl + +/-- Composing the cyclic direction with the empty index vector. -/ +lemma cycDir_comp_nil : (fun j : Fin 0 => cycDir (![] j)) = ![] := by + funext j + exact j.elim0 + +/-- **The cyclic rotation** `x → y → z → x` as an element of `SL(2,ℂ)`: the rotation by + `2π/3` about the diagonal spatial axis. -/ +noncomputable def rotationCycle : SL(2,ℂ) := + ⟨(2 : ℂ)⁻¹ • !![1 - Complex.I, -(1 + Complex.I); 1 - Complex.I, 1 + Complex.I], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin] + simp [Complex.ext_iff] + norm_num⟩ + +/-- **The Lorentz matrix of the cyclic rotation is the permutation matrix of `cycDir`.** -/ +lemma toLorentzGroup_rotationCycle_apply (a b : Fin 1 ⊕ Fin 3) : + (SL2C.toLorentzGroup rotationCycle).1 a b = if a = cycDir b then 1 else 0 := by + refine Complex.ofReal_injective ?_ + rw [SL2C.toLorentzGroup_eq_trace, PauliMatrix.trace_pauliSelfAdjoint'_mul_apply] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + simp [rotationCycle, cycDir, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.mul_apply, Matrix.conjTranspose_apply, Fin.sum_univ_two, + Complex.ext_iff] <;> + norm_num + +/-- **The cyclic rotation acts on inner-product monomials by cycling every derivative + index.** -/ +lemma repLorentz_rotationCycle_dotGaugeHiggs {n1 n2 : ℕ} + (d₁ : Fin n1 → Fin 1 ⊕ Fin 3) (d₂ : Fin n2 → Fin 1 ⊕ Fin 3) : + repLorentz rotationCycle (h.dotGaugeHiggs d₁ d₂) + = h.dotGaugeHiggs (fun j => cycDir (d₁ j)) (fun j => cycDir (d₂ j)) := by + have hcoef : ∀ {n : ℕ} (a d : Fin n → Fin 1 ⊕ Fin 3), + (∏ j, (((SL2C.toLorentzGroup rotationCycle).1 (a j) (d j) : ℝ) : ℂ)) + = if a = fun j => cycDir (d j) then 1 else 0 := by + intro n a d + by_cases had : a = fun j => cycDir (d j) + · rw [if_pos had] + refine Finset.prod_eq_one fun j _ => ?_ + rw [toLorentzGroup_rotationCycle_apply, if_pos (congrFun had j), Complex.ofReal_one] + · rw [if_neg had] + obtain ⟨j, hj⟩ := Function.ne_iff.1 had + refine Finset.prod_eq_zero (Finset.mem_univ j) ?_ + rw [toLorentzGroup_rotationCycle_apply, if_neg hj, Complex.ofReal_zero] + rw [h.repLorentz_dotGaugeHiggs] + simp only [hcoef] + simp [ite_smul, zero_smul, one_smul, Finset.sum_ite_eq'] + +/-- Extraction of coefficients from a three-generator span. -/ +lemma mem_span_three {v₁ v₂ v₃ x : B} (hx : x ∈ ℂ ∙ v₁ ⊔ ℂ ∙ v₂ ⊔ ℂ ∙ v₃) : + ∃ a b c : ℂ, x = a • v₁ + b • v₂ + c • v₃ := by + obtain ⟨y, hy, z, hz, hyz⟩ := Submodule.mem_sup.1 hx + obtain ⟨y₁, hy₁, y₂, hy₂, hy12⟩ := Submodule.mem_sup.1 hy + obtain ⟨a, ha⟩ := Submodule.mem_span_singleton.1 hy₁ + obtain ⟨b, hb⟩ := Submodule.mem_span_singleton.1 hy₂ + obtain ⟨c, hc⟩ := Submodule.mem_span_singleton.1 hz + exact ⟨a, b, c, by rw [← hyz, ← hy12, ← ha, ← hb, ← hc]⟩ + +/-- **The metric contraction** of the family with both derivatives on the Higgs. -/ +noncomputable def metricDotLeft : B := + h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] + - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![] + +/-- **The metric contraction** of the family with both derivatives on the conjugate + Higgs. -/ +noncomputable def metricDotRight : B := + h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] + - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2] + +/-- **The metric contraction** of the family with one derivative on each factor: the + kinetic-type term `η^{μν} (D_μ H)(D_ν H^†)`. -/ +noncomputable def metricDotMixed : B := + h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] + - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2] + +set_option maxHeartbeats 1600000 in +set_option linter.unusedSimpArgs false in +/-- **The gauge- and Lorentz-invariant terms of mass weight eight are spanned by the three + metric contractions and the square of the inner product.** The three boost sieves place + an invariant in the doubly-weight-zero span; averaging over the cyclic rotation equalises + the three transverse coefficients of each family; and the extreme boost-weight components + along each axis tie that common value to the coefficient of the time-time monomial, + collapsing each family onto its metric contraction. -/ +theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) + (hLorentz : ∀ g, repLorentz g x = x) (hdim : x ∈ h.massWeightSubmodule 8) : + x ∈ (ℂ ∙ h.metricDotLeft ⊔ ℂ ∙ h.metricDotRight ⊔ ℂ ∙ h.metricDotMixed) ⊔ + ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + have hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0 := fun i => + mem_boostWeightSubmodule.2 fun t ht => by rw [hLorentz]; simp + have h8 : x ∈ h.gaugeInvariantOfMassDim 8 := + Submodule.mem_inf.2 ⟨hdim, (Representation.mem_invariants rep x).2 hx⟩ + have h1 : x ∈ (h.boostWeightZeroEight 0).piece 0 := + ((h.boostWeightZeroEight 0).toLE le_rfl).mem_piece_zero_of_mem h8 (hw 0) + have h2 : x ∈ h.dimEightPieceOne 0 := + h.dimEightWeightDecompositionLE.mem_piece_zero_of_mem h1 (hw 1) + have h3 : x ∈ h.dimEightWeightDecompositionLELE.piece 0 := + h.dimEightWeightDecompositionLELE.mem_piece_zero_of_mem h2 (hw 2) + rw [h.dimEightWeightDecompositionLELE_piece_zero_eq] at h3 + obtain ⟨y, hy, zQ, hzQ, hyz⟩ := Submodule.mem_sup.1 h3 + obtain ⟨yLR, hyLR, yM, hyM, hyLRM⟩ := Submodule.mem_sup.1 hy + obtain ⟨yL, hyL, yR, hyR, hyLR'⟩ := Submodule.mem_sup.1 hyLR + obtain ⟨aL, bL, cL, hcL⟩ := mem_span_three hyL + obtain ⟨aR, bR, cR, hcR⟩ := mem_span_three hyR + obtain ⟨aM, bM, cM, hcM⟩ := mem_span_three hyM + obtain ⟨q, hq⟩ := Submodule.mem_span_singleton.1 hzQ + have e0 : x = (aL • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + bL • h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + cL • h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + + (aR • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + bR • h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + cR • h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + + (aM • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) + bM • h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + cM • h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0]) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + rw [← hyz, ← hyLRM, ← hyLR', hcL, hcR, hcM, ← hq] + have e1 : x = (aL • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + bL • h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![] + cL • h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + + (aR • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + bR • h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2] + cR • h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + + (aM • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0]) + bM • h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2] + cM • h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1]) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := + calc x = repLorentz rotationCycle x := (hLorentz _).symm + _ = _ := by + rw [e0] + simp only [map_add, map_smul, map_sub, h.repLorentz_rotationCycle_dotGaugeHiggs, + h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil, cycDir_comp_two, cycDir_comp_one, + cycDir_comp_nil, cycDir_inl, cycDir_inr, + show ((0 : Fin 3) + 1) = 1 from rfl, show ((1 : Fin 3) + 1) = 2 from rfl, + show ((2 : Fin 3) + 1) = 0 from rfl] + have e2 : x = (aL • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + bL • h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] + cL • h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + + (aR • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + bR • h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] + cR • h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + + (aM • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1]) + bM • h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] + cM • h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := + calc x = repLorentz rotationCycle x := (hLorentz _).symm + _ = _ := by + rw [e1] + simp only [map_add, map_smul, map_sub, h.repLorentz_rotationCycle_dotGaugeHiggs, + h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil, cycDir_comp_two, cycDir_comp_one, + cycDir_comp_nil, cycDir_inl, cycDir_inr, + show ((0 : Fin 3) + 1) = 1 from rfl, show ((1 : Fin 3) + 1) = 2 from rfl, + show ((2 : Fin 3) + 1) = 0 from rfl] + have ekform : x = (aL • h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + ((bL + cL - aL) / 3) • (h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![])) + + (aR • h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + ((bR + cR - aR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2])) + + (aM • h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + ((bM + cM - aM) / 3) • (h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + rw [show ((aL • h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + ((bL + cL - aL) / 3) • (h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![])) + + (aR • h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + ((bR + cR - aR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2])) + + (aM • h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + ((bM + cM - aM) / 3) • (h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) + = (3⁻¹ : ℂ) • (((aL • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + bL • h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + cL • h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + + (aR • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + bR • h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + cR • h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + + (aM • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) + bM • h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + cM • h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0]) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) + + ((aL • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + bL • h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![] + cL • h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + + (aR • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + bR • h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2] + cR • h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + + (aM • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0]) + bM • h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2] + cM • h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1]) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) + + ((aL • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + bL • h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] + cL • h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + + (aR • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + bR • h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] + cR • h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + + (aM • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1]) + bM • h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] + cM • h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]))) from by module, + ← e0, ← e1, ← e2] + module + have hsplit0 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 0] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 0] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 1] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 1] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 1])) + + ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 0]) + + ((bL + cL - aL) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![3, 3])) + + (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 0]) + + ((bR + cR - aR) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![3, 3])) + + (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 0]) + + ((bM + cM - aM) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by + rw [ekform] + simp only [IsDerivativeCollection.lightConeDot, + IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((0 : Fin 3) + 1) = 1 from rfl, show ((0 : Fin 3) + 2) = 2 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module + have hcomp0 := eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule + (a := 4) (b := -4) + (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![0, 0] (by decide))) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![0, 0] (by decide)))) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![0, 0] (by decide))))) + (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![1, 1] (by decide))) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![1, 1] (by decide)))) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![1, 1] (by decide))))) + (add_mem (add_mem (add_mem + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bL + cL - aL) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![3, 3] (by decide))))) + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bR + cR - aR) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![3, 3] (by decide)))))) + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bM + cM - aM) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![3, 3] (by decide)))))) + (Submodule.smul_mem _ q (mem_boostWeightSubmodule.2 fun t ht => by + rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] + simp))) + (hsplit0 ▸ hw 0) (by decide) (by decide) (by decide) + have haxis0 : ((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0]) = 0 := by + rw [show (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0])) + = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 0] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 0] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 1] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 1] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 1]))) from by + simp only [IsDerivativeCollection.lightConeDot, + IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((0 : Fin 3) + 1) = 1 from rfl, show ((0 : Fin 3) + 2) = 2 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + rw [hcomp0.1, hcomp0.2] + simp + have hsplit1 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 0] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 0] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 1] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 1] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 1])) + + ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 0]) + + ((bL + cL - aL) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![3, 3])) + + (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 0]) + + ((bR + cR - aR) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![3, 3])) + + (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 0]) + + ((bM + cM - aM) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by + rw [ekform] + simp only [IsDerivativeCollection.lightConeDot, + IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module + have hcomp1 := eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule + (a := 4) (b := -4) + (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![0, 0] (by decide))) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![0, 0] (by decide)))) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![0, 0] (by decide))))) + (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![1, 1] (by decide))) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![1, 1] (by decide)))) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![1, 1] (by decide))))) + (add_mem (add_mem (add_mem + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bL + cL - aL) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![3, 3] (by decide))))) + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bR + cR - aR) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![3, 3] (by decide)))))) + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bM + cM - aM) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![3, 3] (by decide)))))) + (Submodule.smul_mem _ q (mem_boostWeightSubmodule.2 fun t ht => by + rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] + simp))) + (hsplit1 ▸ hw 1) (by decide) (by decide) (by decide) + have haxis1 : ((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1]) = 0 := by + rw [show (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1])) + = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 0] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 0] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 1] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 1] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 1]))) from by + simp only [IsDerivativeCollection.lightConeDot, + IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + rw [hcomp1.1, hcomp1.2] + simp + have hsplit2 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1])) + + ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + + ((bL + cL - aL) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3])) + + (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + + ((bR + cR - aR) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3])) + + (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + + ((bM + cM - aM) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by + rw [ekform] + simp only [IsDerivativeCollection.lightConeDot, + IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module + have hcomp2 := eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule + (a := 4) (b := -4) + (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![0, 0] (by decide))) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![0, 0] (by decide)))) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![0, 0] (by decide))))) + (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![1, 1] (by decide))) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![1, 1] (by decide)))) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![1, 1] (by decide))))) + (add_mem (add_mem (add_mem + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bL + cL - aL) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![3, 3] (by decide))))) + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bR + cR - aR) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![3, 3] (by decide)))))) + (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![0, 1] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![1, 0] (by decide)))) + (Submodule.smul_mem _ ((bM + cM - aM) / 3) (add_mem + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![2, 2] (by decide)) + (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![3, 3] (by decide)))))) + (Submodule.smul_mem _ q (mem_boostWeightSubmodule.2 fun t ht => by + rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] + simp))) + (hsplit2 ▸ hw 2) (by decide) (by decide) (by decide) + have haxis2 : ((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) = 0 := by + rw [show (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2])) + = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] + + ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] + + ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1]))) from by + simp only [IsDerivativeCollection.lightConeDot, + IsDerivativeCollection.lightConeDeriv_pair_zero_zero, + IsDerivativeCollection.lightConeDeriv_pair_one_one, + IsDerivativeCollection.lightConeDeriv_pair_zero_one, + IsDerivativeCollection.lightConeDeriv_pair_one_zero, + IsDerivativeCollection.lightConeDeriv_pair_two_two, + IsDerivativeCollection.lightConeDeriv_pair_three_three, + show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, + LinearMap.add_apply, LinearMap.sub_apply, + h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, + Matrix.cons_val_zero, Matrix.cons_val_one, + LinearMap.toSpanSingleton_apply, one_smul] + module] + rw [hcomp2.1, hcomp2.2] + simp + have hfinal : x = ((2 * aL - bL - cL) / 4) • h.metricDotLeft + ((2 * aR - bR - cR) / 4) • h.metricDotRight + + ((2 * aM - bM - cM) / 4) • h.metricDotMixed + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + rw [ekform, + show ((aL • h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + ((bL + cL - aL) / 3) • (h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] + h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![])) + + (aR • h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + ((bR + cR - aR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] + h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2])) + + (aM • h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + ((bM + cM - aM) / 3) • (h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] + h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) + = (((2 * aL - bL - cL) / 4) • h.metricDotLeft + ((2 * aR - bR - cR) / 4) • h.metricDotRight + + ((2 * aM - bM - cM) / 4) • h.metricDotMixed + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) + + (4⁻¹ : ℂ) • ((((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0])) + (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1])) + (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]))) from by + simp only [metricDotLeft, metricDotRight, metricDotMixed] + module, + haxis0, haxis1, haxis2] + simp + rw [hfinal] + exact add_mem (add_mem (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_right (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _))) + + + +/-! + +## I. The fully invariants + +-/ + +/-! + +### I.1. Invariants of the mass dimension -/ @@ -3042,6 +5144,14 @@ lemma gaugeInvariantOfMassDim_six_eq_boostWeightZero exact h.dimSixWeightDecompositionLELE.eq_zero_of_mem_of_zero_notMem_supp (by simp [dimSixWeightDecompositionLELE]) h2 (hw 2) + +/-! + +### I.2. Invariants in the full algebra + +-/ + + end IsHiggsAlgebraValued end StandardModel From d471eb08386c030a3cf2b7e3bdbbfc474e85657f Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 25 Aug 2026 19:39:38 +0400 Subject: [PATCH 197/254] refactor(StandardModel): simplify and document gauge weight decompositions --- .../GaugeGroup/GaugeWeightDecomposition.lean | 389 +++++++++++------- 1 file changed, 234 insertions(+), 155 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index 2f71650a5..77e6675f1 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -11,42 +11,40 @@ public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition ## i. Overview -A **gauge weight decomposition** of a submodule `V` is a finitely supported family of -subspaces of pure gauge weight whose supremum is `V`. A gauge weight is a quadruple +The operators that may appear in a Standard Model Lagrangian are those the gauge group leaves +fixed, and finding them means searching a large space of composite operators. - `(colour₁, colour₂, isospin, hypercharge) : ℤ × ℤ × ℤ × ℤ`, +The maximal torus of the gauge group is four-dimensional, and a **gauge weight** is the +quadruple of charges -the four exponents recording how a vector scales under the four generators of the maximal -torus of `SU(3) × SU(2) × U(1)` — two for the rank-two colour Cartan, one for weak isospin -(normalized as `2T₃`), one for hypercharge (normalized as `6Y`). + `(colour₁, colour₂, isospin, hypercharge) : ℤ × ℤ × ℤ × ℤ`, -This merges `HyperchargeDecomposition` and `IsospinDecomposition` into a single object, and -adds colour. That merge is legitimate because the four generators *commute*: they live in -different factors of the product group, and the two colour generators are both diagonal. So -the four gradings are simultaneously realizable, and there is no loss in carrying them -together. +recording how a vector scales under four chosen elements of it. Two count colour, one counts +weak isospin normalized as `2T₃`, and one counts hypercharge normalized as `6Y`. A **gauge +weight decomposition** of a submodule `V` presents it as a finitely supported family of +subspaces on each of which those four elements act by one such character. -## ii. Independence, and why it is not immediate +Carrying all four charges at once costs nothing, since the four elements commute. They lie in +different factors of the product group, and the two colour elements are both diagonal, so the +four gradings are simultaneously realizable. An invariant operator is fixed by the whole gauge +group, so in particular by these four elements, so it carries zero weight and the search can +be confined to the zero-weight piece. -For a single generator, independence of the weight spaces is free: they sit in eigenspaces -of one operator at the pairwise distinct eigenvalues `(exp i) ^ k`. At rank four no single -generator separates the weights, so the argument has to be iterated. `mem_iSup_of_eigenvector` -is the one-generator refinement step — an eigenvector at exponent zero lying in the span of -the pieces already lies in the span of those pieces whose corresponding coordinate vanishes — -and `mem_zero_of_invariant` applies it once per generator, peeling off one coordinate at a -time until only the zero weight survives. -## iii. Key results +## ii. Key results - `gaugeTorusGen` : the four commuting torus generators. +- `GaugeWeight` : the quadruple of charges measured against them. - `GaugeWeightDecomposition` : a finitely supported family of pure-weight subspaces with supremum `V`. -- `GaugeWeightDecomposition.sup` : decompositions combine weightwise along `V ⊔ V'`. +- `GaugeWeightDecomposition.sup` : decompositions combine one weight at a time along + `V ⊔ V'`. - `GaugeWeightDecomposition.mul` : weights add under multiplication, decomposing `V * V'`. +- `GaugeWeightDecomposition.piece_eq_inf` : the pieces are cut out of `V` by the torus alone. - `GaugeWeightDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the - zero-weight piece. + zero-weight piece. This is a sieve, not a characterization; see section F. -## iv. Table of contents +## iii. Table of contents - A. The colour torus generators - B. The four torus generators and gauge weights @@ -64,9 +62,15 @@ namespace StandardModel open Matrix Pointwise /-! - ## A. The colour torus generators +The maximal torus of `SU(3)` is two-dimensional, so colour is a two-component charge and two +generators are needed to measure it. We take the diagonal elements `diag (exp i, exp (-i), 1)` +and `diag (1, exp i, exp (-i))`, which lie in `SU(3)` because each diagonal entry has modulus +one and the three entries multiply to one. + +The generators are elements of the group and the purity of a weight space is recorded by +a character equation `rep g x = c • x`. -/ /-- The first colour torus generator, `diag (exp i, exp (-i), 1)`. -/ @@ -102,34 +106,72 @@ noncomputable def su3ExpITwo : specialUnitaryGroup (Fin 3) ℂ := · simp [Matrix.det_fin_three, hms]⟩ /-! - ## B. The four torus generators and gauge weights +Weights are measured against four chosen elements of the maximal torus, one element per direction, +collected in `gaugeTorusGen`. Four elements suffice because each has infinite order, so the +characters by which it acts on the weight spaces are already pairwise distinct. + +Both abelian charges are normalized to integers. Weak isospin is measured as `2T₃`, so the two +components of a doublet carry weights `+1` and `-1`, and hypercharge as `6Y`, the smallest +rescaling under which every Standard Model hypercharge is an integer, the quark doublet at `Y = 1/6` +becoming `6Y = 1`. Integrality is what allows every eigenvalue here to be an integer power +`(exp i) ^ k` of one scalar. + +`GaugeWeight.coord` reads a weight at a given generator. It is additive, which is why charges +add when operators are multiplied, and injective, so a weight can be recovered from the four +characters by which the torus acts. -/ -/-- The four generators of the maximal torus of the gauge group. They pairwise commute: the - colour, isospin and hypercharge generators sit in different factors of the product, and the - two colour generators are both diagonal. -/ +/-- The four commuting generators of the maximal torus of the gauge group. -/ noncomputable def gaugeTorusGen : Fin 4 → GaugeGroupI := ![⟨su3ExpIOne, 1, 1⟩, ⟨su3ExpITwo, 1, 1⟩, ⟨1, su2ExpI, 1⟩, ⟨1, 1, expI⟩] -/-- A **gauge weight**: the four exponents `(colour₁, colour₂, isospin, hypercharge)` - recording how a vector scales under `gaugeTorusGen`. Isospin is normalized as `2T₃` and - hypercharge as `6Y`. -/ +/-- A **gauge weight**, the four exponents `(colour₁, colour₂, isospin, hypercharge)` + recording how a vector scales under `gaugeTorusGen`. -/ abbrev GaugeWeight : Type := ℤ × ℤ × ℤ × ℤ /-- The exponent of a gauge weight against the `i`-th torus generator. -/ def GaugeWeight.coord (w : GaugeWeight) : Fin 4 → ℤ := ![w.1, w.2.1, w.2.2.1, w.2.2.2] +/-- The exponent at the first colour generator. -/ @[simp] lemma GaugeWeight.coord_zero (w : GaugeWeight) : w.coord 0 = w.1 := rfl + +/-- The exponent at the second colour generator. -/ @[simp] lemma GaugeWeight.coord_one (w : GaugeWeight) : w.coord 1 = w.2.1 := rfl + +/-- The exponent at the isospin generator, normalized as `2T₃`. -/ @[simp] lemma GaugeWeight.coord_two (w : GaugeWeight) : w.coord 2 = w.2.2.1 := rfl + +/-- The exponent at the hypercharge generator, normalized as `6Y`. -/ @[simp] lemma GaugeWeight.coord_three (w : GaugeWeight) : w.coord 3 = w.2.2.2 := rfl +/-- The zero gauge weight has vanishing exponent against every torus generator. -/ +@[simp] lemma GaugeWeight.zero_coord (i : Fin 4) : (0 : GaugeWeight).coord i = 0 := by + fin_cases i <;> rfl + +/-- Weights add coordinatewise. With `zero_coord` this says `coord` is additive, which is + what makes gauge weights add under multiplication. -/ lemma GaugeWeight.coord_add (w w' : GaugeWeight) (i : Fin 4) : (w + w').coord i = w.coord i + w'.coord i := by fin_cases i <;> rfl +/-- **A gauge weight is determined by its four exponents.** This is what lets a weight be + recovered from the characters by which the torus acts; see `piece_eq_inf`. -/ +lemma GaugeWeight.coord_injective : Function.Injective GaugeWeight.coord := by + rintro ⟨a, b, c, e⟩ ⟨a', b', c', e'⟩ h + have h0 := congrFun h 0 + have h1 := congrFun h 1 + have h2 := congrFun h 2 + have h3 := congrFun h 3 + simp only [GaugeWeight.coord_zero, GaugeWeight.coord_one, GaugeWeight.coord_two, + GaugeWeight.coord_three] at h0 h1 h2 h3 + subst h0 + subst h1 + subst h2 + subst h3 + rfl + /-- `exp i` is nonzero. -/ lemma expI_ne_zero : ((expI : ℂ)) ≠ 0 := fun h0 => by have h := Unitary.mul_star_self_of_mem expI.2 @@ -137,30 +179,47 @@ lemma expI_ne_zero : ((expI : ℂ)) ≠ 0 := fun h0 => by exact zero_ne_one h /-! - ## C. Gauge weight decompositions +A gauge weight decomposition is the weight-space decomposition of a representation, with two +differences. It is recorded rather than derived, since the submodules of interest are spans of +explicitly given operators whose charges are read off directly, and it is required only to +cover `V`. Independence of the pieces is not part of the data, because it is automatic, as +section F shows. + +Multiplicativity of the representation is named by `IsMulRep` and stored in the `rep_mul` +field, so that a decomposition of a product can be assembled from decompositions of the factors +with no further input. `copy` moves a decomposition across an equality of submodules, needed +because a submodule arising in practice is usually only propositionally the one for which a +decomposition was recorded. -/ variable {B : Type*} [Ring B] [Algebra ℂ B] -/-- A **gauge weight decomposition** of a submodule `V`: a finitely supported family of - subspaces of pure gauge weight whose supremum is `V`. Purity is recorded against the four - commuting torus generators simultaneously. +/-- **A representation acts by algebra maps**, respecting multiplication. This is the + hypothesis under which charges are additive. -/ +abbrev IsMulRep (rep : Representation ℂ GaugeGroupI B) : Prop := + ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y - This is a class: a decomposition of a given submodule is registered once and found by - instance synthesis, and `mul` is itself an instance, so a decomposition of a product is - assembled automatically. The pieces do not depend on which decomposition is found — see - `piece_eq_inf` and `piece_congr`. -/ +/-- A representation that respects multiplication respects the unit, since `g` is invertible + and so `rep g 1` is cancellable. -/ +lemma IsMulRep.map_one {rep : Representation ℂ GaugeGroupI B} (hmul : IsMulRep rep) + (g : GaugeGroupI) : rep g 1 = 1 := by + have h1 := hmul g 1 (rep g⁻¹ 1) + rw [one_mul, rep.self_inv_apply, mul_one] at h1 + exact h1.symm + +/-- A **gauge weight decomposition** of a submodule `V`, a finitely supported family of + subspaces of pure gauge weight whose supremum is `V`. Purity is recorded against the four + commuting torus generators simultaneously. -/ class GaugeWeightDecomposition (rep : Representation ℂ GaugeGroupI B) (V : Submodule ℂ B) where /-- The piece of gauge weight `w`. -/ piece : GaugeWeight → Submodule ℂ B /-- The finite set of gauge weights that occur. -/ supp : Finset GaugeWeight - /-- Gauge transformations act by algebra maps. This is a property of `rep` alone; it is - carried here so that `mul` can be an instance. -/ - rep_mul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y + /-- Gauge transformations act by algebra maps. -/ + rep_mul : IsMulRep rep /-- Each piece is of pure gauge weight, as seen by all four torus generators. -/ piece_le : ∀ w, ∀ x, x ∈ piece w → ∀ i, rep (gaugeTorusGen i) x = ((expI : ℂ) ^ w.coord i) • x @@ -180,6 +239,8 @@ lemma piece_le_eigenspace (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) d.piece w ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) ((expI : ℂ) ^ w.coord i) := fun _ hy => Module.End.mem_eigenspace_iff.mpr (d.piece_le w _ hy i) +/-- A weight outside the support has vanishing piece. This is the `piece_eq_bot` field, in + the form a `simp` set can use to discard the absent weights of a computed product. -/ lemma piece_eq_zero_of_not_mem_supp (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) (hw : w ∉ d.supp) : d.piece w = ⊥ := d.piece_eq_bot w hw @@ -199,13 +260,21 @@ lemma copy_piece (d : GaugeWeightDecomposition rep V) (W : Submodule ℂ B) (hW (copy d W hW).piece = d.piece := rfl /-! - ## D. Joins +If `V` and `V'` are decomposed then so is their join `V ⊔ V'`, one weight at a time. Its +weight-`w` piece is the join of the two weight-`w` pieces, and its support is the union of the +supports. A vector of the join need not have definite charge, but it is a sum of vectors that +do, which is all a decomposition claims. + +The binary case `sup`, the empty case `bot`, a finite indexed family `iSup` and a join over a +proposition `iSupProp` are all the same construction. Multiplicativity of `rep` is recovered +from a summand where there is one and supplied as an argument where there is not, since `bot` +decomposes the zero submodule and the indexed forms may range over an empty family. -/ -/-- The join of two gauge weight decompositions: the pieces, supports and suprema all - combine weightwise, decomposing `V ⊔ V'`. -/ +/-- The join of two gauge weight decompositions, decomposing `V ⊔ V'`. Pieces and supports + combine one weight at a time. -/ @[implicit_reducible] noncomputable instance sup [d : GaugeWeightDecomposition rep V] [d' : GaugeWeightDecomposition rep V'] : GaugeWeightDecomposition rep (V ⊔ V') where @@ -227,7 +296,7 @@ lemma sup_piece [GaugeWeightDecomposition rep V] [GaugeWeightDecomposition rep V /-- The zero submodule carries the empty decomposition. -/ @[implicit_reducible] -def bot (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : +def bot (hmul : IsMulRep rep) : GaugeWeightDecomposition rep (⊥ : Submodule ℂ B) where piece _ := ⊥ supp := ∅ @@ -240,19 +309,19 @@ def bot (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g iSup_piece := by simp @[simp] -lemma bot_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) +lemma bot_piece (hmul : IsMulRep rep) (w : GaugeWeight) : (bot hmul).piece w = ⊥ := rfl @[simp] -lemma bot_supp (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : +lemma bot_supp (hmul : IsMulRep rep) : (bot hmul).supp = ∅ := rfl -/-- **An indexed join of decompositions.** A family of decompositions indexed by a finite - type decomposes the supremum: the pieces are joined weightwise and the supports are - united. This is the arbitrary-arity form of `sup`. -/ +/-- **An indexed join of decompositions.** A family of decompositions indexed by a finite type + decomposes the join, its pieces joined and its supports united one weight at a time. This is + the arbitrary-arity form of `sup`. -/ @[implicit_reducible] noncomputable def iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (hmul : IsMulRep rep) (d : (a : ι) → GaugeWeightDecomposition rep (V a)) : GaugeWeightDecomposition rep (⨆ a, V a) where piece w := ⨆ a, (d a).piece w @@ -270,12 +339,13 @@ noncomputable def iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} @[simp] lemma piece_iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (hmul : IsMulRep rep) (d : (a : ι) → GaugeWeightDecomposition rep (V a)) (w : GaugeWeight) : (iSup hmul d).piece w = ⨆ a, (d a).piece w := rfl -lemma supp_iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) +/-- The support of an indexed join is the union of the supports. -/ +lemma iSup_supp {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} + (hmul : IsMulRep rep) (d : (a : ι) → GaugeWeightDecomposition rep (V a)) : (iSup hmul d).supp = Finset.univ.biUnion fun a => (d a).supp := rfl @@ -284,24 +354,32 @@ lemma supp_iSup {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} proof, so the decomposition of `V` may itself depend on `p`. -/ @[implicit_reducible] noncomputable def iSupProp {p : Prop} [Decidable p] - (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (hmul : IsMulRep rep) (d : p → GaugeWeightDecomposition rep V) : GaugeWeightDecomposition rep (⨆ _ : p, V) := if hp : p then copy (d hp) _ (iSup_pos hp) else copy (bot hmul) _ (iSup_neg hp) /-! - ## E. Products +Charges add when operators are multiplied, and this section is where we prove this fact. +If the torus acts on `x` by the character of `w₁` and on `y` by the character of `w₂` then, +because `rep` respects multiplication, it acts on `x * y` by the product of the two characters, +which additivity of `GaugeWeight.coord` identifies with the character of `w₁ + w₂`. So the +weight-`w` piece of `V * V'` is spanned by products of pieces whose weights sum to `w`, and the +support of a product is the sumset of the supports. + +The unit and the powers belong here for the same reason. The identity of the algebra is a gauge +singlet and so has weight zero, and `V ^ k` is decomposed by iterating the product from it. + +The defining formula `mul_piece` joins over all pairs of weights in `ℤ⁴ × ℤ⁴`. Only finitely +many weights occur, so one of the two can always be eliminated against a support, and +`mul_piece_eq_sub`, `mul_piece_eq_sub'` and `mul_piece_of_supp` do this against the left +factor, the right factor and a supplied finite set. The resulting finite joins are what make +the weight pieces of an iterated product computable. -/ -/-- The product of two gauge weight decompositions: gauge weights **add** under - multiplication, so the weight-`w` piece of `V * V'` is spanned by the products of pieces - whose weights sum to `w`, and the support is the pointwise sum of the supports. - - Multiplicativity of `rep` comes from the `rep_mul` field, which is why this can be an - instance: a decomposition of a product is assembled from decompositions of the factors - without further input. -/ +/-- The product of two gauge weight decompositions, decomposing `V * V'`. -/ @[implicit_reducible] noncomputable instance mul [d : GaugeWeightDecomposition rep V] [d' : GaugeWeightDecomposition rep V'] : @@ -339,14 +417,19 @@ noncomputable instance mul [d : GaugeWeightDecomposition rep V] exact le_iSup_of_le (w₁ + w₂) (le_iSup_of_le w₁ (le_iSup_of_le w₂ (le_iSup_of_le rfl le_rfl))) +/-- The support of a product is the pointwise sum of the supports. -/ lemma mul_supp [GaugeWeightDecomposition rep V] [GaugeWeightDecomposition rep V'] : supp rep (V * V') = supp rep V + supp rep V' := rfl +/-- **Weights add under multiplication.** The weight-`w` piece of a product is spanned by the + products of pieces whose weights sum to `w`. -/ lemma mul_piece [GaugeWeightDecomposition rep V] [GaugeWeightDecomposition rep V'] (w : GaugeWeight) : piece rep (V * V') w = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, piece rep V w₁ * piece rep V' w₂ := rfl +/-- The product formula with the second weight eliminated against the support of the left + factor, the right factor being read at the complement `w - w₁`. -/ lemma mul_piece_eq_sub [d : GaugeWeightDecomposition rep V] [d' : GaugeWeightDecomposition rep V'] (w : GaugeWeight) : piece rep (V * V') w = ⨆ w₁ ∈ supp rep V, piece rep V w₁ * piece rep V' (w - w₁) := by @@ -360,6 +443,7 @@ lemma mul_piece_eq_sub [d : GaugeWeightDecomposition rep V] · exact iSup₂_le fun w₁ _ => le_iSup_of_le w₁ (le_iSup_of_le (w - w₁) (le_iSup_of_le (add_sub_cancel w₁ w) le_rfl)) +/-- The mirror of `mul_piece_eq_sub`, joining over the weights of the right factor. -/ lemma mul_piece_eq_sub' [d : GaugeWeightDecomposition rep V] [d' : GaugeWeightDecomposition rep V'] (w : GaugeWeight) : piece rep (V * V') w = ⨆ w₂ ∈ supp rep V', piece rep V (w - w₂) * piece rep V' w₂ := by @@ -373,27 +457,19 @@ lemma mul_piece_eq_sub' [d : GaugeWeightDecomposition rep V] · exact iSup₂_le fun w₂ _ => le_iSup_of_le (w - w₂) (le_iSup_of_le w₂ (le_iSup_of_le (sub_add_cancel w w₂) le_rfl)) - -/-- The unit submodule is of weight zero: the identity of `B` is a gauge singlet, provided - the representation preserves the unit. -/ +/-- The decomposition of the unit submodule, concentrated at weight zero. -/ @[implicit_reducible] -noncomputable def one (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : +noncomputable def one (hmul : IsMulRep rep) : GaugeWeightDecomposition rep (1 : Submodule ℂ B) where piece w := if w = 0 then 1 else ⊥ supp := {0} rep_mul := hmul piece_le := by - have hone : ∀ g : GaugeGroupI, rep g 1 = 1 := by - intro g - have h1 := hmul g 1 (rep g⁻¹ 1) - rw [one_mul, rep.self_inv_apply, mul_one] at h1 - exact h1.symm intro w x hx i rcases eq_or_ne w 0 with rfl | hw · rw [if_pos rfl, Submodule.one_eq_span, Submodule.mem_span_singleton] at hx obtain ⟨c, rfl⟩ := hx - have h0 : GaugeWeight.coord 0 i = 0 := by fin_cases i <;> rfl - rw [map_smul, hone, h0, zpow_zero, one_smul] + rw [map_smul, hmul.map_one, GaugeWeight.zero_coord, zpow_zero, one_smul] · rw [if_neg hw, Submodule.mem_bot] at hx subst hx simp @@ -405,10 +481,13 @@ noncomputable def one (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = r · rw [if_neg hw] exact bot_le -/-- When the right factor vanishes off a finite set `S` of weights, the weight-`w` piece of - a product collapses to a join over `S`, pairing `w - v` against `v`. This is what makes the - pieces of an iterated product computable: the double `⨆` over all of `ℤ⁴` becomes a finite - join. -/ +@[simp] +lemma one_piece (hmul : IsMulRep rep) + (w : GaugeWeight) : + (one (B := B) (rep := rep) hmul).piece w = if w = 0 then 1 else ⊥ := rfl + +/-- When the right factor vanishes off a finite set `S` of weights, the weight-`w` piece of a + product collapses to a join over `S`, pairing `w - v` against `v`. -/ lemma mul_piece_of_supp [d : GaugeWeightDecomposition rep V] [d' : GaugeWeightDecomposition rep V'] (S : Finset GaugeWeight) (hS : ∀ v ∉ S, piece rep V' v = ⊥) (w : GaugeWeight) : @@ -423,13 +502,8 @@ lemma mul_piece_of_supp [d : GaugeWeightDecomposition rep V] · exact iSup₂_le fun v _ => le_iSup_of_le (w - v) (le_iSup_of_le v (le_iSup_of_le (sub_add_cancel w v) le_rfl)) -@[simp] -lemma one_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) - (w : GaugeWeight) : - (one (B := B) (rep := rep) hmul).piece w = if w = 0 then 1 else ⊥ := rfl - -/-- Powers of a decomposed submodule: gauge weights add, so `V ^ k` inherits a - decomposition, built by iterating `mul` from `one`. -/ +/-- Powers of a decomposed submodule. Gauge weights add, so `V ^ k` inherits a decomposition + by iterating `mul` from `one`. -/ @[implicit_reducible] noncomputable instance pow [d : GaugeWeightDecomposition rep V] : (k : ℕ) → GaugeWeightDecomposition rep (V ^ k) @@ -440,13 +514,15 @@ noncomputable instance pow [d : GaugeWeightDecomposition rep V] : lemma pow_zero_piece [d : GaugeWeightDecomposition rep V] (w : GaugeWeight) : (pow (d := d) 0).piece w = if w = 0 then 1 else ⊥ := rfl +/-- One step of the power decomposition. Since `V ^ (k + 1)` is `V ^ k` times `V`, its pieces + are given by the product formula against the pieces of `V`. -/ @[simp] lemma pow_succ_piece [d : GaugeWeightDecomposition rep V] (k : ℕ) (w : GaugeWeight) : (pow (d := d) (k + 1)).piece w = ⨆ w₁, ⨆ w₂, ⨆ _ : w₁ + w₂ = w, (pow (d := d) k).piece w₁ * piece rep V w₂ := rfl -/-- The `mul_piece_of_supp` collapse, applied to a power: only the weights in `S` that the - decomposition actually carries contribute at each step. -/ +/-- The `mul_piece_of_supp` collapse applied to a power, so that only the weights in `S` + contribute at each step. -/ lemma pow_succ_piece_of_supp [d : GaugeWeightDecomposition rep V] (S : Finset GaugeWeight) (hS : ∀ v ∉ S, piece rep V v = ⊥) (k : ℕ) (w : GaugeWeight) : (pow (d := d) (k + 1)).piece w @@ -454,19 +530,30 @@ lemma pow_succ_piece_of_supp [d : GaugeWeightDecomposition rep V] (S : Finset Ga mul_piece_of_supp (d := pow (d := d) k) (d' := d) S hS w /-! - ## F. Invariants +A gauge-invariant element is fixed by the torus in particular, so it ought to have zero weight. +Making that an argument requires knowing the pieces are independent. Along one generator this +is immediate, since the pieces sit in eigenspaces of a single operator at the eigenvalues +`(exp i) ^ k`, pairwise distinct because `exp i` is not a root of unity, and eigenspaces at +distinct eigenvalues meet trivially. At rank four no single generator separates the weights, so +the argument is made one generator at a time. + +What this yields is stronger than the statement about invariants. `piece_eq_inf` identifies the +weight-`w` piece with the intersection of `V` and the joint eigenspace of the four generators, +so the pieces depend only on `V` and the representation. + +Zero weight is necessary but not sufficient for invariance. The torus is abelian and sees only +characters, so it cannot distinguish a true singlet from the neutral component of a higher +multiplet. Both `H†H` and `H†σ³H` carry zero weight, and only the first is gauge invariant. So +what passes `mem_zero_of_invariant` must still be checked. `SU2PermDecomposition` narrows the +`SU(2)` factor further, but no grading closes the gap, since a grading sees only the abelian +subgroup generated by the elements it uses. -/ -/-- **The one-generator refinement step.** If a family of subspaces is graded along a single - torus generator — the value of `f` at an index giving the eigenvalue exponent — then a - vector fixed by that generator and lying in the span of the family already lies in the span - of just those pieces on which `f` vanishes. - - This is the whole content of `mem_zero_of_invariant`, applied once per generator. At rank - four no single generator separates the gauge weights, so the coordinates have to be peeled - off one at a time rather than all at once. -/ +/-- **The one-generator refinement step.** A vector in the span of a family graded along a + single operator, and an eigenvector of that operator at exponent `n`, lies in the span of + just those pieces at exponent `n`. -/ lemma mem_iSup_of_eigenvector {ι : Type*} {T : Module.End ℂ B} {p : ι → Submodule ℂ B} {f : ι → ℤ} (hp : ∀ j, p j ≤ Module.End.eigenspace T ((expI : ℂ) ^ f j)) {x : B} (hx : x ∈ ⨆ j, p j) {n : ℤ} (hT : T x = ((expI : ℂ) ^ n) • x) : @@ -489,42 +576,56 @@ lemma mem_iSup_of_eigenvector {ι : Type*} {T : Module.End ℂ B} {p : ι → Su exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) exact key ⟨hQsup ▸ hx, Module.End.mem_eigenspace_iff.mpr hT⟩ -/-- **The pieces are canonical.** The weight-`w` piece is exactly the part of `V` on which - the four torus generators act by the weight-`w` characters. In particular it does not - depend on which decomposition of `V` it was computed from — see `piece_congr`. -/ +/-- **The many-generator refinement.** The same for a finite family of operators. A vector in + the span of the family and an eigenvector of every operator lies in the span of just those + pieces whose exponents match throughout. -/ +lemma mem_iSup_of_forall_eigenvector {ι κ : Type*} [Fintype κ] [DecidableEq κ] + {T : κ → Module.End ℂ B} {p : ι → Submodule ℂ B} {f : ι → κ → ℤ} + (hp : ∀ j k, p j ≤ Module.End.eigenspace (T k) ((expI : ℂ) ^ f j k)) + {x : B} (hx : x ∈ ⨆ j, p j) {n : κ → ℤ} + (hT : ∀ k, T k x = ((expI : ℂ) ^ n k) • x) : + x ∈ ⨆ j, ⨆ _ : f j = n, p j := by + have key : ∀ S : Finset κ, x ∈ ⨆ j, ⨆ _ : ∀ k ∈ S, f j k = n k, p j := by + intro S + induction S using Finset.induction_on with + | empty => simpa using hx + | @insert k S hk ih => + have hstep := mem_iSup_of_eigenvector (T := T k) (f := fun j => f j k) + (p := fun j => ⨆ _ : ∀ k' ∈ S, f j k' = n k', p j) + (fun j => iSup_le fun _ => hp j k) ih (hT k) + have hle : (⨆ j, ⨆ _ : f j k = n k, ⨆ _ : ∀ k' ∈ S, f j k' = n k', p j) + ≤ ⨆ j, ⨆ _ : ∀ k' ∈ insert k S, f j k' = n k', p j := by + refine iSup_le fun j => iSup_le fun h1 => iSup_le fun h2 => + le_iSup_of_le j (le_iSup_of_le ?_ le_rfl) + intro k' hk' + rcases Finset.mem_insert.mp hk' with rfl | hk'S + · exact h1 + · exact h2 k' hk'S + exact hle hstep + have hle : (⨆ j, ⨆ _ : ∀ k ∈ (Finset.univ : Finset κ), f j k = n k, p j) + ≤ ⨆ j, ⨆ _ : f j = n, p j := + iSup_le fun j => iSup_le fun hj => + le_iSup_of_le j (le_iSup_of_le (funext fun k => hj k (Finset.mem_univ k)) le_rfl) + exact hle (key Finset.univ) + +/-- **The pieces are canonical.** The weight-`w` piece is exactly the part of `V` on which the + four torus generators act by the weight-`w` characters. See `piece_congr`. -/ lemma piece_eq_inf (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : d.piece w = V ⊓ ⨅ i, Module.End.eigenspace (rep (gaugeTorusGen i)) ((expI : ℂ) ^ w.coord i) := by refine le_antisymm (le_inf ((le_iSup d.piece w).trans (le_of_eq d.iSup_piece)) (le_iInf fun i => d.piece_le_eigenspace w i)) fun x hx => ?_ - obtain ⟨hxV, hxE'⟩ := hx - have hxE : ∀ i : Fin 4, x ∈ Module.End.eigenspace (rep (gaugeTorusGen i)) - ((expI : ℂ) ^ w.coord i) := fun i => Submodule.mem_iInf _ |>.mp hxE' i - have s0 : x ∈ ⨆ w', d.piece w' := by rw [d.iSup_piece]; exact hxV - have s1 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 0) - (fun w' => d.piece_le_eigenspace w' 0) s0 (Module.End.mem_eigenspace_iff.mp (hxE 0)) - have s2 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 1) - (fun w' => iSup_le fun _ => d.piece_le_eigenspace w' 1) s1 - (Module.End.mem_eigenspace_iff.mp (hxE 1)) - have s3 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 2) - (fun w' => iSup_le fun _ => iSup_le fun _ => d.piece_le_eigenspace w' 2) s2 - (Module.End.mem_eigenspace_iff.mp (hxE 2)) - have s4 := mem_iSup_of_eigenvector (f := fun w' : GaugeWeight => w'.coord 3) - (fun w' => iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => - d.piece_le_eigenspace w' 3) s3 (Module.End.mem_eigenspace_iff.mp (hxE 3)) - have hfin : ∀ w' : GaugeWeight, (⨆ _ : w'.coord 3 = w.coord 3, ⨆ _ : w'.coord 2 = w.coord 2, - ⨆ _ : w'.coord 1 = w.coord 1, ⨆ _ : w'.coord 0 = w.coord 0, d.piece w') ≤ d.piece w := by - rintro ⟨a, b, c, e⟩ - obtain ⟨a', b', c', e'⟩ := w - refine iSup_le fun h3 => iSup_le fun h2 => iSup_le fun h1 => iSup_le fun h0 => ?_ - simp only [GaugeWeight.coord_zero, GaugeWeight.coord_one, GaugeWeight.coord_two, - GaugeWeight.coord_three] at h0 h1 h2 h3 - subst h0 - subst h1 - subst h2 - subst h3 - exact le_rfl - exact iSup_le hfin s4 + obtain ⟨hxV, hxE⟩ := hx + have hx0 : x ∈ ⨆ w' : GaugeWeight, d.piece w' := by rw [d.iSup_piece]; exact hxV + have hspan : x ∈ ⨆ w' : GaugeWeight, ⨆ _ : w'.coord = w.coord, d.piece w' := + mem_iSup_of_forall_eigenvector (T := fun i => rep (gaugeTorusGen i)) (p := d.piece) + (f := fun w' : GaugeWeight => w'.coord) (n := w.coord) + (fun w' i => d.piece_le_eigenspace w' i) hx0 + (fun i => Module.End.mem_eigenspace_iff.mp (Submodule.mem_iInf _ |>.mp hxE i)) + have hle : (⨆ w' : GaugeWeight, ⨆ _ : w'.coord = w.coord, d.piece w') ≤ d.piece w := + iSup_le fun w' => iSup_le fun hw' => + le_of_eq (congrArg d.piece (GaugeWeight.coord_injective hw')) + exact hle hspan /-- **The pieces depend only on the submodule.** Two decompositions of equal submodules have the same pieces, so a computation of `piece` may be carried along any equality of @@ -535,35 +636,13 @@ lemma piece_congr {W : Submodule ℂ B} [d : GaugeWeightDecomposition rep V] rw [d.piece_eq_inf, d'.piece_eq_inf, hVW] /-- **A gauge-invariant element sits in the zero-weight piece.** Only invariance under the - four torus generators is used. -/ + four torus generators is used. The converse is false; see the warning in section F. -/ lemma mem_zero_of_invariant (d : GaugeWeightDecomposition rep V) {x : B} (hx : x ∈ V) (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ d.piece 0 := by - have s0 : x ∈ ⨆ w, d.piece w := by rw [d.iSup_piece]; exact hx - have hfix : ∀ i : Fin 4, rep (gaugeTorusGen i) x = ((expI : ℂ) ^ (0 : ℤ)) • x := by - intro i - rw [zpow_zero, one_smul] - exact hV _ - have s1 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 0) - (fun w => d.piece_le_eigenspace w 0) s0 (hfix 0) - have s2 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 1) - (fun w => iSup_le fun _ => d.piece_le_eigenspace w 1) s1 (hfix 1) - have s3 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 2) - (fun w => iSup_le fun _ => iSup_le fun _ => d.piece_le_eigenspace w 2) s2 (hfix 2) - have s4 := mem_iSup_of_eigenvector (f := fun w : GaugeWeight => w.coord 3) - (fun w => iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => - d.piece_le_eigenspace w 3) s3 (hfix 3) - have hfin : ∀ w : GaugeWeight, (⨆ _ : w.coord 3 = 0, ⨆ _ : w.coord 2 = 0, - ⨆ _ : w.coord 1 = 0, ⨆ _ : w.coord 0 = 0, d.piece w) ≤ d.piece 0 := by - rintro ⟨a, b, c, e⟩ - refine iSup_le fun h3 => iSup_le fun h2 => iSup_le fun h1 => iSup_le fun h0 => ?_ - simp only [GaugeWeight.coord_zero, GaugeWeight.coord_one, GaugeWeight.coord_two, - GaugeWeight.coord_three] at h0 h1 h2 h3 - subst h0 - subst h1 - subst h2 - subst h3 - exact le_rfl - exact iSup_le hfin s4 + rw [d.piece_eq_inf] + refine ⟨hx, Submodule.mem_iInf _ |>.mpr fun i => ?_⟩ + rw [Module.End.mem_eigenspace_iff, GaugeWeight.zero_coord, zpow_zero, one_smul] + exact hV _ end GaugeWeightDecomposition end StandardModel From 7886d978e39f72173944de58e74afe6cd7ee467d Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 25 Aug 2026 22:19:42 +0400 Subject: [PATCH 198/254] refactor(StandardModel): drop the two decompositions gauge weights already cover --- Physlib.lean | 2 - .../GaugeGroup/GaugeWeightDecomposition.lean | 110 +++++++++-- .../GaugeGroup/HyperchargeDecomposition.lean | 173 ----------------- .../GaugeGroup/IsospinDecomposition.lean | 183 ------------------ .../GaugeGroup/SU2PermDecomposition.lean | 16 +- .../HiggsBoson/AlgebraValued/Basic.lean | 2 - 6 files changed, 100 insertions(+), 386 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean diff --git a/Physlib.lean b/Physlib.lean index 298185dcf..ad925a4bb 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -228,8 +228,6 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Lorent public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition -public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index 77e6675f1..bcbb28e0c 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -5,7 +5,9 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition +public import Physlib.Particles.StandardModel.Basic +public import Mathlib.LinearAlgebra.Eigenspace.Basic +public import Mathlib.Analysis.Real.Pi.Irrational /-! # Gauge weight decompositions @@ -46,7 +48,7 @@ be confined to the zero-weight piece. ## iii. Table of contents -- A. The colour torus generators +- A. The scalar `exp i` and the torus generators - B. The four torus generators and gauge weights - C. Gauge weight decompositions - D. Joins @@ -62,17 +64,67 @@ namespace StandardModel open Matrix Pointwise /-! -## A. The colour torus generators +## A. The scalar `exp i` and the torus generators -The maximal torus of `SU(3)` is two-dimensional, so colour is a two-component charge and two -generators are needed to measure it. We take the diagonal elements `diag (exp i, exp (-i), 1)` -and `diag (1, exp i, exp (-i))`, which lie in `SU(3)` because each diagonal entry has modulus -one and the three entries multiply to one. +Every charge here is measured by one scalar. The unit complex number `exp i` has infinite +order, since `π` is irrational, so its integer powers are pairwise distinct and a single +element of the torus already separates all the weights in a given direction. -The generators are elements of the group and the purity of a weight space is recorded by -a character equation `rep g x = c • x`. +The torus generators are built by placing `exp i` and its inverse on a diagonal. The maximal +torus of `SU(3)` is two-dimensional, so colour is a two-component charge and needs the two +elements `diag (exp i, exp (-i), 1)` and `diag (1, exp i, exp (-i))`. Weak isospin needs one, +`diag (exp i, exp (-i))`. Each lies in its special unitary group because the diagonal entries +have modulus one and multiply to one. Hypercharge needs no matrix, since its factor of the +gauge group is already the unit circle. + +The generators are elements of the group, and the purity of a weight space is recorded by a +character equation `rep g x = c • x`. -/ +/-- The unitary scalar `exp i`, a point of the unit circle of infinite order. -/ +noncomputable def expI : unitary ℂ := + ⟨Complex.exp Complex.I, by + have hstar : star (Complex.exp Complex.I) = Complex.exp (-Complex.I) := by + rw [show star (Complex.exp Complex.I) + = (starRingEnd ℂ) (Complex.exp Complex.I) from rfl, ← Complex.exp_conj, + Complex.conj_I] + constructor + · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] + · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero]⟩ + +/-- The powers of `exp i` are pairwise distinct, by the irrationality of `π`. -/ +lemma expI_zpow_injective : Function.Injective fun n : ℤ => ((expI : ℂ) ^ n) := by + intro a b hab + simp only [show ((expI : ℂ)) = Complex.exp Complex.I from rfl, + ← Complex.exp_int_mul] at hab + obtain ⟨k, hk⟩ := Complex.exp_eq_exp_iff_exists_int.mp hab + have hℂ : ((a : ℂ)) = b + k * (2 * (Real.pi : ℂ)) := by + refine mul_right_cancel₀ Complex.I_ne_zero ?_ + rw [hk] + ring + have hℝ : ((a : ℝ)) = b + k * (2 * Real.pi) := by + have h := congrArg Complex.re hℂ + simpa using h + rcases eq_or_ne k 0 with rfl | hk0 + · exact_mod_cast (by simpa using hℝ : ((a : ℝ)) = b) + · exfalso + refine irrational_pi ⟨(a - b) / (2 * k), ?_⟩ + have h2k : ((2 * k : ℝ)) ≠ 0 := + mul_ne_zero two_ne_zero (Int.cast_ne_zero.mpr hk0) + push_cast + rw [div_eq_iff h2k] + linarith [hℝ] + +/-- `exp i` is nonzero. -/ +lemma expI_ne_zero : ((expI : ℂ)) ≠ 0 := fun h0 => by + have h := Unitary.mul_star_self_of_mem expI.2 + rw [h0, zero_mul] at h + exact zero_ne_one h + +/-- The inverse of `exp i` is its star. -/ +lemma expI_inv_eq_star : ((expI : ℂ))⁻¹ = star (expI : ℂ) := + inv_eq_of_mul_eq_one_right (Unitary.mul_star_self_of_mem expI.2) + /-- The first colour torus generator, `diag (exp i, exp (-i), 1)`. -/ noncomputable def su3ExpIOne : specialUnitaryGroup (Fin 3) ℂ := ⟨!![(expI : ℂ), 0, 0; 0, star (expI : ℂ), 0; 0, 0, 1], by @@ -105,12 +157,40 @@ noncomputable def su3ExpITwo : specialUnitaryGroup (Fin 3) ℂ := Matrix.conjTranspose_apply, hms, hsm] · simp [Matrix.det_fin_three, hms]⟩ +/-- The `SU(2)` torus element, `diag (exp i, exp (-i))`. -/ +noncomputable def su2ExpI : specialUnitaryGroup (Fin 2) ℂ := + ⟨!![(expI : ℂ), 0; 0, star (expI : ℂ)], by + have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := + Unitary.mul_star_self_of_mem expI.2 + have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := + Unitary.star_mul_self_of_mem expI.2 + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply, hms, hsm] + · simp [Matrix.det_fin_two_of, hms]⟩ + +/-- The underlying matrix of the `SU(2)` torus element. -/ +lemma su2ExpI_coe : + (su2ExpI : specialUnitaryGroup (Fin 2) ℂ).1 = !![(expI : ℂ), 0; 0, star (expI : ℂ)] := rfl + +/-- The inverse torus element is `diag (exp (-i), exp i)`, so on a doublet the two components + are scaled by the reciprocal characters. -/ +lemma su2ExpI_inv_coe : + (su2ExpI⁻¹ : specialUnitaryGroup (Fin 2) ℂ).1 + = !![star (expI : ℂ), 0; 0, (expI : ℂ)] := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star, su2ExpI_coe] + ext a b + fin_cases a <;> fin_cases b <;> simp + /-! ## B. The four torus generators and gauge weights -Weights are measured against four chosen elements of the maximal torus, one element per direction, -collected in `gaugeTorusGen`. Four elements suffice because each has infinite order, so the -characters by which it acts on the weight spaces are already pairwise distinct. +Weights are measured against four chosen elements of the maximal torus, one element per +direction, collected in `gaugeTorusGen`. Four suffice because of the separation in section A. Both abelian charges are normalized to integers. Weak isospin is measured as `2T₃`, so the two components of a doublet carry weights `+1` and `-1`, and hypercharge as `6Y`, the smallest @@ -172,12 +252,6 @@ lemma GaugeWeight.coord_injective : Function.Injective GaugeWeight.coord := by subst h3 rfl -/-- `exp i` is nonzero. -/ -lemma expI_ne_zero : ((expI : ℂ)) ≠ 0 := fun h0 => by - have h := Unitary.mul_star_self_of_mem expI.2 - rw [h0, zero_mul] at h - exact zero_ne_one h - /-! ## C. Gauge weight decompositions diff --git a/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean deleted file mode 100644 index 4ef18c68c..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/HyperchargeDecomposition.lean +++ /dev/null @@ -1,173 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Mathlib.RepresentationTheory.Basic -public import Mathlib.LinearAlgebra.Eigenspace.Basic -public import Mathlib.Analysis.Real.Pi.Irrational -public import Mathlib.Analysis.SpecialFunctions.Complex.Log -/-! -# Hypercharge decompositions - -## i. Overview - -A **hypercharge decomposition** of a submodule `V` is a finitely supported family of -subspaces of pure hypercharge whose supremum is `V`. Charges are normalized as `6Y`. - -Purity is recorded against a *single* group element, the transformation by `exp i`: the -hypercharge-`k` piece consists of the vectors scaled by `(exp i) ^ k`. That is already -enough to make the pieces independent, with no assumption on the representation, because -`exp i` is not a root of unity — the powers `(exp i) ^ k` are pairwise distinct by the -irrationality of `π`, so the pieces sit in eigenspaces of one operator at pairwise -distinct eigenvalues. - -Exhibiting a decomposition therefore collapses the per-span boilerplate. The chief -consequence is that a gauge-invariant element of `V` lies in the hypercharge-zero piece; -only invariance under the transformation by `exp i` is used. - -## ii. Key results - -- `expI` : the unitary scalar `exp i`, a point of the unit circle of infinite order. -- `expI_zpow_injective` : the powers of `exp i` are pairwise distinct. -- `HyperchargeDecomposition` : a finitely supported family of pure-hypercharge subspaces - with supremum `V`. -- `HyperchargeDecomposition.sup` : two decompositions combine weightwise into one of - `V ⊔ V'`. -- `HyperchargeDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the - hypercharge-zero piece. - -## iii. Table of contents - -- A. The transformation by `exp i` -- B. Hypercharge decompositions -- C. Invariants - --/ - -@[expose] public section - -namespace StandardModel - -/-! - -## A. The transformation by `exp i` - --/ - -/-- The unitary scalar `exp i`: a point of the unit circle of infinite order. -/ -noncomputable def expI : unitary ℂ := - ⟨Complex.exp Complex.I, by - have hstar : star (Complex.exp Complex.I) = Complex.exp (-Complex.I) := by - rw [show star (Complex.exp Complex.I) - = (starRingEnd ℂ) (Complex.exp Complex.I) from rfl, ← Complex.exp_conj, - Complex.conj_I] - constructor - · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] - · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero]⟩ - -/-- The powers of `exp i` are pairwise distinct: `exp i` is not a root of unity, by the - irrationality of `π`. -/ -lemma expI_zpow_injective : Function.Injective fun n : ℤ => ((expI : ℂ) ^ n) := by - intro a b hab - simp only [show ((expI : ℂ)) = Complex.exp Complex.I from rfl, - ← Complex.exp_int_mul] at hab - obtain ⟨k, hk⟩ := Complex.exp_eq_exp_iff_exists_int.mp hab - have hℂ : ((a : ℂ)) = b + k * (2 * (Real.pi : ℂ)) := by - refine mul_right_cancel₀ Complex.I_ne_zero ?_ - rw [hk] - ring - have hℝ : ((a : ℝ)) = b + k * (2 * Real.pi) := by - have h := congrArg Complex.re hℂ - simpa using h - rcases eq_or_ne k 0 with rfl | hk0 - · exact_mod_cast (by simpa using hℝ : ((a : ℝ)) = b) - · exfalso - refine irrational_pi ⟨(a - b) / (2 * k), ?_⟩ - have h2k : ((2 * k : ℝ)) ≠ 0 := - mul_ne_zero two_ne_zero (Int.cast_ne_zero.mpr hk0) - push_cast - rw [div_eq_iff h2k] - linarith [hℝ] - -/-! - -## B. Hypercharge decompositions - --/ - -variable {B : Type*} [Ring B] [Algebra ℂ B] - -/-- A **hypercharge decomposition** of a submodule `V`: a finitely supported family of - subspaces of pure hypercharge whose supremum is `V`. Purity is recorded against the - single transformation by `exp i`, which is enough to force the pieces to be - independent. -/ -structure HyperchargeDecomposition (rep : Representation ℂ GaugeGroupI B) - (V : Submodule ℂ B) where - /-- The hypercharge `k` piece of the decomposition. -/ - piece : ℤ → Submodule ℂ B - /-- The finite set of hypercharges that occur. -/ - supp : Finset ℤ - /-- Each piece is of pure hypercharge, as seen by the transformation by `exp i`. -/ - piece_le : ∀ k, ∀ x, x ∈ piece k → rep ⟨1, 1, expI⟩ x = ((expI : ℂ) ^ k) • x - /-- Only the hypercharges in `supp` occur. -/ - piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ - /-- The pieces exhaust `V`. -/ - iSup_piece : (⨆ k, piece k) = V - -namespace HyperchargeDecomposition - -variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} - -/-- The hypercharge-`k` piece lies in the `(exp i) ^ k` eigenspace of the transformation - by `exp i`. This is `piece_le` phrased as an inequality of submodules. -/ -lemma piece_le_eigenspace (h : HyperchargeDecomposition rep V) (k : ℤ) : - h.piece k ≤ Module.End.eigenspace (rep ⟨1, 1, expI⟩) ((expI : ℂ) ^ k) := - fun _ hy => Module.End.mem_eigenspace_iff.mpr (h.piece_le k _ hy) - -/-- The join of two hypercharge decompositions: the pieces, supports and suprema all - combine weightwise, decomposing `V ⊔ V'`. -/ -noncomputable def sup (h : HyperchargeDecomposition rep V) (h' : HyperchargeDecomposition rep V') : - HyperchargeDecomposition rep (V ⊔ V') where - piece k := h.piece k ⊔ h'.piece k - supp := h.supp ∪ h'.supp - piece_le k x hx := - Module.End.mem_eigenspace_iff.mp - (sup_le (h.piece_le_eigenspace k) (h'.piece_le_eigenspace k) hx) - piece_eq_bot k hk := by - rw [Finset.mem_union, not_or] at hk - rw [h.piece_eq_bot k hk.1, h'.piece_eq_bot k hk.2, bot_sup_eq] - iSup_piece := by - rw [iSup_sup_eq, h.iSup_piece, h'.iSup_piece] - -/-! - -## C. Invariants - --/ - -/-- **A gauge-invariant element sits in the hypercharge-zero piece.** Only invariance - under the single `U(1)` transformation by `exp i` is used: the other pieces lie in - eigenspaces for the eigenvalues `(exp i) ^ k`, all distinct from `1`. -/ -lemma mem_zero_of_invariant (h : HyperchargeDecomposition rep V) {x : B} (hx : x ∈ V) - (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ h.piece 0 := by - have hdisj : Disjoint - (Module.End.eigenspace (rep ⟨1, 1, expI⟩) ((expI : ℂ) ^ (0 : ℤ))) - (⨆ k, ⨆ _ : k ≠ (0 : ℤ), h.piece k) := - (((Module.End.eigenspaces_iSupIndep (rep ⟨1, 1, expI⟩ : Module.End ℂ B)).comp - expI_zpow_injective) 0).mono_right (iSup₂_mono fun k _ => h.piece_le_eigenspace k) - have key : (⨆ k, h.piece k) - ⊓ Module.End.eigenspace (rep ⟨1, 1, expI⟩) ((expI : ℂ) ^ (0 : ℤ)) ≤ h.piece 0 := by - rw [iSup_split_single h.piece 0, sup_inf_assoc_of_le _ (h.piece_le_eigenspace 0)] - exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) - refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ - · rw [h.iSup_piece] - exact hx - · rw [zpow_zero, one_smul] - exact hV _ - -end HyperchargeDecomposition -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean deleted file mode 100644 index 2562a7caa..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/IsospinDecomposition.lean +++ /dev/null @@ -1,183 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition -/-! -# Isospin decompositions - -## i. Overview - -An **isospin decomposition** of a submodule `V` is a finitely supported family of subspaces -of pure weak isospin whose supremum is `V`. Weights are normalized as `2T₃`, so the two -components of a doublet carry weights `+1` and `-1`. - -This is the weak-isospin twin of `HyperchargeDecomposition`, and it is built the same way. -Purity is recorded against a single element of the maximal torus of the `SU(2)` factor, the -transformation by `diag (exp i, exp (-i))`: the isospin-`k` piece consists of the vectors -scaled by `(exp i) ^ k`. Because that element has infinite order, the eigenvalues -`(exp i) ^ k` are pairwise distinct — `expI_zpow_injective`, the very same lemma the -hypercharge file uses — so the pieces are independent with no assumption on the -representation. - -## ii. A warning: weight zero is weaker than invariance - -For the abelian `U(1)` factor, hypercharge zero *is* the charge singlet condition. For the -non-abelian `SU(2)` factor this fails: `mem_zero_of_invariant` below is a genuine one-way -implication and there is no converse. The torus does not separate the isospin singlet from -the neutral component of a higher isospin multiplet — `H†H` and `H†σ³H` both have isospin -weight zero, but only the first is invariant. - -So this file provides a *sieve*, not a characterization: it narrows the candidates for an -invariant, and the survivors must still be checked directly. The same caveat attaches to the -boost-weight grading in `Grading/BoostWeight.lean`, and for the same reason. - -## iii. Key results - -- `su2ExpI` : the `SU(2)` torus element `diag (exp i, exp (-i))`, of infinite order. -- `IsospinDecomposition` : a finitely supported family of pure-isospin subspaces with - supremum `V`. -- `IsospinDecomposition.sup` : two decompositions combine weightwise into one of `V ⊔ V'`. -- `IsospinDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the - isospin-zero piece. - -## iv. Table of contents - -- A. The `SU(2)` torus element -- B. Isospin decompositions -- C. Invariants - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix - -/-! - -## A. The `SU(2)` torus element - --/ - -/-- The `SU(2)` torus element `diag (exp i, exp (-i))`. Like `expI` it has infinite order, - so its powers are pairwise distinct and it separates the isospin weights. -/ -noncomputable def su2ExpI : specialUnitaryGroup (Fin 2) ℂ := - ⟨!![(expI : ℂ), 0; 0, star (expI : ℂ)], by - have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := - Unitary.mul_star_self_of_mem expI.2 - have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := - Unitary.star_mul_self_of_mem expI.2 - rw [Matrix.mem_specialUnitaryGroup_iff] - refine ⟨?_, ?_⟩ - · rw [Matrix.mem_unitaryGroup_iff] - ext a b - fin_cases a <;> fin_cases b <;> - simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, - Matrix.conjTranspose_apply, hms, hsm] - · simp [Matrix.det_fin_two_of, hms]⟩ - -/-- The inverse of `exp i` is its star. -/ -lemma expI_inv_eq_star : ((expI : ℂ))⁻¹ = star (expI : ℂ) := - inv_eq_of_mul_eq_one_right (Unitary.mul_star_self_of_mem expI.2) - -lemma su2ExpI_coe : - (su2ExpI : specialUnitaryGroup (Fin 2) ℂ).1 = !![(expI : ℂ), 0; 0, star (expI : ℂ)] := rfl - -/-- The inverse torus element is `diag (exp (-i), exp i)`: on a doublet the two components - are scaled by `(exp i) ^ (-1)` and `(exp i) ^ 1`. -/ -lemma su2ExpI_inv_coe : - (su2ExpI⁻¹ : specialUnitaryGroup (Fin 2) ℂ).1 - = !![star (expI : ℂ), 0; 0, (expI : ℂ)] := by - rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star, su2ExpI_coe] - ext a b - fin_cases a <;> fin_cases b <;> simp - -/-! - -## B. Isospin decompositions - --/ - -variable {B : Type*} [Ring B] [Algebra ℂ B] - -/-- An **isospin decomposition** of a submodule `V`: a finitely supported family of - subspaces of pure weak isospin whose supremum is `V`. Purity is recorded against the - single torus transformation `su2ExpI`, which is enough to force the pieces to be - independent. - - Isospin weight zero is necessary but *not* sufficient for `SU(2)` invariance; see the - warning in the module docstring. -/ -structure IsospinDecomposition (rep : Representation ℂ GaugeGroupI B) - (V : Submodule ℂ B) where - /-- The isospin `k` piece of the decomposition, at weight `k = 2T₃`. -/ - piece : ℤ → Submodule ℂ B - /-- The finite set of isospin weights that occur. -/ - supp : Finset ℤ - /-- Each piece is of pure isospin, as seen by the torus transformation `su2ExpI`. -/ - piece_le : ∀ k, ∀ x, x ∈ piece k → rep ⟨1, su2ExpI, 1⟩ x = ((expI : ℂ) ^ k) • x - /-- Only the isospin weights in `supp` occur. -/ - piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ - /-- The pieces exhaust `V`. -/ - iSup_piece : (⨆ k, piece k) = V - -namespace IsospinDecomposition - -variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} - -/-- The isospin-`k` piece lies in the `(exp i) ^ k` eigenspace of the torus transformation - `su2ExpI`. This is `piece_le` phrased as an inequality of submodules. -/ -lemma piece_le_eigenspace (h : IsospinDecomposition rep V) (k : ℤ) : - h.piece k ≤ Module.End.eigenspace (rep ⟨1, su2ExpI, 1⟩) ((expI : ℂ) ^ k) := - fun _ hy => Module.End.mem_eigenspace_iff.mpr (h.piece_le k _ hy) - -/-- The join of two isospin decompositions: the pieces, supports and suprema all combine - weightwise, decomposing `V ⊔ V'`. -/ -noncomputable def sup (h : IsospinDecomposition rep V) (h' : IsospinDecomposition rep V') : - IsospinDecomposition rep (V ⊔ V') where - piece k := h.piece k ⊔ h'.piece k - supp := h.supp ∪ h'.supp - piece_le k x hx := - Module.End.mem_eigenspace_iff.mp - (sup_le (h.piece_le_eigenspace k) (h'.piece_le_eigenspace k) hx) - piece_eq_bot k hk := by - rw [Finset.mem_union, not_or] at hk - rw [h.piece_eq_bot k hk.1, h'.piece_eq_bot k hk.2, bot_sup_eq] - iSup_piece := by - rw [iSup_sup_eq, h.iSup_piece, h'.iSup_piece] - -/-! - -## C. Invariants - --/ - -/-- **A gauge-invariant element sits in the isospin-zero piece.** Only invariance under the - single torus transformation `su2ExpI` is used: the other pieces lie in eigenspaces for the - eigenvalues `(exp i) ^ k`, all distinct from `1`. - - There is no converse: the isospin-zero piece is strictly larger than the `SU(2)` - invariants whenever a higher isospin multiplet occurs in `V`. -/ -lemma mem_zero_of_invariant (h : IsospinDecomposition rep V) {x : B} (hx : x ∈ V) - (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ h.piece 0 := by - have hdisj : Disjoint - (Module.End.eigenspace (rep ⟨1, su2ExpI, 1⟩) ((expI : ℂ) ^ (0 : ℤ))) - (⨆ k, ⨆ _ : k ≠ (0 : ℤ), h.piece k) := - (((Module.End.eigenspaces_iSupIndep (rep ⟨1, su2ExpI, 1⟩ : Module.End ℂ B)).comp - expI_zpow_injective) 0).mono_right (iSup₂_mono fun k _ => h.piece_le_eigenspace k) - have key : (⨆ k, h.piece k) - ⊓ Module.End.eigenspace (rep ⟨1, su2ExpI, 1⟩) ((expI : ℂ) ^ (0 : ℤ)) ≤ h.piece 0 := by - rw [iSup_split_single h.piece 0, sup_inf_assoc_of_le _ (h.piece_le_eigenspace 0)] - exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) - refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ - · rw [h.iSup_piece] - exact hx - · rw [zpow_zero, one_smul] - exact hV _ - -end IsospinDecomposition -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean index 4b62c3b46..db36f88c2 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean @@ -17,9 +17,9 @@ element `su2Perm = !![0, -1; 1, 0]`, -the Weyl reflection of `SU(2)`. On a doublet it sends `(a, b)` to `(-b, a)`: it exchanges -the two isospin components, and so exchanges the isospin weights `+1` and `-1` that -`IsospinDecomposition` records. +the Weyl reflection of `SU(2)`. On a doublet it sends `(a, b)` to `(-b, a)`, exchanging the +two isospin components and so exchanging the isospin weights `+1` and `-1` that the third +coordinate of a `GaugeWeight` records. `su2Perm` squares to `-1`, so it has order four in `SU(2)` and `rep gaugeSU2Perm` satisfies `T ^ 4 = 1`. Its spectrum is therefore contained in the fourth roots of unity, and the index @@ -37,12 +37,12 @@ those sectors, and so nothing to say about the Yukawa terms. ## ii. A warning: grade zero is weaker than invariance -Like the isospin grading, this is a *sieve* rather than a characterization: +Like the isospin weight, this is a *sieve* rather than a characterization. `mem_zero_of_invariant` says an invariant element has grade zero, and there is no converse. -What it buys is a genuine sharpening of `IsospinDecomposition`, whose weight-zero piece -cannot separate the isospin singlet from the neutral component of a higher multiplet: -`su2Perm` exchanges the two isospin components, so it acts on the isospin-zero subspace and -its grade-`2` part is thrown away by this sieve. +What it buys is a genuine sharpening of the isospin weight in `GaugeWeightDecomposition`, +whose weight-zero piece cannot separate the isospin singlet from the neutral component of a +higher multiplet. Because `su2Perm` exchanges the two isospin components it acts on the +isospin-zero subspace, and its grade-`2` part is thrown away by this sieve. The sieve cannot be pushed further by grading alone. A grading sees only the abelian subgroup generated by the elements it uses, and for any abelian subgroup of `SU(2)` the diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index 3df098519..aca6d8933 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -9,9 +9,7 @@ public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading -public import Physlib.Particles.StandardModel.GaugeGroup.HyperchargeDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition -public import Physlib.Particles.StandardModel.GaugeGroup.IsospinDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction From 3bc0de5e22172f933fd3e1a5b0d4de8320b23377 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 25 Aug 2026 22:19:49 +0400 Subject: [PATCH 199/254] refactor(StandardModel): change SU2PermDecomposition imports --- .../StandardModel/GaugeGroup/SU2PermDecomposition.lean | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean index db36f88c2..a665b0691 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean @@ -5,7 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.Basic +public import Mathlib.LinearAlgebra.Eigenspace.Basic /-! # `SU(2)` permutation decompositions From c30c90539a3f12d72698020da48dddbf914e5438 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 25 Aug 2026 22:19:50 +0400 Subject: [PATCH 200/254] refactor(StandardModel): three copies of the same membership proof become one --- .../GaugeGroup/GaugeWeightDecomposition.lean | 79 +++++++++---------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index bcbb28e0c..41f6cc3b4 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -44,7 +44,7 @@ be confined to the zero-weight piece. - `GaugeWeightDecomposition.mul` : weights add under multiplication, decomposing `V * V'`. - `GaugeWeightDecomposition.piece_eq_inf` : the pieces are cut out of `V` by the torus alone. - `GaugeWeightDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the - zero-weight piece. This is a sieve, not a characterization; see section F. + zero-weight piece. ## iii. Table of contents @@ -125,57 +125,54 @@ lemma expI_ne_zero : ((expI : ℂ)) ≠ 0 := fun h0 => by lemma expI_inv_eq_star : ((expI : ℂ))⁻¹ = star (expI : ℂ) := inv_eq_of_mul_eq_one_right (Unitary.mul_star_self_of_mem expI.2) +/-- `exp i` times its conjugate is one. -/ +lemma expI_mul_conj : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := + Unitary.mul_star_self_of_mem expI.2 + +/-- The conjugate of `exp i` times `exp i` is one. -/ +lemma conj_mul_expI : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := + Unitary.star_mul_self_of_mem expI.2 + +/-- A diagonal matrix whose entries are unit scalars with product one lies in the special + unitary group. -/ +lemma _root_.Matrix.mem_specialUnitaryGroup_diagonal {n : Type*} [Fintype n] [DecidableEq n] + (d : n → ℂ) (hd : ∀ i, d i * star (d i) = 1) (hdet : ∏ i, d i = 1) : + Matrix.diagonal d ∈ Matrix.specialUnitaryGroup n ℂ := by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff, Matrix.star_eq_conjTranspose, + Matrix.diagonal_conjTranspose, Matrix.diagonal_mul_diagonal] + simp only [Pi.star_apply] + rw [funext hd, Matrix.diagonal_one] + · rw [Matrix.det_diagonal, hdet] + /-- The first colour torus generator, `diag (exp i, exp (-i), 1)`. -/ noncomputable def su3ExpIOne : specialUnitaryGroup (Fin 3) ℂ := - ⟨!![(expI : ℂ), 0, 0; 0, star (expI : ℂ), 0; 0, 0, 1], by - have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := - Unitary.mul_star_self_of_mem expI.2 - have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := - Unitary.star_mul_self_of_mem expI.2 - rw [Matrix.mem_specialUnitaryGroup_iff] - refine ⟨?_, ?_⟩ - · rw [Matrix.mem_unitaryGroup_iff] - ext a b - fin_cases a <;> fin_cases b <;> - simp [Matrix.mul_apply, Fin.sum_univ_three, star_eq_conjTranspose, - Matrix.conjTranspose_apply, hms, hsm] - · simp [Matrix.det_fin_three, hms]⟩ + ⟨Matrix.diagonal ![(expI : ℂ), star (expI : ℂ), 1], + Matrix.mem_specialUnitaryGroup_diagonal _ + (fun i => by fin_cases i <;> simp [expI_mul_conj, conj_mul_expI]) + (by simp [Fin.prod_univ_three, expI_mul_conj])⟩ /-- The second colour torus generator, `diag (1, exp i, exp (-i))`. -/ noncomputable def su3ExpITwo : specialUnitaryGroup (Fin 3) ℂ := - ⟨!![1, 0, 0; 0, (expI : ℂ), 0; 0, 0, star (expI : ℂ)], by - have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := - Unitary.mul_star_self_of_mem expI.2 - have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := - Unitary.star_mul_self_of_mem expI.2 - rw [Matrix.mem_specialUnitaryGroup_iff] - refine ⟨?_, ?_⟩ - · rw [Matrix.mem_unitaryGroup_iff] - ext a b - fin_cases a <;> fin_cases b <;> - simp [Matrix.mul_apply, Fin.sum_univ_three, star_eq_conjTranspose, - Matrix.conjTranspose_apply, hms, hsm] - · simp [Matrix.det_fin_three, hms]⟩ + ⟨Matrix.diagonal ![1, (expI : ℂ), star (expI : ℂ)], + Matrix.mem_specialUnitaryGroup_diagonal _ + (fun i => by fin_cases i <;> simp [expI_mul_conj, conj_mul_expI]) + (by simp [Fin.prod_univ_three, expI_mul_conj])⟩ /-- The `SU(2)` torus element, `diag (exp i, exp (-i))`. -/ noncomputable def su2ExpI : specialUnitaryGroup (Fin 2) ℂ := - ⟨!![(expI : ℂ), 0; 0, star (expI : ℂ)], by - have hms : (expI : ℂ) * (starRingEnd ℂ) (expI : ℂ) = 1 := - Unitary.mul_star_self_of_mem expI.2 - have hsm : (starRingEnd ℂ) (expI : ℂ) * (expI : ℂ) = 1 := - Unitary.star_mul_self_of_mem expI.2 - rw [Matrix.mem_specialUnitaryGroup_iff] - refine ⟨?_, ?_⟩ - · rw [Matrix.mem_unitaryGroup_iff] - ext a b - fin_cases a <;> fin_cases b <;> - simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, - Matrix.conjTranspose_apply, hms, hsm] - · simp [Matrix.det_fin_two_of, hms]⟩ + ⟨Matrix.diagonal ![(expI : ℂ), star (expI : ℂ)], + Matrix.mem_specialUnitaryGroup_diagonal _ + (fun i => by fin_cases i <;> simp [expI_mul_conj, conj_mul_expI]) + (by simp [Fin.prod_univ_two, expI_mul_conj])⟩ /-- The underlying matrix of the `SU(2)` torus element. -/ lemma su2ExpI_coe : - (su2ExpI : specialUnitaryGroup (Fin 2) ℂ).1 = !![(expI : ℂ), 0; 0, star (expI : ℂ)] := rfl + (su2ExpI : specialUnitaryGroup (Fin 2) ℂ).1 + = !![(expI : ℂ), 0; 0, star (expI : ℂ)] := by + ext a b + fin_cases a <;> fin_cases b <;> simp [su2ExpI, Matrix.diagonal] /-- The inverse torus element is `diag (exp (-i), exp i)`, so on a doublet the two components are scaled by the reciprocal characters. -/ From f36c8c62c412ff281d3c6721e039e7d5b5e3984b Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Wed, 26 Aug 2026 13:11:20 +0400 Subject: [PATCH 201/254] refactor(LeptonGaugeSector): remove the boost weights and mass dim 4 classification Removes the nine modules downstream of Grading/BoostWeight. Grading/BoostWeight Boosts/FieldStrength GaugeDoubleDeriv/BoostWeight GaugeDoubleDeriv/Invariance GaugeKineticTerm/BoostWeight GaugeKineticTerm/Invariance FermionicKineticTerm/BoostWeight FermionicBarKineticTerm/BoostWeight MassDimFour/Classification Drops the root import at Physlib.lean:189 and regenerates todos.md. --- Physlib.lean | 1 - .../JetAlgebra/Boosts/FieldStrength.lean | 506 ----- .../FermionicBarKineticTerm/BoostWeight.lean | 683 ------- .../FermionicKineticTerm/BoostWeight.lean | 670 ------- .../GaugeDoubleDeriv/BoostWeight.lean | 1758 ----------------- .../GaugeDoubleDeriv/Invariance.lean | 58 - .../GaugeKineticTerm/BoostWeight.lean | 629 ------ .../GaugeKineticTerm/Invariance.lean | 58 - .../JetAlgebra/Grading/BoostWeight.lean | 573 ------ .../MassDimFour/Classification.lean | 160 -- todos.md | 6 +- 11 files changed, 1 insertion(+), 5101 deletions(-) delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean diff --git a/Physlib.lean b/Physlib.lean index ad925a4bb..db5fc861d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -186,7 +186,6 @@ public import Physlib.Particles.FlavorPhysics.CKMMatrix.Relations public import Physlib.Particles.FlavorPhysics.CKMMatrix.Rows public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.Basic public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.StandardParameters -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Boosts.FieldStrength public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Covariantization public import Physlib.Particles.NeutrinoPhysics.Basic public import Physlib.Particles.QED.Basic diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean deleted file mode 100644 index 1ae887d21..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean +++ /dev/null @@ -1,506 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.LinearIndependence -/-! -# Relation between field strength and boosts --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel Lorentz -open scoped minkowskiMatrix PauliMatrix Pointwise -open Matrix MatrixGroups BoostWeight IsLorentzDeriv - -namespace JetAlgebra - -/-! - -## A. The homogeneous combinations - --/ - -/-- The scalar action of a real parameter on the jet algebra, in the form the weight condition - presents it. -/ -private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl - - -/-! - -## B. Boosts in given directions - --/ - -/-! - -## B.3. Boosts in the z-direction - --/ - -/-- The light-cone combination `F_{0x} - F_{zx}` has boost weight `2`. -/ -lemma fieldStrengthDeriv_lightCone_mem_two : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- The light-cone combination `F_{0x} + F_{zx}` has boost weight `-2`. -/ -lemma fieldStrengthDeriv_lightCone_mem_neg_two : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- The transverse component `F_{xy}` has boost weight zero. -/ -lemma fieldStrengthDeriv_transverse_mem_zero : - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - intro t ht - simp only [algebraMap_real_complex] - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, Complex.ofReal_one, - zero_smul, smul_zero, add_zero, zero_add] - match_scalars; norm_num - -/-- The light-cone combination `F_{0y} - F_{zy}` has boost weight `2`. -/ -lemma fieldStrengthDeriv_lightCone_y_mem_two : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- The light-cone combination `F_{0y} + F_{zy}` has boost weight `-2`. -/ -lemma fieldStrengthDeriv_lightCone_y_mem_neg_two : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_fieldStrengthDeriv_nil, repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, - mul_zero, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- The component along the boost, `F_{0z}`, has boost weight zero: the boost acts on the two - indices by inverse scalings, which cancel. -/ -lemma fieldStrengthDeriv_longitudinal_mem_zero : - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_fieldStrengthDeriv_nil] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, fieldStrengthDeriv_self, fieldStrengthDeriv_inr_inl, - mul_zero, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -lemma fieldStrengthDeriv_nil_span_le_decompose_boostWeight_z : - Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} ≤ - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by - rw [Submodule.span_le] - rintro _ ⟨μ, ν, rfl⟩ - simp only [SetLike.mem_coe, Submodule.mem_span_insert, Submodule.mem_span_singleton] - match μ, ν with - | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 | Sum.inr 2, Sum.inr 2 => - exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by simp⟩ - | Sum.inl 0, Sum.inr 0 => - exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ - | Sum.inl 0, Sum.inr 1 => - exact ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ - | Sum.inl 0, Sum.inr 2 => - exact ⟨1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ - | Sum.inr 0, Sum.inl 0 => - exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨-2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by - rw [fieldStrengthDeriv_antisymm]; module⟩ - | Sum.inr 0, Sum.inr 1 => - exact ⟨0, _, ⟨1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ - | Sum.inr 0, Sum.inr 2 => - exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨-2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by - rw [fieldStrengthDeriv_antisymm]; module⟩ - | Sum.inr 1, Sum.inl 0 => - exact ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by - rw [fieldStrengthDeriv_antisymm]; module⟩ - | Sum.inr 1, Sum.inr 0 => - exact ⟨0, _, ⟨-1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by - rw [fieldStrengthDeriv_antisymm]; module⟩ - | Sum.inr 1, Sum.inr 2 => - exact ⟨0, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by - rw [fieldStrengthDeriv_antisymm]; module⟩ - | Sum.inr 2, Sum.inl 0 => - exact ⟨-1, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by - rw [fieldStrengthDeriv_antisymm]; module⟩ - | Sum.inr 2, Sum.inr 0 => - exact ⟨0, _, ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨2⁻¹, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ - | Sum.inr 2, Sum.inr 1 => - exact ⟨0, _, ⟨0, _, ⟨-2⁻¹, _, ⟨0, _, ⟨2⁻¹, _, ⟨0, rfl⟩, rfl⟩, rfl⟩, rfl⟩, rfl⟩, by module⟩ - -/-- **The field strengths, organised by `z`-boost weight.** The span of the `F_{μν}` is the sup - of its weight-zero, weight-two and weight-minus-two pieces. -/ -lemma fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z : - Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} = - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} ⊔ - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ⊔ - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by - refine le_antisymm (fieldStrengthDeriv_nil_span_le_decompose_boostWeight_z.trans ?_) ?_ - · rw [Submodule.span_le] - rintro _ (rfl | rfl | rfl | rfl | rfl | rfl) - · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) - · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.subset_span (by simp))) - · exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) - · exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.subset_span (by simp))) - · exact Submodule.mem_sup_right (Submodule.subset_span (by simp)) - · exact Submodule.mem_sup_right (Submodule.subset_span (by simp)) - · refine sup_le (sup_le ?_ ?_) ?_ <;> refine Submodule.span_le.2 ?_ <;> rintro _ (rfl | rfl) - · exact Submodule.subset_span ⟨_, _, rfl⟩ - · exact Submodule.subset_span ⟨_, _, rfl⟩ - · exact sub_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) - · exact sub_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) - · exact add_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) - · exact add_mem (Submodule.subset_span ⟨_, _, rfl⟩) (Submodule.subset_span ⟨_, _, rfl⟩) - -/-- The longitudinal and transverse components span a subspace of `z`-boost weight zero. -/ -lemma fieldStrengthDeriv_span_pair_zero_le : - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := - Submodule.span_le.2 (by - rintro _ (rfl | rfl) - exacts [fieldStrengthDeriv_longitudinal_mem_zero, fieldStrengthDeriv_transverse_mem_zero]) - -/-- The two light-cone differences span a subspace of `z`-boost weight two. -/ -lemma fieldStrengthDeriv_span_pair_two_le : - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := - Submodule.span_le.2 (by - rintro _ (rfl | rfl) - exacts [fieldStrengthDeriv_lightCone_y_mem_two, fieldStrengthDeriv_lightCone_mem_two]) - -/-- The two light-cone sums span a subspace of `z`-boost weight minus two. -/ -lemma fieldStrengthDeriv_span_pair_neg_two_le : - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := - Submodule.span_le.2 (by - rintro _ (rfl | rfl) - exacts [fieldStrengthDeriv_lightCone_y_mem_neg_two, fieldStrengthDeriv_lightCone_mem_neg_two]) - -/-- **The field-strength span, weight decomposed along the `z`-axis**: weight-zero piece - `{F_{0z}, F_{xy}}`, weight `±2` pieces the light-cone differences and sums. The projection - images, weight intersections and closure properties all follow from the generic - `WeightDecomposition` lemmas. -/ -noncomputable def fieldStrengthDerivWeightDecompositionZ : - BoostWeight.WeightDecomposition repLorentzGroup 2 - (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) where - piece k := - if k = 0 then Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} - else if k = 2 then Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} - else if k = -2 then Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} - else ⊥ - supp := {0, 2, -2} - piece_le k := by - by_cases h0 : k = 0 - · subst h0 - simpa using fieldStrengthDeriv_span_pair_zero_le - by_cases h2 : k = 2 - · subst h2 - simpa [h0] using fieldStrengthDeriv_span_pair_two_le - by_cases hn2 : k = -2 - · subst hn2 - simpa [h0, h2] using fieldStrengthDeriv_span_pair_neg_two_le - · simp [h0, h2, hn2] - piece_eq_bot k hk := by - simp only [Finset.mem_insert, Finset.mem_singleton] at hk - push_neg at hk - simp [hk.1, hk.2.1, hk.2.2] - iSup_piece := by - rw [BoostWeight.iSup_eq_sup_zero_two_neg_two _ (fun l h0 h2 hn2 => by simp [h0, h2, hn2])] - simp only [reduceIte, show ((2 : ℤ) = 0) = False from by simp, - show ((-2 : ℤ) = 0) = False from by simp, show ((-2 : ℤ) = 2) = False from by simp, - iff_false, if_false] - exact fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z.symm - -lemma boostProj_z_zero_map_fieldStrengthDeriv_span : - Submodule.map (BoostWeight.boostProj repLorentzGroup 2 0) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv 0 (Sum.inr 0) (Sum.inr 1)} := by - rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - BoostWeight.map_boostProj_of_le repLorentzGroup fieldStrengthDeriv_span_pair_zero_le, - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_two_le (by decide), - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le (by decide), - sup_bot_eq, sup_bot_eq] - -lemma boostProj_z_two_map_fieldStrengthDeriv_span : - Submodule.map (BoostWeight.boostProj repLorentzGroup 2 2) (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by - rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_zero_le (by decide), - BoostWeight.map_boostProj_of_le repLorentzGroup fieldStrengthDeriv_span_pair_two_le, - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le (by decide), - bot_sup_eq, sup_bot_eq] - -lemma boostProj_z_neg_two_map_fieldStrengthDeriv_span : - Submodule.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) - (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = - Submodule.span ℂ {fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 1), - fieldStrengthDeriv 0 (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv 0 (Sum.inr 2) (Sum.inr 0)} := by - rw [fieldStrengthDeriv_nil_span_eq_sup_boostWeight_z, Submodule.map_sup, Submodule.map_sup, - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_zero_le (by decide), - BoostWeight.map_boostProj_of_le_ne repLorentzGroup fieldStrengthDeriv_span_pair_two_le (by decide), - BoostWeight.map_boostProj_of_le repLorentzGroup fieldStrengthDeriv_span_pair_neg_two_le, - sup_bot_eq, bot_sup_eq] - -/-- Away from the weights `0`, `±2` the projection of the field-strength span vanishes. -/ -lemma boostProj_z_map_fieldStrengthDeriv_span_of_ne (k : ℤ) (h0 : k ≠ 0) (h2 : k ≠ 2) - (hn2 : k ≠ -2) : - Submodule.map (BoostWeight.boostProj repLorentzGroup 2 k) - (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}) = ⊥ := - fieldStrengthDerivWeightDecompositionZ.map_boostProj_of_notMem - (show k ∉ ({0, 2, -2} : Finset ℤ) from by simp [h0, h2, hn2]) - -/-! - -## The Kinetic terms - --/ - -lemma fieldStrengthDeriv_mul_span_eq_mul_span : - Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * - fieldStrengthDeriv {} μ' ν'} = Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} * - Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} := by - rw [Submodule.span_mul_span] - refine Submodule.span_eq_span ?_ ?_ - · rintro _ ⟨μ, ν, μ', ν', rfl⟩ - apply Submodule.mem_span_of_mem - refine Set.mul_mem_mul ?_ ?_ - · refine Set.mem_setOf.mpr ?_ - exact ⟨μ, ν, rfl⟩ - · refine Set.mem_setOf.mpr ?_ - exact ⟨μ', ν', rfl⟩ - · rintro _ ⟨u, ⟨μ, ν, rfl⟩, v, ⟨μ', ν', rfl⟩, rfl⟩ - apply Submodule.mem_span_of_mem - refine Set.mem_setOf.mpr ?_ - exact ⟨μ, ν, μ', ν', rfl⟩ - -TODO "Generalize the below result for any axis" - -/-- Every weight projection of the field-strength span stays inside the span. -/ -lemma boostProj_z_map_fieldStrengthDeriv_span_le (l : ℤ) : - (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (BoostWeight.boostProj repLorentzGroup 2 l) ≤ - Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} := - fieldStrengthDerivWeightDecompositionZ.map_boostProj_le l - -lemma boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts : - let V0 := Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} - let V2 := (Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * - fieldStrengthDeriv {} μ' ν'}) - V2.map (BoostWeight.boostProj repLorentzGroup 2 0) = V0.map (BoostWeight.boostProj repLorentzGroup 2 0) * V0.map (BoostWeight.boostProj repLorentzGroup 2 0) - + V0.map (BoostWeight.boostProj repLorentzGroup 2 2) * V0.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) := by - intro V0 V2 - have hcl : ∀ l : ℤ, V0.map (BoostWeight.boostProj repLorentzGroup 2 l) ≤ V0 := - boostProj_z_map_fieldStrengthDeriv_span_le - have hbot : ∀ l : ℤ, l ≠ 0 → l ≠ 2 → l ≠ -2 → - V0.map (BoostWeight.boostProj repLorentzGroup 2 l) * V0.map (BoostWeight.boostProj repLorentzGroup 2 (0 - l)) = ⊥ := by - intro l h0 h2 hn2 - rw [show V0.map (BoostWeight.boostProj repLorentzGroup 2 l) = ⊥ from - boostProj_z_map_fieldStrengthDeriv_span_of_ne l h0 h2 hn2, Submodule.bot_mul] - have hbos : V0.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) ≤ bosonic := by - rw [show V0.map (BoostWeight.boostProj repLorentzGroup 2 (-2)) = _ from boostProj_z_neg_two_map_fieldStrengthDeriv_span] - refine Submodule.span_le.2 ?_ - rintro _ (rfl | rfl) <;> - exact add_mem (fieldStrengthDeriv_mem_bosonic _ _ _) (fieldStrengthDeriv_mem_bosonic _ _ _) - have hV2 : V2 = V0 * V0 := fieldStrengthDeriv_mul_span_eq_mul_span - rw [hV2, BoostWeight.boostProj_map_mul repLorentzGroup 0 hcl hcl, - BoostWeight.iSup_eq_sup_zero_two_neg_two _ hbot] - simp only [sub_self, zero_sub, neg_neg] - rw [Submodule.add_eq_sup, mul_comm_of_le_bosonic hbos, sup_assoc, sup_idem] - -/-- The weight-zero projection keeps the photon-pair span inside itself. -/ -lemma boostProj_z_map_fieldStrengthDeriv_mul_span_le : - (Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * - fieldStrengthDeriv {} μ' ν'}).map (BoostWeight.boostProj repLorentzGroup 2 0) ≤ - Submodule.span ℂ {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * - fieldStrengthDeriv {} μ' ν'} := by - have hmul : _ = _ := boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts - rw [hmul, fieldStrengthDeriv_mul_span_eq_mul_span, Submodule.add_eq_sup] - exact sup_le - (Submodule.mul_le.2 fun a ha b hb => Submodule.mul_mem_mul - (boostProj_z_map_fieldStrengthDeriv_span_le 0 ha) - (boostProj_z_map_fieldStrengthDeriv_span_le 0 hb)) - (Submodule.mul_le.2 fun a ha b hb => Submodule.mul_mem_mul - (boostProj_z_map_fieldStrengthDeriv_span_le 2 ha) - (boostProj_z_map_fieldStrengthDeriv_span_le (-2) hb)) - -/-! - -## The double derivative terms. - --/ -lemma fieldStrengthDeriv_two_deriv_eq_map_span : - Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν} = - ∑ α, (∑ β, (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (jetDeriv β)).map - (jetDeriv α) := by - refine le_antisymm ?_ ?_ - · rw [Submodule.span_le] - rintro _ ⟨α, β, μ, ν, rfl⟩ - rw [fieldStrengthDeriv_pair_eq_jetDeriv] - exact Finset.single_le_sum (f := fun γ => - (∑ δ, (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map - (jetDeriv δ)).map (jetDeriv γ)) - (fun i _ => by rw [Submodule.zero_eq_bot]; exact bot_le) (Finset.mem_univ α) - (Submodule.mem_map_of_mem - (Finset.single_le_sum (f := fun δ => - (Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν}).map (jetDeriv δ)) - (fun i _ => by rw [Submodule.zero_eq_bot]; exact bot_le) (Finset.mem_univ β) - (Submodule.mem_map_of_mem (Submodule.subset_span ⟨μ, ν, rfl⟩)))) - · refine Finset.sum_induction _ (· ≤ _) (fun a b ha hb => ?_) ?_ fun γ _ => ?_ - · rw [Submodule.add_eq_sup] - exact sup_le ha hb - · rw [Submodule.zero_eq_bot] - exact bot_le - · rw [Submodule.map_le_iff_le_comap] - refine Finset.sum_induction _ (· ≤ _) (fun a b ha hb => ?_) ?_ fun δ _ => ?_ - · rw [Submodule.add_eq_sup] - exact sup_le ha hb - · rw [Submodule.zero_eq_bot] - exact bot_le - · rw [← Submodule.map_le_iff_le_comap, Submodule.map_span, Submodule.map_span, - Submodule.span_le] - rintro _ ⟨_, ⟨_, ⟨μ, ν, rfl⟩, rfl⟩, rfl⟩ - exact Submodule.subset_span - ⟨γ, δ, μ, ν, (fieldStrengthDeriv_pair_eq_jetDeriv γ δ μ ν).symm⟩ - -/-- **The weight-zero part of the twice-differentiated field strengths.** Projecting the span - of the `F_{{α,β}μν}` onto `z`-boost weight zero redistributes the two derivatives into the - light-cone combinations `∂_0 ∓ ∂_z`, which shift the weight by `±2`, and the transverse - derivatives `∂_x`, `∂_y`, which preserve it, applied to the weight-`0`, `±2` parts of the - span of the `F_{μν}` so that the total weight vanishes. Both orders of each pair of - derivatives appear separately: no commutation of derivatives is used. -/ -lemma boostProj_z_map_fieldStrengthDeriv_jetDeriv_span_eq : - let D2V0 := Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν} - let V0 := Submodule.span ℂ {y | ∃ μ ν, y = fieldStrengthDeriv {} μ ν} - D2V0.map (boostProj repLorentzGroup 2 0) = - ((V0.map (boostProj repLorentzGroup 2 0)).map - (lightConePlus jetDeriv 2)).map - (lightConeMinus jetDeriv 2) - + ((V0.map (boostProj repLorentzGroup 2 (-2))).map - (lightConePlus jetDeriv 2)).map (jetDeriv (Sum.inr 0)) - + ((V0.map (boostProj repLorentzGroup 2 (-2))).map - (lightConePlus jetDeriv 2)).map (jetDeriv (Sum.inr 1)) - + ((V0.map (boostProj repLorentzGroup 2 0)).map - (lightConeMinus jetDeriv 2)).map - (lightConePlus jetDeriv 2) - + ((V0.map (boostProj repLorentzGroup 2 2)).map - (lightConeMinus jetDeriv 2)).map (jetDeriv (Sum.inr 0)) - + ((V0.map (boostProj repLorentzGroup 2 2)).map - (lightConeMinus jetDeriv 2)).map (jetDeriv (Sum.inr 1)) - + ((V0.map (boostProj repLorentzGroup 2 (-2))).map (jetDeriv (Sum.inr 0))).map - (lightConePlus jetDeriv 2) - + ((V0.map (boostProj repLorentzGroup 2 2)).map (jetDeriv (Sum.inr 0))).map - (lightConeMinus jetDeriv 2) - + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 0))).map - (jetDeriv (Sum.inr 0)) - + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 0))).map - (jetDeriv (Sum.inr 1)) - + ((V0.map (boostProj repLorentzGroup 2 (-2))).map (jetDeriv (Sum.inr 1))).map - (lightConePlus jetDeriv 2) - + ((V0.map (boostProj repLorentzGroup 2 2)).map (jetDeriv (Sum.inr 1))).map - (lightConeMinus jetDeriv 2) - + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 1))).map - (jetDeriv (Sum.inr 0)) - + ((V0.map (boostProj repLorentzGroup 2 0)).map (jetDeriv (Sum.inr 1))).map - (jetDeriv (Sum.inr 1)) := by - intro D2V0 V0 - have hbot : ∀ k : ℤ, k ≠ 0 → k ≠ 2 → k ≠ -2 → - V0.map (BoostWeight.boostProj repLorentzGroup 2 k) = ⊥ := - boostProj_z_map_fieldStrengthDeriv_span_of_ne - rw [show D2V0 = ∑ α, (∑ β, V0.map (jetDeriv β)).map (jetDeriv α) from - fieldStrengthDeriv_two_deriv_eq_map_span] - simp only [IsLorentzDeriv.boostProj_map_deriv_map_submodule, - show (2 + 1 : Fin 3) = 0 from rfl, show (2 + 2 : Fin 3) = 1 from rfl, - show (0 : ℤ) - 2 = -2 from by decide, show (0 : ℤ) + 2 = 2 from by decide, - show (-2 : ℤ) - 2 = -4 from by decide, show (-2 : ℤ) + 2 = 0 from by decide, - show (2 : ℤ) - 2 = 0 from by decide, show (2 : ℤ) + 2 = 4 from by decide] - rw [hbot (-4) (by decide) (by decide) (by decide), - hbot 4 (by decide) (by decide) (by decide)] - simp only [Submodule.map_bot, Submodule.add_eq_sup, Submodule.map_sup, bot_sup_eq, - sup_bot_eq] - simp only [← Submodule.add_eq_sup] - abel - -lemma boostProj_z_map_fieldStrengthDeriv_jetDeriv_span_le : - (Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν}).map - (BoostWeight.boostProj repLorentzGroup 2 0) ≤ - Submodule.span ℂ {y | ∃ α β μ ν, y = fieldStrengthDeriv {α, β} μ ν} := by - sorry - - - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean deleted file mode 100644 index 409982dba..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/BoostWeight.lean +++ /dev/null @@ -1,683 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.LinearIndependence -/-! -# The boost weight zero part of the conjugate fermion kinetic bilinears - -The same analysis as for `ψ̄_α D_μ ψ_β`, carried out for the bilinears `(D̄_μ ψ̄)_α ψ_β` with the -derivative on the conjugate lepton. The mirror is not quite literal: the derivative now sits on -the factor that transforms by `Λ⁻¹` rather than by its conjugate, so in the `y`-direction the -spinor combinations of the two factors exchange the sign of `i`. - --/ - -@[expose] public section - -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false -set_option linter.unnecessarySeqFocus false - -namespace LeptonGaugeSector -open TensorProduct StandardModel Lorentz -open scoped minkowskiMatrix PauliMatrix Pointwise -open Matrix MatrixGroups - -namespace JetAlgebra - -private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl - -/-- **The boost weight zero part of the conjugate fermion kinetic bilinears.** An element of the - span of the products `(D̄_μ ψ̄)_α ψ_β` has boost weight zero exactly when it is a combination of - the six bilinears listed. Both spinor indices carry `z`-boost weight `∓1` for the index `0, 1` - and the derivative index carries `±2` on the light-cone combinations `∂_0 ∓ ∂_z` and `0` on - `∂_x, ∂_y`, so the weight-zero bilinears pair the spinor indices `(0,0)` and `(1,1)` with the - matching light-cone derivative and the mixed spinor indices with a transverse derivative. - - The six spanning elements are chosen with the later restriction by the boost weights in the - `x`- and `y`-directions in mind: they pair into a `∂_0/∂_z` block and `∂_x` and `∂_y` blocks. -/ -theorem boostWeight_inter_fermionic_bar_kinetic_term : - BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ - {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = - Submodule.span ℂ - {(Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inr 2] 0) * Dψ [] 0 + - (Dbarψ [Sum.inl 0] 1 + Dbarψ [Sum.inr 2] 1) * Dψ [] 1, - (Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inr 2] 0) * Dψ [] 0 - - (Dbarψ [Sum.inl 0] 1 + Dbarψ [Sum.inr 2] 1) * Dψ [] 1, - Dbarψ [Sum.inr 0] 1 * Dψ [] 0 + Dbarψ [Sum.inr 0] 0 * Dψ [] 1, - Dbarψ [Sum.inr 0] 1 * Dψ [] 0 - Dbarψ [Sum.inr 0] 0 * Dψ [] 1, - Dbarψ [Sum.inr 1] 1 * Dψ [] 0 + Dbarψ [Sum.inr 1] 0 * Dψ [] 1, - Dbarψ [Sum.inr 1] 1 * Dψ [] 0 - Dbarψ [Sum.inr 1] 0 * Dψ [] 1} := by - -- ### A. The boost eigenvectors among the first-order fermion coordinates - -- `ψ_β` is an eigenvector of weight `∓1` for `β = 0, 1`; on `D̄_μ ψ̄_α` the spinor index - -- contributes `∓1` and the light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ̄_α` add `±2`. - set C0 := Dψ [] 0 with hC0 - set C1 := Dψ [] 1 with hC1 - set P0 := Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inr 2] 0 with hP0 - set P1 := Dbarψ [Sum.inl 0] 1 - Dbarψ [Sum.inr 2] 1 with hP1 - set M0 := Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inr 2] 0 with hM0 - set M1 := Dbarψ [Sum.inl 0] 1 + Dbarψ [Sum.inr 2] 1 with hM1 - set X0 := Dbarψ [Sum.inr 0] 0 with hX0 - set X1 := Dbarψ [Sum.inr 0] 1 with hX1 - set Y0 := Dbarψ [Sum.inr 1] 0 with hY0 - set Y1 := Dbarψ [Sum.inr 1] 1 with hY1 - set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF - set S : Set JetAlgebra := {P0 * C0 + M1 * C1, P0 * C0 - M1 * C1, X1 * C0 + X0 * C1, - X1 * C0 - X0 * C1, Y1 * C0 + Y0 * C1, Y1 * C0 - Y0 * C1} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 2 j with hW - have hC0w : C0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := Dψ_nil_zero_mem_neg_one - have hC1w : C1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := Dψ_nil_one_mem_one - obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : - P0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 3 ∧ - M0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-3) ∧ M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ - X0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ X1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ - Y0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ Y1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hP0, hP1, hM0, hM1, hX0, hX1, hY0, hY1, map_sub, map_add, boostAxis_two, - algebraMap_real_complex, - repLorentzGroup_Dbarψ_singleton, toLorentzGroup_boostZel, boostZel_inv_coe, boostMatZ, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, star_zero, Complex.conj_ofReal, Complex.ofReal_zero, - Complex.ofReal_one, mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, - add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. The six weight-zero bilinears lie in the span of the pairs - have hSW : Submodule.span ℂ S ≤ W := le_sup_left - have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by - intro u v h₁ h₂ - have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) - have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - obtain ⟨k1, k8⟩ : P0 * C0 ∈ W ∧ M1 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨kx0, kx1⟩ : X1 * C0 ∈ W ∧ X0 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨ky0, ky1⟩ : Y1 * C0 ∈ W ∧ Y0 * C1 ∈ W := hpm (by simp [hS]) (by simp [hS]) - -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => - Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) - have k2 : M0 * C0 ∈ W := hm hM0w hC0w (by norm_num) - have k3 : P0 * C1 ∈ W := hm hP0w hC1w (by norm_num) - have k4 : M0 * C1 ∈ W := hm hM0w hC1w (by norm_num) - have k5 : P1 * C0 ∈ W := hm hP1w hC0w (by norm_num) - have k6 : M1 * C0 ∈ W := hm hM1w hC0w (by norm_num) - have k7 : P1 * C1 ∈ W := hm hP1w hC1w (by norm_num) - have key : ∀ {a u v : JetAlgebra} (c d : ℂ) {y : JetAlgebra}, u * a ∈ W → v * a ∈ W → - y = c • u + d • v → y * a ∈ W := by - rintro a u v c d y hu hv rfl - rw [add_mul, smul_mul_assoc, smul_mul_assoc] - exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) - have hkey : Submodule.span ℂ FF ≤ W := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨α, μ, β, rfl⟩ - match α, μ, β with - | 0, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) - | 0, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) - | 0, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k3 k4 (by rw [hP0, hM0]; module) - | 0, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k3 k4 (by rw [hP0, hM0]; module) - | 1, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k5 k6 (by rw [hP1, hM1]; module) - | 1, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k5 k6 (by rw [hP1, hM1]; module) - | 1, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) - | 1, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) - | 0, Sum.inr 0, 0 => exact hm hX0w hC0w (by norm_num) - | 0, Sum.inr 0, 1 => exact kx1 - | 1, Sum.inr 0, 0 => exact kx0 - | 1, Sum.inr 0, 1 => exact hm hX1w hC1w (by norm_num) - | 0, Sum.inr 1, 0 => exact hm hY0w hC0w (by norm_num) - | 0, Sum.inr 1, 1 => exact ky1 - | 1, Sum.inr 1, 0 => exact ky0 - | 1, Sum.inr 1, 1 => exact hm hY1w hC1w (by norm_num) - -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) - exacts [add_mem (hz hP0w hC0w (by norm_num)) (hz hM1w hC1w (by norm_num)), - sub_mem (hz hP0w hC0w (by norm_num)) (hz hM1w hC1w (by norm_num)), - add_mem (hz hX1w hC0w (by norm_num)) (hz hX0w hC1w (by norm_num)), - sub_mem (hz hX1w hC0w (by norm_num)) (hz hX0w hC1w (by norm_num)), - add_mem (hz hY1w hC0w (by norm_num)) (hz hY0w hC1w (by norm_num)), - sub_mem (hz hY1w hC0w (by norm_num)) (hz hY0w hC1w (by norm_num))] - have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ Submodule.span ℂ FF := fun α μ β => by - rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> - simp only [hC0, hC1, hP0, hM1, hX0, hX1, hY0, hY1, sub_mul, add_mul] <;> - repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 2) 0).symm, sup_bot_eq] - -/-- **The boost weight zero part of the conjugate fermion kinetic bilinears, `x`-direction.** The - `x`-boost is not diagonal on the coordinate spinors, so the eigenvectors are the combinations - `ψ_0 ± ψ_1` of weight `∓1`, and likewise on the spinor index of `D̄_μ ψ̄_α`; the light-cone - derivative combinations are `∂_0 ∓ ∂_x`, and `∂_y`, `∂_z` are the transverse directions. -/ -theorem boostWeight_inter_fermionic_bar_kinetic_term_x : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ - {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = - Submodule.span ℂ - {(Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 + Dψ [] 1) + - (Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 - Dψ [] 1), - (Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 + Dψ [] 1) - - (Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1)) * (Dψ [] 0 - Dψ [] 1), - (Dbarψ [Sum.inr 1] 0 - Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 + Dψ [] 1) + - (Dbarψ [Sum.inr 1] 0 + Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 - Dψ [] 1), - (Dbarψ [Sum.inr 1] 0 - Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 + Dψ [] 1) - - (Dbarψ [Sum.inr 1] 0 + Dbarψ [Sum.inr 1] 1) * (Dψ [] 0 - Dψ [] 1), - (Dbarψ [Sum.inr 2] 0 - Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 + Dψ [] 1) + - (Dbarψ [Sum.inr 2] 0 + Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 - Dψ [] 1), - (Dbarψ [Sum.inr 2] 0 - Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 + Dψ [] 1) - - (Dbarψ [Sum.inr 2] 0 + Dbarψ [Sum.inr 2] 1) * (Dψ [] 0 - Dψ [] 1)} := by - -- ### A. The boost eigenvectors among the first-order fermion coordinates - set Cp := Dψ [] 0 + Dψ [] 1 with hCp - set Cm := Dψ [] 0 - Dψ [] 1 with hCm - set P := Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1) with hP - set Q := Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1) with hQ - set N := Dbarψ [Sum.inl 0] 0 + Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 0] 0 + Dbarψ [Sum.inr 0] 1) with hN - set M := Dbarψ [Sum.inl 0] 0 - Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 0] 0 - Dbarψ [Sum.inr 0] 1) with hM - set T0p := Dbarψ [Sum.inr 1] 0 + Dbarψ [Sum.inr 1] 1 with hT0p - set T0m := Dbarψ [Sum.inr 1] 0 - Dbarψ [Sum.inr 1] 1 with hT0m - set T1p := Dbarψ [Sum.inr 2] 0 + Dbarψ [Sum.inr 2] 1 with hT1p - set T1m := Dbarψ [Sum.inr 2] 0 - Dbarψ [Sum.inr 2] 1 with hT1m - set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF - set S : Set JetAlgebra := {P * Cp + M * Cm, P * Cp - M * Cm, T0m * Cp + T0p * Cm, - T0m * Cp - T0p * Cm, T1m * Cp + T1p * Cm, T1m * Cp - T1p * Cm} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j with hW - obtain ⟨hCpw, hCmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Cp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ Cm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ - P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 3 ∧ - N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ - T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ - T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hCp, hCm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, - boostAxis_zero, toLorentzGroup_boostXel, boostXel_inv_coe, boostMatX, - algebraMap_real_complex, - repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_singleton, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, - Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, - mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. The six weight-zero bilinears lie in the span of the pairs - have hSW : Submodule.span ℂ S ≤ W := le_sup_left - have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by - intro u v h₁ h₂ - have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) - have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - obtain ⟨k1, k8⟩ : P * Cp ∈ W ∧ M * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨kx0, kx1⟩ : T0m * Cp ∈ W ∧ T0p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨ky0, ky1⟩ : T1m * Cp ∈ W ∧ T1p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) - -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => - Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) - have hbil : ∀ x ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), - ∀ y ∈ Submodule.span ℂ ({Cp, Cm} : Set JetAlgebra), x * y ∈ W := by - intro x hx - induction hx using Submodule.span_induction with - | mem a ha => - intro y hy - induction hy using Submodule.span_induction with - | mem b hb => - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb - rcases ha with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> - rcases hb with rfl | rfl - exacts [k1, hm hPw hCmw (by norm_num), - hm hQw hCpw (by norm_num), hm hQw hCmw (by norm_num), - hm hNw hCpw (by norm_num), hm hNw hCmw (by norm_num), - hm hMw hCpw (by norm_num), k8, - hm hT0pw hCpw (by norm_num), kx1, - kx0, hm hT0mw hCmw (by norm_num), - hm hT1pw hCpw (by norm_num), ky1, - ky0, hm hT1mw hCmw (by norm_num)] - | zero => simp - | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz - | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy - | zero => intro y _; simp - | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) - | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) - have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 c3 c4 z rfl - exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hkey : Submodule.span ℂ FF ≤ W := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨α, μ, β, rfl⟩ - refine hbil _ ?_ _ ?_ - · match μ, α with - | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inl 0, 1 => exact hc4 4⁻¹ (-4⁻¹) 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 0, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 0, 1 => exact hc4 (-4⁻¹) 4⁻¹ 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 1, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) - | Sum.inr 1, 1 => exact hc0 2⁻¹ (-2⁻¹) (by rw [hT0p, hT0m]; module) - | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) - | Sum.inr 2, 1 => exact hc1 2⁻¹ (-2⁻¹) (by rw [hT1p, hT1m]; module) - · rw [Submodule.mem_span_pair] - match β with - | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hCp, hCm]; module⟩ - | 1 => exact ⟨2⁻¹, -2⁻¹, by rw [hCp, hCm]; module⟩ - -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) - exacts [add_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), - sub_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), - add_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), - sub_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), - add_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num)), - sub_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num))] - have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ Submodule.span ℂ FF := fun α μ β => by - rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> - simp only [hCp, hCm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, - mul_smul_comm, smul_mul_assoc] <;> - repeat' first - | exact hFm _ _ _ - | apply add_mem - | apply sub_mem - | apply neg_mem - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] - -/-- **The boost weight zero part of the conjugate fermion kinetic bilinears, `y`-direction.** As - for the `x`-boost, but the rotated spinor combinations now carry a factor of `i`. The - conjugate lepton transforms by `Λ⁻¹` and the lepton by its conjugate, so the two factors take - opposite signs of `i`: `ψ̄_0 ∓ i ψ̄_1` and `ψ_0 ± i ψ_1` have weight `∓1`. -/ -theorem boostWeight_inter_fermionic_bar_kinetic_term_y : - BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ - {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = - Submodule.span ℂ - {(Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1)) * - (Dψ [] 0 + Complex.I • Dψ [] 1) + - (Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1)) * - (Dψ [] 0 - Complex.I • Dψ [] 1), - (Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1)) * - (Dψ [] 0 + Complex.I • Dψ [] 1) - - (Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1)) * - (Dψ [] 0 - Complex.I • Dψ [] 1), - (Dbarψ [Sum.inr 0] 0 + Complex.I • Dbarψ [Sum.inr 0] 1) * - (Dψ [] 0 + Complex.I • Dψ [] 1) + - (Dbarψ [Sum.inr 0] 0 - Complex.I • Dbarψ [Sum.inr 0] 1) * - (Dψ [] 0 - Complex.I • Dψ [] 1), - (Dbarψ [Sum.inr 0] 0 + Complex.I • Dbarψ [Sum.inr 0] 1) * - (Dψ [] 0 + Complex.I • Dψ [] 1) - - (Dbarψ [Sum.inr 0] 0 - Complex.I • Dbarψ [Sum.inr 0] 1) * - (Dψ [] 0 - Complex.I • Dψ [] 1), - (Dbarψ [Sum.inr 2] 0 + Complex.I • Dbarψ [Sum.inr 2] 1) * - (Dψ [] 0 + Complex.I • Dψ [] 1) + - (Dbarψ [Sum.inr 2] 0 - Complex.I • Dbarψ [Sum.inr 2] 1) * - (Dψ [] 0 - Complex.I • Dψ [] 1), - (Dbarψ [Sum.inr 2] 0 + Complex.I • Dbarψ [Sum.inr 2] 1) * - (Dψ [] 0 + Complex.I • Dψ [] 1) - - (Dbarψ [Sum.inr 2] 0 - Complex.I • Dbarψ [Sum.inr 2] 1) * - (Dψ [] 0 - Complex.I • Dψ [] 1)} := by - -- ### A. The boost eigenvectors among the first-order fermion coordinates - set Cp := Dψ [] 0 + Complex.I • Dψ [] 1 with hCp - set Cm := Dψ [] 0 - Complex.I • Dψ [] 1 with hCm - set P := Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1) with hP - set Q := Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 - - (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1) with hQ - set N := Dbarψ [Sum.inl 0] 0 - Complex.I • Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 1] 0 - Complex.I • Dbarψ [Sum.inr 1] 1) with hN - set M := Dbarψ [Sum.inl 0] 0 + Complex.I • Dbarψ [Sum.inl 0] 1 + - (Dbarψ [Sum.inr 1] 0 + Complex.I • Dbarψ [Sum.inr 1] 1) with hM - set T0p := Dbarψ [Sum.inr 0] 0 - Complex.I • Dbarψ [Sum.inr 0] 1 with hT0p - set T0m := Dbarψ [Sum.inr 0] 0 + Complex.I • Dbarψ [Sum.inr 0] 1 with hT0m - set T1p := Dbarψ [Sum.inr 2] 0 - Complex.I • Dbarψ [Sum.inr 2] 1 with hT1p - set T1m := Dbarψ [Sum.inr 2] 0 + Complex.I • Dbarψ [Sum.inr 2] 1 with hT1m - set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} with hFF - set S : Set JetAlgebra := {P * Cp + M * Cm, P * Cp - M * Cm, T0m * Cp + T0p * Cm, - T0m * Cp - T0p * Cm, T1m * Cp + T1p * Cm, T1m * Cp - T1p * Cm} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j with hW - obtain ⟨hCpw, hCmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Cp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ Cm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ - P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 3 ∧ - N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ - T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ - T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hCp, hCm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, - boostAxis_one, toLorentzGroup_boostYel, boostYel_inv_coe, boostMatY, - algebraMap_real_complex, - repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_singleton, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, - Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, - mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> field_simp <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf) - -- ### B. The six weight-zero bilinears lie in the span of the pairs - have hSW : Submodule.span ℂ S ≤ W := le_sup_left - have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by - intro u v h₁ h₂ - have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) - have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - obtain ⟨k1, k8⟩ : P * Cp ∈ W ∧ M * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨kx0, kx1⟩ : T0m * Cp ∈ W ∧ T0p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨ky0, ky1⟩ : T1m * Cp ∈ W ∧ T1p * Cm ∈ W := hpm (by simp [hS]) (by simp [hS]) - -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => - Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) - have hbil : ∀ x ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), - ∀ y ∈ Submodule.span ℂ ({Cp, Cm} : Set JetAlgebra), x * y ∈ W := by - intro x hx - induction hx using Submodule.span_induction with - | mem a ha => - intro y hy - induction hy using Submodule.span_induction with - | mem b hb => - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb - rcases ha with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> - rcases hb with rfl | rfl - exacts [k1, hm hPw hCmw (by norm_num), - hm hQw hCpw (by norm_num), hm hQw hCmw (by norm_num), - hm hNw hCpw (by norm_num), hm hNw hCmw (by norm_num), - hm hMw hCpw (by norm_num), k8, - hm hT0pw hCpw (by norm_num), kx1, - kx0, hm hT0mw hCmw (by norm_num), - hm hT1pw hCpw (by norm_num), ky1, - ky0, hm hT1mw hCmw (by norm_num)] - | zero => simp - | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz - | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy - | zero => intro y _; simp - | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) - | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) - have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 c3 c4 z rfl - exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hkey : Submodule.span ℂ FF ≤ W := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨α, μ, β, rfl⟩ - refine hbil _ ?_ _ ?_ - · match μ, α with - | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inl 0, 1 => - exact hc4 (Complex.I / 4) (-(Complex.I / 4)) (Complex.I / 4) (-(Complex.I / 4)) - (by rw [hP, hQ, hN, hM] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - | Sum.inr 1, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 1, 1 => - exact hc4 (-(Complex.I / 4)) (Complex.I / 4) (Complex.I / 4) (-(Complex.I / 4)) - (by rw [hP, hQ, hN, hM] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - | Sum.inr 0, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) - | Sum.inr 0, 1 => - exact hc0 (Complex.I / 2) (-(Complex.I / 2)) - (by rw [hT0p, hT0m] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) - | Sum.inr 2, 1 => - exact hc1 (Complex.I / 2) (-(Complex.I / 2)) - (by rw [hT1p, hT1m] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - · rw [Submodule.mem_span_pair] - match β with - | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hCp, hCm]; module⟩ - | 1 => - exact ⟨-(Complex.I / 2), Complex.I / 2, by - rw [hCp, hCm] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)⟩ - -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) - exacts [add_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), - sub_mem (hz hPw hCpw (by norm_num)) (hz hMw hCmw (by norm_num)), - add_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), - sub_mem (hz hT0mw hCpw (by norm_num)) (hz hT0pw hCmw (by norm_num)), - add_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num)), - sub_mem (hz hT1mw hCpw (by norm_num)) (hz hT1pw hCmw (by norm_num))] - have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ Submodule.span ℂ FF := fun α μ β => by - rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> - simp only [hCp, hCm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, - mul_smul_comm, smul_mul_assoc] <;> - repeat' first - | apply add_mem - | apply sub_mem - | apply neg_mem - | apply Submodule.smul_mem - | exact hFm _ _ _ - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] - -/-- **The conjugate fermion kinetic term is the only conjugate bilinear of boost weight zero in - every direction.** An element of the span of the products `(D̄_μ ψ̄)_α ψ_β` has boost weight - zero along all three axes exactly when it is a multiple of `-i (D̄_μ ψ̄) σ̄^μ ψ`. - - *Here the proof is not a certificate.* The three one-axis theorems above cut the span of the - sixteen bilinears down to a six-dimensional space each, and the three sixes have to be - intersected; the intersection is read off from the coefficients, which is where the linear - independence of the bilinears (`fermionBarDual_apply`) enters. The `z`-axis theorem provides - the six coefficients `a₁, …, a₆`, and five functionals, each a combination of two of the duals - `fermionBarDual` chosen to annihilate the `x`- or the `y`-axis span, cut them down to one. -/ -lemma boostWeight_inter_fermionic_bar_kinetic_term_full : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} = - Submodule.span ℂ {fermionKineticTermBar} := by - have hFm : ∀ α μ β, Dbarψ [μ] α * Dψ [] β ∈ - Submodule.span ℂ {x : JetAlgebra | ∃ α μ β, x = Dbarψ [μ] α * Dψ [] β} := - fun α μ β => Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hinv : IsInvariant fermionKineticTermBar := - ⟨repJetGaugeGroupI_fermionKineticTermBar, repLorentzGroup_fermionKineticTermBar⟩ - refine le_antisymm ?_ ?_ - -- ### A. The three one-axis intersections - · intro x hx - rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx - obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx - have hz := boostWeight_inter_fermionic_bar_kinetic_term.le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) - have hbx := boostWeight_inter_fermionic_bar_kinetic_term_x.le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) - have hby := boostWeight_inter_fermionic_bar_kinetic_term_y.le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) - -- ### B. Pairs of dual functionals annihilating the `x`- and `y`-axis spans - have hpair : ∀ (c₁ c₂ : ℂ) (q₁ q₂ : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) {T : Set JetAlgebra}, - (∀ s ∈ T, c₁ * fermionBarDual q₁ s + c₂ * fermionBarDual q₂ s = 0) → - ∀ y ∈ Submodule.span ℂ T, c₁ * fermionBarDual q₁ y + c₂ * fermionBarDual q₂ y = 0 := by - intro c₁ c₂ q₁ q₂ T hT y hy - induction hy using Submodule.span_induction with - | mem s hs => exact hT s hs - | zero => simp - | add u v _ _ hu hv => rw [map_add, map_add]; linear_combination hu + hv - | smul c u _ hu => - rw [map_smul, map_smul, smul_eq_mul, smul_eq_mul]; linear_combination c * hu - obtain ⟨e1, e2, e3⟩ : - (-1 : ℂ) * fermionBarDual (0, Sum.inl 0, 0) x + - 1 * fermionBarDual (1, Sum.inl 0, 1) x = 0 ∧ - (1 : ℂ) * fermionBarDual (0, Sum.inl 0, 0) x + - 1 * fermionBarDual (0, Sum.inr 0, 1) x = 0 ∧ - (1 : ℂ) * fermionBarDual (0, Sum.inl 0, 0) x + - 1 * fermionBarDual (1, Sum.inr 0, 0) x = 0 := by - refine ⟨hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx⟩ <;> - intro s hs <;> - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> - rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> - simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, - smul_mul_assoc, mul_smul_comm, fermionBarDual_apply] <;> - simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, - if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] - obtain ⟨e4, e5⟩ : - Complex.I * fermionBarDual (0, Sum.inl 0, 0) x + - 1 * fermionBarDual (0, Sum.inr 1, 1) x = 0 ∧ - (-Complex.I) * fermionBarDual (0, Sum.inl 0, 0) x + - 1 * fermionBarDual (1, Sum.inr 1, 0) x = 0 := by - refine ⟨hpair _ _ _ _ ?_ x hby, hpair _ _ _ _ ?_ x hby⟩ <;> - intro s hs <;> - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> - rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> - simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, - smul_mul_assoc, mul_smul_comm, fermionBarDual_apply] <;> - simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, - if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] - -- ### C. The six coefficients of the `z`-axis span, and the five relations on them - rw [Submodule.mem_span_insert] at hz - obtain ⟨a1, y1, hy1, rfl⟩ := hz - rw [Submodule.mem_span_insert] at hy1 - obtain ⟨a2, y2, hy2, rfl⟩ := hy1 - rw [Submodule.mem_span_insert] at hy2 - obtain ⟨a3, y3, hy3, rfl⟩ := hy2 - rw [Submodule.mem_span_insert] at hy3 - obtain ⟨a4, y4, hy4, rfl⟩ := hy3 - rw [Submodule.mem_span_insert] at hy4 - obtain ⟨a5, y5, hy5, rfl⟩ := hy4 - obtain ⟨a6, rfl⟩ := Submodule.mem_span_singleton.1 hy5 - simp only [mul_add, mul_sub, add_mul, sub_mul, map_add, map_smul, map_sub, smul_eq_mul, - fermionBarDual_apply, Prod.mk.injEq, Sum.inr.injEq, Sum.inl.injEq, reduceCtorEq, - Fin.isValue, Fin.reduceEq, and_false, false_and, if_false, and_true, true_and, if_true, - mul_zero, mul_one, add_zero, zero_add, sub_zero, zero_sub] at e1 e2 e3 e4 e5 - -- ### D. One coefficient is left, and it is the conjugate kinetic term - have ha2 : a2 = 0 := by linear_combination -e1 / 2 - have ha4 : a4 = 0 := by linear_combination (e3 - e2) / 2 - have ha3 : a3 = -(a1 + a2) := by linear_combination (e2 + e3) / 2 - have ha5 : a5 = 0 := by linear_combination (e4 + e5) / 2 - have ha6 : a6 = Complex.I * (a1 + a2) := by linear_combination (e5 - e4) / 2 - subst ha2 ha4 ha5 ha3 ha6 - rw [Submodule.mem_span_singleton] - refine ⟨Complex.I * a1, ?_⟩ - rw [fermionKineticTermBar_eq] - simp only [add_mul, sub_mul, add_zero] - have hI3 : Complex.I ^ 3 = -Complex.I := by rw [pow_succ, Complex.I_sq, neg_one_mul] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq, hI3]) <;> (try ring_nf) - -- ### E. The kinetic term is invariant, hence of weight zero along every axis - · rw [Submodule.span_le, Set.singleton_subset_iff] - refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinv, - mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, ?_⟩ - rw [fermionKineticTermBar_eq] - exact Submodule.smul_mem _ _ (sub_mem (sub_mem (sub_mem - (add_mem (hFm _ _ _) (hFm _ _ _)) (add_mem (hFm _ _ _) (hFm _ _ _))) - (Submodule.smul_mem _ _ (sub_mem (hFm _ _ _) (hFm _ _ _)))) - (sub_mem (hFm _ _ _) (hFm _ _ _))) - -/-! - -## The key theorem - --/ - -/-- **The invariant conjugate fermion bilinears are the multiples of the conjugate kinetic - term.** -/ -lemma mem_fermionic_bar_kinetic_span_eq_kineticTermBar_of_isInvariant {x : JetAlgebra} - (hx : IsInvariant x) (ht : x ∈ Submodule.span ℂ {y | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : - x ∈ Submodule.span ℂ {fermionKineticTermBar} := by - rw [← boostWeight_inter_fermionic_bar_kinetic_term_full] - exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean deleted file mode 100644 index 032729d74..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/BoostWeight.lean +++ /dev/null @@ -1,670 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.LinearIndependence -/-! -# The boost weight zero parts of the photon pairs and the fermion kinetic bilinears - -Boost weights give us the invariance under the Lorentz group. This is in the following -way. Consider all terms in the span of `ψ̄_α ∂_μ ψ_β`. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel Lorentz -open scoped minkowskiMatrix PauliMatrix Pointwise -open Matrix MatrixGroups - -namespace JetAlgebra - -private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl - -/-- **The boost weight zero part of the fermion kinetic bilinears.** An element of the span of - the products `ψ̄_α ∂_μ ψ_β` has boost weight zero exactly when it is a combination of the six - bilinears listed. Both spinor indices carry `z`-boost weight `∓1` for the index `0, 1` and the - derivative index carries `±2` on the light-cone combinations `∂_0 ∓ ∂_z` and `0` on `∂_x, ∂_y`, - so the weight-zero bilinears pair the spinor indices `(0,0)` and `(1,1)` with the matching - light-cone derivative and the mixed spinor indices with a transverse derivative. - - The six spanning elements are chosen with the later restriction by the boost weights in the - `x`- and `y`-directions in mind: they pair into a `∂_0/∂_z` block and `∂_x` and `∂_y` blocks, - and in each transverse block the two sign combinations `ψ̄_0 ∂_i ψ_1 ± ψ̄_1 ∂_i ψ_0` split the - spinor content into the part that is diagonal for the boost in the `i`-direction and the part - that is not, so their weight decompositions in those directions are immediate. -/ -theorem boostWeight_inter_fermionic_kinetic_term : - BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ - {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = - Submodule.span ℂ - {Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) + - Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), - Dbarψ [] 0 * (Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0) - - Dbarψ [] 1 * (Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1), - Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0, - Dbarψ [] 0 * Dψ [Sum.inr 0] 1 - Dbarψ [] 1 * Dψ [Sum.inr 0] 0, - Dbarψ [] 0 * Dψ [Sum.inr 1] 1 + Dbarψ [] 1 * Dψ [Sum.inr 1] 0, - Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0} := by - -- ### A. The boost eigenvectors among the first-order fermion coordinates - -- `ψ̄_α` is an eigenvector of weight `∓1` for `α = 0, 1`; on `∂_μ ψ_β` the spinor index - -- contributes `∓1` and the light-cone derivative combinations `(∂_0 ∓ ∂_z) ψ_β` add `±2`. - set B0 := Dbarψ [] 0 with hB0 - set B1 := Dbarψ [] 1 with hB1 - set P0 := Dψ [Sum.inl 0] 0 - Dψ [Sum.inr 2] 0 with hP0 - set P1 := Dψ [Sum.inl 0] 1 - Dψ [Sum.inr 2] 1 with hP1 - set M0 := Dψ [Sum.inl 0] 0 + Dψ [Sum.inr 2] 0 with hM0 - set M1 := Dψ [Sum.inl 0] 1 + Dψ [Sum.inr 2] 1 with hM1 - set X0 := Dψ [Sum.inr 0] 0 with hX0 - set X1 := Dψ [Sum.inr 0] 1 with hX1 - set Y0 := Dψ [Sum.inr 1] 0 with hY0 - set Y1 := Dψ [Sum.inr 1] 1 with hY1 - set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF - set S : Set JetAlgebra := {B0 * P0 + B1 * M1, B0 * P0 - B1 * M1, B0 * X1 + B1 * X0, - B0 * X1 - B1 * X0, B0 * Y1 + B1 * Y0, B0 * Y1 - B1 * Y0} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 2 j with hW - have hB0w : B0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := Dbarψ_nil_zero_mem_neg_one - have hB1w : B1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := Dbarψ_nil_one_mem_one - obtain ⟨hP0w, hP1w, hM0w, hM1w, hX0w, hX1w, hY0w, hY1w⟩ : - P0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 3 ∧ - M0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-3) ∧ M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ - X0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ X1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 ∧ - Y0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) ∧ Y1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hP0, hP1, hM0, hM1, hX0, hX1, hY0, hY1, map_sub, map_add, boostAxis_two, - algebraMap_real_complex, - repLorentzGroup_Dψ_singleton, toLorentzGroup_boostZel, boostZel_inv_coe, boostMatZ, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_zero, star_zero, Complex.conj_ofReal, Complex.ofReal_zero, - Complex.ofReal_one, mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, - add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. The six weight-zero bilinears lie in the span of the pairs - have hSW : Submodule.span ℂ S ≤ W := le_sup_left - have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by - intro u v h₁ h₂ - have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) - have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - obtain ⟨k1, k8⟩ : B0 * P0 ∈ W ∧ B1 * M1 ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨kx0, kx1⟩ : B0 * X1 ∈ W ∧ B1 * X0 ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨ky0, ky1⟩ : B0 * Y1 ∈ W ∧ B1 * Y0 ∈ W := hpm (by simp [hS]) (by simp [hS]) - -- ### C. Every bilinear splits into eigen bilinears of a single weight - -- The ten bilinears of nonzero weight, and the decomposition of `∂_0 ψ_β` and `∂_z ψ_β` into - -- the light-cone combinations. - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => - Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) - have k2 : B0 * M0 ∈ W := hm hB0w hM0w (by norm_num) - have k3 : B0 * P1 ∈ W := hm hB0w hP1w (by norm_num) - have k4 : B0 * M1 ∈ W := hm hB0w hM1w (by norm_num) - have k5 : B1 * P0 ∈ W := hm hB1w hP0w (by norm_num) - have k6 : B1 * M0 ∈ W := hm hB1w hM0w (by norm_num) - have k7 : B1 * P1 ∈ W := hm hB1w hP1w (by norm_num) - have key : ∀ {a u v : JetAlgebra} (c d : ℂ) {y : JetAlgebra}, a * u ∈ W → a * v ∈ W → - y = c • u + d • v → a * y ∈ W := by - rintro a u v c d y hu hv rfl - rw [mul_add, mul_smul_comm, mul_smul_comm] - exact add_mem (Submodule.smul_mem _ _ hu) (Submodule.smul_mem _ _ hv) - have hkey : Submodule.span ℂ FF ≤ W := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨α, μ, β, rfl⟩ - match α, μ, β with - | 0, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) - | 0, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k1 k2 (by rw [hP0, hM0]; module) - | 0, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) - | 0, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k3 k4 (by rw [hP1, hM1]; module) - | 1, Sum.inl 0, 0 => exact key 2⁻¹ 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) - | 1, Sum.inr 2, 0 => exact key (-2⁻¹) 2⁻¹ k5 k6 (by rw [hP0, hM0]; module) - | 1, Sum.inl 0, 1 => exact key 2⁻¹ 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) - | 1, Sum.inr 2, 1 => exact key (-2⁻¹) 2⁻¹ k7 k8 (by rw [hP1, hM1]; module) - | 0, Sum.inr 0, 0 => exact hm hB0w hX0w (by norm_num) - | 0, Sum.inr 0, 1 => exact kx0 - | 0, Sum.inr 1, 0 => exact hm hB0w hY0w (by norm_num) - | 0, Sum.inr 1, 1 => exact ky0 - | 1, Sum.inr 0, 0 => exact kx1 - | 1, Sum.inr 0, 1 => exact hm hB1w hX1w (by norm_num) - | 1, Sum.inr 1, 0 => exact ky1 - | 1, Sum.inr 1, 1 => exact hm hB1w hY1w (by norm_num) - -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) - exacts [add_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), - sub_mem (hz hB0w hP0w (by norm_num)) (hz hB1w hM1w (by norm_num)), - add_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), - sub_mem (hz hB0w hX1w (by norm_num)) (hz hB1w hX0w (by norm_num)), - add_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num)), - sub_mem (hz hB0w hY1w (by norm_num)) (hz hB1w hY0w (by norm_num))] - have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by - rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> - simp only [hB0, hB1, hP0, hM1, hX0, hX1, hY0, hY1, mul_sub, mul_add] <;> - repeat' first | exact hFm _ _ _ | apply add_mem | apply sub_mem | apply neg_mem - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 2) 0).symm, sup_bot_eq] - - -/-- **The boost weight zero part of the fermion kinetic bilinears, `x`-direction.** The `x`-boost - is not diagonal on the coordinate spinors, so the eigenvectors are the combinations - `ψ̄_0 ± ψ̄_1` of weight `∓1`, and likewise on the spinor index of `∂_μ ψ_β`; the light-cone - derivative combinations are `∂_0 ∓ ∂_x`, and `∂_y`, `∂_z` are the transverse directions. -/ -theorem boostWeight_inter_fermionic_kinetic_term_x : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ - {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = - Submodule.span ℂ - {(Dbarψ [] 0 + Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1)) + - (Dbarψ [] 0 - Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1)), - (Dbarψ [] 0 + Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1)) - - (Dbarψ [] 0 - Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1)), - (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 - Dψ [Sum.inr 1] 1) + - (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 + Dψ [Sum.inr 1] 1), - (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 - Dψ [Sum.inr 1] 1) - - (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 1] 0 + Dψ [Sum.inr 1] 1), - (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 - Dψ [Sum.inr 2] 1) + - (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 + Dψ [Sum.inr 2] 1), - (Dbarψ [] 0 + Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 - Dψ [Sum.inr 2] 1) - - (Dbarψ [] 0 - Dbarψ [] 1) * (Dψ [Sum.inr 2] 0 + Dψ [Sum.inr 2] 1)} := by - -- ### A. The boost eigenvectors among the first-order fermion coordinates - set Bp := Dbarψ [] 0 + Dbarψ [] 1 with hBp - set Bm := Dbarψ [] 0 - Dbarψ [] 1 with hBm - set P := Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1) with hP - set Q := Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 - (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1) with hQ - set N := Dψ [Sum.inl 0] 0 + Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 + Dψ [Sum.inr 0] 1) with hN - set M := Dψ [Sum.inl 0] 0 - Dψ [Sum.inl 0] 1 + (Dψ [Sum.inr 0] 0 - Dψ [Sum.inr 0] 1) with hM - set T0p := Dψ [Sum.inr 1] 0 + Dψ [Sum.inr 1] 1 with hT0p - set T0m := Dψ [Sum.inr 1] 0 - Dψ [Sum.inr 1] 1 with hT0m - set T1p := Dψ [Sum.inr 2] 0 + Dψ [Sum.inr 2] 1 with hT1p - set T1m := Dψ [Sum.inr 2] 0 - Dψ [Sum.inr 2] 1 with hT1m - set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF - set S : Set JetAlgebra := {Bp * P + Bm * M, Bp * P - Bm * M, Bp * T0m + Bm * T0p, - Bp * T0m - Bm * T0p, Bp * T1m + Bm * T1p, Bp * T1m - Bm * T1p} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j with hW - obtain ⟨hBpw, hBmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Bp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ Bm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ - P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 3 ∧ - N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ - T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 ∧ - T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 1 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hBp, hBm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, - boostAxis_zero, toLorentzGroup_boostXel, boostXel_inv_coe, boostMatX, - algebraMap_real_complex, - repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, - Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, - mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. The six weight-zero bilinears lie in the span of the pairs - have hSW : Submodule.span ℂ S ≤ W := le_sup_left - have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by - intro u v h₁ h₂ - have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) - have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - obtain ⟨k1, k8⟩ : Bp * P ∈ W ∧ Bm * M ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨kx0, kx1⟩ : Bp * T0m ∈ W ∧ Bm * T0p ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨ky0, ky1⟩ : Bp * T1m ∈ W ∧ Bm * T1p ∈ W := hpm (by simp [hS]) (by simp [hS]) - -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => - Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) - have hbil : ∀ x ∈ Submodule.span ℂ ({Bp, Bm} : Set JetAlgebra), - ∀ y ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), - x * y ∈ W := by - intro x hx - induction hx using Submodule.span_induction with - | mem a ha => - intro y hy - induction hy using Submodule.span_induction with - | mem b hb => - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb - rcases ha with rfl | rfl <;> - rcases hb with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - exacts [k1, hm hBpw hQw (by norm_num), hm hBpw hNw (by norm_num), - hm hBpw hMw (by norm_num), hm hBpw hT0pw (by norm_num), kx0, - hm hBpw hT1pw (by norm_num), ky0, - hm hBmw hPw (by norm_num), hm hBmw hQw (by norm_num), hm hBmw hNw (by norm_num), k8, - kx1, hm hBmw hT0mw (by norm_num), ky1, hm hBmw hT1mw (by norm_num)] - | zero => simp - | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz - | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy - | zero => intro y _; simp - | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) - | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) - have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 c3 c4 z rfl - exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hkey : Submodule.span ℂ FF ≤ W := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨α, μ, β, rfl⟩ - refine hbil _ ?_ _ ?_ - · rw [Submodule.mem_span_pair] - match α with - | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hBp, hBm]; module⟩ - | 1 => exact ⟨2⁻¹, -2⁻¹, by rw [hBp, hBm]; module⟩ - · match μ, β with - | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inl 0, 1 => exact hc4 4⁻¹ (-4⁻¹) 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 0, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 0, 1 => exact hc4 (-4⁻¹) 4⁻¹ 4⁻¹ (-4⁻¹) (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 1, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) - | Sum.inr 1, 1 => exact hc0 2⁻¹ (-2⁻¹) (by rw [hT0p, hT0m]; module) - | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) - | Sum.inr 2, 1 => exact hc1 2⁻¹ (-2⁻¹) (by rw [hT1p, hT1m]; module) - -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) - exacts [add_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), - sub_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), - add_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), - sub_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), - add_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num)), - sub_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num))] - have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by - rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> - simp only [hBp, hBm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, - mul_smul_comm, smul_mul_assoc] <;> - repeat' first - | exact hFm _ _ _ - | apply add_mem - | apply sub_mem - | apply neg_mem - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] - -/-- **The boost weight zero part of the fermion kinetic bilinears, `y`-direction.** As for the - `x`-boost, but the rotated spinor combinations now carry a factor of `i`: `ψ̄_0 ∓ i ψ̄_1` has - weight `∓1`, and on `∂_μ ψ_β` the combinations `∂_μ ψ_0 ± i ∂_μ ψ_1` carry the spinor weight - `∓1`; the light-cone derivative combinations are `∂_0 ∓ ∂_y`, and `∂_x`, `∂_z` are transverse. -/ -theorem boostWeight_inter_fermionic_kinetic_term_y : - BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ - {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = - Submodule.span ℂ - {(Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 - - (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1)) + - (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 + - (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1)), - (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 - - (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1)) - - (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 + - (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1)), - (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 0] 0 - Complex.I • Dψ [Sum.inr 0] 1) + - (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 0] 0 + Complex.I • Dψ [Sum.inr 0] 1), - (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 0] 0 - Complex.I • Dψ [Sum.inr 0] 1) - - (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 0] 0 + Complex.I • Dψ [Sum.inr 0] 1), - (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 2] 0 - Complex.I • Dψ [Sum.inr 2] 1) + - (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 2] 0 + Complex.I • Dψ [Sum.inr 2] 1), - (Dbarψ [] 0 - Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 2] 0 - Complex.I • Dψ [Sum.inr 2] 1) - - (Dbarψ [] 0 + Complex.I • Dbarψ [] 1) * - (Dψ [Sum.inr 2] 0 + Complex.I • Dψ [Sum.inr 2] 1)} := by - -- ### A. The boost eigenvectors among the first-order fermion coordinates - set Bp := Dbarψ [] 0 - Complex.I • Dbarψ [] 1 with hBp - set Bm := Dbarψ [] 0 + Complex.I • Dbarψ [] 1 with hBm - set P := Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 - - (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1) with hP - set Q := Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 - - (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1) with hQ - set N := Dψ [Sum.inl 0] 0 + Complex.I • Dψ [Sum.inl 0] 1 + - (Dψ [Sum.inr 1] 0 + Complex.I • Dψ [Sum.inr 1] 1) with hN - set M := Dψ [Sum.inl 0] 0 - Complex.I • Dψ [Sum.inl 0] 1 + - (Dψ [Sum.inr 1] 0 - Complex.I • Dψ [Sum.inr 1] 1) with hM - set T0p := Dψ [Sum.inr 0] 0 + Complex.I • Dψ [Sum.inr 0] 1 with hT0p - set T0m := Dψ [Sum.inr 0] 0 - Complex.I • Dψ [Sum.inr 0] 1 with hT0m - set T1p := Dψ [Sum.inr 2] 0 + Complex.I • Dψ [Sum.inr 2] 1 with hT1p - set T1m := Dψ [Sum.inr 2] 0 - Complex.I • Dψ [Sum.inr 2] 1 with hT1m - set FF : Set JetAlgebra := {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} with hFF - set S : Set JetAlgebra := {Bp * P + Bm * M, Bp * P - Bm * M, Bp * T0m + Bm * T0p, - Bp * T0m - Bm * T0p, Bp * T1m + Bm * T1p, Bp * T1m - Bm * T1p} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j with hW - obtain ⟨hBpw, hBmw, hPw, hQw, hNw, hMw, hT0pw, hT0mw, hT1pw, hT1mw⟩ : - Bp ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ Bm ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ - P ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ Q ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 3 ∧ - N ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-3) ∧ M ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ - T0p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T0m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 ∧ - T1p ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-1) ∧ T1m ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 1 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hBp, hBm, hP, hQ, hN, hM, hT0p, hT0m, hT1p, hT1m, map_sub, map_add, map_smul, - boostAxis_one, toLorentzGroup_boostYel, boostYel_inv_coe, boostMatY, - algebraMap_real_complex, - repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton, - Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, Fin.sum_univ_two, - Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, Fin.isValue, - Complex.star_def, map_div₀, map_neg, map_inv₀, map_ofNat, map_mul, - Complex.conj_ofReal, Complex.conj_I, Complex.ofReal_zero, Complex.ofReal_one, - mul_zero, zero_mul, mul_one, one_mul, zero_smul, smul_zero, add_zero, zero_add] - push_cast - match_scalars <;> field_simp <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf) - -- ### B. The six weight-zero bilinears lie in the span of the pairs - have hSW : Submodule.span ℂ S ≤ W := le_sup_left - have hpm : ∀ {u v : JetAlgebra}, u + v ∈ S → u - v ∈ S → u ∈ W ∧ v ∈ W := by - intro u v h₁ h₂ - have e₁ : u + v ∈ W := hSW (Submodule.subset_span h₁) - have e₂ : u - v ∈ W := hSW (Submodule.subset_span h₂) - constructor - · rw [show u = (2⁻¹ : ℂ) • (u + v) + (2⁻¹ : ℂ) • (u - v) from by module] - exact add_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - · rw [show v = (2⁻¹ : ℂ) • (u + v) - (2⁻¹ : ℂ) • (u - v) from by module] - exact sub_mem (Submodule.smul_mem _ _ e₁) (Submodule.smul_mem _ _ e₂) - obtain ⟨k1, k8⟩ : Bp * P ∈ W ∧ Bm * M ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨kx0, kx1⟩ : Bp * T0m ∈ W ∧ Bm * T0p ∈ W := hpm (by simp [hS]) (by simp [hS]) - obtain ⟨ky0, ky1⟩ : Bp * T1m ∈ W ∧ Bm * T1p ∈ W := hpm (by simp [hS]) (by simp [hS]) - -- ### C. Every bilinear splits into eigen bilinears of a single weight - have hm : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l ≠ 0 → x * y ∈ W := fun hx hy h => - Submodule.mem_sup_right (Submodule.mem_iSup_of_mem _ - (Submodule.mem_iSup_of_mem h (BoostWeight.mul_mem repLorentzGroup hx hy))) - have hbil : ∀ x ∈ Submodule.span ℂ ({Bp, Bm} : Set JetAlgebra), - ∀ y ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra), - x * y ∈ W := by - intro x hx - induction hx using Submodule.span_induction with - | mem a ha => - intro y hy - induction hy using Submodule.span_induction with - | mem b hb => - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at ha hb - rcases ha with rfl | rfl <;> - rcases hb with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - exacts [k1, hm hBpw hQw (by norm_num), hm hBpw hNw (by norm_num), - hm hBpw hMw (by norm_num), hm hBpw hT0pw (by norm_num), kx0, - hm hBpw hT1pw (by norm_num), ky0, - hm hBmw hPw (by norm_num), hm hBmw hQw (by norm_num), hm hBmw hNw (by norm_num), k8, - kx1, hm hBmw hT0mw (by norm_num), ky1, hm hBmw hT1mw (by norm_num)] - | zero => simp - | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz - | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy - | zero => intro y _; simp - | add x z _ _ hx hz => intro y hy; rw [add_mul]; exact add_mem (hx y hy) (hz y hy) - | smul c x _ hx => intro y hy; rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ (hx y hy) - have hc4 : ∀ (c1 c2 c3 c4 : ℂ) {z : JetAlgebra}, z = c1 • P + c2 • Q + c3 • N + c4 • M → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 c3 c4 z rfl - exact add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp)))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc0 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T0p + c2 • T0m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hc1 : ∀ (c1 c2 : ℂ) {z : JetAlgebra}, z = c1 • T1p + c2 • T1m → - z ∈ Submodule.span ℂ ({P, Q, N, M, T0p, T0m, T1p, T1m} : Set JetAlgebra) := by - rintro c1 c2 z rfl - exact add_mem (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - (Submodule.smul_mem _ _ (Submodule.subset_span (by simp))) - have hkey : Submodule.span ℂ FF ≤ W := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨α, μ, β, rfl⟩ - refine hbil _ ?_ _ ?_ - · rw [Submodule.mem_span_pair] - match α with - | 0 => exact ⟨2⁻¹, 2⁻¹, by rw [hBp, hBm]; module⟩ - | 1 => - exact ⟨Complex.I / 2, -(Complex.I / 2), by - rw [hBp, hBm] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)⟩ - · match μ, β with - | Sum.inl 0, 0 => exact hc4 4⁻¹ 4⁻¹ 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inl 0, 1 => - exact hc4 (-(Complex.I / 4)) (Complex.I / 4) (-(Complex.I / 4)) (Complex.I / 4) - (by rw [hP, hQ, hN, hM] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - | Sum.inr 1, 0 => exact hc4 (-4⁻¹) (-4⁻¹) 4⁻¹ 4⁻¹ (by rw [hP, hQ, hN, hM]; module) - | Sum.inr 1, 1 => - exact hc4 (Complex.I / 4) (-(Complex.I / 4)) (-(Complex.I / 4)) (Complex.I / 4) - (by rw [hP, hQ, hN, hM] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - | Sum.inr 0, 0 => exact hc0 2⁻¹ 2⁻¹ (by rw [hT0p, hT0m]; module) - | Sum.inr 0, 1 => - exact hc0 (-(Complex.I / 2)) (Complex.I / 2) - (by rw [hT0p, hT0m] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - | Sum.inr 2, 0 => exact hc1 2⁻¹ 2⁻¹ (by rw [hT1p, hT1m]; module) - | Sum.inr 2, 1 => - exact hc1 (-(Complex.I / 2)) (Complex.I / 2) - (by rw [hT1p, hT1m] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq]) <;> - (try ring_nf)) - -- ### D. The intersection - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) - exacts [add_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), - sub_mem (hz hBpw hPw (by norm_num)) (hz hBmw hMw (by norm_num)), - add_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), - sub_mem (hz hBpw hT0mw (by norm_num)) (hz hBmw hT0pw (by norm_num)), - add_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num)), - sub_mem (hz hBpw hT1mw (by norm_num)) (hz hBmw hT1pw (by norm_num))] - have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ Submodule.span ℂ FF := fun α μ β => by - rw [hFF]; exact Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl) <;> - simp only [hBp, hBm, hP, hM, hT0p, hT0m, hT1p, hT1m, mul_sub, mul_add, sub_mul, add_mul, - mul_smul_comm, smul_mul_assoc] <;> - repeat' first - | apply add_mem - | apply sub_mem - | apply neg_mem - | apply Submodule.smul_mem - | exact hFm _ _ _ - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] - -/-- **The fermion kinetic term is the only bilinear of boost weight zero in every direction.** - An element of the span of the products `ψ̄_α D_μ ψ_β` has boost weight zero along all three - axes exactly when it is a multiple of `i ψ̄ σ̄^μ D_μ ψ`. - - *Here the proof is not a certificate.* The three one-axis theorems above cut the span of the - sixteen bilinears down to a six-dimensional space each, and the three sixes have to be - intersected; the intersection is read off from the coefficients, which is where the linear - independence of the bilinears (`fermionDual_apply`) enters. The `z`-axis theorem provides the - six coefficients `a₁, …, a₆`, and five functionals, each a combination of two of the duals - `fermionDual` chosen to annihilate the `x`- or the `y`-axis span, cut them down to one. -/ -lemma boostWeight_inter_fermionic_kinetic_term_full : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ {x | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} = - Submodule.span ℂ {fermionKineticTerm} := by - have hFm : ∀ α μ β, Dbarψ [] α * Dψ [μ] β ∈ - Submodule.span ℂ {x : JetAlgebra | ∃ α μ β, x = Dbarψ [] α * Dψ [μ] β} := - fun α μ β => Submodule.subset_span ⟨α, μ, β, rfl⟩ - have hinv : IsInvariant fermionKineticTerm := - ⟨repJetGaugeGroupI_fermionKineticTerm, repLorentzGroup_fermionKineticTerm⟩ - refine le_antisymm ?_ ?_ - -- ### A. The three one-axis intersections - · intro x hx - rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx - obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx - have hz := boostWeight_inter_fermionic_kinetic_term.le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) - have hbx := boostWeight_inter_fermionic_kinetic_term_x.le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) - have hby := boostWeight_inter_fermionic_kinetic_term_y.le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) - -- ### B. Pairs of dual functionals annihilating the `x`- and `y`-axis spans - have hpair : ∀ (c₁ c₂ : ℂ) (q₁ q₂ : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) {T : Set JetAlgebra}, - (∀ s ∈ T, c₁ * fermionDual q₁ s + c₂ * fermionDual q₂ s = 0) → - ∀ y ∈ Submodule.span ℂ T, c₁ * fermionDual q₁ y + c₂ * fermionDual q₂ y = 0 := by - intro c₁ c₂ q₁ q₂ T hT y hy - induction hy using Submodule.span_induction with - | mem s hs => exact hT s hs - | zero => simp - | add u v _ _ hu hv => rw [map_add, map_add]; linear_combination hu + hv - | smul c u _ hu => - rw [map_smul, map_smul, smul_eq_mul, smul_eq_mul]; linear_combination c * hu - obtain ⟨e1, e2, e3⟩ : - (-1 : ℂ) * fermionDual (0, Sum.inl 0, 0) x + 1 * fermionDual (1, Sum.inl 0, 1) x = 0 ∧ - (1 : ℂ) * fermionDual (0, Sum.inl 0, 0) x + 1 * fermionDual (0, Sum.inr 0, 1) x = 0 ∧ - (1 : ℂ) * fermionDual (0, Sum.inl 0, 0) x + 1 * fermionDual (1, Sum.inr 0, 0) x = 0 := by - refine ⟨hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx, hpair _ _ _ _ ?_ x hbx⟩ <;> - intro s hs <;> - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> - rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> - simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, - smul_mul_assoc, mul_smul_comm, fermionDual_apply] <;> - simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, - if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] - obtain ⟨e4, e5⟩ : - Complex.I * fermionDual (0, Sum.inl 0, 0) x + - 1 * fermionDual (0, Sum.inr 1, 1) x = 0 ∧ - (-Complex.I) * fermionDual (0, Sum.inl 0, 0) x + - 1 * fermionDual (1, Sum.inr 1, 0) x = 0 := by - refine ⟨hpair _ _ _ _ ?_ x hby, hpair _ _ _ _ ?_ x hby⟩ <;> - intro s hs <;> - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> - rcases hs with rfl | rfl | rfl | rfl | rfl | rfl <;> - simp only [mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, map_smul, smul_eq_mul, - smul_mul_assoc, mul_smul_comm, fermionDual_apply] <;> - simp only [Prod.mk.injEq, reduceCtorEq, Fin.isValue, Fin.reduceEq, and_false, false_and, - if_false, and_true, true_and, if_true] <;> norm_num [Fin.ext_iff] - -- ### C. The six coefficients of the `z`-axis span, and the five relations on them - rw [Submodule.mem_span_insert] at hz - obtain ⟨a1, y1, hy1, rfl⟩ := hz - rw [Submodule.mem_span_insert] at hy1 - obtain ⟨a2, y2, hy2, rfl⟩ := hy1 - rw [Submodule.mem_span_insert] at hy2 - obtain ⟨a3, y3, hy3, rfl⟩ := hy2 - rw [Submodule.mem_span_insert] at hy3 - obtain ⟨a4, y4, hy4, rfl⟩ := hy3 - rw [Submodule.mem_span_insert] at hy4 - obtain ⟨a5, y5, hy5, rfl⟩ := hy4 - obtain ⟨a6, rfl⟩ := Submodule.mem_span_singleton.1 hy5 - simp only [mul_add, mul_sub, add_mul, sub_mul, map_add, map_smul, map_sub, smul_eq_mul, - fermionDual_apply, Prod.mk.injEq, Sum.inr.injEq, Sum.inl.injEq, reduceCtorEq, Fin.isValue, - Fin.reduceEq, and_false, false_and, if_false, and_true, true_and, if_true, mul_zero, mul_one, - add_zero, zero_add, sub_zero, zero_sub] at e1 e2 e3 e4 e5 - -- ### D. One coefficient is left, and it is the kinetic term - have ha2 : a2 = 0 := by linear_combination -e1 / 2 - have ha4 : a4 = 0 := by linear_combination (e2 - e3) / 2 - have ha3 : a3 = -(a1 + a2) := by linear_combination (e2 + e3) / 2 - have ha5 : a5 = 0 := by linear_combination (e4 + e5) / 2 - have ha6 : a6 = -Complex.I * (a1 + a2) := by linear_combination (e4 - e5) / 2 - subst ha2 ha4 ha5 ha3 ha6 - rw [Submodule.mem_span_singleton] - refine ⟨-Complex.I * a1, ?_⟩ - rw [fermionKineticTerm_eq] - simp only [mul_add, mul_sub, add_zero] - have hI3 : Complex.I ^ 3 = -Complex.I := by rw [pow_succ, Complex.I_sq, neg_one_mul] - match_scalars <;> ring_nf <;> (try simp only [Complex.I_sq, hI3]) <;> (try ring_nf) - -- ### E. The kinetic term is invariant, hence of weight zero along every axis - · rw [Submodule.span_le, Set.singleton_subset_iff] - refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinv, - mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hinv⟩, ?_⟩ - rw [fermionKineticTerm_eq] - exact Submodule.smul_mem _ _ (sub_mem (sub_mem (sub_mem - (add_mem (hFm _ _ _) (hFm _ _ _)) (add_mem (hFm _ _ _) (hFm _ _ _))) - (Submodule.smul_mem _ _ (sub_mem (hFm _ _ _) (hFm _ _ _)))) - (sub_mem (hFm _ _ _) (hFm _ _ _))) - -/-! - -## The key theorem - --/ - -lemma mem_fermionic_kinetic_span_eq_kineticTerm_of_isInvariant {x : JetAlgebra} - (hx : IsInvariant x) (ht : x ∈ Submodule.span ℂ {y | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : - x ∈ Submodule.span ℂ {fermionKineticTerm} := by - rw [← boostWeight_inter_fermionic_kinetic_term_full] - exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean deleted file mode 100644 index 52c4516ef..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/BoostWeight.lean +++ /dev/null @@ -1,1758 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.JetDerivLorentz -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.Closure -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.LinearIndependence -/-! -# The boost weight of the second derivatives of the field strength - -The span of the monomials `∂_ρ ∂_τ F_{μν}` is analysed as the photon pairs are in -`GaugeKineticTerm.BoostWeight`, with one difference: there the two factors of a product carry -the weights and multiplication adds them, here the two derivatives carry the weights and the -light-cone derivative operators shift them. - -*The derivatives are Lorentz vectors.* `JetDerivLorentz` proves -`ρ(Λ) (∂_μ x) = ∑ a, Λ_{aμ} • ∂_a (ρ(Λ) x)` on the bosonic part of the jet algebra, which is -where these monomials live. For the boost along an axis the four derivative directions -diagonalise exactly as the field-strength indices do: the light-cone combinations `∂_0 ∓ ∂_i` -shift the weight by `±2` and the two transverse derivatives leave it alone. Composing the -shifts with the weights of the field strengths themselves gives the weight of every -`∂_a ∂_b F_c` without a separate computation for each. - -## Key results - -- `JetAlgebra.lcp_mem_boostWeight`, `lcn_mem_boostWeight`, `jetDeriv_transverse_mem` : the - light-cone derivatives shift the boost weight of their axis by `±2`, the transverse - derivatives preserve it. -- `JetAlgebra.boostWeight_inter_fieldStrengthDeriv_pair_le` and its `_x`, `_y` partners : along - each axis the boost weight zero part of the span of the monomials `∂_ρ ∂_τ F_{μν}` lies in - the span of sixteen explicit second derivatives. -- `JetAlgebra.boostWeight_inter_fieldStrengthDeriv_pair_full` : the three axes together leave - nothing — the intersection is `⊥`. - --/ - -@[expose] public section - -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false - -namespace LeptonGaugeSector -open TensorProduct StandardModel Lorentz -open scoped minkowskiMatrix PauliMatrix Pointwise -open Matrix MatrixGroups - -namespace JetAlgebra - -private lemma algebraMap_real_complex (t : ℝ) : - (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl - -/-! - -## A. The light-cone derivatives shift the `z`-boost weight - --/ - -/-- **The light-cone derivative `∂_0 - ∂_z` raises the `z`-boost weight by two.** -/ -lemma jetDeriv_lightConeZ_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k + 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, - repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] - rw [algebraMap_real_complex, zpow_add₀ ht'] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- **The light-cone derivative `∂_0 + ∂_z` lowers the `z`-boost weight by two.** -/ -lemma jetDeriv_lightConeZ_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 2) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (k - 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, - repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] - rw [algebraMap_real_complex, zpow_sub₀ ht'] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- **A transverse derivative leaves the `z`-boost weight alone.** -/ -lemma jetDeriv_transverseZ_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 2) - (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k) : - jetDeriv (Sum.inr i) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 k := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] - fin_cases i - · - simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - · - simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_two, toLorentzGroup_boostZel, boostMatZ, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add] - · exact absurd rfl hi - -/-! - -## B. The same shifts along the `x`- and `y`-axes - --/ - -/-- **The light-cone derivative `∂_0 - ∂_x` raises the `x`-boost weight by two.** -/ -lemma jetDeriv_lightConeX_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k + 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, - repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] - rw [algebraMap_real_complex, zpow_add₀ ht'] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- **The light-cone derivative `∂_0 + ∂_x` lowers the `x`-boost weight by two.** -/ -lemma jetDeriv_lightConeX_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 0) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (k - 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, - repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] - rw [algebraMap_real_complex, zpow_sub₀ ht'] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- **A transverse derivative leaves the `x`-boost weight alone.** -/ -lemma jetDeriv_transverseX_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 0) - (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k) : - jetDeriv (Sum.inr i) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] - fin_cases i - · exact absurd rfl hi - · - simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - · - simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_zero, toLorentzGroup_boostXel, boostMatX, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - -/-- **The light-cone derivative `∂_0 - ∂_y` raises the `y`-boost weight by two.** -/ -lemma jetDeriv_lightConeY_pos_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : - jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k + 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, - repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] - rw [algebraMap_real_complex, zpow_add₀ ht'] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- **The light-cone derivative `∂_0 + ∂_y` lowers the `y`-boost weight by two.** -/ -lemma jetDeriv_lightConeY_neg_mem {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : - jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr 1) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (k - 2) := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, - repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht] - rw [algebraMap_real_complex, zpow_sub₀ ht'] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - match_scalars <;> (field_simp; ring) - -/-- **A transverse derivative leaves the `y`-boost weight alone.** -/ -lemma jetDeriv_transverseY_mem {k : ℤ} {x : JetAlgebra} {i : Fin 3} (hi : i ≠ 1) - (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k) : - jetDeriv (Sum.inr i) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k := by - intro t ht - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [repLorentzGroup_jetDeriv_of_mem_bosonic _ _ hb, hx t ht, algebraMap_real_complex] - fin_cases i - · - simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - · exact absurd rfl hi - · - simp only [Fin.isValue, Fin.zero_eta, Fin.mk_one, Fin.reduceFinMk] - simp only [boostAxis_one, toLorentzGroup_boostYel, boostMatY, Fintype.sum_sum_type, - Fin.sum_univ_one, Fin.sum_univ_three, map_smul, Complex.ofReal_zero, zero_smul, - Complex.ofReal_one, one_smul, add_zero, zero_add, Complex.ofReal_div, Complex.ofReal_add, - Complex.ofReal_sub, Complex.ofReal_pow, Complex.ofReal_inv, Complex.ofReal_neg, - Complex.ofReal_ofNat] - -/-! - -## D. The light-cone derivative operators - -Along the axis `i` the four derivative directions regroup into the two light-cone combinations -`∂_0 ∓ ∂_i`, which shift the `i`-boost weight by `±2`, and the two transverse derivatives, which -preserve it. The three axes differ only through the shift lemmas of sections A and B, so the -operators, and everything algebraic about them, are set up once, parametrised by the axis. - --/ - -/-- The light-cone derivative `∂_0 - ∂_i`, as an operator. -/ -noncomputable def lcp (i : Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv (Sum.inl 0) - jetDeriv (Sum.inr i) - -/-- The light-cone derivative `∂_0 + ∂_i`, as an operator. -/ -noncomputable def lcn (i : Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv (Sum.inl 0) + jetDeriv (Sum.inr i) - -lemma lcp_apply (i : Fin 3) (x : JetAlgebra) : - lcp i x = jetDeriv (Sum.inl 0) x - jetDeriv (Sum.inr i) x := rfl - -lemma lcn_apply (i : Fin 3) (x : JetAlgebra) : - lcn i x = jetDeriv (Sum.inl 0) x + jetDeriv (Sum.inr i) x := rfl - -/-- `∂_0 - ∂_i` raises the `i`-boost weight of a bosonic element by two. -/ -lemma lcp_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : lcp i x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (k + 2) := by - fin_cases i - · exact jetDeriv_lightConeX_pos_mem hb hx - · exact jetDeriv_lightConeY_pos_mem hb hx - · exact jetDeriv_lightConeZ_pos_mem hb hx - -/-- `∂_0 + ∂_i` lowers the `i`-boost weight of a bosonic element by two. -/ -lemma lcn_mem_boostWeight {i : Fin 3} {k : ℤ} {x : JetAlgebra} (hb : x ∈ bosonic) - (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : lcn i x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i (k - 2) := by - fin_cases i - · exact jetDeriv_lightConeX_neg_mem hb hx - · exact jetDeriv_lightConeY_neg_mem hb hx - · exact jetDeriv_lightConeZ_neg_mem hb hx - -/-- A transverse derivative preserves the `i`-boost weight of a bosonic element. -/ -lemma jetDeriv_transverse_mem {i j : Fin 3} (hj : j ≠ i) {k : ℤ} {x : JetAlgebra} - (hb : x ∈ bosonic) (hx : x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : - jetDeriv (Sum.inr j) x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i k := by - fin_cases i - · exact jetDeriv_transverseX_mem hj hb hx - · exact jetDeriv_transverseY_mem hj hb hx - · exact jetDeriv_transverseZ_mem hj hb hx - -/-- The light-cone operators keep the bosonic part bosonic. -/ -lemma lcp_mem_bosonic {i : Fin 3} {x : JetAlgebra} (hx : x ∈ bosonic) : lcp i x ∈ bosonic := - sub_mem (jetDeriv_mem_bosonic _ hx) (jetDeriv_mem_bosonic _ hx) - -lemma lcn_mem_bosonic {i : Fin 3} {x : JetAlgebra} (hx : x ∈ bosonic) : lcn i x ∈ bosonic := - add_mem (jetDeriv_mem_bosonic _ hx) (jetDeriv_mem_bosonic _ hx) - -/-- A bosonic submodule of pure `i`-boost weight is carried by `∂_0 - ∂_i` to one of weight two - higher. -/ -lemma map_lcp_le {i : Fin 3} {k : ℤ} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) - (hw : P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : - Submodule.map (lcp i) P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i (k + 2) := by - rintro y ⟨u, hu, rfl⟩ - exact lcp_mem_boostWeight (hb hu) (hw hu) - -/-- The partner of `map_lcp_le`: `∂_0 + ∂_i` lowers the weight by two. -/ -lemma map_lcn_le {i : Fin 3} {k : ℤ} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) - (hw : P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : - Submodule.map (lcn i) P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i (k - 2) := by - rintro y ⟨u, hu, rfl⟩ - exact lcn_mem_boostWeight (hb hu) (hw hu) - -/-- A transverse derivative preserves the `i`-boost weight of a bosonic submodule. -/ -lemma map_jetDeriv_transverse_le {i j : Fin 3} (hj : j ≠ i) {k : ℤ} - {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) (hw : P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k) : - Submodule.map (jetDeriv (Sum.inr j)) P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup i k := by - rintro y ⟨u, hu, rfl⟩ - exact jetDeriv_transverse_mem hj (hb hu) (hw hu) - -lemma map_lcp_le_bosonic {i : Fin 3} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) : - Submodule.map (lcp i) P ≤ bosonic := by - rintro y ⟨u, hu, rfl⟩ - exact lcp_mem_bosonic (hb hu) - -lemma map_lcn_le_bosonic {i : Fin 3} {P : Submodule ℂ JetAlgebra} (hb : P ≤ bosonic) : - Submodule.map (lcn i) P ≤ bosonic := by - rintro y ⟨u, hu, rfl⟩ - exact lcn_mem_bosonic (hb hu) - -lemma map_jetDeriv_le_bosonic (μ : Fin 1 ⊕ Fin 3) {P : Submodule ℂ JetAlgebra} - (hb : P ≤ bosonic) : Submodule.map (jetDeriv μ) P ≤ bosonic := by - rintro y ⟨u, hu, rfl⟩ - exact jetDeriv_mem_bosonic _ (hb hu) - -/-! - -## E. Every second derivative is a light-cone second derivative - --/ - -private lemma eq_or_eq_of_ne : ∀ {i t₁ t₂ j : Fin 3}, t₁ ≠ i → t₂ ≠ i → t₁ ≠ t₂ → j ≠ i → - j = t₁ ∨ j = t₂ := by decide - -/-- The four light-cone directions of the axis `i` span the derivatives: every `∂_μ` is a - combination of `∂_0 ∓ ∂_i` and the two transverse derivatives. -/ -lemma jetDeriv_mem_span_lightCone {i t₁ t₂ : Fin 3} (h₁ : t₁ ≠ i) (h₂ : t₂ ≠ i) - (h₁₂ : t₁ ≠ t₂) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - jetDeriv μ x ∈ Submodule.span ℂ - {lcp i x, lcn i x, jetDeriv (Sum.inr t₁) x, jetDeriv (Sum.inr t₂) x} := by - have hp : lcp i x ∈ Submodule.span ℂ - {lcp i x, lcn i x, jetDeriv (Sum.inr t₁) x, jetDeriv (Sum.inr t₂) x} := - Submodule.subset_span (by simp) - have hm : lcn i x ∈ Submodule.span ℂ - {lcp i x, lcn i x, jetDeriv (Sum.inr t₁) x, jetDeriv (Sum.inr t₂) x} := - Submodule.subset_span (by simp) - match μ with - | Sum.inl 0 => - rw [show jetDeriv (Sum.inl 0) x = (2⁻¹ : ℂ) • lcp i x + (2⁻¹ : ℂ) • lcn i x from by - rw [lcp_apply, lcn_apply]; module] - exact add_mem (Submodule.smul_mem _ _ hp) (Submodule.smul_mem _ _ hm) - | Sum.inr j => - by_cases hj : j = i - · subst hj - rw [show jetDeriv (Sum.inr j) x = (-2⁻¹ : ℂ) • lcp j x + (2⁻¹ : ℂ) • lcn j x from by - rw [lcp_apply, lcn_apply]; module] - exact add_mem (Submodule.smul_mem _ _ hp) (Submodule.smul_mem _ _ hm) - · rcases eq_or_eq_of_ne h₁ h₂ h₁₂ hj with rfl | rfl - · exact Submodule.subset_span (by simp) - · exact Submodule.subset_span (by simp) - -/-- The light-cone derivatives commute with every jet derivative. -/ -lemma lcp_jetDeriv_comm (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - lcp i (jetDeriv μ x) = jetDeriv μ (lcp i x) := by - rw [lcp_apply, lcp_apply, map_sub, jetDeriv_comm, jetDeriv_comm (Sum.inr i)] - -lemma lcn_jetDeriv_comm (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - lcn i (jetDeriv μ x) = jetDeriv μ (lcn i x) := by - rw [lcn_apply, lcn_apply, map_add, jetDeriv_comm, jetDeriv_comm (Sum.inr i)] - -/-- The two light-cone derivatives commute with each other. -/ -lemma lcn_lcp_comm (i : Fin 3) (x : JetAlgebra) : lcn i (lcp i x) = lcp i (lcn i x) := by - simp only [lcp_apply, lcn_apply, map_sub, map_add, jetDeriv_comm (Sum.inl 0) (Sum.inr i)] - abel - -/-- One step of the light-cone derivative expansion along the axis `i` with transverse - directions `t₁`, `t₂`: the four derivative directions applied to a submodule. -/ -noncomputable def stepAxis (i t₁ t₂ : Fin 3) (P : Submodule ℂ JetAlgebra) : - Submodule ℂ JetAlgebra := - Submodule.map (lcp i) P ⊔ Submodule.map (lcn i) P ⊔ - Submodule.map (jetDeriv (Sum.inr t₁)) P ⊔ Submodule.map (jetDeriv (Sum.inr t₂)) P - -lemma stepAxis_mono {i t₁ t₂ : Fin 3} {P Q : Submodule ℂ JetAlgebra} (h : P ≤ Q) : - stepAxis i t₁ t₂ P ≤ stepAxis i t₁ t₂ Q := - sup_le_sup (sup_le_sup (sup_le_sup (Submodule.map_mono h) (Submodule.map_mono h)) - (Submodule.map_mono h)) (Submodule.map_mono h) - -/-- Every jet derivative of an element of `P` lies in `stepAxis i t₁ t₂ P`. -/ -lemma jetDeriv_mem_stepAxis {i t₁ t₂ : Fin 3} (h₁ : t₁ ≠ i) (h₂ : t₂ ≠ i) (h₁₂ : t₁ ≠ t₂) - {P : Submodule ℂ JetAlgebra} {x : JetAlgebra} (hx : x ∈ P) (μ : Fin 1 ⊕ Fin 3) : - jetDeriv μ x ∈ stepAxis i t₁ t₂ P := by - refine Submodule.span_le.2 ?_ (jetDeriv_mem_span_lightCone h₁ h₂ h₁₂ μ x) - rintro y (rfl | rfl | rfl | rfl) - · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left ⟨x, hx, rfl⟩)) - · exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨x, hx, rfl⟩)) - · exact Submodule.mem_sup_left (Submodule.mem_sup_right ⟨x, hx, rfl⟩) - · exact Submodule.mem_sup_right ⟨x, hx, rfl⟩ - -/-! - -## F. The boost weight zero part of the second derivatives - --/ - -/-- **The boost weight zero part of the second derivatives of the field strength.** An element - of the span of the monomials `∂_ρ ∂_τ F_{μν}` of `z`-boost weight zero is a combination of the - sixteen listed second derivatives: the derivative pair and the field strength each carry a - weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the - converse is not recorded. -/ -lemma boostWeight_inter_fieldStrengthDeriv_pair_le : - BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ - {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ - Submodule.span ℂ - {lcp 2 (lcn 2 (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - lcp 2 (lcn 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), - jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), - jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), - jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2))), - lcp 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - lcp 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1))), - lcp 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - lcp 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1))), - lcn 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - lcn 2 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1))), - lcn 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - lcn 2 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)))} := by - set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hPX - set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hPY - set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hMX - set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) with hMY - set T := fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hT - set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) with hL - obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : - PX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 ∧ PY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 ∧ - MX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) ∧ MY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) ∧ - T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hPX, hPY, hMX, hMY, hT, hL, map_sub, map_add, boostAxis_two, - repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, - toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - boostMatZ, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - try rw [show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. Every field strength is a combination of the eigenvectors - -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its - -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. - set A := Submodule.span ℂ {PX, PY} with hA - set B := Submodule.span ℂ {T, L} with hB - set C := Submodule.span ℂ {MX, MY} with hC - set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by - rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by - rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) - have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left - have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left - have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right - have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert _ _)) - have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert _ _)) - have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert _ _)) - have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → - x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by - rintro u v x c d hu hv rfl - exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) - have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → - v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → - fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by - intro u v c d μ ν hu hv h - rw [fieldStrengthDeriv_antisymm, h] - exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) - have hVle : V ≤ A ⊔ B ⊔ C := by - rw [hV] - refine Submodule.span_le.2 ?_ - rintro x ⟨μ, ν, rfl⟩ - match μ, ν with - | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 - | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ - | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 2, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 0, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 2, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 1, Sum.inr 2 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 0, Sum.inr 1 => exact hTV - | Sum.inr 1, Sum.inr 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV - | Sum.inl 0, Sum.inr 2 => exact hLV - | Sum.inr 2, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV - set FF : Set JetAlgebra := {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} with hFF - set S : Set JetAlgebra := - {lcp 2 (lcn 2 T), - lcp 2 (lcn 2 L), - (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) T), - (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) L), - (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 1)) T), - (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 1)) L), - (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) T), - (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) L), - lcp 2 ((jetDeriv (Sum.inr 0)) MX), - lcp 2 ((jetDeriv (Sum.inr 0)) MY), - lcp 2 ((jetDeriv (Sum.inr 1)) MX), - lcp 2 ((jetDeriv (Sum.inr 1)) MY), - lcn 2 ((jetDeriv (Sum.inr 0)) PX), - lcn 2 ((jetDeriv (Sum.inr 0)) PY), - lcn 2 ((jetDeriv (Sum.inr 1)) PX), - lcn 2 ((jetDeriv (Sum.inr 1)) PY)} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 2 j with hW - -- the three weight spaces are bosonic - have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => - fieldStrengthDeriv_mem_bosonic _ _ _ - have hAb : A ≤ bosonic := by - rw [hA] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) - · rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) - have hBb : B ≤ bosonic := by - rw [hB] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hT]; exact hFb _ _ - · rw [hL]; exact hFb _ _ - have hCb : C ≤ bosonic := by - rw [hC] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) - · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → - P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 j → P ≤ W := fun hj hP => - le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) - have bpA : Submodule.map (lcp 2) A ≤ bosonic := map_lcp_le_bosonic hAb - have wpA : Submodule.map (lcp 2) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2 + 2) := map_lcp_le hAb hAle - have bpB : Submodule.map (lcp 2) B ≤ bosonic := map_lcp_le_bosonic hBb - have wpB : Submodule.map (lcp 2) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0 + 2) := map_lcp_le hBb hBle - have bpC : Submodule.map (lcp 2) C ≤ bosonic := map_lcp_le_bosonic hCb - have wpC : Submodule.map (lcp 2) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2 + 2) := map_lcp_le hCb hCle - have bmA : Submodule.map (lcn 2) A ≤ bosonic := map_lcn_le_bosonic hAb - have wmA : Submodule.map (lcn 2) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2 - 2) := map_lcn_le hAb hAle - have bmB : Submodule.map (lcn 2) B ≤ bosonic := map_lcn_le_bosonic hBb - have wmB : Submodule.map (lcn 2) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0 - 2) := map_lcn_le hBb hBle - have bmC : Submodule.map (lcn 2) C ≤ bosonic := map_lcn_le_bosonic hCb - have wmC : Submodule.map (lcn 2) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2 - 2) := map_lcn_le hCb hCle - have bxA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hAb - have wxA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle - have bxB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hBb - have wxB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle - have bxC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hCb - have wxC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle - have byA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hAb - have wyA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle - have byB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hBb - have wyB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle - have byC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hCb - have wyC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle - have eppA : Submodule.map (lcp 2) (Submodule.map (lcp 2) A) ≤ W := - hN (by norm_num) (map_lcp_le bpA wpA) - have eppB : Submodule.map (lcp 2) (Submodule.map (lcp 2) B) ≤ W := - hN (by norm_num) (map_lcp_le bpB wpB) - have eppC : Submodule.map (lcp 2) (Submodule.map (lcp 2) C) ≤ W := - hN (by norm_num) (map_lcp_le bpC wpC) - have epmA : Submodule.map (lcp 2) (Submodule.map (lcn 2) A) ≤ W := - hN (by norm_num) (map_lcp_le bmA wmA) - have epmB : Submodule.map (lcp 2) (Submodule.map (lcn 2) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have epmC : Submodule.map (lcp 2) (Submodule.map (lcn 2) C) ≤ W := - hN (by norm_num) (map_lcp_le bmC wmC) - have epxA : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := - hN (by norm_num) (map_lcp_le bxA wxA) - have epxB : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := - hN (by norm_num) (map_lcp_le bxB wxB) - have epxC : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have epyA : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := - hN (by norm_num) (map_lcp_le byA wyA) - have epyB : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := - hN (by norm_num) (map_lcp_le byB wyB) - have epyC : Submodule.map (lcp 2) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have empA : Submodule.map (lcn 2) (Submodule.map (lcp 2) A) ≤ W := - hN (by norm_num) (map_lcn_le bpA wpA) - have empB : Submodule.map (lcn 2) (Submodule.map (lcp 2) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [lcn_lcp_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have empC : Submodule.map (lcn 2) (Submodule.map (lcp 2) C) ≤ W := - hN (by norm_num) (map_lcn_le bpC wpC) - have emmA : Submodule.map (lcn 2) (Submodule.map (lcn 2) A) ≤ W := - hN (by norm_num) (map_lcn_le bmA wmA) - have emmB : Submodule.map (lcn 2) (Submodule.map (lcn 2) B) ≤ W := - hN (by norm_num) (map_lcn_le bmB wmB) - have emmC : Submodule.map (lcn 2) (Submodule.map (lcn 2) C) ≤ W := - hN (by norm_num) (map_lcn_le bmC wmC) - have emxA : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have emxB : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := - hN (by norm_num) (map_lcn_le bxB wxB) - have emxC : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := - hN (by norm_num) (map_lcn_le bxC wxC) - have emyA : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have emyB : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := - hN (by norm_num) (map_lcn_le byB wyB) - have emyC : Submodule.map (lcn 2) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := - hN (by norm_num) (map_lcn_le byC wyC) - have expA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 2) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) - have expB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 2) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) - have expC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 2) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exmA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 2) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exmB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 2) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) - have exmC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 2) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) - have exxA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) - have exxB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exxC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) - have exyA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) - have exyB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exyC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) - have eypA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 2) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) - have eypB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 2) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) - have eypC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 2) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eymA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 2) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eymB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 2) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) - have eymC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 2) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) - have eyxA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) - have eyxB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [jetDeriv_comm (Sum.inr 1) (Sum.inr 0)] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eyxC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) - have eyyA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) - have eyyB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eyyC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) - -- every monomial is a second light-cone derivative of a field strength - have hFFle : Submodule.span ℂ FF ≤ stepAxis 2 0 1 (stepAxis 2 0 1 V) := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨ρ, τ, μ, ν, rfl⟩ - rw [fieldStrengthDeriv_pair_eq_jetDeriv] - exact jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) - (jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) - (by rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩) τ) ρ - have hmap4 : ∀ (f : JetAlgebra →ₗ[ℂ] JetAlgebra) (P Q R T : Submodule ℂ JetAlgebra), - Submodule.map f P ≤ W → Submodule.map f Q ≤ W → Submodule.map f R ≤ W → - Submodule.map f T ≤ W → Submodule.map f (P ⊔ Q ⊔ R ⊔ T) ≤ W := by - intro f P Q R T h1 h2 h3 h4 - simp only [Submodule.map_sup] - exact sup_le (sup_le (sup_le h1 h2) h3) h4 - have hin3 : ∀ (f g : JetAlgebra →ₗ[ℂ] JetAlgebra), - Submodule.map f (Submodule.map g A) ≤ W → Submodule.map f (Submodule.map g B) ≤ W → - Submodule.map f (Submodule.map g C) ≤ W → - Submodule.map f (Submodule.map g (A ⊔ B ⊔ C)) ≤ W := by - intro f g h1 h2 h3 - simp only [Submodule.map_sup] - exact sup_le (sup_le h1 h2) h3 - have hfin : stepAxis 2 0 1 (stepAxis 2 0 1 (A ⊔ B ⊔ C)) ≤ W := by - refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ - · exact hmap4 _ _ _ _ _ (hin3 _ _ eppA eppB eppC) (hin3 _ _ epmA epmB epmC) - (hin3 _ _ epxA epxB epxC) (hin3 _ _ epyA epyB epyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ empA empB empC) (hin3 _ _ emmA emmB emmC) - (hin3 _ _ emxA emxB emxC) (hin3 _ _ emyA emyB emyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ expA expB expC) (hin3 _ _ exmA exmB exmC) - (hin3 _ _ exxA exxB exxC) (hin3 _ _ exyA exyB exyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ eypA eypB eypC) (hin3 _ _ eymA eymB eymC) - (hin3 _ _ eyxA eyxB eyxC) (hin3 _ _ eyyA eyyB eyyC) - have hkey : Submodule.span ℂ FF ≤ W := - le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) - -- the sixteen generators have weight zero - have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 j → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by rintro j y rfl h; exact h - have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ - have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ - have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) - have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) - have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) - have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl) - exacts [ - hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hTb) - (lcn_mem_boostWeight hTb hTw)), - hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hLb) - (lcn_mem_boostWeight hLb hLw)), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] - refine le_trans (inf_le_inf_left _ hkey) ?_ - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 2) 0).symm, sup_bot_eq] -/-! - -## G. The boost weight zero part, `x`-direction - --/ - -/-- **The boost weight zero part of the second derivatives of the field strength.** An element - of the span of the monomials `∂_ρ ∂_τ F_{μν}` of `x`-boost weight zero is a combination of the - sixteen listed second derivatives: the derivative pair and the field strength each carry a - weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the - converse is not recorded. -/ -lemma boostWeight_inter_fieldStrengthDeriv_pair_x_le : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ - {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ - Submodule.span ℂ - {lcp 0 (lcn 0 (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - lcp 0 (lcn 0 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), - jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), - jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - jetDeriv (Sum.inr 1) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), - jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0))), - lcp 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - lcp 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2))), - lcp 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - lcp 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2))), - lcn 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - lcn 0 (jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2))), - lcn 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1))), - lcn 0 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)))} := by - set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hPX - set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hPY - set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hMX - set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hMY - set T := fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hT - set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) with hL - obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : - PX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ PY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ - MX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ MY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ - T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hPX, hPY, hMX, hMY, hT, hL, map_sub, map_add, boostAxis_zero, - repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, - toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - boostMatX, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - try rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0)] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. Every field strength is a combination of the eigenvectors - -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its - -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. - set A := Submodule.span ℂ {PX, PY} with hA - set B := Submodule.span ℂ {T, L} with hB - set C := Submodule.span ℂ {MX, MY} with hC - set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 := by - rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := by - rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) - have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left - have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left - have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right - have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert _ _)) - have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert _ _)) - have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert _ _)) - have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → - x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by - rintro u v x c d hu hv rfl - exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) - have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → - v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → - fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by - intro u v c d μ ν hu hv h - rw [fieldStrengthDeriv_antisymm, h] - exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) - have hVle : V ≤ A ⊔ B ⊔ C := by - rw [hV] - refine Submodule.span_le.2 ?_ - rintro x ⟨μ, ν, rfl⟩ - match μ, ν with - | Sum.inl 0, Sum.inl 0 | Sum.inr 1, Sum.inr 1 | Sum.inr 2, Sum.inr 2 - | Sum.inr 0, Sum.inr 0 => rw [fieldStrengthDeriv_self]; exact zero_mem _ - | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 0, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 1, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 0, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 2, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 1, Sum.inr 2 => exact hTV - | Sum.inr 2, Sum.inr 1 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV - | Sum.inl 0, Sum.inr 0 => exact hLV - | Sum.inr 0, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV - set FF : Set JetAlgebra := {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} with hFF - set S : Set JetAlgebra := - {lcp 0 (lcn 0 T), - lcp 0 (lcn 0 L), - (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) T), - (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 1)) L), - (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 2)) T), - (jetDeriv (Sum.inr 1)) ((jetDeriv (Sum.inr 2)) L), - (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) T), - (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) L), - lcp 0 ((jetDeriv (Sum.inr 1)) MX), - lcp 0 ((jetDeriv (Sum.inr 1)) MY), - lcp 0 ((jetDeriv (Sum.inr 2)) MX), - lcp 0 ((jetDeriv (Sum.inr 2)) MY), - lcn 0 ((jetDeriv (Sum.inr 1)) PX), - lcn 0 ((jetDeriv (Sum.inr 1)) PY), - lcn 0 ((jetDeriv (Sum.inr 2)) PX), - lcn 0 ((jetDeriv (Sum.inr 2)) PY)} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j with hW - -- the three weight spaces are bosonic - have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => - fieldStrengthDeriv_mem_bosonic _ _ _ - have hAb : A ≤ bosonic := by - rw [hA] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) - · rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) - have hBb : B ≤ bosonic := by - rw [hB] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hT]; exact hFb _ _ - · rw [hL]; exact hFb _ _ - have hCb : C ≤ bosonic := by - rw [hC] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) - · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → - P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 j → P ≤ W := fun hj hP => - le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) - have bpA : Submodule.map (lcp 0) A ≤ bosonic := map_lcp_le_bosonic hAb - have wpA : Submodule.map (lcp 0) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2 + 2) := map_lcp_le hAb hAle - have bpB : Submodule.map (lcp 0) B ≤ bosonic := map_lcp_le_bosonic hBb - have wpB : Submodule.map (lcp 0) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0 + 2) := map_lcp_le hBb hBle - have bpC : Submodule.map (lcp 0) C ≤ bosonic := map_lcp_le_bosonic hCb - have wpC : Submodule.map (lcp 0) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2 + 2) := map_lcp_le hCb hCle - have bmA : Submodule.map (lcn 0) A ≤ bosonic := map_lcn_le_bosonic hAb - have wmA : Submodule.map (lcn 0) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2 - 2) := map_lcn_le hAb hAle - have bmB : Submodule.map (lcn 0) B ≤ bosonic := map_lcn_le_bosonic hBb - have wmB : Submodule.map (lcn 0) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0 - 2) := map_lcn_le hBb hBle - have bmC : Submodule.map (lcn 0) C ≤ bosonic := map_lcn_le_bosonic hCb - have wmC : Submodule.map (lcn 0) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2 - 2) := map_lcn_le hCb hCle - have bxA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hAb - have wxA : Submodule.map (jetDeriv (Sum.inr 1)) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle - have bxB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hBb - have wxB : Submodule.map (jetDeriv (Sum.inr 1)) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle - have bxC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 1) hCb - have wxC : Submodule.map (jetDeriv (Sum.inr 1)) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle - have byA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hAb - have wyA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle - have byB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hBb - have wyB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle - have byC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hCb - have wyC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle - have eppA : Submodule.map (lcp 0) (Submodule.map (lcp 0) A) ≤ W := - hN (by norm_num) (map_lcp_le bpA wpA) - have eppB : Submodule.map (lcp 0) (Submodule.map (lcp 0) B) ≤ W := - hN (by norm_num) (map_lcp_le bpB wpB) - have eppC : Submodule.map (lcp 0) (Submodule.map (lcp 0) C) ≤ W := - hN (by norm_num) (map_lcp_le bpC wpC) - have epmA : Submodule.map (lcp 0) (Submodule.map (lcn 0) A) ≤ W := - hN (by norm_num) (map_lcp_le bmA wmA) - have epmB : Submodule.map (lcp 0) (Submodule.map (lcn 0) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have epmC : Submodule.map (lcp 0) (Submodule.map (lcn 0) C) ≤ W := - hN (by norm_num) (map_lcp_le bmC wmC) - have epxA : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := - hN (by norm_num) (map_lcp_le bxA wxA) - have epxB : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := - hN (by norm_num) (map_lcp_le bxB wxB) - have epxC : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have epyA : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := - hN (by norm_num) (map_lcp_le byA wyA) - have epyB : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := - hN (by norm_num) (map_lcp_le byB wyB) - have epyC : Submodule.map (lcp 0) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have empA : Submodule.map (lcn 0) (Submodule.map (lcp 0) A) ≤ W := - hN (by norm_num) (map_lcn_le bpA wpA) - have empB : Submodule.map (lcn 0) (Submodule.map (lcp 0) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [lcn_lcp_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have empC : Submodule.map (lcn 0) (Submodule.map (lcp 0) C) ≤ W := - hN (by norm_num) (map_lcn_le bpC wpC) - have emmA : Submodule.map (lcn 0) (Submodule.map (lcn 0) A) ≤ W := - hN (by norm_num) (map_lcn_le bmA wmA) - have emmB : Submodule.map (lcn 0) (Submodule.map (lcn 0) B) ≤ W := - hN (by norm_num) (map_lcn_le bmB wmB) - have emmC : Submodule.map (lcn 0) (Submodule.map (lcn 0) C) ≤ W := - hN (by norm_num) (map_lcn_le bmC wmC) - have emxA : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have emxB : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := - hN (by norm_num) (map_lcn_le bxB wxB) - have emxC : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := - hN (by norm_num) (map_lcn_le bxC wxC) - have emyA : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have emyB : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := - hN (by norm_num) (map_lcn_le byB wyB) - have emyC : Submodule.map (lcn 0) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := - hN (by norm_num) (map_lcn_le byC wyC) - have expA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 0) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) - have expB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 0) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) - have expC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcp 0) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exmA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 0) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exmB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 0) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) - have exmC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (lcn 0) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) - have exxA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) - have exxB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exxC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) - have exyA : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) - have exyB : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exyC : Submodule.map (jetDeriv (Sum.inr 1)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) - have eypA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 0) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) - have eypB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 0) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) - have eypC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 0) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eymA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 0) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eymB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 0) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) - have eymC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 0) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) - have eyxA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 1)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) - have eyxB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 1)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [jetDeriv_comm (Sum.inr 2) (Sum.inr 1)] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eyxC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 1)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) - have eyyA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) - have eyyB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eyyC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) - -- every monomial is a second light-cone derivative of a field strength - have hFFle : Submodule.span ℂ FF ≤ stepAxis 0 1 2 (stepAxis 0 1 2 V) := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨ρ, τ, μ, ν, rfl⟩ - rw [fieldStrengthDeriv_pair_eq_jetDeriv] - exact jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) - (jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) - (by rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩) τ) ρ - have hmap4 : ∀ (f : JetAlgebra →ₗ[ℂ] JetAlgebra) (P Q R T : Submodule ℂ JetAlgebra), - Submodule.map f P ≤ W → Submodule.map f Q ≤ W → Submodule.map f R ≤ W → - Submodule.map f T ≤ W → Submodule.map f (P ⊔ Q ⊔ R ⊔ T) ≤ W := by - intro f P Q R T h1 h2 h3 h4 - simp only [Submodule.map_sup] - exact sup_le (sup_le (sup_le h1 h2) h3) h4 - have hin3 : ∀ (f g : JetAlgebra →ₗ[ℂ] JetAlgebra), - Submodule.map f (Submodule.map g A) ≤ W → Submodule.map f (Submodule.map g B) ≤ W → - Submodule.map f (Submodule.map g C) ≤ W → - Submodule.map f (Submodule.map g (A ⊔ B ⊔ C)) ≤ W := by - intro f g h1 h2 h3 - simp only [Submodule.map_sup] - exact sup_le (sup_le h1 h2) h3 - have hfin : stepAxis 0 1 2 (stepAxis 0 1 2 (A ⊔ B ⊔ C)) ≤ W := by - refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ - · exact hmap4 _ _ _ _ _ (hin3 _ _ eppA eppB eppC) (hin3 _ _ epmA epmB epmC) - (hin3 _ _ epxA epxB epxC) (hin3 _ _ epyA epyB epyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ empA empB empC) (hin3 _ _ emmA emmB emmC) - (hin3 _ _ emxA emxB emxC) (hin3 _ _ emyA emyB emyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ expA expB expC) (hin3 _ _ exmA exmB exmC) - (hin3 _ _ exxA exxB exxC) (hin3 _ _ exyA exyB exyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ eypA eypB eypC) (hin3 _ _ eymA eymB eymC) - (hin3 _ _ eyxA eyxB eyxC) (hin3 _ _ eyyA eyyB eyyC) - have hkey : Submodule.span ℂ FF ≤ W := - le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) - -- the sixteen generators have weight zero - have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 j → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by rintro j y rfl h; exact h - have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ - have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ - have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) - have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) - have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) - have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl) - exacts [ - hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hTb) - (lcn_mem_boostWeight hTb hTw)), - hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hLb) - (lcn_mem_boostWeight hLb hLw)), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 1) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 1) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] - refine le_trans (inf_le_inf_left _ hkey) ?_ - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] -/-! - -## H. The boost weight zero part, `y`-direction - --/ - -/-- **The boost weight zero part of the second derivatives of the field strength.** An element - of the span of the monomials `∂_ρ ∂_τ F_{μν}` of `y`-boost weight zero is a combination of the - sixteen listed second derivatives: the derivative pair and the field strength each carry a - weight, and the two must cancel. Only this inclusion feeds the three-axis theorem, so the - converse is not recorded. -/ -lemma boostWeight_inter_fieldStrengthDeriv_pair_y_le : - BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ - {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} ≤ - Submodule.span ℂ - {lcp 1 (lcn 1 (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - lcp 1 (lcn 1 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), - jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), - jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - jetDeriv (Sum.inr 2) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), - jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0))), - jetDeriv (Sum.inr 0) (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1))), - lcp 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - lcp 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0))), - lcp 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - lcp 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0))), - lcn 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - lcn 1 (jetDeriv (Sum.inr 2) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0))), - lcn 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2))), - lcn 1 (jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)))} := by - set PX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hPX - set PY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hPY - set MX := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hMX - set MY := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hMY - set T := fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hT - set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) with hL - obtain ⟨hPXw, hPYw, hMXw, hMYw, hTw, hLw⟩ : - PX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ PY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ - MX ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ MY ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ - T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hPX, hPY, hMX, hMY, hT, hL, map_sub, map_add, boostAxis_one, - repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, - toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - boostMatY, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - try rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1)] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. Every field strength is a combination of the eigenvectors - -- On the light-cone pairs this is `F_{0x} = ((F_{0x} - F_{zx}) + (F_{0x} + F_{zx}))/2` and its - -- partners; the remaining components are zero, `±F_{xy}`, or `±F_{0z}` by antisymmetry. - set A := Submodule.span ℂ {PX, PY} with hA - set B := Submodule.span ℂ {T, L} with hB - set C := Submodule.span ℂ {MX, MY} with hC - set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 := by - rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hPXw, hPYw]) - have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := by - rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hMXw, hMYw]) - have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left - have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left - have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right - have hPXV : PX ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert _ _)) - have hPYV : PY ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert _ _)) - have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have hMXV : MX ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert _ _)) - have hMYV : MY ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (Set.mem_insert_of_mem _ rfl)) - have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → - x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by - rintro u v x c d hu hv rfl - exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) - have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → - v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → - fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by - intro u v c d μ ν hu hv h - rw [fieldStrengthDeriv_antisymm, h] - exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) - have hVle : V ≤ A ⊔ B ⊔ C := by - rw [hV] - refine Submodule.span_le.2 ?_ - rintro x ⟨μ, ν, rfl⟩ - match μ, ν with - | Sum.inl 0, Sum.inl 0 | Sum.inr 2, Sum.inr 2 | Sum.inr 0, Sum.inr 0 - | Sum.inr 1, Sum.inr 1 => rw [fieldStrengthDeriv_self]; exact zero_mem _ - | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 1, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 2, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hPXV hMXV (by rw [hPX, hMX]; module) - | Sum.inr 1, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 0, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hPYV hMYV (by rw [hPY, hMY]; module) - | Sum.inr 2, Sum.inr 0 => exact hTV - | Sum.inr 0, Sum.inr 2 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV - | Sum.inl 0, Sum.inr 1 => exact hLV - | Sum.inr 1, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV - set FF : Set JetAlgebra := {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} with hFF - set S : Set JetAlgebra := - {lcp 1 (lcn 1 T), - lcp 1 (lcn 1 L), - (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) T), - (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 2)) L), - (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 0)) T), - (jetDeriv (Sum.inr 2)) ((jetDeriv (Sum.inr 0)) L), - (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) T), - (jetDeriv (Sum.inr 0)) ((jetDeriv (Sum.inr 0)) L), - lcp 1 ((jetDeriv (Sum.inr 2)) MX), - lcp 1 ((jetDeriv (Sum.inr 2)) MY), - lcp 1 ((jetDeriv (Sum.inr 0)) MX), - lcp 1 ((jetDeriv (Sum.inr 0)) MY), - lcn 1 ((jetDeriv (Sum.inr 2)) PX), - lcn 1 ((jetDeriv (Sum.inr 2)) PY), - lcn 1 ((jetDeriv (Sum.inr 0)) PX), - lcn 1 ((jetDeriv (Sum.inr 0)) PY)} with hS - set W := Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j with hW - -- the three weight spaces are bosonic - have hFb : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ bosonic := fun μ ν => - fieldStrengthDeriv_mem_bosonic _ _ _ - have hAb : A ≤ bosonic := by - rw [hA] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) - · rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) - have hBb : B ≤ bosonic := by - rw [hB] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hT]; exact hFb _ _ - · rw [hL]; exact hFb _ _ - have hCb : C ≤ bosonic := by - rw [hC] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl) - · rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) - · rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hN : ∀ {j : ℤ} {P : Submodule ℂ JetAlgebra}, j ≠ 0 → - P ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 j → P ≤ W := fun hj hP => - le_trans hP (le_sup_of_le_right (le_iSup_of_le _ (le_iSup_of_le hj le_rfl))) - have bpA : Submodule.map (lcp 1) A ≤ bosonic := map_lcp_le_bosonic hAb - have wpA : Submodule.map (lcp 1) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2 + 2) := map_lcp_le hAb hAle - have bpB : Submodule.map (lcp 1) B ≤ bosonic := map_lcp_le_bosonic hBb - have wpB : Submodule.map (lcp 1) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0 + 2) := map_lcp_le hBb hBle - have bpC : Submodule.map (lcp 1) C ≤ bosonic := map_lcp_le_bosonic hCb - have wpC : Submodule.map (lcp 1) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2 + 2) := map_lcp_le hCb hCle - have bmA : Submodule.map (lcn 1) A ≤ bosonic := map_lcn_le_bosonic hAb - have wmA : Submodule.map (lcn 1) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2 - 2) := map_lcn_le hAb hAle - have bmB : Submodule.map (lcn 1) B ≤ bosonic := map_lcn_le_bosonic hBb - have wmB : Submodule.map (lcn 1) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0 - 2) := map_lcn_le hBb hBle - have bmC : Submodule.map (lcn 1) C ≤ bosonic := map_lcn_le_bosonic hCb - have wmC : Submodule.map (lcn 1) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2 - 2) := map_lcn_le hCb hCle - have bxA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hAb - have wxA : Submodule.map (jetDeriv (Sum.inr 2)) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle - have bxB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hBb - have wxB : Submodule.map (jetDeriv (Sum.inr 2)) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle - have bxC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 2) hCb - have wxC : Submodule.map (jetDeriv (Sum.inr 2)) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle - have byA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hAb - have wyA : Submodule.map (jetDeriv (Sum.inr 0)) A ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (2) := map_jetDeriv_transverse_le (by decide) hAb hAle - have byB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hBb - have wyB : Submodule.map (jetDeriv (Sum.inr 0)) B ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (0) := map_jetDeriv_transverse_le (by decide) hBb hBle - have byC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ bosonic := map_jetDeriv_le_bosonic (Sum.inr 0) hCb - have wyC : Submodule.map (jetDeriv (Sum.inr 0)) C ≤ - BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := map_jetDeriv_transverse_le (by decide) hCb hCle - have eppA : Submodule.map (lcp 1) (Submodule.map (lcp 1) A) ≤ W := - hN (by norm_num) (map_lcp_le bpA wpA) - have eppB : Submodule.map (lcp 1) (Submodule.map (lcp 1) B) ≤ W := - hN (by norm_num) (map_lcp_le bpB wpB) - have eppC : Submodule.map (lcp 1) (Submodule.map (lcp 1) C) ≤ W := - hN (by norm_num) (map_lcp_le bpC wpC) - have epmA : Submodule.map (lcp 1) (Submodule.map (lcn 1) A) ≤ W := - hN (by norm_num) (map_lcp_le bmA wmA) - have epmB : Submodule.map (lcp 1) (Submodule.map (lcn 1) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have epmC : Submodule.map (lcp 1) (Submodule.map (lcn 1) C) ≤ W := - hN (by norm_num) (map_lcp_le bmC wmC) - have epxA : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := - hN (by norm_num) (map_lcp_le bxA wxA) - have epxB : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := - hN (by norm_num) (map_lcp_le bxB wxB) - have epxC : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have epyA : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := - hN (by norm_num) (map_lcp_le byA wyA) - have epyB : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := - hN (by norm_num) (map_lcp_le byB wyB) - have epyC : Submodule.map (lcp 1) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have empA : Submodule.map (lcn 1) (Submodule.map (lcp 1) A) ≤ W := - hN (by norm_num) (map_lcn_le bpA wpA) - have empB : Submodule.map (lcn 1) (Submodule.map (lcp 1) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [lcn_lcp_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have empC : Submodule.map (lcn 1) (Submodule.map (lcp 1) C) ≤ W := - hN (by norm_num) (map_lcn_le bpC wpC) - have emmA : Submodule.map (lcn 1) (Submodule.map (lcn 1) A) ≤ W := - hN (by norm_num) (map_lcn_le bmA wmA) - have emmB : Submodule.map (lcn 1) (Submodule.map (lcn 1) B) ≤ W := - hN (by norm_num) (map_lcn_le bmB wmB) - have emmC : Submodule.map (lcn 1) (Submodule.map (lcn 1) C) ≤ W := - hN (by norm_num) (map_lcn_le bmC wmC) - have emxA : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have emxB : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := - hN (by norm_num) (map_lcn_le bxB wxB) - have emxC : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := - hN (by norm_num) (map_lcn_le bxC wxC) - have emyA : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have emyB : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := - hN (by norm_num) (map_lcn_le byB wyB) - have emyC : Submodule.map (lcn 1) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := - hN (by norm_num) (map_lcn_le byC wyC) - have expA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 1) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) - have expB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 1) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) - have expC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcp 1) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exmA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 1) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exmB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 1) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) - have exmC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (lcn 1) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) - have exxA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) - have exxB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exxC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) - have exyA : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) - have exyB : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have exyC : Submodule.map (jetDeriv (Sum.inr 2)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) - have eypA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 1) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpA wpA) - have eypB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 1) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bpB wpB) - have eypC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcp 1) C) ≤ W := by - simp only [hC, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcp_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eymA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 1) A) ≤ W := by - simp only [hA, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [← lcn_jetDeriv_comm] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eymB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 1) B) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmB wmB) - have eymC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (lcn 1) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bmC wmC) - have eyxA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 2)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxA wxA) - have eyxB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 2)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> rw [jetDeriv_comm (Sum.inr 0) (Sum.inr 2)] <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eyxC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 2)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) bxC wxC) - have eyyA : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) A) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byA wyA) - have eyyB : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) B) ≤ W := by - simp only [hB, Submodule.map_span, Set.image_insert_eq, Set.image_singleton] - refine le_trans (Submodule.span_le.2 ?_) le_sup_left - rintro y (rfl | rfl) <;> exact Submodule.subset_span (by - simp only [hS, Set.mem_insert_iff, Set.mem_singleton_iff, true_or, or_true, - eq_self_iff_true]) - have eyyC : Submodule.map (jetDeriv (Sum.inr 0)) (Submodule.map (jetDeriv (Sum.inr 0)) C) ≤ W := - hN (by norm_num) (map_jetDeriv_transverse_le (by decide) byC wyC) - -- every monomial is a second light-cone derivative of a field strength - have hFFle : Submodule.span ℂ FF ≤ stepAxis 1 2 0 (stepAxis 1 2 0 V) := by - rw [hFF] - refine Submodule.span_le.2 ?_ - rintro x ⟨ρ, τ, μ, ν, rfl⟩ - rw [fieldStrengthDeriv_pair_eq_jetDeriv] - exact jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) - (jetDeriv_mem_stepAxis (by decide) (by decide) (by decide) - (by rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩) τ) ρ - have hmap4 : ∀ (f : JetAlgebra →ₗ[ℂ] JetAlgebra) (P Q R T : Submodule ℂ JetAlgebra), - Submodule.map f P ≤ W → Submodule.map f Q ≤ W → Submodule.map f R ≤ W → - Submodule.map f T ≤ W → Submodule.map f (P ⊔ Q ⊔ R ⊔ T) ≤ W := by - intro f P Q R T h1 h2 h3 h4 - simp only [Submodule.map_sup] - exact sup_le (sup_le (sup_le h1 h2) h3) h4 - have hin3 : ∀ (f g : JetAlgebra →ₗ[ℂ] JetAlgebra), - Submodule.map f (Submodule.map g A) ≤ W → Submodule.map f (Submodule.map g B) ≤ W → - Submodule.map f (Submodule.map g C) ≤ W → - Submodule.map f (Submodule.map g (A ⊔ B ⊔ C)) ≤ W := by - intro f g h1 h2 h3 - simp only [Submodule.map_sup] - exact sup_le (sup_le h1 h2) h3 - have hfin : stepAxis 1 2 0 (stepAxis 1 2 0 (A ⊔ B ⊔ C)) ≤ W := by - refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ - · exact hmap4 _ _ _ _ _ (hin3 _ _ eppA eppB eppC) (hin3 _ _ epmA epmB epmC) - (hin3 _ _ epxA epxB epxC) (hin3 _ _ epyA epyB epyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ empA empB empC) (hin3 _ _ emmA emmB emmC) - (hin3 _ _ emxA emxB emxC) (hin3 _ _ emyA emyB emyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ expA expB expC) (hin3 _ _ exmA exmB exmC) - (hin3 _ _ exxA exxB exxC) (hin3 _ _ exyA exyB exyC) - · exact hmap4 _ _ _ _ _ (hin3 _ _ eypA eypB eypC) (hin3 _ _ eymA eymB eymC) - (hin3 _ _ eyxA eyxB eyxC) (hin3 _ _ eyyA eyyB eyyC) - have hkey : Submodule.span ℂ FF ≤ W := - le_trans hFFle (le_trans (stepAxis_mono (stepAxis_mono hVle)) hfin) - -- the sixteen generators have weight zero - have hwz : ∀ {j : ℤ} {y : JetAlgebra}, j = 0 → y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 j → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by rintro j y rfl h; exact h - have hTb : T ∈ bosonic := by rw [hT]; exact hFb _ _ - have hLb : L ∈ bosonic := by rw [hL]; exact hFb _ _ - have hPXb : PX ∈ bosonic := by rw [hPX]; exact sub_mem (hFb _ _) (hFb _ _) - have hPYb : PY ∈ bosonic := by rw [hPY]; exact sub_mem (hFb _ _) (hFb _ _) - have hMXb : MX ∈ bosonic := by rw [hMX]; exact add_mem (hFb _ _) (hFb _ _) - have hMYb : MY ∈ bosonic := by rw [hMY]; exact add_mem (hFb _ _) (hFb _ _) - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | - rfl | rfl) - exacts [ - hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hTb) - (lcn_mem_boostWeight hTb hTw)), - hwz (by norm_num) (lcp_mem_boostWeight (lcn_mem_bosonic hLb) - (lcn_mem_boostWeight hLb hLw)), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 2) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hTb) (jetDeriv_transverse_mem (by decide) hTb hTw), - jetDeriv_transverse_mem (by decide) (jetDeriv_mem_bosonic (Sum.inr 0) hLb) (jetDeriv_transverse_mem (by decide) hLb hLw), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMXb) (jetDeriv_transverse_mem (by decide) hMXb hMXw)), - hwz (by norm_num) (lcp_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hMYb) (jetDeriv_transverse_mem (by decide) hMYb hMYw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 2) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPXb) (jetDeriv_transverse_mem (by decide) hPXb hPXw)), - hwz (by norm_num) (lcn_mem_boostWeight (jetDeriv_mem_bosonic (Sum.inr 0) hPYb) (jetDeriv_transverse_mem (by decide) hPYb hPYw))] - refine le_trans (inf_le_inf_left _ hkey) ?_ - rw [hW, inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] -/-! - -## I. The Bianchi identity and the three-axis intersection - --/ - - -lemma lcn_T_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) = - jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) - - jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) := by - simp only [lcn_apply, map_add] - rw [jetDeriv_fieldStrengthDeriv_bianchi (Sum.inl 0) (Sum.inr 0) (Sum.inr 1), - jetDeriv_fieldStrengthDeriv_bianchi (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)] - abel - -lemma lcn_PX_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) = - (2 : ℂ) • jetDeriv (Sum.inr 0) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - lcp 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) := by - simp only [lcn_apply, lcp_apply, map_add, map_sub] - rw [jetDeriv_fieldStrengthDeriv_bianchi (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] - simp only [map_neg] - module - -lemma lcn_PY_eq : lcn 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) = - (2 : ℂ) • jetDeriv (Sum.inr 1) (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) + - lcp 2 (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) := by - simp only [lcn_apply, lcp_apply, map_add, map_sub] - rw [jetDeriv_fieldStrengthDeriv_bianchi (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2)] - simp only [map_neg] - module - -theorem boostWeight_inter_fieldStrengthDeriv_pair_full : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ - Submodule.span ℂ {x | ∃ ρ τ μ ν, x = fieldStrengthDeriv {ρ, τ} μ ν} = ⊥ := by - refine le_antisymm (fun x hx => ?_) bot_le - rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx - obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx - have hz := boostWeight_inter_fieldStrengthDeriv_pair_le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) - have hbx := boostWeight_inter_fieldStrengthDeriv_pair_x_le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) - have hby := boostWeight_inter_fieldStrengthDeriv_pair_y_le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) - have hann : ∀ (φ : JetAlgebra →ₗ[ℂ] ℂ) {T : Set JetAlgebra}, (∀ s ∈ T, φ s = 0) → - ∀ y ∈ Submodule.span ℂ T, φ y = 0 := by - intro φ T hT y hy - induction hy using Submodule.span_induction with - | mem s hs => exact hT s hs - | zero => simp - | add u v _ _ hu hv => rw [map_add, hu, hv, add_zero] - | smul c u _ hu => rw [map_smul, hu, smul_zero] - obtain ⟨e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11⟩ : - gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inl 0}, Sum.inr 2) x = 0 ∧ - gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 0}, Sum.inr 0) x = 0 ∧ - gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 0}, Sum.inr 1) x = 0 ∧ - gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 1}, Sum.inr 0) x = 0 ∧ - gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 1}, Sum.inr 1) x = 0 ∧ - gaugeDerivDual ({Sum.inl 0, Sum.inr 0, Sum.inr 0}, Sum.inr 2) x = 0 ∧ - gaugeDerivDual ({Sum.inl 0, Sum.inr 0, Sum.inr 1}, Sum.inr 2) x = 0 ∧ - gaugeDerivDual ({Sum.inl 0, Sum.inr 1, Sum.inr 1}, Sum.inr 2) x = 0 ∧ - gaugeDerivDual ({Sum.inr 0, Sum.inr 0, Sum.inr 0}, Sum.inr 1) x = 0 ∧ - gaugeDerivDual ({Sum.inr 0, Sum.inr 1, Sum.inr 1}, Sum.inr 1) x = 0 ∧ - (gaugeDerivDual ({Sum.inl 0, Sum.inl 0, Sum.inr 1}, Sum.inr 1) + - gaugeDerivDual ({Sum.inr 0, Sum.inr 0, Sum.inr 1}, Sum.inr 1)) x = 0 := by - refine ⟨hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hby, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx⟩ <;> - intro s hs <;> - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> - rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> - simp +decide only [lcp_apply, lcn_apply, map_add, map_sub, - LinearMap.add_apply, ← fieldStrengthDeriv_pair_eq_jetDeriv, - gaugeDerivDual_fieldStrengthDeriv, fsDerivCoeff, add_zero, zero_add, sub_zero, - zero_sub, sub_self, add_neg_cancel, neg_add_cancel] - rw [Submodule.mem_bot] - obtain ⟨a1, y1, hy1, rfl⟩ := Submodule.mem_span_insert.1 hz - obtain ⟨a2, y2, hy2, rfl⟩ := Submodule.mem_span_insert.1 hy1 - obtain ⟨a3, y3, hy3, rfl⟩ := Submodule.mem_span_insert.1 hy2 - obtain ⟨a4, y4, hy4, rfl⟩ := Submodule.mem_span_insert.1 hy3 - obtain ⟨a5, y5, hy5, rfl⟩ := Submodule.mem_span_insert.1 hy4 - obtain ⟨a6, y6, hy6, rfl⟩ := Submodule.mem_span_insert.1 hy5 - obtain ⟨a7, y7, hy7, rfl⟩ := Submodule.mem_span_insert.1 hy6 - obtain ⟨a8, y8, hy8, rfl⟩ := Submodule.mem_span_insert.1 hy7 - obtain ⟨a9, y9, hy9, rfl⟩ := Submodule.mem_span_insert.1 hy8 - obtain ⟨a10, y10, hy10, rfl⟩ := Submodule.mem_span_insert.1 hy9 - obtain ⟨a11, y11, hy11, rfl⟩ := Submodule.mem_span_insert.1 hy10 - obtain ⟨a12, y12, hy12, rfl⟩ := Submodule.mem_span_insert.1 hy11 - obtain ⟨a13, y13, hy13, rfl⟩ := Submodule.mem_span_insert.1 hy12 - obtain ⟨a14, y14, hy14, rfl⟩ := Submodule.mem_span_insert.1 hy13 - obtain ⟨a15, y15, hy15, rfl⟩ := Submodule.mem_span_insert.1 hy14 - obtain ⟨a16, rfl⟩ := Submodule.mem_span_singleton.1 hy15 - simp +decide only [map_add, map_smul, smul_eq_mul, LinearMap.add_apply, lcp_apply, - lcn_apply, map_sub, ← fieldStrengthDeriv_pair_eq_jetDeriv, - gaugeDerivDual_fieldStrengthDeriv, fsDerivCoeff, if_true, if_false, mul_zero, mul_one, - add_zero, zero_add, sub_zero, zero_sub, sub_self] at e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 - ring_nf at e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 - simp only [lcp_jetDeriv_comm, lcn_jetDeriv_comm] - simp only [lcn_T_eq, lcn_PX_eq, lcn_PY_eq] - simp only [map_add, map_sub, map_smul, lcp_jetDeriv_comm, lcn_jetDeriv_comm, - jetDeriv_comm (Sum.inr 1) (Sum.inr 0)] - match_scalars - · linear_combination e3 - · linear_combination e3 - · linear_combination e4 - · linear_combination e4 - · linear_combination e1 - · linear_combination e9 - · linear_combination e6 + e2 - · linear_combination e11 - e5 - · linear_combination e7 + e3 + e4 - · linear_combination e10 - · linear_combination e8 + e5 - · linear_combination e2 - · linear_combination e2 - · linear_combination e5 - · linear_combination e5 - -end JetAlgebra - -end LeptonGaugeSector - - - - - - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean deleted file mode 100644 index 9a07e44eb..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Invariance.lean +++ /dev/null @@ -1,58 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.BoostWeight -/-! -# The invariant second derivatives of the field strength - -An invariant element of the span of the monomials `∂_ρ ∂_τ F_{μν}` is zero: the gauge sector has -no Lorentz invariant linear in the field strength. A scalar built from `∂_ρ ∂_τ F_{μν}` would -have to contract the symmetric derivative pair with the antisymmetric index pair of the field -strength, and that contraction vanishes. - -Only one implication of `boostWeight_inter_fieldStrengthDeriv_pair_full` is used, and only -through the boosts: an invariant element has boost weight zero along each of the three axes -(`mem_boostWeightSubmodule_zero_of_isInvariant`), which is already enough to force it to vanish. - -## Key results - -- `JetAlgebra.eq_zero_of_isInvariant_of_mem_span_fieldStrengthDeriv_pair` : an invariant second - derivative of the field strength is zero. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## The key theorem - --/ - -/-- **There is no invariant second derivative of the field strength.** An invariant element of - the span of the monomials `∂_ρ ∂_τ F_{μν}` is zero. -/ -lemma eq_zero_of_isInvariant_of_mem_span_fieldStrengthDeriv_pair {x : JetAlgebra} - (hx : IsInvariant x) - (ht : x ∈ Submodule.span ℂ {y | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : - x = 0 := by - have hb : x ∈ (⊥ : Submodule ℂ JetAlgebra) := by - rw [← boostWeight_inter_fieldStrengthDeriv_pair_full] - exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ - simpa using hb - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean deleted file mode 100644 index f0718e64c..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/BoostWeight.lean +++ /dev/null @@ -1,629 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Boosts.FieldStrength -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.ThetaTerm -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.LinearIndependence -/-! -# The boost weight zero part of the photon pairs - -The products `F_{μν} F_{μ'ν'}` of two field strengths span a submodule of the jet algebra. This -file computes the intersection of that span with the boost weight zero submodule of each of the -three axes: for one axis it is spanned by seven explicit products, written out in the statement -of the theorem; imposing all three at once leaves the Maxwell and theta terms. - -*The one-axis proof is a certificate.* Rather than deducing the intersection abstractly, the span -of the products is expanded into boost eigenvectors. For the `z`-boost the coordinate components -`F_{μν}` are not boost eigenvectors, but six combinations of them are: the light-cone -combinations `F_{0x} - F_{zx}` and `F_{0y} - F_{zy}` of weight `2`, their partners -`F_{0x} + F_{zx}` and `F_{0y} + F_{zy}` of weight `-2`, and the two components with no free -light-cone index, `F_{xy}` and `F_{0z}`, of weight `0`. Every `F_{μν}` is a combination of these -six — the sixteen cases of step B — so the span of the products lies in the sum of the nine -products of the three weight spaces, of weights `0, ±2, ±4`. The three of weight zero — a -weight-`2` field strength against a weight-`-2` one, and two weight-zero ones — are exactly the -seven products listed. - -The intersection then follows formally, with no linear independence of the products needed. The -weight submodules are independent (`BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup`), so boost weight zero is -disjoint from the span of the weights `±2, ±4`; since the weight-zero part sits inside boost -weight zero, the modular law cuts the intersection down to it. The `x`- and `y`-axis theorems are -the same certificate with the light-cone pairs built on those axes instead. - -*The three-axis theorem is not a certificate.* The three seven-dimensional spans have to be -intersected, and that is done on coefficients, with the dual family of -`GaugeKineticTerm.LinearIndependence` reading them off. - -## i. Overview - -Each one-axis proof runs in four steps, marked in its source. Step A exhibits the boost -eigenvectors, step B decomposes the coordinate components, step C splits every product into -eigen products of a single weight, and step D assembles the intersection. - -## ii. Key results - -- `JetAlgebra.boostWeight_inter_fieldStrength` : the intersection of boost weight zero with the - span of the products `F_{μν} F_{μ'ν'}` is the span of the seven weight-zero products, and - `_x`, `_y` for the other two axes. -- `JetAlgebra.boostWeight_inter_fieldStrength_full` : imposing boost weight zero along all three - axes at once leaves the span of the Maxwell and theta terms. - --/ - -@[expose] public section - -set_option linter.unusedSimpArgs false -set_option linter.unusedTactic false -set_option linter.unnecessarySeqFocus false - -namespace LeptonGaugeSector -open TensorProduct StandardModel Lorentz -open scoped minkowskiMatrix PauliMatrix Pointwise -open Matrix MatrixGroups - -namespace JetAlgebra - -private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl - -/-- **The boost weight zero part of the photon pairs.** An element of the span of the products - `F_{μν} F_{μ'ν'}` of two field strengths has boost weight zero exactly when it is a combination - of the seven products of a weight-`2` light-cone field strength `F_{0x} - F_{zx}`, - `F_{0y} - F_{zy}` with a weight-`-2` one `F_{0x} + F_{zx}`, `F_{0y} + F_{zy}`, and of the - weight-zero components `F_{xy}` and `F_{0z}` with each other. -/ -theorem boostWeight_inter_fieldStrength : - BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = - Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1)), - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1), - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)} := by - have hmul : _ = _ := boostProj_z_map_fieldStrengthDeriv_mul_eq_boosts - rw [boostProj_z_zero_map_fieldStrengthDeriv_span, - boostProj_z_two_map_fieldStrengthDeriv_span, - boostProj_z_neg_two_map_fieldStrengthDeriv_span] at hmul - have hclosed := boostProj_z_map_fieldStrengthDeriv_mul_span_le - rw [BoostWeight.inf_boostWeightSubmodule_eq_map repLorentzGroup hclosed, hmul, Submodule.span_mul_span, - Submodule.span_mul_span, Submodule.add_eq_sup, ← Submodule.span_union] - refine Submodule.span_eq_span ?_ ?_ - · rintro x (⟨a, (rfl | rfl), b, (rfl | rfl), rfl⟩ | ⟨a, (rfl | rfl), b, (rfl | rfl), rfl⟩) <;> - exact Submodule.subset_span (by - simp [fieldStrengthDeriv_mul_comm 0 0 (Sum.inl 0) (Sum.inr 2) (Sum.inr 0) (Sum.inr 1)]) - · rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) - exacts [Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), - Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), - Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), - Submodule.subset_span (Set.mem_union_right _ (Set.mul_mem_mul (by simp) (by simp))), - Submodule.subset_span (Set.mem_union_left _ (Set.mul_mem_mul (by simp) (by simp))), - Submodule.subset_span (Set.mem_union_left _ (Set.mul_mem_mul (by simp) (by simp))), - Submodule.subset_span (Set.mem_union_left _ (Set.mul_mem_mul (by simp) (by simp)))] - -/-- **The boost weight zero part of the photon pairs, `x`-direction.** As for the `z`-boost, - with the light-cone pairs now built on the `x`-axis: `F_{0y} ∓ F_{xy}` and `F_{0z} ∓ F_{xz}` - have weight `±2`, and `F_{yz}`, `F_{0x}` have weight zero. -/ -theorem boostWeight_inter_fieldStrength_x : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ Submodule.span ℂ - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = - Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)), - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2), - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)} := by - -- ### A. The boost eigenvectors among the field strengths - set P1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hP1 - set P2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hP2 - set M1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) with hM1 - set M2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) with hM2 - set T := fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hT - set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) with hL - set FF : Set JetAlgebra := - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF - set S : Set JetAlgebra := {P1 * M1, P1 * M2, P2 * M1, P2 * M2, T * T, T * L, L * L} with hS - obtain ⟨hP1w, hP2w, hM1w, hM2w, hTw, hLw⟩ : - P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ P2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 ∧ - M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ M2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) ∧ - T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hP1, hP2, hM1, hM2, hT, hL, map_sub, map_add, boostAxis_zero, - repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, - toLorentzGroup_boostXel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - boostMatX, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - try rw [show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0)] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. Every field strength is a combination of the eigenvectors - set A := Submodule.span ℂ {P1, P2} with hA - set B := Submodule.span ℂ {T, L} with hB - set C := Submodule.span ℂ {M1, M2} with hC - set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 2 := by - rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hP1w, hP2w]) - have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 (-2) := by - rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hM1w, hM2w]) - have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left - have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left - have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right - have hP1V : P1 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) - have hP2V : P2 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) - have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) - have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) - have hM1V : M1 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) - have hM2V : M2 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) - have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → - x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by - rintro u v x c d hu hv rfl - exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) - have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → - v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → - fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by - intro u v c d μ ν hu hv h - rw [fieldStrengthDeriv_antisymm, h] - exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) - have hVle : V ≤ A ⊔ B ⊔ C := by - rw [hV] - refine Submodule.span_le.2 ?_ - rintro x ⟨μ, ν, rfl⟩ - match μ, ν with - | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 - | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ - | Sum.inl 0, Sum.inr 1 => exact key 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inr 1, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 0, Sum.inr 1 => exact key (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inr 1, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inr 0, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 2, Sum.inr 0 => exact keyn (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 1, Sum.inr 2 => exact hTV - | Sum.inr 2, Sum.inr 1 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV - | Sum.inl 0, Sum.inr 0 => exact hLV - | Sum.inr 0, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV - -- ### C. Products of two field strengths - have hFV : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ V := fun μ ν => by - rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩ - have hP1V' : P1 ∈ V := by rw [hP1]; exact sub_mem (hFV _ _) (hFV _ _) - have hP2V' : P2 ∈ V := by rw [hP2]; exact sub_mem (hFV _ _) (hFV _ _) - have hM1V' : M1 ∈ V := by rw [hM1]; exact add_mem (hFV _ _) (hFV _ _) - have hM2V' : M2 ∈ V := by rw [hM2]; exact add_mem (hFV _ _) (hFV _ _) - have hTV' : T ∈ V := hFV _ _ - have hLV' : L ∈ V := hFV _ _ - have hcomm : ∀ x ∈ V, ∀ y ∈ V, x * y = y * x := by - intro x hx y hy - rw [hV] at hx hy - induction hx, hy using Submodule.span_induction₂ with - | mem_mem a b ha hb => - obtain ⟨μ, ν, rfl⟩ := ha; obtain ⟨μ', ν', rfl⟩ := hb - exact fieldStrengthDeriv_mul_comm _ _ _ _ _ _ - | zero_left => rw [zero_mul, mul_zero] - | zero_right => rw [zero_mul, mul_zero] - | add_left _ _ _ _ _ _ h₁ h₂ => rw [add_mul, mul_add, h₁, h₂] - | add_right _ _ _ _ _ _ h₁ h₂ => rw [mul_add, add_mul, h₁, h₂] - | smul_left _ _ _ _ _ h => rw [smul_mul_assoc, mul_smul_comm, h] - | smul_right _ _ _ _ _ h => rw [mul_smul_comm, smul_mul_assoc, h] - have hspan : Submodule.span ℂ FF = V * V := by - rw [hV, hFF, Submodule.span_mul_span] - congr 1 - ext x - constructor - · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ - · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ - have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → - Y ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l ≠ 0 → - X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j := - fun hX hY h => le_sup_of_le_right - ((Submodule.mul_le.2 fun _ hx _ hy => BoostWeight.mul_mem repLorentzGroup (hX hx) (hY hy)).trans - (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) - have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → - a * b ∈ Submodule.span ℂ S := fun ha hb h => by - rw [hcomm _ ha _ hb]; exact Submodule.subset_span h - obtain ⟨hAC, hCA, hBB⟩ : A * C ≤ Submodule.span ℂ S ∧ C * A ≤ Submodule.span ℂ S ∧ - B * B ≤ Submodule.span ℂ S := by - refine ⟨?_, ?_, ?_⟩ <;> - simp only [hA, hB, hC, Submodule.span_mul_span] <;> - refine Submodule.span_le.2 ?_ <;> - rintro x ⟨a, rfl | rfl, b, rfl | rfl, rfl⟩ - exacts [Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - hsub hM1V' hP1V' (by simp [hS]), hsub hM1V' hP2V' (by simp [hS]), - hsub hM2V' hP1V' (by simp [hS]), hsub hM2V' hP2V' (by simp [hS]), - Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] - have hkey : Submodule.span ℂ FF ≤ - Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 0 j := by - rw [hspan] - refine (Submodule.mul_le.2 fun _ hx _ hy => - Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ - simp only [Submodule.sup_mul, Submodule.mul_sup] - repeat' apply sup_le - exacts [hne hAle hAle (by norm_num), hne hBle hAle (by norm_num), le_sup_of_le_left hCA, - hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), - le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] - -- ### D. The weight zero part of the photon pairs - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> - exact hz (by assumption) (by assumption) (by norm_num) - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hspan, hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> - exact Submodule.mul_mem_mul (by assumption) (by assumption) - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 0) 0).symm, sup_bot_eq] - -/-- **The boost weight zero part of the photon pairs, `y`-direction.** As for the `z`-boost, - with the light-cone pairs now built on the `y`-axis: `F_{0z} ∓ F_{yz}` and `F_{0x} ∓ F_{yx}` - have weight `±2`, and `F_{zx}`, `F_{0y}` have weight zero. -/ -theorem boostWeight_inter_fieldStrength_y : - BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ Submodule.span ℂ - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = - Submodule.span ℂ {(fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)), - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)) * - (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0)), - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0), - fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)} := by - -- ### A. The boost eigenvectors among the field strengths - set P1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hP1 - set P2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) - - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hP2 - set M1 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) with hM1 - set M2 := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) + - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) with hM2 - set T := fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) with hT - set L := fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) with hL - set FF : Set JetAlgebra := - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} with hFF - set S : Set JetAlgebra := {P1 * M1, P1 * M2, P2 * M1, P2 * M2, T * T, T * L, L * L} with hS - obtain ⟨hP1w, hP2w, hM1w, hM2w, hTw, hLw⟩ : - P1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ P2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 ∧ - M1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ M2 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) ∧ - T ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ∧ L ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - refine ⟨?_, ?_, ?_, ?_, ?_, ?_⟩ <;> intro t ht - all_goals - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - simp only [hP1, hP2, hM1, hM2, hT, hL, map_sub, map_add, boostAxis_one, - repLorentzGroup_fieldStrengthDeriv_nil, algebraMap_real_complex, - toLorentzGroup_boostYel, Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - boostMatY, fieldStrengthDeriv_self, mul_zero, zero_mul, mul_one, Complex.ofReal_zero, - zero_smul, smul_zero, add_zero, zero_add] - try rw [show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1)] - push_cast - match_scalars <;> (field_simp; try ring) - -- ### B. Every field strength is a combination of the eigenvectors - set A := Submodule.span ℂ {P1, P2} with hA - set B := Submodule.span ℂ {T, L} with hB - set C := Submodule.span ℂ {M1, M2} with hC - set V := Submodule.span ℂ {x | ∃ μ ν, x = fieldStrengthDeriv {} μ ν} with hV - have hAle : A ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 2 := by - rw [hA]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hP1w, hP2w]) - have hBle : B ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - rw [hB]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hTw, hLw]) - have hCle : C ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 (-2) := by - rw [hC]; exact Submodule.span_le.2 (by rintro x (rfl | rfl); exacts [hM1w, hM2w]) - have hAV : A ≤ A ⊔ B ⊔ C := le_sup_left.trans le_sup_left - have hBV : B ≤ A ⊔ B ⊔ C := le_sup_right.trans le_sup_left - have hCV : C ≤ A ⊔ B ⊔ C := le_sup_right - have hP1V : P1 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) - have hP2V : P2 ∈ A ⊔ B ⊔ C := hAV (Submodule.subset_span (by simp)) - have hTV : T ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) - have hLV : L ∈ A ⊔ B ⊔ C := hBV (Submodule.subset_span (by simp)) - have hM1V : M1 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) - have hM2V : M2 ∈ A ⊔ B ⊔ C := hCV (Submodule.subset_span (by simp)) - have key : ∀ {u v x : JetAlgebra} (c d : ℂ), u ∈ A ⊔ B ⊔ C → v ∈ A ⊔ B ⊔ C → - x = c • u + d • v → x ∈ A ⊔ B ⊔ C := by - rintro u v x c d hu hv rfl - exact add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv) - have keyn : ∀ {u v : JetAlgebra} (c d : ℂ) {μ ν : Fin 1 ⊕ Fin 3}, u ∈ A ⊔ B ⊔ C → - v ∈ A ⊔ B ⊔ C → fieldStrengthDeriv {} μ ν = c • u + d • v → - fieldStrengthDeriv {} ν μ ∈ A ⊔ B ⊔ C := by - intro u v c d μ ν hu hv h - rw [fieldStrengthDeriv_antisymm, h] - exact neg_mem (add_mem (Submodule.smul_mem _ c hu) (Submodule.smul_mem _ d hv)) - have hVle : V ≤ A ⊔ B ⊔ C := by - rw [hV] - refine Submodule.span_le.2 ?_ - rintro x ⟨μ, ν, rfl⟩ - match μ, ν with - | Sum.inl 0, Sum.inl 0 | Sum.inr 0, Sum.inr 0 | Sum.inr 1, Sum.inr 1 - | Sum.inr 2, Sum.inr 2 => rw [fieldStrengthDeriv_self]; exact zero_mem _ - | Sum.inl 0, Sum.inr 2 => exact key 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inr 2, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inl 0, Sum.inr 0 => exact key 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 0, Sum.inl 0 => exact keyn 2⁻¹ 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 1, Sum.inr 2 => exact key (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inr 2, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hP1V hM1V (by rw [hP1, hM1]; module) - | Sum.inr 1, Sum.inr 0 => exact key (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 0, Sum.inr 1 => exact keyn (-2⁻¹) 2⁻¹ hP2V hM2V (by rw [hP2, hM2]; module) - | Sum.inr 2, Sum.inr 0 => exact hTV - | Sum.inr 0, Sum.inr 2 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hTV - | Sum.inl 0, Sum.inr 1 => exact hLV - | Sum.inr 1, Sum.inl 0 => rw [fieldStrengthDeriv_antisymm]; exact neg_mem hLV - -- ### C. Products of two field strengths - have hFV : ∀ μ ν, fieldStrengthDeriv {} μ ν ∈ V := fun μ ν => by - rw [hV]; exact Submodule.subset_span ⟨μ, ν, rfl⟩ - have hP1V' : P1 ∈ V := by rw [hP1]; exact sub_mem (hFV _ _) (hFV _ _) - have hP2V' : P2 ∈ V := by rw [hP2]; exact sub_mem (hFV _ _) (hFV _ _) - have hM1V' : M1 ∈ V := by rw [hM1]; exact add_mem (hFV _ _) (hFV _ _) - have hM2V' : M2 ∈ V := by rw [hM2]; exact add_mem (hFV _ _) (hFV _ _) - have hTV' : T ∈ V := hFV _ _ - have hLV' : L ∈ V := hFV _ _ - have hcomm : ∀ x ∈ V, ∀ y ∈ V, x * y = y * x := by - intro x hx y hy - rw [hV] at hx hy - induction hx, hy using Submodule.span_induction₂ with - | mem_mem a b ha hb => - obtain ⟨μ, ν, rfl⟩ := ha; obtain ⟨μ', ν', rfl⟩ := hb - exact fieldStrengthDeriv_mul_comm _ _ _ _ _ _ - | zero_left => rw [zero_mul, mul_zero] - | zero_right => rw [zero_mul, mul_zero] - | add_left _ _ _ _ _ _ h₁ h₂ => rw [add_mul, mul_add, h₁, h₂] - | add_right _ _ _ _ _ _ h₁ h₂ => rw [mul_add, add_mul, h₁, h₂] - | smul_left _ _ _ _ _ h => rw [smul_mul_assoc, mul_smul_comm, h] - | smul_right _ _ _ _ _ h => rw [mul_smul_comm, smul_mul_assoc, h] - have hspan : Submodule.span ℂ FF = V * V := by - rw [hV, hFF, Submodule.span_mul_span] - congr 1 - ext x - constructor - · rintro ⟨μ, ν, μ', ν', rfl⟩; exact ⟨_, ⟨μ, ν, rfl⟩, _, ⟨μ', ν', rfl⟩, rfl⟩ - · rintro ⟨a, ⟨μ, ν, rfl⟩, b, ⟨μ', ν', rfl⟩, rfl⟩; exact ⟨μ, ν, μ', ν', rfl⟩ - have hne : ∀ {X Y : Submodule ℂ JetAlgebra} {k l : ℤ}, X ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → - Y ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l ≠ 0 → - X * Y ≤ Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j := - fun hX hY h => le_sup_of_le_right - ((Submodule.mul_le.2 fun _ hx _ hy => BoostWeight.mul_mem repLorentzGroup (hX hx) (hY hy)).trans - (le_iSup_of_le _ (le_iSup_of_le h le_rfl))) - have hsub : ∀ {a b : JetAlgebra}, a ∈ V → b ∈ V → b * a ∈ S → - a * b ∈ Submodule.span ℂ S := fun ha hb h => by - rw [hcomm _ ha _ hb]; exact Submodule.subset_span h - obtain ⟨hAC, hCA, hBB⟩ : A * C ≤ Submodule.span ℂ S ∧ C * A ≤ Submodule.span ℂ S ∧ - B * B ≤ Submodule.span ℂ S := by - refine ⟨?_, ?_, ?_⟩ <;> - simp only [hA, hB, hC, Submodule.span_mul_span] <;> - refine Submodule.span_le.2 ?_ <;> - rintro x ⟨a, rfl | rfl, b, rfl | rfl, rfl⟩ - exacts [Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - hsub hM1V' hP1V' (by simp [hS]), hsub hM1V' hP2V' (by simp [hS]), - hsub hM2V' hP1V' (by simp [hS]), hsub hM2V' hP2V' (by simp [hS]), - Submodule.subset_span (by simp [hS]), Submodule.subset_span (by simp [hS]), - hsub hLV' hTV' (by simp [hS]), Submodule.subset_span (by simp [hS])] - have hkey : Submodule.span ℂ FF ≤ - Submodule.span ℂ S ⊔ ⨆ (j : ℤ) (_ : j ≠ 0), BoostWeight.boostWeightSubmodule repLorentzGroup 1 j := by - rw [hspan] - refine (Submodule.mul_le.2 fun _ hx _ hy => - Submodule.mul_mem_mul (hVle hx) (hVle hy)).trans ?_ - simp only [Submodule.sup_mul, Submodule.mul_sup] - repeat' apply sup_le - exacts [hne hAle hAle (by norm_num), hne hBle hAle (by norm_num), le_sup_of_le_left hCA, - hne hAle hBle (by norm_num), le_sup_of_le_left hBB, hne hCle hBle (by norm_num), - le_sup_of_le_left hAC, hne hBle hCle (by norm_num), hne hCle hCle (by norm_num)] - -- ### D. The weight zero part of the photon pairs - have hz : ∀ {k l : ℤ} {x y : JetAlgebra}, x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 k → - y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 l → k + l = 0 → x * y ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - intro k l x y hx hy h - rw [← h]; exact BoostWeight.mul_mem repLorentzGroup hx hy - have hSw : Submodule.span ℂ S ≤ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 := by - rw [hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> - exact hz (by assumption) (by assumption) (by norm_num) - have hSF : Submodule.span ℂ S ≤ Submodule.span ℂ FF := by - rw [hspan, hS] - refine Submodule.span_le.2 ?_ - rintro x (rfl | rfl | rfl | rfl | rfl | rfl | rfl) <;> - exact Submodule.mul_mem_mul (by assumption) (by assumption) - refine le_antisymm (le_trans (inf_le_inf_left _ hkey) ?_) (le_inf hSw hSF) - rw [inf_comm, sup_inf_assoc_of_le _ hSw, - disjoint_iff.mp (BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup (i := 1) 0).symm, sup_bot_eq] - -/-- **The Maxwell and theta terms are the only photon pairs of boost weight zero in every - direction.** An element of the span of the products `F_{μν} F_{μ'ν'}` has boost weight zero - along all three axes exactly when it is a combination of `F_{μν} F^{μν}` and - `ε^{μνρσ} F_{μν} F_{ρσ}`. - - *Here the proof is not a certificate.* The three one-axis theorems cut the span of the photon - pairs down to a seven-dimensional space each, and the three sevens have to be intersected; the - intersection is read off from the coefficients, which is where the dual family - `gaugeDual` enters. The `z`-axis theorem provides the seven coefficients `a₁, …, a₇`, and five - functionals, each a sum of at most two of the duals chosen to annihilate the `x`- or the - `y`-axis span, cut them down to two. -/ -theorem boostWeight_inter_fieldStrength_full : - BoostWeight.boostWeightSubmodule repLorentzGroup 0 0 ⊓ BoostWeight.boostWeightSubmodule repLorentzGroup 1 0 ⊓ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 0 ⊓ Submodule.span ℂ - {x | ∃ μ ν μ' ν', x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} = - Submodule.span ℂ {maxwellTerm, thetaTerm} := by - have hFm : ∀ μ ν μ' ν', fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν' ∈ - Submodule.span ℂ {x : JetAlgebra | ∃ μ ν μ' ν', - x = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := - fun μ ν μ' ν' => Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩ - have hinvM : IsInvariant maxwellTerm := - ⟨repJetGaugeGroupI_maxwellTerm, repLorentzGroup_maxwellTerm⟩ - have hinvT : IsInvariant thetaTerm := - ⟨repJetGaugeGroupI_thetaTerm, repLorentzGroup_thetaTerm⟩ - refine le_antisymm ?_ ?_ - -- ### A. The three one-axis intersections - · intro x hx - rw [Submodule.mem_inf, Submodule.mem_inf, Submodule.mem_inf] at hx - obtain ⟨⟨⟨hx0, hx1⟩, hx2⟩, hxF⟩ := hx - have hz := boostWeight_inter_fieldStrength.le (Submodule.mem_inf.2 ⟨hx2, hxF⟩) - have hbx := boostWeight_inter_fieldStrength_x.le (Submodule.mem_inf.2 ⟨hx0, hxF⟩) - have hby := boostWeight_inter_fieldStrength_y.le (Submodule.mem_inf.2 ⟨hx1, hxF⟩) - -- ### B. Dual functionals annihilating the `x`- and `y`-axis spans - have hann : ∀ (φ : JetAlgebra →ₗ[ℂ] ℂ) {T : Set JetAlgebra}, (∀ s ∈ T, φ s = 0) → - ∀ y ∈ Submodule.span ℂ T, φ y = 0 := by - intro φ T hT y hy - induction hy using Submodule.span_induction with - | mem s hs => exact hT s hs - | zero => simp - | add u v _ _ hu hv => rw [map_add, hu, hv, add_zero] - | smul c u _ hu => rw [map_smul, hu, smul_zero] - obtain ⟨e1, e2, e3, e4⟩ : - gaugeDual (Sum.inl 0, Sum.inr 0) (Sum.inl 0, Sum.inr 1) x = 0 ∧ - (gaugeDual (Sum.inl 0, Sum.inr 1) (Sum.inr 0, Sum.inr 2) + - gaugeDual (Sum.inl 0, Sum.inr 2) (Sum.inr 0, Sum.inr 1)) x = 0 ∧ - (gaugeDual (Sum.inl 0, Sum.inr 1) (Sum.inl 0, Sum.inr 1) + - gaugeDual (Sum.inr 0, Sum.inr 1) (Sum.inr 0, Sum.inr 1)) x = 0 ∧ - (gaugeDual (Sum.inl 0, Sum.inr 2) (Sum.inl 0, Sum.inr 2) + - gaugeDual (Sum.inr 0, Sum.inr 2) (Sum.inr 0, Sum.inr 2)) x = 0 := by - refine ⟨hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx, hann _ ?_ x hbx⟩ <;> - intro s hs <;> - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs <;> - rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> - simp only [LinearMap.add_apply, mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, - gaugeDual_fieldStrength_mul, fsCoeff, Prod.mk.injEq, reduceCtorEq, Fin.isValue, - Fin.reduceEq, Sum.inr.injEq, Sum.inl.injEq, and_false, false_and, if_false, and_true, - true_and, if_true] <;> norm_num - have e5 : (gaugeDual (Sum.inl 0, Sum.inr 0) (Sum.inl 0, Sum.inr 0) + - gaugeDual (Sum.inr 0, Sum.inr 1) (Sum.inr 0, Sum.inr 1)) x = 0 := by - refine hann _ ?_ x hby - intro s hs - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hs - rcases hs with rfl | rfl | rfl | rfl | rfl | rfl | rfl <;> - simp only [LinearMap.add_apply, mul_add, add_mul, mul_sub, sub_mul, map_add, map_sub, - gaugeDual_fieldStrength_mul, fsCoeff, Prod.mk.injEq, reduceCtorEq, Fin.isValue, - Fin.reduceEq, Sum.inr.injEq, Sum.inl.injEq, and_false, false_and, if_false, and_true, - true_and, if_true] <;> norm_num - -- ### C. The seven coefficients of the `z`-axis span, and the five relations on them - rw [Submodule.mem_span_insert] at hz - obtain ⟨a1, y1, hy1, rfl⟩ := hz - rw [Submodule.mem_span_insert] at hy1 - obtain ⟨a2, y2, hy2, rfl⟩ := hy1 - rw [Submodule.mem_span_insert] at hy2 - obtain ⟨a3, y3, hy3, rfl⟩ := hy2 - rw [Submodule.mem_span_insert] at hy3 - obtain ⟨a4, y4, hy4, rfl⟩ := hy3 - rw [Submodule.mem_span_insert] at hy4 - obtain ⟨a5, y5, hy5, rfl⟩ := hy4 - rw [Submodule.mem_span_insert] at hy5 - obtain ⟨a6, y6, hy6, rfl⟩ := hy5 - obtain ⟨a7, rfl⟩ := Submodule.mem_span_singleton.1 hy6 - simp only [LinearMap.add_apply, map_add, map_smul, smul_eq_mul, mul_add, add_mul, mul_sub, - sub_mul, map_sub, gaugeDual_fieldStrength_mul, fsCoeff, Prod.mk.injEq, reduceCtorEq, - Fin.isValue, Fin.reduceEq, Sum.inr.injEq, Sum.inl.injEq, and_false, false_and, if_false, - and_true, true_and, if_true, mul_zero, mul_one, add_zero, zero_add, sub_zero, - zero_sub] at e1 e2 e3 e4 e5 - -- ### D. Two coefficients are left: the Maxwell and theta terms - have ha3 : a3 = -a2 := by linear_combination e1 - have ha6 : a6 = -2 * a2 := by linear_combination e1 + e2 - have ha5 : a5 = -a1 := by linear_combination e5 / 2 - have ha4 : a4 = a1 := by linear_combination e3 / 2 - e5 / 2 - have ha7 : a7 = a1 := by linear_combination e4 / 2 - rw [ha3, ha4, ha5, ha6, ha7, Submodule.mem_span_pair] - refine ⟨-a1 / 2, -a2 / 4, ?_⟩ - rw [maxwellTerm_eq, thetaTerm_eq] - simp only [mul_add, add_mul, mul_sub, sub_mul, - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - neg_mul, mul_neg, neg_neg, sub_neg_eq_add, - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inl 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 1) (Sum.inr 2) (Sum.inr 0) (Sum.inr 2), - fieldStrengthDeriv_mul_comm {} {} (Sum.inr 0) (Sum.inr 1) (Sum.inl 0) (Sum.inr 2)] - match_scalars <;> ring - -- ### E. Both terms are invariant, hence of weight zero along every axis - · rw [Submodule.span_le] - rintro y (rfl | rfl) - · refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinvM, - mem_boostWeightSubmodule_zero_of_isInvariant hinvM⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hinvM⟩, ?_⟩ - rw [maxwellTerm_eq] - exact add_mem (add_mem (add_mem (add_mem (add_mem - (Submodule.smul_mem _ _ (hFm _ _ _ _)) (Submodule.smul_mem _ _ (hFm _ _ _ _))) - (Submodule.smul_mem _ _ (hFm _ _ _ _))) (Submodule.smul_mem _ _ (hFm _ _ _ _))) - (Submodule.smul_mem _ _ (hFm _ _ _ _))) (Submodule.smul_mem _ _ (hFm _ _ _ _)) - · refine ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hinvT, - mem_boostWeightSubmodule_zero_of_isInvariant hinvT⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hinvT⟩, ?_⟩ - rw [thetaTerm_eq] - exact add_mem (add_mem (Submodule.smul_mem _ _ (hFm _ _ _ _)) - (Submodule.smul_mem _ _ (hFm _ _ _ _))) (Submodule.smul_mem _ _ (hFm _ _ _ _)) - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean deleted file mode 100644 index 9f26abe8e..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Invariance.lean +++ /dev/null @@ -1,58 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.BoostWeight -/-! -# The invariant photon pairs - -An invariant element of the span of the products `F_{μν} F_{μ'ν'}` is a combination of the -Maxwell term `F_{μν} F^{μν}` and the theta term `ε^{μνρσ} F_{μν} F_{ρσ}`: the gauge sector has -no other Lorentz invariant quadratic in the field strength. - -Only one implication of `boostWeight_inter_fieldStrength_full` is used, and only through the -boosts: an invariant element has boost weight zero along each of the three axes -(`mem_boostWeightSubmodule_zero_of_isInvariant`), which is already enough to pin it down. The -converse — that the two terms are invariant — is where the boost weight zero statement came -from in the first place. - -## Key results - -- `JetAlgebra.mem_gauge_kinetic_span_eq_maxwell_theta_of_isInvariant` : an invariant photon - pair is a combination of the Maxwell and theta terms. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## The key theorem - --/ - -/-- **The invariant photon pairs are the Maxwell and theta terms.** An invariant element of the - span of the products `F_{μν} F_{μ'ν'}` lies in the span of `maxwellTerm` and `thetaTerm`. -/ -lemma mem_gauge_kinetic_span_eq_maxwell_theta_of_isInvariant {x : JetAlgebra} - (hx : IsInvariant x) - (ht : x ∈ Submodule.span ℂ - {y | ∃ μ ν μ' ν', y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : - x ∈ Submodule.span ℂ {maxwellTerm, thetaTerm} := by - rw [← boostWeight_inter_fieldStrength_full] - exact ⟨⟨⟨mem_boostWeightSubmodule_zero_of_isInvariant hx, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, - mem_boostWeightSubmodule_zero_of_isInvariant hx⟩, ht⟩ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean deleted file mode 100644 index c48834dbe..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/BoostWeight.lean +++ /dev/null @@ -1,573 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant -public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading -public import Physlib.Relativity.IsLorentzDeriv -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDim -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.JetDerivLorentz -/-! -# Grading by boost weight - -The jet algebra is graded by the boost weight along each spatial axis: `x` has boost weight `k` -along the `i`-th axis when `ρ(boostAxis i t) x = t ^ k • x` for every `t`. This is proved: -`boostWeightSubmodule_isInternal` decomposes the jet algebra as an internal direct sum of the -weight submodules, and `GradedAlgebra (BoostWeight.boostWeightSubmodule repLorentzGroup i)` is an instance for each of the -three axes. - -*It is not the hypercharge construction.* The gauge group acts on every generator by a -character, so `hyperchargePoly` can send each generator to `T ^ q` times itself. A boost does -not: it mixes the time index with the boost direction, so `∂_s B_μ` and `∂_s ψ_α` in the -coordinate basis are *not* boost eigenvectors — for the `z`-boost, -`ρ(boostZel t) F_{0x} = ch F_{0x} - sh F_{zx}`. Only the light-cone combinations are -homogeneous, so a `LaurentPolynomial`-valued grading map in the style of `Grading/Hypercharge` -would need a light-cone generating set. The grading is instead established as the family of -weight submodules, which needs no change of generators. - -*How exhaustiveness is proved.* Independence is immediate: the weight spaces sit inside the -eigenspaces of a single boost at the distinct eigenvalues `2 ^ k`. Exhaustiveness descends to -the component spaces, where the boost acts *linearly* and the statement propagates mechanically -— the span of eigenvectors is closed under tensor products, products, symmetric and exterior -algebras, and base change (section B). The recursion bottoms out at four- and two-dimensional -spaces: for `Module.Dual ℝ Lorentz.CoVector`, `Module.Dual ℂ Lorentz.CoℂModule` and -`Module.Dual ℝ BBoson` the eigenvectors are the light-cone combinations `b₀ ∓ b₃`, of weight -`±2`, together with the transverse directions, of weight `0`; on the spinor duals the boost is -already diagonal, with weights `∓1`. No covariance of `jetDeriv` is needed anywhere. - -*The three axes.* Everything is proved for the `z`-axis and transported. The axis boosts are -conjugate — a rotation by `π/2` carries the `z`-boost to the `x`- and `y`-boosts -(`boostXel_eq_conj`, `boostYel_eq_conj`) — so `weightSpan_eq_top_of_two` moves the grading -between them without repeating the descent. - -With this grading we can single out the subspace of boost weight zero. Any invariant under the -Lorentz group lies in it, for every axis, since a boost fixes an invariant. - -The boost weight is bounded by the mass weight: a generator of mass weight `w` carries at most -`w` units of boost weight. A bosonic generator `∂_s B_μ` of mass weight `2(1 + |s|)` has -`1 + |s|` vector indices, each contributing at most `±2`; a fermionic generator `∂_s ψ_α` of -mass weight `3 + 2|s|` has `|s|` vector indices and one spinor index, contributing at most -`2|s| + 1`. So `|boost weight| ≤ mass weight` throughout. Odd weights do occur: a single fermion -sits at `±1`. - -The maps `boostAvgX`, `boostAvgY`, `boostAvgZ` are these projections wherever the boost weights -that occur are among `0, ±2, ±4, ±6`: each acts on a weight-`k` element by the value at `k` of -the interpolating polynomial `boostAvgZWeight`, which is one at `k = 0` and vanishes at -`k = ±2, ±4, ±6`. On the covariant subalgebra in mass weight eight or less those are the only -weights that occur, so there each is exactly the projection onto boost weight zero. Note that -this is a statement about the *covariant* subalgebra, not about mass weight eight alone: the -mass-weight-eight element `∂_ρ ∂_σ ∂_τ B_μ` reaches boost weight `8`, and -`boostAvgZWeight_eight_ne_zero`. - -## i. Overview - -The weight submodules are defined by the eigenvector condition, so the multiplicative structure -is immediate: weights add under multiplication and the unit has weight zero. The work is -exhaustiveness, and it is done once for a general representation and then applied layer by -layer to the spaces the jet algebra is built from. - -## ii. Key results - -- `JetAlgebra.boostAxis` : the boost along a given spatial axis, and `boostXel_eq_conj`, - `boostYel_eq_conj` exhibiting the three as conjugate. -- `weightSpan rep i = ⊤` and the transport lemmas of section B : the grading - propagates along tensor products, products, symmetric and exterior algebras, base change and - conjugation. -- `JetAlgebra.boostWeightSubmodule` : the elements of a given boost weight along a given axis. -- `JetAlgebra.mul_mem_boostWeightSubmodule` : boost weights add under multiplication. -- `JetAlgebra.mem_boostWeightSubmodule_zero_of_isInvariant` : an invariant has boost weight zero. -- `JetAlgebra.boostWeightSubmodule_isInternal` : the weight submodules decompose the jet algebra - as an internal direct sum, so `GradedAlgebra (BoostWeight.boostWeightSubmodule repLorentzGroup i)` holds. -- `JetAlgebra.boostAvgAxis_apply_of_mem` : the boost average along an axis acts on a weight-`k` - element by `boostAvgZWeight k`, hence is the identity on boost weight zero and annihilates - weights `±2, ±4, ±6`. - -## iii. Table of contents - -- A. The boosts along the three axes -- B. Boost weights of a general representation -- C. The component spaces are boost-graded -- D. The boost-weight submodules -- E. Homogeneous elements -- F. Independence of the weight submodules -- G. The span of the homogeneous elements is a subalgebra -- H. The interpolating polynomial of the boost averages -- I. The boost averages are the projections onto boost weight zero -- J. The grading - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel Lorentz -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -namespace JetAlgebra - -/-! - -## C. The component spaces are boost-graded - -Each layer of the jet algebra is graded once the layer below it is: the two four-dimensional -derivative and target spaces by `weightSpan_eq_top_of_lorentzColumns`, the spinor duals directly (the -boost is already diagonal on them), and everything above by the tensor, product, symmetric- and -exterior-algebra transports. - --/ - -open BoostWeight in -/-- The real dual covectors — the derivative slots — are boost-graded. -/ -lemma weightSpan_coVectorDual_eq_top : weightSpan (Lorentz.CoVector.sl2Rep.dual) 2 = ⊤ := - weightSpan_eq_top_of_lorentzColumns Lorentz.CoVector.basis.dualBasis fun Λ μ => by - simpa using Lorentz.CoVector.sl2Rep_dual_dualBasis Λ μ - -open BoostWeight in -/-- The complex dual covectors are boost-graded. -/ -lemma weightSpan_coℂModuleDual_eq_top : weightSpan (Lorentz.CoℂModule.SL2CRep.dual) 2 = ⊤ := - weightSpan_eq_top_of_lorentzColumns Lorentz.complexCoBasis.dualBasis fun Λ μ => by - simpa using Lorentz.CoℂModule.SL2CRep_dual_dualBasis Λ μ - -open BoostWeight in -/-- The dual B-boson target space is boost-graded. -/ -lemma weightSpan_bBosonDual_eq_top : weightSpan (BBoson.repLorentzGroup.dual) 2 = ⊤ := - weightSpan_eq_top_of_lorentzColumns BBoson.basis.dualBasis fun Λ μ => by - simpa using BBoson.repLorentzGroup_dual_dualBasis Λ μ - -open BoostWeight in -/-- The real algebra of derivative symbols is boost-graded. -/ -lemma weightSpan_derivAlgebraReal_eq_top : weightSpan (DerivAlgebraReal.repLorentzGroup) 2 = ⊤ := - weightSpan_symmetricAlgebra_eq_top (repV := Lorentz.CoVector.sl2Rep.dual) - (fun Λ => by - show (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)) 1 = 1 - exact map_one _) - (fun Λ x y => by - show (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ Lorentz.CoVector.sl2Rep.dual Λ)) (x * y) = _ - exact map_mul _ _ _) - (fun Λ x => DerivAlgebraReal.repLorentzGroup_apply_ι Λ x) - weightSpan_coVectorDual_eq_top - -open BoostWeight in -/-- The complex algebra of derivative symbols is boost-graded. -/ -lemma weightSpan_derivAlgebraComplex_eq_top : - weightSpan (DerivAlgebraComplex.repLorentzGroup) 2 = ⊤ := - weightSpan_symmetricAlgebra_eq_top (repV := Lorentz.CoℂModule.SL2CRep.dual) - (fun Λ => DerivAlgebraComplex.repLorentzGroup_apply_one Λ) - (fun Λ x y => DerivAlgebraComplex.repLorentzGroup_apply_mul Λ x y) - (fun Λ x => DerivAlgebraComplex.repLorentzGroup_apply_ι Λ x) - weightSpan_coℂModuleDual_eq_top - -open BoostWeight in -/-- The B-boson jet component space is boost-graded. -/ -lemma weightSpan_bBosonJetComponentSpace_eq_top : - weightSpan (BBoson.JetComponentSpace.repLorentzGroup) 2 = ⊤ := - weightSpan_tprod_eq_top weightSpan_derivAlgebraReal_eq_top weightSpan_bBosonDual_eq_top - -open BoostWeight in -/-- The B-boson jet algebra is boost-graded. -/ -lemma weightSpan_bBosonJetAlgebra_eq_top : weightSpan (BBoson.JetAlgebra.repLorentzGroup) 2 = ⊤ := - weightSpan_symmetricAlgebra_eq_top (repV := BBoson.JetComponentSpace.repLorentzGroup) - (fun Λ => by - show (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ BBoson.JetComponentSpace.repLorentzGroup Λ)) 1 = 1 - exact map_one _) - (fun Λ x y => by - show (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ BBoson.JetComponentSpace.repLorentzGroup Λ)) (x * y) = _ - exact map_mul _ _ _) - (fun Λ x => BBoson.JetAlgebra.repLorentzGroup_apply_ι Λ x) - weightSpan_bBosonJetComponentSpace_eq_top - -open BoostWeight in -/-- The complexified B-boson jet algebra is boost-graded. -/ -lemma weightSpan_complexBBosonJetAlgebra_eq_top : - weightSpan (BBoson.JetAlgebra.complexRepLorentzGroup) 2 = ⊤ := - weightSpan_baseChange_eq_top (fun _ _ _ => rfl) weightSpan_bBosonJetAlgebra_eq_top - - -open BoostWeight in -/-- The dual charged-lepton spinors are boost-graded: the boost is already diagonal on them, - with weights `∓1`. -/ -lemma weightSpan_leptonSingletDual_eq_top : - weightSpan (LeptonSinglet.repLorentzGroup.dual) 2 = ⊤ := by - refine weightSpan_eq_top_of_basis LeptonSinglet.basis.dualBasis fun α => ?_ - match α with - | 0 => - refine mem_weightSpan_of_mem_boostWeightSubmodule (w := -1) fun t ht => ?_ - rw [show boostAxis 2 t ht = boostZel t ht from rfl, - LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, zero_smul, add_zero, - Complex.conj_ofReal] - rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] - rfl - | 1 => - refine mem_weightSpan_of_mem_boostWeightSubmodule (w := 1) fun t ht => ?_ - rw [show boostAxis 2 t ht = boostZel t ht from rfl, - LeptonSinglet.repLorentzGroup_dual_dualBasis, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, zero_smul, zero_add, - Complex.conj_ofReal] - rw [zpow_one] - rfl - -open BoostWeight in -/-- The dual conjugate charged-lepton spinors are boost-graded. -/ -lemma weightSpan_leptonSingletConjDual_eq_top : - weightSpan (LeptonSinglet.repLorentzGroup.conj.dual) 2 = ⊤ := by - refine weightSpan_eq_top_of_basis LeptonSinglet.basis.conj.dualBasis fun α => ?_ - match α with - | 0 => - refine mem_weightSpan_of_mem_boostWeightSubmodule (w := -1) fun t ht => ?_ - rw [show boostAxis 2 t ht = boostZel t ht from rfl, - LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, zero_smul, add_zero] - rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] - rfl - | 1 => - refine mem_weightSpan_of_mem_boostWeightSubmodule (w := 1) fun t ht => ?_ - rw [show boostAxis 2 t ht = boostZel t ht from rfl, - LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, zero_smul, zero_add] - rw [zpow_one] - rfl - -open BoostWeight in -/-- The charged-lepton jet component space is boost-graded. -/ -lemma weightSpan_leptonJetComponentSpace_eq_top : - weightSpan (LeptonSinglet.JetComponentSpace.repLorentzGroup) 2 = ⊤ := - weightSpan_prod_eq_top (weightSpan_tprod_eq_top weightSpan_derivAlgebraComplex_eq_top weightSpan_leptonSingletDual_eq_top) - (weightSpan_tprod_eq_top weightSpan_derivAlgebraComplex_eq_top weightSpan_leptonSingletConjDual_eq_top) - -open BoostWeight in -/-- The charged-lepton jet algebra is boost-graded. -/ -lemma weightSpan_leptonJetAlgebra_eq_top : - weightSpan (LeptonSinglet.JetAlgebra.repLorentzGroup) 2 = ⊤ := - weightSpan_exteriorAlgebra_eq_top (repV := LeptonSinglet.JetComponentSpace.repLorentzGroup) - (fun Λ => by - show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) 1 = 1 - exact map_one _) - (fun Λ x y => by - show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) (x * y) = _ - exact map_mul _ _ _) - (fun Λ x => by - show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repLorentzGroup Λ)) - (ExteriorAlgebra.ι ℂ x) = _ - exact ExteriorAlgebra.map_apply_ι _ _) - weightSpan_leptonJetComponentSpace_eq_top - -open BoostWeight in -/-- The lepton–gauge-sector jet algebra is boost-graded. -/ -lemma weightSpan_jetAlgebra_eq_top : weightSpan (repLorentzGroup) 2 = ⊤ := - weightSpan_tprod_eq_top weightSpan_complexBBosonJetAlgebra_eq_top weightSpan_leptonJetAlgebra_eq_top - -/-- **The lepton–gauge-sector jet algebra is boost-graded**: the Lorentz action is by algebra - automorphisms, and along every axis the weight spaces span, by the descent of section C - transported between the axes. -/ -instance : BoostWeight.IsBoostGraded (repLorentzGroup) := - ⟨repLorentzGroup_apply_one, repLorentzGroup_apply_mul, - fun i => BoostWeight.weightSpan_eq_top_of_two weightSpan_jetAlgebra_eq_top i⟩ - -/-! - -## D. The boost-weight submodules - --/ - -variable {i : Fin 3} - -/-- The scalar action of a real parameter on the jet algebra, in the form the weight condition - presents it. -/ -private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl - -/-- A Lorentz-invariant element has boost weight zero, along every axis. -/ -lemma mem_boostWeightSubmodule_zero_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : - x ∈ BoostWeight.boostWeightSubmodule repLorentzGroup i 0 := - fun t ht => by rw [hx.2 (boostAxis i t ht), zpow_zero, one_smul] - -/-! - -## E. Homogeneous elements - -The coordinate components of the gauge potential are not boost eigenvectors; the light-cone -combinations `B_0 ∓ B_z` are, of weight `±2`. The zeroth-order lepton coordinates are -eigenvectors of weight `∓1`. - --/ - -/-- The zeroth-order lepton coordinate `ψ_0` has boost weight `-1`. -/ -lemma Dψ_nil_zero_mem_neg_one : Dψ [] 0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := by - intro t ht - simp only [algebraMap_real_complex] - rw [boostAxis_two, repLorentzGroup_Dψ_nil, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, zero_smul, add_zero, - Complex.conj_ofReal] - rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] - -/-- The zeroth-order lepton coordinate `ψ_1` has boost weight `1`. -/ -lemma Dψ_nil_one_mem_one : Dψ [] 1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by - intro t ht - simp only [algebraMap_real_complex] - rw [boostAxis_two, repLorentzGroup_Dψ_nil, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, Complex.star_def, map_zero, zero_smul, zero_add, - Complex.conj_ofReal] - rw [zpow_one] - -/-- The zeroth-order conjugate lepton coordinate `ψ̄_0` has boost weight `-1`. -/ -lemma Dbarψ_nil_zero_mem_neg_one : Dbarψ [] 0 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-1) := by - intro t ht - simp only [algebraMap_real_complex] - rw [boostAxis_two, repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, zero_smul, add_zero] - rw [_root_.zpow_neg, zpow_one, Complex.ofReal_inv] - -/-- The zeroth-order conjugate lepton coordinate `ψ̄_1` has boost weight `1`. -/ -lemma Dbarψ_nil_one_mem_one : Dbarψ [] 1 ∈ BoostWeight.boostWeightSubmodule repLorentzGroup 2 1 := by - intro t ht - simp only [algebraMap_real_complex] - rw [boostAxis_two, repLorentzGroup_Dbarψ_nil, boostZel_inv_coe] - simp only [Fin.sum_univ_two, Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.empty_val', Matrix.cons_val_fin_one, Matrix.of_apply, - Fin.isValue, zero_smul, zero_add] - rw [zpow_one] - -/-- The gauge potential in the light-cone direction, `B_0 - B_z`, has boost weight `2`. -/ -lemma B_lightCone_mem_two : - [JetGenerators.dB {} (Sum.inl 0)]ₐ - [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 2 := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_sub, repLorentzGroup_B, repLorentzGroup_B] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, - zero_smul, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-- The gauge potential in the other light-cone direction has boost weight `-2`. -/ -lemma B_lightCone_mem_neg_two : - [JetGenerators.dB {} (Sum.inl 0)]ₐ + [JetGenerators.dB {} (Sum.inr 2)]ₐ ∈ - BoostWeight.boostWeightSubmodule repLorentzGroup 2 (-2) := by - intro t ht - simp only [algebraMap_real_complex] - have ht' : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [map_add, repLorentzGroup_B, repLorentzGroup_B] - simp only [boostAxis_two, toLorentzGroup_boostZel, Fintype.sum_sum_type, Fin.sum_univ_one, - Fin.sum_univ_three, boostMatZ, Complex.ofReal_zero, - zero_smul, add_zero, zero_add] - push_cast - match_scalars <;> (field_simp; ring) - -/-! - -## F. Independence of the weight submodules - -The weight submodules sit inside the eigenspaces of a single boost, `ρ(boostZel 2)`, at the -pairwise distinct eigenvalues `2 ^ k`. Eigenspaces at distinct eigenvalues are independent, so -the family is independent: an element has at most one decomposition into homogeneous parts. -This is one of the two halves of `DirectSum.IsInternal`; the other, that the weight submodules -span, is section C. - --/ - -/-! - -## G. The span of the homogeneous elements is a subalgebra - --/ - -/-- The homogeneous span contains the whole bosonic factor once it contains the generators. -/ -private lemma inclB_mem_boostWeightSubalgebra - (h : ∀ j : JetGenerators, [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : inclB a ∈ BoostWeight.subalgebra repLorentzGroup i := by - have hone : ∀ c : BBoson.JetAlgebra, - inclB ((1 : ℂ) ⊗ₜ[ℝ] c) ∈ BoostWeight.subalgebra repLorentzGroup i := by - intro c - induction c using SymmetricAlgebra.induction with - | algebraMap r => - rw [show ((1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ BBoson.JetAlgebra r) : - ℂ ⊗[ℝ] BBoson.JetAlgebra) = - algebraMap ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) (algebraMap ℝ ℂ r) from by - rw [Algebra.algebraMap_eq_smul_one, Algebra.algebraMap_eq_smul_one, - TensorProduct.tmul_smul, TensorProduct.smul_tmul'] - rfl, AlgHom.commutes] - exact Subalgebra.algebraMap_mem _ _ - | ι v => - have hv : v ∈ Submodule.span ℝ (Set.range BBoson.JetComponentSpace.basis) := by - rw [BBoson.JetComponentSpace.basis.span_eq] - trivial - induction hv using Submodule.span_induction with - | mem y hy => - obtain ⟨j, rfl⟩ := hy - obtain ⟨s, μ⟩ := j - exact h (JetGenerators.dB s μ) - | zero => simp - | add u w _ _ ihu ihw => - simp only [map_add, TensorProduct.tmul_add] - exact Subalgebra.add_mem _ ihu ihw - | smul r u _ ihu => - rw [show ((1 : ℂ) ⊗ₜ[ℝ] - (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace (r • u)) : - ℂ ⊗[ℝ] BBoson.JetAlgebra) = - (algebraMap ℝ ℂ r) • ((1 : ℂ) ⊗ₜ[ℝ] - SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace u) from by - rw [map_smul, TensorProduct.tmul_smul, ← algebraMap_smul ℂ r], map_smul] - exact Subalgebra.smul_mem _ ihu _ - | mul u v ihu ihv => - rw [show ((1 : ℂ) ⊗ₜ[ℝ] (u * v) : ℂ ⊗[ℝ] BBoson.JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] u) * ((1 : ℂ) ⊗ₜ[ℝ] v) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul], map_mul] - exact Subalgebra.mul_mem _ ihu ihv - | add u v ihu ihv => - simp only [TensorProduct.tmul_add, map_add] - exact Subalgebra.add_mem _ ihu ihv - induction a using TensorProduct.induction_on with - | zero => simp - | add u v hu hv => rw [map_add]; exact Subalgebra.add_mem _ hu hv - | tmul z c => - rw [show (z ⊗ₜ[ℝ] c : ℂ ⊗[ℝ] BBoson.JetAlgebra) = z • ((1 : ℂ) ⊗ₜ[ℝ] c) from by - rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one], map_smul] - exact Subalgebra.smul_mem _ (hone c) _ - -/-- The homogeneous span contains the whole fermionic factor once it contains the generators. -/ -private lemma inclL_mem_boostWeightSubalgebra - (h : ∀ j : JetGenerators, [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i) - (b : LeptonSinglet.JetAlgebra) : inclL b ∈ BoostWeight.subalgebra repLorentzGroup i := by - have hι : ∀ m : LeptonSinglet.JetComponentSpace, - inclL (ExteriorAlgebra.ι ℂ m) ∈ BoostWeight.subalgebra repLorentzGroup i := by - intro m - have hm : m ∈ Submodule.span ℂ (Set.range LeptonSinglet.JetComponentSpace.basis) := by - rw [LeptonSinglet.JetComponentSpace.basis.span_eq] - trivial - induction hm using Submodule.span_induction with - | mem y hy => - obtain ⟨j, rfl⟩ := hy - cases j with - | dψ s α => exact h (JetGenerators.dψ s α) - | dbarψ s α => exact h (JetGenerators.dbarψ s α) - | zero => simp - | add u v _ _ ihu ihv => - simp only [map_add] - exact Subalgebra.add_mem _ ihu ihv - | smul c u _ ihu => - simp only [map_smul] - exact Subalgebra.smul_mem _ ihu _ - induction b using ExteriorAlgebra.induction with - | algebraMap r => rw [AlgHom.commutes]; exact Subalgebra.algebraMap_mem _ _ - | ι m => exact hι m - | mul u v ihu ihv => rw [map_mul]; exact Subalgebra.mul_mem _ ihu ihv - | add u v ihu ihv => rw [map_add]; exact Subalgebra.add_mem _ ihu ihv - -/-- Once every generator is a finite sum of boost eigenvectors, so is every element: the - homogeneous elements then span the whole jet algebra. -/ -theorem boostWeightSubalgebra_eq_top_of_forall_ofGenerator - (h : ∀ j : JetGenerators, [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i) : - BoostWeight.subalgebra repLorentzGroup i = ⊤ := by - refine Algebra.eq_top_iff.mpr fun x => ?_ - induction x using JetAlgebra.induction_on with - | zero => exact Subalgebra.zero_mem _ - | add u v hu hv => exact Subalgebra.add_mem _ hu hv - | tmul a b => - rw [tmul_eq_inclB_mul_inclL] - exact Subalgebra.mul_mem _ (inclB_mem_boostWeightSubalgebra h a) - (inclL_mem_boostWeightSubalgebra h b) - -/-! - -## J. The grading - -The weight submodules are independent (`BoostWeight.boostWeightSubmodule_iSupIndep repLorentzGroup`) and, by the descent -through the component spaces of section C transported along section A, they span. So they -decompose the jet algebra internally along every axis, and together with the graded-monoid -structure of section D they make it a graded algebra three times over. - --/ - -/-- Every generator is a finite sum of boost eigenvectors, for every axis. -/ -theorem ofGenerator_mem_boostWeightSubalgebra (i : Fin 3) (j : JetGenerators) : - [j]ₐ ∈ BoostWeight.subalgebra repLorentzGroup i := by - rw [BoostWeight.mem_subalgebra, BoostWeight.iSup_boostWeightSubmodule_eq_top repLorentzGroup] - trivial - -/-! - -## K. The projection onto a boost weight - -The grading of section J writes every element as a *unique* finite sum of homogeneous ones, so it -supplies a projection onto each weight, `BoostWeight.boostProj repLorentzGroup i k` — in particular onto boost weight zero, -where the invariants live. - -The projection is exact, for every weight and every element. What it is not is a formula in the -group action: it is defined through the decomposition, so nothing here says it preserves a -subspace merely because that subspace is carried to itself by the Lorentz action. A combination -of finitely many boosts would give that for free, but only interpolates the weight-zero -projection correctly across a bounded range of weights. - --/ - -/-- An invariant is fixed by the weight-zero projection, along every axis. -/ -lemma boostProj_zero_of_isInvariant (i : Fin 3) {x : JetAlgebra} (hx : IsInvariant x) : - BoostWeight.boostProj repLorentzGroup i 0 x = x := - BoostWeight.boostProj_of_mem repLorentzGroup (mem_boostWeightSubmodule_zero_of_isInvariant hx) - -/-- An invariant has no component of nonzero weight. -/ -lemma boostProj_of_isInvariant_ne {i : Fin 3} {k : ℤ} (hk : (0 : ℤ) ≠ k) {x : JetAlgebra} - (hx : IsInvariant x) : BoostWeight.boostProj repLorentzGroup i k x = 0 := - BoostWeight.boostProj_of_mem_ne repLorentzGroup (mem_boostWeightSubmodule_zero_of_isInvariant hx) hk - -/-! - -## L. The jet derivatives are a Lorentz derivative - -The covariance `repLorentzGroup_jetDeriv` makes the jet derivatives an instance of -`Lorentz.IsLorentzDeriv`. The weight shifts of the light-cone combinations, the weight -preservation of the transverse derivatives, and the boost projections of the span of all -jet derivatives of a submodule (`IsLorentzDeriv.boostProj_map_submodule`) are -inherited from the general theory. - --/ - -/-- The jet derivatives transform as a Lorentz covector. -/ -instance : IsLorentzDeriv repLorentzGroup jetDeriv where - rep_deriv {Λ μ x} := repLorentzGroup_jetDeriv Λ μ x - -/-! - -## The multiplication of submodules - --/ - -/-- A submodule product with a bosonic left factor commutes. -/ -lemma mul_comm_of_le_bosonic {A B : Submodule ℂ JetAlgebra} (hA : A ≤ bosonic) : - A * B = B * A := by - refine le_antisymm (Submodule.mul_le.2 fun a ha b hb => ?_) - (Submodule.mul_le.2 fun b hb a ha => ?_) - · rw [mul_comm_of_mem_bosonic (hA ha)] - exact Submodule.mul_mem_mul hb ha - · rw [← mul_comm_of_mem_bosonic (hA ha)] - exact Submodule.mul_mem_mul ha hb - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean deleted file mode 100644 index 382cc10e5..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Classification.lean +++ /dev/null @@ -1,160 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.MassDimFour.Basic -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.MassDimFour.LinearIndependence -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.Closure -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.BoostWeight -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.Closure -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.Invariance -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.Closure -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.Invariance -/-! -# The renormalizable Lagrangian densities of the lepton–gauge sector - -## i. Overview - -**An invariant of mass dimension four is a combination of the two fermion kinetic terms, the -Maxwell term and the theta term** — `mem_span_renormalizableTerms_of_isInvariant`. This is the -classification theorem for the lepton–gauge sector, and it is the last step: everything it uses -is proved elsewhere. - -## ii. The argument - -`mem_massDimFour_neutral_sectors_of_isInvariant` puts an invariant of mass weight eight in the -join of four sector spans, and each sector has already been cut down to its invariants: - -| sector | invariants | proved in | -|---|---|---| -| `D̄_μ ψ̄_α ψ_β` | `fermionKineticTermBar` | `FermionicBarKineticTerm.BoostWeight` | -| `ψ̄_α D_μ ψ_β` | `fermionKineticTerm` | `FermionicKineticTerm.BoostWeight` | -| `∂_ρ ∂_τ F_{μν}` | none | `GaugeDoubleDeriv.Invariance` | -| `F_{μν} F_{μ'ν'}` | `maxwellTerm`, `thetaTerm` | `GaugeKineticTerm.Invariance` | - -Those four results are about a single sector at a time, so they apply to the four summands of -`x = a + b + c + d` only once each summand is known to be invariant, which is what section A -establishes. Two ingredients go into it. Each sector is carried to itself by the Lorentz action -and fixed pointwise by the gauge action (the `Closure` files), so `ρ(Λ) a - a` lies in the first -sector again and the four such differences sum to `ρ(Λ) x - x = 0`. And the four sectors are -independent (`MassDimFour.LinearIndependence`), so those four differences are individually zero. - -## iii. Key results - -- `JetAlgebra.isInvariant_of_massDimFour_decomp` : the sector components of an invariant are - themselves invariant. -- `JetAlgebra.mem_span_renormalizableTerms_of_isInvariant` : **the classification** — an - invariant of mass weight eight lies in - `span ℂ {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm}`. - -## iv. Table of contents - -- A. The sector components of an invariant are invariant -- B. The classification - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open Matrix MatrixGroups - -/-! - -## A. The sector components of an invariant are invariant - -The gauge half is immediate: each sector is fixed pointwise by the gauge action, so every -element of it — the components included — is gauge invariant. The Lorentz half is where the -independence of the sectors is spent: `ρ(Λ) a - a` lies in the first sector again, and likewise -for the other three, and the four differences sum to `ρ(Λ) x - x = 0`. - --/ - -/-- **The sector components of an invariant are themselves invariant.** -/ -lemma isInvariant_of_massDimFour_decomp {x a b c d : JetAlgebra} (hx : IsInvariant x) - (ha : a ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) - (hb : b ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) - (hc : c ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) - (hd : d ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) - (hsum : a + b + c + d = x) : - IsInvariant a ∧ IsInvariant b ∧ IsInvariant c ∧ IsInvariant d := by - have hlor : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ a = a ∧ repLorentzGroup Λ b = b ∧ - repLorentzGroup Λ c = c ∧ repLorentzGroup Λ d = d := by - intro Λ - have hzero : (repLorentzGroup Λ a - a) + (repLorentzGroup Λ b - b) + - (repLorentzGroup Λ c - c) + (repLorentzGroup Λ d - d) = 0 := by - have h1 : repLorentzGroup Λ a + repLorentzGroup Λ b + repLorentzGroup Λ c + - repLorentzGroup Λ d = x := by - rw [← map_add, ← map_add, ← map_add, hsum, hx.2 Λ] - rw [show (repLorentzGroup Λ a - a) + (repLorentzGroup Λ b - b) + - (repLorentzGroup Λ c - c) + (repLorentzGroup Λ d - d) = - (repLorentzGroup Λ a + repLorentzGroup Λ b + repLorentzGroup Λ c + - repLorentzGroup Λ d) - (a + b + c + d) from by abel, - h1, hsum, sub_self] - obtain ⟨e1, e2, e3, e4⟩ := eq_zero_of_massDimFour_sum_eq_zero - (sub_mem (repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil Λ ha) ha) - (sub_mem (repLorentzGroup_mem_span_Dbarψ_mul_Dψ Λ hb) hb) - (sub_mem (repLorentzGroup_mem_span_fieldStrengthDeriv_pair Λ hc) hc) - (sub_mem (repLorentzGroup_mem_span_fieldStrength_mul Λ hd) hd) hzero - exact ⟨sub_eq_zero.mp e1, sub_eq_zero.mp e2, sub_eq_zero.mp e3, sub_eq_zero.mp e4⟩ - exact ⟨⟨fun U => repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil U ha, - fun Λ => (hlor Λ).1⟩, - ⟨fun U => repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ U hb, fun Λ => (hlor Λ).2.1⟩, - ⟨fun U => repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair U hc, - fun Λ => (hlor Λ).2.2.1⟩, - ⟨fun U => repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul U hd, - fun Λ => (hlor Λ).2.2.2⟩⟩ - -/-! - -## B. The classification - --/ - -/-- **The renormalizable Lagrangian densities of the lepton–gauge sector.** An invariant of mass - weight eight — mass dimension four — is a linear combination of the fermion kinetic term, the - conjugate fermion kinetic term, the Maxwell term and the theta term. - - Every ingredient is proved elsewhere: `mem_massDimFour_neutral_sectors_of_isInvariant` for the - decomposition into sectors, `MassDimFour.LinearIndependence` and the four `Closure` files for - the invariance of the components, and the four sector theorems for what each sector - contributes. The second derivatives of the field strength contribute nothing. -/ -theorem mem_span_renormalizableTerms_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) - (h8 : x ∈ massWeightSubmodule 8) : - x ∈ Submodule.span ℂ - {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm} := by - obtain ⟨u, hu, d, hd, rfl⟩ := Submodule.mem_sup.mp - (mem_massDimFour_neutral_sectors_of_isInvariant hx h8) - obtain ⟨v, hv, c, hc, rfl⟩ := Submodule.mem_sup.mp hu - obtain ⟨a, ha, b, hb, rfl⟩ := Submodule.mem_sup.mp hv - obtain ⟨hai, hbi, hci, hdi⟩ := isInvariant_of_massDimFour_decomp hx ha hb hc hd rfl - have hmono : ∀ S : Set JetAlgebra, - S ⊆ {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm} → - Submodule.span ℂ S ≤ Submodule.span ℂ - {fermionKineticTerm, fermionKineticTermBar, maxwellTerm, thetaTerm} := - fun _ hS => Submodule.span_mono hS - refine add_mem (add_mem (add_mem ?_ ?_) ?_) ?_ - · exact hmono _ (by simp) (mem_fermionic_bar_kinetic_span_eq_kineticTermBar_of_isInvariant - hai ha) - · exact hmono _ (by simp) (mem_fermionic_kinetic_span_eq_kineticTerm_of_isInvariant hbi hb) - · rw [eq_zero_of_isInvariant_of_mem_span_fieldStrengthDeriv_pair hci hc] - exact zero_mem _ - · refine hmono _ (fun y hy => ?_) - (mem_gauge_kinetic_span_eq_maxwell_theta_of_isInvariant hdi hd) - simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hy ⊢ - tauto - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/todos.md b/todos.md index e6ba33187..0e3dcf1f8 100644 --- a/todos.md +++ b/todos.md @@ -1,16 +1,12 @@ # TODOs introduced by this branch -21 open · as of 2026-08-21 +20 open · as of 2026-08-25 > Regenerate with `python scripts/todos.py --md todos.md` after adding or > resolving a TODO, and commit it in the same commit. **Format.** Use the `TODO "…"` command -### `Particles/LeptonGaugeSector/JetAlgebra/Boosts` - -- Generalize the below result for any axis  [`FieldStrength.lean:348`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Boosts/FieldStrength.lean#L348) - ### `Particles/PureFermionic` - Move the diagonal `SL(2, ℂ)` material `diagSL`, `diagSL_inv`, `diagSL_neg_one` and `twoI` to `Physlib.Relativity.SL2C.Basic`, their canonical home, when the effective-potential development is split up.  [`EFTLagrangianExclDeriv.lean:162`](https://github.com/jstoobysmith/JTSphyslib/blob/AddPotentialAlgebra/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean#L162) From 6007310e9f38cc48f2b7425f5c2e474655feb9c8 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Wed, 26 Aug 2026 13:11:52 +0400 Subject: [PATCH 202/254] =?UTF-8?q?refactor(Particles):=20remove=20the=20l?= =?UTF-8?q?epton=E2=80=93gauge=20sector=20jet=20algebra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the remaining twenty-eight modules of the package. Basic GaugeAction LorentzAction JetDeriv JetDerivLorentz IsInvariant FieldStrength Covariantization CovariantAlgebra CovariantDeriv Grading/Hypercharge Grading/Irrep MassDim DerivativeOrder FermionicParity MassDimFour/Basic MassDimFour/LinearIndependence Terms/KineticTerms Terms/MaxwellTerm Terms/ThetaTerm FermionicKineticTerm/Closure FermionicKineticTerm/LinearIndependence FermionicBarKineticTerm/Closure FermionicBarKineticTerm/LinearIndependence GaugeKineticTerm/Closure GaugeKineticTerm/LinearIndependence GaugeDoubleDeriv/Closure GaugeDoubleDeriv/LinearIndependence Drops the root import at Physlib.lean:190. --- Physlib.lean | 1 - .../LeptonGaugeSector/JetAlgebra/Basic.lean | 234 ----- .../JetAlgebra/CovariantAlgebra.lean | 359 -------- .../JetAlgebra/CovariantDeriv.lean | 183 ---- .../JetAlgebra/Covariantization.lean | 442 ---------- .../JetAlgebra/DerivativeOrder.lean | 697 --------------- .../FermionicBarKineticTerm/Closure.lean | 144 --- .../LinearIndependence.lean | 89 -- .../FermionicKineticTerm/Closure.lean | 139 --- .../LinearIndependence.lean | 173 ---- .../JetAlgebra/FermionicParity.lean | 424 --------- .../JetAlgebra/FieldStrength.lean | 94 -- .../JetAlgebra/GaugeAction.lean | 828 ------------------ .../JetAlgebra/GaugeDoubleDeriv/Closure.lean | 140 --- .../GaugeDoubleDeriv/LinearIndependence.lean | 145 --- .../JetAlgebra/GaugeKineticTerm/Closure.lean | 152 ---- .../GaugeKineticTerm/LinearIndependence.lean | 160 ---- .../JetAlgebra/Grading/Hypercharge.lean | 685 --------------- .../JetAlgebra/Grading/Irrep.lean | 21 - .../JetAlgebra/IsInvariant.lean | 114 --- .../JetAlgebra/JetDeriv.lean | 319 ------- .../JetAlgebra/JetDerivLorentz.lean | 135 --- .../JetAlgebra/LorentzAction.lean | 458 ---------- .../LeptonGaugeSector/JetAlgebra/MassDim.lean | 676 -------------- .../JetAlgebra/MassDimFour/Basic.lean | 593 ------------- .../MassDimFour/LinearIndependence.lean | 499 ----------- .../JetAlgebra/Terms/KineticTerms.lean | 354 -------- .../JetAlgebra/Terms/MaxwellTerm.lean | 194 ---- .../JetAlgebra/Terms/ThetaTerm.lean | 352 -------- 29 files changed, 8804 deletions(-) delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean delete mode 100644 Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean diff --git a/Physlib.lean b/Physlib.lean index db5fc861d..2344563a7 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -186,7 +186,6 @@ public import Physlib.Particles.FlavorPhysics.CKMMatrix.Relations public import Physlib.Particles.FlavorPhysics.CKMMatrix.Rows public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.Basic public import Physlib.Particles.FlavorPhysics.CKMMatrix.StandardParameterization.StandardParameters -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Covariantization public import Physlib.Particles.NeutrinoPhysics.Basic public import Physlib.Particles.QED.Basic public import Physlib.Particles.QED.CurrentCoupling diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean deleted file mode 100644 index 4eee7c4cf..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Basic.lean +++ /dev/null @@ -1,234 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic -public import Mathlib.RingTheory.TensorProduct.Basic -public import Mathlib.LinearAlgebra.DirectSum.Finsupp -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Mathematics.ConjModule -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Particles.LagrangianTheory.Basic -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.MassDim -/-! -# Jet algebra for quantum electrodynamics - -## i. Overview - -The jet algebra of quantum electrodynamics: the algebra generated by the component -functions of the photon-like `U(1)` gauge boson (the B boson) and the charged -lepton, together with all their derivative coordinates. It is the tensor product of -the complexified B-boson jet algebra (a symmetric algebra, complexified so it can -be paired with the complex fermionic factor) and the charged-lepton jet algebra -(an exterior algebra). - -The jet gauge group acts on each factor — by Maurer–Cartan substitutions on the -B-boson component functions, and linearly through the hypercharge character and its -derivatives on the lepton component functions — and hence on the full lepton–gauge-sector jet -algebra by the tensor product of the two actions. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -inductive JetGenerators where - | dB (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : JetGenerators - | dψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators - | dbarψ (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetGenerators - -/-- The jet algebra of the lepton–gauge sector: the tensor product of the complexified - B-boson jet algebra with the charged-lepton jet algebra. - - This is a `def` rather than an `abbrev`, and its algebraic structure is fixed by the single - `Ring` and `Algebra` instances below, so that every algebraic class projects from one root. - On the bare tensor product `One`, `Mul`, `Zero`, `Add`, `SMul` and `Module` are instead - supplied by standalone `TensorProduct.*` instances rather than as projections of the - semiring. Those are definitionally the projections, but not syntactically, so a lemma whose - type argument is not pinned by an explicit argument cannot be unified against a goal — that - would need a projection inverted through a metavariable. Concretely `mul_one a` succeeds, - because `a` fixes the type first, while `one_pow n` fails. Rooting the structure here keeps - the generic algebraic lemmas usable. - - Note that the corresponding issue does not arise for the complexification - `ℂ ⊗[ℝ] BBoson.JetAlgebra`, where both factors are commutative. -/ -def JetAlgebra : Type := (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (LeptonSinglet.JetAlgebra) - -noncomputable instance : Ring JetAlgebra := - inferInstanceAs (Ring ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra)) - -noncomputable instance : Algebra ℂ JetAlgebra := - inferInstanceAs (Algebra ℂ ((ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra)) - -namespace JetAlgebra - -/-- A pure tensor, as an element of the jet algebra. - - Writing `a ⊗ₜ[ℂ] b` builds an element of the *underlying* tensor product, which is only - definitionally an element of `JetAlgebra`. A goal mixing such a term with the jet algebra's - own operations is then not type-correct at `instances` transparency, and no rewrite can fire - on it. This constructor keeps pure tensors typed at `JetAlgebra`, and is what the lemmas - below and the induction principle are stated in terms of. -/ -noncomputable def tmul (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - JetAlgebra := a ⊗ₜ[ℂ] b - -@[inherit_doc] scoped infixl:100 " ⊗ⱼ " => JetAlgebra.tmul - -/-- `tmul` is the pure tensor of the underlying tensor product; use this to move between the - jet algebra and lemmas stated for the tensor product. -/ -lemma tmul_eq (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - a ⊗ⱼ b = a ⊗ₜ[ℂ] b := rfl - -lemma one_eq_tmul : (1 : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ 1 := rfl - -/-- Multiplication of pure tensors. `Algebra.TensorProduct.tmul_mul_tmul` does not rewrite - here, even though it is definitionally the same statement. -/ -@[simp] -lemma tmul_mul_tmul (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (b₁ b₂ : LeptonSinglet.JetAlgebra) : - (a₁ ⊗ⱼ b₁) * (a₂ ⊗ⱼ b₂) = (a₁ * a₂) ⊗ⱼ (b₁ * b₂) := - Algebra.TensorProduct.tmul_mul_tmul _ _ _ _ - -@[simp] -lemma zero_tmul (b : LeptonSinglet.JetAlgebra) : - (0 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ b = 0 := TensorProduct.zero_tmul _ b - -@[simp] -lemma tmul_zero (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - a ⊗ⱼ (0 : LeptonSinglet.JetAlgebra) = 0 := TensorProduct.tmul_zero _ a - -@[simp] -lemma add_tmul (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - (a₁ + a₂) ⊗ⱼ b = a₁ ⊗ⱼ b + a₂ ⊗ⱼ b := TensorProduct.add_tmul a₁ a₂ b - -@[simp] -lemma tmul_add (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b₁ b₂ : LeptonSinglet.JetAlgebra) : - a ⊗ⱼ (b₁ + b₂) = a ⊗ⱼ b₁ + a ⊗ⱼ b₂ := TensorProduct.tmul_add a b₁ b₂ - -@[simp] -lemma sub_tmul (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - (a₁ - a₂) ⊗ⱼ b = a₁ ⊗ⱼ b - a₂ ⊗ⱼ b := TensorProduct.sub_tmul a₁ a₂ b - -@[simp] -lemma tmul_sub (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b₁ b₂ : LeptonSinglet.JetAlgebra) : - a ⊗ⱼ (b₁ - b₂) = a ⊗ⱼ b₁ - a ⊗ⱼ b₂ := TensorProduct.tmul_sub a b₁ b₂ - -lemma tmul_sum {ι : Type*} (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (s : Finset ι) - (f : ι → LeptonSinglet.JetAlgebra) : a ⊗ⱼ (∑ i ∈ s, f i) = ∑ i ∈ s, a ⊗ⱼ f i := - TensorProduct.tmul_sum a s f - -lemma sum_tmul {ι : Type*} (s : Finset ι) (f : ι → ℂ ⊗[ℝ] BBoson.JetAlgebra) - (b : LeptonSinglet.JetAlgebra) : (∑ i ∈ s, f i) ⊗ⱼ b = ∑ i ∈ s, f i ⊗ⱼ b := - TensorProduct.sum_tmul s f b - -@[simp] -lemma tmul_smul (r : ℂ) (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - a ⊗ⱼ (r • b) = r • (a ⊗ⱼ b) := TensorProduct.tmul_smul r a b - -@[simp] -lemma smul_tmul' (r : ℂ) (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - (r • a) ⊗ⱼ b = r • (a ⊗ⱼ b) := TensorProduct.smul_tmul' r a b - -lemma tmul_add_tmul_right (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (b₁ b₂ : LeptonSinglet.JetAlgebra) : a ⊗ⱼ b₁ + a ⊗ⱼ b₂ = a ⊗ⱼ (b₁ + b₂) := - (TensorProduct.tmul_add a b₁ b₂).symm - -@[simp] -lemma tmul_add_tmul_left (a₁ a₂ : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (b : LeptonSinglet.JetAlgebra) : a₁ ⊗ⱼ b + a₂ ⊗ⱼ b = (a₁ + a₂) ⊗ⱼ b := - (TensorProduct.add_tmul a₁ a₂ b).symm - -/-- A linear map on the bosonic factor, extended to the whole jet algebra. Stating this as a - map out of `JetAlgebra` keeps `map_zero`/`map_add` applicable, which they are not for a bare - `TensorProduct.map` fed a jet-algebra element. -/ -noncomputable def mapB (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ ⊗[ℝ] BBoson.JetAlgebra) : - JetAlgebra →ₗ[ℂ] JetAlgebra := - TensorProduct.map f LinearMap.id - -@[simp] -lemma mapB_tmul (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - mapB f (a ⊗ⱼ b) = (f a) ⊗ⱼ b := rfl - -/-- Induction on the jet algebra, stated for `JetAlgebra` itself. Using - `TensorProduct.induction_on` directly leaves the zero, the sum and the pure tensors in the - goals carrying the tensor product's structure rather than the jet algebra's, which makes - those goals unrewritable. -/ -@[elab_as_elim] -lemma induction_on {motive : JetAlgebra → Prop} (x : JetAlgebra) (zero : motive 0) - (tmul : ∀ (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra), - motive (a ⊗ⱼ b)) - (add : ∀ x y : JetAlgebra, motive x → motive y → motive (x + y)) : motive x := - TensorProduct.induction_on x zero tmul add - -/-- The B-boson factor included into the lepton–gauge-sector jet algebra. -/ -noncomputable abbrev inclB : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.includeLeft - -/-- The charged-lepton factor included into the lepton–gauge-sector jet algebra. -/ -noncomputable abbrev inclL : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.includeRight - -/-- Polynomials pushed forward from the two tensor factors commute: the factors - commute in the tensor product, and the polynomial variable is central. -/ -lemma commute_mapAlgHom_inclB_inclL (p : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) - (q : Polynomial LeptonSinglet.JetAlgebra) : - Commute (Polynomial.mapAlgHom inclB p) (Polynomial.mapAlgHom inclL q) := by - induction p using Polynomial.induction_on' with - | add p₁ p₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_left h₂ - | monomial m a => - induction q using Polynomial.induction_on' with - | add q₁ q₂ h₁ h₂ => simpa [add_mul, mul_add] using h₁.add_right h₂ - | monomial n b => - show Polynomial.mapAlgHom inclB (Polynomial.monomial m a) * - Polynomial.mapAlgHom inclL (Polynomial.monomial n b) = _ - simp only [Polynomial.mapAlgHom, AlgHom.coe_mk, Polynomial.coe_mapRingHom, - Polynomial.map_monomial, Polynomial.monomial_mul_monomial] - rw [Nat.add_comm m n] - congr 1 - show (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) * ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) - = ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ₜ[ℂ] b) * (a ⊗ₜ[ℂ] (1 : LeptonSinglet.JetAlgebra)) - rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - one_mul, mul_one, one_mul, mul_one] - -/-! - -## A. Elements associated with the generators - --/ - -noncomputable def ofGenerator (s : JetGenerators) : JetAlgebra := - match s with - | JetGenerators.dB s μ => - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ⱼ 1 - | JetGenerators.dψ s α => - (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) - | JetGenerators.dbarψ s α => - (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) - -scoped notation "[" s "]ₐ" => ofGenerator s - -lemma ofGenerator_dψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - ofGenerator (JetGenerators.dψ s α) = - (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dψ s α) := rfl - -lemma ofGenerator_B_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - ofGenerator (JetGenerators.dB s μ) = - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB s μ)) ⊗ⱼ 1 := rfl - -lemma ofGenerator_dbarψ_eq (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - ofGenerator (JetGenerators.dbarψ s α) = - (1 ⊗ₜ[ℝ] 1) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dbarψ s α) := rfl -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean deleted file mode 100644 index 00c238e48..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantAlgebra.lean +++ /dev/null @@ -1,359 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.CovariantDeriv -/-! -# The covariant subalgebra of the lepton–gauge-sector jet algebra - -The subalgebra generated by the covariant quantities of the theory — the derivatives of the -field strength and the covariant derivatives of the lepton and of its conjugate — together -with the linear-matter submodule and the covariant substitution used to study it. - -The linear-matter submodule is spanned by a single matter component function times a B-boson -polynomial; the file records its closure under the total derivative and the covariant steps, -and the oddness of its elements in the fermionic case. The covariant substitution `covSubst` -replaces each plain fermionic generator by its covariant version, and is the change of -variables under which the covariant subalgebra is the image of the plain one. --/ - -@[expose] public section - - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## A. The covariant subalgebra - -The subalgebra generated by the covariant quantities of the theory: the derivatives of the -field strength — which for an abelian gauge field are already covariant, the field strength -being neutral — and the covariant derivatives of the lepton and of its conjugate. - -Every gauge invariant lies in this subalgebra — that is -`mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq` — and conversely an element of it is -invariant as soon as it is fixed by the *constant* gauge transformations and by the Lorentz -group, since a jet of gauge transformations acts on these generators only through its value at -the base point. - --/ - -/-- The generators of the covariant subalgebra: the derivatives of the field strength together - with the covariant derivatives of the lepton and of its conjugate. -/ -noncomputable def invariantGenerators : Set JetAlgebra := - (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ - (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dψ p.1 p.2) ∪ - (Set.range fun p : List (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ p.1 p.2) - -/-- The covariant subalgebra of the lepton–gauge-sector jet algebra: the subalgebra generated - by the derivatives of the field strength and the covariant derivatives of the lepton and of - its conjugate. -/ -noncomputable def CovariantAlgebra : Subalgebra ℂ JetAlgebra := - Algebra.adjoin ℂ invariantGenerators - -lemma mem_covariantAlgebra_iff {x : JetAlgebra} : - x ∈ CovariantAlgebra ↔ x ∈ Algebra.adjoin ℂ invariantGenerators := Iff.rfl - -lemma fieldStrengthDeriv_mem_covariantAlgebra (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ ν ∈ CovariantAlgebra := - Algebra.subset_adjoin (Or.inl (Or.inl ⟨(s, μ, ν), rfl⟩)) - -lemma Dψ_mem_covariantAlgebra (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α ∈ CovariantAlgebra := - Algebra.subset_adjoin (Or.inl (Or.inr ⟨(l, α), rfl⟩)) - -lemma Dbarψ_mem_covariantAlgebra (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α ∈ CovariantAlgebra := - Algebra.subset_adjoin (Or.inr ⟨(l, α), rfl⟩) - -/-- Induction over the covariant subalgebra, with the three families of generators presented - separately. This is the shape every proof about the covariant subalgebra wants: unfolding - `Algebra.adjoin_induction` by hand forces the caller to take apart the union defining - `invariantGenerators` at each use. -/ -@[elab_as_elim] -lemma CovariantAlgebra.induction_on - {motive : (x : JetAlgebra) → x ∈ CovariantAlgebra → Prop} - (fieldStrength : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3), - motive (fieldStrengthDeriv s μ ν) (fieldStrengthDeriv_mem_covariantAlgebra s μ ν)) - (lepton : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), - motive (Dψ l α) (Dψ_mem_covariantAlgebra l α)) - (conjLepton : ∀ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2), - motive (Dbarψ l α) (Dbarψ_mem_covariantAlgebra l α)) - (algebraMap : ∀ r : ℂ, motive (algebraMap ℂ JetAlgebra r) - (Subalgebra.algebraMap_mem CovariantAlgebra r)) - (add : ∀ (u v : JetAlgebra) (hu : u ∈ CovariantAlgebra) (hv : v ∈ CovariantAlgebra), - motive u hu → motive v hv → motive (u + v) (Subalgebra.add_mem _ hu hv)) - (mul : ∀ (u v : JetAlgebra) (hu : u ∈ CovariantAlgebra) (hv : v ∈ CovariantAlgebra), - motive u hu → motive v hv → motive (u * v) (Subalgebra.mul_mem _ hu hv)) - {x : JetAlgebra} (hx : x ∈ CovariantAlgebra) : motive x hx := by - induction hx using Algebra.adjoin_induction with - | mem z hz => - rcases hz with (⟨p, rfl⟩ | ⟨p, rfl⟩) | ⟨p, rfl⟩ - · exact fieldStrength p.1 p.2.1 p.2.2 - · exact lepton p.1 p.2 - · exact conjLepton p.1 p.2 - | algebraMap r => exact algebraMap r - | add u v hu hv ihu ihv => exact add u v hu hv ihu ihv - | mul u v hu hv ihu ihv => exact mul u v hu hv ihu ihv - -/-! - -## B. The linear-matter submodule - --/ - -/-- The linear-matter submodule: the elements of the jet algebra in which the - matter coordinates appear exactly linearly, spanned by the products of a - gauge-sector element with a single matter component function. - - The construction does not depend on the matter content. A jet algebra of this - shape is `G ⊗[ℂ] ExteriorAlgebra ℂ M`, with `G` the gauge-sector algebra and - `M` the space of matter component functions; the fermionic degree is the - exterior grading of the second factor, and degree one is the image of - `ExteriorAlgebra.ι`. For several matter species `M` is their direct sum and the - same definition applies verbatim. - - This is the submodule the covariance argument for the covariant derivatives - lives on. It is closed under the gauge group - (`repJetGaugeGroupI_mem_LinearMatterSubmodule`), under the total derivative - and under the covariant steps, and it is where the Maurer–Cartan anomaly - operators close: in higher fermionic degree they do not, because the gauge - action on the exterior algebra is an algebra map and so multiplies the - hypercharge characters. -/ -noncomputable def LinearMatterSubmodule : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x : JetAlgebra | ∃ (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace), x = p ⊗ⱼ ExteriorAlgebra.ι ℂ m} - -/-- The spanning elements: a gauge-sector coefficient times a single matter - component function. -/ -lemma tmul_ι_mem_LinearMatterSubmodule (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace) : - p ⊗ⱼ ExteriorAlgebra.ι ℂ m ∈ LinearMatterSubmodule := - Submodule.subset_span ⟨p, m, rfl⟩ - -/-! - -The remaining results in this section are specific to *fermionic* matter: they -express that the linear-matter elements are odd. Nothing above depends on them, -and nothing that follows — the closure of the submodule under the derivative, -the covariant steps, or the gauge group — does either. For bosonic matter the -matter factor is a symmetric rather than an exterior algebra, the same -definition of `LinearMatterSubmodule` applies with the corresponding canonical -inclusion, and only this anticommutation block is dropped. - --/ - -/-- Right distributivity on the jet algebra, with the multiplication forced to - the `JetAlgebra` instance. Stating it explicitly keeps `rw` from having to - match through the tensor-product instance path. -/ -lemma distrib_add_mul (a b c : JetAlgebra) : (a + b) * c = a * c + b * c := by grind - -/-- Left distributivity on the jet algebra; see `distrib_add_mul`. -/ -lemma distrib_mul_add (a b c : JetAlgebra) : a * (b + c) = a * b + a * c := by grind - -/-- Linear-matter elements anticommute against the spanning elements. -/ -lemma tmul_ι_mul_add_swap_of_mem (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace) {y : JetAlgebra} - (hy : y ∈ LinearMatterSubmodule) : - (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * y + y * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) = 0 := by - have hd₁ := distrib_add_mul - have hd₂ := distrib_mul_add - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := - fun c a b => smul_mul_assoc c a b - have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := - fun c a b => mul_smul_comm c a b - induction hy using Submodule.span_induction with - | mem z hz => - obtain ⟨q, n, rfl⟩ := hz - rw [tmul_mul_tmul, tmul_mul_tmul, - mul_comm q p, tmul_add_tmul_right, ExteriorAlgebra.ι_add_mul_swap, - tmul_zero] - | zero => rw [hz₂, hz₁, add_zero] - | add u v _ _ hu hv => - rw [hd₂, hd₁] - calc (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * u + (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * v + - (u * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) + v * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m)) = - ((p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * u + u * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m)) + - ((p ⊗ⱼ ExteriorAlgebra.ι ℂ m) * v + v * (p ⊗ⱼ ExteriorAlgebra.ι ℂ m)) := by - abel - _ = 0 := by rw [hu, hv, add_zero] - | smul c u _ hu => - rw [hs₂, hs₁, ← smul_add, hu, smul_zero] - -/-- Linear-matter elements anticommute: they are odd. -/ -lemma mul_add_swap_of_mem {x y : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) - (hy : y ∈ LinearMatterSubmodule) : x * y + y * x = 0 := by - have hd₁ := distrib_add_mul - have hd₂ := distrib_mul_add - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - have hs₁ : ∀ (c : ℂ) (a b : JetAlgebra), (c • a) * b = c • (a * b) := - fun c a b => smul_mul_assoc c a b - have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := - fun c a b => mul_smul_comm c a b - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - exact tmul_ι_mul_add_swap_of_mem p m hy - | zero => rw [hz₁, hz₂, add_zero] - | add u v _ _ hu hv => - rw [hd₁, hd₂] - calc u * y + v * y + (y * u + y * v) = - (u * y + y * u) + (v * y + y * v) := by abel - _ = 0 := by rw [hu, hv, add_zero] - | smul c u _ hu => - rw [hs₁, hs₂, ← smul_add, hu, smul_zero] - -/-- Linear-matter elements square to zero. -/ -lemma mul_self_of_mem {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : - x * x = 0 := by - have h2 : (2 : ℂ) • (x * x) = 0 := by - rw [two_smul] - exact mul_add_swap_of_mem hx hx - exact (smul_eq_zero.mp h2).resolve_left (by norm_num) - -/-- The linear-matter submodule is preserved by the total derivative. -/ -lemma jetDeriv_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} - (hx : x ∈ LinearMatterSubmodule) : jetDeriv μ x ∈ LinearMatterSubmodule := by - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι] - exact Submodule.add_mem _ (tmul_ι_mem_LinearMatterSubmodule _ _) - (tmul_ι_mem_LinearMatterSubmodule _ _) - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- The linear-matter submodule is preserved by multiplication by a gauge-field - generator, which lives in the bosonic factor. -/ -lemma dB_mul_mem_LinearMatterSubmodule (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} - (hx : x ∈ LinearMatterSubmodule) : - [JetGenerators.dB {} μ]ₐ * x ∈ LinearMatterSubmodule := by - have hd₂ := distrib_mul_add - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - have hs₂ : ∀ (c : ℂ) (a b : JetAlgebra), a * (c • b) = c • (a * b) := - fun c a b => mul_smul_comm c a b - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB {} μ)) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra) from rfl, - tmul_mul_tmul, one_mul] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | zero => rw [hz₂]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [hd₂]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [hs₂]; exact Submodule.smul_mem _ _ hu - -/-- The covariant derivatives of the lepton are linear in the matter fields. -/ -lemma Dψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α ∈ LinearMatterSubmodule := by - induction l with - | nil => - rw [show Dψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ⱼ - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dψ {} α)) from rfl] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | cons ν l ih => - simp only [Dψ_cons, covariantStep_apply] - exact Submodule.sub_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) - (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) - -/-- The covariant derivatives of the conjugate lepton are linear in the matter - fields. -/ -lemma Dbarψ_mem_LinearMatterSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α ∈ LinearMatterSubmodule := by - induction l with - | nil => - rw [show Dbarψ [] α = ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ⱼ - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | cons ν l ih => - simp only [Dbarψ_cons, covariantStepBar_apply] - exact Submodule.add_mem _ (jetDeriv_mem_LinearMatterSubmodule ν ih) - (Submodule.smul_mem _ _ (dB_mul_mem_LinearMatterSubmodule ν ih)) - -/-- The covariant lepton derivatives anticommute with the conjugate covariant - derivatives: both are odd elements of the linear-matter submodule. -/ -lemma Dψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dψ l α * Dbarψ l' β = -(Dbarψ l' β * Dψ l α) := - eq_neg_of_add_eq_zero_left - (mul_add_swap_of_mem (Dψ_mem_LinearMatterSubmodule l α) - (Dbarψ_mem_LinearMatterSubmodule l' β)) - -lemma covGenerator_mem_LinearMatterSubmodule (g : LeptonSinglet.JetGenerators) : - covGenerator g ∈ LinearMatterSubmodule := by - cases g with - | dψ s α => exact Dψ_mem_LinearMatterSubmodule (sortList s) α - | dbarψ s α => exact Dbarψ_mem_LinearMatterSubmodule (sortList s) α - -lemma covMap_mem_LinearMatterSubmodule (m : LeptonSinglet.JetComponentSpace) : - covMap m ∈ LinearMatterSubmodule := by - rw [covMap, Module.Basis.constr_apply] - exact Submodule.sum_mem _ fun g _ => - Submodule.smul_mem _ _ (covGenerator_mem_LinearMatterSubmodule g) - -lemma covMap_mul_self (m : LeptonSinglet.JetComponentSpace) : - covMap m * covMap m = 0 := - mul_self_of_mem (covMap_mem_LinearMatterSubmodule m) - -/-- The covariant substitution on the fermionic factor. -/ -noncomputable def covExtHom : LeptonSinglet.JetAlgebra →ₐ[ℂ] JetAlgebra := - ExteriorAlgebra.lift ℂ ⟨covMap, covMap_mul_self⟩ - -@[simp] -lemma covExtHom_ι (m : LeptonSinglet.JetComponentSpace) : - covExtHom (ExteriorAlgebra.ι ℂ m) = covMap m := by - rw [covExtHom, ExteriorAlgebra.lift_ι_apply] - -/-- Elements of the B-boson factor are central in the lepton–gauge-sector jet algebra. -/ -lemma tmul_one_mul_comm (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (y : JetAlgebra) : - (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * y = - y * (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) := by - have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := by grind - have hd₂ := distrib_mul_add - have hz₁ : ∀ a : JetAlgebra, 0 * a = 0 := fun a => zero_mul a - have hz₂ : ∀ a : JetAlgebra, a * 0 = 0 := fun a => mul_zero a - induction y using JetAlgebra.induction_on with - | zero => rw [hz₂, hz₁] - | add a b ha hb => simp only [hd₁, hd₂, ha, hb] - | tmul q l => - rw [tmul_mul_tmul, tmul_mul_tmul, mul_comm, one_mul, mul_one] - -/-- The covariant substitution: the algebra endomorphism of the lepton–gauge-sector jet algebra - fixing the B-boson factor and sending each plain fermionic generator to its - covariant version. -/ -noncomputable def covSubst : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft covExtHom - (fun p y => (tmul_one_mul_comm p (covExtHom y))) - -lemma covSubst_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - covSubst (p ⊗ⱼ l) = (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * covExtHom l := rfl - -@[simp] -lemma covSubst_tmul_one (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - covSubst (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = p ⊗ⱼ 1 := by - have h1 : covExtHom (1 : LeptonSinglet.JetAlgebra) = 1 := covExtHom.map_one - have hmul : ∀ a : JetAlgebra, a * 1 = a := fun a => mul_one a - rw [covSubst_tmul, h1, hmul] - -@[simp] -lemma covSubst_one_tmul_ι (m : LeptonSinglet.JetComponentSpace) : - covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ ExteriorAlgebra.ι ℂ m) = - covMap m := by - have hone : ∀ a : JetAlgebra, 1 * a = a := fun a => one_mul a - rw [covSubst_tmul, covExtHom_ι, ← one_eq_tmul, hone] - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean deleted file mode 100644 index 075ea45bf..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/CovariantDeriv.lean +++ /dev/null @@ -1,183 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.JetDeriv -/-! -# The covariant derivatives of the charged lepton - -The covariant derivative `D_l ψ_α` of the charged lepton and its conjugate -`D̄_l ψ̄_α`, built by iterating the covariant step `∂_μ + 6 i B_μ`, and the -covariant substitution that trades the plain fermionic coordinates for them. --/ - -@[expose] public section - - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## Covariant derivatives - -The covariant derivative `D_l ψ_α` of the charged lepton, indexed by an ordered -list `l` of spacetime directions: covariant derivatives do not commute — their -commutator is the field strength — so the index is a list rather than a -multiset, with the head of the list the outermost derivative. - -The component functions of the lepton transform contragrediently, through the -hypercharge power series `u ^ 6`, so the covariant step on component functions -is `D_μ = ∂_μ - 6 i B_μ`: under a jet gauge transformation `∂_μ ψ_α` shifts by -`- 6 i mc_μ ψ_α` while `B_μ`, being a component function too, shifts -contragrediently by `- mc_μ` (`BBoson.mcShift`), and the two contributions -cancel for the coupling `- 6 i` — and only for that coupling. The step is -defined on the whole jet algebra; applied repeatedly to the zeroth-order -component function of `ψ` it produces the covariant derivatives. - --/ - -/-- One covariant-derivative step `D_μ = ∂_μ - 6 i B_μ` on the lepton–gauge-sector - jet algebra: - the total spacetime derivative together with multiplication by the gauge field - weighted by the hypercharge coupling. The sign is fixed by covariance: the - component function `ψ_α` carries hypercharge `+6`, so `∂_μ ψ_α` picks up - `- 6 i mc_μ ψ_α`, while `B_μ` shifts contragrediently by `- mc_μ` - (`BBoson.mcShift`); the two cancel only for the coupling `- 6 i`. -/ -noncomputable def covariantStep (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv μ - ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ - -@[simp] -lemma covariantStep_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - covariantStep μ x = - jetDeriv μ x - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by - rw [covariantStep, LinearMap.sub_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply] - -/-- The covariant derivative `D_l ψ_α` of the charged lepton along the ordered - list of directions `l`, with the head of the list the outermost derivative. -/ -noncomputable def Dψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - JetAlgebra := - l.foldr (fun μ x => covariantStep μ x) [JetGenerators.dψ {} α]ₐ - -/-- The zeroth covariant derivative is the lepton component function itself. -/ -@[simp] -lemma Dψ_nil (α : Fin 2) : - Dψ [] α = [JetGenerators.dψ {} α]ₐ := rfl - -@[simp] -lemma Dψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) - (α : Fin 2) : - Dψ (μ :: l) α = covariantStep μ (Dψ l α) := - rfl - -/-- The first covariant derivative: `D_μ ψ_α = ∂_μ ψ_α - 6 i B_μ ψ_α`. -/ -lemma Dψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dψ [μ] α = [JetGenerators.dψ {μ} α]ₐ - - ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dψ {} α]ₐ) := by - rw [Dψ_cons, Dψ_nil, covariantStep_apply] - congr 1 - simp only [ofGenerator] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, tmul_zero, - TensorProduct.zero_tmul, zero_tmul, zero_add, LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dψ, Multiset.empty_eq_zero] - -/-- One covariant-derivative step `D̄_μ = ∂_μ + 6 i B_μ` for the conjugate - lepton on the lepton–gauge-sector jet algebra: the conjugate component - function `ψ̄_α` carries - hypercharge `-6`, so its coupling is the opposite of that in - `covariantStep`. -/ -noncomputable def covariantStepBar (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - jetDeriv μ + ((6 : ℂ) * Complex.I) • LinearMap.mulLeft ℂ [JetGenerators.dB {} μ]ₐ - -@[simp] -lemma covariantStepBar_apply (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - covariantStepBar μ x = - jetDeriv μ x + ((6 : ℂ) * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x) := by - rw [covariantStepBar, LinearMap.add_apply, LinearMap.smul_apply, - LinearMap.mulLeft_apply] - -/-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton along the - ordered list of directions `l`, with the head of the list the outermost - derivative. -/ -noncomputable def Dbarψ (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : JetAlgebra := - l.foldr (fun μ x => covariantStepBar μ x) [JetGenerators.dbarψ {} α]ₐ - -/-- The zeroth covariant derivative is the conjugate-lepton component function - itself. -/ -@[simp] -lemma Dbarψ_nil (α : Fin 2) : - Dbarψ [] α = [JetGenerators.dbarψ {} α]ₐ := rfl - -@[simp] -lemma Dbarψ_cons (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ (μ :: l) α = covariantStepBar μ (Dbarψ l α) := rfl - -/-- The first conjugate covariant derivative: - `D̄_μ ψ̄_α = ∂_μ ψ̄_α + 6 i B_μ ψ̄_α`. -/ -lemma Dbarψ_singleton (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dbarψ [μ] α = [JetGenerators.dbarψ {μ} α]ₐ + ((6 : ℂ) * Complex.I) • - ([JetGenerators.dB {} μ]ₐ * [JetGenerators.dbarψ {} α]ₐ) := by - rw [Dbarψ_cons, Dbarψ_nil, covariantStepBar_apply] - congr 1 - simp only [ofGenerator] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero, tmul_zero, - TensorProduct.zero_tmul, zero_tmul, zero_add, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dbarψ, Multiset.empty_eq_zero] - -/-! - -### The covariant substitution - -The change of variables from the plain fermionic coordinates `∂_s ψ_α`, -`∂_s ψ̄_α` to the covariant coordinates `D_s ψ_α`, `D̄_s ψ̄_α`, as an algebra -endomorphism of the lepton–gauge-sector jet algebra fixing the B-boson factor. - --/ - -/-- A canonical list presentation of a multiset of spacetime indices. -/ -noncomputable def sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : List (Fin 1 ⊕ Fin 3) := - ((s.map finSumFinEquiv).sort (· ≤ ·)).map finSumFinEquiv.symm - -@[simp] -lemma coe_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : - (↑(sortList s) : Multiset (Fin 1 ⊕ Fin 3)) = s := by - rw [sortList, ← Multiset.map_coe, Multiset.sort_eq, Multiset.map_map] - simp - -@[simp] -lemma length_sortList (s : Multiset (Fin 1 ⊕ Fin 3)) : - (sortList s).length = Multiset.card s := by - rw [sortList, List.length_map, Multiset.length_sort, Multiset.card_map] - -/-- The derivative degree of a lepton jet generator. -/ -def genDeg : LeptonSinglet.JetGenerators → ℕ - | .dψ s _ => Multiset.card s - | .dbarψ s _ => Multiset.card s - -/-- The covariant element associated with a lepton jet generator: the covariant - derivative along a canonical ordering of the multiset of derivative indices. -/ -noncomputable def covGenerator : LeptonSinglet.JetGenerators → JetAlgebra - | .dψ s α => Dψ (sortList s) α - | .dbarψ s α => Dbarψ (sortList s) α - -/-- The linear map sending each fermionic component function to its covariant - version. -/ -noncomputable def covMap : LeptonSinglet.JetComponentSpace →ₗ[ℂ] JetAlgebra := - LeptonSinglet.JetComponentSpace.basis.constr ℂ covGenerator - -@[simp] -lemma covMap_basis (g : LeptonSinglet.JetGenerators) : - covMap (LeptonSinglet.JetComponentSpace.basis g) = covGenerator g := by - rw [covMap, Module.Basis.constr_basis] -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean deleted file mode 100644 index 8b1d47fed..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Covariantization.lean +++ /dev/null @@ -1,442 +0,0 @@ -/- -Copyright (c) 2026 Nathaneal Sajan. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms -/-! -# Covariantization of charged-lepton jets - -This file provides compatibility properties of `covExtHom` (defined in `CovariantAlgebra.lean`), -which sends ordinary charged-lepton jets to ordered covariant derivatives in the mixed -lepton–gauge-sector jet algebra. - -The map is distinct from `covSubst` as `covExtHom` acts only on the matter algebra, while `covSubst` -extends it over the B-boson factor as a coordinate equivalence of the whole mixed algebra. - -At derivative order two and above, `covExtHom` uses `sortList` to choose an ordering of covariant -derivatives. Consequently, the Lorentz compatibility API in this file is restricted to derivative -orders zero and one. --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open Matrix MatrixGroups - -/-! - -## A. Gauge compatibility - --/ - -/-- Applying a jet gauge transformation after covariantization is the same as first applying its -value at the base point to the ordinary lepton jets and then covariantizing the result. -/ -lemma repJetGaugeGroupI_covExtHom (U : JetGaugeGroupI) - (x : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U (covExtHom x) = - covExtHom (LeptonSinglet.JetAlgebra.repGaugeGroupI U.eval x) := by - have hhom : (repAlgHom U).comp covExtHom = - covExtHom.comp (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom - (JetGaugeGroupI.ofConstant U.eval)) := by - refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) - simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, - AlgHom.toLinearMap_apply, covExtHom_ι] - have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = - covExtHom.toLinearMap ∘ₗ - (LeptonSinglet.JetAlgebra.repGaugeGroupI U.eval ∘ₗ ExteriorAlgebra.ι ℂ) := by - refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ - rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearMap.comp_apply, covMap_basis, - AlgHom.toLinearMap_apply, AlgHom.toLinearMap_apply, - ← repJetGaugeGroupI_eq_repAlgHom] - cases g with - | dψ s α => - rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, - repJetGaugeGroupI_Dψ] - rw [show ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) = - LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) from rfl, - LeptonSinglet.JetAlgebra.repGaugeGroupI_ofGenerator_ψ, map_smul] - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) = - ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) from rfl, - covExtHom_ι, covMap_basis] - rfl - | dbarψ s α => - rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, - repJetGaugeGroupI_Dbarψ] - rw [show ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) = - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) from rfl, - LeptonSinglet.JetAlgebra.repGaugeGroupI_ofGenerator_barψ, map_smul] - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) = - ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) from rfl, - covExtHom_ι, covMap_basis] - rfl - exact LinearMap.congr_fun hlin m - rw [repJetGaugeGroupI_eq_repAlgHom] - exact AlgHom.congr_fun hhom x - -/-- A gauge jet whose value at the base point is the identity fixes every covariantized -charged-lepton expression. -/ -lemma repJetGaugeGroupI_covExtHom_of_eval_eq_one (U : JetGaugeGroupI) - (hU : U.eval = 1) (x : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U (covExtHom x) = covExtHom x := by - rw [repJetGaugeGroupI_covExtHom, hU, map_one, Module.End.one_apply] - -/-- An ordinary charged-lepton expression invariant under constant gauge transformations becomes -invariant under all jet gauge transformations after covariantization. -/ -lemma repJetGaugeGroupI_covExtHom_eq_self (x : LeptonSinglet.JetAlgebra) - (hx : ∀ g : GaugeGroupI, LeptonSinglet.JetAlgebra.repGaugeGroupI g x = x) - (U : JetGaugeGroupI) : - repJetGaugeGroupI U (covExtHom x) = covExtHom x := by - rw [repJetGaugeGroupI_covExtHom, hx U.eval] - -/-! - -## B. Mass-weight compatibility - --/ - -/-- Covariantization preserves the mass-weight polynomial. -/ -lemma massWeightPoly_covExtHom (x : LeptonSinglet.JetAlgebra) : - massWeightPoly (covExtHom x) = - Polynomial.mapAlgHom covExtHom (LeptonSinglet.JetAlgebra.massWeightPoly x) := by - have hhom : massWeightPoly.comp covExtHom = - (Polynomial.mapAlgHom covExtHom).comp LeptonSinglet.JetAlgebra.massWeightPoly := by - refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) - simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, - AlgHom.toLinearMap_apply, covExtHom_ι] - have hlin : massWeightPoly.toLinearMap ∘ₗ covMap = - (Polynomial.mapAlgHom covExtHom).toLinearMap ∘ₗ - (LeptonSinglet.JetAlgebra.massWeightPoly.toLinearMap ∘ₗ ExteriorAlgebra.ι ℂ) := by - refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ - simp only [LinearMap.comp_apply, AlgHom.toLinearMap_apply, covMap_basis] - cases g with - | dψ s α => - rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl] - rw [show ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) = - LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) from rfl, - LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, - Polynomial.mapAlgHom_monomial] - rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α)) = - Dψ (sortList s) α from by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ s α) = - ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ s α)) from rfl, - covExtHom_ι, covMap_basis] - rfl] - have h := Dψ_mem_massWeightSubmodule (sortList s) α - rw [mem_massWeightSubmodule] at h - simpa [LeptonSinglet.JetGenerators.massWeight, length_sortList] using h - | dbarψ s α => - rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl] - rw [show ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) = - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) from rfl, - LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, - Polynomial.mapAlgHom_monomial] - rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α)) = - Dbarψ (sortList s) α from by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ s α) = - ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ s α)) from rfl, - covExtHom_ι, covMap_basis] - rfl] - have h := Dbarψ_mem_massWeightSubmodule (sortList s) α - rw [mem_massWeightSubmodule] at h - simpa [LeptonSinglet.JetGenerators.massWeight, length_sortList] using h - exact LinearMap.congr_fun hlin m - exact AlgHom.congr_fun hhom x - -/-! - -## C. Lorentz compatibility at derivative orders zero and one - --/ - -/-- Covariantization is compatible with Lorentz transformations on a zeroth-order lepton -generator. -/ -lemma repLorentzGroup_covExtHom_ofGenerator_ψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ - (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α))) = - covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α))) := by - rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α)) = Dψ [] α from by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} α) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ {} α)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList]] - rw [repLorentzGroup_Dψ_nil, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul] - congr 1 - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {} β) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ {} β)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList] - -/-- Covariantization is compatible with Lorentz transformations on a first-order lepton -generator. -/ -lemma repLorentzGroup_covExtHom_ofGenerator_ψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - repLorentzGroup Λ - (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α))) = - covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α))) := by - rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α)) = Dψ [μ] α from by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} α) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ {μ} α)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList]] - rw [repLorentzGroup_Dψ_singleton, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul] - congr 1 - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {ν} β) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ {ν} β)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList] - -/-- Covariantization is compatible with Lorentz transformations on a zeroth-order conjugate -lepton generator. -/ -lemma repLorentzGroup_covExtHom_ofGenerator_barψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ - (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α))) = - covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α))) := by - rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α)) = - Dbarψ [] α from by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList]] - rw [repLorentzGroup_Dbarψ_nil, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul] - congr 1 - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} β) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} β)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList] - -/-- Covariantization is compatible with Lorentz transformations on a first-order conjugate -lepton generator. -/ -lemma repLorentzGroup_covExtHom_ofGenerator_barψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - repLorentzGroup Λ - (covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α))) = - covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α))) := by - rw [show covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α)) = - Dbarψ [μ] α from by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {μ} α) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ {μ} α)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList]] - rw [repLorentzGroup_Dbarψ_singleton, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul] - congr 1 - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {ν} β) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ {ν} β)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList] - -end JetAlgebra - -end LeptonGaugeSector - -namespace StandardModel - -namespace LeptonSinglet - -namespace JetAlgebra - -open Matrix MatrixGroups - -/-! - -## D. The fermion kinetic term - --/ - -/-- The ordinary-jet charged-lepton kinetic expression. Covariantization sends this expression to -`LeptonGaugeSector.JetAlgebra.fermionKineticTerm`. -/ -noncomputable def fermionKineticTerm : LeptonSinglet.JetAlgebra := - Complex.I • ∑ μ, ∑ α, ∑ β, LeptonGaugeSector.JetAlgebra.kineticPauli μ α β • - (ofGenerator (.dbarψ {} α) * ofGenerator (.dψ {μ} β)) - -/-- The hypercharge factors of an ordinary conjugate-lepton/lepton generator pair cancel. -/ -lemma repGaugeGroupI_barψ_mul_ψ - (g : GaugeGroupI) (s t : Multiset (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - repGaugeGroupI g (ofGenerator (.dbarψ s α) * ofGenerator (.dψ t β)) = - ofGenerator (.dbarψ s α) * ofGenerator (.dψ t β) := by - have hz : star ((g.toU1 : unitary ℂ) : ℂ) * ((g.toU1 : unitary ℂ) : ℂ) = 1 := - (Unitary.mem_iff.mp g.toU1.2).1 - rw [repGaugeGroupI_apply_mul, repGaugeGroupI_ofGenerator_barψ, - repGaugeGroupI_ofGenerator_ψ, smul_mul_smul_comm, ← mul_pow, hz, one_pow, one_smul] - -/-- Constant-gauge invariance of the ordinary-jet charged-lepton kinetic expression. -/ -lemma repGaugeGroupI_fermionKineticTerm - (g : GaugeGroupI) : - repGaugeGroupI g fermionKineticTerm = fermionKineticTerm := by - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, repGaugeGroupI_barψ_mul_ψ] - -/-- Lorentz invariance of the ordinary-jet charged-lepton kinetic expression. -/ -lemma repLorentzGroup_fermionKineticTerm - (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by - have hsmF : ∀ (f : Fin 2 → LeptonSinglet.JetAlgebra) (y : LeptonSinglet.JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → LeptonSinglet.JetAlgebra) - (y : LeptonSinglet.JetAlgebra), y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsF : ∀ (f : Fin 2 → LeptonSinglet.JetAlgebra) (y : LeptonSinglet.JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : LeptonSinglet.JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, α]; rw [map_sum] - conv_lhs => - enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_ofGenerator_barψ_nil, - repLorentzGroup_ofGenerator_ψ_singleton] - simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] - -- Move the transformed indices outside the original contraction sums. - conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] - conv_rhs => rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => - Finset.sum_congr rfl fun β' _ => ?_ - conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] - conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] - rw [← Finset.sum_smul] - -- The remaining scalar coefficient is the existing Pauli-matrix contraction identity. - rw [show (∑ μ, ∑ α, ∑ β, LeptonGaugeSector.JetAlgebra.kineticPauli μ α β * - ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β')))) = - LeptonGaugeSector.JetAlgebra.kineticPauli ν α' β' from - LeptonGaugeSector.JetAlgebra.sum_kineticPauli_contraction Λ ν α' β'] - -end JetAlgebra - -end LeptonSinglet - -end StandardModel - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open Matrix MatrixGroups - -/-- Covariantization maps the ordinary-jet kinetic expression to the existing covariant kinetic -term in the mixed algebra. -/ -lemma covExtHom_fermionKineticTerm : - covExtHom LeptonSinglet.JetAlgebra.fermionKineticTerm = fermionKineticTerm := by - rw [LeptonSinglet.JetAlgebra.fermionKineticTerm, fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, map_mul] - have hbar : covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α)) = - Dbarψ [] α := by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ {} α) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dbarψ {} α)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList] - have hψ : covExtHom (LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} β)) = Dψ [μ] β := by - rw [show LeptonSinglet.JetAlgebra.ofGenerator (.dψ {μ} β) = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis (.dψ {μ} β)) from rfl, - covExtHom_ι, covMap_basis] - simp [covGenerator, sortList] - rw [hbar, hψ] - -/-- Lorentz compatibility of covariantization on the ordinary-jet kinetic expression, obtained -from the order-zero and order-one generator compatibility lemmas. -/ -lemma repLorentzGroup_covExtHom_fermionKineticTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ (covExtHom LeptonSinglet.JetAlgebra.fermionKineticTerm) = - covExtHom (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - LeptonSinglet.JetAlgebra.fermionKineticTerm) := by - rw [LeptonSinglet.JetAlgebra.fermionKineticTerm] - simp only [map_smul] - congr 1 - conv_lhs => rw [map_sum, map_sum] - conv_rhs => rw [map_sum, map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - conv_lhs => rw [map_sum, map_sum] - conv_rhs => rw [map_sum, map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - conv_lhs => rw [map_sum, map_sum] - conv_rhs => rw [map_sum, map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - simp only [map_smul] - congr 1 - rw [map_mul, repLorentzGroup_apply_mul, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_mul, map_mul, - repLorentzGroup_covExtHom_ofGenerator_barψ_nil, - repLorentzGroup_covExtHom_ofGenerator_ψ_singleton] - -/-- A modular gauge-invariance proof of the existing covariant kinetic term through -`covExtHom`. The existing direct proof remains available. -/ -lemma repJetGaugeGroupI_fermionKineticTerm_via_covExtHom (U : JetGaugeGroupI) : - repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by - rw [← covExtHom_fermionKineticTerm, repJetGaugeGroupI_covExtHom, - LeptonSinglet.JetAlgebra.repGaugeGroupI_fermionKineticTerm] - -/-- A modular Lorentz-invariance proof of the existing covariant kinetic term through -`covExtHom`. The existing direct proof remains available. -/ -lemma repLorentzGroup_fermionKineticTerm_via_covExtHom (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by - rw [← covExtHom_fermionKineticTerm, repLorentzGroup_covExtHom_fermionKineticTerm, - LeptonSinglet.JetAlgebra.repLorentzGroup_fermionKineticTerm] - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean deleted file mode 100644 index 43cc6e286..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/DerivativeOrder.lean +++ /dev/null @@ -1,697 +0,0 @@ -/- -Copyright (c) 2026 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.Mathematics.TensorProduct -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeAction -/-! -# The derivative-order filtration - -The filtration of the lepton–gauge-sector jet algebra by the number of derivatives, the leading -behaviour of the covariant generators with respect to it, and the theorem that a -gauge-invariant element lies in the algebra generated by the invariant -generators, which the filtration is built to prove. --/ - -@[expose] public section - - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -### The derivative-degree filtration - -The filtration of the lepton–gauge-sector jet algebra by the total derivative degree of the -fermionic factors: the span of B-coefficiented products of fermionic generators -of bounded total degree. The covariant substitution is unitriangular for this -filtration. - --/ - -/-- The generating set of the degree filtration. -/ -def filtGen (d : ℕ) : Set JetAlgebra := - {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), - (l.map genDeg).sum ≤ d ∧ - z = c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} - -/-- The generating set of the strict degree filtration. -/ -def sfiltGen (d : ℕ) : Set JetAlgebra := - {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : List LeptonSinglet.JetGenerators), - (l.map genDeg).sum < d ∧ - z = c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod} - -/-- The filtration of the lepton–gauge-sector jet algebra by total fermionic derivative degree. -/ -noncomputable def filt (d : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ (filtGen d) - -/-- The strict filtration. -/ -noncomputable def sfilt (d : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ (sfiltGen d) - -lemma filt_mono {d d' : ℕ} (h : d ≤ d') : filt d ≤ filt d' := - Submodule.span_mono fun z hz => by - obtain ⟨c, l, hl, hze⟩ := hz - exact ⟨c, l, hl.trans h, hze⟩ - -lemma sfilt_mono {d d' : ℕ} (h : d ≤ d') : sfilt d ≤ sfilt d' := - Submodule.span_mono fun z hz => by - obtain ⟨c, l, hl, hze⟩ := hz - exact ⟨c, l, hl.trans_le h, hze⟩ - -lemma sfilt_le_filt (d : ℕ) : sfilt d ≤ filt d := - Submodule.span_mono fun z hz => by - obtain ⟨c, l, hl, hze⟩ := hz - exact ⟨c, l, hl.le, hze⟩ - -lemma sfilt_zero : sfilt 0 = ⊥ := by - rw [sfilt, show sfiltGen 0 = ∅ from Set.eq_empty_iff_forall_notMem.mpr (by - rintro z ⟨c, l, hl, hze⟩ - omega), Submodule.span_empty] - -lemma sfilt_succ (d : ℕ) : sfilt (d + 1) = filt d := by - rw [sfilt, filt, show sfiltGen (d + 1) = filtGen d from Set.ext fun z => - ⟨fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mp hl, hze⟩, - fun ⟨c, l, hl, hze⟩ => ⟨c, l, Nat.lt_succ_iff.mpr hl, hze⟩⟩] - -lemma mul_mem_filt {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) - (hy : y ∈ filt b) : x * y ∈ filt (a + b) := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u - have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u - have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := - fun r u v => smul_mul_assoc r u v - have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := - fun r u v => mul_smul_comm r u v - induction hx using Submodule.span_induction with - | mem x' hx' => - induction hy using Submodule.span_induction with - | mem y' hy' => - obtain ⟨c, l, hl, rfl⟩ := hx' - obtain ⟨c', l', hl', rfl⟩ := hy' - refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ - · rw [List.map_append, List.sum_append] - omega - · rw [tmul_mul_tmul, List.map_append, List.prod_append] - | zero => rw [hz₂]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih - | zero => rw [hz₁]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih - -lemma mul_mem_sfilt_left {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ sfilt a) - (hy : y ∈ filt b) : x * y ∈ sfilt (a + b) := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u - have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u - have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := - fun r u v => smul_mul_assoc r u v - have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := - fun r u v => mul_smul_comm r u v - induction hx using Submodule.span_induction with - | mem x' hx' => - induction hy using Submodule.span_induction with - | mem y' hy' => - obtain ⟨c, l, hl, rfl⟩ := hx' - obtain ⟨c', l', hl', rfl⟩ := hy' - refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ - · rw [List.map_append, List.sum_append] - omega - · rw [tmul_mul_tmul, List.map_append, List.prod_append] - | zero => rw [hz₂]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih - | zero => rw [hz₁]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih - -lemma mul_mem_sfilt_right {a b : ℕ} {x y : JetAlgebra} (hx : x ∈ filt a) - (hy : y ∈ sfilt b) : x * y ∈ sfilt (a + b) := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := by grind - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := by grind - have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u - have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u - have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := - fun r u v => smul_mul_assoc r u v - have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := - fun r u v => mul_smul_comm r u v - induction hx using Submodule.span_induction with - | mem x' hx' => - induction hy using Submodule.span_induction with - | mem y' hy' => - obtain ⟨c, l, hl, rfl⟩ := hx' - obtain ⟨c', l', hl', rfl⟩ := hy' - refine Submodule.subset_span ⟨c * c', l ++ l', ?_, ?_⟩ - · rw [List.map_append, List.sum_append] - omega - · rw [tmul_mul_tmul, List.map_append, List.prod_append] - | zero => rw [hz₂]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₂]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih - | zero => rw [hz₁]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [hd₁]; exact add_mem ihu ihv - | smul r u hu ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih - -lemma exists_forall_tmul_mem_filt (l : LeptonSinglet.JetAlgebra) : - ∃ d, ∀ c : ℂ ⊗[ℝ] BBoson.JetAlgebra, c ⊗ⱼ l ∈ filt d := by - induction l using ExteriorAlgebra.induction with - | algebraMap r => - refine ⟨0, fun c => ?_⟩ - rw [Algebra.algebraMap_eq_smul_one, tmul_smul] - refine Submodule.smul_mem _ _ (Submodule.subset_span ⟨c, [], by simp, ?_⟩) - simp - | ι m => - refine ⟨(LeptonSinglet.JetComponentSpace.basis.repr m).support.sup genDeg, - fun c => ?_⟩ - have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = - (LeptonSinglet.JetComponentSpace.basis.repr m).sum - (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by - conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] - rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] - refine Finset.sum_congr rfl fun g _ => ?_ - rw [map_smul] - rfl - rw [hm, Finsupp.sum, tmul_sum] - refine Submodule.sum_mem _ fun g hg => ?_ - rw [tmul_smul] - refine Submodule.smul_mem _ _ (filt_mono (Finset.le_sup hg) - (Submodule.subset_span ⟨c, [g], by simp, ?_⟩)) - simp - | mul x y hx hy => - obtain ⟨dx, hdx⟩ := hx - obtain ⟨dy, hdy⟩ := hy - refine ⟨dx + dy, fun c => ?_⟩ - rw [show c ⊗ⱼ (x * y) = (c ⊗ⱼ x) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ y) from by - rw [tmul_mul_tmul, mul_one]] - exact mul_mem_filt (hdx c) (hdy 1) - | add x y hx hy => - obtain ⟨dx, hdx⟩ := hx - obtain ⟨dy, hdy⟩ := hy - refine ⟨max dx dy, fun c => ?_⟩ - rw [tmul_add] - exact add_mem (filt_mono (le_max_left _ _) (hdx c)) - (filt_mono (le_max_right _ _) (hdy c)) - -/-- Every element of the lepton–gauge-sector jet algebra has bounded fermionic derivative - degree. -/ -lemma exists_mem_filt (x : JetAlgebra) : ∃ d, x ∈ filt d := by - induction x using JetAlgebra.induction_on with - | zero => exact ⟨0, zero_mem _⟩ - | add a b ha hb => - obtain ⟨d1, h1⟩ := ha - obtain ⟨d2, h2⟩ := hb - exact ⟨max d1 d2, add_mem (filt_mono (le_max_left _ _) h1) - (filt_mono (le_max_right _ _) h2)⟩ - | tmul c l => - obtain ⟨d, hd⟩ := exists_forall_tmul_mem_filt l - exact ⟨d, hd c⟩ - -/-- Strictly-lower-degree odd elements: B-coefficiented single fermionic - generators of derivative degree less than `d`. -/ -noncomputable def oddLow (d : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ - {z | ∃ (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) (g : LeptonSinglet.JetGenerators), - genDeg g < d ∧ z = c ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator g} - -lemma oddLow_le_sfilt (d : ℕ) : oddLow d ≤ sfilt d := by - refine Submodule.span_le.mpr ?_ - rintro z ⟨c, g, hg, rfl⟩ - refine Submodule.subset_span ⟨c, [g], by simpa using hg, ?_⟩ - simp - -lemma genDeg_shift (μ : Fin 1 ⊕ Fin 3) (g : LeptonSinglet.JetGenerators) : - genDeg (LeptonSinglet.JetGenerators.shift μ g) = genDeg g + 1 := by - cases g <;> simp [genDeg, LeptonSinglet.JetGenerators.shift] - -/-- Multiplication by the gauge field acts on the B-boson coefficient of an odd - element. -/ -lemma dB_mul_tmul (μ : Fin 1 ⊕ Fin 3) (c : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (y : LeptonSinglet.JetAlgebra) : - ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * (c ⊗ⱼ y) = - (((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) * c) - ⊗ⱼ y := by - have hone : ∀ z : LeptonSinglet.JetAlgebra, 1 * z = z := fun z => one_mul z - rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra) from rfl, - tmul_mul_tmul, hone] - -lemma covariantStep_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} - (hx : x ∈ oddLow d) : covariantStep μ x ∈ oddLow (d + 1) := by - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨c, g, hg, rfl⟩ := hz - rw [covariantStep_apply, jetDeriv_tmul, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] - refine sub_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) - · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ - · rw [dB_mul_tmul] - exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - | zero => rw [map_zero]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv - | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih - -lemma covariantStepBar_mem_oddLow (μ : Fin 1 ⊕ Fin 3) {d : ℕ} {x : JetAlgebra} - (hx : x ∈ oddLow d) : covariantStepBar μ x ∈ oddLow (d + 1) := by - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨c, g, hg, rfl⟩ := hz - rw [covariantStepBar_apply, jetDeriv_tmul, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator] - refine add_mem (add_mem ?_ ?_) (Submodule.smul_mem _ _ ?_) - · exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - · exact Submodule.subset_span ⟨c, _, by rw [genDeg_shift]; omega, rfl⟩ - · rw [dB_mul_tmul] - exact Submodule.subset_span ⟨_, g, by omega, rfl⟩ - | zero => rw [map_zero]; exact zero_mem _ - | add u v hu hv ihu ihv => rw [map_add]; exact add_mem ihu ihv - | smul r u hu ih => rw [map_smul]; exact Submodule.smul_mem _ _ ih - -/-- The covariant derivative of the lepton is its plain derivative generator up - to strictly-lower-degree odd terms. -/ -lemma Dψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑l) α) ∈ oddLow l.length := by - induction l with - | nil => - rw [Dψ_nil, show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator - (.dψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by - rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] - rfl, sub_self] - exact zero_mem _ - | cons μ t ih => - set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑t) α) with hL - have hstep : Dψ (μ :: t) α = covariantStep μ L + covariantStep μ (Dψ t α - L) := by - have h := (covariantStep μ).map_add L (Dψ t α - L) - rw [add_sub_cancel] at h - rw [Dψ_cons, h] - have hleadEq : covariantStep μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (.dψ (↑(μ :: t)) α) - - ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by - rw [covariantStep_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, - LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, - TensorProduct.tmul_zero, zero_tmul, zero_add, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dψ, - show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by - rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] - have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by - rw [hL, dB_mul_tmul] - refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ - simp [genDeg, Multiset.coe_card] - have hmem2 : covariantStep μ (Dψ t α - L) ∈ oddLow (t.length + 1) := - covariantStep_mem_oddLow μ ih - have habel : ∀ A X Y : JetAlgebra, A - X + Y - A = Y - X := fun A X Y => by abel - rw [hstep, hleadEq, habel] - exact sub_mem hmem2 (Submodule.smul_mem _ _ hmem1) - -/-- The covariant derivative of the conjugate lepton is its plain derivative - generator up to strictly-lower-degree odd terms. -/ -lemma Dbarψ_sub_mem_oddLow (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑l) α) ∈ oddLow l.length := by - induction l with - | nil => - rw [Dbarψ_nil, show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ LeptonSinglet.JetAlgebra.ofGenerator - (.dbarψ (↑([] : List (Fin 1 ⊕ Fin 3))) α) from by - rw [Algebra.TensorProduct.one_def, Multiset.coe_nil, Multiset.empty_eq_zero] - rfl, sub_self] - exact zero_mem _ - | cons μ t ih => - set L : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑t) α) with hL - have hstep : Dbarψ (μ :: t) α = - covariantStepBar μ L + covariantStepBar μ (Dbarψ t α - L) := by - have h := (covariantStepBar μ).map_add L (Dbarψ t α - L) - rw [add_sub_cancel] at h - rw [Dbarψ_cons, h] - have hleadEq : covariantStepBar μ L = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (.dbarψ (↑(μ :: t)) α) + - ((6 : ℂ) * Complex.I) • (([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L) := by - rw [covariantStepBar_apply, hL, Algebra.TensorProduct.one_def, jetDeriv_tmul, - LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, - TensorProduct.tmul_zero, zero_tmul, zero_add, - LeptonSinglet.JetAlgebra.jetDeriv_ofGenerator, - LeptonSinglet.JetGenerators.shift_dbarψ, - show (↑t : Multiset (Fin 1 ⊕ Fin 3)) + {μ} = ↑(μ :: t) from by - rw [add_comm, Multiset.singleton_add, Multiset.cons_coe]] - have hmem1 : ([JetGenerators.dB {} μ]ₐ : JetAlgebra) * L ∈ oddLow (t.length + 1) := by - rw [hL, dB_mul_tmul] - refine Submodule.subset_span ⟨_, _, ?_, rfl⟩ - simp [genDeg, Multiset.coe_card] - have hmem2 : covariantStepBar μ (Dbarψ t α - L) ∈ oddLow (t.length + 1) := - covariantStepBar_mem_oddLow μ ih - have habel : ∀ A X Y : JetAlgebra, A + X + Y - A = X + Y := fun A X Y => by abel - rw [hstep, hleadEq, habel] - exact add_mem (Submodule.smul_mem _ _ hmem1) hmem2 - -/-- The covariant generator is the plain generator up to strictly-lower-degree - odd terms. -/ -lemma covGenerator_sub_mem_oddLow (g : LeptonSinglet.JetGenerators) : - covGenerator g - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator g ∈ oddLow (genDeg g) := by - cases g with - | dψ s α => - have h := Dψ_sub_mem_oddLow (sortList s) α - rw [coe_sortList, length_sortList] at h - exact h - | dbarψ s α => - have h := Dbarψ_sub_mem_oddLow (sortList s) α - rw [coe_sortList, length_sortList] at h - exact h - -lemma covGenerator_mem_filt (g : LeptonSinglet.JetGenerators) : - covGenerator g ∈ filt (genDeg g) := by - have h := sfilt_le_filt _ (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) - have hA : (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator g ∈ filt (genDeg g) := by - refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ - simp - have h2 := add_mem hA h - rwa [add_sub_cancel] at h2 - -lemma prod_covGenerator_mem_filt (l : List LeptonSinglet.JetGenerators) : - (l.map covGenerator).prod ∈ filt ((l.map genDeg).sum) := by - induction l with - | nil => - simp only [List.map_nil, List.prod_nil, List.sum_nil] - refine Submodule.subset_span ⟨1, [], by simp, ?_⟩ - rw [List.map_nil, List.prod_nil, one_eq_tmul] - | cons g t ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - exact mul_mem_filt (covGenerator_mem_filt g) ih - -/-- The product of covariant generators is the corresponding product of plain - generators up to strictly-lower-degree terms. -/ -lemma prod_covGenerator_sub_mem_sfilt (l : List LeptonSinglet.JetGenerators) : - (l.map covGenerator).prod - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod ∈ - sfilt ((l.map genDeg).sum) := by - induction l with - | nil => - simp only [List.map_nil, List.prod_nil, List.sum_nil] - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) : - JetAlgebra) = 1 from (one_eq_tmul).symm, sub_self] - exact zero_mem _ - | cons g t ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - have hsub₁ : ∀ a b c : JetAlgebra, (a - b) * c = a * c - b * c := by grind - have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - set A : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator g with hA - set Q : JetAlgebra := (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod with hQ - have hAQ : A * Q = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - (LeptonSinglet.JetAlgebra.ofGenerator g * - (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by - rw [hA, hQ, tmul_mul_tmul, mul_one] - have hkey : covGenerator g * (t.map covGenerator).prod - - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - (LeptonSinglet.JetAlgebra.ofGenerator g * - (t.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = - (covGenerator g - A) * (t.map covGenerator).prod + - A * ((t.map covGenerator).prod - Q) := by - rw [hsub₁, hsub₂, hAQ] - abel - rw [hkey] - refine add_mem ?_ ?_ - · exact mul_mem_sfilt_left (oddLow_le_sfilt _ (covGenerator_sub_mem_oddLow g)) - (prod_covGenerator_mem_filt t) - · have hAmem : A ∈ filt (genDeg g) := by - rw [hA] - refine Submodule.subset_span ⟨1, [g], by simp, ?_⟩ - simp - exact mul_mem_sfilt_right hAmem ih - -/-- Unitriangularity of the covariant substitution: it is the identity up to - strictly-lower-degree terms. -/ -lemma covSubst_sub_self_mem_sfilt {d : ℕ} {x : JetAlgebra} (hx : x ∈ filt d) : - covSubst x - x ∈ sfilt d := by - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨c, l, hl, rfl⟩ := hz - have hone : ∀ y : LeptonSinglet.JetAlgebra, 1 * y = y := fun y => one_mul y - have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p - have hgen : ∀ g : LeptonSinglet.JetGenerators, - covExtHom (LeptonSinglet.JetAlgebra.ofGenerator g) = covGenerator g := by - intro g - rw [show LeptonSinglet.JetAlgebra.ofGenerator g = ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis g) from rfl, covExtHom_ι, covMap_basis] - have hlp : ∀ L : List LeptonSinglet.JetAlgebra, - covExtHom L.prod = (L.map covExtHom).prod := by - intro L - induction L with - | nil => exact covExtHom.map_one - | cons a t iht => - have hm : covExtHom (a * t.prod) = covExtHom a * covExtHom t.prod := - map_mul covExtHom a t.prod - rw [List.prod_cons, List.map_cons, List.prod_cons, hm, iht] - have hcs : covSubst (c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) = - (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * (l.map covGenerator).prod := by - rw [covSubst_tmul] - congr 1 - rw [hlp, List.map_map, - show (⇑covExtHom ∘ LeptonSinglet.JetAlgebra.ofGenerator) = covGenerator from - funext fun g => hgen g] - have hz2 : c ⊗ⱼ (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod = - (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - (l.map LeptonSinglet.JetAlgebra.ofGenerator).prod) := by - rw [tmul_mul_tmul, honeB, hone] - have hsub₂ : ∀ a b c : JetAlgebra, a * (b - c) = a * b - a * c := by grind - have hc1 : (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) ∈ filt 0 := by - refine Submodule.subset_span ⟨c, [], by simp, ?_⟩ - simp - have hfin := mul_mem_sfilt_right hc1 (prod_covGenerator_sub_mem_sfilt l) - rw [zero_add] at hfin - rw [hcs, hz2, ← hsub₂] - exact sfilt_mono hl hfin - | zero => - rw [map_zero, sub_zero] - exact zero_mem _ - | add u v hu hv ihu ihv => - rw [map_add, show covSubst u + covSubst v - (u + v) = - (covSubst u - u) + (covSubst v - v) from by abel] - exact add_mem ihu ihv - | smul r u hu ih => - rw [map_smul, show r • covSubst u - r • u = r • (covSubst u - u) from - (smul_sub r _ _).symm] - exact Submodule.smul_mem _ _ ih - -lemma eq_zero_of_covSubst_eq_zero {d : ℕ} : - ∀ {x : JetAlgebra}, x ∈ filt d → covSubst x = 0 → x = 0 := by - induction d with - | zero => - intro x hx h0 - have h := covSubst_sub_self_mem_sfilt hx - rw [h0, zero_sub, sfilt_zero, Submodule.mem_bot, neg_eq_zero] at h - exact h - | succ d ih => - intro x hx h0 - have h := covSubst_sub_self_mem_sfilt hx - rw [h0, zero_sub, sfilt_succ] at h - exact ih (neg_mem_iff.mp h) h0 - -/-- The covariant substitution is injective. -/ -lemma covSubst_injective : Function.Injective covSubst := by - intro x y hxy - obtain ⟨d, hd⟩ := exists_mem_filt (x - y) - have h0 : covSubst (x - y) = 0 := by rw [map_sub, hxy, sub_self] - exact sub_eq_zero.mp (eq_zero_of_covSubst_eq_zero hd h0) - -lemma exists_covSubst_eq {d : ℕ} : - ∀ {x : JetAlgebra}, x ∈ filt d → ∃ y, covSubst y = x := by - induction d with - | zero => - intro x hx - have h := covSubst_sub_self_mem_sfilt hx - rw [sfilt_zero, Submodule.mem_bot, sub_eq_zero] at h - exact ⟨x, h⟩ - | succ d ih => - intro x hx - have h := covSubst_sub_self_mem_sfilt hx - rw [sfilt_succ] at h - obtain ⟨y, hy⟩ := ih h - exact ⟨x - y, by rw [map_sub, hy, sub_sub_cancel]⟩ - -/-- The covariant substitution is surjective. -/ -lemma covSubst_surjective : Function.Surjective covSubst := by - intro x - obtain ⟨d, hd⟩ := exists_mem_filt x - exact exists_covSubst_eq hd - -/-- Every gauge invariant of the lepton–gauge-sector jet algebra lies in the algebra generated by - the field-strength derivatives and the covariant derivatives of the lepton and - its conjugate. - - After applying the covariant substitution, every `expUnitary` transformation with value `1` at - the base point acts only on the complexified B-boson factor. The generic tensor fixed-submodule - result extends the B-boson translation result across the lepton exterior-algebra factor. -/ -lemma mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq - (x : JetAlgebra) (hx : ∀ U, repJetGaugeGroupI U x = x) : - x ∈ CovariantAlgebra := by - classical - obtain ⟨y, rfl⟩ := covSubst_surjective x - -- The tensor inclusion and the B-boson field-strength generators, elaborated once: spelling - -- either of them out at each use is what puts this proof over the default heartbeat budget. - obtain ⟨mkT, hmkT⟩ : ∃ m, m = TensorProduct.mk ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) - LeptonSinglet.JetAlgebra := ⟨_, rfl⟩ - obtain ⟨Fs, hFs⟩ : ∃ s : Set (ℂ ⊗[ℝ] BBoson.JetAlgebra), s = - Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2 := ⟨_, rfl⟩ - have hyU : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), - TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI - (BBoson.JetAlgebra.expUnitary a w hw)) LinearMap.id y = y := by - intro a w hw - refine covSubst_injective ?_ - show covSubst (mapB (BBoson.JetAlgebra.complexRepJetGaugeGroupI - (BBoson.JetAlgebra.expUnitary a w hw)) y) = covSubst y - rw [← repJetGaugeGroupI_covSubst _ (BBoson.JetAlgebra.eval_expUnitary_u1 a w hw), - hx] - let Translation := {p : ℝ × ((Fin 1 ⊕ Fin 3) →₀ ℕ) // p.2 ≠ 0} - let F : Translation → Module.End ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) := fun p => - BBoson.JetAlgebra.complexRepJetGaugeGroupI - (BBoson.JetAlgebra.expUnitary p.1.1 p.1.2 p.2) - -- proved in the `rTensor` form the rewrite leaves behind, so that form is elaborated once - have hyTensor : (show (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] LeptonSinglet.JetAlgebra from y) ∈ - Submodule.map₂ mkT (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ⊤ := by - rw [hmkT, ← LinearMap.iInf_eqLocus_rTensor F] - refine (Submodule.mem_iInf _).2 fun p => LinearMap.mem_eqLocus.mpr ?_ - simpa only [LinearMap.id_apply, LinearMap.rTensor_def, F] using hyU p.1.1 p.1.2 p.2 - have hB : (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ≤ - (Algebra.adjoin ℂ Fs).toSubmodule := by - intro c hc - rw [hFs] - refine BBoson.JetAlgebra.mem_adjoin_of_forall_expUnitary_complex c fun a w hw => ?_ - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hc - exact hc (⟨(a, w), hw⟩ : Translation) - -- `obtain`, not `set`: `set` would rescan every hypothesis above for occurrences of this - -- union, and the defeq checks that provokes are what exhausted the heartbeat budget. - obtain ⟨S, hS⟩ : ∃ S : Set JetAlgebra, S = (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - fieldStrengthDeriv p.1 p.2.1 p.2.2) ∪ - (Set.range fun g : LeptonSinglet.JetGenerators => - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra)) := ⟨_, rfl⟩ - have honeB : ∀ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, p * 1 = p := fun p => mul_one p - have honeL : ∀ l : LeptonSinglet.JetAlgebra, 1 * l = l := fun l => one_mul l - have hone_tmul : ∀ l : LeptonSinglet.JetAlgebra, - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l : JetAlgebra) ∈ Algebra.adjoin ℂ S := by - intro l - induction l using ExteriorAlgebra.induction with - | algebraMap r => - rw [Algebra.algebraMap_eq_smul_one, tmul_smul] - refine Subalgebra.smul_mem _ ?_ _ - rw [← one_eq_tmul] - exact one_mem _ - | ι m => - have hm : ExteriorAlgebra.ι ℂ (M := LeptonSinglet.JetComponentSpace) m = - (LeptonSinglet.JetComponentSpace.basis.repr m).sum - (fun g r => r • LeptonSinglet.JetAlgebra.ofGenerator g) := by - conv_lhs => rw [← LeptonSinglet.JetComponentSpace.basis.linearCombination_repr m] - rw [Finsupp.linearCombination_apply, Finsupp.sum, Finsupp.sum, map_sum] - refine Finset.sum_congr rfl fun g _ => ?_ - rw [map_smul] - rfl - rw [hm, Finsupp.sum, tmul_sum] - refine sum_mem fun g _ => ?_ - rw [tmul_smul] - refine Subalgebra.smul_mem _ (Algebra.subset_adjoin ?_) _ - rw [hS] - exact Set.mem_union_right _ ⟨g, rfl⟩ - | mul u v hu hv => - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ (u * v) : JetAlgebra) = - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ u) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ v) from by - rw [tmul_mul_tmul, honeB]] - exact mul_mem hu hv - | add u v hu hv => - rw [tmul_add] - exact add_mem hu hv - have hleft : ∀ c ∈ Algebra.adjoin ℂ Fs, - ((c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) : JetAlgebra) ∈ Algebra.adjoin ℂ S := by - intro c hc - induction hc using Algebra.adjoin_induction with - | mem z hz => - rw [hFs] at hz - obtain ⟨p, rfl⟩ := hz - refine Algebra.subset_adjoin ?_ - rw [hS] - exact Set.mem_union_left _ ⟨p, rfl⟩ - | algebraMap z => - rw [Algebra.algebraMap_eq_smul_one, smul_tmul'] - refine Subalgebra.smul_mem _ ?_ _ - rw [← one_eq_tmul] - exact one_mem _ - | add u v hu hv ihu ihv => - rw [add_tmul] - exact add_mem ihu ihv - | mul u v hu hv ihu ihv => - rw [show ((u * v) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) : JetAlgebra) = - (u ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * - (v ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) from by - rw [tmul_mul_tmul, honeL]] - exact mul_mem ihu ihv - -- the two inclusions are composed on the spot: naming the intermediate membership would cost - -- another elaboration of the `map₂` type - have hyMem : y ∈ Algebra.adjoin ℂ S := by - apply (show Submodule.map₂ mkT (Algebra.adjoin ℂ Fs).toSubmodule ⊤ ≤ - (Algebra.adjoin ℂ S).toSubmodule from ?_) (Submodule.map₂_le_map₂_left hB hyTensor) - rw [Submodule.map₂_le] - intro c hc l _ - rw [hmkT] - change c ⊗ⱼ l ∈ Algebra.adjoin ℂ S - rw [show (c ⊗ⱼ l : JetAlgebra) = - (c ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * - ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l) from by - rw [tmul_mul_tmul, honeB, honeL]] - exact mul_mem (hleft c hc) (hone_tmul l) - have himg : covSubst y ∈ (Algebra.adjoin ℂ S).map covSubst := - Subalgebra.mem_map.mpr ⟨y, hyMem, rfl⟩ - rw [AlgHom.map_adjoin] at himg - refine Algebra.adjoin_le ?_ himg - rintro z ⟨w, hw, rfl⟩ - rw [hS] at hw - rcases hw with ⟨p, rfl⟩ | ⟨g, rfl⟩ - · show covSubst (fieldStrengthDeriv p.1 p.2.1 p.2.2) ∈ - Algebra.adjoin ℂ invariantGenerators - rw [show (fieldStrengthDeriv p.1 p.2.1 p.2.2 : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv p.1 p.2.1 p.2.2) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra) from rfl, covSubst_tmul_one] - exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from - Set.mem_union_left _ (Set.mem_union_left _ ⟨p, rfl⟩)) - · show covSubst ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator g) ∈ Algebra.adjoin ℂ invariantGenerators - rw [show ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator g : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ ExteriorAlgebra.ι ℂ - (LeptonSinglet.JetComponentSpace.basis g) from rfl, covSubst_one_tmul_ι, - covMap_basis] - cases g with - | dψ s α => - exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from - Set.mem_union_left _ (Set.mem_union_right _ ⟨(sortList s, α), rfl⟩)) - | dbarψ s α => - exact Algebra.subset_adjoin (show _ ∈ invariantGenerators from - Set.mem_union_right _ ⟨(sortList s, α), rfl⟩) - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean deleted file mode 100644 index 61b489dee..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/Closure.lean +++ /dev/null @@ -1,144 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms -/-! -# The conjugate fermion kinetic bilinears span a subrepresentation - -The span of the sixteen bilinears `(D̄_μ ψ̄)_α ψ_β` is carried to itself by both group actions on -the jet algebra. Statements proved for the span — that its boost-weight-zero part is the -conjugate fermion kinetic term, say — may therefore be combined with any operator built from the -group elements, an average or a projector among them, without leaving the span. - -*Both closures are covariance of the covariant derivative.* Under the Lorentz group `ψ_β` mixes -only with the `ψ_δ`, and `D̄_μ ψ̄_α` only with the `D̄_ν ψ̄_γ` — the `+ 6 i B_μ ψ̄_α` tail of the -conjugate covariant derivative transforms along with the derivative, which is the content of -`repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil` — so a bilinear goes to a combination of bilinears. -Under the gauge group each bilinear is not merely carried into the span but fixed: the -hypercharge characters of the lepton and of its conjugate cancel by unitarity -(`repJetGaugeGroupI_Dbarψ_mul_Dψ`), so the span is fixed pointwise. - -## Key results - -- `JetAlgebra.repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil` : the span is closed under the - Lorentz action, and `map_repLorentzGroup_span_Dbarψ_singleton_mul_Dψ_nil` states this as an - equality of submodules. -- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil` : the gauge group - fixes the span pointwise, whence `map_repJetGaugeGroupI_span_Dbarψ_singleton_mul_Dψ_nil`. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## A. The generators - --/ - -/-- A conjugate fermion kinetic bilinear lies in their span. -/ -lemma Dbarψ_singleton_mul_Dψ_nil_mem_span (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : - Dbarψ [μ] α * Dψ [] β ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := - Submodule.subset_span ⟨α, μ, β, rfl⟩ - -/-- The Lorentz action carries a conjugate fermion kinetic bilinear into the span of the - bilinears: the spinor indices are rotated among themselves and the derivative index along with - them. -/ -lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil_mem_span (Λ : SL(2,ℂ)) (α : Fin 2) - (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : - repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by - rw [repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil] - exact Submodule.sum_mem _ fun ν _ => Submodule.sum_mem _ fun γ _ => - Submodule.sum_mem _ fun δ _ => - Submodule.smul_mem _ _ (Dbarψ_singleton_mul_Dψ_nil_mem_span γ ν δ) - -/-! - -## B. Closure under the Lorentz group - --/ - -/-- **The span of the conjugate fermion kinetic bilinears is closed under the Lorentz action.** -/ -lemma repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : - repLorentzGroup Λ x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨α, μ, β, rfl⟩ := hy - exact repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil_mem_span Λ α μ β - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- **The span of the conjugate fermion kinetic bilinears is a subrepresentation of the Lorentz - group.** Closure under every element and its inverse upgrades - `repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil` to an equality. -/ -lemma map_repLorentzGroup_span_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) : - Submodule.map (repLorentzGroup Λ) - (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) = - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil Λ hu - · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_Dbarψ_singleton_mul_Dψ_nil Λ⁻¹ hx, - repLorentzGroup.self_inv_apply Λ x⟩ - -/-! - -## C. Closure under the gauge group - --/ - -/-- **The gauge group fixes the span of the conjugate fermion kinetic bilinears pointwise.** Each - bilinear pairs the lepton with its conjugate, and their hypercharge characters cancel. -/ -lemma repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil (U : JetGaugeGroupI) - {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : - repJetGaugeGroupI U x = x := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨α, μ, β, rfl⟩ := hy - exact repJetGaugeGroupI_Dbarψ_mul_Dψ U [μ] [] α β - | zero => rw [map_zero] - | add u v _ _ hu hv => rw [map_add, hu, hv] - | smul c u _ hu => rw [map_smul, hu] - -/-- **The span of the conjugate fermion kinetic bilinears is closed under the gauge action.** -/ -lemma repJetGaugeGroupI_mem_span_Dbarψ_singleton_mul_Dψ_nil (U : JetGaugeGroupI) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) : - repJetGaugeGroupI U x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by - rw [repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil U hx] - exact hx - -/-- **The span of the conjugate fermion kinetic bilinears is a subrepresentation of the gauge - group.** -/ -lemma map_repJetGaugeGroupI_span_Dbarψ_singleton_mul_Dψ_nil (U : JetGaugeGroupI) : - Submodule.map (repJetGaugeGroupI U) - (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) = - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repJetGaugeGroupI_mem_span_Dbarψ_singleton_mul_Dψ_nil U hu - · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_Dbarψ_singleton_mul_Dψ_nil U hx⟩ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean deleted file mode 100644 index 3e67338bd..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicBarKineticTerm/LinearIndependence.lean +++ /dev/null @@ -1,89 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FermionicKineticTerm.LinearIndependence -/-! -# Linear independence of the conjugate fermion bilinears - -The sixteen products `(D̄_μ ψ̄)_α ψ_β` — the derivative on the conjugate lepton rather than on -the lepton — are linearly independent. Statements about an explicit span of such products, the -boost-weight-zero part of the conjugate fermion kinetic sector say, then reduce to linear algebra -on coefficients. - -The dual family is the one of `FermionicKineticTerm.LinearIndependence`, evaluated at the other -pair of dual basis vectors: `fermionPairDual` pairs a functional on the conjugate lepton with one -on the lepton, and here the derivative index is carried by the first rather than the second. -The `+ 6 i B_μ ψ̄_α` tail of `D̄_μ ψ̄_α` again contributes nothing, because its conjugate-lepton -factor carries no derivative index. - -## Key results - -- `fermionBarDual` : the functional dual to a chosen conjugate fermion bilinear. -- `Dbarψ_singleton_mul_Dψ_nil_linearIndependent` : the sixteen bilinears are independent. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-- The functional dual to the conjugate fermion bilinear `(D̄_μ ψ̄)_α ψ_β`. -/ -noncomputable def fermionBarDual (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : - JetAlgebra →ₗ[ℂ] ℂ := - fermionPairDual - (LeptonSinglet.JetComponentSpace.basis.coord - (LeptonSinglet.JetGenerators.dbarψ {q.2.1} q.1)) - (LeptonSinglet.JetComponentSpace.basis.coord - (LeptonSinglet.JetGenerators.dψ {} q.2.2)) - -/-- `fermionBarDual` is dual to the sixteen conjugate fermion bilinears. The `+ 6 i B_μ ψ̄_α` - tail of `D̄_μ ψ̄_α` drops out twice over: the augmentation kills its gauge-field factor, and its - conjugate-lepton factor carries no derivative index. -/ -lemma fermionBarDual_Dbarψ_mul_Dψ (q p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : - fermionBarDual q (Dbarψ [p.2.1] p.1 * Dψ [] p.2.2) = if p = q then 1 else 0 := by - obtain ⟨α₀, μ₀, β₀⟩ := q - obtain ⟨α, μ, β⟩ := p - rw [Dbarψ_singleton, Dψ_nil, add_mul, smul_mul_assoc, mul_assoc] - simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, - JetAlgebra.tmul_mul_tmul, one_mul, map_add, map_smul, - fermionBarDual, fermionPairDual_tmul, - LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] - simp only [Module.Basis.coord_apply, Module.Basis.repr_self, - Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, - LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq, Prod.mk.injEq] - simp only [Multiset.singleton_inj, true_and, mul_ite, mul_one, mul_zero] - by_cases hα : α = α₀ <;> by_cases hμ : μ = μ₀ <;> by_cases hβ : β = β₀ <;> - simp [hα, hμ, hβ] - -/-- `fermionBarDual_Dbarψ_mul_Dψ` with the three indices given separately, so that it fires on - bilinears written out rather than through a product index. -/ -@[simp] -lemma fermionBarDual_apply (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) (α : Fin 2) - (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : - fermionBarDual q (Dbarψ [μ] α * Dψ [] β) = if (α, μ, β) = q then 1 else 0 := - fermionBarDual_Dbarψ_mul_Dψ q (α, μ, β) - -/-- The sixteen conjugate fermion bilinears `(D̄_μ ψ̄)_α ψ_β` are linearly independent. -/ -theorem Dbarψ_singleton_mul_Dψ_nil_linearIndependent : - LinearIndependent ℂ (fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => - Dbarψ [p.2.1] p.1 * Dψ [] p.2.2) := by - rw [Fintype.linearIndependent_iff] - intro c hc q - have h := congrArg (fermionBarDual q) hc - rw [map_sum, map_zero] at h - simp only [map_smul, smul_eq_mul, fermionBarDual_Dbarψ_mul_Dψ, mul_ite, mul_one, - mul_zero, Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at h - exact h - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean deleted file mode 100644 index b179cf3d4..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/Closure.lean +++ /dev/null @@ -1,139 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.KineticTerms -/-! -# The fermion kinetic bilinears span a subrepresentation - -The span of the sixteen bilinears `ψ̄_α D_μ ψ_β` is carried to itself by both group actions on -the jet algebra. Statements proved for the span — that its boost-weight-zero part is the fermion -kinetic term, say — may therefore be combined with any operator built from the group elements, -an average or a projector among them, without leaving the span. - -*Both closures are covariance of the covariant derivative.* Under the Lorentz group `ψ̄_α` mixes -only with the `ψ̄_γ`, and `D_μ ψ_β` only with the `D_ν ψ_δ` — the `- 6 i B_μ ψ_β` tail of the -covariant derivative transforms along with the derivative, which is the content of -`repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton` — so a bilinear goes to a combination of bilinears. -Under the gauge group each bilinear is not merely carried into the span but fixed: the -hypercharge characters of the lepton and of its conjugate cancel by unitarity -(`repJetGaugeGroupI_Dbarψ_mul_Dψ`), so the span is fixed pointwise. - -## Key results - -- `JetAlgebra.repLorentzGroup_mem_span_Dbarψ_mul_Dψ` : the span is closed under the Lorentz - action, and `map_repLorentzGroup_span_Dbarψ_mul_Dψ` states this as an equality of submodules. -- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ` : the gauge group fixes the span - pointwise, whence `map_repJetGaugeGroupI_span_Dbarψ_mul_Dψ`. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## A. The generators - --/ - -/-- A fermion kinetic bilinear lies in their span. -/ -lemma Dbarψ_mul_Dψ_mem_span (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : - Dbarψ [] α * Dψ [μ] β ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := - Submodule.subset_span ⟨α, μ, β, rfl⟩ - -/-- The Lorentz action carries a fermion kinetic bilinear into the span of the bilinears: the - spinor indices are rotated among themselves and the derivative index along with them. -/ -lemma repLorentzGroup_Dbarψ_mul_Dψ_mem_span (Λ : SL(2,ℂ)) (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) - (β : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by - rw [repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton] - exact Submodule.sum_mem _ fun γ _ => Submodule.sum_mem _ fun ν _ => - Submodule.sum_mem _ fun δ _ => Submodule.smul_mem _ _ (Dbarψ_mul_Dψ_mem_span γ ν δ) - -/-! - -## B. Closure under the Lorentz group - --/ - -/-- **The span of the fermion kinetic bilinears is closed under the Lorentz action.** -/ -lemma repLorentzGroup_mem_span_Dbarψ_mul_Dψ (Λ : SL(2,ℂ)) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : - repLorentzGroup Λ x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨α, μ, β, rfl⟩ := hy - exact repLorentzGroup_Dbarψ_mul_Dψ_mem_span Λ α μ β - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- **The span of the fermion kinetic bilinears is a subrepresentation of the Lorentz group.** - Closure under every element and its inverse upgrades `repLorentzGroup_mem_span_Dbarψ_mul_Dψ` - to an equality. -/ -lemma map_repLorentzGroup_span_Dbarψ_mul_Dψ (Λ : SL(2,ℂ)) : - Submodule.map (repLorentzGroup Λ) - (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) = - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repLorentzGroup_mem_span_Dbarψ_mul_Dψ Λ hu - · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_Dbarψ_mul_Dψ Λ⁻¹ hx, - repLorentzGroup.self_inv_apply Λ x⟩ - -/-! - -## C. Closure under the gauge group - --/ - -/-- **The gauge group fixes the span of the fermion kinetic bilinears pointwise.** Each bilinear - pairs the lepton with its conjugate, and their hypercharge characters cancel. -/ -lemma repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ (U : JetGaugeGroupI) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : - repJetGaugeGroupI U x = x := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨α, μ, β, rfl⟩ := hy - exact repJetGaugeGroupI_Dbarψ_mul_Dψ U [] [μ] α β - | zero => rw [map_zero] - | add u v _ _ hu hv => rw [map_add, hu, hv] - | smul c u _ hu => rw [map_smul, hu] - -/-- **The span of the fermion kinetic bilinears is closed under the gauge action.** -/ -lemma repJetGaugeGroupI_mem_span_Dbarψ_mul_Dψ (U : JetGaugeGroupI) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) : - repJetGaugeGroupI U x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by - rw [repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ U hx] - exact hx - -/-- **The span of the fermion kinetic bilinears is a subrepresentation of the gauge group.** -/ -lemma map_repJetGaugeGroupI_span_Dbarψ_mul_Dψ (U : JetGaugeGroupI) : - Submodule.map (repJetGaugeGroupI U) - (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) = - Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repJetGaugeGroupI_mem_span_Dbarψ_mul_Dψ U hu - · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_Dbarψ_mul_Dψ U hx⟩ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean deleted file mode 100644 index 89f3ecd52..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicKineticTerm/LinearIndependence.lean +++ /dev/null @@ -1,173 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.CovariantDeriv -public import Mathlib.LinearAlgebra.ExteriorAlgebra.OfAlternating -/-! -# Linear independence of the fermion bilinears - -The sixteen products `ψ̄_α D_μ ψ_β` are linearly independent. Statements about -an explicit span of such products — the boost-weight-zero part of the fermion -kinetic sector, say — then reduce to linear algebra on coefficients, with no -need for a grading certificate. - -The proof exhibits a dual family. The lepton factor of the jet algebra is an -exterior algebra, so a pair of dual basis vectors `φ`, `ψ` on the jet component -space gives an alternating two-form `φ ⊗ ψ - ψ ⊗ φ`, and -`ExteriorAlgebra.liftAlternating` turns it into a functional picking out the -coefficient of `ι x * ι y`. Tensoring with the augmentation of the B-boson -factor gives a functional `fermionPairDual` on the whole jet algebra, and -`fermionPairDual_Dbarψ_mul_Dψ` shows it is dual to the sixteen bilinears: the -`- 6 i B_μ ψ_β` tail of `D_μ ψ_β` contributes nothing, because its fermionic -part carries no derivative index. - -## Key results - -- `fermionPairDual` : the functional dual to a chosen fermion bilinear. -- `Dbarψ_mul_Dψ_linearIndependent` : the sixteen bilinears are independent. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## A. An alternating two-form from a pair of functionals - --/ - -/-- The alternating two-form `φ ∧ ψ` built from a pair of linear functionals. -/ -noncomputable def altPair {V : Type} [AddCommGroup V] [Module ℂ V] - (φ ψ : Module.Dual ℂ V) : V [⋀^Fin 2]→ₗ[ℂ] ℂ where - toFun v := φ (v 0) * ψ (v 1) - φ (v 1) * ψ (v 0) - map_update_add' v i x y := by fin_cases i <;> simp <;> ring - map_update_smul' v i c x := by fin_cases i <;> simp <;> ring - map_eq_zero_of_eq' v i j h hij := by - fin_cases i <;> fin_cases j <;> simp_all - -@[simp] -lemma altPair_apply {V : Type} [AddCommGroup V] [Module ℂ V] - (φ ψ : Module.Dual ℂ V) (x y : V) : - altPair φ ψ ![x, y] = φ x * ψ y - φ y * ψ x := rfl - -/-- The family of alternating forms that is `altPair φ ψ` in degree two and zero - elsewhere; the input to `ExteriorAlgebra.liftAlternating`. -/ -noncomputable def altPairFamily {V : Type} [AddCommGroup V] [Module ℂ V] - (φ ψ : Module.Dual ℂ V) : (i : ℕ) → V [⋀^Fin i]→ₗ[ℂ] ℂ - | 2 => altPair φ ψ - | _ => 0 - -/-- The functional on an exterior algebra picking out the coefficient of the - degree-two monomial dual to `φ` and `ψ`. -/ -noncomputable def extPairDual {V : Type} [AddCommGroup V] [Module ℂ V] - (φ ψ : Module.Dual ℂ V) : ExteriorAlgebra ℂ V →ₗ[ℂ] ℂ := - ExteriorAlgebra.liftAlternating (altPairFamily φ ψ) - -@[simp] -lemma extPairDual_ι_mul_ι {V : Type} [AddCommGroup V] [Module ℂ V] - (φ ψ : Module.Dual ℂ V) (x y : V) : - extPairDual φ ψ (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y) = - φ x * ψ y - φ y * ψ x := by - rw [extPairDual, ExteriorAlgebra.liftAlternating_ι_mul, - ExteriorAlgebra.liftAlternating_ι] - rfl - -/-! - -## B. The dual family for the fermion bilinears - --/ - -/-- The augmentation of the B-boson factor: the algebra map to `ℂ` sending every - gauge-field generator to zero. -/ -noncomputable def augB : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] ℂ := - Algebra.TensorProduct.lift (AlgHom.id ℂ ℂ) - (SymmetricAlgebra.lift (0 : BBoson.JetComponentSpace →ₗ[ℝ] ℂ)) - (fun _ _ => Commute.all _ _) - -/-- The functional on the jet algebra dual to a chosen fermion bilinear: the - augmentation on the B-boson factor tensored with `extPairDual` on the lepton - factor. -/ -noncomputable def fermionPairDual - (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) : JetAlgebra →ₗ[ℂ] ℂ := - TensorProduct.lift - (((LinearMap.mul ℂ ℂ).comp augB.toLinearMap).compl₂ (extPairDual φ ψ)) - -@[simp] -lemma fermionPairDual_tmul (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - fermionPairDual φ ψ (a ⊗ⱼ b) = augB a * extPairDual φ ψ b := rfl - -/-- The augmentation kills a gauge-field generator. -/ -@[simp] -lemma augB_ofGenerator (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - augB (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) = 0 := by - simp [augB, BBoson.JetAlgebra.ofGenerator] - -/-- The augmentation is unital. -/ -@[simp] -lemma augB_one_tmul_one : augB (1 ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = 1 := by - rw [show (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) = 1 from rfl, map_one] - -/-- The functional dual to the fermion bilinear `ψ̄_α D_μ ψ_β`. -/ -noncomputable def fermionDual (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : - JetAlgebra →ₗ[ℂ] ℂ := - fermionPairDual - (LeptonSinglet.JetComponentSpace.basis.coord - (LeptonSinglet.JetGenerators.dbarψ {} q.1)) - (LeptonSinglet.JetComponentSpace.basis.coord - (LeptonSinglet.JetGenerators.dψ {q.2.1} q.2.2)) - -/-- `fermionDual` is dual to the sixteen fermion bilinears. The `- 6 i B_μ ψ_β` - tail of `D_μ ψ_β` drops out twice over: the augmentation kills its gauge-field - factor, and its fermionic factor carries no derivative index. -/ -lemma fermionDual_Dbarψ_mul_Dψ (q p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) : - fermionDual q (Dbarψ [] p.1 * Dψ [p.2.1] p.2.2) = if p = q then 1 else 0 := by - obtain ⟨α₀, μ₀, β₀⟩ := q - obtain ⟨α, μ, β⟩ := p - rw [Dbarψ_nil, Dψ_singleton, mul_sub, mul_smul_comm, ← mul_assoc] - simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, - JetAlgebra.tmul_mul_tmul, mul_one, map_sub, map_smul, - fermionDual, fermionPairDual_tmul, - LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] - simp only [Module.Basis.coord_apply, Module.Basis.repr_self, - Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, - LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq, Prod.mk.injEq] - simp only [Multiset.singleton_inj, true_and, mul_ite, mul_one, mul_zero] - by_cases hα : α = α₀ <;> by_cases hμ : μ = μ₀ <;> by_cases hβ : β = β₀ <;> - simp [hα, hμ, hβ] - -/-- `fermionDual_Dbarψ_mul_Dψ` with the three indices given separately, so that - it fires on bilinears written out rather than through a product index. -/ -@[simp] -lemma fermionDual_apply (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) (α : Fin 2) - (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : - fermionDual q (Dbarψ [] α * Dψ [μ] β) = if (α, μ, β) = q then 1 else 0 := - fermionDual_Dbarψ_mul_Dψ q (α, μ, β) - -/-- The sixteen fermion bilinears `ψ̄_α D_μ ψ_β` are linearly independent. -/ -theorem Dbarψ_mul_Dψ_linearIndependent : - LinearIndependent ℂ (fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => - Dbarψ [] p.1 * Dψ [p.2.1] p.2.2) := by - rw [Fintype.linearIndependent_iff] - intro c hc q - have h := congrArg (fermionDual q) hc - rw [map_sum, map_zero] at h - simp only [map_smul, smul_eq_mul, fermionDual_Dbarψ_mul_Dψ, mul_ite, mul_one, - mul_zero, Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at h - exact h - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean deleted file mode 100644 index 1d5c38405..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FermionicParity.lean +++ /dev/null @@ -1,424 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.MassDim -public import Physlib.Relativity.LorentzGroup.FermionicParity -/-! -# Fermionic parity on the lepton–gauge-sector jet algebra - -Fermionic parity `-1 ∈ SL(2, ℂ)` projects to the identity Lorentz transformation, so it acts -trivially on everything built from Lorentz vectors — the B-boson factor and the derivative -symbols — and by `-1` on the Weyl spinor of the charged lepton. On the jet algebra it therefore -negates each fermionic generator and fixes each bosonic one. - -Since the mass weight of a bosonic generator `∂_s B_μ` is even, `2(1 + |s|)`, and that of a -fermionic generator `∂_s ψ_α` or `∂_s ψ̄_α` is odd, `3 + 2|s|`, fermionic parity acts on a -generator by `(-1)` raised to its mass weight. - --/ - -@[expose] public section - -set_option maxHeartbeats 400000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel Matrix MatrixGroups LorentzGroup - -namespace JetAlgebra - -/-! - -## A. Fermionic parity on the derivative symbols and the two factors - --/ - -private lemma fermionicParity_inv : fermionicParity⁻¹ = fermionicParity := - inv_eq_of_mul_eq_one_right (by rw [← sq]; exact fermionicParity_sq) - -/-- Fermionic parity acts trivially on the dual complex Lorentz covectors. -/ -lemma coℂModule_SL2CRep_dual_fermionicParity : - Lorentz.CoℂModule.SL2CRep.dual fermionicParity = LinearMap.id := by - rw [Representation.dual_apply, fermionicParity_inv, coℂModule_SL2CRep_fermionicParity] - ext f x - simp [Module.Dual.transpose] - -/-- Fermionic parity acts trivially on the complex algebra of derivative symbols. -/ -lemma derivAlgebraComplex_repLorentzGroup_fermionicParity : - DerivAlgebraComplex.repLorentzGroup fermionicParity = LinearMap.id := by - show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ - Lorentz.CoℂModule.SL2CRep.dual fermionicParity)).toLinearMap = _ - rw [coℂModule_SL2CRep_dual_fermionicParity, - LinearMap.comp_id (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule))] - refine LinearMap.ext fun x => ?_ - show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _) x = x - rw [show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule)) = - AlgHom.id ℂ _ from SymmetricAlgebra.algHom_ext (by ext y; simp)] - rfl - -/-- Fermionic parity acts trivially on the real Lorentz covectors. -/ -lemma coVector_sl2Rep_fermionicParity : - Lorentz.CoVector.sl2Rep fermionicParity = LinearMap.id := by - show (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup fermionicParity)) = _ - rw [toLorentzGroup_fermionicParity, map_one] - rfl - -lemma coVector_sl2Rep_dual_fermionicParity : - Lorentz.CoVector.sl2Rep.dual fermionicParity = LinearMap.id := by - rw [Representation.dual_apply, fermionicParity_inv, coVector_sl2Rep_fermionicParity] - ext f x - simp [Module.Dual.transpose] - -/-- Fermionic parity acts trivially on the real algebra of derivative symbols. -/ -lemma derivAlgebraReal_repLorentzGroup_fermionicParity : - DerivAlgebraReal.repLorentzGroup fermionicParity = LinearMap.id := by - show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - Lorentz.CoVector.sl2Rep.dual fermionicParity)).toLinearMap = _ - rw [coVector_sl2Rep_dual_fermionicParity, - LinearMap.comp_id (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector))] - refine LinearMap.ext fun x => ?_ - show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _) x = x - rw [show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector)) = - AlgHom.id ℝ _ from SymmetricAlgebra.algHom_ext (by ext y; simp)] - rfl - -/-! - -## B. Fermionic parity on the B-boson factor - -The B boson is a Lorentz vector, so fermionic parity leaves the whole bosonic factor alone. - --/ - -lemma bBoson_repLorentzGroup_fermionicParity : - BBoson.repLorentzGroup fermionicParity = LinearMap.id := by - show (BBoson.valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup fermionicParity)) - (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) fermionicParity) ∘ₗ - BBoson.valLinEquiv.toLinearMap) = _ - rw [toLorentzGroup_fermionicParity, map_one] - ext F - simp [Module.End.one_eq_id, TensorProduct.map_id] - -lemma bBoson_repLorentzGroup_dual_fermionicParity : - BBoson.repLorentzGroup.dual fermionicParity = LinearMap.id := by - rw [Representation.dual_apply, fermionicParity_inv, bBoson_repLorentzGroup_fermionicParity] - ext f x - simp [Module.Dual.transpose] - -lemma bBoson_jetComponentSpace_repLorentzGroup_fermionicParity : - BBoson.JetComponentSpace.repLorentzGroup fermionicParity = LinearMap.id := by - show (TensorProduct.map (DerivAlgebraReal.repLorentzGroup fermionicParity) - (BBoson.repLorentzGroup.dual fermionicParity)) = _ - rw [derivAlgebraReal_repLorentzGroup_fermionicParity, - bBoson_repLorentzGroup_dual_fermionicParity, TensorProduct.map_id] - -/-! - -## C. Fermionic parity on the charged-lepton factor - -The lepton is a Weyl spinor, so fermionic parity acts on the component space by `-1`, and hence -negates each fermionic generator of the exterior algebra. - --/ - -lemma leptonSinglet_repLorentzGroup_fermionicParity : - LeptonSinglet.repLorentzGroup fermionicParity = -LinearMap.id := by - show (LeptonSinglet.valLinEquiv.symm.toLinearMap ∘ₗ - Fermion.RightHandedWeyl.rep fermionicParity ∘ₗ - LeptonSinglet.valLinEquiv.toLinearMap) = _ - rw [rightHandedWeyl_rep_fermionicParity] - ext l - simp - -lemma leptonSinglet_repLorentzGroup_dual_fermionicParity : - LeptonSinglet.repLorentzGroup.dual fermionicParity = -LinearMap.id := by - rw [Representation.dual_apply, fermionicParity_inv, - leptonSinglet_repLorentzGroup_fermionicParity] - ext f x - simp [Module.Dual.transpose] - -lemma leptonSinglet_repLorentzGroup_conj_fermionicParity : - LeptonSinglet.repLorentzGroup.conj fermionicParity = -LinearMap.id := by - ext m - rw [Representation.conj_apply, leptonSinglet_repLorentzGroup_fermionicParity] - simp - -lemma leptonSinglet_repLorentzGroup_conj_dual_fermionicParity : - LeptonSinglet.repLorentzGroup.conj.dual fermionicParity = -LinearMap.id := by - rw [Representation.dual_apply, fermionicParity_inv, - leptonSinglet_repLorentzGroup_conj_fermionicParity] - ext f x - simp [Module.Dual.transpose] - -/-- Fermionic parity acts by `-1` on every lepton component function, at every derivative - order at once: the derivative symbols are inert and the spinor index carries the sign. -/ -lemma leptonSinglet_jetComponentSpace_repLorentzGroup_fermionicParity : - LeptonSinglet.JetComponentSpace.repLorentzGroup fermionicParity = -LinearMap.id := by - show LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup fermionicParity) - (LeptonSinglet.repLorentzGroup.dual fermionicParity)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup fermionicParity) - (LeptonSinglet.repLorentzGroup.conj.dual fermionicParity)) = _ - rw [derivAlgebraComplex_repLorentzGroup_fermionicParity, - leptonSinglet_repLorentzGroup_dual_fermionicParity, - leptonSinglet_repLorentzGroup_conj_dual_fermionicParity] - have h1 : TensorProduct.map (LinearMap.id : DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex) - (-LinearMap.id : Module.Dual ℂ LeptonSinglet →ₗ[ℂ] Module.Dual ℂ LeptonSinglet) = - -LinearMap.id := by - refine TensorProduct.ext' fun a b => ?_ - simp [TensorProduct.tmul_neg] - have h2 : TensorProduct.map (LinearMap.id : DerivAlgebraComplex →ₗ[ℂ] DerivAlgebraComplex) - (-LinearMap.id : Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet)) = -LinearMap.id := by - refine TensorProduct.ext' fun a b => ?_ - simp [TensorProduct.tmul_neg] - rw [h1, h2] - refine LinearMap.ext fun x => Prod.ext ?_ ?_ <;> simp - - -/-! - -## D. Checking algebra maps on the generators - -Two algebra maps out of the jet algebra that agree on every generator are equal. The bosonic -factor is a symmetric algebra and the fermionic one an exterior algebra, both on spaces with a -distinguished basis indexed by the generators, so each factor is handled by its own induction -principle. `Algebra.TensorProduct.ext` is not usable here: the bosonic factor is itself an -`ℝ`-tensor product, so that lemma demands an `IsScalarTower ℝ ℂ A` on the target. - --/ - -/-- Two algebra maps out of the jet algebra agreeing on the bosonic factor. -/ -private lemma algHom_eq_on_inclB {A : Type} [Ring A] [Algebra ℂ A] - {f g : JetAlgebra →ₐ[ℂ] A} (h : ∀ j : JetGenerators, f [j]ₐ = g [j]ₐ) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : f (inclB a) = g (inclB a) := by - have hone : ∀ c : BBoson.JetAlgebra, - f (inclB ((1 : ℂ) ⊗ₜ[ℝ] c)) = g (inclB ((1 : ℂ) ⊗ₜ[ℝ] c)) := by - intro c - induction c using SymmetricAlgebra.induction with - | algebraMap r => - rw [show ((1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ BBoson.JetAlgebra r) : - ℂ ⊗[ℝ] BBoson.JetAlgebra) = - algebraMap ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) (algebraMap ℝ ℂ r) from by - rw [Algebra.algebraMap_eq_smul_one, Algebra.algebraMap_eq_smul_one, - TensorProduct.tmul_smul, TensorProduct.smul_tmul'] - rfl, AlgHom.commutes, AlgHom.commutes, AlgHom.commutes] - | ι v => - have hv : v ∈ Submodule.span ℝ (Set.range BBoson.JetComponentSpace.basis) := by - rw [BBoson.JetComponentSpace.basis.span_eq] - trivial - induction hv using Submodule.span_induction with - | mem y hy => - obtain ⟨j, rfl⟩ := hy - obtain ⟨s, μ⟩ := j - exact h (JetGenerators.dB s μ) - | zero => simp - | add u w _ _ ihu ihw => - simp only [map_add, TensorProduct.tmul_add] - rw [ihu, ihw] - | smul r u _ ihu => - have hs : ((1 : ℂ) ⊗ₜ[ℝ] - (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace (r • u)) : - ℂ ⊗[ℝ] BBoson.JetAlgebra) = - (algebraMap ℝ ℂ r) • ((1 : ℂ) ⊗ₜ[ℝ] - SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace u) := by - rw [map_smul, TensorProduct.tmul_smul, ← algebraMap_smul ℂ r] - rw [hs] - simp only [map_smul] - rw [ihu] - | mul u v ihu ihv => - rw [show ((1 : ℂ) ⊗ₜ[ℝ] (u * v) : ℂ ⊗[ℝ] BBoson.JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] u) * ((1 : ℂ) ⊗ₜ[ℝ] v) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul]] - simp only [map_mul] - rw [ihu, ihv] - | add u v ihu ihv => - simp only [TensorProduct.tmul_add, map_add] - rw [ihu, ihv] - induction a using TensorProduct.induction_on with - | zero => simp - | add u v hu hv => rw [map_add, map_add, map_add, hu, hv] - | tmul z c => - rw [show (z ⊗ₜ[ℝ] c : ℂ ⊗[ℝ] BBoson.JetAlgebra) = z • ((1 : ℂ) ⊗ₜ[ℝ] c) from by - rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one], map_smul, map_smul, map_smul, - hone c] - -/-- Two algebra maps out of the jet algebra agreeing on the fermionic factor. -/ -private lemma algHom_eq_on_inclL {A : Type} [Ring A] [Algebra ℂ A] - {f g : JetAlgebra →ₐ[ℂ] A} (h : ∀ j : JetGenerators, f [j]ₐ = g [j]ₐ) - (b : LeptonSinglet.JetAlgebra) : f (inclL b) = g (inclL b) := by - have hcomp : f.comp inclL = g.comp inclL := by - refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) - have hm : m ∈ Submodule.span ℂ (Set.range LeptonSinglet.JetComponentSpace.basis) := by - rw [LeptonSinglet.JetComponentSpace.basis.span_eq] - trivial - induction hm using Submodule.span_induction with - | mem y hy => - obtain ⟨j, rfl⟩ := hy - cases j with - | dψ s α => exact h (JetGenerators.dψ s α) - | dbarψ s α => exact h (JetGenerators.dbarψ s α) - | zero => simp - | add u v _ _ ihu ihv => - simp only [LinearMap.coe_comp, Function.comp_apply, AlgHom.toLinearMap_apply, - map_add] at ihu ihv ⊢ - rw [ihu, ihv] - | smul c u _ ihu => - simp only [LinearMap.coe_comp, Function.comp_apply, AlgHom.toLinearMap_apply, - map_smul] at ihu ⊢ - rw [ihu] - exact AlgHom.congr_fun hcomp b - -/-- Two algebra maps out of the jet algebra agreeing on every generator are equal. -/ -lemma algHom_ext {A : Type} [Ring A] [Algebra ℂ A] {f g : JetAlgebra →ₐ[ℂ] A} - (h : ∀ j : JetGenerators, f [j]ₐ = g [j]ₐ) : f = g := by - refine AlgHom.ext fun x => ?_ - induction x using JetAlgebra.induction_on with - | zero => simp - | add u v hu hv => rw [map_add, map_add, hu, hv] - | tmul a b => - rw [tmul_eq_inclB_mul_inclL, map_mul, map_mul, algHom_eq_on_inclB h, - algHom_eq_on_inclL h] - - -/-! - -## E. Fermionic parity acts by `(-1)` to the mass weight - --/ - -private lemma tmul_neg' (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - a ⊗ⱼ (-b) = -(a ⊗ⱼ b) := TensorProduct.tmul_neg a b - -lemma bBoson_jetAlgebra_repLorentzGroup_fermionicParity : - BBoson.JetAlgebra.repLorentzGroup fermionicParity = LinearMap.id := by - show (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - BBoson.JetComponentSpace.repLorentzGroup fermionicParity)).toLinearMap = _ - rw [bBoson_jetComponentSpace_repLorentzGroup_fermionicParity, - LinearMap.comp_id (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace)] - refine LinearMap.ext fun x => ?_ - show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _) x = x - rw [show SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ BBoson.JetComponentSpace) = - AlgHom.id ℝ _ from SymmetricAlgebra.algHom_ext (by ext y; simp)] - rfl - -lemma bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity : - BBoson.JetAlgebra.complexRepLorentzGroup fermionicParity = LinearMap.id := by - refine LinearMap.ext fun x => ?_ - induction x using TensorProduct.induction_on with - | zero => simp - | add u v hu hv => rw [map_add, hu, hv]; simp - | tmul z b => - show z ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup fermionicParity b = _ - rw [bBoson_jetAlgebra_repLorentzGroup_fermionicParity] - rfl - -/-- Fermionic parity negates every fermionic generator. -/ -lemma leptonSinglet_jetAlgebra_repLorentzGroup_fermionicParity_ofGenerator - (j : LeptonSinglet.JetGenerators) : - LeptonSinglet.JetAlgebra.repLorentzGroup fermionicParity - (LeptonSinglet.JetAlgebra.ofGenerator j) = - -LeptonSinglet.JetAlgebra.ofGenerator j := by - rw [LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator, - leptonSinglet_jetComponentSpace_repLorentzGroup_fermionicParity] - simp [LeptonSinglet.JetAlgebra.ofGenerator] - -/-- Fermionic parity acts on each generator by `(-1)` raised to its mass weight: bosonic - generators have even weight and are fixed, fermionic generators have odd weight and are - negated. -/ -lemma repLorentzGroup_fermionicParity_ofGenerator (j : JetGenerators) : - repLorentzGroup fermionicParity [j]ₐ = (-1 : ℂ) ^ MassWeight j • [j]ₐ := by - cases j with - | dB s μ => - rw [ofGenerator_B_eq, repLorentzGroup_tmul, - bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity, - show LeptonSinglet.JetAlgebra.repLorentzGroup fermionicParity - (1 : LeptonSinglet.JetAlgebra) = 1 from - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one fermionicParity, - show MassWeight (JetGenerators.dB s μ) = 2 * (1 + Multiset.card s) from rfl, - Even.neg_one_pow ⟨1 + Multiset.card s, by ring⟩, one_smul] - rfl - | dψ s α => - rw [ofGenerator_dψ_eq, repLorentzGroup_tmul, - leptonSinglet_jetAlgebra_repLorentzGroup_fermionicParity_ofGenerator, - show MassWeight (JetGenerators.dψ s α) = 3 + 2 * Multiset.card s from rfl, - Odd.neg_one_pow ⟨1 + Multiset.card s, by ring⟩, neg_one_smul] - rw [show (BBoson.JetAlgebra.complexRepLorentzGroup fermionicParity) - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from by - rw [bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity]; rfl, tmul_neg'] - | dbarψ s α => - rw [ofGenerator_dbarψ_eq, repLorentzGroup_tmul, - leptonSinglet_jetAlgebra_repLorentzGroup_fermionicParity_ofGenerator, - show MassWeight (JetGenerators.dbarψ s α) = 3 + 2 * Multiset.card s from rfl, - Odd.neg_one_pow ⟨1 + Multiset.card s, by ring⟩, neg_one_smul] - rw [show (BBoson.JetAlgebra.complexRepLorentzGroup fermionicParity) - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) = (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from by - rw [bBoson_jetAlgebra_complexRepLorentzGroup_fermionicParity]; rfl, tmul_neg'] - -/-- Evaluation of a mass-weight polynomial at a scalar. -/ -private noncomputable def evalAt (c : ℂ) : Polynomial JetAlgebra →ₐ[ℂ] JetAlgebra := - Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) (algebraMap ℂ JetAlgebra c) - fun a => (Algebra.commutes c a).symm - -private lemma evalAt_monomial (c : ℂ) (n : ℕ) (y : JetAlgebra) : - evalAt c (Polynomial.monomial n y) = c ^ n • y := by - show Polynomial.eval₂ (AlgHom.id ℂ JetAlgebra).toRingHom - (algebraMap ℂ JetAlgebra c) (Polynomial.monomial n y) = _ - rw [Polynomial.eval₂_monomial, ← map_pow, ← Algebra.commutes, ← Algebra.smul_def] - rfl - -/-- Fermionic parity is the mass-weight polynomial evaluated at `-1`. -/ -private lemma repLorentzGroupAlgHom_fermionicParity : - repLorentzGroupAlgHom fermionicParity = (evalAt (-1)).comp massWeightPoly := by - refine algHom_ext fun j => ?_ - show repLorentzGroup fermionicParity [j]ₐ = evalAt (-1) (massWeightPoly [j]ₐ) - rw [repLorentzGroup_fermionicParity_ofGenerator, massWeightPoly_ofGenerator, - evalAt_monomial] - -/-- On an element of mass weight `n`, fermionic parity acts by `(-1) ^ n`. -/ -lemma repLorentzGroup_fermionicParity_of_mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) : - repLorentzGroup fermionicParity x = (-1 : ℂ) ^ n • x := by - have h := AlgHom.congr_fun repLorentzGroupAlgHom_fermionicParity x - show repLorentzGroup fermionicParity x = _ - rw [show repLorentzGroup fermionicParity x = repLorentzGroupAlgHom fermionicParity x from rfl, - h, AlgHom.comp_apply, mem_massWeightSubmodule.mp hx, evalAt_monomial] - -/-! - -## F. The selection rule - --/ - -/-- **No invariant has odd mass weight.** An element of odd mass weight that is invariant under - the Lorentz group vanishes: fermionic parity fixes it, being a Lorentz transformation, while - acting on it by `-1`, since its mass weight is odd. Physically: a Lagrangian term must contain - an even number of fermions. -/ -theorem eq_zero_of_odd_massWeight_of_forall_repLorentzGroup_eq {n : ℕ} (hn : Odd n) - {x : JetAlgebra} (hx : x ∈ massWeightSubmodule n) - (hinv : ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) : x = 0 := by - have h1 : x = (-1 : ℂ) ^ n • x := by - rw [← repLorentzGroup_fermionicParity_of_mem_massWeightSubmodule hx, hinv] - rw [hn.neg_one_pow, neg_one_smul] at h1 - have h2 : (2 : ℂ) • x = 0 := by - calc (2 : ℂ) • x = x + x := two_smul ℂ x - _ = -x + x := congrArg (· + x) h1 - _ = 0 := neg_add_cancel x - rcases smul_eq_zero.mp h2 with h3 | h3 - · exact absurd h3 two_ne_zero - · exact h3 - -/-- An invariant element of odd mass weight vanishes. -/ -theorem eq_zero_of_odd_massWeight_of_isInvariant {n : ℕ} (hn : Odd n) {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) (hinv : IsInvariant x) : x = 0 := - eq_zero_of_odd_massWeight_of_forall_repLorentzGroup_eq hn hx hinv.2 - -end JetAlgebra - -end LeptonGaugeSector - - diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean deleted file mode 100644 index 341823f09..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/FieldStrength.lean +++ /dev/null @@ -1,94 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Basic -/-! -# The field strengths of the lepton–gauge-sector jet algebra - -The derivatives `∂_s F_{μν}` of the B-boson field strength, embedded in the -lepton–gauge-sector -jet algebra as elements of its bosonic factor, together with the identities -that hold of them as elements of that algebra: antisymmetry in the two field -indices, vanishing on a repeated index, and commutativity, the field strengths -lying in the commutative bosonic factor. --/ - -@[expose] public section - - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-- The derivatives of the B-boson field strength, embedded in the lepton–gauge-sector jet - algebra. -/ -noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : JetAlgebra := - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) ⊗ⱼ 1 - - -/-- Reordering the two derivative indices of a second-derivative field - strength. -/ -lemma fieldStrengthDeriv_pair_swap (r s a b : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {r, s} a b = fieldStrengthDeriv {s, r} a b := by - have h : ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) = {s, r} := Multiset.cons_swap r s 0 - rw [h] - - -/-- A field-strength derivative written out on the generators. -/ -lemma fieldStrengthDeriv_eq_sub (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν = - ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, TensorProduct.tmul_sub, sub_tmul] - rfl - -/-- Antisymmetry of the embedded field-strength derivatives in the two field - indices. -/ -lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s ν μ = - fieldStrengthDeriv s μ ν := by - have h : ∀ a b : Fin 1 ⊕ Fin 3, (fieldStrengthDeriv s a b : JetAlgebra) = - [JetGenerators.dB (s + {a}) b]ₐ - [JetGenerators.dB (s + {b}) a]ₐ := by - intro a b - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, sub_tmul] - rfl - rw [h, h, neg_sub] - -/-- The canonical orientation of a mixed field-strength component: the time - index first. -/ -lemma fieldStrengthDeriv_inr_inl (s : Multiset (Fin 1 ⊕ Fin 3)) (i : Fin 3) - (j : Fin 1) : - fieldStrengthDeriv s (Sum.inr i) (Sum.inl j) = - - fieldStrengthDeriv s (Sum.inl j) (Sum.inr i) := - fieldStrengthDeriv_antisymm s (Sum.inl j) (Sum.inr i) - -/-- The field strength vanishes on a repeated index. -/ -@[simp] -lemma fieldStrengthDeriv_self (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ μ = 0 := by - have h : (fieldStrengthDeriv s μ μ : JetAlgebra) = - [JetGenerators.dB (s + {μ}) μ]ₐ - [JetGenerators.dB (s + {μ}) μ]ₐ := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, sub_tmul] - rfl - rw [h, sub_self] - -/-- The embedded field-strength derivatives commute: they live in the - commutative bosonic factor of the jet algebra. -/ -lemma fieldStrengthDeriv_mul_comm (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν ρ τ : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' ρ τ = - fieldStrengthDeriv s' ρ τ * fieldStrengthDeriv s μ ν := by - rw [fieldStrengthDeriv, fieldStrengthDeriv, tmul_mul_tmul, tmul_mul_tmul] - congr 1 - exact mul_comm _ _ - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean deleted file mode 100644 index 235582495..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeAction.lean +++ /dev/null @@ -1,828 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.CovariantAlgebra -/-! -# The gauge action on the lepton–gauge-sector jet algebra - -The representation of the jet gauge group, the covariance of the covariant -derivatives under it, and the linear-matter model in which that covariance is -proved uniformly in the matter species before being instantiated at the lepton -and at its conjugate. --/ - -@[expose] public section - - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## B. Representation of the jet gauge group - -Gauge transformations act on the lepton–gauge-sector jet algebra -locally via the group `JetGaugeGroupI`. - --/ - -/-- The representation of the jet gauge group on the lepton–gauge-sector jet algebra: the - Maurer–Cartan substitution action on the (complexified) B-boson factor tensored - with the hypercharge action on the charged-lepton factor. -/ -noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := - BBoson.JetAlgebra.complexRepJetGaugeGroupI.tprod LeptonSinglet.JetAlgebra.repJetGaugeGroupI - -lemma repJetGaugeGroupI_eq_algHom (g : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI g x = Algebra.TensorProduct.map - (BBoson.JetAlgebra.complexRepJetGaugeGroupIAlgHom g) - (LeptonSinglet.JetAlgebra.repJetGaugeGroupIAlgHom g) x := rfl - -lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U ((c ⊗ₜ[ℝ] b) ⊗ⱼ l) = - (c ⊗ₜ[ℝ] BBoson.JetAlgebra.repJetGaugeGroupI U b) ⊗ⱼ - LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l := rfl - -/-- The gauge action on a pure tensor of the two jet-algebra factors. -/ -lemma repJetGaugeGroupI_tmul' (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repJetGaugeGroupI U (p ⊗ⱼ l) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ - (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U l) := rfl - -lemma repJetGaugeGroupI_apply_mul (g : JetGaugeGroupI) (x y : JetAlgebra) : - repJetGaugeGroupI g (x * y) = - repJetGaugeGroupI g x * repJetGaugeGroupI g y := by - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => simp only [add_mul, map_add, ha, hb] - | tmul p l => - induction y using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => simp only [mul_add, map_add, ha, hb] - | tmul q k => - simp only [tmul_mul_tmul, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_mul] - -lemma repJetGaugeGroupI_apply_one (g : JetGaugeGroupI) : - repJetGaugeGroupI g (1 : JetAlgebra) = 1 := by - rw [one_eq_tmul, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_one, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, ← one_eq_tmul] - -/-- The gauge action on a spanning element of the linear-matter submodule: it - acts on the two factors separately, leaving the matter degree at one. This is - the only input the closure result needs, and it holds for any matter factor - whose gauge action is functorial in the component space. -/ -lemma repJetGaugeGroupI_tmul_ι (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (m : LeptonSinglet.JetComponentSpace) : - repJetGaugeGroupI U (p ⊗ⱼ ExteriorAlgebra.ι ℂ m) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U m) := by - rw [repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - ExteriorAlgebra.map_apply_ι] - -/-- The zeroth-order lepton coordinate carries hypercharge `6`: a jet of gauge - transformations acts on it through the character of its value at the base - point alone, with no derivative contributions. This is the base case of - `repJetGaugeGroupI_Dψ`. -/ -lemma repJetGaugeGroupI_dψ_nil (U : JetGaugeGroupI) (α : Fin 2) : - repJetGaugeGroupI U [JetGenerators.dψ {} α]ₐ = U.eval.2.2 ^ 6 • [JetGenerators.dψ {} α]ₐ := by - rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ_nil, - Submonoid.smul_def, Submonoid.smul_def, tmul_smul] - -lemma repJetGaugeGroupI_dψ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI U [.dψ s α]ₐ = - ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - [.dψ (Finsupp.toMultiset p.2) α]ₐ := by - rw [ofGenerator_dψ_eq, repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_one_tmul_one, - StandardModel.LeptonSinglet.JetAlgebra.repJetGaugeGroupI_ofGenerator_ψ] - simp [tmul_sum, ← ofGenerator_dψ_eq] - -lemma repJetGaugeGroupI_apply_dB (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U [JetGenerators.dB s μ]ₐ = - [JetGenerators.dB s μ]ₐ + (BBoson.mcShift U (.basis (.dB s μ))) • 1 := by - rw [ofGenerator_B_eq, repJetGaugeGroupI_tmul', - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one, add_tmul, smul_tmul'] - rfl - - - -/-- The statement that if `x` and all its derivatives transform in the - same way that `ψ` transforms under the full - gauge group, then `covariantStep μ x` transforms this.-/ -lemma repJetGaugeGroupI_jetDerivM_covariantSteplemma - (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) - (hx : ∀ s, (repJetGaugeGroupI U) (jetDerivM s x) - = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - jetDerivM (Finsupp.toMultiset p.2) x) - (s : Multiset (Fin 1 ⊕ Fin 3)) : - repJetGaugeGroupI U (jetDerivM s (covariantStep μ x)) = - ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ μ, (Multiset.toFinsupp s μ).descFactorial (p.1 μ) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by - calc _ - _ = repJetGaugeGroupI U (jetDerivM s (jetDeriv μ x - - (6 * Complex.I) • ([JetGenerators.dB {} μ]ₐ * x))) := by - rfl - -- 1. Split the covariant step: `jetDerivM s` and `repJetGaugeGroupI U` are - -- linear, and `jetDerivM s (jetDeriv μ x) = jetDerivM (μ ::ₘ s) x` by - -- `jetDerivM_cons` together with `jetDerivM_add` / `jetDeriv_comm`. - _ = repJetGaugeGroupI U (jetDerivM (μ ::ₘ s) x) - - (6 * Complex.I) • repJetGaugeGroupI U (jetDerivM s ([JetGenerators.dB {} μ]ₐ * x)) := by - sorry - -- 2. `rw [hx (μ ::ₘ s)]` turns the first term into the expected sum at the - -- enlarged index `μ ::ₘ s`. - -- - -- 3. Leibniz on the gauge-field term via `jetDerivM_apply_mul`, then - -- `repJetGaugeGroupI_apply_mul` to split the action across each product: - -- ρ (∂_s (B_μ * x)) = ∑_q w_q • (ρ (∂_{q.1} B_μ) * ρ (∂_{q.2} x)) - -- NOTE: `jetDerivM_apply_mul` needs weight `Nat.choose`, not - -- `Nat.descFactorial`. At `s = {μ, μ}` the splitting `a = s` wants - -- `C(2,2) = 1`, but `Nat.descFactorial 2 2 = 2`. (`descFactorial` is - -- correct in `hx`: that comes from `jetRingAction` on a - -- factorial-weighted basis, a different normalisation.) - -- - -- 4. The gauge field is a coordinate, so it only shifts by a constant: - -- ρ_U (∂_a B_μ) = ∂_a B_μ + mcShift U [∂_{a+μ} B] • 1 - -- the sector-level counterpart of `BBoson.repJetGaugeGroupI_apply_dB` - -- transported through `repJetGaugeGroupI_tmul'`, together with - -- `jetDerivM a [dB {} μ]ₐ = [dB a μ]ₐ`. Neither exists yet. - -- - -- 5. The `x`-factor of each term is the hypothesis again, at index `q.2`. - -- - -- 6. Match against the target, expanded the same way: - -- ∂_p (D_μ x) = ∂_{μ ::ₘ p} x - 6i • ∂_p (B_μ * x) - -- Needs a Vandermonde/Pascal identity relating the weights at `μ ::ₘ s` - -- to those at `s` (reconciling `descFactorial` with `choose`), and - -- `coeff_p (u ^ 6)` at a shifted index expressed through the - -- Maurer–Cartan coefficients — the all-orders form of - -- `pderiv_pow_unitary`, currently only an inline `have` in - -- `LeptonSinglet`. That identity is what makes the shift from step 4 - -- cancel the derivative of the hypercharge character. - _ = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ ν, (Multiset.toFinsupp s ν).descFactorial (p.1 ν) : ℕ) : ℂ) • - MvPowerSeries.coeff p.1 (((U.2.2 : unitary JetRing) : JetRing) ^ 6) • - jetDerivM (Finsupp.toMultiset p.2) (covariantStep μ x) := by - sorry - -/-- The linear-matter submodule is closed under the gauge group: the gauge action - preserves the matter degree, because it acts on the matter factor functorially - in the component space and so intertwines with the canonical inclusion. -/ -lemma repJetGaugeGroupI_mem_LinearMatterSubmodule (U : JetGaugeGroupI) - {x : JetAlgebra} (hx : x ∈ LinearMatterSubmodule) : - repJetGaugeGroupI U x ∈ LinearMatterSubmodule := by - induction hx using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - rw [repJetGaugeGroupI_tmul_ι] - exact tmul_ι_mem_LinearMatterSubmodule _ _ - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- The submodule form of `repJetGaugeGroupI_mem_LinearMatterSubmodule`. -/ -lemma map_repJetGaugeGroupI_LinearMatterSubmodule_le (U : JetGaugeGroupI) : - LinearMatterSubmodule.map (repJetGaugeGroupI U) ≤ LinearMatterSubmodule := by - rintro x ⟨y, hy, rfl⟩ - exact repJetGaugeGroupI_mem_LinearMatterSubmodule U hy - -/-- The gauge action restricts to an automorphism of the linear-matter - submodule: the reverse inclusion holds by applying the bound to `U⁻¹`. -/ -lemma map_repJetGaugeGroupI_LinearMatterSubmodule (U : JetGaugeGroupI) : - LinearMatterSubmodule.map (repJetGaugeGroupI U) = LinearMatterSubmodule := by - refine le_antisymm (map_repJetGaugeGroupI_LinearMatterSubmodule_le U) fun x hx => ?_ - exact ⟨repJetGaugeGroupI U⁻¹ x, - repJetGaugeGroupI_mem_LinearMatterSubmodule U⁻¹ hx, - repJetGaugeGroupI.self_inv_apply U x⟩ - -/-- The embedded field-strength derivatives are gauge invariant. -/ -lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by - rw [fieldStrengthDeriv, repJetGaugeGroupI_tmul, - BBoson.JetAlgebra.repJetGaugeGroupI_fieldStrengthDeriv, - show LeptonSinglet.JetAlgebra.repJetGaugeGroupI U (1 : LeptonSinglet.JetAlgebra) = 1 from - map_one (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U))] - - -/-! - -## Covariance of the covariant derivatives - -The covariant derivatives of the charged lepton transform through the -hypercharge character of the value of the gauge jet at the base point alone: -`ρ_U (D_l ψ_α) = u(0)⁶ • D_l ψ_α`, with no derivative contributions. - -The proof works on the lepton-linear model of the `ψ`-sector: B-boson -polynomials tensored with a single unconjugated lepton component function. On -this model the gauge action `ρ`, the covariant step `D_μ`, and a family of -Maurer–Cartan anomaly operators `N_{s,μ}` satisfy a closed commutation algebra: - -* `ρ ∘ D_μ = D_μ ∘ ρ + ρ ∘ N_{[],μ}`, -* `N_{s,μ} ∘ D_ν = D_ν ∘ N_{s,μ} + N_{ν::s,μ}`, -* `N_{s,μ} ψ = 0` and `ρ ψ = u(0)⁶ • ψ`, - -so by induction every anomaly operator annihilates every covariant derivative, -and covariance propagates along the covariant-derivative recursion. - --/ - -variable {W : Type*} [AddCommGroup W] [Module ℂ W] - -/-- The linear-matter model over a matter target `W`: B-boson polynomials - tensored with a single matter component function. -/ -abbrev MatterLinear (W : Type*) [AddCommGroup W] [Module ℂ W] := - (ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) - - -/-- The derivative action of a jet on component functions valued in any target - `W`, acting on the derivative symbols. -/ -noncomputable def actionC (χ : JetRing) : - (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := - TensorProduct.map (DerivAlgebraComplex.jetRingAction χ) LinearMap.id - -/-- The derivative-symbol shift on component functions valued in any target - `W`. -/ -noncomputable def shiftC (ν : Fin 1 ⊕ Fin 3) : - (DerivAlgebraComplex ⊗[ℂ] W) →ₗ[ℂ] (DerivAlgebraComplex ⊗[ℂ] W) := - TensorProduct.map (DerivAlgebraComplex.deriv ν) LinearMap.id - -lemma actionC_shiftC (χ : JetRing) (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC χ (shiftC ν a) = - shiftC ν (actionC χ a) + actionC (MvPowerSeries.pderiv ℂ ν χ) a := by - have h : (actionC (W := W) χ) ∘ₗ (shiftC ν) = - (shiftC ν) ∘ₗ (actionC χ) + actionC (MvPowerSeries.pderiv ℂ ν χ) := by - simp only [actionC, shiftC] - rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, - show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.deriv ν) = - (DerivAlgebraComplex.deriv ν) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) + - DerivAlgebraComplex.jetRingAction (MvPowerSeries.pderiv ℂ ν χ) from - LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_deriv χ ν b, - TensorProduct.map_add_left] - exact LinearMap.congr_fun h a - -lemma actionC_comm (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC χ (actionC ψ a) = actionC ψ (actionC χ a) := by - have h : (actionC (W := W) χ) ∘ₗ (actionC ψ) = (actionC ψ) ∘ₗ (actionC χ) := by - simp only [actionC] - rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, - show (DerivAlgebraComplex.jetRingAction χ) ∘ₗ (DerivAlgebraComplex.jetRingAction ψ) = - (DerivAlgebraComplex.jetRingAction ψ) ∘ₗ (DerivAlgebraComplex.jetRingAction χ) from - LinearMap.ext fun b => DerivAlgebraComplex.jetRingAction_comm χ ψ b] - exact LinearMap.congr_fun h a - -lemma actionC_mul (χ ψ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (χ * ψ) a = actionC χ (actionC ψ a) := by - have h : actionC (W := W) (χ * ψ) = (actionC χ) ∘ₗ (actionC ψ) := by - simp only [actionC] - rw [← TensorProduct.map_comp, LinearMap.id_comp, - DerivAlgebraComplex.jetRingAction_mul] - exact LinearMap.congr_fun h a - -lemma actionC_C (c : ℂ) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (MvPowerSeries.C c : JetRing) a = c • a := by - have h : actionC (W := W) (MvPowerSeries.C c : JetRing) = c • LinearMap.id := by - rw [actionC, DerivAlgebraComplex.jetRingAction_C, TensorProduct.map_smul_left, - TensorProduct.map_id] - rw [h] - rfl - -/-- The embedding of a lepton component function into the lepton jet algebra. -/ -noncomputable def leptonComponentIncl : - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] LeptonSinglet.JetAlgebra := - (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule LeptonSinglet))) - -lemma leptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : - leptonComponentIncl a = - ExteriorAlgebra.ι ℂ ((a, 0) : LeptonSinglet.JetComponentSpace) := rfl - -/-- The inclusion of the lepton-linear elements into the lepton–gauge-sector jet algebra. -/ -noncomputable def leptonLinearIncl : - MatterLinear (Module.Dual ℂ LeptonSinglet) →ₗ[ℂ] JetAlgebra := - TensorProduct.map LinearMap.id leptonComponentIncl - -lemma leptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ LeptonSinglet) : - leptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ⱼ leptonComponentIncl a := rfl - -/-- The derivative action of a jet on the zeroth-order lepton component: the - scalar action of its value at the base point. -/ -lemma actionC_one_tmul (χ : JetRing) (φ : W) : - actionC χ ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) = - MvPowerSeries.constantCoeff χ • - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) := by - rw [actionC, TensorProduct.map_tmul, DerivAlgebraComplex.jetRingAction_apply_one, - LinearMap.id_coe, id_eq, TensorProduct.smul_tmul'] - -/-! - -### The linear-matter model, uniformly in the matter species - -The covariance argument depends on the matter species only through two -parameters: the jet `χ` through which the gauge group acts on the matter -component functions, and the coupling `c` in the covariant step -`D_μ = ∂_μ + c B_μ`. They are tied together by the single hypothesis - -`∂_ν χ = -c · (mcShiftSeries U ν []) · χ` - -which is exactly what makes the anomaly cancel. Everything below is stated once, -for a general matter target `W`, and instantiated at each species: for the -charged lepton `χ = u^6`, `c = -6i`, and for its conjugate `χ = star u ^ 6`, -`c = +6i`, the hypothesis in both cases being `pderiv_pow_unitary_mcShiftSeries` -and its conjugate. - --/ - -/-- The covariant step `D_μ = ∂_μ + c B_μ` on the linear-matter model. -/ -noncomputable def covStepM (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : - MatterLinear W →ₗ[ℂ] MatterLinear W := - TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) - LinearMap.id + - TensorProduct.map LinearMap.id (shiftC μ) + - c • TensorProduct.map (LinearMap.mulLeft ℂ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ))) LinearMap.id - -lemma covStepM_tmul (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - covStepM c μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ₜ[ℂ] a + - p ⊗ₜ[ℂ] shiftC μ a + - c • ((((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB {} μ)) * p) ⊗ₜ[ℂ] a) := by - simp [covStepM] - -/-- The gauge action on the linear-matter model, acting on the matter factor - through the jet `χ`. -/ -noncomputable def repM (U : JetGaugeGroupI) (χ : JetRing) : - MatterLinear W →ₗ[ℂ] MatterLinear W := - TensorProduct.map (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) (actionC χ) - -lemma repM_tmul (U : JetGaugeGroupI) (χ : JetRing) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - repM U χ (p ⊗ₜ[ℂ] a) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ₜ[ℂ] actionC χ a := by - simp [repM] - -/-- The Maurer–Cartan anomaly operators on the linear-matter model. -/ -noncomputable def anomalyM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : MatterLinear W →ₗ[ℂ] MatterLinear W := - TensorProduct.map (LinearMap.baseChange ℂ - (BBoson.JetAlgebra.mcDeriv U (↑s + {μ}))) LinearMap.id + - (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • LinearMap.id - - c • TensorProduct.map LinearMap.id (actionC (BBoson.mcShiftSeries U μ s)) - -lemma anomalyM_tmul (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] W) : - anomalyM U c s μ (p ⊗ₜ[ℂ] a) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.mcDeriv U (↑s + {μ})) p) ⊗ₜ[ℂ] a + - (c * ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ↑s μ)) : ℝ) : ℂ)) • (p ⊗ₜ[ℂ] a) - - c • (p ⊗ₜ[ℂ] actionC (BBoson.mcShiftSeries U μ s) a) := by - simp [anomalyM] - -/-- The shift series commutes with any other jet action. -/ -lemma actionC_mcShiftSeries_comm (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (s : List (Fin 1 ⊕ Fin 3)) (χ : JetRing) (a : DerivAlgebraComplex ⊗[ℂ] W) : - actionC (BBoson.mcShiftSeries U μ s) (actionC χ a) = - actionC χ (actionC (BBoson.mcShiftSeries U μ s) a) := - actionC_comm _ _ a - -/-- The base vector of the model: a matter component function with trivial - derivative history and unit B-boson coefficient. -/ -noncomputable def baseM (φ : W) : MatterLinear W := - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) ⊗ₜ[ℂ] - ((1 : SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule)) ⊗ₜ[ℂ] φ) - -/-- The covariant derivative in the model. -/ -noncomputable def DM (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : MatterLinear W := - l.foldr (fun μ x => covStepM c μ x) (baseM φ) - -lemma DM_cons (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : - DM c (μ :: l) φ = covStepM c μ (DM c l φ) := rfl - -/-- Multiplication by the unit of the complexified B-boson jet algebra. -/ -lemma one_mul_complex (z : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra)) * z = z := by - induction z using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [mul_add, ha, hb] - | tmul c b => simp [tmul_mul_tmul] - -/-- The gauge action commutes with the covariant step up to the gauge action of - the zeroth anomaly operator. This is where the hypothesis relating `χ` and `c` - is used, and the only place it is needed. -/ -lemma repM_covStepM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) - (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = - MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) - (μ : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : - repM U χ (covStepM c μ x) = - covStepM c μ (repM U χ x) + repM U χ (anomalyM U c [] μ x) := by - have key : (repM U χ) ∘ₗ (covStepM (W := W) c μ) = - (covStepM c μ) ∘ₗ (repM U χ) + (repM U χ) ∘ₗ (anomalyM U c [] μ) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, - anomalyM_tmul, map_add, map_smul, map_sub, - repM_tmul, Multiset.coe_nil, Multiset.empty_eq_zero, zero_add] - simp only [BBoson.JetAlgebra.complexRepJetGaugeGroupI_baseChange_jetDeriv, - actionC_shiftC, hχ, actionC_mul, actionC_C, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofGenerator, - actionC_mcShiftSeries_comm] - have hdist : ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator - (BBoson.JetGenerators.dB 0 μ) + - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB 0 μ)) * - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p + - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB 0 μ)) : ℝ) : ℂ) • - BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := by - rw [add_mul, smul_mul_assoc, one_mul_complex] - simp only [hdist] - simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', - TensorProduct.tmul_smul, smul_add, smul_smul] - push_cast - module - exact LinearMap.congr_fun key x - -/-- The anomaly operators commute with the covariant step up to the anomaly - operator with the derivative direction appended to its history. -/ -lemma anomalyM_covStepM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) (x : MatterLinear W) : - anomalyM U c s μ (covStepM c ν x) = - covStepM c ν (anomalyM U c s μ x) + anomalyM U c (ν :: s) μ x := by - have hT : ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) + {ν} = - (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) + {μ} := by - rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by - rw [Multiset.singleton_add, Multiset.cons_coe]] - ac_rfl - have hshift : BBoson.JetGenerators.shiftMulti ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) - (BBoson.JetGenerators.dB {} ν) = - BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν := by - rw [BBoson.JetGenerators.shiftMulti_dB] - congr 1 - have hm : BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB ((↑s : Multiset (Fin 1 ⊕ Fin 3)) + {μ}) ν)) = - BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) := by - rw [BBoson.mcShift_basis_dB_symm, show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = - ↑s + {ν} from by rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by - rw [Multiset.singleton_add, Multiset.cons_coe]]; ac_rfl] - have key : (anomalyM U c s μ) ∘ₗ (covStepM (W := W) c ν) = - (covStepM c ν) ∘ₗ (anomalyM U c s μ) + anomalyM U c (ν :: s) μ := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, LinearMap.add_apply, covStepM_tmul, - anomalyM_tmul, map_add, map_smul, map_sub, BBoson.mcShiftSeries_cons] - simp only [BBoson.JetAlgebra.mcDeriv_baseChange_jetDeriv, hT, actionC_shiftC, - BBoson.JetAlgebra.mcDeriv_baseChange_mul, - BBoson.JetAlgebra.mcDeriv_baseChange_ofGenerator, hshift, hm] - have hdist : (((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra))) * p = - ((BBoson.mcShift U (BBoson.JetComponentSpace.basis - (BBoson.JetGenerators.dB (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) μ)) : ℝ) : ℂ) • - p := by - rw [smul_mul_assoc, one_mul_complex] - simp only [hdist] - simp only [TensorProduct.tmul_add, TensorProduct.add_tmul, ← TensorProduct.smul_tmul', - smul_add, smul_smul] - module - exact LinearMap.congr_fun key x - -/-- The anomaly operators annihilate the base vector. -/ -lemma anomalyM_baseM (U : JetGaugeGroupI) (c : ℂ) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : W) : anomalyM U c s μ (baseM φ) = 0 := by - rw [baseM, anomalyM_tmul, LinearMap.baseChange_tmul] - simp only [BBoson.JetAlgebra.mcDeriv_one, TensorProduct.tmul_zero, tmul_zero, - TensorProduct.zero_tmul, zero_tmul, actionC_one_tmul, - BBoson.constantCoeff_mcShiftSeries, - TensorProduct.tmul_smul, smul_smul, zero_add] - module - -/-- The gauge action on the base vector is the value of `χ` at the base point. -/ -lemma repM_baseM (U : JetGaugeGroupI) (χ : JetRing) (φ : W) : - repM U χ (baseM φ) = MvPowerSeries.constantCoeff χ • baseM φ := by - rw [baseM, repM_tmul, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul] - simp only [BBoson.JetAlgebra.repJetGaugeGroupI_apply_one, actionC_one_tmul, - TensorProduct.tmul_smul] - -/-- Every anomaly operator annihilates every covariant derivative. -/ -lemma anomalyM_DM (U : JetGaugeGroupI) (c : ℂ) (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : - ∀ (s : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), anomalyM U c s μ (DM c l φ) = 0 := by - induction l with - | nil => exact fun s μ => anomalyM_baseM U c s μ φ - | cons ν l ih => - intro s μ - rw [DM_cons, anomalyM_covStepM, ih s μ, map_zero, zero_add, ih (ν :: s) μ] - -/-- Covariance of the covariant derivatives on the linear-matter model. -/ -lemma repM_DM (U : JetGaugeGroupI) (χ : JetRing) (c : ℂ) - (hχ : ∀ ν : Fin 1 ⊕ Fin 3, MvPowerSeries.pderiv ℂ ν χ = - MvPowerSeries.C (-c) * (BBoson.mcShiftSeries U ν [] * χ)) - (l : List (Fin 1 ⊕ Fin 3)) (φ : W) : - repM U χ (DM c l φ) = MvPowerSeries.constantCoeff χ • DM c l φ := by - induction l with - | nil => exact repM_baseM U χ φ - | cons ν l ih => - rw [DM_cons, repM_covStepM U χ c hχ, ih, map_smul, anomalyM_DM U c l φ [] ν, - map_zero, add_zero] - -/-! - -### Instantiation at the unconjugated lepton - --/ - -/-- The unconjugated lepton acts through `χ = u ^ 6` with coupling `c = -6i`. -/ -lemma pderiv_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : - MvPowerSeries.pderiv ℂ ν (((U.2.2 : unitary JetRing) : JetRing) ^ 6) = - MvPowerSeries.C (-(-(6 : ℂ) * Complex.I)) * - (BBoson.mcShiftSeries U ν [] * ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by - rw [BBoson.pderiv_pow_unitary_mcShiftSeries] - norm_num - -/-- The inclusion intertwines the covariant steps. -/ -lemma covariantStep_leptonLinearIncl (μ : Fin 1 ⊕ Fin 3) - (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : - covariantStep μ (leptonLinearIncl x) = - leptonLinearIncl (covStepM (-(6 : ℂ) * Complex.I) μ x) := by - have key : (covariantStep μ) ∘ₗ leptonLinearIncl = - leptonLinearIncl ∘ₗ (covStepM (-(6 : ℂ) * Complex.I) μ) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, covStepM_tmul, - leptonComponentIncl_apply, covariantStep_apply, map_add, map_smul, - jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, - LeptonSinglet.JetComponentSpace.jetDeriv_inl', ofGenerator, shiftC, - tmul_mul_tmul, one_mul] - module - exact LinearMap.congr_fun key x - -/-- The inclusion intertwines the gauge actions. -/ -lemma repJetGaugeGroupI_leptonLinearIncl (U : JetGaugeGroupI) - (x : MatterLinear (Module.Dual ℂ LeptonSinglet)) : - repJetGaugeGroupI U (leptonLinearIncl x) = - leptonLinearIncl (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by - have key : (repJetGaugeGroupI U) ∘ₗ leptonLinearIncl = - leptonLinearIncl ∘ₗ (repM U (((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, leptonLinearIncl_tmul, repM_tmul, - leptonComponentIncl_apply, repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl', - actionC] - exact LinearMap.congr_fun key x - -/-- The covariant derivatives are the images of their linear-matter models. -/ -lemma Dψ_eq_leptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α = leptonLinearIncl (DM (-(6 : ℂ) * Complex.I) l - (LeptonSinglet.basis.dualBasis α)) := by - induction l with - | nil => - rw [Dψ_nil, show DM (-(6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.dualBasis α) = - baseM (LeptonSinglet.basis.dualBasis α) from rfl, baseM, leptonLinearIncl_tmul, - leptonComponentIncl_apply] - simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, - LeptonSinglet.JetComponentSpace.basis_dψ_nil] - | cons ν l ih => - rw [Dψ_cons, ih, covariantStep_leptonLinearIncl] - rfl - -/-- Covariance of the covariant derivatives of the charged lepton: a jet of - gauge transformations acts on `D_l ψ_α` through the hypercharge character of - its value at the base point alone, with no derivative contributions. This is - the statement that the covariant derivative of a charged field is again a - charged field of the same charge. -/ -lemma repJetGaugeGroupI_Dψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI U (Dψ l α) = U.eval.2.2 ^ 6 • Dψ l α := by - have hval : ((U.eval.2.2 : unitary ℂ) : ℂ) = - MvPowerSeries.constantCoeff ((U.2.2 : unitary JetRing) : JetRing) := rfl - rw [Dψ_eq_leptonLinearIncl, repJetGaugeGroupI_leptonLinearIncl, - repM_DM U _ _ (pderiv_pow_six U), map_smul, ← Dψ_eq_leptonLinearIncl, - Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] - -/-! - -## Covariant derivatives of the conjugate lepton - -The conjugate lepton `ψ̄` carries the opposite hypercharge: its component -functions transform through the conjugate-contragredient power series -`(star u) ^ 6`, so under a jet gauge transformation `∂_μ ψ̄_α` shifts by -`+ 6 i mc_μ ψ̄_α` and the covariant step is `D̄_μ = ∂_μ - 6 i B_μ`. - -The covariance proof mirrors the unconjugated case on the conjugate-linear -model, with the coupling `6 i` replaced by `- 6 i` throughout. - --/ - -/-- The embedding of a conjugate lepton component function into the lepton jet - algebra. -/ -noncomputable def conjLeptonComponentIncl : - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] - LeptonSinglet.JetAlgebra := - (ExteriorAlgebra.ι ℂ) ∘ₗ (LinearMap.inr ℂ - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ LeptonSinglet) (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet))) - -lemma conjLeptonComponentIncl_apply (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : - conjLeptonComponentIncl a = - ExteriorAlgebra.ι ℂ ((0, a) : LeptonSinglet.JetComponentSpace) := rfl - -/-- The inclusion of the conjugate-linear elements into the lepton–gauge-sector jet algebra. -/ -noncomputable def conjLeptonLinearIncl : - MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet)) →ₗ[ℂ] JetAlgebra := - TensorProduct.map LinearMap.id conjLeptonComponentIncl - -lemma conjLeptonLinearIncl_tmul (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (a : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule LeptonSinglet)) : - conjLeptonLinearIncl (p ⊗ₜ[ℂ] a) = p ⊗ⱼ conjLeptonComponentIncl a := rfl - -/-- The conjugate lepton acts through `χ = star u ^ 6` with coupling `c = +6i`. -/ -lemma pderiv_star_pow_six (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) : - MvPowerSeries.pderiv ℂ ν (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) = - MvPowerSeries.C (-((6 : ℂ) * Complex.I)) * - (BBoson.mcShiftSeries U ν [] * star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) := by - rw [BBoson.pderiv_pow_unitary_star_mcShiftSeries] - norm_num - -/-- The inclusion intertwines the conjugate covariant steps. -/ -lemma covariantStepBar_conjLeptonLinearIncl (μ : Fin 1 ⊕ Fin 3) - (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : - covariantStepBar μ (conjLeptonLinearIncl x) = - conjLeptonLinearIncl (covStepM ((6 : ℂ) * Complex.I) μ x) := by - have key : (covariantStepBar μ) ∘ₗ conjLeptonLinearIncl = - conjLeptonLinearIncl ∘ₗ (covStepM ((6 : ℂ) * Complex.I) μ) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, covStepM_tmul, - conjLeptonComponentIncl_apply, covariantStepBar_apply, map_add, map_smul, - jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_ι, - LeptonSinglet.JetComponentSpace.jetDeriv_inr', ofGenerator, shiftC, - tmul_mul_tmul, one_mul] - exact LinearMap.congr_fun key x - -/-- The inclusion intertwines the gauge actions. -/ -lemma repJetGaugeGroupI_conjLeptonLinearIncl (U : JetGaugeGroupI) - (x : MatterLinear (Module.Dual ℂ (ConjModule LeptonSinglet))) : - repJetGaugeGroupI U (conjLeptonLinearIncl x) = - conjLeptonLinearIncl (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6) x) := by - have key : (repJetGaugeGroupI U) ∘ₗ conjLeptonLinearIncl = - conjLeptonLinearIncl ∘ₗ (repM U (star ((U.2.2 : unitary JetRing) : JetRing) ^ 6)) := by - refine TensorProduct.ext' fun p a => ?_ - simp only [LinearMap.comp_apply, conjLeptonLinearIncl_tmul, repM_tmul, - conjLeptonComponentIncl_apply, repJetGaugeGroupI_tmul', LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - ExteriorAlgebra.map_apply_ι, LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr', - actionC] - exact LinearMap.congr_fun key x - -/-- The conjugate covariant derivatives are the images of their linear-matter - models. -/ -lemma Dbarψ_eq_conjLeptonLinearIncl (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α = conjLeptonLinearIncl (DM ((6 : ℂ) * Complex.I) l - (LeptonSinglet.basis.conj.dualBasis α)) := by - induction l with - | nil => - rw [Dbarψ_nil, show DM ((6 : ℂ) * Complex.I) [] (LeptonSinglet.basis.conj.dualBasis α) = - baseM (LeptonSinglet.basis.conj.dualBasis α) from rfl, baseM, - conjLeptonLinearIncl_tmul, conjLeptonComponentIncl_apply] - simp only [ofGenerator, LeptonSinglet.JetAlgebra.ofGenerator, - LeptonSinglet.JetComponentSpace.basis_dbarψ, DerivAlgebraComplex.basis_nil] - | cons ν l ih => - rw [Dbarψ_cons, ih, covariantStepBar_conjLeptonLinearIncl] - rfl - -/-- Covariance of the covariant derivatives of the conjugate lepton: a jet of - gauge transformations acts on `D̄_l ψ̄_α` through the conjugate hypercharge - character of its value at the base point alone. -/ -lemma repJetGaugeGroupI_Dbarψ (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - repJetGaugeGroupI U (Dbarψ l α) = (star U.eval.2.2) ^ 6 • Dbarψ l α := by - have hval : ((star U.eval.2.2 : unitary ℂ) : ℂ) = - MvPowerSeries.constantCoeff (star ((U.2.2 : unitary JetRing) : JetRing)) := by - rw [Unitary.coe_star, JetRing.constantCoeff_star] - rfl - rw [Dbarψ_eq_conjLeptonLinearIncl, repJetGaugeGroupI_conjLeptonLinearIncl, - repM_DM U _ _ (pderiv_star_pow_six U), map_smul, ← Dbarψ_eq_conjLeptonLinearIncl, - Submonoid.smul_def, SubmonoidClass.coe_pow, hval, map_pow] - -/-! - -## C. The invariant generators and the gauge action as an algebra homomorphism - -The field strengths of the B boson, embedded in the lepton–gauge-sector jet algebra, are exactly -invariant; the covariant derivatives of the lepton and of its conjugate transform -by the hypercharge characters `u(0)^6` and `u(0)^{-6}` of the value of the gauge -jet at the base point. The gauge invariants of the lepton–gauge-sector jet algebra are contained -in the algebra generated by these three families. - --/ - -/-! - -### The gauge action as an algebra homomorphism, and the intertwining - --/ - -/-- The complexified B-boson gauge action as an algebra homomorphism. -/ -noncomputable def complexRepAlgHom (U : JetGaugeGroupI) : - (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] (ℂ ⊗[ℝ] BBoson.JetAlgebra) := - AlgHom.ofLinearMap (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) - (by - rw [Algebra.TensorProduct.one_def, BBoson.JetAlgebra.complexRepJetGaugeGroupI_tmul, - BBoson.JetAlgebra.repJetGaugeGroupI_apply_one]) - (BBoson.JetAlgebra.complexRepJetGaugeGroupI_mul U) - -@[simp] -lemma complexRepAlgHom_apply (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - complexRepAlgHom U p = BBoson.JetAlgebra.complexRepJetGaugeGroupI U p := rfl - -/-- The gauge action as an algebra homomorphism. -/ -noncomputable def repAlgHom (U : JetGaugeGroupI) : JetAlgebra →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.map (complexRepAlgHom U) - (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) - -lemma repAlgHom_tmul (U : JetGaugeGroupI) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repAlgHom U (p ⊗ⱼ l) = (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ - (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U) l) := rfl - -lemma repJetGaugeGroupI_eq_repAlgHom (U : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI U x = repAlgHom U x := by - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb] - | tmul p l => - rw [repJetGaugeGroupI_tmul'] - rfl - -/-- The gauge action is multiplicative (term-level form avoiding elaboration - blowups on the tensor stack). -/ -lemma repJetGaugeGroupI_mul' (U : JetGaugeGroupI) (a b : JetAlgebra) : - repJetGaugeGroupI U (a * b) = - repJetGaugeGroupI U a * repJetGaugeGroupI U b := - (repJetGaugeGroupI_eq_repAlgHom U (a * b)).trans - ((map_mul (repAlgHom U) a b).trans - (congrArg₂ (· * ·) (repJetGaugeGroupI_eq_repAlgHom U a).symm - (repJetGaugeGroupI_eq_repAlgHom U b).symm)) - -set_option maxHeartbeats 400000 in -/-- On gauge jets with trivial value at the base point, the covariant elements - are exactly invariant, so the gauge action intertwines the covariant - substitution with the B-boson action alone. -/ -lemma repJetGaugeGroupI_covSubst (U : JetGaugeGroupI) (hU : U.eval.2.2 = 1) - (x : JetAlgebra) : - repJetGaugeGroupI U (covSubst x) = - covSubst (mapB (BBoson.JetAlgebra.complexRepJetGaugeGroupI U) x) := by - have hcovfix : (repAlgHom U).comp covExtHom = covExtHom := by - refine ExteriorAlgebra.hom_ext (LinearMap.ext fun m => ?_) - simp only [AlgHom.comp_toLinearMap, LinearMap.coe_comp, Function.comp_apply, - AlgHom.toLinearMap_apply, covExtHom_ι] - have hlin : (repAlgHom U).toLinearMap ∘ₗ covMap = covMap := by - refine LeptonSinglet.JetComponentSpace.basis.ext fun g => ?_ - rw [LinearMap.comp_apply, covMap_basis, AlgHom.toLinearMap_apply, - ← repJetGaugeGroupI_eq_repAlgHom] - cases g with - | dψ s α => - rw [show covGenerator (.dψ s α) = Dψ (sortList s) α from rfl, - repJetGaugeGroupI_Dψ, hU, one_pow, one_smul] - | dbarψ s α => - rw [show covGenerator (.dbarψ s α) = Dbarψ (sortList s) α from rfl, - repJetGaugeGroupI_Dbarψ, hU, star_one, one_pow, one_smul] - exact LinearMap.congr_fun hlin m - induction x using JetAlgebra.induction_on with - | zero => rw [map_zero, map_zero, map_zero, map_zero] - | add a b ha hb => rw [map_add, map_add, map_add, map_add, ha, hb] - | tmul p l => - rw [mapB_tmul, covSubst_tmul, covSubst_tmul] - rw [repJetGaugeGroupI_eq_repAlgHom] - have hm : repAlgHom U ((p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * covExtHom l) = - repAlgHom U (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) * - repAlgHom U (covExtHom l) := map_mul _ _ _ - have h1 : repAlgHom U (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepJetGaugeGroupI U p) ⊗ⱼ 1 := by - rw [repAlgHom_tmul] - congr 1 - exact (ExteriorAlgebra.map _).map_one - have h2 : repAlgHom U (covExtHom l) = covExtHom l := AlgHom.congr_fun hcovfix l - rw [hm, h1, h2] - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean deleted file mode 100644 index d6f9fbf84..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/Closure.lean +++ /dev/null @@ -1,140 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction -/-! -# The second derivatives of the field strength span a subrepresentation - -The span of the monomials `∂_ρ ∂_τ F_{μν}` is carried to itself by both group actions on the jet -algebra. Statements proved for the span may therefore be combined with any operator built from -the group elements, an average or a projector among them, without leaving the span. - -*Both closures are the covariance of the field strength.* Under the Lorentz group each of the -four indices of `∂_ρ ∂_τ F_{μν}` is rotated into the others and nothing else -(`repLorentzGroup_fieldStrengthDeriv_pair`). Under the gauge group the field strength and its -derivatives are fixed outright (`repJetGaugeGroupI_fieldStrengthDeriv`), so the span is fixed -pointwise. - -## Key results - -- `JetAlgebra.repLorentzGroup_mem_span_fieldStrengthDeriv_pair` : the span is closed under the - Lorentz action, and `map_repLorentzGroup_span_fieldStrengthDeriv_pair` states this as an - equality of submodules. -- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair` : the gauge group - fixes the span pointwise, whence `map_repJetGaugeGroupI_span_fieldStrengthDeriv_pair`. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## A. The generators - --/ - -/-- A second derivative of a field strength lies in their span. -/ -lemma fieldStrengthDeriv_pair_mem_span (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {ρ, τ} μ ν ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := - Submodule.subset_span ⟨ρ, τ, μ, ν, rfl⟩ - -/-- The Lorentz action carries a second derivative of a field strength into their span: each of - the four indices is rotated into the others. -/ -lemma repLorentzGroup_fieldStrengthDeriv_pair_mem_span (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by - rw [repLorentzGroup_fieldStrengthDeriv_pair] - exact Submodule.sum_mem _ fun r _ => Submodule.sum_mem _ fun s _ => - Submodule.sum_mem _ fun a _ => Submodule.sum_mem _ fun b _ => - Submodule.smul_mem _ _ (fieldStrengthDeriv_pair_mem_span r s a b) - -/-! - -## B. Closure under the Lorentz group - --/ - -/-- **The span of the second derivatives of the field strength is closed under the Lorentz - action.** -/ -lemma repLorentzGroup_mem_span_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : - repLorentzGroup Λ x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨ρ, τ, μ, ν, rfl⟩ := hy - exact repLorentzGroup_fieldStrengthDeriv_pair_mem_span Λ ρ τ μ ν - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- **The span of the second derivatives of the field strength is a subrepresentation of the - Lorentz group.** -/ -lemma map_repLorentzGroup_span_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) : - Submodule.map (repLorentzGroup Λ) - (Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) = - Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repLorentzGroup_mem_span_fieldStrengthDeriv_pair Λ hu - · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_fieldStrengthDeriv_pair Λ⁻¹ hx, - repLorentzGroup.self_inv_apply Λ x⟩ - -/-! - -## C. Closure under the gauge group - --/ - -/-- **The gauge group fixes the span of the second derivatives of the field strength - pointwise.** -/ -lemma repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair (U : JetGaugeGroupI) - {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : - repJetGaugeGroupI U x = x := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨ρ, τ, μ, ν, rfl⟩ := hy - exact repJetGaugeGroupI_fieldStrengthDeriv U {ρ, τ} μ ν - | zero => rw [map_zero] - | add u v _ _ hu hv => rw [map_add, hu, hv] - | smul c u _ hu => rw [map_smul, hu] - -/-- **The span of the second derivatives of the field strength is closed under the gauge - action.** -/ -lemma repJetGaugeGroupI_mem_span_fieldStrengthDeriv_pair (U : JetGaugeGroupI) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) : - repJetGaugeGroupI U x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by - rw [repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair U hx] - exact hx - -/-- **The span of the second derivatives of the field strength is a subrepresentation of the - gauge group.** -/ -lemma map_repJetGaugeGroupI_span_fieldStrengthDeriv_pair (U : JetGaugeGroupI) : - Submodule.map (repJetGaugeGroupI U) - (Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) = - Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repJetGaugeGroupI_mem_span_fieldStrengthDeriv_pair U hu - · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_fieldStrengthDeriv_pair U hx⟩ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean deleted file mode 100644 index 80acb67fb..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeDoubleDeriv/LinearIndependence.lean +++ /dev/null @@ -1,145 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeKineticTerm.LinearIndependence -/-! -# A dual family for the second derivatives of the field strength - -The monomials `∂_ρ ∂_τ F_{μν}` are not linearly independent — the Bianchi identity -`∂_ρ F_{μν} + ∂_μ F_{νρ} + ∂_ν F_{ρμ} = 0` holds identically, `F` being built from `B` — but the -coefficients of a combination of them, read in the gauge-field generators `∂_s B_μ`, can still -be extracted one by one. This file constructs the functionals that extract them. - -*The construction is the first polarization.* A field-strength derivative is linear, not -quadratic, in the gauge-field generators, so where `GaugeKineticTerm.LinearIndependence` needs a -second difference of `symEval` this file needs only the first: `symEval φ - symEval 0` is linear, -kills the constants and sends a degree-one monomial `ι v` to `φ v`. Tensored with the -augmentation of the lepton factor it gives `gaugeDerivDual`, dual to a single gauge-field -generator, and `gaugeDerivDual_fieldStrengthDeriv` evaluates it on a field-strength derivative of -any order. - -The second polarization of the same construction — the dual family of the photon pairs — is -recorded here to vanish on the field-strength derivatives -(`gaugePairDual_fieldStrengthDeriv`): a second difference is blind to a linear term. This is -what separates this sector from the photon pairs. - -## Key results - -- `gaugeDerivDual_fieldStrengthDeriv` : the value of the dual on `∂_s F_{μν}`. -- `gaugePairDual_fieldStrengthDeriv` : the photon-pair duals vanish on a single field-strength - derivative. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## A. The first polarization - --/ - -/-- The first difference of `symEval`: the functional on the B-boson factor dual to the - degree-one monomial `φ`. It kills the constants, where the first difference of an affine - function is blind. -/ -noncomputable def symLinDual (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : - (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ := - (symEval φ).toLinearMap - (symEval 0).toLinearMap - -lemma symLinDual_tmul_ofGenerator (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (g : BBoson.JetGenerators) : - symLinDual φ (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) = - φ (BBoson.JetComponentSpace.basis g) := by - simp only [symLinDual, LinearMap.sub_apply, AlgHom.toLinearMap_apply, symEval_tmul_ofGenerator, - LinearMap.zero_apply, sub_zero] - -/-- The functional on the jet algebra dual to a single gauge-field generator: the first - polarization on the B-boson factor tensored with the augmentation on the lepton factor. -/ -noncomputable def gaugeLinDual (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : JetAlgebra →ₗ[ℂ] ℂ := - TensorProduct.lift (((LinearMap.mul ℂ ℂ).comp (symLinDual φ)).compl₂ augL.toLinearMap) - -@[simp] -lemma gaugeLinDual_tmul (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - gaugeLinDual φ (a ⊗ⱼ b) = symLinDual φ a * augL b := rfl - -lemma gaugeLinDual_ofGenerator (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - gaugeLinDual φ (ofGenerator (JetGenerators.dB s μ)) = - φ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB s μ)) := by - rw [ofGenerator_B_eq, gaugeLinDual_tmul, symLinDual_tmul_ofGenerator, map_one, mul_one] - -/-! - -## B. The dual family for the field-strength derivatives - --/ - -/-- The coefficient with which the field-strength derivative `∂_s F_{μ ν}` contains the - gauge-field generator `∂_{p.1} B_{p.2}`. -/ -noncomputable def fsDerivCoeff (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : ℂ := - (if s + {μ} = p.1 ∧ ν = p.2 then 1 else 0) - (if s + {ν} = p.1 ∧ μ = p.2 then 1 else 0) - -/-- The functional dual to the gauge-field generator indexed by `p`. -/ -noncomputable def gaugeDerivDual (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : - JetAlgebra →ₗ[ℂ] ℂ := - gaugeLinDual ((BBoson.JetComponentSpace.basis.coord - (BBoson.JetGenerators.dB p.1 p.2)).smulRight (1 : ℂ)) - - -/-- **`gaugeDerivDual` is dual to the gauge-field generators.** Its value on a field-strength - derivative of any order is the antisymmetric coefficient `fsDerivCoeff`. -/ -@[simp] -lemma gaugeDerivDual_fieldStrengthDeriv (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - gaugeDerivDual p (fieldStrengthDeriv s μ ν) = fsDerivCoeff p s μ ν := by - simp only [fieldStrengthDeriv_eq_sub, map_sub, gaugeDerivDual, gaugeLinDual_ofGenerator, - Module.Basis.coord_apply, Module.Basis.repr_self, LinearMap.smulRight_apply, - Finsupp.single_apply, BBoson.JetGenerators.dB.injEq, fsDerivCoeff, ite_smul, one_smul, - zero_smul] - -/-! - -## C. The photon-pair duals are blind to a single field strength - --/ - -/-- A second difference vanishes on a degree-one monomial. -/ -lemma symPairDual_tmul_ofGenerator_eq_zero (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (g : BBoson.JetGenerators) : - symPairDual φ ψ (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) = 0 := by - simp only [symPairDual, LinearMap.add_apply, LinearMap.sub_apply, AlgHom.toLinearMap_apply, - symEval_tmul_ofGenerator, LinearMap.add_apply, LinearMap.zero_apply] - ring - -/-- **The photon-pair duals vanish on a field-strength derivative.** The dual family of - `GaugeKineticTerm` reads a quadratic coefficient, and a field-strength derivative is linear in - the gauge-field generators. -/ -@[simp] -lemma gaugePairDual_fieldStrengthDeriv (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - gaugePairDual φ ψ (fieldStrengthDeriv s μ ν) = 0 := by - simp only [fieldStrengthDeriv_eq_sub, map_sub, ofGenerator_B_eq, gaugePairDual_tmul, - symPairDual_tmul_ofGenerator_eq_zero, zero_mul, sub_zero, sub_self] - -@[simp] -lemma gaugeDual_fieldStrengthDeriv (p q : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - gaugeDual p q (fieldStrengthDeriv s μ ν) = 0 := - gaugePairDual_fieldStrengthDeriv _ _ s μ ν - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean deleted file mode 100644 index e5f936803..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/Closure.lean +++ /dev/null @@ -1,152 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction -/-! -# The photon pairs span a subrepresentation - -The span of the products `F_{μν} F_{μ'ν'}` of two field strengths is carried to itself by both -group actions on the jet algebra. Statements proved for the span — that its boost-weight-zero -part is spanned by the Maxwell and theta terms, say — may therefore be combined with any operator -built from the group elements, an average or a projector among them, without leaving the span. - -*Both closures are the covariance of the field strength.* Under the Lorentz group each `F_{μν}` -goes to a combination of the `F_{ab}` (`repLorentzGroup_fieldStrengthDeriv_nil`), so a product of -two of them goes to a combination of products, the Lorentz action being multiplicative. Under the -gauge group each `F_{μν}` is not merely carried into the span but fixed — the field strength is -gauge invariant (`repJetGaugeGroupI_fieldStrengthDeriv`) — so the span is fixed pointwise. - -## Key results - -- `JetAlgebra.repLorentzGroup_mem_span_fieldStrength_mul` : the span is closed under the Lorentz - action, and `map_repLorentzGroup_span_fieldStrength_mul` states this as an equality of - submodules. -- `JetAlgebra.repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul` : the gauge group fixes the - span pointwise, whence `map_repJetGaugeGroupI_span_fieldStrength_mul`. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-! - -## A. The generators - --/ - -/-- A product of two field strengths lies in the span of the photon pairs. -/ -lemma fieldStrength_mul_mem_span (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν' ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := - Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩ - -/-- The Lorentz action carries a photon pair into the span of the photon pairs: each factor goes - to a combination of field strengths, and the action is multiplicative. -/ -lemma repLorentzGroup_fieldStrength_mul_mem_span (Λ : SL(2,ℂ)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν') ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by - rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, - repLorentzGroup_fieldStrengthDeriv_nil] - simp only [sum_mul', mul_sum', smul_mul_assoc, mul_smul_comm] - exact Submodule.sum_mem _ fun a _ => Submodule.sum_mem _ fun b _ => - Submodule.smul_mem _ _ (Submodule.sum_mem _ fun c _ => Submodule.sum_mem _ fun d _ => - Submodule.smul_mem _ _ (fieldStrength_mul_mem_span c d a b)) - -/-! - -## B. Closure under the Lorentz group - --/ - -/-- **The span of the photon pairs is closed under the Lorentz action.** -/ -lemma repLorentzGroup_mem_span_fieldStrength_mul (Λ : SL(2,ℂ)) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : - repLorentzGroup Λ x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨μ, ν, μ', ν', rfl⟩ := hy - exact repLorentzGroup_fieldStrength_mul_mem_span Λ μ ν μ' ν' - | zero => rw [map_zero]; exact Submodule.zero_mem _ - | add u v _ _ hu hv => rw [map_add]; exact Submodule.add_mem _ hu hv - | smul c u _ hu => rw [map_smul]; exact Submodule.smul_mem _ _ hu - -/-- **The span of the photon pairs is a subrepresentation of the Lorentz group.** Closure under - every element and its inverse upgrades `repLorentzGroup_mem_span_fieldStrength_mul` to an - equality. -/ -lemma map_repLorentzGroup_span_fieldStrength_mul (Λ : SL(2,ℂ)) : - Submodule.map (repLorentzGroup Λ) - (Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) = - Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repLorentzGroup_mem_span_fieldStrength_mul Λ hu - · exact ⟨repLorentzGroup Λ⁻¹ x, repLorentzGroup_mem_span_fieldStrength_mul Λ⁻¹ hx, - repLorentzGroup.self_inv_apply Λ x⟩ - -/-! - -## C. Closure under the gauge group - --/ - -/-- **The gauge group fixes the span of the photon pairs pointwise.** The field strength of the - abelian gauge field is gauge invariant. -/ -lemma repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul (U : JetGaugeGroupI) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : - repJetGaugeGroupI U x = x := by - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨μ, ν, μ', ν', rfl⟩ := hy - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, - repJetGaugeGroupI_fieldStrengthDeriv] - | zero => rw [map_zero] - | add u v _ _ hu hv => rw [map_add, hu, hv] - | smul c u _ hu => rw [map_smul, hu] - -/-- **The span of the photon pairs is closed under the gauge action.** -/ -lemma repJetGaugeGroupI_mem_span_fieldStrength_mul (U : JetGaugeGroupI) {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) : - repJetGaugeGroupI U x ∈ - Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by - rw [repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul U hx] - exact hx - -/-- **The span of the photon pairs is a subrepresentation of the gauge group.** -/ -lemma map_repJetGaugeGroupI_span_fieldStrength_mul (U : JetGaugeGroupI) : - Submodule.map (repJetGaugeGroupI U) - (Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) = - Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by - refine le_antisymm ?_ fun x hx => ?_ - · rintro x ⟨u, hu, rfl⟩ - exact repJetGaugeGroupI_mem_span_fieldStrength_mul U hu - · exact ⟨x, hx, repJetGaugeGroupI_apply_of_mem_span_fieldStrength_mul U hx⟩ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean deleted file mode 100644 index 6ac787a4f..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/GaugeKineticTerm/LinearIndependence.lean +++ /dev/null @@ -1,160 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FieldStrength -/-! -# A dual family for the photon pairs - -The products `F_{μν} F_{μ'ν'}` of two field strengths are not linearly independent — the field -strengths are antisymmetric and commute — but the coefficients of a combination of them can -still be read off one by one. This file constructs the functionals that read them: `gaugeDual p q` -picks out the coefficient of the product of the field strengths indexed by the generator pairs -`p` and `q`. Statements about an explicit span of photon pairs — the boost-weight-zero part of -the gauge sector, say — then reduce to linear algebra on coefficients. - -*The construction is a polarization.* The B-boson factor of the jet algebra is a symmetric -algebra, so a linear functional `φ` on the jet component space extends to an algebra map -`symEval φ` to `ℂ`, quadratic on the degree-two part. The second difference - -`symEval (φ + ψ) - symEval φ - symEval ψ + symEval 0` - -is linear, vanishes in degrees zero and one, and sends a degree-two monomial `u v` to -`φ u * ψ v + ψ u * φ v`: the dual of the symmetric product. Tensoring with the augmentation of -the lepton factor gives `gaugePairDual` on the whole jet algebra, and taking for `φ`, `ψ` the -coordinates of two gauge-field generators gives `gaugeDual`. - -## Key results - -- `gaugePairDual` : the polarization of `symEval`, dual to a symmetric product of generators. -- `gaugeDual_fieldStrength_mul` : the value of `gaugeDual p q` on a product of two field - strengths, in terms of the antisymmetric coefficient `fsCoeff`. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## A. Evaluating the B-boson factor - --/ - -/-- The algebra map on the B-boson factor sending each gauge-field generator to its value - under `φ`. -/ -noncomputable def symEval (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : - (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₐ[ℂ] ℂ := - Algebra.TensorProduct.lift (AlgHom.id ℂ ℂ) (SymmetricAlgebra.lift φ) - (fun _ _ => Commute.all _ _) - -@[simp] -lemma symEval_tmul_ofGenerator (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (g : BBoson.JetGenerators) : - symEval φ (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) = - φ (BBoson.JetComponentSpace.basis g) := by - simp [symEval, BBoson.JetAlgebra.ofGenerator] - -/-- The augmentation of the lepton factor: the algebra map to `ℂ` sending every lepton - generator to zero. -/ -noncomputable def augL : LeptonSinglet.JetAlgebra →ₐ[ℂ] ℂ := - ExteriorAlgebra.lift ℂ ⟨0, fun m => by simp⟩ - -/-! - -## B. The polarization - --/ - -/-- The second difference of `symEval`: the functional on the B-boson factor dual to the - degree-two monomial paired with `φ` and `ψ`. It is linear where `symEval` is quadratic, and - vanishes on the degrees zero and one where the second difference of a quadratic is blind. -/ -noncomputable def symPairDual (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : - (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ := - (symEval (φ + ψ)).toLinearMap - (symEval φ).toLinearMap - (symEval ψ).toLinearMap + - (symEval 0).toLinearMap - -lemma symPairDual_tmul_ofGenerator_mul (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (g h : BBoson.JetGenerators) : - symPairDual φ ψ ((1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) * - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator h)) = - φ (BBoson.JetComponentSpace.basis g) * ψ (BBoson.JetComponentSpace.basis h) + - ψ (BBoson.JetComponentSpace.basis g) * φ (BBoson.JetComponentSpace.basis h) := by - simp only [symPairDual, LinearMap.add_apply, LinearMap.sub_apply, AlgHom.toLinearMap_apply, - map_mul, symEval_tmul_ofGenerator, LinearMap.add_apply, LinearMap.zero_apply] - ring - -/-- The functional on the jet algebra dual to a symmetric product of two gauge-field - generators: the polarization on the B-boson factor tensored with the augmentation on the - lepton factor. -/ -noncomputable def gaugePairDual (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : - JetAlgebra →ₗ[ℂ] ℂ := - TensorProduct.lift (((LinearMap.mul ℂ ℂ).comp (symPairDual φ ψ)).compl₂ augL.toLinearMap) - -@[simp] -lemma gaugePairDual_tmul (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - gaugePairDual φ ψ (a ⊗ⱼ b) = symPairDual φ ψ a * augL b := rfl - -lemma gaugePairDual_ofGenerator_mul (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (s t : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - gaugePairDual φ ψ (ofGenerator (JetGenerators.dB s μ) * - ofGenerator (JetGenerators.dB t ν)) = - φ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB s μ)) * - ψ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB t ν)) + - ψ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB s μ)) * - φ (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB t ν)) := by - rw [ofGenerator_B_eq, ofGenerator_B_eq, JetAlgebra.tmul_mul_tmul, mul_one, - gaugePairDual_tmul, symPairDual_tmul_ofGenerator_mul, map_one, mul_one] - -/-! - -## C. The dual family for the photon pairs - --/ - -/-- The coefficient with which the field strength `F_{a b}` contains the gauge-field generator - `∂_{p.1} B_{p.2}`: `+1`, `-1` or `0`, by the antisymmetry of `F`. -/ -noncomputable def fsCoeff (p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) (a b : Fin 1 ⊕ Fin 3) : ℂ := - (if a = p.1 ∧ b = p.2 then 1 else 0) - (if b = p.1 ∧ a = p.2 then 1 else 0) - -/-- The functional dual to the product of the two field strengths indexed by the generator - pairs `p` and `q`. -/ -noncomputable def gaugeDual (p q : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : JetAlgebra →ₗ[ℂ] ℂ := - gaugePairDual ((BBoson.JetComponentSpace.basis.coord - (BBoson.JetGenerators.dB {p.1} p.2)).smulRight (1 : ℂ)) - ((BBoson.JetComponentSpace.basis.coord - (BBoson.JetGenerators.dB {q.1} q.2)).smulRight (1 : ℂ)) - -/-- A first-order field strength written out on the generators. -/ -lemma fieldStrengthDeriv_nil_eq (a b : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {} a b = - ofGenerator (JetGenerators.dB {a} b) - ofGenerator (JetGenerators.dB {b} a) := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, TensorProduct.tmul_sub, sub_tmul] - rfl - -/-- **`gaugeDual` is dual to the photon pairs.** The value on a product of two field strengths - is the symmetric pairing of the two antisymmetric coefficients. -/ -@[simp] -lemma gaugeDual_fieldStrength_mul (p q : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (a b c d : Fin 1 ⊕ Fin 3) : - gaugeDual p q (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} c d) = - fsCoeff p a b * fsCoeff q c d + fsCoeff q a b * fsCoeff p c d := by - simp only [fieldStrengthDeriv_nil_eq, sub_mul, mul_sub, map_sub, gaugeDual, - gaugePairDual_ofGenerator_mul, Module.Basis.coord_apply, Module.Basis.repr_self, - LinearMap.smulRight_apply, Finsupp.single_apply, BBoson.JetGenerators.dB.injEq, - Multiset.singleton_inj, fsCoeff, ite_smul, one_smul, zero_smul] - ring - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean deleted file mode 100644 index 3db8f4b38..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Hypercharge.lean +++ /dev/null @@ -1,685 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FermionicParity -public import Mathlib.Algebra.Polynomial.Laurent -/-! -# Grading due to hypercharge - -The JetAlgebra can be mapped into a `LaurentPolynomial` mapping generators -to exponents of the generator `T` corresponding to their hypercharge. -This map is an algebra map. For example `ψ ↦ T^6 • ψ` - -In the same way which mass dimension is defined through `Polynomial`, -we define a grading on `JetAlgebra` through `LaurentPolynomial`. - -This grading can be used to define a projection from `JetAlgebra` to itself -picking out only the subspace of terms which are charge singlets. - -Every term which is invariant is stable under this projection. -This result trivially generalizes to any theory based on the SM gauge group. - -*Sign convention*: charges are normalized as `6Y`, and the generators of the jet algebra are -the *component functions* of the fields, which transform contragrediently to them. The -charged-lepton singlet is the `(1, 1)_{-6}` field, so its component function `ψ_α` carries -`+6`, matching `repJetGaugeGroupI_dψ_nil`; the conjugate component function `ψ̄_α` carries -`-6`, and the B-boson component functions carry `0`. - -Only the constant gauge transformations are used below, and they already suffice: a gauge jet -mixes derivative orders but not species, so the constant part is where the charge is read off. - -## i. Overview - -Every generator is an eigenvector of the constant `U(1)` gauge transformations, with the -character `z ↦ z ^ q` for `q` its hypercharge. Recording that exponent in the formal variable -`T` of a Laurent polynomial gives an algebra map `hyperchargePoly`, whose `T ^ q` coefficient -is the part of an element of hypercharge `q`. - -The constant gauge action is then literally the evaluation of the hypercharge polynomial at -the gauge parameter, `repJetGaugeGroupI_ofConstant_eq_evalUnit`. Invariance therefore says -that a fixed Laurent expression takes the same value at every point of the unit circle, which -by independence of the circle characters forces every charged component to vanish. - -## ii. Key results - -- `Hypercharge` : the hypercharge of a generator. -- `JetAlgebra.hyperchargePoly` : the hypercharge Laurent polynomial. -- `JetAlgebra.hyperchargeSubmodule` : the submodule of elements of a given hypercharge. -- `JetAlgebra.neutralProjection` : the projection onto the charge singlets. -- `JetAlgebra.mem_hyperchargeSubmodule_zero_of_isInvariant` : an invariant term is a charge - singlet. -- `JetAlgebra.neutralProjection_of_isInvariant` : an invariant term is fixed by the - projection. - -## iii. Table of contents - -- A. Laurent polynomials over a noncommutative ring -- B. The hypercharge Laurent polynomial -- C. The hypercharge grading -- D. Evaluation, and the constant gauge action -- E. Independence of the circle characters -- F. Invariant terms are charge singlets - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel Matrix MatrixGroups LorentzGroup LaurentPolynomial - -/-- The hypercharge of a generator of the lepton–gauge-sector jet algebra, normalized as `6Y`. - The generators are component functions, so they carry the charge contragredient to that of - the field: `ψ_α` carries `+6` and `ψ̄_α` carries `-6`, while the B-boson component functions - are neutral. -/ -def Hypercharge : JetGenerators → ℤ - | JetGenerators.dB _ _ => 0 - | JetGenerators.dψ _ _ => 6 - | JetGenerators.dbarψ _ _ => -6 - -/-- The hypercharge of a generator of the charged-lepton factor. -/ -def leptonHypercharge : LeptonSinglet.JetGenerators → ℤ - | LeptonSinglet.JetGenerators.dψ _ _ => 6 - | LeptonSinglet.JetGenerators.dbarψ _ _ => -6 - -namespace JetAlgebra - -/-! - -## A. Laurent polynomials over a noncommutative ring - -The coefficient ring here is the jet algebra, which is not commutative, so the parts of the -`LaurentPolynomial` API that assume commutativity — in particular `eval₂` — are unavailable. -The three facts below are all that is needed: how two Laurent monomials multiply and add, and -that `C` of a central element is central. - --/ - -section Laurent - -variable {R : Type*} [Semiring R] - -/-- Laurent monomials multiply by adding exponents. -/ -lemma C_mul_T_mul_C_mul_T (a b : R) (m n : ℤ) : - C a * T m * (C b * T n) = C (a * b) * T (m + n) := by - rw [← single_eq_C_mul_T, ← single_eq_C_mul_T, ← single_eq_C_mul_T, - AddMonoidAlgebra.single_mul_single] - -/-- Laurent monomials of equal exponent add coefficientwise. -/ -lemma C_mul_T_add_C_mul_T (a b : R) (n : ℤ) : - C a * T n + C b * T n = C (a + b) * T n := by - rw [← add_mul, ← map_add] - -/-- `C` of a central element is central: multiplication by `C a` acts on each coefficient. -/ -lemma commute_C_of_central {a : R} (ha : ∀ z : R, Commute a z) (p : R[T;T⁻¹]) : - Commute (C a) p := by - induction p using AddMonoidAlgebra.induction_linear with - | zero => exact Commute.zero_right _ - | add p q hp hq => exact hp.add_right hq - | single m r => - show C a * _ = _ * C a - rw [← single_eq_C, AddMonoidAlgebra.single_mul_single, - AddMonoidAlgebra.single_mul_single, zero_add, add_zero, ha r] - -end Laurent - -/-- `LaurentPolynomial.C` as an algebra map. It is not `algebraMap`, which is unavailable - because the jet algebra is not commutative. -/ -noncomputable def CAlgHom : JetAlgebra →ₐ[ℂ] LaurentPolynomial JetAlgebra where - toFun := C - map_one' := map_one C - map_mul' := map_mul C - map_zero' := map_zero C - map_add' := map_add C - commutes' r := (LaurentPolynomial.algebraMap_apply r).symm - -@[simp] -lemma CAlgHom_apply (x : JetAlgebra) : CAlgHom x = C x := rfl - -/-- The bosonic factor is central in the jet algebra: it is a tensor factor, and the - complexified B-boson jet algebra is commutative. -/ -lemma commute_inclB (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (x : JetAlgebra) : - Commute (inclB a) x := by - induction x using JetAlgebra.induction_on with - | zero => exact Commute.zero_right _ - | add u v hu hv => exact hu.add_right hv - | tmul b l => - show inclB a * (b ⊗ⱼ l) = (b ⊗ⱼ l) * inclB a - rw [show inclB a = a ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, tmul_mul_tmul, - tmul_mul_tmul, mul_one, one_mul, mul_comm a b] - -/-! - -## B. The hypercharge Laurent polynomial - -The bosonic factor is neutral, so on it the hypercharge polynomial is the constant polynomial. -On the fermionic factor the generators are eigenvectors of charge `±6`; sending each to -`C · T ^ (±6)` squares to zero, because the two exponents cancel in the cross terms, so it -extends to the exterior algebra. - --/ - -/-- The generator map of the hypercharge polynomial on the charged-lepton component space. -/ -noncomputable def hyperchargeι : - LeptonSinglet.JetComponentSpace →ₗ[ℂ] LaurentPolynomial JetAlgebra := - LeptonSinglet.JetComponentSpace.basis.constr ℂ fun j => - C (inclL (LeptonSinglet.JetAlgebra.ofGenerator j)) * T (leptonHypercharge j) - -@[simp] -lemma hyperchargeι_basis (j : LeptonSinglet.JetGenerators) : - hyperchargeι (LeptonSinglet.JetComponentSpace.basis j) = - C (inclL (LeptonSinglet.JetAlgebra.ofGenerator j)) * T (leptonHypercharge j) := by - rw [hyperchargeι, Module.Basis.constr_basis] - -/-- The generator map squares to zero: the exponents of a cross term cancel, leaving the - anticommutator of two exterior generators. -/ -lemma hyperchargeι_mul_self (v : LeptonSinglet.JetComponentSpace) : - hyperchargeι v * hyperchargeι v = 0 := by - set B := (LinearMap.mul ℂ (LaurentPolynomial JetAlgebra)).compl₁₂ hyperchargeι hyperchargeι - with hBdef - have hB : B + B.flip = 0 := - LinearMap.ext_basis LeptonSinglet.JetComponentSpace.basis - LeptonSinglet.JetComponentSpace.basis fun j k => by - simp only [hBdef, LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, - LinearMap.mul_apply', LinearMap.zero_apply, hyperchargeι_basis] - rw [C_mul_T_mul_C_mul_T, C_mul_T_mul_C_mul_T, - add_comm (leptonHypercharge k) (leptonHypercharge j), C_mul_T_add_C_mul_T, - ← map_mul inclL, ← map_mul inclL, ← map_add inclL, - show LeptonSinglet.JetAlgebra.ofGenerator j * - LeptonSinglet.JetAlgebra.ofGenerator k + - LeptonSinglet.JetAlgebra.ofGenerator k * - LeptonSinglet.JetAlgebra.ofGenerator j = 0 from - ExteriorAlgebra.ι_add_mul_swap _ _, - map_zero, map_zero, zero_mul] - have h2 : (2 : ℂ) • (hyperchargeι v * hyperchargeι v) = 0 := by - rw [two_smul] - exact LinearMap.congr_fun (LinearMap.congr_fun hB v) v - simpa [smul_smul] using congrArg (fun y => (2⁻¹ : ℂ) • y) h2 - -/-- The hypercharge polynomial on the charged-lepton factor. -/ -noncomputable def hyperchargePolyL : - LeptonSinglet.JetAlgebra →ₐ[ℂ] LaurentPolynomial JetAlgebra := - ExteriorAlgebra.lift ℂ ⟨hyperchargeι, hyperchargeι_mul_self⟩ - -@[simp] -lemma hyperchargePolyL_ofGenerator (j : LeptonSinglet.JetGenerators) : - hyperchargePolyL (LeptonSinglet.JetAlgebra.ofGenerator j) = - C (inclL (LeptonSinglet.JetAlgebra.ofGenerator j)) * T (leptonHypercharge j) := by - rw [show LeptonSinglet.JetAlgebra.ofGenerator j = - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis j) from rfl, - hyperchargePolyL, ExteriorAlgebra.lift_ι_apply, hyperchargeι_basis] - rfl - -/-- The hypercharge Laurent polynomial: the `ℂ`-algebra map sending each generator `j` to - `j * T ^ q`, where `q` is the hypercharge of `j`. The coefficient of `T ^ q` in the - hypercharge polynomial of an element is its part of hypercharge `q`. -/ -noncomputable def hyperchargePoly : JetAlgebra →ₐ[ℂ] LaurentPolynomial JetAlgebra := - Algebra.TensorProduct.lift (CAlgHom.comp inclB) hyperchargePolyL - fun a _ => commute_C_of_central (commute_inclB a) _ - -@[simp] -lemma hyperchargePoly_tmul (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - hyperchargePoly (a ⊗ⱼ l) = C (inclB a) * hyperchargePolyL l := rfl - -/-- On the bosonic factor the hypercharge polynomial is constant: the B boson is neutral. -/ -lemma hyperchargePoly_inclB (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - hyperchargePoly (inclB a) = C (inclB a) := by - rw [show hyperchargePoly (inclB a) = C (inclB a) * hyperchargePolyL 1 from rfl, - map_one, mul_one] - -/-- On the fermionic factor the hypercharge polynomial is the charged-lepton one. -/ -lemma hyperchargePoly_inclL (l : LeptonSinglet.JetAlgebra) : - hyperchargePoly (inclL l) = hyperchargePolyL l := by - rw [show hyperchargePoly (inclL l) = - C (inclB (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra)) * hyperchargePolyL l from rfl, - map_one, map_one, one_mul] - -/-- Each generator is sent to `j * T ^ q`, where `q` is its hypercharge. -/ -@[simp] -lemma hyperchargePoly_ofGenerator (j : JetGenerators) : - hyperchargePoly [j]ₐ = C [j]ₐ * T (Hypercharge j) := by - cases j with - | dB s μ => - rw [show ([JetGenerators.dB s μ]ₐ : JetAlgebra) = inclB ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) from rfl, - hyperchargePoly_inclB, show Hypercharge (JetGenerators.dB s μ) = 0 from rfl, T_zero, - mul_one] - | dψ s α => - rw [show ([JetGenerators.dψ s α]ₐ : JetAlgebra) = inclL - (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α)) from rfl, - hyperchargePoly_inclL, hyperchargePolyL_ofGenerator] - rfl - | dbarψ s α => - rw [show ([JetGenerators.dbarψ s α]ₐ : JetAlgebra) = inclL - (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α)) - from rfl, - hyperchargePoly_inclL, hyperchargePolyL_ofGenerator] - rfl - -/-! - -## C. The hypercharge grading - --/ - -/-- The submodule of elements of hypercharge `q`: those `x` whose hypercharge polynomial is - `x * T ^ q`. -/ -def hyperchargeSubmodule (q : ℤ) : Submodule ℂ JetAlgebra where - carrier := {x | hyperchargePoly x = C x * T q} - add_mem' {a b} ha hb := by - simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ - rw [ha, hb, add_mul] - zero_mem' := by simp - smul_mem' c x hx := by - simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ - rw [hx, Algebra.smul_def, Algebra.smul_def, LaurentPolynomial.algebraMap_apply, ← mul_assoc, - ← map_mul] - -@[simp] -lemma mem_hyperchargeSubmodule {q : ℤ} {x : JetAlgebra} : - x ∈ hyperchargeSubmodule q ↔ hyperchargePoly x = C x * T q := Iff.rfl - -/-- Hypercharges add under multiplication. -/ -lemma mul_mem_hyperchargeSubmodule {p q : ℤ} {x y : JetAlgebra} - (hx : x ∈ hyperchargeSubmodule p) (hy : y ∈ hyperchargeSubmodule q) : - x * y ∈ hyperchargeSubmodule (p + q) := by - simp only [mem_hyperchargeSubmodule, map_mul] at hx hy ⊢ - rw [hx, hy, C_mul_T_mul_C_mul_T, map_mul] - -/-- Hypercharges add under multiplication, and `1` is neutral. -/ -instance : SetLike.GradedMonoid hyperchargeSubmodule where - one_mem := by - show hyperchargePoly 1 = C 1 * T 0 - rw [T_zero, mul_one, map_one, map_one] - mul_mem _ _ _ _ hx hy := mul_mem_hyperchargeSubmodule hx hy - -/-- The generator `j` has hypercharge `Hypercharge j`. -/ -lemma ofGenerator_mem_hyperchargeSubmodule (j : JetGenerators) : - [j]ₐ ∈ hyperchargeSubmodule (Hypercharge j) := - hyperchargePoly_ofGenerator j - -/-- The hypercharge-`q` component of an element: the coefficient of `T ^ q` in its hypercharge - polynomial. -/ -noncomputable def chargeComponent (q : ℤ) : JetAlgebra →ₗ[ℂ] JetAlgebra where - toFun x := (hyperchargePoly x).coeff q - map_add' x y := by rw [map_add]; rfl - map_smul' c x := by rw [map_smul]; rfl - -@[simp] -lemma chargeComponent_apply (q : ℤ) (x : JetAlgebra) : - chargeComponent q x = (hyperchargePoly x).coeff q := rfl - -/-- On a homogeneous element the component of its own charge is the element itself. -/ -lemma chargeComponent_of_mem {q : ℤ} {x : JetAlgebra} (hx : x ∈ hyperchargeSubmodule q) : - chargeComponent q x = x := by - rw [chargeComponent_apply, mem_hyperchargeSubmodule.mp hx, ← single_eq_C_mul_T, - AddMonoidAlgebra.coeff_single, Finsupp.single_eq_same] - -/-- On a homogeneous element every other charge component vanishes. -/ -lemma chargeComponent_of_mem_ne {p q : ℤ} {x : JetAlgebra} (hpq : p ≠ q) - (hx : x ∈ hyperchargeSubmodule p) : chargeComponent q x = 0 := by - rw [chargeComponent_apply, mem_hyperchargeSubmodule.mp hx, ← single_eq_C_mul_T, - AddMonoidAlgebra.coeff_single, Finsupp.single_apply, if_neg hpq] - -/-- The projection onto the charge singlets: the part of hypercharge zero. -/ -noncomputable def neutralProjection : JetAlgebra →ₗ[ℂ] JetAlgebra := chargeComponent 0 - -lemma neutralProjection_apply (x : JetAlgebra) : - neutralProjection x = (hyperchargePoly x).coeff 0 := rfl - -/-! - -## D. Evaluation, and the constant gauge action - -Setting the formal variable to an invertible scalar gives an algebra map back to the jet -algebra. Evaluating at `1` recovers the element; evaluating at a unitary scalar `z` is exactly -the action of the constant gauge transformation with `U(1)` part `z`. - --/ - -/-- The character `k ↦ z ^ k` of a unit, valued in the jet algebra. -/ -noncomputable def charMonoidHom (z : ℂˣ) : Multiplicative ℤ →* JetAlgebra := - ((algebraMap ℂ JetAlgebra).toMonoidHom.comp (Units.coeHom ℂ)).comp (zpowersHom ℂˣ z) - -@[simp] -lemma charMonoidHom_apply (z : ℂˣ) (k : ℤ) : - charMonoidHom z (Multiplicative.ofAdd k) = algebraMap ℂ JetAlgebra ((z : ℂ) ^ k) := by - simp [charMonoidHom, Units.val_zpow_eq_zpow_val] - -/-- Evaluation of a Laurent polynomial at an invertible scalar. The jet algebra is not - commutative, so this is multiplicative only because the scalars are central. -/ -noncomputable def evalUnit (z : ℂˣ) : LaurentPolynomial JetAlgebra →ₐ[ℂ] JetAlgebra := - AddMonoidAlgebra.liftNCAlgHom (AlgHom.id ℂ JetAlgebra) (charMonoidHom z) - fun x k => by - rw [show charMonoidHom z k = - algebraMap ℂ JetAlgebra ((z : ℂ) ^ (Multiplicative.toAdd k)) from - charMonoidHom_apply z _] - exact (Algebra.commutes _ _).symm - -lemma evalUnit_single (z : ℂˣ) (k : ℤ) (a : JetAlgebra) : - evalUnit z (AddMonoidAlgebra.single k a) = ((z : ℂ) ^ k) • a := by - show AddMonoidAlgebra.liftNC _ _ _ = _ - rw [AddMonoidAlgebra.liftNC_single, charMonoidHom_apply] - show a * algebraMap ℂ JetAlgebra ((z : ℂ) ^ k) = _ - rw [← Algebra.commutes, ← Algebra.smul_def] - -@[simp] -lemma evalUnit_C_mul_T (z : ℂˣ) (k : ℤ) (a : JetAlgebra) : - evalUnit z (C a * T k) = ((z : ℂ) ^ k) • a := by - rw [← single_eq_C_mul_T, evalUnit_single] - -/-- Evaluation is the sum of the coefficients, weighted by the powers of the scalar. -/ -lemma evalUnit_eq_sum (z : ℂˣ) (p : LaurentPolynomial JetAlgebra) : - evalUnit z p = ∑ k ∈ p.coeff.support, ((z : ℂ) ^ k) • p.coeff k := by - have hsum : ∀ q : LaurentPolynomial JetAlgebra, - evalUnit z q = q.coeff.sum fun k a => ((z : ℂ) ^ k) • a := by - intro q - induction q using AddMonoidAlgebra.induction_linear with - | zero => simp - | add u v hu hv => - rw [map_add, hu, hv, AddMonoidAlgebra.coeff_add, - Finsupp.sum_add_index' (fun k => smul_zero _) fun k a b => smul_add _ a b] - | single m r => - rw [evalUnit_single, AddMonoidAlgebra.coeff_single, Finsupp.sum] - by_cases hr : r = 0 - · subst hr - simp - · rw [Finsupp.support_single m hr, Finset.sum_singleton, Finsupp.single_eq_same] - exact hsum p - -/-- Setting the formal variable to one recovers the original element. -/ -lemma evalUnit_one_hyperchargePoly (x : JetAlgebra) : evalUnit 1 (hyperchargePoly x) = x := by - have h : (evalUnit 1).comp hyperchargePoly = AlgHom.id ℂ JetAlgebra := by - refine algHom_ext fun j => ?_ - rw [AlgHom.comp_apply, hyperchargePoly_ofGenerator, evalUnit_C_mul_T] - simp - exact AlgHom.congr_fun h x - -/-- Every element is the sum of its charge components. -/ -lemma eq_sum_chargeComponent (x : JetAlgebra) : - x = ∑ k ∈ (hyperchargePoly x).coeff.support, chargeComponent k x := by - conv_lhs => rw [← evalUnit_one_hyperchargePoly x] - rw [evalUnit_eq_sum] - exact Finset.sum_congr rfl fun k _ => by simp - -/-- The `U(1)` part of a gauge-group element, as a unit of `ℂ`. -/ -noncomputable def u1Unit (g : GaugeGroupI) : ℂˣ where - val := (g.2.2 : ℂ) - inv := star (g.2.2 : ℂ) - val_inv := (Unitary.mem_iff.mp g.2.2.2).2 - inv_val := (Unitary.mem_iff.mp g.2.2.2).1 - -@[simp] -lemma u1Unit_val (g : GaugeGroupI) : ((u1Unit g : ℂˣ) : ℂ) = (g.2.2 : ℂ) := rfl - -lemma u1Unit_inv (g : GaugeGroupI) : - (((u1Unit g)⁻¹ : ℂˣ) : ℂ) = star (g.2.2 : ℂ) := rfl - -/-- The constant gauge action on the charged-lepton component space is diagonal on the - generator basis, with the hypercharge character as eigenvalue. -/ -lemma leptonSinglet_repJetGaugeGroupI_ofConstant_basis (g : GaugeGroupI) - (j : LeptonSinglet.JetGenerators) : - LeptonSinglet.JetComponentSpace.repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) - (LeptonSinglet.JetComponentSpace.basis j) = - ((u1Unit g : ℂ) ^ leptonHypercharge j) • LeptonSinglet.JetComponentSpace.basis j := by - have hu : ((((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing)) : JetRing) = - MvPowerSeries.C ((g.2.2 : ℂ)) := rfl - cases j with - | dψ s α => - rw [show leptonHypercharge (LeptonSinglet.JetGenerators.dψ s α) = (6 : ℕ) from rfl, - zpow_natCast, u1Unit_val, LeptonSinglet.JetComponentSpace.basis_dψ, - LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inl, hu, ← map_pow, - DerivAlgebraComplex.jetRingAction_C] - simp [TensorProduct.smul_tmul', Prod.smul_mk] - | dbarψ s α => - rw [show leptonHypercharge (LeptonSinglet.JetGenerators.dbarψ s α) = -(6 : ℕ) from rfl, - _root_.zpow_neg, zpow_natCast, ← inv_pow, ← Units.val_inv_eq_inv_val, u1Unit_inv, - LeptonSinglet.JetComponentSpace.basis_dbarψ, - LeptonSinglet.JetComponentSpace.repJetGaugeGroupI_inr, hu, JetRing.star_C, ← map_pow, - DerivAlgebraComplex.jetRingAction_C] - simp [TensorProduct.smul_tmul', Prod.smul_mk] - -/-- A jet of a constant gauge transformation acts on each generator by its hypercharge - character. -/ -lemma repJetGaugeGroupI_ofConstant_ofGenerator (g : GaugeGroupI) (j : JetGenerators) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) [j]ₐ = - ((u1Unit g : ℂ) ^ Hypercharge j) • [j]ₐ := by - cases j with - | dB s μ => - rw [show ([JetGenerators.dB s μ]ₐ : JetAlgebra) = inclB ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) from rfl, - show Hypercharge (JetGenerators.dB s μ) = 0 from rfl, zpow_zero, one_smul, - show inclB ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra) from rfl, - repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply_one] - | dψ s α => - rw [show ([JetGenerators.dψ s α]ₐ : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) from rfl, - repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - show LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α) = - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis - (LeptonSinglet.JetGenerators.dψ s α)) from rfl, - ExteriorAlgebra.map_apply_ι, leptonSinglet_repJetGaugeGroupI_ofConstant_basis, map_smul, - tmul_smul] - rfl - | dbarψ s α => - rw [show ([JetGenerators.dbarψ s α]ₐ : JetAlgebra) = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) from rfl, - repJetGaugeGroupI_tmul', BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant, - LeptonSinglet.JetAlgebra.repJetGaugeGroupI_apply, - show LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α) = - ExteriorAlgebra.ι ℂ (LeptonSinglet.JetComponentSpace.basis - (LeptonSinglet.JetGenerators.dbarψ s α)) from rfl, - ExteriorAlgebra.map_apply_ι, leptonSinglet_repJetGaugeGroupI_ofConstant_basis, map_smul, - tmul_smul] - rfl - -/-- The constant gauge action is the evaluation of the hypercharge polynomial at the gauge - parameter. This is the content of the hypercharge grading: the `U(1)` gauge group acts - through the formal variable alone. -/ -lemma repJetGaugeGroupI_ofConstant_eq_evalUnit (g : GaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = - evalUnit (u1Unit g) (hyperchargePoly x) := by - have h : repAlgHom (JetGaugeGroupI.ofConstant g) = - (evalUnit (u1Unit g)).comp hyperchargePoly := by - refine algHom_ext fun j => ?_ - rw [AlgHom.comp_apply, hyperchargePoly_ofGenerator, evalUnit_C_mul_T, - ← repJetGaugeGroupI_eq_repAlgHom, repJetGaugeGroupI_ofConstant_ofGenerator] - rw [repJetGaugeGroupI_eq_repAlgHom, h, AlgHom.comp_apply] - -/-! - -## E. Independence of the circle characters - -A finite Laurent combination of the characters `z ↦ z ^ k` that vanishes on the whole unit -circle has vanishing coefficients: after clearing the negative powers it becomes a polynomial -with infinitely many roots. - --/ - -/-- The unit-circle exponential is unitary. -/ -lemma exp_mul_I_mem_unitary (θ : ℝ) : - Complex.exp ((θ : ℂ) * Complex.I) ∈ unitary ℂ := by - have hstar : star (Complex.exp ((θ : ℂ) * Complex.I)) = - Complex.exp (-((θ : ℂ) * Complex.I)) := by - rw [show star (Complex.exp ((θ : ℂ) * Complex.I)) = - (starRingEnd ℂ) (Complex.exp ((θ : ℂ) * Complex.I)) from rfl, - ← Complex.exp_conj] - congr 1 - simp [Complex.conj_ofReal] - rw [Unitary.mem_iff] - constructor - · rw [hstar, ← Complex.exp_add, neg_add_cancel, Complex.exp_zero] - · rw [hstar, ← Complex.exp_add, add_neg_cancel, Complex.exp_zero] - -/-- The unit-circle exponentials are injective on `(0, 1)`. -/ -lemma exp_mul_I_injOn : - Set.InjOn (fun θ : ℝ => Complex.exp ((θ : ℂ) * Complex.I)) - (Set.Ioo (0 : ℝ) 1) := by - intro a ha b hb hab - rcases Complex.exp_eq_exp_iff_exists_int.mp hab with ⟨n, hn⟩ - have h2 : (a : ℂ) = (b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ)) := by - have h1 : (a : ℂ) * Complex.I = - ((b : ℂ) + (n : ℂ) * (2 * (Real.pi : ℂ))) * Complex.I := by - rw [hn] - ring - exact mul_right_cancel₀ Complex.I_ne_zero h1 - have h3 : a = b + (n : ℝ) * (2 * Real.pi) := by exact_mod_cast h2 - have hn0 : n = 0 := by - by_contra hne - have h4 : (1 : ℝ) ≤ |(n : ℝ)| := by exact_mod_cast Int.one_le_abs hne - have hπ : (2 : ℝ) ≤ Real.pi := Real.two_le_pi - have h5 : |a - b| < 1 := by - rw [abs_sub_lt_iff] - constructor <;> nlinarith [ha.1, ha.2, hb.1, hb.2] - rw [h3] at h5 - simp only [add_sub_cancel_left] at h5 - rw [abs_mul, abs_of_pos (by positivity : (0 : ℝ) < 2 * Real.pi)] at h5 - nlinarith - rw [hn0] at h3 - push_cast at h3 - linarith - -/-- Independence of the circle characters: a finite Laurent combination vanishing on the unit - circle has vanishing coefficients. -/ -lemma eq_zero_of_forall_circle_sum_zpow_smul_eq_zero {V : Type*} [AddCommGroup V] - [Module ℂ V] (s : Finset ℤ) (v : ℤ → V) - (h : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0) - {k : ℤ} (hk : k ∈ s) : v k = 0 := by - rw [← Module.forall_dual_apply_eq_zero_iff ℂ] - intro φ - have hne : s.Nonempty := ⟨k, hk⟩ - set n₀ : ℤ := -s.min' hne with hn₀ - have hshift : ∀ j ∈ s, 0 ≤ j + n₀ := fun j hj => by - have := s.min'_le j hj - omega - have heval : ∀ θ : ℝ, Polynomial.eval (Complex.exp ((θ : ℂ) * Complex.I)) - (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by - intro θ - have hz0 : Complex.exp ((θ : ℂ) * Complex.I) ≠ 0 := Complex.exp_ne_zero _ - have h2 := congrArg φ (h θ) - rw [map_sum, map_zero] at h2 - have h3 : ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by - rw [← h2] - exact Finset.sum_congr rfl fun j _ => by rw [map_smul]; rfl - have h4 : Complex.exp ((θ : ℂ) * Complex.I) ^ n₀ * - ∑ j ∈ s, Complex.exp ((θ : ℂ) * Complex.I) ^ j * φ (v j) = 0 := by - rw [h3, mul_zero] - rw [Finset.mul_sum] at h4 - rw [Polynomial.eval_finsetSum, ← h4] - refine Finset.sum_congr rfl fun j hj => ?_ - rw [Polynomial.eval_monomial, - show Complex.exp ((θ : ℂ) * Complex.I) ^ (j + n₀).toNat = - Complex.exp ((θ : ℂ) * Complex.I) ^ ((j + n₀) : ℤ) from by - rw [← zpow_natCast, Int.toNat_of_nonneg (hshift j hj)], - zpow_add₀ hz0] - ring - have hzero : (∑ j ∈ s, Polynomial.monomial (j + n₀).toNat (φ (v j))) = 0 := by - refine Polynomial.eq_zero_of_infinite_isRoot _ ?_ - refine Set.Infinite.mono ?_ - ((Set.Ioo_infinite (by norm_num : (0 : ℝ) < 1)).image exp_mul_I_injOn) - rintro z ⟨θ, _, rfl⟩ - exact heval θ - have hcoeff := congrArg (fun p => Polynomial.coeff p (k + n₀).toNat) hzero - rw [Polynomial.finsetSum_coeff] at hcoeff - rw [Finset.sum_eq_single k - (fun j hj hjk => by - rw [Polynomial.coeff_monomial, if_neg (fun heq => hjk (by - have h1 : j + n₀ = k + n₀ := by - rw [← Int.toNat_of_nonneg (hshift j hj), - ← Int.toNat_of_nonneg (hshift k hk), heq] - omega))]) - (fun hks => absurd hk hks)] at hcoeff - simpa using hcoeff - -/-- The constant `U(1)` gauge transformation at a unitary scalar. -/ -noncomputable def u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : GaugeGroupI := (1, 1, ⟨z, hz⟩) - -@[simp] -lemma u1Unit_u1Gauge (z : ℂ) (hz : z ∈ unitary ℂ) : - ((u1Unit (u1Gauge z hz) : ℂˣ) : ℂ) = z := rfl - -/-! - -## F. Invariant terms are charge singlets - -An invariant element is fixed by every constant gauge transformation, so its hypercharge -polynomial takes the same value at every point of the unit circle. By independence of the -circle characters its charged components all vanish, so it is homogeneous of hypercharge zero -and is fixed by the projection onto the charge singlets. - --/ - -/-- An element fixed by every constant gauge transformation is a charge singlet. -/ -lemma mem_hyperchargeSubmodule_zero_of_forall_repJetGaugeGroupI_ofConstant_eq {x : JetAlgebra} - (h : ∀ g : GaugeGroupI, repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x) : - x ∈ hyperchargeSubmodule 0 := by - set p := hyperchargePoly x with hp - set s : Finset ℤ := insert 0 p.coeff.support with hs - set v : ℤ → JetAlgebra := fun k => p.coeff k - (if k = 0 then x else 0) with hv - have hcirc : ∀ θ : ℝ, ∑ j ∈ s, (Complex.exp ((θ : ℂ) * Complex.I)) ^ j • v j = 0 := by - intro θ - set z : ℂ := Complex.exp ((θ : ℂ) * Complex.I) with hz - set g : GaugeGroupI := u1Gauge z (exp_mul_I_mem_unitary θ) with hg - have hsum : ∑ j ∈ s, z ^ j • p.coeff j = x := by - have h1 : evalUnit (u1Unit g) p = x := by - rw [hp, ← repJetGaugeGroupI_ofConstant_eq_evalUnit, h g] - rw [← h1, evalUnit_eq_sum, u1Unit_u1Gauge] - refine (Finset.sum_subset (Finset.subset_insert _ _) fun j _ hj => ?_).symm - rw [Finsupp.notMem_support_iff.mp hj, smul_zero] - have hx0 : ∑ j ∈ s, z ^ j • (if j = 0 then x else 0) = x := by - rw [Finset.sum_eq_single (0 : ℤ) (fun j _ hj => by simp [hj]) - (fun hns => absurd (Finset.mem_insert_self (0 : ℤ) _) hns)] - simp - have hsplit : ∑ j ∈ s, z ^ j • v j = - (∑ j ∈ s, z ^ j • p.coeff j) - ∑ j ∈ s, z ^ j • (if j = 0 then x else 0) := by - rw [← Finset.sum_sub_distrib] - exact Finset.sum_congr rfl fun j _ => by rw [hv]; exact smul_sub _ _ _ - rw [hsplit, hsum, hx0, sub_self] - have hzero : ∀ k ∈ s, v k = 0 := fun k hk => - eq_zero_of_forall_circle_sum_zpow_smul_eq_zero s v hcirc hk - have hcoeff0 : p.coeff 0 = x := by - have h0 := hzero 0 (Finset.mem_insert_self _ _) - rw [hv] at h0 - simpa using sub_eq_zero.mp (by simpa using h0) - have hcoeffk : ∀ k : ℤ, k ≠ 0 → p.coeff k = 0 := by - intro k hk - by_cases hks : k ∈ p.coeff.support - · have hkz := hzero k (Finset.mem_insert_of_mem hks) - rw [hv] at hkz - simpa [hk] using hkz - · exact Finsupp.notMem_support_iff.mp hks - rw [mem_hyperchargeSubmodule, ← hp, ← single_eq_C_mul_T] - refine LaurentPolynomial.ext fun k => ?_ - rw [AddMonoidAlgebra.coeff_single, Finsupp.single_apply] - by_cases hk : (0 : ℤ) = k - · rw [if_pos hk, ← hk, hcoeff0] - · rw [if_neg hk, hcoeffk k (fun h => hk h.symm)] - -/-- An invariant term is a charge singlet: it is homogeneous of hypercharge zero. -/ -lemma mem_hyperchargeSubmodule_zero_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : - x ∈ hyperchargeSubmodule 0 := - mem_hyperchargeSubmodule_zero_of_forall_repJetGaugeGroupI_ofConstant_eq fun _ => hx.1 _ - -/-- Every invariant term is stable under the projection onto the charge singlets. -/ -lemma neutralProjection_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) : - neutralProjection x = x := - chargeComponent_of_mem (mem_hyperchargeSubmodule_zero_of_isInvariant hx) - -/-- Every charged component of an invariant term vanishes. -/ -lemma chargeComponent_of_isInvariant {q : ℤ} (hq : q ≠ 0) {x : JetAlgebra} - (hx : IsInvariant x) : chargeComponent q x = 0 := - chargeComponent_of_mem_ne (fun h => hq h.symm) - (mem_hyperchargeSubmodule_zero_of_isInvariant hx) - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean deleted file mode 100644 index 42f553fae..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Grading/Irrep.lean +++ /dev/null @@ -1,21 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FermionicParity -public import Mathlib.Algebra.Polynomial.Laurent -/-! -# Grading by irreps - -We can grade the *covariant algebra* by irreducible representations of the -global gauge group and the Lorentz group. - -The irreps are determine the number of covariant derivatives acting on which field. - -This grading is invariant under the action of both the gauge transformation -and the Lorentz group. - --/ diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean deleted file mode 100644 index e55e3990c..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/IsInvariant.lean +++ /dev/null @@ -1,114 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.DerivativeOrder -/-! -# Invariance in the lepton–gauge-sector jet algebra - -An element of the jet algebra is invariant when it is fixed by the jet gauge group and by the -Lorentz group. This file defines that condition, collects the invariants into a submodule, -and characterises them: an element is invariant exactly when it lies in the algebra generated -by the field-strength derivatives and the covariant derivatives, is fixed by the constant -gauge transformations, and is Lorentz invariant. - -The forward direction is `mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq`, proved -through the derivative-order filtration; the backward direction holds because a jet of gauge -transformations acts on the covariant generators only through its value at the base point. --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open Matrix MatrixGroups - -/-! - -## A. The invariance condition - --/ - -def IsInvariant (x : JetAlgebra) : Prop := - (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) - ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) - -lemma IsInvariant.add {x y : JetAlgebra} (hx : IsInvariant x) (hy : IsInvariant y) : - IsInvariant (x + y) := by - constructor - · intro U - simp [hx.left, hy.left] - · intro Λ - simp [hx.right, hy.right] - -lemma IsInvariant.smul {x : JetAlgebra} (hx : IsInvariant x) (r : ℂ) : - IsInvariant (r • x) := by - constructor - · intro U - simp [hx.left] - · intro Λ - simp [hx.right] - -noncomputable def InvariantSubmodule : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x | IsInvariant x} - -lemma InvariantSubmodule.mem_iff_isInvariant (x : JetAlgebra) : - x ∈ InvariantSubmodule ↔ IsInvariant x := by - constructor - · intro hx - induction hx using Submodule.span_induction with - | mem y hy => exact hy - | zero => exact ⟨fun U => map_zero _, fun Λ => map_zero _⟩ - | add y z hy hz ihy ihz => - exact ⟨fun U => by rw [map_add, ihy.1 U, ihz.1 U], - fun Λ => by rw [map_add, ihy.2 Λ, ihz.2 Λ]⟩ - | smul c y hy ihy => - exact ⟨fun U => by rw [map_smul, ihy.1 U], - fun Λ => by rw [map_smul, ihy.2 Λ]⟩ - · exact fun hx => Submodule.subset_span hx - - -/-- Characterisation of the invariants of the lepton–gauge-sector jet algebra: an element is - invariant under the jet gauge group and the Lorentz group precisely when it lies in the - covariant subalgebra, is fixed by the constant gauge transformations, and is Lorentz - invariant. The forward direction is the classification theorem; the backward direction holds - because a jet of gauge transformations acts on the covariant generators only through its - value at the base point. -/ -lemma isInvariant_iff_mem_covariantAlgebra (x : JetAlgebra) : - IsInvariant x ↔ x ∈ CovariantAlgebra ∧ - (∀ g : GaugeGroupI, repJetGaugeGroupI (.ofConstant g) x = x) ∧ - (∀ Λ : SL(2, ℂ), repLorentzGroup Λ x = x) := by - constructor - · intro h - exact ⟨mem_covariantAlgebra_of_forall_repJetGaugeGroupI_eq x h.1, fun g => h.1 _, h.2⟩ - · rintro ⟨hmem, hconst, hlor⟩ - refine ⟨fun U => ?_, hlor⟩ - suffices hkey : repJetGaugeGroupI U x = - repJetGaugeGroupI (JetGaugeGroupI.ofConstant U.eval) x by - rw [hkey] - exact hconst U.eval - clear hconst hlor - induction hmem using CovariantAlgebra.induction_on with - | fieldStrength s μ ν => - rw [repJetGaugeGroupI_fieldStrengthDeriv, repJetGaugeGroupI_fieldStrengthDeriv] - | lepton l α => - rw [repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dψ, JetGaugeGroupI.eval_ofConstant] - | conjLepton l α => - rw [repJetGaugeGroupI_Dbarψ, repJetGaugeGroupI_Dbarψ, JetGaugeGroupI.eval_ofConstant] - | algebraMap r => - rw [Algebra.algebraMap_eq_smul_one, map_smul, map_smul, - repJetGaugeGroupI_apply_one, repJetGaugeGroupI_apply_one] - | add u v _ _ ihu ihv => rw [map_add, map_add, ihu, ihv] - | mul u v _ _ ihu ihv => - rw [repJetGaugeGroupI_apply_mul, repJetGaugeGroupI_apply_mul, ihu, ihv] - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean deleted file mode 100644 index 48a99e754..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDeriv.lean +++ /dev/null @@ -1,319 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FieldStrength -/-! -# The total spacetime derivative on the lepton–gauge-sector jet algebra - -The formal total derivative `∂_μ`, the Leibniz extension of the total -derivatives of the B-boson and charged-lepton factors, together with its action -on the generators and its commutation relations. --/ - -@[expose] public section - - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## Jet derivatives - -The formal total spacetime derivative `∂_μ` on the lepton–gauge-sector jet algebra: the Leibniz -extension of the total derivatives of the two factors. Both factor derivatives -are even derivations, so the total derivative is an even derivation on the full -jet algebra, with no Koszul signs. - --/ - -/-- The formal total spacetime derivative on the lepton–gauge-sector jet algebra in the - direction `μ`: the Leibniz extension of the total derivatives of the B-boson - and charged-lepton factors. -/ -noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - TensorProduct.map (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) LinearMap.id + - TensorProduct.map LinearMap.id (LeptonSinglet.JetAlgebra.jetDeriv μ) - -lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - jetDeriv μ (p ⊗ⱼ l) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p) ⊗ⱼ l + - p ⊗ⱼ LeptonSinglet.JetAlgebra.jetDeriv μ l := rfl - -@[simp] -lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by - have hB : LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 0 := by - rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, - LinearMap.baseChange_tmul, BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero] - rw [one_eq_tmul, jetDeriv_tmul, hB, LeptonSinglet.JetAlgebra.jetDeriv_one, zero_tmul, - tmul_zero, add_zero] - -/-- The total derivative is an even derivation on the lepton–gauge-sector jet algebra: the - Leibniz rule holds with no Koszul signs. -/ -lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : - jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => - simp only [add_mul, map_add, ha, hb] - abel - | tmul p l => - induction y using JetAlgebra.induction_on with - | zero => simp - | add a' b' ha' hb' => - simp only [mul_add, map_add, ha', hb'] - abel - | tmul p' l' => - simp only [tmul_mul_tmul, jetDeriv_tmul, - BBoson.JetAlgebra.jetDeriv_baseChange_mul, LeptonSinglet.JetAlgebra.jetDeriv_mul, - ← tmul_add_tmul_left, ← tmul_add_tmul_right, add_mul, mul_add, tmul_mul_tmul] - abel - -lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => - simp only [map_add, ha, hb] - | tmul p l => - simp only [jetDeriv_tmul, map_add, LeptonSinglet.JetAlgebra.jetDeriv_comm μ ν, - BBoson.JetAlgebra.jetDeriv_baseChange_comm μ ν p] - abel - -/-- Total derivatives commute, so an iterated derivative may be indexed by a - multiset of directions rather than by a list. -/ -instance : LeftCommutative - (fun (ν : Fin 1 ⊕ Fin 3) (A : JetAlgebra →ₗ[ℂ] JetAlgebra) => - jetDeriv ν ∘ₗ A) where - left_comm ν₁ ν₂ A := by - refine LinearMap.ext fun x => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply] - exact jetDeriv_comm ν₁ ν₂ (A x) - - -/-- The jet derivative appends a derivative index to a gauge-field generator. -/ -lemma jetDeriv_ofGenerator_dB (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : - jetDeriv ν (ofGenerator (JetGenerators.dB s μ)) = - ofGenerator (JetGenerators.dB (s + {ν}) μ) := by - simp only [ofGenerator_B_eq] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero, - BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] - -/-- **The jet derivative of a field-strength derivative is the next field-strength - derivative.** -/ -lemma jetDeriv_fieldStrengthDeriv (ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (a b : Fin 1 ⊕ Fin 3) : - jetDeriv ν (fieldStrengthDeriv s a b) = fieldStrengthDeriv (s + {ν}) a b := by - rw [fieldStrengthDeriv_eq_sub, fieldStrengthDeriv_eq_sub, map_sub, - jetDeriv_ofGenerator_dB, jetDeriv_ofGenerator_dB, - show s + {a} + {ν} = s + {ν} + {a} from add_right_comm _ _ _, - show s + {b} + {ν} = s + {ν} + {b} from add_right_comm _ _ _] - -/-- **The Bianchi identity.** -/ -lemma jetDeriv_fieldStrengthDeriv_bianchi (ρ μ ν : Fin 1 ⊕ Fin 3) : - jetDeriv ρ (fieldStrengthDeriv {} μ ν) = - jetDeriv μ (fieldStrengthDeriv {} ρ ν) - jetDeriv ν (fieldStrengthDeriv {} ρ μ) := by - simp only [fieldStrengthDeriv_eq_sub, map_sub, jetDeriv_ofGenerator_dB, - Multiset.empty_eq_zero, zero_add] - rw [add_comm ({μ} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {ρ}, - add_comm ({ν} : Multiset (Fin 1 ⊕ Fin 3)) {μ}] - abel - -/-- A second-derivative field strength is the second jet derivative of a field strength. -/ -lemma fieldStrengthDeriv_pair_eq_jetDeriv (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv {ρ, τ} μ ν = - jetDeriv ρ (jetDeriv τ (fieldStrengthDeriv {} μ ν)) := by - rw [jetDeriv_fieldStrengthDeriv, jetDeriv_fieldStrengthDeriv] - congr 1 - simp only [Multiset.empty_eq_zero, zero_add, Multiset.singleton_add] - exact Multiset.cons_swap ρ τ 0 - -/-! - -## Jet derivatives over a multiset. - - --/ -/-- The iterated total spacetime derivative along a multiset of directions: - `∂_t = ∂_{μ₁} ⋯ ∂_{μ_k}` for `t = {μ₁, …, μ_k}`. The order is immaterial by - `jetDeriv_comm`, so the index is a multiset. -/ -noncomputable def jetDerivM (t : Multiset (Fin 1 ⊕ Fin 3)) : - JetAlgebra →ₗ[ℂ] JetAlgebra := - Multiset.foldr (fun ν A => jetDeriv ν ∘ₗ A) LinearMap.id t - -@[simp] -lemma jetDerivM_zero : jetDerivM 0 = LinearMap.id := by - simp [jetDerivM] - -lemma jetDerivM_cons (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : - jetDerivM (ν ::ₘ t) = jetDeriv ν ∘ₗ jetDerivM t := by - simp [jetDerivM] - -lemma jetDerivM_singleton (μ : Fin 1 ⊕ Fin 3) : jetDerivM {μ} = jetDeriv μ := by - rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, jetDerivM_cons, - jetDerivM_zero, LinearMap.comp_id] - -lemma jetDerivM_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : - jetDerivM (s + t) = jetDerivM s ∘ₗ jetDerivM t := by - induction s using Multiset.induction_on with - | empty => simp [jetDerivM_zero] - | cons μ s ih => - trans jetDerivM (μ ::ₘ (s + t)) - · simp - simp only [jetDerivM_cons, ih] - exact Eq.symm (LinearMap.comp_assoc (jetDerivM t) (jetDerivM s) (jetDeriv μ)) - -lemma jetDerivM_cons' (ν : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) : - jetDerivM (ν ::ₘ t) = jetDerivM t ∘ₗ jetDeriv ν := by - trans jetDerivM (t + {ν}) - · congr - rw [add_comm] - simp - · rw [jetDerivM_add, jetDerivM_singleton] - -lemma jetDerivM_jetDerivM (s t : Multiset (Fin 1 ⊕ Fin 3)) (x : JetAlgebra) : - jetDerivM t (jetDerivM s x) = jetDerivM (t + s) x := by - rw [jetDerivM_add] - simp - -lemma jetDerivM_jetDeriv (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) - (a : JetAlgebra) : - jetDerivM t (jetDeriv μ a) = jetDerivM (μ ::ₘ t) a := by - trans (jetDerivM t ∘ₗ jetDeriv μ) a - · rfl - rw [← jetDerivM_cons'] - -lemma jetDeriv_jetDerivM (μ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) - (a : JetAlgebra) : - jetDeriv μ (jetDerivM t a) = jetDerivM (μ ::ₘ t) a := by - trans (jetDeriv μ ∘ₗ jetDerivM t) a - · rfl - rw [← jetDerivM_cons] - -lemma ofGenerator_dB_eq_jetDerivM (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - [JetGenerators.dB s μ]ₐ = jetDerivM s [.dB 0 μ]ₐ := by - induction s using Multiset.induction_on with - | empty => rw [jetDerivM_zero, LinearMap.id_coe, id_eq] - | cons ν t ih => - rw [jetDerivM_cons, LinearMap.comp_apply, ← ih] - simp only [ofGenerator] - rw [jetDeriv_tmul, LinearMap.baseChange_tmul] - simp only [LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, - zero_add, BBoson.JetAlgebra.jetDeriv_ofGenerator, BBoson.JetGenerators.shift_dB] - congr 2 - rw [add_comm, Multiset.singleton_add] - -lemma jetDerivM_apply_mul_eq_powerset_sum (t : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : - jetDerivM t (x * y) = (t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum := by - induction t using Multiset.induction_on with - | empty => - simp only [jetDerivM_zero, LinearMap.id_coe, id_eq, Multiset.powerset_zero, zero_tsub, - Multiset.map_singleton, Multiset.sum_singleton] - | cons ν t ih => - calc _ - _ = jetDeriv ν (jetDerivM t (x * y)) := by simp [jetDerivM_cons] - _ = jetDeriv ν ((t.powerset.map fun s => jetDerivM s x * jetDerivM (t - s) y).sum) := by - congr - _ = (t.powerset.map (jetDeriv ν ∘ fun s => (jetDerivM s x * jetDerivM (t - s) y))).sum := by - rw [← Multiset.map_map] - exact map_multiset_sum (jetDeriv ν) _ - _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x * jetDerivM (t - s) y))).sum := by - rfl - _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y - + jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by - simp [jetDeriv_mul] - _ = (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum + - (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum := by - exact Multiset.sum_map_add - _ = (t.powerset.map (fun s => jetDerivM s x * jetDeriv ν (jetDerivM (t - s) y))).sum - + (t.powerset.map (fun s => jetDeriv ν (jetDerivM s x) * jetDerivM (t - s) y)).sum - := by abel - conv_rhs => rw [Multiset.powerset_cons] - simp only [Multiset.map_add, Multiset.map_map, Function.comp_apply, Multiset.sub_cons, - Multiset.erase_cons_head, Multiset.sum_add] - congr 1 - · congr 1 - apply Multiset.map_congr (by rfl) - intro s hs - rw [jetDeriv_jetDerivM] - congr - exact (Multiset.cons_sub_of_le ν (Multiset.mem_powerset.mp hs)).symm - · congr - funext s - simp [jetDeriv_jetDerivM] - -lemma jetDerivM_apply_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : JetAlgebra) : - jetDerivM s (x * y) = ∑ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - ((∏ ν, (Multiset.toFinsupp s ν).choose (p.1 ν) : ℕ) : ℂ) • - (jetDerivM (Finsupp.toMultiset p.1) x * jetDerivM (Finsupp.toMultiset p.2) y) := by - have hcount : ∀ u t : Multiset (Fin 1 ⊕ Fin 3), Multiset.count t u.powerset = - ∏ ν, (Multiset.count ν u).choose (Multiset.count ν t) := by - intro u - induction u using Multiset.induction_on with - | empty => - intro t - rcases eq_or_ne t 0 with rfl | h - · simp - · obtain ⟨a, ha⟩ := Multiset.exists_mem_of_ne_zero h - rw [Finset.prod_eq_zero (Finset.mem_univ a)] - · simp [h] - · simp [Nat.choose_eq_zero_of_lt, Multiset.count_pos.mpr ha] - | cons a u ih => - intro t - rw [Multiset.powerset_cons, Multiset.count_add] - by_cases ha : a ∈ t - · obtain ⟨m, hm⟩ : ∃ m, Multiset.count a t = m + 1 := - ⟨Multiset.count a t - 1, by have := Multiset.count_pos.mpr ha; omega⟩ - have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = - Multiset.count (t.erase a) u.powerset := by - conv_lhs => rw [← Multiset.cons_erase ha] - exact Multiset.count_map_eq_count' _ _ (fun v w h => by simpa using h) _ - have hQ : ∀ ν ∈ Finset.univ.erase a, - (Multiset.count ν u).choose (Multiset.count ν (t.erase a)) = - (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by - rw [Multiset.count_erase_of_ne (Finset.mem_erase.mp hν).1] - have hR : ∀ ν ∈ Finset.univ.erase a, - (Multiset.count ν (a ::ₘ u)).choose (Multiset.count ν t) = - (Multiset.count ν u).choose (Multiset.count ν t) := fun ν hν => by - rw [Multiset.count_cons_of_ne (Finset.mem_erase.mp hν).1] - rw [h2, ih t, ih (t.erase a)] - simp only [← Finset.mul_prod_erase Finset.univ _ (Finset.mem_univ a)] - rw [Finset.prod_congr rfl hQ, Finset.prod_congr rfl hR, ← add_mul, - Multiset.count_erase_self, Multiset.count_cons_self, hm, Nat.add_sub_cancel, - Nat.choose_succ_succ'] - ring - · have h2 : Multiset.count t (u.powerset.map (Multiset.cons a)) = 0 := - Multiset.count_eq_zero.mpr fun h => by - obtain ⟨v, _, rfl⟩ := Multiset.mem_map.mp h - exact ha (Multiset.mem_cons_self a v) - rw [h2, ih t, add_zero] - refine Finset.prod_congr rfl fun ν _ => ?_ - rcases eq_or_ne ν a with rfl | hν - · simp [Multiset.count_eq_zero.mpr ha] - · rw [Multiset.count_cons_of_ne hν] - have hsum : ∀ p ∈ Finset.antidiagonal (Multiset.toFinsupp s), - Finsupp.toMultiset p.1 + Finsupp.toMultiset p.2 = s := fun p hp => by - rw [← map_add, Finset.mem_antidiagonal.mp hp, Multiset.toFinsupp_toMultiset] - rw [jetDerivM_apply_mul_eq_powerset_sum, Finset.sum_multiset_map_count] - refine Finset.sum_nbij' (fun t => (Multiset.toFinsupp t, Multiset.toFinsupp (s - t))) - (fun p => Finsupp.toMultiset p.1) (fun t ht => ?_) (fun p hp => ?_) - (fun t _ => Multiset.toFinsupp_toMultiset t) (fun p hp => ?_) (fun t _ => ?_) - · rw [Finset.mem_antidiagonal, ← map_add, add_tsub_cancel_of_le (by simpa using ht)] - · simpa using Multiset.le_iff_exists_add.mpr ⟨Finsupp.toMultiset p.2, (hsum p hp).symm⟩ - · refine Prod.ext (Finsupp.toMultiset_toFinsupp p.1) ?_ - rw [← hsum p hp, add_tsub_cancel_left] - exact Finsupp.toMultiset_toFinsupp p.2 - · simp only [Multiset.toFinsupp_apply, Multiset.toFinsupp_toMultiset, hcount] - exact (Nat.cast_smul_eq_nsmul ℂ _ _).symm -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean deleted file mode 100644 index c619fdb83..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/JetDerivLorentz.lean +++ /dev/null @@ -1,135 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.LorentzAction -/-! -# The jet derivative is a Lorentz vector - -The total derivative `∂_μ` on the jet algebra carries a spacetime index, and this file proves -that it carries it covariantly: - -`ρ(Λ) (∂_μ x) = ∑ a, Λ_{aμ} • ∂_a (ρ(Λ) x)`. - -*The proof follows the derivation.* On the B-boson factor the jet algebra is the symmetric -algebra of the component space, `∂_μ` is the derivation determined by appending `μ` to the -derivative multiset, and appending is, at the component level, multiplication of the -derivative-symbol factor by `∂_μ` (`JetComponentSpace.shiftLin`). The representation is -multiplicative there, and `∂_μ` transforms as a dual covector -(`Lorentz.CoVector.sl2Rep_dual_dualBasis`), which gives the identity on the component space; -the symmetric-algebra induction then carries it to the jet algebra, the Leibniz rule handling -the products. Base change to `ℂ` and the tensor decomposition of the lepton–gauge-sector jet -algebra give the statement on the purely bosonic part, which is where the derivatives of the -field strength live. - -## Key results - -- `StandardModel.BBoson.JetAlgebra.repLorentzGroup_jetDeriv` : the covariance on the B-boson - jet algebra. -- `LeptonGaugeSector.JetAlgebra.repLorentzGroup_jetDeriv_tmul_one` : the covariance on the - bosonic part of the lepton–gauge-sector jet algebra. - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel Matrix MatrixGroups - -namespace JetAlgebra - -set_option maxHeartbeats 1000000 in -/-- **The jet derivative of a gauge-field element is a Lorentz vector.** On the purely bosonic - part of the jet algebra — where the second derivatives of the field strength live — the total - derivative `∂_μ` transforms as a covector, mixing the spacetime directions by the columns of - the Lorentz matrix. -/ -lemma repLorentzGroup_jetDeriv_tmul_one (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - repLorentzGroup Λ (jetDeriv μ (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra))) = - ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - jetDeriv a (repLorentzGroup Λ (p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra))) := by - have hone : LeptonSinglet.JetAlgebra.repLorentzGroup Λ (1 : LeptonSinglet.JetAlgebra) = 1 := - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one Λ - have hd : ∀ (q : ℂ ⊗[ℝ] BBoson.JetAlgebra) (ν : Fin 1 ⊕ Fin 3), - jetDeriv ν (q ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = - (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv ν) q) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra) := fun q ν => by - rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero] - rw [hd, repLorentzGroup_tmul, repLorentzGroup_tmul, hone, - BBoson.JetAlgebra.complexRepLorentzGroup_baseChange_jetDeriv, sum_tmul] - exact Finset.sum_congr rfl fun a _ => by rw [hd, smul_tmul'] - -/-! - -## The bosonic part and the light-cone derivatives - --/ - -/-- The purely bosonic part of the jet algebra: the elements whose lepton factor is trivial. - The derivatives of the field strength live here. -/ -noncomputable def bosonic : Submodule ℂ JetAlgebra := - LinearMap.range ((TensorProduct.mk ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) - LeptonSinglet.JetAlgebra).flip (1 : LeptonSinglet.JetAlgebra)) - -/-- Membership of the bosonic part, unfolded. -/ -lemma mem_bosonic {x : JetAlgebra} : - x ∈ bosonic ↔ ∃ p : ℂ ⊗[ℝ] BBoson.JetAlgebra, - p ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = x := Iff.rfl - -lemma fieldStrengthDeriv_mem_bosonic (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν ∈ bosonic := mem_bosonic.2 ⟨_, rfl⟩ - -lemma jetDeriv_mem_bosonic (μ : Fin 1 ⊕ Fin 3) {x : JetAlgebra} (hx : x ∈ bosonic) : - jetDeriv μ x ∈ bosonic := by - obtain ⟨p, rfl⟩ := mem_bosonic.1 hx - refine mem_bosonic.2 ⟨LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) p, ?_⟩ - rw [jetDeriv_tmul, LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero] - -/-- Bosonic elements are central in the jet algebra: the bosonic factor is commutative, and - it commutes with the lepton factor across the tensor product. -/ -lemma mul_comm_of_mem_bosonic {x : JetAlgebra} (hx : x ∈ bosonic) (y : JetAlgebra) : - x * y = y * x := by - obtain ⟨p, rfl⟩ := mem_bosonic.1 hx - induction y using JetAlgebra.induction_on with - | zero => rw [mul_zero, zero_mul] - | add u v hu hv => rw [mul_add, add_mul, hu, hv] - | tmul b l => rw [tmul_mul_tmul, tmul_mul_tmul, mul_one, one_mul, mul_comm p b] - -/-- The covariance of the jet derivative on the bosonic part. -/ -lemma repLorentzGroup_jetDeriv_of_mem_bosonic (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - {x : JetAlgebra} (hx : x ∈ bosonic) : - repLorentzGroup Λ (jetDeriv μ x) = - ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - jetDeriv a (repLorentzGroup Λ x) := by - obtain ⟨p, rfl⟩ := mem_bosonic.1 hx - exact repLorentzGroup_jetDeriv_tmul_one Λ μ p - -set_option maxHeartbeats 4000000 in -/-- **The jet derivative on the lepton–gauge-sector jet algebra is a Lorentz vector.** The - covariance of `repLorentzGroup_jetDeriv_of_mem_bosonic`, extended to the whole jet algebra - by combining the covariance on the two tensor factors through the Leibniz rule. -/ -lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - repLorentzGroup Λ (jetDeriv μ x) = - ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - jetDeriv a (repLorentzGroup Λ x) := by - induction x using JetAlgebra.induction_on with - | zero => simp - | add u v hu hv => - rw [map_add, map_add, map_add, hu, hv, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] - | tmul p l => - rw [jetDeriv_tmul, map_add, repLorentzGroup_tmul, repLorentzGroup_tmul, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_baseChange_jetDeriv, - LeptonSinglet.JetAlgebra.repLorentzGroup_jetDeriv, sum_tmul, tmul_sum, - ← Finset.sum_add_distrib] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [jetDeriv_tmul, smul_add, smul_tmul', tmul_smul] - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean deleted file mode 100644 index 0c7ca24d7..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/LorentzAction.lean +++ /dev/null @@ -1,458 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.GaugeAction -public import Physlib.Relativity.MinkowskiMatrix -public import Physlib.Relativity.PauliMatrices.Basic -/-! -# THe Lorentz group action on the lepton–gauge-sector jet algebra --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -### B.1. The action of the Lorentz group - --/ -open Matrix MatrixGroups - -noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) JetAlgebra := - BBoson.JetAlgebra.complexRepLorentzGroup.tprod LeptonSinglet.JetAlgebra.repLorentzGroup - -/-- The Lorentz action on a pure tensor. -/ -lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (p : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : - repLorentzGroup Λ (p ⊗ⱼ l) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ p) ⊗ⱼ - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ l) := rfl - -/-- The Lorentz action on the lepton–gauge-sector jet algebra is multiplicative (term-level - form). -/ -lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : - repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by - induction a using JetAlgebra.induction_on with - | zero => simp - | add u v hu hv => simp only [add_mul, map_add, hu, hv] - | tmul p l => - induction b using JetAlgebra.induction_on with - | zero => simp - | add u v hu hv => simp only [mul_add, map_add, hu, hv] - | tmul q k => - simp only [tmul_mul_tmul, repLorentzGroup_tmul, - BBoson.JetAlgebra.complexRepLorentzGroup_apply_mul, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_mul] - -lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - repLorentzGroup Λ (1 : JetAlgebra) = 1 := by - rw [one_eq_tmul, repLorentzGroup_tmul, - BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one, ← one_eq_tmul] - -/-- The Lorentz action packaged as an algebra homomorphism of the jet algebra. Stating - results with this rather than the underlying `Algebra.TensorProduct.map` keeps the terms - small enough for the elaborator. -/ -noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : JetAlgebra →ₐ[ℂ] JetAlgebra where - toFun := repLorentzGroup Λ - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - map_one' := repLorentzGroup_apply_one Λ - map_mul' := repLorentzGroup_apply_mul Λ - commutes' r := by - rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, - ← Algebra.algebraMap_eq_smul_one] - - -/-- The Lorentz action on the zeroth-order lepton generator: the spinor index - transforms contragrediently, by the conjugate inverse matrix. -/ -lemma repLorentzGroup_ψ (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dψ {} α]ₐ = - ∑ β, star ((Λ⁻¹).1 α β) • [JetGenerators.dψ {} β]ₐ := by - rw [show ([JetGenerators.dψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dψ {} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_nil, - tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [tmul_smul] - rfl - -/-- The Lorentz action on the first-order lepton generator. -/ -lemma repLorentzGroup_dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dψ {μ} α]ₐ = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 α β)) • [JetGenerators.dψ {ν} β]ₐ := by - rw [show ([JetGenerators.dψ {μ} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dψ {μ} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_ψ_singleton, - tmul_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [tmul_smul] - rfl - -/-- The Lorentz action on the zeroth-order conjugate lepton generator: the - spinor index transforms by the inverse matrix. -/ -lemma repLorentzGroup_barψ (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dbarψ {} α]ₐ = - ∑ β, (Λ⁻¹).1 α β • [JetGenerators.dbarψ {} β]ₐ := by - rw [show ([JetGenerators.dbarψ {} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dbarψ {} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_nil, - tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [tmul_smul] - rfl - -/-- The Lorentz action on the first-order conjugate lepton generator. -/ -lemma repLorentzGroup_dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ [JetGenerators.dbarψ {μ} α]ₐ = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α β) • [JetGenerators.dbarψ {ν} β]ₐ := by - rw [show ([JetGenerators.dbarψ {μ} α]ₐ : JetAlgebra) = - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ - LeptonSinglet.JetAlgebra.ofGenerator - (LeptonSinglet.JetGenerators.dbarψ {μ} α) from rfl, - repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one, - LeptonSinglet.JetAlgebra.repLorentzGroup_ofGenerator_barψ_singleton, - tmul_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [tmul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [tmul_smul] - rfl - -/-- The Lorentz action on the zeroth-order B-boson generator of the lepton–gauge-sector jet - algebra. -/ -lemma repLorentzGroup_B (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ [JetGenerators.dB {} μ]ₐ = - ∑ ν, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) • - [JetGenerators.dB {} ν]ₐ := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] - rfl - rw [show ([JetGenerators.dB {} μ]ₐ : JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) - ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, - repLorentzGroup_tmul, - show BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) from rfl, - BBoson.JetAlgebra.repLorentzGroup_ofGenerator_dB_nil, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one, TensorProduct.tmul_sum, - sum_tmul] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_smul, hconv] - rfl - - -/-- The transformation law of the embedded field strength: an antisymmetric - two-tensor with both indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) = - ∑ a, ∑ b, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • - fieldStrengthDeriv {} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {} μ ν)) ⊗ⱼ - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [sum_tmul, hconv, fieldStrengthDeriv] - -/-- Covariance of the zeroth covariant derivatives under the Lorentz group. -/ -lemma repLorentzGroup_Dψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (Dψ [] α) = ∑ β, star ((Λ⁻¹).1 α β) • Dψ [] β := by - rw [Dψ_nil, repLorentzGroup_ψ] - simp only [Dψ_nil] - -lemma repLorentzGroup_Dbarψ_nil (Λ : SL(2,ℂ)) (α : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α) = ∑ β, (Λ⁻¹).1 α β • Dbarψ [] β := by - rw [Dbarψ_nil, repLorentzGroup_barψ] - simp only [Dbarψ_nil] - -/-- Multiplication distributes over a finite sum on the left. Stated through - `LinearMap.mulRight` because the generic `Finset.sum_mul` does not match the - multiplication instance of the tensor-product algebra. -/ -lemma sum_mul' {ι : Type*} [Fintype ι] (f : ι → JetAlgebra) (y : JetAlgebra) : - (∑ i, f i) * y = ∑ i, f i * y := by - rw [show (∑ i, f i) * y = LinearMap.mulRight ℂ y (∑ i, f i) from rfl, map_sum] - rfl - -/-- Multiplication distributes over a finite sum on the right; see `sum_mul'`. -/ -lemma mul_sum' {ι : Type*} [Fintype ι] (y : JetAlgebra) (f : ι → JetAlgebra) : - y * (∑ i, f i) = ∑ i, y * f i := by - rw [show y * (∑ i, f i) = LinearMap.mulLeft ℂ y (∑ i, f i) from rfl, map_sum] - rfl - -/-- Bilinearity of the product against two scaled finite sums: the form in which - the gauge-field term of a covariant derivative is expanded after the Lorentz - action has been distributed over each factor. -/ -lemma smul_sum_mul_sum {ι κ : Type*} [Fintype ι] [Fintype κ] (c : ℂ) - (f : ι → ℂ) (g : κ → ℂ) (x : ι → JetAlgebra) (y : κ → JetAlgebra) : - c • ((∑ i, f i • x i) * (∑ j, g j • y j)) = - ∑ i, ∑ j, (f i * g j * c) • (x i * y j) := by - rw [sum_mul'] - simp only [mul_sum', smul_mul_smul_comm, Finset.smul_sum, smul_smul] - refine Finset.sum_congr rfl fun i _ => Finset.sum_congr rfl fun j _ => ?_ - congr 1 - ring - -/-- Covariance of the first covariant derivative under the Lorentz group: the - gauge-field term transforms exactly as the derivative term. -/ -lemma repLorentzGroup_Dψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ (Dψ [μ] α) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 α β)) • Dψ [ν] β := by - simp only [Dψ_singleton, map_sub, map_smul, repLorentzGroup_apply_mul, - repLorentzGroup_B, repLorentzGroup_ψ, repLorentzGroup_dψ_singleton, - smul_sub, Finset.sum_sub_distrib, smul_smul, smul_sum_mul_sum] - -/-- Covariance of the first conjugate covariant derivative under the Lorentz - group. -/ -lemma repLorentzGroup_Dbarψ_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (α : Fin 2) : - repLorentzGroup Λ (Dbarψ [μ] α) = - ∑ ν, ∑ β, ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α β) • Dbarψ [ν] β := by - simp only [Dbarψ_singleton, map_add, map_smul, repLorentzGroup_apply_mul, - repLorentzGroup_B, repLorentzGroup_barψ, repLorentzGroup_dbarψ_singleton, - smul_add, Finset.sum_add_distrib, smul_smul, smul_sum_mul_sum] - -/-! - -### The transformation law of the field strengths - -The embedded field-strength derivatives are tensors: every index, the -derivative indices included, transforms by the Lorentz matrix. For a -*diagonal* Lorentz matrix this collapses to a scaling by the product of the -signs carried by the indices, which is what the parity and boost arguments of -`FermionicParity` and `Grading/BoostWeight` use. - --/ - -/-- Under a diagonal Lorentz transformation the field strength scales by the - product of the signs of its two indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {} μ ν) = - ((sgn μ * sgn ν : ℝ) : ℂ) • fieldStrengthDeriv {} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_nil] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] - -/-- The transformation law of the embedded first-derivative field strength: - a three-index tensor, all indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_singleton (Λ : SL(2,ℂ)) - (ρ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {ρ} μ ν) = - ∑ r, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) : ℝ)) : ℂ) • - fieldStrengthDeriv {r} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν)) ⊗ⱼ - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [sum_tmul, hconv, fieldStrengthDeriv] - -/-- Under a diagonal Lorentz transformation the derivative field strength - scales by the product of the signs of its three indices. -/ -lemma repLorentzGroup_diag_fieldStrengthDeriv_singleton {M : SL(2,ℂ)} - {sgn : Fin 1 ⊕ Fin 3 → ℝ} - (hM : ∀ a b, (Lorentz.SL2C.toLorentzGroup M).1 a b = - if a = b then sgn a else 0) (ρ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup M (fieldStrengthDeriv {ρ} μ ν) = - ((sgn ρ * (sgn μ * sgn ν) : ℝ) : ℂ) • fieldStrengthDeriv {ρ} μ ν := by - rw [repLorentzGroup_fieldStrengthDeriv_singleton] - rw [Finset.sum_eq_single ρ (fun r _ hr => Finset.sum_eq_zero fun a _ => - Finset.sum_eq_zero fun b _ => by - rw [hM r ρ, if_neg hr, zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ρ) h)] - rw [Finset.sum_eq_single μ (fun a _ ha => Finset.sum_eq_zero fun b _ => by - rw [hM a μ, if_neg ha, zero_mul, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ μ) h)] - rw [Finset.sum_eq_single ν (fun b _ hb => by - rw [hM b ν, if_neg hb, mul_zero, mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ ν) h)] - rw [hM ρ ρ, if_pos rfl, hM μ μ, if_pos rfl, hM ν ν, if_pos rfl] - -/-- The transformation law of the embedded second-derivative field strength: - a four-index tensor, all indices transforming by the Lorentz matrix. -/ -lemma repLorentzGroup_fieldStrengthDeriv_pair (Λ : SL(2,ℂ)) - (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {ρ, τ} μ ν) = - ∑ r, ∑ s, ∑ a, ∑ b, ((((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) : ℝ)) : ℂ) • - fieldStrengthDeriv {r, s} a b := by - have hconv : ∀ (r : ℝ) (X : ℂ ⊗[ℝ] BBoson.JetAlgebra), - (r • X) ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) = ((r : ℂ)) • (X ⊗ⱼ 1) := by - intro r X - rw [← algebraMap_smul (R := ℝ) ℂ r X, ← smul_tmul'] - rfl - have happ : repLorentzGroup Λ (((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) ⊗ⱼ - (1 : LeptonSinglet.JetAlgebra)) = - (BBoson.JetAlgebra.complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν)) ⊗ⱼ - (LeptonSinglet.JetAlgebra.repLorentzGroup Λ - (1 : LeptonSinglet.JetAlgebra)) := rfl - rw [fieldStrengthDeriv, happ, - BBoson.JetAlgebra.complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair, - LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - simp only [sum_tmul, hconv, fieldStrengthDeriv] - -/-! - -### The transformation law of a zero-derivative fermion pair - --/ - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on a fermion pair `ψ̄_α (Dψ_μ)_β` with one derivative on - the unbarred factor. -/ -lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_singleton (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α * Dψ [μ] β) = - ∑ γ, ∑ ν, ∑ δ, ((Λ⁻¹).1 α γ * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β δ))) • (Dbarψ [] γ * Dψ [ν] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_singleton] - simp only [hsm, hms, hms₂, hsmul] - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on a fermion pair `(D̄ψ̄_μ)_α ψ_β` with one derivative on - the barred factor. -/ -lemma repLorentzGroup_Dbarψ_singleton_mul_Dψ_nil (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [μ] α * Dψ [] β) = - ∑ ν, ∑ γ, ∑ δ, (((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - (Λ⁻¹).1 α γ) * star ((Λ⁻¹).1 β δ)) • (Dbarψ [ν] γ * Dψ [] δ) := by - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsm₂ : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, repLorentzGroup_Dψ_nil] - simp only [hsm, hsm₂, hms, hsmul] - - -/-- The Lorentz action on a zero-derivative fermion pair `ψ̄_α ψ_β`. -/ -lemma repLorentzGroup_Dbarψ_nil_mul_Dψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : - repLorentzGroup Λ (Dbarψ [] α * Dψ [] β) = - ∑ γ, ∑ δ, ((Λ⁻¹).1 α γ * star ((Λ⁻¹).1 β δ)) • - (Dbarψ [] γ * Dψ [] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, repLorentzGroup_Dψ_nil] - simp only [hsm, hms, hsmul] - -/-- The Lorentz action on a zero-derivative fermion pair `ψ_α ψ̄_β`. -/ -lemma repLorentzGroup_Dψ_nil_mul_Dbarψ_nil (Λ : SL(2,ℂ)) (α β : Fin 2) : - repLorentzGroup Λ (Dψ [] α * Dbarψ [] β) = - ∑ γ, ∑ δ, (star ((Λ⁻¹).1 α γ) * (Λ⁻¹).1 β δ) • - (Dψ [] γ * Dbarψ [] δ) := by - have hsm : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [repLorentzGroup_apply_mul, repLorentzGroup_Dψ_nil, repLorentzGroup_Dbarψ_nil] - simp only [hsm, hms, hsmul] -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean deleted file mode 100644 index a9a4be312..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDim.lean +++ /dev/null @@ -1,676 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.IsInvariant -public import Physlib.Relativity.MinkowskiMatrix -public import Physlib.Relativity.PauliMatrices.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.MassDim -public import Physlib.Mathematics.PolynomialEval -/-! -# Mass dimension on the lepton–gauge-sector jet algebra - -*Note*: In this file we use the notion 'mass weight'. The idea been that the -'mass weight' is twice the mass dimension. This is because it is easier to work exclusively with -integers, and the mass dimension of the fermion fields is 3/2. - -The grading is carried by the *mass-weight polynomial*: the algebra map sending each generator -`j` to `X ^ w * j`, where `w` is its mass weight. The coefficient of `X ^ n` in the mass-weight -polynomial of an element is its part of mass weight `n`, so an element is homogeneous of weight -`n` exactly when its mass-weight polynomial is `X ^ n` times itself, which is the condition -defining `massWeightSubmodule`. - -The jet algebra is the tensor product of the two factors and mass weights add under that -product, so the mass-weight polynomial of the whole is assembled from the two factor -polynomials: push each into `Polynomial JetAlgebra` along the tensor inclusions and multiply. -On monomials this is exactly `X ^ a * b ⊗ X ^ c * l ↦ X ^ (a + c) * (b ⊗ l)`. - --/ - -@[expose] public section - - -namespace LeptonGaugeSector -open TensorProduct StandardModel Matrix MatrixGroups - -/-- We define the mass weight of a term as two times its mass dimnesion. -/ -def MassWeight : JetGenerators → ℕ - | JetGenerators.dB s _ => 2 * (1 + s.card) - | JetGenerators.dψ s _ => 3 + 2 * s.card - | JetGenerators.dbarψ s _ => 3 + 2 * s.card - -namespace JetAlgebra - -/-! - -## A. The mass-weight polynomial - --/ - -/-- The mass-weight polynomial on the lepton–gauge-sector jet algebra, assembled from the - mass-weight polynomials of the two factors. -/ -noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := - (Algebra.TensorProduct.lift (Polynomial.mapAlgHom inclB) - (Polynomial.mapAlgHom inclL) commute_mapAlgHom_inclB_inclL).comp - (Algebra.TensorProduct.map BBoson.JetAlgebra.massWeightPoly - LeptonSinglet.JetAlgebra.massWeightPoly) - -@[simp] -lemma massWeightPoly_tmul (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) (l : LeptonSinglet.JetAlgebra) : - massWeightPoly (b ⊗ⱼ l) = - Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) * - Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := rfl - -/-- On the bosonic factor the mass-weight polynomial is the B-boson mass-weight polynomial - pushed along the inclusion. -/ -lemma massWeightPoly_inclB (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - massWeightPoly (inclB b) = - Polynomial.mapAlgHom inclB (BBoson.JetAlgebra.massWeightPoly b) := by - rw [show inclB b = b ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, massWeightPoly_tmul, - map_one, map_one, mul_one] - -/-- On the fermionic factor the mass-weight polynomial is the charged-lepton mass-weight - polynomial pushed along the inclusion. -/ -lemma massWeightPoly_inclL (l : LeptonSinglet.JetAlgebra) : - massWeightPoly (inclL l) = - Polynomial.mapAlgHom inclL (LeptonSinglet.JetAlgebra.massWeightPoly l) := by - rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l from rfl, massWeightPoly_tmul, - map_one, map_one, one_mul] - -/-- The bosonic inclusion is unital. -/ -private lemma inclB_one : inclB (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := rfl - -/-- The fermionic inclusion is unital. -/ -private lemma inclL_one : inclL (1 : LeptonSinglet.JetAlgebra) = 1 := rfl - -/-- A pure tensor is the product of the images of its two factors. -/ -lemma tmul_eq_inclB_mul_inclL (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) - (l : LeptonSinglet.JetAlgebra) : b ⊗ⱼ l = inclB b * inclL l := by - rw [show inclB b = b ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, - show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l from rfl, - tmul_mul_tmul, mul_one, one_mul] - -/-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ -@[simp] -lemma massWeightPoly_ofGenerator (j : JetGenerators) : - massWeightPoly [j]ₐ = Polynomial.monomial (MassWeight j) [j]ₐ := by - cases j with - | dB s μ => - rw [show ([JetGenerators.dB s μ]ₐ : JetAlgebra) = inclB ((1 : ℂ) ⊗ₜ[ℝ] - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB s μ)) from rfl, - massWeightPoly_inclB, BBoson.JetAlgebra.massWeightPoly_ofGenerator, - Polynomial.mapAlgHom_monomial] - rfl - | dψ s α => - rw [show ([JetGenerators.dψ s α]ₐ : JetAlgebra) = inclL - (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dψ s α)) from rfl, - massWeightPoly_inclL, LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, - Polynomial.mapAlgHom_monomial] - rfl - | dbarψ s α => - rw [show ([JetGenerators.dbarψ s α]ₐ : JetAlgebra) = inclL - (LeptonSinglet.JetAlgebra.ofGenerator (LeptonSinglet.JetGenerators.dbarψ s α)) - from rfl, - massWeightPoly_inclL, LeptonSinglet.JetAlgebra.massWeightPoly_ofGenerator, - Polynomial.mapAlgHom_monomial] - rfl - -/-- Evaluation at one, as an algebra map. The jet algebra is not commutative, so evaluation - is multiplicative only because the point `1` is central. -/ -private noncomputable def evalOne : Polynomial JetAlgebra →ₐ[ℂ] JetAlgebra := - Polynomial.eval₂AlgHom (AlgHom.id ℂ JetAlgebra) 1 fun a => Commute.one_right a - -private lemma evalOne_apply (p : Polynomial JetAlgebra) : evalOne p = p.eval 1 := rfl - -/-- Setting the formal variable to one recovers the original element. -/ -lemma massWeightPoly_eval_one (x : JetAlgebra) : (massWeightPoly x).eval 1 = x := by - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb] - | tmul b l => - rw [massWeightPoly_tmul, ← evalOne_apply, map_mul, evalOne_apply, evalOne_apply, - Polynomial.eval_one_mapAlgHom, Polynomial.eval_one_mapAlgHom, - BBoson.JetAlgebra.massWeightPoly_eval_one, - LeptonSinglet.JetAlgebra.massWeightPoly_eval_one, ← tmul_eq_inclB_mul_inclL] - -/-- Every element is the sum of the coefficients of its mass-weight polynomial. -/ -lemma eq_sum_massWeightPoly_coeff (x : JetAlgebra) : - x = ∑ n ∈ Polynomial.support (massWeightPoly x), (massWeightPoly x).coeff n := by - conv_lhs => rw [← massWeightPoly_eval_one x] - rw [Polynomial.eval_eq_sum, Polynomial.sum_def] - exact Finset.sum_congr rfl fun n _ => by - have h1 : (1 : JetAlgebra) ^ n = 1 := one_pow (M := JetAlgebra) n - grind - -/-- `massWeightPoly` is injective, however, it is not surjective. -/ -lemma massWeightPoly_injective : Function.Injective massWeightPoly := by - intro x y h - have h1 : (massWeightPoly x).eval 1 = (massWeightPoly y).eval 1 := by rw [h] - rwa [massWeightPoly_eval_one, massWeightPoly_eval_one] at h1 - -/-! - -## B. The mass-weight submodules - --/ - -/-- The submodule of elements of mass weight `n`: those `x` whose mass-weight polynomial is - `x * X ^ n`. -/ -def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where - carrier := {x | massWeightPoly x = Polynomial.monomial n x} - add_mem' {a b} ha hb := by - simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ - rw [ha, hb] - zero_mem' := by simp - smul_mem' c x hx := by - simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ - rw [hx, Polynomial.smul_monomial] - -@[simp] -lemma mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} : - x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl - -/-- Mass weights add under multiplication, and `1` has mass weight zero. -/ -instance : SetLike.GradedMonoid massWeightSubmodule where - one_mem := by - show massWeightPoly 1 = Polynomial.monomial 0 1 - rw [Polynomial.monomial_zero_left, Polynomial.C_1] - exact massWeightPoly.map_one - mul_mem {m n x y} hx hy := by - simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ - rw [hx, hy, Polynomial.monomial_mul_monomial] - -/-- Mass weights add under multiplication. -/ -lemma mul_mem_massWeightSubmodule {m n : ℕ} {x y : JetAlgebra} - (hx : x ∈ massWeightSubmodule m) (hy : y ∈ massWeightSubmodule n) : - x * y ∈ massWeightSubmodule (m + n) := by - simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ - rw [hx, hy, Polynomial.monomial_mul_monomial] - -/-- The generator `j` has mass weight `MassWeight j`. -/ -lemma ofGenerator_mem_massWeightSubmodule (j : JetGenerators) : - [j]ₐ ∈ massWeightSubmodule (MassWeight j) := - massWeightPoly_ofGenerator j - -/-- The inclusion of the bosonic factor preserves mass weights. -/ -lemma inclB_mem_massWeightSubmodule {n : ℕ} {b : ℂ ⊗[ℝ] BBoson.JetAlgebra} - (hb : b ∈ BBoson.JetAlgebra.massWeightSubmodule n) : - inclB b ∈ massWeightSubmodule n := by - rw [mem_massWeightSubmodule, massWeightPoly_inclB, - BBoson.JetAlgebra.mem_massWeightSubmodule.mp hb, Polynomial.mapAlgHom_monomial] - -/-- The inclusion of the fermionic factor preserves mass weights. -/ -lemma inclL_mem_massWeightSubmodule {n : ℕ} {l : LeptonSinglet.JetAlgebra} - (hl : l ∈ LeptonSinglet.JetAlgebra.massWeightSubmodule n) : - inclL l ∈ massWeightSubmodule n := by - rw [mem_massWeightSubmodule, massWeightPoly_inclL, - LeptonSinglet.JetAlgebra.mem_massWeightSubmodule.mp hl, Polynomial.mapAlgHom_monomial] - -/-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass weight `n`: on a - pure tensor it is a sum of products of a bosonic and a fermionic coefficient of - complementary weights. -/ -lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : JetAlgebra) : - (massWeightPoly x).coeff n ∈ massWeightSubmodule n := by - induction x using JetAlgebra.induction_on generalizing n with - | zero => simp - | add a b ha hb => - simp only [map_add, Polynomial.coeff_add] - exact Submodule.add_mem _ (ha n) (hb n) - | tmul b l => - rw [massWeightPoly_tmul, Polynomial.coeff_mul] - refine Submodule.sum_mem _ fun p hp => ?_ - rw [Finset.mem_antidiagonal] at hp - rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, ← hp] - exact mul_mem_massWeightSubmodule - (inclB_mem_massWeightSubmodule - (BBoson.JetAlgebra.coeff_massWeightPoly_mem_massWeightSubmodule p.1 b)) - (inclL_mem_massWeightSubmodule - (LeptonSinglet.JetAlgebra.coeff_massWeightPoly_mem_massWeightSubmodule p.2 l)) - -/-- The coefficients of a mass-weight polynomial are homogeneous: the coefficient of `X ^ n` - in `massWeightPoly x` is sent by `massWeightPoly` to `X ^ n` times itself. -/ -lemma massWeightPoly_coeff_massWeightPoly (n : ℕ) (x : JetAlgebra) : - massWeightPoly ((massWeightPoly x).coeff n) = - Polynomial.monomial n ((massWeightPoly x).coeff n) := - coeff_massWeightPoly_mem_massWeightSubmodule n x - -/-- On an element of mass weight `n`, the `n`-th coefficient of the mass-weight polynomial is - the element itself. -/ -lemma coeff_massWeightPoly_of_mem {n : ℕ} {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) : (massWeightPoly x).coeff n = x := by - rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_pos rfl] - -/-- On an element of mass weight `m`, every other coefficient of the mass-weight polynomial - vanishes. -/ -lemma coeff_massWeightPoly_of_mem_ne {m n : ℕ} {x : JetAlgebra} (hmn : m ≠ n) - (hx : x ∈ massWeightSubmodule m) : (massWeightPoly x).coeff n = 0 := by - rw [mem_massWeightSubmodule.mp hx, Polynomial.coeff_monomial, if_neg hmn] - -/-- The submodule of elements of mass weight at most `n`: the renormalizable Lagrangian - densities are those of mass weight at most eight. -/ -noncomputable def MassWeightLESubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - ⨆ (m : ℕ) (_ : m ≤ n), massWeightSubmodule m - -lemma massWeightSubmodule_le_massWeightLESubmodule {m n : ℕ} (hmn : m ≤ n) : - massWeightSubmodule m ≤ MassWeightLESubmodule n := - le_iSup_of_le m (le_iSup_of_le hmn le_rfl) - -/-- An element of mass weight `m ≤ n` has mass weight at most `n`. -/ -lemma mem_massWeightLESubmodule_of_mem {m n : ℕ} (hmn : m ≤ n) {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule m) : x ∈ MassWeightLESubmodule n := - massWeightSubmodule_le_massWeightLESubmodule hmn hx - -/-- Above the bound the coefficients of the mass-weight polynomial vanish. -/ -lemma coeff_massWeightPoly_eq_zero_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} - (hx : x ∈ MassWeightLESubmodule n) {i : ℕ} (hi : n < i) : - (massWeightPoly x).coeff i = 0 := by - induction hx using Submodule.iSup_induction' with - | mem m y hy => - by_cases hmn : m ≤ n - · rw [iSup_pos hmn] at hy - exact coeff_massWeightPoly_of_mem_ne (by omega) hy - · rw [iSup_neg hmn, Submodule.mem_bot] at hy - rw [hy, map_zero, Polynomial.coeff_zero] - | zero => simp - | add a b _ _ ha hb => rw [map_add, Polynomial.coeff_add, ha, hb, add_zero] - -/-- An element of mass weight at most `n` is the sum of its parts of weight `0, …, n`, each - read off as a coefficient of its mass-weight polynomial. -/ -lemma eq_sum_coeff_of_mem_massWeightLESubmodule {n : ℕ} {x : JetAlgebra} - (hx : x ∈ MassWeightLESubmodule n) : - x = ∑ m ∈ Finset.range (n + 1), (massWeightPoly x).coeff m := by - conv_lhs => rw [eq_sum_massWeightPoly_coeff x] - refine Finset.sum_subset (fun m hm => ?_) (fun m _ hm => ?_) - · rw [Finset.mem_range] - by_contra hlt - exact Polynomial.mem_support_iff.mp hm - (coeff_massWeightPoly_eq_zero_of_mem_massWeightLESubmodule hx (by omega)) - · exact Polynomial.notMem_support_iff.mp hm - -/-- The Lorentz-invariant Lagrangian densities of mass weight at most `n`. -/ -noncomputable def InvariantMassWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra := - MassWeightLESubmodule n ⊓ InvariantSubmodule - -/-! - -## C. The mass weight of the derivatives and of the field strength - --/ - -/-- The total derivative acts on the bosonic factor through its own total derivative. -/ -lemma jetDeriv_inclB (μ : Fin 1 ⊕ Fin 3) (b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - jetDeriv μ (inclB b) = - inclB (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) b) := by - rw [show inclB b = b ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, jetDeriv_tmul, - LeptonSinglet.JetAlgebra.jetDeriv_one, tmul_zero, add_zero] - rfl - -/-- The total derivative acts on the fermionic factor through its own total derivative. -/ -lemma jetDeriv_inclL (μ : Fin 1 ⊕ Fin 3) (l : LeptonSinglet.JetAlgebra) : - jetDeriv μ (inclL l) = inclL (LeptonSinglet.JetAlgebra.jetDeriv μ l) := by - rw [show inclL l = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ l from rfl, jetDeriv_tmul, - show LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ) - (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 0 from by - rw [show (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = - (1 : ℂ) ⊗ₜ[ℝ] (1 : BBoson.JetAlgebra) from rfl, LinearMap.baseChange_tmul, - BBoson.JetAlgebra.jetDeriv_one, TensorProduct.tmul_zero], - zero_tmul, zero_add] - rfl - -/-- Pushing a polynomial forward along the bosonic inclusion commutes with applying the total - derivative to its coefficients. -/ -private lemma mapCoeffs_jetDeriv_mapAlgHom_inclB (μ : Fin 1 ⊕ Fin 3) - (p : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) : - Polynomial.mapCoeffs (jetDeriv μ) (Polynomial.mapAlgHom inclB p) = - Polynomial.mapAlgHom inclB - (Polynomial.mapCoeffs (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)) p) := by - refine Polynomial.ext fun n => ?_ - rw [Polynomial.coeff_mapCoeffs (map_zero (jetDeriv μ)), - Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapCoeffs - (map_zero (LinearMap.baseChange ℂ (BBoson.JetAlgebra.jetDeriv μ)))] - exact jetDeriv_inclB μ _ - -/-- Pushing a polynomial forward along the fermionic inclusion commutes with applying the - total derivative to its coefficients. -/ -private lemma mapCoeffs_jetDeriv_mapAlgHom_inclL (μ : Fin 1 ⊕ Fin 3) - (p : Polynomial LeptonSinglet.JetAlgebra) : - Polynomial.mapCoeffs (jetDeriv μ) (Polynomial.mapAlgHom inclL p) = - Polynomial.mapAlgHom inclL - (Polynomial.mapCoeffs (LeptonSinglet.JetAlgebra.jetDeriv μ) p) := by - refine Polynomial.ext fun n => ?_ - rw [Polynomial.coeff_mapCoeffs (map_zero (jetDeriv μ)), - Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapCoeffs (map_zero (LeptonSinglet.JetAlgebra.jetDeriv μ))] - exact jetDeriv_inclL μ _ - -/-- The formal variable is fixed by the tensor inclusions. -/ -private lemma mapAlgHom_X_sq_inclB : - Polynomial.mapAlgHom inclB - ((Polynomial.X : Polynomial (ℂ ⊗[ℝ] BBoson.JetAlgebra)) ^ 2) = - (Polynomial.X : Polynomial JetAlgebra) ^ 2 := by - rw [Polynomial.X_pow_eq_monomial, Polynomial.mapAlgHom_monomial, inclB_one, - ← Polynomial.X_pow_eq_monomial] - -private lemma mapAlgHom_X_sq_inclL : - Polynomial.mapAlgHom inclL ((Polynomial.X : Polynomial LeptonSinglet.JetAlgebra) ^ 2) = - (Polynomial.X : Polynomial JetAlgebra) ^ 2 := by - rw [Polynomial.X_pow_eq_monomial, Polynomial.mapAlgHom_monomial, inclL_one, - ← Polynomial.X_pow_eq_monomial] - -/-- The Leibniz rule for the total derivative applied coefficientwise to a product of - polynomials. -/ -private lemma mapCoeffs_jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (P Q : Polynomial JetAlgebra) : - Polynomial.mapCoeffs (jetDeriv μ) (P * Q) = - Polynomial.mapCoeffs (jetDeriv μ) P * Q + P * Polynomial.mapCoeffs (jetDeriv μ) Q := - Polynomial.mapCoeffs_mul_of_leibniz (map_zero (jetDeriv μ)) (map_add (jetDeriv μ)) - (jetDeriv_mul μ) P Q - -/-- Rearrangement used for the Leibniz step: `X ^ 2` is central, so it can be pulled out of a - Leibniz combination. -/ -private lemma X_sq_mul_leibniz {R : Type} [Semiring R] (p q r s : Polynomial R) : - Polynomial.X ^ 2 * p * q + r * (Polynomial.X ^ 2 * s) = - Polynomial.X ^ 2 * (p * q + r * s) := by - rw [mul_add, mul_assoc, ← mul_assoc r, ← Polynomial.X_pow_mul, mul_assoc] - -/-- The total derivative raises the mass weight by two: its mass-weight polynomial is `X ^ 2` - times the coefficientwise total derivative. -/ -lemma massWeightPoly_jetDeriv (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - massWeightPoly (jetDeriv μ x) = - Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly x) := by - have hmul : ∀ a b : JetAlgebra, - massWeightPoly (jetDeriv μ a) = - Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly a) → - massWeightPoly (jetDeriv μ b) = - Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly b) → - massWeightPoly (jetDeriv μ (a * b)) = - Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly (a * b)) := by - intro a b ha hb - rw [jetDeriv_mul] - simp only [map_add, map_mul] - rw [ha, hb, mapCoeffs_jetDeriv_mul, X_sq_mul_leibniz] - have hB : ∀ b : ℂ ⊗[ℝ] BBoson.JetAlgebra, - massWeightPoly (jetDeriv μ (inclB b)) = - Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly (inclB b)) := by - intro b - rw [jetDeriv_inclB, massWeightPoly_inclB, massWeightPoly_inclB, - BBoson.JetAlgebra.massWeightPoly_jetDeriv_baseChange, map_mul, - mapAlgHom_X_sq_inclB, mapCoeffs_jetDeriv_mapAlgHom_inclB] - have hL : ∀ l : LeptonSinglet.JetAlgebra, - massWeightPoly (jetDeriv μ (inclL l)) = - Polynomial.X ^ 2 * Polynomial.mapCoeffs (jetDeriv μ) (massWeightPoly (inclL l)) := by - intro l - rw [jetDeriv_inclL, massWeightPoly_inclL, massWeightPoly_inclL, - LeptonSinglet.JetAlgebra.massWeightPoly_jetDeriv, map_mul, - mapAlgHom_X_sq_inclL, mapCoeffs_jetDeriv_mapAlgHom_inclL] - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => - rw [map_add, map_add, ha, hb, map_add, - Polynomial.mapCoeffs_add (map_zero (jetDeriv μ)) (map_add (jetDeriv μ)), mul_add] - | tmul b l => - rw [tmul_eq_inclB_mul_inclL] - exact hmul _ _ (hB b) (hL l) - -/-- The total derivative raises the mass weight by two. -/ -lemma jetDeriv_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) : jetDeriv μ x ∈ massWeightSubmodule (n + 2) := by - rw [mem_massWeightSubmodule] at hx ⊢ - rw [massWeightPoly_jetDeriv, hx, Polynomial.mapCoeffs_monomial (map_zero (jetDeriv μ)), - Polynomial.X_pow_eq_monomial, Polynomial.monomial_mul_monomial, one_mul, - Nat.add_comm 2 n] - -/-- The gauge field has mass weight two. -/ -lemma dB_nil_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) : - [JetGenerators.dB {} μ]ₐ ∈ massWeightSubmodule 2 := by - have h := ofGenerator_mem_massWeightSubmodule (JetGenerators.dB {} μ) - rwa [show MassWeight (JetGenerators.dB {} μ) = 2 from by simp [MassWeight]] at h - -/-- The covariant step raises the mass weight by two: the gauge-field term `6 i B_μ ·` - carries the same weight as the derivative. -/ -lemma covariantStep_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) : - covariantStep μ x ∈ massWeightSubmodule (n + 2) := by - rw [covariantStep_apply] - refine Submodule.sub_mem _ (jetDeriv_mem_massWeightSubmodule μ hx) - (Submodule.smul_mem _ _ ?_) - have h := mul_mem_massWeightSubmodule (dB_nil_mem_massWeightSubmodule μ) hx - rwa [Nat.add_comm 2 n] at h - -/-- The conjugate covariant step raises the mass weight by two. -/ -lemma covariantStepBar_mem_massWeightSubmodule (μ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) : - covariantStepBar μ x ∈ massWeightSubmodule (n + 2) := by - rw [covariantStepBar_apply] - refine Submodule.add_mem _ (jetDeriv_mem_massWeightSubmodule μ hx) - (Submodule.smul_mem _ _ ?_) - have h := mul_mem_massWeightSubmodule (dB_nil_mem_massWeightSubmodule μ) hx - rwa [Nat.add_comm 2 n] at h - -/-- Homogeneity of the covariant derivative: `D_l ψ_α` has mass weight `3 + 2 |l|`. -/ -lemma Dψ_mem_massWeightSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dψ l α ∈ massWeightSubmodule (3 + 2 * l.length) := by - induction l with - | nil => - rw [Dψ_nil] - have h := ofGenerator_mem_massWeightSubmodule (JetGenerators.dψ {} α) - rwa [show MassWeight (JetGenerators.dψ {} α) = 3 + 2 * ([] : List (Fin 1 ⊕ Fin 3)).length - from by simp [MassWeight]] at h - | cons μ l ih => - rw [Dψ_cons] - have h := covariantStep_mem_massWeightSubmodule μ ih - rwa [show 3 + 2 * l.length + 2 = 3 + 2 * (μ :: l).length from by - simp only [List.length_cons]; omega] at h - -/-- Homogeneity of the conjugate covariant derivative: `D̄_l ψ̄_α` has mass weight - `3 + 2 |l|`. -/ -lemma Dbarψ_mem_massWeightSubmodule (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : - Dbarψ l α ∈ massWeightSubmodule (3 + 2 * l.length) := by - induction l with - | nil => - rw [Dbarψ_nil] - have h := ofGenerator_mem_massWeightSubmodule (JetGenerators.dbarψ {} α) - rwa [show MassWeight (JetGenerators.dbarψ {} α) = - 3 + 2 * ([] : List (Fin 1 ⊕ Fin 3)).length from by simp [MassWeight]] at h - | cons μ l ih => - rw [Dbarψ_cons] - have h := covariantStepBar_mem_massWeightSubmodule μ ih - rwa [show 3 + 2 * l.length + 2 = 3 + 2 * (μ :: l).length from by - simp only [List.length_cons]; omega] at h - -/-- Homogeneity of the field-strength derivatives: `∂_s F_{μν}` has mass weight - `4 + 2 |s|`. -/ -lemma fieldStrengthDeriv_mem_massWeightSubmodule (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν ∈ massWeightSubmodule (4 + 2 * Multiset.card s) := by - have h : (fieldStrengthDeriv s μ ν : JetAlgebra) = - [JetGenerators.dB (s + {μ}) ν]ₐ - [JetGenerators.dB (s + {ν}) μ]ₐ := by - rw [fieldStrengthDeriv, BBoson.JetAlgebra.fieldStrengthDeriv, - TensorProduct.tmul_sub, sub_tmul] - rfl - rw [h] - refine Submodule.sub_mem _ ?_ ?_ - · have hg := ofGenerator_mem_massWeightSubmodule (JetGenerators.dB (s + {μ}) ν) - rwa [show MassWeight (JetGenerators.dB (s + {μ}) ν) = 4 + 2 * Multiset.card s from by - simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega] at hg - · have hg := ofGenerator_mem_massWeightSubmodule (JetGenerators.dB (s + {ν}) μ) - rwa [show MassWeight (JetGenerators.dB (s + {ν}) μ) = 4 + 2 * Multiset.card s from by - simp only [MassWeight, Multiset.card_add, Multiset.card_singleton]; omega] at hg - -/-! - -## D. Invariance of the mass weights under the Lorentz and constant gauge actions - --/ - -set_option maxHeartbeats 400000 in -/-- The Lorentz action preserves mass weights: the mass-weight polynomial of a transformed - element is the transform of its mass-weight polynomial. -/ -lemma massWeightPoly_repLorentzGroup (Λ : SL(2,ℂ)) (x : JetAlgebra) : - massWeightPoly (repLorentzGroup Λ x) = - Polynomial.mapAlgHom (repLorentzGroupAlgHom Λ) (massWeightPoly x) := by - have hB : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, repLorentzGroupAlgHom Λ (inclB z) = - inclB (BBoson.JetAlgebra.complexRepLorentzGroup Λ z) := by - intro z - show repLorentzGroup Λ (z ⊗ⱼ (1 : LeptonSinglet.JetAlgebra)) = _ - rw [repLorentzGroup_tmul, LeptonSinglet.JetAlgebra.repLorentzGroup_apply_one] - rfl - have hL : ∀ z : LeptonSinglet.JetAlgebra, repLorentzGroupAlgHom Λ (inclL z) = - inclL (LeptonSinglet.JetAlgebra.repLorentzGroup Λ z) := by - intro z - show repLorentzGroup Λ ((1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ z) = _ - rw [repLorentzGroup_tmul, BBoson.JetAlgebra.complexRepLorentzGroup_apply_one] - rfl - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul b l => - rw [repLorentzGroup_tmul, massWeightPoly_tmul, massWeightPoly_tmul, - BBoson.JetAlgebra.massWeightPoly_complexRepLorentzGroup, - LeptonSinglet.JetAlgebra.massWeightPoly_repLorentzGroup, map_mul] - refine congrArg₂ (· * ·) (Polynomial.ext fun n => ?_) (Polynomial.ext fun n => ?_) - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, hB] - rfl - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, hL] - rfl - -/-- The Lorentz action preserves each mass-weight submodule. -/ -lemma repLorentzGroup_mem_massWeightSubmodule (Λ : SL(2,ℂ)) {n : ℕ} {x : JetAlgebra} - (hx : x ∈ massWeightSubmodule n) : repLorentzGroup Λ x ∈ massWeightSubmodule n := by - rw [mem_massWeightSubmodule] at hx ⊢ - rw [massWeightPoly_repLorentzGroup, hx, Polynomial.mapAlgHom_monomial] - rfl - -set_option maxHeartbeats 400000 in -/-- Jets of constant gauge transformations preserve mass weights. This fails for a general - jet: the higher Taylor coefficients of the hypercharge character lower the derivative - degree, mixing weights. -/ -lemma massWeightPoly_repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : - massWeightPoly (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = - Polynomial.mapAlgHom (repAlgHom (JetGaugeGroupI.ofConstant g)) (massWeightPoly x) := by - set U := JetGaugeGroupI.ofConstant g with hUdef - have hB : ∀ z : ℂ ⊗[ℝ] BBoson.JetAlgebra, repAlgHom U (inclB z) = - inclB (BBoson.JetAlgebra.complexRepJetGaugeGroupI U z) := by - intro z - rw [show inclB z = z ⊗ⱼ (1 : LeptonSinglet.JetAlgebra) from rfl, repAlgHom_tmul, - show (ExteriorAlgebra.map (LeptonSinglet.JetComponentSpace.repJetGaugeGroupI U)) - (1 : LeptonSinglet.JetAlgebra) = 1 from map_one _] - rfl - have hL : ∀ z : LeptonSinglet.JetAlgebra, repAlgHom U (inclL z) = - inclL (LeptonSinglet.JetAlgebra.repJetGaugeGroupI U z) := by - intro z - rw [show inclL z = (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) ⊗ⱼ z from rfl, repAlgHom_tmul, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_one] - rfl - induction x using JetAlgebra.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul b l => - rw [repJetGaugeGroupI_tmul', massWeightPoly_tmul, massWeightPoly_tmul, - BBoson.JetAlgebra.massWeightPoly_complexRepJetGaugeGroupI_ofConstant, - LeptonSinglet.JetAlgebra.massWeightPoly_repJetGaugeGroupI_ofConstant, map_mul] - refine congrArg₂ (· * ·) (Polynomial.ext fun n => ?_) (Polynomial.ext fun n => ?_) - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapAlgHom_apply, hB, - BBoson.JetAlgebra.complexRepJetGaugeGroupI_ofConstant] - · rw [Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, - Polynomial.coeff_mapAlgHom_apply, Polynomial.coeff_mapAlgHom_apply, hL] - rfl - -/-- Jets of constant gauge transformations preserve each mass-weight submodule. -/ -lemma repJetGaugeGroupI_ofConstant_mem_massWeightSubmodule (g : GaugeGroupI) {n : ℕ} - {x : JetAlgebra} (hx : x ∈ massWeightSubmodule n) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x ∈ massWeightSubmodule n := by - rw [mem_massWeightSubmodule] at hx ⊢ - rw [massWeightPoly_repJetGaugeGroupI_ofConstant, hx, Polynomial.mapAlgHom_monomial, - ← repJetGaugeGroupI_eq_repAlgHom] - - -/-! - -## E. Invariance of the mass-weight components - -Taking the part of a given mass weight commutes with the Lorentz action and with the action of -the *constant* gauge transformations, because both preserve mass weights. The covariant -subalgebra is generated by homogeneous elements, so it too is graded by mass weight. Together -these say that an invariant element of the covariant subalgebra has invariant mass-weight -components — which is what lets the classification be run one weight at a time. - --/ - -/-- Taking the weight-`n` part commutes with the Lorentz action. -/ -lemma repLorentzGroup_coeff_massWeightPoly (Λ : SL(2,ℂ)) (x : JetAlgebra) (n : ℕ) : - repLorentzGroup Λ ((massWeightPoly x).coeff n) = - (massWeightPoly (repLorentzGroup Λ x)).coeff n := by - rw [massWeightPoly_repLorentzGroup, Polynomial.coeff_mapAlgHom_apply] - rfl - -/-- Taking the weight-`n` part commutes with the action of a constant gauge transformation. - This fails for a general gauge jet, whose higher Taylor coefficients mix weights. -/ -lemma repJetGaugeGroupI_ofConstant_coeff_massWeightPoly (g : GaugeGroupI) (x : JetAlgebra) - (n : ℕ) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) ((massWeightPoly x).coeff n) = - (massWeightPoly (repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x)).coeff n := by - rw [massWeightPoly_repJetGaugeGroupI_ofConstant, Polynomial.coeff_mapAlgHom_apply, - ← repJetGaugeGroupI_eq_repAlgHom] - -/-- The covariant subalgebra is graded by mass weight: its generators are homogeneous — the - field-strength derivative `∂_s F_{μν}` has weight `4 + 2 |s|` and the covariant derivatives - `D_l ψ_α`, `D̄_l ψ̄_α` weight `3 + 2 |l|` — so every mass-weight part of an element of the - subalgebra lies in the subalgebra again. -/ -lemma coeff_massWeightPoly_mem_covariantAlgebra {x : JetAlgebra} (hx : x ∈ CovariantAlgebra) - (n : ℕ) : (massWeightPoly x).coeff n ∈ CovariantAlgebra := by - induction hx using CovariantAlgebra.induction_on generalizing n with - | fieldStrength s μ ν => - by_cases hn : 4 + 2 * Multiset.card s = n - · rw [coeff_massWeightPoly_of_mem (hn ▸ fieldStrengthDeriv_mem_massWeightSubmodule s μ ν)] - exact fieldStrengthDeriv_mem_covariantAlgebra s μ ν - · rw [coeff_massWeightPoly_of_mem_ne hn (fieldStrengthDeriv_mem_massWeightSubmodule s μ ν)] - exact Subalgebra.zero_mem _ - | lepton l α => - by_cases hn : 3 + 2 * l.length = n - · rw [coeff_massWeightPoly_of_mem (hn ▸ Dψ_mem_massWeightSubmodule l α)] - exact Dψ_mem_covariantAlgebra l α - · rw [coeff_massWeightPoly_of_mem_ne hn (Dψ_mem_massWeightSubmodule l α)] - exact Subalgebra.zero_mem _ - | conjLepton l α => - by_cases hn : 3 + 2 * l.length = n - · rw [coeff_massWeightPoly_of_mem (hn ▸ Dbarψ_mem_massWeightSubmodule l α)] - exact Dbarψ_mem_covariantAlgebra l α - · rw [coeff_massWeightPoly_of_mem_ne hn (Dbarψ_mem_massWeightSubmodule l α)] - exact Subalgebra.zero_mem _ - | algebraMap r => - rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] - split_ifs - · exact Subalgebra.algebraMap_mem _ r - · exact Subalgebra.zero_mem _ - | add u v _ _ ihu ihv => - rw [map_add, Polynomial.coeff_add] - exact Subalgebra.add_mem _ (ihu n) (ihv n) - | mul u v _ _ ihu ihv => - rw [map_mul, Polynomial.coeff_mul] - exact Subalgebra.sum_mem _ fun p _ => Subalgebra.mul_mem _ (ihu p.1) (ihv p.2) - -/-- The mass-weight components of an invariant element are themselves invariant. - - Invariance under the full jet gauge group does not by itself pass to the components — a - general gauge jet mixes mass weights. It passes because an invariant element lies in the - covariant subalgebra (`isInvariant_iff_mem_covariantAlgebra`), on which invariance is - equivalent to membership together with invariance under the *constant* gauge transformations - and the Lorentz group, and all three of those conditions are inherited by the components. -/ -lemma isInvariant_coeff_massWeightPoly {x : JetAlgebra} (hx : IsInvariant x) (n : ℕ) : - IsInvariant ((massWeightPoly x).coeff n) := by - rw [isInvariant_iff_mem_covariantAlgebra] at hx ⊢ - obtain ⟨hmem, hconst, hlor⟩ := hx - refine ⟨coeff_massWeightPoly_mem_covariantAlgebra hmem n, fun g => ?_, fun Λ => ?_⟩ - · rw [repJetGaugeGroupI_ofConstant_coeff_massWeightPoly, hconst g] - · rw [repLorentzGroup_coeff_massWeightPoly, hlor Λ] - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean deleted file mode 100644 index 5919f3f32..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/Basic.lean +++ /dev/null @@ -1,593 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Grading.Hypercharge -/-! -# Where an invariant of mass weight eight lives - -## i. Overview - -A Lagrangian density of mass dimension four — mass weight eight — which is covariant is a -combination of terms drawn from exactly six sectors: - -- the fermionic kinetic terms `D̄_μ ψ̄_α ψ_β` with the derivative on the conjugate lepton, -- the fermionic kinetic terms `ψ̄_α D_μ ψ_β` with the derivative on the lepton, -- the second derivatives of the field strength `∂_ρ ∂_τ F_{μν}`, -- the photon pairs `F_{μν} F_{μ'ν'}`, -- the like-species fermionic pairs `ψ_α D_μ ψ_β` and `ψ̄_α D̄_μ ψ̄_β`. - -This is the sector decomposition. Only gauge covariance and the mass weight are used; each -sector is cut down to its invariants elsewhere, Lorentz invariance being what does that. - -The last two sectors carry hypercharge `± 12`, so an invariant — being a charge singlet — has -no component in them, and the hypercharge grading removes them: -`mem_massDimFour_neutral_sectors_of_isInvariant` is the same statement with four sectors. - -## ii. The argument - -An invariant lies in the covariant subalgebra (`isInvariant_iff_mem_covariantAlgebra`), which -is generated by `∂_s F_{μν}`, `D_l ψ_α` and `D̄_l ψ̄_α`. These generators are homogeneous of -mass weights `4 + 2|s|`, `3 + 2|l|` and `3 + 2|l|`, so the subalgebra is spanned by monomials of -definite weight, `covWeightSpan`. Reading off the coefficient of `X ^ 8` of the mass-weight -polynomial — which on an element of weight eight returns the element itself — puts a covariant -term of weight eight in the span of the monomials of weight eight. - -The weights of the generators are at least three, so such a monomial has at most two factors, -and the possible weight profiles are only `8`, `4 + 4` and `3 + 5`. A weight-`8` factor must be -bosonic, the fermionic weights being odd; `4 + 4` is a photon pair; and `3 + 5` is a pair of -fermionic generators, one undifferentiated and one carrying a single derivative, in one of the -four species pairings. There is no mixed profile: a bosonic factor of weight four and a -fermionic one of weight three sum to the odd number seven. - -The two orders of each fermionic pair are traded for one another by anticommutativity, which is -why each of the four fermionic sectors is spanned by the products with the derivative on the -second factor alone. - -The last step reads off the hypercharges. Only lists of length zero and one occur, so no -induction is needed: the field strength is neutral, lying in the B-boson factor, and -`Dψ_singleton` writes `D_μ ψ_α` as `∂_μ ψ_α - 6 i B_μ ψ_α`, both summands of charge `6` since -`B_μ` is neutral. Projecting the sector decomposition onto the charge singlets then fixes the -four neutral sectors and kills the two like-species ones. - -## iii. Key results - -- `JetAlgebra.covWeightSpan` : the span of the monomials of a given mass weight in the - covariant generators. -- `JetAlgebra.mem_covWeightSpan_of_mem_covariantAlgebra` : an element of the covariant - subalgebra which is homogeneous of mass weight `n` lies in the span of the monomials of - weight `n`. -- `JetAlgebra.covWeightSpan_eight_le` : the weight-eight monomials are exhausted by the six - families. -- `JetAlgebra.mem_massDimFour_sectors_of_isInvariant` : **the sector decomposition** — an - invariant of mass weight eight lies in the join of the six sector spans. -- `JetAlgebra.Dψ_singleton_mem_hyperchargeSubmodule` and its three companions : the fermionic - generators of weight three and five carry hypercharge `± 6`. -- `JetAlgebra.mem_massDimFour_neutral_sectors_of_isInvariant` : **the neutral sector - decomposition** — an invariant of mass weight eight lies in the join of the four neutral - sector spans. - -## iv. Table of contents - -- A. The covariant generators, indexed -- B. The span of the monomials of a given mass weight -- C. The mass-weight-eight monomials -- D. The sector decomposition -- E. The hypercharges of the covariant generators -- F. Removing the charged sectors - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -/-! - -## A. The covariant generators, indexed - -The generators of the covariant subalgebra form three families, and the classification below is -a case analysis on which family a factor comes from together with how many derivatives it -carries. An index type for the generators makes that case analysis available, and gives the -mass weight as a function of the index rather than of the element. - --/ - -/-- An index for the generators of the covariant subalgebra: a derivative of the field - strength, a covariant derivative of the lepton, or a covariant derivative of the conjugate - lepton. -/ -inductive CovGen where - /-- The field-strength derivative `∂_s F_{μν}`. -/ - | fieldStrength (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : CovGen - /-- The covariant derivative `D_l ψ_α` of the lepton. -/ - | lepton (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : CovGen - /-- The covariant derivative `D̄_l ψ̄_α` of the conjugate lepton. -/ - | conjLepton (l : List (Fin 1 ⊕ Fin 3)) (α : Fin 2) : CovGen - -/-- The mass weight of a covariant generator: `4 + 2 |s|` for `∂_s F_{μν}`, and `3 + 2 |l|` for - the covariant derivatives, matching `MassWeight`. -/ -def CovGen.weight : CovGen → ℕ - | .fieldStrength s _ _ => 4 + 2 * Multiset.card s - | .lepton l _ => 3 + 2 * l.length - | .conjLepton l _ => 3 + 2 * l.length - -/-- Every covariant generator has mass weight at least three: this is what bounds the number of - factors in a monomial of given weight. -/ -lemma CovGen.three_le_weight (g : CovGen) : 3 ≤ g.weight := by - cases g <;> simp only [CovGen.weight] <;> omega - -namespace JetAlgebra - -/-- The element of the jet algebra associated with a covariant-generator index. -/ -noncomputable def covGenVal : CovGen → JetAlgebra - | .fieldStrength s μ ν => fieldStrengthDeriv s μ ν - | .lepton l α => Dψ l α - | .conjLepton l α => Dbarψ l α - -/-- The covariant generators generate the covariant subalgebra. -/ -lemma covGenVal_mem_covariantAlgebra (g : CovGen) : covGenVal g ∈ CovariantAlgebra := by - cases g with - | fieldStrength s μ ν => exact fieldStrengthDeriv_mem_covariantAlgebra s μ ν - | lepton l α => exact Dψ_mem_covariantAlgebra l α - | conjLepton l α => exact Dbarψ_mem_covariantAlgebra l α - -/-- Each covariant generator is homogeneous of its stated mass weight. -/ -lemma covGenVal_mem_massWeightSubmodule (g : CovGen) : - covGenVal g ∈ massWeightSubmodule g.weight := by - cases g with - | fieldStrength s μ ν => exact fieldStrengthDeriv_mem_massWeightSubmodule s μ ν - | lepton l α => exact Dψ_mem_massWeightSubmodule l α - | conjLepton l α => exact Dbarψ_mem_massWeightSubmodule l α - -/-! - -## B. The span of the monomials of a given mass weight - -The covariant subalgebra is generated by homogeneous elements, so it is spanned by the monomials -of definite mass weight. Taking the weight-`n` part of an element of the subalgebra therefore -lands in the span of the weight-`n` monomials, and on an element which is already homogeneous of -weight `n` that operation is the identity. - --/ - -/-- The span of the products of covariant generators whose mass weights sum to `n`. -/ -noncomputable def covWeightSpan (n : ℕ) : Submodule ℂ JetAlgebra := - Submodule.span ℂ {x : JetAlgebra | ∃ l : List CovGen, (l.map CovGen.weight).sum = n ∧ - x = (l.map covGenVal).prod} - -/-- A product of covariant generators is homogeneous, of the sum of their weights. -/ -lemma prod_covGenVal_mem_massWeightSubmodule (l : List CovGen) : - (l.map covGenVal).prod ∈ massWeightSubmodule ((l.map CovGen.weight).sum) := by - induction l with - | nil => - simp only [List.map_nil, List.prod_nil, List.sum_nil] - exact SetLike.GradedOne.one_mem - | cons g t ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - exact mul_mem_massWeightSubmodule (covGenVal_mem_massWeightSubmodule g) ih - -/-- The monomials of weight `n` are homogeneous of mass weight `n`. -/ -lemma covWeightSpan_le_massWeightSubmodule (n : ℕ) : - covWeightSpan n ≤ massWeightSubmodule n := by - refine Submodule.span_le.mpr ?_ - rintro x ⟨l, hl, rfl⟩ - exact hl ▸ prod_covGenVal_mem_massWeightSubmodule l - -/-- The unit is a monomial of weight zero: the empty product. -/ -lemma one_mem_covWeightSpan_zero : (1 : JetAlgebra) ∈ covWeightSpan 0 := - Submodule.subset_span ⟨[], by simp, by simp⟩ - -/-- A covariant generator is a monomial of its own weight. -/ -lemma covGenVal_mem_covWeightSpan (g : CovGen) : covGenVal g ∈ covWeightSpan g.weight := - Submodule.subset_span ⟨[g], by simp, by simp⟩ - -/-- Weights add under multiplication of monomials: the index lists concatenate. -/ -lemma mul_mem_covWeightSpan {m n : ℕ} {x y : JetAlgebra} (hx : x ∈ covWeightSpan m) - (hy : y ∈ covWeightSpan n) : x * y ∈ covWeightSpan (m + n) := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := distrib_add_mul - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := distrib_mul_add - have hz₁ : ∀ u : JetAlgebra, 0 * u = 0 := fun u => zero_mul u - have hz₂ : ∀ u : JetAlgebra, u * 0 = 0 := fun u => mul_zero u - have hs₁ : ∀ (r : ℂ) (u v : JetAlgebra), (r • u) * v = r • (u * v) := - fun r u v => smul_mul_assoc r u v - have hs₂ : ∀ (r : ℂ) (u v : JetAlgebra), u * (r • v) = r • (u * v) := - fun r u v => mul_smul_comm r u v - induction hx using Submodule.span_induction with - | mem x' hx' => - induction hy using Submodule.span_induction with - | mem y' hy' => - obtain ⟨l, hl, rfl⟩ := hx' - obtain ⟨l', hl', rfl⟩ := hy' - refine Submodule.subset_span ⟨l ++ l', ?_, ?_⟩ - · rw [List.map_append, List.sum_append, hl, hl'] - · rw [List.map_append, List.prod_append] - | zero => rw [hz₂]; exact zero_mem _ - | add u v _ _ ihu ihv => rw [hd₂]; exact add_mem ihu ihv - | smul r u _ ih => rw [hs₂]; exact Submodule.smul_mem _ _ ih - | zero => rw [hz₁]; exact zero_mem _ - | add u v _ _ ihu ihv => rw [hd₁]; exact add_mem ihu ihv - | smul r u _ ih => rw [hs₁]; exact Submodule.smul_mem _ _ ih - -/-- The join of the monomial spans is closed under multiplication. -/ -lemma mul_mem_iSup_covWeightSpan {x y : JetAlgebra} (hx : x ∈ ⨆ n, covWeightSpan n) - (hy : y ∈ ⨆ n, covWeightSpan n) : x * y ∈ ⨆ n, covWeightSpan n := by - have hd₁ : ∀ u v w : JetAlgebra, (u + v) * w = u * w + v * w := distrib_add_mul - have hd₂ : ∀ u v w : JetAlgebra, u * (v + w) = u * v + u * w := distrib_mul_add - induction hx using Submodule.iSup_induction' with - | mem m u hu => - induction hy using Submodule.iSup_induction' with - | mem n v hv => exact Submodule.mem_iSup_of_mem _ (mul_mem_covWeightSpan hu hv) - | zero => rw [mul_zero]; exact zero_mem _ - | add v w _ _ ihv ihw => rw [hd₂]; exact add_mem ihv ihw - | zero => rw [zero_mul]; exact zero_mem _ - | add u v _ _ ihu ihv => rw [hd₁]; exact add_mem ihu ihv - -/-- Every element of the covariant subalgebra is a sum of monomials of definite mass weight. -/ -lemma mem_iSup_covWeightSpan_of_mem_covariantAlgebra {x : JetAlgebra} - (hx : x ∈ CovariantAlgebra) : x ∈ ⨆ n, covWeightSpan n := by - induction hx using CovariantAlgebra.induction_on with - | fieldStrength s μ ν => - exact Submodule.mem_iSup_of_mem _ - (covGenVal_mem_covWeightSpan (CovGen.fieldStrength s μ ν)) - | lepton l α => - exact Submodule.mem_iSup_of_mem _ (covGenVal_mem_covWeightSpan (CovGen.lepton l α)) - | conjLepton l α => - exact Submodule.mem_iSup_of_mem _ (covGenVal_mem_covWeightSpan (CovGen.conjLepton l α)) - | algebraMap r => - rw [Algebra.algebraMap_eq_smul_one] - exact Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem 0 one_mem_covWeightSpan_zero) - | add u v _ _ ihu ihv => exact add_mem ihu ihv - | mul u v _ _ ihu ihv => exact mul_mem_iSup_covWeightSpan ihu ihv - -/-- Taking the weight-`m` part of a sum of monomials of definite weight leaves the monomial - span: each summand either survives unchanged or is killed. -/ -lemma coeff_massWeightPoly_mem_covWeightSpan {x : JetAlgebra} - (hx : x ∈ ⨆ n, covWeightSpan n) (m : ℕ) : - (massWeightPoly x).coeff m ∈ covWeightSpan m := by - induction hx using Submodule.iSup_induction' with - | mem n u hu => - by_cases hmn : m = n - · subst hmn - rwa [coeff_massWeightPoly_of_mem (covWeightSpan_le_massWeightSubmodule m hu)] - · rw [coeff_massWeightPoly_of_mem_ne (fun h => hmn h.symm) - (covWeightSpan_le_massWeightSubmodule n hu)] - exact zero_mem _ - | zero => rw [map_zero, Polynomial.coeff_zero]; exact zero_mem _ - | add u v _ _ ihu ihv => rw [map_add, Polynomial.coeff_add]; exact add_mem ihu ihv - -/-- An element of the covariant subalgebra which is homogeneous of mass weight `n` lies in the - span of the monomials of weight `n`. -/ -lemma mem_covWeightSpan_of_mem_covariantAlgebra {n : ℕ} {x : JetAlgebra} - (hmem : x ∈ CovariantAlgebra) (hx : x ∈ massWeightSubmodule n) : x ∈ covWeightSpan n := by - have h := coeff_massWeightPoly_mem_covWeightSpan - (mem_iSup_covWeightSpan_of_mem_covariantAlgebra hmem) n - rwa [coeff_massWeightPoly_of_mem hx] at h - -/-! - -## C. The mass-weight-eight monomials - -Every generator has weight at least three, so a monomial of weight eight has at most two -factors. A single factor of weight eight must be a field strength, the fermionic weights being -odd; and eight splits as `4 + 4` or `3 + 5` only, a bosonic factor of weight four and a -fermionic one of weight three summing to the odd number seven. So the weight-eight monomials -are the second derivatives of the field strength, the photon pairs, and the products of an -undifferentiated fermionic generator with a singly-differentiated one, in each of the four -species pairings; the order of the two fermionic factors is normalised by anticommutativity. - --/ - -/-- The covariant lepton derivatives anticommute among themselves: they are odd elements of the - linear-matter submodule. -/ -lemma Dψ_mul_Dψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dψ l α * Dψ l' β = -(Dψ l' β * Dψ l α) := - eq_neg_of_add_eq_zero_left - (mul_add_swap_of_mem (Dψ_mem_LinearMatterSubmodule l α) - (Dψ_mem_LinearMatterSubmodule l' β)) - -/-- The conjugate covariant lepton derivatives anticommute among themselves. -/ -lemma Dbarψ_mul_Dbarψ_anticomm (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - Dbarψ l α * Dbarψ l' β = -(Dbarψ l' β * Dbarψ l α) := - eq_neg_of_add_eq_zero_left - (mul_add_swap_of_mem (Dbarψ_mem_LinearMatterSubmodule l α) - (Dbarψ_mem_LinearMatterSubmodule l' β)) - -/-- **The weight-eight monomials.** A monomial of mass weight eight in the covariant generators - is a second derivative of the field strength, a photon pair, or a product of two fermionic - generators one of which carries a single derivative. The six families are presented as - membership hypotheses so that the caller may take the target submodule to be any join - containing them. -/ -lemma covWeightSpan_eight_le {W : Submodule ℂ JetAlgebra} - (hbar : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dbarψ [μ] α * Dψ [] β ∈ W) - (hkin : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dbarψ [] α * Dψ [μ] β ∈ W) - (hdd : ∀ ρ τ μ ν : Fin 1 ⊕ Fin 3, fieldStrengthDeriv {ρ, τ} μ ν ∈ W) - (hff : ∀ μ ν μ' ν' : Fin 1 ⊕ Fin 3, - fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν' ∈ W) - (hpp : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dψ [] α * Dψ [μ] β ∈ W) - (hbb : ∀ (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2), Dbarψ [] α * Dbarψ [μ] β ∈ W) : - covWeightSpan 8 ≤ W := by - refine Submodule.span_le.mpr ?_ - rintro x ⟨l, hl, rfl⟩ - rcases l with _ | ⟨a, _ | ⟨b, _ | ⟨c, t⟩⟩⟩ - · simp at hl - · simp only [List.map_cons, List.map_nil, List.sum_cons, List.sum_nil, add_zero] at hl - simp only [List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, mul_one, - SetLike.mem_coe] - cases a with - | fieldStrength s μ ν => - have hs : Multiset.card s = 2 := by simp only [CovGen.weight] at hl; omega - obtain ⟨ρ, τ, rfl⟩ := Multiset.card_eq_two.mp hs - exact hdd ρ τ μ ν - | lepton l α => exfalso; simp only [CovGen.weight] at hl; omega - | conjLepton l α => exfalso; simp only [CovGen.weight] at hl; omega - · simp only [List.map_cons, List.map_nil, List.sum_cons, List.sum_nil, add_zero] at hl - simp only [List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, mul_one, - SetLike.mem_coe] - have hpair : ∀ (l l' : List (Fin 1 ⊕ Fin 3)), 3 + 2 * l.length + (3 + 2 * l'.length) = 8 → - (l = [] ∧ ∃ μ, l' = [μ]) ∨ ((∃ μ, l = [μ]) ∧ l' = []) := by - intro l l' h - by_cases hl0 : l.length = 0 - · exact Or.inl ⟨List.length_eq_zero_iff.mp hl0, - List.length_eq_one_iff.mp (by omega)⟩ - · exact Or.inr ⟨List.length_eq_one_iff.mp (by omega), - List.length_eq_zero_iff.mp (by omega)⟩ - cases a with - | fieldStrength s μ ν => - cases b with - | fieldStrength s' μ' ν' => - have hs : Multiset.card s = 0 ∧ Multiset.card s' = 0 := by - simp only [CovGen.weight] at hl; omega - obtain rfl := Multiset.card_eq_zero.mp hs.1 - obtain rfl := Multiset.card_eq_zero.mp hs.2 - exact hff μ ν μ' ν' - | lepton l α => exfalso; simp only [CovGen.weight] at hl; omega - | conjLepton l α => exfalso; simp only [CovGen.weight] at hl; omega - | lepton l α => - cases b with - | fieldStrength s' μ' ν' => exfalso; simp only [CovGen.weight] at hl; omega - | lepton l' β => - show Dψ l α * Dψ l' β ∈ W - simp only [CovGen.weight] at hl - rcases hpair l l' (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ - · exact hpp α ν β - · rw [Dψ_mul_Dψ_anticomm] - exact neg_mem (hpp β ν α) - | conjLepton l' β => - show Dψ l α * Dbarψ l' β ∈ W - rw [Dψ_mul_Dbarψ_anticomm] - refine neg_mem ?_ - simp only [CovGen.weight] at hl - rcases hpair l' l (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ - · exact hkin β ν α - · exact hbar β ν α - | conjLepton l α => - cases b with - | fieldStrength s' μ' ν' => exfalso; simp only [CovGen.weight] at hl; omega - | lepton l' β => - show Dbarψ l α * Dψ l' β ∈ W - simp only [CovGen.weight] at hl - rcases hpair l l' (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ - · exact hkin α ν β - · exact hbar α ν β - | conjLepton l' β => - show Dbarψ l α * Dbarψ l' β ∈ W - simp only [CovGen.weight] at hl - rcases hpair l l' (by omega) with ⟨rfl, ν, rfl⟩ | ⟨⟨ν, rfl⟩, rfl⟩ - · exact hbb α ν β - · rw [Dbarψ_mul_Dbarψ_anticomm] - exact neg_mem (hbb β ν α) - · exfalso - have ha := a.three_le_weight - have hb := b.three_le_weight - have hc := c.three_le_weight - simp only [List.map_cons, List.sum_cons] at hl - omega - -/-! - -## D. The sector decomposition - -Assembling the two halves: an invariant lies in the covariant subalgebra, so if it is -homogeneous of mass weight eight it lies in the span of the weight-eight monomials, and those -are exhausted by the six families. - -The two like-species families `ψψ` and `ψ̄ψ̄` carry hypercharge `± 12` and so contain no -invariant; they are kept here because nothing but covariance and the mass weight has been used -to get this far. - --/ - -/-- **Where a covariant term of mass dimension four lives.** An element of the covariant - subalgebra which is homogeneous of mass weight eight — mass dimension four — lies in the join - of the six sector spans: the two fermionic kinetic sectors, the second derivatives of the - field strength, the photon pairs, and the two like-species fermionic pairs. -/ -theorem mem_massDimFour_sectors_of_mem_covariantAlgebra {x : JetAlgebra} - (hmem : x ∈ CovariantAlgebra) (h8 : x ∈ massWeightSubmodule 8) : - x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dψ [] α * Dψ [μ] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dbarψ [μ] β} := by - refine covWeightSpan_eight_le ?_ ?_ ?_ ?_ ?_ ?_ - (mem_covWeightSpan_of_mem_covariantAlgebra hmem h8) - · exact fun α μ β => Submodule.mem_sup_left (Submodule.mem_sup_left - (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left - (Submodule.subset_span ⟨α, μ, β, rfl⟩))))) - · exact fun α μ β => Submodule.mem_sup_left (Submodule.mem_sup_left - (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right - (Submodule.subset_span ⟨α, μ, β, rfl⟩))))) - · exact fun ρ τ μ ν => Submodule.mem_sup_left (Submodule.mem_sup_left - (Submodule.mem_sup_left (Submodule.mem_sup_right - (Submodule.subset_span ⟨ρ, τ, μ, ν, rfl⟩)))) - · exact fun μ ν μ' ν' => Submodule.mem_sup_left (Submodule.mem_sup_left - (Submodule.mem_sup_right (Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩))) - · exact fun α μ β => Submodule.mem_sup_left (Submodule.mem_sup_right - (Submodule.subset_span ⟨α, μ, β, rfl⟩)) - · exact fun α μ β => Submodule.mem_sup_right (Submodule.subset_span ⟨α, μ, β, rfl⟩) - -/-- **Where an invariant of mass dimension four lives.** An invariant of mass weight eight — - mass dimension four — lies in the join of the six sector spans. - - Only gauge invariance is used, and only through the covariant subalgebra - (`isInvariant_iff_mem_covariantAlgebra`); Lorentz invariance plays no part here. It is what - cuts each sector down to its invariants: the two kinetic sectors to the kinetic terms, the - photon pairs to the Maxwell and theta terms, the second derivatives of the field strength to - zero, and — by hypercharge — the two like-species sectors to zero. -/ -theorem mem_massDimFour_sectors_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) - (h8 : x ∈ massWeightSubmodule 8) : - x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dψ [] α * Dψ [μ] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dbarψ [μ] β} := - mem_massDimFour_sectors_of_mem_covariantAlgebra - ((isInvariant_iff_mem_covariantAlgebra x).mp hx).1 h8 - -/-! - -## E. The hypercharges of the covariant generators - -To remove the two like-species sectors their hypercharge is needed, and hence the hypercharge -of each generator occurring in a weight-eight monomial. Those are few: the field-strength -derivatives, which lie in the neutral bosonic factor, and the covariant derivatives along a -list of length zero or one. The latter are written out by `Dψ_singleton` and `Dbarψ_singleton` -as a generator plus a gauge-field term, and the gauge field is neutral, so both summands carry -the charge of the fermionic generator. No induction along the list is needed, and hence no -statement that the total derivative preserves the hypercharge grading. - --/ - -/-- Hypercharges add, with the sum evaluated: this is `mul_mem_hyperchargeSubmodule` in the form - the products below want it. -/ -lemma mul_mem_hyperchargeSubmodule_of_add_eq {p q r : ℤ} (hr : p + q = r) {x y : JetAlgebra} - (hx : x ∈ hyperchargeSubmodule p) (hy : y ∈ hyperchargeSubmodule q) : - x * y ∈ hyperchargeSubmodule r := - hr ▸ mul_mem_hyperchargeSubmodule hx hy - -/-- The lepton component function carries hypercharge `6`. -/ -lemma Dψ_nil_mem_hyperchargeSubmodule (α : Fin 2) : Dψ [] α ∈ hyperchargeSubmodule 6 := by - rw [Dψ_nil] - exact ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dψ {} α) - -/-- The first covariant derivative of the lepton carries hypercharge `6`: the gauge-field term - `- 6 i B_μ ψ_α` it adds to `∂_μ ψ_α` is neutral times charge `6`. -/ -lemma Dψ_singleton_mem_hyperchargeSubmodule (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dψ [μ] α ∈ hyperchargeSubmodule 6 := by - rw [Dψ_singleton] - refine Submodule.sub_mem _ (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dψ {μ} α)) - (Submodule.smul_mem _ _ (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num [Hypercharge]) - (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dB {} μ)) - (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dψ {} α)))) - -/-- The conjugate-lepton component function carries hypercharge `-6`. -/ -lemma Dbarψ_nil_mem_hyperchargeSubmodule (α : Fin 2) : - Dbarψ [] α ∈ hyperchargeSubmodule (-6) := by - rw [Dbarψ_nil] - exact ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dbarψ {} α) - -/-- The first covariant derivative of the conjugate lepton carries hypercharge `-6`. -/ -lemma Dbarψ_singleton_mem_hyperchargeSubmodule (μ : Fin 1 ⊕ Fin 3) (α : Fin 2) : - Dbarψ [μ] α ∈ hyperchargeSubmodule (-6) := by - rw [Dbarψ_singleton] - refine Submodule.add_mem _ - (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dbarψ {μ} α)) - (Submodule.smul_mem _ _ (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num [Hypercharge]) - (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dB {} μ)) - (ofGenerator_mem_hyperchargeSubmodule (JetGenerators.dbarψ {} α)))) - -/-- Elements of the B-boson factor are neutral. -/ -lemma inclB_mem_hyperchargeSubmodule (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - inclB a ∈ hyperchargeSubmodule 0 := by - rw [mem_hyperchargeSubmodule, hyperchargePoly_inclB, LaurentPolynomial.T_zero, mul_one] - -/-- The field strength is neutral: for an abelian gauge field it lies in the B-boson factor. -/ -lemma fieldStrengthDeriv_mem_hyperchargeSubmodule (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ ν ∈ hyperchargeSubmodule 0 := - inclB_mem_hyperchargeSubmodule ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv s μ ν) - -/-! - -## F. Removing the charged sectors - -An invariant is a charge singlet, so it is fixed by `chargeComponent 0`. Applying that -projection to the sector decomposition leaves the four neutral families untouched and kills the -two like-species ones, which are homogeneous of hypercharge `± 12`. - --/ - -/-- **Where an invariant of mass dimension four lives.** An invariant of mass weight eight — - mass dimension four — lies in the join of the four neutral sector spans: the two fermionic - kinetic sectors, the second derivatives of the field strength, and the photon pairs. - - This refines `mem_massDimFour_sectors_of_isInvariant` by the hypercharge grading: the two - like-species fermionic sectors of that statement carry hypercharge `± 12`, and an invariant, - being a charge singlet, has no component in them. -/ -theorem mem_massDimFour_neutral_sectors_of_isInvariant {x : JetAlgebra} (hx : IsInvariant x) - (h8 : x ∈ massWeightSubmodule 8) : - x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'} := by - have hcov : x ∈ covWeightSpan 8 := - mem_covWeightSpan_of_mem_covariantAlgebra - ((isInvariant_iff_mem_covariantAlgebra x).mp hx).1 h8 - have hle := covWeightSpan_eight_le - (W := Submodule.comap (chargeComponent 0) - (Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν} - ⊔ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'})) - ?_ ?_ ?_ ?_ ?_ ?_ - · have h := hle hcov - rwa [Submodule.mem_comap, - chargeComponent_of_mem (mem_hyperchargeSubmodule_zero_of_isInvariant hx)] at h - · intro α μ β - rw [Submodule.mem_comap, chargeComponent_of_mem - (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) - (Dbarψ_singleton_mem_hyperchargeSubmodule μ α) (Dψ_nil_mem_hyperchargeSubmodule β))] - exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left - (Submodule.subset_span ⟨α, μ, β, rfl⟩))) - · intro α μ β - rw [Submodule.mem_comap, chargeComponent_of_mem - (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) - (Dbarψ_nil_mem_hyperchargeSubmodule α) (Dψ_singleton_mem_hyperchargeSubmodule μ β))] - exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right - (Submodule.subset_span ⟨α, μ, β, rfl⟩))) - · intro ρ τ μ ν - rw [Submodule.mem_comap, - chargeComponent_of_mem (fieldStrengthDeriv_mem_hyperchargeSubmodule {ρ, τ} μ ν)] - exact Submodule.mem_sup_left (Submodule.mem_sup_right - (Submodule.subset_span ⟨ρ, τ, μ, ν, rfl⟩)) - · intro μ ν μ' ν' - rw [Submodule.mem_comap, chargeComponent_of_mem - (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) - (fieldStrengthDeriv_mem_hyperchargeSubmodule {} μ ν) - (fieldStrengthDeriv_mem_hyperchargeSubmodule {} μ' ν'))] - exact Submodule.mem_sup_right (Submodule.subset_span ⟨μ, ν, μ', ν', rfl⟩) - · intro α μ β - rw [Submodule.mem_comap, chargeComponent_of_mem_ne (show (12 : ℤ) ≠ 0 by norm_num) - (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) - (Dψ_nil_mem_hyperchargeSubmodule α) (Dψ_singleton_mem_hyperchargeSubmodule μ β))] - exact zero_mem _ - · intro α μ β - rw [Submodule.mem_comap, chargeComponent_of_mem_ne (show (-12 : ℤ) ≠ 0 by norm_num) - (mul_mem_hyperchargeSubmodule_of_add_eq (by norm_num) - (Dbarψ_nil_mem_hyperchargeSubmodule α) - (Dbarψ_singleton_mem_hyperchargeSubmodule μ β))] - exact zero_mem _ - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean deleted file mode 100644 index 3d3b59e4e..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/MassDimFour/LinearIndependence.lean +++ /dev/null @@ -1,499 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.FermionicBarKineticTerm.LinearIndependence -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.GaugeDoubleDeriv.LinearIndependence -public import Physlib.Particles.LeptonGaugeSector.JetAlgebra.CovariantAlgebra -/-! -# Independence of the four mass-dimension-four sectors - -## i. Overview - -The four sectors an invariant of mass dimension four decomposes into — - -| sector | spanned by | -|---|---| -| `A` | `D̄_μ ψ̄_α ψ_β` | -| `B` | `ψ̄_α D_μ ψ_β` | -| `C` | `∂_ρ ∂_τ F_{μν}` | -| `D` | `F_{μν} F_{μ'ν'}` | - -— are independent: `eq_zero_of_massDimFour_sum_eq_zero` says that if one element of each sums to -zero then all four are zero. Equivalently the sum `A ⊔ B ⊔ C ⊔ D` is direct. - -## ii. Why it is wanted - -Each sector has been cut down to its invariants separately, and those four results are combined -in `MassDimFour.Classification`. They do not compose without this file: membership of the join -gives a decomposition `x = a + b + c + d`, but every sector theorem needs *its own* summand to be -invariant, and invariance of `x` says nothing about the summands unless the decomposition is -unique. Independence is exactly that uniqueness. - -Only one of the three splittings is genuinely delicate. Fermionic against bosonic is the lepton -exterior degree, `2` against `0`; `∂∂F` against `F F` is the gauge-field degree, `1` against `2`. -But `A` against `B` — whether the derivative sits on `ψ̄` or on `ψ` — is separated by no grading -at all: `D̄_μ ψ̄_α ψ_β = ∂_μ ψ̄_α ψ_β + 6 i B_μ ψ̄_α ψ_β` is inhomogeneous for every grading in -sight, the covariant derivative being what mixes them. It needs a dual family. - -## iii. The dual families - -Each sector file already carries a family of functionals dual to its own spanning set. What is -added here is that each family is blind to the other three sectors. - -- `fermionDual` reads a coefficient of `ψ̄_α D_μ ψ_β`. Being an exterior *degree-two* functional - it kills the two bosonic sectors outright; and on `D̄_μ ψ̄_α ψ_β` it vanishes because it looks - for a derivative index on the unbarred factor, where there is none. -- `fermionBarDual` is the mirror image. -- `gaugeDerivDual'` reads a coefficient of a gauge-field generator. It is built here as the - *linear part* of the gauge-field evaluation — `gaugeDerivDual` corrected by half the second - polarization — so that, unlike `gaugeDerivDual` itself, it annihilates the photon pairs. The - augmentation of the lepton factor it carries kills the two fermionic sectors. - -## iv. Key results - -- `JetAlgebra.gaugeDerivDual'` : the linear part of the gauge-field evaluation. -- `JetAlgebra.eq_zero_of_forall_fermionDual_eq_zero` and its two companions : each family - separates its own sector. -- `JetAlgebra.eq_zero_of_massDimFour_sum_eq_zero` : **the four sectors are independent**. - -## v. Table of contents - -- A. The fermionic duals are blind to the other sectors -- B. The gauge duals are blind to the fermionic sectors -- C. The linear part of the gauge-field evaluation -- D. Each family separates its own sector -- E. Independence of the four sectors - --/ - -@[expose] public section - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -/-! - -## A. The fermionic duals are blind to the other sectors - -`fermionPairDual` is an exterior degree-two functional on the lepton factor, so it vanishes on -anything whose lepton factor is trivial — which is what the two bosonic sectors are. On the -opposite fermionic sector it vanishes for a different reason: `fermionDual` looks for a -derivative index on the unbarred factor, and in `D̄_μ ψ̄_α ψ_β` there is none. - --/ - -/-- The degree-two functional vanishes on the unit: the alternating family defining it is zero - outside degree two. -/ -@[simp] -lemma extPairDual_one {V : Type} [AddCommGroup V] [Module ℂ V] - (φ ψ : Module.Dual ℂ V) : extPairDual φ ψ 1 = 0 := by - rw [extPairDual, ExteriorAlgebra.liftAlternating_one] - rfl - -/-- The fermionic duals vanish on an element with trivial lepton factor. -/ -@[simp] -lemma fermionPairDual_tmul_one (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) : fermionPairDual φ ψ (a ⊗ⱼ 1) = 0 := by - rw [fermionPairDual_tmul, extPairDual_one, mul_zero] - -/-- The fermionic duals vanish on a field-strength derivative. -/ -@[simp] -lemma fermionPairDual_fieldStrengthDeriv (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - fermionPairDual φ ψ (fieldStrengthDeriv s μ ν) = 0 := - fermionPairDual_tmul_one φ ψ _ - -/-- The fermionic duals vanish on a photon pair. -/ -@[simp] -lemma fermionPairDual_fieldStrengthDeriv_mul - (φ ψ : Module.Dual ℂ LeptonSinglet.JetComponentSpace) - (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : - fermionPairDual φ ψ (fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' μ' ν') = 0 := by - rw [fieldStrengthDeriv, fieldStrengthDeriv, tmul_mul_tmul, mul_one, fermionPairDual_tmul_one] - -/-- **`fermionDual` is blind to the conjugate kinetic sector.** It reads the coefficient of - `ψ̄_α D_μ ψ_β`, where the derivative index sits on the unbarred factor; in `D̄_μ ψ̄_α ψ_β` it - sits on the barred one, so neither term of the product matches. -/ -@[simp] -lemma fermionDual_Dbarψ_singleton_mul_Dψ_nil (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) - (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : - fermionDual q (Dbarψ [μ] α * Dψ [] β) = 0 := by - obtain ⟨α₀, μ₀, β₀⟩ := q - rw [Dbarψ_singleton, Dψ_nil, add_mul, smul_mul_assoc, mul_assoc] - simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, - JetAlgebra.tmul_mul_tmul, one_mul, map_add, map_smul, - fermionDual, fermionPairDual_tmul, - LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] - simp only [Module.Basis.coord_apply, Module.Basis.repr_self, - Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, - LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq] - simp - -/-- **`fermionBarDual` is blind to the kinetic sector.** The mirror image of - `fermionDual_Dbarψ_singleton_mul_Dψ_nil`. -/ -@[simp] -lemma fermionBarDual_Dbarψ_nil_mul_Dψ_singleton (q : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2) - (α : Fin 2) (μ : Fin 1 ⊕ Fin 3) (β : Fin 2) : - fermionBarDual q (Dbarψ [] α * Dψ [μ] β) = 0 := by - obtain ⟨α₀, μ₀, β₀⟩ := q - rw [Dbarψ_nil, Dψ_singleton, mul_sub, mul_smul_comm, ← mul_assoc] - simp only [ofGenerator_dbarψ_eq, ofGenerator_dψ_eq, ofGenerator_B_eq, - JetAlgebra.tmul_mul_tmul, mul_one, map_sub, map_smul, - fermionBarDual, fermionPairDual_tmul, - LeptonSinglet.JetAlgebra.ofGenerator, extPairDual_ι_mul_ι] - simp only [Module.Basis.coord_apply, Module.Basis.repr_self, - Finsupp.single_apply, LeptonSinglet.JetGenerators.dbarψ.injEq, - LeptonSinglet.JetGenerators.dψ.injEq, reduceCtorEq] - simp - -/-! - -## B. The gauge duals are blind to the fermionic sectors - -Both gauge dual families are a functional on the B-boson factor tensored with the augmentation -`augL` of the lepton factor. The augmentation kills a single lepton component function, so such -a dual vanishes on a product of two linear-matter elements — which is what a fermion bilinear -is. - --/ - -/-- A functional on the B-boson factor, extended to the jet algebra by the augmentation of the - lepton factor. Both `gaugeLinDual` and `gaugePairDual` are of this form. -/ -noncomputable def augLDual (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) : JetAlgebra →ₗ[ℂ] ℂ := - TensorProduct.lift (((LinearMap.mul ℂ ℂ).comp f).compl₂ augL.toLinearMap) - -@[simp] -lemma augLDual_tmul (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) - (a : ℂ ⊗[ℝ] BBoson.JetAlgebra) (b : LeptonSinglet.JetAlgebra) : - augLDual f (a ⊗ⱼ b) = f a * augL b := rfl - -lemma gaugePairDual_eq (φ ψ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : - gaugePairDual φ ψ = augLDual (symPairDual φ ψ) := rfl - -lemma gaugeLinDual_eq (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) : - gaugeLinDual φ = augLDual (symLinDual φ) := rfl - -/-- The augmentation kills a lepton component function. -/ -@[simp] -lemma augL_ι (m : LeptonSinglet.JetComponentSpace) : augL (ExteriorAlgebra.ι ℂ m) = 0 := by - rw [augL, ExteriorAlgebra.lift_ι_apply] - rfl - -/-- **The gauge duals vanish on a product of two linear-matter elements.** The lepton factor of - such a product has exterior degree two, and the augmentation kills it. -/ -lemma augLDual_mul_of_mem_LinearMatterSubmodule (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) - {u v : JetAlgebra} (hu : u ∈ LinearMatterSubmodule) (hv : v ∈ LinearMatterSubmodule) : - augLDual f (u * v) = 0 := by - have hd₁ : ∀ a b c : JetAlgebra, (a + b) * c = a * c + b * c := distrib_add_mul - have hd₂ : ∀ a b c : JetAlgebra, a * (b + c) = a * b + a * c := distrib_mul_add - have hs₁ : ∀ (r : ℂ) (a b : JetAlgebra), (r • a) * b = r • (a * b) := - fun r a b => smul_mul_assoc r a b - have hs₂ : ∀ (r : ℂ) (a b : JetAlgebra), a * (r • b) = r • (a * b) := - fun r a b => mul_smul_comm r a b - induction hu using Submodule.span_induction with - | mem z hz => - obtain ⟨p, m, rfl⟩ := hz - induction hv using Submodule.span_induction with - | mem w hw => - obtain ⟨q, n, rfl⟩ := hw - rw [tmul_mul_tmul, augLDual_tmul, map_mul augL, augL_ι, zero_mul, mul_zero] - | zero => rw [mul_zero, map_zero] - | add a b _ _ ha hb => rw [hd₂, map_add, ha, hb, add_zero] - | smul r a _ ha => rw [hs₂, map_smul, ha, smul_zero] - | zero => rw [zero_mul, map_zero] - | add a b _ _ ha hb => rw [hd₁, map_add, ha, hb, add_zero] - | smul r a _ ha => rw [hs₁, map_smul, ha, smul_zero] - -/-- The gauge duals vanish on a fermion bilinear. -/ -lemma augLDual_Dbarψ_mul_Dψ (f : (ℂ ⊗[ℝ] BBoson.JetAlgebra) →ₗ[ℂ] ℂ) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - augLDual f (Dbarψ l α * Dψ l' β) = 0 := - augLDual_mul_of_mem_LinearMatterSubmodule f (Dbarψ_mem_LinearMatterSubmodule l α) - (Dψ_mem_LinearMatterSubmodule l' β) - -/-! - -## C. The linear part of the gauge-field evaluation - -`gaugeDerivDual` reads the coefficient of a gauge-field generator, but it is the *affine* -difference `symEval φ - symEval 0`, which on a degree-two monomial `g h` returns `φ g · φ h` -rather than zero. Subtracting half the second polarization, which returns `2 φ g · φ h` there -and vanishes in degree one, leaves the genuine linear part: `gaugeDerivDual'` still reads the -coefficient of a generator, and now annihilates the photon pairs as well. - --/ - -/-- The coordinate functional at the gauge-field generator `p`, valued in `ℂ`. -/ -noncomputable def bCoord (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : - BBoson.JetComponentSpace →ₗ[ℝ] ℂ := - (BBoson.JetComponentSpace.basis.coord (BBoson.JetGenerators.dB p.1 p.2)).smulRight (1 : ℂ) - -@[simp] -lemma bCoord_basis (p q : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : - bCoord p (BBoson.JetComponentSpace.basis (BBoson.JetGenerators.dB q.1 q.2)) = - if q = p then 1 else 0 := by - rw [bCoord, LinearMap.smulRight_apply, Module.Basis.coord_apply, Module.Basis.repr_self, - Finsupp.single_apply] - by_cases h : q = p - · subst h - simp - · have hne : ¬ BBoson.JetGenerators.dB q.1 q.2 = BBoson.JetGenerators.dB p.1 p.2 := by - rw [BBoson.JetGenerators.dB.injEq] - exact fun hg => h (Prod.ext hg.1 hg.2) - rw [if_neg hne, if_neg h, zero_smul] - -/-- `gaugeDerivDual` is the affine difference at the coordinate functional. -/ -lemma gaugeDerivDual_eq (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : - gaugeDerivDual p = gaugeLinDual (bCoord p) := rfl - -/-- **The linear part of the gauge-field evaluation.** It reads the coefficient of the - gauge-field generator `p`, and is blind to the degrees zero and two. -/ -noncomputable def gaugeDerivDual' (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : - JetAlgebra →ₗ[ℂ] ℂ := - gaugeDerivDual p - (2⁻¹ : ℂ) • gaugePairDual (bCoord p) (bCoord p) - -lemma gaugeDerivDual'_apply (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) (x : JetAlgebra) : - gaugeDerivDual' p x = - gaugeDerivDual p x - (2⁻¹ : ℂ) * gaugePairDual (bCoord p) (bCoord p) x := by - rw [gaugeDerivDual', LinearMap.sub_apply, LinearMap.smul_apply, smul_eq_mul] - -/-- On a field-strength derivative the correction term vanishes, and the linear part reads the - same antisymmetric coefficient as `gaugeDerivDual`. -/ -@[simp] -lemma gaugeDerivDual'_fieldStrengthDeriv (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - gaugeDerivDual' p (fieldStrengthDeriv s μ ν) = fsDerivCoeff p s μ ν := by - rw [gaugeDerivDual'_apply, gaugeDerivDual_fieldStrengthDeriv, - gaugePairDual_fieldStrengthDeriv, mul_zero, sub_zero] - -/-- The linear part reads the coefficient of a gauge-field generator. -/ -@[simp] -lemma gaugeDerivDual'_ofGenerator (p q : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) : - gaugeDerivDual' p (ofGenerator (JetGenerators.dB q.1 q.2)) = if q = p then 1 else 0 := by - rw [gaugeDerivDual'_apply, gaugeDerivDual_eq, gaugeLinDual_ofGenerator, - show gaugePairDual (bCoord p) (bCoord p) (ofGenerator (JetGenerators.dB q.1 q.2)) = 0 from by - rw [ofGenerator_B_eq, gaugePairDual_tmul, symPairDual_tmul_ofGenerator_eq_zero, zero_mul], - mul_zero, sub_zero, bCoord_basis] - -/-- The affine difference on a degree-two monomial is the product of the two values. -/ -lemma symLinDual_tmul_ofGenerator_mul (φ : BBoson.JetComponentSpace →ₗ[ℝ] ℂ) - (g h : BBoson.JetGenerators) : - symLinDual φ ((1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator g) * - (1 ⊗ₜ[ℝ] BBoson.JetAlgebra.ofGenerator h)) = - φ (BBoson.JetComponentSpace.basis g) * φ (BBoson.JetComponentSpace.basis h) := by - simp only [symLinDual, LinearMap.sub_apply, AlgHom.toLinearMap_apply, map_mul, - symEval_tmul_ofGenerator, LinearMap.zero_apply] - ring - -/-- **The linear part annihilates a product of two gauge-field generators.** The affine - difference returns `φ g · φ h` there and half the second polarization returns the same. -/ -lemma gaugeDerivDual'_ofGenerator_mul (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (g h : BBoson.JetGenerators) : - gaugeDerivDual' p (ofGenerator (JetGenerators.dB g.1 g.2) * - ofGenerator (JetGenerators.dB h.1 h.2)) = 0 := by - obtain ⟨s, μ⟩ := g - obtain ⟨t, ν⟩ := h - rw [gaugeDerivDual'_apply, gaugeDerivDual_eq, gaugeLinDual_eq, gaugePairDual_eq, - ofGenerator_B_eq, ofGenerator_B_eq, tmul_mul_tmul, mul_one, augLDual_tmul, augLDual_tmul, - map_one, mul_one, mul_one, symLinDual_tmul_ofGenerator_mul, - symPairDual_tmul_ofGenerator_mul] - ring - -/-- The linear part annihilates a photon pair: each field strength is a difference of two - gauge-field generators, so the product is a combination of degree-two monomials. -/ -@[simp] -lemma gaugeDerivDual'_fieldStrengthDeriv_mul (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : - gaugeDerivDual' p (fieldStrengthDeriv s μ ν * fieldStrengthDeriv s' μ' ν') = 0 := by - have hg : ∀ (a b : Multiset (Fin 1 ⊕ Fin 3)) (σ τ : Fin 1 ⊕ Fin 3), - gaugeDerivDual' p (ofGenerator (JetGenerators.dB a σ) * - ofGenerator (JetGenerators.dB b τ)) = 0 := - fun a b σ τ => gaugeDerivDual'_ofGenerator_mul p - (BBoson.JetGenerators.dB a σ) (BBoson.JetGenerators.dB b τ) - rw [fieldStrengthDeriv_eq_sub, fieldStrengthDeriv_eq_sub, sub_mul, mul_sub, mul_sub, - map_sub, map_sub, map_sub, - hg (s + {μ}) (s' + {μ'}) ν ν', hg (s + {μ}) (s' + {ν'}) ν μ', - hg (s + {ν}) (s' + {μ'}) μ ν', hg (s + {ν}) (s' + {ν'}) μ μ'] - ring - -/-- The linear part annihilates a fermion bilinear: it carries the augmentation of the lepton - factor. -/ -@[simp] -lemma gaugeDerivDual'_Dbarψ_mul_Dψ (p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3)) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - gaugeDerivDual' p (Dbarψ l α * Dψ l' β) = 0 := by - rw [gaugeDerivDual'_apply, gaugeDerivDual_eq, gaugeLinDual_eq, gaugePairDual_eq, - augLDual_Dbarψ_mul_Dψ, augLDual_Dbarψ_mul_Dψ, mul_zero, sub_zero] - -/-! - -## D. Each family separates its own sector - -A functional vanishing on a spanning set vanishes on the span, so the cross-vanishing above -extends from the generators to the sectors. In the other direction each family is dual to its -own spanning set, so an element of that sector on which the whole family vanishes is zero. - --/ - -/-- A functional vanishing on a spanning set vanishes on the span. -/ -lemma apply_eq_zero_of_mem_span {f : JetAlgebra →ₗ[ℂ] ℂ} {S : Set JetAlgebra} - (hS : ∀ y ∈ S, f y = 0) {x : JetAlgebra} (hx : x ∈ Submodule.span ℂ S) : f x = 0 := - Submodule.span_le.mpr (fun y hy => LinearMap.mem_ker.mpr (hS y hy)) hx - -/-- The kinetic sector, presented as the span of a family indexed by a finite type. -/ -lemma span_Dbarψ_nil_mul_Dψ_singleton_eq : - {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β} = - Set.range fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ [] p.1 * Dψ [p.2.1] p.2.2 := - Set.ext fun _ => ⟨fun ⟨α, μ, β, h⟩ => ⟨(α, μ, β), h.symm⟩, - fun ⟨p, h⟩ => ⟨p.1, p.2.1, p.2.2, h.symm⟩⟩ - -/-- The conjugate kinetic sector, presented as the span of a family indexed by a finite type. -/ -lemma span_Dbarψ_singleton_mul_Dψ_nil_eq : - {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β} = - Set.range fun p : Fin 2 × (Fin 1 ⊕ Fin 3) × Fin 2 => Dbarψ [p.2.1] p.1 * Dψ [] p.2.2 := - Set.ext fun _ => ⟨fun ⟨α, μ, β, h⟩ => ⟨(α, μ, β), h.symm⟩, - fun ⟨p, h⟩ => ⟨p.1, p.2.1, p.2.2, h.symm⟩⟩ - -/-- **`fermionDual` separates the kinetic sector.** -/ -lemma eq_zero_of_forall_fermionDual_eq_zero {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) - (h : ∀ q, fermionDual q x = 0) : x = 0 := by - rw [span_Dbarψ_nil_mul_Dψ_singleton_eq, Submodule.mem_span_range_iff_exists_fun] at hx - obtain ⟨c, rfl⟩ := hx - have hc : ∀ q, c q = 0 := by - intro q - have hq := h q - rw [map_sum] at hq - simp only [map_smul, smul_eq_mul, fermionDual_Dbarψ_mul_Dψ, mul_ite, mul_one, mul_zero, - Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at hq - exact hq - simp only [hc, zero_smul, Finset.sum_const_zero] - -/-- **`fermionBarDual` separates the conjugate kinetic sector.** -/ -lemma eq_zero_of_forall_fermionBarDual_eq_zero {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) - (h : ∀ q, fermionBarDual q x = 0) : x = 0 := by - rw [span_Dbarψ_singleton_mul_Dψ_nil_eq, Submodule.mem_span_range_iff_exists_fun] at hx - obtain ⟨c, rfl⟩ := hx - have hc : ∀ q, c q = 0 := by - intro q - have hq := h q - rw [map_sum] at hq - simp only [map_smul, smul_eq_mul, fermionBarDual_Dbarψ_mul_Dψ, mul_ite, mul_one, mul_zero, - Finset.sum_ite_eq' Finset.univ q c, Finset.mem_univ, if_true] at hq - exact hq - simp only [hc, zero_smul, Finset.sum_const_zero] - -/-- The span of the gauge-field generators: the elements linear in the gauge field. -/ -noncomputable def gaugeGenSpan : Submodule ℂ JetAlgebra := - Submodule.span ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ofGenerator (JetGenerators.dB p.1 p.2)) - -/-- A gauge-field generator is linear in the gauge field. -/ -lemma ofGenerator_dB_mem_gaugeGenSpan (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - ofGenerator (JetGenerators.dB s μ) ∈ gaugeGenSpan := - Submodule.subset_span ⟨(s, μ), rfl⟩ - -/-- A field-strength derivative is linear in the gauge field. -/ -lemma fieldStrengthDeriv_mem_gaugeGenSpan (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : fieldStrengthDeriv s μ ν ∈ gaugeGenSpan := by - rw [fieldStrengthDeriv_eq_sub] - exact sub_mem (ofGenerator_dB_mem_gaugeGenSpan _ _) (ofGenerator_dB_mem_gaugeGenSpan _ _) - -/-- **The linear parts separate the elements linear in the gauge field.** -/ -lemma eq_zero_of_mem_gaugeGenSpan_of_forall_gaugeDerivDual' {x : JetAlgebra} - (hx : x ∈ gaugeGenSpan) (h : ∀ p, gaugeDerivDual' p x = 0) : x = 0 := by - classical - rw [gaugeGenSpan, Finsupp.mem_span_range_iff_exists_finsupp] at hx - obtain ⟨c, rfl⟩ := hx - have hc : ∀ p, c p = 0 := by - intro p - have hp := h p - rw [Finsupp.sum, map_sum] at hp - simp only [map_smul, smul_eq_mul, gaugeDerivDual'_ofGenerator, mul_ite, mul_one, mul_zero, - Finset.sum_ite_eq' c.support p c] at hp - by_cases hs : p ∈ c.support - · rwa [if_pos hs] at hp - · exact Finsupp.notMem_support_iff.mp hs - rw [show c = 0 from Finsupp.ext hc, Finsupp.sum_zero_index] - -/-- **The linear parts separate the sector of second derivatives of the field strength.** -/ -lemma eq_zero_of_forall_gaugeDerivDual'_eq_zero {x : JetAlgebra} - (hx : x ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) - (h : ∀ p, gaugeDerivDual' p x = 0) : x = 0 := by - refine eq_zero_of_mem_gaugeGenSpan_of_forall_gaugeDerivDual' (Submodule.span_le.mpr ?_ hx) h - rintro _ ⟨ρ, τ, μ, ν, rfl⟩ - exact fieldStrengthDeriv_mem_gaugeGenSpan {ρ, τ} μ ν - -/-! - -## E. Independence of the four sectors - -Each family kills the three sectors that are not its own, so applying it to a vanishing sum of -four sector elements leaves only its own summand, which it then separates. The photon pairs are -reached last, by subtraction. - --/ - -/-- **The four mass-dimension-four sectors are independent.** If one element of each sums to - zero then all four vanish; equivalently the join of the four sector spans is direct. This is - what makes the sector components of an invariant well defined, and hence invariant. -/ -theorem eq_zero_of_massDimFour_sum_eq_zero {a b c d : JetAlgebra} - (ha : a ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [μ] α * Dψ [] β}) - (hb : b ∈ Submodule.span ℂ {y : JetAlgebra | ∃ α μ β, y = Dbarψ [] α * Dψ [μ] β}) - (hc : c ∈ Submodule.span ℂ {y : JetAlgebra | ∃ ρ τ μ ν, y = fieldStrengthDeriv {ρ, τ} μ ν}) - (hd : d ∈ Submodule.span ℂ {y : JetAlgebra | ∃ μ ν μ' ν', - y = fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ' ν'}) - (h : a + b + c + d = 0) : a = 0 ∧ b = 0 ∧ c = 0 ∧ d = 0 := by - have hb0 : b = 0 := by - refine eq_zero_of_forall_fermionDual_eq_zero hb fun q => ?_ - have hqa : fermionDual q a = 0 := - apply_eq_zero_of_mem_span (by rintro _ ⟨α, μ, β, rfl⟩; exact - fermionDual_Dbarψ_singleton_mul_Dψ_nil q α μ β) ha - have hqc : fermionDual q c = 0 := - apply_eq_zero_of_mem_span (by rintro _ ⟨ρ, τ, μ, ν, rfl⟩; exact - fermionPairDual_fieldStrengthDeriv _ _ _ _ _) hc - have hqd : fermionDual q d = 0 := - apply_eq_zero_of_mem_span (by rintro _ ⟨μ, ν, μ', ν', rfl⟩; exact - fermionPairDual_fieldStrengthDeriv_mul _ _ _ _ _ _ _ _) hd - have hsum := congrArg (fermionDual q) h - rw [map_add, map_add, map_add, map_zero, hqa, hqc, hqd] at hsum - simpa using hsum - have ha0 : a = 0 := by - refine eq_zero_of_forall_fermionBarDual_eq_zero ha fun q => ?_ - have hqb : fermionBarDual q b = 0 := - apply_eq_zero_of_mem_span (by rintro _ ⟨α, μ, β, rfl⟩; exact - fermionBarDual_Dbarψ_nil_mul_Dψ_singleton q α μ β) hb - have hqc : fermionBarDual q c = 0 := - apply_eq_zero_of_mem_span (by rintro _ ⟨ρ, τ, μ, ν, rfl⟩; exact - fermionPairDual_fieldStrengthDeriv _ _ _ _ _) hc - have hqd : fermionBarDual q d = 0 := - apply_eq_zero_of_mem_span (by rintro _ ⟨μ, ν, μ', ν', rfl⟩; exact - fermionPairDual_fieldStrengthDeriv_mul _ _ _ _ _ _ _ _) hd - have hsum := congrArg (fermionBarDual q) h - rw [map_add, map_add, map_add, map_zero, hqb, hqc, hqd] at hsum - simpa using hsum - have hc0 : c = 0 := by - refine eq_zero_of_forall_gaugeDerivDual'_eq_zero hc fun p => ?_ - have hpd : gaugeDerivDual' p d = 0 := - apply_eq_zero_of_mem_span (by rintro _ ⟨μ, ν, μ', ν', rfl⟩; exact - gaugeDerivDual'_fieldStrengthDeriv_mul _ _ _ _ _ _ _) hd - have hcd : c + d = 0 := by rw [ha0, hb0, zero_add, zero_add] at h; exact h - have hsum := congrArg (gaugeDerivDual' p) hcd - rw [map_add, map_zero, hpd, add_zero] at hsum - exact hsum - refine ⟨ha0, hb0, hc0, ?_⟩ - rw [ha0, hb0, hc0, zero_add, zero_add, zero_add] at h - exact h - -end JetAlgebra - -end LeptonGaugeSector - -end diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean deleted file mode 100644 index c314d8178..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/KineticTerms.lean +++ /dev/null @@ -1,354 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.ThetaTerm -/-! -# The fermion kinetic terms - -The kinetic terms `i ψ̄ σ̄^μ (D_μ ψ)` and `-i (D̄_μ ψ̄) σ̄^μ ψ` of the charged -lepton. Gauge invariance is the cancellation of the hypercharge characters -between the lepton and its conjugate; Lorentz invariance is the intertwining -identity of the contraction matrices `σ̄^μ`. Both have mass weight eight. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The spinor contraction matrices of the right-handed kinetic term: the - transposed covariant Pauli matrices `(σ̄^μ)ᵀ = (1, -σ1, σ2, -σ3)`. In the - conventions of this repository the right-handed lepton field transforms by - the entrywise conjugate of `Λ` and its jet coordinates by the contragredient - dual, so the pairing of `ψ̄_α`, `(D_μ ψ)_β` and the derivative index `μ` is - Lorentz invariant precisely through these matrices; this is the intertwining - identity `sum_kineticPauli_contraction` below. -/ -noncomputable def kineticPauli (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := - ((PauliMatrix.pauliSelfAdjoint' μ).1)ᵀ - -/-- The fermion kinetic term `i ψ̄_α (σ̄^μ)ᵀ_{α β} (D_μ ψ)_β` of the - right-handed charged-lepton singlet, with the covariant derivative on the - lepton. Mass weight eight. -/ -noncomputable def fermionKineticTerm : JetAlgebra := - Complex.I • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [] α * Dψ [μ] β) - -/-- The conjugate fermion kinetic term `-i (D̄_μ ψ̄)_α (σ̄^μ)ᵀ_{α β} ψ_β`, with - the covariant derivative on the conjugate lepton. Mass weight eight. -/ -noncomputable def fermionKineticTermBar : JetAlgebra := - (-Complex.I) • ∑ μ, ∑ α, ∑ β, kineticPauli μ α β • (Dbarψ [μ] α * Dψ [] β) - -/-- The hypercharge scalars of a lepton–conjugate-lepton pair cancel by - unitarity. -/ -lemma repJetGaugeGroupI_Dbarψ_mul_Dψ (U : JetGaugeGroupI) - (l l' : List (Fin 1 ⊕ Fin 3)) (α β : Fin 2) : - repJetGaugeGroupI U (Dbarψ l α * Dψ l' β) = Dbarψ l α * Dψ l' β := by - have hz : star ((U.eval.2.2 : unitary ℂ) : ℂ) * ((U.eval.2.2 : unitary ℂ) : ℂ) = 1 := - (Unitary.mem_iff.mp (U.eval.2.2).2).1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_Dψ, repJetGaugeGroupI_Dbarψ, - Submonoid.smul_def, Submonoid.smul_def, SubmonoidClass.coe_pow, - SubmonoidClass.coe_pow, Unitary.coe_star, smul_mul_smul_comm, ← mul_pow, hz, - one_pow, one_smul] - -lemma repJetGaugeGroupI_fermionKineticTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U fermionKineticTerm = fermionKineticTerm := by - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] - -lemma repJetGaugeGroupI_fermionKineticTermBar (U : JetGaugeGroupI) : - repJetGaugeGroupI U fermionKineticTermBar = fermionKineticTermBar := by - rw [fermionKineticTermBar, map_smul] - congr 1 - rw [map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [map_smul, repJetGaugeGroupI_Dbarψ_mul_Dψ] - -/-- The Lorentz intertwining identity of the kinetic contraction matrices: - transporting the two spinor slots contragrediently and the derivative slot by - the Lorentz matrix reproduces the contraction matrices. This is the identity - `L(Λ) L(Λ⁻¹) = 1` transported through `L(M†) = L(M)ᵀ`. -/ -lemma sum_kineticPauli_contraction (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) - (α' β' : Fin 2) : - ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' := by - classical - have hdet : Matrix.det ((Λ⁻¹).1ᴴ) = 1 := by - rw [Matrix.det_conjTranspose, Matrix.SpecialLinearGroup.det_coe] - exact star_one ℂ - have hval : ∀ μ, (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 = - ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - intro μ - have h := congrArg Subtype.val - (Lorentz.SL2C.toSelfAdjointMap_basis - (M := (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))) μ) - simp only [Lorentz.SL2C.toSelfAdjointMap_apply_coe, PauliMatrix.pauliBasis', - Module.Basis.coe_mk, AddSubmonoidClass.coe_finsetSum, - selfAdjoint.val_smul] at h - calc (Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1 - = ∑ j, (Lorentz.SL2C.toLorentzGroup - (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 j μ • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - rw [← h] - congr 1 - rw [show ((⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ)) : - Matrix (Fin 2) (Fin 2) ℂ)ᴴ = (Λ⁻¹).1 from - Matrix.conjTranspose_conjTranspose _] - _ = ∑ j, (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j • - (PauliMatrix.pauliSelfAdjoint' j).1 := by - refine Finset.sum_congr rfl fun j _ => ?_ - congr 1 - rw [show (Lorentz.SL2C.toLorentzGroup - (⟨(Λ⁻¹).1ᴴ, hdet⟩ : SL(2,ℂ))).1 = - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1ᵀ from - Lorentz.SL2C.toLorentzGroup_conjTranspose rfl, - Matrix.transpose_apply] - have hsand : ∀ μ, (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β'))) = - ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - intro μ - have hentry := congrArg (fun A : Matrix (Fin 2) (Fin 2) ℂ => A β' α') (hval μ) - simp only [Matrix.sum_apply, Matrix.smul_apply] at hentry - calc (∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * star ((Λ⁻¹).1 β β'))) - = ((Λ⁻¹).1ᴴ * (PauliMatrix.pauliSelfAdjoint' μ).1 * (Λ⁻¹).1) β' α' := by - rw [Matrix.mul_apply] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [Matrix.mul_apply, Finset.sum_mul] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [Matrix.conjTranspose_apply, kineticPauli, Matrix.transpose_apply] - ring - _ = ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - rw [hentry] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [kineticPauli, Matrix.transpose_apply, Complex.real_smul] - calc ∑ μ, ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β'))) - = ∑ μ, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - ∑ α, ∑ β, kineticPauli μ α β * ((Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β')) := by - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [Finset.mul_sum] - refine Finset.sum_congr rfl fun α _ => ?_ - rw [Finset.mul_sum] - refine Finset.sum_congr rfl fun β _ => ?_ - ring - _ = ∑ μ, ∑ j, (((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - ((((Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β') := by - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [hsand, Finset.mul_sum] - _ = ∑ j, ((∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j : ℝ) : ℂ) * - kineticPauli j α' β' := by - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [Complex.ofReal_sum, Finset.sum_mul] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [Complex.ofReal_mul] - ring - _ = kineticPauli ν α' β' := by - have hmul : ∀ j, (∑ μ, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 μ j) = - ((1 : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ)) ν j := by - intro j - rw [← Matrix.mul_apply, - show ((Lorentz.SL2C.toLorentzGroup Λ).1 * - (Lorentz.SL2C.toLorentzGroup Λ⁻¹).1 : - Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) = - ((Lorentz.SL2C.toLorentzGroup Λ * - Lorentz.SL2C.toLorentzGroup Λ⁻¹ : LorentzGroup 3) : - Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) from rfl, - ← map_mul, mul_inv_cancel, map_one] - rfl - simp only [hmul, Matrix.one_apply] - rw [Finset.sum_eq_single ν (fun j _ hj => by - rw [if_neg (Ne.symm hj), Complex.ofReal_zero, zero_mul]) - (fun h => absurd (Finset.mem_univ ν) h), if_pos rfl, - Complex.ofReal_one, one_mul] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the fermion kinetic term: the transformation of the - two spinor slots and the derivative slot cancels through the intertwining - identity of the contraction matrices. -/ -lemma repLorentzGroup_fermionKineticTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTerm = fermionKineticTerm := by - have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [fermionKineticTerm, map_smul] - congr 1 - rw [map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, α]; rw [map_sum] - conv_lhs => - enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_nil, - repLorentzGroup_Dψ_singleton] - simp only [hsmF, hmsS, hmsF, hsmul, Finset.smul_sum, smul_smul] - -- move the primed sums out and the unprimed sums in - conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α', 2, ν]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, α', 2, ν]; rw [Finset.sum_comm] - conv_rhs => rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun α' _ => Finset.sum_congr rfl fun ν _ => - Finset.sum_congr rfl fun β' _ => ?_ - conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] - conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] - rw [← Finset.sum_smul] - rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * - ((Λ⁻¹).1 α α' * ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * - star ((Λ⁻¹).1 β β')))) = kineticPauli ν α' β' from - sum_kineticPauli_contraction Λ ν α' β'] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the conjugate fermion kinetic term. -/ -lemma repLorentzGroup_fermionKineticTermBar (Λ : SL(2,ℂ)) : - repLorentzGroup Λ fermionKineticTermBar = fermionKineticTermBar := by - have hsmS : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hmsF : ∀ (f : Fin 2 → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - rw [fermionKineticTermBar, map_smul] - congr 1 - rw [map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, α]; rw [map_sum] - conv_lhs => - enter [2, μ, 2, α, 2, β] - rw [map_smul, repLorentzGroup_apply_mul, repLorentzGroup_Dbarψ_singleton, - repLorentzGroup_Dψ_nil] - simp only [hsmS, hsmF, hmsF, hsmul, Finset.smul_sum, smul_smul] - -- move the transformed sums out and the original sums in - conv_lhs => enter [2, μ, 2, α]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, α, 2, ν, 2, α']; rw [Finset.sum_comm] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, ν, 2, α']; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, ν]; rw [Finset.sum_comm] - conv_lhs => enter [2, ν, 2, α']; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun α' _ => - Finset.sum_congr rfl fun β' _ => ?_ - conv_lhs => enter [2, μ, 2, α]; rw [← Finset.sum_smul] - conv_lhs => enter [2, μ]; rw [← Finset.sum_smul] - rw [← Finset.sum_smul] - rw [show (∑ μ, ∑ α, ∑ β, kineticPauli μ α β * - ((((Lorentz.SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 α α' * - star ((Λ⁻¹).1 β β'))) = kineticPauli ν α' β' from by - rw [← sum_kineticPauli_contraction Λ ν α' β'] - refine Finset.sum_congr rfl fun μ _ => Finset.sum_congr rfl fun α _ => - Finset.sum_congr rfl fun β _ => ?_ - ring] - -lemma fermionKineticTerm_mem_massWeightLESubmodule : - fermionKineticTerm ∈ MassWeightLESubmodule 8 := by - rw [fermionKineticTerm] - refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => - Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => - Submodule.smul_mem _ _ ?_) - refine mem_massWeightLESubmodule_of_mem (n := 8) (by simp) - (mul_mem_massWeightSubmodule (Dbarψ_mem_massWeightSubmodule [] α) - (Dψ_mem_massWeightSubmodule [μ] β)) - -lemma fermionKineticTermBar_mem_massWeightLESubmodule : - fermionKineticTermBar ∈ MassWeightLESubmodule 8 := by - rw [fermionKineticTermBar] - refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun μ _ => - Submodule.sum_mem _ fun α _ => Submodule.sum_mem _ fun β _ => - Submodule.smul_mem _ _ ?_) - refine mem_massWeightLESubmodule_of_mem (n := 8) (by simp) - (mul_mem_massWeightSubmodule (Dbarψ_mem_massWeightSubmodule [μ] α) - (Dψ_mem_massWeightSubmodule [] β)) - -set_option maxHeartbeats 2000000 in -set_option linter.unusedSimpArgs false in -/-- The fermion kinetic term as an explicit combination of the eight - `ψ̄ (D ψ)` monomials. -/ -lemma fermionKineticTerm_eq : fermionKineticTerm = - Complex.I • ((Dbarψ [] 0 * Dψ [Sum.inl 0] 0 + Dbarψ [] 1 * Dψ [Sum.inl 0] 1) - - (Dbarψ [] 0 * Dψ [Sum.inr 0] 1 + Dbarψ [] 1 * Dψ [Sum.inr 0] 0) - - Complex.I • (Dbarψ [] 0 * Dψ [Sum.inr 1] 1 - Dbarψ [] 1 * Dψ [Sum.inr 1] 0) - - (Dbarψ [] 0 * Dψ [Sum.inr 2] 0 - Dbarψ [] 1 * Dψ [Sum.inr 2] 1)) := by - rw [fermionKineticTerm] - congr 1 - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - Fin.sum_univ_two] - norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.transpose_apply, Matrix.one_apply] - module - -set_option maxHeartbeats 2000000 in -set_option linter.unusedSimpArgs false in -/-- The conjugate fermion kinetic term as an explicit combination of the eight - `(D̄ ψ̄) ψ` monomials. -/ -lemma fermionKineticTermBar_eq : fermionKineticTermBar = - (-Complex.I) • ((Dbarψ [Sum.inl 0] 0 * Dψ [] 0 + Dbarψ [Sum.inl 0] 1 * Dψ [] 1) - - (Dbarψ [Sum.inr 0] 0 * Dψ [] 1 + Dbarψ [Sum.inr 0] 1 * Dψ [] 0) - - Complex.I • (Dbarψ [Sum.inr 1] 0 * Dψ [] 1 - Dbarψ [Sum.inr 1] 1 * Dψ [] 0) - - (Dbarψ [Sum.inr 2] 0 * Dψ [] 0 - Dbarψ [Sum.inr 2] 1 * Dψ [] 1)) := by - rw [fermionKineticTermBar] - congr 1 - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - Fin.sum_univ_two] - norm_num [kineticPauli, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.transpose_apply, Matrix.one_apply] - module - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean deleted file mode 100644 index 81cc159e0..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/MaxwellTerm.lean +++ /dev/null @@ -1,194 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.MassDim -/-! -# The Maxwell term - -The kinetic term `F_{μν} F^{μν}` of the photon: the square of the field strength -with both indices raised by the Minkowski metric. It is gauge invariant because -the field strength is, Lorentz invariant by the defining identity of the Lorentz -group, and of mass weight eight, that is mass dimension four. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The Maxwell kinetic term `F_{μν} F^{μν}`: the field-strength square with - both indices raised by the (diagonal) Minkowski metric. Mass weight eight. -/ -noncomputable def maxwellTerm : JetAlgebra := - ∑ μ, ∑ ν, ((η μ μ * η ν ν : ℝ) : ℂ) • - (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) - -lemma repJetGaugeGroupI_maxwellTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U maxwellTerm = maxwellTerm := by - rw [maxwellTerm, map_sum] - refine Finset.sum_congr rfl fun μ _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [map_smul] - congr 1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv] - -/-- The component form of the Lorentz-group defining identity: contracting two - Lorentz matrices with the (diagonal, involutive) Minkowski metric over their - second indices reproduces the metric. -/ -lemma toLorentzGroup_sum_η_mul_mul (Λ : SL(2,ℂ)) (a a' : Fin 1 ⊕ Fin 3) : - ∑ ν, η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν = η a a' := by - have hsq : η a' a' * η a' a' = 1 := by - rcases a' with i | i - · rw [show i = (0 : Fin 1) from Subsingleton.elim i 0, - minkowskiMatrix.inl_0_inl_0] - norm_num - · rw [minkowskiMatrix.inr_i_inr_i] - norm_num - have h := congrFun (congrFun ((LorentzGroup.mem_iff_self_mul_dual).mp - (Lorentz.SL2C.toLorentzGroup Λ).2) a) a' - rw [Matrix.mul_apply] at h - simp only [minkowskiMatrix.dual_apply] at h - have h2 := congrArg (fun t => t * η a' a') h - simp only [Finset.sum_mul] at h2 - rw [show (∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν * η a' a') * η a' a') = - ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 a ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' ν) * (η a' a' * η a' a') from - Finset.sum_congr rfl fun ν _ => by ring, hsq] at h2 - simp only [mul_one] at h2 - rw [h2, Matrix.one_apply] - by_cases haa : a = a' - · subst haa - simp - · rw [if_neg haa, minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ haa] - simp - -/-- Lorentz invariance of the Maxwell term, by the `η`-contraction identity. -/ -lemma repLorentzGroup_maxwellTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ maxwellTerm = maxwellTerm := by - have hscal : ∀ a b a' b' : Fin 1 ⊕ Fin 3, - (∑ μ, ∑ ν, η μ μ * η ν ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = η a a' * η b b' := by - intro a b a' b' - rw [show (∑ μ, ∑ ν, η μ μ * η ν ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν))) = - ∑ μ, (η μ μ * (Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 a' μ) * - ∑ ν, (η ν ν * (Lorentz.SL2C.toLorentzGroup Λ).1 b ν * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν) from - Finset.sum_congr rfl fun μ _ => by - rw [Finset.mul_sum] - exact Finset.sum_congr rfl fun ν _ => by ring, - ← Finset.sum_mul, toLorentzGroup_sum_η_mul_mul, toLorentzGroup_sum_η_mul_mul] - have hFt : ∀ μ ν : Fin 1 ⊕ Fin 3, repLorentzGroup Λ - (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} μ ν) = - ∑ a, ∑ b, ∑ a', ∑ b', - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' ν : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - intro μ ν - rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil] - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - simp only [hsm, hms, hsmul] - rw [maxwellTerm, map_sum] - conv_lhs => enter [2, μ]; rw [map_sum] - conv_lhs => enter [2, μ, 2, ν]; rw [map_smul, hFt μ ν] - simp only [Finset.smul_sum, smul_smul, ← Complex.ofReal_mul] - conv_lhs => enter [2, μ]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, μ, 2, a, 2, b, 2, a']; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a', 2, b', 2, μ]; rw [← Finset.sum_smul] - conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [← Finset.sum_smul] - simp only [← Complex.ofReal_sum, hscal] - refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - rw [Finset.sum_eq_single a (fun a'' _ ha'' => Finset.sum_eq_zero fun b'' _ => by - rw [show η a a'' = 0 from by - rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm ha'')], - zero_mul, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ a) h), - Finset.sum_eq_single b (fun b'' _ hb'' => by - rw [show η b b'' = 0 from by - rw [minkowskiMatrix.as_diagonal, Matrix.diagonal_apply_ne _ (Ne.symm hb'')], - mul_zero, Complex.ofReal_zero, zero_smul]) - (fun h => absurd (Finset.mem_univ b) h)] - -lemma maxwellTerm_mem_massWeightLESubmodule : - maxwellTerm ∈ MassWeightLESubmodule 8 := by - rw [maxwellTerm] - refine Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun ν _ => - Submodule.smul_mem _ _ ?_ - have h4 : (fieldStrengthDeriv {} μ ν : JetAlgebra) ∈ massWeightSubmodule 4 := by - simpa using fieldStrengthDeriv_mem_massWeightSubmodule {} μ ν - exact mem_massWeightLESubmodule_of_mem (m := 4 + 4) le_rfl - (mul_mem_massWeightSubmodule h4 h4) - -/-- The Maxwell term as an explicit combination of the six independent - field-strength squares. -/ -lemma maxwellTerm_eq : maxwellTerm = - (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0)) - + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1)) - + (-2 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (2 : ℂ) • (fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) := by - have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind - have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind - rw [maxwellTerm] - simp only [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three, - minkowskiMatrix.inl_0_inl_0, minkowskiMatrix.inr_i_inr_i, - fieldStrengthDeriv_self, mul_zero, smul_zero, add_zero, zero_add] - simp only [ - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - hnm, hmn, neg_neg] - push_cast - module - -end JetAlgebra - -end LeptonGaugeSector diff --git a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean b/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean deleted file mode 100644 index 5fb1be96d..000000000 --- a/Physlib/Particles/LeptonGaugeSector/JetAlgebra/Terms/ThetaTerm.lean +++ /dev/null @@ -1,352 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.LeptonGaugeSector.JetAlgebra.Terms.MaxwellTerm -/-! -# The theta term - -The topological term `ε^{μνρσ} F_{μν} F_{ρσ}`, the alternating contraction of two -field strengths. Its Lorentz invariance is the statement that the alternating -four-fold contraction of a Lorentz matrix is its determinant, which is one; like -the Maxwell term it has mass weight eight. --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - -namespace LeptonGaugeSector -open TensorProduct StandardModel - -namespace JetAlgebra - -open scoped minkowskiMatrix PauliMatrix -open Matrix MatrixGroups - -/-- The topological theta term `ε^{μνρσ} F_{μν} F_{ρσ}`, written as a sum over - the permutations of the four spacetime indices weighted by their signs. Mass - weight eight. -/ -noncomputable def thetaTerm : JetAlgebra := - ∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • - (fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) * - fieldStrengthDeriv {} ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3))) - -lemma repJetGaugeGroupI_thetaTerm (U : JetGaugeGroupI) : - repJetGaugeGroupI U thetaTerm = thetaTerm := by - rw [thetaTerm, map_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [map_zsmul] - congr 1 - rw [repJetGaugeGroupI_mul', repJetGaugeGroupI_fieldStrengthDeriv, - repJetGaugeGroupI_fieldStrengthDeriv] - -/-- The transformation law of a product of two field strengths. -/ -lemma repLorentzGroup_fieldStrengthDeriv_mul (Λ : SL(2,ℂ)) - (μ ν ρ τ : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {} μ ν * fieldStrengthDeriv {} ρ τ) = - ∑ a, ∑ b, ∑ a', ∑ b', - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' ρ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' τ : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - rw [repLorentzGroup_apply_mul, repLorentzGroup_fieldStrengthDeriv_nil, - repLorentzGroup_fieldStrengthDeriv_nil] - have hsm : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - (∑ x, f x) * y = ∑ x, f x * y := fun f y => by - rw [show (∑ x, f x) * y = LinearMap.mulRight ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hms : ∀ (f : (Fin 1 ⊕ Fin 3) → JetAlgebra) (y : JetAlgebra), - y * (∑ x, f x) = ∑ x, y * f x := fun f y => by - rw [show y * (∑ x, f x) = LinearMap.mulLeft ℂ y (∑ x, f x) from rfl, map_sum] - rfl - have hsmul : ∀ (c d : ℂ) (x y : JetAlgebra), - (c • x) * (d • y) = (c * d) • (x * y) := fun c d x y => by - rw [smul_mul_smul_comm] - simp only [hsm, hms, hsmul] - -/-- The alternating four-fold contraction of Lorentz matrices is a determinant: - the combinatorial identity behind the invariance of the theta term. -/ -lemma sum_perm_sign_mul_prod_eq_det (Λ : SL(2,ℂ)) (v : Fin 4 → Fin 1 ⊕ Fin 3) : - (∑ p : Equiv.Perm (Fin 4), ((Equiv.Perm.sign p : ℤ) : ℝ) * - ∏ i, (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm (p i))) = - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by - rw [← Matrix.det_transpose, Matrix.det_apply] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [Units.smul_def, zsmul_eq_mul] - rfl - -/-- The alternating contraction matrix of a non-injective index tuple has two - equal rows, so its determinant vanishes. -/ -lemma det_toLorentzGroup_of_not_injective (Λ : SL(2,ℂ)) {v : Fin 4 → Fin 1 ⊕ Fin 3} - (hv : ¬ Function.Injective v) : - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (v i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = 0 := by - rw [Function.not_injective_iff] at hv - obtain ⟨i, j, hij, hne⟩ := hv - exact Matrix.det_zero_of_row_eq hne (funext fun k => by simp [hij]) - -/-- On an index tuple obtained by permuting the four spacetime indices, the - alternating contraction matrix has determinant the sign of the permutation, - by `det Λ = 1`. -/ -lemma det_toLorentzGroup_comp_perm (Λ : SL(2,ℂ)) (q : Equiv.Perm (Fin 4)) : - Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - ((Equiv.Perm.sign q : ℤ) : ℝ) := by - have h1 : (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm (q i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - ((Lorentz.SL2C.toLorentzGroup Λ).1.submatrix - (finSumFinEquiv (m := 1) (n := 3)).symm - (finSumFinEquiv (m := 1) (n := 3)).symm).submatrix q id := rfl - rw [h1, Matrix.det_permute, - Matrix.det_submatrix_equiv_self (finSumFinEquiv (m := 1) (n := 3)).symm, - Lorentz.SL2C.toLorentzGroup_det_one, mul_one] - -set_option maxHeartbeats 4000000 in -/-- Lorentz invariance of the theta term: the alternating contraction is the - determinant of the Lorentz matrix, which is one. -/ -lemma repLorentzGroup_thetaTerm (Λ : SL(2,ℂ)) : - repLorentzGroup Λ thetaTerm = thetaTerm := by - classical - rw [thetaTerm, map_sum] - conv_lhs => enter [2, p]; rw [map_zsmul, repLorentzGroup_fieldStrengthDeriv_mul] - simp only [Finset.smul_sum] - rw [Finset.sum_comm] - conv_lhs => enter [2, a]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b]; rw [Finset.sum_comm] - conv_lhs => enter [2, a, 2, b, 2, a']; rw [Finset.sum_comm] - have hdet : ∀ a b a' b' : Fin 1 ⊕ Fin 3, - (∑ p : Equiv.Perm (Fin 4), (Equiv.Perm.sign p : ℤ) • - ((((Lorentz.SL2C.toLorentzGroup Λ).1 a - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 0)) * - (Lorentz.SL2C.toLorentzGroup Λ).1 b - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 1)) : ℝ) : ℂ) * - (((Lorentz.SL2C.toLorentzGroup Λ).1 a' - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 2)) * - (Lorentz.SL2C.toLorentzGroup Λ).1 b' - ((finSumFinEquiv (m := 1) (n := 3)).symm (p 3)) : ℝ) : ℂ)) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b')) = - ((Matrix.det (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (![a, b, a', b'] i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) : ℝ) : ℂ) • - (fieldStrengthDeriv {} a b * fieldStrengthDeriv {} a' b') := by - intro a b a' b' - rw [← sum_perm_sign_mul_prod_eq_det Λ ![a, b, a', b'], Complex.ofReal_sum, - Finset.sum_smul] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [Fin.prod_univ_four] - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] - rw [← Int.cast_smul_eq_zsmul ℂ, smul_smul] - congr 1 - push_cast - ring - conv_lhs => enter [2, a, 2, b, 2, a', 2, b']; rw [hdet a b a' b'] - have hflat : ∀ (G : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → - (Fin 1 ⊕ Fin 3) → JetAlgebra), - (∑ a, ∑ b, ∑ a', ∑ b', G a b a' b') = - ∑ t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), - G t.1 t.2.1 t.2.2.1 t.2.2.2 := fun G => by - symm - simp only [Fintype.sum_prod_type] - rw [hflat] - rw [← Finset.sum_filter_of_ne - (p := fun t : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × - (Fin 1 ⊕ Fin 3) => Function.Injective ![t.1, t.2.1, t.2.2.1, t.2.2.2]) - (fun t _ hne => by - by_contra hni - exact hne (by - rw [det_toLorentzGroup_of_not_injective Λ hni, Complex.ofReal_zero, - zero_smul]))] - have hcard : Fintype.card (Fin 4) = Fintype.card (Fin 1 ⊕ Fin 3) := by simp - refine Finset.sum_bij - (i := fun t ht => (Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) - ?_ ?_ ?_ ?_ - · intro t ht - exact Finset.mem_univ _ - · intro t₁ ht₁ t₂ ht₂ h - have hv : ∀ i : Fin 4, ![t₁.1, t₁.2.1, t₁.2.2.1, t₁.2.2.2] i = - ![t₂.1, t₂.2.1, t₂.2.2.1, t₂.2.2.2] i := by - intro i - have := congrArg (fun q : Equiv.Perm (Fin 4) => - (finSumFinEquiv (m := 1) (n := 3)).symm (q i)) h - simpa using this - have h0 := hv 0 - have h1 := hv 1 - have h2 := hv 2 - have h3 := hv 3 - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 - exact Prod.ext h0 (Prod.ext h1 (Prod.ext h2 h3)) - · intro q _ - refine ⟨((finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)), ?_, ?_⟩ - · refine Finset.mem_filter.mpr ⟨Finset.mem_univ _, ?_⟩ - have hveq : ![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] = - fun i => (finSumFinEquiv (m := 1) (n := 3)).symm (q i) := by - funext i - fin_cases i <;> rfl - rw [hveq] - exact ((finSumFinEquiv (m := 1) (n := 3)).symm.injective).comp q.injective - · refine Equiv.ext fun i => ?_ - show (finSumFinEquiv (m := 1) (n := 3)) - (![(finSumFinEquiv (m := 1) (n := 3)).symm (q 0), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 1), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 2), - (finSumFinEquiv (m := 1) (n := 3)).symm (q 3)] i) = q i - fin_cases i <;> simp - · intro t ht - have hq : ∀ i : Fin 4, (finSumFinEquiv (m := 1) (n := 3)).symm - (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) i) = - ![t.1, t.2.1, t.2.2.1, t.2.2.2] i := by - intro i - simp [Equiv.ofBijective] - have hmat : (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 (![t.1, t.2.1, t.2.2.1, t.2.2.2] i) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) = - (Matrix.of fun i j : Fin 4 => - (Lorentz.SL2C.toLorentzGroup Λ).1 - ((finSumFinEquiv (m := 1) (n := 3)).symm - (((Equiv.ofBijective ![t.1, t.2.1, t.2.2.1, t.2.2.2] - ((Fintype.bijective_iff_injective_and_card _).mpr - ⟨(Finset.mem_filter.mp ht).2, hcard⟩)).trans - (finSumFinEquiv (m := 1) (n := 3))) i)) - ((finSumFinEquiv (m := 1) (n := 3)).symm j)) := by - refine congrArg Matrix.of (funext fun i => funext fun j => ?_) - rw [hq i] - rw [hmat, det_toLorentzGroup_comp_perm] - have h0 := hq 0 - have h1 := hq 1 - have h2 := hq 2 - have h3 := hq 3 - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] at h0 h1 h2 h3 - rw [h0, h1, h2, h3, ← Int.cast_smul_eq_zsmul ℂ] - module - -lemma thetaTerm_mem_massWeightLESubmodule : - thetaTerm ∈ MassWeightLESubmodule 8 := by - rw [thetaTerm] - refine Submodule.sum_mem _ fun p _ => zsmul_mem ?_ _ - have h4 : ∀ μ ν, (fieldStrengthDeriv {} μ ν : JetAlgebra) ∈ massWeightSubmodule 4 := fun μ ν => by - simpa using fieldStrengthDeriv_mem_massWeightSubmodule {} μ ν - exact mem_massWeightLESubmodule_of_mem (m := 4 + 4) le_rfl - (mul_mem_massWeightSubmodule (h4 _ _) (h4 _ _)) - -set_option maxHeartbeats 8000000 in -set_option linter.unusedSimpArgs false in -/-- The theta term as an explicit combination of the three pair-partition - products of field strengths. -/ -lemma thetaTerm_eq : thetaTerm = - (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2)) - + (-8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2)) - + (8 : ℂ) • (fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1)) := by - have hnm : ∀ u v : JetAlgebra, (-u) * v = -(u * v) := by grind - have hmn : ∀ u v : JetAlgebra, u * (-v) = -(u * v) := by grind - rw [thetaTerm] - conv_lhs => - enter [2, p] - rw [show (1 : Fin 4) = (0 : Fin 3).succ from rfl, - show (2 : Fin 4) = (1 : Fin 3).succ from rfl, - show (3 : Fin 4) = (2 : Fin 3).succ from rfl] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i, 2, j] - rw [Finset.univ_perm_fin_succ, Finset.sum_map, Fintype.sum_prod_type] - conv_lhs => - enter [2, i, 2, j, 2, k] - rw [Fintype.sum_subsingleton _ (1 : Equiv.Perm (Fin 1))] - simp only [Equiv.coe_toEmbedding, Fin.sum_univ_four, Fin.sum_univ_three, - Fin.sum_univ_two, - show ((1 : Fin 3)) = (0 : Fin 2).succ from rfl, - show ((2 : Fin 3)) = (1 : Fin 2).succ from rfl, - Equiv.Perm.decomposeFin_symm_of_one, - Equiv.Perm.decomposeFin.symm_sign, - Equiv.Perm.decomposeFin_symm_apply_zero, - Equiv.Perm.decomposeFin_symm_apply_one, - Equiv.Perm.decomposeFin_symm_apply_succ] - simp only [show ((0 : Fin 2).succ) = (1 : Fin 3) from rfl, - show ((1 : Fin 2).succ) = (2 : Fin 3) from rfl, - show ((0 : Fin 3).succ) = (1 : Fin 4) from rfl, - show ((1 : Fin 3).succ) = (2 : Fin 4) from rfl, - show ((2 : Fin 3).succ) = (3 : Fin 4) from rfl, - Equiv.swap_self, Equiv.Perm.sign_refl, Equiv.refl_apply, Equiv.Perm.sign_one, - Equiv.swap_apply_left, Equiv.swap_apply_right, Equiv.swap_apply_of_ne_of_ne, - Equiv.Perm.sign_swap', Fin.reduceEq, reduceIte, ne_eq, not_false_iff, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 0) = Sum.inl 0 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 1) = Sum.inr 0 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 2) = Sum.inr 1 from rfl, - show ((finSumFinEquiv (m := 1) (n := 3)).symm 3) = Sum.inr 2 from rfl, - Units.val_one, Units.val_neg, one_smul, neg_smul, one_mul, mul_one] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 0), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inl 0) = - -fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inl 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 1), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 0) = - -fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 0) (Sum.inr 2), - show fieldStrengthDeriv {} (Sum.inr 2) (Sum.inr 1) = - -fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_antisymm {} (Sum.inr 1) (Sum.inr 2), - hnm, hmn, neg_neg] - simp only [ - show fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 0) * - fieldStrengthDeriv {} (Sum.inr 1) (Sum.inr 2) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 2) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _, - show fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) * - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) = - fieldStrengthDeriv {} (Sum.inl 0) (Sum.inr 2) * - fieldStrengthDeriv {} (Sum.inr 0) (Sum.inr 1) from - fieldStrengthDeriv_mul_comm {} {} _ _ _ _] - module - -end JetAlgebra - -end LeptonGaugeSector From 2130a67888916af3e07e8a5969028ee9037c54af Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:20:55 +0100 Subject: [PATCH 203/254] feat: Update --- .../AlgebraValued/IsQuadLorentz.lean | 1664 +++++++++++++++++ 1 file changed, 1664 insertions(+) create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean new file mode 100644 index 000000000..5df9497c1 --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean @@ -0,0 +1,1664 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.HiggsBoson.Basic +public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim +public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.RepresentationTheory.Invariants +public meta import Mathlib.Data.Fintype.Sum +public meta import Mathlib.Data.Fintype.Pi +/-! +# Invariants under the Lorentz group with four-vector indices +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups Lorentz + + +structure IsQuadLorentz (B : Type*) [Semiring B] [Algebra ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin 4 → Fin 1 ⊕ Fin 3), + (∏ (i : Fin 4), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a + +namespace IsQuadLorentz +set_option linter.unusedVariables false + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B} + (hT : IsQuadLorentz B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsQuadLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 4 → (Fin 1 ⊕ Fin 3)) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 4 → (Fin 1 ⊕ Fin 3)) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq'] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## A. Light cone directions + +-/ + +open StandardModel.IsHiggsAlgebraValued StandardModel.IsHiggsAlgebraValued.IsDerivativeCollection + BoostWeight + +noncomputable def lightCone (hT : IsQuadLorentz B repLorentz T) (i : Fin 3) (c : Fin 4 → Fin 4) : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • T d + +/-- Each light-cone component lies in the span of the coordinate components. -/ +lemma lightCone_mem_span (i : Fin 3) (c : Fin 4 → Fin 4) : hT.lightCone i c ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +lemma eq_sum_lightCone (i : Fin 3) (d : Fin 4 → Fin 1 ⊕ Fin 3) : + T d = ∑ c : Fin 4 → Fin 4, + (∏ j, lightConeCoeffInv i (d j) (c j)) • hT.lightCone i c := by + calc T d = ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ c : Fin 4 → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j))) • T e := by + simp only [sum_prod_lightConeCoeffInv, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + _ = _ := by + simp only [lightCone, Finset.smul_sum, smul_smul, Finset.sum_smul] + rw [Finset.sum_comm] + +lemma span_eq_lightCone (hT : IsQuadLorentz B repLorentz T) (i : Fin 3) : + hT.span = ⨆ c, ℂ ∙ hT.lightCone i c := by + rw [span] + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun c => ?_) + · rw [Submodule.span_singleton_le_iff_mem, hT.eq_sum_lightCone i d] + exact sum_mem fun c _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem c (Submodule.mem_span_singleton_self _)) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.lightCone_mem_span i c + + +lemma lightCone_mem_boostWeightSubmodule (i : Fin 3) (c : Fin 4 → Fin 4) : + hT.lightCone i c ∈ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hstep : ∀ x : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + intro x + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) + = ∑ x : Fin 4 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) := by + simp only [lightCone, map_sum, map_smul] + _ = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ x : Fin 4 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * + (∏ j, lightConeCoeff i (c j) (a j))) • T a := by + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + exact sum_prod_lightConeCoeff i c a ht + _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by + rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, lightCone, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-- Integer mirror of `IsDerivativeCollection.lightConeCoeff`. -/ +def lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℤ := + if κ = 0 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then -1 else 0) + else if κ = 1 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then 1 else 0) + else if κ = 2 then (if μ = Sum.inr (i + 1) then 1 else 0) + else (if μ = Sum.inr (i + 2) then 1 else 0) + +/-- The integer mirror casts to the light-cone coefficients. -/ +lemma coe_lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : + ((lightConeCoeffZ i κ μ : ℤ) : ℂ) = lightConeCoeff i κ μ := by + rw [lightConeCoeffZ, lightConeCoeff] + split_ifs <;> norm_num + +/-- Rational mirror of `IsDerivativeCollection.lightConeCoeffInv`: entries `0`, `±2⁻¹` + and `1`, so ℚ-valued (like `lightConeTransition`) rather than integer. -/ +def lightConeCoeffInvQ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℚ := + if μ = Sum.inl 0 then (if κ = 0 then 2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr i then (if κ = 0 then -2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr (i + 1) then (if κ = 2 then 1 else 0) + else (if κ = 3 then 1 else 0) + +/-- The rational mirror casts to the inverse light-cone coefficients. -/ +lemma coe_lightConeCoeffInvQ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + ((lightConeCoeffInvQ i μ κ : ℚ) : ℂ) = lightConeCoeffInv i μ κ := by + rw [lightConeCoeffInvQ, lightConeCoeffInv] + split_ifs <;> norm_num + +/-- Where the integer mirror vanishes, the inverse coefficient vanishes too: the zero + pattern of `lightConeCoeffInv` is the transpose of that of `lightConeCoeffZ`. -/ +lemma lightConeCoeffInv_eq_zero_of_coeffZ_eq_zero (i : Fin 3) (κ : Fin 4) + (μ : Fin 1 ⊕ Fin 3) (h : lightConeCoeffZ i κ μ = 0) : lightConeCoeffInv i μ κ = 0 := by + rcases μ with a | j + · rw [Subsingleton.elim a 0] at h ⊢ + fin_cases i <;> fin_cases κ <;> simp_all [lightConeCoeffZ, lightConeCoeffInv] + · fin_cases i <;> fin_cases j <;> fin_cases κ <;> + simp_all [lightConeCoeffZ, lightConeCoeffInv] + +/-! + +## Vanishing of homogeneous components + +A finite sum of homogeneous boost-weight components vanishes only if every component +does: the weight spaces are independent. Consequently a weight-zero element written as +such a sum equals its weight-zero component alone. + +These are pure weight-grading statements (no `T` involved) generalizing +`eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule` from two weights to finitely +many; they will eventually move next to `boostWeightSubmodule_iSupIndep`. + +-/ + +/-- **Components of a vanishing homogeneous sum vanish**: the boost-weight spaces are + independent. -/ +lemma eq_zero_of_sum_mem_boostWeightSubmodule + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {s : Finset ℤ} {w : ℤ → A} + (hw : ∀ m ∈ s, w m ∈ boostWeightSubmodule rep i m) + (hsum : ∑ m ∈ s, w m = 0) : + ∀ m ∈ s, w m = 0 := by + intro m₀ hm₀ + refine Submodule.disjoint_def.1 + (iSupIndep_def.1 (boostWeightSubmodule_iSupIndep rep) m₀) (w m₀) (hw m₀ hm₀) ?_ + have h : w m₀ = -∑ m ∈ s.erase m₀, w m := + eq_neg_of_add_eq_zero_left (by rw [Finset.add_sum_erase s w hm₀]; exact hsum) + rw [h] + exact neg_mem (sum_mem fun m hm => Submodule.mem_iSup_of_mem m + (Submodule.mem_iSup_of_mem (Finset.ne_of_mem_erase hm) + (hw m (Finset.mem_of_mem_erase hm)))) + +/-- **A weight-zero element of a homogeneous sum is its weight-zero component**: all the + other components must vanish. -/ +lemma eq_component_zero_of_mem_boostWeightSubmodule + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {s : Finset ℤ} {w : ℤ → A} {x : A} + (hx : x ∈ boostWeightSubmodule rep i 0) + (hw : ∀ m ∈ s, w m ∈ boostWeightSubmodule rep i m) + (h0 : (0 : ℤ) ∈ s) (hsum : x = ∑ m ∈ s, w m) : + x = w 0 := by + have hv : ∀ m ∈ s, Function.update w 0 (w 0 - x) m ∈ boostWeightSubmodule rep i m := by + intro m hm + by_cases h : m = 0 + · subst h + rw [Function.update_self] + exact sub_mem (hw 0 h0) hx + · rw [Function.update_of_ne h] + exact hw m hm + have hsum0 : ∑ m ∈ s, Function.update w 0 (w 0 - x) m = 0 := by + rw [Finset.sum_update_of_mem h0, hsum, ← Finset.add_sum_erase s w h0, Finset.erase_eq] + abel + have h := eq_zero_of_sum_mem_boostWeightSubmodule hv hsum0 0 h0 + rw [Function.update_self] at h + exact (sub_eq_zero.1 h).symm + +/-! + +## B. Decomposing generators + +We want to give the decomposition of +`T d` into peices along the three axis. +-/ + +/-- The axis-i weight-zero component of a component, as in `boostComponent` + but one level down: the weight-m partial sum of `eq_sum_lightCone`. -/ +noncomputable def monoComponent (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) (m : ℤ) : B := + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = m), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c + +lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) (m : ℤ) : + hT.monoComponent i e m ∈ boostWeightSubmodule repLorentz i m := by + refine sum_mem fun c hc => Submodule.smul_mem _ _ ?_ + exact (show (∑ s, lightConeWeight (c s)) = m from (Finset.mem_filter.1 hc).2) ▸ + hT.lightCone_mem_boostWeightSubmodule i c + +/-- **The possible axis-`i` boost weights of a component**: the total light-cone weights + of the axis-`i` light-cone monomials appearing in `eq_sum_lightCone` with a nonzero + coefficient — those reachable through slots where the integer mirror `lightConeCoeffZ` + does not vanish. Computable, so membership can be settled by `decide`. -/ +def boostSupport (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : Finset ℤ := + (Finset.univ.filter fun c : Fin 4 → Fin 4 => + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0).image + fun c => ∑ s, lightConeWeight (c s) + +lemma eq_sum_monoComponent (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : + T e = ∑ m ∈ boostSupport i e, hT.monoComponent i e m := by + have hne : ∀ c : Fin 4 → Fin 4, + ((∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c ≠ 0) → + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0 := fun c hc s hs => + absurd (by rw [Finset.prod_eq_zero (Finset.mem_univ s) + (lightConeCoeffInv_eq_zero_of_coeffZ_eq_zero i (c s) (e s) hs), zero_smul]) hc + calc T e + = ∑ c : Fin 4 → Fin 4, + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c := + hT.eq_sum_lightCone i e + _ = ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c := + (Finset.sum_filter_of_ne (fun c _ => hne c)).symm + _ = ∑ m ∈ boostSupport i e, + ∑ c ∈ (Finset.univ.filter (fun c : Fin 4 → Fin 4 => + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0)).filter + (fun c => (∑ s, lightConeWeight (c s)) = m), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c := + (Finset.sum_fiberwise_of_maps_to + (fun c hc => Finset.mem_image_of_mem _ hc) _).symm + _ = ∑ m ∈ boostSupport i e, hT.monoComponent i e m := by + refine Finset.sum_congr rfl fun m hm => ?_ + rw [Finset.filter_comm, monoComponent] + exact Finset.sum_filter_of_ne fun c _ => hne c + +set_option maxRecDepth 10000 in +/-- **A component is the sum of its weight components over the full weight set**: as + `eq_sum_monoComponent` but over the fixed weight set common to all components. -/ +lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : + T e = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.monoComponent i e m := by + have hall : ∀ c : Fin 4 → Fin 4, + (∑ s, lightConeWeight (c s)) ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ) := by + decide + rw [hT.eq_sum_lightCone i e] + exact (Finset.sum_fiberwise_of_maps_to (fun c _ => hall c) _).symm + +/-- **The matrix of the axis-`i` weight-zero projection in the `T`-basis**: the + coefficient of `T d` in the re-expansion of `monoComponent i e 0` through the + light-cone basis. Rational-valued and computable, built from the two mirrors. -/ +def weightZeroTransition (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ℚ := + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) + +/-- **The weight-zero component re-expanded in the `T`-basis**: `monoComponent i e 0` + is the `e`-th column of `weightZeroTransition` applied to the generators. -/ +lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : + hT.monoComponent i e 0 + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := by + rw [monoComponent] + simp only [lightCone, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [weightZeroTransition] + push_cast + simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] + +/-- **The boost-average matrix `M`**: the matrix of `3⁻¹(π₀⁰ + π₁⁰ + π₂⁰)` in the + `T`-basis — the average over the three axes of the weight-zero transition matrices. + Its powers drive the endgame recursion, and the certificate is a fixed rational + combination of them. -/ +def boostAverageTransition : + Matrix (Fin 4 → Fin 1 ⊕ Fin 3) (Fin 4 → Fin 1 ⊕ Fin 3) ℚ := + Matrix.of fun d e => (3⁻¹ : ℚ) * ∑ i : Fin 3, weightZeroTransition i d e + +include hT in +/-- **One round of the recursion along one axis**: an element of weight zero along axis + `i` expanded in the generators re-expands with the weight-zero transition matrix + applied to its coefficients — the nonzero-weight components of the expansion must + vanish, and the surviving weight-zero part is `weightZeroTransition` acting on `c`. -/ +lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + have hsum : x = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), + ∑ e, c e • hT.monoComponent i e m := by + rw [hx] + calc ∑ e, c e • T e + = ∑ e, c e • ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), + hT.monoComponent i e m := + Finset.sum_congr rfl fun e _ => by rw [← hT.eq_sum_monoComponent_univ i e] + _ = _ := by + simp only [Finset.smul_sum] + exact Finset.sum_comm + have hx0 : x = ∑ e, c e • hT.monoComponent i e 0 := + eq_component_zero_of_mem_boostWeightSubmodule + (w := fun m => ∑ e, c e • hT.monoComponent i e m) hw + (fun m _ => sum_mem fun e _ => Submodule.smul_mem _ _ + (hT.monoComponent_mem_boostWeightSubmodule i e m)) + (by decide) hsum + calc x = ∑ e, c e • hT.monoComponent i e 0 := hx0 + _ = ∑ e, c e • ∑ d, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := + Finset.sum_congr rfl fun e _ => by rw [hT.monoComponent_zero_eq i e] + _ = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + exact Finset.sum_congr rfl fun e _ => mul_comm _ _ + +include hT in +/-- **One averaged round of the recursion**: an element of weight zero along all three + axes re-expands with the boost-average matrix `M` applied to its coefficients — the + average over the axes of `eq_sum_weightZeroTransition_smul`. -/ +lemma eq_sum_boostAverageTransition_smul {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) * c e) • T d := by + have hround : ∀ i : Fin 3, + x = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := + fun i => hT.eq_sum_weightZeroTransition_smul i c hx (hw i) + have h3 : (3 : ℂ) • x = ∑ i : Fin 3, x := by + rw [Fin.sum_univ_three, show (3 : ℂ) = 1 + 1 + 1 from by norm_num, + add_smul, add_smul, one_smul] + calc x = (3⁻¹ : ℂ) • ((3 : ℂ) • x) := by rw [smul_smul]; norm_num + _ = (3⁻¹ : ℂ) • ∑ i : Fin 3, x := by rw [h3] + _ = (3⁻¹ : ℂ) • ∑ i : Fin 3, ∑ d, + (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := + congrArg (fun y => (3⁻¹ : ℂ) • y) (Finset.sum_congr rfl fun i _ => hround i) + _ = ∑ d, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) * c e) • T d := by + rw [Finset.sum_comm, Finset.smul_sum] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul, smul_smul] + congr 1 + rw [Finset.sum_comm, Finset.mul_sum] + refine Finset.sum_congr rfl fun e _ => ?_ + simp only [boostAverageTransition, Matrix.of_apply] + push_cast + rw [mul_assoc, Finset.sum_mul] + +include hT in +/-- **Iterated averaged rounds**: an element of weight zero along all three axes + re-expands through every power of the boost-average matrix applied to its + coefficients. -/ +lemma eq_sum_pow_boostAverageTransition_smul {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) (n : ℕ) : + x = ∑ d, (∑ e, (((boostAverageTransition ^ n) d e : ℚ) : ℂ) * c e) • T d := by + induction n with + | zero => + rw [hx] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + rw [pow_zero] + simp [Matrix.one_apply, apply_ite (fun q : ℚ => (q : ℂ)), ite_mul, Finset.sum_ite_eq] + | succ n ih => + rw [hT.eq_sum_boostAverageTransition_smul + (fun d => ∑ e, (((boostAverageTransition ^ n) d e : ℚ) : ℂ) * c e) ih hw] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + rw [pow_succ'] + calc ∑ e, ((boostAverageTransition d e : ℚ) : ℂ) + * ∑ f, (((boostAverageTransition ^ n) e f : ℚ) : ℂ) * c f + = ∑ e, ∑ f, ((boostAverageTransition d e : ℚ) : ℂ) + * ((((boostAverageTransition ^ n) e f : ℚ) : ℂ) * c f) := + Finset.sum_congr rfl fun e _ => by rw [Finset.mul_sum] + _ = ∑ f, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) + * (((boostAverageTransition ^ n) e f : ℚ) : ℂ)) * c f := by + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun f _ => ?_ + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun e _ => (mul_assoc _ _ _).symm + _ = ∑ e, (((boostAverageTransition * boostAverageTransition ^ n) d e : ℚ) : ℂ) + * c e := by + refine Finset.sum_congr rfl fun f _ => ?_ + congr 1 + rw [Matrix.mul_apply] + push_cast + rfl + +/-! + +## B. Pieces along one axis + +-/ + +def boostPiece (i : Fin 3) (n : ℤ) : Submodule ℂ B := + ⨆ c ∈ {c : Fin 4 → Fin 4 | (∑ j, lightConeWeight (c j)) = n}, ℂ ∙ hT.lightCone i c + +lemma boostPiece_le_boostWeightSubmodule (i : Fin 3) (n : ℤ) : + hT.boostPiece i n ≤ boostWeightSubmodule repLorentz i n := by + refine iSup₂_le fun c hc => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact (show (∑ j, lightConeWeight (c j)) = n from hc) ▸ + hT.lightCone_mem_boostWeightSubmodule i c + +/-- **The span regrouped by boost weight**: the light-cone components sorted by their + total weight along the axis. -/ +lemma span_eq_iSup_boostPiece (i : Fin 3) : + hT.span = ⨆ n : ℤ, hT.boostPiece i n := by + rw [hT.span_eq_lightCone i] + refine le_antisymm (iSup_le fun c => ?_) (iSup_le fun n => iSup₂_le fun c _ => ?_) + · exact le_iSup_of_le (∑ s, lightConeWeight (c s)) (le_iSup₂_of_le c rfl le_rfl) + · exact le_iSup_of_le c le_rfl + +/-! + +## C. Pieces along a second axis + +The axis-`i` and axis-`j` light-cone bases are related slot by slot by an invertible +`4 × 4` transition matrix. An axis-`i` piece is therefore covered by axis-`j` pieces +spanned by the light-cone components reachable through nonzero transition coefficients. + +-/ + +/-- **The one-slot transition matrix between two light-cone bases**: the axis-`i` + light-cone direction `κ` expanded in the axis-`j` light-cone basis. Rational-valued — + the entries are `0`, `±2⁻¹` and `±1` — so that vanishing of entries is decidable; + `coe_lightConeTransition` identifies it with the composite change of basis over `ℂ`. -/ +def lightConeTransition (i j : Fin 3) (κ κ' : Fin 4) : ℚ := + if j = i then (if κ = κ' then 1 else 0) + else if j = i + 1 then + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 3 then -1 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 3 then 1 else 0) + else if κ = 2 then (if κ' = 0 then -2⁻¹ else if κ' = 1 then 2⁻¹ else 0) + else (if κ' = 2 then 1 else 0) + else + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 2 then -1 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 2 then 1 else 0) + else if κ = 2 then (if κ' = 3 then 1 else 0) + else (if κ' = 0 then -2⁻¹ else if κ' = 1 then 2⁻¹ else 0) + +/-- **The transition matrix is the composite change of basis**: the axis-`i` light-cone + coefficients composed with the inverse axis-`j` coefficients. -/ +lemma coe_lightConeTransition (i j : Fin 3) (κ κ' : Fin 4) : + (lightConeTransition i j κ κ' : ℂ) + = ∑ μ : Fin 1 ⊕ Fin 3, lightConeCoeff i κ μ * lightConeCoeffInv j μ κ' := by + fin_cases i <;> fin_cases j <;> fin_cases κ <;> fin_cases κ' <;> + simp [lightConeTransition, lightConeCoeff, lightConeCoeffInv, Fintype.sum_sum_type, + Fin.sum_univ_three] <;> + norm_num + +/-- Integer mirror of twice the transition matrix: the entries are `0`, `±1` and `±2`. -/ +def lightConeTransitionZ (i j : Fin 3) (κ κ' : Fin 4) : ℤ := + if j = i then (if κ = κ' then 2 else 0) + else if j = i + 1 then + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 3 then -2 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 3 then 2 else 0) + else if κ = 2 then (if κ' = 0 then -1 else if κ' = 1 then 1 else 0) + else (if κ' = 2 then 2 else 0) + else + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 2 then -2 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 2 then 2 else 0) + else if κ = 2 then (if κ' = 3 then 2 else 0) + else (if κ' = 0 then -1 else if κ' = 1 then 1 else 0) + +/-- The transition matrix is half its integer mirror. -/ +lemma coe_lightConeTransition_eq (i j : Fin 3) (κ κ' : Fin 4) : + ((lightConeTransition i j κ κ' : ℚ) : ℂ) + = 2⁻¹ * ((lightConeTransitionZ i j κ κ' : ℤ) : ℂ) := by + rw [lightConeTransition, lightConeTransitionZ] + split_ifs <;> norm_num + +/-- The transition coefficients of a multi-index factor slot by slot. -/ +lemma sum_prod_lightConeTransition (i j : Fin 3) (c c' : Fin 4 → Fin 4) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) * + (∏ s, lightConeCoeffInv j (d s) (c' s)) + = ∏ s, (lightConeTransition i j (c s) (c' s) : ℂ) := by + calc ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) * + (∏ s, lightConeCoeffInv j (d s) (c' s)) + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ∏ s, (lightConeCoeff i (c s) (d s) * lightConeCoeffInv j (d s) (c' s)) := + Finset.sum_congr rfl fun d _ => (Finset.prod_mul_distrib).symm + _ = ∏ s, ∑ μ : Fin 1 ⊕ Fin 3, + (lightConeCoeff i (c s) μ * lightConeCoeffInv j μ (c' s)) := by + rw [Finset.prod_univ_sum, Fintype.piFinset_univ] + _ = ∏ s, (lightConeTransition i j (c s) (c' s) : ℂ) := + Finset.prod_congr rfl fun s _ => (coe_lightConeTransition i j (c s) (c' s)).symm + +/-- **The change-of-axis identity**: an axis-`i` light-cone component expanded in the + axis-`j` light-cone basis, with slot-wise transition coefficients. -/ +lemma lightCone_eq_sum_lightCone (i j : Fin 3) (c : Fin 4 → Fin 4) : + hT.lightCone i c = ∑ c' : Fin 4 → Fin 4, + (∏ s, (lightConeTransition i j (c s) (c' s) : ℂ)) • hT.lightCone j c' := by + calc hT.lightCone i c + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) • T d := by + rw [lightCone] + _ = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) • + ∑ c' : Fin 4 → Fin 4, + (∏ s, lightConeCoeffInv j (d s) (c' s)) • hT.lightCone j c' := + Finset.sum_congr rfl fun d _ => by rw [← hT.eq_sum_lightCone j d] + _ = ∑ c' : Fin 4 → Fin 4, (∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ s, lightConeCoeff i (c s) (d s)) * + (∏ s, lightConeCoeffInv j (d s) (c' s))) • hT.lightCone j c' := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun c' _ => (Finset.sum_smul).symm + _ = _ := Finset.sum_congr rfl fun c' _ => by rw [sum_prod_lightConeTransition] + +/-- **The second-level pieces**: the axis-`j` light-cone components of weight `m` which + are reachable, slot by slot, from an axis-`i` multi-index of weight `n`. -/ +def boostPiece₂ (i j : Fin 3) (n m : ℤ) : Submodule ℂ B := + ⨆ c' ∈ {c' : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c' s)) = m ∧ + ∃ c : Fin 4 → Fin 4, (∑ s, lightConeWeight (c s)) = n ∧ + ∀ s, lightConeTransition i j (c s) (c' s) ≠ 0}, ℂ ∙ hT.lightCone j c' + +/-- Each second-level piece is contained in the boost-weight space of its weight along + the second axis. -/ +lemma boostPiece₂_le_boostWeightSubmodule (i j : Fin 3) (n m : ℤ) : + hT.boostPiece₂ i j n m ≤ boostWeightSubmodule repLorentz j m := by + refine iSup₂_le fun c' hc' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact (show (∑ s, lightConeWeight (c' s)) = m from hc'.1) ▸ + hT.lightCone_mem_boostWeightSubmodule j c' + +/-- **The second-axis covering**: each axis-`i` piece is covered by the second-level + pieces along the axis `j` — the change-of-axis coefficients vanish on unreachable + multi-indices. -/ +lemma boostPiece_le_iSup_boostPiece₂ (i j : Fin 3) (n : ℤ) : + hT.boostPiece i n ≤ ⨆ m : ℤ, hT.boostPiece₂ i j n m := by + refine iSup₂_le fun c hc => ?_ + rw [Submodule.span_singleton_le_iff_mem, hT.lightCone_eq_sum_lightCone i j c] + refine sum_mem fun c' _ => ?_ + by_cases hz : ∀ s, lightConeTransition i j (c s) (c' s) ≠ 0 + · refine Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem (∑ s, lightConeWeight (c' s)) ?_) + rw [boostPiece₂] + exact Submodule.mem_iSup_of_mem c' (Submodule.mem_iSup_of_mem ⟨rfl, c, hc, hz⟩ + (Submodule.mem_span_singleton_self _)) + · push Not at hz + obtain ⟨s, hs⟩ := hz + rw [Finset.prod_eq_zero (Finset.mem_univ s) (by rw [hs, Rat.cast_zero]), zero_smul] + exact Submodule.zero_mem _ + +/-! + +## D. Tied pieces along the third axis + +Covering the doubly-weight-zero part by spans of whole light-cone components stabilises: +no new multi-index is excluded along the third axis. The third round instead splits each +generator into its boost-weight components along the last axis — the tied combinations — +and takes the pieces spanned by those components. + +-/ + +/-- **The axis-`j` weight-`m` component of an axis-`i` light-cone component**: the partial + sum of its change-of-axis expansion over the axis-`j` multi-indices of weight `m`. -/ +noncomputable def boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) (m : ℤ) : B := + ∑ c' ∈ Finset.univ.filter (fun c' : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c' s)) = m), + (∏ s, (lightConeTransition i j (c s) (c' s) : ℂ)) • hT.lightCone j c' + +/-- Each component is a boost eigenvector of its weight: it is a combination of + light-cone components of that weight. -/ +lemma boostComponent_mem_boostWeightSubmodule (i j : Fin 3) (c : Fin 4 → Fin 4) (m : ℤ) : + hT.boostComponent i j c m ∈ boostWeightSubmodule repLorentz j m := by + refine sum_mem fun c' hc' => Submodule.smul_mem _ _ ?_ + exact (Finset.mem_filter.1 hc').2 ▸ hT.lightCone_mem_boostWeightSubmodule j c' + +set_option maxRecDepth 10000 in +/-- **A light-cone component is the sum of its boost-weight components along any other + axis**: the change-of-axis expansion regrouped by weight. -/ +lemma lightCone_eq_sum_boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) : + hT.lightCone i c + = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.boostComponent i j c m := by + have hall : ∀ c' : Fin 4 → Fin 4, + (∑ s, lightConeWeight (c' s)) ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ) := by decide + rw [hT.lightCone_eq_sum_lightCone i j c] + exact (Finset.sum_fiberwise_of_maps_to (fun c' _ => hall c') _).symm + +/-- **The tied pieces along the third axis**: for each generator of the doubly-weight-zero + part, the span of its weight-`m` component along the last axis. -/ +noncomputable def boostPiece₃ (m : ℤ) : Submodule ℂ B := + ⨆ c' ∈ {c' : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c' s)) = 0 ∧ + ∃ c : Fin 4 → Fin 4, (∑ s, lightConeWeight (c s)) = 0 ∧ + ∀ s, lightConeTransition 0 1 (c s) (c' s) ≠ 0}, + ℂ ∙ hT.boostComponent 1 2 c' m + +/-- Each tied piece is contained in the boost-weight space of its weight along the last + axis. -/ +lemma boostPiece₃_le_boostWeightSubmodule (m : ℤ) : + hT.boostPiece₃ m ≤ boostWeightSubmodule repLorentz 2 m := by + refine iSup₂_le fun c' _ => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact hT.boostComponent_mem_boostWeightSubmodule 1 2 c' m + +/-- **The third-axis covering**: the doubly-weight-zero part is covered by the tied + pieces along the last axis. -/ +lemma boostPiece₂_le_iSup_boostPiece₃ : + hT.boostPiece₂ 0 1 0 0 ≤ ⨆ m : ℤ, hT.boostPiece₃ m := by + refine iSup₂_le fun c' hc' => ?_ + rw [Submodule.span_singleton_le_iff_mem, hT.lightCone_eq_sum_boostComponent 1 2 c'] + refine sum_mem fun m _ => ?_ + refine Submodule.mem_iSup_of_mem m ?_ + rw [boostPiece₃] + exact Submodule.mem_iSup_of_mem c' (Submodule.mem_iSup_of_mem hc' + (Submodule.mem_span_singleton_self _)) + + +/-! + +## E. The support of the weight-zero tied piece + +The weight-zero tied piece only involves components `T d` whose four indices either form +two identical pairs or are all different: the one-pair and three-of-a-kind monomials +cancel out of every tied generator. The cancellation is established by a sign involution: +swapping the two null directions in every slot of the inner light-cone index negates each +contributing term whenever a parity condition on the generator holds; the remaining cases +vanish slot by slot — a slot whose factor vanishes identically, or an odd null-sector +count, which no weight-zero inner index can accommodate. The finite checks are performed +by `decide` on the integer mirrors. + +-/ + +/-- **The index vectors surviving the three boost sieves**: the four indices either split + into two pairs of identical indices, or are all different. -/ +def IsPairedOrDistinct (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := + (d 0 = d 1 ∧ d 2 = d 3) ∨ (d 0 = d 2 ∧ d 1 = d 3) ∨ (d 0 = d 3 ∧ d 1 = d 2) ∨ + Function.Injective d + +instance : DecidablePred IsPairedOrDistinct := fun d => + inferInstanceAs (Decidable ((d 0 = d 1 ∧ d 2 = d 3) ∨ (d 0 = d 2 ∧ d 1 = d 3) ∨ + (d 0 = d 3 ∧ d 1 = d 2) ∨ Function.Injective d)) + +/-- The swap of the two null light-cone directions. -/ +def swap01 : Fin 4 → Fin 4 := fun κ => if κ = 0 then 1 else if κ = 1 then 0 else κ + +/-- The sign by which the null swap changes a slot: `-1` exactly on the null-sector + mismatches. -/ +def nuZ (a : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℤ := + if μ = Sum.inl 0 then (if a = 2 then -1 else 1) + else if μ = Sum.inr 2 then (if a = 0 ∨ a = 1 then -1 else 1) + else 1 + +/-- The null swap is an involution. -/ +lemma swap01_swap01 (κ : Fin 4) : swap01 (swap01 κ) = κ := by + fin_cases κ <;> rfl + +/-- The null swap negates the light-cone weight. -/ +lemma lightConeWeight_swap01 (κ : Fin 4) : + lightConeWeight (swap01 κ) = -lightConeWeight κ := by + fin_cases κ <;> rfl + +/-- **The slot identity of the sign involution**: swapping the null directions of the + inner index multiplies the slot factor by the sign `nuZ`. -/ +lemma transitionZ_swap01_mul_coeffZ : + ∀ (a κ : Fin 4) (μ : Fin 1 ⊕ Fin 3), + lightConeTransitionZ 1 2 a (swap01 κ) * lightConeCoeffZ 2 (swap01 κ) μ + = nuZ a μ * (lightConeTransitionZ 1 2 a κ * lightConeCoeffZ 2 κ μ) := by + decide + +set_option maxRecDepth 40000 in +/-- **The odd-count case**: if the number of null-sector indices of `d` is odd, every + weight-zero inner index hits a vanishing coefficient. -/ +lemma exists_coeffZ_eq_zero_of_odd : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, + Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card → + ∀ c'' : Fin 4 → Fin 4, (∑ s, lightConeWeight (c'' s)) = 0 → + ∃ s, lightConeCoeffZ 2 (c'' s) (d s) = 0 := by + decide + +set_option maxRecDepth 40000 in +/-- **The parity of the sign involution**: over a weight-zero generator, a component that + is neither two pairs nor all distinct, with no identically-vanishing slot and an even + null-sector count, carries total sign `-1`. -/ +lemma prod_nuZ_eq_neg_one : + ∀ c' : Fin 4 → Fin 4, (∑ s, lightConeWeight (c' s)) = 0 → + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, ¬IsPairedOrDistinct d → + ¬(∃ s, ∀ κ, lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0) → + ¬Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card → + (∏ s, nuZ (c' s) (d s)) = -1 := by + suffices h1 : ∀ c' ∈ {c : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c s)) = 0}, + ∀ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | ¬IsPairedOrDistinct d + ∧ ¬Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card } , + ¬(∃ s, ∀ κ, lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0) → + (∏ s, nuZ (c' s) (d s)) = -1 by + intro c' hc' d hd hA hC + exact h1 c' hc' d ⟨hd, hC⟩ hA + decide + +/-- **The vanishing of the bad coefficients**: over a weight-zero generator, the inner + transition sum vanishes on every component that is neither two pairs nor all + distinct — slot by slot when some slot factor vanishes identically or the null-sector + count is odd, and by the sign involution otherwise. -/ +lemma sum_prod_transitionZ_coeffZ_eq_zero (c' : Fin 4 → Fin 4) + (hc' : (∑ s, lightConeWeight (c' s)) = 0) + (d : Fin 4 → Fin 1 ⊕ Fin 3) (hd : ¬IsPairedOrDistinct d) : + (∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + (∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s))) = 0 := by + by_cases hA : ∃ s, ∀ κ, lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0 + · obtain ⟨s, hs⟩ := hA + refine Finset.sum_eq_zero fun c'' _ => ?_ + rw [← Finset.prod_mul_distrib] + exact Finset.prod_eq_zero (Finset.mem_univ s) (hs (c'' s)) + by_cases hC : Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card + · refine Finset.sum_eq_zero fun c'' hc'' => ?_ + obtain ⟨s, hs⟩ := exists_coeffZ_eq_zero_of_odd d hC c'' (Finset.mem_filter.1 hc'').2 + rw [← Finset.prod_mul_distrib] + refine Finset.prod_eq_zero (Finset.mem_univ s) ?_ + rw [hs, mul_zero] + have hsgn : (∏ s, nuZ (c' s) (d s)) = -1 := prod_nuZ_eq_neg_one c' hc' d hd hA hC + have hswap : ∀ c'' : Fin 4 → Fin 4, + (∏ s, lightConeTransitionZ 1 2 (c' s) (swap01 (c'' s))) * + (∏ s, lightConeCoeffZ 2 (swap01 (c'' s)) (d s)) + = (∏ s, nuZ (c' s) (d s)) * + ((∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s))) := by + intro c'' + simp only [← Finset.prod_mul_distrib] + exact Finset.prod_congr rfl fun s _ => transitionZ_swap01_mul_coeffZ (c' s) (c'' s) (d s) + have hwt : ∀ c'' : Fin 4 → Fin 4, (∑ s, lightConeWeight (swap01 (c'' s))) + = -∑ s, lightConeWeight (c'' s) := fun c'' => by + rw [← Finset.sum_neg_distrib] + exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c'' s) + have hrei : (∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + (∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s))) + = ∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + ((∏ s, lightConeTransitionZ 1 2 (c' s) (swap01 (c'' s))) * + (∏ s, lightConeCoeffZ 2 (swap01 (c'' s)) (d s))) := by + refine Finset.sum_nbij' (i := fun c'' => fun s => swap01 (c'' s)) + (j := fun c'' => fun s => swap01 (c'' s)) ?_ ?_ ?_ ?_ ?_ + · intro c'' hc'' + refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ + rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] + · intro c'' hc'' + refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ + rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] + · intro c'' _ + funext s + rw [swap01_swap01] + · intro c'' _ + funext s + rw [swap01_swap01] + · intro c'' _ + simp only [swap01_swap01] + have hkey := hrei.trans ((Finset.sum_congr rfl fun c'' _ => hswap c'').trans + (Finset.mul_sum _ _ _).symm) + rw [hsgn] at hkey + omega + +/-! + +### Rotation equivariance and support of the boost average + +Rotating both indices of `weightZeroTransition` advances the axis, so the average over +the axes is rotation invariant. And the transition out of a paired-or-distinct index +vanishes on every bad index: a sector-incompatible slot kills every summand, and +otherwise the null-swap involution carries sign `-1`. + +-/ + +/-- Rotating the direction letter advances the axis of the light-cone coefficient. -/ +lemma lightConeCoeffZ_cycDir : + ∀ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3), + lightConeCoeffZ (i + 1) κ (cycDir μ) = lightConeCoeffZ i κ μ := by + decide + +/-- Integer mirror of `lightConeCoeffInvQ`: twice the inverse coefficients, so that + slot identities can be settled by kernel `decide` over `ℤ`. -/ +def lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℤ := + if μ = Sum.inl 0 then (if κ = 0 then 1 else if κ = 1 then 1 else 0) + else if μ = Sum.inr i then (if κ = 0 then -1 else if κ = 1 then 1 else 0) + else if μ = Sum.inr (i + 1) then (if κ = 2 then 2 else 0) + else (if κ = 3 then 2 else 0) + +/-- The integer mirror casts to twice the inverse coefficients. -/ +lemma coe_lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + ((lightConeCoeffInvZ i μ κ : ℤ) : ℚ) = 2 * lightConeCoeffInvQ i μ κ := by + rw [lightConeCoeffInvZ, lightConeCoeffInvQ] + split_ifs <;> norm_num + +/-- Rotating the direction letter advances the axis of the integer mirror. -/ +lemma lightConeCoeffInvZ_cycDir : + ∀ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4), + lightConeCoeffInvZ (i + 1) (cycDir μ) κ = lightConeCoeffInvZ i μ κ := by + decide + +/-- Rotating the direction letter advances the axis of the inverse coefficient. -/ +lemma lightConeCoeffInvQ_cycDir (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + lightConeCoeffInvQ (i + 1) (cycDir μ) κ = lightConeCoeffInvQ i μ κ := by + have h := congrArg (fun n : ℤ => (n : ℚ)) (lightConeCoeffInvZ_cycDir i μ κ) + simp only [coe_lightConeCoeffInvZ] at h + linarith + +/-- **Rotation equivariance of the weight-zero transition**: rotating both indices + advances the axis. -/ +lemma weightZeroTransition_cycDir (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + weightZeroTransition (i + 1) (fun s => cycDir (d s)) (fun s => cycDir (e s)) + = weightZeroTransition i d e := by + rw [weightZeroTransition, weightZeroTransition] + refine Finset.sum_congr rfl fun c _ => Finset.prod_congr rfl fun s _ => ?_ + rw [lightConeCoeffInvQ_cycDir, lightConeCoeffZ_cycDir] + +/-- **Rotation invariance of the boost average**: the average over the axes is + invariant under rotating both indices. -/ +lemma boostAverageTransition_cycDir (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition (fun s => cycDir (d s)) (fun s => cycDir (e s)) + = boostAverageTransition d e := by + simp only [boostAverageTransition, Matrix.of_apply] + congr 1 + exact (Fintype.sum_equiv (Equiv.addRight (1 : Fin 3)) _ _ fun i => + (weightZeroTransition_cycDir i d e).symm).symm + +/-- The cyclic rotation of directions has order three. -/ +lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ)) = μ := by + decide + +/-- Rotating the column index moves a double rotation to the row index. -/ +lemma boostAverageTransition_cycDir_right (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d (fun s => cycDir (e s)) + = boostAverageTransition (fun s => cycDir (cycDir (d s))) e := by + conv_lhs => rw [show d = (fun s => cycDir (cycDir (cycDir (d s)))) from + funext fun s => (cycDir_cycDir_cycDir (d s)).symm] + exact boostAverageTransition_cycDir (fun s => cycDir (cycDir (d s))) e + +/-- Rotating the column index twice moves a single rotation to the row index. -/ +lemma boostAverageTransition_cycDir_right2 (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = boostAverageTransition (fun s => cycDir (d s)) e := by + calc boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = boostAverageTransition (fun s => cycDir (cycDir (d s))) (fun s => cycDir (e s)) := + boostAverageTransition_cycDir_right d (fun s => cycDir (e s)) + _ = boostAverageTransition (fun s => cycDir (d s)) e := + boostAverageTransition_cycDir (fun s => cycDir (d s)) e + +/-- Two direction letters lie in compatible sectors for the axis-`i` transition: both + in the null sector, or equal. -/ +def SameSlotSector (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : Prop := + ((μ = Sum.inl 0 ∨ μ = Sum.inr i) ∧ (ν = Sum.inl 0 ∨ ν = Sum.inr i)) ∨ μ = ν + +instance (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : Decidable (SameSlotSector i μ ν) := + inferInstanceAs (Decidable (_ ∨ _)) + +/-- A sector-incompatible slot annihilates every slot factor. -/ +lemma slot_eq_zero_of_not_sameSlotSector : + ∀ (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3), ¬SameSlotSector i μ ν → + ∀ κ, lightConeCoeffInvQ i μ κ * (lightConeCoeffZ i κ ν : ℚ) = 0 := by + decide +kernel + +/-- The sign by which the null swap changes an axis-`i` slot factor. -/ +def nuSignZ (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℤ := + (if μ = Sum.inr i then -1 else 1) * (if ν = Sum.inr i then -1 else 1) + +/-- Swapping the null directions multiplies the slot factor by the sign. -/ +lemma invQ_swap01_mul_coeffZ_swap01 : + ∀ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) (ν : Fin 1 ⊕ Fin 3), + lightConeCoeffInvQ i μ (swap01 κ) * (lightConeCoeffZ i (swap01 κ) ν : ℚ) + = (nuSignZ i μ ν : ℚ) + * (lightConeCoeffInvQ i μ κ * (lightConeCoeffZ i κ ν : ℚ)) := by + decide +kernel + +set_option maxRecDepth 100000 in +/-- **The sign of a sector-compatible parity mismatch**: a paired-or-distinct column + index against a bad row index with all slots sector-compatible carries sign `-1`. -/ +lemma prod_nuSignZ_eq_neg_one : + ∀ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3), IsPairedOrDistinct e → + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, ¬IsPairedOrDistinct d → + (∀ s, SameSlotSector i (e s) (d s)) → + (∏ s, nuSignZ i (e s) (d s)) = -1 := by + suffices h1 : ∀ i : Fin 3, ∀ e ∈ {e : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct e}, + ∀ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | ¬IsPairedOrDistinct d}, + (∀ s, SameSlotSector i (e s) (d s)) → (∏ s, nuSignZ i (e s) (d s)) = -1 by + intro i e he d hd hs + exact h1 i e he d hd hs + decide +kernel + +/-- **Support of the weight-zero transition**: the transition out of a + paired-or-distinct index vanishes on every bad index. -/ +lemma weightZeroTransition_eq_zero_of_not_isPairedOrDistinct (i : Fin 3) + {d e : Fin 4 → Fin 1 ⊕ Fin 3} (he : IsPairedOrDistinct e) + (hd : ¬IsPairedOrDistinct d) : weightZeroTransition i d e = 0 := by + by_cases hA : ∀ s, SameSlotSector i (e s) (d s) + · have hsgn := prod_nuSignZ_eq_neg_one i e he d hd hA + have hswap : ∀ c : Fin 4 → Fin 4, + (∏ s, lightConeCoeffInvQ i (e s) (swap01 (c s)) * + (lightConeCoeffZ i (swap01 (c s)) (d s) : ℚ)) + = ((∏ s, nuSignZ i (e s) (d s) : ℤ) : ℚ) * + ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) := by + intro c + push_cast + rw [← Finset.prod_mul_distrib] + exact Finset.prod_congr rfl fun s _ => invQ_swap01_mul_coeffZ_swap01 i (e s) (c s) (d s) + have hwt : ∀ c : Fin 4 → Fin 4, (∑ s, lightConeWeight (swap01 (c s))) + = -∑ s, lightConeWeight (c s) := fun c => by + rw [← Finset.sum_neg_distrib] + exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c s) + have hrei : weightZeroTransition i d e + = ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvQ i (e s) (swap01 (c s)) * + (lightConeCoeffZ i (swap01 (c s)) (d s) : ℚ) := by + rw [weightZeroTransition] + refine Finset.sum_nbij' (i := fun c => fun s => swap01 (c s)) + (j := fun c => fun s => swap01 (c s)) ?_ ?_ ?_ ?_ ?_ + · intro c hc + exact Finset.mem_filter.2 ⟨Finset.mem_univ _, by + rw [hwt, (Finset.mem_filter.1 hc).2, neg_zero]⟩ + · intro c hc + exact Finset.mem_filter.2 ⟨Finset.mem_univ _, by + rw [hwt, (Finset.mem_filter.1 hc).2, neg_zero]⟩ + · intro c _ + funext s + rw [swap01_swap01] + · intro c _ + funext s + rw [swap01_swap01] + · intro c _ + simp only [swap01_swap01] + have hkey := hrei.trans ((Finset.sum_congr rfl fun c _ => hswap c).trans + (Finset.mul_sum _ _ _).symm) + rw [← weightZeroTransition, hsgn] at hkey + push_cast at hkey + linarith [hkey] + · push Not at hA + obtain ⟨s₀, hs₀⟩ := hA + rw [weightZeroTransition] + refine Finset.sum_eq_zero fun c _ => ?_ + exact Finset.prod_eq_zero (Finset.mem_univ s₀) + (slot_eq_zero_of_not_sameSlotSector i (e s₀) (d s₀) hs₀ (c s₀)) + +/-- **Support of the boost average**: the average out of a paired-or-distinct index is + supported on the paired-or-distinct indices. -/ +lemma boostAverageTransition_eq_zero_of_not_isPairedOrDistinct + {d e : Fin 4 → Fin 1 ⊕ Fin 3} (he : IsPairedOrDistinct e) + (hd : ¬IsPairedOrDistinct d) : boostAverageTransition d e = 0 := by + simp only [boostAverageTransition, Matrix.of_apply] + rw [Finset.sum_eq_zero fun i _ => + weightZeroTransition_eq_zero_of_not_isPairedOrDistinct i he hd, mul_zero] + +/-- **The expansion of the weight-zero tied component into monomials**: the coefficient + of each component `T d` is a sixteenth of the integer transition sum. -/ +lemma boostComponent_zero_eq (c' : Fin 4 → Fin 4) : + hT.boostComponent 1 2 c' 0 = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ((16⁻¹ : ℂ) * ((∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + (∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s)) : ℤ) : ℂ)) • T d := by + rw [boostComponent] + simp only [lightCone, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c'' _ => ?_ + simp only [coe_lightConeTransition_eq, ← coe_lightConeCoeffZ, Finset.prod_mul_distrib, + Finset.prod_const, Finset.card_univ, Fintype.card_fin] + ring + +/-- **The weight-zero tied component of every weight-zero generator is supported on the + paired-or-distinct components.** -/ +lemma boostComponent_zero_mem_iSup_pairedOrDistinct (c' : Fin 4 → Fin 4) + (hc' : (∑ s, lightConeWeight (c' s)) = 0) : + hT.boostComponent 1 2 c' 0 ∈ + ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d := by + rw [hT.boostComponent_zero_eq c'] + refine sum_mem fun d _ => ?_ + by_cases hd : IsPairedOrDistinct d + · exact Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem hd (Submodule.mem_span_singleton_self _))) + · rw [sum_prod_transitionZ_coeffZ_eq_zero c' hc' d hd, Int.cast_zero, mul_zero, zero_smul] + exact Submodule.zero_mem _ + +/-- **The support of the weight-zero tied piece**: it is spanned by the components whose + four indices either form two identical pairs or are all different. The one-pair and + three-of-a-kind components cancel out of every tied generator. -/ +lemma boostPiece₃_zero_le_iSup_pairedOrDistinct : + hT.boostPiece₃ 0 ≤ + ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d := by + refine iSup₂_le fun c' hc' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact hT.boostComponent_zero_mem_iSup_pairedOrDistinct c' hc'.1 + +def pairedOrDistinctSubmodule : Submodule ℂ B := + ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d + + +/-! + +## F. The rotational group + +-/ + +/-- **The rotation orbit of an index vector**: the indices that `d` is carried onto by + the powers of the cyclic rotation `x → y → z → x` of the rotational average. -/ +def rotationIndexSet (d : Fin 4 → Fin 1 ⊕ Fin 3) : Finset (Fin 4 → Fin 1 ⊕ Fin 3) := + {d, fun s => cycDir (d s), fun s => cycDir (cycDir (d s))} + +/-- **The rotational average**: the mean of the action of the three powers of the cyclic + rotation `x → y → z → x`. -/ +noncomputable def rotationAverage : B →ₗ[ℂ] B := + (3⁻¹ : ℂ) • ((LinearMap.id : B →ₗ[ℂ] B) + repLorentz rotationCycle + + repLorentz (rotationCycle ^ 2)) + +/-- **The action of the rotational average on the paired-or-distinct span**: the image of + the weight-zero tied piece's support under averaging over the cyclic rotation. -/ +noncomputable def rotationSubmodule : Submodule ℂ B := + (pairedOrDistinctSubmodule (T := T)).map (rotationAverage (repLorentz := repLorentz)) + +include hT in +/-- **The cyclic rotation acts on components by cycling every index.** -/ +lemma repLorentz_rotationCycle_apply (d : Fin 4 → Fin 1 ⊕ Fin 3) : + repLorentz rotationCycle (T d) = T (fun s => cycDir (d s)) := by + have hcoef : ∀ a : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ s, (((SL2C.toLorentzGroup rotationCycle).1 (a s) (d s) : ℝ) : ℂ)) + = if a = fun s => cycDir (d s) then 1 else 0 := by + intro a + by_cases had : a = fun s => cycDir (d s) + · rw [if_pos had] + refine Finset.prod_eq_one fun s _ => ?_ + rw [toLorentzGroup_rotationCycle_apply, if_pos (congrFun had s), Complex.ofReal_one] + · rw [if_neg had] + obtain ⟨s, hs⟩ := Function.ne_iff.1 had + refine Finset.prod_eq_zero (Finset.mem_univ s) ?_ + rw [toLorentzGroup_rotationCycle_apply, if_neg hs, Complex.ofReal_zero] + rw [hT.repLorentz_T] + simp only [hcoef, ite_smul, one_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, + if_true] + +/-- **The sum of a component over its rotation orbit** — the un-normalised rotational + average of `T d`. Its support is `rotationIndexSet d`. -/ +noncomputable def rotationOrbitSum (d : Fin 4 → Fin 1 ⊕ Fin 3) : B := + T d + T (fun s => cycDir (d s)) + T (fun s => cycDir (cycDir (d s))) + +include hT in +/-- The rotational average carries a component to a third of its orbit sum. -/ +lemma rotationAverage_apply (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationAverage (repLorentz := repLorentz) (T d) + = (3⁻¹ : ℂ) • rotationOrbitSum (T := T) d := by + rw [rotationAverage, sq, map_mul, rotationOrbitSum] + simp only [LinearMap.smul_apply, LinearMap.add_apply, LinearMap.id_apply, + Module.End.mul_apply, hT.repLorentz_rotationCycle_apply] + +include hT in +/-- **The rotational average of the paired-or-distinct span, presented by orbit + sums.** -/ +lemma rotationSubmodule_eq : + rotationSubmodule (repLorentz := repLorentz) (T := T) + = ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, + ℂ ∙ rotationOrbitSum (T := T) d := by + rw [rotationSubmodule, pairedOrDistinctSubmodule] + simp only [Submodule.map_iSup] + refine iSup_congr fun d => iSup_congr fun hd => ?_ + rw [Submodule.map_span, Set.image_singleton, hT.rotationAverage_apply d] + exact Submodule.span_singleton_smul_eq ((by norm_num : (3⁻¹ : ℂ) ≠ 0).isUnit) _ + +include hT in +/-- **Extraction from the rotational average**: an element of the averaged span is a + combination of the orbit sums of the paired-or-distinct components. -/ +lemma exists_eq_sum_of_mem_rotationSubmodule {x : B} + (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) : + ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, + x = ∑ d ∈ Finset.univ.filter (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d), + c d • rotationOrbitSum (T := T) d := by + rw [hT.rotationSubmodule_eq] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, + y = ∑ d ∈ Finset.univ.filter (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d), + c d • rotationOrbitSum (T := T) d) + (fun d => ⨆ _ : d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, + ℂ ∙ rotationOrbitSum (T := T) d) hx ?_ ?_ ?_ + · intro d y hy + by_cases hd : IsPairedOrDistinct d + · rw [iSup_pos (show d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d} + from hd)] at hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq', hd] + · rw [iSup_neg (show d ∉ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d} + from hd)] at hy + rw [Submodule.mem_bot] at hy + exact ⟨0, by simp [hy]⟩ + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + +/-! + +### Orbit representatives + +`rotationOrbitSum` is constant on rotation orbits, so the extraction over all +paired-or-distinct indices collapses to one term per orbit. The canonical +representative of an orbit is the member whose first spatial letter is the first +spatial direction; `rotationSubset` lists the `22` representatives explicitly. + +-/ + +omit [Algebra ℂ B] in +/-- The orbit sum is invariant under rotating the index. -/ +lemma rotationOrbitSum_cycDir (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationOrbitSum (T := T) (fun s => cycDir (d s)) = rotationOrbitSum (T := T) d := by + simp only [rotationOrbitSum] + rw [show (fun s => cycDir (cycDir (cycDir (d s)))) = d from + funext fun s => cycDir_cycDir_cycDir (d s)] + abel + +/-- An index is the canonical representative of its rotation orbit when its first + spatial letter, if any, is the first spatial direction. -/ +def IsOrbitRep (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := + (∀ s, d s = Sum.inl 0) ∨ ∃ s, d s = Sum.inr 0 ∧ ∀ s' < s, d s' = Sum.inl 0 + +instance : DecidablePred IsOrbitRep := fun d => + inferInstanceAs (Decidable + ((∀ s, d s = Sum.inl 0) ∨ ∃ s, d s = Sum.inr 0 ∧ ∀ s' < s, d s' = Sum.inl 0)) + +/-- The canonical representative of the rotation orbit of an index. -/ +def orbitRepOf (d : Fin 4 → Fin 1 ⊕ Fin 3) : Fin 4 → Fin 1 ⊕ Fin 3 := + if IsOrbitRep d then d + else if IsOrbitRep (fun s => cycDir (d s)) then fun s => cycDir (d s) + else fun s => cycDir (cycDir (d s)) + +omit [Algebra ℂ B] in +/-- The orbit sum of an index equals that of its canonical representative. -/ +lemma rotationOrbitSum_orbitRepOf (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationOrbitSum (T := T) (orbitRepOf d) = rotationOrbitSum (T := T) d := by + rw [orbitRepOf] + split_ifs + · rfl + · exact rotationOrbitSum_cycDir (T := T) d + · exact (rotationOrbitSum_cycDir (T := T) _).trans (rotationOrbitSum_cycDir (T := T) d) + +/-- The `22` canonical orbit representatives of the paired-or-distinct indices under + cyclic rotation. -/ +def rotationSubset : Finset (Fin 4 → Fin 1 ⊕ Fin 3) := + {![Sum.inl 0, Sum.inl 0, Sum.inl 0, Sum.inl 0], + ![Sum.inl 0, Sum.inl 0, Sum.inr 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inl 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 0, Sum.inl 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2], + ![Sum.inl 0, Sum.inr 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inl 0, Sum.inl 0, Sum.inr 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 0, Sum.inl 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 1, Sum.inr 2], + ![Sum.inr 0, Sum.inl 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inl 0, Sum.inl 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 0, Sum.inr 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 1, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inr 2, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inl 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inr 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 1, Sum.inr 1, Sum.inr 0], + ![Sum.inr 0, Sum.inr 1, Sum.inr 2, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inl 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 2, Sum.inr 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 2, Sum.inr 1, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inr 2, Sum.inr 0]} + +set_option maxRecDepth 10000 in +/-- The canonical representative of a paired-or-distinct index is one of the `22` + listed representatives. -/ +lemma orbitRepOf_mem_rotationSubset : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, IsPairedOrDistinct d → + orbitRepOf d ∈ rotationSubset := by + decide + +include hT in +/-- **Extraction over unique orbit representatives**: an element of the rotational + average is a combination of the orbit sums of the `22` canonical representatives — + one term per orbit. -/ +lemma exists_eq_sum_rotationSubset_of_mem_rotationSubmodule {x : B} + (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) : + ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, + x = ∑ d ∈ rotationSubset, c d • rotationOrbitSum (T := T) d := by + obtain ⟨c, rfl⟩ := hT.exists_eq_sum_of_mem_rotationSubmodule hx + refine ⟨fun r => ∑ d ∈ (Finset.univ.filter + (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d)).filter + (fun d => orbitRepOf d = r), c d, ?_⟩ + calc ∑ d ∈ Finset.univ.filter (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d), + c d • rotationOrbitSum (T := T) d + = ∑ r ∈ rotationSubset, ∑ d ∈ (Finset.univ.filter + (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d)).filter + (fun d => orbitRepOf d = r), + c d • rotationOrbitSum (T := T) d := + (Finset.sum_fiberwise_of_maps_to (fun d hd => + orbitRepOf_mem_rotationSubset d (Finset.mem_filter.1 hd).2) _).symm + _ = _ := by + refine Finset.sum_congr rfl fun r hr => ?_ + rw [Finset.sum_smul] + refine Finset.sum_congr rfl fun d hd => ?_ + rw [show rotationOrbitSum (T := T) r = rotationOrbitSum (T := T) d from + (Finset.mem_filter.1 hd).2 ▸ rotationOrbitSum_orbitRepOf (T := T) d] + +/-- The listed representatives are paired-or-distinct. -/ +lemma isPairedOrDistinct_of_mem_rotationSubset : + ∀ d ∈ rotationSubset, IsPairedOrDistinct d := by + decide +kernel + +/-- Goodness is preserved by rotating the index. -/ +lemma isPairedOrDistinct_cycDir : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, IsPairedOrDistinct d → + IsPairedOrDistinct (fun s => cycDir (d s)) := by + decide +kernel + +/-- The multiplicity with which `d` appears among the three rotations of `e`. -/ +def rotationOrbitCoeff (e d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + (if d = e then 1 else 0) + (if d = (fun s => cycDir (e s)) then 1 else 0) + + (if d = (fun s => cycDir (cycDir (e s))) then 1 else 0) + +/-- Only members of the orbit of a listed representative meet its indicator. -/ +lemma orbitRepOf_eq_of_rotationOrbitCoeff_ne_zero : + ∀ r ∈ rotationSubset, ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, + rotationOrbitCoeff r d ≠ 0 → orbitRepOf d = r := by + decide +kernel + +/-- The orbit of the canonical representative is the orbit. -/ +lemma rotationIndexSet_orbitRepOf : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, + rotationIndexSet (orbitRepOf d) = rotationIndexSet d := by + decide +kernel + +/-- The multiplicity of an index in its own orbit: `3` on a rotation-fixed index and + `1` otherwise. -/ +lemma rotationOrbitCoeff_orbitRepOf : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, rotationOrbitCoeff (orbitRepOf d) d + = if (fun s => cycDir (d s)) = d then 3 else 1 := by + decide +kernel + +/-- An index not fixed by the rotation has three distinct rotations. -/ +lemma cycDir_orbit_distinct : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, (fun s => cycDir (d s)) ≠ d → + ((fun s => cycDir (cycDir (d s))) ≠ d + ∧ (fun s => cycDir (cycDir (d s))) ≠ (fun s => cycDir (d s))) := by + decide +kernel + +/-- The orbit indicator of a good index vanishes on every bad index. -/ +lemma rotationOrbitCoeff_eq_zero {r d : Fin 4 → Fin 1 ⊕ Fin 3} + (hr : IsPairedOrDistinct r) (hd : ¬IsPairedOrDistinct d) : + rotationOrbitCoeff r d = 0 := by + have h1 : ¬(d = r) := fun h => hd (by rw [h]; exact hr) + have h2 : ¬(d = fun s => cycDir (r s)) := fun h => + hd (by rw [h]; exact isPairedOrDistinct_cycDir r hr) + have h3 : ¬(d = fun s => cycDir (cycDir (r s))) := fun h => + hd (by rw [h]; exact isPairedOrDistinct_cycDir _ (isPairedOrDistinct_cycDir r hr)) + rw [rotationOrbitCoeff, if_neg h1, if_neg h2, if_neg h3] + norm_num + +/-- **Sums over the orbit of the representative**: for any weighting, the sum over the + orbit of the canonical representative times the multiplicity equals the plain sum + over the three rotations. -/ +lemma sum_rotationIndexSet_orbitRepOf_mul (f : (Fin 4 → Fin 1 ⊕ Fin 3) → ℚ) + (d : Fin 4 → Fin 1 ⊕ Fin 3) : + (∑ d' ∈ rotationIndexSet (orbitRepOf d), f d') + * ((rotationOrbitCoeff (orbitRepOf d) d : ℤ) : ℚ) + = f d + f (fun s => cycDir (d s)) + f (fun s => cycDir (cycDir (d s))) := by + rw [rotationIndexSet_orbitRepOf d, rotationOrbitCoeff_orbitRepOf d] + by_cases hfix : (fun s => cycDir (d s)) = d + · have h2 : (fun s => cycDir (cycDir (d s))) = d := by + funext s + rw [congrFun hfix s, congrFun hfix s] + rw [rotationIndexSet, if_pos hfix, hfix, h2, + show ({d, d, d} : Finset (Fin 4 → Fin 1 ⊕ Fin 3)) = {d} from by simp, + Finset.sum_singleton] + push_cast + ring + · obtain ⟨h31, h32⟩ := cycDir_orbit_distinct d hfix + rw [rotationIndexSet, if_neg hfix, + Finset.sum_insert (by + simp only [Finset.mem_insert, Finset.mem_singleton] + push Not + exact ⟨fun h => hfix h.symm, fun h => h31 h.symm⟩), + Finset.sum_insert (by + simp only [Finset.mem_singleton] + exact fun h => h32 h.symm), + Finset.sum_singleton] + push_cast + ring + +/-- **The rotated columns collapse onto the representatives**: for a good column index, + the sum of the boost average over the three rotated columns equals the + representative-indexed combination of its row-orbit sums. -/ +lemma boostAverageTransition_orbit_eq (e : Fin 4 → Fin 1 ⊕ Fin 3) + (he : IsPairedOrDistinct e) (d : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d e + boostAverageTransition d (fun s => cycDir (e s)) + + boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = ∑ r ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet r, boostAverageTransition d' e) + * ((rotationOrbitCoeff r d : ℤ) : ℚ) := by + by_cases hd : IsPairedOrDistinct d + · have hsingle : (∑ r ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet r, boostAverageTransition d' e) + * ((rotationOrbitCoeff r d : ℤ) : ℚ)) + = (∑ d' ∈ rotationIndexSet (orbitRepOf d), boostAverageTransition d' e) + * ((rotationOrbitCoeff (orbitRepOf d) d : ℤ) : ℚ) := + Finset.sum_eq_single_of_mem _ (orbitRepOf_mem_rotationSubset d hd) + (fun r hr hne => by + rcases eq_or_ne (rotationOrbitCoeff r d) 0 with h0 | h0 + · rw [h0] + push_cast + ring + · exact absurd (orbitRepOf_eq_of_rotationOrbitCoeff_ne_zero r hr d h0).symm hne) + rw [hsingle, + sum_rotationIndexSet_orbitRepOf_mul (fun d' => boostAverageTransition d' e) d, + boostAverageTransition_cycDir_right, boostAverageTransition_cycDir_right2] + ring + · have hs1 := isPairedOrDistinct_cycDir e he + have hs2 := isPairedOrDistinct_cycDir _ hs1 + have hz : (∑ r ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet r, boostAverageTransition d' e) + * ((rotationOrbitCoeff r d : ℤ) : ℚ)) = 0 := + Finset.sum_eq_zero fun r hr => by + rw [rotationOrbitCoeff_eq_zero + (isPairedOrDistinct_of_mem_rotationSubset r hr) hd] + push_cast + ring + rw [hz, boostAverageTransition_eq_zero_of_not_isPairedOrDistinct he hd, + boostAverageTransition_eq_zero_of_not_isPairedOrDistinct hs1 hd, + boostAverageTransition_eq_zero_of_not_isPairedOrDistinct hs2 hd] + norm_num + +/-- **Orbit-sum expansions in components**: a combination of orbit sums over the + representatives, expanded into the generators through the orbit indicator. -/ +lemma sum_rotationSubset_smul_rotationOrbitSum (b : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : + ∑ d ∈ rotationSubset, b d • rotationOrbitSum (T := T) d + = ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ d ∈ rotationSubset, b d * ((rotationOrbitCoeff d e : ℤ) : ℂ)) • T e := by + calc ∑ d ∈ rotationSubset, b d • rotationOrbitSum (T := T) d + = ∑ d ∈ rotationSubset, ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (b d * ((rotationOrbitCoeff d e : ℤ) : ℂ)) • T e := by + refine Finset.sum_congr rfl fun d _ => ?_ + rw [rotationOrbitSum] + simp [rotationOrbitCoeff, apply_ite (fun n : ℤ => (n : ℂ)), mul_add, add_smul, + mul_ite, ite_smul, Finset.sum_add_distrib, Finset.sum_ite_eq', smul_add] + _ = _ := by + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun e _ => (Finset.sum_smul).symm + +include hT in +/-- **One averaged round at orbit level**: an element of weight zero along all three + axes expanded over the orbit sums of the representatives re-expands through the + row-orbit sums of the boost average — the matrix of the boost average acting on the + orbit-sum span. -/ +lemma eq_sum_boostAverageTransition_of_mem_rotationSubset {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) + (hx : x = ∑ d ∈ rotationSubset, c d • rotationOrbitSum (T := T) d) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d ∈ rotationSubset, (∑ e ∈ rotationSubset, + ((∑ d' ∈ rotationIndexSet d, boostAverageTransition d' e : ℚ) : ℂ) * c e) + • rotationOrbitSum (T := T) d := by + have hxT := hx.trans (sum_rotationSubset_smul_rotationOrbitSum (T := T) c) + have hround := hT.eq_sum_boostAverageTransition_smul _ hxT hw + rw [hround, sum_rotationSubset_smul_rotationOrbitSum (T := T)] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + calc ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, ((boostAverageTransition d e : ℚ) : ℂ) + * (∑ r ∈ rotationSubset, c r * ((rotationOrbitCoeff r e : ℤ) : ℂ)) + = ∑ r ∈ rotationSubset, c r * ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + ((boostAverageTransition d e : ℚ) : ℂ) * ((rotationOrbitCoeff r e : ℤ) : ℂ) := by + simp only [Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun e _ => ?_ + ring + _ = ∑ r ∈ rotationSubset, c r + * ((boostAverageTransition d r + boostAverageTransition d (fun s => cycDir (r s)) + + boostAverageTransition d (fun s => cycDir (cycDir (r s))) : ℚ) : ℂ) := by + refine Finset.sum_congr rfl fun r _ => ?_ + congr 1 + push_cast + simp [rotationOrbitCoeff, apply_ite (fun n : ℤ => (n : ℂ)), mul_add, mul_ite, + Finset.sum_add_distrib, Finset.sum_ite_eq'] + _ = ∑ r ∈ rotationSubset, c r * ((∑ ρ ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet ρ, boostAverageTransition d' r) + * ((rotationOrbitCoeff ρ d : ℤ) : ℚ) : ℚ) : ℂ) := by + refine Finset.sum_congr rfl fun r hr => ?_ + rw [boostAverageTransition_orbit_eq r + (isPairedOrDistinct_of_mem_rotationSubset r hr) d] + _ = _ := by + push_cast + simp only [Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => ?_ + rw [Finset.sum_mul] + refine Finset.sum_congr rfl fun e _ => ?_ + ring + +/-! + +### The boost average as an integer `22 × 22` matrix + +The representatives are enumerated by `Fin 22`, and the row-orbit sums of the boost +average, scaled by `48`, form an integer matrix defined directly from the integer +mirrors — the matrix of the boost average acting on the orbit-sum span. + +-/ + +/-- The enumeration of the `22` canonical orbit representatives, in the order of + `rotationSubset`. -/ +def orbitRep : Fin 22 → Fin 4 → Fin 1 ⊕ Fin 3 := + ![![Sum.inl 0, Sum.inl 0, Sum.inl 0, Sum.inl 0], + ![Sum.inl 0, Sum.inl 0, Sum.inr 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inl 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 0, Sum.inl 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2], + ![Sum.inl 0, Sum.inr 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inl 0, Sum.inl 0, Sum.inr 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 0, Sum.inl 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 1, Sum.inr 2], + ![Sum.inr 0, Sum.inl 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inl 0, Sum.inl 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 0, Sum.inr 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 1, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inr 2, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inl 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inr 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 1, Sum.inr 1, Sum.inr 0], + ![Sum.inr 0, Sum.inr 1, Sum.inr 2, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inl 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 2, Sum.inr 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 2, Sum.inr 1, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inr 2, Sum.inr 0]] + +/-- The enumeration of the representatives is injective. -/ +lemma orbitRep_injective : Function.Injective orbitRep := by + decide +kernel + +/-- The set of representatives is the image of the enumeration. -/ +lemma rotationSubset_eq_image : + rotationSubset = Finset.univ.image orbitRep := by + decide +kernel + +/-- Sums over the representatives reindexed through the enumeration. -/ +lemma sum_rotationSubset {β : Type*} [AddCommMonoid β] + (f : (Fin 4 → Fin 1 ⊕ Fin 3) → β) : + ∑ d ∈ rotationSubset, f d = ∑ k : Fin 22, f (orbitRep k) := by + rw [rotationSubset_eq_image, Finset.sum_image fun k _ k' _ h => orbitRep_injective h] + +/-- Integer mirror of the weight-zero transition: sixteen times its value. -/ +def weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvZ i (e s) (c s) * lightConeCoeffZ i (c s) (d s) + +/-- The integer mirror casts to sixteen times the weight-zero transition. -/ +lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + ((weightZeroTransitionZ i d e : ℤ) : ℚ) = 16 * weightZeroTransition i d e := by + rw [weightZeroTransitionZ, weightZeroTransition] + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + calc ∏ s, ((lightConeCoeffInvZ i (e s) (c s) : ℤ) : ℚ) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) + = ∏ s, 2 * (lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ)) := by + refine Finset.prod_congr rfl fun s _ => ?_ + rw [coe_lightConeCoeffInvZ] + ring + _ = 16 * ∏ s, lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) := by + rw [Finset.prod_mul_distrib, Finset.prod_const] + norm_num [Finset.card_univ] + +/-- **The boost average on the orbit-sum span, as an integer matrix**: `48` times the + row-orbit sums of the boost average between representatives. -/ +def boostAverageOrbitZ : Matrix (Fin 22) (Fin 22) ℤ := + Matrix.of fun k l => ∑ d' ∈ rotationIndexSet (orbitRep k), + ∑ i : Fin 3, weightZeroTransitionZ i d' (orbitRep l) + +/-- The integer matrix casts to `48` times the row-orbit sums of the boost average. -/ +lemma coe_boostAverageOrbitZ (k l : Fin 22) : + ((boostAverageOrbitZ k l : ℤ) : ℚ) + = 48 * ∑ d' ∈ rotationIndexSet (orbitRep k), + boostAverageTransition d' (orbitRep l) := by + simp only [boostAverageOrbitZ, Matrix.of_apply] + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun d' _ => ?_ + calc ∑ i : Fin 3, ((weightZeroTransitionZ i d' (orbitRep l) : ℤ) : ℚ) + = ∑ i : Fin 3, 16 * weightZeroTransition i d' (orbitRep l) := + Finset.sum_congr rfl fun i _ => coe_weightZeroTransitionZ i d' (orbitRep l) + _ = 48 * boostAverageTransition d' (orbitRep l) := by + simp only [boostAverageTransition, Matrix.of_apply] + rw [← Finset.mul_sum] + ring + + +include hT in +/-- **One averaged round at orbit level, integer form**: over the enumerated + representatives, an averaged round acts by the integer matrix `boostAverageOrbitZ` + with the overall `48⁻¹` normalisation. -/ +lemma eq_sum_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ k, ((48 : ℂ)⁻¹ * ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + have hcS_rep : ∀ k : Fin 22, + (∑ k' : Fin 22, if orbitRep k' = orbitRep k then c k' else 0) = c k := by + intro k + simp [orbitRep_injective.eq_iff] + have hxS : x = ∑ d ∈ rotationSubset, + (∑ k' : Fin 22, if orbitRep k' = d then c k' else 0) + • rotationOrbitSum (T := T) d := by + calc x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k) := hx + _ = ∑ k, (∑ k' : Fin 22, if orbitRep k' = orbitRep k then c k' else 0) + • rotationOrbitSum (T := T) (orbitRep k) := + Finset.sum_congr rfl fun k _ => by rw [hcS_rep k] + _ = _ := (sum_rotationSubset (fun d => (∑ k' : Fin 22, + if orbitRep k' = d then c k' else 0) • rotationOrbitSum (T := T) d)).symm + have hR := hT.eq_sum_boostAverageTransition_of_mem_rotationSubset _ hxS hw + rw [hR, sum_rotationSubset] + refine Finset.sum_congr rfl fun k _ => ?_ + congr 1 + rw [sum_rotationSubset (fun e => ((∑ d' ∈ rotationIndexSet (orbitRep k), + boostAverageTransition d' e : ℚ) : ℂ) + * ∑ k' : Fin 22, if orbitRep k' = e then c k' else 0)] + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hcS_rep l] + have hb := congrArg (fun q : ℚ => (q : ℂ)) (coe_boostAverageOrbitZ k l) + push_cast at hb + push_cast + rw [hb] + ring + +lemma eq_sum_boostAverageOrbitZ_smul' {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ k, ((48 : ℂ)⁻¹ * ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + +/-! + +### X. Eigenvectors of the boost average on the orbit-sum span + +On the span of the orbit sums of the paired-or-distinct components the boost average +acts with rational spectrum: eigenvalue `1` (dimension `4` — the invariant +contractions), `2/3` (dimension `6`), `1/3` (dimension `9`), `0` (dimension `1`), and a +two-dimensional block with characteristic polynomial `12λ² - 11λ + 1`. We list integer +coefficient vectors for each block; together they span the orbit-sum span, and every +block except `1` is annihilated by the certificate polynomial +`q(λ) = λ(3λ-2)(3λ-1)(12λ²-11λ+1)/4`. + +-/ + +/-! + +## G. The invariant contractions + +-/ + +def test : Matrix (Fin 22) (Fin 22) ℚ := Matrix.of fun i j => if i = j then 1 else 0 + + +/-- The Minkowski sign of a coordinate direction: `+1` on the time direction and `-1` on + the spatial directions. -/ +def minkSign : Fin 1 ⊕ Fin 3 → ℂ := Sum.elim (fun _ => 1) (fun _ => -1) + +/-- The enumeration `t, x, y, z` of the coordinate directions. -/ +def coordIdx : Fin 4 → Fin 1 ⊕ Fin 3 := ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2] + +/-- **The Levi-Civita sign of an index vector**: the determinant of its indicator matrix + against the coordinate enumeration — zero unless the four indices are a permutation of + the coordinates, and the sign of that permutation otherwise. -/ +def epsSign (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + (Matrix.of fun s t : Fin 4 => if d s = coordIdx t then (1 : ℤ) else 0).det + +/-- **The outer double contraction** `η^{μν} η^{ρσ} T_{μνρσ}`. -/ +noncomputable def contractionOuter : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, μ, ν, ν] + +/-- **The crossed double contraction** `η^{μρ} η^{νσ} T_{μνρσ}`. -/ +noncomputable def contractionCross : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, ν, μ, ν] + +/-- **The nested double contraction** `η^{μσ} η^{νρ} T_{μνρσ}`. -/ +noncomputable def contractionNested : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, ν, ν, μ] + +/-- **The Levi-Civita contraction** `ε^{μνρσ} T_{μνρσ}`: supported on the all-distinct + components. It is invariant under the connected Lorentz group, whose elements have unit + determinant. -/ +noncomputable def contractionEps : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsSign d : ℤ) : ℂ) • T d + +/-! + +## H. The final phase + +The endgame in the shape of the dimension-eight case: extract the orbit-sum coefficients +from membership in the rotational average, then let the extreme boost-weight components +along each axis vanish — `eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule` on the +concrete decomposition — and collapse the resulting relations onto the four invariant +contractions. + +-/ + +include hT in +/-- **The final collapse** (in progress): an element of the rotational average of the + paired-or-distinct span with boost weight zero along every axis is a combination of the + three metric double contractions and the Levi-Civita contraction. -/ +theorem mem_span_contractions_of_mem_rotationSubmodule {x : B} + (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x ∈ ((ℂ ∙ contractionOuter (T := T) ⊔ ℂ ∙ contractionCross (T := T)) ⊔ + ℂ ∙ contractionNested (T := T)) ⊔ ℂ ∙ contractionEps (T := T) := by + obtain ⟨c, rfl⟩ := hT.exists_eq_sum_of_mem_rotationSubmodule hx + sorry + +end IsQuadLorentz + +end Lorentz From 3c54e90dd9734cd09c80e7aa0a01b762e556c0ea Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:23:36 +0100 Subject: [PATCH 204/254] feat: Add IsQuadLorentz --- .../AlgebraValued/IsQuadLorentz.lean | 1664 +++++++++++++++++ 1 file changed, 1664 insertions(+) create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean new file mode 100644 index 000000000..5df9497c1 --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean @@ -0,0 +1,1664 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.HiggsBoson.Basic +public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim +public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.RepresentationTheory.Invariants +public meta import Mathlib.Data.Fintype.Sum +public meta import Mathlib.Data.Fintype.Pi +/-! +# Invariants under the Lorentz group with four-vector indices +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups Lorentz + + +structure IsQuadLorentz (B : Type*) [Semiring B] [Algebra ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin 4 → Fin 1 ⊕ Fin 3), + (∏ (i : Fin 4), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a + +namespace IsQuadLorentz +set_option linter.unusedVariables false + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B} + (hT : IsQuadLorentz B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsQuadLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 4 → (Fin 1 ⊕ Fin 3)) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 4 → (Fin 1 ⊕ Fin 3)) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq'] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## A. Light cone directions + +-/ + +open StandardModel.IsHiggsAlgebraValued StandardModel.IsHiggsAlgebraValued.IsDerivativeCollection + BoostWeight + +noncomputable def lightCone (hT : IsQuadLorentz B repLorentz T) (i : Fin 3) (c : Fin 4 → Fin 4) : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • T d + +/-- Each light-cone component lies in the span of the coordinate components. -/ +lemma lightCone_mem_span (i : Fin 3) (c : Fin 4 → Fin 4) : hT.lightCone i c ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +lemma eq_sum_lightCone (i : Fin 3) (d : Fin 4 → Fin 1 ⊕ Fin 3) : + T d = ∑ c : Fin 4 → Fin 4, + (∏ j, lightConeCoeffInv i (d j) (c j)) • hT.lightCone i c := by + calc T d = ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ c : Fin 4 → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j))) • T e := by + simp only [sum_prod_lightConeCoeffInv, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + _ = _ := by + simp only [lightCone, Finset.smul_sum, smul_smul, Finset.sum_smul] + rw [Finset.sum_comm] + +lemma span_eq_lightCone (hT : IsQuadLorentz B repLorentz T) (i : Fin 3) : + hT.span = ⨆ c, ℂ ∙ hT.lightCone i c := by + rw [span] + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun c => ?_) + · rw [Submodule.span_singleton_le_iff_mem, hT.eq_sum_lightCone i d] + exact sum_mem fun c _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem c (Submodule.mem_span_singleton_self _)) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.lightCone_mem_span i c + + +lemma lightCone_mem_boostWeightSubmodule (i : Fin 3) (c : Fin 4 → Fin 4) : + hT.lightCone i c ∈ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hstep : ∀ x : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + intro x + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) + = ∑ x : Fin 4 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) := by + simp only [lightCone, map_sum, map_smul] + _ = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ x : Fin 4 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * + (∏ j, lightConeCoeff i (c j) (a j))) • T a := by + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + exact sum_prod_lightConeCoeff i c a ht + _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by + rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, lightCone, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-- Integer mirror of `IsDerivativeCollection.lightConeCoeff`. -/ +def lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℤ := + if κ = 0 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then -1 else 0) + else if κ = 1 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then 1 else 0) + else if κ = 2 then (if μ = Sum.inr (i + 1) then 1 else 0) + else (if μ = Sum.inr (i + 2) then 1 else 0) + +/-- The integer mirror casts to the light-cone coefficients. -/ +lemma coe_lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : + ((lightConeCoeffZ i κ μ : ℤ) : ℂ) = lightConeCoeff i κ μ := by + rw [lightConeCoeffZ, lightConeCoeff] + split_ifs <;> norm_num + +/-- Rational mirror of `IsDerivativeCollection.lightConeCoeffInv`: entries `0`, `±2⁻¹` + and `1`, so ℚ-valued (like `lightConeTransition`) rather than integer. -/ +def lightConeCoeffInvQ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℚ := + if μ = Sum.inl 0 then (if κ = 0 then 2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr i then (if κ = 0 then -2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr (i + 1) then (if κ = 2 then 1 else 0) + else (if κ = 3 then 1 else 0) + +/-- The rational mirror casts to the inverse light-cone coefficients. -/ +lemma coe_lightConeCoeffInvQ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + ((lightConeCoeffInvQ i μ κ : ℚ) : ℂ) = lightConeCoeffInv i μ κ := by + rw [lightConeCoeffInvQ, lightConeCoeffInv] + split_ifs <;> norm_num + +/-- Where the integer mirror vanishes, the inverse coefficient vanishes too: the zero + pattern of `lightConeCoeffInv` is the transpose of that of `lightConeCoeffZ`. -/ +lemma lightConeCoeffInv_eq_zero_of_coeffZ_eq_zero (i : Fin 3) (κ : Fin 4) + (μ : Fin 1 ⊕ Fin 3) (h : lightConeCoeffZ i κ μ = 0) : lightConeCoeffInv i μ κ = 0 := by + rcases μ with a | j + · rw [Subsingleton.elim a 0] at h ⊢ + fin_cases i <;> fin_cases κ <;> simp_all [lightConeCoeffZ, lightConeCoeffInv] + · fin_cases i <;> fin_cases j <;> fin_cases κ <;> + simp_all [lightConeCoeffZ, lightConeCoeffInv] + +/-! + +## Vanishing of homogeneous components + +A finite sum of homogeneous boost-weight components vanishes only if every component +does: the weight spaces are independent. Consequently a weight-zero element written as +such a sum equals its weight-zero component alone. + +These are pure weight-grading statements (no `T` involved) generalizing +`eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule` from two weights to finitely +many; they will eventually move next to `boostWeightSubmodule_iSupIndep`. + +-/ + +/-- **Components of a vanishing homogeneous sum vanish**: the boost-weight spaces are + independent. -/ +lemma eq_zero_of_sum_mem_boostWeightSubmodule + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {s : Finset ℤ} {w : ℤ → A} + (hw : ∀ m ∈ s, w m ∈ boostWeightSubmodule rep i m) + (hsum : ∑ m ∈ s, w m = 0) : + ∀ m ∈ s, w m = 0 := by + intro m₀ hm₀ + refine Submodule.disjoint_def.1 + (iSupIndep_def.1 (boostWeightSubmodule_iSupIndep rep) m₀) (w m₀) (hw m₀ hm₀) ?_ + have h : w m₀ = -∑ m ∈ s.erase m₀, w m := + eq_neg_of_add_eq_zero_left (by rw [Finset.add_sum_erase s w hm₀]; exact hsum) + rw [h] + exact neg_mem (sum_mem fun m hm => Submodule.mem_iSup_of_mem m + (Submodule.mem_iSup_of_mem (Finset.ne_of_mem_erase hm) + (hw m (Finset.mem_of_mem_erase hm)))) + +/-- **A weight-zero element of a homogeneous sum is its weight-zero component**: all the + other components must vanish. -/ +lemma eq_component_zero_of_mem_boostWeightSubmodule + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {s : Finset ℤ} {w : ℤ → A} {x : A} + (hx : x ∈ boostWeightSubmodule rep i 0) + (hw : ∀ m ∈ s, w m ∈ boostWeightSubmodule rep i m) + (h0 : (0 : ℤ) ∈ s) (hsum : x = ∑ m ∈ s, w m) : + x = w 0 := by + have hv : ∀ m ∈ s, Function.update w 0 (w 0 - x) m ∈ boostWeightSubmodule rep i m := by + intro m hm + by_cases h : m = 0 + · subst h + rw [Function.update_self] + exact sub_mem (hw 0 h0) hx + · rw [Function.update_of_ne h] + exact hw m hm + have hsum0 : ∑ m ∈ s, Function.update w 0 (w 0 - x) m = 0 := by + rw [Finset.sum_update_of_mem h0, hsum, ← Finset.add_sum_erase s w h0, Finset.erase_eq] + abel + have h := eq_zero_of_sum_mem_boostWeightSubmodule hv hsum0 0 h0 + rw [Function.update_self] at h + exact (sub_eq_zero.1 h).symm + +/-! + +## B. Decomposing generators + +We want to give the decomposition of +`T d` into peices along the three axis. +-/ + +/-- The axis-i weight-zero component of a component, as in `boostComponent` + but one level down: the weight-m partial sum of `eq_sum_lightCone`. -/ +noncomputable def monoComponent (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) (m : ℤ) : B := + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = m), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c + +lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) (m : ℤ) : + hT.monoComponent i e m ∈ boostWeightSubmodule repLorentz i m := by + refine sum_mem fun c hc => Submodule.smul_mem _ _ ?_ + exact (show (∑ s, lightConeWeight (c s)) = m from (Finset.mem_filter.1 hc).2) ▸ + hT.lightCone_mem_boostWeightSubmodule i c + +/-- **The possible axis-`i` boost weights of a component**: the total light-cone weights + of the axis-`i` light-cone monomials appearing in `eq_sum_lightCone` with a nonzero + coefficient — those reachable through slots where the integer mirror `lightConeCoeffZ` + does not vanish. Computable, so membership can be settled by `decide`. -/ +def boostSupport (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : Finset ℤ := + (Finset.univ.filter fun c : Fin 4 → Fin 4 => + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0).image + fun c => ∑ s, lightConeWeight (c s) + +lemma eq_sum_monoComponent (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : + T e = ∑ m ∈ boostSupport i e, hT.monoComponent i e m := by + have hne : ∀ c : Fin 4 → Fin 4, + ((∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c ≠ 0) → + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0 := fun c hc s hs => + absurd (by rw [Finset.prod_eq_zero (Finset.mem_univ s) + (lightConeCoeffInv_eq_zero_of_coeffZ_eq_zero i (c s) (e s) hs), zero_smul]) hc + calc T e + = ∑ c : Fin 4 → Fin 4, + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c := + hT.eq_sum_lightCone i e + _ = ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c := + (Finset.sum_filter_of_ne (fun c _ => hne c)).symm + _ = ∑ m ∈ boostSupport i e, + ∑ c ∈ (Finset.univ.filter (fun c : Fin 4 → Fin 4 => + ∀ s, lightConeCoeffZ i (c s) (e s) ≠ 0)).filter + (fun c => (∑ s, lightConeWeight (c s)) = m), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c := + (Finset.sum_fiberwise_of_maps_to + (fun c hc => Finset.mem_image_of_mem _ hc) _).symm + _ = ∑ m ∈ boostSupport i e, hT.monoComponent i e m := by + refine Finset.sum_congr rfl fun m hm => ?_ + rw [Finset.filter_comm, monoComponent] + exact Finset.sum_filter_of_ne fun c _ => hne c + +set_option maxRecDepth 10000 in +/-- **A component is the sum of its weight components over the full weight set**: as + `eq_sum_monoComponent` but over the fixed weight set common to all components. -/ +lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : + T e = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.monoComponent i e m := by + have hall : ∀ c : Fin 4 → Fin 4, + (∑ s, lightConeWeight (c s)) ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ) := by + decide + rw [hT.eq_sum_lightCone i e] + exact (Finset.sum_fiberwise_of_maps_to (fun c _ => hall c) _).symm + +/-- **The matrix of the axis-`i` weight-zero projection in the `T`-basis**: the + coefficient of `T d` in the re-expansion of `monoComponent i e 0` through the + light-cone basis. Rational-valued and computable, built from the two mirrors. -/ +def weightZeroTransition (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ℚ := + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) + +/-- **The weight-zero component re-expanded in the `T`-basis**: `monoComponent i e 0` + is the `e`-th column of `weightZeroTransition` applied to the generators. -/ +lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : + hT.monoComponent i e 0 + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := by + rw [monoComponent] + simp only [lightCone, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [weightZeroTransition] + push_cast + simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] + +/-- **The boost-average matrix `M`**: the matrix of `3⁻¹(π₀⁰ + π₁⁰ + π₂⁰)` in the + `T`-basis — the average over the three axes of the weight-zero transition matrices. + Its powers drive the endgame recursion, and the certificate is a fixed rational + combination of them. -/ +def boostAverageTransition : + Matrix (Fin 4 → Fin 1 ⊕ Fin 3) (Fin 4 → Fin 1 ⊕ Fin 3) ℚ := + Matrix.of fun d e => (3⁻¹ : ℚ) * ∑ i : Fin 3, weightZeroTransition i d e + +include hT in +/-- **One round of the recursion along one axis**: an element of weight zero along axis + `i` expanded in the generators re-expands with the weight-zero transition matrix + applied to its coefficients — the nonzero-weight components of the expansion must + vanish, and the surviving weight-zero part is `weightZeroTransition` acting on `c`. -/ +lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + have hsum : x = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), + ∑ e, c e • hT.monoComponent i e m := by + rw [hx] + calc ∑ e, c e • T e + = ∑ e, c e • ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), + hT.monoComponent i e m := + Finset.sum_congr rfl fun e _ => by rw [← hT.eq_sum_monoComponent_univ i e] + _ = _ := by + simp only [Finset.smul_sum] + exact Finset.sum_comm + have hx0 : x = ∑ e, c e • hT.monoComponent i e 0 := + eq_component_zero_of_mem_boostWeightSubmodule + (w := fun m => ∑ e, c e • hT.monoComponent i e m) hw + (fun m _ => sum_mem fun e _ => Submodule.smul_mem _ _ + (hT.monoComponent_mem_boostWeightSubmodule i e m)) + (by decide) hsum + calc x = ∑ e, c e • hT.monoComponent i e 0 := hx0 + _ = ∑ e, c e • ∑ d, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := + Finset.sum_congr rfl fun e _ => by rw [hT.monoComponent_zero_eq i e] + _ = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + exact Finset.sum_congr rfl fun e _ => mul_comm _ _ + +include hT in +/-- **One averaged round of the recursion**: an element of weight zero along all three + axes re-expands with the boost-average matrix `M` applied to its coefficients — the + average over the axes of `eq_sum_weightZeroTransition_smul`. -/ +lemma eq_sum_boostAverageTransition_smul {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) * c e) • T d := by + have hround : ∀ i : Fin 3, + x = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := + fun i => hT.eq_sum_weightZeroTransition_smul i c hx (hw i) + have h3 : (3 : ℂ) • x = ∑ i : Fin 3, x := by + rw [Fin.sum_univ_three, show (3 : ℂ) = 1 + 1 + 1 from by norm_num, + add_smul, add_smul, one_smul] + calc x = (3⁻¹ : ℂ) • ((3 : ℂ) • x) := by rw [smul_smul]; norm_num + _ = (3⁻¹ : ℂ) • ∑ i : Fin 3, x := by rw [h3] + _ = (3⁻¹ : ℂ) • ∑ i : Fin 3, ∑ d, + (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := + congrArg (fun y => (3⁻¹ : ℂ) • y) (Finset.sum_congr rfl fun i _ => hround i) + _ = ∑ d, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) * c e) • T d := by + rw [Finset.sum_comm, Finset.smul_sum] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul, smul_smul] + congr 1 + rw [Finset.sum_comm, Finset.mul_sum] + refine Finset.sum_congr rfl fun e _ => ?_ + simp only [boostAverageTransition, Matrix.of_apply] + push_cast + rw [mul_assoc, Finset.sum_mul] + +include hT in +/-- **Iterated averaged rounds**: an element of weight zero along all three axes + re-expands through every power of the boost-average matrix applied to its + coefficients. -/ +lemma eq_sum_pow_boostAverageTransition_smul {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) (n : ℕ) : + x = ∑ d, (∑ e, (((boostAverageTransition ^ n) d e : ℚ) : ℂ) * c e) • T d := by + induction n with + | zero => + rw [hx] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + rw [pow_zero] + simp [Matrix.one_apply, apply_ite (fun q : ℚ => (q : ℂ)), ite_mul, Finset.sum_ite_eq] + | succ n ih => + rw [hT.eq_sum_boostAverageTransition_smul + (fun d => ∑ e, (((boostAverageTransition ^ n) d e : ℚ) : ℂ) * c e) ih hw] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + rw [pow_succ'] + calc ∑ e, ((boostAverageTransition d e : ℚ) : ℂ) + * ∑ f, (((boostAverageTransition ^ n) e f : ℚ) : ℂ) * c f + = ∑ e, ∑ f, ((boostAverageTransition d e : ℚ) : ℂ) + * ((((boostAverageTransition ^ n) e f : ℚ) : ℂ) * c f) := + Finset.sum_congr rfl fun e _ => by rw [Finset.mul_sum] + _ = ∑ f, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) + * (((boostAverageTransition ^ n) e f : ℚ) : ℂ)) * c f := by + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun f _ => ?_ + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun e _ => (mul_assoc _ _ _).symm + _ = ∑ e, (((boostAverageTransition * boostAverageTransition ^ n) d e : ℚ) : ℂ) + * c e := by + refine Finset.sum_congr rfl fun f _ => ?_ + congr 1 + rw [Matrix.mul_apply] + push_cast + rfl + +/-! + +## B. Pieces along one axis + +-/ + +def boostPiece (i : Fin 3) (n : ℤ) : Submodule ℂ B := + ⨆ c ∈ {c : Fin 4 → Fin 4 | (∑ j, lightConeWeight (c j)) = n}, ℂ ∙ hT.lightCone i c + +lemma boostPiece_le_boostWeightSubmodule (i : Fin 3) (n : ℤ) : + hT.boostPiece i n ≤ boostWeightSubmodule repLorentz i n := by + refine iSup₂_le fun c hc => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact (show (∑ j, lightConeWeight (c j)) = n from hc) ▸ + hT.lightCone_mem_boostWeightSubmodule i c + +/-- **The span regrouped by boost weight**: the light-cone components sorted by their + total weight along the axis. -/ +lemma span_eq_iSup_boostPiece (i : Fin 3) : + hT.span = ⨆ n : ℤ, hT.boostPiece i n := by + rw [hT.span_eq_lightCone i] + refine le_antisymm (iSup_le fun c => ?_) (iSup_le fun n => iSup₂_le fun c _ => ?_) + · exact le_iSup_of_le (∑ s, lightConeWeight (c s)) (le_iSup₂_of_le c rfl le_rfl) + · exact le_iSup_of_le c le_rfl + +/-! + +## C. Pieces along a second axis + +The axis-`i` and axis-`j` light-cone bases are related slot by slot by an invertible +`4 × 4` transition matrix. An axis-`i` piece is therefore covered by axis-`j` pieces +spanned by the light-cone components reachable through nonzero transition coefficients. + +-/ + +/-- **The one-slot transition matrix between two light-cone bases**: the axis-`i` + light-cone direction `κ` expanded in the axis-`j` light-cone basis. Rational-valued — + the entries are `0`, `±2⁻¹` and `±1` — so that vanishing of entries is decidable; + `coe_lightConeTransition` identifies it with the composite change of basis over `ℂ`. -/ +def lightConeTransition (i j : Fin 3) (κ κ' : Fin 4) : ℚ := + if j = i then (if κ = κ' then 1 else 0) + else if j = i + 1 then + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 3 then -1 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 3 then 1 else 0) + else if κ = 2 then (if κ' = 0 then -2⁻¹ else if κ' = 1 then 2⁻¹ else 0) + else (if κ' = 2 then 1 else 0) + else + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 2 then -1 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 2⁻¹ else if κ' = 2 then 1 else 0) + else if κ = 2 then (if κ' = 3 then 1 else 0) + else (if κ' = 0 then -2⁻¹ else if κ' = 1 then 2⁻¹ else 0) + +/-- **The transition matrix is the composite change of basis**: the axis-`i` light-cone + coefficients composed with the inverse axis-`j` coefficients. -/ +lemma coe_lightConeTransition (i j : Fin 3) (κ κ' : Fin 4) : + (lightConeTransition i j κ κ' : ℂ) + = ∑ μ : Fin 1 ⊕ Fin 3, lightConeCoeff i κ μ * lightConeCoeffInv j μ κ' := by + fin_cases i <;> fin_cases j <;> fin_cases κ <;> fin_cases κ' <;> + simp [lightConeTransition, lightConeCoeff, lightConeCoeffInv, Fintype.sum_sum_type, + Fin.sum_univ_three] <;> + norm_num + +/-- Integer mirror of twice the transition matrix: the entries are `0`, `±1` and `±2`. -/ +def lightConeTransitionZ (i j : Fin 3) (κ κ' : Fin 4) : ℤ := + if j = i then (if κ = κ' then 2 else 0) + else if j = i + 1 then + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 3 then -2 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 3 then 2 else 0) + else if κ = 2 then (if κ' = 0 then -1 else if κ' = 1 then 1 else 0) + else (if κ' = 2 then 2 else 0) + else + if κ = 0 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 2 then -2 else 0) + else if κ = 1 then (if κ' = 0 ∨ κ' = 1 then 1 else if κ' = 2 then 2 else 0) + else if κ = 2 then (if κ' = 3 then 2 else 0) + else (if κ' = 0 then -1 else if κ' = 1 then 1 else 0) + +/-- The transition matrix is half its integer mirror. -/ +lemma coe_lightConeTransition_eq (i j : Fin 3) (κ κ' : Fin 4) : + ((lightConeTransition i j κ κ' : ℚ) : ℂ) + = 2⁻¹ * ((lightConeTransitionZ i j κ κ' : ℤ) : ℂ) := by + rw [lightConeTransition, lightConeTransitionZ] + split_ifs <;> norm_num + +/-- The transition coefficients of a multi-index factor slot by slot. -/ +lemma sum_prod_lightConeTransition (i j : Fin 3) (c c' : Fin 4 → Fin 4) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) * + (∏ s, lightConeCoeffInv j (d s) (c' s)) + = ∏ s, (lightConeTransition i j (c s) (c' s) : ℂ) := by + calc ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) * + (∏ s, lightConeCoeffInv j (d s) (c' s)) + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ∏ s, (lightConeCoeff i (c s) (d s) * lightConeCoeffInv j (d s) (c' s)) := + Finset.sum_congr rfl fun d _ => (Finset.prod_mul_distrib).symm + _ = ∏ s, ∑ μ : Fin 1 ⊕ Fin 3, + (lightConeCoeff i (c s) μ * lightConeCoeffInv j μ (c' s)) := by + rw [Finset.prod_univ_sum, Fintype.piFinset_univ] + _ = ∏ s, (lightConeTransition i j (c s) (c' s) : ℂ) := + Finset.prod_congr rfl fun s _ => (coe_lightConeTransition i j (c s) (c' s)).symm + +/-- **The change-of-axis identity**: an axis-`i` light-cone component expanded in the + axis-`j` light-cone basis, with slot-wise transition coefficients. -/ +lemma lightCone_eq_sum_lightCone (i j : Fin 3) (c : Fin 4 → Fin 4) : + hT.lightCone i c = ∑ c' : Fin 4 → Fin 4, + (∏ s, (lightConeTransition i j (c s) (c' s) : ℂ)) • hT.lightCone j c' := by + calc hT.lightCone i c + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) • T d := by + rw [lightCone] + _ = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (c s) (d s)) • + ∑ c' : Fin 4 → Fin 4, + (∏ s, lightConeCoeffInv j (d s) (c' s)) • hT.lightCone j c' := + Finset.sum_congr rfl fun d _ => by rw [← hT.eq_sum_lightCone j d] + _ = ∑ c' : Fin 4 → Fin 4, (∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ s, lightConeCoeff i (c s) (d s)) * + (∏ s, lightConeCoeffInv j (d s) (c' s))) • hT.lightCone j c' := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun c' _ => (Finset.sum_smul).symm + _ = _ := Finset.sum_congr rfl fun c' _ => by rw [sum_prod_lightConeTransition] + +/-- **The second-level pieces**: the axis-`j` light-cone components of weight `m` which + are reachable, slot by slot, from an axis-`i` multi-index of weight `n`. -/ +def boostPiece₂ (i j : Fin 3) (n m : ℤ) : Submodule ℂ B := + ⨆ c' ∈ {c' : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c' s)) = m ∧ + ∃ c : Fin 4 → Fin 4, (∑ s, lightConeWeight (c s)) = n ∧ + ∀ s, lightConeTransition i j (c s) (c' s) ≠ 0}, ℂ ∙ hT.lightCone j c' + +/-- Each second-level piece is contained in the boost-weight space of its weight along + the second axis. -/ +lemma boostPiece₂_le_boostWeightSubmodule (i j : Fin 3) (n m : ℤ) : + hT.boostPiece₂ i j n m ≤ boostWeightSubmodule repLorentz j m := by + refine iSup₂_le fun c' hc' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact (show (∑ s, lightConeWeight (c' s)) = m from hc'.1) ▸ + hT.lightCone_mem_boostWeightSubmodule j c' + +/-- **The second-axis covering**: each axis-`i` piece is covered by the second-level + pieces along the axis `j` — the change-of-axis coefficients vanish on unreachable + multi-indices. -/ +lemma boostPiece_le_iSup_boostPiece₂ (i j : Fin 3) (n : ℤ) : + hT.boostPiece i n ≤ ⨆ m : ℤ, hT.boostPiece₂ i j n m := by + refine iSup₂_le fun c hc => ?_ + rw [Submodule.span_singleton_le_iff_mem, hT.lightCone_eq_sum_lightCone i j c] + refine sum_mem fun c' _ => ?_ + by_cases hz : ∀ s, lightConeTransition i j (c s) (c' s) ≠ 0 + · refine Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem (∑ s, lightConeWeight (c' s)) ?_) + rw [boostPiece₂] + exact Submodule.mem_iSup_of_mem c' (Submodule.mem_iSup_of_mem ⟨rfl, c, hc, hz⟩ + (Submodule.mem_span_singleton_self _)) + · push Not at hz + obtain ⟨s, hs⟩ := hz + rw [Finset.prod_eq_zero (Finset.mem_univ s) (by rw [hs, Rat.cast_zero]), zero_smul] + exact Submodule.zero_mem _ + +/-! + +## D. Tied pieces along the third axis + +Covering the doubly-weight-zero part by spans of whole light-cone components stabilises: +no new multi-index is excluded along the third axis. The third round instead splits each +generator into its boost-weight components along the last axis — the tied combinations — +and takes the pieces spanned by those components. + +-/ + +/-- **The axis-`j` weight-`m` component of an axis-`i` light-cone component**: the partial + sum of its change-of-axis expansion over the axis-`j` multi-indices of weight `m`. -/ +noncomputable def boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) (m : ℤ) : B := + ∑ c' ∈ Finset.univ.filter (fun c' : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c' s)) = m), + (∏ s, (lightConeTransition i j (c s) (c' s) : ℂ)) • hT.lightCone j c' + +/-- Each component is a boost eigenvector of its weight: it is a combination of + light-cone components of that weight. -/ +lemma boostComponent_mem_boostWeightSubmodule (i j : Fin 3) (c : Fin 4 → Fin 4) (m : ℤ) : + hT.boostComponent i j c m ∈ boostWeightSubmodule repLorentz j m := by + refine sum_mem fun c' hc' => Submodule.smul_mem _ _ ?_ + exact (Finset.mem_filter.1 hc').2 ▸ hT.lightCone_mem_boostWeightSubmodule j c' + +set_option maxRecDepth 10000 in +/-- **A light-cone component is the sum of its boost-weight components along any other + axis**: the change-of-axis expansion regrouped by weight. -/ +lemma lightCone_eq_sum_boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) : + hT.lightCone i c + = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.boostComponent i j c m := by + have hall : ∀ c' : Fin 4 → Fin 4, + (∑ s, lightConeWeight (c' s)) ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ) := by decide + rw [hT.lightCone_eq_sum_lightCone i j c] + exact (Finset.sum_fiberwise_of_maps_to (fun c' _ => hall c') _).symm + +/-- **The tied pieces along the third axis**: for each generator of the doubly-weight-zero + part, the span of its weight-`m` component along the last axis. -/ +noncomputable def boostPiece₃ (m : ℤ) : Submodule ℂ B := + ⨆ c' ∈ {c' : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c' s)) = 0 ∧ + ∃ c : Fin 4 → Fin 4, (∑ s, lightConeWeight (c s)) = 0 ∧ + ∀ s, lightConeTransition 0 1 (c s) (c' s) ≠ 0}, + ℂ ∙ hT.boostComponent 1 2 c' m + +/-- Each tied piece is contained in the boost-weight space of its weight along the last + axis. -/ +lemma boostPiece₃_le_boostWeightSubmodule (m : ℤ) : + hT.boostPiece₃ m ≤ boostWeightSubmodule repLorentz 2 m := by + refine iSup₂_le fun c' _ => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact hT.boostComponent_mem_boostWeightSubmodule 1 2 c' m + +/-- **The third-axis covering**: the doubly-weight-zero part is covered by the tied + pieces along the last axis. -/ +lemma boostPiece₂_le_iSup_boostPiece₃ : + hT.boostPiece₂ 0 1 0 0 ≤ ⨆ m : ℤ, hT.boostPiece₃ m := by + refine iSup₂_le fun c' hc' => ?_ + rw [Submodule.span_singleton_le_iff_mem, hT.lightCone_eq_sum_boostComponent 1 2 c'] + refine sum_mem fun m _ => ?_ + refine Submodule.mem_iSup_of_mem m ?_ + rw [boostPiece₃] + exact Submodule.mem_iSup_of_mem c' (Submodule.mem_iSup_of_mem hc' + (Submodule.mem_span_singleton_self _)) + + +/-! + +## E. The support of the weight-zero tied piece + +The weight-zero tied piece only involves components `T d` whose four indices either form +two identical pairs or are all different: the one-pair and three-of-a-kind monomials +cancel out of every tied generator. The cancellation is established by a sign involution: +swapping the two null directions in every slot of the inner light-cone index negates each +contributing term whenever a parity condition on the generator holds; the remaining cases +vanish slot by slot — a slot whose factor vanishes identically, or an odd null-sector +count, which no weight-zero inner index can accommodate. The finite checks are performed +by `decide` on the integer mirrors. + +-/ + +/-- **The index vectors surviving the three boost sieves**: the four indices either split + into two pairs of identical indices, or are all different. -/ +def IsPairedOrDistinct (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := + (d 0 = d 1 ∧ d 2 = d 3) ∨ (d 0 = d 2 ∧ d 1 = d 3) ∨ (d 0 = d 3 ∧ d 1 = d 2) ∨ + Function.Injective d + +instance : DecidablePred IsPairedOrDistinct := fun d => + inferInstanceAs (Decidable ((d 0 = d 1 ∧ d 2 = d 3) ∨ (d 0 = d 2 ∧ d 1 = d 3) ∨ + (d 0 = d 3 ∧ d 1 = d 2) ∨ Function.Injective d)) + +/-- The swap of the two null light-cone directions. -/ +def swap01 : Fin 4 → Fin 4 := fun κ => if κ = 0 then 1 else if κ = 1 then 0 else κ + +/-- The sign by which the null swap changes a slot: `-1` exactly on the null-sector + mismatches. -/ +def nuZ (a : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℤ := + if μ = Sum.inl 0 then (if a = 2 then -1 else 1) + else if μ = Sum.inr 2 then (if a = 0 ∨ a = 1 then -1 else 1) + else 1 + +/-- The null swap is an involution. -/ +lemma swap01_swap01 (κ : Fin 4) : swap01 (swap01 κ) = κ := by + fin_cases κ <;> rfl + +/-- The null swap negates the light-cone weight. -/ +lemma lightConeWeight_swap01 (κ : Fin 4) : + lightConeWeight (swap01 κ) = -lightConeWeight κ := by + fin_cases κ <;> rfl + +/-- **The slot identity of the sign involution**: swapping the null directions of the + inner index multiplies the slot factor by the sign `nuZ`. -/ +lemma transitionZ_swap01_mul_coeffZ : + ∀ (a κ : Fin 4) (μ : Fin 1 ⊕ Fin 3), + lightConeTransitionZ 1 2 a (swap01 κ) * lightConeCoeffZ 2 (swap01 κ) μ + = nuZ a μ * (lightConeTransitionZ 1 2 a κ * lightConeCoeffZ 2 κ μ) := by + decide + +set_option maxRecDepth 40000 in +/-- **The odd-count case**: if the number of null-sector indices of `d` is odd, every + weight-zero inner index hits a vanishing coefficient. -/ +lemma exists_coeffZ_eq_zero_of_odd : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, + Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card → + ∀ c'' : Fin 4 → Fin 4, (∑ s, lightConeWeight (c'' s)) = 0 → + ∃ s, lightConeCoeffZ 2 (c'' s) (d s) = 0 := by + decide + +set_option maxRecDepth 40000 in +/-- **The parity of the sign involution**: over a weight-zero generator, a component that + is neither two pairs nor all distinct, with no identically-vanishing slot and an even + null-sector count, carries total sign `-1`. -/ +lemma prod_nuZ_eq_neg_one : + ∀ c' : Fin 4 → Fin 4, (∑ s, lightConeWeight (c' s)) = 0 → + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, ¬IsPairedOrDistinct d → + ¬(∃ s, ∀ κ, lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0) → + ¬Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card → + (∏ s, nuZ (c' s) (d s)) = -1 := by + suffices h1 : ∀ c' ∈ {c : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c s)) = 0}, + ∀ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | ¬IsPairedOrDistinct d + ∧ ¬Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card } , + ¬(∃ s, ∀ κ, lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0) → + (∏ s, nuZ (c' s) (d s)) = -1 by + intro c' hc' d hd hA hC + exact h1 c' hc' d ⟨hd, hC⟩ hA + decide + +/-- **The vanishing of the bad coefficients**: over a weight-zero generator, the inner + transition sum vanishes on every component that is neither two pairs nor all + distinct — slot by slot when some slot factor vanishes identically or the null-sector + count is odd, and by the sign involution otherwise. -/ +lemma sum_prod_transitionZ_coeffZ_eq_zero (c' : Fin 4 → Fin 4) + (hc' : (∑ s, lightConeWeight (c' s)) = 0) + (d : Fin 4 → Fin 1 ⊕ Fin 3) (hd : ¬IsPairedOrDistinct d) : + (∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + (∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s))) = 0 := by + by_cases hA : ∃ s, ∀ κ, lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0 + · obtain ⟨s, hs⟩ := hA + refine Finset.sum_eq_zero fun c'' _ => ?_ + rw [← Finset.prod_mul_distrib] + exact Finset.prod_eq_zero (Finset.mem_univ s) (hs (c'' s)) + by_cases hC : Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card + · refine Finset.sum_eq_zero fun c'' hc'' => ?_ + obtain ⟨s, hs⟩ := exists_coeffZ_eq_zero_of_odd d hC c'' (Finset.mem_filter.1 hc'').2 + rw [← Finset.prod_mul_distrib] + refine Finset.prod_eq_zero (Finset.mem_univ s) ?_ + rw [hs, mul_zero] + have hsgn : (∏ s, nuZ (c' s) (d s)) = -1 := prod_nuZ_eq_neg_one c' hc' d hd hA hC + have hswap : ∀ c'' : Fin 4 → Fin 4, + (∏ s, lightConeTransitionZ 1 2 (c' s) (swap01 (c'' s))) * + (∏ s, lightConeCoeffZ 2 (swap01 (c'' s)) (d s)) + = (∏ s, nuZ (c' s) (d s)) * + ((∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s))) := by + intro c'' + simp only [← Finset.prod_mul_distrib] + exact Finset.prod_congr rfl fun s _ => transitionZ_swap01_mul_coeffZ (c' s) (c'' s) (d s) + have hwt : ∀ c'' : Fin 4 → Fin 4, (∑ s, lightConeWeight (swap01 (c'' s))) + = -∑ s, lightConeWeight (c'' s) := fun c'' => by + rw [← Finset.sum_neg_distrib] + exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c'' s) + have hrei : (∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + (∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s))) + = ∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + ((∏ s, lightConeTransitionZ 1 2 (c' s) (swap01 (c'' s))) * + (∏ s, lightConeCoeffZ 2 (swap01 (c'' s)) (d s))) := by + refine Finset.sum_nbij' (i := fun c'' => fun s => swap01 (c'' s)) + (j := fun c'' => fun s => swap01 (c'' s)) ?_ ?_ ?_ ?_ ?_ + · intro c'' hc'' + refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ + rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] + · intro c'' hc'' + refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ + rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] + · intro c'' _ + funext s + rw [swap01_swap01] + · intro c'' _ + funext s + rw [swap01_swap01] + · intro c'' _ + simp only [swap01_swap01] + have hkey := hrei.trans ((Finset.sum_congr rfl fun c'' _ => hswap c'').trans + (Finset.mul_sum _ _ _).symm) + rw [hsgn] at hkey + omega + +/-! + +### Rotation equivariance and support of the boost average + +Rotating both indices of `weightZeroTransition` advances the axis, so the average over +the axes is rotation invariant. And the transition out of a paired-or-distinct index +vanishes on every bad index: a sector-incompatible slot kills every summand, and +otherwise the null-swap involution carries sign `-1`. + +-/ + +/-- Rotating the direction letter advances the axis of the light-cone coefficient. -/ +lemma lightConeCoeffZ_cycDir : + ∀ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3), + lightConeCoeffZ (i + 1) κ (cycDir μ) = lightConeCoeffZ i κ μ := by + decide + +/-- Integer mirror of `lightConeCoeffInvQ`: twice the inverse coefficients, so that + slot identities can be settled by kernel `decide` over `ℤ`. -/ +def lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℤ := + if μ = Sum.inl 0 then (if κ = 0 then 1 else if κ = 1 then 1 else 0) + else if μ = Sum.inr i then (if κ = 0 then -1 else if κ = 1 then 1 else 0) + else if μ = Sum.inr (i + 1) then (if κ = 2 then 2 else 0) + else (if κ = 3 then 2 else 0) + +/-- The integer mirror casts to twice the inverse coefficients. -/ +lemma coe_lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + ((lightConeCoeffInvZ i μ κ : ℤ) : ℚ) = 2 * lightConeCoeffInvQ i μ κ := by + rw [lightConeCoeffInvZ, lightConeCoeffInvQ] + split_ifs <;> norm_num + +/-- Rotating the direction letter advances the axis of the integer mirror. -/ +lemma lightConeCoeffInvZ_cycDir : + ∀ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4), + lightConeCoeffInvZ (i + 1) (cycDir μ) κ = lightConeCoeffInvZ i μ κ := by + decide + +/-- Rotating the direction letter advances the axis of the inverse coefficient. -/ +lemma lightConeCoeffInvQ_cycDir (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + lightConeCoeffInvQ (i + 1) (cycDir μ) κ = lightConeCoeffInvQ i μ κ := by + have h := congrArg (fun n : ℤ => (n : ℚ)) (lightConeCoeffInvZ_cycDir i μ κ) + simp only [coe_lightConeCoeffInvZ] at h + linarith + +/-- **Rotation equivariance of the weight-zero transition**: rotating both indices + advances the axis. -/ +lemma weightZeroTransition_cycDir (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + weightZeroTransition (i + 1) (fun s => cycDir (d s)) (fun s => cycDir (e s)) + = weightZeroTransition i d e := by + rw [weightZeroTransition, weightZeroTransition] + refine Finset.sum_congr rfl fun c _ => Finset.prod_congr rfl fun s _ => ?_ + rw [lightConeCoeffInvQ_cycDir, lightConeCoeffZ_cycDir] + +/-- **Rotation invariance of the boost average**: the average over the axes is + invariant under rotating both indices. -/ +lemma boostAverageTransition_cycDir (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition (fun s => cycDir (d s)) (fun s => cycDir (e s)) + = boostAverageTransition d e := by + simp only [boostAverageTransition, Matrix.of_apply] + congr 1 + exact (Fintype.sum_equiv (Equiv.addRight (1 : Fin 3)) _ _ fun i => + (weightZeroTransition_cycDir i d e).symm).symm + +/-- The cyclic rotation of directions has order three. -/ +lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ)) = μ := by + decide + +/-- Rotating the column index moves a double rotation to the row index. -/ +lemma boostAverageTransition_cycDir_right (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d (fun s => cycDir (e s)) + = boostAverageTransition (fun s => cycDir (cycDir (d s))) e := by + conv_lhs => rw [show d = (fun s => cycDir (cycDir (cycDir (d s)))) from + funext fun s => (cycDir_cycDir_cycDir (d s)).symm] + exact boostAverageTransition_cycDir (fun s => cycDir (cycDir (d s))) e + +/-- Rotating the column index twice moves a single rotation to the row index. -/ +lemma boostAverageTransition_cycDir_right2 (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = boostAverageTransition (fun s => cycDir (d s)) e := by + calc boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = boostAverageTransition (fun s => cycDir (cycDir (d s))) (fun s => cycDir (e s)) := + boostAverageTransition_cycDir_right d (fun s => cycDir (e s)) + _ = boostAverageTransition (fun s => cycDir (d s)) e := + boostAverageTransition_cycDir (fun s => cycDir (d s)) e + +/-- Two direction letters lie in compatible sectors for the axis-`i` transition: both + in the null sector, or equal. -/ +def SameSlotSector (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : Prop := + ((μ = Sum.inl 0 ∨ μ = Sum.inr i) ∧ (ν = Sum.inl 0 ∨ ν = Sum.inr i)) ∨ μ = ν + +instance (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : Decidable (SameSlotSector i μ ν) := + inferInstanceAs (Decidable (_ ∨ _)) + +/-- A sector-incompatible slot annihilates every slot factor. -/ +lemma slot_eq_zero_of_not_sameSlotSector : + ∀ (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3), ¬SameSlotSector i μ ν → + ∀ κ, lightConeCoeffInvQ i μ κ * (lightConeCoeffZ i κ ν : ℚ) = 0 := by + decide +kernel + +/-- The sign by which the null swap changes an axis-`i` slot factor. -/ +def nuSignZ (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℤ := + (if μ = Sum.inr i then -1 else 1) * (if ν = Sum.inr i then -1 else 1) + +/-- Swapping the null directions multiplies the slot factor by the sign. -/ +lemma invQ_swap01_mul_coeffZ_swap01 : + ∀ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) (ν : Fin 1 ⊕ Fin 3), + lightConeCoeffInvQ i μ (swap01 κ) * (lightConeCoeffZ i (swap01 κ) ν : ℚ) + = (nuSignZ i μ ν : ℚ) + * (lightConeCoeffInvQ i μ κ * (lightConeCoeffZ i κ ν : ℚ)) := by + decide +kernel + +set_option maxRecDepth 100000 in +/-- **The sign of a sector-compatible parity mismatch**: a paired-or-distinct column + index against a bad row index with all slots sector-compatible carries sign `-1`. -/ +lemma prod_nuSignZ_eq_neg_one : + ∀ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3), IsPairedOrDistinct e → + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, ¬IsPairedOrDistinct d → + (∀ s, SameSlotSector i (e s) (d s)) → + (∏ s, nuSignZ i (e s) (d s)) = -1 := by + suffices h1 : ∀ i : Fin 3, ∀ e ∈ {e : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct e}, + ∀ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | ¬IsPairedOrDistinct d}, + (∀ s, SameSlotSector i (e s) (d s)) → (∏ s, nuSignZ i (e s) (d s)) = -1 by + intro i e he d hd hs + exact h1 i e he d hd hs + decide +kernel + +/-- **Support of the weight-zero transition**: the transition out of a + paired-or-distinct index vanishes on every bad index. -/ +lemma weightZeroTransition_eq_zero_of_not_isPairedOrDistinct (i : Fin 3) + {d e : Fin 4 → Fin 1 ⊕ Fin 3} (he : IsPairedOrDistinct e) + (hd : ¬IsPairedOrDistinct d) : weightZeroTransition i d e = 0 := by + by_cases hA : ∀ s, SameSlotSector i (e s) (d s) + · have hsgn := prod_nuSignZ_eq_neg_one i e he d hd hA + have hswap : ∀ c : Fin 4 → Fin 4, + (∏ s, lightConeCoeffInvQ i (e s) (swap01 (c s)) * + (lightConeCoeffZ i (swap01 (c s)) (d s) : ℚ)) + = ((∏ s, nuSignZ i (e s) (d s) : ℤ) : ℚ) * + ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) := by + intro c + push_cast + rw [← Finset.prod_mul_distrib] + exact Finset.prod_congr rfl fun s _ => invQ_swap01_mul_coeffZ_swap01 i (e s) (c s) (d s) + have hwt : ∀ c : Fin 4 → Fin 4, (∑ s, lightConeWeight (swap01 (c s))) + = -∑ s, lightConeWeight (c s) := fun c => by + rw [← Finset.sum_neg_distrib] + exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c s) + have hrei : weightZeroTransition i d e + = ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvQ i (e s) (swap01 (c s)) * + (lightConeCoeffZ i (swap01 (c s)) (d s) : ℚ) := by + rw [weightZeroTransition] + refine Finset.sum_nbij' (i := fun c => fun s => swap01 (c s)) + (j := fun c => fun s => swap01 (c s)) ?_ ?_ ?_ ?_ ?_ + · intro c hc + exact Finset.mem_filter.2 ⟨Finset.mem_univ _, by + rw [hwt, (Finset.mem_filter.1 hc).2, neg_zero]⟩ + · intro c hc + exact Finset.mem_filter.2 ⟨Finset.mem_univ _, by + rw [hwt, (Finset.mem_filter.1 hc).2, neg_zero]⟩ + · intro c _ + funext s + rw [swap01_swap01] + · intro c _ + funext s + rw [swap01_swap01] + · intro c _ + simp only [swap01_swap01] + have hkey := hrei.trans ((Finset.sum_congr rfl fun c _ => hswap c).trans + (Finset.mul_sum _ _ _).symm) + rw [← weightZeroTransition, hsgn] at hkey + push_cast at hkey + linarith [hkey] + · push Not at hA + obtain ⟨s₀, hs₀⟩ := hA + rw [weightZeroTransition] + refine Finset.sum_eq_zero fun c _ => ?_ + exact Finset.prod_eq_zero (Finset.mem_univ s₀) + (slot_eq_zero_of_not_sameSlotSector i (e s₀) (d s₀) hs₀ (c s₀)) + +/-- **Support of the boost average**: the average out of a paired-or-distinct index is + supported on the paired-or-distinct indices. -/ +lemma boostAverageTransition_eq_zero_of_not_isPairedOrDistinct + {d e : Fin 4 → Fin 1 ⊕ Fin 3} (he : IsPairedOrDistinct e) + (hd : ¬IsPairedOrDistinct d) : boostAverageTransition d e = 0 := by + simp only [boostAverageTransition, Matrix.of_apply] + rw [Finset.sum_eq_zero fun i _ => + weightZeroTransition_eq_zero_of_not_isPairedOrDistinct i he hd, mul_zero] + +/-- **The expansion of the weight-zero tied component into monomials**: the coefficient + of each component `T d` is a sixteenth of the integer transition sum. -/ +lemma boostComponent_zero_eq (c' : Fin 4 → Fin 4) : + hT.boostComponent 1 2 c' 0 = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ((16⁻¹ : ℂ) * ((∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c'' s)) = 0), + (∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * + (∏ s, lightConeCoeffZ 2 (c'' s) (d s)) : ℤ) : ℂ)) • T d := by + rw [boostComponent] + simp only [lightCone, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c'' _ => ?_ + simp only [coe_lightConeTransition_eq, ← coe_lightConeCoeffZ, Finset.prod_mul_distrib, + Finset.prod_const, Finset.card_univ, Fintype.card_fin] + ring + +/-- **The weight-zero tied component of every weight-zero generator is supported on the + paired-or-distinct components.** -/ +lemma boostComponent_zero_mem_iSup_pairedOrDistinct (c' : Fin 4 → Fin 4) + (hc' : (∑ s, lightConeWeight (c' s)) = 0) : + hT.boostComponent 1 2 c' 0 ∈ + ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d := by + rw [hT.boostComponent_zero_eq c'] + refine sum_mem fun d _ => ?_ + by_cases hd : IsPairedOrDistinct d + · exact Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem hd (Submodule.mem_span_singleton_self _))) + · rw [sum_prod_transitionZ_coeffZ_eq_zero c' hc' d hd, Int.cast_zero, mul_zero, zero_smul] + exact Submodule.zero_mem _ + +/-- **The support of the weight-zero tied piece**: it is spanned by the components whose + four indices either form two identical pairs or are all different. The one-pair and + three-of-a-kind components cancel out of every tied generator. -/ +lemma boostPiece₃_zero_le_iSup_pairedOrDistinct : + hT.boostPiece₃ 0 ≤ + ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d := by + refine iSup₂_le fun c' hc' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact hT.boostComponent_zero_mem_iSup_pairedOrDistinct c' hc'.1 + +def pairedOrDistinctSubmodule : Submodule ℂ B := + ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d + + +/-! + +## F. The rotational group + +-/ + +/-- **The rotation orbit of an index vector**: the indices that `d` is carried onto by + the powers of the cyclic rotation `x → y → z → x` of the rotational average. -/ +def rotationIndexSet (d : Fin 4 → Fin 1 ⊕ Fin 3) : Finset (Fin 4 → Fin 1 ⊕ Fin 3) := + {d, fun s => cycDir (d s), fun s => cycDir (cycDir (d s))} + +/-- **The rotational average**: the mean of the action of the three powers of the cyclic + rotation `x → y → z → x`. -/ +noncomputable def rotationAverage : B →ₗ[ℂ] B := + (3⁻¹ : ℂ) • ((LinearMap.id : B →ₗ[ℂ] B) + repLorentz rotationCycle + + repLorentz (rotationCycle ^ 2)) + +/-- **The action of the rotational average on the paired-or-distinct span**: the image of + the weight-zero tied piece's support under averaging over the cyclic rotation. -/ +noncomputable def rotationSubmodule : Submodule ℂ B := + (pairedOrDistinctSubmodule (T := T)).map (rotationAverage (repLorentz := repLorentz)) + +include hT in +/-- **The cyclic rotation acts on components by cycling every index.** -/ +lemma repLorentz_rotationCycle_apply (d : Fin 4 → Fin 1 ⊕ Fin 3) : + repLorentz rotationCycle (T d) = T (fun s => cycDir (d s)) := by + have hcoef : ∀ a : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ s, (((SL2C.toLorentzGroup rotationCycle).1 (a s) (d s) : ℝ) : ℂ)) + = if a = fun s => cycDir (d s) then 1 else 0 := by + intro a + by_cases had : a = fun s => cycDir (d s) + · rw [if_pos had] + refine Finset.prod_eq_one fun s _ => ?_ + rw [toLorentzGroup_rotationCycle_apply, if_pos (congrFun had s), Complex.ofReal_one] + · rw [if_neg had] + obtain ⟨s, hs⟩ := Function.ne_iff.1 had + refine Finset.prod_eq_zero (Finset.mem_univ s) ?_ + rw [toLorentzGroup_rotationCycle_apply, if_neg hs, Complex.ofReal_zero] + rw [hT.repLorentz_T] + simp only [hcoef, ite_smul, one_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, + if_true] + +/-- **The sum of a component over its rotation orbit** — the un-normalised rotational + average of `T d`. Its support is `rotationIndexSet d`. -/ +noncomputable def rotationOrbitSum (d : Fin 4 → Fin 1 ⊕ Fin 3) : B := + T d + T (fun s => cycDir (d s)) + T (fun s => cycDir (cycDir (d s))) + +include hT in +/-- The rotational average carries a component to a third of its orbit sum. -/ +lemma rotationAverage_apply (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationAverage (repLorentz := repLorentz) (T d) + = (3⁻¹ : ℂ) • rotationOrbitSum (T := T) d := by + rw [rotationAverage, sq, map_mul, rotationOrbitSum] + simp only [LinearMap.smul_apply, LinearMap.add_apply, LinearMap.id_apply, + Module.End.mul_apply, hT.repLorentz_rotationCycle_apply] + +include hT in +/-- **The rotational average of the paired-or-distinct span, presented by orbit + sums.** -/ +lemma rotationSubmodule_eq : + rotationSubmodule (repLorentz := repLorentz) (T := T) + = ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, + ℂ ∙ rotationOrbitSum (T := T) d := by + rw [rotationSubmodule, pairedOrDistinctSubmodule] + simp only [Submodule.map_iSup] + refine iSup_congr fun d => iSup_congr fun hd => ?_ + rw [Submodule.map_span, Set.image_singleton, hT.rotationAverage_apply d] + exact Submodule.span_singleton_smul_eq ((by norm_num : (3⁻¹ : ℂ) ≠ 0).isUnit) _ + +include hT in +/-- **Extraction from the rotational average**: an element of the averaged span is a + combination of the orbit sums of the paired-or-distinct components. -/ +lemma exists_eq_sum_of_mem_rotationSubmodule {x : B} + (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) : + ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, + x = ∑ d ∈ Finset.univ.filter (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d), + c d • rotationOrbitSum (T := T) d := by + rw [hT.rotationSubmodule_eq] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, + y = ∑ d ∈ Finset.univ.filter (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d), + c d • rotationOrbitSum (T := T) d) + (fun d => ⨆ _ : d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, + ℂ ∙ rotationOrbitSum (T := T) d) hx ?_ ?_ ?_ + · intro d y hy + by_cases hd : IsPairedOrDistinct d + · rw [iSup_pos (show d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d} + from hd)] at hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq', hd] + · rw [iSup_neg (show d ∉ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d} + from hd)] at hy + rw [Submodule.mem_bot] at hy + exact ⟨0, by simp [hy]⟩ + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + +/-! + +### Orbit representatives + +`rotationOrbitSum` is constant on rotation orbits, so the extraction over all +paired-or-distinct indices collapses to one term per orbit. The canonical +representative of an orbit is the member whose first spatial letter is the first +spatial direction; `rotationSubset` lists the `22` representatives explicitly. + +-/ + +omit [Algebra ℂ B] in +/-- The orbit sum is invariant under rotating the index. -/ +lemma rotationOrbitSum_cycDir (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationOrbitSum (T := T) (fun s => cycDir (d s)) = rotationOrbitSum (T := T) d := by + simp only [rotationOrbitSum] + rw [show (fun s => cycDir (cycDir (cycDir (d s)))) = d from + funext fun s => cycDir_cycDir_cycDir (d s)] + abel + +/-- An index is the canonical representative of its rotation orbit when its first + spatial letter, if any, is the first spatial direction. -/ +def IsOrbitRep (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := + (∀ s, d s = Sum.inl 0) ∨ ∃ s, d s = Sum.inr 0 ∧ ∀ s' < s, d s' = Sum.inl 0 + +instance : DecidablePred IsOrbitRep := fun d => + inferInstanceAs (Decidable + ((∀ s, d s = Sum.inl 0) ∨ ∃ s, d s = Sum.inr 0 ∧ ∀ s' < s, d s' = Sum.inl 0)) + +/-- The canonical representative of the rotation orbit of an index. -/ +def orbitRepOf (d : Fin 4 → Fin 1 ⊕ Fin 3) : Fin 4 → Fin 1 ⊕ Fin 3 := + if IsOrbitRep d then d + else if IsOrbitRep (fun s => cycDir (d s)) then fun s => cycDir (d s) + else fun s => cycDir (cycDir (d s)) + +omit [Algebra ℂ B] in +/-- The orbit sum of an index equals that of its canonical representative. -/ +lemma rotationOrbitSum_orbitRepOf (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationOrbitSum (T := T) (orbitRepOf d) = rotationOrbitSum (T := T) d := by + rw [orbitRepOf] + split_ifs + · rfl + · exact rotationOrbitSum_cycDir (T := T) d + · exact (rotationOrbitSum_cycDir (T := T) _).trans (rotationOrbitSum_cycDir (T := T) d) + +/-- The `22` canonical orbit representatives of the paired-or-distinct indices under + cyclic rotation. -/ +def rotationSubset : Finset (Fin 4 → Fin 1 ⊕ Fin 3) := + {![Sum.inl 0, Sum.inl 0, Sum.inl 0, Sum.inl 0], + ![Sum.inl 0, Sum.inl 0, Sum.inr 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inl 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 0, Sum.inl 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2], + ![Sum.inl 0, Sum.inr 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inl 0, Sum.inl 0, Sum.inr 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 0, Sum.inl 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 1, Sum.inr 2], + ![Sum.inr 0, Sum.inl 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inl 0, Sum.inl 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 0, Sum.inr 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 1, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inr 2, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inl 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inr 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 1, Sum.inr 1, Sum.inr 0], + ![Sum.inr 0, Sum.inr 1, Sum.inr 2, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inl 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 2, Sum.inr 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 2, Sum.inr 1, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inr 2, Sum.inr 0]} + +set_option maxRecDepth 10000 in +/-- The canonical representative of a paired-or-distinct index is one of the `22` + listed representatives. -/ +lemma orbitRepOf_mem_rotationSubset : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, IsPairedOrDistinct d → + orbitRepOf d ∈ rotationSubset := by + decide + +include hT in +/-- **Extraction over unique orbit representatives**: an element of the rotational + average is a combination of the orbit sums of the `22` canonical representatives — + one term per orbit. -/ +lemma exists_eq_sum_rotationSubset_of_mem_rotationSubmodule {x : B} + (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) : + ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, + x = ∑ d ∈ rotationSubset, c d • rotationOrbitSum (T := T) d := by + obtain ⟨c, rfl⟩ := hT.exists_eq_sum_of_mem_rotationSubmodule hx + refine ⟨fun r => ∑ d ∈ (Finset.univ.filter + (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d)).filter + (fun d => orbitRepOf d = r), c d, ?_⟩ + calc ∑ d ∈ Finset.univ.filter (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d), + c d • rotationOrbitSum (T := T) d + = ∑ r ∈ rotationSubset, ∑ d ∈ (Finset.univ.filter + (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => IsPairedOrDistinct d)).filter + (fun d => orbitRepOf d = r), + c d • rotationOrbitSum (T := T) d := + (Finset.sum_fiberwise_of_maps_to (fun d hd => + orbitRepOf_mem_rotationSubset d (Finset.mem_filter.1 hd).2) _).symm + _ = _ := by + refine Finset.sum_congr rfl fun r hr => ?_ + rw [Finset.sum_smul] + refine Finset.sum_congr rfl fun d hd => ?_ + rw [show rotationOrbitSum (T := T) r = rotationOrbitSum (T := T) d from + (Finset.mem_filter.1 hd).2 ▸ rotationOrbitSum_orbitRepOf (T := T) d] + +/-- The listed representatives are paired-or-distinct. -/ +lemma isPairedOrDistinct_of_mem_rotationSubset : + ∀ d ∈ rotationSubset, IsPairedOrDistinct d := by + decide +kernel + +/-- Goodness is preserved by rotating the index. -/ +lemma isPairedOrDistinct_cycDir : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, IsPairedOrDistinct d → + IsPairedOrDistinct (fun s => cycDir (d s)) := by + decide +kernel + +/-- The multiplicity with which `d` appears among the three rotations of `e`. -/ +def rotationOrbitCoeff (e d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + (if d = e then 1 else 0) + (if d = (fun s => cycDir (e s)) then 1 else 0) + + (if d = (fun s => cycDir (cycDir (e s))) then 1 else 0) + +/-- Only members of the orbit of a listed representative meet its indicator. -/ +lemma orbitRepOf_eq_of_rotationOrbitCoeff_ne_zero : + ∀ r ∈ rotationSubset, ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, + rotationOrbitCoeff r d ≠ 0 → orbitRepOf d = r := by + decide +kernel + +/-- The orbit of the canonical representative is the orbit. -/ +lemma rotationIndexSet_orbitRepOf : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, + rotationIndexSet (orbitRepOf d) = rotationIndexSet d := by + decide +kernel + +/-- The multiplicity of an index in its own orbit: `3` on a rotation-fixed index and + `1` otherwise. -/ +lemma rotationOrbitCoeff_orbitRepOf : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, rotationOrbitCoeff (orbitRepOf d) d + = if (fun s => cycDir (d s)) = d then 3 else 1 := by + decide +kernel + +/-- An index not fixed by the rotation has three distinct rotations. -/ +lemma cycDir_orbit_distinct : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, (fun s => cycDir (d s)) ≠ d → + ((fun s => cycDir (cycDir (d s))) ≠ d + ∧ (fun s => cycDir (cycDir (d s))) ≠ (fun s => cycDir (d s))) := by + decide +kernel + +/-- The orbit indicator of a good index vanishes on every bad index. -/ +lemma rotationOrbitCoeff_eq_zero {r d : Fin 4 → Fin 1 ⊕ Fin 3} + (hr : IsPairedOrDistinct r) (hd : ¬IsPairedOrDistinct d) : + rotationOrbitCoeff r d = 0 := by + have h1 : ¬(d = r) := fun h => hd (by rw [h]; exact hr) + have h2 : ¬(d = fun s => cycDir (r s)) := fun h => + hd (by rw [h]; exact isPairedOrDistinct_cycDir r hr) + have h3 : ¬(d = fun s => cycDir (cycDir (r s))) := fun h => + hd (by rw [h]; exact isPairedOrDistinct_cycDir _ (isPairedOrDistinct_cycDir r hr)) + rw [rotationOrbitCoeff, if_neg h1, if_neg h2, if_neg h3] + norm_num + +/-- **Sums over the orbit of the representative**: for any weighting, the sum over the + orbit of the canonical representative times the multiplicity equals the plain sum + over the three rotations. -/ +lemma sum_rotationIndexSet_orbitRepOf_mul (f : (Fin 4 → Fin 1 ⊕ Fin 3) → ℚ) + (d : Fin 4 → Fin 1 ⊕ Fin 3) : + (∑ d' ∈ rotationIndexSet (orbitRepOf d), f d') + * ((rotationOrbitCoeff (orbitRepOf d) d : ℤ) : ℚ) + = f d + f (fun s => cycDir (d s)) + f (fun s => cycDir (cycDir (d s))) := by + rw [rotationIndexSet_orbitRepOf d, rotationOrbitCoeff_orbitRepOf d] + by_cases hfix : (fun s => cycDir (d s)) = d + · have h2 : (fun s => cycDir (cycDir (d s))) = d := by + funext s + rw [congrFun hfix s, congrFun hfix s] + rw [rotationIndexSet, if_pos hfix, hfix, h2, + show ({d, d, d} : Finset (Fin 4 → Fin 1 ⊕ Fin 3)) = {d} from by simp, + Finset.sum_singleton] + push_cast + ring + · obtain ⟨h31, h32⟩ := cycDir_orbit_distinct d hfix + rw [rotationIndexSet, if_neg hfix, + Finset.sum_insert (by + simp only [Finset.mem_insert, Finset.mem_singleton] + push Not + exact ⟨fun h => hfix h.symm, fun h => h31 h.symm⟩), + Finset.sum_insert (by + simp only [Finset.mem_singleton] + exact fun h => h32 h.symm), + Finset.sum_singleton] + push_cast + ring + +/-- **The rotated columns collapse onto the representatives**: for a good column index, + the sum of the boost average over the three rotated columns equals the + representative-indexed combination of its row-orbit sums. -/ +lemma boostAverageTransition_orbit_eq (e : Fin 4 → Fin 1 ⊕ Fin 3) + (he : IsPairedOrDistinct e) (d : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d e + boostAverageTransition d (fun s => cycDir (e s)) + + boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = ∑ r ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet r, boostAverageTransition d' e) + * ((rotationOrbitCoeff r d : ℤ) : ℚ) := by + by_cases hd : IsPairedOrDistinct d + · have hsingle : (∑ r ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet r, boostAverageTransition d' e) + * ((rotationOrbitCoeff r d : ℤ) : ℚ)) + = (∑ d' ∈ rotationIndexSet (orbitRepOf d), boostAverageTransition d' e) + * ((rotationOrbitCoeff (orbitRepOf d) d : ℤ) : ℚ) := + Finset.sum_eq_single_of_mem _ (orbitRepOf_mem_rotationSubset d hd) + (fun r hr hne => by + rcases eq_or_ne (rotationOrbitCoeff r d) 0 with h0 | h0 + · rw [h0] + push_cast + ring + · exact absurd (orbitRepOf_eq_of_rotationOrbitCoeff_ne_zero r hr d h0).symm hne) + rw [hsingle, + sum_rotationIndexSet_orbitRepOf_mul (fun d' => boostAverageTransition d' e) d, + boostAverageTransition_cycDir_right, boostAverageTransition_cycDir_right2] + ring + · have hs1 := isPairedOrDistinct_cycDir e he + have hs2 := isPairedOrDistinct_cycDir _ hs1 + have hz : (∑ r ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet r, boostAverageTransition d' e) + * ((rotationOrbitCoeff r d : ℤ) : ℚ)) = 0 := + Finset.sum_eq_zero fun r hr => by + rw [rotationOrbitCoeff_eq_zero + (isPairedOrDistinct_of_mem_rotationSubset r hr) hd] + push_cast + ring + rw [hz, boostAverageTransition_eq_zero_of_not_isPairedOrDistinct he hd, + boostAverageTransition_eq_zero_of_not_isPairedOrDistinct hs1 hd, + boostAverageTransition_eq_zero_of_not_isPairedOrDistinct hs2 hd] + norm_num + +/-- **Orbit-sum expansions in components**: a combination of orbit sums over the + representatives, expanded into the generators through the orbit indicator. -/ +lemma sum_rotationSubset_smul_rotationOrbitSum (b : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : + ∑ d ∈ rotationSubset, b d • rotationOrbitSum (T := T) d + = ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ d ∈ rotationSubset, b d * ((rotationOrbitCoeff d e : ℤ) : ℂ)) • T e := by + calc ∑ d ∈ rotationSubset, b d • rotationOrbitSum (T := T) d + = ∑ d ∈ rotationSubset, ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (b d * ((rotationOrbitCoeff d e : ℤ) : ℂ)) • T e := by + refine Finset.sum_congr rfl fun d _ => ?_ + rw [rotationOrbitSum] + simp [rotationOrbitCoeff, apply_ite (fun n : ℤ => (n : ℂ)), mul_add, add_smul, + mul_ite, ite_smul, Finset.sum_add_distrib, Finset.sum_ite_eq', smul_add] + _ = _ := by + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun e _ => (Finset.sum_smul).symm + +include hT in +/-- **One averaged round at orbit level**: an element of weight zero along all three + axes expanded over the orbit sums of the representatives re-expands through the + row-orbit sums of the boost average — the matrix of the boost average acting on the + orbit-sum span. -/ +lemma eq_sum_boostAverageTransition_of_mem_rotationSubset {x : B} + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) + (hx : x = ∑ d ∈ rotationSubset, c d • rotationOrbitSum (T := T) d) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d ∈ rotationSubset, (∑ e ∈ rotationSubset, + ((∑ d' ∈ rotationIndexSet d, boostAverageTransition d' e : ℚ) : ℂ) * c e) + • rotationOrbitSum (T := T) d := by + have hxT := hx.trans (sum_rotationSubset_smul_rotationOrbitSum (T := T) c) + have hround := hT.eq_sum_boostAverageTransition_smul _ hxT hw + rw [hround, sum_rotationSubset_smul_rotationOrbitSum (T := T)] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + calc ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, ((boostAverageTransition d e : ℚ) : ℂ) + * (∑ r ∈ rotationSubset, c r * ((rotationOrbitCoeff r e : ℤ) : ℂ)) + = ∑ r ∈ rotationSubset, c r * ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + ((boostAverageTransition d e : ℚ) : ℂ) * ((rotationOrbitCoeff r e : ℤ) : ℂ) := by + simp only [Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun e _ => ?_ + ring + _ = ∑ r ∈ rotationSubset, c r + * ((boostAverageTransition d r + boostAverageTransition d (fun s => cycDir (r s)) + + boostAverageTransition d (fun s => cycDir (cycDir (r s))) : ℚ) : ℂ) := by + refine Finset.sum_congr rfl fun r _ => ?_ + congr 1 + push_cast + simp [rotationOrbitCoeff, apply_ite (fun n : ℤ => (n : ℂ)), mul_add, mul_ite, + Finset.sum_add_distrib, Finset.sum_ite_eq'] + _ = ∑ r ∈ rotationSubset, c r * ((∑ ρ ∈ rotationSubset, + (∑ d' ∈ rotationIndexSet ρ, boostAverageTransition d' r) + * ((rotationOrbitCoeff ρ d : ℤ) : ℚ) : ℚ) : ℂ) := by + refine Finset.sum_congr rfl fun r hr => ?_ + rw [boostAverageTransition_orbit_eq r + (isPairedOrDistinct_of_mem_rotationSubset r hr) d] + _ = _ := by + push_cast + simp only [Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun r _ => ?_ + rw [Finset.sum_mul] + refine Finset.sum_congr rfl fun e _ => ?_ + ring + +/-! + +### The boost average as an integer `22 × 22` matrix + +The representatives are enumerated by `Fin 22`, and the row-orbit sums of the boost +average, scaled by `48`, form an integer matrix defined directly from the integer +mirrors — the matrix of the boost average acting on the orbit-sum span. + +-/ + +/-- The enumeration of the `22` canonical orbit representatives, in the order of + `rotationSubset`. -/ +def orbitRep : Fin 22 → Fin 4 → Fin 1 ⊕ Fin 3 := + ![![Sum.inl 0, Sum.inl 0, Sum.inl 0, Sum.inl 0], + ![Sum.inl 0, Sum.inl 0, Sum.inr 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inl 0, Sum.inr 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 0, Sum.inl 0], + ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2], + ![Sum.inl 0, Sum.inr 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inl 0, Sum.inl 0, Sum.inr 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 0, Sum.inl 0], + ![Sum.inr 0, Sum.inl 0, Sum.inr 1, Sum.inr 2], + ![Sum.inr 0, Sum.inl 0, Sum.inr 2, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inl 0, Sum.inl 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 0, Sum.inr 0], + ![Sum.inr 0, Sum.inr 0, Sum.inr 1, Sum.inr 1], + ![Sum.inr 0, Sum.inr 0, Sum.inr 2, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inl 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 1, Sum.inr 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 1, Sum.inr 1, Sum.inr 0], + ![Sum.inr 0, Sum.inr 1, Sum.inr 2, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inl 0, Sum.inr 1], + ![Sum.inr 0, Sum.inr 2, Sum.inr 0, Sum.inr 2], + ![Sum.inr 0, Sum.inr 2, Sum.inr 1, Sum.inl 0], + ![Sum.inr 0, Sum.inr 2, Sum.inr 2, Sum.inr 0]] + +/-- The enumeration of the representatives is injective. -/ +lemma orbitRep_injective : Function.Injective orbitRep := by + decide +kernel + +/-- The set of representatives is the image of the enumeration. -/ +lemma rotationSubset_eq_image : + rotationSubset = Finset.univ.image orbitRep := by + decide +kernel + +/-- Sums over the representatives reindexed through the enumeration. -/ +lemma sum_rotationSubset {β : Type*} [AddCommMonoid β] + (f : (Fin 4 → Fin 1 ⊕ Fin 3) → β) : + ∑ d ∈ rotationSubset, f d = ∑ k : Fin 22, f (orbitRep k) := by + rw [rotationSubset_eq_image, Finset.sum_image fun k _ k' _ h => orbitRep_injective h] + +/-- Integer mirror of the weight-zero transition: sixteen times its value. -/ +def weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvZ i (e s) (c s) * lightConeCoeffZ i (c s) (d s) + +/-- The integer mirror casts to sixteen times the weight-zero transition. -/ +lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + ((weightZeroTransitionZ i d e : ℤ) : ℚ) = 16 * weightZeroTransition i d e := by + rw [weightZeroTransitionZ, weightZeroTransition] + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + calc ∏ s, ((lightConeCoeffInvZ i (e s) (c s) : ℤ) : ℚ) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) + = ∏ s, 2 * (lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ)) := by + refine Finset.prod_congr rfl fun s _ => ?_ + rw [coe_lightConeCoeffInvZ] + ring + _ = 16 * ∏ s, lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) := by + rw [Finset.prod_mul_distrib, Finset.prod_const] + norm_num [Finset.card_univ] + +/-- **The boost average on the orbit-sum span, as an integer matrix**: `48` times the + row-orbit sums of the boost average between representatives. -/ +def boostAverageOrbitZ : Matrix (Fin 22) (Fin 22) ℤ := + Matrix.of fun k l => ∑ d' ∈ rotationIndexSet (orbitRep k), + ∑ i : Fin 3, weightZeroTransitionZ i d' (orbitRep l) + +/-- The integer matrix casts to `48` times the row-orbit sums of the boost average. -/ +lemma coe_boostAverageOrbitZ (k l : Fin 22) : + ((boostAverageOrbitZ k l : ℤ) : ℚ) + = 48 * ∑ d' ∈ rotationIndexSet (orbitRep k), + boostAverageTransition d' (orbitRep l) := by + simp only [boostAverageOrbitZ, Matrix.of_apply] + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun d' _ => ?_ + calc ∑ i : Fin 3, ((weightZeroTransitionZ i d' (orbitRep l) : ℤ) : ℚ) + = ∑ i : Fin 3, 16 * weightZeroTransition i d' (orbitRep l) := + Finset.sum_congr rfl fun i _ => coe_weightZeroTransitionZ i d' (orbitRep l) + _ = 48 * boostAverageTransition d' (orbitRep l) := by + simp only [boostAverageTransition, Matrix.of_apply] + rw [← Finset.mul_sum] + ring + + +include hT in +/-- **One averaged round at orbit level, integer form**: over the enumerated + representatives, an averaged round acts by the integer matrix `boostAverageOrbitZ` + with the overall `48⁻¹` normalisation. -/ +lemma eq_sum_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ k, ((48 : ℂ)⁻¹ * ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + have hcS_rep : ∀ k : Fin 22, + (∑ k' : Fin 22, if orbitRep k' = orbitRep k then c k' else 0) = c k := by + intro k + simp [orbitRep_injective.eq_iff] + have hxS : x = ∑ d ∈ rotationSubset, + (∑ k' : Fin 22, if orbitRep k' = d then c k' else 0) + • rotationOrbitSum (T := T) d := by + calc x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k) := hx + _ = ∑ k, (∑ k' : Fin 22, if orbitRep k' = orbitRep k then c k' else 0) + • rotationOrbitSum (T := T) (orbitRep k) := + Finset.sum_congr rfl fun k _ => by rw [hcS_rep k] + _ = _ := (sum_rotationSubset (fun d => (∑ k' : Fin 22, + if orbitRep k' = d then c k' else 0) • rotationOrbitSum (T := T) d)).symm + have hR := hT.eq_sum_boostAverageTransition_of_mem_rotationSubset _ hxS hw + rw [hR, sum_rotationSubset] + refine Finset.sum_congr rfl fun k _ => ?_ + congr 1 + rw [sum_rotationSubset (fun e => ((∑ d' ∈ rotationIndexSet (orbitRep k), + boostAverageTransition d' e : ℚ) : ℂ) + * ∑ k' : Fin 22, if orbitRep k' = e then c k' else 0)] + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hcS_rep l] + have hb := congrArg (fun q : ℚ => (q : ℂ)) (coe_boostAverageOrbitZ k l) + push_cast at hb + push_cast + rw [hb] + ring + +lemma eq_sum_boostAverageOrbitZ_smul' {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ k, ((48 : ℂ)⁻¹ * ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + +/-! + +### X. Eigenvectors of the boost average on the orbit-sum span + +On the span of the orbit sums of the paired-or-distinct components the boost average +acts with rational spectrum: eigenvalue `1` (dimension `4` — the invariant +contractions), `2/3` (dimension `6`), `1/3` (dimension `9`), `0` (dimension `1`), and a +two-dimensional block with characteristic polynomial `12λ² - 11λ + 1`. We list integer +coefficient vectors for each block; together they span the orbit-sum span, and every +block except `1` is annihilated by the certificate polynomial +`q(λ) = λ(3λ-2)(3λ-1)(12λ²-11λ+1)/4`. + +-/ + +/-! + +## G. The invariant contractions + +-/ + +def test : Matrix (Fin 22) (Fin 22) ℚ := Matrix.of fun i j => if i = j then 1 else 0 + + +/-- The Minkowski sign of a coordinate direction: `+1` on the time direction and `-1` on + the spatial directions. -/ +def minkSign : Fin 1 ⊕ Fin 3 → ℂ := Sum.elim (fun _ => 1) (fun _ => -1) + +/-- The enumeration `t, x, y, z` of the coordinate directions. -/ +def coordIdx : Fin 4 → Fin 1 ⊕ Fin 3 := ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2] + +/-- **The Levi-Civita sign of an index vector**: the determinant of its indicator matrix + against the coordinate enumeration — zero unless the four indices are a permutation of + the coordinates, and the sign of that permutation otherwise. -/ +def epsSign (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + (Matrix.of fun s t : Fin 4 => if d s = coordIdx t then (1 : ℤ) else 0).det + +/-- **The outer double contraction** `η^{μν} η^{ρσ} T_{μνρσ}`. -/ +noncomputable def contractionOuter : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, μ, ν, ν] + +/-- **The crossed double contraction** `η^{μρ} η^{νσ} T_{μνρσ}`. -/ +noncomputable def contractionCross : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, ν, μ, ν] + +/-- **The nested double contraction** `η^{μσ} η^{νρ} T_{μνρσ}`. -/ +noncomputable def contractionNested : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, ν, ν, μ] + +/-- **The Levi-Civita contraction** `ε^{μνρσ} T_{μνρσ}`: supported on the all-distinct + components. It is invariant under the connected Lorentz group, whose elements have unit + determinant. -/ +noncomputable def contractionEps : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsSign d : ℤ) : ℂ) • T d + +/-! + +## H. The final phase + +The endgame in the shape of the dimension-eight case: extract the orbit-sum coefficients +from membership in the rotational average, then let the extreme boost-weight components +along each axis vanish — `eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule` on the +concrete decomposition — and collapse the resulting relations onto the four invariant +contractions. + +-/ + +include hT in +/-- **The final collapse** (in progress): an element of the rotational average of the + paired-or-distinct span with boost weight zero along every axis is a combination of the + three metric double contractions and the Levi-Civita contraction. -/ +theorem mem_span_contractions_of_mem_rotationSubmodule {x : B} + (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x ∈ ((ℂ ∙ contractionOuter (T := T) ⊔ ℂ ∙ contractionCross (T := T)) ⊔ + ℂ ∙ contractionNested (T := T)) ⊔ ℂ ∙ contractionEps (T := T) := by + obtain ⟨c, rfl⟩ := hT.exists_eq_sum_of_mem_rotationSubmodule hx + sorry + +end IsQuadLorentz + +end Lorentz From 713b48e186f8704006de1470584bd337f6639d84 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:24:18 +0100 Subject: [PATCH 205/254] Update IsQuadLorentz.lean --- .../HiggsBoson/AlgebraValued/IsQuadLorentz.lean | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean index 5df9497c1..04393af7a 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean @@ -1575,12 +1575,6 @@ lemma eq_sum_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) rw [hb] ring -lemma eq_sum_boostAverageOrbitZ_smul' {x : B} (c : Fin 22 → ℂ) - (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) - (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : - x = ∑ k, ((48 : ℂ)⁻¹ * ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) * c l) - • rotationOrbitSum (T := T) (orbitRep k) := by - /-! ### X. Eigenvectors of the boost average on the orbit-sum span From 30ffe6c7f2b895ede2701ec5464a40f899f4869c Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Wed, 26 Aug 2026 17:14:15 +0400 Subject: [PATCH 206/254] refactor(StandardModel): remove proof of 1st theorem and some stale API for gluons List of files removed: FieldStrength/Gluons GaugeBosons/Gluons GaugeBosons/Gluons/JetCompleteness GaugeBosons/Gluons/JetCompleteness/ColourBasis GaugeBosons/Gluons/JetCompleteness/CoordinateChange GaugeBosons/Gluons/JetCompleteness/CovariantTower GaugeBosons/Gluons/JetCompleteness/DiagonalJet GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness GaugeBosons/Gluons/JetCompleteness/FiniteHeight GaugeBosons/Gluons/JetCompleteness/GaugeAction GaugeBosons/Gluons/JetCompleteness/HighestLayer GaugeBosons/Gluons/JetCompleteness/HookBianchi GaugeBosons/Gluons/JetCompleteness/OrdinaryJets GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction GaugeBosons/Gluons/JetCompleteness/Triangular --- Physlib.lean | 1 - .../StandardModel/FieldStrength/Gluons.lean | 169 --- .../StandardModel/GaugeBosons/Gluons.lean | 394 ------ .../GaugeBosons/Gluons/JetCompleteness.lean | 173 --- .../Gluons/JetCompleteness/ColourBasis.lean | 636 ---------- .../JetCompleteness/CoordinateChange.lean | 519 -------- .../JetCompleteness/CovariantTower.lean | 750 ----------- .../Gluons/JetCompleteness/DiagonalJet.lean | 396 ------ .../JetCompleteness/FiniteCompleteness.lean | 317 ----- .../Gluons/JetCompleteness/FiniteHeight.lean | 962 -------------- .../Gluons/JetCompleteness/GaugeAction.lean | 1108 ----------------- .../Gluons/JetCompleteness/HighestLayer.lean | 451 ------- .../Gluons/JetCompleteness/HookBianchi.lean | 784 ------------ .../Gluons/JetCompleteness/OrdinaryJets.lean | 960 -------------- .../JetCompleteness/SeriesGaugeAction.lean | 385 ------ .../Gluons/JetCompleteness/Triangular.lean | 816 ------------ 16 files changed, 8821 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/FieldStrength/Gluons.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean diff --git a/Physlib.lean b/Physlib.lean index 2344563a7..67afa8cda 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -224,7 +224,6 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invari public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic diff --git a/Physlib/Particles/StandardModel/FieldStrength/Gluons.lean b/Physlib/Particles/StandardModel/FieldStrength/Gluons.lean deleted file mode 100644 index 036c14111..000000000 --- a/Physlib/Particles/StandardModel/FieldStrength/Gluons.lean +++ /dev/null @@ -1,169 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation -public import Physlib.Relativity.SL2C.Basic -/-! -# Field strength of gluons - -## i. Overview - --/ - -@[expose] public section - -namespace StandardModel - -open TensorProduct - -/-! - -## A. The gluon field strength --/ - -/-- The target vector space of the gluon field strength `G_{μν}`. It carries two - Lorentz indices, and is valued in the real vector space of `3 × 3` hermitian - matrices, corresponding to the adjoint of `SU(3)`. -/ -@[ext] -structure GluonFieldStrength where - /-- The two Lorentz indices together with the adjoint (hermitian-matrix) colour - factor. -/ - val : Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) - -namespace GluonFieldStrength - -/-! - -## B. Linear structure --/ - -def valEquiv : GluonFieldStrength ≃ Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where - toFun := val - invFun := fun m => ⟨m⟩ - -noncomputable instance : AddCommGroup GluonFieldStrength := Equiv.addCommGroup valEquiv - -noncomputable instance : Module ℝ GluonFieldStrength := Equiv.module ℝ valEquiv - -/-- The linear identification with the underlying tensor product. -/ -def valLinEquiv : GluonFieldStrength ≃ₗ[ℝ] - Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where - toFun := val - invFun := fun m => ⟨m⟩ - map_add' := by intros; rfl - map_smul' := by intros; rfl - -@[simp] -lemma valLinEquiv_apply (d : GluonFieldStrength) : valLinEquiv d = d.val := rfl - -lemma valLinEquiv_symm_apply - (m : Lorentz.Vector ⊗[ℝ] Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : - valLinEquiv.symm m = ⟨m⟩ := rfl - -@[simp] -lemma val_add (d₁ d₂ : GluonFieldStrength) : (d₁ + d₂).val = d₁.val + d₂.val := rfl - -@[simp] -lemma val_smul (r : ℝ) (d : GluonFieldStrength) : (r • d).val = r • d.val := rfl - - -/-! - -## C. Lorentz action - -The Lorentz group acts on the right-handed Weyl factor and leaves the colour index fixed. --/ - -open Matrix MatrixGroups - -/-- The action of an element of `SL(2,ℂ)` on the gluon field strength: the vector - action, through the covering map `SL(2,ℂ) →* LorentzGroup 3`, on the two Lorentz - indices, and the trivial action on the colour (adjoint) factor. -/ -noncomputable def repLorentzGroupAux (Λ : SL(2,ℂ)) : - GluonFieldStrength →ₗ[ℝ] GluonFieldStrength := - valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map - (TensorProduct.map (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ)) - (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ))) - (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) Λ) ∘ₗ - valLinEquiv.toLinearMap - -/-- The Lorentz representation on the gluon field strength: the action on the two - Lorentz indices, trivial on the colour (adjoint) factor. -/ -noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) GluonFieldStrength where - toFun := repLorentzGroupAux - map_one' := by - ext F - simp [repLorentzGroupAux, Module.End.one_eq_id] - map_mul' Λ₁ Λ₂ := by - ext1 F - simp [repLorentzGroupAux, TensorProduct.map_map, TensorProduct.map_comp, - Module.End.mul_eq_comp, map_mul] - -/-! - -## D. Gauge action - -The gluon field strength transforms in the adjoint representation of the gauge group: -the `SU(3)` component acts on the colour factor by conjugation `A ↦ u * A * uᴴ`, while -the `SU(2)` and `U(1)` components act trivially, as do the two Lorentz indices. --/ - -/-- The adjoint action of an element of `SU(3)` on the real vector space of `3 × 3` - hermitian matrices, `A ↦ u * A * uᴴ`. -/ -@[simps!] -noncomputable def adjointAction (u : specialUnitaryGroup (Fin 3) ℂ) : - selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) →ₗ[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where - toFun A := ⟨u.1 * A.1 * (u.1)ᴴ, - by - noncomm_ring [selfAdjoint.mem_iff, star_eq_conjTranspose, - conjTranspose_mul, conjTranspose_conjTranspose, - (star_eq_conjTranspose A.1).symm.trans <| selfAdjoint.mem_iff.mp A.2]⟩ - map_add' A B := by - simp only [AddSubgroup.coe_add, AddMemClass.mk_add_mk, Subtype.mk.injEq] - noncomm_ring - map_smul' r A := by - noncomm_ring [selfAdjoint.val_smul, Algebra.mul_smul_comm, Algebra.smul_mul_assoc, - RingHom.id_apply] - -@[simp] -lemma adjointAction_one : adjointAction 1 = LinearMap.id := by - refine LinearMap.ext fun A => Subtype.ext ?_ - simp [adjointAction] - -lemma adjointAction_mul (u₁ u₂ : specialUnitaryGroup (Fin 3) ℂ) : - adjointAction (u₁ * u₂) = adjointAction u₁ ∘ₗ adjointAction u₂ := by - refine LinearMap.ext fun A => Subtype.ext ?_ - simp [adjointAction, conjTranspose_mul, mul_assoc] - -/-- The action of an element of the gauge group on the gluon field strength: the - adjoint action of the `SU(3)` component on the colour factor, trivial on the two - Lorentz indices. -/ -noncomputable def repGaugeGroupIAux (g : GaugeGroupI) : - GluonFieldStrength →ₗ[ℝ] GluonFieldStrength := - valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map LinearMap.id (adjointAction g.toSU3) ∘ₗ - valLinEquiv.toLinearMap - -/-- The adjoint action of the unquotiented Standard Model gauge group on the gluon - field strength. -/ -noncomputable def repGaugeGroupI : Representation ℝ GaugeGroupI GluonFieldStrength where - toFun := repGaugeGroupIAux - map_one' := by - ext F - simp [repGaugeGroupIAux] - map_mul' g₁ g₂ := by - ext1 F - simp [repGaugeGroupIAux, map_mul, adjointAction_mul, TensorProduct.map_map, - Module.End.mul_eq_comp] - -end GluonFieldStrength - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean deleted file mode 100644 index 55df1269f..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons.lean +++ /dev/null @@ -1,394 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation -public import Physlib.Relativity.SL2C.Basic -/-! -# Gluons - --/ - -@[expose] public section - -namespace StandardModel - -open TensorProduct - -/-! - -## A. The gluon field --/ - -/-- The target vector space of the gluon field strength `G_{μ}`. It carries one - Lorentz index, and is valued in the real vector space of `3 × 3` hermitian - matrices, corresponding to the adjoint of `SU(3)`. -/ -@[ext] -structure Gluon where - /-- The Lorentz index together with the adjoint (hermitian-matrix) colour - factor. -/ - val : Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) - -namespace Gluon - -/-! - -## B. Linear structure --/ - -def valEquiv : Gluon ≃ Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where - toFun := val - invFun := fun m => ⟨m⟩ - -noncomputable instance : AddCommGroup Gluon := Equiv.addCommGroup valEquiv - -noncomputable instance : Module ℝ Gluon := Equiv.module ℝ valEquiv - -/-- The linear identification with the underlying tensor product. -/ -def valLinEquiv : Gluon ≃ₗ[ℝ] - Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where - toFun := val - invFun := fun m => ⟨m⟩ - map_add' := by intros; rfl - map_smul' := by intros; rfl - -@[simp] -lemma valLinEquiv_apply (d : Gluon) : valLinEquiv d = d.val := rfl - -lemma valLinEquiv_symm_apply - (m : Lorentz.Vector ⊗[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : - valLinEquiv.symm m = ⟨m⟩ := rfl - -@[simp] -lemma val_add (d₁ d₂ : Gluon) : (d₁ + d₂).val = d₁.val + d₂.val := rfl - -@[simp] -lemma val_smul (r : ℝ) (d : Gluon) : (r • d).val = r • d.val := rfl - - -/-! - -## C. Lorentz action - -The Lorentz group acts on the Lorentz index and leaves the colour index fixed. --/ - -open Matrix MatrixGroups - -/-- The Lorentz representation on the gluon field: the action on the Lorentz - index, trivial on the colour (adjoint) factor. -/ -noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) Gluon where - toFun Λ := valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map (Lorentz.Vector.rep (Lorentz.SL2C.toLorentzGroup Λ)) - (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) Λ) ∘ₗ - valLinEquiv.toLinearMap - map_one' := by - ext F - simp [Module.End.one_eq_id] - map_mul' Λ₁ Λ₂ := by - ext1 F - simp [TensorProduct.map_map, - Module.End.mul_eq_comp, map_mul] - -/-! - -## D. Gauge action - -The gluon field transforms in the adjoint representation of the gauge group: -the `SU(3)` component acts on the colour factor by conjugation `A ↦ u * A * uᴴ`, while -the `SU(2)` and `U(1)` components act trivially, as does the Lorentz index. --/ - -/-- The adjoint action of an element of `SU(3)` on the real vector space of `3 × 3` - hermitian matrices, `A ↦ u * A * uᴴ`. -/ -@[simps!] -noncomputable def adjointAction (u : specialUnitaryGroup (Fin 3) ℂ) : - selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) →ₗ[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) where - toFun A := ⟨u.1 * A.1 * (u.1)ᴴ, - by - noncomm_ring [selfAdjoint.mem_iff, star_eq_conjTranspose, - conjTranspose_mul, conjTranspose_conjTranspose, - (star_eq_conjTranspose A.1).symm.trans <| selfAdjoint.mem_iff.mp A.2]⟩ - map_add' A B := by - simp only [AddSubgroup.coe_add, AddMemClass.mk_add_mk, Subtype.mk.injEq] - noncomm_ring - map_smul' r A := by - noncomm_ring [selfAdjoint.val_smul, Algebra.mul_smul_comm, Algebra.smul_mul_assoc, - RingHom.id_apply] - -@[simp] -lemma adjointAction_one : adjointAction 1 = LinearMap.id := by - refine LinearMap.ext fun A => Subtype.ext ?_ - simp [adjointAction] - -lemma adjointAction_mul (u₁ u₂ : specialUnitaryGroup (Fin 3) ℂ) : - adjointAction (u₁ * u₂) = adjointAction u₁ ∘ₗ adjointAction u₂ := by - refine LinearMap.ext fun A => Subtype.ext ?_ - simp [adjointAction, conjTranspose_mul, mul_assoc] - -/-- The adjoint action of the unquotiented Standard Model gauge group on the gluon - field. -/ -noncomputable def repGaugeGroupI : Representation ℝ GaugeGroupI Gluon where - toFun g := valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map LinearMap.id (adjointAction g.toSU3) ∘ₗ - valLinEquiv.toLinearMap - map_one' := by - ext F - simp - map_mul' g₁ g₂ := by - ext1 F - simp [map_mul, adjointAction_mul, TensorProduct.map_map, - Module.End.mul_eq_comp] - -/-! - -## E. Local gauge action through jets - -A local gauge transformation acts on the gluon field through its first-order jet: -`G ↦ u G u† + i (∂_μ U)(0) u†`, where `u` is the value of the jet `U` at the base -point. The inhomogeneous Maurer–Cartan term `i (∂_μ U)(0) u†` is hermitian by -unitarity of `U`, and satisfies a cocycle identity by the Leibniz rule; together -these make the assignment an action. The action is affine rather than linear, so it -is realised as a `MulAction` of the jet gauge group `JetGaugeGroupI` on `Gluon` -rather than as a `Representation`. The `SU(2)` and `U(1)` jets act trivially, and -the jets of constant gauge transformations recover the adjoint representation -`repGaugeGroupI`. - --/ - -open MvPowerSeries JetRing - -/-- The matrix of first-order Taylor coefficients, in the spacetime direction `μ`, - of a matrix of jets. -/ -noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) ℂ := - A.map (coeff (Finsupp.single μ 1)) - -/-- The value at the base point of a matrix of jets: the entrywise constant - coefficient. -/ -noncomputable def jetValue (A : Matrix (Fin 3) (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) ℂ := - A.map constantCoeff - -@[simp] -lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : - jetDeriv μ (1 : Matrix (Fin 3) (Fin 3) JetRing) = 0 := by - ext i j - by_cases h : i = j <;> - simp [jetDeriv, Matrix.map_apply, h, coeff_one, Finsupp.single_eq_zero] - -/-- The Leibniz rule for the first-order Taylor coefficients of a matrix of jets. -/ -lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (A B : Matrix (Fin 3) (Fin 3) JetRing) : - jetDeriv μ (A * B) = jetDeriv μ A * jetValue B + jetValue A * jetDeriv μ B := by - ext i j - simp [jetDeriv, jetValue, Matrix.mul_apply, Matrix.map_apply, Matrix.add_apply, - coeff_single_one_mul, Finset.sum_add_distrib] - -lemma jetDeriv_star (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : - jetDeriv μ (star A) = star (jetDeriv μ A) := by - ext i j - simp [jetDeriv, Matrix.map_apply, Matrix.star_apply] - -/-- The first-order Taylor coefficients of a constant jet vanish. -/ -@[simp] -lemma jetDeriv_map_C (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) ℂ) : - jetDeriv μ (A.map (C : ℂ →+* JetRing)) = 0 := by - ext i j - simp [jetDeriv, Matrix.map_apply, coeff_C, Finsupp.single_eq_zero] - -@[simp] -lemma jetValue_one : jetValue (1 : Matrix (Fin 3) (Fin 3) JetRing) = 1 := - Matrix.map_one _ (map_zero _) (map_one _) - -lemma jetValue_mul (A B : Matrix (Fin 3) (Fin 3) JetRing) : - jetValue (A * B) = jetValue A * jetValue B := - Matrix.map_mul - -lemma jetValue_star (A : Matrix (Fin 3) (Fin 3) JetRing) : - jetValue (star A) = star (jetValue A) := by - simpa [jetValue, RingHom.mapMatrix_apply] using - JetRing.mapMatrix_constantCoeff_star A - -/-- The unitarity of a jet of a special-unitary gauge transformation, as a matrix - identity over the jet ring. -/ -lemma coe_mul_star_self (U : specialUnitaryGroup (Fin 3) JetRing) : - (U : Matrix (Fin 3) (Fin 3) JetRing) * star (U : Matrix (Fin 3) (Fin 3) JetRing) = 1 := - mem_unitaryGroup_iff.mp (mem_specialUnitaryGroup_iff.mp U.2).1 - -/-- The value at the base point of a jet of a special-unitary gauge transformation - is unitary. -/ -lemma jetValue_mul_star_self (U : specialUnitaryGroup (Fin 3) JetRing) : - jetValue U.1 * star (jetValue U.1) = 1 := by - have h := congrArg jetValue (coe_mul_star_self U) - rwa [jetValue_mul, jetValue_star, jetValue_one] at h - -/-- The value at the base point of a jet of a special-unitary gauge transformation, - as computed by `JetGaugeGroupI.evalSU`. -/ -lemma evalSU_coe (U : specialUnitaryGroup (Fin 3) JetRing) : - (JetGaugeGroupI.evalSU (Fin 3) U : Matrix (Fin 3) (Fin 3) ℂ) = jetValue U.1 := rfl - -/-! - -### E.1. The Maurer–Cartan term - --/ - -/-- The Maurer–Cartan matrix of a matrix of jets in the spacetime direction `μ`: - `i (∂_μ A)(0) * (A(0))†`. For a unitary jet this matrix is hermitian; see - `mcMatrix_mem_selfAdjoint`. -/ -noncomputable def mcMatrix (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) ℂ := - Complex.I • (jetDeriv μ A * star (jetValue A)) - -/-- The Maurer–Cartan matrix of a unitary jet is hermitian: differentiating - `A * A† = 1` shows `(∂_μ A)(0) * (A(0))†` is anti-hermitian, and multiplication - by `i` makes it hermitian. -/ -lemma mcMatrix_mem_selfAdjoint {A : Matrix (Fin 3) (Fin 3) JetRing} - (hA : A * star A = 1) (μ : Fin 1 ⊕ Fin 3) : - mcMatrix μ A ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := by - have h := congrArg (jetDeriv μ) hA - rw [jetDeriv_mul, jetDeriv_star, jetDeriv_one, jetValue_star] at h - rw [selfAdjoint.mem_iff, mcMatrix, star_smul, - show star (jetDeriv μ A * star (jetValue A)) = jetValue A * star (jetDeriv μ A) by - rw [star_mul, star_star], - eq_neg_of_add_eq_zero_left h] - simp [Complex.conj_I] - -/-- The cocycle identity for the Maurer–Cartan matrix: for jets `A`, `B` with `B` - unitary at the base point, `mc(A * B) = mc(A) + A(0) mc(B) (A(0))†`. -/ -lemma mcMatrix_mul (μ : Fin 1 ⊕ Fin 3) {A B : Matrix (Fin 3) (Fin 3) JetRing} - (hB : jetValue B * star (jetValue B) = 1) : - mcMatrix μ (A * B) = mcMatrix μ A + jetValue A * mcMatrix μ B * star (jetValue A) := by - rw [mcMatrix, mcMatrix, mcMatrix, jetDeriv_mul, jetValue_mul, star_mul, add_mul, - show jetDeriv μ A * jetValue B * (star (jetValue B) * star (jetValue A)) = - jetDeriv μ A * star (jetValue A) by - rw [mul_assoc, ← mul_assoc (jetValue B), hB, one_mul], - show jetValue A * jetDeriv μ B * (star (jetValue B) * star (jetValue A)) = - jetValue A * (jetDeriv μ B * star (jetValue B)) * star (jetValue A) by - rw [mul_assoc, mul_assoc, mul_assoc], - smul_add, Matrix.mul_smul, Matrix.smul_mul] - -/-- The Maurer–Cartan coefficient of a jet of a special-unitary gauge - transformation in the spacetime direction `μ`, as a hermitian matrix. -/ -noncomputable def mcCoeff (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : - selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - ⟨mcMatrix μ U.1, mcMatrix_mem_selfAdjoint (coe_mul_star_self U) μ⟩ - -@[simp] -lemma mcCoeff_one (μ : Fin 1 ⊕ Fin 3) : mcCoeff 1 μ = 0 := by - apply Subtype.ext - simp [mcCoeff, mcMatrix] - -/-- The cocycle identity for the Maurer–Cartan coefficient. -/ -lemma mcCoeff_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : - mcCoeff (U * V) μ = - mcCoeff U μ + adjointAction (JetGaugeGroupI.evalSU (Fin 3) U) (mcCoeff V μ) := by - apply Subtype.ext - simp only [mcCoeff, AddSubgroup.coe_add, adjointAction_apply_coe, MulMemClass.coe_mul] - rw [mcMatrix_mul μ (jetValue_mul_star_self V)] - rfl - -/-- The Maurer–Cartan term of a jet of a special-unitary gauge transformation, as a - gluon: the translation part of the local gauge action, with components - `i (∂_μ U)(0) u†`. -/ -noncomputable def mcGluon (U : specialUnitaryGroup (Fin 3) JetRing) : Gluon := - ⟨∑ μ, Lorentz.Vector.basis μ ⊗ₜ[ℝ] mcCoeff U μ⟩ - -@[simp] -lemma val_zero : (0 : Gluon).val = 0 := rfl - -@[simp] -lemma mcGluon_one : mcGluon 1 = 0 := by - apply Gluon.ext - simp [mcGluon] - -/-! - -### E.2. The action - --/ - -/-- The adjoint action of an element of `SU(3)` on the gluon field, trivial on the - Lorentz index: the linear part of the local gauge action. -/ -noncomputable def adAction (u : specialUnitaryGroup (Fin 3) ℂ) : Gluon →ₗ[ℝ] Gluon := - valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map LinearMap.id (adjointAction u) ∘ₗ valLinEquiv.toLinearMap - -@[simp] -lemma adAction_one : adAction 1 = LinearMap.id := by - rw [adAction, adjointAction_one, TensorProduct.map_id] - ext F - simp - -lemma adAction_mul (u₁ u₂ : specialUnitaryGroup (Fin 3) ℂ) : - adAction (u₁ * u₂) = adAction u₁ ∘ₗ adAction u₂ := by - ext1 F - simp [adAction, adjointAction_mul, TensorProduct.map_map] - -lemma repGaugeGroupI_eq_adAction (g : GaugeGroupI) : repGaugeGroupI g = adAction g.toSU3 := rfl - -/-- The cocycle identity for the Maurer–Cartan term of the gluon. -/ -lemma mcGluon_mul (U V : specialUnitaryGroup (Fin 3) JetRing) : - mcGluon (U * V) = - mcGluon U + adAction (JetGaugeGroupI.evalSU (Fin 3) U) (mcGluon V) := by - apply Gluon.ext - simp [mcGluon, mcCoeff_mul, adAction, TensorProduct.tmul_add, Finset.sum_add_distrib, - valLinEquiv_symm_apply, map_sum] - -/-- The action of the jet gauge group on the gluon field: the value of the jet acts - through the adjoint representation on the colour factor, and the first-order part - of the jet contributes the Maurer–Cartan translation `i (∂_μ U)(0) u†`. The - action is affine rather than linear, which is why it is a `MulAction` and not a - `Representation`. The `SU(2)` and `U(1)` jets act trivially. -/ -noncomputable instance : MulAction JetGaugeGroupI Gluon where - smul U A := adAction (JetGaugeGroupI.evalSU (Fin 3) U.1) A + mcGluon U.1 - one_smul A := by - show adAction (JetGaugeGroupI.evalSU (Fin 3) (1 : JetGaugeGroupI).1) A + - mcGluon (1 : JetGaugeGroupI).1 = A - simp - mul_smul U V A := by - show adAction (JetGaugeGroupI.evalSU (Fin 3) (U * V).1) A + mcGluon (U * V).1 = - adAction (JetGaugeGroupI.evalSU (Fin 3) U.1) - (adAction (JetGaugeGroupI.evalSU (Fin 3) V.1) A + mcGluon V.1) + mcGluon U.1 - rw [Prod.fst_mul, map_mul, adAction_mul, mcGluon_mul, map_add] - simp only [LinearMap.coe_comp, Function.comp_apply] - abel - -lemma smul_def (U : JetGaugeGroupI) (A : Gluon) : - U • A = adAction (JetGaugeGroupI.evalSU (Fin 3) U.1) A + mcGluon U.1 := rfl - -/-- The jets of constant (global) gauge transformations act on the gluon through the - adjoint representation of the gauge group: the Maurer–Cartan term vanishes on - constant jets. -/ -@[simp] -lemma ofConstant_smul (g : GaugeGroupI) (A : Gluon) : - JetGaugeGroupI.ofConstant g • A = repGaugeGroupI g A := by - rw [smul_def] - have h1 : JetGaugeGroupI.evalSU (Fin 3) (JetGaugeGroupI.ofConstant g).1 = g.1 := by - apply Subtype.ext - ext i j - simp [JetGaugeGroupI.evalSU, JetGaugeGroupI.ofConstant, JetGaugeGroupI.ofConstantSU, - RingHom.mapMatrix_apply, Matrix.map_apply] - have h2 : mcGluon (JetGaugeGroupI.ofConstant g).1 = 0 := by - apply Gluon.ext - have hmc : ∀ μ, mcCoeff (JetGaugeGroupI.ofConstant g).1 μ = 0 := by - intro μ - apply Subtype.ext - show mcMatrix μ ((JetGaugeGroupI.ofConstantSU (Fin 3) g.1) : - Matrix (Fin 3) (Fin 3) JetRing) = _ - rw [show ((JetGaugeGroupI.ofConstantSU (Fin 3) g.1) : - Matrix (Fin 3) (Fin 3) JetRing) = g.1.1.map (C : ℂ →+* JetRing) from rfl] - simp [mcMatrix] - simp [mcGluon, hmc] - rw [h1, h2, add_zero, repGaugeGroupI_eq_adAction] - rfl - -end Gluon - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean deleted file mode 100644 index 75ceb8554..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness.lean +++ /dev/null @@ -1,173 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Mathematics.TensorProduct -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.FiniteHeight -/-! -# All-orders and full-group completeness - -## i. Overview - -This file removes the height bound from `FiniteHeight` and then passes from based jets -to the whole jet gauge -group. The two statements are - -```text -A fixed by based jets = C -A fixed by the full jet group = C fixed by constant SU(3) -``` - -where `A` is `OrdinaryJets`'s all-orders ordinary gluon jet algebra on the physical -traceless-hermitian -colour carrier and `C = covAlgebra` is `CovariantTower`'s subalgebra generated by the symmetrized -covariant -curvature derivatives `D^r F`. - -## ii. Removing the height bound - -No new machinery is needed. An element of a symmetric algebra is a polynomial, so its image under -`OrdinaryJets`'s `toPoly` has a finite variable set; the largest derivative degree occurring in that -set is a -height bound, which is `FiniteHeight`'s `mem_heightAlgebra_vars_sup`. -`FiniteHeight` then identifies the based -invariants of that height with the truncated covariant algebra, which sits inside `covAlgebra`. - -## iii. The full group - -The second theorem does **not** say that every element of `covAlgebra` is invariant: an -uncontracted `covCurv` component transforms covariantly, and a constant colour rotation generally -moves it. Only the globally `SU(3)`-invariant combinations are fixed by the whole jet group. The -reverse inclusion uses `CovariantTower`'s `gaugePull_eq_ofConstantSU`, which replaces the action of -an arbitrary -jet on the covariant subalgebra by the action of the constant jet of its base-point value. No -ordered product decomposition of a jet is constructed, and the contravariant composition law -`gaugePull (U * V) = gaugePull V ∘ gaugePull U` is never inverted. - -## iv. Results - -* `fixed_by_based_eq_covAlgebra` — the all-orders based fixed-algebra theorem; -* `fixed_by_jetGroup_eq_invariant_covAlgebra` — the full-group theorem. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial -open scoped TensorProduct - -namespace SU3Jet - -/-! - -## A. Removing the height bound - --/ - -/-- **All-orders based completeness.** The elements of the all-orders ordinary gluon jet algebra -fixed by every *based* `SU(3)` gauge jet are exactly the elements of the subalgebra generated by -the symmetrized covariant curvature derivatives. - -The forward direction bounds the derivative height of a single polynomial by the largest -derivative degree among its finitely many variables and applies `FiniteHeight` at that -height; the reverse -direction is `CovariantTower`'s `gaugePull_eq_self_of_based`. -/ -lemma fixed_by_based_eq_covAlgebra : - {P : JetAlgebra | ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U P = P} = - (covAlgebra : Set JetAlgebra) := by - ext P - simp only [Set.mem_setOf_eq, SetLike.mem_coe] - constructor - · intro hP - have hmem : P ∈ {Q : JetAlgebra | Q ∈ heightAlgebra ((toPoly P).vars.sup genDeg) ∧ - ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U Q = Q} := - ⟨mem_heightAlgebra_vars_sup P, hP⟩ - rw [fixed_by_based_height_eq_covAlgebraAt] at hmem - exact covAlgebraAt_le_covAlgebra _ hmem - · intro hP U hU - exact gaugePull_eq_self_of_based U hU hP - -/-! - -## B. The full jet gauge group - --/ - -/-- **The full-group theorem.** The elements of the all-orders ordinary gluon jet algebra fixed by -the *whole* `SU(3)` jet gauge group are the constant-`SU(3)`-invariant elements of the covariant -curvature algebra. - -Membership in the covariant algebra alone is not enough: an uncontracted covariant curvature -component is only covariant, and a constant colour rotation generally moves it. The reverse -inclusion works because on the covariant subalgebra an arbitrary gauge jet acts exactly as the -constant jet of its base-point value. -/ -lemma fixed_by_jetGroup_eq_invariant_covAlgebra : - {P : JetAlgebra | ∀ U : specialUnitaryGroup (Fin 3) JetRing, gaugePull U P = P} = - {P : JetAlgebra | P ∈ covAlgebra ∧ - ∀ g : specialUnitaryGroup (Fin 3) ℂ, - gaugePull (JetGaugeGroupI.ofConstantSU (Fin 3) g) P = P} := by - ext P - simp only [Set.mem_setOf_eq] - constructor - · intro hP - refine ⟨?_, fun g => hP _⟩ - have hbased : P ∈ {Q : JetAlgebra | ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U Q = Q} := fun U _ => hP U - rw [fixed_by_based_eq_covAlgebra] at hbased - exact hbased - · rintro ⟨hadj, hconst⟩ U - rw [gaugePull_eq_ofConstantSU U hadj] - exact hconst _ - -/-! - -## C. Extension by an unchanged tensor factor - -The based completeness result extends to a tensor product when the gauge pull acts only on the -gluon factor. The generic fixed-submodule result in `Physlib.Mathematics.TensorProduct` reduces -this statement to `fixed_by_based_eq_covAlgebra`, without repeating the coefficient decomposition -or the gluon elimination argument. - --/ - -/-- The tensor extension of the covariant gluon subalgebra by an arbitrary real module `C`. -/ -noncomputable def covTensor (C : Type*) [AddCommGroup C] [Module ℝ C] : - Submodule ℝ (JetAlgebra ⊗[ℝ] C) := - Submodule.map₂ (TensorProduct.mk ℝ JetAlgebra C) covAlgebra.toSubmodule ⊤ - -/-- After tensoring on the right by a free real module, the elements fixed by every based gauge -pull acting on the gluon factor are exactly the tensor extension of `covAlgebra`. -/ -lemma fixed_by_based_tensor_eq_covTensor - (C : Type*) [AddCommGroup C] [Module ℝ C] [Module.Free ℝ C] : - {z : JetAlgebra ⊗[ℝ] C | ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → - (gaugePull U).toLinearMap.rTensor C z = z} = - (covTensor C : Set (JetAlgebra ⊗[ℝ] C)) := by - classical - let BasedJet := {U : specialUnitaryGroup (Fin 3) JetRing // - JetGaugeGroupI.evalSU (Fin 3) U = 1} - let F : BasedJet → Module.End ℝ JetAlgebra := fun U => (gaugePull U.1).toLinearMap - have hbase : (⨅ U : BasedJet, LinearMap.eqLocus (F U) LinearMap.id) = - covAlgebra.toSubmodule := by - ext P - rw [Submodule.mem_iInf] - change (∀ U : BasedJet, gaugePull U.1 P = P) ↔ P ∈ covAlgebra - have hP := Set.ext_iff.mp fixed_by_based_eq_covAlgebra P - simpa only [Set.mem_setOf_eq, SetLike.mem_coe, Subtype.forall, BasedJet] using hP - have h := LinearMap.iInf_eqLocus_rTensor (C := C) F - rw [hbase] at h - ext z - have hz := SetLike.ext_iff.mp h z - simpa only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply, - Set.mem_setOf_eq, SetLike.mem_coe, Subtype.forall, BasedJet, F, covTensor] using hz - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean deleted file mode 100644 index cf79d4947..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/ColourBasis.lean +++ /dev/null @@ -1,636 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.DiagonalJet -/-! -# All eight colour directions - -## i. Overview - -This file proves that the single colour direction `H = diag(1, -1, 0)` realized by the `DiagonalJet` -diagonal jet -generates the whole physical colour carrier, and that based gauge jets therefore realize an -arbitrary traceless hermitian translation. - -Three things are produced. - -* `colourBasis` — an explicit `Basis (Fin 8) ℝ` of the traceless hermitian `3 × 3` matrices. This - is stronger than the "spanning family" alternative allowed by the proof strategy, and it is the - form later modules need: `SymmetricAlgebra.equivMvPolynomial` requires a `Basis`, so the colour - index type of the jet coordinate carrier has to come from here. -* `colourBasis_eq_adjointAction` — every basis vector is a *single* constant `SU(3)` conjugate of - `H`. No simplicity or irreducibility theory for `su(3)` is used; the six constant matrices are - written down. -* `exists_based_mcCoeff` — for every traceless hermitian `X` and every spacetime direction `μ` - there is a *based* gauge jet whose Maurer–Cartan coefficient is `X` in the direction `μ` and `0` - in every other direction. This is the translation input the layerwise elimination of - `FiniteCompleteness`, `HighestLayer` and - `FiniteHeight` consumes. - -## ii. The conjugation chain - -Only one of the six constant matrices has irrational entries, the `π/4` rotation in the `(0,1)` -block; everything else is a permutation or a diagonal phase. The chain is - -```text -H --Ad(cyc2)--> E₂ -H --Ad(u01)--> X₀₁ --Ad(d01)--> Y₀₁ -X₀₁ --Ad(cyc)--> X₀₂ --Ad(d02)--> Y₀₂ -X₀₂ --Ad(cyc)--> X₁₂ --Ad(d12)--> Y₁₂ -``` - -The eigenvalues of `H` are `1, -1, 0`, so every single conjugate of `H` has those eigenvalues; the -basis is chosen to consist of such matrices, which is why each basis vector is one conjugate rather -than a combination. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix MvPowerSeries JetRing Module - -namespace SU3Jet - -/-! - -## A. The colour carrier - -The physical colour carrier in the traceless-Hermitian convention is the real vector space of -traceless hermitian `3 × 3` matrices. - --/ - -/-- The traceless hermitian `3 × 3` matrices: the Lie algebra `su(3)`. -/ -def ColourSpace : Submodule ℝ (selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) where - carrier := {A | trace (A : Matrix (Fin 3) (Fin 3) ℂ) = 0} - add_mem' {A B} hA hB := by - simp only [Set.mem_setOf_eq, AddSubgroup.coe_add, Matrix.trace_add] at * - rw [hA, hB, add_zero] - zero_mem' := by - simp only [Set.mem_setOf_eq, ZeroMemClass.coe_zero, Matrix.trace_zero] - smul_mem' r A hA := by - simp only [Set.mem_setOf_eq, selfAdjoint.val_smul, Matrix.trace_smul] at * - rw [hA, smul_zero] - -@[simp] -lemma mem_ColourSpace {A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)} : - A ∈ ColourSpace ↔ trace (A : Matrix (Fin 3) (Fin 3) ℂ) = 0 := Iff.rfl - -/-! - -## B. The eight colour matrices - --/ - -/-- `E₁ = diag(1, -1, 0)`, the direction realized directly by the `DiagonalJet` jet. -/ -def cm0 : Matrix (Fin 3) (Fin 3) ℂ := !![1, 0, 0; 0, -1, 0; 0, 0, 0] -/-- `E₂ = diag(0, 1, -1)`. -/ -def cm1 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 0; 0, 1, 0; 0, 0, -1] -/-- `X₀₁`. -/ -def cm2 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 1, 0; 1, 0, 0; 0, 0, 0] -/-- `Y₀₁`. -/ -noncomputable def cm3 : Matrix (Fin 3) (Fin 3) ℂ := - !![0, -Complex.I, 0; Complex.I, 0, 0; 0, 0, 0] -/-- `X₀₂`. -/ -def cm4 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 1; 0, 0, 0; 1, 0, 0] -/-- `Y₀₂`. -/ -noncomputable def cm5 : Matrix (Fin 3) (Fin 3) ℂ := - !![0, 0, -Complex.I; 0, 0, 0; Complex.I, 0, 0] -/-- `X₁₂`. -/ -def cm6 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 0; 0, 0, 1; 0, 1, 0] -/-- `Y₁₂`. -/ -noncomputable def cm7 : Matrix (Fin 3) (Fin 3) ℂ := - !![0, 0, 0; 0, 0, -Complex.I; 0, Complex.I, 0] - -/-- The `DiagonalJet` colour direction is the first colour matrix. -/ -lemma colourMat_eq_cm0 : colourMat = cm0 := by - ext i j - fin_cases i <;> fin_cases j <;> simp [colourMat, cm0] - -private lemma mem_sa (M : Matrix (Fin 3) (Fin 3) ℂ) - (h : ∀ i j, (starRingEnd ℂ) (M j i) = M i j) : - M ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := by - rw [selfAdjoint.mem_iff] - ext i j - rw [Matrix.star_apply] - exact h i j - -lemma cm0_mem : cm0 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm0] -lemma cm1_mem : cm1 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm1] -lemma cm2_mem : cm2 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm2] -lemma cm3_mem : cm3 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm3] -lemma cm4_mem : cm4 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm4] -lemma cm5_mem : cm5 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm5] -lemma cm6_mem : cm6 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm6] -lemma cm7_mem : cm7 ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - mem_sa _ fun i j => by fin_cases i <;> fin_cases j <;> simp [cm7] - -/-- The eight colour directions, as hermitian matrices. -/ -noncomputable def colourVec : Fin 8 → selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - ![⟨cm0, cm0_mem⟩, ⟨cm1, cm1_mem⟩, ⟨cm2, cm2_mem⟩, ⟨cm3, cm3_mem⟩, - ⟨cm4, cm4_mem⟩, ⟨cm5, cm5_mem⟩, ⟨cm6, cm6_mem⟩, ⟨cm7, cm7_mem⟩] - -lemma colourVec_mem (k : Fin 8) : colourVec k ∈ ColourSpace := by - fin_cases k <;> - simp [colourVec, ColourSpace, cm0, cm1, cm2, cm3, cm4, cm5, cm6, cm7, - Matrix.trace_fin_three] - -/-! - -## C. Coordinates and the basis - --/ - -/-- The eight real coordinates of a hermitian matrix relative to the colour directions. -/ -noncomputable def colourCoord : - selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) →ₗ[ℝ] (Fin 8 → ℝ) where - toFun A := ![((A : Matrix (Fin 3) (Fin 3) ℂ) 0 0).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 2 2).re, - ((A : Matrix (Fin 3) (Fin 3) ℂ) 0 1).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 0 1).im, - ((A : Matrix (Fin 3) (Fin 3) ℂ) 0 2).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 0 2).im, - ((A : Matrix (Fin 3) (Fin 3) ℂ) 1 2).re, -((A : Matrix (Fin 3) (Fin 3) ℂ) 1 2).im] - map_add' A B := by - funext k - fin_cases k <;> simp [Matrix.add_apply] <;> ring - map_smul' r A := by - funext k - fin_cases k <;> - simp [selfAdjoint.val_smul, Matrix.smul_apply, Complex.real_smul, Complex.mul_re, - Complex.mul_im] - -/-- The hermitian matrix with prescribed colour coordinates. -/ -noncomputable def colourMk : (Fin 8 → ℝ) →ₗ[ℝ] selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - Fintype.linearCombination ℝ colourVec - -lemma colourMk_apply (c : Fin 8 → ℝ) : colourMk c = ∑ k, c k • colourVec k := - Fintype.linearCombination_apply _ _ c - -lemma colourMk_mem (c : Fin 8 → ℝ) : colourMk c ∈ ColourSpace := by - rw [colourMk_apply] - exact Submodule.sum_mem _ fun k _ => Submodule.smul_mem _ _ (colourVec_mem k) - -lemma colourMk_val (c : Fin 8 → ℝ) (i j : Fin 3) : - ((colourMk c : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : Matrix (Fin 3) (Fin 3) ℂ) i j = - ∑ k, (c k : ℂ) * (colourVec k : Matrix (Fin 3) (Fin 3) ℂ) i j := by - rw [colourMk_apply] - rw [show ((∑ k, c k • colourVec k : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : - Matrix (Fin 3) (Fin 3) ℂ) = ∑ k, c k • (colourVec k : Matrix (Fin 3) (Fin 3) ℂ) from by - simp [selfAdjoint.val_smul]] - rw [Matrix.sum_apply] - exact Finset.sum_congr rfl fun k _ => by - rw [Matrix.smul_apply, Complex.real_smul] - -/-- The entries of the hermitian matrix built from eight real coordinates. -/ -lemma colourMk_entries (c : Fin 8 → ℝ) : - ((colourMk c : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : Matrix (Fin 3) (Fin 3) ℂ) = - !![(c 0 : ℂ), (c 2 : ℂ) - (c 3 : ℂ) * Complex.I, (c 4 : ℂ) - (c 5 : ℂ) * Complex.I; - (c 2 : ℂ) + (c 3 : ℂ) * Complex.I, -(c 0 : ℂ) + (c 1 : ℂ), - (c 6 : ℂ) - (c 7 : ℂ) * Complex.I; - (c 4 : ℂ) + (c 5 : ℂ) * Complex.I, (c 6 : ℂ) + (c 7 : ℂ) * Complex.I, -(c 1 : ℂ)] := by - ext i j - rw [colourMk_val] - fin_cases i <;> fin_cases j <;> - simp [Fin.sum_univ_eight, colourVec, cm0, cm1, cm2, cm3, cm4, cm5, cm6, cm7] <;> ring - -lemma colourCoord_colourMk (c : Fin 8 → ℝ) : colourCoord (colourMk c) = c := by - funext k - fin_cases k <;> - simp [colourCoord, colourMk_entries] - -lemma colourMk_colourCoord {A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)} (hA : A ∈ ColourSpace) : - colourMk (colourCoord A) = A := by - have hAs : star (A : Matrix (Fin 3) (Fin 3) ℂ) = (A : Matrix (Fin 3) (Fin 3) ℂ) := - selfAdjoint.mem_iff.mp A.2 - have hentry : ∀ i j, star ((A : Matrix (Fin 3) (Fin 3) ℂ) j i) = - (A : Matrix (Fin 3) (Fin 3) ℂ) i j := by - intro i j - have h := congrArg (fun N : Matrix (Fin 3) (Fin 3) ℂ => N i j) hAs - simpa [Matrix.star_apply] using h - have hre : ∀ i j, ((A : Matrix (Fin 3) (Fin 3) ℂ) j i).re = - ((A : Matrix (Fin 3) (Fin 3) ℂ) i j).re := by - intro i j - have := congrArg Complex.re (hentry i j) - simpa using this - have him : ∀ i j, ((A : Matrix (Fin 3) (Fin 3) ℂ) j i).im = - -((A : Matrix (Fin 3) (Fin 3) ℂ) i j).im := by - intro i j - have := congrArg Complex.im (hentry i j) - simp at this - linarith - have hdiagim : ∀ i, ((A : Matrix (Fin 3) (Fin 3) ℂ) i i).im = 0 := by - intro i - have := him i i - linarith - have htrre : ((A : Matrix (Fin 3) (Fin 3) ℂ) 0 0).re + - ((A : Matrix (Fin 3) (Fin 3) ℂ) 1 1).re + ((A : Matrix (Fin 3) (Fin 3) ℂ) 2 2).re = 0 := by - have h := mem_ColourSpace.mp hA - rw [Matrix.trace_fin_three] at h - have := congrArg Complex.re h - simpa using this - apply Subtype.ext - rw [colourMk_entries] - ext i j - fin_cases i <;> fin_cases j <;> - (apply Complex.ext <;> - simp [colourCoord] <;> - linarith [hre 0 1, hre 0 2, hre 1 2, him 0 1, him 0 2, him 1 2, - hdiagim 0, hdiagim 1, hdiagim 2, htrre]) - -/-- The colour carrier is eight-dimensional, with explicit coordinates. -/ -noncomputable def colourEquiv : ColourSpace ≃ₗ[ℝ] (Fin 8 → ℝ) where - toFun A := colourCoord (A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) - invFun c := ⟨colourMk c, colourMk_mem c⟩ - map_add' A B := by simp - map_smul' r A := by simp - left_inv A := Subtype.ext (colourMk_colourCoord A.2) - right_inv c := colourCoord_colourMk c - -/-- **An explicit basis of the colour carrier.** Eight traceless hermitian matrices, with - coordinates given by the real and imaginary parts of the entries. -/ -noncomputable def colourBasis : Basis (Fin 8) ℝ ColourSpace := - Basis.ofEquivFun colourEquiv - -lemma colourBasis_apply (k : Fin 8) : - ((colourBasis k : ColourSpace) : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) = colourVec k := by - rw [colourBasis, Basis.coe_ofEquivFun] - show (colourEquiv.symm (Pi.single k 1) : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) = _ - show colourMk (Pi.single k 1) = _ - rw [colourMk, Fintype.linearCombination_apply_single, one_smul] - -/-! - -## D. The six constant gauge matrices - --/ - -/-- `1/√2`, as a complex scalar. -/ -noncomputable def rt : ℂ := ((Real.sqrt 2 / 2 : ℝ) : ℂ) - -@[simp] -lemma rt_mul_rt : rt * rt = 1 / 2 := by - have h : (Real.sqrt 2 / 2) * (Real.sqrt 2 / 2) = 1 / 2 := by - rw [show Real.sqrt 2 / 2 * (Real.sqrt 2 / 2) = Real.sqrt 2 * Real.sqrt 2 / 4 by ring, - Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 2)] - norm_num - rw [rt, ← Complex.ofReal_mul, h] - norm_num - -@[simp] -lemma star_rt : star rt = rt := by - rw [rt, Complex.star_def, Complex.conj_ofReal] - -@[simp] -lemma conj_rt : (starRingEnd ℂ) rt = rt := star_rt - -@[simp] -lemma rt_sq : rt ^ 2 = 1 / 2 := by rw [pow_two]; exact rt_mul_rt - -/-- The cyclic permutation matrix. -/ -def gcyc : Matrix (Fin 3) (Fin 3) ℂ := !![0, 1, 0; 0, 0, 1; 1, 0, 0] -/-- The square of the cyclic permutation matrix. -/ -def gcyc2 : Matrix (Fin 3) (Fin 3) ℂ := !![0, 0, 1; 1, 0, 0; 0, 1, 0] -/-- The `π/4` rotation in the `(0,1)` block: the only irrational constant needed. -/ -noncomputable def g01 : Matrix (Fin 3) (Fin 3) ℂ := !![rt, -rt, 0; rt, rt, 0; 0, 0, 1] -/-- The diagonal phase `diag(1, i, -i)`. -/ -noncomputable def d01 : Matrix (Fin 3) (Fin 3) ℂ := - !![1, 0, 0; 0, Complex.I, 0; 0, 0, -Complex.I] -/-- The diagonal phase `diag(1, -i, i)`. -/ -noncomputable def d02 : Matrix (Fin 3) (Fin 3) ℂ := - !![1, 0, 0; 0, -Complex.I, 0; 0, 0, Complex.I] -/-- The diagonal phase `diag(-i, 1, i)`. -/ -noncomputable def d12 : Matrix (Fin 3) (Fin 3) ℂ := - !![-Complex.I, 0, 0; 0, 1, 0; 0, 0, Complex.I] - -private lemma mem_su3 (M : Matrix (Fin 3) (Fin 3) ℂ) (hu : M * star M = 1) (hd : M.det = 1) : - M ∈ specialUnitaryGroup (Fin 3) ℂ := - mem_specialUnitaryGroup_iff.mpr ⟨mem_unitaryGroup_iff.mpr hu, hd⟩ - -lemma gcyc_mem : gcyc ∈ specialUnitaryGroup (Fin 3) ℂ := by - refine mem_su3 _ ?_ ?_ - · ext i j - fin_cases i <;> fin_cases j <;> - simp [gcyc, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply] - · simp [gcyc, Matrix.det_fin_three] - -lemma gcyc2_mem : gcyc2 ∈ specialUnitaryGroup (Fin 3) ℂ := by - refine mem_su3 _ ?_ ?_ - · ext i j - fin_cases i <;> fin_cases j <;> - simp [gcyc2, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply] - · simp [gcyc2, Matrix.det_fin_three] - -lemma g01_mem : g01 ∈ specialUnitaryGroup (Fin 3) ℂ := by - refine mem_su3 _ ?_ ?_ - · ext i j - fin_cases i <;> fin_cases j <;> - simp [g01, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply] <;> - all_goals ring_nf - · rw [g01, Matrix.det_fin_three] - simp; ring_nf - -lemma d01_mem : d01 ∈ specialUnitaryGroup (Fin 3) ℂ := by - refine mem_su3 _ ?_ ?_ - · ext i j - fin_cases i <;> fin_cases j <;> - simp [d01, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply, Complex.conj_I] - · simp [d01, Matrix.det_fin_three, Complex.I_mul_I] - -lemma d02_mem : d02 ∈ specialUnitaryGroup (Fin 3) ℂ := by - refine mem_su3 _ ?_ ?_ - · ext i j - fin_cases i <;> fin_cases j <;> - simp [d02, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply, Complex.conj_I] - · simp [d02, Matrix.det_fin_three, Complex.I_mul_I] - -lemma d12_mem : d12 ∈ specialUnitaryGroup (Fin 3) ℂ := by - refine mem_su3 _ ?_ ?_ - · ext i j - fin_cases i <;> fin_cases j <;> - simp [d12, Matrix.mul_apply, Fin.sum_univ_three, Matrix.star_apply, Complex.conj_I] - · simp [d12, Matrix.det_fin_three, Complex.I_mul_I] - -/-- The six constant gauge matrices as elements of `SU(3)`. -/ -noncomputable def ucyc : specialUnitaryGroup (Fin 3) ℂ := ⟨gcyc, gcyc_mem⟩ -/-- `cyc²` as an element of `SU(3)`. -/ -noncomputable def ucyc2 : specialUnitaryGroup (Fin 3) ℂ := ⟨gcyc2, gcyc2_mem⟩ -/-- The `π/4` rotation as an element of `SU(3)`. -/ -noncomputable def u01 : specialUnitaryGroup (Fin 3) ℂ := ⟨g01, g01_mem⟩ -/-- `diag(1, i, -i)` as an element of `SU(3)`. -/ -noncomputable def p01 : specialUnitaryGroup (Fin 3) ℂ := ⟨d01, d01_mem⟩ -/-- `diag(1, -i, i)` as an element of `SU(3)`. -/ -noncomputable def p02 : specialUnitaryGroup (Fin 3) ℂ := ⟨d02, d02_mem⟩ -/-- `diag(-i, 1, i)` as an element of `SU(3)`. -/ -noncomputable def p12 : specialUnitaryGroup (Fin 3) ℂ := ⟨d12, d12_mem⟩ - -/-! - -## E. The conjugation chain - --/ - -private lemma conj_eq (u : specialUnitaryGroup (Fin 3) ℂ) - (A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) (B : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) - (h : (u : Matrix (Fin 3) (Fin 3) ℂ) * (A : Matrix (Fin 3) (Fin 3) ℂ) * - ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ = (B : Matrix (Fin 3) (Fin 3) ℂ)) : - Gluon.adjointAction u A = B := - Subtype.ext (by rw [Gluon.adjointAction_apply_coe]; exact h) - -lemma adjointAction_ucyc2_cm0 : - Gluon.adjointAction ucyc2 ⟨cm0, cm0_mem⟩ = ⟨cm1, cm1_mem⟩ := by - refine conj_eq _ _ _ ?_ - ext i j - fin_cases i <;> fin_cases j <;> - simp [ucyc2, gcyc2, cm0, cm1, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.conjTranspose_apply] - -lemma adjointAction_u01_cm0 : - Gluon.adjointAction u01 ⟨cm0, cm0_mem⟩ = ⟨cm2, cm2_mem⟩ := by - refine conj_eq _ _ _ ?_ - ext i j - fin_cases i <;> fin_cases j <;> - simp [u01, g01, cm0, cm2, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.conjTranspose_apply] <;> - all_goals ring_nf - -lemma adjointAction_p01_cm2 : - Gluon.adjointAction p01 ⟨cm2, cm2_mem⟩ = ⟨cm3, cm3_mem⟩ := by - refine conj_eq _ _ _ ?_ - ext i j - fin_cases i <;> fin_cases j <;> - simp [p01, d01, cm2, cm3, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.conjTranspose_apply, Complex.conj_I] - -lemma adjointAction_ucyc_cm2 : - Gluon.adjointAction ucyc ⟨cm2, cm2_mem⟩ = ⟨cm4, cm4_mem⟩ := by - refine conj_eq _ _ _ ?_ - ext i j - fin_cases i <;> fin_cases j <;> - simp [ucyc, gcyc, cm2, cm4, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.conjTranspose_apply] - -lemma adjointAction_p02_cm4 : - Gluon.adjointAction p02 ⟨cm4, cm4_mem⟩ = ⟨cm5, cm5_mem⟩ := by - refine conj_eq _ _ _ ?_ - ext i j - fin_cases i <;> fin_cases j <;> - simp [p02, d02, cm4, cm5, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.conjTranspose_apply, Complex.conj_I] - -lemma adjointAction_ucyc_cm4 : - Gluon.adjointAction ucyc ⟨cm4, cm4_mem⟩ = ⟨cm6, cm6_mem⟩ := by - refine conj_eq _ _ _ ?_ - ext i j - fin_cases i <;> fin_cases j <;> - simp [ucyc, gcyc, cm4, cm6, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.conjTranspose_apply] - -lemma adjointAction_p12_cm6 : - Gluon.adjointAction p12 ⟨cm6, cm6_mem⟩ = ⟨cm7, cm7_mem⟩ := by - refine conj_eq _ _ _ ?_ - ext i j - fin_cases i <;> fin_cases j <;> - simp [p12, d12, cm6, cm7, Matrix.mul_apply, Fin.sum_univ_three, - Matrix.conjTranspose_apply, Complex.conj_I] - -/-- The constant `SU(3)` element carrying `H = diag(1, -1, 0)` to the `k`-th colour direction. -/ -noncomputable def colourConj : Fin 8 → specialUnitaryGroup (Fin 3) ℂ := - ![1, ucyc2, u01, p01 * u01, ucyc * u01, p02 * (ucyc * u01), - ucyc * (ucyc * u01), p12 * (ucyc * (ucyc * u01))] - -/-- **Every colour direction is a single constant conjugate of the `DiagonalJet` direction.** No - simplicity - or irreducibility theory for `su(3)` is used: the six constant matrices are explicit. -/ -lemma colourBasis_eq_adjointAction (k : Fin 8) : - Gluon.adjointAction (colourConj k) colourH = - ((colourBasis k : ColourSpace) : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) := by - have hH : (colourH : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) = ⟨cm0, cm0_mem⟩ := - Subtype.ext colourMat_eq_cm0 - have hmul : ∀ (u v : specialUnitaryGroup (Fin 3) ℂ) - (A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)), - Gluon.adjointAction (u * v) A = Gluon.adjointAction u (Gluon.adjointAction v A) := by - intro u v A - rw [Gluon.adjointAction_mul] - rfl - simp only [colourBasis_apply] - fin_cases k - · show Gluon.adjointAction 1 colourH = colourVec 0 - rw [hH, Gluon.adjointAction_one] - rfl - · show Gluon.adjointAction ucyc2 colourH = colourVec 1 - rw [hH] - exact adjointAction_ucyc2_cm0 - · show Gluon.adjointAction u01 colourH = colourVec 2 - rw [hH] - exact adjointAction_u01_cm0 - · show Gluon.adjointAction (p01 * u01) colourH = colourVec 3 - rw [hH, hmul, adjointAction_u01_cm0] - exact adjointAction_p01_cm2 - · show Gluon.adjointAction (ucyc * u01) colourH = colourVec 4 - rw [hH, hmul, adjointAction_u01_cm0] - exact adjointAction_ucyc_cm2 - · show Gluon.adjointAction (p02 * (ucyc * u01)) colourH = colourVec 5 - rw [hH, hmul, hmul, adjointAction_u01_cm0, adjointAction_ucyc_cm2] - exact adjointAction_p02_cm4 - · show Gluon.adjointAction (ucyc * (ucyc * u01)) colourH = colourVec 6 - rw [hH, hmul, hmul, adjointAction_u01_cm0, adjointAction_ucyc_cm2] - exact adjointAction_ucyc_cm4 - · show Gluon.adjointAction (p12 * (ucyc * (ucyc * u01))) colourH = colourVec 7 - rw [hH, hmul, hmul, hmul, adjointAction_u01_cm0, adjointAction_ucyc_cm2, - adjointAction_ucyc_cm4] - exact adjointAction_p12_cm6 - -/-- The conjugate of the `DiagonalJet` colour direction by a constant gauge transformation is - traceless - hermitian. -/ -lemma adjointAction_colourH_mem (u : specialUnitaryGroup (Fin 3) ℂ) : - Gluon.adjointAction u colourH ∈ ColourSpace := by - have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by - have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 - rwa [star_eq_conjTranspose] at h - rw [mem_ColourSpace, Gluon.adjointAction_apply_coe, trace_mul_cycle, hu, Matrix.one_mul, - colourH_coe] - exact trace_colourMat - -/-- The orbit of the `DiagonalJet` colour direction under constant gauge transformations, inside the - colour carrier. -/ -noncomputable def colourOrbit : Set ColourSpace := - Set.range fun u : specialUnitaryGroup (Fin 3) ℂ => - (⟨Gluon.adjointAction u colourH, adjointAction_colourH_mem u⟩ : ColourSpace) - -/-- **The conjugate orbit spans the colour carrier.** Every traceless hermitian matrix is a real - linear combination of constant `SU(3)` conjugates of `H = diag(1, -1, 0)`. -/ -lemma span_colourOrbit : Submodule.span ℝ colourOrbit = ⊤ := by - refine le_antisymm le_top ?_ - rw [← colourBasis.span_eq] - refine Submodule.span_le.mpr ?_ - rintro _ ⟨k, rfl⟩ - exact Submodule.subset_span ⟨colourConj k, Subtype.ext (colourBasis_eq_adjointAction k)⟩ - -/-! - -## F. Based jets in every colour direction - --/ - -lemma evalSU_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) : - JetGaugeGroupI.evalSU (Fin 3) (JetGaugeGroupI.ofConstantSU (Fin 3) u) = u := by - apply Subtype.ext - ext i j - simp [JetGaugeGroupI.evalSU, JetGaugeGroupI.ofConstantSU, RingHom.mapMatrix_apply, - Matrix.map_apply] - -lemma mcCoeff_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Fin 1 ⊕ Fin 3) : - Gluon.mcCoeff (JetGaugeGroupI.ofConstantSU (Fin 3) u) μ = 0 := by - apply Subtype.ext - show Gluon.mcMatrix μ ((JetGaugeGroupI.ofConstantSU (Fin 3) u) : - Matrix (Fin 3) (Fin 3) JetRing) = _ - rw [show ((JetGaugeGroupI.ofConstantSU (Fin 3) u) : Matrix (Fin 3) (Fin 3) JetRing) = - (u : Matrix (Fin 3) (Fin 3) ℂ).map (C : ℂ →+* JetRing) from rfl] - simp [Gluon.mcMatrix] - -/-- For based jets the Maurer–Cartan cocycle degenerates to additivity. -/ -lemma mcCoeff_mul_of_based {U V : specialUnitaryGroup (Fin 3) JetRing} - (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (μ : Fin 1 ⊕ Fin 3) : - Gluon.mcCoeff (U * V) μ = Gluon.mcCoeff U μ + Gluon.mcCoeff V μ := by - rw [Gluon.mcCoeff_mul, hU, Gluon.adjointAction_one] - rfl - -/-- The ordered product of eight gauge jets. The colour jet group is not commutative, so the - product is written out rather than taken over a `Finset`. -/ -noncomputable def prodJet (f : Fin 8 → specialUnitaryGroup (Fin 3) JetRing) : - specialUnitaryGroup (Fin 3) JetRing := - f 0 * (f 1 * (f 2 * (f 3 * (f 4 * (f 5 * (f 6 * f 7)))))) - -lemma evalSU_prodJet {f : Fin 8 → specialUnitaryGroup (Fin 3) JetRing} - (hf : ∀ k, JetGaugeGroupI.evalSU (Fin 3) (f k) = 1) : - JetGaugeGroupI.evalSU (Fin 3) (prodJet f) = 1 := by - simp [prodJet, map_mul, hf] - -/-- On based jets the Maurer–Cartan coefficient of a product is the sum of the coefficients. -/ -lemma mcCoeff_prodJet {f : Fin 8 → specialUnitaryGroup (Fin 3) JetRing} - (hf : ∀ k, JetGaugeGroupI.evalSU (Fin 3) (f k) = 1) (ν : Fin 1 ⊕ Fin 3) : - Gluon.mcCoeff (prodJet f) ν = ∑ k, Gluon.mcCoeff (f k) ν := by - rw [Fin.sum_univ_eight, prodJet, mcCoeff_mul_of_based (hf 0), mcCoeff_mul_of_based (hf 1), - mcCoeff_mul_of_based (hf 2), mcCoeff_mul_of_based (hf 3), mcCoeff_mul_of_based (hf 4), - mcCoeff_mul_of_based (hf 5), mcCoeff_mul_of_based (hf 6)] - abel - -/-- The based jet realizing the shift `r • Ad(u) H` in the direction `μ`: the `DiagonalJet` diagonal - jet - conjugated by a constant colour rotation. -/ -noncomputable def conjJet (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ : Fin 1 ⊕ Fin 3) : - specialUnitaryGroup (Fin 3) JetRing := - JetGaugeGroupI.ofConstantSU (Fin 3) u * diagSU r (Finsupp.single μ 1) (single_ne_zero' μ) * - (JetGaugeGroupI.ofConstantSU (Fin 3) u)⁻¹ - -lemma evalSU_conjJet (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ : Fin 1 ⊕ Fin 3) : - JetGaugeGroupI.evalSU (Fin 3) (conjJet u r μ) = 1 := by - rw [conjJet, map_mul, map_mul, map_inv, evalSU_ofConstantSU, evalSU_diagSU, mul_one, - mul_inv_cancel] - -lemma mcCoeff_conjJet (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : - Gluon.mcCoeff (conjJet u r μ) ν = - Gluon.adjointAction u - (Gluon.mcCoeff (diagSU r (Finsupp.single μ 1) (single_ne_zero' μ)) ν) := by - have hinv : (JetGaugeGroupI.ofConstantSU (Fin 3) u)⁻¹ = - JetGaugeGroupI.ofConstantSU (Fin 3) u⁻¹ := (map_inv _ u).symm - simp only [conjJet, hinv, Gluon.mcCoeff_mul, mcCoeff_ofConstantSU, zero_add, - evalSU_ofConstantSU, map_zero, add_zero] - -/-- **Realizability in one colour direction.** For every constant `u`, every real `r` and every - spacetime direction `μ` there is a based gauge jet whose Maurer–Cartan coefficient is - `r • Ad(u) H` in the direction `μ` and zero elsewhere. -/ -lemma mcCoeff_conjJet_eq (u : specialUnitaryGroup (Fin 3) ℂ) (r : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : - Gluon.mcCoeff (conjJet u r μ) ν = - if ν = μ then r • Gluon.adjointAction u colourH else 0 := by - rw [mcCoeff_conjJet] - by_cases h : ν = μ - · subst h - rw [if_pos rfl, mcCoeff_diagSU_single, map_smul] - · rw [if_neg h, mcCoeff_diagSU_single_of_ne r μ ν h, map_zero] - -/-- **Arbitrary based translations of the colour carrier.** For every traceless hermitian `X` and - every spacetime direction `μ` there is a based gauge jet whose Maurer–Cartan coefficient is `X` - in the direction `μ` and zero in every other direction. - - This is the exact input that layerwise polynomial-translation elimination consumes: the shift is - an arbitrary constant element of the colour carrier, concentrated in one Lorentz direction. -/ -lemma exists_based_mcCoeff (μ : Fin 1 ⊕ Fin 3) (X : ColourSpace) : - ∃ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 ∧ - ∀ ν, Gluon.mcCoeff U ν = - if ν = μ then (X : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) else 0 := by - classical - refine ⟨prodJet fun k => conjJet (colourConj k) (colourBasis.repr X k) μ, ?_, ?_⟩ - · exact evalSU_prodJet fun k => evalSU_conjJet _ _ _ - · intro ν - rw [mcCoeff_prodJet (fun k => evalSU_conjJet _ _ _) ν] - rcases eq_or_ne ν μ with rfl | hne - · have hcoe : ∀ k : Fin 8, - Gluon.mcCoeff (conjJet (colourConj k) (colourBasis.repr X k) ν) ν = - Submodule.subtype ColourSpace (colourBasis.repr X k • colourBasis k) := fun k => by - rw [mcCoeff_conjJet_eq, if_pos rfl, colourBasis_eq_adjointAction k] - rfl - rw [if_pos rfl, Finset.sum_congr rfl fun k (_ : k ∈ Finset.univ) => hcoe k, ← map_sum, - colourBasis.sum_repr X] - rfl - · rw [if_neg hne] - refine Finset.sum_eq_zero fun k _ => ?_ - rw [mcCoeff_conjJet_eq, if_neg hne] - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean deleted file mode 100644 index 2da99d4cb..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CoordinateChange.lean +++ /dev/null @@ -1,519 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Mathematics.MvPolynomialTranslation -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.ColourBasis -/-! -# The first-order covariant coordinate change - -## i. Overview - -`A₁` is the polynomial algebra over `ℝ` on the gluon connection coordinates `A_μ^c` and their -first ordinary derivatives `(∂_ν A_μ)^c`, with `μ, ν` spacetime directions and `c` a colour index -running over the basis `SU3Jet.colourBasis` of `ColourBasis`. This file replaces the `∂_ν A_μ` block -by the -*symmetric* derivative coordinates together with the field strength - -```text -F_{νμ} = ∂_ν A_μ - ∂_μ A_ν + i [A_ν, A_μ], -``` - -and proves that the replacement is an isomorphism of algebras whose inverse carries the nonabelian -commutator correction. - -## ii. Conventions - -Physlib uses hermitian gluon potentials. Converting the Lie-algebra formula of -the underlying matrix-valued jet model (`F = ∂A - ∂A - [A, A]`, anti-hermitian) by -`A^{ah} = -i A^h` gives the hermitian field strength `F = ∂A - ∂A + i [A, A]`, which is the sign -used here. Correspondingly the colour bracket carried by the coordinate change is -`brMat M N = i (M N - N M)`, which preserves the traceless hermitian carrier. - -## iii. Index design - -* the colour index is the `Fin 8` of `SU3Jet.colourBasis`, as required by the proof strategy; -* symmetric derivative coordinates are indexed by `Sym2 Lor`; -* curvature coordinates are indexed by `CurvPair`, the *strictly ordered* pairs of spacetime - directions, so that the carrier holds six independent curvature variables per colour direction - and no antisymmetry relation. - -`LinearOrder (Fin 1 ⊕ Fin 3)` does not synthesize in this Mathlib. Rather than introduce a local -order instance the order is transported along the explicit equivalence `lorRank : Lor ≃ Fin 4`; -`Fin 4` already carries the decidability and trichotomy that the curvature variable needs, and -nothing else in the development wants an order on `Lor`. - -Coordinate count: `∂A` is `16 × 8 = 128`, splitting as symmetric `10 × 8 = 80` plus curvature -`6 × 8 = 48`. - -## iv. Results - -* `brP`, `cstruct` — the colour bracket in coordinates, and its structure constants; -* `curvPoly` — the field strength as a polynomial in the ordinary coordinates; -* `oldToNew`, `newToOld` — the two substitution algebra maps; -* `newToOld_oldToNew`, `oldToNew_newToOld` — they are mutually inverse on every generator; -* `covEquiv : A₁ ≃ₐ[ℝ] A₁cov` — the resulting coordinate change. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -namespace SU3Jet - -/-! - -## A. Index types - --/ - -/-- The spacetime index. -/ -abbrev Lor : Type := Fin 1 ⊕ Fin 3 - -/-- The colour index, the index type of `SU3Jet.colourBasis`. -/ -abbrev Col : Type := Fin 8 - -/-- A linear ordering of the four spacetime directions, transported along an explicit - equivalence: `LinearOrder (Fin 1 ⊕ Fin 3)` does not synthesize. -/ -def lorRank : Lor ≃ Fin 4 := finSumFinEquiv - -/-- The transported strict order on spacetime directions. -/ -def LorLT (ν μ : Lor) : Prop := lorRank ν < lorRank μ - -instance (ν μ : Lor) : Decidable (LorLT ν μ) := by - unfold LorLT; infer_instance - -lemma lorLT_irrefl (ν : Lor) : ¬ LorLT ν ν := lt_irrefl _ - -lemma lorLT_asymm {ν μ : Lor} (h : LorLT ν μ) : ¬ LorLT μ ν := lt_asymm h - -lemma lor_trichotomy (ν μ : Lor) : LorLT ν μ ∨ ν = μ ∨ LorLT μ ν := by - rcases lt_trichotomy (lorRank ν) (lorRank μ) with h | h | h - · exact Or.inl h - · exact Or.inr (Or.inl (lorRank.injective h)) - · exact Or.inr (Or.inr h) - -/-- The six independent curvature slots: strictly ordered pairs of spacetime directions. -/ -abbrev CurvPair : Type := {p : Lor × Lor // LorLT p.1 p.2} - -/-- The ordinary coordinates of the first-order gluon jet algebra: the connection and its first - ordinary derivatives. -/ -inductive Coord where - /-- The connection coordinate `A_μ^c`. -/ - | conn : Lor → Col → Coord - /-- The ordinary derivative coordinate `(∂_ν A_μ)^c`. -/ - | der : Lor → Lor → Col → Coord -deriving DecidableEq - -/-- The covariant coordinates: the connection, the symmetric part of its derivative, and the - field strength. -/ -inductive CovCoord where - /-- The connection coordinate `A_μ^c`. -/ - | conn : Lor → Col → CovCoord - /-- The symmetric derivative coordinate `(∂_{(ν} A_{μ)})^c`. -/ - | sym : Sym2 Lor → Col → CovCoord - /-- The field strength coordinate `F_{νμ}^c`, one variable per ordered pair. -/ - | curv : CurvPair → Col → CovCoord -deriving DecidableEq - -/-- The first-order gluon jet algebra in ordinary coordinates. -/ -abbrev A₁ : Type := MvPolynomial Coord ℝ - -/-- The first-order gluon jet algebra in covariant coordinates. -/ -abbrev A₁cov : Type := MvPolynomial CovCoord ℝ - -/-! - -## B. The colour bracket - --/ - -/-- The underlying complex matrix of a colour vector. -/ -def cmat (X : ColourSpace) : Matrix (Fin 3) (Fin 3) ℂ := - ((X : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)) : Matrix (Fin 3) (Fin 3) ℂ) - -lemma cmat_injective : Function.Injective cmat := fun _ _ h => - Subtype.ext (Subtype.ext h) - -@[simp] -lemma cmat_add (X Y : ColourSpace) : cmat (X + Y) = cmat X + cmat Y := rfl - -@[simp] -lemma cmat_smul (r : ℝ) (X : ColourSpace) : cmat (r • X) = r • cmat X := rfl - -@[simp] -lemma cmat_zero : cmat 0 = 0 := rfl - -@[simp] -lemma cmat_sub (X Y : ColourSpace) : cmat (X - Y) = cmat X - cmat Y := rfl - -lemma cmat_star (X : ColourSpace) : star (cmat X) = cmat X := - selfAdjoint.mem_iff.mp (X : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)).2 - -lemma cmat_trace (X : ColourSpace) : trace (cmat X) = 0 := X.2 - -/-- Assemble a colour vector from a traceless hermitian matrix. -/ -def mkCM (M : Matrix (Fin 3) (Fin 3) ℂ) (hs : star M = M) (ht : trace M = 0) : ColourSpace := - ⟨⟨M, selfAdjoint.mem_iff.mpr hs⟩, ht⟩ - -@[simp] -lemma cmat_mkCM (M : Matrix (Fin 3) (Fin 3) ℂ) (hs : star M = M) (ht : trace M = 0) : - cmat (mkCM M hs ht) = M := rfl - -/-- The hermitian colour bracket `i (M N - N M)`. The factor of `i` is what keeps the bracket - inside the hermitian carrier; it is the same `i` that appears in the hermitian field strength. -/ -def brMat (M N : Matrix (Fin 3) (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ := - Complex.I • (M * N - N * M) - -lemma brMat_star {M N : Matrix (Fin 3) (Fin 3) ℂ} (hM : star M = M) (hN : star N = N) : - star (brMat M N) = brMat M N := by - rw [brMat, star_smul, star_sub, star_mul, star_mul, hM, hN, Complex.star_def, Complex.conj_I, - neg_smul, ← smul_neg, neg_sub] - -lemma brMat_trace (M N : Matrix (Fin 3) (Fin 3) ℂ) : trace (brMat M N) = 0 := by - rw [brMat, trace_smul, trace_sub, trace_mul_comm M N, sub_self, smul_zero] - -lemma brMat_swap (M N : Matrix (Fin 3) (Fin 3) ℂ) : brMat M N = -brMat N M := by - rw [brMat, brMat, ← smul_neg, neg_sub] - -lemma brMat_self (M : Matrix (Fin 3) (Fin 3) ℂ) : brMat M M = 0 := by - rw [brMat, sub_self, smul_zero] - -/-- The colour bracket `X, Y ↦ i [X, Y]` on the traceless hermitian carrier. -/ -noncomputable def br : ColourSpace →ₗ[ℝ] ColourSpace →ₗ[ℝ] ColourSpace := - LinearMap.mk₂ ℝ - (fun X Y => mkCM (brMat (cmat X) (cmat Y)) - (brMat_star (cmat_star X) (cmat_star Y)) (brMat_trace _ _)) - (fun _ _ _ => cmat_injective (by - simp only [cmat_mkCM, cmat_add, brMat, add_mul, mul_add] - module)) - (fun _ _ _ => cmat_injective (by - simp only [cmat_mkCM, cmat_smul, brMat, Matrix.smul_mul, Matrix.mul_smul] - module)) - (fun _ _ _ => cmat_injective (by - simp only [cmat_mkCM, cmat_add, brMat, add_mul, mul_add] - module)) - (fun _ _ _ => cmat_injective (by - simp only [cmat_mkCM, cmat_smul, brMat, Matrix.smul_mul, Matrix.mul_smul] - module)) - -@[simp] -lemma cmat_br (X Y : ColourSpace) : cmat (br X Y) = brMat (cmat X) (cmat Y) := rfl - -lemma br_swap (X Y : ColourSpace) : br X Y = -br Y X := - cmat_injective (by - rw [cmat_br, brMat_swap] - show _ = cmat (-br Y X) - rw [show cmat (-br Y X) = -cmat (br Y X) from rfl, cmat_br]) - -lemma br_self (X : ColourSpace) : br X X = 0 := - cmat_injective (by rw [cmat_br, brMat_self, cmat_zero]) - -/-! - -## C. Colour coordinates and structure constants - --/ - -/-- The `c`-th coordinate of a colour vector relative to `colourBasis`, as a linear - functional. -/ -noncomputable def coordC (c : Col) : ColourSpace →ₗ[ℝ] ℝ where - toFun X := colourBasis.repr X c - map_add' X Y := by simp - map_smul' r X := by simp - -@[simp] -lemma coordC_apply (c : Col) (X : ColourSpace) : coordC c X = colourBasis.repr X c := rfl - -/-- The colour vector with prescribed coordinates. -/ -noncomputable def mkC (f : Col → ℝ) : ColourSpace := colourBasis.equivFun.symm f - -@[simp] -lemma coordC_mkC (f : Col → ℝ) (a : Col) : coordC a (mkC f) = f a := - congrFun (colourBasis.equivFun.apply_symm_apply f) a - -lemma mkC_coordC (X : ColourSpace) : mkC (fun a => coordC a X) = X := - colourBasis.equivFun.symm_apply_apply X - -lemma mkC_eq_sum (f : Col → ℝ) : mkC f = ∑ a, f a • colourBasis a := - Basis.equivFun_symm_apply _ _ - -/-- The structure constants of the colour bracket in the basis `colourBasis`. -/ -noncomputable def cstruct (a b c : Col) : ℝ := - coordC c (br (colourBasis a) (colourBasis b)) - -lemma cstruct_swap (a b c : Col) : cstruct a b c = -cstruct b a c := by - rw [cstruct, cstruct, br_swap, map_neg] - -/-- **The colour bracket in coordinates.** -/ -lemma coordC_br (X Y : ColourSpace) (c : Col) : - coordC c (br X Y) = ∑ a, ∑ b, coordC a X * coordC b Y * cstruct a b c := by - conv_lhs => rw [← colourBasis.sum_repr X, ← colourBasis.sum_repr Y] - simp only [map_sum, LinearMap.sum_apply, map_smul, LinearMap.smul_apply, smul_eq_mul, - coordC_apply, cstruct, Finset.mul_sum] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => by ring - -/-! - -## D. Colour vectors of polynomials - -A colour vector of polynomials is a function `Col → MvPolynomial ι ℝ`. The bracket lifts to such -vectors through the structure constants, and evaluation at a point of the coordinate space -intertwines the lifted bracket with `br`. - --/ - -section Poly - -variable {ι σ τ : Type*} - -/-- Any `ℝ`-algebra map between polynomial algebras fixes the constants. -/ -lemma algHom_C (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) (r : ℝ) : - φ (C r) = C r := by - rw [← algebraMap_eq, AlgHom.commutes, algebraMap_eq] - -/-- The colour bracket of two colour vectors of polynomials. -/ -noncomputable def brP (p q : Col → MvPolynomial ι ℝ) : Col → MvPolynomial ι ℝ := - fun c => ∑ a, ∑ b, C (cstruct a b c) * (p a * q b) - -lemma brP_swap (p q : Col → MvPolynomial ι ℝ) (c : Col) : brP p q c = -brP q p c := by - have key : (brP q p c : MvPolynomial ι ℝ) = - ∑ a, ∑ b, -(C (cstruct a b c) * (p a * q b)) := by - rw [brP, Finset.sum_comm] - refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - rw [cstruct_swap b a c, map_neg] - ring - rw [key, brP] - simp [Finset.sum_neg_distrib] - -lemma brP_self (p : Col → MvPolynomial ι ℝ) (c : Col) : brP p p c = 0 := by - have h : (2 : ℝ) • brP p p c = 0 := by - rw [two_smul] - nth_rewrite 1 [brP_swap p p c] - exact neg_add_cancel _ - have h2 := congrArg (fun x : MvPolynomial ι ℝ => (2⁻¹ : ℝ) • x) h - simpa [smul_smul] using h2 - -lemma algHom_brP (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) (p q : Col → MvPolynomial σ ℝ) - (c : Col) : - φ (brP p q c) = brP (fun a => φ (p a)) (fun b => φ (q b)) c := by - rw [brP, brP, map_sum] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [map_sum] - exact Finset.sum_congr rfl fun b _ => by rw [map_mul, map_mul, algHom_C] - -/-- **Evaluation intertwines the polynomial bracket with the colour bracket.** -/ -lemma eval_brP (x : ι → ℝ) (p q : Col → MvPolynomial ι ℝ) (c : Col) : - eval x (brP p q c) = - coordC c (br (mkC fun a => eval x (p a)) (mkC fun b => eval x (q b))) := by - rw [coordC_br] - simp only [coordC_mkC] - rw [brP, map_sum] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun b _ => ?_ - rw [map_mul, map_mul, eval_C] - ring - -end Poly - -/-! - -## E. The two coordinate systems - --/ - -/-- The connection colour vector in ordinary coordinates. -/ -noncomputable def connOld (μ : Lor) : Col → A₁ := fun c => X (Coord.conn μ c) - -/-- The connection colour vector in covariant coordinates. -/ -noncomputable def connCov (μ : Lor) : Col → A₁cov := fun c => X (CovCoord.conn μ c) - -/-- **The field strength in ordinary coordinates:** - `F_{νμ}^c = (∂_ν A_μ)^c - (∂_μ A_ν)^c + (i [A_ν, A_μ])^c`. -/ -noncomputable def curvPoly (ν μ : Lor) (c : Col) : A₁ := - X (Coord.der ν μ c) - X (Coord.der μ ν c) + brP (connOld ν) (connOld μ) c - -lemma curvPoly_swap (ν μ : Lor) (c : Col) : curvPoly ν μ c = -curvPoly μ ν c := by - rw [curvPoly, curvPoly, brP_swap (connOld μ) (connOld ν) c] - ring - -lemma curvPoly_self (ν : Lor) (c : Col) : curvPoly ν ν c = 0 := by - rw [curvPoly, brP_self, sub_self, add_zero] - -/-- The curvature variable of the covariant carrier, for an arbitrary ordered pair of directions: - the variable itself on an increasing pair, minus the variable on a decreasing pair, and zero on - the diagonal. This is what keeps the carrier free of antisymmetry relations. -/ -noncomputable def curvVar (ν μ : Lor) (c : Col) : A₁cov := - if h : LorLT ν μ then X (CovCoord.curv ⟨(ν, μ), h⟩ c) - else if h' : LorLT μ ν then -X (CovCoord.curv ⟨(μ, ν), h'⟩ c) - else 0 - -lemma curvVar_swap (ν μ : Lor) (c : Col) : curvVar ν μ c = -curvVar μ ν c := by - rw [curvVar, curvVar] - by_cases h : LorLT ν μ - · rw [dif_pos h, dif_neg (lorLT_asymm h), dif_pos h, neg_neg] - · by_cases h' : LorLT μ ν - · rw [dif_neg h, dif_pos h', dif_pos h'] - · rw [dif_neg h, dif_neg h', dif_neg h', dif_neg h, neg_zero] - -lemma curvVar_of_lt {ν μ : Lor} (h : LorLT ν μ) (c : Col) : - curvVar ν μ c = X (CovCoord.curv ⟨(ν, μ), h⟩ c) := by - rw [curvVar, dif_pos h] - -/-- The symmetric derivative coordinate of the covariant carrier, written in ordinary - coordinates. -/ -noncomputable def symOld (c : Col) : Sym2 Lor → A₁ := - Sym2.lift ⟨fun ν μ => (2⁻¹ : ℝ) • (X (Coord.der ν μ c) + X (Coord.der μ ν c)), by - intro a b - show (2⁻¹ : ℝ) • (X (Coord.der a b c) + X (Coord.der b a c)) = - (2⁻¹ : ℝ) • (X (Coord.der b a c) + X (Coord.der a b c)) - rw [add_comm]⟩ - -@[simp] -lemma symOld_mk (c : Col) (ν μ : Lor) : - symOld c s(ν, μ) = (2⁻¹ : ℝ) • (X (Coord.der ν μ c) + X (Coord.der μ ν c)) := - Sym2.lift_mk _ _ _ - -/-! - -## F. The two substitutions - --/ - -/-- The ordinary coordinates written in covariant coordinates: the derivative coordinate splits - as its symmetric part plus half the field strength, corrected by the commutator. -/ -noncomputable def oldToNewGen : Coord → A₁cov - | Coord.conn μ c => X (CovCoord.conn μ c) - | Coord.der ν μ c => - X (CovCoord.sym s(ν, μ) c) + - (2⁻¹ : ℝ) • (curvVar ν μ c - brP (connCov ν) (connCov μ) c) - -/-- The covariant coordinates written in ordinary coordinates. -/ -noncomputable def newToOldGen : CovCoord → A₁ - | CovCoord.conn μ c => X (Coord.conn μ c) - | CovCoord.sym s c => symOld c s - | CovCoord.curv q c => curvPoly q.1.1 q.1.2 c - -/-- The substitution from ordinary to covariant coordinates. -/ -noncomputable def oldToNew : A₁ →ₐ[ℝ] A₁cov := aeval oldToNewGen - -/-- The substitution from covariant to ordinary coordinates. -/ -noncomputable def newToOld : A₁cov →ₐ[ℝ] A₁ := aeval newToOldGen - -@[simp] -lemma oldToNew_conn (μ : Lor) (c : Col) : - oldToNew (X (Coord.conn μ c)) = X (CovCoord.conn μ c) := aeval_X _ _ - -@[simp] -lemma oldToNew_der (ν μ : Lor) (c : Col) : - oldToNew (X (Coord.der ν μ c)) = - X (CovCoord.sym s(ν, μ) c) + - (2⁻¹ : ℝ) • (curvVar ν μ c - brP (connCov ν) (connCov μ) c) := aeval_X _ _ - -@[simp] -lemma newToOld_conn (μ : Lor) (c : Col) : - newToOld (X (CovCoord.conn μ c)) = X (Coord.conn μ c) := aeval_X _ _ - -@[simp] -lemma newToOld_sym (s : Sym2 Lor) (c : Col) : - newToOld (X (CovCoord.sym s c)) = symOld c s := aeval_X _ _ - -@[simp] -lemma newToOld_curv (q : CurvPair) (c : Col) : - newToOld (X (CovCoord.curv q c)) = curvPoly q.1.1 q.1.2 c := aeval_X _ _ - -lemma newToOld_connCov (ν : Lor) : (fun a => newToOld (connCov ν a)) = connOld ν := by - funext a - exact newToOld_conn ν a - -lemma oldToNew_connOld (ν : Lor) : (fun a => oldToNew (connOld ν a)) = connCov ν := by - funext a - exact oldToNew_conn ν a - -lemma newToOld_brP_conn (ν μ : Lor) (c : Col) : - newToOld (brP (connCov ν) (connCov μ) c) = brP (connOld ν) (connOld μ) c := by - rw [algHom_brP, newToOld_connCov, newToOld_connCov] - -lemma oldToNew_brP_conn (ν μ : Lor) (c : Col) : - oldToNew (brP (connOld ν) (connOld μ) c) = brP (connCov ν) (connCov μ) c := by - rw [algHom_brP, oldToNew_connOld, oldToNew_connOld] - -/-- The inverse image of the curvature variable is the field strength, at every ordered pair. -/ -lemma newToOld_curvVar (ν μ : Lor) (c : Col) : - newToOld (curvVar ν μ c) = curvPoly ν μ c := by - rw [curvVar] - by_cases h : LorLT ν μ - · rw [dif_pos h, newToOld_curv] - · by_cases h' : LorLT μ ν - · rw [dif_neg h, dif_pos h', map_neg, newToOld_curv, ← curvPoly_swap] - · rw [dif_neg h, dif_neg h', map_zero] - rcases lor_trichotomy ν μ with hlt | rfl | hgt - · exact absurd hlt h - · rw [curvPoly_self] - · exact absurd hgt h' - -/-! - -## G. The coordinate change is invertible - --/ - -lemma newToOld_oldToNew (i : Coord) : newToOld (oldToNew (X i)) = X i := by - cases i with - | conn μ c => rw [oldToNew_conn, newToOld_conn] - | der ν μ c => - rw [oldToNew_der, map_add, map_smul, map_sub, newToOld_sym, newToOld_curvVar, - newToOld_brP_conn, symOld_mk, curvPoly] - module - -lemma oldToNew_newToOld (i : CovCoord) : oldToNew (newToOld (X i)) = X i := by - cases i with - | conn μ c => rw [newToOld_conn, oldToNew_conn] - | sym s c => - induction s using Sym2.ind with - | _ ν μ => - rw [newToOld_sym, symOld_mk, map_smul, map_add, oldToNew_der, oldToNew_der, - Sym2.eq_swap (a := μ) (b := ν), curvVar_swap μ ν c, - brP_swap (connCov μ) (connCov ν) c] - module - | curv q c => - obtain ⟨⟨ν, μ⟩, hq⟩ := q - rw [newToOld_curv, curvPoly, map_add, map_sub, oldToNew_der, oldToNew_der, - oldToNew_brP_conn, Sym2.eq_swap (a := μ) (b := ν), curvVar_swap μ ν c, - brP_swap (connCov μ) (connCov ν) c, curvVar_of_lt hq] - module - -/-- **The first-order covariant coordinate change.** The ordinary first-order gluon jet algebra - and the covariant one are the same algebra: the derivative block splits as its symmetric part - together with the field strength, and the inverse substitution carries the nonabelian commutator - correction. -/ -noncomputable def covEquiv : A₁ ≃ₐ[ℝ] A₁cov := - AlgEquiv.ofAlgHom oldToNew newToOld - (by refine algHom_ext fun i => ?_; rw [AlgHom.comp_apply, oldToNew_newToOld, AlgHom.id_apply]) - (by refine algHom_ext fun i => ?_; rw [AlgHom.comp_apply, newToOld_oldToNew, AlgHom.id_apply]) - -@[simp] -lemma covEquiv_apply (P : A₁) : covEquiv P = oldToNew P := rfl - -@[simp] -lemma covEquiv_symm_apply (Q : A₁cov) : covEquiv.symm Q = newToOld Q := rfl - -@[simp] -lemma newToOld_oldToNew_apply (P : A₁) : newToOld (oldToNew P) = P := - covEquiv.symm_apply_apply P - -@[simp] -lemma oldToNew_newToOld_apply (Q : A₁cov) : oldToNew (newToOld Q) = Q := - covEquiv.apply_symm_apply Q - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean deleted file mode 100644 index 87c1ad499..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/CovariantTower.lean +++ /dev/null @@ -1,750 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.OrdinaryJets -/-! -# The covariant curvature tower and its residual action - -## i. Overview - -This file builds, **inside** `OrdinaryJets`'s ordinary jet algebra, the field strength, the -covariant derivative and -the genuinely symmetrized covariant derivatives `D^r F` at arbitrary order, and proves that the -whole tower transforms under a jet gauge transformation only through the base-point value of the -jet. The covariant tower consists of honest elements of the ordinary algebra: it satisfies -antisymmetry, Bianchi and commutator relations, and no new carrier variables are introduced. - -## ii. Conventions - -The `HookBianchi` hermitian conventions, unchanged: - -```text -br(M,N) = i (M N - N M) -F_νμ = ∂_ν A_μ - ∂_μ A_ν + br(A_ν, A_μ) -D_ρ X = ∂_ρ X + br(A_ρ, X). -``` - -## iii. Method - -The covariance proof runs through a *series* evaluation dictionary rather than through a -generator-by-generator commutation rule for `gaugePull` and `jetDeriv` (which is not clean, because -the substitution freezes the Taylor coefficients of the gauge jet at the base point). Concretely: - -* `evalS A : JetAlgebra →ₐ[ℝ] MvPowerSeries Lor ℝ` substitutes a colour potential and its - derivatives *at a varying point*, and intertwines `jetDeriv` with `MvPowerSeries.pderiv`; -* `cser` turns a colour vector of real series into a matrix of jets, intertwining `brR` with the - matrix bracket; -* at the level of matrices of jets the covariance of `F` and of `D_ρ` is the classical - computation, whose only nontrivial input is the Maurer–Cartan structure equation - `∂_ν m_μ - ∂_μ m_ν = m_ν m_μ - m_μ m_ν` (`dMat_mcP_sub`, from `GaugeAction`'s `dMat_mcP`); -* taking base-point values turns conjugation by the series `U` into `Ad` by `evalSU U`. - -## iv. Symmetrization - -`covIter t` is the *ordered* iterated covariant derivative along a tuple `t : Fin r → Lor`. -Covariant derivatives do **not** commute, so the published tower is the genuine symmetrization - -```text -covCurv t ν μ = (r !)⁻¹ • ∑_{σ : Equiv.Perm (Fin r)} covIter (t ∘ σ) (curvVec ν μ), -``` - -and `covCurv_perm` proves it is unchanged by any permutation of the derivative slots. No claim is -made that the unsymmetrized `covIter` depends only on the multiset of directions. - -## v. Results - -* `evalS`, `evalS_jetDeriv`, `constantCoeff_evalS` — the series evaluation dictionary; -* `curvVec`, `covD`, `covIter`, `covCurv`, `covCurv_perm` — the covariant tower; -* `gaugePull_covCurv` — the arbitrary-order covariance theorem; -* `covAlgebra`, `gaugePull_covAlgebra_le`, `gaugePull_eq_self_of_based`, - `gaugePull_eq_of_evalSU_eq`, `gaugePull_eq_ofConstantSU` — the generated subalgebra results. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -namespace SU3Jet - -/-! - -## A. The series evaluation dictionary - -Substituting a colour potential into a jet polynomial gives a *function of spacetime*, i.e. a -formal power series with real coefficients. Under this substitution the formal total derivative -of `OrdinaryJets` becomes the formal partial derivative of the power series. - --/ - -/-- Real formal power series in the spacetime coordinates: the values of jet polynomials on a - fixed field configuration. -/ -abbrev RSeries : Type := MvPowerSeries Lor ℝ - -/-- A real series with prescribed Taylor coefficients. -/ -def mkRSeries (f : DIdx → ℝ) : RSeries := f - -@[simp] -lemma coeff_mkRSeries (f : DIdx → ℝ) (k : DIdx) : - MvPowerSeries.coeff k (mkRSeries f) = f k := rfl - -/-- The colour component of the `s`-th ordinary derivative of a colour potential, as a function of - the spacetime point. Its `k`-th Taylor coefficient is `(k+s)!/k!` times the `(k+s)`-th - coefficient of the potential. -/ -noncomputable def sCoordS (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) : RSeries := - mkRSeries fun k => facI (k + s) / facI k * coordC c (A.coeffC (k + s) μ) - -lemma constantCoeff_sCoordS (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) : - MvPowerSeries.constantCoeff (sCoordS A s μ c) = potPt A (JetGenerators.dA s μ c) := by - show facI (0 + s) / facI 0 * coordC c (A.coeffC (0 + s) μ) = _ - rw [zero_add, facI_zero, div_one] - rfl - -/-- **The derivative rule for the series dictionary.** Differentiating the component function of - `∂_s A_μ` gives the component function of `∂_{s+ρ} A_μ`. -/ -lemma pderiv_sCoordS (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) (ρ : Lor) : - MvPowerSeries.pderiv ℝ ρ (sCoordS A s μ c) = sCoordS A (s + Finsupp.single ρ 1) μ c := by - refine MvPowerSeries.ext fun k => ?_ - have hidx : k + Finsupp.single ρ 1 + s = k + (s + Finsupp.single ρ 1) := by - rw [add_assoc, add_comm (Finsupp.single ρ 1) s] - have hk : facI k ≠ 0 := facI_ne_zero k - have hr : ((k ρ : ℝ) + 1) ≠ 0 := by positivity - rw [MvPowerSeries.coeff_pderiv, sCoordS, sCoordS, coeff_mkRSeries, coeff_mkRSeries, hidx, - facI_add_single] - field_simp - -/-- The series dictionary on the ordinary generators. -/ -noncomputable def sCoordGen (A : ColourPot) : JetGenerators → RSeries - | .dA s μ c => sCoordS A s μ c - -@[simp] -lemma sCoordGen_dA (A : ColourPot) (s : DIdx) (μ : Lor) (c : Col) : - sCoordGen A (JetGenerators.dA s μ c) = sCoordS A s μ c := rfl - -/-- **Evaluation of a jet polynomial on a colour potential**, as a function of the spacetime - point. -/ -noncomputable def evalS (A : ColourPot) : JetAlgebra →ₐ[ℝ] RSeries := - (MvPolynomial.aeval (sCoordGen A)).comp toPoly.toAlgHom - -@[simp] -lemma evalS_ofGen (A : ColourPot) (g : JetGenerators) : evalS A (ofGen g) = sCoordGen A g := by - show MvPolynomial.aeval (sCoordGen A) (toPoly (ofGen g)) = _ - rw [toPoly_ofGen, aeval_X] - -private lemma aeval_polyDeriv (A : ColourPot) (ρ : Lor) (p : MvPolynomial JetGenerators ℝ) : - MvPolynomial.aeval (sCoordGen A) (polyDeriv ρ p) = - MvPowerSeries.pderiv ℝ ρ (MvPolynomial.aeval (sCoordGen A) p) := by - induction p using MvPolynomial.induction_on with - | C a => - rw [← algebraMap_eq, Derivation.map_algebraMap, map_zero, AlgHom.commutes, - Derivation.map_algebraMap] - | add p q hp hq => simp only [map_add, hp, hq] - | mul_X p g hp => - cases g with - | dA s μ c => - simp only [Derivation.leibniz, polyDeriv_X, smul_eq_mul, map_add, map_mul, aeval_X, - JetGenerators.shift_dA, sCoordGen_dA, hp, pderiv_sCoordS] - -/-- **The total derivative is the spacetime derivative of the substituted function.** -/ -lemma evalS_jetDeriv (A : ColourPot) (ρ : Lor) (P : JetAlgebra) : - evalS A (jetDeriv ρ P) = MvPowerSeries.pderiv ℝ ρ (evalS A P) := by - show MvPolynomial.aeval (sCoordGen A) (toPoly (jetDeriv ρ P)) = _ - rw [toPoly_jetDeriv, aeval_polyDeriv] - rfl - -/-- The base-point value of a real series, as an algebra map. -/ -noncomputable def constCoeffHom : RSeries →ₐ[ℝ] ℝ := - { (MvPowerSeries.constantCoeff : RSeries →+* ℝ) with - commutes' := fun r => by - show MvPowerSeries.constantCoeff (algebraMap ℝ RSeries r) = r - simp [MvPowerSeries.algebraMap_apply] } - -/-- Reading off the base-point value of a substituted jet polynomial is evaluating it at the - coordinate point of the potential. -/ -lemma constantCoeff_evalS (A : ColourPot) (P : JetAlgebra) : - MvPowerSeries.constantCoeff (evalS A P) = evalA (potPt A) P := by - have h : constCoeffHom.comp (evalS A) = evalA (potPt A) := - jetAlgHom_ext fun g => by - cases g with - | dA s μ c => - rw [AlgHom.comp_apply, evalS_ofGen, evalA_ofGen] - exact constantCoeff_sCoordS A s μ c - exact DFunLike.congr_fun h P - -/-! - -## B. Colour vectors of series as matrices of jets - --/ - -lemma jetMat_ext {M N : Matrix (Fin 3) (Fin 3) JetRing} (h : ∀ k, coeffMat k M = coeffMat k N) : - M = N := by - refine Matrix.ext fun i j => MvPowerSeries.ext fun k => ?_ - exact congrFun (congrFun (h k) i) j - -lemma coeffMat_mul (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat k (M * N) = ∑ p ∈ Finset.antidiagonal k, coeffMat p.1 M * coeffMat p.2 N := by - refine Matrix.ext fun i j => ?_ - rw [Matrix.sum_apply] - show MvPowerSeries.coeff k (∑ l, M i l * N l j) = - ∑ p ∈ Finset.antidiagonal k, ∑ l, coeffMat p.1 M i l * coeffMat p.2 N l j - rw [map_sum, Finset.sum_comm] - exact Finset.sum_congr rfl fun l _ => MvPowerSeries.coeff_mul _ _ _ - -lemma coeffMat_sub (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat k (M - N) = coeffMat k M - coeffMat k N := - Matrix.ext fun i j => by - show MvPowerSeries.coeff k (M i j - N i j) = _ - rw [map_sub] - rfl - -lemma coeffMat_dMat (k : DIdx) (ρ : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat k (dMat ρ M) = ((k ρ : ℂ) + 1) • coeffMat (k + Finsupp.single ρ 1) M := by - refine Matrix.ext fun i j => ?_ - show MvPowerSeries.coeff k (MvPowerSeries.pderiv ℂ ρ (M i j)) = - ((k ρ : ℂ) + 1) * MvPowerSeries.coeff (k + Finsupp.single ρ 1) (M i j) - rw [MvPowerSeries.coeff_pderiv] - ring - -/-- The hermitian colour bracket on matrices of jets. -/ -noncomputable def brJ (M N : Matrix (Fin 3) (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing := - (MvPowerSeries.C Complex.I : JetRing) • (M * N - N * M) - -lemma coeffMat_brJ (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat k (brJ M N) = - ∑ p ∈ Finset.antidiagonal k, brMat (coeffMat p.1 M) (coeffMat p.2 N) := by - have hsm : ∀ (X : Matrix (Fin 3) (Fin 3) JetRing), - coeffMat k ((MvPowerSeries.C Complex.I : JetRing) • X) = Complex.I • coeffMat k X := by - intro X - refine Matrix.ext fun i j => ?_ - show MvPowerSeries.coeff k ((MvPowerSeries.C Complex.I : JetRing) * X i j) = - Complex.I * MvPowerSeries.coeff k (X i j) - rw [MvPowerSeries.coeff_C_mul] - rw [brJ, hsm, coeffMat_sub, coeffMat_mul, coeffMat_mul, - Finsupp.sum_antidiagonal_swap k fun a b => coeffMat a N * coeffMat b M, - ← Finset.sum_sub_distrib, Finset.smul_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [brMat, smul_sub] - -/-- A colour vector of real series, as a matrix of jets. -/ -noncomputable def cser (f : Col → RSeries) : Matrix (Fin 3) (Fin 3) JetRing := - Matrix.of fun i j => ∑ c, MvPowerSeries.map (algebraMap ℝ ℂ) (f c) * - (MvPowerSeries.C (cmat (colourBasis c) i j) : JetRing) - -lemma coeffMat_cser (k : DIdx) (f : Col → RSeries) : - coeffMat k (cser f) = cmat (mkC fun c => MvPowerSeries.coeff k (f c)) := by - refine Matrix.ext fun i j => ?_ - rw [mkC_eq_sum, cmat_sum] - show MvPowerSeries.coeff k (∑ c, MvPowerSeries.map (algebraMap ℝ ℂ) (f c) * - (MvPowerSeries.C (cmat (colourBasis c) i j) : JetRing)) = _ - rw [map_sum, Matrix.sum_apply] - refine Finset.sum_congr rfl fun c _ => ?_ - rw [MvPowerSeries.coeff_mul_C, MvPowerSeries.coeff_map] - rfl - -lemma cser_injective : Function.Injective cser := by - intro f g h - funext c - refine MvPowerSeries.ext fun k => ?_ - have hk : cmat (mkC fun c => MvPowerSeries.coeff k (f c)) = - cmat (mkC fun c => MvPowerSeries.coeff k (g c)) := by - rw [← coeffMat_cser, ← coeffMat_cser, h] - have := congrArg (coordC c) (cmat_injective hk) - rwa [coordC_mkC, coordC_mkC] at this - -lemma mkC_add (f g : Col → ℝ) : mkC (fun c => f c + g c) = mkC f + mkC g := by - rw [mkC, mkC, mkC, ← map_add] - rfl - -lemma mkC_sub (f g : Col → ℝ) : mkC (fun c => f c - g c) = mkC f - mkC g := by - rw [mkC, mkC, mkC, ← map_sub] - rfl - -lemma cser_add (f g : Col → RSeries) : cser (f + g) = cser f + cser g := by - refine jetMat_ext fun k => ?_ - rw [coeffMat_add, coeffMat_cser, coeffMat_cser, coeffMat_cser, - show (fun c => MvPowerSeries.coeff k ((f + g) c)) = - (fun c => MvPowerSeries.coeff k (f c) + MvPowerSeries.coeff k (g c)) from - funext fun c => map_add _ _ _, mkC_add, cmat_add] - -lemma cser_sub (f g : Col → RSeries) : cser (f - g) = cser f - cser g := by - refine jetMat_ext fun k => ?_ - rw [coeffMat_sub, coeffMat_cser, coeffMat_cser, coeffMat_cser, - show (fun c => MvPowerSeries.coeff k ((f - g) c)) = - (fun c => MvPowerSeries.coeff k (f c) - MvPowerSeries.coeff k (g c)) from - funext fun c => map_sub _ _ _, mkC_sub, cmat_sub] - -/-- The matrix dictionary intertwines the spacetime derivative with the entrywise derivative. -/ -lemma dMat_cser (ρ : Lor) (f : Col → RSeries) : - dMat ρ (cser f) = cser fun c => MvPowerSeries.pderiv ℝ ρ (f c) := by - refine jetMat_ext fun k => ?_ - rw [coeffMat_dMat, coeffMat_cser, coeffMat_cser] - refine Matrix.ext fun i j => ?_ - rw [Matrix.smul_apply, mkC_eq_sum, mkC_eq_sum, cmat_sum, cmat_sum, Matrix.sum_apply, - Matrix.sum_apply, Finset.smul_sum] - refine Finset.sum_congr rfl fun c _ => ?_ - rw [cmat_smul, cmat_smul, Matrix.smul_apply, Matrix.smul_apply, MvPowerSeries.coeff_pderiv] - show ((k ρ : ℂ) + 1) * ((MvPowerSeries.coeff (k + Finsupp.single ρ 1) (f c) : ℝ) * - cmat (colourBasis c) i j) = - ((MvPowerSeries.coeff (k + Finsupp.single ρ 1) (f c) * ((k ρ : ℝ) + 1) : ℝ) * - cmat (colourBasis c) i j) - push_cast - ring - -/-- The matrix dictionary intertwines the polynomial colour bracket with the matrix bracket. -/ -lemma brJ_cser (f g : Col → RSeries) : brJ (cser f) (cser g) = cser (brR f g) := by - refine jetMat_ext fun k => ?_ - have hL : ∀ p : DIdx × DIdx, brMat (coeffMat p.1 (cser f)) (coeffMat p.2 (cser g)) = - cmat (br (mkC fun c => MvPowerSeries.coeff p.1 (f c)) - (mkC fun c => MvPowerSeries.coeff p.2 (g c))) := fun p => by - rw [cmat_br, coeffMat_cser, coeffMat_cser] - have hbr : ∀ p : DIdx × DIdx, ∀ c : Col, - coordC c (br (mkC fun a => MvPowerSeries.coeff p.1 (f a)) - (mkC fun b => MvPowerSeries.coeff p.2 (g b))) = - ∑ a, ∑ b, MvPowerSeries.coeff p.1 (f a) * MvPowerSeries.coeff p.2 (g b) * - cstruct a b c := fun p c => by - rw [coordC_br] - exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => by - rw [coordC_mkC, coordC_mkC] - rw [coeffMat_brJ, coeffMat_cser, - Finset.sum_congr rfl fun p (_ : p ∈ Finset.antidiagonal k) => hL p, ← cmat_sum] - congr 1 - rw [← mkC_coordC (∑ p ∈ Finset.antidiagonal k, - br (mkC fun c => MvPowerSeries.coeff p.1 (f c)) (mkC fun c => MvPowerSeries.coeff p.2 (g c)))] - congr 1 - funext c - have hLHS : coordC c (∑ p ∈ Finset.antidiagonal k, - br (mkC fun a => MvPowerSeries.coeff p.1 (f a)) - (mkC fun b => MvPowerSeries.coeff p.2 (g b))) = - ∑ a, ∑ b, ∑ p ∈ Finset.antidiagonal k, - MvPowerSeries.coeff p.1 (f a) * MvPowerSeries.coeff p.2 (g b) * cstruct a b c := by - rw [map_sum, Finset.sum_congr rfl fun p (_ : p ∈ Finset.antidiagonal k) => hbr p c, - Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.sum_comm - have hRHS : MvPowerSeries.coeff k (brR f g c) = - ∑ a, ∑ b, ∑ p ∈ Finset.antidiagonal k, - MvPowerSeries.coeff p.1 (f a) * MvPowerSeries.coeff p.2 (g b) * cstruct a b c := by - rw [brR, map_sum] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun b _ => ?_ - show MvPowerSeries.coeff k ((MvPowerSeries.C (cstruct a b c) : RSeries) * (f a * g b)) = _ - rw [MvPowerSeries.coeff_C_mul, MvPowerSeries.coeff_mul, Finset.mul_sum] - exact Finset.sum_congr rfl fun p _ => by ring - rw [hLHS, hRHS] - -lemma jetValue_cser (f : Col → RSeries) : - Gluon.jetValue (cser f) = cmat (mkC fun c => MvPowerSeries.constantCoeff (f c)) := by - rw [← coeffMat_zero_eq_jetValue, coeffMat_cser] - rfl - -/-! - -## C. Covariance at the level of matrices of jets - -At series level the field strength and the covariant derivative obey the classical covariance laws. -The only nontrivial input is the Maurer–Cartan structure equation. - --/ - -lemma dMat_add (ν : Lor) (M N : Matrix (Fin 3) (Fin 3) JetRing) : - dMat ν (M + N) = dMat ν M + dMat ν N := - Matrix.ext fun i j => by - show MvPowerSeries.pderiv ℂ ν (M i j + N i j) = _ - rw [map_add] - rfl - -lemma dMat_smul_CI (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - dMat ν ((MvPowerSeries.C Complex.I : JetRing) • M) = - (MvPowerSeries.C Complex.I : JetRing) • dMat ν M := - Matrix.ext fun i j => by - show MvPowerSeries.pderiv ℂ ν ((MvPowerSeries.C Complex.I : JetRing) * M i j) = - (MvPowerSeries.C Complex.I : JetRing) * MvPowerSeries.pderiv ℂ ν (M i j) - rw [Derivation.leibniz, pderiv_C_jet, smul_zero, add_zero, smul_eq_mul] - -/-- The derivative of the gauge jet is the Maurer–Cartan series times the jet. -/ -lemma dMat_coe (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) : - dMat ρ U.1 = mcP U ρ * U.1 := by - rw [mcP, Matrix.mul_assoc, coe_star_mul_self, Matrix.mul_one] - -/-- The derivative of a conjugate. -/ -lemma dMat_conj (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) - (M : Matrix (Fin 3) (Fin 3) JetRing) : - dMat ρ (U.1 * M * star U.1) = - mcP U ρ * (U.1 * M * star U.1) + U.1 * dMat ρ M * star U.1 - - (U.1 * M * star U.1) * mcP U ρ := by - rw [dMat_mul, dMat_mul, dMat_coe, dMat_star_coe] - noncomm_ring - -lemma brJ_swap (M N : Matrix (Fin 3) (Fin 3) JetRing) : brJ M N = -brJ N M := by - rw [brJ, brJ, ← smul_neg, neg_sub] - -lemma brJ_add_left (M M' N : Matrix (Fin 3) (Fin 3) JetRing) : - brJ (M + M') N = brJ M N + brJ M' N := by - rw [brJ, brJ, brJ, ← smul_add] - congr 1 - noncomm_ring - -lemma brJ_add_right (M N N' : Matrix (Fin 3) (Fin 3) JetRing) : - brJ M (N + N') = brJ M N + brJ M N' := by - rw [brJ, brJ, brJ, ← smul_add] - congr 1 - noncomm_ring - -private lemma smul_CI_CI (X : Matrix (Fin 3) (Fin 3) JetRing) : - (MvPowerSeries.C Complex.I : JetRing) • ((MvPowerSeries.C Complex.I : JetRing) • X) = -X := by - rw [smul_smul, ← map_mul, Complex.I_mul_I, map_neg, map_one, neg_smul, one_smul] - -/-- The bracket of two conjugates is the conjugate of the bracket. -/ -lemma brJ_conj (U : specialUnitaryGroup (Fin 3) JetRing) - (M N : Matrix (Fin 3) (Fin 3) JetRing) : - brJ (U.1 * M * star U.1) (U.1 * N * star U.1) = U.1 * brJ M N * star U.1 := by - have key : ∀ P Q : Matrix (Fin 3) (Fin 3) JetRing, - U.1 * P * star U.1 * (U.1 * Q * star U.1) = U.1 * (P * Q) * star U.1 := by - intro P Q - calc U.1 * P * star U.1 * (U.1 * Q * star U.1) - = U.1 * P * (star U.1 * U.1) * Q * star U.1 := by noncomm_ring - _ = U.1 * (P * Q) * star U.1 := by rw [coe_star_mul_self]; noncomm_ring - rw [brJ, brJ, key, key, ← Matrix.sub_mul, ← Matrix.mul_sub, Matrix.mul_smul, Matrix.smul_mul] - -/-- The bracket with the hermitian Maurer–Cartan series, on the left. -/ -lemma brJ_mcH_left (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) - (M : Matrix (Fin 3) (Fin 3) JetRing) : - brJ (mcH U ρ) M = -(mcP U ρ * M - M * mcP U ρ) := by - rw [brJ, mcH, Matrix.smul_mul, Matrix.mul_smul, ← smul_sub, smul_CI_CI] - -/-- The bracket with the hermitian Maurer–Cartan series, on the right. -/ -lemma brJ_mcH_right (U : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) - (M : Matrix (Fin 3) (Fin 3) JetRing) : - brJ M (mcH U ρ) = mcP U ρ * M - M * mcP U ρ := by - rw [brJ_swap, brJ_mcH_left, neg_neg] - -lemma brJ_mcH_mcH (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) : - brJ (mcH U ν) (mcH U μ) = - -((MvPowerSeries.C Complex.I : JetRing) • (mcP U ν * mcP U μ) - - (MvPowerSeries.C Complex.I : JetRing) • (mcP U μ * mcP U ν)) := by - rw [brJ_mcH_left, mcH, Matrix.mul_smul, Matrix.smul_mul] - -/-- **The Maurer–Cartan structure equation.** -/ -lemma dMat_mcP_sub (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) : - dMat ν (mcP U μ) - dMat μ (mcP U ν) = mcP U ν * mcP U μ - mcP U μ * mcP U ν := by - rw [dMat_mcP, dMat_mcP, dMat_comm ν μ U.1] - abel - -/-- **The field strength** of a colour potential, as a matrix of jets. -/ -noncomputable def curvJ (A : ColourPot) (ν μ : Lor) : Matrix (Fin 3) (Fin 3) JetRing := - dMat ν (A.pot μ) - dMat μ (A.pot ν) + brJ (A.pot ν) (A.pot μ) - -/-- **The covariant derivative** on matrices of jets. -/ -noncomputable def covDJ (A : ColourPot) (ρ : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) JetRing := dMat ρ M + brJ (A.pot ρ) M - -/-- **Covariance of the covariant derivative** at series level. -/ -lemma covDJ_conj (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) (ρ : Lor) - (M : Matrix (Fin 3) (Fin 3) JetRing) : - covDJ (actPotC U A) ρ (U.1 * M * star U.1) = U.1 * covDJ A ρ M * star U.1 := by - rw [covDJ, covDJ, actPotC_pot, actPot, dMat_conj, brJ_add_left, brJ_conj, brJ_mcH_left, - Matrix.mul_add, Matrix.add_mul] - abel - -/-- **Covariance of the field strength** at series level. -/ -lemma curvJ_actPotC (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) (ν μ : Lor) : - curvJ (actPotC U A) ν μ = U.1 * curvJ A ν μ * star U.1 := by - have h1 : ∀ σ τ : Lor, dMat σ (actPot U A.pot τ) = - mcP U σ * (U.1 * A.pot τ * star U.1) + U.1 * dMat σ (A.pot τ) * star U.1 - - (U.1 * A.pot τ * star U.1) * mcP U σ + - ((MvPowerSeries.C Complex.I : JetRing) • (dMat σ (dMat τ U.1) * star U.1) - - (MvPowerSeries.C Complex.I : JetRing) • (mcP U τ * mcP U σ)) := by - intro σ τ - rw [actPot, dMat_add, dMat_conj, mcH, dMat_smul_CI, dMat_mcP, smul_sub] - have h2 : brJ (actPot U A.pot ν) (actPot U A.pot μ) = - U.1 * brJ (A.pot ν) (A.pot μ) * star U.1 + - (mcP U μ * (U.1 * A.pot ν * star U.1) - (U.1 * A.pot ν * star U.1) * mcP U μ) - - (mcP U ν * (U.1 * A.pot μ * star U.1) - (U.1 * A.pot μ * star U.1) * mcP U ν) - - ((MvPowerSeries.C Complex.I : JetRing) • (mcP U ν * mcP U μ) - - (MvPowerSeries.C Complex.I : JetRing) • (mcP U μ * mcP U ν)) := by - rw [actPot, actPot, brJ_add_left, brJ_add_right, brJ_add_right, brJ_conj, brJ_mcH_left, - brJ_mcH_right, brJ_mcH_mcH] - abel - rw [curvJ, curvJ, actPotC_pot, h1 ν μ, h1 μ ν, h2, dMat_comm ν μ U.1, - show U.1 * (dMat ν (A.pot μ) - dMat μ (A.pot ν) + brJ (A.pot ν) (A.pot μ)) * star U.1 = - U.1 * dMat ν (A.pot μ) * star U.1 - U.1 * dMat μ (A.pot ν) * star U.1 + - U.1 * brJ (A.pot ν) (A.pot μ) * star U.1 from by noncomm_ring] - abel - -/-! - -## D. The covariant tower inside the ordinary jet algebra - --/ - -/-- The connection colour vector of the ordinary jet algebra. -/ -noncomputable def connVec (μ : Lor) : Col → JetAlgebra := genVec 0 μ - -/-- **The field strength inside the ordinary jet algebra**, in the `HookBianchi` hermitian - convention - `F_νμ = ∂_ν A_μ - ∂_μ A_ν + br(A_ν, A_μ)`. -/ -noncomputable def curvVec (ν μ : Lor) : Col → JetAlgebra := - fun c => jetDeriv ν (connVec μ c) - jetDeriv μ (connVec ν c) + brR (connVec ν) (connVec μ) c - -/-- **The covariant derivative** on colour vectors of the ordinary jet algebra: - `D_ρ X = ∂_ρ X + br(A_ρ, X)`, the `HookBianchi` convention. -/ -noncomputable def covD (ρ : Lor) (X : Col → JetAlgebra) : Col → JetAlgebra := - fun c => jetDeriv ρ (X c) + brR (connVec ρ) X c - -/-- The field strength is antisymmetric. Such relations are *allowed*: the tower consists of - elements of the ordinary algebra, not of independent carrier variables. -/ -lemma curvVec_swap (ν μ : Lor) (c : Col) : curvVec ν μ c = -curvVec μ ν c := by - rw [curvVec, curvVec, brR_swap (connVec ν) (connVec μ) c] - abel - -lemma curvVec_self (ν : Lor) (c : Col) : curvVec ν ν c = 0 := by - rw [curvVec, brR_self, sub_self, add_zero] - -/-- The **ordered** iterated covariant derivative along a tuple of directions. Covariant - derivatives do not commute, so this genuinely depends on the ordering; the published tower - symmetrizes it. -/ -noncomputable def covIter : (r : ℕ) → (Fin r → Lor) → (Col → JetAlgebra) → (Col → JetAlgebra) - | 0, _, X => X - | (n + 1), t, X => covD (t 0) (covIter n (fun i => t i.succ) X) - -@[simp] -lemma covIter_zero (t : Fin 0 → Lor) (X : Col → JetAlgebra) : covIter 0 t X = X := rfl - -@[simp] -lemma covIter_succ (n : ℕ) (t : Fin (n + 1) → Lor) (X : Col → JetAlgebra) : - covIter (n + 1) t X = covD (t 0) (covIter n (fun i => t i.succ) X) := rfl - -/-- **The symmetrized covariant derivative tower `D^r F`**, parametric in the derivative order. -/ -noncomputable def covCurv {r : ℕ} (t : Fin r → Lor) (ν μ : Lor) : Col → JetAlgebra := - fun c => (Nat.factorial r : ℝ)⁻¹ • - ∑ σ : Equiv.Perm (Fin r), covIter r (t ∘ σ) (curvVec ν μ) c - -/-- **The published tower is genuinely symmetric**: it is unchanged by any permutation of the - derivative slots. No such claim is made for the unsymmetrized `covIter`. -/ -lemma covCurv_perm {r : ℕ} (t : Fin r → Lor) (π : Equiv.Perm (Fin r)) (ν μ : Lor) : - covCurv (t ∘ π) ν μ = covCurv t ν μ := by - funext c - rw [covCurv, covCurv] - congr 1 - refine Fintype.sum_equiv (Equiv.mulLeft π) _ _ fun σ => ?_ - rfl - -/-- **Degree-one agreement with the `HookBianchi` pilot**: the first covariant derivative of the - field - strength is `D_ρ F_νμ = ∂_ρ F_νμ + br(A_ρ, F_νμ)`. -/ -lemma covCurv_one (ρ ν μ : Lor) (c : Col) : - covCurv (fun _ : Fin 1 => ρ) ν μ c = - jetDeriv ρ (curvVec ν μ c) + brR (connVec ρ) (curvVec ν μ) c := by - have hall : ∀ σ : Equiv.Perm (Fin 1), - covIter 1 ((fun _ : Fin 1 => ρ) ∘ ⇑σ) (curvVec ν μ) c = - jetDeriv ρ (curvVec ν μ c) + brR (connVec ρ) (curvVec ν μ) c := fun _ => rfl - rw [covCurv, Finset.sum_congr rfl fun σ (_ : σ ∈ Finset.univ) => hall σ, Finset.sum_const, - Finset.card_univ, Fintype.card_perm, Fintype.card_fin] - simp - -/-- The **ordered** iterated covariant derivative on matrices of jets. -/ -noncomputable def covIterJ (A : ColourPot) : (r : ℕ) → (Fin r → Lor) → - Matrix (Fin 3) (Fin 3) JetRing → Matrix (Fin 3) (Fin 3) JetRing - | 0, _, M => M - | (n + 1), t, M => covDJ A (t 0) (covIterJ A n (fun i => t i.succ) M) - -@[simp] -lemma covIterJ_zero (A : ColourPot) (t : Fin 0 → Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - covIterJ A 0 t M = M := rfl - -@[simp] -lemma covIterJ_succ (A : ColourPot) (n : ℕ) (t : Fin (n + 1) → Lor) - (M : Matrix (Fin 3) (Fin 3) JetRing) : - covIterJ A (n + 1) t M = covDJ A (t 0) (covIterJ A n (fun i => t i.succ) M) := rfl - -/-- The image of a colour vector of the ordinary algebra under the series dictionary. -/ -noncomputable def evalCS (A : ColourPot) (X : Col → JetAlgebra) : - Matrix (Fin 3) (Fin 3) JetRing := cser fun c => evalS A (X c) - -lemma evalCS_connVec (A : ColourPot) (μ : Lor) : evalCS A (connVec μ) = A.pot μ := by - refine jetMat_ext fun k => ?_ - rw [evalCS, coeffMat_cser, ← ColourPot.cmat_coeffC] - refine congrArg cmat (Eq.trans (congrArg mkC ?_) (mkC_coordC (A.coeffC k μ))) - funext c - show MvPowerSeries.coeff k (evalS A (connVec μ c)) = coordC c (A.coeffC k μ) - rw [connVec, genVec, evalS_ofGen, sCoordGen_dA, sCoordS, coeff_mkRSeries, add_zero, - div_self (facI_ne_zero k), one_mul] - -lemma evalCS_curvVec (A : ColourPot) (ν μ : Lor) : evalCS A (curvVec ν μ) = curvJ A ν μ := by - have h : (fun c => evalS A (curvVec ν μ c)) = - (fun c => MvPowerSeries.pderiv ℝ ν (evalS A (connVec μ c))) - - (fun c => MvPowerSeries.pderiv ℝ μ (evalS A (connVec ν c))) + - brR (fun c => evalS A (connVec ν c)) (fun c => evalS A (connVec μ c)) := by - funext c - rw [curvVec, map_add, map_sub, evalS_jetDeriv, evalS_jetDeriv, algHom_brR] - rfl - rw [evalCS, h, cser_add, cser_sub, ← dMat_cser, ← dMat_cser, ← brJ_cser, curvJ, - show (cser fun c => evalS A (connVec μ c)) = A.pot μ from evalCS_connVec A μ, - show (cser fun c => evalS A (connVec ν c)) = A.pot ν from evalCS_connVec A ν] - -lemma evalCS_covD (A : ColourPot) (ρ : Lor) (X : Col → JetAlgebra) : - evalCS A (covD ρ X) = covDJ A ρ (evalCS A X) := by - have h : (fun c => evalS A (covD ρ X c)) = - (fun c => MvPowerSeries.pderiv ℝ ρ (evalS A (X c))) + - brR (fun c => evalS A (connVec ρ c)) (fun c => evalS A (X c)) := by - funext c - rw [covD, map_add, evalS_jetDeriv, algHom_brR] - rfl - rw [evalCS, h, cser_add, ← dMat_cser, ← brJ_cser, covDJ, - show (cser fun c => evalS A (connVec ρ c)) = A.pot ρ from evalCS_connVec A ρ] - rfl - -lemma evalCS_covIter (A : ColourPot) : ∀ (r : ℕ) (t : Fin r → Lor) (X : Col → JetAlgebra), - evalCS A (covIter r t X) = covIterJ A r t (evalCS A X) - | 0, _, _ => rfl - | (n + 1), t, X => by - rw [covIter_succ, covIterJ_succ, evalCS_covD, evalCS_covIter A n] - -lemma covIterJ_conj (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : - ∀ (r : ℕ) (t : Fin r → Lor) (M : Matrix (Fin 3) (Fin 3) JetRing), - covIterJ (actPotC U A) r t (U.1 * M * star U.1) = U.1 * covIterJ A r t M * star U.1 - | 0, _, _ => rfl - | (n + 1), t, M => by - rw [covIterJ_succ, covIterJ_succ, covIterJ_conj U A n, covDJ_conj] - -lemma evalCS_actPotC_covIter (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) - (r : ℕ) (t : Fin r → Lor) (ν μ : Lor) : - evalCS (actPotC U A) (covIter r t (curvVec ν μ)) = - U.1 * evalCS A (covIter r t (curvVec ν μ)) * star U.1 := by - rw [evalCS_covIter, evalCS_covIter, evalCS_curvVec, evalCS_curvVec, curvJ_actPotC, - covIterJ_conj] - -/-! - -## E. The residual constant-colour action - --/ - -/-- **Covariance of the ordered covariant tower**, uniformly in the derivative order. -/ -lemma gaugePull_covIter (U : specialUnitaryGroup (Fin 3) JetRing) (r : ℕ) (t : Fin r → Lor) - (ν μ : Lor) (c : Col) : - gaugePull U (covIter r t (curvVec ν μ) c) = - adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r t (curvVec ν μ)) c := by - refine jetAlgebra_funext fun x => ?_ - have hx : potPt (potOf x) = x := potPt_potOf x - have hkey : (mkC fun c' => MvPowerSeries.constantCoeff - (evalS (actPotC U (potOf x)) (covIter r t (curvVec ν μ) c'))) = - adC (JetGaugeGroupI.evalSU (Fin 3) U) - (mkC fun c' => MvPowerSeries.constantCoeff - (evalS (potOf x) (covIter r t (curvVec ν μ) c'))) := by - apply cmat_injective - rw [cmat_adC, ← jetValue_cser, ← jetValue_cser] - show Gluon.jetValue (evalCS (actPotC U (potOf x)) (covIter r t (curvVec ν μ))) = _ - rw [evalCS_actPotC_covIter, Gluon.jetValue_mul, Gluon.jetValue_mul, Gluon.jetValue_star, - jetValue_coe_eq, star_eq_conjTranspose] - rfl - have hL : evalA x (gaugePull U (covIter r t (curvVec ν μ) c)) = - MvPowerSeries.constantCoeff - (evalS (actPotC U (potOf x)) (covIter r t (curvVec ν μ) c)) := by - rw [evalA_gaugePull, constantCoeff_evalS] - rfl - have hR : evalA x (adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r t (curvVec ν μ)) c) = - ∑ c', adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c' * - MvPowerSeries.constantCoeff (evalS (potOf x) (covIter r t (curvVec ν μ) c')) := by - rw [adR, map_sum] - refine Finset.sum_congr rfl fun c' _ => ?_ - rw [map_mul, evalA_algebraMap, constantCoeff_evalS, hx] - have hc := congrArg (coordC c) hkey - rw [coordC_mkC, coordC_adC] at hc - rw [hL, hR, hc] - exact Finset.sum_congr rfl fun c' _ => by rw [coordC_mkC] - -/-- **The arbitrary-order covariance theorem.** Under any jet gauge substitution the symmetrized - covariant curvature tower transforms by the adjoint action of the base-point value of the jet - alone. -/ -lemma gaugePull_covCurv (U : specialUnitaryGroup (Fin 3) JetRing) {r : ℕ} (t : Fin r → Lor) - (ν μ : Lor) (c : Col) : - gaugePull U (covCurv t ν μ c) = - adR (JetGaugeGroupI.evalSU (Fin 3) U) (covCurv t ν μ) c := by - have hL : gaugePull U (covCurv t ν μ c) = - (Nat.factorial r : ℝ)⁻¹ • ∑ σ : Equiv.Perm (Fin r), - adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r (t ∘ σ) (curvVec ν μ)) c := by - rw [covCurv, map_smul, map_sum] - exact congrArg _ (Finset.sum_congr rfl fun σ _ => gaugePull_covIter U r (t ∘ σ) ν μ c) - have hR : adR (JetGaugeGroupI.evalSU (Fin 3) U) (covCurv t ν μ) c = - (Nat.factorial r : ℝ)⁻¹ • ∑ σ : Equiv.Perm (Fin r), - adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r (t ∘ σ) (curvVec ν μ)) c := by - rw [adR, Finset.smul_sum, - show (∑ σ : Equiv.Perm (Fin r), (Nat.factorial r : ℝ)⁻¹ • - adR (JetGaugeGroupI.evalSU (Fin 3) U) (covIter r (t ∘ σ) (curvVec ν μ)) c) = - ∑ σ : Equiv.Perm (Fin r), ∑ c', (Nat.factorial r : ℝ)⁻¹ • - (algebraMap ℝ JetAlgebra (adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c') * - covIter r (t ∘ σ) (curvVec ν μ) c') from - Finset.sum_congr rfl fun σ _ => by rw [adR, Finset.smul_sum], Finset.sum_comm] - refine Finset.sum_congr rfl fun c' _ => ?_ - rw [covCurv, mul_smul_comm, Finset.mul_sum, Finset.smul_sum] - rw [hL, hR] - -/-- Every component of the complete covariant curvature tower. -/ -def covTower : Set JetAlgebra := - {P | ∃ (r : ℕ) (t : Fin r → Lor) (ν μ : Lor) (c : Col), P = covCurv t ν μ c} - -lemma covCurv_mem_covTower {r : ℕ} (t : Fin r → Lor) (ν μ : Lor) (c : Col) : - covCurv t ν μ c ∈ covTower := ⟨r, t, ν, μ, c, rfl⟩ - -/-- **The subalgebra generated by the covariant curvature tower.** -/ -noncomputable def covAlgebra : Subalgebra ℝ JetAlgebra := Algebra.adjoin ℝ covTower - -lemma covCurv_mem_covAlgebra {r : ℕ} (t : Fin r → Lor) (ν μ : Lor) (c : Col) : - covCurv t ν μ c ∈ covAlgebra := Algebra.subset_adjoin (covCurv_mem_covTower t ν μ c) - -lemma gaugePull_covCurv_mem (U : specialUnitaryGroup (Fin 3) JetRing) {r : ℕ} (t : Fin r → Lor) - (ν μ : Lor) (c : Col) : gaugePull U (covCurv t ν μ c) ∈ covAlgebra := by - rw [gaugePull_covCurv, adR] - exact Subalgebra.sum_mem _ fun c' _ => - Subalgebra.mul_mem _ (Subalgebra.algebraMap_mem _ _) (covCurv_mem_covAlgebra t ν μ c') - -/-- **Stability.** The covariant subalgebra is preserved by every jet gauge substitution. -/ -lemma gaugePull_covAlgebra_le (U : specialUnitaryGroup (Fin 3) JetRing) : - covAlgebra.map (gaugePull U) ≤ covAlgebra := by - rw [Subalgebra.map_le] - refine Algebra.adjoin_le ?_ - rintro P ⟨r, t, ν, μ, c, rfl⟩ - exact gaugePull_covCurv_mem U t ν μ c - -/-- **Based jets fix the covariant subalgebra pointwise.** -/ -lemma gaugePull_eq_self_of_based (U : specialUnitaryGroup (Fin 3) JetRing) - (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) {P : JetAlgebra} (hP : P ∈ covAlgebra) : - gaugePull U P = P := by - have h : covAlgebra ≤ AlgHom.equalizer (gaugePull U) (AlgHom.id ℝ JetAlgebra) := by - refine Algebra.adjoin_le ?_ - rintro Q ⟨r, t, ν, μ, c, rfl⟩ - show gaugePull U (covCurv t ν μ c) = AlgHom.id ℝ JetAlgebra (covCurv t ν μ c) - rw [gaugePull_covCurv, hU, adR_one, AlgHom.id_apply] - exact h hP - -/-- **The action on the covariant subalgebra factors through evaluation at the base point.** -/ -lemma gaugePull_eq_of_evalSU_eq (U V : specialUnitaryGroup (Fin 3) JetRing) - (h : JetGaugeGroupI.evalSU (Fin 3) U = JetGaugeGroupI.evalSU (Fin 3) V) - {P : JetAlgebra} (hP : P ∈ covAlgebra) : gaugePull U P = gaugePull V P := by - have hle : covAlgebra ≤ AlgHom.equalizer (gaugePull U) (gaugePull V) := by - refine Algebra.adjoin_le ?_ - rintro Q ⟨r, t, ν, μ, c, rfl⟩ - show gaugePull U (covCurv t ν μ c) = gaugePull V (covCurv t ν μ c) - rw [gaugePull_covCurv, gaugePull_covCurv, h] - exact hle hP - -/-- **On the covariant subalgebra a jet acts as the constant jet of its base-point value.** This - is the easy direction of the eventual completeness theorem. It does *not* say that a tower - element is invariant: a constant colour rotation generally moves it. -/ -lemma gaugePull_eq_ofConstantSU (U : specialUnitaryGroup (Fin 3) JetRing) {P : JetAlgebra} - (hP : P ∈ covAlgebra) : - gaugePull U P = - gaugePull (JetGaugeGroupI.ofConstantSU (Fin 3) (JetGaugeGroupI.evalSU (Fin 3) U)) P := - gaugePull_eq_of_evalSU_eq U _ (SU3Jet.evalSU_ofConstantSU _).symm hP - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean deleted file mode 100644 index 0b8c2c778..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/DiagonalJet.lean +++ /dev/null @@ -1,396 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.BBoson.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons -/-! -# A diagonal based `SU(3)` monomial jet - -## i. Overview - -This file proves that the scalar monomial-exponential gauge jet already constructed for the B boson -can -be embedded diagonally into `specialUnitaryGroup (Fin 3) JetRing` with exact control of its -base-point value and its leading Taylor coefficient. - -The construction is: extract the scalar unitary series `z = exp(-i a X^w)` underlying -`BBoson.JetAlgebra.expUnitary a w hw`, and form - -```text -diagonal (z, star z, 1). -``` - -Unitarity is `z (star z) = 1` entrywise; the determinant is `z (star z) 1 = 1`, so no determinant -theory beyond `Matrix.det_diagonal` is needed. - -## ii. Conventions - -Physlib represents gluon potentials by hermitian matrices, with Maurer–Cartan matrix - -```text -mcMatrix μ A = i (∂_μ A)(0) (A(0))† -``` - -(`Gluon.mcMatrix`), and `BBoson.JetAlgebra.expUnitary a w hw` is the jet of `exp(-i a X^w)`, whose -coefficient at `n • w` is `(-i a)^n / n!`. - -Composing the two: for a degree-one exponent `w = single μ 1` the diagonal jet has - -```text -(∂_μ diag)(0) = (-i a) • diag(1, -1, 0), mcMatrix μ = i (-i a) • diag(1, -1, 0) = a • diag(1, -1, -0). -``` - -So the Maurer–Cartan coefficient is `+a • diag(1, -1, 0)`: the sign is positive in `a`, and the two -factors of `i` cancel. This is recorded in `mcCoeff_diagSU_single`; it is the sign later modules -must -use. - -## iii. Results - -* `diagMat_mem` — the diagonal matrix is special unitary over the jet ring; -* `jetValue_diagMat`, `evalSU_diagSU`, `eval_diagJet` — the jet is based; -* `coeffMat_diagMat_self` — the leading Taylor coefficient is `(-i a) • diag(1, -1, 0)`; -* `coeffMat_diagMat_eq_zero` — all other coefficients below the first multiple of `w` vanish; -* `mcCoeff_diagSU_single`, `mcCoeff_diagSU_single_of_ne` — first-order realizability of an - arbitrary real multiple of `diag(1, -1, 0)` in one chosen Lorentz direction; -* `mcCoeff_diagSU_two`, `coeffMat_diagMat_two` — second-order readiness: for a degree-two exponent - every first-order Maurer–Cartan coefficient vanishes while the coefficient at `w` is controlled. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix MvPowerSeries JetRing - -namespace SU3Jet - -/-! - -## A. The scalar exponential series - -`BBoson.JetAlgebra.expUnitary` packages the series in the `U(1)` slot of `JetGaugeGroupI`. The -series itself is reachable through that projection, so no reimplementation of the coefficientwise -exponential is needed. - --/ - -/-- The scalar unitary power series `exp(-i a X^w)` underlying `BBoson.JetAlgebra.expUnitary`. -/ -noncomputable def expSeries (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : JetRing := - (((BBoson.JetAlgebra.expUnitary a w hw).2.2 : unitary JetRing) : JetRing) - -lemma expSeries_mul_star (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - expSeries a w hw * star (expSeries a w hw) = 1 := - (Unitary.mem_iff.mp (BBoson.JetAlgebra.expUnitary a w hw).2.2.2).2 - -lemma star_mul_expSeries (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - star (expSeries a w hw) * expSeries a w hw = 1 := - (Unitary.mem_iff.mp (BBoson.JetAlgebra.expUnitary a w hw).2.2.2).1 - -/-- The leading Taylor coefficient of the scalar series. -/ -lemma coeff_expSeries_self (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - coeff w (expSeries a w hw) = -(a : ℂ) * Complex.I := by - have h := BBoson.JetAlgebra.coeff_expUnitary_nsmul a hw 1 - rw [one_smul] at h - simpa [expSeries] using h - -/-- The Taylor coefficients of the scalar series vanish away from the multiples of `w`. -/ -lemma coeff_expSeries_of_forall_ne (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) - {k : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : - coeff k (expSeries a w hw) = 0 := - BBoson.JetAlgebra.coeff_expUnitary_of_forall_ne a hw hk - -lemma constantCoeff_expSeries (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - constantCoeff (expSeries a w hw) = 1 := - BBoson.JetAlgebra.constantCoeff_expUnitary a w hw - -/-! - -## B. The diagonal special-unitary jet - --/ - -/-- The diagonal of the ``DiagonalJet`` jet: `(z, star z, 1)`. -/ -noncomputable def diagVec (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : Fin 3 → JetRing := - ![expSeries a w hw, star (expSeries a w hw), 1] - -/-- The diagonal `SU(3)` monomial jet `diag(exp(-i a X^w), exp(i a X^w), 1)`, as a matrix. -/ -noncomputable def diagMat (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - Matrix (Fin 3) (Fin 3) JetRing := - diagonal (diagVec a w hw) - -lemma diagMat_mul_star (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - diagMat a w hw * star (diagMat a w hw) = 1 := by - have h : (fun i => diagVec a w hw i * (star (diagVec a w hw)) i) = - fun _ : Fin 3 => (1 : JetRing) := by - funext i - fin_cases i <;> - simp [diagVec, expSeries_mul_star, star_mul_expSeries] - rw [diagMat, star_eq_conjTranspose, diagonal_conjTranspose, diagonal_mul_diagonal, h, - diagonal_one] - -lemma det_diagMat (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - (diagMat a w hw).det = 1 := by - rw [diagMat, det_diagonal, Fin.prod_univ_three] - simp [diagVec, expSeries_mul_star] - -/-- **Special-unitary membership.** The diagonal monomial jet lies in - `specialUnitaryGroup (Fin 3) JetRing`: unitarity is entrywise `z (star z) = 1`, and the - determinant is the product of the three diagonal entries. -/ -lemma diagMat_mem (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - diagMat a w hw ∈ specialUnitaryGroup (Fin 3) JetRing := - mem_specialUnitaryGroup_iff.mpr - ⟨mem_unitaryGroup_iff.mpr (diagMat_mul_star a w hw), det_diagMat a w hw⟩ - -/-- The diagonal `SU(3)` monomial jet, as an element of the colour jet group. -/ -noncomputable def diagSU (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - specialUnitaryGroup (Fin 3) JetRing := - ⟨diagMat a w hw, diagMat_mem a w hw⟩ - -/-- The diagonal monomial jet as an element of the full jet gauge group, with trivial `SU(2)` and - `U(1)` components. The gluon action depends only on the `SU(3)` component. -/ -noncomputable def diagJet (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : JetGaugeGroupI := - (diagSU a w hw, 1, 1) - -/-! - -## C. Basedness - --/ - -/-- **Basedness.** The value of the diagonal monomial jet at the base point is the identity. -/ -lemma jetValue_diagMat (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - Gluon.jetValue (diagMat a w hw) = 1 := by - have h : (fun i => constantCoeff (diagVec a w hw i)) = fun _ : Fin 3 => (1 : ℂ) := by - funext i - fin_cases i <;> - simp [diagVec, constantCoeff_expSeries] - rw [Gluon.jetValue, diagMat, diagonal_map (map_zero _), h, diagonal_one] - -lemma evalSU_diagSU (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - JetGaugeGroupI.evalSU (Fin 3) (diagSU a w hw) = 1 := by - apply Subtype.ext - rw [Gluon.evalSU_coe] - simpa [diagSU] using jetValue_diagMat a w hw - -/-- The diagonal monomial jet lies in the kernel of evaluation: it is a based gauge jet. -/ -lemma eval_diagJet (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - JetGaugeGroupI.eval (diagJet a w hw) = 1 := by - refine Prod.ext ?_ (Prod.ext ?_ ?_) - · exact evalSU_diagSU a w hw - · exact map_one _ - · exact map_one _ - -/-! - -## D. Taylor coefficients - --/ - -/-- The matrix of Taylor coefficients at a multi-index. At `k = single μ 1` this is - `Gluon.jetDeriv μ`. -/ -noncomputable def coeffMat (k : (Fin 1 ⊕ Fin 3) →₀ ℕ) (A : Matrix (Fin 3) (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) ℂ := - A.map (coeff k) - -lemma jetDeriv_eq_coeffMat (μ : Fin 1 ⊕ Fin 3) (A : Matrix (Fin 3) (Fin 3) JetRing) : - Gluon.jetDeriv μ A = coeffMat (Finsupp.single μ 1) A := rfl - -lemma coeffMat_diagMat (k : (Fin 1 ⊕ Fin 3) →₀ ℕ) (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) - (hw : w ≠ 0) : - coeffMat k (diagMat a w hw) = - diagonal ![coeff k (expSeries a w hw), star (coeff k (expSeries a w hw)), - if k = 0 then 1 else 0] := by - have h : (fun i => coeff k (diagVec a w hw i)) = - ![coeff k (expSeries a w hw), star (coeff k (expSeries a w hw)), - if k = 0 then 1 else 0] := by - funext i - fin_cases i <;> simp [diagVec, coeff_one] - rw [coeffMat, diagMat, diagonal_map (map_zero _), h] - -/-- The traceless hermitian colour direction `diag(1, -1, 0)`. -/ -def colourMat : Matrix (Fin 3) (Fin 3) ℂ := diagonal ![1, -1, 0] - -lemma colourMat_mem : colourMat ∈ selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := by - rw [selfAdjoint.mem_iff] - ext i j - fin_cases i <;> fin_cases j <;> - simp [colourMat, Matrix.star_apply] - -/-- The colour direction `diag(1, -1, 0)` as a hermitian matrix. -/ -noncomputable def colourH : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ) := - ⟨colourMat, colourMat_mem⟩ - -@[simp] -lemma colourH_coe : (colourH : Matrix (Fin 3) (Fin 3) ℂ) = colourMat := rfl - -lemma trace_colourMat : trace colourMat = 0 := by - simp [colourMat, Matrix.trace_diagonal, Fin.sum_univ_three] - -/-- **Leading coefficient.** The Taylor coefficient of the diagonal monomial jet at its own - exponent is `(-i a) • diag(1, -1, 0)`. -/ -lemma coeffMat_diagMat_self (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - coeffMat w (diagMat a w hw) = (-(a : ℂ) * Complex.I) • colourMat := by - have hstar : star (-(a : ℂ) * Complex.I) = (a : ℂ) * Complex.I := by - rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] - ring - rw [coeffMat_diagMat, coeff_expSeries_self, hstar, if_neg hw, colourMat] - ext i j - fin_cases i <;> fin_cases j <;> - simp [Matrix.smul_apply] - -/-- **Vanishing of the lower coefficients.** Away from the nonzero multiples of the exponent the - diagonal monomial jet has no Taylor coefficients: in particular every coefficient of positive - order strictly below `w` vanishes. -/ -lemma coeffMat_diagMat_eq_zero (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) - {k : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hk0 : k ≠ 0) (hk : ∀ n : ℕ, k ≠ n • w) : - coeffMat k (diagMat a w hw) = 0 := by - rw [coeffMat_diagMat, coeff_expSeries_of_forall_ne a w hw hk, star_zero, if_neg hk0] - ext i j - fin_cases i <;> fin_cases j <;> simp - -/-! - -## E. The Maurer–Cartan coefficient - --/ - -lemma mcMatrix_diagMat (μ : Fin 1 ⊕ Fin 3) (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - Gluon.mcMatrix μ (diagMat a w hw) = - Complex.I • coeffMat (Finsupp.single μ 1) (diagMat a w hw) := by - rw [Gluon.mcMatrix, jetValue_diagMat, star_one, Matrix.mul_one, jetDeriv_eq_coeffMat] - -/-- Real scalars act on the colour carrier through the complex scalars. -/ -lemma real_smul_colourMat (r : ℝ) : (r : ℂ) • colourMat = r • colourMat := by - rw [show ((r : ℂ)) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] - -/-- **First-order specialization.** For the degree-one exponent `single μ 1` the Maurer–Cartan - coefficient in the direction `μ` is exactly `a • diag(1, -1, 0)`. The sign is positive: the - factor `-i` in `exp(-i a X^w)` cancels the factor `i` in `Gluon.mcMatrix`. Since `a` ranges over - all reals, every real multiple of the colour direction is realized. -/ -lemma mcCoeff_diagSU_single (a : ℝ) (μ : Fin 1 ⊕ Fin 3) - (hw : (Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0) : - Gluon.mcCoeff (diagSU a (Finsupp.single μ 1) hw) μ = a • colourH := by - apply Subtype.ext - show Gluon.mcMatrix μ (diagMat a (Finsupp.single μ 1) hw) = _ - rw [mcMatrix_diagMat, coeffMat_diagMat_self, smul_smul, - show Complex.I * (-(a : ℂ) * Complex.I) = (a : ℂ) by - rw [show Complex.I * (-(a : ℂ) * Complex.I) = -(Complex.I * Complex.I) * (a : ℂ) by ring, - Complex.I_mul_I] - ring, - real_smul_colourMat] - rfl - -lemma single_ne_zero' (μ : Fin 1 ⊕ Fin 3) : - (Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0 := by - simp [Finsupp.single_eq_zero] - -/-- In the other Lorentz directions the Maurer–Cartan coefficient of the degree-one jet vanishes: - the translation is concentrated in the single direction `μ`. -/ -lemma mcCoeff_diagSU_single_of_ne (a : ℝ) (μ ν : Fin 1 ⊕ Fin 3) (hμν : ν ≠ μ) - (hw : (Finsupp.single μ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0) : - Gluon.mcCoeff (diagSU a (Finsupp.single μ 1) hw) ν = 0 := by - apply Subtype.ext - show Gluon.mcMatrix ν (diagMat a (Finsupp.single μ 1) hw) = _ - have hμν' : μ ≠ ν := fun h => hμν h.symm - have hk : ∀ n : ℕ, (Finsupp.single ν 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ n • Finsupp.single μ 1 := by - intro n h - have h' := DFunLike.congr_fun h ν - rw [Finsupp.single_eq_same, Finsupp.smul_apply, Finsupp.single_eq_of_ne hμν, - smul_eq_mul, Nat.mul_zero] at h' - exact absurd h' one_ne_zero - rw [mcMatrix_diagMat, coeffMat_diagMat_eq_zero a _ hw (single_ne_zero' ν) hk, smul_zero] - rfl - -/-! - -## F. Second-order readiness - -For a degree-two exponent the jet is based *to first order as well*: every first-order -Maurer–Cartan coefficient vanishes, while the Taylor coefficient at the exponent itself is still -`(-i a) • diag(1, -1, 0)`. This is the input a second-order gauge variation needs; the induced -action on a first-order jet algebra is not built here. - --/ - -/-- A degree-two spacetime exponent is nonzero. -/ -lemma add_single_ne_zero (μ ν : Fin 1 ⊕ Fin 3) : - (Finsupp.single μ 1 + Finsupp.single ν 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ 0 := by - intro h - have h' := DFunLike.congr_fun h μ - rw [Finsupp.add_apply, Finsupp.single_eq_same] at h' - simp at h' - -/-- No degree-one multi-index is a multiple of a degree-two one. -/ -lemma single_ne_nsmul_add (ρ μ ν : Fin 1 ⊕ Fin 3) (n : ℕ) : - (Finsupp.single ρ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) ≠ - n • (Finsupp.single μ 1 + Finsupp.single ν 1) := by - intro h - rcases Nat.eq_zero_or_pos n with rfl | hn - · rw [zero_smul] at h - exact single_ne_zero' ρ h - have key : ∀ σ : Fin 1 ⊕ Fin 3, - (Finsupp.single ρ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ = - (Finsupp.single μ n : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ - + (Finsupp.single ν n : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ := by - intro σ - have hσ := DFunLike.congr_fun h σ - simpa [Finsupp.smul_apply, Finsupp.add_apply] using hσ - have hb : ∀ σ : Fin 1 ⊕ Fin 3, (Finsupp.single ρ 1 : (Fin 1 ⊕ Fin 3) →₀ ℕ) σ ≤ 1 := by - intro σ - rw [Finsupp.single_apply] - split <;> simp - have e1 : (Finsupp.single μ n : (Fin 1 ⊕ Fin 3) →₀ ℕ) μ = n := Finsupp.single_eq_same - have e2 : (Finsupp.single ν n : (Fin 1 ⊕ Fin 3) →₀ ℕ) ν = n := Finsupp.single_eq_same - rcases eq_or_ne μ ν with rfl | hne - · have h1 := key μ - have h3 := hb μ - rw [e1] at h1 - omega - · have hne' : ν ≠ μ := fun hc => hne hc.symm - have h1 := key μ - have h2 := key ν - rw [e1, Finsupp.single_eq_of_ne hne] at h1 - rw [e2, Finsupp.single_eq_of_ne hne'] at h2 - have hρμ : ρ = μ := by - by_contra hc - rw [Finsupp.single_eq_of_ne (Ne.symm hc)] at h1 - omega - have hρν : ρ = ν := by - by_contra hc - rw [Finsupp.single_eq_of_ne (Ne.symm hc)] at h2 - omega - exact hne (by rw [← hρμ, hρν]) - -/-- **Second-order readiness, part one.** For a degree-two exponent every first-order - Maurer–Cartan coefficient of the diagonal monomial jet vanishes: the jet is based through first - order, so it acts trivially on the undifferentiated connection. -/ -lemma mcCoeff_diagSU_two (a : ℝ) (μ ν ρ : Fin 1 ⊕ Fin 3) : - Gluon.mcCoeff (diagSU a (Finsupp.single μ 1 + Finsupp.single ν 1) - (add_single_ne_zero μ ν)) ρ = 0 := by - apply Subtype.ext - show Gluon.mcMatrix ρ (diagMat a _ (add_single_ne_zero μ ν)) = _ - rw [mcMatrix_diagMat, - coeffMat_diagMat_eq_zero a _ (add_single_ne_zero μ ν) (single_ne_zero' ρ) - (single_ne_nsmul_add ρ μ ν), - smul_zero] - rfl - -/-- **Second-order readiness, part two.** The selected second-order Taylor coefficient of the - degree-two jet is exactly `(-i a) • diag(1, -1, 0)`, stated directly as a power-series - coefficient. -/ -lemma coeffMat_diagMat_two (a : ℝ) (μ ν : Fin 1 ⊕ Fin 3) : - coeffMat (Finsupp.single μ 1 + Finsupp.single ν 1) - (diagMat a (Finsupp.single μ 1 + Finsupp.single ν 1) (add_single_ne_zero μ ν)) = - (-(a : ℂ) * Complex.I) • colourMat := - coeffMat_diagMat_self a _ (add_single_ne_zero μ ν) - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean deleted file mode 100644 index d3cbcfdf3..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteCompleteness.lean +++ /dev/null @@ -1,317 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.GaugeAction -/-! -# Finite-order completeness - -## i. Overview - -This file proves the two theorems the later modules consume: - -```text -A₁ fixed by based gauge jets = the algebra generated by the field strength -A₁ fixed by the full jet gauge group = the constant-SU(3)-invariant part of that. -``` - -The second does **not** say that every element of the curvature algebra is invariant: a curvature -component is conjugated by a constant colour rotation, and only the globally invariant combinations -survive; an uncontracted curvature component is generally moved by a constant colour rotation. - -## ii. The elimination - -The elimination is **top-down**, as the proof strategy requires. - -1. Order-two based jets (`exists_based_two`) translate a single symmetric derivative coordinate and - fix everything else. `MvPolynomial.notMem_vars_of_forall_aeval_add_eq` therefore removes every - symmetric coordinate from an invariant. -2. On what is left — the subalgebra supported on the connection and curvature coordinates — - order-one based jets (`SU3Jet.exists_based_mcCoeff`, from `ColourBasis`) translate a single - connection - coordinate and fix the curvature coordinates. They do *not* fix the symmetric coordinates, which - is exactly why the elimination must run in this order; the two substitutions agree only on the - subalgebra reached after step 1, and that is enough. -3. What remains is supported on the curvature coordinates, and `MvPolynomial.supported_eq_adjoin_X` - turns that into membership in the curvature subalgebra. - -The polynomial input is `MvPolynomial.notMem_vars_of_forall_aeval_add_eq` together with -`MvPolynomial.supported_eq_adjoin_X`, needed here. The headline theorem -`mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq` of `MvPolynomialTranslation` is **not** used: its -fiberwise common-shift hypothesis matches the abelian field strength, and the nonabelian one is not -a difference of coordinates. - -## iii. Results - -* `covAct` — the gauge action read in the covariant coordinates of `CoordinateChange`; -* `covAct_curv_of_based`, `covAct_conn_of_based`, `covAct_sym_of_based_two` — the three generator - transformation laws the elimination uses; -* `fixed_by_based_eq_adjoin_curv` — the first completeness theorem; -* `fixed_by_jetGroup_eq_invariant_curv` — the full-group theorem. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -namespace SU3Jet - -/-! - -## A. The gauge action in covariant coordinates - --/ - -/-- The local gauge action read through the `CoordinateChange` coordinate change. -/ -noncomputable def covAct (U : specialUnitaryGroup (Fin 3) JetRing) : A₁cov →ₐ[ℝ] A₁cov := - oldToNew.comp ((gaugeAct U).comp newToOld) - -lemma covAct_apply (U : specialUnitaryGroup (Fin 3) JetRing) (Q : A₁cov) : - covAct U Q = oldToNew (gaugeAct U (newToOld Q)) := rfl - -lemma covAct_oldToNew (U : specialUnitaryGroup (Fin 3) JetRing) (P : A₁) : - covAct U (oldToNew P) = oldToNew (gaugeAct U P) := by - rw [covAct_apply, newToOld_oldToNew_apply] - -/-! - -### A.1. The three generator transformation laws - --/ - -/-- **Curvature is covariant.** In the covariant coordinates the curvature block transforms by the - matrix of the adjoint action of the base-point value of the jet. -/ -lemma covAct_curv (U : specialUnitaryGroup (Fin 3) JetRing) (q : CurvPair) (c : Col) : - covAct U (X (CovCoord.curv q c)) = - ∑ c', C (adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c') * X (CovCoord.curv q c') := by - rw [covAct_apply, newToOld_curv, gaugeAct_curvPoly, map_sum] - refine Finset.sum_congr rfl fun c' _ => ?_ - rw [map_mul, algHom_C, ← newToOld_curv q c', oldToNew_newToOld_apply] - -/-- **Based jets fix the curvature coordinates.** -/ -lemma covAct_curv_of_based {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (q : CurvPair) (c : Col) : - covAct U (X (CovCoord.curv q c)) = X (CovCoord.curv q c) := by - rw [covAct_curv, hU] - exact adP_one (fun c' => X (CovCoord.curv q c')) c - -/-- **Order-one based jets translate the connection coordinates.** -/ -lemma covAct_conn_of_based {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (μ : Lor) (c : Col) : - covAct U (X (CovCoord.conn μ c)) = X (CovCoord.conn μ c) + C (coordC c (mcC U μ)) := by - rw [covAct_apply, newToOld_conn, gaugeAct_conn, hU, map_add, algHom_constP] - congr 1 - rw [adP_one] - exact oldToNew_conn μ c - -/-- On a jet based to order one the second Maurer–Cartan coefficient is symmetric: this is - `mc2C_sub` with a vanishing first coefficient. -/ -lemma mc2C_symm_of_based {U : specialUnitaryGroup (Fin 3) JetRing} (hm : ∀ ρ, mcC U ρ = 0) - (ν μ : Lor) : mc2C U ν μ = mc2C U μ ν := by - have h := mc2C_sub U ν μ - rw [hm ν, map_zero, LinearMap.zero_apply, neg_zero, sub_eq_zero] at h - exact h - -/-- **Order-two based jets translate the ordinary derivative coordinates by a constant.** This is - the hypothesis of "Why the triangular strategy works": no field-dependent commutator survives. -/ -lemma gaugeAct_der_of_based_two {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (hm : ∀ ρ, mcC U ρ = 0) (ν μ : Lor) (c : Col) : - gaugeAct U (X (Coord.der ν μ c)) = X (Coord.der ν μ c) + C (coordC c (mc2C U ν μ)) := by - rw [gaugeAct_der, hU, adP_one, hm ν, constP_zero, brP_zero_left, sub_zero] - rfl - -/-- **Order-two based jets translate the symmetric derivative coordinates by a constant.** -/ -lemma covAct_sym_of_based_two {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (hm : ∀ ρ, mcC U ρ = 0) (ν μ : Lor) (c : Col) : - covAct U (X (CovCoord.sym s(ν, μ) c)) = - X (CovCoord.sym s(ν, μ) c) + C (coordC c (mc2C U ν μ)) := by - have ht : mc2C U μ ν = mc2C U ν μ := (mc2C_symm_of_based hm ν μ).symm - have key : gaugeAct U (symOld c s(ν, μ)) = - symOld c s(ν, μ) + C (coordC c (mc2C U ν μ)) := by - rw [symOld_mk, map_smul, map_add, gaugeAct_der_of_based_two hU hm, - gaugeAct_der_of_based_two hU hm, ht] - module - rw [covAct_apply, newToOld_sym, key, map_add, algHom_C, - show oldToNew (symOld c s(ν, μ)) = X (CovCoord.sym s(ν, μ) c) from by - rw [← newToOld_sym s(ν, μ) c, oldToNew_newToOld_apply]] - -/-! - -## B. Realizing the two translations in coordinates - --/ - -lemma coordC_smul_basis (r : ℝ) (c₀ c : Col) : - coordC c (r • colourBasis c₀) = if c = c₀ then r else 0 := by - rw [map_smul, smul_eq_mul, coordC_apply, Basis.repr_self_apply] - by_cases h : c = c₀ - · rw [if_pos h, if_pos h.symm, mul_one] - · rw [if_neg h, if_neg fun hc => h hc.symm, mul_zero] - -/-- **Order-one realizability, in colour coordinates.** From `SU3Jet.exists_based_mcCoeff`. -/ -lemma exists_based_one (μ₀ : Lor) (c₀ : Col) (r : ℝ) : - ∃ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 ∧ - ∀ ν, mcC U ν = if ν = μ₀ then r • colourBasis c₀ else 0 := by - obtain ⟨U, hU, hmc⟩ := SU3Jet.exists_based_mcCoeff μ₀ (r • colourBasis c₀) - refine ⟨U, hU, fun ν => ?_⟩ - by_cases h : ν = μ₀ - · rw [if_pos h] - exact Subtype.ext (by rw [show (mcC U ν).1 = Gluon.mcCoeff U ν from rfl, hmc ν, if_pos h]) - · rw [if_neg h] - exact Subtype.ext (by rw [show (mcC U ν).1 = Gluon.mcCoeff U ν from rfl, hmc ν, if_neg h]; rfl) - -/-! - -## C. The elimination - --/ - -private lemma ite_sym (s s' : Sym2 Lor) (c c' : Col) (r : ℝ) : - (if s = s' then (if c = c' then r else 0) else 0) = - if (CovCoord.sym s c : CovCoord) = CovCoord.sym s' c' then r else 0 := by - by_cases h1 : s = s' <;> by_cases h2 : c = c' <;> simp_all - -private lemma ite_conn (μ μ' : Lor) (c c' : Col) (r : ℝ) : - (if μ = μ' then (if c = c' then r else 0) else 0) = - if (CovCoord.conn μ c : CovCoord) = CovCoord.conn μ' c' then r else 0 := by - by_cases h1 : μ = μ' <;> by_cases h2 : c = c' <;> simp_all - -/-- **The first completeness theorem.** The elements of the first-order gluon jet algebra fixed by - every *based* gauge jet are exactly the polynomials in the field strength. - - The forward direction is the top-down elimination: order-two based jets remove the symmetric - derivative coordinates, then order-one based jets remove the connection coordinates. The reverse - direction is `gaugeAct_curvPoly` at `u = 1`. -/ -lemma fixed_by_based_eq_adjoin_curv : - {P : A₁ | ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugeAct U P = P} = - (Algebra.adjoin ℝ (Set.range fun q : Lor × Lor × Col => curvPoly q.1 q.2.1 q.2.2) : - Set A₁) := by - classical - ext P - simp only [Set.mem_setOf_eq, SetLike.mem_coe] - constructor - · intro hP - have hQfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → covAct U (oldToNew P) = oldToNew P := by - intro U hU - rw [covAct_oldToNew, hP U hU] - -- Step 1: no symmetric derivative coordinates. - have hstep1 : ∀ (s : Sym2 Lor) (c : Col), CovCoord.sym s c ∉ (oldToNew P).vars := by - intro s c₀ - refine MvPolynomial.notMem_vars_of_forall_aeval_add_eq _ (CovCoord.sym s c₀) fun r => ?_ - obtain ⟨U, hU, hm, hmc2⟩ := exists_based_two s c₀ r - have hagree : covAct U = - aeval (fun i => X i + C (if i = CovCoord.sym s c₀ then r else 0)) := by - refine algHom_ext fun i => ?_ - rw [aeval_X] - cases i with - | conn μ c => rw [covAct_conn_of_based hU, hm μ]; simp - | sym s' c => - induction s' using Sym2.ind with - | _ ν μ => - rw [covAct_sym_of_based_two hU hm, hmc2 ν μ] - by_cases h1 : s(ν, μ) = s - · rw [if_pos h1, coordC_smul_basis, ← ite_sym, if_pos h1] - · rw [if_neg h1, map_zero, ← ite_sym, if_neg h1] - | curv q c => rw [covAct_curv_of_based hU]; simp - rw [← hagree] - exact hQfix U hU - -- Step 2: no connection coordinates. - have hsupp1 : oldToNew P ∈ - MvPolynomial.supported ℝ {i : CovCoord | ∀ s c, i ≠ CovCoord.sym s c} := by - rw [mem_supported] - intro i hi s c - rintro rfl - exact hstep1 s c (Finset.mem_coe.mp hi) - rw [supported_eq_adjoin_X] at hsupp1 - have hstep2 : ∀ (μ : Lor) (c : Col), CovCoord.conn μ c ∉ (oldToNew P).vars := by - intro μ₀ c₀ - refine MvPolynomial.notMem_vars_of_forall_aeval_add_eq _ (CovCoord.conn μ₀ c₀) fun r => ?_ - obtain ⟨U, hU, hmc⟩ := exists_based_one μ₀ c₀ r - have hmem : oldToNew P ∈ AlgHom.equalizer (covAct U) - (aeval (fun i => X i + C (if i = CovCoord.conn μ₀ c₀ then r else 0))) := by - refine Algebra.adjoin_le ?_ hsupp1 - rintro _ ⟨i, hi, rfl⟩ - show covAct U (X i) = _ - rw [aeval_X] - cases i with - | conn μ c => - rw [covAct_conn_of_based hU, hmc μ] - by_cases h1 : μ = μ₀ - · rw [if_pos h1, coordC_smul_basis, ← ite_conn, if_pos h1] - · rw [if_neg h1, map_zero, ← ite_conn, if_neg h1] - | sym s c => exact absurd rfl (hi s c) - | curv q c => rw [covAct_curv_of_based hU]; simp - have heq : covAct U (oldToNew P) = - aeval (fun i => X i + C (if i = CovCoord.conn μ₀ c₀ then r else 0)) (oldToNew P) := hmem - rw [← heq] - exact hQfix U hU - -- Step 3: what is left is supported on the curvature coordinates. - have hsupp2 : oldToNew P ∈ - MvPolynomial.supported ℝ {i : CovCoord | ∃ q c, i = CovCoord.curv q c} := by - rw [mem_supported] - intro i hi - cases i with - | conn μ c => exact absurd (Finset.mem_coe.mp hi) (hstep2 μ c) - | sym s c => exact absurd (Finset.mem_coe.mp hi) (hstep1 s c) - | curv q c => exact ⟨q, c, rfl⟩ - rw [supported_eq_adjoin_X] at hsupp2 - have hmem2 : newToOld (oldToNew P) ∈ - (Algebra.adjoin ℝ (X '' {i : CovCoord | ∃ q c, i = CovCoord.curv q c})).map newToOld := - Subalgebra.mem_map.mpr ⟨oldToNew P, hsupp2, rfl⟩ - rw [AlgHom.map_adjoin, newToOld_oldToNew_apply] at hmem2 - refine Algebra.adjoin_mono ?_ hmem2 - rintro _ ⟨_, ⟨i, ⟨q, c, rfl⟩, rfl⟩, rfl⟩ - exact ⟨(q.1.1, q.1.2, c), (newToOld_curv q c).symm⟩ - · intro hP U hU - have hmem : P ∈ AlgHom.equalizer (gaugeAct U) (AlgHom.id ℝ A₁) := by - refine Algebra.adjoin_le ?_ hP - rintro _ ⟨⟨ν, μ, c⟩, rfl⟩ - show gaugeAct U (curvPoly ν μ c) = _ - rw [gaugeAct_curvPoly, hU] - exact adP_one (curvPoly ν μ) c - exact hmem - -/-- **The full-group theorem.** The elements of the first-order gluon jet algebra fixed by the - *whole* jet gauge group are the constant-`SU(3)`-invariant elements of the curvature algebra. - - Membership in the curvature algebra alone is not enough: an uncontracted field strength is only - covariant. The reverse inclusion works because on the curvature subalgebra an arbitrary gauge jet - acts exactly as the constant jet of its base-point value. -/ -lemma fixed_by_jetGroup_eq_invariant_curv : - {P : A₁ | ∀ U : specialUnitaryGroup (Fin 3) JetRing, gaugeAct U P = P} = - {P : A₁ | - P ∈ Algebra.adjoin ℝ (Set.range fun q : Lor × Lor × Col => curvPoly q.1 q.2.1 q.2.2) ∧ - ∀ g : specialUnitaryGroup (Fin 3) ℂ, - gaugeAct (JetGaugeGroupI.ofConstantSU (Fin 3) g) P = P} := by - ext P - simp only [Set.mem_setOf_eq] - constructor - · intro hP - refine ⟨?_, fun g => hP _⟩ - have hbased : P ∈ {P : A₁ | ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugeAct U P = P} := fun U _ => hP U - rw [fixed_by_based_eq_adjoin_curv] at hbased - exact hbased - · rintro ⟨hadj, hconst⟩ U - have hmem : P ∈ AlgHom.equalizer (gaugeAct U) - (gaugeAct (JetGaugeGroupI.ofConstantSU (Fin 3) (JetGaugeGroupI.evalSU (Fin 3) U))) := by - refine Algebra.adjoin_le ?_ hadj - rintro _ ⟨⟨ν, μ, c⟩, rfl⟩ - show gaugeAct U (curvPoly ν μ c) = _ - rw [gaugeAct_curvPoly, gaugeAct_curvPoly, SU3Jet.evalSU_ofConstantSU] - have heq : gaugeAct U P = - gaugeAct (JetGaugeGroupI.ofConstantSU (Fin 3) (JetGaugeGroupI.evalSU (Fin 3) U)) P := hmem - rw [heq, hconst] - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean deleted file mode 100644 index 093359e08..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/FiniteHeight.lean +++ /dev/null @@ -1,962 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.Triangular -/-! -# Finite-height completeness - -## i. Overview - -This file proves the uniform finite-height completeness theorem: for every derivative height `N`, an -ordinary jet polynomial of height at most `N` that is fixed by every *based* `SU(3)` gauge jet lies -in the truncated algebra generated by those symmetrized covariant curvature derivatives whose -leading connection derivative fits inside that height, and conversely. - -## ii. Why the elimination needs a coordinate change - -A based jet translates *every* ordinary generator of one fibre `(s + ∂_μ, c)` by the *same* -constant (`HighestLayer` `gaugeSubstGen_eq_add_layerShift`), so no single ordinary variable can be -removed. -The fibrewise translation theorem `MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq` -is *not* usable here: its hypothesis quantifies over every fibre of the representative map, -including the singleton fibres of the strictly lower generators, and those are provably *fixed*, -not translated. Moving the lower generators into the coefficient ring does not help either, since -the theorem then asks for translations by arbitrary coefficient polynomials whereas a gauge jet -translates by a constant. `FiniteHeight` therefore uses `FiniteCompleteness`'s route — -`notMem_vars_of_forall_aeval_add_eq` -together with `supported_eq_adjoin_X` — one representative variable at a time, inside the -covariant coordinate system built below. - -## iii. The covariant coordinate system - -`linSubst` is the fibrewise **linear** change of variables that puts the weighted symmetric -average `symConn w c` in the distinguished slot of each fibre and the hook difference in every -other supported slot. It is invertible, with the explicit inverse `invLinSubst` read off -`Triangular`'s -weighted-average identity, so the resulting family is genuinely algebraically independent: no -independence hypothesis is assumed anywhere. Composing with `Triangular`'s nonlinear -`triangularSubst` -gives `covSubst`, whose generator images are exactly - -```text -covSubst (∂_s A_μ) = symConn (s + ∂_μ) c if μ is the distinguished direction - = covHook (s + ∂_μ, μ) c otherwise. -``` - -In these coordinates a jet based through order `r` - -* fixes every hook coordinate, at *every* derivative degree (`CovariantTower`, since `covHook ∈ - covAlgebra`); -* fixes `symConn w c` for `lorDeg w ≤ r`; -* translates `symConn w c` for `lorDeg w = r + 1` by an arbitrary independently realizable - constant (`HighestLayer`). - -The elimination is then one descending sweep removing the symmetric coordinates layer by layer. -No coefficient is ever extracted, and no global commutation law between `triangularSubst` and -`gaugePull` is asserted. - -## iv. Results - -* `heightAlgebra`, `covAlgebraAt` — the finite-height carrier and the truncated covariant algebra; -* `linSubst`, `invLinSubst`, `linSubst_injective` — the invertible fibrewise linear change; -* `covSubst`, `covCoordGen`, `covCoordHom_injective` — the covariant coordinate system; -* `heightAlgebra_le_covCoordAlgebra` — every ordinary generator is a polynomial in the covariant - coordinates of its own derivative degree; -* `gaugePull_covCoordGen_of_isSymSlot`, `gaugePull_covCoordGen_of_not_isSymSlot` — the based - action in covariant coordinates; -* `fixed_by_based_height_eq_covAlgebraAt` — the headline finite-height completeness theorem. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -namespace SU3Jet - -/-! - -## A. The finite derivative height carrier - --/ - -/-- The ordinary generators whose derivative degree is at most `N`. -/ -def heightGen (N : ℕ) : Set JetAlgebra := - {P | ∃ g : JetGenerators, genDeg g ≤ N ∧ P = ofGen g} - -/-- **The finite-height ordinary jet algebra**: the subalgebra generated by the connection and its -ordinary derivatives up to derivative degree `N`. -/ -noncomputable def heightAlgebra (N : ℕ) : Subalgebra ℝ JetAlgebra := - Algebra.adjoin ℝ (heightGen N) - -lemma ofGen_mem_heightAlgebra {N : ℕ} {g : JetGenerators} (hg : genDeg g ≤ N) : - ofGen g ∈ heightAlgebra N := Algebra.subset_adjoin ⟨g, hg, rfl⟩ - -lemma heightAlgebra_mono {M N : ℕ} (h : M ≤ N) : heightAlgebra M ≤ heightAlgebra N := - Algebra.adjoin_mono fun _ hP => by - obtain ⟨g, hg, hPg⟩ := hP - exact ⟨g, hg.trans h, hPg⟩ - -private lemma jetDeriv_mem_heightAlgebra_aux (nu : Lor) {N : ℕ} {P : JetAlgebra} - (hP : P ∈ Algebra.adjoin ℝ (heightGen N)) : jetDeriv nu P ∈ heightAlgebra (N + 1) := by - induction hP using Algebra.adjoin_induction with - | mem P hP => - obtain ⟨g, hg, rfl⟩ := hP - rw [jetDeriv_ofGen] - exact ofGen_mem_heightAlgebra (by rw [genDeg_shift]; omega) - | algebraMap r => - rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] - exact zero_mem _ - | add x y _ _ hx hy => rw [map_add]; exact add_mem hx hy - | mul x y hxm hym hx hy => - rw [jetDeriv_mul] - exact add_mem (mul_mem hx (heightAlgebra_mono (Nat.le_succ N) hym)) - (mul_mem (heightAlgebra_mono (Nat.le_succ N) hxm) hy) - -/-- The total derivative raises the derivative height by exactly one. -/ -lemma jetDeriv_mem_heightAlgebra (nu : Lor) {N : ℕ} {P : JetAlgebra} - (hP : P ∈ heightAlgebra N) : jetDeriv nu P ∈ heightAlgebra (N + 1) := - jetDeriv_mem_heightAlgebra_aux nu hP - -lemma brR_mem_heightAlgebra {N : ℕ} {p q : Col → JetAlgebra} - (hp : ∀ c, p c ∈ heightAlgebra N) (hq : ∀ c, q c ∈ heightAlgebra N) (c : Col) : - brR p q c ∈ heightAlgebra N := by - rw [brR] - exact sum_mem fun a _ => sum_mem fun b _ => - mul_mem (Subalgebra.algebraMap_mem _ _) (mul_mem (hp a) (hq b)) - -lemma connVec_mem_heightAlgebra (N : ℕ) (mu : Lor) (c : Col) : - connVec mu c ∈ heightAlgebra N := - ofGen_mem_heightAlgebra (by - show lorDeg (0 : DIdx) ≤ N - rw [(lorDeg_eq_zero_iff 0).2 rfl] - omega) - -lemma curvVec_mem_heightAlgebra (nu mu : Lor) (c : Col) : - curvVec nu mu c ∈ heightAlgebra 1 := by - rw [curvVec] - refine add_mem (sub_mem (jetDeriv_mem_heightAlgebra nu (connVec_mem_heightAlgebra 0 mu c)) - (jetDeriv_mem_heightAlgebra mu (connVec_mem_heightAlgebra 0 nu c))) ?_ - exact brR_mem_heightAlgebra (connVec_mem_heightAlgebra 1 nu) (connVec_mem_heightAlgebra 1 mu) c - -lemma covD_mem_heightAlgebra (rho : Lor) {N : ℕ} {X : Col → JetAlgebra} - (hX : ∀ c, X c ∈ heightAlgebra N) (c : Col) : covD rho X c ∈ heightAlgebra (N + 1) := by - rw [covD] - exact add_mem (jetDeriv_mem_heightAlgebra rho (hX c)) - (brR_mem_heightAlgebra (connVec_mem_heightAlgebra (N + 1) rho) - (fun c' => heightAlgebra_mono (Nat.le_succ N) (hX c')) c) - -lemma covIter_mem_heightAlgebra (r : ℕ) (t : Fin r → Lor) (nu mu : Lor) (c : Col) : - covIter r t (curvVec nu mu) c ∈ heightAlgebra (r + 1) := by - induction r generalizing c with - | zero => exact curvVec_mem_heightAlgebra nu mu c - | succ n ih => - rw [covIter_succ] - exact covD_mem_heightAlgebra (t 0) (fun c' => ih (fun i => t i.succ) c') c - -/-- The symmetrized covariant curvature derivative `D^r F` has derivative height `r + 1`. -/ -lemma covCurv_mem_heightAlgebra {r : ℕ} (t : Fin r → Lor) (nu mu : Lor) (c : Col) : - covCurv t nu mu c ∈ heightAlgebra (r + 1) := by - rw [covCurv] - refine Subalgebra.smul_mem _ ?_ _ - exact sum_mem fun sigma _ => covIter_mem_heightAlgebra r (t ∘ sigma) nu mu c - -/-- **Every ordinary jet polynomial has a finite derivative height.** The bound is the largest -derivative degree occurring among its polynomial variables. -/ -lemma mem_heightAlgebra_vars_sup (P : JetAlgebra) : - P ∈ heightAlgebra ((toPoly P).vars.sup genDeg) := by - classical - have hsupp : toPoly P ∈ - MvPolynomial.supported ℝ {g : JetGenerators | genDeg g ≤ (toPoly P).vars.sup genDeg} := by - rw [mem_supported] - intro g hg - show genDeg g ≤ (toPoly P).vars.sup genDeg - exact Finset.le_sup (Finset.mem_coe.mp hg) - rw [supported_eq_adjoin_X] at hsupp - have hmem : toPoly.symm (toPoly P) ∈ - (Algebra.adjoin ℝ - (X '' {g : JetGenerators | genDeg g ≤ (toPoly P).vars.sup genDeg})).map - toPoly.symm.toAlgHom := Subalgebra.mem_map.mpr ⟨_, hsupp, rfl⟩ - rw [AlgHom.map_adjoin, AlgEquiv.symm_apply_apply] at hmem - refine Algebra.adjoin_mono ?_ hmem - rintro _ ⟨_, ⟨g, hg, rfl⟩, rfl⟩ - exact ⟨g, hg, toPoly_symm_X g⟩ - -lemma exists_mem_heightAlgebra (P : JetAlgebra) : ∃ N, P ∈ heightAlgebra N := - ⟨_, mem_heightAlgebra_vars_sup P⟩ - -/-! - -## B. The truncated covariant curvature algebra - --/ - -/-- The components of the covariant curvature tower whose leading ordinary connection derivative -has derivative degree at most `N`. -/ -def covTowerAt (N : ℕ) : Set JetAlgebra := - {P | ∃ (r : ℕ) (t : Fin r → Lor) (nu mu : Lor) (c : Col), r + 1 ≤ N ∧ P = covCurv t nu mu c} - -/-- **The truncated covariant curvature algebra** available inside derivative height `N`. -/ -noncomputable def covAlgebraAt (N : ℕ) : Subalgebra ℝ JetAlgebra := Algebra.adjoin ℝ (covTowerAt N) - -lemma covCurv_mem_covAlgebraAt {N r : ℕ} (hr : r + 1 ≤ N) (t : Fin r → Lor) (nu mu : Lor) - (c : Col) : covCurv t nu mu c ∈ covAlgebraAt N := - Algebra.subset_adjoin ⟨r, t, nu, mu, c, hr, rfl⟩ - -lemma covAlgebraAt_mono {M N : ℕ} (h : M ≤ N) : covAlgebraAt M ≤ covAlgebraAt N := - Algebra.adjoin_mono fun _ hP => by - obtain ⟨r, t, nu, mu, c, hr, hPc⟩ := hP - exact ⟨r, t, nu, mu, c, hr.trans h, hPc⟩ - -lemma covAlgebraAt_le_covAlgebra (N : ℕ) : covAlgebraAt N ≤ covAlgebra := by - refine Algebra.adjoin_le ?_ - rintro P ⟨r, t, nu, mu, c, _, rfl⟩ - exact covCurv_mem_covAlgebra t nu mu c - -lemma covAlgebraAt_le_heightAlgebra (N : ℕ) : covAlgebraAt N ≤ heightAlgebra N := by - refine Algebra.adjoin_le ?_ - rintro P ⟨r, t, nu, mu, c, hr, rfl⟩ - exact heightAlgebra_mono hr (covCurv_mem_heightAlgebra t nu mu c) - -lemma covHook_mem_covAlgebra (i : AllHookIdx) (c : Col) : covHook i c ∈ covAlgebra := - covCurv_mem_covAlgebra _ _ _ _ - -lemma covHook_mem_covAlgebraAt {N : ℕ} (i : AllHookIdx) (hi : lorDeg i.w ≤ N + 1) (c : Col) : - covHook i c ∈ covAlgebraAt N := by - refine covCurv_mem_covAlgebraAt ?_ (didxTuple (hookRest i)) (layerDir i.w) i.mu c - have h1 := didxList_length (hookRest i) - have h2 := lorDeg_hookRest i - omega - -/-! - -## C. Symmetric and hook slots - -Each nonzero total multi-index `w` labels one fibre of ordinary generators, namely the supported -components `∂_(w - ∂_ν) A_ν`. The slot of the distinguished direction `layerDir w` is where the -fully symmetric coordinate will live; every other supported slot carries a hook coordinate. - --/ - -/-- The generator slot carrying the fully symmetric coordinate of the fibre `w`. -/ -noncomputable def symGen (w : DIdx) (c : Col) : JetGenerators := - .dA (layerPred w) (layerDir w) c - -lemma layerPred_eq_predAt (w : DIdx) : layerPred w = predAt w (layerDir w) := rfl - -lemma genDeg_symGen (w : DIdx) (c : Col) : genDeg (symGen w c) = lorDeg (layerPred w) := rfl - -/-- The fibre of a generator: the total multi-index obtained by adjoining its connection -direction. -/ -noncomputable def genFibre : JetGenerators → DIdx - | .dA s mu _ => s + Finsupp.single mu 1 - -/-- The colour index of a generator. -/ -def genCol : JetGenerators → Col - | .dA _ _ c => c - -@[simp] -lemma genFibre_dA (s : DIdx) (mu : Lor) (c : Col) : - genFibre (.dA s mu c) = s + Finsupp.single mu 1 := rfl - -@[simp] -lemma genCol_dA (s : DIdx) (mu : Lor) (c : Col) : genCol (.dA s mu c) = c := rfl - -lemma genFibre_ne_zero (g : JetGenerators) : genFibre g ≠ 0 := by - obtain ⟨s, mu, c⟩ := g - exact total_add_single_ne_zero s mu - -lemma lorDeg_genFibre (g : JetGenerators) : lorDeg (genFibre g) = genDeg g + 1 := by - obtain ⟨s, mu, c⟩ := g - rw [genFibre_dA, lorDeg_add, lorDeg_single, genDeg_dA] - -lemma genFibre_symGen {w : DIdx} (hw : w ≠ 0) (c : Col) : genFibre (symGen w c) = w := - layerPred_add_single hw - -lemma genCol_symGen (w : DIdx) (c : Col) : genCol (symGen w c) = c := rfl - -/-- A generator is a **symmetric slot** when its connection direction is the distinguished -direction of its fibre. -/ -noncomputable def IsSymSlot : JetGenerators → Prop - | .dA s mu _ => mu = layerDir (s + Finsupp.single mu 1) - -@[simp] -lemma isSymSlot_dA (s : DIdx) (mu : Lor) (c : Col) : - IsSymSlot (.dA s mu c) ↔ mu = layerDir (s + Finsupp.single mu 1) := Iff.rfl - -lemma isSymSlot_symGen {w : DIdx} (hw : w ≠ 0) (c : Col) : IsSymSlot (symGen w c) := by - show layerDir w = layerDir (layerPred w + Finsupp.single (layerDir w) 1) - rw [layerPred_add_single hw] - -lemma eq_symGen_of_isSymSlot {g : JetGenerators} (hg : IsSymSlot g) : - g = symGen (genFibre g) (genCol g) := by - obtain ⟨s, mu, c⟩ := g - have h : mu = layerDir (s + Finsupp.single mu 1) := hg - show JetGenerators.dA s mu c = - JetGenerators.dA (layerPred (s + Finsupp.single mu 1)) - (layerDir (s + Finsupp.single mu 1)) c - rw [← h, layerPred_eq_predAt, ← h, predAt_add_single_eq] - -lemma symGen_inj {w w' : DIdx} (hw : w ≠ 0) (hw' : w' ≠ 0) {c c' : Col} - (h : symGen w c = symGen w' c') : w = w' ∧ c = c' := by - have hf : genFibre (symGen w c) = genFibre (symGen w' c') := by rw [h] - rw [genFibre_symGen hw, genFibre_symGen hw'] at hf - refine ⟨hf, ?_⟩ - have := congrArg genCol h - rwa [genCol_symGen, genCol_symGen] at this - -/-- The symmetric slot value of the fibre `w`. -/ -noncomputable def symSlot (w : DIdx) (c : Col) : JetAlgebra := totalComponent w (layerDir w) c - -/-- The hook slot value of the fibre `w` in the direction `nu`; it is zero in the distinguished -direction. -/ -noncomputable def hookSlot (w : DIdx) (nu : Lor) (c : Col) : JetAlgebra := - if nu = layerDir w then 0 else totalComponent w nu c - -/-- The weighted average of the hook slots of a fibre; this is the correction appearing in - `Triangular`'s -explicit inverse coordinate formula. -/ -noncomputable def slotAverage (w : DIdx) (c : Col) : JetAlgebra := - (lorDeg w : ℝ)⁻¹ • ∑ nu : Lor, (w nu : ℝ) • hookSlot w nu c - -lemma symSlot_eq_ofGen (w : DIdx) (c : Col) : symSlot w c = ofGen (symGen w c) := rfl - -lemma lorDeg_cast_ne_zero {w : DIdx} (hw : w ≠ 0) : (lorDeg w : ℝ) ≠ 0 := by - exact_mod_cast Nat.ne_of_gt ((lorDeg_pos_iff w).2 hw) - -lemma sum_coeff_eq_lorDeg (w : DIdx) : ∑ nu : Lor, (w nu : ℝ) = (lorDeg w : ℝ) := by - rw [lorDeg] - norm_cast - -lemma sum_weighted_hookSlot {w : DIdx} (hw : w ≠ 0) (c : Col) : - ∑ nu : Lor, (w nu : ℝ) • hookSlot w nu c = (lorDeg w : ℝ) • slotAverage w c := by - rw [slotAverage, smul_smul, mul_inv_cancel₀ (lorDeg_cast_ne_zero hw), one_smul] - -/-! - -## D. The invertible fibrewise linear coordinate change - --/ - -/-- Generator form of the fibrewise linear change of variables: the distinguished slot of a fibre -receives the weighted symmetric average, every other slot its hook difference. -/ -noncomputable def linCoordGen : JetGenerators → JetAlgebra - | .dA s mu c => - if mu = layerDir (s + Finsupp.single mu 1) then symConn (s + Finsupp.single mu 1) c - else - totalComponent (s + Finsupp.single mu 1) mu c - - totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c - -/-- Generator form of the inverse fibrewise linear change of variables, read off - `Triangular`'s explicit -weighted-average inverse. -/ -noncomputable def invLinCoordGen : JetGenerators → JetAlgebra - | .dA s mu c => - symSlot (s + Finsupp.single mu 1) c + hookSlot (s + Finsupp.single mu 1) mu c - - slotAverage (s + Finsupp.single mu 1) c - -/-- The fibrewise linear coordinate change on the ordinary jet algebra. -/ -noncomputable def linSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := - (MvPolynomial.aeval linCoordGen).comp toPoly.toAlgHom - -/-- The inverse fibrewise linear coordinate change. -/ -noncomputable def invLinSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := - (MvPolynomial.aeval invLinCoordGen).comp toPoly.toAlgHom - -@[simp] -lemma linSubst_ofGen (g : JetGenerators) : linSubst (ofGen g) = linCoordGen g := by - show MvPolynomial.aeval linCoordGen (toPoly (ofGen g)) = _ - rw [toPoly_ofGen, aeval_X] - -@[simp] -lemma invLinSubst_ofGen (g : JetGenerators) : invLinSubst (ofGen g) = invLinCoordGen g := by - show MvPolynomial.aeval invLinCoordGen (toPoly (ofGen g)) = _ - rw [toPoly_ofGen, aeval_X] - -lemma invLinSubst_totalComponent {w : DIdx} {nu : Lor} (hnu : w nu ≠ 0) (c : Col) : - invLinSubst (totalComponent w nu c) = - symSlot w c + hookSlot w nu c - slotAverage w c := by - rw [totalComponent, invLinSubst_ofGen] - show symSlot (predAt w nu + Finsupp.single nu 1) c + - hookSlot (predAt w nu + Finsupp.single nu 1) nu c - - slotAverage (predAt w nu + Finsupp.single nu 1) c = _ - rw [predAt_add_single hnu] - -lemma invLinSubst_symConn {w : DIdx} (hw : w ≠ 0) (c : Col) : - invLinSubst (symConn w c) = symSlot w c := by - have hdeg : (lorDeg w : ℝ) ≠ 0 := lorDeg_cast_ne_zero hw - have hterm : ∀ nu : Lor, invLinSubst ((w nu : ℝ) • totalComponent w nu c) = - (w nu : ℝ) • (symSlot w c + hookSlot w nu c - slotAverage w c) := by - intro nu - by_cases hnu : w nu = 0 - · rw [hnu, Nat.cast_zero, zero_smul, zero_smul, map_zero] - · rw [map_smul, invLinSubst_totalComponent hnu] - have hkey : ∑ nu : Lor, (w nu : ℝ) • (symSlot w c + hookSlot w nu c - slotAverage w c) = - (lorDeg w : ℝ) • symSlot w c := by - simp_rw [smul_sub, smul_add] - rw [Finset.sum_sub_distrib, Finset.sum_add_distrib, ← Finset.sum_smul, ← Finset.sum_smul, - sum_coeff_eq_lorDeg, sum_weighted_hookSlot hw] - abel - rw [symConn, map_smul, map_sum, Finset.sum_congr rfl fun nu _ => hterm nu, hkey, smul_smul, - inv_mul_cancel₀ hdeg, one_smul] - -/-- **The linear coordinate change is invertible.** This is where `Triangular`'s - explicit weighted-average -inverse is consumed; no algebraic independence is assumed. -/ -lemma invLinSubst_linCoordGen (g : JetGenerators) : invLinSubst (linCoordGen g) = ofGen g := by - obtain ⟨s, mu, c⟩ := g - have hw : s + Finsupp.single mu 1 ≠ 0 := total_add_single_ne_zero s mu - have hmu := total_add_single_apply_ne_zero s mu - have hdir := layerDir_coeff_ne_zero hw - by_cases h : mu = layerDir (s + Finsupp.single mu 1) - · rw [linCoordGen, if_pos h, invLinSubst_symConn hw, symSlot, ← h, totalComponent_add_single] - · rw [linCoordGen, if_neg h, map_sub, invLinSubst_totalComponent hmu, - invLinSubst_totalComponent hdir, hookSlot, if_neg h, hookSlot, if_pos rfl, - ← totalComponent_add_single s mu c] - abel - -lemma invLinSubst_linSubst (P : JetAlgebra) : invLinSubst (linSubst P) = P := by - have h : invLinSubst.comp linSubst = AlgHom.id ℝ JetAlgebra := - jetAlgHom_ext fun g => by - rw [AlgHom.comp_apply, linSubst_ofGen, invLinSubst_linCoordGen, AlgHom.id_apply] - have h2 := DFunLike.congr_fun h P - simpa using h2 - -lemma linSubst_injective : Function.Injective linSubst := - Function.LeftInverse.injective invLinSubst_linSubst - -/-! - -## E. The covariant coordinate system - -Composing the fibrewise linear change with `Triangular`'s triangular substitution -replaces every hook -difference by the matching symmetrized covariant curvature derivative while keeping the fully -symmetric connection coordinate. Injectivity is inherited from both factors, so the resulting -family of coordinates is genuinely algebraically independent. - --/ - -lemma AllHookIdx.ext' {i j : AllHookIdx} (hw : i.w = j.w) (hmu : i.mu = j.mu) : i = j := by - obtain ⟨w, mu, h1, h2, h3⟩ := i - obtain ⟨w', mu', h1', h2', h3'⟩ := j - simp only at hw hmu - subst hw - subst hmu - rfl - -/-- Generator form of the covariant coordinate system: the distinguished slot of each fibre -carries the fully symmetric connection coordinate, every other supported slot carries the matching -symmetrized covariant curvature derivative. -/ -noncomputable def covCoordGen : JetGenerators → JetAlgebra - | .dA s mu c => - if h : mu = layerDir (s + Finsupp.single mu 1) then symConn (s + Finsupp.single mu 1) c - else - covHook ⟨s + Finsupp.single mu 1, mu, total_add_single_ne_zero s mu, - total_add_single_apply_ne_zero s mu, h⟩ c - -lemma covCoordGen_dA (s : DIdx) (mu : Lor) (c : Col) : - covCoordGen (.dA s mu c) = - if h : mu = layerDir (s + Finsupp.single mu 1) then symConn (s + Finsupp.single mu 1) c - else - covHook ⟨s + Finsupp.single mu 1, mu, total_add_single_ne_zero s mu, - total_add_single_apply_ne_zero s mu, h⟩ c := rfl - -/-- **The covariant coordinate substitution**: `Triangular`'s triangular map after the - fibrewise linear -change of variables. -/ -noncomputable def covSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := triangularSubst.comp linSubst - -@[simp] -lemma covSubst_ofGen (g : JetGenerators) : covSubst (ofGen g) = covCoordGen g := by - obtain ⟨s, mu, c⟩ := g - rw [covSubst, AlgHom.comp_apply, linSubst_ofGen, linCoordGen, covCoordGen_dA] - by_cases h : mu = layerDir (s + Finsupp.single mu 1) - · rw [if_pos h, dif_pos h, triangularSubst_symConn (total_add_single_ne_zero s mu)] - · rw [if_neg h, dif_neg h] - exact triangularSubst_hookDiff ⟨_, _, _, _, h⟩ c - -lemma covSubst_injective : Function.Injective covSubst := by - intro P Q h - have h' : triangularSubst (linSubst P) = triangularSubst (linSubst Q) := h - exact linSubst_injective (triangularSubst_injective h') - -/-- The covariant coordinates read as a polynomial substitution. -/ -noncomputable def covCoordHom : MvPolynomial JetGenerators ℝ →ₐ[ℝ] JetAlgebra := - MvPolynomial.aeval covCoordGen - -@[simp] -lemma covCoordHom_X (g : JetGenerators) : covCoordHom (X g) = covCoordGen g := aeval_X _ _ - -@[simp] -lemma covCoordHom_C (v : ℝ) : covCoordHom (C v) = algebraMap ℝ JetAlgebra v := aeval_C _ _ - -lemma covCoordHom_comp_X : - (⇑covCoordHom ∘ (X : JetGenerators → MvPolynomial JetGenerators ℝ)) = covCoordGen := - funext fun g => covCoordHom_X g - -lemma covCoordHom_eq_comp : covCoordHom = covSubst.comp toPoly.symm.toAlgHom := - MvPolynomial.algHom_ext fun g => by - rw [covCoordHom_X, AlgHom.comp_apply] - show covCoordGen g = covSubst (toPoly.symm (X g)) - rw [toPoly_symm_X, covSubst_ofGen] - -/-- **The covariant coordinates are algebraically independent.** Nothing is assumed here: the -injectivity comes from `Triangular`'s triangular inverse together with the explicit -inverse of the -fibrewise linear change. -/ -lemma covCoordHom_injective : Function.Injective covCoordHom := by - intro p q h - rw [covCoordHom_eq_comp] at h - have h' : covSubst (toPoly.symm p) = covSubst (toPoly.symm q) := h - exact toPoly.symm.injective (covSubst_injective h') - -lemma covCoordGen_symGen {w : DIdx} (hw : w ≠ 0) (c : Col) : - covCoordGen (symGen w c) = symConn w c := by - have hfib : layerPred w + Finsupp.single (layerDir w) 1 = w := layerPred_add_single hw - rw [symGen, covCoordGen_dA, - dif_pos (show layerDir w = layerDir (layerPred w + Finsupp.single (layerDir w) 1) by - rw [hfib]), hfib] - -lemma covCoordGen_predAt (i : AllHookIdx) (c : Col) : - covCoordGen (.dA (predAt i.w i.mu) i.mu c) = covHook i c := by - have hfib : predAt i.w i.mu + Finsupp.single i.mu 1 = i.w := predAt_add_single i.mu_supported - have hne : ¬ (i.mu = layerDir (predAt i.w i.mu + Finsupp.single i.mu 1)) := by - rw [hfib] - exact i.mu_ne_dir - rw [covCoordGen_dA, dif_neg hne] - exact congrArg (fun j => covHook j c) (AllHookIdx.ext' hfib rfl) - -lemma covCoordGen_mem_covAlgebra_of_not_isSymSlot {g : JetGenerators} (hg : ¬ IsSymSlot g) : - covCoordGen g ∈ covAlgebra := by - obtain ⟨s, mu, c⟩ := g - have hg' : ¬ (mu = layerDir (s + Finsupp.single mu 1)) := hg - rw [covCoordGen_dA, dif_neg hg'] - exact covHook_mem_covAlgebra _ c - -lemma covCoordGen_mem_covAlgebraAt_of_not_isSymSlot {N : ℕ} {g : JetGenerators} - (hg : ¬ IsSymSlot g) (hd : genDeg g ≤ N) : covCoordGen g ∈ covAlgebraAt N := by - obtain ⟨s, mu, c⟩ := g - have hg' : ¬ (mu = layerDir (s + Finsupp.single mu 1)) := hg - rw [covCoordGen_dA, dif_neg hg'] - refine covHook_mem_covAlgebraAt _ ?_ c - show lorDeg (s + Finsupp.single mu 1) ≤ N + 1 - have hs : lorDeg s ≤ N := hd - rw [lorDeg_add, lorDeg_single] - omega - -/-- The subalgebra generated by the covariant coordinates of derivative degree at most `N`. -/ -noncomputable def covCoordAlgebra (N : ℕ) : Subalgebra ℝ JetAlgebra := - Algebra.adjoin ℝ (covCoordGen '' {g : JetGenerators | genDeg g ≤ N}) - -lemma covCoordGen_mem_covCoordAlgebra {N : ℕ} {g : JetGenerators} (hg : genDeg g ≤ N) : - covCoordGen g ∈ covCoordAlgebra N := Algebra.subset_adjoin ⟨g, hg, rfl⟩ - -lemma covCoordAlgebra_mono {M N : ℕ} (h : M ≤ N) : covCoordAlgebra M ≤ covCoordAlgebra N := - Algebra.adjoin_mono (Set.image_mono fun _ hg => le_trans hg h) - -/-- **A hook difference is a covariant coordinate up to strictly lower terms.** The correction -`covHook - hookDiff` lies in the strict filtration by `Triangular`, so it is covered by -the inductive -hypothesis packaged as `hsfilt`. -/ -private lemma hookDiff_mem_covCoordAlgebra {m : ℕ} - (hsfilt : ∀ P ∈ sfilt m, P ∈ covCoordAlgebra m) (i : AllHookIdx) - (hi : lorDeg (predAt i.w i.mu) = m) (c : Col) : hookDiff i c ∈ covCoordAlgebra m := by - have h1 : covHook i c ∈ covCoordAlgebra m := by - rw [← covCoordGen_predAt i c] - exact covCoordGen_mem_covCoordAlgebra (le_of_eq hi) - have h2 : covHook i c - hookDiff i c ∈ covCoordAlgebra m := by - refine hsfilt _ ?_ - rw [← hi] - exact covHook_sub_hookDiff_mem_sfilt i c - have h3 := sub_mem h1 h2 - rwa [sub_sub_cancel] at h3 - -/-- The inductive step: once every strictly lower monomial is a polynomial in the covariant -coordinates, so is every ordinary generator of derivative degree `m`. -/ -private lemma ofGen_mem_covCoordAlgebra_step {m : ℕ} - (hsfilt : ∀ P ∈ sfilt m, P ∈ covCoordAlgebra m) : - ∀ g : JetGenerators, genDeg g = m → ofGen g ∈ covCoordAlgebra m := by - rintro ⟨s, mu, c⟩ hgm - have hgm' : lorDeg s = m := hgm - have hw : s + Finsupp.single mu 1 ≠ 0 := total_add_single_ne_zero s mu - have hmu := total_add_single_apply_ne_zero s mu - have hwdeg : lorDeg (s + Finsupp.single mu 1) = m + 1 := by - rw [lorDeg_add, lorDeg_single, hgm'] - have hsym : symConn (s + Finsupp.single mu 1) c ∈ covCoordAlgebra m := by - rw [← covCoordGen_symGen hw c] - refine covCoordGen_mem_covCoordAlgebra ?_ - show lorDeg (layerPred (s + Finsupp.single mu 1)) ≤ m - have h1 := lorDeg_layerPred hw - omega - have hhook : ∀ nu : Lor, ((s + Finsupp.single mu 1 : DIdx)) nu ≠ 0 → - nu ≠ layerDir (s + Finsupp.single mu 1) → - totalComponent (s + Finsupp.single mu 1) nu c - - totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c ∈ - covCoordAlgebra m := by - intro nu hnu hne - obtain ⟨i, hiw, himu⟩ : ∃ i : AllHookIdx, i.w = s + Finsupp.single mu 1 ∧ i.mu = nu := - ⟨⟨s + Finsupp.single mu 1, nu, hw, hnu, hne⟩, rfl, rfl⟩ - have hgoal : hookDiff i c = - totalComponent (s + Finsupp.single mu 1) nu c - - totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c := by - rw [hookDiff, hiw, himu] - rw [← hgoal] - refine hookDiff_mem_covCoordAlgebra hsfilt i ?_ c - rw [hiw, himu] - have h1 := lorDeg_predAt hnu - omega - have havg : hookAverage (s + Finsupp.single mu 1) c ∈ covCoordAlgebra m := by - rw [hookAverage] - refine Subalgebra.smul_mem _ ?_ _ - refine sum_mem fun nu _ => ?_ - by_cases hnu : ((s + Finsupp.single mu 1 : DIdx)) nu = 0 - · rw [hnu, Nat.cast_zero, zero_smul] - exact zero_mem _ - · by_cases hne : nu = layerDir (s + Finsupp.single mu 1) - · rw [hne, sub_self, smul_zero] - exact zero_mem _ - · exact Subalgebra.smul_mem _ (hhook nu hnu hne) _ - rw [← totalComponent_add_single s mu c, totalComponent_eq_symConn_add_hook_sub hw hmu c] - refine sub_mem (add_mem hsym ?_) havg - by_cases hne : mu = layerDir (s + Finsupp.single mu 1) - · have hzero : totalComponent (s + Finsupp.single mu 1) mu c = - totalComponent (s + Finsupp.single mu 1) (layerDir (s + Finsupp.single mu 1)) c := by - rw [← hne] - rw [hzero, sub_self] - exact zero_mem _ - · exact hhook mu hmu hne - -/-- Every monomial of bounded additive derivative degree is a polynomial in the covariant -coordinates, provided each of its generators already is. -/ -private lemma filt_mem_covCoordAlgebra {m : ℕ} - (ih : ∀ k, k < m → ∀ g : JetGenerators, genDeg g = k → ofGen g ∈ covCoordAlgebra k) - {d : ℕ} (hd : d < m) : ∀ P ∈ filt d, P ∈ covCoordAlgebra m := by - intro P hP - induction hP using Submodule.span_induction with - | mem P hP => - obtain ⟨l, hl, rfl⟩ := hP - refine list_prod_mem ?_ - intro x hx - obtain ⟨h, hhl, rfl⟩ := List.mem_map.mp hx - have hdeg : genDeg h ≤ d := - le_trans (List.single_le_sum (fun _ _ => Nat.zero_le _) _ (List.mem_map_of_mem hhl)) hl - exact covCoordAlgebra_mono (le_of_lt (lt_of_le_of_lt hdeg hd)) - (ih (genDeg h) (lt_of_le_of_lt hdeg hd) h rfl) - | zero => exact zero_mem _ - | add x y _ _ hx hy => exact add_mem hx hy - | smul r x _ hx => exact Subalgebra.smul_mem _ hx r - -private lemma ofGen_mem_covCoordAlgebra_aux (m : ℕ) : - ∀ g : JetGenerators, genDeg g = m → ofGen g ∈ covCoordAlgebra m := by - induction m using Nat.strong_induction_on with - | _ m ih => - refine ofGen_mem_covCoordAlgebra_step ?_ - cases m with - | zero => - intro P hP - rw [sfilt_zero, Submodule.mem_bot] at hP - rw [hP] - exact zero_mem _ - | succ n => - intro P hP - rw [sfilt_succ] at hP - exact filt_mem_covCoordAlgebra ih (Nat.lt_succ_self n) P hP - -lemma ofGen_mem_covCoordAlgebra (g : JetGenerators) : ofGen g ∈ covCoordAlgebra (genDeg g) := - ofGen_mem_covCoordAlgebra_aux (genDeg g) g rfl - -/-- **Finite height is preserved by the covariant coordinate change.** Every ordinary generator is -a polynomial in the covariant coordinates of its own derivative degree, so a jet polynomial of -height at most `N` is a polynomial in the covariant coordinates of height at most `N`. -/ -lemma heightAlgebra_le_covCoordAlgebra (N : ℕ) : heightAlgebra N ≤ covCoordAlgebra N := by - refine Algebra.adjoin_le ?_ - rintro P ⟨g, hg, rfl⟩ - exact covCoordAlgebra_mono hg (ofGen_mem_covCoordAlgebra g) - -/-! - -## F. The based gauge action in covariant coordinates - -A jet based through order `r` fixes every hook coordinate at every derivative degree, because the -hook coordinates are covariant curvature components; and on the symmetric coordinates it is a pure -translation of the top layer, because of `HighestLayer`. This is the exact input of the -per-variable -polynomial translation lemma. - --/ - -lemma coordC_smul_colourBasis (a : ℝ) (c₀ c : Col) : - coordC c (a • colourBasis c₀) = if c = c₀ then a else 0 := by - rw [map_smul, smul_eq_mul, coordC_apply, Basis.repr_self_apply] - by_cases h : c = c₀ - · rw [if_pos h, if_pos h.symm, mul_one] - · rw [if_neg h, if_neg fun hc => h hc.symm, mul_zero] - -/-- Below the top layer of a jet based through order `r` there is no shift at all. -/ -lemma layerShift_eq_zero_of_lorDeg_le {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : BasedTo r U) {w : DIdx} (hw : w ≠ 0) (h : lorDeg w ≤ r) : layerShift U w = 0 := by - have hlt : lorDeg (layerPred w) < r := by - have h1 := lorDeg_layerPred hw - omega - rw [layerShift, dif_neg hw, mcCoeffCAt_eq_zero_of_lt hU hlt (layerDir w), smul_zero] - -/-- **Every ordinary component of a fibre of derivative degree at most `r` is translated by the -same constant.** Below the top layer that constant vanishes, so this one statement covers both the -fixed and the translated layers. -/ -lemma gaugePull_totalComponent {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : BasedTo r U) {w : DIdx} {nu : Lor} (hnu : w nu ≠ 0) (hwr : lorDeg w ≤ r + 1) (c : Col) : - gaugePull U (totalComponent w nu c) = totalComponent w nu c + constR (layerShift U w) c := by - have hw : w ≠ 0 := fun h => hnu (by simp [h]) - have hpred := lorDeg_predAt hnu - rw [totalComponent, gaugePull_ofGen] - rcases eq_or_lt_of_le hwr with heq | hlt - · have hs : lorDeg (predAt w nu) = r := by omega - rw [gaugeSubstGen_eq_add_layerShift hU hs nu c, predAt_add_single hnu] - · have hs : lorDeg (predAt w nu) < r := by omega - rw [gaugeSubstGen_eq_ofGen_of_lt hU hs nu c, - layerShift_eq_zero_of_lorDeg_le hU hw (by omega)] - simp [constR] - -/-- **The fully symmetric coordinate is purely translated.** The weighted average of a fibre moves -by exactly the common constant of that fibre. -/ -lemma gaugePull_symConn {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} (hU : BasedTo r U) - {w : DIdx} (hw : w ≠ 0) (hwr : lorDeg w ≤ r + 1) (c : Col) : - gaugePull U (symConn w c) = symConn w c + constR (layerShift U w) c := by - have hdeg : (lorDeg w : ℝ) ≠ 0 := lorDeg_cast_ne_zero hw - have hterm : ∀ nu : Lor, gaugePull U ((w nu : ℝ) • totalComponent w nu c) = - (w nu : ℝ) • (totalComponent w nu c + constR (layerShift U w) c) := by - intro nu - by_cases hnu : w nu = 0 - · rw [hnu, Nat.cast_zero, zero_smul, zero_smul, map_zero] - · rw [map_smul, gaugePull_totalComponent hU hnu hwr] - rw [symConn, map_smul, map_sum, Finset.sum_congr rfl fun nu _ => hterm nu] - simp_rw [smul_add] - rw [Finset.sum_add_distrib, ← Finset.sum_smul, sum_coeff_eq_lorDeg, smul_add, smul_smul, - inv_mul_cancel₀ hdeg, one_smul] - -/-- **Based jets fix every hook coordinate**, at every derivative degree: these are covariant -curvature components, so this is `CovariantTower`. -/ -lemma gaugePull_covCoordGen_of_not_isSymSlot {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) {g : JetGenerators} (hg : ¬ IsSymSlot g) : - gaugePull U (covCoordGen g) = covCoordGen g := - gaugePull_eq_self_of_based U hU (covCoordGen_mem_covAlgebra_of_not_isSymSlot hg) - -/-- **Based jets translate the symmetric coordinates of their own layer and below by a -constant.** -/ -lemma gaugePull_covCoordGen_of_isSymSlot {r : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : BasedTo r U) {g : JetGenerators} (hg : IsSymSlot g) (hd : genDeg g ≤ r) : - gaugePull U (covCoordGen g) = - covCoordGen g + constR (layerShift U (genFibre g)) (genCol g) := by - obtain ⟨s, mu, c⟩ := g - have hmu : mu = layerDir (s + Finsupp.single mu 1) := hg - have hw : s + Finsupp.single mu 1 ≠ 0 := total_add_single_ne_zero s mu - have hs : lorDeg s ≤ r := hd - rw [covCoordGen_dA, dif_pos hmu, genFibre_dA, genCol_dA] - refine gaugePull_symConn hU hw ?_ c - rw [lorDeg_add, lorDeg_single] - omega - -/-! - -## G. The descending elimination - --/ - -/-- The variables that survive after the symmetric coordinates of derivative degree at least `k` -have been eliminated inside derivative height `M`. -/ -def slotSupport (M k : ℕ) : Set JetGenerators := - {g | genDeg g ≤ M ∧ (¬ IsSymSlot g ∨ genDeg g < k)} - -lemma slotSupport_zero (M : ℕ) : - slotSupport M 0 = {g : JetGenerators | genDeg g ≤ M ∧ ¬ IsSymSlot g} := by - ext g - constructor - · rintro ⟨h1, h2 | h2⟩ - · exact ⟨h1, h2⟩ - · omega - · rintro ⟨h1, h2⟩ - exact ⟨h1, Or.inl h2⟩ - -/-- The constant by which a realizing jet moves a symmetric coordinate is the delta function of the -selected fibre and colour. This is the exact translation pattern the per-variable polynomial lemma -consumes. -/ -private lemma constR_layerShift_eq_ite {k : ℕ} {U : specialUnitaryGroup (Fin 3) JetRing} - (hU : BasedTo k U) {w : DIdx} (hw : lorDeg w = k + 1) {c₀ : Col} {a : ℝ} - (h1 : layerShift U w = a • colourBasis c₀) - (h0 : ∀ w', lorDeg w' = k + 1 → w' ≠ w → layerShift U w' = 0) - {g : JetGenerators} (hg : IsSymSlot g) (hd : genDeg g ≤ k) : - constR (layerShift U (genFibre g)) (genCol g) = - algebraMap ℝ JetAlgebra (if g = symGen w c₀ then a else 0) := by - have hw0 : w ≠ 0 := by - rw [← lorDeg_pos_iff, hw] - omega - have hfg : genFibre g ≠ 0 := genFibre_ne_zero g - have hfdeg : lorDeg (genFibre g) = genDeg g + 1 := lorDeg_genFibre g - have hgdeg : genDeg (symGen w c₀) = k := by - have hlp := lorDeg_layerPred hw0 - rw [genDeg_symGen] - omega - rcases eq_or_lt_of_le hd with heq | hlt - · have hfk : lorDeg (genFibre g) = k + 1 := by omega - by_cases hfw : genFibre g = w - · have hiff : (genCol g = c₀) ↔ (g = symGen w c₀) := by - constructor - · intro hc - calc g = symGen (genFibre g) (genCol g) := eq_symGen_of_isSymSlot hg - _ = symGen w c₀ := by rw [hfw, hc] - · intro hgs - have hcol := congrArg genCol hgs - rwa [genCol_symGen] at hcol - rw [hfw, h1, constR, coordC_smul_colourBasis, if_congr hiff rfl rfl] - · have hne : g ≠ symGen w c₀ := by - intro hgs - exact hfw (by rw [hgs, genFibre_symGen hw0]) - rw [h0 _ hfk hfw, if_neg hne] - simp [constR] - · have hle : lorDeg (genFibre g) ≤ k := by omega - have hne : g ≠ symGen w c₀ := by - intro hgs - have hdd : genDeg g = genDeg (symGen w c₀) := by rw [hgs] - omega - rw [layerShift_eq_zero_of_lorDeg_le hU hfg hle, if_neg hne] - simp [constR] - -/-- **One symmetric coordinate of the top surviving layer is removed.** The realizing jet of - `HighestLayer` -translates exactly that variable and fixes every other variable in the current support, so -`FiniteCompleteness`'s -per-variable translation lemma applies. -/ -private lemma notMem_vars_symGen {M k : ℕ} {Q : MvPolynomial JetGenerators ℝ} - (hfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q) - (hQ : Q ∈ supported ℝ (slotSupport M (k + 1))) - {w : DIdx} (hw : lorDeg w = k + 1) (c₀ : Col) : symGen w c₀ ∉ Q.vars := by - classical - have hw0 : w ≠ 0 := by - rw [← lorDeg_pos_iff, hw] - omega - refine MvPolynomial.notMem_vars_of_forall_aeval_add_eq Q (symGen w c₀) fun a => ?_ - obtain ⟨U, hUb, hU1, hU0⟩ := exists_basedTo_layerShift hw c₀ a - set f : JetGenerators → MvPolynomial JetGenerators ℝ := - fun i => X i + C (if i = symGen w c₀ then a else 0) with hfdef - have hagree : ∀ g ∈ slotSupport M (k + 1), - covCoordHom (aeval (R := ℝ) f (X g)) = gaugePull U (covCoordHom (X g)) := by - intro g hg - have hfg : aeval (R := ℝ) f (X g) = X g + C (if g = symGen w c₀ then a else 0) := by - rw [aeval_X, hfdef] - rw [hfg, map_add, covCoordHom_X, covCoordHom_C] - by_cases hs : IsSymSlot g - · have hd : genDeg g ≤ k := by - rcases hg.2 with h | h - · exact absurd hs h - · omega - rw [gaugePull_covCoordGen_of_isSymSlot hUb hs hd, - constR_layerShift_eq_ite hUb hw hU1 hU0 hs hd] - · have hne : g ≠ symGen w c₀ := fun hgs => hs (hgs ▸ isSymSlot_symGen hw0 c₀) - rw [if_neg hne, map_zero, add_zero, - gaugePull_covCoordGen_of_not_isSymSlot (basedTo_evalSU hUb) hs] - have hQ' : Q ∈ Algebra.adjoin ℝ (X '' slotSupport M (k + 1)) := by - rwa [← supported_eq_adjoin_X] - have hmem : Q ∈ AlgHom.equalizer (covCoordHom.comp (aeval (R := ℝ) f)) - ((gaugePull U).comp covCoordHom) := by - refine Algebra.adjoin_le ?_ hQ' - rintro _ ⟨g, hg, rfl⟩ - exact hagree g hg - have heq : covCoordHom (aeval (R := ℝ) f Q) = gaugePull U (covCoordHom Q) := hmem - rw [hfix U (basedTo_evalSU hUb)] at heq - exact covCoordHom_injective heq - -/-- One step of the descending elimination: the whole symmetric layer of derivative degree `k` -disappears from the support. -/ -private lemma supported_step {M k : ℕ} {Q : MvPolynomial JetGenerators ℝ} - (hfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q) - (hQ : Q ∈ supported ℝ (slotSupport M (k + 1))) : Q ∈ supported ℝ (slotSupport M k) := by - classical - have hsub := mem_supported.mp hQ - rw [mem_supported] - intro g hg - have hg' := hsub hg - refine ⟨hg'.1, ?_⟩ - rcases hg'.2 with h | h - · exact Or.inl h - · rcases Nat.lt_succ_iff_lt_or_eq.mp h with h2 | h2 - · exact Or.inr h2 - · by_cases hs : IsSymSlot g - · exfalso - have hfib : lorDeg (genFibre g) = k + 1 := by rw [lorDeg_genFibre, h2] - have hnot := notMem_vars_symGen hfix hQ hfib (genCol g) - rw [← eq_symGen_of_isSymSlot hs] at hnot - exact hnot (Finset.mem_coe.mp hg) - · exact Or.inl hs - -/-- The full descending elimination: every symmetric coordinate is removed, layer by layer, from -the top of the height down to the connection. -/ -private lemma supported_descend {M : ℕ} {Q : MvPolynomial JetGenerators ℝ} - (hfix : ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q) : - ∀ k, Q ∈ supported ℝ (slotSupport M k) → Q ∈ supported ℝ (slotSupport M 0) := by - intro k - induction k with - | zero => exact fun h => h - | succ k ih => exact fun h => ih (supported_step hfix h) - -/-- **Finite-height completeness.** Inside every finite derivative height `N`, the ordinary jet -polynomials fixed by every based `SU(3)` gauge jet are exactly the elements of the truncated -algebra generated by the covariant curvature derivatives available at that height. - -The forward direction is the descending elimination in the covariant coordinates of section E; the -reverse direction is `CovariantTower`'s fixation of the covariant subalgebra together with the -height bound of -section B. -/ -lemma fixed_by_based_height_eq_covAlgebraAt (N : ℕ) : - {P : JetAlgebra | P ∈ heightAlgebra N ∧ - ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U P = P} = - (covAlgebraAt N : Set JetAlgebra) := by - classical - ext P - simp only [Set.mem_setOf_eq, SetLike.mem_coe] - constructor - · rintro ⟨hPh, hPfix⟩ - have h1 : P ∈ covCoordAlgebra N := heightAlgebra_le_covCoordAlgebra N hPh - have himg : (Algebra.adjoin ℝ (X '' {g : JetGenerators | genDeg g ≤ N})).map covCoordHom = - covCoordAlgebra N := by - rw [AlgHom.map_adjoin, covCoordAlgebra, ← Set.image_comp, covCoordHom_comp_X] - rw [← himg] at h1 - obtain ⟨Q, hQ, hQP⟩ := Subalgebra.mem_map.mp h1 - rw [← supported_eq_adjoin_X] at hQ - have hfixQ : ∀ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 → gaugePull U (covCoordHom Q) = covCoordHom Q := by - intro U hU - rw [hQP] - exact hPfix U hU - have hstart : Q ∈ supported ℝ (slotSupport N (N + 1)) := by - have hsub := mem_supported.mp hQ - rw [mem_supported] - intro g hg - have hd : genDeg g ≤ N := hsub hg - exact ⟨hd, Or.inr (by omega)⟩ - have hend := supported_descend hfixQ (N + 1) hstart - rw [slotSupport_zero, supported_eq_adjoin_X] at hend - have hmem : P ∈ (Algebra.adjoin ℝ - (X '' {g : JetGenerators | genDeg g ≤ N ∧ ¬ IsSymSlot g})).map covCoordHom := - Subalgebra.mem_map.mpr ⟨Q, hend, hQP⟩ - rw [AlgHom.map_adjoin, ← Set.image_comp, covCoordHom_comp_X] at hmem - refine Algebra.adjoin_le ?_ hmem - rintro _ ⟨g, ⟨hd, hs⟩, rfl⟩ - exact covCoordGen_mem_covAlgebraAt_of_not_isSymSlot hs hd - · intro hP - exact ⟨covAlgebraAt_le_heightAlgebra N hP, - fun U hU => gaugePull_eq_self_of_based U hU (covAlgebraAt_le_covAlgebra N hP)⟩ - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean deleted file mode 100644 index ea0fd6fa2..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/GaugeAction.lean +++ /dev/null @@ -1,1108 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Mathlib.LinearAlgebra.Matrix.Adjugate -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.CoordinateChange -/-! -# The first-order gauge action in covariant coordinates - -## i. Overview - -This file defines the action of a gauge jet on the first-order gluon jet algebra `A₁` of -`CoordinateChange` and proves -the transformation law of every generator. - -The action is not asserted: it is *derived*. A gluon potential together with all of its -derivatives at a point is modelled, as in the underlying matrix-valued jet model, by a -matrix of formal power series for each spacetime direction, and the local gauge action is the -honest affine one - -```text -A_μ ↦ U A_μ U† + i (∂_μ U) U†. -``` - -`jetValue_actPot` and `jetDeriv_actPot` compute the base-point value and the first Taylor -coefficient of the transformed potential, and those two identities are exactly the substitution -`gaugeSubst` used on the polynomial coordinates. - -## ii. Conventions - -Hermitian throughout, matching the Physlib gluon convention. The Maurer–Cartan series carries the -`+i` of -`Gluon.mcMatrix`, and the colour bracket is `brMat M N = i (M N - N M)` as in `CoordinateChange`. -The -Lie-algebra (anti-hermitian) formulas of the underlying matrix-valued jet calculation are converted, -never adopted. - -## iii. The three transformation laws - -With `u = U(0)`, `m_ν = Gluon.mcCoeff U ν` and `t_{νμ} = mc2C U ν μ` the second Maurer–Cartan -coefficient: - -```text -A_μ ↦ Ad_u A_μ + m_μ -∂_ν A_μ ↦ Ad_u (∂_ν A_μ) - i [m_ν, Ad_u A_μ] + t_{νμ} -F_{νμ} ↦ Ad_u F_{νμ} -``` - -The third is `curvC_actPt`/`gaugeAct_curvPoly`: the field strength is *covariant*, not invariant. -The antisymmetric part of `t` is exactly what makes the cancellation work: -`t_{νμ} - t_{μν} = -i [m_ν, m_μ]` (`mc2C_sub`). - -## iv. Results - -* `mcP`, `mc2M`, `mc2C` — the Maurer–Cartan series and its first derivative; -* `trace_mcP` — the Maurer–Cartan series is traceless, because `det U = 1`; -* `actPot`, `jetValue_actPot`, `jetDeriv_actPot` — the derived coordinate transformation; -* `gaugeSubst`, `gaugeAct` — the induced substitution on `A₁`; -* `gaugeAct_curvPoly` — **curvature transforms by conjugation by the base-point value**. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -namespace SU3Jet - -/-! - -## A. The entrywise formal derivative on matrices of jets - -These entrywise derivative lemmas support the power-series gauge-action calculation. - --/ - -/-- The entrywise formal partial derivative of a matrix of jets. -/ -noncomputable def dMat (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) JetRing := - M.map (fun f => MvPowerSeries.pderiv ℂ ν f) - -@[simp] -lemma dMat_apply (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) (i j : Fin 3) : - dMat ν M i j = MvPowerSeries.pderiv ℂ ν (M i j) := rfl - -lemma dMat_mul (ν : Lor) (M N : Matrix (Fin 3) (Fin 3) JetRing) : - dMat ν (M * N) = dMat ν M * N + M * dMat ν N := by - refine Matrix.ext fun i j => ?_ - rw [dMat_apply, Matrix.add_apply, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply, - map_sum, ← Finset.sum_add_distrib] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [Derivation.leibniz] - simp only [dMat_apply, smul_eq_mul] - ring - -@[simp] -lemma dMat_one (ν : Lor) : dMat ν (1 : Matrix (Fin 3) (Fin 3) JetRing) = 0 := by - refine Matrix.ext fun i j => ?_ - by_cases h : i = j <;> simp [h] - -lemma dMat_star (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - dMat ν (star M) = star (dMat ν M) := by - refine Matrix.ext fun i j => ?_ - exact JetRing.pderiv_star ν (M j i) - -lemma dMat_comm (μ ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - dMat μ (dMat ν M) = dMat ν (dMat μ M) := - Matrix.ext fun i j => JetRing.pderiv_comm μ ν (M i j) - -/-- The base-point value of the entrywise derivative is the first Taylor coefficient. -/ -lemma jetValue_dMat (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - Gluon.jetValue (dMat ν M) = Gluon.jetDeriv ν M := by - ext i j - show MvPowerSeries.constantCoeff (MvPowerSeries.pderiv ℂ ν (M i j)) = - MvPowerSeries.coeff (Finsupp.single ν 1) (M i j) - rw [← MvPowerSeries.coeff_zero_eq_constantCoeff_apply, MvPowerSeries.coeff_pderiv] - simp - -lemma jetDeriv_add (ν : Lor) (M N : Matrix (Fin 3) (Fin 3) JetRing) : - Gluon.jetDeriv ν (M + N) = Gluon.jetDeriv ν M + Gluon.jetDeriv ν N := by - ext i j - simp [Gluon.jetDeriv, Matrix.add_apply] - -lemma jetValue_add (M N : Matrix (Fin 3) (Fin 3) JetRing) : - Gluon.jetValue (M + N) = Gluon.jetValue M + Gluon.jetValue N := by - ext i j - simp [Gluon.jetValue, Matrix.add_apply] - -lemma jetValue_sub (M N : Matrix (Fin 3) (Fin 3) JetRing) : - Gluon.jetValue (M - N) = Gluon.jetValue M - Gluon.jetValue N := by - ext i j - simp [Gluon.jetValue, Matrix.sub_apply] - -lemma trace_jetValue (M : Matrix (Fin 3) (Fin 3) JetRing) : - trace (Gluon.jetValue M) = MvPowerSeries.constantCoeff (trace M) := by - rw [Matrix.trace, Matrix.trace, map_sum] - exact Finset.sum_congr rfl fun i _ => rfl - -lemma trace_jetDeriv (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - trace (Gluon.jetDeriv ν M) = MvPowerSeries.coeff (Finsupp.single ν 1) (trace M) := by - rw [Matrix.trace, Matrix.trace, map_sum] - exact Finset.sum_congr rfl fun i _ => rfl - -/-! - -## B. The Maurer–Cartan series - -`mcP` is the Lie-algebra (anti-hermitian) Maurer–Cartan series `(∂_μ U) U†` of the underlying -matrix-valued jet calculation. -The hermitian series is `i` times it; the factor of `i` is inserted only after passing to complex -matrices, so no star-module structure on the jet ring is needed. - --/ - -variable (U : specialUnitaryGroup (Fin 3) JetRing) - -lemma coe_star_mul_self : star (U : Matrix (Fin 3) (Fin 3) JetRing) * U.1 = 1 := - mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp U.2).1 - -/-- The Maurer–Cartan series of a gauge jet, in the Lie-algebra convention: `(∂_μ U) U†`. -/ -noncomputable def mcP (μ : Lor) : Matrix (Fin 3) (Fin 3) JetRing := - dMat μ U.1 * star U.1 - -lemma dMat_star_coe (μ : Lor) : dMat μ (star U.1) = -(star U.1 * mcP U μ) := by - have h := congrArg (dMat μ) (Gluon.coe_mul_star_self U) - rw [dMat_mul, dMat_one] at h - have h2 : U.1 * dMat μ (star U.1) = -(dMat μ U.1 * star U.1) := - eq_neg_of_add_eq_zero_right h - calc dMat μ (star U.1) - = star U.1 * U.1 * dMat μ (star U.1) := by rw [coe_star_mul_self, Matrix.one_mul] - _ = star U.1 * (U.1 * dMat μ (star U.1)) := by rw [Matrix.mul_assoc] - _ = -(star U.1 * mcP U μ) := by rw [h2, mcP, Matrix.mul_neg] - -/-- The Maurer–Cartan series is anti-self-adjoint; the hermitian series is `i` times it. -/ -lemma star_mcP (μ : Lor) : star (mcP U μ) = -mcP U μ := by - have h := congrArg (dMat μ) (Gluon.coe_mul_star_self U) - rw [dMat_mul, dMat_one] at h - rw [mcP, star_mul, star_star, ← dMat_star] - exact eq_neg_of_add_eq_zero_right h - -/-- The derivative of the Maurer–Cartan series: a symmetric second-derivative term together with - a quadratic term. This is `dMat_mcP`, converted. -/ -lemma dMat_mcP (ν μ : Lor) : - dMat ν (mcP U μ) = dMat ν (dMat μ U.1) * star U.1 - mcP U μ * mcP U ν := by - rw [mcP, dMat_mul, dMat_star_coe] - rw [show dMat μ U.1 * -(star U.1 * mcP U ν) = -(dMat μ U.1 * star U.1 * mcP U ν) by - rw [Matrix.mul_neg, Matrix.mul_assoc]] - rw [← mcP] - abel - -lemma jetValue_mcP (μ : Lor) : - Gluon.jetValue (mcP U μ) = Gluon.jetDeriv μ U.1 * star (Gluon.jetValue U.1) := by - rw [mcP, Gluon.jetValue_mul, Gluon.jetValue_star, jetValue_dMat] - -lemma mcMatrix_eq (μ : Lor) : - Gluon.mcMatrix μ U.1 = Complex.I • Gluon.jetValue (mcP U μ) := by - rw [Gluon.mcMatrix, jetValue_mcP] - -/-! - -### B.1. The Maurer–Cartan series is traceless - -Unitarity alone makes the series anti-self-adjoint; it is the determinant-one condition that makes -it traceless, i.e. `su(3)`-valued rather than `u(3)`-valued. This is the all-orders tracelessness -statement needed below. - --/ - -/-- Jacobi's formula for `3 × 3` matrices of jets: a direct expansion, not a general - determinant-derivative development. -/ -lemma pderiv_det (ν : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - MvPowerSeries.pderiv ℂ ν M.det = trace (dMat ν M * adjugate M) := by - simp only [Matrix.det_fin_three, Matrix.adjugate_fin_three, map_add, map_sub, - Derivation.leibniz, smul_eq_mul, Matrix.trace_fin_three, Matrix.mul_apply, - Fin.sum_univ_three, dMat_apply, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, - Matrix.cons_val_one, Matrix.head_cons, Matrix.empty_val', Matrix.cons_val_fin_one, - Matrix.cons_val_two, Matrix.tail_cons, Matrix.head_fin_const] - ring - -/-- For a gauge jet the adjugate is the conjugate transpose. -/ -lemma adjugate_coe : adjugate (U : Matrix (Fin 3) (Fin 3) JetRing) = star U.1 := by - have h3 : (U : Matrix (Fin 3) (Fin 3) JetRing) * adjugate U.1 = 1 := by - rw [Matrix.mul_adjugate, (mem_specialUnitaryGroup_iff.mp U.2).2, one_smul] - calc adjugate (U : Matrix (Fin 3) (Fin 3) JetRing) - = 1 * adjugate U.1 := by rw [Matrix.one_mul] - _ = star U.1 * U.1 * adjugate U.1 := by rw [coe_star_mul_self] - _ = star U.1 * (U.1 * adjugate U.1) := by rw [Matrix.mul_assoc] - _ = star U.1 := by rw [h3, Matrix.mul_one] - -/-- **The Maurer–Cartan series is traceless.** -/ -lemma trace_mcP (μ : Lor) : trace (mcP U μ) = 0 := by - have h := pderiv_det μ (U : Matrix (Fin 3) (Fin 3) JetRing) - rw [(mem_specialUnitaryGroup_iff.mp U.2).2, Derivation.map_one_eq_zero, adjugate_coe] at h - rw [mcP, ← h] - -/-! - -## C. The colour data of a gauge jet - --/ - -/-- The base-point Maurer–Cartan coefficient, as a colour vector. -/ -noncomputable def mcC (μ : Lor) : ColourSpace := - ⟨Gluon.mcCoeff U μ, by - show trace (Gluon.mcMatrix μ U.1) = 0 - rw [mcMatrix_eq U, trace_smul, trace_jetValue, trace_mcP, map_zero, smul_zero]⟩ - -@[simp] -lemma cmat_mcC (μ : Lor) : cmat (mcC U μ) = Gluon.mcMatrix μ U.1 := rfl - -/-- The first derivative of the hermitian Maurer–Cartan series, as a complex matrix. -/ -noncomputable def mc2M (ν μ : Lor) : Matrix (Fin 3) (Fin 3) ℂ := - Complex.I • Gluon.jetDeriv ν (mcP U μ) - -lemma star_mc2M (ν μ : Lor) : star (mc2M U ν μ) = mc2M U ν μ := by - have h : star (Gluon.jetDeriv ν (mcP U μ)) = -Gluon.jetDeriv ν (mcP U μ) := by - rw [← Gluon.jetDeriv_star, star_mcP] - ext i j - simp [Gluon.jetDeriv, Matrix.neg_apply] - rw [mc2M, star_smul, h, Complex.star_def, Complex.conj_I, neg_smul, ← smul_neg, neg_neg] - -lemma trace_mc2M (ν μ : Lor) : trace (mc2M U ν μ) = 0 := by - rw [mc2M, trace_smul, trace_jetDeriv, trace_mcP, map_zero, smul_zero] - -/-- The second Maurer–Cartan coefficient, as a colour vector: the constant by which an order-two - based jet translates the derivative coordinates. -/ -noncomputable def mc2C (ν μ : Lor) : ColourSpace := - mkCM (mc2M U ν μ) (star_mc2M U ν μ) (trace_mc2M U ν μ) - -@[simp] -lemma cmat_mc2C (ν μ : Lor) : cmat (mc2C U ν μ) = mc2M U ν μ := rfl - -/-- **The antisymmetric part of the second Maurer–Cartan coefficient.** It is exactly minus the - colour bracket of the first coefficients; this identity is what makes the field strength - covariant, and it is why the order-two translation is symmetric on based jets. -/ -lemma mc2C_sub (ν μ : Lor) : - mc2C U ν μ - mc2C U μ ν = -br (mcC U ν) (mcC U μ) := by - apply cmat_injective - have hd : ∀ ρ σ : Lor, Gluon.jetDeriv ρ (mcP U σ) = - Gluon.jetValue (dMat ρ (dMat σ U.1) * star U.1) - - Gluon.jetValue (mcP U σ) * Gluon.jetValue (mcP U ρ) := by - intro ρ σ - rw [← jetValue_dMat, dMat_mcP, jetValue_sub, Gluon.jetValue_mul (mcP U σ) (mcP U ρ)] - have key : Gluon.jetDeriv ν (mcP U μ) - Gluon.jetDeriv μ (mcP U ν) = - Gluon.jetValue (mcP U ν) * Gluon.jetValue (mcP U μ) - - Gluon.jetValue (mcP U μ) * Gluon.jetValue (mcP U ν) := by - rw [hd ν μ, hd μ ν, dMat_comm ν μ U.1] - abel - have hI : ∀ Z : Matrix (Fin 3) (Fin 3) ℂ, Complex.I • (Complex.I • Z) = -Z := by - intro Z - rw [smul_smul, Complex.I_mul_I, neg_smul, one_smul] - show mc2M U ν μ - mc2M U μ ν = -brMat (cmat (mcC U ν)) (cmat (mcC U μ)) - rw [mc2M, mc2M, ← smul_sub, key, brMat, cmat_mcC, cmat_mcC, mcMatrix_eq, mcMatrix_eq] - simp only [Matrix.smul_mul, Matrix.mul_smul, hI] - module - -/-! - -## D. The gauge action on potentials - --/ - -/-- A gluon potential together with all of its derivatives at a point: for each spacetime - direction a matrix of formal power series in the spacetime coordinates. -/ -abbrev Potential : Type := Lor → Matrix (Fin 3) (Fin 3) JetRing - -/-- The hermitian Maurer–Cartan series `i (∂_μ U) U†`, written without a star-module structure on - the jet ring. -/ -noncomputable def mcH (μ : Lor) : Matrix (Fin 3) (Fin 3) JetRing := - (MvPowerSeries.C Complex.I : JetRing) • mcP U μ - -lemma jetValue_mcH (μ : Lor) : Gluon.jetValue (mcH U μ) = Gluon.mcMatrix μ U.1 := by - rw [mcMatrix_eq U] - ext i j - show MvPowerSeries.constantCoeff ((MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) i j) = - Complex.I * MvPowerSeries.constantCoeff ((mcP U μ) i j) - simp - -lemma jetDeriv_mcH (ν μ : Lor) : Gluon.jetDeriv ν (mcH U μ) = mc2M U ν μ := by - rw [mc2M] - ext i j - show MvPowerSeries.coeff (Finsupp.single ν 1) - ((MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) i j) = - Complex.I * MvPowerSeries.coeff (Finsupp.single ν 1) ((mcP U μ) i j) - simp - -/-- **The local gauge action on potentials**, in the hermitian convention: - `A_μ ↦ U A_μ U† + i (∂_μ U) U†`. -/ -noncomputable def actPot (A : Potential) : Potential := - fun μ => U.1 * A μ * star U.1 + mcH U μ - -/-- **The transformation of the connection coordinate.** -/ -lemma jetValue_actPot (A : Potential) (μ : Lor) : - Gluon.jetValue (actPot U A μ) = - Gluon.jetValue U.1 * Gluon.jetValue (A μ) * star (Gluon.jetValue U.1) + - Gluon.mcMatrix μ U.1 := by - rw [actPot, jetValue_add, jetValue_mcH, Gluon.jetValue_mul, Gluon.jetValue_mul, - Gluon.jetValue_star] - -lemma jetDeriv_coe (ν : Lor) : - Gluon.jetDeriv ν U.1 = (-Complex.I) • (Gluon.mcMatrix ν U.1 * Gluon.jetValue U.1) := by - have hu : star (Gluon.jetValue U.1) * Gluon.jetValue U.1 = 1 := - mul_eq_one_comm.mp (Gluon.jetValue_mul_star_self U) - rw [Gluon.mcMatrix, Matrix.smul_mul, smul_smul, Matrix.mul_assoc, hu, Matrix.mul_one, - show (-Complex.I) * Complex.I = 1 by rw [neg_mul, Complex.I_mul_I, neg_neg], one_smul] - -lemma jetDeriv_star_coe (ν : Lor) : - Gluon.jetDeriv ν (star U.1) = - Complex.I • (star (Gluon.jetValue U.1) * Gluon.mcMatrix ν U.1) := by - have hh : star (Gluon.mcMatrix ν U.1) = Gluon.mcMatrix ν U.1 := - selfAdjoint.mem_iff.mp (Gluon.mcMatrix_mem_selfAdjoint (Gluon.coe_mul_star_self U) ν) - rw [Gluon.jetDeriv_star, jetDeriv_coe, star_smul, star_mul, hh, Complex.star_def, map_neg, - Complex.conj_I, neg_neg] - -/-- **The transformation of the derivative coordinate.** Conjugation by the base-point value, - a commutator with the Maurer–Cartan coefficient, and a translation by the second Maurer–Cartan - coefficient. -/ -lemma jetDeriv_actPot (A : Potential) (ν μ : Lor) : - Gluon.jetDeriv ν (actPot U A μ) = - Gluon.jetValue U.1 * Gluon.jetDeriv ν (A μ) * star (Gluon.jetValue U.1) - - brMat (Gluon.mcMatrix ν U.1) - (Gluon.jetValue U.1 * Gluon.jetValue (A μ) * star (Gluon.jetValue U.1)) + - mc2M U ν μ := by - rw [actPot, jetDeriv_add, jetDeriv_mcH, Gluon.jetDeriv_mul, Gluon.jetDeriv_mul, - Gluon.jetValue_mul, Gluon.jetValue_star, jetDeriv_coe, jetDeriv_star_coe] - congr 1 - rw [brMat] - simp only [Matrix.add_mul, Matrix.smul_mul, Matrix.mul_smul, smul_sub, Matrix.mul_assoc] - module - -/-! - -## E. The adjoint action on the colour carrier - --/ - -lemma adjointAction_mem_ColourSpace (u : specialUnitaryGroup (Fin 3) ℂ) - {A : selfAdjoint (Matrix (Fin 3) (Fin 3) ℂ)} (hA : A ∈ ColourSpace) : - Gluon.adjointAction u A ∈ ColourSpace := by - have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by - have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 - rwa [star_eq_conjTranspose] at h - rw [mem_ColourSpace, Gluon.adjointAction_apply_coe, trace_mul_cycle, hu, Matrix.one_mul] - exact hA - -/-- The adjoint action of a constant colour rotation on the traceless hermitian carrier. -/ -noncomputable def adC (u : specialUnitaryGroup (Fin 3) ℂ) : ColourSpace →ₗ[ℝ] ColourSpace := - LinearMap.restrict (Gluon.adjointAction u) (fun _ hX => adjointAction_mem_ColourSpace u hX) - -@[simp] -lemma cmat_adC (u : specialUnitaryGroup (Fin 3) ℂ) (X : ColourSpace) : - cmat (adC u X) = (u : Matrix (Fin 3) (Fin 3) ℂ) * cmat X * - ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := rfl - -@[simp] -lemma adC_one (X : ColourSpace) : adC 1 X = X := by - apply cmat_injective - rw [cmat_adC] - show (1 : Matrix (Fin 3) (Fin 3) ℂ) * cmat X * (1 : Matrix (Fin 3) (Fin 3) ℂ)ᴴ = cmat X - rw [Matrix.conjTranspose_one, Matrix.one_mul, Matrix.mul_one] - -/-- The adjoint action is a homomorphism for the colour bracket. -/ -lemma br_adC (u : specialUnitaryGroup (Fin 3) ℂ) (X Y : ColourSpace) : - br (adC u X) (adC u Y) = adC u (br X Y) := by - apply cmat_injective - have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by - have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 - rwa [star_eq_conjTranspose] at h - rw [cmat_br, cmat_adC, cmat_adC, cmat_adC, cmat_br, brMat, brMat] - simp only [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_sub, Matrix.sub_mul, Matrix.mul_assoc] - rw [show ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * ((u : Matrix (Fin 3) (Fin 3) ℂ) * - (cmat Y * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ)) = - cmat Y * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ by - rw [← Matrix.mul_assoc, hu, Matrix.one_mul]] - rw [show ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * ((u : Matrix (Fin 3) (Fin 3) ℂ) * - (cmat X * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ)) = - cmat X * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ by - rw [← Matrix.mul_assoc, hu, Matrix.one_mul]] - -/-- The matrix of the adjoint action in the colour basis. -/ -noncomputable def adCoef (u : specialUnitaryGroup (Fin 3) ℂ) (c c' : Col) : ℝ := - coordC c (adC u (colourBasis c')) - -lemma adCoef_one (c c' : Col) : adCoef 1 c c' = if c = c' then 1 else 0 := by - rw [adCoef, adC_one, coordC_apply] - by_cases h : c = c' - · subst h - simp - · rw [if_neg h, Basis.repr_self_apply, if_neg fun hc => h hc.symm] - -lemma coordC_adC (u : specialUnitaryGroup (Fin 3) ℂ) (X : ColourSpace) (c : Col) : - coordC c (adC u X) = ∑ c', adCoef u c c' * coordC c' X := by - conv_lhs => rw [← colourBasis.sum_repr X] - simp only [map_sum, map_smul, smul_eq_mul, coordC_apply, adCoef] - exact Finset.sum_congr rfl fun c' _ => by ring - -/-! - -## F. The substitution on the polynomial algebra - --/ - -section Poly - -variable {ι σ τ : Type*} - -/-- The adjoint action on a colour vector of polynomials. -/ -noncomputable def adP (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial ι ℝ) : - Col → MvPolynomial ι ℝ := - fun c => ∑ c', C (adCoef u c c') * p c' - -/-- A constant colour vector of polynomials. -/ -noncomputable def constP (Y : ColourSpace) : Col → MvPolynomial ι ℝ := fun c => C (coordC c Y) - -lemma adP_one (p : Col → MvPolynomial ι ℝ) (c : Col) : adP 1 p c = p c := by - rw [adP] - have h : ∀ c' : Col, (C (adCoef 1 c c') : MvPolynomial ι ℝ) * p c' = - if c = c' then p c' else 0 := by - intro c' - rw [adCoef_one] - by_cases hc : c = c' <;> simp [hc] - rw [Finset.sum_congr rfl fun c' (_ : c' ∈ Finset.univ) => h c'] - simp - -@[simp] -lemma constP_zero : constP (0 : ColourSpace) = (fun _ => 0 : Col → MvPolynomial ι ℝ) := by - funext c - rw [constP, map_zero, map_zero] - -lemma brP_zero_left (q : Col → MvPolynomial ι ℝ) (c : Col) : - brP (fun _ => 0) q c = 0 := by - rw [brP] - exact Finset.sum_eq_zero fun a _ => Finset.sum_eq_zero fun b _ => by simp - -lemma eval_adP (x : ι → ℝ) (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial ι ℝ) - (c : Col) : - eval x (adP u p c) = coordC c (adC u (mkC fun a => eval x (p a))) := by - rw [coordC_adC] - simp only [coordC_mkC] - rw [adP, map_sum] - exact Finset.sum_congr rfl fun c' _ => by rw [map_mul, eval_C] - -@[simp] -lemma eval_constP (x : ι → ℝ) (Y : ColourSpace) (c : Col) : - eval x (constP Y c : MvPolynomial ι ℝ) = coordC c Y := eval_C _ - -lemma mkC_eval_constP (x : ι → ℝ) (Y : ColourSpace) : - (mkC fun a => eval x (constP Y a : MvPolynomial ι ℝ)) = Y := by - rw [show (fun a => eval x (constP Y a : MvPolynomial ι ℝ)) = fun a => coordC a Y from - funext fun a => eval_constP x Y a] - exact mkC_coordC Y - -lemma algHom_adP (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) - (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial σ ℝ) (c : Col) : - φ (adP u p c) = adP u (fun a => φ (p a)) c := by - rw [adP, adP, map_sum] - refine Finset.sum_congr rfl fun c' _ => ?_ - rw [map_mul, ← algebraMap_eq, AlgHom.commutes, algebraMap_eq] - -lemma algHom_constP (φ : MvPolynomial σ ℝ →ₐ[ℝ] MvPolynomial τ ℝ) (Y : ColourSpace) (c : Col) : - φ (constP Y c) = constP Y c := by - show φ (C (coordC c Y)) = C (coordC c Y) - rw [← algebraMap_eq, AlgHom.commutes, algebraMap_eq] - -end Poly - -/-- The derivative colour vector in ordinary coordinates. -/ -noncomputable def derOld (ν μ : Lor) : Col → A₁ := fun c => X (Coord.der ν μ c) - -/-- **The gauge substitution**: the coordinate transcription of `jetValue_actPot` and - `jetDeriv_actPot`. -/ -noncomputable def gaugeSubst : Coord → A₁ - | Coord.conn μ c => - adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ) c + constP (mcC U μ) c - | Coord.der ν μ c => - adP (JetGaugeGroupI.evalSU (Fin 3) U) (derOld ν μ) c - - brP (constP (mcC U ν)) (adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ)) c + - constP (mc2C U ν μ) c - -/-- The pullback of the local gauge action to the first-order gluon jet algebra. -/ -noncomputable def gaugeAct : A₁ →ₐ[ℝ] A₁ := aeval (gaugeSubst U) - -@[simp] -lemma gaugeAct_conn (μ : Lor) (c : Col) : - gaugeAct U (X (Coord.conn μ c)) = - adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ) c + constP (mcC U μ) c := aeval_X _ _ - -@[simp] -lemma gaugeAct_der (ν μ : Lor) (c : Col) : - gaugeAct U (X (Coord.der ν μ c)) = - adP (JetGaugeGroupI.evalSU (Fin 3) U) (derOld ν μ) c - - brP (constP (mcC U ν)) (adP (JetGaugeGroupI.evalSU (Fin 3) U) (connOld μ)) c + - constP (mc2C U ν μ) c := aeval_X _ _ - -/-! - -## G. Points of the coordinate space - -Polynomial identities are proved by evaluating at every point, which turns them into identities in -the colour carrier. `MvPolynomial.funext` applies because `ℝ` is an infinite integral domain. - --/ - -/-- The connection of the configuration described by a point of the coordinate space. -/ -noncomputable def cfgA (x : Coord → ℝ) (μ : Lor) : ColourSpace := mkC fun c => x (Coord.conn μ c) - -/-- The connection derivative of the configuration described by a point. -/ -noncomputable def cfgD (x : Coord → ℝ) (ν μ : Lor) : ColourSpace := - mkC fun c => x (Coord.der ν μ c) - -/-- The field strength of the configuration described by a point. -/ -noncomputable def curvC (x : Coord → ℝ) (ν μ : Lor) : ColourSpace := - cfgD x ν μ - cfgD x μ ν + br (cfgA x ν) (cfgA x μ) - -/-- The transformed connection. -/ -noncomputable def actA (x : Coord → ℝ) (μ : Lor) : ColourSpace := - adC (JetGaugeGroupI.evalSU (Fin 3) U) (cfgA x μ) + mcC U μ - -/-- The transformed connection derivative. -/ -noncomputable def actD (x : Coord → ℝ) (ν μ : Lor) : ColourSpace := - adC (JetGaugeGroupI.evalSU (Fin 3) U) (cfgD x ν μ) - - br (mcC U ν) (adC (JetGaugeGroupI.evalSU (Fin 3) U) (cfgA x μ)) + mc2C U ν μ - -/-- The transformed point of the coordinate space. -/ -noncomputable def actPt (x : Coord → ℝ) : Coord → ℝ - | Coord.conn μ c => coordC c (actA U x μ) - | Coord.der ν μ c => coordC c (actD U x ν μ) - -lemma mkC_eval_connOld (x : Coord → ℝ) (μ : Lor) : - (mkC fun a => eval x (connOld μ a)) = cfgA x μ := by - rw [cfgA] - congr 1 - funext a - exact eval_X _ - -lemma mkC_eval_derOld (x : Coord → ℝ) (ν μ : Lor) : - (mkC fun a => eval x (derOld ν μ a)) = cfgD x ν μ := by - rw [cfgD] - congr 1 - funext a - exact eval_X _ - -lemma mkC_eval_adP_connOld (x : Coord → ℝ) (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : - (mkC fun b => eval x (adP u (connOld μ) b)) = adC u (cfgA x μ) := by - rw [show (fun b => eval x (adP u (connOld μ) b)) = fun b => coordC b (adC u (cfgA x μ)) from - funext fun b => by rw [eval_adP, mkC_eval_connOld]] - exact mkC_coordC _ - -lemma eval_gaugeSubst (x : Coord → ℝ) (i : Coord) : - eval x (gaugeSubst U i) = actPt U x i := by - cases i with - | conn μ c => - rw [gaugeSubst, map_add, eval_adP, eval_constP, mkC_eval_connOld, actPt, actA, map_add] - | der ν μ c => - rw [gaugeSubst, map_add, map_sub, eval_adP, eval_constP, eval_brP, mkC_eval_derOld, - mkC_eval_constP, mkC_eval_adP_connOld, actPt, actD, map_add, map_sub] - -lemma eval_gaugeAct (x : Coord → ℝ) (P : A₁) : - eval x (gaugeAct U P) = eval (actPt U x) P := by - have h : (fun i => eval x (gaugeSubst U i)) = actPt U x := - funext fun i => eval_gaugeSubst U x i - rw [gaugeAct, MvPolynomial.eval_aeval, h] - -@[simp] -lemma cfgA_actPt (x : Coord → ℝ) (μ : Lor) : cfgA (actPt U x) μ = actA U x μ := mkC_coordC _ - -@[simp] -lemma cfgD_actPt (x : Coord → ℝ) (ν μ : Lor) : cfgD (actPt U x) ν μ = actD U x ν μ := - mkC_coordC _ - -lemma eval_curvPoly (x : Coord → ℝ) (ν μ : Lor) (c : Col) : - eval x (curvPoly ν μ c) = coordC c (curvC x ν μ) := by - simp only [curvPoly, curvC, cfgD, map_add, map_sub, eval_X, coordC_mkC] - rw [eval_brP, mkC_eval_connOld, mkC_eval_connOld] - -/-! - -## H. Covariance of the field strength - --/ - -private lemma curv_shift (Av Am Dvm Dmv mv mm tvm tmv : ColourSpace) - (ht : tvm - tmv = -br mv mm) : - (Dvm - br mv Am + tvm) - (Dmv - br mm Av + tmv) + br (Av + mv) (Am + mm) - = Dvm - Dmv + br Av Am := by - have h1 : br (Av + mv) (Am + mm) = br Av Am + br Av mm + br mv Am + br mv mm := by - rw [show br (Av + mv) = br Av + br mv from map_add br Av mv, LinearMap.add_apply, - map_add, map_add] - abel - have h2 : br Av mm = -br mm Av := br_swap Av mm - have ht' : tvm = tmv - br mv mm := by - rw [sub_eq_iff_eq_add.mp ht] - abel - rw [h1, h2, ht'] - abel - -/-- **Covariance of the field strength.** Under any gauge jet the field strength of the - transformed configuration is the conjugate, by the base-point value of the jet, of the field - strength of the original configuration. -/ -lemma curvC_actPt (x : Coord → ℝ) (ν μ : Lor) : - curvC (actPt U x) ν μ = adC (JetGaugeGroupI.evalSU (Fin 3) U) (curvC x ν μ) := by - rw [curvC, cfgA_actPt, cfgA_actPt, cfgD_actPt, cfgD_actPt, actA, actA, actD, actD, - curv_shift _ _ _ _ _ _ _ _ (mc2C_sub U ν μ), curvC, map_add, map_sub, br_adC] - -/-- **Covariance of the field strength, in coordinates.** This is the transformation law the - completeness theorem consumes: the curvature generators span a subspace on which the whole jet - gauge group acts through its evaluation at the base point. -/ -lemma gaugeAct_curvPoly (ν μ : Lor) (c : Col) : - gaugeAct U (curvPoly ν μ c) = - ∑ c', C (adCoef (JetGaugeGroupI.evalSU (Fin 3) U) c c') * curvPoly ν μ c' := by - refine MvPolynomial.funext fun x => ?_ - rw [eval_gaugeAct, eval_curvPoly, curvC_actPt, coordC_adC, map_sum] - exact Finset.sum_congr rfl fun c' _ => by rw [map_mul, eval_C, eval_curvPoly] - -/-! - -## I. Constant jets - --/ - -lemma pderiv_C_jet (ν : Lor) (a : ℂ) : - MvPowerSeries.pderiv ℂ ν (MvPowerSeries.C a : JetRing) = 0 := by - ext k - have hne : k + Finsupp.single ν 1 ≠ 0 := by - intro h - have h' := DFunLike.congr_fun h ν - rw [Finsupp.add_apply, Finsupp.single_eq_same] at h' - simp at h' - rw [MvPowerSeries.coeff_pderiv, MvPowerSeries.coeff_C, if_neg hne, zero_mul, map_zero] - -lemma dMat_map_C (ν : Lor) (M : Matrix (Fin 3) (Fin 3) ℂ) : - dMat ν (M.map (MvPowerSeries.C : ℂ →+* JetRing)) = 0 := - Matrix.ext fun i j => pderiv_C_jet ν (M i j) - -lemma jetValue_map_C (M : Matrix (Fin 3) (Fin 3) ℂ) : - Gluon.jetValue (M.map (MvPowerSeries.C : ℂ →+* JetRing)) = M := by - refine Matrix.ext fun i j => ?_ - show MvPowerSeries.constantCoeff (MvPowerSeries.C (M i j) : JetRing) = M i j - simp - -@[simp] -lemma jetDeriv_zero (ν : Lor) : - Gluon.jetDeriv ν (0 : Matrix (Fin 3) (Fin 3) JetRing) = 0 := by - refine Matrix.ext fun i j => ?_ - show MvPowerSeries.coeff (Finsupp.single ν 1) (0 : JetRing) = 0 - exact map_zero _ - -lemma ofConstantSU_coe (u : specialUnitaryGroup (Fin 3) ℂ) : - ((JetGaugeGroupI.ofConstantSU (Fin 3) u : specialUnitaryGroup (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) JetRing) = - (u : Matrix (Fin 3) (Fin 3) ℂ).map (MvPowerSeries.C : ℂ →+* JetRing) := rfl - -lemma mcP_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : - mcP (JetGaugeGroupI.ofConstantSU (Fin 3) u) μ = 0 := by - rw [mcP, ofConstantSU_coe, dMat_map_C, Matrix.zero_mul] - -lemma mcC_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : - mcC (JetGaugeGroupI.ofConstantSU (Fin 3) u) μ = 0 := - Subtype.ext (SU3Jet.mcCoeff_ofConstantSU u μ) - -lemma mc2C_ofConstantSU (u : specialUnitaryGroup (Fin 3) ℂ) (ν μ : Lor) : - mc2C (JetGaugeGroupI.ofConstantSU (Fin 3) u) ν μ = 0 := by - apply cmat_injective - show mc2M _ ν μ = cmat 0 - rw [mc2M, mcP_ofConstantSU, jetDeriv_zero, smul_zero, cmat_zero] - -/-! - -## J. Jets based to order one - --/ - -lemma jetValue_eq_one (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) : Gluon.jetValue U.1 = 1 := by - rw [← Gluon.evalSU_coe, hU] - rfl - -lemma mcMatrix_eq_zero (hm : ∀ ρ, mcC U ρ = 0) (ν : Lor) : Gluon.mcMatrix ν U.1 = 0 := by - have h := congrArg cmat (hm ν) - rwa [cmat_mcC, cmat_zero] at h - -lemma jetDeriv_eq_zero (hm : ∀ ρ, mcC U ρ = 0) (ν : Lor) : Gluon.jetDeriv ν U.1 = 0 := by - rw [jetDeriv_coe, mcMatrix_eq_zero U hm, Matrix.zero_mul, smul_zero] - -/-- On a jet based to order one the second Maurer–Cartan coefficient is just the second Taylor - coefficient of the jet: no lower-order corrections survive. -/ -lemma mc2M_of_based_one (hU : JetGaugeGroupI.evalSU (Fin 3) U = 1) (hm : ∀ ρ, mcC U ρ = 0) - (ν μ : Lor) : mc2M U ν μ = Complex.I • Gluon.jetDeriv ν (dMat μ U.1) := by - have h1 : Gluon.jetValue U.1 = 1 := jetValue_eq_one U hU - have h2 : Gluon.jetValue (dMat μ U.1) = 0 := by - rw [jetValue_dMat] - exact jetDeriv_eq_zero U hm μ - rw [mc2M, mcP, Gluon.jetDeriv_mul, Gluon.jetValue_star, h1, star_one, Matrix.mul_one, h2, - Matrix.zero_mul, add_zero] - -lemma jetDeriv_dMat_eq (ν μ : Lor) (M : Matrix (Fin 3) (Fin 3) JetRing) : - Gluon.jetDeriv ν (dMat μ M) = - ((((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℂ) + 1) • - coeffMat (Finsupp.single ν 1 + Finsupp.single μ 1) M := by - refine Matrix.ext fun i j => ?_ - show MvPowerSeries.coeff (Finsupp.single ν 1) (MvPowerSeries.pderiv ℂ μ (M i j)) = - ((((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℂ) + 1) * - MvPowerSeries.coeff (Finsupp.single ν 1 + Finsupp.single μ 1) (M i j) - rw [MvPowerSeries.coeff_pderiv] - ring - -/-! - -### J.1. Conjugation by a constant colour rotation - --/ - -lemma coe_inv_su3 (v : specialUnitaryGroup (Fin 3) ℂ) : - ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = - ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by - have h1 : ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (v : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by - have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp v.2).1 - rwa [star_eq_conjTranspose] at h - have h2 : (v : Matrix (Fin 3) (Fin 3) ℂ) * - ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by - have h : ((v * v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by - rw [mul_inv_cancel] - rfl - rw [← h] - rfl - calc ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) - = 1 * ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) := by - rw [Matrix.one_mul] - _ = ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (v : Matrix (Fin 3) (Fin 3) ℂ) * - ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) := by rw [h1] - _ = ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * ((v : Matrix (Fin 3) (Fin 3) ℂ) * - ((v⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ)) := by - rw [Matrix.mul_assoc] - _ = ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by rw [h2, Matrix.mul_one] - -/-- A based gauge jet conjugated by a constant colour rotation. -/ -noncomputable def conjBy (v : specialUnitaryGroup (Fin 3) ℂ) - (V : specialUnitaryGroup (Fin 3) JetRing) : specialUnitaryGroup (Fin 3) JetRing := - JetGaugeGroupI.ofConstantSU (Fin 3) v * V * (JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ - -lemma coe_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) (V : specialUnitaryGroup (Fin 3) JetRing) : - ((conjBy v V : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) = - (v : Matrix (Fin 3) (Fin 3) ℂ).map (MvPowerSeries.C : ℂ →+* JetRing) * V.1 * - ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ.map (MvPowerSeries.C : ℂ →+* JetRing) := by - rw [conjBy, show ((JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ : - specialUnitaryGroup (Fin 3) JetRing) = JetGaugeGroupI.ofConstantSU (Fin 3) v⁻¹ from - (map_inv _ v).symm, ← coe_inv_su3 v] - rfl - -lemma evalSU_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) - {V : specialUnitaryGroup (Fin 3) JetRing} (hV : JetGaugeGroupI.evalSU (Fin 3) V = 1) : - JetGaugeGroupI.evalSU (Fin 3) (conjBy v V) = 1 := by - rw [conjBy, map_mul, map_mul, map_inv, SU3Jet.evalSU_ofConstantSU, hV, mul_one, mul_inv_cancel] - -lemma mcCoeff_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) - (V : specialUnitaryGroup (Fin 3) JetRing) (ρ : Lor) : - Gluon.mcCoeff (conjBy v V) ρ = Gluon.adjointAction v (Gluon.mcCoeff V ρ) := by - have hinv : (JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ = - JetGaugeGroupI.ofConstantSU (Fin 3) v⁻¹ := (map_inv _ v).symm - simp only [conjBy, hinv, Gluon.mcCoeff_mul, SU3Jet.mcCoeff_ofConstantSU, zero_add, - SU3Jet.evalSU_ofConstantSU, map_zero, add_zero] - -lemma mcC_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) {V : specialUnitaryGroup (Fin 3) JetRing} - (hm : ∀ ρ, mcC V ρ = 0) (ρ : Lor) : mcC (conjBy v V) ρ = 0 := by - apply Subtype.ext - show Gluon.mcCoeff (conjBy v V) ρ = 0 - rw [mcCoeff_conjBy, show Gluon.mcCoeff V ρ = 0 from congrArg Subtype.val (hm ρ), map_zero] - -lemma dMat_conj_const (P R : Matrix (Fin 3) (Fin 3) ℂ) (M : Matrix (Fin 3) (Fin 3) JetRing) - (μ : Lor) : - dMat μ (P.map (MvPowerSeries.C : ℂ →+* JetRing) * M * - R.map (MvPowerSeries.C : ℂ →+* JetRing)) = - P.map (MvPowerSeries.C : ℂ →+* JetRing) * dMat μ M * - R.map (MvPowerSeries.C : ℂ →+* JetRing) := by - rw [dMat_mul, dMat_mul, dMat_map_C, dMat_map_C] - simp - -lemma jetDeriv_conj_const (P R : Matrix (Fin 3) (Fin 3) ℂ) (M : Matrix (Fin 3) (Fin 3) JetRing) - (ν : Lor) : - Gluon.jetDeriv ν (P.map (MvPowerSeries.C : ℂ →+* JetRing) * M * - R.map (MvPowerSeries.C : ℂ →+* JetRing)) = P * Gluon.jetDeriv ν M * R := by - rw [Gluon.jetDeriv_mul, Gluon.jetDeriv_mul, Gluon.jetDeriv_map_C, Gluon.jetDeriv_map_C, - jetValue_map_C, jetValue_map_C] - simp - -/-- Conjugating a based gauge jet by a constant colour rotation conjugates its second - Maurer–Cartan coefficient. -/ -lemma mc2C_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) {V : specialUnitaryGroup (Fin 3) JetRing} - (hV : JetGaugeGroupI.evalSU (Fin 3) V = 1) (hm : ∀ ρ, mcC V ρ = 0) (ν μ : Lor) : - mc2C (conjBy v V) ν μ = adC v (mc2C V ν μ) := by - apply cmat_injective - rw [cmat_adC, cmat_mc2C, cmat_mc2C, - mc2M_of_based_one _ (evalSU_conjBy v hV) (mcC_conjBy v hm), - mc2M_of_based_one _ hV hm, coe_conjBy, dMat_conj_const, jetDeriv_conj_const] - simp only [Matrix.smul_mul, Matrix.mul_smul] - -/-! - -## K. The order-two diagonal jet - --/ - -/-- The total degree of a spacetime multi-index. -/ -noncomputable def lorDeg (k : Lor →₀ ℕ) : ℕ := ∑ i, k i - -lemma lorDeg_add (k l : Lor →₀ ℕ) : lorDeg (k + l) = lorDeg k + lorDeg l := by - rw [lorDeg, lorDeg, lorDeg, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun i _ => rfl - -lemma lorDeg_nsmul (n : ℕ) (k : Lor →₀ ℕ) : lorDeg (n • k) = n * lorDeg k := by - rw [lorDeg, lorDeg, Finset.mul_sum] - exact Finset.sum_congr rfl fun i _ => by simp - -lemma lorDeg_single (ν : Lor) : lorDeg (Finsupp.single ν 1) = 1 := by - classical - rw [lorDeg] - simp [Finsupp.single_apply] - -lemma single_ne_nsmul_two {ν μ ν₀ μ₀ : Lor} - (hk : (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) ≠ - Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (n : ℕ) : - (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) ≠ - n • (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) := by - intro h - have hdeg := congrArg lorDeg h - rw [lorDeg_add, lorDeg_single, lorDeg_single, lorDeg_nsmul, lorDeg_add, lorDeg_single, - lorDeg_single] at hdeg - have hn : n = 1 := by omega - rw [hn, one_smul] at h - exact hk h - -/-- Two degree-two spacetime exponents agree exactly when the unordered pairs agree. -/ -lemma single_add_single_inj {ν μ ν' μ' : Lor} - (h : (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) = - Finsupp.single ν' 1 + Finsupp.single μ' 1) : s(ν, μ) = s(ν', μ') := by - have hm : ({ν, μ} : Multiset Lor) = {ν', μ'} := by - have hc := congrArg Finsupp.toMultiset h - simpa [Finsupp.toMultiset_single] using hc - rcases Multiset.cons_eq_cons.mp hm with ⟨h1, h2⟩ | ⟨_, cs, h2, h3⟩ - · rw [Sym2.eq_iff] - exact Or.inl ⟨h1, Multiset.singleton_inj.mp h2⟩ - · have hcs : cs = 0 := by - have hcard := congrArg Multiset.card h2 - simp at hcard - omega - subst hcs - rw [Sym2.eq_iff] - refine Or.inr ⟨?_, ?_⟩ - · exact (Multiset.singleton_inj.mp (by simpa using h3)).symm - · exact Multiset.singleton_inj.mp (by simpa using h2) - -lemma sym2_eq_iff_exp {ν μ ν₀ μ₀ : Lor} : - s(ν, μ) = s(ν₀, μ₀) ↔ - (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) = - Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1 := by - refine ⟨fun h => ?_, single_add_single_inj⟩ - rcases Sym2.eq_iff.mp h with ⟨h1, h2⟩ | ⟨h1, h2⟩ - · rw [h1, h2] - · rw [h1, h2, add_comm] - -/-- The multiplicity factor of a symmetric pair: `2` on the diagonal, `1` off it. -/ -noncomputable def dfac (ν μ : Lor) : ℝ := (((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℝ) + 1 - -lemma dfac_ne_zero (ν μ : Lor) : dfac ν μ ≠ 0 := by - have h : (0 : ℝ) < dfac ν μ := by rw [dfac]; positivity - exact ne_of_gt h - -lemma dfac_symm (ν μ : Lor) : dfac ν μ = dfac μ ν := by - classical - rw [dfac, dfac, Finsupp.single_apply, Finsupp.single_apply] - by_cases h : ν = μ - · rw [if_pos h, if_pos h.symm] - · rw [if_neg h, if_neg fun hc => h hc.symm] - -/-- The `DiagonalJet` colour direction `diag(1, -1, 0)` as an element of the colour carrier. -/ -noncomputable def colourC : ColourSpace := ⟨colourH, trace_colourMat⟩ - -@[simp] -lemma cmat_colourC : cmat colourC = colourMat := rfl - -/-- **The order-two translation realized by the `DiagonalJet` diagonal jet.** For a degree-two - spacetime - exponent the diagonal jet is based to order one, and it translates exactly the symmetric - derivative coordinates belonging to the unordered pair `{ν₀, μ₀}`. -/ -lemma mc2C_diagSU_two (a : ℝ) (ν₀ μ₀ ν μ : Lor) : - mc2C (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀)) ν μ = - if s(ν, μ) = s(ν₀, μ₀) then (dfac ν₀ μ₀ * a) • colourC else 0 := by - classical - have hbased : JetGaugeGroupI.evalSU (Fin 3) - (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀)) = 1 := - evalSU_diagSU a _ _ - have hm : ∀ ρ, mcC (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) - (add_single_ne_zero ν₀ μ₀)) ρ = 0 := fun ρ => Subtype.ext (mcCoeff_diagSU_two a ν₀ μ₀ ρ) - apply cmat_injective - rw [cmat_mc2C, mc2M_of_based_one _ hbased hm, jetDeriv_dMat_eq] - by_cases hk : s(ν, μ) = s(ν₀, μ₀) - · have hexp := sym2_eq_iff_exp.mp hk - have hfac : dfac ν μ = dfac ν₀ μ₀ := by - rcases Sym2.eq_iff.mp hk with ⟨h1, h2⟩ | ⟨h1, h2⟩ - · rw [h1, h2] - · rw [h1, h2, dfac_symm] - rw [if_pos hk] - show _ = ((dfac ν₀ μ₀ * a : ℝ) : ℂ) • colourMat - rw [show (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) - (add_single_ne_zero ν₀ μ₀) : Matrix (Fin 3) (Fin 3) JetRing) = - diagMat a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀) from rfl, - hexp, coeffMat_diagMat_self, smul_smul, smul_smul, ← hfac, dfac] - congr 1 - push_cast - linear_combination (-((((Finsupp.single ν 1 : Lor →₀ ℕ) μ : ℕ) : ℂ) + 1) * (a : ℂ)) * - Complex.I_mul_I - · rw [if_neg hk] - have hexp : (Finsupp.single ν 1 + Finsupp.single μ 1 : Lor →₀ ℕ) ≠ - Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1 := fun hc => hk (single_add_single_inj hc) - rw [show (diagSU a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) - (add_single_ne_zero ν₀ μ₀) : Matrix (Fin 3) (Fin 3) JetRing) = - diagMat a (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀) from rfl, - coeffMat_diagMat_eq_zero a _ (add_single_ne_zero ν₀ μ₀) (add_single_ne_zero ν μ) - (single_ne_nsmul_two hexp), smul_zero, smul_zero, cmat_zero] - -/-! - -## L. Realizability of the two translations - --/ - -lemma adC_colourC (k : Col) : adC (colourConj k) colourC = colourBasis k := - Subtype.ext (colourBasis_eq_adjointAction k) - -/-- **Order-two realizability.** For every unordered pair of spacetime directions, every colour - basis direction and every real number there is a gauge jet, based to order one, which translates - exactly the corresponding symmetric derivative coordinate. -/ -lemma exists_based_two (s : Sym2 Lor) (c₀ : Col) (r : ℝ) : - ∃ U : specialUnitaryGroup (Fin 3) JetRing, - JetGaugeGroupI.evalSU (Fin 3) U = 1 ∧ (∀ ρ, mcC U ρ = 0) ∧ - ∀ ν μ, mc2C U ν μ = if s(ν, μ) = s then r • colourBasis c₀ else 0 := by - classical - induction s using Sym2.ind with - | _ ν₀ μ₀ => - refine ⟨conjBy (colourConj c₀) (diagSU (r / dfac ν₀ μ₀) - (Finsupp.single ν₀ 1 + Finsupp.single μ₀ 1) (add_single_ne_zero ν₀ μ₀)), ?_, ?_, ?_⟩ - · exact evalSU_conjBy _ (evalSU_diagSU _ _ _) - · exact mcC_conjBy _ fun ρ => Subtype.ext (mcCoeff_diagSU_two _ ν₀ μ₀ ρ) - · intro ν μ - rw [mc2C_conjBy _ (evalSU_diagSU _ _ _) - (fun ρ => Subtype.ext (mcCoeff_diagSU_two _ ν₀ μ₀ ρ)), mc2C_diagSU_two] - by_cases hk : s(ν, μ) = s(ν₀, μ₀) - · rw [if_pos hk, if_pos hk, map_smul, adC_colourC, - mul_div_cancel₀ r (dfac_ne_zero ν₀ μ₀)] - · rw [if_neg hk, if_neg hk, map_zero] - -/-! - -## M. Faithfulness of the substitution - -`gaugeSubst` was written to match `jetValue_actPot` and `jetDeriv_actPot`. This section closes the -loop rather than leaving the match to inspection: for a potential whose base-point value and first -Taylor coefficients are traceless hermitian in every direction — the physical colour carrier — -reading off the coordinates and then substituting is the same as acting and then reading off the -coordinates. - --/ - -/-- A potential is a *colour potential* when its base-point value and its first Taylor coefficients - are traceless hermitian in every spacetime direction. -/ -structure IsColourPot (A : Potential) : Prop where - /-- The base-point value is hermitian. -/ - star_val : ∀ μ, star (Gluon.jetValue (A μ)) = Gluon.jetValue (A μ) - /-- The base-point value is traceless. -/ - trace_val : ∀ μ, trace (Gluon.jetValue (A μ)) = 0 - /-- The first Taylor coefficients are hermitian. -/ - star_der : ∀ ν μ, star (Gluon.jetDeriv ν (A μ)) = Gluon.jetDeriv ν (A μ) - /-- The first Taylor coefficients are traceless. -/ - trace_der : ∀ ν μ, trace (Gluon.jetDeriv ν (A μ)) = 0 - -/-- The point of the coordinate space described by a colour potential. -/ -noncomputable def potCoord {A : Potential} (h : IsColourPot A) : Coord → ℝ - | Coord.conn μ c => coordC c (mkCM (Gluon.jetValue (A μ)) (h.star_val μ) (h.trace_val μ)) - | Coord.der ν μ c => - coordC c (mkCM (Gluon.jetDeriv ν (A μ)) (h.star_der ν μ) (h.trace_der ν μ)) - -lemma cfgA_potCoord {A : Potential} (h : IsColourPot A) (μ : Lor) : - cfgA (potCoord h) μ = mkCM (Gluon.jetValue (A μ)) (h.star_val μ) (h.trace_val μ) := - mkC_coordC _ - -lemma cfgD_potCoord {A : Potential} (h : IsColourPot A) (ν μ : Lor) : - cfgD (potCoord h) ν μ = mkCM (Gluon.jetDeriv ν (A μ)) (h.star_der ν μ) (h.trace_der ν μ) := - mkC_coordC _ - -private lemma star_conj_u (u : specialUnitaryGroup (Fin 3) ℂ) {M : Matrix (Fin 3) (Fin 3) ℂ} - (hM : star M = M) : - star ((u : Matrix (Fin 3) (Fin 3) ℂ) * M * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) = - (u : Matrix (Fin 3) (Fin 3) ℂ) * M * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by - have h1 : star ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ = (u : Matrix (Fin 3) (Fin 3) ℂ) := by - rw [star_eq_conjTranspose, Matrix.conjTranspose_conjTranspose] - have h2 : star (u : Matrix (Fin 3) (Fin 3) ℂ) = ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := - star_eq_conjTranspose _ - rw [star_mul, star_mul, h1, h2, hM, Matrix.mul_assoc] - -private lemma trace_conj_u (u : specialUnitaryGroup (Fin 3) ℂ) (M : Matrix (Fin 3) (Fin 3) ℂ) : - trace ((u : Matrix (Fin 3) (Fin 3) ℂ) * M * ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) = trace M := by - have hu : ((u : Matrix (Fin 3) (Fin 3) ℂ))ᴴ * (u : Matrix (Fin 3) (Fin 3) ℂ) = 1 := by - have h := mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp u.2).1 - rwa [star_eq_conjTranspose] at h - rw [trace_mul_cycle, hu, Matrix.one_mul] - -lemma jetValue_coe_eq (U : specialUnitaryGroup (Fin 3) JetRing) : - Gluon.jetValue U.1 = - ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ) := (Gluon.evalSU_coe U).symm - -/-- The local gauge action preserves the physical colour carrier: this is where tracelessness of - the Maurer–Cartan series is used. -/ -lemma isColourPot_actPot {A : Potential} (h : IsColourPot A) - (U : specialUnitaryGroup (Fin 3) JetRing) : IsColourPot (actPot U A) := by - set u := JetGaugeGroupI.evalSU (Fin 3) U with hu - have hcoe : Gluon.jetValue U.1 = ((u : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ) := jetValue_coe_eq U - have hstar : star ((u : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ) = - ((u : specialUnitaryGroup (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ)ᴴ := - star_eq_conjTranspose _ - have hm : ∀ ν, star (Gluon.mcMatrix ν U.1) = Gluon.mcMatrix ν U.1 := fun ν => - selfAdjoint.mem_iff.mp (Gluon.mcMatrix_mem_selfAdjoint (Gluon.coe_mul_star_self U) ν) - have hmt : ∀ ν, trace (Gluon.mcMatrix ν U.1) = 0 := fun ν => (mcC U ν).2 - refine ⟨fun μ => ?_, fun μ => ?_, fun ν μ => ?_, fun ν μ => ?_⟩ - · rw [jetValue_actPot, star_add, hm, hcoe, hstar, star_conj_u u (h.star_val μ)] - · rw [jetValue_actPot, trace_add, hcoe, hstar, trace_conj_u, h.trace_val, hmt, add_zero] - · rw [jetDeriv_actPot, star_add, star_sub, star_mc2M, hcoe, hstar, - star_conj_u u (h.star_der ν μ), brMat_star (hm ν) (star_conj_u u (h.star_val μ))] - · rw [jetDeriv_actPot, trace_add, trace_sub, trace_mc2M, hcoe, hstar, trace_conj_u, - h.trace_der, brMat_trace, sub_zero, add_zero] - -/-- **The substitution really is the coordinate form of the action.** Acting on a colour potential - and then reading off its coordinates is the same as reading off its coordinates and then applying - the transformed-point map that `gaugeSubst` evaluates to. -/ -lemma potCoord_actPot {A : Potential} (h : IsColourPot A) - (U : specialUnitaryGroup (Fin 3) JetRing) : - potCoord (isColourPot_actPot h U) = actPt U (potCoord h) := by - have hcoe : Gluon.jetValue U.1 = - ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ) := jetValue_coe_eq U - have hstar : star ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ) = - ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ)ᴴ := star_eq_conjTranspose _ - funext i - cases i with - | conn μ c => - show coordC c (mkCM (Gluon.jetValue (actPot U A μ)) _ _) = coordC c (actA U (potCoord h) μ) - congr 1 - apply cmat_injective - rw [cmat_mkCM, jetValue_actPot, actA, cmat_add, cmat_adC, cfgA_potCoord, cmat_mkCM, - cmat_mcC, hcoe, hstar] - | der ν μ c => - show coordC c (mkCM (Gluon.jetDeriv ν (actPot U A μ)) _ _) = - coordC c (actD U (potCoord h) ν μ) - congr 1 - apply cmat_injective - rw [cmat_mkCM, jetDeriv_actPot, actD, cmat_add, cmat_sub, cmat_adC, cmat_br, cmat_adC, - cfgD_potCoord, cfgA_potCoord, cmat_mkCM, cmat_mkCM, cmat_mcC, cmat_mc2C, hcoe, hstar] - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean deleted file mode 100644 index 55a6d63b5..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HighestLayer.lean +++ /dev/null @@ -1,451 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.CovariantTower -/-! -# Arbitrary-order highest-layer translations - -## i. Overview - -This file proves the programme-level highest-layer statement on `OrdinaryJets`'s ordinary -carrier. A gauge jet based through order `r` fixes every ordinary generator below order `r` and -acts on order `r` by a constant translation. The translation depends only on the total -multi-index obtained by adjoining the connection index, so it is totally symmetric in all -`r + 1` indices. - -The factorial convention is essential: `facI_add_single` turns the derivative multiplicity in -`dMat` into the factorial of the total multi-index. No hook coordinate or symmetric projection is -introduced here. --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -namespace SU3Jet - -/-! - -## A. Jets based through a finite order - --/ - -/-- A gauge jet based through order `r`: its value is the identity and every positive Taylor -coefficient of total degree at most `r` vanishes. -/ -def BasedTo (r : ℕ) (U : specialUnitaryGroup (Fin 3) JetRing) : Prop := - Gluon.jetValue U.1 = 1 ∧ - ∀ k, 0 < lorDeg k → lorDeg k ≤ r → coeffMat k U.1 = 0 - -lemma lorDeg_eq_zero_iff (k : DIdx) : lorDeg k = 0 ↔ k = 0 := by - constructor - · intro hk - ext μ - have hle : k μ ≤ lorDeg k := by - rw [lorDeg] - exact Finset.single_le_sum (fun _ _ ↦ Nat.zero_le _) (Finset.mem_univ μ) - rw [hk] at hle - exact Nat.eq_zero_of_le_zero hle - · rintro rfl - simp [lorDeg] - -lemma lorDeg_pos_iff (k : DIdx) : 0 < lorDeg k ↔ k ≠ 0 := by - rw [Nat.pos_iff_ne_zero, ne_eq, lorDeg_eq_zero_iff] - -private lemma left_le_of_add_eq {p q k : DIdx} (h : p + q = k) : lorDeg p ≤ lorDeg k := by - have hdeg := congrArg lorDeg h - rw [lorDeg_add] at hdeg - omega - -private lemma right_le_of_add_eq {p q k : DIdx} (h : p + q = k) : lorDeg q ≤ lorDeg k := by - have hdeg := congrArg lorDeg h - rw [lorDeg_add] at hdeg - omega - -lemma basedTo_evalSU (hU : BasedTo r U) : JetGaugeGroupI.evalSU (Fin 3) U = 1 := by - apply Subtype.ext - rw [Gluon.evalSU_coe] - exact hU.1 - -/-! - -## B. Truncation of coefficient conjugation - --/ - -private lemma coeffMat_mul_constMat (k : DIdx) (P : Matrix (Fin 3) (Fin 3) JetRing) - (M : Matrix (Fin 3) (Fin 3) ℂ) : coeffMat k (P * constMat M) = coeffMat k P * M := by - ext i j - simp only [coeffMat, Matrix.map_apply, Matrix.mul_apply, map_sum, constMat_apply, - MvPowerSeries.coeff_mul_C] - -/-- The coefficient of a conjugated constant matrix is the two-sided coefficient convolution. -/ -lemma conjCoeffM_eq_sum (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) - (M : Matrix (Fin 3) (Fin 3) ℂ) : - conjCoeffM U t M = - ∑ p ∈ Finset.antidiagonal t, coeffMat p.1 U.1 * M * star (coeffMat p.2 U.1) := by - rw [conjCoeffM, coeffMat_mul] - refine Finset.sum_congr rfl fun p _ ↦ ?_ - rw [coeffMat_mul_constMat, star_coeffMat] - -/-- Positive coefficient-conjugation orders through `r` vanish for a jet based through `r`. -/ -lemma conjC_eq_zero_of_basedTo (hU : BasedTo r U) (ht0 : 0 < lorDeg t) - (htr : lorDeg t ≤ r) : conjC U t = 0 := by - apply LinearMap.ext - intro X - apply cmat_injective - rw [cmat_conjC, LinearMap.zero_apply, cmat_zero, conjCoeffM_eq_sum] - apply Finset.sum_eq_zero - rintro ⟨p, q⟩ hpq - have hpq' : p + q = t := Finset.mem_antidiagonal.mp hpq - by_cases hp0 : p = 0 - · subst p - have hqt : q = t := by simpa using hpq' - subst q - rw [hU.2 t ht0 htr, star_zero, Matrix.mul_zero] - · have hpdeg : 0 < lorDeg p := (lorDeg_pos_iff p).2 hp0 - rw [hU.2 p hpdeg ((left_le_of_add_eq hpq').trans htr), Matrix.zero_mul, - Matrix.zero_mul] - -/-- At coefficient order zero, a based jet acts by the identity colour endomorphism. -/ -lemma conjC_zero_of_basedTo (hU : BasedTo r U) : conjC U 0 = LinearMap.id := by - apply LinearMap.ext - intro X - rw [conjC_zero, basedTo_evalSU hU, adC_one, LinearMap.id_apply] - -/-! - -## C. The canonical highest-layer shift - --/ - -/-- A canonical direction occurring in a nonzero total multi-index. -/ -noncomputable def layerDir (w : DIdx) : Lor := - if hw : w = 0 then default else Classical.choose (Finsupp.ne_iff.mp hw) - -lemma layerDir_coeff_ne_zero {w : DIdx} (hw : w ≠ 0) : w (layerDir w) ≠ 0 := by - rw [layerDir, dif_neg hw] - exact Classical.choose_spec (Finsupp.ne_iff.mp hw) - -/-- The predecessor obtained by removing one occurrence of `layerDir w`. -/ -noncomputable def layerPred (w : DIdx) : DIdx := - Finsupp.update w (layerDir w) (w (layerDir w) - 1) - -lemma layerPred_add_single {w : DIdx} (hw : w ≠ 0) : - layerPred w + Finsupp.single (layerDir w) 1 = w := by - ext μ - by_cases hμ : μ = layerDir w - · subst μ - simpa [layerPred, Finsupp.update] using - Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr (layerDir_coeff_ne_zero hw)) - · simp [layerPred, hμ] - -lemma lorDeg_layerPred {w : DIdx} (hw : w ≠ 0) : lorDeg (layerPred w) + 1 = lorDeg w := by - have h := congrArg lorDeg (layerPred_add_single hw) - rwa [lorDeg_add, lorDeg_single] at h - -/-- The constant colour shift attached to a total derivative multi-index. It is packaged through -`mcCoeffCAt`, whose construction already proves hermiticity and tracelessness. -/ -noncomputable def layerShift (U : specialUnitaryGroup (Fin 3) JetRing) (w : DIdx) : ColourSpace := - if _hw : w = 0 then 0 else - facI (layerPred w) • mcCoeffCAt U (layerDir w) (layerPred w) - -private lemma coeffMat_C_smul (z : ℂ) (k : DIdx) - (M : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat k ((MvPowerSeries.C z : JetRing) • M) = z • coeffMat k M := by - ext i j - show MvPowerSeries.coeff k ((MvPowerSeries.C z : JetRing) * M i j) = - z * MvPowerSeries.coeff k (M i j) - rw [MvPowerSeries.coeff_C_mul] - -/-- Under basedness, the Maurer--Cartan coefficient has only its leading Taylor term. -/ -lemma mcCoeffM_of_basedTo (hU : BasedTo r U) (hsr : lorDeg s ≤ r) (mu : Lor) : - mcCoeffM U mu s = - Complex.I • (((s mu : ℕ) : ℂ) + 1) • - coeffMat (s + Finsupp.single mu 1) U.1 := by - rw [mcCoeffM, mcH, mcP, coeffMat_C_smul, coeffMat_mul, - Finset.sum_eq_single (s, 0)] - · rw [coeffMat_dMat, coeffMat_zero_eq_jetValue, Gluon.jetValue_star, hU.1, star_one, - Matrix.mul_one] - · rintro ⟨p, q⟩ hpq hpair - have hpq' : p + q = s := Finset.mem_antidiagonal.mp hpq - have hq0 : q ≠ 0 := by - intro hq - subst q - have hps : p = s := by simpa using hpq' - exact hpair (Prod.ext hps rfl) - have hqdeg : 0 < lorDeg q := (lorDeg_pos_iff q).2 hq0 - have hq : coeffMat q (star U.1) = 0 := by - rw [← star_coeffMat, hU.2 q hqdeg ((right_le_of_add_eq hpq').trans hsr), star_zero] - rw [hq, Matrix.mul_zero] - · simp - -private lemma cmat_normalized_mcCoeff (hU : BasedTo r U) (hsr : lorDeg s ≤ r) (mu : Lor) : - cmat (facI s • mcCoeffCAt U mu s) = - ((facI (s + Finsupp.single mu 1) : ℂ) * Complex.I) • - coeffMat (s + Finsupp.single mu 1) U.1 := by - rw [cmat_smul, cmat_mcCoeffCAt, mcCoeffM_of_basedTo hU hsr, smul_smul, - facI_add_single] - push_cast - module - -/-- **Total symmetry.** The normalized coefficient depends only on the total index obtained by -adjoining the connection direction. The proof is exactly `facI_add_single`. -/ -lemma normalized_mcCoeff_eq_layerShift (hU : BasedTo r U) (hs : lorDeg s = r) (mu : Lor) : - facI s • mcCoeffCAt U mu s = layerShift U (s + Finsupp.single mu 1) := by - have hwdeg : lorDeg (s + Finsupp.single mu 1) = r + 1 := by - rw [lorDeg_add, lorDeg_single, hs] - have hw0 : s + Finsupp.single mu 1 ≠ 0 := by - rw [← lorDeg_pos_iff, hwdeg] - omega - apply cmat_injective - have hpred : lorDeg (layerPred (s + Finsupp.single mu 1)) ≤ r := by - have h := lorDeg_layerPred hw0 - rw [hwdeg] at h - omega - rw [layerShift, dif_neg hw0, cmat_normalized_mcCoeff hU hs.le mu, - cmat_normalized_mcCoeff hU hpred (layerDir (s + Finsupp.single mu 1)), - layerPred_add_single hw0] - -/-- The matrix of a highest-layer shift is `i` times the factorial-normalized leading Taylor -coefficient of the gauge jet. -/ -lemma cmat_layerShift_of_basedTo (hU : BasedTo r U) (hw : lorDeg w = r + 1) : - cmat (layerShift U w) = - ((facI w : ℂ) * Complex.I) • coeffMat w U.1 := by - have hw0 : w ≠ 0 := by - rw [← lorDeg_pos_iff, hw] - omega - have hpred : lorDeg (layerPred w) ≤ r := by - have h := lorDeg_layerPred hw0 - rw [hw] at h - omega - rw [layerShift, dif_neg hw0, - cmat_normalized_mcCoeff hU hpred (layerDir w), layerPred_add_single hw0] - -/-! - -## D. Exact fixation below the top layer - --/ - -private lemma conjugation_part_eq_gen (hU : BasedTo r U) (hsr : lorDeg s ≤ r) - (mu : Lor) (c : Col) : - (∑ p ∈ Finset.antidiagonal s, ∑ c', - algebraMap ℝ JetAlgebra - (facI s * (facI p.1)⁻¹ * coordC c (conjC U p.2 (colourBasis c'))) * - genVec p.1 mu c') = genVec s mu c := by - rw [Finset.sum_eq_single (s, 0)] - · rw [conjC_zero_of_basedTo hU] - simp only [LinearMap.id_apply, mul_inv_cancel₀ (facI_ne_zero s), - one_mul] - calc - (∑ c', algebraMap ℝ JetAlgebra (coordC c (colourBasis c')) * genVec s mu c') = - adR (1 : specialUnitaryGroup (Fin 3) ℂ) (genVec s mu) c := by - simpa only [adC_one] using - (sum_coordC_adC (R := JetAlgebra) (1 : specialUnitaryGroup (Fin 3) ℂ) - (genVec s mu) c) - _ = genVec s mu c := adR_one _ _ - · rintro ⟨p, q⟩ hpq hpair - have hpq' : p + q = s := Finset.mem_antidiagonal.mp hpq - have hq0 : q ≠ 0 := by - intro hq - subst q - have hps : p = s := by simpa using hpq' - exact hpair (Prod.ext hps rfl) - have hqdeg : 0 < lorDeg q := (lorDeg_pos_iff q).2 hq0 - rw [conjC_eq_zero_of_basedTo hU hqdeg ((right_le_of_add_eq hpq').trans hsr)] - simp - · simp - -lemma mcCoeffCAt_eq_zero_of_lt (hU : BasedTo r U) (hsr : lorDeg s < r) (mu : Lor) : - mcCoeffCAt U mu s = 0 := by - have hwdeg : lorDeg (s + Finsupp.single mu 1) = lorDeg s + 1 := by - rw [lorDeg_add, lorDeg_single] - have hwpos : 0 < lorDeg (s + Finsupp.single mu 1) := by omega - have hwle : lorDeg (s + Finsupp.single mu 1) ≤ r := by omega - apply cmat_injective - rw [cmat_mcCoeffCAt, cmat_zero, mcCoeffM_of_basedTo hU hsr.le, - hU.2 _ hwpos hwle, smul_zero, smul_zero] - -/-- **Lower layers are fixed exactly.** Every ordinary generator of degree below `r` is fixed by -a jet based through order `r`. -/ -lemma gaugeSubstGen_eq_ofGen_of_lt (hU : BasedTo r U) (hsr : lorDeg s < r) - (mu : Lor) (c : Col) : - gaugeSubstGen U (JetGenerators.dA s mu c) = ofGen (JetGenerators.dA s mu c) := by - rw [gaugeSubstGen, conjugation_part_eq_gen hU hsr.le, - mcCoeffCAt_eq_zero_of_lt hU hsr, smul_zero] - simp [genVec, constR] - -/-- The ordinary generators whose derivative degree is strictly below `r`. -/ -def lowerLayer (r : ℕ) : Set JetAlgebra := - {P | ∃ (s : DIdx) (mu : Lor) (c : Col), lorDeg s < r ∧ P = ofGen (JetGenerators.dA s mu c)} - -/-- The polynomial algebra supported on ordinary generators of derivative degree below `r`. -/ -noncomputable def lowerAlgebra (r : ℕ) : Subalgebra ℝ JetAlgebra := Algebra.adjoin ℝ (lowerLayer r) - -/-- A jet based through `r` fixes every polynomial supported below derivative degree `r`. -/ -lemma gaugePull_eq_self_of_mem_lowerAlgebra (hU : BasedTo r U) {P : JetAlgebra} - (hP : P ∈ lowerAlgebra r) : gaugePull U P = P := by - have hle : lowerAlgebra r ≤ AlgHom.equalizer (gaugePull U) (AlgHom.id ℝ JetAlgebra) := by - refine Algebra.adjoin_le ?_ - rintro Q ⟨s, mu, c, hsr, rfl⟩ - show gaugePull U (ofGen (JetGenerators.dA s mu c)) = - AlgHom.id ℝ JetAlgebra (ofGen (JetGenerators.dA s mu c)) - rw [gaugePull_ofGen, gaugeSubstGen_eq_ofGen_of_lt hU hsr, AlgHom.id_apply] - exact hle hP - -/-- **The top layer is a pure translation.** No field-dependent commutator survives at -derivative degree `r`. -/ -lemma gaugeSubstGen_eq_add_layerShift (hU : BasedTo r U) (hs : lorDeg s = r) - (mu : Lor) (c : Col) : - gaugeSubstGen U (JetGenerators.dA s mu c) = - ofGen (JetGenerators.dA s mu c) + - constR (layerShift U (s + Finsupp.single mu 1)) c := by - rw [gaugeSubstGen, conjugation_part_eq_gen hU hs.le, - normalized_mcCoeff_eq_layerShift hU hs] - rfl - -/-- Two presentations of the same total multi-index give the same normalized shift. -/ -lemma normalized_mcCoeff_eq_of_total_index (hU : BasedTo r U) (hs : lorDeg s = r) - (hs' : lorDeg s' = r) (hidx : s + Finsupp.single mu 1 = s' + Finsupp.single mu' 1) : - facI s • mcCoeffCAt U mu s = facI s' • mcCoeffCAt U mu' s' := by - rw [normalized_mcCoeff_eq_layerShift hU hs, - normalized_mcCoeff_eq_layerShift hU hs', hidx] - -/-! - -## E. Realizability by a single conjugated monomial jet - --/ - -/-- The single conjugated `DiagonalJet` monomial jet used to realize one highest-layer colour shift. - -/ -noncomputable def realizingJet (w : DIdx) (hw : w ≠ 0) (c₀ : Col) (a : ℝ) : - specialUnitaryGroup (Fin 3) JetRing := - conjBy (colourConj c₀) (diagSU (a / facI w) w hw) - -lemma realizingJet_basedTo (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) : - BasedTo r (realizingJet w (by rw [← lorDeg_pos_iff, hw]; omega) c₀ a) := by - let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega - change BasedTo r (realizingJet w hw₀ c₀ a) - constructor - · exact jetValue_eq_one _ - (evalSU_conjBy _ (evalSU_diagSU (a / facI w) w hw₀)) - · intro k hkpos hkr - have hk₀ : k ≠ 0 := (lorDeg_pos_iff k).1 hkpos - have hmult : ∀ n : ℕ, k ≠ n • w := by - intro n hkn - have hdeg := congrArg lorDeg hkn - rw [lorDeg_nsmul, hw] at hdeg - by_cases hn : n = 0 - · subst n - simp at hdeg - omega - have hlower := Nat.mul_le_mul_right (r + 1) (Nat.one_le_iff_ne_zero.mpr hn) - simp only [one_mul] at hlower - omega - rw [realizingJet, coe_conjBy, coeffMat_conj_const, - show ((diagSU (a / facI w) w hw₀ : specialUnitaryGroup (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) JetRing) = diagMat (a / facI w) w hw₀ from rfl, - coeffMat_diagMat_eq_zero (a / facI w) w hw₀ hk₀ hmult, - Matrix.mul_zero, Matrix.zero_mul] - -private lemma realizing_scalar (w : DIdx) (a : ℝ) : - ((facI w : ℂ) * Complex.I) * (-((a / facI w : ℝ) : ℂ) * Complex.I) = (a : ℂ) := by - have hw : (facI w : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr (facI_ne_zero w) - push_cast - field_simp - rw [pow_two, Complex.I_mul_I] - ring - -lemma layerShift_realizingJet_self (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) : - layerShift (realizingJet w (by rw [← lorDeg_pos_iff, hw]; omega) c₀ a) w = - a • colourBasis c₀ := by - let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega - change layerShift (realizingJet w hw₀ c₀ a) w = a • colourBasis c₀ - rw [← adC_colourC c₀] - apply cmat_injective - rw [cmat_layerShift_of_basedTo (realizingJet_basedTo hw c₀ a) hw, cmat_smul, cmat_adC, - cmat_colourC, realizingJet, coe_conjBy, coeffMat_conj_const, - show ((diagSU (a / facI w) w hw₀ : specialUnitaryGroup (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) JetRing) = diagMat (a / facI w) w hw₀ from rfl, - coeffMat_diagMat_self] - calc - ((facI w : ℂ) * Complex.I) • - ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * - ((-((a / facI w : ℝ) : ℂ) * Complex.I) • colourMat) * - ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) = - (((facI w : ℂ) * Complex.I) * - (-((a / facI w : ℝ) : ℂ) * Complex.I)) • - ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * colourMat * - ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) := by - rw [Matrix.mul_smul, Matrix.smul_mul, smul_smul] - _ = (a : ℂ) • - ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * colourMat * - ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) := by rw [realizing_scalar] - _ = a • ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ) * colourMat * - ((colourConj c₀ : Matrix (Fin 3) (Fin 3) ℂ))ᴴ) := by - rw [show ((a : ℂ)) = algebraMap ℝ ℂ a from rfl, algebraMap_smul] - -lemma layerShift_realizingJet_of_ne (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) - (hw' : lorDeg w' = r + 1) (hne : w' ≠ w) : - layerShift (realizingJet w (by rw [← lorDeg_pos_iff, hw]; omega) c₀ a) w' = 0 := by - let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega - let hw₀' : w' ≠ 0 := by rw [← lorDeg_pos_iff, hw']; omega - change layerShift (realizingJet w hw₀ c₀ a) w' = 0 - have hmult : ∀ n : ℕ, w' ≠ n • w := by - intro n hn - have hdeg := congrArg lorDeg hn - rw [lorDeg_nsmul, hw, hw'] at hdeg - have h₁n : 1 = n := Nat.mul_right_cancel (Nat.zero_lt_succ r) - (by simpa only [one_mul] using hdeg) - have hn₁ : n = 1 := h₁n.symm - rw [hn₁, one_smul] at hn - exact hne hn - apply cmat_injective - rw [cmat_layerShift_of_basedTo (realizingJet_basedTo hw c₀ a) hw', cmat_zero, - realizingJet, coe_conjBy, coeffMat_conj_const, - show ((diagSU (a / facI w) w hw₀ : specialUnitaryGroup (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) JetRing) = diagMat (a / facI w) w hw₀ from rfl, - coeffMat_diagMat_eq_zero (a / facI w) w hw₀ hw₀' hmult, - Matrix.mul_zero, Matrix.zero_mul, smul_zero] - -/-- **Arbitrary-order realizability.** One conjugated monomial jet realizes any chosen colour -basis shift at one degree-`r + 1` total index and vanishes at every other index in that layer. -/ -lemma exists_basedTo_layerShift (hw : lorDeg w = r + 1) (c₀ : Col) (a : ℝ) : - ∃ U : specialUnitaryGroup (Fin 3) JetRing, - BasedTo r U ∧ layerShift U w = a • colourBasis c₀ ∧ - ∀ w', lorDeg w' = r + 1 → w' ≠ w → layerShift U w' = 0 := by - let hw₀ : w ≠ 0 := by rw [← lorDeg_pos_iff, hw]; omega - refine ⟨realizingJet w hw₀ c₀ a, realizingJet_basedTo hw c₀ a, - layerShift_realizingJet_self hw c₀ a, ?_⟩ - intro w' hw' hne - exact layerShift_realizingJet_of_ne hw c₀ a hw' hne - -/-! - -## F. Agreement with the degree-zero and degree-one pilots - --/ - -/-- At `r = 0`, the layer shift is `GaugeAction`'s first Maurer--Cartan colour coefficient. -/ -lemma layerShift_single (hU : BasedTo 0 U) (mu : Lor) : - layerShift U (Finsupp.single mu 1) = mcC U mu := by - have h := normalized_mcCoeff_eq_layerShift hU (s := (0 : DIdx)) (by simp [lorDeg]) mu - simpa only [facI_zero, one_smul, mcCoeffCAt_zero, zero_add] using h.symm - -/-- At `r = 1`, the layer shift is `GaugeAction`'s second Maurer--Cartan colour coefficient. -/ -lemma layerShift_pair (hU : BasedTo 1 U) (nu mu : Lor) : - layerShift U (Finsupp.single nu 1 + Finsupp.single mu 1) = mc2C U nu mu := by - have h := normalized_mcCoeff_eq_layerShift hU (s := Finsupp.single nu 1) - (lorDeg_single nu) mu - simpa only [facI_single, one_smul, mcCoeffCAt_single] using h.symm - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean deleted file mode 100644 index 32d54d9d9..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/HookBianchi.lean +++ /dev/null @@ -1,784 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.GaugeAction -/-! -# Second-order hook coordinates and the Bianchi identity - -## i. Overview - -This file extends the finite gluon-jet carrier through second ordinary derivatives. -The old second-order block is indexed by `Sym2 Lor × Lor`; the covariant block splits it into a -fully symmetric twenty-component block and twenty independent components of `D F`. - -The displayed family `D_ρ F_νμ`, with `ν < μ`, has twenty-four members. `HookIdx` omits -exactly the four members with `ρ < ν < μ`. Those components are reconstructed by - -```text -D_ρ F_νμ = D_ν F_ρμ - D_μ F_ρν. -``` - -## ii. Convention - -The hermitian field strength of `CoordinateChange` is -`F_νμ = ∂_ν A_μ - ∂_μ A_ν + br(A_ν,A_μ)`, where -`br(M,N) = i (M N - N M)`. The affine action `actPot` of `GaugeAction` forces the adjoint covariant -derivative used here: - -```text -D_ρ F_νμ = ∂_ρ F_νμ + br(A_ρ,F_νμ) - = ∂_ρ F_νμ + i [A_ρ,F_νμ]. -``` - -No production declaration is changed by this file. --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -namespace SU3Jet - -/-! - -## A. Independent finite index types - --/ - -/-- Three ranks in nondecreasing order, representing a completely symmetric Lorentz triple. -/ -abbrev Sym3Idx : Type := - {t : Fin 4 × Fin 4 × Fin 4 // t.1 ≤ t.2.1 ∧ t.2.1 ≤ t.2.2} - -/-- A three-input sorting network on `Fin 4`. -/ -def sort3 (a b c : Fin 4) : Fin 4 × Fin 4 × Fin 4 := - let p := min a b - let q := max a b - let r := min q c - let z := max q c - (min p r, max p r, z) - -lemma sort3_ordered (a b c : Fin 4) : - (sort3 a b c).1 ≤ (sort3 a b c).2.1 ∧ - (sort3 a b c).2.1 ≤ (sort3 a b c).2.2 := by - dsimp [sort3] - constructor - · exact min_le_max - · apply max_le - · exact (min_le_max.trans (le_max_left _ _)) - · exact (min_le_left _ _).trans (le_max_left _ _) - -/-- The completely symmetric triple containing `ρ`, `ν`, and `μ`. -/ -def sym3Key (ρ ν μ : Lor) : Sym3Idx := - ⟨sort3 (lorRank ρ) (lorRank ν) (lorRank μ), sort3_ordered _ _ _⟩ - -lemma sort3_of_ordered {a b c : Fin 4} (hab : a ≤ b) (hbc : b ≤ c) : - sort3 a b c = (a, b, c) := by - simp [sort3, min_eq_left hab, max_eq_right hab, min_eq_left hbc, max_eq_right hbc] - -lemma sym3Key_components (t : Sym3Idx) : - sym3Key (lorRank.symm t.1.1) (lorRank.symm t.1.2.1) (lorRank.symm t.1.2.2) = t := by - apply Subtype.ext - simp only [sym3Key, Equiv.apply_symm_apply] - exact sort3_of_ordered t.2.1 t.2.2 - -lemma sym3Key_swap12 (ρ ν μ : Lor) : sym3Key ρ ν μ = sym3Key ν ρ μ := by - apply Subtype.ext - fin_cases ρ <;> fin_cases ν <;> fin_cases μ <;> rfl - -lemma sym3Key_swap23 (ρ ν μ : Lor) : sym3Key ρ ν μ = sym3Key ρ μ ν := by - apply Subtype.ext - fin_cases ρ <;> fin_cases ν <;> fin_cases μ <;> rfl - -lemma sym3Key_cycle (ρ ν μ : Lor) : sym3Key ρ ν μ = sym3Key ν μ ρ := by - rw [sym3Key_swap12, sym3Key_swap23] - -/-- The independent hook coordinates. For an increasing curvature pair `ν < μ`, the -component with derivative index `ρ` is retained precisely when it is not the omitted member -`ρ < ν < μ`. -/ -abbrev HookIdx : Type := - {p : Lor × CurvPair // ¬ LorLT p.1 p.2.1.1} - -set_option maxRecDepth 20000 in -lemma card_sym3Idx : Fintype.card Sym3Idx = 20 := by decide - -set_option maxRecDepth 20000 in -lemma card_hookIdx : Fintype.card HookIdx = 20 := by decide - -set_option maxRecDepth 20000 in -lemma card_old_second_layer : Fintype.card (Sym2 Lor × Lor) = 40 := by decide - -set_option maxRecDepth 20000 in -lemma card_cov_second_layer : Fintype.card (Sym3Idx ⊕ HookIdx) = 40 := by decide - -/-! - -## B. The two second-order polynomial carriers - --/ - -/-- Ordinary coordinates through second order. The two derivative indices of `sec` are stored -as a symmetric pair. -/ -inductive Coord2 where - /-- The connection coordinate. -/ - | conn : Lor → Col → Coord2 - /-- The first ordinary derivative. -/ - | der : Lor → Lor → Col → Coord2 - /-- The second ordinary derivative, symmetric in its first two Lorentz indices. -/ - | sec : Sym2 Lor → Lor → Col → Coord2 -deriving DecidableEq, Fintype - -/-- Covariant coordinates through second order. -/ -inductive CovCoord2 where - /-- The connection coordinate. -/ - | conn : Lor → Col → CovCoord2 - /-- The symmetric first derivative. -/ - | sym1 : Sym2 Lor → Col → CovCoord2 - /-- The independent curvature coordinate. -/ - | curv : CurvPair → Col → CovCoord2 - /-- The completely symmetric second derivative. -/ - | sym2 : Sym3Idx → Col → CovCoord2 - /-- An independent covariant derivative of curvature. -/ - | hook : HookIdx → Col → CovCoord2 -deriving DecidableEq, Fintype - -/-- The ordinary polynomial algebra through second order. -/ -abbrev A₂ : Type := MvPolynomial Coord2 ℝ - -/-- The covariant polynomial algebra through second order. -/ -abbrev A₂cov : Type := MvPolynomial CovCoord2 ℝ - -set_option maxRecDepth 20000 in -lemma card_coord2 : Fintype.card Coord2 = 480 := by decide - -set_option maxRecDepth 20000 in -lemma card_covCoord2 : Fintype.card CovCoord2 = 480 := by decide - -/-! - -## C. Bracket identities used by Bianchi - --/ - -/-- Jacobi for the hermitian colour bracket. -/ -lemma br_jacobi (X Y Z : ColourSpace) : - br X (br Y Z) - br Y (br X Z) + br Z (br X Y) = 0 := by - apply cmat_injective - ext i j - simp only [cmat_add, cmat_sub, cmat_zero, cmat_br, brMat, Matrix.add_apply, - Matrix.sub_apply, Matrix.zero_apply, Matrix.smul_apply, Matrix.mul_apply, Fin.sum_univ_three] - ring_nf - -section PolyIdentities - -variable { ι : Type* } - -lemma brP_add_left (p q r : Col → MvPolynomial ι ℝ) (c : Col) : - brP (fun a ↦ p a + q a) r c = brP p r c + brP q r c := by - simp only [brP, add_mul, mul_add, Finset.sum_add_distrib] - -lemma brP_add_right (p q r : Col → MvPolynomial ι ℝ) (c : Col) : - brP p (fun a ↦ q a + r a) c = brP p q c + brP p r c := by - simp only [brP, mul_add, Finset.sum_add_distrib] - -lemma brP_sub_left (p q r : Col → MvPolynomial ι ℝ) (c : Col) : - brP (fun a ↦ p a - q a) r c = brP p r c - brP q r c := by - simp only [brP, sub_mul, mul_sub, Finset.sum_sub_distrib] - -lemma brP_sub_right (p q r : Col → MvPolynomial ι ℝ) (c : Col) : - brP p (fun a ↦ q a - r a) c = brP p q c - brP p r c := by - simp only [brP, mul_sub, Finset.sum_sub_distrib] - -lemma brP_neg_right (p q : Col → MvPolynomial ι ℝ) (c : Col) : - brP p (fun a ↦ -q a) c = -brP p q c := by - simp only [brP, mul_neg, Finset.sum_neg_distrib] - -lemma mkC_eval_brP (x : ι → ℝ) (p q : Col → MvPolynomial ι ℝ) : - mkC (fun c ↦ eval x (brP p q c)) = - br (mkC fun a ↦ eval x (p a)) (mkC fun b ↦ eval x (q b)) := by - rw [show (fun c ↦ eval x (brP p q c)) = fun c ↦ - coordC c (br (mkC fun a ↦ eval x (p a)) (mkC fun b ↦ eval x (q b))) from - funext fun c ↦ eval_brP x p q c] - exact mkC_coordC _ - -/-- Jacobi after lifting three colour vectors to polynomial coordinates. -/ -lemma brP_jacobi (p q r : Col → MvPolynomial ι ℝ) (c : Col) : - brP p (brP q r) c - brP q (brP p r) c + brP r (brP p q) c = 0 := by - refine MvPolynomial.funext fun x ↦ ?_ - simp only [map_add, map_sub, map_zero] - rw [eval_brP, eval_brP, eval_brP, mkC_eval_brP, mkC_eval_brP, mkC_eval_brP] - simpa only [map_add, map_sub, map_zero] using congrArg (coordC c) - (br_jacobi (mkC fun a ↦ eval x (p a)) (mkC fun a ↦ eval x (q a)) - (mkC fun a ↦ eval x (r a))) - -end PolyIdentities - -/-! - -## D. Curvature and its covariant derivative in ordinary coordinates - --/ - -/-- The connection colour vector in the second-order ordinary carrier. -/ -noncomputable def conn2Old (μ : Lor) : Col → A₂ := fun c ↦ X (Coord2.conn μ c) - -/-- The first derivative colour vector in the second-order ordinary carrier. -/ -noncomputable def der2Old (ρ μ : Lor) : Col → A₂ := fun c ↦ X (Coord2.der ρ μ c) - -/-- A displayed second derivative in the ordinary carrier. -/ -noncomputable def secAt (ρ ν μ : Lor) (c : Col) : A₂ := X (Coord2.sec s(ρ, ν) μ c) - -lemma secAt_swap (ρ ν μ : Lor) (c : Col) : secAt ρ ν μ c = secAt ν ρ μ c := by - rw [secAt, secAt, Sym2.eq_swap] - -/-- The curvature polynomial in the second-order ordinary carrier. -/ -noncomputable def curv2Poly (ν μ : Lor) (c : Col) : A₂ := - X (Coord2.der ν μ c) - X (Coord2.der μ ν c) + brP (conn2Old ν) (conn2Old μ) c - -lemma curv2Poly_swap (ν μ : Lor) (c : Col) : curv2Poly ν μ c = -curv2Poly μ ν c := by - rw [curv2Poly, curv2Poly, brP_swap (conn2Old μ) (conn2Old ν) c] - ring_nf - -lemma curv2Poly_self (ν : Lor) (c : Col) : curv2Poly ν ν c = 0 := by - rw [curv2Poly, brP_self, sub_self, add_zero] - -/-- The terms in `D_ρ F_νμ` below the leading second-derivative hook. -/ -noncomputable def dFNonlin (ρ ν μ : Lor) : Col → A₂ := fun c ↦ - brP (der2Old ρ ν) (conn2Old μ) c + - brP (conn2Old ν) (der2Old ρ μ) c + - brP (conn2Old ρ) (curv2Poly ν μ) c - -/-- The leading linear hook in the second ordinary derivative. -/ -noncomputable def leadHook (ρ ν μ : Lor) : Col → A₂ := - fun c ↦ secAt ρ ν μ c - secAt ρ μ ν c - -/-- The covariant derivative -`D_ρ F_νμ = ∂_ρ F_νμ + br(A_ρ,F_νμ)` in ordinary coordinates. -/ -noncomputable def dFPoly (ρ ν μ : Lor) : Col → A₂ := - fun c ↦ leadHook ρ ν μ c + dFNonlin ρ ν μ c - -lemma leadHook_swap (ρ ν μ : Lor) (c : Col) : - leadHook ρ ν μ c = -leadHook ρ μ ν c := by - rw [leadHook, leadHook] - ring_nf - -lemma leadHook_bianchi (ρ ν μ : Lor) (c : Col) : - leadHook ρ ν μ c - leadHook ν ρ μ c + leadHook μ ρ ν c = 0 := by - rw [leadHook, leadHook, leadHook, secAt_swap ν ρ, secAt_swap μ ρ, - secAt_swap μ ν] - ring_nf - -lemma dFNonlin_swap (ρ ν μ : Lor) (c : Col) : - dFNonlin ρ ν μ c = -dFNonlin ρ μ ν c := by - rw [dFNonlin, dFNonlin] - rw [brP_swap (der2Old ρ ν) (conn2Old μ) c, - brP_swap (der2Old ρ μ) (conn2Old ν) c] - have hcurv : curv2Poly ν μ = fun a ↦ -curv2Poly μ ν a := by - funext a - exact curv2Poly_swap ν μ a - rw [hcurv, brP_neg_right] - ring_nf - -/-- The nonlinear terms obey the cyclic identity by Jacobi. -/ -lemma dFNonlin_bianchi (ρ ν μ : Lor) (c : Col) : - dFNonlin ρ ν μ c - dFNonlin ν ρ μ c + dFNonlin μ ρ ν c = 0 := by - simp only [dFNonlin] - change - (brP (der2Old ρ ν) (conn2Old μ) c + brP (conn2Old ν) (der2Old ρ μ) c + - brP (conn2Old ρ) (fun a ↦ der2Old ν μ a - der2Old μ ν a + - brP (conn2Old ν) (conn2Old μ) a) c) - - (brP (der2Old ν ρ) (conn2Old μ) c + brP (conn2Old ρ) (der2Old ν μ) c + - brP (conn2Old ν) (fun a ↦ der2Old ρ μ a - der2Old μ ρ a + - brP (conn2Old ρ) (conn2Old μ) a) c) + - (brP (der2Old μ ρ) (conn2Old ν) c + brP (conn2Old ρ) (der2Old μ ν) c + - brP (conn2Old μ) (fun a ↦ der2Old ρ ν a - der2Old ν ρ a + - brP (conn2Old ρ) (conn2Old ν) a) c) = 0 - rw [brP_add_right, brP_sub_right, brP_add_right, brP_sub_right, brP_add_right, - brP_sub_right] - rw [brP_swap (conn2Old μ) (der2Old ρ ν) c, - brP_swap (conn2Old μ) (der2Old ν ρ) c, - brP_swap (der2Old μ ρ) (conn2Old ν) c] - have hj := brP_jacobi (conn2Old ρ) (conn2Old ν) (conn2Old μ) c - linear_combination (norm := ring_nf) hj - -/-- Antisymmetry of the covariant derivative in its curvature indices. -/ -lemma dFPoly_swap (ρ ν μ : Lor) (c : Col) : dFPoly ρ ν μ c = -dFPoly ρ μ ν c := by - rw [dFPoly, dFPoly, leadHook_swap, dFNonlin_swap] - ring_nf - -/-- The algebraic Bianchi identity in ordinary polynomial coordinates. -/ -lemma dFPoly_bianchi (ρ ν μ : Lor) (c : Col) : - dFPoly ρ ν μ c - dFPoly ν ρ μ c + dFPoly μ ρ ν c = 0 := by - rw [dFPoly, dFPoly, dFPoly] - linear_combination (norm := ring_nf) - leadHook_bianchi ρ ν μ c + dFNonlin_bianchi ρ ν μ c - -/-! - -## E. Reconstructing all displayed hook components - --/ - -/-- A retained hook variable, or the Bianchi reconstruction when the displayed component was -omitted. Its curvature pair is already increasing. -/ -noncomputable def hookInc (ρ : Lor) (q : CurvPair) (c : Col) : A₂cov := - if h : LorLT ρ q.1.1 then - X (CovCoord2.hook - ⟨(q.1.1, ⟨(ρ, q.1.2), lt_trans h q.2⟩), lorLT_asymm h⟩ c) - - X (CovCoord2.hook - ⟨(q.1.2, ⟨(ρ, q.1.1), h⟩), lorLT_asymm (lt_trans h q.2)⟩ c) - else X (CovCoord2.hook ⟨(ρ, q), h⟩ c) - -/-- The covariant-coordinate polynomial representing `D_ρ F_νμ` for an arbitrary ordered -curvature pair. -/ -noncomputable def hookVar (ρ ν μ : Lor) (c : Col) : A₂cov := - if h : LorLT ν μ then hookInc ρ ⟨(ν, μ), h⟩ c - else if h' : LorLT μ ν then -hookInc ρ ⟨(μ, ν), h'⟩ c - else 0 - -lemma hookVar_swap (ρ ν μ : Lor) (c : Col) : hookVar ρ ν μ c = -hookVar ρ μ ν c := by - rw [hookVar, hookVar] - by_cases h : LorLT ν μ - · rw [dif_pos h, dif_neg (lorLT_asymm h), dif_pos h, neg_neg] - · by_cases h' : LorLT μ ν - · rw [dif_neg h, dif_pos h', dif_pos h'] - · rw [dif_neg h, dif_neg h', dif_neg h', dif_neg h, neg_zero] - -lemma hookVar_self (ρ ν : Lor) (c : Col) : hookVar ρ ν ν c = 0 := by - simp [hookVar, lorLT_irrefl] - -/-- The omitted component for `ρ < ν < μ` is reconstructed from the two retained components. -/ -lemma hookVar_reconstruct { ρ ν μ : Lor } (hρν : LorLT ρ ν) (hνμ : LorLT ν μ) (c : Col) : - hookVar ρ ν μ c = hookVar ν ρ μ c - hookVar μ ρ ν c := by - have hρμ : LorLT ρ μ := lt_trans hρν hνμ - simp only [hookVar, dif_pos hνμ, hookInc, dif_pos hρν, dif_pos hρμ, - dif_neg (lorLT_asymm hρν), dif_neg (lorLT_asymm hρμ)] - -private lemma hookVar_bianchi_of_lt {ρ ν : Lor} (hρν : LorLT ρ ν) (μ : Lor) (c : Col) : - hookVar ρ ν μ c - hookVar ν ρ μ c + hookVar μ ρ ν c = 0 := by - rcases lor_trichotomy ν μ with hνμ | rfl | hμν - · rw [hookVar_reconstruct hρν hνμ] - ring_nf - · rw [hookVar_self] - ring_nf - · rcases lor_trichotomy ρ μ with hρμ | rfl | hμρ - · have hr := hookVar_reconstruct hρμ hμν c - rw [hookVar_swap ρ ν μ] - rw [hr] - ring_nf - · rw [hookVar_self, hookVar_swap ρ ν ρ] - ring_nf - · have hr := hookVar_reconstruct hμρ hρν c - rw [hookVar_swap ρ ν μ, hookVar_swap ν ρ μ] - linear_combination (norm := ring_nf) hr - -/-- Bianchi for the reconstructed covariant-coordinate hook family. -/ -lemma hookVar_bianchi (ρ ν μ : Lor) (c : Col) : - hookVar ρ ν μ c - hookVar ν ρ μ c + hookVar μ ρ ν c = 0 := by - rcases lor_trichotomy ρ ν with hρν | rfl | hνρ - · exact hookVar_bianchi_of_lt hρν μ c - · rw [hookVar_self] - ring_nf - · have h := hookVar_bianchi_of_lt hνρ μ c - rw [hookVar_swap μ ν ρ] at h - linear_combination (norm := ring_nf) -h - -/-! - -## F. The nonlinear triangular substitutions - --/ - -/-- The connection colour vector in covariant coordinates. -/ -noncomputable def conn2Cov (μ : Lor) : Col → A₂cov := fun c ↦ X (CovCoord2.conn μ c) - -/-- The curvature variable in the covariant carrier, extended antisymmetrically to every pair. -/ -noncomputable def curv2Var (ν μ : Lor) (c : Col) : A₂cov := - if h : LorLT ν μ then X (CovCoord2.curv ⟨(ν, μ), h⟩ c) - else if h' : LorLT μ ν then -X (CovCoord2.curv ⟨(μ, ν), h'⟩ c) - else 0 - -lemma curv2Var_swap (ν μ : Lor) (c : Col) : curv2Var ν μ c = -curv2Var μ ν c := by - rw [curv2Var, curv2Var] - by_cases h : LorLT ν μ - · rw [dif_pos h, dif_neg (lorLT_asymm h), dif_pos h, neg_neg] - · by_cases h' : LorLT μ ν - · rw [dif_neg h, dif_pos h', dif_pos h'] - · rw [dif_neg h, dif_neg h', dif_neg h', dif_neg h, neg_zero] - -/-- A first derivative written in the lower covariant coordinates. -/ -noncomputable def der2Cov (ν μ : Lor) : Col → A₂cov := fun c ↦ - X (CovCoord2.sym1 s(ν, μ) c) + - (2⁻¹ : ℝ) • (curv2Var ν μ c - brP (conn2Cov ν) (conn2Cov μ) c) - -/-- The lower-order nonlinear part of `D_ρ F_νμ` in covariant coordinates. -/ -noncomputable def dFNonlinCov (ρ ν μ : Lor) : Col → A₂cov := fun c ↦ - brP (der2Cov ρ ν) (conn2Cov μ) c + - brP (conn2Cov ν) (der2Cov ρ μ) c + - brP (conn2Cov ρ) (curv2Var ν μ) c - -lemma dFNonlinCov_swap (ρ ν μ : Lor) (c : Col) : - dFNonlinCov ρ ν μ c = -dFNonlinCov ρ μ ν c := by - rw [dFNonlinCov, dFNonlinCov] - rw [brP_swap (der2Cov ρ ν) (conn2Cov μ) c, - brP_swap (der2Cov ρ μ) (conn2Cov ν) c] - have hcurv : curv2Var ν μ = fun a ↦ -curv2Var μ ν a := by - funext a - exact curv2Var_swap ν μ a - rw [hcurv, brP_neg_right] - ring_nf - -/-- The completely symmetric average of an ordinary second derivative. -/ -noncomputable def sym3Average (ρ ν μ : Lor) (c : Col) : A₂ := - (3⁻¹ : ℝ) • (secAt ρ ν μ c + secAt ρ μ ν c + secAt ν μ ρ c) - -/-- A completely symmetric covariant generator written in ordinary coordinates. -/ -noncomputable def sym3Old (t : Sym3Idx) (c : Col) : A₂ := - sym3Average (lorRank.symm t.1.1) (lorRank.symm t.1.2.1) (lorRank.symm t.1.2.2) c - -lemma sym3Average_swap12 (ρ ν μ : Lor) (c : Col) : - sym3Average ρ ν μ c = sym3Average ν ρ μ c := by - rw [sym3Average, sym3Average, secAt_swap ν ρ] - ring_nf - -lemma sym3Average_swap23 (ρ ν μ : Lor) (c : Col) : - sym3Average ρ ν μ c = sym3Average ρ μ ν c := by - rw [sym3Average, sym3Average, secAt_swap μ ν] - ring_nf - -private lemma sym3Average_sort3Ranks (a b d : Fin 4) (c : Col) : - sym3Average (lorRank.symm (sort3 a b d).1) - (lorRank.symm (sort3 a b d).2.1) (lorRank.symm (sort3 a b d).2.2) c = - sym3Average (lorRank.symm a) (lorRank.symm b) (lorRank.symm d) c := by - let p := min a b - let q := max a b - let r := min q d - let z := max q d - calc - sym3Average (lorRank.symm (sort3 a b d).1) - (lorRank.symm (sort3 a b d).2.1) (lorRank.symm (sort3 a b d).2.2) c = - sym3Average (lorRank.symm (min p r)) (lorRank.symm (max p r)) - (lorRank.symm z) c := by rfl - _ = sym3Average (lorRank.symm p) (lorRank.symm r) (lorRank.symm z) c := by - by_cases h : p ≤ r - · rw [min_eq_left h, max_eq_right h] - · rw [min_eq_right (le_of_not_ge h), max_eq_left (le_of_not_ge h)] - exact sym3Average_swap12 _ _ _ _ - _ = sym3Average (lorRank.symm p) (lorRank.symm q) (lorRank.symm d) c := by - by_cases h : q ≤ d - · rw [show r = q from min_eq_left h, show z = d from max_eq_right h] - · rw [show r = d from min_eq_right (le_of_not_ge h), - show z = q from max_eq_left (le_of_not_ge h)] - exact sym3Average_swap23 _ _ _ _ - _ = sym3Average (lorRank.symm a) (lorRank.symm b) (lorRank.symm d) c := by - by_cases h : a ≤ b - · rw [show p = a from min_eq_left h, show q = b from max_eq_right h] - · rw [show p = b from min_eq_right (le_of_not_ge h), - show q = a from max_eq_left (le_of_not_ge h)] - exact sym3Average_swap12 _ _ _ _ - -lemma sym3Old_key (ρ ν μ : Lor) (c : Col) : - sym3Old (sym3Key ρ ν μ) c = sym3Average ρ ν μ c := by - change sym3Average (lorRank.symm (sort3 (lorRank ρ) (lorRank ν) (lorRank μ)).1) - (lorRank.symm (sort3 (lorRank ρ) (lorRank ν) (lorRank μ)).2.1) - (lorRank.symm (sort3 (lorRank ρ) (lorRank ν) (lorRank μ)).2.2) c = _ - simpa using sym3Average_sort3Ranks (lorRank ρ) (lorRank ν) (lorRank μ) c - -/-- The leading linear decomposition of a second ordinary derivative. -/ -lemma leading_hook_decomposition (ρ ν μ : Lor) (c : Col) : - secAt ρ ν μ c = sym3Old (sym3Key ρ ν μ) c + - (3⁻¹ : ℝ) • (leadHook ρ ν μ c + leadHook ν ρ μ c) := by - rw [sym3Old_key, sym3Average, leadHook, leadHook, secAt_swap ν ρ] - module - -/-- Ordinary generators written in covariant coordinates. -/ -noncomputable def oldToNew2Gen : Coord2 → A₂cov - | Coord2.conn μ c => X (CovCoord2.conn μ c) - | Coord2.der ν μ c => der2Cov ν μ c - | Coord2.sec s μ c => - Sym2.lift ⟨fun ρ ν ↦ - X (CovCoord2.sym2 (sym3Key ρ ν μ) c) + - (3⁻¹ : ℝ) • - ((hookVar ρ ν μ c - dFNonlinCov ρ ν μ c) + - (hookVar ν ρ μ c - dFNonlinCov ν ρ μ c)), by - intro ρ ν - dsimp - rw [sym3Key_swap12] - ring_nf⟩ s - -/-- Covariant generators written in ordinary coordinates. -/ -noncomputable def newToOld2Gen : CovCoord2 → A₂ - | CovCoord2.conn μ c => X (Coord2.conn μ c) - | CovCoord2.sym1 s c => - Sym2.lift ⟨fun ν μ ↦ (2⁻¹ : ℝ) • - (X (Coord2.der ν μ c) + X (Coord2.der μ ν c)), by - intro ν μ - dsimp - rw [add_comm]⟩ s - | CovCoord2.curv q c => curv2Poly q.1.1 q.1.2 c - | CovCoord2.sym2 t c => sym3Old t c - | CovCoord2.hook i c => dFPoly i.1.1 i.1.2.1.1 i.1.2.1.2 c - -/-- The triangular substitution from ordinary to covariant coordinates. -/ -noncomputable def oldToNew2 : A₂ →ₐ[ℝ] A₂cov := aeval oldToNew2Gen - -/-- The triangular substitution from covariant to ordinary coordinates. -/ -noncomputable def newToOld2 : A₂cov →ₐ[ℝ] A₂ := aeval newToOld2Gen - -@[simp] lemma oldToNew2_conn (μ : Lor) (c : Col) : - oldToNew2 (X (Coord2.conn μ c)) = X (CovCoord2.conn μ c) := aeval_X _ _ - -@[simp] lemma oldToNew2_der (ν μ : Lor) (c : Col) : - oldToNew2 (X (Coord2.der ν μ c)) = der2Cov ν μ c := aeval_X _ _ - -@[simp] lemma oldToNew2_sec (ρ ν μ : Lor) (c : Col) : - oldToNew2 (secAt ρ ν μ c) = - X (CovCoord2.sym2 (sym3Key ρ ν μ) c) + - (3⁻¹ : ℝ) • - ((hookVar ρ ν μ c - dFNonlinCov ρ ν μ c) + - (hookVar ν ρ μ c - dFNonlinCov ν ρ μ c)) := by - rw [secAt, oldToNew2, aeval_X, oldToNew2Gen, Sym2.lift_mk] - -@[simp] lemma newToOld2_conn (μ : Lor) (c : Col) : - newToOld2 (X (CovCoord2.conn μ c)) = X (Coord2.conn μ c) := aeval_X _ _ - -@[simp] lemma newToOld2_sym1 (ν μ : Lor) (c : Col) : - newToOld2 (X (CovCoord2.sym1 s(ν, μ) c)) = - (2⁻¹ : ℝ) • (X (Coord2.der ν μ c) + X (Coord2.der μ ν c)) := by - rw [newToOld2, aeval_X, newToOld2Gen, Sym2.lift_mk] - -@[simp] lemma newToOld2_curv (q : CurvPair) (c : Col) : - newToOld2 (X (CovCoord2.curv q c)) = curv2Poly q.1.1 q.1.2 c := aeval_X _ _ - -@[simp] lemma newToOld2_sym2 (t : Sym3Idx) (c : Col) : - newToOld2 (X (CovCoord2.sym2 t c)) = sym3Old t c := aeval_X _ _ - -@[simp] lemma newToOld2_hook (i : HookIdx) (c : Col) : - newToOld2 (X (CovCoord2.hook i c)) = dFPoly i.1.1 i.1.2.1.1 i.1.2.1.2 c := aeval_X _ _ - -lemma oldToNew2_conn2Old (μ : Lor) : (fun c ↦ oldToNew2 (conn2Old μ c)) = conn2Cov μ := by - funext c - exact oldToNew2_conn μ c - -lemma newToOld2_conn2Cov (μ : Lor) : (fun c ↦ newToOld2 (conn2Cov μ c)) = conn2Old μ := by - funext c - exact newToOld2_conn μ c - -lemma newToOld2_curv2Var (ν μ : Lor) (c : Col) : - newToOld2 (curv2Var ν μ c) = curv2Poly ν μ c := by - rw [curv2Var] - by_cases h : LorLT ν μ - · rw [dif_pos h, newToOld2_curv] - · by_cases h' : LorLT μ ν - · rw [dif_neg h, dif_pos h', map_neg, newToOld2_curv, ← curv2Poly_swap] - · rw [dif_neg h, dif_neg h', map_zero] - rcases lor_trichotomy ν μ with hlt | rfl | hgt - · exact absurd hlt h - · rw [curv2Poly_self] - · exact absurd hgt h' - -lemma newToOld2_der2Cov (ν μ : Lor) : - (fun c ↦ newToOld2 (der2Cov ν μ c)) = der2Old ν μ := by - funext c - rw [der2Cov, map_add, map_smul, map_sub, newToOld2_sym1, newToOld2_curv2Var, - algHom_brP, newToOld2_conn2Cov, newToOld2_conn2Cov, curv2Poly] - simp only [der2Old] - norm_num - module - -lemma oldToNew2_curv2Poly (ν μ : Lor) (c : Col) : - oldToNew2 (curv2Poly ν μ c) = curv2Var ν μ c := by - rw [curv2Poly, map_add, map_sub, oldToNew2_der, oldToNew2_der, algHom_brP, - oldToNew2_conn2Old, oldToNew2_conn2Old, der2Cov, der2Cov, - Sym2.eq_swap (a := μ) (b := ν), curv2Var_swap μ ν c, - brP_swap (conn2Cov μ) (conn2Cov ν) c] - module - -lemma newToOld2_dFNonlinCov (ρ ν μ : Lor) : - (fun c ↦ newToOld2 (dFNonlinCov ρ ν μ c)) = dFNonlin ρ ν μ := by - funext c - rw [dFNonlinCov, dFNonlin, map_add, map_add, algHom_brP, algHom_brP, algHom_brP, - newToOld2_der2Cov, newToOld2_der2Cov, newToOld2_conn2Cov, - newToOld2_conn2Cov, newToOld2_conn2Cov] - have hcurv : (fun b ↦ newToOld2 (curv2Var ν μ b)) = curv2Poly ν μ := by - funext b - exact newToOld2_curv2Var ν μ b - rw [hcurv] - -lemma oldToNew2_dFNonlin (ρ ν μ : Lor) : - (fun c ↦ oldToNew2 (dFNonlin ρ ν μ c)) = dFNonlinCov ρ ν μ := by - funext c - rw [dFNonlin, dFNonlinCov, map_add, map_add, algHom_brP, algHom_brP, algHom_brP, - oldToNew2_conn2Old, oldToNew2_conn2Old, oldToNew2_conn2Old] - have hder₁ : (fun a ↦ oldToNew2 (der2Old ρ ν a)) = der2Cov ρ ν := by - funext a - exact oldToNew2_der ρ ν a - have hder₂ : (fun a ↦ oldToNew2 (der2Old ρ μ a)) = der2Cov ρ μ := by - funext a - exact oldToNew2_der ρ μ a - have hcurv : (fun b ↦ oldToNew2 (curv2Poly ν μ b)) = curv2Var ν μ := by - funext b - exact oldToNew2_curv2Poly ν μ b - rw [hder₁, hder₂, hcurv] - -lemma newToOld2_hookInc (ρ : Lor) (q : CurvPair) (c : Col) : - newToOld2 (hookInc ρ q c) = dFPoly ρ q.1.1 q.1.2 c := by - obtain ⟨⟨ν, μ⟩, hνμ⟩ := q - rw [hookInc] - by_cases h : LorLT ρ ν - · rw [dif_pos h, map_sub, newToOld2_hook, newToOld2_hook] - have hb := dFPoly_bianchi ρ ν μ c - linear_combination (norm := ring_nf) -hb - · rw [dif_neg h, newToOld2_hook] - -lemma newToOld2_hookVar (ρ ν μ : Lor) (c : Col) : - newToOld2 (hookVar ρ ν μ c) = dFPoly ρ ν μ c := by - rw [hookVar] - by_cases h : LorLT ν μ - · rw [dif_pos h, newToOld2_hookInc] - · by_cases h' : LorLT μ ν - · rw [dif_neg h, dif_pos h', map_neg, newToOld2_hookInc, ← dFPoly_swap] - · rw [dif_neg h, dif_neg h', map_zero] - rcases lor_trichotomy ν μ with hlt | rfl | hgt - · exact absurd hlt h - · have hs := dFPoly_swap ρ ν ν c - have htwo : (2 : ℝ) • dFPoly ρ ν ν c = 0 := by - rw [two_smul] - nth_rewrite 1 [hs] - exact neg_add_cancel _ - have hhalf := congrArg (fun x : A₂ ↦ (2⁻¹ : ℝ) • x) htwo - symm - simpa [smul_smul] using hhalf - · exact absurd hgt h' - -lemma newToOld2_oldToNew2 (i : Coord2) : newToOld2 (oldToNew2 (X i)) = X i := by - cases i with - | conn μ c => rw [oldToNew2_conn, newToOld2_conn] - | der ν μ c => - rw [oldToNew2_der] - exact congrFun (newToOld2_der2Cov ν μ) c - | sec s μ c => - induction s using Sym2.ind with - | _ ρ ν => - rw [← secAt, oldToNew2_sec, map_add, map_smul, map_add, map_sub, map_sub, - newToOld2_sym2, newToOld2_hookVar, newToOld2_hookVar, - congrFun (newToOld2_dFNonlinCov ρ ν μ) c, - congrFun (newToOld2_dFNonlinCov ν ρ μ) c, - dFPoly, dFPoly] - calc - sym3Old (sym3Key ρ ν μ) c + - (3⁻¹ : ℝ) • - (leadHook ρ ν μ c + dFNonlin ρ ν μ c - dFNonlin ρ ν μ c + - (leadHook ν ρ μ c + dFNonlin ν ρ μ c - dFNonlin ν ρ μ c)) = - sym3Old (sym3Key ρ ν μ) c + - (3⁻¹ : ℝ) • (leadHook ρ ν μ c + leadHook ν ρ μ c) := by - module - _ = secAt ρ ν μ c := (leading_hook_decomposition ρ ν μ c).symm - -/- The remaining direction is proved after two triangular identities below. -/ - -lemma dFNonlinCov_bianchi (ρ ν μ : Lor) (c : Col) : - dFNonlinCov ρ ν μ c - dFNonlinCov ν ρ μ c + - dFNonlinCov μ ρ ν c = 0 := by - have h := congrArg oldToNew2 (dFNonlin_bianchi ρ ν μ c) - simpa only [map_add, map_sub, map_zero, congrFun (oldToNew2_dFNonlin ρ ν μ) c, - congrFun (oldToNew2_dFNonlin ν ρ μ) c, - congrFun (oldToNew2_dFNonlin μ ρ ν) c] using h - -private lemma triangular_hook_sub (S a b d na nb nd : A₂cov) - (ha : a - b + d = 0) (hn : na - nb + nd = 0) : - (S + (3⁻¹ : ℝ) • ((a - na) + (b - nb))) - - (S + (3⁻¹ : ℝ) • ((-a - -na) + (d - nd))) = a - na := by - have hb : b = a + d := by - linear_combination (norm := ring_nf) -ha - have hnb : nb = na + nd := by - linear_combination (norm := ring_nf) -hn - rw [hb, hnb] - norm_num - module - -lemma oldToNew2_leadHook (ρ ν μ : Lor) (c : Col) : - oldToNew2 (leadHook ρ ν μ c) = - hookVar ρ ν μ c - dFNonlinCov ρ ν μ c := by - have hs : (X (CovCoord2.sym2 (sym3Key ρ μ ν) c) : A₂cov) = - X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by - rw [sym3Key_swap23] - rw [leadHook, map_sub, oldToNew2_sec, oldToNew2_sec, hs, - hookVar_swap ρ μ ν, dFNonlinCov_swap ρ μ ν] - have hh := hookVar_bianchi ρ ν μ c - have hn := dFNonlinCov_bianchi ρ ν μ c - exact triangular_hook_sub _ _ _ _ _ _ _ hh hn - -lemma oldToNew2_dFPoly (ρ ν μ : Lor) (c : Col) : - oldToNew2 (dFPoly ρ ν μ c) = hookVar ρ ν μ c := by - rw [dFPoly, map_add, oldToNew2_leadHook, - congrFun (oldToNew2_dFNonlin ρ ν μ) c] - abel - -lemma oldToNew2_sym3Average (ρ ν μ : Lor) (c : Col) : - oldToNew2 (sym3Average ρ ν μ c) = X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by - have hs₁ : (X (CovCoord2.sym2 (sym3Key ρ μ ν) c) : A₂cov) = - X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by - exact congrArg (fun t ↦ (X (CovCoord2.sym2 t c) : A₂cov)) (sym3Key_swap23 ρ ν μ).symm - have hs₂ : (X (CovCoord2.sym2 (sym3Key ν μ ρ) c) : A₂cov) = - X (CovCoord2.sym2 (sym3Key ρ ν μ) c) := by - exact congrArg (fun t ↦ (X (CovCoord2.sym2 t c) : A₂cov)) (sym3Key_cycle ρ ν μ).symm - rw [sym3Average, map_smul, map_add, map_add, oldToNew2_sec, oldToNew2_sec, - oldToNew2_sec, hs₁, hs₂, - hookVar_swap ρ μ ν, dFNonlinCov_swap ρ μ ν, - hookVar_swap ν μ ρ, dFNonlinCov_swap ν μ ρ, - hookVar_swap μ ν ρ, dFNonlinCov_swap μ ν ρ] - norm_num - module - -lemma oldToNew2_sym3Old (t : Sym3Idx) (c : Col) : - oldToNew2 (sym3Old t c) = X (CovCoord2.sym2 t c) := by - rw [sym3Old, oldToNew2_sym3Average, sym3Key_components] - -lemma oldToNew2_hookInc (ρ : Lor) (q : CurvPair) (c : Col) : - oldToNew2 (dFPoly ρ q.1.1 q.1.2 c) = hookInc ρ q c := by - rw [oldToNew2_dFPoly, hookVar] - exact dif_pos q.2 - -lemma oldToNew2_newToOld2 (i : CovCoord2) : oldToNew2 (newToOld2 (X i)) = X i := by - cases i with - | conn μ c => rw [newToOld2_conn, oldToNew2_conn] - | sym1 s c => - induction s using Sym2.ind with - | _ ν μ => - rw [newToOld2_sym1, map_smul, map_add, oldToNew2_der, oldToNew2_der, - der2Cov, der2Cov, Sym2.eq_swap (a := μ) (b := ν), curv2Var_swap μ ν c, - brP_swap (conn2Cov μ) (conn2Cov ν) c] - module - | curv q c => - rw [newToOld2_curv, oldToNew2_curv2Poly, curv2Var] - exact dif_pos q.2 - | sym2 t c => rw [newToOld2_sym2, oldToNew2_sym3Old] - | hook i c => - obtain ⟨⟨ρ, q⟩, hi⟩ := i - rw [newToOld2_hook, oldToNew2_hookInc, hookInc, dif_neg hi] - -/-! - -## G. The second-order coordinate equivalence - --/ - -/-- The second-order ordinary and covariant polynomial presentations are isomorphic. -/ -noncomputable def covEquiv2 : A₂ ≃ₐ[ℝ] A₂cov := - AlgEquiv.ofAlgHom oldToNew2 newToOld2 - (by refine algHom_ext fun i ↦ ?_; rw [AlgHom.comp_apply, oldToNew2_newToOld2, AlgHom.id_apply]) - (by refine algHom_ext fun i ↦ ?_; rw [AlgHom.comp_apply, newToOld2_oldToNew2, AlgHom.id_apply]) - -@[simp] lemma covEquiv2_apply (P : A₂) : covEquiv2 P = oldToNew2 P := rfl - -@[simp] lemma covEquiv2_symm_apply (Q : A₂cov) : covEquiv2.symm Q = newToOld2 Q := rfl - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean deleted file mode 100644 index a2895acfb..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/OrdinaryJets.lean +++ /dev/null @@ -1,960 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.SeriesGaugeAction -/-! -# The all-orders ordinary gluon jet algebra - -## i. Overview - -This file builds the ordinary gluon jet algebra at *arbitrary* finite derivative order: the -commutative -real algebra generated by the colour components of the connection `A_μ` and of all of its ordinary -symmetric derivatives `∂_s A_μ` at a point. It carries - -* the formal total derivative `jetDeriv`; -* the all-orders local jet-gauge substitution `gaugePull`, obtained as the coefficient - transcription of `GaugeAction` and `SeriesGaugeAction`'s power-series action `actPot U A μ = U A_μ - ⋆U + mcH U μ`. - -## ii. Conventions - -Hermitian throughout, matching the Physlib gluon convention and `CoordinateChange` through -`HookBianchi`. The colour carrier is `ColourBasis`'s traceless -hermitian `ColourSpace` with basis index `Col = Fin 8`; the colour bracket is -`brMat M N = i (M N - N M)`. - -## iii. The factorial normalization - -The derivative multi-index is `DIdx = Lor →₀ ℕ`; `facI s = ∏_ρ (s ρ)!` is its factorial. A -generator means an **ordinary derivative**, not a Taylor coefficient: - -```text -dA s μ c ↝ coordC c (∂_s A_μ (0)), ∂_s A_μ (0) = facI s • coeffMat s (A μ). -``` - -This is the normalization forced by asking `jetDeriv` to append the derivative index with -coefficient one. At `s = 0` and `s = single ν 1` the factor is `1`, so the convention agrees with -`GaugeAction`'s `Coord.conn` and `Coord.der` on the nose. - -## iv. The composition orientation - -`GaugeAction`'s `gaugeAct U` is substitution by the *transformed point*, `eval x (gaugeAct U P) = -eval (actPt U x) P`. Since `actPot` is a **left** action on potentials, the raw polynomial -substitution is contravariant, and the law proved below is - -```text -gaugePull (U * V) = (gaugePull V).comp (gaugePull U). -``` - -No covariant composition law is asserted. A literal `MulAction` through inverse jets is *not* -packaged: `CovariantTower`'s covariance statement and `GaugeAction` compatibility both want the raw -substitution. - -## v. Results - -* `JetGenerators`, `JetComponentSpace.basis`, `JetAlgebra`, `ofGen` — the carrier; -* `jetDeriv`, `jetDeriv_ofGen`, `jetDeriv_one`, `jetDeriv_mul`, `jetDeriv_comm_apply`; -* `brR`, `adR`, `constR` — the colour-vector calculus over an arbitrary commutative `ℝ`-algebra, - with the same structure constants `cstruct` and `adCoef` as `CoordinateChange`/`GaugeAction`; -* `conjC` — the `t`-th Taylor coefficient of conjugation by a gauge jet, a colour endomorphism; -* `gaugeSubstGen`, `gaugePull` — the all-orders substitution; -* `evalA_gaugePull` — faithfulness: substituting is pulling back along the honest affine action; -* `gaugePull_one`, `gaugePull_mul` — the identity and (contravariant) composition laws; -* `gaugeSubstGen_zero`, `gaugeSubstGen_single` — degree-zero and degree-one agreement with - `GaugeAction`. - --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPolynomial - -open scoped TensorProduct - -namespace SU3Jet - -/-! - -## A. The ordinary generators - --/ - -/-- The symmetric ordinary derivative multi-index. This is the `Lor →₀ ℕ` form of a multiset of - spacetime directions; it is the index type of `MvPowerSeries.coeff`, `coeffMat` and - `mcCoeffCAt`, which is why it is preferred to `Multiset Lor` here. -/ -abbrev DIdx : Type := Lor →₀ ℕ - -/-- The multiset form of a derivative multi-index, recording the equivalence with the - `Multiset Lor` presentation. -/ -noncomputable def didxMultiset : DIdx ≃ Multiset Lor := Multiset.toFinsupp.toEquiv.symm - -/-- An ordinary generator: the colour-`c` component of the `s`-th ordinary derivative of the - connection in the direction `μ`. -/ -inductive JetGenerators where - /-- The generator `(∂_s A_μ)^c`. -/ - | dA (s : DIdx) (μ : Lor) (c : Col) : JetGenerators -deriving DecidableEq - -namespace JetGenerators - -/-- The generator with one further ordinary derivative in the direction `ν`. -/ -noncomputable def shift (ν : Lor) : JetGenerators → JetGenerators - | dA s μ c => dA (s + Finsupp.single ν 1) μ c - -@[simp] -lemma shift_dA (ν : Lor) (s : DIdx) (μ : Lor) (c : Col) : - shift ν (dA s μ c) = dA (s + Finsupp.single ν 1) μ c := rfl - -/-- **Ordinary derivatives commute.** The derivative index really is symmetric: shifting by `μ` - and then `ν` is shifting by `ν` and then `μ`. -/ -lemma shift_comm (ν ρ : Lor) (g : JetGenerators) : shift ν (shift ρ g) = shift ρ (shift ν g) := by - cases g with - | dA s μ c => rw [shift_dA, shift_dA, shift_dA, shift_dA, add_right_comm] - -/-- The generators are the derivative multi-index, the Lorentz index and the colour index. -/ -def equiv : JetGenerators ≃ DIdx × Lor × Col where - toFun := fun (dA s μ c) => (s, μ, c) - invFun := fun p => dA p.1 p.2.1 p.2.2 - left_inv := fun (dA _ _ _) => rfl - right_inv := fun _ => rfl - -end JetGenerators - -/-! - -## B. The component space and the polynomial carrier - -The component space is the house-style tensor product of the real derivative-symbol algebra with -the dual of the connection components, following `BBoson.JetComponentSpace`. The colour factor is -the dual of `ColourBasis`'s physical traceless hermitian `ColourSpace`. - --/ - -/-- The space of component functions of an ordinary gluon jet: derivative symbols tensored with - the dual of a Lorentz index and the dual of a colour direction. -/ -def JetComponentSpace : Type := - DerivAlgebraReal ⊗[ℝ] (Module.Dual ℝ Lorentz.CoVector ⊗[ℝ] Module.Dual ℝ ColourSpace) - -noncomputable instance : AddCommGroup JetComponentSpace := - inferInstanceAs (AddCommGroup - (DerivAlgebraReal ⊗[ℝ] (Module.Dual ℝ Lorentz.CoVector ⊗[ℝ] Module.Dual ℝ ColourSpace))) - -noncomputable instance : Module ℝ JetComponentSpace := - inferInstanceAs (Module ℝ - (DerivAlgebraReal ⊗[ℝ] (Module.Dual ℝ Lorentz.CoVector ⊗[ℝ] Module.Dual ℝ ColourSpace))) - -/-- The explicit basis of the ordinary jet component space, indexed by the ordinary generators. -/ -noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponentSpace := - (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.tensorProduct - (Lorentz.CoVector.basis.dualBasis.tensorProduct colourBasis.dualBasis)).reindex - JetGenerators.equiv.symm - -/-- The all-orders ordinary gluon jet algebra. -/ -def JetAlgebra : Type := SymmetricAlgebra ℝ JetComponentSpace - -noncomputable instance : CommRing JetAlgebra := - inferInstanceAs (CommRing (SymmetricAlgebra ℝ JetComponentSpace)) - -noncomputable instance : Algebra ℝ JetAlgebra := - inferInstanceAs (Algebra ℝ (SymmetricAlgebra ℝ JetComponentSpace)) - -/-- The generator of the jet algebra attached to an ordinary generator. -/ -noncomputable def ofGen (g : JetGenerators) : JetAlgebra := - SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g) - -/-- The polynomial coordinates of the ordinary jet algebra. -/ -noncomputable def toPoly : JetAlgebra ≃ₐ[ℝ] MvPolynomial JetGenerators ℝ := - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis - -@[simp] -lemma toPoly_ofGen (g : JetGenerators) : toPoly (ofGen g) = X g := - SymmetricAlgebra.equivMvPolynomial_ι_apply _ _ - -@[simp] -lemma toPoly_symm_X (g : JetGenerators) : toPoly.symm (X g) = ofGen g := - SymmetricAlgebra.equivMvPolynomial_symm_X _ _ - -/-- Two algebra maps out of the jet algebra agreeing on every generator are equal. -/ -lemma jetAlgHom_ext {A : Type*} [CommSemiring A] [Algebra ℝ A] {f g : JetAlgebra →ₐ[ℝ] A} - (h : ∀ i : JetGenerators, f (ofGen i) = g (ofGen i)) : f = g := - SymmetricAlgebra.algHom_ext (JetComponentSpace.basis.ext h) - -/-- Evaluation of a jet polynomial at a point of the ordinary coordinate space. -/ -noncomputable def evalA (x : JetGenerators → ℝ) : JetAlgebra →ₐ[ℝ] ℝ := - (MvPolynomial.aeval x).comp toPoly.toAlgHom - -lemma evalA_eq_eval (x : JetGenerators → ℝ) (P : JetAlgebra) : - evalA x P = MvPolynomial.eval x (toPoly P) := rfl - -@[simp] -lemma evalA_ofGen (x : JetGenerators → ℝ) (g : JetGenerators) : evalA x (ofGen g) = x g := by - rw [evalA_eq_eval, toPoly_ofGen, eval_X] - -/-- Elements of the jet algebra agreeing at every point of the coordinate space are equal; - legitimate because `ℝ` is an infinite integral domain. -/ -lemma jetAlgebra_funext {P Q : JetAlgebra} (h : ∀ x, evalA x P = evalA x Q) : P = Q := by - apply toPoly.injective - exact MvPolynomial.funext fun x => by - have hx := h x - rwa [evalA_eq_eval, evalA_eq_eval] at hx - -/-! - -## C. The formal total derivative - -Following `BBoson.JetAlgebra.jetDeriv`: the derivation appending the derivative index, built -through the polynomial coordinates rather than postulated. - --/ - -/-- The derivative substitution on polynomial coordinates. -/ -noncomputable def polyDeriv (ν : Lor) : - Derivation ℝ (MvPolynomial JetGenerators ℝ) (MvPolynomial JetGenerators ℝ) := - MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ) - -@[simp] -lemma polyDeriv_X (ν : Lor) (g : JetGenerators) : - polyDeriv ν (X g) = X (JetGenerators.shift ν g) := - MvPolynomial.mkDerivation_X _ _ _ - -lemma polyDeriv_comm (ν ρ : Lor) (p : MvPolynomial JetGenerators ℝ) : - polyDeriv ν (polyDeriv ρ p) = polyDeriv ρ (polyDeriv ν p) := by - induction p using MvPolynomial.induction_on with - | C a => - rw [← algebraMap_eq, Derivation.map_algebraMap, map_zero, Derivation.map_algebraMap, - map_zero] - | add p q hp hq => rw [map_add, map_add, map_add, map_add, hp, hq] - | mul_X p g hp => - simp only [Derivation.leibniz, polyDeriv_X, smul_eq_mul, map_add] - rw [JetGenerators.shift_comm, hp] - ring - -/-- **The formal total spacetime derivative** on the ordinary jet algebra: the derivation sending - each component function `∂_s A_μ` to `∂_{s + ν} A_μ`. -/ -noncomputable def jetDeriv (ν : Lor) : JetAlgebra →ₗ[ℝ] JetAlgebra := - toPoly.symm.toLinearMap ∘ₗ (polyDeriv ν).toLinearMap ∘ₗ toPoly.toLinearMap - -lemma toPoly_jetDeriv (ν : Lor) (P : JetAlgebra) : - toPoly (jetDeriv ν P) = polyDeriv ν (toPoly P) := by - simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, - Derivation.coeFn_coe, AlgEquiv.apply_symm_apply] - -/-- **The total derivative appends the derivative index.** -/ -@[simp] -lemma jetDeriv_ofGen (ν : Lor) (g : JetGenerators) : - jetDeriv ν (ofGen g) = ofGen (JetGenerators.shift ν g) := by - apply toPoly.injective - rw [toPoly_jetDeriv, toPoly_ofGen, polyDeriv_X, toPoly_ofGen] - -@[simp] -lemma jetDeriv_one (ν : Lor) : jetDeriv ν (1 : JetAlgebra) = 0 := by - apply toPoly.injective - simp only [toPoly_jetDeriv, map_one, map_zero, Derivation.map_one_eq_zero] - -/-- **The Leibniz rule** for the total derivative. -/ -lemma jetDeriv_mul (ν : Lor) (P Q : JetAlgebra) : - jetDeriv ν (P * Q) = jetDeriv ν P * Q + P * jetDeriv ν Q := by - apply toPoly.injective - simp only [toPoly_jetDeriv, map_mul, map_add, Derivation.leibniz, smul_eq_mul] - ring - -/-- **Total derivatives commute.** -/ -lemma jetDeriv_comm_apply (ν ρ : Lor) (P : JetAlgebra) : - jetDeriv ν (jetDeriv ρ P) = jetDeriv ρ (jetDeriv ν P) := by - apply toPoly.injective - rw [toPoly_jetDeriv, toPoly_jetDeriv, toPoly_jetDeriv, toPoly_jetDeriv, polyDeriv_comm] - -/-! - -## D. Colour vectors over an arbitrary commutative real algebra - -`CoordinateChange`'s `brP`, `GaugeAction`'s `adP` and `constP` are stated for `MvPolynomial ι ℝ`. -The ordinary carrier is a -`SymmetricAlgebra`, and the evaluation dictionary below lands in a power-series ring, so the same -formulas are restated over an arbitrary commutative `ℝ`-algebra. The structure constants are -`CoordinateChange`'s `cstruct` and `GaugeAction`'s `adCoef` unchanged: nothing is re-expanded by -hand. - --/ - -section ColourAlg - -variable {R S : Type*} [CommRing R] [Algebra ℝ R] [CommRing S] [Algebra ℝ S] - -/-- The colour bracket of two colour vectors valued in a commutative `ℝ`-algebra. -/ -noncomputable def brR (p q : Col → R) : Col → R := - fun c => ∑ a, ∑ b, algebraMap ℝ R (cstruct a b c) * (p a * q b) - -/-- The adjoint action of a constant colour rotation on a colour vector. -/ -noncomputable def adR (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → R) : Col → R := - fun c => ∑ c', algebraMap ℝ R (adCoef u c c') * p c' - -/-- A constant colour vector. -/ -noncomputable def constR (Y : ColourSpace) : Col → R := fun c => algebraMap ℝ R (coordC c Y) - -lemma brR_swap (p q : Col → R) (c : Col) : brR p q c = -brR q p c := by - have key : (brR q p c : R) = ∑ a, ∑ b, -(algebraMap ℝ R (cstruct a b c) * (p a * q b)) := by - rw [brR, Finset.sum_comm] - refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - rw [cstruct_swap b a c, map_neg] - ring - rw [key, brR] - simp [Finset.sum_neg_distrib] - -lemma brR_self (p : Col → R) (c : Col) : brR p p c = 0 := by - have h : (2 : ℝ) • brR p p c = 0 := by - rw [two_smul] - nth_rewrite 1 [brR_swap p p c] - exact neg_add_cancel _ - have h2 := congrArg (fun x : R => (2⁻¹ : ℝ) • x) h - simpa [smul_smul] using h2 - -lemma brR_add_left (p p' q : Col → R) (c : Col) : - brR (p + p') q c = brR p q c + brR p' q c := by - simp only [brR, Pi.add_apply, add_mul, mul_add, Finset.sum_add_distrib] - -lemma brR_add_right (p q q' : Col → R) (c : Col) : - brR p (q + q') c = brR p q c + brR p q' c := by - simp only [brR, Pi.add_apply, mul_add, Finset.sum_add_distrib] - -lemma adR_one (p : Col → R) (c : Col) : adR 1 p c = p c := by - rw [adR] - have h : ∀ c' : Col, (algebraMap ℝ R (adCoef 1 c c')) * p c' = if c = c' then p c' else 0 := by - intro c' - rw [adCoef_one] - by_cases hc : c = c' <;> simp [hc] - rw [Finset.sum_congr rfl fun c' (_ : c' ∈ Finset.univ) => h c'] - simp - -lemma algHom_brR (φ : R →ₐ[ℝ] S) (p q : Col → R) (c : Col) : - φ (brR p q c) = brR (fun a => φ (p a)) (fun b => φ (q b)) c := by - rw [brR, brR, map_sum] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [map_sum] - exact Finset.sum_congr rfl fun b _ => by rw [map_mul, map_mul, AlgHom.commutes] - -lemma algHom_adR (φ : R →ₐ[ℝ] S) (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → R) (c : Col) : - φ (adR u p c) = adR u (fun a => φ (p a)) c := by - rw [adR, adR, map_sum] - exact Finset.sum_congr rfl fun c' _ => by rw [map_mul, AlgHom.commutes] - -lemma algHom_constR (φ : R →ₐ[ℝ] S) (Y : ColourSpace) (c : Col) : - φ (constR Y c) = constR Y c := AlgHom.commutes _ _ - -end ColourAlg - -/-- On the polynomial carrier the general colour bracket is `CoordinateChange`'s `brP`. -/ -lemma brP_eq_brR {ι : Type*} (p q : Col → MvPolynomial ι ℝ) (c : Col) : - brP p q c = brR p q c := by - rw [brP, brR] - simp only [MvPolynomial.algebraMap_eq] - -/-- On the polynomial carrier the general adjoint action is `GaugeAction`'s `adP`. -/ -lemma adP_eq_adR {ι : Type*} (u : specialUnitaryGroup (Fin 3) ℂ) (p : Col → MvPolynomial ι ℝ) - (c : Col) : adP u p c = adR u p c := by - rw [adP, adR] - simp only [MvPolynomial.algebraMap_eq] - -/-- On the polynomial carrier the general constant colour vector is `GaugeAction`'s `constP`. -/ -lemma constP_eq_constR {ι : Type*} (Y : ColourSpace) (c : Col) : - (constP Y c : MvPolynomial ι ℝ) = constR Y c := by - rw [constP, constR, MvPolynomial.algebraMap_eq] - -/-! - -## E. Coefficients of a conjugated constant colour matrix - -The generalized Leibniz rule for `∂_s (U A_μ ⋆U)` is carried entirely by power-series -multiplication. The only new object needed is the `t`-th Taylor coefficient of the conjugate of a -*constant* matrix by the gauge jet. It preserves the physical colour carrier: hermiticity because -the two outer factors enter symmetrically, and tracelessness because `⋆U U = 1` makes the trace of -the conjugate a constant series. - --/ - -/-- A constant complex matrix, viewed as a matrix of jets. -/ -noncomputable def constMat (M : Matrix (Fin 3) (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) JetRing := - M.map (MvPowerSeries.C : ℂ →+* JetRing) - -@[simp] -lemma constMat_apply (M : Matrix (Fin 3) (Fin 3) ℂ) (i j : Fin 3) : - constMat M i j = (MvPowerSeries.C (M i j) : JetRing) := rfl - -lemma constMat_add (M N : Matrix (Fin 3) (Fin 3) ℂ) : - constMat (M + N) = constMat M + constMat N := - Matrix.ext fun i j => by - show (MvPowerSeries.C (M i j + N i j) : JetRing) = _ - rw [map_add]; rfl - -lemma smul_C_jet (r : ℝ) (z : ℂ) : - (MvPowerSeries.C ((r • z : ℂ)) : JetRing) = r • (MvPowerSeries.C z : JetRing) := by - ext k - rw [(MvPowerSeries.coeff k).map_smul_of_tower, MvPowerSeries.coeff_C, MvPowerSeries.coeff_C] - split_ifs <;> simp - -lemma constMat_smul (r : ℝ) (M : Matrix (Fin 3) (Fin 3) ℂ) : - constMat (r • M) = r • constMat M := - Matrix.ext fun i j => by - show (MvPowerSeries.C ((r • M i j : ℂ)) : JetRing) = _ - rw [smul_C_jet]; rfl - -lemma star_constMat (M : Matrix (Fin 3) (Fin 3) ℂ) : star (constMat M) = constMat (star M) := - Matrix.ext fun i j => by - show star (MvPowerSeries.C (M j i) : JetRing) = MvPowerSeries.C (star (M j i)) - rw [JetRing.star_C] - -lemma trace_constMat (M : Matrix (Fin 3) (Fin 3) ℂ) : - trace (constMat M) = (MvPowerSeries.C (trace M) : JetRing) := by - rw [Matrix.trace, Matrix.trace, map_sum] - exact Finset.sum_congr rfl fun i _ => rfl - -lemma coeffMat_add (k : DIdx) (M N : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat k (M + N) = coeffMat k M + coeffMat k N := - Matrix.ext fun i j => by - show MvPowerSeries.coeff k (M i j + N i j) = _ - rw [map_add] - rfl - -lemma coeffMat_smul (k : DIdx) (r : ℝ) (M : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat k (r • M) = r • coeffMat k M := - Matrix.ext fun i j => by - show MvPowerSeries.coeff k (r • M i j) = _ - rw [(MvPowerSeries.coeff k).map_smul_of_tower] - rfl - -lemma star_coeffMat (k : DIdx) (M : Matrix (Fin 3) (Fin 3) JetRing) : - star (coeffMat k M) = coeffMat k (star M) := - Matrix.ext fun i j => (JetRing.coeff_star k (M j i)).symm - -lemma coeffMat_zero_eq_jetValue (M : Matrix (Fin 3) (Fin 3) JetRing) : - coeffMat 0 M = Gluon.jetValue M := - Matrix.ext fun i j => MvPowerSeries.coeff_zero_eq_constantCoeff_apply (M i j) - -/-- **The `t`-th Taylor coefficient of a conjugated constant colour matrix.** -/ -noncomputable def conjCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) - (M : Matrix (Fin 3) (Fin 3) ℂ) : Matrix (Fin 3) (Fin 3) ℂ := - coeffMat t (U.1 * constMat M * star U.1) - -lemma conjCoeffM_add (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) - (M N : Matrix (Fin 3) (Fin 3) ℂ) : - conjCoeffM U t (M + N) = conjCoeffM U t M + conjCoeffM U t N := by - rw [conjCoeffM, conjCoeffM, conjCoeffM, constMat_add, Matrix.mul_add, Matrix.add_mul, - coeffMat_add] - -lemma conjCoeffM_smul (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) (r : ℝ) - (M : Matrix (Fin 3) (Fin 3) ℂ) : - conjCoeffM U t (r • M) = r • conjCoeffM U t M := by - rw [conjCoeffM, conjCoeffM, constMat_smul, Matrix.mul_smul, Matrix.smul_mul, coeffMat_smul] - -/-- The conjugate of a hermitian matrix stays hermitian at every Taylor order. -/ -lemma star_conjCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) - {M : Matrix (Fin 3) (Fin 3) ℂ} (hM : star M = M) : - star (conjCoeffM U t M) = conjCoeffM U t M := by - rw [conjCoeffM, star_coeffMat, star_mul, star_mul, star_star, star_constMat, hM, - Matrix.mul_assoc] - -/-- The trace of the conjugate is a constant series: this is where `⋆U U = 1` is used. -/ -lemma trace_conjCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) - (M : Matrix (Fin 3) (Fin 3) ℂ) : - trace (conjCoeffM U t M) = - MvPowerSeries.coeff t (MvPowerSeries.C (trace M) : JetRing) := by - rw [conjCoeffM, trace_coeffMat, Matrix.trace_mul_cycle, coe_star_mul_self, Matrix.one_mul, - trace_constMat] - -lemma trace_conjCoeffM_of_traceless (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) - {M : Matrix (Fin 3) (Fin 3) ℂ} (hM : trace M = 0) : trace (conjCoeffM U t M) = 0 := by - rw [trace_conjCoeffM, hM, map_zero, map_zero] - -/-- **The coefficient conjugation operator on the physical colour carrier.** -/ -noncomputable def conjC (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) : - ColourSpace →ₗ[ℝ] ColourSpace where - toFun X := mkCM (conjCoeffM U t (cmat X)) (star_conjCoeffM U t (cmat_star X)) - (trace_conjCoeffM_of_traceless U t (cmat_trace X)) - map_add' X Y := cmat_injective (by - show conjCoeffM U t (cmat (X + Y)) = conjCoeffM U t (cmat X) + conjCoeffM U t (cmat Y) - rw [cmat_add, conjCoeffM_add]) - map_smul' r X := cmat_injective (by - show conjCoeffM U t (cmat (r • X)) = r • conjCoeffM U t (cmat X) - rw [cmat_smul, conjCoeffM_smul]) - -@[simp] -lemma cmat_conjC (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) (X : ColourSpace) : - cmat (conjC U t X) = conjCoeffM U t (cmat X) := rfl - -/-- At derivative order zero the coefficient conjugation is the adjoint action of the base-point - value of the gauge jet. -/ -lemma conjC_zero (U : specialUnitaryGroup (Fin 3) JetRing) (X : ColourSpace) : - conjC U 0 X = adC (JetGaugeGroupI.evalSU (Fin 3) U) X := by - apply cmat_injective - rw [cmat_conjC, cmat_adC, conjCoeffM, coeffMat_zero_eq_jetValue, Gluon.jetValue_mul, - Gluon.jetValue_mul, Gluon.jetValue_star, constMat, jetValue_map_C, jetValue_coe_eq, - star_eq_conjTranspose] - -/-! - -## F. The factorial normalization and the colour-potential dictionary - -`facI s` is the factorial of a derivative multi-index, so that `∂_s A_μ(0) = facI s • coeff_s A_μ`. -A generator is the *ordinary derivative*, which is the convention forced by asking `jetDeriv` to -append the derivative index with coefficient one. - --/ - -/-- The factorial of a spacetime derivative multi-index. -/ -noncomputable def facI (s : DIdx) : ℝ := ∏ ρ, (Nat.factorial (s ρ) : ℝ) - -lemma facI_pos (s : DIdx) : 0 < facI s := - Finset.prod_pos fun ρ _ => by exact_mod_cast Nat.factorial_pos (s ρ) - -lemma facI_ne_zero (s : DIdx) : facI s ≠ 0 := ne_of_gt (facI_pos s) - -@[simp] -lemma facI_zero : facI (0 : DIdx) = 1 := - Finset.prod_eq_one fun ρ _ => by simp - -/-- Appending one derivative index multiplies the factorial by the new multiplicity. -/ -lemma facI_add_single (s : DIdx) (ν : Lor) : - facI (s + Finsupp.single ν 1) = ((s ν : ℝ) + 1) * facI s := by - classical - rw [facI, facI, - show (∏ ρ : Lor, (Nat.factorial (((s + Finsupp.single ν 1) : DIdx) ρ) : ℝ)) = - ∏ ρ : Lor, ((if ρ = ν then ((s ν : ℝ) + 1) else 1) * (Nat.factorial (s ρ) : ℝ)) from - Finset.prod_congr rfl fun ρ _ => by - rcases eq_or_ne ρ ν with rfl | h - · rw [Finsupp.add_apply, Finsupp.single_eq_same, Nat.factorial_succ, if_pos rfl] - push_cast - ring - · rw [Finsupp.add_apply, Finsupp.single_eq_of_ne h, add_zero, if_neg h, one_mul], - Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ ν] - simp - -@[simp] -lemma facI_single (ν : Lor) : facI (Finsupp.single ν 1) = 1 := by - have h := facI_add_single 0 ν - rw [zero_add, facI_zero, mul_one, Finsupp.coe_zero, Pi.zero_apply] at h - rw [h] - norm_num - -/-- A jet with prescribed Taylor coefficients. -/ -def mkJet (f : DIdx → ℂ) : JetRing := f - -@[simp] -lemma coeff_mkJet (f : DIdx → ℂ) (k : DIdx) : MvPowerSeries.coeff k (mkJet f) = f k := rfl - -lemma cmat_sum {ι : Type*} (t : Finset ι) (f : ι → ColourSpace) : - cmat (∑ i ∈ t, f i) = ∑ i ∈ t, cmat (f i) := by - classical - induction t using Finset.induction with - | empty => rw [Finset.sum_empty, Finset.sum_empty, cmat_zero] - | insert a t ha ih => rw [Finset.sum_insert ha, Finset.sum_insert ha, cmat_add, ih] - -lemma star_eq_self_of_coeffMat {M : Matrix (Fin 3) (Fin 3) JetRing} - (h : ∀ k, star (coeffMat k M) = coeffMat k M) : star M = M := by - refine Matrix.ext fun i j => MvPowerSeries.ext fun k => ?_ - have hk := congrFun (congrFun (h k) i) j - show MvPowerSeries.coeff k (star (M j i)) = MvPowerSeries.coeff k (M i j) - rw [JetRing.coeff_star] - exact hk - -lemma trace_eq_zero_of_coeffMat {M : Matrix (Fin 3) (Fin 3) JetRing} - (h : ∀ k, trace (coeffMat k M) = 0) : trace M = 0 := by - refine MvPowerSeries.ext fun k => ?_ - rw [map_zero, ← trace_coeffMat, h k] - -/-- A gluon potential jet all of whose Taylor coefficients lie in the physical traceless hermitian - colour carrier. -/ -structure ColourPot where - /-- The underlying matrix-of-jets potential. -/ - pot : Potential - /-- Hermiticity, at every Taylor order. -/ - star_pot : ∀ μ, star (pot μ) = pot μ - /-- Tracelessness, at every Taylor order. -/ - trace_pot : ∀ μ, trace (pot μ) = 0 - -lemma ColourPot.ext' {A B : ColourPot} (h : A.pot = B.pot) : A = B := by - cases A - cases B - subst h - rfl - -/-- The `s`-th Taylor coefficient of a colour potential, in the colour carrier. -/ -noncomputable def ColourPot.coeffC (A : ColourPot) (s : DIdx) (μ : Lor) : ColourSpace := - mkCM (coeffMat s (A.pot μ)) (by rw [star_coeffMat, A.star_pot]) - (by rw [trace_coeffMat, A.trace_pot, map_zero]) - -@[simp] -lemma ColourPot.cmat_coeffC (A : ColourPot) (s : DIdx) (μ : Lor) : - cmat (A.coeffC s μ) = coeffMat s (A.pot μ) := rfl - -/-- **The point of the ordinary coordinate space described by a colour potential.** The generator - `∂_s A_μ` reads off the *ordinary derivative*, which is `facI s` times the Taylor - coefficient. -/ -noncomputable def potPt (A : ColourPot) : JetGenerators → ℝ - | .dA s μ c => facI s * coordC c (A.coeffC s μ) - -/-- The colour vector of the `s`-th ordinary derivative of the connection at a coordinate - point. -/ -noncomputable def cfgC (x : JetGenerators → ℝ) (s : DIdx) (μ : Lor) : ColourSpace := - mkC fun c => x (JetGenerators.dA s μ c) - -/-- **The generic colour potential of a point of the ordinary coordinate space.** -/ -noncomputable def potOf (x : JetGenerators → ℝ) : ColourPot where - pot := fun μ => Matrix.of fun i j => mkJet fun k => cmat ((facI k)⁻¹ • cfgC x k μ) i j - star_pot μ := star_eq_self_of_coeffMat fun k => by - show star (cmat ((facI k)⁻¹ • cfgC x k μ)) = cmat ((facI k)⁻¹ • cfgC x k μ) - exact cmat_star _ - trace_pot μ := trace_eq_zero_of_coeffMat fun k => by - show trace (cmat ((facI k)⁻¹ • cfgC x k μ)) = 0 - exact cmat_trace _ - -@[simp] -lemma coeffMat_potOf (x : JetGenerators → ℝ) (k : DIdx) (μ : Lor) : - coeffMat k ((potOf x).pot μ) = cmat ((facI k)⁻¹ • cfgC x k μ) := rfl - -@[simp] -lemma coeffC_potOf (x : JetGenerators → ℝ) (k : DIdx) (μ : Lor) : - (potOf x).coeffC k μ = (facI k)⁻¹ • cfgC x k μ := - cmat_injective (coeffMat_potOf x k μ) - -/-- Reading off the coordinates of the generic potential returns the point. -/ -@[simp] -lemma potPt_potOf (x : JetGenerators → ℝ) : potPt (potOf x) = x := by - funext g - cases g with - | dA s μ c => - show facI s * coordC c ((potOf x).coeffC s μ) = _ - rw [coeffC_potOf, map_smul, smul_eq_mul, cfgC, coordC_mkC, ← mul_assoc, - mul_inv_cancel₀ (facI_ne_zero s), one_mul] - -/-- Building the generic potential from the coordinates of a colour potential returns it. -/ -@[simp] -lemma potOf_potPt (A : ColourPot) : potOf (potPt A) = A := by - refine ColourPot.ext' ?_ - funext μ - refine Matrix.ext fun i j => MvPowerSeries.ext fun k => ?_ - have h : cfgC (potPt A) k μ = facI k • A.coeffC k μ := by - rw [cfgC, show (fun c => potPt A (JetGenerators.dA k μ c)) = - (fun c => coordC c (facI k • A.coeffC k μ)) from funext fun c => by - rw [map_smul, smul_eq_mul] - rfl] - exact mkC_coordC _ - have h2 : cmat ((facI k)⁻¹ • cfgC (potPt A) k μ) = coeffMat k (A.pot μ) := by - rw [h, smul_smul, inv_mul_cancel₀ (facI_ne_zero k), one_smul, ColourPot.cmat_coeffC] - exact congrFun (congrFun h2 i) j - -/-- The local gauge action preserves the physical colour carrier at every Taylor order. -/ -noncomputable def actPotC (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : - ColourPot where - pot := actPot U A.pot - star_pot μ := by - rw [actPot, star_add, star_mcH, star_mul, star_mul, star_star, A.star_pot, Matrix.mul_assoc] - trace_pot μ := by - rw [actPot, trace_add, trace_mcH, Matrix.trace_mul_cycle, coe_star_mul_self, Matrix.one_mul, - A.trace_pot, add_zero] - -@[simp] -lemma actPotC_pot (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : - (actPotC U A).pot = actPot U A.pot := rfl - -lemma actPotC_one (A : ColourPot) : actPotC 1 A = A := - ColourPot.ext' (actPot_one A.pot) - -lemma actPotC_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) : - actPotC (U * V) A = actPotC U (actPotC V A) := - ColourPot.ext' (actPot_mul U V A.pot) - -/-! - -## G. The coefficient convolution - -The generalized Leibniz rule for `∂_s (U A_μ ⋆U)` is carried by power-series multiplication: the -`s`-th coefficient of the conjugate is the convolution of the coefficients of `A_μ` with the -coefficient conjugation operator of section E. No multinomial bookkeeping is written by hand. - --/ - -private lemma coeff_mul_mul_split (f g h : JetRing) (s : DIdx) : - MvPowerSeries.coeff s (f * g * h) = - ∑ p ∈ Finset.antidiagonal s, - MvPowerSeries.coeff p.1 g * MvPowerSeries.coeff p.2 (f * h) := by - rw [show f * g * h = g * (f * h) by ring, MvPowerSeries.coeff_mul] - -private lemma mul_mul_apply (P N Q : Matrix (Fin 3) (Fin 3) JetRing) (i j : Fin 3) : - (P * N * Q) i j = ∑ l, ∑ k, P i k * N k l * Q l j := by - rw [Matrix.mul_apply] - refine Finset.sum_congr rfl fun l _ => ?_ - rw [Matrix.mul_apply, Finset.sum_mul] - -/-- **The coefficient convolution of a conjugated potential.** -/ -lemma coeffMat_conj_split (U : specialUnitaryGroup (Fin 3) JetRing) - (N : Matrix (Fin 3) (Fin 3) JetRing) (s : DIdx) : - coeffMat s (U.1 * N * star U.1) = - ∑ p ∈ Finset.antidiagonal s, conjCoeffM U p.2 (coeffMat p.1 N) := by - refine Matrix.ext fun i j => ?_ - have hR : (∑ p ∈ Finset.antidiagonal s, conjCoeffM U p.2 (coeffMat p.1 N)) i j = - ∑ p ∈ Finset.antidiagonal s, ∑ l, ∑ k, - MvPowerSeries.coeff p.1 (N k l) * - MvPowerSeries.coeff p.2 (U.1 i k * star U.1 l j) := by - rw [Matrix.sum_apply] - refine Finset.sum_congr rfl fun p _ => ?_ - show MvPowerSeries.coeff p.2 ((U.1 * constMat (coeffMat p.1 N) * star U.1) i j) = _ - rw [mul_mul_apply, map_sum] - refine Finset.sum_congr rfl fun l _ => ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [show U.1 i k * constMat (coeffMat p.1 N) k l * star U.1 l j = - (MvPowerSeries.C (MvPowerSeries.coeff p.1 (N k l)) : JetRing) * - (U.1 i k * star U.1 l j) from by - show U.1 i k * (MvPowerSeries.C (MvPowerSeries.coeff p.1 (N k l)) : JetRing) * - star U.1 l j = _ - ring, MvPowerSeries.coeff_C_mul] - rw [hR] - show MvPowerSeries.coeff s ((U.1 * N * star U.1) i j) = _ - rw [mul_mul_apply, map_sum] - rw [Finset.sum_comm (s := Finset.antidiagonal s)] - refine Finset.sum_congr rfl fun l _ => ?_ - rw [map_sum, Finset.sum_comm (s := Finset.antidiagonal s)] - exact Finset.sum_congr rfl fun k _ => coeff_mul_mul_split _ _ _ s - -/-- **The coefficient transcription of the power-series action.** -/ -lemma coeffMat_actPot (U : specialUnitaryGroup (Fin 3) JetRing) (A : Potential) (μ : Lor) - (s : DIdx) : - coeffMat s (actPot U A μ) = - (∑ p ∈ Finset.antidiagonal s, conjCoeffM U p.2 (coeffMat p.1 (A μ))) + mcCoeffM U μ s := by - rw [actPot, coeffMat_add, coeffMat_conj_split] - rfl - -/-- The same statement in the physical colour carrier. -/ -lemma coeffC_actPotC (U : specialUnitaryGroup (Fin 3) JetRing) (A : ColourPot) (μ : Lor) - (s : DIdx) : - (actPotC U A).coeffC s μ = - (∑ p ∈ Finset.antidiagonal s, conjC U p.2 (A.coeffC p.1 μ)) + mcCoeffCAt U μ s := by - apply cmat_injective - rw [ColourPot.cmat_coeffC, cmat_add, cmat_sum, cmat_mcCoeffCAt, actPotC_pot, coeffMat_actPot] - refine congrArg₂ _ (Finset.sum_congr rfl fun p _ => ?_) rfl - rw [cmat_conjC, ColourPot.cmat_coeffC] - -/-! - -## H. The all-orders jet-gauge substitution - -The image of the generator `∂_s A_μ` is the coefficient transcription of -`actPot U A μ = U A_μ ⋆U + mcH U μ` read in the colour basis, with the factorial normalization of -section F. - --/ - -/-- The colour vector of the generators at derivative index `s` and Lorentz direction `μ`. -/ -noncomputable def genVec (s : DIdx) (μ : Lor) : Col → JetAlgebra := - fun c => ofGen (JetGenerators.dA s μ c) - -@[simp] -lemma evalA_algebraMap (x : JetGenerators → ℝ) (r : ℝ) : - evalA x (algebraMap ℝ JetAlgebra r) = r := (evalA x).commutes r - -/-- **The all-orders gauge substitution on generators.** -/ -noncomputable def gaugeSubstGen (U : specialUnitaryGroup (Fin 3) JetRing) : - JetGenerators → JetAlgebra - | .dA s μ c => - (∑ p ∈ Finset.antidiagonal s, ∑ c', - algebraMap ℝ JetAlgebra - (facI s * (facI p.1)⁻¹ * coordC c (conjC U p.2 (colourBasis c'))) * - genVec p.1 μ c') + - constR (facI s • mcCoeffCAt U μ s) c - -/-- **The all-orders jet-gauge substitution**, as an algebra endomorphism. -/ -noncomputable def gaugePull (U : specialUnitaryGroup (Fin 3) JetRing) : - JetAlgebra →ₐ[ℝ] JetAlgebra := - (MvPolynomial.aeval (gaugeSubstGen U)).comp toPoly.toAlgHom - -@[simp] -lemma gaugePull_ofGen (U : specialUnitaryGroup (Fin 3) JetRing) (g : JetGenerators) : - gaugePull U (ofGen g) = gaugeSubstGen U g := by - show MvPolynomial.aeval (gaugeSubstGen U) (toPoly (ofGen g)) = _ - rw [toPoly_ofGen, aeval_X] - -lemma coordC_conjC_mkC (U : specialUnitaryGroup (Fin 3) JetRing) (t : DIdx) (f : Col → ℝ) - (c : Col) : - coordC c (conjC U t (mkC f)) = ∑ c', f c' * coordC c (conjC U t (colourBasis c')) := by - rw [mkC_eq_sum, map_sum, map_sum] - exact Finset.sum_congr rfl fun c' _ => by rw [map_smul, map_smul, smul_eq_mul] - -/-- **The transformed point of the ordinary coordinate space**: build the generic potential, act - by the honest affine power-series action, and read off the coordinates again. -/ -noncomputable def actPtA (U : specialUnitaryGroup (Fin 3) JetRing) - (x : JetGenerators → ℝ) : JetGenerators → ℝ := potPt (actPotC U (potOf x)) - -/-- **The substitution really is the coordinate form of the action.** This is the all-orders - analogue of `GaugeAction`'s `potCoord_actPot`. -/ -lemma evalA_gaugeSubstGen (U : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) - (g : JetGenerators) : evalA x (gaugeSubstGen U g) = actPtA U x g := by - cases g with - | dA s μ c => - have hR : actPtA U x (JetGenerators.dA s μ c) = - (∑ p ∈ Finset.antidiagonal s, facI s * ((facI p.1)⁻¹ * - ∑ c', x (JetGenerators.dA p.1 μ c') * - coordC c (conjC U p.2 (colourBasis c')))) + - facI s * coordC c (mcCoeffCAt U μ s) := by - show facI s * coordC c ((actPotC U (potOf x)).coeffC s μ) = _ - rw [coeffC_actPotC, map_add, map_sum, mul_add, Finset.mul_sum] - refine congrArg₂ _ (Finset.sum_congr rfl fun p _ => ?_) rfl - rw [coeffC_potOf, map_smul, map_smul, smul_eq_mul, cfgC, coordC_conjC_mkC] - rw [hR, gaugeSubstGen, map_add, map_sum] - refine congrArg₂ _ (Finset.sum_congr rfl fun p _ => ?_) ?_ - · rw [map_sum, Finset.mul_sum, Finset.mul_sum] - refine Finset.sum_congr rfl fun c' _ => ?_ - rw [map_mul, evalA_algebraMap, genVec, evalA_ofGen] - ring - · rw [constR, evalA_algebraMap, map_smul, smul_eq_mul] - -/-- **Faithfulness of the substitution.** -/ -lemma evalA_gaugePull (U : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) - (P : JetAlgebra) : evalA x (gaugePull U P) = evalA (actPtA U x) P := by - have h : (evalA x).comp (gaugePull U) = evalA (actPtA U x) := - jetAlgHom_ext fun g => by - rw [AlgHom.comp_apply, gaugePull_ofGen, evalA_gaugeSubstGen, evalA_ofGen] - exact DFunLike.congr_fun h P - -@[simp] -lemma potOf_actPtA (U : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) : - potOf (actPtA U x) = actPotC U (potOf x) := by - rw [actPtA, potOf_potPt] - -lemma actPtA_one (x : JetGenerators → ℝ) : - actPtA (1 : specialUnitaryGroup (Fin 3) JetRing) x = x := by - rw [actPtA, actPotC_one, potPt_potOf] - -/-- The transformed point is a **left** action, inherited from `actPot_mul`. -/ -lemma actPtA_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (x : JetGenerators → ℝ) : - actPtA (U * V) x = actPtA U (actPtA V x) := by - show potPt (actPotC (U * V) (potOf x)) = potPt (actPotC U (potOf (actPtA V x))) - rw [potOf_actPtA, actPotC_mul] - -/-- **The identity substitution.** -/ -lemma gaugePull_one : - gaugePull (1 : specialUnitaryGroup (Fin 3) JetRing) = AlgHom.id ℝ JetAlgebra := by - refine AlgHom.ext fun P => jetAlgebra_funext fun x => ?_ - rw [evalA_gaugePull, actPtA_one, AlgHom.id_apply] - -/-- **The composition law of the substitution.** The raw substitution is pullback along a left - action on points, so it composes *contravariantly*. This is the orientation forced by the - definitions; no covariant composition law holds for `gaugePull`. -/ -lemma gaugePull_mul (U V : specialUnitaryGroup (Fin 3) JetRing) : - gaugePull (U * V) = (gaugePull V).comp (gaugePull U) := by - refine AlgHom.ext fun P => jetAlgebra_funext fun x => ?_ - rw [AlgHom.comp_apply, evalA_gaugePull, evalA_gaugePull, evalA_gaugePull, actPtA_mul] - -/-! - -## I. Degree-zero and degree-one agreement with `GaugeAction` - --/ - -lemma sum_coordC_adC {R : Type*} [CommRing R] [Algebra ℝ R] - (u : specialUnitaryGroup (Fin 3) ℂ) (q : Col → R) (c : Col) : - (∑ c', algebraMap ℝ R (coordC c (adC u (colourBasis c'))) * q c') = adR u q c := - Finset.sum_congr rfl fun c' _ => by rw [adCoef] - -lemma sum_coordC_br_adC {R : Type*} [CommRing R] [Algebra ℝ R] (Y : ColourSpace) - (u : specialUnitaryGroup (Fin 3) ℂ) (q : Col → R) (c : Col) : - (∑ c', algebraMap ℝ R (coordC c (br Y (adC u (colourBasis c')))) * q c') = - brR (constR Y) (adR u q) c := by - rw [show (∑ c', algebraMap ℝ R (coordC c (br Y (adC u (colourBasis c')))) * q c') = - ∑ c', ∑ a, ∑ b, (algebraMap ℝ R (coordC a Y) * algebraMap ℝ R (adCoef u b c') * - algebraMap ℝ R (cstruct a b c)) * q c' from - Finset.sum_congr rfl fun c' _ => by - rw [coordC_br, map_sum, Finset.sum_mul] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [map_sum, Finset.sum_mul] - refine Finset.sum_congr rfl fun b _ => ?_ - rw [map_mul, map_mul, adCoef], Finset.sum_comm, brR] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun b _ => ?_ - rw [constR, adR, Finset.mul_sum, Finset.mul_sum] - exact Finset.sum_congr rfl fun c' _ => by ring - -/-- **Degree-zero agreement with `GaugeAction`.** On the connection generators the all-orders - substitution - is `GaugeAction`'s `gaugeSubst (Coord.conn μ c)`. -/ -lemma gaugeSubstGen_zero (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (c : Col) : - gaugeSubstGen U (JetGenerators.dA 0 μ c) = - adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ) c + constR (mcC U μ) c := by - rw [gaugeSubstGen, Finsupp.antidiagonal_zero, Finset.sum_singleton, mcCoeffCAt_zero, facI_zero, - one_smul] - refine congrArg₂ _ ?_ rfl - refine (Finset.sum_congr rfl fun c' _ => ?_).trans (sum_coordC_adC _ (genVec 0 μ) c) - simp only [inv_one, one_mul, conjC_zero] - -/-- A sum over the antidiagonal of a degree-one multi-index has exactly two terms. -/ -lemma sum_antidiagonal_single {M : Type*} [AddCommMonoid M] (ν : Lor) (f : DIdx × DIdx → M) : - ∑ p ∈ Finset.antidiagonal (Finsupp.single ν 1 : DIdx), f p = - f (0, Finsupp.single ν 1) + f (Finsupp.single ν 1, 0) := by - rw [Finsupp.antidiagonal_single, show Finset.antidiagonal (1 : ℕ) = {(0, 1), (1, 0)} by decide, - Finset.sum_map, Finset.sum_insert (by decide), Finset.sum_singleton] - simp only [Function.Embedding.coe_prodMap, Function.Embedding.coeFn_mk, Prod.map_apply, - Finsupp.single_zero] - -/-- The degree-one coefficient conjugation is minus the colour bracket with the first - Maurer–Cartan coefficient. -/ -lemma conjC_single (U : specialUnitaryGroup (Fin 3) JetRing) (ν : Lor) (X : ColourSpace) : - conjC U (Finsupp.single ν 1) X = - -br (mcC U ν) (adC (JetGaugeGroupI.evalSU (Fin 3) U) X) := by - apply cmat_injective - have hu : Gluon.jetValue U.1 = - ((JetGaugeGroupI.evalSU (Fin 3) U : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ) := jetValue_coe_eq U - show conjCoeffM U (Finsupp.single ν 1) (cmat X) = - -brMat (cmat (mcC U ν)) (cmat (adC (JetGaugeGroupI.evalSU (Fin 3) U) X)) - rw [conjCoeffM, ← jetDeriv_eq_coeffMat, Gluon.jetDeriv_mul, Gluon.jetDeriv_mul, constMat, - Gluon.jetDeriv_map_C, jetValue_map_C, Gluon.jetValue_mul, jetValue_map_C, - Gluon.jetValue_star, jetDeriv_coe, jetDeriv_star_coe, cmat_mcC, cmat_adC, brMat, hu, - star_eq_conjTranspose] - simp only [Matrix.smul_mul, Matrix.mul_smul, Matrix.mul_zero, add_zero, Matrix.mul_assoc] - module - -/-- **Degree-one agreement with `GaugeAction`.** On the first-derivative generators the all-orders - substitution is `GaugeAction`'s `gaugeSubst (Coord.der ν μ c)`: conjugation by the base-point - value, a - bracket with the first Maurer–Cartan coefficient, and a translation by the second. -/ -lemma gaugeSubstGen_single (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) (c : Col) : - gaugeSubstGen U (JetGenerators.dA (Finsupp.single ν 1) μ c) = - adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec (Finsupp.single ν 1) μ) c - - brR (constR (mcC U ν)) (adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ)) c + - constR (mc2C U ν μ) c := by - have e1 : (∑ c', algebraMap ℝ JetAlgebra - (coordC c (conjC U (Finsupp.single ν 1) (colourBasis c'))) * genVec 0 μ c') = - -brR (constR (mcC U ν)) (adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ)) c := by - calc (∑ c', algebraMap ℝ JetAlgebra - (coordC c (conjC U (Finsupp.single ν 1) (colourBasis c'))) * genVec 0 μ c') - = ∑ c', -(algebraMap ℝ JetAlgebra (coordC c (br (mcC U ν) - (adC (JetGaugeGroupI.evalSU (Fin 3) U) (colourBasis c')))) * genVec 0 μ c') := - Finset.sum_congr rfl fun c' _ => by rw [conjC_single, map_neg, map_neg, neg_mul] - _ = -∑ c', algebraMap ℝ JetAlgebra (coordC c (br (mcC U ν) - (adC (JetGaugeGroupI.evalSU (Fin 3) U) (colourBasis c')))) * genVec 0 μ c' := - Finset.sum_neg_distrib _ - _ = -brR (constR (mcC U ν)) (adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec 0 μ)) c := - congrArg Neg.neg (sum_coordC_br_adC _ _ _ _) - have e2 : (∑ c', algebraMap ℝ JetAlgebra (coordC c (conjC U 0 (colourBasis c'))) * - genVec (Finsupp.single ν 1) μ c') = - adR (JetGaugeGroupI.evalSU (Fin 3) U) (genVec (Finsupp.single ν 1) μ) c := - (Finset.sum_congr rfl fun c' _ => by rw [conjC_zero]).trans (sum_coordC_adC _ _ _) - rw [gaugeSubstGen, sum_antidiagonal_single ν (fun p : DIdx × DIdx => - ∑ c', algebraMap ℝ JetAlgebra - (facI (Finsupp.single ν 1) * (facI p.1)⁻¹ * - coordC c (conjC U p.2 (colourBasis c'))) * genVec p.1 μ c')] - simp only [facI_single, facI_zero, inv_one, one_mul, one_smul, mcCoeffCAt_single] - rw [e1, e2] - ring - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean deleted file mode 100644 index 4e482d50d..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/SeriesGaugeAction.lean +++ /dev/null @@ -1,385 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.HookBianchi -/-! -# The full-series gauge action and Maurer--Cartan coefficients - -## i. Overview - -This file proves the group-action laws for `GaugeAction`'s power-series-valued `actPot`, the -full-series Maurer--Cartan cocycle, and an arbitrary-coefficient API in the physical traceless -hermitian colour carrier. It does not construct an all-orders polynomial carrier. - -The multiplication convention is the left action - -```text -actPot (U * V) A = actPot U (actPot V A), -``` - -and the corresponding hermitian Maurer--Cartan cocycle is - -```text -mcH (U * V) μ = mcH U μ + U * mcH V μ * star U. -``` --/ - -@[expose] public section - -namespace StandardModel - -open Matrix Module MvPowerSeries - -namespace SU3Jet - -/-! - -## A. Full-series Maurer--Cartan and action laws - --/ - -/-- The Lie-algebra Maurer--Cartan series vanishes on the identity gauge jet. -/ -lemma mcP_one (μ : Lor) : mcP (1 : specialUnitaryGroup (Fin 3) JetRing) μ = 0 := by - rw [mcP] - change dMat μ (1 : Matrix (Fin 3) (Fin 3) JetRing) * star - (1 : Matrix (Fin 3) (Fin 3) JetRing) = 0 - rw [dMat_one, Matrix.zero_mul] - -/-- The hermitian Maurer--Cartan series vanishes on the identity gauge jet. -/ -lemma mcH_one (μ : Lor) : mcH (1 : specialUnitaryGroup (Fin 3) JetRing) μ = 0 := by - rw [mcH, mcP_one, smul_zero] - -/-- The full-series Lie-algebra Maurer--Cartan cocycle. -/ -lemma mcP_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : - mcP (U * V) μ = mcP U μ + U.1 * mcP V μ * star U.1 := by - rw [mcP, mcP, mcP] - change dMat μ (U.1 * V.1) * star (U.1 * V.1) = _ - rw [dMat_mul, star_mul, Matrix.add_mul] - have hV : V.1 * star V.1 = 1 := Gluon.coe_mul_star_self V - calc - dMat μ U.1 * V.1 * (star V.1 * star U.1) + - U.1 * dMat μ V.1 * (star V.1 * star U.1) = - dMat μ U.1 * (V.1 * star V.1) * star U.1 + - U.1 * (dMat μ V.1 * star V.1) * star U.1 := by - noncomm_ring - _ = dMat μ U.1 * star U.1 + U.1 * (dMat μ V.1 * star V.1) * star U.1 := by - rw [hV, Matrix.mul_one] - -/-- The full-series hermitian Maurer--Cartan cocycle, with the orientation forced by `actPot`. -/ -lemma mcH_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : - mcH (U * V) μ = mcH U μ + U.1 * mcH V μ * star U.1 := by - rw [mcH, mcH, mcH, mcP_mul, smul_add] - simp only [Matrix.smul_mul, Matrix.mul_smul] - -/-- The identity gauge jet acts trivially on a full power-series potential. -/ -lemma actPot_one (A : Potential) : actPot (1 : specialUnitaryGroup (Fin 3) JetRing) A = A := by - funext μ - rw [actPot, mcH_one] - change (1 : Matrix (Fin 3) (Fin 3) JetRing) * A μ * star - (1 : Matrix (Fin 3) (Fin 3) JetRing) + 0 = A μ - simp - -/-- The full power-series potential transformation is a left group action. -/ -lemma actPot_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (A : Potential) : - actPot (U * V) A = actPot U (actPot V A) := by - funext μ - rw [actPot, actPot, actPot, mcH_mul] - change (U.1 * V.1) * A μ * star (U.1 * V.1) + - (mcH U μ + U.1 * mcH V μ * star U.1) = - U.1 * (V.1 * A μ * star V.1 + mcH V μ) * star U.1 + mcH U μ - rw [star_mul] - noncomm_ring - -/-! - -## B. Arbitrary traceless-hermitian coefficients - --/ - -/-- The hermitian Maurer--Cartan series is self-adjoint. -/ -lemma star_mcH (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : - star (mcH U μ) = mcH U μ := by - have hp := star_mcP U μ - apply Matrix.ext - intro i j - have hpij := congrFun (congrFun hp i) j - change star ((MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) j i) = - (MvPowerSeries.C Complex.I : JetRing) * (mcP U μ) i j - rw [star_mul', JetRing.star_C, Complex.star_def, Complex.conj_I, - show star ((mcP U μ) j i) = -(mcP U μ) i j from hpij] - simp - -/-- The hermitian Maurer--Cartan series is traceless. -/ -lemma trace_mcH (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : trace (mcH U μ) = 0 := by - rw [mcH, trace_smul, trace_mcP, smul_zero] - -/-- The matrix coefficient of the hermitian Maurer--Cartan series at an arbitrary Lorentz -multi-index. -/ -noncomputable def mcCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) - (k : Lor →₀ ℕ) : Matrix (Fin 3) (Fin 3) ℂ := coeffMat k (mcH U μ) - -lemma trace_coeffMat (k : Lor →₀ ℕ) (M : Matrix (Fin 3) (Fin 3) JetRing) : - trace (coeffMat k M) = MvPowerSeries.coeff k (trace M) := by - rw [Matrix.trace, Matrix.trace, map_sum] - exact Finset.sum_congr rfl fun i _ ↦ rfl - -/-- Every arbitrary coefficient of `mcH` is hermitian. -/ -lemma star_mcCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : - star (mcCoeffM U μ k) = mcCoeffM U μ k := by - have hs := star_mcH U μ - ext i j - have hsij := congrFun (congrFun hs i) j - change star (MvPowerSeries.coeff k ((mcH U μ) j i)) = - MvPowerSeries.coeff k ((mcH U μ) i j) - rw [← JetRing.coeff_star] - exact congrArg (MvPowerSeries.coeff k) hsij - -/-- Every arbitrary coefficient of `mcH` is traceless. -/ -lemma trace_mcCoeffM (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : - trace (mcCoeffM U μ k) = 0 := by - rw [mcCoeffM, trace_coeffMat, trace_mcH, map_zero] - -/-- The arbitrary coefficient of `mcH`, packaged in the physical traceless-hermitian colour -carrier. -/ -noncomputable def mcCoeffCAt (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) - (k : Lor →₀ ℕ) : ColourSpace := - mkCM (mcCoeffM U μ k) (star_mcCoeffM U μ k) (trace_mcCoeffM U μ k) - -@[simp] -lemma cmat_mcCoeffCAt (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : - cmat (mcCoeffCAt U μ k) = mcCoeffM U μ k := rfl - -/-! - -## C. Coefficient consequences of the cocycle - --/ - -/-- Coefficient extraction from the series Maurer--Cartan cocycle. The conjugated term remains -at series level, avoiding an unnecessary general three-fold convolution formula. -/ -lemma mcCoeffM_mul (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : - mcCoeffM (U * V) μ k = mcCoeffM U μ k + - coeffMat k (U.1 * mcH V μ * star U.1) := by - rw [mcCoeffM, mcCoeffM, mcH_mul] - ext i j - simp [coeffMat, Matrix.add_apply] - -/-- Every arbitrary Maurer--Cartan coefficient of a constant gauge jet vanishes. -/ -lemma mcCoeffM_ofConstantSU (v : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) (k : Lor →₀ ℕ) : - mcCoeffM (JetGaugeGroupI.ofConstantSU (Fin 3) v) μ k = 0 := by - rw [mcCoeffM, mcH, mcP_ofConstantSU, smul_zero] - ext i j - simp [coeffMat] - -/-- Constant gauge jets have zero arbitrary colour coefficient. -/ -lemma mcCoeffCAt_ofConstantSU (v : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) (k : Lor →₀ ℕ) : - mcCoeffCAt (JetGaugeGroupI.ofConstantSU (Fin 3) v) μ k = 0 := by - apply cmat_injective - rw [cmat_mcCoeffCAt, mcCoeffM_ofConstantSU, cmat_zero] - -/-- The full hermitian Maurer--Cartan series of a constant gauge jet vanishes. -/ -lemma mcH_ofConstantSU (v : specialUnitaryGroup (Fin 3) ℂ) (μ : Lor) : - mcH (JetGaugeGroupI.ofConstantSU (Fin 3) v) μ = 0 := by - rw [mcH, mcP_ofConstantSU, smul_zero] - -/-- Conjugation of an arbitrary gauge jet by a constant colour rotation, at series level. -/ -lemma mcH_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) - (V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : - mcH (conjBy v V) μ = - (v : Matrix (Fin 3) (Fin 3) ℂ).map (MvPowerSeries.C : ℂ →+* JetRing) * mcH V μ * - ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ.map (MvPowerSeries.C : ℂ →+* JetRing) := by - have hinv : (JetGaugeGroupI.ofConstantSU (Fin 3) v)⁻¹ = - JetGaugeGroupI.ofConstantSU (Fin 3) v⁻¹ := (map_inv _ v).symm - rw [conjBy, hinv, mcH_mul, mcH_mul, mcH_ofConstantSU, mcH_ofConstantSU] - simp only [Matrix.mul_zero, Matrix.zero_mul, add_zero, zero_add, ofConstantSU_coe] - congr 1 - ext i j - simp [Matrix.star_apply, JetRing.star_C] - -/-- Arbitrary coefficients commute with multiplication on both sides by constant matrices. -/ -lemma coeffMat_conj_const (P R : Matrix (Fin 3) (Fin 3) ℂ) - (M : Matrix (Fin 3) (Fin 3) JetRing) (k : Lor →₀ ℕ) : - coeffMat k (P.map (MvPowerSeries.C : ℂ →+* JetRing) * M * - R.map (MvPowerSeries.C : ℂ →+* JetRing)) = P * coeffMat k M * R := by - ext i j - simp only [coeffMat, Matrix.mul_apply, map_sum, MvPowerSeries.coeff_mul_C, - MvPowerSeries.coeff_C_mul, Matrix.map_apply] - -/-- Conjugation by a constant `SU(3)` element conjugates every arbitrary matrix coefficient. -/ -lemma mcCoeffM_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) - (V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : - mcCoeffM (conjBy v V) μ k = - (v : Matrix (Fin 3) (Fin 3) ℂ) * mcCoeffM V μ k * - ((v : Matrix (Fin 3) (Fin 3) ℂ))ᴴ := by - rw [mcCoeffM, mcH_conjBy, coeffMat_conj_const] - rfl - -/-- Conjugation by a constant `SU(3)` element acts on every arbitrary colour coefficient by -`adC`. -/ -lemma mcCoeffCAt_conjBy (v : specialUnitaryGroup (Fin 3) ℂ) - (V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) (k : Lor →₀ ℕ) : - mcCoeffCAt (conjBy v V) μ k = adC v (mcCoeffCAt V μ k) := by - apply cmat_injective - rw [cmat_mcCoeffCAt, cmat_adC, cmat_mcCoeffCAt, mcCoeffM_conjBy] - -/-! - -## D. Leading coefficients under lower-coefficient vanishing - --/ - -/-- All coefficients strictly below `k` in the componentwise multi-index order vanish. -/ -def LowerCoeffZero (M : Matrix (Fin 3) (Fin 3) JetRing) (k : Lor →₀ ℕ) : Prop := - ∀ q, q ≤ k → q ≠ k → coeffMat q M = 0 - -private lemma finsupp_left_le_of_add_eq {p q k : Lor →₀ ℕ} (h : p + q = k) : p ≤ k := by - intro i - have hi := DFunLike.congr_fun h i - rw [Finsupp.add_apply] at hi - omega - -private lemma finsupp_right_le_of_add_eq {p q k : Lor →₀ ℕ} (h : p + q = k) : q ≤ k := by - intro i - have hi := DFunLike.congr_fun h i - rw [Finsupp.add_apply] at hi - omega - -private lemma coeff_mul_of_right_lower_zero (f g : JetRing) (k : Lor →₀ ℕ) - (hg : ∀ q, q ≤ k → q ≠ k → MvPowerSeries.coeff q g = 0) : - MvPowerSeries.coeff k (f * g) = - MvPowerSeries.constantCoeff f * MvPowerSeries.coeff k g := by - classical - rw [MvPowerSeries.coeff_mul, Finset.sum_eq_single (0, k), - MvPowerSeries.coeff_zero_eq_constantCoeff] - · rintro ⟨p, q⟩ hp hpair - have hpq : p + q = k := Finset.mem_antidiagonal.mp hp - by_cases hq : q = k - · subst q - have hp0 : p = 0 := by - ext i - have hi : p i + k i = k i := by - simpa only [Finsupp.add_apply] using DFunLike.congr_fun hpq i - change p i = 0 - omega - exact (hpair (Prod.ext hp0 rfl)).elim - · rw [hg q (finsupp_right_le_of_add_eq hpq) hq, mul_zero] - · simp - -private lemma coeff_mul_of_left_lower_zero (f g : JetRing) (k : Lor →₀ ℕ) - (hf : ∀ p, p ≤ k → p ≠ k → MvPowerSeries.coeff p f = 0) : - MvPowerSeries.coeff k (f * g) = - MvPowerSeries.coeff k f * MvPowerSeries.constantCoeff g := by - classical - rw [MvPowerSeries.coeff_mul, Finset.sum_eq_single (k, 0), - MvPowerSeries.coeff_zero_eq_constantCoeff] - · rintro ⟨p, q⟩ hp hpair - have hpq : p + q = k := Finset.mem_antidiagonal.mp hp - by_cases hp' : p = k - · subst p - have hq0 : q = 0 := by - ext i - have hi : k i + q i = k i := by - simpa only [Finsupp.add_apply] using DFunLike.congr_fun hpq i - change q i = 0 - omega - exact (hpair (Prod.ext rfl hq0)).elim - · rw [hf p (finsupp_left_le_of_add_eq hpq) hp', zero_mul] - · simp - -private lemma coeffMat_mul_of_right_lower_zero (P M : Matrix (Fin 3) (Fin 3) JetRing) - (k : Lor →₀ ℕ) (hM : LowerCoeffZero M k) : - coeffMat k (P * M) = Gluon.jetValue P * coeffMat k M := by - apply Matrix.ext - intro i j - simp only [coeffMat, Matrix.map_apply, Matrix.mul_apply, Gluon.jetValue] - rw [map_sum] - refine Finset.sum_congr rfl fun a _ ↦ ?_ - apply coeff_mul_of_right_lower_zero - intro q hq hqk - have hMq := hM q hq hqk - exact congrFun (congrFun hMq a) j - -private lemma coeffMat_mul_of_left_lower_zero (M R : Matrix (Fin 3) (Fin 3) JetRing) - (k : Lor →₀ ℕ) (hM : LowerCoeffZero M k) : - coeffMat k (M * R) = coeffMat k M * Gluon.jetValue R := by - apply Matrix.ext - intro i j - simp only [coeffMat, Matrix.map_apply, Matrix.mul_apply, Gluon.jetValue] - rw [map_sum] - refine Finset.sum_congr rfl fun a _ ↦ ?_ - apply coeff_mul_of_left_lower_zero - intro q hq hqk - have hMq := hM q hq hqk - exact congrFun (congrFun hMq i) a - -private lemma lowerCoeffZero_mul_left (P M : Matrix (Fin 3) (Fin 3) JetRing) - (k : Lor →₀ ℕ) (hM : LowerCoeffZero M k) : LowerCoeffZero (P * M) k := by - intro q hq hqk - have hMq : LowerCoeffZero M q := by - intro r hr hrq - apply hM r (hr.trans hq) - intro hrk - subst r - exact hqk (le_antisymm hq hr) - rw [coeffMat_mul_of_right_lower_zero P M q hMq, hM q hq hqk, Matrix.mul_zero] - -/-- **Leading coefficient of a conjugated series.** If all coefficients of the middle series -strictly below `k` vanish, then the `k`-coefficient of `P M R` only sees the constant coefficients -of the two outer series. -/ -lemma coeffMat_conj_leading (P M R : Matrix (Fin 3) (Fin 3) JetRing) (k : Lor →₀ ℕ) - (hM : LowerCoeffZero M k) : - coeffMat k (P * M * R) = Gluon.jetValue P * coeffMat k M * Gluon.jetValue R := by - rw [coeffMat_mul_of_left_lower_zero (P * M) R k (lowerCoeffZero_mul_left P M k hM), - coeffMat_mul_of_right_lower_zero P M k hM] - -/-- **Leading-order coefficient form of the Maurer--Cartan cocycle.** Under explicit vanishing of -all lower coefficients of `mcH V μ`, the conjugated contribution at `k` is conjugation of the -`k`-coefficient by the base-point value of `U`. -/ -lemma mcCoeffM_mul_leading (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) - (k : Lor →₀ ℕ) (hV : LowerCoeffZero (mcH V μ) k) : - mcCoeffM (U * V) μ k = mcCoeffM U μ k + - Gluon.jetValue U.1 * mcCoeffM V μ k * star (Gluon.jetValue U.1) := by - rw [mcCoeffM_mul, coeffMat_conj_leading U.1 (mcH V μ) (star U.1) k hV, - Gluon.jetValue_star] - rfl - -/-- The leading-order cocycle in the physical colour carrier: the second summand is acted on only -by the constant `SU(3)` value of the first jet. -/ -lemma mcCoeffCAt_mul_leading (U V : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) - (k : Lor →₀ ℕ) (hV : LowerCoeffZero (mcH V μ) k) : - mcCoeffCAt (U * V) μ k = mcCoeffCAt U μ k + - adC (JetGaugeGroupI.evalSU (Fin 3) U) (mcCoeffCAt V μ k) := by - apply cmat_injective - rw [cmat_mcCoeffCAt, cmat_add, cmat_mcCoeffCAt, cmat_adC, cmat_mcCoeffCAt, - mcCoeffM_mul_leading U V μ k hV, jetValue_coe_eq, star_eq_conjTranspose] - -/-! - -## E. Compatibility with the degree-one and degree-two coefficients - --/ - -/-- The zero multi-index coefficient of `mcH` is `GaugeAction`'s first Maurer--Cartan colour - coefficient. -/ -lemma mcCoeffCAt_zero (U : specialUnitaryGroup (Fin 3) JetRing) (μ : Lor) : - mcCoeffCAt U μ 0 = mcC U μ := by - apply cmat_injective - rw [cmat_mcCoeffCAt, cmat_mcC, mcCoeffM, ← jetValue_mcH] - ext i j - simp [coeffMat, Gluon.jetValue] - -/-- A degree-one coefficient of `mcH` is `GaugeAction`'s second Maurer--Cartan colour coefficient. - -/ -lemma mcCoeffCAt_single (U : specialUnitaryGroup (Fin 3) JetRing) (ν μ : Lor) : - mcCoeffCAt U μ (Finsupp.single ν 1) = mc2C U ν μ := by - apply cmat_injective - rw [cmat_mcCoeffCAt, cmat_mc2C, mcCoeffM, ← jetDeriv_mcH] - exact (jetDeriv_eq_coeffMat ν (mcH U μ)).symm - -end SU3Jet - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean b/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean deleted file mode 100644 index 83c99f206..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/Gluons/JetCompleteness/Triangular.lean +++ /dev/null @@ -1,816 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.GaugeBosons.Gluons.JetCompleteness.HighestLayer - -/-! -# Arbitrary-order triangular gluon coordinates - -This file constructs an independent hook complement to `HighestLayer`'s fully symmetric translation -directions on `OrdinaryJets`'s unchanged ordinary carrier. For a nonzero total multi-index `w`, the -distinguished supported direction is `layerDir w`; the other supported directions index the hook -differences. The weighted symmetric average and those differences have an explicit inverse. - -The second half replaces every linear hook difference by the corresponding symmetrized covariant -curvature derivative from `CovariantTower` and proves that this nonlinear substitution is -unitriangular in the -additive ordinary-derivative-degree filtration. --/ - -open scoped BigOperators -open Finsupp MvPolynomial SymmetricAlgebra - -@[expose] public section - -namespace StandardModel -namespace SU3Jet - -/-! -## A. An independent arbitrary-order hook index --/ - -/-- Remove one occurrence of a supported direction from a derivative multi-index. -/ -noncomputable def predAt (w : DIdx) (mu : Lor) : DIdx := - Finsupp.update w mu (w mu - 1) - -lemma predAt_add_single {w : DIdx} {mu : Lor} (hmu : w mu ≠ 0) : - predAt w mu + Finsupp.single mu 1 = w := by - ext nu - by_cases h : nu = mu - · subst nu - simpa [predAt, Finsupp.update] using - Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr hmu) - · simp [predAt, h] - -lemma lorDeg_predAt {w : DIdx} {mu : Lor} (hmu : w mu ≠ 0) : - lorDeg (predAt w mu) + 1 = lorDeg w := by - have h := congrArg lorDeg (predAt_add_single hmu) - rwa [lorDeg_add, lorDeg_single] at h - -/-- A nonzero fully symmetric total index. -/ -abbrev SymIdx := {w : DIdx // w ≠ 0} - -/-- The independent hook coordinates over `w`: one for each supported direction other than the -distinguished direction. There are no quotient relations or redundant Bianchi coordinates. -/ -structure AllHookIdx where - w : DIdx - mu : Lor - w_ne_zero : w ≠ 0 - mu_supported : w mu ≠ 0 - mu_ne_dir : mu ≠ layerDir w - -/-- The ordinary component with total index `w` and connection direction `mu`. -/ -noncomputable def totalComponent (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := - ofGen (.dA (predAt w mu) mu c) - -/-- The fully symmetric projection of the connection derivative with total index `w`. -/ -noncomputable def symConn (w : DIdx) (c : Col) : JetAlgebra := - (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, (w mu : ℝ) • totalComponent w mu c - -/-- The independent linear hook difference relative to `layerDir w`. -/ -noncomputable def hookDiff (i : AllHookIdx) (c : Col) : JetAlgebra := - totalComponent i.w i.mu c - totalComponent i.w (layerDir i.w) c - -/-- The weighted hook correction appearing in the inverse coordinate formula. -/ -noncomputable def hookAverage (w : DIdx) (c : Col) : JetAlgebra := - (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, - (w mu : ℝ) • (totalComponent w mu c - totalComponent w (layerDir w) c) - -lemma symConn_eq_distinguished_add_hookAverage {w : DIdx} (hw : w ≠ 0) (c : Col) : - symConn w c = totalComponent w (layerDir w) c + hookAverage w c := by - rw [symConn, hookAverage] - have hdeg : (lorDeg w : ℝ) ≠ 0 := by - exact_mod_cast (Nat.ne_of_gt ((lorDeg_pos_iff w).2 hw)) - have hsum : ∑ mu : Lor, (w mu : ℝ) = lorDeg w := by - norm_cast - simp_rw [smul_sub] - rw [Finset.sum_sub_distrib, ← Finset.sum_smul, hsum, smul_sub, - inv_smul_smul₀ hdeg] - module - -lemma distinguished_eq_symConn_sub_hookAverage {w : DIdx} (hw : w ≠ 0) (c : Col) : - totalComponent w (layerDir w) c = symConn w c - hookAverage w c := by - rw [symConn_eq_distinguished_add_hookAverage hw] - abel - -lemma totalComponent_eq_symConn_add_hook_sub {w : DIdx} (hw : w ≠ 0) - {mu : Lor} (_hmu : w mu ≠ 0) (c : Col) : - totalComponent w mu c = symConn w c + - (totalComponent w mu c - totalComponent w (layerDir w) c) - hookAverage w c := by - rw [symConn_eq_distinguished_add_hookAverage hw] - abel - -/-! -## B. The additive ordinary-derivative-degree filtration - -The weight of a product is the sum of the derivative multi-index degrees of its ordinary -generators. Connection factors therefore have weight zero. A total derivative raises the -weight by one, while multiplication by a connection does not; this is the filtration in which -covariant derivatives are triangular. --/ - -/-- Ordinary derivative degree of a generator. -/ -noncomputable def genDeg : JetGenerators → ℕ - | .dA s _ _ => lorDeg s - -@[simp] -lemma genDeg_dA (s : DIdx) (mu : Lor) (c : Col) : genDeg (.dA s mu c) = lorDeg s := rfl - -lemma genDeg_shift (nu : Lor) (g : JetGenerators) : - genDeg (JetGenerators.shift nu g) = genDeg g + 1 := by - cases g with - | dA s mu c => simp [genDeg, lorDeg_add, lorDeg_single] - -/-- Monomial generators of derivative degree at most `d`. -/ -def filtGen (d : ℕ) : Set JetAlgebra := - {P | ∃ l : List JetGenerators, - (l.map genDeg).sum ≤ d ∧ P = (l.map ofGen).prod} - -/-- Monomial generators of derivative degree strictly below `d`. -/ -def sfiltGen (d : ℕ) : Set JetAlgebra := - {P | ∃ l : List JetGenerators, - (l.map genDeg).sum < d ∧ P = (l.map ofGen).prod} - -/-- The additive derivative-degree filtration. -/ -noncomputable def filt (d : ℕ) : Submodule ℝ JetAlgebra := Submodule.span ℝ (filtGen d) - -/-- The strict additive derivative-degree filtration. -/ -noncomputable def sfilt (d : ℕ) : Submodule ℝ JetAlgebra := Submodule.span ℝ (sfiltGen d) - -lemma filt_mono {d e : ℕ} (h : d ≤ e) : filt d ≤ filt e := - Submodule.span_mono fun P hP => by - obtain ⟨l, hl, rfl⟩ := hP - exact ⟨l, hl.trans h, rfl⟩ - -lemma sfilt_mono {d e : ℕ} (h : d ≤ e) : sfilt d ≤ sfilt e := - Submodule.span_mono fun P hP => by - obtain ⟨l, hl, rfl⟩ := hP - exact ⟨l, hl.trans_le h, rfl⟩ - -lemma sfilt_le_filt (d : ℕ) : sfilt d ≤ filt d := - Submodule.span_mono fun P hP => by - obtain ⟨l, hl, rfl⟩ := hP - exact ⟨l, hl.le, rfl⟩ - -lemma sfilt_zero : sfilt 0 = ⊥ := by - rw [sfilt, show sfiltGen 0 = ∅ from Set.eq_empty_iff_forall_notMem.mpr (by - rintro P ⟨l, hl, rfl⟩ - omega), Submodule.span_empty] - -lemma sfilt_succ (d : ℕ) : sfilt (d + 1) = filt d := by - rw [sfilt, filt, show sfiltGen (d + 1) = filtGen d from Set.ext fun P => - ⟨fun ⟨l, hl, hP⟩ => ⟨l, Nat.lt_succ_iff.mp hl, hP⟩, - fun ⟨l, hl, hP⟩ => ⟨l, Nat.lt_succ_iff.mpr hl, hP⟩⟩] - -lemma one_mem_filt_zero : (1 : JetAlgebra) ∈ filt 0 := by - exact Submodule.subset_span ⟨[], by simp, by simp⟩ - -lemma ofGen_mem_filt (g : JetGenerators) : ofGen g ∈ filt (genDeg g) := by - exact Submodule.subset_span ⟨[g], by simp, by simp⟩ - -lemma mul_mem_filt {a b : ℕ} {P Q : JetAlgebra} (hP : P ∈ filt a) - (hQ : Q ∈ filt b) : P * Q ∈ filt (a + b) := by - induction hP using Submodule.span_induction with - | mem P hP => - induction hQ using Submodule.span_induction with - | mem Q hQ => - obtain ⟨l, hl, rfl⟩ := hP - obtain ⟨k, hk, rfl⟩ := hQ - refine Submodule.subset_span ⟨l ++ k, ?_, ?_⟩ - · simp only [List.map_append, List.sum_append] - omega - · simp [List.map_append, List.prod_append] - | zero => simp - | add x y _ _ hx hy => simpa [mul_add] using add_mem hx hy - | smul r x _ hx => simpa [mul_smul_comm] using Submodule.smul_mem (filt (a + b)) r hx - | zero => simp - | add x y _ _ hx hy => simpa [add_mul] using add_mem hx hy - | smul r x _ hx => simpa [smul_mul_assoc] using Submodule.smul_mem (filt (a + b)) r hx - -lemma mul_mem_sfilt_left {a b : ℕ} {P Q : JetAlgebra} (hP : P ∈ sfilt a) - (hQ : Q ∈ filt b) : P * Q ∈ sfilt (a + b) := by - induction hP using Submodule.span_induction with - | mem P hP => - induction hQ using Submodule.span_induction with - | mem Q hQ => - obtain ⟨l, hl, rfl⟩ := hP - obtain ⟨k, hk, rfl⟩ := hQ - refine Submodule.subset_span ⟨l ++ k, ?_, ?_⟩ - · simp only [List.map_append, List.sum_append] - omega - · simp [List.map_append, List.prod_append] - | zero => simp - | add x y _ _ hx hy => simpa [mul_add] using add_mem hx hy - | smul r x _ hx => simpa [mul_smul_comm] using Submodule.smul_mem (sfilt (a + b)) r hx - | zero => simp - | add x y _ _ hx hy => simpa [add_mul] using add_mem hx hy - | smul r x _ hx => simpa [smul_mul_assoc] using Submodule.smul_mem (sfilt (a + b)) r hx - -lemma mul_mem_sfilt_right {a b : ℕ} {P Q : JetAlgebra} (hP : P ∈ filt a) - (hQ : Q ∈ sfilt b) : P * Q ∈ sfilt (a + b) := by - rw [mul_comm] - simpa [add_comm] using mul_mem_sfilt_left hQ hP - -private lemma jetDeriv_prod_mem_filt (nu : Lor) (l : List JetGenerators) : - jetDeriv nu (l.map ofGen).prod ∈ filt ((l.map genDeg).sum + 1) := by - induction l with - | nil => - simp only [List.map_nil, List.prod_nil, List.sum_nil, jetDeriv_one] - exact zero_mem _ - | cons g l ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - rw [jetDeriv_mul, jetDeriv_ofGen] - refine add_mem ?_ ?_ - · have hg := ofGen_mem_filt (JetGenerators.shift nu g) - rw [genDeg_shift] at hg - have hl : (l.map ofGen).prod ∈ filt (l.map genDeg).sum := - Submodule.subset_span ⟨l, le_rfl, rfl⟩ - exact filt_mono (by omega) (mul_mem_filt hg hl) - · exact filt_mono (by omega) (mul_mem_filt (ofGen_mem_filt g) ih) - -lemma jetDeriv_mem_filt (nu : Lor) {d : ℕ} {P : JetAlgebra} (hP : P ∈ filt d) : - jetDeriv nu P ∈ filt (d + 1) := by - induction hP using Submodule.span_induction with - | mem P hP => - obtain ⟨l, hl, rfl⟩ := hP - exact filt_mono (by omega) (jetDeriv_prod_mem_filt nu l) - | zero => simp - | add x y _ _ hx hy => simpa using add_mem hx hy - | smul r x _ hx => simpa using Submodule.smul_mem (filt (d + 1)) r hx - -lemma jetDeriv_mem_sfilt (nu : Lor) {d : ℕ} {P : JetAlgebra} (hP : P ∈ sfilt d) : - jetDeriv nu P ∈ sfilt (d + 1) := by - induction hP using Submodule.span_induction with - | mem P hP => - obtain ⟨l, hl, rfl⟩ := hP - have h := jetDeriv_prod_mem_filt nu l - rw [← sfilt_succ] at h - exact sfilt_mono (by omega) h - | zero => simp - | add x y _ _ hx hy => simpa using add_mem hx hy - | smul r x _ hx => simpa using Submodule.smul_mem (sfilt (d + 1)) r hx - -lemma algebraMap_mem_filt_zero (r : ℝ) : algebraMap ℝ JetAlgebra r ∈ filt 0 := by - rw [Algebra.algebraMap_eq_smul_one] - exact Submodule.smul_mem _ _ one_mem_filt_zero - -lemma brR_mem_filt {a b : ℕ} {p q : Col → JetAlgebra} - (hp : ∀ c, p c ∈ filt a) (hq : ∀ c, q c ∈ filt b) (c : Col) : - brR p q c ∈ filt (a + b) := by - rw [brR] - refine Submodule.sum_mem _ fun i _ => Submodule.sum_mem _ fun j _ => ?_ - have hpq := mul_mem_filt (hp i) (hq j) - have hs := mul_mem_filt (algebraMap_mem_filt_zero (cstruct i j c)) hpq - simpa using hs - -lemma connVec_mem_filt_zero (mu : Lor) (c : Col) : connVec mu c ∈ filt 0 := by - exact ofGen_mem_filt (.dA 0 mu c) - -/-- The linear leading part of the field strength. -/ -noncomputable def linCurv (nu mu : Lor) : Col → JetAlgebra := - fun c => jetDeriv nu (connVec mu c) - jetDeriv mu (connVec nu c) - -lemma linCurv_mem_filt_one (nu mu : Lor) (c : Col) : linCurv nu mu c ∈ filt 1 := by - rw [linCurv] - exact sub_mem (by simpa using jetDeriv_mem_filt nu (connVec_mem_filt_zero mu c)) - (by simpa using jetDeriv_mem_filt mu (connVec_mem_filt_zero nu c)) - -lemma curvVec_mem_filt_one (nu mu : Lor) (c : Col) : curvVec nu mu c ∈ filt 1 := by - rw [curvVec] - refine add_mem (linCurv_mem_filt_one nu mu c) ?_ - exact filt_mono (by omega) (brR_mem_filt (connVec_mem_filt_zero nu) - (connVec_mem_filt_zero mu) c) - -lemma curvVec_sub_linCurv_mem_sfilt_one (nu mu : Lor) (c : Col) : - curvVec nu mu c - linCurv nu mu c ∈ sfilt 1 := by - rw [curvVec, linCurv] - have h := brR_mem_filt (connVec_mem_filt_zero nu) (connVec_mem_filt_zero mu) c - rw [← sfilt_succ] at h - simpa using h - -lemma covD_mem_filt (rho : Lor) {d : ℕ} {X : Col → JetAlgebra} - (hX : ∀ c, X c ∈ filt d) (c : Col) : covD rho X c ∈ filt (d + 1) := by - rw [covD] - refine add_mem (jetDeriv_mem_filt rho (hX c)) ?_ - exact filt_mono (by omega) (brR_mem_filt (connVec_mem_filt_zero rho) hX c) - -lemma covIter_mem_filt (n : ℕ) (t : Fin n → Lor) (nu mu : Lor) (c : Col) : - covIter n t (curvVec nu mu) c ∈ filt (n + 1) := by - induction n generalizing c with - | zero => simpa using curvVec_mem_filt_one nu mu c - | succ n ih => - rw [covIter_succ] - exact covD_mem_filt (t 0) (fun c' => ih (t := fun i => t i.succ) (c := c')) c - -/-- Ordered ordinary derivatives, used only to identify the leading term of the covariant tower. -/ -noncomputable def plainIter : (n : ℕ) → (Fin n → Lor) → - (Col → JetAlgebra) → (Col → JetAlgebra) - | 0, _, X => X - | n + 1, t, X => fun c => jetDeriv (t 0) (plainIter n (fun i => t i.succ) X c) - -@[simp] -lemma plainIter_zero (t : Fin 0 → Lor) (X : Col → JetAlgebra) : plainIter 0 t X = X := rfl - -@[simp] -lemma plainIter_succ (n : ℕ) (t : Fin (n + 1) → Lor) (X : Col → JetAlgebra) (c : Col) : - plainIter (n + 1) t X c = jetDeriv (t 0) (plainIter n (fun i => t i.succ) X c) := rfl - -lemma covIter_sub_plainIter_mem_sfilt (n : ℕ) (t : Fin n → Lor) (nu mu : Lor) (c : Col) : - covIter n t (curvVec nu mu) c - plainIter n t (linCurv nu mu) c ∈ sfilt (n + 1) := by - induction n generalizing c with - | zero => simpa using curvVec_sub_linCurv_mem_sfilt_one nu mu c - | succ n ih => - rw [covIter_succ, plainIter_succ, covD] - have hder := jetDeriv_mem_sfilt (t 0) - (ih (t := fun i => t i.succ) (c := c)) - rw [map_sub] at hder - have hbr0 := brR_mem_filt (connVec_mem_filt_zero (t 0)) - (fun c' => covIter_mem_filt n (fun i => t i.succ) nu mu c') c - have hbr : brR (connVec (t 0)) (covIter n (fun i => t i.succ) (curvVec nu mu)) c ∈ - sfilt (n + 2) := by - rw [sfilt_succ] - simpa using hbr0 - have hsum := add_mem hder hbr - convert hsum using 1 - · abel - -/-- The derivative multi-index represented by an ordered tuple. -/ -noncomputable def tupleFinsupp {n : ℕ} (t : Fin n → Lor) : DIdx := - ∑ i, Finsupp.single (t i) 1 - -lemma tupleFinsupp_perm {n : ℕ} (t : Fin n → Lor) (sigma : Equiv.Perm (Fin n)) : - tupleFinsupp (t ∘ sigma) = tupleFinsupp t := by - rw [tupleFinsupp, tupleFinsupp] - simpa [Function.comp_def] using - sigma.sum_comp (Finset.univ : Finset (Fin n)) (fun i => Finsupp.single (t i) 1) - -lemma plainIter_linCurv (n : ℕ) (t : Fin n → Lor) (nu mu : Lor) (c : Col) : - plainIter n t (linCurv nu mu) c = - ofGen (.dA (tupleFinsupp t + Finsupp.single nu 1) mu c) - - ofGen (.dA (tupleFinsupp t + Finsupp.single mu 1) nu c) := by - induction n with - | zero => - simp [plainIter, linCurv, connVec, genVec, tupleFinsupp] - | succ n ih => - rw [plainIter_succ, ih, map_sub, jetDeriv_ofGen, jetDeriv_ofGen] - simp only [JetGenerators.shift_dA] - congr 2 <;> simp [tupleFinsupp, Fin.sum_univ_succ, add_left_comm, add_comm] - -lemma plainIter_linCurv_perm {n : ℕ} (t : Fin n → Lor) (sigma : Equiv.Perm (Fin n)) - (nu mu : Lor) (c : Col) : - plainIter n (t ∘ sigma) (linCurv nu mu) c = plainIter n t (linCurv nu mu) c := by - rw [plainIter_linCurv, plainIter_linCurv, tupleFinsupp_perm] - -/-- The symmetrized leading ordinary derivative of the linear field strength. -/ -noncomputable def symPlainCurv {n : ℕ} (t : Fin n → Lor) (nu mu : Lor) : Col → JetAlgebra := - fun c => (Nat.factorial n : ℝ)⁻¹ • - ∑ sigma : Equiv.Perm (Fin n), plainIter n (t ∘ sigma) (linCurv nu mu) c - -lemma covCurv_sub_symPlainCurv_mem_sfilt {n : ℕ} (t : Fin n → Lor) - (nu mu : Lor) (c : Col) : covCurv t nu mu c - symPlainCurv t nu mu c ∈ sfilt (n + 1) := by - have hsum : ∑ sigma : Equiv.Perm (Fin n), - (covIter n (t ∘ sigma) (curvVec nu mu) c - - plainIter n (t ∘ sigma) (linCurv nu mu) c) ∈ sfilt (n + 1) := - Submodule.sum_mem _ fun sigma _ => covIter_sub_plainIter_mem_sfilt n (t ∘ sigma) nu mu c - have hsmul := Submodule.smul_mem (sfilt (n + 1)) (Nat.factorial n : ℝ)⁻¹ hsum - rw [covCurv, symPlainCurv] - convert hsmul using 1 - rw [Finset.sum_sub_distrib] - module - -lemma symPlainCurv_eq_plainIter {n : ℕ} (t : Fin n → Lor) (nu mu : Lor) (c : Col) : - symPlainCurv t nu mu c = plainIter n t (linCurv nu mu) c := by - rw [symPlainCurv, Finset.sum_congr rfl fun sigma _ => plainIter_linCurv_perm t sigma nu mu c, - Finset.sum_const, Finset.card_univ, Fintype.card_perm, Fintype.card_fin, - ← Nat.cast_smul_eq_nsmul ℝ] - have hfac : (Nat.factorial n : ℝ) ≠ 0 := by positivity - exact inv_smul_smul₀ hfac (plainIter n t (linCurv nu mu) c) - -/-- A deterministic list representing a derivative multi-index. -/ -noncomputable def didxList (q : DIdx) : List Lor := (didxMultiset q).toList - -/-- The deterministic ordered tuple associated to `q`. -/ -noncomputable def didxTuple (q : DIdx) : Fin (didxList q).length → Lor := - fun i => (didxList q).get i - -lemma didxList_length (q : DIdx) : (didxList q).length = lorDeg q := by - rw [didxList, Multiset.length_toList, ← Multiset.toFinsupp_sum_eq] - simp [didxMultiset, lorDeg, Finsupp.sum_fintype] - -private lemma tupleFinsupp_get (l : List Lor) : - tupleFinsupp (fun i : Fin l.length => l.get i) = (l : Multiset Lor).toFinsupp := by - induction l with - | nil => simp [tupleFinsupp] - | cons a l ih => - simp only [tupleFinsupp, List.length_cons] - rw [Fin.sum_univ_succ] - rw [show (↑(a :: l) : Multiset Lor) = {a} + ↑l by rfl, map_add, - Multiset.toFinsupp_singleton, ← ih] - change Finsupp.single a 1 + ∑ i : Fin l.length, Finsupp.single (l.get i) 1 = - Finsupp.single a 1 + tupleFinsupp (fun i : Fin l.length => l.get i) - rfl - -lemma tupleFinsupp_didxTuple (q : DIdx) : tupleFinsupp (didxTuple q) = q := by - change tupleFinsupp (fun i : Fin (didxList q).length => (didxList q).get i) = q - rw [tupleFinsupp_get, didxList, Multiset.coe_toList] - simp [didxMultiset] - -/-! -## C. Independent covariant hooks and their leading terms --/ - -private lemma predAt_apply_of_ne (w : DIdx) {mu nu : Lor} (h : nu ≠ mu) : - predAt w mu nu = w nu := by simp [predAt, h] - -/-- The derivative multi-index left after reserving the curvature directions `layerDir w` and -`mu`. -/ -noncomputable def hookRest (i : AllHookIdx) : DIdx := - predAt (predAt i.w i.mu) (layerDir i.w) - -private lemma hook_dir_supported (i : AllHookIdx) : - predAt i.w i.mu (layerDir i.w) ≠ 0 := by - rw [predAt_apply_of_ne i.w (Ne.symm i.mu_ne_dir)] - exact layerDir_coeff_ne_zero i.w_ne_zero - -lemma hookRest_add_dir (i : AllHookIdx) : - hookRest i + Finsupp.single (layerDir i.w) 1 = predAt i.w i.mu := by - exact predAt_add_single (hook_dir_supported i) - -lemma hookRest_add_mu (i : AllHookIdx) : - hookRest i + Finsupp.single i.mu 1 = predAt i.w (layerDir i.w) := by - apply add_right_cancel (b := Finsupp.single (layerDir i.w) 1) - calc - (hookRest i + Finsupp.single i.mu 1) + Finsupp.single (layerDir i.w) 1 = - (hookRest i + Finsupp.single (layerDir i.w) 1) + - Finsupp.single i.mu 1 := by ac_rfl - _ = predAt i.w i.mu + Finsupp.single i.mu 1 := by rw [hookRest_add_dir] - _ = i.w := predAt_add_single i.mu_supported - _ = predAt i.w (layerDir i.w) + Finsupp.single (layerDir i.w) 1 := - (predAt_add_single (layerDir_coeff_ne_zero i.w_ne_zero)).symm - -lemma lorDeg_hookRest (i : AllHookIdx) : lorDeg (hookRest i) + 2 = lorDeg i.w := by - have hmu := lorDeg_predAt i.mu_supported - have hdir := lorDeg_predAt (hook_dir_supported i) - change lorDeg (hookRest i) + 1 = lorDeg (predAt i.w i.mu) at hdir - omega - -/-- The independent covariant hook: the symmetrized `D^(|w|-2) F_(layerDir w),mu` component. -/ -noncomputable def covHook (i : AllHookIdx) (c : Col) : JetAlgebra := - covCurv (didxTuple (hookRest i)) (layerDir i.w) i.mu c - -lemma symPlainHook_eq_hookDiff (i : AllHookIdx) (c : Col) : - symPlainCurv (didxTuple (hookRest i)) (layerDir i.w) i.mu c = hookDiff i c := by - rw [symPlainCurv_eq_plainIter, plainIter_linCurv, tupleFinsupp_didxTuple, - hookRest_add_dir, hookRest_add_mu] - rfl - -/-- The covariant hook differs from its independent linear hook by terms of strictly smaller -additive derivative degree. -/ -lemma covHook_sub_hookDiff_mem_sfilt (i : AllHookIdx) (c : Col) : - covHook i c - hookDiff i c ∈ sfilt (lorDeg (predAt i.w i.mu)) := by - have h := covCurv_sub_symPlainCurv_mem_sfilt (didxTuple (hookRest i)) - (layerDir i.w) i.mu c - rw [symPlainHook_eq_hookDiff] at h - have hlen := didxList_length (hookRest i) - have hrest := lorDeg_hookRest i - have hmu := lorDeg_predAt i.mu_supported - have hdeg : (didxList (hookRest i)).length + 1 = lorDeg (predAt i.w i.mu) := by omega - rw [hdeg] at h - exact h - -/-! -## D. The normalized triangular substitution - -The map below fixes the symmetric weighted average and replaces every independent `hookDiff` by -`covHook`. Written back in ordinary components, its correction is the hook correction minus its -weighted average, so every generator changes only by strict lower filtration terms. --/ - -lemma total_add_single_apply_ne_zero (s : DIdx) (mu : Lor) : - ((s + (Finsupp.single mu 1 : DIdx)) : DIdx) mu ≠ 0 := by simp - -lemma total_add_single_ne_zero (s : DIdx) (mu : Lor) : - s + Finsupp.single mu 1 ≠ 0 := by - rw [← lorDeg_pos_iff, lorDeg_add, lorDeg_single] - omega - -lemma predAt_add_single_eq (s : DIdx) (mu : Lor) : - predAt (s + Finsupp.single mu 1) mu = s := by - apply add_right_cancel (b := Finsupp.single mu 1) - exact predAt_add_single (total_add_single_apply_ne_zero s mu) - -lemma totalComponent_add_single (s : DIdx) (mu : Lor) (c : Col) : - totalComponent (s + Finsupp.single mu 1) mu c = ofGen (.dA s mu c) := by - rw [totalComponent, predAt_add_single_eq] - -/-- The nonlinear correction replacing a supported non-distinguished hook difference by the -matching covariant hook. -/ -noncomputable def hookCorrection (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := - if hw : w ≠ 0 then - if hmu : w mu ≠ 0 then - if hne : mu ≠ layerDir w then - let i : AllHookIdx := ⟨w, mu, hw, hmu, hne⟩ - covHook i c - hookDiff i c - else 0 - else 0 - else 0 - -lemma hookCorrection_eq (i : AllHookIdx) (c : Col) : - hookCorrection i.w i.mu c = covHook i c - hookDiff i c := by - rw [hookCorrection, dif_pos i.w_ne_zero, dif_pos i.mu_supported, dif_pos i.mu_ne_dir] - -lemma hookCorrection_dir (w : DIdx) (c : Col) : - hookCorrection w (layerDir w) c = 0 := by - by_cases hw : w ≠ 0 <;> simp [hookCorrection, hw] - -lemma hookCorrection_mem_sfilt (w : DIdx) (mu : Lor) (c : Col) : - hookCorrection w mu c ∈ sfilt (lorDeg w - 1) := by - rw [hookCorrection] - by_cases hw : w ≠ 0 - · rw [dif_pos hw] - by_cases hmu : w mu ≠ 0 - · rw [dif_pos hmu] - by_cases hne : mu ≠ layerDir w - · rw [dif_pos hne] - let i : AllHookIdx := ⟨w, mu, hw, hmu, hne⟩ - have hdeg := lorDeg_predAt hmu - have heq : lorDeg (predAt w mu) = lorDeg w - 1 := by omega - rw [← heq] - exact covHook_sub_hookDiff_mem_sfilt i c - · rw [dif_neg hne] - exact zero_mem _ - · rw [dif_neg hmu] - exact zero_mem _ - · rw [dif_neg hw] - exact zero_mem _ - -/-- The weighted average of the nonlinear hook corrections over a total index. -/ -noncomputable def correctionAverage (w : DIdx) (c : Col) : JetAlgebra := - (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, (w mu : ℝ) • hookCorrection w mu c - -lemma correctionAverage_mem_sfilt (w : DIdx) (c : Col) : - correctionAverage w c ∈ sfilt (lorDeg w - 1) := by - rw [correctionAverage] - exact Submodule.smul_mem _ _ (Submodule.sum_mem _ fun mu _ => - Submodule.smul_mem _ _ (hookCorrection_mem_sfilt w mu c)) - -/-- Generator form of the normalized triangular substitution. -/ -noncomputable def triangularGen : JetGenerators → JetAlgebra - | .dA s mu c => - let w := s + Finsupp.single mu 1 - ofGen (.dA s mu c) + hookCorrection w mu c - correctionAverage w c - -/-- The nonlinear triangular endomorphism of the unchanged `OrdinaryJets` ordinary carrier. -/ -noncomputable def triangularSubst : JetAlgebra →ₐ[ℝ] JetAlgebra := - (MvPolynomial.aeval triangularGen).comp toPoly.toAlgHom - -@[simp] -lemma triangularSubst_ofGen (g : JetGenerators) : - triangularSubst (ofGen g) = triangularGen g := by - rw [triangularSubst] - change MvPolynomial.aeval triangularGen (toPoly (ofGen g)) = _ - rw [toPoly_ofGen, aeval_X] - -lemma triangularGen_sub_self_mem_sfilt (g : JetGenerators) : - triangularGen g - ofGen g ∈ sfilt (genDeg g) := by - obtain ⟨s, mu, c⟩ := g - rw [triangularGen, genDeg_dA] - have hdeg : lorDeg (s + Finsupp.single mu 1) - 1 = lorDeg s := by - rw [lorDeg_add, lorDeg_single] - omega - rw [show ofGen (.dA s mu c) + hookCorrection (s + Finsupp.single mu 1) mu c - - correctionAverage (s + Finsupp.single mu 1) c - ofGen (.dA s mu c) = - hookCorrection (s + Finsupp.single mu 1) mu c - - correctionAverage (s + Finsupp.single mu 1) c by abel] - rw [← hdeg] - exact sub_mem (hookCorrection_mem_sfilt _ _ _) (correctionAverage_mem_sfilt _ _) - -lemma triangularGen_mem_filt (g : JetGenerators) : triangularGen g ∈ filt (genDeg g) := by - have hlow := sfilt_le_filt _ (triangularGen_sub_self_mem_sfilt g) - have hgen := ofGen_mem_filt g - have h := add_mem hgen hlow - rwa [add_sub_cancel] at h - -lemma prod_triangularGen_mem_filt (l : List JetGenerators) : - (l.map triangularGen).prod ∈ filt (l.map genDeg).sum := by - induction l with - | nil => simpa using one_mem_filt_zero - | cons g l ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - exact mul_mem_filt (triangularGen_mem_filt g) ih - -lemma prod_triangularGen_sub_mem_sfilt (l : List JetGenerators) : - (l.map triangularGen).prod - (l.map ofGen).prod ∈ sfilt (l.map genDeg).sum := by - induction l with - | nil => - simp only [List.map_nil, List.prod_nil, List.sum_nil, sub_self] - exact zero_mem _ - | cons g l ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons] - have hkey : triangularGen g * (l.map triangularGen).prod - - ofGen g * (l.map ofGen).prod = - (triangularGen g - ofGen g) * (l.map triangularGen).prod + - ofGen g * ((l.map triangularGen).prod - (l.map ofGen).prod) := by ring - rw [hkey] - exact add_mem - (mul_mem_sfilt_left (triangularGen_sub_self_mem_sfilt g) - (prod_triangularGen_mem_filt l)) - (mul_mem_sfilt_right (ofGen_mem_filt g) ih) - -private lemma triangularSubst_prod_ofGen (l : List JetGenerators) : - triangularSubst (l.map ofGen).prod = (l.map triangularGen).prod := by - induction l with - | nil => simp - | cons g l ih => - simp only [List.map_cons, List.prod_cons, map_mul, triangularSubst_ofGen, ih] - -/-- Unitriangularity on every filtered piece. -/ -lemma triangularSubst_sub_self_mem_sfilt {d : ℕ} {P : JetAlgebra} (hP : P ∈ filt d) : - triangularSubst P - P ∈ sfilt d := by - induction hP using Submodule.span_induction with - | mem P hP => - obtain ⟨l, hl, rfl⟩ := hP - have h := prod_triangularGen_sub_mem_sfilt l - rw [triangularSubst_prod_ofGen] - exact sfilt_mono hl h - | zero => - rw [map_zero, sub_zero] - exact zero_mem _ - | add P Q _ _ hP hQ => - rw [map_add, show triangularSubst P + triangularSubst Q - (P + Q) = - (triangularSubst P - P) + (triangularSubst Q - Q) by abel] - exact add_mem hP hQ - | smul r P _ hP => - rw [map_smul, ← smul_sub] - exact Submodule.smul_mem _ _ hP - -/-- Every ordinary jet polynomial has bounded additive derivative degree. -/ -lemma exists_mem_filt (P : JetAlgebra) : ∃ d, P ∈ filt d := by - induction P using SymmetricAlgebra.induction with - | algebraMap r => exact ⟨0, algebraMap_mem_filt_zero r⟩ - | ι v => - let r := JetComponentSpace.basis.repr v - let d := r.support.sup genDeg - refine ⟨d, ?_⟩ - have hv : SymmetricAlgebra.ι ℝ JetComponentSpace v = - r.sum (fun g a => a • ofGen g) := by - conv_lhs => rw [← JetComponentSpace.basis.linearCombination_repr v] - rw [Finsupp.linearCombination_apply, Finsupp.sum, map_sum] - refine Finset.sum_congr rfl fun g _ => ?_ - rw [map_smul] - rfl - rw [hv, Finsupp.sum] - refine Submodule.sum_mem (filt d) fun g hg => ?_ - exact Submodule.smul_mem _ _ - (filt_mono (show genDeg g ≤ d from Finset.le_sup hg) (ofGen_mem_filt g)) - | mul P Q hP hQ => - obtain ⟨d, hd⟩ := hP - obtain ⟨e, he⟩ := hQ - exact ⟨d + e, mul_mem_filt hd he⟩ - | add P Q hP hQ => - obtain ⟨d, hd⟩ := hP - obtain ⟨e, he⟩ := hQ - exact ⟨max d e, add_mem (filt_mono (le_max_left _ _) hd) - (filt_mono (le_max_right _ _) he)⟩ - -private lemma eq_zero_of_triangularSubst_eq_zero {d : ℕ} : - ∀ {P : JetAlgebra}, P ∈ filt d → triangularSubst P = 0 → P = 0 := by - induction d with - | zero => - intro P hP h0 - have h := triangularSubst_sub_self_mem_sfilt hP - rw [h0, zero_sub, sfilt_zero, Submodule.mem_bot, neg_eq_zero] at h - exact h - | succ d ih => - intro P hP h0 - have h := triangularSubst_sub_self_mem_sfilt hP - rw [h0, zero_sub, sfilt_succ] at h - exact ih (neg_mem_iff.mp h) h0 - -lemma triangularSubst_injective : Function.Injective triangularSubst := by - intro P Q hPQ - obtain ⟨d, hd⟩ := exists_mem_filt (P - Q) - have h0 : triangularSubst (P - Q) = 0 := by rw [map_sub, hPQ, sub_self] - exact sub_eq_zero.mp (eq_zero_of_triangularSubst_eq_zero hd h0) - -private lemma exists_triangularSubst_eq {d : ℕ} : - ∀ {P : JetAlgebra}, P ∈ filt d → ∃ Q, triangularSubst Q = P := by - induction d with - | zero => - intro P hP - have h := triangularSubst_sub_self_mem_sfilt hP - rw [sfilt_zero, Submodule.mem_bot, sub_eq_zero] at h - exact ⟨P, h⟩ - | succ d ih => - intro P hP - have h := triangularSubst_sub_self_mem_sfilt hP - rw [sfilt_succ] at h - obtain ⟨Q, hQ⟩ := ih h - exact ⟨P - Q, by rw [map_sub, hQ, sub_sub_cancel]⟩ - -lemma triangularSubst_surjective : Function.Surjective triangularSubst := by - intro P - obtain ⟨d, hd⟩ := exists_mem_filt P - exact exists_triangularSubst_eq hd - -/-- **The arbitrary-order triangular coordinate equivalence.** -/ -noncomputable def covariantEquiv : JetAlgebra ≃ₐ[ℝ] JetAlgebra := - AlgEquiv.ofBijective triangularSubst ⟨triangularSubst_injective, triangularSubst_surjective⟩ - -@[simp] -lemma covariantEquiv_apply (P : JetAlgebra) : covariantEquiv P = triangularSubst P := rfl - -lemma triangularSubst_totalComponent {w : DIdx} {mu : Lor} (hmu : w mu ≠ 0) (c : Col) : - triangularSubst (totalComponent w mu c) = - totalComponent w mu c + hookCorrection w mu c - correctionAverage w c := by - rw [totalComponent, triangularSubst_ofGen, triangularGen] - rw [predAt_add_single hmu] - -/-- Every independent linear hook is sent to the matching symmetrized covariant curvature -derivative. -/ -lemma triangularSubst_hookDiff (i : AllHookIdx) (c : Col) : - triangularSubst (hookDiff i c) = covHook i c := by - rw [hookDiff, map_sub, triangularSubst_totalComponent i.mu_supported, - triangularSubst_totalComponent (layerDir_coeff_ne_zero i.w_ne_zero), - hookCorrection_dir, hookCorrection_eq] - rw [hookDiff] - abel - -/-- The fully symmetric connection coordinate is fixed by the normalized substitution. -/ -lemma triangularSubst_symConn {w : DIdx} (hw : w ≠ 0) (c : Col) : - triangularSubst (symConn w c) = symConn w c := by - rw [symConn, map_smul, map_sum] - have hterm : ∀ mu : Lor, - triangularSubst ((w mu : ℝ) • totalComponent w mu c) = - (w mu : ℝ) • (totalComponent w mu c + hookCorrection w mu c - - correctionAverage w c) := by - intro mu - by_cases hmu : w mu ≠ 0 - · rw [map_smul, triangularSubst_totalComponent hmu] - · have hz : w mu = 0 := not_ne_iff.mp hmu - simp [hz] - rw [Finset.sum_congr rfl fun mu _ => hterm mu] - have hdeg : (lorDeg w : ℝ) ≠ 0 := by - exact_mod_cast (Nat.ne_of_gt ((lorDeg_pos_iff w).2 hw)) - have hsum : ∑ mu : Lor, (w mu : ℝ) = lorDeg w := by norm_cast - simp_rw [smul_sub, smul_add] - rw [Finset.sum_sub_distrib, Finset.sum_add_distrib, ← Finset.sum_smul, hsum, - correctionAverage, smul_smul, mul_inv_cancel₀ hdeg, one_smul] - module - -/-! -## E. The parametric triangular coordinate identity --/ - -/-- The covariant hook component extended to every displayed supported direction; the -distinguished component is zero. -/ -noncomputable def covHookAt (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := - totalComponent w mu c - totalComponent w (layerDir w) c + hookCorrection w mu c - -/-- The weighted average of the displayed covariant hook components. -/ -noncomputable def covHookAverage (w : DIdx) (c : Col) : JetAlgebra := - (lorDeg w : ℝ)⁻¹ • ∑ mu : Lor, (w mu : ℝ) • covHookAt w mu c - -/-- The strict lower-order remainder in the inverse triangular coordinate formula. -/ -noncomputable def triangularLower (w : DIdx) (mu : Lor) (c : Col) : JetAlgebra := - correctionAverage w c - hookCorrection w mu c - -lemma covHookAt_eq_covHook (i : AllHookIdx) (c : Col) : - covHookAt i.w i.mu c = covHook i c := by - rw [covHookAt, hookCorrection_eq, hookDiff] - abel - -lemma covHookAt_dir (w : DIdx) (c : Col) : covHookAt w (layerDir w) c = 0 := by - rw [covHookAt, hookCorrection_dir, sub_self, zero_add] - -lemma covHookAverage_eq (w : DIdx) (c : Col) : - covHookAverage w c = hookAverage w c + correctionAverage w c := by - unfold covHookAverage hookAverage correctionAverage covHookAt - simp_rw [smul_add] - rw [Finset.sum_add_distrib, smul_add] - -lemma triangularLower_mem_sfilt (w : DIdx) (mu : Lor) (c : Col) : - triangularLower w mu c ∈ sfilt (lorDeg w - 1) := by - exact sub_mem (correctionAverage_mem_sfilt w c) (hookCorrection_mem_sfilt w mu c) - -/-- **The arbitrary-order Brandt triangular identity.** Every ordinary component is the fully -symmetric connection coordinate plus its independent covariant hook component, minus the weighted -hook average needed by the explicit inverse, plus a term of strictly smaller additive derivative -degree. For an `AllHookIdx`, `covHookAt_eq_covHook` identifies the displayed hook with the -symmetrized `D^(|w|-2) F` from `CovariantTower`. -/ -lemma ordinary_eq_symmetric_add_covariant_hook {w : DIdx} (hw : w ≠ 0) - {mu : Lor} (hmu : w mu ≠ 0) (c : Col) : - totalComponent w mu c = - symConn w c + covHookAt w mu c - covHookAverage w c + triangularLower w mu c := by - rw [covHookAverage_eq, covHookAt, triangularLower] - have h := totalComponent_eq_symConn_add_hook_sub hw hmu c - rw [show totalComponent w mu c - totalComponent w (layerDir w) c = - totalComponent w mu c - totalComponent w (layerDir w) c from rfl] - linear_combination h - -end SU3Jet -end StandardModel From dff4c93cb872301b32a3be831e3b9c94cf25e012 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Wed, 26 Aug 2026 17:51:33 +0400 Subject: [PATCH 207/254] refactor(StandardModel): remove stale API for the B boson List of files removed: GaugeBosons/BBoson/Basic GaugeBosons/BBoson/MassDim --- .../GaugeBosons/BBoson/Basic.lean | 3110 ----------------- .../GaugeBosons/BBoson/MassDim.lean | 316 -- 2 files changed, 3426 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean deleted file mode 100644 index 8193f3bbb..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/Basic.lean +++ /dev/null @@ -1,3110 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Relativity.Tensors.ComplexTensor.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic -public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation -public import Physlib.Relativity.SL2C.Basic -public import Physlib.Mathematics.ConjModule -public import Physlib.Mathematics.TensorProduct -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Particles.LagrangianTheory.Basic -public import Physlib.Mathematics.MvPowerSeriesDerivative -public import Physlib.Mathematics.MvPolynomialTranslation -public import Mathlib.Algebra.MvPolynomial.Derivation -public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan -/-! -# The B boson - -The hypercharge gauge boson field `B_μ`: the gauge boson of the `U(1)` factor of -the Standard Model gauge group, with one Lorentz index, valued in the -one-dimensional adjoint of `U(1)`, modelled as the real vector space of hermitian -complex numbers. - -The physical Z boson and photon are the electroweak-mixed combinations of this -field with the neutral `SU(2)` boson; before mixing, the `U(1)` factor's gauge -boson is the B boson formalized here. - -## A note on the general case - -Let us consider the general case of a gauge field which should help elcuidate the -theory here. Let `A_μ^a` be the gauge boson field for the general gauge group `G`, -with `a` an index in the adjoint representation of `G`. Then the gauge transformation on `A` -takes the form `A_μ^a ↦ (Ad_g A_μ)^a + mc(g)_μ^a`, where `mc(g)` is the Maurer–Cartan form -of the gauge transformation. In this file `BBoson` is the -vector space of the `B` boson fields, and the transformation of the -`B` boson is given by (`SMul JetGaugeGroupI BBoson`): - -`repGaugeGroupI U.eval B + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩` - -where here `repGaugeGroupI U.eval` is the adjoint action and the second term is -the Maurer–Cartan term. - -In general we will write `g • A_μ^a = M(g)^a_b A_μ^b + mc(g)_μ^a`, where `M(g)^a_b` -is the adjoint action of `g` evaluated at the base point. With this it is easy to say -how the gauge transformation acts on the derivatives of the gauge field. We have - -`∂_s A_μ^a ↦ ∂_s (g • A_μ^a) =` -`∑ (x + y = s), C(x,y) (∂_x g₀^a_b) ∂_y A_μ^b + ∂_s mc(g)_μ^a` -where `C(x,y)` is the usual binomial coefficient. - -What we actually want to work with (and what our Lagrangian is written in -terms of is) `[∂_s A_μ^a]`. These are the component functions of the gauge fields. -They are functions on the space of field configurations, so the induced left -action is the pullback along `g⁻¹`, `(g • f)(A) = f (g⁻¹ • A)`: one substitutes -`g⁻¹` — not `g` — into the field law above. Writing `M⁻¹ := M(g⁻¹) = M(g)⁻¹`, - -`g • [∂_s A_μ^a] = ∑ (x + y = s), C(x,y) (∂_x (M(g₀⁻¹))^a_b) [∂_y A_μ^b]` -` + ∂_s mc(g⁻¹)_μ^a` - -The inverse on `M` is essential: pulling back along `g` instead would give a -right action, since `(f ∘ g₁) ∘ g₂ = f ∘ (g₁g₂)` composes in the wrong order. -The Maurer–Cartan cocycle identity `mc(g₁g₂) = Ad_{g₁} mc(g₂) + mc(g₁)` gives -`mc(g⁻¹) = -Ad_{g⁻¹} mc(g)`, so the inhomogeneous term is minus the field-level -one, transported by `M⁻¹`. - -For the abelian case formalized here the adjoint action is trivial, `M ≡ 1`, so -the first sum collapses to `[∂_s B_μ]` and the shift is simply `-∂_s mc(g)_μ`: - -`g • [∂_s B_μ] = [∂_s B_μ] - ∂_s mc(g)_μ` - -This is `mcShift`, and it is the sign used by `repJetGaugeGroupI`. -This relation is written down explicitly in `repJetGaugeGroupI_apply_ofGenerator`. - - - -## Layout - -* `A` — the B-boson field itself: its target space, and the Lorentz and gauge - actions on it. -* `B` — the jet coordinates `[∂_s B_μ]`: the generators, the space they span, - and the Lorentz and gauge actions on that space. The gauge action is the - Maurer–Cartan shift `mcShift` (`B.5`). -* `C` — the Maurer–Cartan data packaged as jets: the shift series - `mcShiftSeries`, and the exponential family of gauge jets that realises - arbitrary translations of the coordinates. -* `D` — the jet algebra, and the Lorentz and gauge representations on it. -* `E` — calculus on the jet algebra: the formal total derivative, and the - correction derivations `mcDeriv` that measure its failure to commute with the - gauge action. -* `F` — the field strength, and the classification: a jet polynomial is gauge - invariant if and only if it is a polynomial in the derivatives of the field - strength (`F.2`). -* `G` — gradings and transformation laws: mass weight, and the Lorentz laws of - the coordinates and of the field strength. - --/ - -@[expose] public section - - -namespace StandardModel - -open TensorProduct - -/-! - -## A.1. The target vector space of the B-boson field --/ - -/-- The target vector space of the B-boson field `B_μ`. It carries one Lorentz - index, and is valued in the real vector space of hermitian complex numbers, - corresponding to the adjoint of `U(1)`. -/ -@[ext] -structure BBoson where - /-- The Lorentz index together with the adjoint (hermitian) factor. -/ - val : Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ - -namespace BBoson -open Module -/-! - -## A.2. Linear structure on the target space --/ - -def valEquiv : BBoson ≃ Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ where - toFun := val - invFun := fun m => ⟨m⟩ - -noncomputable instance : AddCommGroup BBoson := Equiv.addCommGroup valEquiv - -noncomputable instance : Module ℝ BBoson := Equiv.module ℝ valEquiv - -/-- The linear identification with the underlying tensor product. -/ -def valLinEquiv : BBoson ≃ₗ[ℝ] Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ where - toFun := val - invFun := fun m => ⟨m⟩ - map_add' := by intros; rfl - map_smul' := by intros; rfl - -@[simp] -lemma valLinEquiv_apply (d : BBoson) : valLinEquiv d = d.val := rfl - -lemma valLinEquiv_symm_apply (m : Lorentz.CoVector ⊗[ℝ] selfAdjoint ℂ) : - valLinEquiv.symm m = ⟨m⟩ := rfl - -@[simp] -lemma val_add (d₁ d₂ : BBoson) : (d₁ + d₂).val = d₁.val + d₂.val := rfl - -@[simp] -lemma val_smul (r : ℝ) (d : BBoson) : (r • d).val = r • d.val := rfl - -@[simp] -lemma val_zero : (0 : BBoson).val = 0 := rfl - -/-- The basis of the B-boson field indexed by the Lorentz index: the standard - Lorentz-vector basis tensored with the hermitian unit of the one-dimensional - adjoint factor. -/ -noncomputable def basis : Basis (Fin 1 ⊕ Fin 3) ℝ BBoson := - ((Lorentz.CoVector.basis.tensorProduct - ((Module.Basis.singleton Unit ℝ).map Complex.selfAdjointEquiv.symm)).map - valLinEquiv.symm).reindex (Equiv.prodPUnit (Fin 1 ⊕ Fin 3)) - -/-- The B-boson basis vector as an explicit tensor: the Lorentz basis vector paired - with the hermitian unit. -/ -lemma basis_apply (ν : Fin 1 ⊕ Fin 3) : - (basis ν : BBoson) = - ⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ := by - rw [basis, Module.Basis.reindex_apply, Module.Basis.map_apply, - Module.Basis.tensorProduct_apply', Module.Basis.map_apply, - Module.Basis.singleton_apply, valLinEquiv_symm_apply] - rfl - -/-- A pure tensor of a Lorentz basis vector with a hermitian value is a multiple of - the corresponding B-boson basis vector. -/ -lemma mk_tmul_eq_smul_basis (ν : Fin 1 ⊕ Fin 3) (x : selfAdjoint ℂ) : - (⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] x⟩ : BBoson) = - Complex.selfAdjointEquiv x • basis ν := by - apply BBoson.ext - rw [val_smul, basis_apply, - show ((⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1⟩ : BBoson)).val = - Lorentz.CoVector.basis ν ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from rfl, - ← TensorProduct.tmul_smul] - congr 1 - rw [show (Complex.selfAdjointEquiv x) • (Complex.selfAdjointEquiv.symm 1) = - Complex.selfAdjointEquiv.symm (Complex.selfAdjointEquiv x • 1) from - (map_smul _ _ _).symm, smul_eq_mul, mul_one, LinearEquiv.symm_apply_apply] - rfl -/-! - -## A.3. The Lorentz action on the target space - -The Lorentz group acts on the Lorentz index and leaves the adjoint factor fixed. --/ - -open Matrix MatrixGroups - -/-- The Lorentz representation on the B-boson field: the vector action, through the - covering map `SL(2,ℂ) →* LorentzGroup 3`, on the Lorentz index, and the trivial - action on the adjoint factor. -/ -noncomputable def repLorentzGroup : Representation ℝ (SL(2,ℂ)) BBoson where - toFun Λ := valLinEquiv.symm.toLinearMap ∘ₗ - TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup Λ)) - (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) Λ) ∘ₗ - valLinEquiv.toLinearMap - map_one' := by - ext F - simp [Module.End.one_eq_id] - map_mul' Λ₁ Λ₂ := by - ext1 F - simp [TensorProduct.map_map, Module.End.mul_eq_comp, map_mul] - - -/-- The Lorentz action on the B-boson basis: the covector transformation. -/ -lemma repLorentzGroup_basis (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (basis μ) = - ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1⁻¹ μ j • basis j := by - have happ : repLorentzGroup Λ (basis μ) = valLinEquiv.symm.toLinearMap - (TensorProduct.map (Lorentz.CoVector.rep (Lorentz.SL2C.toLorentzGroup Λ)) - (Representation.trivial ℝ (SL(2,ℂ)) (selfAdjoint ℂ) Λ) - (valLinEquiv.toLinearMap (basis μ))) := rfl - rw [happ, show valLinEquiv.toLinearMap (basis μ) = - Lorentz.CoVector.basis μ ⊗ₜ[ℝ] Complex.selfAdjointEquiv.symm 1 from by - rw [basis_apply]; rfl, - TensorProduct.map_tmul, Lorentz.CoVector.rep_apply_basis, - Representation.trivial_apply, TensorProduct.sum_tmul, map_sum] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [← TensorProduct.smul_tmul', map_smul] - congr 1 - rw [show valLinEquiv.symm.toLinearMap (Lorentz.CoVector.basis j ⊗ₜ[ℝ] - Complex.selfAdjointEquiv.symm 1) = (⟨Lorentz.CoVector.basis j ⊗ₜ[ℝ] - Complex.selfAdjointEquiv.symm 1⟩ : BBoson) from rfl, ← basis_apply] - -/-- The jet coordinates of the B boson transform contravariantly on the target - index, by the columns of the Lorentz matrix, matching the derivative slots. -/ -lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup.dual Λ (basis.dualBasis ν) = - ∑ j, (Lorentz.SL2C.toLorentzGroup Λ).1 j ν • basis.dualBasis j := by - refine Representation.dual_apply_dualBasis _ _ _ _ - (Matrix.of fun l j => (Lorentz.SL2C.toLorentzGroup Λ).1 j l) (fun j => ?_) - rw [repLorentzGroup_basis, ← LorentzGroup.coe_inv, map_inv, inv_inv] - rfl - -/-! - -## A.4. The gauge action on the target space - -The B boson is neutral: the `SU(3)` and `SU(2)` components do not act on it, and -the adjoint action of the abelian `U(1)` component is `A ↦ u * A * ū = A`, which is -trivial. The global gauge group therefore acts trivially. --/ - -/-- The (trivial) adjoint action of the unquotiented Standard Model gauge group on - the B-boson field. -/ -noncomputable def repGaugeGroupI : Representation ℝ GaugeGroupI BBoson := - Representation.trivial ℝ GaugeGroupI BBoson - -@[simp] -lemma repGaugeGroupI_apply (g : GaugeGroupI) (B : BBoson) : - repGaugeGroupI g B = B := rfl - -/-! - -## A.5. The local gauge action, through jets of gauge transformations - -A local gauge transformation acts on the B-boson field through its first-order jet. -Because the adjoint action is trivial, only the inhomogeneous Maurer–Cartan term -survives: `B_μ ↦ B_μ + i (∂_μ u)(0) ū(0)`, where `u` is the `U(1)` power-series -component of the jet. The Maurer–Cartan coefficient is hermitian by unitarity, and -since the group is abelian the cocycle identity degenerates to additivity. The -resulting action of `JetGaugeGroupI` on `BBoson` is by translations. --/ - -open MvPowerSeries JetRing - -/-- The action of the jet gauge group on the B-boson field: the adjoint action is - trivial, so a jet of gauge transformations acts purely by the Maurer–Cartan - translation `B_μ ↦ B_μ + i (∂_μ u)(0) ū(0)` of its `U(1)` component. The action - is affine rather than linear, which is why it is a `MulAction` and not a - `Representation`. -/ -noncomputable instance : SMul JetGaugeGroupI BBoson where - smul U B := repGaugeGroupI U.eval B + - ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ - -lemma smul_eq (U : JetGaugeGroupI) (B : BBoson) : U • B = B + - ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0⟩ := rfl - -lemma smul_val (U : JetGaugeGroupI) (B : BBoson) : - (U • B).val = B.val + ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] maurerCartanU1Coeff U μ 0 := by - rfl - -/-- The jets of constant (global) gauge transformations act trivially on the B - boson, in agreement with the trivial adjoint representation `repGaugeGroupI`: the - Maurer–Cartan term vanishes on constant jets. -/ -@[simp] -lemma ofConstant_smul (g : GaugeGroupI) (B : BBoson) : - JetGaugeGroupI.ofConstant g • B = B := by - ext - simp [smul_val] - -attribute [-simp] Fintype.sum_sum_type - -noncomputable instance : MulAction JetGaugeGroupI BBoson where - one_smul B := by - simp [smul_eq, maurerCartanU1Coeff_one] - rfl - mul_smul U V B := by - ext - simp [smul_val, maurerCartanU1Coeff_mul, TensorProduct.tmul_add, Finset.sum_add_distrib] - abel - -/-! - -## B.1. The jet generators - -The index set of the jet coordinates: one symbol `dB s μ` for each derivative -multiset `s` and Lorentz index `μ`. - --/ - -open Module -inductive JetGenerators where - | dB (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3): JetGenerators -deriving DecidableEq - -def JetGenerators.massWeight : JetGenerators → ℕ - | JetGenerators.dB s _ => 2 * (1 + s.card) - -def JetGenerators.equiv : JetGenerators ≃ Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) where - toFun - | JetGenerators.dB s μ => (s, μ) - invFun - | (s, μ) => JetGenerators.dB s μ - left_inv := by - intro x - cases x - rfl - right_inv := by - intro x - cases x - rfl - - -namespace JetGenerators - -/-- The total symmetrized multi-index of a jet generator: the derivative - multi-index together with the Lorentz index of the field. The Maurer–Cartan - shift of a component function depends only on its total multi-index. -/ -def total : JetGenerators → Multiset (Fin 1 ⊕ Fin 3) - | .dB s ν => s + {ν} - -@[simp] -lemma total_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - total (dB s ν) = s + {ν} := rfl - -lemma total_ne_zero (g : JetGenerators) : total g ≠ 0 := by - cases g with - | dB s ν => simp [total] - -/-- A choice of element of a multiset, used to pick the canonical representative - of each total multi-index. -/ -noncomputable def pick (t : Multiset (Fin 1 ⊕ Fin 3)) : Fin 1 ⊕ Fin 3 := - if h : ∃ ν, ν ∈ t then h.choose else Sum.inl 0 - -lemma pick_mem {t : Multiset (Fin 1 ⊕ Fin 3)} (ht : t ≠ 0) : pick t ∈ t := by - have h : ∃ ν, ν ∈ t := Multiset.exists_mem_of_ne_zero ht - rw [pick, dif_pos h] - exact h.choose_spec - -/-- The canonical representative of a jet generator: the generator with the same - total multi-index whose field index is the chosen element of the total. -/ -noncomputable def canon (g : JetGenerators) : JetGenerators := - .dB ((total g).erase (pick (total g))) (pick (total g)) - -/-- The canonical representative has the same total multi-index. -/ -@[simp] -lemma total_canon (g : JetGenerators) : total (canon g) = total g := by - rw [canon] - show ((total g).erase (pick (total g))) + {pick (total g)} = total g - rw [add_comm, Multiset.singleton_add] - exact Multiset.cons_erase (pick_mem (total_ne_zero g)) - -/-- Taking canonical representatives is idempotent. -/ -@[simp] -lemma canon_canon (g : JetGenerators) : canon (canon g) = canon g := by - rw [show canon (canon g) = - JetGenerators.dB ((total (canon g)).erase (pick (total (canon g)))) - (pick (total (canon g))) from rfl, total_canon] - rfl - -/-- Two jet generators have the same canonical representative if and only if they - have the same total multi-index. -/ -lemma canon_eq_canon_iff (g g' : JetGenerators) : - canon g = canon g' ↔ total g = total g' := by - constructor - · intro h - rw [← total_canon g, ← total_canon g', h] - · intro h - rw [canon, canon, h] - -/-- The jet generator with one further derivative in the direction `μ`. -/ -def shift (μ : Fin 1 ⊕ Fin 3) : JetGenerators → JetGenerators - | dB s ν => dB (s + {μ}) ν - -@[simp] -lemma shift_dB (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - shift μ (dB s ν) = dB (s + {μ}) ν := rfl - -/-- Appending derivative indices commutes: the indices form a multiset. -/ -lemma shift_comm (μ ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : - shift μ (shift ν g) = shift ν (shift μ g) := by - cases g with - | dB s ρ => - show dB (s + {ν} + {μ}) ρ = dB (s + {μ} + {ν}) ρ - rw [add_right_comm] - -/-- Appending a derivative index raises the mass weight by two: a derivative has - mass dimension one. -/ -@[simp] -lemma massWeight_shift (μ : Fin 1 ⊕ Fin 3) (g : JetGenerators) : - (shift μ g).massWeight = g.massWeight + 2 := by - cases g - simp [shift, massWeight] - omega - -/-- The jet generator with further derivatives appended from a multiset. -/ -def shiftMulti (t : Multiset (Fin 1 ⊕ Fin 3)) : JetGenerators → JetGenerators - | dB s ν => dB (s + t) ν - -@[simp] -lemma shiftMulti_dB (t s : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - shiftMulti t (dB s ν) = dB (s + t) ν := rfl - -lemma shiftMulti_singleton (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : - shiftMulti {ν} g = shift ν g := by - cases g with - | dB s ρ => rfl - -lemma shiftMulti_shift (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) - (g : JetGenerators) : - shiftMulti t (shift ν g) = shiftMulti (t + {ν}) g := by - cases g with - | dB s ρ => - simp only [shift_dB, shiftMulti_dB] - congr 1 - rw [add_comm t ({ν} : Multiset (Fin 1 ⊕ Fin 3)), ← add_assoc] - -end JetGenerators - - -/-- The multiset basis of the dual derivative symbols, as a basis vector of the - symmetric algebra at the corresponding multi-index. -/ -lemma dualRealJetAlgebraBasis_apply' (s : Multiset (Fin 1 ⊕ Fin 3)) : - LagrangianTheory.dualRealJetAlgebraBasis s = - Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by - rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, Equiv.symm_symm] - rfl - -/-- The multiset basis vectors of the real dual derivative slots multiply by - adding the multisets. -/ -lemma _root_.StandardModel.BBoson.dualRealJetAlgebraBasis_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : - LagrangianTheory.dualRealJetAlgebraBasis s * - LagrangianTheory.dualRealJetAlgebraBasis t = - LagrangianTheory.dualRealJetAlgebraBasis (s + t) := by - rw [dualRealJetAlgebraBasis_apply', dualRealJetAlgebraBasis_apply', - dualRealJetAlgebraBasis_apply', map_add] - simp only [Module.Basis.symmetricAlgebra, Module.Basis.map_apply, - show ∀ p, (SymmetricAlgebra.equivMvPolynomial - Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = - (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p - from fun _ => rfl, - ← map_mul, MvPolynomial.coe_basisMonomials] - simp only [MvPolynomial.monomial_mul, mul_one] - - -/-- The multiset basis of the real dual derivative slots at a singleton index. -/ -lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : - LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis μ) := by - have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (Finsupp.single μ 1) = - MvPolynomial.X μ := rfl - rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, - Equiv.symm_symm, - show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = - Finsupp.single μ 1 by simp, - Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] - simp - -/-! - -## B.2. The jet component space - -The linear span of the jet coordinates. Everything downstream is built from this -space: the jet algebra is its symmetric algebra. - --/ - -abbrev JetComponentSpace := - SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector) ⊗[ℝ] Module.Dual ℝ BBoson - -/-- The basis of the B-boson jet component space indexed by the jet generators - `∂_s B_μ`: the multiset basis of the dual derivative symbols tensored with the - dual of the B-boson basis. -/ -noncomputable def JetComponentSpace.basis : Basis JetGenerators ℝ JetComponentSpace := - (LagrangianTheory.dualRealJetAlgebraBasis.tensorProduct - BBoson.basis.dualBasis).reindex JetGenerators.equiv.symm - -namespace JetComponentSpace - - -/-- The jet component basis vector at a generator, as a pure tensor. -/ -lemma basis_dB (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) : - JetComponentSpace.basis (.dB s ρ) = - LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] BBoson.basis.dualBasis ρ := by - rw [JetComponentSpace.basis, Module.Basis.reindex_apply, Equiv.symm_symm] - exact Module.Basis.tensorProduct_apply' _ _ _ - -/-- Appending a derivative index, as a linear map on the B-boson jet component space: it - multiplies the derivative-symbol factor by the symbol `∂_μ`. -/ -noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetComponentSpace →ₗ[ℝ] JetComponentSpace := - TensorProduct.map - (LinearMap.mulRight ℝ (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _))) - LinearMap.id - -lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) - (p : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) - (f : Module.Dual ℝ BBoson) : - jetDeriv μ (p ⊗ₜ[ℝ] f) = - (p * LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) ⊗ₜ[ℝ] f := rfl - -/-- On the basis, the shift appends the derivative index. -/ -@[simp] -lemma jetDeriv_basis (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) : - jetDeriv μ (JetComponentSpace.basis (.dB s ν)) = - JetComponentSpace.basis (.dB (s + {μ}) ν) := by - rw [JetComponentSpace.basis_dB, jetDeriv_tmul, dualRealJetAlgebraBasis_mul, - JetComponentSpace.basis_dB] - - -end JetComponentSpace - -/-! - -### B.3. Mass dimension on the component space - --/ - -/-- The mass-dimension scaling on the space of component functions of the - B boson: the diagonal map multiplying each component function `∂_s B_μ` by - `c ^ w`, where `w` is twice its mass dimension. -/ -noncomputable def JetComponentSpace.massWeightScale (c : ℝ) : - JetComponentSpace →ₗ[ℝ] JetComponentSpace := - JetComponentSpace.basis.constr ℝ fun j => - c ^ j.massWeight • JetComponentSpace.basis j - -@[simp] -lemma JetComponentSpace.massWeightScale_basis (c : ℝ) (j : JetGenerators) : - JetComponentSpace.massWeightScale c (JetComponentSpace.basis j) = - c ^ j.massWeight • JetComponentSpace.basis j := by - rw [JetComponentSpace.massWeightScale, Module.Basis.constr_basis] - -/-! - -### B.4. The Lorentz action on the component space - --/ -/-- The representation of the Lorentz group on the space of component functions - of the B boson: the derivative symbols transform through the real dual covector - action and the target factor through the dual of the B-boson representation. -/ -noncomputable def JetComponentSpace.repLorentzGroup : - Representation ℝ (SL(2,ℂ)) JetComponentSpace := - DerivAlgebraReal.repLorentzGroup.tprod BBoson.repLorentzGroup.dual - - -/-- **The shift is Lorentz covariant on the component space.** Appending `∂_μ` and then acting - is acting and then appending the transformed `∂_μ`, which is a combination of the `∂_a`. -/ -lemma JetComponentSpace.repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : - JetComponentSpace.repLorentzGroup Λ (jetDeriv μ v) = - ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • - jetDeriv a (JetComponentSpace.repLorentzGroup Λ v) := by - have hsym : DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis ({μ} : Multiset _)) = - ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • - LagrangianTheory.dualRealJetAlgebraBasis ({a} : Multiset _) := by - rw [dualRealJetAlgebraBasis_singleton, DerivAlgebraReal.repLorentzGroup_apply_ι, - Lorentz.CoVector.sl2Rep_dual_dualBasis, map_sum] - exact Finset.sum_congr rfl fun a _ => by - rw [map_smul, dualRealJetAlgebraBasis_singleton] - induction v using TensorProduct.induction_on with - | zero => simp - | add x y hx hy => - rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] - | tmul p f => - have hrep : ∀ q : SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector), - JetComponentSpace.repLorentzGroup Λ (q ⊗ₜ[ℝ] f) = - (DerivAlgebraReal.repLorentzGroup Λ q) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ f) := fun _ => rfl - rw [jetDeriv_tmul, hrep, hrep, DerivAlgebraReal.repLorentzGroup_apply_mul, hsym, - Finset.mul_sum, TensorProduct.sum_tmul] - exact Finset.sum_congr rfl fun a _ => by - rw [mul_smul_comm, jetDeriv_tmul, TensorProduct.smul_tmul'] - - -/-! - -### B.5. The gauge action on the component space: `mcShift` - -The jet gauge group does not act linearly on the B-boson fields. - -For a general gauge theory (potentially non-abelian), the *fields* transform by - -`∂_s B_μ ↦ ∂_s (g • B_μ) = ∂_s (Ad_g B_μ + mc(g)_μ) = ∂_s (Ad_g B_μ) + ∂_s mc(g)_μ` - -The last term in this expression is a real number. - -The jet algebra, however, is the algebra of polynomial *functions* of the jet -coordinates, on which the induced left action is the pullback along `g⁻¹`, - -`(g · f)(B) = f (g⁻¹ • B)`, - -so the component functions shift contragrediently to the fields, by -`mc(g⁻¹) = -mc(g)` rather than by `+mc(g)`: - -`g • [∂_s B_ν] = [∂_s B_ν] - ⟨mc(g), ∂_s B_ν⟩ · 1`. - -Pulling back along `g` instead would give a right action; that would still be a -representation here, but only because the `U(1)` translations are abelian, and -it would fail to be one for the `SU(2)` and `SU(3)` factors, whose Maurer–Cartan -cocycle satisfies `mc(g₁g₂) = Ad_{g₁} mc(g₂) + mc(g₁)`. The shift below carries -the contragredient sign for this reason. - --/ - -open LagrangianTheory - -/-- The Maurer–Cartan shift `-⟨mc, ∂_s B_ν⟩` of the component functions: minus - the component function evaluated against the B-boson whose components are the - factorial-weighted Taylor coefficients — the `s`-th derivatives at the base - point — of the Maurer–Cartan series. Equivalently the pairing of the *inverse* - jet, `⟨mc(U⁻¹), ·⟩`. The sign is the contragredient one: the fields shift by - `+mc`, the functions of them by `-mc`. -/ -noncomputable def mcShift (U : JetGaugeGroupI) : JetComponentSpace →ₗ[ℝ] ℝ := - - TensorProduct.lift ((Module.Dual.eval ℝ BBoson).comp - (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ fun m => - ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] ((∏ μ, Nat.factorial (m μ)) • maurerCartanU1Coeff U ν m)⟩)) - -/-- The Maurer–Cartan shift on a pure tensor over a derivative-symbol basis - vector: minus the component function evaluated on the B boson of - factorial-weighted Taylor coefficients of the Maurer–Cartan series. -/ -lemma mcShift_tmul_basis (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ BBoson) : - mcShift U (LagrangianTheory.dualRealJetAlgebraBasis s ⊗ₜ[ℝ] φ) = - - φ ⟨∑ ν, Lorentz.CoVector.basis ν ⊗ₜ[ℝ] - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - maurerCartanU1Coeff U ν (Multiset.toFinsupp s))⟩ := by - rw [dualRealJetAlgebraBasis_apply', mcShift, LinearMap.neg_apply, neg_inj] - show φ ((Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.constr ℝ _) - (Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s))) = _ - rw [Module.Basis.constr_basis] - -/-- The Maurer–Cartan shift on a general generator: minus the factorial-weighted - Taylor coefficient of the Maurer–Cartan series. -/ -lemma mcShift_basis_dB' (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) : - mcShift U (JetComponentSpace.basis (.dB s ν)) = - - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Multiset.toFinsupp s))) := by - rw [JetComponentSpace.basis_dB, mcShift_tmul_basis, neg_inj, - show (⟨∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = - ∑ ν', ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))) • basis ν' from by - rw [show (⟨∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))⟩ : BBoson) = - valLinEquiv.symm (∑ ν', Lorentz.CoVector.basis ν' ⊗ₜ[ℝ] - ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ)) • - maurerCartanU1Coeff U ν' (Multiset.toFinsupp s))) from rfl, map_sum] - refine Finset.sum_congr rfl fun ν' _ => ?_ - rw [valLinEquiv_symm_apply, mk_tmul_eq_smul_basis, map_nsmul], - map_sum] - simp only [map_smul, Module.Basis.dualBasis_apply_self, smul_eq_mul, mul_ite, - mul_one, mul_zero] - rw [Finset.sum_ite_eq' Finset.univ ν] - simp - -/-- The Maurer–Cartan shift on first-order generators: the shift of the component - function `∂_μ B_ν` is minus the first-order Taylor coefficient of the - Maurer–Cartan series. -/ -lemma mcShift_basis_dB (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : - mcShift U (JetComponentSpace.basis (.dB {μ} ν)) = - - Complex.selfAdjointEquiv (maurerCartanU1Coeff U ν (Finsupp.single μ 1)) := by - rw [mcShift_basis_dB', neg_inj, Multiset.toFinsupp_singleton, - show (∏ ρ, Nat.factorial ((Finsupp.single μ 1) ρ)) = 1 from - Finset.prod_eq_one fun ρ _ => by - rcases eq_or_ne μ ρ with rfl | h - · simp - · rw [Finsupp.single_eq_of_ne h.symm] - rfl, - one_smul] - -@[simp] -lemma mcShift_one : mcShift 1 = 0 := by - refine JetComponentSpace.basis.ext fun g => ?_ - obtain ⟨s, ν⟩ := g - simp [mcShift_basis_dB'] - -/-- The Maurer–Cartan shift is additive in the jet. -/ -lemma mcShift_mul (U V : JetGaugeGroupI) : - mcShift (U * V) = mcShift U + mcShift V := by - refine JetComponentSpace.basis.ext fun g => ?_ - obtain ⟨s, ν⟩ := g - simp only [mcShift_basis_dB', maurerCartanU1Coeff_mul, map_add, smul_add, - LinearMap.add_apply, neg_add] - -/-- The Maurer–Cartan shift of a jet of constant gauge transformations - vanishes. -/ -lemma mcShift_ofConstant (g : GaugeGroupI) : - mcShift (JetGaugeGroupI.ofConstant g) = 0 := by - refine JetComponentSpace.basis.ext fun j => ?_ - obtain ⟨s, ν⟩ := j - simp [mcShift_basis_dB'] - - -/-- The factorial weight of a multi-index augmented by one derivative: the - multiplicity of the new index times the original weight. -/ -lemma prod_factorial_add_single (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) (κ : Fin 1 ⊕ Fin 3) : - (∏ ρ : Fin 1 ⊕ Fin 3, Nat.factorial (((m + Finsupp.single κ 1) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ)) = - (m κ + 1) * ∏ ρ, Nat.factorial (m ρ) := by - rw [show (∏ ρ : Fin 1 ⊕ Fin 3, Nat.factorial (((m + Finsupp.single κ 1) : (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ)) = - ∏ ρ, ((if ρ = κ then m κ + 1 else 1) * Nat.factorial (m ρ)) from - Finset.prod_congr rfl fun ρ _ => by - rcases eq_or_ne ρ κ with rfl | h - · rw [Finsupp.add_apply, Finsupp.single_eq_same, Nat.factorial_succ, if_pos rfl] - · rw [Finsupp.add_apply, Finsupp.single_eq_of_ne h, add_zero, if_neg h, one_mul], - Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ κ] - simp - -/-- Exchanging the field index with a derivative index leaves the Maurer–Cartan - shift of the component functions unchanged: the shift is the jet of a gradient, - whose Taylor coefficients depend only on the total multi-index. -/ -lemma mcShift_basis_dB_symm (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - mcShift U (JetComponentSpace.basis (.dB (s + {μ}) ν)) = - mcShift U (JetComponentSpace.basis (.dB (s + {ν}) μ)) := by - rw [mcShift_basis_dB', mcShift_basis_dB', neg_inj, - show Multiset.toFinsupp (s + {μ}) = Multiset.toFinsupp s + Finsupp.single μ 1 from by - rw [map_add, Multiset.toFinsupp_singleton], - show Multiset.toFinsupp (s + {ν}) = Multiset.toFinsupp s + Finsupp.single ν 1 from by - rw [map_add, Multiset.toFinsupp_singleton], - prod_factorial_add_single, prod_factorial_add_single, mul_smul, mul_smul, - smul_comm (Multiset.toFinsupp s μ + 1), smul_comm (Multiset.toFinsupp s ν + 1)] - congr 1 - have h := congrArg Complex.selfAdjointEquiv - (maurerCartanU1Coeff_succ_symm U μ ν (Multiset.toFinsupp s)) - rw [map_nsmul, map_nsmul] at h - exact h - -/-! - -## C.1. The Maurer–Cartan shift series `mcShiftSeries` - -A matter field `ψ` in a representation `R` of `G` transforms linearly, -`ψ ↦ R(g) ψ`, with no inhomogeneous term, so its component functions obey - -`g • [∂_s ψ] = ∑ (x + y = s), C(x,y) (∂_x R(g⁻¹)) [∂_y ψ]` - -and the same index-displacement argument gives the corrections - -`D_t^ψ [∂_s ψ] = ∑ (x + y = s), C(x,y) (∂_{x+t} R(g⁻¹)) [∂_y ψ]` - -with `D_t^ψ (∂_ν x) = ∂_ν (D_t^ψ x) + D_{t+{ν}}^ψ x` exactly as before. - -Here is the asymmetry with the gauge sector, and it is visible by comparing the -two displayed formulas. There, abelian-ness made `∂_z M⁻¹` vanish and collapsed -the sum to a single constant. Here nothing collapses even for `G = U(1)`, -because the object being differentiated is not the adjoint action — which is -trivial — but the character `R(g⁻¹)`, which is a nonconstant jet. Every -coefficient `∂_x R(g⁻¹)` for `x ≤ s` acts. So the matter sector cannot be run on -one number per coordinate; it needs `R(g⁻¹)` as an element of `JetRing`, and its -action is implemented as the derivative action of that jet — adjoint to -multiplication, hence reading every Taylor coefficient — rather than as a -translation. - -Those coefficients are not independent. The Maurer–Cartan equation for the -inverse jet, - -`∂_ν R(g⁻¹) = -i dR(mc(g⁻¹)_ν) · R(g⁻¹)` - -determines all of them from `mc(g⁻¹)` and its derivatives, so the object -governing the matter corrections is again `∂_s mc(g⁻¹)_μ` — the very same jet -that appeared in the gauge-field transformation law. That object is -`mcShiftSeries`: - -`mcShiftSeries U μ [] = mc(U⁻¹)_μ = -mc(U)_μ` -`mcShiftSeries U μ (ν :: s) = ∂_ν (mcShiftSeries U μ s)` - -so `mcShiftSeries U μ s = ∂_s mc(U⁻¹)_μ` (`mcShiftSeries_nil`, -`mcShiftSeries_cons`). For nonabelian `G` the same definition applies with -`dR(mc(g⁻¹)_ν)` in place of the scalar, matrix-valued and with the ordering of -the display above; only the scalar case is formalised here. - -Carrying the inverse jet, rather than `mc(U)` with a sign attached, is what makes -`mcShift`, `mcDeriv` and `mcShiftSeries` three readings of *one* object, -`∂_s mc(g⁻¹)_μ`: its value at the base point, its values at displaced indices -packaged as a derivation, and the whole series. Concretely, - -`constantCoeff (mcShiftSeries U μ s) = mcShift U [∂_s B_μ]` - -(`constantCoeff_mcShiftSeries`), with no sign correction anywhere. - -For `U(1)` acting on matter through a character `χ = R(g⁻¹)` of charge `q`, the -Maurer–Cartan equation reads `∂_ν χ = -i q · mc(g⁻¹)_ν · χ`, and with the -covariant step written `D_ν = ∂_ν + c B_ν` this is - -`∂_ν χ = -c · (mcShiftSeries U ν []) · χ` - -This single identity is exactly what makes `D_ν` covariant: it is the only -hypothesis the covariance proof consumes. For the charged lepton `χ = u^6` and -`c = -6i`, giving `∂_ν (u^6) = 6i · (mcShiftSeries U ν []) · u^6` -(`pderiv_pow_unitary_mcShiftSeries`); for its conjugate `χ = star u ^ 6` and -`c = +6i`. --/ - -/-- The Maurer–Cartan shift series along an ordered list of directions: - `-∂_s mc_μ`, carrying the contragredient sign of `mcShift`. -/ -noncomputable def mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - List (Fin 1 ⊕ Fin 3) → JetRing - | [] => - maurerCartanU1 U μ - | ν :: s => pderiv ℂ ν (mcShiftSeries U μ s) - -@[simp] -lemma mcShiftSeries_nil (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - mcShiftSeries U μ [] = - maurerCartanU1 U μ := rfl - -@[simp] -lemma mcShiftSeries_cons (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) - (s : List (Fin 1 ⊕ Fin 3)) : - mcShiftSeries U μ (ν :: s) = pderiv ℂ ν (mcShiftSeries U μ s) := rfl - -/-- The factorial-weighted Taylor coefficients of the Maurer–Cartan shift series: - differentiating shifts the multi-index inside the factorial weight. -/ -lemma factorial_coeff_mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (s : List (Fin 1 ⊕ Fin 3)) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) * coeff m (mcShiftSeries U μ s) = - - (((∏ ρ, Nat.factorial (((m + Multiset.toFinsupp ↑s) : - (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ) : ℕ) : ℂ) * - coeff (m + Multiset.toFinsupp ↑s) (maurerCartanU1 U μ)) := by - induction s generalizing m with - | nil => simp - | cons ν s ih => - rw [mcShiftSeries_cons, coeff_pderiv] - have hT : Multiset.toFinsupp (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = - Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset (Fin 1 ⊕ Fin 3)) := by - rw [show (↑(ν :: s) : Multiset (Fin 1 ⊕ Fin 3)) = {ν} + ↑s from by - rw [Multiset.singleton_add, Multiset.cons_coe], - map_add, Multiset.toFinsupp_singleton] - have hcast : ((∏ ρ, Nat.factorial (((m + Finsupp.single ν 1) : - (Fin 1 ⊕ Fin 3) →₀ ℕ) ρ) : ℕ) : ℂ) = - ((m ν + 1 : ℕ) : ℂ) * ((∏ ρ, Nat.factorial (m ρ) : ℕ) : ℂ) := by - rw [← Nat.cast_mul, prod_factorial_add_single] - rw [hT, show m + (Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset _)) = - m + Finsupp.single ν 1 + Multiset.toFinsupp (↑s : Multiset _) from - (add_assoc _ _ _).symm, ← ih (m + Finsupp.single ν 1), hcast] - push_cast - ring - -/-- The Maurer–Cartan shift series is the generating function of the shifts: its - constant coefficient is the Maurer–Cartan shift of the corresponding B-boson - component function, with no sign correction. -/ -lemma constantCoeff_mcShiftSeries (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (s : List (Fin 1 ⊕ Fin 3)) : - MvPowerSeries.constantCoeff (mcShiftSeries U μ s) = - ((mcShift U (JetComponentSpace.basis (JetGenerators.dB ↑s μ)) : ℝ) : ℂ) := by - have h := factorial_coeff_mcShiftSeries U μ s 0 - simp only [Finsupp.coe_zero, Pi.zero_apply, Nat.factorial_zero, Finset.prod_const_one, - Nat.cast_one, one_mul, zero_add] at h - rw [← coeff_zero_eq_constantCoeff_apply, h, mcShift_basis_dB', nsmul_eq_mul] - push_cast - rw [Complex.coe_selfAdjointEquiv] - rfl - -lemma mcShift_dB_of_list_eq (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) : - (mcShift U (.basis (.dB ↑l ν)) : ℂ) = - MvPowerSeries.constantCoeff (mcShiftSeries U ν l) := by - have h := factorial_coeff_mcShiftSeries U ν l 0 - simp only [Finsupp.coe_zero, Pi.zero_apply, Nat.factorial_zero, Finset.prod_const_one, - Nat.cast_one, one_mul, zero_add] at h - rw [← coeff_zero_eq_constantCoeff_apply, h, mcShift_basis_dB', nsmul_eq_mul] - push_cast - rw [Complex.coe_selfAdjointEquiv] - rfl - -/-! - -## C.2. The Maurer–Cartan jet series and the exponential family - -The local gauge transformation of the B-boson field is the translation -`B_μ ↦ B_μ + i (∂_μ u) ū`, so a jet of gauge transformations shifts every -derivative coordinate `∂_s B_μ` of the field by the corresponding derivative -`∂_s (i ∂_μ u ū)(0)` of the Maurer–Cartan form at the base point. The zeroth -Taylor coefficient `maurerCartanU1Coeff U μ 0` records only the zeroth of these -shifts — enough for the action on the field itself, but not for the action on -its jets. - -To express the shift of every derivative coordinate uniformly we use the `U(1)` -Maurer–Cartan form `maurerCartanU1` of the jet gauge group: the formal power -series `i (∂_ν u) ū`, whose Taylor coefficients `maurerCartanU1Coeff` are the -shifts at every order. Its coefficients are hermitian, and it is -additive in the jet; these two facts make the induced shift of the B-boson -component functions a real-valued cocycle, which is what turns the substitution -`B ↦ B + i (∂u) ū` into a representation of the jet gauge group on the jet -algebra below. - --/ - -/-- `pderiv_pow_unitary` phrased in the Maurer–Cartan *shift* series rather than - the Maurer–Cartan form: `∂_ν (u^q) = q i (mcShift-series)_ν u^q`. The sign of - the scalar absorbs the contragredient sign of `mcShiftSeries`, which lets the - covariance proofs treat the series as an opaque jet and never split off a - negation. -/ -lemma pderiv_pow_unitary_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) - (q : ℕ) : - pderiv ℂ ν ((U.2.2 : JetRing) ^ q) = - MvPowerSeries.C ((q : ℂ) * Complex.I) * - (mcShiftSeries U ν [] * (U.2.2 : JetRing) ^ q) := by - rw [pderiv_pow_unitary, mcShiftSeries_nil] - rw [show (-maurerCartanU1 U ν) * (U.2.2 : JetRing) ^ q = - - (maurerCartanU1 U ν * (U.2.2 : JetRing) ^ q) from by ring, - show (MvPowerSeries.C ((q : ℂ) * Complex.I) : JetRing) = - MvPowerSeries.C (-(q : ℂ) * Complex.I) - from by rw [← map_neg]; ring_nf] - ring - -/-- The conjugate counterpart of `pderiv_pow_unitary_mcShiftSeries`. -/ -lemma pderiv_pow_unitary_star_mcShiftSeries (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) (q : ℕ) : - pderiv ℂ ν (star (U.2.2 : JetRing) ^ q) = - MvPowerSeries.C (-(q : ℂ) * Complex.I) * - (mcShiftSeries U ν [] * star (U.2.2 : JetRing) ^ q) := by - rw [pderiv_pow_unitary_star, mcShiftSeries_nil] - rw [show (-maurerCartanU1 U ν) * star (U.2.2 : JetRing) ^ q = - - (maurerCartanU1 U ν * star (U.2.2 : JetRing) ^ q) from by ring, - show (MvPowerSeries.C (-(q : ℂ) * Complex.I) : JetRing) = - MvPowerSeries.C ((q : ℂ) * Complex.I) - from by rw [← map_neg]; ring_nf] - ring - -/-! - -## D.1. The jet algebra - --/ - -/-- The jet algebra of the B boson: the commutative algebra generated by the - component functions of the B-boson field and its derivative coordinates. -/ -abbrev JetAlgebra : Type := SymmetricAlgebra ℝ JetComponentSpace - -namespace JetAlgebra - - -/-! - -## D.2. Constructing elements from the generators - --/ - -noncomputable def ofGenerator (x : JetGenerators) : BBoson.JetAlgebra := - SymmetricAlgebra.ι ℝ JetComponentSpace (BBoson.JetComponentSpace.basis x) - -/-! - -## D.3. The Lorentz representation on the jet algebra - -In a real and a complexified form. - --/ - - -/-! - -### D.3.1. The real form - --/ - - -noncomputable def repLorentzGroup : - Representation ℝ SL(2,ℂ) JetAlgebra where - toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' Λ1 Λ2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup (Λ1 * Λ2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ2)) by - rw [h]; rfl - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - simp [map_mul, Module.End.mul_apply] - -lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (a : JetAlgebra) : - repLorentzGroup Λ a = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ JetComponentSpace.repLorentzGroup Λ)) a := rfl - -lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : JetAlgebra) : - repLorentzGroup Λ (a * b) = repLorentzGroup Λ a * repLorentzGroup Λ b := by - simp [repLorentzGroup_apply] - -lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - repLorentzGroup Λ (1 : JetAlgebra) = 1 := by - simp [repLorentzGroup_apply] - -/-- The Lorentz action on a jet-algebra generator. -/ -@[simp] -lemma repLorentzGroup_apply_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace) : - repLorentzGroup Λ (SymmetricAlgebra.ι ℝ JetComponentSpace x) = - SymmetricAlgebra.ι ℝ JetComponentSpace - (JetComponentSpace.repLorentzGroup Λ x) := by - simp [repLorentzGroup_apply] - - - -/-- The multiset basis of the real dual derivative slots at the empty index. -/ -lemma _root_.StandardModel.BBoson.dualRealJetAlgebraBasis_nil : - LagrangianTheory.dualRealJetAlgebraBasis ({} : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by - have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) - ((0 : (Fin 1 ⊕ Fin 3) →₀ ℕ)) = 1 := by - rw [MvPolynomial.coe_basisMonomials] - simp [MvPolynomial.monomial_zero'] - rw [LagrangianTheory.dualRealJetAlgebraBasis, Module.Basis.reindex_apply, - Equiv.symm_symm, - show Multiset.toFinsupp.toEquiv ({} : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp, - Module.Basis.symmetricAlgebra, Module.Basis.map_apply, h] - simp - - -/-- The Lorentz action on the zeroth-order B-boson generator of the B-boson - jet algebra: the covector transformation. -/ -lemma repLorentzGroup_ofGenerator_dB_nil (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} μ)) = - ∑ ν, (Lorentz.SL2C.toLorentzGroup Λ).1 ν μ • - BBoson.JetAlgebra.ofGenerator (BBoson.JetGenerators.dB {} ν) := by - rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetComponentSpace.basis_dB, - show BBoson.JetComponentSpace.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {} ⊗ₜ[ℝ] - StandardModel.BBoson.basis.dualBasis μ) = - (DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {})) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ (StandardModel.BBoson.basis.dualBasis μ)) - from rfl, - BBoson.dualRealJetAlgebraBasis_nil, - show DerivAlgebraReal.repLorentzGroup Λ (1 : DerivAlgebraReal) = 1 from - map_one (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - Lorentz.CoVector.sl2Rep.dual Λ)), - BBoson.repLorentzGroup_dual_dualBasis, TensorProduct.tmul_sum, map_sum] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [TensorProduct.tmul_smul, map_smul, BBoson.JetAlgebra.ofGenerator, - BBoson.JetComponentSpace.basis_dB, BBoson.dualRealJetAlgebraBasis_nil] - -/-! - -### D.3.2. The complexified form - --/ - -noncomputable def complexRepLorentzGroup : Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] JetAlgebra) where - toFun U := LinearMap.baseChange ℂ (BBoson.JetAlgebra.repLorentzGroup U) - map_one' := by - ext x - simp [Module.End.one_eq_id] - map_mul' U V := by - ext x - simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] - -/-- The complexified Lorentz action agrees with the algebra homomorphism - obtained by tensoring the multiplicative lift defining the real action with - the identity of `ℂ`. -/ -lemma complexRepLorentzGroup_eq_algHom (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] JetAlgebra) : - complexRepLorentzGroup Λ x = - Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) - (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - JetComponentSpace.repLorentzGroup Λ)) x := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb] - | tmul c b => rfl - -/-- The complexified B-boson Lorentz action fixes the unit. -/ -lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] BBoson.JetAlgebra) = 1 := by - simp [complexRepLorentzGroup_eq_algHom] - -lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (a b : ℂ ⊗[ℝ] BBoson.JetAlgebra) : - complexRepLorentzGroup Λ (a * b) = - complexRepLorentzGroup Λ a * complexRepLorentzGroup Λ b := by - simp [complexRepLorentzGroup_eq_algHom] - -noncomputable def complexRepLorentzGroupAlgHom (Λ : SL(2,ℂ)) : - AlgHom ℂ (ℂ ⊗[ℝ] BBoson.JetAlgebra) (ℂ ⊗[ℝ] BBoson.JetAlgebra) where - toFun := complexRepLorentzGroup Λ - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - map_one' := complexRepLorentzGroup_apply_one Λ - map_mul' := complexRepLorentzGroup_apply_mul Λ - commutes' r := by simp [complexRepLorentzGroup_eq_algHom] - - -/-! - -## D.4. The gauge representation on the jet algebra - -In a real and a complexified form. This is the substitution action of -section B.5, extended to the algebra. - --/ - - -/-! - -### D.4.1. The real form - --/ - -/-- The action of the jet gauge group on the jet algebra of the B boson. The - adjoint action is trivial and the local gauge action is the Maurer–Cartan - translation, whose linear part is the identity; consequently no information is - carried by a linear action on the component space itself, and the action lives - on the unital algebra: a jet of gauge transformations acts as the substitution - automorphism sending each generator `x` to `x + mcShift U x • 1`, i.e. to - `x - ⟨mc, x⟩ 1`. This is the pullback along `U⁻¹` of the field translation - `B ↦ B + i (∂u) ū`, the contragredient action, which is what makes this a left - action rather than a right one. On jets of constant gauge transformations the - shift vanishes and the action is trivial, in agreement with - `repGaugeGroupI`. -/ -noncomputable def repJetGaugeGroupI : Representation ℝ JetGaugeGroupI JetAlgebra where - toFun U := (SymmetricAlgebra.lift - ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)).toLinearMap - map_one' := by - rw [show mcShift (1 : JetGaugeGroupI) = 0 from mcShift_one] - suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = - AlgHom.id ℝ JetAlgebra by - rw [hs] - rfl - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - simp - map_mul' U V := by - rw [show mcShift (U * V : JetGaugeGroupI) = - mcShift U + mcShift V from mcShift_mul U V] - suffices hs : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (mcShift U + mcShift V)) = - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)).comp - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift V)) by - rw [hs, AlgHom.comp_toLinearMap, Module.End.mul_eq_comp] - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - simp [add_assoc] - -/-- The jet gauge action on a generator of the jet algebra: the Maurer–Cartan - shift by the pairing of the component function with the Maurer–Cartan jet. -/ -@[simp] -lemma repJetGaugeGroupI_ι (U : JetGaugeGroupI) (x : JetComponentSpace) : - repJetGaugeGroupI U (SymmetricAlgebra.ι ℝ JetComponentSpace x) = - SymmetricAlgebra.ι ℝ JetComponentSpace x + - algebraMap ℝ JetAlgebra (mcShift U x) := by - simp [repJetGaugeGroupI, SymmetricAlgebra.lift_ι_apply, AlgHom.toLinearMap_apply, - Algebra.linearMap_apply] - -lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : - repJetGaugeGroupI U (x * y) = repJetGaugeGroupI U x * repJetGaugeGroupI U y := - map_mul (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) x y - -lemma repJetGaugeGroupI_algebraMap (U : JetGaugeGroupI) (r : ℝ) : - repJetGaugeGroupI U (algebraMap ℝ JetAlgebra r) = algebraMap ℝ JetAlgebra r := - AlgHom.commutes (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) r - -lemma repJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : - repJetGaugeGroupI U (1 : JetAlgebra) = 1 := by - have h := repJetGaugeGroupI_algebraMap U 1 - simpa using h - -lemma repJetGaugeGroupI_apply_B (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (ofGenerator (.dB {} μ)) = .ofGenerator (.dB {} μ) + - (mcShift U (.basis (.dB {} μ))) • 1 := by - rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repJetGaugeGroupI_ι, - BBoson.JetComponentSpace.basis_dB] - simp only [Multiset.empty_eq_zero, Basis.coe_dualBasis, add_right_inj] - exact Algebra.algebraMap_eq_smul_one ((mcShift U) (dualRealJetAlgebraBasis 0 ⊗ₜ[ℝ] basis.coord μ)) - -lemma repJetGaugeGroupI_apply_ofGenerator (U : JetGaugeGroupI) (s : List (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) : repJetGaugeGroupI U (ofGenerator (.dB s μ)) = - .ofGenerator (.dB s μ) + (mcShift U (.basis (.dB s μ))) • 1 := by - rw [BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.repJetGaugeGroupI_ι, - BBoson.JetComponentSpace.basis_dB] - simp only [Basis.coe_dualBasis, add_right_inj] - exact Algebra.algebraMap_eq_smul_one ((mcShift U) - (dualRealJetAlgebraBasis ↑s ⊗ₜ[ℝ] basis.coord μ)) - -/-- Jets of constant gauge transformations act trivially on the B-boson jet - algebra: the Maurer–Cartan shift vanishes. -/ -lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by - rw [show repJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ - mcShift (JetGaugeGroupI.ofConstant g))) x from rfl, - mcShift_ofConstant] - have h2 : SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ (0 : JetComponentSpace →ₗ[ℝ] ℝ)) = - AlgHom.id ℝ JetAlgebra := by - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) - simp - rw [h2] - rfl - -/-- Conjugating the jet gauge action by the polynomial coordinates of the jet - algebra: under `SymmetricAlgebra.equivMvPolynomial` the substitution - automorphism `x ↦ x + ⟨mc, x⟩ 1` becomes the translation of every polynomial - variable by the Maurer–Cartan pairing of the corresponding component - function. -/ -lemma equivMvPolynomial_repJetGaugeGroupI (U : JetGaugeGroupI) (V : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (repJetGaugeGroupI U V) = - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) := by - have h : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom.comp - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U)) = - (MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcShift U (JetComponentSpace.basis g)))).comp - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toAlgHom := by - refine SymmetricAlgebra.algHom_ext (JetComponentSpace.basis.ext fun g => ?_) - show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) - (SymmetricAlgebra.lift ((SymmetricAlgebra.ι ℝ JetComponentSpace) + - (Algebra.linearMap ℝ JetAlgebra) ∘ₗ mcShift U) - (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) = - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) - ((SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis) - (SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g))) - rw [SymmetricAlgebra.lift_ι_apply] - simp only [LinearMap.add_apply, LinearMap.coe_comp, Function.comp_apply, - Algebra.linearMap_apply, map_add, AlgEquiv.commutes, - SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.aeval_X, - MvPolynomial.algebraMap_eq] - exact DFunLike.congr_fun h V - - -noncomputable def repJetGaugeGroupIAlgHom (U : JetGaugeGroupI) : - AlgHom ℝ JetAlgebra JetAlgebra where - toFun := repJetGaugeGroupI U - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - map_one' := repJetGaugeGroupI_apply_one U - map_mul' := repJetGaugeGroupI_apply_mul U - commutes' r := by simp [repJetGaugeGroupI_algebraMap] - -lemma repJetGaugeGroupIAlgHom_apply (U : JetGaugeGroupI) (x : JetAlgebra) : - repJetGaugeGroupIAlgHom U x = repJetGaugeGroupI U x := rfl - -/-! - -### D.4.2. The complexified form - --/ - - -/-- The action of the jet gauge group on the complexified B-boson jet algebra, - obtained from the real representation by extension of scalars. -/ -noncomputable def complexRepJetGaugeGroupI : - Representation ℂ JetGaugeGroupI (ℂ ⊗[ℝ] BBoson.JetAlgebra) where - toFun U := LinearMap.baseChange ℂ (BBoson.JetAlgebra.repJetGaugeGroupI U) - map_one' := by - ext x - simp [Module.End.one_eq_id] - map_mul' U V := by - ext x - simp [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp] - -lemma complexRepJetGaugeGroupI_eq_algHom (U : JetGaugeGroupI) - (x : ℂ ⊗[ℝ] JetAlgebra) : - complexRepJetGaugeGroupI U x = - Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (repJetGaugeGroupIAlgHom U) x := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, map_add, ha, hb] - | tmul c b => rfl - -lemma complexRepJetGaugeGroupI_tmul (U : JetGaugeGroupI) (c : ℂ) (b : JetAlgebra) : - complexRepJetGaugeGroupI U (c ⊗ₜ[ℝ] b) = c ⊗ₜ[ℝ] repJetGaugeGroupI U b := rfl - -/-- The complexified gauge action is multiplicative. -/ -lemma complexRepJetGaugeGroupI_mul (U : JetGaugeGroupI) (x y : ℂ ⊗[ℝ] JetAlgebra) : - complexRepJetGaugeGroupI U (x * y) = - complexRepJetGaugeGroupI U x * complexRepJetGaugeGroupI U y := by - simp [complexRepJetGaugeGroupI_eq_algHom] - -lemma complexRepJetGaugeGroupI_one (U : JetGaugeGroupI) : - complexRepJetGaugeGroupI U (1 : ℂ ⊗[ℝ] JetAlgebra) = 1 := by - simp [complexRepJetGaugeGroupI_eq_algHom] - -lemma complexRepJetGaugeGroupI_one_tmul_one (U : JetGaugeGroupI) : - complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) = - (1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra) := by - rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_apply_one] - -/-- The complexified gauge action on a jet-algebra generator: the Maurer–Cartan - shift of the component function. -/ -lemma complexRepJetGaugeGroupI_ofGenerator (U : JetGaugeGroupI) (g : JetGenerators) : - complexRepJetGaugeGroupI U ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = - (1 : ℂ) ⊗ₜ[ℝ] ofGenerator g + - ((mcShift U (JetComponentSpace.basis g) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by - rw [complexRepJetGaugeGroupI_tmul, ofGenerator, repJetGaugeGroupI_ι, - TensorProduct.tmul_add, Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, - show ((mcShift U (JetComponentSpace.basis g) : ℝ) : ℂ) = - algebraMap ℝ ℂ (mcShift U (JetComponentSpace.basis g)) from rfl, - algebraMap_smul] - -/-- Jets of constant gauge transformations act trivially on the complexified - B-boson jet algebra. -/ -lemma complexRepJetGaugeGroupI_ofConstant (g : GaugeGroupI) - (x : ℂ ⊗[ℝ] JetAlgebra) : - complexRepJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x = x := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => rw [map_add, ha, hb] - | tmul z b => rw [complexRepJetGaugeGroupI_tmul, repJetGaugeGroupI_ofConstant] - -noncomputable def complexRepJetGaugeGroupIAlgHom (U : JetGaugeGroupI) : - AlgHom ℂ (ℂ ⊗[ℝ] JetAlgebra) (ℂ ⊗[ℝ] JetAlgebra) where - toFun := complexRepJetGaugeGroupI U - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - map_one' := complexRepJetGaugeGroupI_one U - map_mul' := complexRepJetGaugeGroupI_mul U - commutes' r := by simp [complexRepJetGaugeGroupI_eq_algHom] - -/-! - -## E.1. The formal total derivative - -The formal total spacetime derivative `∂_μ` acts on the component functions of -the B-boson jet by appending the derivative index, `∂_s B_ν ↦ ∂_{s + {μ}} B_ν`, -and extends to the jet algebra as a derivation. It is constructed through the -polynomial coordinates of the jet algebra. - --/ - -/-- The formal total spacetime derivative on the B-boson jet algebra in the - direction `μ`: the derivation sending each component function `∂_s B_ν` to - `∂_{s + {μ}} B_ν`. -/ -noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℝ] JetAlgebra := - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toLinearMap ∘ₗ - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.X (JetGenerators.shift μ g) : - MvPolynomial JetGenerators ℝ)).toLinearMap ∘ₗ - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toLinearMap - -/-- The total derivative appends the derivative index to each component - function. -/ -@[simp] -lemma jetDeriv_ofGenerator (μ : Fin 1 ⊕ Fin 3) (g : JetGenerators) : - jetDeriv μ (ofGenerator g) = ofGenerator (JetGenerators.shift μ g) := by - simp only [jetDeriv, ofGenerator, LinearMap.coe_comp, Function.comp_apply, - AlgEquiv.toLinearMap_apply, Derivation.coeFn_coe] - rw [SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.mkDerivation_X, - SymmetricAlgebra.equivMvPolynomial_symm_X] - -@[simp] -lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv μ (1 : JetAlgebra) = 0 := by - simp [jetDeriv] - - -/-- The jet derivative on a linear generator is the component-space shift. -/ -lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace) : - jetDeriv μ (SymmetricAlgebra.ι ℝ JetComponentSpace v) = - SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.jetDeriv μ v) := by - have key : (jetDeriv μ) ∘ₗ (SymmetricAlgebra.ι ℝ JetComponentSpace) = - (SymmetricAlgebra.ι ℝ JetComponentSpace) ∘ₗ (JetComponentSpace.jetDeriv μ) := by - refine JetComponentSpace.basis.ext fun g => ?_ - cases g with - | dB s ν => - simp only [LinearMap.coe_comp, Function.comp_apply, - show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis (.dB s ν)) = - ofGenerator (.dB s ν) from rfl, - jetDeriv_ofGenerator, JetGenerators.shift_dB, - JetComponentSpace.jetDeriv_basis] - rfl - exact DFunLike.congr_fun key v - -/-- The total derivative is a derivation: the Leibniz rule on the jet algebra. -/ -lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : JetAlgebra) : - jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by - simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, - AlgEquiv.toLinearMap_apply, map_mul, Derivation.coeFn_coe, Derivation.leibniz, - smul_eq_mul, map_add, AlgEquiv.symm_apply_apply] - ring - -lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by - induction x using SymmetricAlgebra.induction with - | algebraMap r => simp [Algebra.algebraMap_eq_smul_one] - | ι v => - have key : (jetDeriv μ) ∘ₗ (jetDeriv ν) ∘ₗ - (SymmetricAlgebra.ι ℝ JetComponentSpace) = - (jetDeriv ν) ∘ₗ (jetDeriv μ) ∘ₗ - (SymmetricAlgebra.ι ℝ JetComponentSpace) := by - refine JetComponentSpace.basis.ext fun g => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply, - show ∀ h : JetGenerators, - SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis h) = - ofGenerator h from fun _ => rfl, - jetDeriv_ofGenerator, JetGenerators.shift_comm] - exact DFunLike.congr_fun key v - | mul a b ha hb => - simp only [jetDeriv_mul, map_add, ha, hb] - abel - | add a b ha hb => simp only [map_add, ha, hb] - -/-- The Leibniz rule for the complexified total derivative on the complexified - jet algebra. -/ -lemma jetDeriv_baseChange_mul (μ : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] JetAlgebra) : - LinearMap.baseChange ℂ (jetDeriv μ) (x * y) = - LinearMap.baseChange ℂ (jetDeriv μ) x * y + - x * LinearMap.baseChange ℂ (jetDeriv μ) y := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [add_mul, map_add, ha, hb] - ring - | tmul c b => - induction y using TensorProduct.induction_on with - | zero => simp - | add a' b' ha' hb' => - simp only [mul_add, map_add, ha', hb'] - ring - | tmul c' b' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, - jetDeriv_mul, TensorProduct.tmul_add] - -lemma jetDeriv_baseChange_comm (μ ν : Fin 1 ⊕ Fin 3) (x : ℂ ⊗[ℝ] JetAlgebra) : - LinearMap.baseChange ℂ (jetDeriv μ) (LinearMap.baseChange ℂ (jetDeriv ν) x) = - LinearMap.baseChange ℂ (jetDeriv ν) (LinearMap.baseChange ℂ (jetDeriv μ) x) := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [map_add, ha, hb] - | tmul c b => - simp only [LinearMap.baseChange_tmul, jetDeriv_comm] - -/-- The complexified total derivative on a jet-algebra generator. -/ -lemma jetDeriv_baseChange_ofGenerator (ν : Fin 1 ⊕ Fin 3) (g : JetGenerators) : - LinearMap.baseChange ℂ (jetDeriv ν) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = - (1 : ℂ) ⊗ₜ[ℝ] ofGenerator (JetGenerators.shift ν g) := by - rw [LinearMap.baseChange_tmul, jetDeriv_ofGenerator] - -/-- The polynomial coordinates of the total derivative. -/ -lemma equivMvPolynomial_jetDeriv (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (jetDeriv ν x) = - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by - simp only [jetDeriv, LinearMap.coe_comp, Function.comp_apply, - AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, Derivation.coeFn_coe] - -/-! - -## E.2. The Maurer–Cartan correction derivations `mcDeriv` - -A local gauge transformation changes the B boson by a gradient, `δB_μ = ∂_μλ` -with `λ` the phase of the `U(1)` jet (the Maurer–Cartan form is closed, -`pderiv_maurerCartanU1_symm`). On genuine field configurations this variation -commutes with differentiation, since `δ(∂_s B_μ) = ∂_s ∂_μ λ`. The jet algebra, -however, remembers of `λ` only its Taylor coefficients at the base point: the -gauge action shifts each coordinate `∂_s B_μ` by the frozen constant -`⟨mc, ∂_s B_μ⟩ = (∂_s ∂_μ λ)(0)`, and the formal total derivative annihilates -constants while sending `∂_s B_μ` to `∂_{s+ν} B_μ`. Differentiating after -transforming therefore drops exactly the term that, on fields, would come from -the derivative hitting the gauge parameter. - -The correction derivation `mcDeriv U t` reinstates that term as an operator: -"differentiation acting on the gauge parameter instead of the field", the -derivation sending each component function `∂_s B_ν` to the constant -`⟨mc, ∂_{s+t} B_ν⟩`. The commutator of the gauge action with the total -derivative is the gauge action composed with the weight-`{ν}` correction -(`repJetGaugeGroupI_jetDeriv`), and commuting a correction past a further -derivative raises its weight (`mcDeriv_jetDeriv`), so the corrections close -into an algebra. - -This algebra is what makes covariant derivatives of charged fields covariant: -in `D_μψ = ∂_μψ - i q B_μ ψ` the gauge shift of `B_μ` must cancel the -derivative of the hypercharge character produced by `∂_μ` acting on the -transformed `ψ`, and at higher orders the iterated derivatives of the gauge -parameter on both sides are matched precisely by the anomaly operators built -from `mcDeriv`, which annihilate the covariant derivatives (see -`LeptonGaugeSector.JetAlgebra`). - -### Two orders: transforming then differentiating, and the reverse - -There are two operations on the algebra of component functions, and the whole -theory of covariant derivatives comes from the fact that they do not commute. - -The first is the **total derivative** `∂_ν`, the derivation which raises the -derivative index of a coordinate, - -`∂_ν [∂_s A_μ^a] = [∂_{s+ν} A_μ^a]`, - -extended to products by the Leibniz rule. Note what it does *not* see: the -numbers `∂_x M⁻¹` and `∂_s mc(g⁻¹)` appearing in the transformation law are -functions of `g` alone and not of the field configuration, so they are constants -of this algebra and `∂_ν` annihilates them. - -The second is the **gauge action** `g •`, the algebra automorphism given on -generators by the law above. - -Applying the group action first and then differentiating gives - -`∂_ν (g • [∂_s A_μ^a]) = ∑ (x + y = s), C(x,y) (∂_x M⁻¹)^a_b [∂_{y+ν} A_μ^b]` - -— the inhomogeneous term has been killed, and the new derivative has landed on -the field in every term. Differentiating first and then acting gives instead - -`g • (∂_ν [∂_s A_μ^a]) = g • [∂_{s+ν} A_μ^a] =` -` ∑ (x + y = s + ν), C(x,y) (∂_x M⁻¹)^a_b [∂_y A_μ^b] + ∂_{s+ν} mc(g⁻¹)_μ^a` - -and now the decompositions of `s + ν` distribute the new derivative over *both* -factors. Subtracting, the difference is precisely the terms in which it fell on -the transformation data rather than on the field: - -`(g • ∂_ν - ∂_ν g •) [∂_s A_μ^a] =` -` ∑ (x + y = s), C(x,y) (∂_{x+ν} M⁻¹)^a_b [∂_y A_μ^b] + ∂_{s+ν} mc(g⁻¹)_μ^a` - -This defect is not a derivation, but a `g`-twisted one: -`(g • ∂_ν - ∂_ν g •)(XY) = ((g • ∂_ν - ∂_ν g •) X)(g • Y) + (g • X)((g • ∂_ν - ∂_ν g •) Y)`. -Untwisting it by `g` gives an honest derivation, and that is how it is packaged: - -`g • (∂_ν X) = ∂_ν (g • X) + g • (mcDeriv_ν X)` - -(`repJetGaugeGroupI_jetDeriv`), with `mcDeriv_ν = (g •)⁻¹ ∘ (g • ∂_ν - ∂_ν g •)`. - -In the abelian case `M ≡ 1`, so every `∂_{x+ν} M⁻¹` vanishes — the index `x + ν` -is never zero — and the entire first sum disappears. All that survives is the -Maurer–Cartan term, a *constant*: - -`mcDeriv U {ν} [∂_s B_μ] = ∂_{s+ν} mc(g⁻¹)_μ = mcShift U [∂_{s+ν} B_μ] · 1` - -### The general recursion, and why the weight is a multiset - -One commutation is not enough, because a covariant derivative is applied -repeatedly: having moved `g •` past `∂_ν` we are left holding a correction term, -and the next step differentiates that. So we need to know how the correction -itself commutes with `∂`, and the answer has to be uniform enough to iterate. - -Two general facts do the work, neither of them abelian. - -First, the defect is a *twisted* derivation. Writing `ρ := (g •)`, which is an -algebra automorphism, and `∂_ν`, which is a derivation, the operator -`ρ ∘ ∂_ν - ∂_ν ∘ ρ` satisfies - -`(ρ ∂_ν - ∂_ν ρ)(X Y) = ((ρ ∂_ν - ∂_ν ρ) X)(ρ Y) + (ρ X)((ρ ∂_ν - ∂_ν ρ) Y)` - -so it is not a derivation, but `ρ⁻¹ ∘ (ρ ∂_ν - ∂_ν ρ)` is one. That untwisted -operator is the correction, and it is what makes the identity - -`g • (∂_ν X) = ∂_ν (g • X) + g • (correction_ν X)` - -hold with `g •` sitting on the outside of the correction term. - -Second, the corrections form a family indexed by a multiset, obtained by -displacing the derivative indices of the transformation data. For a multiset `t` -let `D_t` be the map on generators - -`D_t [∂_s A_μ^a] = ∑ (x + y = s), C(x,y) (∂_{x+t} M⁻¹)^a_b [∂_y A_μ^b]` -` + ∂_{s+t} mc(g⁻¹)_μ^a` - -— literally the transformation law with every index of `M⁻¹` and `mc(g⁻¹)` -pushed `t` further along, so that `D_0` is the gauge action itself. Since `∂_ν` -annihilates the coefficients `∂_x M⁻¹` and `∂_s mc(g⁻¹)` (they depend on `g`, not -on the field) and acts only on `[∂_y A_μ^b]`, splitting the decompositions of -`s + ν` according to whether the new index lands on the field or on the data -gives, on generators, - -`D_t (∂_ν x) = ∂_ν (D_t x) + D_{t + {ν}} x` - -for every `t`. This is the general recursion: commuting past one more derivative -displaces the weight by one more index, and nothing else changes. The weight is -a *multiset* because the total derivatives commute, `∂_ρ ∂_σ = ∂_σ ∂_ρ`, so only -the multiplicity of each direction is remembered. Contrast the derivative history -of a covariant derivative, which is a `List`: covariant derivatives do not -commute, their commutator being the field strength. - -### What the abelian case buys - -Everything above holds for any `G`. The abelian case is easier for one reason: -`M ≡ 1`, so `∂_z M⁻¹ = 0` for every `z ≠ 0`. For `t ≠ 0` the index `x + t` is -never zero, so the entire first sum vanishes and only the inhomogeneous term -survives: - -`D_t [∂_s B_μ] = ∂_{s+t} mc(g⁻¹)_μ = mcShift U [∂_{s+t} B_μ]` - -The corrections are therefore *constants*, and two simplifications follow. Since -`ρ` fixes constants, `ρ⁻¹` does too, so the untwisting is invisible and the -correction can simply be *defined* as the derivation sending each generator to -that constant — this is `mcDeriv U t`: - -`mcDeriv U t [∂_s B_μ] = mcShift U [∂_{s+t} B_μ] · 1` - -(`mcDeriv_ofGenerator`), with the general recursion becoming - -`mcDeriv U t (∂_ν x) = ∂_ν (mcDeriv U t x) + mcDeriv U (t + {ν}) x` - -(`mcDeriv_jetDeriv`). And because the values are constants rather than -coordinates, the family never grows in complexity: the induction closes on the -single-parameter family `{mcDeriv U t}` indexed by how far along the jet -`mc(g⁻¹)_μ` is being read. In particular `mcDeriv U 0` sends each coordinate to -its own `mcShift`. - -For nonabelian `G` neither simplification is available: the `Ad`-terms survive, -the corrections are coordinate-valued rather than constant, and the untwisting by -`ρ⁻¹` is genuine. The recursion `D_t ∂_ν = ∂_ν D_t + D_{t+{ν}}` is still what -organises them. - -### Where the two meet - -Both readings appear together in the Maurer–Cartan anomaly operators of the lepton–gauge-sector -jet algebra (`LeptonGaugeSector.JetAlgebra.anomalyM`): `mcDeriv` from the gauge-field -coordinates, `mcShift` from the `c B_ν` term of the covariant step, and -`mcShiftSeries` from the matter coordinates. Covariance is the statement that -these cancel, and at the base point the cancellation is term-for-term between -`c · mcShift` and `c · constantCoeff (mcShiftSeries)` -(`LeptonGaugeSector.JetAlgebra.anomalyM_baseM`) — which is an identity of syntax, not of -computation, precisely because the two carry the same sign. --/ - -/-- The Maurer–Cartan correction derivation of weight `t` of a `U(1)` jet: the - derivation of the B-boson jet algebra sending the component function `∂_s B_ν` - to the constant `⟨mc, ∂_{s+t} B_ν⟩`. -/ -noncomputable def mcDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) : - JetAlgebra →ₗ[ℝ] JetAlgebra := - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toLinearMap ∘ₗ - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)).toLinearMap ∘ₗ - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).toLinearMap - -@[simp] -lemma mcDeriv_ofGenerator (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) - (g : JetGenerators) : - mcDeriv U t (ofGenerator g) = algebraMap ℝ JetAlgebra - (mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g))) := by - simp only [mcDeriv, ofGenerator, LinearMap.coe_comp, Function.comp_apply, - AlgEquiv.toLinearMap_apply, Derivation.coeFn_coe] - rw [SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.mkDerivation_X, - ← MvPolynomial.algebraMap_eq] - exact AlgEquiv.commutes _ _ - -@[simp] -lemma mcDeriv_one (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) : - mcDeriv U t (1 : JetAlgebra) = 0 := by - simp [mcDeriv] - -/-- The correction derivations satisfy the Leibniz rule. -/ -lemma mcDeriv_mul (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) - (x y : JetAlgebra) : - mcDeriv U t (x * y) = mcDeriv U t x * y + x * mcDeriv U t y := by - simp only [mcDeriv, LinearMap.coe_comp, Function.comp_apply, - AlgEquiv.toLinearMap_apply, map_mul, Derivation.coeFn_coe, Derivation.leibniz, - smul_eq_mul, map_add, AlgEquiv.symm_apply_apply] - ring - -/-- The complexified Leibniz rule for the correction derivations. -/ -lemma mcDeriv_baseChange_mul (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) - (x y : ℂ ⊗[ℝ] JetAlgebra) : - LinearMap.baseChange ℂ (mcDeriv U t) (x * y) = - LinearMap.baseChange ℂ (mcDeriv U t) x * y + - x * LinearMap.baseChange ℂ (mcDeriv U t) y := by - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [add_mul, map_add, ha, hb] - ring - | tmul c b => - induction y using TensorProduct.induction_on with - | zero => simp - | add a' b' ha' hb' => - simp only [mul_add, map_add, ha', hb'] - ring - | tmul c' b' => - simp only [Algebra.TensorProduct.tmul_mul_tmul, LinearMap.baseChange_tmul, - mcDeriv_mul, TensorProduct.tmul_add] - -/-- The polynomial coordinates of the correction derivations. -/ -lemma equivMvPolynomial_mcDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) - (x : JetAlgebra) : - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis (mcDeriv U t x) = - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis x) := by - simp only [mcDeriv, LinearMap.coe_comp, Function.comp_apply, - AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, Derivation.coeFn_coe] - -/-- Commutation of the correction derivations with the total derivative: the - weight of the correction absorbs the derivative index. -/ -lemma mcDeriv_jetDeriv (U : JetGaugeGroupI) (t : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - mcDeriv U t (jetDeriv ν x) = - jetDeriv ν (mcDeriv U t x) + mcDeriv U (t + {ν}) x := by - have key : ∀ p : MvPolynomial JetGenerators ℝ, - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) - ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) - ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti t g))) : MvPolynomial JetGenerators ℝ)) p) + - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti (t + {ν}) g))) : MvPolynomial JetGenerators ℝ)) p := by - intro p - induction p using MvPolynomial.induction_on with - | C a => - simp [MvPolynomial.derivation_C] - | add p q hp hq => - simp only [map_add, hp, hq] - ring - | mul_X p g ih => - have hlam : mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti t (JetGenerators.shift ν g))) = - mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti (t + {ν}) g)) := by - rw [JetGenerators.shiftMulti_shift] - simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, - MvPolynomial.derivation_C, map_add, mul_zero, zero_add] - rw [ih, hlam] - ring - rw [show mcDeriv U t (jetDeriv ν x) = - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis - (mcDeriv U t (jetDeriv ν x))) from - (AlgEquiv.symm_apply_apply _ _).symm, - equivMvPolynomial_mcDeriv, equivMvPolynomial_jetDeriv, key, map_add, - ← equivMvPolynomial_mcDeriv U t x, ← equivMvPolynomial_jetDeriv ν (mcDeriv U t x), - AlgEquiv.symm_apply_apply, ← equivMvPolynomial_mcDeriv U (t + {ν}) x, - AlgEquiv.symm_apply_apply] - -/-- Commutation of the jet gauge action with the total derivative: the - substitution action commutes with `∂_ν` up to the Maurer–Cartan correction - derivation of weight `{ν}`. -/ -lemma repJetGaugeGroupI_jetDeriv (U : JetGaugeGroupI) (ν : Fin 1 ⊕ Fin 3) - (x : JetAlgebra) : repJetGaugeGroupI U (jetDeriv ν x) = - jetDeriv ν (repJetGaugeGroupI U x) + repJetGaugeGroupI U (mcDeriv U {ν} x) := by - have key : ∀ p : MvPolynomial JetGenerators ℝ, - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) - ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) p) = - (MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.X (JetGenerators.shift ν g) : MvPolynomial JetGenerators ℝ)) - (MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) p) + - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (mcShift U (JetComponentSpace.basis g))) - ((MvPolynomial.mkDerivation ℝ fun g : JetGenerators => - (MvPolynomial.C (mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti {ν} g))) : MvPolynomial JetGenerators ℝ)) p) := by - intro p - induction p using MvPolynomial.induction_on with - | C a => - simp [MvPolynomial.derivation_C, MvPolynomial.algebraMap_eq] - | add p q hp hq => - simp only [map_add, hp, hq] - ring - | mul_X p g ih => - have hlam : mcShift U (JetComponentSpace.basis (JetGenerators.shift ν g)) = - mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti {ν} g)) := by - rw [JetGenerators.shiftMulti_singleton] - simp only [Derivation.leibniz, smul_eq_mul, MvPolynomial.mkDerivation_X, - MvPolynomial.derivation_C, map_add, map_mul, add_zero, - MvPolynomial.aeval_X, MvPolynomial.aeval_C, MvPolynomial.algebraMap_eq] - rw [ih, hlam] - ring - rw [show repJetGaugeGroupI U (jetDeriv ν x) = - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis - (repJetGaugeGroupI U (jetDeriv ν x))) from - (AlgEquiv.symm_apply_apply _ _).symm, - equivMvPolynomial_repJetGaugeGroupI, equivMvPolynomial_jetDeriv, key, map_add, - ← equivMvPolynomial_repJetGaugeGroupI U x, - ← equivMvPolynomial_jetDeriv ν (repJetGaugeGroupI U x), - ← equivMvPolynomial_mcDeriv U {ν} x, - ← equivMvPolynomial_repJetGaugeGroupI U (mcDeriv U {ν} x), - AlgEquiv.symm_apply_apply] - congr 1 - exact AlgEquiv.symm_apply_apply _ _ - -/-- The complexified commutation of the gauge action with the total - derivative. -/ -lemma complexRepJetGaugeGroupI_baseChange_jetDeriv (U : JetGaugeGroupI) - (ν : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] JetAlgebra) : - complexRepJetGaugeGroupI U (LinearMap.baseChange ℂ (jetDeriv ν) y) = - LinearMap.baseChange ℂ (jetDeriv ν) (complexRepJetGaugeGroupI U y) + - complexRepJetGaugeGroupI U - (LinearMap.baseChange ℂ (mcDeriv U {ν}) y) := by - induction y using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [map_add, ha, hb] - abel - | tmul c b => - simp only [LinearMap.baseChange_tmul, complexRepJetGaugeGroupI_tmul, - repJetGaugeGroupI_jetDeriv, TensorProduct.tmul_add] - -/-- The complexified commutation of the correction derivations with the total - derivative. -/ -lemma mcDeriv_baseChange_jetDeriv (U : JetGaugeGroupI) - (t : Multiset (Fin 1 ⊕ Fin 3)) (ν : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] JetAlgebra) : - LinearMap.baseChange ℂ (mcDeriv U t) (LinearMap.baseChange ℂ (jetDeriv ν) y) = - LinearMap.baseChange ℂ (jetDeriv ν) - (LinearMap.baseChange ℂ (mcDeriv U t) y) + - LinearMap.baseChange ℂ (mcDeriv U (t + {ν})) y := by - induction y using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => - simp only [map_add, ha, hb] - abel - | tmul c b => - simp only [LinearMap.baseChange_tmul, mcDeriv_jetDeriv, TensorProduct.tmul_add] - - -/-- The complexified correction derivation on a jet-algebra generator. -/ -lemma mcDeriv_baseChange_ofGenerator (U : JetGaugeGroupI) - (t : Multiset (Fin 1 ⊕ Fin 3)) (g : JetGenerators) : - LinearMap.baseChange ℂ (mcDeriv U t) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator g) = - ((mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) • - ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)) := by - rw [LinearMap.baseChange_tmul, mcDeriv_ofGenerator, Algebra.algebraMap_eq_smul_one, - TensorProduct.tmul_smul, - show ((mcShift U (JetComponentSpace.basis (JetGenerators.shiftMulti t g)) : ℝ) : ℂ) = - algebraMap ℝ ℂ (mcShift U (JetComponentSpace.basis - (JetGenerators.shiftMulti t g))) from rfl, - algebraMap_smul] - -/-! - -## F.1. The field strength - --/ - -/-- The field strength of the B boson: the antisymmetrized derivative of the - component functions, which is gauge-invariant. -/ -noncomputable def fieldStrength (μ ν : Fin 1 ⊕ Fin 3) : BBoson.JetAlgebra := - ofGenerator (JetGenerators.dB {μ} ν) - ofGenerator (JetGenerators.dB {ν} μ) - -lemma fieldStrength_antisymm (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrength μ ν = -fieldStrength ν μ := by - simp [fieldStrength] - -lemma repJetGaugeGroupI_fieldStrength (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (fieldStrength μ ν) = fieldStrength μ ν := by - simp only [fieldStrength, map_sub, ofGenerator, repJetGaugeGroupI_ι, mcShift_basis_dB] - rw [maurerCartanU1Coeff_single_symm] - abel - -noncomputable def fieldStrengthDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra := - ofGenerator (JetGenerators.dB (s + {μ}) ν) - ofGenerator (JetGenerators.dB (s + {ν}) μ) - -lemma fieldStrengthDeriv_antisymm (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv s μ ν = -fieldStrengthDeriv s ν μ := by - simp [fieldStrengthDeriv] - -lemma repJetGaugeGroupI_fieldStrengthDeriv (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - repJetGaugeGroupI U (fieldStrengthDeriv s μ ν) = fieldStrengthDeriv s μ ν := by - simp only [fieldStrengthDeriv, map_sub, ofGenerator, repJetGaugeGroupI_ι] - rw [mcShift_basis_dB_symm] - abel - -lemma fieldStrengthDeriv_bianchi_identity (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν ρ : Fin 1 ⊕ Fin 3) : - fieldStrengthDeriv (s + {μ}) ν ρ + fieldStrengthDeriv (s + {ν}) ρ μ + - fieldStrengthDeriv (s + {ρ}) μ ν = 0 := by - simp only [fieldStrengthDeriv] - grind - - -/-! - -## F.2. Classification of the gauge invariants - -We now want to show that the if an element of the jet algebra is invariant under -the action of the jet gauge group, then it is a polynomial -in the field strength and its derivatives. - --/ - - -/-! - -### F.2.1. Gauge realization of translations of the jet coordinates - -The gauge invariants of the B-boson jet algebra are computed below by realizing -arbitrary translations of the jet coordinates through explicit local `U(1)` gauge -transformations: the jets `exp(-i a X^w)` of exponentials of a single spacetime -monomial, embedded in the jet gauge group with trivial colour and weak factors. -The exponential property `exp(c X^w) exp(c' X^w) = exp((c + c') X^w)` of the -underlying series gives unitarity, and the chain rule gives the Maurer–Cartan -form: the jet of the gradient `a ∂_ν X^w`. For every nonzero symmetrized -multi-index `t` and every real `r`, the transformation `exp(-i a X^t)` with -`a = r / t!` shifts every component function with total multi-index `t` by -exactly `r`, and all others by nothing. - --/ - -open Classical in -/-- The jet of the local `U(1)` gauge transformation `exp(-i a X^w)`: the - exponential of an imaginary multiple of a spacetime monomial — the power series - `∑ₙ ((-i a)ⁿ/n!) X^{n w}`, defined coefficientwise, unitary by the exponential - property — embedded in the jet gauge group with trivial colour and weak - factors. -/ -noncomputable def expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - JetGaugeGroupI := - let F : ℂ → JetRing := fun c k => if h : ∃ n : ℕ, k = n • w then - c ^ h.choose / (h.choose.factorial : ℂ) else 0 - (1, 1, ⟨F (-(a : ℂ) * Complex.I), by - classical - have hex : ∃ ρ, w ρ ≠ 0 := (Finsupp.ne_iff.mp hw).imp fun _ h => by simpa using h - have hcancel : ∀ {n m : ℕ}, n • w = m • w → n = m := by - intro n m h - obtain ⟨ρ, hρ⟩ := hex - exact Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero hρ) - (by simpa using DFunLike.congr_fun h ρ) - have hnsmul : ∀ (c : ℂ) (n : ℕ), coeff (n • w) (F c) = c ^ n / (n.factorial : ℂ) := by - intro c n - have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ - show (if h : ∃ m : ℕ, n • w = m • w then c ^ h.choose / (h.choose.factorial : ℂ) - else 0) = _ - rw [dif_pos h, show h.choose = n from (hcancel h.choose_spec).symm] - have hne : ∀ (c : ℂ) {k : (Fin 1 ⊕ Fin 3) →₀ ℕ}, (∀ n : ℕ, k ≠ n • w) → - coeff k (F c) = 0 := by - intro c k hk - show (if h : ∃ n : ℕ, k = n • w then c ^ h.choose / (h.choose.factorial : ℂ) - else 0) = 0 - rw [dif_neg (not_exists.mpr hk)] - have hmul : ∀ c c' : ℂ, F c * F c' = F (c + c') := by - intro c c' - ext k - by_cases hk : ∃ n : ℕ, k = n • w - · obtain ⟨N, rfl⟩ := hk - rw [coeff_mul, hnsmul] - have hsub : (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) ⊆ - Finset.antidiagonal (N • w) := by - intro p hp - obtain ⟨n, hn, rfl⟩ := Finset.mem_image.mp hp - rw [Finset.mem_antidiagonal, ← add_smul, - Nat.add_sub_cancel' (Nat.lt_succ_iff.mp (Finset.mem_range.mp hn))] - have hvanish : ∀ p ∈ Finset.antidiagonal (N • w), - p ∉ (Finset.range (N + 1)).image (fun n => (n • w, (N - n) • w)) → - coeff p.1 (F c) * coeff p.2 (F c') = 0 := by - intro p hp hpn - by_cases h1 : ∃ n : ℕ, p.1 = n • w - · obtain ⟨n₁, h1⟩ := h1 - exfalso - apply hpn - have hsum : p.1 + p.2 = N • w := Finset.mem_antidiagonal.mp hp - obtain ⟨ρ, hρ⟩ := hex - have hcoords : ∀ ρ', n₁ * w ρ' + p.2 ρ' = N * w ρ' := by - intro ρ' - have h' := DFunLike.congr_fun hsum ρ' - simpa [h1, Finsupp.smul_apply] using h' - have hle : n₁ ≤ N := - Nat.le_of_mul_le_mul_right (by have := hcoords ρ; omega) - (Nat.pos_of_ne_zero hρ) - have h2 : p.2 = (N - n₁) • w := by - ext ρ' - rw [Finsupp.smul_apply, smul_eq_mul, Nat.sub_mul] - have := hcoords ρ' - omega - exact Finset.mem_image.mpr - ⟨n₁, Finset.mem_range.mpr (Nat.lt_succ_of_le hle), by rw [← h1, ← h2]⟩ - · rw [hne c (not_exists.mp h1), zero_mul] - rw [← Finset.sum_subset hsub hvanish, - Finset.sum_image (fun n _ m _ h => hcancel (congrArg Prod.fst h)), - add_pow, Finset.sum_div] - refine Finset.sum_congr rfl fun n hn => ?_ - rw [hnsmul, hnsmul] - have hle : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) - have hfact : ((N.choose n : ℂ)) * (n.factorial : ℂ) * ((N - n).factorial : ℂ) = - (N.factorial : ℂ) := by - exact_mod_cast congrArg (Nat.cast : ℕ → ℂ) - (Nat.choose_mul_factorial_mul_factorial hle) - have h1 : (n.factorial : ℂ) ≠ 0 := Nat.cast_ne_zero.mpr n.factorial_ne_zero - have h2 : ((N - n).factorial : ℂ) ≠ 0 := - Nat.cast_ne_zero.mpr (N - n).factorial_ne_zero - have h3 : (N.factorial : ℂ) ≠ 0 := Nat.cast_ne_zero.mpr N.factorial_ne_zero - rw [div_mul_div_comm, div_eq_div_iff (mul_ne_zero h1 h2) h3] - linear_combination (-(c ^ n * c' ^ (N - n))) * hfact - · rw [hne _ (not_exists.mp hk), coeff_mul] - refine Finset.sum_eq_zero fun p hp => ?_ - by_cases h1 : ∃ n : ℕ, p.1 = n • w - · by_cases h2 : ∃ n : ℕ, p.2 = n • w - · exfalso - obtain ⟨n₁, h1⟩ := h1 - obtain ⟨n₂, h2⟩ := h2 - exact hk ⟨n₁ + n₂, by rw [← Finset.mem_antidiagonal.mp hp, h1, h2, add_smul]⟩ - · rw [hne _ (not_exists.mp h2), mul_zero] - · rw [hne _ (not_exists.mp h1), zero_mul] - have hstar : ∀ c : ℂ, star (F c) = F (star c) := by - intro c - ext k - rw [JetRing.coeff_star] - by_cases hk : ∃ n : ℕ, k = n • w - · obtain ⟨n, rfl⟩ := hk - rw [hnsmul, hnsmul, star_div₀, star_pow, star_natCast] - · rw [hne _ (not_exists.mp hk), hne _ (not_exists.mp hk), star_zero] - have hzero : F 0 = 1 := by - ext k - by_cases hk : ∃ n : ℕ, k = n • w - · obtain ⟨n, rfl⟩ := hk - rw [hnsmul, coeff_one] - rcases Nat.eq_zero_or_pos n with rfl | hn - · simp - · rw [zero_pow (Nat.pos_iff_ne_zero.mp hn), zero_div, if_neg fun h0 => - Nat.pos_iff_ne_zero.mp hn (hcancel (h0.trans (zero_smul ℕ w).symm))] - · rw [hne _ (not_exists.mp hk), coeff_one, - if_neg (fun h => hk ⟨0, by rw [h, zero_smul]⟩)] - have hsc : star (-(a : ℂ) * Complex.I) = -(-(a : ℂ) * Complex.I) := by - rw [star_mul', Complex.star_def, Complex.conj_I, map_neg, Complex.conj_ofReal] - ring - rw [Unitary.mem_iff, hstar, hsc, hmul, hmul, neg_add_cancel, add_neg_cancel, hzero] - exact ⟨rfl, rfl⟩⟩) - -/-- The Taylor coefficient of the exponential gauge jet at a multiple of the - exponent. -/ -lemma coeff_expUnitary_nsmul (a : ℝ) {w : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : w ≠ 0) (n : ℕ) : - coeff (n • w) (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = - (-(a : ℂ) * Complex.I) ^ n / (n.factorial : ℂ) := by - classical - have h : ∃ m : ℕ, n • w = m • w := ⟨n, rfl⟩ - have hch : h.choose = n := by - obtain ⟨ρ, hρ⟩ := Finsupp.ne_iff.mp hw - exact (Nat.eq_of_mul_eq_mul_right (Nat.pos_of_ne_zero (by simpa using hρ)) - (by simpa using DFunLike.congr_fun h.choose_spec ρ)).symm - show (if h : ∃ m : ℕ, n • w = m • w then - (-(a : ℂ) * Complex.I) ^ h.choose / (h.choose.factorial : ℂ) else 0) = _ - rw [dif_pos h, hch] - -/-- The Taylor coefficients of the exponential gauge jet vanish away from the - multiples of the exponent. -/ -lemma coeff_expUnitary_of_forall_ne (a : ℝ) {w : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : w ≠ 0) - {k : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hk : ∀ n : ℕ, k ≠ n • w) : - coeff k (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = 0 := by - classical - show (if h : ∃ n : ℕ, k = n • w then - (-(a : ℂ) * Complex.I) ^ h.choose / (h.choose.factorial : ℂ) else 0) = 0 - rw [dif_neg (not_exists.mpr hk)] - -/-- The chain rule for the exponential gauge jet: - `∂_ν exp(-i a X^w) = -i a w_ν X^{w - e_ν} exp(-i a X^w)`. -/ -lemma pderiv_expUnitary (a : ℝ) {w : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hw : w ≠ 0) - (ν : Fin 1 ⊕ Fin 3) : - pderiv ℂ ν (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = - ((-(a : ℂ) * Complex.I) * (w ν : ℂ)) • - (monomial (w - Finsupp.single ν 1) 1 * - (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing)) := by - classical - ext k - rw [coeff_pderiv, map_smul, smul_eq_mul, coeff_monomial_mul] - by_cases hA : ∃ n : ℕ, k + Finsupp.single ν 1 = n • w - · obtain ⟨n, hn⟩ := hA - have hcoords : ∀ ρ, k ρ + (Finsupp.single ν 1) ρ = n * w ρ := by - intro ρ - have h' := DFunLike.congr_fun hn ρ - simpa [Finsupp.smul_apply] using h' - have hkν : k ν + 1 = n * w ν := by - have := hcoords ν - rwa [Finsupp.single_eq_same] at this - have hnpos : 0 < n := Nat.pos_of_ne_zero fun h => by simp [h] at hkν - have hwνpos : 0 < w ν := Nat.pos_of_ne_zero fun h => by simp [h] at hkν - have hdk : w - Finsupp.single ν 1 ≤ k := by - rw [Finsupp.le_def] - intro ρ - rw [Finsupp.tsub_apply] - have h1 := hcoords ρ - have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos - by_cases hρν : ρ = ν - · subst hρν - rw [Finsupp.single_eq_same] at h1 ⊢ - omega - · have hsρ : (Finsupp.single ν 1) ρ = 0 := - Finsupp.single_eq_of_ne hρν - rw [hsρ] at h1 ⊢ - omega - have hkd : k - (w - Finsupp.single ν 1) = (n - 1) • w := by - ext ρ - rw [Finsupp.tsub_apply, Finsupp.tsub_apply, Finsupp.smul_apply, smul_eq_mul, - Nat.sub_mul, one_mul] - have h1 := hcoords ρ - have h2 : w ρ ≤ n * w ρ := Nat.le_mul_of_pos_left _ hnpos - by_cases hρν : ρ = ν - · subst hρν - rw [Finsupp.single_eq_same] at h1 ⊢ - omega - · have hsρ : (Finsupp.single ν 1) ρ = 0 := - Finsupp.single_eq_of_ne hρν - rw [hsρ] at h1 ⊢ - omega - rw [if_pos hdk, one_mul, hkd, hn, coeff_expUnitary_nsmul a hw, - coeff_expUnitary_nsmul a hw] - have hcast : ((k ν : ℂ) + 1) = (n : ℂ) * (w ν : ℂ) := by exact_mod_cast hkν - rw [hcast] - have hfac : (n.factorial : ℂ) = (n : ℂ) * ((n - 1).factorial : ℂ) := by - exact_mod_cast congrArg (Nat.cast : ℕ → ℂ) - (Nat.mul_factorial_pred (Nat.pos_iff_ne_zero.mp hnpos)).symm - have hpow : (-(a : ℂ) * Complex.I) ^ n = - (-(a : ℂ) * Complex.I) * (-(a : ℂ) * Complex.I) ^ (n - 1) := by - conv_lhs => rw [show n = 1 + (n - 1) by omega, pow_add, pow_one] - rw [hfac, hpow] - have h1 : ((n : ℂ)) ≠ 0 := Nat.cast_ne_zero.mpr (Nat.pos_iff_ne_zero.mp hnpos) - have h2 : (((n - 1).factorial : ℂ)) ≠ 0 := - Nat.cast_ne_zero.mpr (Nat.factorial_ne_zero _) - field_simp - · rw [coeff_expUnitary_of_forall_ne a hw (not_exists.mp hA), zero_mul] - by_cases hwv : w ν = 0 - · rw [hwv] - simp - · have hzero : (if w - Finsupp.single ν 1 ≤ k then - 1 * coeff (k - (w - Finsupp.single ν 1)) - (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) else 0) = 0 := by - split_ifs with hdk - · rw [one_mul] - refine coeff_expUnitary_of_forall_ne a hw fun m hm => ?_ - apply hA - refine ⟨m + 1, ?_⟩ - have hle : Finsupp.single ν 1 ≤ w := - Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) - have h1 : k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) = k := - tsub_add_cancel_of_le hdk - have h2 : (w - Finsupp.single ν 1) + Finsupp.single ν 1 = w := - tsub_add_cancel_of_le hle - calc k + Finsupp.single ν 1 - = k - (w - Finsupp.single ν 1) + (w - Finsupp.single ν 1) + - Finsupp.single ν 1 := by rw [h1] - _ = m • w + w := by rw [hm, add_assoc, h2] - _ = (m + 1) • w := by rw [add_smul, one_smul] - · rfl - rw [hzero, mul_zero] - -/-- The Maurer–Cartan series of the exponential gauge jet: the monomial - `a w_ν X^{w - e_ν}`, which is the jet of the gradient `a ∂_ν X^w`. The star of - the series is eliminated by the unitarity relation, so only the chain rule - enters. -/ -lemma maurerCartanU1_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) - (ν : Fin 1 ⊕ Fin 3) : - maurerCartanU1 (expUnitary a w hw) ν = - monomial (w - Finsupp.single ν 1) ((a : ℂ) * ((w ν : ℕ) : ℂ)) := by - have hu : (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) * - star (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = 1 := - (Unitary.mem_iff.mp (expUnitary a w hw).2.2.2).2 - rw [maurerCartanU1, pderiv_expUnitary a hw ν, smul_mul_assoc, - mul_assoc (monomial (w - Finsupp.single ν 1) 1), hu, mul_one, mul_smul_comm, - ← monomial_zero_eq_C_apply, monomial_mul_monomial, zero_add, ← map_smul, smul_eq_mul] - congr 1 - ring_nf - rw [Complex.I_sq] - ring - -/-- The Maurer–Cartan pairing of the exponential gauge jet `exp(-i a X^t)` with - `a = r / t!`: it shifts precisely the component functions whose total - symmetrized multi-index is `t`, and shifts them all by `r`. -/ -lemma mcShift_expUnitary (t : Multiset (Fin 1 ⊕ Fin 3)) - (ht : Multiset.toFinsupp t ≠ 0) (r : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (ν : Fin 1 ⊕ Fin 3) : - mcShift (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) - (Multiset.toFinsupp t) ht) (JetComponentSpace.basis (.dB s ν)) = - if s + {ν} = t then -r else 0 := by - rw [show (if s + {ν} = t then -r else 0) = -(if s + {ν} = t then r else 0) from by - split <;> simp, - mcShift_basis_dB', neg_inj, Complex.selfAdjointEquiv_apply, - show ((maurerCartanU1Coeff (expUnitary (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) - (Multiset.toFinsupp t) ht) ν (Multiset.toFinsupp s) : selfAdjoint ℂ) : ℂ) = - coeff (Multiset.toFinsupp s) (maurerCartanU1 (expUnitary - (r / (∏ ρ, Nat.factorial (Multiset.toFinsupp t ρ))) - (Multiset.toFinsupp t) ht) ν) from rfl, - maurerCartanU1_expUnitary, coeff_monomial] - by_cases hcase : s + {ν} = t - · rw [if_pos hcase] - have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by - rw [← Multiset.toFinsupp_singleton, ← map_add] - exact congrArg _ hcase - have hwv : Multiset.toFinsupp t ν = Multiset.toFinsupp s ν + 1 := by - rw [← hmw] - simp - have hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 := - eq_tsub_of_add_eq hmw - have hF : (∏ ρ, Nat.factorial ((Multiset.toFinsupp t) ρ)) = - ((Multiset.toFinsupp s) ν + 1) * - ∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) := by - rw [← hmw] - exact prod_factorial_add_single (Multiset.toFinsupp s) ν - rw [if_pos hm, nsmul_eq_mul, hwv, hF] - have h1 : (((Multiset.toFinsupp s) ν + 1 : ℕ) : ℝ) ≠ 0 := by - positivity - have h2 : ((∏ ρ, Nat.factorial ((Multiset.toFinsupp s) ρ) : ℕ) : ℝ) ≠ 0 := by - rw [Nat.cast_ne_zero] - exact Finset.prod_ne_zero_iff.mpr fun ρ _ => Nat.factorial_ne_zero _ - simp only [Complex.mul_re, Complex.ofReal_re, Complex.ofReal_im, Complex.natCast_re, - Complex.natCast_im, mul_zero, sub_zero] - push_cast - field_simp - · rw [if_neg hcase] - by_cases hm : Multiset.toFinsupp s = Multiset.toFinsupp t - Finsupp.single ν 1 - · by_cases hwv : Multiset.toFinsupp t ν = 0 - · rw [if_pos hm, hwv] - simp - · exfalso - apply hcase - have hle : Finsupp.single ν 1 ≤ Multiset.toFinsupp t := - Finsupp.single_le_iff.mpr (Nat.pos_of_ne_zero hwv) - have hmw : Multiset.toFinsupp s + Finsupp.single ν 1 = Multiset.toFinsupp t := by - rw [hm, tsub_add_cancel_of_le hle] - refine Multiset.toFinsupp.injective ?_ - rw [map_add, Multiset.toFinsupp_singleton] - exact hmw - · rw [if_neg hm] - simp - -/-- The difference between a jet-algebra generator and its canonical - representative is a derivative of the field strength, or zero. -/ -lemma ofGenerator_sub_ofGenerator_canon_mem (g : JetGenerators) : - ofGenerator g - ofGenerator (JetGenerators.canon g) ∈ - Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by - obtain ⟨s, ν⟩ := g - set p := JetGenerators.pick (JetGenerators.total (JetGenerators.dB s ν)) with hp - by_cases hpν : p = ν - · have hcanon : JetGenerators.canon (JetGenerators.dB s ν) = JetGenerators.dB s ν := by - rw [JetGenerators.canon, ← hp, hpν] - congr 1 - show (s + {ν}).erase ν = s - rw [add_comm, Multiset.singleton_add, Multiset.erase_cons_head] - rw [hcanon, sub_self] - exact Subalgebra.zero_mem _ - · have hmem : p ∈ s + {ν} := - JetGenerators.pick_mem (JetGenerators.total_ne_zero (JetGenerators.dB s ν)) - have hps : p ∈ s := by - rcases Multiset.mem_add.mp hmem with h | h - · exact h - · exact absurd (Multiset.mem_singleton.mp h) hpν - have h2 : JetGenerators.canon (JetGenerators.dB s ν) = - JetGenerators.dB (s.erase p + {ν}) p := by - rw [JetGenerators.canon, ← hp] - congr 1 - show (s + {ν}).erase p = s.erase p + {ν} - exact Multiset.erase_add_left_pos _ hps - have h1 : JetGenerators.dB s ν = JetGenerators.dB (s.erase p + {p}) ν := by - congr 1 - rw [add_comm, Multiset.singleton_add] - exact (Multiset.cons_erase hps).symm - rw [h2, h1] - exact Algebra.subset_adjoin ⟨((s.erase p, p), ν), Set.mem_univ _, rfl⟩ - -/-- The value of a translation gauge jet at the base point is one: the - exponential series has constant coefficient `1`. -/ -lemma constantCoeff_expUnitary (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - MvPowerSeries.constantCoeff - (((expUnitary a w hw).2.2 : unitary JetRing) : JetRing) = 1 := by - classical - have hex : ∃ ρ, w ρ ≠ 0 := (Finsupp.ne_iff.mp hw).imp fun _ h => by simpa using h - have h₀ : ∃ n : ℕ, (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = n • w := ⟨0, by simp⟩ - show (if h : ∃ n : ℕ, (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) = n • w then - (-(a : ℂ) * Complex.I) ^ h.choose / (h.choose.factorial : ℂ) else 0) = 1 - rw [dif_pos h₀] - obtain ⟨ρ, hρ⟩ := hex - have hch : h₀.choose = 0 := by - by_contra hn - have h := DFunLike.congr_fun h₀.choose_spec ρ - simp only [Finsupp.coe_zero, Pi.zero_apply, Finsupp.smul_apply, smul_eq_mul] at h - exact absurd h.symm (Nat.mul_ne_zero hn hρ) - rw [hch] - simp - -/-- The value of a translation gauge jet at the base point is the identity of the - gauge group. -/ -lemma eval_expUnitary_u1 (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0) : - (expUnitary a w hw).eval.2.2 = 1 := - Subtype.ext (constantCoeff_expUnitary a w hw) - -/-- The invariance direction of `repJetGaugeGroupI_apply_eq_self_iff_mem` from - invariance under the `expUnitary` translation family alone: every element fixed - by all the translation gauge transformations lies in the field-strength - subalgebra. -/ -lemma mem_adjoin_of_forall_expUnitary (V : JetAlgebra) - (hV : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), - repJetGaugeGroupI (expUnitary a w hw) V = V) : - V ∈ Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by - have htrans : ∀ (g₀ : JetGenerators) (r : ℝ), - MvPolynomial.aeval (fun g => MvPolynomial.X g + - MvPolynomial.C (if JetGenerators.canon g = JetGenerators.canon g₀ then r - else (0 : ℝ))) - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) = - SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V := by - intro g₀ r - obtain ⟨s₀, ν₀⟩ := g₀ - have hne : Multiset.toFinsupp (s₀ + {ν₀}) ≠ 0 := by - intro h - have h0 : s₀ + {ν₀} = 0 := - Multiset.toFinsupp.injective (by rw [h, Multiset.toFinsupp_zero]) - simp at h0 - have hconj := equivMvPolynomial_repJetGaugeGroupI - (expUnitary (-r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) - (Multiset.toFinsupp (s₀ + {ν₀})) hne) V - rw [hV _ _ _] at hconj - have hfun : (fun g => MvPolynomial.X g + MvPolynomial.C - (mcShift (expUnitary - (-r / (∏ ρ, Nat.factorial ((Multiset.toFinsupp (s₀ + {ν₀})) ρ))) - (Multiset.toFinsupp (s₀ + {ν₀})) hne) - (JetComponentSpace.basis g))) = - fun g => MvPolynomial.X g + MvPolynomial.C - (if JetGenerators.canon g = JetGenerators.canon (JetGenerators.dB s₀ ν₀) - then r else (0 : ℝ)) := by - funext g - obtain ⟨s, ν⟩ := g - rw [mcShift_expUnitary (s₀ + {ν₀}) hne (-r) s ν, neg_neg] - have hiff : (s + {ν} = s₀ + {ν₀}) ↔ - (JetGenerators.canon (JetGenerators.dB s ν) = - JetGenerators.canon (JetGenerators.dB s₀ ν₀)) := by - rw [JetGenerators.canon_eq_canon_iff] - simp - rw [if_congr hiff rfl rfl] - rw [hfun] at hconj - exact hconj.symm - have hmem := MvPolynomial.mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq - JetGenerators.canon JetGenerators.canon_canon - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis V) htrans - have hVmem : V ∈ (Algebra.adjoin ℝ (Set.range fun g => - (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g) : - MvPolynomial JetGenerators ℝ))).map - (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom := - Subalgebra.mem_map.mpr ⟨_, hmem, AlgEquiv.symm_apply_apply _ _⟩ - rw [AlgHom.map_adjoin] at hVmem - refine Algebra.adjoin_le ?_ hVmem - rintro x ⟨_, ⟨g, rfl⟩, rfl⟩ - have hsymm : (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm.toAlgHom - (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = - ofGenerator g - ofGenerator (JetGenerators.canon g) := by - show (SymmetricAlgebra.equivMvPolynomial JetComponentSpace.basis).symm - (MvPolynomial.X g - MvPolynomial.X (JetGenerators.canon g)) = _ - rw [map_sub, SymmetricAlgebra.equivMvPolynomial_symm_X, - SymmetricAlgebra.equivMvPolynomial_symm_X] - rfl - rw [hsymm] - exact ofGenerator_sub_ofGenerator_canon_mem g - -set_option maxHeartbeats 1000000 in -/-- The complexified invariance direction: an element of the complexified B-boson - jet algebra fixed by the complexified action of the `expUnitary` translation - family lies in the complexified field-strength subalgebra. The generic tensor - fixed-submodule result extends the real translation argument across the scalar factor `ℂ`. -/ -lemma mem_adjoin_of_forall_expUnitary_complex (x : ℂ ⊗[ℝ] JetAlgebra) - (hx : ∀ (a : ℝ) (w : (Fin 1 ⊕ Fin 3) →₀ ℕ) (hw : w ≠ 0), - complexRepJetGaugeGroupI (expUnitary a w hw) x = x) : - x ∈ Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] JetAlgebra)) := by - classical - let Translation := {p : ℝ × ((Fin 1 ⊕ Fin 3) →₀ ℕ) // p.2 ≠ 0} - let F : Translation → Module.End ℝ JetAlgebra := fun p => - repJetGaugeGroupI (expUnitary p.1.1 p.1.2 p.2) - have hxFixed : x ∈ ⨅ p : Translation, - LinearMap.eqLocus ((F p).lTensor ℂ) LinearMap.id := by - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] - intro p - rw [← LinearMap.baseChange_eq_ltensor] - exact hx p.1.1 p.1.2 p.2 - have hxTensor : x ∈ Submodule.map₂ (TensorProduct.mk ℝ ℂ JetAlgebra) ⊤ - (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) := by - rw [← LinearMap.iInf_eqLocus_lTensor F] - exact hxFixed - have hreal : (⨅ p : Translation, LinearMap.eqLocus (F p) LinearMap.id) ≤ - (Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ)).toSubmodule := by - intro b hb - refine mem_adjoin_of_forall_expUnitary b fun a w hw => ?_ - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hb - exact hb (⟨(a, w), hw⟩ : Translation) - have hxField : x ∈ Submodule.map₂ (TensorProduct.mk ℝ ℂ JetAlgebra) ⊤ - (Algebra.adjoin ℝ - (fieldStrengthDeriv.uncurry.uncurry '' Set.univ)).toSubmodule := - Submodule.map₂_le_map₂_right hreal hxTensor - have hinc : ∀ b ∈ Algebra.adjoin ℝ (fieldStrengthDeriv.uncurry.uncurry '' Set.univ), - ((1 : ℂ) ⊗ₜ[ℝ] b : ℂ ⊗[ℝ] JetAlgebra) ∈ Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] JetAlgebra)) := by - intro b hb - induction hb using Algebra.adjoin_induction with - | mem y hy => - obtain ⟨⟨⟨s, μ⟩, ν⟩, -, rfl⟩ := hy - exact Algebra.subset_adjoin ⟨(s, μ, ν), rfl⟩ - | algebraMap t => - rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, - ← IsScalarTower.algebraMap_smul ℂ t - ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra) : ℂ ⊗[ℝ] JetAlgebra)] - exact Subalgebra.smul_mem _ (one_mem _) _ - | add y z hy hz ihy ihz => - rw [TensorProduct.tmul_add] - exact add_mem ihy ihz - | mul y z hy hz ihy ihz => - rw [show ((1 : ℂ) ⊗ₜ[ℝ] (y * z) : ℂ ⊗[ℝ] JetAlgebra) = - ((1 : ℂ) ⊗ₜ[ℝ] y) * ((1 : ℂ) ⊗ₜ[ℝ] z) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul]] - exact mul_mem ihy ihz - apply (show Submodule.map₂ (TensorProduct.mk ℝ ℂ JetAlgebra) ⊤ - (Algebra.adjoin ℝ - (fieldStrengthDeriv.uncurry.uncurry '' Set.univ)).toSubmodule ≤ - (Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : - ℂ ⊗[ℝ] JetAlgebra))).toSubmodule.restrictScalars ℝ from ?_) hxField - rw [Submodule.map₂_le] - intro c _ b hb - change c ⊗ₜ[ℝ] b ∈ Algebra.adjoin ℂ (Set.range fun p : - Multiset (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) => - ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv p.1 p.2.1 p.2.2 : ℂ ⊗[ℝ] JetAlgebra)) - rw [show (c ⊗ₜ[ℝ] b : ℂ ⊗[ℝ] JetAlgebra) = - c • ((1 : ℂ) ⊗ₜ[ℝ] b) from by - rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one]] - exact Subalgebra.smul_mem _ (hinc b hb) c - -/-- An EFT lagrangian with field content consisting only of - a `B` bosons is invariant under the full gauge group if and only if - it can be written in terms of the field strength and derivatives thereof. -/ -lemma repJetGaugeGroupI_apply_eq_self_iff_mem (V : JetAlgebra) : - (∀ U, repJetGaugeGroupI U V = V) ↔ V ∈ Algebra.adjoin ℝ - (fieldStrengthDeriv.uncurry.uncurry '' Set.univ) := by - constructor - · intro hV - exact mem_adjoin_of_forall_expUnitary V fun a w hw => hV _ - · intro hVmem U - induction hVmem using Algebra.adjoin_induction with - | mem x hx => - obtain ⟨⟨⟨s', μ⟩, ν⟩, -, rfl⟩ := hx - exact repJetGaugeGroupI_fieldStrengthDeriv U s' μ ν - | algebraMap r => exact repJetGaugeGroupI_algebraMap U r - | add x y hx hy ihx ihy => rw [map_add, ihx, ihy] - | mul x y hx hy ihx ihy => rw [repJetGaugeGroupI_apply_mul, ihx, ihy] - -/-! - -## G.1. Mass weight scaling - --/ - - -/-- The mass-dimension scaling on the jet algebra of the B boson: the algebra - map multiplying each generator by `c ^ w`, where `w` is twice its mass - dimension. -/ -noncomputable def massWeightScaleReal (c : ℝ) : JetAlgebra →ₐ[ℝ] JetAlgebra := - SymmetricAlgebra.lift - ((SymmetricAlgebra.ι ℝ JetComponentSpace) ∘ₗ JetComponentSpace.massWeightScale c) - -/-- Each generator scales by `c` to the power of its mass weight. -/ -@[simp] -lemma massWeightScaleReal_ofGenerator (c : ℝ) (j : JetGenerators) : - massWeightScaleReal c (ofGenerator j) = c ^ j.massWeight • ofGenerator j := by - rw [ofGenerator, massWeightScaleReal, SymmetricAlgebra.lift_ι_apply] - simp only [LinearMap.coe_comp, Function.comp_apply, - JetComponentSpace.massWeightScale_basis, map_smul] - -/-- The mass-dimension scaling on the complexified jet algebra of the B boson: - the `ℂ`-algebra map multiplying each generator by `c ^ w`, where `w` is twice - its mass dimension. -/ -noncomputable def massWeightScale (c : ℂ) : - ℂ ⊗[ℝ] JetAlgebra →ₐ[ℂ] ℂ ⊗[ℝ] JetAlgebra := - Algebra.TensorProduct.lift Algebra.TensorProduct.includeLeft - (SymmetricAlgebra.lift (JetComponentSpace.basis.constr ℝ fun j => - c ^ j.massWeight • ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j))) - fun _ _ => Commute.all _ _ - -/-- Each complexified generator scales by `c` to the power of its mass - weight. -/ -@[simp] -lemma massWeightScale_tmul_ofGenerator (c z : ℂ) (j : JetGenerators) : - massWeightScale c (z ⊗ₜ[ℝ] ofGenerator j) = - c ^ j.massWeight • (z ⊗ₜ[ℝ] ofGenerator j) := by - rw [massWeightScale, Algebra.TensorProduct.lift_tmul, ofGenerator, - SymmetricAlgebra.lift_ι_apply, Module.Basis.constr_basis, mul_smul_comm] - congr 1 - rw [Algebra.TensorProduct.includeLeft_apply, Algebra.TensorProduct.tmul_mul_tmul, - mul_one, one_mul] - rfl - -set_option maxHeartbeats 1000000 in -/-- The complexified total derivative raises the mass weight by two: the scaling - and the derivative commute up to `c ^ 2`. -/ -lemma massWeightScale_jetDeriv_baseChange (c : ℂ) (μ : Fin 1 ⊕ Fin 3) - (x : ℂ ⊗[ℝ] JetAlgebra) : - massWeightScale c (LinearMap.baseChange ℂ (jetDeriv μ) x) = - c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) (massWeightScale c x) := by - have hm : ∀ a b : ℂ ⊗[ℝ] JetAlgebra, massWeightScale c (a * b) = - massWeightScale c a * massWeightScale c b := fun a b => map_mul _ a b - have hone : ∀ b : JetAlgebra, - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) = - c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b)) := by - intro b - induction b using SymmetricAlgebra.induction with - | algebraMap r => - have hd : jetDeriv μ (algebraMap ℝ JetAlgebra r) = 0 := by - rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] - have h1 : (1 : ℂ) ⊗ₜ[ℝ] algebraMap ℝ JetAlgebra r = - algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (algebraMap ℝ ℂ r) := by - rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, - ← algebraMap_smul (R := ℝ) ℂ r ((1 : ℂ) ⊗ₜ[ℝ] (1 : JetAlgebra)), - Algebra.algebraMap_eq_smul_one (R := ℂ) (A := ℂ ⊗[ℝ] JetAlgebra)] - rfl - have hD1 : LinearMap.baseChange ℂ (jetDeriv μ) - ((1 : ℂ) ⊗ₜ[ℝ] algebraMap ℝ JetAlgebra r) = 0 := by - rw [LinearMap.baseChange_tmul, hd, TensorProduct.tmul_zero] - rw [hd, TensorProduct.tmul_zero, map_zero, h1, AlgHom.commutes, - show algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (algebraMap ℝ ℂ r) = - (1 : ℂ) ⊗ₜ[ℝ] algebraMap ℝ JetAlgebra r from h1.symm, hD1, smul_zero] - | ι v => - have h : ((massWeightScale c).toLinearMap.restrictScalars ℝ) ∘ₗ - (TensorProduct.mk ℝ ℂ JetAlgebra 1) ∘ₗ (jetDeriv μ) ∘ₗ - (SymmetricAlgebra.ι ℝ JetComponentSpace) = - c ^ 2 • (((LinearMap.baseChange ℂ (jetDeriv μ)).restrictScalars ℝ) ∘ₗ - ((massWeightScale c).toLinearMap.restrictScalars ℝ) ∘ₗ - (TensorProduct.mk ℝ ℂ JetAlgebra 1) ∘ₗ - (SymmetricAlgebra.ι ℝ JetComponentSpace)) := by - refine JetComponentSpace.basis.ext fun g => ?_ - simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.smul_apply, - LinearMap.coe_restrictScalars, AlgHom.toLinearMap_apply, - TensorProduct.mk_apply] - rw [show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis g) = - ofGenerator g from rfl, jetDeriv_ofGenerator, - massWeightScale_tmul_ofGenerator, massWeightScale_tmul_ofGenerator, - map_smul, jetDeriv_baseChange_ofGenerator, JetGenerators.massWeight_shift, - smul_smul, ← pow_add] - congr 1 - ring - exact DFunLike.congr_fun h v - | mul a b ha hb => - have h₁ : (1 : ℂ) ⊗ₜ[ℝ] (jetDeriv μ a * b) = - ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ a) * ((1 : ℂ) ⊗ₜ[ℝ] b) := by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] - have h₂ : (1 : ℂ) ⊗ₜ[ℝ] (a * jetDeriv μ b) = - ((1 : ℂ) ⊗ₜ[ℝ] a) * ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] - have h₃ : (1 : ℂ) ⊗ₜ[ℝ] (a * b) = - ((1 : ℂ) ⊗ₜ[ℝ] a) * ((1 : ℂ) ⊗ₜ[ℝ] b) := by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] - calc massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ (a * b)) - = massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] (jetDeriv μ a * b) + - (1 : ℂ) ⊗ₜ[ℝ] (a * jetDeriv μ b)) := by - rw [jetDeriv_mul, TensorProduct.tmul_add] - _ = massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ a) * - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) + - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := by - rw [map_add, h₁, h₂, hm, hm] - _ = (c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a))) * - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) + - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * - (c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := by - rw [ha, hb] - _ = c ^ 2 • (LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a)) * - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) + - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * - LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := by - rw [smul_mul_assoc, mul_smul_comm, smul_add] - _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] a) * - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b)) := by - rw [jetDeriv_baseChange_mul] - _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] (a * b))) := by - rw [h₃, hm] - | add a b ha hb => - simp only [map_add, TensorProduct.tmul_add, ha, hb, smul_add] - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb, smul_add] - | tmul z b => - have hz₁ : z ⊗ₜ[ℝ] jetDeriv μ b = z • ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := by - rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one] - have hz₂ : massWeightScale c (z ⊗ₜ[ℝ] b) = - z • massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b) := by - rw [show z ⊗ₜ[ℝ] b = z • ((1 : ℂ) ⊗ₜ[ℝ] b) from by - rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one]] - exact map_smul (massWeightScale c) z _ - calc massWeightScale c (LinearMap.baseChange ℂ (jetDeriv μ) (z ⊗ₜ[ℝ] b)) - = massWeightScale c (z • ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b)) := by - rw [LinearMap.baseChange_tmul, hz₁] - _ = z • massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] jetDeriv μ b) := - map_smul (massWeightScale c) z _ - _ = z • (c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := by rw [hone b] - _ = c ^ 2 • (z • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b))) := smul_comm z _ _ - _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (z • massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] b)) := by - rw [(LinearMap.baseChange ℂ (jetDeriv μ)).map_smul] - _ = c ^ 2 • LinearMap.baseChange ℂ (jetDeriv μ) - (massWeightScale c (z ⊗ₜ[ℝ] b)) := - congrArg (fun y => c ^ 2 • - LinearMap.baseChange ℂ (jetDeriv μ) y) hz₂.symm - -end JetAlgebra - -/-! - -## G.2. Lorentz transformation laws of the jet coordinates - --/ - -/-- The degree scaling multiplies the multiset basis vector at `s` by - `t ^ |s|`. -/ -lemma gradeScale_dualRealJetAlgebraBasis (t : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) : - DerivAlgebraReal.gradeScale t (LagrangianTheory.dualRealJetAlgebraBasis s) = - t ^ Multiset.card s • LagrangianTheory.dualRealJetAlgebraBasis s := by - induction s using Multiset.induction_on with - | empty => - rw [show LagrangianTheory.dualRealJetAlgebraBasis - (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 from dualRealJetAlgebraBasis_nil, map_one] - simp - | cons a s ih => - rw [← Multiset.singleton_add, ← dualRealJetAlgebraBasis_mul, map_mul, ih, - dualRealJetAlgebraBasis_singleton, DerivAlgebraReal.gradeScale_ι, - smul_mul_smul_comm, ← _root_.pow_succ', ← dualRealJetAlgebraBasis_singleton, - dualRealJetAlgebraBasis_mul, Multiset.singleton_add, Multiset.card_cons] - -/-- The mass-dimension scaling commutes with the Lorentz action on the B-boson - component space: the Lorentz action preserves the derivative degree. -/ -lemma JetComponentSpace.massWeightScale_repLorentzGroup (c : ℝ) (Λ : SL(2,ℂ)) : - JetComponentSpace.massWeightScale c ∘ₗ JetComponentSpace.repLorentzGroup Λ = - JetComponentSpace.repLorentzGroup Λ ∘ₗ JetComponentSpace.massWeightScale c := by - have hfact : JetComponentSpace.massWeightScale c = - TensorProduct.map (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap - (c ^ 2 • LinearMap.id) := by - refine JetComponentSpace.basis.ext fun j => ?_ - cases j with - | dB s ν => - have hscal : (c : ℝ) ^ (JetGenerators.dB s ν).massWeight = - c ^ 2 * (c ^ 2) ^ Multiset.card s := by - show c ^ (2 * (1 + Multiset.card s)) = _ - rw [pow_mul] - ring - rw [JetComponentSpace.massWeightScale_basis, hscal] - simp only [JetComponentSpace.basis_dB, TensorProduct.map_tmul, - AlgHom.toLinearMap_apply, LinearMap.smul_apply, LinearMap.id_apply, - gradeScale_dualRealJetAlgebraBasis, TensorProduct.tmul_smul, - TensorProduct.smul_tmul', smul_smul] - have hA : (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap ∘ₗ - DerivAlgebraReal.repLorentzGroup Λ = - (DerivAlgebraReal.repLorentzGroup Λ : - DerivAlgebraReal →ₗ[ℝ] DerivAlgebraReal) ∘ₗ - (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap := - LinearMap.ext fun a => DerivAlgebraReal.gradeScale_repLorentzGroup (c ^ 2) Λ a - have hB : (c ^ 2 • (LinearMap.id : Module.End ℝ (Module.Dual ℝ BBoson))) ∘ₗ - BBoson.repLorentzGroup.dual Λ = - BBoson.repLorentzGroup.dual Λ ∘ₗ (c ^ 2 • LinearMap.id) := by - rw [LinearMap.smul_comp, LinearMap.comp_smul, LinearMap.id_comp, - LinearMap.comp_id] - rw [hfact, show JetComponentSpace.repLorentzGroup Λ = - TensorProduct.map (DerivAlgebraReal.repLorentzGroup Λ) - (BBoson.repLorentzGroup.dual Λ) from rfl, - ← TensorProduct.map_comp, ← TensorProduct.map_comp, hA, hB] - -set_option maxHeartbeats 1000000 in -/-- The Lorentz action on the first-order B-boson jet coordinates: both indices - transform contravariantly, by the columns of the Lorentz matrix. -/ -lemma JetComponentSpace.repLorentzGroup_basis_dB_singleton (Λ : SL(2,ℂ)) - (μ ν : Fin 1 ⊕ Fin 3) : - JetComponentSpace.repLorentzGroup Λ (JetComponentSpace.basis (.dB {μ} ν)) = - ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) • - JetComponentSpace.basis (.dB {a} b) := by - have happ : JetComponentSpace.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {μ} ⊗ₜ[ℝ] BBoson.basis.dualBasis ν) = - (DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {μ})) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ (BBoson.basis.dualBasis ν)) := rfl - rw [JetComponentSpace.basis_dB, happ, dualRealJetAlgebraBasis_singleton, - DerivAlgebraReal.repLorentzGroup_apply_ι, Lorentz.CoVector.sl2Rep_dual_dualBasis, - BBoson.repLorentzGroup_dual_dualBasis] - simp only [map_sum, map_smul, TensorProduct.sum_tmul, TensorProduct.tmul_sum, - TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, smul_smul, - JetComponentSpace.basis_dB, dualRealJetAlgebraBasis_singleton] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - congr 2 - ring - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on the two-derivative-index B-boson jet coordinates: - all three indices transform contravariantly, by the columns of the Lorentz - matrix. -/ -lemma JetComponentSpace.repLorentzGroup_basis_dB_pair - (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetComponentSpace.repLorentzGroup Λ - (BBoson.JetComponentSpace.basis (.dB {ρ, μ} ν)) = - ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • - BBoson.JetComponentSpace.basis (.dB {r, a} b) := by - have hpair : ∀ x y : Fin 1 ⊕ Fin 3, - LagrangianTheory.dualRealJetAlgebraBasis ({x, y} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis x) * - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis y) := fun x y => by - rw [← BBoson.dualRealJetAlgebraBasis_singleton, - ← BBoson.dualRealJetAlgebraBasis_singleton, - BBoson.dualRealJetAlgebraBasis_mul, Multiset.singleton_add, - ← Multiset.insert_eq_cons] - have hmul : ∀ x y : DerivAlgebraReal, - DerivAlgebraReal.repLorentzGroup Λ (x * y) = - DerivAlgebraReal.repLorentzGroup Λ x * - DerivAlgebraReal.repLorentzGroup Λ y := fun x y => - map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - Lorentz.CoVector.sl2Rep.dual Λ)) x y - have happ : BBoson.JetComponentSpace.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ} ⊗ₜ[ℝ] - StandardModel.BBoson.basis.dualBasis ν) = - (DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, μ})) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ - (StandardModel.BBoson.basis.dualBasis ν)) := rfl - rw [BBoson.JetComponentSpace.basis_dB, happ, hpair, hmul, - DerivAlgebraReal.repLorentzGroup_apply_ι, - DerivAlgebraReal.repLorentzGroup_apply_ι, - Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, - BBoson.repLorentzGroup_dual_dualBasis] - simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, - smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, - ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, - smul_smul, BBoson.JetComponentSpace.basis_dB, hpair] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, j]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => - Finset.sum_congr rfl fun b _ => ?_ - module - -set_option maxHeartbeats 2000000 in -/-- The Lorentz action on the three-derivative-index B-boson jet coordinates: - all four indices transform contravariantly, by the columns of the Lorentz - matrix. -/ -lemma JetComponentSpace.repLorentzGroup_basis_dB_triple - (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetComponentSpace.repLorentzGroup Λ - (BBoson.JetComponentSpace.basis (.dB {ρ, τ, μ} ν)) = - ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • - BBoson.JetComponentSpace.basis (.dB {r, s, a} b) := by - have htriple : ∀ x y z : Fin 1 ⊕ Fin 3, - LagrangianTheory.dualRealJetAlgebraBasis ({x, y, z} : Multiset (Fin 1 ⊕ Fin 3)) = - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis x) * - (SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis y) * - SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) - (Lorentz.CoVector.basis.dualBasis z)) := fun x y z => by - rw [← BBoson.dualRealJetAlgebraBasis_singleton, - ← BBoson.dualRealJetAlgebraBasis_singleton, - ← BBoson.dualRealJetAlgebraBasis_singleton, - BBoson.dualRealJetAlgebraBasis_mul, BBoson.dualRealJetAlgebraBasis_mul, - Multiset.singleton_add, Multiset.singleton_add, ← Multiset.insert_eq_cons, - ← Multiset.insert_eq_cons] - have hmul : ∀ x y : DerivAlgebraReal, - DerivAlgebraReal.repLorentzGroup Λ (x * y) = - DerivAlgebraReal.repLorentzGroup Λ x * - DerivAlgebraReal.repLorentzGroup Λ y := fun x y => - map_mul (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ _ ∘ₗ - Lorentz.CoVector.sl2Rep.dual Λ)) x y - have happ : BBoson.JetComponentSpace.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ} ⊗ₜ[ℝ] - StandardModel.BBoson.basis.dualBasis ν) = - (DerivAlgebraReal.repLorentzGroup Λ - (LagrangianTheory.dualRealJetAlgebraBasis {ρ, τ, μ})) ⊗ₜ[ℝ] - (BBoson.repLorentzGroup.dual Λ - (StandardModel.BBoson.basis.dualBasis ν)) := rfl - rw [BBoson.JetComponentSpace.basis_dB, happ, htriple, hmul, hmul, - DerivAlgebraReal.repLorentzGroup_apply_ι, - DerivAlgebraReal.repLorentzGroup_apply_ι, - DerivAlgebraReal.repLorentzGroup_apply_ι, - Lorentz.CoVector.sl2Rep_dual_dualBasis, Lorentz.CoVector.sl2Rep_dual_dualBasis, - Lorentz.CoVector.sl2Rep_dual_dualBasis, - BBoson.repLorentzGroup_dual_dualBasis] - simp only [map_sum, map_smul, Finset.sum_mul, Finset.mul_sum, - smul_mul_smul_comm, TensorProduct.sum_tmul, TensorProduct.tmul_sum, - ← TensorProduct.smul_tmul', TensorProduct.tmul_smul, Finset.smul_sum, - smul_smul, BBoson.JetComponentSpace.basis_dB, htriple] - conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] - conv_lhs => enter [2, i]; rw [Finset.sum_comm] - conv_lhs => rw [Finset.sum_comm] - conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] - conv_lhs => enter [2, i]; rw [Finset.sum_comm] - conv_lhs => enter [2, i, 2, j]; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => - Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - module - -namespace JetAlgebra - - -set_option maxHeartbeats 1000000 in -/-- The zeroth-order field strength transforms as an antisymmetric two-tensor: - the Lorentz action preserves the span of the field strengths. -/ -lemma repLorentzGroup_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) : - repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) = - ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) • fieldStrengthDeriv {} a b := by - have hFS : ∀ a b : Fin 1 ⊕ Fin 3, fieldStrengthDeriv ({} : Multiset _) a b = - ofGenerator (JetGenerators.dB {a} b) - - ofGenerator (JetGenerators.dB {b} a) := by - intro a b - rw [fieldStrengthDeriv, - show ({} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {a} from by simp, - show ({} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {b} from by simp] - simp only [hFS] - rw [map_sub, ofGenerator, ofGenerator, repLorentzGroup_apply_ι, - repLorentzGroup_apply_ι, JetComponentSpace.repLorentzGroup_basis_dB_singleton, - JetComponentSpace.repLorentzGroup_basis_dB_singleton] - simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, ofGenerator] - congr 1 - conv_rhs => rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - congr 1 - ring - -/-- The transformation of the complexified zeroth-order field strength. -/ -lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_nil (Λ : SL(2,ℂ)) - (μ ν : Fin 1 ⊕ Fin 3) : - complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv {} μ ν) = - ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν) • - ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv {} a b) := by - rw [show complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] fieldStrengthDeriv {} μ ν) = - (1 : ℂ) ⊗ₜ[ℝ] repLorentzGroup Λ (fieldStrengthDeriv {} μ ν) from rfl, - repLorentzGroup_fieldStrengthDeriv_nil] - simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] - -/-- The mass-dimension scaling commutes with the Lorentz action on the B-boson - jet algebra. -/ -lemma massWeightScaleReal_repLorentzGroup (c : ℝ) (Λ : SL(2,ℂ)) (x : JetAlgebra) : - massWeightScaleReal c (repLorentzGroup Λ x) = - repLorentzGroup Λ (massWeightScaleReal c x) := by - have h1 : ∀ w, massWeightScaleReal c (SymmetricAlgebra.ι ℝ JetComponentSpace w) = - SymmetricAlgebra.ι ℝ JetComponentSpace - (JetComponentSpace.massWeightScale c w) := fun w => by - rw [massWeightScaleReal, SymmetricAlgebra.lift_ι_apply] - rfl - have h2 : ∀ w, SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ - JetComponentSpace.repLorentzGroup Λ) - (SymmetricAlgebra.ι ℝ JetComponentSpace w) = - SymmetricAlgebra.ι ℝ JetComponentSpace - (JetComponentSpace.repLorentzGroup Λ w) := fun w => by - rw [SymmetricAlgebra.lift_ι_apply] - rfl - have h : (massWeightScaleReal c).comp (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ - JetComponentSpace.repLorentzGroup Λ)) = - (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ - JetComponentSpace.repLorentzGroup Λ)).comp (massWeightScaleReal c) := by - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun v => ?_) - show massWeightScaleReal c ((SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ - JetComponentSpace.repLorentzGroup Λ)) - ((SymmetricAlgebra.ι ℝ JetComponentSpace) v)) = - (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℝ JetComponentSpace ∘ₗ - JetComponentSpace.repLorentzGroup Λ)) - (massWeightScaleReal c ((SymmetricAlgebra.ι ℝ JetComponentSpace) v)) - rw [h2, h1, h1, h2] - exact congrArg (SymmetricAlgebra.ι ℝ JetComponentSpace) - (DFunLike.congr_fun - (JetComponentSpace.massWeightScale_repLorentzGroup c Λ) v) - exact DFunLike.congr_fun h x - -/-- For real scalars the complexified mass-dimension scaling is the base change - of the real scaling. -/ -lemma massWeightScale_ofReal (r : ℝ) : - massWeightScale (r : ℂ) = - Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (massWeightScaleReal r) := by - refine Algebra.TensorProduct.ext (Subsingleton.elim _ _) ?_ - refine SymmetricAlgebra.algHom_ext ?_ - refine JetComponentSpace.basis.ext fun j => ?_ - show massWeightScale (r : ℂ) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) = - Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (massWeightScaleReal r) - ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) - rw [massWeightScale_tmul_ofGenerator, Algebra.TensorProduct.map_tmul, - massWeightScaleReal_ofGenerator, TensorProduct.tmul_smul, ← Complex.ofReal_pow] - exact algebraMap_smul ℂ (r ^ j.massWeight) ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) - -/-- The complexified scaling at a real scalar commutes with the Lorentz - action. -/ -lemma massWeightScale_ofReal_complexRepLorentzGroup (r : ℝ) (Λ : SL(2,ℂ)) - (x : ℂ ⊗[ℝ] JetAlgebra) : - massWeightScale (r : ℂ) (complexRepLorentzGroup Λ x) = - complexRepLorentzGroup Λ (massWeightScale (r : ℂ) x) := by - rw [massWeightScale_ofReal] - induction x using TensorProduct.induction_on with - | zero => simp - | add a b ha hb => simp only [map_add, ha, hb] - | tmul z b => - rw [show complexRepLorentzGroup Λ (z ⊗ₜ[ℝ] b) = - z ⊗ₜ[ℝ] repLorentzGroup Λ b from rfl, - Algebra.TensorProduct.map_tmul, Algebra.TensorProduct.map_tmul, - show complexRepLorentzGroup Λ ((AlgHom.id ℂ ℂ) z ⊗ₜ[ℝ] - massWeightScaleReal r b) = (AlgHom.id ℂ ℂ) z ⊗ₜ[ℝ] - repLorentzGroup Λ (massWeightScaleReal r b) from rfl, - massWeightScaleReal_repLorentzGroup] - -/-! - -## G.3. Lorentz transformation laws of the field strength - -The field strength `F_{μν} = ∂_μ B_ν - ∂_ν B_μ` and its derivatives are -tensors: every index transforms by the Lorentz matrix. - --/ - -set_option maxHeartbeats 2000000 in -/-- The transformation law of the first-derivative field strength on the - B-boson jet algebra: a three-index tensor. -/ -lemma repLorentzGroup_fieldStrengthDeriv_singleton - (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = - ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • - BBoson.JetAlgebra.fieldStrengthDeriv {r} a b := by - have hFS : ∀ r a b : Fin 1 ⊕ Fin 3, - BBoson.JetAlgebra.fieldStrengthDeriv ({r} : Multiset _) a b = - BBoson.JetAlgebra.ofGenerator (.dB {r, a} b) - - BBoson.JetAlgebra.ofGenerator (.dB {r, b} a) := fun r a b => by - rw [BBoson.JetAlgebra.fieldStrengthDeriv, - show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, a} from by - rw [Multiset.singleton_add, ← Multiset.insert_eq_cons], - show ({r} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, b} from by - rw [Multiset.singleton_add, ← Multiset.insert_eq_cons]] - simp only [hFS] - rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_pair] - simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, - BBoson.JetAlgebra.ofGenerator] - rw [sub_right_inj] - conv_rhs => enter [2, r]; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun a _ => - Finset.sum_congr rfl fun b _ => ?_ - congr 1 - ring - -/-- The transformation of the complexified first-derivative field strength. -/ -lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_singleton - (Λ : SL(2,ℂ)) (ρ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = - ∑ r, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν)) • - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r} a b) := by - rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ} μ ν) from rfl, - BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_singleton] - simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] - -set_option maxHeartbeats 2000000 in -/-- The transformation law of the second-derivative field strength on the - B-boson jet algebra: a four-index tensor. -/ -lemma repLorentzGroup_fieldStrengthDeriv_pair - (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = - ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • - BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b := by - have hFS : ∀ r s a b : Fin 1 ⊕ Fin 3, - BBoson.JetAlgebra.fieldStrengthDeriv ({r, s} : Multiset _) a b = - BBoson.JetAlgebra.ofGenerator (.dB {r, s, a} b) - - BBoson.JetAlgebra.ofGenerator (.dB {r, s, b} a) := fun r s a b => by - rw [BBoson.JetAlgebra.fieldStrengthDeriv, - show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {a} = {r, s, a} from by - rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, - ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons], - show ({r, s} : Multiset (Fin 1 ⊕ Fin 3)) + {b} = {r, s, b} from by - rw [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add, - ← Multiset.insert_eq_cons, ← Multiset.insert_eq_cons]] - simp only [hFS] - rw [map_sub, BBoson.JetAlgebra.ofGenerator, BBoson.JetAlgebra.ofGenerator, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetAlgebra.repLorentzGroup_apply_ι, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple, - BBoson.JetComponentSpace.repLorentzGroup_basis_dB_triple] - simp only [map_sum, map_smul, smul_sub, Finset.sum_sub_distrib, - BBoson.JetAlgebra.ofGenerator] - rw [sub_right_inj] - conv_rhs => enter [2, r, 2, s]; rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun r _ => Finset.sum_congr rfl fun s _ => - Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ - congr 1 - ring - -/-- The transformation of the complexified second-derivative field strength. -/ -lemma complexRepLorentzGroup_one_tmul_fieldStrengthDeriv_pair - (Λ : SL(2,ℂ)) (ρ τ μ ν : Fin 1 ⊕ Fin 3) : - BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = - ∑ r, ∑ s, ∑ a, ∑ b, ((Lorentz.SL2C.toLorentzGroup Λ).1 r ρ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 s τ * - ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ * - (Lorentz.SL2C.toLorentzGroup Λ).1 b ν))) • - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {r, s} a b) := by - rw [show BBoson.JetAlgebra.complexRepLorentzGroup Λ - ((1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) = - (1 : ℂ) ⊗ₜ[ℝ] BBoson.JetAlgebra.repLorentzGroup Λ - (BBoson.JetAlgebra.fieldStrengthDeriv {ρ, τ} μ ν) from rfl, - BBoson.JetAlgebra.repLorentzGroup_fieldStrengthDeriv_pair] - simp only [TensorProduct.tmul_sum, TensorProduct.tmul_smul] - - - -set_option maxHeartbeats 4000000 in -/-- **The jet derivative on the B-boson jet algebra is a Lorentz vector.** -/ -lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetAlgebra) : - repLorentzGroup Λ (jetDeriv μ x) = - ∑ a, (Lorentz.SL2C.toLorentzGroup Λ).1 a μ • jetDeriv a (repLorentzGroup Λ x) := by - induction x using SymmetricAlgebra.induction with - | algebraMap r => - have h1 : jetDeriv μ (algebraMap ℝ JetAlgebra r) = 0 := by - rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] - rw [h1, map_zero] - refine (Finset.sum_eq_zero fun a _ => ?_).symm - rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, - jetDeriv_one, smul_zero, smul_zero] - | ι v => - rw [jetDeriv_ι, repLorentzGroup_apply_ι, repLorentzGroup_apply_ι, - JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] - exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] - | mul a b ha hb => - rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, - Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] - refine Finset.sum_congr rfl fun c _ => ?_ - rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] - | add a b ha hb => - rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] - - -set_option maxHeartbeats 1000000 in -/-- **The complexified jet derivative is a Lorentz vector.** -/ -lemma complexRepLorentzGroup_baseChange_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (p : ℂ ⊗[ℝ] JetAlgebra) : - complexRepLorentzGroup Λ (LinearMap.baseChange ℂ (jetDeriv μ) p) = - ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - LinearMap.baseChange ℂ (jetDeriv a) (complexRepLorentzGroup Λ p) := by - have hrep : ∀ (c : ℂ) (y : JetAlgebra), complexRepLorentzGroup Λ (c ⊗ₜ[ℝ] y) = - c ⊗ₜ[ℝ] repLorentzGroup Λ y := fun _ _ => rfl - induction p using TensorProduct.induction_on with - | zero => simp - | add x y hx hy => - rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] - exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] - | tmul c y => - rw [LinearMap.baseChange_tmul, hrep, hrep, repLorentzGroup_jetDeriv, - TensorProduct.tmul_sum] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [TensorProduct.tmul_smul, LinearMap.baseChange_tmul, - ← algebraMap_smul (R := ℝ) ℂ] - rfl - -end JetAlgebra - -end BBoson - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean b/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean deleted file mode 100644 index 496479599..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/BBoson/MassDim.lean +++ /dev/null @@ -1,316 +0,0 @@ -/- -Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.BBoson.Basic -public import Physlib.Mathematics.PolynomialEval -/-! - -# The mass dimension associated with the `B` boson - -**Important:** Since it is easier to work with natural numbers rather then rationals, - we will work with twice the mass dimension which we will call the `mass weight`. - - --/ - -@[expose] public section - -set_option maxHeartbeats 1000000 - - -namespace StandardModel - -open TensorProduct - -namespace BBoson -open Module -namespace JetAlgebra - -/-! - -## The mass weight polynomial - -We define a polynomial associated with each element of the jet algebra, where the coefficient of -`X ^ n` is the sum of all components of mass weight `n`. -This is useful for checking that certain elements are zero, -since an element is zero if and only if all coefficients of its mass-weight polynomial are zero. - --/ -/-- The mass-weight polynomial on the complexified B-boson jet algebra: the - `ℂ`-algebra map sending each generator `j` to `X ^ w * j`, where `w` is the - mass weight of `j`. - - The component space is a real vector space, so the symmetric-algebra lift - produces an `ℝ`-algebra map; `AlgHom.liftEquiv` turns it into a `ℂ`-algebra map - on the complexification, being the universal property of base change: a - `ℂ`-algebra map out of `ℂ ⊗[ℝ] A` is the same thing as an `ℝ`-algebra map out - of `A`. -/ -noncomputable def massWeightPoly : - (ℂ ⊗[ℝ] JetAlgebra) →ₐ[ℂ] Polynomial (ℂ ⊗[ℝ] JetAlgebra) := - AlgHom.liftEquiv ℝ ℂ JetAlgebra _ - (SymmetricAlgebra.lift (JetComponentSpace.basis.constr ℝ fun j => - Polynomial.monomial j.massWeight ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j))) - -/-- The scalar of the complexification passes straight through. -/ -lemma massWeightPoly_tmul (c : ℂ) (b : JetAlgebra) : - massWeightPoly (c ⊗ₜ[ℝ] b) = c • massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] b) := by - rw [massWeightPoly, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, one_smul] - -/-- Each generator is sent to `j * X ^ w`, where `w` is its mass weight. -/ -@[simp] -lemma massWeightPoly_ofGenerator (j : JetGenerators) : - massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) = - Polynomial.monomial j.massWeight ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) := by - rw [massWeightPoly, AlgHom.liftEquiv_tmul, one_smul, ofGenerator, - SymmetricAlgebra.lift_ι_apply, Module.Basis.constr_basis] - rfl - -/-- Setting the formal variable to one recovers the original element. -/ -lemma massWeightPoly_eval_one (x : ℂ ⊗[ℝ] JetAlgebra) : - (massWeightPoly x).eval 1 = x := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (ℂ ⊗[ℝ] JetAlgebra)) 1 - fun a => Commute.all a _).comp massWeightPoly = - AlgHom.id ℂ (ℂ ⊗[ℝ] JetAlgebra) := by - refine (AlgHom.liftEquiv ℝ ℂ JetAlgebra _).symm.injective ?_ - refine SymmetricAlgebra.algHom_ext - (Module.Basis.ext JetComponentSpace.basis fun j => ?_) - simp [massWeightPoly, ofGenerator] - exact AlgHom.congr_fun h x - -/-- Every element is the sum of the coefficients of its mass-weight polynomial. -/ -lemma eq_sum_massWeightPoly_coeff (x : ℂ ⊗[ℝ] JetAlgebra) : - x = ∑ n ∈ Polynomial.support (massWeightPoly x), (massWeightPoly x).coeff n := by - conv_lhs => rw [← massWeightPoly_eval_one x] - rw [Polynomial.eval_eq_sum, Polynomial.sum_def] - simp - -/-- `massWeightPoly` is injective, however, it is not surjective. -/ -lemma massWeightPoly_injective : Function.Injective massWeightPoly := by - intro x y h - rw [← massWeightPoly_eval_one x, ← massWeightPoly_eval_one y] - simp [h] - - -/-- Homogeneity of the coefficients for a linear generator: each basis vector is - homogeneous, and a general vector is a combination of basis vectors. -/ -lemma massWeightPoly_coeff_massWeightPoly_ι (n : ℕ) (v : JetComponentSpace) : - massWeightPoly ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] - SymmetricAlgebra.ι ℝ JetComponentSpace v)).coeff n) = - Polynomial.monomial n ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] - SymmetricAlgebra.ι ℝ JetComponentSpace v)).coeff n) := by - have hv : v ∈ Submodule.span ℝ (Set.range JetComponentSpace.basis) := by - rw [JetComponentSpace.basis.span_eq] - trivial - induction hv using Submodule.span_induction generalizing n with - | mem y hy => - obtain ⟨j, rfl⟩ := hy - rw [show SymmetricAlgebra.ι ℝ JetComponentSpace (JetComponentSpace.basis j) = - ofGenerator j from rfl, massWeightPoly_ofGenerator, Polynomial.coeff_monomial] - split_ifs with h - · rw [← h, massWeightPoly_ofGenerator] - · simp only [map_zero] - | zero => simp only [map_zero, TensorProduct.tmul_zero, Polynomial.coeff_zero] - | add y z _ _ hy hz => - simp only [map_add, TensorProduct.tmul_add, Polynomial.coeff_add] - rw [hy n, hz n] - | smul c y _ hy => - have h : ((1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ JetComponentSpace (c • y) - : ℂ ⊗[ℝ] JetAlgebra) = - (algebraMap ℝ ℂ c) • ((1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ JetComponentSpace y) := by - rw [map_smul, TensorProduct.tmul_smul, ← algebraMap_smul ℂ c] - rw [h, map_smul, Polynomial.coeff_smul, map_smul, hy n, Polynomial.smul_monomial] - -/-- Homogeneity of the coefficients is inherited by products: the `n`-th - coefficient of a product is a sum of products of coefficients of complementary - degrees. -/ -lemma massWeightPoly_coeff_massWeightPoly_mul {a b : ℂ ⊗[ℝ] JetAlgebra} - (ha : ∀ n, massWeightPoly ((massWeightPoly a).coeff n) = - Polynomial.monomial n ((massWeightPoly a).coeff n)) - (hb : ∀ n, massWeightPoly ((massWeightPoly b).coeff n) = - Polynomial.monomial n ((massWeightPoly b).coeff n)) (n : ℕ) : - massWeightPoly ((massWeightPoly (a * b)).coeff n) = - Polynomial.monomial n ((massWeightPoly (a * b)).coeff n) := by - rw [map_mul massWeightPoly a b, Polynomial.coeff_mul, map_sum massWeightPoly, - map_sum (Polynomial.monomial n)] - refine Finset.sum_congr rfl fun p hp => ?_ - rw [Finset.mem_antidiagonal] at hp - subst hp - rw [map_mul massWeightPoly, ha p.1, hb p.2, Polynomial.monomial_mul_monomial] - -/-- Homogeneity on the real part of the complexification, by induction over the - symmetric algebra. -/ -lemma massWeightPoly_coeff_massWeightPoly_one_tmul (n : ℕ) (b : JetAlgebra) : - massWeightPoly ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] b)).coeff n) = - Polynomial.monomial n ((massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] b)).coeff n) := by - induction b using SymmetricAlgebra.induction generalizing n with - | algebraMap r => - rw [show (1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ JetAlgebra r) = - algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (r : ℂ) from by - rw [Algebra.algebraMap_eq_smul_one, Algebra.algebraMap_eq_smul_one, - TensorProduct.tmul_smul, TensorProduct.smul_tmul'] - rfl] - rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] - split_ifs with h - · subst h - rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.monomial_zero_left] - · simp only [map_zero] - | ι v => exact massWeightPoly_coeff_massWeightPoly_ι n v - | mul a b ha hb => - rw [show (1 : ℂ) ⊗ₜ[ℝ] (a * b) = ((1 : ℂ) ⊗ₜ[ℝ] a) * ((1 : ℂ) ⊗ₜ[ℝ] b) from by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul]] - exact massWeightPoly_coeff_massWeightPoly_mul ha hb n - | add a b ha hb => - rw [TensorProduct.tmul_add, map_add massWeightPoly, Polynomial.coeff_add, - map_add massWeightPoly, ha n, hb n] - exact (map_add (Polynomial.monomial n) _ _).symm - -/-- The coefficients of a mass-weight polynomial are homogeneous: the coefficient - of `X ^ n` in `massWeightPoly x` is sent by `massWeightPoly` to `X ^ n` times - itself. - - This fails for a general `p : Polynomial (ℂ ⊗[ℝ] JetAlgebra)` in place of - `massWeightPoly x`: for `p = Polynomial.monomial 5 1` it would say - `1 = X ^ 5`. -/ -lemma massWeightPoly_coeff_massWeightPoly (n : ℕ) (x : ℂ ⊗[ℝ] JetAlgebra) : - massWeightPoly ((massWeightPoly x).coeff n) = - Polynomial.monomial n ((massWeightPoly x).coeff n) := by - induction x using TensorProduct.induction_on generalizing n with - | zero => simp only [map_zero, Polynomial.coeff_zero] - | add a b ha hb => - rw [map_add massWeightPoly, Polynomial.coeff_add, map_add massWeightPoly, ha n, hb n] - exact (map_add (Polynomial.monomial n) _ _).symm - | tmul c b => - rw [massWeightPoly_tmul, Polynomial.coeff_smul, map_smul, - massWeightPoly_coeff_massWeightPoly_one_tmul n b, Polynomial.smul_monomial] - - -/-! - -## B. The mass weight submodule - -We combine the coefficents of `massWeightPoly` into a submodule. --/ - - -/-- The submodule of elements of mass weight `n`: those `x` whose mass-weight - polynomial is `x * X ^ n`. -/ -def massWeightSubmodule (n : ℕ) : Submodule ℂ (ℂ ⊗[ℝ] JetAlgebra) where - carrier := {x | massWeightPoly x = Polynomial.monomial n x} - add_mem' {a b} ha hb := by - simp only [Set.mem_setOf_eq, map_add] at ha hb ⊢ - rw [ha, hb] - zero_mem' := by simp - smul_mem' c x hx := by - simp only [Set.mem_setOf_eq, map_smul] at hx ⊢ - rw [hx, Polynomial.smul_monomial] - -@[simp] -lemma mem_massWeightSubmodule {n : ℕ} {x : ℂ ⊗[ℝ] JetAlgebra} : - x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl - -/-- The generator `j` has mass weight `j.massWeight`. -/ -lemma ofGenerator_mem_massWeightSubmodule (j : JetGenerators) : - (1 : ℂ) ⊗ₜ[ℝ] ofGenerator j ∈ massWeightSubmodule j.massWeight := - massWeightPoly_ofGenerator j - -/-- Mass weights add under multiplication, and `1` has mass weight zero. -/ -instance : SetLike.GradedMonoid massWeightSubmodule where - one_mem := by simp - mul_mem {m n x y} hx hy := by - simp only [mem_massWeightSubmodule, map_mul] at hx hy ⊢ - rw [hx, hy, Polynomial.monomial_mul_monomial] - -/-- The coefficient of `X ^ n` in the mass-weight polynomial of `x` has mass - weight `n`. -/ -lemma coeff_massWeightPoly_mem_massWeightSubmodule (n : ℕ) (x : ℂ ⊗[ℝ] JetAlgebra) : - (massWeightPoly x).coeff n ∈ massWeightSubmodule n := - massWeightPoly_coeff_massWeightPoly n x - -/-! - -## C. Evaluating the mass-weight polynomial - -The mass-weight polynomial and the mass-weight scaling are two descriptions of the same -grading: evaluating the polynomial at a scalar gives the scaling by that scalar. Since a -polynomial with coefficients in an algebra over an infinite field is determined by its -values at the scalars, statements proved for one description transfer to the other. - --/ - -/-- Evaluating the mass-weight polynomial at a scalar is the mass-weight scaling by that - scalar. Both send a generator of weight `w` to `c ^ w` times itself, and both are - algebra maps. -/ -lemma eval_massWeightPoly (c : ℂ) (x : ℂ ⊗[ℝ] JetAlgebra) : - (massWeightPoly x).eval (algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) c) = massWeightScale c x := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (ℂ ⊗[ℝ] JetAlgebra)) - (algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) c) - (fun a => Commute.all a _)).comp massWeightPoly = massWeightScale c := by - refine (AlgHom.liftEquiv ℝ ℂ JetAlgebra _).symm.injective ?_ - refine SymmetricAlgebra.algHom_ext - (Module.Basis.ext JetComponentSpace.basis fun j => ?_) - show (massWeightPoly ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j)).eval - (algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) c) = - massWeightScale c ((1 : ℂ) ⊗ₜ[ℝ] ofGenerator j) - rw [massWeightPoly_ofGenerator, massWeightScale_tmul_ofGenerator, - Polynomial.eval_monomial, ← map_pow, ← Algebra.commutes, ← Algebra.smul_def] - exact AlgHom.congr_fun h x - -/-- Evaluating at a real scalar, where the scalar tower lets the same value be read either - over `ℝ` or over `ℂ`. -/ -lemma eval_massWeightPoly_ofReal (r : ℝ) (x : ℂ ⊗[ℝ] JetAlgebra) : - (massWeightPoly x).eval (algebraMap ℝ (ℂ ⊗[ℝ] JetAlgebra) r) = - massWeightScale (r : ℂ) x := by - rw [IsScalarTower.algebraMap_apply ℝ ℂ (ℂ ⊗[ℝ] JetAlgebra) r, eval_massWeightPoly] - rfl - -/-! - -## D. The mass weight of derivatives and of transformed elements - --/ - -open Matrix MatrixGroups - -/-- The total derivative raises the mass weight by two: its mass-weight polynomial is - `X ^ 2` times the coefficientwise total derivative. -/ -lemma massWeightPoly_jetDeriv_baseChange (μ : Fin 1 ⊕ Fin 3) (x : ℂ ⊗[ℝ] JetAlgebra) : - massWeightPoly (LinearMap.baseChange ℂ (jetDeriv μ) x) = - Polynomial.X ^ 2 * Polynomial.mapCoeffs (LinearMap.baseChange ℂ (jetDeriv μ)) - (massWeightPoly x) := by - refine Polynomial.ext_of_forall_eval_algebraMap (k := ℂ) fun c => ?_ - rw [eval_massWeightPoly, Polynomial.eval_mul, Polynomial.eval_pow, Polynomial.eval_X, - Polynomial.eval_algebraMap_mapCoeffs, eval_massWeightPoly, - massWeightScale_jetDeriv_baseChange, ← map_pow, ← Algebra.smul_def] - -/-- The Lorentz action preserves mass weights: the mass-weight polynomial of a transformed - element is the transform of its mass-weight polynomial. -/ -lemma massWeightPoly_complexRepLorentzGroup (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] JetAlgebra) : - massWeightPoly (complexRepLorentzGroup Λ x) = - Polynomial.mapAlgHom (complexRepLorentzGroupAlgHom Λ) (massWeightPoly x) := by - refine Polynomial.ext_of_forall_eval_algebraMap (k := ℝ) fun r => ?_ - have hmap : algebraMap ℝ (ℂ ⊗[ℝ] JetAlgebra) r = - algebraMap ℂ (ℂ ⊗[ℝ] JetAlgebra) (r : ℂ) := - IsScalarTower.algebraMap_apply ℝ ℂ (ℂ ⊗[ℝ] JetAlgebra) r - rw [hmap, eval_massWeightPoly, Polynomial.eval_algebraMap_mapAlgHom, - eval_massWeightPoly, massWeightScale_ofReal_complexRepLorentzGroup] - rfl - -/-- Jets of constant gauge transformations act trivially on the B-boson factor, so they - preserve the mass-weight polynomial outright. -/ -lemma massWeightPoly_complexRepJetGaugeGroupI_ofConstant (g : GaugeGroupI) - (x : ℂ ⊗[ℝ] JetAlgebra) : - massWeightPoly (complexRepJetGaugeGroupI (JetGaugeGroupI.ofConstant g) x) = - massWeightPoly x := by - rw [complexRepJetGaugeGroupI_ofConstant] - -TODO "Show invariance of the mass weights with repsect to the Lorentz group." - -end JetAlgebra - -end BBoson - -end StandardModel From 7d0d601566e01d8ace5b61118829fe98548436dc Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 05:14:37 +0100 Subject: [PATCH 208/254] feat: Add full prove of IsQuadLorentz --- .../AlgebraValued/IsQuadLorentz.lean | 1026 ++++++++++++++++- 1 file changed, 966 insertions(+), 60 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean index 04393af7a..b23e057a8 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean @@ -20,6 +20,7 @@ public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps public import Mathlib.RepresentationTheory.Invariants +public import Mathlib.Data.Matrix.Reflection public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! @@ -303,12 +304,85 @@ lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : rw [hT.eq_sum_lightCone i e] exact (Finset.sum_fiberwise_of_maps_to (fun c _ => hall c) _).symm +/-- **The three light-cone sectors of one index**: `0` the raising direction `κ = 0`, + `1` the lowering direction `κ = 1`, `2` the transverse plane `κ ∈ {2, 3}`. -/ +def sectorIndex : Fin 4 → Fin 3 := ![0, 1, 2, 2] + +/-- The boost weight of each sector. -/ +def sectorWeight : Fin 3 → ℤ := ![2, -2, 0] + +/-- The light-cone weight of an index is the weight of its sector. -/ +lemma lightConeWeight_eq_sectorWeight (κ : Fin 4) : + lightConeWeight κ = sectorWeight (sectorIndex κ) := by decide +revert + +/-- **The per-slot sector transition matrix**: the single-index composite + `lightConeCoeffInvQ · lightConeCoeffZ` summed over the light-cone directions of one + sector. The three sectors resolve the identity, and `weightZeroTransition` is by + definition the balanced-sector convolution of these small matrices. -/ +def slotTransition (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℚ := + ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = κ), + lightConeCoeffInvQ i μ κ' * (lightConeCoeffZ i κ' ν : ℚ) + /-- **The matrix of the axis-`i` weight-zero projection in the `T`-basis**: the coefficient of `T d` in the re-expansion of `monoComponent i e 0` through the - light-cone basis. Rational-valued and computable, built from the two mirrors. -/ + light-cone basis, as the sum over balanced sector patterns — as many raising as + lowering slots, `19` patterns — of the product of the per-slot sector matrices. + Rational-valued and computable; `weightZeroTransition_eq_sum_lightCone` gives the + equivalent sum over the `70` weight-zero light-cone monomials. -/ def weightZeroTransition (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ℚ := - ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), - ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) + ∑ w ∈ Finset.univ.filter (fun w : Fin 4 → Fin 3 => (∑ s, sectorWeight (w s)) = 0), + ∏ s, slotTransition i (w s) (e s) (d s) + +/-- **Weight-zero light-cone sums are balanced-sector convolutions**: a sum over the + weight-zero light-cone monomials of a product of slot factors regroups as the sum + over balanced sector patterns of the product of the slotwise sector sums. -/ +lemma sum_weightZero_eq_sum_sector {R : Type*} [CommSemiring R] (f : Fin 4 → Fin 4 → R) : + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, f s (c s) + = ∑ w ∈ Finset.univ.filter (fun w : Fin 4 → Fin 3 => (∑ s, sectorWeight (w s)) = 0), + ∏ s, ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = w s), f s κ' := by + have hmaps : ∀ c ∈ Finset.univ.filter + (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + (fun s => sectorIndex (c s)) ∈ Finset.univ.filter + (fun w : Fin 4 → Fin 3 => (∑ s, sectorWeight (w s)) = 0) := by + intro c hc + simp only [Finset.mem_filter, Finset.mem_univ, true_and] at hc ⊢ + rw [← hc] + exact (Finset.sum_congr rfl fun s _ => lightConeWeight_eq_sectorWeight (c s)).symm + rw [← Finset.sum_fiberwise_of_maps_to hmaps] + refine Finset.sum_congr rfl fun w hw => ?_ + have hw0 : (∑ s, sectorWeight (w s)) = 0 := (Finset.mem_filter.1 hw).2 + have hfiber : (Finset.univ.filter + (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0)).filter + (fun c => (fun s => sectorIndex (c s)) = w) + = Fintype.piFinset + (fun s => Finset.univ.filter (fun κ : Fin 4 => sectorIndex κ = w s)) := by + ext c + simp only [Finset.mem_filter, Finset.mem_univ, true_and, Fintype.mem_piFinset, + funext_iff] + constructor + · rintro ⟨-, hcw⟩ s + exact hcw s + · intro hcw + refine ⟨?_, hcw⟩ + rw [show (∑ s, lightConeWeight (c s)) = ∑ s, sectorWeight (w s) from + Finset.sum_congr rfl fun s _ => by rw [lightConeWeight_eq_sectorWeight, hcw s]] + exact hw0 + rw [hfiber] + exact (Finset.prod_univ_sum + (fun s => Finset.univ.filter fun κ' : Fin 4 => sectorIndex κ' = w s) + (fun s κ' => f s κ')).symm + +/-- **The weight-zero transition as a light-cone sum**: the sector convolution defining + `weightZeroTransition` expands to the sum over weight-zero light-cone monomials of + the composite `lightConeCoeffInvQ · lightConeCoeffZ` slot coefficients. -/ +lemma weightZeroTransition_eq_sum_lightCone (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + weightZeroTransition i d e + = ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) := by + rw [weightZeroTransition] + exact (sum_weightZero_eq_sum_sector + (fun s κ => lightConeCoeffInvQ i (e s) κ * (lightConeCoeffZ i κ (d s) : ℚ))).symm /-- **The weight-zero component re-expanded in the `T`-basis**: `monoComponent i e 0` is the `e`-th column of `weightZeroTransition` applied to the generators. -/ @@ -321,7 +395,7 @@ lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : refine Finset.sum_congr rfl fun d _ => ?_ rw [← Finset.sum_smul] congr 1 - rw [weightZeroTransition] + rw [weightZeroTransition_eq_sum_lightCone] push_cast simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] @@ -852,7 +926,7 @@ lemma lightConeCoeffInvQ_cycDir (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) lemma weightZeroTransition_cycDir (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : weightZeroTransition (i + 1) (fun s => cycDir (d s)) (fun s => cycDir (e s)) = weightZeroTransition i d e := by - rw [weightZeroTransition, weightZeroTransition] + rw [weightZeroTransition_eq_sum_lightCone, weightZeroTransition_eq_sum_lightCone] refine Finset.sum_congr rfl fun c _ => Finset.prod_congr rfl fun s _ => ?_ rw [lightConeCoeffInvQ_cycDir, lightConeCoeffZ_cycDir] @@ -954,7 +1028,7 @@ lemma weightZeroTransition_eq_zero_of_not_isPairedOrDistinct (i : Fin 3) (∑ s, lightConeWeight (c s)) = 0), ∏ s, lightConeCoeffInvQ i (e s) (swap01 (c s)) * (lightConeCoeffZ i (swap01 (c s)) (d s) : ℚ) := by - rw [weightZeroTransition] + rw [weightZeroTransition_eq_sum_lightCone] refine Finset.sum_nbij' (i := fun c => fun s => swap01 (c s)) (j := fun c => fun s => swap01 (c s)) ?_ ?_ ?_ ?_ ?_ · intro c hc @@ -973,12 +1047,12 @@ lemma weightZeroTransition_eq_zero_of_not_isPairedOrDistinct (i : Fin 3) simp only [swap01_swap01] have hkey := hrei.trans ((Finset.sum_congr rfl fun c _ => hswap c).trans (Finset.mul_sum _ _ _).symm) - rw [← weightZeroTransition, hsgn] at hkey + rw [← weightZeroTransition_eq_sum_lightCone, hsgn] at hkey push_cast at hkey linarith [hkey] · push Not at hA obtain ⟨s₀, hs₀⟩ := hA - rw [weightZeroTransition] + rw [weightZeroTransition_eq_sum_lightCone] refine Finset.sum_eq_zero fun c _ => ?_ exact Finset.prod_eq_zero (Finset.mem_univ s₀) (slot_eq_zero_of_not_sameSlotSector i (e s₀) (d s₀) hs₀ (c s₀)) @@ -1489,15 +1563,221 @@ lemma sum_rotationSubset {β : Type*} [AddCommMonoid β] ∑ d ∈ rotationSubset, f d = ∑ k : Fin 22, f (orbitRep k) := by rw [rotationSubset_eq_image, Finset.sum_image fun k _ k' _ h => orbitRep_injective h] -/-- Integer mirror of the weight-zero transition: sixteen times its value. -/ +/-- Integer mirror of `slotTransition`: twice its value, in closed form. On the two + null sectors it is supported on the axis-`i` block `{t, xᵢ}` — the raising sector + `κ = 0` carries the sign matrix `[[1, -1], [-1, 1]]`, the lowering sector `κ = 1` the + all-ones matrix — and the transverse sector `κ = 2` is twice the identity on the two + transverse directions. `slotTransitionZ_eq_sum` recovers it as the + `lightConeCoeffInvZ · lightConeCoeffZ` composite summed over the sector. -/ +def slotTransitionZ (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℤ := + if κ = 2 then (if μ = ν ∧ μ ≠ Sum.inl 0 ∧ μ ≠ Sum.inr i then 2 else 0) + else if (μ = Sum.inl 0 ∨ μ = Sum.inr i) ∧ (ν = Sum.inl 0 ∨ ν = Sum.inr i) then + (if κ = 0 then (if μ = Sum.inr i then -1 else 1) * (if ν = Sum.inr i then -1 else 1) + else 1) + else 0 + +/-- The closed-form integer slot matrix is the sector sum of the coefficient + composites. -/ +lemma slotTransitionZ_eq_sum (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + slotTransitionZ i κ μ ν + = ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = κ), + lightConeCoeffInvZ i μ κ' * lightConeCoeffZ i κ' ν := by + decide +revert + +/-! + +## The closed form of the integer weight-zero transition + +The convolution over balanced sector patterns collapses slot by slot: transverse slots +force a diagonal factor `2`, incompatible slots kill the entry, and the null-sector +slots contribute the balanced elementary-symmetric fold of their signs. The proof is a +structured induction on the slots, peeling one slot at a time. + +-/ + +def InSector (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Prop := μ = Sum.inl 0 ∨ μ = Sum.inr i + +instance (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Decidable (InSector i μ) := + inferInstanceAs (Decidable (_ ∨ _)) + +def balancedSymZ : ℤ → List ℤ → ℤ + | m, [] => if m = 0 then 1 else 0 + | m, ε :: l => ε * balancedSymZ (m - 2) l + balancedSymZ (m + 2) l + +def sectorSigns (i : Fin 3) : {n : ℕ} → (d e : Fin n → Fin 1 ⊕ Fin 3) → List ℤ + | 0, _, _ => [] + | _ + 1, d, e => + if InSector i (e 0) then + nuSignZ i (e 0) (d 0) :: sectorSigns i (Fin.tail d) (Fin.tail e) + else sectorSigns i (Fin.tail d) (Fin.tail e) + +def transverseCount (i : Fin 3) : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → ℕ + | 0, _ => 0 + | _ + 1, e => (if InSector i (e 0) then 0 else 1) + transverseCount i (Fin.tail e) + +def weightTransitionZAux (i : Fin 3) {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) (m : ℤ) : ℤ := + ∑ w : Fin n → Fin 3, if (∑ s, sectorWeight (w s)) = m then + ∏ s, slotTransitionZ i (w s) (e s) (d s) else 0 + +lemma slotTransitionZ_raise_of_sector {i : Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (hμ : InSector i μ) (hν : InSector i ν) : + slotTransitionZ i 0 μ ν = nuSignZ i μ ν := by + rw [slotTransitionZ, nuSignZ, if_neg (by simp), if_pos ⟨hμ, hν⟩, if_pos rfl] + +lemma slotTransitionZ_lower_of_sector {i : Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (hμ : InSector i μ) (hν : InSector i ν) : + slotTransitionZ i 1 μ ν = 1 := by + rw [slotTransitionZ, if_neg (by simp), if_pos ⟨hμ, hν⟩, if_neg (by simp)] + +lemma slotTransitionZ_transverse_of_sector {i : Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (hμ : InSector i μ) : + slotTransitionZ i 2 μ ν = 0 := by + rw [slotTransitionZ, if_pos rfl, if_neg] + rintro ⟨-, h1, h2⟩ + rcases hμ with h | h + exacts [h1 h, h2 h] + +lemma slotTransitionZ_null_of_not_sector_left {i : Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (hμ : ¬InSector i μ) (κ : Fin 3) (hκ : κ ≠ 2) : + slotTransitionZ i κ μ ν = 0 := by + rw [slotTransitionZ, if_neg hκ, if_neg] + exact fun h => hμ h.1 + +lemma slotTransitionZ_null_of_not_sector_right {i : Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (hν : ¬InSector i ν) (κ : Fin 3) (hκ : κ ≠ 2) : + slotTransitionZ i κ μ ν = 0 := by + rw [slotTransitionZ, if_neg hκ, if_neg] + exact fun h => hν h.2 + +lemma slotTransitionZ_transverse_of_not_sector {i : Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (hμ : ¬InSector i μ) : + slotTransitionZ i 2 μ ν = if μ = ν then 2 else 0 := by + rw [slotTransitionZ, if_pos rfl] + simp only [InSector, not_or] at hμ + by_cases h : μ = ν + · rw [if_pos ⟨h, hμ.1, hμ.2⟩, if_pos h] + · rw [if_neg (fun hc => h hc.1), if_neg h] + +lemma weightTransitionZAux_nil (i : Fin 3) (d e : Fin 0 → Fin 1 ⊕ Fin 3) (m : ℤ) : + weightTransitionZAux i d e m = if m = 0 then 1 else 0 := by + rw [weightTransitionZAux, Fintype.sum_unique] + simp [eq_comm] + +lemma weightTransitionZAux_succ (i : Fin 3) {n : ℕ} (d e : Fin (n + 1) → Fin 1 ⊕ Fin 3) + (m : ℤ) : + weightTransitionZAux i d e m + = slotTransitionZ i 0 (e 0) (d 0) + * weightTransitionZAux i (Fin.tail d) (Fin.tail e) (m - 2) + + slotTransitionZ i 1 (e 0) (d 0) + * weightTransitionZAux i (Fin.tail d) (Fin.tail e) (m + 2) + + slotTransitionZ i 2 (e 0) (d 0) + * weightTransitionZAux i (Fin.tail d) (Fin.tail e) m := by + rw [weightTransitionZAux, + ← Equiv.sum_comp (Fin.consEquiv (fun _ : Fin (n + 1) => Fin 3)), Fintype.sum_prod_type] + simp only [Fin.consEquiv_apply, Fin.sum_univ_succ, Fin.prod_univ_succ, Fin.cons_zero, + Fin.cons_succ, Fin.sum_univ_zero, add_zero] + simp only [show sectorWeight 0 = 2 from rfl, show sectorWeight (Fin.succ 0) = -2 from rfl, + show sectorWeight ((Fin.succ 0).succ) = 0 from rfl] + rw [weightTransitionZAux, weightTransitionZAux, weightTransitionZAux, add_assoc] + congr 1 + · rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun w _ => by + rw [mul_ite, mul_zero] + exact if_congr (by omega) rfl rfl + · congr 1 + · rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun w _ => by + rw [mul_ite, mul_zero] + exact if_congr (by omega) rfl rfl + · rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun w _ => by + rw [mul_ite, mul_zero] + exact if_congr (by omega) rfl rfl + +theorem weightTransitionZAux_eq_closed (i : Fin 3) : + ∀ {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) (m : ℤ), + weightTransitionZAux i d e m + = if ∀ s, SameSlotSector i (e s) (d s) then + 2 ^ transverseCount i e * balancedSymZ m (sectorSigns i d e) + else 0 + | 0, d, e, m => by + rw [weightTransitionZAux_nil, if_pos (fun s => s.elim0)] + simp [transverseCount, sectorSigns, balancedSymZ] + | n + 1, d, e, m => by + rw [weightTransitionZAux_succ, + weightTransitionZAux_eq_closed i (Fin.tail d) (Fin.tail e) (m - 2), + weightTransitionZAux_eq_closed i (Fin.tail d) (Fin.tail e) (m + 2), + weightTransitionZAux_eq_closed i (Fin.tail d) (Fin.tail e) m] + simp only [Fin.forall_fin_succ] + by_cases htail : ∀ s : Fin n, SameSlotSector i (Fin.tail e s) (Fin.tail d s) + case neg => + rw [if_neg htail, if_neg htail, if_neg htail, if_neg (fun h => htail h.2)] + ring + case pos => + rw [if_pos htail, if_pos htail, if_pos htail] + by_cases he : InSector i (e 0) + · by_cases hd : InSector i (d 0) + · rw [slotTransitionZ_raise_of_sector he hd, slotTransitionZ_lower_of_sector he hd, + slotTransitionZ_transverse_of_sector he, if_pos ⟨Or.inl ⟨he, hd⟩, htail⟩] + simp only [transverseCount, if_pos he, zero_add, sectorSigns, balancedSymZ] + ring + · rw [slotTransitionZ_null_of_not_sector_right hd 0 (by simp), + slotTransitionZ_null_of_not_sector_right hd 1 (by simp), + slotTransitionZ_transverse_of_sector he, if_neg ?_] + · ring + · rintro ⟨⟨-, hd'⟩ | heq, -⟩ + exacts [hd hd', hd (heq ▸ he)] + · by_cases heq : e 0 = d 0 + · rw [slotTransitionZ_null_of_not_sector_left he 0 (by simp), + slotTransitionZ_null_of_not_sector_left he 1 (by simp), + slotTransitionZ_transverse_of_not_sector he, if_pos heq, + if_pos ⟨Or.inr heq, htail⟩] + simp only [transverseCount, if_neg he, sectorSigns] + rw [pow_add, pow_one] + ring + · rw [slotTransitionZ_null_of_not_sector_left he 0 (by simp), + slotTransitionZ_null_of_not_sector_left he 1 (by simp), + slotTransitionZ_transverse_of_not_sector he, if_neg heq, if_neg ?_] + · ring + · rintro ⟨⟨he', -⟩ | h, -⟩ + exacts [he he', heq h] + +/-- Integer mirror of the weight-zero transition: sixteen times its value, in closed + form — zero unless every slot is sector-compatible, and otherwise a power of two from + the transverse slots times the balanced symmetric fold of the null-sector signs. + `weightZeroTransitionZ_eq_sum_sector` recovers the balanced-sector convolution of the + integer slot matrices. -/ def weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := - ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), - ∏ s, lightConeCoeffInvZ i (e s) (c s) * lightConeCoeffZ i (c s) (d s) + if ∀ s, SameSlotSector i (e s) (d s) then + 2 ^ transverseCount i e * balancedSymZ 0 (sectorSigns i d e) + else 0 + +/-- The closed-form integer weight-zero transition as the balanced-sector convolution + of the integer slot matrices. -/ +lemma weightZeroTransitionZ_eq_sum_sector (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + weightZeroTransitionZ i d e + = ∑ w ∈ Finset.univ.filter (fun w : Fin 4 → Fin 3 => (∑ s, sectorWeight (w s)) = 0), + ∏ s, slotTransitionZ i (w s) (e s) (d s) := by + rw [weightZeroTransitionZ, ← weightTransitionZAux_eq_closed, weightTransitionZAux, + Finset.sum_filter] + + +/-- The integer weight-zero transition as a light-cone sum. -/ +lemma weightZeroTransitionZ_eq_sum_lightCone (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + weightZeroTransitionZ i d e + = ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvZ i (e s) (c s) * lightConeCoeffZ i (c s) (d s) := by + rw [weightZeroTransitionZ_eq_sum_sector] + simp only [slotTransitionZ_eq_sum] + exact (sum_weightZero_eq_sum_sector + (fun s κ => lightConeCoeffInvZ i (e s) κ * lightConeCoeffZ i κ (d s))).symm + + /-- The integer mirror casts to sixteen times the weight-zero transition. -/ lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ((weightZeroTransitionZ i d e : ℤ) : ℚ) = 16 * weightZeroTransition i d e := by - rw [weightZeroTransitionZ, weightZeroTransition] + rw [weightZeroTransitionZ_eq_sum_lightCone, weightZeroTransition_eq_sum_lightCone] push_cast rw [Finset.mul_sum] refine Finset.sum_congr rfl fun c _ => ?_ @@ -1514,17 +1794,47 @@ lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : norm_num [Finset.card_univ] /-- **The boost average on the orbit-sum span, as an integer matrix**: `48` times the - row-orbit sums of the boost average between representatives. -/ + row-orbit sums of the boost average between representatives, in explicit form. + `boostAverageOrbitZ_eq_sum` identifies the entries with the row-orbit sums of the + integer weight-zero transitions. -/ def boostAverageOrbitZ : Matrix (Fin 22) (Fin 22) ℤ := - Matrix.of fun k l => ∑ d' ∈ rotationIndexSet (orbitRep k), - ∑ i : Fin 3, weightZeroTransitionZ i d' (orbitRep l) + !![18, -2, -2, -2, 0, 0, -2, -2, 0, 0, -2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; + -6, 22, -2, -2, 0, 0, -2, -2, 0, 0, 6, -2, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0; + -6, -2, 22, -2, 0, 0, -2, 6, 0, 0, -2, -2, 0, 0, 0, -8, 0, 0, 0, -8, 0, 0; + -6, -2, -2, 22, 0, 0, 6, -2, 0, 0, -2, -2, 0, 0, 0, 0, -8, 0, 0, 0, 0, -8; + 0, 0, 0, 0, 24, 0, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, 0, 0, 0; + 0, 0, 0, 0, 0, 24, 0, 0, 0, -8, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, -8, 0; + -6, -2, -2, 6, 0, 0, 22, -2, 0, 0, -2, -2, 0, 0, 0, 0, -8, 0, 0, 0, 0, -8; + -6, -2, 6, -2, 0, 0, -2, 22, 0, 0, -2, -2, 0, 0, 0, -8, 0, 0, 0, -8, 0, 0; + 0, 0, 0, 0, -8, 0, 0, 0, 24, 0, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, -8, 0; + 0, 0, 0, 0, 0, -8, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, -8, -8, 0, 0, 0; + -6, 6, -2, -2, 0, 0, -2, -2, 0, 0, 22, -2, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0; + 18, -2, -2, -2, 0, 0, -2, -2, 0, 0, -2, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; + 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0; + 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, -8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0; + 0, 0, 0, 0, 0, -8, 0, 0, -8, 0, 0, 0, 0, 0, 24, 0, 0, -8, 0, 0, 0, 0; + 0, 0, -8, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0; + 0, 0, 0, -8, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0; + 0, 0, 0, 0, -8, 0, 0, 0, 0, -8, 0, 0, 0, 0, -8, 0, 0, 24, 0, 0, 0, 0; + 0, 0, 0, 0, -8, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, -8, 0; + 0, 0, -8, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0; + 0, 0, 0, 0, 0, -8, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 0, 24, 0; + 0, 0, 0, -8, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32] + +set_option maxRecDepth 40000 in +/-- The entries of the explicit boost-average matrix are the row-orbit sums of the + integer weight-zero transitions. -/ +lemma boostAverageOrbitZ_eq_sum : ∀ k l : Fin 22, + boostAverageOrbitZ k l = ∑ d' ∈ rotationIndexSet (orbitRep k), + ∑ i : Fin 3, weightZeroTransitionZ i d' (orbitRep l) := by + decide +kernel /-- The integer matrix casts to `48` times the row-orbit sums of the boost average. -/ lemma coe_boostAverageOrbitZ (k l : Fin 22) : ((boostAverageOrbitZ k l : ℤ) : ℚ) = 48 * ∑ d' ∈ rotationIndexSet (orbitRep k), boostAverageTransition d' (orbitRep l) := by - simp only [boostAverageOrbitZ, Matrix.of_apply] + simp only [boostAverageOrbitZ_eq_sum] push_cast rw [Finset.mul_sum] refine Finset.sum_congr rfl fun d' _ => ?_ @@ -1536,7 +1846,6 @@ lemma coe_boostAverageOrbitZ (k l : Fin 22) : rw [← Finset.mul_sum] ring - include hT in /-- **One averaged round at orbit level, integer form**: over the enumerated representatives, an averaged round acts by the integer matrix `boostAverageOrbitZ` @@ -1575,6 +1884,59 @@ lemma eq_sum_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) rw [hb] ring +include hT in +/-- **Iterated averaged rounds at orbit level**: `n` rounds act by the `n`-th power of + the integer matrix with the `48⁻ⁿ` normalisation. -/ +lemma eq_sum_pow_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) (n : ℕ) : + x = ∑ k, (((48 : ℂ) ^ n)⁻¹ * ∑ l, (((boostAverageOrbitZ ^ n) k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + induction n with + | zero => + rw [hx] + refine Finset.sum_congr rfl fun k _ => ?_ + congr 1 + rw [pow_zero, pow_zero] + simp [Matrix.one_apply, apply_ite (fun q : ℤ => (q : ℂ)), ite_mul, Finset.sum_ite_eq] + | succ n ih => + rw [hT.eq_sum_boostAverageOrbitZ_smul + (fun k => ((48 : ℂ) ^ n)⁻¹ * ∑ l, (((boostAverageOrbitZ ^ n) k l : ℤ) : ℂ) * c l) + ih hw] + refine Finset.sum_congr rfl fun k _ => ?_ + congr 1 + calc (48 : ℂ)⁻¹ * ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) + * (((48 : ℂ) ^ n)⁻¹ * ∑ m, (((boostAverageOrbitZ ^ n) l m : ℤ) : ℂ) * c m) + = ((48 : ℂ) ^ (n + 1))⁻¹ * ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) + * ∑ m, (((boostAverageOrbitZ ^ n) l m : ℤ) : ℂ) * c m := by + rw [Finset.mul_sum, Finset.mul_sum] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [pow_succ] + field_simp + _ = ((48 : ℂ) ^ (n + 1))⁻¹ * ∑ m, (((boostAverageOrbitZ * boostAverageOrbitZ ^ n) k m + : ℤ) : ℂ) * c m := by + congr 1 + calc ∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) + * ∑ m, (((boostAverageOrbitZ ^ n) l m : ℤ) : ℂ) * c m + = ∑ l, ∑ m, ((boostAverageOrbitZ k l : ℤ) : ℂ) + * ((((boostAverageOrbitZ ^ n) l m : ℤ) : ℂ) * c m) := + Finset.sum_congr rfl fun l _ => by rw [Finset.mul_sum] + _ = ∑ m, (∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) + * (((boostAverageOrbitZ ^ n) l m : ℤ) : ℂ)) * c m := by + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun m _ => ?_ + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun l _ => (mul_assoc _ _ _).symm + _ = ∑ m, (((boostAverageOrbitZ * boostAverageOrbitZ ^ n) k m : ℤ) : ℂ) * c m := by + refine Finset.sum_congr rfl fun m _ => ?_ + congr 1 + rw [Matrix.mul_apply] + push_cast + rfl + _ = ((48 : ℂ) ^ (n + 1))⁻¹ + * ∑ m, (((boostAverageOrbitZ ^ (n + 1)) k m : ℤ) : ℂ) * c m := by + rw [← pow_succ' boostAverageOrbitZ n] + /-! ### X. Eigenvectors of the boost average on the orbit-sum span @@ -1589,69 +1951,613 @@ block except `1` is annihilated by the certificate polynomial -/ +/-- **Twenty-four times the projector onto the invariant block**: the integer matrix + `P` with `boostAverageOrbitZ * P = 48 • P` and `P * P = 24 • P`, so that `24⁻¹ • P` + projects the orbit-sum span onto the eigenvalue-`48` block — the invariant + contractions. -/ +def contractionProjectorZ : Matrix (Fin 22) (Fin 22) ℤ := + !![3, -1, -1, -1, 0, 0, -1, -1, 0, 0, -1, 3, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1; + -3, 5, -1, -1, 0, 0, -1, -1, 0, 0, 5, -3, -5, -5, 0, 1, 1, 0, 0, 1, 0, 1; + -3, -1, 5, -1, 0, 0, -1, 5, 0, 0, -1, -3, 1, 1, 0, -5, 1, 0, 0, -5, 0, 1; + -3, -1, -1, 5, 0, 0, 5, -1, 0, 0, -1, -3, 1, 1, 0, 1, -5, 0, 0, 1, 0, -5; + 0, 0, 0, 0, 3, -3, 0, 0, -3, 3, 0, 0, 0, 0, 3, 0, 0, -3, -3, 0, 3, 0; + 0, 0, 0, 0, -3, 3, 0, 0, 3, -3, 0, 0, 0, 0, -3, 0, 0, 3, 3, 0, -3, 0; + -3, -1, -1, 5, 0, 0, 5, -1, 0, 0, -1, -3, 1, 1, 0, 1, -5, 0, 0, 1, 0, -5; + -3, -1, 5, -1, 0, 0, -1, 5, 0, 0, -1, -3, 1, 1, 0, -5, 1, 0, 0, -5, 0, 1; + 0, 0, 0, 0, -3, 3, 0, 0, 3, -3, 0, 0, 0, 0, -3, 0, 0, 3, 3, 0, -3, 0; + 0, 0, 0, 0, 3, -3, 0, 0, -3, 3, 0, 0, 0, 0, 3, 0, 0, -3, -3, 0, 3, 0; + -3, 5, -1, -1, 0, 0, -1, -1, 0, 0, 5, -3, -5, -5, 0, 1, 1, 0, 0, 1, 0, 1; + 9, -3, -3, -3, 0, 0, -3, -3, 0, 0, -3, 9, 3, 3, 0, 3, 3, 0, 0, 3, 0, 3; + 3, -5, 1, 1, 0, 0, 1, 1, 0, 0, -5, 3, 5, 5, 0, -1, -1, 0, 0, -1, 0, -1; + 3, -5, 1, 1, 0, 0, 1, 1, 0, 0, -5, 3, 5, 5, 0, -1, -1, 0, 0, -1, 0, -1; + 0, 0, 0, 0, 3, -3, 0, 0, -3, 3, 0, 0, 0, 0, 3, 0, 0, -3, -3, 0, 3, 0; + 3, 1, -5, 1, 0, 0, 1, -5, 0, 0, 1, 3, -1, -1, 0, 5, -1, 0, 0, 5, 0, -1; + 3, 1, 1, -5, 0, 0, -5, 1, 0, 0, 1, 3, -1, -1, 0, -1, 5, 0, 0, -1, 0, 5; + 0, 0, 0, 0, -3, 3, 0, 0, 3, -3, 0, 0, 0, 0, -3, 0, 0, 3, 3, 0, -3, 0; + 0, 0, 0, 0, -3, 3, 0, 0, 3, -3, 0, 0, 0, 0, -3, 0, 0, 3, 3, 0, -3, 0; + 3, 1, -5, 1, 0, 0, 1, -5, 0, 0, 1, 3, -1, -1, 0, 5, -1, 0, 0, 5, 0, -1; + 0, 0, 0, 0, 3, -3, 0, 0, -3, 3, 0, 0, 0, 0, 3, 0, 0, -3, -3, 0, 3, 0; + 3, 1, 1, -5, 0, 0, -5, 1, 0, 0, 1, 3, -1, -1, 0, -1, 5, 0, 0, -1, 0, 5] + +/-- **The certificate polynomial applied to the boost average**: the integer-scaled + annihilator of the non-invariant blocks, `μ(μ-32)(μ-16)(μ²-44μ+192)` at + `μ = boostAverageOrbitZ` — the polynomial `λ(3λ-2)(3λ-1)(12λ²-11λ+1)` of the + normalised average `λ = μ/48`, cleared of denominators. -/ +def Q : Matrix (Fin 22) (Fin 22) ℤ := + boostAverageOrbitZ * (boostAverageOrbitZ - 32) * (boostAverageOrbitZ - 16) * + (boostAverageOrbitZ * boostAverageOrbitZ - 44 • boostAverageOrbitZ + 192) + +set_option maxRecDepth 40000 in +/-- **The certificate collapses to the projector**: applying the certificate polynomial + to the boost average yields `393216` times `contractionProjectorZ`. Verified through + materialised intermediate products, so each kernel step is a single multiplication of + explicit integer matrices. -/ +lemma Q_explicit : Q = (393216 : ℤ) • contractionProjectorZ := by + have h1 : boostAverageOrbitZ * (boostAverageOrbitZ - 32) + = (!![-72, -24, -24, -24, 0, 0, -24, -24, 0, 0, -24, 168, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + -72, -24, -24, -24, 0, 0, -24, -24, 0, 0, 232, -88, -224, -224, 0, 32, 32, 0, 0, 32, 0, 32; + -72, -24, -24, -24, 0, 0, -24, 232, 0, 0, -24, -88, 32, 32, 0, -224, 32, 0, 0, -224, 0, 32; + -72, -24, -24, -24, 0, 0, 232, -24, 0, 0, -24, -88, 32, 32, 0, 32, -224, 0, 0, 32, 0, -224; + 0, 0, 0, 0, 0, 0, 0, 0, -128, 128, 0, 0, 0, 0, 128, 0, 0, -128, -128, 0, 128, 0; + 0, 0, 0, 0, 0, 0, 0, 0, 128, -128, 0, 0, 0, 0, -128, 0, 0, 128, 128, 0, -128, 0; + -72, -24, -24, 232, 0, 0, -24, -24, 0, 0, -24, -88, 32, 32, 0, 32, -224, 0, 0, 32, 0, -224; + -72, -24, 232, -24, 0, 0, -24, -24, 0, 0, -24, -88, 32, 32, 0, -224, 32, 0, 0, -224, 0, 32; + 0, 0, 0, 0, -128, 128, 0, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, 128, 128, 0, -128, 0; + 0, 0, 0, 0, 128, -128, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, -128, -128, 0, 128, 0; + -72, 232, -24, -24, 0, 0, -24, -24, 0, 0, -24, -88, -224, -224, 0, 32, 32, 0, 0, 32, 0, 32; + 504, -88, -88, -88, 0, 0, -88, -88, 0, 0, -88, 360, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + 96, -224, 32, 32, 0, 0, 32, 32, 0, 0, -224, 32, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0; + 96, -224, 32, 32, 0, 0, 32, 32, 0, 0, -224, 32, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0; + 0, 0, 0, 0, 128, -128, 0, 0, -128, 128, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, 128, 0; + 96, 32, -224, 32, 0, 0, 32, -224, 0, 0, 32, 32, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0; + 96, 32, 32, -224, 0, 0, -224, 32, 0, 0, 32, 32, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128; + 0, 0, 0, 0, -128, 128, 0, 0, 128, -128, 0, 0, 0, 0, -128, 0, 0, 0, 128, 0, 0, 0; + 0, 0, 0, 0, -128, 128, 0, 0, 128, -128, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, -128, 0; + 96, 32, -224, 32, 0, 0, 32, -224, 0, 0, 32, 32, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0; + 0, 0, 0, 0, 128, -128, 0, 0, -128, 128, 0, 0, 0, 0, 128, 0, 0, 0, -128, 0, 0, 0; + 96, 32, 32, -224, 0, 0, -224, 32, 0, 0, 32, 32, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128] : Matrix (Fin 22) (Fin 22) ℤ) := by + ext k l + revert k l + decide +kernel + have h2 : (!![-72, -24, -24, -24, 0, 0, -24, -24, 0, 0, -24, 168, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + -72, -24, -24, -24, 0, 0, -24, -24, 0, 0, 232, -88, -224, -224, 0, 32, 32, 0, 0, 32, 0, 32; + -72, -24, -24, -24, 0, 0, -24, 232, 0, 0, -24, -88, 32, 32, 0, -224, 32, 0, 0, -224, 0, 32; + -72, -24, -24, -24, 0, 0, 232, -24, 0, 0, -24, -88, 32, 32, 0, 32, -224, 0, 0, 32, 0, -224; + 0, 0, 0, 0, 0, 0, 0, 0, -128, 128, 0, 0, 0, 0, 128, 0, 0, -128, -128, 0, 128, 0; + 0, 0, 0, 0, 0, 0, 0, 0, 128, -128, 0, 0, 0, 0, -128, 0, 0, 128, 128, 0, -128, 0; + -72, -24, -24, 232, 0, 0, -24, -24, 0, 0, -24, -88, 32, 32, 0, 32, -224, 0, 0, 32, 0, -224; + -72, -24, 232, -24, 0, 0, -24, -24, 0, 0, -24, -88, 32, 32, 0, -224, 32, 0, 0, -224, 0, 32; + 0, 0, 0, 0, -128, 128, 0, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, 128, 128, 0, -128, 0; + 0, 0, 0, 0, 128, -128, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, -128, -128, 0, 128, 0; + -72, 232, -24, -24, 0, 0, -24, -24, 0, 0, -24, -88, -224, -224, 0, 32, 32, 0, 0, 32, 0, 32; + 504, -88, -88, -88, 0, 0, -88, -88, 0, 0, -88, 360, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + 96, -224, 32, 32, 0, 0, 32, 32, 0, 0, -224, 32, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0; + 96, -224, 32, 32, 0, 0, 32, 32, 0, 0, -224, 32, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0; + 0, 0, 0, 0, 128, -128, 0, 0, -128, 128, 0, 0, 0, 0, 0, 0, 0, -128, 0, 0, 128, 0; + 96, 32, -224, 32, 0, 0, 32, -224, 0, 0, 32, 32, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0; + 96, 32, 32, -224, 0, 0, -224, 32, 0, 0, 32, 32, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128; + 0, 0, 0, 0, -128, 128, 0, 0, 128, -128, 0, 0, 0, 0, -128, 0, 0, 0, 128, 0, 0, 0; + 0, 0, 0, 0, -128, 128, 0, 0, 128, -128, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, -128, 0; + 96, 32, -224, 32, 0, 0, 32, -224, 0, 0, 32, 32, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0; + 0, 0, 0, 0, 128, -128, 0, 0, -128, 128, 0, 0, 0, 0, 128, 0, 0, 0, -128, 0, 0, 0; + 96, 32, 32, -224, 0, 0, -224, 32, 0, 0, 32, 32, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128] : Matrix (Fin 22) (Fin 22) ℤ) + * (boostAverageOrbitZ - 16) + = (!![3744, -800, -800, -800, 0, 0, -800, -800, 0, 0, -800, 3552, 896, 896, 0, 896, 896, 0, 0, 896, 0, 896; + -2400, 5344, -800, -800, 0, 0, -800, -800, 0, 0, 5344, -2592, -5248, -5248, 0, 896, 896, 0, 0, 896, 0, 896; + -2400, -800, 5344, -800, 0, 0, -800, 5344, 0, 0, -800, -2592, 896, 896, 0, -5248, 896, 0, 0, -5248, 0, 896; + -2400, -800, -800, 5344, 0, 0, 5344, -800, 0, 0, -800, -2592, 896, 896, 0, 896, -5248, 0, 0, 896, 0, -5248; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + -2400, -800, -800, 5344, 0, 0, 5344, -800, 0, 0, -800, -2592, 896, 896, 0, 896, -5248, 0, 0, 896, 0, -5248; + -2400, -800, 5344, -800, 0, 0, -800, 5344, 0, 0, -800, -2592, 896, 896, 0, -5248, 896, 0, 0, -5248, 0, 896; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + -2400, 5344, -800, -800, 0, 0, -800, -800, 0, 0, 5344, -2592, -5248, -5248, 0, 896, 896, 0, 0, 896, 0, 896; + 10656, -2592, -2592, -2592, 0, 0, -2592, -2592, 0, 0, -2592, 12000, 1920, 1920, 0, 1920, 1920, 0, 0, 1920, 0, 1920; + 2688, -5248, 896, 896, 0, 0, 896, 896, 0, 0, -5248, 1920, 5632, 5632, 0, -512, -512, 0, 0, -512, 0, -512; + 2688, -5248, 896, 896, 0, 0, 896, 896, 0, 0, -5248, 1920, 5632, 5632, 0, -512, -512, 0, 0, -512, 0, -512; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + 2688, 896, -5248, 896, 0, 0, 896, -5248, 0, 0, 896, 1920, -512, -512, 0, 5632, -512, 0, 0, 5632, 0, -512; + 2688, 896, 896, -5248, 0, 0, -5248, 896, 0, 0, 896, 1920, -512, -512, 0, -512, 5632, 0, 0, -512, 0, 5632; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + 2688, 896, -5248, 896, 0, 0, 896, -5248, 0, 0, 896, 1920, -512, -512, 0, 5632, -512, 0, 0, 5632, 0, -512; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + 2688, 896, 896, -5248, 0, 0, -5248, 896, 0, 0, 896, 1920, -512, -512, 0, -512, 5632, 0, 0, -512, 0, 5632] : Matrix (Fin 22) (Fin 22) ℤ) := by + ext k l + revert k l + decide +kernel + have h3 : boostAverageOrbitZ * boostAverageOrbitZ - 44 • boostAverageOrbitZ + 192 + = (!![-96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 160, -64, -128, -128, 0, 32, 32, 0, 0, 32, 0, 32; + 0, 0, -96, 0, 0, 0, 0, 160, 0, 0, 0, -64, 32, 32, 0, -128, 32, 0, 0, -128, 0, 32; + 0, 0, 0, -96, 0, 0, 160, 0, 0, 0, 0, -64, 32, 32, 0, 32, -128, 0, 0, 32, 0, -128; + 0, 0, 0, 0, -96, 0, 0, 0, -32, 128, 0, 0, 0, 0, 128, 0, 0, -32, -32, 0, 128, 0; + 0, 0, 0, 0, 0, -96, 0, 0, 128, -32, 0, 0, 0, 0, -32, 0, 0, 128, 128, 0, -32, 0; + 0, 0, 0, 160, 0, 0, -96, 0, 0, 0, 0, -64, 32, 32, 0, 32, -128, 0, 0, 32, 0, -128; + 0, 0, 160, 0, 0, 0, 0, -96, 0, 0, 0, -64, 32, 32, 0, -128, 32, 0, 0, -128, 0, 32; + 0, 0, 0, 0, -32, 128, 0, 0, -96, 0, 0, 0, 0, 0, -32, 0, 0, 128, 128, 0, -32, 0; + 0, 0, 0, 0, 128, -32, 0, 0, 0, -96, 0, 0, 0, 0, 128, 0, 0, -32, -32, 0, 128, 0; + 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, -96, -64, -128, -128, 0, 32, 32, 0, 0, 32, 0, 32; + 288, -64, -64, -64, 0, 0, -64, -64, 0, 0, -64, 96, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + 96, -128, 32, 32, 0, 0, 32, 32, 0, 0, -128, 32, -64, 128, 0, 0, 0, 0, 0, 0, 0, 0; + 96, -128, 32, 32, 0, 0, 32, 32, 0, 0, -128, 32, 128, -64, 0, 0, 0, 0, 0, 0, 0, 0; + 0, 0, 0, 0, 128, -32, 0, 0, -32, 128, 0, 0, 0, 0, -96, 0, 0, -32, 0, 0, 128, 0; + 96, 32, -128, 32, 0, 0, 32, -128, 0, 0, 32, 32, 0, 0, 0, -64, 0, 0, 0, 128, 0, 0; + 96, 32, 32, -128, 0, 0, -128, 32, 0, 0, 32, 32, 0, 0, 0, 0, -64, 0, 0, 0, 0, 128; + 0, 0, 0, 0, -32, 128, 0, 0, 128, -32, 0, 0, 0, 0, -32, 0, 0, -96, 128, 0, 0, 0; + 0, 0, 0, 0, -32, 128, 0, 0, 128, -32, 0, 0, 0, 0, 0, 0, 0, 128, -96, 0, -32, 0; + 96, 32, -128, 32, 0, 0, 32, -128, 0, 0, 32, 32, 0, 0, 0, 128, 0, 0, 0, -64, 0, 0; + 0, 0, 0, 0, 128, -32, 0, 0, -32, 128, 0, 0, 0, 0, 128, 0, 0, 0, -32, 0, -96, 0; + 96, 32, 32, -128, 0, 0, -128, 32, 0, 0, 32, 32, 0, 0, 0, 0, 128, 0, 0, 0, 0, -64] : Matrix (Fin 22) (Fin 22) ℤ) := by + ext k l + revert k l + decide +kernel + have h4 : (!![3744, -800, -800, -800, 0, 0, -800, -800, 0, 0, -800, 3552, 896, 896, 0, 896, 896, 0, 0, 896, 0, 896; + -2400, 5344, -800, -800, 0, 0, -800, -800, 0, 0, 5344, -2592, -5248, -5248, 0, 896, 896, 0, 0, 896, 0, 896; + -2400, -800, 5344, -800, 0, 0, -800, 5344, 0, 0, -800, -2592, 896, 896, 0, -5248, 896, 0, 0, -5248, 0, 896; + -2400, -800, -800, 5344, 0, 0, 5344, -800, 0, 0, -800, -2592, 896, 896, 0, 896, -5248, 0, 0, 896, 0, -5248; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + -2400, -800, -800, 5344, 0, 0, 5344, -800, 0, 0, -800, -2592, 896, 896, 0, 896, -5248, 0, 0, 896, 0, -5248; + -2400, -800, 5344, -800, 0, 0, -800, 5344, 0, 0, -800, -2592, 896, 896, 0, -5248, 896, 0, 0, -5248, 0, 896; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + -2400, 5344, -800, -800, 0, 0, -800, -800, 0, 0, 5344, -2592, -5248, -5248, 0, 896, 896, 0, 0, 896, 0, 896; + 10656, -2592, -2592, -2592, 0, 0, -2592, -2592, 0, 0, -2592, 12000, 1920, 1920, 0, 1920, 1920, 0, 0, 1920, 0, 1920; + 2688, -5248, 896, 896, 0, 0, 896, 896, 0, 0, -5248, 1920, 5632, 5632, 0, -512, -512, 0, 0, -512, 0, -512; + 2688, -5248, 896, 896, 0, 0, 896, 896, 0, 0, -5248, 1920, 5632, 5632, 0, -512, -512, 0, 0, -512, 0, -512; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + 2688, 896, -5248, 896, 0, 0, 896, -5248, 0, 0, 896, 1920, -512, -512, 0, 5632, -512, 0, 0, 5632, 0, -512; + 2688, 896, 896, -5248, 0, 0, -5248, 896, 0, 0, 896, 1920, -512, -512, 0, -512, 5632, 0, 0, -512, 0, 5632; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + 0, 0, 0, 0, -3072, 3072, 0, 0, 3072, -3072, 0, 0, 0, 0, -3072, 0, 0, 3072, 3072, 0, -3072, 0; + 2688, 896, -5248, 896, 0, 0, 896, -5248, 0, 0, 896, 1920, -512, -512, 0, 5632, -512, 0, 0, 5632, 0, -512; + 0, 0, 0, 0, 3072, -3072, 0, 0, -3072, 3072, 0, 0, 0, 0, 3072, 0, 0, -3072, -3072, 0, 3072, 0; + 2688, 896, 896, -5248, 0, 0, -5248, 896, 0, 0, 896, 1920, -512, -512, 0, -512, 5632, 0, 0, -512, 0, 5632] : Matrix (Fin 22) (Fin 22) ℤ) + * (!![-96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 160, -64, -128, -128, 0, 32, 32, 0, 0, 32, 0, 32; + 0, 0, -96, 0, 0, 0, 0, 160, 0, 0, 0, -64, 32, 32, 0, -128, 32, 0, 0, -128, 0, 32; + 0, 0, 0, -96, 0, 0, 160, 0, 0, 0, 0, -64, 32, 32, 0, 32, -128, 0, 0, 32, 0, -128; + 0, 0, 0, 0, -96, 0, 0, 0, -32, 128, 0, 0, 0, 0, 128, 0, 0, -32, -32, 0, 128, 0; + 0, 0, 0, 0, 0, -96, 0, 0, 128, -32, 0, 0, 0, 0, -32, 0, 0, 128, 128, 0, -32, 0; + 0, 0, 0, 160, 0, 0, -96, 0, 0, 0, 0, -64, 32, 32, 0, 32, -128, 0, 0, 32, 0, -128; + 0, 0, 160, 0, 0, 0, 0, -96, 0, 0, 0, -64, 32, 32, 0, -128, 32, 0, 0, -128, 0, 32; + 0, 0, 0, 0, -32, 128, 0, 0, -96, 0, 0, 0, 0, 0, -32, 0, 0, 128, 128, 0, -32, 0; + 0, 0, 0, 0, 128, -32, 0, 0, 0, -96, 0, 0, 0, 0, 128, 0, 0, -32, -32, 0, 128, 0; + 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, -96, -64, -128, -128, 0, 32, 32, 0, 0, 32, 0, 32; + 288, -64, -64, -64, 0, 0, -64, -64, 0, 0, -64, 96, 32, 32, 0, 32, 32, 0, 0, 32, 0, 32; + 96, -128, 32, 32, 0, 0, 32, 32, 0, 0, -128, 32, -64, 128, 0, 0, 0, 0, 0, 0, 0, 0; + 96, -128, 32, 32, 0, 0, 32, 32, 0, 0, -128, 32, 128, -64, 0, 0, 0, 0, 0, 0, 0, 0; + 0, 0, 0, 0, 128, -32, 0, 0, -32, 128, 0, 0, 0, 0, -96, 0, 0, -32, 0, 0, 128, 0; + 96, 32, -128, 32, 0, 0, 32, -128, 0, 0, 32, 32, 0, 0, 0, -64, 0, 0, 0, 128, 0, 0; + 96, 32, 32, -128, 0, 0, -128, 32, 0, 0, 32, 32, 0, 0, 0, 0, -64, 0, 0, 0, 0, 128; + 0, 0, 0, 0, -32, 128, 0, 0, 128, -32, 0, 0, 0, 0, -32, 0, 0, -96, 128, 0, 0, 0; + 0, 0, 0, 0, -32, 128, 0, 0, 128, -32, 0, 0, 0, 0, 0, 0, 0, 128, -96, 0, -32, 0; + 96, 32, -128, 32, 0, 0, 32, -128, 0, 0, 32, 32, 0, 0, 0, 128, 0, 0, 0, -64, 0, 0; + 0, 0, 0, 0, 128, -32, 0, 0, -32, 128, 0, 0, 0, 0, 128, 0, 0, 0, -32, 0, -96, 0; + 96, 32, 32, -128, 0, 0, -128, 32, 0, 0, 32, 32, 0, 0, 0, 0, 128, 0, 0, 0, 0, -64] : Matrix (Fin 22) (Fin 22) ℤ) + = (393216 : ℤ) • contractionProjectorZ := by + ext k l + revert k l + decide +kernel + rw [Q, h1, h2, h3, h4] + +/-- The certificate polynomial expanded into powers. -/ +lemma Q_eq_poly : Q = boostAverageOrbitZ ^ 5 - (92 : ℤ) • boostAverageOrbitZ ^ 4 + + (2816 : ℤ) • boostAverageOrbitZ ^ 3 - (31744 : ℤ) • boostAverageOrbitZ ^ 2 + + (98304 : ℤ) • boostAverageOrbitZ := by + rw [Q] + noncomm_ring + +include hT in +/-- **The certificate round**: applying the certificate polynomial of the averaged round + to the coefficients reproduces `x` — the combination of five iterated rounds weighted + by the certificate coefficients. -/ +lemma eq_sum_Q_smul {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ k, ((9437184 : ℂ)⁻¹ * ∑ l, ((Q k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + have h1 := hT.eq_sum_pow_boostAverageOrbitZ_smul c hx hw 1 + have h2 := hT.eq_sum_pow_boostAverageOrbitZ_smul c hx hw 2 + have h3 := hT.eq_sum_pow_boostAverageOrbitZ_smul c hx hw 3 + have h4 := hT.eq_sum_pow_boostAverageOrbitZ_smul c hx hw 4 + have h5 := hT.eq_sum_pow_boostAverageOrbitZ_smul c hx hw 5 + have key : (27 : ℂ) • x - (207 / 4 : ℂ) • x + (33 : ℂ) • x - (31 / 4 : ℂ) • x + + (2⁻¹ : ℂ) • x + = ∑ k, ((9437184 : ℂ)⁻¹ * ∑ l, ((Q k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + nth_rewrite 1 [h5] + nth_rewrite 1 [h4] + nth_rewrite 1 [h3] + nth_rewrite 1 [h2] + nth_rewrite 1 [h1] + simp only [Finset.smul_sum, smul_smul] + rw [← Finset.sum_sub_distrib, ← Finset.sum_add_distrib, ← Finset.sum_sub_distrib, + ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun k _ => ?_ + simp only [← sub_smul, ← add_smul] + congr 1 + have hQc : ∀ l, ((Q k l : ℤ) : ℂ) + = (((boostAverageOrbitZ ^ 5) k l : ℤ) : ℂ) + - 92 * (((boostAverageOrbitZ ^ 4) k l : ℤ) : ℂ) + + 2816 * (((boostAverageOrbitZ ^ 3) k l : ℤ) : ℂ) + - 31744 * (((boostAverageOrbitZ ^ 2) k l : ℤ) : ℂ) + + 98304 * ((boostAverageOrbitZ k l : ℤ) : ℂ) := fun l => by + rw [Q_eq_poly] + push_cast [Matrix.sub_apply, Matrix.add_apply, Matrix.smul_apply, smul_eq_mul] + ring + have hsplit : ∑ l, ((Q k l : ℤ) : ℂ) * c l + = (∑ l, (((boostAverageOrbitZ ^ 5) k l : ℤ) : ℂ) * c l) + - 92 * (∑ l, (((boostAverageOrbitZ ^ 4) k l : ℤ) : ℂ) * c l) + + 2816 * (∑ l, (((boostAverageOrbitZ ^ 3) k l : ℤ) : ℂ) * c l) + - 31744 * (∑ l, (((boostAverageOrbitZ ^ 2) k l : ℤ) : ℂ) * c l) + + 98304 * (∑ l, ((boostAverageOrbitZ k l : ℤ) : ℂ) * c l) := by + simp only [hQc, Finset.mul_sum, ← Finset.sum_sub_distrib, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun l _ => by ring + rw [hsplit] + field_simp + ring + calc x = (27 : ℂ) • x - (207 / 4 : ℂ) • x + (33 : ℂ) • x - (31 / 4 : ℂ) • x + + (2⁻¹ : ℂ) • x := by module + _ = _ := key + +include hT in +/-- **The projector round**: the certificate collapses to `24⁻¹` times the integer + projector matrix — one clean application of `contractionProjectorZ` reproduces the + coefficients of any all-axes weight-zero element. -/ +lemma eq_sum_contractionProjectorZ_smul {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ k, ((24 : ℂ)⁻¹ * ∑ l, ((contractionProjectorZ k l : ℤ) : ℂ) * c l) + • rotationOrbitSum (T := T) (orbitRep k) := by + rw [hT.eq_sum_Q_smul c hx hw] + refine Finset.sum_congr rfl fun k _ => ?_ + congr 1 + have hP : ∀ l, ((Q k l : ℤ) : ℂ) = 393216 * ((contractionProjectorZ k l : ℤ) : ℂ) := + fun l => by + rw [Q_explicit] + simp only [Matrix.smul_apply, smul_eq_mul] + push_cast + ring + simp only [hP, mul_assoc] + rw [← Finset.mul_sum] + field_simp + ring + /-! -## G. The invariant contractions +## G. The four invariant contractions + +The Lorentz-invariant elements built from `T`: the three double metric contractions — +outer `g^{μν} g^{ρσ} T_{μνρσ}`, inner `g^{μρ} g^{νσ} T_{μνρσ}`, split +`g^{μσ} g^{νρ} T_{μνρσ}` — and the Levi-Civita contraction `ε^{μνρσ} T_{μνρσ}`. +In orbit coordinates they are the four explicit integer vectors spanning the image of +`contractionProjectorZ`. -/ -def test : Matrix (Fin 22) (Fin 22) ℚ := Matrix.of fun i j => if i = j then 1 else 0 +/-- The Minkowski sign of a direction: `+1` on time, `-1` on space. -/ +def minkowskiSignZ : Fin 1 ⊕ Fin 3 → ℤ := Sum.elim (fun _ => 1) (fun _ => -1) +/-- The Minkowski metric on direction letters. -/ +def etaZ (μ ν : Fin 1 ⊕ Fin 3) : ℤ := if μ = ν then minkowskiSignZ μ else 0 -/-- The Minkowski sign of a coordinate direction: `+1` on the time direction and `-1` on - the spatial directions. -/ -def minkSign : Fin 1 ⊕ Fin 3 → ℂ := Sum.elim (fun _ => 1) (fun _ => -1) +/-- The numeric label of a direction, for the Levi-Civita sign. -/ +def dirNum : Fin 1 ⊕ Fin 3 → ℤ := Sum.elim (fun _ => 0) (fun j => (j : ℤ) + 1) -/-- The enumeration `t, x, y, z` of the coordinate directions. -/ -def coordIdx : Fin 4 → Fin 1 ⊕ Fin 3 := ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2] +/-- The Levi-Civita sign of a four-tuple of directions: the product of the signs of the + label differences — `±1` on the permutations of `(t, x, y, z)` and `0` otherwise. -/ +def epsilonSignZ (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + (dirNum (d 1) - dirNum (d 0)).sign * (dirNum (d 2) - dirNum (d 0)).sign + * (dirNum (d 3) - dirNum (d 0)).sign * (dirNum (d 2) - dirNum (d 1)).sign + * (dirNum (d 3) - dirNum (d 1)).sign * (dirNum (d 3) - dirNum (d 2)).sign -/-- **The Levi-Civita sign of an index vector**: the determinant of its indicator matrix - against the coordinate enumeration — zero unless the four indices are a permutation of - the coordinates, and the sign of that permutation otherwise. -/ -def epsSign (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := - (Matrix.of fun s t : Fin 4 => if d s = coordIdx t then (1 : ℤ) else 0).det +/-- **The outer contraction** `g^{μν} g^{ρσ} T_{μνρσ}`. -/ +noncomputable def outerContraction : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ) • T d -/-- **The outer double contraction** `η^{μν} η^{ρσ} T_{μνρσ}`. -/ -noncomputable def contractionOuter : B := - ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, μ, ν, ν] +/-- **The inner contraction** `g^{μρ} g^{νσ} T_{μνρσ}`. -/ +noncomputable def innerContraction : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 2) * etaZ (d 1) (d 3) : ℤ) : ℂ) • T d -/-- **The crossed double contraction** `η^{μρ} η^{νσ} T_{μνρσ}`. -/ -noncomputable def contractionCross : B := - ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, ν, μ, ν] +/-- **The split contraction** `g^{μσ} g^{νρ} T_{μνρσ}`. -/ +noncomputable def splitContraction : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 3) * etaZ (d 1) (d 2) : ℤ) : ℂ) • T d -/-- **The nested double contraction** `η^{μσ} η^{νρ} T_{μνρσ}`. -/ -noncomputable def contractionNested : B := - ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, (minkSign μ * minkSign ν) • T ![μ, ν, ν, μ] +/-- **The Levi-Civita contraction** `ε^{μνρσ} T_{μνρσ}`. -/ +noncomputable def epsilonContraction : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : ℂ) • T d -/-- **The Levi-Civita contraction** `ε^{μνρσ} T_{μνρσ}`: supported on the all-distinct - components. It is invariant under the connected Lorentz group, whose elements have unit - determinant. -/ -noncomputable def contractionEps : B := - ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsSign d : ℤ) : ℂ) • T d +/-- The outer contraction in orbit coordinates (times three). -/ +def outerOrbitZ : Fin 22 → ℤ := ![1, -3, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0] -/-! +/-- The inner contraction in orbit coordinates (times three). -/ +def innerOrbitZ : Fin 22 → ℤ := ![1, 0, -3, 0, 0, 0, 0, -3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0] -## H. The final phase +/-- The split contraction in orbit coordinates (times three). -/ +def splitOrbitZ : Fin 22 → ℤ := ![1, 0, 0, -3, 0, 0, -3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3] -The endgame in the shape of the dimension-eight case: extract the orbit-sum coefficients -from membership in the rotational average, then let the extreme boost-weight components -along each axis vanish — `eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule` on the -concrete decomposition — and collapse the resulting relations onto the four invariant -contractions. +/-- The Levi-Civita contraction in orbit coordinates. -/ +def epsilonOrbitZ : Fin 22 → ℤ := ![0, 0, 0, 0, 1, -1, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 1, 0] --/ +/-- The outer weight row of the projector factorisation. -/ +def outerWeightZ : Fin 22 → ℤ := + ![3, -5, 1, 1, 0, 0, 1, 1, 0, 0, -5, 3, 5, 5, 0, -1, -1, 0, 0, -1, 0, -1] + +/-- The inner weight row of the projector factorisation. -/ +def innerWeightZ : Fin 22 → ℤ := + ![3, 1, -5, 1, 0, 0, 1, -5, 0, 0, 1, 3, -1, -1, 0, 5, -1, 0, 0, 5, 0, -1] + +/-- The split weight row of the projector factorisation. -/ +def splitWeightZ : Fin 22 → ℤ := + ![3, 1, 1, -5, 0, 0, -5, 1, 0, 0, 1, 3, -1, -1, 0, -1, 5, 0, 0, -1, 0, 5] + +/-- The Levi-Civita weight row of the projector factorisation. -/ +def epsilonWeightZ : Fin 22 → ℤ := + ![0, 0, 0, 0, 9, -9, 0, 0, -9, 9, 0, 0, 0, 0, 9, 0, 0, -9, -9, 0, 9, 0] + +/-- **The projector factors through the four invariants**: three times the projector is + the sum of the four rank-one products of an invariant orbit vector with its weight + row. -/ +lemma three_mul_contractionProjectorZ : ∀ k l : Fin 22, + 3 * contractionProjectorZ k l + = outerOrbitZ k * outerWeightZ l + innerOrbitZ k * innerWeightZ l + + splitOrbitZ k * splitWeightZ l + epsilonOrbitZ k * epsilonWeightZ l := by + decide +kernel + +/-- The orbit sum expanded through the orbit multiplicity. -/ +lemma rotationOrbitSum_eq_sum (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationOrbitSum (T := T) d + = ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, ((rotationOrbitCoeff d e : ℤ) : ℂ) • T e := by + rw [rotationOrbitSum] + simp [rotationOrbitCoeff, apply_ite (fun n : ℤ => (n : ℂ)), add_smul, ite_smul, + Finset.sum_add_distrib, Finset.sum_ite_eq'] + +/-- A combination of the representative orbit sums, expanded into the generators. -/ +lemma sum_smul_rotationOrbitSum_orbitRep (c : Fin 22 → ℂ) : + ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k) + = ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ k, c k * ((rotationOrbitCoeff (orbitRep k) e : ℤ) : ℂ)) • T e := by + calc ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k) + = ∑ k, ∑ e : Fin 4 → Fin 1 ⊕ Fin 3, + (c k * ((rotationOrbitCoeff (orbitRep k) e : ℤ) : ℂ)) • T e := by + refine Finset.sum_congr rfl fun k _ => ?_ + rw [rotationOrbitSum_eq_sum, Finset.smul_sum] + exact Finset.sum_congr rfl fun e _ => smul_smul _ _ _ + _ = _ := by + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun e _ => (Finset.sum_smul).symm + +/-- The outer orbit vector against the orbit multiplicities gives the outer metric + coefficients. -/ +lemma sum_outerOrbitZ_mul_rotationOrbitCoeff : ∀ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ k, outerOrbitZ k * rotationOrbitCoeff (orbitRep k) e) + = 3 * (etaZ (e 0) (e 1) * etaZ (e 2) (e 3)) := by + decide +kernel + +/-- The inner orbit vector against the orbit multiplicities gives the inner metric + coefficients. -/ +lemma sum_innerOrbitZ_mul_rotationOrbitCoeff : ∀ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ k, innerOrbitZ k * rotationOrbitCoeff (orbitRep k) e) + = 3 * (etaZ (e 0) (e 2) * etaZ (e 1) (e 3)) := by + decide +kernel + +/-- The split orbit vector against the orbit multiplicities gives the split metric + coefficients. -/ +lemma sum_splitOrbitZ_mul_rotationOrbitCoeff : ∀ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ k, splitOrbitZ k * rotationOrbitCoeff (orbitRep k) e) + = 3 * (etaZ (e 0) (e 3) * etaZ (e 1) (e 2)) := by + decide +kernel + +/-- The Levi-Civita orbit vector against the orbit multiplicities gives the Levi-Civita + signs. -/ +lemma sum_epsilonOrbitZ_mul_rotationOrbitCoeff : ∀ e : Fin 4 → Fin 1 ⊕ Fin 3, + (∑ k, epsilonOrbitZ k * rotationOrbitCoeff (orbitRep k) e) = epsilonSignZ e := by + decide +kernel + +/-- The outer orbit vector represents three times the outer contraction. -/ +lemma sum_outerOrbitZ_smul_rotationOrbitSum : + ∑ k, ((outerOrbitZ k : ℤ) : ℂ) • rotationOrbitSum (T := T) (orbitRep k) + = (3 : ℂ) • outerContraction (T := T) := by + rw [sum_smul_rotationOrbitSum_orbitRep, outerContraction, Finset.smul_sum] + refine Finset.sum_congr rfl fun e _ => ?_ + rw [smul_smul] + congr 1 + exact_mod_cast sum_outerOrbitZ_mul_rotationOrbitCoeff e + +/-- The inner orbit vector represents three times the inner contraction. -/ +lemma sum_innerOrbitZ_smul_rotationOrbitSum : + ∑ k, ((innerOrbitZ k : ℤ) : ℂ) • rotationOrbitSum (T := T) (orbitRep k) + = (3 : ℂ) • innerContraction (T := T) := by + rw [sum_smul_rotationOrbitSum_orbitRep, innerContraction, Finset.smul_sum] + refine Finset.sum_congr rfl fun e _ => ?_ + rw [smul_smul] + congr 1 + exact_mod_cast sum_innerOrbitZ_mul_rotationOrbitCoeff e + +/-- The split orbit vector represents three times the split contraction. -/ +lemma sum_splitOrbitZ_smul_rotationOrbitSum : + ∑ k, ((splitOrbitZ k : ℤ) : ℂ) • rotationOrbitSum (T := T) (orbitRep k) + = (3 : ℂ) • splitContraction (T := T) := by + rw [sum_smul_rotationOrbitSum_orbitRep, splitContraction, Finset.smul_sum] + refine Finset.sum_congr rfl fun e _ => ?_ + rw [smul_smul] + congr 1 + exact_mod_cast sum_splitOrbitZ_mul_rotationOrbitCoeff e + +/-- The Levi-Civita orbit vector represents the Levi-Civita contraction. -/ +lemma sum_epsilonOrbitZ_smul_rotationOrbitSum : + ∑ k, ((epsilonOrbitZ k : ℤ) : ℂ) • rotationOrbitSum (T := T) (orbitRep k) + = epsilonContraction (T := T) := by + rw [sum_smul_rotationOrbitSum_orbitRep, epsilonContraction] + refine Finset.sum_congr rfl fun e _ => ?_ + congr 1 + exact_mod_cast sum_epsilonOrbitZ_mul_rotationOrbitCoeff e include hT in -/-- **The final collapse** (in progress): an element of the rotational average of the - paired-or-distinct span with boost weight zero along every axis is a combination of the - three metric double contractions and the Levi-Civita contraction. -/ -theorem mem_span_contractions_of_mem_rotationSubmodule {x : B} - (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) +/-- **Boost-invariant orbit combinations are spanned by the four contractions**: an + all-axes weight-zero combination of the representative orbit sums is a linear + combination of the outer, inner and split metric contractions and the Levi-Civita + contraction. -/ +theorem exists_smul_contraction_of_eq_sum_orbitRep {x : B} (c : Fin 22 → ℂ) + (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : - x ∈ ((ℂ ∙ contractionOuter (T := T) ⊔ ℂ ∙ contractionCross (T := T)) ⊔ - ℂ ∙ contractionNested (T := T)) ⊔ ℂ ∙ contractionEps (T := T) := by - obtain ⟨c, rfl⟩ := hT.exists_eq_sum_of_mem_rotationSubmodule hx - sorry + ∃ a₁ a₂ a₃ a₄ : ℂ, + x = a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) := by + refine ⟨(24 : ℂ)⁻¹ * ∑ l, ((outerWeightZ l : ℤ) : ℂ) * c l, + (24 : ℂ)⁻¹ * ∑ l, ((innerWeightZ l : ℤ) : ℂ) * c l, + (24 : ℂ)⁻¹ * ∑ l, ((splitWeightZ l : ℤ) : ℂ) * c l, + (72 : ℂ)⁻¹ * ∑ l, ((epsilonWeightZ l : ℤ) : ℂ) * c l, ?_⟩ + rw [hT.eq_sum_contractionProjectorZ_smul c hx hw] + have hfac : ∀ k, (24 : ℂ)⁻¹ * ∑ l, ((contractionProjectorZ k l : ℤ) : ℂ) * c l + = ((outerOrbitZ k : ℤ) : ℂ) * ((72 : ℂ)⁻¹ * ∑ l, ((outerWeightZ l : ℤ) : ℂ) * c l) + + ((innerOrbitZ k : ℤ) : ℂ) * ((72 : ℂ)⁻¹ * ∑ l, ((innerWeightZ l : ℤ) : ℂ) * c l) + + ((splitOrbitZ k : ℤ) : ℂ) * ((72 : ℂ)⁻¹ * ∑ l, ((splitWeightZ l : ℤ) : ℂ) * c l) + + ((epsilonOrbitZ k : ℤ) : ℂ) + * ((72 : ℂ)⁻¹ * ∑ l, ((epsilonWeightZ l : ℤ) : ℂ) * c l) := by + intro k + have hZ : ∀ l, ((contractionProjectorZ k l : ℤ) : ℂ) + = (3 : ℂ)⁻¹ * (((outerOrbitZ k : ℤ) : ℂ) * ((outerWeightZ l : ℤ) : ℂ) + + ((innerOrbitZ k : ℤ) : ℂ) * ((innerWeightZ l : ℤ) : ℂ) + + ((splitOrbitZ k : ℤ) : ℂ) * ((splitWeightZ l : ℤ) : ℂ) + + ((epsilonOrbitZ k : ℤ) : ℂ) * ((epsilonWeightZ l : ℤ) : ℂ)) := by + intro l + have h := three_mul_contractionProjectorZ k l + have h' := congrArg (fun n : ℤ => ((n : ℤ) : ℂ)) h + push_cast at h' + field_simp + linear_combination h' + simp only [Finset.mul_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hZ l] + field_simp + ring + simp only [hfac, add_smul, Finset.sum_add_distrib] + have hpull : ∀ (v : Fin 22 → ℤ) (α : ℂ), + (∑ k, (((v k : ℤ) : ℂ) * α) • rotationOrbitSum (T := T) (orbitRep k)) + = α • ∑ k, ((v k : ℤ) : ℂ) • rotationOrbitSum (T := T) (orbitRep k) := by + intro v α + rw [Finset.smul_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [smul_smul, mul_comm] + rw [hpull outerOrbitZ _, hpull innerOrbitZ _, hpull splitOrbitZ _, hpull epsilonOrbitZ _, + sum_outerOrbitZ_smul_rotationOrbitSum, sum_innerOrbitZ_smul_rotationOrbitSum, + sum_splitOrbitZ_smul_rotationOrbitSum, sum_epsilonOrbitZ_smul_rotationOrbitSum] + refine congrArg₂ (· + ·) (congrArg₂ (· + ·) (congrArg₂ (· + ·) ?_ ?_) ?_) ?_ + · rw [smul_smul] + congr 1 + field_simp + ring + · rw [smul_smul] + congr 1 + field_simp + ring + · rw [smul_smul] + congr 1 + field_simp + ring + · rfl +/-! + +## H. The classification of the Lorentz invariants + +-/ + +/-- **Finite decomposition of an `iSup` membership**: an element of the join of a + `ℤ`-indexed family is a finitely supported sum of members. -/ +lemma exists_finsupp_of_mem_iSup {S : ℤ → Submodule ℂ B} {x : B} (hx : x ∈ ⨆ m, S m) : + ∃ f : ℤ →₀ B, (∀ m, f m ∈ S m) ∧ x = f.sum fun _ b => b := by + refine Submodule.iSup_induction + (motive := fun y => ∃ f : ℤ →₀ B, (∀ m, f m ∈ S m) ∧ y = f.sum fun _ b => b) + S hx ?_ ?_ ?_ + · intro m y hy + refine ⟨Finsupp.single m y, fun m' => ?_, by simp [Finsupp.sum_single_index]⟩ + rcases eq_or_ne m' m with rfl | hne + · rw [Finsupp.single_eq_same] + exact hy + · rw [Finsupp.single_eq_of_ne hne] + exact Submodule.zero_mem _ + · exact ⟨0, fun m => Submodule.zero_mem _, by simp⟩ + · rintro y z ⟨f, hf, rfl⟩ ⟨g, hg, rfl⟩ + refine ⟨f + g, fun m => by rw [Finsupp.add_apply]; exact add_mem (hf m) (hg m), ?_⟩ + rw [Finsupp.sum_add_index (fun m _ => rfl) (fun m _ b₁ b₂ => rfl)] + +/-- **Graded extraction**: an element of the join of a family bounded by the boost-weight + grading which itself has weight zero lies in the zero member of the family. -/ +lemma mem_of_mem_iSup_of_boostWeight_zero {i : Fin 3} {S : ℤ → Submodule ℂ B} + (hS : ∀ m : ℤ, S m ≤ boostWeightSubmodule repLorentz i m) {x : B} + (hx : x ∈ ⨆ m, S m) (h0 : x ∈ boostWeightSubmodule repLorentz i 0) : x ∈ S 0 := by + obtain ⟨f, hf, rfl⟩ := exists_finsupp_of_mem_iSup hx + have hkey := eq_component_zero_of_mem_boostWeightSubmodule (i := i) + (s := insert 0 f.support) (w := fun m => f m) h0 + (fun m _ => hS m (hf m)) (Finset.mem_insert_self 0 _) ?_ + · rw [hkey] + exact hf 0 + · rw [Finsupp.sum] + by_cases h : (0 : ℤ) ∈ f.support + · rw [Finset.insert_eq_self.2 h] + · rw [Finset.sum_insert h, Finsupp.notMem_support_iff.1 h, zero_add] + +/-- **Invariance gives boost weight zero**: an element fixed by the Lorentz group lies in + the weight-zero space of every boost axis. -/ +lemma mem_boostWeightSubmodule_zero_of_invariant {x : B} + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) (i : Fin 3) : + x ∈ boostWeightSubmodule repLorentz i 0 := by + rw [mem_boostWeightSubmodule] + intro t ht + rw [hinv, zpow_zero, one_smul] + +include hT in +/-- **Every Lorentz-invariant element is an orbit-sum combination**: an element of the + span of the components fixed by the Lorentz group is a combination of the orbit sums + of the `22` canonical representatives. -/ +theorem exists_eq_sum_orbitRep_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : Fin 22 → ℂ, x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k) := by + have hw := mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv + have h1 : x ∈ hT.boostPiece 0 0 := by + refine mem_of_mem_iSup_of_boostWeight_zero (i := 0) + (hT.boostPiece_le_boostWeightSubmodule 0) ?_ (hw 0) + rw [← hT.span_eq_iSup_boostPiece 0] + exact hx + have h2 : x ∈ hT.boostPiece₂ 0 1 0 0 := + mem_of_mem_iSup_of_boostWeight_zero (i := 1) + (hT.boostPiece₂_le_boostWeightSubmodule 0 1 0) + (hT.boostPiece_le_iSup_boostPiece₂ 0 1 0 h1) (hw 1) + have h3 : x ∈ hT.boostPiece₃ 0 := + mem_of_mem_iSup_of_boostWeight_zero (i := 2) + hT.boostPiece₃_le_boostWeightSubmodule + (hT.boostPiece₂_le_iSup_boostPiece₃ h2) (hw 2) + have h4 : x ∈ pairedOrDistinctSubmodule (T := T) := + hT.boostPiece₃_zero_le_iSup_pairedOrDistinct h3 + have havg : rotationAverage (repLorentz := repLorentz) x = x := by + rw [rotationAverage] + simp only [LinearMap.smul_apply, LinearMap.add_apply, LinearMap.id_apply] + rw [hinv rotationCycle, hinv (rotationCycle ^ 2)] + module + have h5 : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T) := + havg ▸ Submodule.mem_map_of_mem h4 + obtain ⟨c, hc⟩ := hT.exists_eq_sum_rotationSubset_of_mem_rotationSubmodule h5 + refine ⟨fun k => c (orbitRep k), ?_⟩ + rw [hc, sum_rotationSubset (fun d => c d • rotationOrbitSum (T := T) d)] + +include hT in +/-- **The classification of the Lorentz invariants**: every element of the span of the + components fixed by the Lorentz group is a linear combination of the outer, inner and + split metric contractions and the Levi-Civita contraction. -/ +theorem exists_smul_contraction_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a₁ a₂ a₃ a₄ : ℂ, + x = a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) := by + obtain ⟨c, hc⟩ := hT.exists_eq_sum_orbitRep_of_invariant hx hinv + exact hT.exists_smul_contraction_of_eq_sum_orbitRep c hc + (mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv) + + end IsQuadLorentz From e00befd4f622d6b49f014a2379c3c0968e85c3c9 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 05:31:07 +0100 Subject: [PATCH 209/254] feat: Lift to module --- .../AlgebraValued/IsQuadLorentz.lean | 17 ++++--- .../LorentzGroup/Boosts/WeightGrading.lean | 47 ++++++++++--------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean index b23e057a8..e60cee1ac 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean @@ -25,6 +25,11 @@ public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! # Invariants under the Lorentz group with four-vector indices + +In this file we show invariants within the span of tensors `T^{μ₁ μ₂ μ₃ μ₄}` under +the Lorentz group, where each index `μᵢ` is a four-vector index. + + -/ @[expose] public section @@ -34,7 +39,7 @@ namespace Lorentz open TensorProduct Matrix MatrixGroups Lorentz -structure IsQuadLorentz (B : Type*) [Semiring B] [Algebra ℂ B] +structure IsQuadLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B) : Prop where repLorentz_T : ∀ (g : SL(2,ℂ)) l, @@ -44,7 +49,7 @@ structure IsQuadLorentz (B : Type*) [Semiring B] [Algebra ℂ B] namespace IsQuadLorentz set_option linter.unusedVariables false -variable {B : Type*} [Ring B] [Algebra ℂ B] +variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B} (hT : IsQuadLorentz B repLorentz T) @@ -198,7 +203,7 @@ many; they will eventually move next to `boostWeightSubmodule_iSupIndep`. /-- **Components of a vanishing homogeneous sum vanish**: the boost-weight spaces are independent. -/ lemma eq_zero_of_sum_mem_boostWeightSubmodule - {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [AddCommGroup A] [Module K A] {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {s : Finset ℤ} {w : ℤ → A} (hw : ∀ m ∈ s, w m ∈ boostWeightSubmodule rep i m) (hsum : ∑ m ∈ s, w m = 0) : @@ -216,7 +221,7 @@ lemma eq_zero_of_sum_mem_boostWeightSubmodule /-- **A weight-zero element of a homogeneous sum is its weight-zero component**: all the other components must vanish. -/ lemma eq_component_zero_of_mem_boostWeightSubmodule - {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [AddCommGroup A] [Module K A] {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {s : Finset ℤ} {w : ℤ → A} {x : A} (hx : x ∈ boostWeightSubmodule rep i 0) (hw : ∀ m ∈ s, w m ∈ boostWeightSubmodule rep i m) @@ -1225,7 +1230,7 @@ spatial direction; `rotationSubset` lists the `22` representatives explicitly. -/ -omit [Algebra ℂ B] in +omit [Module ℂ B] in /-- The orbit sum is invariant under rotating the index. -/ lemma rotationOrbitSum_cycDir (d : Fin 4 → Fin 1 ⊕ Fin 3) : rotationOrbitSum (T := T) (fun s => cycDir (d s)) = rotationOrbitSum (T := T) d := by @@ -1249,7 +1254,7 @@ def orbitRepOf (d : Fin 4 → Fin 1 ⊕ Fin 3) : Fin 4 → Fin 1 ⊕ Fin 3 := else if IsOrbitRep (fun s => cycDir (d s)) then fun s => cycDir (d s) else fun s => cycDir (cycDir (d s)) -omit [Algebra ℂ B] in +omit [Module ℂ B] in /-- The orbit sum of an index equals that of its canonical representative. -/ lemma rotationOrbitSum_orbitRepOf (d : Fin 4 → Fin 1 ⊕ Fin 3) : rotationOrbitSum (T := T) (orbitRepOf d) = rotationOrbitSum (T := T) d := by diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index 3f28ddb72..499c08d00 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -412,29 +412,9 @@ lemma iSup_eq_sup_zero_two_neg_two (f : ℤ → Submodule K M) · subst hn2; exact le_sup_right · rw [hf l h0 h2 hn2]; exact bot_le -variable (rep : Representation K SL(2,ℂ) A) - -/-- The unit has boost weight zero. -/ -lemma one_mem [IsBoostGraded rep] : (1 : A) ∈ boostWeightSubmodule rep i 0 := - one_mem_boostWeightSubmodule (IsBoostGraded.apply_one (rep := rep)) - -/-- Boost weights add under multiplication. -/ -lemma mul_mem [IsBoostGraded rep] {k l : ℤ} {x y : A} (hx : x ∈ boostWeightSubmodule rep i k) - (hy : y ∈ boostWeightSubmodule rep i l) : x * y ∈ boostWeightSubmodule rep i (k + l) := - mul_mem_boostWeightSubmodule (IsBoostGraded.apply_mul (rep := rep)) hx hy - -/-- Boost weights add under multiplication, with the sum of the weights given explicitly. -/ -lemma mul_mem' [IsBoostGraded rep] {k l n : ℤ} {x y : A} (hx : x ∈ boostWeightSubmodule rep i k) - (hy : y ∈ boostWeightSubmodule rep i l) (hkl : k + l = n) : x * y ∈ boostWeightSubmodule rep i n := - hkl ▸ mul_mem rep hx hy - -instance [IsBoostGraded rep] : SetLike.GradedMonoid (boostWeightSubmodule rep i) where - one_mem := one_mem rep - mul_mem _ _ _ _ hx hy := mul_mem rep hx hy - /-- The weight space of weight `k` sits inside the `2 ^ k` eigenspace of the boost at parameter two. -/ -lemma boostWeightSubmodule_le_eigenspace (k : ℤ) : +lemma boostWeightSubmodule_le_eigenspace (rep : Representation K SL(2,ℂ) M) (k : ℤ) : boostWeightSubmodule rep i k ≤ Module.End.eigenspace (rep (Lorentz.SL2C.boostAxis i 2 two_ne_zero)) ((algebraMap ℝ K 2) ^ k) := by @@ -450,11 +430,32 @@ private lemma zpow_algebraMap_two_injective : /-- The weight spaces are independent: a decomposition into homogeneous parts is unique when it exists. -/ -lemma boostWeightSubmodule_iSupIndep : iSupIndep (boostWeightSubmodule rep i) := +lemma boostWeightSubmodule_iSupIndep (rep : Representation K SL(2,ℂ) M) : + iSupIndep (boostWeightSubmodule rep i) := ((Module.End.eigenspaces_iSupIndep - (rep (Lorentz.SL2C.boostAxis i 2 two_ne_zero) : Module.End K A)).comp + (rep (Lorentz.SL2C.boostAxis i 2 two_ne_zero) : Module.End K M)).comp zpow_algebraMap_two_injective).mono fun k => boostWeightSubmodule_le_eigenspace rep k +variable (rep : Representation K SL(2,ℂ) A) + +/-- The unit has boost weight zero. -/ +lemma one_mem [IsBoostGraded rep] : (1 : A) ∈ boostWeightSubmodule rep i 0 := + one_mem_boostWeightSubmodule (IsBoostGraded.apply_one (rep := rep)) + +/-- Boost weights add under multiplication. -/ +lemma mul_mem [IsBoostGraded rep] {k l : ℤ} {x y : A} (hx : x ∈ boostWeightSubmodule rep i k) + (hy : y ∈ boostWeightSubmodule rep i l) : x * y ∈ boostWeightSubmodule rep i (k + l) := + mul_mem_boostWeightSubmodule (IsBoostGraded.apply_mul (rep := rep)) hx hy + +/-- Boost weights add under multiplication, with the sum of the weights given explicitly. -/ +lemma mul_mem' [IsBoostGraded rep] {k l n : ℤ} {x y : A} (hx : x ∈ boostWeightSubmodule rep i k) + (hy : y ∈ boostWeightSubmodule rep i l) (hkl : k + l = n) : x * y ∈ boostWeightSubmodule rep i n := + hkl ▸ mul_mem rep hx hy + +instance [IsBoostGraded rep] : SetLike.GradedMonoid (boostWeightSubmodule rep i) where + one_mem := one_mem rep + mul_mem _ _ _ _ hx hy := mul_mem rep hx hy + /-- Recover the two summands from the sum and difference: if `u + v` and `u - v` lie in a submodule then so do `u` and `v`. -/ lemma mem_of_add_mem_of_sub_mem {p : Submodule K M} {u v : M} From 41f5d1dd5cbe7084523a1fcbd9ce3c0ef86b3c54 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 05:48:25 +0100 Subject: [PATCH 210/254] feat: Improve docs --- .../AlgebraValued/IsQuadLorentz.lean | 563 +++++++++++------- 1 file changed, 345 insertions(+), 218 deletions(-) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean index e60cee1ac..391cc6c9f 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean @@ -24,12 +24,23 @@ public import Mathlib.Data.Matrix.Reflection public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! -# Invariants under the Lorentz group with four-vector indices - -In this file we show invariants within the span of tensors `T^{μ₁ μ₂ μ₃ μ₄}` under -the Lorentz group, where each index `μᵢ` is a four-vector index. - - +# Lorentz invariants among four four-vector indices + +`IsQuadLorentz repLorentz T` says that a family `T`, indexed by four four-vector +indices and valued in a module `B` carrying a representation of `SL(2,ℂ)`, transforms +as a tensor `T^{μ₁ μ₂ μ₃ μ₄}`. + +The main theorem `exists_smul_contraction_of_invariant` classifies the Lorentz +invariants in the span of the components: every invariant element is a linear +combination of the outer, inner and split metric contractions and the Levi-Civita +contraction. + +The section headings tell the story: the light-cone bases (B) grade the span by boost +weight, the weight-zero projection of a generator gives the recursion rounds (C), a +sieve along the three axes (D) cuts an invariant down to the tied pieces supported on +paired-or-distinct indices (E), rotation averaging reduces to `22` orbit sums (F) on +which the boost average is an explicit integer matrix (G), and a polynomial certificate +collapses the iterated rounds to the projector onto the four contractions (H, I, J). -/ @[expose] public section @@ -38,7 +49,14 @@ namespace Lorentz open TensorProduct Matrix MatrixGroups Lorentz +/-! + +## A. Quadruple Lorentz tensors and the span of their components + +-/ +/-- A family `T` of elements of `B`, indexed by four four-vector indices, transforms as + a tensor `T^{μ₁ μ₂ μ₃ μ₄}` under the representation `repLorentz` of `SL(2,ℂ)`. -/ structure IsQuadLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B) : Prop where @@ -78,13 +96,20 @@ lemma mem_span_iff (x : B) : /-! -## A. Light cone directions +## B. The light-cone basis along one axis + +## B.1. Light-cone components: their span and boost weight + +Along a spatial axis `i` the coordinate components recombine into the light-cone +components `lightCone i c`, which span the same space and are homogeneous of boost +weight `∑ j, lightConeWeight (c j)`. -/ open StandardModel.IsHiggsAlgebraValued StandardModel.IsHiggsAlgebraValued.IsDerivativeCollection BoostWeight +/-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ noncomputable def lightCone (hT : IsQuadLorentz B repLorentz T) (i : Fin 3) (c : Fin 4 → Fin 4) : B := ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • T d @@ -149,6 +174,15 @@ lemma lightCone_mem_boostWeightSubmodule (i : Fin 3) (c : Fin 4 → Fin 4) : rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, lightCone, Finset.smul_sum] exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm +/-! + +## B.2. Integer and rational mirrors of the light-cone coefficients + +Mirrors of the light-cone coefficients over `ℤ` and `ℚ`, so that the vanishing of +coefficients can be settled by `decide`. + +-/ + /-- Integer mirror of `IsDerivativeCollection.lightConeCoeff`. -/ def lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℤ := if κ = 0 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then -1 else 0) @@ -188,19 +222,16 @@ lemma lightConeCoeffInv_eq_zero_of_coeffZ_eq_zero (i : Fin 3) (κ : Fin 4) /-! -## Vanishing of homogeneous components +## Aside: Vanishing of homogeneous boost-weight sums -A finite sum of homogeneous boost-weight components vanishes only if every component -does: the weight spaces are independent. Consequently a weight-zero element written as -such a sum equals its weight-zero component alone. - -These are pure weight-grading statements (no `T` involved) generalizing -`eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule` from two weights to finitely -many; they will eventually move next to `boostWeightSubmodule_iSupIndep`. +Pure weight-grading statements with no `T` involved: the weight spaces are independent, +so a finite homogeneous sum vanishes only if every term does, and a weight-zero element +of such a sum is its weight-zero term. These belong next to +`boostWeightSubmodule_iSupIndep` in `WeightGrading`. -/ -/-- **Components of a vanishing homogeneous sum vanish**: the boost-weight spaces are +/-- Components of a vanishing homogeneous sum vanish: the boost-weight spaces are independent. -/ lemma eq_zero_of_sum_mem_boostWeightSubmodule {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [AddCommGroup A] [Module K A] @@ -218,7 +249,7 @@ lemma eq_zero_of_sum_mem_boostWeightSubmodule (Submodule.mem_iSup_of_mem (Finset.ne_of_mem_erase hm) (hw m (Finset.mem_of_mem_erase hm)))) -/-- **A weight-zero element of a homogeneous sum is its weight-zero component**: all the +/-- A weight-zero element of a homogeneous sum is its weight-zero component: all the other components must vanish. -/ lemma eq_component_zero_of_mem_boostWeightSubmodule {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [AddCommGroup A] [Module K A] @@ -244,14 +275,17 @@ lemma eq_component_zero_of_mem_boostWeightSubmodule /-! -## B. Decomposing generators +## C. The weight-zero projection of a generator + +## C.1. The boost-weight components of a generator + +Each generator `T e` is the sum of its boost-weight components `monoComponent i e m` +over the weight support along any axis. -We want to give the decomposition of -`T d` into peices along the three axis. -/ -/-- The axis-i weight-zero component of a component, as in `boostComponent` - but one level down: the weight-m partial sum of `eq_sum_lightCone`. -/ +/-- The axis-`i` weight-`m` component of the generator `T e`: the weight-`m` partial + sum of `eq_sum_lightCone`. -/ noncomputable def monoComponent (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) (m : ℤ) : B := ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c s)) = m), (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c @@ -262,7 +296,7 @@ lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (e : Fin 4 → Fin 1 exact (show (∑ s, lightConeWeight (c s)) = m from (Finset.mem_filter.1 hc).2) ▸ hT.lightCone_mem_boostWeightSubmodule i c -/-- **The possible axis-`i` boost weights of a component**: the total light-cone weights +/-- The possible axis-`i` boost weights of a component: the total light-cone weights of the axis-`i` light-cone monomials appearing in `eq_sum_lightCone` with a nonzero coefficient — those reachable through slots where the integer mirror `lightConeCoeffZ` does not vanish. Computable, so membership can be settled by `decide`. -/ @@ -299,7 +333,7 @@ lemma eq_sum_monoComponent (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : exact Finset.sum_filter_of_ne fun c _ => hne c set_option maxRecDepth 10000 in -/-- **A component is the sum of its weight components over the full weight set**: as +/-- A component is the sum of its weight components over the full weight set: as `eq_sum_monoComponent` but over the fixed weight set common to all components. -/ lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : T e = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.monoComponent i e m := by @@ -309,7 +343,16 @@ lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : rw [hT.eq_sum_lightCone i e] exact (Finset.sum_fiberwise_of_maps_to (fun c _ => hall c) _).symm -/-- **The three light-cone sectors of one index**: `0` the raising direction `κ = 0`, +/-! + +## C.2. The weight-zero transition matrix + +The matrix of the axis-`i` weight-zero projection in the `T`-basis: a sum over balanced +sector patterns of per-slot sector matrices. + +-/ + +/-- The three light-cone sectors of one index: `0` the raising direction `κ = 0`, `1` the lowering direction `κ = 1`, `2` the transverse plane `κ ∈ {2, 3}`. -/ def sectorIndex : Fin 4 → Fin 3 := ![0, 1, 2, 2] @@ -320,7 +363,7 @@ def sectorWeight : Fin 3 → ℤ := ![2, -2, 0] lemma lightConeWeight_eq_sectorWeight (κ : Fin 4) : lightConeWeight κ = sectorWeight (sectorIndex κ) := by decide +revert -/-- **The per-slot sector transition matrix**: the single-index composite +/-- The per-slot sector transition matrix: the single-index composite `lightConeCoeffInvQ · lightConeCoeffZ` summed over the light-cone directions of one sector. The three sectors resolve the identity, and `weightZeroTransition` is by definition the balanced-sector convolution of these small matrices. -/ @@ -328,7 +371,7 @@ def slotTransition (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℚ := ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = κ), lightConeCoeffInvQ i μ κ' * (lightConeCoeffZ i κ' ν : ℚ) -/-- **The matrix of the axis-`i` weight-zero projection in the `T`-basis**: the +/-- The matrix of the axis-`i` weight-zero projection in the `T`-basis: the coefficient of `T d` in the re-expansion of `monoComponent i e 0` through the light-cone basis, as the sum over balanced sector patterns — as many raising as lowering slots, `19` patterns — of the product of the per-slot sector matrices. @@ -338,7 +381,7 @@ def weightZeroTransition (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : ℚ := ∑ w ∈ Finset.univ.filter (fun w : Fin 4 → Fin 3 => (∑ s, sectorWeight (w s)) = 0), ∏ s, slotTransition i (w s) (e s) (d s) -/-- **Weight-zero light-cone sums are balanced-sector convolutions**: a sum over the +/-- Weight-zero light-cone sums are balanced-sector convolutions: a sum over the weight-zero light-cone monomials of a product of slot factors regroups as the sum over balanced sector patterns of the product of the slotwise sector sums. -/ lemma sum_weightZero_eq_sum_sector {R : Type*} [CommSemiring R] (f : Fin 4 → Fin 4 → R) : @@ -378,7 +421,7 @@ lemma sum_weightZero_eq_sum_sector {R : Type*} [CommSemiring R] (f : Fin 4 → F (fun s => Finset.univ.filter fun κ' : Fin 4 => sectorIndex κ' = w s) (fun s κ' => f s κ')).symm -/-- **The weight-zero transition as a light-cone sum**: the sector convolution defining +/-- The weight-zero transition as a light-cone sum: the sector convolution defining `weightZeroTransition` expands to the sum over weight-zero light-cone monomials of the composite `lightConeCoeffInvQ · lightConeCoeffZ` slot coefficients. -/ lemma weightZeroTransition_eq_sum_lightCone (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : @@ -389,7 +432,7 @@ lemma weightZeroTransition_eq_sum_lightCone (i : Fin 3) (d e : Fin 4 → Fin 1 exact (sum_weightZero_eq_sum_sector (fun s κ => lightConeCoeffInvQ i (e s) κ * (lightConeCoeffZ i κ (d s) : ℚ))).symm -/-- **The weight-zero component re-expanded in the `T`-basis**: `monoComponent i e 0` +/-- The weight-zero component re-expanded in the `T`-basis: `monoComponent i e 0` is the `e`-th column of `weightZeroTransition` applied to the generators. -/ lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : hT.monoComponent i e 0 @@ -404,7 +447,16 @@ lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : push_cast simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] -/-- **The boost-average matrix `M`**: the matrix of `3⁻¹(π₀⁰ + π₁⁰ + π₂⁰)` in the +/-! + +## C.3. The boost average and iterated rounds + +An element of weight zero along all three axes re-expands through any power of the +boost-average matrix applied to its coefficients. + +-/ + +/-- The boost-average matrix `M`: the matrix of `3⁻¹(π₀⁰ + π₁⁰ + π₂⁰)` in the `T`-basis — the average over the three axes of the weight-zero transition matrices. Its powers drive the endgame recursion, and the certificate is a fixed rational combination of them. -/ @@ -413,7 +465,7 @@ def boostAverageTransition : Matrix.of fun d e => (3⁻¹ : ℚ) * ∑ i : Fin 3, weightZeroTransition i d e include hT in -/-- **One round of the recursion along one axis**: an element of weight zero along axis +/-- One round of the recursion along one axis: an element of weight zero along axis `i` expanded in the generators re-expands with the weight-zero transition matrix applied to its coefficients — the nonzero-weight components of the expansion must vanish, and the surviving weight-zero part is `weightZeroTransition` acting on `c`. -/ @@ -449,7 +501,7 @@ lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} exact Finset.sum_congr rfl fun e _ => mul_comm _ _ include hT in -/-- **One averaged round of the recursion**: an element of weight zero along all three +/-- One averaged round of the recursion: an element of weight zero along all three axes re-expands with the boost-average matrix `M` applied to its coefficients — the average over the axes of `eq_sum_weightZeroTransition_smul`. -/ lemma eq_sum_boostAverageTransition_smul {x : B} @@ -479,7 +531,7 @@ lemma eq_sum_boostAverageTransition_smul {x : B} rw [mul_assoc, Finset.sum_mul] include hT in -/-- **Iterated averaged rounds**: an element of weight zero along all three axes +/-- Iterated averaged rounds: an element of weight zero along all three axes re-expands through every power of the boost-average matrix applied to its coefficients. -/ lemma eq_sum_pow_boostAverageTransition_smul {x : B} @@ -520,10 +572,16 @@ lemma eq_sum_pow_boostAverageTransition_smul {x : B} /-! -## B. Pieces along one axis +## D. Sieving the span along the three boost axes + +An invariant element has boost weight zero along every axis; three successive +weight-zero extractions cut the span down to the tied pieces of the last axis. + +## D.1. Pieces along one axis -/ +/-- The span of the axis-`i` light-cone components of total weight `n`. -/ def boostPiece (i : Fin 3) (n : ℤ) : Submodule ℂ B := ⨆ c ∈ {c : Fin 4 → Fin 4 | (∑ j, lightConeWeight (c j)) = n}, ℂ ∙ hT.lightCone i c @@ -534,7 +592,7 @@ lemma boostPiece_le_boostWeightSubmodule (i : Fin 3) (n : ℤ) : exact (show (∑ j, lightConeWeight (c j)) = n from hc) ▸ hT.lightCone_mem_boostWeightSubmodule i c -/-- **The span regrouped by boost weight**: the light-cone components sorted by their +/-- The span regrouped by boost weight: the light-cone components sorted by their total weight along the axis. -/ lemma span_eq_iSup_boostPiece (i : Fin 3) : hT.span = ⨆ n : ℤ, hT.boostPiece i n := by @@ -545,7 +603,7 @@ lemma span_eq_iSup_boostPiece (i : Fin 3) : /-! -## C. Pieces along a second axis +## D.2. Pieces along a second axis The axis-`i` and axis-`j` light-cone bases are related slot by slot by an invertible `4 × 4` transition matrix. An axis-`i` piece is therefore covered by axis-`j` pieces @@ -553,7 +611,7 @@ spanned by the light-cone components reachable through nonzero transition coeffi -/ -/-- **The one-slot transition matrix between two light-cone bases**: the axis-`i` +/-- The one-slot transition matrix between two light-cone bases: the axis-`i` light-cone direction `κ` expanded in the axis-`j` light-cone basis. Rational-valued — the entries are `0`, `±2⁻¹` and `±1` — so that vanishing of entries is decidable; `coe_lightConeTransition` identifies it with the composite change of basis over `ℂ`. -/ @@ -570,7 +628,7 @@ def lightConeTransition (i j : Fin 3) (κ κ' : Fin 4) : ℚ := else if κ = 2 then (if κ' = 3 then 1 else 0) else (if κ' = 0 then -2⁻¹ else if κ' = 1 then 2⁻¹ else 0) -/-- **The transition matrix is the composite change of basis**: the axis-`i` light-cone +/-- The transition matrix is the composite change of basis: the axis-`i` light-cone coefficients composed with the inverse axis-`j` coefficients. -/ lemma coe_lightConeTransition (i j : Fin 3) (κ κ' : Fin 4) : (lightConeTransition i j κ κ' : ℂ) @@ -617,7 +675,7 @@ lemma sum_prod_lightConeTransition (i j : Fin 3) (c c' : Fin 4 → Fin 4) : _ = ∏ s, (lightConeTransition i j (c s) (c' s) : ℂ) := Finset.prod_congr rfl fun s _ => (coe_lightConeTransition i j (c s) (c' s)).symm -/-- **The change-of-axis identity**: an axis-`i` light-cone component expanded in the +/-- The change-of-axis identity: an axis-`i` light-cone component expanded in the axis-`j` light-cone basis, with slot-wise transition coefficients. -/ lemma lightCone_eq_sum_lightCone (i j : Fin 3) (c : Fin 4 → Fin 4) : hT.lightCone i c = ∑ c' : Fin 4 → Fin 4, @@ -637,7 +695,7 @@ lemma lightCone_eq_sum_lightCone (i j : Fin 3) (c : Fin 4 → Fin 4) : exact Finset.sum_congr rfl fun c' _ => (Finset.sum_smul).symm _ = _ := Finset.sum_congr rfl fun c' _ => by rw [sum_prod_lightConeTransition] -/-- **The second-level pieces**: the axis-`j` light-cone components of weight `m` which +/-- The second-level pieces: the axis-`j` light-cone components of weight `m` which are reachable, slot by slot, from an axis-`i` multi-index of weight `n`. -/ def boostPiece₂ (i j : Fin 3) (n m : ℤ) : Submodule ℂ B := ⨆ c' ∈ {c' : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c' s)) = m ∧ @@ -653,7 +711,7 @@ lemma boostPiece₂_le_boostWeightSubmodule (i j : Fin 3) (n m : ℤ) : exact (show (∑ s, lightConeWeight (c' s)) = m from hc'.1) ▸ hT.lightCone_mem_boostWeightSubmodule j c' -/-- **The second-axis covering**: each axis-`i` piece is covered by the second-level +/-- The second-axis covering: each axis-`i` piece is covered by the second-level pieces along the axis `j` — the change-of-axis coefficients vanish on unreachable multi-indices. -/ lemma boostPiece_le_iSup_boostPiece₂ (i j : Fin 3) (n : ℤ) : @@ -674,16 +732,16 @@ lemma boostPiece_le_iSup_boostPiece₂ (i j : Fin 3) (n : ℤ) : /-! -## D. Tied pieces along the third axis +## D.3. Tied pieces along the third axis -Covering the doubly-weight-zero part by spans of whole light-cone components stabilises: -no new multi-index is excluded along the third axis. The third round instead splits each -generator into its boost-weight components along the last axis — the tied combinations — -and takes the pieces spanned by those components. +Covering the doubly-weight-zero part by spans of whole light-cone components stabilises +along the third axis, so the third round instead splits each generator into its +boost-weight components along the last axis — the tied combinations — and takes the +pieces spanned by those components. -/ -/-- **The axis-`j` weight-`m` component of an axis-`i` light-cone component**: the partial +/-- The axis-`j` weight-`m` component of an axis-`i` light-cone component: the partial sum of its change-of-axis expansion over the axis-`j` multi-indices of weight `m`. -/ noncomputable def boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) (m : ℤ) : B := ∑ c' ∈ Finset.univ.filter (fun c' : Fin 4 → Fin 4 => (∑ s, lightConeWeight (c' s)) = m), @@ -697,8 +755,8 @@ lemma boostComponent_mem_boostWeightSubmodule (i j : Fin 3) (c : Fin 4 → Fin 4 exact (Finset.mem_filter.1 hc').2 ▸ hT.lightCone_mem_boostWeightSubmodule j c' set_option maxRecDepth 10000 in -/-- **A light-cone component is the sum of its boost-weight components along any other - axis**: the change-of-axis expansion regrouped by weight. -/ +/-- A light-cone component is the sum of its boost-weight components along any other + axis: the change-of-axis expansion regrouped by weight. -/ lemma lightCone_eq_sum_boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) : hT.lightCone i c = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.boostComponent i j c m := by @@ -707,7 +765,7 @@ lemma lightCone_eq_sum_boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) : rw [hT.lightCone_eq_sum_lightCone i j c] exact (Finset.sum_fiberwise_of_maps_to (fun c' _ => hall c') _).symm -/-- **The tied pieces along the third axis**: for each generator of the doubly-weight-zero +/-- The tied pieces along the third axis: for each generator of the doubly-weight-zero part, the span of its weight-`m` component along the last axis. -/ noncomputable def boostPiece₃ (m : ℤ) : Submodule ℂ B := ⨆ c' ∈ {c' : Fin 4 → Fin 4 | (∑ s, lightConeWeight (c' s)) = 0 ∧ @@ -723,7 +781,7 @@ lemma boostPiece₃_le_boostWeightSubmodule (m : ℤ) : rw [Submodule.span_singleton_le_iff_mem] exact hT.boostComponent_mem_boostWeightSubmodule 1 2 c' m -/-- **The third-axis covering**: the doubly-weight-zero part is covered by the tied +/-- The third-axis covering: the doubly-weight-zero part is covered by the tied pieces along the last axis. -/ lemma boostPiece₂_le_iSup_boostPiece₃ : hT.boostPiece₂ 0 1 0 0 ≤ ⨆ m : ℤ, hT.boostPiece₃ m := by @@ -741,17 +799,15 @@ lemma boostPiece₂_le_iSup_boostPiece₃ : ## E. The support of the weight-zero tied piece The weight-zero tied piece only involves components `T d` whose four indices either form -two identical pairs or are all different: the one-pair and three-of-a-kind monomials -cancel out of every tied generator. The cancellation is established by a sign involution: -swapping the two null directions in every slot of the inner light-cone index negates each -contributing term whenever a parity condition on the generator holds; the remaining cases -vanish slot by slot — a slot whose factor vanishes identically, or an odd null-sector -count, which no weight-zero inner index can accommodate. The finite checks are performed -by `decide` on the integer mirrors. +two identical pairs or are all different: the remaining components cancel out of every +tied generator, by a sign involution swapping the two null light-cone directions. The +finite checks are performed by `decide` on the integer mirrors. + +## E.1. The null-swap sign involution kills the bad components -/ -/-- **The index vectors surviving the three boost sieves**: the four indices either split +/-- The index vectors surviving the three boost sieves: the four indices either split into two pairs of identical indices, or are all different. -/ def IsPairedOrDistinct (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := (d 0 = d 1 ∧ d 2 = d 3) ∨ (d 0 = d 2 ∧ d 1 = d 3) ∨ (d 0 = d 3 ∧ d 1 = d 2) ∨ @@ -780,7 +836,7 @@ lemma lightConeWeight_swap01 (κ : Fin 4) : lightConeWeight (swap01 κ) = -lightConeWeight κ := by fin_cases κ <;> rfl -/-- **The slot identity of the sign involution**: swapping the null directions of the +/-- The slot identity of the sign involution: swapping the null directions of the inner index multiplies the slot factor by the sign `nuZ`. -/ lemma transitionZ_swap01_mul_coeffZ : ∀ (a κ : Fin 4) (μ : Fin 1 ⊕ Fin 3), @@ -789,7 +845,7 @@ lemma transitionZ_swap01_mul_coeffZ : decide set_option maxRecDepth 40000 in -/-- **The odd-count case**: if the number of null-sector indices of `d` is odd, every +/-- The odd-count case: if the number of null-sector indices of `d` is odd, every weight-zero inner index hits a vanishing coefficient. -/ lemma exists_coeffZ_eq_zero_of_odd : ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, @@ -799,7 +855,7 @@ lemma exists_coeffZ_eq_zero_of_odd : decide set_option maxRecDepth 40000 in -/-- **The parity of the sign involution**: over a weight-zero generator, a component that +/-- The parity of the sign involution: over a weight-zero generator, a component that is neither two pairs nor all distinct, with no identically-vanishing slot and an even null-sector count, carries total sign `-1`. -/ lemma prod_nuZ_eq_neg_one : @@ -817,7 +873,7 @@ lemma prod_nuZ_eq_neg_one : exact h1 c' hc' d ⟨hd, hC⟩ hA decide -/-- **The vanishing of the bad coefficients**: over a weight-zero generator, the inner +/-- The vanishing of the bad coefficients: over a weight-zero generator, the inner transition sum vanishes on every component that is neither two pairs nor all distinct — slot by slot when some slot factor vanishes identically or the null-sector count is odd, and by the sign involution otherwise. -/ @@ -884,89 +940,14 @@ lemma sum_prod_transitionZ_coeffZ_eq_zero (c' : Fin 4 → Fin 4) /-! -### Rotation equivariance and support of the boost average +## E.2. Sector compatibility and the support of the weight-zero transition -Rotating both indices of `weightZeroTransition` advances the axis, so the average over -the axes is rotation invariant. And the transition out of a paired-or-distinct index -vanishes on every bad index: a sector-incompatible slot kills every summand, and -otherwise the null-swap involution carries sign `-1`. +The weight-zero transition out of a paired-or-distinct index vanishes on every bad +index: a sector-incompatible slot kills every summand, and otherwise the null-swap +involution carries sign `-1`. -/ -/-- Rotating the direction letter advances the axis of the light-cone coefficient. -/ -lemma lightConeCoeffZ_cycDir : - ∀ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3), - lightConeCoeffZ (i + 1) κ (cycDir μ) = lightConeCoeffZ i κ μ := by - decide - -/-- Integer mirror of `lightConeCoeffInvQ`: twice the inverse coefficients, so that - slot identities can be settled by kernel `decide` over `ℤ`. -/ -def lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℤ := - if μ = Sum.inl 0 then (if κ = 0 then 1 else if κ = 1 then 1 else 0) - else if μ = Sum.inr i then (if κ = 0 then -1 else if κ = 1 then 1 else 0) - else if μ = Sum.inr (i + 1) then (if κ = 2 then 2 else 0) - else (if κ = 3 then 2 else 0) - -/-- The integer mirror casts to twice the inverse coefficients. -/ -lemma coe_lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : - ((lightConeCoeffInvZ i μ κ : ℤ) : ℚ) = 2 * lightConeCoeffInvQ i μ κ := by - rw [lightConeCoeffInvZ, lightConeCoeffInvQ] - split_ifs <;> norm_num - -/-- Rotating the direction letter advances the axis of the integer mirror. -/ -lemma lightConeCoeffInvZ_cycDir : - ∀ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4), - lightConeCoeffInvZ (i + 1) (cycDir μ) κ = lightConeCoeffInvZ i μ κ := by - decide - -/-- Rotating the direction letter advances the axis of the inverse coefficient. -/ -lemma lightConeCoeffInvQ_cycDir (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : - lightConeCoeffInvQ (i + 1) (cycDir μ) κ = lightConeCoeffInvQ i μ κ := by - have h := congrArg (fun n : ℤ => (n : ℚ)) (lightConeCoeffInvZ_cycDir i μ κ) - simp only [coe_lightConeCoeffInvZ] at h - linarith - -/-- **Rotation equivariance of the weight-zero transition**: rotating both indices - advances the axis. -/ -lemma weightZeroTransition_cycDir (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : - weightZeroTransition (i + 1) (fun s => cycDir (d s)) (fun s => cycDir (e s)) - = weightZeroTransition i d e := by - rw [weightZeroTransition_eq_sum_lightCone, weightZeroTransition_eq_sum_lightCone] - refine Finset.sum_congr rfl fun c _ => Finset.prod_congr rfl fun s _ => ?_ - rw [lightConeCoeffInvQ_cycDir, lightConeCoeffZ_cycDir] - -/-- **Rotation invariance of the boost average**: the average over the axes is - invariant under rotating both indices. -/ -lemma boostAverageTransition_cycDir (d e : Fin 4 → Fin 1 ⊕ Fin 3) : - boostAverageTransition (fun s => cycDir (d s)) (fun s => cycDir (e s)) - = boostAverageTransition d e := by - simp only [boostAverageTransition, Matrix.of_apply] - congr 1 - exact (Fintype.sum_equiv (Equiv.addRight (1 : Fin 3)) _ _ fun i => - (weightZeroTransition_cycDir i d e).symm).symm - -/-- The cyclic rotation of directions has order three. -/ -lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ)) = μ := by - decide - -/-- Rotating the column index moves a double rotation to the row index. -/ -lemma boostAverageTransition_cycDir_right (d e : Fin 4 → Fin 1 ⊕ Fin 3) : - boostAverageTransition d (fun s => cycDir (e s)) - = boostAverageTransition (fun s => cycDir (cycDir (d s))) e := by - conv_lhs => rw [show d = (fun s => cycDir (cycDir (cycDir (d s)))) from - funext fun s => (cycDir_cycDir_cycDir (d s)).symm] - exact boostAverageTransition_cycDir (fun s => cycDir (cycDir (d s))) e - -/-- Rotating the column index twice moves a single rotation to the row index. -/ -lemma boostAverageTransition_cycDir_right2 (d e : Fin 4 → Fin 1 ⊕ Fin 3) : - boostAverageTransition d (fun s => cycDir (cycDir (e s))) - = boostAverageTransition (fun s => cycDir (d s)) e := by - calc boostAverageTransition d (fun s => cycDir (cycDir (e s))) - = boostAverageTransition (fun s => cycDir (cycDir (d s))) (fun s => cycDir (e s)) := - boostAverageTransition_cycDir_right d (fun s => cycDir (e s)) - _ = boostAverageTransition (fun s => cycDir (d s)) e := - boostAverageTransition_cycDir (fun s => cycDir (d s)) e - /-- Two direction letters lie in compatible sectors for the axis-`i` transition: both in the null sector, or equal. -/ def SameSlotSector (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : Prop := @@ -994,7 +975,7 @@ lemma invQ_swap01_mul_coeffZ_swap01 : decide +kernel set_option maxRecDepth 100000 in -/-- **The sign of a sector-compatible parity mismatch**: a paired-or-distinct column +/-- The sign of a sector-compatible parity mismatch: a paired-or-distinct column index against a bad row index with all slots sector-compatible carries sign `-1`. -/ lemma prod_nuSignZ_eq_neg_one : ∀ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3), IsPairedOrDistinct e → @@ -1008,7 +989,7 @@ lemma prod_nuSignZ_eq_neg_one : exact h1 i e he d hd hs decide +kernel -/-- **Support of the weight-zero transition**: the transition out of a +/-- Support of the weight-zero transition: the transition out of a paired-or-distinct index vanishes on every bad index. -/ lemma weightZeroTransition_eq_zero_of_not_isPairedOrDistinct (i : Fin 3) {d e : Fin 4 → Fin 1 ⊕ Fin 3} (he : IsPairedOrDistinct e) @@ -1062,7 +1043,7 @@ lemma weightZeroTransition_eq_zero_of_not_isPairedOrDistinct (i : Fin 3) exact Finset.prod_eq_zero (Finset.mem_univ s₀) (slot_eq_zero_of_not_sameSlotSector i (e s₀) (d s₀) hs₀ (c s₀)) -/-- **Support of the boost average**: the average out of a paired-or-distinct index is +/-- Support of the boost average: the average out of a paired-or-distinct index is supported on the paired-or-distinct indices. -/ lemma boostAverageTransition_eq_zero_of_not_isPairedOrDistinct {d e : Fin 4 → Fin 1 ⊕ Fin 3} (he : IsPairedOrDistinct e) @@ -1071,7 +1052,13 @@ lemma boostAverageTransition_eq_zero_of_not_isPairedOrDistinct rw [Finset.sum_eq_zero fun i _ => weightZeroTransition_eq_zero_of_not_isPairedOrDistinct i he hd, mul_zero] -/-- **The expansion of the weight-zero tied component into monomials**: the coefficient +/-! + +## E.3. The support of the tied piece + +-/ + +/-- The expansion of the weight-zero tied component into monomials: the coefficient of each component `T d` is a sixteenth of the integer transition sum. -/ lemma boostComponent_zero_eq (c' : Fin 4 → Fin 4) : hT.boostComponent 1 2 c' 0 = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, @@ -1092,8 +1079,8 @@ lemma boostComponent_zero_eq (c' : Fin 4 → Fin 4) : Finset.prod_const, Finset.card_univ, Fintype.card_fin] ring -/-- **The weight-zero tied component of every weight-zero generator is supported on the - paired-or-distinct components.** -/ +/-- The weight-zero tied component of every weight-zero generator is supported on the + paired-or-distinct components. -/ lemma boostComponent_zero_mem_iSup_pairedOrDistinct (c' : Fin 4 → Fin 4) (hc' : (∑ s, lightConeWeight (c' s)) = 0) : hT.boostComponent 1 2 c' 0 ∈ @@ -1106,7 +1093,7 @@ lemma boostComponent_zero_mem_iSup_pairedOrDistinct (c' : Fin 4 → Fin 4) · rw [sum_prod_transitionZ_coeffZ_eq_zero c' hc' d hd, Int.cast_zero, mul_zero, zero_smul] exact Submodule.zero_mem _ -/-- **The support of the weight-zero tied piece**: it is spanned by the components whose +/-- The support of the weight-zero tied piece: it is spanned by the components whose four indices either form two identical pairs or are all different. The one-pair and three-of-a-kind components cancel out of every tied generator. -/ lemma boostPiece₃_zero_le_iSup_pairedOrDistinct : @@ -1116,34 +1103,124 @@ lemma boostPiece₃_zero_le_iSup_pairedOrDistinct : rw [Submodule.span_singleton_le_iff_mem] exact hT.boostComponent_zero_mem_iSup_pairedOrDistinct c' hc'.1 +/-- The span of the paired-or-distinct components. -/ def pairedOrDistinctSubmodule : Submodule ℂ B := ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d /-! -## F. The rotational group +## F. Averaging over the cyclic rotation of the axes + +The cyclic rotation `x → y → z → x` of the spatial axes acts on components by cycling +every index; averaging over it carries the paired-or-distinct span onto the span of +`22` orbit sums, on which the boost average acts by an explicit matrix. + +## F.1. Rotation equivariance of the transition matrices + +Rotating all direction letters advances the axis of the light-cone coefficients, so +the boost average is invariant under rotating both of its indices. -/ -/-- **The rotation orbit of an index vector**: the indices that `d` is carried onto by +/-- Rotating the direction letter advances the axis of the light-cone coefficient. -/ +lemma lightConeCoeffZ_cycDir : + ∀ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3), + lightConeCoeffZ (i + 1) κ (cycDir μ) = lightConeCoeffZ i κ μ := by + decide + +/-- Integer mirror of `lightConeCoeffInvQ`: twice the inverse coefficients, so that + slot identities can be settled by kernel `decide` over `ℤ`. -/ +def lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℤ := + if μ = Sum.inl 0 then (if κ = 0 then 1 else if κ = 1 then 1 else 0) + else if μ = Sum.inr i then (if κ = 0 then -1 else if κ = 1 then 1 else 0) + else if μ = Sum.inr (i + 1) then (if κ = 2 then 2 else 0) + else (if κ = 3 then 2 else 0) + +/-- The integer mirror casts to twice the inverse coefficients. -/ +lemma coe_lightConeCoeffInvZ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + ((lightConeCoeffInvZ i μ κ : ℤ) : ℚ) = 2 * lightConeCoeffInvQ i μ κ := by + rw [lightConeCoeffInvZ, lightConeCoeffInvQ] + split_ifs <;> norm_num + +/-- Rotating the direction letter advances the axis of the integer mirror. -/ +lemma lightConeCoeffInvZ_cycDir : + ∀ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4), + lightConeCoeffInvZ (i + 1) (cycDir μ) κ = lightConeCoeffInvZ i μ κ := by + decide + +/-- Rotating the direction letter advances the axis of the inverse coefficient. -/ +lemma lightConeCoeffInvQ_cycDir (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + lightConeCoeffInvQ (i + 1) (cycDir μ) κ = lightConeCoeffInvQ i μ κ := by + have h := congrArg (fun n : ℤ => (n : ℚ)) (lightConeCoeffInvZ_cycDir i μ κ) + simp only [coe_lightConeCoeffInvZ] at h + linarith + +/-- Rotation equivariance of the weight-zero transition: rotating both indices + advances the axis. -/ +lemma weightZeroTransition_cycDir (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + weightZeroTransition (i + 1) (fun s => cycDir (d s)) (fun s => cycDir (e s)) + = weightZeroTransition i d e := by + rw [weightZeroTransition_eq_sum_lightCone, weightZeroTransition_eq_sum_lightCone] + refine Finset.sum_congr rfl fun c _ => Finset.prod_congr rfl fun s _ => ?_ + rw [lightConeCoeffInvQ_cycDir, lightConeCoeffZ_cycDir] + +/-- Rotation invariance of the boost average: the average over the axes is + invariant under rotating both indices. -/ +lemma boostAverageTransition_cycDir (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition (fun s => cycDir (d s)) (fun s => cycDir (e s)) + = boostAverageTransition d e := by + simp only [boostAverageTransition, Matrix.of_apply] + congr 1 + exact (Fintype.sum_equiv (Equiv.addRight (1 : Fin 3)) _ _ fun i => + (weightZeroTransition_cycDir i d e).symm).symm + +/-- The cyclic rotation of directions has order three. -/ +lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ)) = μ := by + decide + +/-- Rotating the column index moves a double rotation to the row index. -/ +lemma boostAverageTransition_cycDir_right (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d (fun s => cycDir (e s)) + = boostAverageTransition (fun s => cycDir (cycDir (d s))) e := by + conv_lhs => rw [show d = (fun s => cycDir (cycDir (cycDir (d s)))) from + funext fun s => (cycDir_cycDir_cycDir (d s)).symm] + exact boostAverageTransition_cycDir (fun s => cycDir (cycDir (d s))) e + +/-- Rotating the column index twice moves a single rotation to the row index. -/ +lemma boostAverageTransition_cycDir_right2 (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = boostAverageTransition (fun s => cycDir (d s)) e := by + calc boostAverageTransition d (fun s => cycDir (cycDir (e s))) + = boostAverageTransition (fun s => cycDir (cycDir (d s))) (fun s => cycDir (e s)) := + boostAverageTransition_cycDir_right d (fun s => cycDir (e s)) + _ = boostAverageTransition (fun s => cycDir (d s)) e := + boostAverageTransition_cycDir (fun s => cycDir (d s)) e + +/-! + +## F.2. The rotational average and orbit sums + +-/ + +/-- The rotation orbit of an index vector: the indices that `d` is carried onto by the powers of the cyclic rotation `x → y → z → x` of the rotational average. -/ def rotationIndexSet (d : Fin 4 → Fin 1 ⊕ Fin 3) : Finset (Fin 4 → Fin 1 ⊕ Fin 3) := {d, fun s => cycDir (d s), fun s => cycDir (cycDir (d s))} -/-- **The rotational average**: the mean of the action of the three powers of the cyclic +/-- The rotational average: the mean of the action of the three powers of the cyclic rotation `x → y → z → x`. -/ noncomputable def rotationAverage : B →ₗ[ℂ] B := (3⁻¹ : ℂ) • ((LinearMap.id : B →ₗ[ℂ] B) + repLorentz rotationCycle + repLorentz (rotationCycle ^ 2)) -/-- **The action of the rotational average on the paired-or-distinct span**: the image of +/-- The action of the rotational average on the paired-or-distinct span: the image of the weight-zero tied piece's support under averaging over the cyclic rotation. -/ noncomputable def rotationSubmodule : Submodule ℂ B := (pairedOrDistinctSubmodule (T := T)).map (rotationAverage (repLorentz := repLorentz)) include hT in -/-- **The cyclic rotation acts on components by cycling every index.** -/ +/-- The cyclic rotation acts on components by cycling every index. -/ lemma repLorentz_rotationCycle_apply (d : Fin 4 → Fin 1 ⊕ Fin 3) : repLorentz rotationCycle (T d) = T (fun s => cycDir (d s)) := by have hcoef : ∀ a : Fin 4 → Fin 1 ⊕ Fin 3, @@ -1162,7 +1239,7 @@ lemma repLorentz_rotationCycle_apply (d : Fin 4 → Fin 1 ⊕ Fin 3) : simp only [hcoef, ite_smul, one_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] -/-- **The sum of a component over its rotation orbit** — the un-normalised rotational +/-- The sum of a component over its rotation orbit — the un-normalised rotational average of `T d`. Its support is `rotationIndexSet d`. -/ noncomputable def rotationOrbitSum (d : Fin 4 → Fin 1 ⊕ Fin 3) : B := T d + T (fun s => cycDir (d s)) + T (fun s => cycDir (cycDir (d s))) @@ -1177,8 +1254,8 @@ lemma rotationAverage_apply (d : Fin 4 → Fin 1 ⊕ Fin 3) : Module.End.mul_apply, hT.repLorentz_rotationCycle_apply] include hT in -/-- **The rotational average of the paired-or-distinct span, presented by orbit - sums.** -/ +/-- The rotational average of the paired-or-distinct span, presented by orbit + sums. -/ lemma rotationSubmodule_eq : rotationSubmodule (repLorentz := repLorentz) (T := T) = ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, @@ -1190,7 +1267,7 @@ lemma rotationSubmodule_eq : exact Submodule.span_singleton_smul_eq ((by norm_num : (3⁻¹ : ℂ) ≠ 0).isUnit) _ include hT in -/-- **Extraction from the rotational average**: an element of the averaged span is a +/-- Extraction from the rotational average: an element of the averaged span is a combination of the orbit sums of the paired-or-distinct components. -/ lemma exists_eq_sum_of_mem_rotationSubmodule {x : B} (hx : x ∈ rotationSubmodule (repLorentz := repLorentz) (T := T)) : @@ -1221,12 +1298,11 @@ lemma exists_eq_sum_of_mem_rotationSubmodule {x : B} /-! -### Orbit representatives +## F.3. The 22 canonical orbit representatives `rotationOrbitSum` is constant on rotation orbits, so the extraction over all -paired-or-distinct indices collapses to one term per orbit. The canonical -representative of an orbit is the member whose first spatial letter is the first -spatial direction; `rotationSubset` lists the `22` representatives explicitly. +paired-or-distinct indices collapses to one term per orbit; `rotationSubset` lists the +canonical representatives explicitly. -/ @@ -1299,7 +1375,7 @@ lemma orbitRepOf_mem_rotationSubset : decide include hT in -/-- **Extraction over unique orbit representatives**: an element of the rotational +/-- Extraction over unique orbit representatives: an element of the rotational average is a combination of the orbit sums of the `22` canonical representatives — one term per orbit. -/ lemma exists_eq_sum_rotationSubset_of_mem_rotationSubmodule {x : B} @@ -1325,6 +1401,16 @@ lemma exists_eq_sum_rotationSubset_of_mem_rotationSubmodule {x : B} rw [show rotationOrbitSum (T := T) r = rotationOrbitSum (T := T) d from (Finset.mem_filter.1 hd).2 ▸ rotationOrbitSum_orbitRepOf (T := T) d] +/-! + +## F.4. The averaged round on the orbit-sum span + +Through the orbit multiplicities `rotationOrbitCoeff`, an averaged round re-expands a +combination of representative orbit sums through the row-orbit sums of the boost +average. + +-/ + /-- The listed representatives are paired-or-distinct. -/ lemma isPairedOrDistinct_of_mem_rotationSubset : ∀ d ∈ rotationSubset, IsPairedOrDistinct d := by @@ -1379,7 +1465,7 @@ lemma rotationOrbitCoeff_eq_zero {r d : Fin 4 → Fin 1 ⊕ Fin 3} rw [rotationOrbitCoeff, if_neg h1, if_neg h2, if_neg h3] norm_num -/-- **Sums over the orbit of the representative**: for any weighting, the sum over the +/-- Sums over the orbit of the representative: for any weighting, the sum over the orbit of the canonical representative times the multiplicity equals the plain sum over the three rotations. -/ lemma sum_rotationIndexSet_orbitRepOf_mul (f : (Fin 4 → Fin 1 ⊕ Fin 3) → ℚ) @@ -1410,7 +1496,7 @@ lemma sum_rotationIndexSet_orbitRepOf_mul (f : (Fin 4 → Fin 1 ⊕ Fin 3) → push_cast ring -/-- **The rotated columns collapse onto the representatives**: for a good column index, +/-- The rotated columns collapse onto the representatives: for a good column index, the sum of the boost average over the three rotated columns equals the representative-indexed combination of its row-orbit sums. -/ lemma boostAverageTransition_orbit_eq (e : Fin 4 → Fin 1 ⊕ Fin 3) @@ -1452,7 +1538,7 @@ lemma boostAverageTransition_orbit_eq (e : Fin 4 → Fin 1 ⊕ Fin 3) boostAverageTransition_eq_zero_of_not_isPairedOrDistinct hs2 hd] norm_num -/-- **Orbit-sum expansions in components**: a combination of orbit sums over the +/-- Orbit-sum expansions in components: a combination of orbit sums over the representatives, expanded into the generators through the orbit indicator. -/ lemma sum_rotationSubset_smul_rotationOrbitSum (b : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : ∑ d ∈ rotationSubset, b d • rotationOrbitSum (T := T) d @@ -1470,7 +1556,7 @@ lemma sum_rotationSubset_smul_rotationOrbitSum (b : (Fin 4 → Fin 1 ⊕ Fin 3) exact Finset.sum_congr rfl fun e _ => (Finset.sum_smul).symm include hT in -/-- **One averaged round at orbit level**: an element of weight zero along all three +/-- One averaged round at orbit level: an element of weight zero along all three axes expanded over the orbit sums of the representatives re-expands through the row-orbit sums of the boost average — the matrix of the boost average acting on the orbit-sum span. -/ @@ -1519,11 +1605,12 @@ lemma eq_sum_boostAverageTransition_of_mem_rotationSubset {x : B} /-! -### The boost average as an integer `22 × 22` matrix +## G. The boost average as an integer `22 × 22` matrix + +The representatives are enumerated by `Fin 22`; `48` times the row-orbit sums of the +boost average form an integer matrix computed directly from the integer mirrors. -The representatives are enumerated by `Fin 22`, and the row-orbit sums of the boost -average, scaled by `48`, form an integer matrix defined directly from the integer -mirrors — the matrix of the boost average acting on the orbit-sum span. +## G.1. Enumerating the representatives -/ @@ -1568,6 +1655,16 @@ lemma sum_rotationSubset {β : Type*} [AddCommMonoid β] ∑ d ∈ rotationSubset, f d = ∑ k : Fin 22, f (orbitRep k) := by rw [rotationSubset_eq_image, Finset.sum_image fun k _ k' _ h => orbitRep_injective h] +/-! + +## G.2. The closed form of the integer weight-zero transition + +The balanced-sector convolution collapses slot by slot, by induction on the slots: +transverse slots contribute a diagonal `2`, sector-incompatible slots kill the entry, +and the null slots fold their signs through `balancedSymZ`. + +-/ + /-- Integer mirror of `slotTransition`: twice its value, in closed form. On the two null sectors it is supported on the axis-`i` block `{t, xᵢ}` — the raising sector `κ = 0` carries the sign matrix `[[1, -1], [-1, 1]]`, the lowering sector `κ = 1` the @@ -1589,26 +1686,19 @@ lemma slotTransitionZ_eq_sum (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) lightConeCoeffInvZ i μ κ' * lightConeCoeffZ i κ' ν := by decide +revert -/-! - -## The closed form of the integer weight-zero transition - -The convolution over balanced sector patterns collapses slot by slot: transverse slots -force a diagonal factor `2`, incompatible slots kill the entry, and the null-sector -slots contribute the balanced elementary-symmetric fold of their signs. The proof is a -structured induction on the slots, peeling one slot at a time. - --/ - +/-- A direction letter lies in the axis-`i` null sector: time or the axis direction. -/ def InSector (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Prop := μ = Sum.inl 0 ∨ μ = Sum.inr i instance (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Decidable (InSector i μ) := inferInstanceAs (Decidable (_ ∨ _)) +/-- The balanced fold of a list of signs: the sum, over the raise/lower assignments of + the listed slots whose weights total `m`, of the products of the raising signs. -/ def balancedSymZ : ℤ → List ℤ → ℤ | m, [] => if m = 0 then 1 else 0 | m, ε :: l => ε * balancedSymZ (m - 2) l + balancedSymZ (m + 2) l +/-- The null-swap signs of the null-sector slots, in slot order. -/ def sectorSigns (i : Fin 3) : {n : ℕ} → (d e : Fin n → Fin 1 ⊕ Fin 3) → List ℤ | 0, _, _ => [] | _ + 1, d, e => @@ -1616,10 +1706,12 @@ def sectorSigns (i : Fin 3) : {n : ℕ} → (d e : Fin n → Fin 1 ⊕ Fin 3) nuSignZ i (e 0) (d 0) :: sectorSigns i (Fin.tail d) (Fin.tail e) else sectorSigns i (Fin.tail d) (Fin.tail e) +/-- The number of slots outside the axis-`i` null sector. -/ def transverseCount (i : Fin 3) : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → ℕ | 0, _ => 0 | _ + 1, e => (if InSector i (e 0) then 0 else 1) + transverseCount i (Fin.tail e) +/-- The weight-`m` integer transition over `n` slots, for the slot-peeling induction. -/ def weightTransitionZAux (i : Fin 3) {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) (m : ℤ) : ℤ := ∑ w : Fin n → Fin 3, if (∑ s, sectorWeight (w s)) = m then ∏ s, slotTransitionZ i (w s) (e s) (d s) else 0 @@ -1798,7 +1890,13 @@ lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : rw [Finset.prod_mul_distrib, Finset.prod_const] norm_num [Finset.card_univ] -/-- **The boost average on the orbit-sum span, as an integer matrix**: `48` times the +/-! + +## G.3. The integer matrix of the averaged round + +-/ + +/-- The boost average on the orbit-sum span, as an integer matrix: `48` times the row-orbit sums of the boost average between representatives, in explicit form. `boostAverageOrbitZ_eq_sum` identifies the entries with the row-orbit sums of the integer weight-zero transitions. -/ @@ -1852,7 +1950,7 @@ lemma coe_boostAverageOrbitZ (k l : Fin 22) : ring include hT in -/-- **One averaged round at orbit level, integer form**: over the enumerated +/-- One averaged round at orbit level, integer form: over the enumerated representatives, an averaged round acts by the integer matrix `boostAverageOrbitZ` with the overall `48⁻¹` normalisation. -/ lemma eq_sum_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) @@ -1890,7 +1988,7 @@ lemma eq_sum_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) ring include hT in -/-- **Iterated averaged rounds at orbit level**: `n` rounds act by the `n`-th power of +/-- Iterated averaged rounds at orbit level: `n` rounds act by the `n`-th power of the integer matrix with the `48⁻ⁿ` normalisation. -/ lemma eq_sum_pow_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) (hx : x = ∑ k, c k • rotationOrbitSum (T := T) (orbitRep k)) @@ -1944,19 +2042,16 @@ lemma eq_sum_pow_boostAverageOrbitZ_smul {x : B} (c : Fin 22 → ℂ) /-! -### X. Eigenvectors of the boost average on the orbit-sum span +## H. The certificate polynomial and the contraction projector -On the span of the orbit sums of the paired-or-distinct components the boost average -acts with rational spectrum: eigenvalue `1` (dimension `4` — the invariant -contractions), `2/3` (dimension `6`), `1/3` (dimension `9`), `0` (dimension `1`), and a -two-dimensional block with characteristic polynomial `12λ² - 11λ + 1`. We list integer -coefficient vectors for each block; together they span the orbit-sum span, and every -block except `1` is annihilated by the certificate polynomial -`q(λ) = λ(3λ-2)(3λ-1)(12λ²-11λ+1)/4`. +On the orbit-sum span the boost average has rational spectrum, with eigenvalue `1` +exactly on the invariant contractions. The certificate polynomial +`λ(3λ-2)(3λ-1)(12λ²-11λ+1)` annihilates every other eigenvalue, so applied to the +iterated rounds it collapses them to the projector onto the invariant block. -/ -/-- **Twenty-four times the projector onto the invariant block**: the integer matrix +/-- Twenty-four times the projector onto the invariant block: the integer matrix `P` with `boostAverageOrbitZ * P = 48 • P` and `P * P = 24 • P`, so that `24⁻¹ • P` projects the orbit-sum span onto the eigenvalue-`48` block — the invariant contractions. -/ @@ -1984,7 +2079,7 @@ def contractionProjectorZ : Matrix (Fin 22) (Fin 22) ℤ := 0, 0, 0, 0, 3, -3, 0, 0, -3, 3, 0, 0, 0, 0, 3, 0, 0, -3, -3, 0, 3, 0; 3, 1, 1, -5, 0, 0, -5, 1, 0, 0, 1, 3, -1, -1, 0, -1, 5, 0, 0, -1, 0, 5] -/-- **The certificate polynomial applied to the boost average**: the integer-scaled +/-- The certificate polynomial applied to the boost average: the integer-scaled annihilator of the non-invariant blocks, `μ(μ-32)(μ-16)(μ²-44μ+192)` at `μ = boostAverageOrbitZ` — the polynomial `λ(3λ-2)(3λ-1)(12λ²-11λ+1)` of the normalised average `λ = μ/48`, cleared of denominators. -/ @@ -1993,7 +2088,7 @@ def Q : Matrix (Fin 22) (Fin 22) ℤ := (boostAverageOrbitZ * boostAverageOrbitZ - 44 • boostAverageOrbitZ + 192) set_option maxRecDepth 40000 in -/-- **The certificate collapses to the projector**: applying the certificate polynomial +/-- The certificate collapses to the projector: applying the certificate polynomial to the boost average yields `393216` times `contractionProjectorZ`. Verified through materialised intermediate products, so each kernel step is a single multiplication of explicit integer matrices. -/ @@ -2156,7 +2251,7 @@ lemma Q_eq_poly : Q = boostAverageOrbitZ ^ 5 - (92 : ℤ) • boostAverageOrbitZ noncomm_ring include hT in -/-- **The certificate round**: applying the certificate polynomial of the averaged round +/-- The certificate round: applying the certificate polynomial of the averaged round to the coefficients reproduces `x` — the combination of five iterated rounds weighted by the certificate coefficients. -/ lemma eq_sum_Q_smul {x : B} (c : Fin 22 → ℂ) @@ -2203,13 +2298,13 @@ lemma eq_sum_Q_smul {x : B} (c : Fin 22 → ℂ) exact Finset.sum_congr rfl fun l _ => by ring rw [hsplit] field_simp - ring + ring_nf calc x = (27 : ℂ) • x - (207 / 4 : ℂ) • x + (33 : ℂ) • x - (31 / 4 : ℂ) • x + (2⁻¹ : ℂ) • x := by module _ = _ := key include hT in -/-- **The projector round**: the certificate collapses to `24⁻¹` times the integer +/-- The projector round: the certificate collapses to `24⁻¹` times the integer projector matrix — one clean application of `contractionProjectorZ` reproduces the coefficients of any all-axes weight-zero element. -/ lemma eq_sum_contractionProjectorZ_smul {x : B} (c : Fin 22 → ℂ) @@ -2233,13 +2328,13 @@ lemma eq_sum_contractionProjectorZ_smul {x : B} (c : Fin 22 → ℂ) /-! -## G. The four invariant contractions +## I. The four invariant contractions + +## I.1. The metric and Levi-Civita contractions -The Lorentz-invariant elements built from `T`: the three double metric contractions — -outer `g^{μν} g^{ρσ} T_{μνρσ}`, inner `g^{μρ} g^{νσ} T_{μνρσ}`, split -`g^{μσ} g^{νρ} T_{μνρσ}` — and the Levi-Civita contraction `ε^{μνρσ} T_{μνρσ}`. -In orbit coordinates they are the four explicit integer vectors spanning the image of -`contractionProjectorZ`. +The three double metric contractions — outer `g^{μν} g^{ρσ} T_{μνρσ}`, inner +`g^{μρ} g^{νσ} T_{μνρσ}`, split `g^{μσ} g^{νρ} T_{μνρσ}` — and the Levi-Civita +contraction `ε^{μνρσ} T_{μνρσ}`. -/ @@ -2259,22 +2354,31 @@ def epsilonSignZ (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := * (dirNum (d 3) - dirNum (d 0)).sign * (dirNum (d 2) - dirNum (d 1)).sign * (dirNum (d 3) - dirNum (d 1)).sign * (dirNum (d 3) - dirNum (d 2)).sign -/-- **The outer contraction** `g^{μν} g^{ρσ} T_{μνρσ}`. -/ +/-- The outer contraction `g^{μν} g^{ρσ} T_{μνρσ}`. -/ noncomputable def outerContraction : B := ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ) • T d -/-- **The inner contraction** `g^{μρ} g^{νσ} T_{μνρσ}`. -/ +/-- The inner contraction `g^{μρ} g^{νσ} T_{μνρσ}`. -/ noncomputable def innerContraction : B := ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 2) * etaZ (d 1) (d 3) : ℤ) : ℂ) • T d -/-- **The split contraction** `g^{μσ} g^{νρ} T_{μνρσ}`. -/ +/-- The split contraction `g^{μσ} g^{νρ} T_{μνρσ}`. -/ noncomputable def splitContraction : B := ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 3) * etaZ (d 1) (d 2) : ℤ) : ℂ) • T d -/-- **The Levi-Civita contraction** `ε^{μνρσ} T_{μνρσ}`. -/ +/-- The Levi-Civita contraction `ε^{μνρσ} T_{μνρσ}`. -/ noncomputable def epsilonContraction : B := ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : ℂ) • T d +/-! + +## I.2. Orbit coordinates and the projector factorisation + +Integer orbit vectors and weight rows for each contraction; three times the projector +is the sum of their four rank-one products. + +-/ + /-- The outer contraction in orbit coordinates (times three). -/ def outerOrbitZ : Fin 22 → ℤ := ![1, -3, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0] @@ -2303,7 +2407,7 @@ def splitWeightZ : Fin 22 → ℤ := def epsilonWeightZ : Fin 22 → ℤ := ![0, 0, 0, 0, 9, -9, 0, 0, -9, 9, 0, 0, 0, 0, 9, 0, 0, -9, -9, 0, 9, 0] -/-- **The projector factors through the four invariants**: three times the projector is +/-- The projector factors through the four invariants: three times the projector is the sum of the four rank-one products of an invariant orbit vector with its weight row. -/ lemma three_mul_contractionProjectorZ : ∀ k l : Fin 22, @@ -2312,6 +2416,12 @@ lemma three_mul_contractionProjectorZ : ∀ k l : Fin 22, + splitOrbitZ k * splitWeightZ l + epsilonOrbitZ k * epsilonWeightZ l := by decide +kernel +/-! + +## I.3. The orbit vectors represent the contractions + +-/ + /-- The orbit sum expanded through the orbit multiplicity. -/ lemma rotationOrbitSum_eq_sum (d : Fin 4 → Fin 1 ⊕ Fin 3) : rotationOrbitSum (T := T) d @@ -2401,8 +2511,14 @@ lemma sum_epsilonOrbitZ_smul_rotationOrbitSum : congr 1 exact_mod_cast sum_epsilonOrbitZ_mul_rotationOrbitCoeff e +/-! + +## I.4. The projector round lands in the contractions + +-/ + include hT in -/-- **Boost-invariant orbit combinations are spanned by the four contractions**: an +/-- Boost-invariant orbit combinations are spanned by the four contractions: an all-axes weight-zero combination of the representative orbit sums is a linear combination of the outer, inner and split metric contractions and the Levi-Civita contraction. -/ @@ -2467,11 +2583,16 @@ theorem exists_smul_contraction_of_eq_sum_orbitRep {x : B} (c : Fin 22 → ℂ) · rfl /-! -## H. The classification of the Lorentz invariants +## J. The classification of the Lorentz invariants + +## J.1. Graded extraction along the sieve + +An invariant element has weight zero along every axis, so it passes down the sieve of +sections D and E: each covering step keeps only its weight-zero member. -/ -/-- **Finite decomposition of an `iSup` membership**: an element of the join of a +/-- Finite decomposition of an `iSup` membership: an element of the join of a `ℤ`-indexed family is a finitely supported sum of members. -/ lemma exists_finsupp_of_mem_iSup {S : ℤ → Submodule ℂ B} {x : B} (hx : x ∈ ⨆ m, S m) : ∃ f : ℤ →₀ B, (∀ m, f m ∈ S m) ∧ x = f.sum fun _ b => b := by @@ -2490,7 +2611,7 @@ lemma exists_finsupp_of_mem_iSup {S : ℤ → Submodule ℂ B} {x : B} (hx : x refine ⟨f + g, fun m => by rw [Finsupp.add_apply]; exact add_mem (hf m) (hg m), ?_⟩ rw [Finsupp.sum_add_index (fun m _ => rfl) (fun m _ b₁ b₂ => rfl)] -/-- **Graded extraction**: an element of the join of a family bounded by the boost-weight +/-- Graded extraction: an element of the join of a family bounded by the boost-weight grading which itself has weight zero lies in the zero member of the family. -/ lemma mem_of_mem_iSup_of_boostWeight_zero {i : Fin 3} {S : ℤ → Submodule ℂ B} (hS : ∀ m : ℤ, S m ≤ boostWeightSubmodule repLorentz i m) {x : B} @@ -2506,7 +2627,7 @@ lemma mem_of_mem_iSup_of_boostWeight_zero {i : Fin 3} {S : ℤ → Submodule ℂ · rw [Finset.insert_eq_self.2 h] · rw [Finset.sum_insert h, Finsupp.notMem_support_iff.1 h, zero_add] -/-- **Invariance gives boost weight zero**: an element fixed by the Lorentz group lies in +/-- Invariance gives boost weight zero: an element fixed by the Lorentz group lies in the weight-zero space of every boost axis. -/ lemma mem_boostWeightSubmodule_zero_of_invariant {x : B} (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) (i : Fin 3) : @@ -2515,8 +2636,14 @@ lemma mem_boostWeightSubmodule_zero_of_invariant {x : B} intro t ht rw [hinv, zpow_zero, one_smul] +/-! + +## J.2. The classification + +-/ + include hT in -/-- **Every Lorentz-invariant element is an orbit-sum combination**: an element of the +/-- Every Lorentz-invariant element is an orbit-sum combination: an element of the span of the components fixed by the Lorentz group is a combination of the orbit sums of the `22` canonical representatives. -/ theorem exists_eq_sum_orbitRep_of_invariant {x : B} (hx : x ∈ hT.span) @@ -2550,7 +2677,7 @@ theorem exists_eq_sum_orbitRep_of_invariant {x : B} (hx : x ∈ hT.span) rw [hc, sum_rotationSubset (fun d => c d • rotationOrbitSum (T := T) d)] include hT in -/-- **The classification of the Lorentz invariants**: every element of the span of the +/-- The classification of the Lorentz invariants: every element of the span of the components fixed by the Lorentz group is a linear combination of the outer, inner and split metric contractions and the Levi-Civita contraction. -/ theorem exists_smul_contraction_of_invariant {x : B} (hx : x ∈ hT.span) From dd1bf106cb6ab77d5e3431ccad04367224fb8dbb Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 05:49:33 +0100 Subject: [PATCH 211/254] feat: Move IsQuardLorentz to more appropiate place. --- .../LorentzGroup/Invariants}/IsQuadLorentz.lean | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Physlib/{Particles/StandardModel/HiggsBoson/AlgebraValued => Relativity/LorentzGroup/Invariants}/IsQuadLorentz.lean (100%) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean similarity index 100% rename from Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/IsQuadLorentz.lean rename to Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean From f8c534a4acbf669090f3e14ba7353f9dce89318e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Thu, 27 Aug 2026 08:52:18 +0400 Subject: [PATCH 212/254] refactor(Particles): remove the early EFTLagrangianExclDeriv prototypes List of files removed: LagrangianTheory/EFTLagrangianExclDeriv/Basic LagrangianTheory/EFTLagrangianJet/Basic PureFermionic/EFTLagrangianExclDeriv StandardModel/EFTLagrangianExclDeriv/Basic StandardModel/EFTLagrangianExclDeriv/YukawaTerms WessZumino/EFTLagrangianExclDeriv/Basic WessZumino/EFTLagrangianExclDeriv/Coeff --- .../EFTLagrangianExclDeriv/Basic.lean | 68 - .../EFTLagrangianJet/Basic.lean | 345 --- .../PureFermionic/EFTLagrangianExclDeriv.lean | 1965 ----------------- .../EFTLagrangianExclDeriv/Basic.lean | 988 --------- .../EFTLagrangianExclDeriv/YukawaTerms.lean | 810 ------- .../EFTLagrangianExclDeriv/Basic.lean | 727 ------ .../EFTLagrangianExclDeriv/Coeff.lean | 336 --- 7 files changed, 5239 deletions(-) delete mode 100644 Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean delete mode 100644 Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean delete mode 100644 Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean delete mode 100644 Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean delete mode 100644 Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean delete mode 100644 Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean delete mode 100644 Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean deleted file mode 100644 index f80bff98c..000000000 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianExclDeriv/Basic.lean +++ /dev/null @@ -1,68 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan --/ -module - -public import Physlib.Particles.LagrangianTheory.Basic -/-! - -# The Standard Model EFT Lagrangian without derivatives - -## i. Overview - --/ - -@[expose] public section - -namespace LagrangianTheory - -open TensorProduct Matrix MatrixGroups - -variable {G : Type} [Group G] - - -variable {L : LagrangianTheory G} - -abbrev EFTLagrangianExclDeriv (L : LagrangianTheory G) : Type := - -- complex scalar part of the lagrangian - L.ComplexScalarEFTExclDeriv ⊗[ℂ] - L.RealBosonEFTExclDerivComplex ⊗[ℂ] L.FermionicEFTExclDeriv - -namespace EFTLagrangianExclDeriv - -variable {L : LagrangianTheory G} - - -set_option maxSynthPendingDepth 4 in -noncomputable instance : Ring (L.EFTLagrangianExclDeriv) := inferInstanceAs <| - Ring (L.ComplexScalarEFTExclDeriv ⊗[ℂ] - L.RealBosonEFTExclDerivComplex ⊗[ℂ] L.FermionicEFTExclDeriv) - -set_option maxSynthPendingDepth 4 in -noncomputable instance : Algebra ℂ (L.EFTLagrangianExclDeriv) := inferInstanceAs <| - Algebra ℂ (L.ComplexScalarEFTExclDeriv ⊗[ℂ] - L.RealBosonEFTExclDerivComplex ⊗[ℂ] L.FermionicEFTExclDeriv) - -/-! - -## A. The invariance conditions - --/ - -/-! - -### A.1. The representation - --/ - -noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) L.EFTLagrangianExclDeriv := - ((ComplexScalarEFTExclDeriv.repLorentzGroup (L := L)).tprod - (RealBosonEFTExclDerivComplex.repLorentzGroup (L := L))).tprod - (FermionicEFTExclDeriv.repLorentzGroup (L := L)) - - -end EFTLagrangianExclDeriv - -end LagrangianTheory diff --git a/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean b/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean deleted file mode 100644 index cd9320890..000000000 --- a/Physlib/Particles/LagrangianTheory/EFTLagrangianJet/Basic.lean +++ /dev/null @@ -1,345 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan --/ -module - -public import Physlib.Particles.LagrangianTheory.Basic - -/-! - -# The jet EFT Lagrangian - -## i. Overview - -For a Lagrangian theory, this file defines the algebra of complex-scalar, real-boson, and -fermionic expressions with arbitrarily many jet-bundle derivative coordinates. It defines the -Lorentz and gauge actions as algebra automorphisms and gives their corresponding linear -representations. - --/ - -@[expose] public section - -namespace LagrangianTheory - -open TensorProduct Matrix MatrixGroups - -noncomputable section - -variable {R H A : Type*} [CommSemiring R] [Group H] [Semiring A] [Algebra R A] - -/-- Promote algebra endomorphisms agreeing with a linear representation to a group action by -algebra automorphisms. -/ -def algAutOfRepresentation (ρ : Representation R H A) (φ : H → A →ₐ[R] A) - (h : ∀ g x, ρ g x = φ g x) : H →* A ≃ₐ[R] A where - toFun g := - { φ g with - invFun := φ g⁻¹ - left_inv := fun x => by - change φ g⁻¹ (φ g x) = x - rw [← h g x, ← h g⁻¹ (ρ g x)] - change (ρ g⁻¹ * ρ g) x = x - rw [← ρ.map_mul] - simp - right_inv := fun x => by - change φ g (φ g⁻¹ x) = x - rw [← h g⁻¹ x, ← h g (ρ g⁻¹ x)] - change (ρ g * ρ g⁻¹) x = x - rw [← ρ.map_mul] - simp } - map_one' := by - apply AlgEquiv.ext - intro x - change φ 1 x = x - rw [← h 1 x] - simp - map_mul' g₁ g₂ := by - apply AlgEquiv.ext - intro x - change φ (g₁ * g₂) x = φ g₁ (φ g₂ x) - rw [← h (g₁ * g₂) x, ← h g₂ x, ← h g₁ (ρ g₂ x)] - change ρ (g₁ * g₂) x = (ρ g₁ * ρ g₂) x - rw [ρ.map_mul] - -/-- Combine algebra-automorphism actions on two factors into an action on their tensor-product -algebra. -/ -def tensorProductAlgAut {B : Type*} [Semiring B] [Algebra R B] - (σA : H →* A ≃ₐ[R] A) (σB : H →* B ≃ₐ[R] B) : - H →* ((A ⊗[R] B) ≃ₐ[R] (A ⊗[R] B)) where - toFun g := Algebra.TensorProduct.congr (σA g) (σB g) - map_one' := by - apply AlgEquiv.ext - intro x - induction x using TensorProduct.induction_on with - | zero => simp - | tmul a b => simp - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy - map_mul' g₁ g₂ := by - apply AlgEquiv.ext - intro x - induction x using TensorProduct.induction_on with - | zero => simp - | tmul a b => simp - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy - -variable {G : Type} [Group G] -variable {L : LagrangianTheory G} - -/-- The algebra of Lagrangian expressions generated by fields and their jet-bundle -derivative coordinates. -/ -abbrev EFTLagrangianJet (L : LagrangianTheory G) : Type := - L.ComplexScalarEFTJet ⊗[ℂ] - L.RealBosonEFTJetComplex ⊗[ℂ] L.FermionicEFTJet - -namespace EFTLagrangianJet - -set_option maxSynthPendingDepth 4 in -noncomputable instance : Ring L.EFTLagrangianJet := inferInstanceAs <| - Ring (L.ComplexScalarEFTJet ⊗[ℂ] - L.RealBosonEFTJetComplex ⊗[ℂ] L.FermionicEFTJet) - -set_option maxSynthPendingDepth 4 in -noncomputable instance : Algebra ℂ L.EFTLagrangianJet := inferInstanceAs <| - Algebra ℂ (L.ComplexScalarEFTJet ⊗[ℂ] - L.RealBosonEFTJetComplex ⊗[ℂ] L.FermionicEFTJet) - -/-! - -## A. Lorentz-group action - -### A.1. Actions on the factors - --/ - -/-- The Lorentz action on the complex-scalar factor as an algebra homomorphism. -/ -noncomputable def complexScalarLorentzAlgHom (Λ : SL(2,ℂ)) : - L.ComplexScalarEFTJet →ₐ[ℂ] L.ComplexScalarEFTJet := - SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ) - -/-- The Lorentz action on the complex-scalar factor by algebra automorphisms. -/ -noncomputable def complexScalarLorentzAlgAut : - SL(2,ℂ) →* (L.ComplexScalarEFTJet ≃ₐ[ℂ] L.ComplexScalarEFTJet) := - algAutOfRepresentation ComplexScalarEFTJet.repLorentzGroup - complexScalarLorentzAlgHom fun _ _ => rfl - -/-- The Lorentz action on the fermionic factor as an algebra homomorphism. -/ -noncomputable def fermionicLorentzAlgHom (Λ : SL(2,ℂ)) : - L.FermionicEFTJet →ₐ[ℂ] L.FermionicEFTJet := - ExteriorAlgebra.map (FermionicJetComponentSpace.repLorentzGroup Λ) - -/-- The Lorentz action on the fermionic factor by algebra automorphisms. -/ -noncomputable def fermionicLorentzAlgAut : - SL(2,ℂ) →* (L.FermionicEFTJet ≃ₐ[ℂ] L.FermionicEFTJet) := - algAutOfRepresentation FermionicEFTJet.repLorentzGroup - fermionicLorentzAlgHom fun _ _ => rfl - -/-- The Lorentz action on the real-boson factor as a real algebra homomorphism. -/ -noncomputable def realBosonLorentzAlgHom (Λ : SL(2,ℂ)) : - L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJet := - SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup Λ) - -/-- The scalar extension of the real-boson Lorentz action as a complex algebra homomorphism. -/ -noncomputable def realBosonComplexLorentzAlgHom (Λ : SL(2,ℂ)) : - L.RealBosonEFTJetComplex →ₐ[ℂ] L.RealBosonEFTJetComplex := - (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTJet L.RealBosonEFTJetComplex) - ((Algebra.TensorProduct.includeRight : - L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJetComplex).comp - (realBosonLorentzAlgHom Λ)) - -/-- The complex real-boson Lorentz representation agrees with its algebra homomorphism. -/ -lemma realBosonComplex_repLorentzGroup_apply (Λ : SL(2,ℂ)) - (x : L.RealBosonEFTJetComplex) : - RealBosonEFTJetComplex.repLorentzGroup Λ x = - realBosonComplexLorentzAlgHom Λ x := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul c x => - change c ⊗ₜ[ℝ] realBosonLorentzAlgHom Λ x = - c • (1 ⊗ₜ[ℝ] realBosonLorentzAlgHom Λ x) - exact TensorProduct.tmul_eq_smul_one_tmul c _ - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy - -/-- The Lorentz action on the complexified real-boson factor by algebra automorphisms. -/ -noncomputable def realBosonComplexLorentzAlgAut : - SL(2,ℂ) →* - (L.RealBosonEFTJetComplex ≃ₐ[ℂ] L.RealBosonEFTJetComplex) := - algAutOfRepresentation RealBosonEFTJetComplex.repLorentzGroup - realBosonComplexLorentzAlgHom realBosonComplex_repLorentzGroup_apply - -/-! - -### A.2. The full action and its representation - --/ - -/-- The Lorentz action on the two bosonic factors by algebra automorphisms. -/ -noncomputable def bosonicLorentzAlgAut : - SL(2,ℂ) →* - ((L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex) ≃ₐ[ℂ] - (L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex)) := - tensorProductAlgAut complexScalarLorentzAlgAut realBosonComplexLorentzAlgAut - -/-- The Lorentz action on the bosonic factors as an algebra homomorphism. -/ -noncomputable def bosonicLorentzAlgHom (Λ : SL(2,ℂ)) : - L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex →ₐ[ℂ] - L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex := - (bosonicLorentzAlgAut Λ).toAlgHom - -/-- The Lorentz action on the jet Lagrangian by algebra automorphisms. -/ -noncomputable def lorentzAlgAut : - SL(2,ℂ) →* (L.EFTLagrangianJet ≃ₐ[ℂ] L.EFTLagrangianJet) := - tensorProductAlgAut bosonicLorentzAlgAut fermionicLorentzAlgAut - -/-- The action of a Lorentz-group element as an algebra homomorphism. -/ -noncomputable def lorentzAlgHom (Λ : SL(2,ℂ)) : - L.EFTLagrangianJet →ₐ[ℂ] L.EFTLagrangianJet := - (lorentzAlgAut Λ).toAlgHom - -/-- The representation of the Lorentz group underlying its algebra-automorphism action. -/ -noncomputable def repLorentzGroup : - Representation ℂ SL(2,ℂ) L.EFTLagrangianJet := - (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianJet).comp lorentzAlgAut - -/-- The Lorentz representation agrees with its algebra homomorphism. -/ -lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : L.EFTLagrangianJet) : - repLorentzGroup Λ x = lorentzAlgHom Λ x := rfl - -/-- The Lorentz representation preserves multiplication. -/ -lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : L.EFTLagrangianJet) : - repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := by - simpa only [repLorentzGroup_apply] using map_mul (lorentzAlgHom Λ) V W - -/-- The Lorentz representation preserves the unit. -/ -@[simp] -lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : - repLorentzGroup (L := L) Λ 1 = 1 := by - simpa only [repLorentzGroup_apply] using map_one (lorentzAlgHom (L := L) Λ) - -/-! - -## B. Gauge-group action - -### B.1. Actions on the factors - --/ - -/-- The gauge action on the complex-scalar factor as an algebra homomorphism. -/ -noncomputable def complexScalarGaugeAlgHom (g : G) : - L.ComplexScalarEFTJet →ₐ[ℂ] L.ComplexScalarEFTJet := - SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g) - -/-- The gauge action on the complex-scalar factor by algebra automorphisms. -/ -noncomputable def complexScalarGaugeAlgAut : - G →* (L.ComplexScalarEFTJet ≃ₐ[ℂ] L.ComplexScalarEFTJet) := - algAutOfRepresentation ComplexScalarEFTJet.repGaugeGroup - complexScalarGaugeAlgHom fun _ _ => rfl - -/-- The gauge action on the fermionic factor as an algebra homomorphism. -/ -noncomputable def fermionicGaugeAlgHom (g : G) : - L.FermionicEFTJet →ₐ[ℂ] L.FermionicEFTJet := - ExteriorAlgebra.map (FermionicJetComponentSpace.repGaugeGroup g) - -/-- The gauge action on the fermionic factor by algebra automorphisms. -/ -noncomputable def fermionicGaugeAlgAut : - G →* (L.FermionicEFTJet ≃ₐ[ℂ] L.FermionicEFTJet) := - algAutOfRepresentation FermionicEFTJet.repGaugeGroup - fermionicGaugeAlgHom fun _ _ => rfl - -/-- The gauge action on the real-boson factor as a real algebra homomorphism. -/ -noncomputable def realBosonGaugeAlgHom (g : G) : - L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJet := - SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup g) - -/-- The scalar extension of the real-boson gauge action as a complex algebra homomorphism. -/ -noncomputable def realBosonComplexGaugeAlgHom (g : G) : - L.RealBosonEFTJetComplex →ₐ[ℂ] L.RealBosonEFTJetComplex := - (AlgHom.liftEquiv ℝ ℂ L.RealBosonEFTJet L.RealBosonEFTJetComplex) - ((Algebra.TensorProduct.includeRight : - L.RealBosonEFTJet →ₐ[ℝ] L.RealBosonEFTJetComplex).comp - (realBosonGaugeAlgHom g)) - -/-- The complex real-boson gauge representation agrees with its algebra homomorphism. -/ -lemma realBosonComplex_repGaugeGroup_apply (g : G) - (x : L.RealBosonEFTJetComplex) : - RealBosonEFTJetComplex.repGaugeGroup g x = - realBosonComplexGaugeAlgHom g x := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul c x => - change c ⊗ₜ[ℝ] realBosonGaugeAlgHom g x = - c • (1 ⊗ₜ[ℝ] realBosonGaugeAlgHom g x) - exact TensorProduct.tmul_eq_smul_one_tmul c _ - | add x y hx hy => simpa only [map_add] using congrArg₂ (· + ·) hx hy - -/-- The gauge action on the complex real-boson factor by algebra automorphisms. -/ -noncomputable def realBosonComplexGaugeAlgAut : - G →* (L.RealBosonEFTJetComplex ≃ₐ[ℂ] L.RealBosonEFTJetComplex) := - algAutOfRepresentation RealBosonEFTJetComplex.repGaugeGroup - realBosonComplexGaugeAlgHom realBosonComplex_repGaugeGroup_apply - -/-! - -### B.2. The full action and its representation - --/ - -/-- The gauge action on the two bosonic factors by algebra automorphisms. -/ -noncomputable def bosonicGaugeAlgAut : - G →* ((L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex) ≃ₐ[ℂ] - (L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex)) := - tensorProductAlgAut complexScalarGaugeAlgAut realBosonComplexGaugeAlgAut - -/-- The gauge action on the bosonic factors as an algebra homomorphism. -/ -noncomputable def bosonicGaugeAlgHom (g : G) : - L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex →ₐ[ℂ] - L.ComplexScalarEFTJet ⊗[ℂ] L.RealBosonEFTJetComplex := - (bosonicGaugeAlgAut g).toAlgHom - -/-- The gauge action on the jet Lagrangian by algebra automorphisms. -/ -noncomputable def gaugeAlgAut : - G →* (L.EFTLagrangianJet ≃ₐ[ℂ] L.EFTLagrangianJet) := - tensorProductAlgAut bosonicGaugeAlgAut fermionicGaugeAlgAut - -/-- The action of a gauge-group element as an algebra homomorphism. -/ -noncomputable def gaugeAlgHom (g : G) : - L.EFTLagrangianJet →ₐ[ℂ] L.EFTLagrangianJet := - (gaugeAlgAut g).toAlgHom - -/-- The representation of the gauge group underlying its algebra-automorphism action. -/ -noncomputable def repGaugeGroup : Representation ℂ G L.EFTLagrangianJet := - (AlgEquiv.toLinearMapHom ℂ L.EFTLagrangianJet).comp gaugeAlgAut - -/-- The gauge representation agrees with its algebra homomorphism. -/ -lemma repGaugeGroup_apply (g : G) (x : L.EFTLagrangianJet) : - repGaugeGroup g x = gaugeAlgHom g x := rfl - -/-- The gauge representation preserves multiplication. -/ -lemma repGaugeGroup_mul (g : G) (V W : L.EFTLagrangianJet) : - repGaugeGroup g (V * W) = repGaugeGroup g V * repGaugeGroup g W := by - simpa only [repGaugeGroup_apply] using map_mul (gaugeAlgHom g) V W - -/-- The gauge representation preserves the unit. -/ -@[simp] -lemma repGaugeGroup_one (g : G) : repGaugeGroup (L := L) g 1 = 1 := by - simpa only [repGaugeGroup_apply] using map_one (gaugeAlgHom (L := L) g) - -/-! - -## C. The `IsGlobalInvariant` condition - -This section is reserved for the predicate expressing simultaneous Lorentz and gauge invariance. - --/ - -end EFTLagrangianJet - -end - - -end LagrangianTheory diff --git a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean b/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean deleted file mode 100644 index b5c589cf4..000000000 --- a/Physlib/Particles/PureFermionic/EFTLagrangianExclDeriv.lean +++ /dev/null @@ -1,1965 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan --/ -module - -public import Physlib.Relativity.Fermions.Weyl.Metric -public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Mathematics.ConjModule -public import Physlib.Mathematics.MultisetsOfMassDim -public import Mathlib.RingTheory.GradedAlgebra.Basic -/-! - -# The effective potential for a left-handed Weyl fermion - -## i. Overview - -In this file our primary objective is to look at the potential -of a single left-handed Weyl fermion, correctly taking account -of the anti-commuting nature of the fermion. - -Two facts about the (effective) potential, which we take as a given, are that: -1. It is written in terms of the components of the left-handed Weyl fermion and its conjugate. - (For this effective potential, we do not consider derivatives.) -2. Within the potential the components anti-commute. -The first of these, tells us that we should be working with the dual of the left-handed Weyl fermion -and its conjugate (since the duals are the linear functionals which pick -out the components of the fermion). The second of these tells us that we should be working with an -exterior algebra. - -Thus, the type in which the potential lives is -`ExteriorAlgebra ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl))`. -We call this type `EFTLagrangianExclDeriv` and define it and its properties in this file. -Note that `Module.Dual ℂ LeftHandedWeyl` is equivalent to `DualLeftHandedWeyl` and -`Module.Dual ℂ (ConjModule LeftHandedWeyl)` is equivalent to `DualRightHandedWeyl`, -so we could equivalently define the effective potential as -`ExteriorAlgebra ℂ (DualLeftHandedWeyl × DualRightHandedWeyl)`. We have done the -former here as it generalises to other cases. - -On `EFTLagrangianExclDeriv` we define a representation of the Lorentz group, and prove that that -if the potential is invariant under the Lorentz group it must be of the form -`c + m1 * ψ 0 * ψ 1 + m2 * barψ 0 * barψ 1 + λ * ψ 0 * ψ 1 * barψ 0 * barψ 1`, -which is true to all orders. - -## References - -- https://physics.stackexchange.com/questions/506709 describes the mass term of a - Weyl fermion. - --/ - -@[expose] public section - -namespace Fermion -noncomputable section - -open Module Matrix -open MatrixGroups -open Complex -open TensorProduct -open CategoryTheory.MonoidalCategory - -/-! - -## A. The effective potential for Weyl fermions - --/ - -/-- The type corresponding to the effective potential of a - left-handed Weyl fermion. -/ -abbrev EFTLagrangianExclDeriv : Type := ExteriorAlgebra ℂ - (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - -namespace EFTLagrangianExclDeriv - -/-! - -### A. The representation on the effective potential - --/ - -/-- The representation of the Lorentz group (here `SL(2, ℂ)`) on `EFTLagrangianExclDeriv`. -/ -def rep : Representation ℂ SL(2, ℂ) EFTLagrangianExclDeriv where - toFun Λ := (ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap - (LeftHandedWeyl.rep.conj.dual Λ))).toLinearMap - map_one' := by - simp only [map_one, End.one_eq_id, LinearMap.prodMap_id, ExteriorAlgebra.map_id, - AlgHom.toLinearMap_id] - map_mul' Λ1 Λ2 := by - simp only [map_mul, End.mul_eq_comp, ← LinearMap.prodMap_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - -lemma rep_apply (Λ : SL(2, ℂ)) (V : EFTLagrangianExclDeriv) : - rep Λ V = ExteriorAlgebra.map ((LeftHandedWeyl.rep.dual Λ).prodMap - (LeftHandedWeyl.rep.conj.dual Λ)) V := rfl - -@[simp] -lemma rep_apply_one (Λ : SL(2, ℂ)) : rep Λ 1 = 1 := by - simp [rep_apply] - -lemma rep_mul (Λ : SL(2, ℂ)) (V W : EFTLagrangianExclDeriv) : - rep Λ (V * W) = rep Λ V * rep Λ W:= by - simp [rep] - - -/-! - -## The invariance condition on - --/ - -/-- An effective potential is Lorentz invariant if it is stable under the - action of the Lorentz group. -/ -def IsInvariant (V : EFTLagrangianExclDeriv) : Prop := ∀ Λ, rep Λ V = V - -lemma IsInvariant.eq_iff {V : EFTLagrangianExclDeriv} : - IsInvariant V ↔ ∀ Λ, rep Λ V = V := by rfl - -@[simp] -lemma IsInvariant.zero : IsInvariant 0 := by - intro Λ - simp [rep] - -lemma IsInvariant.add {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V + W) := by - intro Λ - simp_all [IsInvariant.eq_iff] - -lemma IsInvariant.smul {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) (c : ℂ) : - IsInvariant (c • V) := by - intro Λ - simp_all [IsInvariant.eq_iff] - -lemma IsInvariant.mul {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V * W) := by - intro Λ - simp_all [IsInvariant.eq_iff, rep_mul] - -lemma IsInvariant.one : IsInvariant 1 := by - intro Λ - simp [rep] - -lemma IsInvariant.sum {ι : Type} (s : Finset ι) {f : ι → EFTLagrangianExclDeriv} - (h : ∀ i ∈ s, IsInvariant (f i)) : IsInvariant (∑ i ∈ s, f i) := by - intro Λ - simp_all [IsInvariant.eq_iff] - -end EFTLagrangianExclDeriv - -/-! - -### Diagonal elements of the Lorentz group - -The diagonal elements `diag (z, z⁻¹)` of `SL(2, ℂ)` scale each of the fields by a -factor, given below by `FieldSpecification.diagScale`. These elements are useful for -deriving selection rules on the effective potential. - --/ - -TODO "Move the diagonal `SL(2, ℂ)` material `diagSL`, `diagSL_inv`, `diagSL_neg_one` - and `twoI` to `Physlib.Relativity.SL2C.Basic`, their canonical home, when the - effective-potential development is split up." - -/-- The diagonal element `diag (z, z⁻¹)` of `SL(2, ℂ)` associated with a unit `z : ℂˣ`. -/ -def diagSL (z : ℂˣ) : SL(2, ℂ) := - ⟨!![(z : ℂ), 0; 0, ((z⁻¹ : ℂˣ) : ℂ)], by simp [Matrix.det_fin_two_of]⟩ - -@[simp] -lemma diagSL_inv (z : ℂˣ) : (diagSL z)⁻¹ = diagSL z⁻¹ := by - rw [inv_eq_iff_mul_eq_one] - ext i j - fin_cases i <;> fin_cases j <;> simp [diagSL, Matrix.mul_apply, Fin.sum_univ_two] - -/-- The diagonal element at `z = -1` is the central element `-1` of the Lorentz - group (the lift of a rotation by `2π`). -/ -@[simp] -lemma diagSL_neg_one : diagSL (-1) = -1 := by - ext i j - fin_cases i <;> fin_cases j <;> simp [diagSL] - -/-- The unit `2 * I` of `ℂ`. The associated diagonal Lorentz transformation - `diagSL twoI` detects selection rules which real diagonal elements miss, since its - scaling factors mix in a phase under conjugation. -/ -def twoI : ℂˣ := - ⟨2 * I, -I / 2, by linear_combination -Complex.I_mul_I, by linear_combination -Complex.I_mul_I⟩ - -@[simp] -lemma twoI_val : ((twoI : ℂˣ) : ℂ) = 2 * I := (rfl) - -@[simp] -lemma twoI_inv_val : ((twoI⁻¹ : ℂˣ) : ℂ) = -I / 2 := (rfl) - -/-! - -### B. Field specification for the theory - --/ - -/-- The specification of the field components appearing in the effective potential: - the two components `ψ α` of the left-handed Weyl fermion and the two components - `barψ α` of its conjugate. -/ -inductive FieldSpecification : Type - | ψ (α : Fin 2) : FieldSpecification - | barψ (α : Fin 2) : FieldSpecification -deriving DecidableEq, Repr - -namespace FieldSpecification - -open EFTLagrangianExclDeriv - -instance : Fintype FieldSpecification where - elems := {ψ 0, ψ 1, barψ 0, barψ 1} - complete := by - intro x - match x with - | ψ 0 => simp - | ψ 1 => simp - | barψ 0 => simp - | barψ 1 => simp - -/-! - -## Ordering on FieldSpecification - -We define an ordering on `FieldSpecification`. -This ordering is a choice, and nothing physical can depend on this choice. -We however make it as it simplifies the proofs of lots of lemmas, and -makes it easy to do more calculational aspects. - --/ - -/-- The equivalence between `FieldSpecification` and `Fin 2 ⊕ Fin 2` sending `ψ α` to - the left and `barψ α` to the right component. -/ -def toSumFin : FieldSpecification ≃ Fin 2 ⊕ Fin 2 where - toFun := fun | .ψ (α : Fin 2) => Sum.inl α | .barψ α => Sum.inr α - invFun := fun | .inl α => ψ α | .inr α => barψ α - left_inv f := by cases f <;> rfl - right_inv x := by cases x <;> rfl - - -/-- The basis of the module underlying the effective potential indexed by - `FieldSpecification`: `ψ α` corresponds to the dual basis of the left-handed Weyl - fermion and `barψ α` to the dual basis of its conjugate. -/ -def moduleBasis : Basis FieldSpecification ℂ - (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) := - (LeftHandedWeyl.basis.dualBasis.prod LeftHandedWeyl.basis.conj.dualBasis).reindex toSumFin.symm - -/-- The image of a field specification in the effective potential, as the - exterior-algebra generator of the corresponding basis vector. Denoted `[ψ]ₑ`. -/ -def toEFTLagrangianExclDeriv (ψ : FieldSpecification) : EFTLagrangianExclDeriv := - ExteriorAlgebra.ι ℂ (moduleBasis ψ) - -scoped notation "[" v "]ₑ" => toEFTLagrangianExclDeriv v - -lemma toEFTLagrangianExclDeriv_eq (ψ : FieldSpecification) : - toEFTLagrangianExclDeriv ψ = ExteriorAlgebra.ι ℂ (moduleBasis ψ) := rfl - -lemma toEFTLagrangianExclDeriv_ψ_eq (α : Fin 2) : [ψ α]ₑ = - ExteriorAlgebra.ι ℂ (LinearMap.inl ℂ _ _ (LeftHandedWeyl.basis.dualBasis α)) := by - fin_cases α <;> simp [toEFTLagrangianExclDeriv_eq, moduleBasis, toSumFin] - -lemma toEFTLagrangianExclDeriv_barψ_eq (α : Fin 2) : [barψ α]ₑ = - ExteriorAlgebra.ι ℂ (LinearMap.inr ℂ _ _ (LeftHandedWeyl.basis.conj.dualBasis α)) := by - fin_cases α <;> simp [toEFTLagrangianExclDeriv_eq, moduleBasis, toSumFin] - -@[simp] -lemma toEFTLagrangianExclDeriv_mul_self (ψ : FieldSpecification) : [ψ]ₑ * [ψ]ₑ = 0 := by - simp [toEFTLagrangianExclDeriv_eq] - -lemma toEFTLagrangianExclDeriv_mul_anti_commute (ψ χ : FieldSpecification) : - [ψ]ₑ * [χ]ₑ = - [χ]ₑ * [ψ]ₑ := by - simp [toEFTLagrangianExclDeriv_eq, neg_mul, eq_neg_iff_add_eq_zero] - -lemma rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : - rep Λ [ψ α]ₑ = ∑ (β : Fin 2), Λ⁻¹ α β • [ψ β]ₑ := by - simp only [toEFTLagrangianExclDeriv_ψ_eq, Basis.coe_dualBasis, LinearMap.coe_inl, rep_apply, - Representation.dual_apply, ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, - ← map_smul, Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, - add_zero, ExteriorAlgebra.ι_inj, Prod.mk.injEq, and_true] - refine LeftHandedWeyl.basis.ext fun l => ?_ - fin_cases α <;> fin_cases l <;> - simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, - -SpecialLinearGroup.coe_inv] - -lemma rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum (Λ : SL(2, ℂ)) (α : Fin 2) : - rep Λ [barψ α]ₑ = ∑ β, star (Λ⁻¹ α β) • [barψ β]ₑ := by - simp only [toEFTLagrangianExclDeriv_barψ_eq, Basis.coe_dualBasis, LinearMap.coe_inr, rep_apply, - Representation.dual_apply, - ExteriorAlgebra.map_apply_ι, LinearMap.prodMap_apply, map_zero, RCLike.star_def, ← map_smul, - Prod.smul_mk, smul_zero, Fin.sum_univ_two, Fin.isValue, ← map_add, Prod.mk_add_mk, add_zero, - ExteriorAlgebra.ι_inj, Prod.mk.injEq, true_and] - refine LeftHandedWeyl.basis.conj.ext fun l => ?_ - fin_cases α <;> fin_cases l <;> - simp [Module.Dual.transpose_apply, LeftHandedWeyl.rep_apply_basis, - -SpecialLinearGroup.coe_inv, Representation.conj_apply] - -/-! - -## Scaling of the fields under diagonal Lorentz transformations - --/ - -/-- The factor by which the field specifications scale under the action of `diagSL z`. -/ -def diagScale (z : ℂˣ) : FieldSpecification → ℂ - | .ψ α => if α = 0 then ((z⁻¹ : ℂˣ) : ℂ) else z - | .barψ α => if α = 0 then star ((z⁻¹ : ℂˣ) : ℂ) else star (z : ℂ) - -lemma rep_diagSL_apply (z : ℂˣ) (φ : FieldSpecification) : - rep (diagSL z) [φ]ₑ = diagScale z φ • [φ]ₑ := by - match φ with - | .ψ α => - rw [rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum, diagSL_inv] - fin_cases α <;> simp [diagSL, diagScale, Fin.sum_univ_two] - | .barψ α => - rw [rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum, diagSL_inv] - fin_cases α <;> simp [diagSL, diagScale, Fin.sum_univ_two] - -@[simp] -lemma diagScale_neg_one (φ : FieldSpecification) : diagScale (-1) φ = -1 := by - cases φ <;> simp [diagScale] - -lemma diagScale_twoI_ψ (α : Fin 2) : - diagScale twoI (ψ α) = if α = 0 then -I / 2 else 2 * I := by - simp only [diagScale, twoI_val, twoI_inv_val] - -lemma diagScale_twoI_barψ (α : Fin 2) : - diagScale twoI (barψ α) = if α = 0 then I / 2 else -(2 * I) := by - simp only [diagScale, twoI_val, twoI_inv_val] - split_ifs <;> simp [Complex.conj_I] - -/-- Every field scales by `-1` under the central element `-1` of the Lorentz group - (fermion parity): the special case `z = -1` of `rep_diagSL_apply`. -/ -lemma rep_neg_one_apply (φ : FieldSpecification) : - rep (-1) [φ]ₑ = (-1 : ℂ) • [φ]ₑ := by - rw [← diagSL_neg_one, rep_diagSL_apply, diagScale_neg_one] - -/-- Under `diagSL twoI` the total scaling of a mixed pair `ψ α`, `barψ β` is never `1`: - the four possible products are `1 / 4`, `-1`, `-1` and `4`. This is the numerical - input to the selection rule `irrepCoeff_ψ_barψ_eq_zero_of_isInvariant`. -/ -lemma diagScale_twoI_ψ_mul_barψ_ne_one (α β : Fin 2) : - diagScale twoI (ψ α) * diagScale twoI (barψ β) ≠ 1 := by - fin_cases α <;> fin_cases β <;> - simp only [diagScale_twoI_ψ, diagScale_twoI_barψ, Fin.zero_eta, Fin.mk_one, Fin.reduceEq, - reduceIte] - -- The four cases are the four weight products `1/4`, `-1`, `-1` and `4`. Each - -- counterfactual is routed through `linear_combination` with `I * I = -1` to a - -- rational equation, since `norm_num` alone treats `I` as an opaque atom; no uniform - -- closer exists (the modulus argument degenerates for the two `-1` cases). - · intro hcontra - have h : (1 / 4 : ℂ) = 1 := by - linear_combination hcontra + (1 / 4 : ℂ) * Complex.I_mul_I - norm_num at h - · intro hcontra - have h : (-1 : ℂ) = 1 := by linear_combination hcontra - Complex.I_mul_I - norm_num at h - · intro hcontra - have h : (-1 : ℂ) = 1 := by linear_combination hcontra - Complex.I_mul_I - norm_num at h - · intro hcontra - have h : (4 : ℂ) = 1 := by linear_combination hcontra + 4 * Complex.I_mul_I - norm_num at h - -/-! - -## The irreps - --/ - -/-- The irreducible representations of the Lorentz group present in the effective - potential: `ψ` for the left-handed Weyl fermion and `barψ` for its conjugate. -/ -inductive Irrep - | ψ - | barψ -deriving DecidableEq, Fintype - -/-- The irrep in which a field specification sits. -/ -def toIrrep : FieldSpecification → Irrep - | .ψ _ => .ψ - | .barψ _ => .barψ - -@[simp] -lemma toIrrep_ψ (α : Fin 2) : toIrrep (ψ α) = Irrep.ψ := rfl - -@[simp] -lemma toIrrep_barψ (α : Fin 2) : toIrrep (barψ α) = Irrep.barψ := rfl - -lemma rep_apply_toEFTLagrangianExclDeriv_mem_irrep (Λ : SL(2, ℂ)) (ψ : FieldSpecification) : - ∃ n, ∃ F : Fin n → FieldSpecification, (∃ f : Fin n → ℂ, rep Λ [ψ]ₑ = ∑ x, f x • [F x]ₑ) ∧ - (∀ x, toIrrep (F x) = toIrrep ψ) := by - match ψ with - | .ψ α => - exact ⟨2, .ψ, ⟨Λ⁻¹ α, rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum Λ α⟩, by simp⟩ - | .barψ α => - exact ⟨2, .barψ, ⟨star (Λ⁻¹ α), rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum Λ α⟩, - by simp⟩ - -/-! - -## Mass dimension - --/ - -/-- The mass dimension of each field specification; a Weyl fermion in four dimensions - has mass dimension `3 / 2`. -/ -def massDimension : FieldSpecification → ℚ - | .ψ _ => 3 / 2 - | .barψ _ => 3 / 2 - -@[simp] -lemma massDimension_eq (f : FieldSpecification) : massDimension f = 3 / 2 := by - cases f <;> rfl - -lemma massDimension_pos (f : FieldSpecification) : 0 < massDimension f := by - rw [massDimension_eq] - norm_num - -/-- In a theory whose fields all have the same mass dimension, the overall mass - dimension of an operator just counts its fields. -/ -lemma sum_map_massDimension (s : Multiset FieldSpecification) : - (s.map massDimension).sum = 3 / 2 * (Multiset.card s : ℚ) := by - induction s using Multiset.induction with - | empty => simp - | cons a t ih => - rw [Multiset.map_cons, Multiset.sum_cons, ih, Multiset.card_cons, massDimension_eq] - push_cast - ring - -/-- The mass dimension of a field specification in units of half mass dimensions, - so that a Weyl fermion has scaled mass dimension `3`. Unlike `massDimension` this - is usable with `decide`, since natural-number arithmetic reduces in the kernel. -/ -def massDimensionNat : FieldSpecification → ℕ - | .ψ _ => 3 - | .barψ _ => 3 - -@[simp] -lemma massDimensionNat_eq (f : FieldSpecification) : massDimensionNat f = 3 := by - cases f <;> rfl - -lemma massDimensionNat_cast (f : FieldSpecification) : - (massDimensionNat f : ℚ) = massDimension f * 2 := by - rw [massDimensionNat_eq, massDimension_eq] - norm_num - - -/-! - -## Conjugation - --/ - -def conjugate (ψ : FieldSpecification) : FieldSpecification := - match ψ with - | .ψ α => .barψ α - | .barψ α => .ψ α - -end FieldSpecification - -namespace EFTLagrangianExclDeriv - -open FieldSpecification - -/-! - -## Elements from a list of FieldSpecifications --/ - -/-- The operator in the effective potential given by the ordered product of the - fields in `l`. -/ -def termOfList (l : List FieldSpecification) : EFTLagrangianExclDeriv := - (l.map toEFTLagrangianExclDeriv).prod - -lemma termOfList_cons (ψ : FieldSpecification) (l : List FieldSpecification) : - termOfList (ψ :: l) = [ψ]ₑ * termOfList l := by simp [termOfList] - -@[simp] -lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] - -lemma termOfList_singleton (ψ : FieldSpecification) : termOfList [ψ] = [ψ]ₑ := by - simp [termOfList_cons] - -lemma termOfList_append (l1 l2 : List FieldSpecification) : - termOfList (l1 ++ l2) = termOfList l1 * termOfList l2 := by - simp [termOfList] - -lemma mul_termOfList_of_mem (ψ : FieldSpecification) (l : List FieldSpecification) - (hψ : ψ ∈ l) : [ψ]ₑ * termOfList l = 0 := by - induction l with - | nil => simp at hψ - | cons β t ih => - rcases List.mem_cons.mp hψ with rfl | ha - · simp [termOfList_cons, ← mul_assoc] - · simp [termOfList_cons, ← mul_assoc, toEFTLagrangianExclDeriv_mul_anti_commute ψ β] - simp [mul_assoc, ih ha] - -lemma termOfList_comm_fieldSpecification (ψ : FieldSpecification) (l : List FieldSpecification) : - termOfList l * [ψ]ₑ = ((-1) ^ l.length : ℂ) • ([ψ]ₑ * termOfList l) := by - induction l with - | nil => simp - | cons β t ih => - simp only [termOfList_cons, mul_assoc, ih, Algebra.mul_smul_comm, List.length_cons] - simp only [← mul_assoc, toEFTLagrangianExclDeriv_mul_anti_commute β ψ, neg_mul, smul_neg] - ring_nf - simp - -lemma termOfList_zero_of_not_nodup (l : List FieldSpecification) (h : ¬ l.Nodup) : - termOfList l = 0 := by - revert h - induction l with - | nil => intro h; exact absurd List.nodup_nil h - | cons a t ih => - intro h - rw [termOfList_cons] - by_cases hmem : a ∈ t - · exact mul_termOfList_of_mem a t hmem - · rw [ih fun hn => h (List.nodup_cons.mpr ⟨hmem, hn⟩), mul_zero] - -lemma rep_termOfList_eq_map_rep (Λ : SL(2, ℂ)) (l : List FieldSpecification) : - rep Λ (termOfList l) = ((l.map toEFTLagrangianExclDeriv).map (rep Λ)).prod := by - induction l with - | nil => simp - | cons i l ih => - simp [termOfList_cons, rep_mul, ih] - -lemma rep_termOfList_of_monomial (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) - (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [σ ψ]ₑ) - (l : List FieldSpecification) : - rep g (termOfList l) = (l.map d).prod • termOfList (l.map σ):= by - induction l with - | nil => simp - | cons a l ih => - rw [termOfList_cons, rep_mul, hg, ih] - simp [termOfList_cons, smul_smul, mul_comm] - -lemma rep_scale_termOfList_of_rep_scale_toEFTLagrangianExclDeriv (Λ : SL(2, ℂ)) - (h : ∀ ψ, ∃ c : ℂ, rep Λ [ψ]ₑ = c • [ψ]ₑ) (l : List FieldSpecification) : - ∃ c : ℂ, rep Λ (termOfList l) = c • termOfList l := by - induction l with - | nil => exact ⟨1, by simp⟩ - | cons ψ t ih => - obtain ⟨cψ, hcψ⟩ := h ψ - obtain ⟨ct, hct⟩ := ih - refine ⟨cψ * ct, ?_⟩ - simp [termOfList_cons, rep_mul, hcψ, hct] - module - - -lemma rep_termOfList_eq_sum_of_toIrrep (Λ : SL(2, ℂ)) (l : List FieldSpecification) : - ∃ n, ∃ F : Fin n → List FieldSpecification, - (∃ f : Fin n → ℂ, rep Λ (termOfList l) = ∑ x, f x • termOfList (F x)) ∧ - (∀ x, (F x).map toIrrep = l.map toIrrep) := by - induction l with - | nil => - refine ⟨1, fun _ => [], ⟨fun _ => 1, by simp⟩, fun _ => rfl⟩ - | cons ψ t ih => - obtain ⟨n, F, ⟨f, hf⟩, hF⟩ := ih - obtain ⟨nψ, Fψ, ⟨fψ, hfψ⟩, hFψ⟩ := rep_apply_toEFTLagrangianExclDeriv_mem_irrep Λ ψ - use nψ * n - let F' : Fin nψ × Fin n → List FieldSpecification := fun ⟨i, j⟩ => Fψ i :: F j - use F' ∘ finProdFinEquiv.symm - refine ⟨?_, ?_⟩ - · use (fun ⟨i, j⟩ => fψ i * f j) ∘ finProdFinEquiv.symm - rw [← finProdFinEquiv.sum_comp] - simp [termOfList_cons, rep_mul, F', hfψ, hf] - rw [Fintype.sum_mul_sum, Fintype.sum_prod_type] - simp [smul_smul] - congr - funext x - congr - funext y - ring_nf - · intro x - obtain ⟨x, rfl⟩ := finProdFinEquiv.surjective x - simp [F', hF, hFψ] - -lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : - V ∈ Submodule.span ℂ (Set.range termOfList) := by - induction V using ExteriorAlgebra.induction with - | algebraMap r => - rw [Algebra.algebraMap_eq_smul_one] - exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], termOfList_nil⟩) - | ι v => - rw [← Basis.sum_repr moduleBasis v, map_sum] - refine Submodule.sum_mem _ fun f _ => ?_ - rw [map_smul] - exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[f], by simp [termOfList_singleton]; rfl⟩) - | mul a b ha hb => - induction ha using Submodule.span_induction with - | mem x hx => - obtain ⟨l1, rfl⟩ := hx - induction hb using Submodule.span_induction with - | mem y hy => - obtain ⟨l2, rfl⟩ := hy - exact Submodule.subset_span ⟨l1 ++ l2, termOfList_append l1 l2⟩ - | zero => simp - | add y z _ _ hy hz => rw [mul_add]; exact add_mem hy hz - | smul c y _ hy => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ hy - | zero => simp - | add x y _ _ hx hy => rw [add_mul]; exact add_mem hx hy - | smul c x _ hx => rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ hx - | add a b ha hb => exact add_mem ha hb - -lemma termOfList_perm_neq_zero {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : - ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ (c = 1 ∨ c = -1) := by - induction h with - | nil => exact ⟨1, by simp⟩ - | cons x _ ih => - obtain ⟨c, hc1, hc2⟩ := ih - exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc1, mul_smul_comm], hc2⟩ - | swap x y l => - refine ⟨-1, ?_⟩ - rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc, - toEFTLagrangianExclDeriv_mul_anti_commute y x] - simp [mul_assoc] - | trans _ _ ih1 ih2 => - obtain ⟨c1, hc1, hc1'⟩ := ih1 - obtain ⟨c2, hc2, hc2'⟩ := ih2 - exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul], by grind⟩ - -lemma termOfList_perm {l1 l2 : List FieldSpecification} (h : l1.Perm l2) : - ∃ c : ℂ, termOfList l1 = c • termOfList l2 := by - obtain ⟨c, h1, h2⟩ := termOfList_perm_neq_zero h - exact ⟨c, h1⟩ - - -lemma termOfList_reverse_eq {l : List FieldSpecification} : - termOfList l.reverse = ((-1) ^ (l.length.choose 2) : ℂ) • termOfList l := by - induction l with - | nil => simp - | cons ψ t ih => - rw [List.reverse_cons, termOfList_append, termOfList_singleton, ih, smul_mul_assoc, - termOfList_comm_fieldSpecification, ← termOfList_cons, smul_smul, ← pow_add, - List.length_cons, Nat.choose_succ_succ, Nat.choose_one_right, Nat.add_comm] - -lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldSpecification} {c : ℂ} - (h : termOfList l1 = c • termOfList l2) : - termOfList l1.reverse = c • termOfList l2.reverse := by - have hf : ∀ l : List FieldSpecification, - CliffordAlgebra.reverse (termOfList l) = termOfList l.reverse := by - intro l - induction l with - | nil => simp - | cons ψ t ih => - rw [termOfList_cons, CliffordAlgebra.reverse.map_mul, ih, List.reverse_cons, - termOfList_append, termOfList_singleton, toEFTLagrangianExclDeriv_eq, - CliffordAlgebra.reverse_ι] - rw [← hf, ← hf, h, map_smul] - -lemma termOfList_reverse_zero_of_zero {l : List FieldSpecification} (h : termOfList l = 0) : - termOfList l.reverse = 0 := by - rw [termOfList_reverse_eq, h, smul_zero] - -lemma termOfList_conjugate_eq_of_eq {l1 l2 : List FieldSpecification} {c : ℂ} - (h : termOfList l1 = c • termOfList l2) : - termOfList (l1.map conjugate) = c • termOfList (l2.map conjugate) := by - let f := ExteriorAlgebra.map (moduleBasis.constr ℂ fun ψ => moduleBasis (conjugate ψ)) - have hf : ∀ l : List FieldSpecification, f (termOfList l) = termOfList (l.map conjugate) := by - intro l - induction l with - | nil => simp [f] - | cons ψ t ih => - rw [termOfList_cons, List.map_cons, termOfList_cons, map_mul, ih] - congr 1 - simp [f, toEFTLagrangianExclDeriv_eq, ExteriorAlgebra.map_apply_ι] - rw [← hf, ← hf, h, map_smul] - -lemma termOfList_conjugate_zero_of_zero {l : List FieldSpecification} (h : termOfList l = 0) : - termOfList (l.map conjugate) = 0 := by - let f := ExteriorAlgebra.map (moduleBasis.constr ℂ fun ψ => moduleBasis (conjugate ψ)) - have hf : ∀ l : List FieldSpecification, f (termOfList l) = termOfList (l.map conjugate) := by - intro l - induction l with - | nil => simp [f] - | cons ψ t ih => - rw [termOfList_cons, List.map_cons, termOfList_cons, map_mul, ih] - congr 1 - simp [f, toEFTLagrangianExclDeriv_eq, ExteriorAlgebra.map_apply_ι] - rw [← hf, h] - simp - -lemma termOfList_eq_ιMulti (l : List FieldSpecification) : - termOfList l = ExteriorAlgebra.ιMulti ℂ l.length (fun i => moduleBasis (l.get i)) := by - induction l with - | nil => simp - | cons ψ l h => - simp [termOfList_cons, h] - rfl - -lemma termOfList_ofFn {n : ℕ} (g : Fin n → FieldSpecification) : - termOfList (List.ofFn g) = ExteriorAlgebra.ιMulti ℂ n (fun i => moduleBasis (g i)) := by - rw [ExteriorAlgebra.ιMulti_apply, termOfList, List.map_ofFn] - rfl - -/-! - -## Construction of a term from a tuple - --/ - -/-- The operator in the effective potential given by the ordered product of the - fields in the tuple `g`. -/ -def termOfTuple {n} (g : Fin n → FieldSpecification) : EFTLagrangianExclDeriv := - termOfList (List.ofFn g) - -lemma termOfTuple_eq_ιMulti {n} (g : Fin n → FieldSpecification) : - termOfTuple g = ExteriorAlgebra.ιMulti ℂ n (fun i => moduleBasis (g i)) := by - rw [termOfTuple, termOfList_ofFn] - -lemma termOfTuple_perm {n} (g : Fin n → FieldSpecification) {i j : Fin n} (hij : i ≠ j) : - termOfTuple (g ∘ Equiv.swap i j) = - termOfTuple g := by - rw [termOfTuple_eq_ιMulti, termOfTuple_eq_ιMulti] - exact AlternatingMap.map_swap (ExteriorAlgebra.ιMulti ℂ n) (fun k => moduleBasis (g k)) hij - -/-- The alternating map taking a tuple of vectors to their product in the - effective potential. -/ -def termOfVectTuple {n} : - AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - EFTLagrangianExclDeriv (Fin n) := ExteriorAlgebra.ιMulti ℂ n - -/-- The alternating map underlying `coeff s`: a tuple of vectors is sent to - `termOfTuple g` weighted by the product of the `g`-coordinates of the vectors, - summed over the tuples `g` of fields with field content `s`. -/ -def coeffOfVectorTuple (s : Multiset FieldSpecification) (n : ℕ) : - AlternatingMap ℂ (Module.Dual ℂ LeftHandedWeyl × Module.Dual ℂ (ConjModule LeftHandedWeyl)) - EFTLagrangianExclDeriv (Fin n) where - toMultilinearMap := - ∑ g : Fin n → FieldSpecification, - if Multiset.ofList (List.ofFn g) = s then - (LinearMap.toSpanSingleton ℂ EFTLagrangianExclDeriv (termOfTuple g)).compMultilinearMap - ((MultilinearMap.mkPiAlgebra ℂ (Fin n) ℂ).compLinearMap fun i => moduleBasis.coord (g i)) - else 0 - map_eq_zero_of_eq' := by - intro v i j hv hij - have hvswap : ∀ k, v (Equiv.swap i j k) = v k := by - intro k - rcases eq_or_ne k i with rfl | hki - · rw [Equiv.swap_apply_left]; exact hv.symm - rcases eq_or_ne k j with rfl | hkj - · rw [Equiv.swap_apply_right]; exact hv - · rw [Equiv.swap_apply_of_ne_of_ne hki hkj] - simp only [MultilinearMap.toFun_eq_coe, _root_.sum_apply] - refine Finset.sum_involution (fun g _ => g ∘ Equiv.swap i j) ?_ ?_ - (fun g _ => Finset.mem_univ _) ?_ - · intro g _ - have hms : Multiset.ofList (List.ofFn (g ∘ Equiv.swap i j)) = - Multiset.ofList (List.ofFn g) := - Multiset.coe_eq_coe.mpr ((Equiv.swap i j).ofFn_comp_perm g) - rw [hms] - split_ifs with h - · simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, - MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply, - Function.comp_apply] - have hprod : ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v k) = - ∏ k, moduleBasis.coord (g k) (v k) := - calc ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v k) - = ∏ k, moduleBasis.coord (g (Equiv.swap i j k)) (v (Equiv.swap i j k)) := - Finset.prod_congr rfl fun k _ => by rw [hvswap k] - _ = ∏ k, moduleBasis.coord (g k) (v k) := - Equiv.prod_comp (Equiv.swap i j) fun k => moduleBasis.coord (g k) (v k) - rw [hprod, termOfTuple_perm g hij, smul_neg, add_neg_cancel] - · simp - · intro g _ hfg hcontra - apply hfg - have hgji : g j = g i := by - simpa [Equiv.swap_apply_left] using congrFun hcontra i - have hterm : termOfTuple g = 0 := by - rw [termOfTuple_eq_ιMulti] - exact AlternatingMap.map_eq_zero_of_eq _ _ (by rw [hgji]) hij - split_ifs - · simp [hterm] - · simp - · intro g _ - funext k - simp [Function.comp, Equiv.swap_apply_self] - -/-! - -## Coefficents - -We can't define a basis on effective potential without choosing and ordering on the field -specification. To get around this, we can define the coefficient of an effective potential given a -multi-set of field specifications as a linear map which projects down onto a subspace spanned by -terms which are of the correct type. It actually projects down onto a one-dimensional subspace, and -this is where you can think of it as a coefficient. - --/ - -/-- The projection of an effective potential onto the span of the operators with - field content `s`. As described above, this plays the role of the coefficient - of the operator `s` in the effective potential. -/ -def coeff (s : Multiset FieldSpecification) : - EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := - ExteriorAlgebra.liftAlternating (coeffOfVectorTuple s) - -lemma coeff_apply_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) : - coeff s (termOfList l) = if Multiset.ofList l = s then termOfList l else 0 := by - have hterm : termOfTuple l.get = termOfList l := by rw [termOfTuple, List.ofFn_get] - rw [coeff, termOfList_eq_ιMulti, ExteriorAlgebra.liftAlternating_apply_ιMulti] - simp only [coeffOfVectorTuple, AlternatingMap.coe_mk, _root_.sum_apply] - refine (Finset.sum_eq_single l.get ?_ ?_).trans ?_ - · intro g _ hg - obtain ⟨i, hi⟩ := Function.ne_iff.mp hg - split_ifs with h - · simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, - MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply] - have hzero : ∏ k, moduleBasis.coord (g k) (moduleBasis (l.get k)) = 0 := - Finset.prod_eq_zero (Finset.mem_univ i) (by - rw [Basis.coord_apply, Basis.repr_self, Finsupp.single_eq_of_ne hi]) - rw [hzero, zero_smul] - · simp - · intro h - exact absurd (Finset.mem_univ _) h - · rw [List.ofFn_get] - split_ifs with h - · simp only [LinearMap.compMultilinearMap_apply, MultilinearMap.compLinearMap_apply, - MultilinearMap.mkPiAlgebra_apply, LinearMap.toSpanSingleton_apply, hterm] - have hprod : ∏ i, moduleBasis.coord (l.get i) (moduleBasis (l.get i)) = 1 := by simp - rw [hprod, one_smul] - exact termOfList_eq_ιMulti l - · simp - -lemma coeff_one (s : Multiset FieldSpecification) : coeff s 1 = if s = ∅ then 1 else 0 := by - trans coeff s (termOfList []) - · simp - · rw [coeff_apply_termOfList] - simp - grind - -@[simp] -lemma coeff_coeff_self {s : Multiset FieldSpecification} (V : EFTLagrangianExclDeriv) : - coeff s (coeff s V) = coeff s V := by - induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy - a x _ hx - · simp at hV' - obtain ⟨l, rfl⟩ := hV' - simp [coeff_apply_termOfList, apply_ite] - grind - · simp - · simp [hx, hy] - · simp [hx] - -lemma coeff_coeff_eq_zero_of_diff {s1 s2 : Multiset FieldSpecification} (h : s1 ≠ s2) - (V : EFTLagrangianExclDeriv) : coeff s1 (coeff s2 V) = 0 := by - induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy - a x _ hx - · simp at hV' - obtain ⟨l, rfl⟩ := hV' - simp [coeff_apply_termOfList, apply_ite] - grind - · simp - · simp [hx, hy] - · simp [hx] - -lemma coeff_sum_eq_zero_iff (V : EFTLagrangianExclDeriv) - (S : Finset (Multiset FieldSpecification)): - ∑ s ∈ S, coeff s V = 0 ↔ ∀ s ∈ S, coeff s V = 0 := by - constructor - · intro h s hs - have h1 := congrArg (coeff s) h - simp at h1 - rw [Finset.sum_eq_single s] at h1 - simpa using h1 - · intro b hb hx - exact coeff_coeff_eq_zero_of_diff (id (Ne.symm hx)) V - · simp_all - · intro h - exact Finset.sum_eq_zero h - -lemma coeff_eq_termOfList {s : Multiset FieldSpecification} - (V : EFTLagrangianExclDeriv) {l : List FieldSpecification} (hl : Multiset.ofList l = s) : - ∃ c : ℂ, coeff s V = c • termOfList l := by - induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy - a x _ hx - · simp at hV' - obtain ⟨l', rfl⟩ := hV' - simp [coeff_apply_termOfList] - split_ifs - · rename_i hi - refine termOfList_perm ?_ - rw [← Multiset.coe_eq_coe] - simp_all - · use 0 - simp - · use 0 - simp - · obtain ⟨c1, hx⟩ := hx - obtain ⟨c2, hy⟩ := hy - use (c1 + c2) - simp [hx, hy] - module - · obtain ⟨c1, hx⟩ := hx - use a • c1 - simp [hx, smul_smul] - -lemma coeff_eq_exists_termOfList (s : Multiset FieldSpecification) - (V : EFTLagrangianExclDeriv) : - ∃ l, ∃ c : ℂ, (coeff s V = c • termOfList l) ∧ Multiset.ofList l = s := by - obtain ⟨c, hl⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) - use Multiset.toList s - use c - simp [hl] - -lemma coeff_monomial_selection_rule (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) - (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [σ ψ]ₑ) - (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv) (hV : IsInvariant V) : - coeff (s.map σ) V = rep g (coeff s V) := by - suffices h : ∀ W, coeff (s.map σ) (rep g W) = rep g (coeff s W) by - specialize h V - rw [hV g] at h - exact h - intro W - induction' mem_termOfList_span W using Submodule.span_induction with W' hW' x y _ _ hx hy - a x _ hx - · simp only [Set.mem_range] at hW' - obtain ⟨l, rfl⟩ := hW' - rw [rep_termOfList_of_monomial g σ d hg, map_smul, - coeff_apply_termOfList, coeff_apply_termOfList] - have hcond : Multiset.ofList (List.map σ l) = Multiset.map σ s ↔ - Multiset.ofList l = s := by - rw [← Multiset.map_coe] - exact ⟨fun hc => Multiset.map_injective σ.injective hc, fun hc => by rw [hc]⟩ - split_ifs with h1 h2 h2 - · rw [rep_termOfList_of_monomial g σ d hg] - · exact absurd (hcond.mp h1) h2 - · exact absurd (hcond.mpr h2) h1 - · simp - · simp - · simp [hx, hy] - · simp [hx] - -/-- If the action of `g` is to permute the fields, - then it defines a relation between the coefficients of the effective potential. -/ -lemma coeff_perm_selection_rule (g : SL(2, ℂ)) (σ : Equiv.Perm FieldSpecification) - (hg : ∀ ψ, rep g [ψ]ₑ = [σ ψ]ₑ) (s : Multiset FieldSpecification) - (V : EFTLagrangianExclDeriv) (hV : IsInvariant V) : - coeff (s.map σ) V = rep g (coeff s V) := by - apply coeff_monomial_selection_rule g σ (fun _ => 1) ?_ s V hV - intro ψ - simpa using hg ψ - -lemma coeff_U1_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) - (g : SL(2, ℂ)) (d : FieldSpecification → ℂ) (hg : ∀ ψ, rep g [ψ]ₑ = d ψ • [ψ]ₑ) - (s : Multiset FieldSpecification) (hs : (s.map d).prod ≠ 1) : - coeff s V = 0 := by - have h1 : coeff s V = rep g (coeff s V) := by - simpa using coeff_monomial_selection_rule g (Equiv.refl FieldSpecification) d - (by simpa using hg) s V hV - have hfix : rep g (coeff s V) = (s.map d).prod • coeff s V := by - obtain ⟨c, hl⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) - have hprod : ((Multiset.toList s).map d).prod = (s.map d).prod := by - rw [← Multiset.coe_toList s] - simp - rw [hl, map_smul, - rep_termOfList_of_monomial g (Equiv.refl FieldSpecification) d (by simpa using hg)] - simp [smul_smul, hprod, mul_comm] - have h2 : (1 - (s.map d).prod) • coeff s V = 0 := by - rw [sub_smul, one_smul, ← hfix, ← h1, sub_self] - rcases smul_eq_zero.mp h2 with h | h - · exact absurd (sub_eq_zero.mp h).symm hs - · exact h - -/-- The selection rule on coefficients coming from the anti-symmetry of fermionic fields. - Note that this holds for any effective potential, invariant or not. -/ -lemma coeff_fermionic_selection_rule {V : EFTLagrangianExclDeriv} - (s : Multiset FieldSpecification) (hs : ¬ s.Nodup) : - coeff s V = 0 := by - obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := s) (l := Multiset.toList s) (by simp) - have hl : ¬ (Multiset.toList s).Nodup := by - rw [← Multiset.coe_toList s] at hs - exact fun h => hs (Multiset.coe_nodup.mpr h) - rw [hc, termOfList_zero_of_not_nodup _ hl, smul_zero] - -/-- The selection rule on coefficients saying that - every term with an odd number of fermions is zero. -/ -lemma coeff_odd_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) - (s : Multiset FieldSpecification) (hs : Odd s.card) : coeff s V = 0 := by - refine coeff_U1_selection_rule hV (-1) (fun _ => -1) rep_neg_one_apply s ?_ - rw [Multiset.map_const', Multiset.prod_replicate, hs.neg_one_pow] - norm_num - -@[simp] -lemma coeff_ψ_barψ_selection_rule {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) - (a b : Fin 2) : coeff {.ψ a, .barψ b} V = 0 := by - refine coeff_U1_selection_rule hV (diagSL twoI) (diagScale twoI) (rep_diagSL_apply twoI) _ ?_ - simp only [Multiset.insert_eq_cons, diagScale, Fin.isValue, Units.val_inv_eq_inv_val, twoI_val, - _root_.mul_inv_rev, inv_I, neg_mul, star_neg, star_mul', RCLike.star_def, conj_I, star_inv₀, - star_ofNat, neg_neg, mul_neg, Multiset.map_cons, Multiset.map_singleton, Multiset.prod_cons, - Multiset.prod_singleton, mul_ite, ite_mul, ne_eq] - field_simp - simp only [Fin.isValue, I_sq, neg_neg, neg_mul, one_mul] - grind - -lemma coeff_empty_isInvariant {V : EFTLagrangianExclDeriv} : IsInvariant (coeff 0 V) := by - obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := 0) (l := []) (by simp) - rw [hc] - refine IsInvariant.smul (fun Λ => ?_) _ - simp - -lemma coeff_ψ_zero_ψ_one_isInvariant {V : EFTLagrangianExclDeriv} : - IsInvariant (coeff {.ψ 0, .ψ 1} V) := by - obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1}) (l := [.ψ 0, .ψ 1]) (by decide) - rw [hc] - refine IsInvariant.smul (fun Λ => ?_) _ - simp only [termOfList, Fin.isValue, List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, - mul_one, rep_mul, rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum, SpecialLinearGroup.coe_inv, - adjugate_fin_two, of_apply, cons_val', cons_val_fin_one, cons_val_zero, Fin.sum_univ_two, - cons_val_one, mul_add, Algebra.mul_smul_comm, add_mul, Algebra.smul_mul_assoc, - toEFTLagrangianExclDeriv_mul_self, smul_zero, - toEFTLagrangianExclDeriv_mul_anti_commute (.ψ 1) (.ψ 0), neg_mul, smul_neg, ← neg_smul, neg_neg, - zero_add, smul_smul, add_zero, ← add_smul] - trans Λ.1.det • ([.ψ 0]ₑ * [.ψ 1]ₑ) - · simp only [Matrix.det_fin_two] - ring_nf - · simp - -@[simp] -lemma coeff_ψ_ψ_isInvariant {V : EFTLagrangianExclDeriv} (a b : Fin 2) : - IsInvariant (coeff {.ψ a, .ψ b} V) := by - match a, b with - | 0, 0 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp - | 1, 1 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp - | 0, 1 => exact coeff_ψ_zero_ψ_one_isInvariant - | 1, 0 => convert coeff_ψ_zero_ψ_one_isInvariant using 3; decide - -lemma coeff_barψ_zero_barψ_one_isInvariant {V : EFTLagrangianExclDeriv} : - IsInvariant (coeff {.barψ 0, .barψ 1} V) := by - obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := {.barψ 0, .barψ 1}) (l := [.barψ 0, .barψ 1]) - (by decide) - rw [hc] - refine IsInvariant.smul (fun Λ => ?_) _ - simp only [termOfList, Fin.isValue, List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, - mul_one, rep_mul, rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum, SpecialLinearGroup.coe_inv, - adjugate_fin_two, of_apply, cons_val', cons_val_fin_one, cons_val_zero, RCLike.star_def, - Fin.sum_univ_two, cons_val_one, mul_add, Algebra.mul_smul_comm, add_mul, Algebra.smul_mul_assoc, - toEFTLagrangianExclDeriv_mul_self, smul_zero, - toEFTLagrangianExclDeriv_mul_anti_commute (.barψ 1) (.barψ 0), neg_mul, smul_neg, ← neg_smul, - ← map_neg, neg_neg, zero_add, smul_smul, ← map_mul, add_zero, ← add_smul, ← map_add] - trans (starRingEnd ℂ) Λ.1.det • ([.barψ 0]ₑ * [.barψ 1]ₑ) - · simp only [Matrix.det_fin_two] - ring_nf - · simp - -@[simp] -lemma coeff_barψ_barψ_isInvariant {V : EFTLagrangianExclDeriv} (a b : Fin 2) : - IsInvariant (coeff {.barψ a, .barψ b} V) := by - match a, b with - | 0, 0 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp - | 1, 1 => rw [coeff_fermionic_selection_rule _ (by decide)]; simp - | 0, 1 => exact coeff_barψ_zero_barψ_one_isInvariant - | 1, 0 => convert coeff_barψ_zero_barψ_one_isInvariant using 3; decide - -lemma coeff_quartic_isInvariant {V : EFTLagrangianExclDeriv} : - IsInvariant (coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1} V) := by - obtain ⟨c', hc⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) - (l := [.ψ 0, .ψ 1, .barψ 0, .barψ 1]) (by decide) - rw [hc] - refine IsInvariant.smul (fun Λ => ?_) _ - simp only [termOfList, Fin.isValue, List.map_cons, List.map_nil, List.prod_cons, List.prod_nil, - mul_one, rep_mul, rep_apply_toEFTLagrangianExclDeriv_barψ_eq_sum, SpecialLinearGroup.coe_inv, - adjugate_fin_two, of_apply, cons_val', cons_val_fin_one, cons_val_zero, RCLike.star_def, - Fin.sum_univ_two, cons_val_one, mul_add, Algebra.mul_smul_comm, add_mul, Algebra.smul_mul_assoc, - toEFTLagrangianExclDeriv_mul_self, smul_zero, - toEFTLagrangianExclDeriv_mul_anti_commute (.barψ 1) (.barψ 0), neg_mul, smul_neg, ← neg_smul, - ← map_neg, neg_neg, zero_add, smul_smul, ← map_mul, add_zero, ← add_smul, ← map_add] - trans (starRingEnd ℂ) Λ.1.det • ((rep Λ) [ψ 0]ₑ * ((rep Λ) [ψ 1]ₑ * ([barψ 0]ₑ * [barψ 1]ₑ))) - · simp only [Matrix.det_fin_two] - ring_nf - simp only [SpecialLinearGroup.det_coe, map_one, Fin.isValue, - rep_apply_toEFTLagrangianExclDeriv_ψ_eq_sum, SpecialLinearGroup.coe_inv, adjugate_fin_two, - of_apply, cons_val', cons_val_fin_one, cons_val_zero, Fin.sum_univ_two, cons_val_one, - ← mul_assoc, add_mul, Algebra.smul_mul_assoc, mul_add, Algebra.mul_smul_comm, - toEFTLagrangianExclDeriv_mul_self, smul_zero, - toEFTLagrangianExclDeriv_mul_anti_commute (.ψ 1) (.ψ 0), neg_mul, smul_neg, ← neg_smul, neg_neg, - zero_add, smul_smul, add_zero, ← add_smul, mul_neg, one_mul] - trans Λ.1.det • ([ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ) - · simp only [Matrix.det_fin_two] - ring_nf - · simp - -/-- The support of an effective potential: the set of multisets of field specifications - for which the corresponding coefficient is non-zero. -/ -def support (V : EFTLagrangianExclDeriv) : Finset (Multiset FieldSpecification) := - Set.Finite.toFinset (s := {s | coeff s V ≠ 0}) <| by - induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy - a x _ hx - · simp only [Set.mem_range] at hV' - obtain ⟨l, rfl⟩ := hV' - refine (Set.finite_singleton (Multiset.ofList l)).subset ?_ - intro s hs - simp at hs - rw [coeff_apply_termOfList] at hs - rw [Set.mem_singleton_iff] - by_contra hne - exact hs (if_neg fun h => hne h.symm) - · refine Set.finite_empty.subset ?_ - intro s hs - simp at hs - · refine (hx.union hy).subset ?_ - intro s hs - simp at hs - grind - · refine hx.subset ?_ - intro s hs - simp at hs - grind - -@[simp] -lemma support_zero_eq_empty : support (0 : EFTLagrangianExclDeriv) = ∅ := by - simp [support] - -lemma mem_support_iff {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} : - s ∈ support V ↔ coeff s V ≠ 0 := by simp [support] - -lemma coeff_eq_zero_of_not_mem_support {V : EFTLagrangianExclDeriv} - {s : Multiset FieldSpecification} (h : s ∉ support V) : coeff s V = 0 := by - simpa [support, Set.Finite.mem_toFinset] using h - -lemma support_add {V W : EFTLagrangianExclDeriv} : - support (V + W) ⊆ support V ∪ support W := by - simp [support] - grind - -lemma support_sub {V W : EFTLagrangianExclDeriv} : - support (V - W) ⊆ support V ∪ support W := by - simp [support] - grind - -lemma support_one : support 1 = {{}} := by - simp [support, coeff_one] - rfl - -lemma support_smul {V : EFTLagrangianExclDeriv} (c : ℂ) : - support (c • V) ⊆ support V := by - simp [support] - -lemma support_smul_neq_zero {V : EFTLagrangianExclDeriv} (c : ℂ) (hc : c ≠ 0) : - support (c • V) = support V := by - simp [support, hc] - -lemma mem_support_termOfList_iff {l : List FieldSpecification} (s : Multiset FieldSpecification): - s ∈ support (termOfList l) ↔ s = Multiset.ofList l ∧ termOfList l ≠ 0 := by - simp [support, coeff_apply_termOfList] - grind - -lemma support_termOfList_subset (l : List FieldSpecification) : - support (termOfList l) ⊆ {Multiset.ofList l} := by - intro s hs - simp [mem_support_termOfList_iff] at hs - simp [hs.1] - -lemma eq_sum_support_coeff (V : EFTLagrangianExclDeriv) : V = ∑ s ∈ support V, coeff s V := by - induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy - a x _ hx - · simp only [Set.mem_range] at hV' - obtain ⟨l, rfl⟩ := hV' - trans ∑ s ∈ {Multiset.ofList l}, coeff s (termOfList l); swap - · symm - apply Finset.sum_subset (support_termOfList_subset l) - simp - intro hl - simp [mem_support_termOfList_iff] at hl - rw [hl] - simp - · simp [coeff_apply_termOfList] - · simp - · trans ∑ s ∈ x.support ∪ y.support, coeff s (x + y); swap - · symm - apply Finset.sum_subset - · simp [support_add] - · intro s hs hs' - exact coeff_eq_zero_of_not_mem_support hs' - · conv_lhs => rw [hx, hy] - simp [Finset.sum_add_distrib] - congr 1 - · apply Finset.sum_subset - · simp - · intro s hs hs' - exact coeff_eq_zero_of_not_mem_support hs' - · apply Finset.sum_subset - · simp - · intro s hs hs' - exact coeff_eq_zero_of_not_mem_support hs' - · trans ∑ s ∈ (support x).image (fun s => s), coeff s (a • x); swap - · symm - apply Finset.sum_subset - · simp [support_smul] - · intro s hs hs' - exact coeff_eq_zero_of_not_mem_support hs' - conv_lhs => rw [hx] - simp [Finset.smul_sum] - -lemma nodup_of_mem_support {V : EFTLagrangianExclDeriv} {s : Multiset FieldSpecification} - (hs : s ∈ support V) : s.Nodup := by - simp [support, Set.Finite.mem_toFinset] at hs - by_contra h - exact hs (coeff_fermionic_selection_rule (V := V) s h) - -/-- For a purely fermionic theory, no fermion can appear twice in the same term, - so the support is a subset of those multisets which are actually finite sets. - This does not hold in a bosonic theory. -/ -lemma support_subset_finset_univ {V : EFTLagrangianExclDeriv} : - support V ⊆ (Finset.univ : Finset (Finset FieldSpecification)).image fun V => V.val := by - intro s hs - simp only [Finset.mem_image, Finset.mem_univ, true_and] - exact ⟨Finset.mk s (nodup_of_mem_support hs), rfl⟩ - -/-- Regrouping the decomposition `eq_sum_support_coeff` along a classifying map `key` - on field contents: if `fiber k` is the finset of field contents with `key s = k`, - then an effective potential is the sum of its projections onto the fibers of the - keys appearing in its support. Specialised to irrep content in `eq_sum_irrepCoeff` - and to mass dimension in `eq_sum_massDimCoeff`. -/ -lemma eq_sum_fiber_coeff {κ : Type*} [DecidableEq κ] {key : Multiset FieldSpecification → κ} - {fiber : κ → Finset (Multiset FieldSpecification)} - (hmem : ∀ k s, s ∈ fiber k ↔ key s = k) (V : EFTLagrangianExclDeriv) : - V = ∑ k ∈ (support V).image key, ∑ s ∈ fiber k, coeff s V := by - have hdisj : (((support V).image key : Finset κ) : Set κ).PairwiseDisjoint fiber := by - intro i _ j _ hij - simp only [Function.onFun, Finset.disjoint_left] - intro s hsi hsj - exact hij (((hmem i s).mp hsi).symm.trans ((hmem j s).mp hsj)) - rw [← Finset.sum_biUnion hdisj] - conv_lhs => rw [eq_sum_support_coeff V] - refine Finset.sum_subset (fun s hs => ?_) (fun s _ hs => coeff_eq_zero_of_not_mem_support hs) - exact Finset.mem_biUnion.mpr ⟨key s, Finset.mem_image_of_mem _ hs, (hmem _ s).mpr rfl⟩ - -/-! - -## Mixing of operators under the action of the Lorentz group - --/ - -/-- Under the action of `g` an operator with field content specified by `s` mixes - into operators with field content given by this Finset. -/ -def repSupport (s : Multiset FieldSpecification) (g : SL(2, ℂ)) : - Finset (Multiset FieldSpecification) := - support (rep g (termOfList (Multiset.toList s))) - -lemma repSupport_eq_termOfList {s : Multiset FieldSpecification} (g : SL(2, ℂ)) - (l : List FieldSpecification) (hl : Multiset.ofList l = s) : - repSupport s g = support (rep g (termOfList l)) := by - simp [repSupport] - obtain ⟨c, h1, hc⟩ := termOfList_perm_neq_zero (l1 := Multiset.toList s) (l2 := l) - (by apply Multiset.coe_eq_coe.mp; simp [hl]) - simp [h1] - apply support_smul_neq_zero - grind - -lemma repSupport_subset_self_of_singleton_subset_self {s : Multiset FieldSpecification} - (g : SL(2, ℂ)) (h : ∀ ψ : FieldSpecification, repSupport {ψ} g ⊆ {{ψ}}) : - repSupport s g ⊆ {s} := by - have hsingle : ∀ ψ : FieldSpecification, ∃ c : ℂ, - rep g (termOfList [ψ]) = c • termOfList [ψ] := by - intro ψ - have hsup := h ψ - rw [repSupport_eq_termOfList g [ψ] (by simp)] at hsup - rcases Finset.subset_singleton_iff.mp hsup with h0 | h1 - · refine ⟨0, ?_⟩ - rw [eq_sum_support_coeff (rep g (termOfList [ψ])), h0] - simp - · obtain ⟨c, hc⟩ := coeff_eq_termOfList (s := {ψ}) (rep g (termOfList [ψ])) - (l := [ψ]) (by simp) - refine ⟨c, ?_⟩ - rw [eq_sum_support_coeff (rep g (termOfList [ψ])), h1, Finset.sum_singleton, hc] - have hlist : ∀ l : List FieldSpecification, ∃ c : ℂ, - rep g (termOfList l) = c • termOfList l := by - intro l - induction l with - | nil => exact ⟨1, by simp⟩ - | cons a l ih => - obtain ⟨c, hc⟩ := ih - obtain ⟨ca, hca⟩ := hsingle a - refine ⟨ca * c, ?_⟩ - rw [show a :: l = [a] ++ l from rfl, termOfList_append, rep_mul, hca, hc, - smul_mul_smul_comm] - obtain ⟨c, hc⟩ := hlist s.toList - intro t ht - rw [repSupport, hc] at ht - have ht' := support_smul c ht - rw [mem_support_termOfList_iff] at ht' - simpa using ht'.1 - - -/-! - - -## Coefficents of irrep terms - - --/ - -/-- The field content of a term which corresponds to a given irrep content. -/ -def allTermsWithIrrepContent (i : Multiset Irrep) : Finset (Multiset FieldSpecification) := - (multisetsOfCard FieldSpecification i.card).filter (fun s => Multiset.map toIrrep s = i) - -lemma mem_allTermsWithIrrepContent_iff (i : Multiset Irrep) (s : Multiset FieldSpecification) : - s ∈ allTermsWithIrrepContent i ↔ Multiset.map toIrrep s = i := by - simp only [allTermsWithIrrepContent, Finset.mem_filter, mem_multisetsOfCard, - and_iff_right_iff_imp] - intro h - rw [← h, Multiset.card_map] - -/-- The projection of a term of `EFTLagrangianExclDeriv` onto those operators which - have an irrep content determined by `i`. -/ -def irrepCoeff (i : Multiset Irrep) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := - ∑ s ∈ allTermsWithIrrepContent i, coeff s - -lemma irrepCoeff_eq_sum (i : Multiset Irrep) (V : EFTLagrangianExclDeriv) : - irrepCoeff i V = ∑ s ∈ allTermsWithIrrepContent i, coeff s V := by - simp [irrepCoeff] - -lemma irrepCoeff_one (i : Multiset Irrep) : irrepCoeff i 1 = if i = ∅ then 1 else 0 := by - rw [irrepCoeff_eq_sum] - simp only [coeff_one] - rw [Finset.sum_ite_eq'] - refine if_congr ?_ rfl rfl - rw [mem_allTermsWithIrrepContent_iff] - simp [eq_comm] - -lemma irrepCoeff_termOfList (i : Multiset Irrep) (l : List FieldSpecification) : - irrepCoeff i (termOfList l) = if Multiset.map toIrrep (Multiset.ofList l) = i then - termOfList l else 0 := by - simp [irrepCoeff, coeff_apply_termOfList, mem_allTermsWithIrrepContent_iff] - -/-- The irrep contents of the operators appearing in an effective potential. -/ -def irrepSupport (V : EFTLagrangianExclDeriv) : Finset (Multiset Irrep) := - (support V).image (Multiset.map toIrrep) - -lemma mem_irrepSupport_iff (V : EFTLagrangianExclDeriv) (i : Multiset Irrep) : - i ∈ irrepSupport V ↔ irrepCoeff i V ≠ 0 := by - simp [irrepSupport, Finset.mem_image] - constructor - · rintro ⟨s, hs, hsi⟩ - simp [irrepCoeff_eq_sum, coeff_sum_eq_zero_iff] - refine ⟨s, ?_⟩ - simp [mem_allTermsWithIrrepContent_iff, hsi] - exact mem_support_iff.mp hs - · intro h - simp [irrepCoeff_eq_sum, coeff_sum_eq_zero_iff] at h - obtain ⟨s, hs, hsi⟩ := h - use s - simp [mem_allTermsWithIrrepContent_iff] at hs - simp [mem_support_iff, hsi, hs] - -lemma irrepSupport_subset (V : EFTLagrangianExclDeriv) : - irrepSupport V ⊆ {{}, {.ψ}, {.barψ}, {.ψ, .ψ}, {.barψ, .barψ}, {.ψ, .barψ}, - {.ψ, .barψ, .barψ}, {.ψ, .ψ, .barψ}, {.ψ, .ψ, .barψ, .barψ}} := by - trans ((Finset.univ : Finset (Finset FieldSpecification)).image fun V => - V.val).image (Multiset.map toIrrep) - · rw [irrepSupport] - exact Finset.image_subset_image support_subset_finset_univ - · apply Finset.subset_of_eq - decide - -lemma eq_sum_irrepCoeff (V : EFTLagrangianExclDeriv) : - V = ∑ i ∈ irrepSupport V, irrepCoeff i V := by - simp only [irrepSupport, irrepCoeff_eq_sum] - exact eq_sum_fiber_coeff mem_allTermsWithIrrepContent_iff V - -lemma eq_sum_irrepCoeff_subset {V : EFTLagrangianExclDeriv} {S : Finset (Multiset Irrep)} - (hS : irrepSupport V ⊆ S) : V = ∑ i ∈ S, irrepCoeff i V := by - conv_lhs => rw [eq_sum_irrepCoeff V] - apply Finset.sum_subset hS - intro s hs hsi - simpa [mem_irrepSupport_iff] using hsi - -lemma irrepCoeff_rep_termOfList (i : Multiset Irrep) (g : SL(2, ℂ)) - (l : List FieldSpecification) : - rep g (irrepCoeff i (termOfList l)) = irrepCoeff i (rep g (termOfList l)) := by - obtain ⟨n, F, ⟨f, hf⟩, hF⟩ := rep_termOfList_eq_sum_of_toIrrep g l - have hcond : ∀ x, Multiset.map toIrrep (Multiset.ofList (F x)) = - Multiset.map toIrrep (Multiset.ofList l) := by - intro x - rw [Multiset.map_coe, Multiset.map_coe, hF x] - rw [irrepCoeff_termOfList, hf, map_sum] - -- Rewriting with `hcond` transports every summand's irrep-content condition into the - -- outer one, so that `split_ifs` sees a single condition and produces two goals. - simp only [map_smul, irrepCoeff_termOfList, hcond] - split_ifs with h - · exact hf - · simp - -lemma irrepCoeff_rep_apply_fieldSpecification {i : Multiset Irrep} (g : SL(2, ℂ)) - (ψ : FieldSpecification) : - rep g (irrepCoeff i [ψ]ₑ) = irrepCoeff i (rep g [ψ]ₑ) := by - rw [← termOfList_singleton] - exact irrepCoeff_rep_termOfList i g [ψ] - -lemma irrepCoeff_rep {i : Multiset Irrep} {V : EFTLagrangianExclDeriv} (g : SL(2, ℂ)) : - rep g (irrepCoeff i V) = irrepCoeff i (rep g V) := by - induction' mem_termOfList_span V using Submodule.span_induction with V' hV' x y _ _ hx hy - a x _ hx - · simp only [Set.mem_range] at hV' - obtain ⟨l, rfl⟩ := hV' - exact irrepCoeff_rep_termOfList i g l - · simp - · simp [hx, hy] - · simp [hx] - -/-- There is no Lorentz-invariant operator with irrep content `{ψ, barψ}`: - invariance under the diagonal transformation `diagSL twoI` forces every - coefficient of a mixed `ψ`–`barψ` pair to vanish. -/ -lemma irrepCoeff_ψ_barψ_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) : - irrepCoeff {Irrep.ψ, Irrep.barψ} V = 0 := by - rw [irrepCoeff_eq_sum, Finset.sum_congr (g := fun s => coeff s V) - (s₂ := {{ψ 0, barψ 0}, {ψ 0, barψ 1}, {ψ 1, barψ 0}, {ψ 1, barψ 1}}) (by decide) (by simp)] - repeat rw [Finset.sum_insert (by decide)] - simp only [coeff_ψ_barψ_selection_rule hV, Finset.sum_singleton, add_zero] - -lemma irrepCoeff_odd_eq_zero_of_isInvariant {V : EFTLagrangianExclDeriv} - (hV : IsInvariant V) (s : Multiset Irrep) (hs : Odd s.card) : irrepCoeff s V = 0 := by - simp [irrepCoeff_eq_sum] - refine Finset.sum_eq_zero ?_ - intro s' hs' - simp [mem_allTermsWithIrrepContent_iff] at hs' - subst hs' - apply coeff_odd_selection_rule hV s' - simpa using hs - -lemma eq_sum_irrepCoeff_of_isInvariant {V : EFTLagrangianExclDeriv} (hV : IsInvariant V) : - V = irrepCoeff {} V + irrepCoeff {Irrep.ψ, Irrep.ψ} V + - irrepCoeff {Irrep.barψ, Irrep.barψ} V + - irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V := by - nth_rewrite 1 [eq_sum_irrepCoeff_subset (irrepSupport_subset V)] - simp +decide [Finset.sum_insert, Finset.sum_singleton, -Multiset.insert_eq_cons, - irrepCoeff_odd_eq_zero_of_isInvariant hV, irrepCoeff_ψ_barψ_eq_zero_of_isInvariant hV] - abel - -/-- Only the terms whose field content is `Nodup` survive in `irrepCoeff i`, since a - repeated fermionic field forces the coefficient to vanish (`coeff_fermionic_selection_rule`). - Hence if exactly one such term `s` exists, `irrepCoeff i` is just `coeff s`. -/ -lemma irrepCoeff_eq_coeff_of_filter_nodup {i : Multiset Irrep} {s : Multiset FieldSpecification} - (h : (allTermsWithIrrepContent i).filter (·.Nodup) = {s}) (V : EFTLagrangianExclDeriv) : - irrepCoeff i V = coeff s V := by - rw [irrepCoeff_eq_sum, ← Finset.sum_filter_of_ne - (fun t _ ht => by by_contra hn; exact ht (coeff_fermionic_selection_rule t hn)), - h, Finset.sum_singleton] - -lemma irrepCoeff_empty_eq {V : EFTLagrangianExclDeriv} : - irrepCoeff 0 V = coeff 0 V := - irrepCoeff_eq_coeff_of_filter_nodup (by decide) V - -lemma irrepCoeff_ψ_ψ_eq {V : EFTLagrangianExclDeriv} : - irrepCoeff {Irrep.ψ, Irrep.ψ} V = coeff {.ψ 0, .ψ 1} V := - irrepCoeff_eq_coeff_of_filter_nodup (by decide) V - -lemma irrepCoeff_barψ_barψ_eq {V : EFTLagrangianExclDeriv} : - irrepCoeff {Irrep.barψ, Irrep.barψ} V = coeff {.barψ 0, .barψ 1} V := - irrepCoeff_eq_coeff_of_filter_nodup (by decide) V - -lemma irrepCoeff_quartic_eq {V : EFTLagrangianExclDeriv} : - irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V = - coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1} V := - irrepCoeff_eq_coeff_of_filter_nodup (by set_option maxRecDepth 4000 in decide) V - -lemma irrepCoeff_empty_isInvariant {V : EFTLagrangianExclDeriv} : - IsInvariant (irrepCoeff 0 V) := by - rw [irrepCoeff_empty_eq] - exact coeff_empty_isInvariant - -lemma irrepCoeff_ψ_ψ_isInvariant {V : EFTLagrangianExclDeriv} : - IsInvariant (irrepCoeff {Irrep.ψ, Irrep.ψ} V) := by - rw [irrepCoeff_ψ_ψ_eq] - exact coeff_ψ_ψ_isInvariant _ _ - -lemma irrepCoeff_barψ_barψ_isInvariant {V : EFTLagrangianExclDeriv} : - IsInvariant (irrepCoeff {Irrep.barψ, Irrep.barψ} V) := by - rw [irrepCoeff_barψ_barψ_eq] - exact coeff_barψ_barψ_isInvariant _ _ - -lemma irrepCoeff_quadratic_isInvariant {V : EFTLagrangianExclDeriv} : - IsInvariant (irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V) := by - rw [irrepCoeff_quartic_eq] - exact coeff_quartic_isInvariant - -lemma isInvariant_iff_eq_sum_irrepCoeff {V : EFTLagrangianExclDeriv} : - IsInvariant V ↔ V = irrepCoeff 0 V + irrepCoeff {Irrep.ψ, Irrep.ψ} V + - irrepCoeff {Irrep.barψ, Irrep.barψ} V + - irrepCoeff {Irrep.ψ, Irrep.ψ, Irrep.barψ, Irrep.barψ} V := by - constructor - · intro hV - exact eq_sum_irrepCoeff_of_isInvariant hV - · intro h - rw [h] - apply IsInvariant.add _ irrepCoeff_quadratic_isInvariant - apply IsInvariant.add _ irrepCoeff_barψ_barψ_isInvariant - apply IsInvariant.add irrepCoeff_empty_isInvariant irrepCoeff_ψ_ψ_isInvariant - -lemma isInvariant_iff_eq_sum_coeff {V : EFTLagrangianExclDeriv} : - IsInvariant V ↔ V = coeff 0 V + coeff {.ψ 0, .ψ 1} V + - coeff {.barψ 0, .barψ 1} V + coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1} V := by - rw [isInvariant_iff_eq_sum_irrepCoeff, irrepCoeff_empty_eq, irrepCoeff_ψ_ψ_eq, - irrepCoeff_barψ_barψ_eq, irrepCoeff_quartic_eq] - -lemma isInvariant_iff_eq_exists {V : EFTLagrangianExclDeriv} : - IsInvariant V ↔ - ∃ c : ℂ, ∃ m0 : ℂ, ∃ m1 : ℂ, ∃ ρ : ℂ, V = c • 1 + m0 • ([ψ 0]ₑ * [ψ 1]ₑ) + - m1 • ([barψ 0]ₑ * [barψ 1]ₑ) + ρ • ([ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ):= by - rw [isInvariant_iff_eq_sum_coeff] - obtain ⟨c, hc⟩ := coeff_eq_termOfList V (s := 0) (l := []) (by decide) - obtain ⟨m0, hm0⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1}) (l := [.ψ 0, .ψ 1]) (by decide) - obtain ⟨m1, hm1⟩ := coeff_eq_termOfList V (s := {.barψ 0, .barψ 1}) - (l := [.barψ 0, .barψ 1]) (by decide) - obtain ⟨ρ, hρ⟩ := coeff_eq_termOfList V (s := {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) - (l := [.ψ 0, .ψ 1, .barψ 0, .barψ 1]) (by decide) - rw [hc, hm0, hm1, hρ] - simp [termOfList] - constructor - · intro h - use c, m0, m1, ρ - rw [h] - grind - · rintro ⟨c', m0', m1', ρ', hV⟩ - simp [← mul_assoc] - rw [show [ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ = - termOfList [.ψ 0, .ψ 1, .barψ 0, .barψ 1] by simp [termOfList]; grind, - show [ψ 0]ₑ * [ψ 1]ₑ = termOfList [.ψ 0, .ψ 1] by simp [termOfList], - show [barψ 0]ₑ * [barψ 1]ₑ = termOfList [.barψ 0, .barψ 1] by simp [termOfList]] at hV ⊢ - rw [hV] at hm0 hρ hm1 hc - simp +decide only [Fin.isValue, map_add, map_smul, coeff_one, ↓reduceIte, smul_zero, - coeff_apply_termOfList, add_zero, termOfList_nil, ne_eq, one_ne_zero, not_false_eq_true, - smul_left_inj] at hm0 hρ hm1 hc - simp_all - -/-! - -## Mass dimension - --/ - -/-- The finset of all possible field contents of terms with overall mass dimension `n`. - Since every field has mass dimension at least `3 / 2`, a term of mass dimension `n` - contains a bounded number of fields, so this is a computable finset (constructed - through `multisetsOfMassDim`). The defining property is - `mem_allTermsWithMassDimension_iff`. -/ -def allTermsWithMassDimension (n : ℚ) : Finset (Multiset FieldSpecification) := - multisetsOfMassDim massDimension n - -lemma mem_allTermsWithMassDimension_iff (n : ℚ) (s : Multiset FieldSpecification) : - s ∈ allTermsWithMassDimension n ↔ (s.map massDimension).sum = n := - mem_multisetsOfMassDim_iff massDimension_pos - -/-- Clearing denominators: the terms of mass dimension `n` are those whose scaled - (`ℕ`-valued) mass dimensions sum to `2 * n`. The right-hand side reduces in the - kernel, so after rewriting by this lemma membership can be decided by `decide`. -/ -lemma allTermsWithMassDimension_eq_natCast {n : ℚ} {mN : ℕ} (hm : (mN : ℚ) = n * 2) : - allTermsWithMassDimension n = multisetsOfMassDimNat massDimensionNat mN := - multisetsOfMassDim_eq_natCast massDimension_pos (by norm_num) massDimensionNat_cast hm - -example : ({ψ 0, ψ 1} : Multiset FieldSpecification) ∈ allTermsWithMassDimension 3 := by - rw [allTermsWithMassDimension_eq_natCast (mN := 6) (by norm_num)] - decide - -example : ({ψ 0, ψ 1, barψ 0, barψ 1} : Multiset FieldSpecification) ∉ - allTermsWithMassDimension 3 := by - rw [allTermsWithMassDimension_eq_natCast (mN := 6) (by norm_num)] - decide - -/-- The projection of a term of `EFTLagrangianExclDeriv` onto those operators whose - field content has overall mass dimension `n`. -/ -def massDimCoeff (n : ℚ) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := - ∑ s ∈ allTermsWithMassDimension n, coeff s - -lemma massDimCoeff_eq_sum (n : ℚ) (V : EFTLagrangianExclDeriv) : - massDimCoeff n V = ∑ s ∈ allTermsWithMassDimension n, coeff s V := by - simp [massDimCoeff] - -lemma massDimCoeff_termOfList (n : ℚ) (l : List FieldSpecification) : - massDimCoeff n (termOfList l) = - if (Multiset.map massDimension (Multiset.ofList l)).sum = n then termOfList l else 0 := by - simp [massDimCoeff_eq_sum, coeff_apply_termOfList, mem_allTermsWithMassDimension_iff] - -lemma massDimCoeff_termOfList_ofNat (n : ℕ) (l : List FieldSpecification) : - massDimCoeff (n) (termOfList l) = - if (Multiset.map massDimensionNat (Multiset.ofList l)).sum = 2 * n then termOfList l else 0 := by - rw [massDimCoeff_termOfList] - simp - congr 1 - field_simp - simp - constructor - · intro h - exact_mod_cast h - · intro h - exact_mod_cast h - -lemma massDimCoeff_one (n : ℚ) : massDimCoeff n 1 = if n = 0 then 1 else 0 := by - rw [massDimCoeff_eq_sum] - simp only [coeff_one] - rw [Finset.sum_ite_eq'] - refine if_congr ?_ rfl rfl - rw [mem_allTermsWithMassDimension_iff] - simp [eq_comm] - -/-- The mass dimensions of the operators appearing in an effective potential. -/ -def massDimSupport (V : EFTLagrangianExclDeriv) : Finset ℚ := - (support V).image (fun s => (s.map massDimension).sum) - -lemma massDimSupport_add {V W : EFTLagrangianExclDeriv} : - massDimSupport (V + W) ⊆ massDimSupport V ∪ massDimSupport W := by - simp [massDimSupport, ← Finset.image_union] - apply Finset.image_subset_image - exact support_add - -lemma massDimSupport_sub {V W : EFTLagrangianExclDeriv} : - massDimSupport (V - W) ⊆ massDimSupport V ∪ massDimSupport W := by - simp [massDimSupport, ← Finset.image_union] - apply Finset.image_subset_image - exact support_sub - -lemma massDimSupport_one : massDimSupport 1 = {0} := by - simp [support_one, massDimSupport] - -lemma massDimSupport_smul {c : ℂ} {V : EFTLagrangianExclDeriv} : - massDimSupport (c • V) ⊆ massDimSupport V := by - simp [massDimSupport, ] - apply Finset.image_subset_image - exact support_smul c - -lemma massDimSupport_termOfList (l : List FieldSpecification) : - massDimSupport (termOfList l) ⊆ {(Multiset.map massDimension (Multiset.ofList l)).sum} := by - trans ({Multiset.ofList l} : Finset (Multiset FieldSpecification)).image - (fun s => (s.map massDimension).sum) - · apply Finset.image_subset_image - exact support_termOfList_subset l - · simp - -lemma eq_sum_massDimCoeff (V : EFTLagrangianExclDeriv) : - V = ∑ n ∈ massDimSupport V, massDimCoeff n V := by - simp only [massDimSupport, massDimCoeff_eq_sum] - exact eq_sum_fiber_coeff mem_allTermsWithMassDimension_iff V - -def HasMassDimLE (n : ℚ) (V : EFTLagrangianExclDeriv): Prop := - ∀ s ∈ massDimSupport V, s ≤ n - -lemma HasMassDimLE.add {n : ℚ} {V W : EFTLagrangianExclDeriv} (hV : HasMassDimLE n V) - (hW : HasMassDimLE n W) : HasMassDimLE n (V + W) := by - intro s hs - have h1 := massDimSupport_add hs - simp at h1 - rcases h1 with h1 | h1 - · exact hV s h1 - · exact hW s h1 - -lemma HasMassDimLE.sub {n : ℚ} {V W : EFTLagrangianExclDeriv} (hV : HasMassDimLE n V) - (hW : HasMassDimLE n W) : HasMassDimLE n (V - W) := by - intro s hs - have h1 := massDimSupport_sub hs - simp at h1 - rcases h1 with h1 | h1 - · exact hV s h1 - · exact hW s h1 - -lemma HasMassDimLE.smul {n : ℚ} {c : ℂ} {V : EFTLagrangianExclDeriv} (hV : HasMassDimLE n V) : - HasMassDimLE n (c • V) := by - intro s hs - have h1 := massDimSupport_smul hs - exact hV s h1 - -lemma HasMassDimLE.one {n : ℚ} (hn : 0 ≤ n): HasMassDimLE n 1 := by - simp [HasMassDimLE, massDimSupport_one] - exact hn - -lemma HasMassDimLE.termOfList {n : ℚ} {l : List FieldSpecification} - (hl : (Multiset.map massDimension (Multiset.ofList l)).sum ≤ n) : - HasMassDimLE n (termOfList l) := by - intro s hs - have hs' := massDimSupport_termOfList l hs - simp_all - -/-- Off the mass-dimension support the projection vanishes: if no operator of `V` has - mass dimension `q`, then `massDimCoeff q V = 0`. -/ -lemma massDimCoeff_eq_zero_of_not_mem_massDimSupport {q : ℚ} {V : EFTLagrangianExclDeriv} - (h : q ∉ massDimSupport V) : massDimCoeff q V = 0 := by - rw [massDimCoeff_eq_sum] - refine Finset.sum_eq_zero fun s hs => ?_ - rw [mem_allTermsWithMassDimension_iff] at hs - refine coeff_eq_zero_of_not_mem_support fun hsupp => h ?_ - rw [massDimSupport] - exact Finset.mem_image.mpr ⟨s, hsupp, hs⟩ - -lemma eq_sum_of_hasMassDimLE {n : ℕ} {V : EFTLagrangianExclDeriv} (h : HasMassDimLE n V) : - V = ∑ m ∈ Finset.range (2 * n + 1), massDimCoeff (m / (2 : ℚ)) V := by - have hinj : ∀ x ∈ Finset.range (2 * n + 1), ∀ y ∈ Finset.range (2 * n + 1), - (x / (2 : ℚ)) = (y / (2 : ℚ)) → x = y := by - intro x _ y _ hxy - exact_mod_cast (by linarith : (x : ℚ) = y) - have hreindex : (∑ m ∈ Finset.range (2 * n + 1), massDimCoeff (m / (2 : ℚ)) V) - = ∑ q ∈ (Finset.range (2 * n + 1)).image (fun m : ℕ => (m : ℚ) / 2), massDimCoeff q V := - (Finset.sum_image (f := fun q => massDimCoeff q V) hinj).symm - rw [hreindex] - conv_lhs => rw [eq_sum_massDimCoeff V] - refine Finset.sum_subset ?_ (fun q _ hq => massDimCoeff_eq_zero_of_not_mem_massDimSupport hq) - rw [massDimSupport, Finset.image_subset_iff] - intro s hs - have hle : (s.map massDimension).sum ≤ (n : ℚ) := - h _ (by rw [massDimSupport]; exact Finset.mem_image.mpr ⟨s, hs, rfl⟩) - rw [sum_map_massDimension] at hle - refine Finset.mem_image.mpr ⟨3 * s.card, Finset.mem_range.mpr ?_, ?_⟩ - · have h2 : (3 * s.card : ℚ) ≤ 2 * n := by linarith - have : 3 * s.card ≤ 2 * n := by exact_mod_cast h2 - omega - · rw [sum_map_massDimension]; push_cast; ring - -lemma massDimCoeff_eq_zero_of_hasMassDimLE {n : ℕ} {V : EFTLagrangianExclDeriv} - (h : HasMassDimLE n V) (m : ℚ) (hm : n < m) : - massDimCoeff m V = 0 := by - apply massDimCoeff_eq_zero_of_not_mem_massDimSupport - simp [HasMassDimLE] at h - by_contra hn - have hl := h m hn - grind - - -/-- Applying `coeff s` to a mass-dimension projection: it returns `coeff s V` when the field - content `s` has mass dimension `q`, and `0` otherwise (the other coefficients are orthogonal - to `coeff s`). -/ -lemma coeff_massDimCoeff (q : ℚ) (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv) : - coeff s (massDimCoeff q V) = if (s.map massDimension).sum = q then coeff s V else 0 := by - rw [massDimCoeff_eq_sum, map_sum] - split_ifs with h - · rw [Finset.sum_eq_single s (fun t _ htn => coeff_coeff_eq_zero_of_diff (Ne.symm htn) V) - (fun hns => absurd ((mem_allTermsWithMassDimension_iff q s).mpr h) hns)] - exact coeff_coeff_self V - · refine Finset.sum_eq_zero fun t ht => ?_ - rw [mem_allTermsWithMassDimension_iff] at ht - exact coeff_coeff_eq_zero_of_diff (by rintro rfl; exact h ht) V - -lemma hasMassDimLE_iff_eq_sum {n : ℕ} {V : EFTLagrangianExclDeriv} : - HasMassDimLE n V ↔ V = ∑ m ∈ Finset.range (2 * n + 1), massDimCoeff (m / (2 : ℚ)) V := by - refine ⟨eq_sum_of_hasMassDimLE, fun hV => ?_⟩ - intro q hq - rw [massDimSupport, Finset.mem_image] at hq - obtain ⟨s, hs, rfl⟩ := hq - rw [mem_support_iff] at hs - have hcoeff : coeff s V - = ∑ m ∈ Finset.range (2 * n + 1), - if (s.map massDimension).sum = (m : ℚ) / 2 then coeff s V else 0 := by - conv_lhs => rw [hV] - rw [map_sum] - simp_rw [coeff_massDimCoeff] - have hex : ∃ m ∈ Finset.range (2 * n + 1), (s.map massDimension).sum = (m : ℚ) / 2 := by - by_contra hcon - push Not at hcon - exact hs (by rw [hcoeff]; exact Finset.sum_eq_zero fun m hm => if_neg (hcon m hm)) - obtain ⟨m, hm, hqm⟩ := hex - rw [Finset.mem_range] at hm - rw [hqm] - have hmn : (m : ℚ) ≤ 2 * (n : ℚ) := by exact_mod_cast (show m ≤ 2 * n from by omega) - linarith - -/-! - -## Conjugation - --/ - -/-- The conjugate of a coefficient. -/ -def conjCoeffMap (s : Multiset FieldSpecification) (V : EFTLagrangianExclDeriv) : - EFTLagrangianExclDeriv := - let c := Classical.choose (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) - starRingEnd ℂ c • termOfList (s.toList.map conjugate).reverse - -lemma conjCoeffMap_of_eq_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) - (V : EFTLagrangianExclDeriv) (c : ℂ) (hl : Multiset.ofList l = s) - (h : coeff s V = c • termOfList l) : - conjCoeffMap s V = starRingEnd ℂ c • termOfList (l.map conjugate).reverse := by - obtain ⟨b, hb1, hb2⟩ := termOfList_perm_neq_zero (l1 := s.toList) (l2 := l) - (by subst hl; rw [← Multiset.coe_eq_coe ]; simp) - let c' := Classical.choose (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) - have hc' : coeff s V = c' • termOfList s.toList := - Classical.choose_spec (coeff_eq_termOfList V (s := s) (l := s.toList) (by simp)) - change starRingEnd ℂ c' • termOfList (s.toList.map conjugate).reverse = _ - rw [h] at hc' - have hx1 := termOfList_reverse_eq_of_eq (termOfList_conjugate_eq_of_eq hb1) - rw [hx1, smul_smul] - rw [hb1, smul_smul] at hc' - have hx2 : (c - c' * b) • termOfList l = 0 := by - simp [sub_smul, hc'] - simp at hx2 - rcases hx2 with (h0 | h1) - · congr - grind - · rw [termOfList_reverse_zero_of_zero (termOfList_conjugate_zero_of_zero h1)] - simp - -@[simp] -lemma conjCoeffMap_add (s : Multiset FieldSpecification) (V W : EFTLagrangianExclDeriv) : - conjCoeffMap s (V + W) = conjCoeffMap s V + conjCoeffMap s W := by - obtain ⟨l, c, hV, hl⟩ := coeff_eq_exists_termOfList s V - obtain ⟨d, hW⟩ := coeff_eq_termOfList W hl - have hVW : coeff s (V + W) = (c + d) • termOfList l := by - simp [hV, hW, add_smul] - rw [conjCoeffMap_of_eq_termOfList s l (V + W) (c + d) hl hVW, - conjCoeffMap_of_eq_termOfList s l V c hl hV, conjCoeffMap_of_eq_termOfList s l W d hl hW] - simp [add_smul] - -@[simp] -lemma conjCoeff_smul (s : Multiset FieldSpecification) (c : ℂ) (V : EFTLagrangianExclDeriv) : - conjCoeffMap s (c • V) = starRingEnd ℂ c • conjCoeffMap s V := by - obtain ⟨l, d, hV, hl⟩ := coeff_eq_exists_termOfList s V - have h : coeff s (c • V) = (c * d) • termOfList l := by - simp [hV, smul_smul] - rw [conjCoeffMap_of_eq_termOfList s l (c • V) (c * d) hl h, - conjCoeffMap_of_eq_termOfList s l V d hl hV] - simp [smul_smul] - -def conjCoeff (s : Multiset FieldSpecification) : EFTLagrangianExclDeriv →ₛₗ[starRingEnd ℂ] EFTLagrangianExclDeriv where - toFun := conjCoeffMap s - map_add' := conjCoeffMap_add s - map_smul' := conjCoeff_smul s - -lemma conjCoeff_of_eq_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) - (V : EFTLagrangianExclDeriv) (c : ℂ) (hl : Multiset.ofList l = s) - (h : coeff s V = c • termOfList l) : - conjCoeff s V = starRingEnd ℂ c • termOfList (l.map conjugate).reverse := by - simp [conjCoeff, conjCoeffMap_of_eq_termOfList s l V c hl h] - -/-- The conjugate coefficient vanishes on field contents outside the support, since there - the coefficient itself is zero. -/ -lemma conjCoeff_eq_zero_of_not_mem_support {s : Multiset FieldSpecification} - {V : EFTLagrangianExclDeriv} (h : s ∉ support V) : conjCoeff s V = 0 := by - rw [conjCoeff_of_eq_termOfList s s.toList V 0 (by simp) - (by simp [coeff_eq_zero_of_not_mem_support h])] - simp - -lemma conjCoeff_termOfList (s : Multiset FieldSpecification) (l : List FieldSpecification) : - conjCoeff s (termOfList l) = if Multiset.ofList l = s then - termOfList (l.map conjugate).reverse else 0 := by - split_ifs with h - · have h0 : coeff s (termOfList l) = (1 : ℂ) • termOfList l := by - simp [coeff_apply_termOfList, h] - rw [conjCoeff_of_eq_termOfList s l (termOfList l) 1 h h0] - simp - · apply conjCoeff_eq_zero_of_not_mem_support - simp [mem_support_termOfList_iff] - grind - -def conjugate : EFTLagrangianExclDeriv →ₛₗ[starRingEnd ℂ] EFTLagrangianExclDeriv where - toFun := fun V => ∑ s ∈ support V, conjCoeff s V - map_add' := by - intro V W - rw [Finset.sum_subset support_add - (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs), - Finset.sum_subset (Finset.subset_union_left (s₂ := support W)) - (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs), - Finset.sum_subset (Finset.subset_union_right (s₁ := support V)) - (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs)] - simp [map_add, Finset.sum_add_distrib] - map_smul' := by - intro c V - rw [Finset.sum_subset (support_smul c) - (fun s _ hs => conjCoeff_eq_zero_of_not_mem_support hs)] - simp [map_smulₛₗ, Finset.smul_sum] - -lemma conjugate_termOfList (l : List FieldSpecification) : - conjugate (termOfList l) = termOfList (l.map .conjugate).reverse := by - simp [conjugate, conjCoeff_termOfList, mem_support_termOfList_iff] - exact fun h => (termOfList_reverse_zero_of_zero (termOfList_conjugate_zero_of_zero h)).symm - -@[simp] -lemma conjugate_one : conjugate 1 = 1 := by - simp [← termOfList_nil, conjugate_termOfList] - -/-! - -## IsReal condition - --/ - -def IsReal (V : EFTLagrangianExclDeriv) : Prop := conjugate V = V - -/-- The lemma expressing the form of an element of `EFTLagrangianExclDeriv`, if it is both - invariant under the Lorentz group and is real. - - This expresses the EFT lagrangian in terms of the Majorana mass trem. -/ -lemma isInvariant_and_isReal_iff_eq_exists {V : EFTLagrangianExclDeriv} : - IsInvariant V ∧ IsReal V ↔ ∃ c : ℝ, ∃ m0 : ℂ, ∃ ρ : ℝ, V = (c : ℂ) • 1 + m0 • ([ψ 0]ₑ * [ψ 1]ₑ) - - starRingEnd ℂ m0 • ([barψ 0]ₑ * [barψ 1]ₑ) + - (ρ : ℂ) • ([ψ 0]ₑ * [ψ 1]ₑ * [barψ 0]ₑ * [barψ 1]ₑ) := by - have h_quartic : termOfList [ψ 1, ψ 0, barψ 1, barψ 0] = termOfList [ψ 0, ψ 1, barψ 0, barψ 1] := by - simp [termOfList, toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0) (barψ 1)] - simp [← mul_assoc, toEFTLagrangianExclDeriv_mul_anti_commute (ψ 0) (ψ 1)] - constructor - · rintro ⟨hi, hr⟩ - rw [isInvariant_iff_eq_exists] at hi - obtain ⟨c, m0, m1, ρ, hV⟩ := hi - simp [← termOfList_singleton, ← termOfList_append] at hV ⊢ - simp [IsReal, hV, conjugate_termOfList] at hr - have h0 := congr_arg (coeff 0) hr - have h2 := congr_arg (coeff {.barψ 0, .barψ 1}) hr - have h3 := congr_arg (coeff {.ψ 0, .ψ 1, .barψ 0, .barψ 1}) hr - simp +decide [coeff_apply_termOfList, coeff_one] at h0 h2 h3 - obtain ⟨c', rfl⟩ := Complex.conj_eq_iff_real.mp h0 - refine ⟨c', m0, ρ.re, hV.trans ?_⟩ - have hx : m1 • termOfList [barψ 0, barψ 1] = - -(starRingEnd ℂ m0 • termOfList [barψ 0, barψ 1]) := by - rw [← h2] - simp [termOfList, FieldSpecification.conjugate, - toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0)] - have hρ : ρ • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = - (ρ.re : ℂ) • termOfList [ψ 0, ψ 1, barψ 0, barψ 1] := by - simp [FieldSpecification.conjugate, h_quartic] at h3 - rcases smul_eq_zero.mp (show (starRingEnd ℂ ρ - ρ) • - termOfList [ψ 0, ψ 1, barψ 0, barψ 1] = 0 by simp [sub_smul, h3]) with h | h - · obtain ⟨ρ', rfl⟩ := Complex.conj_eq_iff_real.mp (sub_eq_zero.mp h) - simp - · simp [h] - rw [hx, hρ] - simp [sub_eq_add_neg] - · rintro ⟨c, m0, ρ, hV⟩ - constructor - · rw [isInvariant_iff_eq_exists] - use (c : ℂ), m0, - starRingEnd ℂ m0, ρ - rw [hV] - simp - abel - · simp only [← termOfList_singleton, ← termOfList_append] at hV - subst hV - simp [IsReal, -coe_smul, Fin.isValue, map_add, map_sub, LinearMap.map_smulₛₗ, - RingHomCompTriple.comp_apply, RingHom.id_apply, conjugate_termOfList, - FieldSpecification.conjugate, h_quartic] - simp [termOfList, toEFTLagrangianExclDeriv_mul_anti_commute (barψ 0) (barψ 1), - toEFTLagrangianExclDeriv_mul_anti_commute (ψ 0) (ψ 1)] - abel - -/-- The lemma expressing the form of an element of `EFTLagrangianExclDeriv`, if it is - invariant under the Lorentz group and is real, and has mass dimension at most `4`. - - This expresses the EFT lagrangian in terms of the Majorana mass trem. -/ -lemma isInvariant_isReal_hasMassDimLE_four_iff_eq_exists {V : EFTLagrangianExclDeriv} : - IsInvariant V ∧ IsReal V ∧ HasMassDimLE 4 V ↔ ∃ c : ℝ, ∃ m0 : ℂ, - V = (c : ℂ) • 1 + m0 • ([ψ 0]ₑ * [ψ 1]ₑ) - starRingEnd ℂ m0 • ([barψ 0]ₑ * [barψ 1]ₑ) := by - constructor - · rintro ⟨hi, hr, hm⟩ - obtain ⟨c, m0, ρ, hV⟩ := (isInvariant_and_isReal_iff_eq_exists.mp ⟨hi, hr⟩) - use c, m0 - simp only [← termOfList_singleton, ← termOfList_append] at hV ⊢ - rw [hV] - simp only [Fin.isValue, add_eq_left, smul_eq_zero] - have hmass := massDimCoeff_eq_zero_of_hasMassDimLE hm (6 : ℕ) (by norm_num) - have h0 := massDimCoeff_termOfList_ofNat (n := 6) - simp only [Nat.cast_ofNat, massDimensionNat_eq, Multiset.map_coe, List.map_const', - Multiset.sum_coe, List.sum_replicate, smul_eq_mul, Nat.reduceMul] at h0 - simp +decide [hV, h0, massDimCoeff_one] at hmass - rcases hmass with rfl | hmass - · simp - · simp [hmass] - · rintro ⟨c, m0, hV⟩ - rw [← and_assoc] - constructor - · rw [isInvariant_and_isReal_iff_eq_exists] - use c, m0, 0 - simp [hV] - · simp only [← termOfList_singleton, ← termOfList_append] at hV - rw [hV] - refine HasMassDimLE.sub - (HasMassDimLE.add (HasMassDimLE.smul (HasMassDimLE.one ?_)) - (HasMassDimLE.smul (HasMassDimLE.termOfList ?_))) - (HasMassDimLE.smul (HasMassDimLE.termOfList ?_)) <;> norm_num - -end EFTLagrangianExclDeriv - -end -end Fermion diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean deleted file mode 100644 index 6ea12fa4c..000000000 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/Basic.lean +++ /dev/null @@ -1,988 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan --/ -module - -public import Physlib.Particles.LagrangianTheory.Basic -public import Physlib.Relativity.Fermions.Weyl.Metric -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet -public import Physlib.Particles.StandardModel.Fermions.DownSinglet -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic -public import Physlib.Particles.StandardModel.Fermions.UpSinglet -public import Physlib.Particles.StandardModel.HiggsBoson.Basic -public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Mathematics.ConjModule -public import Physlib.Mathematics.MultisetsOfMassDim -public import Mathlib.RingTheory.GradedAlgebra.Basic -public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic -public import Mathlib.RingTheory.TensorProduct.Basic -public import Mathlib.RingTheory.TensorProduct.Maps -public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction -public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis -public import Mathlib.Algebra.MvPolynomial.PDeriv -/-! - -# The Standard Model EFT Lagrangian without derivatives - -## i. Overview - --/ - -@[expose] public section - -namespace StandardModel -noncomputable section - -open Module Matrix -open MatrixGroups -open Complex -open TensorProduct -open CategoryTheory.MonoidalCategory -open Fermion - -/-! - -## Field specification - --/ - -/-! - -## Specific block: The input data for Fermions - -For the Wess-Zumino theory there is a single left-handed Weyl fermion. - --/ - -/-- The irreducible representations of the fermion field - under the Lorentz group. -/ -inductive FermionIrrep - | Q (i : Fin 3) : FermionIrrep - | u (i : Fin 3) : FermionIrrep - | d (i : Fin 3) : FermionIrrep - | L (i : Fin 3) : FermionIrrep - | e (i : Fin 3) : FermionIrrep -deriving DecidableEq, Fintype - -/-- The components of each of the irreducible Fermionic representations - appearing in the Standard model. The components are ordered by - `Lorentz - SU(3) - SU(2)`. -/ -def FermionIrrep.components : FermionIrrep → Type - | .Q _ => Fin 2 × Fin 3 × Fin 2 - | .u _ => Fin 2 × Fin 3 - | .d _ => Fin 2 × Fin 3 - | .L _ => Fin 2 × Fin 2 - | .e _ => Fin 2 - -instance : (φ : FermionIrrep) → Fintype (FermionIrrep.components φ) - | .Q _ => inferInstanceAs (Fintype (Fin 2 × Fin 3 × Fin 2)) - | .u _ => inferInstanceAs (Fintype (Fin 2 × Fin 3)) - | .d _ => inferInstanceAs (Fintype (Fin 2 × Fin 3)) - | .L _ => inferInstanceAs (Fintype (Fin 2 × Fin 2)) - | .e _ => inferInstanceAs (Fintype (Fin 2)) - -instance : (φ : FermionIrrep) → DecidableEq (FermionIrrep.components φ) - | .Q _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 3 × Fin 2)) - | .u _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 3)) - | .d _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 3)) - | .L _ => inferInstanceAs (DecidableEq (Fin 2 × Fin 2)) - | .e _ => inferInstanceAs (DecidableEq (Fin 2)) - -def FermionIrrep.module : FermionIrrep → Type - | .Q _ => QuarkDoublet - | .u _ => UpSinglet - | .d _ => DownSinglet - | .L _ => LeptonDoublet - | .e _ => LeptonSinglet - -instance : (φ : FermionIrrep) → AddCommGroup (FermionIrrep.module φ) - | .Q _ => inferInstanceAs (AddCommGroup QuarkDoublet) - | .u _ => inferInstanceAs (AddCommGroup UpSinglet) - | .d _ => inferInstanceAs (AddCommGroup DownSinglet) - | .L _ => inferInstanceAs (AddCommGroup LeptonDoublet) - | .e _ => inferInstanceAs (AddCommGroup LeptonSinglet) - -instance : (φ : FermionIrrep) → Module ℂ (FermionIrrep.module φ) - | .Q _ => inferInstanceAs (Module ℂ QuarkDoublet) - | .u _ => inferInstanceAs (Module ℂ UpSinglet) - | .d _ => inferInstanceAs (Module ℂ DownSinglet) - | .L _ => inferInstanceAs (Module ℂ LeptonDoublet) - | .e _ => inferInstanceAs (Module ℂ LeptonSinglet) - -def FermionIrrep.basis : (φ : FermionIrrep) → - Basis (FermionIrrep.components φ) ℂ (FermionIrrep.module φ) - | .Q _ => QuarkDoublet.basis - | .u _ => UpSinglet.basis - | .d _ => DownSinglet.basis - | .L _ => LeptonDoublet.basis - | .e _ => LeptonSinglet.basis - -def FermionIrrep.repLorentzGroup : - (φ : FermionIrrep) → Representation ℂ SL(2,ℂ) (FermionIrrep.module φ) - | .Q _ => QuarkDoublet.repLorentzGroup - | .u _ => UpSinglet.repLorentzGroup - | .d _ => DownSinglet.repLorentzGroup - | .L _ => LeptonDoublet.repLorentzGroup - | .e _ => LeptonSinglet.repLorentzGroup - -def FermionIrrep.repGaugeGroupI : - (φ : FermionIrrep) → Representation ℂ GaugeGroupI (FermionIrrep.module φ) - | .Q _ => QuarkDoublet.repGaugeGroupI - | .u _ => UpSinglet.repGaugeGroupI - | .d _ => DownSinglet.repGaugeGroupI - | .L _ => LeptonDoublet.repGaugeGroupI - | .e _ => LeptonSinglet.repGaugeGroupI - -/-! - -## Repetable Derived Fermionic quantities - -This are quantities whose form is independent of the specific theory -we are constructing. - --/ - -inductive FermionicGenerator - | of (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator - | bar (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator -deriving DecidableEq, Fintype - -def FermionicGenerator.conjugate : FermionicGenerator → FermionicGenerator - | .of φ α => .bar φ α - | .bar φ α => .of φ α - -@[simp] -lemma FermionicGenerator.conjugate_conjugate (g : FermionicGenerator) : - g.conjugate.conjugate = g := by - cases g <;> rfl - -def fermionicGeneratorEquiv : FermionicGenerator ≃ - (Σ φ : FermionIrrep, FermionIrrep.components φ) ⊕ (Σ φ : FermionIrrep, FermionIrrep.components φ) where - toFun g := match g with - | .of φ α => Sum.inl ⟨φ, α⟩ - | .bar φ α => Sum.inr ⟨φ, α⟩ - invFun g := match g with - | Sum.inl ⟨φ, α⟩ => .of φ α - | Sum.inr ⟨φ, α⟩ => .bar φ α - left_inv g := by cases g <;> rfl - right_inv g := by cases g <;> rfl - -abbrev FermionicTargetSpace := Π (φ : FermionIrrep), FermionIrrep.module φ - -/-- The target space of the fermionic fields, including their conjugates. -/ -abbrev FermionicTargetSpaceWithComplex := FermionicTargetSpace × - ConjModule FermionicTargetSpace - - -abbrev FermionicComponentSpace := Module.Dual ℂ FermionicTargetSpaceWithComplex - -def fermionicComponentBasis : Basis FermionicGenerator ℂ FermionicComponentSpace := - ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod - ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm - -abbrev FermionicEFTExclDeriv := ExteriorAlgebra ℂ FermionicComponentSpace - -/-! - -### The representation of the Lorentz group on the fermionic part - --/ - -def FermionicTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicTargetSpace where - toFun Λ := LinearMap.piMap fun φ => FermionIrrep.repLorentzGroup φ Λ - map_one' := by - ext x i y - simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, - Function.comp_apply, Pi.map_apply, End.one_apply] - map_mul' Λ1 Λ2 := by - ext x i y - simp - -def FermionicTargetSpaceWithComplex.repLorentzGroup : - Representation ℂ SL(2,ℂ) FermionicTargetSpaceWithComplex := - FermionicTargetSpace.repLorentzGroup.prod (FermionicTargetSpace.repLorentzGroup.conj) - -def FermionicComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicComponentSpace := - FermionicTargetSpaceWithComplex.repLorentzGroup.dual - -def FermionicEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) FermionicEFTExclDeriv where - toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ)).toLinearMap - map_one' := by - simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, - AlgHom.toLinearMap_id] - map_mul' Λ1 Λ2 := by - simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - -/-! - -### The representation of the Gauge group on the fermionic part - --/ - - -def FermionicTargetSpace.repGaugeGroupI : Representation ℂ GaugeGroupI FermionicTargetSpace where - toFun Λ := LinearMap.piMap fun φ => FermionIrrep.repGaugeGroupI φ Λ - map_one' := by - ext x i y - simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, - Function.comp_apply, Pi.map_apply, End.one_apply] - map_mul' Λ1 Λ2 := by - ext x i y - simp - -def FermionicTargetSpaceWithComplex.repGaugeGroupI : - Representation ℂ GaugeGroupI FermionicTargetSpaceWithComplex := - FermionicTargetSpace.repGaugeGroupI.prod (FermionicTargetSpace.repGaugeGroupI.conj) - -def FermionicComponentSpace.repGaugeGroupI : Representation ℂ GaugeGroupI FermionicComponentSpace := - FermionicTargetSpaceWithComplex.repGaugeGroupI.dual - -def FermionicEFTExclDeriv.repGaugeGroupI : Representation ℂ GaugeGroupI FermionicEFTExclDeriv where - toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroupI Λ)).toLinearMap - map_one' := by - simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, - AlgHom.toLinearMap_id] - map_mul' Λ1 Λ2 := by - simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - - - -/-! - -## The input data for the complex scalar fields - --/ - - -set_option linter.constructorNameAsVariable false - -inductive ComplexScalarIrrep - | H : ComplexScalarIrrep -deriving DecidableEq, Fintype - -def ComplexScalarIrrep.components : ComplexScalarIrrep → Type - | .H => Fin 2 - -instance : (φ : ComplexScalarIrrep) → Fintype (ComplexScalarIrrep.components φ) - | .H => inferInstanceAs (Fintype (Fin 2)) - -instance : (φ : ComplexScalarIrrep) → DecidableEq (ComplexScalarIrrep.components φ) - | .H => inferInstanceAs (DecidableEq (Fin 2)) - -def ComplexScalarIrrep.module : ComplexScalarIrrep → Type - | .H => HiggsVec - -instance : (φ : ComplexScalarIrrep) → AddCommGroup (ComplexScalarIrrep.module φ) - | .H => inferInstanceAs (AddCommGroup HiggsVec) - -instance : (φ : ComplexScalarIrrep) → Module ℂ (ComplexScalarIrrep.module φ) - | .H => inferInstanceAs (Module ℂ HiggsVec) - -def ComplexScalarIrrep.basis : (φ : ComplexScalarIrrep) → - Basis (ComplexScalarIrrep.components φ) ℂ (ComplexScalarIrrep.module φ) - | .H => HiggsVec.orthonormBasis.toBasis - -def ComplexScalarIrrep.repLorentzGroup : (φ : ComplexScalarIrrep) → Representation ℂ SL(2,ℂ) (ComplexScalarIrrep.module φ) - | .H => Representation.trivial ℂ SL(2,ℂ) HiggsVec - -def ComplexScalarIrrep.repGaugeGroupI : - (φ : ComplexScalarIrrep) → Representation ℂ GaugeGroupI (ComplexScalarIrrep.module φ) - | .H => HiggsVec.repGaugeGroupI - -@[reducible] -def StandardModelLT : LagrangianTheory GaugeGroupI where - FermionIrreps := FermionIrrep - FermionComponents := FermionIrrep.components - fermionModule := FermionIrrep.module - fermionBasis := FermionIrrep.basis - fermionRepLorentzGroup := FermionIrrep.repLorentzGroup - fermionRepGaugeGroup := FermionIrrep.repGaugeGroupI - ComplexScalarIrreps := ComplexScalarIrrep - ComplexScalarComponents := ComplexScalarIrrep.components - complexScalarModule := ComplexScalarIrrep.module - complexScalarBasis := ComplexScalarIrrep.basis - complexScalarRepLorentzGroup := ComplexScalarIrrep.repLorentzGroup - complexScalarRepGaugeGroup := ComplexScalarIrrep.repGaugeGroupI - -- The Standard Model has no real bosonic fields at the no-derivative level - -- (the field strengths only enter the free-derivative layer). - RealBosonIrreps := Empty - RealBosonComponents := fun x => x.elim - realBosonComponents_fintype := fun x => x.elim - realBosonComponents_decEq := fun x => x.elim - realBosonModule := fun x => x.elim - realBosonModule_addCommGroup := fun x => x.elim - realBosonModule_module := fun x => x.elim - realBosonBasis := fun x => x.elim - realBosonRepLorentzGroup := fun x => x.elim - realBosonRepGaugeGroup := fun x => x.elim - -/-! - -## Derived Complex Scalar quantities - --/ - -inductive ComplexScalarGenerator - | of (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator - | bar (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator -deriving DecidableEq, Fintype - -def ComplexScalarGenerator.conjugate : ComplexScalarGenerator → ComplexScalarGenerator - | .of φ α => .bar φ α - | .bar φ α => .of φ α - -@[simp] -lemma ComplexScalarGenerator.conjugate_conjugate (g : ComplexScalarGenerator) : - g.conjugate.conjugate = g := by - cases g <;> rfl - -def complexScalarGeneratorEquiv : ComplexScalarGenerator ≃ - (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) ⊕ - (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) where - toFun g := match g with - | .of φ α => Sum.inl ⟨φ, α⟩ - | .bar φ α => Sum.inr ⟨φ, α⟩ - invFun g := match g with - | Sum.inl ⟨φ, α⟩ => .of φ α - | Sum.inr ⟨φ, α⟩ => .bar φ α - left_inv g := by cases g <;> rfl - right_inv g := by cases g <;> rfl - -abbrev ComplexScalarTargetSpace := Π (φ : ComplexScalarIrrep), ComplexScalarIrrep.module φ - - -/-- The target space of the fermionic fields, including their conjugates. -/ -abbrev ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace × - ConjModule ComplexScalarTargetSpace - - -abbrev ComplexScalarComponentSpace := Module.Dual ℂ ComplexScalarTargetSpaceWithComplex - -def complexScalarComponentBasis : Basis ComplexScalarGenerator ℂ ComplexScalarComponentSpace := - ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod - ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm - -abbrev ComplexScalarEFTExclDeriv := SymmetricAlgebra ℂ ComplexScalarComponentSpace - - -/-! - -### The representation of the Lorentz group on the complex scalar part - --/ - -def ComplexScalarTargetSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarTargetSpace where - toFun Λ := LinearMap.piMap fun φ => ComplexScalarIrrep.repLorentzGroup φ Λ - map_one' := by - ext1 x - apply LinearMap.ext - intro i - ext y - simp - map_mul' Λ1 Λ2 := by - ext1 x - apply LinearMap.ext - intro i - ext y - simp - -/-- The representation of the Lorentz group on the fermionic target space: - the irreps act componentwise on the product of their modules, and by the - conjugate action on the conjugate factor. -/ -def ComplexScalarTargetSpaceWithComplex.repLorentzGroup : - Representation ℂ SL(2,ℂ) ComplexScalarTargetSpaceWithComplex := - (ComplexScalarTargetSpace.repLorentzGroup).prod (ComplexScalarTargetSpace.repLorentzGroup.conj) - -def ComplexScalarComponentSpace.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarComponentSpace := - (ComplexScalarTargetSpaceWithComplex.repLorentzGroup).dual - -def ComplexScalarEFTExclDeriv.repLorentzGroup : Representation ℂ SL(2,ℂ) ComplexScalarEFTExclDeriv where - toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' Λ1 Λ2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup (Λ1 * Λ2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ2)) by - rw [h]; rfl - ext v - simp - -/-! - -## The representation of the Gauge group on the complex scalar part - --/ - -def ComplexScalarTargetSpace.repGaugeGroupI : - Representation ℂ GaugeGroupI ComplexScalarTargetSpace where - toFun g := LinearMap.piMap fun φ => ComplexScalarIrrep.repGaugeGroupI φ g - map_one' := by - ext1 x - apply LinearMap.ext - intro i - ext y - simp - map_mul' g1 g2 := by - ext1 x - apply LinearMap.ext - intro i - ext y - simp - -/-- The representation of the gauge group on the complex scalar target space: - the irreps act componentwise on the product of their modules, and by the - conjugate action on the conjugate factor. -/ -def ComplexScalarTargetSpaceWithComplex.repGaugeGroupI : - Representation ℂ GaugeGroupI ComplexScalarTargetSpaceWithComplex := - (ComplexScalarTargetSpace.repGaugeGroupI).prod (ComplexScalarTargetSpace.repGaugeGroupI.conj) - -def ComplexScalarComponentSpace.repGaugeGroupI : - Representation ℂ GaugeGroupI ComplexScalarComponentSpace := - (ComplexScalarTargetSpaceWithComplex.repGaugeGroupI).dual - -def ComplexScalarEFTExclDeriv.repGaugeGroupI : - Representation ℂ GaugeGroupI ComplexScalarEFTExclDeriv where - toFun g := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' g1 g2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI (g1 * g2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g2)) by - rw [h]; rfl - ext v - simp - -/-! - -## The field generators - --/ - -inductive FieldGenerators - | cScalar (_ : ComplexScalarGenerator) : FieldGenerators - | fermion (_ : FermionicGenerator) : FieldGenerators -deriving DecidableEq, Fintype - -def FieldGenerators.IsFermion : FieldGenerators → Bool - | .cScalar _ => False - | .fermion _ => True - -def FieldGenerators.IsBoson : FieldGenerators → Bool - | .cScalar _ => True - | .fermion _ => False - -def FieldGenerators.conjugate : FieldGenerators → FieldGenerators - | .cScalar g => .cScalar g.conjugate - | .fermion g => .fermion g.conjugate - -@[simp] -lemma FieldGenerators.conjugate_conjugate (ϕ : FieldGenerators) : - ϕ.conjugate.conjugate = ϕ := by - cases ϕ <;> simp [conjugate] - -def fieldGeneratorsEquiv : FieldGenerators ≃ - ComplexScalarGenerator ⊕ FermionicGenerator where - toFun g := match g with - | .cScalar g => Sum.inl g - | .fermion g => Sum.inr g - invFun g := match g with - | Sum.inl g => .cScalar g - | Sum.inr g => .fermion g - left_inv g := by cases g <;> rfl - right_inv g := by cases g <;> rfl - -@[simp] -lemma FieldGenerators.cScalar_isFermion (ϕ : ComplexScalarGenerator) : - (cScalar ϕ).IsFermion = False := by simp [IsFermion] - -@[simp] -lemma FieldGenerators.fermion_isFermion (ϕ : FermionicGenerator) : - (fermion ϕ).IsFermion = True := by simp [IsFermion] - -@[simp] -lemma FieldGenerators.cScalar_isBoson (ϕ : ComplexScalarGenerator) : - (cScalar ϕ).IsBoson = True := by simp [IsBoson] - -@[simp] -lemma FieldGenerators.fermion_isBoson (ϕ : FermionicGenerator) : - (fermion ϕ).IsBoson = False := by simp [IsBoson] - - -/-! - -## Irreps - --/ - -inductive Irrep - | cScalar (_ : ComplexScalarIrrep) : Irrep - | barCScalar (_ : ComplexScalarIrrep) : Irrep - | fermion (_ : FermionIrrep) : Irrep - | barFermion (_ : FermionIrrep) : Irrep - -def FieldGenerators.toIrrep : FieldGenerators → Irrep - | .cScalar (.of φ _) => .cScalar φ - | .cScalar (.bar φ _) => .barCScalar φ - | .fermion (.of φ _) => .fermion φ - | .fermion (.bar φ _) => .barFermion φ - -/-! - -## A. The EFT lagrangian without derivatives - --/ - -/-- The algebra corresponding to the EFT lagrangian excluding - derivative terms for the Wess-Zumino theory: the free supercommutative algebra - on the bosonic and fermionic generators, i.e. the tensor product of the symmetric - algebra on the bosonic duals with the exterior algebra on the fermionic duals. -/ -abbrev EFTLagrangianExclDeriv : Type := - -- bosonic part of the lagrangian - ComplexScalarEFTExclDeriv ⊗[ℂ] - -- fermionic part of the lagrangian - FermionicEFTExclDeriv - -namespace EFTLagrangianExclDeriv - -/-! - -## B. Invariance under the group actions - --/ -/-! - -### B.1 The representation of the Lorentz group on the EFT lagrangian - --/ - -/-- The representation of the Lorentz group on `EFTLagrangianExclDeriv`. -/ -def repLorentzGroup : Representation ℂ SL(2,ℂ) EFTLagrangianExclDeriv := - (ComplexScalarEFTExclDeriv.repLorentzGroup).tprod (FermionicEFTExclDeriv.repLorentzGroup) - -lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (V W : EFTLagrangianExclDeriv) : - repLorentzGroup Λ (V * W) = repLorentzGroup Λ V * repLorentzGroup Λ W := - map_mul (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) - (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) V W - -@[simp] -lemma repLorentzGroup_one (Λ : SL(2,ℂ)) : - repLorentzGroup Λ 1 = 1 := - map_one (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repLorentzGroup Λ)) - (ExteriorAlgebra.map (FermionicComponentSpace.repLorentzGroup Λ))) - -/-! - -### B.2 The representation of the gauge group on the EFT lagrangian - --/ - -/-- The representation of the gauge group on `EFTLagrangianExclDeriv`. -/ -def repGaugeGroupI : Representation ℂ GaugeGroupI EFTLagrangianExclDeriv := - (ComplexScalarEFTExclDeriv.repGaugeGroupI).tprod (FermionicEFTExclDeriv.repGaugeGroupI) - -lemma repGaugeGroupI_mul (g : GaugeGroupI) (V W : EFTLagrangianExclDeriv) : - repGaugeGroupI g (V * W) = repGaugeGroupI g V * repGaugeGroupI g W := - map_mul (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g)) - (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroupI g))) V W - -@[simp] -lemma repGaugeGroupI_one (g : GaugeGroupI) : - repGaugeGroupI g 1 = 1 := - map_one (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.repGaugeGroupI g)) - (ExteriorAlgebra.map (FermionicComponentSpace.repGaugeGroupI g))) - -/-! - -### B.3. The condition for invariance - --/ - -def IsInvariant (V : EFTLagrangianExclDeriv) : Prop := - (∀ (Λ : SL(2,ℂ)), repLorentzGroup Λ V = V) ∧ ∀ (g : GaugeGroupI), repGaugeGroupI g V = V - -@[simp] -lemma IsInvariant.zero : IsInvariant 0 := by - simp [IsInvariant] - -lemma IsInvariant.add {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V + W) := by - simp_all [IsInvariant] - -lemma IsInvariant.smul {V : EFTLagrangianExclDeriv} (c : ℂ) (hV : IsInvariant V) : - IsInvariant (c • V) := by - simp_all [IsInvariant] - -lemma IsInvariant.mul {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V * W) := by - simp_all [IsInvariant, repLorentzGroup_mul, repGaugeGroupI_mul] - -@[simp] -lemma IsInvariant.one : IsInvariant 1 := by - simp [IsInvariant] - -lemma IsInvariant.sum {ι : Type} [Fintype ι] {V : ι → EFTLagrangianExclDeriv} - (hV : ∀ i, IsInvariant (V i)) : IsInvariant (∑ i, V i) := by - simp_all [IsInvariant] - -lemma IsInvariant.of_mem_span {V : EFTLagrangianExclDeriv} {S : Set EFTLagrangianExclDeriv} - (hS : ∀ W ∈ S, IsInvariant W) (hV : V ∈ Submodule.span ℂ S) : - IsInvariant V := by - induction' hV using Submodule.span_induction with W hW W1 W2 h1 h2 hI1 hI2 a W hW hIW - · exact hS W hW - · exact zero - · exact add hI1 hI2 - · exact smul a hIW - -/-! - -## The elements of the EFT generated by the field generators - -Every element of the Field generators gives an element in the -type of EFT lagragians. - --/ -/-- The elements of `EFTLagrangianExclDeriv` associated with - the `FieldGenerators`. -/ -def ofFieldGenerators : FieldGenerators → EFTLagrangianExclDeriv - | .cScalar φ => SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis φ) ⊗ₜ 1 - | .fermion ψ => 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis ψ) - -scoped notation "[" v "]ₐ" => ofFieldGenerators v -scoped notation "[" v "]ₛ" => ofFieldGenerators (FieldGenerators.cScalar v) -scoped notation "[" v "]ₑ" => ofFieldGenerators (FieldGenerators.fermion v) - -lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalarGenerator) : - ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := - ⟨complexScalarComponentBasis ϕ, rfl⟩ - -lemma ofFieldGenerators_fermion_exists (ψ : FermionicGenerator) : - ∃ x, [ψ]ₑ = 1 ⊗ₜ ExteriorAlgebra.ι ℂ x := - ⟨fermionicComponentBasis ψ, rfl⟩ - -lemma cScalar_comm_cScalar (φ₁ φ₂ : ComplexScalarGenerator) : - [φ₁]ₛ * [φ₂]ₛ = [φ₂]ₛ * [φ₁]ₛ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists φ₁ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists φ₂ - simp [h1, h2, mul_comm] - -lemma cScalar_comm_fermion (ϕ : ComplexScalarGenerator) (ψ : FermionicGenerator) : - [ϕ]ₛ * [ψ]ₑ = [ψ]ₑ * [ϕ]ₛ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists ϕ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ - simp [h1, h2, mul_comm] - -lemma cScalar_comm (V : EFTLagrangianExclDeriv) (ϕ : ComplexScalarGenerator) : - [ϕ]ₛ * V = V * [ϕ]ₛ := by - obtain ⟨x, h⟩ := ofFieldGenerators_cScalar_exists ϕ - induction V using TensorProduct.induction_on with - | zero => simp - | tmul a b => simp [h, mul_comm] - | add x y hx hy => simp [mul_add, add_mul, hx, hy] - -lemma fermion_comm_cScalar (ψ : FermionicGenerator) (ϕ : ComplexScalarGenerator) : - [ψ]ₑ * [ϕ]ₛ = [ϕ]ₛ * [ψ]ₑ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists ϕ - simp [h1, h2] - -lemma fermion_anticomm_fermion (ψ₁ ψ₂ : FermionicGenerator) : - [ψ₁]ₑ * [ψ₂]ₑ = - [ψ₂]ₑ * [ψ₁]ₑ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ - rw [h1, h2, ← TensorProduct.tmul_neg, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul] - congr 1 - rw [neg_mul, eq_neg_iff_add_eq_zero] - exact ExteriorAlgebra.ι_add_mul_swap x₁ x₂ - -@[simp] -lemma fermion_mul_self (ψ : FermionicGenerator) : [ψ]ₑ * [ψ]ₑ = 0 := by - obtain ⟨x, h⟩ := ofFieldGenerators_fermion_exists ψ - simp [h] - -lemma ofFieldGenerators_comm (ϕ₁ ϕ₂ : FieldGenerators) : - ∃ c : ℂ, [ϕ₁]ₐ * [ϕ₂]ₐ = c • [ϕ₂]ₐ * [ϕ₁]ₐ ∧ (c = 1 ∨ c = -1) := by - match ϕ₁, ϕ₂ with - | .cScalar φ₁, .cScalar φ₂ => exact ⟨1, by simp [cScalar_comm_cScalar]⟩ - | .cScalar _, .fermion ψ => exact ⟨1, by simp [cScalar_comm_fermion]⟩ - | .fermion ψ, .cScalar _ => exact ⟨1, by simp [fermion_comm_cScalar]⟩ - |.fermion ψ₁, .fermion ψ₂ => - exact ⟨-1, by rw [fermion_anticomm_fermion]; abel, by simp⟩ - -/-! - -## The lift of a map from the field generators to an algebra homomorphism - --/ - -open scoped IsMulCommutative in -set_option maxRecDepth 2000 in -/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images `F g` of - the field generators: the images of the bosonic generators pairwise commute and - commute with the images of the fermionic generators, which pairwise anticommute. - The bosonic factor lifts through the commutative subalgebra generated by the - bosonic images. -/ -def lift {A : Type} [Ring A] [Algebra ℂ A] (F : FieldGenerators → A) - (hBB : ∀ g g', Commute (F (.cScalar g)) (F (.cScalar g'))) - (hBF : ∀ g g', Commute (F (.cScalar g)) (F (.fermion g'))) - (hFF : ∀ g g', F (.fermion g) * F (.fermion g') = - (F (.fermion g') * F (.fermion g))) : - EFTLagrangianExclDeriv →ₐ[ℂ] A := - let FB : ComplexScalarGenerator → A := fun g => F (.cScalar g) - let FF : FermionicGenerator → A := fun g => F (.fermion g) - have hFF : ∀ g g', FF g * FF g' = - (FF g' * FF g) := hFF - haveI : IsMulCommutative (Algebra.adjoin ℂ (Set.range FB)) := - Algebra.isMulCommutative_adjoin ℂ (by rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩; exact hBB g g') - let fS : ComplexScalarEFTExclDeriv →ₐ[ℂ] Algebra.adjoin ℂ (Set.range FB) := - SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ fun g => - ⟨FB g, Algebra.subset_adjoin ⟨g, rfl⟩⟩) - Algebra.TensorProduct.lift - ((Algebra.adjoin ℂ (Set.range FB)).val.comp fS) - (ExteriorAlgebra.lift ℂ - ⟨fermionicComponentBasis.constr ℂ FF, fun v => by - have hdiag : ∀ g, FF g * FF g = 0 := fun g => by - simpa [← two_smul ℂ] using eq_neg_iff_add_eq_zero.mp (hFF g g) - rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Fintype.sum_prod_type'] - exact Finset.sum_involution (fun p _ => (p.2, p.1)) - (fun p _ => by rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2]; module) - (fun p _ hf hswap => hf (by rw [show p.2 = p.1 from (Prod.ext_iff.mp hswap).1, - smul_mul_smul_comm, hdiag, smul_zero])) - (fun p _ => Finset.mem_univ _) (fun p _ => rfl)⟩) - (fun x y => by - refine (Algebra.commute_of_mem_adjoin_of_forall_mem_commute (fS x).2 ?_).symm - rintro _ ⟨g, rfl⟩ - induction y using ExteriorAlgebra.induction with - | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commutes r _ - | ι v => - rw [ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] - exact Commute.sum_left _ _ _ fun g' _ => (hBF g g').symm.smul_left _ - | mul u w hu hw => rw [map_mul]; exact hu.mul_left hw - | add u w hu hw => rw [map_add]; exact hu.add_left hw) - -/-! - -## The elements generated by lists of field generators - --/ - -/-- The element of `EFTLagrangianExclDeriv` generated from a list of field generators. -/ -def termOfList (l : List FieldGenerators) : EFTLagrangianExclDeriv := - (l.map ofFieldGenerators).prod - -lemma termOfList_cons (ψ : FieldGenerators) (l : List FieldGenerators) : - termOfList (ψ :: l) = [ψ]ₐ * termOfList l := by simp [termOfList] - -lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] - -lemma termOfList_append (l1 l2 : List FieldGenerators) : - termOfList (l1 ++ l2) = termOfList l1 * termOfList l2 := by - simp [termOfList] - -lemma termOfList_perm {l1 l2 : List FieldGenerators} (h : l1.Perm l2) : - ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ (c = 1 ∨ c = -1) := by - induction h with - | nil => exact ⟨1, by simp⟩ - | cons x _ ih => - obtain ⟨c, hc1, hc2⟩ := ih - exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc1, mul_smul_comm], hc2⟩ - | swap x y l => - obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm y x - refine ⟨c, ?_⟩ - rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc] - simp [hc1, mul_assoc, smul_mul_assoc] - exact hc2 - | trans _ _ ih1 ih2 => - obtain ⟨c1, hc1, hc1'⟩ := ih1 - obtain ⟨c2, hc2, hc2'⟩ := ih2 - exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul], by grind⟩ - -lemma fermion_mul_termOfList_of_mem (ψ : FermionicGenerator) (l : List FieldGenerators) - (hψ : .fermion ψ ∈ l) : [ψ]ₑ * termOfList l = 0 := by - induction l with - | nil => simp at hψ - | cons β t ih => - rcases List.mem_cons.mp hψ with rfl | ha - · simp [termOfList_cons, ← mul_assoc] - · obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm (.fermion ψ) β - simp [termOfList_cons, ← mul_assoc, hc1] - simp [mul_assoc, ih ha] - -lemma termOfList_filter_isBoson_comm (l : List FieldGenerators) (V : EFTLagrangianExclDeriv) : - termOfList (l.filter FieldGenerators.IsBoson) * V = - V * termOfList (l.filter FieldGenerators.IsBoson) := by - induction l with - | nil => simp [termOfList] - | cons ψ t ih => - match ψ with - | .cScalar ϕ => - simp [termOfList_cons, cScalar_comm, mul_assoc] - simp [← mul_assoc, ih] - | .fermion ψ => simpa using ih - -lemma termOfList_eq_isBoson_mul_isFermion (l : List FieldGenerators) : - termOfList l = termOfList (l.filter FieldGenerators.IsBoson) * - termOfList (l.filter FieldGenerators.IsFermion) := by - induction l with - | nil => simp [termOfList] - | cons ψ t ih => - match ψ with - | .cScalar ϕ => simp [termOfList_cons, ih, mul_assoc] - | .fermion ψ => - simp [termOfList_cons, ih, ← mul_assoc, termOfList_filter_isBoson_comm] - simp [mul_assoc, termOfList_filter_isBoson_comm] - -lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} - (h : termOfList l1 = c • termOfList l2) : - termOfList l1.reverse = c • termOfList l2.reverse := by - let r : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := - TensorProduct.map LinearMap.id CliffordAlgebra.reverse - have hmul : ∀ x y : EFTLagrangianExclDeriv, r (x * y) = r y * r x := by - intro x y - induction x using TensorProduct.induction_on with - | zero => simp - | tmul a b => - induction y using TensorProduct.induction_on with - | zero => simp - | tmul a' b' => - simp [r, CliffordAlgebra.reverse.map_mul, mul_comm] - | add y₁ y₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] - | add x₁ x₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] - have hgen : ∀ ψ : FieldGenerators, r [ψ]ₐ = [ψ]ₐ := by - rintro (ϕ | ψ) <;> simp [r, ofFieldGenerators, CliffordAlgebra.reverse_ι] - have hf : ∀ l : List FieldGenerators, r (termOfList l) = termOfList l.reverse := by - intro l - induction l with - | nil => simp [r, termOfList_nil, Algebra.TensorProduct.one_def] - | cons ψ t ih => - rw [termOfList_cons, hmul, ih, hgen, List.reverse_cons, termOfList_append] - simp [termOfList] - rw [← hf, ← hf, h, map_smul] - -lemma termOfList_conjugate_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} - (h : termOfList l1 = c • termOfList l2) : - termOfList (l1.map FieldGenerators.conjugate) = - c • termOfList (l2.map FieldGenerators.conjugate) := by - -- Conjugation of generators induces an algebra endomorphism, acting on each - -- tensor factor by the basis permutation `g ↦ g.conjugate`. - let f : EFTLagrangianExclDeriv →ₐ[ℂ] EFTLagrangianExclDeriv := - Algebra.TensorProduct.map - (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ - complexScalarComponentBasis.constr ℂ fun g => complexScalarComponentBasis g.conjugate)) - (ExteriorAlgebra.map (fermionicComponentBasis.constr ℂ fun g => - fermionicComponentBasis g.conjugate)) - have hgen : ∀ g : FieldGenerators, f [g]ₐ = [g.conjugate]ₐ := by - rintro (g | g) <;> - simp [f, ofFieldGenerators, FieldGenerators.conjugate, ExteriorAlgebra.map_apply_ι] - have hf : ∀ l : List FieldGenerators, - f (termOfList l) = termOfList (l.map FieldGenerators.conjugate) := by - intro l - induction l with - | nil => simp [termOfList_nil] - | cons g t ih => rw [termOfList_cons, map_mul, ih, hgen, List.map_cons, termOfList_cons] - rw [← hf, ← hf, h, map_smul] - -/-- The elements of type `termOfList` span `EFTLagrangianExclDeriv`. -/ -lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : - V ∈ Submodule.span ℂ (Set.range termOfList) := by - have hmul_mem : ∀ x y : EFTLagrangianExclDeriv, - x ∈ Submodule.span ℂ (Set.range termOfList) → - y ∈ Submodule.span ℂ (Set.range termOfList) → - x * y ∈ Submodule.span ℂ (Set.range termOfList) := fun x y hx hy => by - have h := Submodule.mul_mem_mul hx hy - rw [Submodule.span_mul_span] at h - refine Submodule.span_mono ?_ h - rintro _ ⟨_, ⟨l1, rfl⟩, _, ⟨l2, rfl⟩, rfl⟩ - exact ⟨l1 ++ l2, termOfList_append l1 l2⟩ - have hgen : ∀ g : FieldGenerators, [g]ₐ ∈ Submodule.span ℂ (Set.range termOfList) := - fun g => Submodule.subset_span ⟨[g], by simp [termOfList]⟩ - induction V using TensorProduct.induction_on with - | zero => exact Submodule.zero_mem _ - | add x y hx hy => exact Submodule.add_mem _ hx hy - | tmul a b => - -- The bosonic factor: `a ⊗ₜ 1` lies in the span. - have h1 : (a ⊗ₜ[ℂ] 1 : EFTLagrangianExclDeriv) ∈ - Submodule.span ℂ (Set.range termOfList) := by - induction a using SymmetricAlgebra.induction with - | algebraMap c => - simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, - TensorProduct.smul_tmul'] using - Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) - | ι x => - rw [← Basis.sum_repr complexScalarComponentBasis x, map_sum, TensorProduct.sum_tmul] - refine Submodule.sum_mem _ fun i _ => ?_ - rw [map_smul, ← TensorProduct.smul_tmul'] - exact Submodule.smul_mem _ _ (hgen (.cScalar i)) - | mul a₁ a₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ - | add a₁ a₂ h₁ h₂ => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ h₁ h₂ - -- The fermionic factor: `1 ⊗ₜ b` lies in the span. - have h2 : (1 ⊗ₜ[ℂ] b : EFTLagrangianExclDeriv) ∈ - Submodule.span ℂ (Set.range termOfList) := by - induction b using ExteriorAlgebra.induction with - | algebraMap c => - simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, - TensorProduct.tmul_smul] using - Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) - | ι x => - rw [← Basis.sum_repr fermionicComponentBasis x, map_sum, TensorProduct.tmul_sum] - refine Submodule.sum_mem _ fun i _ => ?_ - rw [map_smul, TensorProduct.tmul_smul] - exact Submodule.smul_mem _ _ (hgen (.fermion i)) - | mul b₁ b₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ - | add b₁ b₂ h₁ h₂ => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ h₁ h₂ - simpa using hmul_mem _ _ h1 h2 - -/-- The linear map `EFTLagrangianExclDeriv →ₗ[ℂ] A` determined by the values `F l` on - the spanning terms `termOfList l`, provided `F` respects the scaling relations that - hold among the terms. -/ -noncomputable def liftLinear {A : Type} [Ring A] [Algebra ℂ A] (F : List FieldGenerators → A) - (hscale : ∀ (l1 l2 : List FieldGenerators) (c : ℂ), - termOfList l1 = c • termOfList l2 → F l1 = c • F l2) : - EFTLagrangianExclDeriv →ₗ[ℂ] A := - let π : (List FieldGenerators →₀ ℂ) →ₗ[ℂ] EFTLagrangianExclDeriv := - Finsupp.linearCombination ℂ termOfList - let φ : (List FieldGenerators →₀ ℂ) →ₗ[ℂ] A := - Finsupp.linearCombination ℂ F - have hπ : Function.Surjective π := - LinearMap.range_eq_top.mp (by - rw [Finsupp.range_linearCombination, eq_top_iff] - exact fun V _ => mem_termOfList_span V) - have hker : LinearMap.ker π ≤ LinearMap.ker φ := by - - sorry - ((LinearMap.ker π).liftQ φ hker).comp (π.quotKerEquivOfSurjective hπ).symm.toLinearMap - -lemma liftLinear_of_eq (A : Type) [Ring A] [Algebra ℂ A] (F : List FieldGenerators → A) - (hscale : ∀ (l1 l2 : List FieldGenerators) (c : ℂ), - termOfList l1 = c • termOfList l2 → F l1 = c • F l2) (l : List FieldGenerators) : - liftLinear F hscale (termOfList l) = F l := by - have h : termOfList l = - Finsupp.linearCombination ℂ termOfList (Finsupp.single l 1) := by - simp - simp only [liftLinear, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply] - rw [h, LinearMap.quotKerEquivOfSurjective_symm_apply, Submodule.liftQ_apply] - simp - -end EFTLagrangianExclDeriv diff --git a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean b/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean deleted file mode 100644 index b6144b330..000000000 --- a/Physlib/Particles/StandardModel/EFTLagrangianExclDeriv/YukawaTerms.lean +++ /dev/null @@ -1,810 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan --/ -module - -public import Physlib.Particles.StandardModel.EFTLagrangianExclDeriv.Basic -/-! - -# The Yukawa terms in the EFT lagrangian - --/ - -@[expose] public section - -namespace StandardModel -noncomputable section - -open Module Matrix -open MatrixGroups -open Complex -open TensorProduct -open CategoryTheory.MonoidalCategory -open Fermion - -/-! - -## The action of the representations on the basis of the target spaces - --/ - -namespace LeptonDoublet - -lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (α a : Fin 2) : - repLorentzGroup Λ (basis (α, a)) = ∑ β, Λ.1 β α • basis (β, a) := by - simp only [basis, Basis.map_apply, Basis.tensorProduct_apply, repLorentzGroup, - MonoidHom.coe_mk, OneHom.coe_mk, LinearMap.coe_comp, LinearEquiv.coe_coe, - Function.comp_apply, LinearEquiv.apply_symm_apply, TensorProduct.map_tmul, - Fermion.LeftHandedWeyl.rep_apply_basis, Representation.trivial_apply, - TensorProduct.sum_tmul, ← TensorProduct.smul_tmul', map_sum, map_smul] - -lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (α a : Fin 2) : - repGaugeGroupI g (basis (α, a)) = - ∑ b, (star (g.toU1.1 : ℂ) ^ 3 * g.toSU2.1 b a) • basis (α, b) := by - have h := repGaugeGroupI_tmul_basis_eq_sum g α a - simpa [basis, Basis.map_apply, Basis.tensorProduct_apply, valLinEquiv_symm_apply, - EuclideanSpace.basisFun_apply] using h - -end LeptonDoublet - -namespace LeptonSinglet - -lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (α : Fin 2) : - repGaugeGroupI g (basis α) = (star (g.toU1.1 : ℂ) ^ 6) • basis α := by - simpa [basis, Basis.map_apply, valLinEquiv_symm_apply] using repGaugeGroupI_basis g α - -end LeptonSinglet - -namespace HiggsVec - -lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (a : Fin 2) : - repGaugeGroupI g (orthonormBasis.toBasis a) = - ∑ b, ((g.toU1.1 : ℂ) ^ 3 * g.toSU2.1 b a) • orthonormBasis.toBasis b := by - ext c - simp [repGaugeGroupI_apply, orthonormBasis, EuclideanSpace.basisFun_apply, - PiLp.ofLp_single, Submonoid.smul_def, Fin.sum_univ_two, mul_comm] - fin_cases c <;> simp - -end HiggsVec - -/-! - -## The action of the representations on the fermionic component space - --/ - -lemma FermionicComponentSpace.repLorentzGroup_apply_basis_of (Λ : SL(2,ℂ)) - (φ : FermionIrrep) (α : FermionIrrep.components φ) : - FermionicComponentSpace.repLorentzGroup Λ (fermionicComponentBasis (.of φ α)) = - ∑ β : FermionIrrep.components φ, - ((FermionIrrep.basis φ).repr (FermionIrrep.repLorentzGroup φ Λ⁻¹ - (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.of φ β) := by - refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod - ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ - obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w - · simp only [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] - simp - by_cases h : φ' = φ - · subst h - simp [Finsupp.single_apply, Sigma.mk.injEq] - · simp [Sigma.mk.injEq, h] - · simp [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] - -lemma FermionicComponentSpace.repLorentzGroup_apply_basis_bar (Λ : SL(2,ℂ)) - (φ : FermionIrrep) (α : FermionIrrep.components φ) : - FermionicComponentSpace.repLorentzGroup Λ (fermionicComponentBasis (.bar φ α)) = - ∑ β : FermionIrrep.components φ, - star ((FermionIrrep.basis φ).repr (FermionIrrep.repLorentzGroup φ Λ⁻¹ - (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.bar φ β) := by - refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod - ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ - obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w - · simp [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] - · simp only [FermionicComponentSpace.repLorentzGroup, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repLorentzGroup, FermionicTargetSpace.repLorentzGroup] - simp [Representation.conj_apply] - by_cases h : φ' = φ - · subst h - simp [Finsupp.single_apply, Sigma.mk.injEq] - · simp [Sigma.mk.injEq, h] - -lemma FermionicComponentSpace.repGaugeGroupI_apply_basis_of (g : GaugeGroupI) - (φ : FermionIrrep) (α : FermionIrrep.components φ) : - FermionicComponentSpace.repGaugeGroupI g (fermionicComponentBasis (.of φ α)) = - ∑ β : FermionIrrep.components φ, - ((FermionIrrep.basis φ).repr (FermionIrrep.repGaugeGroupI φ g⁻¹ - (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.of φ β) := by - refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod - ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ - obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w - · simp only [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] - simp - by_cases h : φ' = φ - · subst h - simp [Finsupp.single_apply, Sigma.mk.injEq] - · simp [Sigma.mk.injEq, h] - · simp [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] - -lemma FermionicComponentSpace.repGaugeGroupI_apply_basis_bar (g : GaugeGroupI) - (φ : FermionIrrep) (α : FermionIrrep.components φ) : - FermionicComponentSpace.repGaugeGroupI g (fermionicComponentBasis (.bar φ α)) = - ∑ β : FermionIrrep.components φ, - star ((FermionIrrep.basis φ).repr (FermionIrrep.repGaugeGroupI φ g⁻¹ - (FermionIrrep.basis φ β)) α) • fermionicComponentBasis (.bar φ β) := by - refine ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod - ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).ext fun w => ?_ - obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w - · simp [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] - · simp only [FermionicComponentSpace.repGaugeGroupI, Representation.dual_apply, - Module.Dual.transpose_apply, fermionicComponentBasis, Basis.reindex_apply, - fermionicGeneratorEquiv, Basis.prod_apply, - FermionicTargetSpaceWithComplex.repGaugeGroupI, FermionicTargetSpace.repGaugeGroupI] - simp [Representation.conj_apply] - by_cases h : φ' = φ - · subst h - simp [Finsupp.single_apply, Sigma.mk.injEq] - · simp [Sigma.mk.injEq, h] - -/-! - -## The action of the representations on the complex scalar component space - --/ - -lemma ComplexScalarComponentSpace.repLorentzGroup_apply (Λ : SL(2,ℂ)) - (v : ComplexScalarComponentSpace) : - ComplexScalarComponentSpace.repLorentzGroup Λ v = v := by - have h1 : ∀ w : ComplexScalarTargetSpaceWithComplex, - ComplexScalarTargetSpaceWithComplex.repLorentzGroup Λ⁻¹ w = w := by - intro w - apply Prod.ext - · funext φ - simp [ComplexScalarTargetSpaceWithComplex.repLorentzGroup, - ComplexScalarTargetSpace.repLorentzGroup] - cases φ - simp [ComplexScalarIrrep.repLorentzGroup] - rfl - · funext φ - simp [ComplexScalarTargetSpaceWithComplex.repLorentzGroup, - ComplexScalarTargetSpace.repLorentzGroup, Representation.conj_apply] - cases φ - simp [ComplexScalarIrrep.repLorentzGroup, conjEquiv] - rfl - refine LinearMap.ext fun w => ?_ - simp [ComplexScalarComponentSpace.repLorentzGroup, Representation.dual_apply, - Module.Dual.transpose_apply, h1] - -lemma ComplexScalarComponentSpace.repGaugeGroupI_apply_basis_of (g : GaugeGroupI) - (φ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components φ) : - ComplexScalarComponentSpace.repGaugeGroupI g (complexScalarComponentBasis (.of φ α)) = - ∑ β : ComplexScalarIrrep.components φ, - ((ComplexScalarIrrep.basis φ).repr (ComplexScalarIrrep.repGaugeGroupI φ g⁻¹ - (ComplexScalarIrrep.basis φ β)) α) • complexScalarComponentBasis (.of φ β) := by - refine ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod - ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).ext fun w => ?_ - obtain (⟨φ', γ⟩ | ⟨φ', γ⟩) := w - · simp only [ComplexScalarComponentSpace.repGaugeGroupI, Representation.dual_apply, - Module.Dual.transpose_apply, complexScalarComponentBasis, Basis.reindex_apply, - complexScalarGeneratorEquiv, Basis.prod_apply, - ComplexScalarTargetSpaceWithComplex.repGaugeGroupI, - ComplexScalarTargetSpace.repGaugeGroupI] - simp - by_cases h : φ' = φ - · subst h - simp [Finsupp.single_apply, Sigma.mk.injEq] - · simp [Finsupp.single_apply, Sigma.mk.injEq] - · simp [ComplexScalarComponentSpace.repGaugeGroupI, Representation.dual_apply, - Module.Dual.transpose_apply, complexScalarComponentBasis, Basis.reindex_apply, - complexScalarGeneratorEquiv, Basis.prod_apply, - ComplexScalarTargetSpaceWithComplex.repGaugeGroupI, - ComplexScalarTargetSpace.repGaugeGroupI] - -namespace EFTLagrangianExclDeriv - -/-! - -## The action of the representations on the field generators - --/ - -lemma repLorentzGroup_apply_fermion (Λ : SL(2,ℂ)) (ψ : FermionicGenerator) : - repLorentzGroup Λ [ψ]ₑ = 1 ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ - (FermionicComponentSpace.repLorentzGroup Λ (fermionicComponentBasis ψ)) := by - simp [repLorentzGroup, Representation.tprod_apply, ofFieldGenerators, - FermionicEFTExclDeriv.repLorentzGroup, ComplexScalarEFTExclDeriv.repLorentzGroup, - ExteriorAlgebra.map_apply_ι] - -lemma repGaugeGroupI_apply_fermion (g : GaugeGroupI) (ψ : FermionicGenerator) : - repGaugeGroupI g [ψ]ₑ = 1 ⊗ₜ[ℂ] ExteriorAlgebra.ι ℂ - (FermionicComponentSpace.repGaugeGroupI g (fermionicComponentBasis ψ)) := by - simp [repGaugeGroupI, Representation.tprod_apply, ofFieldGenerators, - FermionicEFTExclDeriv.repGaugeGroupI, ComplexScalarEFTExclDeriv.repGaugeGroupI, - ExteriorAlgebra.map_apply_ι] - -lemma repLorentzGroup_apply_cScalar (Λ : SL(2,ℂ)) (ϕ : ComplexScalarGenerator) : - repLorentzGroup Λ [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ - (ComplexScalarComponentSpace.repLorentzGroup Λ (complexScalarComponentBasis ϕ)) ⊗ₜ[ℂ] 1 := by - simp [repLorentzGroup, Representation.tprod_apply, ofFieldGenerators, - FermionicEFTExclDeriv.repLorentzGroup, ComplexScalarEFTExclDeriv.repLorentzGroup] - -lemma repGaugeGroupI_apply_cScalar (g : GaugeGroupI) (ϕ : ComplexScalarGenerator) : - repGaugeGroupI g [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ - (ComplexScalarComponentSpace.repGaugeGroupI g (complexScalarComponentBasis ϕ)) ⊗ₜ[ℂ] 1 := by - simp [repGaugeGroupI, Representation.tprod_apply, ofFieldGenerators, - FermionicEFTExclDeriv.repGaugeGroupI, ComplexScalarEFTExclDeriv.repGaugeGroupI] - -/-! - -## The action of the representations on the generators appearing in the -## `L`, `e`, `H` Yukawa term - --/ - -lemma repLorentzGroup_apply_bar_L (Λ : SL(2,ℂ)) (i : Fin 3) (α a : Fin 2) : - repLorentzGroup Λ [FermionicGenerator.bar (.L i) (α, a)]ₑ = - ∑ β, star (Λ⁻¹.1 α β) • [FermionicGenerator.bar (.L i) (β, a)]ₑ := by - rw [repLorentzGroup_apply_fermion, FermionicComponentSpace.repLorentzGroup_apply_basis_bar] - show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) - (∑ β : Fin 2 × Fin 2, - star ((LeptonDoublet.basis.repr ((LeptonDoublet.repLorentzGroup Λ⁻¹) - (LeptonDoublet.basis β))) (α, a)) • - fermionicComponentBasis (FermionicGenerator.bar (FermionIrrep.L i) β)) = _ - rw [Fintype.sum_prod_type] - simp [LeptonDoublet.repLorentzGroup_apply_basis, Basis.repr_self, Finsupp.single_apply, - Prod.mk.injEq, ofFieldGenerators] - fin_cases α <;> fin_cases a <;> - simp [TensorProduct.tmul_add, TensorProduct.tmul_smul] - -lemma repLorentzGroup_apply_of_e (Λ : SL(2,ℂ)) (j : Fin 3) (α : Fin 2) : - repLorentzGroup Λ [FermionicGenerator.of (.e j) α]ₑ = - ∑ β, star (Λ⁻¹.1 α β) • [FermionicGenerator.of (.e j) β]ₑ := by - rw [repLorentzGroup_apply_fermion, FermionicComponentSpace.repLorentzGroup_apply_basis_of] - show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) - (∑ β : Fin 2, - ((LeptonSinglet.basis.repr ((LeptonSinglet.repLorentzGroup Λ⁻¹) - (LeptonSinglet.basis β))) α) • - fermionicComponentBasis (FermionicGenerator.of (FermionIrrep.e j) β)) = _ - simp [LeptonSinglet.repLorentzGroup_apply_basis, Basis.repr_self, Finsupp.single_apply, - ofFieldGenerators] - fin_cases α <;> simp [TensorProduct.tmul_add, TensorProduct.tmul_smul] - -lemma repLorentzGroup_apply_of_H (Λ : SL(2,ℂ)) (a : Fin 2) : - repLorentzGroup Λ [ComplexScalarGenerator.of .H a]ₛ = [ComplexScalarGenerator.of .H a]ₛ := by - rw [repLorentzGroup_apply_cScalar, ComplexScalarComponentSpace.repLorentzGroup_apply] - rfl - -lemma repGaugeGroupI_apply_bar_L (g : GaugeGroupI) (i : Fin 3) (α a : Fin 2) : - repGaugeGroupI g [FermionicGenerator.bar (.L i) (α, a)]ₑ = - ∑ b, (star (g.toU1.1 : ℂ) ^ 3 * g.toSU2.1 b a) • [FermionicGenerator.bar (.L i) (α, b)]ₑ := by - rw [repGaugeGroupI_apply_fermion, FermionicComponentSpace.repGaugeGroupI_apply_basis_bar] - show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) - (∑ β : Fin 2 × Fin 2, - star ((LeptonDoublet.basis.repr ((LeptonDoublet.repGaugeGroupI g⁻¹) - (LeptonDoublet.basis β))) (α, a)) • - fermionicComponentBasis (FermionicGenerator.bar (FermionIrrep.L i) β)) = _ - rw [Fintype.sum_prod_type] - simp [LeptonDoublet.repGaugeGroupI_apply_basis, Basis.repr_self, Finsupp.single_apply, - Prod.mk.injEq, ofFieldGenerators, map_inv, ← Unitary.star_eq_inv, ← Matrix.star_eq_inv, - Matrix.star_apply] - fin_cases α <;> fin_cases a <;> - simp [TensorProduct.tmul_add, TensorProduct.tmul_smul] - -lemma repGaugeGroupI_apply_of_e (g : GaugeGroupI) (j : Fin 3) (α : Fin 2) : - repGaugeGroupI g [FermionicGenerator.of (.e j) α]ₑ = - ((g.toU1.1 : ℂ) ^ 6) • [FermionicGenerator.of (.e j) α]ₑ := by - rw [repGaugeGroupI_apply_fermion, FermionicComponentSpace.repGaugeGroupI_apply_basis_of] - show (1 : ComplexScalarEFTExclDeriv) ⊗ₜ[ℂ] (ExteriorAlgebra.ι ℂ) - (∑ β : Fin 2, - ((LeptonSinglet.basis.repr ((LeptonSinglet.repGaugeGroupI g⁻¹) - (LeptonSinglet.basis β))) α) • - fermionicComponentBasis (FermionicGenerator.of (FermionIrrep.e j) β)) = _ - simp [LeptonSinglet.repGaugeGroupI_apply_basis, Basis.repr_self, Finsupp.single_apply, - ofFieldGenerators, map_inv, ← Unitary.star_eq_inv, TensorProduct.tmul_smul] - -lemma repGaugeGroupI_apply_of_H (g : GaugeGroupI) (a : Fin 2) : - repGaugeGroupI g [ComplexScalarGenerator.of .H a]ₛ = - ∑ b, (star (g.toU1.1 : ℂ) ^ 3 * star (g.toSU2.1 b a)) • [ComplexScalarGenerator.of .H b]ₛ := by - rw [repGaugeGroupI_apply_cScalar, ComplexScalarComponentSpace.repGaugeGroupI_apply_basis_of] - show (SymmetricAlgebra.ι ℂ _) - (∑ β : Fin 2, - ((HiggsVec.orthonormBasis.toBasis.repr ((HiggsVec.repGaugeGroupI g⁻¹) - (HiggsVec.orthonormBasis.toBasis β))) a) • - complexScalarComponentBasis (ComplexScalarGenerator.of ComplexScalarIrrep.H β)) - ⊗ₜ[ℂ] 1 = _ - simp only [HiggsVec.repGaugeGroupI_apply_basis, map_sum, map_smul, Finsupp.coe_finsetSum, - Finset.sum_apply, Finsupp.coe_smul, Pi.smul_apply, Basis.repr_self, smul_eq_mul, - Finsupp.single_apply] - simp [map_inv, ← Unitary.star_eq_inv, ← Matrix.star_eq_inv, Matrix.star_apply, - mul_ite, Finset.sum_ite_eq', ofFieldGenerators] - fin_cases a <;> simp [TensorProduct.add_tmul, ← TensorProduct.smul_tmul'] - -/-! - -## The Yukawa term for the lepton doublet, lepton singlet and Higgs field - --/ - -/-- The Yukawa term coupling the lepton doublet `L i`, the charged lepton - singlet `e j` and the Higgs field: `ε^{α β} (bar L i)_{α a} (e j)_β H_a`, - with the Lorentz indices of `bar L` and `e` contracted with the Weyl metric - and the weak isospin indices of `bar L` and `H` contracted directly. -/ -def yukawaTermLeH (i j : Fin 3) : EFTLagrangianExclDeriv := - ∑ α, ∑ β, ∑ a, metricRaw α β • - ([FermionicGenerator.bar (.L i) (α, a)]ₑ * [FermionicGenerator.of (.e j) β]ₑ * - [ComplexScalarGenerator.of .H a]ₛ) - -lemma yukawaTermLeH_invariant (i j : Fin 3) : IsInvariant (yukawaTermLeH i j) := by - constructor - · intro Λ - have hdet : (starRingEnd ℂ) ((Λ⁻¹).1 0 0) * (starRingEnd ℂ) ((Λ⁻¹).1 1 1) - - (starRingEnd ℂ) ((Λ⁻¹).1 0 1) * (starRingEnd ℂ) ((Λ⁻¹).1 1 0) = 1 := by - have h : ((Λ⁻¹).1).det = 1 := Matrix.SpecialLinearGroup.det_coe Λ⁻¹ - rw [Matrix.det_fin_two] at h - simpa using congrArg (starRingEnd ℂ) h - simp only [yukawaTermLeH, metricRaw, Fin.isValue, Matrix.of_apply, Matrix.cons_val', - Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.empty_val', Matrix.cons_val_fin_one, - zero_smul, one_smul, zero_add, add_zero, map_add, map_smul, - repLorentzGroup_mul, repLorentzGroup_apply_bar_L, repLorentzGroup_apply_of_e, - repLorentzGroup_apply_of_H, Fin.sum_univ_two, add_mul, mul_add, smul_mul_assoc, - mul_smul_comm, RCLike.star_def] - match_scalars - all_goals first - | linear_combination hdet - | linear_combination -hdet - | linear_combination (2 : ℂ) * hdet - | linear_combination -(2 : ℂ) * hdet - | ring - · intro g - have hz6 : (g.toU1.1 : ℂ) ^ 6 * (starRingEnd ℂ) (g.toU1.1 : ℂ) ^ 6 = 1 := by - have hz : (g.toU1.1 : ℂ) * star (g.toU1.1 : ℂ) = 1 := (Unitary.mem_iff.mp g.toU1.2).2 - calc (g.toU1.1 : ℂ) ^ 6 * (starRingEnd ℂ) (g.toU1.1 : ℂ) ^ 6 - = ((g.toU1.1 : ℂ) * star (g.toU1.1 : ℂ)) ^ 6 := by rw [RCLike.star_def]; ring - _ = 1 := by rw [hz]; norm_num - have hE : ∀ b b' : Fin 2, - g.toSU2.1 b 0 * (starRingEnd ℂ) (g.toSU2.1 b' 0) + - g.toSU2.1 b 1 * (starRingEnd ℂ) (g.toSU2.1 b' 1) = if b = b' then 1 else 0 := by - intro b b' - have hh := Matrix.mem_unitaryGroup_iff.mp g.toSU2.2.1 - have h2 := congrArg (fun M : Matrix (Fin 2) (Fin 2) ℂ => M b b') hh - simpa [Matrix.mul_apply, Matrix.star_apply, Matrix.one_apply, Fin.sum_univ_two, - RCLike.star_def] using h2 - have hK : ∀ b b' : Fin 2, - (g.toU1.1 : ℂ) ^ 6 * (starRingEnd ℂ) (g.toU1.1 : ℂ) ^ 6 * - (g.toSU2.1 b 0 * (starRingEnd ℂ) (g.toSU2.1 b' 0) + - g.toSU2.1 b 1 * (starRingEnd ℂ) (g.toSU2.1 b' 1)) = if b = b' then 1 else 0 := by - intro b b' - rw [hz6, one_mul, hE] - have hK00 := hK 0 0 - have hK01 := hK 0 1 - have hK10 := hK 1 0 - have hK11 := hK 1 1 - rw [if_pos rfl] at hK00 hK11 - rw [if_neg (by decide)] at hK01 - rw [if_neg (by decide)] at hK10 - simp only [yukawaTermLeH, metricRaw, Fin.isValue, Matrix.of_apply, Matrix.cons_val', - Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.empty_val', Matrix.cons_val_fin_one, - zero_smul, one_smul, zero_add, add_zero, map_add, map_smul, - repGaugeGroupI_mul, repGaugeGroupI_apply_bar_L, repGaugeGroupI_apply_of_e, - repGaugeGroupI_apply_of_H, Fin.sum_univ_two, add_mul, mul_add, smul_mul_assoc, - mul_smul_comm, smul_smul, RCLike.star_def] - match_scalars - · linear_combination hK00 - · linear_combination hK10 - · linear_combination hK01 - · linear_combination hK11 - · linear_combination -hK00 - · linear_combination -hK10 - · linear_combination -hK01 - · linear_combination -hK11 - -/-! - -## Exclusivity of the `L`, `e`, `H` Yukawa term - -The submodule of the EFT lagrangian spanned by the terms with irrep content -`{bar L i, e j, H}` is spanned by the sixteen monomials -`[bar L i (α, a)]ₑ * [e j β]ₑ * [H c]ₛ`. We construct linear functionals -extracting the coefficient of each monomial, and use invariance under specific -group elements to show that any invariant element of this submodule is -proportional to `yukawaTermLeH`. - --/ - -/-- The index of a monomial in the `L`, `e`, `H` sector: the components - `(α, a)` of `bar L`, `β` of `e` and `c` of `H`. -/ -abbrev LEHIndex : Type := (Fin 2 × Fin 2) × Fin 2 × Fin 2 - -/-- The monomial `[bar L i (α, a)]ₑ * [e j β]ₑ * [H c]ₛ` of the `L`, `e`, `H` - sector associated with an index `((α, a), β, c)`. -/ -def lehMonomial (i j : Fin 3) (m : LEHIndex) : EFTLagrangianExclDeriv := - [FermionicGenerator.bar (.L i) m.1]ₑ * [FermionicGenerator.of (.e j) m.2.1]ₑ * - [ComplexScalarGenerator.of .H m.2.2]ₛ - -lemma yukawaTermLeH_eq_sum_lehMonomial (i j : Fin 3) : - yukawaTermLeH i j = ∑ α, ∑ β, ∑ a, metricRaw α β • lehMonomial i j ((α, a), β, a) := rfl - -lemma lehMonomial_eq_tmul (i j : Fin 3) (m : LEHIndex) : - lehMonomial i j m = - SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis (.of .H m.2.2)) ⊗ₜ[ℂ] - (ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.bar (.L i) m.1)) * - ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.of (.e j) m.2.1))) := by - simp [lehMonomial, ofFieldGenerators, Algebra.TensorProduct.tmul_mul_tmul] - -/-- The linear functional on the bosonic factor extracting the coefficient of - the degree-one monomial `SymmetricAlgebra.ι (complexScalarComponentBasis (.of .H c))`, - through the identification of the symmetric algebra with multivariate polynomials. -/ -def lehCoeffS (c : Fin 2) : ComplexScalarEFTExclDeriv →ₗ[ℂ] ℂ := - MvPolynomial.lcoeff ℂ (Finsupp.single (ComplexScalarGenerator.of .H c) 1) ∘ₗ - (SymmetricAlgebra.equivMvPolynomial complexScalarComponentBasis).toLinearMap - -lemma lehCoeffS_apply_ι (c c' : Fin 2) : - lehCoeffS c (SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis (.of .H c'))) = - if c' = c then 1 else 0 := by - simp only [lehCoeffS, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, - SymmetricAlgebra.equivMvPolynomial_ι_apply, MvPolynomial.lcoeff_apply, MvPolynomial.coeff_X] - simp only [Finsupp.single_eq_single_iff, ComplexScalarGenerator.of.injEq, one_ne_zero, - and_false, or_false, true_and] - split_ifs <;> simp_all - -/-- The linear functional on the fermionic factor extracting the coefficient of the - quadratic monomial `ι (bar L i (α, a)) * ι (e j β)`, built from the degree-two - alternating map given by the determinant of the pair of coordinate functionals. -/ -def lehCoeffE (i j : Fin 3) (α a β : Fin 2) : FermionicEFTExclDeriv →ₗ[ℂ] ℂ := - ExteriorAlgebra.liftAlternating fun n => - match n with - | 2 => (Matrix.detRowAlternating (n := Fin 2) (R := ℂ)).compLinearMap - (LinearMap.pi ![fermionicComponentBasis.coord (.bar (.L i) (α, a)), - fermionicComponentBasis.coord (.of (.e j) β)]) - | _ => 0 - -lemma lehCoeffE_apply_ι_mul_ι (i j : Fin 3) (α a β α' a' β' : Fin 2) : - lehCoeffE i j α a β (ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.bar (.L i) (α', a'))) * - ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.of (.e j) β'))) = - if (α', a') = (α, a) ∧ β' = β then 1 else 0 := by - have h2 : ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.bar (.L i) (α', a'))) * - ExteriorAlgebra.ι ℂ (fermionicComponentBasis (.of (.e j) β')) = - ExteriorAlgebra.ιMulti ℂ 2 ![fermionicComponentBasis (.bar (.L i) (α', a')), - fermionicComponentBasis (.of (.e j) β')] := by - simp [ExteriorAlgebra.ιMulti_apply] - rw [h2, lehCoeffE, ExteriorAlgebra.liftAlternating_apply_ιMulti] - simp only [AlternatingMap.compLinearMap_apply] - show Matrix.det _ = _ - rw [Matrix.det_fin_two] - simp only [LinearMap.pi_apply, Matrix.cons_val_zero, Matrix.cons_val_one, Basis.coord_apply, - Basis.repr_self, Finsupp.single_apply, Fin.isValue] - simp only [FermionicGenerator.bar.injEq, FermionicGenerator.of.injEq, heq_eq_eq, - reduceCtorEq, if_false, mul_zero, sub_zero, true_and] - split_ifs <;> simp_all - -/-- The linear functional on `EFTLagrangianExclDeriv` extracting the coefficient of - the monomial `lehMonomial i j m`. -/ -def lehCoeff (i j : Fin 3) (m : LEHIndex) : EFTLagrangianExclDeriv →ₗ[ℂ] ℂ := - (TensorProduct.lid ℂ ℂ).toLinearMap ∘ₗ - TensorProduct.map (lehCoeffS m.2.2) (lehCoeffE i j m.1.1 m.1.2 m.2.1) - -lemma lehCoeff_apply_lehMonomial (i j : Fin 3) (m m' : LEHIndex) : - lehCoeff i j m (lehMonomial i j m') = if m' = m then 1 else 0 := by - obtain ⟨⟨α, a⟩, β, c⟩ := m - obtain ⟨⟨α', a'⟩, β', c'⟩ := m' - rw [lehMonomial_eq_tmul] - simp only [lehCoeff, LinearMap.coe_comp, Function.comp_apply, TensorProduct.map_tmul, - LinearEquiv.coe_coe, TensorProduct.lid_tmul, lehCoeffS_apply_ι, lehCoeffE_apply_ι_mul_ι, - smul_eq_mul, Prod.mk.injEq] - split_ifs <;> simp_all - -lemma lehCoeff_apply_sum (i j : Fin 3) (f : LEHIndex → ℂ) (m : LEHIndex) : - lehCoeff i j m (∑ m', f m' • lehMonomial i j m') = f m := by - rw [map_sum] - simp [lehCoeff_apply_lehMonomial, mul_ite] - -lemma eq_sum_lehCoeff_of_mem_span (i j : Fin 3) (V : EFTLagrangianExclDeriv) - (hV : V ∈ Submodule.span ℂ (Set.range (lehMonomial i j))) : - V = ∑ m, lehCoeff i j m V • lehMonomial i j m := by - induction hV using Submodule.span_induction with - | mem x hx => - obtain ⟨m', rfl⟩ := hx - simp [lehCoeff_apply_lehMonomial, ite_smul, Finset.sum_ite_eq] - | zero => simp - | add x y hx hy ihx ihy => - conv_lhs => rw [ihx, ihy] - simp [map_add, add_smul, Finset.sum_add_distrib] - | smul c x hx ih => - conv_lhs => rw [ih] - simp [map_smul, smul_smul, Finset.smul_sum] - -def LEHSubModule (i j : Fin 3) : Submodule ℂ EFTLagrangianExclDeriv := - Submodule.span ℂ (termOfList '' {l | (Multiset.ofList l).map FieldGenerators.toIrrep = - [Irrep.barFermion (FermionIrrep.L i), Irrep.fermion (FermionIrrep.e j), - Irrep.cScalar ComplexScalarIrrep.H]}) - -lemma toIrrep_eq_barFermion_iff (g : FieldGenerators) (φ : FermionIrrep) : - g.toIrrep = Irrep.barFermion φ ↔ ∃ p, g = FieldGenerators.fermion (.bar φ p) := by - match g with - | .cScalar (.of φ' p) => simp [FieldGenerators.toIrrep] - | .cScalar (.bar φ' p) => simp [FieldGenerators.toIrrep] - | .fermion (.of φ' p) => simp [FieldGenerators.toIrrep] - | .fermion (.bar φ' p) => - simp only [FieldGenerators.toIrrep, Irrep.barFermion.injEq] - constructor - · intro h - subst h - exact ⟨p, rfl⟩ - · rintro ⟨p', h⟩ - simp only [FieldGenerators.fermion.injEq, FermionicGenerator.bar.injEq] at h - exact h.1 - -lemma toIrrep_eq_fermion_iff (g : FieldGenerators) (φ : FermionIrrep) : - g.toIrrep = Irrep.fermion φ ↔ ∃ p, g = FieldGenerators.fermion (.of φ p) := by - match g with - | .cScalar (.of φ' p) => simp [FieldGenerators.toIrrep] - | .cScalar (.bar φ' p) => simp [FieldGenerators.toIrrep] - | .fermion (.bar φ' p) => simp [FieldGenerators.toIrrep] - | .fermion (.of φ' p) => - simp only [FieldGenerators.toIrrep, Irrep.fermion.injEq] - constructor - · intro h - subst h - exact ⟨p, rfl⟩ - · rintro ⟨p', h⟩ - simp only [FieldGenerators.fermion.injEq, FermionicGenerator.of.injEq] at h - exact h.1 - -lemma toIrrep_eq_cScalar_iff (g : FieldGenerators) (φ : ComplexScalarIrrep) : - g.toIrrep = Irrep.cScalar φ ↔ ∃ p, g = FieldGenerators.cScalar (.of φ p) := by - match g with - | .cScalar (.bar φ' p) => simp [FieldGenerators.toIrrep] - | .fermion (.of φ' p) => simp [FieldGenerators.toIrrep] - | .fermion (.bar φ' p) => simp [FieldGenerators.toIrrep] - | .cScalar (.of φ' p) => - cases φ - cases φ' - simp only [FieldGenerators.toIrrep] - exact ⟨fun _ => ⟨p, rfl⟩, fun _ => trivial⟩ - -lemma exists_perm_of_mem_LEH_set (i j : Fin 3) (l : List FieldGenerators) - (hl : (Multiset.ofList l).map FieldGenerators.toIrrep = - ([Irrep.barFermion (FermionIrrep.L i), Irrep.fermion (FermionIrrep.e j), - Irrep.cScalar ComplexScalarIrrep.H] : Multiset Irrep)) : - ∃ m : LEHIndex, l.Perm [.fermion (.bar (.L i) m.1), .fermion (.of (.e j) m.2.1), - .cScalar (.of .H m.2.2)] := by - rw [show ([Irrep.barFermion (FermionIrrep.L i), Irrep.fermion (FermionIrrep.e j), - Irrep.cScalar ComplexScalarIrrep.H] : Multiset Irrep) = - Irrep.barFermion (FermionIrrep.L i) ::ₘ Irrep.fermion (FermionIrrep.e j) ::ₘ - {Irrep.cScalar ComplexScalarIrrep.H} from rfl] at hl - obtain ⟨g1, hg1m, hg1, h2⟩ := (Multiset.map_eq_cons _ _ _ _).mpr hl - obtain ⟨g2, hg2m, hg2, h3⟩ := (Multiset.map_eq_cons _ _ _ _).mpr h2 - obtain ⟨g3, h4, hg3⟩ := Multiset.map_eq_singleton.mp h3 - obtain ⟨p, rfl⟩ := (toIrrep_eq_barFermion_iff g1 _).mp hg1 - obtain ⟨q, rfl⟩ := (toIrrep_eq_fermion_iff g2 _).mp hg2 - obtain ⟨r, rfl⟩ := (toIrrep_eq_cScalar_iff g3 _).mp hg3 - refine ⟨(p, q, r), Multiset.coe_eq_coe.mp ?_⟩ - rw [← Multiset.cons_erase hg1m, ← Multiset.cons_erase hg2m, h4] - rfl - -lemma termOfList_canonical (i j : Fin 3) (m : LEHIndex) : - termOfList [.fermion (.bar (.L i) m.1), .fermion (.of (.e j) m.2.1), - .cScalar (.of .H m.2.2)] = lehMonomial i j m := by - simp [termOfList, lehMonomial, mul_assoc] - -lemma LEHSubModule_le_span (i j : Fin 3) : - LEHSubModule i j ≤ Submodule.span ℂ (Set.range (lehMonomial i j)) := by - rw [LEHSubModule] - refine Submodule.span_le.mpr ?_ - rintro x ⟨l, hl, rfl⟩ - obtain ⟨m, hperm⟩ := exists_perm_of_mem_LEH_set i j l hl - obtain ⟨c, hc, _⟩ := termOfList_perm hperm - rw [hc, termOfList_canonical] - exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨m, rfl⟩) - -/-! - -### Specific group elements used to constrain the coefficients - --/ - -/-- The diagonal Lorentz transformation `diag (2, 2⁻¹)`. -/ -def lorentzDiag : SL(2,ℂ) := ⟨!![2, 0; 0, 2⁻¹], by simp [Matrix.det_fin_two_of]⟩ - -/-- The off-diagonal Lorentz transformation `!![0, 1; -1, 0]`. -/ -def lorentzSwap : SL(2,ℂ) := ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ - -lemma lorentzDiag_inv_coe : (lorentzDiag⁻¹).1 = !![2⁻¹, 0; 0, 2] := by - rw [Matrix.SpecialLinearGroup.coe_inv] - ext a b - fin_cases a <;> fin_cases b <;> - simp [lorentzDiag, Matrix.adjugate_fin_two] - -lemma lorentzSwap_inv_coe : (lorentzSwap⁻¹).1 = !![0, -1; 1, 0] := by - rw [Matrix.SpecialLinearGroup.coe_inv] - ext a b - fin_cases a <;> fin_cases b <;> - simp [lorentzSwap, Matrix.adjugate_fin_two] - -/-- The gauge transformation with `SU(2)` part `diag (I, -I)`. -/ -def gaugeDiag : GaugeGroupI := - (1, ⟨!![I, 0; 0, -I], by - rw [Matrix.mem_specialUnitaryGroup_iff] - constructor - · rw [Matrix.mem_unitaryGroup_iff] - ext a b - fin_cases a <;> fin_cases b <;> - simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, - Matrix.conjTranspose_apply] - · simp [Matrix.det_fin_two_of]⟩, 1) - -/-- The gauge transformation with `SU(2)` part `!![0, 1; -1, 0]`. -/ -def gaugeSwap : GaugeGroupI := - (1, ⟨!![0, 1; -1, 0], by - rw [Matrix.mem_specialUnitaryGroup_iff] - constructor - · rw [Matrix.mem_unitaryGroup_iff] - ext a b - fin_cases a <;> fin_cases b <;> - simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, - Matrix.conjTranspose_apply] - · simp [Matrix.det_fin_two_of]⟩, 1) - -lemma repLorentzGroup_lorentzDiag_lehMonomial (i j : Fin 3) (m : LEHIndex) : - repLorentzGroup lorentzDiag (lehMonomial i j m) = - ((![2⁻¹, 2] : Fin 2 → ℂ) m.1.1 * ![2⁻¹, 2] m.2.1) • lehMonomial i j m := by - obtain ⟨⟨α, a⟩, β, c⟩ := m - simp only [lehMonomial, repLorentzGroup_mul, repLorentzGroup_apply_bar_L, - repLorentzGroup_apply_of_e, repLorentzGroup_apply_of_H, lorentzDiag_inv_coe] - fin_cases α <;> fin_cases β <;> - simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, - smul_smul, Complex.conj_ofNat, one_smul] - -lemma repLorentzGroup_lorentzSwap_lehMonomial (i j : Fin 3) (m : LEHIndex) : - repLorentzGroup lorentzSwap (lehMonomial i j m) = - ((![-1, 1] : Fin 2 → ℂ) m.1.1 * ![-1, 1] m.2.1) • - lehMonomial i j ((![1, 0] m.1.1, m.1.2), ![1, 0] m.2.1, m.2.2) := by - obtain ⟨⟨α, a⟩, β, c⟩ := m - simp only [lehMonomial, repLorentzGroup_mul, repLorentzGroup_apply_bar_L, - repLorentzGroup_apply_of_e, repLorentzGroup_apply_of_H, lorentzSwap_inv_coe] - fin_cases α <;> fin_cases β <;> - simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, - smul_smul, mul_comm, one_smul] - -lemma repGaugeGroupI_gaugeDiag_lehMonomial (i j : Fin 3) (m : LEHIndex) : - repGaugeGroupI gaugeDiag (lehMonomial i j m) = - ((![I, -I] : Fin 2 → ℂ) m.1.2 * ![-I, I] m.2.2) • lehMonomial i j m := by - obtain ⟨⟨α, a⟩, β, c⟩ := m - simp only [lehMonomial, repGaugeGroupI_mul, repGaugeGroupI_apply_bar_L, - repGaugeGroupI_apply_of_e, repGaugeGroupI_apply_of_H] - have hU1 : (GaugeGroupI.toU1 gaugeDiag).1 = 1 := rfl - have hSU2 : (GaugeGroupI.toSU2 gaugeDiag).1 = !![I, 0; 0, -I] := rfl - rw [hU1, hSU2] - fin_cases a <;> fin_cases c <;> - simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, - smul_smul, mul_comm, neg_smul, one_smul] <;> - module - -lemma repGaugeGroupI_gaugeSwap_lehMonomial (i j : Fin 3) (m : LEHIndex) : - repGaugeGroupI gaugeSwap (lehMonomial i j m) = - ((![-1, 1] : Fin 2 → ℂ) m.1.2 * ![-1, 1] m.2.2) • - lehMonomial i j ((m.1.1, ![1, 0] m.1.2), m.2.1, ![1, 0] m.2.2) := by - obtain ⟨⟨α, a⟩, β, c⟩ := m - simp only [lehMonomial, repGaugeGroupI_mul, repGaugeGroupI_apply_bar_L, - repGaugeGroupI_apply_of_e, repGaugeGroupI_apply_of_H] - have hU1 : (GaugeGroupI.toU1 gaugeSwap).1 = 1 := rfl - have hSU2 : (GaugeGroupI.toSU2 gaugeSwap).1 = !![0, 1; -1, 0] := rfl - rw [hU1, hSU2] - fin_cases a <;> fin_cases c <;> - simp [Fin.sum_univ_two, smul_mul_assoc, mul_smul_comm, - smul_smul, mul_comm, one_smul] - -lemma yukawaTermLeH_exclusive (i j : Fin 3) - (V : EFTLagrangianExclDeriv) (hV : V ∈ LEHSubModule i j) - (hI : IsInvariant V) : ∃ (c : ℂ), V = c • yukawaTermLeH i j := by - have hVexp : V = ∑ m, lehCoeff i j m V • lehMonomial i j m := - eq_sum_lehCoeff_of_mem_span i j V (LEHSubModule_le_span i j hV) - -- The diagonal Lorentz transformation scales each monomial. - have hLD : ∀ m : LEHIndex, - lehCoeff i j m V * ((![2⁻¹, 2] : Fin 2 → ℂ) m.1.1 * ![2⁻¹, 2] m.2.1) = - lehCoeff i j m V := by - intro m - have h := congrArg (lehCoeff i j m) (hI.1 lorentzDiag) - conv at h => lhs; rw [hVexp] - simpa only [map_sum, map_smul, repLorentzGroup_lorentzDiag_lehMonomial, smul_smul, - lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero, - Finset.sum_ite_eq, Finset.sum_ite_eq', Finset.mem_univ, if_true] using h - -- The diagonal gauge transformation scales each monomial. - have hGD : ∀ m : LEHIndex, - lehCoeff i j m V * ((![I, -I] : Fin 2 → ℂ) m.1.2 * ![-I, I] m.2.2) = - lehCoeff i j m V := by - intro m - have h := congrArg (lehCoeff i j m) (hI.2 gaugeDiag) - conv at h => lhs; rw [hVexp] - simpa only [map_sum, map_smul, repGaugeGroupI_gaugeDiag_lehMonomial, smul_smul, - lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero, - Finset.sum_ite_eq, Finset.sum_ite_eq', Finset.mem_univ, if_true] using h - -- Coefficients with equal Lorentz indices vanish. - have hz00 : ∀ a c : Fin 2, lehCoeff i j ((0, a), 0, c) V = 0 := by - intro a c - have h := hLD ((0, a), 0, c) - simp only [Matrix.cons_val_zero] at h - linear_combination (-(4 : ℂ)/3) * h - have hz11 : ∀ a c : Fin 2, lehCoeff i j ((1, a), 1, c) V = 0 := by - intro a c - have h := hLD ((1, a), 1, c) - simp only [Matrix.cons_val_one, Matrix.cons_val_fin_one] at h - linear_combination ((1 : ℂ)/3) * h - -- Coefficients with different weak isospin indices vanish. - have hza01 : ∀ α β : Fin 2, lehCoeff i j ((α, 0), β, 1) V = 0 := by - intro α β - have h := hGD ((α, 0), β, 1) - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.cons_val_fin_one, Complex.I_mul_I] at h - linear_combination (-(1 : ℂ)/2) * h - have hza10 : ∀ α β : Fin 2, lehCoeff i j ((α, 1), β, 0) V = 0 := by - intro α β - have h := hGD ((α, 1), β, 0) - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, - Matrix.cons_val_fin_one, neg_mul_neg, Complex.I_mul_I] at h - linear_combination (-(1 : ℂ)/2) * h - -- The off-diagonal Lorentz transformation relates the two `ε` components. - have hr1 : lehCoeff i j ((1, 0), 0, 0) V = -lehCoeff i j ((0, 0), 1, 0) V := by - have h := congrArg (lehCoeff i j ((1, 0), 0, 0)) (hI.1 lorentzSwap) - conv at h => lhs; rw [hVexp] - simp only [map_sum, map_smul, repLorentzGroup_lorentzSwap_lehMonomial, smul_smul, - lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero] at h - simp only [Fintype.sum_prod_type, Fin.sum_univ_two, Matrix.cons_val_zero, - Matrix.cons_val_one, Matrix.cons_val_fin_one] at h - simp at h - linear_combination -h - have hr2 : lehCoeff i j ((1, 1), 0, 1) V = -lehCoeff i j ((0, 1), 1, 1) V := by - have h := congrArg (lehCoeff i j ((1, 1), 0, 1)) (hI.1 lorentzSwap) - conv at h => lhs; rw [hVexp] - simp only [map_sum, map_smul, repLorentzGroup_lorentzSwap_lehMonomial, smul_smul, - lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero] at h - simp only [Fintype.sum_prod_type, Fin.sum_univ_two, Matrix.cons_val_zero, - Matrix.cons_val_one, Matrix.cons_val_fin_one] at h - simp at h - linear_combination -h - -- The off-diagonal gauge transformation relates the two isospin components. - have hr3 : lehCoeff i j ((0, 1), 1, 1) V = lehCoeff i j ((0, 0), 1, 0) V := by - have h := congrArg (lehCoeff i j ((0, 1), 1, 1)) (hI.2 gaugeSwap) - conv at h => lhs; rw [hVexp] - simp only [map_sum, map_smul, repGaugeGroupI_gaugeSwap_lehMonomial, smul_smul, - lehCoeff_apply_lehMonomial, smul_eq_mul, mul_ite, mul_one, mul_zero] at h - simp only [Fintype.sum_prod_type, Fin.sum_univ_two, Matrix.cons_val_zero, - Matrix.cons_val_one, Matrix.cons_val_fin_one] at h - simp at h - linear_combination -h - -- Assemble. - refine ⟨lehCoeff i j ((0, 0), 1, 0) V, ?_⟩ - conv_lhs => rw [hVexp] - rw [yukawaTermLeH_eq_sum_lehMonomial] - simp only [Fintype.sum_prod_type, Fin.sum_univ_two] - rw [hr1, hr2, hr3] - simp only [hz00, hz11, hza01, hza10, zero_smul, add_zero, zero_add] - simp only [metricRaw, Matrix.of_apply, Matrix.cons_val', Matrix.cons_val_zero, - Matrix.cons_val_one, Matrix.empty_val', Matrix.cons_val_fin_one, - zero_smul, one_smul, add_zero, zero_add] - module -end EFTLagrangianExclDeriv - -end -end StandardModel diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean deleted file mode 100644 index 0db9aaf7b..000000000 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Basic.lean +++ /dev/null @@ -1,727 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan --/ -module - -public import Physlib.Relativity.Fermions.Weyl.Metric -public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis -public import Physlib.Mathematics.ConjModule -public import Physlib.Mathematics.MultisetsOfMassDim -public import Mathlib.RingTheory.GradedAlgebra.Basic -public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic -public import Mathlib.RingTheory.TensorProduct.Basic -public import Mathlib.RingTheory.TensorProduct.Maps -public import Mathlib.LinearAlgebra.CliffordAlgebra.Contraction -public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basis -public import Mathlib.Algebra.MvPolynomial.PDeriv -/-! - -# The Wess-Zumino EFT Lagrangian without derivatives - -## i. Overview - -The Wess-Zumino theory is a simple field theory consisting -of a single left-handed Weyl fermion and a single complex scalar field. -Sometimes the complex scalar field is replaced by a pair of real scalar fields. - -The theory is of physical interest, because it simple example of a theory -permitting a supersymmetry. In this file we don't consider the supersymmetric nature -of the theory. - --/ - -@[expose] public section - -namespace WessZumino -noncomputable section - -open Module Matrix -open MatrixGroups -open Complex -open TensorProduct -open CategoryTheory.MonoidalCategory -open Fermion - -/-! - -## Field specification - --/ - -/-! - -## The input data for Fermions - -For the Wess-Zumino theory there is a single left-handed Weyl fermion. - --/ - -/-- The irreducible representations of the fermion field - under the Lorentz group. -/ -inductive FermionIrrep - | ψ : FermionIrrep -deriving DecidableEq, Fintype - -def FermionIrrep.components : FermionIrrep → Type - | .ψ => Fin 2 - -instance : (φ : FermionIrrep) → Fintype (FermionIrrep.components φ) - | .ψ => inferInstanceAs (Fintype (Fin 2)) - -instance : (φ : FermionIrrep) → DecidableEq (FermionIrrep.components φ) - | .ψ => inferInstanceAs (DecidableEq (Fin 2)) - -def FermionIrrep.module : FermionIrrep → Type - | .ψ => LeftHandedWeyl - -instance : (φ : FermionIrrep) → AddCommGroup (FermionIrrep.module φ) - | .ψ => inferInstanceAs (AddCommGroup LeftHandedWeyl) - -instance : (φ : FermionIrrep) → Module ℂ (FermionIrrep.module φ) - | .ψ => inferInstanceAs (Module ℂ LeftHandedWeyl) - -def FermionIrrep.basis : (φ : FermionIrrep) → - Basis (FermionIrrep.components φ) ℂ (FermionIrrep.module φ) - | .ψ => LeftHandedWeyl.basis - -def FermionIrrep.rep : (φ : FermionIrrep) → Representation ℂ SL(2,ℂ) (FermionIrrep.module φ) - | .ψ => LeftHandedWeyl.rep - -/-! - -## Derived Fermionic quantities - -This are quantities whose form is independent of the specific theory -we are constructing. - --/ - -inductive FermionicGenerator - | of (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator - | bar (φ : FermionIrrep) (α : FermionIrrep.components φ) : FermionicGenerator -deriving DecidableEq, Fintype - -def FermionicGenerator.conjugate : FermionicGenerator → FermionicGenerator - | .of φ α => .bar φ α - | .bar φ α => .of φ α - -@[simp] -lemma FermionicGenerator.conjugate_conjugate (g : FermionicGenerator) : - g.conjugate.conjugate = g := by - cases g <;> rfl - -def fermionicGeneratorEquiv : FermionicGenerator ≃ - (Σ φ : FermionIrrep, FermionIrrep.components φ) ⊕ (Σ φ : FermionIrrep, FermionIrrep.components φ) where - toFun g := match g with - | .of φ α => Sum.inl ⟨φ, α⟩ - | .bar φ α => Sum.inr ⟨φ, α⟩ - invFun g := match g with - | Sum.inl ⟨φ, α⟩ => .of φ α - | Sum.inr ⟨φ, α⟩ => .bar φ α - left_inv g := by cases g <;> rfl - right_inv g := by cases g <;> rfl - -abbrev FermionicTargetSpace := Π (φ : FermionIrrep), FermionIrrep.module φ - -def FermionicTargetSpace.rep : Representation ℂ SL(2,ℂ) FermionicTargetSpace where - toFun Λ := LinearMap.piMap fun φ => FermionIrrep.rep φ Λ - map_one' := by - ext x i y - simp only [map_one, LinearMap.coe_comp, LinearMap.coe_piMap, LinearMap.coe_single, - Function.comp_apply, Pi.map_apply, Pi.single_eq_same, End.one_apply] - map_mul' Λ1 Λ2 := by - ext x i y - simp - -/-- The target space of the fermionic fields, including their conjugates. -/ -abbrev FermionicTargetSpaceWithComplex := FermionicTargetSpace × - ConjModule FermionicTargetSpace - -/-- The representation of the Lorentz group on the fermionic target space: - the irreps act componentwise on the product of their modules, and by the - conjugate action on the conjugate factor. -/ -def FermionicTargetSpaceWithComplex.rep : - Representation ℂ SL(2,ℂ) FermionicTargetSpaceWithComplex := - (FermionicTargetSpace.rep).prod (FermionicTargetSpace.rep.conj) - -abbrev FermionicComponentSpace := Module.Dual ℂ FermionicTargetSpaceWithComplex - -def FermionicComponentSpace.rep : Representation ℂ SL(2,ℂ) FermionicComponentSpace := - (FermionicTargetSpaceWithComplex.rep).dual - -def fermionicComponentBasis : Basis FermionicGenerator ℂ FermionicComponentSpace := - ((Pi.basis (fun φ => FermionIrrep.basis φ)).prod - ((Pi.basis (fun φ => FermionIrrep.basis φ)).conj)).dualBasis.reindex fermionicGeneratorEquiv.symm - -abbrev FermionicEFTExclDeriv := ExteriorAlgebra ℂ FermionicComponentSpace - -def FermionicEFTExclDeriv.rep : Representation ℂ SL(2,ℂ) FermionicEFTExclDeriv where - toFun Λ := (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ)).toLinearMap - map_one' := by - simp only [map_one, End.one_eq_id, ExteriorAlgebra.map_id, - AlgHom.toLinearMap_id] - map_mul' Λ1 Λ2 := by - simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - - -/-! - -## The input data for the complex scalar fields - --/ - - -set_option linter.constructorNameAsVariable false - -inductive ComplexScalarIrrep - | φ : ComplexScalarIrrep -deriving DecidableEq, Fintype - -def ComplexScalarIrrep.components : ComplexScalarIrrep → Type - | .φ => Fin 1 - -instance : (φ : ComplexScalarIrrep) → Fintype (ComplexScalarIrrep.components φ) - | .φ => inferInstanceAs (Fintype (Fin 1)) - -instance : (φ : ComplexScalarIrrep) → DecidableEq (ComplexScalarIrrep.components φ) - | .φ => inferInstanceAs (DecidableEq (Fin 1)) - -def ComplexScalarIrrep.module : ComplexScalarIrrep → Type - | .φ => ℂ - -instance : (φ : ComplexScalarIrrep) → AddCommGroup (ComplexScalarIrrep.module φ) - | .φ => inferInstanceAs (AddCommGroup ℂ) - -instance : (φ : ComplexScalarIrrep) → Module ℂ (ComplexScalarIrrep.module φ) - | .φ => inferInstanceAs (Module ℂ ℂ) - -def ComplexScalarIrrep.basis : (φ : ComplexScalarIrrep) → - Basis (ComplexScalarIrrep.components φ) ℂ (ComplexScalarIrrep.module φ) - | .φ => Basis.singleton (Fin 1) ℂ - -def ComplexScalarIrrep.rep : (φ : ComplexScalarIrrep) → Representation ℂ SL(2,ℂ) (ComplexScalarIrrep.module φ) - | .φ => Representation.trivial ℂ SL(2,ℂ) ℂ - -/-! - -## Derived Complex Scalar quantities - --/ - -inductive ComplexScalarGenerator - | of (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator - | bar (ϕ : ComplexScalarIrrep) (α : ComplexScalarIrrep.components ϕ) : ComplexScalarGenerator -deriving DecidableEq, Fintype - -def ComplexScalarGenerator.conjugate : ComplexScalarGenerator → ComplexScalarGenerator - | .of φ α => .bar φ α - | .bar φ α => .of φ α - -@[simp] -lemma ComplexScalarGenerator.conjugate_conjugate (g : ComplexScalarGenerator) : - g.conjugate.conjugate = g := by - cases g <;> rfl - -def complexScalarGeneratorEquiv : ComplexScalarGenerator ≃ - (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) ⊕ - (Σ φ : ComplexScalarIrrep, ComplexScalarIrrep.components φ) where - toFun g := match g with - | .of φ α => Sum.inl ⟨φ, α⟩ - | .bar φ α => Sum.inr ⟨φ, α⟩ - invFun g := match g with - | Sum.inl ⟨φ, α⟩ => .of φ α - | Sum.inr ⟨φ, α⟩ => .bar φ α - left_inv g := by cases g <;> rfl - right_inv g := by cases g <;> rfl - -abbrev ComplexScalarTargetSpace := Π (φ : ComplexScalarIrrep), ComplexScalarIrrep.module φ - -def ComplexScalarTargetSpace.rep : Representation ℂ SL(2,ℂ) ComplexScalarTargetSpace where - toFun Λ := LinearMap.piMap fun φ => ComplexScalarIrrep.rep φ Λ - map_one' := by - ext1 x - apply LinearMap.ext - intro i - ext y - simp - map_mul' Λ1 Λ2 := by - ext1 x - apply LinearMap.ext - intro i - ext y - simp - -/-- The target space of the fermionic fields, including their conjugates. -/ -abbrev ComplexScalarTargetSpaceWithComplex := ComplexScalarTargetSpace × - ConjModule ComplexScalarTargetSpace - -/-- The representation of the Lorentz group on the fermionic target space: - the irreps act componentwise on the product of their modules, and by the - conjugate action on the conjugate factor. -/ -def ComplexScalarTargetSpaceWithComplex.rep : - Representation ℂ SL(2,ℂ) ComplexScalarTargetSpaceWithComplex := - (ComplexScalarTargetSpace.rep).prod (ComplexScalarTargetSpace.rep.conj) - -abbrev ComplexScalarComponentSpace := Module.Dual ℂ ComplexScalarTargetSpaceWithComplex - -def ComplexScalarComponentSpace.rep : Representation ℂ SL(2,ℂ) ComplexScalarComponentSpace := - (ComplexScalarTargetSpaceWithComplex.rep).dual - -def complexScalarComponentBasis : Basis ComplexScalarGenerator ℂ ComplexScalarComponentSpace := - ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).prod - ((Pi.basis (fun φ => ComplexScalarIrrep.basis φ)).conj)).dualBasis.reindex complexScalarGeneratorEquiv.symm - -abbrev ComplexScalarEFTExclDeriv := SymmetricAlgebra ℂ ComplexScalarComponentSpace - -TODO "Define ComplexScalarEFTExclDeriv.rep" - -def ComplexScalarEFTExclDeriv.rep : Representation ℂ SL(2,ℂ) ComplexScalarEFTExclDeriv where - toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' Λ1 Λ2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep (Λ1 * Λ2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ2)) by - rw [h]; rfl - ext v - simp - -/-! - -## The field generators - --/ - -inductive FieldGenerators - | cScalar (_ : ComplexScalarGenerator) : FieldGenerators - | fermion (_ : FermionicGenerator) : FieldGenerators -deriving DecidableEq, Fintype - -def FieldGenerators.IsFermion : FieldGenerators → Bool - | .cScalar _ => False - | .fermion _ => True - -def FieldGenerators.IsBoson : FieldGenerators → Bool - | .cScalar _ => True - | .fermion _ => False - -def FieldGenerators.conjugate : FieldGenerators → FieldGenerators - | .cScalar g => .cScalar g.conjugate - | .fermion g => .fermion g.conjugate - -@[simp] -lemma FieldGenerators.conjugate_conjugate (ϕ : FieldGenerators) : - ϕ.conjugate.conjugate = ϕ := by - cases ϕ <;> simp [conjugate] - -def fieldGeneratorsEquiv : FieldGenerators ≃ - ComplexScalarGenerator ⊕ FermionicGenerator where - toFun g := match g with - | .cScalar g => Sum.inl g - | .fermion g => Sum.inr g - invFun g := match g with - | Sum.inl g => .cScalar g - | Sum.inr g => .fermion g - left_inv g := by cases g <;> rfl - right_inv g := by cases g <;> rfl - -@[simp] -lemma FieldGenerators.cScalar_isFermion (ϕ : ComplexScalarGenerator) : - (cScalar ϕ).IsFermion = False := by simp [IsFermion] - -@[simp] -lemma FieldGenerators.fermion_isFermion (ϕ : FermionicGenerator) : - (fermion ϕ).IsFermion = True := by simp [IsFermion] - -@[simp] -lemma FieldGenerators.cScalar_isBoson (ϕ : ComplexScalarGenerator) : - (cScalar ϕ).IsBoson = True := by simp [IsBoson] - -@[simp] -lemma FieldGenerators.fermion_isBoson (ϕ : FermionicGenerator) : - (fermion ϕ).IsBoson = False := by simp [IsBoson] - -/-! - -## A. The EFT lagrangian without derivatives - --/ - -/-- The algebra corresponding to the EFT lagrangian excluding - derivative terms for the Wess-Zumino theory: the free supercommutative algebra - on the bosonic and fermionic generators, i.e. the tensor product of the symmetric - algebra on the bosonic duals with the exterior algebra on the fermionic duals. -/ -abbrev EFTLagrangianExclDeriv : Type := - -- bosonic part of the lagrangian - ComplexScalarEFTExclDeriv ⊗[ℂ] - -- fermionic part of the lagrangian - FermionicEFTExclDeriv - -namespace EFTLagrangianExclDeriv - -/-! - -## B. Invariance under the group actions - --/ - -/-! - -### B.1. The representation of the Lorentz group - --/ - -/-- The representation of the Lorentz group on `EFTLagrangianExclDeriv`. -/ -def rep : Representation ℂ SL(2,ℂ) EFTLagrangianExclDeriv := - (ComplexScalarEFTExclDeriv.rep).tprod (FermionicEFTExclDeriv.rep) - -lemma rep_mul (Λ : SL(2,ℂ)) (V W : EFTLagrangianExclDeriv) : - rep Λ (V * W) = rep Λ V * rep Λ W := - map_mul (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)) - (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ))) V W - -@[simp] -lemma rep_one (Λ : SL(2,ℂ)) : - rep Λ 1 = 1 := - map_one (Algebra.TensorProduct.map - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarComponentSpace.rep Λ)) - (ExteriorAlgebra.map (FermionicComponentSpace.rep Λ))) - -/-! - -### B.2. The condition for invariance - --/ - -def IsInvariant (V : EFTLagrangianExclDeriv) : Prop := - (∀ (Λ : SL(2,ℂ)), rep Λ V = V) - -@[simp] -lemma IsInvariant.zero : IsInvariant 0 := by - simp [IsInvariant] - -lemma IsInvariant.add {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V + W) := by - simp_all [IsInvariant] - -lemma IsInvariant.smul {V : EFTLagrangianExclDeriv} (c : ℂ) (hV : IsInvariant V) : - IsInvariant (c • V) := by - simp_all [IsInvariant] - -lemma IsInvariant.mul {V W : EFTLagrangianExclDeriv} (hV : IsInvariant V) (hW : IsInvariant W) : - IsInvariant (V * W) := by - simp_all [IsInvariant, rep_mul] - -@[simp] -lemma IsInvariant.one : IsInvariant 1 := by - simp [IsInvariant] - -/-! - -## The elements of the EFT generated by the field generators - -Every element of the Field generators gives an element in the -type of EFT lagragians. - --/ -/-- The elements of `EFTLagrangianExclDeriv` associated with - the `FieldGenerators`. -/ -def ofFieldGenerators : FieldGenerators → EFTLagrangianExclDeriv - | .cScalar φ => SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis φ) ⊗ₜ 1 - | .fermion ψ => 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis ψ) - -scoped notation "[" v "]ₐ" => ofFieldGenerators v -scoped notation "[" v "]ₛ" => ofFieldGenerators (FieldGenerators.cScalar v) -scoped notation "[" v "]ₑ" => ofFieldGenerators (FieldGenerators.fermion v) - -lemma ofFieldGenerators_cScalar_exists (ϕ : ComplexScalarGenerator) : - ∃ x, [ϕ]ₛ = SymmetricAlgebra.ι ℂ _ x ⊗ₜ 1 := - ⟨complexScalarComponentBasis ϕ, rfl⟩ - -lemma ofFieldGenerators_fermion_exists (ψ : FermionicGenerator) : - ∃ x, [ψ]ₑ = 1 ⊗ₜ ExteriorAlgebra.ι ℂ x := - ⟨fermionicComponentBasis ψ, rfl⟩ - -lemma cScalar_comm_cScalar (φ₁ φ₂ : ComplexScalarGenerator) : - [φ₁]ₛ * [φ₂]ₛ = [φ₂]ₛ * [φ₁]ₛ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists φ₁ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists φ₂ - simp [h1, h2, mul_comm] - -lemma cScalar_comm_fermion (ϕ : ComplexScalarGenerator) (ψ : FermionicGenerator) : - [ϕ]ₛ * [ψ]ₑ = [ψ]ₑ * [ϕ]ₛ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_cScalar_exists ϕ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ - simp [h1, h2, mul_comm] - -lemma cScalar_comm (V : EFTLagrangianExclDeriv) (ϕ : ComplexScalarGenerator) : - [ϕ]ₛ * V = V * [ϕ]ₛ := by - obtain ⟨x, h⟩ := ofFieldGenerators_cScalar_exists ϕ - induction V using TensorProduct.induction_on with - | zero => simp - | tmul a b => simp [h, mul_comm] - | add x y hx hy => simp [mul_add, add_mul, hx, hy] - -lemma fermion_comm_cScalar (ψ : FermionicGenerator) (ϕ : ComplexScalarGenerator) : - [ψ]ₑ * [ϕ]ₛ = [ϕ]ₛ * [ψ]ₑ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_cScalar_exists ϕ - simp [h1, h2] - -lemma fermion_anticomm_fermion (ψ₁ ψ₂ : FermionicGenerator) : - [ψ₁]ₑ * [ψ₂]ₑ = - [ψ₂]ₑ * [ψ₁]ₑ := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ - rw [h1, h2, ← TensorProduct.tmul_neg, Algebra.TensorProduct.tmul_mul_tmul, - Algebra.TensorProduct.tmul_mul_tmul] - congr 1 - rw [neg_mul, eq_neg_iff_add_eq_zero] - exact ExteriorAlgebra.ι_add_mul_swap x₁ x₂ - -@[simp] -lemma fermion_mul_self (ψ : FermionicGenerator) : [ψ]ₑ * [ψ]ₑ = 0 := by - obtain ⟨x, h⟩ := ofFieldGenerators_fermion_exists ψ - simp [h] - -lemma ofFieldGenerators_comm (ϕ₁ ϕ₂ : FieldGenerators) : - ∃ c : ℂ, [ϕ₁]ₐ * [ϕ₂]ₐ = c • [ϕ₂]ₐ * [ϕ₁]ₐ ∧ (c = 1 ∨ c = -1) := by - match ϕ₁, ϕ₂ with - | .cScalar φ₁, .cScalar φ₂ => exact ⟨1, by simp [cScalar_comm_cScalar]⟩ - | .cScalar _, .fermion ψ => exact ⟨1, by simp [cScalar_comm_fermion]⟩ - | .fermion ψ, .cScalar _ => exact ⟨1, by simp [fermion_comm_cScalar]⟩ - |.fermion ψ₁, .fermion ψ₂ => - exact ⟨-1, by rw [fermion_anticomm_fermion]; abel, by simp⟩ - -/-! - -## The lift of a map from the field generators to an algebra homomorphism - --/ - -open scoped IsMulCommutative in -/-- The algebra map `EFTLagrangianExclDeriv →ₐ[ℂ] A` determined by the images `F g` of - the field generators: the images of the bosonic generators pairwise commute and - commute with the images of the fermionic generators, which pairwise anticommute. - The bosonic factor lifts through the commutative subalgebra generated by the - bosonic images. -/ -def lift {A : Type} [Ring A] [Algebra ℂ A] (F : FieldGenerators → A) - (hBB : ∀ g g', Commute (F (.cScalar g)) (F (.cScalar g'))) - (hBF : ∀ g g', Commute (F (.cScalar g)) (F (.fermion g'))) - (hFF : ∀ g g', F (.fermion g) * F (.fermion g') = - (F (.fermion g') * F (.fermion g))) : - EFTLagrangianExclDeriv →ₐ[ℂ] A := - let FB : ComplexScalarGenerator → A := fun g => F (.cScalar g) - let FF : FermionicGenerator → A := fun g => F (.fermion g) - have hFF : ∀ g g', FF g * FF g' = - (FF g' * FF g) := hFF - haveI : IsMulCommutative (Algebra.adjoin ℂ (Set.range FB)) := - Algebra.isMulCommutative_adjoin ℂ (by rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩; exact hBB g g') - let fS : ComplexScalarEFTExclDeriv →ₐ[ℂ] Algebra.adjoin ℂ (Set.range FB) := - SymmetricAlgebra.lift (complexScalarComponentBasis.constr ℂ fun g => - ⟨FB g, Algebra.subset_adjoin ⟨g, rfl⟩⟩) - Algebra.TensorProduct.lift - ((Algebra.adjoin ℂ (Set.range FB)).val.comp fS) - (ExteriorAlgebra.lift ℂ - ⟨fermionicComponentBasis.constr ℂ FF, fun v => by - have hdiag : ∀ g, FF g * FF g = 0 := fun g => by - simpa [← two_smul ℂ] using eq_neg_iff_add_eq_zero.mp (hFF g g) - rw [Basis.constr_apply_fintype, Finset.sum_mul_sum, ← Fintype.sum_prod_type'] - exact Finset.sum_involution (fun p _ => (p.2, p.1)) - (fun p _ => by rw [smul_mul_smul_comm, smul_mul_smul_comm, hFF p.1 p.2]; module) - (fun p _ hf hswap => hf (by rw [show p.2 = p.1 from (Prod.ext_iff.mp hswap).1, - smul_mul_smul_comm, hdiag, smul_zero])) - (fun p _ => Finset.mem_univ _) (fun p _ => rfl)⟩) - (fun x y => by - refine (Algebra.commute_of_mem_adjoin_of_forall_mem_commute (fS x).2 ?_).symm - rintro _ ⟨g, rfl⟩ - induction y using ExteriorAlgebra.induction with - | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commutes r _ - | ι v => - rw [ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] - exact Commute.sum_left _ _ _ fun g' _ => (hBF g g').symm.smul_left _ - | mul u w hu hw => rw [map_mul]; exact hu.mul_left hw - | add u w hu hw => rw [map_add]; exact hu.add_left hw) - -/-! - -## The elements generated by lists of field generators - --/ - -/-- The element of `EFTLagrangianExclDeriv` generated from a list of field generators. -/ -def termOfList (l : List FieldGenerators) : EFTLagrangianExclDeriv := - (l.map ofFieldGenerators).prod - -lemma termOfList_cons (ψ : FieldGenerators) (l : List FieldGenerators) : - termOfList (ψ :: l) = [ψ]ₐ * termOfList l := by simp [termOfList] - -lemma termOfList_nil : termOfList [] = 1 := by simp [termOfList] - -lemma termOfList_append (l1 l2 : List FieldGenerators) : - termOfList (l1 ++ l2) = termOfList l1 * termOfList l2 := by - simp [termOfList] - -lemma termOfList_perm {l1 l2 : List FieldGenerators} (h : l1.Perm l2) : - ∃ c : ℂ, termOfList l1 = c • termOfList l2 ∧ (c = 1 ∨ c = -1) := by - induction h with - | nil => exact ⟨1, by simp⟩ - | cons x _ ih => - obtain ⟨c, hc1, hc2⟩ := ih - exact ⟨c, by rw [termOfList_cons, termOfList_cons, hc1, mul_smul_comm], hc2⟩ - | swap x y l => - obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm y x - refine ⟨c, ?_⟩ - rw [termOfList_cons, termOfList_cons, termOfList_cons, termOfList_cons, ← mul_assoc] - simp [hc1, mul_assoc, smul_mul_assoc] - exact hc2 - | trans _ _ ih1 ih2 => - obtain ⟨c1, hc1, hc1'⟩ := ih1 - obtain ⟨c2, hc2, hc2'⟩ := ih2 - exact ⟨c1 * c2, by rw [hc1, hc2, smul_smul], by grind⟩ - -lemma fermion_mul_termOfList_of_mem (ψ : FermionicGenerator) (l : List FieldGenerators) - (hψ : .fermion ψ ∈ l) : [ψ]ₑ * termOfList l = 0 := by - induction l with - | nil => simp at hψ - | cons β t ih => - rcases List.mem_cons.mp hψ with rfl | ha - · simp [termOfList_cons, ← mul_assoc] - · obtain ⟨c, hc1, hc2⟩ := ofFieldGenerators_comm (.fermion ψ) β - simp [termOfList_cons, ← mul_assoc, hc1] - simp [mul_assoc, ih ha] - -lemma termOfList_filter_isBoson_comm (l : List FieldGenerators) (V : EFTLagrangianExclDeriv) : - termOfList (l.filter FieldGenerators.IsBoson) * V = - V * termOfList (l.filter FieldGenerators.IsBoson) := by - induction l with - | nil => simp [termOfList] - | cons ψ t ih => - match ψ with - | .cScalar ϕ => - simp [termOfList_cons, cScalar_comm, mul_assoc] - simp [← mul_assoc, ih] - | .fermion ψ => simpa using ih - -lemma termOfList_eq_isBoson_mul_isFermion (l : List FieldGenerators) : - termOfList l = termOfList (l.filter FieldGenerators.IsBoson) * - termOfList (l.filter FieldGenerators.IsFermion) := by - induction l with - | nil => simp [termOfList] - | cons ψ t ih => - match ψ with - | .cScalar ϕ => simp [termOfList_cons, ih, mul_assoc] - | .fermion ψ => - simp [termOfList_cons, ih, ← mul_assoc, termOfList_filter_isBoson_comm] - simp [mul_assoc, termOfList_filter_isBoson_comm] - -lemma termOfList_reverse_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} - (h : termOfList l1 = c • termOfList l2) : - termOfList l1.reverse = c • termOfList l2.reverse := by - let r : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv := - TensorProduct.map LinearMap.id CliffordAlgebra.reverse - have hmul : ∀ x y : EFTLagrangianExclDeriv, r (x * y) = r y * r x := by - intro x y - induction x using TensorProduct.induction_on with - | zero => simp - | tmul a b => - induction y using TensorProduct.induction_on with - | zero => simp - | tmul a' b' => - simp [r, CliffordAlgebra.reverse.map_mul, mul_comm] - | add y₁ y₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] - | add x₁ x₂ h₁ h₂ => simp [mul_add, add_mul, h₁, h₂] - have hgen : ∀ ψ : FieldGenerators, r [ψ]ₐ = [ψ]ₐ := by - rintro (ϕ | ψ) <;> simp [r, ofFieldGenerators, CliffordAlgebra.reverse_ι] - have hf : ∀ l : List FieldGenerators, r (termOfList l) = termOfList l.reverse := by - intro l - induction l with - | nil => simp [r, termOfList_nil, Algebra.TensorProduct.one_def] - | cons ψ t ih => - rw [termOfList_cons, hmul, ih, hgen, List.reverse_cons, termOfList_append] - simp [termOfList] - rw [← hf, ← hf, h, map_smul] - -lemma termOfList_conjugate_eq_of_eq {l1 l2 : List FieldGenerators} {c : ℂ} - (h : termOfList l1 = c • termOfList l2) : - termOfList (l1.map FieldGenerators.conjugate) = - c • termOfList (l2.map FieldGenerators.conjugate) := by - -- Conjugation of generators induces an algebra endomorphism, acting on each - -- tensor factor by the basis permutation `g ↦ g.conjugate`. - let f : EFTLagrangianExclDeriv →ₐ[ℂ] EFTLagrangianExclDeriv := - Algebra.TensorProduct.map - (SymmetricAlgebra.lift (SymmetricAlgebra.ι ℂ _ ∘ₗ - complexScalarComponentBasis.constr ℂ fun g => complexScalarComponentBasis g.conjugate)) - (ExteriorAlgebra.map (fermionicComponentBasis.constr ℂ fun g => - fermionicComponentBasis g.conjugate)) - have hgen : ∀ g : FieldGenerators, f [g]ₐ = [g.conjugate]ₐ := by - rintro (g | g) <;> - simp [f, ofFieldGenerators, FieldGenerators.conjugate, ExteriorAlgebra.map_apply_ι] - have hf : ∀ l : List FieldGenerators, - f (termOfList l) = termOfList (l.map FieldGenerators.conjugate) := by - intro l - induction l with - | nil => simp [termOfList_nil] - | cons g t ih => rw [termOfList_cons, map_mul, ih, hgen, List.map_cons, termOfList_cons] - rw [← hf, ← hf, h, map_smul] - -/-- The elements of type `termOfList` span `EFTLagrangianExclDeriv`. -/ -lemma mem_termOfList_span (V : EFTLagrangianExclDeriv) : - V ∈ Submodule.span ℂ (Set.range termOfList) := by - have hmul_mem : ∀ x y : EFTLagrangianExclDeriv, - x ∈ Submodule.span ℂ (Set.range termOfList) → - y ∈ Submodule.span ℂ (Set.range termOfList) → - x * y ∈ Submodule.span ℂ (Set.range termOfList) := fun x y hx hy => by - have h := Submodule.mul_mem_mul hx hy - rw [Submodule.span_mul_span] at h - refine Submodule.span_mono ?_ h - rintro _ ⟨_, ⟨l1, rfl⟩, _, ⟨l2, rfl⟩, rfl⟩ - exact ⟨l1 ++ l2, termOfList_append l1 l2⟩ - have hgen : ∀ g : FieldGenerators, [g]ₐ ∈ Submodule.span ℂ (Set.range termOfList) := - fun g => Submodule.subset_span ⟨[g], by simp [termOfList]⟩ - induction V using TensorProduct.induction_on with - | zero => exact Submodule.zero_mem _ - | add x y hx hy => exact Submodule.add_mem _ hx hy - | tmul a b => - -- The bosonic factor: `a ⊗ₜ 1` lies in the span. - have h1 : (a ⊗ₜ[ℂ] 1 : EFTLagrangianExclDeriv) ∈ - Submodule.span ℂ (Set.range termOfList) := by - induction a using SymmetricAlgebra.induction with - | algebraMap c => - simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, - TensorProduct.smul_tmul'] using - Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) - | ι x => - rw [← Basis.sum_repr complexScalarComponentBasis x, map_sum, TensorProduct.sum_tmul] - refine Submodule.sum_mem _ fun i _ => ?_ - rw [map_smul, ← TensorProduct.smul_tmul'] - exact Submodule.smul_mem _ _ (hgen (.cScalar i)) - | mul a₁ a₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ - | add a₁ a₂ h₁ h₂ => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ h₁ h₂ - -- The fermionic factor: `1 ⊗ₜ b` lies in the span. - have h2 : (1 ⊗ₜ[ℂ] b : EFTLagrangianExclDeriv) ∈ - Submodule.span ℂ (Set.range termOfList) := by - induction b using ExteriorAlgebra.induction with - | algebraMap c => - simpa [termOfList, Algebra.algebraMap_eq_smul_one, Algebra.TensorProduct.one_def, - TensorProduct.tmul_smul] using - Submodule.smul_mem _ c (Submodule.subset_span (Set.mem_range_self (f := termOfList) [])) - | ι x => - rw [← Basis.sum_repr fermionicComponentBasis x, map_sum, TensorProduct.tmul_sum] - refine Submodule.sum_mem _ fun i _ => ?_ - rw [map_smul, TensorProduct.tmul_smul] - exact Submodule.smul_mem _ _ (hgen (.fermion i)) - | mul b₁ b₂ h₁ h₂ => simpa using hmul_mem _ _ h₁ h₂ - | add b₁ b₂ h₁ h₂ => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ h₁ h₂ - simpa using hmul_mem _ _ h1 h2 - -end EFTLagrangianExclDeriv diff --git a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean b/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean deleted file mode 100644 index 412fd5e6d..000000000 --- a/Physlib/Particles/WessZumino/EFTLagrangianExclDeriv/Coeff.lean +++ /dev/null @@ -1,336 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Jinzheng Li, Nathaneal Sajan --/ -module - -public import Physlib.Particles.WessZumino.EFTLagrangianExclDeriv.Basic -/-! - -# The Wess-Zumino EFT Lagrangian without derivatives - -## i. Overview - -The Wess-Zumino theory is a simple field theory consisting -of a single left-handed Weyl fermion and a single complex scalar field. -Sometimes the complex scalar field is replaced by a pair of real scalar fields. - -The theory is of physical interest, because it simple example of a theory -permitting a supersymmetry. In this file we don't consider the supersymmetric nature -of the theory. - --/ - -@[expose] public section - -namespace WessZumino -namespace EFTLagrangianExclDeriv -noncomputable section - -open Module Matrix -open MatrixGroups -open Complex -open TensorProduct -open CategoryTheory.MonoidalCategory -open Fermion - -/-! - -## The coefficent associated with a multiset of field generators - - - -The below is AI slop, but it shows a useful way od defining the coefficent. - --/ - -def CoeffSubmodule (s : Multiset FieldGenerators) : Submodule ℂ EFTLagrangianExclDeriv := - Submodule.span ℂ (termOfList '' {l | Multiset.ofList l = s}) - - - - -instance : SetLike.GradedMonoid CoeffSubmodule where - one_mem := by simp [CoeffSubmodule, termOfList_nil] - mul_mem s1 s2 V1 V2 hV1 hV2 := by - have h := Submodule.mul_mem_mul hV1 hV2 - rw [CoeffSubmodule, CoeffSubmodule, Submodule.span_mul_span] at h - refine Submodule.span_mono ?_ h - rintro _ ⟨_, ⟨l1, hl1, rfl⟩, _, ⟨l2, hl2, rfl⟩, rfl⟩ - exact ⟨l1 ++ l2, by subst hl1; subst hl2; rfl, termOfList_append l1 l2⟩ - -open DirectSum - -namespace CoeffSubmodule - -/-- Transport `DirectSum.of` along an equality of degrees: two homogeneous components with - equal degrees and equal underlying values are equal. -/ -lemma of_eq {s t : Multiset FieldGenerators} (h : s = t) - {x : CoeffSubmodule s} {y : CoeffSubmodule t} - (hxy : (x : EFTLagrangianExclDeriv) = y) : - DirectSum.of (fun u => CoeffSubmodule u) s x = DirectSum.of (fun u => CoeffSubmodule u) t y := by - subst h - exact congrArg _ (Subtype.ext hxy) - -/-- The class of `termOfList l` in the direct sum of the coefficient submodules, placed - in degree `↑l`. Note that the membership proof is definitional. -/ -def ofList (l : List FieldGenerators) : ⨁ s, CoeffSubmodule s := - DirectSum.of (fun s => CoeffSubmodule s) ↑l - ⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ - -lemma ofList_nil : ofList [] = 1 := by - simp [ofList, termOfList_nil] - rfl - -lemma ofList_append (l₁ l₂ : List FieldGenerators) : - ofList (l₁ ++ l₂) = ofList l₁ * ofList l₂ := by - rw [ofList, ofList, ofList, DirectSum.of_mul_of] - exact of_eq rfl (by rw [SetLike.coe_gMul]; exact termOfList_append l₁ l₂) - - -/-- The image of a generator in the direct sum of the coefficient submodules, - placed in degree `{g}`. -/ -def ofGenerator (g : FieldGenerators) : ⨁ s, CoeffSubmodule s := ofList [g] - -lemma ofGenerator_comm {g₁ g₂ : FieldGenerators} (h : [g₁]ₐ * [g₂]ₐ = [g₂]ₐ * [g₁]ₐ) : - ofGenerator g₁ * ofGenerator g₂ = ofGenerator g₂ * ofGenerator g₁ := by - rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] - exact of_eq (Multiset.cons_swap g₁ g₂ 0) (by simp [termOfList, h]) - -lemma fermion_mul_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : - [ψ₁]ₑ * [ψ₂]ₑ + [ψ₂]ₑ * [ψ₁]ₑ = 0 := by - obtain ⟨x₁, h1⟩ := ofFieldGenerators_fermion_exists ψ₁ - obtain ⟨x₂, h2⟩ := ofFieldGenerators_fermion_exists ψ₂ - rw [h1, h2, Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, - ← TensorProduct.tmul_add] - simp - -lemma ofList_eq_zero {l : List FieldGenerators} (h : termOfList l = 0) : ofList l = 0 := by - have hx : (⟨termOfList l, Submodule.subset_span ⟨l, rfl, rfl⟩⟩ : CoeffSubmodule ↑l) = 0 := - Subtype.ext h - rw [ofList, hx, map_zero] - -/-- Two `termOfList` classes with the same field content sum to zero as soon as the - underlying terms do. -/ -lemma ofList_add_ofList {l₁ l₂ : List FieldGenerators} - (hp : (↑l₂ : Multiset FieldGenerators) = ↑l₁) - (h : termOfList l₁ + termOfList l₂ = 0) : ofList l₁ + ofList l₂ = 0 := by - have h2 : ofList l₂ = DirectSum.of (fun u => CoeffSubmodule u) ↑l₁ - ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ := of_eq hp rfl - have hsum : (⟨termOfList l₁, Submodule.subset_span ⟨l₁, rfl, rfl⟩⟩ + - ⟨termOfList l₂, Submodule.subset_span ⟨l₂, hp, rfl⟩⟩ : CoeffSubmodule ↑l₁) = 0 := - Subtype.ext h - rw [ofList, h2, ← map_add, hsum, map_zero] - -lemma ofGenerator_fermion_sq (ψf : FermionicGenerator) : - ofGenerator (.fermion ψf) * ofGenerator (.fermion ψf) = 0 := by - rw [ofGenerator, ← ofList_append] - exact ofList_eq_zero (by simp [termOfList]) - -lemma ofGenerator_fermion_add_swap (ψ₁ ψ₂ : FermionicGenerator) : - ofGenerator (.fermion ψ₁) * ofGenerator (.fermion ψ₂) + - ofGenerator (.fermion ψ₂) * ofGenerator (.fermion ψ₁) = 0 := by - rw [ofGenerator, ofGenerator, ← ofList_append, ← ofList_append] - exact ofList_add_ofList - (by simpa using List.Perm.swap (FieldGenerators.fermion ψ₁) (.fermion ψ₂) []) - (by simpa [termOfList] using fermion_mul_fermion_add_swap ψ₁ ψ₂) - -/-- The decomposition map on the fermionic factor, sending each fermionic generator to - its class in degree `{ψ}`. -/ -noncomputable def decomposeExt : FermionicEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := - ExteriorAlgebra.lift ℂ - ⟨fermionicComponentBasis.constr ℂ (fun i => ofGenerator (.fermion i)), by - intro m - -- Generic ring/module lemmas restated locally so that their statements carry the - -- direct sum's own instances; `rw` can then match where the library patterns cannot. - have hexpand : ∀ f g : FermionicGenerator → ⨁ s, CoeffSubmodule s, - (∑ i, f i) * ∑ j, g j = ∑ i, ∑ j, f i * g j := fun f g => Fintype.sum_mul_sum f g - have hsmul : ∀ (a b : ℂ) (x y : ⨁ s, CoeffSubmodule s), - (a • x) * (b • y) = (a * b) • (x * y) := fun a b x y => smul_mul_smul_comm a x b y - have hcollect : ∀ (a : ℂ) (x y : ⨁ s, CoeffSubmodule s), - a • x + a • y = a • (x + y) := fun a x y => (smul_add a x y).symm - have hzero : ∀ a : ℂ, a • (0 : ⨁ s, CoeffSubmodule s) = 0 := fun a => smul_zero a - rw [Basis.constr_apply_fintype, hexpand, ← Finset.sum_product'] - refine Finset.sum_involution (fun p _ => (p.2, p.1)) ?_ ?_ - (fun p _ => Finset.mem_univ _) (fun p _ => rfl) - · intro p _ - rw [hsmul, hsmul, mul_comm (fermionicComponentBasis.equivFun m p.2) - (fermionicComponentBasis.equivFun m p.1), - hcollect, ofGenerator_fermion_add_swap, hzero] - · intro p _ hne heq - refine hne ?_ - have h1 : p.2 = p.1 := congrArg Prod.fst heq - rw [hsmul, h1, ofGenerator_fermion_sq, hzero]⟩ - -/-- The subalgebra of the graded direct sum generated by the bosonic generator classes. - It is commutative, which lets `SymmetricAlgebra.lift` target it. -/ -noncomputable def bosonicAdjoin : Subalgebra ℂ (⨁ s, CoeffSubmodule s) := - Algebra.adjoin ℂ (Set.range fun g : ComplexScalarGenerator => ofGenerator (.cScalar g)) - -instance : IsMulCommutative bosonicAdjoin := - Algebra.isMulCommutative_adjoin ℂ (by - rintro _ ⟨g, rfl⟩ _ ⟨g', rfl⟩ - exact ofGenerator_comm (cScalar_comm_cScalar g g')) - -open scoped IsMulCommutative in -/-- The decomposition map on the bosonic factor. Since `SymmetricAlgebra.lift` requires a - commutative target, we factor through `bosonicAdjoin`. -/ -noncomputable def decomposeSym : ComplexScalarEFTExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := - bosonicAdjoin.val.comp <| SymmetricAlgebra.lift <| - complexScalarComponentBasis.constr ℂ fun g => - (⟨ofGenerator (.cScalar g), Algebra.subset_adjoin (Set.mem_range_self g)⟩ : bosonicAdjoin) - -lemma decomposeSym_mem_bosonicAdjoin (x : ComplexScalarEFTExclDeriv) : - decomposeSym x ∈ bosonicAdjoin := by - simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, Subalgebra.coe_val] - exact SetLike.coe_mem _ - -lemma decomposeExt_ι (v : FermionicComponentSpace) : - decomposeExt (ExteriorAlgebra.ι ℂ v) = - ∑ j, fermionicComponentBasis.equivFun v j • ofGenerator (.fermion j) := by - rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_apply_fintype] - -lemma commute_decomposeSym_decomposeExt - (x : ComplexScalarEFTExclDeriv) (y : FermionicEFTExclDeriv) : - Commute (decomposeSym x) (decomposeExt y) := by - -- Every element of `bosonicAdjoin` commutes with the image of the fermionic factor; - -- this avoids ever unfolding `decomposeSym`. - have hgen : ∀ g : ComplexScalarGenerator, - Commute (ofGenerator (.cScalar g)) (decomposeExt y) := by - intro g - induction y using ExteriorAlgebra.induction with - | algebraMap c => rw [AlgHom.commutes]; exact (Algebra.commutes c _).symm - | mul y₁ y₂ h₁ h₂ => - rw [map_mul] - exact Commute.mul_right (a := ofGenerator (.cScalar g)) (b := decomposeExt y₁) h₁ h₂ - | add y₁ y₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ - | ι v => - rw [decomposeExt_ι] - refine Commute.sum_right (b := ofGenerator (.cScalar g)) _ _ fun j _ => ?_ - refine Commute.smul_right (a := ofGenerator (.cScalar g)) ?_ _ - exact ofGenerator_comm (cScalar_comm_fermion g j) - have hx := decomposeSym_mem_bosonicAdjoin x - generalize decomposeSym x = a at hx ⊢ - induction hx using Algebra.adjoin_induction with - | mem a ha => obtain ⟨g, rfl⟩ := ha; exact hgen g - | algebraMap c => exact Algebra.commutes c _ - | add a b _ _ h₁ h₂ => exact h₁.add_left h₂ - | mul a b _ _ h₁ h₂ => exact Commute.mul_left (c := decomposeExt y) h₁ h₂ - -noncomputable def decompose' : EFTLagrangianExclDeriv →ₐ[ℂ] ⨁ s, CoeffSubmodule s := - Algebra.TensorProduct.lift decomposeSym decomposeExt commute_decomposeSym_decomposeExt - -lemma decomposeSym_ι_basis (g : ComplexScalarGenerator) : - decomposeSym (SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g)) = - ofGenerator (.cScalar g) := by - simp only [decomposeSym, AlgHom.coe_comp, Function.comp_apply, SymmetricAlgebra.lift_ι_apply, - Basis.constr_basis] - rfl - -lemma decomposeExt_ι_basis (g : FermionicGenerator) : - decomposeExt (ExteriorAlgebra.ι ℂ (fermionicComponentBasis g)) = - ofGenerator (.fermion g) := by - rw [decomposeExt, ExteriorAlgebra.lift_ι_apply, Basis.constr_basis] - -lemma decompose'_ofFieldGenerators (g : FieldGenerators) : - decompose' [g]ₐ = ofGenerator g := by - -- Local restatements of `mul_one`/`one_mul` carrying the direct sum's own instances. - have hmul_one : ∀ x : ⨁ s, CoeffSubmodule s, x * 1 = x := fun x => mul_one x - have hone_mul : ∀ x : ⨁ s, CoeffSubmodule s, 1 * x = x := fun x => one_mul x - match g with - | .cScalar g => - rw [decompose', show ([g]ₛ : EFTLagrangianExclDeriv) = - SymmetricAlgebra.ι ℂ _ (complexScalarComponentBasis g) ⊗ₜ 1 from rfl, - Algebra.TensorProduct.lift_tmul, map_one, hmul_one, decomposeSym_ι_basis] - | .fermion g => - rw [decompose', show ([g]ₑ : EFTLagrangianExclDeriv) = - 1 ⊗ₜ ExteriorAlgebra.ι ℂ (fermionicComponentBasis g) from rfl, - Algebra.TensorProduct.lift_tmul, map_one, hone_mul, decomposeExt_ι_basis] - -lemma decompose'_termOfList (l : List FieldGenerators) : - decompose' (termOfList l) = ofList l := by - induction l with - | nil => rw [termOfList_nil, map_one, ofList_nil] - | cons g t ih => - rw [termOfList_cons, map_mul, ih, decompose'_ofFieldGenerators, ofGenerator, - ← ofList_append, List.singleton_append] - -lemma coeAlgHom_ofList (l : List FieldGenerators) : - DirectSum.coeAlgHom CoeffSubmodule (ofList l) = termOfList l := by - rw [ofList] - exact DirectSum.coeAlgHom_of _ _ _ - -instance : GradedAlgebra CoeffSubmodule := by - refine GradedAlgebra.ofAlgHom CoeffSubmodule decompose' ?_ ?_ - · refine AlgHom.ext fun x => ?_ - rw [AlgHom.comp_apply, AlgHom.id_apply] - induction mem_termOfList_span x using Submodule.span_induction with - | mem a ha => - obtain ⟨l, rfl⟩ := ha - rw [decompose'_termOfList] - exact coeAlgHom_ofList l - | zero => simp - | add a b _ _ h₁ h₂ => rw [map_add, map_add, h₁, h₂] - | smul c a _ h₁ => rw [map_smul, map_smul, h₁] - · intro s x - obtain ⟨x, hx⟩ := x - induction hx using Submodule.span_induction with - | mem a ha => - obtain ⟨l, hl, rfl⟩ := ha - subst hl - rw [decompose'_termOfList] - rfl - | zero => exact (map_zero (DirectSum.of (fun i => CoeffSubmodule i) s)).symm ▸ map_zero _ - | add a b ha hb h₁ h₂ => rw [map_add, h₁, h₂, ← map_add]; rfl - | smul c a ha h₁ => - rw [map_smul, h₁, ← DirectSum.lof_eq_of ℂ, ← map_smul]; rfl - - -def coeff (s : Multiset FieldGenerators) : EFTLagrangianExclDeriv →ₗ[ℂ] EFTLagrangianExclDeriv:= - GradedAlgebra.proj CoeffSubmodule s - -lemma coeff_mem_subModule (s : Multiset FieldGenerators) (x : EFTLagrangianExclDeriv) : - coeff s x ∈ CoeffSubmodule s := by - rw [coeff, GradedAlgebra.proj_apply] - exact SetLike.coe_mem _ - -end CoeffSubmodule - - -/-! - -## Properties of the submodules - --/ - - -/-- A element of `EFTLagrangianExclDeriv` is an element of the `CoeffSubmodule` - iff it is a scalar multiple of a corresponding `termOfList l`. -/ -lemma coeffSubmodule_mem_iff_eq_mul {s : Multiset FieldGenerators} - {l : List FieldGenerators} (h : Multiset.ofList l = s) (x : EFTLagrangianExclDeriv) : - x ∈ CoeffSubmodule s ↔ ∃ c : ℂ, x = c • termOfList l := by - constructor - · intro hx - have hle : CoeffSubmodule s ≤ ℂ ∙ termOfList l := by - rw [CoeffSubmodule, Submodule.span_le] - rintro _ ⟨l', hl', rfl⟩ - obtain ⟨c, hc, -⟩ := termOfList_perm (Multiset.coe_eq_coe.mp (hl'.trans h.symm)) - exact Submodule.mem_span_singleton.mpr ⟨c, hc.symm⟩ - obtain ⟨c, hc⟩ := Submodule.mem_span_singleton.mp (hle hx) - exact ⟨c, hc.symm⟩ - · rintro ⟨c, rfl⟩ - exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨l, h, rfl⟩) - -lemma coeffSubmodule_eq_span {s : Multiset FieldGenerators} - {l : List FieldGenerators} (h : Multiset.ofList l = s) : - CoeffSubmodule s = ℂ ∙ termOfList l := by - ext x - simp [coeffSubmodule_mem_iff_eq_mul h] - sorry - -/-- The map from coefficents associated with each list to the algebra. -/ -def ofListCoeff : (List FieldGenerators →₀ ℂ) →ₗ[ℂ] EFTLagrangianExclDeriv := - Finsupp.linearCombination ℂ termOfList - -end From 6456b64da3790e5ced2acd6863751b1b6d84c43b Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Thu, 27 Aug 2026 09:00:28 +0400 Subject: [PATCH 213/254] refactor(Mathematics): remove unused maths helpers List of files removed: TensorProduct MultisetsOfMassDim --- Physlib.lean | 1 - Physlib/Mathematics/MultisetsOfMassDim.lean | 217 ------------------ Physlib/Mathematics/TensorProduct.lean | 166 -------------- Physlib/Particles/LagrangianTheory/Basic.lean | 1 - 4 files changed, 385 deletions(-) delete mode 100644 Physlib/Mathematics/MultisetsOfMassDim.lean delete mode 100644 Physlib/Mathematics/TensorProduct.lean diff --git a/Physlib.lean b/Physlib.lean index 67afa8cda..14b3c702a 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -132,7 +132,6 @@ public import Physlib.Mathematics.SO3.Basic public import Physlib.Mathematics.SchurTriangulation public import Physlib.Mathematics.SpecialFunctions.PhysHermite public import Physlib.Mathematics.SymmetricAlgebra -public import Physlib.Mathematics.TensorProduct public import Physlib.Mathematics.Trigonometry.Tanh public import Physlib.Mathematics.VariationalCalculus.Basic public import Physlib.Mathematics.VariationalCalculus.HasVarAdjDeriv diff --git a/Physlib/Mathematics/MultisetsOfMassDim.lean b/Physlib/Mathematics/MultisetsOfMassDim.lean deleted file mode 100644 index 993d96854..000000000 --- a/Physlib/Mathematics/MultisetsOfMassDim.lean +++ /dev/null @@ -1,217 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joseph Tooby-Smith, Nathaneal Sajan, Jinzheng Li --/ -module - -public import Mathlib.Data.Finset.Sym -public import Mathlib.Data.Finset.Lattice.Fold -public import Mathlib.Data.Rat.Floor -public import Mathlib.Algebra.Order.BigOperators.Group.Multiset -/-! - -# Computable enumeration of multisets of a given mass dimension - -## i. Overview - -Given a finite type `F` of field specifications, a map `dim : F → ℚ` assigning to each field -its mass dimension (assumed positive), and a target `m : ℚ`, this file constructs, in a -computable way, the `Finset (Multiset F)` of all multisets of fields whose overall mass -dimension is `m`. This corresponds to the possible operators (terms) of mass dimension `m` -in an EFT Lagrangian built from the fields in `F` (excluding derivatives). - -The construction proceeds by noting that if `d` is the minimal mass dimension of a field, -then a multiset of mass dimension `m` has at most `⌊m / d⌋₊` elements. We therefore -enumerate all multisets of cardinality at most this bound using `Finset.sym`, and filter -by the mass-dimension condition. - -Since the construction is computable it can be used with `#eval`. However, rational -arithmetic does not reduce in the kernel, so `multisetsOfMassDim` can not directly be -used with `decide`. For this reason we also provide a version `multisetsOfMassDimNat` -with natural-number valued mass dimensions (corresponding to clearing denominators, -e.g. working in units of half mass dimensions so that a Weyl fermion has scaled -dimension `3`), which is `decide`-friendly. The lemma `multisetsOfMassDim_eq_natCast` -allows one to rewrite the former into the latter before calling `decide`. - -## Key results - -- `multisetsOfCard` : the finset of all multisets over `F` of a given cardinality. -- `multisetsOfMassDim` : the finset of all multisets over `F` of a given mass dimension. -- `mem_multisetsOfMassDim_iff` : the defining property - `s ∈ multisetsOfMassDim dim m ↔ (s.map dim).sum = m`, valid whenever `dim` is positive. -- `multisetsOfMassDimNat`, `mem_multisetsOfMassDimNat_iff` : the analogous construction - for natural-number valued (scaled) mass dimensions, usable with `decide`. -- `multisetsOfMassDim_eq_natCast` : the two constructions agree after clearing - denominators. - --/ - -@[expose] public section - -variable {F : Type*} [Fintype F] - -/-! - -## A. Multisets of a given cardinality - --/ - -/-- The finset of all multisets over a finite type `F` with exactly `n` elements. -/ -def multisetsOfCard (F : Type*) [Fintype F] [DecidableEq F] (n : ℕ) : - Finset (Multiset F) := - (Finset.univ.sym n).image Sym.toMultiset - -@[simp] -lemma mem_multisetsOfCard [DecidableEq F] {n : ℕ} {s : Multiset F} : - s ∈ multisetsOfCard F n ↔ Multiset.card s = n := by - constructor - · intro h - obtain ⟨x, -, rfl⟩ := Finset.mem_image.mp h - exact x.2 - · rintro rfl - exact Finset.mem_image.mpr - ⟨⟨s, rfl⟩, Finset.mem_sym_iff.mpr fun a _ => Finset.mem_univ a, rfl⟩ - -/-! - -## B. The bound on the cardinality - --/ - -/-- The sum of `dim` over a multiset is at least the cardinality times the minimal - value of `dim`. Shared bound underlying `card_le_massDimCardBound` and - `card_le_massDimCardBoundNat`. -/ -lemma card_nsmul_inf'_le_sum_map {M : Type*} [AddCommMonoid M] [LinearOrder M] - [AddLeftMono M] (huniv : (Finset.univ : Finset F).Nonempty) (dim : F → M) - (s : Multiset F) : - Multiset.card s • Finset.univ.inf' huniv dim ≤ (s.map dim).sum := by - have h1 : Multiset.card (s.map dim) • Finset.univ.inf' huniv dim ≤ (s.map dim).sum := by - refine Multiset.card_nsmul_le_sum fun x hx => ?_ - obtain ⟨f, -, rfl⟩ := Multiset.mem_map.mp hx - exact Finset.inf'_le dim (Finset.mem_univ f) - simpa using h1 - -/-- An upper bound on the number of fields in a multiset of overall mass dimension `m`: - `⌊m / d⌋₊` where `d` is the minimal mass dimension of a field. Equal to `0` when - `F` is empty. -/ -def massDimCardBound (dim : F → ℚ) (m : ℚ) : ℕ := - if h : (Finset.univ : Finset F).Nonempty then ⌊m / Finset.univ.inf' h dim⌋₊ else 0 - -private lemma card_le_massDimCardBound {dim : F → ℚ} (hdim : ∀ f, 0 < dim f) {m : ℚ} - {s : Multiset F} (hs : (s.map dim).sum = m) : - Multiset.card s ≤ massDimCardBound dim m := by - rcases eq_or_ne s 0 with rfl | hne - · simp - obtain ⟨f0, -⟩ := Multiset.exists_mem_of_ne_zero hne - have huniv : (Finset.univ : Finset F).Nonempty := ⟨f0, Finset.mem_univ f0⟩ - rw [massDimCardBound, dif_pos huniv] - have hdpos : 0 < Finset.univ.inf' huniv dim := - (Finset.lt_inf'_iff huniv).mpr fun i _ => hdim i - have hle := hs ▸ card_nsmul_inf'_le_sum_map huniv dim s - refine Nat.le_floor ?_ - rw [le_div_iff₀ hdpos] - simpa [nsmul_eq_mul] using hle - -/-! - -## C. Multisets of a given mass dimension - --/ - -/-- The finset of all multisets over a finite type `F` whose overall mass dimension, - as measured by `dim : F → ℚ`, is `m`. The defining property, valid when `dim` is - positive, is `mem_multisetsOfMassDim_iff`. -/ -def multisetsOfMassDim [DecidableEq F] (dim : F → ℚ) (m : ℚ) : Finset (Multiset F) := - ((Finset.range (massDimCardBound dim m + 1)).biUnion (multisetsOfCard F)).filter - fun s => (s.map dim).sum = m - -lemma mem_multisetsOfMassDim_iff [DecidableEq F] {dim : F → ℚ} (hdim : ∀ f, 0 < dim f) {m : ℚ} - {s : Multiset F} : - s ∈ multisetsOfMassDim dim m ↔ (s.map dim).sum = m := by - constructor - · exact fun h => (Finset.mem_filter.mp h).2 - · intro h - refine Finset.mem_filter.mpr ⟨Finset.mem_biUnion.mpr ⟨Multiset.card s, ?_, by simp⟩, h⟩ - exact Finset.mem_range.mpr (Nat.lt_succ_of_le (card_le_massDimCardBound hdim h)) - -/-! - -## D. Multisets of a given scaled (natural-number) mass dimension - -Rational arithmetic does not reduce in the kernel, so `multisetsOfMassDim` is usable -with `#eval` but not with `decide`. Clearing denominators in the mass dimensions -(e.g. working in units of half mass dimensions) reduces the problem to natural-number -valued dimensions, for which the analogous construction below is `decide`-friendly. - --/ - -/-- An upper bound on the number of fields in a multiset of overall scaled mass - dimension `m`: `m / d` (natural-number division) where `d` is the minimal scaled - mass dimension of a field. Equal to `0` when `F` is empty. -/ -def massDimCardBoundNat (dim : F → ℕ) (m : ℕ) : ℕ := - if h : (Finset.univ : Finset F).Nonempty then m / Finset.univ.inf' h dim else 0 - -private lemma card_le_massDimCardBoundNat {dim : F → ℕ} (hdim : ∀ f, 0 < dim f) {m : ℕ} - {s : Multiset F} (hs : (s.map dim).sum = m) : - Multiset.card s ≤ massDimCardBoundNat dim m := by - rcases eq_or_ne s 0 with rfl | hne - · simp - obtain ⟨f0, -⟩ := Multiset.exists_mem_of_ne_zero hne - have huniv : (Finset.univ : Finset F).Nonempty := ⟨f0, Finset.mem_univ f0⟩ - rw [massDimCardBoundNat, dif_pos huniv] - have hdpos : 0 < Finset.univ.inf' huniv dim := - (Finset.lt_inf'_iff huniv).mpr fun i _ => hdim i - rw [Nat.le_div_iff_mul_le hdpos] - simpa [hs, smul_eq_mul] using card_nsmul_inf'_le_sum_map huniv dim s - -/-- The finset of all multisets over a finite type `F` whose overall scaled mass - dimension, as measured by `dim : F → ℕ`, is `m`. The defining property, valid when - `dim` is positive, is `mem_multisetsOfMassDimNat_iff`. Unlike `multisetsOfMassDim`, - this construction reduces in the kernel and can be used with `decide`. -/ -def multisetsOfMassDimNat [DecidableEq F] (dim : F → ℕ) (m : ℕ) : Finset (Multiset F) := - ((Finset.range (massDimCardBoundNat dim m + 1)).biUnion (multisetsOfCard F)).filter - fun s => (s.map dim).sum = m - -lemma mem_multisetsOfMassDimNat_iff [DecidableEq F] {dim : F → ℕ} (hdim : ∀ f, 0 < dim f) - {m : ℕ} {s : Multiset F} : - s ∈ multisetsOfMassDimNat dim m ↔ (s.map dim).sum = m := by - constructor - · exact fun h => (Finset.mem_filter.mp h).2 - · intro h - refine Finset.mem_filter.mpr ⟨Finset.mem_biUnion.mpr ⟨Multiset.card s, ?_, by simp⟩, h⟩ - exact Finset.mem_range.mpr (Nat.lt_succ_of_le (card_le_massDimCardBoundNat hdim h)) - -/-! - -## E. Relating the two constructions - --/ - -/-- Clearing denominators: on multiplying all mass dimensions and the target mass - dimension by a common positive scale `N` rendering them all natural numbers, the - finset of multisets of a given mass dimension can be computed through - `multisetsOfMassDimNat`, and hence through `decide`. -/ -lemma multisetsOfMassDim_eq_natCast [DecidableEq F] {dim : F → ℚ} (hdim : ∀ f, 0 < dim f) - {dimN : F → ℕ} {N : ℕ} (hN : 0 < N) (hdimN : ∀ f, (dimN f : ℚ) = dim f * N) - {m : ℚ} {mN : ℕ} (hmN : (mN : ℚ) = m * N) : - multisetsOfMassDim dim m = multisetsOfMassDimNat dimN mN := by - have hNQ : (N : ℚ) ≠ 0 := Nat.cast_ne_zero.mpr hN.ne' - have hdimNpos : ∀ f, 0 < dimN f := fun f => by - have h1 : (0 : ℚ) < (dimN f : ℚ) := by - rw [hdimN f] - exact mul_pos (hdim f) (by exact_mod_cast hN) - exact_mod_cast h1 - ext s - rw [mem_multisetsOfMassDim_iff hdim, mem_multisetsOfMassDimNat_iff hdimNpos] - have key : ((s.map dimN).sum : ℚ) = (s.map dim).sum * N := by - induction s using Multiset.induction with - | empty => simp - | cons a t ih => simp [hdimN, ih, add_mul] - constructor - · intro h - have h1 : ((s.map dimN).sum : ℚ) = (mN : ℚ) := by rw [key, h, hmN] - exact_mod_cast h1 - · intro h - have h1 : (s.map dim).sum * (N : ℚ) = m * N := by rw [← key, h, hmN] - exact mul_right_cancel₀ hNQ h1 diff --git a/Physlib/Mathematics/TensorProduct.lean b/Physlib/Mathematics/TensorProduct.lean deleted file mode 100644 index 5974ffd88..000000000 --- a/Physlib/Mathematics/TensorProduct.lean +++ /dev/null @@ -1,166 +0,0 @@ -/- -Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Nathaneal Sajan --/ -module - -public import Mathlib.Algebra.Module.Submodule.EqLocus -public import Mathlib.LinearAlgebra.TensorProduct.Basis -public import Mathlib.LinearAlgebra.TensorProduct.Map - -/-! -# Simultaneous fixed submodules under tensor extension - -Let `F : ι → Module.End R M` be a family of linear endomorphisms. Its simultaneous fixed -submodule is the intersection `⋂ i, LinearMap.eqLocus (F i) LinearMap.id`. - -If `C` is a free `R`-module and every `F i` acts on `M ⊗[R] C` through the `M` factor, then the -simultaneous fixed submodule of the extended family is the tensor extension of the original fixed -submodule. The corresponding result also holds for `C ⊗[R] M`, with the endomorphisms acting on -the right factor. - -The proof chooses a basis of `C`, the tensor factor on which the extended endomorphisms act by the -identity. An element of the tensor product then has a unique finite expansion in this basis, -and it is fixed exactly when each coefficient in `M` is fixed. This only requires `C` to be free -as an `R`-module. - -This allows a fixed-point calculation on one module to be reused after tensoring with a free module -on which the endomorphisms act as the identity. For example, the added factor may be an exterior -algebra over a field, even though it contains nilpotent elements. - --/ - -@[expose] public section - -open scoped TensorProduct - -namespace TensorProduct - -/-! - -## A. Coefficient decompositions and tensor maps - -Mathlib's `equivFinsuppOfBasisRight` and `equivFinsuppOfBasisLeft` express a tensor as a finitely -supported family of coefficients after choosing a basis of one tensor factor. The following -lemmas show that applying a linear map to the other factor applies that map independently to every -coefficient. - --/ - -/-- Let `𝒞` be a basis of the right tensor factor. The `i`-th coefficient of -`f.rTensor C x` is `f` applied to the `i`-th coefficient of `x`. -/ -lemma equivFinsuppOfBasisRight_rTensor_apply - {R M N C κ : Type*} [CommSemiring R] - [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N] - [AddCommMonoid C] [Module R C] [DecidableEq κ] - (𝒞 : Module.Basis κ R C) (f : M →ₗ[R] N) (x : M ⊗[R] C) (i : κ) : - equivFinsuppOfBasisRight 𝒞 (f.rTensor C x) i = - f (equivFinsuppOfBasisRight 𝒞 x i) := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul m c => - rw [LinearMap.rTensor_tmul, equivFinsuppOfBasisRight_apply_tmul_apply, - equivFinsuppOfBasisRight_apply_tmul_apply, map_smul] - | add x y hx hy => simp only [map_add, Finsupp.add_apply, hx, hy] - -/-- Let `𝒞` be a basis of the left tensor factor. The `i`-th coefficient of -`f.lTensor C x` is `f` applied to the `i`-th coefficient of `x`. -/ -lemma equivFinsuppOfBasisLeft_lTensor_apply - {R M N C κ : Type*} [CommSemiring R] - [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N] - [AddCommMonoid C] [Module R C] [DecidableEq κ] - (𝒞 : Module.Basis κ R C) (f : M →ₗ[R] N) (x : C ⊗[R] M) (i : κ) : - equivFinsuppOfBasisLeft 𝒞 (f.lTensor C x) i = - f (equivFinsuppOfBasisLeft 𝒞 x i) := by - induction x using TensorProduct.induction_on with - | zero => simp - | tmul c m => - rw [LinearMap.lTensor_tmul, equivFinsuppOfBasisLeft_apply_tmul_apply, - equivFinsuppOfBasisLeft_apply_tmul_apply, map_smul] - | add x y hx hy => simp only [map_add, Finsupp.add_apply, hx, hy] - -end TensorProduct - -namespace LinearMap - -/-! - -## B. Simultaneous fixed submodules - -The simultaneous fixed submodule of `F` is the intersection of the equalizers of `F i` and the -identity. For a submodule `P ≤ M`, its extension inside `M ⊗[R] C` is -`Submodule.map₂ (TensorProduct.mk R M C) P ⊤`. This is the submodule spanned by the elementary -tensors `m ⊗ₜ c` with `m ∈ P`. When `C` is free, a tensor is fixed by every extended -endomorphism exactly when each of its coefficients belongs to the simultaneous fixed -submodule of `F`. - --/ - -/-- Simultaneous fixed submodules after tensoring on the right by a free module. -/ -lemma iInf_eqLocus_rTensor - {R M C ι : Type*} [CommRing R] - [AddCommGroup M] [Module R M] - [AddCommGroup C] [Module R C] [Module.Free R C] - (F : ι → Module.End R M) : - (⨅ i, eqLocus ((F i).rTensor C) LinearMap.id) = - Submodule.map₂ (TensorProduct.mk R M C) (⨅ i, eqLocus (F i) LinearMap.id) ⊤ := by - classical - apply le_antisymm - · intro x hx - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hx - let 𝒞 := Module.Free.chooseBasis R C - have hcoeff : ∀ k, TensorProduct.equivFinsuppOfBasisRight 𝒞 x k ∈ - (⨅ i, eqLocus (F i) LinearMap.id) := by - intro k - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] - intro i - have h := TensorProduct.equivFinsuppOfBasisRight_rTensor_apply 𝒞 (F i) x k - rw [hx i] at h - exact h.symm - have hxrepr := (TensorProduct.equivFinsuppOfBasisRight 𝒞).symm_apply_apply x - rw [TensorProduct.equivFinsuppOfBasisRight_symm_apply] at hxrepr - rw [← hxrepr, Finsupp.sum] - exact Submodule.sum_mem _ fun k _ => - Submodule.apply_mem_map₂ _ (hcoeff k) (Submodule.mem_top) - · rw [Submodule.map₂_le] - intro m hm c _ - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hm ⊢ - intro i - change (F i).rTensor C (m ⊗ₜ[R] c) = m ⊗ₜ[R] c - rw [LinearMap.rTensor_tmul, hm i] - -/-- Simultaneous fixed submodules after tensoring on the left by a free module. -/ -lemma iInf_eqLocus_lTensor - {R M C ι : Type*} [CommRing R] - [AddCommGroup M] [Module R M] - [AddCommGroup C] [Module R C] [Module.Free R C] - (F : ι → Module.End R M) : - (⨅ i, eqLocus ((F i).lTensor C) LinearMap.id) = - Submodule.map₂ (TensorProduct.mk R C M) ⊤ (⨅ i, eqLocus (F i) LinearMap.id) := by - classical - apply le_antisymm - · intro x hx - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hx - let 𝒞 := Module.Free.chooseBasis R C - have hcoeff : ∀ k, TensorProduct.equivFinsuppOfBasisLeft 𝒞 x k ∈ - (⨅ i, eqLocus (F i) LinearMap.id) := by - intro k - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] - intro i - have h := TensorProduct.equivFinsuppOfBasisLeft_lTensor_apply 𝒞 (F i) x k - rw [hx i] at h - exact h.symm - have hxrepr := (TensorProduct.equivFinsuppOfBasisLeft 𝒞).symm_apply_apply x - rw [TensorProduct.equivFinsuppOfBasisLeft_symm_apply] at hxrepr - rw [← hxrepr, Finsupp.sum] - exact Submodule.sum_mem _ fun k _ => - Submodule.apply_mem_map₂ _ (Submodule.mem_top) (hcoeff k) - · rw [Submodule.map₂_le] - intro c _ m hm - simp only [Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] at hm ⊢ - intro i - change (F i).lTensor C (c ⊗ₜ[R] m) = c ⊗ₜ[R] m - rw [LinearMap.lTensor_tmul, hm i] - -end LinearMap diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index aabcdf66e..6a2b916d1 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -11,7 +11,6 @@ public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Physlib.Mathematics.ConjModule -public import Physlib.Mathematics.MultisetsOfMassDim public import Mathlib.RingTheory.GradedAlgebra.Basic public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic public import Mathlib.RingTheory.TensorProduct.Basic From e02ecf6f84542b6a8b6de963cd050cf13c646631 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 07:23:35 +0100 Subject: [PATCH 214/254] feat: Add basis of gauge algebra --- .../StandardModel/GaugeAlgebra/Basis.lean | 743 ++++++++++++++++++ .../GaugeAlgebra/JetGaugeAlgebra.lean | 30 + .../GaugeBosons/AlgebraValued/Basic.lean | 46 +- .../AlgebraValued/FieldStrength.lean | 16 + .../GaugeBosons/FieldStrength/Basic.lean | 27 + 5 files changed, 827 insertions(+), 35 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/FieldStrength/Basic.lean diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean new file mode 100644 index 000000000..914b0df6f --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean @@ -0,0 +1,743 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeAlgebra.Basic +public import Physlib.Relativity.PauliMatrices.Basic +public import Mathlib.LinearAlgebra.Basis.Basic +public import Mathlib.LinearAlgebra.Basis.Prod +public import Mathlib.Analysis.Real.Sqrt +public import Mathlib.Algebra.BigOperators.Fin +/-! +# The standard basis of the gauge algebra + +The standard basis of the gauge algebra of the Standard Model, indexed by +`Fin 8 ⊕ Fin 3 ⊕ Fin 1`: the eight Gell-Mann matrices on the `su(3)` factor, the three +Pauli matrices on the `su(2)` factor, and `1` on the `u(1)` factor. + +In this basis the adjoint action of the gauge group is the block-diagonal matrix +`adjointMatrix`, whose blocks are the trace pairings of the basis elements with their +conjugates; `adjoint_stdBasis` and `toMatrix_adjoint` identify its action with the +adjoint action. + +-/ + +@[expose] public section + +namespace StandardModel +open Matrix Module PauliMatrix + +noncomputable section + +/-! + +## A. The Gell-Mann matrices + +The Pauli matrices `σ1`, `σ2`, `σ3` embedded along the three coordinate planes of +`Fin 3`, together with the normalised traceless diagonal matrix. + +-/ + +/-- The embedding of `2 × 2` matrices into the `3 × 3` matrices supported on the plane + of two coordinate directions: the entries of `A` land at the row and column indices + `p 0` and `p 1`, every other entry vanishing. -/ +def planeEmbed (p : Fin 2 → Fin 3) (A : Matrix (Fin 2) (Fin 2) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ := + Matrix.of fun i j => ∑ a, ∑ b, if i = p a ∧ j = p b then A a b else 0 + +/-- The Gell-Mann matrices: the standard basis of the traceless hermitian `3 × 3` + matrices. The first seven are the Pauli matrices `σ1`, `σ2`, `σ3` embedded along the + three coordinate planes; the eighth is the normalised traceless diagonal matrix. -/ +def gellMannMatrix : Fin 8 → Matrix (Fin 3) (Fin 3) ℂ + | 0 => planeEmbed ![0, 1] σ1 + | 1 => planeEmbed ![0, 1] σ2 + | 2 => planeEmbed ![0, 1] σ3 + | 3 => planeEmbed ![0, 2] σ1 + | 4 => planeEmbed ![0, 2] σ2 + | 5 => planeEmbed ![1, 2] σ1 + | 6 => planeEmbed ![1, 2] σ2 + | 7 => (((Real.sqrt 3 : ℝ) : ℂ))⁻¹ • !![1, 0, 0; 0, 1, 0; 0, 0, -2] + +lemma gellMannMatrix_zero : gellMannMatrix 0 = !![0, 1, 0; 1, 0, 0; 0, 0, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix, planeEmbed, pauliMatrix, Fin.sum_univ_two] + +lemma gellMannMatrix_one : + gellMannMatrix 1 = !![0, -Complex.I, 0; Complex.I, 0, 0; 0, 0, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix, planeEmbed, pauliMatrix, Fin.sum_univ_two] + +lemma gellMannMatrix_two : gellMannMatrix 2 = !![1, 0, 0; 0, -1, 0; 0, 0, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix, planeEmbed, pauliMatrix, Fin.sum_univ_two] + +lemma gellMannMatrix_three : gellMannMatrix 3 = !![0, 0, 1; 0, 0, 0; 1, 0, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix, planeEmbed, pauliMatrix, Fin.sum_univ_two] + +lemma gellMannMatrix_four : + gellMannMatrix 4 = !![0, 0, -Complex.I; 0, 0, 0; Complex.I, 0, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix, planeEmbed, pauliMatrix, Fin.sum_univ_two] + +lemma gellMannMatrix_five : gellMannMatrix 5 = !![0, 0, 0; 0, 0, 1; 0, 1, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix, planeEmbed, pauliMatrix, Fin.sum_univ_two] + +lemma gellMannMatrix_six : + gellMannMatrix 6 = !![0, 0, 0; 0, 0, -Complex.I; 0, Complex.I, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix, planeEmbed, pauliMatrix, Fin.sum_univ_two] + +lemma gellMannMatrix_seven : + gellMannMatrix 7 = (((Real.sqrt 3 : ℝ) : ℂ))⁻¹ • !![1, 0, 0; 0, 1, 0; 0, 0, -2] := rfl + +/-- The Gell-Mann matrices are hermitian. -/ +lemma gellMannMatrix_selfAdjoint (k : Fin 8) : + star (gellMannMatrix k) = gellMannMatrix k := by + fin_cases k <;> + · rw [Matrix.star_eq_conjTranspose] + ext i j + fin_cases i <;> fin_cases j <;> + simp [gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, gellMannMatrix_three, + gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, gellMannMatrix_seven, + Matrix.conjTranspose_apply, Complex.conj_ofReal] + +/-- The Gell-Mann matrices are traceless. -/ +lemma gellMannMatrix_trace (k : Fin 8) : (gellMannMatrix k).trace = 0 := by + fin_cases k + all_goals + simp [gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, gellMannMatrix_three, + gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, gellMannMatrix_seven, + Matrix.trace_fin_three] + all_goals ring + +/-- A combination of the Gell-Mann matrices, entry by entry. -/ +lemma sum_smul_gellMannMatrix (g : Fin 8 → ℝ) : + ∑ k, g k • gellMannMatrix k = + !![((g 2 + (Real.sqrt 3)⁻¹ * g 7 : ℝ) : ℂ), + ((g 0 : ℝ) : ℂ) - ((g 1 : ℝ) : ℂ) * Complex.I, + ((g 3 : ℝ) : ℂ) - ((g 4 : ℝ) : ℂ) * Complex.I; + ((g 0 : ℝ) : ℂ) + ((g 1 : ℝ) : ℂ) * Complex.I, + ((-g 2 + (Real.sqrt 3)⁻¹ * g 7 : ℝ) : ℂ), + ((g 5 : ℝ) : ℂ) - ((g 6 : ℝ) : ℂ) * Complex.I; + ((g 3 : ℝ) : ℂ) + ((g 4 : ℝ) : ℂ) * Complex.I, + ((g 5 : ℝ) : ℂ) + ((g 6 : ℝ) : ℂ) * Complex.I, + ((-2 * (Real.sqrt 3)⁻¹ * g 7 : ℝ) : ℂ)] := by + ext i j + fin_cases i <;> fin_cases j + all_goals + simp [Fin.sum_univ_eight, Matrix.sum_apply, gellMannMatrix_zero, gellMannMatrix_one, + gellMannMatrix_two, gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, + gellMannMatrix_six, gellMannMatrix_seven, Complex.real_smul] + all_goals ring + +/-- A combination of the three Pauli matrices `σ1`, `σ2`, `σ3`, entry by entry. -/ +lemma sum_smul_pauliMatrix_inr (g : Fin 3 → ℝ) : + ∑ i, g i • pauliMatrix (Sum.inr i) = + !![((g 2 : ℝ) : ℂ), ((g 0 : ℝ) : ℂ) - ((g 1 : ℝ) : ℂ) * Complex.I; + ((g 0 : ℝ) : ℂ) + ((g 1 : ℝ) : ℂ) * Complex.I, ((-g 2 : ℝ) : ℂ)] := by + ext i j + fin_cases i <;> fin_cases j + all_goals + simp [Fin.sum_univ_three, Matrix.sum_apply, pauliMatrix, Complex.real_smul] + all_goals ring + +/-- The Pauli matrices `σ1`, `σ2`, `σ3` are hermitian, phrased through `star`. -/ +lemma pauliMatrix_inr_star (i : Fin 3) : + star (pauliMatrix (Sum.inr i)) = pauliMatrix (Sum.inr i) := by + rw [Matrix.star_eq_conjTranspose] + exact pauliMatrix_selfAdjoint _ + +/-- The Pauli matrices `σ1`, `σ2`, `σ3` are traceless. -/ +lemma pauliMatrix_inr_trace (i : Fin 3) : (pauliMatrix (Sum.inr i)).trace = 0 := by + fin_cases i <;> simp [pauliMatrix, Matrix.trace_fin_two] + +/-! + +## B. Coordinates in the Gell-Mann and Pauli bases + +The coordinates of a traceless hermitian matrix in the Gell-Mann and Pauli bases, read +off from its entries; they coincide with the trace pairings +`2⁻¹ * (trace (T k * M)).re` with the basis matrices. + +-/ + +/-- The entries of a hermitian matrix are conjugate-symmetric. -/ +lemma entry_symm_of_star_eq {n : ℕ} {M : Matrix (Fin n) (Fin n) ℂ} (hsa : star M = M) + (i j : Fin n) : M j i = (starRingEnd ℂ) (M i j) := by + conv_lhs => rw [← hsa] + rw [Matrix.star_apply] + rfl + +/-- The diagonal entries of a hermitian matrix are real. -/ +lemma diag_re_of_star_eq {n : ℕ} {M : Matrix (Fin n) (Fin n) ℂ} (hsa : star M = M) + (i : Fin n) : M i i = ((M i i).re : ℂ) := + (Complex.conj_eq_iff_re.mp (entry_symm_of_star_eq hsa i i).symm).symm + +/-- The coordinates of a matrix in the Gell-Mann basis, read off from its entries. -/ +def gellMannCoeff (M : Matrix (Fin 3) (Fin 3) ℂ) : Fin 8 → ℝ + | 0 => (M 0 1).re + | 1 => -(M 0 1).im + | 2 => ((M 0 0).re - (M 1 1).re) / 2 + | 3 => (M 0 2).re + | 4 => -(M 0 2).im + | 5 => (M 1 2).re + | 6 => -(M 1 2).im + | 7 => Real.sqrt 3 / 2 * ((M 0 0).re + (M 1 1).re) + +/-- The coordinates of a matrix in the Pauli basis `σ1`, `σ2`, `σ3`, read off from its + entries. -/ +def pauliCoeff (M : Matrix (Fin 2) (Fin 2) ℂ) : Fin 3 → ℝ + | 0 => (M 0 1).re + | 1 => -(M 0 1).im + | 2 => (M 0 0).re + +/-- A traceless hermitian `3 × 3` matrix is the combination of the Gell-Mann matrices + with its `gellMannCoeff` coordinates. -/ +lemma eq_sum_gellMannCoeff_smul {M : Matrix (Fin 3) (Fin 3) ℂ} + (hsa : star M = M) (htr : M.trace = 0) : + M = ∑ k, gellMannCoeff M k • gellMannMatrix k := by + have hherm := entry_symm_of_star_eq hsa + have hdiag := diag_re_of_star_eq hsa + have htr3 : M 2 2 = -(M 0 0 + M 1 1) := by + rw [Matrix.trace_fin_three] at htr + linear_combination htr + have hs : Real.sqrt 3 ≠ 0 := ne_of_gt (Real.sqrt_pos.mpr (by norm_num)) + rw [sum_smul_gellMannMatrix] + simp only [gellMannCoeff] + generalize hgen : Real.sqrt 3 = s at hs ⊢ + have hsc : ((s : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr hs + ext i j + match i, j with + | 0, 0 => + conv_lhs => rw [hdiag 0] + simp + field_simp + ring + | 0, 1 => simp + | 0, 2 => simp + | 1, 0 => + conv_lhs => rw [hherm 0 1] + simp + apply Complex.ext <;> simp + | 1, 1 => + conv_lhs => rw [hdiag 1] + simp + field_simp + ring + | 1, 2 => simp + | 2, 0 => + conv_lhs => rw [hherm 0 2] + simp + apply Complex.ext <;> simp + | 2, 1 => + conv_lhs => rw [hherm 1 2] + simp + apply Complex.ext <;> simp + | 2, 2 => + conv_lhs => rw [htr3] + conv_lhs => rw [hdiag 0] + conv_lhs => rw [hdiag 1] + simp + field_simp + ring + +/-- A traceless hermitian `2 × 2` matrix is the combination of the Pauli matrices + `σ1`, `σ2`, `σ3` with its `pauliCoeff` coordinates. -/ +lemma eq_sum_pauliCoeff_smul {M : Matrix (Fin 2) (Fin 2) ℂ} + (hsa : star M = M) (htr : M.trace = 0) : + M = ∑ i, pauliCoeff M i • pauliMatrix (Sum.inr i) := by + have hherm := entry_symm_of_star_eq hsa + have hdiag := diag_re_of_star_eq hsa + have htr2 : M 1 1 = -M 0 0 := by + rw [Matrix.trace_fin_two] at htr + linear_combination htr + rw [sum_smul_pauliMatrix_inr] + simp only [pauliCoeff] + ext i j + match i, j with + | 0, 0 => + conv_lhs => rw [hdiag 0] + simp + | 0, 1 => simp + | 1, 0 => + conv_lhs => rw [hherm 0 1] + simp + apply Complex.ext <;> simp + | 1, 1 => + conv_lhs => rw [htr2] + conv_lhs => rw [hdiag 0] + simp + +/-- The Gell-Mann coordinates of a traceless hermitian matrix are its trace pairings + with the Gell-Mann matrices. -/ +lemma gellMannCoeff_eq_trace {M : Matrix (Fin 3) (Fin 3) ℂ} + (hsa : star M = M) (htr : M.trace = 0) (k : Fin 8) : + gellMannCoeff M k = 2⁻¹ * (Matrix.trace (gellMannMatrix k * M)).re := by + have hherm := entry_symm_of_star_eq hsa + have hdiag := diag_re_of_star_eq hsa + have htr3 : M 2 2 = -(M 0 0 + M 1 1) := by + rw [Matrix.trace_fin_three] at htr + linear_combination htr + match k with + | 0 => + rw [gellMannMatrix_zero] + simp only [gellMannCoeff] + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three, hherm 0 1] + ring + | 1 => + rw [gellMannMatrix_one] + simp only [gellMannCoeff] + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three, hherm 0 1] + ring + | 2 => + rw [gellMannMatrix_two] + simp only [gellMannCoeff] + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three] + ring + | 3 => + rw [gellMannMatrix_three] + simp only [gellMannCoeff] + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three, hherm 0 2] + ring + | 4 => + rw [gellMannMatrix_four] + simp only [gellMannCoeff] + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three, hherm 0 2] + ring + | 5 => + rw [gellMannMatrix_five] + simp only [gellMannCoeff] + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three, hherm 1 2] + ring + | 6 => + rw [gellMannMatrix_six] + simp only [gellMannCoeff] + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three, hherm 1 2] + ring + | 7 => + have h33 : Real.sqrt 3 * Real.sqrt 3 = 3 := Real.mul_self_sqrt (by norm_num) + have hs : Real.sqrt 3 ≠ 0 := ne_of_gt (Real.sqrt_pos.mpr (by norm_num)) + rw [gellMannMatrix_seven] + simp only [gellMannCoeff] + rw [Matrix.smul_mul, Matrix.trace_smul] + rw [show Matrix.trace (!![1, 0, 0; 0, 1, 0; 0, 0, -2] * M) + = M 0 0 + M 1 1 - 2 * M 2 2 by + rw [Matrix.trace_fin_three, Matrix.mul_apply, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_three] + ring] + rw [htr3, hdiag 0, hdiag 1] + rw [show (((Real.sqrt 3 : ℝ) : ℂ))⁻¹ = (((Real.sqrt 3)⁻¹ : ℝ) : ℂ) by push_cast; ring] + rw [smul_eq_mul, Complex.re_ofReal_mul] + simp + field_simp + linear_combination ((M 0 0).re + (M 1 1).re) * h33 + +/-- The Pauli coordinates of a traceless hermitian matrix are its trace pairings with + the Pauli matrices `σ1`, `σ2`, `σ3`. -/ +lemma pauliCoeff_eq_trace {M : Matrix (Fin 2) (Fin 2) ℂ} + (hsa : star M = M) (htr : M.trace = 0) (i : Fin 3) : + pauliCoeff M i = 2⁻¹ * (Matrix.trace (pauliMatrix (Sum.inr i) * M)).re := by + have hherm := entry_symm_of_star_eq hsa + have htr2 : M 1 1 = -M 0 0 := by + rw [Matrix.trace_fin_two] at htr + linear_combination htr + match i with + | 0 => + simp only [pauliCoeff] + rw [Matrix.trace_fin_two, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_two, pauliMatrix, hherm 0 1] + ring + | 1 => + simp only [pauliCoeff] + rw [Matrix.trace_fin_two, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_two, pauliMatrix, hherm 0 1] + ring + | 2 => + simp only [pauliCoeff] + rw [Matrix.trace_fin_two, Matrix.mul_apply, Matrix.mul_apply] + simp [Fin.sum_univ_two, pauliMatrix, htr2] + ring + +namespace GaugeAlgebra + +/-! + +## C. The Gell-Mann basis of the su(3) factor + +-/ + +/-- The Gell-Mann matrices as elements of the `su(3)` factor of the gauge algebra. -/ +def gellMannSU3 (k : Fin 8) : + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 3) (Fin 3) ℂ) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 3) ℝ ℂ)) := + ⟨gellMannMatrix k, gellMannMatrix_selfAdjoint k, gellMannMatrix_trace k⟩ + +@[simp] +lemma coe_gellMannSU3 (k : Fin 8) : + (gellMannSU3 k : Matrix (Fin 3) (Fin 3) ℂ) = gellMannMatrix k := rfl + +/-- The Gell-Mann matrices are linearly independent. -/ +lemma gellMannSU3_linearIndependent : LinearIndependent ℝ gellMannSU3 := by + apply Fintype.linearIndependent_iff.mpr + intro g hg + have hM : ∑ k, g k • gellMannMatrix k = (0 : Matrix (Fin 3) (Fin 3) ℂ) := by + simpa [gellMannSU3] using congrArg Subtype.val hg + rw [sum_smul_gellMannMatrix] at hM + have h00 := congrFun (congrFun hM 0) 0 + have h11 := congrFun (congrFun hM 1) 1 + have h01 := congrFun (congrFun hM 0) 1 + have h02 := congrFun (congrFun hM 0) 2 + have h12 := congrFun (congrFun hM 1) 2 + simp [Complex.ext_iff] at h00 h11 h01 h02 h12 + obtain ⟨h0, h1⟩ := h01 + obtain ⟨h3, h4⟩ := h02 + obtain ⟨h5, h6⟩ := h12 + have hs : Real.sqrt 3 ≠ 0 := ne_of_gt (Real.sqrt_pos.mpr (by norm_num)) + have h2 : g 2 = 0 := by linarith + have hx : Real.sqrt 3 * g 7 = 0 := by linarith + have h7 : g 7 = 0 := (mul_eq_zero.mp hx).resolve_left hs + intro k + fin_cases k <;> assumption + +/-- The Gell-Mann matrices span the `su(3)` factor. -/ +lemma gellMannSU3_span : ⊤ ≤ Submodule.span ℝ (Set.range gellMannSU3) := by + refine (Submodule.top_le_span_range_iff_forall_exists_fun ℝ).mpr fun A => ?_ + refine ⟨gellMannCoeff (A : Matrix (Fin 3) (Fin 3) ℂ), Subtype.ext ?_⟩ + rw [AddSubmonoidClass.coe_finsetSum] + simp only [SetLike.val_smul, coe_gellMannSU3] + exact (eq_sum_gellMannCoeff_smul A.2.1 A.2.2).symm + +/-- The Gell-Mann basis of the `su(3)` factor of the gauge algebra. -/ +def su3Basis : Basis (Fin 8) ℝ + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 3) (Fin 3) ℂ) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 3) ℝ ℂ)) := + Basis.mk gellMannSU3_linearIndependent gellMannSU3_span + +@[simp] +lemma su3Basis_apply (k : Fin 8) : su3Basis k = gellMannSU3 k := by + rw [su3Basis, Basis.mk_apply] + +/-! + +## D. The Pauli basis of the su(2) factor + +-/ + +/-- The Pauli matrices `σ1`, `σ2`, `σ3` as elements of the `su(2)` factor of the gauge + algebra. -/ +def pauliSU2 (i : Fin 3) : + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 2) (Fin 2) ℂ) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 2) ℝ ℂ)) := + ⟨pauliMatrix (Sum.inr i), pauliMatrix_inr_star i, pauliMatrix_inr_trace i⟩ + +@[simp] +lemma coe_pauliSU2 (i : Fin 3) : + (pauliSU2 i : Matrix (Fin 2) (Fin 2) ℂ) = pauliMatrix (Sum.inr i) := rfl + +/-- The Pauli matrices `σ1`, `σ2`, `σ3` are linearly independent. -/ +lemma pauliSU2_linearIndependent : LinearIndependent ℝ pauliSU2 := by + apply Fintype.linearIndependent_iff.mpr + intro g hg + have hM : ∑ i, g i • pauliMatrix (Sum.inr i) = (0 : Matrix (Fin 2) (Fin 2) ℂ) := by + simpa [pauliSU2] using congrArg Subtype.val hg + rw [sum_smul_pauliMatrix_inr] at hM + have h00 := congrFun (congrFun hM 0) 0 + have h01 := congrFun (congrFun hM 0) 1 + simp [Complex.ext_iff] at h00 h01 + obtain ⟨h0, h1⟩ := h01 + intro i + fin_cases i <;> assumption + +/-- The Pauli matrices `σ1`, `σ2`, `σ3` span the `su(2)` factor. -/ +lemma pauliSU2_span : ⊤ ≤ Submodule.span ℝ (Set.range pauliSU2) := by + refine (Submodule.top_le_span_range_iff_forall_exists_fun ℝ).mpr fun A => ?_ + refine ⟨pauliCoeff (A : Matrix (Fin 2) (Fin 2) ℂ), Subtype.ext ?_⟩ + rw [AddSubmonoidClass.coe_finsetSum] + simp only [SetLike.val_smul, coe_pauliSU2] + exact (eq_sum_pauliCoeff_smul A.2.1 A.2.2).symm + +/-- The Pauli basis of the `su(2)` factor of the gauge algebra. -/ +def su2Basis : Basis (Fin 3) ℝ + ↥(selfAdjoint.submodule ℝ (Matrix (Fin 2) (Fin 2) ℂ) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin 2) ℝ ℂ)) := + Basis.mk pauliSU2_linearIndependent pauliSU2_span + +@[simp] +lemma su2Basis_apply (i : Fin 3) : su2Basis i = pauliSU2 i := by + rw [su2Basis, Basis.mk_apply] + +/-! + +## E. The basis of the u(1) factor + +-/ + +/-- The unit `1` as the single basis element of the `u(1)` factor of the gauge + algebra. -/ +def u1One (_ : Fin 1) : selfAdjoint ℂ := 1 + +@[simp] +lemma coe_u1One (i : Fin 1) : (u1One i : ℂ) = 1 := rfl + +/-- The unit is linearly independent. -/ +lemma u1One_linearIndependent : LinearIndependent ℝ u1One := by + apply Fintype.linearIndependent_iff.mpr + intro g hg + have h : g 0 = 0 := by + simpa [u1One] using congrArg Subtype.val hg + intro i + rw [Subsingleton.elim i 0] + exact h + +/-- The unit spans the `u(1)` factor. -/ +lemma u1One_span : ⊤ ≤ Submodule.span ℝ (Set.range u1One) := by + refine (Submodule.top_le_span_range_iff_forall_exists_fun ℝ).mpr fun z => ?_ + refine ⟨fun _ => (z : ℂ).re, Subtype.ext ?_⟩ + have hz : (z : ℂ).im = 0 := Complex.conj_eq_iff_im.mp z.2 + simp [u1One, Complex.ext_iff, hz] + +/-- The basis of the `u(1)` factor of the gauge algebra. -/ +def u1Basis : Basis (Fin 1) ℝ (selfAdjoint ℂ) := + Basis.mk u1One_linearIndependent u1One_span + +@[simp] +lemma u1Basis_apply (i : Fin 1) : u1Basis i = 1 := by + rw [u1Basis, Basis.mk_apply, u1One] + +/-! + +## F. The standard basis of the gauge algebra + +-/ + +/-- The standard basis of the gauge algebra, indexed by `Fin 8 ⊕ Fin 3 ⊕ Fin 1`: the + eight Gell-Mann matrices on the `su(3)` factor, the three Pauli matrices `σ1`, `σ2`, + `σ3` on the `su(2)` factor, and `1` on the `u(1)` factor. -/ +def stdBasis : Basis (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ GaugeAlgebra := + su3Basis.prod (su2Basis.prod u1Basis) + +@[simp] +lemma stdBasis_inl_toSU3Matrix (k : Fin 8) : + (stdBasis (Sum.inl k)).toSU3Matrix = gellMannMatrix k := by + simp only [stdBasis, toSU3Matrix, Basis.prod_apply_inl_fst, su3Basis_apply, coe_gellMannSU3] + +@[simp] +lemma stdBasis_inl_toSU2Matrix (k : Fin 8) : + (stdBasis (Sum.inl k)).toSU2Matrix = 0 := by + simp only [stdBasis, toSU2Matrix, Basis.prod_apply_inl_snd, Prod.fst_zero, + ZeroMemClass.coe_zero] + +@[simp] +lemma stdBasis_inl_toU1Value (k : Fin 8) : + (stdBasis (Sum.inl k)).toU1Value = 0 := by + simp only [stdBasis, toU1Value, Basis.prod_apply_inl_snd, Prod.snd_zero, + ZeroMemClass.coe_zero] + +@[simp] +lemma stdBasis_inr_inl_toSU3Matrix (i : Fin 3) : + (stdBasis (Sum.inr (Sum.inl i))).toSU3Matrix = 0 := by + simp only [stdBasis, toSU3Matrix, Basis.prod_apply_inr_fst, ZeroMemClass.coe_zero] + +@[simp] +lemma stdBasis_inr_inl_toSU2Matrix (i : Fin 3) : + (stdBasis (Sum.inr (Sum.inl i))).toSU2Matrix = pauliMatrix (Sum.inr i) := by + simp only [stdBasis, toSU2Matrix, Basis.prod_apply_inr_snd, Basis.prod_apply_inl_fst, + su2Basis_apply, coe_pauliSU2] + +@[simp] +lemma stdBasis_inr_inl_toU1Value (i : Fin 3) : + (stdBasis (Sum.inr (Sum.inl i))).toU1Value = 0 := by + simp only [stdBasis, toU1Value, Basis.prod_apply_inr_snd, Basis.prod_apply_inl_snd, + ZeroMemClass.coe_zero] + +@[simp] +lemma stdBasis_inr_inr_toSU3Matrix (i : Fin 1) : + (stdBasis (Sum.inr (Sum.inr i))).toSU3Matrix = 0 := by + simp only [stdBasis, toSU3Matrix, Basis.prod_apply_inr_fst, ZeroMemClass.coe_zero] + +@[simp] +lemma stdBasis_inr_inr_toSU2Matrix (i : Fin 1) : + (stdBasis (Sum.inr (Sum.inr i))).toSU2Matrix = 0 := by + simp only [stdBasis, toSU2Matrix, Basis.prod_apply_inr_snd, Basis.prod_apply_inr_fst, + ZeroMemClass.coe_zero] + +@[simp] +lemma stdBasis_inr_inr_toU1Value (i : Fin 1) : + (stdBasis (Sum.inr (Sum.inr i))).toU1Value = 1 := by + simp only [stdBasis, toU1Value, Basis.prod_apply_inr_snd, u1Basis_apply, + selfAdjoint.val_one] + +/-! + +## G. The adjoint action in the standard basis + +In the standard basis the adjoint action of a gauge group element is the block-diagonal +matrix `adjointMatrix`: the `su(3)` and `su(2)` blocks pair the basis elements with +their conjugates through the trace, and the `u(1)` entry is `1`. + +-/ + +lemma toSU3Matrix_sum {ι : Type*} (s : Finset ι) (f : ι → GaugeAlgebra) : + (∑ x ∈ s, f x).toSU3Matrix = ∑ x ∈ s, (f x).toSU3Matrix := by + classical + induction s using Finset.cons_induction with + | empty => simp + | cons a s ha ih => rw [Finset.sum_cons, Finset.sum_cons, add_toSU3Matrix, ih] + +lemma toSU2Matrix_sum {ι : Type*} (s : Finset ι) (f : ι → GaugeAlgebra) : + (∑ x ∈ s, f x).toSU2Matrix = ∑ x ∈ s, (f x).toSU2Matrix := by + classical + induction s using Finset.cons_induction with + | empty => simp + | cons a s ha ih => rw [Finset.sum_cons, Finset.sum_cons, add_toSU2Matrix, ih] + +lemma toU1Value_sum {ι : Type*} (s : Finset ι) (f : ι → GaugeAlgebra) : + (∑ x ∈ s, f x).toU1Value = ∑ x ∈ s, (f x).toU1Value := by + classical + induction s using Finset.cons_induction with + | empty => simp + | cons a s ha ih => rw [Finset.sum_cons, Finset.sum_cons, add_toU1Value, ih] + +/-- The matrix of the adjoint action of a gauge group element in the standard basis: + block diagonal, with the `su(3)` and `su(2)` blocks the trace pairings + `2⁻¹ * (trace (T a * g T b g⁻¹)).re` of the basis elements with the conjugated basis + elements, `1` on the `u(1)` entry, and `0` between different factors. -/ +noncomputable def adjointMatrix (g : GaugeGroupI) : + Matrix (Fin 8 ⊕ Fin 3 ⊕ Fin 1) (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ := + Matrix.of fun a b => + match a, b with + | Sum.inl a, Sum.inl b => + 2⁻¹ * (Matrix.trace (gellMannMatrix a * + (g.toSU3.1 * gellMannMatrix b * star g.toSU3.1))).re + | Sum.inr (Sum.inl i), Sum.inr (Sum.inl j) => + 2⁻¹ * (Matrix.trace (pauliMatrix (Sum.inr i) * + (g.toSU2.1 * pauliMatrix (Sum.inr j) * star g.toSU2.1))).re + | Sum.inr (Sum.inr _), Sum.inr (Sum.inr _) => 1 + | _, _ => 0 + +@[simp] +lemma adjointMatrix_inl_inl (g : GaugeGroupI) (a b : Fin 8) : + adjointMatrix g (Sum.inl a) (Sum.inl b) + = 2⁻¹ * (Matrix.trace (gellMannMatrix a * + (g.toSU3.1 * gellMannMatrix b * star g.toSU3.1))).re := rfl + +@[simp] +lemma adjointMatrix_inl_inr (g : GaugeGroupI) (a : Fin 8) (x : Fin 3 ⊕ Fin 1) : + adjointMatrix g (Sum.inl a) (Sum.inr x) = 0 := by + cases x <;> rfl + +@[simp] +lemma adjointMatrix_inr_inl (g : GaugeGroupI) (x : Fin 3 ⊕ Fin 1) (b : Fin 8) : + adjointMatrix g (Sum.inr x) (Sum.inl b) = 0 := by + cases x <;> rfl + +@[simp] +lemma adjointMatrix_inr_inl_inr_inl (g : GaugeGroupI) (i j : Fin 3) : + adjointMatrix g (Sum.inr (Sum.inl i)) (Sum.inr (Sum.inl j)) + = 2⁻¹ * (Matrix.trace (pauliMatrix (Sum.inr i) * + (g.toSU2.1 * pauliMatrix (Sum.inr j) * star g.toSU2.1))).re := rfl + +@[simp] +lemma adjointMatrix_inr_inl_inr_inr (g : GaugeGroupI) (i : Fin 3) (u : Fin 1) : + adjointMatrix g (Sum.inr (Sum.inl i)) (Sum.inr (Sum.inr u)) = 0 := rfl + +@[simp] +lemma adjointMatrix_inr_inr_inr_inl (g : GaugeGroupI) (u : Fin 1) (j : Fin 3) : + adjointMatrix g (Sum.inr (Sum.inr u)) (Sum.inr (Sum.inl j)) = 0 := rfl + +@[simp] +lemma adjointMatrix_inr_inr_inr_inr (g : GaugeGroupI) (u v : Fin 1) : + adjointMatrix g (Sum.inr (Sum.inr u)) (Sum.inr (Sum.inr v)) = 1 := rfl + +/-- The adjoint action of the gauge group acts on the standard basis through + `adjointMatrix`. -/ +lemma adjoint_stdBasis (g : GaugeGroupI) (b : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + adjoint g (stdBasis b) = ∑ a, adjointMatrix g a b • stdBasis a := by + match b with + | Sum.inl k => + have hmem := conj_mem g.toSU3.2.1 (gellMannMatrix_selfAdjoint k) (gellMannMatrix_trace k) + refine ext_of_matrix ?_ ?_ ?_ + · rw [adjoint_toSU3Matrix, stdBasis_inl_toSU3Matrix, toSU3Matrix_sum] + simp only [smul_toSU3Matrix, Fintype.sum_sum_type, stdBasis_inl_toSU3Matrix, + stdBasis_inr_inl_toSU3Matrix, stdBasis_inr_inr_toSU3Matrix, smul_zero, + Finset.sum_const_zero, add_zero, adjointMatrix_inl_inl] + conv_lhs => rw [eq_sum_gellMannCoeff_smul hmem.1 hmem.2] + exact Finset.sum_congr rfl fun a _ => by + rw [gellMannCoeff_eq_trace hmem.1 hmem.2] + · rw [adjoint_toSU2Matrix, stdBasis_inl_toSU2Matrix, toSU2Matrix_sum] + simp [Fintype.sum_sum_type] + · rw [adjoint_toU1Value, stdBasis_inl_toU1Value, toU1Value_sum] + simp [Fintype.sum_sum_type] + | Sum.inr (Sum.inl j) => + have hmem := conj_mem g.toSU2.2.1 (pauliMatrix_inr_star j) (pauliMatrix_inr_trace j) + refine ext_of_matrix ?_ ?_ ?_ + · rw [adjoint_toSU3Matrix, stdBasis_inr_inl_toSU3Matrix, toSU3Matrix_sum] + simp [Fintype.sum_sum_type] + · rw [adjoint_toSU2Matrix, stdBasis_inr_inl_toSU2Matrix, toSU2Matrix_sum] + simp only [smul_toSU2Matrix, Fintype.sum_sum_type, stdBasis_inl_toSU2Matrix, + stdBasis_inr_inl_toSU2Matrix, stdBasis_inr_inr_toSU2Matrix, smul_zero, + Finset.sum_const_zero, zero_add, add_zero, adjointMatrix_inr_inl_inr_inl] + conv_lhs => rw [eq_sum_pauliCoeff_smul hmem.1 hmem.2] + exact Finset.sum_congr rfl fun i _ => by + rw [pauliCoeff_eq_trace hmem.1 hmem.2] + · rw [adjoint_toU1Value, stdBasis_inr_inl_toU1Value, toU1Value_sum] + simp [Fintype.sum_sum_type] + | Sum.inr (Sum.inr u) => + refine ext_of_matrix ?_ ?_ ?_ + · rw [adjoint_toSU3Matrix, stdBasis_inr_inr_toSU3Matrix, toSU3Matrix_sum] + simp [Fintype.sum_sum_type] + · rw [adjoint_toSU2Matrix, stdBasis_inr_inr_toSU2Matrix, toSU2Matrix_sum] + simp [Fintype.sum_sum_type] + · rw [adjoint_toU1Value, stdBasis_inr_inr_toU1Value, toU1Value_sum] + simp [Fintype.sum_sum_type] + +/-- The matrix of the adjoint action in the standard basis is `adjointMatrix`. -/ +lemma toMatrix_adjoint (g : GaugeGroupI) : + LinearMap.toMatrix stdBasis stdBasis (adjoint g) = adjointMatrix g := by + ext a b + rw [LinearMap.toMatrix_apply, adjoint_stdBasis g b] + exact congrFun (stdBasis.repr_sum_self _) a + +/-- The action of `adjointMatrix` on coordinates in the standard basis corresponds to + the adjoint action of the gauge group on the gauge algebra. -/ +lemma adjointMatrix_mulVec_repr (g : GaugeGroupI) (a : GaugeAlgebra) : + (adjointMatrix g).mulVec (stdBasis.repr a) = ⇑(stdBasis.repr (adjoint g a)) := by + rw [← toMatrix_adjoint] + exact LinearMap.toMatrix_mulVec_repr stdBasis stdBasis (adjoint g) a + +/-- The dual adjoint action on the dual standard basis: the coordinate functions + transform through the rows of `adjointMatrix`. -/ +lemma adjoint_dualMap_coord (g : GaugeGroupI) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + (adjoint g).dualMap (stdBasis.coord a) + = ∑ b, adjointMatrix g a b • stdBasis.coord b := by + refine LinearMap.ext fun x => ?_ + have h := congrFun (adjointMatrix_mulVec_repr g x) a + simp only [LinearMap.dualMap_apply, Basis.coord_apply, LinearMap.sum_apply, + LinearMap.smul_apply, smul_eq_mul] + rw [← h] + simp [Matrix.mulVec, dotProduct] + +end GaugeAlgebra + +end + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index d7585606d..d5ee00574 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -789,6 +789,36 @@ noncomputable def adjoint : Representation ℝ JetGaugeGroupI JetGaugeAlgebra wh refine LinearMap.ext fun a => ?_ ext <;> simp [star_mul, mul_assoc] +/-- Evaluating the adjoint action of a gauge jet on a constant at the base point is + the adjoint action of the base-point value of the jet. -/ +lemma eval_adjointMap_ofConstant (U : JetGaugeGroupI) (a : GaugeAlgebra) : + eval (adjointMap U (ofConstant a)) = GaugeAlgebra.adjoint U.eval a := by + have hmap : ∀ {n : Type} [Fintype n] [DecidableEq n] (M : Matrix n n JetRing), + M.map (coeff (Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)))) = + (constantCoeff : JetRing →+* ℂ).mapMatrix M := by + intro n _ _ M + ext i j + simp [Matrix.map_apply, RingHom.mapMatrix_apply, coeff_zero_eq_constantCoeff] + have hC3 : (constantCoeff : JetRing →+* ℂ).mapMatrix (a.toSU3Matrix.map C) + = a.toSU3Matrix := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] + have hC2 : (constantCoeff : JetRing →+* ℂ).mapMatrix (a.toSU2Matrix.map C) + = a.toSU2Matrix := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · simp only [eval_apply, taylorCoeff_toSU3Matrix, adjointMap_toSU3Matrix, + ofConstant_toSU3Matrix, GaugeAlgebra.adjoint_toSU3Matrix] + rw [hmap, map_mul, map_mul, JetRing.mapMatrix_constantCoeff_star, hC3] + rfl + · simp only [eval_apply, taylorCoeff_toSU2Matrix, adjointMap_toSU2Matrix, + ofConstant_toSU2Matrix, GaugeAlgebra.adjoint_toSU2Matrix] + rw [hmap, map_mul, map_mul, JetRing.mapMatrix_constantCoeff_star, hC2] + rfl + · simp [eval_apply, taylorCoeff_toU1Value, adjointMap_toU1Value, ofConstant_toU1Value, + coeff_zero_eq_constantCoeff, constantCoeff_C, GaugeAlgebra.adjoint_toU1Value] + /-- The constant inclusion is a morphism of Lie algebras: constants bracket to constants. -/ lemma ofConstant_lie (a b : GaugeAlgebra) : diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index e22e4a4e5..7ace4af14 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -75,46 +75,22 @@ noncomputable def adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ (JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv x ∘ₗ JetGaugeAlgebra.adjointMap U ∘ₗ JetGaugeAlgebra.ofConstant).dualMap +/-- The zeroth dual adjoint coefficient is the dual of the adjoint action of the + base-point value of the gauge jet. -/ +lemma adjointDualCoeff_zero (U : JetGaugeGroupI) : + adjointDualCoeff U 0 = (GaugeAlgebra.adjoint U.eval).dualMap := by + rw [adjointDualCoeff] + refine congrArg LinearMap.dualMap (LinearMap.ext fun a => ?_) + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, + JetGaugeAlgebra.iteratedDeriv_zero, LinearMap.id_coe, id_eq] + exact JetGaugeAlgebra.eval_adjointMap_ofConstant U a + /-- For a gauge jet whose value at the base point is the identity, the zeroth dual adjoint coefficient is trivial: the base-point adjoint action `Ad_{U₀}` is the identity. -/ lemma adjointDualCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : adjointDualCoeff U 0 = LinearMap.id := by - have h3 : (constantCoeff : JetRing →+* ℂ).mapMatrix U.1.1 = 1 := - congrArg (fun g : GaugeGroupI => (g.1.1 : Matrix (Fin 3) (Fin 3) ℂ)) hU - have h2 : (constantCoeff : JetRing →+* ℂ).mapMatrix U.2.1.1 = 1 := - congrArg (fun g : GaugeGroupI => (g.2.1.1 : Matrix (Fin 2) (Fin 2) ℂ)) hU - have hmap : ∀ {n : Type} [Fintype n] [DecidableEq n] (M : Matrix n n JetRing), - M.map (coeff (Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)))) = - (constantCoeff : JetRing →+* ℂ).mapMatrix M := by - intro n _ _ M - ext i j - simp [Matrix.map_apply, RingHom.mapMatrix_apply, coeff_zero_eq_constantCoeff] - have key : ∀ a : GaugeAlgebra, - JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv 0 - (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a))) = a := by - intro a - refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ - · simp only [JetGaugeAlgebra.iteratedDeriv_zero, LinearMap.id_coe, id_eq, - JetGaugeAlgebra.eval_apply, JetGaugeAlgebra.taylorCoeff_toSU3Matrix, - JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.ofConstant_toSU3Matrix] - rw [hmap, map_mul, map_mul, h3, one_mul, JetRing.mapMatrix_constantCoeff_star, h3, - star_one, mul_one] - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] - · simp only [JetGaugeAlgebra.iteratedDeriv_zero, LinearMap.id_coe, id_eq, - JetGaugeAlgebra.eval_apply, JetGaugeAlgebra.taylorCoeff_toSU2Matrix, - JetGaugeAlgebra.adjointMap_toSU2Matrix, JetGaugeAlgebra.ofConstant_toSU2Matrix] - rw [hmap, map_mul, map_mul, h2, one_mul, JetRing.mapMatrix_constantCoeff_star, h2, - star_one, mul_one] - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] - · simp [JetGaugeAlgebra.iteratedDeriv_zero, JetGaugeAlgebra.eval_apply, - coeff_zero_eq_constantCoeff, constantCoeff_C] - refine LinearMap.ext fun φ => LinearMap.ext fun a => ?_ - show φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv 0 - (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a)))) = φ a - rw [key a] + rw [adjointDualCoeff_zero, hU, map_one, Module.End.one_eq_id, LinearMap.dualMap_id] /-- The dual adjoint coefficient at a single derivative: since `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆` (`deriv_adjointMap`) and constants diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean index 791fbef32..a59f97abc 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint +public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis /-! # The field strength @@ -96,6 +97,21 @@ lemma repGauge_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) Complex.ofReal_sub, map_sub] abel +/-- The transformation of the field strength written in the standard basis of the + gauge algebra, in terms of `adjointMatrix`: the component + `F_μν^a = F_μν(stdBasis.coord a)` transforms through the adjoint matrix of the + base-point value of `U⁻¹`, + + `U • F_μν^a = ∑ b, Ad(U₀⁻¹)^a_b F_μν^b`. -/ +lemma repGauge_fieldStrength_stdBasis (hA : IsGaugeField repLorentz repGauge A D D_comm) + (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + repGauge U (fieldStrength A D μ ν (GaugeAlgebra.stdBasis.coord a)) = + ∑ b, GaugeAlgebra.adjointMatrix (U⁻¹).eval a b • + fieldStrength A D μ ν (GaugeAlgebra.stdBasis.coord b) := by + rw [hA.repGauge_fieldStrength U μ ν, adjointDualCoeff_zero, + GaugeAlgebra.adjoint_dualMap_coord, map_sum] + simp only [map_smul] + set_option maxHeartbeats 1000000 in /-- **The transformation law of the derived field strength**: for `D` a derivation (Leibniz rule, taken as the hypothesis `hD` since `IsGaugeField` does not postulate diff --git a/Physlib/Particles/StandardModel/GaugeBosons/FieldStrength/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/FieldStrength/Basic.lean new file mode 100644 index 000000000..f306df66e --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/FieldStrength/Basic.lean @@ -0,0 +1,27 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.FieldStrength +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation +public import Mathlib.LinearAlgebra.Basis.Defs +public import Mathlib.LinearAlgebra.Dimension.Free +/-! + +# Algebra valued field strength + +-/ + +@[expose] public section + +namespace StandardModel +open Matrix MatrixGroups TensorProduct MvPowerSeries +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +end StandardModel From 05f1212bb9604c65ee1b819d0ed03e3601b36a43 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 08:36:34 +0100 Subject: [PATCH 215/254] feat: Start laying out full construction --- .../StandardModel/IsStandardModel/Basic.lean | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Physlib/Particles/StandardModel/IsStandardModel/Basic.lean diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean new file mode 100644 index 000000000..750b2d16b --- /dev/null +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.HiggsBoson.Basic +public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim +public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +public import Mathlib.RepresentationTheory.Invariants +/-! +# The algebra valued Standard model + +This contains +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +TODO "Move IsGaugeField.TransformsIn out of the `IsGaugeField` namespac." + +structure IsStandardModel (B : Type*) [Semiring B] [Algebra ℂ B] + -- The representations + (repJet : Representation ℂ JetGaugeGroupI B) (repLorentz : Representation ℂ SL(2,ℂ) B) + -- The mass weights + (massWeightPoly : B →ₐ[ℂ] Polynomial B) + -- The Higgs fields + derivatives + (H : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B) + (barH : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) + -- The gauge fields + derivatives + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + -- Three families of down-type quarks + derivatives + conjugates + (d : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B) + (bard : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B) + -- Three families of up-type quarks + derivatives + conjugates + (u : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B) + (baru : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B) + -- Three families of quark doublets + derivatives + conjugates + (Q : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B) + (barQ : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B) + -- Three families of lepton doublets + derivatives + conjugates + (L : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B) + (barL : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B) + -- Three families of lepton singlets + derivatives + conjugates + (e : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B) + (bare : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B) + : Prop where + -- The action of the Gauge group on L + -- repJet_L : IsGaugeField.TransformsIn repJet L + +end StandardModel From f48675c9ab11ed7278fa7cbd2e8ad69328527b25 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 10:00:50 +0100 Subject: [PATCH 216/254] feat: Update Lorentz derives for covariant argument --- .../GaugeBosons/AlgebraValued/Basic.lean | 414 ++++-------- .../AlgebraValued/FieldStrength.lean | 362 +++------- .../AlgebraValued/Symmeterized.lean | 620 ++++++++---------- .../AlgebraValued/TransformsInAdjoint.lean | 239 +++---- .../GaugeJetAlgebra/Invariants.lean | 63 +- .../StandardModel/JetAlgebra/Invariants.lean | 56 +- .../JetComponentSpace/CovariantDeriv.lean | 411 ++++++------ .../InfinitesimalAction.lean | 175 ++--- Physlib/Relativity/IsLorentzDeriv.lean | 62 ++ 9 files changed, 1007 insertions(+), 1395 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index 7ace4af14..b3d0295d1 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean @@ -187,6 +187,7 @@ lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} {n : (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant b)))) = 0 rw [key b, map_zero] +open Lorentz /-- The family `A` of symbols in the algebra `B` is a gauge field for the total derivative `D`, the Lorentz representation `repLorentz` and the gauge representation `repGauge`, when it satisfies the transformation laws of the physicists' gauge field: @@ -202,23 +203,21 @@ lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} {n : action a left action, exactly as in `φ'(x) = φ(Λ⁻¹ x)`. -/ structure IsGaugeField (repLorentz : Representation ℂ SL(2,ℂ) B) (repGauge : Representation ℂ JetGaugeGroupI B) - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - [Lorentz.IsLorentzDeriv repLorentz D] - (deriv_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) : Prop where + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : Prop where /-- The gauge-field symbol carries one covector Lorentz index. -/ - lorentz_apply : ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - repLorentz Λ (A μ φ) = - ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • A a φ + lorentz_apply : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (A (List.ofFn l) μ φ) = + ∑ (p : Fin n → (Fin 1 ⊕ Fin 3)), + (∏ (i : Fin n), (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • A (List.ofFn p) a φ /-- The gauge transformation of the derivative symbols `[∂_s A_μ^a]`: the Leibniz convolution of the dual adjoint action of `U⁻¹` against lower derivative symbols (the multiset antidiagonal carries the multinomial coefficients), plus the base-point value of the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ gauge_apply_deriv : ∀ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - repGauge U (Lorentz.iteratedD D deriv_comm s (A μ φ)) = - (s.antidiagonal.map fun p => - Lorentz.iteratedD D deriv_comm p.2 (A μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + repGauge U (A s μ φ) = + (s.antidiagonal.map fun p => (A p.2 μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s (maurerCartanForm U⁻¹ μ)))) /-- The gauge action preserves products: gauge transformations act on the algebra of @@ -230,32 +229,7 @@ namespace IsGaugeField variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} -variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} -variable [Lorentz.IsLorentzDeriv repLorentz D] -variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} - -lemma iteratedD_sub_pair (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) - (s : Multiset (Fin 1 ⊕ Fin 3)) {ν : Fin 1 ⊕ Fin 3} (hν : ν ∈ s) - (μ : Fin 1 ⊕ Fin 3) - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (φ : Module.Dual ℝ GaugeAlgebra) : - Lorentz.iteratedD D D_comm s (A μ φ) - - Lorentz.iteratedD D D_comm (μ ::ₘ s - {ν}) (A ν φ) = - Lorentz.iteratedD D D_comm (s - {ν}) (D ν (A μ φ) - D μ (A ν φ)) := by - obtain ⟨t, rfl⟩ : ∃ t, s = ν ::ₘ t := ⟨s.erase ν, (Multiset.cons_erase hν).symm⟩ - have h1 : ∀ (κ : Fin 1 ⊕ Fin 3) (x : B), - Lorentz.iteratedD D D_comm (κ ::ₘ t) x = Lorentz.iteratedD D D_comm t (D κ x) := by - intro κ x - rw [show (κ ::ₘ t) = t + {κ} from by rw [← Multiset.singleton_add, add_comm], - Lorentz.iteratedD_add, LinearMap.comp_apply] - congr 1 - rw [show ν ::ₘ t - {ν} = t from by - rw [Multiset.sub_singleton, Multiset.erase_cons_head], - show μ ::ₘ ν ::ₘ t - {ν} = μ ::ₘ t from by - rw [Multiset.cons_swap, Multiset.sub_singleton, Multiset.erase_cons_head], - h1 ν, h1 μ, ← map_sub] +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} /-- The canonical equivalence, through finite-dimensional duality, between algebra-valued fields `B ⊗ 𝔤` and their component families `φ ↦ A^φ`: the element @@ -282,37 +256,31 @@ noncomputable def tensorBracket : the physicists' `f^a_{bc} A_μ^b A_ν^c` contracted with a dual adjoint vector, but basis-free — the two fields are assembled into `B ⊗ 𝔤` by `dualPairEquiv.symm`, bracketed there by `tensorBracket`, and read back out as components. -/ -noncomputable def commutator (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) +noncomputable def commutator + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - dualPairEquiv (tensorBracket (dualPairEquiv.symm (A μ)) (dualPairEquiv.symm (A ν))) + dualPairEquiv (tensorBracket (dualPairEquiv.symm (A 0 μ)) (dualPairEquiv.symm (A 0 ν))) /-- The gauge transformation of the underived symbol `A_μ^φ`: the special case `s = 0` of `gauge_apply_deriv`, with no Leibniz convolution left over — the dual adjoint action of the value of `U⁻¹` plus the Maurer–Cartan shift. -/ -lemma repGauge_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) (U : JetGaugeGroupI) +lemma repGauge_apply (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (A μ φ) = A μ (adjointDualCoeff U⁻¹ ∅ φ) + + repGauge U (A 0 μ φ) = A 0 μ (adjointDualCoeff U⁻¹ ∅ φ) + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ))) := by - simpa [Lorentz.iteratedD, show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using + simpa [show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using hA.gauge_apply_deriv U 0 μ φ /-- The gauge transformation of the once-derived symbol `∂_ρ A_σ`: the case `s = {ρ}` of `gauge_apply_deriv` — the two Leibniz splittings of one derivative, plus the base-point value of the derived Maurer–Cartan form. -/ -lemma repGauge_deriv_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_deriv_apply (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (D ρ (A σ φ)) = - D ρ (A σ (adjointDualCoeff U⁻¹ 0 φ)) + A σ (adjointDualCoeff U⁻¹ {ρ} φ) + + repGauge U (A {ρ} σ φ) = + A {ρ} σ (adjointDualCoeff U⁻¹ 0 φ) + A 0 σ (adjointDualCoeff U⁻¹ {ρ} φ) + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ σ)))) := by - have hzero : Lorentz.iteratedD D D_comm (0 : Multiset (Fin 1 ⊕ Fin 3)) = - LinearMap.id := by - simp only [Lorentz.iteratedD, Multiset.foldr_zero] - have hsingle : Lorentz.iteratedD D D_comm ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = D ρ := by - rw [show ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = ρ ::ₘ 0 from rfl] - simp only [Lorentz.iteratedD, Multiset.foldr_cons, Multiset.foldr_zero, - LinearMap.comp_id] have hanti : ({ρ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = {((0 : Multiset (Fin 1 ⊕ Fin 3)), ({ρ} : Multiset (Fin 1 ⊕ Fin 3))), (({ρ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by @@ -322,9 +290,10 @@ lemma repGauge_deriv_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) have h := hA.gauge_apply_deriv U {ρ} σ φ rw [hanti] at h simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, - Multiset.sum_cons, Multiset.sum_singleton, hzero, hsingle, - JetGaugeAlgebra.iteratedDeriv_singleton, LinearMap.id_coe, id_eq] at h - exact h + Multiset.sum_cons, Multiset.sum_singleton, + JetGaugeAlgebra.iteratedDeriv_singleton] at h + refine h.trans ?_ + abel /-! @@ -455,13 +424,13 @@ set_option maxHeartbeats 1000000 in commutator of the two Maurer–Cartan shifts. Uses that the gauge action is by algebra homomorphisms (`gauge_mul`) and that the base-point adjoint transport is a morphism of Lie algebras. -/ -lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : repGauge U (commutator A μ ν φ) = commutator A μ ν (adjointDualCoeff U⁻¹ 0 φ) - - A μ (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + - A 0 μ (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)))) - + A ν (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra + + A 0 ν (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ)))) + algebraMap ℂ B (φ ⁅JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ), JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)⁆) := by @@ -472,8 +441,8 @@ lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) JetGaugeAlgebra.adjointMap U⁻¹ ∘ₗ JetGaugeAlgebra.ofConstant with hT₀def set cμ : GaugeAlgebra := JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ) with hcμ set cν : GaugeAlgebra := JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν) with hcν - set s : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm (A μ) with hs - set t : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm (A ν) with ht + set s : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm (A 0 μ) with hs + set t : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm (A 0 ν) with ht have hcoeff : adjointDualCoeff U⁻¹ 0 = T₀.dualMap := by rw [hT₀def]; rfl -- the base-point adjoint transport is a Lie algebra morphism have hT₀lie : ∀ a b : GaugeAlgebra, T₀ ⁅a, b⁆ = ⁅T₀ a, T₀ b⁆ := by @@ -482,7 +451,7 @@ lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) LieHom.map_lie] -- the transformed component families in tensor form have hfam : ∀ (ρ : Fin 1 ⊕ Fin 3), - Φ ∘ₗ A ρ = A ρ ∘ₗ T₀.dualMap + + Φ ∘ₗ A 0 ρ = A 0 ρ ∘ₗ T₀.dualMap + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ρ)) := by intro ρ refine LinearMap.ext fun ψ => ?_ @@ -501,9 +470,9 @@ lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) -- record the pairing identities, then make the local definitions opaque have hcomm_pair : dualPairEquiv (tensorBracket s t) = commutator A μ ν := by rw [hs, ht]; rfl - have hπs : dualPairEquiv s = A μ := by + have hπs : dualPairEquiv s = A 0 μ := by rw [hs]; exact dualPairEquiv.apply_symm_apply _ - have hπt : dualPairEquiv t = A ν := by + have hπt : dualPairEquiv t = A 0 ν := by rw [ht]; exact dualPairEquiv.apply_symm_apply _ have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => hA.gauge_mul U b₁ b₂ @@ -524,7 +493,7 @@ lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) abel -- read the tensor identity back through the pairing have hread := congrArg (fun z => dualPairEquiv z φ) htensor - simp only [map_add, map_sub, map_neg, LinearMap.add_apply, LinearMap.sub_apply, + simp only [map_add, map_sub, LinearMap.add_apply, LinearMap.sub_apply, dualPairEquiv_map_left, dualPairEquiv_map_right, dualPairEquiv_one_tmul] at hread rw [show repGauge U (commutator A μ ν φ) = Φ (dualPairEquiv (tensorBracket s t) φ) from by @@ -578,29 +547,15 @@ lemma _root_.StandardModel.adjointDualCoeff_pair (U : JetGaugeGroupI) /-- The gauge transformation of the twice-derived symbol `∂_ρ ∂_σ A_τ`: the case `s = ρ ::ₘ {σ}` of `gauge_apply_deriv` — the four Leibniz splittings of two derivatives, plus the base-point value of the twice-derived Maurer–Cartan form. -/ -lemma repGauge_deriv_deriv_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_deriv_deriv_apply (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (D ρ (D σ (A τ φ))) = - D ρ (D σ (A τ (adjointDualCoeff U⁻¹ 0 φ))) - + D ρ (A τ (adjointDualCoeff U⁻¹ {σ} φ)) - + D σ (A τ (adjointDualCoeff U⁻¹ {ρ} φ)) - + A τ (adjointDualCoeff U⁻¹ (ρ ::ₘ {σ}) φ) + repGauge U (A (ρ ::ₘ {σ}) τ φ) = + A (ρ ::ₘ {σ}) τ (adjointDualCoeff U⁻¹ 0 φ) + + A {ρ} τ (adjointDualCoeff U⁻¹ {σ} φ) + + A {σ} τ (adjointDualCoeff U⁻¹ {ρ} φ) + + A 0 τ (adjointDualCoeff U⁻¹ (ρ ::ₘ {σ}) φ) + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ (JetGaugeAlgebra.deriv σ (maurerCartanForm U⁻¹ τ))))) := by - have hzero : Lorentz.iteratedD D D_comm (0 : Multiset (Fin 1 ⊕ Fin 3)) = - LinearMap.id := by - simp only [Lorentz.iteratedD, Multiset.foldr_zero] - have hsingle : ∀ κ : Fin 1 ⊕ Fin 3, - Lorentz.iteratedD D D_comm ({κ} : Multiset (Fin 1 ⊕ Fin 3)) = D κ := by - intro κ - rw [show ({κ} : Multiset (Fin 1 ⊕ Fin 3)) = κ ::ₘ 0 from rfl] - simp only [Lorentz.iteratedD, Multiset.foldr_cons, Multiset.foldr_zero, - LinearMap.comp_id] - have hpair : Lorentz.iteratedD D D_comm (ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3))) = - (D ρ).comp (D σ) := by - rw [show ({σ} : Multiset (Fin 1 ⊕ Fin 3)) = σ ::ₘ 0 from rfl] - simp only [Lorentz.iteratedD, Multiset.foldr_cons, Multiset.foldr_zero, - LinearMap.comp_id] have hanti₁ : ({σ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = {((0 : Multiset (Fin 1 ⊕ Fin 3)), ({σ} : Multiset (Fin 1 ⊕ Fin 3))), (({σ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by @@ -617,9 +572,8 @@ lemma repGauge_deriv_deriv_apply (hA : IsGaugeField repLorentz repGauge A D D_co have h := hA.gauge_apply_deriv U (ρ ::ₘ {σ}) τ φ rw [hanti] at h simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, - Multiset.sum_cons, Multiset.sum_singleton, hzero, hsingle, hpair, - LinearMap.comp_apply, JetGaugeAlgebra.iteratedDeriv_cons, - JetGaugeAlgebra.iteratedDeriv_singleton, LinearMap.id_coe, id_eq] at h + Multiset.sum_cons, Multiset.sum_singleton, JetGaugeAlgebra.iteratedDeriv_cons, + LinearMap.comp_apply, JetGaugeAlgebra.iteratedDeriv_singleton] at h refine h.trans ?_ abel @@ -636,8 +590,25 @@ noncomputable def bracketFam (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := dualPairEquiv (tensorBracket (dualPairEquiv.symm f) (dualPairEquiv.symm g)) -lemma commutator_eq_bracketFam (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (μ ν : Fin 1 ⊕ Fin 3) : commutator A μ ν = bracketFam (A μ) (A ν) := rfl +lemma commutator_eq_bracketFam + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : commutator A μ ν = bracketFam (A 0 μ) (A 0 ν) := rfl + +/-- **The derived commutator family**: the `s`-derivative of the commutator term, given + by the Leibniz convolution of the derivative symbols over the multiset antidiagonal. + With the derivative symbols as primitives this convolution is the definition; for + `s = 0` it is the commutator itself (`commutatorFam_zero`). -/ +noncomputable def commutatorFam + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + (s.antidiagonal.map fun p => bracketFam (A p.1 μ) (A p.2 ν)).sum + +lemma commutatorFam_zero + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : commutatorFam A μ ν 0 = commutator A μ ν := by + rw [commutatorFam, Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton, commutator_eq_bracketFam] lemma bracketFam_add_left (f₁ f₂ g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : bracketFam (f₁ + f₂) g = bracketFam f₁ g + bracketFam f₂ g := by @@ -758,89 +729,13 @@ lemma bracketFam_dualMap_derivation (T₀ T₁ : GaugeAlgebra →ₗ[ℝ] GaugeA dualPairEquiv_map_right] rfl -/-- With `D` a derivation (Leibniz rule on `B`), the derivative of the commutator - term distributes: `∂_ρ ⁅A_μ, A_ν⁆ = ⁅∂_ρ A_μ, A_ν⁆ + ⁅A_μ, ∂_ρ A_ν⁆`. -/ -lemma deriv_commutator (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - (ρ μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - D ρ (commutator A μ ν φ) = - bracketFam ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν) φ + - bracketFam (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν) φ := by - have h := congrArg (fun z => dualPairEquiv z φ) - (tensorBracket_map_left_derivation ((D ρ).restrictScalars ℝ) - (fun b₁ b₂ => hD ρ b₁ b₂) (dualPairEquiv.symm (A μ)) (dualPairEquiv.symm (A ν))) - simp only [map_add, LinearMap.add_apply, dualPairEquiv_map_left] at h - rw [← symm_comp_left, ← symm_comp_left] at h - exact h - -/-- Every derivative of the commutator term is a polynomial in - strictly lower-order derivative symbols, by the Leibniz expansion — each factor of - `d_{s'}(A^b_ν A^c_λ)` has order at most `|s'|`. -/ -lemma iteratedD_commutator_mem (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) - (s' : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - Lorentz.iteratedD D D_comm s' (commutator A ν lam φ) ∈ - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ s'.card ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} := by - classical - set bv := Module.Free.chooseBasis ℝ GaugeAlgebra with hbv - -- a dual vector is recovered from its values on the basis - have hdual : ∀ ψ : Module.Dual ℝ GaugeAlgebra, ∑ j, ψ (bv j) • bv.coord j = ψ := by - intro ψ - refine LinearMap.ext fun x => ?_ - conv_rhs => rw [← bv.sum_repr x, map_sum] - simp only [LinearMap.sum_apply, LinearMap.smul_apply, Module.Basis.coord_apply, - smul_eq_mul, map_smul] - exact Finset.sum_congr rfl fun j _ => mul_comm _ _ - -- the tensor form of any component family, expanded through the basis - have hbasis : ∀ f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B, - dualPairEquiv.symm f = ∑ j, f (bv.coord j) ⊗ₜ[ℝ] bv j := by - intro f - apply dualPairEquiv.injective - rw [LinearEquiv.apply_symm_apply] - refine LinearMap.ext fun ψ => ?_ - calc f ψ = f (∑ j, ψ (bv j) • bv.coord j) := by rw [hdual] - _ = ∑ j, ψ (bv j) • f (bv.coord j) := by - rw [map_sum] - exact Finset.sum_congr rfl fun j _ => map_smul f _ _ - _ = dualPairEquiv (∑ j, f (bv.coord j) ⊗ₜ[ℝ] bv j) ψ := by simp - -- the commutator as an explicit double sum of products of symbols - have hcomm : commutator A ν lam φ = - ∑ j, ∑ k, φ ⁅bv j, bv k⁆ • (A ν (bv.coord j) * A lam (bv.coord k)) := by - rw [show commutator A ν lam = dualPairEquiv (tensorBracket - (dualPairEquiv.symm (A ν)) (dualPairEquiv.symm (A lam))) from rfl, - hbasis (A ν), hbasis (A lam)] - simp [tensorBracket_tmul, dualPairEquiv_tmul] - rw [Finset.sum_comm] - rw [hcomm, map_sum] - refine Subalgebra.sum_mem _ fun j _ => ?_ - rw [map_sum] - refine Subalgebra.sum_mem _ fun k _ => ?_ - rw [LinearMap.map_smul_of_tower, ← algebraMap_smul ℂ (φ ⁅bv j, bv k⁆)] - refine Subalgebra.smul_mem _ ?_ _ - rw [Lorentz.iteratedD_mul D D_comm D_mul] - refine multiset_sum_mem _ fun x hx => ?_ - obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx - have hle := Multiset.mem_antidiagonal.mp hp - refine mul_mem - (Algebra.subset_adjoin ⟨p.1, ν, bv.coord j, ?_, rfl⟩) - (Algebra.subset_adjoin ⟨p.2, lam, bv.coord k, ?_, rfl⟩) - · exact hle ▸ Multiset.card_le_card (Multiset.le_add_right _ _) - · exact hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) - - set_option maxHeartbeats 1000000 in /-- The gauge transformation of the bracket of two component families with affine transformation laws `f ↦ f' + φ(c_f)·1` and `g ↦ g' + φ(c_g)·1`: the bracket of the transformed families, two `ad` cross terms, and the constant bracket `⁅c_f, c_g⁆`. Pure bilinearity, with `tensorBracket_one_left/right` computing the cross terms; `repGauge_commutator` is the special case of two field symbols. -/ -lemma repGauge_bracketFam (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_bracketFam (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) {f g f' g' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {cf cg : GaugeAlgebra} (hf : ∀ ψ : Module.Dual ℝ GaugeAlgebra, @@ -963,6 +858,33 @@ lemma _root_.Multiset.sum_linearMap_apply {R M N : Type*} [Semiring R] [AddCommM | empty => simp | cons f S ih => simp [ih] +/-- Every derived commutator term is a polynomial in derivative symbols of order at + most that of the derivative: each Leibniz splitting contributes a product of two + lower-order symbols. -/ +lemma commutatorFam_mem + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + commutatorFam A ν lam s' φ ∈ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ s'.card ∧ b = A p μ φ} := by + classical + rw [commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle := Multiset.mem_antidiagonal.mp hp + rw [Function.comp_apply, bracketFam_apply_eq_sum] + refine Subalgebra.sum_mem _ fun j _ => Subalgebra.sum_mem _ fun k _ => ?_ + rw [← algebraMap_smul ℂ (φ ⁅Module.Free.chooseBasis ℝ GaugeAlgebra j, + Module.Free.chooseBasis ℝ GaugeAlgebra k⁆)] + refine Subalgebra.smul_mem _ ?_ _ + refine mul_mem + (Algebra.subset_adjoin ⟨p.1, ν, (Module.Free.chooseBasis ℝ GaugeAlgebra).coord j, ?_, rfl⟩) + (Algebra.subset_adjoin ⟨p.2, lam, (Module.Free.chooseBasis ℝ GaugeAlgebra).coord k, ?_, rfl⟩) + · exact hle ▸ Multiset.card_le_card (Multiset.le_add_right _ _) + · exact hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) + + /-- A pure tensor against a multiset sum distributes over the sum. -/ lemma _root_.Multiset.tmul_sum {R M N : Type*} [CommSemiring R] [AddCommMonoid M] [AddCommMonoid N] [Module R M] [Module R N] (m : M) (S : Multiset N) : @@ -999,52 +921,6 @@ lemma bracketFam_sum_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) | empty => simp [bracketFam_zero_right] | cons g S ih => simp [bracketFam_add_right, ih] -/-- With `D` a derivation, the one-step Leibniz rule for the bracket of arbitrary - component families. -/ -lemma deriv_bracketFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (κ : Fin 1 ⊕ Fin 3) - (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) : - D κ (bracketFam f g φ) = - bracketFam ((D κ).restrictScalars ℝ ∘ₗ f) g φ + - bracketFam f ((D κ).restrictScalars ℝ ∘ₗ g) φ := by - have h := congrArg (fun z => dualPairEquiv z φ) - (tensorBracket_map_left_derivation ((D κ).restrictScalars ℝ) - (fun b₁ b₂ => hD κ b₁ b₂) (dualPairEquiv.symm f) (dualPairEquiv.symm g)) - simp only [map_add, LinearMap.add_apply, dualPairEquiv_map_left] at h - rw [← symm_comp_left, ← symm_comp_left] at h - exact h - -/-- The iterated Leibniz rule for the bracket of component families: the iterated - derivative of `⁅f, g⁆` is the antidiagonal convolution of derived brackets. -/ -lemma iteratedD_bracketFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (s : Multiset (Fin 1 ⊕ Fin 3)) - (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) : - Lorentz.iteratedD D D_comm s (bracketFam f g φ) = - (s.antidiagonal.map fun p => - bracketFam ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) - ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) φ).sum := by - induction s using Multiset.induction_on generalizing f g with - | empty => - simp [Lorentz.iteratedD_zero, Multiset.antidiagonal_zero, - show (LinearMap.id : B →ₗ[ℂ] B).restrictScalars ℝ = LinearMap.id from rfl] - | cons κ s ih => - rw [Lorentz.iteratedD_cons, LinearMap.comp_apply, ih f g, map_multiset_sum, - Multiset.map_map, - Multiset.map_congr rfl (fun p hp => by - rw [Function.comp_apply, deriv_bracketFam hD κ, - show (D κ).restrictScalars ℝ ∘ₗ - ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) = - (Lorentz.iteratedD D D_comm (κ ::ₘ p.1)).restrictScalars ℝ ∘ₗ f from by - rw [Lorentz.iteratedD_cons]; rfl, - show (D κ).restrictScalars ℝ ∘ₗ - ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) = - (Lorentz.iteratedD D D_comm (κ ::ₘ p.2)).restrictScalars ℝ ∘ₗ g from by - rw [Lorentz.iteratedD_cons]; rfl]), - Multiset.sum_map_add] - simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, - Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] - abel - /-! ## The all-orders transport, coefficient, and structural identities @@ -1236,34 +1112,33 @@ lemma _root_.Multiset.sum_map_neg'' {ι M : Type*} [AddCommGroup M] the Leibniz splittings where `κ` stays a derivative, minus (by `adjointDualCoeff_cons`) the splittings where `κ` hits the adjoint — an `ad` of the derived Maurer–Cartan form — plus the derived Maurer–Cartan shift. -/ -lemma repGauge_iteratedD_cons_apply (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_cons_apply (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (A τ φ)) = + repGauge U (A (κ ::ₘ s) τ φ) = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (A τ (adjointDualCoeff U⁻¹ p.1 φ))).sum + A (κ ::ₘ p.2) τ (adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (A τ (adjointDualCoeff U⁻¹ q.2 + A p.2 τ (adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ κ))))))).sum).sum + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ κ)))))).sum).sum + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv (κ ::ₘ s) (maurerCartanForm U⁻¹ τ)))) := by rw [hA.gauge_apply_deriv U (κ ::ₘ s) τ φ] congr 1 simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] - have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 - (A τ (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = + have hsec : (Multiset.map (fun p => + A p.2 τ (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = -(s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (A τ (adjointDualCoeff U⁻¹ q.2 + A p.2 τ (adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ κ)))))).sum).sum := by rw [← Multiset.sum_map_neg''] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, - Multiset.map_map, map_multiset_sum, Multiset.map_map] + rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_multiset_sum, Multiset.map_map] exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) rw [hsec, sub_eq_add_neg] @@ -1273,24 +1148,22 @@ set_option maxHeartbeats 2000000 in and the convolution of Maurer–Cartan bracket shifts. This is `repGauge_commutator` at every derivative order simultaneously; the regrouping of the four-fold splitting is `Multiset.sum_antidiagonal_exchange`. -/ -lemma repGauge_iteratedD_commutator (hA : IsGaugeField repLorentz repGauge A D D_comm) - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) +lemma repGauge_commutatorFam (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (Lorentz.iteratedD D D_comm s (commutator A μ ν φ)) = + repGauge U (commutatorFam A μ ν s φ) = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (commutator A μ ν - (adjointDualCoeff U⁻¹ p.1 φ))).sum + commutatorFam A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (A ν (adjointDualCoeff U⁻¹ r.1 + A r.2 ν (adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ))))))).sum).sum + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)))))).sum).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + A q.2 μ (adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν))))))).sum).sum + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν)))))).sum).sum + (s.antidiagonal.map fun p => algebraMap ℂ B (φ ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)), @@ -1299,31 +1172,22 @@ lemma repGauge_iteratedD_commutator (hA : IsGaugeField repLorentz repGauge A D D -- the affine transformation law of the derived symbols, with the Leibniz sum as a map have hAlaw : ∀ (τ : Fin 1 ⊕ Fin 3) (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), - repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A τ) ψ) = - ((u.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A τ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) ψ + repGauge U (A u τ ψ) = + ((u.antidiagonal.map fun q => A q.2 τ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ τ)))) := by intro τ u ψ - show repGauge U (Lorentz.iteratedD D D_comm u (A τ ψ)) = _ rw [hA.gauge_apply_deriv U u τ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 -- the convolution triple sum in its two groupings have hMa : (s.antidiagonal.map fun p => - bracketFam ((p.1.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A μ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) - ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ - adjointDualCoeff U⁻¹ r.1).sum) φ).sum = + bracketFam ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) φ).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - bracketFam ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A μ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ - adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by + bracketFam (A q.2 μ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) rw [bracketFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map] @@ -1334,65 +1198,53 @@ lemma repGauge_iteratedD_commutator (hA : IsGaugeField repLorentz repGauge A D D refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) simp only [Function.comp_apply] have hMc : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (commutator A μ ν - (adjointDualCoeff U⁻¹ p.1 φ))).sum = + commutatorFam A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - bracketFam ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A μ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ - adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by + bracketFam (A r.1 μ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [commutator_eq_bracketFam, bracketFam_adjointDualCoeff U⁻¹ p.1 (A μ) (A ν) φ, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) - simp only [Function.comp_apply] - rw [iteratedD_bracketFam hD p.2 (A μ ∘ₗ adjointDualCoeff U⁻¹ q.1) - (A ν ∘ₗ adjointDualCoeff U⁻¹ q.2) φ] + rw [commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_congr rfl (fun r hr => by + rw [Function.comp_apply, + bracketFam_adjointDualCoeff U⁻¹ p.1 (A r.1 μ) (A r.2 ν) φ]), + Multiset.sum_map_sum_map] have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => - bracketFam ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A μ ∘ₗ - adjointDualCoeff U⁻¹ a) - ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ A ν ∘ₗ - adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) + bracketFam (A b μ ∘ₗ adjointDualCoeff U⁻¹ a) + (A d ν ∘ₗ adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) -- the cross-term sums, applied have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), - ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ A ν ∘ₗ - adjointDualCoeff U⁻¹ r.1).sum) + ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)))) = (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (A ν (adjointDualCoeff U⁻¹ r.1 + A r.2 ν (adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ))))))).sum := by + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) - simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] + simp only [Function.comp_apply, LinearMap.coe_comp] have hCf : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), - ((p.1.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A μ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) + ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν)))) = (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + A q.2 μ (adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν))))))).sum := by + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) - simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] + simp only [Function.comp_apply, LinearMap.coe_comp] -- expand the left side and split the four convolutions - rw [commutator_eq_bracketFam, iteratedD_bracketFam hD s (A μ) (A ν) φ, - map_multiset_sum, Multiset.map_map, + rw [commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map, map_multiset_sum, + Multiset.map_map, Multiset.map_congr rfl (fun p hp => by - rw [Function.comp_apply, hA.repGauge_bracketFam U (hAlaw μ p.1) (hAlaw ν p.2) φ, - hCg p, hCf p]), - Multiset.sum_map_add, Multiset.sum_map_sub, Multiset.sum_map_add, hM, - commutator_eq_bracketFam] - + rw [Function.comp_apply, Function.comp_apply, + hA.repGauge_bracketFam U (hAlaw μ p.1) (hAlaw ν p.2) φ, hCg p, hCf p]), + Multiset.sum_map_add, Multiset.sum_map_sub, Multiset.sum_map_add, hM] end IsGaugeField diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean index a59f97abc..37645cf93 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean @@ -14,15 +14,19 @@ public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis The field strength is defined as ``` - F_{μν} = D_μ A_ν − D_ν A_μ + ⁅A_μ, A_ν⁆ + F_{μν} = ∂_μ A_ν − ∂_ν A_μ + ⁅A_μ, A_ν⁆ ``` with `⁅·,·⁆` the gauge-algebra bracket, which already carries the physicists' factor of `i` (on the matrix factors `⁅a, b⁆ = i(ab − ba)`). In terms of the plain matrix -commutator this is `F_{μν} = D_μ A_ν − D_ν A_μ + i [A_μ, A_ν]`, the sign forced by +commutator this is `F_{μν} = ∂_μ A_ν − ∂_ν A_μ + i [A_μ, A_ν]`, the sign forced by the convention `ω_μ(g) = i (∂_μ g) g⁻¹` for the Maurer–Cartan form (equivalently, by its structural equation `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`): only with this -coefficient do the inhomogeneous terms cancel. It transforms under the gauge -transformation covariantly via the adjoint action (`repGauge_fieldStrength`). +coefficient do the inhomogeneous terms cancel. With the derivative symbols as +primitives the field strength is itself a family of derivative symbols +`s ↦ [∂_s F_μν]`: the derivative terms shift the multiset index, the commutator term +is the Leibniz convolution `commutatorFam`. It transforms in the adjoint at every +derivative order simultaneously (`repGauge_fieldStrength`, +`transformsInAdjoint_fieldStrength`). -/ @@ -36,286 +40,111 @@ namespace IsGaugeField variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} -variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} -variable [Lorentz.IsLorentzDeriv repLorentz D] -variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -/-- The field strength `F_μν = D_μ A_ν − D_ν A_μ + ⁅A_μ, A_ν⁆` of a family of - gauge-field symbols, as a component family: the derivative terms through the total - derivative `D`, the commutator term through `commutator`. This is the physicists' +/-- The field strength `F_μν = ∂_μ A_ν − ∂_ν A_μ + ⁅A_μ, A_ν⁆` of a family of + gauge-field symbols, as a family of derivative symbols: the `s`-th derivative has + the derivative terms through the shifted symbols `A (μ ::ₘ s) ν`, the commutator + term through the Leibniz convolution `commutatorFam`. This is the physicists' `F_μν^a = ∂_μ A_ν^a − ∂_ν A_μ^a + f^a_{bc} A_μ^b A_ν^c`: the gauge-algebra bracket already carries the physicists' factor of `i`, so no explicit factor appears — the same normalization as in the structural equation of the Maurer–Cartan form, which is exactly what makes the field strength transform without inhomogeneous terms (`repGauge_fieldStrength`). -/ -noncomputable def fieldStrength (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (μ ν : Fin 1 ⊕ Fin 3) : +noncomputable def fieldStrength + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - (D μ).restrictScalars ℝ ∘ₗ A ν - (D ν).restrictScalars ℝ ∘ₗ A μ + commutator A μ ν + A (μ ::ₘ s) ν - A (ν ::ₘ s) μ + commutatorFam A μ ν s @[simp] -lemma fieldStrength_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (μ ν : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - fieldStrength A D μ ν φ = D μ (A ν φ) - D ν (A μ φ) + commutator A μ ν φ := rfl - -/-- The antisymmetrized pair is the field strength minus its +lemma fieldStrength_apply + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + fieldStrength A μ ν s φ = A (μ ::ₘ s) ν φ - A (ν ::ₘ s) μ φ + commutatorFam A μ ν s φ := + rfl + +/-- The underived field strength: derivative symbols on singletons, plus the plain + commutator. -/ +lemma fieldStrength_zero + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength A μ ν 0 = A {μ} ν - A {ν} μ + commutator A μ ν := by + rw [fieldStrength, commutatorFam_zero] + rfl + +/-- The antisymmetrized pair of derivative symbols is the field strength minus its commutator term. -/ -lemma pair_eq_fieldStrength_sub_commutator - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ν μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - D ν (A μ φ) - D μ (A ν φ) = fieldStrength A D ν μ φ - commutator A ν μ φ := by - rw [fieldStrength_apply, add_sub_cancel_right] - - -set_option maxHeartbeats 400000 in -/-- **The field strength transforms in the adjoint.** Under a gauge jet `U` all - inhomogeneous terms in the transformation of `F_μν = D_μ A_ν − D_ν A_μ + ⁅A_μ, A_ν⁆` - cancel: the Leibniz cross terms of the derivatives against the commutator cross - terms (`adjointDualCoeff_singleton`), and the derived Maurer–Cartan shifts against - the bracket of the two shifts (the structural equation of the Maurer–Cartan form). - What remains is the base-point dual adjoint action of `U⁻¹` on the adjoint index. -/ -lemma repGauge_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) - (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (fieldStrength A D μ ν φ) = fieldStrength A D μ ν (adjointDualCoeff U⁻¹ 0 φ) := by - -- the structural equation of the Maurer–Cartan form, under `φ ∘ eval` - have hstruct : - φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv μ (maurerCartanForm U⁻¹ ν))) = - φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ν (maurerCartanForm U⁻¹ μ))) - - φ ⁅JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ), - JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)⁆ := by - have h0 := congrArg (fun z => φ (JetGaugeAlgebra.eval z)) - (maurerCartanForm_structure U⁻¹ μ ν) - simp only [map_add, map_sub, map_zero, LieHom.map_lie] at h0 - linarith - rw [fieldStrength_apply, fieldStrength_apply, map_add, map_sub, - hA.repGauge_deriv_apply U μ ν φ, hA.repGauge_deriv_apply U ν μ φ, - hA.repGauge_commutator U μ ν φ, adjointDualCoeff_singleton U⁻¹ μ φ, - adjointDualCoeff_singleton U⁻¹ ν φ, map_neg, map_neg, hstruct, - Complex.ofReal_sub, map_sub] - abel - -/-- The transformation of the field strength written in the standard basis of the - gauge algebra, in terms of `adjointMatrix`: the component - `F_μν^a = F_μν(stdBasis.coord a)` transforms through the adjoint matrix of the - base-point value of `U⁻¹`, - - `U • F_μν^a = ∑ b, Ad(U₀⁻¹)^a_b F_μν^b`. -/ -lemma repGauge_fieldStrength_stdBasis (hA : IsGaugeField repLorentz repGauge A D D_comm) - (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : - repGauge U (fieldStrength A D μ ν (GaugeAlgebra.stdBasis.coord a)) = - ∑ b, GaugeAlgebra.adjointMatrix (U⁻¹).eval a b • - fieldStrength A D μ ν (GaugeAlgebra.stdBasis.coord b) := by - rw [hA.repGauge_fieldStrength U μ ν, adjointDualCoeff_zero, - GaugeAlgebra.adjoint_dualMap_coord, map_sum] - simp only [map_smul] - -set_option maxHeartbeats 1000000 in -/-- **The transformation law of the derived field strength**: for `D` a derivation - (Leibniz rule, taken as the hypothesis `hD` since `IsGaugeField` does not postulate - it), the once-derived field strength transforms by the Leibniz convolution of the - dual adjoint action against the underived field strength — with *no* Maurer–Cartan - shift, since the field strength itself transforms homogeneously: - - `U • ∂_ρ F_μν^φ = ∂_ρ (F_μν^{Ad₀* φ}) + F_μν^{(∂_ρ Ad)* φ}`. - - All inhomogeneous terms cancel: the two-derivative Leibniz terms of the fields - against the cross terms of the derived commutator (`adjointDualCoeff_pair` and - `adjointDualCoeff_singleton`), and the twice-derived Maurer–Cartan shifts against - the brackets of shifts (the `∂_ρ`-derivative of the structural equation). -/ -theorem repGauge_deriv_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - (U : JetGaugeGroupI) (ρ μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (D ρ (fieldStrength A D μ ν φ)) = - D ρ (fieldStrength A D μ ν (adjointDualCoeff U⁻¹ 0 φ)) - + fieldStrength A D μ ν (adjointDualCoeff U⁻¹ {ρ} φ) := by - -- the base-point and once-derived adjoint transports, as maps on the gauge algebra - set T₀ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := - JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv 0 ∘ₗ - JetGaugeAlgebra.adjointMap U⁻¹ ∘ₗ JetGaugeAlgebra.ofConstant with hT₀def - set T₁ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := - JetGaugeAlgebra.eval.toLinearMap ∘ₗ JetGaugeAlgebra.iteratedDeriv {ρ} ∘ₗ - JetGaugeAlgebra.adjointMap U⁻¹ ∘ₗ JetGaugeAlgebra.ofConstant with hT₁def - have hcoeff0 : adjointDualCoeff U⁻¹ 0 = T₀.dualMap := by rw [hT₀def]; rfl - have hcoeff1 : adjointDualCoeff U⁻¹ ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = T₁.dualMap := by - rw [hT₁def]; rfl - have hT₀lie : ∀ a b : GaugeAlgebra, T₀ ⁅a, b⁆ = ⁅T₀ a, T₀ b⁆ := by - intro a b - simp [hT₀def, JetGaugeAlgebra.ofConstant_lie, JetGaugeAlgebra.adjointMap_lie, - LieHom.map_lie] - have hT₁rel : ∀ a b : GaugeAlgebra, T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆ := by - intro a b - simp only [hT₁def, hT₀def, LinearMap.coe_comp, Function.comp_apply, - LieHom.coe_toLinearMap, JetGaugeAlgebra.iteratedDeriv_singleton, - JetGaugeAlgebra.iteratedDeriv_zero, LinearMap.id_coe, id_eq] - rw [JetGaugeAlgebra.ofConstant_lie, JetGaugeAlgebra.adjointMap_lie, - JetGaugeAlgebra.deriv_bracket, map_add, LieHom.map_lie, LieHom.map_lie] - -- brackets against the transported families - have hbr0 : ∀ f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B, - bracketFam (f ∘ₗ adjointDualCoeff U⁻¹ 0) (g ∘ₗ adjointDualCoeff U⁻¹ 0) φ = - bracketFam f g (adjointDualCoeff U⁻¹ 0 φ) := by - intro f g - rw [hcoeff0, bracketFam_comp_dualMap T₀ hT₀lie f g] - rfl - have hbrρ : ∀ f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B, - bracketFam (f ∘ₗ adjointDualCoeff U⁻¹ {ρ}) (g ∘ₗ adjointDualCoeff U⁻¹ 0) φ + - bracketFam (f ∘ₗ adjointDualCoeff U⁻¹ 0) (g ∘ₗ adjointDualCoeff U⁻¹ {ρ}) φ = - bracketFam f g (adjointDualCoeff U⁻¹ {ρ} φ) := by - intro f g - rw [hcoeff0, hcoeff1, ← LinearMap.add_apply, - bracketFam_dualMap_derivation T₀ T₁ hT₁rel f g] - rfl - -- the affine transformation laws of the four families entering the bracket terms - have hAμ0 : ∀ ψ : Module.Dual ℝ GaugeAlgebra, - repGauge U (A μ ψ) = (A μ ∘ₗ adjointDualCoeff U⁻¹ 0) ψ - + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ))) := - fun ψ => hA.repGauge_apply U μ ψ - have hAν0 : ∀ ψ : Module.Dual ℝ GaugeAlgebra, - repGauge U (A ν ψ) = (A ν ∘ₗ adjointDualCoeff U⁻¹ 0) ψ - + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν))) := - fun ψ => hA.repGauge_apply U ν ψ - have hDμ : ∀ ψ : Module.Dual ℝ GaugeAlgebra, - repGauge U (((D ρ).restrictScalars ℝ ∘ₗ A μ) ψ) = - (((D ρ).restrictScalars ℝ ∘ₗ A μ) ∘ₗ adjointDualCoeff U⁻¹ 0 - + A μ ∘ₗ adjointDualCoeff U⁻¹ {ρ}) ψ - + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval - (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ μ)))) := - fun ψ => hA.repGauge_deriv_apply U ρ μ ψ - have hDν : ∀ ψ : Module.Dual ℝ GaugeAlgebra, - repGauge U (((D ρ).restrictScalars ℝ ∘ₗ A ν) ψ) = - (((D ρ).restrictScalars ℝ ∘ₗ A ν) ∘ₗ adjointDualCoeff U⁻¹ 0 - + A ν ∘ₗ adjointDualCoeff U⁻¹ {ρ}) ψ - + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval - (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ ν)))) := - fun ψ => hA.repGauge_deriv_apply U ρ ν ψ - -- the transformed pieces - have h1 := hA.repGauge_deriv_deriv_apply U ρ μ ν φ - have h2 := hA.repGauge_deriv_deriv_apply U ρ ν μ φ - have h3 := hA.repGauge_bracketFam U hDμ hAν0 φ - have h4 := hA.repGauge_bracketFam U hAμ0 hDν φ - -- the split of both sides through the Leibniz rule - have hL : repGauge U (D ρ (fieldStrength A D μ ν φ)) = - repGauge U (D ρ (D μ (A ν φ))) - repGauge U (D ρ (D ν (A μ φ))) - + (repGauge U (bracketFam ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν) φ) - + repGauge U (bracketFam (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν) φ)) := by - rw [fieldStrength_apply, map_add, map_sub, deriv_commutator hD ρ μ ν φ, - map_add, map_sub, map_add] - have hR : D ρ (fieldStrength A D μ ν (adjointDualCoeff U⁻¹ 0 φ)) - + fieldStrength A D μ ν (adjointDualCoeff U⁻¹ {ρ} φ) = - (D ρ (D μ (A ν (adjointDualCoeff U⁻¹ 0 φ))) - - D ρ (D ν (A μ (adjointDualCoeff U⁻¹ 0 φ))) - + (bracketFam ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν) (adjointDualCoeff U⁻¹ 0 φ) - + bracketFam (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν) - (adjointDualCoeff U⁻¹ 0 φ))) - + (D μ (A ν (adjointDualCoeff U⁻¹ {ρ} φ)) - - D ν (A μ (adjointDualCoeff U⁻¹ {ρ} φ)) - + commutator A μ ν (adjointDualCoeff U⁻¹ {ρ} φ)) := by - rw [fieldStrength_apply, map_add, map_sub, - deriv_commutator hD ρ μ ν (adjointDualCoeff U⁻¹ 0 φ), fieldStrength_apply] - -- the `∂_ρ`-derivative of the structural equation, under `φ ∘ eval` - have hstruct2 : - φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ - (JetGaugeAlgebra.deriv μ (maurerCartanForm U⁻¹ ν)))) = - φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ - (JetGaugeAlgebra.deriv ν (maurerCartanForm U⁻¹ μ)))) - - φ ⁅JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ μ)), - JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)⁆ - - φ ⁅JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ μ), - JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ (maurerCartanForm U⁻¹ ν))⁆ := by - have h0 := congrArg (fun z => φ (JetGaugeAlgebra.eval (JetGaugeAlgebra.deriv ρ z))) - (maurerCartanForm_structure U⁻¹ μ ν) - simp only [map_add, map_sub, map_zero, JetGaugeAlgebra.deriv_bracket, - LieHom.map_lie] at h0 - linarith - -- assemble - rw [hL, h1, h2, h3, h4, hR, commutator_eq_bracketFam, ← hbrρ (A μ) (A ν)] - simp only [bracketFam_add_left, bracketFam_add_right, LinearMap.add_apply, - LinearMap.comp_apply, LinearMap.restrictScalars_apply] - rw [hbr0 ((D ρ).restrictScalars ℝ ∘ₗ A μ) (A ν), - hbr0 (A μ) ((D ρ).restrictScalars ℝ ∘ₗ A ν), - adjointDualCoeff_singleton U⁻¹ μ φ, adjointDualCoeff_singleton U⁻¹ ν φ, - adjointDualCoeff_pair U⁻¹ ρ μ φ, adjointDualCoeff_pair U⁻¹ ρ ν φ] - simp only [map_sub, map_neg] - rw [hstruct2, Complex.ofReal_sub, Complex.ofReal_sub, map_sub, map_sub] - abel - -set_option maxHeartbeats 2000000 in -/-- **The general transformation law of iterated derivatives of the field strength**: - for `D` a derivation, every derivative symbol of `F_μν` transforms by the pure - Leibniz convolution of the dual adjoint action over the multiset antidiagonal — - the exact analogue of `gauge_apply_deriv` with *no* Maurer–Cartan shift, since the - field strength transforms homogeneously. The `κ`-into-the-adjoint splittings of the - derivative terms (`repGauge_iteratedD_cons_apply`) cancel the `ad` cross-term - convolutions of the commutator (`repGauge_iteratedD_commutator`) through the - coassociativity and swap of the antidiagonal, and the derived Maurer–Cartan shifts - cancel the bracket-shift convolution through the all-orders structural equation. -/ -lemma repGauge_iteratedD_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) +lemma pair_eq_fieldStrength_sub_commutatorFam + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (ν μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + A (ν ::ₘ s) μ - A (μ ::ₘ s) ν = fieldStrength A ν μ s - commutatorFam A ν μ s := by + rw [fieldStrength, add_sub_cancel_right] + + +/-- **The field strength transforms in the adjoint, at every derivative order**: under + a gauge jet `U` every derivative symbol of `F_μν` transforms by the pure Leibniz + convolution of the dual adjoint action over the multiset antidiagonal — the exact + analogue of `gauge_apply_deriv` with *no* Maurer–Cartan shift, since the field + strength transforms homogeneously. The `κ`-into-the-adjoint splittings of the + derivative terms (`repGauge_cons_apply`) cancel the `ad` cross-term convolutions of + the commutator (`repGauge_commutatorFam`) through the coassociativity and swap of + the antidiagonal, and the derived Maurer–Cartan shifts cancel the bracket-shift + convolution through the all-orders structural equation. -/ +theorem repGauge_fieldStrength (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (Lorentz.iteratedD D D_comm s (fieldStrength A D μ ν φ)) = - (s.antidiagonal.map fun p => Lorentz.iteratedD D D_comm p.2 (fieldStrength A D μ ν - (adjointDualCoeff U⁻¹ p.1 φ))).sum := by - have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), - Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by - intro κ t b - rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by - rw [add_comm, Multiset.singleton_add], - Lorentz.iteratedD_add, LinearMap.comp_apply] - congr 1 - have hL : repGauge U (Lorentz.iteratedD D D_comm s (fieldStrength A D μ ν φ)) = - repGauge U (Lorentz.iteratedD D D_comm (μ ::ₘ s) (A ν φ)) - - repGauge U (Lorentz.iteratedD D D_comm (ν ::ₘ s) (A μ φ)) - + repGauge U (Lorentz.iteratedD D D_comm s (commutator A μ ν φ)) := by - rw [fieldStrength_apply, map_add, map_sub, hDcomp μ s, hDcomp ν s, map_add, map_sub] + repGauge U (fieldStrength A μ ν s φ) = + (s.antidiagonal.map fun p => + fieldStrength A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by + have hL : repGauge U (fieldStrength A μ ν s φ) = + repGauge U (A (μ ::ₘ s) ν φ) - repGauge U (A (ν ::ₘ s) μ φ) + + repGauge U (commutatorFam A μ ν s φ) := by + rw [fieldStrength_apply, map_add, map_sub] have hR : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (fieldStrength A D μ ν - (adjointDualCoeff U⁻¹ p.1 φ))).sum = + fieldStrength A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (μ ::ₘ p.2) (A ν (adjointDualCoeff U⁻¹ p.1 φ))).sum + A (μ ::ₘ p.2) ν (adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (ν ::ₘ p.2) (A μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + A (ν ::ₘ p.2) μ (adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (commutator A μ ν - (adjointDualCoeff U⁻¹ p.1 φ))).sum := by + commutatorFam A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by rw [← Multiset.sum_map_sub, ← Multiset.sum_map_add] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [fieldStrength_apply, map_add, map_sub, hDcomp μ p.2, hDcomp ν p.2] + rw [fieldStrength_apply] have hcancel₁ : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (A ν (adjointDualCoeff U⁻¹ q.2 + A p.2 ν (adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ μ))))))).sum).sum = + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ μ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (A ν (adjointDualCoeff U⁻¹ r.1 + A r.2 ν (adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ))))))).sum).sum := + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => - Lorentz.iteratedD D D_comm c (A ν (adjointDualCoeff U⁻¹ b + A c ν (adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ μ))))))) + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ μ)))))) have hcancel₂ : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff U⁻¹ q.2 + A p.2 μ (adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ ν))))))).sum).sum = + (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ ν)))))).sum).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + A q.2 μ (adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν))))))).sum).sum := by + (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν)))))).sum).sum := by refine (Multiset.sum_antidiagonal_assoc s (fun a b c => - Lorentz.iteratedD D D_comm c (A μ (adjointDualCoeff U⁻¹ b + A c μ (adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ν)))))))).trans ?_ + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ν))))))).trans ?_ exact Multiset.sum_antidiagonal_swap s (fun a b => (b.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm q.2 (A μ (adjointDualCoeff U⁻¹ q.1 + A q.2 μ (adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ν))))))).sum) + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ν)))))).sum) set Θ : GaugeAlgebra →+ B := ((algebraMap ℂ B).toAddMonoidHom.comp ((Complex.ofRealHom : ℝ →+* ℂ).toAddMonoidHom.comp φ.toAddMonoidHom)) with hΘdef have hΘ : ∀ z : GaugeAlgebra, algebraMap ℂ B ((φ z : ℝ) : ℂ) = Θ z := fun z => rfl @@ -331,20 +160,43 @@ lemma repGauge_iteratedD_fieldStrength (hA : IsGaugeField repLorentz repGauge A rw [eval_iteratedDeriv_maurerCartan_structure U⁻¹ s μ ν, map_sub, map_multiset_sum, Multiset.map_map] congr 1 - rw [hL, repGauge_iteratedD_cons_apply hA U μ s ν φ, - repGauge_iteratedD_cons_apply hA U ν s μ φ, - hA.repGauge_iteratedD_commutator hD U s μ ν φ, hR] + rw [hL, repGauge_cons_apply hA U μ s ν φ, repGauge_cons_apply hA U ν s μ φ, + hA.repGauge_commutatorFam U s μ ν φ, hR] simp only [hΘ] rw [hconst, hcancel₁, hcancel₂] abel /-- **The field strength is an adjoint gauge tensor**: the packaging of - `repGauge_iteratedD_fieldStrength` as `TransformsInAdjoint` — the base case of the + `repGauge_fieldStrength` as `TransformsInAdjoint` — the base case of the covariant-derivative recursion `TransformsInAdjoint.covDerivAdjoint`. -/ -theorem transformsInAdjoint_fieldStrength (hA : IsGaugeField repLorentz repGauge A D D_comm) - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - (μ ν : Fin 1 ⊕ Fin 3) : hA.TransformsInAdjoint (fieldStrength A D μ ν) := - fun U φ s => hA.repGauge_iteratedD_fieldStrength hD U s μ ν φ +theorem transformsInAdjoint_fieldStrength (hA : IsGaugeField repLorentz repGauge A) + (μ ν : Fin 1 ⊕ Fin 3) : TransformsInAdjoint repGauge (fieldStrength A μ ν) := + fun U φ s => hA.repGauge_fieldStrength U s μ ν φ + +/-- The underived transformation law: at `s = 0` the Leibniz convolution collapses to + the homogeneous law — the field strength transforms by the base-point dual adjoint + action of `U⁻¹` on the adjoint index. -/ +lemma repGauge_fieldStrength_zero (hA : IsGaugeField repLorentz repGauge A) + (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (fieldStrength A μ ν 0 φ) = + fieldStrength A μ ν 0 (adjointDualCoeff U⁻¹ 0 φ) := by + rw [hA.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, + Multiset.map_singleton, Multiset.sum_singleton] + +/-- The transformation of the underived field strength written in the standard basis + of the gauge algebra, in terms of `adjointMatrix`: the component + `F_μν^a = F_μν(stdBasis.coord a)` transforms through the adjoint matrix of the + base-point value of `U⁻¹`, + + `U • F_μν^a = ∑ b, Ad(U₀⁻¹)^a_b F_μν^b`. -/ +lemma repGauge_fieldStrength_stdBasis (hA : IsGaugeField repLorentz repGauge A) + (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + repGauge U (fieldStrength A μ ν 0 (GaugeAlgebra.stdBasis.coord a)) = + ∑ b, GaugeAlgebra.adjointMatrix (U⁻¹).eval a b • + fieldStrength A μ ν 0 (GaugeAlgebra.stdBasis.coord b) := by + rw [hA.repGauge_fieldStrength_zero U μ ν, adjointDualCoeff_zero, + GaugeAlgebra.adjoint_dualMap_coord, map_sum] + simp only [map_smul] end IsGaugeField diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean index 3565eb44d..5264f644f 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean @@ -36,83 +36,40 @@ namespace StandardModel namespace IsGaugeField open Matrix MatrixGroups TensorProduct MvPowerSeries variable {B : Type} [Ring B] [Algebra ℂ B] -variable {V : Type} [AddCommGroup V] [Module ℂ V] variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} -variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} -variable [Lorentz.IsLorentzDeriv repLorentz D] -variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} - -noncomputable def symmetrizedDeriv (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) - (s : Multiset (Fin 1 ⊕ Fin 3)) - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (φ : Module.Dual ℝ GaugeAlgebra) : B:= - ((1/(s.card : ℝ) : ℝ) • (s.map fun μ => - (Lorentz.iteratedD D D_comm (s - {μ}) (A μ φ))).sum) +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + +/-- The symmetrized derivative symbol `sym(d_s A)^φ`: the average over the directions + `μ ∈ s` of the symbols `d_{s−μ} A_μ^φ`, so that the direction of the gauge field is + symmetrized into the derivative multiset. -/ +noncomputable def symmetrizedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : B := + ((1/(s.card : ℝ) : ℝ) • (s.map fun μ => A (s - {μ}) μ φ).sum) @[simp] -lemma symmetrizedDeriv_singleton (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) - (μ : Fin 1 ⊕ Fin 3) (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) +lemma symmetrizedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) : - symmetrizedDeriv D D_comm ({μ}) A φ = A μ φ := by - simp [symmetrizedDeriv, Lorentz.iteratedD] + symmetrizedDeriv ({μ}) A φ = A 0 μ φ := by + simp [symmetrizedDeriv] @[simp] -lemma symmetrizedDeriv_empty (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) +lemma symmetrizedDeriv_empty + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) : - symmetrizedDeriv D D_comm 0 A φ = 0 := by + symmetrizedDeriv 0 A φ = 0 := by simp [symmetrizedDeriv] -/-- The recursion for the symmetrized derivative: peeling one direction off the - multiset. The factor `card s / (card s + 1)` on the derivative term comes from the - mismatch of the symmetrization factors `1/(card s + 1)` and `1/card s`. -/ -lemma symmetrizedDeriv_cons (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) - (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (φ : Module.Dual ℝ GaugeAlgebra) : - symmetrizedDeriv D D_comm (μ ::ₘ s) A φ = - (1/(s.card + 1 : ℝ) : ℝ) • (Lorentz.iteratedD D D_comm s (A μ φ)) - + ((s.card : ℝ)/(s.card + 1 : ℝ)) • D μ (symmetrizedDeriv D D_comm s A φ) := by - by_cases hs : s = 0 - · subst hs - simp [Lorentz.iteratedD_zero] - · have hn : (s.card : ℝ) ≠ 0 := - Nat.cast_ne_zero.mpr fun h => hs (Multiset.card_eq_zero.mp h) - have herase : ∀ ν ∈ s, (μ ::ₘ s).erase ν = μ ::ₘ s.erase ν := by - intro ν hν - rcases eq_or_ne ν μ with rfl | h - · rw [Multiset.erase_cons_head, Multiset.cons_erase hν] - · rw [Multiset.erase_cons_tail _ h.symm] - rw [symmetrizedDeriv, symmetrizedDeriv, Multiset.map_cons, Multiset.sum_cons, - Multiset.card_cons, Multiset.sub_singleton, Multiset.erase_cons_head, - Multiset.map_congr rfl (fun ν hν => by - rw [Multiset.sub_singleton, herase ν hν, Lorentz.iteratedD_cons, - LinearMap.comp_apply, ← Multiset.sub_singleton]), - show (s.map fun ν => D μ (Lorentz.iteratedD D D_comm (s - {ν}) (A ν φ))) = - (s.map fun ν => Lorentz.iteratedD D D_comm (s - {ν}) (A ν φ)).map (⇑(D μ)) from - (Multiset.map_map _ _ _).symm, - ← map_multiset_sum, smul_add, LinearMap.map_smul_of_tower, smul_smul, - show ((s.card + 1 : ℕ) : ℝ) = (s.card : ℝ) + 1 by push_cast; ring, - show (s.card : ℝ)/((s.card : ℝ) + 1) * (1/(s.card : ℝ)) = 1/((s.card : ℝ) + 1) by - field_simp] - -lemma deriv_sub_symmetrizedDeriv_eq_sum (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) - (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) - (s : Multiset (Fin 1 ⊕ Fin 3)) - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) +lemma deriv_sub_symmetrizedDeriv_eq_sum (s : Multiset (Fin 1 ⊕ Fin 3)) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (φ : Module.Dual ℝ GaugeAlgebra) (μ : Fin 1 ⊕ Fin 3) : - Lorentz.iteratedD D D_comm s (A μ φ) - symmetrizedDeriv D D_comm (μ ::ₘ s) A φ = - ((1/(s.card + 1 : ℝ)) • ((s.map fun ν => Lorentz.iteratedD D D_comm s (A μ φ) - - Lorentz.iteratedD D D_comm (μ ::ₘ s - {ν}) (A ν φ)).sum)) := by + A s μ φ - symmetrizedDeriv (μ ::ₘ s) A φ = + ((1/(s.card + 1 : ℝ)) • ((s.map fun ν => A s μ φ - + A (μ ::ₘ s - {ν}) ν φ).sum)) := by have hn1 : (s.card : ℝ) + 1 ≠ 0 := by positivity rw [symmetrizedDeriv, Multiset.map_cons, Multiset.sum_cons, Multiset.card_cons, Multiset.sub_singleton, Multiset.erase_cons_head, Multiset.sum_map_sub, @@ -129,182 +86,152 @@ The chain of lemmas below implements the outline in the module docstring, leadin `adjoin({ d_p A }) = adjoin({ sym(d_p A) } ∪ { 𝒟_q F })`. -Throughout, `D_mul` is the Leibniz rule for the total derivative — a property of `D` -on the algebra `B` that `IsGaugeField` does not currently record, taken here as an -explicit hypothesis. +With the derivative symbols as primitives no Leibniz hypothesis is needed: the +covariant derivative of a family shifts the derivative index and adds a bracket +convolution, both of which stay inside the symbol subalgebras by construction. -/ -/-- The iterated covariant derivative `𝒟_l F` of an adjoint component family along a - *list* of directions: covariant derivatives do not commute (their commutator is an - `ad F` term), so the iteration is order-dependent and indexed by a list. -/ +/-- The iterated covariant derivative `𝒟_l F` of an adjoint family of derivative + symbols along a *list* of directions: covariant derivatives do not commute (their + commutator is an `ad F` term), so the iteration is order-dependent and indexed by a + list. The result is again a family of derivative symbols; the underived covariant + tower is its value at the empty multiset. -/ noncomputable def iteratedCovDerivAdjoint - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) : - List (Fin 1 ⊕ Fin 3) → (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) → - Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + List (Fin 1 ⊕ Fin 3) → + (Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) → + Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B | [], F => F - | ρ :: l, F => covDerivAdjoint A (iteratedCovDerivAdjoint A D l F) D ρ - + | ρ :: l, F => covDerivAdjoint A (iteratedCovDerivAdjoint A l F) ρ /-- Symbol subalgebras are monotone in the order bound. -/ lemma adjoin_symbols_mono {n m : ℕ} (hnm : n ≤ m) : Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} ≤ + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ b = A p μ φ} ≤ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m ∧ b = A p μ φ} := by refine Algebra.adjoin_mono fun b => ?_ rintro ⟨p, μ, φ, h, rfl⟩ exact ⟨p, μ, φ, h.trans hnm, rfl⟩ -/-- The total derivative raises the order of a symbol polynomial by at most one: - it maps the subalgebra of order-`n` symbols into the order-`n + 1` one, by the - Leibniz rule. -/ -lemma deriv_mem_adjoin_symbols - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) - (ρ : Fin 1 ⊕ Fin 3) {n : ℕ} {x : B} - (hx : x ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)}) : - D ρ x ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n + 1 ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} := by - induction hx using Algebra.adjoin_induction with - | mem b hb => - obtain ⟨p, κ, ψ, hpc, rfl⟩ := hb - refine Algebra.subset_adjoin ⟨ρ ::ₘ p, κ, ψ, ?_, ?_⟩ - · simpa using Nat.succ_le_succ hpc - · rw [Lorentz.iteratedD_cons] - rfl - | algebraMap c => - have h1 : D ρ (1 : B) = 0 := by - have h := D_mul ρ 1 1 - simp only [one_mul, mul_one] at h - have h3 : D ρ (1 : B) + 0 = D ρ 1 + D ρ 1 := by rw [add_zero]; exact h - exact (add_left_cancel h3).symm - rw [Algebra.algebraMap_eq_smul_one, map_smul, h1, smul_zero] - exact zero_mem _ - | add x y hx hy ihx ihy => - rw [map_add] - exact add_mem ihx ihy - | mul x y hx hy ihx ihy => - rw [D_mul] - exact add_mem (mul_mem ihx (adjoin_symbols_mono (Nat.le_succ n) hy)) - (mul_mem (adjoin_symbols_mono (Nat.le_succ n) hx) ihy) - /-- The bracket of two component families whose components are order-`n` symbol polynomials is again an order-`n` symbol polynomial, componentwise. -/ lemma bracketFam_mem_adjoin_symbols {n : ℕ} {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hf : ∀ ψ, f ψ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)}) + b = A p μ φ}) (hg : ∀ ψ, g ψ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)}) + b = A p μ φ}) (φ : Module.Dual ℝ GaugeAlgebra) : bracketFam f g φ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + b = A p μ φ} := by rw [bracketFam_apply_eq_sum] refine Subalgebra.sum_mem _ fun j _ => Subalgebra.sum_mem _ fun k _ => ?_ rw [← algebraMap_smul ℂ] exact Subalgebra.smul_mem _ (mul_mem (hf _) (hg _)) _ -/-- Every iterated derivative of the field strength is a symbol polynomial of order +/-- Every derivative symbol of the field strength is a symbol polynomial of order one higher than the number of derivatives. -/ -lemma iteratedD_fieldStrength_mem - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) +lemma fieldStrength_mem_adjoin_symbols (q : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - Lorentz.iteratedD D D_comm q (fieldStrength A D ν lam φ) ∈ + fieldStrength A ν lam q φ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ q.card + 1 ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} := by - rw [fieldStrength_apply, map_add, map_sub] + b = A p μ φ} := by + rw [fieldStrength_apply] refine add_mem (sub_mem ?_ ?_) ?_ - · rw [show Lorentz.iteratedD D D_comm q (D ν (A lam φ)) = - Lorentz.iteratedD D D_comm (ν ::ₘ q) (A lam φ) from by - rw [Lorentz.iteratedD_cons']; rfl] - exact Algebra.subset_adjoin ⟨ν ::ₘ q, lam, φ, by simp, rfl⟩ - · rw [show Lorentz.iteratedD D D_comm q (D lam (A ν φ)) = - Lorentz.iteratedD D D_comm (lam ::ₘ q) (A ν φ) from by - rw [Lorentz.iteratedD_cons']; rfl] - exact Algebra.subset_adjoin ⟨lam ::ₘ q, ν, φ, by simp, rfl⟩ + · exact Algebra.subset_adjoin ⟨ν ::ₘ q, lam, φ, by simp, rfl⟩ + · exact Algebra.subset_adjoin ⟨lam ::ₘ q, ν, φ, by simp, rfl⟩ · exact adjoin_symbols_mono (Nat.le_succ q.card) - (iteratedD_commutator_mem A D D_comm D_mul q ν lam φ) + (commutatorFam_mem A q ν lam φ) /-- **Outline step 6** (unitriangularity of the covariant tower): the covariant and - plain iterated derivatives of the field strength differ by an element of the - subalgebra generated by lower-order symbols and lower-order plain derivatives of - the field strength; consequently the two towers generate the same subalgebras. - Stated as the membership needed for the induction. -/ -lemma iteratedCovDerivAdjoint_sub_iteratedD_mem - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + plain derivative symbols of the field strength differ by an element of the + subalgebra generated by lower-order symbols; consequently the two towers generate + the same subalgebras. Stated at every derivative multiset `s`, as needed for the + induction: the covariant derivative shifts the family index. -/ +lemma iteratedCovDerivAdjoint_sub_mem (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ - - Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ) ∈ + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) s φ - + fieldStrength A ν lam (Multiset.ofList l + s) φ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ l.length ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} := by - induction l generalizing φ with + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ l.length + s.card ∧ + b = A p μ φ} := by + induction l generalizing s φ with | nil => simp only [iteratedCovDerivAdjoint, - show (Multiset.ofList ([] : List (Fin 1 ⊕ Fin 3))) = 0 from rfl, - Lorentz.iteratedD_zero, LinearMap.id_coe, id_eq, sub_self] + show (Multiset.ofList ([] : List (Fin 1 ⊕ Fin 3))) = 0 from rfl, zero_add, + sub_self] exact zero_mem _ | cons ρ l ih => - have hsplit : iteratedCovDerivAdjoint A D (ρ :: l) (fieldStrength A D ν lam) φ - - Lorentz.iteratedD D D_comm (Multiset.ofList (ρ :: l)) (fieldStrength A D ν lam φ) = - D ρ (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ - - Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ)) + - bracketFam (A ρ) (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) φ := by - rw [show (Multiset.ofList (ρ :: l)) = ρ ::ₘ Multiset.ofList l from rfl, - Lorentz.iteratedD_cons, LinearMap.comp_apply, map_sub, - show iteratedCovDerivAdjoint A D (ρ :: l) (fieldStrength A D ν lam) φ = - D ρ (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ) + - bracketFam (A ρ) (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) φ - from rfl] + have hms : Multiset.ofList (ρ :: l) + s = Multiset.ofList l + (ρ ::ₘ s) := by + rw [show Multiset.ofList (ρ :: l) = ρ ::ₘ Multiset.ofList l from rfl, + Multiset.cons_add, Multiset.add_cons] + have hsplit : iteratedCovDerivAdjoint A (ρ :: l) (fieldStrength A ν lam) s φ - + fieldStrength A ν lam (Multiset.ofList (ρ :: l) + s) φ = + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) (ρ ::ₘ s) φ - + fieldStrength A ν lam (Multiset.ofList l + (ρ ::ₘ s)) φ) + + bracketFamConv A ρ (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) s φ := by + rw [show iteratedCovDerivAdjoint A (ρ :: l) (fieldStrength A ν lam) s φ = + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) (ρ ::ₘ s) φ + + bracketFamConv A ρ + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) s φ + from rfl, hms] abel rw [hsplit] - refine add_mem (deriv_mem_adjoin_symbols D_mul ρ (ih φ)) ?_ - refine bracketFam_mem_adjoin_symbols (fun ψ => ?_) (fun ψ => ?_) φ - · exact Algebra.subset_adjoin ⟨0, ρ, ψ, by simp, by rw [Lorentz.iteratedD_zero]; rfl⟩ - · have h3 : iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) ψ = - (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) ψ - - Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam ψ)) + - Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam ψ) := by - abel - rw [h3] - refine add_mem (adjoin_symbols_mono (Nat.le_succ l.length) (ih ψ)) ?_ - simpa using iteratedD_fieldStrength_mem (A := A) D_mul (Multiset.ofList l) ν lam ψ + refine add_mem ?_ ?_ + · refine adjoin_symbols_mono ?_ (ih (ρ ::ₘ s) φ) + simp only [List.length_cons, Multiset.card_cons] + omega + · rw [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle := Multiset.mem_antidiagonal.mp hp + have h1 : p.1.card ≤ s.card := + hle ▸ Multiset.card_le_card (Multiset.le_add_right _ _) + have h2 : p.2.card ≤ s.card := + hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) + refine bracketFam_mem_adjoin_symbols (fun ψ => ?_) (fun ψ => ?_) _ + · refine Algebra.subset_adjoin ⟨p.1, ρ, ψ, ?_, rfl⟩ + simp only [List.length_cons] + omega + · have h3 : iteratedCovDerivAdjoint A l (fieldStrength A ν lam) p.2 ψ = + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) p.2 ψ - + fieldStrength A ν lam (Multiset.ofList l + p.2) ψ) + + fieldStrength A ν lam (Multiset.ofList l + p.2) ψ := by abel + rw [h3] + refine add_mem (adjoin_symbols_mono ?_ (ih p.2 ψ)) + (adjoin_symbols_mono ?_ + (fieldStrength_mem_adjoin_symbols (Multiset.ofList l + p.2) ν lam ψ)) + · simp only [List.length_cons] + omega + · simp only [Multiset.card_add, Multiset.coe_card, List.length_cons] + omega /-- **Outline step 7** (chaining the memberships): every derivative symbol of order `n + 1` lies in the subalgebra generated by its symmetrization, the covariant derivatives of the field strength of order `n`, and the symbols of order at most `n`. This is the inductive step of the generation theorem. -/ -lemma iteratedD_mem_symFieldAdjoin_sup - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) +lemma symbol_mem_symFieldAdjoin_sup (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - Lorentz.iteratedD D D_comm s (A μ φ) ∈ + A s μ φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ s.card + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ s.card + 1 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < s.card ∧ - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) ⊔ + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ⊔ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ (s.card - 1) ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} := by - rw [sub_eq_iff_eq_add.mp (deriv_sub_symmetrizedDeriv_eq_sum D D_comm s A φ μ)] + b = A p μ φ} := by + rw [sub_eq_iff_eq_add.mp (deriv_sub_symmetrizedDeriv_eq_sum s A φ μ)] refine add_mem ?_ ?_ · -- the antisymmetric remainder: field strength plus lower-order terms rw [← algebraMap_smul ℂ ((1 : ℝ)/(s.card + 1 : ℝ))] @@ -315,28 +242,41 @@ lemma iteratedD_mem_symFieldAdjoin_sup Multiset.card_pos.mpr fun h => Multiset.notMem_zero ν (h ▸ hν) have hcard : (s - {ν}).card = s.card - 1 := by rw [Multiset.sub_singleton, Multiset.card_erase_of_mem hν, Nat.pred_eq_sub_one] - rw [iteratedD_sub_pair D D_comm s hν μ A φ, pair_eq_fieldStrength_sub_commutator, - map_sub] + have hνs : ν ::ₘ (s - {ν}) = s := by + rw [Multiset.sub_singleton, Multiset.cons_erase hν] + have hμs : μ ::ₘ (s - {ν}) = μ ::ₘ s - {ν} := by + rw [Multiset.sub_singleton, Multiset.sub_singleton] + rcases eq_or_ne ν μ with rfl | h + · rw [Multiset.erase_cons_head, Multiset.cons_erase hν] + · rw [Multiset.erase_cons_tail _ h.symm] + have hpair : A s μ φ - A (μ ::ₘ s - {ν}) ν φ = + fieldStrength A ν μ (s - {ν}) φ - commutatorFam A ν μ (s - {ν}) φ := by + have h := congrArg (fun f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B => f φ) + (pair_eq_fieldStrength_sub_commutatorFam A ν μ (s - {ν})) + simp only [LinearMap.sub_apply] at h + rw [← h, hνs, hμs] + rw [hpair] refine sub_mem ?_ ?_ · -- the field-strength part, through the covariant tower set l := (s - {ν}).toList with hl' have hl : (Multiset.ofList l) = s - {ν} := Multiset.coe_toList _ have hlen : l.length = s.card - 1 := by rw [← Multiset.coe_card, hl, hcard] - rw [show Lorentz.iteratedD D D_comm (s - {ν}) (fieldStrength A D ν μ φ) = - iteratedCovDerivAdjoint A D l (fieldStrength A D ν μ) φ - - (iteratedCovDerivAdjoint A D l (fieldStrength A D ν μ) φ - - Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν μ φ)) - from by rw [hl]; abel] + rw [show fieldStrength A ν μ (s - {ν}) φ = + iteratedCovDerivAdjoint A l (fieldStrength A ν μ) 0 φ - + (iteratedCovDerivAdjoint A l (fieldStrength A ν μ) 0 φ - + fieldStrength A ν μ (Multiset.ofList l + 0) φ) + from by rw [add_zero, hl]; abel] refine sub_mem ?_ ?_ · refine SetLike.le_def.mp le_sup_left (Algebra.subset_adjoin (Or.inr ⟨l, ν, μ, φ, ?_, rfl⟩)) omega · refine SetLike.le_def.mp le_sup_right (adjoin_symbols_mono ?_ - (iteratedCovDerivAdjoint_sub_iteratedD_mem (D_mul := D_mul) l ν μ φ)) + (iteratedCovDerivAdjoint_sub_mem l ν μ 0 φ)) + simp only [Multiset.card_zero] omega · -- the commutator part is strictly lower order refine SetLike.le_def.mp le_sup_right (adjoin_symbols_mono ?_ - (iteratedD_commutator_mem A D D_comm D_mul (s - {ν}) ν μ φ)) + (commutatorFam_mem A (s - {ν}) ν μ φ)) omega · -- the symmetrized symbol is a generator exact SetLike.le_def.mp le_sup_left @@ -347,69 +287,63 @@ lemma iteratedD_mem_symFieldAdjoin_sup together with the covariant field-strength tower generate the same subalgebra, `adjoin({ d_p A : |p| ≤ n }) = adjoin({ sym(d_p A) : |p| ≤ n } ∪ { 𝒟_q F : |q| < n })`. -/ -theorem symbolAdjoin_eq_symFieldAdjoin - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) - (n : ℕ) : +theorem symbolAdjoin_eq_symFieldAdjoin (n : ℕ) : Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} = + (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ b = A p μ φ} = Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by refine le_antisymm ?_ ?_ · -- symbols are generated by symmetrized symbols and the covariant tower, -- by strong induction on the order have main : ∀ m, ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m → m ≤ n → - Lorentz.iteratedD D D_comm p (A μ φ) ∈ Algebra.adjoin ℂ + A p μ φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by intro m induction m using Nat.strong_induction_on with | _ m ih => intro p μ φ hpm hmn have hSF : Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ p.card + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ p.card + 1 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < p.card ∧ - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) ≤ + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ≤ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by refine Algebra.adjoin_mono ?_ rintro b (⟨r, ψ, h0, hc, rfl⟩ | ⟨l, ν, lam, ψ, hl, rfl⟩) · exact Or.inl ⟨r, ψ, h0, by omega, rfl⟩ · exact Or.inr ⟨l, ν, lam, ψ, by omega, rfl⟩ have hAdj : Algebra.adjoin ℂ {b : B | ∃ (q : Multiset (Fin 1 ⊕ Fin 3)) (κ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), q.card ≤ (p.card - 1) ∧ - b = Lorentz.iteratedD D D_comm q (A κ ψ)} ≤ + b = A q κ ψ} ≤ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by refine Algebra.adjoin_le ?_ rintro b ⟨q, κ, ψ, hqc, rfl⟩ rcases Nat.eq_zero_or_pos q.card with hq0 | hqpos · obtain rfl : q = 0 := Multiset.card_eq_zero.mp hq0 - rw [Lorentz.iteratedD_zero] refine Algebra.subset_adjoin (Or.inl ⟨{κ}, ψ, by simp, by simp, ?_⟩) rw [symmetrizedDeriv_singleton] - rfl · exact ih q.card (by omega) q κ ψ (le_refl _) (by omega) - exact sup_le hSF hAdj (iteratedD_mem_symFieldAdjoin_sup D_mul p μ φ) + exact sup_le hSF hAdj (symbol_mem_symFieldAdjoin_sup p μ φ) refine Algebra.adjoin_le ?_ rintro b ⟨p, μ, φ, hpc, rfl⟩ exact main n p μ φ hpc (le_refl n) @@ -424,19 +358,18 @@ theorem symbolAdjoin_eq_symFieldAdjoin have : (r - {ν}).card = r.card - 1 := by rw [Multiset.sub_singleton, Multiset.card_erase_of_mem hν, Nat.pred_eq_sub_one] omega - · have h6 := iteratedCovDerivAdjoint_sub_iteratedD_mem (A := A) (D_comm := D_comm) - D_mul l ν lam φ - have hF := iteratedD_fieldStrength_mem (A := A) (D_comm := D_comm) D_mul - (Multiset.ofList l) ν lam φ - rw [show iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ = - (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ - - Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ)) + - Lorentz.iteratedD D D_comm (Multiset.ofList l) (fieldStrength A D ν lam φ) + · have h6 := iteratedCovDerivAdjoint_sub_mem (A := A) l ν lam 0 φ + have hF := fieldStrength_mem_adjoin_symbols (A := A) (Multiset.ofList l + 0) ν lam φ + rw [show iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ = + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ - + fieldStrength A ν lam (Multiset.ofList l + 0) φ) + + fieldStrength A ν lam (Multiset.ofList l + 0) φ from by abel] - refine add_mem (adjoin_symbols_mono (by omega) h6) - (adjoin_symbols_mono ?_ hF) - simp only [Multiset.coe_card] - omega + refine add_mem (adjoin_symbols_mono ?_ h6) (adjoin_symbols_mono ?_ hF) + · simp only [Multiset.card_zero] + omega + · simp only [Multiset.card_add, Multiset.coe_card, Multiset.card_zero] + omega /-- **The generation theorem, unbounded version**: the derivative symbols of the gauge field of all orders, and the symmetrized symbols together with the full covariant @@ -446,20 +379,18 @@ theorem symbolAdjoin_eq_symFieldAdjoin It follows from the graded version `symbolAdjoin_eq_symFieldAdjoin` since every generator on either side appears at some finite order. -/ -theorem symbolAdjoin_eq_symFieldAdjoin_top - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) : +theorem symbolAdjoin_eq_symFieldAdjoin_top : Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm p (A μ φ)} = + (φ : Module.Dual ℝ GaugeAlgebra), b = A p μ φ} = Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) · rintro b ⟨p, μ, φ, rfl⟩ - have h := (symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul p.card).le + have h := (symbolAdjoin_eq_symFieldAdjoin (A := A) p.card).le (Algebra.subset_adjoin ⟨p, μ, φ, le_refl _, rfl⟩) refine Algebra.adjoin_mono ?_ h rintro b (⟨r, ψ, h0, _, rfl⟩ | ⟨l, ν, lam, ψ, _, rfl⟩) @@ -467,9 +398,9 @@ theorem symbolAdjoin_eq_symFieldAdjoin_top · exact Or.inr ⟨l, ν, lam, ψ, rfl⟩ · have hmono : ∀ n : ℕ, Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} ≤ + b = A p μ φ} ≤ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm p (A μ φ)} := by + (φ : Module.Dual ℝ GaugeAlgebra), b = A p μ φ} := by intro n refine Algebra.adjoin_mono ?_ rintro b ⟨p, μ, ψ, _, rfl⟩ @@ -478,19 +409,12 @@ theorem symbolAdjoin_eq_symFieldAdjoin_top · have hcard : 1 ≤ r.card := Nat.one_le_iff_ne_zero.mpr fun h => hr0 (Multiset.card_eq_zero.mp h) exact hmono (r.card - 1) - ((symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul (r.card - 1)).ge + ((symbolAdjoin_eq_symFieldAdjoin (A := A) (r.card - 1)).ge (Algebra.subset_adjoin (Or.inl ⟨r, φ, hr0, by omega, rfl⟩))) · exact hmono (l.length + 1) - ((symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul (l.length + 1)).ge + ((symbolAdjoin_eq_symFieldAdjoin (A := A) (l.length + 1)).ge (Algebra.subset_adjoin (Or.inr ⟨l, ν, lam, φ, by omega, rfl⟩))) -/-! - -## The group action on the symmetrized derivatives - --/ - - /-! ## The gauge action on the symmetrized derivatives @@ -509,13 +433,13 @@ theorem symbolAdjoin_eq_symFieldAdjoin_top This is the symbol-level counterpart of `symmetrizedMaurerCartanForm`: the gauge group acts on the symmetrized derivative coordinates through the symmetrized Maurer–Cartan data. -/ -lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (symmetrizedDeriv D D_comm s A φ) = + repGauge U (symmetrizedDeriv s A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff U⁻¹ p.1 φ))).sum).sum + A p.2 μ (adjointDualCoeff U⁻¹ p.1 φ)).sum).sum + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (symmetrizedMaurerCartanForm U⁻¹ s))) := by set L : JetGaugeAlgebra →ₗ[ℝ] B := (Algebra.linearMap ℂ B).restrictScalars ℝ ∘ₗ Algebra.linearMap ℝ ℂ ∘ₗ @@ -545,13 +469,13 @@ lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A D D_com This is the mechanism by which the truncation kernel can be used to gauge away the symmetrized derivative coordinates. -/ lemma repGauge_symmetrizedDeriv_truncationKer - (hA : IsGaugeField repLorentz repGauge A D D_comm) + (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U.1 (symmetrizedDeriv D D_comm s A φ) = + repGauge U.1 (symmetrizedDeriv s A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff (U.1)⁻¹ p.1 φ))).sum).sum + A p.2 μ (adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + algebraMap ℂ B (φ (symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by rw [repGauge_symmetrizedDeriv hA U.1 s φ] rfl @@ -567,14 +491,14 @@ lemma repGauge_symmetrizedDeriv_truncationKer sent to zero, but on any fixed field configuration (a point of `Spec B`) the shift `c` can be chosen to cancel the configuration's symmetrized derivative values. -/ lemma exists_repGauge_symmetrizedDeriv_shift - (hA : IsGaugeField repLorentz repGauge A D D_comm) + (hA : IsGaugeField repLorentz repGauge A) (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → GaugeAlgebra) : ∃ U : JetGaugeGroupI.truncationKer 0, ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (φ : Module.Dual ℝ GaugeAlgebra), - repGauge U.1 (symmetrizedDeriv D D_comm s A φ) = + repGauge U.1 (symmetrizedDeriv s A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff (U.1)⁻¹ p.1 φ))).sum).sum + A p.2 μ (adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + algebraMap ℂ B (φ (c ⟨s, hs⟩)) := by obtain ⟨V, hV⟩ := symmetrizedMaurerCartanCoeff_surjective c refine ⟨V⁻¹, fun s hs φ => ?_⟩ @@ -586,7 +510,7 @@ lemma exists_repGauge_symmetrizedDeriv_shift Throughout, `hc` is the hypothesis that all derivative symbols of the gauge field are central in `B` — the statement that the gauge field is bosonic. Everything built from -the symbols by the total derivative and the bracket is then central as well. +the symbols by the bracket is then central as well. -/ @@ -600,18 +524,6 @@ lemma smul_mem_center (r : ℝ) {x : B} (hx : x ∈ Subring.center B) : rw [← algebraMap_smul ℂ r x, Algebra.smul_def] exact Subring.mul_mem _ (algebraMap_mem_center _) hx -/-- The total derivative of a central element is central, by the Leibniz rule. -/ -lemma deriv_mem_center - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) - {x : B} (hx : x ∈ Subring.center B) (ρ : Fin 1 ⊕ Fin 3) : - D ρ x ∈ Subring.center B := by - rw [Subring.mem_center_iff] at hx ⊢ - intro b - have h := congrArg (D ρ) (hx b) - rw [D_mul, D_mul, hx (D ρ b), add_comm (D ρ x * b)] at h - exact add_left_cancel h - /-- The bracket of component families with central components is central. -/ lemma bracketFam_mem_center {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hf : ∀ ψ, f ψ ∈ Subring.center B) (hg : ∀ ψ, g ψ ∈ Subring.center B) @@ -621,46 +533,52 @@ lemma bracketFam_mem_center {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} refine Subring.sum_mem _ fun j _ => Subring.sum_mem _ fun k _ => ?_ exact smul_mem_center _ (Subring.mul_mem _ (hf _) (hg _)) -/-- **1.** If the derivative symbols of the gauge field are central, so are the - covariant derivatives of the field strength. -/ +/-- The derived commutator terms of central symbols are central. -/ +lemma commutatorFam_mem_center + (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), A p μ φ ∈ Subring.center B) + (ν lam : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + commutatorFam A ν lam s φ ∈ Subring.center B := by + rw [commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + exact bracketFam_mem_center (fun ψ => hc _ _ _) (fun ψ => hc _ _ _) φ + +/-- **1.** If the derivative symbols of the gauge field are central, so are all + derivative symbols of the covariant derivatives of the field strength. -/ lemma iteratedCovDerivAdjoint_fieldStrength_mem_center - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), - Lorentz.iteratedD D D_comm p (A μ φ) ∈ Subring.center B) + (φ : Module.Dual ℝ GaugeAlgebra), A p μ φ ∈ Subring.center B) (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ ∈ Subring.center B := by - have hc0 : ∀ (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), - A μ ψ ∈ Subring.center B := by - intro μ ψ - have := hc 0 μ ψ - rwa [Lorentz.iteratedD_zero] at this - induction l generalizing φ with + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) s φ ∈ Subring.center B := by + induction l generalizing s φ with | nil => - show fieldStrength A D ν lam φ ∈ Subring.center B - rw [fieldStrength_apply, commutator_eq_bracketFam] + show fieldStrength A ν lam s φ ∈ Subring.center B + rw [fieldStrength_apply] exact Subring.add_mem _ - (Subring.sub_mem _ (deriv_mem_center D_mul (hc0 lam φ) ν) - (deriv_mem_center D_mul (hc0 ν φ) lam)) - (bracketFam_mem_center (hc0 ν) (hc0 lam) φ) + (Subring.sub_mem _ (hc _ _ _) (hc _ _ _)) + (commutatorFam_mem_center hc ν lam s φ) | cons ρ l ih => - rw [show iteratedCovDerivAdjoint A D (ρ :: l) (fieldStrength A D ν lam) φ = - D ρ (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ) + - bracketFam (A ρ) (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) φ + rw [show iteratedCovDerivAdjoint A (ρ :: l) (fieldStrength A ν lam) s φ = + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) (ρ ::ₘ s) φ + + bracketFamConv A ρ + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) s φ from rfl] - exact Subring.add_mem _ (deriv_mem_center D_mul (ih φ) ρ) - (bracketFam_mem_center (hc0 ρ) (fun ψ => ih ψ) φ) + refine Subring.add_mem _ (ih (ρ ::ₘ s) φ) ?_ + rw [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + exact bracketFam_mem_center (fun ψ => hc _ _ _) (fun ψ => ih p.2 ψ) φ /-- **2.** If the derivative symbols of the gauge field are central, so are the symmetrized derivative symbols. -/ lemma symmetrizedDeriv_mem_center (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), - Lorentz.iteratedD D D_comm p (A μ φ) ∈ Subring.center B) + (φ : Module.Dual ℝ GaugeAlgebra), A p μ φ ∈ Subring.center B) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : - symmetrizedDeriv D D_comm s A φ ∈ Subring.center B := by + symmetrizedDeriv s A φ ∈ Subring.center B := by rw [symmetrizedDeriv] refine smul_mem_center _ (multiset_sum_mem _ fun x hx => ?_) obtain ⟨μ, hμ, rfl⟩ := Multiset.mem_map.mp hx @@ -670,31 +588,28 @@ lemma symmetrizedDeriv_mem_center the zeroth truncation: at `s = 0` the transformation law is the dual adjoint action of the base-point value `U₀⁻¹ = 1`, which is trivial. -/ lemma TransformsInAdjoint.repGauge_eq_of_mem_truncationKer_zero - {hA : IsGaugeField repLorentz repGauge A D D_comm} - {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U.1 (F φ) = F φ := by + repGauge U.1 (F 0 φ) = F 0 φ := by have hinv : ((U.1)⁻¹).eval = 1 := by rw [map_inv, JetGaugeGroupI.mem_truncationKer_zero_iff.mp U.2, inv_one] - simpa [Lorentz.iteratedD_zero, adjointDualCoeff_zero_of_eval_eq_one hinv] using - hF U.1 φ 0 + simpa [adjointDualCoeff_zero_of_eval_eq_one hinv] using hF U.1 φ 0 /-- **4.** The covariant derivatives of the field strength are invariant under the kernel of the zeroth truncation: they transform in the adjoint, and the truncation kernel acts through the trivial base-point adjoint. -/ lemma repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero - (hA : IsGaugeField repLorentz repGauge A D D_comm) - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U.1 (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ) = - iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ := by - have hadj : hA.TransformsInAdjoint - (iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam)) := by + repGauge U.1 (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ) = + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ := by + have hadj : TransformsInAdjoint repGauge + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) := by induction l with - | nil => exact transformsInAdjoint_fieldStrength hA D_mul ν lam - | cons ρ l ih => exact TransformsInAdjoint.covDerivAdjoint D_mul ih ρ + | nil => exact transformsInAdjoint_fieldStrength hA ν lam + | cons ρ l ih => exact TransformsInAdjoint.covDerivAdjoint hA ih ρ exact hadj.repGauge_eq_of_mem_truncationKer_zero U φ /-! @@ -731,38 +646,35 @@ The strategy, by downward induction on the top symbol order `N` present in `x`: /-- The generation theorem relativized to an arbitrary set `S` of extra generators: a corollary of `symbolAdjoin_eq_symFieldAdjoin` since `adjoin (X ∪ S)` is determined by `adjoin X` and `S`. -/ -theorem symbolAdjoin_union_eq_symFieldAdjoin_union - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) - (n : ℕ) (S : Set B) : +theorem symbolAdjoin_union_eq_symFieldAdjoin_union (n : ℕ) (S : Set B) : Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) = + b = A p μ φ} ∪ S) = Algebra.adjoin ℂ (({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ n + 1 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), l.length < n ∧ - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ}) ∪ S) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ∪ S) := by rw [Algebra.adjoin_union, Algebra.adjoin_union, - symbolAdjoin_eq_symFieldAdjoin (A := A) (D_comm := D_comm) D_mul n] + symbolAdjoin_eq_symFieldAdjoin (A := A) n] /-- Finite order bound: membership in the subalgebra generated by all symbols and `S` uses only finitely many generators, hence symbols of some bounded order. -/ lemma exists_le_of_mem_adjoin_symbols_union (S : Set B) {x : B} (hx : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S)) : + b = A p μ φ} ∪ S)) : ∃ n : ℕ, x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) := by + b = A p μ φ} ∪ S) := by have hmono : ∀ {n m : ℕ}, n ≤ m → Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) ≤ + b = A p μ φ} ∪ S) ≤ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S) := by + b = A p μ φ} ∪ S) := by intro n m hnm refine Algebra.adjoin_mono (Set.union_subset_union_left S ?_) rintro b ⟨p, μ, φ, h, rfl⟩ @@ -787,13 +699,13 @@ lemma exists_le_of_mem_adjoin_symbols_union (S : Set B) {x : B} symmetrized symbol collapses to the symbol itself, and the action is an honest translation by the symmetrized Maurer–Cartan coefficient. -/ theorem repGauge_symmetrizedDeriv_translation - (hA : IsGaugeField repLorentz repGauge A D D_comm) + (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (hU : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < s.card → adjointDualCoeff (U.1)⁻¹ x = 0) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U.1 (symmetrizedDeriv D D_comm s A φ) = - symmetrizedDeriv D D_comm s A φ + + repGauge U.1 (symmetrizedDeriv s A φ) = + symmetrizedDeriv s A φ + algebraMap ℂ B (φ (symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by -- collapsing principle: a sum over the antidiagonal whose terms vanish off the -- `(0, t)` splitting reduces to the `(0, t)` term @@ -836,7 +748,7 @@ theorem repGauge_symmetrizedDeriv_translation refine congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => ?_) have hvan : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), p.1 + p.2 = s - {μ} → p.1 ≠ 0 → - Lorentz.iteratedD D D_comm p.2 (A μ (adjointDualCoeff (U.1)⁻¹ p.1 φ)) = 0 := by + A p.2 μ (adjointDualCoeff (U.1)⁻¹ p.1 φ) = 0 := by intro p hp hp1 have hcard : p.1.card < s.card := by have h1 : p.1.card + p.2.card = (s - {μ}).card := by rw [← Multiset.card_add, hp] @@ -1159,32 +1071,29 @@ theorem mem_of_translationInvariant {ι : Type} [Fintype ι] elements of `S`. Requires only centrality of the symbols (the gauge field is bosonic); no independence hypothesis. -/ theorem invariant_mem_adjoin_fieldStrength - (hA : IsGaugeField repLorentz repGauge A D D_comm) - (D_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D μ (b₁ * b₂) = D μ b₁ * b₂ + b₁ * D μ b₂) + (hA : IsGaugeField repLorentz repGauge A) (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), - Lorentz.iteratedD D D_comm p (A μ φ) ∈ Subring.center B) + (φ : Module.Dual ℝ GaugeAlgebra), A p μ φ ∈ Subring.center B) (S : Set B) (hS : ∀ y ∈ S, ∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 y = y) {x : B} (hx : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ S)) + b = A p μ φ} ∪ S)) (hinv : ∀ U : JetGaugeGroupI, repGauge U x = x) : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S) := by classical -- every element of the covariant tower together with `S` is fixed by the -- truncation kernel have hS' : ∀ y ∈ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S), + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S), ∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 y = y := by rintro y (⟨l, ν, lam, φ, rfl⟩ | hyS) U · exact repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero - hA D_mul U l ν lam φ + hA U l ν lam φ · exact hS y hyS U -- the gauge action preserves the unit, hence acts by ring endomorphisms have hone : ∀ U : JetGaugeGroupI, repGauge U (1 : B) = 1 := by @@ -1201,27 +1110,27 @@ theorem invariant_mem_adjoin_fieldStrength have hdescent : ∀ (m : ℕ) (z : B), z ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ m + 1 ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ m + 1 ∧ b = symmetrizedDeriv r A φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) → + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → (∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 z = z) → z ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv r A φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) := by intro m z hz hzinv set bv := Module.Free.chooseBasis ℝ GaugeAlgebra with hbv set R₀ : Subalgebra ℂ B := Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv D D_comm r A φ} ∪ + r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv r A φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) with hR₀ + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) with hR₀ set Y : Sym (Fin 1 ⊕ Fin 3) (m + 1) × Module.Free.ChooseBasisIndex ℝ GaugeAlgebra → B := - fun p => symmetrizedDeriv D D_comm (p.1 : Multiset (Fin 1 ⊕ Fin 3)) A (bv.coord p.2) + fun p => symmetrizedDeriv (p.1 : Multiset (Fin 1 ⊕ Fin 3)) A (bv.coord p.2) with hYdef -- the translating jets realizing an arbitrary top-order shift have hUt' : ∀ t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × @@ -1292,8 +1201,8 @@ theorem invariant_mem_adjoin_fieldStrength Finsupp.single_apply, smul_eq_mul, mul_ite, mul_one, mul_zero] rw [Finset.sum_ite_eq' Finset.univ j (fun j' => t (ps, j'))] simp - show repGauge (Ut t).1 (symmetrizedDeriv D D_comm (ps : Multiset (Fin 1 ⊕ Fin 3)) A - (bv.coord j)) = symmetrizedDeriv D D_comm (ps : Multiset (Fin 1 ⊕ Fin 3)) A + show repGauge (Ut t).1 (symmetrizedDeriv (ps : Multiset (Fin 1 ⊕ Fin 3)) A + (bv.coord j)) = symmetrizedDeriv (ps : Multiset (Fin 1 ⊕ Fin 3)) A (bv.coord j) + algebraMap ℂ B ((t (ps, j) : ℝ) : ℂ) rw [repGauge_symmetrizedDeriv_translation hA (Ut t) _ hp0 hUvan (bv.coord j), hval] -- the coordinate expansion of a top-order symmetrized symbol in the chosen basis @@ -1305,20 +1214,19 @@ theorem invariant_mem_adjoin_fieldStrength smul_eq_mul, map_smul] exact Finset.sum_congr rfl fun j _ => mul_comm _ _ have hexpand : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), - symmetrizedDeriv D D_comm r A φ = - ∑ j, φ (bv j) • symmetrizedDeriv D D_comm r A (bv.coord j) := by + symmetrizedDeriv r A φ = + ∑ j, φ (bv j) • symmetrizedDeriv r A (bv.coord j) := by intro r φ set L : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - { toFun := fun ψ => symmetrizedDeriv D D_comm r A ψ, + { toFun := fun ψ => symmetrizedDeriv r A ψ, map_add' := fun ψ ψ' => by simp only [symmetrizedDeriv, map_add] rw [← smul_add, ← Multiset.sum_map_add] map_smul' := fun c ψ => by - simp only [symmetrizedDeriv, map_smul, RingHom.id_apply, - LinearMap.map_smul_of_tower] - rw [show (r.map fun μ => c • Lorentz.iteratedD D D_comm (r - {μ}) (A μ ψ)) = - (r.map fun μ => Lorentz.iteratedD D D_comm (r - {μ}) (A μ ψ)).map - (fun w => c • w) from (Multiset.map_map _ _ _).symm, + simp only [symmetrizedDeriv, map_smul, RingHom.id_apply] + rw [show (r.map fun μ => c • A (r - {μ}) μ ψ) = + (r.map fun μ => A (r - {μ}) μ ψ).map (fun w => c • w) from + (Multiset.map_map _ _ _).symm, ← Multiset.smul_sum, smul_comm] } with hL have hLcalc : L φ = ∑ j, φ (bv j) • L (bv.coord j) := by conv_lhs => rw [← hdual φ, map_sum] @@ -1349,31 +1257,31 @@ theorem invariant_mem_adjoin_fieldStrength -- bound the symbol order of the invariant, working relative to the full tower have hxS' : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ + b = A p μ φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) := + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) := Algebra.adjoin_mono (Set.union_subset_union_right _ Set.subset_union_right) hx obtain ⟨n, hxn⟩ := exists_le_of_mem_adjoin_symbols_union _ hxS' -- convert bounded symbols to symmetrized symbols, absorbing the tower have hconv : ∀ (k : ℕ) (z : B), z ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ k ∧ - b = Lorentz.iteratedD D D_comm p (A μ φ)} ∪ + b = A p μ φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) → + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → z ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), r ≠ 0 ∧ r.card ≤ k + 1 ∧ - b = symmetrizedDeriv D D_comm r A φ} ∪ + b = symmetrizedDeriv r A φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) := by intro k z hzk - rw [symbolAdjoin_union_eq_symFieldAdjoin_union D_mul k + rw [symbolAdjoin_union_eq_symFieldAdjoin_union k ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)] at hzk + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)] at hzk refine Algebra.adjoin_mono ?_ hzk rintro b ((⟨r, φ, h0, hcr, rfl⟩ | ⟨l, ν, lam, φ, _, rfl⟩) | hb) · exact Or.inl ⟨r, φ, h0, hcr, rfl⟩ @@ -1383,14 +1291,14 @@ theorem invariant_mem_adjoin_fieldStrength have hiter : ∀ (k : ℕ) (z : B), z ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), r ≠ 0 ∧ r.card ≤ k ∧ - b = symmetrizedDeriv D D_comm r A φ} ∪ + b = symmetrizedDeriv r A φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S)) → + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → (∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 z = z) → z ∈ Algebra.adjoin ℂ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = iteratedCovDerivAdjoint A D l (fieldStrength A D ν lam) φ} ∪ S) := by + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S) := by intro k induction k with | zero => diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean index aa178f893..93d369b4b 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean @@ -10,7 +10,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic # Adjoint gauge tensors and the covariant derivative -A component family is an *adjoint gauge tensor* when all its derivative symbols +A family of derivative symbols is an *adjoint gauge tensor* when all its symbols transform by the pure Leibniz convolution of the dual adjoint action, with no inhomogeneous term. The convolution is forced: the gauge group acts on the derivative symbols by substitution and the chain rule, so `U • [∂_s F^φ]` produces @@ -19,7 +19,7 @@ every splitting `s = x + y` — `x` derivatives hitting the adjoint, `y` remaini The two theorems of this section: the field strength is an adjoint gauge tensor (`transformsInAdjoint_fieldStrength`), and adjoint gauge tensors are closed under -the covariant derivative `∇_ρ = D_ρ + ⁅A_ρ, ·⁆` +the covariant derivative `∇_ρ F = [∂_ρ F] + ⁅A_ρ, F⁆` (`TransformsInAdjoint.covDerivAdjoint`) — so by recursion every iterated covariant derivative of the field strength is an adjoint gauge tensor. @@ -35,43 +35,48 @@ namespace IsGaugeField variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} -variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} -variable [Lorentz.IsLorentzDeriv repLorentz D] -variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -/-- A component family `F` *transforms in the adjoint* (is an adjoint gauge tensor) - for the gauge field `hA` when each derivative symbol `[∂_s F^φ]` transforms by the - Leibniz convolution of the dual adjoint coefficients against lower derivative +/-- A family of derivative symbols `F` *transforms in the adjoint* (is an adjoint gauge + tensor) for the gauge representation `repGauge` when each symbol `[∂_s F^φ]` + transforms by the Leibniz convolution of the dual adjoint coefficients against lower symbols — the shape of `gauge_apply_deriv` with no Maurer–Cartan shift. At `s = 0` - this is the homogeneous law `U • F^φ = F^{Ad₀^* φ}`. The `hA` argument pins the - representations and derivative to the gauge-field setting. -/ -def TransformsInAdjoint (_hA : IsGaugeField repLorentz repGauge A D D_comm) - (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : Prop := + this is the homogeneous law `U • F^φ = F^{Ad₀^* φ}`. -/ +def TransformsInAdjoint (repGauge : Representation ℂ JetGaugeGroupI B) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : Prop := ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℝ GaugeAlgebra) (s : Multiset (Fin 1 ⊕ Fin 3)), - repGauge U (Lorentz.iteratedD D D_comm s (F φ)) = - (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ p.1 φ))).sum + repGauge U (F s φ) = + (s.antidiagonal.map fun p => F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum + +/-- **The derived bracket family** `⁅A_ρ, F⁆`: the `s`-derivative of the bracket of the + gauge field against a family, given by the Leibniz convolution of the derivative + symbols over the multiset antidiagonal. -/ +noncomputable def bracketFamConv + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + (s.antidiagonal.map fun p => bracketFam (A p.1 ρ) (F p.2)).sum -/-- The covariant derivative `∇_ρ F = D_ρ F + ⁅A_ρ, F⁆` of an adjoint-valued - component family: the total derivative plus the bracket against the gauge field. - The gauge-algebra bracket carries the physicists' `i`, so in matrix terms this is - `∂_ρ F + i [A_ρ, F]` — the adjoint-representation covariant derivative in the same - `D = ∂ + i A` convention as the field strength. It preserves `TransformsInAdjoint` - (`TransformsInAdjoint.covDerivAdjoint`). -/ +/-- The covariant derivative `∇_ρ F = [∂_ρ F] + ⁅A_ρ, F⁆` of an adjoint-valued family + of derivative symbols: the extra derivative on the symbol plus the derived bracket + against the gauge field. The gauge-algebra bracket carries the physicists' `i`, so + in matrix terms this is `∂_ρ F + i [A_ρ, F]` — the adjoint-representation covariant + derivative in the same `D = ∂ + i A` convention as the field strength. It preserves + `TransformsInAdjoint` (`TransformsInAdjoint.covDerivAdjoint`). -/ noncomputable def covDerivAdjoint - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) : + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - (D ρ).restrictScalars ℝ ∘ₗ F + bracketFam (A ρ) F + F (ρ ::ₘ s) + bracketFamConv A ρ F s @[simp] -lemma covDerivAdjoint_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - covDerivAdjoint A F D ρ φ = D ρ (F φ) + bracketFam (A ρ) F φ := rfl +lemma covDerivAdjoint_apply + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + covDerivAdjoint A F ρ s φ = F (ρ ::ₘ s) φ + bracketFamConv A ρ F s φ := rfl /-! @@ -83,95 +88,81 @@ lemma covDerivAdjoint_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlge extra derivative traced through `adjointDualCoeff_cons`: the Leibniz splittings where `κ` stays a derivative, minus the convolution where `κ` hits the adjoint — an `ad` of the derived Maurer–Cartan form. -/ -lemma TransformsInAdjoint.repGauge_iteratedD_cons - {hA : IsGaugeField repLorentz repGauge A D D_comm} - {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) +lemma TransformsInAdjoint.repGauge_cons + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (F φ)) = + repGauge U (F (κ ::ₘ s) φ) = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (F (adjointDualCoeff U⁻¹ p.1 φ))).sum + F (κ ::ₘ p.2) (adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ q.2 + F p.2 (adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + (maurerCartanForm U⁻¹ κ)))))).sum).sum := by rw [hF U φ (κ ::ₘ s)] simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] - have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 - (F (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = + have hsec : (Multiset.map (fun p => + F p.2 (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = -(s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ q.2 + F p.2 (adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + (maurerCartanForm U⁻¹ κ)))))).sum).sum := by rw [← Multiset.sum_map_neg''] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, - Multiset.map_map, map_multiset_sum, Multiset.map_map] + rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_multiset_sum, Multiset.map_map] exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) rw [hsec, sub_eq_add_neg] set_option maxHeartbeats 2000000 in /-- The all-orders gauge transformation of the derived bracket `⁅A_ρ, F⁆` against an adjoint gauge tensor `F`: since `F` transforms homogeneously, only one `ad` - cross-term convolution survives — the analogue of `repGauge_iteratedD_commutator` + cross-term convolution survives — the analogue of `repGauge_commutatorFam` with a gauge tensor in the second slot. -/ -lemma TransformsInAdjoint.repGauge_iteratedD_bracket - {hA : IsGaugeField repLorentz repGauge A D D_comm} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) +lemma TransformsInAdjoint.repGauge_bracketFamConv + (hA : IsGaugeField repLorentz repGauge A) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (Lorentz.iteratedD D D_comm s (bracketFam (A ρ) F φ)) = + repGauge U (bracketFamConv A ρ F s φ) = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (bracketFam (A ρ) F - (adjointDualCoeff U⁻¹ p.1 φ))).sum + bracketFamConv A ρ F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (adjointDualCoeff U⁻¹ r.1 + F r.2 (adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum := by + (maurerCartanForm U⁻¹ ρ)))))).sum).sum := by have hAlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), - repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A ρ) ψ) = - ((u.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) ψ + repGauge U (A u ρ ψ) = + ((u.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ ρ)))) := by intro u ψ - show repGauge U (Lorentz.iteratedD D D_comm u (A ρ ψ)) = _ rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), - repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ F) ψ) = - ((u.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - adjointDualCoeff U⁻¹ r.1).sum) ψ + repGauge U (F u ψ) = + ((u.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) ψ + algebraMap ℂ B (ψ (0 : GaugeAlgebra)) := by intro u ψ - show repGauge U (Lorentz.iteratedD D D_comm u (F ψ)) = _ rw [hF U ψ u, Multiset.sum_linearMap_apply, Multiset.map_map] simp only [map_zero, Complex.ofReal_zero, add_zero] congr 1 have hMa : (s.antidiagonal.map fun p => - bracketFam ((p.1.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) - ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - adjointDualCoeff U⁻¹ r.1).sum) φ).sum = + bracketFam ((p.1.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) φ).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - bracketFam ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by + bracketFam (A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) rw [bracketFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map] @@ -182,104 +173,86 @@ lemma TransformsInAdjoint.repGauge_iteratedD_bracket refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) simp only [Function.comp_apply] have hMc : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (bracketFam (A ρ) F - (adjointDualCoeff U⁻¹ p.1 φ))).sum = + bracketFamConv A ρ F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - bracketFam ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by + bracketFam (A r.1 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [bracketFam_adjointDualCoeff U⁻¹ p.1 (A ρ) F φ, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) - simp only [Function.comp_apply] - rw [iteratedD_bracketFam hD p.2 (A ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) - (F ∘ₗ adjointDualCoeff U⁻¹ q.2) φ] + rw [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_congr rfl (fun r hr => by + rw [Function.comp_apply, + bracketFam_adjointDualCoeff U⁻¹ p.1 (A r.1 ρ) (F r.2) φ]), + Multiset.sum_map_sum_map] have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => - bracketFam ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ a) - ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ F ∘ₗ - adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) + bracketFam (A b ρ ∘ₗ adjointDualCoeff U⁻¹ a) + (F d ∘ₗ adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), - ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - adjointDualCoeff U⁻¹ r.1).sum) + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (adjointDualCoeff U⁻¹ r.1 + F r.2 (adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ))))))).sum := by + (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) - simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] - rw [iteratedD_bracketFam hD s (A ρ) F φ, map_multiset_sum, Multiset.map_map, + simp only [Function.comp_apply, LinearMap.coe_comp] + rw [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, map_multiset_sum, + Multiset.map_map, Multiset.map_congr rfl (fun p hp => by - rw [Function.comp_apply, hA.repGauge_bracketFam U (hAlaw p.1) (hFlaw p.2) φ, - hCg p, map_zero, LinearMap.comp_zero, map_zero, sub_zero, lie_zero, map_zero, + rw [Function.comp_apply, Function.comp_apply, + hA.repGauge_bracketFam U (hAlaw p.1) (hFlaw p.2) φ, hCg p, map_zero, + LinearMap.comp_zero, map_zero, sub_zero, lie_zero, map_zero, Complex.ofReal_zero, map_zero, add_zero]), Multiset.sum_map_add, hM] set_option maxHeartbeats 2000000 in /-- **Adjoint gauge tensors are closed under the covariant derivative**: if `F` - transforms in the adjoint, so does `∇_ρ F = D_ρ F + ⁅A_ρ, F⁆`. The single - inhomogeneous convolution of `∂_{ρ ::ₘ s} F` - (`TransformsInAdjoint.repGauge_iteratedD_cons`) cancels the single `ad` cross-term - convolution of `⁅A_ρ, F⁆` (`TransformsInAdjoint.repGauge_iteratedD_bracket`) + transforms in the adjoint, so does `∇_ρ F = [∂_ρ F] + ⁅A_ρ, F⁆`. The single + inhomogeneous convolution of `[∂_{ρ ::ₘ s} F]` + (`TransformsInAdjoint.repGauge_cons`) cancels the single `ad` cross-term + convolution of `⁅A_ρ, F⁆` (`TransformsInAdjoint.repGauge_bracketFamConv`) through the coassociativity of the antidiagonal; no structural equation is needed. Together with `transformsInAdjoint_fieldStrength` this makes every iterated covariant derivative of the field strength an adjoint gauge tensor, by recursion. -/ theorem TransformsInAdjoint.covDerivAdjoint - {hA : IsGaugeField repLorentz repGauge A D D_comm} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hF : hA.TransformsInAdjoint F) - (ρ : Fin 1 ⊕ Fin 3) : - hA.TransformsInAdjoint (covDerivAdjoint A F D ρ) := by + (hA : IsGaugeField repLorentz repGauge A) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) (ρ : Fin 1 ⊕ Fin 3) : + TransformsInAdjoint repGauge (IsGaugeField.covDerivAdjoint A F ρ) := by intro U φ s - have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), - Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by - intro κ t b - rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by - rw [add_comm, Multiset.singleton_add], - Lorentz.iteratedD_add, LinearMap.comp_apply] - congr 1 - have hL : repGauge U (Lorentz.iteratedD D D_comm s - (IsGaugeField.covDerivAdjoint A F D ρ φ)) = - repGauge U (Lorentz.iteratedD D D_comm (ρ ::ₘ s) (F φ)) - + repGauge U (Lorentz.iteratedD D D_comm s (bracketFam (A ρ) F φ)) := by - rw [covDerivAdjoint_apply, map_add, hDcomp ρ s, map_add] + have hL : repGauge U (IsGaugeField.covDerivAdjoint A F ρ s φ) = + repGauge U (F (ρ ::ₘ s) φ) + repGauge U (bracketFamConv A ρ F s φ) := by + rw [covDerivAdjoint_apply, map_add] have hR : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (IsGaugeField.covDerivAdjoint A F D ρ - (adjointDualCoeff U⁻¹ p.1 φ))).sum = + IsGaugeField.covDerivAdjoint A F ρ p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (ρ ::ₘ p.2) (F (adjointDualCoeff U⁻¹ p.1 φ))).sum + F (ρ ::ₘ p.2) (adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (bracketFam (A ρ) F - (adjointDualCoeff U⁻¹ p.1 φ))).sum := by + bracketFamConv A ρ F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by rw [← Multiset.sum_map_add] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [covDerivAdjoint_apply, map_add, hDcomp ρ p.2] + rw [covDerivAdjoint_apply] have hcancel : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (adjointDualCoeff U⁻¹ q.2 + F p.2 (adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum = + (maurerCartanForm U⁻¹ ρ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (adjointDualCoeff U⁻¹ r.1 + F r.2 (adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum := + (maurerCartanForm U⁻¹ ρ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => - Lorentz.iteratedD D D_comm c (F (adjointDualCoeff U⁻¹ b + F c (adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ρ))))))) - rw [hL, hF.repGauge_iteratedD_cons U ρ s φ, hF.repGauge_iteratedD_bracket hD U s ρ φ, + (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ρ)))))) + rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv hA U s ρ φ, hR, hcancel] abel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean index 725df00cd..7757f689b 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean @@ -14,7 +14,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeter ## i. Overview The gauge-boson jet algebra, complexified, together with its Lorentz action, jet gauge -action, gauge-field generators and total derivative, is a *gauge field* in the sense of +action and gauge-field derivative symbols, is a *gauge field* in the sense of the abstract covariance machinery of `Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued`: the structure `IsGaugeField` holds. This file establishes that instance and instantiates the abstract classification @@ -29,8 +29,8 @@ strengths, their covariant derivatives, and the matter content `S` remain. ## ii. Key results -- `GaugeJetAlgebra.gaugeField` : the gauge-field generators, as a family over the dual of - the gauge algebra. +- `GaugeJetAlgebra.gaugeField` : the gauge-field derivative symbols, as a family over the + derivative multiset and the dual of the gauge algebra. - `GaugeJetAlgebra.isGaugeField` : the complexified gauge-boson jet algebra is a gauge field. - `GaugeJetAlgebra.invariant_mem_adjoin_fieldStrength` : the classification of gauge @@ -39,7 +39,7 @@ strengths, their covariant derivatives, and the matter content `S` remain. ## iii. Table of contents - A. The gauge-field structure - - A.1. The gauge-field generators + - A.1. The gauge-field derivative symbols - A.2. The `IsGaugeField` instance - B. The classification of gauge invariants @@ -63,20 +63,23 @@ open TensorProduct Matrix MatrixGroups /-! -### A.1. The gauge-field generators +### A.1. The gauge-field derivative symbols -/ -/-- The gauge-field generators of the complexified gauge-boson jet algebra, as a family - over the spacetime index and the dual of the gauge algebra — the form consumed by the - abstract covariance machinery. -/ -noncomputable def gaugeField (μ : Fin 1 ⊕ Fin 3) : +/-- The gauge-field derivative symbols of the complexified gauge-boson jet algebra, as a + family over the derivative multiset, the spacetime index and the dual of the gauge + algebra — the form consumed by the abstract covariance machinery. -/ +noncomputable def gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra := - (TensorProduct.mk ℝ ℂ GaugeJetAlgebra 1).comp (ofA μ) + (Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm s).restrictScalars ℝ ∘ₗ + (TensorProduct.mk ℝ ℂ GaugeJetAlgebra 1).comp (ofA μ) @[simp] -lemma gaugeField_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - gaugeField μ φ = (1 : ℂ) ⊗ₜ[ℝ] ofA μ φ := rfl +lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + gaugeField s μ φ = Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm s + ((1 : ℂ) ⊗ₜ[ℝ] ofA μ φ) := rfl /-! @@ -84,14 +87,26 @@ lemma gaugeField_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra -/ -/-- **The complexified gauge-boson jet algebra is a gauge field**: its generators are - Lorentz covectors, transform under the jet gauge group by the all-orders Leibniz - convolution of the adjoint Taylor coefficients plus the Maurer–Cartan shift, and the - gauge action is multiplicative. -/ +/-- **The complexified gauge-boson jet algebra is a gauge field**: its derivative symbols + are those of a Lorentz covector, transform under the jet gauge group by the all-orders + Leibniz convolution of the adjoint Taylor coefficients plus the Maurer–Cartan shift, and + the gauge action is multiplicative. -/ theorem isGaugeField : - IsGaugeField complexRepLorentzGroup complexRepJetGaugeGroupI gaugeField - complexJetDeriv complexJetDeriv_comm where - lorentz_apply Λ μ φ := complexRepLorentzGroup_one_tmul_ofA Λ μ φ + IsGaugeField complexRepLorentzGroup complexRepJetGaugeGroupI gaugeField where + lorentz_apply Λ n l μ φ := by + calc complexRepLorentzGroup Λ (gaugeField (List.ofFn l) μ φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm (List.ofFn p) + (complexRepLorentzGroup Λ ((1 : ℂ) ⊗ₜ[ℝ] ofA μ φ)) := + Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn complexJetDeriv_comm Λ l + ((1 : ℂ) ⊗ₜ[ℝ] ofA μ φ) + _ = _ := by + refine Finset.sum_congr rfl fun p _ => ?_ + rw [complexRepLorentzGroup_one_tmul_ofA, map_sum] + refine congrArg (HSMul.hSMul _) (Finset.sum_congr rfl fun a _ => ?_) + rw [map_smul] + rfl gauge_apply_deriv U s μ φ := complexRepJetGaugeGroupI_iteratedD_one_tmul_ofA U s μ φ gauge_mul U b₁ b₂ := complexRepJetGaugeGroupI_apply_mul U b₁ b₂ @@ -117,15 +132,15 @@ theorem invariant_mem_adjoin_fieldStrength (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = Lorentz.iteratedD complexJetDeriv complexJetDeriv_comm p (gaugeField μ φ)} ∪ S)) + b = gaugeField p μ φ} ∪ S)) (hinv : ∀ U : JetGaugeGroupI, complexRepJetGaugeGroupI U x = x) : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = IsGaugeField.iteratedCovDerivAdjoint gaugeField complexJetDeriv l - (IsGaugeField.fieldStrength gaugeField complexJetDeriv ν lam) φ} ∪ S) := - IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField complexJetDeriv_mul - (fun p μ φ => Subring.mem_center_iff.mpr fun y => mul_comm _ _) + b = IsGaugeField.iteratedCovDerivAdjoint gaugeField l + (IsGaugeField.fieldStrength gaugeField ν lam) 0 φ} ∪ S) := + IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField + (fun _ _ _ => Subring.mem_center_iff.mpr fun _ => mul_comm _ _) S hS hx hinv end GaugeJetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean index 8e34e0414..aabe413ec 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -71,19 +71,20 @@ open TensorProduct Matrix MatrixGroups -/ -/-- The gauge-field generators of the jet algebra of the Standard Model: the gauge - sector's generators, included into the full algebra. -/ -noncomputable def gaugeField (μ : Fin 1 ⊕ Fin 3) : +/-- The gauge-field derivative symbols of the jet algebra of the Standard Model: the + gauge sector's symbols, included into the full algebra. -/ +noncomputable def gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] JetAlgebra where - toFun φ := includeGauge (GaugeJetAlgebra.gaugeField μ φ) + toFun φ := includeGauge (GaugeJetAlgebra.gaugeField s μ φ) map_add' φ ψ := by rw [map_add, map_add] map_smul' r φ := by - rw [map_smul, ← algebraMap_smul ℂ r (GaugeJetAlgebra.gaugeField μ φ), map_smul, + rw [map_smul, ← algebraMap_smul ℂ r (GaugeJetAlgebra.gaugeField s μ φ), map_smul, algebraMap_smul, RingHom.id_apply] @[simp] -lemma gaugeField_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - gaugeField μ φ = includeGauge (GaugeJetAlgebra.gaugeField μ φ) := rfl +lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + gaugeField s μ φ = includeGauge (GaugeJetAlgebra.gaugeField s μ φ) := rfl /-! @@ -124,28 +125,30 @@ lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : -/ /-- **The jet algebra of the Standard Model is a gauge field**: its gauge-field - generators are Lorentz covectors, transform under the jet gauge group by the - all-orders Leibniz convolution of the adjoint Taylor coefficients plus the - Maurer–Cartan shift, and the gauge action is multiplicative. All three laws transport - from the gauge sector through the central inclusion. -/ + derivative symbols are those of a Lorentz covector, transform under the jet gauge + group by the all-orders Leibniz convolution of the adjoint Taylor coefficients plus + the Maurer–Cartan shift, and the gauge action is multiplicative. All three laws + transport from the gauge sector through the central inclusion. -/ theorem isGaugeField : - IsGaugeField (B := JetAlgebra) repLorentzGroup repJetGaugeGroupI gaugeField jetDeriv - jetDeriv_comm where - lorentz_apply Λ μ φ := - (repLorentzGroup_includeGauge Λ (GaugeJetAlgebra.gaugeField μ φ)).trans <| - (congrArg includeGauge (GaugeJetAlgebra.isGaugeField.lorentz_apply Λ μ φ)).trans <| + IsGaugeField (B := JetAlgebra) repLorentzGroup repJetGaugeGroupI gaugeField where + lorentz_apply Λ n l μ φ := + (repLorentzGroup_includeGauge Λ + (GaugeJetAlgebra.gaugeField (List.ofFn l) μ φ)).trans <| + (congrArg includeGauge + (GaugeJetAlgebra.isGaugeField.lorentz_apply Λ n l μ φ)).trans <| (map_sum includeGauge _ Finset.univ).trans <| - Finset.sum_congr rfl fun a _ => map_smul includeGauge _ _ + Finset.sum_congr rfl fun p _ => + (map_smul includeGauge _ _).trans <| + congrArg (HSMul.hSMul _) <| + (map_sum includeGauge _ Finset.univ).trans <| + Finset.sum_congr rfl fun a _ => map_smul includeGauge _ _ gauge_apply_deriv U s μ φ := - (congrArg (fun z => repJetGaugeGroupI U z) - (iteratedD_includeGauge s (GaugeJetAlgebra.gaugeField μ φ))).trans <| (repJetGaugeGroupI_includeGauge U _).trans <| (congrArg includeGauge (GaugeJetAlgebra.isGaugeField.gauge_apply_deriv U s μ φ)).trans <| by rw [map_add, map_multiset_sum, Multiset.map_map, AlgHom.commutes] exact congrArg₂ (· + ·) - (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => - (iteratedD_includeGauge p.2 _).symm)) rfl + (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => rfl)) rfl gauge_mul U b₁ b₂ := repJetGaugeGroupI_apply_mul U b₁ b₂ /-! @@ -169,16 +172,15 @@ theorem invariant_mem_adjoin_fieldStrength (S : Set JetAlgebra) (hx : x ∈ Algebra.adjoin ℂ ({b : JetAlgebra | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = Lorentz.iteratedD jetDeriv jetDeriv_comm p (gaugeField μ φ)} ∪ S)) + b = gaugeField p μ φ} ∪ S)) (hinv : ∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) : x ∈ Algebra.adjoin ℂ ({b : JetAlgebra | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = IsGaugeField.iteratedCovDerivAdjoint gaugeField jetDeriv l - (IsGaugeField.fieldStrength gaugeField jetDeriv ν lam) φ} ∪ S) := - IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField jetDeriv_mul - (fun p μ φ => (iteratedD_includeGauge p (GaugeJetAlgebra.gaugeField μ φ)) ▸ - includeGauge_mem_center _) + b = IsGaugeField.iteratedCovDerivAdjoint gaugeField l + (IsGaugeField.fieldStrength gaugeField ν lam) 0 φ} ∪ S) := + IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField + (fun p μ φ => includeGauge_mem_center (GaugeJetAlgebra.gaugeField p μ φ)) S hS hx hinv end JetAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index d80315b9c..2ae0a2e3e 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -170,10 +170,9 @@ namespace IsGaugeField variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} -variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} -variable [Lorentz.IsLorentzDeriv repLorentz D] -variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} /-! @@ -215,13 +214,10 @@ noncomputable def repDualCoeff (rep : Representation ℂ JetGaugeGroupI (JetRing of the dual representation coefficients against lower derivative symbols, with no inhomogeneous term — the generalization of `TransformsInAdjoint` from the adjoint representation to an arbitrary one. -/ -def TransformsIn (_hA : IsGaugeField repLorentz repGauge A D D_comm) - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (F : Module.Dual ℝ V →ₗ[ℝ] B) : Prop := +def TransformsIn (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B) : Prop := ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℝ V) (s : Multiset (Fin 1 ⊕ Fin 3)), - repGauge U (Lorentz.iteratedD D D_comm s (F φ)) = - (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + repGauge U (F s φ) = (s.antidiagonal.map fun p => (F p.2 (repDualCoeff rep U⁻¹ p.1 φ))).sum /-! @@ -447,52 +443,24 @@ lemma actionFam_sum_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) | empty => simp [actionFam_zero_right] | cons g S ih => simp [actionFam_add_right, ih] -/-- With `D` a derivation, the one-step Leibniz rule for the action of families. -/ -lemma deriv_actionFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (κ : Fin 1 ⊕ Fin 3) - (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) - (φ : Module.Dual ℝ W) : - D κ (actionFam act f g φ) = - actionFam act ((D κ).restrictScalars ℝ ∘ₗ f) g φ + - actionFam act f ((D κ).restrictScalars ℝ ∘ₗ g) φ := by - have h := congrArg (fun z => dualPairEquivW z φ) - (tensorAction_map_left_derivation act ((D κ).restrictScalars ℝ) - (fun b₁ b₂ => hD κ b₁ b₂) (dualPairEquiv.symm f) (dualPairEquivW.symm g)) - simp only [map_add, LinearMap.add_apply, dualPairEquivW_map_left] at h - rw [← symm_comp_left, ← symm_comp_left_W] at h - exact h - -/-- The iterated Leibniz rule for the action of families: the iterated derivative of - `A · F` is the antidiagonal convolution of derived actions. -/ -lemma iteratedD_actionFam (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (s : Multiset (Fin 1 ⊕ Fin 3)) - (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) - (φ : Module.Dual ℝ W) : - Lorentz.iteratedD D D_comm s (actionFam act f g φ) = - (s.antidiagonal.map fun p => - actionFam act ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) - ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) φ).sum := by - induction s using Multiset.induction_on generalizing f g with - | empty => - simp [Lorentz.iteratedD_zero, Multiset.antidiagonal_zero, - show (LinearMap.id : B →ₗ[ℂ] B).restrictScalars ℝ = LinearMap.id from rfl] - | cons κ s ih => - rw [Lorentz.iteratedD_cons, LinearMap.comp_apply, ih f g, map_multiset_sum, - Multiset.map_map, - Multiset.map_congr rfl (fun p hp => by - rw [Function.comp_apply, deriv_actionFam hD κ, - show (D κ).restrictScalars ℝ ∘ₗ - ((Lorentz.iteratedD D D_comm p.1).restrictScalars ℝ ∘ₗ f) = - (Lorentz.iteratedD D D_comm (κ ::ₘ p.1)).restrictScalars ℝ ∘ₗ f from by - rw [Lorentz.iteratedD_cons]; rfl, - show (D κ).restrictScalars ℝ ∘ₗ - ((Lorentz.iteratedD D D_comm p.2).restrictScalars ℝ ∘ₗ g) = - (Lorentz.iteratedD D D_comm (κ ::ₘ p.2)).restrictScalars ℝ ∘ₗ g from by - rw [Lorentz.iteratedD_cons]; rfl]), - Multiset.sum_map_add] - simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, - Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] - abel +/-- **The derived action family** `A_ρ · F`: the `s`-derivative of the action of the + gauge field on a matter family, given by the Leibniz convolution of the derivative + symbols over the multiset antidiagonal — the matter analogue of `bracketFamConv`. + With the derivative symbols as primitives this convolution is the definition of the + derived action. -/ +noncomputable def actionFamConv + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (ρ : Fin 1 ⊕ Fin 3) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ W →ₗ[ℝ] B := + (s.antidiagonal.map fun p => actionFam act (A p.1 ρ) (F p.2)).sum + +/-- On the gauge algebra, the derived action family through the adjoint is the + derived bracket family. -/ +lemma actionFamConv_adAction + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + actionFamConv A adAction ρ F s = bracketFamConv A ρ F s := rfl set_option maxHeartbeats 1000000 in /-- The gauge transformation of the action of an affinely-transforming @@ -500,7 +468,7 @@ set_option maxHeartbeats 1000000 in the transformed families plus one `ad`-type cross term through `act`. This is `repGauge_bracketFam` with a homogeneous second slot and the bracket replaced by a general action. -/ -lemma repGauge_actionFam (hA : IsGaugeField repLorentz repGauge A D D_comm) +lemma repGauge_actionFam (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) {f f' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {g g' : Module.Dual ℝ W →ₗ[ℝ] B} {cf : GaugeAlgebra} (hf : ∀ ψ : Module.Dual ℝ GaugeAlgebra, @@ -551,34 +519,37 @@ lemma repGauge_actionFam (hA : IsGaugeField repLorentz repGauge A D D_comm) hread, hact', hπt'] rfl -/-- The covariant derivative of a `W`-indexed component family through the - infinitesimal action `act` of the gauge algebra on `W`: +/-- The covariant derivative of a `W`-indexed family of derivative symbols through + the infinitesimal action `act` of the gauge algebra on `W`: - `∇_ρ F = D_ρ F + A_ρ · F`, + `∇_ρ F = [∂_ρ F] + A_ρ · F`, - the total derivative plus the action of the gauge field on the value index. With - the physicists' factor of `i` absorbed into `act` (as it is in the gauge-algebra - bracket), this is `∂_ρ F + i A_ρ^a T_a F` in the `D = ∂ + i A` convention. For the - adjoint action it is `covDerivAdjoint` (`covDerivAction_ad`). -/ + the extra derivative on the symbol plus the derived action of the gauge field on + the value index. With the physicists' factor of `i` absorbed into `act` (as it is + in the gauge-algebra bracket), this is `∂_ρ F + i A_ρ^a T_a F` in the `D = ∂ + i A` + convention. For the adjoint action it is `covDerivAdjoint` + (`covDerivAction_adAction`). -/ noncomputable def covDerivAction - (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) : - Module.Dual ℝ W →ₗ[ℝ] B := - (D ρ).restrictScalars ℝ ∘ₗ F + actionFam act (A ρ) F + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ W →ₗ[ℝ] B := + F (ρ ::ₘ s) + actionFamConv A act ρ F s @[simp] -lemma covDerivAction_apply (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (ρ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ W) : - covDerivAction A act F D ρ φ = D ρ (F φ) + actionFam act (A ρ) F φ := rfl +lemma covDerivAction_apply + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W) : + covDerivAction A act F ρ s φ = F (ρ ::ₘ s) φ + actionFamConv A act ρ F s φ := rfl /-- Through the adjoint action, the general covariant derivative is the adjoint one. -/ -lemma covDerivAction_adAction (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) +lemma covDerivAction_adAction + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (ρ : Fin 1 ⊕ Fin 3) : - covDerivAction A adAction F D ρ = covDerivAdjoint A F D ρ := rfl + covDerivAction A adAction F ρ = covDerivAdjoint A F ρ := rfl /-! @@ -634,162 +605,170 @@ lemma actionFam_apply_mem {act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W} {P : rw [← algebraMap_smul ℂ] exact P.smul_mem (mul_mem (hf _) (hg _)) _ -/-- Iterated covariant derivatives along a list of directions. -/ -noncomputable def covDerivIter (A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) - (D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) (l : List (Fin 1 ⊕ Fin 3)) : - Module.Dual ℝ W →ₗ[ℝ] B := - l.foldr (fun ρ G => covDerivAction A act G D ρ) F +/-- Iterated covariant derivatives along a list of directions, as a family of + derivative symbols. -/ +noncomputable def covDerivIter + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) + (l : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B := + l.foldr (fun ρ G => covDerivAction A act G ρ) F @[simp] lemma covDerivIter_nil (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Module.Dual ℝ W →ₗ[ℝ] B) : covDerivIter A act F D [] = F := rfl + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) : + covDerivIter A act F [] = F := rfl @[simp] lemma covDerivIter_cons (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Module.Dual ℝ W →ₗ[ℝ] B) (ρ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) : - covDerivIter A act F D (ρ :: l) = - covDerivAction A act (covDerivIter A act F D l) D ρ := rfl - -/-- With `D` a derivation, `D` kills the scalars. -/ -lemma deriv_algebraMap_eq_zero (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) (κ : Fin 1 ⊕ Fin 3) (c : ℂ) : - D κ (algebraMap ℂ B c) = 0 := by - have h1 : D κ (1 : B) = 0 := by - have h := hD κ 1 1 - rw [one_mul, one_mul, mul_one] at h - have h2 : D κ (1 : B) + 0 = D κ (1 : B) + D κ (1 : B) := by rw [add_zero]; exact h - exact (add_left_cancel h2).symm - rw [Algebra.algebraMap_eq_smul_one, map_smul, h1, smul_zero] - -/-- A subalgebra generated by a `D`-stable set of generators is `D`-stable. -/ -lemma adjoin_deriv_mem {S : Set B} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - (hS : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ S, D κ x ∈ Algebra.adjoin ℂ S) - (κ : Fin 1 ⊕ Fin 3) {x : B} (hx : x ∈ Algebra.adjoin ℂ S) : - D κ x ∈ Algebra.adjoin ℂ S := by - induction hx using Algebra.adjoin_induction with - | mem y hy => exact hS κ y hy - | algebraMap c => - rw [deriv_algebraMap_eq_zero hD κ c] + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) : + covDerivIter A act F (ρ :: l) = covDerivAction A act (covDerivIter A act F l) ρ := rfl + +/-- **Unitriangularity of the covariant matter tower**: the covariant and plain + derivative symbols of a matter family differ by an element of the subalgebra + generated by the gauge-field symbols and the strictly lower-order matter symbols. + Stated at every derivative multiset `s`, as needed for the induction. -/ +lemma covDerivIter_sub_mem (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) + (l : List (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W) : + covDerivIter A act F l s φ - F (Multiset.ofList l + s) φ ∈ + Algebra.adjoin ℂ + ({b : B | ∃ (u : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A u μ ψ} ∪ + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ W), + t.card < l.length + s.card ∧ b = F t χ}) := by + induction l generalizing s φ with + | nil => + simp only [covDerivIter_nil, + show (Multiset.ofList ([] : List (Fin 1 ⊕ Fin 3))) = 0 from rfl, zero_add, + sub_self] exact zero_mem _ - | add y z hy hz ihy ihz => - rw [map_add] - exact add_mem ihy ihz - | mul y z hy hz ihy ihz => - rw [hD κ y z] - exact add_mem (mul_mem ihy hz) (mul_mem hy ihz) - -/-- A subalgebra generated by a `D`-stable set of generators is stable under - iterated derivatives. -/ -lemma adjoin_iteratedD_mem {S : Set B} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - (hS : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ S, D κ x ∈ Algebra.adjoin ℂ S) - (s : Multiset (Fin 1 ⊕ Fin 3)) {x : B} (hx : x ∈ Algebra.adjoin ℂ S) : - Lorentz.iteratedD D D_comm s x ∈ Algebra.adjoin ℂ S := by - induction s using Multiset.induction_on with - | empty => rw [Lorentz.iteratedD_zero]; exact hx - | cons κ t ih => - rw [Lorentz.iteratedD_cons, LinearMap.comp_apply] - exact adjoin_deriv_mem hD hS κ ih - -set_option maxHeartbeats 1000000 in -/-- **The span lemma**: the algebra of symbols generated by the gauge field with its - derivatives together with a matter family with its *derivatives* equals the one - generated by the gauge field with its derivatives together with the matter family - with its *covariant* derivatives. The correction `∇_ρ − ∂_ρ` is the action of the - gauge field — a sum of products of symbols, absorbed by the algebra structure. -/ -theorem adjoin_iteratedD_eq_adjoin_covDerivIter - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), - D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (F : Module.Dual ℝ W →ₗ[ℝ] B) : + | cons ρ l ih => + have hmono : ∀ {n m : ℕ}, n ≤ m → + Algebra.adjoin ℂ + ({b : B | ∃ u μ ψ, b = A u μ ψ} ∪ + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ W), + t.card < n ∧ b = F t χ}) ≤ + Algebra.adjoin ℂ + ({b : B | ∃ u μ ψ, b = A u μ ψ} ∪ + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ W), + t.card < m ∧ b = F t χ}) := by + intro n m hnm + refine Algebra.adjoin_mono (Set.union_subset_union_right _ ?_) + rintro b ⟨t, χ, ht, rfl⟩ + exact ⟨t, χ, by omega, rfl⟩ + have hms : Multiset.ofList (ρ :: l) + s = Multiset.ofList l + (ρ ::ₘ s) := by + rw [show Multiset.ofList (ρ :: l) = ρ ::ₘ Multiset.ofList l from rfl, + Multiset.cons_add, Multiset.add_cons] + have hsplit : covDerivIter A act F (ρ :: l) s φ - + F (Multiset.ofList (ρ :: l) + s) φ = + (covDerivIter A act F l (ρ ::ₘ s) φ - + F (Multiset.ofList l + (ρ ::ₘ s)) φ) + + actionFamConv A act ρ (covDerivIter A act F l) s φ := by + rw [show covDerivIter A act F (ρ :: l) s φ = + covDerivIter A act F l (ρ ::ₘ s) φ + + actionFamConv A act ρ (covDerivIter A act F l) s φ + from rfl, hms] + abel + rw [hsplit] + refine add_mem ?_ ?_ + · refine hmono ?_ (ih (ρ ::ₘ s) φ) + simp only [List.length_cons, Multiset.card_cons] + omega + · rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle := Multiset.mem_antidiagonal.mp hp + have h2 : p.2.card ≤ s.card := + hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) + refine actionFam_apply_mem (fun ψ => ?_) (fun χ => ?_) _ + · exact Algebra.subset_adjoin (Or.inl ⟨p.1, ρ, ψ, rfl⟩) + · have h3 : covDerivIter A act F l p.2 χ = + (covDerivIter A act F l p.2 χ - F (Multiset.ofList l + p.2) χ) + + F (Multiset.ofList l + p.2) χ := by abel + rw [h3] + refine add_mem (hmono ?_ (ih p.2 χ)) ?_ + · simp only [List.length_cons] + omega + · refine Algebra.subset_adjoin (Or.inr ⟨Multiset.ofList l + p.2, χ, ?_, rfl⟩) + simp only [Multiset.card_add, Multiset.coe_card, List.length_cons] + omega + +/-- **The span lemma**: the algebra of symbols generated by the gauge field together + with a matter family's *derivative* symbols equals the one generated by the gauge + field together with the matter family's *covariant* derivative tower. The + correction `∇_ρ − ∂_ρ` is the derived action of the gauge field — a sum of products + of symbols, absorbed by the algebra structure. -/ +theorem adjoin_symbols_eq_adjoin_covDerivIter (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) : Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), - b = Lorentz.iteratedD D D_comm s (F φ)}) = + b = F s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), - b = covDerivIter A act F D l φ}) := by - have hA0 : ∀ (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), - A μ ψ = Lorentz.iteratedD D D_comm 0 (A μ ψ) := fun μ ψ => by - rw [Lorentz.iteratedD_zero]; rfl - have hDA : ∀ (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (y : B), - D κ (Lorentz.iteratedD D D_comm s y) = - Lorentz.iteratedD D D_comm (κ ::ₘ s) y := fun κ s y => by - rw [Lorentz.iteratedD_cons]; rfl - -- `D`-stability of the generators on the covariant side - have hS₂ : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ l φ, b = covDerivIter A act F D l φ}), - D κ x ∈ Algebra.adjoin ℂ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := by - rintro κ x (⟨s, μ, ψ, rfl⟩ | ⟨l, φ, rfl⟩) - · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨κ ::ₘ s, μ, ψ, hDA κ s _⟩) - · have hsplit : D κ (covDerivIter A act F D l φ) = - covDerivIter A act F D (κ :: l) φ - - actionFam act (A κ) (covDerivIter A act F D l) φ := by - rw [covDerivIter_cons, covDerivAction_apply] - abel - rw [hsplit] - have hmem₁ : covDerivIter A act F D (κ :: l) φ ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := - Set.mem_union_right _ ⟨κ :: l, φ, rfl⟩ - have hmemA : ∀ ψ' : Module.Dual ℝ GaugeAlgebra, A κ ψ' ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := - fun ψ' => Set.mem_union_left _ ⟨0, κ, ψ', hA0 κ ψ'⟩ - have hmemC : ∀ χ : Module.Dual ℝ W, covDerivIter A act F D l χ ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := - fun χ => Set.mem_union_right _ ⟨l, χ, rfl⟩ - exact sub_mem (Algebra.subset_adjoin hmem₁) - (actionFam_apply_mem (fun ψ' => Algebra.subset_adjoin (hmemA ψ')) - (fun χ => Algebra.subset_adjoin (hmemC χ)) φ) - -- `D`-stability of the generators on the derivative side - have hS₁ : ∀ (κ : Fin 1 ⊕ Fin 3), ∀ x ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}), - D κ x ∈ Algebra.adjoin ℂ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}) := by - rintro κ x (⟨s, μ, ψ, rfl⟩ | ⟨s, φ, rfl⟩) - · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨κ ::ₘ s, μ, ψ, hDA κ s _⟩) - · exact Algebra.subset_adjoin (Set.mem_union_right _ ⟨κ ::ₘ s, φ, hDA κ s _⟩) + b = covDerivIter A act F l 0 φ}) := by refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨s, φ, rfl⟩) - · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨s, μ, ψ, rfl⟩) - · refine adjoin_iteratedD_mem hD hS₂ s ?_ - have hmem : F φ ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ l φ, b = covDerivIter A act F D l φ}) := - Set.mem_union_right _ ⟨[], φ, by rw [covDerivIter_nil]⟩ - exact Algebra.subset_adjoin hmem + · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) + · -- express a matter symbol through the covariant tower, by strong induction on + -- the order + have main : ∀ n, ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + s.card ≤ n → + F s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + b = covDerivIter A act F l 0 φ}) := by + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro s φ hs + set l := s.toList with hl' + have hl : Multiset.ofList l = s := Multiset.coe_toList _ + have hlen : l.length = s.card := by rw [← Multiset.coe_card, hl] + rw [show F s φ = covDerivIter A act F l 0 φ - + (covDerivIter A act F l 0 φ - F (Multiset.ofList l + 0) φ) from by + rw [add_zero, hl]; abel] + refine sub_mem (Algebra.subset_adjoin (Or.inr ⟨l, φ, rfl⟩)) ?_ + refine SetLike.le_def.mp (Algebra.adjoin_le ?_) + (covDerivIter_sub_mem act F l 0 φ) + rintro b (⟨u, μ, ψ, rfl⟩ | ⟨t, χ, htc, rfl⟩) + · exact Algebra.subset_adjoin (Or.inl ⟨u, μ, ψ, rfl⟩) + · have htn : t.card < n := by + simp only [Multiset.card_zero] at htc + omega + exact ih t.card htn t χ (le_refl _) + exact main s.card s φ (le_refl _) · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨l, φ, rfl⟩) - · exact Algebra.subset_adjoin (Set.mem_union_left _ ⟨s, μ, ψ, rfl⟩) - · induction l generalizing φ with - | nil => - have hmem : covDerivIter A act F D [] φ ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}) := - Set.mem_union_right _ - ⟨0, φ, by rw [Lorentz.iteratedD_zero, covDerivIter_nil]; rfl⟩ - exact Algebra.subset_adjoin hmem - | cons κ l ih => - rw [covDerivIter_cons, covDerivAction_apply] - have hmemA : ∀ ψ' : Module.Dual ℝ GaugeAlgebra, A κ ψ' ∈ - ({b : B | ∃ s μ ψ, b = Lorentz.iteratedD D D_comm s (A μ ψ)} ∪ - {b : B | ∃ s φ, b = Lorentz.iteratedD D D_comm s (F φ)}) := - fun ψ' => Set.mem_union_left _ ⟨0, κ, ψ', hA0 κ ψ'⟩ - exact add_mem (adjoin_deriv_mem hD hS₁ κ (ih φ)) - (actionFam_apply_mem (fun ψ' => Algebra.subset_adjoin (hmemA ψ')) - (fun χ => ih χ) φ) + · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) + · -- the covariant tower consists of symbol polynomials + have main : ∀ (l : List (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ W), + covDerivIter A act F l s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + b = F s φ}) := by + intro l + induction l with + | nil => exact fun s φ => Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩) + | cons ρ l ih => + intro s φ + rw [covDerivIter_cons, covDerivAction_apply] + refine add_mem (ih (ρ ::ₘ s) φ) ?_ + rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + refine actionFam_apply_mem (fun ψ' => ?_) (fun χ => ?_) _ + · exact Algebra.subset_adjoin (Or.inl ⟨p.1, ρ, ψ', rfl⟩) + · exact ih p.2 χ + exact main l 0 φ end Action diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean index a260df9d8..f29d00a56 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean @@ -45,10 +45,7 @@ namespace IsGaugeField variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} -variable {A : (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} -variable {D : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B} -variable [Lorentz.IsLorentzDeriv repLorentz D] -variable {D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} /-! @@ -152,39 +149,39 @@ lemma IsInfinitesimalActionOf.actionFam_repDualCoeff rw [← symm_comp_right, ← symm_comp_right_W] rfl + omit [FiniteDimensional ℝ V] in /-- If `F` transforms in `rep`, so do its `κ ::ₘ s`-derived symbols, with the extra derivative traced through `IsInfinitesimalActionOf.repDualCoeff_cons`: the Leibniz splittings where `κ` stays a derivative, minus the convolution where `κ` hits the representation — `act` of the derived Maurer–Cartan form. -/ -lemma TransformsIn.repGauge_iteratedD_cons - {hA : IsGaugeField repLorentz repGauge A D D_comm} - {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) +lemma TransformsIn.repGauge_cons + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B} + (hF : TransformsIn (repGauge := repGauge) rep F) (hact : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ V) : - repGauge U (Lorentz.iteratedD D D_comm (κ ::ₘ s) (F φ)) = + repGauge U (F (κ ::ₘ s) φ) = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (κ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + F (κ ::ₘ p.2) (repDualCoeff rep U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + F p.2 (repDualCoeff rep U⁻¹ q.2 (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + (maurerCartanForm U⁻¹ κ)))))).sum).sum := by rw [hF U φ (κ ::ₘ s)] simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] - have hsec : (Multiset.map (fun p => Lorentz.iteratedD D D_comm p.2 - (F (repDualCoeff rep U⁻¹ (κ ::ₘ p.1) φ))) s.antidiagonal).sum = + have hsec : (Multiset.map (fun p => + F p.2 (repDualCoeff rep U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = -(s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + F p.2 (repDualCoeff rep U⁻¹ q.2 (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ))))))).sum).sum := by + (maurerCartanForm U⁻¹ κ)))))).sum).sum := by rw [← Multiset.sum_map_neg''] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [hact.repDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_neg, map_multiset_sum, - Multiset.map_map, map_multiset_sum, Multiset.map_map] + rw [hact.repDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_multiset_sum, Multiset.map_map] exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) rw [hsec, sub_eq_add_neg] @@ -192,57 +189,47 @@ set_option maxHeartbeats 2000000 in /-- The all-orders gauge transformation of the derived action `A_ρ · F` for `F` transforming in `rep`: since `F` transforms homogeneously, only one cross-term convolution through `act` survives — the analogue of - `repGauge_iteratedD_commutator` with a matter field in the second slot. -/ -lemma TransformsIn.repGauge_iteratedD_action - {hA : IsGaugeField repLorentz repGauge A D D_comm} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + `TransformsInAdjoint.repGauge_bracketFamConv` with a matter field in the second + slot. -/ +lemma TransformsIn.repGauge_actionFamConv + (hA : IsGaugeField repLorentz repGauge A) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B} + (hF : TransformsIn (repGauge := repGauge) rep F) (hact : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ V) : - repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) = + repGauge U (actionFamConv A act ρ F s φ) = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F - (repDualCoeff rep U⁻¹ p.1 φ))).sum + actionFamConv A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + F r.2 (repDualCoeff rep U⁻¹ r.1 (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum := by + (maurerCartanForm U⁻¹ ρ)))))).sum).sum := by have hAlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ GaugeAlgebra), - repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ A ρ) ψ) = - ((u.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) ψ + repGauge U (A u ρ ψ) = + ((u.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ ρ)))) := by intro u ψ - show repGauge U (Lorentz.iteratedD D D_comm u (A ρ ψ)) = _ rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ V), - repGauge U (((Lorentz.iteratedD D D_comm u).restrictScalars ℝ ∘ₗ F) ψ) = - ((u.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1).sum) ψ := by + repGauge U (F u ψ) = + ((u.antidiagonal.map fun r => F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) ψ := by intro u ψ - show repGauge U (Lorentz.iteratedD D D_comm u (F ψ)) = _ rw [hF U ψ u, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 have hMa : (s.antidiagonal.map fun p => actionFam act ((p.1.antidiagonal.map fun q => - (Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1).sum) + A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1).sum) φ).sum = + F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) φ).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - actionFam act ((Lorentz.iteratedD D D_comm q.2).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1) φ).sum).sum).sum := by + actionFam act (A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1) φ).sum).sum).sum := by refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) rw [actionFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map] @@ -253,104 +240,86 @@ lemma TransformsIn.repGauge_iteratedD_action refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) simp only [Function.comp_apply] have hMc : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F - (repDualCoeff rep U⁻¹ p.1 φ))).sum = + actionFamConv A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - actionFam act ((Lorentz.iteratedD D D_comm r.1).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ q.1) - ((Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ q.2) φ).sum).sum).sum := by + actionFam act (A r.1 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ repDualCoeff rep U⁻¹ q.2) φ).sum).sum).sum := by refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [hact.actionFam_repDualCoeff U⁻¹ p.1 (A ρ) F φ, map_multiset_sum, - Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) - simp only [Function.comp_apply] - rw [iteratedD_actionFam hD p.2 (A ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) - (F ∘ₗ repDualCoeff rep U⁻¹ q.2) φ] + rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_congr rfl (fun r hr => by + rw [Function.comp_apply, + hact.actionFam_repDualCoeff U⁻¹ p.1 (A r.1 ρ) (F r.2) φ]), + Multiset.sum_map_sum_map] have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => - actionFam act ((Lorentz.iteratedD D D_comm b).restrictScalars ℝ ∘ₗ A ρ ∘ₗ - adjointDualCoeff U⁻¹ a) - ((Lorentz.iteratedD D D_comm d).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ c) φ).trans hMc.symm) + actionFam act (A b ρ ∘ₗ adjointDualCoeff U⁻¹ a) + (F d ∘ₗ repDualCoeff rep U⁻¹ c) φ).trans hMc.symm) have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), - ((p.2.antidiagonal.map fun r => - (Lorentz.iteratedD D D_comm r.2).restrictScalars ℝ ∘ₗ F ∘ₗ - repDualCoeff rep U⁻¹ r.1).sum) + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + F r.2 (repDualCoeff rep U⁻¹ r.1 (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum := by + (maurerCartanForm U⁻¹ ρ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) - simp only [Function.comp_apply, LinearMap.coe_comp, LinearMap.restrictScalars_apply] - rw [iteratedD_actionFam hD s (A ρ) F φ, map_multiset_sum, Multiset.map_map, + simp only [Function.comp_apply, LinearMap.coe_comp] + rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, map_multiset_sum, + Multiset.map_map, Multiset.map_congr rfl (fun p hp => by - rw [Function.comp_apply, repGauge_actionFam hA U (hAlaw p.1) (hFlaw p.2) φ, - hCg p]), + rw [Function.comp_apply, Function.comp_apply, + repGauge_actionFam hA U (hAlaw p.1) (hFlaw p.2) φ, hCg p]), Multiset.sum_map_add, hM] set_option maxHeartbeats 2000000 in /-- **The covariant derivative preserves `TransformsIn`**: if `F` transforms in the representation `rep` and `act` is the infinitesimal action underlying `rep`, then - `∇_ρ F = D_ρ F + A_ρ · F` transforms in `rep`. The single inhomogeneous - convolution of `∂_{ρ ::ₘ s} F` cancels the single `act` cross-term convolution of + `∇_ρ F = [∂_ρ F] + A_ρ · F` transforms in `rep`. The single inhomogeneous + convolution of `[∂_{ρ ::ₘ s} F]` cancels the single `act` cross-term convolution of `A_ρ · F` through the coassociativity of the antidiagonal — the matter-field analogue of `TransformsInAdjoint.covDerivAdjoint`. -/ theorem TransformsIn.covDerivAction - {hA : IsGaugeField repLorentz repGauge A D D_comm} - (hD : ∀ (κ : Fin 1 ⊕ Fin 3) (b₁ b₂ : B), D κ (b₁ * b₂) = D κ b₁ * b₂ + b₁ * D κ b₂) - {F : Module.Dual ℝ V →ₗ[ℝ] B} (hF : hA.TransformsIn rep F) + (hA : IsGaugeField repLorentz repGauge A) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B} + (hF : TransformsIn (repGauge := repGauge) rep F) (hact : IsInfinitesimalActionOf act rep) (ρ : Fin 1 ⊕ Fin 3) : - hA.TransformsIn rep (covDerivAction A act F D ρ) := by + TransformsIn (repGauge := repGauge) rep (IsGaugeField.covDerivAction A act F ρ) := by intro U φ s - have hDcomp : ∀ (κ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)) (b : B), - Lorentz.iteratedD D D_comm t (D κ b) = Lorentz.iteratedD D D_comm (κ ::ₘ t) b := by - intro κ t b - rw [show (κ ::ₘ t : Multiset (Fin 1 ⊕ Fin 3)) = t + {κ} from by - rw [add_comm, Multiset.singleton_add], - Lorentz.iteratedD_add, LinearMap.comp_apply] - congr 1 - have hL : repGauge U (Lorentz.iteratedD D D_comm s - (IsGaugeField.covDerivAction A act F D ρ φ)) = - repGauge U (Lorentz.iteratedD D D_comm (ρ ::ₘ s) (F φ)) - + repGauge U (Lorentz.iteratedD D D_comm s (actionFam act (A ρ) F φ)) := by - rw [covDerivAction_apply, map_add, hDcomp ρ s, map_add] + have hL : repGauge U (IsGaugeField.covDerivAction A act F ρ s φ) = + repGauge U (F (ρ ::ₘ s) φ) + repGauge U (actionFamConv A act ρ F s φ) := by + rw [covDerivAction_apply, map_add] have hR : (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (IsGaugeField.covDerivAction A act F D ρ - (repDualCoeff rep U⁻¹ p.1 φ))).sum = + IsGaugeField.covDerivAction A act F ρ p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm (ρ ::ₘ p.2) (F (repDualCoeff rep U⁻¹ p.1 φ))).sum + F (ρ ::ₘ p.2) (repDualCoeff rep U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - Lorentz.iteratedD D D_comm p.2 (actionFam act (A ρ) F - (repDualCoeff rep U⁻¹ p.1 φ))).sum := by + actionFamConv A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum := by rw [← Multiset.sum_map_add] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [covDerivAction_apply, map_add, hDcomp ρ p.2] + rw [covDerivAction_apply] have hcancel : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - Lorentz.iteratedD D D_comm p.2 (F (repDualCoeff rep U⁻¹ q.2 + F p.2 (repDualCoeff rep U⁻¹ q.2 (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum = + (maurerCartanForm U⁻¹ ρ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - Lorentz.iteratedD D D_comm r.2 (F (repDualCoeff rep U⁻¹ r.1 + F r.2 (repDualCoeff rep U⁻¹ r.1 (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ))))))).sum).sum := + (maurerCartanForm U⁻¹ ρ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => - Lorentz.iteratedD D D_comm c (F (repDualCoeff rep U⁻¹ b + F c (repDualCoeff rep U⁻¹ b (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv a - (maurerCartanForm U⁻¹ ρ))))))) - rw [hL, hF.repGauge_iteratedD_cons hact U ρ s φ, - hF.repGauge_iteratedD_action hD hact U s ρ φ, hR, hcancel] + (maurerCartanForm U⁻¹ ρ)))))) + rw [hL, hF.repGauge_cons hact U ρ s φ, hF.repGauge_actionFamConv hA hact U s ρ φ, + hR, hcancel] abel end MatterCovariance end IsGaugeField -end StandardModel +end StandardModel \ No newline at end of file diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index bc164141f..955e2c4f6 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -127,6 +127,68 @@ variable {rep : Representation ℂ SL(2,ℂ) A} {D : (Fin 1 ⊕ Fin 3) → A → /-- The scalar action of a real parameter, in the form the weight condition presents it. -/ private lemma algebraMap_real_complex (t : ℝ) : (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) := rfl +/-- **The Lorentz transformation of iterated derivatives**: for a Lorentz derivative the + ordered derivative symbol `D_{l 0} ⋯ D_{l (n-1)} x` mixes into all tuples of + directions, with one Lorentz matrix factor per slot. -/ +lemma rep_iteratedD_ofFn [IsLorentzDeriv rep D] + (D_comm : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (x : A) : + rep Λ (iteratedD D D_comm (List.ofFn l) x) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + iteratedD D D_comm (List.ofFn p) (rep Λ x) := by + induction n with + | zero => + rw [List.ofFn_zero, + show ((([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) = 0) from rfl, + iteratedD_zero, Fintype.sum_unique] + simp [List.ofFn_zero, iteratedD_zero] + | succ n ih => + have hstep : ∀ (a : Fin 1 ⊕ Fin 3) (p : Fin n → (Fin 1 ⊕ Fin 3)), + ((List.ofFn (Fin.cons a p) : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) = + a ::ₘ ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) := by + intro a p + rw [List.ofFn_succ] + simp only [Fin.cons_zero, Fin.cons_succ] + rfl + calc rep Λ (iteratedD D D_comm (List.ofFn l) x) + = ∑ a, (((SL2C.toLorentzGroup Λ).1 a (l 0) : ℝ) : ℂ) • + D a (rep Λ (iteratedD D D_comm + (List.ofFn fun i : Fin n => l i.succ) x)) := by + rw [show ((List.ofFn l : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) = + l 0 ::ₘ ((List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) from by rw [List.ofFn_succ]; rfl, + iteratedD_cons, LinearMap.comp_apply, rep_deriv] + _ = ∑ a, ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + ((((SL2C.toLorentzGroup Λ).1 a (l 0) : ℝ) : ℂ) * + ∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + iteratedD D D_comm (a ::ₘ ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3))) (rep Λ x) := by + refine Finset.sum_congr rfl fun a _ => ?_ + rw [ih (fun i => l i.succ), map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, smul_smul, iteratedD_cons, LinearMap.comp_apply] + _ = ∑ p : Fin (n + 1) → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + iteratedD D D_comm (List.ofFn p) (rep Λ x) := by + rw [← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => (Fin 1 ⊕ Fin 3)) + (fun p : Fin (n + 1) → (Fin 1 ⊕ Fin 3) => + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + iteratedD D D_comm (List.ofFn p) (rep Λ x)), + Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun p _ => ?_ + show ((((SL2C.toLorentzGroup Λ).1 a (l 0) : ℝ) : ℂ) * + ∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + iteratedD D D_comm (a ::ₘ ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3))) (rep Λ x) = + (∏ i, (((SL2C.toLorentzGroup Λ).1 + ((Fin.cons a p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) i) (l i) : ℝ) : ℂ)) • + iteratedD D D_comm + (List.ofFn (Fin.cons a p : Fin (n + 1) → (Fin 1 ⊕ Fin 3))) (rep Λ x) + rw [Fin.prod_univ_succ, hstep a p] + simp only [Fin.cons_zero, Fin.cons_succ] + /-! ## A. Light cone derivatives From e873f068ebc9dbe54d43925287299e2b7a888fdf Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 11:28:35 +0100 Subject: [PATCH 217/254] feat: Add covariant derivative part for Down singlets --- .../StandardModel/Fermions/DownSinglet.lean | 60 +- .../StandardModel/IsStandardModel/Basic.lean | 255 +++++++- .../JetComponentSpace/CovariantDeriv.lean | 608 +++++++++--------- .../InfinitesimalAction.lean | 70 +- Physlib/Relativity/IsLorentzDeriv.lean | 19 + 5 files changed, 614 insertions(+), 398 deletions(-) diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 33fc14b0f..cd90e6846 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -382,18 +382,19 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ : Complex.I • (c.toSU3Matrix - ((2 : ℂ) • c.toU1Value) • 1) /-- **The infinitesimal action of the gauge algebra on the down-type singlet**: the - derivative of the `(3, 1)_{-2}` action of the gauge group, as a real-bilinear action - of the gauge algebra. -/ + derivative of the `(3, 1)_{-2}` action of the gauge group, real-linear in the + algebra slot and complex-linear in the value slot — the form consumed by the + covariant derivative `IsGaugeField.covDerivIter` and by + `IsGaugeField.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : - GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℝ] DownSinglet where - toFun c := (colourEnd (actionMatrix c)).restrictScalars ℝ + GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℂ] DownSinglet where + toFun c := colourEnd (actionMatrix c) map_add' c₁ c₂ := by rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU3Matrix, GaugeAlgebra.add_toU1Value] module] rw [colourEnd_add] - rfl map_smul' r c := by rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU3Matrix, @@ -901,34 +902,20 @@ private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : | empty => rfl | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] -private lemma restrictScalars_multiset_sum - (m : Multiset (DownSinglet →ₗ[ℂ] DownSinglet)) : - LinearMap.restrictScalars ℝ m.sum - = (m.map (LinearMap.restrictScalars ℝ)).sum := by - induction m using Multiset.induction_on with - | empty => rfl - | cons f t ih => - rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, ← ih] - rfl - set_option maxHeartbeats 1000000 in /-- **The base-point Taylor coefficients of the jet gauge action** on the down-type singlet are the colour endomorphisms of the base-point Taylor coefficients of the colour matrix. -/ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : IsGaugeField.repCoeff repJetGaugeGroupI U x - = (colourEnd ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))).restrictScalars ℝ := by + = colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by refine LinearMap.ext fun d => ?_ apply valLinEquiv.injective rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x d = StandardModel.jetEval (StandardModel.jetIteratedDeriv x (repJetGaugeGroupI U (StandardModel.jetOfConstant d))) from rfl, valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, - show (LinearMap.restrictScalars ℝ (colourEnd ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) d - = colourEnd ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) d from rfl, colourEnd_apply_mk, LinearEquiv.apply_symm_apply, repJetGaugeGroupI_eq_downMatrix, LinearEquiv.apply_symm_apply, StandardModel.jetOfConstant_apply] @@ -1018,24 +1005,10 @@ theorem isInfinitesimalActionOf : matrix_constantCoeff_foldl_pderiv_mul] exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by rw [jetActionMatrix_map_cc_foldl])) - rw [repCoeff_eq, hMcons, colourEnd_neg, colourEnd_multiset_sum, Multiset.map_map, - show LinearMap.restrictScalars ℝ - (-((x.antidiagonal.map (colourEnd ∘ fun p => - actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U μ))) - * ((downMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f)))).sum)) - = -(LinearMap.restrictScalars ℝ - ((x.antidiagonal.map (colourEnd ∘ fun p => - actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U μ))) - * ((downMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f)))).sum)) from - rfl, - restrictScalars_multiset_sum, Multiset.map_map] + rw [repCoeff_eq, hMcons, colourEnd_neg, colourEnd_multiset_sum, Multiset.map_map] refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_)) - rw [Function.comp_apply, Function.comp_apply, colourEnd_mul, repCoeff_eq] + rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] rfl · intro U x c have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by @@ -1092,17 +1065,16 @@ theorem isInfinitesimalActionOf : (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) = IsGaugeField.adjointCoeff U p.1 c from rfl]) rw [repCoeff_eq, - show ((colourEnd ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))).restrictScalars ℝ) + show (colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) ∘ₗ gaugeAlgebraAction c - = (colourEnd (((downMatrix U).map fun f => + = colourEnd (((downMatrix U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) - * actionMatrix c)).restrictScalars ℝ from by + * actionMatrix c) from by rw [colourEnd_mul]; rfl, - hMact, colourEnd_multiset_sum, Multiset.map_map, restrictScalars_multiset_sum, - Multiset.map_map] + hMact, colourEnd_multiset_sum, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [Function.comp_apply, Function.comp_apply, colourEnd_mul, repCoeff_eq] + rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] rfl end InfinitesimalAction diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index 750b2d16b..fecd84c57 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -21,6 +21,10 @@ public import Physlib.Particles.StandardModel.Fermions.UpSinglet public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps @@ -28,7 +32,11 @@ public import Mathlib.RepresentationTheory.Invariants /-! # The algebra valued Standard model -This contains +The basic idea here is to just reduce things +down to the covariant version. +In the covariant version we will do the work with +the invariants. + -/ @[expose] public section @@ -37,9 +45,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -TODO "Move IsGaugeField.TransformsIn out of the `IsGaugeField` namespac." - -structure IsStandardModel (B : Type*) [Semiring B] [Algebra ℂ B] +structure IsStandardModel (B : Type) [Ring B] [Algebra ℂ B] -- The representations (repJet : Representation ℂ JetGaugeGroupI B) (repLorentz : Representation ℂ SL(2,ℂ) B) -- The mass weights @@ -65,7 +71,244 @@ structure IsStandardModel (B : Type*) [Semiring B] [Algebra ℂ B] (e : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B) (bare : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B) : Prop where - -- The action of the Gauge group on L - -- repJet_L : IsGaugeField.TransformsIn repJet L + -- *Gauge transformation* + -- The gauge field transforms as a gauge field: Lorentz covector symbols, the + -- all-orders adjoint Leibniz convolution with the Maurer–Cartan shift, and a + -- multiplicative gauge action + repJet_A : IsGaugeField repLorentz repJet A + -- The Higgs field and its conjugate transform in the Higgs representation + repJet_H : TransformsIn repJet HiggsVec.repJetGaugeGroupI H + repJet_barH : TransformsIn repJet (repConj HiggsVec.repJetGaugeGroupI) barH + -- The down-type quarks and their conjugates transform in the down-singlet + -- representation + repJet_d : ∀ i, TransformsIn repJet DownSinglet.repJetGaugeGroupI (d i) + repJet_bard : ∀ i, TransformsIn repJet (repConj DownSinglet.repJetGaugeGroupI) (bard i) + -- The up-type quarks and their conjugates transform in the up-singlet representation + repJet_u : ∀ i, TransformsIn repJet UpSinglet.repJetGaugeGroupI (u i) + repJet_baru : ∀ i, TransformsIn repJet (repConj UpSinglet.repJetGaugeGroupI) (baru i) + -- The quark doublets and their conjugates transform in the quark-doublet + -- representation + repJet_Q : ∀ i, TransformsIn repJet QuarkDoublet.repJetGaugeGroupI (Q i) + repJet_barQ : ∀ i, TransformsIn repJet (repConj QuarkDoublet.repJetGaugeGroupI) (barQ i) + -- The lepton doublets and their conjugates transform in the lepton-doublet + -- representation + repJet_L : ∀ i, TransformsIn repJet LeptonDoublet.repJetGaugeGroupI (L i) + repJet_barL : ∀ i, TransformsIn repJet (repConj LeptonDoublet.repJetGaugeGroupI) (barL i) + -- The lepton singlets and their conjugates transform in the lepton-singlet + -- representation + repJet_e : ∀ i, TransformsIn repJet LeptonSinglet.repJetGaugeGroupI (e i) + repJet_bare : ∀ i, TransformsIn repJet (repConj LeptonSinglet.repJetGaugeGroupI) (bare i) + -- *The Lorentz transformation* + -- The Lorentz transformations: the derivative slots of every field mix by per-slot + -- Lorentz matrices, the value index by the contragredient of the species' Lorentz + -- representation — the Higgs is a scalar, the fermions are Weyl spinors, and the + -- barred fields carry the conjugate representations + repLorentz_H : IsLorentzDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) H + repLorentz_barH : IsLorentzDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj barH + repLorentz_d : ∀ i, IsLorentzDerivTransforms repLorentz + DownSinglet.repLorentzGroup (d i) + repLorentz_bard : ∀ i, IsLorentzDerivTransforms repLorentz + DownSinglet.repLorentzGroup.conj (bard i) + repLorentz_u : ∀ i, IsLorentzDerivTransforms repLorentz + UpSinglet.repLorentzGroup (u i) + repLorentz_baru : ∀ i, IsLorentzDerivTransforms repLorentz + UpSinglet.repLorentzGroup.conj (baru i) + repLorentz_Q : ∀ i, IsLorentzDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup (Q i) + repLorentz_barQ : ∀ i, IsLorentzDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup.conj (barQ i) + repLorentz_L : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup (L i) + repLorentz_barL : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup.conj (barL i) + repLorentz_e : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup (e i) + repLorentz_bare : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup.conj (bare i) + -- **Mass weights (= 2 * mass dimension)** + -- Every derivative symbol is a `massWeightPoly`-eigenvector of pure monomial weight: + -- the bosons have mass dimension `1 + |s|` (weight `2 * (1 + |s|)`), the fermions + -- mass dimension `3/2 + |s|` (weight `3 + 2 * |s|`) + massWeight_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (H s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (H s φ) + massWeight_barH : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (barH s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (barH s φ) + massWeight_A : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) μ φ, + massWeightPoly (A s μ φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (A s μ φ) + massWeight_d : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (d i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (d i s φ) + massWeight_bard : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (bard i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (bard i s φ) + massWeight_u : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (u i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (u i s φ) + massWeight_baru : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (baru i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (baru i s φ) + massWeight_Q : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (Q i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (Q i s φ) + massWeight_barQ : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (barQ i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (barQ i s φ) + massWeight_L : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (L i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (L i s φ) + massWeight_barL : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (barL i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (barL i s φ) + massWeight_e : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (e i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (e i s φ) + massWeight_bare : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (bare i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (bare i s φ) + +set_option linter.unusedVariables false +namespace IsStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) + + +/-! + +## A. The field algebra + +-/ + +/-- The algebra generated by all the fields of the Standard Model and their derivative + symbols: the gauge field, the Higgs and its conjugate, and the three families of each + fermion species with their conjugates. -/ +def fieldAlgebra (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare): Subalgebra ℂ B := + Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ + (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (d i s) ∪ Set.range (bard i s) ∪ + Set.range (u i s) ∪ Set.range (baru i s) ∪ + Set.range (Q i s) ∪ Set.range (barQ i s) ∪ + Set.range (L i s) ∪ Set.range (barL i s) ∪ + Set.range (e i s) ∪ Set.range (bare i s))) + +/-! + +## B. Covariant derivatives + +-/ + +include h in +noncomputable def covDerivD (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] B := + IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) n l 0 + + +lemma fieldAlgebra_eq_covDerivD : + h.fieldAlgebra = Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), Set.range (h.covDerivD i l)) ∪ + (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (bard i s) ∪ + Set.range (u i s) ∪ Set.range (baru i s) ∪ + Set.range (Q i s) ∪ Set.range (barQ i s) ∪ + Set.range (L i s) ∪ Set.range (barL i s) ∪ + Set.range (e i s) ∪ Set.range (bare i s))) := by + -- the span lemma, per family + have hAT : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet), + b = d i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet), + b = IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) + n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + DownSinglet.gaugeAlgebraAction (d i) + -- the down symbols lie in the covariant-tower algebra + have hdmem : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet), + d i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l)) ∪ + (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (bard i s) ∪ + Set.range (u i s) ∪ Set.range (baru i s) ∪ + Set.range (Q i s) ∪ Set.range (barQ i s) ∪ + Set.range (L i s) ∪ Set.range (barL i s) ∪ + Set.range (e i s) ∪ Set.range (bare i s))) := by + intro i s φ + have h1 : d i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet), + b = IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) + n l 0 φ}) := + (hAT i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩))) + · exact Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ⟨φ', rfl⟩⟩⟩⟩)) + refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) + · rintro b (hAH | hbF) + · exact Algebra.subset_adjoin (Or.inl (Or.inl hAH)) + · simp only [Set.mem_iUnion] at hbF + obtain ⟨i, s, hbF⟩ := hbF + by_cases hd : b ∈ Set.range (d i s) + · obtain ⟨φ, rfl⟩ := hd + exact hdmem i s φ + · refine Algebra.subset_adjoin (Or.inr (Set.mem_iUnion.mpr ⟨i, + Set.mem_iUnion.mpr ⟨s, ?_⟩⟩)) + simp only [Set.mem_union] at hbF ⊢ + tauto + · rintro b ((hAH | hT) | hbF) + · exact Algebra.subset_adjoin (Or.inl hAH) + · simp only [Set.mem_iUnion, Set.mem_range] at hT + obtain ⟨i, n, l, φ, rfl⟩ := hT + have h1 : IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) + n l 0 φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet), b = d i s φ}) := + (hAT i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : d i s' φ' ∈ Set.range (d i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · simp only [Set.mem_iUnion] at hbF + obtain ⟨i, s, hbF⟩ := hbF + refine Algebra.subset_adjoin (Or.inr (Set.mem_iUnion.mpr ⟨i, + Set.mem_iUnion.mpr ⟨s, ?_⟩⟩)) + simp only [Set.mem_union] at hbF ⊢ + tauto +end IsStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index 2ae0a2e3e..8a172cf74 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -190,81 +190,83 @@ noncomputable def adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin lemma adjointDualCoeff_eq_dualMap (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : adjointDualCoeff U x = (adjointCoeff U x).dualMap := rfl -/-- The physicists' `∂_x (rep U)^i_j|₀`, un-dualized: include the constant vector - into `V`-valued jets, act by `rep U`, differentiate `x` times, evaluate at the base - point — the base-point Taylor coefficient of the representation, as a real-linear - map on the value space. -/ +/-- The base-point Taylor coefficient of the representation: include the constant + vector into `V`-valued jets, act by `rep U`, differentiate `x` times, evaluate at + the base point. The composite is complex-linear: the physicists' + `∂_x (rep U)^i_j|₀` as a ℂ-linear map on the value space. -/ noncomputable def repCoeff (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : V →ₗ[ℝ] V := - (jetEval ∘ₗ jetIteratedDeriv x ∘ₗ rep U ∘ₗ jetOfConstant).restrictScalars ℝ - -/-- The physicists' `∂_x (rep U)^i_j|₀` acting on the dual index of a matter-field - symbol: the transpose of `repCoeff`. This is the analogue of `adjointDualCoeff` - for a general representation of the jet gauge group; for `x = 0` it is the dual - (contragredient) action of the value of `U`, and for `x ≠ 0` it sees the - derivatives of the gauge transformation. -/ + (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : V →ₗ[ℂ] V := + jetEval ∘ₗ jetIteratedDeriv x ∘ₗ rep U ∘ₗ jetOfConstant + +/-- The physicists' `∂_x (rep U)^i_j|₀` acting on the complex dual index of a + matter-field symbol: the transpose of `repCoeff`. This is the analogue of + `adjointDualCoeff` for a general representation of the jet gauge group; for `x = 0` + it is the dual (contragredient) action of the value of `U`, and for `x ≠ 0` it sees + the derivatives of the gauge transformation. -/ noncomputable def repDualCoeff (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - Module.Dual ℝ V →ₗ[ℝ] Module.Dual ℝ V := + Module.Dual ℂ V →ₗ[ℂ] Module.Dual ℂ V := (repCoeff rep U x).dualMap -/-- A component family `F`, with values in `B` and index in the dual of the +/-- A component family `F`, valued in `B` and indexed by the complex dual of the representation space `V`, *transforms in* the representation `rep` of the jet gauge - group when each derivative symbol `[∂_s F^φ]` transforms by the Leibniz convolution - of the dual representation coefficients against lower derivative symbols, with no - inhomogeneous term — the generalization of `TransformsInAdjoint` from the adjoint - representation to an arbitrary one. -/ -def TransformsIn (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B) : Prop := - ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℝ V) (s : Multiset (Fin 1 ⊕ Fin 3)), - repGauge U (F s φ) = (s.antidiagonal.map fun p => (F p.2 (repDualCoeff rep U⁻¹ p.1 φ))).sum + group — with the ambient action `repGauge` on `B` — when each derivative symbol + `[∂_s F^φ]` transforms by the Leibniz convolution of the dual representation + coefficients against lower symbols, with no inhomogeneous term — the generalization + of `TransformsInAdjoint` from the adjoint representation to an arbitrary one, and + the form consumed by `IsStandardModel`. -/ +def _root_.StandardModel.TransformsIn (repGauge : Representation ℂ JetGaugeGroupI B) + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : Prop := + ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)), + repGauge U (F s φ) = + (s.antidiagonal.map fun p => F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum /-! ## The covariant derivative through an infinitesimal action +The covariant derivative `∇_ρ F = [∂_ρ F] + A_ρ · F` requires the *infinitesimal* +action of the gauge algebra on the value space — physicists' `i dρ(T^a)` — which +cannot be extracted from the abstract group representation `rep` (there is no +differentiable structure to differentiate it). It is therefore taken as data: an +action `act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V`, real-linear in the algebra slot (the +gauge algebra is a real Lie algebra) and complex-linear in the value slot, matching +the complex duals indexing the matter families. + -/ section Action -variable {W : Type} [AddCommGroup W] [Module ℝ W] - -/-- The action of an adjoint-valued field on a `W`-valued field at the tensor level: - multiplication in `B` on the first factors, the infinitesimal action `act` of the - gauge algebra on `W` on the second, so that on pure tensors - `(b₁ ⊗ c) · (b₂ ⊗ w) = (b₁ b₂) ⊗ act c w`. For `W` the gauge algebra and `act` the - adjoint action this is `tensorBracket` (`tensorAction_ad`). -/ -noncomputable def tensorAction (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) : - (B ⊗[ℝ] GaugeAlgebra) →ₗ[ℝ] (B ⊗[ℝ] W) →ₗ[ℝ] B ⊗[ℝ] W := - TensorProduct.curry - ((TensorProduct.map (TensorProduct.lift (LinearMap.mul ℝ B)) - (TensorProduct.lift act)) ∘ₗ - (TensorProduct.tensorTensorTensorComm ℝ B GaugeAlgebra B W).toLinearMap) - -@[simp] -lemma tensorAction_tmul (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (b₁ b₂ : B) - (c : GaugeAlgebra) (w : W) : - tensorAction act (b₁ ⊗ₜ[ℝ] c) (b₂ ⊗ₜ[ℝ] w) = (b₁ * b₂) ⊗ₜ[ℝ] act c w := by - simp [tensorAction, TensorProduct.tensorTensorTensorComm_tmul] - -/-- The gauge-algebra bracket as a bilinear map — the infinitesimal adjoint - action. -/ -noncomputable def adAction : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra →ₗ[ℝ] GaugeAlgebra := - LinearMap.mk₂ ℝ (fun a b => ⁅a, b⁆) (fun a a' b => add_lie a a' b) - (fun t a b => smul_lie t a b) (fun a b b' => lie_add a b b') - (fun t a b => lie_smul t a b) +variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} + +/-- The action of an adjoint-valued field on a matter field at the tensor level: + multiplication in `B` on the first factors, the ℂ-linear infinitesimal action `act` + of the gauge algebra on `V` on the second, so that on pure tensors + `(b₁ ⊗ c) · (b₂ ⊗ v) = (b₁ b₂) ⊗ act c v`. -/ +noncomputable def tensorAction (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) : + (B ⊗[ℝ] GaugeAlgebra) →ₗ[ℝ] (B ⊗[ℂ] V) →ₗ[ℂ] B ⊗[ℂ] V := + TensorProduct.lift + { toFun := fun b₁ => + { toFun := fun c => TensorProduct.map (LinearMap.mulLeft ℂ b₁) (act c) + map_add' := fun c₁ c₂ => TensorProduct.ext' fun b₂ v => by + simp [TensorProduct.tmul_add] + map_smul' := fun r c => TensorProduct.ext' fun b₂ v => by + simp [TensorProduct.tmul_smul] } + map_add' := fun b₁ b₁' => LinearMap.ext fun c => TensorProduct.ext' fun b₂ v => by + simp [add_mul, TensorProduct.add_tmul] + map_smul' := fun r b₁ => LinearMap.ext fun c => TensorProduct.ext' fun b₂ v => by + simp [TensorProduct.smul_tmul'] } @[simp] -lemma adAction_apply (a b : GaugeAlgebra) : adAction a b = ⁅a, b⁆ := rfl +lemma tensorAction_tmul (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (b₁ b₂ : B) + (c : GaugeAlgebra) (v : V) : + tensorAction act (b₁ ⊗ₜ[ℝ] c) (b₂ ⊗ₜ[ℂ] v) = (b₁ * b₂) ⊗ₜ[ℂ] act c v := rfl -/-- On the gauge algebra, the tensor action through the adjoint is the tensor - bracket. -/ -lemma tensorAction_adAction : tensorAction (B := B) adAction = tensorBracket := rfl - -lemma tensorAction_map_left (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (Φ : B →ₗ[ℝ] B) +lemma tensorAction_map_left (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (Φ : B →ₗ[ℂ] B) (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) (s : B ⊗[ℝ] GaugeAlgebra) - (t : B ⊗[ℝ] W) : - tensorAction act ((TensorProduct.map Φ LinearMap.id) s) + (t : B ⊗[ℂ] V) : + tensorAction act ((TensorProduct.map (Φ.restrictScalars ℝ) LinearMap.id) s) ((TensorProduct.map Φ LinearMap.id) t) = (TensorProduct.map Φ LinearMap.id) (tensorAction act s t) := by induction s using TensorProduct.induction_on with @@ -278,8 +280,8 @@ lemma tensorAction_map_left (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (Φ rw [hx, hy] | add x y hx hy => simp [hx, hy] -lemma tensorAction_one_left (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (c : GaugeAlgebra) - (t : B ⊗[ℝ] W) : +lemma tensorAction_one_left (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (c : GaugeAlgebra) + (t : B ⊗[ℂ] V) : tensorAction act ((1 : B) ⊗ₜ[ℝ] c) t = (TensorProduct.map LinearMap.id (act c)) t := by induction t using TensorProduct.induction_on with @@ -287,36 +289,15 @@ lemma tensorAction_one_left (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (c | tmul b a => simp | add x y hx hy => simp [hx, hy] -/-- `tensorAction` is a derivation in the algebra factor: for `Δ` satisfying the - Leibniz rule on `B`, applying `Δ ⊗ id` distributes over the two arguments. -/ -lemma tensorAction_map_left_derivation (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (Δ : B →ₗ[ℝ] B) (hΔ : ∀ b₁ b₂, Δ (b₁ * b₂) = Δ b₁ * b₂ + b₁ * Δ b₂) - (s : B ⊗[ℝ] GaugeAlgebra) (t : B ⊗[ℝ] W) : - (TensorProduct.map Δ LinearMap.id) (tensorAction act s t) = - tensorAction act ((TensorProduct.map Δ LinearMap.id) s) t + - tensorAction act s ((TensorProduct.map Δ LinearMap.id) t) := by - induction s using TensorProduct.induction_on with - | zero => simp - | tmul b₁ a₁ => - induction t using TensorProduct.induction_on with - | zero => simp - | tmul b₂ a₂ => simp [hΔ, TensorProduct.add_tmul] - | add x y hx hy => - simp only [map_add, hx, hy] - abel - | add x y hx hy => - simp only [map_add, LinearMap.add_apply, hx, hy] - abel - /-- `tensorAction` under an antidiagonal pair of transport families: if the - `W`-transports intertwine `act` with the `GaugeAlgebra`-transports as an + `V`-transports intertwine `act` with the `GaugeAlgebra`-transports as an antidiagonal convolution, so do `id ⊗ ·` over `tensorAction`. -/ -lemma tensorAction_map_right_antidiagonal (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) +lemma tensorAction_map_right_antidiagonal (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (Tg : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) - (Tv : Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[ℝ] W) (x : Multiset (Fin 1 ⊕ Fin 3)) - (hT : ∀ (c : GaugeAlgebra) (w : W), Tv x (act c w) = + (Tv : Multiset (Fin 1 ⊕ Fin 3) → V →ₗ[ℂ] V) (x : Multiset (Fin 1 ⊕ Fin 3)) + (hT : ∀ (c : GaugeAlgebra) (w : V), Tv x (act c w) = (x.antidiagonal.map fun p => act (Tg p.1 c) (Tv p.2 w)).sum) - (s : B ⊗[ℝ] GaugeAlgebra) (t : B ⊗[ℝ] W) : + (s : B ⊗[ℝ] GaugeAlgebra) (t : B ⊗[ℂ] V) : (x.antidiagonal.map fun p => tensorAction act ((TensorProduct.map LinearMap.id (Tg p.1)) s) ((TensorProduct.map LinearMap.id (Tv p.2)) t)).sum = @@ -339,89 +320,77 @@ lemma tensorAction_map_right_antidiagonal (act : GaugeAlgebra →ₗ[ℝ] W → rw [map_add, map_add, LinearMap.add_apply]), Multiset.sum_map_add, hy, hz, ← map_add, ← LinearMap.add_apply, ← map_add] -variable [FiniteDimensional ℝ W] +variable [FiniteDimensional ℂ V] -/-- The canonical equivalence between `W`-valued fields `B ⊗ W` and their component - families `φ ↦ F^φ` — `dualPairEquiv` for a general finite-dimensional value - space. -/ -noncomputable def dualPairEquivW : (B ⊗[ℝ] W) ≃ₗ[ℝ] (Module.Dual ℝ W →ₗ[ℝ] B) := - TensorProduct.comm ℝ B W ≪≫ₗ - TensorProduct.congr (Module.evalEquiv ℝ W) (LinearEquiv.refl ℝ B) ≪≫ₗ - dualTensorHomEquiv ℝ (Module.Dual ℝ W) B +/-- The canonical equivalence between matter fields `B ⊗[ℂ] V` and their component + families `φ ↦ F^φ` over the complex dual — `dualPairEquiv` for a general + finite-dimensional complex value space. -/ +noncomputable def dualPairEquivC : (B ⊗[ℂ] V) ≃ₗ[ℂ] (Module.Dual ℂ V →ₗ[ℂ] B) := + TensorProduct.comm ℂ B V ≪≫ₗ + TensorProduct.congr (Module.evalEquiv ℂ V) (LinearEquiv.refl ℂ B) ≪≫ₗ + dualTensorHomEquiv ℂ (Module.Dual ℂ V) B @[simp] -lemma dualPairEquivW_tmul (b : B) (w : W) (φ : Module.Dual ℝ W) : - dualPairEquivW (b ⊗ₜ[ℝ] w) φ = φ w • b := by - simp [dualPairEquivW, dualTensorHomEquiv, Module.evalEquiv_apply] - -/-- On the gauge algebra, `dualPairEquivW` is `dualPairEquiv`. -/ -lemma dualPairEquivW_gaugeAlgebra : - (dualPairEquivW : (B ⊗[ℝ] GaugeAlgebra) ≃ₗ[ℝ] _) = dualPairEquiv := rfl - -lemma dualPairEquivW_map_left (Φ : B →ₗ[ℝ] B) (t : B ⊗[ℝ] W) - (φ : Module.Dual ℝ W) : - dualPairEquivW ((TensorProduct.map Φ LinearMap.id) t) φ = - Φ (dualPairEquivW t φ) := by +lemma dualPairEquivC_tmul (b : B) (v : V) (φ : Module.Dual ℂ V) : + dualPairEquivC (b ⊗ₜ[ℂ] v) φ = φ v • b := by + simp [dualPairEquivC, dualTensorHomEquiv, Module.evalEquiv_apply] + +lemma dualPairEquivC_map_left (Φ : B →ₗ[ℂ] B) (t : B ⊗[ℂ] V) + (φ : Module.Dual ℂ V) : + dualPairEquivC ((TensorProduct.map Φ LinearMap.id) t) φ = + Φ (dualPairEquivC t φ) := by induction t using TensorProduct.induction_on with | zero => simp | tmul b w => simp | add x y hx hy => simp [hx, hy] -lemma dualPairEquivW_map_right (T : W →ₗ[ℝ] W) (t : B ⊗[ℝ] W) - (φ : Module.Dual ℝ W) : - dualPairEquivW ((TensorProduct.map LinearMap.id T) t) φ = - dualPairEquivW t (T.dualMap φ) := by +lemma dualPairEquivC_map_right (T : V →ₗ[ℂ] V) (t : B ⊗[ℂ] V) + (φ : Module.Dual ℂ V) : + dualPairEquivC ((TensorProduct.map LinearMap.id T) t) φ = + dualPairEquivC t (T.dualMap φ) := by induction t using TensorProduct.induction_on with | zero => simp | tmul b w => simp | add x y hx hy => simp [hx, hy] -lemma symm_comp_left_W (Φ : B →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) : - dualPairEquivW.symm (Φ ∘ₗ g) = - (TensorProduct.map Φ LinearMap.id) (dualPairEquivW.symm g) := by - apply dualPairEquivW.injective +lemma symm_comp_left_C (Φ : B →ₗ[ℂ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) : + dualPairEquivC.symm (Φ ∘ₗ g) = + (TensorProduct.map Φ LinearMap.id) (dualPairEquivC.symm g) := by + apply dualPairEquivC.injective rw [LinearEquiv.apply_symm_apply] refine LinearMap.ext fun φ => ?_ - rw [dualPairEquivW_map_left, LinearEquiv.apply_symm_apply] + rw [dualPairEquivC_map_left, LinearEquiv.apply_symm_apply] rfl -lemma symm_comp_right_W (T : W →ₗ[ℝ] W) (g : Module.Dual ℝ W →ₗ[ℝ] B) : - dualPairEquivW.symm (g ∘ₗ T.dualMap) = - (TensorProduct.map LinearMap.id T) (dualPairEquivW.symm g) := by - apply dualPairEquivW.injective +lemma symm_comp_right_C (T : V →ₗ[ℂ] V) (g : Module.Dual ℂ V →ₗ[ℂ] B) : + dualPairEquivC.symm (g ∘ₗ T.dualMap) = + (TensorProduct.map LinearMap.id T) (dualPairEquivC.symm g) := by + apply dualPairEquivC.injective rw [LinearEquiv.apply_symm_apply] refine LinearMap.ext fun φ => ?_ - rw [dualPairEquivW_map_right, LinearEquiv.apply_symm_apply] + rw [dualPairEquivC_map_right, LinearEquiv.apply_symm_apply] rfl -/-- The action of an adjoint-indexed component family on a `W`-indexed one, through - the infinitesimal action `act`: assemble both into fields, act by `tensorAction`, - read back out as components. This is the physicists' `f^a (T_a)^i_j g^j` with - `T = act`, basis-free; for the adjoint action it is `bracketFam` - (`actionFam_ad`). -/ -noncomputable def actionFam (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℝ W →ₗ[ℝ] B) : - Module.Dual ℝ W →ₗ[ℝ] B := - dualPairEquivW (tensorAction act (dualPairEquiv.symm f) (dualPairEquivW.symm g)) - -/-- On the gauge algebra, the action family through the adjoint is the bracket - family. -/ -lemma actionFam_adAction (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : - actionFam adAction f g = bracketFam f g := rfl - -variable {act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W} +/-- The action of an adjoint-indexed component family on a matter one, through the + infinitesimal action `act`: assemble both into fields, act by `tensorAction`, read + back out as components. This is the physicists' `f^a (T_a)^i_j g^j` with `T = act`, + basis-free. -/ +noncomputable def actionFam (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) : + Module.Dual ℂ V →ₗ[ℂ] B := + dualPairEquivC (tensorAction act (dualPairEquiv.symm f) (dualPairEquivC.symm g)) lemma actionFam_add_left (f₁ f₂ : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (g : Module.Dual ℝ W →ₗ[ℝ] B) : + (g : Module.Dual ℂ V →ₗ[ℂ] B) : actionFam act (f₁ + f₂) g = actionFam act f₁ g + actionFam act f₂ g := by simp only [actionFam, map_add, LinearMap.add_apply] lemma actionFam_add_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (g₁ g₂ : Module.Dual ℝ W →ₗ[ℝ] B) : + (g₁ g₂ : Module.Dual ℂ V →ₗ[ℂ] B) : actionFam act f (g₁ + g₂) = actionFam act f g₁ + actionFam act f g₂ := by simp only [actionFam, map_add] -lemma actionFam_zero_left (g : Module.Dual ℝ W →ₗ[ℝ] B) : +lemma actionFam_zero_left (g : Module.Dual ℂ V →ₗ[ℂ] B) : actionFam act 0 g = 0 := by simp [actionFam] @@ -430,79 +399,60 @@ lemma actionFam_zero_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : simp [actionFam] lemma actionFam_sum_left (S : Multiset (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B)) - (g : Module.Dual ℝ W →ₗ[ℝ] B) : + (g : Module.Dual ℂ V →ₗ[ℂ] B) : actionFam act S.sum g = (S.map fun f => actionFam act f g).sum := by induction S using Multiset.induction_on with | empty => simp [actionFam_zero_left] | cons f S ih => simp [actionFam_add_left, ih] lemma actionFam_sum_right (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (S : Multiset (Module.Dual ℝ W →ₗ[ℝ] B)) : + (S : Multiset (Module.Dual ℂ V →ₗ[ℂ] B)) : actionFam act f S.sum = (S.map fun g => actionFam act f g).sum := by induction S using Multiset.induction_on with | empty => simp [actionFam_zero_right] | cons g S ih => simp [actionFam_add_right, ih] -/-- **The derived action family** `A_ρ · F`: the `s`-derivative of the action of the - gauge field on a matter family, given by the Leibniz convolution of the derivative - symbols over the multiset antidiagonal — the matter analogue of `bracketFamConv`. - With the derivative symbols as primitives this convolution is the definition of the - derived action. -/ -noncomputable def actionFamConv - (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) (ρ : Fin 1 ⊕ Fin 3) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) - (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ W →ₗ[ℝ] B := - (s.antidiagonal.map fun p => actionFam act (A p.1 ρ) (F p.2)).sum - -/-- On the gauge algebra, the derived action family through the adjoint is the - derived bracket family. -/ -lemma actionFamConv_adAction - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : - actionFamConv A adAction ρ F s = bracketFamConv A ρ F s := rfl - set_option maxHeartbeats 1000000 in /-- The gauge transformation of the action of an affinely-transforming - adjoint-indexed family on a linearly-transforming `W`-indexed family: the action of - the transformed families plus one `ad`-type cross term through `act`. This is - `repGauge_bracketFam` with a homogeneous second slot and the bracket replaced by - a general action. -/ + adjoint-indexed family on a linearly-transforming matter family: the action of the + transformed families plus one `act`-type cross term. This is `repGauge_bracketFam` + with a homogeneous second slot and the bracket replaced by a general action. -/ lemma repGauge_actionFam (hA : IsGaugeField repLorentz repGauge A) (U : JetGaugeGroupI) {f f' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} - {g g' : Module.Dual ℝ W →ₗ[ℝ] B} {cf : GaugeAlgebra} + {g g' : Module.Dual ℂ V →ₗ[ℂ] B} {cf : GaugeAlgebra} (hf : ∀ ψ : Module.Dual ℝ GaugeAlgebra, repGauge U (f ψ) = f' ψ + algebraMap ℂ B (ψ cf)) - (hg : ∀ ψ : Module.Dual ℝ W, repGauge U (g ψ) = g' ψ) - (φ : Module.Dual ℝ W) : + (hg : ∀ ψ : Module.Dual ℂ V, repGauge U (g ψ) = g' ψ) + (φ : Module.Dual ℂ V) : repGauge U (actionFam act f g φ) = actionFam act f' g' φ + g' (φ ∘ₗ act cf) := by - set Φ : B →ₗ[ℝ] B := (repGauge U).restrictScalars ℝ with hΦdef + set Φ : B →ₗ[ℂ] B := repGauge U with hΦdef have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => hA.gauge_mul U b₁ b₂ set s : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm f with hs - set t : B ⊗[ℝ] W := dualPairEquivW.symm g with ht + set t : B ⊗[ℂ] V := dualPairEquivC.symm g with ht set s' : B ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm f' with hs' - set t' : B ⊗[ℝ] W := dualPairEquivW.symm g' with ht' - have hfm : (TensorProduct.map Φ LinearMap.id) s = s' + (1 : B) ⊗ₜ[ℝ] cf := by + set t' : B ⊗[ℂ] V := dualPairEquivC.symm g' with ht' + have hfm : (TensorProduct.map (Φ.restrictScalars ℝ) LinearMap.id) s + = s' + (1 : B) ⊗ₜ[ℝ] cf := by rw [hs, hs', ← symm_comp_left, - show Φ ∘ₗ f = f' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cf) from + show Φ.restrictScalars ℝ ∘ₗ f = f' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cf) from LinearMap.ext fun ψ => by simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, LinearMap.restrictScalars_apply] rw [hf ψ, dualPairEquiv_one_tmul], map_add, LinearEquiv.symm_apply_apply] have hgm : (TensorProduct.map Φ LinearMap.id) t = t' := by - rw [ht, ht', ← symm_comp_left_W, + rw [ht, ht', ← symm_comp_left_C, show Φ ∘ₗ g = g' from LinearMap.ext fun ψ => by - simp only [LinearMap.comp_apply, hΦdef, LinearMap.restrictScalars_apply] + simp only [LinearMap.comp_apply, hΦdef] rw [hg ψ]] - have hact : dualPairEquivW (tensorAction act s t) = actionFam act f g := by + have hact : dualPairEquivC (tensorAction act s t) = actionFam act f g := by rw [hs, ht]; rfl - have hact' : dualPairEquivW (tensorAction act s' t') = actionFam act f' g' := by + have hact' : dualPairEquivC (tensorAction act s' t') = actionFam act f' g' := by rw [hs', ht']; rfl - have hπt' : dualPairEquivW t' = g' := by - rw [ht']; exact dualPairEquivW.apply_symm_apply _ + have hπt' : dualPairEquivC t' = g' := by + rw [ht']; exact dualPairEquivC.apply_symm_apply _ clear_value Φ s t s' t' have htensor : (TensorProduct.map Φ LinearMap.id) (tensorAction act s t) = tensorAction act s' t' @@ -510,46 +460,72 @@ lemma repGauge_actionFam (hA : IsGaugeField repLorentz repGauge A) refine (tensorAction_map_left act Φ hΦmul s t).symm.trans ((congrArg₂ (fun X Y => tensorAction act X Y) hfm hgm).trans ?_) rw [map_add, LinearMap.add_apply, tensorAction_one_left] - have hread := congrArg (fun z => dualPairEquivW z φ) htensor - simp only [map_add, LinearMap.add_apply, dualPairEquivW_map_left, - dualPairEquivW_map_right] at hread - rw [show repGauge U (actionFam act f g φ) = - Φ (dualPairEquivW (tensorAction act s t) φ) from by - rw [hact, hΦdef]; rfl, + have hread := congrArg (fun z => dualPairEquivC z φ) htensor + simp only [map_add, LinearMap.add_apply, dualPairEquivC_map_left, + dualPairEquivC_map_right] at hread + rw [show Φ (actionFam act f g φ) = + Φ (dualPairEquivC (tensorAction act s t) φ) from by rw [hact], hread, hact', hπt'] rfl -/-- The covariant derivative of a `W`-indexed family of derivative symbols through - the infinitesimal action `act` of the gauge algebra on `W`: - - `∇_ρ F = [∂_ρ F] + A_ρ · F`, +/-- The derived action family `A_ρ · F`: the `s`-derivative of the action of the + gauge field on a matter family, given by the Leibniz convolution of the derivative + symbols over the multiset antidiagonal — the matter analogue of `bracketFamConv`. -/ +noncomputable def actionFamConv + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (ρ : Fin 1 ⊕ Fin 3) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ V →ₗ[ℂ] B := + (s.antidiagonal.map fun p => actionFam act (A p.1 ρ) (F p.2)).sum - the extra derivative on the symbol plus the derived action of the gauge field on - the value index. With the physicists' factor of `i` absorbed into `act` (as it is - in the gauge-algebra bracket), this is `∂_ρ F + i A_ρ^a T_a F` in the `D = ∂ + i A` - convention. For the adjoint action it is `covDerivAdjoint` - (`covDerivAction_adAction`). -/ +/-- The covariant derivative `∇_ρ F = [∂_ρ F] + A_ρ · F` of a matter family of + derivative symbols, in the single direction `ρ`: the extra derivative on the symbol + plus the derived action of the gauge field on the value index. With the physicists' + factor of `i` absorbed into `act` (as it is in the gauge-algebra bracket), this is + `∂_ρ F + i A_ρ^a T_a F` in the `D = ∂ + i A` convention. -/ noncomputable def covDerivAction (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) - (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ W →ₗ[ℝ] B := + (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ V →ₗ[ℂ] B := F (ρ ::ₘ s) + actionFamConv A act ρ F s @[simp] lemma covDerivAction_apply (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) - (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W) : + (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : covDerivAction A act F ρ s φ = F (ρ ::ₘ s) φ + actionFamConv A act ρ F s φ := rfl -/-- Through the adjoint action, the general covariant derivative is the adjoint - one. -/ -lemma covDerivAction_adAction - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (ρ : Fin 1 ⊕ Fin 3) : - covDerivAction A adAction F ρ = covDerivAdjoint A F ρ := rfl +/-- **The iterated covariant derivative** `∇_{l 0} ⋯ ∇_{l (n-1)} F` of a matter family + along an ordered tuple of directions: covariant derivatives do not commute (their + commutator is the action of the field strength), so the iteration is order-dependent + and indexed by `(n : ℕ)` and `l : Fin n → (Fin 1 ⊕ Fin 3)` — the same ordered-tuple + indexing as the derivative labels of `IsHiggsAlgebraValued`. The result is again a + family of derivative symbols; the physical iterated covariant derivative is its + value at the empty multiset. -/ +noncomputable def covDerivIter + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : + (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → + Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B + | 0, _ => F + | n + 1, l => covDerivAction A act (covDerivIter A act F n fun i => l i.succ) (l 0) + +@[simp] +lemma covDerivIter_zero (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (l : Fin 0 → (Fin 1 ⊕ Fin 3)) : + covDerivIter A act F 0 l = F := rfl + +@[simp] +lemma covDerivIter_succ (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + {n : ℕ} (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) : + covDerivIter A act F (n + 1) l = + covDerivAction A act (covDerivIter A act F n fun i => l i.succ) (l 0) := rfl /-! @@ -563,17 +539,41 @@ which lies in the algebra generated by the symbols but not in their linear span. -/ -/-- Decomposition of an assembled family along a basis of the value space: the - components against the dual basis, tensored with the basis vectors. -/ -lemma dualPairEquivW_symm_eq_sum {ι : Type*} [Fintype ι] (bW : Module.Basis ι ℝ W) - (g : Module.Dual ℝ W →ₗ[ℝ] B) : - dualPairEquivW.symm g = ∑ i, g (bW.coord i) ⊗ₜ[ℝ] bW i := by - apply dualPairEquivW.injective +/-- Decomposition of an assembled adjoint-indexed family along a basis of the gauge + algebra: the components against the dual basis, tensored with the basis vectors. -/ +lemma dualPairEquiv_symm_eq_sum {ι : Type*} [Fintype ι] + (bW : Module.Basis ι ℝ GaugeAlgebra) + (g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + dualPairEquiv.symm g = ∑ i, g (bW.coord i) ⊗ₜ[ℝ] bW i := by + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + symm + rw [map_sum, LinearMap.sum_apply] + simp only [dualPairEquiv_tmul] + have hdual : (∑ i, φ (bW i) • bW.coord i) = φ := by + refine bW.ext fun j => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, + smul_eq_mul] + rw [Finset.sum_eq_single j + (fun i _ hij => by simp [Ne.symm hij]) + (fun h => absurd (Finset.mem_univ j) h)] + simp + calc ∑ i, φ (bW i) • g (bW.coord i) + = g (∑ i, φ (bW i) • bW.coord i) := by rw [map_sum]; simp + _ = g φ := by rw [hdual] + +/-- Decomposition of an assembled matter family along a basis of the value space. -/ +lemma dualPairEquivC_symm_eq_sum {ι : Type*} [Fintype ι] (bW : Module.Basis ι ℂ V) + (g : Module.Dual ℂ V →ₗ[ℂ] B) : + dualPairEquivC.symm g = ∑ i, g (bW.coord i) ⊗ₜ[ℂ] bW i := by + apply dualPairEquivC.injective rw [LinearEquiv.apply_symm_apply] refine LinearMap.ext fun φ => ?_ symm rw [map_sum, LinearMap.sum_apply] - simp only [dualPairEquivW_tmul] + simp only [dualPairEquivC_tmul] have hdual : (∑ i, φ (bW i) • bW.coord i) = φ := by refine bW.ext fun j => ?_ rw [LinearMap.sum_apply] @@ -589,93 +589,74 @@ lemma dualPairEquivW_symm_eq_sum {ι : Type*} [Fintype ι] (bW : Module.Basis ι /-- The value of an action of families lies in any subalgebra containing the values of both families: the action is a finite sum of products of components. -/ -lemma actionFam_apply_mem {act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W} {P : Subalgebra ℂ B} - {f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {g : Module.Dual ℝ W →ₗ[ℝ] B} - (hf : ∀ ψ, f ψ ∈ P) (hg : ∀ χ, g χ ∈ P) (φ : Module.Dual ℝ W) : +lemma actionFam_apply_mem {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} {P : Subalgebra ℂ B} + {f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {g : Module.Dual ℂ V →ₗ[ℂ] B} + (hf : ∀ ψ, f ψ ∈ P) (hg : ∀ χ, g χ ∈ P) (φ : Module.Dual ℂ V) : actionFam act f g φ ∈ P := by - rw [actionFam, - show dualPairEquiv.symm f = ∑ i, - f ((Module.finBasis ℝ GaugeAlgebra).coord i) ⊗ₜ[ℝ] - (Module.finBasis ℝ GaugeAlgebra) i from by - rw [← dualPairEquivW_gaugeAlgebra] - exact dualPairEquivW_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) f, - dualPairEquivW_symm_eq_sum (Module.finBasis ℝ W) g] - simp only [map_sum, LinearMap.sum_apply, tensorAction_tmul, dualPairEquivW_tmul] + rw [actionFam, dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) f, + dualPairEquivC_symm_eq_sum (Module.finBasis ℂ V) g] + simp only [map_sum, LinearMap.sum_apply, tensorAction_tmul, dualPairEquivC_tmul] refine sum_mem fun i _ => sum_mem fun j _ => ?_ - rw [← algebraMap_smul ℂ] exact P.smul_mem (mul_mem (hf _) (hg _)) _ -/-- Iterated covariant derivatives along a list of directions, as a family of - derivative symbols. -/ -noncomputable def covDerivIter - (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) - (l : List (Fin 1 ⊕ Fin 3)) : - Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B := - l.foldr (fun ρ G => covDerivAction A act G ρ) F - -@[simp] -lemma covDerivIter_nil (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) : - covDerivIter A act F [] = F := rfl - -@[simp] -lemma covDerivIter_cons (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) - (ρ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) : - covDerivIter A act F (ρ :: l) = covDerivAction A act (covDerivIter A act F l) ρ := rfl - /-- **Unitriangularity of the covariant matter tower**: the covariant and plain derivative symbols of a matter family differ by an element of the subalgebra generated by the gauge-field symbols and the strictly lower-order matter symbols. Stated at every derivative multiset `s`, as needed for the induction. -/ -lemma covDerivIter_sub_mem (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) - (l : List (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W) : - covDerivIter A act F l s φ - F (Multiset.ofList l + s) φ ∈ +lemma covDerivIter_sub_mem (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + covDerivIter A act F n l s φ - F (List.ofFn l + s) φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (u : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A u μ ψ} ∪ - {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ W), - t.card < l.length + s.card ∧ b = F t χ}) := by - induction l generalizing s φ with - | nil => - simp only [covDerivIter_nil, - show (Multiset.ofList ([] : List (Fin 1 ⊕ Fin 3))) = 0 from rfl, zero_add, - sub_self] + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + t.card < n + s.card ∧ b = F t χ}) := by + induction n generalizing s φ with + | zero => + simp only [covDerivIter_zero, List.ofFn_zero, + show ((([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) = 0) from rfl, + zero_add, sub_self] exact zero_mem _ - | cons ρ l ih => - have hmono : ∀ {n m : ℕ}, n ≤ m → + | succ n ih => + have hmono : ∀ {k m : ℕ}, k ≤ m → Algebra.adjoin ℂ ({b : B | ∃ u μ ψ, b = A u μ ψ} ∪ - {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ W), - t.card < n ∧ b = F t χ}) ≤ + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + t.card < k ∧ b = F t χ}) ≤ Algebra.adjoin ℂ ({b : B | ∃ u μ ψ, b = A u μ ψ} ∪ - {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ W), + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), t.card < m ∧ b = F t χ}) := by - intro n m hnm + intro k m hkm refine Algebra.adjoin_mono (Set.union_subset_union_right _ ?_) rintro b ⟨t, χ, ht, rfl⟩ exact ⟨t, χ, by omega, rfl⟩ - have hms : Multiset.ofList (ρ :: l) + s = Multiset.ofList l + (ρ ::ₘ s) := by - rw [show Multiset.ofList (ρ :: l) = ρ ::ₘ Multiset.ofList l from rfl, + have hms : ((List.ofFn l : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) + s = + ((List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) + (l 0 ::ₘ s) := by + rw [List.ofFn_succ, + show (((l 0 :: List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3))) : + Multiset (Fin 1 ⊕ Fin 3)) + = l 0 ::ₘ ((List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) from rfl, Multiset.cons_add, Multiset.add_cons] - have hsplit : covDerivIter A act F (ρ :: l) s φ - - F (Multiset.ofList (ρ :: l) + s) φ = - (covDerivIter A act F l (ρ ::ₘ s) φ - - F (Multiset.ofList l + (ρ ::ₘ s)) φ) + - actionFamConv A act ρ (covDerivIter A act F l) s φ := by - rw [show covDerivIter A act F (ρ :: l) s φ = - covDerivIter A act F l (ρ ::ₘ s) φ + - actionFamConv A act ρ (covDerivIter A act F l) s φ + have hsplit : covDerivIter A act F (n + 1) l s φ - + F (List.ofFn l + s) φ = + (covDerivIter A act F n (fun i => l i.succ) (l 0 ::ₘ s) φ - + F (List.ofFn (fun i : Fin n => l i.succ) + (l 0 ::ₘ s)) φ) + + actionFamConv A act (l 0) (covDerivIter A act F n fun i => l i.succ) s φ := by + rw [show covDerivIter A act F (n + 1) l s φ = + covDerivIter A act F n (fun i => l i.succ) (l 0 ::ₘ s) φ + + actionFamConv A act (l 0) + (covDerivIter A act F n fun i => l i.succ) s φ from rfl, hms] abel rw [hsplit] refine add_mem ?_ ?_ - · refine hmono ?_ (ih (ρ ::ₘ s) φ) - simp only [List.length_cons, Multiset.card_cons] + · refine hmono ?_ (ih (fun i => l i.succ) (l 0 ::ₘ s) φ) + simp only [Multiset.card_cons] omega · rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] refine multiset_sum_mem _ fun x hx => ?_ @@ -684,16 +665,17 @@ lemma covDerivIter_sub_mem (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) have h2 : p.2.card ≤ s.card := hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) refine actionFam_apply_mem (fun ψ => ?_) (fun χ => ?_) _ - · exact Algebra.subset_adjoin (Or.inl ⟨p.1, ρ, ψ, rfl⟩) - · have h3 : covDerivIter A act F l p.2 χ = - (covDerivIter A act F l p.2 χ - F (Multiset.ofList l + p.2) χ) + - F (Multiset.ofList l + p.2) χ := by abel + · exact Algebra.subset_adjoin (Or.inl ⟨p.1, l 0, ψ, rfl⟩) + · have h3 : covDerivIter A act F n (fun i => l i.succ) p.2 χ = + (covDerivIter A act F n (fun i => l i.succ) p.2 χ - + F (List.ofFn (fun i : Fin n => l i.succ) + p.2) χ) + + F (List.ofFn (fun i : Fin n => l i.succ) + p.2) χ := by abel rw [h3] - refine add_mem (hmono ?_ (ih p.2 χ)) ?_ - · simp only [List.length_cons] - omega - · refine Algebra.subset_adjoin (Or.inr ⟨Multiset.ofList l + p.2, χ, ?_, rfl⟩) - simp only [Multiset.card_add, Multiset.coe_card, List.length_cons] + refine add_mem (hmono ?_ (ih (fun i => l i.succ) p.2 χ)) ?_ + · omega + · refine Algebra.subset_adjoin + (Or.inr ⟨List.ofFn (fun i : Fin n => l i.succ) + p.2, χ, ?_, rfl⟩) + simp only [Multiset.card_add, Multiset.coe_card, List.length_ofFn] omega /-- **The span lemma**: the algebra of symbols generated by the gauge field together @@ -701,74 +683,76 @@ lemma covDerivIter_sub_mem (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) field together with the matter family's *covariant* derivative tower. The correction `∇_ρ − ∂_ρ` is the derived action of the gauge field — a sum of products of symbols, absorbed by the algebra structure. -/ -theorem adjoin_symbols_eq_adjoin_covDerivIter (act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W) - (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ W →ₗ[ℝ] B) : +theorem adjoin_symbols_eq_adjoin_covDerivIter (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), b = F s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), - b = covDerivIter A act F l 0 φ}) := by + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + b = covDerivIter A act F n l 0 φ}) := by refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨s, φ, rfl⟩) · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) · -- express a matter symbol through the covariant tower, by strong induction on -- the order - have main : ∀ n, ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + have main : ∀ n, ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), s.card ≤ n → F s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), - b = covDerivIter A act F l 0 φ}) := by + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + b = covDerivIter A act F n l 0 φ}) := by intro n induction n using Nat.strong_induction_on with | _ n ih => intro s φ hs - set l := s.toList with hl' - have hl : Multiset.ofList l = s := Multiset.coe_toList _ - have hlen : l.length = s.card := by rw [← Multiset.coe_card, hl] - rw [show F s φ = covDerivIter A act F l 0 φ - - (covDerivIter A act F l 0 φ - F (Multiset.ofList l + 0) φ) from by - rw [add_zero, hl]; abel] - refine sub_mem (Algebra.subset_adjoin (Or.inr ⟨l, φ, rfl⟩)) ?_ + set L := s.toList with hL' + have hL : Multiset.ofList L = s := Multiset.coe_toList _ + have hofFn : List.ofFn L.get = L := List.ofFn_get L + rw [show F s φ = covDerivIter A act F L.length L.get 0 φ - + (covDerivIter A act F L.length L.get 0 φ - + F (List.ofFn L.get + 0) φ) from by + rw [add_zero, hofFn, hL]; abel] + refine sub_mem (Algebra.subset_adjoin (Or.inr ⟨L.length, L.get, φ, rfl⟩)) ?_ refine SetLike.le_def.mp (Algebra.adjoin_le ?_) - (covDerivIter_sub_mem act F l 0 φ) + (covDerivIter_sub_mem act F L.length L.get 0 φ) rintro b (⟨u, μ, ψ, rfl⟩ | ⟨t, χ, htc, rfl⟩) · exact Algebra.subset_adjoin (Or.inl ⟨u, μ, ψ, rfl⟩) · have htn : t.card < n := by + have hlen : L.length = s.card := Multiset.length_toList s simp only [Multiset.card_zero] at htc omega exact ih t.card htn t χ (le_refl _) exact main s.card s φ (le_refl _) - · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨l, φ, rfl⟩) + · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨n, l, φ, rfl⟩) · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) · -- the covariant tower consists of symbol polynomials - have main : ∀ (l : List (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ W), - covDerivIter A act F l s φ ∈ Algebra.adjoin ℂ + have main : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + covDerivIter A act F n l s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ W), + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), b = F s φ}) := by - intro l - induction l with - | nil => exact fun s φ => Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩) - | cons ρ l ih => - intro s φ - rw [covDerivIter_cons, covDerivAction_apply] - refine add_mem (ih (ρ ::ₘ s) φ) ?_ + intro n + induction n with + | zero => exact fun l s φ => Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩) + | succ n ih => + intro l s φ + rw [covDerivIter_succ, covDerivAction_apply] + refine add_mem (ih (fun i => l i.succ) (l 0 ::ₘ s) φ) ?_ rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] refine multiset_sum_mem _ fun x hx => ?_ obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx refine actionFam_apply_mem (fun ψ' => ?_) (fun χ => ?_) _ - · exact Algebra.subset_adjoin (Or.inl ⟨p.1, ρ, ψ', rfl⟩) - · exact ih p.2 χ - exact main l 0 φ + · exact Algebra.subset_adjoin (Or.inl ⟨p.1, l 0, ψ', rfl⟩) + · exact ih (fun i => l i.succ) p.2 χ + exact main n l 0 φ end Action diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean index f29d00a56..f9d47cc0f 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean @@ -11,21 +11,20 @@ public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Covariant ## i. Overview -The covariant derivative `∇_ρ F = D_ρ F + A_ρ · F` of a matter family is built from an -`ℝ`-bilinear action `act` of the gauge algebra on the value space. For the covariant -derivative to transform covariantly, `act` must be the *infinitesimal action* underlying -the representation `rep` of the jet gauge group in which the family transforms — the -physicists' statement that the matrices `i dρ(T^a)` generate `ρ`. This file packages -that compatibility as the structure `IsInfinitesimalActionOf`, and proves the theorem it -exists for: the covariant derivative preserves the gauge tensors, -`TransformsIn.covDerivAction`. +The covariant derivative `∇_ρ F = [∂_ρ F] + A_ρ · F` of a matter family is built from +an action `act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V` of the gauge algebra on the value +space. For the covariant derivative to transform covariantly, `act` must be the +*infinitesimal action* underlying the representation `rep` of the jet gauge group in +which the family transforms — the physicists' statement that the matrices `i dρ(T^a)` +generate `ρ`. This file packages that compatibility as the structure +`IsInfinitesimalActionOf`, and proves the theorem it exists for: the covariant +derivative preserves the gauge tensors, `TransformsIn.covDerivAction`. ## ii. Key results - `IsGaugeField.IsInfinitesimalActionOf` : `act` is the infinitesimal action underlying `rep`. -- `IsGaugeField.TransformsIn.covDerivAction` : the covariant derivative preserves - `TransformsIn`. +- `TransformsIn.covDerivAction` : the covariant derivative preserves `TransformsIn`. ## iii. Table of contents @@ -69,7 +68,7 @@ variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual These are exactly the identities consumed by the proof that the covariant derivative `covDerivAction` preserves `TransformsIn`. -/ -structure IsInfinitesimalActionOf (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V) +structure IsInfinitesimalActionOf (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) : Prop where repCoeff_cons : ∀ (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)), @@ -87,10 +86,10 @@ structure IsInfinitesimalActionOf (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] minus the antidiagonal convolution of dual coefficients against `act` of the derived Maurer–Cartan form — the analogue of `adjointDualCoeff_cons`. -/ lemma IsInfinitesimalActionOf.repDualCoeff_cons - {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} + {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ V) : + (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : repDualCoeff rep U (μ ::ₘ x) φ = -((x.antidiagonal.map fun p => repDualCoeff rep U p.2 (φ ∘ₗ act (JetGaugeAlgebra.eval @@ -114,8 +113,8 @@ lemma IsInfinitesimalActionOf.repDualCoeff_cons section MatterCovariance variable {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} -variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℝ] V} -variable [FiniteDimensional ℝ V] +variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} +variable [FiniteDimensional ℂ V] /-- The action of families against the dual representation coefficients: the antidiagonal convolution mixing the adjoint transport on the field slot with the @@ -125,7 +124,7 @@ variable [FiniteDimensional ℝ V] lemma IsInfinitesimalActionOf.actionFam_repDualCoeff (h : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (g : Module.Dual ℝ V →ₗ[ℝ] B) (φ : Module.Dual ℝ V) : + (g : Module.Dual ℂ V →ₗ[ℂ] B) (φ : Module.Dual ℂ V) : actionFam act f g (repDualCoeff rep U x φ) = (x.antidiagonal.map fun p => actionFam act (f ∘ₗ adjointDualCoeff U p.1) @@ -139,28 +138,27 @@ lemma IsInfinitesimalActionOf.actionFam_repDualCoeff Function.comp_apply] using h1 rw [show repDualCoeff rep U x = (repCoeff rep U x).dualMap from rfl, show actionFam act f g ((repCoeff rep U x).dualMap φ) = - dualPairEquivW ((TensorProduct.map LinearMap.id (repCoeff rep U x)) - (tensorAction act (dualPairEquiv.symm f) (dualPairEquivW.symm g))) φ from - (dualPairEquivW_map_right (repCoeff rep U x) _ φ).symm, + dualPairEquivC ((TensorProduct.map LinearMap.id (repCoeff rep U x)) + (tensorAction act (dualPairEquiv.symm f) (dualPairEquivC.symm g))) φ from + (dualPairEquivC_map_right (repCoeff rep U x) _ φ).symm, ← tensorAction_map_right_antidiagonal act (adjointCoeff U) (repCoeff rep U) x hT, map_multiset_sum, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) simp only [Function.comp_apply] - rw [← symm_comp_right, ← symm_comp_right_W] + rw [← symm_comp_right, ← symm_comp_right_C] rfl - -omit [FiniteDimensional ℝ V] in +omit [FiniteDimensional ℂ V] in /-- If `F` transforms in `rep`, so do its `κ ::ₘ s`-derived symbols, with the extra derivative traced through `IsInfinitesimalActionOf.repDualCoeff_cons`: the Leibniz splittings where `κ` stays a derivative, minus the convolution where `κ` hits the representation — `act` of the derived Maurer–Cartan form. -/ -lemma TransformsIn.repGauge_cons - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B} - (hF : TransformsIn (repGauge := repGauge) rep F) +lemma _root_.StandardModel.TransformsIn.repGauge_cons + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ V) : + (φ : Module.Dual ℂ V) : repGauge U (F (κ ::ₘ s) φ) = (s.antidiagonal.map fun p => F (κ ::ₘ p.2) (repDualCoeff rep U⁻¹ p.1 φ)).sum @@ -191,13 +189,13 @@ set_option maxHeartbeats 2000000 in convolution through `act` survives — the analogue of `TransformsInAdjoint.repGauge_bracketFamConv` with a matter field in the second slot. -/ -lemma TransformsIn.repGauge_actionFamConv +lemma _root_.StandardModel.TransformsIn.repGauge_actionFamConv (hA : IsGaugeField repLorentz repGauge A) - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B} - (hF : TransformsIn (repGauge := repGauge) rep F) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf act rep) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ V) : + (φ : Module.Dual ℂ V) : repGauge U (actionFamConv A act ρ F s φ) = (s.antidiagonal.map fun p => actionFamConv A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum @@ -214,7 +212,7 @@ lemma TransformsIn.repGauge_actionFamConv intro u ψ rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 - have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ V), + have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℂ V), repGauge U (F u ψ) = ((u.antidiagonal.map fun r => F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) ψ := by intro u ψ @@ -281,12 +279,12 @@ set_option maxHeartbeats 2000000 in convolution of `[∂_{ρ ::ₘ s} F]` cancels the single `act` cross-term convolution of `A_ρ · F` through the coassociativity of the antidiagonal — the matter-field analogue of `TransformsInAdjoint.covDerivAdjoint`. -/ -theorem TransformsIn.covDerivAction +theorem _root_.StandardModel.TransformsIn.covDerivAction (hA : IsGaugeField repLorentz repGauge A) - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ V →ₗ[ℝ] B} - (hF : TransformsIn (repGauge := repGauge) rep F) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf act rep) (ρ : Fin 1 ⊕ Fin 3) : - TransformsIn (repGauge := repGauge) rep (IsGaugeField.covDerivAction A act F ρ) := by + TransformsIn repGauge rep (IsGaugeField.covDerivAction A act F ρ) := by intro U φ s have hL : repGauge U (IsGaugeField.covDerivAction A act F ρ s φ) = repGauge U (F (ρ ::ₘ s) φ) + repGauge U (actionFamConv A act ρ F s φ) := by @@ -322,4 +320,4 @@ end MatterCovariance end IsGaugeField -end StandardModel \ No newline at end of file +end StandardModel diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 955e2c4f6..b9310a948 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -120,6 +120,25 @@ class IsLorentzDeriv {M : Type} [AddCommMonoid M] [Module ℂ M] rep_deriv {Λ μ x} : rep Λ (D μ x) = ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • D a (rep Λ x) +/-- A family of derivative symbols `F : s ↦ [∂_s ψ^φ]`, indexed by the dual of a value + space `V` carrying a representation of `SL(2,ℂ)`, **transforms as the derivative + symbols of a Lorentz-covariant field**: each ordered symbol mixes into all tuples of + directions by the per-slot columns of the Lorentz matrix, while the value index + transforms by the contragredient action `rep.dual` on the dual of `V`. This is the + general form of the `lorentz_apply` field of `IsGaugeField`, for a field valued in an + arbitrary Lorentz representation — the trivial representation for scalars, the Weyl + representations for fermions, and their conjugates for the barred fields. At `n = 0` + it reduces to the homogeneous law `Λ • F₀^φ = F₀^{Λ^{-⊤} φ}`. -/ +def IsLorentzDerivTransforms {k V : Type*} [CommRing k] [AddCommGroup V] [Module k V] + [Module k A] + (repLorentz : Representation ℂ SL(2,ℂ) A) (rep : Representation k SL(2,ℂ) V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual k V →ₗ[k] A) : Prop := + ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual k V), + repLorentz Λ (F (List.ofFn l) φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + F (List.ofFn p) (rep.dual Λ φ) + namespace IsLorentzDeriv variable {rep : Representation ℂ SL(2,ℂ) A} {D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A} From c9ca43c1f38e61092a205d0eae2fd12b84297e12 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 11:57:22 +0100 Subject: [PATCH 218/254] feat: Covariant derivatives of the conjugate file --- Physlib.lean | 2 +- .../StandardModel/Fermions/DownSinglet.lean | 10 +- .../InfinitesimalAction.lean | 185 +++++++++++++++++- .../StandardModel/IsStandardModel/Basic.lean | 133 ++++++++++--- .../JetComponentSpace/CovariantDeriv.lean | 2 +- 5 files changed, 293 insertions(+), 39 deletions(-) rename Physlib/Particles/StandardModel/{Matter/JetComponentSpace => GaugeAlgebra}/InfinitesimalAction.lean (63%) diff --git a/Physlib.lean b/Physlib.lean index 14b3c702a..1481c6827 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -249,7 +249,7 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index cd90e6846..85fcbc266 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -325,7 +325,7 @@ The infinitesimal `(3, 1)_{-2}` action of the gauge algebra on the down-type sin the colour part of the algebra element acts on the colour index and the hypercharge part scales, both through the physicists' factor of `i`, matching the group action `(star u) ^ 2 • U₃` infinitesimally. The compatibility with the jet gauge action — -`IsGaugeField.IsInfinitesimalActionOf` — is proved at the end of this file. +`GaugeAlgebra.IsInfinitesimalActionOf` — is proved at the end of this file. -/ @@ -385,7 +385,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ : derivative of the `(3, 1)_{-2}` action of the gauge group, real-linear in the algebra slot and complex-linear in the value slot — the form consumed by the covariant derivative `IsGaugeField.covDerivIter` and by - `IsGaugeField.IsInfinitesimalActionOf`. -/ + `GaugeAlgebra.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℂ] DownSinglet where toFun c := colourEnd (actionMatrix c) @@ -608,7 +608,7 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : ## The infinitesimal action underlies the jet gauge action The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action underlying the -jet gauge action, in the sense of `IsGaugeField.IsInfinitesimalActionOf`: the base-point +jet gauge action, in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`: the base-point Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. The proofs work through the colour matrix of the jet action and the all-orders matrix Leibniz rule at the base point. @@ -977,7 +977,7 @@ set_option maxHeartbeats 1000000 in coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ theorem isInfinitesimalActionOf : - IsGaugeField.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x have hMcons : ((downMatrix U).map fun f => diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean similarity index 63% rename from Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean rename to Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean index f9d47cc0f..ef4d322a7 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/InfinitesimalAction.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv /-! # The infinitesimal action underlying a matter representation @@ -22,7 +23,7 @@ derivative preserves the gauge tensors, `TransformsIn.covDerivAction`. ## ii. Key results -- `IsGaugeField.IsInfinitesimalActionOf` : `act` is the infinitesimal action underlying +- `GaugeAlgebra.IsInfinitesimalActionOf` : `act` is the infinitesimal action underlying `rep`. - `TransformsIn.covDerivAction` : the covariant derivative preserves `TransformsIn`. @@ -30,6 +31,7 @@ derivative preserves the gauge tensors, `TransformsIn.covDerivAction`. - A. The infinitesimal action underlying a representation - B. The covariant derivative preserves `TransformsIn` +- C. The conjugate action and the conjugate representation -/ @@ -40,7 +42,9 @@ open Matrix MatrixGroups TensorProduct MvPowerSeries variable {B : Type} [Ring B] [Algebra ℂ B] variable {V : Type} [AddCommGroup V] [Module ℂ V] -namespace IsGaugeField +namespace GaugeAlgebra + +open IsGaugeField variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} @@ -318,6 +322,181 @@ theorem _root_.StandardModel.TransformsIn.covDerivAction end MatterCovariance -end IsGaugeField +/-! + +## C. The conjugate action and the conjugate representation + +-/ + +section ConjugateAction + +/-- A linear endomorphism read on the conjugate module: the same underlying map, + through the identity `conjEquiv`. Conjugating twists nothing at the level of the + additive group, so all structural identities (`comp`, `add`, `neg`, sums) hold + definitionally. -/ +def _root_.ConjModule.endConj {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) : + ConjModule M →ₗ[k] ConjModule M where + toFun v := conjEquiv (k := k) (M := M) (f ((conjEquiv (k := k) (M := M)).symm v)) + map_add' v w := f.map_add v w + map_smul' a v := f.map_smul (star a) v + +@[simp] +lemma _root_.ConjModule.endConj_apply {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) (v : ConjModule M) : + ConjModule.endConj f v = + conjEquiv (k := k) (M := M) (f ((conjEquiv (k := k) (M := M)).symm v)) := rfl + +lemma _root_.ConjModule.endConj_comp {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f g : M →ₗ[k] M) : + ConjModule.endConj (f ∘ₗ g) = ConjModule.endConj f ∘ₗ ConjModule.endConj g := rfl + +lemma _root_.ConjModule.endConj_add {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f g : M →ₗ[k] M) : + ConjModule.endConj (f + g) = ConjModule.endConj f + ConjModule.endConj g := rfl + +lemma _root_.ConjModule.endConj_neg {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) : + ConjModule.endConj (-f) = -ConjModule.endConj f := rfl + +lemma _root_.ConjModule.endConj_multiset_sum {k : Type*} [CommRing k] [StarRing k] + {M : Type*} [AddCommGroup M] [Module k M] (S : Multiset (M →ₗ[k] M)) : + ConjModule.endConj S.sum = (S.map ConjModule.endConj).sum := by + induction S using Multiset.induction_on with + | empty => rfl + | cons f S ih => + rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + ConjModule.endConj_add, ih] + +/-- Conjugation of endomorphisms commutes with real scalars: the star on the + conjugated complex scalar is invisible on the reals. -/ +lemma _root_.ConjModule.endConj_real_smul {M : Type*} [AddCommGroup M] [Module ℂ M] + (r : ℝ) (f : M →ₗ[ℂ] M) : + ConjModule.endConj (r • f) = r • ConjModule.endConj f := by + refine LinearMap.ext fun v => ?_ + show (algebraMap ℝ ℂ r) • (f ((conjEquiv (k := ℂ) (M := M)).symm v)) + = (starRingEnd ℂ) (algebraMap ℝ ℂ r) • (f ((conjEquiv (k := ℂ) (M := M)).symm v)) + rw [show (starRingEnd ℂ) (algebraMap ℝ ℂ r) = algebraMap ℝ ℂ r from + Complex.conj_ofReal r] + +/-- **The conjugate of an infinitesimal action**: the same maps, read on the conjugate + module — the generators of the conjugate representation. -/ +noncomputable def actionConj (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) : + GaugeAlgebra →ₗ[ℝ] ConjModule V →ₗ[ℂ] ConjModule V where + toFun c := ConjModule.endConj (act c) + map_add' c₁ c₂ := by rw [map_add, ConjModule.endConj_add] + map_smul' r c := by rw [map_smul, ConjModule.endConj_real_smul, RingHom.id_apply] + +@[simp] +lemma actionConj_apply (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (c : GaugeAlgebra) : + actionConj act c = ConjModule.endConj (act c) := rfl + +/-- The identification of the jets of a conjugate field with the conjugates of the + jets: conjugation is monoidal, and the star of the jet-ring factor absorbs the + twist — `conj (g ⊗ u) ↦ star g ⊗ conj u`. This is the equivalence along which + `repConj` carries the conjugated representation. -/ +noncomputable def conjJetEquiv : + ConjModule (JetRing ⊗[ℂ] V) ≃ₗ[ℂ] JetRing ⊗[ℂ] ConjModule V := + (ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V))) + +lemma conjJetEquiv_conjEquiv_tmul (g : JetRing) (u : V) : + conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (g ⊗ₜ[ℂ] u)) + = star g ⊗ₜ[ℂ] conjEquiv (k := ℂ) (M := V) u := by + rw [conjJetEquiv, LinearEquiv.trans_apply, ConjModule.tensorEquiv_symm_conjEquiv_tmul, + TensorProduct.congr_tmul, JetRing.starConjEquiv_apply, LinearEquiv.refl_apply, + LinearEquiv.symm_apply_apply] + +section ConjRep + +variable {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} +variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} + +/-- The conjugate representation acts through `conjJetEquiv` by the original maps. -/ +lemma repConj_conjJetEquiv (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (U : JetGaugeGroupI) (w : JetRing ⊗[ℂ] V) : + repConj rep U (conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)) + = conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U w)) := by + show conjJetEquiv ((rep.conj U) (conjJetEquiv.symm + (conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)))) = _ + rw [LinearEquiv.symm_apply_apply, Representation.conj_apply, + LinearEquiv.symm_apply_apply] + +/-- **The base-point Taylor coefficients of the conjugate representation are the + conjugated coefficients**: the derivative directions are real, so conjugation passes + through `∂_x` and the base-point evaluation untouched. -/ +lemma repCoeff_repConj (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + repCoeff (repConj rep) U x = ConjModule.endConj (repCoeff rep U x) := by + have hE_tmul := conjJetEquiv_conjEquiv_tmul (V := V) + -- conjugation intertwines the formal derivative + have hderiv1 : ∀ (μ : Fin 1 ⊕ Fin 3) (w : JetRing ⊗[ℂ] V), + jetDeriv μ (conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)) + = conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (jetDeriv μ w)) := by + intro μ w + induction w using TensorProduct.induction_on with + | zero => simp + | tmul g u => + rw [hE_tmul, jetDeriv_tmul, jetDeriv_tmul, hE_tmul, JetRing.pderiv_star] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, map_add, map_add, map_add] + have hderiv : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (w : JetRing ⊗[ℂ] V), + jetIteratedDeriv s (conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)) + = conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) + (jetIteratedDeriv s w)) := by + intro s + induction s using Multiset.induction_on with + | empty => intro w; rw [jetIteratedDeriv_zero]; rfl + | cons μ t ih => + intro w + rw [jetIteratedDeriv_cons, LinearMap.comp_apply, ih, hderiv1, + jetIteratedDeriv_cons, LinearMap.comp_apply] + -- conjugation intertwines the base-point evaluation + have heval : ∀ w : JetRing ⊗[ℂ] V, + jetEval (conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)) + = conjEquiv (k := ℂ) (M := V) (jetEval w) := by + intro w + induction w using TensorProduct.induction_on with + | zero => simp + | tmul g u => + rw [hE_tmul, jetEval_tmul, jetEval_tmul, JetRing.constantCoeff_star, + map_smulₛₗ, starRingEnd_apply] + | add a b ha hb => rw [map_add, map_add, map_add, ha, hb, map_add, map_add] + refine LinearMap.ext fun v => ?_ + have hv : jetOfConstant v = conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) + (jetOfConstant ((conjEquiv (k := ℂ) (M := V)).symm v))) := by + rw [jetOfConstant_apply, jetOfConstant_apply, hE_tmul, star_one, + LinearEquiv.apply_symm_apply] + show jetEval (jetIteratedDeriv x (repConj rep U (jetOfConstant v))) = _ + rw [hv, repConj_conjJetEquiv, hderiv, heval] + rfl + +/-- **The conjugate of an infinitesimal action underlies the conjugate + representation**: conjugating the Taylor coefficients preserves both the + Maurer–Cartan Leibniz law and the adjoint intertwining, since the gauge-algebra + inputs are real. -/ +theorem IsInfinitesimalActionOf.conj (h : IsInfinitesimalActionOf act rep) : + IsInfinitesimalActionOf (actionConj act) (repConj rep) := by + constructor + · intro U μ x + rw [repCoeff_repConj, h.repCoeff_cons U μ x, ConjModule.endConj_neg, + ConjModule.endConj_multiset_sum, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum + (Multiset.map_congr rfl fun p hp => ?_)) + rw [Function.comp_apply, ConjModule.endConj_comp, repCoeff_repConj] + rfl + · intro U x c + rw [repCoeff_repConj, show actionConj act c = ConjModule.endConj (act c) from rfl, + ← ConjModule.endConj_comp, h.repCoeff_act U x c, + ConjModule.endConj_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, ConjModule.endConj_comp, repCoeff_repConj] + rfl + +end ConjRep + +end ConjugateAction + +end GaugeAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index fecd84c57..780824a6f 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -215,19 +215,30 @@ noncomputable def covDerivD (h : IsStandardModel B repJet repLorentz massWeightP Module.Dual ℂ DownSinglet →ₗ[ℂ] B := IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) n l 0 +noncomputable def covDerivBarD (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) n l 0 +/-- **The field algebra with covariant down-quark derivatives**: replacing the plain + derivative symbols of the down-type quarks *and their conjugates* by their covariant + derivative towers does not change the generated algebra — the corrections `∇ − ∂` + are polynomials in gauge-field and quark symbols. This is the span lemma + `IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter`, instantiated per family for + `d` (with the `(3, 1)_{-2}` action) and for `bard` (with its conjugate action). -/ lemma fieldAlgebra_eq_covDerivD : h.fieldAlgebra = Algebra.adjoin ℂ ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ - (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), Set.range (h.covDerivD i l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), Set.range (h.covDerivD i l) + ∪ Set.range (h.covDerivBarD i l)) ∪ (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), - Set.range (bard i s) ∪ Set.range (u i s) ∪ Set.range (baru i s) ∪ Set.range (Q i s) ∪ Set.range (barQ i s) ∪ Set.range (L i s) ∪ Set.range (barL i s) ∪ Set.range (e i s) ∪ Set.range (bare i s))) := by - -- the span lemma, per family + -- the span lemma, per family and per conjugation have hAT : ∀ i : Fin 3, Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) @@ -243,16 +254,31 @@ lemma fieldAlgebra_eq_covDerivD : n l 0 φ}) := fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter DownSinglet.gaugeAlgebraAction (d i) - -- the down symbols lie in the covariant-tower algebra + have hATbar : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = bard i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), + b = IsGaugeField.covDerivIter A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) + n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) + -- the down symbols and their conjugates lie in the covariant-tower algebra have hdmem : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet), d i s φ ∈ Algebra.adjoin ℂ ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ - (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), - Set.range (h.covDerivD i l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l)) ∪ (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), - Set.range (bard i s) ∪ Set.range (u i s) ∪ Set.range (baru i s) ∪ Set.range (Q i s) ∪ Set.range (barQ i s) ∪ Set.range (L i s) ∪ Set.range (barL i s) ∪ @@ -271,7 +297,35 @@ lemma fieldAlgebra_eq_covDerivD : · exact Or.inl (Or.inl (Or.inl (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩))) · exact Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, - Set.mem_iUnion.mpr ⟨l, ⟨φ', rfl⟩⟩⟩⟩)) + Set.mem_iUnion.mpr ⟨l, Or.inl ⟨φ', rfl⟩⟩⟩⟩)) + have hbardmem : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), + bard i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l)) ∪ + (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (u i s) ∪ Set.range (baru i s) ∪ + Set.range (Q i s) ∪ Set.range (barQ i s) ∪ + Set.range (L i s) ∪ Set.range (barL i s) ∪ + Set.range (e i s) ∪ Set.range (bare i s))) := by + intro i s φ + have h1 : bard i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), + b = IsGaugeField.covDerivIter A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) + n l 0 φ}) := + (hATbar i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩))) + · exact Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Or.inr ⟨φ', rfl⟩⟩⟩⟩)) refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) · rintro b (hAH | hbF) · exact Algebra.subset_adjoin (Or.inl (Or.inl hAH)) @@ -280,35 +334,56 @@ lemma fieldAlgebra_eq_covDerivD : by_cases hd : b ∈ Set.range (d i s) · obtain ⟨φ, rfl⟩ := hd exact hdmem i s φ - · refine Algebra.subset_adjoin (Or.inr (Set.mem_iUnion.mpr ⟨i, - Set.mem_iUnion.mpr ⟨s, ?_⟩⟩)) - simp only [Set.mem_union] at hbF ⊢ - tauto + · by_cases hbd : b ∈ Set.range (bard i s) + · obtain ⟨φ, rfl⟩ := hbd + exact hbardmem i s φ + · refine Algebra.subset_adjoin (Or.inr (Set.mem_iUnion.mpr ⟨i, + Set.mem_iUnion.mpr ⟨s, ?_⟩⟩)) + simp only [Set.mem_union] at hbF ⊢ + tauto · rintro b ((hAH | hT) | hbF) · exact Algebra.subset_adjoin (Or.inl hAH) - · simp only [Set.mem_iUnion, Set.mem_range] at hT - obtain ⟨i, n, l, φ, rfl⟩ := hT - have h1 : IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) - n l 0 φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet), b = d i s φ}) := - (hAT i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) - refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 - rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) - · exact Or.inl (Or.inl - (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) - · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) - have hmem : d i s' φ' ∈ Set.range (d i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto + · simp only [Set.mem_iUnion] at hT + obtain ⟨i, n, l, hT⟩ := hT + rcases hT with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · have h1 : IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) + n l 0 φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet), b = d i s φ}) := + (hAT i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : d i s' φ' ∈ Set.range (d i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) + n l 0 φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = bard i s φ}) := + (hATbar i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : bard i s' φ' ∈ Set.range (bard i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto · simp only [Set.mem_iUnion] at hbF obtain ⟨i, s, hbF⟩ := hbF refine Algebra.subset_adjoin (Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, ?_⟩⟩)) simp only [Set.mem_union] at hbF ⊢ tauto + end IsStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index 8a172cf74..ba36bcd3a 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -49,7 +49,7 @@ case `act = adAction` (the bracket as a bilinear map) literally specializes: The compatibility between `rep` and `act` — the structure `IsInfinitesimalActionOf` — and the theorem that under it the covariant derivative preserves the gauge tensors live -in `Physlib.Particles.StandardModel.Matter.JetComponentSpace.InfinitesimalAction`. +in `Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction`. -/ From c955135d0350cdc90cd714869fc42cb03a18815f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:56:40 +0100 Subject: [PATCH 219/254] feat: Add gauge actions for fermions --- Physlib.lean | 6 + .../StandardModel/Fermions/DownSinglet.lean | 570 -------------- .../DownSinglet/GaugeAlgebraAction.lean | 610 +++++++++++++++ .../LeptonDoublet/GaugeAlgebraAction.lean | 623 +++++++++++++++ .../LeptonSinglet/GaugeAlgebraAction.lean | 316 ++++++++ .../QuarkDoublet/GaugeAlgebraAction.lean | 736 ++++++++++++++++++ .../UpSinglet/GaugeAlgebraAction.lean | 605 ++++++++++++++ .../HiggsBoson/GaugeAlgebraAction.lean | 522 +++++++++++++ .../StandardModel/IsStandardModel/Basic.lean | 1 + 9 files changed, 3419 insertions(+), 570 deletions(-) create mode 100644 Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean create mode 100644 Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean diff --git a/Physlib.lean b/Physlib.lean index 1481c6827..9f9579995 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -250,6 +250,12 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 85fcbc266..c8942956c 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -319,100 +319,6 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → /-! -## The action of the gauge algebra - -The infinitesimal `(3, 1)_{-2}` action of the gauge algebra on the down-type singlet: -the colour part of the algebra element acts on the colour index and the hypercharge -part scales, both through the physicists' factor of `i`, matching the group action -`(star u) ^ 2 • U₃` infinitesimally. The compatibility with the jet gauge action — -`GaugeAlgebra.IsInfinitesimalActionOf` — is proved at the end of this file. - --/ - -/-- The endomorphism of the down singlet defined by a `3 × 3` complex matrix acting on - the colour index, with the Weyl factor untouched. -/ -noncomputable def colourEnd (A : Matrix (Fin 3) (Fin 3) ℂ) : - DownSinglet →ₗ[ℂ] DownSinglet := - valLinEquiv.symm.toLinearMap ∘ₗ - Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl - (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ valLinEquiv.toLinearMap - -lemma colourEnd_apply_mk (A : Matrix (Fin 3) (Fin 3) ℂ) (v : DownSinglet) : - colourEnd A v - = valLinEquiv.symm - (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl - (Matrix.toLpLinAlgEquiv 2 A) (valLinEquiv v)) := rfl - -lemma colourEnd_add (A B : Matrix (Fin 3) (Fin 3) ℂ) : - colourEnd (A + B) = colourEnd A + colourEnd B := by - rw [colourEnd, colourEnd, colourEnd, map_add, map_add, LinearMap.add_comp, - LinearMap.comp_add] - -lemma colourEnd_smul (z : ℂ) (A : Matrix (Fin 3) (Fin 3) ℂ) : - colourEnd (z • A) = z • colourEnd A := by - rw [colourEnd, colourEnd, map_smul, map_smul, LinearMap.smul_comp, - LinearMap.comp_smul] - -lemma colourEnd_zero : colourEnd 0 = 0 := by - rw [colourEnd, map_zero, map_zero, LinearMap.zero_comp, LinearMap.comp_zero] - -lemma colourEnd_neg (A : Matrix (Fin 3) (Fin 3) ℂ) : colourEnd (-A) = -colourEnd A := by - rw [show (-A : Matrix (Fin 3) (Fin 3) ℂ) = (-1 : ℂ) • A from by rw [neg_one_smul], - colourEnd_smul, neg_one_smul] - -lemma colourEnd_multiset_sum (m : Multiset (Matrix (Fin 3) (Fin 3) ℂ)) : - colourEnd m.sum = (m.map colourEnd).sum := by - induction m using Multiset.induction_on with - | empty => simp [colourEnd_zero] - | cons A t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, - colourEnd_add, ih] - -/-- The colour endomorphisms compose through matrix multiplication. -/ -lemma colourEnd_mul (A B : Matrix (Fin 3) (Fin 3) ℂ) : - colourEnd (A * B) = colourEnd A ∘ₗ colourEnd B := by - refine LinearMap.ext fun v => ?_ - rw [colourEnd_apply_mk, map_mul, map_mul, LinearMap.comp_apply, colourEnd_apply_mk, - colourEnd_apply_mk, LinearEquiv.apply_symm_apply] - rfl - -/-- The matrix of the infinitesimal `(3, 1)_{-2}` action of a gauge algebra element on - the colour index: `i` times the colour part, shifted by `i` times `-2` the - hypercharge. -/ -noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ := - Complex.I • (c.toSU3Matrix - ((2 : ℂ) • c.toU1Value) • 1) - -/-- **The infinitesimal action of the gauge algebra on the down-type singlet**: the - derivative of the `(3, 1)_{-2}` action of the gauge group, real-linear in the - algebra slot and complex-linear in the value slot — the form consumed by the - covariant derivative `IsGaugeField.covDerivIter` and by - `GaugeAlgebra.IsInfinitesimalActionOf`. -/ -noncomputable def gaugeAlgebraAction : - GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℂ] DownSinglet where - toFun c := colourEnd (actionMatrix c) - map_add' c₁ c₂ := by - rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by - rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU3Matrix, - GaugeAlgebra.add_toU1Value] - module] - rw [colourEnd_add] - map_smul' r c := by - rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by - rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU3Matrix, - GaugeAlgebra.smul_toU1Value, - show (r • c.toSU3Matrix : Matrix (Fin 3) (Fin 3) ℂ) - = (r : ℂ) • c.toSU3Matrix from by - rw [← algebraMap_smul ℂ r c.toSU3Matrix]; rfl, - show r • c.toU1Value = (r : ℂ) • c.toU1Value from by - rw [← algebraMap_smul ℂ r c.toU1Value]; rfl] - module, - colourEnd_smul] - refine LinearMap.ext fun v => ?_ - rw [RingHom.id_apply] - show (r : ℂ) • colourEnd (actionMatrix c) v = r • colourEnd (actionMatrix c) v - rw [show ((r : ℝ) : ℂ) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] - -/-! - ## The representation of the jet gauge group -/ @@ -603,482 +509,6 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : simp only [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, map_add, ha, hb] -/-! - -## The infinitesimal action underlies the jet gauge action - -The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action underlying the -jet gauge action, in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`: the base-point -Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and -intertwine the action with the adjoint transports. The proofs work through the colour -matrix of the jet action and the all-orders matrix Leibniz rule at the base point. - --/ - -section InfinitesimalAction - -open MvPowerSeries - -/-- A single formal derivative commutes with the iterated one. -/ -private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) - (f : JetRing) : - pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) f) - = x.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) := by - induction x using Multiset.induction_on generalizing f with - | empty => rfl - | cons ν t ih => - rw [Multiset.foldl_cons, Multiset.foldl_cons, ih, JetRing.pderiv_comm] - -/-- The iterated formal derivative is `ℂ`-homogeneous. -/ -private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : - x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) - = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by - induction x using Multiset.induction_on generalizing f with - | empty => rfl - | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] - -/-- The iterated formal derivative of a difference. -/ -private lemma foldl_pderiv_sub (x : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : - x.foldl (fun h ρ => pderiv ℂ ρ h) (f - g) - = x.foldl (fun h ρ => pderiv ℂ ρ h) f - x.foldl (fun h ρ => pderiv ℂ ρ h) g := by - induction x using Multiset.induction_on generalizing f g with - | empty => rfl - | cons ν t ih => rw [Multiset.foldl_cons, map_sub, ih, Multiset.foldl_cons, - Multiset.foldl_cons] - -/-- The jet-valued matrix of the infinitesimal `(3, 1)_{-2}` action of a jet of gauge - algebra elements: the jet analogue of `actionMatrix`. -/ -noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 3) (Fin 3) JetRing := - Complex.I • (a.toSU3Matrix - ((2 : ℂ) • a.toU1Value) • 1) - -/-- The base-point Taylor coefficients of the jet action matrix are the action matrices - of the base-point Taylor coefficients. -/ -lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : - ((jetActionMatrix a).map fun f => - constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) - = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := by - ext i j - rw [Matrix.map_apply, jetActionMatrix, actionMatrix, Matrix.smul_apply, - Matrix.sub_apply, Matrix.smul_apply, Matrix.smul_apply, Matrix.sub_apply, - Matrix.smul_apply, foldl_pderiv_smul, constantCoeff_smul, foldl_pderiv_sub, - map_sub, JetGaugeAlgebra.eval_iteratedDeriv_toSU3Matrix, Matrix.map_apply] - congr 2 - by_cases hij : i = j - · subst hij - rw [Matrix.one_apply_eq, Matrix.one_apply_eq, smul_eq_mul, mul_one, smul_eq_mul, - mul_one, foldl_pderiv_smul, constantCoeff_smul, - JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] - · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, - JetRing.foldl_pderiv_zero, map_zero] - -/-- The `JetRing`-valued colour matrix of the jet gauge action on the down singlet: the - colour matrix of the gauge jet carrying the `-2` hypercharge phase. -/ -noncomputable def downMatrix (U : JetGaugeGroupI) : Matrix (Fin 3) (Fin 3) JetRing := - ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • - ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) - -lemma repJetGaugeGroupI_eq_downMatrix (U : JetGaugeGroupI) - (z : JetRing ⊗[ℂ] DownSinglet) : - repJetGaugeGroupI U z - = jetValLinEquiv.symm - (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) - Fermion.RightHandedWeyl - ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)).restrictScalars ℂ) - (jetValLinEquiv z)) := rfl - -/-- The entrywise formal derivative on the colour coordinates, as a `ℂ`-linear map. -/ -private noncomputable def pderivColour (μ : Fin 1 ⊕ Fin 3) : - EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where - toFun v := WithLp.toLp 2 fun i => pderiv ℂ μ (v.ofLp i) - map_add' v w := by - refine WithLp.ofLp_injective 2 ?_ - funext i - exact map_add _ _ _ - map_smul' z v := by - refine WithLp.ofLp_injective 2 ?_ - funext i - exact Derivation.map_smul _ _ _ - -/-- The entrywise iterated formal derivative on the colour coordinates. -/ -private noncomputable def foldColour (x : Multiset (Fin 1 ⊕ Fin 3)) : - EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where - toFun v := WithLp.toLp 2 fun i => x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) - map_add' v w := by - refine WithLp.ofLp_injective 2 ?_ - funext i - exact JetRing.foldl_pderiv_add x _ _ - map_smul' z v := by - refine WithLp.ofLp_injective 2 ?_ - funext i - exact foldl_pderiv_smul x z _ - -/-- The entrywise base-point evaluation on the colour coordinates. -/ -private noncomputable def ccColour : - EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace ℂ (Fin 3) where - toFun v := WithLp.toLp 2 fun i => constantCoeff (v.ofLp i) - map_add' v w := by - refine WithLp.ofLp_injective 2 ?_ - funext i - exact map_add _ _ _ - map_smul' z v := by - refine WithLp.ofLp_injective 2 ?_ - funext i - exact constantCoeff_smul _ _ - -private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) - (x : Multiset (Fin 1 ⊕ Fin 3)) : - pderivColour μ ∘ₗ foldColour x = foldColour (μ ::ₘ x) := by - refine LinearMap.ext fun v => ?_ - refine WithLp.ofLp_injective 2 ?_ - funext i - show pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i)) - = (μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) - rw [Multiset.foldl_cons, pderiv_foldl] - -/-- The identification of down-singlet jets intertwines the formal derivative with the - entrywise derivative on the colour coordinates. -/ -private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) - (z : JetRing ⊗[ℂ] DownSinglet) : - jetValLinEquiv (StandardModel.jetDeriv μ z) - = (TensorProduct.map LinearMap.id (pderivColour μ)) (jetValLinEquiv z) := by - induction z using TensorProduct.induction_on with - | zero => rw [map_zero, map_zero, map_zero] - | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] - | tmul f d => - obtain ⟨w⟩ := d - induction w using TensorProduct.induction_on with - | zero => - rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero, - map_zero, map_zero, map_zero] - | tmul ψ c => - rw [show StandardModel.jetDeriv μ (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) - = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) from rfl, - show jetValLinEquiv ((pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) - = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • pderiv ℂ μ f) from rfl, - show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) - = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, - TensorProduct.map_tmul, LinearMap.id_apply] - congr 1 - refine WithLp.ofLp_injective 2 ?_ - funext i - exact (Derivation.map_smul (pderiv ℂ μ) (c.ofLp i) f).symm - | add a b ha hb => - rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, - TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] - -/-- The identification of down-singlet jets intertwines the iterated formal derivative - with the entrywise iterated derivative on the colour coordinates. -/ -private lemma jetValLinEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) - (z : JetRing ⊗[ℂ] DownSinglet) : - jetValLinEquiv (StandardModel.jetIteratedDeriv x z) - = (TensorProduct.map LinearMap.id (foldColour x)) (jetValLinEquiv z) := by - induction x using Multiset.induction_on with - | empty => - rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, - show foldColour 0 = LinearMap.id from LinearMap.ext fun v => - WithLp.ofLp_injective 2 rfl, - TensorProduct.map_id, LinearMap.id_apply] - | cons μ t ih => - rw [StandardModel.jetIteratedDeriv_cons, LinearMap.comp_apply, - jetValLinEquiv_jetDeriv, ih, ← LinearMap.comp_apply, ← TensorProduct.map_comp, - LinearMap.id_comp, pderivColour_comp_foldColour] - -/-- The base-point evaluation of a down-singlet jet through the colour coordinates. -/ -private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] DownSinglet) : - valLinEquiv (StandardModel.jetEval z) - = (TensorProduct.map LinearMap.id ccColour) (jetValLinEquiv z) := by - induction z using TensorProduct.induction_on with - | zero => simp; rfl - | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] - | tmul f d => - obtain ⟨w⟩ := d - induction w using TensorProduct.induction_on with - | zero => - rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero] - simp - rfl - | tmul ψ c => - rw [StandardModel.jetEval_tmul, map_smul, - show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) = ψ ⊗ₜ[ℂ] c from rfl, - show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) - = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, - TensorProduct.map_tmul, LinearMap.id_apply, ← TensorProduct.tmul_smul] - congr 1 - refine WithLp.ofLp_injective 2 ?_ - funext i - show (constantCoeff f • c).ofLp i = constantCoeff (c.ofLp i • f) - simp [constantCoeff_smul, mul_comm] - | add a b ha hb => - rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, - TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] - -set_option maxHeartbeats 1000000 in -/-- **The derivative identity** for the colour matrix of the jet gauge action: the - formal derivative of the colour matrix is minus the jet action matrix of the - Maurer–Cartan form times the colour matrix. -/ -lemma downMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - (downMatrix U).map (fun f => pderiv ℂ μ f) - = -(jetActionMatrix (maurerCartanForm U μ) * downMatrix U) := by - have hleib : ∀ f g : JetRing, - pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by - rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] - have huu : ((U.2.2 : unitary JetRing) : JetRing) - * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := - Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 - have hU₃u : star U.1.1 * U.1.1 = 1 := - Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 - have h0 : pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) - * star ((U.2.2 : unitary JetRing) : JetRing) - + ((U.2.2 : unitary JetRing) : JetRing) - * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) = 0 := by - have h := congrArg (pderiv ℂ μ) huu - rw [hleib, Derivation.map_one_eq_zero] at h - exact h - have hsu : pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) - = -(pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) - * (star ((U.2.2 : unitary JetRing) : JetRing) - * star ((U.2.2 : unitary JetRing) : JetRing))) := by - have h1 : star ((U.2.2 : unitary JetRing) : JetRing) - * (pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) - * star ((U.2.2 : unitary JetRing) : JetRing) - + ((U.2.2 : unitary JetRing) : JetRing) - * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing))) = 0 := by - rw [h0, mul_zero] - linear_combination h1 - - pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) * huu - have hm₃U₃ : (maurerCartanForm U μ).toSU3Matrix * U.1.1 - = Complex.I • U.1.1.map (pderiv ℂ μ) := by - rw [maurerCartanForm_toSU3Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₃u, - Matrix.mul_one] - have hiC : (algebraMap ℂ JetRing) Complex.I * (algebraMap ℂ JetRing) Complex.I - = -1 := by - rw [← map_mul, Complex.I_mul_I, map_neg, map_one] - have hmap : ((((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • - ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : - Matrix (Fin 3) (Fin 3) JetRing)).map fun f => pderiv ℂ μ f) - = (pderiv ℂ μ ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2)) • U.1.1 - + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) - • (U.1.1.map (pderiv ℂ μ)) := by - refine Matrix.ext fun i j => ?_ - simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] - exact hleib _ _ - rw [downMatrix, jetActionMatrix, hmap, Matrix.smul_mul, Matrix.sub_mul, - Matrix.mul_smul, hm₃U₃, Matrix.smul_mul, Matrix.one_mul, - smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) Complex.I, - smul_sub, smul_smul Complex.I Complex.I, Complex.I_mul_I, neg_one_smul, - ← smul_assoc, neg_sub, sub_neg_eq_add, smul_smul] - congr 1 - congr 1 - rw [maurerCartanForm_toU1Value, sq, hleib, hsu, Algebra.smul_def, - Algebra.smul_def, Algebra.smul_def, map_ofNat] - linear_combination (-(2 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) - * star ((U.2.2 : unitary JetRing) : JetRing) - * star ((U.2.2 : unitary JetRing) : JetRing) - * star ((U.2.2 : unitary JetRing) : JetRing))) * hiC - -/-- **The equivariance identity** for the colour matrix of the jet gauge action: the - colour matrix intertwines the constant jet action matrix with its adjoint - transform. -/ -lemma downMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : - downMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c) - = jetActionMatrix (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c)) - * downMatrix U := by - have hU₃u : star U.1.1 * U.1.1 = 1 := - Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 - rw [downMatrix, jetActionMatrix, jetActionMatrix, - JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.adjointMap_toU1Value] - conv_lhs => rw [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_sub, Matrix.mul_smul, - Matrix.mul_one] - conv_rhs => rw [Matrix.smul_mul, Matrix.sub_mul, Matrix.mul_smul, - Matrix.smul_mul, Matrix.one_mul, Matrix.mul_assoc, hU₃u, Matrix.mul_one] - rw [smul_sub, smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) - ((2 : ℂ) • (JetGaugeAlgebra.ofConstant c).toU1Value)] - -/-- The iterated formal derivative of a negation. -/ -private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : - x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) - = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by - induction x using Multiset.induction_on generalizing f with - | empty => rfl - | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] - -set_option maxHeartbeats 1000000 in -/-- **The base-point Taylor coefficients of the jet gauge action** on the down-type - singlet are the colour endomorphisms of the base-point Taylor coefficients of the - colour matrix. -/ -lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - IsGaugeField.repCoeff repJetGaugeGroupI U x - = colourEnd ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by - refine LinearMap.ext fun d => ?_ - apply valLinEquiv.injective - rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x d - = StandardModel.jetEval (StandardModel.jetIteratedDeriv x - (repJetGaugeGroupI U (StandardModel.jetOfConstant d))) from rfl, - valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, - colourEnd_apply_mk, LinearEquiv.apply_symm_apply, - repJetGaugeGroupI_eq_downMatrix, LinearEquiv.apply_symm_apply, - StandardModel.jetOfConstant_apply] - obtain ⟨w⟩ := d - induction w using TensorProduct.induction_on with - | zero => - rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero] - simp - rw [show (0 : DownSinglet).val = 0 from rfl, map_zero] - | add a b ha hb => - rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, - TensorProduct.tmul_add, map_add, map_add, map_add, map_add, ha, hb, map_add, - map_add] - | tmul ψ c => - rw [show jetValLinEquiv ((1 : JetRing) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) - = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing)) from rfl, - show (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) - Fermion.RightHandedWeyl - ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)).restrictScalars ℂ)) - (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) - = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) - (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) from rfl, - TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, - LinearMap.id_apply, - show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) = ψ ⊗ₜ[ℂ] c from rfl, - show (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) - Fermion.RightHandedWeyl - (Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) (ψ ⊗ₜ[ℂ] c) - = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c) from rfl] - congr 1 - refine WithLp.ofLp_injective 2 ?_ - funext j - show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) - (((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) - (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j)) - = ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j - rw [show ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) - (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j - = ∑ k, downMatrix U j k * (c.ofLp k • (1 : JetRing)) from by - simp [Matrix.toLpLin_toLp, Matrix.toLin'_apply, Matrix.mulVec_eq_sum, - Finset.sum_apply, mul_comm], - show ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j - = ∑ k, constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (downMatrix U j k)) - * c.ofLp k from by - simp [Matrix.toLpLin_toLp, Matrix.toLin'_apply, Matrix.mulVec_eq_sum, - Finset.sum_apply, mul_comm], - JetRing.foldl_pderiv_sum, map_sum] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, - mul_comm] - -set_option maxHeartbeats 1000000 in -/-- **The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action - underlying the jet gauge action on the down-type singlet**: its base-point Taylor - coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the - adjoint transports. -/ -theorem isInfinitesimalActionOf : - GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by - constructor - · intro U μ x - have hMcons : ((downMatrix U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) - = -((x.antidiagonal.map fun p => - actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U μ))) - * ((downMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by - rw [show ((downMatrix U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) - = (((downMatrix U).map fun f => pderiv ℂ μ f).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from - Matrix.ext fun i j => by - rw [Matrix.map_apply, Matrix.map_apply, Matrix.map_apply, - Multiset.foldl_cons], - downMatrix_map_pderiv, - show ((-(jetActionMatrix (maurerCartanForm U μ) * downMatrix U)).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) - = -(((jetActionMatrix (maurerCartanForm U μ) * downMatrix U)).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from - Matrix.ext fun i j => by - rw [Matrix.map_apply, Matrix.neg_apply, Matrix.neg_apply, - Matrix.map_apply, foldl_pderiv_neg, map_neg], - matrix_constantCoeff_foldl_pderiv_mul] - exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl - fun p hp => by rw [jetActionMatrix_map_cc_foldl])) - rw [repCoeff_eq, hMcons, colourEnd_neg, colourEnd_multiset_sum, Multiset.map_map] - refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl - fun p hp => ?_)) - rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] - rfl - · intro U x c - have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by - rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, - Algebra.algebraMap_self_apply, ← map_mul] - have hconst : jetActionMatrix (JetGaugeAlgebra.ofConstant c) - = (actionMatrix c).map (C : ℂ → JetRing) := by - refine Matrix.ext fun i j => ?_ - rw [jetActionMatrix, actionMatrix, JetGaugeAlgebra.ofConstant_toSU3Matrix, - JetGaugeAlgebra.ofConstant_toU1Value, Matrix.map_apply, Matrix.smul_apply, - Matrix.sub_apply, Matrix.map_apply, Matrix.smul_apply, Matrix.smul_apply, - Matrix.sub_apply, Matrix.smul_apply] - by_cases hij : i = j - · subst hij - rw [Matrix.one_apply_eq, Matrix.one_apply_eq] - simp only [smul_eq_mul, mul_one] - rw [hCsmul, ← map_sub, hCsmul] - · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, - sub_zero, sub_zero, hCsmul] - exact congrArg C (by ring) - have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), - (((actionMatrix c).map (C : ℂ → JetRing)).map fun f => - constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) - = if m = 0 then actionMatrix c else 0 := by - intro m - rcases eq_or_ne m 0 with rfl | hm - · refine Matrix.ext fun i j => ?_ - simp [Matrix.map_apply, constantCoeff_C] - · refine Matrix.ext fun i j => ?_ - simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] - have hMact : ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c - = (x.antidiagonal.map fun p => - actionMatrix (IsGaugeField.adjointCoeff U p.1 c) - * ((downMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by - have h1 : ((downMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c)).map - fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) - = ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) - * actionMatrix c := by - rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, - Multiset.map_congr rfl (fun p hp => by rw [hcollapse p.2]), - Multiset.sum_antidiagonal_eq_of_snd_ne_zero x - (fun p => ((downMatrix U).map fun f => - constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * - (if p.2 = 0 then actionMatrix c else 0)) - (fun p hp => by rw [if_neg hp, Matrix.mul_zero]), - if_pos rfl] - rw [← h1, downMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] - exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by - rw [jetActionMatrix_map_cc_foldl, - show JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) - = IsGaugeField.adjointCoeff U p.1 c from rfl]) - rw [repCoeff_eq, - show (colourEnd ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) - ∘ₗ gaugeAlgebraAction c - = colourEnd (((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) - * actionMatrix c) from by - rw [colourEnd_mul]; rfl, - hMact, colourEnd_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] - rfl - -end InfinitesimalAction - end DownSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean new file mode 100644 index 000000000..d861fb85c --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -0,0 +1,610 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +/-! + +# The infinitesimal gauge action on the down-type singlet + +## i. Overview + +The infinitesimal `(3, 1)_{-2}` action of the gauge algebra on the down-type singlet, +and the proof that it is the infinitesimal action underlying the jet gauge action +`DownSinglet.repJetGaugeGroupI`, in the sense of +`GaugeAlgebra.IsInfinitesimalActionOf`. + +## ii. Key results + +- `DownSinglet.gaugeAlgebraAction` : the infinitesimal `(3, 1)_{-2}` action. +- `DownSinglet.isInfinitesimalActionOf` : the action underlies the jet gauge action. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups + +namespace DownSinglet + +/-! + +## The action of the gauge algebra + +The infinitesimal `(3, 1)_{-2}` action of the gauge algebra on the down-type singlet: +the colour part of the algebra element acts on the colour index and the hypercharge +part scales, both through the physicists' factor of `i`, matching the group action +`(star u) ^ 2 • U₃` infinitesimally. The compatibility with the jet gauge action — +`GaugeAlgebra.IsInfinitesimalActionOf` — is proved at the end of this file. + +-/ + +/-- The endomorphism of the down singlet defined by a `3 × 3` complex matrix acting on + the colour index, with the Weyl factor untouched. -/ +noncomputable def colourEnd (A : Matrix (Fin 3) (Fin 3) ℂ) : + DownSinglet →ₗ[ℂ] DownSinglet := + valLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ valLinEquiv.toLinearMap + +lemma colourEnd_apply_mk (A : Matrix (Fin 3) (Fin 3) ℂ) (v : DownSinglet) : + colourEnd A v + = valLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) (valLinEquiv v)) := rfl + +lemma colourEnd_add (A B : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (A + B) = colourEnd A + colourEnd B := by + rw [colourEnd, colourEnd, colourEnd, map_add, map_add, LinearMap.add_comp, + LinearMap.comp_add] + +lemma colourEnd_smul (z : ℂ) (A : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (z • A) = z • colourEnd A := by + rw [colourEnd, colourEnd, map_smul, map_smul, LinearMap.smul_comp, + LinearMap.comp_smul] + +lemma colourEnd_zero : colourEnd 0 = 0 := by + rw [colourEnd, map_zero, map_zero, LinearMap.zero_comp, LinearMap.comp_zero] + +lemma colourEnd_neg (A : Matrix (Fin 3) (Fin 3) ℂ) : colourEnd (-A) = -colourEnd A := by + rw [show (-A : Matrix (Fin 3) (Fin 3) ℂ) = (-1 : ℂ) • A from by rw [neg_one_smul], + colourEnd_smul, neg_one_smul] + +lemma colourEnd_multiset_sum (m : Multiset (Matrix (Fin 3) (Fin 3) ℂ)) : + colourEnd m.sum = (m.map colourEnd).sum := by + induction m using Multiset.induction_on with + | empty => simp [colourEnd_zero] + | cons A t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + colourEnd_add, ih] + +/-- The colour endomorphisms compose through matrix multiplication. -/ +lemma colourEnd_mul (A B : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (A * B) = colourEnd A ∘ₗ colourEnd B := by + refine LinearMap.ext fun v => ?_ + rw [colourEnd_apply_mk, map_mul, map_mul, LinearMap.comp_apply, colourEnd_apply_mk, + colourEnd_apply_mk, LinearEquiv.apply_symm_apply] + rfl + +/-- The matrix of the infinitesimal `(3, 1)_{-2}` action of a gauge algebra element on + the colour index: `i` times the colour part, shifted by `i` times `-2` the + hypercharge. -/ +noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ := + Complex.I • (c.toSU3Matrix - ((2 : ℂ) • c.toU1Value) • 1) + +/-- **The infinitesimal action of the gauge algebra on the down-type singlet**: the + derivative of the `(3, 1)_{-2}` action of the gauge group, real-linear in the + algebra slot and complex-linear in the value slot — the form consumed by the + covariant derivative `IsGaugeField.covDerivIter` and by + `GaugeAlgebra.IsInfinitesimalActionOf`. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℂ] DownSinglet where + toFun c := colourEnd (actionMatrix c) + map_add' c₁ c₂ := by + rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by + rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU3Matrix, + GaugeAlgebra.add_toU1Value] + module] + rw [colourEnd_add] + map_smul' r c := by + rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by + rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU3Matrix, + GaugeAlgebra.smul_toU1Value, + show (r • c.toSU3Matrix : Matrix (Fin 3) (Fin 3) ℂ) + = (r : ℂ) • c.toSU3Matrix from by + rw [← algebraMap_smul ℂ r c.toSU3Matrix]; rfl, + show r • c.toU1Value = (r : ℂ) • c.toU1Value from by + rw [← algebraMap_smul ℂ r c.toU1Value]; rfl] + module, + colourEnd_smul] + refine LinearMap.ext fun v => ?_ + rw [RingHom.id_apply] + show (r : ℂ) • colourEnd (actionMatrix c) v = r • colourEnd (actionMatrix c) v + rw [show ((r : ℝ) : ℂ) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] + +/-! + +## The infinitesimal action underlies the jet gauge action + +The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action underlying the +jet gauge action, in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`: the base-point +Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and +intertwine the action with the adjoint transports. The proofs work through the colour +matrix of the jet action and the all-orders matrix Leibniz rule at the base point. + +-/ + +section InfinitesimalAction + +open MvPowerSeries + +/-- A single formal derivative commutes with the iterated one. -/ +private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f : JetRing) : + pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) f) + = x.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, ih, JetRing.pderiv_comm] + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) + = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] + +/-- The iterated formal derivative of a difference. -/ +private lemma foldl_pderiv_sub (x : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (f - g) + = x.foldl (fun h ρ => pderiv ℂ ρ h) f - x.foldl (fun h ρ => pderiv ℂ ρ h) g := by + induction x using Multiset.induction_on generalizing f g with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_sub, ih, Multiset.foldl_cons, + Multiset.foldl_cons] + +/-- The jet-valued matrix of the infinitesimal `(3, 1)_{-2}` action of a jet of gauge + algebra elements: the jet analogue of `actionMatrix`. -/ +noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 3) (Fin 3) JetRing := + Complex.I • (a.toSU3Matrix - ((2 : ℂ) • a.toU1Value) • 1) + +/-- The base-point Taylor coefficients of the jet action matrix are the action matrices + of the base-point Taylor coefficients. -/ +lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + ((jetActionMatrix a).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := by + ext i j + rw [Matrix.map_apply, jetActionMatrix, actionMatrix, Matrix.smul_apply, + Matrix.sub_apply, Matrix.smul_apply, Matrix.smul_apply, Matrix.sub_apply, + Matrix.smul_apply, foldl_pderiv_smul, constantCoeff_smul, foldl_pderiv_sub, + map_sub, JetGaugeAlgebra.eval_iteratedDeriv_toSU3Matrix, Matrix.map_apply] + congr 2 + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq, smul_eq_mul, mul_one, smul_eq_mul, + mul_one, foldl_pderiv_smul, constantCoeff_smul, + JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + JetRing.foldl_pderiv_zero, map_zero] + +/-- The `JetRing`-valued colour matrix of the jet gauge action on the down singlet: the + colour matrix of the gauge jet carrying the `-2` hypercharge phase. -/ +noncomputable def downMatrix (U : JetGaugeGroupI) : Matrix (Fin 3) (Fin 3) JetRing := + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + +lemma repJetGaugeGroupI_eq_downMatrix (U : JetGaugeGroupI) + (z : JetRing ⊗[ℂ] DownSinglet) : + repJetGaugeGroupI U z + = jetValLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)).restrictScalars ℂ) + (jetValLinEquiv z)) := rfl + +/-- The entrywise formal derivative on the colour coordinates, as a `ℂ`-linear map. -/ +private noncomputable def pderivColour (μ : Fin 1 ⊕ Fin 3) : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where + toFun v := WithLp.toLp 2 fun i => pderiv ℂ μ (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact Derivation.map_smul _ _ _ + +/-- The entrywise iterated formal derivative on the colour coordinates. -/ +private noncomputable def foldColour (x : Multiset (Fin 1 ⊕ Fin 3)) : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where + toFun v := WithLp.toLp 2 fun i => x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact JetRing.foldl_pderiv_add x _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact foldl_pderiv_smul x z _ + +/-- The entrywise base-point evaluation on the colour coordinates. -/ +private noncomputable def ccColour : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace ℂ (Fin 3) where + toFun v := WithLp.toLp 2 fun i => constantCoeff (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact constantCoeff_smul _ _ + +private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + pderivColour μ ∘ₗ foldColour x = foldColour (μ ::ₘ x) := by + refine LinearMap.ext fun v => ?_ + refine WithLp.ofLp_injective 2 ?_ + funext i + show pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i)) + = (μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + rw [Multiset.foldl_cons, pderiv_foldl] + +/-- The identification of down-singlet jets intertwines the formal derivative with the + entrywise derivative on the colour coordinates. -/ +private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (z : JetRing ⊗[ℂ] DownSinglet) : + jetValLinEquiv (StandardModel.jetDeriv μ z) + = (TensorProduct.map LinearMap.id (pderivColour μ)) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero, + map_zero, map_zero, map_zero] + | tmul ψ c => + rw [show StandardModel.jetDeriv μ (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) from rfl, + show jetValLinEquiv ((pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • pderiv ℂ μ f) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + exact (Derivation.map_smul (pderiv ℂ μ) (c.ofLp i) f).symm + | add a b ha hb => + rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +/-- The identification of down-singlet jets intertwines the iterated formal derivative + with the entrywise iterated derivative on the colour coordinates. -/ +private lemma jetValLinEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] DownSinglet) : + jetValLinEquiv (StandardModel.jetIteratedDeriv x z) + = (TensorProduct.map LinearMap.id (foldColour x)) (jetValLinEquiv z) := by + induction x using Multiset.induction_on with + | empty => + rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, + show foldColour 0 = LinearMap.id from LinearMap.ext fun v => + WithLp.ofLp_injective 2 rfl, + TensorProduct.map_id, LinearMap.id_apply] + | cons μ t ih => + rw [StandardModel.jetIteratedDeriv_cons, LinearMap.comp_apply, + jetValLinEquiv_jetDeriv, ih, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, pderivColour_comp_foldColour] + +/-- The base-point evaluation of a down-singlet jet through the colour coordinates. -/ +private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] DownSinglet) : + valLinEquiv (StandardModel.jetEval z) + = (TensorProduct.map LinearMap.id ccColour) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp; rfl + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rfl + | tmul ψ c => + rw [StandardModel.jetEval_tmul, map_smul, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) = ψ ⊗ₜ[ℂ] c from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply, ← TensorProduct.tmul_smul] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + show (constantCoeff f • c).ofLp i = constantCoeff (c.ofLp i • f) + simp [constantCoeff_smul, mul_comm] + | add a b ha hb => + rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +set_option maxHeartbeats 1000000 in +/-- **The derivative identity** for the colour matrix of the jet gauge action: the + formal derivative of the colour matrix is minus the jet action matrix of the + Maurer–Cartan form times the colour matrix. -/ +lemma downMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (downMatrix U).map (fun f => pderiv ℂ μ f) + = -(jetActionMatrix (maurerCartanForm U μ) * downMatrix U) := by + have hleib : ∀ f g : JetRing, + pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] + have huu : ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + have h0 : pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) = 0 := by + have h := congrArg (pderiv ℂ μ) huu + rw [hleib, Derivation.map_one_eq_zero] at h + exact h + have hsu : pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) + = -(pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * (star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing))) := by + have h1 : star ((U.2.2 : unitary JetRing) : JetRing) + * (pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing))) = 0 := by + rw [h0, mul_zero] + linear_combination h1 + - pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) * huu + have hm₃U₃ : (maurerCartanForm U μ).toSU3Matrix * U.1.1 + = Complex.I • U.1.1.map (pderiv ℂ μ) := by + rw [maurerCartanForm_toSU3Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₃u, + Matrix.mul_one] + have hiC : (algebraMap ℂ JetRing) Complex.I * (algebraMap ℂ JetRing) Complex.I + = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + have hmap : ((((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)).map fun f => pderiv ℂ μ f) + = (pderiv ℂ μ ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2)) • U.1.1 + + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) + • (U.1.1.map (pderiv ℂ μ)) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] + exact hleib _ _ + rw [downMatrix, jetActionMatrix, hmap, Matrix.smul_mul, Matrix.sub_mul, + Matrix.mul_smul, hm₃U₃, Matrix.smul_mul, Matrix.one_mul, + smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) Complex.I, + smul_sub, smul_smul Complex.I Complex.I, Complex.I_mul_I, neg_one_smul, + ← smul_assoc, neg_sub, sub_neg_eq_add, smul_smul] + congr 1 + congr 1 + rw [maurerCartanForm_toU1Value, sq, hleib, hsu, Algebra.smul_def, + Algebra.smul_def, Algebra.smul_def, map_ofNat] + linear_combination (-(2 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing))) * hiC + +/-- **The equivariance identity** for the colour matrix of the jet gauge action: the + colour matrix intertwines the constant jet action matrix with its adjoint + transform. -/ +lemma downMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : + downMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = jetActionMatrix (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c)) + * downMatrix U := by + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rw [downMatrix, jetActionMatrix, jetActionMatrix, + JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.adjointMap_toU1Value] + conv_lhs => rw [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_sub, Matrix.mul_smul, + Matrix.mul_one] + conv_rhs => rw [Matrix.smul_mul, Matrix.sub_mul, Matrix.mul_smul, + Matrix.smul_mul, Matrix.one_mul, Matrix.mul_assoc, hU₃u, Matrix.mul_one] + rw [smul_sub, smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 2) + ((2 : ℂ) • (JetGaugeAlgebra.ofConstant c).toU1Value)] + +/-- The iterated formal derivative of a negation. -/ +private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) + = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] + +set_option maxHeartbeats 1000000 in +/-- **The base-point Taylor coefficients of the jet gauge action** on the down-type + singlet are the colour endomorphisms of the base-point Taylor coefficients of the + colour matrix. -/ +lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff repJetGaugeGroupI U x + = colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + refine LinearMap.ext fun d => ?_ + apply valLinEquiv.injective + rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x d + = StandardModel.jetEval (StandardModel.jetIteratedDeriv x + (repJetGaugeGroupI U (StandardModel.jetOfConstant d))) from rfl, + valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, + colourEnd_apply_mk, LinearEquiv.apply_symm_apply, + repJetGaugeGroupI_eq_downMatrix, LinearEquiv.apply_symm_apply, + StandardModel.jetOfConstant_apply] + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : DownSinglet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rw [show (0 : DownSinglet).val = 0 from rfl, map_zero] + | add a b ha hb => + rw [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, map_add, map_add, ha, hb, map_add, + map_add] + | tmul ψ c => + rw [show jetValLinEquiv ((1 : JetRing) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing)) from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)).restrictScalars ℂ)) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) from rfl, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : DownSinglet) = ψ ⊗ₜ[ℂ] c from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) + Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) (ψ ⊗ₜ[ℂ] c) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext j + show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + (((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j)) + = ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + rw [show ((Matrix.toLpLinAlgEquiv 2 (downMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j + = ∑ k, downMatrix U j k * (c.ofLp k • (1 : JetRing)) from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + show ((Matrix.toLpLinAlgEquiv 2 ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + = ∑ k, constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (downMatrix U j k)) + * c.ofLp k from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + JetRing.foldl_pderiv_sum, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, + mul_comm] + +set_option maxHeartbeats 1000000 in +/-- **The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action + underlying the jet gauge action on the down-type singlet**: its base-point Taylor + coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the + adjoint transports. -/ +theorem isInfinitesimalActionOf : + GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + constructor + · intro U μ x + have hMcons : ((downMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -((x.antidiagonal.map fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((downMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + rw [show ((downMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (((downMatrix U).map fun f => pderiv ℂ μ f).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.map_apply, Matrix.map_apply, + Multiset.foldl_cons], + downMatrix_map_pderiv, + show ((-(jetActionMatrix (maurerCartanForm U μ) * downMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -(((jetActionMatrix (maurerCartanForm U μ) * downMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.neg_apply, Matrix.neg_apply, + Matrix.map_apply, foldl_pderiv_neg, map_neg], + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [jetActionMatrix_map_cc_foldl])) + rw [repCoeff_eq, hMcons, colourEnd_neg, colourEnd_multiset_sum, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => ?_)) + rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] + rfl + · intro U x c + have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + Algebra.algebraMap_self_apply, ← map_mul] + have hconst : jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = (actionMatrix c).map (C : ℂ → JetRing) := by + refine Matrix.ext fun i j => ?_ + rw [jetActionMatrix, actionMatrix, JetGaugeAlgebra.ofConstant_toSU3Matrix, + JetGaugeAlgebra.ofConstant_toU1Value, Matrix.map_apply, Matrix.smul_apply, + Matrix.sub_apply, Matrix.map_apply, Matrix.smul_apply, Matrix.smul_apply, + Matrix.sub_apply, Matrix.smul_apply] + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq] + simp only [smul_eq_mul, mul_one] + rw [hCsmul, ← map_sub, hCsmul] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + sub_zero, sub_zero, hCsmul] + exact congrArg C (by ring) + have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), + (((actionMatrix c).map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then actionMatrix c else 0 := by + intro m + rcases eq_or_ne m 0 with rfl | hm + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, constantCoeff_C] + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] + have hMact : ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c + = (x.antidiagonal.map fun p => + actionMatrix (IsGaugeField.adjointCoeff U p.1 c) + * ((downMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have h1 : ((downMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c := by + rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun p hp => by rw [hcollapse p.2]), + Multiset.sum_antidiagonal_eq_of_snd_ne_zero x + (fun p => ((downMatrix U).map fun f => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if p.2 = 0 then actionMatrix c else 0)) + (fun p hp => by rw [if_neg hp, Matrix.mul_zero]), + if_pos rfl] + rw [← h1, downMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [jetActionMatrix_map_cc_foldl, + show JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) + = IsGaugeField.adjointCoeff U p.1 c from rfl]) + rw [repCoeff_eq, + show (colourEnd ((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + ∘ₗ gaugeAlgebraAction c + = colourEnd (((downMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c) from by + rw [colourEnd_mul]; rfl, + hMact, colourEnd_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] + rfl + +end InfinitesimalAction + +end DownSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean new file mode 100644 index 000000000..da8e24eff --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -0,0 +1,623 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# The infinitesimal gauge action on the lepton doublet + +## i. Overview + +The infinitesimal `(1, 2)_{-3}` action of the gauge algebra on the lepton doublet: the +weak part of the algebra element acts on the weak index and the hypercharge part scales, +both through the physicists' factor of `i`, matching the group action +`(star u) ^ 3 • U₂` infinitesimally. The compatibility with the jet gauge action — +`GaugeAlgebra.IsInfinitesimalActionOf` — is proved at the end of this file: the +base-point Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law +and intertwine the action with the adjoint transports. The proofs work through the weak +matrix of the jet action and the all-orders matrix Leibniz rule at the base point. + +## ii. Key results + +- `weakEnd` : the endomorphism of the lepton doublet defined by a `2 × 2` matrix on the + weak index. +- `gaugeAlgebraAction` : the infinitesimal `(1, 2)_{-3}` action of the gauge algebra. +- `isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal action + underlying the jet gauge action `repJetGaugeGroupI`. + +## iii. Table of contents + +- A. The action of the gauge algebra +- B. The infinitesimal action underlies the jet gauge action + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +namespace LeptonDoublet + +open Matrix MatrixGroups + +/-! + +## A. The action of the gauge algebra + +-/ + +/-- The endomorphism of the lepton doublet defined by a `2 × 2` complex matrix acting on + the weak index, with the Weyl factor untouched. -/ +noncomputable def weakEnd (A : Matrix (Fin 2) (Fin 2) ℂ) : + LeptonDoublet →ₗ[ℂ] LeptonDoublet := + valLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 2)) Fermion.LeftHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ valLinEquiv.toLinearMap + +lemma weakEnd_apply_mk (A : Matrix (Fin 2) (Fin 2) ℂ) (v : LeptonDoublet) : + weakEnd A v + = valLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 2)) Fermion.LeftHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) (valLinEquiv v)) := rfl + +lemma weakEnd_add (A B : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (A + B) = weakEnd A + weakEnd B := by + rw [weakEnd, weakEnd, weakEnd, map_add, map_add, LinearMap.add_comp, + LinearMap.comp_add] + +lemma weakEnd_smul (z : ℂ) (A : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (z • A) = z • weakEnd A := by + rw [weakEnd, weakEnd, map_smul, map_smul, LinearMap.smul_comp, + LinearMap.comp_smul] + +lemma weakEnd_zero : weakEnd 0 = 0 := by + rw [weakEnd, map_zero, map_zero, LinearMap.zero_comp, LinearMap.comp_zero] + +lemma weakEnd_neg (A : Matrix (Fin 2) (Fin 2) ℂ) : weakEnd (-A) = -weakEnd A := by + rw [show (-A : Matrix (Fin 2) (Fin 2) ℂ) = (-1 : ℂ) • A from by rw [neg_one_smul], + weakEnd_smul, neg_one_smul] + +lemma weakEnd_multiset_sum (m : Multiset (Matrix (Fin 2) (Fin 2) ℂ)) : + weakEnd m.sum = (m.map weakEnd).sum := by + induction m using Multiset.induction_on with + | empty => simp [weakEnd_zero] + | cons A t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + weakEnd_add, ih] + +/-- The weak endomorphisms compose through matrix multiplication. -/ +lemma weakEnd_mul (A B : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (A * B) = weakEnd A ∘ₗ weakEnd B := by + refine LinearMap.ext fun v => ?_ + rw [weakEnd_apply_mk, map_mul, map_mul, LinearMap.comp_apply, weakEnd_apply_mk, + weakEnd_apply_mk, LinearEquiv.apply_symm_apply] + rfl + +/-- The matrix of the infinitesimal `(1, 2)_{-3}` action of a gauge algebra element on + the weak index: `i` times the weak part, shifted by `i` times `-3` the + hypercharge. -/ +noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ := + Complex.I • (c.toSU2Matrix - ((3 : ℂ) • c.toU1Value) • 1) + +/-- **The infinitesimal action of the gauge algebra on the lepton doublet**: the + derivative of the `(1, 2)_{-3}` action of the gauge group, real-linear in the + algebra slot and complex-linear in the value slot — the form consumed by the + covariant derivative `IsGaugeField.covDerivIter` and by + `GaugeAlgebra.IsInfinitesimalActionOf`. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] LeptonDoublet →ₗ[ℂ] LeptonDoublet where + toFun c := weakEnd (actionMatrix c) + map_add' c₁ c₂ := by + rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by + rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU2Matrix, + GaugeAlgebra.add_toU1Value] + module] + rw [weakEnd_add] + map_smul' r c := by + rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by + rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU2Matrix, + GaugeAlgebra.smul_toU1Value, + show (r • c.toSU2Matrix : Matrix (Fin 2) (Fin 2) ℂ) + = (r : ℂ) • c.toSU2Matrix from by + rw [← algebraMap_smul ℂ r c.toSU2Matrix]; rfl, + show r • c.toU1Value = (r : ℂ) • c.toU1Value from by + rw [← algebraMap_smul ℂ r c.toU1Value]; rfl] + module, + weakEnd_smul] + refine LinearMap.ext fun v => ?_ + rw [RingHom.id_apply] + show (r : ℂ) • weakEnd (actionMatrix c) v = r • weakEnd (actionMatrix c) v + rw [show ((r : ℝ) : ℂ) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] + +/-! + +## B. The infinitesimal action underlies the jet gauge action + +The `(1, 2)_{-3}` action of the gauge algebra is the infinitesimal action underlying the +jet gauge action, in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`: the base-point +Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and +intertwine the action with the adjoint transports. The proofs work through the weak +matrix of the jet action and the all-orders matrix Leibniz rule at the base point. + +-/ + +section InfinitesimalAction + +open MvPowerSeries + +/-- A single formal derivative commutes with the iterated one. -/ +private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f : JetRing) : + pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) f) + = x.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, ih, JetRing.pderiv_comm] + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) + = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] + +/-- The iterated formal derivative of a difference. -/ +private lemma foldl_pderiv_sub (x : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (f - g) + = x.foldl (fun h ρ => pderiv ℂ ρ h) f - x.foldl (fun h ρ => pderiv ℂ ρ h) g := by + induction x using Multiset.induction_on generalizing f g with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_sub, ih, Multiset.foldl_cons, + Multiset.foldl_cons] + +/-- The jet-valued matrix of the infinitesimal `(1, 2)_{-3}` action of a jet of gauge + algebra elements: the jet analogue of `actionMatrix`. -/ +noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 2) (Fin 2) JetRing := + Complex.I • (a.toSU2Matrix - ((3 : ℂ) • a.toU1Value) • 1) + +/-- The base-point Taylor coefficients of the jet action matrix are the action matrices + of the base-point Taylor coefficients. -/ +lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + ((jetActionMatrix a).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := by + ext i j + rw [Matrix.map_apply, jetActionMatrix, actionMatrix, Matrix.smul_apply, + Matrix.sub_apply, Matrix.smul_apply, Matrix.smul_apply, Matrix.sub_apply, + Matrix.smul_apply, foldl_pderiv_smul, constantCoeff_smul, foldl_pderiv_sub, + map_sub, JetGaugeAlgebra.eval_iteratedDeriv_toSU2Matrix, Matrix.map_apply] + congr 2 + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq, smul_eq_mul, mul_one, smul_eq_mul, + mul_one, foldl_pderiv_smul, constantCoeff_smul, + JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + JetRing.foldl_pderiv_zero, map_zero] + +/-- The `JetRing`-valued weak matrix of the jet gauge action on the lepton doublet: the + weak matrix of the gauge jet carrying the `-3` hypercharge phase. -/ +noncomputable def doubletMatrix (U : JetGaugeGroupI) : Matrix (Fin 2) (Fin 2) JetRing := + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + +lemma repJetGaugeGroupI_eq_doubletMatrix (U : JetGaugeGroupI) + (z : JetRing ⊗[ℂ] LeptonDoublet) : + repJetGaugeGroupI U z + = jetValLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 2)) + Fermion.LeftHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (doubletMatrix U)).restrictScalars ℂ) + (jetValLinEquiv z)) := rfl + +/-- The entrywise formal derivative on the weak coordinates, as a `ℂ`-linear map. -/ +private noncomputable def pderivWeak (μ : Fin 1 ⊕ Fin 3) : + EuclideanSpace JetRing (Fin 2) →ₗ[ℂ] EuclideanSpace JetRing (Fin 2) where + toFun v := WithLp.toLp 2 fun i => pderiv ℂ μ (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact Derivation.map_smul _ _ _ + +/-- The entrywise iterated formal derivative on the weak coordinates. -/ +private noncomputable def foldWeak (x : Multiset (Fin 1 ⊕ Fin 3)) : + EuclideanSpace JetRing (Fin 2) →ₗ[ℂ] EuclideanSpace JetRing (Fin 2) where + toFun v := WithLp.toLp 2 fun i => x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact JetRing.foldl_pderiv_add x _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact foldl_pderiv_smul x z _ + +/-- The entrywise base-point evaluation on the weak coordinates. -/ +private noncomputable def ccWeak : + EuclideanSpace JetRing (Fin 2) →ₗ[ℂ] EuclideanSpace ℂ (Fin 2) where + toFun v := WithLp.toLp 2 fun i => constantCoeff (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact constantCoeff_smul _ _ + +private lemma pderivWeak_comp_foldWeak (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + pderivWeak μ ∘ₗ foldWeak x = foldWeak (μ ::ₘ x) := by + refine LinearMap.ext fun v => ?_ + refine WithLp.ofLp_injective 2 ?_ + funext i + show pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i)) + = (μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + rw [Multiset.foldl_cons, pderiv_foldl] + +/-- The identification of lepton-doublet jets intertwines the formal derivative with the + entrywise derivative on the weak coordinates. -/ +private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (z : JetRing ⊗[ℂ] LeptonDoublet) : + jetValLinEquiv (StandardModel.jetDeriv μ z) + = (TensorProduct.map LinearMap.id (pderivWeak μ)) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : LeptonDoublet) = 0 from rfl, TensorProduct.tmul_zero, + map_zero, map_zero, map_zero] + | tmul ψ c => + rw [show StandardModel.jetDeriv μ (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet)) + = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet) from rfl, + show jetValLinEquiv ((pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • pderiv ℂ μ f) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + exact (Derivation.map_smul (pderiv ℂ μ) (c.ofLp i) f).symm + | add a b ha hb => + rw [show ({ val := a + b } : LeptonDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +/-- The identification of lepton-doublet jets intertwines the iterated formal derivative + with the entrywise iterated derivative on the weak coordinates. -/ +private lemma jetValLinEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] LeptonDoublet) : + jetValLinEquiv (StandardModel.jetIteratedDeriv x z) + = (TensorProduct.map LinearMap.id (foldWeak x)) (jetValLinEquiv z) := by + induction x using Multiset.induction_on with + | empty => + rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, + show foldWeak 0 = LinearMap.id from LinearMap.ext fun v => + WithLp.ofLp_injective 2 rfl, + TensorProduct.map_id, LinearMap.id_apply] + | cons μ t ih => + rw [StandardModel.jetIteratedDeriv_cons, LinearMap.comp_apply, + jetValLinEquiv_jetDeriv, ih, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, pderivWeak_comp_foldWeak] + +/-- The base-point evaluation of a lepton-doublet jet through the weak coordinates. -/ +private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] LeptonDoublet) : + valLinEquiv (StandardModel.jetEval z) + = (TensorProduct.map LinearMap.id ccWeak) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp; rfl + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : LeptonDoublet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rfl + | tmul ψ c => + rw [StandardModel.jetEval_tmul, map_smul, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet) = ψ ⊗ₜ[ℂ] c from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply, ← TensorProduct.tmul_smul] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + show (constantCoeff f • c).ofLp i = constantCoeff (c.ofLp i • f) + simp [constantCoeff_smul, mul_comm] + | add a b ha hb => + rw [show ({ val := a + b } : LeptonDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +set_option maxHeartbeats 1000000 in +/-- **The derivative identity** for the weak matrix of the jet gauge action: the + formal derivative of the weak matrix is minus the jet action matrix of the + Maurer–Cartan form times the weak matrix. -/ +lemma doubletMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (doubletMatrix U).map (fun f => pderiv ℂ μ f) + = -(jetActionMatrix (maurerCartanForm U μ) * doubletMatrix U) := by + have hleib : ∀ f g : JetRing, + pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] + have huu : ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 + have hU₂u : star U.2.1.1 * U.2.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + have h0 : pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) = 0 := by + have h := congrArg (pderiv ℂ μ) huu + rw [hleib, Derivation.map_one_eq_zero] at h + exact h + have hsu : pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) + = -(pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * (star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing))) := by + have h1 : star ((U.2.2 : unitary JetRing) : JetRing) + * (pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing))) = 0 := by + rw [h0, mul_zero] + linear_combination h1 + - pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) * huu + have hm₂U₂ : (maurerCartanForm U μ).toSU2Matrix * U.2.1.1 + = Complex.I • U.2.1.1.map (pderiv ℂ μ) := by + rw [maurerCartanForm_toSU2Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₂u, + Matrix.mul_one] + have hiC : (algebraMap ℂ JetRing) Complex.I * (algebraMap ℂ JetRing) Complex.I + = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + have hmap : ((((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)).map fun f => pderiv ℂ μ f) + = (pderiv ℂ μ ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3)) • U.2.1.1 + + ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) + • (U.2.1.1.map (pderiv ℂ μ)) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] + exact hleib _ _ + rw [doubletMatrix, jetActionMatrix, hmap, Matrix.smul_mul, Matrix.sub_mul, + Matrix.mul_smul, hm₂U₂, Matrix.smul_mul, Matrix.one_mul, + smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) Complex.I, + smul_sub, smul_smul Complex.I Complex.I, Complex.I_mul_I, neg_one_smul, + ← smul_assoc, neg_sub, sub_neg_eq_add, smul_smul] + congr 1 + congr 1 + rw [maurerCartanForm_toU1Value, + show (star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3 + = (star ((U.2.2 : unitary JetRing) : JetRing)) + * (star ((U.2.2 : unitary JetRing) : JetRing)) + * (star ((U.2.2 : unitary JetRing) : JetRing)) from by ring, + hleib, hleib, hsu, Algebra.smul_def, Algebra.smul_def, Algebra.smul_def, + map_ofNat] + linear_combination (-(3 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing))) * hiC + +/-- **The equivariance identity** for the weak matrix of the jet gauge action: the + weak matrix intertwines the constant jet action matrix with its adjoint + transform. -/ +lemma doubletMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : + doubletMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = jetActionMatrix (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c)) + * doubletMatrix U := by + have hU₂u : star U.2.1.1 * U.2.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rw [doubletMatrix, jetActionMatrix, jetActionMatrix, + JetGaugeAlgebra.adjointMap_toSU2Matrix, JetGaugeAlgebra.adjointMap_toU1Value] + conv_lhs => rw [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_sub, Matrix.mul_smul, + Matrix.mul_one] + conv_rhs => rw [Matrix.smul_mul, Matrix.sub_mul, Matrix.mul_smul, + Matrix.smul_mul, Matrix.one_mul, Matrix.mul_assoc, hU₂u, Matrix.mul_one] + rw [smul_sub, smul_comm ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) + ((3 : ℂ) • (JetGaugeAlgebra.ofConstant c).toU1Value)] + +/-- The iterated formal derivative of a negation. -/ +private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) + = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] + +set_option maxHeartbeats 1000000 in +/-- **The base-point Taylor coefficients of the jet gauge action** on the lepton + doublet are the weak endomorphisms of the base-point Taylor coefficients of the + weak matrix. -/ +lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff repJetGaugeGroupI U x + = weakEnd ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + refine LinearMap.ext fun d => ?_ + apply valLinEquiv.injective + rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x d + = StandardModel.jetEval (StandardModel.jetIteratedDeriv x + (repJetGaugeGroupI U (StandardModel.jetOfConstant d))) from rfl, + valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, + weakEnd_apply_mk, LinearEquiv.apply_symm_apply, + repJetGaugeGroupI_eq_doubletMatrix, LinearEquiv.apply_symm_apply, + StandardModel.jetOfConstant_apply] + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : LeptonDoublet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rw [show (0 : LeptonDoublet).val = 0 from rfl, map_zero] + | add a b ha hb => + rw [show ({ val := a + b } : LeptonDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, map_add, map_add, ha, hb, map_add, + map_add] + | tmul ψ c => + rw [show jetValLinEquiv ((1 : JetRing) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing)) from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 2)) + Fermion.LeftHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (doubletMatrix U)).restrictScalars ℂ)) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 (doubletMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) from rfl, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : LeptonDoublet) = ψ ⊗ₜ[ℂ] c from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 2)) + Fermion.LeftHandedWeyl + (Matrix.toLpLinAlgEquiv 2 ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) (ψ ⊗ₜ[ℂ] c) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext j + show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + (((Matrix.toLpLinAlgEquiv 2 (doubletMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j)) + = ((Matrix.toLpLinAlgEquiv 2 ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + rw [show ((Matrix.toLpLinAlgEquiv 2 (doubletMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j + = ∑ k, doubletMatrix U j k * (c.ofLp k • (1 : JetRing)) from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + show ((Matrix.toLpLinAlgEquiv 2 ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + = ∑ k, constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (doubletMatrix U j k)) + * c.ofLp k from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + JetRing.foldl_pderiv_sum, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, + mul_comm] + +set_option maxHeartbeats 1000000 in +/-- **The `(1, 2)_{-3}` action of the gauge algebra is the infinitesimal action + underlying the jet gauge action on the lepton doublet**: its base-point Taylor + coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the + adjoint transports. -/ +theorem isInfinitesimalActionOf : + GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + constructor + · intro U μ x + have hMcons : ((doubletMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -((x.antidiagonal.map fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((doubletMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + rw [show ((doubletMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (((doubletMatrix U).map fun f => pderiv ℂ μ f).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.map_apply, Matrix.map_apply, + Multiset.foldl_cons], + doubletMatrix_map_pderiv, + show ((-(jetActionMatrix (maurerCartanForm U μ) * doubletMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -(((jetActionMatrix (maurerCartanForm U μ) * doubletMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.neg_apply, Matrix.neg_apply, + Matrix.map_apply, foldl_pderiv_neg, map_neg], + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [jetActionMatrix_map_cc_foldl])) + rw [repCoeff_eq, hMcons, weakEnd_neg, weakEnd_multiset_sum, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => ?_)) + rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] + rfl + · intro U x c + have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + Algebra.algebraMap_self_apply, ← map_mul] + have hconst : jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = (actionMatrix c).map (C : ℂ → JetRing) := by + refine Matrix.ext fun i j => ?_ + rw [jetActionMatrix, actionMatrix, JetGaugeAlgebra.ofConstant_toSU2Matrix, + JetGaugeAlgebra.ofConstant_toU1Value, Matrix.map_apply, Matrix.smul_apply, + Matrix.sub_apply, Matrix.map_apply, Matrix.smul_apply, Matrix.smul_apply, + Matrix.sub_apply, Matrix.smul_apply] + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq] + simp only [smul_eq_mul, mul_one] + rw [hCsmul, ← map_sub, hCsmul] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + sub_zero, sub_zero, hCsmul] + exact congrArg C (by ring) + have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), + (((actionMatrix c).map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then actionMatrix c else 0 := by + intro m + rcases eq_or_ne m 0 with rfl | hm + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, constantCoeff_C] + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] + have hMact : ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c + = (x.antidiagonal.map fun p => + actionMatrix (IsGaugeField.adjointCoeff U p.1 c) + * ((doubletMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have h1 : ((doubletMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c := by + rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun p hp => by rw [hcollapse p.2]), + Multiset.sum_antidiagonal_eq_of_snd_ne_zero x + (fun p => ((doubletMatrix U).map fun f => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if p.2 = 0 then actionMatrix c else 0)) + (fun p hp => by rw [if_neg hp, Matrix.mul_zero]), + if_pos rfl] + rw [← h1, doubletMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [jetActionMatrix_map_cc_foldl, + show JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) + = IsGaugeField.adjointCoeff U p.1 c from rfl]) + rw [repCoeff_eq, + show (weakEnd ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + ∘ₗ gaugeAlgebraAction c + = weakEnd (((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c) from by + rw [weakEnd_mul]; rfl, + hMact, weakEnd_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] + rfl + +end InfinitesimalAction + +end LeptonDoublet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean new file mode 100644 index 000000000..52ba59e66 --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -0,0 +1,316 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +/-! +# The gauge-algebra action on the charged-lepton singlet + +## i. Overview + +The charged-lepton singlet carries the `(1, 1)_{-6}` representation of the gauge group, +so the infinitesimal action of the gauge algebra is scalar: multiplication by +`i` times `-6` times the `u(1)` value of the algebra element. This file defines that +action and proves it is the infinitesimal action underlying the jet gauge action, in +the sense of `GaugeAlgebra.IsInfinitesimalActionOf`. + +Because the singlet has no colour or weak index, the jet gauge action is multiplication +of the jet-ring factor by the hypercharge phase `(star u) ^ 6`, and both laws of +`IsInfinitesimalActionOf` reduce to scalar identities about the base-point Taylor +coefficients of that phase: the derivative identity `∂ ((star u) ^ 6) = +-(i (-6) ω) (star u) ^ 6` against the `u(1)` value of the Maurer–Cartan form, and the +trivial `u(1)` adjoint equivariance. + +## ii. Key results + +- `gaugeAlgebraAction` : the infinitesimal `(1, 1)_{-6}` action of the gauge algebra. +- `jetPhase` : the hypercharge phase `(star u) ^ 6` of the jet gauge action. +- `repCoeff_eq` : the base-point Taylor coefficients of the jet gauge action are the + base-point Taylor coefficients of the hypercharge phase. +- `jetPhase_pderiv` : the derivative identity for the hypercharge phase. +- `isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal action + underlying the jet gauge action. + +## iii. Table of contents + +- A. The infinitesimal action of the gauge algebra +- B. The hypercharge phase of the jet gauge action +- C. The Taylor coefficients of the jet gauge action +- D. The derivative identity for the hypercharge phase +- E. The infinitesimal action underlies the jet gauge action + +-/ + +@[expose] public section + +namespace StandardModel + +namespace LeptonSinglet + +open TensorProduct MvPowerSeries + +/-! + +## A. The infinitesimal action of the gauge algebra + +The `(1, 1)_{-6}` representation acts through the `u(1)` factor alone, so its +derivative is scalar multiplication by `i (-6)` times the `u(1)` value. + +-/ + +/-- **The infinitesimal action of the gauge algebra on the charged-lepton singlet**: + the derivative of the `(1, 1)_{-6}` action of the gauge group — scalar + multiplication by `i` times `-6` times the `u(1)` value, real-linear in the algebra + slot and complex-linear in the value slot — the form consumed by + `GaugeAlgebra.IsInfinitesimalActionOf`. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] LeptonSinglet →ₗ[ℂ] LeptonSinglet where + toFun c := (Complex.I * (-(6 : ℂ) * c.toU1Value)) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) + map_add' c₁ c₂ := by + rw [GaugeAlgebra.add_toU1Value, + show Complex.I * (-(6 : ℂ) * (c₁.toU1Value + c₂.toU1Value)) + = Complex.I * (-(6 : ℂ) * c₁.toU1Value) + + Complex.I * (-(6 : ℂ) * c₂.toU1Value) from by ring, + add_smul] + map_smul' r c := by + rw [GaugeAlgebra.smul_toU1Value, RingHom.id_apply, + show r • c.toU1Value = algebraMap ℝ ℂ r * c.toU1Value from by + rw [← algebraMap_smul ℂ r c.toU1Value, smul_eq_mul], + show Complex.I * (-(6 : ℂ) * (algebraMap ℝ ℂ r * c.toU1Value)) + = algebraMap ℝ ℂ r * (Complex.I * (-(6 : ℂ) * c.toU1Value)) from by ring, + mul_smul, algebraMap_smul] + +/-- The gauge-algebra action on the charged-lepton singlet is scalar multiplication + by `i` times `-6` times the `u(1)` value. -/ +lemma gaugeAlgebraAction_apply (c : GaugeAlgebra) : + gaugeAlgebraAction c + = (Complex.I * (-(6 : ℂ) * c.toU1Value)) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) := rfl + +/-! + +## B. The hypercharge phase of the jet gauge action + +The jet gauge action multiplies the jet-ring factor by the hypercharge power series +`(star u) ^ 6`: the scalar analogue of the colour matrix of a coloured species. + +-/ + +/-- The `JetRing`-valued hypercharge phase of the jet gauge action on the + charged-lepton singlet: the `-6` hypercharge power series `(star u) ^ 6` of the + gauge jet. -/ +noncomputable def jetPhase (U : JetGaugeGroupI) : JetRing := + (star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6 + +/-- The hypercharge phase, unfolded. -/ +lemma jetPhase_eq (U : JetGaugeGroupI) : + jetPhase U = (star ((U.2.2 : unitary JetRing) : JetRing)) ^ 6 := rfl + +/-- The jet gauge action on the charged-lepton singlet is multiplication of the + jet-ring factor by the hypercharge phase. -/ +lemma repJetGaugeGroupI_eq_jetPhase (U : JetGaugeGroupI) : + repJetGaugeGroupI U + = LinearMap.rTensor LeptonSinglet (LinearMap.mulLeft ℂ (jetPhase U)) := rfl + +/-! + +## C. The Taylor coefficients of the jet gauge action + +-/ + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) + = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] + +/-- The iterated formal derivative of a negation. -/ +private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) + = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] + +/-- The iterated formal derivative of a jet of charged-lepton singlets acts on the + jet-ring factor of a pure tensor. -/ +private lemma jetIteratedDeriv_tmul (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) + (ψ : LeptonSinglet) : + jetIteratedDeriv x (f ⊗ₜ[ℂ] ψ) + = (x.foldl (fun h ρ => pderiv ℂ ρ h) f) ⊗ₜ[ℂ] ψ := by + induction x using Multiset.induction_on generalizing f with + | empty => rw [jetIteratedDeriv_zero]; rfl + | cons μ t ih => + rw [jetIteratedDeriv_cons, LinearMap.comp_apply, ih, jetDeriv_tmul, + Multiset.foldl_cons, JetRing.foldl_pderiv_pderiv] + +/-- Scalar multiples of the identity compose through multiplication. -/ +private lemma smul_id_comp (a b : ℂ) : + (a • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet)) + ∘ₗ (b • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet)) + = (a * b) • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) := by + refine LinearMap.ext fun l => ?_ + simp [mul_smul] + +/-- A multiset sum of scalar multiples of the identity is the scalar multiple by the + sum. -/ +private lemma sum_map_smul_id {α : Type*} (m : Multiset α) (z : α → ℂ) : + (m.map fun p => z p • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet)).sum + = (m.map z).sum • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) := by + induction m using Multiset.induction_on with + | empty => simp + | cons a t ih => + rw [Multiset.map_cons, Multiset.sum_cons, ih, Multiset.map_cons, + Multiset.sum_cons, add_smul] + +/-- **The base-point Taylor coefficients of the jet gauge action** on the + charged-lepton singlet are scalar: multiplication by the base-point Taylor + coefficients of the hypercharge phase. -/ +lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff repJetGaugeGroupI U x + = constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) := by + refine LinearMap.ext fun l => ?_ + rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x l + = StandardModel.jetEval (StandardModel.jetIteratedDeriv x + (repJetGaugeGroupI U (StandardModel.jetOfConstant l))) from rfl, + StandardModel.jetOfConstant_apply, repJetGaugeGroupI_tmul, mul_one, + jetIteratedDeriv_tmul, StandardModel.jetEval_tmul, jetPhase_eq, + LinearMap.smul_apply, LinearMap.id_apply] + +/-! + +## D. The derivative identity for the hypercharge phase + +-/ + +/-- **The derivative identity** for the hypercharge phase of the jet gauge action: the + formal derivative of the phase is minus `i` times `-6` times the `u(1)` value of the + Maurer–Cartan form, times the phase. -/ +lemma jetPhase_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ (jetPhase U) + = -(((Complex.I * (-(6 : ℂ))) • (maurerCartanForm U μ).toU1Value) + * jetPhase U) := by + have hleib : ∀ f g : JetRing, + pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] + have huu : ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 + have h0 : pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) = 0 := by + have h := congrArg (pderiv ℂ μ) huu + rw [hleib, Derivation.map_one_eq_zero] at h + exact h + have hsu : pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) + = -(pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * (star ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing))) := by + have h1 : star ((U.2.2 : unitary JetRing) : JetRing) + * (pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + + ((U.2.2 : unitary JetRing) : JetRing) + * pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing))) = 0 := by + rw [h0, mul_zero] + linear_combination h1 + - pderiv ℂ μ (star ((U.2.2 : unitary JetRing) : JetRing)) * huu + have hiC : (algebraMap ℂ JetRing) Complex.I * (algebraMap ℂ JetRing) Complex.I + = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + rw [jetPhase_eq, maurerCartanForm_toU1Value, pderiv_pow, + show (6 : ℕ) - 1 = 5 from rfl, Nat.cast_ofNat, hsu, + Algebra.smul_def, Algebra.smul_def, map_mul, map_neg, map_ofNat] + linear_combination (-(6 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * (star ((U.2.2 : unitary JetRing) : JetRing)) ^ 7)) * hiC + +/-! + +## E. The infinitesimal action underlies the jet gauge action + +Both laws of `GaugeAlgebra.IsInfinitesimalActionOf` reduce through `repCoeff_eq` to +scalar identities: the Maurer–Cartan Leibniz law is the all-orders product rule at the +base point applied to the derivative identity, and the adjoint intertwining collapses +because the adjoint action on the `u(1)` component is trivial. + +-/ + +set_option maxHeartbeats 1000000 in +/-- **The `(1, 1)_{-6}` action of the gauge algebra is the infinitesimal action + underlying the jet gauge action on the charged-lepton singlet**: its base-point + Taylor coefficients obey the Maurer–Cartan Leibniz law and intertwine the action + with the adjoint transports. -/ +theorem isInfinitesimalActionOf : + GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + constructor + · intro U μ x + have hMcons : constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) + = -((x.antidiagonal.map fun p => + Complex.I * (-(6 : ℂ) * (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv + p.1 (maurerCartanForm U μ))).toU1Value) + * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))).sum) := by + rw [Multiset.foldl_cons, jetPhase_pderiv, foldl_pderiv_neg, map_neg, + JetRing.constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by + rw [foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, + JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] + ring)) + rw [repCoeff_eq, hMcons, neg_smul, ← sum_map_smul_id] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [gaugeAlgebraAction_apply, repCoeff_eq, smul_id_comp])) + · intro U x c + have hterm : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + gaugeAlgebraAction (IsGaugeField.adjointCoeff U p.1 c) + ∘ₗ IsGaugeField.repCoeff repJetGaugeGroupI U p.2 + = (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) + (C c.toU1Value))) + * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) := fun p => by + rw [gaugeAlgebraAction_apply, repCoeff_eq, smul_id_comp, + IsGaugeField.adjointCoeff_toU1Value] + have hvan : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), p.1 ≠ 0 → + (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) + (C c.toU1Value))) + * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) = 0 := by + intro p hp + rw [JetRing.foldl_pderiv_C_of_ne_zero hp, map_zero, mul_zero, mul_zero, + zero_mul, zero_smul] + have hcollapse : (x.antidiagonal.map fun p => + (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) + (C c.toU1Value))) + * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet)).sum + = (Complex.I * (-(6 : ℂ) * c.toU1Value) + * constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) := by + rw [Multiset.sum_antidiagonal_eq_of_fst_ne_zero x + (fun p => (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl + (fun h ρ => pderiv ℂ ρ h) (C c.toU1Value))) + * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet)) hvan, + show ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) + (C c.toU1Value : JetRing)) = C c.toU1Value from rfl, + constantCoeff_C] + rw [repCoeff_eq, gaugeAlgebraAction_apply, smul_id_comp, + show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) + * (Complex.I * (-(6 : ℂ) * c.toU1Value)) + = Complex.I * (-(6 : ℂ) * c.toU1Value) + * constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) from + mul_comm _ _, + ← hcollapse] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => (hterm p).symm) + +end LeptonSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean new file mode 100644 index 000000000..3f630facd --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -0,0 +1,736 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.LinearAlgebra.Matrix.Kronecker +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# The infinitesimal gauge action on the quark doublet + +## i. Overview + +The `(3, 2)_{1}` action of the gauge algebra on the quark doublet: the colour and weak +parts of the algebra element act on the combined colour–weak index through the Kronecker +sum, and the hypercharge part scales, all through the physicists' factor of `i`, matching +the group action `u • (U₃ ⊗ₖ U₂)` infinitesimally. The main theorem shows this is the +infinitesimal action underlying the jet gauge action `QuarkDoublet.repJetGaugeGroupI`, +in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`. + +## ii. Key results + +- `colourWeakEnd` : the endomorphism of the quark doublet defined by a colour–weak + matrix. +- `gaugeAlgebraAction` : the infinitesimal `(3, 2)_{1}` action of the gauge algebra. +- `jetGaugeMatrix_map_pderiv` : the derivative identity for the colour–weak matrix. +- `jetGaugeMatrix_mul_jetActionMatrix` : the equivariance identity for the colour–weak + matrix. +- `isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal action + underlying the jet gauge action. + +## iii. Table of contents + +- A. The action of the gauge algebra +- B. The colour–weak matrix of the jet gauge action +- C. The infinitesimal action underlies the jet gauge action + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +namespace QuarkDoublet + +open Matrix MatrixGroups Kronecker + +/-! + +## A. The action of the gauge algebra + +-/ + +/-- The identification of the quark doublet with a left-handed Weyl spinor tensored with + a colour–weak vector over the combined index `Fin 3 × Fin 2`: the `ℂ`-level analogue + of `jetValLinEquiv`. -/ +noncomputable def colourWeakValLinEquiv : + QuarkDoublet ≃ₗ[ℂ] Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 3 × Fin 2) := + (valLinEquiv.trans (TensorProduct.assoc ℂ Fermion.LeftHandedWeyl + (EuclideanSpace ℂ (Fin 3)) (EuclideanSpace ℂ (Fin 2)))).trans <| + TensorProduct.congr (LinearEquiv.refl ℂ Fermion.LeftHandedWeyl) + (colourWeakEquiv.trans (WithLp.linearEquiv 2 ℂ (Fin 3 × Fin 2 → ℂ)).symm) + +/-- The endomorphism of the quark doublet defined by a complex matrix over the + combined colour–weak index, with the Weyl factor untouched. -/ +noncomputable def colourWeakEnd (A : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) : + QuarkDoublet →ₗ[ℂ] QuarkDoublet := + colourWeakValLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3 × Fin 2)) Fermion.LeftHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ colourWeakValLinEquiv.toLinearMap + +lemma colourWeakEnd_apply_mk (A : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) + (v : QuarkDoublet) : + colourWeakEnd A v + = colourWeakValLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3 × Fin 2)) + Fermion.LeftHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) (colourWeakValLinEquiv v)) := rfl + +lemma colourWeakEnd_add (A B : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) : + colourWeakEnd (A + B) = colourWeakEnd A + colourWeakEnd B := by + rw [colourWeakEnd, colourWeakEnd, colourWeakEnd, map_add, map_add, + LinearMap.add_comp, LinearMap.comp_add] + +lemma colourWeakEnd_smul (z : ℂ) (A : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) : + colourWeakEnd (z • A) = z • colourWeakEnd A := by + rw [colourWeakEnd, colourWeakEnd, map_smul, map_smul, LinearMap.smul_comp, + LinearMap.comp_smul] + +lemma colourWeakEnd_zero : colourWeakEnd 0 = 0 := by + rw [colourWeakEnd, map_zero, map_zero, LinearMap.zero_comp, LinearMap.comp_zero] + +lemma colourWeakEnd_neg (A : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) : + colourWeakEnd (-A) = -colourWeakEnd A := by + rw [show (-A : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) = (-1 : ℂ) • A from by + rw [neg_one_smul], colourWeakEnd_smul, neg_one_smul] + +lemma colourWeakEnd_multiset_sum + (m : Multiset (Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ)) : + colourWeakEnd m.sum = (m.map colourWeakEnd).sum := by + induction m using Multiset.induction_on with + | empty => simp [colourWeakEnd_zero] + | cons A t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + colourWeakEnd_add, ih] + +/-- The colour–weak endomorphisms compose through matrix multiplication. -/ +lemma colourWeakEnd_mul (A B : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) : + colourWeakEnd (A * B) = colourWeakEnd A ∘ₗ colourWeakEnd B := by + refine LinearMap.ext fun v => ?_ + rw [colourWeakEnd_apply_mk, map_mul, map_mul, LinearMap.comp_apply, + colourWeakEnd_apply_mk, colourWeakEnd_apply_mk, LinearEquiv.apply_symm_apply] + rfl + +/-- The matrix of the infinitesimal `(3, 2)_{1}` action of a gauge algebra element on + the combined colour–weak index: `i` times the Kronecker sum of the colour and weak + parts, shifted by `i` times the hypercharge. -/ +noncomputable def actionMatrix (c : GaugeAlgebra) : + Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ := + Complex.I • (c.toSU3Matrix ⊗ₖ (1 : Matrix (Fin 2) (Fin 2) ℂ) + + (1 : Matrix (Fin 3) (Fin 3) ℂ) ⊗ₖ c.toSU2Matrix + + c.toU1Value • 1) + +/-- **The infinitesimal action of the gauge algebra on the quark doublet**: the + derivative of the `(3, 2)_{1}` action of the gauge group, real-linear in the + algebra slot and complex-linear in the value slot — the form consumed by the + covariant derivative `IsGaugeField.covDerivIter` and by + `GaugeAlgebra.IsInfinitesimalActionOf`. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] QuarkDoublet →ₗ[ℂ] QuarkDoublet where + toFun c := colourWeakEnd (actionMatrix c) + map_add' c₁ c₂ := by + rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by + rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU3Matrix, + GaugeAlgebra.add_toSU2Matrix, GaugeAlgebra.add_toU1Value, + Matrix.add_kronecker, Matrix.kronecker_add] + module] + rw [colourWeakEnd_add] + map_smul' r c := by + rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by + rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU3Matrix, + GaugeAlgebra.smul_toSU2Matrix, GaugeAlgebra.smul_toU1Value, + show (r • c.toSU3Matrix : Matrix (Fin 3) (Fin 3) ℂ) + = (r : ℂ) • c.toSU3Matrix from by + rw [← algebraMap_smul ℂ r c.toSU3Matrix]; rfl, + show (r • c.toSU2Matrix : Matrix (Fin 2) (Fin 2) ℂ) + = (r : ℂ) • c.toSU2Matrix from by + rw [← algebraMap_smul ℂ r c.toSU2Matrix]; rfl, + show r • c.toU1Value = (r : ℂ) • c.toU1Value from by + rw [← algebraMap_smul ℂ r c.toU1Value]; rfl, + Matrix.smul_kronecker, Matrix.kronecker_smul] + module, + colourWeakEnd_smul] + refine LinearMap.ext fun v => ?_ + rw [RingHom.id_apply] + show (r : ℂ) • colourWeakEnd (actionMatrix c) v + = r • colourWeakEnd (actionMatrix c) v + rw [show ((r : ℝ) : ℂ) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] + +/-! + +## B. The colour–weak matrix of the jet gauge action + +## C. The infinitesimal action underlies the jet gauge action + +The `(3, 2)_{1}` action of the gauge algebra is the infinitesimal action underlying the +jet gauge action, in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`: the base-point +Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and +intertwine the action with the adjoint transports. The proofs work through the +colour–weak matrix `jetGaugeMatrix` of the jet action and the all-orders matrix Leibniz +rule at the base point. + +-/ + +section InfinitesimalAction + +open MvPowerSeries + +/-- A single formal derivative commutes with the iterated one. -/ +private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f : JetRing) : + pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) f) + = x.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, ih, JetRing.pderiv_comm] + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) + = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] + +/-- The jet-valued matrix of the infinitesimal `(3, 2)_{1}` action of a jet of gauge + algebra elements: the jet analogue of `actionMatrix`. -/ +noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : + Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) JetRing := + Complex.I • (a.toSU3Matrix ⊗ₖ (1 : Matrix (Fin 2) (Fin 2) JetRing) + + (1 : Matrix (Fin 3) (Fin 3) JetRing) ⊗ₖ a.toSU2Matrix + + a.toU1Value • 1) + +/-- The base-point Taylor coefficients of the jet action matrix are the action matrices + of the base-point Taylor coefficients. -/ +lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + ((jetActionMatrix a).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := by + refine Matrix.ext fun i j => ?_ + rw [Matrix.map_apply, jetActionMatrix, actionMatrix, Matrix.smul_apply, + Matrix.smul_apply, Matrix.add_apply, Matrix.add_apply, Matrix.add_apply, + Matrix.add_apply, Matrix.kroneckerMap_apply, Matrix.kroneckerMap_apply, + Matrix.kroneckerMap_apply, Matrix.kroneckerMap_apply, Matrix.smul_apply, + Matrix.smul_apply, foldl_pderiv_smul, constantCoeff_smul, + JetRing.foldl_pderiv_add, JetRing.foldl_pderiv_add, map_add, map_add] + congr 1 + congr 1 + · congr 1 + · by_cases h3 : i.2 = j.2 + · rw [h3, Matrix.one_apply_eq, Matrix.one_apply_eq, mul_one, mul_one, + JetGaugeAlgebra.eval_iteratedDeriv_toSU3Matrix, Matrix.map_apply] + · rw [Matrix.one_apply_ne h3, Matrix.one_apply_ne h3, mul_zero, mul_zero, + JetRing.foldl_pderiv_zero, map_zero] + · by_cases h2 : i.1 = j.1 + · rw [h2, Matrix.one_apply_eq, Matrix.one_apply_eq, one_mul, one_mul, + JetGaugeAlgebra.eval_iteratedDeriv_toSU2Matrix, Matrix.map_apply] + · rw [Matrix.one_apply_ne h2, Matrix.one_apply_ne h2, zero_mul, zero_mul, + JetRing.foldl_pderiv_zero, map_zero] + · by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq, smul_eq_mul, mul_one, + smul_eq_mul, mul_one, JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + JetRing.foldl_pderiv_zero, map_zero] + +lemma repJetGaugeGroupI_eq_jetGaugeMatrix (U : JetGaugeGroupI) + (z : JetRing ⊗[ℂ] QuarkDoublet) : + repJetGaugeGroupI U z + = jetValLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3 × Fin 2)) + Fermion.LeftHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)).restrictScalars ℂ) + (jetValLinEquiv z)) := rfl + +/-- The entrywise formal derivative on the colour–weak coordinates, as a `ℂ`-linear + map. -/ +private noncomputable def pderivColourWeak (μ : Fin 1 ⊕ Fin 3) : + EuclideanSpace JetRing (Fin 3 × Fin 2) →ₗ[ℂ] + EuclideanSpace JetRing (Fin 3 × Fin 2) where + toFun v := WithLp.toLp 2 fun q => pderiv ℂ μ (v.ofLp q) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext q + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext q + exact Derivation.map_smul _ _ _ + +/-- The entrywise iterated formal derivative on the colour–weak coordinates. -/ +private noncomputable def foldColourWeak (x : Multiset (Fin 1 ⊕ Fin 3)) : + EuclideanSpace JetRing (Fin 3 × Fin 2) →ₗ[ℂ] + EuclideanSpace JetRing (Fin 3 × Fin 2) where + toFun v := WithLp.toLp 2 fun q => x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp q) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext q + exact JetRing.foldl_pderiv_add x _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext q + exact foldl_pderiv_smul x z _ + +/-- The entrywise base-point evaluation on the colour–weak coordinates. -/ +private noncomputable def ccColourWeak : + EuclideanSpace JetRing (Fin 3 × Fin 2) →ₗ[ℂ] EuclideanSpace ℂ (Fin 3 × Fin 2) where + toFun v := WithLp.toLp 2 fun q => constantCoeff (v.ofLp q) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext q + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext q + exact constantCoeff_smul _ _ + +private lemma pderivColourWeak_comp_foldColourWeak (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + pderivColourWeak μ ∘ₗ foldColourWeak x = foldColourWeak (μ ::ₘ x) := by + refine LinearMap.ext fun v => ?_ + refine WithLp.ofLp_injective 2 ?_ + funext q + show pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp q)) + = (μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp q) + rw [Multiset.foldl_cons, pderiv_foldl] + +/-- The identification of quark-doublet jets intertwines the formal derivative with the + entrywise derivative on the colour–weak coordinates. -/ +private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (z : JetRing ⊗[ℂ] QuarkDoublet) : + jetValLinEquiv (StandardModel.jetDeriv μ z) + = (TensorProduct.map LinearMap.id (pderivColourWeak μ)) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨v⟩ := d + induction v using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : QuarkDoublet) = 0 from rfl, TensorProduct.tmul_zero, + map_zero, map_zero, map_zero] + | tmul vc w => + induction vc using TensorProduct.induction_on with + | zero => + rw [show ({ val := (0 : Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 3)) + ⊗ₜ[ℂ] w } : QuarkDoublet) = 0 from by + rw [TensorProduct.zero_tmul]; rfl, TensorProduct.tmul_zero, map_zero, + map_zero, map_zero] + | tmul ψ c => + rw [show StandardModel.jetDeriv μ + (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) + = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet) from rfl, + show jetValLinEquiv + ((pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (c ⊗ₜ[ℂ] w) q • pderiv ℂ μ f) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (c ⊗ₜ[ℂ] w) q • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext q + exact (Derivation.map_smul (pderiv ℂ μ) + (colourWeakEquiv (c ⊗ₜ[ℂ] w) q) f).symm + | add a b ha hb => + rw [show ({ val := (a + b) ⊗ₜ[ℂ] w } : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ from by + rw [show (⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w + b ⊗ₜ[ℂ] w⟩ from rfl, TensorProduct.add_tmul], + TensorProduct.tmul_add] + simp only [map_add] + rw [ha, hb] + | add a b ha hb => + rw [show ({ val := a + b } : QuarkDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add] + simp only [map_add] + rw [ha, hb] + +/-- The identification of quark-doublet jets intertwines the iterated formal derivative + with the entrywise iterated derivative on the colour–weak coordinates. -/ +private lemma jetValLinEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] QuarkDoublet) : + jetValLinEquiv (StandardModel.jetIteratedDeriv x z) + = (TensorProduct.map LinearMap.id (foldColourWeak x)) (jetValLinEquiv z) := by + induction x using Multiset.induction_on with + | empty => + rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, + show foldColourWeak 0 = LinearMap.id from LinearMap.ext fun v => + WithLp.ofLp_injective 2 rfl, + TensorProduct.map_id, LinearMap.id_apply] + | cons μ t ih => + rw [StandardModel.jetIteratedDeriv_cons, LinearMap.comp_apply, + jetValLinEquiv_jetDeriv, ih, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, pderivColourWeak_comp_foldColourWeak] + +/-- The base-point evaluation of a quark-doublet jet through the colour–weak + coordinates. -/ +private lemma colourWeakValLinEquiv_jetEval (z : JetRing ⊗[ℂ] QuarkDoublet) : + colourWeakValLinEquiv (StandardModel.jetEval z) + = (TensorProduct.map LinearMap.id ccColourWeak) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨v⟩ := d + induction v using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : QuarkDoublet) = 0 from rfl, TensorProduct.tmul_zero] + simp + | tmul vc w => + induction vc using TensorProduct.induction_on with + | zero => + rw [show ({ val := (0 : Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 3)) + ⊗ₜ[ℂ] w } : QuarkDoublet) = 0 from by + rw [TensorProduct.zero_tmul]; rfl, TensorProduct.tmul_zero] + simp + | tmul ψ c => + rw [StandardModel.jetEval_tmul, map_smul, + show colourWeakValLinEquiv (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (c ⊗ₜ[ℂ] w) q) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (c ⊗ₜ[ℂ] w) q • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply, ← TensorProduct.tmul_smul] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext q + show constantCoeff f • colourWeakEquiv (c ⊗ₜ[ℂ] w) q + = constantCoeff (colourWeakEquiv (c ⊗ₜ[ℂ] w) q • f) + simp [constantCoeff_smul, mul_comm] + | add a b ha hb => + rw [show ({ val := (a + b) ⊗ₜ[ℂ] w } : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ from by + rw [show (⟨a ⊗ₜ[ℂ] w⟩ + ⟨b ⊗ₜ[ℂ] w⟩ : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] w + b ⊗ₜ[ℂ] w⟩ from rfl, TensorProduct.add_tmul], + TensorProduct.tmul_add] + simp only [map_add] + rw [ha, hb] + | add a b ha hb => + rw [show ({ val := a + b } : QuarkDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add] + simp only [map_add] + rw [ha, hb] + +set_option maxHeartbeats 1000000 in +/-- **The derivative identity** for the colour–weak matrix of the jet gauge action: the + formal derivative of the colour–weak matrix is minus the jet action matrix of the + Maurer–Cartan form times the colour–weak matrix. -/ +lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (jetGaugeMatrix U).map (fun f => pderiv ℂ μ f) + = -(jetActionMatrix (maurerCartanForm U μ) * jetGaugeMatrix U) := by + have hleib : ∀ f g : JetRing, + pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] + have huu : ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + have hU₂u : star U.2.1.1 * U.2.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + have hm₃U₃ : (maurerCartanForm U μ).toSU3Matrix * U.1.1 + = Complex.I • U.1.1.map (pderiv ℂ μ) := by + rw [maurerCartanForm_toSU3Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₃u, + Matrix.mul_one] + have hm₂U₂ : (maurerCartanForm U μ).toSU2Matrix * U.2.1.1 + = Complex.I • U.2.1.1.map (pderiv ℂ μ) := by + rw [maurerCartanForm_toSU2Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₂u, + Matrix.mul_one] + have hmap : (jetGaugeMatrix U).map (fun f => pderiv ℂ μ f) + = (pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing)) • + (((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) ⊗ₖ + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)) + + ((U.2.2 : unitary JetRing) : JetRing) • + ((((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) ⊗ₖ + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)).map fun f => pderiv ℂ μ f) := by + refine Matrix.ext fun i j => ?_ + simp only [jetGaugeMatrix, Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, + smul_eq_mul] + exact hleib _ _ + have hkron : ((((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing) ⊗ₖ + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)).map fun f => pderiv ℂ μ f) + = (U.1.1.map (pderiv ℂ μ)) ⊗ₖ U.2.1.1 + + U.1.1 ⊗ₖ (U.2.1.1.map (pderiv ℂ μ)) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.kroneckerMap_apply, Matrix.add_apply] + exact hleib _ _ + rw [hmap, hkron, jetActionMatrix, jetGaugeMatrix, Matrix.mul_smul, Matrix.smul_mul, + Matrix.add_mul, Matrix.add_mul, ← Matrix.mul_kronecker_mul, + ← Matrix.mul_kronecker_mul, + Matrix.one_mul, Matrix.one_mul, hm₃U₃, hm₂U₂, Matrix.smul_mul, Matrix.one_mul, + Matrix.smul_kronecker, Matrix.kronecker_smul, maurerCartanForm_toU1Value, + smul_assoc, ← smul_add, ← smul_add, smul_smul Complex.I Complex.I, Complex.I_mul_I, + neg_one_smul, smul_neg, neg_neg] + conv_rhs => rw [smul_add, smul_smul] + rw [show ((U.2.2 : unitary JetRing) : JetRing) + * (pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing)) + = pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) from by + linear_combination pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) * huu] + exact add_comm _ _ + +/-- **The equivariance identity** for the colour–weak matrix of the jet gauge action: + the colour–weak matrix intertwines the constant jet action matrix with its adjoint + transform. -/ +lemma jetGaugeMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : + jetGaugeMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = jetActionMatrix (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c)) + * jetGaugeMatrix U := by + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + have hU₂u : star U.2.1.1 * U.2.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rw [jetGaugeMatrix, jetActionMatrix, jetActionMatrix, + JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.adjointMap_toSU2Matrix, + JetGaugeAlgebra.adjointMap_toU1Value] + conv_lhs => rw [Matrix.smul_mul, Matrix.mul_smul, Matrix.mul_add, Matrix.mul_add, + ← Matrix.mul_kronecker_mul, ← Matrix.mul_kronecker_mul, Matrix.mul_one, + Matrix.mul_one, Matrix.mul_smul, Matrix.mul_one] + conv_rhs => rw [Matrix.mul_smul, Matrix.smul_mul, Matrix.add_mul, Matrix.add_mul, + ← Matrix.mul_kronecker_mul, ← Matrix.mul_kronecker_mul, Matrix.one_mul, + Matrix.one_mul, Matrix.smul_mul, Matrix.one_mul, Matrix.mul_assoc, hU₃u, + Matrix.mul_one, Matrix.mul_assoc, hU₂u, Matrix.mul_one] + +/-- The iterated formal derivative of a negation. -/ +private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) + = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] + +set_option maxHeartbeats 1000000 in +/-- **The base-point Taylor coefficients of the jet gauge action** on the quark + doublet are the colour–weak endomorphisms of the base-point Taylor coefficients of + the colour–weak matrix. -/ +lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff repJetGaugeGroupI U x + = colourWeakEnd ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + refine LinearMap.ext fun d => ?_ + apply colourWeakValLinEquiv.injective + rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x d + = StandardModel.jetEval (StandardModel.jetIteratedDeriv x + (repJetGaugeGroupI U (StandardModel.jetOfConstant d))) from rfl, + colourWeakValLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, + colourWeakEnd_apply_mk, LinearEquiv.apply_symm_apply, + repJetGaugeGroupI_eq_jetGaugeMatrix, LinearEquiv.apply_symm_apply, + StandardModel.jetOfConstant_apply] + obtain ⟨v⟩ := d + induction v using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : QuarkDoublet) = 0 from rfl, TensorProduct.tmul_zero] + simp + | add a b ha hb => + rw [show ({ val := a + b } : QuarkDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add] + simp only [map_add] + rw [ha, hb] + | tmul vc wk => + induction vc using TensorProduct.induction_on with + | zero => + rw [show ({ val := (0 : Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 3)) + ⊗ₜ[ℂ] wk } : QuarkDoublet) = 0 from by + rw [TensorProduct.zero_tmul]; rfl, TensorProduct.tmul_zero] + simp + | tmul ψ cv => + rw [show jetValLinEquiv + ((1 : JetRing) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] cv ⊗ₜ[ℂ] wk⟩ : QuarkDoublet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q • (1 : JetRing)) from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3 × Fin 2)) + Fermion.LeftHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)).restrictScalars ℂ)) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q • (1 : JetRing))) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)) + (WithLp.toLp 2 fun q => + colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q • (1 : JetRing))) from rfl, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, + show colourWeakValLinEquiv (⟨ψ ⊗ₜ[ℂ] cv ⊗ₜ[ℂ] wk⟩ : QuarkDoublet) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => + colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q) from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3 × Fin 2)) + Fermion.LeftHandedWeyl + (Matrix.toLpLinAlgEquiv 2 ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q)) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + (WithLp.toLp 2 fun q => + colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q)) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext j + show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + (((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)) + (WithLp.toLp 2 fun q => + colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q • (1 : JetRing))).ofLp j)) + = ((Matrix.toLpLinAlgEquiv 2 ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + (WithLp.toLp 2 fun q => colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q)).ofLp j + rw [show ((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)) + (WithLp.toLp 2 fun q => + colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q • (1 : JetRing))).ofLp j + = ∑ k, jetGaugeMatrix U j k * + (colourWeakEquiv (cv ⊗ₜ[ℂ] wk) k • (1 : JetRing)) from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + show ((Matrix.toLpLinAlgEquiv 2 ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + (WithLp.toLp 2 fun q => colourWeakEquiv (cv ⊗ₜ[ℂ] wk) q)).ofLp j + = ∑ k, constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + (jetGaugeMatrix U j k)) * colourWeakEquiv (cv ⊗ₜ[ℂ] wk) k from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + JetRing.foldl_pderiv_sum, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, + mul_comm] + | add a b ha hb => + rw [show ({ val := (a + b) ⊗ₜ[ℂ] wk } : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] wk⟩ + ⟨b ⊗ₜ[ℂ] wk⟩ from by + rw [show (⟨a ⊗ₜ[ℂ] wk⟩ + ⟨b ⊗ₜ[ℂ] wk⟩ : QuarkDoublet) + = ⟨a ⊗ₜ[ℂ] wk + b ⊗ₜ[ℂ] wk⟩ from rfl, TensorProduct.add_tmul], + TensorProduct.tmul_add] + simp only [map_add] + rw [ha, hb] + +set_option maxHeartbeats 1000000 in +/-- **The `(3, 2)_{1}` action of the gauge algebra is the infinitesimal action + underlying the jet gauge action on the quark doublet**: its base-point Taylor + coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the + adjoint transports. -/ +theorem isInfinitesimalActionOf : + GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + constructor + · intro U μ x + have hMcons : ((jetGaugeMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -((x.antidiagonal.map fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((jetGaugeMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + rw [show ((jetGaugeMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (((jetGaugeMatrix U).map fun f => pderiv ℂ μ f).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.map_apply, Matrix.map_apply, + Multiset.foldl_cons], + jetGaugeMatrix_map_pderiv, + show ((-(jetActionMatrix (maurerCartanForm U μ) * jetGaugeMatrix U)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -(((jetActionMatrix (maurerCartanForm U μ) * jetGaugeMatrix U)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.neg_apply, Matrix.neg_apply, + Matrix.map_apply, foldl_pderiv_neg, map_neg], + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [jetActionMatrix_map_cc_foldl])) + rw [repCoeff_eq, hMcons, colourWeakEnd_neg, colourWeakEnd_multiset_sum, + Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => ?_)) + rw [Function.comp_apply, colourWeakEnd_mul, repCoeff_eq] + rfl + · intro U x c + have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + Algebra.algebraMap_self_apply, ← map_mul] + have hconst : jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = (actionMatrix c).map (C : ℂ → JetRing) := by + have hone : ∀ {n : Type} [DecidableEq n] (a b : n), + (1 : Matrix n n JetRing) a b = C ((1 : Matrix n n ℂ) a b) := by + intro n _ a b + by_cases h : a = b + · subst h; rw [Matrix.one_apply_eq, Matrix.one_apply_eq, map_one] + · rw [Matrix.one_apply_ne h, Matrix.one_apply_ne h, map_zero] + refine Matrix.ext fun i j => ?_ + rw [jetActionMatrix, actionMatrix, Matrix.map_apply, Matrix.smul_apply, + Matrix.smul_apply, Matrix.add_apply, Matrix.add_apply, Matrix.add_apply, + Matrix.add_apply, Matrix.kroneckerMap_apply, Matrix.kroneckerMap_apply, + Matrix.kroneckerMap_apply, Matrix.kroneckerMap_apply, Matrix.smul_apply, + Matrix.smul_apply, JetGaugeAlgebra.ofConstant_toSU3Matrix, + JetGaugeAlgebra.ofConstant_toSU2Matrix, JetGaugeAlgebra.ofConstant_toU1Value, + Matrix.map_apply, Matrix.map_apply, hone i.2 j.2, hone i.1 j.1, hone i j, + ← map_mul, ← map_mul, + show (C c.toU1Value : JetRing) + • C ((1 : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) i j) + = C (c.toU1Value • (1 : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) i j) + from by rw [smul_eq_mul, smul_eq_mul, ← map_mul], + ← map_add, ← map_add, hCsmul, smul_eq_mul, smul_eq_mul] + have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), + (((actionMatrix c).map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then actionMatrix c else 0 := by + intro m + rcases eq_or_ne m 0 with rfl | hm + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, constantCoeff_C] + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] + have hMact : ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c + = (x.antidiagonal.map fun p => + actionMatrix (IsGaugeField.adjointCoeff U p.1 c) + * ((jetGaugeMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have h1 : ((jetGaugeMatrix U + * jetActionMatrix (JetGaugeAlgebra.ofConstant c)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c := by + rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun p hp => by rw [hcollapse p.2]), + Multiset.sum_antidiagonal_eq_of_snd_ne_zero x + (fun p => ((jetGaugeMatrix U).map fun f => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if p.2 = 0 then actionMatrix c else 0)) + (fun p hp => by rw [if_neg hp, Matrix.mul_zero]), + if_pos rfl] + rw [← h1, jetGaugeMatrix_mul_jetActionMatrix, + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [jetActionMatrix_map_cc_foldl, + show JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) + = IsGaugeField.adjointCoeff U p.1 c from rfl]) + rw [repCoeff_eq, + show (colourWeakEnd ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + ∘ₗ gaugeAlgebraAction c + = colourWeakEnd (((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c) from by + rw [colourWeakEnd_mul]; rfl, + hMact, colourWeakEnd_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, colourWeakEnd_mul, repCoeff_eq] + rfl + +end InfinitesimalAction + +end QuarkDoublet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean new file mode 100644 index 000000000..c3a0d4138 --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -0,0 +1,605 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# The infinitesimal gauge action on the up-type singlet + +## i. Overview + +The `(3, 1)_{4}` action of the gauge algebra on the up-type singlet: the colour part of +the algebra element acts on the colour index and the hypercharge part scales, both +through the physicists' factor of `i`, matching the group action `u ^ 4 • U₃` +infinitesimally. The main theorem shows this is the infinitesimal action underlying the +jet gauge action `UpSinglet.repJetGaugeGroupI`, in the sense of +`GaugeAlgebra.IsInfinitesimalActionOf`. + +## ii. Key results + +- `colourEnd` : the endomorphism of the up singlet defined by a colour matrix. +- `gaugeAlgebraAction` : the infinitesimal `(3, 1)_{4}` action of the gauge algebra. +- `upMatrix` : the `JetRing`-valued colour matrix of the jet gauge action. +- `upMatrix_map_pderiv` : the derivative identity for the colour matrix. +- `upMatrix_mul_jetActionMatrix` : the equivariance identity for the colour matrix. +- `isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal action + underlying the jet gauge action. + +## iii. Table of contents + +- A. The action of the gauge algebra +- B. The colour matrix of the jet gauge action +- C. The infinitesimal action underlies the jet gauge action + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +namespace UpSinglet + +open Matrix MatrixGroups + +/-! + +## A. The action of the gauge algebra + +-/ + +/-- The endomorphism of the up singlet defined by a `3 × 3` complex matrix acting on + the colour index, with the Weyl factor untouched. -/ +noncomputable def colourEnd (A : Matrix (Fin 3) (Fin 3) ℂ) : + UpSinglet →ₗ[ℂ] UpSinglet := + valLinEquiv.symm.toLinearMap ∘ₗ + Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ valLinEquiv.toLinearMap + +lemma colourEnd_apply_mk (A : Matrix (Fin 3) (Fin 3) ℂ) (v : UpSinglet) : + colourEnd A v + = valLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 A) (valLinEquiv v)) := rfl + +lemma colourEnd_add (A B : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (A + B) = colourEnd A + colourEnd B := by + rw [colourEnd, colourEnd, colourEnd, map_add, map_add, LinearMap.add_comp, + LinearMap.comp_add] + +lemma colourEnd_smul (z : ℂ) (A : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (z • A) = z • colourEnd A := by + rw [colourEnd, colourEnd, map_smul, map_smul, LinearMap.smul_comp, + LinearMap.comp_smul] + +lemma colourEnd_zero : colourEnd 0 = 0 := by + rw [colourEnd, map_zero, map_zero, LinearMap.zero_comp, LinearMap.comp_zero] + +lemma colourEnd_neg (A : Matrix (Fin 3) (Fin 3) ℂ) : colourEnd (-A) = -colourEnd A := by + rw [show (-A : Matrix (Fin 3) (Fin 3) ℂ) = (-1 : ℂ) • A from by rw [neg_one_smul], + colourEnd_smul, neg_one_smul] + +lemma colourEnd_multiset_sum (m : Multiset (Matrix (Fin 3) (Fin 3) ℂ)) : + colourEnd m.sum = (m.map colourEnd).sum := by + induction m using Multiset.induction_on with + | empty => simp [colourEnd_zero] + | cons A t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + colourEnd_add, ih] + +/-- The colour endomorphisms compose through matrix multiplication. -/ +lemma colourEnd_mul (A B : Matrix (Fin 3) (Fin 3) ℂ) : + colourEnd (A * B) = colourEnd A ∘ₗ colourEnd B := by + refine LinearMap.ext fun v => ?_ + rw [colourEnd_apply_mk, map_mul, map_mul, LinearMap.comp_apply, colourEnd_apply_mk, + colourEnd_apply_mk, LinearEquiv.apply_symm_apply] + rfl + +/-- The matrix of the infinitesimal `(3, 1)_{4}` action of a gauge algebra element on + the colour index: `i` times the colour part, shifted by `i` times `4` the + hypercharge. -/ +noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ := + Complex.I • (c.toSU3Matrix + ((4 : ℂ) • c.toU1Value) • 1) + +/-- **The infinitesimal action of the gauge algebra on the up-type singlet**: the + derivative of the `(3, 1)_{4}` action of the gauge group, real-linear in the + algebra slot and complex-linear in the value slot — the form consumed by the + covariant derivative `IsGaugeField.covDerivIter` and by + `GaugeAlgebra.IsInfinitesimalActionOf`. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] UpSinglet →ₗ[ℂ] UpSinglet where + toFun c := colourEnd (actionMatrix c) + map_add' c₁ c₂ := by + rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by + rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU3Matrix, + GaugeAlgebra.add_toU1Value] + module] + rw [colourEnd_add] + map_smul' r c := by + rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by + rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU3Matrix, + GaugeAlgebra.smul_toU1Value, + show (r • c.toSU3Matrix : Matrix (Fin 3) (Fin 3) ℂ) + = (r : ℂ) • c.toSU3Matrix from by + rw [← algebraMap_smul ℂ r c.toSU3Matrix]; rfl, + show r • c.toU1Value = (r : ℂ) • c.toU1Value from by + rw [← algebraMap_smul ℂ r c.toU1Value]; rfl] + module, + colourEnd_smul] + refine LinearMap.ext fun v => ?_ + rw [RingHom.id_apply] + show (r : ℂ) • colourEnd (actionMatrix c) v = r • colourEnd (actionMatrix c) v + rw [show ((r : ℝ) : ℂ) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] + +/-! + +## B. The colour matrix of the jet gauge action + +## C. The infinitesimal action underlies the jet gauge action + +The `(3, 1)_{4}` action of the gauge algebra is the infinitesimal action underlying the +jet gauge action, in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`: the base-point +Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and +intertwine the action with the adjoint transports. The proofs work through the colour +matrix of the jet action and the all-orders matrix Leibniz rule at the base point. + +-/ + +section InfinitesimalAction + +open MvPowerSeries + +/-- A single formal derivative commutes with the iterated one. -/ +private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f : JetRing) : + pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) f) + = x.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, ih, JetRing.pderiv_comm] + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) + = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] + +/-- The jet-valued matrix of the infinitesimal `(3, 1)_{4}` action of a jet of gauge + algebra elements: the jet analogue of `actionMatrix`. -/ +noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 3) (Fin 3) JetRing := + Complex.I • (a.toSU3Matrix + ((4 : ℂ) • a.toU1Value) • 1) + +/-- The base-point Taylor coefficients of the jet action matrix are the action matrices + of the base-point Taylor coefficients. -/ +lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + ((jetActionMatrix a).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := by + ext i j + rw [Matrix.map_apply, jetActionMatrix, actionMatrix, Matrix.smul_apply, + Matrix.add_apply, Matrix.smul_apply, Matrix.smul_apply, Matrix.add_apply, + Matrix.smul_apply, foldl_pderiv_smul, constantCoeff_smul, JetRing.foldl_pderiv_add, + map_add, JetGaugeAlgebra.eval_iteratedDeriv_toSU3Matrix, Matrix.map_apply] + congr 2 + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq, smul_eq_mul, mul_one, smul_eq_mul, + mul_one, foldl_pderiv_smul, constantCoeff_smul, + JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + JetRing.foldl_pderiv_zero, map_zero] + +/-- The `JetRing`-valued colour matrix of the jet gauge action on the up singlet: the + colour matrix of the gauge jet carrying the `4` hypercharge phase. -/ +noncomputable def upMatrix (U : JetGaugeGroupI) : Matrix (Fin 3) (Fin 3) JetRing := + (((U.2.2 : unitary JetRing) : JetRing)) ^ 4 • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + +lemma repJetGaugeGroupI_eq_upMatrix (U : JetGaugeGroupI) + (z : JetRing ⊗[ℂ] UpSinglet) : + repJetGaugeGroupI U z + = jetValLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (upMatrix U)).restrictScalars ℂ) + (jetValLinEquiv z)) := rfl + +/-- The entrywise formal derivative on the colour coordinates, as a `ℂ`-linear map. -/ +private noncomputable def pderivColour (μ : Fin 1 ⊕ Fin 3) : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where + toFun v := WithLp.toLp 2 fun i => pderiv ℂ μ (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact Derivation.map_smul _ _ _ + +/-- The entrywise iterated formal derivative on the colour coordinates. -/ +private noncomputable def foldColour (x : Multiset (Fin 1 ⊕ Fin 3)) : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace JetRing (Fin 3) where + toFun v := WithLp.toLp 2 fun i => x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact JetRing.foldl_pderiv_add x _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact foldl_pderiv_smul x z _ + +/-- The entrywise base-point evaluation on the colour coordinates. -/ +private noncomputable def ccColour : + EuclideanSpace JetRing (Fin 3) →ₗ[ℂ] EuclideanSpace ℂ (Fin 3) where + toFun v := WithLp.toLp 2 fun i => constantCoeff (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact constantCoeff_smul _ _ + +private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + pderivColour μ ∘ₗ foldColour x = foldColour (μ ::ₘ x) := by + refine LinearMap.ext fun v => ?_ + refine WithLp.ofLp_injective 2 ?_ + funext i + show pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i)) + = (μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + rw [Multiset.foldl_cons, pderiv_foldl] + +/-- The identification of up-singlet jets intertwines the formal derivative with the + entrywise derivative on the colour coordinates. -/ +private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (z : JetRing ⊗[ℂ] UpSinglet) : + jetValLinEquiv (StandardModel.jetDeriv μ z) + = (TensorProduct.map LinearMap.id (pderivColour μ)) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : UpSinglet) = 0 from rfl, TensorProduct.tmul_zero, + map_zero, map_zero, map_zero] + | tmul ψ c => + rw [show StandardModel.jetDeriv μ (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet)) + = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet) from rfl, + show jetValLinEquiv ((pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • pderiv ℂ μ f) from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + exact (Derivation.map_smul (pderiv ℂ μ) (c.ofLp i) f).symm + | add a b ha hb => + rw [show ({ val := a + b } : UpSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +/-- The identification of up-singlet jets intertwines the iterated formal derivative + with the entrywise iterated derivative on the colour coordinates. -/ +private lemma jetValLinEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] UpSinglet) : + jetValLinEquiv (StandardModel.jetIteratedDeriv x z) + = (TensorProduct.map LinearMap.id (foldColour x)) (jetValLinEquiv z) := by + induction x using Multiset.induction_on with + | empty => + rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, + show foldColour 0 = LinearMap.id from LinearMap.ext fun v => + WithLp.ofLp_injective 2 rfl, + TensorProduct.map_id, LinearMap.id_apply] + | cons μ t ih => + rw [StandardModel.jetIteratedDeriv_cons, LinearMap.comp_apply, + jetValLinEquiv_jetDeriv, ih, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, pderivColour_comp_foldColour] + +/-- The base-point evaluation of an up-singlet jet through the colour coordinates. -/ +private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] UpSinglet) : + valLinEquiv (StandardModel.jetEval z) + = (TensorProduct.map LinearMap.id ccColour) (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp; rfl + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f d => + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : UpSinglet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rfl + | tmul ψ c => + rw [StandardModel.jetEval_tmul, map_smul, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet) = ψ ⊗ₜ[ℂ] c from rfl, + show jetValLinEquiv (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • f) from rfl, + TensorProduct.map_tmul, LinearMap.id_apply, ← TensorProduct.tmul_smul] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext i + show (constantCoeff f • c).ofLp i = constantCoeff (c.ofLp i • f) + simp [constantCoeff_smul, mul_comm] + | add a b ha hb => + rw [show ({ val := a + b } : UpSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, ha, hb, map_add, map_add] + +set_option maxHeartbeats 1000000 in +/-- **The derivative identity** for the colour matrix of the jet gauge action: the + formal derivative of the colour matrix is minus the jet action matrix of the + Maurer–Cartan form times the colour matrix. -/ +lemma upMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (upMatrix U).map (fun f => pderiv ℂ μ f) + = -(jetActionMatrix (maurerCartanForm U μ) * upMatrix U) := by + have hleib : ∀ f g : JetRing, + pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] + have huu : ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + have hpow : pderiv ℂ μ (((U.2.2 : unitary JetRing) : JetRing) ^ 4) + = 4 * ((U.2.2 : unitary JetRing) : JetRing) ^ 3 + * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) := by + rw [show ((U.2.2 : unitary JetRing) : JetRing) ^ 4 + = ((U.2.2 : unitary JetRing) : JetRing) + * (((U.2.2 : unitary JetRing) : JetRing) + * (((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing))) from by ring, + hleib, hleib, hleib] + ring + have hm₃U₃ : (maurerCartanForm U μ).toSU3Matrix * U.1.1 + = Complex.I • U.1.1.map (pderiv ℂ μ) := by + rw [maurerCartanForm_toSU3Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₃u, + Matrix.mul_one] + have hiC : (algebraMap ℂ JetRing) Complex.I * (algebraMap ℂ JetRing) Complex.I + = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + have hmap : (((((U.2.2 : unitary JetRing) : JetRing)) ^ 4) • + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : + Matrix (Fin 3) (Fin 3) JetRing)).map (fun f => pderiv ℂ μ f) + = (pderiv ℂ μ ((((U.2.2 : unitary JetRing) : JetRing)) ^ 4)) • U.1.1 + + ((((U.2.2 : unitary JetRing) : JetRing)) ^ 4) + • (U.1.1.map (pderiv ℂ μ)) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] + exact hleib _ _ + rw [upMatrix, jetActionMatrix, hmap, Matrix.smul_mul, Matrix.add_mul, + Matrix.mul_smul, hm₃U₃, Matrix.smul_mul, Matrix.one_mul, + smul_comm ((((U.2.2 : unitary JetRing) : JetRing)) ^ 4) Complex.I, + smul_add, smul_smul Complex.I Complex.I, Complex.I_mul_I, neg_one_smul, + ← smul_assoc, neg_add_rev, neg_neg, ← neg_smul, smul_smul] + congr 1 + congr 1 + rw [maurerCartanForm_toU1Value, hpow, Algebra.smul_def, Algebra.smul_def, + Algebra.smul_def, map_ofNat] + linear_combination (4 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing) ^ 4) * hiC + - (4 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing) ^ 3) * huu + +/-- **The equivariance identity** for the colour matrix of the jet gauge action: the + colour matrix intertwines the constant jet action matrix with its adjoint + transform. -/ +lemma upMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : + upMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = jetActionMatrix (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c)) + * upMatrix U := by + have hU₃u : star U.1.1 * U.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rw [upMatrix, jetActionMatrix, jetActionMatrix, + JetGaugeAlgebra.adjointMap_toSU3Matrix, JetGaugeAlgebra.adjointMap_toU1Value] + conv_lhs => rw [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_add, Matrix.mul_smul, + Matrix.mul_one] + conv_rhs => rw [Matrix.smul_mul, Matrix.add_mul, Matrix.mul_smul, + Matrix.smul_mul, Matrix.one_mul, Matrix.mul_assoc, hU₃u, Matrix.mul_one] + rw [smul_add, smul_comm ((((U.2.2 : unitary JetRing) : JetRing)) ^ 4) + ((4 : ℂ) • (JetGaugeAlgebra.ofConstant c).toU1Value)] + +/-- The iterated formal derivative of a negation. -/ +private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) + = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] + +set_option maxHeartbeats 1000000 in +/-- **The base-point Taylor coefficients of the jet gauge action** on the up-type + singlet are the colour endomorphisms of the base-point Taylor coefficients of the + colour matrix. -/ +lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff repJetGaugeGroupI U x + = colourEnd ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + refine LinearMap.ext fun d => ?_ + apply valLinEquiv.injective + rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x d + = StandardModel.jetEval (StandardModel.jetIteratedDeriv x + (repJetGaugeGroupI U (StandardModel.jetOfConstant d))) from rfl, + valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, + colourEnd_apply_mk, LinearEquiv.apply_symm_apply, + repJetGaugeGroupI_eq_upMatrix, LinearEquiv.apply_symm_apply, + StandardModel.jetOfConstant_apply] + obtain ⟨w⟩ := d + induction w using TensorProduct.induction_on with + | zero => + rw [show ({ val := 0 } : UpSinglet) = 0 from rfl, TensorProduct.tmul_zero] + simp + rw [show (0 : UpSinglet).val = 0 from rfl, map_zero] + | add a b ha hb => + rw [show ({ val := a + b } : UpSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, + TensorProduct.tmul_add, map_add, map_add, map_add, map_add, ha, hb, map_add, + map_add] + | tmul ψ c => + rw [show jetValLinEquiv ((1 : JetRing) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet)) + = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing)) from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 3)) + Fermion.RightHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (upMatrix U)).restrictScalars ℂ)) + (ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 (upMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))) from rfl, + TensorProduct.map_tmul, TensorProduct.map_tmul, LinearMap.id_apply, + LinearMap.id_apply, + show valLinEquiv (⟨ψ ⊗ₜ[ℂ] c⟩ : UpSinglet) = ψ ⊗ₜ[ℂ] c from rfl, + show (Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 3)) + Fermion.RightHandedWeyl + (Matrix.toLpLinAlgEquiv 2 ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)))) (ψ ⊗ₜ[ℂ] c) + = ψ ⊗ₜ[ℂ] ((Matrix.toLpLinAlgEquiv 2 ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c) from rfl] + congr 1 + refine WithLp.ofLp_injective 2 ?_ + funext j + show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + (((Matrix.toLpLinAlgEquiv 2 (upMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j)) + = ((Matrix.toLpLinAlgEquiv 2 ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + rw [show ((Matrix.toLpLinAlgEquiv 2 (upMatrix U)) + (WithLp.toLp 2 fun i => c.ofLp i • (1 : JetRing))).ofLp j + = ∑ k, upMatrix U j k * (c.ofLp k • (1 : JetRing)) from by + simp [Matrix.mulVec_eq_sum, + Finset.sum_apply, mul_comm], + show ((Matrix.toLpLinAlgEquiv 2 ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) c).ofLp j + = ∑ k, constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (upMatrix U j k)) + * c.ofLp k from by + simp [Matrix.mulVec_eq_sum, + Finset.sum_apply, mul_comm], + JetRing.foldl_pderiv_sum, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, + mul_comm] + +set_option maxHeartbeats 1000000 in +/-- **The `(3, 1)_{4}` action of the gauge algebra is the infinitesimal action + underlying the jet gauge action on the up-type singlet**: its base-point Taylor + coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the + adjoint transports. -/ +theorem isInfinitesimalActionOf : + GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + constructor + · intro U μ x + have hMcons : ((upMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -((x.antidiagonal.map fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((upMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + rw [show ((upMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (((upMatrix U).map fun f => pderiv ℂ μ f).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.map_apply, Matrix.map_apply, + Multiset.foldl_cons], + upMatrix_map_pderiv, + show ((-(jetActionMatrix (maurerCartanForm U μ) * upMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -(((jetActionMatrix (maurerCartanForm U μ) * upMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.neg_apply, Matrix.neg_apply, + Matrix.map_apply, foldl_pderiv_neg, map_neg], + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [jetActionMatrix_map_cc_foldl])) + rw [repCoeff_eq, hMcons, colourEnd_neg, colourEnd_multiset_sum, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => ?_)) + rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] + rfl + · intro U x c + have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + Algebra.algebraMap_self_apply, ← map_mul] + have hconst : jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = (actionMatrix c).map (C : ℂ → JetRing) := by + refine Matrix.ext fun i j => ?_ + rw [jetActionMatrix, actionMatrix, JetGaugeAlgebra.ofConstant_toSU3Matrix, + JetGaugeAlgebra.ofConstant_toU1Value, Matrix.map_apply, Matrix.smul_apply, + Matrix.add_apply, Matrix.map_apply, Matrix.smul_apply, Matrix.smul_apply, + Matrix.add_apply, Matrix.smul_apply] + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq] + simp only [smul_eq_mul, mul_one] + rw [hCsmul, ← map_add, hCsmul] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + add_zero, add_zero, hCsmul] + exact congrArg C (by ring) + have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), + (((actionMatrix c).map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then actionMatrix c else 0 := by + intro m + rcases eq_or_ne m 0 with rfl | hm + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, constantCoeff_C] + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] + have hMact : ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c + = (x.antidiagonal.map fun p => + actionMatrix (IsGaugeField.adjointCoeff U p.1 c) + * ((upMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have h1 : ((upMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c := by + rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun p hp => by rw [hcollapse p.2]), + Multiset.sum_antidiagonal_eq_of_snd_ne_zero x + (fun p => ((upMatrix U).map fun f => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if p.2 = 0 then actionMatrix c else 0)) + (fun p hp => by rw [if_neg hp, Matrix.mul_zero]), + if_pos rfl] + rw [← h1, upMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [jetActionMatrix_map_cc_foldl, + show JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) + = IsGaugeField.adjointCoeff U p.1 c from rfl]) + rw [repCoeff_eq, + show (colourEnd ((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + ∘ₗ gaugeAlgebraAction c + = colourEnd (((upMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c) from by + rw [colourEnd_mul]; rfl, + hMact, colourEnd_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] + rfl + +end InfinitesimalAction + +end UpSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean new file mode 100644 index 000000000..bef3edac8 --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -0,0 +1,522 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.Analysis.Normed.Lp.Matrix +public import Mathlib.RingTheory.TensorProduct.Maps +/-! +# The infinitesimal gauge action on the Higgs doublet + +## i. Overview + +The infinitesimal `(1, 2)_{3}` action of the gauge algebra on the Higgs doublet: the +weak part of the algebra element acts on the weak index and the hypercharge part scales, +both through the physicists' factor of `i`, matching the group action `u ^ 3 • U₂` +infinitesimally. The compatibility with the jet gauge action — +`GaugeAlgebra.IsInfinitesimalActionOf` — is proved at the end of this file: the +base-point Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law +and intertwine the action with the adjoint transports. The proofs work through the weak +matrix `jetGaugeMatrix` of the jet action and the all-orders matrix Leibniz rule at the +base point. + +## ii. Key results + +- `weakEnd` : the endomorphism of the Higgs doublet defined by a `2 × 2` matrix on the + weak index. +- `gaugeAlgebraAction` : the infinitesimal `(1, 2)_{3}` action of the gauge algebra. +- `isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal action + underlying the jet gauge action `repJetGaugeGroupI`. + +## iii. Table of contents + +- A. The action of the gauge algebra +- B. The infinitesimal action underlies the jet gauge action + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct + +namespace HiggsVec + +open Matrix MatrixGroups + +/-! + +## A. The action of the gauge algebra + +-/ + +/-- The endomorphism of the Higgs doublet defined by a `2 × 2` complex matrix acting on + the weak index. -/ +noncomputable def weakEnd (A : Matrix (Fin 2) (Fin 2) ℂ) : + HiggsVec →ₗ[ℂ] HiggsVec := + (Matrix.toLpLinAlgEquiv 2 A : Module.End ℂ HiggsVec) + +lemma weakEnd_apply (A : Matrix (Fin 2) (Fin 2) ℂ) (v : HiggsVec) : + weakEnd A v = Matrix.toLpLinAlgEquiv 2 A v := rfl + +lemma weakEnd_add (A B : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (A + B) = weakEnd A + weakEnd B := by + rw [weakEnd, weakEnd, weakEnd, map_add] + +lemma weakEnd_smul (z : ℂ) (A : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (z • A) = z • weakEnd A := by + rw [weakEnd, weakEnd, map_smul] + +lemma weakEnd_zero : weakEnd 0 = 0 := by + rw [weakEnd, map_zero] + +lemma weakEnd_neg (A : Matrix (Fin 2) (Fin 2) ℂ) : weakEnd (-A) = -weakEnd A := by + rw [show (-A : Matrix (Fin 2) (Fin 2) ℂ) = (-1 : ℂ) • A from by rw [neg_one_smul], + weakEnd_smul, neg_one_smul] + +lemma weakEnd_multiset_sum (m : Multiset (Matrix (Fin 2) (Fin 2) ℂ)) : + weakEnd m.sum = (m.map weakEnd).sum := by + induction m using Multiset.induction_on with + | empty => simp [weakEnd_zero] + | cons A t ih => rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + weakEnd_add, ih] + +/-- The weak endomorphisms compose through matrix multiplication. -/ +lemma weakEnd_mul (A B : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (A * B) = weakEnd A ∘ₗ weakEnd B := by + rw [weakEnd, weakEnd, weakEnd, map_mul] + rfl + +/-- The matrix of the infinitesimal `(1, 2)_{3}` action of a gauge algebra element on + the weak index: `i` times the weak part, shifted by `i` times `3` the + hypercharge. -/ +noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ := + Complex.I • (c.toSU2Matrix + ((3 : ℂ) • c.toU1Value) • 1) + +/-- **The infinitesimal action of the gauge algebra on the Higgs doublet**: the + derivative of the `(1, 2)_{3}` action of the gauge group, real-linear in the + algebra slot and complex-linear in the value slot — the form consumed by the + covariant derivative `IsGaugeField.covDerivIter` and by + `GaugeAlgebra.IsInfinitesimalActionOf`. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] HiggsVec →ₗ[ℂ] HiggsVec where + toFun c := weakEnd (actionMatrix c) + map_add' c₁ c₂ := by + rw [show actionMatrix (c₁ + c₂) = actionMatrix c₁ + actionMatrix c₂ from by + rw [actionMatrix, actionMatrix, actionMatrix, GaugeAlgebra.add_toSU2Matrix, + GaugeAlgebra.add_toU1Value] + module] + rw [weakEnd_add] + map_smul' r c := by + rw [show actionMatrix (r • c) = (r : ℂ) • actionMatrix c from by + rw [actionMatrix, actionMatrix, GaugeAlgebra.smul_toSU2Matrix, + GaugeAlgebra.smul_toU1Value, + show (r • c.toSU2Matrix : Matrix (Fin 2) (Fin 2) ℂ) + = (r : ℂ) • c.toSU2Matrix from by + rw [← algebraMap_smul ℂ r c.toSU2Matrix]; rfl, + show r • c.toU1Value = (r : ℂ) • c.toU1Value from by + rw [← algebraMap_smul ℂ r c.toU1Value]; rfl] + module, + weakEnd_smul] + refine LinearMap.ext fun v => ?_ + rw [RingHom.id_apply] + show (r : ℂ) • weakEnd (actionMatrix c) v = r • weakEnd (actionMatrix c) v + rw [show ((r : ℝ) : ℂ) = algebraMap ℝ ℂ r from rfl, algebraMap_smul] + +/-! + +## B. The infinitesimal action underlies the jet gauge action + +The `(1, 2)_{3}` action of the gauge algebra is the infinitesimal action underlying the +jet gauge action, in the sense of `GaugeAlgebra.IsInfinitesimalActionOf`: the base-point +Taylor coefficients of the jet action satisfy the Maurer–Cartan Leibniz law and +intertwine the action with the adjoint transports. The proofs work through the weak +matrix of the jet action and the all-orders matrix Leibniz rule at the base point. + +-/ + +section InfinitesimalAction + +open MvPowerSeries + +/-- A single formal derivative commutes with the iterated one. -/ +private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f : JetRing) : + pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) f) + = x.foldl (fun h ρ => pderiv ℂ ρ h) (pderiv ℂ μ f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, ih, JetRing.pderiv_comm] + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +private lemma foldl_pderiv_smul (x : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (z • f) + = z • x.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, Derivation.map_smul, ih, Multiset.foldl_cons] + +/-- The jet-valued matrix of the infinitesimal `(1, 2)_{3}` action of a jet of gauge + algebra elements: the jet analogue of `actionMatrix`. -/ +noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 2) (Fin 2) JetRing := + Complex.I • (a.toSU2Matrix + ((3 : ℂ) • a.toU1Value) • 1) + +/-- The base-point Taylor coefficients of the jet action matrix are the action matrices + of the base-point Taylor coefficients. -/ +lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra) : + ((jetActionMatrix a).map fun f => + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := by + ext i j + rw [Matrix.map_apply, jetActionMatrix, actionMatrix, Matrix.smul_apply, + Matrix.add_apply, Matrix.smul_apply, Matrix.smul_apply, Matrix.add_apply, + Matrix.smul_apply, foldl_pderiv_smul, constantCoeff_smul, JetRing.foldl_pderiv_add, + map_add, JetGaugeAlgebra.eval_iteratedDeriv_toSU2Matrix, Matrix.map_apply] + congr 2 + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq, smul_eq_mul, mul_one, smul_eq_mul, + mul_one, foldl_pderiv_smul, constantCoeff_smul, + JetGaugeAlgebra.eval_iteratedDeriv_toU1Value] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + JetRing.foldl_pderiv_zero, map_zero] + +/-- The entrywise formal derivative on the weak coordinates, as a `ℂ`-linear map. -/ +private noncomputable def pderivWeak (μ : Fin 1 ⊕ Fin 3) : + EuclideanSpace JetRing (Fin 2) →ₗ[ℂ] EuclideanSpace JetRing (Fin 2) where + toFun v := WithLp.toLp 2 fun i => pderiv ℂ μ (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact Derivation.map_smul _ _ _ + +/-- The entrywise iterated formal derivative on the weak coordinates. -/ +private noncomputable def foldWeak (x : Multiset (Fin 1 ⊕ Fin 3)) : + EuclideanSpace JetRing (Fin 2) →ₗ[ℂ] EuclideanSpace JetRing (Fin 2) where + toFun v := WithLp.toLp 2 fun i => x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact JetRing.foldl_pderiv_add x _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact foldl_pderiv_smul x z _ + +/-- The entrywise base-point evaluation on the weak coordinates. -/ +private noncomputable def ccWeak : + EuclideanSpace JetRing (Fin 2) →ₗ[ℂ] EuclideanSpace ℂ (Fin 2) where + toFun v := WithLp.toLp 2 fun i => constantCoeff (v.ofLp i) + map_add' v w := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact map_add _ _ _ + map_smul' z v := by + refine WithLp.ofLp_injective 2 ?_ + funext i + exact constantCoeff_smul _ _ + +private lemma pderivWeak_comp_foldWeak (μ : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + pderivWeak μ ∘ₗ foldWeak x = foldWeak (μ ::ₘ x) := by + refine LinearMap.ext fun v => ?_ + refine WithLp.ofLp_injective 2 ?_ + funext i + show pderiv ℂ μ (x.foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i)) + = (μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (v.ofLp i) + rw [Multiset.foldl_cons, pderiv_foldl] + +/-- The identification of Higgs-doublet jets intertwines the formal derivative with the + entrywise derivative on the weak coordinates. -/ +private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (z : JetRing ⊗[ℂ] HiggsVec) : + jetValLinEquiv (StandardModel.jetDeriv μ z) + = pderivWeak μ (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f v => + rw [StandardModel.jetDeriv_tmul, jetValLinEquiv_tmul, jetValLinEquiv_tmul] + refine WithLp.ofLp_injective 2 ?_ + funext i + exact (Derivation.map_smul (pderiv ℂ μ) (v.ofLp i) f).symm + +/-- The identification of Higgs-doublet jets intertwines the iterated formal derivative + with the entrywise iterated derivative on the weak coordinates. -/ +private lemma jetValLinEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] HiggsVec) : + jetValLinEquiv (StandardModel.jetIteratedDeriv x z) + = foldWeak x (jetValLinEquiv z) := by + induction x using Multiset.induction_on with + | empty => + rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, + show foldWeak 0 = LinearMap.id from LinearMap.ext fun v => + WithLp.ofLp_injective 2 rfl, + LinearMap.id_apply] + | cons μ t ih => + rw [StandardModel.jetIteratedDeriv_cons, LinearMap.comp_apply, + jetValLinEquiv_jetDeriv, ih, ← LinearMap.comp_apply, pderivWeak_comp_foldWeak] + +/-- The base-point evaluation of a Higgs-doublet jet through the weak coordinates. -/ +private lemma jetEval_eq (z : JetRing ⊗[ℂ] HiggsVec) : + StandardModel.jetEval z = ccWeak (jetValLinEquiv z) := by + induction z using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, map_add, ha, hb] + | tmul f v => + rw [StandardModel.jetEval_tmul, jetValLinEquiv_tmul] + refine WithLp.ofLp_injective 2 ?_ + funext i + show (constantCoeff f • v).ofLp i = constantCoeff (v.ofLp i • f) + simp [constantCoeff_smul, mul_comm] + +set_option maxHeartbeats 1000000 in +/-- **The derivative identity** for the weak matrix of the jet gauge action: the + formal derivative of the weak matrix is minus the jet action matrix of the + Maurer–Cartan form times the weak matrix. -/ +lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + (jetGaugeMatrix U).map (fun f => pderiv ℂ μ f) + = -(jetActionMatrix (maurerCartanForm U μ) * jetGaugeMatrix U) := by + have hjet : jetGaugeMatrix U + = (((U.2.2 : unitary JetRing) : JetRing) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) := rfl + have hleib : ∀ f g : JetRing, + pderiv ℂ μ (f * g) = pderiv ℂ μ f * g + f * pderiv ℂ μ g := fun f g => by + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, add_comm, mul_comm g] + have huu : ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Unitary.mul_star_self_of_mem (U.2.2 : unitary JetRing).2 + have hU₂u : star U.2.1.1 * U.2.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + have hm₂U₂ : (maurerCartanForm U μ).toSU2Matrix * U.2.1.1 + = Complex.I • U.2.1.1.map (pderiv ℂ μ) := by + rw [maurerCartanForm_toSU2Matrix, Matrix.smul_mul, Matrix.mul_assoc, hU₂u, + Matrix.mul_one] + have hiC : (algebraMap ℂ JetRing) Complex.I * (algebraMap ℂ JetRing) Complex.I + = -1 := by + rw [← map_mul, Complex.I_mul_I, map_neg, map_one] + have hmap : (((((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing)).map (fun f => pderiv ℂ μ f) + = (pderiv ℂ μ (((U.2.2 : unitary JetRing) : JetRing) ^ 3)) • U.2.1.1 + + ((((U.2.2 : unitary JetRing) : JetRing)) ^ 3) + • (U.2.1.1.map (pderiv ℂ μ)) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] + exact hleib _ _ + rw [hjet, jetActionMatrix, hmap, Matrix.smul_mul, Matrix.add_mul, + Matrix.mul_smul, hm₂U₂, Matrix.smul_mul, Matrix.one_mul, + smul_comm ((((U.2.2 : unitary JetRing) : JetRing)) ^ 3) Complex.I, + smul_add, smul_smul Complex.I Complex.I, Complex.I_mul_I, neg_one_smul, + ← smul_assoc, neg_add, neg_neg, ← neg_smul, smul_smul, + add_comm (pderiv ℂ μ (((U.2.2 : unitary JetRing) : JetRing) ^ 3) • U.2.1.1) + ((((U.2.2 : unitary JetRing) : JetRing) ^ 3) • U.2.1.1.map (pderiv ℂ μ))] + congr 1 + congr 1 + rw [maurerCartanForm_toU1Value, + show ((U.2.2 : unitary JetRing) : JetRing) ^ 3 + = ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing) from by ring, + hleib, hleib, Algebra.smul_def, Algebra.smul_def, Algebra.smul_def, + map_ofNat] + linear_combination (3 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * star ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing)) * hiC + - (3 * pderiv ℂ μ ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing) + * ((U.2.2 : unitary JetRing) : JetRing)) * huu + +/-- **The equivariance identity** for the weak matrix of the jet gauge action: the + weak matrix intertwines the constant jet action matrix with its adjoint + transform. -/ +lemma jetGaugeMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : + jetGaugeMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = jetActionMatrix (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c)) + * jetGaugeMatrix U := by + have hjet : jetGaugeMatrix U + = (((U.2.2 : unitary JetRing) : JetRing) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : + Matrix (Fin 2) (Fin 2) JetRing) := rfl + have hU₂u : star U.2.1.1 * U.2.1.1 = 1 := + Matrix.mem_unitaryGroup_iff'.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rw [hjet, jetActionMatrix, jetActionMatrix, + JetGaugeAlgebra.adjointMap_toSU2Matrix, JetGaugeAlgebra.adjointMap_toU1Value] + conv_lhs => rw [Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_add, Matrix.mul_smul, + Matrix.mul_one] + conv_rhs => rw [Matrix.smul_mul, Matrix.add_mul, Matrix.mul_smul, + Matrix.smul_mul, Matrix.one_mul, Matrix.mul_assoc, hU₂u, Matrix.mul_one] + rw [smul_add, smul_comm ((((U.2.2 : unitary JetRing) : JetRing)) ^ 3) + ((3 : ℂ) • (JetGaugeAlgebra.ofConstant c).toU1Value)] + +/-- The iterated formal derivative of a negation. -/ +private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (-f) + = -(x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + induction x using Multiset.induction_on generalizing f with + | empty => rfl + | cons ν t ih => rw [Multiset.foldl_cons, map_neg, ih, Multiset.foldl_cons] + +set_option maxHeartbeats 1000000 in +/-- **The base-point Taylor coefficients of the jet gauge action** on the Higgs + doublet are the weak endomorphisms of the base-point Taylor coefficients of the + weak matrix. -/ +lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff repJetGaugeGroupI U x + = weakEnd ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + refine LinearMap.ext fun v => ?_ + rw [show IsGaugeField.repCoeff repJetGaugeGroupI U x v + = StandardModel.jetEval (StandardModel.jetIteratedDeriv x + (repJetGaugeGroupI U (StandardModel.jetOfConstant v))) from rfl, + jetEval_eq, jetValLinEquiv_jetIteratedDeriv, repJetGaugeGroupI_apply, + LinearEquiv.apply_symm_apply, StandardModel.jetOfConstant_apply, + jetValLinEquiv_tmul] + refine WithLp.ofLp_injective 2 ?_ + funext j + show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + (((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)) + (WithLp.toLp 2 fun i => v.ofLp i • (1 : JetRing))).ofLp j)) + = ((Matrix.toLpLinAlgEquiv 2 ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) v).ofLp j + rw [show ((Matrix.toLpLinAlgEquiv 2 (jetGaugeMatrix U)) + (WithLp.toLp 2 fun i => v.ofLp i • (1 : JetRing))).ofLp j + = ∑ k, jetGaugeMatrix U j k * (v.ofLp k • (1 : JetRing)) from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + show ((Matrix.toLpLinAlgEquiv 2 ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) v).ofLp j + = ∑ k, constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (jetGaugeMatrix U j k)) + * v.ofLp k from by + simp [Matrix.mulVec_eq_sum, Finset.sum_apply, mul_comm], + JetRing.foldl_pderiv_sum, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, + mul_comm] + +set_option maxHeartbeats 1000000 in +/-- **The `(1, 2)_{3}` action of the gauge algebra is the infinitesimal action + underlying the jet gauge action on the Higgs doublet**: its base-point Taylor + coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the + adjoint transports. -/ +theorem isInfinitesimalActionOf : + GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + constructor + · intro U μ x + have hMcons : ((jetGaugeMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -((x.antidiagonal.map fun p => + actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (maurerCartanForm U μ))) + * ((jetGaugeMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + rw [show ((jetGaugeMatrix U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (((jetGaugeMatrix U).map fun f => pderiv ℂ μ f).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.map_apply, Matrix.map_apply, + Multiset.foldl_cons], + jetGaugeMatrix_map_pderiv, + show ((-(jetActionMatrix (maurerCartanForm U μ) * jetGaugeMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -(((jetActionMatrix (maurerCartanForm U μ) * jetGaugeMatrix U)).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + Matrix.ext fun i j => by + rw [Matrix.map_apply, Matrix.neg_apply, Matrix.neg_apply, + Matrix.map_apply, foldl_pderiv_neg, map_neg], + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [jetActionMatrix_map_cc_foldl])) + rw [repCoeff_eq, hMcons, weakEnd_neg, weakEnd_multiset_sum, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => ?_)) + rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] + rfl + · intro U x c + have hCsmul : ∀ z w : ℂ, (z • (C w : JetRing)) = C (z * w) := fun z w => by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + Algebra.algebraMap_self_apply, ← map_mul] + have hconst : jetActionMatrix (JetGaugeAlgebra.ofConstant c) + = (actionMatrix c).map (C : ℂ → JetRing) := by + refine Matrix.ext fun i j => ?_ + rw [jetActionMatrix, actionMatrix, JetGaugeAlgebra.ofConstant_toSU2Matrix, + JetGaugeAlgebra.ofConstant_toU1Value, Matrix.map_apply, Matrix.smul_apply, + Matrix.add_apply, Matrix.map_apply, Matrix.smul_apply, Matrix.smul_apply, + Matrix.add_apply, Matrix.smul_apply] + by_cases hij : i = j + · subst hij + rw [Matrix.one_apply_eq, Matrix.one_apply_eq] + simp only [smul_eq_mul, mul_one] + rw [hCsmul, ← map_add, hCsmul] + · rw [Matrix.one_apply_ne hij, Matrix.one_apply_ne hij, smul_zero, smul_zero, + add_zero, add_zero, hCsmul] + exact congrArg C (by ring) + have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), + (((actionMatrix c).map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then actionMatrix c else 0 := by + intro m + rcases eq_or_ne m 0 with rfl | hm + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, constantCoeff_C] + · refine Matrix.ext fun i j => ?_ + simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] + have hMact : ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c + = (x.antidiagonal.map fun p => + actionMatrix (IsGaugeField.adjointCoeff U p.1 c) + * ((jetGaugeMatrix U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have h1 : ((jetGaugeMatrix U * jetActionMatrix (JetGaugeAlgebra.ofConstant c)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c := by + rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + Multiset.map_congr rfl (fun p hp => by rw [hcollapse p.2]), + Multiset.sum_antidiagonal_eq_of_snd_ne_zero x + (fun p => ((jetGaugeMatrix U).map fun f => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if p.2 = 0 then actionMatrix c else 0)) + (fun p hp => by rw [if_neg hp, Matrix.mul_zero]), + if_pos rfl] + rw [← h1, jetGaugeMatrix_mul_jetActionMatrix, + matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [jetActionMatrix_map_cc_foldl, + show JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant c))) + = IsGaugeField.adjointCoeff U p.1 c from rfl]) + rw [repCoeff_eq, + show (weakEnd ((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f))) + ∘ₗ gaugeAlgebraAction c + = weakEnd (((jetGaugeMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + * actionMatrix c) from by + rw [weakEnd_mul]; rfl, + hMact, weakEnd_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] + rfl + +end InfinitesimalAction + +end HiggsVec + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index 780824a6f..4f11cf5e0 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -17,6 +17,7 @@ public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzActio public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.UpSinglet public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet From ad12b442a1ed490f37e256ea6b58f418621409f7 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 14:56:02 +0100 Subject: [PATCH 220/254] feat: Add covariance lemma --- .../DownSinglet/GaugeAlgebraAction.lean | 26 + .../LeptonDoublet/GaugeAlgebraAction.lean | 26 + .../LeptonSinglet/GaugeAlgebraAction.lean | 10 + .../QuarkDoublet/GaugeAlgebraAction.lean | 32 + .../UpSinglet/GaugeAlgebraAction.lean | 25 + .../GaugeAlgebra/InfinitesimalAction.lean | 48 + .../AlgebraValued/Symmeterized.lean | 134 +- .../GaugeJetAlgebra/Invariants.lean | 4 +- .../HiggsBoson/GaugeAlgebraAction.lean | 23 + .../StandardModel/IsStandardModel/Basic.lean | 1524 +++++++++++++++-- .../StandardModel/JetAlgebra/Invariants.lean | 10 +- .../JetComponentSpace/CovariantDeriv.lean | 46 +- 12 files changed, 1763 insertions(+), 145 deletions(-) diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index d861fb85c..3e95cb5fd 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -497,6 +497,32 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, mul_comm] +/-- The colour endomorphism of the identity matrix is the identity. -/ +lemma colourEnd_one : colourEnd 1 = LinearMap.id := by + refine LinearMap.ext fun v => ?_ + rw [colourEnd_apply_mk, map_one, map_one, Module.End.one_apply, + LinearEquiv.symm_apply_apply, LinearMap.id_apply] + +/-- At the base point, a gauge jet with trivial value acts trivially: the zeroth + Taylor coefficient of the jet gauge action is the identity. -/ +lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : + IsGaugeField.repCoeff repJetGaugeGroupI U 0 = LinearMap.id := by + have h1 : (constantCoeff : JetRing →+* ℂ).mapMatrix + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + = 1 := Subtype.ext_iff.mp (congrArg Prod.fst hU) + have hu : constantCoeff ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.2) hU) + have hM : ((downMatrix U).map fun f => + constantCoeff ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = 1 := by + ext i j + rw [Matrix.map_apply, Multiset.foldl_zero, downMatrix, Matrix.smul_apply, + smul_eq_mul, map_mul, map_pow, JetRing.constantCoeff_star, hu, star_one, + one_pow, one_mul] + exact Matrix.ext_iff.mpr h1 i j + rw [repCoeff_eq, hM, colourEnd_one] + + set_option maxHeartbeats 1000000 in /-- **The `(3, 1)_{-2}` action of the gauge algebra is the infinitesimal action underlying the jet gauge action on the down-type singlet**: its base-point Taylor diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index da8e24eff..a5dcfce64 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -510,6 +510,32 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, mul_comm] + +/-- The weak endomorphism of the identity matrix is the identity. -/ +lemma weakEnd_one : weakEnd 1 = LinearMap.id := by + refine LinearMap.ext fun v => ?_ + rw [weakEnd_apply_mk, map_one, map_one, Module.End.one_apply, + LinearEquiv.symm_apply_apply, LinearMap.id_apply] + +/-- At the base point, a gauge jet with trivial value acts trivially: the zeroth + Taylor coefficient of the jet gauge action is the identity. -/ +lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : + IsGaugeField.repCoeff repJetGaugeGroupI U 0 = LinearMap.id := by + have h2 : (constantCoeff : JetRing →+* ℂ).mapMatrix + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + = 1 := Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.1) hU) + have hu : constantCoeff ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.2) hU) + have hM : ((doubletMatrix U).map fun f => + constantCoeff ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = 1 := by + ext i j + rw [Matrix.map_apply, Multiset.foldl_zero, doubletMatrix, Matrix.smul_apply, + smul_eq_mul, map_mul, map_pow, JetRing.constantCoeff_star, hu, star_one, + one_pow, one_mul] + exact Matrix.ext_iff.mpr h2 i j + rw [repCoeff_eq, hM, weakEnd_one] + set_option maxHeartbeats 1000000 in /-- **The `(1, 2)_{-3}` action of the gauge algebra is the infinitesimal action underlying the jet gauge action on the lepton doublet**: its base-point Taylor diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index 52ba59e66..2784dce3c 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -186,6 +186,16 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : jetIteratedDeriv_tmul, StandardModel.jetEval_tmul, jetPhase_eq, LinearMap.smul_apply, LinearMap.id_apply] +/-- At the base point, a gauge jet with trivial value acts trivially: the zeroth + Taylor coefficient of the jet gauge action is the identity. -/ +lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : + IsGaugeField.repCoeff repJetGaugeGroupI U 0 = LinearMap.id := by + have hu : constantCoeff ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.2) hU) + rw [repCoeff_eq, Multiset.foldl_zero, jetPhase_eq, map_pow, + JetRing.constantCoeff_star, hu, star_one, one_pow, one_smul] + + /-! ## D. The derivative identity for the hypercharge phase diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index 3f630facd..83535f303 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -613,6 +613,38 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : simp only [map_add] rw [ha, hb] + +/-- The colour–weak endomorphism of the identity matrix is the identity. -/ +lemma colourWeakEnd_one : colourWeakEnd 1 = LinearMap.id := by + refine LinearMap.ext fun v => ?_ + rw [colourWeakEnd_apply_mk, map_one, map_one, Module.End.one_apply, + LinearEquiv.symm_apply_apply, LinearMap.id_apply] + +/-- At the base point, a gauge jet with trivial value acts trivially: the zeroth + Taylor coefficient of the jet gauge action is the identity. -/ +lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : + IsGaugeField.repCoeff repJetGaugeGroupI U 0 = LinearMap.id := by + have h1 : (constantCoeff : JetRing →+* ℂ).mapMatrix + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + = 1 := Subtype.ext_iff.mp (congrArg Prod.fst hU) + have h2 : (constantCoeff : JetRing →+* ℂ).mapMatrix + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + = 1 := Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.1) hU) + have hu : constantCoeff ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.2) hU) + have hM : ((jetGaugeMatrix U).map fun f => + constantCoeff ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = 1 := by + rw [show (1 : Matrix (Fin 3 × Fin 2) (Fin 3 × Fin 2) ℂ) + = (1 : Matrix (Fin 3) (Fin 3) ℂ) ⊗ₖ (1 : Matrix (Fin 2) (Fin 2) ℂ) from + (Matrix.one_kronecker_one).symm, ← h1, ← h2] + ext i j + rw [Matrix.map_apply, Multiset.foldl_zero, jetGaugeMatrix, Matrix.smul_apply, + smul_eq_mul, map_mul, hu, one_mul, Matrix.kronecker_apply, + Matrix.kronecker_apply, map_mul, RingHom.mapMatrix_apply, + RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.map_apply] + rw [repCoeff_eq, hM, colourWeakEnd_one] + set_option maxHeartbeats 1000000 in /-- **The `(3, 2)_{1}` action of the gauge algebra is the infinitesimal action underlying the jet gauge action on the quark doublet**: its base-point Taylor diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index c3a0d4138..b8d2c1a3a 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -492,6 +492,31 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, mul_comm] + +/-- The colour endomorphism of the identity matrix is the identity. -/ +lemma colourEnd_one : colourEnd 1 = LinearMap.id := by + refine LinearMap.ext fun v => ?_ + rw [colourEnd_apply_mk, map_one, map_one, Module.End.one_apply, + LinearEquiv.symm_apply_apply, LinearMap.id_apply] + +/-- At the base point, a gauge jet with trivial value acts trivially: the zeroth + Taylor coefficient of the jet gauge action is the identity. -/ +lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : + IsGaugeField.repCoeff repJetGaugeGroupI U 0 = LinearMap.id := by + have h1 : (constantCoeff : JetRing →+* ℂ).mapMatrix + ((U.1 : specialUnitaryGroup (Fin 3) JetRing) : Matrix (Fin 3) (Fin 3) JetRing) + = 1 := Subtype.ext_iff.mp (congrArg Prod.fst hU) + have hu : constantCoeff ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.2) hU) + have hM : ((upMatrix U).map fun f => + constantCoeff ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = 1 := by + ext i j + rw [Matrix.map_apply, Multiset.foldl_zero, upMatrix, Matrix.smul_apply, + smul_eq_mul, map_mul, map_pow, hu, one_pow, one_mul] + exact Matrix.ext_iff.mpr h1 i j + rw [repCoeff_eq, hM, colourEnd_one] + set_option maxHeartbeats 1000000 in /-- **The `(3, 1)_{4}` action of the gauge algebra is the infinitesimal action underlying the jet gauge action on the up-type singlet**: its base-point Taylor diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean index ef4d322a7..665caa967 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv /-! # The infinitesimal action underlying a matter representation @@ -320,6 +321,42 @@ theorem _root_.StandardModel.TransformsIn.covDerivAction hR, hcancel] abel +/-- **Every iterated covariant derivative preserves `TransformsIn`**: if `F` transforms + in `rep` and `act` is the infinitesimal action underlying `rep`, then + `∇_{l 0} ⋯ ∇_{l (n-1)} F` transforms in `rep` — the recursion of + `TransformsIn.covDerivAction` over the tuple of directions. -/ +theorem _root_.StandardModel.TransformsIn.covDerivIter + (hA : IsGaugeField repLorentz repGauge A) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hF : TransformsIn repGauge rep F) + (hact : IsInfinitesimalActionOf act rep) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repGauge rep (IsGaugeField.covDerivIter A act F n l) := by + induction n with + | zero => exact hF + | succ n ih => + exact TransformsIn.covDerivAction hA (ih fun i => l i.succ) hact (l 0) + +omit [FiniteDimensional ℂ V] in +/-- **Matter gauge tensors whose zeroth representation coefficient is trivial on pure + jets are fixed by pure jets**: for a family transforming in `rep`, a gauge jet with + trivial base-point value acts trivially on the underived symbol, provided the + representation's zeroth Taylor coefficient is the identity on such jets. -/ +lemma _root_.StandardModel.TransformsIn.repGauge_eq_of_mem_truncationKer_zero + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hF : TransformsIn repGauge rep F) + (hrep : ∀ {W : JetGaugeGroupI}, W.eval = 1 → repCoeff rep W 0 = LinearMap.id) + (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ V) : + repGauge U.1 (F 0 φ) = F 0 φ := by + have hinv : ((U.1)⁻¹).eval = 1 := by + rw [map_inv, JetGaugeGroupI.mem_truncationKer_zero_iff.mp U.2, inv_one] + have h1 := hF U.1 φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + rw [h1, show repDualCoeff rep (U.1)⁻¹ 0 = (repCoeff rep (U.1)⁻¹ 0).dualMap from rfl, + hrep hinv] + rfl + end MatterCovariance /-! @@ -347,6 +384,10 @@ lemma _root_.ConjModule.endConj_apply {k : Type*} [CommRing k] [StarRing k] {M : ConjModule.endConj f v = conjEquiv (k := k) (M := M) (f ((conjEquiv (k := k) (M := M)).symm v)) := rfl +lemma _root_.ConjModule.endConj_id {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] : + ConjModule.endConj (LinearMap.id : M →ₗ[k] M) = LinearMap.id := rfl + lemma _root_.ConjModule.endConj_comp {k : Type*} [CommRing k] [StarRing k] {M : Type*} [AddCommGroup M] [Module k M] (f g : M →ₗ[k] M) : ConjModule.endConj (f ∘ₗ g) = ConjModule.endConj f ∘ₗ ConjModule.endConj g := rfl @@ -471,6 +512,13 @@ lemma repCoeff_repConj (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ rw [hv, repConj_conjJetEquiv, hderiv, heval] rfl +/-- The base-point triviality of the zeroth Taylor coefficient passes to the + conjugate representation. -/ +lemma repCoeff_repConj_zero_eq_id {W : JetGaugeGroupI} + (hrep : repCoeff rep W 0 = LinearMap.id) : + repCoeff (repConj rep) W 0 = LinearMap.id := by + rw [repCoeff_repConj, hrep, ConjModule.endConj_id] + /-- **The conjugate of an infinitesimal action underlies the conjugate representation**: conjugating the Taylor coefficients preserves both the Maurer–Cartan Leibniz law and the adjoint intertwining, since the gauge-algebra diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean index 5264f644f..38bf0e58e 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean @@ -596,6 +596,18 @@ lemma TransformsInAdjoint.repGauge_eq_of_mem_truncationKer_zero rw [map_inv, JetGaugeGroupI.mem_truncationKer_zero_iff.mp U.2, inv_one] simpa [adjointDualCoeff_zero_of_eval_eq_one hinv] using hF U.1 φ 0 +/-- **Every iterated covariant derivative of the field strength is an adjoint gauge + tensor**: the recursion of `TransformsInAdjoint.covDerivAdjoint` over the list of + directions, from the base case `transformsInAdjoint_fieldStrength`. -/ +theorem transformsInAdjoint_iteratedCovDerivAdjoint + (hA : IsGaugeField repLorentz repGauge A) (l : List (Fin 1 ⊕ Fin 3)) + (ν lam : Fin 1 ⊕ Fin 3) : + TransformsInAdjoint repGauge + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) := by + induction l with + | nil => exact transformsInAdjoint_fieldStrength hA ν lam + | cons ρ l ih => exact TransformsInAdjoint.covDerivAdjoint hA ih ρ + /-- **4.** The covariant derivatives of the field strength are invariant under the kernel of the zeroth truncation: they transform in the adjoint, and the truncation kernel acts through the trivial base-point adjoint. -/ @@ -604,13 +616,9 @@ lemma repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero (U : JetGaugeGroupI.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : repGauge U.1 (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ) = - iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ := by - have hadj : TransformsInAdjoint repGauge - (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) := by - induction l with - | nil => exact transformsInAdjoint_fieldStrength hA ν lam - | cons ρ l ih => exact TransformsInAdjoint.covDerivAdjoint hA ih ρ - exact hadj.repGauge_eq_of_mem_truncationKer_zero U φ + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ := + (transformsInAdjoint_iteratedCovDerivAdjoint hA l ν + lam).repGauge_eq_of_mem_truncationKer_zero U φ /-! @@ -813,7 +821,8 @@ lemma eq_zero_of_forall_sum_smul_pow_eq_zero {n : ℕ} {b : ℕ → B} /-- Any element of the subalgebra generated by a subalgebra `R` and a single central element `y` is a polynomial in `y` with coefficients in `R`. -/ -lemma exists_polynomial_rep (R : Subalgebra ℂ B) (y : B) (hy : y ∈ Subring.center B) +lemma exists_polynomial_rep (R : Subalgebra ℂ B) (y : B) + (hy : ∀ r ∈ R, Commute r y) {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ {y}) : ∃ (n : ℕ) (r : ℕ → B), (∀ k, r k ∈ R) ∧ x = ∑ k ∈ Finset.range n, r k * y ^ k := by classical @@ -885,7 +894,7 @@ lemma exists_polynomial_rep (R : Subalgebra ℂ B) (y : B) (hy : y ∈ Subring.c rw [Finset.sum_mul_sum] refine hsum _ _ _ fun k _ => hsum _ _ _ fun l _ => ?_ have hcomm : y ^ k * r₂ l = r₂ l * y ^ k := - (Subring.mem_center_iff.mp (pow_mem hy k) (r₂ l)).symm + ((hy _ (h₂ l)).pow_right k).eq.symm have hterm : (r₁ k * y ^ k) * (r₂ l * y ^ l) = (r₁ k * r₂ l) * y ^ (k + l) := by rw [← mul_assoc, mul_assoc (r₁ k), hcomm, ← mul_assoc, mul_assoc, ← pow_add] rw [hterm] @@ -897,7 +906,7 @@ lemma exists_polynomial_rep (R : Subalgebra ℂ B) (y : B) (hy : y ∈ Subring.c coefficient of any chosen polynomial representation to vanish, by expanding the translated polynomial and extracting the top power of the shift. -/ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) - (hy : y ∈ Subring.center B) (Φ : ℝ → B →+* B) + (hy : ∀ r ∈ R, Commute r y) (Φ : ℝ → B →+* B) (hΦR : ∀ t : ℝ, ∀ z ∈ R, Φ t z = z) (hΦy : ∀ t : ℝ, Φ t y = y + algebraMap ℂ B (t : ℂ)) {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ {y}) (hinv : ∀ t, Φ t x = x) : x ∈ R := by @@ -1018,7 +1027,8 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) nonconstant coefficients of the chosen representation to vanish, top degree first. -/ theorem mem_of_translationInvariant {ι : Type} [Fintype ι] (R : Subalgebra ℂ B) (y : ι → B) - (hy : ∀ i, y i ∈ Subring.center B) + (hyR : ∀ i, ∀ r ∈ R, Commute r (y i)) + (hyy : ∀ i j, Commute (y i) (y j)) (Φ : (ι → ℝ) → (B →+* B)) (hΦR : ∀ t, ∀ z ∈ R, Φ t z = z) (hΦy : ∀ t i, Φ t (y i) = y i + algebraMap ℂ B (t i)) @@ -1058,23 +1068,82 @@ theorem mem_of_translationInvariant {ι : Type} [Fintype ι] | algebraMap c => exact hΦR _ _ (Subalgebra.algebraMap_mem R c) | add a b _ _ iha ihb => rw [map_add, iha, ihb] | mul a b _ _ iha ihb => rw [map_mul, iha, ihb] + have hy' : ∀ r ∈ R ⊔ Algebra.adjoin ℂ (y '' ↑s), Commute r (y i) := by + intro r hr + rw [← Algebra.adjoin_eq R, ← Algebra.adjoin_union] at hr + induction hr using Algebra.adjoin_induction with + | mem b hb => + rcases hb with hbR | ⟨j, hj, rfl⟩ + · exact hyR i b hbR + · exact hyy j i + | algebraMap c => exact Algebra.commutes c (y i) + | add a b _ _ iha ihb => exact iha.add_left ihb + | mul a b _ _ iha ihb => exact iha.mul_left ihb have hxmid : x ∈ R ⊔ Algebra.adjoin ℂ (y '' ↑s) := - mem_of_translationInvariant_single (R ⊔ Algebra.adjoin ℂ (y '' ↑s)) (y i) (hy i) + mem_of_translationInvariant_single (R ⊔ Algebra.adjoin ℂ (y '' ↑s)) (y i) hy' (fun u => Φ (Pi.single i u)) hfix (fun u => by rw [hΦy (Pi.single i u) i, Pi.single_eq_same]) hxR' (fun u => hinv _) exact ih x hxmid hinv +/-- Commutation with a generating set extends to the generated subalgebra. -/ +lemma commute_of_mem_adjoin {X : Set B} {y : B} (hX : ∀ x ∈ X, Commute x y) + {r : B} (hr : r ∈ Algebra.adjoin ℂ X) : Commute r y := by + induction hr using Algebra.adjoin_induction with + | mem b hb => exact hX b hb + | algebraMap c => exact Algebra.commutes c y + | add a b _ _ iha ihb => exact iha.add_left ihb + | mul a b _ _ iha ihb => exact iha.mul_left ihb + +/-- Anything commuting with all gauge-field symbols commutes with the symmetrized + symbols. -/ +lemma commute_symmetrizedDeriv_right {y : B} + (hy : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), Commute y (A p μ φ)) + (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + Commute y (symmetrizedDeriv r A φ) := by + rw [symmetrizedDeriv, ← algebraMap_smul ℂ ((1 : ℝ)/(r.card : ℝ))] + refine Commute.smul_right ?_ _ + refine Commute.multiset_sum_right _ _ fun x hx => ?_ + obtain ⟨μ, hμ, rfl⟩ := Multiset.mem_map.mp hx + exact hy _ _ _ + +/-- The underived covariant field-strength tower consists of polynomials in the + gauge-field symbols. -/ +lemma iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols + (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ ∈ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A p μ ψ} := by + rw [show iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ = + (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ - + fieldStrength A ν lam (Multiset.ofList l + 0) φ) + + fieldStrength A ν lam (Multiset.ofList l + 0) φ from by abel] + refine add_mem + (SetLike.le_def.mp (Algebra.adjoin_mono ?_) + (iteratedCovDerivAdjoint_sub_mem l ν lam 0 φ)) + (SetLike.le_def.mp (Algebra.adjoin_mono ?_) + (fieldStrength_mem_adjoin_symbols _ ν lam φ)) + · rintro b ⟨p, μ, ψ, _, rfl⟩ + exact ⟨p, μ, ψ, rfl⟩ + · rintro b ⟨p, μ, ψ, _, rfl⟩ + exact ⟨p, μ, ψ, rfl⟩ + +set_option maxHeartbeats 1000000 in /-- **The classification of invariants**: a gauge-invariant element of the subalgebra generated by the gauge-field symbols and a set `S` of `truncationKer 0`-fixed elements is a polynomial in the covariant derivatives of the field strength and the - elements of `S`. Requires only centrality of the symbols (the gauge field is - bosonic); no independence hypothesis. -/ + elements of `S`. Requires only that the gauge-field symbols commute with each other + (the gauge field is bosonic) and with the elements of `S` — nothing about the rest + of `B`; no independence hypothesis. -/ theorem invariant_mem_adjoin_fieldStrength (hA : IsGaugeField repLorentz repGauge A) - (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), A p μ φ ∈ Subring.center B) + (hcomm : ∀ (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ ψ : Module.Dual ℝ GaugeAlgebra), Commute (A p μ φ) (A q ν ψ)) (S : Set B) + (hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), ∀ y ∈ S, Commute y (A p μ φ)) (hS : ∀ y ∈ S, ∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 y = y) {x : B} (hx : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) @@ -1247,10 +1316,39 @@ theorem invariant_mem_adjoin_fieldStrength exact SetLike.le_def.mp le_sup_right (Algebra.subset_adjoin ⟨(⟨r, hcard⟩, j), rfl⟩) · exact SetLike.le_def.mp le_sup_left (Algebra.subset_adjoin (Or.inr hb)) + -- the commutation data: symbols commute with each other, the tower, and `S` + have hsymbSD : ∀ (a : Multiset (Fin 1 ⊕ Fin 3)) (b : Fin 1 ⊕ Fin 3) + (c : Module.Dual ℝ GaugeAlgebra) (r : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra), + Commute (A a b c) (symmetrizedDeriv r A φ) := + fun a b c r φ => commute_symmetrizedDeriv_right + (fun p' μ' φ' => hcomm a p' b μ' c φ') r φ + have hsymbY : ∀ (a : Multiset (Fin 1 ⊕ Fin 3)) (b : Fin 1 ⊕ Fin 3) + (c : Module.Dual ℝ GaugeAlgebra) (p), Commute (A a b c) (Y p) := + fun a b c p => hsymbSD a b c (p.1 : Multiset (Fin 1 ⊕ Fin 3)) (bv.coord p.2) + have hYY : ∀ p q, Commute (Y p) (Y q) := + fun p q => commute_symmetrizedDeriv_right + (fun p' μ' φ' => (hsymbSD p' μ' φ' (p.1 : Multiset (Fin 1 ⊕ Fin 3)) + (bv.coord p.2)).symm) (q.1 : Multiset (Fin 1 ⊕ Fin 3)) (bv.coord q.2) + have hRY : ∀ p, ∀ r ∈ R₀, Commute r (Y p) := by + intro p r hr + rw [hR₀] at hr + refine commute_of_mem_adjoin ?_ hr + rintro b (⟨r', φ', hr0, hrm, rfl⟩ | (⟨l, ν, lam, φ', rfl⟩ | hbS)) + · exact commute_symmetrizedDeriv_right + (fun p' μ' φ'' => (hsymbSD p' μ' φ'' r' φ').symm) + (p.1 : Multiset (Fin 1 ⊕ Fin 3)) (bv.coord p.2) + · exact commute_of_mem_adjoin + (fun x hx => by + obtain ⟨a, b2, c, rfl⟩ := hx + exact hsymbY a b2 c p) + (iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols l ν lam φ') + · exact commute_symmetrizedDeriv_right + (fun p' μ' φ' => hcS p' μ' φ' b hbS) + (p.1 : Multiset (Fin 1 ⊕ Fin 3)) (bv.coord p.2) -- extraction: the invariant lies in the lower-order subalgebra have hzR₀ : z ∈ R₀ := - mem_of_translationInvariant R₀ Y - (fun p => symmetrizedDeriv_mem_center hc _ _) Φ hfixR₀ hΦy hzsup + mem_of_translationInvariant R₀ Y hRY hYY Φ hfixR₀ hΦy hzsup (fun t => hzinv (Ut t)) rw [hR₀] at hzR₀ exact hzR₀ diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean index 7757f689b..78b160e39 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean @@ -140,8 +140,8 @@ theorem invariant_mem_adjoin_fieldStrength b = IsGaugeField.iteratedCovDerivAdjoint gaugeField l (IsGaugeField.fieldStrength gaugeField ν lam) 0 φ} ∪ S) := IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField - (fun _ _ _ => Subring.mem_center_iff.mpr fun _ => mul_comm _ _) - S hS hx hinv + (fun _ _ _ _ _ _ => Commute.all _ _) + S (fun _ _ _ _ _ => Commute.all _ _) hS hx hinv end GaugeJetAlgebra diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index bef3edac8..eab16064a 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -408,6 +408,29 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : rw [mul_smul_comm, mul_one, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, mul_comm] + +/-- The weak endomorphism of the identity matrix is the identity. -/ +lemma weakEnd_one : weakEnd 1 = LinearMap.id := by + rw [weakEnd, map_one, Module.End.one_eq_id] + +/-- At the base point, a gauge jet with trivial value acts trivially: the zeroth + Taylor coefficient of the jet gauge action is the identity. -/ +lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : + IsGaugeField.repCoeff repJetGaugeGroupI U 0 = LinearMap.id := by + have h2 : (constantCoeff : JetRing →+* ℂ).mapMatrix + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) + = 1 := Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.1) hU) + have hu : constantCoeff ((U.2.2 : unitary JetRing) : JetRing) = 1 := + Subtype.ext_iff.mp (congrArg (fun p : GaugeGroupI => p.2.2) hU) + have hM : ((jetGaugeMatrix U).map fun f => + constantCoeff ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = 1 := by + ext i j + rw [Matrix.map_apply, Multiset.foldl_zero, jetGaugeMatrix, Matrix.smul_apply, + smul_eq_mul, map_mul, map_pow, hu, one_pow, one_mul] + exact Matrix.ext_iff.mpr h2 i j + rw [repCoeff_eq, hM, weakEnd_one] + set_option maxHeartbeats 1000000 in /-- **The `(1, 2)_{3}` action of the gauge algebra is the infinitesimal action underlying the jet gauge action on the Higgs doublet**: its base-point Taylor diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index 4f11cf5e0..6bcd6f550 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -18,11 +18,17 @@ public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim public import Physlib.Particles.StandardModel.Fermions.DownSinglet public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.UpSinglet public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic @@ -158,6 +164,47 @@ structure IsStandardModel (B : Type) [Ring B] [Algebra ℂ B] massWeightPoly (e i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (e i s φ) massWeight_bare : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, massWeightPoly (bare i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (bare i s φ) + -- **Commutation**: the gauge field is bosonic — its derivative symbols commute with + -- each other and with every matter symbol (the matter symbols themselves are free to + -- anticommute among each other) + A_comm_A : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (A s μ ψ) (A s' μ' ψ') + A_comm_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), + Commute (A s μ ψ) (H s' φ) + A_comm_barH : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (A s μ ψ) (barH s' φ) + A_comm_d : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet), + Commute (A s μ ψ) (d i s' φ) + A_comm_bard : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), + Commute (A s μ ψ) (bard i s' φ) + A_comm_u : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet), + Commute (A s μ ψ) (u i s' φ) + A_comm_baru : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)), + Commute (A s μ ψ) (baru i s' φ) + A_comm_Q : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet), + Commute (A s μ ψ) (Q i s' φ) + A_comm_barQ : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + Commute (A s μ ψ) (barQ i s' φ) + A_comm_L : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet), + Commute (A s μ ψ) (L i s' φ) + A_comm_barL : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + Commute (A s μ ψ) (barL i s' φ) + A_comm_e : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonSinglet), + Commute (A s μ ψ) (e i s' φ) + A_comm_bare : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + Commute (A s μ ψ) (bare i s' φ) set_option linter.unusedVariables false namespace IsStandardModel @@ -222,138 +269,681 @@ noncomputable def covDerivBarD (h : IsStandardModel B repJet repLorentz massWeig IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 -/-- **The field algebra with covariant down-quark derivatives**: replacing the plain - derivative symbols of the down-type quarks *and their conjugates* by their covariant - derivative towers does not change the generated algebra — the corrections `∇ − ∂` - are polynomials in gauge-field and quark symbols. This is the span lemma - `IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter`, instantiated per family for - `d` (with the `(3, 1)_{-2}` action) and for `bard` (with its conjugate action). -/ -lemma fieldAlgebra_eq_covDerivD : +/-- The iterated covariant derivative of the Higgs field. -/ +noncomputable def covDerivH (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] B := + IsGaugeField.covDerivIter A HiggsVec.gaugeAlgebraAction H n l 0 + +/-- The iterated covariant derivative of the conjugate Higgs field. -/ +noncomputable def covDerivBarH (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := + IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) + barH n l 0 + +/-- The iterated covariant derivative of the up-type quarks. -/ +noncomputable def covDerivU (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] B := + IsGaugeField.covDerivIter A UpSinglet.gaugeAlgebraAction (u i) n l 0 + +/-- The iterated covariant derivative of the conjugate up-type quarks. -/ +noncomputable def covDerivBarU (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) n l 0 + +/-- The iterated covariant derivative of the quark doublets. -/ +noncomputable def covDerivQ (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := + IsGaugeField.covDerivIter A QuarkDoublet.gaugeAlgebraAction (Q i) n l 0 + +/-- The iterated covariant derivative of the conjugate quark doublets. -/ +noncomputable def covDerivBarQ (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (barQ i) n l 0 + +/-- The iterated covariant derivative of the lepton doublets. -/ +noncomputable def covDerivL (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := + IsGaugeField.covDerivIter A LeptonDoublet.gaugeAlgebraAction (L i) n l 0 + +/-- The iterated covariant derivative of the conjugate lepton doublets. -/ +noncomputable def covDerivBarL (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (barL i) n l 0 + +/-- The iterated covariant derivative of the lepton singlets. -/ +noncomputable def covDerivE (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := + IsGaugeField.covDerivIter A LeptonSinglet.gaugeAlgebraAction (e i) n l 0 + +/-- The iterated covariant derivative of the conjugate lepton singlets. -/ +noncomputable def covDerivBarE (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (bare i) n l 0 + + +/-! + +## Gauge group actions on the covariant derivatives + +-/ + + +/-! + +## The algebra written in terms of covariant derivatives + + +-/ +/-- **The covariant field algebra**: replacing the plain derivative symbols of every + matter field — the Higgs, the fermions, and all their conjugates — by their covariant + derivative towers does not change the generated algebra; only the gauge-field symbols + remain plain. Each replacement is the span lemma + `IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter`, instantiated with the species' + infinitesimal action (`GaugeAlgebra.actionConj` of it for the conjugates). -/ +lemma fieldAlgebra_eq_covDeriv : h.fieldAlgebra = Algebra.adjoin ℂ ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ - (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ - (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), Set.range (h.covDerivD i l) - ∪ Set.range (h.covDerivBarD i l)) ∪ - (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), - Set.range (u i s) ∪ Set.range (baru i s) ∪ - Set.range (Q i s) ∪ Set.range (barQ i s) ∪ - Set.range (L i s) ∪ Set.range (barL i s) ∪ - Set.range (e i s) ∪ Set.range (bare i s))) := by - -- the span lemma, per family and per conjugation - have hAT : ∀ i : Fin 3, + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + -- the span lemma, per field + have hATH : + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), + b = H s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet), + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (HiggsVec)), + b = IsGaugeField.covDerivIter A (HiggsVec.gaugeAlgebraAction) H n l 0 φ}) := + IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (HiggsVec.gaugeAlgebraAction) H + have hATbarH : + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + b = barH s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH n l 0 φ}) := + IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + have hATd : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (DownSinglet)), b = d i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet), - b = IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) - n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - DownSinglet.gaugeAlgebraAction (d i) - have hATbar : ∀ i : Fin 3, + (φ : Module.Dual ℂ (DownSinglet)), + b = IsGaugeField.covDerivIter A (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (DownSinglet.gaugeAlgebraAction) (d i) + have hATbard : ∀ i : Fin 3, Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = bard i s φ}) = + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), + b = bard i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = IsGaugeField.covDerivIter A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) - n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) - -- the down symbols and their conjugates lie in the covariant-tower algebra - have hdmem : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) + have hATu : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (UpSinglet)), + b = u i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (UpSinglet)), + b = IsGaugeField.covDerivIter A (UpSinglet.gaugeAlgebraAction) (u i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (UpSinglet.gaugeAlgebraAction) (u i) + have hATbaru : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)), + b = baru i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) + have hATQ : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (QuarkDoublet)), + b = Q i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (QuarkDoublet)), + b = IsGaugeField.covDerivIter A (QuarkDoublet.gaugeAlgebraAction) (Q i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (QuarkDoublet.gaugeAlgebraAction) (Q i) + have hATbarQ : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + b = barQ i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) + have hATL : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonDoublet)), + b = L i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonDoublet)), + b = IsGaugeField.covDerivIter A (LeptonDoublet.gaugeAlgebraAction) (L i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonDoublet.gaugeAlgebraAction) (L i) + have hATbarL : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + b = barL i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) + have hATe : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonSinglet)), + b = e i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonSinglet)), + b = IsGaugeField.covDerivIter A (LeptonSinglet.gaugeAlgebraAction) (e i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonSinglet.gaugeAlgebraAction) (e i) + have hATbare : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + b = bare i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) + -- every plain matter symbol lies in the covariant algebra + have hmem_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), + H s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro s φ + have h1 : H s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (HiggsVec)), + b = IsGaugeField.covDerivIter A (HiggsVec.gaugeAlgebraAction) H n l 0 φ}) := + hATH.le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, ?_⟩⟩)) + have hmem : IsGaugeField.covDerivIter A (HiggsVec.gaugeAlgebraAction) H n l 0 φ' + ∈ Set.range (h.covDerivH l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_barH : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + barH s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro s φ + have h1 : barH s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH n l 0 φ}) := + hATbarH.le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, ?_⟩⟩)) + have hmem : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH n l 0 φ' + ∈ Set.range (h.covDerivBarH l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_d : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (DownSinglet)), d i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ - (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ - (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), - Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l)) ∪ - (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), - Set.range (u i s) ∪ Set.range (baru i s) ∪ - Set.range (Q i s) ∪ Set.range (barQ i s) ∪ - Set.range (L i s) ∪ Set.range (barL i s) ∪ - Set.range (e i s) ∪ Set.range (bare i s))) := by + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by intro i s φ have h1 : d i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet), - b = IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) - n l 0 φ}) := - (hAT i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + (φ : Module.Dual ℂ (DownSinglet)), + b = IsGaugeField.covDerivIter A (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ}) := + (hATd i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) - · exact Or.inl (Or.inl (Or.inl - (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩))) - · exact Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, - Set.mem_iUnion.mpr ⟨l, Or.inl ⟨φ', rfl⟩⟩⟩⟩)) - have hbardmem : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ' + ∈ Set.range (h.covDerivD i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_bard : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), bard i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ - (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (H s) ∪ Set.range (barH s)) ∪ - (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), - Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l)) ∪ - (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), - Set.range (u i s) ∪ Set.range (baru i s) ∪ - Set.range (Q i s) ∪ Set.range (barQ i s) ∪ - Set.range (L i s) ∪ Set.range (barL i s) ∪ - Set.range (e i s) ∪ Set.range (bare i s))) := by + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by intro i s φ have h1 : bard i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = IsGaugeField.covDerivIter A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) - n l 0 φ}) := - (hATbar i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 φ}) := + (hATbard i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 φ' + ∈ Set.range (h.covDerivBarD i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_u : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (UpSinglet)), + u i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : u i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (UpSinglet)), + b = IsGaugeField.covDerivIter A (UpSinglet.gaugeAlgebraAction) (u i) n l 0 φ}) := + (hATu i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (UpSinglet.gaugeAlgebraAction) (u i) n l 0 φ' + ∈ Set.range (h.covDerivU i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_baru : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), + baru i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : baru i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l 0 φ}) := + (hATbaru i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l 0 φ' + ∈ Set.range (h.covDerivBarU i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_Q : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (QuarkDoublet)), + Q i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : Q i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (QuarkDoublet)), + b = IsGaugeField.covDerivIter A (QuarkDoublet.gaugeAlgebraAction) (Q i) n l 0 φ}) := + (hATQ i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (QuarkDoublet.gaugeAlgebraAction) (Q i) n l 0 φ' + ∈ Set.range (h.covDerivQ i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_barQ : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + barQ i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : barQ i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l 0 φ}) := + (hATbarQ i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) - · exact Or.inl (Or.inl (Or.inl - (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩))) - · exact Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, - Set.mem_iUnion.mpr ⟨l, Or.inr ⟨φ', rfl⟩⟩⟩⟩)) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l 0 φ' + ∈ Set.range (h.covDerivBarQ i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_L : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonDoublet)), + L i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : L i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonDoublet)), + b = IsGaugeField.covDerivIter A (LeptonDoublet.gaugeAlgebraAction) (L i) n l 0 φ}) := + (hATL i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (LeptonDoublet.gaugeAlgebraAction) (L i) n l 0 φ' + ∈ Set.range (h.covDerivL i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_barL : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + barL i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : barL i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l 0 φ}) := + (hATbarL i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l 0 φ' + ∈ Set.range (h.covDerivBarL i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_e : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonSinglet)), + e i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : e i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonSinglet)), + b = IsGaugeField.covDerivIter A (LeptonSinglet.gaugeAlgebraAction) (e i) n l 0 φ}) := + (hATe i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (LeptonSinglet.gaugeAlgebraAction) (e i) n l 0 φ' + ∈ Set.range (h.covDerivE i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + have hmem_bare : ∀ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + bare i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (A s μ)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + intro i s φ + have h1 : bare i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + b = IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l 0 φ}) := + (hATbare i).le (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨n, l, φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, ?_⟩⟩⟩) + have hmem : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l 0 φ' + ∈ Set.range (h.covDerivBarE i l) := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) · rintro b (hAH | hbF) - · exact Algebra.subset_adjoin (Or.inl (Or.inl hAH)) + · rcases hAH with hA | hH + · exact Algebra.subset_adjoin (Or.inl (Or.inl hA)) + · simp only [Set.mem_iUnion] at hH + obtain ⟨s, hH⟩ := hH + rcases hH with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · exact hmem_H s φ + · exact hmem_barH s φ · simp only [Set.mem_iUnion] at hbF obtain ⟨i, s, hbF⟩ := hbF - by_cases hd : b ∈ Set.range (d i s) - · obtain ⟨φ, rfl⟩ := hd - exact hdmem i s φ - · by_cases hbd : b ∈ Set.range (bard i s) - · obtain ⟨φ, rfl⟩ := hbd - exact hbardmem i s φ - · refine Algebra.subset_adjoin (Or.inr (Set.mem_iUnion.mpr ⟨i, - Set.mem_iUnion.mpr ⟨s, ?_⟩⟩)) - simp only [Set.mem_union] at hbF ⊢ - tauto - · rintro b ((hAH | hT) | hbF) - · exact Algebra.subset_adjoin (Or.inl hAH) - · simp only [Set.mem_iUnion] at hT - obtain ⟨i, n, l, hT⟩ := hT - rcases hT with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ - · have h1 : IsGaugeField.covDerivIter A DownSinglet.gaugeAlgebraAction (d i) - n l 0 φ ∈ Algebra.adjoin ℂ + rcases hbF with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) + · exact hmem_d i s φ + · exact hmem_bard i s φ + · exact hmem_u i s φ + · exact hmem_baru i s φ + · exact hmem_Q i s φ + · exact hmem_barQ i s φ + · exact hmem_L i s φ + · exact hmem_barL i s φ + · exact hmem_e i s φ + · exact hmem_bare i s φ + · rintro b ((hA | hHT) | hFT) + · exact Algebra.subset_adjoin (Or.inl (Or.inl hA)) + · simp only [Set.mem_iUnion] at hHT + obtain ⟨n, l, hHT⟩ := hHT + rcases hHT with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · have h1 : IsGaugeField.covDerivIter A (HiggsVec.gaugeAlgebraAction) H n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (HiggsVec)), b = H s φ}) := + hATH.ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨s', ?_⟩)) + exact Or.inl ⟨φ', rfl⟩ + · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH n l 0 φ + ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet), b = d i s φ}) := - (hAT i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), b = barH s φ}) := + hATbarH.ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨s', ?_⟩)) + exact Or.inr ⟨φ', rfl⟩ + · simp only [Set.mem_iUnion] at hFT + obtain ⟨i, n, l, hFT⟩ := hFT + rcases hFT with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) + · have h1 : IsGaugeField.covDerivIter A (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (DownSinglet)), b = d i s φ}) := + (hATd i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) · exact Or.inl (Or.inl @@ -362,14 +952,13 @@ lemma fieldAlgebra_eq_covDerivD : have hmem : d i s' φ' ∈ Set.range (d i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) - n l 0 φ ∈ Algebra.adjoin ℂ + · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 φ + ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = bard i s φ}) := - (hATbar i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + (hATbard i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) · exact Or.inl (Or.inl @@ -378,12 +967,745 @@ lemma fieldAlgebra_eq_covDerivD : have hmem : bard i s' φ' ∈ Set.range (bard i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · simp only [Set.mem_iUnion] at hbF - obtain ⟨i, s, hbF⟩ := hbF - refine Algebra.subset_adjoin (Or.inr (Set.mem_iUnion.mpr ⟨i, - Set.mem_iUnion.mpr ⟨s, ?_⟩⟩)) - simp only [Set.mem_union] at hbF ⊢ - tauto + · have h1 : IsGaugeField.covDerivIter A (UpSinglet.gaugeAlgebraAction) (u i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (UpSinglet)), b = u i s φ}) := + (hATu i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : u i s' φ' ∈ Set.range (u i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), b = baru i s φ}) := + (hATbaru i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : baru i s' φ' ∈ Set.range (baru i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A (QuarkDoublet.gaugeAlgebraAction) (Q i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (QuarkDoublet)), b = Q i s φ}) := + (hATQ i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : Q i s' φ' ∈ Set.range (Q i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), b = barQ i s φ}) := + (hATbarQ i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : barQ i s' φ' ∈ Set.range (barQ i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A (LeptonDoublet.gaugeAlgebraAction) (L i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonDoublet)), b = L i s φ}) := + (hATL i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : L i s' φ' ∈ Set.range (L i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), b = barL i s φ}) := + (hATbarL i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : barL i s' φ' ∈ Set.range (barL i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A (LeptonSinglet.gaugeAlgebraAction) (e i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonSinglet)), b = e i s φ}) := + (hATe i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : e i s' φ' ∈ Set.range (e i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), b = bare i s φ}) := + (hATbare i).ge (Algebra.subset_adjoin (Or.inr ⟨n, l, φ, rfl⟩)) + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) h1 + rintro b (⟨u', μ, ψ, rfl⟩ | ⟨s', φ', rfl⟩) + · exact Or.inl (Or.inl + (Set.mem_iUnion.mpr ⟨u', Set.mem_iUnion.mpr ⟨μ, ⟨ψ, rfl⟩⟩⟩)) + · refine Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s', ?_⟩⟩) + have hmem : bare i s' φ' ∈ Set.range (bare i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + +/-! + +## C. Gauge covariance of the covariant derivatives + +-/ + +include h in +/-- **Gauge covariance of the covariant derivatives of the Higgs field**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (HiggsVec.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (HiggsVec.gaugeAlgebraAction) H n l) := + TransformsIn.covDerivIter h.repJet_A h.repJet_H (HiggsVec.isInfinitesimalActionOf) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the conjugate Higgs field**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (repConj HiggsVec.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH n l) := + TransformsIn.covDerivIter h.repJet_A h.repJet_barH (HiggsVec.isInfinitesimalActionOf.conj) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the down-type quarks**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (DownSinglet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (DownSinglet.gaugeAlgebraAction) (d i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_d i) (DownSinglet.isInfinitesimalActionOf) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the conjugate down-type quarks**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivBarD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (repConj DownSinglet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_bard i) (DownSinglet.isInfinitesimalActionOf.conj) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the up-type quarks**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (UpSinglet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (UpSinglet.gaugeAlgebraAction) (u i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_u i) (UpSinglet.isInfinitesimalActionOf) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the conjugate up-type quarks**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivBarU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (repConj UpSinglet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_baru i) (UpSinglet.isInfinitesimalActionOf.conj) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the quark doublets**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (QuarkDoublet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (QuarkDoublet.gaugeAlgebraAction) (Q i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_Q i) (QuarkDoublet.isInfinitesimalActionOf) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the conjugate quark doublets**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivBarQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (repConj QuarkDoublet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_barQ i) (QuarkDoublet.isInfinitesimalActionOf.conj) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the lepton doublets**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (LeptonDoublet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (LeptonDoublet.gaugeAlgebraAction) (L i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_L i) (LeptonDoublet.isInfinitesimalActionOf) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the conjugate lepton doublets**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivBarL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (repConj LeptonDoublet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_barL i) (LeptonDoublet.isInfinitesimalActionOf.conj) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the lepton singlets**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (LeptonSinglet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (LeptonSinglet.gaugeAlgebraAction) (e i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_e i) (LeptonSinglet.isInfinitesimalActionOf) n l + +include h in +/-- **Gauge covariance of the covariant derivatives of the conjugate lepton singlets**: every derivative + symbol of the tower transforms by the pure Leibniz convolution of the dual + representation coefficients, with no inhomogeneous term. -/ +lemma transformsIn_covDerivBarE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + TransformsIn repJet (repConj LeptonSinglet.repJetGaugeGroupI) + (IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) (LeptonSinglet.isInfinitesimalActionOf.conj) n l + +/-! + +## D. The field strength and its covariant derivatives + +-/ + +/-- The iterated covariant derivative `∇_{l₁} ⋯ ∇_{lₙ} F_{μν}` of the field strength + of the gauge field, along an ordered list of directions. -/ +noncomputable def covDerivFieldStrength (h : IsStandardModel B repJet repLorentz + massWeightPoly H barH A d bard u baru Q barQ L barL e bare) + (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + IsGaugeField.iteratedCovDerivAdjoint A l (IsGaugeField.fieldStrength A μ ν) 0 + +include h in +/-- **Gauge covariance of the covariant derivatives of the field strength**: every + derivative symbol of the tower transforms in the adjoint, with no inhomogeneous + term. -/ +lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + IsGaugeField.TransformsInAdjoint repJet + (IsGaugeField.iteratedCovDerivAdjoint A l (IsGaugeField.fieldStrength A μ ν)) := + IsGaugeField.transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν + +include h in +/-- **The covariant derivatives of the field strength transform under just the global + gauge group**: the whole gauge jet acts through the base-point adjoint coefficient + of its value alone — no derivative of the gauge transformation enters. -/ +lemma repJet_covDerivFieldStrength (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repJet U (h.covDerivFieldStrength l μ ν φ) = + h.covDerivFieldStrength l μ ν (adjointDualCoeff U⁻¹ 0 φ) := by + have h1 := h.transformsInAdjoint_covDerivFieldStrength l μ ν U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **Pure gauge jets act trivially on the covariant derivatives of the field + strength**: gauge jets with trivial base-point value fix the whole covariant + tower. -/ +lemma repJet_covDerivFieldStrength_of_mem_truncationKer_zero + (U : JetGaugeGroupI.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repJet U.1 (h.covDerivFieldStrength l μ ν φ) = h.covDerivFieldStrength l μ ν φ := + IsGaugeField.repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero + h.repJet_A U l μ ν φ + +/-! + +## E. The matter covariant derivatives transform through the base point + +-/ + +include h in +/-- **The covariant derivatives of the Higgs field transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivH l φ) = + h.covDerivH l (IsGaugeField.repDualCoeff (HiggsVec.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivH n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the conjugate Higgs field transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivBarH l φ) = + h.covDerivBarH l (IsGaugeField.repDualCoeff (repConj HiggsVec.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivBarH n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the down-type quarks transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivD i l φ) = + h.covDerivD i l (IsGaugeField.repDualCoeff (DownSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivD i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the conjugate down-type quarks transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivBarD i l φ) = + h.covDerivBarD i l (IsGaugeField.repDualCoeff (repConj DownSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivBarD i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the up-type quarks transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivU i l φ) = + h.covDerivU i l (IsGaugeField.repDualCoeff (UpSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivU i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the conjugate up-type quarks transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivBarU i l φ) = + h.covDerivBarU i l (IsGaugeField.repDualCoeff (repConj UpSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivBarU i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the quark doublets transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivQ i l φ) = + h.covDerivQ i l (IsGaugeField.repDualCoeff (QuarkDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivQ i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the conjugate quark doublets transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivBarQ i l φ) = + h.covDerivBarQ i l (IsGaugeField.repDualCoeff (repConj QuarkDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivBarQ i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the lepton doublets transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivL i l φ) = + h.covDerivL i l (IsGaugeField.repDualCoeff (LeptonDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivL i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the conjugate lepton doublets transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivBarL i l φ) = + h.covDerivBarL i l (IsGaugeField.repDualCoeff (repConj LeptonDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivBarL i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the lepton singlets transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivE i l φ) = + h.covDerivE i l (IsGaugeField.repDualCoeff (LeptonSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivE i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +include h in +/-- **The covariant derivatives of the conjugate lepton singlets transform under just the global + gauge group**: the whole gauge jet acts through the base-point dual representation + coefficient of its value alone. -/ +lemma repJet_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI) (φ) : + repJet U (h.covDerivBarE i l φ) = + h.covDerivBarE i l (IsGaugeField.repDualCoeff (repConj LeptonSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := by + have h1 := h.transformsIn_covDerivBarE i n l U φ 0 + simp only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] at h1 + exact h1 + +/-! + +## F. Pure gauge jets fix the matter covariant derivatives + +-/ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + Higgs field: together with `repJet_covDerivH`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivH_of_mem_truncationKer_zero {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivH l φ) = h.covDerivH l φ := + (h.transformsIn_covDerivH n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => HiggsVec.repCoeff_zero_of_eval_eq_one hW) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + conjugate Higgs field: together with `repJet_covDerivBarH`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivBarH_of_mem_truncationKer_zero {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivBarH l φ) = h.covDerivBarH l φ := + (h.transformsIn_covDerivBarH n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => GaugeAlgebra.repCoeff_repConj_zero_eq_id (HiggsVec.repCoeff_zero_of_eval_eq_one hW)) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + DownSinglet fields: together with `repJet_covDerivD`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivD i l φ) = h.covDerivD i l φ := + (h.transformsIn_covDerivD i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => DownSinglet.repCoeff_zero_of_eval_eq_one hW) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + conjugate DownSinglet fields: together with `repJet_covDerivBarD`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivBarD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivBarD i l φ) = h.covDerivBarD i l φ := + (h.transformsIn_covDerivBarD i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => GaugeAlgebra.repCoeff_repConj_zero_eq_id (DownSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + UpSinglet fields: together with `repJet_covDerivU`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivU i l φ) = h.covDerivU i l φ := + (h.transformsIn_covDerivU i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => UpSinglet.repCoeff_zero_of_eval_eq_one hW) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + conjugate UpSinglet fields: together with `repJet_covDerivBarU`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivBarU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivBarU i l φ) = h.covDerivBarU i l φ := + (h.transformsIn_covDerivBarU i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => GaugeAlgebra.repCoeff_repConj_zero_eq_id (UpSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + QuarkDoublet fields: together with `repJet_covDerivQ`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivQ i l φ) = h.covDerivQ i l φ := + (h.transformsIn_covDerivQ i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => QuarkDoublet.repCoeff_zero_of_eval_eq_one hW) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + conjugate QuarkDoublet fields: together with `repJet_covDerivBarQ`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivBarQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivBarQ i l φ) = h.covDerivBarQ i l φ := + (h.transformsIn_covDerivBarQ i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => GaugeAlgebra.repCoeff_repConj_zero_eq_id (QuarkDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + LeptonDoublet fields: together with `repJet_covDerivL`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivL i l φ) = h.covDerivL i l φ := + (h.transformsIn_covDerivL i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => LeptonDoublet.repCoeff_zero_of_eval_eq_one hW) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + conjugate LeptonDoublet fields: together with `repJet_covDerivBarL`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivBarL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivBarL i l φ) = h.covDerivBarL i l φ := + (h.transformsIn_covDerivBarL i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => GaugeAlgebra.repCoeff_repConj_zero_eq_id (LeptonDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + LeptonSinglet fields: together with `repJet_covDerivE`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivE i l φ) = h.covDerivE i l φ := + (h.transformsIn_covDerivE i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => LeptonSinglet.repCoeff_zero_of_eval_eq_one hW) U φ + +include h in +/-- Pure gauge jets act trivially on the covariant derivatives of the + conjugate LeptonSinglet fields: together with `repJet_covDerivBarE`, the + tower transforms under just the global gauge group. -/ +lemma repJet_covDerivBarE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + repJet U.1 (h.covDerivBarE i l φ) = h.covDerivBarE i l φ := + (h.transformsIn_covDerivBarE i n l).repGauge_eq_of_mem_truncationKer_zero + (fun hW => GaugeAlgebra.repCoeff_repConj_zero_eq_id (LeptonSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ + +/-! + +## G. The classification of gauge invariants + +-/ + +include h in +set_option maxHeartbeats 1000000 in +/-- **The classification of gauge invariants of the Standard Model field algebra**: + a `repJet`-invariant element of the field algebra is a polynomial in the covariant + derivatives of the field strength and the covariant derivatives of the matter + fields. Gauge invariance eliminates the bare gauge-field symbols; only the covariant + objects — all of which transform under just the global gauge group — remain. -/ +theorem invariant_mem_adjoin_covDeriv {x : B} + (hx : x ∈ h.fieldAlgebra) + (hinv : ∀ U : JetGaugeGroupI, repJet U x = x) : + x ∈ Algebra.adjoin ℂ + ((⋃ (l : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + Set.range (h.covDerivFieldStrength l μ ν)) ∪ + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l))) := by + set S : Set B := + (⋃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l)) with hSdef + -- the matter covariant towers commute with the gauge-field symbols + have hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), ∀ y ∈ S, Commute y (A p μ ψ) := by + intro p μ ψ y hy + rw [hSdef] at hy + rcases hy with hy | hy + · simp only [Set.mem_iUnion] at hy + obtain ⟨n, l, hy⟩ := hy + rcases hy with ⟨φ', rfl⟩ | ⟨φ', rfl⟩ + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (HiggsVec.gaugeAlgebraAction) H n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_H p μ ψ s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_barH p μ ψ s' φ'').symm + · simp only [Set.mem_iUnion] at hy + obtain ⟨i, n, l, hy⟩ := hy + rcases hy with (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_d p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_bard p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (UpSinglet.gaugeAlgebraAction) (u i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_u p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_baru p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (QuarkDoublet.gaugeAlgebraAction) (Q i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_Q p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_barQ p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (LeptonDoublet.gaugeAlgebraAction) (L i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_L p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_barL p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (LeptonSinglet.gaugeAlgebraAction) (e i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_e p μ ψ i s' φ'').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l 0 φ') + rintro x' (⟨s', μ', ψ', rfl⟩ | ⟨s', φ'', rfl⟩) + · exact h.A_comm_A s' p μ' μ ψ' ψ + · exact (h.A_comm_bare p μ ψ i s' φ'').symm + -- the matter covariant towers are fixed by pure gauge jets + have hS : ∀ y ∈ S, ∀ U : JetGaugeGroupI.truncationKer 0, repJet U.1 y = y := by + intro y hy U + rw [hSdef] at hy + rcases hy with hy | hy + · simp only [Set.mem_iUnion] at hy + obtain ⟨n, l, hy⟩ := hy + rcases hy with ⟨φ', rfl⟩ | ⟨φ', rfl⟩ + · exact h.repJet_covDerivH_of_mem_truncationKer_zero l U φ' + · exact h.repJet_covDerivBarH_of_mem_truncationKer_zero l U φ' + · simp only [Set.mem_iUnion] at hy + obtain ⟨i, n, l, hy⟩ := hy + rcases hy with (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) + · exact h.repJet_covDerivD_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivBarD_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivU_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivBarU_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivQ_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivBarQ_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivL_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivBarL_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivE_of_mem_truncationKer_zero i l U φ' + · exact h.repJet_covDerivBarE_of_mem_truncationKer_zero i l U φ' + -- the invariant lies in the algebra of gauge symbols over the matter towers + have hx' : x ∈ Algebra.adjoin ℂ + ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A p μ ψ} ∪ S) := by + rw [h.fieldAlgebra_eq_covDeriv] at hx + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) hx + rintro b ((hA | hHT) | hFT) + · simp only [Set.mem_iUnion, Set.mem_range] at hA + obtain ⟨s, μ, ψ, hψ⟩ := hA + exact Or.inl ⟨s, μ, ψ, hψ.symm⟩ + · exact Or.inr (Or.inl hHT) + · exact Or.inr (Or.inr hFT) + -- the abstract classification + have hres := IsGaugeField.invariant_mem_adjoin_fieldStrength h.repJet_A + (fun p q μ ν φ ψ => h.A_comm_A p q μ ν φ ψ) S hcS hS hx' hinv + refine SetLike.le_def.mp (Algebra.adjoin_mono ?_) hres + rintro b (⟨l, ν, lam, φ', rfl⟩ | hbS) + · exact Or.inl (Or.inl (Set.mem_iUnion.mpr ⟨l, Set.mem_iUnion.mpr ⟨ν, + Set.mem_iUnion.mpr ⟨lam, ⟨φ', rfl⟩⟩⟩⟩)) + · rw [hSdef] at hbS + rcases hbS with h1 | h2 + · exact Or.inl (Or.inr h1) + · exact Or.inr h2 end IsStandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean index aabe413ec..da38feb46 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -180,8 +180,14 @@ theorem invariant_mem_adjoin_fieldStrength (S : Set JetAlgebra) b = IsGaugeField.iteratedCovDerivAdjoint gaugeField l (IsGaugeField.fieldStrength gaugeField ν lam) 0 φ} ∪ S) := IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField - (fun p μ φ => includeGauge_mem_center (GaugeJetAlgebra.gaugeField p μ φ)) - S hS hx hinv + (fun p q μ ν φ ψ => + Subring.mem_center_iff.mp + (includeGauge_mem_center (GaugeJetAlgebra.gaugeField q ν ψ)) _) + S + (fun p μ φ y _ => + Subring.mem_center_iff.mp + (includeGauge_mem_center (GaugeJetAlgebra.gaugeField p μ φ)) y) + hS hx hinv end JetAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index ba36bcd3a..c6f2d560e 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -678,6 +678,29 @@ lemma covDerivIter_sub_mem (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) simp only [Multiset.card_add, Multiset.coe_card, List.length_ofFn] omega +/-- Every derivative symbol of the covariant tower is a polynomial in the gauge-field + symbols and the matter symbols. -/ +lemma covDerivIter_mem_adjoin_symbols (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + covDerivIter A act F n l s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + b = F s φ}) := by + induction n generalizing s φ with + | zero => exact Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩) + | succ n ih => + rw [covDerivIter_succ, covDerivAction_apply] + refine add_mem (ih (fun i => l i.succ) (l 0 ::ₘ s) φ) ?_ + rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + refine actionFam_apply_mem (fun ψ' => ?_) (fun χ => ?_) _ + · exact Algebra.subset_adjoin (Or.inl ⟨p.1, l 0, ψ', rfl⟩) + · exact ih (fun i => l i.succ) p.2 χ + /-- **The span lemma**: the algebra of symbols generated by the gauge field together with a matter family's *derivative* symbols equals the one generated by the gauge field together with the matter family's *covariant* derivative tower. The @@ -731,28 +754,7 @@ theorem adjoin_symbols_eq_adjoin_covDerivIter (act : GaugeAlgebra →ₗ[ℝ] V exact main s.card s φ (le_refl _) · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨n, l, φ, rfl⟩) · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) - · -- the covariant tower consists of symbol polynomials - have main : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), - covDerivIter A act F n l s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), - b = F s φ}) := by - intro n - induction n with - | zero => exact fun l s φ => Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩) - | succ n ih => - intro l s φ - rw [covDerivIter_succ, covDerivAction_apply] - refine add_mem (ih (fun i => l i.succ) (l 0 ::ₘ s) φ) ?_ - rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] - refine multiset_sum_mem _ fun x hx => ?_ - obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx - refine actionFam_apply_mem (fun ψ' => ?_) (fun χ => ?_) _ - · exact Algebra.subset_adjoin (Or.inl ⟨p.1, l 0, ψ', rfl⟩) - · exact ih (fun i => l i.succ) p.2 χ - exact main n l 0 φ + · exact covDerivIter_mem_adjoin_symbols act F n l 0 φ end Action From 2893fa81cdd3f80a106854a228fe8212b183fb5f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 15:01:04 +0100 Subject: [PATCH 221/254] feat: Min imports --- .../StandardModel/IsStandardModel/Basic.lean | 31 ++----------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index 6bcd6f550..a8cdb32d4 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -4,38 +4,13 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module - -public import Physlib.Particles.StandardModel.HiggsBoson.Basic -public import Physlib.Relativity.IsLorentzDeriv -public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading -public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv -public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction -public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction -public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim -public import Physlib.Particles.StandardModel.Fermions.DownSinglet public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.UpSinglet -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic -public import Mathlib.LinearAlgebra.TensorProduct.Pi -public import Mathlib.Analysis.Normed.Lp.Matrix -public import Mathlib.RingTheory.TensorProduct.Maps -public import Mathlib.RepresentationTheory.Invariants +public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction /-! # The algebra valued Standard model From 79bc79fedfa94a1cfcbd8388a47af88ad835cb05 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 15:10:30 +0100 Subject: [PATCH 222/254] feat: Add start of IsCovStandardModel --- Physlib.lean | 1 + .../IsCovStandardModel/Basic.lean | 105 ++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean diff --git a/Physlib.lean b/Physlib.lean index 9f9579995..715ea8b7b 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -256,6 +256,7 @@ public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebra public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean new file mode 100644 index 000000000..107b05d4f --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized +public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction +/-! +# The algebra valued Standard model + +The basic idea here is to just reduce things +down to the covariant version. +In the covariant version we will do the work with +the invariants. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ B] + -- The representations + (repGauge : Representation ℂ GaugeGroupI B) (repLorentz : Representation ℂ SL(2,ℂ) B) + -- The mass weights + (massWeightPoly : B →ₐ[ℂ] Polynomial B) + -- The Higgs fields + covariant derivatives + (H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B) + (barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) + -- The field strength + covariant derivatives derivatives + (F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + -- Three families of down-type quarks + derivatives + conjugates + (d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B) + (bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B) + -- Three families of up-type quarks + derivatives + conjugates + (u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B) + (baru :{n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B) + -- Three families of quark doublets + derivatives + conjugates + (Q : {n : ℕ} →Fin 3 → (Fin n → Fin 1 ⊕ Fin 3)→ Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B) + (barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B) + -- Three families of lepton doublets + derivatives + conjugates + (L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B) + (barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B) + -- Three families of lepton singlets + derivatives + conjugates + (e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B) + (bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B) + : Prop where + -- *Gauge transformation* + -- Every field transforms homogeneously under the global gauge group, which acts on + -- the dual value index through the dual (contragredient) of the species + -- representation — the conjugate representation for the barred fields, and the + -- adjoint action for the field strength. The gauge action on the algebra is + -- multiplicative. + repGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ + repGauge_H : ∀ (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec), + repGauge g (H l φ) = H l (HiggsVec.repGaugeGroupI.dual g φ) + repGauge_barH : ∀ (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), + repGauge g (barH l φ) = barH l (HiggsVec.repGaugeGroupI.conj.dual g φ) + repGauge_F : ∀ (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + repGauge g (F l μ ν φ) = F l μ ν ((GaugeAlgebra.adjointMap g⁻¹).dualMap φ) + repGauge_d : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet), + repGauge g (d i l φ) = d i l (DownSinglet.repGaugeGroupI.dual g φ) + repGauge_bard : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)), + repGauge g (bard i l φ) = bard i l (DownSinglet.repGaugeGroupI.conj.dual g φ) + repGauge_u : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet), + repGauge g (u i l φ) = u i l (UpSinglet.repGaugeGroupI.dual g φ) + repGauge_baru : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)), + repGauge g (baru i l φ) = baru i l (UpSinglet.repGaugeGroupI.conj.dual g φ) + repGauge_Q : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet), + repGauge g (Q i l φ) = Q i l (QuarkDoublet.repGaugeGroupI.dual g φ) + repGauge_barQ : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + repGauge g (barQ i l φ) = barQ i l (QuarkDoublet.repGaugeGroupI.conj.dual g φ) + repGauge_L : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet), + repGauge g (L i l φ) = L i l (LeptonDoublet.repGaugeGroupI.dual g φ) + repGauge_barL : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + repGauge g (barL i l φ) = barL i l (LeptonDoublet.repGaugeGroupI.conj.dual g φ) + repGauge_e : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet), + repGauge g (e i l φ) = e i l (LeptonSinglet.repGaugeGroupI.dual g φ) + repGauge_bare : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + repGauge g (bare i l φ) = bare i l (LeptonSinglet.repGaugeGroupI.conj.dual g φ) + +end StandardModel From 41ec3768e0b8b3c463ade475a0fef61d0751dd13 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:11:38 +0100 Subject: [PATCH 223/254] feat: Update IsCovStandardModel --- .../IsCovStandardModel/Basic.lean | 471 ++++++++++++++++++ Physlib/Relativity/IsLorentzDeriv.lean | 16 + 2 files changed, 487 insertions(+) diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean index 107b05d4f..6ebf76494 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean @@ -101,5 +101,476 @@ structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ B] repGauge_bare : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), repGauge g (bare i l φ) = bare i l (LeptonSinglet.repGaugeGroupI.conj.dual g φ) + -- *Lorentz transformation* + -- Every field together with its covariant derivatives transforms as a Lorentz + -- tensor: each covariant-derivative slot mixes by the Lorentz matrix (ordered + -- tuples, since covariant derivatives need not commute) and the value index by the + -- contragredient of the species' Lorentz representation — the conjugate + -- representation for the barred fields. The two covector indices of the field + -- strength are explicit, and each mixes by the Lorentz matrix. The Lorentz action + -- on the algebra is multiplicative. + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + repLorentz_H : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) H + repLorentz_barH : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj barH + repLorentz_F : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (F l μ ν φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • F p a b φ + repLorentz_d : ∀ i, IsLorentzCovDerivTransforms repLorentz + DownSinglet.repLorentzGroup (d i) + repLorentz_bard : ∀ i, IsLorentzCovDerivTransforms repLorentz + DownSinglet.repLorentzGroup.conj (bard i) + repLorentz_u : ∀ i, IsLorentzCovDerivTransforms repLorentz + UpSinglet.repLorentzGroup (u i) + repLorentz_baru : ∀ i, IsLorentzCovDerivTransforms repLorentz + UpSinglet.repLorentzGroup.conj (baru i) + repLorentz_Q : ∀ i, IsLorentzCovDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup (Q i) + repLorentz_barQ : ∀ i, IsLorentzCovDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup.conj (barQ i) + repLorentz_L : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup (L i) + repLorentz_barL : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup.conj (barL i) + repLorentz_e : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup (e i) + repLorentz_bare : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup.conj (bare i) + -- **Mass weights (= 2 * mass dimension)** + -- Every covariant tower is a `massWeightPoly`-eigenvector of pure monomial weight: + -- each covariant derivative adds one to the mass dimension, so the Higgs towers + -- have mass dimension `1 + n` (weight `2 * (1 + n)`), the field-strength towers + -- mass dimension `2 + n` (weight `2 * (2 + n)`), and the fermion towers mass + -- dimension `3/2 + n` (weight `3 + 2 * n`) + massWeight_H : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (H l φ) = Polynomial.monomial (2 * (1 + n)) (H l φ) + massWeight_barH : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (barH l φ) = Polynomial.monomial (2 * (1 + n)) (barH l φ) + massWeight_F : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) φ, + massWeightPoly (F l μ ν φ) = Polynomial.monomial (2 * (2 + n)) (F l μ ν φ) + massWeight_d : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (d i l φ) = Polynomial.monomial (3 + 2 * n) (d i l φ) + massWeight_bard : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (bard i l φ) = Polynomial.monomial (3 + 2 * n) (bard i l φ) + massWeight_u : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (u i l φ) = Polynomial.monomial (3 + 2 * n) (u i l φ) + massWeight_baru : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (baru i l φ) = Polynomial.monomial (3 + 2 * n) (baru i l φ) + massWeight_Q : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (Q i l φ) = Polynomial.monomial (3 + 2 * n) (Q i l φ) + massWeight_barQ : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (barQ i l φ) = Polynomial.monomial (3 + 2 * n) (barQ i l φ) + massWeight_L : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (L i l φ) = Polynomial.monomial (3 + 2 * n) (L i l φ) + massWeight_barL : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (barL i l φ) = Polynomial.monomial (3 + 2 * n) (barL i l φ) + massWeight_e : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (e i l φ) = Polynomial.monomial (3 + 2 * n) (e i l φ) + massWeight_bare : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (bare i l φ) = Polynomial.monomial (3 + 2 * n) (bare i l φ) + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) + +/-! + +## A. The field algebra + +-/ + +/-- The algebra generated by all the covariant fields of the Standard Model: the + covariant-derivative towers of the field strength, of the Higgs and its conjugate, + and of the three families of each fermion species with their conjugates. -/ +def fieldAlgebra (_ : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) : Subalgebra ℂ B := + Algebra.adjoin ℂ + ((⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + Set.range (F l μ ν)) ∪ + (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), Set.range (H l) ∪ Set.range (barH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (d i l) ∪ Set.range (bard i l) ∪ + Set.range (u i l) ∪ Set.range (baru i l) ∪ + Set.range (Q i l) ∪ Set.range (barQ i l) ∪ + Set.range (L i l) ∪ Set.range (barL i l) ∪ + Set.range (e i l) ∪ Set.range (bare i l))) + +/-! + +## B. The mass dimension submodules + +-/ + +/-- All elements of the field algebra of mass weight exactly `n`: the intersection of + the algebra generated by the covariant fields with the part on which + `massWeightPoly` is the monomial `X ^ n`. -/ +noncomputable def massWeightSubmodule + (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) (n : ℕ) : Submodule ℂ B := + (h.fieldAlgebra).toSubmodule + ⊓ LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) + +lemma massWeightPoly_of_mem_massWeightSubmodule {n : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule n) : + massWeightPoly x = Polynomial.monomial n x := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + rcases hx with ⟨-, hx'⟩ + rw [LinearMap.mem_ker] at hx' + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] at hx' + exact hx' + +lemma mem_fieldAlgebra_of_mem_massWeightSubmodule {n : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule n) : x ∈ h.fieldAlgebra := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + exact hx.1 + +/-! + +## C. Covariant generators and the weight-graded monomial span + +-/ + +/-- The abstract index of a single covariant generator of the field algebra: one of + the covariant-derivative towers of the field strength, of the Higgs and its + conjugate, or of the three families of each fermion species and their conjugates, + applied to a member of the dual basis of its value space. Only basis indices are + stored, so for a fixed tower length the generators of a given mass weight form a + finite type. The evaluation in `B` is `generatorVal`. -/ +inductive Generators where + /-- The Higgs tower `∇_l H` applied to a dual basis vector. -/ + | H : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators + /-- The conjugate-Higgs tower `∇_l H̄` applied to a dual basis vector. -/ + | barH : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators + /-- The field-strength tower `∇_l F_μν` applied to a dual basis vector. -/ + | F : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + (Fin 8 ⊕ Fin 3 ⊕ Fin 1) → Generators + /-- The fermion tower `∇_l d` of the `i`-th family applied to a dual basis vector. -/ + | d : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l bard` of the `i`-th family applied to a dual basis vector. -/ + | bard : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l u` of the `i`-th family applied to a dual basis vector. -/ + | u : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l baru` of the `i`-th family applied to a dual basis vector. -/ + | baru : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l Q` of the `i`-th family applied to a dual basis vector. -/ + | Q : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 × Fin 2 → Generators + /-- The fermion tower `∇_l barQ` of the `i`-th family applied to a dual basis vector. -/ + | barQ : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 × Fin 2 → Generators + /-- The fermion tower `∇_l L` of the `i`-th family applied to a dual basis vector. -/ + | L : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Generators + /-- The fermion tower `∇_l barL` of the `i`-th family applied to a dual basis vector. -/ + | barL : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Generators + /-- The fermion tower `∇_l e` of the `i`-th family applied to a dual basis vector. -/ + | e : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators + /-- The fermion tower `∇_l bare` of the `i`-th family applied to a dual basis vector. -/ + | bare : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators +deriving DecidableEq + +/-- The mass weight (twice the mass dimension) of a covariant generator. -/ +def Generators.weight : Generators → ℕ + | .H n _ _ => 2 * (1 + n) + | .barH n _ _ => 2 * (1 + n) + | .F n _ _ _ _ => 2 * (2 + n) + | .d _ n _ _ => 3 + 2 * n + | .bard _ n _ _ => 3 + 2 * n + | .u _ n _ _ => 3 + 2 * n + | .baru _ n _ _ => 3 + 2 * n + | .Q _ n _ _ => 3 + 2 * n + | .barQ _ n _ _ => 3 + 2 * n + | .L _ n _ _ => 3 + 2 * n + | .barL _ n _ _ => 3 + 2 * n + | .e _ n _ _ => 3 + 2 * n + | .bare _ n _ _ => 3 + 2 * n + +set_option linter.unusedVariables false in +/-- The value in `B` of a covariant generator: the corresponding covariant tower + applied to the indicated dual basis vector of its value space. -/ +noncomputable def generatorVal + (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) : Generators → B + | .H _ l j => H l (HiggsVec.orthonormBasis.toBasis.coord j) + | .barH _ l j => barH l (HiggsVec.orthonormBasis.toBasis.conj.coord j) + | .F _ l μ ν j => F l μ ν (GaugeAlgebra.stdBasis.coord j) + | .d i _ l j => d i l (DownSinglet.basis.coord j) + | .bard i _ l j => bard i l (DownSinglet.basis.conj.coord j) + | .u i _ l j => u i l (UpSinglet.basis.coord j) + | .baru i _ l j => baru i l (UpSinglet.basis.conj.coord j) + | .Q i _ l j => Q i l (QuarkDoublet.basis.coord j) + | .barQ i _ l j => barQ i l (QuarkDoublet.basis.conj.coord j) + | .L i _ l j => L i l (LeptonDoublet.basis.coord j) + | .barL i _ l j => barL i l (LeptonDoublet.basis.conj.coord j) + | .e i _ l j => e i l (LeptonSinglet.basis.coord j) + | .bare i _ l j => bare i l (LeptonSinglet.basis.conj.coord j) + +/-- Every covariant generator is a `massWeightPoly`-eigenvector of its weight. -/ +lemma massWeightPoly_generatorVal (g : Generators) : + massWeightPoly (h.generatorVal g) = Polynomial.monomial g.weight (h.generatorVal g) := by + cases g with + | H n l j => exact h.massWeight_H l _ + | barH n l j => exact h.massWeight_barH l _ + | F n l μ ν j => exact h.massWeight_F l μ ν _ + | d i n l j => exact h.massWeight_d i l _ + | bard i n l j => exact h.massWeight_bard i l _ + | u i n l j => exact h.massWeight_u i l _ + | baru i n l j => exact h.massWeight_baru i l _ + | Q i n l j => exact h.massWeight_Q i l _ + | barQ i n l j => exact h.massWeight_barQ i l _ + | L i n l j => exact h.massWeight_L i l _ + | barL i n l j => exact h.massWeight_barL i l _ + | e i n l j => exact h.massWeight_e i l _ + | bare i n l j => exact h.massWeight_bare i l _ + +lemma generatorVal_mem_fieldAlgebra (g : Generators) : + h.generatorVal g ∈ h.fieldAlgebra := by + rw [fieldAlgebra] + refine Algebra.subset_adjoin ?_ + cases g with + | F n l μ ν j => + exact Set.mem_union_left _ (Set.mem_union_left _ + (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_iUnion.mpr ⟨μ, + Set.mem_iUnion.mpr ⟨ν, ⟨_, rfl⟩⟩⟩⟩⟩)) + | H n l j => + exact Set.mem_union_left _ (Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ ⟨_, rfl⟩⟩⟩)) + | barH n l j => + exact Set.mem_union_left _ (Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_right _ ⟨_, rfl⟩⟩⟩)) + | d i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (⟨_, rfl⟩)))))))))⟩⟩⟩) + | bard i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))))⟩⟩⟩) + | u i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))))⟩⟩⟩) + | baru i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))⟩⟩⟩) + | Q i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))⟩⟩⟩) + | barQ i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))⟩⟩⟩) + | L i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))⟩⟩⟩) + | barL i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))⟩⟩⟩) + | e i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)⟩⟩⟩) + | bare i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_right _ ⟨_, rfl⟩⟩⟩⟩) + +/-- Expanding every dual vector in the dual basis of its value space: the field + algebra is already generated by the countable family of basis generators. -/ +lemma fieldAlgebra_le_adjoin_range : + h.fieldAlgebra ≤ Algebra.adjoin ℂ (Set.range h.generatorVal) := by + rw [fieldAlgebra] + refine Algebra.adjoin_le fun x hx => ?_ + simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hx + obtain ((⟨n, l, μ, ν, φ, rfl⟩ | ⟨n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩) | ⟨i, n, l, hx⟩) := hx + · rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Subalgebra.sum_mem _ fun j _ => ?_ + rw [← algebraMap_smul ℂ (φ (GaugeAlgebra.stdBasis j))] + exact Subalgebra.smul_mem _ (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.F n l μ ν j))) _ + · rw [← HiggsVec.orthonormBasis.toBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.H n l j))) _ + · rw [← HiggsVec.orthonormBasis.toBasis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.barH n l j))) _ + · obtain (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) := hx + · rw [← DownSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.d i n l j))) _ + · rw [← DownSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.bard i n l j))) _ + · rw [← UpSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.u i n l j))) _ + · rw [← UpSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.baru i n l j))) _ + · rw [← QuarkDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.Q i n l j))) _ + · rw [← QuarkDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.barQ i n l j))) _ + · rw [← LeptonDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.L i n l j))) _ + · rw [← LeptonDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.barL i n l j))) _ + · rw [← LeptonSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.e i n l j))) _ + · rw [← LeptonSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.bare i n l j))) _ + +/-- The field algebra is generated by the covariant basis generators. -/ +lemma fieldAlgebra_eq_adjoin_range : + h.fieldAlgebra = Algebra.adjoin ℂ (Set.range h.generatorVal) := by + refine le_antisymm h.fieldAlgebra_le_adjoin_range (Algebra.adjoin_le ?_) + rintro x ⟨g, rfl⟩ + exact h.generatorVal_mem_fieldAlgebra g + +/-- A word in the covariant generators is a `massWeightPoly`-eigenvector whose + weight is the sum of the weights of its factors. -/ +lemma massWeightPoly_generatorVal_list_prod (gl : List Generators) : + massWeightPoly ((gl.map h.generatorVal).prod) = + Polynomial.monomial ((gl.map Generators.weight).sum) ((gl.map h.generatorVal).prod) := by + induction gl with + | nil => simp + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons, map_mul, + h.massWeightPoly_generatorVal, ih, Polynomial.monomial_mul_monomial] + +/-- The span of the words in the covariant basis generators of total mass weight `w`. -/ +def covMonomialSpan (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) (w : ℕ) : Submodule ℂ B := + Submodule.span ℂ + {x | ∃ gl : List Generators, + (gl.map Generators.weight).sum = w ∧ (gl.map h.generatorVal).prod = x} + +lemma list_prod_mem_covMonomialSpan {w : ℕ} {gl : List Generators} + (hw : (gl.map Generators.weight).sum = w) : + (gl.map h.generatorVal).prod ∈ h.covMonomialSpan w := + Submodule.subset_span ⟨gl, hw, rfl⟩ + +private lemma exists_list_map_eq (l₀ : List B) : + (∀ y ∈ l₀, y ∈ Set.range h.generatorVal) → + ∃ gl : List Generators, gl.map h.generatorVal = l₀ := by + induction l₀ with + | nil => exact fun _ => ⟨[], rfl⟩ + | cons a t ih => + intro hl₀ + obtain ⟨g, hg⟩ := hl₀ a (by simp) + obtain ⟨gl, hgl⟩ := ih (fun y hy => hl₀ y (by simp [hy])) + exact ⟨g :: gl, by rw [List.map_cons, hg, hgl]⟩ + +/-- Reading off the `X ^ w` coefficient of `massWeightPoly` sends the field algebra + into the weight-`w` monomial span — the projection onto the weight-`w` component, + with no independence argument needed. -/ +lemma coeff_massWeightPoly_mem_covMonomialSpan (w : ℕ) {x : B} + (hx : x ∈ h.fieldAlgebra) : + (massWeightPoly x).coeff w ∈ h.covMonomialSpan w := by + rw [h.fieldAlgebra_eq_adjoin_range, ← Subalgebra.mem_toSubmodule, + Algebra.adjoin_eq_span] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨l₀, hl₀, rfl⟩ := Submonoid.exists_list_of_mem_closure hy + obtain ⟨gl, rfl⟩ := h.exists_list_map_eq l₀ hl₀ + rw [h.massWeightPoly_generatorVal_list_prod, Polynomial.coeff_monomial] + by_cases hw : (gl.map Generators.weight).sum = w + · rw [if_pos hw] + exact h.list_prod_mem_covMonomialSpan hw + · rw [if_neg hw] + exact Submodule.zero_mem _ + | zero => + rw [map_zero, Polynomial.coeff_zero] + exact Submodule.zero_mem _ + | add a b ha hb iha ihb => + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ iha ihb + | smul c a ha iha => + rw [map_smul, Polynomial.coeff_smul] + exact Submodule.smul_mem _ _ iha + +/-- **The weight grading of the field algebra.** The submodule of elements of the + field algebra of mass weight `w` is exactly the span of the words in the covariant + basis generators of total weight `w`. -/ +theorem massWeightSubmodule_eq_covMonomialSpan (w : ℕ) : + h.massWeightSubmodule w = h.covMonomialSpan w := by + refine le_antisymm (fun x hx => ?_) ?_ + · have h1 := h.massWeightPoly_of_mem_massWeightSubmodule hx + have h2 := h.coeff_massWeightPoly_mem_covMonomialSpan w + (h.mem_fieldAlgebra_of_mem_massWeightSubmodule hx) + rwa [h1, Polynomial.coeff_monomial, if_pos rfl] at h2 + · rw [covMonomialSpan, Submodule.span_le] + rintro x ⟨gl, hw, rfl⟩ + rw [massWeightSubmodule] + refine Submodule.mem_inf.mpr ⟨?_, ?_⟩ + · refine Subalgebra.list_prod_mem _ (fun y hy => ?_) + obtain ⟨g, -, rfl⟩ := List.mem_map.mp hy + exact h.generatorVal_mem_fieldAlgebra g + · rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, + LinearMap.coe_restrictScalars, sub_eq_zero] + rw [h.massWeightPoly_generatorVal_list_prod, hw] + +end IsCovStandardModel end StandardModel diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index b9310a948..0a13606ea 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -139,6 +139,22 @@ def IsLorentzDerivTransforms {k V : Type*} [CommRing k] [AddCommGroup V] [Module (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • F (List.ofFn p) (rep.dual Λ φ) +/-- A family of *covariant*-derivative symbols, indexed by ordered tuples of + directions (covariant derivatives do not commute) and by the dual of a Lorentz + representation `V`, **transforms as the covariant derivatives of a + Lorentz-covariant field**: each derivative slot mixes by the columns of the Lorentz + matrix, while the value index transforms by the contragredient action `rep.dual` on + the dual of `V` — the ordered-tuple analogue of `IsLorentzDerivTransforms`. -/ +def IsLorentzCovDerivTransforms {k V : Type*} [CommRing k] [AddCommGroup V] + [Module k V] [Module k A] (repLorentz : Representation ℂ SL(2,ℂ) A) + (rep : Representation k SL(2,ℂ) V) + (F : {n : ℕ} → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual k V →ₗ[k] A) : Prop := + ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual k V), + repLorentz Λ (F l φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + F p (rep.dual Λ φ) + namespace IsLorentzDeriv variable {rep : Representation ℂ SL(2,ℂ) A} {D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A} From a616afa0119c03802c8c50b06cc34b79aa3af715 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 28 Aug 2026 07:02:49 +0100 Subject: [PATCH 224/254] feat: Clean up IsCovStandardModel --- Physlib.lean | 2 + .../IsCovStandardModel/Basic.lean | 832 ++++++----- .../IsCovStandardModel/Generators.lean | 1326 +++++++++++++++++ .../IsCovStandardModel/MassWeight.lean | 571 +++++++ 4 files changed, 2383 insertions(+), 348 deletions(-) create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean diff --git a/Physlib.lean b/Physlib.lean index 715ea8b7b..6d3e35575 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -257,6 +257,8 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebr public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators +public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean index 6ebf76494..9571d567d 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean @@ -19,6 +19,12 @@ down to the covariant version. In the covariant version we will do the work with the invariants. +This file carries the structure `IsCovStandardModel` itself — the covariant fields +with their gauge, Lorentz, mass-weight and commutation properties — together with the +algebra they generate. The covariant generators of that algebra are in +`IsCovStandardModel.Generators`, and the mass-weight grading in +`IsCovStandardModel.MassWeight`. + -/ @[expose] public section @@ -174,6 +180,378 @@ structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ B] massWeightPoly (e i l φ) = Polynomial.monomial (3 + 2 * n) (e i l φ) massWeight_bare : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, massWeightPoly (bare i l φ) = Polynomial.monomial (3 + 2 * n) (bare i l φ) + -- **The commutation rules** + -- The gauge sector is bosonic: every field-strength tower commutes with every + -- field. + F_comm_F : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) (ψ' : Module.Dual ℝ GaugeAlgebra), + Commute (F l μ ν ψ) (F l' μ' ν' ψ') + F_comm_H : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec), + Commute (F l μ ν ψ) (H l' φ) + F_comm_barH : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (F l μ ν ψ) (barH l' φ) + F_comm_d : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ DownSinglet), + Commute (F l μ ν ψ) (d i l' φ) + F_comm_bard : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), + Commute (F l μ ν ψ) (bard i l' φ) + F_comm_u : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ UpSinglet), + Commute (F l μ ν ψ) (u i l' φ) + F_comm_baru : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), + Commute (F l μ ν ψ) (baru i l' φ) + F_comm_Q : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ QuarkDoublet), + Commute (F l μ ν ψ) (Q i l' φ) + F_comm_barQ : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + Commute (F l μ ν ψ) (barQ i l' φ) + F_comm_L : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonDoublet), + Commute (F l μ ν ψ) (L i l' φ) + F_comm_barL : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + Commute (F l μ ν ψ) (barL i l' φ) + F_comm_e : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonSinglet), + Commute (F l μ ν ψ) (e i l' φ) + F_comm_bare : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + Commute (F l μ ν ψ) (bare i l' φ) + -- The Higgs sector is bosonic: the Higgs towers and their conjugates commute + -- with each other and with every fermion. + H_comm_H : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ HiggsVec), + Commute (H l φ) (H l' φ') + H_comm_barH : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (H l φ) (barH l' φ') + barH_comm_barH : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (barH l φ) (barH l' φ') + H_comm_d : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ DownSinglet), + Commute (H l φ) (d i l' φ') + H_comm_bard : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + Commute (H l φ) (bard i l' φ') + H_comm_u : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ UpSinglet), + Commute (H l φ) (u i l' φ') + H_comm_baru : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + Commute (H l φ) (baru i l' φ') + H_comm_Q : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ QuarkDoublet), + Commute (H l φ) (Q i l' φ') + H_comm_barQ : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + Commute (H l φ) (barQ i l' φ') + H_comm_L : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ LeptonDoublet), + Commute (H l φ) (L i l' φ') + H_comm_barL : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + Commute (H l φ) (barL i l' φ') + H_comm_e : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ LeptonSinglet), + Commute (H l φ) (e i l' φ') + H_comm_bare : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + Commute (H l φ) (bare i l' φ') + barH_comm_d : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ DownSinglet), + Commute (barH l φ) (d i l' φ') + barH_comm_bard : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + Commute (barH l φ) (bard i l' φ') + barH_comm_u : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ UpSinglet), + Commute (barH l φ) (u i l' φ') + barH_comm_baru : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + Commute (barH l φ) (baru i l' φ') + barH_comm_Q : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ QuarkDoublet), + Commute (barH l φ) (Q i l' φ') + barH_comm_barQ : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + Commute (barH l φ) (barQ i l' φ') + barH_comm_L : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ LeptonDoublet), + Commute (barH l φ) (L i l' φ') + barH_comm_barL : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + Commute (barH l φ) (barL i l' φ') + barH_comm_e : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ LeptonSinglet), + Commute (barH l φ) (e i l' φ') + barH_comm_bare : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + Commute (barH l φ) (bare i l' φ') + -- The fermion sector: any two fermionic towers anticommute. On the diagonal + -- (same species, family, derivative slots and dual vector) this forces the + -- square of every fermionic symbol to vanish, since `2` is invertible in `B`. + d_anticomm_d : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ DownSinglet), + d i l φ * d j l' φ' = -(d j l' φ' * d i l φ) + d_anticomm_bard : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + d i l φ * bard j l' φ' = -(bard j l' φ' * d i l φ) + d_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ UpSinglet), + d i l φ * u j l' φ' = -(u j l' φ' * d i l φ) + d_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + d i l φ * baru j l' φ' = -(baru j l' φ' * d i l φ) + d_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + d i l φ * Q j l' φ' = -(Q j l' φ' * d i l φ) + d_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + d i l φ * barQ j l' φ' = -(barQ j l' φ' * d i l φ) + d_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + d i l φ * L j l' φ' = -(L j l' φ' * d i l φ) + d_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + d i l φ * barL j l' φ' = -(barL j l' φ' * d i l φ) + d_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + d i l φ * e j l' φ' = -(e j l' φ' * d i l φ) + d_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + d i l φ * bare j l' φ' = -(bare j l' φ' * d i l φ) + bard_anticomm_bard : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + bard i l φ * bard j l' φ' = -(bard j l' φ' * bard i l φ) + bard_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ UpSinglet), + bard i l φ * u j l' φ' = -(u j l' φ' * bard i l φ) + bard_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + bard i l φ * baru j l' φ' = -(baru j l' φ' * bard i l φ) + bard_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ QuarkDoublet), + bard i l φ * Q j l' φ' = -(Q j l' φ' * bard i l φ) + bard_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + bard i l φ * barQ j l' φ' = -(barQ j l' φ' * bard i l φ) + bard_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ LeptonDoublet), + bard i l φ * L j l' φ' = -(L j l' φ' * bard i l φ) + bard_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + bard i l φ * barL j l' φ' = -(barL j l' φ' * bard i l φ) + bard_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ LeptonSinglet), + bard i l φ * e j l' φ' = -(e j l' φ' * bard i l φ) + bard_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + bard i l φ * bare j l' φ' = -(bare j l' φ' * bard i l φ) + u_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ UpSinglet), + u i l φ * u j l' φ' = -(u j l' φ' * u i l φ) + u_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + u i l φ * baru j l' φ' = -(baru j l' φ' * u i l φ) + u_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + u i l φ * Q j l' φ' = -(Q j l' φ' * u i l φ) + u_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + u i l φ * barQ j l' φ' = -(barQ j l' φ' * u i l φ) + u_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + u i l φ * L j l' φ' = -(L j l' φ' * u i l φ) + u_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + u i l φ * barL j l' φ' = -(barL j l' φ' * u i l φ) + u_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + u i l φ * e j l' φ' = -(e j l' φ' * u i l φ) + u_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + u i l φ * bare j l' φ' = -(bare j l' φ' * u i l φ) + baru_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + baru i l φ * baru j l' φ' = -(baru j l' φ' * baru i l φ) + baru_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ QuarkDoublet), + baru i l φ * Q j l' φ' = -(Q j l' φ' * baru i l φ) + baru_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + baru i l φ * barQ j l' φ' = -(barQ j l' φ' * baru i l φ) + baru_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ LeptonDoublet), + baru i l φ * L j l' φ' = -(L j l' φ' * baru i l φ) + baru_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + baru i l φ * barL j l' φ' = -(barL j l' φ' * baru i l φ) + baru_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ LeptonSinglet), + baru i l φ * e j l' φ' = -(e j l' φ' * baru i l φ) + baru_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + baru i l φ * bare j l' φ' = -(bare j l' φ' * baru i l φ) + Q_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ QuarkDoublet), + Q i l φ * Q j l' φ' = -(Q j l' φ' * Q i l φ) + Q_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + Q i l φ * barQ j l' φ' = -(barQ j l' φ' * Q i l φ) + Q_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonDoublet), + Q i l φ * L j l' φ' = -(L j l' φ' * Q i l φ) + Q_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + Q i l φ * barL j l' φ' = -(barL j l' φ' * Q i l φ) + Q_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + Q i l φ * e j l' φ' = -(e j l' φ' * Q i l φ) + Q_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + Q i l φ * bare j l' φ' = -(bare j l' φ' * Q i l φ) + barQ_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + barQ i l φ * barQ j l' φ' = -(barQ j l' φ' * barQ i l φ) + barQ_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ LeptonDoublet), + barQ i l φ * L j l' φ' = -(L j l' φ' * barQ i l φ) + barQ_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + barQ i l φ * barL j l' φ' = -(barL j l' φ' * barQ i l φ) + barQ_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ LeptonSinglet), + barQ i l φ * e j l' φ' = -(e j l' φ' * barQ i l φ) + barQ_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + barQ i l φ * bare j l' φ' = -(bare j l' φ' * barQ i l φ) + L_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonDoublet), + L i l φ * L j l' φ' = -(L j l' φ' * L i l φ) + L_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + L i l φ * barL j l' φ' = -(barL j l' φ' * L i l φ) + L_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + L i l φ * e j l' φ' = -(e j l' φ' * L i l φ) + L_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + L i l φ * bare j l' φ' = -(bare j l' φ' * L i l φ) + barL_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + barL i l φ * barL j l' φ' = -(barL j l' φ' * barL i l φ) + barL_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ LeptonSinglet), + barL i l φ * e j l' φ' = -(e j l' φ' * barL i l φ) + barL_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + barL i l φ * bare j l' φ' = -(bare j l' φ' * barL i l φ) + e_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + e i l φ * e j l' φ' = -(e j l' φ' * e i l φ) + e_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + e i l φ * bare j l' φ' = -(bare j l' φ' * e i l φ) + bare_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + bare i l φ * bare j l' φ' = -(bare j l' φ' * bare i l φ) namespace IsCovStandardModel @@ -200,7 +578,38 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-! -## A. The field algebra +## A. The gauge and Lorentz actions + +The two actions on the algebra are multiplicative, so each is a unital algebra +automorphism; in particular each fixes the unit. + +-/ + +include h in +/-- The multiplicative gauge action fixes the unit of the algebra. -/ +lemma repGauge_one (g : GaugeGroupI) : repGauge g (1 : B) = 1 := by + obtain ⟨u, hu⟩ : ∃ u, repGauge g u = 1 := + ⟨repGauge g⁻¹ 1, by + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one repGauge, + Module.End.one_apply]⟩ + have h1 := h.repGauge_mul g u 1 + rw [mul_one, hu, one_mul] at h1 + exact h1.symm + +include h in +/-- The multiplicative Lorentz action fixes the unit of the algebra. -/ +lemma repLorentz_one (Λ : SL(2,ℂ)) : repLorentz Λ (1 : B) = 1 := by + obtain ⟨u, hu⟩ : ∃ u, repLorentz Λ u = 1 := + ⟨repLorentz Λ⁻¹ 1, by + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one repLorentz, + Module.End.one_apply]⟩ + have h1 := h.repLorentz_mul Λ u 1 + rw [mul_one, hu, one_mul] at h1 + exact h1.symm + +/-! + +## B. The field algebra -/ @@ -222,355 +631,82 @@ def fieldAlgebra (_ : IsCovStandardModel B repGauge repLorentz massWeightPoly H /-! -## B. The mass dimension submodules +### B.1. Basic commutation relations -/ -/-- All elements of the field algebra of mass weight exactly `n`: the intersection of - the algebra generated by the covariant fields with the part on which - `massWeightPoly` is the monomial `X ^ n`. -/ -noncomputable def massWeightSubmodule - (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) (n : ℕ) : Submodule ℂ B := - (h.fieldAlgebra).toSubmodule - ⊓ LinearMap.ker (massWeightPoly.toLinearMap - - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) - -lemma massWeightPoly_of_mem_massWeightSubmodule {n : ℕ} {x : B} - (hx : x ∈ h.massWeightSubmodule n) : - massWeightPoly x = Polynomial.monomial n x := by - rw [massWeightSubmodule, Submodule.mem_inf] at hx - rcases hx with ⟨-, hx'⟩ - rw [LinearMap.mem_ker] at hx' - simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, - sub_eq_zero] at hx' - exact hx' - -lemma mem_fieldAlgebra_of_mem_massWeightSubmodule {n : ℕ} {x : B} - (hx : x ∈ h.massWeightSubmodule n) : x ∈ h.fieldAlgebra := by - rw [massWeightSubmodule, Submodule.mem_inf] at hx - exact hx.1 - -/-! - -## C. Covariant generators and the weight-graded monomial span - --/ - -/-- The abstract index of a single covariant generator of the field algebra: one of - the covariant-derivative towers of the field strength, of the Higgs and its - conjugate, or of the three families of each fermion species and their conjugates, - applied to a member of the dual basis of its value space. Only basis indices are - stored, so for a fixed tower length the generators of a given mass weight form a - finite type. The evaluation in `B` is `generatorVal`. -/ -inductive Generators where - /-- The Higgs tower `∇_l H` applied to a dual basis vector. -/ - | H : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators - /-- The conjugate-Higgs tower `∇_l H̄` applied to a dual basis vector. -/ - | barH : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators - /-- The field-strength tower `∇_l F_μν` applied to a dual basis vector. -/ - | F : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → - (Fin 8 ⊕ Fin 3 ⊕ Fin 1) → Generators - /-- The fermion tower `∇_l d` of the `i`-th family applied to a dual basis vector. -/ - | d : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators - /-- The fermion tower `∇_l bard` of the `i`-th family applied to a dual basis vector. -/ - | bard : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators - /-- The fermion tower `∇_l u` of the `i`-th family applied to a dual basis vector. -/ - | u : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators - /-- The fermion tower `∇_l baru` of the `i`-th family applied to a dual basis vector. -/ - | baru : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators - /-- The fermion tower `∇_l Q` of the `i`-th family applied to a dual basis vector. -/ - | Q : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 × Fin 2 → Generators - /-- The fermion tower `∇_l barQ` of the `i`-th family applied to a dual basis vector. -/ - | barQ : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 × Fin 2 → Generators - /-- The fermion tower `∇_l L` of the `i`-th family applied to a dual basis vector. -/ - | L : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Generators - /-- The fermion tower `∇_l barL` of the `i`-th family applied to a dual basis vector. -/ - | barL : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Generators - /-- The fermion tower `∇_l e` of the `i`-th family applied to a dual basis vector. -/ - | e : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators - /-- The fermion tower `∇_l bare` of the `i`-th family applied to a dual basis vector. -/ - | bare : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators -deriving DecidableEq - -/-- The mass weight (twice the mass dimension) of a covariant generator. -/ -def Generators.weight : Generators → ℕ - | .H n _ _ => 2 * (1 + n) - | .barH n _ _ => 2 * (1 + n) - | .F n _ _ _ _ => 2 * (2 + n) - | .d _ n _ _ => 3 + 2 * n - | .bard _ n _ _ => 3 + 2 * n - | .u _ n _ _ => 3 + 2 * n - | .baru _ n _ _ => 3 + 2 * n - | .Q _ n _ _ => 3 + 2 * n - | .barQ _ n _ _ => 3 + 2 * n - | .L _ n _ _ => 3 + 2 * n - | .barL _ n _ _ => 3 + 2 * n - | .e _ n _ _ => 3 + 2 * n - | .bare _ n _ _ => 3 + 2 * n - -set_option linter.unusedVariables false in -/-- The value in `B` of a covariant generator: the corresponding covariant tower - applied to the indicated dual basis vector of its value space. -/ -noncomputable def generatorVal - (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) : Generators → B - | .H _ l j => H l (HiggsVec.orthonormBasis.toBasis.coord j) - | .barH _ l j => barH l (HiggsVec.orthonormBasis.toBasis.conj.coord j) - | .F _ l μ ν j => F l μ ν (GaugeAlgebra.stdBasis.coord j) - | .d i _ l j => d i l (DownSinglet.basis.coord j) - | .bard i _ l j => bard i l (DownSinglet.basis.conj.coord j) - | .u i _ l j => u i l (UpSinglet.basis.coord j) - | .baru i _ l j => baru i l (UpSinglet.basis.conj.coord j) - | .Q i _ l j => Q i l (QuarkDoublet.basis.coord j) - | .barQ i _ l j => barQ i l (QuarkDoublet.basis.conj.coord j) - | .L i _ l j => L i l (LeptonDoublet.basis.coord j) - | .barL i _ l j => barL i l (LeptonDoublet.basis.conj.coord j) - | .e i _ l j => e i l (LeptonSinglet.basis.coord j) - | .bare i _ l j => bare i l (LeptonSinglet.basis.conj.coord j) - -/-- Every covariant generator is a `massWeightPoly`-eigenvector of its weight. -/ -lemma massWeightPoly_generatorVal (g : Generators) : - massWeightPoly (h.generatorVal g) = Polynomial.monomial g.weight (h.generatorVal g) := by - cases g with - | H n l j => exact h.massWeight_H l _ - | barH n l j => exact h.massWeight_barH l _ - | F n l μ ν j => exact h.massWeight_F l μ ν _ - | d i n l j => exact h.massWeight_d i l _ - | bard i n l j => exact h.massWeight_bard i l _ - | u i n l j => exact h.massWeight_u i l _ - | baru i n l j => exact h.massWeight_baru i l _ - | Q i n l j => exact h.massWeight_Q i l _ - | barQ i n l j => exact h.massWeight_barQ i l _ - | L i n l j => exact h.massWeight_L i l _ - | barL i n l j => exact h.massWeight_barL i l _ - | e i n l j => exact h.massWeight_e i l _ - | bare i n l j => exact h.massWeight_bare i l _ - -lemma generatorVal_mem_fieldAlgebra (g : Generators) : - h.generatorVal g ∈ h.fieldAlgebra := by - rw [fieldAlgebra] - refine Algebra.subset_adjoin ?_ - cases g with - | F n l μ ν j => - exact Set.mem_union_left _ (Set.mem_union_left _ - (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_iUnion.mpr ⟨μ, - Set.mem_iUnion.mpr ⟨ν, ⟨_, rfl⟩⟩⟩⟩⟩)) - | H n l j => - exact Set.mem_union_left _ (Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ ⟨_, rfl⟩⟩⟩)) - | barH n l j => - exact Set.mem_union_left _ (Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_right _ ⟨_, rfl⟩⟩⟩)) - | d i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (⟨_, rfl⟩)))))))))⟩⟩⟩) - | bard i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))))⟩⟩⟩) - | u i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))))⟩⟩⟩) - | baru i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))⟩⟩⟩) - | Q i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))⟩⟩⟩) - | barQ i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))⟩⟩⟩) - | L i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))⟩⟩⟩) - | barL i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))⟩⟩⟩) - | e i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)⟩⟩⟩) - | bare i n l j => - exact Set.mem_union_right _ - (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, - Set.mem_union_right _ ⟨_, rfl⟩⟩⟩⟩) - -/-- Expanding every dual vector in the dual basis of its value space: the field - algebra is already generated by the countable family of basis generators. -/ -lemma fieldAlgebra_le_adjoin_range : - h.fieldAlgebra ≤ Algebra.adjoin ℂ (Set.range h.generatorVal) := by - rw [fieldAlgebra] - refine Algebra.adjoin_le fun x hx => ?_ - simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hx - obtain ((⟨n, l, μ, ν, φ, rfl⟩ | ⟨n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩) | ⟨i, n, l, hx⟩) := hx - · rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine Subalgebra.sum_mem _ fun j _ => ?_ - rw [← algebraMap_smul ℂ (φ (GaugeAlgebra.stdBasis j))] - exact Subalgebra.smul_mem _ (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.F n l μ ν j))) _ - · rw [← HiggsVec.orthonormBasis.toBasis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.H n l j))) _ - · rw [← HiggsVec.orthonormBasis.toBasis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.barH n l j))) _ - · obtain (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | - ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) := hx - · rw [← DownSinglet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.d i n l j))) _ - · rw [← DownSinglet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.bard i n l j))) _ - · rw [← UpSinglet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.u i n l j))) _ - · rw [← UpSinglet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.baru i n l j))) _ - · rw [← QuarkDoublet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.Q i n l j))) _ - · rw [← QuarkDoublet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.barQ i n l j))) _ - · rw [← LeptonDoublet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.L i n l j))) _ - · rw [← LeptonDoublet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.barL i n l j))) _ - · rw [← LeptonSinglet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.e i n l j))) _ - · rw [← LeptonSinglet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ - (Algebra.subset_adjoin - (Set.mem_range_self (f := h.generatorVal) (Generators.bare i n l j))) _ - -/-- The field algebra is generated by the covariant basis generators. -/ -lemma fieldAlgebra_eq_adjoin_range : - h.fieldAlgebra = Algebra.adjoin ℂ (Set.range h.generatorVal) := by - refine le_antisymm h.fieldAlgebra_le_adjoin_range (Algebra.adjoin_le ?_) - rintro x ⟨g, rfl⟩ - exact h.generatorVal_mem_fieldAlgebra g - -/-- A word in the covariant generators is a `massWeightPoly`-eigenvector whose - weight is the sum of the weights of its factors. -/ -lemma massWeightPoly_generatorVal_list_prod (gl : List Generators) : - massWeightPoly ((gl.map h.generatorVal).prod) = - Polynomial.monomial ((gl.map Generators.weight).sum) ((gl.map h.generatorVal).prod) := by - induction gl with - | nil => simp - | cons g t ih => - simp only [List.map_cons, List.prod_cons, List.sum_cons, map_mul, - h.massWeightPoly_generatorVal, ih, Polynomial.monomial_mul_monomial] - -/-- The span of the words in the covariant basis generators of total mass weight `w`. -/ -def covMonomialSpan (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) (w : ℕ) : Submodule ℂ B := - Submodule.span ℂ - {x | ∃ gl : List Generators, - (gl.map Generators.weight).sum = w ∧ (gl.map h.generatorVal).prod = x} - -lemma list_prod_mem_covMonomialSpan {w : ℕ} {gl : List Generators} - (hw : (gl.map Generators.weight).sum = w) : - (gl.map h.generatorVal).prod ∈ h.covMonomialSpan w := - Submodule.subset_span ⟨gl, hw, rfl⟩ - -private lemma exists_list_map_eq (l₀ : List B) : - (∀ y ∈ l₀, y ∈ Set.range h.generatorVal) → - ∃ gl : List Generators, gl.map h.generatorVal = l₀ := by - induction l₀ with - | nil => exact fun _ => ⟨[], rfl⟩ - | cons a t ih => - intro hl₀ - obtain ⟨g, hg⟩ := hl₀ a (by simp) - obtain ⟨gl, hgl⟩ := ih (fun y hy => hl₀ y (by simp [hy])) - exact ⟨g :: gl, by rw [List.map_cons, hg, hgl]⟩ - -/-- Reading off the `X ^ w` coefficient of `massWeightPoly` sends the field algebra - into the weight-`w` monomial span — the projection onto the weight-`w` component, - with no independence argument needed. -/ -lemma coeff_massWeightPoly_mem_covMonomialSpan (w : ℕ) {x : B} - (hx : x ∈ h.fieldAlgebra) : - (massWeightPoly x).coeff w ∈ h.covMonomialSpan w := by - rw [h.fieldAlgebra_eq_adjoin_range, ← Subalgebra.mem_toSubmodule, - Algebra.adjoin_eq_span] at hx - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨l₀, hl₀, rfl⟩ := Submonoid.exists_list_of_mem_closure hy - obtain ⟨gl, rfl⟩ := h.exists_list_map_eq l₀ hl₀ - rw [h.massWeightPoly_generatorVal_list_prod, Polynomial.coeff_monomial] - by_cases hw : (gl.map Generators.weight).sum = w - · rw [if_pos hw] - exact h.list_prod_mem_covMonomialSpan hw - · rw [if_neg hw] - exact Submodule.zero_mem _ - | zero => - rw [map_zero, Polynomial.coeff_zero] - exact Submodule.zero_mem _ - | add a b ha hb iha ihb => - rw [map_add, Polynomial.coeff_add] - exact Submodule.add_mem _ iha ihb - | smul c a ha iha => - rw [map_smul, Polynomial.coeff_smul] - exact Submodule.smul_mem _ _ iha - -/-- **The weight grading of the field algebra.** The submodule of elements of the - field algebra of mass weight `w` is exactly the span of the words in the covariant - basis generators of total weight `w`. -/ -theorem massWeightSubmodule_eq_covMonomialSpan (w : ℕ) : - h.massWeightSubmodule w = h.covMonomialSpan w := by - refine le_antisymm (fun x hx => ?_) ?_ - · have h1 := h.massWeightPoly_of_mem_massWeightSubmodule hx - have h2 := h.coeff_massWeightPoly_mem_covMonomialSpan w - (h.mem_fieldAlgebra_of_mem_massWeightSubmodule hx) - rwa [h1, Polynomial.coeff_monomial, if_pos rfl] at h2 - · rw [covMonomialSpan, Submodule.span_le] - rintro x ⟨gl, hw, rfl⟩ - rw [massWeightSubmodule] - refine Submodule.mem_inf.mpr ⟨?_, ?_⟩ - · refine Subalgebra.list_prod_mem _ (fun y hy => ?_) - obtain ⟨g, -, rfl⟩ := List.mem_map.mp hy - exact h.generatorVal_mem_fieldAlgebra g - · rw [LinearMap.mem_ker] - simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, - LinearMap.coe_restrictScalars, sub_eq_zero] - rw [h.massWeightPoly_generatorVal_list_prod, hw] - -end IsCovStandardModel +lemma F_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (φ : Module.Dual ℝ GaugeAlgebra) (x : B) (hx : x ∈ h.fieldAlgebra) : + F l μ ν φ * x = x * F l μ ν φ := by + rw [fieldAlgebra] at hx + refine (IsGaugeField.commute_of_mem_adjoin (y := F l μ ν φ) ?_ hx).symm + intro z hz + simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hz + obtain ((⟨n', l', μ', ν', ψ, rfl⟩ | ⟨n', l', ⟨φ', rfl⟩ | ⟨φ', rfl⟩⟩) | ⟨i, n', l', hz⟩) := hz + · exact (h.F_comm_F l μ ν φ l' μ' ν' ψ).symm + · exact (h.F_comm_H l μ ν φ l' φ').symm + · exact (h.F_comm_barH l μ ν φ l' φ').symm + · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz + · exact (h.F_comm_d l μ ν φ i l' φ').symm + · exact (h.F_comm_bard l μ ν φ i l' φ').symm + · exact (h.F_comm_u l μ ν φ i l' φ').symm + · exact (h.F_comm_baru l μ ν φ i l' φ').symm + · exact (h.F_comm_Q l μ ν φ i l' φ').symm + · exact (h.F_comm_barQ l μ ν φ i l' φ').symm + · exact (h.F_comm_L l μ ν φ i l' φ').symm + · exact (h.F_comm_barL l μ ν φ i l' φ').symm + · exact (h.F_comm_e l μ ν φ i l' φ').symm + · exact (h.F_comm_bare l μ ν φ i l' φ').symm + +lemma H_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} + (φ : Module.Dual ℂ HiggsVec) (x : B) (hx : x ∈ h.fieldAlgebra) : + H l φ * x = x * H l φ := by + rw [fieldAlgebra] at hx + refine (IsGaugeField.commute_of_mem_adjoin (y := H l φ) ?_ hx).symm + intro z hz + simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hz + obtain ((⟨n', l', μ', ν', ψ, rfl⟩ | ⟨n', l', ⟨φ', rfl⟩ | ⟨φ', rfl⟩⟩) | ⟨i, n', l', hz⟩) := hz + · exact h.F_comm_H l' μ' ν' ψ l φ + · exact h.H_comm_H l' φ' l φ + · exact (h.H_comm_barH l φ l' φ').symm + · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz + · exact (h.H_comm_d l φ i l' φ').symm + · exact (h.H_comm_bard l φ i l' φ').symm + · exact (h.H_comm_u l φ i l' φ').symm + · exact (h.H_comm_baru l φ i l' φ').symm + · exact (h.H_comm_Q l φ i l' φ').symm + · exact (h.H_comm_barQ l φ i l' φ').symm + · exact (h.H_comm_L l φ i l' φ').symm + · exact (h.H_comm_barL l φ i l' φ').symm + · exact (h.H_comm_e l φ i l' φ').symm + · exact (h.H_comm_bare l φ i l' φ').symm + +lemma barH_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (x : B) (hx : x ∈ h.fieldAlgebra) : + barH l φ * x = x * barH l φ := by + rw [fieldAlgebra] at hx + refine (IsGaugeField.commute_of_mem_adjoin (y := barH l φ) ?_ hx).symm + intro z hz + simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hz + obtain ((⟨n', l', μ', ν', ψ, rfl⟩ | ⟨n', l', ⟨φ', rfl⟩ | ⟨φ', rfl⟩⟩) | ⟨i, n', l', hz⟩) := hz + · exact h.F_comm_barH l' μ' ν' ψ l φ + · exact h.H_comm_barH l' φ' l φ + · exact h.barH_comm_barH l' φ' l φ + · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz + · exact (h.barH_comm_d l φ i l' φ').symm + · exact (h.barH_comm_bard l φ i l' φ').symm + · exact (h.barH_comm_u l φ i l' φ').symm + · exact (h.barH_comm_baru l φ i l' φ').symm + · exact (h.barH_comm_Q l φ i l' φ').symm + · exact (h.barH_comm_barQ l φ i l' φ').symm + · exact (h.barH_comm_L l φ i l' φ').symm + · exact (h.barH_comm_barL l φ i l' φ').symm + · exact (h.barH_comm_e l φ i l' φ').symm + · exact (h.barH_comm_bare l φ i l' φ').symm + +end IsCovStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean new file mode 100644 index 000000000..82f2d5331 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean @@ -0,0 +1,1326 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.Basic +public import Mathlib.Algebra.Algebra.NonUnitalSubalgebra +/-! +# The covariant generators of the field algebra + +The covariant fields, indexed abstractly: `Generators` names one covariant tower +applied to a member of the dual basis of its value space, and `generatorVal` evaluates +it in the algebra. Only basis indices are stored, so the generators of a given mass +weight form a finite type. The field algebra is generated by these values +(`fieldAlgebra_eq_adjoin_range`), and they supercommute — the weight of a generator is +odd exactly when it is fermionic. + +The grading of the algebra by mass weight is in `IsCovStandardModel.MassWeight`. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) + +/-! + +## A. Derivative collections + +-/ + + +/-- The abstract index of a single covariant generator of the field algebra: one of + the covariant-derivative towers of the field strength, of the Higgs and its + conjugate, or of the three families of each fermion species and their conjugates, + applied to a member of the dual basis of its value space. Only basis indices are + stored, so for a fixed tower length the generators of a given mass weight form a + finite type. The evaluation in `B` is `generatorVal`. -/ +inductive Generators where + /-- The Higgs tower `∇_l H` applied to a dual basis vector. -/ + | H : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators + /-- The conjugate-Higgs tower `∇_l H̄` applied to a dual basis vector. -/ + | barH : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators + /-- The field-strength tower `∇_l F_μν` applied to a dual basis vector. -/ + | F : (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + (Fin 8 ⊕ Fin 3 ⊕ Fin 1) → Generators + /-- The fermion tower `∇_l d` of the `i`-th family applied to a dual basis vector. -/ + | d : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l bard` of the `i`-th family applied to a dual basis vector. -/ + | bard : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l u` of the `i`-th family applied to a dual basis vector. -/ + | u : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l baru` of the `i`-th family applied to a dual basis vector. -/ + | baru : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 → Generators + /-- The fermion tower `∇_l Q` of the `i`-th family applied to a dual basis vector. -/ + | Q : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 × Fin 2 → Generators + /-- The fermion tower `∇_l barQ` of the `i`-th family applied to a dual basis vector. -/ + | barQ : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 3 × Fin 2 → Generators + /-- The fermion tower `∇_l L` of the `i`-th family applied to a dual basis vector. -/ + | L : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Generators + /-- The fermion tower `∇_l barL` of the `i`-th family applied to a dual basis vector. -/ + | barL : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Generators + /-- The fermion tower `∇_l e` of the `i`-th family applied to a dual basis vector. -/ + | e : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators + /-- The fermion tower `∇_l bare` of the `i`-th family applied to a dual basis vector. -/ + | bare : Fin 3 → (n : ℕ) → (Fin n → Fin 1 ⊕ Fin 3) → Fin 2 → Generators +deriving DecidableEq + +namespace Generators + +def IsFermionic : Generators → Prop + | .H _ _ _ => False + | .barH _ _ _ => False + | .F _ _ _ _ _ => False + | .d _ _ _ _ => True + | .bard _ _ _ _ => True + | .u _ _ _ _ => True + | .baru _ _ _ _ => True + | .Q _ _ _ _ => True + | .barQ _ _ _ _ => True + | .L _ _ _ _ => True + | .barL _ _ _ _ => True + | .e _ _ _ _ => True + | .bare _ _ _ _ => True + +/-- The Higgs generators: the covariant towers of the Higgs field and of its + conjugate. -/ +def IsHiggs : Generators → Prop + | .H _ _ _ => True + | .barH _ _ _ => True + | _ => False + +def IsGaugeField : Generators → Prop + | .F _ _ _ _ _ => True + | _ => False + +/-- The number of derivatives for a given generator. -/ +def toNumDerivatives : Generators → ℕ + | .H n _ _ => n + | .barH n _ _ => n + | .F n _ _ _ _ => n + | .d _ n _ _ => n + | .bard _ n _ _ => n + | .u _ n _ _ => n + | .baru _ n _ _ => n + | .Q _ n _ _ => n + | .barQ _ n _ _ => n + | .L _ n _ _ => n + | .barL _ n _ _ => n + | .e _ n _ _ => n + | .bare _ n _ _ => n + +end Generators +/-! + +## B. Covariant generators + +-/ + +/-- The mass weight (twice the mass dimension) of a covariant generator. -/ +def Generators.weight : Generators → ℕ + | .H n _ _ => 2 * (1 + n) + | .barH n _ _ => 2 * (1 + n) + | .F n _ _ _ _ => 2 * (2 + n) + | .d _ n _ _ => 3 + 2 * n + | .bard _ n _ _ => 3 + 2 * n + | .u _ n _ _ => 3 + 2 * n + | .baru _ n _ _ => 3 + 2 * n + | .Q _ n _ _ => 3 + 2 * n + | .barQ _ n _ _ => 3 + 2 * n + | .L _ n _ _ => 3 + 2 * n + | .barL _ n _ _ => 3 + 2 * n + | .e _ n _ _ => 3 + 2 * n + | .bare _ n _ _ => 3 + 2 * n + +set_option linter.unusedVariables false in +/-- The value in `B` of a covariant generator: the corresponding covariant tower + applied to the indicated dual basis vector of its value space. -/ +noncomputable def generatorVal + (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) : Generators → B + | .H _ l j => H l (HiggsVec.orthonormBasis.toBasis.coord j) + | .barH _ l j => barH l (HiggsVec.orthonormBasis.toBasis.conj.coord j) + | .F _ l μ ν j => F l μ ν (GaugeAlgebra.stdBasis.coord j) + | .d i _ l j => d i l (DownSinglet.basis.coord j) + | .bard i _ l j => bard i l (DownSinglet.basis.conj.coord j) + | .u i _ l j => u i l (UpSinglet.basis.coord j) + | .baru i _ l j => baru i l (UpSinglet.basis.conj.coord j) + | .Q i _ l j => Q i l (QuarkDoublet.basis.coord j) + | .barQ i _ l j => barQ i l (QuarkDoublet.basis.conj.coord j) + | .L i _ l j => L i l (LeptonDoublet.basis.coord j) + | .barL i _ l j => barL i l (LeptonDoublet.basis.conj.coord j) + | .e i _ l j => e i l (LeptonSinglet.basis.coord j) + | .bare i _ l j => bare i l (LeptonSinglet.basis.conj.coord j) + +/-- Every covariant generator is a `massWeightPoly`-eigenvector of its weight. -/ +lemma massWeightPoly_generatorVal (g : Generators) : + massWeightPoly (h.generatorVal g) = Polynomial.monomial g.weight (h.generatorVal g) := by + cases g with + | H n l j => exact h.massWeight_H l _ + | barH n l j => exact h.massWeight_barH l _ + | F n l μ ν j => exact h.massWeight_F l μ ν _ + | d i n l j => exact h.massWeight_d i l _ + | bard i n l j => exact h.massWeight_bard i l _ + | u i n l j => exact h.massWeight_u i l _ + | baru i n l j => exact h.massWeight_baru i l _ + | Q i n l j => exact h.massWeight_Q i l _ + | barQ i n l j => exact h.massWeight_barQ i l _ + | L i n l j => exact h.massWeight_L i l _ + | barL i n l j => exact h.massWeight_barL i l _ + | e i n l j => exact h.massWeight_e i l _ + | bare i n l j => exact h.massWeight_bare i l _ + +lemma generatorVal_mem_fieldAlgebra (g : Generators) : + h.generatorVal g ∈ h.fieldAlgebra := by + rw [fieldAlgebra] + refine Algebra.subset_adjoin ?_ + cases g with + | F n l μ ν j => + exact Set.mem_union_left _ (Set.mem_union_left _ + (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_iUnion.mpr ⟨μ, + Set.mem_iUnion.mpr ⟨ν, ⟨_, rfl⟩⟩⟩⟩⟩)) + | H n l j => + exact Set.mem_union_left _ (Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ ⟨_, rfl⟩⟩⟩)) + | barH n l j => + exact Set.mem_union_left _ (Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_right _ ⟨_, rfl⟩⟩⟩)) + | d i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (⟨_, rfl⟩)))))))))⟩⟩⟩) + | bard i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))))⟩⟩⟩) + | u i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))))⟩⟩⟩) + | baru i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))⟩⟩⟩) + | Q i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))⟩⟩⟩) + | barQ i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))⟩⟩⟩) + | L i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))⟩⟩⟩) + | barL i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))⟩⟩⟩) + | e i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)⟩⟩⟩) + | bare i n l j => + exact Set.mem_union_right _ + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_right _ ⟨_, rfl⟩⟩⟩⟩) + +/-- Expanding every dual vector in the dual basis of its value space: the field + algebra is already generated by the countable family of basis generators. -/ +lemma fieldAlgebra_le_adjoin_range : + h.fieldAlgebra ≤ Algebra.adjoin ℂ (Set.range h.generatorVal) := by + rw [fieldAlgebra] + refine Algebra.adjoin_le fun x hx => ?_ + simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hx + obtain ((⟨n, l, μ, ν, φ, rfl⟩ | ⟨n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩) | ⟨i, n, l, hx⟩) := hx + · rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Subalgebra.sum_mem _ fun j _ => ?_ + rw [← algebraMap_smul ℂ (φ (GaugeAlgebra.stdBasis j))] + exact Subalgebra.smul_mem _ (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.F n l μ ν j))) _ + · rw [← HiggsVec.orthonormBasis.toBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.H n l j))) _ + · rw [← HiggsVec.orthonormBasis.toBasis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.barH n l j))) _ + · obtain (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) := hx + · rw [← DownSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.d i n l j))) _ + · rw [← DownSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.bard i n l j))) _ + · rw [← UpSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.u i n l j))) _ + · rw [← UpSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.baru i n l j))) _ + · rw [← QuarkDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.Q i n l j))) _ + · rw [← QuarkDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.barQ i n l j))) _ + · rw [← LeptonDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.L i n l j))) _ + · rw [← LeptonDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.barL i n l j))) _ + · rw [← LeptonSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.e i n l j))) _ + · rw [← LeptonSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + exact Subalgebra.sum_mem _ fun j _ => Subalgebra.smul_mem _ + (Algebra.subset_adjoin + (Set.mem_range_self (f := h.generatorVal) (Generators.bare i n l j))) _ + +/-- The field algebra is generated by the covariant basis generators. -/ +lemma fieldAlgebra_eq_adjoin_range : + h.fieldAlgebra = Algebra.adjoin ℂ (Set.range h.generatorVal) := by + refine le_antisymm h.fieldAlgebra_le_adjoin_range (Algebra.adjoin_le ?_) + rintro x ⟨g, rfl⟩ + exact h.generatorVal_mem_fieldAlgebra g + +/-- A list of generator values is the list of values of a list of generators. -/ +lemma exists_list_map_eq (l₀ : List B) : + (∀ y ∈ l₀, y ∈ Set.range h.generatorVal) → + ∃ gl : List Generators, gl.map h.generatorVal = l₀ := by + induction l₀ with + | nil => exact fun _ => ⟨[], rfl⟩ + | cons a t ih => + intro hl₀ + obtain ⟨g, hg⟩ := hl₀ a (by simp) + obtain ⟨gl, hgl⟩ := ih (fun y hy => hl₀ y (by simp [hy])) + exact ⟨g :: gl, by rw [List.map_cons, hg, hgl]⟩ + +/-- A word in the covariant generators is a `massWeightPoly`-eigenvector whose + weight is the sum of the weights of its factors. -/ +lemma massWeightPoly_generatorVal_list_prod (gl : List Generators) : + massWeightPoly ((gl.map h.generatorVal).prod) = + Polynomial.monomial ((gl.map Generators.weight).sum) ((gl.map h.generatorVal).prod) := by + induction gl with + | nil => simp + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons, map_mul, + h.massWeightPoly_generatorVal, ih, Polynomial.monomial_mul_monomial] +/-! + +## C. Supercommutativity of the generators + +The mass weight doubles as the super-grading: the weight of a covariant generator +is odd exactly when the generator is fermionic. Two generators therefore exchange +up to the sign `(-1) ^ (weight * weight)`, and words of generators up to the sign +of the product of their total weights. + +-/ + +/-- The field-strength symbols commute with the value of every covariant + generator. -/ +lemma commute_F_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (g : Generators) : + Commute (F l μ ν ψ) (h.generatorVal g) := by + cases g with + | H n' l' j => exact h.F_comm_H l μ ν ψ l' _ + | barH n' l' j => exact h.F_comm_barH l μ ν ψ l' _ + | F n' l' μ' ν' j => exact h.F_comm_F l μ ν ψ l' μ' ν' _ + | d i n' l' j => exact h.F_comm_d l μ ν ψ i l' _ + | bard i n' l' j => exact h.F_comm_bard l μ ν ψ i l' _ + | u i n' l' j => exact h.F_comm_u l μ ν ψ i l' _ + | baru i n' l' j => exact h.F_comm_baru l μ ν ψ i l' _ + | Q i n' l' j => exact h.F_comm_Q l μ ν ψ i l' _ + | barQ i n' l' j => exact h.F_comm_barQ l μ ν ψ i l' _ + | L i n' l' j => exact h.F_comm_L l μ ν ψ i l' _ + | barL i n' l' j => exact h.F_comm_barL l μ ν ψ i l' _ + | e i n' l' j => exact h.F_comm_e l μ ν ψ i l' _ + | bare i n' l' j => exact h.F_comm_bare l μ ν ψ i l' _ + +/-- The Higgs symbols commute with the value of every covariant generator. -/ +lemma commute_H_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) (g : Generators) : + Commute (H l φ) (h.generatorVal g) := by + cases g with + | H n' l' j => exact h.H_comm_H l φ l' _ + | barH n' l' j => exact h.H_comm_barH l φ l' _ + | F n' l' μ' ν' j => exact (h.F_comm_H l' μ' ν' _ l φ).symm + | d i n' l' j => exact h.H_comm_d l φ i l' _ + | bard i n' l' j => exact h.H_comm_bard l φ i l' _ + | u i n' l' j => exact h.H_comm_u l φ i l' _ + | baru i n' l' j => exact h.H_comm_baru l φ i l' _ + | Q i n' l' j => exact h.H_comm_Q l φ i l' _ + | barQ i n' l' j => exact h.H_comm_barQ l φ i l' _ + | L i n' l' j => exact h.H_comm_L l φ i l' _ + | barL i n' l' j => exact h.H_comm_barL l φ i l' _ + | e i n' l' j => exact h.H_comm_e l φ i l' _ + | bare i n' l' j => exact h.H_comm_bare l φ i l' _ + +/-- The conjugate-Higgs symbols commute with the value of every covariant + generator. -/ +lemma commute_barH_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (g : Generators) : + Commute (barH l φ) (h.generatorVal g) := by + cases g with + | H n' l' j => exact (h.H_comm_barH l' _ l φ).symm + | barH n' l' j => exact h.barH_comm_barH l φ l' _ + | F n' l' μ' ν' j => exact (h.F_comm_barH l' μ' ν' _ l φ).symm + | d i n' l' j => exact h.barH_comm_d l φ i l' _ + | bard i n' l' j => exact h.barH_comm_bard l φ i l' _ + | u i n' l' j => exact h.barH_comm_u l φ i l' _ + | baru i n' l' j => exact h.barH_comm_baru l φ i l' _ + | Q i n' l' j => exact h.barH_comm_Q l φ i l' _ + | barQ i n' l' j => exact h.barH_comm_barQ l φ i l' _ + | L i n' l' j => exact h.barH_comm_L l φ i l' _ + | barL i n' l' j => exact h.barH_comm_barL l φ i l' _ + | e i n' l' j => exact h.barH_comm_e l φ i l' _ + | bare i n' l' j => exact h.barH_comm_bare l φ i l' _ + +/-- A covariant generator of even mass weight is bosonic: its value commutes with + the value of every covariant generator. -/ +lemma commute_generatorVal_of_even {g : Generators} (hg : g.weight % 2 = 0) + (g' : Generators) : Commute (h.generatorVal g) (h.generatorVal g') := by + cases g with + | H n l j => exact h.commute_H_generatorVal l _ g' + | barH n l j => exact h.commute_barH_generatorVal l _ g' + | F n l μ ν j => exact h.commute_F_generatorVal l μ ν _ g' + | d i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | bard i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | u i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | baru i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | Q i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | barQ i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | L i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | barL i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | e i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | bare i n l j => exact absurd hg (by simp only [Generators.weight]; omega) + +/-- Fermionic generator values anticommute: the values of two covariant generators + of odd mass weight exchange with a sign. -/ +lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} + (hg : g.weight % 2 = 1) (hg' : g'.weight % 2 = 1) : + h.generatorVal g * h.generatorVal g' + = -(h.generatorVal g' * h.generatorVal g) := by + cases g with + | H n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | barH n l j => exact absurd hg (by simp only [Generators.weight]; omega) + | F n l μ ν j => exact absurd hg (by simp only [Generators.weight]; omega) + | d i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_d i i' l l' _ _ + | bard i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_bard i i' l l' _ _ + | u i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_u i i' l l' _ _ + | baru i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_baru i i' l l' _ _ + | Q i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_Q i i' l l' _ _ + | barQ i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_barQ i i' l l' _ _ + | L i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_L i i' l l' _ _ + | barL i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.d_anticomm_bare i i' l l' _ _ + | bard i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_bard i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_bard i i' l l' _ _ + | u i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_u i i' l l' _ _ + | baru i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_baru i i' l l' _ _ + | Q i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_Q i i' l l' _ _ + | barQ i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_barQ i i' l l' _ _ + | L i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_L i i' l l' _ _ + | barL i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.bard_anticomm_bare i i' l l' _ _ + | u i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_u i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_u i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_u i i' l l' _ _ + | baru i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_baru i i' l l' _ _ + | Q i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_Q i i' l l' _ _ + | barQ i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_barQ i i' l l' _ _ + | L i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_L i i' l l' _ _ + | barL i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.u_anticomm_bare i i' l l' _ _ + | baru i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_baru i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_baru i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + rw [h.u_anticomm_baru i' i l' l, neg_neg] + | baru i' n' l' j' => + simp only [generatorVal] + exact h.baru_anticomm_baru i i' l l' _ _ + | Q i' n' l' j' => + simp only [generatorVal] + exact h.baru_anticomm_Q i i' l l' _ _ + | barQ i' n' l' j' => + simp only [generatorVal] + exact h.baru_anticomm_barQ i i' l l' _ _ + | L i' n' l' j' => + simp only [generatorVal] + exact h.baru_anticomm_L i i' l l' _ _ + | barL i' n' l' j' => + simp only [generatorVal] + exact h.baru_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.baru_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.baru_anticomm_bare i i' l l' _ _ + | Q i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_Q i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_Q i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + rw [h.u_anticomm_Q i' i l' l, neg_neg] + | baru i' n' l' j' => + simp only [generatorVal] + rw [h.baru_anticomm_Q i' i l' l, neg_neg] + | Q i' n' l' j' => + simp only [generatorVal] + exact h.Q_anticomm_Q i i' l l' _ _ + | barQ i' n' l' j' => + simp only [generatorVal] + exact h.Q_anticomm_barQ i i' l l' _ _ + | L i' n' l' j' => + simp only [generatorVal] + exact h.Q_anticomm_L i i' l l' _ _ + | barL i' n' l' j' => + simp only [generatorVal] + exact h.Q_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.Q_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.Q_anticomm_bare i i' l l' _ _ + | barQ i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_barQ i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_barQ i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + rw [h.u_anticomm_barQ i' i l' l, neg_neg] + | baru i' n' l' j' => + simp only [generatorVal] + rw [h.baru_anticomm_barQ i' i l' l, neg_neg] + | Q i' n' l' j' => + simp only [generatorVal] + rw [h.Q_anticomm_barQ i' i l' l, neg_neg] + | barQ i' n' l' j' => + simp only [generatorVal] + exact h.barQ_anticomm_barQ i i' l l' _ _ + | L i' n' l' j' => + simp only [generatorVal] + exact h.barQ_anticomm_L i i' l l' _ _ + | barL i' n' l' j' => + simp only [generatorVal] + exact h.barQ_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.barQ_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.barQ_anticomm_bare i i' l l' _ _ + | L i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_L i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_L i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + rw [h.u_anticomm_L i' i l' l, neg_neg] + | baru i' n' l' j' => + simp only [generatorVal] + rw [h.baru_anticomm_L i' i l' l, neg_neg] + | Q i' n' l' j' => + simp only [generatorVal] + rw [h.Q_anticomm_L i' i l' l, neg_neg] + | barQ i' n' l' j' => + simp only [generatorVal] + rw [h.barQ_anticomm_L i' i l' l, neg_neg] + | L i' n' l' j' => + simp only [generatorVal] + exact h.L_anticomm_L i i' l l' _ _ + | barL i' n' l' j' => + simp only [generatorVal] + exact h.L_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.L_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.L_anticomm_bare i i' l l' _ _ + | barL i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_barL i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_barL i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + rw [h.u_anticomm_barL i' i l' l, neg_neg] + | baru i' n' l' j' => + simp only [generatorVal] + rw [h.baru_anticomm_barL i' i l' l, neg_neg] + | Q i' n' l' j' => + simp only [generatorVal] + rw [h.Q_anticomm_barL i' i l' l, neg_neg] + | barQ i' n' l' j' => + simp only [generatorVal] + rw [h.barQ_anticomm_barL i' i l' l, neg_neg] + | L i' n' l' j' => + simp only [generatorVal] + rw [h.L_anticomm_barL i' i l' l, neg_neg] + | barL i' n' l' j' => + simp only [generatorVal] + exact h.barL_anticomm_barL i i' l l' _ _ + | e i' n' l' j' => + simp only [generatorVal] + exact h.barL_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.barL_anticomm_bare i i' l l' _ _ + | e i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_e i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_e i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + rw [h.u_anticomm_e i' i l' l, neg_neg] + | baru i' n' l' j' => + simp only [generatorVal] + rw [h.baru_anticomm_e i' i l' l, neg_neg] + | Q i' n' l' j' => + simp only [generatorVal] + rw [h.Q_anticomm_e i' i l' l, neg_neg] + | barQ i' n' l' j' => + simp only [generatorVal] + rw [h.barQ_anticomm_e i' i l' l, neg_neg] + | L i' n' l' j' => + simp only [generatorVal] + rw [h.L_anticomm_e i' i l' l, neg_neg] + | barL i' n' l' j' => + simp only [generatorVal] + rw [h.barL_anticomm_e i' i l' l, neg_neg] + | e i' n' l' j' => + simp only [generatorVal] + exact h.e_anticomm_e i i' l l' _ _ + | bare i' n' l' j' => + simp only [generatorVal] + exact h.e_anticomm_bare i i' l l' _ _ + | bare i n l j => + cases g' with + | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | barH n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) + | d i' n' l' j' => + simp only [generatorVal] + rw [h.d_anticomm_bare i' i l' l, neg_neg] + | bard i' n' l' j' => + simp only [generatorVal] + rw [h.bard_anticomm_bare i' i l' l, neg_neg] + | u i' n' l' j' => + simp only [generatorVal] + rw [h.u_anticomm_bare i' i l' l, neg_neg] + | baru i' n' l' j' => + simp only [generatorVal] + rw [h.baru_anticomm_bare i' i l' l, neg_neg] + | Q i' n' l' j' => + simp only [generatorVal] + rw [h.Q_anticomm_bare i' i l' l, neg_neg] + | barQ i' n' l' j' => + simp only [generatorVal] + rw [h.barQ_anticomm_bare i' i l' l, neg_neg] + | L i' n' l' j' => + simp only [generatorVal] + rw [h.L_anticomm_bare i' i l' l, neg_neg] + | barL i' n' l' j' => + simp only [generatorVal] + rw [h.barL_anticomm_bare i' i l' l, neg_neg] + | e i' n' l' j' => + simp only [generatorVal] + rw [h.e_anticomm_bare i' i l' l, neg_neg] + | bare i' n' l' j' => + simp only [generatorVal] + exact h.bare_anticomm_bare i i' l l' _ _ + +/-- Two covariant generators exchange up to the sign determined by their mass + weights: the weight is odd exactly on the fermionic generators, so the sign is + `-1` precisely when both generators are fermionic. -/ +lemma generatorVal_mul_generatorVal (g g' : Generators) : + h.generatorVal g * h.generatorVal g' = + ((-1 : ℂ) ^ (g.weight * g'.weight)) • (h.generatorVal g' * h.generatorVal g) := by + rcases Nat.even_or_odd g.weight with hg | hg + · rw [Even.neg_one_pow (hg.mul_right _), one_smul] + exact h.commute_generatorVal_of_even (Nat.even_iff.mp hg) g' + · rcases Nat.even_or_odd g'.weight with hg' | hg' + · rw [Even.neg_one_pow (hg'.mul_left _), one_smul] + exact (h.commute_generatorVal_of_even (Nat.even_iff.mp hg') g).symm + · rw [Odd.neg_one_pow (hg.mul hg'), neg_one_smul] + exact h.generatorVal_anticomm_of_odd_of_odd (Nat.odd_iff.mp hg) (Nat.odd_iff.mp hg') + +/-- A generator value moves past a word of generators up to the sign of the + product of the weights. -/ +lemma generatorVal_mul_list_prod (g : Generators) (gl : List Generators) : + h.generatorVal g * (gl.map h.generatorVal).prod = + ((-1 : ℂ) ^ (g.weight * (gl.map Generators.weight).sum)) • + ((gl.map h.generatorVal).prod * h.generatorVal g) := by + induction gl with + | nil => simp + | cons g' t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + calc h.generatorVal g * (h.generatorVal g' * (t.map h.generatorVal).prod) + = (h.generatorVal g * h.generatorVal g') * (t.map h.generatorVal).prod := by + rw [mul_assoc] + _ = ((-1 : ℂ) ^ (g.weight * g'.weight)) • + (h.generatorVal g' * (h.generatorVal g * (t.map h.generatorVal).prod)) := by + rw [h.generatorVal_mul_generatorVal g g', smul_mul_assoc, mul_assoc] + _ = ((-1 : ℂ) ^ (g.weight * g'.weight)) • (h.generatorVal g' * + (((-1 : ℂ) ^ (g.weight * (t.map Generators.weight).sum)) • + ((t.map h.generatorVal).prod * h.generatorVal g))) := by rw [ih] + _ = ((-1 : ℂ) ^ (g.weight * (g'.weight + (t.map Generators.weight).sum))) • + ((h.generatorVal g' * (t.map h.generatorVal).prod) * h.generatorVal g) := by + rw [mul_smul_comm, smul_smul, ← pow_add, ← mul_add, ← mul_assoc] + +/-- Two words of covariant generators exchange up to the sign of the product of + their total weights. -/ +lemma list_prod_mul_list_prod (gl gl' : List Generators) : + (gl.map h.generatorVal).prod * (gl'.map h.generatorVal).prod = + ((-1 : ℂ) ^ ((gl.map Generators.weight).sum * (gl'.map Generators.weight).sum)) • + ((gl'.map h.generatorVal).prod * (gl.map h.generatorVal).prod) := by + induction gl with + | nil => simp + | cons g t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + calc (h.generatorVal g * (t.map h.generatorVal).prod) * (gl'.map h.generatorVal).prod + = h.generatorVal g * ((t.map h.generatorVal).prod * (gl'.map h.generatorVal).prod) := by + rw [mul_assoc] + _ = ((-1 : ℂ) ^ ((t.map Generators.weight).sum * (gl'.map Generators.weight).sum)) • + ((h.generatorVal g * (gl'.map h.generatorVal).prod) * (t.map h.generatorVal).prod) := by + rw [ih, mul_smul_comm, ← mul_assoc] + _ = ((-1 : ℂ) ^ ((t.map Generators.weight).sum * (gl'.map Generators.weight).sum)) • + ((((-1 : ℂ) ^ (g.weight * (gl'.map Generators.weight).sum)) • + ((gl'.map h.generatorVal).prod * h.generatorVal g)) * (t.map h.generatorVal).prod) := by + rw [h.generatorVal_mul_list_prod g gl'] + _ = ((-1 : ℂ) ^ ((g.weight + (t.map Generators.weight).sum) * + (gl'.map Generators.weight).sum)) • + ((gl'.map h.generatorVal).prod * (h.generatorVal g * (t.map h.generatorVal).prod)) := by + rw [smul_mul_assoc, smul_smul, ← pow_add, mul_assoc, + show (t.map Generators.weight).sum * (gl'.map Generators.weight).sum + + g.weight * (gl'.map Generators.weight).sum + = (g.weight + (t.map Generators.weight).sum) * + (gl'.map Generators.weight).sum from by ring] + + +/-! + +## The different sectors of the Standard Model + +Each covariant generator belongs to one of three classes — gauge, Higgs or fermion — +and a word in the generators realises a set of classes. The sector of a class set `S` +is spanned by the words realising exactly `S`. It contains no non-zero scalar, since +the empty word realises no class at all, and it is closed under multiplication because +`S ∪ S = S`: it is a non-unital subalgebra. The seven non-empty class sets give the +seven sectors below. + +-/ + +/-- The three classes of covariant generator. -/ +inductive GeneratorClass where + /-- The gauge class: the field-strength towers. -/ + | gauge : GeneratorClass + /-- The Higgs class: the Higgs towers and their conjugates. -/ + | higgs : GeneratorClass + /-- The fermion class: the fermion towers and their conjugates. -/ + | fermion : GeneratorClass +deriving DecidableEq + +/-- The class of a covariant generator. -/ +def Generators.kind : Generators → GeneratorClass + | .F _ _ _ _ _ => .gauge + | .H _ _ _ => .higgs + | .barH _ _ _ => .higgs + | _ => .fermion + +@[simp] +lemma Generators.isGaugeField_iff_kind (g : Generators) : + g.IsGaugeField ↔ g.kind = .gauge := by + cases g <;> simp [Generators.IsGaugeField, Generators.kind] + +@[simp] +lemma Generators.isHiggs_iff_kind (g : Generators) : g.IsHiggs ↔ g.kind = .higgs := by + cases g <;> simp [Generators.IsHiggs, Generators.kind] + +@[simp] +lemma Generators.isFermionic_iff_kind (g : Generators) : + g.IsFermionic ↔ g.kind = .fermion := by + cases g <;> simp [Generators.IsFermionic, Generators.kind] + +/-- The classes realised by a word in the covariant generators. -/ +def wordClasses (gl : List Generators) : Finset GeneratorClass := + (gl.map Generators.kind).toFinset + +@[simp] +lemma wordClasses_nil : wordClasses [] = ∅ := by simp [wordClasses] + +/-- Concatenating words unions the classes they realise. -/ +lemma wordClasses_append (gl gl' : List Generators) : + wordClasses (gl ++ gl') = wordClasses gl ∪ wordClasses gl' := by + rw [wordClasses, wordClasses, wordClasses, List.map_append, List.toFinset_append] + +/-- Prepending a generator inserts its class. -/ +lemma wordClasses_cons (a : Generators) (gl : List Generators) : + wordClasses (a :: gl) = insert a.kind (wordClasses gl) := by + rw [wordClasses, wordClasses, List.map_cons, List.toFinset_cons] + +/-- The span of the words in the covariant generators realising exactly the classes + `S`. -/ +def sectorSubmodule (S : Finset GeneratorClass) : Submodule ℂ B := + Submodule.span ℂ + {x | ∃ gl : List Generators, wordClasses gl = S ∧ (gl.map h.generatorVal).prod = x} + +/-- Multiplication carries the class spans of `S` and `T` into that of `S ∪ T`. -/ +lemma mul_mem_sectorSubmodule {S T : Finset GeneratorClass} {x y : B} + (hx : x ∈ h.sectorSubmodule S) (hy : y ∈ h.sectorSubmodule T) : + x * y ∈ h.sectorSubmodule (S ∪ T) := by + induction hx using Submodule.span_induction with + | mem x hxw => + obtain ⟨gl, hgl, rfl⟩ := hxw + induction hy using Submodule.span_induction with + | mem y hyw => + obtain ⟨gl', hgl', rfl⟩ := hyw + refine Submodule.subset_span ⟨gl ++ gl', ?_, ?_⟩ + · rw [wordClasses_append, hgl, hgl'] + · rw [List.map_append, List.prod_append] + | zero => rw [mul_zero]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [mul_add]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ iha + | zero => rw [zero_mul]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ iha + +/-- The sector realising exactly the classes `S`: the span of the words whose + generators realise `S`. It is a non-unital subalgebra — closed under multiplication + since `S ∪ S = S`, but containing no non-zero scalar, since the empty word realises + no class. -/ +def sector (S : Finset GeneratorClass) : NonUnitalSubalgebra ℂ B := + (h.sectorSubmodule S).toNonUnitalSubalgebra fun x y hx hy => by + have hxy := h.mul_mem_sectorSubmodule hx hy + rwa [Finset.union_self] at hxy + +@[simp] +lemma mem_sector {S : Finset GeneratorClass} {x : B} : + x ∈ h.sector S ↔ x ∈ h.sectorSubmodule S := Iff.rfl + +/-- A word lies in the sector of the classes it realises. -/ +lemma list_prod_mem_sector (gl : List Generators) : + (gl.map h.generatorVal).prod ∈ h.sector (wordClasses gl) := + Submodule.subset_span ⟨gl, rfl, rfl⟩ + +/-- Multiplication carries the sectors of `S` and `T` into the sector of `S ∪ T`. -/ +lemma mul_mem_sector {S T : Finset GeneratorClass} {x y : B} + (hx : x ∈ h.sector S) (hy : y ∈ h.sector T) : x * y ∈ h.sector (S ∪ T) := + h.mul_mem_sectorSubmodule hx hy + +/-- Every sector sits inside the field algebra. -/ +lemma mem_fieldAlgebra_of_mem_sector {S : Finset GeneratorClass} {x : B} + (hx : x ∈ h.sector S) : x ∈ h.fieldAlgebra := by + rw [mem_sector, sectorSubmodule] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨gl, -, rfl⟩ := hy + refine Subalgebra.list_prod_mem _ fun z hz => ?_ + obtain ⟨g, -, rfl⟩ := List.mem_map.mp hz + exact h.generatorVal_mem_fieldAlgebra g + | zero => exact Subalgebra.zero_mem _ + | add a b ha hb iha ihb => exact Subalgebra.add_mem _ iha ihb + | smul c a ha iha => exact Subalgebra.smul_mem _ iha c + +/-- **The sectors exhaust the field algebra**: every element of the field algebra is a + sum of elements of the sectors, since every word realises exactly one class set. The + unit is supplied by `sector ∅`, the sector of the empty word, so the join is the + whole of `fieldAlgebra` — read as a non-unital subalgebra, the two sides having + otherwise different types. -/ +lemma fieldAlgebra_eq_iSup_sector : + h.fieldAlgebra.toNonUnitalSubalgebra = ⨆ S : Finset GeneratorClass, h.sector S := by + refine le_antisymm ?_ (iSup_le fun S => ?_) + · intro x hx + rw [Subalgebra.mem_toNonUnitalSubalgebra, h.fieldAlgebra_eq_adjoin_range, + ← Subalgebra.mem_toSubmodule, Algebra.adjoin_eq_span] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨l₀, hl₀, rfl⟩ := Submonoid.exists_list_of_mem_closure hy + obtain ⟨gl, rfl⟩ := h.exists_list_map_eq l₀ hl₀ + exact le_iSup (fun S : Finset GeneratorClass => h.sector S) (wordClasses gl) + (h.list_prod_mem_sector gl) + | zero => exact zero_mem _ + | add a b ha hb iha ihb => exact add_mem iha ihb + | smul c a ha iha => exact SMulMemClass.smul_mem c iha + · intro x hx + exact Subalgebra.mem_toNonUnitalSubalgebra.mpr (h.mem_fieldAlgebra_of_mem_sector hx) + + +/-! + +### The sectors are preserved by the gauge and Lorentz actions + +Both actions carry a covariant tower into combinations of towers of the same +species, hence each generator into the sector of its own class, hence — word by +word — each sector into itself. + +-/ + +/-- Any Higgs tower symbol lies in the Higgs sector. -/ +lemma H_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) : H l φ ∈ h.sector {GeneratorClass.higgs} := by + rw [← HiggsVec.orthonormBasis.toBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.H n l j] + +/-- Any conjugate-Higgs tower symbol lies in the Higgs sector. -/ +lemma barH_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + barH l φ ∈ h.sector {GeneratorClass.higgs} := by + rw [← HiggsVec.orthonormBasis.toBasis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.barH n l j] + +/-- Any field-strength tower symbol lies in the gauge sector. -/ +lemma F_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : F l μ ν φ ∈ h.sector {GeneratorClass.gauge} := by + rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => ?_ + rw [← algebraMap_smul ℂ (φ (GaugeAlgebra.stdBasis j))] + refine SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.F n l μ ν j] + +/-- Any `d` tower symbol lies in the fermion sector. -/ +lemma d_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ DownSinglet) : d i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← DownSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.d i n l j] + +/-- Any `bard` tower symbol lies in the fermion sector. -/ +lemma bard_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : bard i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← DownSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.bard i n l j] + +/-- Any `u` tower symbol lies in the fermion sector. -/ +lemma u_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ UpSinglet) : u i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← UpSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.u i n l j] + +/-- Any `baru` tower symbol lies in the fermion sector. -/ +lemma baru_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : baru i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← UpSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.baru i n l j] + +/-- Any `Q` tower symbol lies in the fermion sector. -/ +lemma Q_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ QuarkDoublet) : Q i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← QuarkDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.Q i n l j] + +/-- Any `barQ` tower symbol lies in the fermion sector. -/ +lemma barQ_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : barQ i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← QuarkDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.barQ i n l j] + +/-- Any `L` tower symbol lies in the fermion sector. -/ +lemma L_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonDoublet) : L i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.L i n l j] + +/-- Any `barL` tower symbol lies in the fermion sector. -/ +lemma barL_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : barL i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.barL i n l j] + +/-- Any `e` tower symbol lies in the fermion sector. -/ +lemma e_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonSinglet) : e i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.e i n l j] + +/-- Any `bare` tower symbol lies in the fermion sector. -/ +lemma bare_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : bare i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.bare i n l j] + +/-- The gauge action carries a covariant generator into the sector of its class. -/ +lemma repGauge_generatorVal_mem_sector (g : GaugeGroupI) (a : Generators) : + repGauge g (h.generatorVal a) ∈ h.sector {a.kind} := by + cases a with + | H n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_H g l _] + exact h.H_mem_sector l _ + | barH n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_barH g l _] + exact h.barH_mem_sector l _ + | F n l μ ν j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_F g l μ ν _] + exact h.F_mem_sector l μ ν _ + | d i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_d g i l _] + exact h.d_mem_sector i l _ + | bard i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_bard g i l _] + exact h.bard_mem_sector i l _ + | u i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_u g i l _] + exact h.u_mem_sector i l _ + | baru i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_baru g i l _] + exact h.baru_mem_sector i l _ + | Q i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_Q g i l _] + exact h.Q_mem_sector i l _ + | barQ i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_barQ g i l _] + exact h.barQ_mem_sector i l _ + | L i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_L g i l _] + exact h.L_mem_sector i l _ + | barL i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_barL g i l _] + exact h.barL_mem_sector i l _ + | e i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_e g i l _] + exact h.e_mem_sector i l _ + | bare i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repGauge_bare g i l _] + exact h.bare_mem_sector i l _ + +/-- The Lorentz action carries a covariant generator into the sector of its + class. -/ +lemma repLorentz_generatorVal_mem_sector (Λ : SL(2,ℂ)) (a : Generators) : + repLorentz Λ (h.generatorVal a) ∈ h.sector {a.kind} := by + cases a with + | H n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_H Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.H_mem_sector p _) + | barH n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_barH Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barH_mem_sector p _) + | F n l μ ν j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_F Λ n l μ ν _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ + (sum_mem fun a _ => SMulMemClass.smul_mem _ + (sum_mem fun b _ => SMulMemClass.smul_mem _ (h.F_mem_sector p a b _))) + | d i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_d i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.d_mem_sector i p _) + | bard i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_bard i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.bard_mem_sector i p _) + | u i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_u i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.u_mem_sector i p _) + | baru i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_baru i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.baru_mem_sector i p _) + | Q i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_Q i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.Q_mem_sector i p _) + | barQ i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_barQ i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barQ_mem_sector i p _) + | L i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_L i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.L_mem_sector i p _) + | barL i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_barL i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barL_mem_sector i p _) + | e i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_e i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.e_mem_sector i p _) + | bare i n l j => + simp only [generatorVal, Generators.kind] + rw [h.repLorentz_bare i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.bare_mem_sector i p _) + +/-- The action `repGauge` preserves every sector. -/ +lemma repGauge_mem_sector {S : Finset GeneratorClass} {x : B} (g : GaugeGroupI) + (hx : x ∈ h.sector S) : repGauge g x ∈ h.sector S := by + rw [mem_sector, sectorSubmodule] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨gl, hgl, rfl⟩ := hy + subst hgl + induction gl with + | nil => + simp only [List.map_nil, List.prod_nil] + rw [h.repGauge_one g] + simpa using h.list_prod_mem_sector ([] : List Generators) + | cons a t ih => + simp only [List.map_cons, List.prod_cons] + rw [h.repGauge_mul g, wordClasses_cons, ← Finset.singleton_union] + exact h.mul_mem_sector (h.repGauge_generatorVal_mem_sector g a) ih + | zero => rw [map_zero]; exact zero_mem _ + | add a b ha hb iha ihb => rw [map_add]; exact add_mem iha ihb + | smul c a ha iha => rw [map_smul]; exact SMulMemClass.smul_mem _ iha + +/-- The action `repLorentz` preserves every sector. -/ +lemma repLorentz_mem_sector {S : Finset GeneratorClass} {x : B} (Λ : SL(2,ℂ)) + (hx : x ∈ h.sector S) : repLorentz Λ x ∈ h.sector S := by + rw [mem_sector, sectorSubmodule] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨gl, hgl, rfl⟩ := hy + subst hgl + induction gl with + | nil => + simp only [List.map_nil, List.prod_nil] + rw [h.repLorentz_one Λ] + simpa using h.list_prod_mem_sector ([] : List Generators) + | cons a t ih => + simp only [List.map_cons, List.prod_cons] + rw [h.repLorentz_mul Λ, wordClasses_cons, ← Finset.singleton_union] + exact h.mul_mem_sector (h.repLorentz_generatorVal_mem_sector Λ a) ih + | zero => rw [map_zero]; exact zero_mem _ + | add a b ha hb iha ihb => rw [map_add]; exact add_mem iha ihb + | smul c a ha iha => rw [map_smul]; exact SMulMemClass.smul_mem _ iha + +/-! + +### Decomposition lemma + +-/ +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean new file mode 100644 index 000000000..713416bc3 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean @@ -0,0 +1,571 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.Generators +/-! +# The mass-weight grading of the field algebra + +The elements of the field algebra of a given mass weight form a submodule, which is +exactly the span of the words in the covariant generators of that total weight +(`massWeightSubmodule_eq_span`). Weight-homogeneous elements supercommute, +the gauge and Lorentz actions preserve the weight, and consequently an invariant +element decomposing into components of pairwise distinct weights has invariant +components. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) + +/-! + +## A. The mass-weight submodules + +-/ + + + +/-- All elements of the field algebra of mass weight exactly `n`: the intersection of + the algebra generated by the covariant fields with the part on which + `massWeightPoly` is the monomial `X ^ n`. -/ +noncomputable def massWeightSubmodule + (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F + d bard u baru Q barQ L barL e bare) (n : ℕ) : Submodule ℂ B := + (h.fieldAlgebra).toSubmodule + ⊓ LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) + +lemma massWeightPoly_of_mem_massWeightSubmodule {n : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule n) : + massWeightPoly x = Polynomial.monomial n x := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + rcases hx with ⟨-, hx'⟩ + rw [LinearMap.mem_ker] at hx' + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] at hx' + exact hx' + +lemma mem_fieldAlgebra_of_mem_massWeightSubmodule {n : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule n) : x ∈ h.fieldAlgebra := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + exact hx.1 + +/-- Membership in a mass-weight submodule: an element of the field algebra which + `massWeightPoly` sends to the monomial of that weight. -/ +lemma mem_massWeightSubmodule_of {n : ℕ} {x : B} (hmem : x ∈ h.fieldAlgebra) + (hpoly : massWeightPoly x = Polynomial.monomial n x) : + x ∈ h.massWeightSubmodule n := by + rw [massWeightSubmodule] + refine Submodule.mem_inf.mpr ⟨hmem, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + exact hpoly +/-! + +## B. The weight grading of the field algebra + +-/ + +/-- A word in the covariant generators lies in the mass-weight submodule of its total + weight. -/ +lemma list_prod_mem_massWeightSubmodule {w : ℕ} {gl : List Generators} + (hw : (gl.map Generators.weight).sum = w) : + (gl.map h.generatorVal).prod ∈ h.massWeightSubmodule w := + h.mem_massWeightSubmodule_of + (Subalgebra.list_prod_mem _ fun y hy => by + obtain ⟨g, -, rfl⟩ := List.mem_map.mp hy + exact h.generatorVal_mem_fieldAlgebra g) + (by rw [h.massWeightPoly_generatorVal_list_prod, hw]) + +/-- Reading off the `X ^ w` coefficient of `massWeightPoly` sends the field algebra + into the span of the words of total weight `w` — the projection onto the weight-`w` + component, with no independence argument needed. -/ +lemma coeff_massWeightPoly_mem_span (w : ℕ) {x : B} + (hx : x ∈ h.fieldAlgebra) : + (massWeightPoly x).coeff w ∈ Submodule.span ℂ + {y | ∃ gl : List Generators, + (gl.map Generators.weight).sum = w ∧ (gl.map h.generatorVal).prod = y} := by + rw [h.fieldAlgebra_eq_adjoin_range, ← Subalgebra.mem_toSubmodule, + Algebra.adjoin_eq_span] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨l₀, hl₀, rfl⟩ := Submonoid.exists_list_of_mem_closure hy + obtain ⟨gl, rfl⟩ := h.exists_list_map_eq l₀ hl₀ + rw [h.massWeightPoly_generatorVal_list_prod, Polynomial.coeff_monomial] + by_cases hw : (gl.map Generators.weight).sum = w + · rw [if_pos hw] + exact Submodule.subset_span ⟨gl, hw, rfl⟩ + · rw [if_neg hw] + exact Submodule.zero_mem _ + | zero => + rw [map_zero, Polynomial.coeff_zero] + exact Submodule.zero_mem _ + | add a b ha hb iha ihb => + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ iha ihb + | smul c a ha iha => + rw [map_smul, Polynomial.coeff_smul] + exact Submodule.smul_mem _ _ iha + +/-- **The weight grading of the field algebra.** The submodule of elements of the + field algebra of mass weight `w` is exactly the span of the words in the covariant + basis generators of total weight `w`. -/ +theorem massWeightSubmodule_eq_span (w : ℕ) : + h.massWeightSubmodule w = Submodule.span ℂ + {x | ∃ gl : List Generators, + (gl.map Generators.weight).sum = w ∧ (gl.map h.generatorVal).prod = x} := by + refine le_antisymm (fun x hx => ?_) (Submodule.span_le.mpr ?_) + · have h1 := h.massWeightPoly_of_mem_massWeightSubmodule hx + have h2 := h.coeff_massWeightPoly_mem_span w + (h.mem_fieldAlgebra_of_mem_massWeightSubmodule hx) + rwa [h1, Polynomial.coeff_monomial, if_pos rfl] at h2 + · rintro x ⟨gl, hw, rfl⟩ + exact h.list_prod_mem_massWeightSubmodule hw +/-! + +## C. Supercommutativity of weight-homogeneous elements + +-/ + +/-- Weight-homogeneous elements of the field algebra supercommute: elements of the + mass-weight submodules of weights `w` and `w'` exchange up to the sign + `(-1) ^ (w * w')` — fermion parity is the parity of the mass weight. -/ +theorem mul_eq_smul_mul_of_mem_massWeightSubmodule {w w' : ℕ} {x y : B} + (hx : x ∈ h.massWeightSubmodule w) (hy : y ∈ h.massWeightSubmodule w') : + x * y = ((-1 : ℂ) ^ (w * w')) • (y * x) := by + rw [h.massWeightSubmodule_eq_span] at hx hy + induction hx using Submodule.span_induction with + | mem x hxw => + obtain ⟨gl, hglw, rfl⟩ := hxw + induction hy using Submodule.span_induction with + | mem y hyw => + obtain ⟨gl', hgl'w, rfl⟩ := hyw + rw [← hglw, ← hgl'w] + exact h.list_prod_mul_list_prod gl gl' + | zero => simp + | add a b ha hb iha ihb => rw [mul_add, iha, ihb, add_mul, smul_add] + | smul c a ha iha => rw [mul_smul_comm, iha, smul_comm, smul_mul_assoc] + | zero => simp + | add a b ha hb iha ihb => rw [add_mul, iha, ihb, mul_add, smul_add] + | smul c a ha iha => rw [smul_mul_assoc, iha, smul_comm, mul_smul_comm] + +/-- Weight-homogeneous elements of the field algebra commute up to a scalar. -/ +lemma exists_smul_mul_comm_of_mem_massWeightSubmodule {w w' : ℕ} {x y : B} + (hx : x ∈ h.massWeightSubmodule w) (hy : y ∈ h.massWeightSubmodule w') : + ∃ c : ℂ, x * y = c • (y * x) := + ⟨_, h.mul_eq_smul_mul_of_mem_massWeightSubmodule hx hy⟩ + +/-- Reordering a product of two weight-homogeneous elements does not change its + span. -/ +lemma span_mul_comm_of_mem_massWeightSubmodule {w w' : ℕ} {x y : B} + (hx : x ∈ h.massWeightSubmodule w) (hy : y ∈ h.massWeightSubmodule w') : + ℂ ∙ (x * y) = ℂ ∙ (y * x) := by + rw [h.mul_eq_smul_mul_of_mem_massWeightSubmodule hx hy] + exact Submodule.span_singleton_smul_eq ((isUnit_one.neg).pow _) _ + +lemma d_supercommute_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} + (φ : Module.Dual ℂ DownSinglet) {w : ℕ} (x : B) (hx : x ∈ h.massWeightSubmodule w) : + d i l φ * x = ((-1 : ℂ) ^ w) • (x * d i l φ) := by + sorry +/-! + +## D. Invariance of the weight components + +The gauge and Lorentz actions preserve the mass weight: they carry each covariant +tower into combinations of towers of the same derivative order. The weight +components of the field algebra are independent, so an invariant element that is +a sum of components of pairwise distinct weights has invariant components. + +-/ + +/-- The mass-weight submodules are multiplicative: weights add under multiplication. -/ +lemma mul_mem_massWeightSubmodule {w w2 : ℕ} {x y : B} + (hx : x ∈ h.massWeightSubmodule w) (hy : y ∈ h.massWeightSubmodule w2) : + x * y ∈ h.massWeightSubmodule (w + w2) := + h.mem_massWeightSubmodule_of + (mul_mem (h.mem_fieldAlgebra_of_mem_massWeightSubmodule hx) + (h.mem_fieldAlgebra_of_mem_massWeightSubmodule hy)) + (by rw [map_mul, h.massWeightPoly_of_mem_massWeightSubmodule hx, + h.massWeightPoly_of_mem_massWeightSubmodule hy, Polynomial.monomial_mul_monomial]) + +/-- Any Higgs tower symbol lies in the mass-weight submodule of its weight. -/ +lemma H_mem_massWeightSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) : H l φ ∈ h.massWeightSubmodule (2 * (1 + n)) := by + rw [← HiggsVec.orthonormBasis.toBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.H n l j]) (by simp [Generators.weight]) + +/-- Any conjugate-Higgs tower symbol lies in the mass-weight submodule of its weight. -/ +lemma barH_mem_massWeightSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + barH l φ ∈ h.massWeightSubmodule (2 * (1 + n)) := by + rw [← HiggsVec.orthonormBasis.toBasis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.barH n l j]) (by simp [Generators.weight]) + +/-- Any field-strength tower symbol lies in the mass-weight submodule of its weight. -/ +lemma F_mem_massWeightSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + F l μ ν φ ∈ h.massWeightSubmodule (2 * (2 + n)) := by + rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => ?_ + rw [← algebraMap_smul ℂ (φ (GaugeAlgebra.stdBasis j))] + refine Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.F n l μ ν j]) (by simp [Generators.weight]) + +/-- Any `d` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma d_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ DownSinglet) : d i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← DownSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.d i n l j]) (by simp [Generators.weight]) + +/-- Any `bard` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma bard_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : bard i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← DownSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.bard i n l j]) (by simp [Generators.weight]) + +/-- Any `u` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma u_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ UpSinglet) : u i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← UpSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.u i n l j]) (by simp [Generators.weight]) + +/-- Any `baru` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma baru_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : baru i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← UpSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.baru i n l j]) (by simp [Generators.weight]) + +/-- Any `Q` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma Q_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ QuarkDoublet) : Q i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← QuarkDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.Q i n l j]) (by simp [Generators.weight]) + +/-- Any `barQ` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma barQ_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : barQ i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← QuarkDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.barQ i n l j]) (by simp [Generators.weight]) + +/-- Any `L` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma L_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonDoublet) : L i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← LeptonDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.L i n l j]) (by simp [Generators.weight]) + +/-- Any `barL` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma barL_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : barL i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← LeptonDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.barL i n l j]) (by simp [Generators.weight]) + +/-- Any `e` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma e_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonSinglet) : e i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← LeptonSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.e i n l j]) (by simp [Generators.weight]) + +/-- Any `bare` tower symbol lies in the mass-weight submodule of its weight. -/ +lemma bare_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : bare i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by + rw [← LeptonSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine Submodule.sum_mem _ fun j _ => Submodule.smul_mem _ _ ?_ + simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule + (gl := [Generators.bare i n l j]) (by simp [Generators.weight]) + +/-- The gauge action carries a covariant generator into the mass-weight submodule + of its weight. -/ +lemma repGauge_generatorVal_mem (g : GaugeGroupI) (a : Generators) : + repGauge g (h.generatorVal a) ∈ h.massWeightSubmodule a.weight := by + cases a with + | H n l j => + simp only [generatorVal] + rw [h.repGauge_H g l _] + exact h.H_mem_massWeightSubmodule l _ + | barH n l j => + simp only [generatorVal] + rw [h.repGauge_barH g l _] + exact h.barH_mem_massWeightSubmodule l _ + | F n l μ ν j => + simp only [generatorVal] + rw [h.repGauge_F g l μ ν _] + exact h.F_mem_massWeightSubmodule l μ ν _ + | d i n l j => + simp only [generatorVal] + rw [h.repGauge_d g i l _] + exact h.d_mem_massWeightSubmodule i l _ + | bard i n l j => + simp only [generatorVal] + rw [h.repGauge_bard g i l _] + exact h.bard_mem_massWeightSubmodule i l _ + | u i n l j => + simp only [generatorVal] + rw [h.repGauge_u g i l _] + exact h.u_mem_massWeightSubmodule i l _ + | baru i n l j => + simp only [generatorVal] + rw [h.repGauge_baru g i l _] + exact h.baru_mem_massWeightSubmodule i l _ + | Q i n l j => + simp only [generatorVal] + rw [h.repGauge_Q g i l _] + exact h.Q_mem_massWeightSubmodule i l _ + | barQ i n l j => + simp only [generatorVal] + rw [h.repGauge_barQ g i l _] + exact h.barQ_mem_massWeightSubmodule i l _ + | L i n l j => + simp only [generatorVal] + rw [h.repGauge_L g i l _] + exact h.L_mem_massWeightSubmodule i l _ + | barL i n l j => + simp only [generatorVal] + rw [h.repGauge_barL g i l _] + exact h.barL_mem_massWeightSubmodule i l _ + | e i n l j => + simp only [generatorVal] + rw [h.repGauge_e g i l _] + exact h.e_mem_massWeightSubmodule i l _ + | bare i n l j => + simp only [generatorVal] + rw [h.repGauge_bare g i l _] + exact h.bare_mem_massWeightSubmodule i l _ + +/-- The Lorentz action carries a covariant generator into the mass-weight submodule + of its weight. -/ +lemma repLorentz_generatorVal_mem (Λ : SL(2,ℂ)) (a : Generators) : + repLorentz Λ (h.generatorVal a) ∈ h.massWeightSubmodule a.weight := by + cases a with + | H n l j => + simp only [generatorVal] + rw [h.repLorentz_H Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.H_mem_massWeightSubmodule p _) + | barH n l j => + simp only [generatorVal] + rw [h.repLorentz_barH Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.barH_mem_massWeightSubmodule p _) + | F n l μ ν j => + simp only [generatorVal] + rw [h.repLorentz_F Λ n l μ ν _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (Submodule.sum_mem _ fun a _ => Submodule.smul_mem _ _ + (Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ + (h.F_mem_massWeightSubmodule p a b _))) + | d i n l j => + simp only [generatorVal] + rw [h.repLorentz_d i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.d_mem_massWeightSubmodule i p _) + | bard i n l j => + simp only [generatorVal] + rw [h.repLorentz_bard i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.bard_mem_massWeightSubmodule i p _) + | u i n l j => + simp only [generatorVal] + rw [h.repLorentz_u i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.u_mem_massWeightSubmodule i p _) + | baru i n l j => + simp only [generatorVal] + rw [h.repLorentz_baru i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.baru_mem_massWeightSubmodule i p _) + | Q i n l j => + simp only [generatorVal] + rw [h.repLorentz_Q i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.Q_mem_massWeightSubmodule i p _) + | barQ i n l j => + simp only [generatorVal] + rw [h.repLorentz_barQ i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.barQ_mem_massWeightSubmodule i p _) + | L i n l j => + simp only [generatorVal] + rw [h.repLorentz_L i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.L_mem_massWeightSubmodule i p _) + | barL i n l j => + simp only [generatorVal] + rw [h.repLorentz_barL i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.barL_mem_massWeightSubmodule i p _) + | e i n l j => + simp only [generatorVal] + rw [h.repLorentz_e i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.e_mem_massWeightSubmodule i p _) + | bare i n l j => + simp only [generatorVal] + rw [h.repLorentz_bare i Λ n l _] + exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ + (h.bare_mem_massWeightSubmodule i p _) + +/-- The action `repGauge` preserves the mass-weight submodules. -/ +lemma repGauge_mem_massWeightSubmodule {w : ℕ} {x : B} (g : GaugeGroupI) + (hx : x ∈ h.massWeightSubmodule w) : repGauge g x ∈ h.massWeightSubmodule w := by + rw [h.massWeightSubmodule_eq_span] at hx + induction hx using Submodule.span_induction with + | mem y hyw => + obtain ⟨gl, hglw, rfl⟩ := hyw + subst hglw + induction gl with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil] + rw [h.repGauge_one g] + simpa using h.list_prod_mem_massWeightSubmodule (gl := ([] : List Generators)) rfl + | cons a t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + rw [h.repGauge_mul g] + exact h.mul_mem_massWeightSubmodule (h.repGauge_generatorVal_mem g a) ih + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [map_add]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [map_smul]; exact Submodule.smul_mem _ _ iha + +/-- The action `repLorentz` preserves the mass-weight submodules. -/ +lemma repLorentz_mem_massWeightSubmodule {w : ℕ} {x : B} (Λ : SL(2,ℂ)) + (hx : x ∈ h.massWeightSubmodule w) : repLorentz Λ x ∈ h.massWeightSubmodule w := by + rw [h.massWeightSubmodule_eq_span] at hx + induction hx using Submodule.span_induction with + | mem y hyw => + obtain ⟨gl, hglw, rfl⟩ := hyw + subst hglw + induction gl with + | nil => + simp only [List.map_nil, List.prod_nil, List.sum_nil] + rw [h.repLorentz_one Λ] + simpa using h.list_prod_mem_massWeightSubmodule (gl := ([] : List Generators)) rfl + | cons a t ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + rw [h.repLorentz_mul Λ] + exact h.mul_mem_massWeightSubmodule (h.repLorentz_generatorVal_mem Λ a) ih + | zero => rw [map_zero]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [map_add]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [map_smul]; exact Submodule.smul_mem _ _ iha + +/-- Components of pairwise distinct mass weights are independent: a vanishing sum + of weight-homogeneous elements has vanishing terms. -/ +lemma eq_zero_of_sum_massWeightSubmodule {n : ℕ} {w : Fin n → ℕ} + (hw : Function.Injective w) {f : Fin n → B} + (hf : ∀ i, f i ∈ h.massWeightSubmodule (w i)) (hsum : ∑ i, f i = 0) : + ∀ i, f i = 0 := by + intro i₀ + have hpoly := congrArg (fun z => Polynomial.coeff (massWeightPoly z) (w i₀)) hsum + simp only [map_sum, Polynomial.finsetSum_coeff, map_zero, Polynomial.coeff_zero] + at hpoly + rw [Finset.sum_congr rfl (fun i _ => by + rw [h.massWeightPoly_of_mem_massWeightSubmodule (hf i), + Polynomial.coeff_monomial]), + Finset.sum_eq_single i₀ + (fun i _ hne => if_neg fun hcontra => hne (hw hcontra)) + (by simp), if_pos rfl] at hpoly + exact hpoly + +/-- An invariant element decomposes into invariant weight components: if a gauge- + and Lorentz-invariant `x` is the sum of components of pairwise distinct mass + weights, every component is itself gauge and Lorentz invariant. -/ +lemma invariant_of_eq_sum_massWeightSubmodule {n : ℕ} {x : B} {w : Fin n → ℕ} + (hw : Function.Injective w) (f : Fin n → B) (hf : x = ∑ i, f i) + (hx : ∀ i, f i ∈ h.massWeightSubmodule (w i)) + (hgauge : ∀ g, repGauge g x = x) (hlorentz : ∀ Λ, repLorentz Λ x = x) : + ∀ i, (∀ g, repGauge g (f i) = f i) ∧ ∀ Λ, repLorentz Λ (f i) = f i := by + have key : ∀ T : B →ₗ[ℂ] B, T x = x → + (∀ i, T (f i) ∈ h.massWeightSubmodule (w i)) → ∀ i, T (f i) = f i := by + intro T hTx hTf i₀ + have hzero : ∑ i, (T (f i) - f i) = 0 := by + rw [Finset.sum_sub_distrib, ← map_sum, ← hf, hTx, sub_self] + have hcomp := h.eq_zero_of_sum_massWeightSubmodule hw + (f := fun i => T (f i) - f i) + (fun i => Submodule.sub_mem _ (hTf i) (hx i)) hzero i₀ + exact sub_eq_zero.mp hcomp + intro i + constructor + · intro g + exact key (repGauge g) (hgauge g) + (fun i => h.repGauge_mem_massWeightSubmodule g (hx i)) i + · intro Λ + exact key (repLorentz Λ) (hlorentz Λ) + (fun i => h.repLorentz_mem_massWeightSubmodule Λ (hx i)) i + +/-- The reduction of questions on invariants to invariants within + mass weight submodules. -/ +lemma invaraint_of_eq_sum_massWeightSubmodule {n : ℕ} {x : B} + (f : Fin n → B) (hf : x = ∑ i, f i) (hx : ∀ i, f i ∈ h.massWeightSubmodule i.val) + (hgauge : ∀ g, repGauge g x = x) (hlorentz : ∀ Λ, repLorentz Λ x = x) : + ∀ i, (∀ g, repGauge g (f i) = f i) ∧ ∀ Λ, repLorentz Λ (f i) = f i := + h.invariant_of_eq_sum_massWeightSubmodule Fin.val_injective f hf hx hgauge hlorentz + +end IsCovStandardModel + +end StandardModel From b72016ddd33858d7fe1caee04eea7b8254cb881d Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 28 Aug 2026 11:42:27 +0100 Subject: [PATCH 225/254] feat: Lots of API --- .notes.json | 120 +++ Physlib.lean | 6 + Physlib/Mathematics/ConjModule.lean | 13 + .../GaugeGroup/GaugeWeightDecomposition.lean | 39 + .../HiggsBoson/AlgebraValued/Basic.lean | 98 +- .../IsCovStandardModel/Basic.lean | 432 ++------ .../FermionGaugeSector/Basic.lean | 0 .../IsCovStandardModel/Generators.lean | 691 +++---------- .../IsCovStandardModel/MassWeight.lean | 64 +- .../IsCovStandardModel/Sectors.lean | 954 ++++++++++++++++++ .../YukawaSector/Basic.lean | 0 .../StandardModel/IsFermionSector/Basic.lean | 681 +++++++++++++ .../GaugeWeightDecomposition.lean | 593 +++++++++++ .../IsFermionSector/MassWeight.lean | 585 +++++++++++ .../StandardModel/IsGaugeSector/Basic.lean | 100 ++ .../IsGaugeSector/MassWeight.lean | 343 +++++++ .../JetComponentSpace/CovariantDeriv.lean | 2 +- Physlib/Relativity/IsLorentzDeriv.lean | 8 + .../Invariants/IsQuadLorentz.lean | 2 +- 19 files changed, 3730 insertions(+), 1001 deletions(-) create mode 100644 .notes.json create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/Basic.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/MassWeight.lean create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/MassWeight.lean diff --git a/.notes.json b/.notes.json new file mode 100644 index 000000000..d40c5b0e9 --- /dev/null +++ b/.notes.json @@ -0,0 +1,120 @@ +{ + "./Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean": [ + { + "id": "1787912669766-gsoif9cz7", + "line": 193, + "text": "For the Higgs submodule also define derivSubmodule.\n- We also want to show that they commute. \n- We want to show that they are closed under the group action. \n- ", + "timestamp": 1787912751941, + "author": "js4814", + "priority": "low", + "category": "note" + } + ], + "./Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean": [ + { + "id": "1787912833232-x9sbq4b6r", + "line": 96, + "text": "Show that derivSubmodule here commute, and is closed under the Lorentz group and the gauge group.", + "timestamp": 1787912833232, + "author": "js4814", + "priority": "low", + "category": "note" + } + ], + "./Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean": [ + { + "id": "1787913087338-wv0k7v7ft", + "line": 0, + "text": "We do not want to define IsFermionGaugeSector in the same way as we have IsFermionSector, however we can repeat some of the calculations here. \n\nFirst give the decomposition of the sectorMassweight submodules up to weight 8 into derivatives from the fermion sector and the gauge sector.", + "timestamp": 1787913128260, + "author": "js4814", + "priority": "low", + "category": "note" + } + ], + "./Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean": [ + { + "id": "1787913197924-gvm6e874s", + "line": 0, + "text": "We do not want to define IsYukawaSector in the same way as we have IsFermionSector, however we can repeat some of the calculations here.\n\nFirst give the decomposition of the sectorMassweight submodules up to weight 8 into submodules derivatives from the fermion sector and the higgs sector.", + "timestamp": 1787913197924, + "author": "js4814", + "priority": "low", + "category": "note" + } + ], + "./Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean": [ + { + "id": "1787913429728-roea8meg3", + "line": 60, + "text": "Move isoWeight and colorWieght to the GuageDecomposition file", + "timestamp": 1787913429728, + "author": "js4814", + "priority": "low", + "category": "note" + }, + { + "id": "1787913477040-9a39jq79d", + "line": 83, + "text": "Move these .valueGaugeWeight to the files where the fermions are defined", + "timestamp": 1787913477040, + "author": "js4814", + "priority": "low", + "category": "note" + }, + { + "id": "1787913500863-ed1dyukp4", + "line": 168, + "text": "Move these .repGaugeGroupI_gaugeTorusGen_basis to the file where the fermions are defined.", + "timestamp": 1787913500863, + "author": "js4814", + "priority": "low", + "category": "note" + }, + { + "id": "1787913566110-a4ry11ryw", + "line": 213, + "text": "Move this lemma to the GaugeGroupI file", + "timestamp": 1787913566110, + "author": "js4814", + "priority": "low", + "category": "note" + }, + { + "id": "1787913578937-7xqs595g8", + "line": 192, + "text": "Move this to the file where GaugeGroupI is defined", + "timestamp": 1787913578937, + "author": "js4814", + "priority": "low", + "category": "note" + }, + { + "id": "1787913606044-kspaat8oj", + "line": 331, + "text": "Move the .repGaugeGroupI_conj_dual_gaugeTorusGen_coord lemmas to the corresponding file for those fermions", + "timestamp": 1787913606044, + "author": "js4814", + "priority": "low", + "category": "note" + }, + { + "id": "1787913669657-xgcqc0smc", + "line": 452, + "text": "Could these rangeGaugeWeight_? lemmas be made into instances.", + "timestamp": 1787913669657, + "author": "js4814", + "priority": "low", + "category": "note" + }, + { + "id": "1787913693373-ccl7ihssb", + "line": 564, + "text": "Could derivSubmoduleGaugeWeight be made into an instance.", + "timestamp": 1787913693373, + "author": "js4814", + "priority": "low", + "category": "note" + } + ] +} \ No newline at end of file diff --git a/Physlib.lean b/Physlib.lean index 6d3e35575..7729c1d72 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -256,9 +256,15 @@ public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebra public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.IsFermionSector.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight +public import Physlib.Particles.StandardModel.IsFermionSector.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight +public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Mathematics/ConjModule.lean b/Physlib/Mathematics/ConjModule.lean index 9ff05c4a0..c7ab5678a 100644 --- a/Physlib/Mathematics/ConjModule.lean +++ b/Physlib/Mathematics/ConjModule.lean @@ -164,6 +164,19 @@ lemma _root_.Representation.conj_apply {G} [Group G] (ρ : Representation k G M) (m : ConjModule M) : ρ.conj g m = conjEquiv (k := k) (M := M) (ρ g ((conjEquiv (k := k) (M := M)).symm m)) := rfl +/-- The conjugate of the trivial representation acts trivially. -/ +@[simp] lemma _root_.Representation.conj_trivial_apply {G : Type*} [Group G] (g : G) + (m : ConjModule M) : (Representation.trivial k G M).conj g m = m := by + rw [Representation.conj_apply] + simp + +/-- The dual of the conjugate of the trivial representation acts trivially. -/ +@[simp] lemma _root_.Representation.conj_trivial_dual_apply {G : Type*} [Group G] (g : G) + (φ : Module.Dual k (ConjModule M)) : + ((Representation.trivial k G M).conj).dual g φ = φ := by + ext m + simp [Representation.dual_apply, Module.Dual.transpose_apply] + /-! ## Functoriality, and conjugation of tensor products diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index 41f6cc3b4..c286eb701 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -224,6 +224,10 @@ def GaugeWeight.coord (w : GaugeWeight) : Fin 4 → ℤ := ![w.1, w.2.1, w.2.2.1 @[simp] lemma GaugeWeight.coord_three (w : GaugeWeight) : w.coord 3 = w.2.2.2 := rfl /-- The zero gauge weight has vanishing exponent against every torus generator. -/ +@[simp] lemma GaugeWeight.coord_neg (w : GaugeWeight) (i : Fin 4) : + (-w).coord i = -(w.coord i) := by + fin_cases i <;> rfl + @[simp] lemma GaugeWeight.zero_coord (i : Fin 4) : (0 : GaugeWeight).coord i = 0 := by fin_cases i <;> rfl @@ -387,6 +391,41 @@ lemma bot_piece (hmul : IsMulRep rep) lemma bot_supp (hmul : IsMulRep rep) : (bot hmul).supp = ∅ := rfl +/-- **The span of a single simultaneous eigenvector** of the gauge torus, as a + decomposition concentrated in its one weight. This is the base case from which the + decompositions of spans of weight vectors are assembled by `iSup` and `sup`. -/ +@[implicit_reducible] +noncomputable def spanSingleton (hmul : IsMulRep rep) (x : B) (w : GaugeWeight) + (hx : ∀ i, rep (gaugeTorusGen i) x = ((expI : ℂ) ^ w.coord i) • x) : + GaugeWeightDecomposition rep (Submodule.span ℂ {x}) where + piece w' := if w' = w then Submodule.span ℂ {x} else ⊥ + supp := {w} + rep_mul := hmul + piece_le := by + intro w' y hy i + split_ifs at hy with hw' + · subst hw' + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.mp hy + rw [map_smul, hx i, smul_comm] + · rw [Submodule.mem_bot] at hy + subst hy + simp + piece_eq_bot := by + intro w' hw' + rw [if_neg (by simpa using hw')] + iSup_piece := by + refine le_antisymm (iSup_le fun w' => ?_) (le_iSup_of_le w (by rw [if_pos rfl])) + split_ifs + · exact le_rfl + · exact bot_le + +@[simp] +lemma spanSingleton_piece (hmul : IsMulRep rep) (x : B) (w : GaugeWeight) + (hx : ∀ i, rep (gaugeTorusGen i) x = ((expI : ℂ) ^ w.coord i) • x) + (w' : GaugeWeight) : + (spanSingleton hmul x w hx).piece w' + = if w' = w then Submodule.span ℂ {x} else ⊥ := rfl + /-- **An indexed join of decompositions.** A family of decompositions indexed by a finite type decomposes the join, its pieces joined and its supports united one weight at a time. This is the arbitrary-arity form of `sup`. -/ diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean index aca6d8933..37d9e0dab 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean @@ -30,7 +30,7 @@ and from the dual of the Higgs space to some algebra `B`. The Higgs is a Lorentz scalar, so Lorentz equivariance carries no content for `H` itself and is not recorded as a field. -We define `IsHiggsAlgebraValued` to be the property that these maps are equivariant under +We define `IsHiggsSector` to be the property that these maps are equivariant under the gauge group and the Lorentz group, and there images commute with one another. We let `higgsSubModule` be the submodule of `B` generated by the images of `H`, @@ -93,9 +93,12 @@ open TensorProduct Matrix MatrixGroups Lorentz * a gauge transformation acts on `B` by an *algebra* map (`rep_mul`). A `Representation` records only a linear action, so multiplicativity has to be demanded separately; it is what lets the gauge action be transported through products of symbols. -/ -structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] +structure IsHiggsSector (B : Type) [Ring B] [Algebra ℂ B] (rep : Representation ℂ GaugeGroupI B) + (rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂) (repLorentz : Representation ℂ SL(2,ℂ) B) + (repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) (H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B) (barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B) (massWeightPoly : B →ₐ[ℂ] Polynomial B) : Prop where @@ -107,13 +110,6 @@ structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] the physicists' `H^† ↦ H^† g^†`. -/ barH_equivariant : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule HiggsVec)) n l, rep g (barH n l φ) = barH n l (HiggsVec.repGaugeGroupI.conj.dual g φ) - /-- Gauge transformations act on `B` by algebra maps: the representation is - multiplicative. -/ - rep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂ - /-- Lorentz transformations act on `B` by algebra maps: the representation is - multiplicative. -/ - repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), - repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ /-- The Higgs is bosonic: two Higgs symbols commute. -/ H_comm_H : ∀ φ ψ n1 n2 l1 l2, Commute (H n1 l1 φ) (H n2 l2 ψ) /-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ @@ -122,25 +118,60 @@ structure IsHiggsAlgebraValued (B : Type*) [Semiring B] [Algebra ℂ B] barH_comm_barH : ∀ φ ψ n1 n2 l1 l2, Commute (barH n1 l1 φ) (barH n2 l2 ψ) H_massWeight : ∀ φ n l, massWeightPoly (H n l φ) = Polynomial.monomial (2 * (1 + n)) (H n l φ) barH_massWeight : ∀ φ n l, massWeightPoly (barH n l φ) = Polynomial.monomial (2 * (1 + n)) (barH n l φ) - /-- The action of the Lorentz group on H. -/ - repLorentz_H : ∀ (g : SL(2,ℂ)) (φ : Module.Dual ℂ HiggsVec) n l, - repLorentz g (H n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), - (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • H n a φ - /-- The action of the Lorentz group on barH. -/ - repLorentz_barH : ∀ (g : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) n l, - repLorentz g (barH n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), - (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • barH n a φ + /-- The Higgs tower transforms under the Lorentz group as the covariant + derivatives of a Lorentz scalar: each derivative slot mixes by the Lorentz + matrix, and the value index is inert. -/ + repLorentz_H : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {n} => H n) + /-- The conjugate Higgs tower transforms as the covariant derivatives of a Lorentz + scalar, through the conjugate of the trivial representation. -/ + repLorentz_barH : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj (fun {n} => barH n) set_option linter.unusedVariables false -namespace IsHiggsAlgebraValued +namespace IsHiggsSector -variable {B : Type*} [Ring B] [Algebra ℂ B] +variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} + {hrep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂} {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) + +/-- Gauge transformations act on `B` by algebra maps: dot-notation access to the + multiplicativity hypothesis of the structure. -/ +lemma rep_mul (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) : + ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂ := hrep_mul + +/-- Lorentz transformations act on `B` by algebra maps: dot-notation access to the + multiplicativity hypothesis of the structure. -/ +lemma repLorentz_mul (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) : + ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := hrepLorentz_mul + +include h in +/-- The pointwise form of the structure field `repLorentz_H`: the Lorentz action + rotates the derivative indices of a Higgs symbol, and the value index is inert. -/ +lemma repLorentz_H_apply (g : SL(2,ℂ)) (φ : Module.Dual ℂ HiggsVec) (n : ℕ) + (l : Fin n → Fin 1 ⊕ Fin 3) : + repLorentz g (H n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • H n a φ := by + simpa only [Representation.trivial_dual_apply] using h.repLorentz_H g n l φ + +include h in +/-- The pointwise form of the structure field `repLorentz_barH`. -/ +lemma repLorentz_barH_apply (g : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) : + repLorentz g (barH n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • barH n a φ := by + simpa only [Representation.conj_trivial_dual_apply] using h.repLorentz_barH g n l φ /-! @@ -150,12 +181,14 @@ variable {B : Type*} [Ring B] [Algebra ℂ B] -/ /-- The component `∇_d H^i` in the algebra. -/ -noncomputable def higgs (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) +noncomputable def higgs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) :B := H n d (HiggsVec.orthonormBasis.toBasis.dualBasis i) /-- The component `∇_d barH^i` in the algebra. -/ -noncomputable def barHiggs (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) +noncomputable def barHiggs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : B := barH n d (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) @@ -207,12 +240,14 @@ lemma rep_barHiggsComponent (g : GaugeGroupI) {n : ℕ} (d : Fin n → (Fin 1 /-- The submodule of `B` generated by the Higgs symbols carrying `n` derivatives: the join, over the Lorentz indices `d`, of the ranges of the symbol maps `H n d`. Its elements are the terms linear in `∇_d H` — of mass dimension `1 + n`. -/ -def higgsSubmodule (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) (n : ℕ) : +def higgsSubmodule (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (H n d) /-- The submodule of `B` generated by the conjugate Higgs symbols carrying `n` derivatives: the join, over the Lorentz indices `d`, of the ranges of the symbol maps `barH n d`. -/ -def barHiggsSubmodule (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) +def barHiggsSubmodule (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (barH n d) /-! @@ -677,7 +712,8 @@ lemma dot_mem_boostWeightSubmodule {i : Fin 3} {a b : ℤ} {x y : Fin 2 → B} smul_mul_smul_comm, smul_mul_smul_comm, ← zpow_add₀ hc, ← smul_add] -noncomputable def dotGaugeHiggs (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) +noncomputable def dotGaugeHiggs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : B := h.higgs d1 0 * h.barHiggs d2 0 + h.higgs d1 1 * h.barHiggs d2 1 @@ -1487,14 +1523,14 @@ lemma repLorentz_higgs {n : ℕ} (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin 3) repLorentz g (h.higgs d k) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, (∏ j, (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • h.higgs a k := by simp only [higgs] - rw [h.repLorentz_H] + rw [h.repLorentz_H_apply] /-- The Lorentz action rotates the derivative indices of a conjugate Higgs symbol. -/ lemma repLorentz_barHiggs {n : ℕ} (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin 3) (k : Fin 2) : repLorentz g (h.barHiggs d k) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, (∏ j, (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • h.barHiggs a k := by simp only [barHiggs] - rw [h.repLorentz_barH] + rw [h.repLorentz_barH_apply] /-- **The Higgs inner product as a two-factor symbol map.** The first `num 0` derivative indices go on the Higgs, the last `num 1` on its conjugate, and the scalar `w : ℂ` scales @@ -1578,7 +1614,8 @@ lemma isDerivativeCollection_dotSymbol : /-- The algebra generated by the Higgs, it's conjugate and all their derivatives. -/ -def higgsAlgebra (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) : +def higgsAlgebra (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) : Subalgebra ℂ B := (Algebra.adjoin ℂ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), Set.range (H k d) ∪ Set.range (barH k d))) @@ -1593,7 +1630,8 @@ set_option linter.unusedVariables false in exactly `n`: the intersection of the algebra generated by every `∇_d H` and `∇_d H̄` with the part on which `massWeightPoly` is the monomial `X ^ n`. -/ noncomputable def massWeightSubmodule - (h : IsHiggsAlgebraValued B rep repLorentz H barH massWeightPoly) (n : ℕ) : + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) (n : ℕ) : Submodule ℂ B := h.higgsAlgebra.toSubmodule ⊓ LinearMap.ker (massWeightPoly.toLinearMap @@ -5150,6 +5188,6 @@ lemma gaugeInvariantOfMassDim_six_eq_boostWeightZero -/ -end IsHiggsAlgebraValued +end IsHiggsSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean index 9571d567d..7fc023137 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean @@ -11,6 +11,9 @@ public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebra public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight /-! # The algebra valued Standard model @@ -34,8 +37,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ B] - -- The representations - (repGauge : Representation ℂ GaugeGroupI B) (repLorentz : Representation ℂ SL(2,ℂ) B) + -- The representations, acting by algebra maps + (repGauge : Representation ℂ GaugeGroupI B) + (repGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + (repLorentz : Representation ℂ SL(2,ℂ) B) + (repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) -- The mass weights (massWeightPoly : B →ₐ[ℂ] Polynomial B) -- The Higgs fields + covariant derivatives @@ -60,133 +68,26 @@ structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ B] (e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B) (bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B) : Prop where - -- *Gauge transformation* - -- Every field transforms homogeneously under the global gauge group, which acts on - -- the dual value index through the dual (contragredient) of the species - -- representation — the conjugate representation for the barred fields, and the - -- adjoint action for the field strength. The gauge action on the algebra is - -- multiplicative. - repGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), - repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ - repGauge_H : ∀ (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ HiggsVec), - repGauge g (H l φ) = H l (HiggsVec.repGaugeGroupI.dual g φ) - repGauge_barH : ∀ (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), - repGauge g (barH l φ) = barH l (HiggsVec.repGaugeGroupI.conj.dual g φ) - repGauge_F : ∀ (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - repGauge g (F l μ ν φ) = F l μ ν ((GaugeAlgebra.adjointMap g⁻¹).dualMap φ) - repGauge_d : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet), - repGauge g (d i l φ) = d i l (DownSinglet.repGaugeGroupI.dual g φ) - repGauge_bard : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)), - repGauge g (bard i l φ) = bard i l (DownSinglet.repGaugeGroupI.conj.dual g φ) - repGauge_u : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet), - repGauge g (u i l φ) = u i l (UpSinglet.repGaugeGroupI.dual g φ) - repGauge_baru : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)), - repGauge g (baru i l φ) = baru i l (UpSinglet.repGaugeGroupI.conj.dual g φ) - repGauge_Q : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet), - repGauge g (Q i l φ) = Q i l (QuarkDoublet.repGaugeGroupI.dual g φ) - repGauge_barQ : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - repGauge g (barQ i l φ) = barQ i l (QuarkDoublet.repGaugeGroupI.conj.dual g φ) - repGauge_L : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet), - repGauge g (L i l φ) = L i l (LeptonDoublet.repGaugeGroupI.dual g φ) - repGauge_barL : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - repGauge g (barL i l φ) = barL i l (LeptonDoublet.repGaugeGroupI.conj.dual g φ) - repGauge_e : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet), - repGauge g (e i l φ) = e i l (LeptonSinglet.repGaugeGroupI.dual g φ) - repGauge_bare : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} - (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - repGauge g (bare i l φ) = bare i l (LeptonSinglet.repGaugeGroupI.conj.dual g φ) - -- *Lorentz transformation* - -- Every field together with its covariant derivatives transforms as a Lorentz - -- tensor: each covariant-derivative slot mixes by the Lorentz matrix (ordered - -- tuples, since covariant derivatives need not commute) and the value index by the - -- contragredient of the species' Lorentz representation — the conjugate - -- representation for the barred fields. The two covector indices of the field - -- strength are explicit, and each mixes by the Lorentz matrix. The Lorentz action - -- on the algebra is multiplicative. - repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), - repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ - repLorentz_H : IsLorentzCovDerivTransforms repLorentz - (Representation.trivial ℂ SL(2,ℂ) HiggsVec) H - repLorentz_barH : IsLorentzCovDerivTransforms repLorentz - (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj barH - repLorentz_F : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - repLorentz Λ (F l μ ν φ) = - ∑ p : Fin n → (Fin 1 ⊕ Fin 3), - (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • - ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • F p a b φ - repLorentz_d : ∀ i, IsLorentzCovDerivTransforms repLorentz - DownSinglet.repLorentzGroup (d i) - repLorentz_bard : ∀ i, IsLorentzCovDerivTransforms repLorentz - DownSinglet.repLorentzGroup.conj (bard i) - repLorentz_u : ∀ i, IsLorentzCovDerivTransforms repLorentz - UpSinglet.repLorentzGroup (u i) - repLorentz_baru : ∀ i, IsLorentzCovDerivTransforms repLorentz - UpSinglet.repLorentzGroup.conj (baru i) - repLorentz_Q : ∀ i, IsLorentzCovDerivTransforms repLorentz - QuarkDoublet.repLorentzGroup (Q i) - repLorentz_barQ : ∀ i, IsLorentzCovDerivTransforms repLorentz - QuarkDoublet.repLorentzGroup.conj (barQ i) - repLorentz_L : ∀ i, IsLorentzCovDerivTransforms repLorentz - LeptonDoublet.repLorentzGroup (L i) - repLorentz_barL : ∀ i, IsLorentzCovDerivTransforms repLorentz - LeptonDoublet.repLorentzGroup.conj (barL i) - repLorentz_e : ∀ i, IsLorentzCovDerivTransforms repLorentz - LeptonSinglet.repLorentzGroup (e i) - repLorentz_bare : ∀ i, IsLorentzCovDerivTransforms repLorentz - LeptonSinglet.repLorentzGroup.conj (bare i) - -- **Mass weights (= 2 * mass dimension)** - -- Every covariant tower is a `massWeightPoly`-eigenvector of pure monomial weight: - -- each covariant derivative adds one to the mass dimension, so the Higgs towers - -- have mass dimension `1 + n` (weight `2 * (1 + n)`), the field-strength towers - -- mass dimension `2 + n` (weight `2 * (2 + n)`), and the fermion towers mass - -- dimension `3/2 + n` (weight `3 + 2 * n`) - massWeight_H : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (H l φ) = Polynomial.monomial (2 * (1 + n)) (H l φ) - massWeight_barH : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (barH l φ) = Polynomial.monomial (2 * (1 + n)) (barH l φ) - massWeight_F : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) φ, - massWeightPoly (F l μ ν φ) = Polynomial.monomial (2 * (2 + n)) (F l μ ν φ) - massWeight_d : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (d i l φ) = Polynomial.monomial (3 + 2 * n) (d i l φ) - massWeight_bard : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (bard i l φ) = Polynomial.monomial (3 + 2 * n) (bard i l φ) - massWeight_u : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (u i l φ) = Polynomial.monomial (3 + 2 * n) (u i l φ) - massWeight_baru : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (baru i l φ) = Polynomial.monomial (3 + 2 * n) (baru i l φ) - massWeight_Q : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (Q i l φ) = Polynomial.monomial (3 + 2 * n) (Q i l φ) - massWeight_barQ : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (barQ i l φ) = Polynomial.monomial (3 + 2 * n) (barQ i l φ) - massWeight_L : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (L i l φ) = Polynomial.monomial (3 + 2 * n) (L i l φ) - massWeight_barL : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (barL i l φ) = Polynomial.monomial (3 + 2 * n) (barL i l φ) - massWeight_e : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (e i l φ) = Polynomial.monomial (3 + 2 * n) (e i l φ) - massWeight_bare : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, - massWeightPoly (bare i l φ) = Polynomial.monomial (3 + 2 * n) (bare i l φ) - -- **The commutation rules** - -- The gauge sector is bosonic: every field-strength tower commutes with every - -- field. - F_comm_F : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) - (μ' ν' : Fin 1 ⊕ Fin 3) (ψ' : Module.Dual ℝ GaugeAlgebra), - Commute (F l μ ν ψ) (F l' μ' ν' ψ') + isHiggsSector : IsHiggsSector B repGauge repGauge_mul repLorentz repLorentz_mul + (fun n l => H l) (fun n l => barH l) massWeightPoly + -- *The gauge sector* + -- The field strength with its covariant derivatives: gauge transformation through + -- the adjoint action, the Lorentz transformation of the towers with two explicit + -- covector indices, and the mass weights `2 * (2 + n)`. + isGaugeSector : IsGaugeSector B repGauge repGauge_mul repLorentz repLorentz_mul + F massWeightPoly + -- *The fermion sector* + -- The ten fermion families with their covariant derivatives: gauge transformation + -- through the dual of the species representations (conjugate for the barred + -- fields), the Lorentz transformation of the towers, and the mass weights + -- `3 + 2 * n`. + isFermionSector : IsFermionSector B repGauge repGauge_mul repLorentz repLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly + -- **The cross-sector commutation rules** + -- The within-sector rules live in the sector structures; across sectors, the + -- bosonic towers commute with everything. + -- The gauge sector is bosonic: every field-strength tower commutes with the Higgs + -- and fermion towers. F_comm_H : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ HiggsVec), @@ -236,19 +137,7 @@ structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ B] (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), Commute (F l μ ν ψ) (bare i l' φ) -- The Higgs sector is bosonic: the Higgs towers and their conjugates commute - -- with each other and with every fermion. - H_comm_H : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ HiggsVec) (l' : Fin m → Fin 1 ⊕ Fin 3) - (φ' : Module.Dual ℂ HiggsVec), - Commute (H l φ) (H l' φ') - H_comm_barH : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ HiggsVec) (l' : Fin m → Fin 1 ⊕ Fin 3) - (φ' : Module.Dual ℂ (ConjModule HiggsVec)), - Commute (H l φ) (barH l' φ') - barH_comm_barH : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule HiggsVec)) (l' : Fin m → Fin 1 ⊕ Fin 3) - (φ' : Module.Dual ℂ (ConjModule HiggsVec)), - Commute (barH l φ) (barH l' φ') + -- with every fermion. H_comm_d : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℂ DownSinglet), @@ -329,235 +218,16 @@ structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ B] (φ : Module.Dual ℂ (ConjModule HiggsVec)) (i : Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), Commute (barH l φ) (bare i l' φ') - -- The fermion sector: any two fermionic towers anticommute. On the diagonal - -- (same species, family, derivative slots and dual vector) this forces the - -- square of every fermionic symbol to vanish, since `2` is invertible in `B`. - d_anticomm_d : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ DownSinglet), - d i l φ * d j l' φ' = -(d j l' φ' * d i l φ) - d_anticomm_bard : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ (ConjModule DownSinglet)), - d i l φ * bard j l' φ' = -(bard j l' φ' * d i l φ) - d_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ UpSinglet), - d i l φ * u j l' φ' = -(u j l' φ' * d i l φ) - d_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ (ConjModule UpSinglet)), - d i l φ * baru j l' φ' = -(baru j l' φ' * d i l φ) - d_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ QuarkDoublet), - d i l φ * Q j l' φ' = -(Q j l' φ' * d i l φ) - d_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - d i l φ * barQ j l' φ' = -(barQ j l' φ' * d i l φ) - d_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ LeptonDoublet), - d i l φ * L j l' φ' = -(L j l' φ' * d i l φ) - d_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - d i l φ * barL j l' φ' = -(barL j l' φ' * d i l φ) - d_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ LeptonSinglet), - d i l φ * e j l' φ' = -(e j l' φ' * d i l φ) - d_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - d i l φ * bare j l' φ' = -(bare j l' φ' * d i l φ) - bard_anticomm_bard : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ (ConjModule DownSinglet)), - bard i l φ * bard j l' φ' = -(bard j l' φ' * bard i l φ) - bard_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ UpSinglet), - bard i l φ * u j l' φ' = -(u j l' φ' * bard i l φ) - bard_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ (ConjModule UpSinglet)), - bard i l φ * baru j l' φ' = -(baru j l' φ' * bard i l φ) - bard_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ QuarkDoublet), - bard i l φ * Q j l' φ' = -(Q j l' φ' * bard i l φ) - bard_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - bard i l φ * barQ j l' φ' = -(barQ j l' φ' * bard i l φ) - bard_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ LeptonDoublet), - bard i l φ * L j l' φ' = -(L j l' φ' * bard i l φ) - bard_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - bard i l φ * barL j l' φ' = -(barL j l' φ' * bard i l φ) - bard_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ LeptonSinglet), - bard i l φ * e j l' φ' = -(e j l' φ' * bard i l φ) - bard_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - bard i l φ * bare j l' φ' = -(bare j l' φ' * bard i l φ) - u_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ UpSinglet), - u i l φ * u j l' φ' = -(u j l' φ' * u i l φ) - u_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule UpSinglet)), - u i l φ * baru j l' φ' = -(baru j l' φ' * u i l φ) - u_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ QuarkDoublet), - u i l φ * Q j l' φ' = -(Q j l' φ' * u i l φ) - u_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - u i l φ * barQ j l' φ' = -(barQ j l' φ' * u i l φ) - u_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ LeptonDoublet), - u i l φ * L j l' φ' = -(L j l' φ' * u i l φ) - u_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - u i l φ * barL j l' φ' = -(barL j l' φ' * u i l φ) - u_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ LeptonSinglet), - u i l φ * e j l' φ' = -(e j l' φ' * u i l φ) - u_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - u i l φ * bare j l' φ' = -(bare j l' φ' * u i l φ) - baru_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) - (φ' : Module.Dual ℂ (ConjModule UpSinglet)), - baru i l φ * baru j l' φ' = -(baru j l' φ' * baru i l φ) - baru_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) - (φ' : Module.Dual ℂ QuarkDoublet), - baru i l φ * Q j l' φ' = -(Q j l' φ' * baru i l φ) - baru_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) - (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - baru i l φ * barQ j l' φ' = -(barQ j l' φ' * baru i l φ) - baru_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) - (φ' : Module.Dual ℂ LeptonDoublet), - baru i l φ * L j l' φ' = -(L j l' φ' * baru i l φ) - baru_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - baru i l φ * barL j l' φ' = -(barL j l' φ' * baru i l φ) - baru_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) - (φ' : Module.Dual ℂ LeptonSinglet), - baru i l φ * e j l' φ' = -(e j l' φ' * baru i l φ) - baru_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - baru i l φ * bare j l' φ' = -(bare j l' φ' * baru i l φ) - Q_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ QuarkDoublet), - Q i l φ * Q j l' φ' = -(Q j l' φ' * Q i l φ) - Q_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - Q i l φ * barQ j l' φ' = -(barQ j l' φ' * Q i l φ) - Q_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ LeptonDoublet), - Q i l φ * L j l' φ' = -(L j l' φ' * Q i l φ) - Q_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - Q i l φ * barL j l' φ' = -(barL j l' φ' * Q i l φ) - Q_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ LeptonSinglet), - Q i l φ * e j l' φ' = -(e j l' φ' * Q i l φ) - Q_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - Q i l φ * bare j l' φ' = -(bare j l' φ' * Q i l φ) - barQ_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) - (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - barQ i l φ * barQ j l' φ' = -(barQ j l' φ' * barQ i l φ) - barQ_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) - (φ' : Module.Dual ℂ LeptonDoublet), - barQ i l φ * L j l' φ' = -(L j l' φ' * barQ i l φ) - barQ_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - barQ i l φ * barL j l' φ' = -(barL j l' φ' * barQ i l φ) - barQ_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) - (φ' : Module.Dual ℂ LeptonSinglet), - barQ i l φ * e j l' φ' = -(e j l' φ' * barQ i l φ) - barQ_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - barQ i l φ * bare j l' φ' = -(bare j l' φ' * barQ i l φ) - L_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) - (φ' : Module.Dual ℂ LeptonDoublet), - L i l φ * L j l' φ' = -(L j l' φ' * L i l φ) - L_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - L i l φ * barL j l' φ' = -(barL j l' φ' * L i l φ) - L_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) - (φ' : Module.Dual ℂ LeptonSinglet), - L i l φ * e j l' φ' = -(e j l' φ' * L i l φ) - L_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - L i l φ * bare j l' φ' = -(bare j l' φ' * L i l φ) - barL_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - barL i l φ * barL j l' φ' = -(barL j l' φ' * barL i l φ) - barL_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) - (φ' : Module.Dual ℂ LeptonSinglet), - barL i l φ * e j l' φ' = -(e j l' φ' * barL i l φ) - barL_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - barL i l φ * bare j l' φ' = -(bare j l' φ' * barL i l φ) - e_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet) - (φ' : Module.Dual ℂ LeptonSinglet), - e i l φ * e j l' φ' = -(e j l' φ' * e i l φ) - e_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - e i l φ * bare j l' φ' = -(bare j l' φ' * e i l φ) - bare_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - bare i l φ * bare j l' φ' = -(bare j l' φ' * bare i l φ) namespace IsCovStandardModel variable {B : Type} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} {massWeightPoly : B →ₐ[ℂ] Polynomial B} {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} @@ -573,8 +243,22 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} - (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) + +/-- Gauge transformations act on `B` by algebra maps: dot-notation access to the + multiplicativity hypothesis of the structure. -/ +lemma repGauge_mul (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) : + ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ := hrepGauge_mul + +/-- Lorentz transformations act on `B` by algebra maps: dot-notation access to the + multiplicativity hypothesis of the structure. -/ +lemma repLorentz_mul (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) : + ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := hrepLorentz_mul /-! @@ -616,8 +300,8 @@ lemma repLorentz_one (Λ : SL(2,ℂ)) : repLorentz Λ (1 : B) = 1 := by /-- The algebra generated by all the covariant fields of the Standard Model: the covariant-derivative towers of the field strength, of the Higgs and its conjugate, and of the three families of each fermion species with their conjugates. -/ -def fieldAlgebra (_ : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) : Subalgebra ℂ B := +def fieldAlgebra (_ : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) : Subalgebra ℂ B := Algebra.adjoin ℂ ((⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), Set.range (F l μ ν)) ∪ @@ -643,7 +327,7 @@ lemma F_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} {μ intro z hz simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hz obtain ((⟨n', l', μ', ν', ψ, rfl⟩ | ⟨n', l', ⟨φ', rfl⟩ | ⟨φ', rfl⟩⟩) | ⟨i, n', l', hz⟩) := hz - · exact (h.F_comm_F l μ ν φ l' μ' ν' ψ).symm + · exact (h.isGaugeSector.F_comm_F l μ ν φ l' μ' ν' ψ).symm · exact (h.F_comm_H l μ ν φ l' φ').symm · exact (h.F_comm_barH l μ ν φ l' φ').symm · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | @@ -668,8 +352,8 @@ lemma H_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hz obtain ((⟨n', l', μ', ν', ψ, rfl⟩ | ⟨n', l', ⟨φ', rfl⟩ | ⟨φ', rfl⟩⟩) | ⟨i, n', l', hz⟩) := hz · exact h.F_comm_H l' μ' ν' ψ l φ - · exact h.H_comm_H l' φ' l φ - · exact (h.H_comm_barH l φ l' φ').symm + · exact h.isHiggsSector.H_comm_H φ' φ _ _ l' l + · exact (h.isHiggsSector.H_comm_barH φ φ' _ _ l l').symm · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz · exact (h.H_comm_d l φ i l' φ').symm @@ -692,8 +376,8 @@ lemma barH_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hz obtain ((⟨n', l', μ', ν', ψ, rfl⟩ | ⟨n', l', ⟨φ', rfl⟩ | ⟨φ', rfl⟩⟩) | ⟨i, n', l', hz⟩) := hz · exact h.F_comm_barH l' μ' ν' ψ l φ - · exact h.H_comm_barH l' φ' l φ - · exact h.barH_comm_barH l' φ' l φ + · exact h.isHiggsSector.H_comm_barH φ' φ _ _ l' l + · exact h.isHiggsSector.barH_comm_barH φ' φ _ _ l' l · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz · exact (h.barH_comm_d l φ i l' φ').symm diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean new file mode 100644 index 000000000..e69de29bb diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean index 82f2d5331..6cb963c38 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean @@ -32,7 +32,11 @@ namespace IsCovStandardModel variable {B : Type} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} {massWeightPoly : B →ₐ[ℂ] Polynomial B} {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} @@ -48,8 +52,8 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} - (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) /-! @@ -165,8 +169,8 @@ set_option linter.unusedVariables false in /-- The value in `B` of a covariant generator: the corresponding covariant tower applied to the indicated dual basis vector of its value space. -/ noncomputable def generatorVal - (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) : Generators → B + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) : Generators → B | .H _ l j => H l (HiggsVec.orthonormBasis.toBasis.coord j) | .barH _ l j => barH l (HiggsVec.orthonormBasis.toBasis.conj.coord j) | .F _ l μ ν j => F l μ ν (GaugeAlgebra.stdBasis.coord j) @@ -185,19 +189,19 @@ noncomputable def generatorVal lemma massWeightPoly_generatorVal (g : Generators) : massWeightPoly (h.generatorVal g) = Polynomial.monomial g.weight (h.generatorVal g) := by cases g with - | H n l j => exact h.massWeight_H l _ - | barH n l j => exact h.massWeight_barH l _ - | F n l μ ν j => exact h.massWeight_F l μ ν _ - | d i n l j => exact h.massWeight_d i l _ - | bard i n l j => exact h.massWeight_bard i l _ - | u i n l j => exact h.massWeight_u i l _ - | baru i n l j => exact h.massWeight_baru i l _ - | Q i n l j => exact h.massWeight_Q i l _ - | barQ i n l j => exact h.massWeight_barQ i l _ - | L i n l j => exact h.massWeight_L i l _ - | barL i n l j => exact h.massWeight_barL i l _ - | e i n l j => exact h.massWeight_e i l _ - | bare i n l j => exact h.massWeight_bare i l _ + | H n l j => exact h.isHiggsSector.H_massWeight _ n l + | barH n l j => exact h.isHiggsSector.barH_massWeight _ n l + | F n l μ ν j => exact h.isGaugeSector.massWeight_F l μ ν _ + | d i n l j => exact h.isFermionSector.massWeight_d i l _ + | bard i n l j => exact h.isFermionSector.massWeight_bard i l _ + | u i n l j => exact h.isFermionSector.massWeight_u i l _ + | baru i n l j => exact h.isFermionSector.massWeight_baru i l _ + | Q i n l j => exact h.isFermionSector.massWeight_Q i l _ + | barQ i n l j => exact h.isFermionSector.massWeight_barQ i l _ + | L i n l j => exact h.isFermionSector.massWeight_L i l _ + | barL i n l j => exact h.isFermionSector.massWeight_barL i l _ + | e i n l j => exact h.isFermionSector.massWeight_e i l _ + | bare i n l j => exact h.isFermionSector.massWeight_bare i l _ lemma generatorVal_mem_fieldAlgebra (g : Generators) : h.generatorVal g ∈ h.fieldAlgebra := by @@ -380,7 +384,7 @@ lemma commute_F_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : cases g with | H n' l' j => exact h.F_comm_H l μ ν ψ l' _ | barH n' l' j => exact h.F_comm_barH l μ ν ψ l' _ - | F n' l' μ' ν' j => exact h.F_comm_F l μ ν ψ l' μ' ν' _ + | F n' l' μ' ν' j => exact h.isGaugeSector.F_comm_F l μ ν ψ l' μ' ν' _ | d i n' l' j => exact h.F_comm_d l μ ν ψ i l' _ | bard i n' l' j => exact h.F_comm_bard l μ ν ψ i l' _ | u i n' l' j => exact h.F_comm_u l μ ν ψ i l' _ @@ -397,8 +401,8 @@ lemma commute_H_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ HiggsVec) (g : Generators) : Commute (H l φ) (h.generatorVal g) := by cases g with - | H n' l' j => exact h.H_comm_H l φ l' _ - | barH n' l' j => exact h.H_comm_barH l φ l' _ + | H n' l' j => exact h.isHiggsSector.H_comm_H φ _ _ _ l l' + | barH n' l' j => exact h.isHiggsSector.H_comm_barH φ _ _ _ l l' | F n' l' μ' ν' j => exact (h.F_comm_H l' μ' ν' _ l φ).symm | d i n' l' j => exact h.H_comm_d l φ i l' _ | bard i n' l' j => exact h.H_comm_bard l φ i l' _ @@ -417,8 +421,8 @@ lemma commute_barH_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (g : Generators) : Commute (barH l φ) (h.generatorVal g) := by cases g with - | H n' l' j => exact (h.H_comm_barH l' _ l φ).symm - | barH n' l' j => exact h.barH_comm_barH l φ l' _ + | H n' l' j => exact (h.isHiggsSector.H_comm_barH _ φ _ _ l' l).symm + | barH n' l' j => exact h.isHiggsSector.barH_comm_barH φ _ _ _ l l' | F n' l' μ' ν' j => exact (h.F_comm_barH l' μ' ν' _ l φ).symm | d i n' l' j => exact h.barH_comm_d l φ i l' _ | bard i n' l' j => exact h.barH_comm_bard l φ i l' _ @@ -467,34 +471,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_d i i' l l' _ _ + exact h.isFermionSector.d_anticomm_d i i' l l' _ _ | bard i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_bard i i' l l' _ _ + exact h.isFermionSector.d_anticomm_bard i i' l l' _ _ | u i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_u i i' l l' _ _ + exact h.isFermionSector.d_anticomm_u i i' l l' _ _ | baru i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_baru i i' l l' _ _ + exact h.isFermionSector.d_anticomm_baru i i' l l' _ _ | Q i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_Q i i' l l' _ _ + exact h.isFermionSector.d_anticomm_Q i i' l l' _ _ | barQ i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_barQ i i' l l' _ _ + exact h.isFermionSector.d_anticomm_barQ i i' l l' _ _ | L i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_L i i' l l' _ _ + exact h.isFermionSector.d_anticomm_L i i' l l' _ _ | barL i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.d_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_e i i' l l' _ _ + exact h.isFermionSector.d_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.d_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.d_anticomm_bare i i' l l' _ _ | bard i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -502,34 +506,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_bard i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_bard i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_bard i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_bard i i' l l' _ _ | u i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_u i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_u i i' l l' _ _ | baru i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_baru i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_baru i i' l l' _ _ | Q i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_Q i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_Q i i' l l' _ _ | barQ i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_barQ i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_barQ i i' l l' _ _ | L i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_L i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_L i i' l l' _ _ | barL i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_e i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.bard_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.bard_anticomm_bare i i' l l' _ _ | u i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -537,34 +541,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_u i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_u i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_u i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_u i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_u i i' l l' _ _ + exact h.isFermionSector.u_anticomm_u i i' l l' _ _ | baru i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_baru i i' l l' _ _ + exact h.isFermionSector.u_anticomm_baru i i' l l' _ _ | Q i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_Q i i' l l' _ _ + exact h.isFermionSector.u_anticomm_Q i i' l l' _ _ | barQ i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_barQ i i' l l' _ _ + exact h.isFermionSector.u_anticomm_barQ i i' l l' _ _ | L i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_L i i' l l' _ _ + exact h.isFermionSector.u_anticomm_L i i' l l' _ _ | barL i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.u_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_e i i' l l' _ _ + exact h.isFermionSector.u_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.u_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.u_anticomm_bare i i' l l' _ _ | baru i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -572,34 +576,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_baru i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_baru i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_baru i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_baru i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - rw [h.u_anticomm_baru i' i l' l, neg_neg] + rw [h.isFermionSector.u_anticomm_baru i' i l' l, neg_neg] | baru i' n' l' j' => simp only [generatorVal] - exact h.baru_anticomm_baru i i' l l' _ _ + exact h.isFermionSector.baru_anticomm_baru i i' l l' _ _ | Q i' n' l' j' => simp only [generatorVal] - exact h.baru_anticomm_Q i i' l l' _ _ + exact h.isFermionSector.baru_anticomm_Q i i' l l' _ _ | barQ i' n' l' j' => simp only [generatorVal] - exact h.baru_anticomm_barQ i i' l l' _ _ + exact h.isFermionSector.baru_anticomm_barQ i i' l l' _ _ | L i' n' l' j' => simp only [generatorVal] - exact h.baru_anticomm_L i i' l l' _ _ + exact h.isFermionSector.baru_anticomm_L i i' l l' _ _ | barL i' n' l' j' => simp only [generatorVal] - exact h.baru_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.baru_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.baru_anticomm_e i i' l l' _ _ + exact h.isFermionSector.baru_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.baru_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.baru_anticomm_bare i i' l l' _ _ | Q i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -607,34 +611,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_Q i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_Q i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_Q i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_Q i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - rw [h.u_anticomm_Q i' i l' l, neg_neg] + rw [h.isFermionSector.u_anticomm_Q i' i l' l, neg_neg] | baru i' n' l' j' => simp only [generatorVal] - rw [h.baru_anticomm_Q i' i l' l, neg_neg] + rw [h.isFermionSector.baru_anticomm_Q i' i l' l, neg_neg] | Q i' n' l' j' => simp only [generatorVal] - exact h.Q_anticomm_Q i i' l l' _ _ + exact h.isFermionSector.Q_anticomm_Q i i' l l' _ _ | barQ i' n' l' j' => simp only [generatorVal] - exact h.Q_anticomm_barQ i i' l l' _ _ + exact h.isFermionSector.Q_anticomm_barQ i i' l l' _ _ | L i' n' l' j' => simp only [generatorVal] - exact h.Q_anticomm_L i i' l l' _ _ + exact h.isFermionSector.Q_anticomm_L i i' l l' _ _ | barL i' n' l' j' => simp only [generatorVal] - exact h.Q_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.Q_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.Q_anticomm_e i i' l l' _ _ + exact h.isFermionSector.Q_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.Q_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.Q_anticomm_bare i i' l l' _ _ | barQ i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -642,34 +646,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_barQ i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_barQ i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_barQ i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_barQ i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - rw [h.u_anticomm_barQ i' i l' l, neg_neg] + rw [h.isFermionSector.u_anticomm_barQ i' i l' l, neg_neg] | baru i' n' l' j' => simp only [generatorVal] - rw [h.baru_anticomm_barQ i' i l' l, neg_neg] + rw [h.isFermionSector.baru_anticomm_barQ i' i l' l, neg_neg] | Q i' n' l' j' => simp only [generatorVal] - rw [h.Q_anticomm_barQ i' i l' l, neg_neg] + rw [h.isFermionSector.Q_anticomm_barQ i' i l' l, neg_neg] | barQ i' n' l' j' => simp only [generatorVal] - exact h.barQ_anticomm_barQ i i' l l' _ _ + exact h.isFermionSector.barQ_anticomm_barQ i i' l l' _ _ | L i' n' l' j' => simp only [generatorVal] - exact h.barQ_anticomm_L i i' l l' _ _ + exact h.isFermionSector.barQ_anticomm_L i i' l l' _ _ | barL i' n' l' j' => simp only [generatorVal] - exact h.barQ_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.barQ_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.barQ_anticomm_e i i' l l' _ _ + exact h.isFermionSector.barQ_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.barQ_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.barQ_anticomm_bare i i' l l' _ _ | L i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -677,34 +681,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_L i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_L i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_L i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_L i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - rw [h.u_anticomm_L i' i l' l, neg_neg] + rw [h.isFermionSector.u_anticomm_L i' i l' l, neg_neg] | baru i' n' l' j' => simp only [generatorVal] - rw [h.baru_anticomm_L i' i l' l, neg_neg] + rw [h.isFermionSector.baru_anticomm_L i' i l' l, neg_neg] | Q i' n' l' j' => simp only [generatorVal] - rw [h.Q_anticomm_L i' i l' l, neg_neg] + rw [h.isFermionSector.Q_anticomm_L i' i l' l, neg_neg] | barQ i' n' l' j' => simp only [generatorVal] - rw [h.barQ_anticomm_L i' i l' l, neg_neg] + rw [h.isFermionSector.barQ_anticomm_L i' i l' l, neg_neg] | L i' n' l' j' => simp only [generatorVal] - exact h.L_anticomm_L i i' l l' _ _ + exact h.isFermionSector.L_anticomm_L i i' l l' _ _ | barL i' n' l' j' => simp only [generatorVal] - exact h.L_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.L_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.L_anticomm_e i i' l l' _ _ + exact h.isFermionSector.L_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.L_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.L_anticomm_bare i i' l l' _ _ | barL i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -712,34 +716,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_barL i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_barL i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_barL i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_barL i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - rw [h.u_anticomm_barL i' i l' l, neg_neg] + rw [h.isFermionSector.u_anticomm_barL i' i l' l, neg_neg] | baru i' n' l' j' => simp only [generatorVal] - rw [h.baru_anticomm_barL i' i l' l, neg_neg] + rw [h.isFermionSector.baru_anticomm_barL i' i l' l, neg_neg] | Q i' n' l' j' => simp only [generatorVal] - rw [h.Q_anticomm_barL i' i l' l, neg_neg] + rw [h.isFermionSector.Q_anticomm_barL i' i l' l, neg_neg] | barQ i' n' l' j' => simp only [generatorVal] - rw [h.barQ_anticomm_barL i' i l' l, neg_neg] + rw [h.isFermionSector.barQ_anticomm_barL i' i l' l, neg_neg] | L i' n' l' j' => simp only [generatorVal] - rw [h.L_anticomm_barL i' i l' l, neg_neg] + rw [h.isFermionSector.L_anticomm_barL i' i l' l, neg_neg] | barL i' n' l' j' => simp only [generatorVal] - exact h.barL_anticomm_barL i i' l l' _ _ + exact h.isFermionSector.barL_anticomm_barL i i' l l' _ _ | e i' n' l' j' => simp only [generatorVal] - exact h.barL_anticomm_e i i' l l' _ _ + exact h.isFermionSector.barL_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.barL_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.barL_anticomm_bare i i' l l' _ _ | e i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -747,34 +751,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_e i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_e i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - rw [h.u_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.u_anticomm_e i' i l' l, neg_neg] | baru i' n' l' j' => simp only [generatorVal] - rw [h.baru_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.baru_anticomm_e i' i l' l, neg_neg] | Q i' n' l' j' => simp only [generatorVal] - rw [h.Q_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.Q_anticomm_e i' i l' l, neg_neg] | barQ i' n' l' j' => simp only [generatorVal] - rw [h.barQ_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.barQ_anticomm_e i' i l' l, neg_neg] | L i' n' l' j' => simp only [generatorVal] - rw [h.L_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.L_anticomm_e i' i l' l, neg_neg] | barL i' n' l' j' => simp only [generatorVal] - rw [h.barL_anticomm_e i' i l' l, neg_neg] + rw [h.isFermionSector.barL_anticomm_e i' i l' l, neg_neg] | e i' n' l' j' => simp only [generatorVal] - exact h.e_anticomm_e i i' l l' _ _ + exact h.isFermionSector.e_anticomm_e i i' l l' _ _ | bare i' n' l' j' => simp only [generatorVal] - exact h.e_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.e_anticomm_bare i i' l l' _ _ | bare i n l j => cases g' with | H n' l' j' => exact absurd hg' (by simp only [Generators.weight]; omega) @@ -782,34 +786,34 @@ lemma generatorVal_anticomm_of_odd_of_odd {g g' : Generators} | F n' l' μ' ν' j' => exact absurd hg' (by simp only [Generators.weight]; omega) | d i' n' l' j' => simp only [generatorVal] - rw [h.d_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.d_anticomm_bare i' i l' l, neg_neg] | bard i' n' l' j' => simp only [generatorVal] - rw [h.bard_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.bard_anticomm_bare i' i l' l, neg_neg] | u i' n' l' j' => simp only [generatorVal] - rw [h.u_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.u_anticomm_bare i' i l' l, neg_neg] | baru i' n' l' j' => simp only [generatorVal] - rw [h.baru_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.baru_anticomm_bare i' i l' l, neg_neg] | Q i' n' l' j' => simp only [generatorVal] - rw [h.Q_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.Q_anticomm_bare i' i l' l, neg_neg] | barQ i' n' l' j' => simp only [generatorVal] - rw [h.barQ_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.barQ_anticomm_bare i' i l' l, neg_neg] | L i' n' l' j' => simp only [generatorVal] - rw [h.L_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.L_anticomm_bare i' i l' l, neg_neg] | barL i' n' l' j' => simp only [generatorVal] - rw [h.barL_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.barL_anticomm_bare i' i l' l, neg_neg] | e i' n' l' j' => simp only [generatorVal] - rw [h.e_anticomm_bare i' i l' l, neg_neg] + rw [h.isFermionSector.e_anticomm_bare i' i l' l, neg_neg] | bare i' n' l' j' => simp only [generatorVal] - exact h.bare_anticomm_bare i i' l l' _ _ + exact h.isFermionSector.bare_anticomm_bare i i' l l' _ _ /-- Two covariant generators exchange up to the sign determined by their mass weights: the weight is odd exactly on the fermionic generators, so the sign is @@ -878,449 +882,6 @@ lemma list_prod_mul_list_prod (gl gl' : List Generators) : = (g.weight + (t.map Generators.weight).sum) * (gl'.map Generators.weight).sum from by ring] - -/-! - -## The different sectors of the Standard Model - -Each covariant generator belongs to one of three classes — gauge, Higgs or fermion — -and a word in the generators realises a set of classes. The sector of a class set `S` -is spanned by the words realising exactly `S`. It contains no non-zero scalar, since -the empty word realises no class at all, and it is closed under multiplication because -`S ∪ S = S`: it is a non-unital subalgebra. The seven non-empty class sets give the -seven sectors below. - --/ - -/-- The three classes of covariant generator. -/ -inductive GeneratorClass where - /-- The gauge class: the field-strength towers. -/ - | gauge : GeneratorClass - /-- The Higgs class: the Higgs towers and their conjugates. -/ - | higgs : GeneratorClass - /-- The fermion class: the fermion towers and their conjugates. -/ - | fermion : GeneratorClass -deriving DecidableEq - -/-- The class of a covariant generator. -/ -def Generators.kind : Generators → GeneratorClass - | .F _ _ _ _ _ => .gauge - | .H _ _ _ => .higgs - | .barH _ _ _ => .higgs - | _ => .fermion - -@[simp] -lemma Generators.isGaugeField_iff_kind (g : Generators) : - g.IsGaugeField ↔ g.kind = .gauge := by - cases g <;> simp [Generators.IsGaugeField, Generators.kind] - -@[simp] -lemma Generators.isHiggs_iff_kind (g : Generators) : g.IsHiggs ↔ g.kind = .higgs := by - cases g <;> simp [Generators.IsHiggs, Generators.kind] - -@[simp] -lemma Generators.isFermionic_iff_kind (g : Generators) : - g.IsFermionic ↔ g.kind = .fermion := by - cases g <;> simp [Generators.IsFermionic, Generators.kind] - -/-- The classes realised by a word in the covariant generators. -/ -def wordClasses (gl : List Generators) : Finset GeneratorClass := - (gl.map Generators.kind).toFinset - -@[simp] -lemma wordClasses_nil : wordClasses [] = ∅ := by simp [wordClasses] - -/-- Concatenating words unions the classes they realise. -/ -lemma wordClasses_append (gl gl' : List Generators) : - wordClasses (gl ++ gl') = wordClasses gl ∪ wordClasses gl' := by - rw [wordClasses, wordClasses, wordClasses, List.map_append, List.toFinset_append] - -/-- Prepending a generator inserts its class. -/ -lemma wordClasses_cons (a : Generators) (gl : List Generators) : - wordClasses (a :: gl) = insert a.kind (wordClasses gl) := by - rw [wordClasses, wordClasses, List.map_cons, List.toFinset_cons] - -/-- The span of the words in the covariant generators realising exactly the classes - `S`. -/ -def sectorSubmodule (S : Finset GeneratorClass) : Submodule ℂ B := - Submodule.span ℂ - {x | ∃ gl : List Generators, wordClasses gl = S ∧ (gl.map h.generatorVal).prod = x} - -/-- Multiplication carries the class spans of `S` and `T` into that of `S ∪ T`. -/ -lemma mul_mem_sectorSubmodule {S T : Finset GeneratorClass} {x y : B} - (hx : x ∈ h.sectorSubmodule S) (hy : y ∈ h.sectorSubmodule T) : - x * y ∈ h.sectorSubmodule (S ∪ T) := by - induction hx using Submodule.span_induction with - | mem x hxw => - obtain ⟨gl, hgl, rfl⟩ := hxw - induction hy using Submodule.span_induction with - | mem y hyw => - obtain ⟨gl', hgl', rfl⟩ := hyw - refine Submodule.subset_span ⟨gl ++ gl', ?_, ?_⟩ - · rw [wordClasses_append, hgl, hgl'] - · rw [List.map_append, List.prod_append] - | zero => rw [mul_zero]; exact Submodule.zero_mem _ - | add a b ha hb iha ihb => rw [mul_add]; exact Submodule.add_mem _ iha ihb - | smul c a ha iha => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ iha - | zero => rw [zero_mul]; exact Submodule.zero_mem _ - | add a b ha hb iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb - | smul c a ha iha => rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ iha - -/-- The sector realising exactly the classes `S`: the span of the words whose - generators realise `S`. It is a non-unital subalgebra — closed under multiplication - since `S ∪ S = S`, but containing no non-zero scalar, since the empty word realises - no class. -/ -def sector (S : Finset GeneratorClass) : NonUnitalSubalgebra ℂ B := - (h.sectorSubmodule S).toNonUnitalSubalgebra fun x y hx hy => by - have hxy := h.mul_mem_sectorSubmodule hx hy - rwa [Finset.union_self] at hxy - -@[simp] -lemma mem_sector {S : Finset GeneratorClass} {x : B} : - x ∈ h.sector S ↔ x ∈ h.sectorSubmodule S := Iff.rfl - -/-- A word lies in the sector of the classes it realises. -/ -lemma list_prod_mem_sector (gl : List Generators) : - (gl.map h.generatorVal).prod ∈ h.sector (wordClasses gl) := - Submodule.subset_span ⟨gl, rfl, rfl⟩ - -/-- Multiplication carries the sectors of `S` and `T` into the sector of `S ∪ T`. -/ -lemma mul_mem_sector {S T : Finset GeneratorClass} {x y : B} - (hx : x ∈ h.sector S) (hy : y ∈ h.sector T) : x * y ∈ h.sector (S ∪ T) := - h.mul_mem_sectorSubmodule hx hy - -/-- Every sector sits inside the field algebra. -/ -lemma mem_fieldAlgebra_of_mem_sector {S : Finset GeneratorClass} {x : B} - (hx : x ∈ h.sector S) : x ∈ h.fieldAlgebra := by - rw [mem_sector, sectorSubmodule] at hx - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨gl, -, rfl⟩ := hy - refine Subalgebra.list_prod_mem _ fun z hz => ?_ - obtain ⟨g, -, rfl⟩ := List.mem_map.mp hz - exact h.generatorVal_mem_fieldAlgebra g - | zero => exact Subalgebra.zero_mem _ - | add a b ha hb iha ihb => exact Subalgebra.add_mem _ iha ihb - | smul c a ha iha => exact Subalgebra.smul_mem _ iha c - -/-- **The sectors exhaust the field algebra**: every element of the field algebra is a - sum of elements of the sectors, since every word realises exactly one class set. The - unit is supplied by `sector ∅`, the sector of the empty word, so the join is the - whole of `fieldAlgebra` — read as a non-unital subalgebra, the two sides having - otherwise different types. -/ -lemma fieldAlgebra_eq_iSup_sector : - h.fieldAlgebra.toNonUnitalSubalgebra = ⨆ S : Finset GeneratorClass, h.sector S := by - refine le_antisymm ?_ (iSup_le fun S => ?_) - · intro x hx - rw [Subalgebra.mem_toNonUnitalSubalgebra, h.fieldAlgebra_eq_adjoin_range, - ← Subalgebra.mem_toSubmodule, Algebra.adjoin_eq_span] at hx - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨l₀, hl₀, rfl⟩ := Submonoid.exists_list_of_mem_closure hy - obtain ⟨gl, rfl⟩ := h.exists_list_map_eq l₀ hl₀ - exact le_iSup (fun S : Finset GeneratorClass => h.sector S) (wordClasses gl) - (h.list_prod_mem_sector gl) - | zero => exact zero_mem _ - | add a b ha hb iha ihb => exact add_mem iha ihb - | smul c a ha iha => exact SMulMemClass.smul_mem c iha - · intro x hx - exact Subalgebra.mem_toNonUnitalSubalgebra.mpr (h.mem_fieldAlgebra_of_mem_sector hx) - - -/-! - -### The sectors are preserved by the gauge and Lorentz actions - -Both actions carry a covariant tower into combinations of towers of the same -species, hence each generator into the sector of its own class, hence — word by -word — each sector into itself. - --/ - -/-- Any Higgs tower symbol lies in the Higgs sector. -/ -lemma H_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ HiggsVec) : H l φ ∈ h.sector {GeneratorClass.higgs} := by - rw [← HiggsVec.orthonormBasis.toBasis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.H n l j] - -/-- Any conjugate-Higgs tower symbol lies in the Higgs sector. -/ -lemma barH_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule HiggsVec)) : - barH l φ ∈ h.sector {GeneratorClass.higgs} := by - rw [← HiggsVec.orthonormBasis.toBasis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.barH n l j] - -/-- Any field-strength tower symbol lies in the gauge sector. -/ -lemma F_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : F l μ ν φ ∈ h.sector {GeneratorClass.gauge} := by - rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => ?_ - rw [← algebraMap_smul ℂ (φ (GaugeAlgebra.stdBasis j))] - refine SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.F n l μ ν j] - -/-- Any `d` tower symbol lies in the fermion sector. -/ -lemma d_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ DownSinglet) : d i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← DownSinglet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.d i n l j] - -/-- Any `bard` tower symbol lies in the fermion sector. -/ -lemma bard_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) : bard i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← DownSinglet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.bard i n l j] - -/-- Any `u` tower symbol lies in the fermion sector. -/ -lemma u_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ UpSinglet) : u i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← UpSinglet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.u i n l j] - -/-- Any `baru` tower symbol lies in the fermion sector. -/ -lemma baru_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) : baru i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← UpSinglet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.baru i n l j] - -/-- Any `Q` tower symbol lies in the fermion sector. -/ -lemma Q_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ QuarkDoublet) : Q i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← QuarkDoublet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.Q i n l j] - -/-- Any `barQ` tower symbol lies in the fermion sector. -/ -lemma barQ_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : barQ i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← QuarkDoublet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.barQ i n l j] - -/-- Any `L` tower symbol lies in the fermion sector. -/ -lemma L_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ LeptonDoublet) : L i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← LeptonDoublet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.L i n l j] - -/-- Any `barL` tower symbol lies in the fermion sector. -/ -lemma barL_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : barL i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← LeptonDoublet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.barL i n l j] - -/-- Any `e` tower symbol lies in the fermion sector. -/ -lemma e_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ LeptonSinglet) : e i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← LeptonSinglet.basis.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.e i n l j] - -/-- Any `bare` tower symbol lies in the fermion sector. -/ -lemma bare_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : bare i l φ ∈ h.sector {GeneratorClass.fermion} := by - rw [← LeptonSinglet.basis.conj.sum_dual_apply_smul_coord φ] - simp only [map_sum, map_smul] - refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ - simpa [generatorVal, wordClasses, Generators.kind] using - h.list_prod_mem_sector [Generators.bare i n l j] - -/-- The gauge action carries a covariant generator into the sector of its class. -/ -lemma repGauge_generatorVal_mem_sector (g : GaugeGroupI) (a : Generators) : - repGauge g (h.generatorVal a) ∈ h.sector {a.kind} := by - cases a with - | H n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_H g l _] - exact h.H_mem_sector l _ - | barH n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_barH g l _] - exact h.barH_mem_sector l _ - | F n l μ ν j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_F g l μ ν _] - exact h.F_mem_sector l μ ν _ - | d i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_d g i l _] - exact h.d_mem_sector i l _ - | bard i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_bard g i l _] - exact h.bard_mem_sector i l _ - | u i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_u g i l _] - exact h.u_mem_sector i l _ - | baru i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_baru g i l _] - exact h.baru_mem_sector i l _ - | Q i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_Q g i l _] - exact h.Q_mem_sector i l _ - | barQ i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_barQ g i l _] - exact h.barQ_mem_sector i l _ - | L i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_L g i l _] - exact h.L_mem_sector i l _ - | barL i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_barL g i l _] - exact h.barL_mem_sector i l _ - | e i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_e g i l _] - exact h.e_mem_sector i l _ - | bare i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repGauge_bare g i l _] - exact h.bare_mem_sector i l _ - -/-- The Lorentz action carries a covariant generator into the sector of its - class. -/ -lemma repLorentz_generatorVal_mem_sector (Λ : SL(2,ℂ)) (a : Generators) : - repLorentz Λ (h.generatorVal a) ∈ h.sector {a.kind} := by - cases a with - | H n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_H Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.H_mem_sector p _) - | barH n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_barH Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barH_mem_sector p _) - | F n l μ ν j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_F Λ n l μ ν _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ - (sum_mem fun a _ => SMulMemClass.smul_mem _ - (sum_mem fun b _ => SMulMemClass.smul_mem _ (h.F_mem_sector p a b _))) - | d i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_d i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.d_mem_sector i p _) - | bard i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_bard i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.bard_mem_sector i p _) - | u i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_u i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.u_mem_sector i p _) - | baru i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_baru i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.baru_mem_sector i p _) - | Q i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_Q i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.Q_mem_sector i p _) - | barQ i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_barQ i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barQ_mem_sector i p _) - | L i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_L i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.L_mem_sector i p _) - | barL i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_barL i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barL_mem_sector i p _) - | e i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_e i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.e_mem_sector i p _) - | bare i n l j => - simp only [generatorVal, Generators.kind] - rw [h.repLorentz_bare i Λ n l _] - exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.bare_mem_sector i p _) - -/-- The action `repGauge` preserves every sector. -/ -lemma repGauge_mem_sector {S : Finset GeneratorClass} {x : B} (g : GaugeGroupI) - (hx : x ∈ h.sector S) : repGauge g x ∈ h.sector S := by - rw [mem_sector, sectorSubmodule] at hx - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨gl, hgl, rfl⟩ := hy - subst hgl - induction gl with - | nil => - simp only [List.map_nil, List.prod_nil] - rw [h.repGauge_one g] - simpa using h.list_prod_mem_sector ([] : List Generators) - | cons a t ih => - simp only [List.map_cons, List.prod_cons] - rw [h.repGauge_mul g, wordClasses_cons, ← Finset.singleton_union] - exact h.mul_mem_sector (h.repGauge_generatorVal_mem_sector g a) ih - | zero => rw [map_zero]; exact zero_mem _ - | add a b ha hb iha ihb => rw [map_add]; exact add_mem iha ihb - | smul c a ha iha => rw [map_smul]; exact SMulMemClass.smul_mem _ iha - -/-- The action `repLorentz` preserves every sector. -/ -lemma repLorentz_mem_sector {S : Finset GeneratorClass} {x : B} (Λ : SL(2,ℂ)) - (hx : x ∈ h.sector S) : repLorentz Λ x ∈ h.sector S := by - rw [mem_sector, sectorSubmodule] at hx - induction hx using Submodule.span_induction with - | mem y hy => - obtain ⟨gl, hgl, rfl⟩ := hy - subst hgl - induction gl with - | nil => - simp only [List.map_nil, List.prod_nil] - rw [h.repLorentz_one Λ] - simpa using h.list_prod_mem_sector ([] : List Generators) - | cons a t ih => - simp only [List.map_cons, List.prod_cons] - rw [h.repLorentz_mul Λ, wordClasses_cons, ← Finset.singleton_union] - exact h.mul_mem_sector (h.repLorentz_generatorVal_mem_sector Λ a) ih - | zero => rw [map_zero]; exact zero_mem _ - | add a b ha hb iha ihb => rw [map_add]; exact add_mem iha ihb - | smul c a ha iha => rw [map_smul]; exact SMulMemClass.smul_mem _ iha - -/-! - -### Decomposition lemma - --/ end IsCovStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean index 713416bc3..ddf77b9f7 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean @@ -29,7 +29,11 @@ namespace IsCovStandardModel variable {B : Type} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} {massWeightPoly : B →ₐ[ℂ] Polynomial B} {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} @@ -45,8 +49,8 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} - (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) /-! @@ -60,8 +64,8 @@ variable {B : Type} [Ring B] [Algebra ℂ B] the algebra generated by the covariant fields with the part on which `massWeightPoly` is the monomial `X ^ n`. -/ noncomputable def massWeightSubmodule - (h : IsCovStandardModel B repGauge repLorentz massWeightPoly H barH F - d bard u baru Q barQ L barL e bare) (n : ℕ) : Submodule ℂ B := + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) (n : ℕ) : Submodule ℂ B := (h.fieldAlgebra).toSubmodule ⊓ LinearMap.ker (massWeightPoly.toLinearMap - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) @@ -348,55 +352,55 @@ lemma repGauge_generatorVal_mem (g : GaugeGroupI) (a : Generators) : cases a with | H n l j => simp only [generatorVal] - rw [h.repGauge_H g l _] + rw [h.isHiggsSector.H_equivariant g _ n l] exact h.H_mem_massWeightSubmodule l _ | barH n l j => simp only [generatorVal] - rw [h.repGauge_barH g l _] + rw [h.isHiggsSector.barH_equivariant g _ n l] exact h.barH_mem_massWeightSubmodule l _ | F n l μ ν j => simp only [generatorVal] - rw [h.repGauge_F g l μ ν _] + rw [h.isGaugeSector.repGauge_F g l μ ν _] exact h.F_mem_massWeightSubmodule l μ ν _ | d i n l j => simp only [generatorVal] - rw [h.repGauge_d g i l _] + rw [h.isFermionSector.repGauge_d g i l _] exact h.d_mem_massWeightSubmodule i l _ | bard i n l j => simp only [generatorVal] - rw [h.repGauge_bard g i l _] + rw [h.isFermionSector.repGauge_bard g i l _] exact h.bard_mem_massWeightSubmodule i l _ | u i n l j => simp only [generatorVal] - rw [h.repGauge_u g i l _] + rw [h.isFermionSector.repGauge_u g i l _] exact h.u_mem_massWeightSubmodule i l _ | baru i n l j => simp only [generatorVal] - rw [h.repGauge_baru g i l _] + rw [h.isFermionSector.repGauge_baru g i l _] exact h.baru_mem_massWeightSubmodule i l _ | Q i n l j => simp only [generatorVal] - rw [h.repGauge_Q g i l _] + rw [h.isFermionSector.repGauge_Q g i l _] exact h.Q_mem_massWeightSubmodule i l _ | barQ i n l j => simp only [generatorVal] - rw [h.repGauge_barQ g i l _] + rw [h.isFermionSector.repGauge_barQ g i l _] exact h.barQ_mem_massWeightSubmodule i l _ | L i n l j => simp only [generatorVal] - rw [h.repGauge_L g i l _] + rw [h.isFermionSector.repGauge_L g i l _] exact h.L_mem_massWeightSubmodule i l _ | barL i n l j => simp only [generatorVal] - rw [h.repGauge_barL g i l _] + rw [h.isFermionSector.repGauge_barL g i l _] exact h.barL_mem_massWeightSubmodule i l _ | e i n l j => simp only [generatorVal] - rw [h.repGauge_e g i l _] + rw [h.isFermionSector.repGauge_e g i l _] exact h.e_mem_massWeightSubmodule i l _ | bare i n l j => simp only [generatorVal] - rw [h.repGauge_bare g i l _] + rw [h.isFermionSector.repGauge_bare g i l _] exact h.bare_mem_massWeightSubmodule i l _ /-- The Lorentz action carries a covariant generator into the mass-weight submodule @@ -406,69 +410,69 @@ lemma repLorentz_generatorVal_mem (Λ : SL(2,ℂ)) (a : Generators) : cases a with | H n l j => simp only [generatorVal] - rw [h.repLorentz_H Λ n l _] + rw [h.isHiggsSector.repLorentz_H Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.H_mem_massWeightSubmodule p _) | barH n l j => simp only [generatorVal] - rw [h.repLorentz_barH Λ n l _] + rw [h.isHiggsSector.repLorentz_barH Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.barH_mem_massWeightSubmodule p _) | F n l μ ν j => simp only [generatorVal] - rw [h.repLorentz_F Λ n l μ ν _] + rw [h.isGaugeSector.repLorentz_F Λ n l μ ν _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (Submodule.sum_mem _ fun a _ => Submodule.smul_mem _ _ (Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ (h.F_mem_massWeightSubmodule p a b _))) | d i n l j => simp only [generatorVal] - rw [h.repLorentz_d i Λ n l _] + rw [h.isFermionSector.repLorentz_d i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.d_mem_massWeightSubmodule i p _) | bard i n l j => simp only [generatorVal] - rw [h.repLorentz_bard i Λ n l _] + rw [h.isFermionSector.repLorentz_bard i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.bard_mem_massWeightSubmodule i p _) | u i n l j => simp only [generatorVal] - rw [h.repLorentz_u i Λ n l _] + rw [h.isFermionSector.repLorentz_u i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.u_mem_massWeightSubmodule i p _) | baru i n l j => simp only [generatorVal] - rw [h.repLorentz_baru i Λ n l _] + rw [h.isFermionSector.repLorentz_baru i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.baru_mem_massWeightSubmodule i p _) | Q i n l j => simp only [generatorVal] - rw [h.repLorentz_Q i Λ n l _] + rw [h.isFermionSector.repLorentz_Q i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.Q_mem_massWeightSubmodule i p _) | barQ i n l j => simp only [generatorVal] - rw [h.repLorentz_barQ i Λ n l _] + rw [h.isFermionSector.repLorentz_barQ i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.barQ_mem_massWeightSubmodule i p _) | L i n l j => simp only [generatorVal] - rw [h.repLorentz_L i Λ n l _] + rw [h.isFermionSector.repLorentz_L i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.L_mem_massWeightSubmodule i p _) | barL i n l j => simp only [generatorVal] - rw [h.repLorentz_barL i Λ n l _] + rw [h.isFermionSector.repLorentz_barL i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.barL_mem_massWeightSubmodule i p _) | e i n l j => simp only [generatorVal] - rw [h.repLorentz_e i Λ n l _] + rw [h.isFermionSector.repLorentz_e i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.e_mem_massWeightSubmodule i p _) | bare i n l j => simp only [generatorVal] - rw [h.repLorentz_bare i Λ n l _] + rw [h.isFermionSector.repLorentz_bare i Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.bare_mem_massWeightSubmodule i p _) diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean new file mode 100644 index 000000000..0251cf956 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean @@ -0,0 +1,954 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.MassWeight +/-! +# The sectors of the field algebra + +Each covariant generator belongs to one of three classes — gauge, Higgs or fermion — +and a word in the generators realises a set of classes. The sector of a class set `S` +is the non-unital subalgebra spanned by the words realising exactly `S`; the sectors +exhaust the field algebra and are preserved by the gauge and Lorentz actions. + +Refining by the mass weight, `sectorMassWeight S w` is the span of the words +realising `S` of total weight `w`; it is exactly the intersection of the sector with +the mass-weight submodule (`sectorMassWeight_eq_inf`), and for each weight `w` the +mass-weight submodule decomposes as the join of the sectors' weight-`w` parts +(`massWeightSubmodule_eq_iSup_sectorMassWeight`). + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) +/-! + +## The different sectors of the Standard Model + +Each covariant generator belongs to one of three classes — gauge, Higgs or fermion — +and a word in the generators realises a set of classes. The sector of a class set `S` +is spanned by the words realising exactly `S`. It contains no non-zero scalar, since +the empty word realises no class at all, and it is closed under multiplication because +`S ∪ S = S`: it is a non-unital subalgebra. The seven non-empty class sets give the +seven sectors below. + +-/ + +/-- The three classes of covariant generator. -/ +inductive GeneratorClass where + /-- The gauge class: the field-strength towers. -/ + | gauge : GeneratorClass + /-- The Higgs class: the Higgs towers and their conjugates. -/ + | higgs : GeneratorClass + /-- The fermion class: the fermion towers and their conjugates. -/ + | fermion : GeneratorClass +deriving DecidableEq + +/-- The class of a covariant generator. -/ +def Generators.kind : Generators → GeneratorClass + | .F _ _ _ _ _ => .gauge + | .H _ _ _ => .higgs + | .barH _ _ _ => .higgs + | _ => .fermion + +@[simp] +lemma Generators.isGaugeField_iff_kind (g : Generators) : + g.IsGaugeField ↔ g.kind = .gauge := by + cases g <;> simp [Generators.IsGaugeField, Generators.kind] + +@[simp] +lemma Generators.isHiggs_iff_kind (g : Generators) : g.IsHiggs ↔ g.kind = .higgs := by + cases g <;> simp [Generators.IsHiggs, Generators.kind] + +@[simp] +lemma Generators.isFermionic_iff_kind (g : Generators) : + g.IsFermionic ↔ g.kind = .fermion := by + cases g <;> simp [Generators.IsFermionic, Generators.kind] + +/-- The classes realised by a word in the covariant generators. -/ +def wordClasses (gl : List Generators) : Finset GeneratorClass := + (gl.map Generators.kind).toFinset + +@[simp] +lemma wordClasses_nil : wordClasses [] = ∅ := by simp [wordClasses] + +/-- Concatenating words unions the classes they realise. -/ +lemma wordClasses_append (gl gl' : List Generators) : + wordClasses (gl ++ gl') = wordClasses gl ∪ wordClasses gl' := by + rw [wordClasses, wordClasses, wordClasses, List.map_append, List.toFinset_append] + +/-- Prepending a generator inserts its class. -/ +lemma wordClasses_cons (a : Generators) (gl : List Generators) : + wordClasses (a :: gl) = insert a.kind (wordClasses gl) := by + rw [wordClasses, wordClasses, List.map_cons, List.toFinset_cons] + +/-- The span of the words in the covariant generators realising exactly the classes + `S`. -/ +def sectorSubmodule (S : Finset GeneratorClass) : Submodule ℂ B := + Submodule.span ℂ + {x | ∃ gl : List Generators, wordClasses gl = S ∧ (gl.map h.generatorVal).prod = x} + +/-- Multiplication carries the class spans of `S` and `T` into that of `S ∪ T`. -/ +lemma mul_mem_sectorSubmodule {S T : Finset GeneratorClass} {x y : B} + (hx : x ∈ h.sectorSubmodule S) (hy : y ∈ h.sectorSubmodule T) : + x * y ∈ h.sectorSubmodule (S ∪ T) := by + induction hx using Submodule.span_induction with + | mem x hxw => + obtain ⟨gl, hgl, rfl⟩ := hxw + induction hy using Submodule.span_induction with + | mem y hyw => + obtain ⟨gl', hgl', rfl⟩ := hyw + refine Submodule.subset_span ⟨gl ++ gl', ?_, ?_⟩ + · rw [wordClasses_append, hgl, hgl'] + · rw [List.map_append, List.prod_append] + | zero => rw [mul_zero]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [mul_add]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ iha + | zero => rw [zero_mul]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ iha + +/-- The sector realising exactly the classes `S`: the span of the words whose + generators realise `S`. It is a non-unital subalgebra — closed under multiplication + since `S ∪ S = S`, but containing no non-zero scalar, since the empty word realises + no class. -/ +def sector (S : Finset GeneratorClass) : NonUnitalSubalgebra ℂ B := + (h.sectorSubmodule S).toNonUnitalSubalgebra fun x y hx hy => by + have hxy := h.mul_mem_sectorSubmodule hx hy + rwa [Finset.union_self] at hxy + +@[simp] +lemma mem_sector {S : Finset GeneratorClass} {x : B} : + x ∈ h.sector S ↔ x ∈ h.sectorSubmodule S := Iff.rfl + +/-- A word lies in the sector of the classes it realises. -/ +lemma list_prod_mem_sector (gl : List Generators) : + (gl.map h.generatorVal).prod ∈ h.sector (wordClasses gl) := + Submodule.subset_span ⟨gl, rfl, rfl⟩ + +/-- Multiplication carries the sectors of `S` and `T` into the sector of `S ∪ T`. -/ +lemma mul_mem_sector {S T : Finset GeneratorClass} {x y : B} + (hx : x ∈ h.sector S) (hy : y ∈ h.sector T) : x * y ∈ h.sector (S ∪ T) := + h.mul_mem_sectorSubmodule hx hy + +/-- Every sector sits inside the field algebra. -/ +lemma mem_fieldAlgebra_of_mem_sector {S : Finset GeneratorClass} {x : B} + (hx : x ∈ h.sector S) : x ∈ h.fieldAlgebra := by + rw [mem_sector, sectorSubmodule] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨gl, -, rfl⟩ := hy + refine Subalgebra.list_prod_mem _ fun z hz => ?_ + obtain ⟨g, -, rfl⟩ := List.mem_map.mp hz + exact h.generatorVal_mem_fieldAlgebra g + | zero => exact Subalgebra.zero_mem _ + | add a b ha hb iha ihb => exact Subalgebra.add_mem _ iha ihb + | smul c a ha iha => exact Subalgebra.smul_mem _ iha c + +/-- **The sectors exhaust the field algebra**: every element of the field algebra is a + sum of elements of the sectors, since every word realises exactly one class set. The + unit is supplied by `sector ∅`, the sector of the empty word, so the join is the + whole of `fieldAlgebra` — read as a non-unital subalgebra, the two sides having + otherwise different types. -/ +lemma fieldAlgebra_eq_iSup_sector : + h.fieldAlgebra.toNonUnitalSubalgebra = ⨆ S : Finset GeneratorClass, h.sector S := by + refine le_antisymm ?_ (iSup_le fun S => ?_) + · intro x hx + rw [Subalgebra.mem_toNonUnitalSubalgebra, h.fieldAlgebra_eq_adjoin_range, + ← Subalgebra.mem_toSubmodule, Algebra.adjoin_eq_span] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨l₀, hl₀, rfl⟩ := Submonoid.exists_list_of_mem_closure hy + obtain ⟨gl, rfl⟩ := h.exists_list_map_eq l₀ hl₀ + exact le_iSup (fun S : Finset GeneratorClass => h.sector S) (wordClasses gl) + (h.list_prod_mem_sector gl) + | zero => exact zero_mem _ + | add a b ha hb iha ihb => exact add_mem iha ihb + | smul c a ha iha => exact SMulMemClass.smul_mem c iha + · intro x hx + exact Subalgebra.mem_toNonUnitalSubalgebra.mpr (h.mem_fieldAlgebra_of_mem_sector hx) + + +/-! + +### The sectors are preserved by the gauge and Lorentz actions + +Both actions carry a covariant tower into combinations of towers of the same +species, hence each generator into the sector of its own class, hence — word by +word — each sector into itself. + +-/ + +/-- Any Higgs tower symbol lies in the Higgs sector. -/ +lemma H_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ HiggsVec) : H l φ ∈ h.sector {GeneratorClass.higgs} := by + rw [← HiggsVec.orthonormBasis.toBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.H n l j] + +/-- Any conjugate-Higgs tower symbol lies in the Higgs sector. -/ +lemma barH_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + barH l φ ∈ h.sector {GeneratorClass.higgs} := by + rw [← HiggsVec.orthonormBasis.toBasis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.barH n l j] + +/-- Any field-strength tower symbol lies in the gauge sector. -/ +lemma F_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : F l μ ν φ ∈ h.sector {GeneratorClass.gauge} := by + rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => ?_ + rw [← algebraMap_smul ℂ (φ (GaugeAlgebra.stdBasis j))] + refine SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.F n l μ ν j] + +/-- Any `d` tower symbol lies in the fermion sector. -/ +lemma d_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ DownSinglet) : d i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← DownSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.d i n l j] + +/-- Any `bard` tower symbol lies in the fermion sector. -/ +lemma bard_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : bard i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← DownSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.bard i n l j] + +/-- Any `u` tower symbol lies in the fermion sector. -/ +lemma u_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ UpSinglet) : u i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← UpSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.u i n l j] + +/-- Any `baru` tower symbol lies in the fermion sector. -/ +lemma baru_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : baru i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← UpSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.baru i n l j] + +/-- Any `Q` tower symbol lies in the fermion sector. -/ +lemma Q_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ QuarkDoublet) : Q i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← QuarkDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.Q i n l j] + +/-- Any `barQ` tower symbol lies in the fermion sector. -/ +lemma barQ_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : barQ i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← QuarkDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.barQ i n l j] + +/-- Any `L` tower symbol lies in the fermion sector. -/ +lemma L_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonDoublet) : L i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonDoublet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.L i n l j] + +/-- Any `barL` tower symbol lies in the fermion sector. -/ +lemma barL_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : barL i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonDoublet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.barL i n l j] + +/-- Any `e` tower symbol lies in the fermion sector. -/ +lemma e_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ LeptonSinglet) : e i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonSinglet.basis.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.e i n l j] + +/-- Any `bare` tower symbol lies in the fermion sector. -/ +lemma bare_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : bare i l φ ∈ h.sector {GeneratorClass.fermion} := by + rw [← LeptonSinglet.basis.conj.sum_dual_apply_smul_coord φ] + simp only [map_sum, map_smul] + refine sum_mem fun j _ => SMulMemClass.smul_mem _ ?_ + simpa [generatorVal, wordClasses, Generators.kind] using + h.list_prod_mem_sector [Generators.bare i n l j] + +/-- The gauge action carries a covariant generator into the sector of its class. -/ +lemma repGauge_generatorVal_mem_sector (g : GaugeGroupI) (a : Generators) : + repGauge g (h.generatorVal a) ∈ h.sector {a.kind} := by + cases a with + | H n l j => + simp only [generatorVal, Generators.kind] + rw [h.isHiggsSector.H_equivariant g _ n l] + exact h.H_mem_sector l _ + | barH n l j => + simp only [generatorVal, Generators.kind] + rw [h.isHiggsSector.barH_equivariant g _ n l] + exact h.barH_mem_sector l _ + | F n l μ ν j => + simp only [generatorVal, Generators.kind] + rw [h.isGaugeSector.repGauge_F g l μ ν _] + exact h.F_mem_sector l μ ν _ + | d i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_d g i l _] + exact h.d_mem_sector i l _ + | bard i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_bard g i l _] + exact h.bard_mem_sector i l _ + | u i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_u g i l _] + exact h.u_mem_sector i l _ + | baru i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_baru g i l _] + exact h.baru_mem_sector i l _ + | Q i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_Q g i l _] + exact h.Q_mem_sector i l _ + | barQ i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_barQ g i l _] + exact h.barQ_mem_sector i l _ + | L i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_L g i l _] + exact h.L_mem_sector i l _ + | barL i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_barL g i l _] + exact h.barL_mem_sector i l _ + | e i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_e g i l _] + exact h.e_mem_sector i l _ + | bare i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repGauge_bare g i l _] + exact h.bare_mem_sector i l _ + +/-- The Lorentz action carries a covariant generator into the sector of its + class. -/ +lemma repLorentz_generatorVal_mem_sector (Λ : SL(2,ℂ)) (a : Generators) : + repLorentz Λ (h.generatorVal a) ∈ h.sector {a.kind} := by + cases a with + | H n l j => + simp only [generatorVal, Generators.kind] + rw [h.isHiggsSector.repLorentz_H Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.H_mem_sector p _) + | barH n l j => + simp only [generatorVal, Generators.kind] + rw [h.isHiggsSector.repLorentz_barH Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barH_mem_sector p _) + | F n l μ ν j => + simp only [generatorVal, Generators.kind] + rw [h.isGaugeSector.repLorentz_F Λ n l μ ν _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ + (sum_mem fun a _ => SMulMemClass.smul_mem _ + (sum_mem fun b _ => SMulMemClass.smul_mem _ (h.F_mem_sector p a b _))) + | d i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_d i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.d_mem_sector i p _) + | bard i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_bard i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.bard_mem_sector i p _) + | u i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_u i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.u_mem_sector i p _) + | baru i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_baru i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.baru_mem_sector i p _) + | Q i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_Q i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.Q_mem_sector i p _) + | barQ i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_barQ i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barQ_mem_sector i p _) + | L i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_L i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.L_mem_sector i p _) + | barL i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_barL i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barL_mem_sector i p _) + | e i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_e i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.e_mem_sector i p _) + | bare i n l j => + simp only [generatorVal, Generators.kind] + rw [h.isFermionSector.repLorentz_bare i Λ n l _] + exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.bare_mem_sector i p _) + +/-- The action `repGauge` preserves every sector. -/ +lemma repGauge_mem_sector {S : Finset GeneratorClass} {x : B} (g : GaugeGroupI) + (hx : x ∈ h.sector S) : repGauge g x ∈ h.sector S := by + rw [mem_sector, sectorSubmodule] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨gl, hgl, rfl⟩ := hy + subst hgl + induction gl with + | nil => + simp only [List.map_nil, List.prod_nil] + rw [h.repGauge_one g] + simpa using h.list_prod_mem_sector ([] : List Generators) + | cons a t ih => + simp only [List.map_cons, List.prod_cons] + rw [h.repGauge_mul g, wordClasses_cons, ← Finset.singleton_union] + exact h.mul_mem_sector (h.repGauge_generatorVal_mem_sector g a) ih + | zero => rw [map_zero]; exact zero_mem _ + | add a b ha hb iha ihb => rw [map_add]; exact add_mem iha ihb + | smul c a ha iha => rw [map_smul]; exact SMulMemClass.smul_mem _ iha + +/-- The action `repLorentz` preserves every sector. -/ +lemma repLorentz_mem_sector {S : Finset GeneratorClass} {x : B} (Λ : SL(2,ℂ)) + (hx : x ∈ h.sector S) : repLorentz Λ x ∈ h.sector S := by + rw [mem_sector, sectorSubmodule] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨gl, hgl, rfl⟩ := hy + subst hgl + induction gl with + | nil => + simp only [List.map_nil, List.prod_nil] + rw [h.repLorentz_one Λ] + simpa using h.list_prod_mem_sector ([] : List Generators) + | cons a t ih => + simp only [List.map_cons, List.prod_cons] + rw [h.repLorentz_mul Λ, wordClasses_cons, ← Finset.singleton_union] + exact h.mul_mem_sector (h.repLorentz_generatorVal_mem_sector Λ a) ih + | zero => rw [map_zero]; exact zero_mem _ + | add a b ha hb iha ihb => rw [map_add]; exact add_mem iha ihb + | smul c a ha iha => rw [map_smul]; exact SMulMemClass.smul_mem _ iha + +/-! + +## Sectors at a fixed mass weight + +-/ + +/-- The span of the words realising exactly the classes `S` of total mass weight + `w`. -/ +def sectorMassWeight (S : Finset GeneratorClass) (w : ℕ) : Submodule ℂ B := + Submodule.span ℂ + {x | ∃ gl : List Generators, wordClasses gl = S ∧ + (gl.map Generators.weight).sum = w ∧ (gl.map h.generatorVal).prod = x} + +lemma sectorMassWeight_le_sectorSubmodule (S : Finset GeneratorClass) (w : ℕ) : + h.sectorMassWeight S w ≤ h.sectorSubmodule S := by + rw [sectorMassWeight, Submodule.span_le] + rintro x ⟨gl, hS, hw, rfl⟩ + exact Submodule.subset_span ⟨gl, hS, rfl⟩ + +lemma sectorMassWeight_le_massWeightSubmodule (S : Finset GeneratorClass) (w : ℕ) : + h.sectorMassWeight S w ≤ h.massWeightSubmodule w := by + rw [sectorMassWeight, Submodule.span_le] + rintro x ⟨gl, hS, hw, rfl⟩ + exact h.list_prod_mem_massWeightSubmodule hw + +/-- A word lies in the weight part of its sector given by its total weight. -/ +lemma list_prod_mem_sectorMassWeight (gl : List Generators) : + (gl.map h.generatorVal).prod + ∈ h.sectorMassWeight (wordClasses gl) ((gl.map Generators.weight).sum) := + Submodule.subset_span ⟨gl, rfl, rfl, rfl⟩ + +/-- Multiplication carries the weight-`w` part of the sector of `S` and the + weight-`w'` part of the sector of `T` into the weight-`w + w'` part of the sector + of `S ∪ T`. -/ +lemma mul_mem_sectorMassWeight {S T : Finset GeneratorClass} {w w' : ℕ} {x y : B} + (hx : x ∈ h.sectorMassWeight S w) (hy : y ∈ h.sectorMassWeight T w') : + x * y ∈ h.sectorMassWeight (S ∪ T) (w + w') := by + induction hx using Submodule.span_induction with + | mem x hxw => + obtain ⟨gl, hglS, hglw, rfl⟩ := hxw + induction hy using Submodule.span_induction with + | mem y hyw => + obtain ⟨gl', hglT, hglw', rfl⟩ := hyw + refine Submodule.subset_span ⟨gl ++ gl', ?_, ?_, ?_⟩ + · rw [wordClasses_append, hglS, hglT] + · rw [List.map_append, List.sum_append, hglw, hglw'] + · rw [List.map_append, List.prod_append] + | zero => rw [mul_zero]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [mul_add]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [mul_smul_comm]; exact Submodule.smul_mem _ _ iha + | zero => rw [zero_mul]; exact Submodule.zero_mem _ + | add a b ha hb iha ihb => rw [add_mul]; exact Submodule.add_mem _ iha ihb + | smul c a ha iha => rw [smul_mul_assoc]; exact Submodule.smul_mem _ _ iha + +/-- Reading off the `X ^ w` coefficient of `massWeightPoly` sends the sector of `S` + into its weight-`w` part — the projection onto the weight-`w` component, with no + independence argument needed. -/ +lemma coeff_massWeightPoly_mem_sectorMassWeight {S : Finset GeneratorClass} {x : B} + (hx : x ∈ h.sector S) (w : ℕ) : + (massWeightPoly x).coeff w ∈ h.sectorMassWeight S w := by + rw [mem_sector, sectorSubmodule] at hx + induction hx using Submodule.span_induction with + | mem y hy => + obtain ⟨gl, hS, rfl⟩ := hy + rw [h.massWeightPoly_generatorVal_list_prod, Polynomial.coeff_monomial] + by_cases hw : (gl.map Generators.weight).sum = w + · rw [if_pos hw] + exact Submodule.subset_span ⟨gl, hS, hw, rfl⟩ + · rw [if_neg hw] + exact Submodule.zero_mem _ + | zero => + rw [map_zero, Polynomial.coeff_zero] + exact Submodule.zero_mem _ + | add a b ha hb iha ihb => + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ iha ihb + | smul c a ha iha => + rw [map_smul, Polynomial.coeff_smul] + exact Submodule.smul_mem _ _ iha + +/-- The weight-`w` part of the sector of `S` is exactly the intersection of the + sector with the mass-weight submodule. -/ +theorem sectorMassWeight_eq_inf (S : Finset GeneratorClass) (w : ℕ) : + h.sectorMassWeight S w = h.sectorSubmodule S ⊓ h.massWeightSubmodule w := by + refine le_antisymm (le_inf (h.sectorMassWeight_le_sectorSubmodule S w) + (h.sectorMassWeight_le_massWeightSubmodule S w)) ?_ + intro x hx + obtain ⟨hxS, hxw⟩ := Submodule.mem_inf.mp hx + have h1 := h.massWeightPoly_of_mem_massWeightSubmodule hxw + have h2 := h.coeff_massWeightPoly_mem_sectorMassWeight (h.mem_sector.mpr hxS) w + rwa [h1, Polynomial.coeff_monomial, if_pos rfl] at h2 + +/-- **The decomposition of the mass-weight submodule into sectors**: the weight-`w` + component of the field algebra is the join over the class sets `S` of the + weight-`w` parts of the sectors, since every word realises exactly one class set. + The empty class set contributes the scalars, at weight zero only. -/ +theorem massWeightSubmodule_eq_iSup_sectorMassWeight (w : ℕ) : + h.massWeightSubmodule w = ⨆ S : Finset GeneratorClass, h.sectorMassWeight S w := by + refine le_antisymm ?_ (iSup_le fun S => h.sectorMassWeight_le_massWeightSubmodule S w) + rw [h.massWeightSubmodule_eq_span, Submodule.span_le] + rintro x ⟨gl, hw, rfl⟩ + exact Submodule.mem_iSup_of_mem (wordClasses gl) + (Submodule.subset_span ⟨gl, rfl, hw, rfl⟩) + +/-- The action `repGauge` preserves the weight parts of every sector. -/ +lemma repGauge_mem_sectorMassWeight {S : Finset GeneratorClass} {w : ℕ} {x : B} + (g : GaugeGroupI) (hx : x ∈ h.sectorMassWeight S w) : + repGauge g x ∈ h.sectorMassWeight S w := by + rw [sectorMassWeight_eq_inf] at hx ⊢ + obtain ⟨hxS, hxw⟩ := Submodule.mem_inf.mp hx + exact Submodule.mem_inf.mpr + ⟨h.mem_sector.mp (h.repGauge_mem_sector g (h.mem_sector.mpr hxS)), + h.repGauge_mem_massWeightSubmodule g hxw⟩ + +/-- The action `repLorentz` preserves the weight parts of every sector. -/ +lemma repLorentz_mem_sectorMassWeight {S : Finset GeneratorClass} {w : ℕ} {x : B} + (Λ : SL(2,ℂ)) (hx : x ∈ h.sectorMassWeight S w) : + repLorentz Λ x ∈ h.sectorMassWeight S w := by + rw [sectorMassWeight_eq_inf] at hx ⊢ + obtain ⟨hxS, hxw⟩ := Submodule.mem_inf.mp hx + exact Submodule.mem_inf.mpr + ⟨h.mem_sector.mp (h.repLorentz_mem_sector Λ (h.mem_sector.mpr hxS)), + h.repLorentz_mem_massWeightSubmodule Λ hxw⟩ + + +/-! + +## The Higgs sector and the Higgs-sector mass-weight submodules + +The Higgs class-set piece of the sector decomposition matches the mass-weight +submodules of the Higgs sector `h.isHiggsSector`: at a non-zero weight `w` the two +agree exactly. At weight zero they differ only by the scalars, which the Higgs-sector +submodule contains (through the unit of `higgsAlgebra`) while the `{higgs}` sector, +being spanned by non-empty words, does not — the scalars are the `∅` sector. + +-/ + +/-- At a non-zero weight the `∅` sector has no weight part: its only word is the + empty word, of weight zero. -/ +lemma sectorMassWeight_empty_of_ne_zero {w : ℕ} (hw : w ≠ 0) : + h.sectorMassWeight ∅ w = ⊥ := by + rw [sectorMassWeight, Submodule.span_eq_bot] + rintro x ⟨gl, hS, hsum, rfl⟩ + rw [wordClasses, List.toFinset_eq_empty_iff, List.map_eq_nil_iff] at hS + subst hS + simp at hsum + exact absurd hsum.symm hw + +/-- The algebra generated by the Higgs towers decomposes into the `{higgs}` sector + and the scalar `∅` sector. -/ +lemma higgsAlgebra_le_sup_sectorSubmodule : + Subalgebra.toSubmodule h.isHiggsSector.higgsAlgebra + ≤ h.sectorSubmodule {GeneratorClass.higgs} ⊔ h.sectorSubmodule ∅ := by + intro x hx + rw [Subalgebra.mem_toSubmodule, IsHiggsSector.higgsAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + apply Submodule.mem_sup_left + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨k, dd, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hy + · exact h.mem_sector.mp (h.H_mem_sector dd φ) + · exact h.mem_sector.mp (h.barH_mem_sector dd φ) + | algebraMap r => + apply Submodule.mem_sup_right + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl, rfl⟩) + | add a b ha hb iha ihb => exact Submodule.add_mem _ iha ihb + | mul a b ha hb iha ihb => + obtain ⟨a₁, ha₁, a₂, ha₂, rfl⟩ := Submodule.mem_sup.mp iha + obtain ⟨b₁, hb₁, b₂, hb₂, rfl⟩ := Submodule.mem_sup.mp ihb + rw [add_mul, mul_add, mul_add] + refine Submodule.add_mem _ (Submodule.add_mem _ ?_ ?_) (Submodule.add_mem _ ?_ ?_) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₁ hb₁) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₁ hb₂) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₂ hb₁) + · exact Submodule.mem_sup_right (by simpa using h.mul_mem_sectorSubmodule ha₂ hb₂) + +/-- The weight-`w` part of the `{higgs}` sector lies in the Higgs-sector mass-weight + submodule: its words are products of Higgs towers of total weight `w`. -/ +lemma sectorMassWeight_higgs_le (w : ℕ) : + h.sectorMassWeight {GeneratorClass.higgs} w + ≤ h.isHiggsSector.massWeightSubmodule w := by + rw [sectorMassWeight, Submodule.span_le] + rintro x ⟨gl, hS, hsum, rfl⟩ + have hmem : (gl.map h.generatorVal).prod ∈ h.isHiggsSector.higgsAlgebra := by + refine Subalgebra.list_prod_mem _ fun y hy => ?_ + obtain ⟨g, hg, rfl⟩ := List.mem_map.mp hy + have hk : g.kind = GeneratorClass.higgs := by + have hmem' : g.kind ∈ wordClasses gl := by + rw [wordClasses] + exact List.mem_toFinset.mpr (List.mem_map_of_mem hg) + rw [hS] at hmem' + simpa using hmem' + rw [IsHiggsSector.higgsAlgebra] + cases g with + | H n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr + ⟨l, Set.mem_union_left _ ⟨_, rfl⟩⟩⟩) + | barH n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr + ⟨l, Set.mem_union_right _ ⟨_, rfl⟩⟩⟩) + | F n l μ ν j => simp [Generators.kind] at hk + | d i n l j => simp [Generators.kind] at hk + | bard i n l j => simp [Generators.kind] at hk + | u i n l j => simp [Generators.kind] at hk + | baru i n l j => simp [Generators.kind] at hk + | Q i n l j => simp [Generators.kind] at hk + | barQ i n l j => simp [Generators.kind] at hk + | L i n l j => simp [Generators.kind] at hk + | barL i n l j => simp [Generators.kind] at hk + | e i n l j => simp [Generators.kind] at hk + | bare i n l j => simp [Generators.kind] at hk + rw [IsHiggsSector.massWeightSubmodule] + refine Submodule.mem_inf.mpr ⟨(Subalgebra.mem_toSubmodule _).mpr hmem, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, + LinearMap.coe_restrictScalars, sub_eq_zero] + rw [h.massWeightPoly_generatorVal_list_prod, hsum] + +/-- **The Higgs-sector mass-weight submodules are the weight parts of the `{higgs}` + sector**, at any non-zero weight. (At weight zero the Higgs-sector submodule also + contains the scalars, which the sector decomposition files under the `∅` sector.) -/ +theorem sectorMassWeight_higgs_eq {w : ℕ} (hw : w ≠ 0) : + h.sectorMassWeight {GeneratorClass.higgs} w + = h.isHiggsSector.massWeightSubmodule w := by + refine le_antisymm (h.sectorMassWeight_higgs_le w) (fun x hx => ?_) + have hxa := h.isHiggsSector.mem_higgsAlgebra_of_mem_massWeightSubmodule hx + have hxe := h.isHiggsSector.massWeightPoly_of_mem_massWeightSubmodule hx + obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.mp + (h.higgsAlgebra_le_sup_sectorSubmodule ((Subalgebra.mem_toSubmodule _).mpr hxa)) + have hy' := h.coeff_massWeightPoly_mem_sectorMassWeight (h.mem_sector.mpr hy) w + have hz' := h.coeff_massWeightPoly_mem_sectorMassWeight (h.mem_sector.mpr hz) w + rw [h.sectorMassWeight_empty_of_ne_zero hw, Submodule.mem_bot] at hz' + have hkey : y + z = (massWeightPoly y).coeff w + (massWeightPoly z).coeff w := by + have hc := congrArg (fun p => Polynomial.coeff p w) hxe + simpa [Polynomial.coeff_add, Polynomial.coeff_monomial] using hc.symm + rw [hkey, hz', add_zero] + exact hy' + + +/-! + +## The gauge and fermion sectors and their mass-weight submodules + +The same relation as for the Higgs sector: at a non-zero weight `w`, the `{gauge}` +and `{fermion}` pieces of the sector decomposition are exactly the mass-weight +submodules of `h.isGaugeSector` and `h.isFermionSector`; at weight zero the sector +submodules also contain the scalars, which the decomposition files under `∅`. + +-/ + +/-- The algebra generated by the field-strength towers decomposes into the `{gauge}` sector + and the scalar `∅` sector. -/ +lemma gaugeAlgebra_le_sup_sectorSubmodule : + Subalgebra.toSubmodule h.isGaugeSector.gaugeAlgebra + ≤ h.sectorSubmodule {GeneratorClass.gauge} ⊔ h.sectorSubmodule ∅ := by + intro x hx + rw [Subalgebra.mem_toSubmodule, IsGaugeSector.gaugeAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + apply Submodule.mem_sup_left + simp only [Set.mem_iUnion, Set.mem_range] at hy + obtain ⟨n, l, μ, ν, φ, rfl⟩ := hy + exact h.mem_sector.mp (h.F_mem_sector l μ ν φ) + | algebraMap r => + apply Submodule.mem_sup_right + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl, rfl⟩) + | add a b ha hb iha ihb => exact Submodule.add_mem _ iha ihb + | mul a b ha hb iha ihb => + obtain ⟨a₁, ha₁, a₂, ha₂, rfl⟩ := Submodule.mem_sup.mp iha + obtain ⟨b₁, hb₁, b₂, hb₂, rfl⟩ := Submodule.mem_sup.mp ihb + rw [add_mul, mul_add, mul_add] + refine Submodule.add_mem _ (Submodule.add_mem _ ?_ ?_) (Submodule.add_mem _ ?_ ?_) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₁ hb₁) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₁ hb₂) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₂ hb₁) + · exact Submodule.mem_sup_right (by simpa using h.mul_mem_sectorSubmodule ha₂ hb₂) + +/-- The weight-`w` part of the `{gauge}` sector lies in the gauge sector's + mass-weight submodule. -/ +lemma sectorMassWeight_gauge_le (w : ℕ) : + h.sectorMassWeight {GeneratorClass.gauge} w + ≤ h.isGaugeSector.massWeightSubmodule w := by + rw [sectorMassWeight, Submodule.span_le] + rintro x ⟨gl, hS, hsum, rfl⟩ + have hmem : (gl.map h.generatorVal).prod ∈ h.isGaugeSector.gaugeAlgebra := by + refine Subalgebra.list_prod_mem _ fun y hy => ?_ + obtain ⟨g, hg, rfl⟩ := List.mem_map.mp hy + have hk : g.kind = GeneratorClass.gauge := by + have hmem' : g.kind ∈ wordClasses gl := by + rw [wordClasses] + exact List.mem_toFinset.mpr (List.mem_map_of_mem hg) + rw [hS] at hmem' + simpa using hmem' + rw [IsGaugeSector.gaugeAlgebra] + cases g with + | F n l μ ν j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr + ⟨l, Set.mem_iUnion.mpr ⟨μ, Set.mem_iUnion.mpr ⟨ν, ⟨_, rfl⟩⟩⟩⟩⟩) + | H n l j => simp [Generators.kind] at hk + | barH n l j => simp [Generators.kind] at hk + | d i n l j => simp [Generators.kind] at hk + | bard i n l j => simp [Generators.kind] at hk + | u i n l j => simp [Generators.kind] at hk + | baru i n l j => simp [Generators.kind] at hk + | Q i n l j => simp [Generators.kind] at hk + | barQ i n l j => simp [Generators.kind] at hk + | L i n l j => simp [Generators.kind] at hk + | barL i n l j => simp [Generators.kind] at hk + | e i n l j => simp [Generators.kind] at hk + | bare i n l j => simp [Generators.kind] at hk + rw [IsGaugeSector.massWeightSubmodule] + refine Submodule.mem_inf.mpr ⟨(Subalgebra.mem_toSubmodule _).mpr hmem, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, + LinearMap.coe_restrictScalars, sub_eq_zero] + rw [h.massWeightPoly_generatorVal_list_prod, hsum] + +/-- **The gauge sector's mass-weight submodules are the weight parts of the + `{gauge}` sector**, at any non-zero weight. (At weight zero the sector's + submodule also contains the scalars, which the sector decomposition files under the + `∅` sector.) -/ +theorem sectorMassWeight_gauge_eq {w : ℕ} (hw : w ≠ 0) : + h.sectorMassWeight {GeneratorClass.gauge} w + = h.isGaugeSector.massWeightSubmodule w := by + refine le_antisymm (h.sectorMassWeight_gauge_le w) (fun x hx => ?_) + have hxa := h.isGaugeSector.mem_gaugeAlgebra_of_mem_massWeightSubmodule hx + have hxe := h.isGaugeSector.massWeightPoly_of_mem_massWeightSubmodule hx + obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.mp + (h.gaugeAlgebra_le_sup_sectorSubmodule ((Subalgebra.mem_toSubmodule _).mpr hxa)) + have hy' := h.coeff_massWeightPoly_mem_sectorMassWeight (h.mem_sector.mpr hy) w + have hz' := h.coeff_massWeightPoly_mem_sectorMassWeight (h.mem_sector.mpr hz) w + rw [h.sectorMassWeight_empty_of_ne_zero hw, Submodule.mem_bot] at hz' + have hkey : y + z = (massWeightPoly y).coeff w + (massWeightPoly z).coeff w := by + have hc := congrArg (fun p => Polynomial.coeff p w) hxe + simpa [Polynomial.coeff_add, Polynomial.coeff_monomial] using hc.symm + rw [hkey, hz', add_zero] + exact hy' + +/-- The algebra generated by the fermion towers decomposes into the `{fermion}` sector + and the scalar `∅` sector. -/ +lemma fermionAlgebra_le_sup_sectorSubmodule : + Subalgebra.toSubmodule h.isFermionSector.fermionAlgebra + ≤ h.sectorSubmodule {GeneratorClass.fermion} ⊔ h.sectorSubmodule ∅ := by + intro x hx + rw [Subalgebra.mem_toSubmodule, IsFermionSector.fermionAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + apply Submodule.mem_sup_left + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨i, k, dd, (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩)⟩ := hy + · exact h.mem_sector.mp (h.d_mem_sector i dd φ) + · exact h.mem_sector.mp (h.bard_mem_sector i dd φ) + · exact h.mem_sector.mp (h.u_mem_sector i dd φ) + · exact h.mem_sector.mp (h.baru_mem_sector i dd φ) + · exact h.mem_sector.mp (h.Q_mem_sector i dd φ) + · exact h.mem_sector.mp (h.barQ_mem_sector i dd φ) + · exact h.mem_sector.mp (h.L_mem_sector i dd φ) + · exact h.mem_sector.mp (h.barL_mem_sector i dd φ) + · exact h.mem_sector.mp (h.e_mem_sector i dd φ) + · exact h.mem_sector.mp (h.bare_mem_sector i dd φ) + | algebraMap r => + apply Submodule.mem_sup_right + rw [Algebra.algebraMap_eq_smul_one] + exact Submodule.smul_mem _ _ (Submodule.subset_span ⟨[], rfl, rfl⟩) + | add a b ha hb iha ihb => exact Submodule.add_mem _ iha ihb + | mul a b ha hb iha ihb => + obtain ⟨a₁, ha₁, a₂, ha₂, rfl⟩ := Submodule.mem_sup.mp iha + obtain ⟨b₁, hb₁, b₂, hb₂, rfl⟩ := Submodule.mem_sup.mp ihb + rw [add_mul, mul_add, mul_add] + refine Submodule.add_mem _ (Submodule.add_mem _ ?_ ?_) (Submodule.add_mem _ ?_ ?_) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₁ hb₁) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₁ hb₂) + · exact Submodule.mem_sup_left (by simpa using h.mul_mem_sectorSubmodule ha₂ hb₁) + · exact Submodule.mem_sup_right (by simpa using h.mul_mem_sectorSubmodule ha₂ hb₂) + +/-- The weight-`w` part of the `{fermion}` sector lies in the fermion sector's + mass-weight submodule. -/ +lemma sectorMassWeight_fermion_le (w : ℕ) : + h.sectorMassWeight {GeneratorClass.fermion} w + ≤ h.isFermionSector.massWeightSubmodule w := by + rw [sectorMassWeight, Submodule.span_le] + rintro x ⟨gl, hS, hsum, rfl⟩ + have hmem : (gl.map h.generatorVal).prod ∈ h.isFermionSector.fermionAlgebra := by + refine Subalgebra.list_prod_mem _ fun y hy => ?_ + obtain ⟨g, hg, rfl⟩ := List.mem_map.mp hy + have hk : g.kind = GeneratorClass.fermion := by + have hmem' : g.kind ∈ wordClasses gl := by + rw [wordClasses] + exact List.mem_toFinset.mpr (List.mem_map_of_mem hg) + rw [hS] at hmem' + simpa using hmem' + rw [IsFermionSector.fermionAlgebra] + cases g with + | d i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (⟨_, rfl⟩)))))))))⟩⟩⟩) + | bard i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))))⟩⟩⟩) + | u i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))))⟩⟩⟩) + | baru i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))))⟩⟩⟩) + | Q i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))))⟩⟩⟩) + | barQ i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))))⟩⟩⟩) + | L i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)))⟩⟩⟩) + | barL i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩))⟩⟩⟩) + | e i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_right _ ⟨_, rfl⟩)⟩⟩⟩) + | bare i n l j => + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr + ⟨n, Set.mem_iUnion.mpr ⟨l, Set.mem_union_right _ ⟨_, rfl⟩⟩⟩⟩) + | H n l j => simp [Generators.kind] at hk + | barH n l j => simp [Generators.kind] at hk + | F n l μ ν j => simp [Generators.kind] at hk + rw [IsFermionSector.massWeightSubmodule] + refine Submodule.mem_inf.mpr ⟨(Subalgebra.mem_toSubmodule _).mpr hmem, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, + LinearMap.coe_restrictScalars, sub_eq_zero] + rw [h.massWeightPoly_generatorVal_list_prod, hsum] + +/-- **The fermion sector's mass-weight submodules are the weight parts of the + `{fermion}` sector**, at any non-zero weight. (At weight zero the sector's + submodule also contains the scalars, which the sector decomposition files under the + `∅` sector.) -/ +theorem sectorMassWeight_fermion_eq {w : ℕ} (hw : w ≠ 0) : + h.sectorMassWeight {GeneratorClass.fermion} w + = h.isFermionSector.massWeightSubmodule w := by + refine le_antisymm (h.sectorMassWeight_fermion_le w) (fun x hx => ?_) + have hxa := h.isFermionSector.mem_fermionAlgebra_of_mem_massWeightSubmodule hx + have hxe := h.isFermionSector.massWeightPoly_of_mem_massWeightSubmodule hx + obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.mp + (h.fermionAlgebra_le_sup_sectorSubmodule ((Subalgebra.mem_toSubmodule _).mpr hxa)) + have hy' := h.coeff_massWeightPoly_mem_sectorMassWeight (h.mem_sector.mpr hy) w + have hz' := h.coeff_massWeightPoly_mem_sectorMassWeight (h.mem_sector.mpr hz) w + rw [h.sectorMassWeight_empty_of_ne_zero hw, Submodule.mem_bot] at hz' + have hkey : y + z = (massWeightPoly y).coeff w + (massWeightPoly z).coeff w := by + have hc := congrArg (fun p => Polynomial.coeff p w) hxe + simpa [Polynomial.coeff_add, Polynomial.coeff_monomial] using hc.symm + rw [hkey, hz', add_zero] + exact hy' + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean new file mode 100644 index 000000000..e69de29bb diff --git a/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean b/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean new file mode 100644 index 000000000..03dc8bd43 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean @@ -0,0 +1,681 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Mathematics.ConjModule +public import Physlib.Relativity.IsLorentzDeriv +public import Mathlib.Algebra.Polynomial.AlgebraMap +/-! +# The fermion sector + +The three families of each fermion species and their conjugates, indexed by ordered +tuples of covariant-derivative directions, form a *fermion sector* of the algebra `B` +when: each family transforms under the global gauge group through the dual of the +species' gauge representation (the conjugate representation for the barred fields), +under the Lorentz group as the covariant derivatives of the species' Lorentz +representation, and each tower is a `massWeightPoly`-eigenvector of weight +`3 + 2 * n` (mass dimension `3/2 + n`). + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +/-- The ten fermion families and their covariant derivatives as a sector of the + algebra `B`: gauge transformation through the dual of the species representations + (conjugate for the barred fields), the Lorentz transformation of the towers, and + the mass weights `3 + 2 * n`. -/ +structure IsFermionSector (B : Type) [Ring B] [Algebra ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (repGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + (repLorentz : Representation ℂ SL(2,ℂ) B) + (repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B) + (bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B) + (u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B) + (baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B) + (Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B) + (barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B) + (L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B) + (barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B) + (e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B) + (bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B) + (massWeightPoly : B →ₐ[ℂ] Polynomial B) : Prop where + repGauge_d : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet), + repGauge g (d i l φ) = d i l (DownSinglet.repGaugeGroupI.dual g φ) + repGauge_bard : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)), + repGauge g (bard i l φ) = bard i l (DownSinglet.repGaugeGroupI.conj.dual g φ) + repGauge_u : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet), + repGauge g (u i l φ) = u i l (UpSinglet.repGaugeGroupI.dual g φ) + repGauge_baru : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)), + repGauge g (baru i l φ) = baru i l (UpSinglet.repGaugeGroupI.conj.dual g φ) + repGauge_Q : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet), + repGauge g (Q i l φ) = Q i l (QuarkDoublet.repGaugeGroupI.dual g φ) + repGauge_barQ : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + repGauge g (barQ i l φ) = barQ i l (QuarkDoublet.repGaugeGroupI.conj.dual g φ) + repGauge_L : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet), + repGauge g (L i l φ) = L i l (LeptonDoublet.repGaugeGroupI.dual g φ) + repGauge_barL : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + repGauge g (barL i l φ) = barL i l (LeptonDoublet.repGaugeGroupI.conj.dual g φ) + repGauge_e : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet), + repGauge g (e i l φ) = e i l (LeptonSinglet.repGaugeGroupI.dual g φ) + repGauge_bare : ∀ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + repGauge g (bare i l φ) = bare i l (LeptonSinglet.repGaugeGroupI.conj.dual g φ) + repLorentz_d : ∀ i, IsLorentzCovDerivTransforms repLorentz + DownSinglet.repLorentzGroup (d i) + repLorentz_bard : ∀ i, IsLorentzCovDerivTransforms repLorentz + DownSinglet.repLorentzGroup.conj (bard i) + repLorentz_u : ∀ i, IsLorentzCovDerivTransforms repLorentz + UpSinglet.repLorentzGroup (u i) + repLorentz_baru : ∀ i, IsLorentzCovDerivTransforms repLorentz + UpSinglet.repLorentzGroup.conj (baru i) + repLorentz_Q : ∀ i, IsLorentzCovDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup (Q i) + repLorentz_barQ : ∀ i, IsLorentzCovDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup.conj (barQ i) + repLorentz_L : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup (L i) + repLorentz_barL : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup.conj (barL i) + repLorentz_e : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup (e i) + repLorentz_bare : ∀ i, IsLorentzCovDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup.conj (bare i) + massWeight_d : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (d i l φ) = Polynomial.monomial (3 + 2 * n) (d i l φ) + massWeight_bard : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (bard i l φ) = Polynomial.monomial (3 + 2 * n) (bard i l φ) + massWeight_u : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (u i l φ) = Polynomial.monomial (3 + 2 * n) (u i l φ) + massWeight_baru : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (baru i l φ) = Polynomial.monomial (3 + 2 * n) (baru i l φ) + massWeight_Q : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (Q i l φ) = Polynomial.monomial (3 + 2 * n) (Q i l φ) + massWeight_barQ : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (barQ i l φ) = Polynomial.monomial (3 + 2 * n) (barQ i l φ) + massWeight_L : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (L i l φ) = Polynomial.monomial (3 + 2 * n) (L i l φ) + massWeight_barL : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (barL i l φ) = Polynomial.monomial (3 + 2 * n) (barL i l φ) + massWeight_e : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (e i l φ) = Polynomial.monomial (3 + 2 * n) (e i l φ) + massWeight_bare : ∀ i {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) φ, + massWeightPoly (bare i l φ) = Polynomial.monomial (3 + 2 * n) (bare i l φ) + -- Any two fermionic towers anticommute. On the diagonal (same species, family, + -- derivative slots and dual vector) this forces the square of every fermionic + -- symbol to vanish, whenever `2` is invertible in `B`. + d_anticomm_d : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ DownSinglet), + d i l φ * d j l' φ' = -(d j l' φ' * d i l φ) + d_anticomm_bard : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + d i l φ * bard j l' φ' = -(bard j l' φ' * d i l φ) + d_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ UpSinglet), + d i l φ * u j l' φ' = -(u j l' φ' * d i l φ) + d_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + d i l φ * baru j l' φ' = -(baru j l' φ' * d i l φ) + d_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + d i l φ * Q j l' φ' = -(Q j l' φ' * d i l φ) + d_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + d i l φ * barQ j l' φ' = -(barQ j l' φ' * d i l φ) + d_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + d i l φ * L j l' φ' = -(L j l' φ' * d i l φ) + d_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + d i l φ * barL j l' φ' = -(barL j l' φ' * d i l φ) + d_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + d i l φ * e j l' φ' = -(e j l' φ' * d i l φ) + d_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + d i l φ * bare j l' φ' = -(bare j l' φ' * d i l φ) + bard_anticomm_bard : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + bard i l φ * bard j l' φ' = -(bard j l' φ' * bard i l φ) + bard_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ UpSinglet), + bard i l φ * u j l' φ' = -(u j l' φ' * bard i l φ) + bard_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + bard i l φ * baru j l' φ' = -(baru j l' φ' * bard i l φ) + bard_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ QuarkDoublet), + bard i l φ * Q j l' φ' = -(Q j l' φ' * bard i l φ) + bard_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + bard i l φ * barQ j l' φ' = -(barQ j l' φ' * bard i l φ) + bard_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ LeptonDoublet), + bard i l φ * L j l' φ' = -(L j l' φ' * bard i l φ) + bard_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + bard i l φ * barL j l' φ' = -(barL j l' φ' * bard i l φ) + bard_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ LeptonSinglet), + bard i l φ * e j l' φ' = -(e j l' φ' * bard i l φ) + bard_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + bard i l φ * bare j l' φ' = -(bare j l' φ' * bard i l φ) + u_anticomm_u : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ UpSinglet), + u i l φ * u j l' φ' = -(u j l' φ' * u i l φ) + u_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + u i l φ * baru j l' φ' = -(baru j l' φ' * u i l φ) + u_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + u i l φ * Q j l' φ' = -(Q j l' φ' * u i l φ) + u_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + u i l φ * barQ j l' φ' = -(barQ j l' φ' * u i l φ) + u_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + u i l φ * L j l' φ' = -(L j l' φ' * u i l φ) + u_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + u i l φ * barL j l' φ' = -(barL j l' φ' * u i l φ) + u_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + u i l φ * e j l' φ' = -(e j l' φ' * u i l φ) + u_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + u i l φ * bare j l' φ' = -(bare j l' φ' * u i l φ) + baru_anticomm_baru : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + baru i l φ * baru j l' φ' = -(baru j l' φ' * baru i l φ) + baru_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ QuarkDoublet), + baru i l φ * Q j l' φ' = -(Q j l' φ' * baru i l φ) + baru_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + baru i l φ * barQ j l' φ' = -(barQ j l' φ' * baru i l φ) + baru_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ LeptonDoublet), + baru i l φ * L j l' φ' = -(L j l' φ' * baru i l φ) + baru_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + baru i l φ * barL j l' φ' = -(barL j l' φ' * baru i l φ) + baru_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ LeptonSinglet), + baru i l φ * e j l' φ' = -(e j l' φ' * baru i l φ) + baru_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + baru i l φ * bare j l' φ' = -(bare j l' φ' * baru i l φ) + Q_anticomm_Q : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ QuarkDoublet), + Q i l φ * Q j l' φ' = -(Q j l' φ' * Q i l φ) + Q_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + Q i l φ * barQ j l' φ' = -(barQ j l' φ' * Q i l φ) + Q_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonDoublet), + Q i l φ * L j l' φ' = -(L j l' φ' * Q i l φ) + Q_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + Q i l φ * barL j l' φ' = -(barL j l' φ' * Q i l φ) + Q_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + Q i l φ * e j l' φ' = -(e j l' φ' * Q i l φ) + Q_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + Q i l φ * bare j l' φ' = -(bare j l' φ' * Q i l φ) + barQ_anticomm_barQ : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + barQ i l φ * barQ j l' φ' = -(barQ j l' φ' * barQ i l φ) + barQ_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ LeptonDoublet), + barQ i l φ * L j l' φ' = -(L j l' φ' * barQ i l φ) + barQ_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + barQ i l φ * barL j l' φ' = -(barL j l' φ' * barQ i l φ) + barQ_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ LeptonSinglet), + barQ i l φ * e j l' φ' = -(e j l' φ' * barQ i l φ) + barQ_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + barQ i l φ * bare j l' φ' = -(bare j l' φ' * barQ i l φ) + L_anticomm_L : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonDoublet), + L i l φ * L j l' φ' = -(L j l' φ' * L i l φ) + L_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + L i l φ * barL j l' φ' = -(barL j l' φ' * L i l φ) + L_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + L i l φ * e j l' φ' = -(e j l' φ' * L i l φ) + L_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + L i l φ * bare j l' φ' = -(bare j l' φ' * L i l φ) + barL_anticomm_barL : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + barL i l φ * barL j l' φ' = -(barL j l' φ' * barL i l φ) + barL_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ LeptonSinglet), + barL i l φ * e j l' φ' = -(e j l' φ' * barL i l φ) + barL_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + barL i l φ * bare j l' φ' = -(bare j l' φ' * barL i l φ) + e_anticomm_e : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + e i l φ * e j l' φ' = -(e j l' φ' * e i l φ) + e_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ LeptonSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + e i l φ * bare j l' φ' = -(bare j l' φ' * e i l φ) + bare_anticomm_bare : ∀ (i j : Fin 3) {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + bare i l φ * bare j l' φ' = -(bare j l' φ' * bare i l φ) + +namespace IsFermionSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) + +set_option linter.unusedVariables false in +/-- The algebra generated by the ten fermion families and all their covariant + derivatives. -/ +def fermionAlgebra (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) : Subalgebra ℂ B := + Algebra.adjoin ℂ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (d i l) ∪ Set.range (bard i l) ∪ + Set.range (u i l) ∪ Set.range (baru i l) ∪ + Set.range (Q i l) ∪ Set.range (barQ i l) ∪ + Set.range (L i l) ∪ Set.range (barL i l) ∪ + Set.range (e i l) ∪ Set.range (bare i l)) + + +/-! + +## The fermion-derivative submodules + +-/ + +set_option linter.unusedVariables false in +/-- The submodule of `B` generated by the fermion symbols carrying exactly `n` + covariant derivatives: the join, over the families and derivative slots, of the + ranges of the ten species' symbol maps. -/ +def derivSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) (n : ℕ) : Submodule ℂ B := + ⨆ (i : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3), + LinearMap.range (d i l) ⊔ LinearMap.range (bard i l) ⊔ + LinearMap.range (u i l) ⊔ LinearMap.range (baru i l) ⊔ + LinearMap.range (Q i l) ⊔ LinearMap.range (barQ i l) ⊔ + LinearMap.range (L i l) ⊔ LinearMap.range (barL i l) ⊔ + LinearMap.range (e i l) ⊔ LinearMap.range (bare i l) + +/-- The derivative submodule as the span of the fermion symbol values. -/ +lemma derivSubmodule_eq_span (n : ℕ) : + h.derivSubmodule n = Submodule.span ℂ + (⋃ (i : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (d i l) ∪ Set.range (bard i l) ∪ + Set.range (u i l) ∪ Set.range (baru i l) ∪ + Set.range (Q i l) ∪ Set.range (barQ i l) ∪ + Set.range (L i l) ∪ Set.range (barL i l) ∪ + Set.range (e i l) ∪ Set.range (bare i l)) := by + refine le_antisymm ?_ (Submodule.span_le.mpr fun x hx => ?_) + · rw [derivSubmodule] + refine iSup_le fun i => iSup_le fun l => sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (⟨φ, rfl⟩)))))))))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))))))))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)))))))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))))))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)))))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)⟩⟩) + · rintro x ⟨φ, rfl⟩ + exact Submodule.subset_span (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨l, + Set.mem_union_right _ ⟨φ, rfl⟩⟩⟩) + · simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hx + obtain ⟨i, l, (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩)⟩ := hx + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (⟨φ, rfl⟩))))))))))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))))))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))) + · exact Submodule.mem_iSup_of_mem i (Submodule.mem_iSup_of_mem l + (Submodule.mem_sup_right ⟨φ, rfl⟩)) + +/-- Any two elements of the fermion derivative submodules anticommute: the pairwise + anticommutation of the symbols extends bilinearly to the spans. -/ +lemma anticomm_of_mem_derivSubmodule {n m : ℕ} {x y : B} + (hx : x ∈ h.derivSubmodule n) (hy : y ∈ h.derivSubmodule m) : + x * y = -(y * x) := by + rw [derivSubmodule_eq_span] at hx hy + induction hx using Submodule.span_induction with + | mem a ha => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at ha + obtain ⟨i, l, (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩)⟩ := ha + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · exact h.d_anticomm_d i i' l l' φ φ' + · exact h.d_anticomm_bard i i' l l' φ φ' + · exact h.d_anticomm_u i i' l l' φ φ' + · exact h.d_anticomm_baru i i' l l' φ φ' + · exact h.d_anticomm_Q i i' l l' φ φ' + · exact h.d_anticomm_barQ i i' l l' φ φ' + · exact h.d_anticomm_L i i' l l' φ φ' + · exact h.d_anticomm_barL i i' l l' φ φ' + · exact h.d_anticomm_e i i' l l' φ φ' + · exact h.d_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_bard i' i l' l φ' φ, neg_neg] + · exact h.bard_anticomm_bard i i' l l' φ φ' + · exact h.bard_anticomm_u i i' l l' φ φ' + · exact h.bard_anticomm_baru i i' l l' φ φ' + · exact h.bard_anticomm_Q i i' l l' φ φ' + · exact h.bard_anticomm_barQ i i' l l' φ φ' + · exact h.bard_anticomm_L i i' l l' φ φ' + · exact h.bard_anticomm_barL i i' l l' φ φ' + · exact h.bard_anticomm_e i i' l l' φ φ' + · exact h.bard_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_u i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_u i' i l' l φ' φ, neg_neg] + · exact h.u_anticomm_u i i' l l' φ φ' + · exact h.u_anticomm_baru i i' l l' φ φ' + · exact h.u_anticomm_Q i i' l l' φ φ' + · exact h.u_anticomm_barQ i i' l l' φ φ' + · exact h.u_anticomm_L i i' l l' φ φ' + · exact h.u_anticomm_barL i i' l l' φ φ' + · exact h.u_anticomm_e i i' l l' φ φ' + · exact h.u_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_baru i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_baru i' i l' l φ' φ, neg_neg] + · rw [h.u_anticomm_baru i' i l' l φ' φ, neg_neg] + · exact h.baru_anticomm_baru i i' l l' φ φ' + · exact h.baru_anticomm_Q i i' l l' φ φ' + · exact h.baru_anticomm_barQ i i' l l' φ φ' + · exact h.baru_anticomm_L i i' l l' φ φ' + · exact h.baru_anticomm_barL i i' l l' φ φ' + · exact h.baru_anticomm_e i i' l l' φ φ' + · exact h.baru_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_Q i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_Q i' i l' l φ' φ, neg_neg] + · rw [h.u_anticomm_Q i' i l' l φ' φ, neg_neg] + · rw [h.baru_anticomm_Q i' i l' l φ' φ, neg_neg] + · exact h.Q_anticomm_Q i i' l l' φ φ' + · exact h.Q_anticomm_barQ i i' l l' φ φ' + · exact h.Q_anticomm_L i i' l l' φ φ' + · exact h.Q_anticomm_barL i i' l l' φ φ' + · exact h.Q_anticomm_e i i' l l' φ φ' + · exact h.Q_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_barQ i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_barQ i' i l' l φ' φ, neg_neg] + · rw [h.u_anticomm_barQ i' i l' l φ' φ, neg_neg] + · rw [h.baru_anticomm_barQ i' i l' l φ' φ, neg_neg] + · rw [h.Q_anticomm_barQ i' i l' l φ' φ, neg_neg] + · exact h.barQ_anticomm_barQ i i' l l' φ φ' + · exact h.barQ_anticomm_L i i' l l' φ φ' + · exact h.barQ_anticomm_barL i i' l l' φ φ' + · exact h.barQ_anticomm_e i i' l l' φ φ' + · exact h.barQ_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_L i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_L i' i l' l φ' φ, neg_neg] + · rw [h.u_anticomm_L i' i l' l φ' φ, neg_neg] + · rw [h.baru_anticomm_L i' i l' l φ' φ, neg_neg] + · rw [h.Q_anticomm_L i' i l' l φ' φ, neg_neg] + · rw [h.barQ_anticomm_L i' i l' l φ' φ, neg_neg] + · exact h.L_anticomm_L i i' l l' φ φ' + · exact h.L_anticomm_barL i i' l l' φ φ' + · exact h.L_anticomm_e i i' l l' φ φ' + · exact h.L_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_barL i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_barL i' i l' l φ' φ, neg_neg] + · rw [h.u_anticomm_barL i' i l' l φ' φ, neg_neg] + · rw [h.baru_anticomm_barL i' i l' l φ' φ, neg_neg] + · rw [h.Q_anticomm_barL i' i l' l φ' φ, neg_neg] + · rw [h.barQ_anticomm_barL i' i l' l φ' φ, neg_neg] + · rw [h.L_anticomm_barL i' i l' l φ' φ, neg_neg] + · exact h.barL_anticomm_barL i i' l l' φ φ' + · exact h.barL_anticomm_e i i' l l' φ φ' + · exact h.barL_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_e i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_e i' i l' l φ' φ, neg_neg] + · rw [h.u_anticomm_e i' i l' l φ' φ, neg_neg] + · rw [h.baru_anticomm_e i' i l' l φ' φ, neg_neg] + · rw [h.Q_anticomm_e i' i l' l φ' φ, neg_neg] + · rw [h.barQ_anticomm_e i' i l' l φ' φ, neg_neg] + · rw [h.L_anticomm_e i' i l' l φ' φ, neg_neg] + · rw [h.barL_anticomm_e i' i l' l φ' φ, neg_neg] + · exact h.e_anticomm_e i i' l l' φ φ' + · exact h.e_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + · induction hy using Submodule.span_induction with + | mem b hb => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i', l', (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · rw [h.d_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.bard_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.u_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.baru_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.Q_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.barQ_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.L_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.barL_anticomm_bare i' i l' l φ' φ, neg_neg] + · rw [h.e_anticomm_bare i' i l' l φ' φ, neg_neg] + · exact h.bare_anticomm_bare i i' l l' φ φ' + | zero => simp + | add b₁ b₂ _ _ ih₁ ih₂ => rw [mul_add, ih₁, ih₂, add_mul, neg_add] + | smul c b _ ih => rw [mul_smul_comm, ih, smul_mul_assoc, smul_neg] + | zero => simp + | add a₁ a₂ _ _ ih₁ ih₂ => rw [add_mul, ih₁, ih₂, mul_add, neg_add] + | smul c a _ ih => rw [smul_mul_assoc, ih, mul_smul_comm, smul_neg] + +/-- The fermion derivative submodules commute with one another as submodules: the + sign from anticommutation is absorbed by the span. -/ +lemma derivSubmodule_mul_comm (n m : ℕ) : + h.derivSubmodule n * h.derivSubmodule m = h.derivSubmodule m * h.derivSubmodule n := by + refine le_antisymm ?_ ?_ <;> + · rw [Submodule.mul_le] + intro x hx y hy + rw [h.anticomm_of_mem_derivSubmodule hx hy] + exact Submodule.neg_mem _ (Submodule.mul_mem_mul hy hx) + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean new file mode 100644 index 000000000..4f92d62f6 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean @@ -0,0 +1,593 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsFermionSector.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +/-! +# The gauge weight decomposition of the fermion sector + +The gauge torus acts diagonally on the basis of each fermion value space, with +weights given by the colour and isospin weights of the fundamental representations +and the species' hypercharge. Through the dual (and, for the barred species, the +conjugate-dual) this makes every symbol component a simultaneous eigenvector, and the +derivative submodules of the fermion sector decompose by gauge weight +(`derivSubmoduleGaugeWeight`), for every number of covariant derivatives. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups + +/-! + +## A. `expI` helpers + +-/ + +lemma starRingEnd_expI_pow (n : ℕ) : + ((starRingEnd ℂ) (expI : ℂ)) ^ n = ((expI : ℂ) ^ n)⁻¹ := by + rw [← inv_pow, expI_inv_eq_star] + rfl + +lemma starRingEnd_expI_zpow (z : ℤ) : + (starRingEnd ℂ) ((expI : ℂ) ^ z) = (expI : ℂ) ^ (-z) := by + rw [map_zpow₀, _root_.zpow_neg, ← _root_.inv_zpow] + congr 1 + rw [expI_inv_eq_star] + rfl + +lemma expI_zpow_ne_zero (z : ℤ) : ((expI : ℂ) ^ z) ≠ 0 := + zpow_ne_zero _ (by simpa [expI] using Complex.exp_ne_zero Complex.I) + +/-! + +## B. The torus weights of the fermion value spaces + +-/ + +/-- The colour weights of the fundamental of `SU(3)` against the two colour torus + generators. -/ +def colourWeight (c : Fin 3) : ℤ × ℤ := ![(1, 0), (-1, 1), (0, -1)] c + +/-- The isospin weight of the fundamental of `SU(2)` against the isospin torus + generator. -/ +def isoWeight (s : Fin 2) : ℤ := ![1, -1] s + +/-- The gauge weight of the down-singlet basis: the colour weights and hypercharge + `-2`. -/ +def DownSinglet.valueGaugeWeight (j : Fin 2 × Fin 3) : GaugeWeight := + ((colourWeight j.2).1, (colourWeight j.2).2, 0, -2) + +/-- The gauge weight of the up-singlet basis: the colour weights and hypercharge + `4`. -/ +def UpSinglet.valueGaugeWeight (j : Fin 2 × Fin 3) : GaugeWeight := + ((colourWeight j.2).1, (colourWeight j.2).2, 0, 4) + +/-- The gauge weight of the quark-doublet basis: the colour and isospin weights and + hypercharge `1`. -/ +def QuarkDoublet.valueGaugeWeight (j : Fin 2 × Fin 3 × Fin 2) : GaugeWeight := + ((colourWeight j.2.1).1, (colourWeight j.2.1).2, isoWeight j.2.2, 1) + +/-- The gauge weight of the lepton-doublet basis: the isospin weight and hypercharge + `-3`. -/ +def LeptonDoublet.valueGaugeWeight (j : Fin 2 × Fin 2) : GaugeWeight := + (0, 0, isoWeight j.2, -3) + +/-- The gauge weight of the lepton-singlet basis: hypercharge `-6`. -/ +def LeptonSinglet.valueGaugeWeight (_ : Fin 2) : GaugeWeight := + (0, 0, 0, -6) + +/-! + +## C. The torus action on the value-space bases + +-/ + +/-- The gauge torus acts diagonally on the basis of `DownSinglet`, with the weights + `DownSinglet.valueGaugeWeight`. -/ +lemma DownSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3) : + DownSinglet.repGaugeGroupI (gaugeTorusGen i) (DownSinglet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i) • + DownSinglet.basis j := by + obtain ⟨k, c⟩ := j + have hb : DownSinglet.basis (k, c) = ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by + simp only [DownSinglet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] + rfl + rw [hb, DownSinglet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, + Matrix.diagonal, + DownSinglet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, + expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> + (try (congr 1 <;> norm_num)) + +/-- The gauge torus acts diagonally on the basis of `UpSinglet`, with the weights + `UpSinglet.valueGaugeWeight`. -/ +lemma UpSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3) : + UpSinglet.repGaugeGroupI (gaugeTorusGen i) (UpSinglet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i) • + UpSinglet.basis j := by + obtain ⟨k, c⟩ := j + have hb : UpSinglet.basis (k, c) = ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by + simp only [UpSinglet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] + rfl + rw [hb, UpSinglet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, + Matrix.diagonal, + UpSinglet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, + expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> + (try (congr 1 <;> norm_num)) + +/-- The gauge torus acts diagonally on the basis of `QuarkDoublet`, with the weights + `QuarkDoublet.valueGaugeWeight`. -/ +lemma QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : + QuarkDoublet.repGaugeGroupI (gaugeTorusGen i) (QuarkDoublet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i) • + QuarkDoublet.basis j := by + obtain ⟨k, c, s⟩ := j + have hb : QuarkDoublet.basis (k, c, s) = ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c ⊗ₜ[ℂ] + EuclideanSpace.basisFun (Fin 2) ℂ s⟩ := by + simp only [QuarkDoublet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis, + Module.Basis.reindex_apply, Equiv.prodAssoc_symm_apply] + rfl + rw [hb, QuarkDoublet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases c <;> fin_cases s <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, GaugeGroupI.toSU2, su2ExpI, Fin.sum_univ_two, + Matrix.diagonal, + QuarkDoublet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, + expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> + (try (congr 1 <;> norm_num)) + +/-- The gauge torus acts diagonally on the basis of `LeptonDoublet`, with the weights + `LeptonDoublet.valueGaugeWeight`. -/ +lemma LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 2) : + LeptonDoublet.repGaugeGroupI (gaugeTorusGen i) (LeptonDoublet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i) • + LeptonDoublet.basis j := by + obtain ⟨k, s⟩ := j + have hb : LeptonDoublet.basis (k, s) = ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ s⟩ := by + simp only [LeptonDoublet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] + rfl + rw [hb, LeptonDoublet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases s <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI, Fin.sum_univ_two, + Matrix.diagonal, + LeptonDoublet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, + expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> + (try (congr 1 <;> norm_num)) + +/-- The gauge torus acts diagonally on the basis of `LeptonSinglet`, with the weights + `LeptonSinglet.valueGaugeWeight`. -/ +lemma LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2) : + LeptonSinglet.repGaugeGroupI (gaugeTorusGen i) (LeptonSinglet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i) • + LeptonSinglet.basis j := by + have hb : LeptonSinglet.basis j = ⟨Fermion.RightHandedWeyl.basis j⟩ := by + simp only [LeptonSinglet.basis, Module.Basis.map_apply] + rfl + rw [hb, LeptonSinglet.repGaugeGroupI_basis] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, Matrix.diagonal, + LeptonSinglet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, + expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> + (try (congr 1 <;> norm_num)) + +/-! + +## D. The dual and conjugate-dual actions on the coordinate functionals + +-/ + +section Bridges + +variable {V : Type} [AddCommGroup V] [Module ℂ V] {ι : Type} [Fintype ι] [DecidableEq ι] + +lemma dual_gaugeTorusGen_coord (ρ : Representation ℂ GaugeGroupI V) + (b : Module.Basis ι ℂ V) (g : GaugeGroupI) (w : ι → ℤ) + (hb : ∀ j, ρ g (b j) = ((expI : ℂ) ^ w j) • b j) (j : ι) : + ρ.dual g (b.coord j) = ((expI : ℂ) ^ (-(w j))) • b.coord j := by + have hinv : ∀ j', ρ g⁻¹ (b j') = ((expI : ℂ) ^ (-(w j'))) • b j' := by + intro j' + have h1 : ρ g⁻¹ (ρ g (b j')) = b j' := by + rw [← Module.End.mul_apply, ← map_mul, inv_mul_cancel, map_one, + Module.End.one_apply] + rw [hb j', map_smul] at h1 + rw [_root_.zpow_neg] + exact ((inv_smul_eq_iff₀ (expI_zpow_ne_zero (w j'))).mpr h1.symm).symm + refine b.ext fun j' => ?_ + rw [Representation.dual_apply] + simp only [Module.Dual.transpose_apply, LinearMap.comp_apply, hinv j', map_smul, + LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, smul_eq_mul] + by_cases hne : j' = j + · subst hne + simp + · simp [Finsupp.single_apply, hne] + +lemma conj_gaugeTorusGen_basis (ρ : Representation ℂ GaugeGroupI V) + (b : Module.Basis ι ℂ V) (g : GaugeGroupI) (w : ι → ℤ) + (hb : ∀ j, ρ g (b j) = ((expI : ℂ) ^ w j) • b j) (j : ι) : + ρ.conj g (Module.Basis.conj b j) + = ((expI : ℂ) ^ (-(w j))) • Module.Basis.conj b j := by + simp only [Module.Basis.conj_apply, Representation.conj_apply, + LinearEquiv.symm_apply_apply, hb j, map_smulₛₗ, starRingEnd_expI_zpow] + +lemma range_eq_iSup_span {M : Type} [AddCommGroup M] [Module ℂ M] + (b : Module.Basis ι ℂ V) (f : Module.Dual ℂ V →ₗ[ℂ] M) : + LinearMap.range f = ⨆ j, Submodule.span ℂ {f (b.coord j)} := by + rw [LinearMap.range_eq_map, ← b.dualBasis.span_eq, Submodule.map_span, ← Set.range_comp] + rw [show (⇑f ∘ ⇑b.dualBasis) = fun j => f (b.coord j) from funext fun j => by + simp [Module.Basis.coe_dualBasis]] + rw [Submodule.span_range_eq_iSup] + +end Bridges + +/-- The dual action of the gauge torus on the coordinate functionals of + `DownSinglet`: the weights are negated. -/ +lemma DownSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + DownSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (DownSinglet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i))) • + DownSinglet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => DownSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `DownSinglet`: the two negations cancel and the weights are those of + the value space. -/ +lemma DownSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + DownSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((DownSinglet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i) • + (DownSinglet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord DownSinglet.repGaugeGroupI.conj (DownSinglet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (DownSinglet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => DownSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + +/-- The dual action of the gauge torus on the coordinate functionals of + `UpSinglet`: the weights are negated. -/ +lemma UpSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + UpSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (UpSinglet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i))) • + UpSinglet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => UpSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `UpSinglet`: the two negations cancel and the weights are those of + the value space. -/ +lemma UpSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + UpSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((UpSinglet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i) • + (UpSinglet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord UpSinglet.repGaugeGroupI.conj (UpSinglet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (UpSinglet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => UpSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + +/-- The dual action of the gauge torus on the coordinate functionals of + `QuarkDoublet`: the weights are negated. -/ +lemma QuarkDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : + QuarkDoublet.repGaugeGroupI.dual (gaugeTorusGen i) (QuarkDoublet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i))) • + QuarkDoublet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `QuarkDoublet`: the two negations cancel and the weights are those of + the value space. -/ +lemma QuarkDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : + QuarkDoublet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((QuarkDoublet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i) • + (QuarkDoublet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord QuarkDoublet.repGaugeGroupI.conj (QuarkDoublet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + +/-- The dual action of the gauge torus on the coordinate functionals of + `LeptonDoublet`: the weights are negated. -/ +lemma LeptonDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 2) : + LeptonDoublet.repGaugeGroupI.dual (gaugeTorusGen i) (LeptonDoublet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i))) • + LeptonDoublet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `LeptonDoublet`: the two negations cancel and the weights are those of + the value space. -/ +lemma LeptonDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 2) : + LeptonDoublet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((LeptonDoublet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i) • + (LeptonDoublet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord LeptonDoublet.repGaugeGroupI.conj (LeptonDoublet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + +/-- The dual action of the gauge torus on the coordinate functionals of + `LeptonSinglet`: the weights are negated. -/ +lemma LeptonSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2) : + LeptonSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (LeptonSinglet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i))) • + LeptonSinglet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `LeptonSinglet`: the two negations cancel and the weights are those of + the value space. -/ +lemma LeptonSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2) : + LeptonSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((LeptonSinglet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i) • + (LeptonSinglet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord LeptonSinglet.repGaugeGroupI.conj (LeptonSinglet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + +/-! + +## E. The gauge weight decomposition of the derivative submodules + +-/ + +namespace IsFermionSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) + +include h in +/-- The gauge torus acts diagonally on the `d` symbol components. -/ +lemma repGauge_gaugeTorusGen_d (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen i) (d f l ((DownSinglet.basis).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (-(DownSinglet.valueGaugeWeight j)) i) • d f l ((DownSinglet.basis).coord j) := by + rw [h.repGauge_d, DownSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord, map_smul, GaugeWeight.coord_neg] + +include h in +/-- The gauge torus acts diagonally on the `bard` symbol components. -/ +lemma repGauge_gaugeTorusGen_bard (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen i) (bard f l ((DownSinglet.basis.conj).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i) • bard f l ((DownSinglet.basis.conj).coord j) := by + rw [h.repGauge_bard, DownSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord, map_smul] + +include h in +/-- The gauge torus acts diagonally on the `u` symbol components. -/ +lemma repGauge_gaugeTorusGen_u (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen i) (u f l ((UpSinglet.basis).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (-(UpSinglet.valueGaugeWeight j)) i) • u f l ((UpSinglet.basis).coord j) := by + rw [h.repGauge_u, UpSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord, map_smul, GaugeWeight.coord_neg] + +include h in +/-- The gauge torus acts diagonally on the `baru` symbol components. -/ +lemma repGauge_gaugeTorusGen_baru (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen i) (baru f l ((UpSinglet.basis.conj).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i) • baru f l ((UpSinglet.basis.conj).coord j) := by + rw [h.repGauge_baru, UpSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord, map_smul] + +include h in +/-- The gauge torus acts diagonally on the `Q` symbol components. -/ +lemma repGauge_gaugeTorusGen_Q (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : + repGauge (gaugeTorusGen i) (Q f l ((QuarkDoublet.basis).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (-(QuarkDoublet.valueGaugeWeight j)) i) • Q f l ((QuarkDoublet.basis).coord j) := by + rw [h.repGauge_Q, QuarkDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord, map_smul, GaugeWeight.coord_neg] + +include h in +/-- The gauge torus acts diagonally on the `barQ` symbol components. -/ +lemma repGauge_gaugeTorusGen_barQ (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : + repGauge (gaugeTorusGen i) (barQ f l ((QuarkDoublet.basis.conj).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i) • barQ f l ((QuarkDoublet.basis.conj).coord j) := by + rw [h.repGauge_barQ, QuarkDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord, map_smul] + +include h in +/-- The gauge torus acts diagonally on the `L` symbol components. -/ +lemma repGauge_gaugeTorusGen_L (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge (gaugeTorusGen i) (L f l ((LeptonDoublet.basis).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (-(LeptonDoublet.valueGaugeWeight j)) i) • L f l ((LeptonDoublet.basis).coord j) := by + rw [h.repGauge_L, LeptonDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord, map_smul, GaugeWeight.coord_neg] + +include h in +/-- The gauge torus acts diagonally on the `barL` symbol components. -/ +lemma repGauge_gaugeTorusGen_barL (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge (gaugeTorusGen i) (barL f l ((LeptonDoublet.basis.conj).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i) • barL f l ((LeptonDoublet.basis.conj).coord j) := by + rw [h.repGauge_barL, LeptonDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord, map_smul] + +include h in +/-- The gauge torus acts diagonally on the `e` symbol components. -/ +lemma repGauge_gaugeTorusGen_e (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : + repGauge (gaugeTorusGen i) (e f l ((LeptonSinglet.basis).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (-(LeptonSinglet.valueGaugeWeight j)) i) • e f l ((LeptonSinglet.basis).coord j) := by + rw [h.repGauge_e, LeptonSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord, map_smul, GaugeWeight.coord_neg] + +include h in +/-- The gauge torus acts diagonally on the `bare` symbol components. -/ +lemma repGauge_gaugeTorusGen_bare (i : Fin 4) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : + repGauge (gaugeTorusGen i) (bare f l ((LeptonSinglet.basis.conj).coord j)) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i) • bare f l ((LeptonSinglet.basis.conj).coord j) := by + rw [h.repGauge_bare, LeptonSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord, map_smul] + +/-- The gauge weight decomposition of the range of the `d` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_d (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (d f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 3 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (-(DownSinglet.valueGaugeWeight j)) + (fun i => h.repGauge_gaugeTorusGen_d i f l j)) + _ (range_eq_iSup_span (DownSinglet.basis) (d f l)) + +/-- The gauge weight decomposition of the range of the `bard` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_bard (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (bard f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 3 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (DownSinglet.valueGaugeWeight j) + (fun i => h.repGauge_gaugeTorusGen_bard i f l j)) + _ (range_eq_iSup_span (DownSinglet.basis.conj) (bard f l)) + +/-- The gauge weight decomposition of the range of the `u` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_u (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (u f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 3 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (-(UpSinglet.valueGaugeWeight j)) + (fun i => h.repGauge_gaugeTorusGen_u i f l j)) + _ (range_eq_iSup_span (UpSinglet.basis) (u f l)) + +/-- The gauge weight decomposition of the range of the `baru` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_baru (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (baru f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 3 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (UpSinglet.valueGaugeWeight j) + (fun i => h.repGauge_gaugeTorusGen_baru i f l j)) + _ (range_eq_iSup_span (UpSinglet.basis.conj) (baru f l)) + +/-- The gauge weight decomposition of the range of the `Q` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_Q (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (Q f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 3 × Fin 2 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (-(QuarkDoublet.valueGaugeWeight j)) + (fun i => h.repGauge_gaugeTorusGen_Q i f l j)) + _ (range_eq_iSup_span (QuarkDoublet.basis) (Q f l)) + +/-- The gauge weight decomposition of the range of the `barQ` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_barQ (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (barQ f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 3 × Fin 2 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (QuarkDoublet.valueGaugeWeight j) + (fun i => h.repGauge_gaugeTorusGen_barQ i f l j)) + _ (range_eq_iSup_span (QuarkDoublet.basis.conj) (barQ f l)) + +/-- The gauge weight decomposition of the range of the `L` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_L (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (L f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 2 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (-(LeptonDoublet.valueGaugeWeight j)) + (fun i => h.repGauge_gaugeTorusGen_L i f l j)) + _ (range_eq_iSup_span (LeptonDoublet.basis) (L f l)) + +/-- The gauge weight decomposition of the range of the `barL` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_barL (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (barL f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 × Fin 2 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (LeptonDoublet.valueGaugeWeight j) + (fun i => h.repGauge_gaugeTorusGen_barL i f l j)) + _ (range_eq_iSup_span (LeptonDoublet.basis.conj) (barL f l)) + +/-- The gauge weight decomposition of the range of the `e` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_e (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (e f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (-(LeptonSinglet.valueGaugeWeight j)) + (fun i => h.repGauge_gaugeTorusGen_e i f l j)) + _ (range_eq_iSup_span (LeptonSinglet.basis) (e f l)) + +/-- The gauge weight decomposition of the range of the `bare` symbols. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight_bare (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (LinearMap.range (bare f l)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun j : Fin 2 => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul _ (LeptonSinglet.valueGaugeWeight j) + (fun i => h.repGauge_gaugeTorusGen_bare i f l j)) + _ (range_eq_iSup_span (LeptonSinglet.basis.conj) (bare f l)) + +/-- **The gauge weight decomposition of the fermion derivative submodules**, for any + number of covariant derivatives: the join, over families, derivative slots and the + ten species, of the spans of the symbol components, each of pure gauge weight. -/ +@[implicit_reducible] +noncomputable def derivSubmoduleGaugeWeight (n : ℕ) : + GaugeWeightDecomposition repGauge (h.derivSubmodule n) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun f : Fin 3 => + GaugeWeightDecomposition.iSup hrepGauge_mul fun l : Fin n → Fin 1 ⊕ Fin 3 => + GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := h.rangeGaugeWeight_d f l) + (d' := h.rangeGaugeWeight_bard f l)) + (d' := h.rangeGaugeWeight_u f l)) + (d' := h.rangeGaugeWeight_baru f l)) + (d' := h.rangeGaugeWeight_Q f l)) + (d' := h.rangeGaugeWeight_barQ f l)) + (d' := h.rangeGaugeWeight_L f l)) + (d' := h.rangeGaugeWeight_barL f l)) + (d' := h.rangeGaugeWeight_e f l)) + (d' := h.rangeGaugeWeight_bare f l)) + _ (by rw [derivSubmodule]) + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight.lean new file mode 100644 index 000000000..15f54c22c --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight.lean @@ -0,0 +1,585 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsFermionSector.Basic +/-! +# The mass-weight grading of the fermion sector + +The elements of the fermion algebra of a given mass weight form a submodule; a +fermion tower with `n` covariant derivatives has weight `3 + 2 * n`, an element of +positive weight decomposes into towers of that weight and products of elements of +lower weight (`massWeightSubmodule_eq`), and the submodules of weight at most eight +are written out explicitly in terms of the derivative submodules — with the weight +recursion and the commutation of the derivative submodules collapsing weight eight to +the single kinetic sector `derivSubmodule 0 * derivSubmodule 1`. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace IsFermionSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) + +/-- All elements of the fermion algebra of mass weight exactly `w`: the intersection + of the algebra generated by the fermion towers with the part on which + `massWeightPoly` is the monomial `X ^ w`. -/ +noncomputable def massWeightSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) (w : ℕ) : + Submodule ℂ B := + (h.fermionAlgebra).toSubmodule + ⊓ LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial w : B →ₗ[B] Polynomial B).restrictScalars ℂ) + +lemma massWeightPoly_of_mem_massWeightSubmodule {w : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule w) : + massWeightPoly x = Polynomial.monomial w x := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + rcases hx with ⟨-, hx'⟩ + rw [LinearMap.mem_ker] at hx' + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] at hx' + exact hx' + +lemma mem_fermionAlgebra_of_mem_massWeightSubmodule {w : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule w) : x ∈ h.fermionAlgebra := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + exact hx.1 + +/-- A fermion tower with `n` covariant derivatives has mass weight `3 + 2 * n`. -/ +lemma derivSubmodule_le_massWeightSubmodule (n : ℕ) : + h.derivSubmodule n ≤ h.massWeightSubmodule (3 + 2 * n) := by + rw [derivSubmodule] + refine iSup_le fun i => iSup_le fun l => sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (⟨φ, rfl⟩)))))))))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_d i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))))))))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_bard i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)))))))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_u i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))))))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_baru i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)))))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_Q i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_barQ i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_L i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩))⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_barL i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_left _ (Set.mem_union_right _ ⟨φ, rfl⟩)⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_e i l] + · rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Set.mem_union_right _ ⟨φ, rfl⟩⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_bare i l] + +lemma one_le_massWeightSubmodule_zero : (1 : Submodule ℂ B) ≤ h.massWeightSubmodule 0 := by + rw [Submodule.one_eq_span, Submodule.span_le, Set.singleton_subset_iff, SetLike.mem_coe, + massWeightSubmodule, Submodule.mem_inf] + refine ⟨Subalgebra.one_mem _, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero, map_one] + simp + +lemma massWeightSubmodule_mul_le (m n : ℕ) : + h.massWeightSubmodule m * h.massWeightSubmodule n ≤ h.massWeightSubmodule (m + n) := by + rw [Submodule.mul_le] + intro x hx y hy + have hx' := hx + have hy' := hy + rw [massWeightSubmodule, Submodule.mem_inf] at hx hy + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Subalgebra.mul_mem _ hx.1 hy.1, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [map_mul, h.massWeightPoly_of_mem_massWeightSubmodule hx', + h.massWeightPoly_of_mem_massWeightSubmodule hy', Polynomial.monomial_mul_monomial] + +/-- **The weight recursion**: an element of positive mass weight `i` is a sum of + single fermion towers of weight `i` and of products of two elements of lower + positive weights summing to `i`. -/ +lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : + h.massWeightSubmodule i + = (⨆ k ∈ Finset.univ.filter (fun k : Fin i => 3 + 2 * (k : ℕ) = i), + h.derivSubmodule (k : ℕ)) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin i × Fin i => (p.1 : ℕ) + (p.2 : ℕ) = i), + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := by + refine le_antisymm (fun b hb => ?_) (sup_le ?_ ?_) + · -- the weight-zero component of an element of the algebra is a scalar + have hzero : ∀ x ∈ h.fermionAlgebra, (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B) := by + intro x hx + rw [fermionAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨j, k, dd, (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩)⟩ := hy + · rw [h.massWeight_d, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_bard, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_u, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_baru, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_Q, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_barQ, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_L, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_barL, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_e, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · rw [h.massWeight_bare, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + | algebraMap r => + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] + exact Submodule.mem_one.mpr ⟨r, rfl⟩ + | add x y hx hy ihx ihy => + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ ihx ihy + | mul x y hx hy ihx ihy => + rw [map_mul, Polynomial.mul_coeff_zero] + have hmem := Submodule.mul_mem_mul ihx ihy + rwa [Submodule.one_mul] at hmem + -- the components of an element of the algebra are homogeneous + have hcomp : ∀ x ∈ h.fermionAlgebra, ∀ m, (massWeightPoly x).coeff m + ∈ h.massWeightSubmodule m := by + intro x hx + rw [fermionAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨j, k, dd, (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩)⟩ := hy + · intro m + rw [h.massWeight_d, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (⟨φ, rfl⟩)))))))))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_bard, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_u, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_baru, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_Q, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_barQ, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_L, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_barL, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))) + · exact zero_mem _ + · intro m + rw [h.massWeight_e, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))) + · exact zero_mem _ + · intro m + rw [h.massWeight_bare, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_right ⟨φ, rfl⟩))) + · exact zero_mem _ + | algebraMap r => + intro m + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs with hm + · subst hm + exact h.one_le_massWeightSubmodule_zero (Submodule.mem_one.mpr ⟨r, rfl⟩) + · exact zero_mem _ + | add x y hx hy ihx ihy => + intro m + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m) (ihy m) + | mul x y hx hy ihx ihy => + intro m + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + have hsum := Finset.mem_antidiagonal.mp hp + subst hsum + exact h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (ihx p.1) (ihy p.2)) + -- the weight-`m` component lands in the right-hand side, for every positive `m` + have main : ∀ x ∈ h.fermionAlgebra, ∀ m, 0 < m → (massWeightPoly x).coeff m + ∈ (⨆ k ∈ Finset.univ.filter (fun k : Fin m => 3 + 2 * (k : ℕ) = m), + h.derivSubmodule (k : ℕ)) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin m × Fin m => (p.1 : ℕ) + (p.2 : ℕ) = m), + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := by + intro x hx + rw [fermionAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨j, k, dd, (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩)⟩ := hy + · intro m _ + rw [h.massWeight_d, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (⟨φ, rfl⟩)))))))))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_bard, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_u, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_baru, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_Q, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_barQ, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_L, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_barL, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩))))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_e, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_left (Submodule.mem_sup_right ⟨φ, rfl⟩)))))) + · exact zero_mem _ + · intro m _ + rw [h.massWeight_bare, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem j (Submodule.mem_iSup_of_mem dd + (Submodule.mem_sup_right ⟨φ, rfl⟩))))) + · exact zero_mem _ + | algebraMap r => + intro m hm + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, if_neg (by omega : ¬ m = 0)] + exact zero_mem _ + | add x y hx hy ihx ihy => + intro m hm + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m hm) (ihy m hm) + | mul x y hx hy ihx ihy => + intro m hm + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + obtain ⟨j, l⟩ := p + have hsum := Finset.mem_antidiagonal.mp hp + simp only at hsum ⊢ + rcases Nat.eq_zero_or_pos j with rfl | hj + · have hlm : l = m := by omega + rw [hlm] + have hmem := Submodule.mul_mem_mul (hzero x hx) (ihy m hm) + rwa [Submodule.one_mul] at hmem + · rcases Nat.eq_zero_or_pos l with rfl | hl + · have hjm : j = m := by omega + rw [hjm] + have hmem := Submodule.mul_mem_mul (ihx m hm) (hzero y hy) + rwa [Submodule.mul_one] at hmem + · refine Submodule.mem_sup_right (Submodule.mem_iSup_of_mem + ((⟨⟨j, by omega⟩, ⟨l, by omega⟩⟩ : Fin m × Fin m)) + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hsum⟩) ?_)) + exact Submodule.mul_mem_mul (hcomp x hx j) (hcomp y hy l) + have hb' := hb + rw [massWeightSubmodule, Submodule.mem_inf] at hb + have hmain := main b hb.1 i hi + rwa [h.massWeightPoly_of_mem_massWeightSubmodule hb', Polynomial.coeff_monomial, + if_pos rfl] at hmain + · refine iSup_le fun k => iSup_le fun hk => ?_ + have hk' := (Finset.mem_filter.mp hk).2 + exact (h.derivSubmodule_le_massWeightSubmodule (k : ℕ)).trans (le_of_eq (by rw [hk'])) + · refine iSup_le fun p => iSup_le fun hp => ?_ + have hp' := (Finset.mem_filter.mp hp).2 + exact (h.massWeightSubmodule_mul_le (p.1 : ℕ) (p.2 : ℕ)).trans (le_of_eq (by rw [hp'])) + +/-! + +## The mass-weight submodules in low weight + +-/ + +/-- There is nothing of weight one: no fermion tower is that light, and no product splits it. -/ +lemma massWeightSubmodule_one_eq : + h.massWeightSubmodule 1 = ⊥ := by + rw [h.massWeightSubmodule_eq 1 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 1 => 3 + 2 * (k : ℕ) = 1)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 1 × Fin 1 => (p.1 : ℕ) + (p.2 : ℕ) = 1)) + = ∅ from by decide] + simp + +/-- There is nothing of weight two. -/ +lemma massWeightSubmodule_two_eq : + h.massWeightSubmodule 2 = ⊥ := by + rw [h.massWeightSubmodule_eq 2 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 2 => 3 + 2 * (k : ℕ) = 2)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 2 × Fin 2 => (p.1 : ℕ) + (p.2 : ℕ) = 2)) + = {(1, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, h.massWeightSubmodule_one_eq] + +/-- Weight three is the underived fermion towers. -/ +lemma massWeightSubmodule_three_eq : + h.massWeightSubmodule 3 = h.derivSubmodule 0 := by + rw [h.massWeightSubmodule_eq 3 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 3 => 3 + 2 * (k : ℕ) = 3)) = {0} + from by decide, + show (Finset.univ.filter (fun p : Fin 3 × Fin 3 => (p.1 : ℕ) + (p.2 : ℕ) = 3)) + = {(1, 2), (2, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, Nat.zero_mod, + h.massWeightSubmodule_one_eq, h.massWeightSubmodule_two_eq] + +/-- There is nothing of weight four. -/ +lemma massWeightSubmodule_four_eq : + h.massWeightSubmodule 4 = ⊥ := by + rw [h.massWeightSubmodule_eq 4 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 4 => 3 + 2 * (k : ℕ) = 4)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 4 × Fin 4 => (p.1 : ℕ) + (p.2 : ℕ) = 4)) + = {(1, 3), (2, 2), (3, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, h.massWeightSubmodule_two_eq] + +/-- Weight five is the once-derived fermion towers. -/ +lemma massWeightSubmodule_five_eq : + h.massWeightSubmodule 5 = h.derivSubmodule 1 := by + rw [h.massWeightSubmodule_eq 5 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 5 => 3 + 2 * (k : ℕ) = 5)) = {1} + from by decide, + show (Finset.univ.filter (fun p : Fin 5 × Fin 5 => (p.1 : ℕ) + (p.2 : ℕ) = 5)) + = {(1, 4), (2, 3), (3, 2), (4, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, h.massWeightSubmodule_two_eq] + +/-- Weight six is the products of two underived fermion towers. -/ +lemma massWeightSubmodule_six_eq : + h.massWeightSubmodule 6 = h.derivSubmodule 0 * h.derivSubmodule 0 := by + rw [h.massWeightSubmodule_eq 6 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 6 => 3 + 2 * (k : ℕ) = 6)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 6 × Fin 6 => (p.1 : ℕ) + (p.2 : ℕ) = 6)) + = {(3, 3), (1, 5), (2, 4), (4, 2), (5, 1)} from by decide] + simp (disch := decide) [Fin.isValue, Finset.mem_singleton, iSup_iSup_eq_left, + Fin.coe_ofNat_eq_mod, Nat.one_mod, - Finset.mem_insert, Finset.iSup_insert, + h.massWeightSubmodule_one_eq, h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_three_eq, bot_sup_eq, sup_bot_eq] + +/-- Weight seven is the twice-derived fermion towers. -/ +lemma massWeightSubmodule_seven_eq : + h.massWeightSubmodule 7 = h.derivSubmodule 2 := by + rw [h.massWeightSubmodule_eq 7 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 7 => 3 + 2 * (k : ℕ) = 7)) = {2} + from by decide, + show (Finset.univ.filter (fun p : Fin 7 × Fin 7 => (p.1 : ℕ) + (p.2 : ℕ) = 7)) + = {(1, 6), (2, 5), (3, 4), (4, 3), (5, 2), (6, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_four_eq] + +/-- Weight eight is the products of an underived and a once-derived fermion tower — + the kinetic-term sector. The two orders agree by `derivSubmodule_mul_comm`. -/ +lemma massWeightSubmodule_eight_eq : + h.massWeightSubmodule 8 = h.derivSubmodule 0 * h.derivSubmodule 1 := by + rw [show h.derivSubmodule 0 * h.derivSubmodule 1 + = h.derivSubmodule 0 * h.derivSubmodule 1 ⊔ h.derivSubmodule 1 * h.derivSubmodule 0 by + rw [h.derivSubmodule_mul_comm 1 0, sup_idem]] + rw [h.massWeightSubmodule_eq 8 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 8 => 3 + 2 * (k : ℕ) = 8)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 8 × Fin 8 => (p.1 : ℕ) + (p.2 : ℕ) = 8)) + = {(3, 5), (5, 3), (1, 7), (2, 6), (4, 4), (6, 2), (7, 1)} from by decide] + simp (disch := decide) [Fin.isValue, Finset.mem_singleton, iSup_iSup_eq_left, + Fin.coe_ofNat_eq_mod, Nat.one_mod, - Finset.mem_insert, Finset.iSup_insert, + h.massWeightSubmodule_one_eq, h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_three_eq, h.massWeightSubmodule_four_eq, + h.massWeightSubmodule_five_eq, bot_sup_eq, sup_bot_eq] + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean new file mode 100644 index 000000000..e74c38d1c --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeAlgebra.Basic +public import Physlib.Relativity.IsLorentzDeriv +public import Mathlib.Algebra.Polynomial.AlgebraMap +/-! +# The gauge sector + +The field-strength symbol family `F`, indexed by ordered tuples of +covariant-derivative directions and two covector indices, forms a *gauge sector* of +the algebra `B` when: it transforms under the global gauge group through the adjoint +action on its dual value index, under the Lorentz group as the covariant derivatives +of a two-index Lorentz tensor, and each tower is a `massWeightPoly`-eigenvector of +weight `2 * (2 + n)` (mass dimension `2 + n`). + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +/-- The field strength and its covariant derivatives as a sector of the algebra `B`: + gauge transformation through the adjoint action, the Lorentz transformation of the + towers with two explicit covector indices, and the mass weights `2 * (2 + n)`. -/ +structure IsGaugeSector (B : Type) [Ring B] [Algebra ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (repGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + (repLorentz : Representation ℂ SL(2,ℂ) B) + (repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (massWeightPoly : B →ₐ[ℂ] Polynomial B) : Prop where + repGauge_F : ∀ (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + repGauge g (F l μ ν φ) = F l μ ν ((GaugeAlgebra.adjointMap g⁻¹).dualMap φ) + repLorentz_F : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (F l μ ν φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • F p a b φ + massWeight_F : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) φ, + massWeightPoly (F l μ ν φ) = Polynomial.monomial (2 * (2 + n)) (F l μ ν φ) + -- The gauge sector is bosonic: any two field-strength towers commute. + F_comm_F : ∀ {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) (ψ' : Module.Dual ℝ GaugeAlgebra), + Commute (F l μ ν ψ) (F l' μ' ν' ψ') + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +/-- The algebra generated by the field strength and all its covariant derivatives. -/ +def gaugeAlgebra (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) : Subalgebra ℂ B := + Algebra.adjoin ℂ + (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + Set.range (F l μ ν)) + + +/-! + +## The field-strength derivative submodules + +-/ + +set_option linter.unusedVariables false in +/-- The submodule of `B` generated by the field-strength symbols carrying exactly `n` + covariant derivatives: the join, over the derivative slots and the two covector + indices, of the ranges of the symbol maps. -/ +def derivSubmodule (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) (n : ℕ) : Submodule ℂ B := + ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + Submodule.span ℂ (Set.range (F l μ ν)) + +end IsGaugeSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight.lean new file mode 100644 index 000000000..535a6c37d --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight.lean @@ -0,0 +1,343 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsGaugeSector.Basic +/-! +# The mass-weight grading of the gauge sector + +The elements of the gauge algebra of a given mass weight form a submodule; a +field-strength tower with `n` covariant derivatives has weight `2 * (2 + n)`, an +element of positive weight decomposes into towers of that weight and products of +elements of lower weight (`massWeightSubmodule_eq`), and the submodules of weight at +most eight are written out explicitly — weight eight being the `∇∇F` and `F · F` +sectors. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +/-- All elements of the gauge algebra of mass weight exactly `w`: the intersection of + the algebra generated by the field-strength towers with the part on which + `massWeightPoly` is the monomial `X ^ w`. -/ +noncomputable def massWeightSubmodule (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) (w : ℕ) : + Submodule ℂ B := + (h.gaugeAlgebra).toSubmodule + ⊓ LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial w : B →ₗ[B] Polynomial B).restrictScalars ℂ) + +lemma massWeightPoly_of_mem_massWeightSubmodule {w : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule w) : + massWeightPoly x = Polynomial.monomial w x := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + rcases hx with ⟨-, hx'⟩ + rw [LinearMap.mem_ker] at hx' + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] at hx' + exact hx' + +lemma mem_gaugeAlgebra_of_mem_massWeightSubmodule {w : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule w) : x ∈ h.gaugeAlgebra := by + rw [massWeightSubmodule, Submodule.mem_inf] at hx + exact hx.1 + +/-- A field-strength tower with `n` covariant derivatives has mass weight + `2 * (2 + n)`. -/ +lemma derivSubmodule_le_massWeightSubmodule (n : ℕ) : + h.derivSubmodule n ≤ h.massWeightSubmodule (2 * (2 + n)) := by + rw [derivSubmodule] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le] + rintro x ⟨φ, rfl⟩ + rw [massWeightSubmodule, SetLike.mem_coe, Submodule.mem_inf] + refine ⟨Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, + Set.mem_iUnion.mpr ⟨μ, Set.mem_iUnion.mpr ⟨ν, ⟨φ, rfl⟩⟩⟩⟩⟩), ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [h.massWeight_F l μ ν] + +lemma one_le_massWeightSubmodule_zero : (1 : Submodule ℂ B) ≤ h.massWeightSubmodule 0 := by + rw [Submodule.one_eq_span, Submodule.span_le, Set.singleton_subset_iff, SetLike.mem_coe, + massWeightSubmodule, Submodule.mem_inf] + refine ⟨Subalgebra.one_mem _, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero, map_one] + simp + +lemma massWeightSubmodule_mul_le (m n : ℕ) : + h.massWeightSubmodule m * h.massWeightSubmodule n ≤ h.massWeightSubmodule (m + n) := by + rw [Submodule.mul_le] + intro x hx y hy + have hx' := hx + have hy' := hy + rw [massWeightSubmodule, Submodule.mem_inf] at hx hy + rw [massWeightSubmodule, Submodule.mem_inf] + refine ⟨Subalgebra.mul_mem _ hx.1 hy.1, ?_⟩ + rw [LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + rw [map_mul, h.massWeightPoly_of_mem_massWeightSubmodule hx', + h.massWeightPoly_of_mem_massWeightSubmodule hy', Polynomial.monomial_mul_monomial] + +/-- **The weight recursion**: an element of positive mass weight `i` is a sum of + single field-strength towers of weight `i` and of products of two elements of lower + positive weights summing to `i`. -/ +lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : + h.massWeightSubmodule i + = (⨆ k ∈ Finset.univ.filter (fun k : Fin i => 2 * (2 + (k : ℕ)) = i), + h.derivSubmodule (k : ℕ)) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin i × Fin i => (p.1 : ℕ) + (p.2 : ℕ) = i), + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := by + refine le_antisymm (fun b hb => ?_) (sup_le ?_ ?_) + · -- the weight-zero component of an element of the algebra is a scalar + have hzero : ∀ x ∈ h.gaugeAlgebra, (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B) := by + intro x hx + rw [gaugeAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_range] at hy + obtain ⟨k, l, μ, ν, φ, rfl⟩ := hy + rw [h.massWeight_F, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + | algebraMap r => + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] + exact Submodule.mem_one.mpr ⟨r, rfl⟩ + | add x y hx hy ihx ihy => + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ ihx ihy + | mul x y hx hy ihx ihy => + rw [map_mul, Polynomial.mul_coeff_zero] + have hmem := Submodule.mul_mem_mul ihx ihy + rwa [Submodule.one_mul] at hmem + -- the components of an element of the algebra are homogeneous + have hcomp : ∀ x ∈ h.gaugeAlgebra, ∀ m, (massWeightPoly x).coeff m + ∈ h.massWeightSubmodule m := by + intro x hx + rw [gaugeAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_range] at hy + obtain ⟨k, l, μ, ν, φ, rfl⟩ := hy + intro m + rw [h.massWeight_F, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.derivSubmodule_le_massWeightSubmodule k + (Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.subset_span ⟨φ, rfl⟩)))) + · exact zero_mem _ + | algebraMap r => + intro m + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs with hm + · subst hm + exact h.one_le_massWeightSubmodule_zero (Submodule.mem_one.mpr ⟨r, rfl⟩) + · exact zero_mem _ + | add x y hx hy ihx ihy => + intro m + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m) (ihy m) + | mul x y hx hy ihx ihy => + intro m + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + have hsum := Finset.mem_antidiagonal.mp hp + subst hsum + exact h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (ihx p.1) (ihy p.2)) + -- the weight-`m` component lands in the right-hand side, for every positive `m` + have main : ∀ x ∈ h.gaugeAlgebra, ∀ m, 0 < m → (massWeightPoly x).coeff m + ∈ (⨆ k ∈ Finset.univ.filter (fun k : Fin m => 2 * (2 + (k : ℕ)) = m), + h.derivSubmodule (k : ℕ)) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin m × Fin m => (p.1 : ℕ) + (p.2 : ℕ) = m), + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := by + intro x hx + rw [gaugeAlgebra] at hx + induction hx using Algebra.adjoin_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_range] at hy + obtain ⟨k, l, μ, ν, φ, rfl⟩ := hy + intro m _ + rw [h.massWeight_F, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨k, by omega⟩ + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hw⟩) + (Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.subset_span ⟨φ, rfl⟩)))))) + · exact zero_mem _ + | algebraMap r => + intro m hm + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, if_neg (by omega : ¬ m = 0)] + exact zero_mem _ + | add x y hx hy ihx ihy => + intro m hm + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m hm) (ihy m hm) + | mul x y hx hy ihx ihy => + intro m hm + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + obtain ⟨j, l⟩ := p + have hsum := Finset.mem_antidiagonal.mp hp + simp only at hsum ⊢ + rcases Nat.eq_zero_or_pos j with rfl | hj + · have hlm : l = m := by omega + rw [hlm] + have hmem := Submodule.mul_mem_mul (hzero x hx) (ihy m hm) + rwa [Submodule.one_mul] at hmem + · rcases Nat.eq_zero_or_pos l with rfl | hl + · have hjm : j = m := by omega + rw [hjm] + have hmem := Submodule.mul_mem_mul (ihx m hm) (hzero y hy) + rwa [Submodule.mul_one] at hmem + · refine Submodule.mem_sup_right (Submodule.mem_iSup_of_mem + ((⟨⟨j, by omega⟩, ⟨l, by omega⟩⟩ : Fin m × Fin m)) + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hsum⟩) ?_)) + exact Submodule.mul_mem_mul (hcomp x hx j) (hcomp y hy l) + have hb' := hb + rw [massWeightSubmodule, Submodule.mem_inf] at hb + have hmain := main b hb.1 i hi + rwa [h.massWeightPoly_of_mem_massWeightSubmodule hb', Polynomial.coeff_monomial, + if_pos rfl] at hmain + · refine iSup_le fun k => iSup_le fun hk => ?_ + have hk' := (Finset.mem_filter.mp hk).2 + exact (h.derivSubmodule_le_massWeightSubmodule (k : ℕ)).trans (le_of_eq (by rw [hk'])) + · refine iSup_le fun p => iSup_le fun hp => ?_ + have hp' := (Finset.mem_filter.mp hp).2 + exact (h.massWeightSubmodule_mul_le (p.1 : ℕ) (p.2 : ℕ)).trans (le_of_eq (by rw [hp'])) + +/-! + +## The mass-weight submodules in low weight + +-/ + +/-- There is nothing of weight one. -/ +lemma massWeightSubmodule_one_eq : + h.massWeightSubmodule 1 = ⊥ := by + rw [h.massWeightSubmodule_eq 1 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 1 => 2 * (2 + (k : ℕ)) = 1)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 1 × Fin 1 => (p.1 : ℕ) + (p.2 : ℕ) = 1)) + = ∅ from by decide] + simp + +/-- There is nothing of weight two. -/ +lemma massWeightSubmodule_two_eq : + h.massWeightSubmodule 2 = ⊥ := by + rw [h.massWeightSubmodule_eq 2 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 2 => 2 * (2 + (k : ℕ)) = 2)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 2 × Fin 2 => (p.1 : ℕ) + (p.2 : ℕ) = 2)) + = {(1, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq] + +/-- There is nothing of weight three. -/ +lemma massWeightSubmodule_three_eq : + h.massWeightSubmodule 3 = ⊥ := by + rw [h.massWeightSubmodule_eq 3 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 3 => 2 * (2 + (k : ℕ)) = 3)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 3 × Fin 3 => (p.1 : ℕ) + (p.2 : ℕ) = 3)) + = {(1, 2), (2, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, + h.massWeightSubmodule_two_eq] + +/-- Weight four is the underived field-strength towers. -/ +lemma massWeightSubmodule_four_eq : + h.massWeightSubmodule 4 = h.derivSubmodule 0 := by + rw [h.massWeightSubmodule_eq 4 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 4 => 2 * (2 + (k : ℕ)) = 4)) = {0} + from by decide, + show (Finset.univ.filter (fun p : Fin 4 × Fin 4 => (p.1 : ℕ) + (p.2 : ℕ) = 4)) + = {(1, 3), (2, 2), (3, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, + h.massWeightSubmodule_two_eq] + +/-- There is nothing of weight five. -/ +lemma massWeightSubmodule_five_eq : + h.massWeightSubmodule 5 = ⊥ := by + rw [h.massWeightSubmodule_eq 5 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 5 => 2 * (2 + (k : ℕ)) = 5)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 5 × Fin 5 => (p.1 : ℕ) + (p.2 : ℕ) = 5)) + = {(1, 4), (2, 3), (3, 2), (4, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, + h.massWeightSubmodule_two_eq] + +/-- Weight six is the once-derived field-strength towers. -/ +lemma massWeightSubmodule_six_eq : + h.massWeightSubmodule 6 = h.derivSubmodule 1 := by + rw [h.massWeightSubmodule_eq 6 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 6 => 2 * (2 + (k : ℕ)) = 6)) = {1} + from by decide, + show (Finset.univ.filter (fun p : Fin 6 × Fin 6 => (p.1 : ℕ) + (p.2 : ℕ) = 6)) + = {(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, + h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_three_eq] + +/-- There is nothing of weight seven. -/ +lemma massWeightSubmodule_seven_eq : + h.massWeightSubmodule 7 = ⊥ := by + rw [h.massWeightSubmodule_eq 7 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 7 => 2 * (2 + (k : ℕ)) = 7)) = ∅ + from by decide, + show (Finset.univ.filter (fun p : Fin 7 × Fin 7 => (p.1 : ℕ) + (p.2 : ℕ) = 7)) + = {(1, 6), (2, 5), (3, 4), (4, 3), (5, 2), (6, 1)} from by decide] + simp [Fin.isValue, Fin.coe_ofNat_eq_mod, Nat.mod_succ, + h.massWeightSubmodule_one_eq, + h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_three_eq] + +/-- Weight eight is the twice-derived field-strength towers together with the products of two underived ones — the `∇∇F` and `F · F` sectors. -/ +lemma massWeightSubmodule_eight_eq : + h.massWeightSubmodule 8 = h.derivSubmodule 2 ⊔ h.derivSubmodule 0 * h.derivSubmodule 0 := by + rw [h.massWeightSubmodule_eq 8 (by norm_num)] + rw [show (Finset.univ.filter (fun k : Fin 8 => 2 * (2 + (k : ℕ)) = 8)) = {2} + from by decide, + show (Finset.univ.filter (fun p : Fin 8 × Fin 8 => (p.1 : ℕ) + (p.2 : ℕ) = 8)) + = {(4, 4), (1, 7), (2, 6), (3, 5), (5, 3), (6, 2), (7, 1)} from by decide] + simp (disch := decide) [Fin.isValue, Finset.mem_singleton, iSup_iSup_eq_left, + Fin.coe_ofNat_eq_mod, Nat.one_mod, - Finset.mem_insert, Finset.iSup_insert, + h.massWeightSubmodule_one_eq, + h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_three_eq, + h.massWeightSubmodule_four_eq, + bot_sup_eq, sup_bot_eq] + +end IsGaugeSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index c6f2d560e..140ae315c 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -502,7 +502,7 @@ lemma covDerivAction_apply along an ordered tuple of directions: covariant derivatives do not commute (their commutator is the action of the field strength), so the iteration is order-dependent and indexed by `(n : ℕ)` and `l : Fin n → (Fin 1 ⊕ Fin 3)` — the same ordered-tuple - indexing as the derivative labels of `IsHiggsAlgebraValued`. The result is again a + indexing as the derivative labels of `IsHiggsSector`. The result is again a family of derivative symbols; the physical iterated covariant derivative is its value at the empty multiset. -/ noncomputable def covDerivIter diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 0a13606ea..904f37dc8 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -38,6 +38,14 @@ open scoped Pointwise variable {A : Type} [Ring A] [Algebra ℂ A] +/-- The dual of the trivial representation acts trivially. -/ +@[simp] lemma _root_.Representation.trivial_dual_apply {k G V : Type*} [CommSemiring k] + [Group G] [AddCommMonoid V] [Module k V] (g : G) (φ : Module.Dual k V) : + (Representation.trivial k G V).dual g φ = φ := by + ext v + simp [Representation.dual_apply, Module.Dual.transpose_apply] + + /-- The iterated operator `D_s = D_{ν₁} ⋯ D_{νₙ}` of a pairwise-commuting family of endomorphisms along a multiset `s` of indices. Commutativity is what makes the operator well-defined on a multiset, i.e. independent of any ordering of `s`. -/ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 391cc6c9f..125ebd693 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -106,7 +106,7 @@ weight `∑ j, lightConeWeight (c j)`. -/ -open StandardModel.IsHiggsAlgebraValued StandardModel.IsHiggsAlgebraValued.IsDerivativeCollection +open StandardModel.IsHiggsSector StandardModel.IsHiggsSector.IsDerivativeCollection BoostWeight /-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ From b6103d6117d040251a27640ddccc5c3f267df9f6 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 28 Aug 2026 12:20:10 +0100 Subject: [PATCH 226/254] feat: More API --- .gitignore | 2 +- Physlib.lean | 3 + .../StandardModel/Fermions/DownSinglet.lean | 56 ++++ .../StandardModel/Fermions/LeptonDoublet.lean | 56 ++++ .../Fermions/LeptonSinglet/Basic.lean | 53 ++++ .../StandardModel/Fermions/QuarkDoublet.lean | 57 ++++ .../StandardModel/Fermions/UpSinglet.lean | 56 ++++ .../GaugeGroup/GaugeWeightDecomposition.lean | 87 +++++ .../AlgebraValued/DerivSubmodule.lean | 199 ++++++++++++ .../HiggsBoson/AlgebraValued/MassWeight.lean | 0 .../FermionGaugeSector/Basic.lean | 231 ++++++++++++++ .../GaugeHiggsSector/Basic.lean | 0 .../IsCovStandardModel/Sectors.lean | 148 +++++++++ .../YukawaSector/Basic.lean | 273 ++++++++++++++++ .../GaugeWeightDecomposition.lean | 299 +----------------- .../StandardModel/IsGaugeSector/Basic.lean | 106 +++++++ 16 files changed, 1338 insertions(+), 288 deletions(-) create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/DerivSubmodule.lean create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/MassWeight.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean diff --git a/.gitignore b/.gitignore index 659c8f5d8..303b4807a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ /lake-packages/* .lake/* .DS_Store - +.vscode # Python bytecode (e.g. from scripts/check_golf.py) __pycache__/ *.pyc diff --git a/Physlib.lean b/Physlib.lean index 7729c1d72..18e16608f 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -256,6 +256,7 @@ public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebra public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.DerivSubmodule public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight public import Physlib.Particles.StandardModel.IsFermionSector.GaugeWeightDecomposition @@ -265,6 +266,8 @@ public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.IsCovStandardModel.FermionGaugeSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index c8942956c..75aa5ffc6 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction @@ -511,4 +512,59 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : end DownSinglet +/-! + +## The gauge weight of the DownSinglet components + +The gauge torus acts diagonally on the basis of `DownSinglet`; the weights are recorded by +`DownSinglet.valueGaugeWeight`, and pass to the dual and conjugate-dual coordinate +functionals with the expected signs. + +-/ + +/-- The gauge weight of the down-singlet basis: the colour weights and hypercharge + `-2`. -/ +def DownSinglet.valueGaugeWeight (j : Fin 2 × Fin 3) : GaugeWeight := + ((colourWeight j.2).1, (colourWeight j.2).2, 0, -2) + +/-- The gauge torus acts diagonally on the basis of `DownSinglet`, with the weights + `DownSinglet.valueGaugeWeight`. -/ +lemma DownSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3) : + DownSinglet.repGaugeGroupI (gaugeTorusGen i) (DownSinglet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i) • + DownSinglet.basis j := by + obtain ⟨k, c⟩ := j + have hb : DownSinglet.basis (k, c) = ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by + simp only [DownSinglet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] + rfl + rw [hb, DownSinglet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, + Matrix.diagonal, + DownSinglet.valueGaugeWeight, colourWeight, GaugeWeight.coord, + expI_inv_eq_star, starRingEnd_expI_pow] <;> + (try congr 1) + +/-- The dual action of the gauge torus on the coordinate functionals of + `DownSinglet`: the weights are negated. -/ +lemma DownSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + DownSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (DownSinglet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i))) • + DownSinglet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => DownSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `DownSinglet`: the two negations cancel and the weights are those of + the value space. -/ +lemma DownSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + DownSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((DownSinglet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i) • + (DownSinglet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord DownSinglet.repGaugeGroupI.conj (DownSinglet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (DownSinglet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => DownSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index 29d813884..1c7962664 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -509,4 +510,59 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : end LeptonDoublet +/-! + +## The gauge weight of the LeptonDoublet components + +The gauge torus acts diagonally on the basis of `LeptonDoublet`; the weights are recorded by +`LeptonDoublet.valueGaugeWeight`, and pass to the dual and conjugate-dual coordinate +functionals with the expected signs. + +-/ + +/-- The gauge weight of the lepton-doublet basis: the isospin weight and hypercharge + `-3`. -/ +def LeptonDoublet.valueGaugeWeight (j : Fin 2 × Fin 2) : GaugeWeight := + (0, 0, isoWeight j.2, -3) + +/-- The gauge torus acts diagonally on the basis of `LeptonDoublet`, with the weights + `LeptonDoublet.valueGaugeWeight`. -/ +lemma LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 2) : + LeptonDoublet.repGaugeGroupI (gaugeTorusGen i) (LeptonDoublet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i) • + LeptonDoublet.basis j := by + obtain ⟨k, s⟩ := j + have hb : LeptonDoublet.basis (k, s) = ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ s⟩ := by + simp only [LeptonDoublet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] + rfl + rw [hb, LeptonDoublet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases s <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI, Fin.sum_univ_two, + Matrix.diagonal, + LeptonDoublet.valueGaugeWeight, isoWeight, GaugeWeight.coord, + expI_inv_eq_star, starRingEnd_expI_pow] <;> + (try congr 1) + +/-- The dual action of the gauge torus on the coordinate functionals of + `LeptonDoublet`: the weights are negated. -/ +lemma LeptonDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 2) : + LeptonDoublet.repGaugeGroupI.dual (gaugeTorusGen i) (LeptonDoublet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i))) • + LeptonDoublet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `LeptonDoublet`: the two negations cancel and the weights are those of + the value space. -/ +lemma LeptonDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 2) : + LeptonDoublet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((LeptonDoublet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i) • + (LeptonDoublet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord LeptonDoublet.repGaugeGroupI.conj (LeptonDoublet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index 37796b232..691769e43 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.DerivAlgebra @@ -356,4 +357,56 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : end LeptonSinglet +/-! + +## The gauge weight of the LeptonSinglet components + +The gauge torus acts diagonally on the basis of `LeptonSinglet`; the weights are recorded by +`LeptonSinglet.valueGaugeWeight`, and pass to the dual and conjugate-dual coordinate +functionals with the expected signs. + +-/ + +/-- The gauge weight of the lepton-singlet basis: hypercharge `-6`. -/ +def LeptonSinglet.valueGaugeWeight (_ : Fin 2) : GaugeWeight := + (0, 0, 0, -6) + +/-- The gauge torus acts diagonally on the basis of `LeptonSinglet`, with the weights + `LeptonSinglet.valueGaugeWeight`. -/ +lemma LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2) : + LeptonSinglet.repGaugeGroupI (gaugeTorusGen i) (LeptonSinglet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i) • + LeptonSinglet.basis j := by + have hb : LeptonSinglet.basis j = ⟨Fermion.RightHandedWeyl.basis j⟩ := by + simp only [LeptonSinglet.basis, Module.Basis.map_apply] + rfl + rw [hb, LeptonSinglet.repGaugeGroupI_basis] + fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, + LeptonSinglet.valueGaugeWeight, GaugeWeight.coord, + starRingEnd_expI_pow] + (try congr 1) + +/-- The dual action of the gauge torus on the coordinate functionals of + `LeptonSinglet`: the weights are negated. -/ +lemma LeptonSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2) : + LeptonSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (LeptonSinglet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i))) • + LeptonSinglet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `LeptonSinglet`: the two negations cancel and the weights are those of + the value space. -/ +lemma LeptonSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2) : + LeptonSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((LeptonSinglet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i) • + (LeptonSinglet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord LeptonSinglet.repGaugeGroupI.conj (LeptonSinglet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean index e427e87e9..fc24241da 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Fermions.Weyl.LeftHanded @@ -530,4 +531,60 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : end QuarkDoublet +/-! + +## The gauge weight of the QuarkDoublet components + +The gauge torus acts diagonally on the basis of `QuarkDoublet`; the weights are recorded by +`QuarkDoublet.valueGaugeWeight`, and pass to the dual and conjugate-dual coordinate +functionals with the expected signs. + +-/ + +/-- The gauge weight of the quark-doublet basis: the colour and isospin weights and + hypercharge `1`. -/ +def QuarkDoublet.valueGaugeWeight (j : Fin 2 × Fin 3 × Fin 2) : GaugeWeight := + ((colourWeight j.2.1).1, (colourWeight j.2.1).2, isoWeight j.2.2, 1) + +/-- The gauge torus acts diagonally on the basis of `QuarkDoublet`, with the weights + `QuarkDoublet.valueGaugeWeight`. -/ +lemma QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : + QuarkDoublet.repGaugeGroupI (gaugeTorusGen i) (QuarkDoublet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i) • + QuarkDoublet.basis j := by + obtain ⟨k, c, s⟩ := j + have hb : QuarkDoublet.basis (k, c, s) = ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c ⊗ₜ[ℂ] + EuclideanSpace.basisFun (Fin 2) ℂ s⟩ := by + simp only [QuarkDoublet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis, + Module.Basis.reindex_apply, Equiv.prodAssoc_symm_apply] + rfl + rw [hb, QuarkDoublet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases c <;> fin_cases s <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, GaugeGroupI.toSU2, su2ExpI, Fin.sum_univ_two, + Matrix.diagonal, + QuarkDoublet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, + expI_inv_eq_star] + +/-- The dual action of the gauge torus on the coordinate functionals of + `QuarkDoublet`: the weights are negated. -/ +lemma QuarkDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : + QuarkDoublet.repGaugeGroupI.dual (gaugeTorusGen i) (QuarkDoublet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i))) • + QuarkDoublet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `QuarkDoublet`: the two negations cancel and the weights are those of + the value space. -/ +lemma QuarkDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : + QuarkDoublet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((QuarkDoublet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i) • + (QuarkDoublet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord QuarkDoublet.repGaugeGroupI.conj (QuarkDoublet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean index 350abbd87..e3b9447ea 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -411,4 +412,59 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : end UpSinglet +/-! + +## The gauge weight of the UpSinglet components + +The gauge torus acts diagonally on the basis of `UpSinglet`; the weights are recorded by +`UpSinglet.valueGaugeWeight`, and pass to the dual and conjugate-dual coordinate +functionals with the expected signs. + +-/ + +/-- The gauge weight of the up-singlet basis: the colour weights and hypercharge + `4`. -/ +def UpSinglet.valueGaugeWeight (j : Fin 2 × Fin 3) : GaugeWeight := + ((colourWeight j.2).1, (colourWeight j.2).2, 0, 4) + +/-- The gauge torus acts diagonally on the basis of `UpSinglet`, with the weights + `UpSinglet.valueGaugeWeight`. -/ +lemma UpSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3) : + UpSinglet.repGaugeGroupI (gaugeTorusGen i) (UpSinglet.basis j) + = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i) • + UpSinglet.basis j := by + obtain ⟨k, c⟩ := j + have hb : UpSinglet.basis (k, c) = ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by + simp only [UpSinglet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] + rfl + rw [hb, UpSinglet.repGaugeGroupI_tmul_basis_eq_sum] + fin_cases i <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, + Matrix.diagonal, + UpSinglet.valueGaugeWeight, colourWeight, GaugeWeight.coord, + expI_inv_eq_star] <;> + (try congr 1) + +/-- The dual action of the gauge torus on the coordinate functionals of + `UpSinglet`: the weights are negated. -/ +lemma UpSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + UpSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (UpSinglet.basis.coord j) + = ((expI : ℂ) ^ (-(GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i))) • + UpSinglet.basis.coord j := + dual_gaugeTorusGen_coord _ _ _ _ + (fun j' => UpSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j + +/-- The dual of the conjugate action of the gauge torus on the coordinate functionals + of the conjugate of `UpSinglet`: the two negations cancel and the weights are those of + the value space. -/ +lemma UpSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : + UpSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((UpSinglet.basis.conj).coord j) + = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i) • + (UpSinglet.basis.conj).coord j := by + have hd := dual_gaugeTorusGen_coord UpSinglet.repGaugeGroupI.conj (UpSinglet.basis.conj) + (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (UpSinglet.valueGaugeWeight j') i)) + (fun j' => conj_gaugeTorusGen_basis _ _ _ _ + (fun j'' => UpSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j + simpa using hd + end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index c286eb701..d25510a86 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.Eigenspace.Basic public import Mathlib.Analysis.Real.Pi.Irrational /-! @@ -284,6 +285,92 @@ lemma IsMulRep.map_one {rep : Representation ℂ GaugeGroupI B} (hmul : IsMulRep rw [one_mul, rep.self_inv_apply, mul_one] at h1 exact h1.symm +/-! + +## C.1. Powers of `expI` under conjugation + +-/ + +lemma starRingEnd_expI_pow (n : ℕ) : + ((starRingEnd ℂ) (expI : ℂ)) ^ n = ((expI : ℂ) ^ n)⁻¹ := by + rw [← inv_pow, expI_inv_eq_star] + rfl + +lemma starRingEnd_expI_zpow (z : ℤ) : + (starRingEnd ℂ) ((expI : ℂ) ^ z) = (expI : ℂ) ^ (-z) := by + rw [map_zpow₀, _root_.zpow_neg, ← _root_.inv_zpow] + congr 1 + rw [expI_inv_eq_star] + rfl + +lemma expI_zpow_ne_zero (z : ℤ) : ((expI : ℂ) ^ z) ≠ 0 := + zpow_ne_zero _ (by simp [expI, Complex.exp_ne_zero]) + +/-! + +## C.2. The torus weights of the fundamental representations + +The colour and isospin weights of the fundamental representations of `SU(3)` and +`SU(2)` against the torus generators. They are the building blocks of the gauge +weights of the matter representations. + +-/ + +/-- The colour weights of the fundamental of `SU(3)` against the two colour torus + generators. -/ +def colourWeight (c : Fin 3) : ℤ × ℤ := ![(1, 0), (-1, 1), (0, -1)] c + +/-- The isospin weight of the fundamental of `SU(2)` against the isospin torus + generator. -/ +def isoWeight (s : Fin 2) : ℤ := ![1, -1] s + +/-! + +## C.3. The torus action on dual and conjugate bases + +If the torus acts diagonally on a basis then it acts diagonally on the dual basis with +the negated weights, and on the conjugate basis with the negated weights as well — so +the conjugate-dual action carries the original weights back. + +-/ + +section TorusBases + +variable {V : Type} [AddCommGroup V] [Module ℂ V] {ι : Type} [Fintype ι] [DecidableEq ι] + +omit [Fintype ι] in +lemma dual_gaugeTorusGen_coord (ρ : Representation ℂ GaugeGroupI V) + (b : Module.Basis ι ℂ V) (g : GaugeGroupI) (w : ι → ℤ) + (hb : ∀ j, ρ g (b j) = ((expI : ℂ) ^ w j) • b j) (j : ι) : + ρ.dual g (b.coord j) = ((expI : ℂ) ^ (-(w j))) • b.coord j := by + have hinv : ∀ j', ρ g⁻¹ (b j') = ((expI : ℂ) ^ (-(w j'))) • b j' := by + intro j' + have h1 : ρ g⁻¹ (ρ g (b j')) = b j' := by + rw [← Module.End.mul_apply, ← map_mul, inv_mul_cancel, map_one, + Module.End.one_apply] + rw [hb j', map_smul] at h1 + rw [_root_.zpow_neg] + exact ((inv_smul_eq_iff₀ (expI_zpow_ne_zero (w j'))).mpr h1.symm).symm + refine b.ext fun j' => ?_ + rw [Representation.dual_apply] + simp only [Module.Dual.transpose_apply, LinearMap.comp_apply, hinv j', map_smul, + LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, smul_eq_mul] + by_cases hne : j' = j + · subst hne + simp + · simp [hne] + +omit [Fintype ι] [DecidableEq ι] in +lemma conj_gaugeTorusGen_basis (ρ : Representation ℂ GaugeGroupI V) + (b : Module.Basis ι ℂ V) (g : GaugeGroupI) (w : ι → ℤ) + (hb : ∀ j, ρ g (b j) = ((expI : ℂ) ^ w j) • b j) (j : ι) : + ρ.conj g (Module.Basis.conj b j) + = ((expI : ℂ) ^ (-(w j))) • Module.Basis.conj b j := by + simp only [Module.Basis.conj_apply, Representation.conj_apply, + LinearEquiv.symm_apply_apply, hb j, map_smulₛₗ, starRingEnd_expI_zpow] + +end TorusBases + /-- A **gauge weight decomposition** of a submodule `V`, a finitely supported family of subspaces of pure gauge weight whose supremum is `V`. Purity is recorded against the four commuting torus generators simultaneously. -/ diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/DerivSubmodule.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/DerivSubmodule.lean new file mode 100644 index 000000000..3a8bead01 --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/DerivSubmodule.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic +/-! +# The derivative submodules of the Higgs sector + +The Higgs symbols and their conjugates carrying a fixed number `n` of derivatives span +the submodule `derivSubmodule n`. The Higgs is bosonic, so these submodules commute +with one another, and since neither the gauge nor the Lorentz action changes the number +of derivatives they are closed under both. Finally the gauge weight decompositions of +the Higgs and conjugate-Higgs submodules join to one of `derivSubmodule n`. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace IsHiggsSector + +set_option linter.unusedVariables false + +variable {B : Type} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} + {hrep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) + +/-- The submodule of `B` generated by the Higgs symbols and their conjugates carrying + `n` derivatives. -/ +def derivSubmodule (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) (n : ℕ) : Submodule ℂ B := + h.higgsSubmodule n ⊔ h.barHiggsSubmodule n + +/-- Every element of a derivative submodule commutes with a fixed Higgs symbol. -/ +lemma derivSubmodule_le_ker_H {n k : ℕ} (d : Fin k → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : + h.derivSubmodule n + ≤ LinearMap.ker (LinearMap.mulLeft ℂ (H k d φ) - LinearMap.mulRight ℂ (H k d φ)) := by + rw [derivSubmodule] + refine sup_le ?_ ?_ + · rw [higgsSubmodule] + refine iSup_le fun d' => ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact (h.H_comm_H φ ψ k n d d').eq + · rw [barHiggsSubmodule] + refine iSup_le fun d' => ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact (h.H_comm_barH φ ψ k n d d').eq + +/-- Every element of a derivative submodule commutes with a fixed conjugate-Higgs + symbol. -/ +lemma derivSubmodule_le_ker_barH {n k : ℕ} (d : Fin k → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + h.derivSubmodule n + ≤ LinearMap.ker (LinearMap.mulLeft ℂ (barH k d φ) + - LinearMap.mulRight ℂ (barH k d φ)) := by + rw [derivSubmodule] + refine sup_le ?_ ?_ + · rw [higgsSubmodule] + refine iSup_le fun d' => ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact ((h.H_comm_barH ψ φ n k d' d).symm).eq + · rw [barHiggsSubmodule] + refine iSup_le fun d' => ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact (h.barH_comm_barH φ ψ k n d d').eq + +/-- Any element of a derivative submodule commutes with any element of any derivative + submodule: the Higgs is bosonic. -/ +lemma commute_of_mem_derivSubmodule {n m : ℕ} {x y : B} + (hx : x ∈ h.derivSubmodule n) (hy : y ∈ h.derivSubmodule m) : Commute x y := by + have step : h.derivSubmodule n + ≤ LinearMap.ker (LinearMap.mulRight ℂ y - LinearMap.mulLeft ℂ y) := by + rw [derivSubmodule] + refine sup_le ?_ ?_ + · rw [higgsSubmodule] + refine iSup_le fun d => ?_ + rintro _ ⟨φ, rfl⟩ + have := h.derivSubmodule_le_ker_H (n := m) d φ hy + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] at this ⊢ + exact this + · rw [barHiggsSubmodule] + refine iSup_le fun d => ?_ + rintro _ ⟨φ, rfl⟩ + have := h.derivSubmodule_le_ker_barH (n := m) d φ hy + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] at this ⊢ + exact this + have hxy := step hx + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] at hxy + exact hxy + +/-- Derivative submodules commute with one another at the level of submodule + products. -/ +lemma derivSubmodule_mul_comm (n m : ℕ) : + h.derivSubmodule n * h.derivSubmodule m = h.derivSubmodule m * h.derivSubmodule n := by + refine le_antisymm (Submodule.mul_le.mpr fun x hx y hy => ?_) + (Submodule.mul_le.mpr fun y hy x hx => ?_) + · rw [(h.commute_of_mem_derivSubmodule hx hy).eq] + exact Submodule.mul_mem_mul hy hx + · rw [← (h.commute_of_mem_derivSubmodule hx hy).eq] + exact Submodule.mul_mem_mul hx hy + +/-- The derivative submodules are closed under the gauge action: each symbol is carried + to a symbol with the same number of derivatives. -/ +lemma derivSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : + (h.derivSubmodule n).map (rep g) ≤ h.derivSubmodule n := by + rw [derivSubmodule, Submodule.map_sup] + refine sup_le_sup ?_ ?_ + · rw [higgsSubmodule, Submodule.map_iSup] + refine iSup_le fun d => ?_ + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + rw [h.H_equivariant] + exact Submodule.mem_iSup_of_mem d ⟨_, rfl⟩ + · rw [barHiggsSubmodule, Submodule.map_iSup] + refine iSup_le fun d => ?_ + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + rw [h.barH_equivariant] + exact Submodule.mem_iSup_of_mem d ⟨_, rfl⟩ + +/-- The derivative submodules are closed under the gauge action. -/ +lemma derivSubmodule_map_rep (n : ℕ) (g : GaugeGroupI) : + (h.derivSubmodule n).map (rep g) = h.derivSubmodule n := + le_antisymm (h.derivSubmodule_map_rep_le n g) fun b hb => + ⟨rep g⁻¹ b, h.derivSubmodule_map_rep_le n g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + +/-- The derivative submodules are closed under the Lorentz action: the Lorentz group + only mixes the derivative indices within a fixed number of derivatives. -/ +lemma derivSubmodule_map_repLorentz_le (n : ℕ) (Λ : SL(2,ℂ)) : + (h.derivSubmodule n).map (repLorentz Λ) ≤ h.derivSubmodule n := by + rw [derivSubmodule, Submodule.map_sup] + refine sup_le_sup ?_ ?_ + · rw [higgsSubmodule, Submodule.map_iSup] + refine iSup_le fun d => ?_ + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + rw [h.repLorentz_H_apply] + exact Submodule.sum_mem _ fun a _ => + Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem a ⟨φ, rfl⟩) + · rw [barHiggsSubmodule, Submodule.map_iSup] + refine iSup_le fun d => ?_ + rintro _ ⟨_, ⟨φ, rfl⟩, rfl⟩ + rw [h.repLorentz_barH_apply] + exact Submodule.sum_mem _ fun a _ => + Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem a ⟨φ, rfl⟩) + +/-- The derivative submodules are closed under the Lorentz action. -/ +lemma derivSubmodule_map_repLorentz (n : ℕ) (Λ : SL(2,ℂ)) : + (h.derivSubmodule n).map (repLorentz Λ) = h.derivSubmodule n := + le_antisymm (h.derivSubmodule_map_repLorentz_le n Λ) fun b hb => + ⟨repLorentz Λ⁻¹ b, h.derivSubmodule_map_repLorentz_le n Λ⁻¹ ⟨b, hb, rfl⟩, + repLorentz.self_inv_apply Λ b⟩ + +/-! + +## The gauge weight decomposition + +-/ + +/-- **The gauge weight decomposition of the Higgs derivative submodules**: the join of + the decompositions of the Higgs and conjugate-Higgs submodules, whose weights are + `(0, 0, ∓1, -3)` and `(0, 0, ±1, 3)` respectively. + + This is an instance: its statement mentions `h`, so unification against the goal + recovers the sector and with it the rest of the structure's implicit data. -/ +@[implicit_reducible] +noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : + GaugeWeightDecomposition rep (h.derivSubmodule n) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.sup (d := h.higgsSubmoduleGaugeWeight n) + (d' := h.barHiggsSubmoduleGaugeWeight n)) + _ (by rw [derivSubmodule]) + +end IsHiggsSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/MassWeight.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/MassWeight.lean new file mode 100644 index 000000000..e69de29bb diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean index e69de29bb..6cccd3a6b 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean @@ -0,0 +1,231 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.Sectors +/-! +# The mixed gauge-fermion sector + +The field-strength towers are bosonic, so they commute with every fermion tower +(`h.F_comm_d`, `h.F_comm_bard`, ..., `h.F_comm_bare`); consequently the gauge algebra +and the fermion algebra commute (`commute_of_mem_gaugeAlgebra_of_mem_fermionAlgebra`), +and so do their mass-weight submodules in either order +(`fermionMassWeight_mul_gaugeMassWeight_le`). Feeding this into the abstract two-class +sector bound `sectorMassWeight_pair_le` gives the mixed `{gauge, fermion}` sector's +weight-`w` piece as (the join over splittings of `w` into non-zero parts of) products +of the gauge and fermion sectors' own mass-weight submodules +(`sectorMassWeight_gauge_fermion_le`). + +Since a non-zero gauge weight is at least `4` and a non-zero fermion weight is at +least `3`, the mixed sector vanishes below weight `7` +(`sectorMassWeight_gauge_fermion_eq_bot_of_lt_seven`) and at weight `8` +(`sectorMassWeight_gauge_fermion_eight`), and at weight `7` is exactly the product of +the underived field-strength submodule with the underived fermion submodule +(`sectorMassWeight_gauge_fermion_seven`). + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) + +/-! + +## The gauge and fermion algebras commute + +-/ + +/-- The gauge algebra and the fermion algebra commute element-wise: every generator of + the gauge algebra commutes with every generator of the fermion algebra by the + structure fields `h.F_comm_d`, ..., `h.F_comm_bare`, and commutation extends from + generators to the algebras they generate. -/ +lemma commute_of_mem_gaugeAlgebra_of_mem_fermionAlgebra {x y : B} + (hx : x ∈ h.isGaugeSector.gaugeAlgebra) (hy : y ∈ h.isFermionSector.fermionAlgebra) : + Commute x y := by + have hgen : ∀ a ∈ (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) + (ν : Fin 1 ⊕ Fin 3), Set.range (F l μ ν)), + ∀ b ∈ (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (d i l) ∪ Set.range (bard i l) ∪ + Set.range (u i l) ∪ Set.range (baru i l) ∪ + Set.range (Q i l) ∪ Set.range (barQ i l) ∪ + Set.range (L i l) ∪ Set.range (barL i l) ∪ + Set.range (e i l) ∪ Set.range (bare i l)), Commute a b := by + intro a ha b hb + simp only [Set.mem_iUnion, Set.mem_range] at ha + obtain ⟨n, l, μ, ν, φ, rfl⟩ := ha + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨i, k, dd, (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩)⟩ := hb + · exact h.F_comm_d l μ ν φ i dd φ' + · exact h.F_comm_bard l μ ν φ i dd φ' + · exact h.F_comm_u l μ ν φ i dd φ' + · exact h.F_comm_baru l μ ν φ i dd φ' + · exact h.F_comm_Q l μ ν φ i dd φ' + · exact h.F_comm_barQ l μ ν φ i dd φ' + · exact h.F_comm_L l μ ν φ i dd φ' + · exact h.F_comm_barL l μ ν φ i dd φ' + · exact h.F_comm_e l μ ν φ i dd φ' + · exact h.F_comm_bare l μ ν φ i dd φ' + rw [IsGaugeSector.gaugeAlgebra] at hx + rw [IsFermionSector.fermionAlgebra] at hy + refine Algebra.commute_of_mem_adjoin_of_forall_mem_commute hy fun b hb => ?_ + exact (Algebra.commute_of_mem_adjoin_of_forall_mem_commute hx + fun a ha => (hgen a ha b hb).symm).symm + +/-- The fermion sector's mass-weight submodules and the gauge sector's mass-weight + submodules commute past each other, in the order needed by + `sectorMassWeight_pair_le`. -/ +lemma fermionMassWeight_mul_gaugeMassWeight_le (a b : ℕ) : + h.isFermionSector.massWeightSubmodule a * h.isGaugeSector.massWeightSubmodule b + ≤ h.isGaugeSector.massWeightSubmodule b * h.isFermionSector.massWeightSubmodule a := by + refine Submodule.mul_le.mpr fun x hx y hy => ?_ + rw [(h.commute_of_mem_gaugeAlgebra_of_mem_fermionAlgebra + (h.isGaugeSector.mem_gaugeAlgebra_of_mem_massWeightSubmodule hy) + (h.isFermionSector.mem_fermionAlgebra_of_mem_massWeightSubmodule hx)).symm.eq] + exact Submodule.mul_mem_mul hy hx + +/-! + +## The mixed gauge-fermion sector + +-/ + +/-- **The mixed gauge-fermion sector decomposition.** The weight-`w` piece of the + `{gauge, fermion}` sector lies in the join, over the splittings of `w` into two + non-zero parts, of the products of the gauge and fermion sectors' own mass-weight + submodules. -/ +theorem sectorMassWeight_gauge_fermion_le (w : ℕ) : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} w + ≤ ⨆ (p : ℕ × ℕ) (_ : p.1 + p.2 = w) (_ : p.1 ≠ 0) (_ : p.2 ≠ 0), + h.isGaugeSector.massWeightSubmodule p.1 * h.isFermionSector.massWeightSubmodule p.2 := + h.sectorMassWeight_pair_le (c₁ := GeneratorClass.gauge) (c₂ := GeneratorClass.fermion) + (M₁ := h.isGaugeSector.massWeightSubmodule) (M₂ := h.isFermionSector.massWeightSubmodule) + (by decide) + (fun w => h.sectorMassWeight_gauge_le w) (fun w => h.sectorMassWeight_fermion_le w) + h.isGaugeSector.one_le_massWeightSubmodule_zero + h.isFermionSector.one_le_massWeightSubmodule_zero + (fun a b => h.isGaugeSector.massWeightSubmodule_mul_le a b) + (fun a b => h.isFermionSector.massWeightSubmodule_mul_le a b) + (fun a b => h.fermionMassWeight_mul_gaugeMassWeight_le a b) w + +/-- **The mixed gauge-fermion sector vanishes below weight `7`.** A non-zero gauge + weight is at least `4` and a non-zero fermion weight is at least `3`, so no + splitting of a weight below `7` into two non-zero parts can supply both. -/ +theorem sectorMassWeight_gauge_fermion_eq_bot_of_lt_seven {w : ℕ} (hw : w < 7) : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} w = ⊥ := by + refine le_bot_iff.mp ((h.sectorMassWeight_gauge_fermion_le w).trans ?_) + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + dsimp only at hp h1 h2 ⊢ + have ha : a ≤ 6 := by omega + have hb : b ≤ 6 := by omega + interval_cases a <;> interval_cases b <;> + first + | omega + | simp [h.isGaugeSector.massWeightSubmodule_one_eq, + h.isGaugeSector.massWeightSubmodule_two_eq, + h.isGaugeSector.massWeightSubmodule_three_eq, + h.isGaugeSector.massWeightSubmodule_five_eq, + h.isFermionSector.massWeightSubmodule_one_eq, + h.isFermionSector.massWeightSubmodule_two_eq, + h.isFermionSector.massWeightSubmodule_four_eq] + +/-- **The mixed gauge-fermion sector vanishes at weight `8`.** The only splittings of + `8` into two non-zero parts with a non-zero gauge weight and a non-zero fermion + weight would need the gauge part to be `4` or `6`(with fermion part `4` or `2`), but + the fermion sector vanishes at both `4` and `2`. -/ +theorem sectorMassWeight_gauge_fermion_eight : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 8 = ⊥ := by + refine le_bot_iff.mp ((h.sectorMassWeight_gauge_fermion_le 8).trans ?_) + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + dsimp only at hp h1 h2 ⊢ + have ha : a ≤ 7 := by omega + have hb : b ≤ 7 := by omega + interval_cases a <;> interval_cases b <;> + first + | omega + | simp [h.isGaugeSector.massWeightSubmodule_one_eq, + h.isGaugeSector.massWeightSubmodule_two_eq, + h.isGaugeSector.massWeightSubmodule_three_eq, + h.isGaugeSector.massWeightSubmodule_five_eq, + h.isGaugeSector.massWeightSubmodule_seven_eq, + h.isFermionSector.massWeightSubmodule_one_eq, + h.isFermionSector.massWeightSubmodule_two_eq, + h.isFermionSector.massWeightSubmodule_four_eq] + +/-- **The mixed gauge-fermion sector at weight `7`** is exactly the product of the + underived field-strength submodule with the underived fermion submodule: the only + splitting of `7` into a non-zero gauge weight and a non-zero fermion weight that + survives is `4 + 3`. -/ +theorem sectorMassWeight_gauge_fermion_seven : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 7 + = h.isGaugeSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 0 := by + refine le_antisymm ?_ ?_ + · refine (h.sectorMassWeight_gauge_fermion_le 7).trans + (iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_) + obtain ⟨a, b⟩ := p + dsimp only at hp h1 h2 ⊢ + have ha : a ≤ 6 := by omega + have hb : b ≤ 6 := by omega + interval_cases a <;> interval_cases b <;> + first + | omega + | simp [h.isGaugeSector.massWeightSubmodule_one_eq, + h.isGaugeSector.massWeightSubmodule_two_eq, + h.isGaugeSector.massWeightSubmodule_three_eq, + h.isGaugeSector.massWeightSubmodule_four_eq, + h.isGaugeSector.massWeightSubmodule_five_eq, + h.isGaugeSector.massWeightSubmodule_six_eq, + h.isFermionSector.massWeightSubmodule_one_eq, + h.isFermionSector.massWeightSubmodule_two_eq, + h.isFermionSector.massWeightSubmodule_three_eq, bot_le] + · have hgauge : h.isGaugeSector.derivSubmodule 0 = h.sectorMassWeight {GeneratorClass.gauge} 4 := by + rw [← h.isGaugeSector.massWeightSubmodule_four_eq, ← h.sectorMassWeight_gauge_eq (by norm_num)] + have hfermion : h.isFermionSector.derivSubmodule 0 + = h.sectorMassWeight {GeneratorClass.fermion} 3 := by + rw [← h.isFermionSector.massWeightSubmodule_three_eq, + ← h.sectorMassWeight_fermion_eq (by norm_num)] + rw [hgauge, hfermion] + have hset : ({GeneratorClass.gauge} ∪ {GeneratorClass.fermion} : Finset GeneratorClass) + = {GeneratorClass.gauge, GeneratorClass.fermion} := by decide + refine Submodule.mul_le.mpr fun x hx y hy => ?_ + have := h.mul_mem_sectorMassWeight hx hy + rwa [hset] at this + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean new file mode 100644 index 000000000..e69de29bb diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean index 0251cf956..78b2db847 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean @@ -949,6 +949,154 @@ theorem sectorMassWeight_fermion_eq {w : ℕ} (hw : w ≠ 0) : rw [hkey, hz', add_zero] exact hy' +/-! + +## Two-class sectors + +A word realising exactly two classes splits, up to reordering, into the part of the +first class and the part of the second. When the two classes' algebras commute, the +weight-`w` piece of the two-class sector is therefore contained in the join of the +products of the two sectors' own mass-weight submodules, over the splittings of `w` +into two non-zero parts. The hypotheses are stated abstractly so that the three +pairs of sectors can each instantiate them. + +-/ + +/-- The total mass weight carried by the generators of a given class in a word. -/ +def classWeight (c : GeneratorClass) (gl : List Generators) : ℕ := + ((gl.filter fun g => decide (g.kind = c)).map Generators.weight).sum + +@[simp] lemma classWeight_nil (c : GeneratorClass) : classWeight c [] = 0 := rfl + +lemma classWeight_cons_of_eq {c : GeneratorClass} {g : Generators} (hg : g.kind = c) + (t : List Generators) : + classWeight c (g :: t) = g.weight + classWeight c t := by + simp [classWeight, hg] + +lemma classWeight_cons_of_ne {c : GeneratorClass} {g : Generators} (hg : g.kind ≠ c) + (t : List Generators) : classWeight c (g :: t) = classWeight c t := by + simp [classWeight, hg] + +/-- Every generator carries a non-zero mass weight. -/ +lemma Generators.weight_pos (g : Generators) : 0 < g.weight := by + cases g <;> simp [Generators.weight] + +/-- A class realised by a word carries a non-zero part of its weight. -/ +lemma classWeight_ne_zero {c : GeneratorClass} {gl : List Generators} + (hc : c ∈ wordClasses gl) : classWeight c gl ≠ 0 := by + induction gl with + | nil => simp [wordClasses] at hc + | cons g t ih => + rw [wordClasses_cons, Finset.mem_insert] at hc + by_cases hg : g.kind = c + · rw [classWeight_cons_of_eq hg] + have := g.weight_pos + omega + · rw [classWeight_cons_of_ne hg] + exact ih (hc.resolve_left fun hh => hg hh.symm) + +/-- Over a word realising only two classes, the two class weights add up to the total + weight. -/ +lemma classWeight_add {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂) {gl : List Generators} + (hgl : ∀ g ∈ gl, g.kind = c₁ ∨ g.kind = c₂) : + classWeight c₁ gl + classWeight c₂ gl = (gl.map Generators.weight).sum := by + induction gl with + | nil => simp + | cons g t ih => + have ht : ∀ g' ∈ t, g'.kind = c₁ ∨ g'.kind = c₂ := fun g' hg' => hgl g' (by simp [hg']) + rcases hgl g (by simp) with hg | hg + · rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne (by rw [hg]; exact hne), + List.map_cons, List.sum_cons, ← ih ht] + omega + · rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne (by rw [hg]; exact hne.symm), + List.map_cons, List.sum_cons, ← ih ht] + omega + +/-- A single generator's value lies in any family of submodules dominating its own + class's sector. -/ +lemma generatorVal_mem_of_kind {c : GeneratorClass} {M : ℕ → Submodule ℂ B} + (hM : ∀ w, h.sectorMassWeight {c} w ≤ M w) {g : Generators} (hg : g.kind = c) : + h.generatorVal g ∈ M g.weight := by + refine hM _ ?_ + have h1 := h.list_prod_mem_sectorMassWeight [g] + simpa [wordClasses_cons, hg] using h1 + +/-- **The two-class word decomposition.** A word all of whose generators lie in one of + two classes is a product of an element of weight `classWeight c₁` from the first + class's family and an element of weight `classWeight c₂` from the second. -/ +lemma list_prod_mem_mul_of_forall_kind {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂) + {M₁ M₂ : ℕ → Submodule ℂ B} + (hM₁ : ∀ w, h.sectorMassWeight {c₁} w ≤ M₁ w) + (hM₂ : ∀ w, h.sectorMassWeight {c₂} w ≤ M₂ w) + (hone₁ : (1 : Submodule ℂ B) ≤ M₁ 0) (hone₂ : (1 : Submodule ℂ B) ≤ M₂ 0) + (hmul₁ : ∀ a b, M₁ a * M₁ b ≤ M₁ (a + b)) + (hmul₂ : ∀ a b, M₂ a * M₂ b ≤ M₂ (a + b)) + (hcomm : ∀ a b, M₂ a * M₁ b ≤ M₁ b * M₂ a) + (gl : List Generators) (hgl : ∀ g ∈ gl, g.kind = c₁ ∨ g.kind = c₂) : + (gl.map h.generatorVal).prod + ∈ M₁ (classWeight c₁ gl) * M₂ (classWeight c₂ gl) := by + induction gl with + | nil => + simp only [List.map_nil, List.prod_nil, classWeight_nil] + have h1 : (1 : B) ∈ M₁ 0 := hone₁ (Submodule.mem_one.mpr ⟨1, by simp⟩) + have h2 : (1 : B) ∈ M₂ 0 := hone₂ (Submodule.mem_one.mpr ⟨1, by simp⟩) + simpa using Submodule.mul_mem_mul h1 h2 + | cons g t ih => + have ht : ∀ g' ∈ t, g'.kind = c₁ ∨ g'.kind = c₂ := fun g' hg' => hgl g' (by simp [hg']) + have hIH := ih ht + simp only [List.map_cons, List.prod_cons] + rcases hgl g (by simp) with hg | hg + · have hgm : h.generatorVal g ∈ M₁ g.weight := h.generatorVal_mem_of_kind hM₁ hg + have hne2 : g.kind ≠ c₂ := by rw [hg]; exact hne + rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne hne2] + refine (?_ : M₁ g.weight * (M₁ (classWeight c₁ t) * M₂ (classWeight c₂ t)) + ≤ M₁ (g.weight + classWeight c₁ t) * M₂ (classWeight c₂ t)) + (Submodule.mul_mem_mul hgm hIH) + rw [← mul_assoc] + exact mul_le_mul' (hmul₁ _ _) le_rfl + · have hgm : h.generatorVal g ∈ M₂ g.weight := h.generatorVal_mem_of_kind hM₂ hg + have hne1 : g.kind ≠ c₁ := by rw [hg]; exact hne.symm + rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne hne1] + refine (?_ : M₂ g.weight * (M₁ (classWeight c₁ t) * M₂ (classWeight c₂ t)) + ≤ M₁ (classWeight c₁ t) * M₂ (g.weight + classWeight c₂ t)) + (Submodule.mul_mem_mul hgm hIH) + calc M₂ g.weight * (M₁ (classWeight c₁ t) * M₂ (classWeight c₂ t)) + = M₂ g.weight * M₁ (classWeight c₁ t) * M₂ (classWeight c₂ t) := + (mul_assoc _ _ _).symm + _ ≤ M₁ (classWeight c₁ t) * M₂ g.weight * M₂ (classWeight c₂ t) := + mul_le_mul' (hcomm _ _) le_rfl + _ = M₁ (classWeight c₁ t) * (M₂ g.weight * M₂ (classWeight c₂ t)) := mul_assoc _ _ _ + _ ≤ M₁ (classWeight c₁ t) * M₂ (g.weight + classWeight c₂ t) := + mul_le_mul' le_rfl (hmul₂ _ _) + +/-- **The two-class sector decomposition.** The weight-`w` piece of the sector of two + classes is contained in the join, over the splittings of `w` into two non-zero + parts, of the products of the two classes' mass-weight submodules. -/ +theorem sectorMassWeight_pair_le {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂) + {M₁ M₂ : ℕ → Submodule ℂ B} + (hM₁ : ∀ w, h.sectorMassWeight {c₁} w ≤ M₁ w) + (hM₂ : ∀ w, h.sectorMassWeight {c₂} w ≤ M₂ w) + (hone₁ : (1 : Submodule ℂ B) ≤ M₁ 0) (hone₂ : (1 : Submodule ℂ B) ≤ M₂ 0) + (hmul₁ : ∀ a b, M₁ a * M₁ b ≤ M₁ (a + b)) + (hmul₂ : ∀ a b, M₂ a * M₂ b ≤ M₂ (a + b)) + (hcomm : ∀ a b, M₂ a * M₁ b ≤ M₁ b * M₂ a) (w : ℕ) : + h.sectorMassWeight {c₁, c₂} w + ≤ ⨆ (p : ℕ × ℕ) (_ : p.1 + p.2 = w) (_ : p.1 ≠ 0) (_ : p.2 ≠ 0), M₁ p.1 * M₂ p.2 := by + rw [sectorMassWeight, Submodule.span_le] + rintro x ⟨gl, hS, hsum, rfl⟩ + have hgl : ∀ g ∈ gl, g.kind = c₁ ∨ g.kind = c₂ := by + intro g hg + have : g.kind ∈ wordClasses gl := List.mem_toFinset.mpr (List.mem_map_of_mem hg) + rw [hS] at this + simpa using this + have h1 : c₁ ∈ wordClasses gl := by rw [hS]; simp + have h2 : c₂ ∈ wordClasses gl := by rw [hS]; simp + refine Submodule.mem_iSup_of_mem (classWeight c₁ gl, classWeight c₂ gl) + (Submodule.mem_iSup_of_mem (by rw [classWeight_add hne hgl, hsum]) + (Submodule.mem_iSup_of_mem (classWeight_ne_zero h1) + (Submodule.mem_iSup_of_mem (classWeight_ne_zero h2) ?_))) + exact h.list_prod_mem_mul_of_forall_kind hne hM₁ hM₂ hone₁ hone₂ hmul₁ hmul₂ hcomm gl hgl + end IsCovStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean index e69de29bb..87ea5e910 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean @@ -0,0 +1,273 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.Sectors +/-! +# The Yukawa sector's mass-weight submodules + +The mixed Higgs-fermion sector — the `{higgs, fermion}` two-class sector of +`Sectors.lean` — is the home of the Yukawa couplings. Since the Higgs sector is +bosonic, its algebra commutes with the fermion algebra +(`commute_of_mem_higgsAlgebra_of_mem_fermionAlgebra`), which feeds the abstract +two-class machinery `sectorMassWeight_pair_le` to bound each weight-`w` piece of the +sector by a join of products of the two sectors' own mass-weight submodules +(`sectorMassWeight_higgs_fermion_le`). Combined with the explicit low-weight tables +for the Higgs sector (vanishing at odd weight) and the fermion sector (vanishing at +weight `1`, `2` and `4`), this pins the sector down explicitly up to weight eight: it +vanishes below weight five and at weight six, and at weights five, seven and eight it +sits inside the expected Yukawa-type products, the last of these being the weight of +the Yukawa term `H ψ ψ` itself. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) + +/-! + +## Cross-algebra commutation + +The Higgs sector is bosonic, so its algebra commutes with the fermion algebra +elementwise: this is the algebraic input to the whole Yukawa-sector decomposition. + +-/ + +/-- **The Higgs sector is bosonic**: every element of the algebra generated by the + Higgs towers commutes with every element of the algebra generated by the fermion + towers. -/ +lemma commute_of_mem_higgsAlgebra_of_mem_fermionAlgebra {x y : B} + (hx : x ∈ h.isHiggsSector.higgsAlgebra) (hy : y ∈ h.isFermionSector.fermionAlgebra) : + Commute x y := by + have hgen : ∀ a ∈ (⋃ (k : ℕ) (dd : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (H dd) ∪ Set.range (barH dd)), + ∀ b ∈ (⋃ (i : Fin 3) (k : ℕ) (dd : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (d i dd) ∪ Set.range (bard i dd) ∪ Set.range (u i dd) ∪ + Set.range (baru i dd) ∪ Set.range (Q i dd) ∪ Set.range (barQ i dd) ∪ + Set.range (L i dd) ∪ Set.range (barL i dd) ∪ Set.range (e i dd) ∪ + Set.range (bare i dd)), Commute a b := by + intro a ha b hb + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at ha hb + obtain ⟨k1, d1, ⟨φ1, rfl⟩ | ⟨φ1, rfl⟩⟩ := ha <;> + obtain ⟨i, k2, dd, (((((((((⟨φ2, rfl⟩ | ⟨φ2, rfl⟩) | ⟨φ2, rfl⟩) | ⟨φ2, rfl⟩) | ⟨φ2, rfl⟩) | + ⟨φ2, rfl⟩) | ⟨φ2, rfl⟩) | ⟨φ2, rfl⟩) | ⟨φ2, rfl⟩) | ⟨φ2, rfl⟩)⟩ := hb + · exact h.H_comm_d _ _ _ _ _ + · exact h.H_comm_bard _ _ _ _ _ + · exact h.H_comm_u _ _ _ _ _ + · exact h.H_comm_baru _ _ _ _ _ + · exact h.H_comm_Q _ _ _ _ _ + · exact h.H_comm_barQ _ _ _ _ _ + · exact h.H_comm_L _ _ _ _ _ + · exact h.H_comm_barL _ _ _ _ _ + · exact h.H_comm_e _ _ _ _ _ + · exact h.H_comm_bare _ _ _ _ _ + · exact h.barH_comm_d _ _ _ _ _ + · exact h.barH_comm_bard _ _ _ _ _ + · exact h.barH_comm_u _ _ _ _ _ + · exact h.barH_comm_baru _ _ _ _ _ + · exact h.barH_comm_Q _ _ _ _ _ + · exact h.barH_comm_barQ _ _ _ _ _ + · exact h.barH_comm_L _ _ _ _ _ + · exact h.barH_comm_barL _ _ _ _ _ + · exact h.barH_comm_e _ _ _ _ _ + · exact h.barH_comm_bare _ _ _ _ _ + rw [IsHiggsSector.higgsAlgebra] at hx + rw [IsFermionSector.fermionAlgebra] at hy + refine Algebra.commute_of_mem_adjoin_of_forall_mem_commute hy fun b hb => ?_ + exact (Algebra.commute_of_mem_adjoin_of_forall_mem_commute hx + fun a ha => (hgen a ha b hb).symm).symm + +/-- The fermion-sector and Higgs-sector mass-weight submodules commute past each + other, in the order needed by `sectorMassWeight_pair_le`. -/ +lemma fermionMassWeight_mul_higgsMassWeight_le (a b : ℕ) : + h.isFermionSector.massWeightSubmodule a * h.isHiggsSector.massWeightSubmodule b + ≤ h.isHiggsSector.massWeightSubmodule b * h.isFermionSector.massWeightSubmodule a := by + refine Submodule.mul_le.mpr fun x hx y hy => ?_ + rw [← (h.commute_of_mem_higgsAlgebra_of_mem_fermionAlgebra + (h.isHiggsSector.mem_higgsAlgebra_of_mem_massWeightSubmodule hy) + (h.isFermionSector.mem_fermionAlgebra_of_mem_massWeightSubmodule hx)).eq] + exact Submodule.mul_mem_mul hy hx + +/-! + +## The Yukawa sector at a fixed mass weight + +-/ + +/-- **The Yukawa-sector decomposition**: the weight-`w` piece of the `{higgs, + fermion}` sector is contained in the join, over the splittings of `w` into two + non-zero parts, of the products of the Higgs-sector and fermion-sector mass-weight + submodules. -/ +theorem sectorMassWeight_higgs_fermion_le (w : ℕ) : + h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w + ≤ ⨆ (p : ℕ × ℕ) (_ : p.1 + p.2 = w) (_ : p.1 ≠ 0) (_ : p.2 ≠ 0), + h.isHiggsSector.massWeightSubmodule p.1 * h.isFermionSector.massWeightSubmodule p.2 := + h.sectorMassWeight_pair_le (by decide) h.sectorMassWeight_higgs_le h.sectorMassWeight_fermion_le + h.isHiggsSector.one_le_massWeightSubmodule_zero + h.isFermionSector.one_le_massWeightSubmodule_zero + h.isHiggsSector.massWeightSubmodule_mul_le h.isFermionSector.massWeightSubmodule_mul_le + h.fermionMassWeight_mul_higgsMassWeight_le w + +/-- **Below weight five, the Yukawa sector vanishes**: no splitting of a total weight + under five into two non-zero parts survives — the Higgs part is either odd (hence + zero) or equal to two, forcing the fermion part to be one or two (hence also + zero). -/ +theorem sectorMassWeight_higgs_fermion_eq_bot_of_lt_five {w : ℕ} (hw : w < 5) : + h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w = ⊥ := by + refine le_antisymm (le_trans (h.sectorMassWeight_higgs_fermion_le w) ?_) bot_le + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + simp only at hp h1 h2 + have ha0 : 0 < a := Nat.pos_of_ne_zero h1 + have ha3 : a ≤ 3 := by omega + interval_cases a + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 1 (by decide), Submodule.bot_mul] + · have hb0 : 0 < b := Nat.pos_of_ne_zero h2 + have hb2 : b ≤ 2 := by omega + interval_cases b + · rw [h.isFermionSector.massWeightSubmodule_one_eq, Submodule.mul_bot] + · rw [h.isFermionSector.massWeightSubmodule_two_eq, Submodule.mul_bot] + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 3 (by decide), Submodule.bot_mul] + +/-- **The Yukawa sector vanishes at weight six**: every splitting of six into two + non-zero parts has either an odd Higgs part or a fermion part of weight two or + four, all of which vanish. -/ +theorem sectorMassWeight_higgs_fermion_six : + h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 6 = ⊥ := by + refine le_antisymm (le_trans (h.sectorMassWeight_higgs_fermion_le 6) ?_) bot_le + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + simp only at hp h1 h2 + have ha0 : 0 < a := Nat.pos_of_ne_zero h1 + have ha5 : a ≤ 5 := by omega + interval_cases a + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 1 (by decide), Submodule.bot_mul] + · have hb : b = 4 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_four_eq, Submodule.mul_bot] + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 3 (by decide), Submodule.bot_mul] + · have hb : b = 2 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_two_eq, Submodule.mul_bot] + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 5 (by decide), Submodule.bot_mul] + +/-- **The weight-five Yukawa sector**: the only surviving splitting is the Higgs + field itself (weight two) against the underived fermion towers (weight three). -/ +theorem sectorMassWeight_higgs_fermion_five : + h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 5 + ≤ h.isHiggsSector.massWeightSubmodule 2 * h.isFermionSector.derivSubmodule 0 := by + refine le_trans (h.sectorMassWeight_higgs_fermion_le 5) ?_ + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + simp only at hp h1 h2 + have ha0 : 0 < a := Nat.pos_of_ne_zero h1 + have ha4 : a ≤ 4 := by omega + interval_cases a + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 1 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 3 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_three_eq] + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 3 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 1 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_one_eq, Submodule.mul_bot] + exact bot_le + +/-- **The weight-seven Yukawa sector**: the surviving splittings pair the Higgs + field (weight two) with the once-derived fermion towers (weight five), or the + once-derived Higgs field (weight four) with the underived fermion towers (weight + three). -/ +theorem sectorMassWeight_higgs_fermion_seven : + h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 7 + ≤ h.isHiggsSector.massWeightSubmodule 2 * h.isFermionSector.derivSubmodule 1 + ⊔ h.isHiggsSector.massWeightSubmodule 4 * h.isFermionSector.derivSubmodule 0 := by + refine le_trans (h.sectorMassWeight_higgs_fermion_le 7) ?_ + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + simp only at hp h1 h2 + have ha0 : 0 < a := Nat.pos_of_ne_zero h1 + have ha6 : a ≤ 6 := by omega + interval_cases a + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 1 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 5 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_five_eq] + exact le_sup_left + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 3 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 3 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_three_eq] + exact le_sup_right + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 5 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 1 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_one_eq, Submodule.mul_bot] + exact bot_le + +/-- **The weight-eight Yukawa sector**: the only surviving splitting pairs the Higgs + field (weight two) with the product of two underived fermion towers (weight six) + — this is the sector of the Yukawa term `H ψ ψ` itself. -/ +theorem sectorMassWeight_higgs_fermion_eight : + h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 + ≤ h.isHiggsSector.massWeightSubmodule 2 + * (h.isFermionSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 0) := by + refine le_trans (h.sectorMassWeight_higgs_fermion_le 8) ?_ + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + simp only at hp h1 h2 + have ha0 : 0 < a := Nat.pos_of_ne_zero h1 + have ha7 : a ≤ 7 := by omega + interval_cases a + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 1 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 6 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_six_eq] + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 3 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 4 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_four_eq, Submodule.mul_bot] + exact bot_le + · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 5 (by decide), Submodule.bot_mul] + exact bot_le + · have hb : b = 2 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_two_eq, Submodule.mul_bot] + exact bot_le + · have hb : b = 1 := by omega + rw [hb, h.isFermionSector.massWeightSubmodule_one_eq, Submodule.mul_bot] + exact bot_le + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean index 4f92d62f6..4b1731c80 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean @@ -27,162 +27,19 @@ open Matrix MatrixGroups /-! -## A. `expI` helpers +## A. The torus weights of the fermion value spaces -/ -lemma starRingEnd_expI_pow (n : ℕ) : - ((starRingEnd ℂ) (expI : ℂ)) ^ n = ((expI : ℂ) ^ n)⁻¹ := by - rw [← inv_pow, expI_inv_eq_star] - rfl - -lemma starRingEnd_expI_zpow (z : ℤ) : - (starRingEnd ℂ) ((expI : ℂ) ^ z) = (expI : ℂ) ^ (-z) := by - rw [map_zpow₀, _root_.zpow_neg, ← _root_.inv_zpow] - congr 1 - rw [expI_inv_eq_star] - rfl - -lemma expI_zpow_ne_zero (z : ℤ) : ((expI : ℂ) ^ z) ≠ 0 := - zpow_ne_zero _ (by simpa [expI] using Complex.exp_ne_zero Complex.I) - -/-! - -## B. The torus weights of the fermion value spaces - --/ - -/-- The colour weights of the fundamental of `SU(3)` against the two colour torus - generators. -/ -def colourWeight (c : Fin 3) : ℤ × ℤ := ![(1, 0), (-1, 1), (0, -1)] c - -/-- The isospin weight of the fundamental of `SU(2)` against the isospin torus - generator. -/ -def isoWeight (s : Fin 2) : ℤ := ![1, -1] s - -/-- The gauge weight of the down-singlet basis: the colour weights and hypercharge - `-2`. -/ -def DownSinglet.valueGaugeWeight (j : Fin 2 × Fin 3) : GaugeWeight := - ((colourWeight j.2).1, (colourWeight j.2).2, 0, -2) - -/-- The gauge weight of the up-singlet basis: the colour weights and hypercharge - `4`. -/ -def UpSinglet.valueGaugeWeight (j : Fin 2 × Fin 3) : GaugeWeight := - ((colourWeight j.2).1, (colourWeight j.2).2, 0, 4) - -/-- The gauge weight of the quark-doublet basis: the colour and isospin weights and - hypercharge `1`. -/ -def QuarkDoublet.valueGaugeWeight (j : Fin 2 × Fin 3 × Fin 2) : GaugeWeight := - ((colourWeight j.2.1).1, (colourWeight j.2.1).2, isoWeight j.2.2, 1) - -/-- The gauge weight of the lepton-doublet basis: the isospin weight and hypercharge - `-3`. -/ -def LeptonDoublet.valueGaugeWeight (j : Fin 2 × Fin 2) : GaugeWeight := - (0, 0, isoWeight j.2, -3) - -/-- The gauge weight of the lepton-singlet basis: hypercharge `-6`. -/ -def LeptonSinglet.valueGaugeWeight (_ : Fin 2) : GaugeWeight := - (0, 0, 0, -6) - /-! -## C. The torus action on the value-space bases +## B. The torus action on the value-space bases -/ -/-- The gauge torus acts diagonally on the basis of `DownSinglet`, with the weights - `DownSinglet.valueGaugeWeight`. -/ -lemma DownSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3) : - DownSinglet.repGaugeGroupI (gaugeTorusGen i) (DownSinglet.basis j) - = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i) • - DownSinglet.basis j := by - obtain ⟨k, c⟩ := j - have hb : DownSinglet.basis (k, c) = ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by - simp only [DownSinglet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] - rfl - rw [hb, DownSinglet.repGaugeGroupI_tmul_basis_eq_sum] - fin_cases i <;> fin_cases c <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, - Matrix.diagonal, - DownSinglet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, - expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> - (try (congr 1 <;> norm_num)) - -/-- The gauge torus acts diagonally on the basis of `UpSinglet`, with the weights - `UpSinglet.valueGaugeWeight`. -/ -lemma UpSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3) : - UpSinglet.repGaugeGroupI (gaugeTorusGen i) (UpSinglet.basis j) - = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i) • - UpSinglet.basis j := by - obtain ⟨k, c⟩ := j - have hb : UpSinglet.basis (k, c) = ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by - simp only [UpSinglet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] - rfl - rw [hb, UpSinglet.repGaugeGroupI_tmul_basis_eq_sum] - fin_cases i <;> fin_cases c <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, - Matrix.diagonal, - UpSinglet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, - expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> - (try (congr 1 <;> norm_num)) - -/-- The gauge torus acts diagonally on the basis of `QuarkDoublet`, with the weights - `QuarkDoublet.valueGaugeWeight`. -/ -lemma QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : - QuarkDoublet.repGaugeGroupI (gaugeTorusGen i) (QuarkDoublet.basis j) - = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i) • - QuarkDoublet.basis j := by - obtain ⟨k, c, s⟩ := j - have hb : QuarkDoublet.basis (k, c, s) = ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c ⊗ₜ[ℂ] - EuclideanSpace.basisFun (Fin 2) ℂ s⟩ := by - simp only [QuarkDoublet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis, - Module.Basis.reindex_apply, Equiv.prodAssoc_symm_apply] - rfl - rw [hb, QuarkDoublet.repGaugeGroupI_tmul_basis_eq_sum] - fin_cases i <;> fin_cases c <;> fin_cases s <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, Fin.sum_univ_three, GaugeGroupI.toSU2, su2ExpI, Fin.sum_univ_two, - Matrix.diagonal, - QuarkDoublet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, - expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> - (try (congr 1 <;> norm_num)) - -/-- The gauge torus acts diagonally on the basis of `LeptonDoublet`, with the weights - `LeptonDoublet.valueGaugeWeight`. -/ -lemma LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin 2) : - LeptonDoublet.repGaugeGroupI (gaugeTorusGen i) (LeptonDoublet.basis j) - = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i) • - LeptonDoublet.basis j := by - obtain ⟨k, s⟩ := j - have hb : LeptonDoublet.basis (k, s) = ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ s⟩ := by - simp only [LeptonDoublet.basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis] - rfl - rw [hb, LeptonDoublet.repGaugeGroupI_tmul_basis_eq_sum] - fin_cases i <;> fin_cases s <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI, Fin.sum_univ_two, - Matrix.diagonal, - LeptonDoublet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, - expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> - (try (congr 1 <;> norm_num)) - -/-- The gauge torus acts diagonally on the basis of `LeptonSinglet`, with the weights - `LeptonSinglet.valueGaugeWeight`. -/ -lemma LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2) : - LeptonSinglet.repGaugeGroupI (gaugeTorusGen i) (LeptonSinglet.basis j) - = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i) • - LeptonSinglet.basis j := by - have hb : LeptonSinglet.basis j = ⟨Fermion.RightHandedWeyl.basis j⟩ := by - simp only [LeptonSinglet.basis, Module.Basis.map_apply] - rfl - rw [hb, LeptonSinglet.repGaugeGroupI_basis] - fin_cases i <;> - simp [gaugeTorusGen, GaugeGroupI.toU1, Matrix.diagonal, - LeptonSinglet.valueGaugeWeight, colourWeight, isoWeight, GaugeWeight.coord, - expI_inv_eq_star, Complex.star_def, starRingEnd_expI_pow, hb] <;> - (try (congr 1 <;> norm_num)) - /-! -## D. The dual and conjugate-dual actions on the coordinate functionals +## C. Ranges of symbol maps -/ @@ -190,34 +47,6 @@ section Bridges variable {V : Type} [AddCommGroup V] [Module ℂ V] {ι : Type} [Fintype ι] [DecidableEq ι] -lemma dual_gaugeTorusGen_coord (ρ : Representation ℂ GaugeGroupI V) - (b : Module.Basis ι ℂ V) (g : GaugeGroupI) (w : ι → ℤ) - (hb : ∀ j, ρ g (b j) = ((expI : ℂ) ^ w j) • b j) (j : ι) : - ρ.dual g (b.coord j) = ((expI : ℂ) ^ (-(w j))) • b.coord j := by - have hinv : ∀ j', ρ g⁻¹ (b j') = ((expI : ℂ) ^ (-(w j'))) • b j' := by - intro j' - have h1 : ρ g⁻¹ (ρ g (b j')) = b j' := by - rw [← Module.End.mul_apply, ← map_mul, inv_mul_cancel, map_one, - Module.End.one_apply] - rw [hb j', map_smul] at h1 - rw [_root_.zpow_neg] - exact ((inv_smul_eq_iff₀ (expI_zpow_ne_zero (w j'))).mpr h1.symm).symm - refine b.ext fun j' => ?_ - rw [Representation.dual_apply] - simp only [Module.Dual.transpose_apply, LinearMap.comp_apply, hinv j', map_smul, - LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, smul_eq_mul] - by_cases hne : j' = j - · subst hne - simp - · simp [Finsupp.single_apply, hne] - -lemma conj_gaugeTorusGen_basis (ρ : Representation ℂ GaugeGroupI V) - (b : Module.Basis ι ℂ V) (g : GaugeGroupI) (w : ι → ℤ) - (hb : ∀ j, ρ g (b j) = ((expI : ℂ) ^ w j) • b j) (j : ι) : - ρ.conj g (Module.Basis.conj b j) - = ((expI : ℂ) ^ (-(w j))) • Module.Basis.conj b j := by - simp only [Module.Basis.conj_apply, Representation.conj_apply, - LinearEquiv.symm_apply_apply, hb j, map_smulₛₗ, starRingEnd_expI_zpow] lemma range_eq_iSup_span {M : Type} [AddCommGroup M] [Module ℂ M] (b : Module.Basis ι ℂ V) (f : Module.Dual ℂ V →ₗ[ℂ] M) : @@ -229,119 +58,9 @@ lemma range_eq_iSup_span {M : Type} [AddCommGroup M] [Module ℂ M] end Bridges -/-- The dual action of the gauge torus on the coordinate functionals of - `DownSinglet`: the weights are negated. -/ -lemma DownSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : - DownSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (DownSinglet.basis.coord j) - = ((expI : ℂ) ^ (-(GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i))) • - DownSinglet.basis.coord j := - dual_gaugeTorusGen_coord _ _ _ _ - (fun j' => DownSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j - -/-- The dual of the conjugate action of the gauge torus on the coordinate functionals - of the conjugate of `DownSinglet`: the two negations cancel and the weights are those of - the value space. -/ -lemma DownSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : - DownSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((DownSinglet.basis.conj).coord j) - = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) i) • - (DownSinglet.basis.conj).coord j := by - have hd := dual_gaugeTorusGen_coord DownSinglet.repGaugeGroupI.conj (DownSinglet.basis.conj) - (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (DownSinglet.valueGaugeWeight j') i)) - (fun j' => conj_gaugeTorusGen_basis _ _ _ _ - (fun j'' => DownSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j - simpa using hd - -/-- The dual action of the gauge torus on the coordinate functionals of - `UpSinglet`: the weights are negated. -/ -lemma UpSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : - UpSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (UpSinglet.basis.coord j) - = ((expI : ℂ) ^ (-(GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i))) • - UpSinglet.basis.coord j := - dual_gaugeTorusGen_coord _ _ _ _ - (fun j' => UpSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j - -/-- The dual of the conjugate action of the gauge torus on the coordinate functionals - of the conjugate of `UpSinglet`: the two negations cancel and the weights are those of - the value space. -/ -lemma UpSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3) : - UpSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((UpSinglet.basis.conj).coord j) - = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) i) • - (UpSinglet.basis.conj).coord j := by - have hd := dual_gaugeTorusGen_coord UpSinglet.repGaugeGroupI.conj (UpSinglet.basis.conj) - (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (UpSinglet.valueGaugeWeight j') i)) - (fun j' => conj_gaugeTorusGen_basis _ _ _ _ - (fun j'' => UpSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j - simpa using hd - -/-- The dual action of the gauge torus on the coordinate functionals of - `QuarkDoublet`: the weights are negated. -/ -lemma QuarkDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : - QuarkDoublet.repGaugeGroupI.dual (gaugeTorusGen i) (QuarkDoublet.basis.coord j) - = ((expI : ℂ) ^ (-(GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i))) • - QuarkDoublet.basis.coord j := - dual_gaugeTorusGen_coord _ _ _ _ - (fun j' => QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis i j') j - -/-- The dual of the conjugate action of the gauge torus on the coordinate functionals - of the conjugate of `QuarkDoublet`: the two negations cancel and the weights are those of - the value space. -/ -lemma QuarkDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 3 × Fin 2) : - QuarkDoublet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((QuarkDoublet.basis.conj).coord j) - = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) i) • - (QuarkDoublet.basis.conj).coord j := by - have hd := dual_gaugeTorusGen_coord QuarkDoublet.repGaugeGroupI.conj (QuarkDoublet.basis.conj) - (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j') i)) - (fun j' => conj_gaugeTorusGen_basis _ _ _ _ - (fun j'' => QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j - simpa using hd - -/-- The dual action of the gauge torus on the coordinate functionals of - `LeptonDoublet`: the weights are negated. -/ -lemma LeptonDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 2) : - LeptonDoublet.repGaugeGroupI.dual (gaugeTorusGen i) (LeptonDoublet.basis.coord j) - = ((expI : ℂ) ^ (-(GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i))) • - LeptonDoublet.basis.coord j := - dual_gaugeTorusGen_coord _ _ _ _ - (fun j' => LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis i j') j - -/-- The dual of the conjugate action of the gauge torus on the coordinate functionals - of the conjugate of `LeptonDoublet`: the two negations cancel and the weights are those of - the value space. -/ -lemma LeptonDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2 × Fin 2) : - LeptonDoublet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((LeptonDoublet.basis.conj).coord j) - = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) i) • - (LeptonDoublet.basis.conj).coord j := by - have hd := dual_gaugeTorusGen_coord LeptonDoublet.repGaugeGroupI.conj (LeptonDoublet.basis.conj) - (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j') i)) - (fun j' => conj_gaugeTorusGen_basis _ _ _ _ - (fun j'' => LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j - simpa using hd - -/-- The dual action of the gauge torus on the coordinate functionals of - `LeptonSinglet`: the weights are negated. -/ -lemma LeptonSinglet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2) : - LeptonSinglet.repGaugeGroupI.dual (gaugeTorusGen i) (LeptonSinglet.basis.coord j) - = ((expI : ℂ) ^ (-(GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i))) • - LeptonSinglet.basis.coord j := - dual_gaugeTorusGen_coord _ _ _ _ - (fun j' => LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis i j') j - -/-- The dual of the conjugate action of the gauge torus on the coordinate functionals - of the conjugate of `LeptonSinglet`: the two negations cancel and the weights are those of - the value space. -/ -lemma LeptonSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin 2) : - LeptonSinglet.repGaugeGroupI.conj.dual (gaugeTorusGen i) ((LeptonSinglet.basis.conj).coord j) - = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) i) • - (LeptonSinglet.basis.conj).coord j := by - have hd := dual_gaugeTorusGen_coord LeptonSinglet.repGaugeGroupI.conj (LeptonSinglet.basis.conj) - (gaugeTorusGen i) (fun j' => -(GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j') i)) - (fun j' => conj_gaugeTorusGen_basis _ _ _ _ - (fun j'' => LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j - simpa using hd - /-! -## E. The gauge weight decomposition of the derivative submodules +## D. The gauge weight decomposition of the derivative submodules -/ @@ -560,9 +279,15 @@ noncomputable def rangeGaugeWeight_bare (f : Fin 3) {n : ℕ} /-- **The gauge weight decomposition of the fermion derivative submodules**, for any number of covariant derivatives: the join, over families, derivative slots and the - ten species, of the spans of the symbol components, each of pure gauge weight. -/ + ten species, of the spans of the symbol components, each of pure gauge weight. + + This is an instance: its statement mentions `h`, so unification against the goal + recovers the sector and with it all the implicit data of `IsFermionSector`. The + `rangeGaugeWeight_*` decompositions above cannot be instances for exactly that + reason — their statements name only the symbol maps, leaving the rest of the + structure's parameters undetermined. -/ @[implicit_reducible] -noncomputable def derivSubmoduleGaugeWeight (n : ℕ) : +noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : GaugeWeightDecomposition repGauge (h.derivSubmodule n) := GaugeWeightDecomposition.copy (GaugeWeightDecomposition.iSup hrepGauge_mul fun f : Fin 3 => diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean index e74c38d1c..6e2347b2c 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean @@ -95,6 +95,112 @@ def derivSubmodule (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLo ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), Submodule.span ℂ (Set.range (F l μ ν)) +/-! + +### Commutativity of the derivative submodules + +-/ + +/-- The gauge sector is bosonic: any element of a derivative-`n` submodule commutes with any + element of a derivative-`m` submodule. This extends `F_comm_F` from generators to the + submodules that they span. -/ +lemma commute_of_mem_derivSubmodule {n m : ℕ} {x y : B} + (hx : x ∈ h.derivSubmodule n) (hy : y ∈ h.derivSubmodule m) : Commute x y := by + have gen : ∀ (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), + h.derivSubmodule m ≤ LinearMap.ker + (LinearMap.mulLeft ℂ (F l μ ν ψ) - LinearMap.mulRight ℂ (F l μ ν ψ)) := by + intro l μ ν ψ + rw [derivSubmodule] + refine iSup_le fun l' => iSup_le fun μ' => iSup_le fun ν' => Submodule.span_le.mpr ?_ + rintro _ ⟨ψ', rfl⟩ + simp only [SetLike.mem_coe, LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] + exact (h.F_comm_F l μ ν ψ l' μ' ν' ψ').eq + have key : ∀ x ∈ h.derivSubmodule n, ∀ y ∈ h.derivSubmodule m, x * y = y * x := by + intro x hx y hy + have step : h.derivSubmodule n ≤ + LinearMap.ker (LinearMap.mulRight ℂ y - LinearMap.mulLeft ℂ y) := by + rw [derivSubmodule] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => Submodule.span_le.mpr ?_ + rintro _ ⟨ψ, rfl⟩ + simp only [SetLike.mem_coe, LinearMap.mem_ker, LinearMap.sub_apply, + LinearMap.mulRight_apply, LinearMap.mulLeft_apply, sub_eq_zero] + have := gen l μ ν ψ hy + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulLeft_apply, + LinearMap.mulRight_apply, sub_eq_zero] using this + have := step hx + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.mulRight_apply, + LinearMap.mulLeft_apply, sub_eq_zero] using this + exact key x hx y hy + +/-- The derivative-`n` and derivative-`m` submodules commute with one another as submodules + of `B`, since every pair of their elements commute. -/ +lemma derivSubmodule_mul_comm (n m : ℕ) : + h.derivSubmodule n * h.derivSubmodule m = h.derivSubmodule m * h.derivSubmodule n := by + refine le_antisymm (Submodule.mul_le.mpr fun x hx y hy => ?_) + (Submodule.mul_le.mpr fun x hx y hy => ?_) + · rw [(h.commute_of_mem_derivSubmodule hx hy).eq] + exact Submodule.mul_mem_mul hy hx + · rw [← (h.commute_of_mem_derivSubmodule hy hx).eq] + exact Submodule.mul_mem_mul hy hx + +/-! + +### Closure of the derivative submodules under the gauge and Lorentz groups + +-/ + +/-- The image of a derivative-`n` submodule under a gauge transformation lies inside the + same submodule: each generator `F l μ ν φ` is sent by `repGauge_F` to another generator + `F l μ ν φ'` with the same derivative slots and covector indices. -/ +lemma derivSubmodule_map_repGauge_le (n : ℕ) (g : GaugeGroupI) : + (h.derivSubmodule n).map (repGauge g) ≤ h.derivSubmodule n := by + rw [derivSubmodule, Submodule.map_iSup] + refine iSup_le fun l => ?_ + rw [Submodule.map_iSup] + refine iSup_le fun μ => ?_ + rw [Submodule.map_iSup] + refine iSup_le fun ν => ?_ + rw [Submodule.map_span_le] + rintro _ ⟨φ, rfl⟩ + rw [h.repGauge_F] + exact Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.subset_span ⟨_, rfl⟩))) + +/-- The derivative-`n` submodule is invariant, as a set, under the gauge group. -/ +lemma derivSubmodule_map_repGauge (n : ℕ) (g : GaugeGroupI) : + (h.derivSubmodule n).map (repGauge g) = h.derivSubmodule n := + le_antisymm (h.derivSubmodule_map_repGauge_le n g) fun b hb => + ⟨repGauge g⁻¹ b, h.derivSubmodule_map_repGauge_le n g⁻¹ ⟨b, hb, rfl⟩, + repGauge.self_inv_apply g b⟩ + +/-- The image of a derivative-`n` submodule under a Lorentz transformation lies inside the + same submodule: `repLorentz_F` expands each generator into a finite linear combination of + generators with the same number `n` of derivative slots. -/ +lemma derivSubmodule_map_repLorentz_le (n : ℕ) (Λ : SL(2,ℂ)) : + (h.derivSubmodule n).map (repLorentz Λ) ≤ h.derivSubmodule n := by + rw [derivSubmodule, Submodule.map_iSup] + refine iSup_le fun l => ?_ + rw [Submodule.map_iSup] + refine iSup_le fun μ => ?_ + rw [Submodule.map_iSup] + refine iSup_le fun ν => ?_ + rw [Submodule.map_span_le] + rintro _ ⟨φ, rfl⟩ + rw [h.repLorentz_F] + refine Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ ?_ + refine Submodule.sum_mem _ fun a _ => Submodule.smul_mem _ _ ?_ + refine Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ ?_ + exact Submodule.mem_iSup_of_mem p (Submodule.mem_iSup_of_mem a + (Submodule.mem_iSup_of_mem b (Submodule.subset_span ⟨_, rfl⟩))) + +/-- The derivative-`n` submodule is invariant, as a set, under the Lorentz group. -/ +lemma derivSubmodule_map_repLorentz (n : ℕ) (Λ : SL(2,ℂ)) : + (h.derivSubmodule n).map (repLorentz Λ) = h.derivSubmodule n := + le_antisymm (h.derivSubmodule_map_repLorentz_le n Λ) fun b hb => + ⟨repLorentz Λ⁻¹ b, h.derivSubmodule_map_repLorentz_le n Λ⁻¹ ⟨b, hb, rfl⟩, + repLorentz.self_inv_apply Λ b⟩ + end IsGaugeSector end StandardModel From 2dcc668c61b056b84b77b9f0eac91b1101a0040d Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 28 Aug 2026 15:33:25 +0400 Subject: [PATCH 227/254] refactor(IsQuadLorentz): remove lemma already in mathlib --- .../Invariants/IsQuadLorentz.lean | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 391cc6c9f..5133bc34f 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -2592,31 +2592,12 @@ sections D and E: each covering step keeps only its weight-zero member. -/ -/-- Finite decomposition of an `iSup` membership: an element of the join of a - `ℤ`-indexed family is a finitely supported sum of members. -/ -lemma exists_finsupp_of_mem_iSup {S : ℤ → Submodule ℂ B} {x : B} (hx : x ∈ ⨆ m, S m) : - ∃ f : ℤ →₀ B, (∀ m, f m ∈ S m) ∧ x = f.sum fun _ b => b := by - refine Submodule.iSup_induction - (motive := fun y => ∃ f : ℤ →₀ B, (∀ m, f m ∈ S m) ∧ y = f.sum fun _ b => b) - S hx ?_ ?_ ?_ - · intro m y hy - refine ⟨Finsupp.single m y, fun m' => ?_, by simp [Finsupp.sum_single_index]⟩ - rcases eq_or_ne m' m with rfl | hne - · rw [Finsupp.single_eq_same] - exact hy - · rw [Finsupp.single_eq_of_ne hne] - exact Submodule.zero_mem _ - · exact ⟨0, fun m => Submodule.zero_mem _, by simp⟩ - · rintro y z ⟨f, hf, rfl⟩ ⟨g, hg, rfl⟩ - refine ⟨f + g, fun m => by rw [Finsupp.add_apply]; exact add_mem (hf m) (hg m), ?_⟩ - rw [Finsupp.sum_add_index (fun m _ => rfl) (fun m _ b₁ b₂ => rfl)] - /-- Graded extraction: an element of the join of a family bounded by the boost-weight grading which itself has weight zero lies in the zero member of the family. -/ lemma mem_of_mem_iSup_of_boostWeight_zero {i : Fin 3} {S : ℤ → Submodule ℂ B} (hS : ∀ m : ℤ, S m ≤ boostWeightSubmodule repLorentz i m) {x : B} (hx : x ∈ ⨆ m, S m) (h0 : x ∈ boostWeightSubmodule repLorentz i 0) : x ∈ S 0 := by - obtain ⟨f, hf, rfl⟩ := exists_finsupp_of_mem_iSup hx + obtain ⟨f, hf, rfl⟩ := (Submodule.mem_iSup_iff_exists_finsupp _ _).mp hx have hkey := eq_component_zero_of_mem_boostWeightSubmodule (i := i) (s := insert 0 f.support) (w := fun m => f m) h0 (fun m _ => hS m (hf m)) (Finset.mem_insert_self 0 _) ?_ From 927b703bc77dd0f0ba89fbbcc5b6f2e7733a38c3 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 28 Aug 2026 12:45:41 +0100 Subject: [PATCH 228/254] feat: Add GaugeWeightDecomposition for IsGaugeSector --- Physlib.lean | 1 + .../GaugeWieghtDecomposition.lean | 496 ++++++++++++++++++ 2 files changed, 497 insertions(+) create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/GaugeWieghtDecomposition.lean diff --git a/Physlib.lean b/Physlib.lean index 18e16608f..c58211102 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -262,6 +262,7 @@ public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight public import Physlib.Particles.StandardModel.IsFermionSector.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.Basic public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight +public import Physlib.Particles.StandardModel.IsGaugeSector.GaugeWieghtDecomposition public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/GaugeWieghtDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/GaugeWieghtDecomposition.lean new file mode 100644 index 000000000..507bf5d05 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/GaugeWieghtDecomposition.lean @@ -0,0 +1,496 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsGaugeSector.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +/-! +# The gauge weight decomposition of the gauge sector + +The field strength takes values in the *adjoint* representation, where — unlike the +fundamental representations carrying the fermions — the standard (Gell-Mann and Pauli) +basis is not a basis of torus eigenvectors. The eigenvectors appear only after +complexification: the torus scales the matrix entry `(j, k)` of the `su(3)` and `su(2)` +blocks by `d j * star (d k)`, so the combinations `φ ± i ψ` of the real and imaginary +parts of an entry functional are eigenvectors, while the Cartan and `u(1)` directions +are fixed. + +This file collects that computation: the torus elements act by conjugation with the +diagonal matrices `torusSU3Diag` and `torusSU2Diag`, `dualMap_pair_of_entry` turns an +entrywise scaling into the rotation of a real pair of coordinate functionals, and +`repGauge_pair_add` / `repGauge_pair_sub` / `repGauge_fixed` convert those into +eigenvector statements for the field-strength symbols in the algebra `B`. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups + +/-- Conjugation inverts a power of `expI`. -/ +lemma star_expI_zpow (z : ℤ) : star ((expI : ℂ) ^ z) = (expI : ℂ) ^ (-z) := by + rw [Complex.star_def, starRingEnd_expI_zpow] + +/-! + +## A. The coordinates of the standard basis + +-/ + +namespace GaugeAlgebra + +/-- coords -/ +noncomputable def stdCoeff (x : GaugeAlgebra) : Fin 8 ⊕ Fin 3 ⊕ Fin 1 → ℝ + | Sum.inl k => gellMannCoeff x.toSU3Matrix k + | Sum.inr (Sum.inl i) => pauliCoeff x.toSU2Matrix i + | Sum.inr (Sum.inr _) => (x.toU1Value).re + +lemma eq_sum_stdCoeff (x : GaugeAlgebra) : x = ∑ y, stdCoeff x y • stdBasis y := by + refine ext_of_matrix ?_ ?_ ?_ + · rw [toSU3Matrix_sum] + simp only [Fintype.sum_sum_type, smul_toSU3Matrix, stdBasis_inl_toSU3Matrix, + stdBasis_inr_inl_toSU3Matrix, stdBasis_inr_inr_toSU3Matrix, smul_zero, + Finset.sum_const_zero, add_zero] + exact eq_sum_gellMannCoeff_smul x.1.2.1 x.1.2.2 + · rw [toSU2Matrix_sum] + simp only [Fintype.sum_sum_type, smul_toSU2Matrix, stdBasis_inl_toSU2Matrix, + stdBasis_inr_inl_toSU2Matrix, stdBasis_inr_inr_toSU2Matrix, smul_zero, + Finset.sum_const_zero, zero_add, add_zero] + exact eq_sum_pauliCoeff_smul x.2.1.2.1 x.2.1.2.2 + · have h1 : ((x.toU1Value.re : ℝ) : ℂ) = x.toU1Value := + Complex.conj_eq_iff_re.mp x.2.2.2 + rw [toU1Value_sum] + simp only [Fintype.sum_sum_type, smul_toU1Value, stdBasis_inl_toU1Value, + stdBasis_inr_inl_toU1Value, stdBasis_inr_inr_toU1Value, stdCoeff, + Complex.real_smul, mul_zero, Finset.sum_const_zero, zero_add, mul_one, + Finset.sum_const, Finset.card_univ, Fintype.card_fin, one_smul, h1] + +/-- The coordinate functionals of `stdBasis` read off a gauge-algebra element's matrix + entries. -/ +lemma stdBasis_coord_apply (y : GaugeAlgebra) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + stdBasis.coord a y = stdCoeff y a := by + conv_lhs => rw [eq_sum_stdCoeff y] + rw [map_sum] + simp only [map_smul, smul_eq_mul, Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply, mul_ite, mul_one, mul_zero] + rw [Finset.sum_ite_eq' Finset.univ a fun b => stdCoeff y b] + simp + +end GaugeAlgebra + +/-! + +## B. The torus acts by conjugation with a diagonal matrix + +-/ + +/-- su3 diagonals of inverse torus gens -/ +noncomputable def torusSU3Diag : Fin 4 → Fin 3 → ℂ := + ![![star (expI : ℂ), (expI : ℂ), 1], ![1, star (expI : ℂ), (expI : ℂ)], 1, 1] + +/-- su2 -/ +noncomputable def torusSU2Diag : Fin 4 → Fin 2 → ℂ := + ![1, 1, ![star (expI : ℂ), (expI : ℂ)], 1] + +lemma toSU3_inv_gaugeTorusGen (i : Fin 4) : + ((GaugeGroupI.toSU3 (gaugeTorusGen i)⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) = Matrix.diagonal (torusSU3Diag i) := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + fin_cases i <;> + · ext a b + fin_cases a <;> fin_cases b <;> + simp [gaugeTorusGen, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, torusSU3Diag, + Matrix.diagonal] + +lemma toSU2_inv_gaugeTorusGen (i : Fin 4) : + ((GaugeGroupI.toSU2 (gaugeTorusGen i)⁻¹ : specialUnitaryGroup (Fin 2) ℂ) : + Matrix (Fin 2) (Fin 2) ℂ) = Matrix.diagonal (torusSU2Diag i) := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + fin_cases i <;> + · ext a b + fin_cases a <;> fin_cases b <;> + simp [gaugeTorusGen, GaugeGroupI.toSU2, su2ExpI, torusSU2Diag, + Matrix.diagonal] + +namespace GaugeAlgebra + +lemma adjointMap_toSU3Matrix_apply_diagonal {g : GaugeGroupI} {d : Fin 3 → ℂ} + (hg : ((GaugeGroupI.toSU3 g : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) = Matrix.diagonal d) + (x : GaugeAlgebra) (j k : Fin 3) : + (adjointMap g x).toSU3Matrix j k = d j * star (d k) * x.toSU3Matrix j k := by + rw [adjointMap_toSU3Matrix, hg, Matrix.star_eq_conjTranspose, + Matrix.diagonal_conjTranspose, Matrix.mul_diagonal, Matrix.diagonal_mul, Pi.star_apply] + ring + +lemma adjointMap_toSU2Matrix_apply_diagonal {g : GaugeGroupI} {d : Fin 2 → ℂ} + (hg : ((GaugeGroupI.toSU2 g : specialUnitaryGroup (Fin 2) ℂ) : + Matrix (Fin 2) (Fin 2) ℂ) = Matrix.diagonal d) + (x : GaugeAlgebra) (j k : Fin 2) : + (adjointMap g x).toSU2Matrix j k = d j * star (d k) * x.toSU2Matrix j k := by + rw [adjointMap_toSU2Matrix, hg, Matrix.star_eq_conjTranspose, + Matrix.diagonal_conjTranspose, Matrix.mul_diagonal, Matrix.diagonal_mul, Pi.star_apply] + ring + +end GaugeAlgebra + +lemma torusSU3Diag_mul_star (i : Fin 4) (j : Fin 3) : + torusSU3Diag i j * star (torusSU3Diag i j) = 1 := by + fin_cases i <;> fin_cases j <;> + simp [torusSU3Diag, expI_mul_conj, conj_mul_expI] + +lemma torusSU2Diag_mul_star (i : Fin 4) (j : Fin 2) : + torusSU2Diag i j * star (torusSU2Diag i j) = 1 := by + fin_cases i <;> fin_cases j <;> + simp [torusSU2Diag, expI_mul_conj, conj_mul_expI] + +namespace GaugeAlgebra + +/-! + +## C. An entrywise scaling rotates the real pair of coordinate functionals + +-/ + +lemma dualMap_pair_of_entry {g : GaugeGroupI} {e : GaugeAlgebra → ℂ} + {φ₁ φ₂ : Module.Dual ℝ GaugeAlgebra} {z : ℂ} + (h1 : ∀ x, φ₁ x = (e x).re) (h2 : ∀ x, φ₂ x = -(e x).im) + (he : ∀ x, e (adjointMap g x) = star z * e x) : + (adjointMap g).dualMap φ₁ = z.re • φ₁ - z.im • φ₂ ∧ + (adjointMap g).dualMap φ₂ = z.im • φ₁ + z.re • φ₂ := by + constructor <;> refine LinearMap.ext fun x => ?_ <;> + simp only [LinearMap.dualMap_apply, LinearMap.sub_apply, LinearMap.add_apply, + LinearMap.smul_apply, smul_eq_mul, h1, h2, he, Complex.mul_re, Complex.mul_im, + Complex.star_def, Complex.conj_re, Complex.conj_im] <;> ring + +end GaugeAlgebra + +/-! + +## D. The root and Cartan directions of the adjoint + +The `su(3)` and `su(2)` blocks each contribute root directions — pairs of standard +basis indices whose coordinate functionals are the real part and minus the imaginary +part of one matrix entry — together with Cartan directions on which the torus acts +trivially; the `u(1)` generator is also fixed. + +-/ + +namespace GaugeAlgebra + +/-- The four root directions of the adjoint. -/ +def rootIdx : Fin 4 → (Fin 8 ⊕ Fin 3 ⊕ Fin 1) × (Fin 8 ⊕ Fin 3 ⊕ Fin 1) + | 0 => (Sum.inl 0, Sum.inl 1) + | 1 => (Sum.inl 3, Sum.inl 4) + | 2 => (Sum.inl 5, Sum.inl 6) + | 3 => (Sum.inr (Sum.inl 0), Sum.inr (Sum.inl 1)) + +/-- The gauge weight of each root direction. -/ +def rootWeight : Fin 4 → GaugeWeight + | 0 => (2, -1, 0, 0) + | 1 => (1, 1, 0, 0) + | 2 => (-1, 2, 0, 0) + | 3 => (0, 0, 2, 0) + +/-- The matrix entry scaled by the torus along each root direction. -/ +def rootEntry : Fin 4 → GaugeAlgebra → ℂ + | 0, x => x.toSU3Matrix 0 1 + | 1, x => x.toSU3Matrix 0 2 + | 2, x => x.toSU3Matrix 1 2 + | 3, x => x.toSU2Matrix 0 1 + +/-- The four weight-zero directions: the two `su(3)` Cartan generators, the `su(2)` + Cartan generator and the `u(1)` generator. -/ +def cartanIdx : Fin 4 → (Fin 8 ⊕ Fin 3 ⊕ Fin 1) + | 0 => Sum.inl 2 + | 1 => Sum.inl 7 + | 2 => Sum.inr (Sum.inl 2) + | 3 => Sum.inr (Sum.inr 0) + +lemma coord_rootIdx_fst (r : Fin 4) (x : GaugeAlgebra) : + stdBasis.coord (rootIdx r).1 x = (rootEntry r x).re := by + fin_cases r <;> (rw [stdBasis_coord_apply]; rfl) + +lemma coord_rootIdx_snd (r : Fin 4) (x : GaugeAlgebra) : + stdBasis.coord (rootIdx r).2 x = -(rootEntry r x).im := by + fin_cases r <;> (rw [stdBasis_coord_apply]; rfl) + +lemma rootEntry_adjointMap (r : Fin 4) (i : Fin 4) (x : GaugeAlgebra) : + rootEntry r (adjointMap (gaugeTorusGen i)⁻¹ x) + = star ((expI : ℂ) ^ GaugeWeight.coord (rootWeight r) i) * rootEntry r x := by + fin_cases r + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 0 1 = _ + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 0 1] + congr 1 + fin_cases i <;> + simp [torusSU3Diag, rootWeight, GaugeWeight.coord, + expI_inv_eq_star, _root_.zpow_neg, zpow_two, zpow_one] + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 0 2 = _ + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 0 2] + congr 1 + fin_cases i <;> + simp [torusSU3Diag, rootWeight, GaugeWeight.coord, + zpow_one] + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 1 2 = _ + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 1 2] + congr 1 + fin_cases i <;> + simp [torusSU3Diag, rootWeight, GaugeWeight.coord, + expI_inv_eq_star, _root_.zpow_neg, zpow_two, zpow_one] + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU2Matrix 0 1 = _ + rw [adjointMap_toSU2Matrix_apply_diagonal (toSU2_inv_gaugeTorusGen i) x 0 1] + congr 1 + fin_cases i <;> + simp [torusSU2Diag, rootWeight, GaugeWeight.coord, + zpow_two] + +lemma dualMap_coord_cartanIdx (c : Fin 4) (i : Fin 4) : + (adjointMap (gaugeTorusGen i)⁻¹).dualMap (stdBasis.coord (cartanIdx c)) + = stdBasis.coord (cartanIdx c) := by + refine LinearMap.ext fun x => ?_ + have h3 : ∀ j : Fin 3, (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix j j + = x.toSU3Matrix j j := fun j => by + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x j j, + torusSU3Diag_mul_star, one_mul] + have h2 : ∀ j : Fin 2, (adjointMap (gaugeTorusGen i)⁻¹ x).toSU2Matrix j j + = x.toSU2Matrix j j := fun j => by + rw [adjointMap_toSU2Matrix_apply_diagonal (toSU2_inv_gaugeTorusGen i) x j j, + torusSU2Diag_mul_star, one_mul] + have h1 : (adjointMap (gaugeTorusGen i)⁻¹ x).toU1Value = x.toU1Value := + adjointMap_toU1Value _ _ + fin_cases c <;> + simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, + gellMannCoeff, pauliCoeff, h3, h2, h1] + +end GaugeAlgebra + +/-! + +## E. Eigenvectors of the gauge action among the field-strength symbols + +-/ + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +lemma real_smul_eq (r : ℝ) (b : B) : r • b = ((r : ℂ)) • b := by + rw [← Complex.coe_algebraMap, algebraMap_smul] + +include h in +lemma repGauge_pair_add (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ₁ φ₂ : Module.Dual ℝ GaugeAlgebra) (z : ℂ) + (h1 : (GaugeAlgebra.adjointMap g⁻¹).dualMap φ₁ = z.re • φ₁ - z.im • φ₂) + (h2 : (GaugeAlgebra.adjointMap g⁻¹).dualMap φ₂ = z.im • φ₁ + z.re • φ₂) : + repGauge g (F l μ ν φ₁ + Complex.I • F l μ ν φ₂) + = z • (F l μ ν φ₁ + Complex.I • F l μ ν φ₂) := by + rw [map_add, map_smul, h.repGauge_F, h.repGauge_F, h1, h2, map_sub, map_add, + map_smul, map_smul, map_smul, map_smul, real_smul_eq z.re, real_smul_eq z.im, + real_smul_eq z.im, real_smul_eq z.re] + conv_rhs => rw [← Complex.re_add_im z] + match_scalars <;> · ring_nf; try rw [Complex.I_sq]; try ring + +include h in +lemma repGauge_pair_sub (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ₁ φ₂ : Module.Dual ℝ GaugeAlgebra) (z : ℂ) + (h1 : (GaugeAlgebra.adjointMap g⁻¹).dualMap φ₁ = z.re • φ₁ - z.im • φ₂) + (h2 : (GaugeAlgebra.adjointMap g⁻¹).dualMap φ₂ = z.im • φ₁ + z.re • φ₂) : + repGauge g (F l μ ν φ₁ - Complex.I • F l μ ν φ₂) + = (starRingEnd ℂ z) • (F l μ ν φ₁ - Complex.I • F l μ ν φ₂) := by + rw [map_sub, map_smul, h.repGauge_F, h.repGauge_F, h1, h2, map_sub, map_add, + map_smul, map_smul, map_smul, map_smul, real_smul_eq z.re, real_smul_eq z.im, + real_smul_eq z.im, real_smul_eq z.re] + rw [show (starRingEnd ℂ) z = (z.re : ℂ) - (z.im : ℂ) * Complex.I by + rw [Complex.ext_iff]; simp] + match_scalars <;> · ring_nf; try rw [Complex.I_sq]; try ring + +include h in +lemma repGauge_fixed (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) + (h1 : (GaugeAlgebra.adjointMap g⁻¹).dualMap φ = φ) : + repGauge g (F l μ ν φ) = F l μ ν φ := by + rw [h.repGauge_F, h1] + +/-! + +## F. The gauge weight decomposition + +-/ + +set_option linter.unusedVariables false in +open GaugeAlgebra in +/-- The weight vectors of the adjoint: for each root the two complex combinations of + the paired coordinate symbols, and for each Cartan direction the symbol itself. -/ +noncomputable def adjVec (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul F massWeightPoly) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : Fin 4 ⊕ Fin 4 ⊕ Fin 4 → B + | Sum.inl r => F l μ ν (stdBasis.coord (rootIdx r).1) + + Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2) + | Sum.inr (Sum.inl r) => F l μ ν (stdBasis.coord (rootIdx r).1) + - Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2) + | Sum.inr (Sum.inr c) => F l μ ν (stdBasis.coord (cartanIdx c)) + +/-- The gauge weight of each adjoint weight vector. -/ +def adjWeight : Fin 4 ⊕ Fin 4 ⊕ Fin 4 → GaugeWeight + | Sum.inl r => GaugeAlgebra.rootWeight r + | Sum.inr (Sum.inl r) => -(GaugeAlgebra.rootWeight r) + | Sum.inr (Sum.inr _) => 0 + +open GaugeAlgebra in +/-- Each adjoint weight vector is a simultaneous eigenvector of the gauge torus. -/ +lemma repGauge_adjVec {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (k : Fin 4 ⊕ Fin 4 ⊕ Fin 4) (i : Fin 4) : + repGauge (gaugeTorusGen i) (h.adjVec l μ ν k) + = ((expI : ℂ) ^ GaugeWeight.coord (adjWeight k) i) • h.adjVec l μ ν k := by + match k with + | Sum.inl r => + show repGauge (gaugeTorusGen i) (F l μ ν (stdBasis.coord (rootIdx r).1) + + Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2)) = _ + obtain ⟨p1, p2⟩ := dualMap_pair_of_entry (coord_rootIdx_fst r) (coord_rootIdx_snd r) + (rootEntry_adjointMap r i) + exact h.repGauge_pair_add _ l μ ν _ _ _ p1 p2 + | Sum.inr (Sum.inl r) => + show repGauge (gaugeTorusGen i) (F l μ ν (stdBasis.coord (rootIdx r).1) + - Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2)) = _ + obtain ⟨p1, p2⟩ := dualMap_pair_of_entry (coord_rootIdx_fst r) (coord_rootIdx_snd r) + (rootEntry_adjointMap r i) + rw [h.repGauge_pair_sub _ l μ ν _ _ _ p1 p2] + congr 1 + rw [show GaugeWeight.coord (adjWeight (Sum.inr (Sum.inl r) : + Fin 4 ⊕ Fin 4 ⊕ Fin 4)) i = -(GaugeWeight.coord (rootWeight r) i) from by + simp [adjWeight, GaugeWeight.coord_neg]] + rw [← Complex.star_def, star_expI_zpow] + | Sum.inr (Sum.inr c) => + show repGauge (gaugeTorusGen i) (F l μ ν (stdBasis.coord (cartanIdx c))) = _ + rw [h.repGauge_fixed _ l μ ν _ (dualMap_coord_cartanIdx c i)] + show _ = ((expI : ℂ) ^ GaugeWeight.coord (0 : GaugeWeight) i) • _ + simp [adjVec] + +open GaugeAlgebra in +/-- The first symbol of a root pair, recovered from the two weight vectors. -/ +lemma F_coord_rootIdx_fst {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (r : Fin 4) : + F l μ ν (stdBasis.coord (rootIdx r).1) + = (2 : ℂ)⁻¹ • (h.adjVec l μ ν (Sum.inl r) + + h.adjVec l μ ν (Sum.inr (Sum.inl r))) := by + show _ = (2 : ℂ)⁻¹ • ((F l μ ν (stdBasis.coord (rootIdx r).1) + + Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2)) + + (F l μ ν (stdBasis.coord (rootIdx r).1) + - Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2))) + match_scalars <;> · field_simp; try ring + +open GaugeAlgebra in +/-- The second symbol of a root pair, recovered from the two weight vectors. -/ +lemma F_coord_rootIdx_snd {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (r : Fin 4) : + F l μ ν (stdBasis.coord (rootIdx r).2) + = (-(Complex.I / 2)) • (h.adjVec l μ ν (Sum.inl r) + - h.adjVec l μ ν (Sum.inr (Sum.inl r))) := by + show _ = (-(Complex.I / 2)) • ((F l μ ν (stdBasis.coord (rootIdx r).1) + + Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2)) + - (F l μ ν (stdBasis.coord (rootIdx r).1) + - Complex.I • F l μ ν (stdBasis.coord (rootIdx r).2))) + match_scalars <;> · ring_nf; try rw [Complex.I_sq]; try ring + +open GaugeAlgebra in +/-- Every standard coordinate symbol lies in the join of the weight-vector lines. -/ +lemma F_coord_mem_iSup {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + F l μ ν (stdBasis.coord a) + ∈ ⨆ k, Submodule.span ℂ {h.adjVec l μ ν k} := by + have hmem : ∀ k, h.adjVec l μ ν k ∈ ⨆ k, Submodule.span ℂ {h.adjVec l μ ν k} := + fun k => Submodule.mem_iSup_of_mem k (Submodule.mem_span_singleton_self _) + have hfst : ∀ r : Fin 4, F l μ ν (stdBasis.coord (rootIdx r).1) + ∈ ⨆ k, Submodule.span ℂ {h.adjVec l μ ν k} := fun r => by + rw [h.F_coord_rootIdx_fst l μ ν r] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ (hmem _) (hmem _)) + have hsnd : ∀ r : Fin 4, F l μ ν (stdBasis.coord (rootIdx r).2) + ∈ ⨆ k, Submodule.span ℂ {h.adjVec l μ ν k} := fun r => by + rw [h.F_coord_rootIdx_snd l μ ν r] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ (hmem _) (hmem _)) + have hcar : ∀ c : Fin 4, F l μ ν (stdBasis.coord (cartanIdx c)) + ∈ ⨆ k, Submodule.span ℂ {h.adjVec l μ ν k} := fun c => hmem (Sum.inr (Sum.inr c)) + match a with + | Sum.inl k => + fin_cases k + · exact hfst 0 + · exact hsnd 0 + · exact hcar 0 + · exact hfst 1 + · exact hsnd 1 + · exact hfst 2 + · exact hsnd 2 + · exact hcar 1 + | Sum.inr (Sum.inl j) => + fin_cases j + · exact hfst 3 + · exact hsnd 3 + · exact hcar 2 + | Sum.inr (Sum.inr u) => + fin_cases u + · exact hcar 3 + +open GaugeAlgebra in +/-- The span of the field-strength symbols is the join of the twelve weight lines. -/ +lemma span_range_eq_iSup {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + Submodule.span ℂ (Set.range (F l μ ν)) + = ⨆ k, Submodule.span ℂ {h.adjVec l μ ν k} := by + refine le_antisymm (Submodule.span_le.mpr ?_) (iSup_le fun k => ?_) + · rintro x ⟨φ, rfl⟩ + rw [← stdBasis.sum_dual_apply_smul_coord φ, map_sum] + refine Submodule.sum_mem _ fun a _ => ?_ + rw [map_smul, real_smul_eq] + exact Submodule.smul_mem _ _ (h.F_coord_mem_iSup l μ ν a) + · refine (Submodule.span_singleton_le_iff_mem _ _).mpr ?_ + have hF : ∀ φ, F l μ ν φ ∈ Submodule.span ℂ (Set.range (F l μ ν)) := + fun φ => Submodule.subset_span ⟨φ, rfl⟩ + match k with + | Sum.inl r => + exact Submodule.add_mem _ (hF _) (Submodule.smul_mem _ _ (hF _)) + | Sum.inr (Sum.inl r) => + exact Submodule.sub_mem _ (hF _) (Submodule.smul_mem _ _ (hF _)) + | Sum.inr (Sum.inr c) => exact hF _ + +/-- The gauge weight decomposition of the span of one field-strength symbol map. -/ +@[implicit_reducible] +noncomputable def rangeGaugeWeight {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge (Submodule.span ℂ (Set.range (F l μ ν))) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun k => + GaugeWeightDecomposition.spanSingleton hrepGauge_mul (h.adjVec l μ ν k) (adjWeight k) + (fun i => h.repGauge_adjVec l μ ν k i)) + _ (h.span_range_eq_iSup l μ ν) + +/-- **The gauge weight decomposition of the gauge derivative submodules**, for any + number of covariant derivatives. -/ +@[implicit_reducible] +noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : + GaugeWeightDecomposition repGauge (h.derivSubmodule n) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hrepGauge_mul fun l : Fin n → Fin 1 ⊕ Fin 3 => + GaugeWeightDecomposition.iSup hrepGauge_mul fun μ : Fin 1 ⊕ Fin 3 => + GaugeWeightDecomposition.iSup hrepGauge_mul fun ν : Fin 1 ⊕ Fin 3 => + h.rangeGaugeWeight l μ ν) + _ (by rw [derivSubmodule]) +end IsGaugeSector + + +end StandardModel From 36e4142f63360fcaf460fe277e0ec08897ca9f16 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 28 Aug 2026 14:13:35 +0100 Subject: [PATCH 229/254] feat: human-in-the-loop AI pass --- Physlib.lean | 18 +- .../StandardModel/Fermions/DownSinglet.lean | 19 + .../StandardModel/Fermions/LeptonDoublet.lean | 18 + .../Fermions/LeptonSinglet/Basic.lean | 15 + .../StandardModel/Fermions/QuarkDoublet.lean | 19 + .../StandardModel/Fermions/UpSinglet.lean | 18 + .../GaugeAlgebra/RootDecomposition.lean | 267 +++ .../HiggsBoson/AlgebraValued/MassWeight.lean | 0 .../IsCovStandardModel/Basic.lean | 35 +- .../FermionGaugeSector/Basic.lean | 8 +- .../GaugeHiggsSector/Basic.lean | 256 +++ .../IsCovStandardModel/Generators.lean | 179 ++ .../IsCovStandardModel/MassWeight.lean | 21 +- .../IsCovStandardModel/MixedSector/Basic.lean | 102 ++ .../IsCovStandardModel/Sectors.lean | 110 +- .../YukawaSector/Basic.lean | 80 +- .../BoostWeightDecomposition.lean | 734 ++++++++ .../GaugeWeightDecomposition.lean | 90 + .../Basic.lean} | 0 .../MassWeight/GaugeWeightDecomposition.lean | 112 ++ .../BoostWeightDecomposition.lean | 371 ++++ .../GaugeWeightDecomposition.lean} | 268 +-- .../Basic.lean} | 3 +- .../MassWeight/GaugeWeightDecomposition.lean | 226 +++ .../Basic.lean | 1574 ++++++----------- .../DerivSubmodule/Basic.lean} | 9 +- .../IsHiggsSector/MassWeight/Basic.lean | 107 ++ .../Relativity/Fermions/Weyl/BoostWeight.lean | 51 + Physlib/Relativity/LightConeDeriv.lean | 571 ++++++ .../Invariants/IsQuadLorentz.lean | 6 +- 30 files changed, 3856 insertions(+), 1431 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean delete mode 100644 Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/MassWeight.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean rename Physlib/Particles/StandardModel/IsFermionSector/{ => DerivSubmodule}/GaugeWeightDecomposition.lean (76%) rename Physlib/Particles/StandardModel/IsFermionSector/{MassWeight.lean => MassWeight/Basic.lean} (100%) create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean rename Physlib/Particles/StandardModel/IsGaugeSector/{GaugeWieghtDecomposition.lean => DerivSubmodule/GaugeWeightDecomposition.lean} (56%) rename Physlib/Particles/StandardModel/IsGaugeSector/{MassWeight.lean => MassWeight/Basic.lean} (99%) create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean rename Physlib/Particles/StandardModel/{HiggsBoson/AlgebraValued => IsHiggsSector}/Basic.lean (75%) rename Physlib/Particles/StandardModel/{HiggsBoson/AlgebraValued/DerivSubmodule.lean => IsHiggsSector/DerivSubmodule/Basic.lean} (95%) create mode 100644 Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean create mode 100644 Physlib/Relativity/Fermions/Weyl/BoostWeight.lean create mode 100644 Physlib/Relativity/LightConeDeriv.lean diff --git a/Physlib.lean b/Physlib.lean index c58211102..c61cf4607 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -250,24 +250,32 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.DerivSubmodule +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsFermionSector.Basic -public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight -public import Physlib.Particles.StandardModel.IsFermionSector.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.Basic -public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight -public import Physlib.Particles.StandardModel.IsGaugeSector.GaugeWieghtDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors public import Physlib.Particles.StandardModel.IsCovStandardModel.FermionGaugeSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.MixedSector.Basic public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 75aa5ffc6..8cc088fe7 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv @@ -567,4 +568,22 @@ lemma DownSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : (fun j'' => DownSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j simpa using hd +/-! + +## The boost weight of the DownSinglet components + +-/ + +open Lorentz in +/-- The down-singlet basis diagonalises the `z`-boost: the colour index is inert, so the + weight is the Weyl weight of the spinor index. -/ +lemma downSinglet_repLorentzGroup_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) + (j : Fin 2 × Fin 3) : + DownSinglet.repLorentzGroup (SL2C.boostAxis 2 t ht) (DownSinglet.basis j) + = ((t : ℝ) : ℂ) ^ (weylWeight j.1) • DownSinglet.basis j := by + obtain ⟨k, c⟩ := j + simp [DownSinglet.basis, DownSinglet.repLorentzGroup, Module.Basis.map_apply, + Module.Basis.tensorProduct_apply, rightHandedWeyl_rep_boostAxis_two_basis] + rw [← TensorProduct.smul_tmul', map_smul] + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index 1c7962664..0537861b3 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv @@ -565,4 +566,21 @@ lemma LeptonDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j (fun j'' => LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j simpa using hd +/-! + +## The boost weight of the LeptonDoublet components + +-/ + +open Lorentz in +/-- The lepton-doublet basis diagonalises the `z`-boost: the isospin index is inert. -/ +lemma leptonDoublet_repLorentzGroup_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) + (j : Fin 2 × Fin 2) : + LeptonDoublet.repLorentzGroup (SL2C.boostAxis 2 t ht) (LeptonDoublet.basis j) + = ((t : ℝ) : ℂ) ^ (weylWeight j.1) • LeptonDoublet.basis j := by + obtain ⟨k, a⟩ := j + simp [LeptonDoublet.basis, LeptonDoublet.repLorentzGroup, Module.Basis.map_apply, + Module.Basis.tensorProduct_apply, leftHandedWeyl_rep_boostAxis_two_basis] + rw [← TensorProduct.smul_tmul', map_smul] + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index 691769e43..89611f41f 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -409,4 +410,18 @@ lemma LeptonSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j (fun j'' => LeptonSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j simpa using hd +/-! + +## The boost weight of the LeptonSinglet components + +-/ + +open Lorentz in +/-- The charged-lepton-singlet basis diagonalises the `z`-boost. -/ +lemma leptonSinglet_repLorentzGroup_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) (j : Fin 2) : + LeptonSinglet.repLorentzGroup (SL2C.boostAxis 2 t ht) (LeptonSinglet.basis j) + = ((t : ℝ) : ℂ) ^ (weylWeight j) • LeptonSinglet.basis j := by + simp [LeptonSinglet.basis, LeptonSinglet.repLorentzGroup, Module.Basis.map_apply, + rightHandedWeyl_rep_boostAxis_two_basis] + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean index fc24241da..36da7e23d 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv @@ -587,4 +588,22 @@ lemma QuarkDoublet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : (fun j'' => QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j simpa using hd +/-! + +## The boost weight of the QuarkDoublet components + +-/ + +open Lorentz in +/-- The quark-doublet basis diagonalises the `z`-boost: the colour and isospin indices are + inert. -/ +lemma quarkDoublet_repLorentzGroup_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) + (j : Fin 2 × Fin 3 × Fin 2) : + QuarkDoublet.repLorentzGroup (SL2C.boostAxis 2 t ht) (QuarkDoublet.basis j) + = ((t : ℝ) : ℂ) ^ (weylWeight j.1) • QuarkDoublet.basis j := by + obtain ⟨k, c, a⟩ := j + simp [QuarkDoublet.basis, QuarkDoublet.repLorentzGroup, Module.Basis.map_apply, + Module.Basis.tensorProduct_apply, leftHandedWeyl_rep_boostAxis_two_basis] + rw [← TensorProduct.smul_tmul', ← TensorProduct.smul_tmul', map_smul] + end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean index e3b9447ea..f094b3e84 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Basic +public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv @@ -467,4 +468,21 @@ lemma UpSinglet.repGaugeGroupI_conj_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fi (fun j'' => UpSinglet.repGaugeGroupI_gaugeTorusGen_basis i j'') j') j simpa using hd +/-! + +## The boost weight of the UpSinglet components + +-/ + +open Lorentz in +/-- The up-singlet basis diagonalises the `z`-boost. -/ +lemma upSinglet_repLorentzGroup_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) + (j : Fin 2 × Fin 3) : + UpSinglet.repLorentzGroup (SL2C.boostAxis 2 t ht) (UpSinglet.basis j) + = ((t : ℝ) : ℂ) ^ (weylWeight j.1) • UpSinglet.basis j := by + obtain ⟨k, c⟩ := j + simp [UpSinglet.basis, UpSinglet.repLorentzGroup, Module.Basis.map_apply, + Module.Basis.tensorProduct_apply, rightHandedWeyl_rep_boostAxis_two_basis] + rw [← TensorProduct.smul_tmul', map_smul] + end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean new file mode 100644 index 000000000..44c18c266 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean @@ -0,0 +1,267 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeAlgebra.Basis +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +/-! +# The root decomposition of the gauge algebra + +The gauge torus acts on the gauge algebra by conjugation with a diagonal matrix, so it +scales the matrix entry `(j, k)` of the `su(3)` and `su(2)` blocks by `d j * star (d k)`. +Off the diagonal this makes the real and imaginary parts of an entry a rotating pair — +the root directions, recorded by `rootIdx`, `rootEntry` and `rootWeight` — while the +diagonal directions and the `u(1)` generator are fixed, and are recorded by `cartanIdx`. + +This is the adjoint analogue of the weights carried by the matter representations, and +is what the gauge sector's gauge weight decomposition is built from. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups + +/-- Conjugation inverts a power of `expI`. -/ +lemma star_expI_zpow (z : ℤ) : star ((expI : ℂ) ^ z) = (expI : ℂ) ^ (-z) := by + rw [Complex.star_def, starRingEnd_expI_zpow] + +/-! + +## A. The coordinates of the standard basis + +-/ + +namespace GaugeAlgebra + +/-- coords -/ +noncomputable def stdCoeff (x : GaugeAlgebra) : Fin 8 ⊕ Fin 3 ⊕ Fin 1 → ℝ + | Sum.inl k => gellMannCoeff x.toSU3Matrix k + | Sum.inr (Sum.inl i) => pauliCoeff x.toSU2Matrix i + | Sum.inr (Sum.inr _) => (x.toU1Value).re + +lemma eq_sum_stdCoeff (x : GaugeAlgebra) : x = ∑ y, stdCoeff x y • stdBasis y := by + refine ext_of_matrix ?_ ?_ ?_ + · rw [toSU3Matrix_sum] + simp only [Fintype.sum_sum_type, smul_toSU3Matrix, stdBasis_inl_toSU3Matrix, + stdBasis_inr_inl_toSU3Matrix, stdBasis_inr_inr_toSU3Matrix, smul_zero, + Finset.sum_const_zero, add_zero] + exact eq_sum_gellMannCoeff_smul x.1.2.1 x.1.2.2 + · rw [toSU2Matrix_sum] + simp only [Fintype.sum_sum_type, smul_toSU2Matrix, stdBasis_inl_toSU2Matrix, + stdBasis_inr_inl_toSU2Matrix, stdBasis_inr_inr_toSU2Matrix, smul_zero, + Finset.sum_const_zero, zero_add, add_zero] + exact eq_sum_pauliCoeff_smul x.2.1.2.1 x.2.1.2.2 + · have h1 : ((x.toU1Value.re : ℝ) : ℂ) = x.toU1Value := + Complex.conj_eq_iff_re.mp x.2.2.2 + rw [toU1Value_sum] + simp only [Fintype.sum_sum_type, smul_toU1Value, stdBasis_inl_toU1Value, + stdBasis_inr_inl_toU1Value, stdBasis_inr_inr_toU1Value, stdCoeff, + Complex.real_smul, mul_zero, Finset.sum_const_zero, zero_add, mul_one, + Finset.sum_const, Finset.card_univ, Fintype.card_fin, one_smul, h1] + +/-- The coordinate functionals of `stdBasis` read off a gauge-algebra element's matrix + entries. -/ +lemma stdBasis_coord_apply (y : GaugeAlgebra) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + stdBasis.coord a y = stdCoeff y a := by + conv_lhs => rw [eq_sum_stdCoeff y] + rw [map_sum] + simp only [map_smul, smul_eq_mul, Module.Basis.coord_apply, Module.Basis.repr_self, + Finsupp.single_apply, mul_ite, mul_one, mul_zero] + rw [Finset.sum_ite_eq' Finset.univ a fun b => stdCoeff y b] + simp + +end GaugeAlgebra + +/-! + +## B. The torus acts by conjugation with a diagonal matrix + +-/ + +/-- su3 diagonals of inverse torus gens -/ +noncomputable def torusSU3Diag : Fin 4 → Fin 3 → ℂ := + ![![star (expI : ℂ), (expI : ℂ), 1], ![1, star (expI : ℂ), (expI : ℂ)], 1, 1] + +/-- su2 -/ +noncomputable def torusSU2Diag : Fin 4 → Fin 2 → ℂ := + ![1, 1, ![star (expI : ℂ), (expI : ℂ)], 1] + +lemma toSU3_inv_gaugeTorusGen (i : Fin 4) : + ((GaugeGroupI.toSU3 (gaugeTorusGen i)⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) = Matrix.diagonal (torusSU3Diag i) := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + fin_cases i <;> + · ext a b + fin_cases a <;> fin_cases b <;> + simp [gaugeTorusGen, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, torusSU3Diag, + Matrix.diagonal] + +lemma toSU2_inv_gaugeTorusGen (i : Fin 4) : + ((GaugeGroupI.toSU2 (gaugeTorusGen i)⁻¹ : specialUnitaryGroup (Fin 2) ℂ) : + Matrix (Fin 2) (Fin 2) ℂ) = Matrix.diagonal (torusSU2Diag i) := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + fin_cases i <;> + · ext a b + fin_cases a <;> fin_cases b <;> + simp [gaugeTorusGen, GaugeGroupI.toSU2, su2ExpI, torusSU2Diag, + Matrix.diagonal] + +namespace GaugeAlgebra + +lemma adjointMap_toSU3Matrix_apply_diagonal {g : GaugeGroupI} {d : Fin 3 → ℂ} + (hg : ((GaugeGroupI.toSU3 g : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) = Matrix.diagonal d) + (x : GaugeAlgebra) (j k : Fin 3) : + (adjointMap g x).toSU3Matrix j k = d j * star (d k) * x.toSU3Matrix j k := by + rw [adjointMap_toSU3Matrix, hg, Matrix.star_eq_conjTranspose, + Matrix.diagonal_conjTranspose, Matrix.mul_diagonal, Matrix.diagonal_mul, Pi.star_apply] + ring + +lemma adjointMap_toSU2Matrix_apply_diagonal {g : GaugeGroupI} {d : Fin 2 → ℂ} + (hg : ((GaugeGroupI.toSU2 g : specialUnitaryGroup (Fin 2) ℂ) : + Matrix (Fin 2) (Fin 2) ℂ) = Matrix.diagonal d) + (x : GaugeAlgebra) (j k : Fin 2) : + (adjointMap g x).toSU2Matrix j k = d j * star (d k) * x.toSU2Matrix j k := by + rw [adjointMap_toSU2Matrix, hg, Matrix.star_eq_conjTranspose, + Matrix.diagonal_conjTranspose, Matrix.mul_diagonal, Matrix.diagonal_mul, Pi.star_apply] + ring + +end GaugeAlgebra + +lemma torusSU3Diag_mul_star (i : Fin 4) (j : Fin 3) : + torusSU3Diag i j * star (torusSU3Diag i j) = 1 := by + fin_cases i <;> fin_cases j <;> + simp [torusSU3Diag, expI_mul_conj, conj_mul_expI] + +lemma torusSU2Diag_mul_star (i : Fin 4) (j : Fin 2) : + torusSU2Diag i j * star (torusSU2Diag i j) = 1 := by + fin_cases i <;> fin_cases j <;> + simp [torusSU2Diag, expI_mul_conj, conj_mul_expI] + +namespace GaugeAlgebra + +/-! + +## C. An entrywise scaling rotates the real pair of coordinate functionals + +-/ + +lemma dualMap_pair_of_entry {g : GaugeGroupI} {e : GaugeAlgebra → ℂ} + {φ₁ φ₂ : Module.Dual ℝ GaugeAlgebra} {z : ℂ} + (h1 : ∀ x, φ₁ x = (e x).re) (h2 : ∀ x, φ₂ x = -(e x).im) + (he : ∀ x, e (adjointMap g x) = star z * e x) : + (adjointMap g).dualMap φ₁ = z.re • φ₁ - z.im • φ₂ ∧ + (adjointMap g).dualMap φ₂ = z.im • φ₁ + z.re • φ₂ := by + constructor <;> refine LinearMap.ext fun x => ?_ <;> + simp only [LinearMap.dualMap_apply, LinearMap.sub_apply, LinearMap.add_apply, + LinearMap.smul_apply, smul_eq_mul, h1, h2, he, Complex.mul_re, Complex.mul_im, + Complex.star_def, Complex.conj_re, Complex.conj_im] <;> ring + +end GaugeAlgebra + +/-! + +## D. The root and Cartan directions of the adjoint + +The `su(3)` and `su(2)` blocks each contribute root directions — pairs of standard +basis indices whose coordinate functionals are the real part and minus the imaginary +part of one matrix entry — together with Cartan directions on which the torus acts +trivially; the `u(1)` generator is also fixed. + +-/ + +namespace GaugeAlgebra + +/-- The four root directions of the adjoint. -/ +def rootIdx : Fin 4 → (Fin 8 ⊕ Fin 3 ⊕ Fin 1) × (Fin 8 ⊕ Fin 3 ⊕ Fin 1) + | 0 => (Sum.inl 0, Sum.inl 1) + | 1 => (Sum.inl 3, Sum.inl 4) + | 2 => (Sum.inl 5, Sum.inl 6) + | 3 => (Sum.inr (Sum.inl 0), Sum.inr (Sum.inl 1)) + +/-- The gauge weight of each root direction. -/ +def rootWeight : Fin 4 → GaugeWeight + | 0 => (2, -1, 0, 0) + | 1 => (1, 1, 0, 0) + | 2 => (-1, 2, 0, 0) + | 3 => (0, 0, 2, 0) + +/-- The matrix entry scaled by the torus along each root direction. -/ +def rootEntry : Fin 4 → GaugeAlgebra → ℂ + | 0, x => x.toSU3Matrix 0 1 + | 1, x => x.toSU3Matrix 0 2 + | 2, x => x.toSU3Matrix 1 2 + | 3, x => x.toSU2Matrix 0 1 + +/-- The four weight-zero directions: the two `su(3)` Cartan generators, the `su(2)` + Cartan generator and the `u(1)` generator. -/ +def cartanIdx : Fin 4 → (Fin 8 ⊕ Fin 3 ⊕ Fin 1) + | 0 => Sum.inl 2 + | 1 => Sum.inl 7 + | 2 => Sum.inr (Sum.inl 2) + | 3 => Sum.inr (Sum.inr 0) + +lemma coord_rootIdx_fst (r : Fin 4) (x : GaugeAlgebra) : + stdBasis.coord (rootIdx r).1 x = (rootEntry r x).re := by + fin_cases r <;> (rw [stdBasis_coord_apply]; rfl) + +lemma coord_rootIdx_snd (r : Fin 4) (x : GaugeAlgebra) : + stdBasis.coord (rootIdx r).2 x = -(rootEntry r x).im := by + fin_cases r <;> (rw [stdBasis_coord_apply]; rfl) + +lemma rootEntry_adjointMap (r : Fin 4) (i : Fin 4) (x : GaugeAlgebra) : + rootEntry r (adjointMap (gaugeTorusGen i)⁻¹ x) + = star ((expI : ℂ) ^ GaugeWeight.coord (rootWeight r) i) * rootEntry r x := by + fin_cases r + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 0 1 = _ + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 0 1] + congr 1 + fin_cases i <;> + simp [torusSU3Diag, rootWeight, GaugeWeight.coord, + expI_inv_eq_star, _root_.zpow_neg, zpow_two, zpow_one] + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 0 2 = _ + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 0 2] + congr 1 + fin_cases i <;> + simp [torusSU3Diag, rootWeight, GaugeWeight.coord, + zpow_one] + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 1 2 = _ + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 1 2] + congr 1 + fin_cases i <;> + simp [torusSU3Diag, rootWeight, GaugeWeight.coord, + expI_inv_eq_star, _root_.zpow_neg, zpow_two, zpow_one] + · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU2Matrix 0 1 = _ + rw [adjointMap_toSU2Matrix_apply_diagonal (toSU2_inv_gaugeTorusGen i) x 0 1] + congr 1 + fin_cases i <;> + simp [torusSU2Diag, rootWeight, GaugeWeight.coord, + zpow_two] + +lemma dualMap_coord_cartanIdx (c : Fin 4) (i : Fin 4) : + (adjointMap (gaugeTorusGen i)⁻¹).dualMap (stdBasis.coord (cartanIdx c)) + = stdBasis.coord (cartanIdx c) := by + refine LinearMap.ext fun x => ?_ + have h3 : ∀ j : Fin 3, (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix j j + = x.toSU3Matrix j j := fun j => by + rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x j j, + torusSU3Diag_mul_star, one_mul] + have h2 : ∀ j : Fin 2, (adjointMap (gaugeTorusGen i)⁻¹ x).toSU2Matrix j j + = x.toSU2Matrix j j := fun j => by + rw [adjointMap_toSU2Matrix_apply_diagonal (toSU2_inv_gaugeTorusGen i) x j j, + torusSU2Diag_mul_star, one_mul] + have h1 : (adjointMap (gaugeTorusGen i)⁻¹ x).toU1Value = x.toU1Value := + adjointMap_toU1Value _ _ + fin_cases c <;> + simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, + gellMannCoeff, pauliCoeff, h3, h2, h1] + +end GaugeAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/MassWeight.lean b/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/MassWeight.lean deleted file mode 100644 index e69de29bb..000000000 diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean index 7fc023137..cb977979c 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean @@ -11,9 +11,9 @@ public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebra public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic -public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight -public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight +public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic /-! # The algebra valued Standard model @@ -28,6 +28,35 @@ algebra they generate. The covariant generators of that algebra are in `IsCovStandardModel.Generators`, and the mass-weight grading in `IsCovStandardModel.MassWeight`. +## The sectors + +Every covariant generator belongs to one of three classes — **gauge** (the +field-strength towers), **Higgs** (the Higgs towers and their conjugates) and +**fermion** (the ten families and their conjugates) — and a word in the generators +realises a set of classes. The weight-`w` part of the algebra therefore splits over +the eight subsets of the three classes; the splitting itself is +[`Sectors.lean`](Sectors.lean), and each subset is developed in its own file: + +| classes realised | sector | file | +| --- | --- | --- | +| `∅` | the scalars, present at weight zero only | — | +| `{gauge}` | `IsGaugeSector` | [`IsGaugeSector/MassWeight/Basic.lean`](../IsGaugeSector/MassWeight/Basic.lean) | +| `{higgs}` | `IsHiggsSector` | [`IsHiggsSector/MassWeight/Basic.lean`](../IsHiggsSector/MassWeight/Basic.lean) | +| `{fermion}` | `IsFermionSector` | [`IsFermionSector/MassWeight/Basic.lean`](../IsFermionSector/MassWeight/Basic.lean) | +| `{gauge, higgs}` | the gauge–Higgs sector | [`GaugeHiggsSector/Basic.lean`](GaugeHiggsSector/Basic.lean) | +| `{gauge, fermion}` | the gauge–fermion sector | [`FermionGaugeSector/Basic.lean`](FermionGaugeSector/Basic.lean) | +| `{higgs, fermion}` | the Yukawa sector | [`YukawaSector/Basic.lean`](YukawaSector/Basic.lean) | +| `{gauge, higgs, fermion}` | the mixed sector | [`MixedSector/Basic.lean`](MixedSector/Basic.lean) | + +The weight-`w` part of a pure sector is exactly the mass-weight submodule of the +corresponding sector structure; the mixed sectors are bounded by products of those. + +Because the lightest generator of each class has mass weight four (gauge), two +(Higgs) and three (fermion), a sector is empty below the sum of the minimum weights +of the classes it contains. In particular the mixed sector is empty below weight +nine, so no Standard-Model term of mass dimension at most four involves all three +kinds of field at once. + -/ @[expose] public section diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean index 6cccd3a6b..5777f8bf6 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean @@ -127,7 +127,7 @@ lemma fermionMassWeight_mul_gaugeMassWeight_le (a b : ℕ) : `{gauge, fermion}` sector lies in the join, over the splittings of `w` into two non-zero parts, of the products of the gauge and fermion sectors' own mass-weight submodules. -/ -theorem sectorMassWeight_gauge_fermion_le (w : ℕ) : +lemma sectorMassWeight_gauge_fermion_le (w : ℕ) : h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} w ≤ ⨆ (p : ℕ × ℕ) (_ : p.1 + p.2 = w) (_ : p.1 ≠ 0) (_ : p.2 ≠ 0), h.isGaugeSector.massWeightSubmodule p.1 * h.isFermionSector.massWeightSubmodule p.2 := @@ -144,7 +144,7 @@ theorem sectorMassWeight_gauge_fermion_le (w : ℕ) : /-- **The mixed gauge-fermion sector vanishes below weight `7`.** A non-zero gauge weight is at least `4` and a non-zero fermion weight is at least `3`, so no splitting of a weight below `7` into two non-zero parts can supply both. -/ -theorem sectorMassWeight_gauge_fermion_eq_bot_of_lt_seven {w : ℕ} (hw : w < 7) : +lemma sectorMassWeight_gauge_fermion_eq_bot_of_lt_seven {w : ℕ} (hw : w < 7) : h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} w = ⊥ := by refine le_bot_iff.mp ((h.sectorMassWeight_gauge_fermion_le w).trans ?_) refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ @@ -167,7 +167,7 @@ theorem sectorMassWeight_gauge_fermion_eq_bot_of_lt_seven {w : ℕ} (hw : w < 7) `8` into two non-zero parts with a non-zero gauge weight and a non-zero fermion weight would need the gauge part to be `4` or `6`(with fermion part `4` or `2`), but the fermion sector vanishes at both `4` and `2`. -/ -theorem sectorMassWeight_gauge_fermion_eight : +lemma sectorMassWeight_gauge_fermion_eight : h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 8 = ⊥ := by refine le_bot_iff.mp ((h.sectorMassWeight_gauge_fermion_le 8).trans ?_) refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ @@ -191,7 +191,7 @@ theorem sectorMassWeight_gauge_fermion_eight : underived field-strength submodule with the underived fermion submodule: the only splitting of `7` into a non-zero gauge weight and a non-zero fermion weight that survives is `4 + 3`. -/ -theorem sectorMassWeight_gauge_fermion_seven : +lemma sectorMassWeight_gauge_fermion_seven : h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 7 = h.isGaugeSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 0 := by refine le_antisymm ?_ ?_ diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean index e69de29bb..c701b9961 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean @@ -0,0 +1,256 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic +/-! +# The mixed gauge-Higgs sector + +The field-strength towers are bosonic, so they commute with every Higgs tower +(`h.F_comm_H`, `h.F_comm_barH`); consequently the gauge algebra and the Higgs algebra +commute (`commute_of_mem_gaugeAlgebra_of_mem_higgsAlgebra`), and so do their +mass-weight submodules in either order (`higgsMassWeight_mul_gaugeMassWeight_le`). +Feeding this into the abstract two-class bound `sectorMassWeight_pair_le` gives the +mixed `{gauge, higgs}` sector's weight-`w` piece as a join, over the splittings of `w` +into two non-zero parts, of products of the two sectors' own mass-weight submodules +(`sectorMassWeight_gauge_higgs_le`). + +Both a non-zero gauge weight and a non-zero Higgs weight are even, and they are at +least `4` and `2` respectively. So the mixed sector vanishes below weight `6` and at +every odd weight; at weight `6` it is exactly the underived field strength against the +underived Higgs, and at weight `8` it is bounded by the field strength against the +weight-four Higgs terms together with the once-derived field strength against the +underived Higgs. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) + +/-- The gauge algebra and the Higgs algebra commute element-wise. -/ +lemma commute_of_mem_gaugeAlgebra_of_mem_higgsAlgebra {x y : B} + (hx : x ∈ h.isGaugeSector.gaugeAlgebra) (hy : y ∈ h.isHiggsSector.higgsAlgebra) : + Commute x y := by + have hgen : ∀ a ∈ (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) + (ν : Fin 1 ⊕ Fin 3), Set.range (F l μ ν)), + ∀ b ∈ (⋃ (k : ℕ) (dd : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (H dd) ∪ Set.range (barH dd)), Commute a b := by + intro a ha b hb + simp only [Set.mem_iUnion, Set.mem_range] at ha + obtain ⟨n, l, μ, ν, φ, rfl⟩ := ha + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hb + obtain ⟨k, dd, (⟨φ', rfl⟩ | ⟨φ', rfl⟩)⟩ := hb + · exact h.F_comm_H l μ ν φ dd φ' + · exact h.F_comm_barH l μ ν φ dd φ' + rw [IsGaugeSector.gaugeAlgebra] at hx + rw [IsHiggsSector.higgsAlgebra] at hy + refine Algebra.commute_of_mem_adjoin_of_forall_mem_commute hy fun b hb => ?_ + exact (Algebra.commute_of_mem_adjoin_of_forall_mem_commute hx + fun a ha => (hgen a ha b hb).symm).symm + +/-- The Higgs and gauge mass-weight submodules commute past each other. -/ +lemma higgsMassWeight_mul_gaugeMassWeight_le (a b : ℕ) : + h.isHiggsSector.massWeightSubmodule a * h.isGaugeSector.massWeightSubmodule b + ≤ h.isGaugeSector.massWeightSubmodule b * h.isHiggsSector.massWeightSubmodule a := by + refine Submodule.mul_le.mpr fun x hx y hy => ?_ + rw [(h.commute_of_mem_gaugeAlgebra_of_mem_higgsAlgebra + (h.isGaugeSector.mem_gaugeAlgebra_of_mem_massWeightSubmodule hy) + (h.isHiggsSector.mem_higgsAlgebra_of_mem_massWeightSubmodule hx)).symm.eq] + exact Submodule.mul_mem_mul hy hx + +/-- The mixed gauge-Higgs sector decomposition. -/ +lemma sectorMassWeight_gauge_higgs_le (w : ℕ) : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} w + ≤ ⨆ (p : ℕ × ℕ) (_ : p.1 + p.2 = w) (_ : p.1 ≠ 0) (_ : p.2 ≠ 0), + h.isGaugeSector.massWeightSubmodule p.1 * h.isHiggsSector.massWeightSubmodule p.2 := + h.sectorMassWeight_pair_le (c₁ := GeneratorClass.gauge) (c₂ := GeneratorClass.higgs) + (M₁ := h.isGaugeSector.massWeightSubmodule) (M₂ := h.isHiggsSector.massWeightSubmodule) + (by decide) + (fun w => h.sectorMassWeight_gauge_le w) (fun w => h.sectorMassWeight_higgs_le w) + h.isGaugeSector.one_le_massWeightSubmodule_zero + h.isHiggsSector.one_le_massWeightSubmodule_zero + (fun a b => h.isGaugeSector.massWeightSubmodule_mul_le a b) + (fun a b => h.isHiggsSector.massWeightSubmodule_mul_le a b) + (fun a b => h.higgsMassWeight_mul_gaugeMassWeight_le a b) w + +/-- The mixed gauge-Higgs sector vanishes below weight `6`. -/ +lemma sectorMassWeight_gauge_higgs_eq_bot_of_lt_six {w : ℕ} (hw : w < 6) : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} w = ⊥ := by + have ho : ∀ k : ℕ, Odd k → h.isHiggsSector.massWeightSubmodule k = ⊥ := + fun k hk => h.isHiggsSector.massWeightSubmodule_odd_eq_bot k hk + refine le_bot_iff.mp ((h.sectorMassWeight_gauge_higgs_le w).trans ?_) + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + dsimp only at hp h1 h2 ⊢ + have ha : a ≤ 5 := by omega + have hb : b ≤ 5 := by omega + interval_cases a <;> interval_cases b <;> + first + | omega + | simp [h.isGaugeSector.massWeightSubmodule_one_eq, + h.isGaugeSector.massWeightSubmodule_two_eq, + h.isGaugeSector.massWeightSubmodule_three_eq, + ho 1 (by decide), ho 3 (by decide)] + +/-- The mixed gauge-Higgs sector vanishes at weight `7`: both a gauge weight and a + Higgs weight are even, so they cannot sum to an odd number. -/ +lemma sectorMassWeight_gauge_higgs_seven : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} 7 = ⊥ := by + have ho : ∀ k : ℕ, Odd k → h.isHiggsSector.massWeightSubmodule k = ⊥ := + fun k hk => h.isHiggsSector.massWeightSubmodule_odd_eq_bot k hk + refine le_bot_iff.mp ((h.sectorMassWeight_gauge_higgs_le 7).trans ?_) + refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ + obtain ⟨a, b⟩ := p + dsimp only at hp h1 h2 ⊢ + have ha : a ≤ 6 := by omega + have hb : b ≤ 6 := by omega + interval_cases a <;> interval_cases b <;> + first + | omega + | simp [h.isGaugeSector.massWeightSubmodule_one_eq, + h.isGaugeSector.massWeightSubmodule_two_eq, + h.isGaugeSector.massWeightSubmodule_three_eq, + h.isGaugeSector.massWeightSubmodule_five_eq, + ho 1 (by decide), ho 3 (by decide), ho 5 (by decide)] + +/-- **The mixed gauge-Higgs sector at weight `6`** is exactly the product of the + underived field strength with the underived Higgs: the only surviving splitting is + `4 + 2`. -/ +lemma sectorMassWeight_gauge_higgs_six : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} 6 + = h.isGaugeSector.derivSubmodule 0 * h.isHiggsSector.derivSubmodule 0 := by + have ho : ∀ k : ℕ, Odd k → h.isHiggsSector.massWeightSubmodule k = ⊥ := + fun k hk => h.isHiggsSector.massWeightSubmodule_odd_eq_bot k hk + refine le_antisymm ?_ ?_ + · refine (h.sectorMassWeight_gauge_higgs_le 6).trans + (iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_) + obtain ⟨a, b⟩ := p + dsimp only at hp h1 h2 ⊢ + have ha : a ≤ 5 := by omega + have hb : b ≤ 5 := by omega + interval_cases a <;> interval_cases b <;> + first + | omega + | simp [h.isGaugeSector.massWeightSubmodule_one_eq, + h.isGaugeSector.massWeightSubmodule_two_eq, + h.isGaugeSector.massWeightSubmodule_three_eq, + h.isGaugeSector.massWeightSubmodule_four_eq, + h.isGaugeSector.massWeightSubmodule_five_eq, + h.isHiggsSector.massWeightSubmodule_two_eq_deriv, + ho 1 (by decide), ho 3 (by decide), bot_le] + · have hgauge : h.isGaugeSector.derivSubmodule 0 + = h.sectorMassWeight {GeneratorClass.gauge} 4 := by + rw [← h.isGaugeSector.massWeightSubmodule_four_eq, + ← h.sectorMassWeight_gauge_eq (by norm_num)] + have hhiggs : h.isHiggsSector.derivSubmodule 0 + = h.sectorMassWeight {GeneratorClass.higgs} 2 := by + rw [← h.isHiggsSector.massWeightSubmodule_two_eq_deriv, + ← h.sectorMassWeight_higgs_eq (by norm_num)] + rw [hgauge, hhiggs] + have hset : ({GeneratorClass.gauge} ∪ {GeneratorClass.higgs} : Finset GeneratorClass) + = {GeneratorClass.gauge, GeneratorClass.higgs} := by decide + refine Submodule.mul_le.mpr fun x hx y hy => ?_ + have := h.mul_mem_sectorMassWeight hx hy + rwa [hset] at this + +/-- A product of a gauge-weight piece and a Higgs-weight piece lands in the mixed + sector of the total weight. -/ +lemma mul_le_sectorMassWeight_gauge_higgs {a b w : ℕ} {X Y : Submodule ℂ B} + (ha : a ≠ 0) (hb : b ≠ 0) (hab : a + b = w) + (hX : X ≤ h.isGaugeSector.massWeightSubmodule a) + (hY : Y ≤ h.isHiggsSector.massWeightSubmodule b) : + X * Y ≤ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} w := by + have hset : ({GeneratorClass.gauge} ∪ {GeneratorClass.higgs} : Finset GeneratorClass) + = {GeneratorClass.gauge, GeneratorClass.higgs} := by decide + refine Submodule.mul_le.mpr fun x hx y hy => ?_ + have hx' : x ∈ h.sectorMassWeight {GeneratorClass.gauge} a := by + rw [h.sectorMassWeight_gauge_eq ha]; exact hX hx + have hy' : y ∈ h.sectorMassWeight {GeneratorClass.higgs} b := by + rw [h.sectorMassWeight_higgs_eq hb]; exact hY hy + have hmem := h.mul_mem_sectorMassWeight hx' hy' + rwa [hset, hab] at hmem + +/-- **The mixed gauge-Higgs sector at weight `8`.** The surviving splittings are + `4 + 4` and `6 + 2`, giving the field strength against the weight-four Higgs terms + and the once-derived field strength against the underived Higgs. -/ +lemma sectorMassWeight_gauge_higgs_eight : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} 8 + = h.isGaugeSector.derivSubmodule 0 * h.isHiggsSector.derivSubmodule 1 + ⊔ h.isGaugeSector.derivSubmodule 0 * h.isHiggsSector.derivSubmodule 0 + * h.isHiggsSector.derivSubmodule 0 + ⊔ h.isGaugeSector.derivSubmodule 1 * h.isHiggsSector.derivSubmodule 0 := by + refine le_antisymm ?_ ?_ + case refine_2 => + refine sup_le (sup_le ?_ ?_) ?_ + · exact h.mul_le_sectorMassWeight_gauge_higgs (a := 4) (b := 4) (by norm_num) + (by norm_num) (by norm_num) (le_of_eq h.isGaugeSector.massWeightSubmodule_four_eq.symm) + (by rw [h.isHiggsSector.massWeightSubmodule_four_eq_deriv]; exact le_sup_left) + · rw [mul_assoc] + exact h.mul_le_sectorMassWeight_gauge_higgs (a := 4) (b := 4) (by norm_num) + (by norm_num) (by norm_num) (le_of_eq h.isGaugeSector.massWeightSubmodule_four_eq.symm) + (by rw [h.isHiggsSector.massWeightSubmodule_four_eq_deriv]; exact le_sup_right) + · exact h.mul_le_sectorMassWeight_gauge_higgs (a := 6) (b := 2) (by norm_num) + (by norm_num) (by norm_num) (le_of_eq h.isGaugeSector.massWeightSubmodule_six_eq.symm) + (le_of_eq h.isHiggsSector.massWeightSubmodule_two_eq_deriv.symm) + rw [mul_assoc] + have ho : ∀ k : ℕ, Odd k → h.isHiggsSector.massWeightSubmodule k = ⊥ := + fun k hk => h.isHiggsSector.massWeightSubmodule_odd_eq_bot k hk + refine (h.sectorMassWeight_gauge_higgs_le 8).trans + (iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_) + obtain ⟨a, b⟩ := p + dsimp only at hp h1 h2 ⊢ + have ha : a ≤ 7 := by omega + have hb : b ≤ 7 := by omega + interval_cases a <;> interval_cases b <;> + first + | omega + | simp [h.isGaugeSector.massWeightSubmodule_one_eq, + h.isGaugeSector.massWeightSubmodule_two_eq, + h.isGaugeSector.massWeightSubmodule_three_eq, + h.isGaugeSector.massWeightSubmodule_four_eq, + h.isGaugeSector.massWeightSubmodule_five_eq, + h.isGaugeSector.massWeightSubmodule_six_eq, + h.isGaugeSector.massWeightSubmodule_seven_eq, + h.isHiggsSector.massWeightSubmodule_two_eq_deriv, + h.isHiggsSector.massWeightSubmodule_four_eq_deriv, Submodule.mul_sup, + ho 1 (by decide), ho 3 (by decide), ho 5 (by decide), ho 7 (by decide), + bot_le] + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean index 6cb963c38..3f9eedee0 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean @@ -149,6 +149,37 @@ end Generators -/ +/-- The three classes of covariant generator. -/ +inductive GeneratorClass where + /-- The gauge class: the field-strength towers. -/ + | gauge : GeneratorClass + /-- The Higgs class: the Higgs towers and their conjugates. -/ + | higgs : GeneratorClass + /-- The fermion class: the fermion towers and their conjugates. -/ + | fermion : GeneratorClass +deriving DecidableEq + +/-- The class of a covariant generator. -/ +def Generators.kind : Generators → GeneratorClass + | .F _ _ _ _ _ => .gauge + | .H _ _ _ => .higgs + | .barH _ _ _ => .higgs + | _ => .fermion + +@[simp] +lemma Generators.isGaugeField_iff_kind (g : Generators) : + g.IsGaugeField ↔ g.kind = .gauge := by + cases g <;> simp [Generators.IsGaugeField, Generators.kind] + +@[simp] +lemma Generators.isHiggs_iff_kind (g : Generators) : g.IsHiggs ↔ g.kind = .higgs := by + cases g <;> simp [Generators.IsHiggs, Generators.kind] + +@[simp] +lemma Generators.isFermionic_iff_kind (g : Generators) : + g.IsFermionic ↔ g.kind = .fermion := by + cases g <;> simp [Generators.IsFermionic, Generators.kind] + /-- The mass weight (twice the mass dimension) of a covariant generator. -/ def Generators.weight : Generators → ℕ | .H n _ _ => 2 * (1 + n) @@ -165,6 +196,154 @@ def Generators.weight : Generators → ℕ | .e _ n _ _ => 3 + 2 * n | .bare _ n _ _ => 3 + 2 * n +/-! + +## Per-kind minimum weights + +Each of the three classes of covariant generator carries a minimum mass weight: the +field-strength towers `F` are the heaviest, at weight `2 * (2 + n) ≥ 4`; the Higgs and +conjugate-Higgs towers `H`, `barH` are the lightest, at weight `2 * (1 + n) ≥ 2`; and +the ten families of fermion towers sit in between, at weight `3 + 2 * n ≥ 3`. + +-/ + +/-- A gauge-class generator — a field-strength tower symbol — carries mass weight at + least four. -/ +lemma Generators.four_le_weight_of_gauge {g : Generators} (hg : g.kind = GeneratorClass.gauge) : + 4 ≤ g.weight := by + cases g <;> simp_all [Generators.weight, Generators.kind] + omega + +/-- A Higgs-class generator — a Higgs or conjugate-Higgs tower symbol — carries mass + weight at least two. -/ +lemma Generators.two_le_weight_of_higgs {g : Generators} (hg : g.kind = GeneratorClass.higgs) : + 2 ≤ g.weight := by + cases g <;> simp_all [Generators.weight, Generators.kind] + +/-- A fermion-class generator — any of the ten families of fermion tower symbols — + carries mass weight at least three. -/ +lemma Generators.three_le_weight_of_fermion {g : Generators} + (hg : g.kind = GeneratorClass.fermion) : 3 ≤ g.weight := by + cases g <;> simp_all [Generators.weight, Generators.kind] + +/-! + +## B.1. The classes realised by a word + +-/ + +/-- The classes realised by a word in the covariant generators. -/ +def wordClasses (gl : List Generators) : Finset GeneratorClass := + (gl.map Generators.kind).toFinset + +@[simp] +lemma wordClasses_nil : wordClasses [] = ∅ := by simp [wordClasses] + +/-- Concatenating words unions the classes they realise. -/ +lemma wordClasses_append (gl gl' : List Generators) : + wordClasses (gl ++ gl') = wordClasses gl ∪ wordClasses gl' := by + rw [wordClasses, wordClasses, wordClasses, List.map_append, List.toFinset_append] + +/-- Prepending a generator inserts its class. -/ +lemma wordClasses_cons (a : Generators) (gl : List Generators) : + wordClasses (a :: gl) = insert a.kind (wordClasses gl) := by + rw [wordClasses, wordClasses, List.map_cons, List.toFinset_cons] + +/-- The total mass weight carried by the generators of a given class in a word. -/ +def classWeight (c : GeneratorClass) (gl : List Generators) : ℕ := + ((gl.filter fun g => decide (g.kind = c)).map Generators.weight).sum + +@[simp] lemma classWeight_nil (c : GeneratorClass) : classWeight c [] = 0 := rfl + +lemma classWeight_cons_of_eq {c : GeneratorClass} {g : Generators} (hg : g.kind = c) + (t : List Generators) : + classWeight c (g :: t) = g.weight + classWeight c t := by + simp [classWeight, hg] + +lemma classWeight_cons_of_ne {c : GeneratorClass} {g : Generators} (hg : g.kind ≠ c) + (t : List Generators) : classWeight c (g :: t) = classWeight c t := by + simp [classWeight, hg] + +/-- Every generator carries a non-zero mass weight. -/ +lemma Generators.weight_pos (g : Generators) : 0 < g.weight := by + cases g <;> simp [Generators.weight] + +/-- A class realised by a word carries a non-zero part of its weight. -/ +lemma classWeight_ne_zero {c : GeneratorClass} {gl : List Generators} + (hc : c ∈ wordClasses gl) : classWeight c gl ≠ 0 := by + induction gl with + | nil => simp [wordClasses] at hc + | cons g t ih => + rw [wordClasses_cons, Finset.mem_insert] at hc + by_cases hg : g.kind = c + · rw [classWeight_cons_of_eq hg] + have := g.weight_pos + omega + · rw [classWeight_cons_of_ne hg] + exact ih (hc.resolve_left fun hh => hg hh.symm) + +/-- Over a word realising only two classes, the two class weights add up to the total + weight. -/ +lemma classWeight_add {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂) {gl : List Generators} + (hgl : ∀ g ∈ gl, g.kind = c₁ ∨ g.kind = c₂) : + classWeight c₁ gl + classWeight c₂ gl = (gl.map Generators.weight).sum := by + induction gl with + | nil => simp + | cons g t ih => + have ht : ∀ g' ∈ t, g'.kind = c₁ ∨ g'.kind = c₂ := fun g' hg' => hgl g' (by simp [hg']) + rcases hgl g (by simp) with hg | hg + · rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne (by rw [hg]; exact hne), + List.map_cons, List.sum_cons, ← ih ht] + omega + · rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne (by rw [hg]; exact hne.symm), + List.map_cons, List.sum_cons, ← ih ht] + omega + +/-- A class realised by a word carries at least the minimum weight of that class: the + generator witnessing the realisation already contributes that much, and the + remaining generators of the class only add more. -/ +lemma le_classWeight_of_mem {c : GeneratorClass} {gl : List Generators} {m : ℕ} + (hc : c ∈ wordClasses gl) (hm : ∀ g : Generators, g.kind = c → m ≤ g.weight) : + m ≤ classWeight c gl := by + induction gl with + | nil => simp [wordClasses] at hc + | cons g t ih => + rw [wordClasses_cons, Finset.mem_insert] at hc + by_cases hg : g.kind = c + · rw [classWeight_cons_of_eq hg] + have := hm g hg + omega + · rw [classWeight_cons_of_ne hg] + exact ih (hc.resolve_left fun hh => hg hh.symm) + +/-- The three class weights exhaust the total weight of a word: every generator has + exactly one of the three kinds. -/ +lemma classWeight_add_three (gl : List Generators) : + classWeight GeneratorClass.gauge gl + classWeight GeneratorClass.higgs gl + + classWeight GeneratorClass.fermion gl = (gl.map Generators.weight).sum := by + induction gl with + | nil => simp + | cons g t ih => + cases hg : g.kind with + | gauge => + rw [classWeight_cons_of_eq hg, + classWeight_cons_of_ne (c := GeneratorClass.higgs) (by simp [hg]), + classWeight_cons_of_ne (c := GeneratorClass.fermion) (by simp [hg]), + List.map_cons, List.sum_cons] + omega + | higgs => + rw [classWeight_cons_of_ne (c := GeneratorClass.gauge) (by simp [hg]), + classWeight_cons_of_eq hg, + classWeight_cons_of_ne (c := GeneratorClass.fermion) (by simp [hg]), + List.map_cons, List.sum_cons] + omega + | fermion => + rw [classWeight_cons_of_ne (c := GeneratorClass.gauge) (by simp [hg]), + classWeight_cons_of_ne (c := GeneratorClass.higgs) (by simp [hg]), + classWeight_cons_of_eq hg, + List.map_cons, List.sum_cons] + omega + set_option linter.unusedVariables false in /-- The value in `B` of a covariant generator: the corresponding covariant tower applied to the indicated dual basis vector of its value space. -/ diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean index ddf77b9f7..df89e1b6d 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean @@ -146,7 +146,7 @@ lemma coeff_massWeightPoly_mem_span (w : ℕ) {x : B} /-- **The weight grading of the field algebra.** The submodule of elements of the field algebra of mass weight `w` is exactly the span of the words in the covariant basis generators of total weight `w`. -/ -theorem massWeightSubmodule_eq_span (w : ℕ) : +lemma massWeightSubmodule_eq_span (w : ℕ) : h.massWeightSubmodule w = Submodule.span ℂ {x | ∃ gl : List Generators, (gl.map Generators.weight).sum = w ∧ (gl.map h.generatorVal).prod = x} := by @@ -166,7 +166,7 @@ theorem massWeightSubmodule_eq_span (w : ℕ) : /-- Weight-homogeneous elements of the field algebra supercommute: elements of the mass-weight submodules of weights `w` and `w'` exchange up to the sign `(-1) ^ (w * w')` — fermion parity is the parity of the mass weight. -/ -theorem mul_eq_smul_mul_of_mem_massWeightSubmodule {w w' : ℕ} {x y : B} +lemma mul_eq_smul_mul_of_mem_massWeightSubmodule {w w' : ℕ} {x y : B} (hx : x ∈ h.massWeightSubmodule w) (hy : y ∈ h.massWeightSubmodule w') : x * y = ((-1 : ℂ) ^ (w * w')) • (y * x) := by rw [h.massWeightSubmodule_eq_span] at hx hy @@ -199,10 +199,6 @@ lemma span_mul_comm_of_mem_massWeightSubmodule {w w' : ℕ} {x y : B} rw [h.mul_eq_smul_mul_of_mem_massWeightSubmodule hx hy] exact Submodule.span_singleton_smul_eq ((isUnit_one.neg).pow _) _ -lemma d_supercommute_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} - (φ : Module.Dual ℂ DownSinglet) {w : ℕ} (x : B) (hx : x ∈ h.massWeightSubmodule w) : - d i l φ * x = ((-1 : ℂ) ^ w) • (x * d i l φ) := by - sorry /-! ## D. Invariance of the weight components @@ -264,6 +260,19 @@ lemma d_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ F simpa [generatorVal] using h.list_prod_mem_massWeightSubmodule (gl := [Generators.d i n l j]) (by simp [Generators.weight]) +/-- A `d` tower symbol supercommutes with any weight-homogeneous element: its own + weight `3 + 2 * n` is odd, so moving it past an element of weight `w` costs + `(-1) ^ w`. -/ +lemma d_supercommute_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} + (φ : Module.Dual ℂ DownSinglet) {w : ℕ} (x : B) (hx : x ∈ h.massWeightSubmodule w) : + d i l φ * x = ((-1 : ℂ) ^ w) • (x * d i l φ) := by + rw [h.mul_eq_smul_mul_of_mem_massWeightSubmodule (h.d_mem_massWeightSubmodule i l φ) hx] + congr 1 + rw [pow_mul] + congr 1 + rw [pow_add, pow_mul] + norm_num + /-- Any `bard` tower symbol lies in the mass-weight submodule of its weight. -/ lemma bard_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) : bard i l φ ∈ h.massWeightSubmodule (3 + 2 * n) := by diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean new file mode 100644 index 000000000..212ebb308 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean @@ -0,0 +1,102 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.Sectors +/-! +# The mixed sector + +The `{gauge, higgs, fermion}` three-class sector of `Sectors.lean` is the home of any +term that mixes all three kinds of covariant field at once. Its words are the least +weighty of any two- or three-class sector: a field-strength tower carries weight at +least `4`, a Higgs (or conjugate Higgs) tower weight at least `2`, and a fermion tower +weight at least `3`, so a word realising all three classes has total weight at least +`4 + 2 + 3 = 9`. + +Consequently the mixed sector vanishes identically below weight nine +(`sectorMassWeight_mixed_eq_bot_of_lt_nine`) — in particular at every weight up to +eight, i.e. there is no Standard-Model term of mass dimension at most four (mass +weight, twice the mass dimension, at most eight) that mixes gauge, Higgs and fermion +fields together. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + + +namespace IsCovStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsCovStandardModel B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + massWeightPoly H barH F d bard u baru Q barQ L barL e bare) + +/-! + +## The weight carried by a realised class + +-/ + +/-! + +## The mixed sector vanishes below weight nine + +-/ + +/-- **The mixed sector vanishes below weight nine**: a word realising all three + classes carries gauge weight at least four, Higgs weight at least two and fermion + weight at least three, for a total of at least nine — so no such word exists at a + lower weight, and the sector's span there is trivial. -/ +lemma sectorMassWeight_mixed_eq_bot_of_lt_nine {w : ℕ} (hw : w < 9) : + h.sectorMassWeight + {GeneratorClass.gauge, GeneratorClass.higgs, GeneratorClass.fermion} w = ⊥ := by + rw [sectorMassWeight, Submodule.span_eq_bot] + rintro x ⟨gl, hS, hsum, rfl⟩ + exfalso + have hgauge : GeneratorClass.gauge ∈ wordClasses gl := by rw [hS]; simp + have hhiggs : GeneratorClass.higgs ∈ wordClasses gl := by rw [hS]; simp + have hfermion : GeneratorClass.fermion ∈ wordClasses gl := by rw [hS]; simp + have h1 := le_classWeight_of_mem hgauge (fun g hg => Generators.four_le_weight_of_gauge hg) + have h2 := le_classWeight_of_mem hhiggs (fun g hg => Generators.two_le_weight_of_higgs hg) + have h3 := le_classWeight_of_mem hfermion (fun g hg => Generators.three_le_weight_of_fermion hg) + have h4 := classWeight_add_three gl + omega + +/-- **The weight-eight mixed sector vanishes**: the mass weight of a dimension-four + Standard-Model term is at most eight, and the mixed sector is trivial there — no + dimension-four term mixes gauge, Higgs and fermion fields together. -/ +lemma sectorMassWeight_mixed_eight : + h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs, GeneratorClass.fermion} 8 + = ⊥ := + h.sectorMassWeight_mixed_eq_bot_of_lt_nine (by omega) + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean index 78b2db847..db034c0f1 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean @@ -68,54 +68,6 @@ seven sectors below. -/ -/-- The three classes of covariant generator. -/ -inductive GeneratorClass where - /-- The gauge class: the field-strength towers. -/ - | gauge : GeneratorClass - /-- The Higgs class: the Higgs towers and their conjugates. -/ - | higgs : GeneratorClass - /-- The fermion class: the fermion towers and their conjugates. -/ - | fermion : GeneratorClass -deriving DecidableEq - -/-- The class of a covariant generator. -/ -def Generators.kind : Generators → GeneratorClass - | .F _ _ _ _ _ => .gauge - | .H _ _ _ => .higgs - | .barH _ _ _ => .higgs - | _ => .fermion - -@[simp] -lemma Generators.isGaugeField_iff_kind (g : Generators) : - g.IsGaugeField ↔ g.kind = .gauge := by - cases g <;> simp [Generators.IsGaugeField, Generators.kind] - -@[simp] -lemma Generators.isHiggs_iff_kind (g : Generators) : g.IsHiggs ↔ g.kind = .higgs := by - cases g <;> simp [Generators.IsHiggs, Generators.kind] - -@[simp] -lemma Generators.isFermionic_iff_kind (g : Generators) : - g.IsFermionic ↔ g.kind = .fermion := by - cases g <;> simp [Generators.IsFermionic, Generators.kind] - -/-- The classes realised by a word in the covariant generators. -/ -def wordClasses (gl : List Generators) : Finset GeneratorClass := - (gl.map Generators.kind).toFinset - -@[simp] -lemma wordClasses_nil : wordClasses [] = ∅ := by simp [wordClasses] - -/-- Concatenating words unions the classes they realise. -/ -lemma wordClasses_append (gl gl' : List Generators) : - wordClasses (gl ++ gl') = wordClasses gl ∪ wordClasses gl' := by - rw [wordClasses, wordClasses, wordClasses, List.map_append, List.toFinset_append] - -/-- Prepending a generator inserts its class. -/ -lemma wordClasses_cons (a : Generators) (gl : List Generators) : - wordClasses (a :: gl) = insert a.kind (wordClasses gl) := by - rw [wordClasses, wordClasses, List.map_cons, List.toFinset_cons] - /-- The span of the words in the covariant generators realising exactly the classes `S`. -/ def sectorSubmodule (S : Finset GeneratorClass) : Submodule ℂ B := @@ -574,7 +526,7 @@ lemma coeff_massWeightPoly_mem_sectorMassWeight {S : Finset GeneratorClass} {x : /-- The weight-`w` part of the sector of `S` is exactly the intersection of the sector with the mass-weight submodule. -/ -theorem sectorMassWeight_eq_inf (S : Finset GeneratorClass) (w : ℕ) : +lemma sectorMassWeight_eq_inf (S : Finset GeneratorClass) (w : ℕ) : h.sectorMassWeight S w = h.sectorSubmodule S ⊓ h.massWeightSubmodule w := by refine le_antisymm (le_inf (h.sectorMassWeight_le_sectorSubmodule S w) (h.sectorMassWeight_le_massWeightSubmodule S w)) ?_ @@ -588,7 +540,7 @@ theorem sectorMassWeight_eq_inf (S : Finset GeneratorClass) (w : ℕ) : component of the field algebra is the join over the class sets `S` of the weight-`w` parts of the sectors, since every word realises exactly one class set. The empty class set contributes the scalars, at weight zero only. -/ -theorem massWeightSubmodule_eq_iSup_sectorMassWeight (w : ℕ) : +lemma massWeightSubmodule_eq_iSup_sectorMassWeight (w : ℕ) : h.massWeightSubmodule w = ⨆ S : Finset GeneratorClass, h.sectorMassWeight S w := by refine le_antisymm ?_ (iSup_le fun S => h.sectorMassWeight_le_massWeightSubmodule S w) rw [h.massWeightSubmodule_eq_span, Submodule.span_le] @@ -714,7 +666,7 @@ lemma sectorMassWeight_higgs_le (w : ℕ) : /-- **The Higgs-sector mass-weight submodules are the weight parts of the `{higgs}` sector**, at any non-zero weight. (At weight zero the Higgs-sector submodule also contains the scalars, which the sector decomposition files under the `∅` sector.) -/ -theorem sectorMassWeight_higgs_eq {w : ℕ} (hw : w ≠ 0) : +lemma sectorMassWeight_higgs_eq {w : ℕ} (hw : w ≠ 0) : h.sectorMassWeight {GeneratorClass.higgs} w = h.isHiggsSector.massWeightSubmodule w := by refine le_antisymm (h.sectorMassWeight_higgs_le w) (fun x hx => ?_) @@ -815,7 +767,7 @@ lemma sectorMassWeight_gauge_le (w : ℕ) : `{gauge}` sector**, at any non-zero weight. (At weight zero the sector's submodule also contains the scalars, which the sector decomposition files under the `∅` sector.) -/ -theorem sectorMassWeight_gauge_eq {w : ℕ} (hw : w ≠ 0) : +lemma sectorMassWeight_gauge_eq {w : ℕ} (hw : w ≠ 0) : h.sectorMassWeight {GeneratorClass.gauge} w = h.isGaugeSector.massWeightSubmodule w := by refine le_antisymm (h.sectorMassWeight_gauge_le w) (fun x hx => ?_) @@ -932,7 +884,7 @@ lemma sectorMassWeight_fermion_le (w : ℕ) : `{fermion}` sector**, at any non-zero weight. (At weight zero the sector's submodule also contains the scalars, which the sector decomposition files under the `∅` sector.) -/ -theorem sectorMassWeight_fermion_eq {w : ℕ} (hw : w ≠ 0) : +lemma sectorMassWeight_fermion_eq {w : ℕ} (hw : w ≠ 0) : h.sectorMassWeight {GeneratorClass.fermion} w = h.isFermionSector.massWeightSubmodule w := by refine le_antisymm (h.sectorMassWeight_fermion_le w) (fun x hx => ?_) @@ -962,56 +914,6 @@ pairs of sectors can each instantiate them. -/ -/-- The total mass weight carried by the generators of a given class in a word. -/ -def classWeight (c : GeneratorClass) (gl : List Generators) : ℕ := - ((gl.filter fun g => decide (g.kind = c)).map Generators.weight).sum - -@[simp] lemma classWeight_nil (c : GeneratorClass) : classWeight c [] = 0 := rfl - -lemma classWeight_cons_of_eq {c : GeneratorClass} {g : Generators} (hg : g.kind = c) - (t : List Generators) : - classWeight c (g :: t) = g.weight + classWeight c t := by - simp [classWeight, hg] - -lemma classWeight_cons_of_ne {c : GeneratorClass} {g : Generators} (hg : g.kind ≠ c) - (t : List Generators) : classWeight c (g :: t) = classWeight c t := by - simp [classWeight, hg] - -/-- Every generator carries a non-zero mass weight. -/ -lemma Generators.weight_pos (g : Generators) : 0 < g.weight := by - cases g <;> simp [Generators.weight] - -/-- A class realised by a word carries a non-zero part of its weight. -/ -lemma classWeight_ne_zero {c : GeneratorClass} {gl : List Generators} - (hc : c ∈ wordClasses gl) : classWeight c gl ≠ 0 := by - induction gl with - | nil => simp [wordClasses] at hc - | cons g t ih => - rw [wordClasses_cons, Finset.mem_insert] at hc - by_cases hg : g.kind = c - · rw [classWeight_cons_of_eq hg] - have := g.weight_pos - omega - · rw [classWeight_cons_of_ne hg] - exact ih (hc.resolve_left fun hh => hg hh.symm) - -/-- Over a word realising only two classes, the two class weights add up to the total - weight. -/ -lemma classWeight_add {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂) {gl : List Generators} - (hgl : ∀ g ∈ gl, g.kind = c₁ ∨ g.kind = c₂) : - classWeight c₁ gl + classWeight c₂ gl = (gl.map Generators.weight).sum := by - induction gl with - | nil => simp - | cons g t ih => - have ht : ∀ g' ∈ t, g'.kind = c₁ ∨ g'.kind = c₂ := fun g' hg' => hgl g' (by simp [hg']) - rcases hgl g (by simp) with hg | hg - · rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne (by rw [hg]; exact hne), - List.map_cons, List.sum_cons, ← ih ht] - omega - · rw [classWeight_cons_of_eq hg, classWeight_cons_of_ne (by rw [hg]; exact hne.symm), - List.map_cons, List.sum_cons, ← ih ht] - omega - /-- A single generator's value lies in any family of submodules dominating its own class's sector. -/ lemma generatorVal_mem_of_kind {c : GeneratorClass} {M : ℕ → Submodule ℂ B} @@ -1072,7 +974,7 @@ lemma list_prod_mem_mul_of_forall_kind {c₁ c₂ : GeneratorClass} (hne : c₁ /-- **The two-class sector decomposition.** The weight-`w` piece of the sector of two classes is contained in the join, over the splittings of `w` into two non-zero parts, of the products of the two classes' mass-weight submodules. -/ -theorem sectorMassWeight_pair_le {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂) +lemma sectorMassWeight_pair_le {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂) {M₁ M₂ : ℕ → Submodule ℂ B} (hM₁ : ∀ w, h.sectorMassWeight {c₁} w ≤ M₁ w) (hM₂ : ∀ w, h.sectorMassWeight {c₂} w ≤ M₂ w) diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean index 87ea5e910..915ac5708 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic /-! # The Yukawa sector's mass-weight submodules @@ -132,7 +133,7 @@ lemma fermionMassWeight_mul_higgsMassWeight_le (a b : ℕ) : fermion}` sector is contained in the join, over the splittings of `w` into two non-zero parts, of the products of the Higgs-sector and fermion-sector mass-weight submodules. -/ -theorem sectorMassWeight_higgs_fermion_le (w : ℕ) : +lemma sectorMassWeight_higgs_fermion_le (w : ℕ) : h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w ≤ ⨆ (p : ℕ × ℕ) (_ : p.1 + p.2 = w) (_ : p.1 ≠ 0) (_ : p.2 ≠ 0), h.isHiggsSector.massWeightSubmodule p.1 * h.isFermionSector.massWeightSubmodule p.2 := @@ -146,7 +147,7 @@ theorem sectorMassWeight_higgs_fermion_le (w : ℕ) : under five into two non-zero parts survives — the Higgs part is either odd (hence zero) or equal to two, forcing the fermion part to be one or two (hence also zero). -/ -theorem sectorMassWeight_higgs_fermion_eq_bot_of_lt_five {w : ℕ} (hw : w < 5) : +lemma sectorMassWeight_higgs_fermion_eq_bot_of_lt_five {w : ℕ} (hw : w < 5) : h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w = ⊥ := by refine le_antisymm (le_trans (h.sectorMassWeight_higgs_fermion_le w) ?_) bot_le refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ @@ -166,7 +167,7 @@ theorem sectorMassWeight_higgs_fermion_eq_bot_of_lt_five {w : ℕ} (hw : w < 5) /-- **The Yukawa sector vanishes at weight six**: every splitting of six into two non-zero parts has either an odd Higgs part or a fermion part of weight two or four, all of which vanish. -/ -theorem sectorMassWeight_higgs_fermion_six : +lemma sectorMassWeight_higgs_fermion_six : h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 6 = ⊥ := by refine le_antisymm (le_trans (h.sectorMassWeight_higgs_fermion_le 6) ?_) bot_le refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ @@ -183,11 +184,35 @@ theorem sectorMassWeight_higgs_fermion_six : rw [hb, h.isFermionSector.massWeightSubmodule_two_eq, Submodule.mul_bot] · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 5 (by decide), Submodule.bot_mul] +/-- A product of a Higgs-weight piece and a fermion-weight piece lands in the Yukawa + sector of the total weight. -/ +lemma mul_le_sectorMassWeight_higgs_fermion {a b w : ℕ} {X Y : Submodule ℂ B} + (ha : a ≠ 0) (hb : b ≠ 0) (hab : a + b = w) + (hX : X ≤ h.isHiggsSector.massWeightSubmodule a) + (hY : Y ≤ h.isFermionSector.massWeightSubmodule b) : + X * Y ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w := by + have hset : ({GeneratorClass.higgs} ∪ {GeneratorClass.fermion} : Finset GeneratorClass) + = {GeneratorClass.higgs, GeneratorClass.fermion} := by decide + refine Submodule.mul_le.mpr fun x hx y hy => ?_ + have hx' : x ∈ h.sectorMassWeight {GeneratorClass.higgs} a := by + rw [h.sectorMassWeight_higgs_eq ha]; exact hX hx + have hy' : y ∈ h.sectorMassWeight {GeneratorClass.fermion} b := by + rw [h.sectorMassWeight_fermion_eq hb]; exact hY hy + have hmem := h.mul_mem_sectorMassWeight hx' hy' + rwa [hset, hab] at hmem + /-- **The weight-five Yukawa sector**: the only surviving splitting is the Higgs field itself (weight two) against the underived fermion towers (weight three). -/ -theorem sectorMassWeight_higgs_fermion_five : +lemma sectorMassWeight_higgs_fermion_five : h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 5 - ≤ h.isHiggsSector.massWeightSubmodule 2 * h.isFermionSector.derivSubmodule 0 := by + = h.isHiggsSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 0 := by + refine le_antisymm ?_ ?_ + case refine_2 => + exact h.mul_le_sectorMassWeight_higgs_fermion (a := 2) (b := 3) (by norm_num) + (by norm_num) (by norm_num) + (le_of_eq h.isHiggsSector.massWeightSubmodule_two_eq_deriv.symm) + (le_of_eq h.isFermionSector.massWeightSubmodule_three_eq.symm) + rw [← h.isHiggsSector.massWeightSubmodule_two_eq_deriv] refine le_trans (h.sectorMassWeight_higgs_fermion_le 5) ?_ refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ obtain ⟨a, b⟩ := p @@ -205,14 +230,32 @@ theorem sectorMassWeight_higgs_fermion_five : rw [hb, h.isFermionSector.massWeightSubmodule_one_eq, Submodule.mul_bot] exact bot_le +set_option maxHeartbeats 1000000 in /-- **The weight-seven Yukawa sector**: the surviving splittings pair the Higgs field (weight two) with the once-derived fermion towers (weight five), or the once-derived Higgs field (weight four) with the underived fermion towers (weight three). -/ -theorem sectorMassWeight_higgs_fermion_seven : +lemma sectorMassWeight_higgs_fermion_seven : h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 7 - ≤ h.isHiggsSector.massWeightSubmodule 2 * h.isFermionSector.derivSubmodule 1 - ⊔ h.isHiggsSector.massWeightSubmodule 4 * h.isFermionSector.derivSubmodule 0 := by + = h.isHiggsSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 1 + ⊔ h.isHiggsSector.derivSubmodule 1 * h.isFermionSector.derivSubmodule 0 + ⊔ h.isHiggsSector.derivSubmodule 0 * h.isHiggsSector.derivSubmodule 0 + * h.isFermionSector.derivSubmodule 0 := by + refine le_antisymm ?_ ?_ + case refine_2 => + refine sup_le (sup_le ?_ ?_) ?_ + · exact h.mul_le_sectorMassWeight_higgs_fermion (a := 2) (b := 5) (by norm_num) + (by norm_num) (by norm_num) + (le_of_eq h.isHiggsSector.massWeightSubmodule_two_eq_deriv.symm) + (le_of_eq h.isFermionSector.massWeightSubmodule_five_eq.symm) + · exact h.mul_le_sectorMassWeight_higgs_fermion (a := 4) (b := 3) (by norm_num) + (by norm_num) (by norm_num) + (by rw [h.isHiggsSector.massWeightSubmodule_four_eq_deriv]; exact le_sup_left) + (le_of_eq h.isFermionSector.massWeightSubmodule_three_eq.symm) + · exact h.mul_le_sectorMassWeight_higgs_fermion (a := 4) (b := 3) (by norm_num) + (by norm_num) (by norm_num) + (by rw [h.isHiggsSector.massWeightSubmodule_four_eq_deriv]; exact le_sup_right) + (le_of_eq h.isFermionSector.massWeightSubmodule_three_eq.symm) refine le_trans (h.sectorMassWeight_higgs_fermion_le 7) ?_ refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ obtain ⟨a, b⟩ := p @@ -223,13 +266,15 @@ theorem sectorMassWeight_higgs_fermion_seven : · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 1 (by decide), Submodule.bot_mul] exact bot_le · have hb : b = 5 := by omega - rw [hb, h.isFermionSector.massWeightSubmodule_five_eq] - exact le_sup_left + rw [hb, h.isFermionSector.massWeightSubmodule_five_eq, + h.isHiggsSector.massWeightSubmodule_two_eq_deriv] + exact le_sup_left.trans le_sup_left · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 3 (by decide), Submodule.bot_mul] exact bot_le · have hb : b = 3 := by omega - rw [hb, h.isFermionSector.massWeightSubmodule_three_eq] - exact le_sup_right + rw [hb, h.isFermionSector.massWeightSubmodule_three_eq, + h.isHiggsSector.massWeightSubmodule_four_eq_deriv, Submodule.sup_mul] + exact sup_le (le_sup_right.trans le_sup_left) le_sup_right · rw [h.isHiggsSector.massWeightSubmodule_odd_eq_bot 5 (by decide), Submodule.bot_mul] exact bot_le · have hb : b = 1 := by omega @@ -239,10 +284,17 @@ theorem sectorMassWeight_higgs_fermion_seven : /-- **The weight-eight Yukawa sector**: the only surviving splitting pairs the Higgs field (weight two) with the product of two underived fermion towers (weight six) — this is the sector of the Yukawa term `H ψ ψ` itself. -/ -theorem sectorMassWeight_higgs_fermion_eight : +lemma sectorMassWeight_higgs_fermion_eight : h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 - ≤ h.isHiggsSector.massWeightSubmodule 2 + = h.isHiggsSector.derivSubmodule 0 * (h.isFermionSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 0) := by + refine le_antisymm ?_ ?_ + case refine_2 => + exact h.mul_le_sectorMassWeight_higgs_fermion (a := 2) (b := 6) (by norm_num) + (by norm_num) (by norm_num) + (le_of_eq h.isHiggsSector.massWeightSubmodule_two_eq_deriv.symm) + (le_of_eq h.isFermionSector.massWeightSubmodule_six_eq.symm) + rw [← h.isHiggsSector.massWeightSubmodule_two_eq_deriv] refine le_trans (h.sectorMassWeight_higgs_fermion_le 8) ?_ refine iSup_le fun p => iSup_le fun hp => iSup_le fun h1 => iSup_le fun h2 => ?_ obtain ⟨a, b⟩ := p diff --git a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean new file mode 100644 index 000000000..b6645e824 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -0,0 +1,734 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsFermionSector.Basic +public import Physlib.Relativity.Fermions.Weyl.BoostWeight +public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +/-! +# The boost weight decomposition of the fermion sector + +The boost-weight analogue of `GaugeWeightDecomposition.lean`. There the fermion symbols +were split by their *gauge* weight, the value index doing all the work; here they are split +by their *boost* weight along a spatial axis, the derivative slots and the Weyl-spinor value +index sharing the work. + +Two things differ from the gauge and Higgs sectors. First, the fermion symbols `d i l φ`, +`bard i l φ`, … carry only the `n` covariant-derivative slots, with no extra Lorentz index +to pack alongside them, so `IsLorentzCovDerivTransforms` is literally `RotatesIndices` for +each species. Second — and this is the real difference — the value space is *not* Lorentz +trivial: a fermion symbol pairs with the dual (for the barred species the conjugate dual) of +a genuine Lorentz representation, and that dual carries boost weight of its own. So the +`hw` fed to `boostDecomp` cannot be the trivial decomposition; it has to be an honest +decomposition of the value space. + +That decomposition is built here. Along the `z`-axis the `SL(2,ℂ)` boost is the diagonal +matrix `diag (t, t⁻¹)`, so the standard Weyl basis is a weight basis with weights `±1` +(`weylWeight`); the colour and isospin factors are inert, so the same holds for all five +value spaces. Dualising flips the sign of a weight (`coord_mem_boostWeightSubmodule_dual`) +and conjugating leaves it alone, because the boost scales by a *real* number +(`conj_coord_mem_boostWeightSubmodule_conj_dual`). The result is transported off the +`z`-axis by `WeightDecomposition.ofAxisTwo`, the axis boosts being conjugate. + +Feeding these into `boostDecomp` gives, for each family and species, a boost weight +decomposition of the span of that species' symbols; joining the ten species and the three +families gives `derivSubmoduleBoostWeight`, a `Lorentz.BoostWeight.WeightDecomposition` of +`h.derivSubmodule n` along every axis. The weights that occur are a light-cone slot total — +`+2` for `D₀ - Dᵢ`, `-2` for `D₀ + Dᵢ`, `0` for the two transverse directions — shifted by +the spinor weight `±1`. In particular every fermion boost weight is **odd** +(`not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp`), where the gauge and Higgs weights are +even, and its absolute value is at most `2 * n + 1`. + +-/ + +@[expose] public section + +namespace Lorentz.BoostWeight.WeightDecomposition + +open MatrixGroups + +variable {K : Type*} [Field K] [Algebra ℝ K] {M : Type*} [AddCommGroup M] [Module K M] + +/-- **A basis of weight vectors decomposes the whole space.** The weight-`k` piece is the + join of the lines through those basis vectors whose weight is `k`; the support is supplied, + any finite set containing the weights that occur. -/ +noncomputable def ofWeightBasis {ι : Type*} [Fintype ι] {rep : Representation K SL(2,ℂ) M} + {i : Fin 3} (b : Module.Basis ι K M) (wt : ι → ℤ) (s : Finset ℤ) + (hs : ∀ j, wt j ∈ s) (hb : ∀ j, b j ∈ boostWeightSubmodule rep i (wt j)) : + WeightDecomposition rep i ⊤ where + piece k := ⨆ (j : ι) (_ : wt j = k), Submodule.span K {b j} + supp := s + piece_le k := iSup₂_le fun j hj => + (Submodule.span_singleton_le_iff_mem _ _).2 (hj ▸ hb j) + piece_eq_bot k hk := iSup_eq_bot.2 fun j => iSup_eq_bot.2 fun hj => + absurd (hj ▸ hs j) hk + iSup_piece := by + refine le_antisymm le_top ?_ + rw [← b.span_eq, Submodule.span_le] + rintro _ ⟨j, rfl⟩ + exact Submodule.mem_iSup_of_mem (wt j) (Submodule.mem_iSup_of_mem j + (Submodule.mem_iSup_of_mem rfl (Submodule.mem_span_singleton_self _))) + +/-- **The join of a finite family of weight decompositions** along one axis: the weight-`k` + piece of the join is the join of the weight-`k` pieces, and the support is the union of + the supports. -/ +noncomputable def iSupFintype {ι : Type*} [Fintype ι] {rep : Representation K SL(2,ℂ) M} + {i : Fin 3} {V : ι → Submodule K M} (d : (a : ι) → WeightDecomposition rep i (V a)) : + WeightDecomposition rep i (⨆ a, V a) where + piece k := ⨆ a, (d a).piece k + supp := Finset.univ.biUnion fun a => (d a).supp + piece_le k := iSup_le fun a => (d a).piece_le k + piece_eq_bot k hk := iSup_eq_bot.mpr fun a => (d a).piece_eq_bot k fun hm => + hk (Finset.mem_biUnion.mpr ⟨a, Finset.mem_univ a, hm⟩) + iSup_piece := by + rw [iSup_comm] + exact iSup_congr fun a => (d a).iSup_piece + +/-- The pieces of a finite indexed join are the joins of the pieces. -/ +@[simp] +lemma iSupFintype_piece {ι : Type*} [Fintype ι] {rep : Representation K SL(2,ℂ) M} + {i : Fin 3} {V : ι → Submodule K M} (d : (a : ι) → WeightDecomposition rep i (V a)) + (k : ℤ) : (iSupFintype d).piece k = ⨆ a, (d a).piece k := rfl + +/-- **Transporting a weight decomposition of the whole space from the `z`-axis to any + axis.** The axis boosts are conjugate, so applying the conjugating rotation carries the + weight-`k` space of the `z`-axis onto that of the `i`-th axis. -/ +noncomputable def ofAxisTwo {rep : Representation K SL(2,ℂ) M} + (d : WeightDecomposition rep 2 ⊤) (i : Fin 3) : WeightDecomposition rep i ⊤ where + piece k := (d.piece k).map (rep (Lorentz.SL2C.rotationZToAxis i)) + supp := d.supp + piece_le k := by + rintro _ ⟨u, hu, rfl⟩ t ht + rw [← Module.End.mul_apply, ← map_mul, Lorentz.SL2C.boostAxis_eq_conj i t ht, + inv_mul_cancel_right, map_mul, Module.End.mul_apply, d.piece_le k hu t ht, map_smul] + piece_eq_bot k hk := by rw [d.piece_eq_bot k hk, Submodule.map_bot] + iSup_piece := by + rw [← Submodule.map_iSup, d.iSup_piece, Submodule.map_top] + refine LinearMap.range_eq_top.2 fun x => ⟨rep (Lorentz.SL2C.rotationZToAxis i)⁻¹ x, ?_⟩ + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] + +end Lorentz.BoostWeight.WeightDecomposition + +namespace StandardModel + +open Matrix MatrixGroups Lorentz Lorentz.BoostWeight + +/-! + +## A. The boost weights of the fermion value spaces + +-/ + +/-- **The dual of a weight basis is a weight basis of the opposite weights.** If the boost + along the `i`-th axis scales `b j` by `t ^ wt j`, then it scales the dual coordinate + `b.coord j` by `t ^ (-wt j)`. -/ +lemma coord_mem_boostWeightSubmodule_dual {ι : Type*} [Fintype ι] [DecidableEq ι] + {V : Type*} [AddCommGroup V] [Module ℂ V] {rep : Representation ℂ SL(2,ℂ) V} + (b : Module.Basis ι ℂ V) (wt : ι → ℤ) (i : Fin 3) + (hb : ∀ (t : ℝ) (ht : t ≠ 0) (j : ι), + rep (SL2C.boostAxis i t ht) (b j) = ((t : ℝ) : ℂ) ^ (wt j) • b j) (j : ι) : + b.coord j ∈ boostWeightSubmodule rep.dual i (-(wt j)) := by + intro t ht + refine b.ext fun k => ?_ + rw [Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply, + SL2C.boostAxis_inv, hb _ (inv_ne_zero ht) k, map_smul, LinearMap.smul_apply, + smul_eq_mul, smul_eq_mul] + simp only [Module.Basis.coord_apply, Module.Basis.repr_self, Complex.ofReal_inv, + show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl] + by_cases hjk : j = k + · rw [hjk] + simp + · simp only [Finsupp.single_eq_of_ne hjk, mul_zero] + +/-- **The conjugate-dual of a weight basis is a weight basis of the opposite weights.** The + axis boosts scale by a real number, so conjugating the value space leaves the weights + alone and only dualising flips their sign. -/ +lemma conj_coord_mem_boostWeightSubmodule_conj_dual {ι : Type*} [Fintype ι] [DecidableEq ι] + {V : Type*} [AddCommGroup V] [Module ℂ V] {rep : Representation ℂ SL(2,ℂ) V} + (b : Module.Basis ι ℂ V) (wt : ι → ℤ) (i : Fin 3) + (hb : ∀ (t : ℝ) (ht : t ≠ 0) (j : ι), + rep (SL2C.boostAxis i t ht) (b j) = ((t : ℝ) : ℂ) ^ (wt j) • b j) (j : ι) : + b.conj.coord j ∈ boostWeightSubmodule rep.conj.dual i (-(wt j)) := by + intro t ht + refine b.conj.ext fun k => ?_ + rw [Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply, + SL2C.boostAxis_inv, Representation.conj_apply, Module.Basis.conj_apply, + LinearEquiv.symm_apply_apply, hb _ (inv_ne_zero ht) k, LinearEquiv.map_smulₛₗ, + ← Module.Basis.conj_apply, map_smul, LinearMap.smul_apply, smul_eq_mul, smul_eq_mul] + simp only [Module.Basis.coord_apply, Module.Basis.repr_self, map_zpow₀, + Complex.ofReal_inv, show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl] + by_cases hjk : j = k + · rw [hjk] + simp + · simp only [Finsupp.single_eq_of_ne hjk, mul_zero] + + + + + + + + + + + +/-! + +## B. The weight decompositions of the dual value spaces + +-/ + +/-- **The boost weight decomposition of the dual of a value space with a weight basis.** + The dual coordinates carry the opposite weights, and the `z`-axis decomposition is carried + to every axis by `ofAxisTwo`. -/ +noncomputable def dualBoostWeightOfBasis {ι : Type*} [Fintype ι] [DecidableEq ι] + {V : Type*} [AddCommGroup V] [Module ℂ V] (rep : Representation ℂ SL(2,ℂ) V) + (b : Module.Basis ι ℂ V) (wt : ι → ℤ) + (hb : ∀ (t : ℝ) (ht : t ≠ 0) (j : ι), + rep (SL2C.boostAxis 2 t ht) (b j) = ((t : ℝ) : ℂ) ^ (wt j) • b j) + (s : Finset ℤ) (hs : ∀ j, -(wt j) ∈ s) (i : Fin 3) : + WeightDecomposition rep.dual i ⊤ := + (WeightDecomposition.ofWeightBasis (i := 2) b.dualBasis (fun j => -(wt j)) s hs + (fun j => by + rw [Module.Basis.coe_dualBasis] + exact coord_mem_boostWeightSubmodule_dual b wt 2 hb j)).ofAxisTwo i + +/-- **The boost weight decomposition of the conjugate-dual of a value space with a weight + basis.** The axis boosts scale by real numbers, so conjugating leaves the weights alone + and only dualising flips their sign. -/ +noncomputable def conjDualBoostWeightOfBasis {ι : Type*} [Fintype ι] [DecidableEq ι] + {V : Type*} [AddCommGroup V] [Module ℂ V] (rep : Representation ℂ SL(2,ℂ) V) + (b : Module.Basis ι ℂ V) (wt : ι → ℤ) + (hb : ∀ (t : ℝ) (ht : t ≠ 0) (j : ι), + rep (SL2C.boostAxis 2 t ht) (b j) = ((t : ℝ) : ℂ) ^ (wt j) • b j) + (s : Finset ℤ) (hs : ∀ j, -(wt j) ∈ s) (i : Fin 3) : + WeightDecomposition rep.conj.dual i ⊤ := + (WeightDecomposition.ofWeightBasis (i := 2) b.conj.dualBasis (fun j => -(wt j)) s hs + (fun j => by + rw [Module.Basis.coe_dualBasis] + exact conj_coord_mem_boostWeightSubmodule_conj_dual b wt 2 hb j)).ofAxisTwo i + +/-! + +## C. The fermion symbols rotate their derivative indices + +-/ + +namespace IsFermionSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) + +include h in +/-- Every derivative slot of a `d` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_d (f : Fin 3) (n : ℕ) : + RotatesIndices DownSinglet.repLorentzGroup.dual repLorentz (d (n := n) f) := + fun g l φ => h.repLorentz_d f g n l φ + +include h in +/-- Every derivative slot of a `bard` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_bard (f : Fin 3) (n : ℕ) : + RotatesIndices DownSinglet.repLorentzGroup.conj.dual repLorentz (bard (n := n) f) := + fun g l φ => h.repLorentz_bard f g n l φ + +include h in +/-- Every derivative slot of a `u` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_u (f : Fin 3) (n : ℕ) : + RotatesIndices UpSinglet.repLorentzGroup.dual repLorentz (u (n := n) f) := + fun g l φ => h.repLorentz_u f g n l φ + +include h in +/-- Every derivative slot of a `baru` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_baru (f : Fin 3) (n : ℕ) : + RotatesIndices UpSinglet.repLorentzGroup.conj.dual repLorentz (baru (n := n) f) := + fun g l φ => h.repLorentz_baru f g n l φ + +include h in +/-- Every derivative slot of a `Q` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_Q (f : Fin 3) (n : ℕ) : + RotatesIndices QuarkDoublet.repLorentzGroup.dual repLorentz (Q (n := n) f) := + fun g l φ => h.repLorentz_Q f g n l φ + +include h in +/-- Every derivative slot of a `barQ` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_barQ (f : Fin 3) (n : ℕ) : + RotatesIndices QuarkDoublet.repLorentzGroup.conj.dual repLorentz (barQ (n := n) f) := + fun g l φ => h.repLorentz_barQ f g n l φ + +include h in +/-- Every derivative slot of an `L` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_L (f : Fin 3) (n : ℕ) : + RotatesIndices LeptonDoublet.repLorentzGroup.dual repLorentz (L (n := n) f) := + fun g l φ => h.repLorentz_L f g n l φ + +include h in +/-- Every derivative slot of a `barL` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_barL (f : Fin 3) (n : ℕ) : + RotatesIndices LeptonDoublet.repLorentzGroup.conj.dual repLorentz (barL (n := n) f) := + fun g l φ => h.repLorentz_barL f g n l φ + +include h in +/-- Every derivative slot of an `e` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_e (f : Fin 3) (n : ℕ) : + RotatesIndices LeptonSinglet.repLorentzGroup.dual repLorentz (e (n := n) f) := + fun g l φ => h.repLorentz_e f g n l φ + +include h in +/-- Every derivative slot of a `bare` symbol is a Lorentz vector index. -/ +lemma rotatesIndices_bare (f : Fin 3) (n : ℕ) : + RotatesIndices LeptonSinglet.repLorentzGroup.conj.dual repLorentz (bare (n := n) f) := + fun g l φ => h.repLorentz_bare f g n l φ + +/-! + +## D. The boost weight decomposition of each species + +-/ + +/-- **The boost weight decomposition of the span of the `d` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_d (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (d f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (d (n := n) f) + (h.rotatesIndices_d f n) i + (dualBoostWeightOfBasis DownSinglet.repLorentzGroup DownSinglet.basis + (fun j : Fin 2 × Fin 3 => weylWeight j.1) downSinglet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `bard` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_bard (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (bard f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (bard (n := n) f) + (h.rotatesIndices_bard f n) i + (conjDualBoostWeightOfBasis DownSinglet.repLorentzGroup DownSinglet.basis + (fun j : Fin 2 × Fin 3 => weylWeight j.1) downSinglet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `u` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_u (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (u f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (u (n := n) f) + (h.rotatesIndices_u f n) i + (dualBoostWeightOfBasis UpSinglet.repLorentzGroup UpSinglet.basis + (fun j : Fin 2 × Fin 3 => weylWeight j.1) upSinglet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `baru` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_baru (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (baru f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (baru (n := n) f) + (h.rotatesIndices_baru f n) i + (conjDualBoostWeightOfBasis UpSinglet.repLorentzGroup UpSinglet.basis + (fun j : Fin 2 × Fin 3 => weylWeight j.1) upSinglet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `Q` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_Q (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (Q f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (Q (n := n) f) + (h.rotatesIndices_Q f n) i + (dualBoostWeightOfBasis QuarkDoublet.repLorentzGroup QuarkDoublet.basis + (fun j : Fin 2 × Fin 3 × Fin 2 => weylWeight j.1) + quarkDoublet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `barQ` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_barQ (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (barQ f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (barQ (n := n) f) + (h.rotatesIndices_barQ f n) i + (conjDualBoostWeightOfBasis QuarkDoublet.repLorentzGroup QuarkDoublet.basis + (fun j : Fin 2 × Fin 3 × Fin 2 => weylWeight j.1) + quarkDoublet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `L` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_L (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (L f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (L (n := n) f) + (h.rotatesIndices_L f n) i + (dualBoostWeightOfBasis LeptonDoublet.repLorentzGroup LeptonDoublet.basis + (fun j : Fin 2 × Fin 2 => weylWeight j.1) leptonDoublet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `barL` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_barL (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (barL f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (barL (n := n) f) + (h.rotatesIndices_barL f n) i + (conjDualBoostWeightOfBasis LeptonDoublet.repLorentzGroup LeptonDoublet.basis + (fun j : Fin 2 × Fin 2 => weylWeight j.1) leptonDoublet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `e` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_e (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (e f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (e (n := n) f) + (h.rotatesIndices_e f n) i + (dualBoostWeightOfBasis LeptonSinglet.repLorentzGroup LeptonSinglet.basis + (fun j : Fin 2 => weylWeight j) leptonSinglet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-- **The boost weight decomposition of the span of the `bare` symbols** of one family and a + fixed number of covariant derivatives: each derivative slot contributes the weight of its + light-cone direction, on top of the `±1` carried by the Weyl-spinor value index. -/ +noncomputable def boostWeight_bare (f : Fin 3) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (bare f l)) := + IsHiggsSector.IsDerivativeCollection.boostDecomp (bare (n := n) f) + (h.rotatesIndices_bare f n) i + (conjDualBoostWeightOfBasis LeptonSinglet.repLorentzGroup LeptonSinglet.basis + (fun j : Fin 2 => weylWeight j) leptonSinglet_repLorentzGroup_boostAxis_two_basis + ({-1, 1} : Finset ℤ) (fun _ => neg_weylWeight_mem _) i) + +/-! + +## E. The boost weight decomposition of the fermion derivative submodules + +-/ + +/-- Reassociating the join: taking each species' symbols over all derivative slots first and + joining the ten species afterwards recovers the fermion derivative submodule. -/ +lemma iSup_iSup_range_eq_derivSubmodule (n : ℕ) : + (⨆ f : Fin 3, + ((((((((((⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (d f l)) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (bard f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (u f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (baru f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (Q f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (barQ f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (L f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (barL f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (e f l))) ⊔ + (⨆ l : Fin n → Fin 1 ⊕ Fin 3, LinearMap.range (bare f l)))) = h.derivSubmodule n := by + rw [derivSubmodule] + exact iSup_congr fun f => by simp only [iSup_sup_eq] + +/-- **The boost weight decomposition of the fermion derivative submodules**, along any + spatial axis and for any number of covariant derivatives. The weight-`k` piece is the + join, over the three families, the ten species and the light-cone multi-indices, of the + images of the value weight spaces: a derivative slot of light-cone type `c j` contributes + `lightConeWeight (c j)` and the Weyl-spinor value index contributes `±1`. -/ +noncomputable def derivSubmoduleBoostWeight (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i (h.derivSubmodule n) := + (WeightDecomposition.iSupFintype fun f : Fin 3 => + (((((((((h.boostWeight_d f n i).sup (h.boostWeight_bard f n i)).sup + (h.boostWeight_u f n i)).sup (h.boostWeight_baru f n i)).sup + (h.boostWeight_Q f n i)).sup (h.boostWeight_barQ f n i)).sup + (h.boostWeight_L f n i)).sup (h.boostWeight_barL f n i)).sup + (h.boostWeight_e f n i)).sup + (h.boostWeight_bare f n i)).copy (h.iSup_iSup_range_eq_derivSubmodule n) + +/-! + +## F. The boost weights that occur + +-/ + +/-- **The boost weights carried by the fermion symbols with `n` covariant derivatives**: a + total of light-cone slot weights — `+2`, `-2` or `0` per slot — shifted by the `±1` of the + Weyl-spinor value index. -/ +def fermionBoostWeights (n : ℕ) : Finset ℤ := + (Finset.univ ×ˢ ({-1, 1} : Finset ℤ)).image + fun p : (Fin n → Fin 4) × ℤ => (∑ j, lightConeWeight (p.1 j)) + p.2 + +/-- Every fermion boost weight is odd: the derivative slots contribute an even total and the + spinor index contributes `±1`. -/ +lemma not_two_dvd_of_mem_fermionBoostWeights {n : ℕ} {k : ℤ} + (hk : k ∈ fermionBoostWeights n) : ¬ (2 : ℤ) ∣ k := by + rw [fermionBoostWeights, Finset.mem_image] at hk + obtain ⟨⟨c, b⟩, hb, rfl⟩ := hk + dsimp only + have hbmem : b ∈ ({-1, 1} : Finset ℤ) := (Finset.mem_product.1 hb).2 + have heven : (2 : ℤ) ∣ ∑ j, lightConeWeight (c j) := + Finset.dvd_sum fun j _ => by + simp only [lightConeWeight] + split_ifs <;> norm_num + obtain ⟨m, hm⟩ := heven + simp only [Finset.mem_insert, Finset.mem_singleton] at hbmem + rcases hbmem with rfl | rfl <;> rw [hm] <;> omega + +/-- Every fermion boost weight has absolute value at most `2 * n + 1`: each of the `n` + derivative slots contributes at most `2`, and the spinor index one more. -/ +lemma abs_le_of_mem_fermionBoostWeights {n : ℕ} {k : ℤ} + (hk : k ∈ fermionBoostWeights n) : |k| ≤ 2 * n + 1 := by + rw [fermionBoostWeights, Finset.mem_image] at hk + obtain ⟨⟨c, b⟩, hb, rfl⟩ := hk + dsimp only + have hbmem : b ∈ ({-1, 1} : Finset ℤ) := (Finset.mem_product.1 hb).2 + have hsum : |∑ j, lightConeWeight (c j)| ≤ 2 * n := + calc |∑ j, lightConeWeight (c j)| + ≤ ∑ j, |lightConeWeight (c j)| := Finset.abs_sum_le_sum_abs _ _ + _ ≤ ∑ _j : Fin n, (2 : ℤ) := Finset.sum_le_sum fun j _ => by + simp only [lightConeWeight] + split_ifs <;> norm_num + _ = 2 * n := by + rw [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + ring + simp only [Finset.mem_insert, Finset.mem_singleton] at hbmem + rw [abs_le] at hsum + rcases hbmem with rfl | rfl <;> rw [abs_le] <;> omega + +/-- The support of the d decomposition. -/ +lemma boostWeight_d_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_d f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the bard decomposition. -/ +lemma boostWeight_bard_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_bard f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the u decomposition. -/ +lemma boostWeight_u_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_u f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the baru decomposition. -/ +lemma boostWeight_baru_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_baru f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the Q decomposition. -/ +lemma boostWeight_Q_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_Q f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the barQ decomposition. -/ +lemma boostWeight_barQ_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_barQ f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the L decomposition. -/ +lemma boostWeight_L_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_L f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the barL decomposition. -/ +lemma boostWeight_barL_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_barL f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the e decomposition. -/ +lemma boostWeight_e_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_e f n i).supp = fermionBoostWeights n := rfl + +/-- The support of the bare decomposition. -/ +lemma boostWeight_bare_supp (f : Fin 3) (n : ℕ) (i : Fin 3) : + (h.boostWeight_bare f n i).supp = fermionBoostWeights n := rfl + +/-- **The support of the boost weight decomposition of the fermion derivative + submodules**: the light-cone slot totals shifted by the spinor weight `±1`. It does not + depend on the axis or on the family. -/ +lemma derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) : + (h.derivSubmoduleBoostWeight n i).supp = fermionBoostWeights n := by + have hconst : ∀ t : Finset ℤ, (Finset.univ.biUnion fun _ : Fin 3 => t) = t := by + intro t + ext x + simp + show (Finset.univ.biUnion fun _ : Fin 3 => + ((((((((fermionBoostWeights n ∪ fermionBoostWeights n) ∪ fermionBoostWeights n) ∪ + fermionBoostWeights n) ∪ fermionBoostWeights n) ∪ fermionBoostWeights n) ∪ + fermionBoostWeights n) ∪ fermionBoostWeights n) ∪ fermionBoostWeights n) ∪ + fermionBoostWeights n) = fermionBoostWeights n + simp only [Finset.union_self] + exact hconst _ + +/-- **Every boost weight occurring in a fermion derivative submodule is odd.** This is the + boost-weight shadow of the spin-statistics split: the bosonic sectors carry even weights, + the fermionic ones odd. -/ +lemma not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : ℤ} + (hk : k ∈ (h.derivSubmoduleBoostWeight n i).supp) : ¬ (2 : ℤ) ∣ k := + not_two_dvd_of_mem_fermionBoostWeights ((h.derivSubmoduleBoostWeight_supp n i) ▸ hk) + +/-- **Every boost weight occurring in a fermion derivative submodule has absolute value at + most `2 * n + 1`**: `2` from each of the `n` derivative slots and `1` from the spinor + index. -/ +lemma abs_le_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : ℤ} + (hk : k ∈ (h.derivSubmoduleBoostWeight n i).supp) : |k| ≤ 2 * n + 1 := + abs_le_of_mem_fermionBoostWeights ((h.derivSubmoduleBoostWeight_supp n i) ▸ hk) + +/-! + +## G. The light-cone fermion symbols and their boost weights + +The unconditional decomposition above is assembled from the following pointwise statement: +a light-cone symbol evaluated at a value vector of definite boost weight `b` is a boost +eigenvector, of weight `(∑ j, lightConeWeight (c j)) + b`. + +-/ + +include h in +/-- **The light-cone `d` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_d_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ DownSinglet} + (hφ : φ ∈ boostWeightSubmodule DownSinglet.repLorentzGroup.dual i b) : + lightConeDeriv (d (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_d f n) i c hφ + +include h in +/-- **The light-cone `bard` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_bard_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ (ConjModule DownSinglet)} + (hφ : φ ∈ boostWeightSubmodule DownSinglet.repLorentzGroup.conj.dual i b) : + lightConeDeriv (bard (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_bard f n) i c hφ + +include h in +/-- **The light-cone `u` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_u_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ UpSinglet} + (hφ : φ ∈ boostWeightSubmodule UpSinglet.repLorentzGroup.dual i b) : + lightConeDeriv (u (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_u f n) i c hφ + +include h in +/-- **The light-cone `baru` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_baru_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ (ConjModule UpSinglet)} + (hφ : φ ∈ boostWeightSubmodule UpSinglet.repLorentzGroup.conj.dual i b) : + lightConeDeriv (baru (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_baru f n) i c hφ + +include h in +/-- **The light-cone `Q` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_Q_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ QuarkDoublet} + (hφ : φ ∈ boostWeightSubmodule QuarkDoublet.repLorentzGroup.dual i b) : + lightConeDeriv (Q (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_Q f n) i c hφ + +include h in +/-- **The light-cone `barQ` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_barQ_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ (ConjModule QuarkDoublet)} + (hφ : φ ∈ boostWeightSubmodule QuarkDoublet.repLorentzGroup.conj.dual i b) : + lightConeDeriv (barQ (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_barQ f n) i c hφ + +include h in +/-- **The light-cone `L` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_L_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ LeptonDoublet} + (hφ : φ ∈ boostWeightSubmodule LeptonDoublet.repLorentzGroup.dual i b) : + lightConeDeriv (L (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_L f n) i c hφ + +include h in +/-- **The light-cone `barL` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_barL_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ (ConjModule LeptonDoublet)} + (hφ : φ ∈ boostWeightSubmodule LeptonDoublet.repLorentzGroup.conj.dual i b) : + lightConeDeriv (barL (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_barL f n) i c hφ + +include h in +/-- **The light-cone `e` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_e_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ LeptonSinglet} + (hφ : φ ∈ boostWeightSubmodule LeptonSinglet.repLorentzGroup.dual i b) : + lightConeDeriv (e (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_e f n) i c hφ + +include h in +/-- **The light-cone `bare` symbols have definite boost weight.** Each derivative slot + contributes the weight of its light-cone direction — `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, `0` for the two transverse directions — on top of the weight `b` carried by the + value index. -/ +lemma lightConeDeriv_bare_mem (f : Fin 3) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} + {φ : Module.Dual ℂ (ConjModule LeptonSinglet)} + (hφ : φ ∈ boostWeightSubmodule LeptonSinglet.repLorentzGroup.conj.dual i b) : + lightConeDeriv (bare (n := n) f) i c φ ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := + lightConeDeriv_mem _ (h.rotatesIndices_bare f n) i c hφ + +end IsFermionSector + +end StandardModel + +end diff --git a/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/GaugeWeightDecomposition.lean similarity index 76% rename from Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean rename to Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/GaugeWeightDecomposition.lean index 4b1731c80..9b1f0cd19 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/GaugeWeightDecomposition.lean @@ -313,6 +313,96 @@ noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : (d' := h.rangeGaugeWeight_bare f l)) _ (by rw [derivSubmodule]) + +/-! + +## The support of the decomposition + +-/ + +/-- The gauge weights carried by the fermion symbols: for each species the image of + its value weights, negated for the unbarred species (the symbols pair with the dual + of the value space) and taken as they are for the barred ones. -/ +def fermionGaugeWeights : Finset GaugeWeight := + Finset.univ.image (fun j : Fin 2 × Fin 3 => -(DownSinglet.valueGaugeWeight j)) + ∪ Finset.univ.image (fun j : Fin 2 × Fin 3 => DownSinglet.valueGaugeWeight j) + ∪ Finset.univ.image (fun j : Fin 2 × Fin 3 => -(UpSinglet.valueGaugeWeight j)) + ∪ Finset.univ.image (fun j : Fin 2 × Fin 3 => UpSinglet.valueGaugeWeight j) + ∪ Finset.univ.image (fun j : Fin 2 × Fin 3 × Fin 2 => -(QuarkDoublet.valueGaugeWeight j)) + ∪ Finset.univ.image (fun j : Fin 2 × Fin 3 × Fin 2 => QuarkDoublet.valueGaugeWeight j) + ∪ Finset.univ.image (fun j : Fin 2 × Fin 2 => -(LeptonDoublet.valueGaugeWeight j)) + ∪ Finset.univ.image (fun j : Fin 2 × Fin 2 => LeptonDoublet.valueGaugeWeight j) + ∪ Finset.univ.image (fun j : Fin 2 => -(LeptonSinglet.valueGaugeWeight j)) + ∪ Finset.univ.image (fun j : Fin 2 => LeptonSinglet.valueGaugeWeight j) + +/-- The support of the `d` range decomposition. -/ +lemma rangeGaugeWeight_d_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_d f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 3 => -(DownSinglet.valueGaugeWeight j)) := + Finset.biUnion_singleton +/-- The support of the `bard` range decomposition. -/ +lemma rangeGaugeWeight_bard_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_bard f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 3 => DownSinglet.valueGaugeWeight j) := + Finset.biUnion_singleton +/-- The support of the `u` range decomposition. -/ +lemma rangeGaugeWeight_u_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_u f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 3 => -(UpSinglet.valueGaugeWeight j)) := + Finset.biUnion_singleton +/-- The support of the `baru` range decomposition. -/ +lemma rangeGaugeWeight_baru_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_baru f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 3 => UpSinglet.valueGaugeWeight j) := + Finset.biUnion_singleton +/-- The support of the `Q` range decomposition. -/ +lemma rangeGaugeWeight_Q_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_Q f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 3 × Fin 2 => -(QuarkDoublet.valueGaugeWeight j)) := + Finset.biUnion_singleton +/-- The support of the `barQ` range decomposition. -/ +lemma rangeGaugeWeight_barQ_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_barQ f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 3 × Fin 2 => QuarkDoublet.valueGaugeWeight j) := + Finset.biUnion_singleton +/-- The support of the `L` range decomposition. -/ +lemma rangeGaugeWeight_L_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_L f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 2 => -(LeptonDoublet.valueGaugeWeight j)) := + Finset.biUnion_singleton +/-- The support of the `barL` range decomposition. -/ +lemma rangeGaugeWeight_barL_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_barL f l).supp + = Finset.univ.image (fun j : Fin 2 × Fin 2 => LeptonDoublet.valueGaugeWeight j) := + Finset.biUnion_singleton +/-- The support of the `e` range decomposition. -/ +lemma rangeGaugeWeight_e_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_e f l).supp + = Finset.univ.image (fun j : Fin 2 => -(LeptonSinglet.valueGaugeWeight j)) := + Finset.biUnion_singleton +/-- The support of the `bare` range decomposition. -/ +lemma rangeGaugeWeight_bare_supp (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight_bare f l).supp + = Finset.univ.image (fun j : Fin 2 => LeptonSinglet.valueGaugeWeight j) := + Finset.biUnion_singleton + +/-- **The support of the gauge weight decomposition of the fermion derivative + submodules**: the gauge weights of the ten species, independent of the number of + covariant derivatives. -/ +lemma derivSubmoduleGaugeWeight_supp (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).supp = fermionGaugeWeights := by + have hconst : ∀ (t : Finset GaugeWeight), + (Finset.univ.biUnion fun _ : Fin 3 => + Finset.univ.biUnion fun _ : Fin n → Fin 1 ⊕ Fin 3 => t) = t := by + intro t + ext x + simp only [Finset.mem_biUnion, Finset.mem_univ, true_and] + exact ⟨fun ⟨_, _, hx⟩ => hx, fun hx => ⟨0, fun _ => Sum.inl 0, hx⟩⟩ + show (Finset.univ.biUnion fun _ : Fin 3 => + Finset.univ.biUnion fun _ : Fin n → Fin 1 ⊕ Fin 3 => fermionGaugeWeights) + = fermionGaugeWeights + exact hconst _ + end IsFermionSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/IsFermionSector/MassWeight.lean rename to Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean new file mode 100644 index 000000000..27463b2d9 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsFermionSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.GaugeWeightDecomposition +/-! +# The gauge weight decomposition of the fermion mass-weight submodules + +Each mass-weight submodule of the fermion sector up to weight eight has an explicit +description in terms of the derivative submodules, and the derivative submodules carry +a gauge weight decomposition. Transporting the latter along the former decomposes +every mass-weight submodule up to weight eight: weights one, two and four are trivial, +weights three, five and seven are the towers with zero, one and two covariant +derivatives, weight six is the product of two underived towers, and weight eight is the +kinetic sector. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups + +namespace IsFermionSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {d : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : {n : ℕ} → Fin 3 → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + d bard u baru Q barQ L barL e bare massWeightPoly) + +/-- Weight one is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightOne : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 1) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_one_eq + +/-- Weight two is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightTwo : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 2) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_two_eq + +/-- Weight three is the underived fermion towers. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightThree : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 3) := + GaugeWeightDecomposition.copy (h.derivSubmoduleGaugeWeight 0) _ + h.massWeightSubmodule_three_eq + +/-- Weight four is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightFour : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 4) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_four_eq + +/-- Weight five is the once-derived fermion towers. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightFive : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 5) := + GaugeWeightDecomposition.copy (h.derivSubmoduleGaugeWeight 1) _ + h.massWeightSubmodule_five_eq + +/-- Weight six is the products of two underived fermion towers. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightSix : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 6) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 0)) _ + h.massWeightSubmodule_six_eq + +/-- Weight seven is the twice-derived fermion towers. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightSeven : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 7) := + GaugeWeightDecomposition.copy (h.derivSubmoduleGaugeWeight 2) _ + h.massWeightSubmodule_seven_eq + +/-- Weight eight is the kinetic sector: an underived tower against a once-derived one. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightEight : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 8) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 1)) _ + h.massWeightSubmodule_eight_eq + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean new file mode 100644 index 000000000..2e85be589 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -0,0 +1,371 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsGaugeSector.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +/-! +# The boost weight decomposition of the gauge sector + +The boost-weight analogue of `GaugeWeightDecomposition.lean`. There the field-strength +symbols were split by their *gauge* weight, the value index doing all the work; here they +are split by their *boost* weight along a spatial axis, the Lorentz indices doing all the +work and the value index sitting inert. + +The field strength `F l μ ν φ` carries two covector indices `μ`, `ν` beyond the tuple `l` +of covariant-derivative directions, and `IsGaugeSector.repLorentz_F` mixes all of them by +the same Lorentz matrix. So the symbols are repackaged, by `fieldStrengthSymbol`, as a +family indexed by `Fin (n + 2) → Fin 1 ⊕ Fin 3`: the first `n` slots are the derivative +directions and the last two are `μ` and `ν`. The value index is a *real* dual vector, so +the repackaged family is presented as a `ℂ`-linear map out of `ℂ` — one for each `φ` — +which is exactly the shape `IsHiggsSector.RotatesIndices` asks for, +with the trivial representation on `ℂ` recording that the value index carries no Lorentz +weight. + +Everything then follows from the light-cone machinery of the Higgs sector. Reading the +`n + 2` slots in the light-cone basis of the `i`-th axis produces the symbols +`lightConeFieldStrength i c φ`, and these are boost eigenvectors: the slot type `c j` +contributes `lightConeWeight (c j)` — `+2` for `D₀ - Dᵢ`, `-2` for `D₀ + Dᵢ` and `0` for +the two transverse directions — so the total weight is `∑ j, lightConeWeight (c j)`. +Joining over the light-cone multi-indices and over the value index gives +`derivSubmoduleBoostWeight`, a `Lorentz.BoostWeight.WeightDecomposition` of +`h.derivSubmodule n` along every axis. The weights that occur are the achievable slot +sums: even integers of absolute value at most `2 * (n + 2)`. + +-/ + +@[expose] public section + +namespace Lorentz.BoostWeight.WeightDecomposition + +open MatrixGroups + +variable {K : Type*} [Field K] [Algebra ℝ K] {M : Type*} [AddCommGroup M] [Module K M] + +/-- **The join of an arbitrary family of weight decompositions sharing one support.** The + weight-`k` piece of the join is the join of the weight-`k` pieces; a common finite set of + weights containing every member's support is supplied, so the index type need not be + finite. -/ +noncomputable def iSupOfSupp {ι : Type*} {rep : Representation K SL(2,ℂ) M} {i : Fin 3} + {V : ι → Submodule K M} (d : (a : ι) → WeightDecomposition rep i (V a)) (s : Finset ℤ) + (hs : ∀ a, (d a).supp ⊆ s) : WeightDecomposition rep i (⨆ a, V a) where + piece k := ⨆ a, (d a).piece k + supp := s + piece_le k := iSup_le fun a => (d a).piece_le k + piece_eq_bot k hk := iSup_eq_bot.mpr fun a => (d a).piece_eq_bot k fun hm => hk (hs a hm) + iSup_piece := by + rw [iSup_comm] + exact iSup_congr fun a => (d a).iSup_piece + +/-- The pieces of an indexed join are the joins of the pieces. -/ +@[simp] +lemma iSupOfSupp_piece {ι : Type*} {rep : Representation K SL(2,ℂ) M} {i : Fin 3} + {V : ι → Submodule K M} (d : (a : ι) → WeightDecomposition rep i (V a)) (s : Finset ℤ) + (hs : ∀ a, (d a).supp ⊆ s) (k : ℤ) : + (iSupOfSupp d s hs).piece k = ⨆ a, (d a).piece k := rfl + +end Lorentz.BoostWeight.WeightDecomposition + +namespace StandardModel + +open Matrix MatrixGroups Lorentz Lorentz.BoostWeight +open IsHiggsSector.IsDerivativeCollection + +/-- Each light-cone direction carries weight `+2`, `-2` or `0`. -/ +lemma lightConeWeight_eq_two_or_neg_two_or_zero (κ : Fin 4) : + lightConeWeight κ = 2 ∨ lightConeWeight κ = -2 ∨ lightConeWeight κ = 0 := by + simp only [lightConeWeight] + split_ifs <;> simp + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +/-! + +## A. The field strength as a symbol family with `n + 2` covector slots + +-/ + +set_option linter.unusedVariables false in +/-- **The field strength repackaged as a derivative symbol family.** The `n` covariant + derivative directions and the two covector indices `μ`, `ν` are collected into a single + tuple of `n + 2` spacetime directions — the first `n` slots by `Fin.castAdd`, the last two + by `Fin.natAdd` — and the value index `φ` is frozen. The result is presented as a + `ℂ`-linear map out of `ℂ`, scaling the symbol, so that the light-cone machinery of the + Higgs sector applies verbatim. -/ +noncomputable def fieldStrengthSymbol + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul F massWeightPoly) + {n : ℕ} (φ : Module.Dual ℝ GaugeAlgebra) (d : Fin (n + 2) → Fin 1 ⊕ Fin 3) : + ℂ →ₗ[ℂ] B := + LinearMap.toSpanSingleton ℂ B + (F (fun j : Fin n => d (Fin.castAdd 2 j)) (d (Fin.natAdd n 0)) (d (Fin.natAdd n 1)) φ) + +/-- The packed symbol map scales the field strength. -/ +lemma fieldStrengthSymbol_apply {n : ℕ} (φ : Module.Dual ℝ GaugeAlgebra) + (d : Fin (n + 2) → Fin 1 ⊕ Fin 3) (z : ℂ) : + h.fieldStrengthSymbol φ d z = + z • F (fun j : Fin n => d (Fin.castAdd 2 j)) (d (Fin.natAdd n 0)) + (d (Fin.natAdd n 1)) φ := rfl + +/-- The range of a packed symbol map is the line through the field-strength symbol. -/ +lemma range_fieldStrengthSymbol {n : ℕ} (φ : Module.Dual ℝ GaugeAlgebra) + (d : Fin (n + 2) → Fin 1 ⊕ Fin 3) : + LinearMap.range (h.fieldStrengthSymbol φ d) = + Submodule.span ℂ {F (fun j : Fin n => d (Fin.castAdd 2 j)) (d (Fin.natAdd n 0)) + (d (Fin.natAdd n 1)) φ} := + (LinearMap.span_singleton_eq_range ℂ B _).symm + +include h in +/-- **All `n + 2` slots of the packed family are Lorentz vector indices.** The single + Lorentz matrix of `repLorentz_F` mixes the derivative directions and the two covector + indices alike, so after packing the law is one sum over one product; the value index is a + real dual vector and carries no Lorentz weight, recorded by the trivial representation + on `ℂ`. -/ +lemma rotatesIndices_fieldStrengthSymbol {n : ℕ} (φ : Module.Dual ℝ GaugeAlgebra) : + RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz + (h.fieldStrengthSymbol (n := n) φ) := by + intro g d w + calc repLorentz g (h.fieldStrengthSymbol φ d w) + = ∑ q : (Fin n → Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + (w * ((∏ j, (((SL2C.toLorentzGroup g).1 (q.1 j) + (d (Fin.castAdd 2 j)) : ℝ) : ℂ)) * + ((((SL2C.toLorentzGroup g).1 q.2.1 (d (Fin.natAdd n 0)) : ℝ) : ℂ) * + (((SL2C.toLorentzGroup g).1 q.2.2 (d (Fin.natAdd n 1)) : ℝ) : ℂ)))) • + F q.1 q.2.1 q.2.2 φ := by + simp only [Fintype.sum_prod_type, fieldStrengthSymbol, + LinearMap.toSpanSingleton_apply, map_smul, h.repLorentz_F, Finset.smul_sum, + smul_smul] + _ = ∑ A : Fin (n + 2) → Fin 1 ⊕ Fin 3, + (∏ j, (((SL2C.toLorentzGroup g).1 (A j) (d j) : ℝ) : ℂ)) • + h.fieldStrengthSymbol φ A ((1 : Representation ℂ SL(2,ℂ) ℂ) g w) := by + refine Fintype.sum_equiv (((Equiv.refl (Fin n → Fin 1 ⊕ Fin 3)).prodCongr + (piFinTwoEquiv (fun _ => Fin 1 ⊕ Fin 3)).symm).trans (Fin.appendEquiv n 2)) _ _ ?_ + rintro ⟨p, a, b⟩ + show _ = (∏ j, (((SL2C.toLorentzGroup g).1 (Fin.append p ![a, b] j) + (d j) : ℝ) : ℂ)) • h.fieldStrengthSymbol φ (Fin.append p ![a, b]) + ((1 : Representation ℂ SL(2,ℂ) ℂ) g w) + rw [Fin.prod_univ_add, Fin.prod_univ_two] + simp only [fieldStrengthSymbol, LinearMap.toSpanSingleton_apply, Fin.append_left, + Fin.append_right, Matrix.cons_val_zero, Matrix.cons_val_one, smul_smul] + congr 1 + rw [show ((1 : Representation ℂ SL(2,ℂ) ℂ) g) w = w from rfl] + ring + +/-! + +## B. The light-cone field strengths and their boost weights + +-/ + +set_option linter.unusedVariables false in +/-- **The light-cone field strengths.** The `n + 2` slots of the packed symbol — the + covariant derivative directions together with the two covector indices — are read in the + light-cone basis of the `i`-th spatial axis, `c j` naming the light-cone direction of the + `j`-th slot. -/ +noncomputable def lightConeFieldStrength + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul F massWeightPoly) + {n : ℕ} (i : Fin 3) (c : Fin (n + 2) → Fin 4) (φ : Module.Dual ℝ GaugeAlgebra) : B := + lightConeDeriv (h.fieldStrengthSymbol (n := n) φ) i c 1 + +/-- The light-cone symbol map scales the light-cone field strength. -/ +lemma lightConeDeriv_fieldStrengthSymbol_apply {n : ℕ} (i : Fin 3) (c : Fin (n + 2) → Fin 4) + (φ : Module.Dual ℝ GaugeAlgebra) (z : ℂ) : + lightConeDeriv (h.fieldStrengthSymbol (n := n) φ) i c z = + z • h.lightConeFieldStrength i c φ := by + conv_lhs => rw [← mul_one z, ← smul_eq_mul] + rw [map_smul] + rfl + +/-- The range of a light-cone symbol map is the line through the light-cone field + strength. -/ +lemma range_lightConeDeriv_fieldStrengthSymbol {n : ℕ} (i : Fin 3) (c : Fin (n + 2) → Fin 4) + (φ : Module.Dual ℝ GaugeAlgebra) : + LinearMap.range (lightConeDeriv (h.fieldStrengthSymbol (n := n) φ) i c) = + Submodule.span ℂ {h.lightConeFieldStrength i c φ} := by + refine le_antisymm ?_ ((Submodule.span_singleton_le_iff_mem _ _).mpr ⟨1, rfl⟩) + rintro _ ⟨z, rfl⟩ + rw [h.lightConeDeriv_fieldStrengthSymbol_apply i c φ z] + exact Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _) + +/-- **The light-cone field strengths have definite boost weight.** Each of the `n + 2` + slots contributes the weight of its light-cone direction: `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ` and `0` for the two transverse directions. The value index is inert, so no + further contribution appears. -/ +lemma lightConeFieldStrength_mem {n : ℕ} (i : Fin 3) (c : Fin (n + 2) → Fin 4) + (φ : Module.Dual ℝ GaugeAlgebra) : + h.lightConeFieldStrength i c φ ∈ + boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := + range_lightConeDeriv_le (h.fieldStrengthSymbol (n := n) φ) + (h.rotatesIndices_fieldStrengthSymbol φ) i c ⟨1, rfl⟩ + +/-! + +## C. The boost weight decomposition + +-/ + +set_option linter.unusedVariables false in +/-- The boost weight decomposition of the span of the field-strength symbols at one fixed + value index. -/ +noncomputable def symbolBoostWeight + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul F massWeightPoly) + {n : ℕ} (i : Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + WeightDecomposition repLorentz i + (⨆ d : Fin (n + 2) → Fin 1 ⊕ Fin 3, LinearMap.range (h.fieldStrengthSymbol φ d)) := + boostDecomp (h.fieldStrengthSymbol (n := n) φ) (h.rotatesIndices_fieldStrengthSymbol φ) i + (IsHiggsSector.trivialWeightDecomposition i) + +/-- The weight-`k` piece at one value index is spanned by the light-cone field strengths + whose slots have total weight `k`. -/ +lemma symbolBoostWeight_piece {n : ℕ} (i : Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) (k : ℤ) : + (h.symbolBoostWeight (n := n) i φ).piece k + = ⨆ (c : Fin (n + 2) → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), + Submodule.span ℂ {h.lightConeFieldStrength i c φ} := by + show (⨆ c : Fin (n + 2) → Fin 4, + ((IsHiggsSector.trivialWeightDecomposition i).piece + (k - ∑ j, lightConeWeight (c j))).map + (lightConeDeriv (h.fieldStrengthSymbol (n := n) φ) i c)) = _ + refine iSup_congr fun c => ?_ + by_cases hc : (∑ j, lightConeWeight (c j)) = k + · rw [show k - (∑ j, lightConeWeight (c j)) = 0 from by omega, + IsHiggsSector.trivialWeightDecomposition_piece, if_pos rfl, Submodule.map_top, + iSup_pos hc, h.range_lightConeDeriv_fieldStrengthSymbol i c φ] + · rw [IsHiggsSector.trivialWeightDecomposition_piece, if_neg (by omega), + Submodule.map_bot, iSup_neg hc] + +/-- The packed symbol ranges, joined over the value index and the `n + 2` slots, recover the + gauge derivative submodule: packing and unpacking a tuple of directions is a bijection. -/ +lemma iSup_range_fieldStrengthSymbol (n : ℕ) : + (⨆ (φ : Module.Dual ℝ GaugeAlgebra) (d : Fin (n + 2) → Fin 1 ⊕ Fin 3), + LinearMap.range (h.fieldStrengthSymbol φ d)) = h.derivSubmodule n := by + rw [derivSubmodule] + refine le_antisymm (iSup_le fun φ => iSup_le fun d => ?_) ?_ + · rw [h.range_fieldStrengthSymbol φ d, Submodule.span_singleton_le_iff_mem] + exact Submodule.mem_iSup_of_mem _ (Submodule.mem_iSup_of_mem _ + (Submodule.mem_iSup_of_mem _ (Submodule.subset_span ⟨φ, rfl⟩))) + · refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => Submodule.span_le.mpr ?_ + rintro _ ⟨φ, rfl⟩ + refine Submodule.mem_iSup_of_mem φ + (Submodule.mem_iSup_of_mem (Fin.append l ![μ, ν]) ?_) + rw [h.range_fieldStrengthSymbol φ (Fin.append l ![μ, ν])] + simp only [Fin.append_left, Fin.append_right, Matrix.cons_val_zero, Matrix.cons_val_one] + exact Submodule.mem_span_singleton_self _ + +set_option linter.unusedVariables false in +/-- **The boost weight decomposition of the gauge derivative submodules**, along any spatial + axis and for any number of covariant derivatives. -/ +noncomputable def derivSubmoduleBoostWeight + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul F massWeightPoly) + (n : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.derivSubmodule n) := + (WeightDecomposition.iSupOfSupp (fun φ => h.symbolBoostWeight (n := n) i φ) + ((Finset.univ ×ˢ ({0} : Finset ℤ)).image + fun p : (Fin (n + 2) → Fin 4) × ℤ => (∑ j, lightConeWeight (p.1 j)) + p.2) + fun _ => subset_rfl).copy (h.iSup_range_fieldStrengthSymbol n) + +/-- **The weight-`k` piece of the gauge derivative submodule** is spanned by the light-cone + field strengths whose `n + 2` slots have total weight `k`, over all value indices. -/ +lemma derivSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : + (h.derivSubmoduleBoostWeight n i).piece k + = ⨆ (φ : Module.Dual ℝ GaugeAlgebra) (c : Fin (n + 2) → Fin 4) + (_ : (∑ j, lightConeWeight (c j)) = k), + Submodule.span ℂ {h.lightConeFieldStrength i c φ} := by + show (⨆ φ, (h.symbolBoostWeight (n := n) i φ).piece k) = _ + exact iSup_congr fun φ => h.symbolBoostWeight_piece i φ k + +/-- **The boost weights occurring in the gauge derivative submodules**: the totals of the + light-cone weights of the `n + 2` slots. They do not depend on the axis. -/ +lemma derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) : + (h.derivSubmoduleBoostWeight n i).supp + = (Finset.univ : Finset (Fin (n + 2) → Fin 4)).image + fun c => ∑ j, lightConeWeight (c j) := by + show ((Finset.univ ×ˢ ({0} : Finset ℤ)).image + fun p : (Fin (n + 2) → Fin 4) × ℤ => (∑ j, lightConeWeight (p.1 j)) + p.2) = _ + ext k + simp [Finset.mem_image] + +/-- Every boost weight occurring in a gauge derivative submodule is even: each slot + contributes `+2`, `-2` or `0`. -/ +lemma two_dvd_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : ℤ} + (hk : k ∈ (h.derivSubmoduleBoostWeight n i).supp) : (2 : ℤ) ∣ k := by + rw [h.derivSubmoduleBoostWeight_supp n i, Finset.mem_image] at hk + obtain ⟨c, -, rfl⟩ := hk + refine Finset.dvd_sum fun j _ => ?_ + rcases lightConeWeight_eq_two_or_neg_two_or_zero (c j) with hj | hj | hj <;> + rw [hj] <;> norm_num + +/-- Every boost weight occurring in a gauge derivative submodule has absolute value at most + `2 * (n + 2)`: the `n + 2` slots contribute at most `2` each. -/ +lemma abs_le_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : ℤ} + (hk : k ∈ (h.derivSubmoduleBoostWeight n i).supp) : |k| ≤ 2 * (n + 2) := by + rw [h.derivSubmoduleBoostWeight_supp n i, Finset.mem_image] at hk + obtain ⟨c, -, rfl⟩ := hk + calc |∑ j, lightConeWeight (c j)| + ≤ ∑ j, |lightConeWeight (c j)| := Finset.abs_sum_le_sum_abs _ _ + _ ≤ ∑ _j : Fin (n + 2), (2 : ℤ) := Finset.sum_le_sum fun j _ => by + rcases lightConeWeight_eq_two_or_neg_two_or_zero (c j) with hj | hj | hj <;> + rw [hj] <;> norm_num + _ = 2 * (n + 2) := by + rw [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + push_cast + ring + +/-! + +## The occurring weights in low order + +-/ + +/-- The light-cone weight totals of two slots. -/ +lemma image_lightConeWeight_sum_two : + (Finset.univ : Finset (Fin 2 → Fin 4)).image (fun c => ∑ j, lightConeWeight (c j)) + = {-4, -2, 0, 2, 4} := by decide + +/-- The light-cone weight totals of three slots. -/ +lemma image_lightConeWeight_sum_three : + (Finset.univ : Finset (Fin 3 → Fin 4)).image (fun c => ∑ j, lightConeWeight (c j)) + = {-6, -4, -2, 0, 2, 4, 6} := by decide + +set_option maxRecDepth 4000 in +/-- The light-cone weight totals of four slots. -/ +lemma image_lightConeWeight_sum_four : + (Finset.univ : Finset (Fin 4 → Fin 4)).image (fun c => ∑ j, lightConeWeight (c j)) + = {-8, -6, -4, -2, 0, 2, 4, 6, 8} := by decide + +/-- The boost weights of the underived field strength: two slots, so `-4` to `4`. -/ +lemma derivSubmoduleBoostWeight_supp_zero (i : Fin 3) : + (h.derivSubmoduleBoostWeight 0 i).supp = {-4, -2, 0, 2, 4} := by + rw [h.derivSubmoduleBoostWeight_supp 0 i] + exact image_lightConeWeight_sum_two + +/-- The boost weights of the once-derived field strength: three slots, so `-6` to `6`. -/ +lemma derivSubmoduleBoostWeight_supp_one (i : Fin 3) : + (h.derivSubmoduleBoostWeight 1 i).supp = {-6, -4, -2, 0, 2, 4, 6} := by + rw [h.derivSubmoduleBoostWeight_supp 1 i] + exact image_lightConeWeight_sum_three + +/-- The boost weights of the twice-derived field strength: four slots, so `-8` to `8`. -/ +lemma derivSubmoduleBoostWeight_supp_two (i : Fin 3) : + (h.derivSubmoduleBoostWeight 2 i).supp = {-8, -6, -4, -2, 0, 2, 4, 6, 8} := by + rw [h.derivSubmoduleBoostWeight_supp 2 i] + exact image_lightConeWeight_sum_four + +end IsGaugeSector + +end StandardModel + +end diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/GaugeWieghtDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean similarity index 56% rename from Physlib/Particles/StandardModel/IsGaugeSector/GaugeWieghtDecomposition.lean rename to Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean index 507bf5d05..a7b4793a1 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/GaugeWieghtDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.IsGaugeSector.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition /-! @@ -33,243 +34,12 @@ namespace StandardModel open Matrix MatrixGroups -/-- Conjugation inverts a power of `expI`. -/ -lemma star_expI_zpow (z : ℤ) : star ((expI : ℂ) ^ z) = (expI : ℂ) ^ (-z) := by - rw [Complex.star_def, starRingEnd_expI_zpow] - -/-! - -## A. The coordinates of the standard basis - --/ - -namespace GaugeAlgebra - -/-- coords -/ -noncomputable def stdCoeff (x : GaugeAlgebra) : Fin 8 ⊕ Fin 3 ⊕ Fin 1 → ℝ - | Sum.inl k => gellMannCoeff x.toSU3Matrix k - | Sum.inr (Sum.inl i) => pauliCoeff x.toSU2Matrix i - | Sum.inr (Sum.inr _) => (x.toU1Value).re - -lemma eq_sum_stdCoeff (x : GaugeAlgebra) : x = ∑ y, stdCoeff x y • stdBasis y := by - refine ext_of_matrix ?_ ?_ ?_ - · rw [toSU3Matrix_sum] - simp only [Fintype.sum_sum_type, smul_toSU3Matrix, stdBasis_inl_toSU3Matrix, - stdBasis_inr_inl_toSU3Matrix, stdBasis_inr_inr_toSU3Matrix, smul_zero, - Finset.sum_const_zero, add_zero] - exact eq_sum_gellMannCoeff_smul x.1.2.1 x.1.2.2 - · rw [toSU2Matrix_sum] - simp only [Fintype.sum_sum_type, smul_toSU2Matrix, stdBasis_inl_toSU2Matrix, - stdBasis_inr_inl_toSU2Matrix, stdBasis_inr_inr_toSU2Matrix, smul_zero, - Finset.sum_const_zero, zero_add, add_zero] - exact eq_sum_pauliCoeff_smul x.2.1.2.1 x.2.1.2.2 - · have h1 : ((x.toU1Value.re : ℝ) : ℂ) = x.toU1Value := - Complex.conj_eq_iff_re.mp x.2.2.2 - rw [toU1Value_sum] - simp only [Fintype.sum_sum_type, smul_toU1Value, stdBasis_inl_toU1Value, - stdBasis_inr_inl_toU1Value, stdBasis_inr_inr_toU1Value, stdCoeff, - Complex.real_smul, mul_zero, Finset.sum_const_zero, zero_add, mul_one, - Finset.sum_const, Finset.card_univ, Fintype.card_fin, one_smul, h1] - -/-- The coordinate functionals of `stdBasis` read off a gauge-algebra element's matrix - entries. -/ -lemma stdBasis_coord_apply (y : GaugeAlgebra) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : - stdBasis.coord a y = stdCoeff y a := by - conv_lhs => rw [eq_sum_stdCoeff y] - rw [map_sum] - simp only [map_smul, smul_eq_mul, Module.Basis.coord_apply, Module.Basis.repr_self, - Finsupp.single_apply, mul_ite, mul_one, mul_zero] - rw [Finset.sum_ite_eq' Finset.univ a fun b => stdCoeff y b] +/-- A join over a nonempty index of a constant family of supports is that support. -/ +lemma biUnion_univ_const {ι : Type*} [Fintype ι] [Nonempty ι] (t : Finset GaugeWeight) : + (Finset.univ : Finset ι).biUnion (fun _ => t) = t := by + ext w simp -end GaugeAlgebra - -/-! - -## B. The torus acts by conjugation with a diagonal matrix - --/ - -/-- su3 diagonals of inverse torus gens -/ -noncomputable def torusSU3Diag : Fin 4 → Fin 3 → ℂ := - ![![star (expI : ℂ), (expI : ℂ), 1], ![1, star (expI : ℂ), (expI : ℂ)], 1, 1] - -/-- su2 -/ -noncomputable def torusSU2Diag : Fin 4 → Fin 2 → ℂ := - ![1, 1, ![star (expI : ℂ), (expI : ℂ)], 1] - -lemma toSU3_inv_gaugeTorusGen (i : Fin 4) : - ((GaugeGroupI.toSU3 (gaugeTorusGen i)⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ) = Matrix.diagonal (torusSU3Diag i) := by - rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] - fin_cases i <;> - · ext a b - fin_cases a <;> fin_cases b <;> - simp [gaugeTorusGen, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, torusSU3Diag, - Matrix.diagonal] - -lemma toSU2_inv_gaugeTorusGen (i : Fin 4) : - ((GaugeGroupI.toSU2 (gaugeTorusGen i)⁻¹ : specialUnitaryGroup (Fin 2) ℂ) : - Matrix (Fin 2) (Fin 2) ℂ) = Matrix.diagonal (torusSU2Diag i) := by - rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] - fin_cases i <;> - · ext a b - fin_cases a <;> fin_cases b <;> - simp [gaugeTorusGen, GaugeGroupI.toSU2, su2ExpI, torusSU2Diag, - Matrix.diagonal] - -namespace GaugeAlgebra - -lemma adjointMap_toSU3Matrix_apply_diagonal {g : GaugeGroupI} {d : Fin 3 → ℂ} - (hg : ((GaugeGroupI.toSU3 g : specialUnitaryGroup (Fin 3) ℂ) : - Matrix (Fin 3) (Fin 3) ℂ) = Matrix.diagonal d) - (x : GaugeAlgebra) (j k : Fin 3) : - (adjointMap g x).toSU3Matrix j k = d j * star (d k) * x.toSU3Matrix j k := by - rw [adjointMap_toSU3Matrix, hg, Matrix.star_eq_conjTranspose, - Matrix.diagonal_conjTranspose, Matrix.mul_diagonal, Matrix.diagonal_mul, Pi.star_apply] - ring - -lemma adjointMap_toSU2Matrix_apply_diagonal {g : GaugeGroupI} {d : Fin 2 → ℂ} - (hg : ((GaugeGroupI.toSU2 g : specialUnitaryGroup (Fin 2) ℂ) : - Matrix (Fin 2) (Fin 2) ℂ) = Matrix.diagonal d) - (x : GaugeAlgebra) (j k : Fin 2) : - (adjointMap g x).toSU2Matrix j k = d j * star (d k) * x.toSU2Matrix j k := by - rw [adjointMap_toSU2Matrix, hg, Matrix.star_eq_conjTranspose, - Matrix.diagonal_conjTranspose, Matrix.mul_diagonal, Matrix.diagonal_mul, Pi.star_apply] - ring - -end GaugeAlgebra - -lemma torusSU3Diag_mul_star (i : Fin 4) (j : Fin 3) : - torusSU3Diag i j * star (torusSU3Diag i j) = 1 := by - fin_cases i <;> fin_cases j <;> - simp [torusSU3Diag, expI_mul_conj, conj_mul_expI] - -lemma torusSU2Diag_mul_star (i : Fin 4) (j : Fin 2) : - torusSU2Diag i j * star (torusSU2Diag i j) = 1 := by - fin_cases i <;> fin_cases j <;> - simp [torusSU2Diag, expI_mul_conj, conj_mul_expI] - -namespace GaugeAlgebra - -/-! - -## C. An entrywise scaling rotates the real pair of coordinate functionals - --/ - -lemma dualMap_pair_of_entry {g : GaugeGroupI} {e : GaugeAlgebra → ℂ} - {φ₁ φ₂ : Module.Dual ℝ GaugeAlgebra} {z : ℂ} - (h1 : ∀ x, φ₁ x = (e x).re) (h2 : ∀ x, φ₂ x = -(e x).im) - (he : ∀ x, e (adjointMap g x) = star z * e x) : - (adjointMap g).dualMap φ₁ = z.re • φ₁ - z.im • φ₂ ∧ - (adjointMap g).dualMap φ₂ = z.im • φ₁ + z.re • φ₂ := by - constructor <;> refine LinearMap.ext fun x => ?_ <;> - simp only [LinearMap.dualMap_apply, LinearMap.sub_apply, LinearMap.add_apply, - LinearMap.smul_apply, smul_eq_mul, h1, h2, he, Complex.mul_re, Complex.mul_im, - Complex.star_def, Complex.conj_re, Complex.conj_im] <;> ring - -end GaugeAlgebra - -/-! - -## D. The root and Cartan directions of the adjoint - -The `su(3)` and `su(2)` blocks each contribute root directions — pairs of standard -basis indices whose coordinate functionals are the real part and minus the imaginary -part of one matrix entry — together with Cartan directions on which the torus acts -trivially; the `u(1)` generator is also fixed. - --/ - -namespace GaugeAlgebra - -/-- The four root directions of the adjoint. -/ -def rootIdx : Fin 4 → (Fin 8 ⊕ Fin 3 ⊕ Fin 1) × (Fin 8 ⊕ Fin 3 ⊕ Fin 1) - | 0 => (Sum.inl 0, Sum.inl 1) - | 1 => (Sum.inl 3, Sum.inl 4) - | 2 => (Sum.inl 5, Sum.inl 6) - | 3 => (Sum.inr (Sum.inl 0), Sum.inr (Sum.inl 1)) - -/-- The gauge weight of each root direction. -/ -def rootWeight : Fin 4 → GaugeWeight - | 0 => (2, -1, 0, 0) - | 1 => (1, 1, 0, 0) - | 2 => (-1, 2, 0, 0) - | 3 => (0, 0, 2, 0) - -/-- The matrix entry scaled by the torus along each root direction. -/ -def rootEntry : Fin 4 → GaugeAlgebra → ℂ - | 0, x => x.toSU3Matrix 0 1 - | 1, x => x.toSU3Matrix 0 2 - | 2, x => x.toSU3Matrix 1 2 - | 3, x => x.toSU2Matrix 0 1 - -/-- The four weight-zero directions: the two `su(3)` Cartan generators, the `su(2)` - Cartan generator and the `u(1)` generator. -/ -def cartanIdx : Fin 4 → (Fin 8 ⊕ Fin 3 ⊕ Fin 1) - | 0 => Sum.inl 2 - | 1 => Sum.inl 7 - | 2 => Sum.inr (Sum.inl 2) - | 3 => Sum.inr (Sum.inr 0) - -lemma coord_rootIdx_fst (r : Fin 4) (x : GaugeAlgebra) : - stdBasis.coord (rootIdx r).1 x = (rootEntry r x).re := by - fin_cases r <;> (rw [stdBasis_coord_apply]; rfl) - -lemma coord_rootIdx_snd (r : Fin 4) (x : GaugeAlgebra) : - stdBasis.coord (rootIdx r).2 x = -(rootEntry r x).im := by - fin_cases r <;> (rw [stdBasis_coord_apply]; rfl) - -lemma rootEntry_adjointMap (r : Fin 4) (i : Fin 4) (x : GaugeAlgebra) : - rootEntry r (adjointMap (gaugeTorusGen i)⁻¹ x) - = star ((expI : ℂ) ^ GaugeWeight.coord (rootWeight r) i) * rootEntry r x := by - fin_cases r - · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 0 1 = _ - rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 0 1] - congr 1 - fin_cases i <;> - simp [torusSU3Diag, rootWeight, GaugeWeight.coord, - expI_inv_eq_star, _root_.zpow_neg, zpow_two, zpow_one] - · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 0 2 = _ - rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 0 2] - congr 1 - fin_cases i <;> - simp [torusSU3Diag, rootWeight, GaugeWeight.coord, - zpow_one] - · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix 1 2 = _ - rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x 1 2] - congr 1 - fin_cases i <;> - simp [torusSU3Diag, rootWeight, GaugeWeight.coord, - expI_inv_eq_star, _root_.zpow_neg, zpow_two, zpow_one] - · show (adjointMap (gaugeTorusGen i)⁻¹ x).toSU2Matrix 0 1 = _ - rw [adjointMap_toSU2Matrix_apply_diagonal (toSU2_inv_gaugeTorusGen i) x 0 1] - congr 1 - fin_cases i <;> - simp [torusSU2Diag, rootWeight, GaugeWeight.coord, - zpow_two] - -lemma dualMap_coord_cartanIdx (c : Fin 4) (i : Fin 4) : - (adjointMap (gaugeTorusGen i)⁻¹).dualMap (stdBasis.coord (cartanIdx c)) - = stdBasis.coord (cartanIdx c) := by - refine LinearMap.ext fun x => ?_ - have h3 : ∀ j : Fin 3, (adjointMap (gaugeTorusGen i)⁻¹ x).toSU3Matrix j j - = x.toSU3Matrix j j := fun j => by - rw [adjointMap_toSU3Matrix_apply_diagonal (toSU3_inv_gaugeTorusGen i) x j j, - torusSU3Diag_mul_star, one_mul] - have h2 : ∀ j : Fin 2, (adjointMap (gaugeTorusGen i)⁻¹ x).toSU2Matrix j j - = x.toSU2Matrix j j := fun j => by - rw [adjointMap_toSU2Matrix_apply_diagonal (toSU2_inv_gaugeTorusGen i) x j j, - torusSU2Diag_mul_star, one_mul] - have h1 : (adjointMap (gaugeTorusGen i)⁻¹ x).toU1Value = x.toU1Value := - adjointMap_toU1Value _ _ - fin_cases c <;> - simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, - gellMannCoeff, pauliCoeff, h3, h2, h1] - -end GaugeAlgebra - /-! ## E. Eigenvectors of the gauge action among the field-strength symbols @@ -490,6 +260,34 @@ noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : GaugeWeightDecomposition.iSup hrepGauge_mul fun ν : Fin 1 ⊕ Fin 3 => h.rangeGaugeWeight l μ ν) _ (by rw [derivSubmodule]) + + +/-- The support of the decomposition of one symbol map: the image of `adjWeight`. -/ +lemma rangeGaugeWeight_supp {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight l μ ν).supp + = Finset.univ.biUnion fun k : Fin 4 ⊕ Fin 4 ⊕ Fin 4 => + ({adjWeight k} : Finset GaugeWeight) := + rfl + +/-- **The gauge weights occurring in the gauge derivative submodules**: the six `su(3)` + roots, the two `su(2)` roots and the zero weight carried by the Cartan and `u(1)` + directions. The weights do not depend on the number of covariant derivatives, and + every one of them has vanishing hypercharge. -/ +lemma derivSubmoduleGaugeWeight_supp (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).supp + = {((2, -1, 0, 0) : GaugeWeight), (1, 1, 0, 0), (-1, 2, 0, 0), (0, 0, 2, 0), + (-2, 1, 0, 0), (-1, -1, 0, 0), (1, -2, 0, 0), (0, 0, -2, 0), (0, 0, 0, 0)} := by + have hstep : (h.derivSubmoduleGaugeWeight n).supp + = Finset.univ.biUnion fun k : Fin 4 ⊕ Fin 4 ⊕ Fin 4 => + ({adjWeight k} : Finset GaugeWeight) := by + show Finset.univ.biUnion (fun l : Fin n → Fin 1 ⊕ Fin 3 => + Finset.univ.biUnion fun μ : Fin 1 ⊕ Fin 3 => + Finset.univ.biUnion fun ν : Fin 1 ⊕ Fin 3 => + (h.rangeGaugeWeight l μ ν).supp) = _ + simp only [rangeGaugeWeight_supp, biUnion_univ_const] + rw [hstep] + decide + end IsGaugeSector diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean similarity index 99% rename from Physlib/Particles/StandardModel/IsGaugeSector/MassWeight.lean rename to Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean index 535a6c37d..a698e6e06 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean @@ -322,7 +322,8 @@ lemma massWeightSubmodule_seven_eq : h.massWeightSubmodule_two_eq, h.massWeightSubmodule_three_eq] -/-- Weight eight is the twice-derived field-strength towers together with the products of two underived ones — the `∇∇F` and `F · F` sectors. -/ +/-- Weight eight is the twice-derived field-strength towers together with the + products of two underived ones — the `∇∇F` and `F · F` sectors. -/ lemma massWeightSubmodule_eight_eq : h.massWeightSubmodule 8 = h.derivSubmodule 2 ⊔ h.derivSubmodule 0 * h.derivSubmodule 0 := by rw [h.massWeightSubmodule_eq 8 (by norm_num)] diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean new file mode 100644 index 000000000..2439f9868 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean @@ -0,0 +1,226 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsGaugeSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition +/-! +# The gauge weight decomposition of the gauge mass-weight submodules + +Each mass-weight submodule of the gauge sector up to weight eight has an explicit +description in terms of the derivative submodules, and the derivative submodules carry +a gauge weight decomposition. Transporting the latter along the former decomposes +every mass-weight submodule up to weight eight: the odd weights and weights two are +trivial, weight four is the underived field strength, weight six the once-derived one, +and weight eight the twice-derived one together with the products of two underived +ones. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups GaugeAlgebra + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +/-- Weight one is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightOne : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 1) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_one_eq + +/-- Weight two is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightTwo : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 2) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_two_eq + +/-- Weight three is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightThree : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 3) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_three_eq + +/-- Weight four is the underived field strength. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightFour : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 4) := + GaugeWeightDecomposition.copy (h.derivSubmoduleGaugeWeight 0) _ + h.massWeightSubmodule_four_eq + +/-- Weight five is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightFive : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 5) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_five_eq + +/-- Weight six is the once-derived field strength. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightSix : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 6) := + GaugeWeightDecomposition.copy (h.derivSubmoduleGaugeWeight 1) _ + h.massWeightSubmodule_six_eq + +/-- Weight seven is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightSeven : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 7) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot hrepGauge_mul) _ + h.massWeightSubmodule_seven_eq + +/-- Weight eight is the twice-derived field strength together with the products of two + underived ones. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightEight : + GaugeWeightDecomposition repGauge (h.massWeightSubmodule 8) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.sup (d := h.derivSubmoduleGaugeWeight 2) + (d' := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 0))) _ + h.massWeightSubmodule_eight_eq + + +/-! + +## The weight-zero pieces + +-/ + +/-- The weight-zero piece of one symbol map's decomposition: the Cartan and `u(1)` + directions, the only ones the torus fixes. -/ +lemma rangeGaugeWeight_piece_zero {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + (h.rangeGaugeWeight l μ ν).piece 0 + = ⨆ c : Fin 4, ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c)) := by + show (⨆ k : Fin 4 ⊕ Fin 4 ⊕ Fin 4, + (if (0 : GaugeWeight) = adjWeight k then ℂ ∙ h.adjVec l μ ν k else ⊥)) = _ + rw [iSup_sum, iSup_sum] + have hr : ∀ r : Fin 4, ¬ ((0 : GaugeWeight) = adjWeight (Sum.inl r)) := by decide + have hs : ∀ r : Fin 4, ¬ ((0 : GaugeWeight) = adjWeight (Sum.inr (Sum.inl r))) := by decide + have hc : ∀ c : Fin 4, ((0 : GaugeWeight) = adjWeight (Sum.inr (Sum.inr c))) := by decide + simp only [hr, if_false, hs, ciSup_const, bot_sup_eq] + rfl + +/-- **The weight-zero piece of the gauge derivative submodules**: the spans of the + field-strength symbols evaluated on the four weight-zero directions of the adjoint — + the two `su(3)` Cartan generators, the `su(2)` Cartan generator and the `u(1)` + generator. The four are distinct, so the join carries no duplicates. -/ +lemma derivSubmoduleGaugeWeight_piece_zero (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece 0 + = ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), + ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c)) := by + show (⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + (h.rangeGaugeWeight l μ ν).piece 0) = _ + exact iSup_congr fun l => iSup_congr fun μ => iSup_congr fun ν => + h.rangeGaugeWeight_piece_zero l μ ν + +/-- The weight-zero piece at mass weight 1: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightOne_piece_zero : + (h.massWeightSubmoduleGaugeWeightOne).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight 2: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightTwo_piece_zero : + (h.massWeightSubmoduleGaugeWeightTwo).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight 3: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightThree_piece_zero : + (h.massWeightSubmoduleGaugeWeightThree).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight 5: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightFive_piece_zero : + (h.massWeightSubmoduleGaugeWeightFive).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight 7: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightSeven_piece_zero : + (h.massWeightSubmoduleGaugeWeightSeven).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight four: the undifferentiated field strength on + the four fixed directions of the adjoint. -/ +lemma massWeightSubmoduleGaugeWeightFour_piece_zero : + (h.massWeightSubmoduleGaugeWeightFour).piece 0 + = ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 4), + ℂ ∙ F ![] μ ν (stdBasis.coord (cartanIdx c)) := by + show (h.derivSubmoduleGaugeWeight 0).piece 0 = _ + rw [h.derivSubmoduleGaugeWeight_piece_zero 0] + exact le_antisymm (iSup_le fun l => by rw [Subsingleton.elim l ![]]) + (le_iSup (fun l : Fin 0 → Fin 1 ⊕ Fin 3 => ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c))) ![]) + +/-- The weight-zero piece at mass weight six: the once-differentiated field strength on + the four fixed directions of the adjoint. -/ +lemma massWeightSubmoduleGaugeWeightSix_piece_zero : + (h.massWeightSubmoduleGaugeWeightSix).piece 0 + = ⨆ (l : Fin 1 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), + ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c)) := + h.derivSubmoduleGaugeWeight_piece_zero 1 + +/-- The weight-zero piece at mass weight eight: the twice-differentiated field strength + on the four fixed directions, joined with the products of two undifferentiated field + strengths whose gauge weights cancel. The nine surviving splittings pair each of the + eight roots with its opposite, and the fixed directions with themselves. -/ +lemma massWeightSubmoduleGaugeWeightEight_piece_zero : + (h.massWeightSubmoduleGaugeWeightEight).piece 0 + = (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), + ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c))) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (2, -1, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (-2, 1, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (1, 1, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (-1, -1, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (-1, 2, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (1, -2, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, 2, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (0, 0, -2, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (-2, 1, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (2, -1, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (-1, -1, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (1, 1, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (1, -2, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (-1, 2, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, -2, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (0, 0, 2, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (0, 0, 0, 0)))))))))) := by + show (h.derivSubmoduleGaugeWeight 2).piece 0 + ⊔ GaugeWeightDecomposition.piece repGauge + (h.derivSubmodule 0 * h.derivSubmodule 0) 0 = _ + rw [h.derivSubmoduleGaugeWeight_piece_zero 2, + GaugeWeightDecomposition.mul_piece_eq_sub 0, h.derivSubmoduleGaugeWeight_supp 0] + simp only [Finset.iSup_insert, Finset.iSup_singleton, + show (0 : GaugeWeight) - (2, -1, 0, 0) = (-2, 1, 0, 0) from by decide, + show (0 : GaugeWeight) - (1, 1, 0, 0) = (-1, -1, 0, 0) from by decide, + show (0 : GaugeWeight) - (-1, 2, 0, 0) = (1, -2, 0, 0) from by decide, + show (0 : GaugeWeight) - (0, 0, 2, 0) = (0, 0, -2, 0) from by decide, + show (0 : GaugeWeight) - (-2, 1, 0, 0) = (2, -1, 0, 0) from by decide, + show (0 : GaugeWeight) - (-1, -1, 0, 0) = (1, 1, 0, 0) from by decide, + show (0 : GaugeWeight) - (1, -2, 0, 0) = (-1, 2, 0, 0) from by decide, + show (0 : GaugeWeight) - (0, 0, -2, 0) = (0, 0, 2, 0) from by decide, + show (0 : GaugeWeight) - (0, 0, 0, 0) = (0, 0, 0, 0) from by decide] + +end IsGaugeSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean similarity index 75% rename from Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean rename to Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean index 37d9e0dab..430f92768 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.Relativity.LightConeDeriv public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition @@ -846,17 +847,6 @@ namespace IsDerivativeCollection variable {W} [AddCommGroup W] [Module ℂ W] {repW : Representation ℂ SL(2,ℂ) W} -/-- **One shape's worth of the rotation law**: every derivative index of `F` is a Lorentz - vector index. This is all the boost-weight development below uses, so it is taken as a - hypothesis; `IsDerivativeCollection.rotatesIndices` supplies it for each partition. -/ -abbrev RotatesIndices (repW : Representation ℂ SL(2,ℂ) W) - (repLorentz : Representation ℂ SL(2,ℂ) B) {n : ℕ} - (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) : Prop := - ∀ (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin 3) (w : W), - repLorentz g (F d w) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), - (∏ (j : Fin n), (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • F a (repW g w) - - /-- The boost-weight decomposition of the symbols carrying no derivatives: with no Lorentz index to rotate, the symbol map transports the decomposition of `W` unchanged. This is the `n = 0` case of `boostDecomp`. -/ @@ -880,532 +870,6 @@ noncomputable def boostDecompZero (F : (Fin 0 → Fin 1 ⊕ Fin 3) → W →ₗ[ exact le_antisymm (le_iSup (fun d => (F d).range) ![]) (iSup_le fun d => le_of_eq (by rw [Subsingleton.elim d ![]])) -/-- The four light-cone directions along the `i`-th axis, written as coefficient vectors on - the coordinate directions: `D₀ - Dᵢ`, `D₀ + Dᵢ`, and the two transverse directions. -/ -def lightConeCoeff (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℂ := - if κ = 0 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then -1 else 0) - else if κ = 1 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then 1 else 0) - else if κ = 2 then (if μ = Sum.inr (i + 1) then 1 else 0) - else (if μ = Sum.inr (i + 2) then 1 else 0) - -/-- The boost weight carried by each light-cone direction: `+2` for `D₀ - Dᵢ`, `-2` for - `D₀ + Dᵢ`, and `0` for the two transverse directions. -/ -def lightConeWeight (κ : Fin 4) : ℤ := if κ = 0 then 2 else if κ = 1 then -2 else 0 - -/-- **The light-cone directions are eigenvectors of the boost.** Along the `i`-th axis - `D₀ - Dᵢ` is scaled by `t²`, `D₀ + Dᵢ` by `t⁻²`, and the two transverse directions are - fixed. -/ -lemma sum_boostAxis_lightConeCoeff (i : Fin 3) (κ : Fin 4) (ν : Fin 1 ⊕ Fin 3) - {t : ℝ} (ht : t ≠ 0) : - ∑ μ : Fin 1 ⊕ Fin 3, - (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 ν μ : ℝ) : ℂ) * lightConeCoeff i κ μ - = ((t : ℝ) : ℂ) ^ (lightConeWeight κ) * lightConeCoeff i κ ν := by - have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - rw [show SL2C.toLorentzGroup (SL2C.boostAxis i t ht) = LorentzGroup.boostAxis i t ht from rfl] - rcases ν with a | j - · rw [Subsingleton.elim a 0] - fin_cases i <;> fin_cases κ - all_goals - simp [lightConeCoeff, lightConeWeight, Fintype.sum_sum_type, - LorentzGroup.boostAxis_apply] - all_goals try field_simp - all_goals try ring - · fin_cases i <;> fin_cases j <;> fin_cases κ - all_goals - simp [lightConeCoeff, lightConeWeight, Fintype.sum_sum_type, - LorentzGroup.boostAxis_apply] - all_goals try field_simp - all_goals try ring - -/-- The coordinate directions written back in the light-cone basis: `D₀` and `Dᵢ` are the - half-sum and half-difference of `D₀ ∓ Dᵢ`, and the transverse directions are themselves. -/ -noncomputable def lightConeCoeffInv (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℂ := - if μ = Sum.inl 0 then (if κ = 0 then 2⁻¹ else if κ = 1 then 2⁻¹ else 0) - else if μ = Sum.inr i then (if κ = 0 then -2⁻¹ else if κ = 1 then 2⁻¹ else 0) - else if μ = Sum.inr (i + 1) then (if κ = 2 then 1 else 0) - else (if κ = 3 then 1 else 0) - -/-- The inverse coefficient toward the first transverse direction vanishes off it. -/ -lemma lightConeCoeffInv_two_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} - (hμ : μ ≠ Sum.inr (i + 1)) : lightConeCoeffInv i μ 2 = 0 := by - simp [lightConeCoeffInv, hμ] - -/-- The inverse coefficient toward the second transverse direction vanishes off it. -/ -lemma lightConeCoeffInv_three_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} - (hμ : μ ≠ Sum.inr (i + 2)) : lightConeCoeffInv i μ 3 = 0 := by - rcases μ with a | m - · rw [Subsingleton.elim a 0] - simp [lightConeCoeffInv] - · fin_cases i <;> fin_cases m <;> simp_all [lightConeCoeffInv] - -/-- The inverse coefficient of the first transverse direction is supported on its own - light-cone index. -/ -lemma lightConeCoeffInv_transverse_one_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} {κ : Fin 4} - (hμ : μ = Sum.inr (i + 1)) (hκ : κ ≠ 2) : lightConeCoeffInv i μ κ = 0 := by - subst hμ - fin_cases i <;> fin_cases κ <;> simp_all [lightConeCoeffInv] - -/-- The light-cone basis is a basis: the two coefficient matrices are inverse. -/ -lemma sum_lightConeCoeffInv_mul (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : - ∑ κ : Fin 4, lightConeCoeffInv i μ κ * lightConeCoeff i κ ν = if μ = ν then 1 else 0 := by - rcases μ with a | j - · rw [Subsingleton.elim a 0] - rcases ν with a' | j' - · rw [Subsingleton.elim a' 0] - fin_cases i <;> - simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] <;> norm_num - · fin_cases i <;> fin_cases j' <;> - simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] - · rcases ν with a' | j' - · rw [Subsingleton.elim a' 0] - fin_cases i <;> fin_cases j <;> - simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] - · fin_cases i <;> fin_cases j <;> fin_cases j' <;> - simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] <;> norm_num - -/-- The scalar behind `lightConeDeriv_mem`: the boost acts on a light-cone multi-index - slot by slot, so the product of the per-slot eigenvalues factors out. -/ -lemma sum_prod_lightConeCoeff (i : Fin 3) {n : ℕ} (c : Fin n → Fin 4) - (a : Fin n → Fin 1 ⊕ Fin 3) {t : ℝ} (ht : t ≠ 0) : - ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * - (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) - = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * ∏ j, lightConeCoeff i (c j) (a j) := by - have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - have hzpow : ∀ (s : Finset (Fin n)) (g : Fin n → ℤ), - ∏ j ∈ s, ((t : ℝ) : ℂ) ^ (g j) = ((t : ℝ) : ℂ) ^ (∑ j ∈ s, g j) := by - intro s g - induction s using Finset.induction with - | empty => simp - | insert a s ha ih => rw [Finset.prod_insert ha, Finset.sum_insert ha, ih, zpow_add₀ htc] - calc ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * - (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) - = ∑ d : Fin n → Fin 1 ⊕ Fin 3, ∏ j, (lightConeCoeff i (c j) (d j) * - (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) := - Finset.sum_congr rfl fun d _ => (Finset.prod_mul_distrib).symm - _ = ∏ j, ∑ μ : Fin 1 ⊕ Fin 3, (lightConeCoeff i (c j) μ * - (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) μ : ℝ) : ℂ)) := by - rw [Finset.prod_univ_sum, Fintype.piFinset_univ] - _ = ∏ j, (((t : ℝ) : ℂ) ^ (lightConeWeight (c j)) * lightConeCoeff i (c j) (a j)) := by - refine Finset.prod_congr rfl fun j _ => ?_ - simp_rw [mul_comm (lightConeCoeff i (c j) _)] - exact sum_boostAxis_lightConeCoeff i (c j) (a j) ht - _ = (∏ j, ((t : ℝ) : ℂ) ^ (lightConeWeight (c j))) * ∏ j, lightConeCoeff i (c j) (a j) := - Finset.prod_mul_distrib - _ = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * ∏ j, lightConeCoeff i (c j) (a j) := by - rw [hzpow] - -/-- **The symbol with its derivative indices in the light-cone basis.** Each slot `j` of the - multi-index carries a light-cone direction `c j` instead of a coordinate direction, so the - symbol is an eigenvector of the boost along the `i`-th axis, of weight - `∑ j, lightConeWeight (c j)`. -/ -noncomputable def lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) - (i : Fin 3) (c : Fin n → Fin 4) : W →ₗ[ℂ] B := - ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • F d - -/-- **A one-slot light-cone symbol**, written out as a combination of coordinate symbols. -/ -lemma lightConeDeriv_single (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) (κ : Fin 4) : - lightConeDeriv F i ![κ] = ∑ μ : Fin 1 ⊕ Fin 3, lightConeCoeff i κ μ • F ![μ] := by - rw [lightConeDeriv] - refine Fintype.sum_equiv (Equiv.funUnique (Fin 1) (Fin 1 ⊕ Fin 3)) _ _ fun d => ?_ - have hd : d = ![d 0] := by - funext j - fin_cases j - rfl - simp only [Fin.prod_univ_one, Matrix.cons_val_zero, Equiv.funUnique_apply, - Fin.default_eq_zero] - rw [← hd] - -/-- The light-cone combination `D₀ - Dᵢ` on one slot. -/ -lemma lightConeDeriv_zero (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![0] = F ![Sum.inl 0] - F ![Sum.inr i] := by - rw [lightConeDeriv_single] - fin_cases i <;> - simp [lightConeCoeff, Fintype.sum_sum_type] <;> module - -/-- The light-cone combination `D₀ + Dᵢ` on one slot. -/ -lemma lightConeDeriv_one (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![1] = F ![Sum.inl 0] + F ![Sum.inr i] := by - rw [lightConeDeriv_single] - fin_cases i <;> - simp [lightConeCoeff, Fintype.sum_sum_type] - -/-- The first transverse direction on one slot. -/ -lemma lightConeDeriv_two (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![2] = F ![Sum.inr (i + 1)] := by - rw [lightConeDeriv_single] - fin_cases i <;> - simp [lightConeCoeff] - -/-- The second transverse direction on one slot. -/ -lemma lightConeDeriv_three (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![3] = F ![Sum.inr (i + 2)] := by - rw [lightConeDeriv_single] - fin_cases i <;> - simp [lightConeCoeff] - -/-- **A two-slot light-cone symbol**, written out as a double sum over coordinate - symbols. -/ -lemma lightConeDeriv_pair (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) - (κ₀ κ₁ : Fin 4) : - lightConeDeriv F i ![κ₀, κ₁] = ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, - (lightConeCoeff i κ₀ μ * lightConeCoeff i κ₁ ν) • F ![μ, ν] := - calc lightConeDeriv F i ![κ₀, κ₁] - = ∑ p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), - (lightConeCoeff i κ₀ p.1 * lightConeCoeff i κ₁ p.2) • F ![p.1, p.2] := by - rw [lightConeDeriv] - refine Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 1 ⊕ Fin 3) _ _ fun d => ?_ - have hd : ![d 0, d 1] = d := by - funext j - fin_cases j <;> rfl - rw [Fin.prod_univ_two] - simp only [piFinTwoEquiv_apply, Matrix.cons_val_zero, Matrix.cons_val_one, hd] - _ = _ := Fintype.sum_prod_type _ - -/-- The `(D₀ - Dᵢ)(D₀ + Dᵢ)` slot pair. -/ -lemma lightConeDeriv_pair_zero_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![0, 1] = F ![Sum.inl 0, Sum.inl 0] + F ![Sum.inl 0, Sum.inr i] - - F ![Sum.inr i, Sum.inl 0] - F ![Sum.inr i, Sum.inr i] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', - ite_smul] - module - -/-- The `(D₀ + Dᵢ)(D₀ - Dᵢ)` slot pair. -/ -lemma lightConeDeriv_pair_one_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![1, 0] = F ![Sum.inl 0, Sum.inl 0] - F ![Sum.inl 0, Sum.inr i] - + F ![Sum.inr i, Sum.inl 0] - F ![Sum.inr i, Sum.inr i] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', - ite_smul, neg_ite] - module - -/-- Both slots on the first transverse direction. -/ -lemma lightConeDeriv_pair_two_two (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![2, 2] = F ![Sum.inr (i + 1), Sum.inr (i + 1)] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff] - -/-- The first then second transverse directions. -/ -lemma lightConeDeriv_pair_two_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![2, 3] = F ![Sum.inr (i + 1), Sum.inr (i + 2)] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff] - -/-- The second then first transverse directions. -/ -lemma lightConeDeriv_pair_three_two (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![3, 2] = F ![Sum.inr (i + 2), Sum.inr (i + 1)] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff] - -/-- Both slots on the second transverse direction. -/ -lemma lightConeDeriv_pair_three_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![3, 3] = F ![Sum.inr (i + 2), Sum.inr (i + 2)] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff] - -/-- The `(D₀ - Dᵢ)(D₀ - Dᵢ)` slot pair. -/ -lemma lightConeDeriv_pair_zero_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![0, 0] = F ![Sum.inl 0, Sum.inl 0] - F ![Sum.inl 0, Sum.inr i] - - F ![Sum.inr i, Sum.inl 0] + F ![Sum.inr i, Sum.inr i] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', - ite_smul, neg_ite] - module - -/-- The `(D₀ + Dᵢ)(D₀ + Dᵢ)` slot pair. -/ -lemma lightConeDeriv_pair_one_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![1, 1] = F ![Sum.inl 0, Sum.inl 0] + F ![Sum.inl 0, Sum.inr i] - + F ![Sum.inr i, Sum.inl 0] + F ![Sum.inr i, Sum.inr i] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', - ite_smul] - module - -/-- The `(D₀ - Dᵢ)` then second transverse slot pair. -/ -lemma lightConeDeriv_pair_zero_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![0, 3] = F ![Sum.inl 0, Sum.inr (i + 2)] - - F ![Sum.inr i, Sum.inr (i + 2)] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_ite_eq', ite_smul] - module - -/-- The second transverse then `(D₀ - Dᵢ)` slot pair. -/ -lemma lightConeDeriv_pair_three_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![3, 0] = F ![Sum.inr (i + 2), Sum.inl 0] - - F ![Sum.inr (i + 2), Sum.inr i] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', - ite_smul, neg_ite] - module - -/-- The `(D₀ + Dᵢ)` then second transverse slot pair. -/ -lemma lightConeDeriv_pair_one_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![1, 3] = F ![Sum.inl 0, Sum.inr (i + 2)] - + F ![Sum.inr i, Sum.inr (i + 2)] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_ite_eq', ite_smul] - -/-- The second transverse then `(D₀ + Dᵢ)` slot pair. -/ -lemma lightConeDeriv_pair_three_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - lightConeDeriv F i ![3, 1] = F ![Sum.inr (i + 2), Sum.inl 0] - + F ![Sum.inr (i + 2), Sum.inr i] := by - rw [lightConeDeriv_pair] - simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', - ite_smul] - -/-- **The two-slot light-cone indices of weight zero**: the two mixed null pairs and the - four transverse pairs. -/ -lemma iSup_range_lightConeDeriv_pair_weight_zero - (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ)), - LinearMap.range (lightConeDeriv F i c)) - = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ - LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ - (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ - LinearMap.range (lightConeDeriv F i ![2, 3]))) ⊔ - (LinearMap.range (lightConeDeriv F i ![3, 2]) ⊔ - LinearMap.range (lightConeDeriv F i ![3, 3])) := by - refine le_antisymm (iSup₂_le fun c hc => ?_) - (sup_le (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) (sup_le ?_ ?_)) - · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := - ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ - rw [Fin.sum_univ_two] at hc - fin_cases κ₀ - · fin_cases κ₁ - · exact absurd hc (by decide) - · exact le_sup_of_le_left (le_sup_of_le_left le_sup_left) - · exact absurd hc (by decide) - · exact absurd hc (by decide) - · fin_cases κ₁ - · exact le_sup_of_le_left (le_sup_of_le_left le_sup_right) - · exact absurd hc (by decide) - · exact absurd hc (by decide) - · exact absurd hc (by decide) - · fin_cases κ₁ - · exact absurd hc (by decide) - · exact absurd hc (by decide) - · exact le_sup_of_le_left (le_sup_of_le_right le_sup_left) - · exact le_sup_of_le_left (le_sup_of_le_right le_sup_right) - · fin_cases κ₁ - · exact absurd hc (by decide) - · exact absurd hc (by decide) - · exact le_sup_of_le_right le_sup_left - · exact le_sup_of_le_right le_sup_right - · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl - · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl - · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl - · exact le_iSup₂_of_le ![2, 3] (by decide) le_rfl - · exact le_iSup₂_of_le ![3, 2] (by decide) le_rfl - · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl - -/-- **The weight-zero light-cone pairs avoiding the mixed transverse indices**: the two - null pairs and the two repeated transverse pairs. -/ -lemma iSup_range_lightConeDeriv_pair_weight_zero_notMixed - (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ) ∧ - ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), - LinearMap.range (lightConeDeriv F i c)) - = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ - LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ - (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ - LinearMap.range (lightConeDeriv F i ![3, 3]))) := by - refine le_antisymm (iSup₂_le fun c hc => ?_) - (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) - · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := - ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ - obtain ⟨hw, h23, h32⟩ := hc - rw [Fin.sum_univ_two] at hw - fin_cases κ₀ - · fin_cases κ₁ - · exact absurd hw (by decide) - · exact le_sup_of_le_left le_sup_left - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · fin_cases κ₁ - · exact le_sup_of_le_left le_sup_right - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · fin_cases κ₁ - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · exact le_sup_of_le_right le_sup_left - · exact absurd (by decide) h23 - · fin_cases κ₁ - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · exact absurd (by decide) h32 - · exact le_sup_of_le_right le_sup_right - · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl - · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl - · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl - · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl - -/-- **The weight-zero light-cone pairs whose slots hit the first transverse direction - together or not at all**: the two null pairs and the two repeated transverse pairs. -/ -lemma iSup_range_lightConeDeriv_pair_weight_zero_sync - (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ) ∧ - ((c 0 = 2) ↔ (c 1 = 2))), - LinearMap.range (lightConeDeriv F i c)) - = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ - LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ - (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ - LinearMap.range (lightConeDeriv F i ![3, 3]))) := by - refine le_antisymm (iSup₂_le fun c hc => ?_) - (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) - · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := - ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ - obtain ⟨hw, hsync⟩ := hc - rw [Fin.sum_univ_two] at hw - fin_cases κ₀ - · fin_cases κ₁ - · exact absurd hw (by decide) - · exact le_sup_of_le_left le_sup_left - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · fin_cases κ₁ - · exact le_sup_of_le_left le_sup_right - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · fin_cases κ₁ - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · exact le_sup_of_le_right le_sup_left - · exact absurd hsync (by decide) - · fin_cases κ₁ - · exact absurd hw (by decide) - · exact absurd hw (by decide) - · exact absurd hsync (by decide) - · exact le_sup_of_le_right le_sup_right - · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl - · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl - · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl - · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl - -/-- **The one-slot light-cone symbols of weight zero** are the two transverse directions: - the join of the weight-zero ranges on a single slot is the join of the ranges of the two - transverse symbols. -/ -lemma iSup_range_lightConeDeriv_single_weight_zero - (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : - (⨆ (c : Fin 1 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ)), - LinearMap.range (lightConeDeriv F i c)) - = LinearMap.range (F ![Sum.inr (i + 1)]) ⊔ LinearMap.range (F ![Sum.inr (i + 2)]) := by - refine le_antisymm (iSup₂_le fun c hc => ?_) (sup_le ?_ ?_) - · obtain ⟨κ, rfl⟩ : ∃ κ, c = ![κ] := ⟨c 0, funext fun j => by fin_cases j; rfl⟩ - rw [Fin.sum_univ_one] at hc - fin_cases κ - · simp [lightConeWeight] at hc - · simp [lightConeWeight] at hc - · exact le_sup_of_le_left (le_of_eq (congrArg LinearMap.range (lightConeDeriv_two F i))) - · exact le_sup_of_le_right (le_of_eq (congrArg LinearMap.range (lightConeDeriv_three F i))) - · exact le_iSup₂_of_le ![2] (by simp [lightConeWeight]) - (le_of_eq (by rw [lightConeDeriv_two])) - · exact le_iSup₂_of_le ![3] (by simp [lightConeWeight]) - (le_of_eq (by rw [lightConeDeriv_three])) - -/-- The scalar behind `f_eq_sum_lightConeDeriv`: the two coefficient matrices are inverse - slot by slot, hence inverse on multi-indices. -/ -lemma sum_prod_lightConeCoeffInv (i : Fin 3) {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) : - ∑ c : Fin n → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * - (∏ j, lightConeCoeff i (c j) (e j)) = if d = e then 1 else 0 := by - calc ∑ c : Fin n → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * - (∏ j, lightConeCoeff i (c j) (e j)) - = ∑ c : Fin n → Fin 4, - ∏ j, (lightConeCoeffInv i (d j) (c j) * lightConeCoeff i (c j) (e j)) := - Finset.sum_congr rfl fun c _ => (Finset.prod_mul_distrib).symm - _ = ∏ j, ∑ κ : Fin 4, (lightConeCoeffInv i (d j) κ * lightConeCoeff i κ (e j)) := by - rw [Finset.prod_univ_sum, Fintype.piFinset_univ] - _ = ∏ j, (if d j = e j then (1 : ℂ) else 0) := - Finset.prod_congr rfl fun j _ => sum_lightConeCoeffInv_mul i (d j) (e j) - _ = if d = e then 1 else 0 := by - by_cases hde : d = e - · subst hde - simp - · rw [if_neg hde] - obtain ⟨j, hj⟩ := Function.ne_iff.1 hde - exact Finset.prod_eq_zero (Finset.mem_univ j) (if_neg hj) - -/-- **The coordinate symbols in the light-cone basis.** The change of basis is invertible, - so the two families span the same submodule. -/ -lemma eq_sum_lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) - (d : Fin n → Fin 1 ⊕ Fin 3) : - F d = ∑ c : Fin n → Fin 4, - (∏ j, lightConeCoeffInv i (d j) (c j)) • lightConeDeriv F i c := by - simp only [lightConeDeriv, Finset.smul_sum, smul_smul] - rw [Finset.sum_comm] - simp only [← Finset.sum_smul, sum_prod_lightConeCoeffInv i d, ite_smul, one_smul, zero_smul, - Finset.sum_ite_eq, Finset.mem_univ, if_true] - -/-- **The light-cone symbols have definite boost weight.** Each derivative slot contributes - the weight of its light-cone direction, on top of the weight the argument carries in - `W`. -/ -lemma lightConeDeriv_mem {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) - (hF : RotatesIndices repW repLorentz F) - (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} {w : W} - (hwm : w ∈ boostWeightSubmodule repW i b) : - lightConeDeriv F i c w ∈ - boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := by - intro t ht - have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - have key : repLorentz (SL2C.boostAxis i t ht) (lightConeDeriv F i c w) - = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) • - lightConeDeriv F i c (repW (SL2C.boostAxis i t ht) w) := by - have hstep : ∀ x : Fin n → Fin 1 ⊕ Fin 3, - (∏ j, lightConeCoeff i (c j) (x j)) • repLorentz (SL2C.boostAxis i t ht) (F x w) - = ∑ a : Fin n → Fin 1 ⊕ Fin 3, - ((∏ j, lightConeCoeff i (c j) (x j)) * - (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (x j) : ℝ) : ℂ))) • - F a (repW (SL2C.boostAxis i t ht) w) := by - intro x - rw [hF, Finset.smul_sum] - exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ - simp only [lightConeDeriv, LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply, - map_sum, map_smul] - rw [Finset.smul_sum] - simp only [hstep] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [← Finset.sum_smul, smul_smul] - congr 1 - exact sum_prod_lightConeCoeff i c a ht - rw [key, hwm t ht, map_smul, smul_smul, - show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, ← zpow_add₀ htc] - -/-- The range of a light-cone symbol over a Lorentz-scalar argument lies in the - boost-weight space of its total slot weight. -/ -lemma range_lightConeDeriv_le {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) - (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) - (i : Fin 3) (c : Fin n → Fin 4) : - LinearMap.range (lightConeDeriv F i c) ≤ - boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by - rintro x ⟨w, rfl⟩ - simpa using lightConeDeriv_mem F hF i c (b := 0) (w := w) - (mem_boostWeightSubmodule.2 fun t ht => by simp) - -/-- The range of a light-cone symbol lies in the join of the coordinate ranges. -/ -lemma range_lightConeDeriv_le_iSup_range {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) - (i : Fin 3) (c : Fin n → Fin 4) : - LinearMap.range (lightConeDeriv F i c) ≤ ⨆ d, LinearMap.range (F d) := by - rintro x ⟨w, rfl⟩ - rw [lightConeDeriv] - simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] - exact sum_mem fun d _ => Submodule.smul_mem _ _ - (Submodule.mem_iSup_of_mem d (LinearMap.mem_range_self _ w)) - -/-- **The value of a two-slot light-cone symbol at `1`**, for a family over `ℂ`. -/ -noncomputable def lightConeDot (F : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) (i : Fin 3) - (c : Fin 2 → Fin 4) : B := - lightConeDeriv F i c (1 : ℂ) - -/-- A light-cone symbol value is a boost eigenvector of its total slot weight. -/ -lemma lightConeDot_mem (F : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) - (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) (i : Fin 3) - (c : Fin 2 → Fin 4) {k : ℤ} (hk : (∑ j, lightConeWeight (c j)) = k) : - lightConeDot F i c ∈ boostWeightSubmodule repLorentz i k := - hk ▸ range_lightConeDeriv_le (n := 2) F hF i c ⟨1, rfl⟩ - /-- **The boost-weight decomposition of the symbols carrying `n` derivatives.** The multi-index is read in the light-cone basis: a slot of type `c j` contributes `lightConeWeight (c j)` — `+2` for `D₀ - Dᵢ`, `-2` for `D₀ + Dᵢ`, `0` for the two @@ -3215,7 +2679,7 @@ noncomputable def quarticSymbol (_ : Fin 0 → Fin 1 ⊕ Fin 3) : ℂ →ₗ[ℂ /-- The quartic symbol rotates trivially: it has no derivative indices and is a Lorentz scalar. -/ lemma rotatesIndices_quarticSymbol : - IsDerivativeCollection.RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz + RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz h.quarticSymbol := fun g d w => by simp only [quarticSymbol, LinearMap.toSpanSingleton_apply, map_smul, Finset.univ_unique, Finset.sum_singleton, Finset.univ_eq_empty, Finset.prod_empty, one_smul, @@ -3326,9 +2790,9 @@ lemma boostWeightZeroSix_piece_zero_eq (i : Fin 3) : (h.boostWeightZeroSix i).piece 0 = (ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 1)] ![] ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2)] ![]) ⊔ (ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i + 1)] ⊔ ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr (i+ 2)]) := by - have h1 := IsDerivativeCollection.iSup_range_lightConeDeriv_single_weight_zero + have h1 := iSup_range_lightConeDeriv_single_weight_zero (h.dotSymbol ![1, 0]) i - have h2 := IsDerivativeCollection.iSup_range_lightConeDeriv_single_weight_zero + have h2 := iSup_range_lightConeDeriv_single_weight_zero (h.dotSymbol ![0, 1]) i simp only [h.range_dotSymbol_left] at h1 simp only [h.range_dotSymbol_right] at h2 @@ -3381,18 +2845,18 @@ lemma boostWeightZeroEight_piece_zero_eq (i : Fin 3) : (ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2)] ![Sum.inr (i + 1)] ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr (i + 2)] ![Sum.inr (i + 2)])) ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by - have h1 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero + have h1 := iSup_range_lightConeDeriv_pair_weight_zero (h.dotSymbol ![2, 0]) i - have h2 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero + have h2 := iSup_range_lightConeDeriv_pair_weight_zero (h.dotSymbol ![0, 2]) i - have h3 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero + have h3 := iSup_range_lightConeDeriv_pair_weight_zero (h.dotSymbol ![1, 1]) i - simp only [IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_two_three, - IsDerivativeCollection.lightConeDeriv_pair_three_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_two_three, + lightConeDeriv_pair_three_two, + lightConeDeriv_pair_three_three, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, Matrix.cons_val_zero, Matrix.cons_val_one, range_toSpanSingleton_add_sub_sub, range_toSpanSingleton_sub_add_sub, @@ -3537,15 +3001,15 @@ lemma dimSixWeightDecompositionLE_piece_zero_eq : `x`-weight-zero part meets a mixed `z`–`x` monomial — together with the square of the inner product at weight zero. -/ noncomputable def dimEightPieceOne (k : ℤ) : Submodule ℂ B := - (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k ∧ + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k ∧ ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), - LinearMap.range (IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c)) ⊔ - (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k ∧ + LinearMap.range (lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c)) ⊔ + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k ∧ ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), - LinearMap.range (IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c)) ⊔ - (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k ∧ + LinearMap.range (lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c)) ⊔ + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k ∧ ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), - LinearMap.range (IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c)) ⊔ + LinearMap.range (lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c)) ⊔ (if k = 0 then ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) else ⊥) /-- Each piece is a boost eigenspace slice of its weight. -/ @@ -3553,11 +3017,11 @@ lemma dimEightPieceOne_le (k : ℤ) : h.dimEightPieceOne k ≤ boostWeightSubmodule repLorentz 1 k := by rw [dimEightPieceOne] refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ - · exact iSup₂_le fun c hc => hc.1 ▸ IsDerivativeCollection.range_lightConeDeriv_le (n := 2) + · exact iSup₂_le fun c hc => hc.1 ▸ range_lightConeDeriv_le (n := 2) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 c - · exact iSup₂_le fun c hc => hc.1 ▸ IsDerivativeCollection.range_lightConeDeriv_le (n := 2) + · exact iSup₂_le fun c hc => hc.1 ▸ range_lightConeDeriv_le (n := 2) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 c - · exact iSup₂_le fun c hc => hc.1 ▸ IsDerivativeCollection.range_lightConeDeriv_le (n := 2) + · exact iSup₂_le fun c hc => hc.1 ▸ range_lightConeDeriv_le (n := 2) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 c · split_ifs with hk · subst hk @@ -3571,7 +3035,7 @@ lemma dimEightPieceOne_le (k : ℤ) : lemma dimEightPieceOne_eq_bot (k : ℤ) (hk : k ∉ ({-4, -2, 0, 2, 4} : Finset ℤ)) : h.dimEightPieceOne k = ⊥ := by have hall : ∀ c : Fin 2 → Fin 4, - (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ∈ ({-4, -2, 0, 2, 4} : Finset ℤ) := by + (∑ j, lightConeWeight (c j)) ∈ ({-4, -2, 0, 2, 4} : Finset ℤ) := by decide simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hk rw [dimEightPieceOne] @@ -3594,18 +3058,18 @@ lemma mem_iSup_dimEightPieceOne_left (d : Fin 2 → Fin 1 ⊕ Fin 3) (h1 : ¬(d 0 = Sum.inr 2 ∧ d 1 = Sum.inr 0)) (h2 : ¬(d 0 = Sum.inr 0 ∧ d 1 = Sum.inr 2)) : h.dotGaugeHiggs d ![] ∈ ⨆ k, h.dimEightPieceOne k := by have he : h.dotGaugeHiggs d ![] = ∑ c : Fin 2 → Fin 4, - (∏ j, IsDerivativeCollection.lightConeCoeffInv 1 (d j) (c j)) • - IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c 1 := + (∏ j, lightConeCoeffInv 1 (d j) (c j)) • + lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c 1 := calc h.dotGaugeHiggs d ![] = h.dotSymbol ![2, 0] d 1 := by rw [h.dotSymbol_left_two, LinearMap.toSpanSingleton_apply, one_smul] _ = _ := by - rw [IsDerivativeCollection.eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 d] + rw [eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 d] simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] rw [he] refine sum_mem fun c _ => ?_ by_cases hc : ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2) · refine Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem - (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ?_) + (∑ j, lightConeWeight (c j)) ?_) rw [dimEightPieceOne] refine Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left ?_)) exact Submodule.mem_iSup_of_mem c (Submodule.mem_iSup_of_mem ⟨rfl, hc⟩ @@ -3613,17 +3077,17 @@ lemma mem_iSup_dimEightPieceOne_left (d : Fin 2 → Fin 1 ⊕ Fin 3) · rw [not_and_or, not_not, not_not] at hc rcases hc with ⟨h20, h13⟩ | ⟨h30, h12⟩ · rcases not_and_or.1 h1 with hd | hd - · rw [Fin.prod_univ_two, h20, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + · rw [Fin.prod_univ_two, h20, lightConeCoeffInv_two_eq_zero (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] exact Submodule.zero_mem _ - · rw [Fin.prod_univ_two, h13, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + · rw [Fin.prod_univ_two, h13, lightConeCoeffInv_three_eq_zero (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] exact Submodule.zero_mem _ · rcases not_and_or.1 h2 with hd | hd - · rw [Fin.prod_univ_two, h30, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + · rw [Fin.prod_univ_two, h30, lightConeCoeffInv_three_eq_zero (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] exact Submodule.zero_mem _ - · rw [Fin.prod_univ_two, h12, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + · rw [Fin.prod_univ_two, h12, lightConeCoeffInv_two_eq_zero (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] exact Submodule.zero_mem _ @@ -3632,18 +3096,18 @@ lemma mem_iSup_dimEightPieceOne_right (d : Fin 2 → Fin 1 ⊕ Fin 3) (h1 : ¬(d 0 = Sum.inr 2 ∧ d 1 = Sum.inr 0)) (h2 : ¬(d 0 = Sum.inr 0 ∧ d 1 = Sum.inr 2)) : h.dotGaugeHiggs ![] d ∈ ⨆ k, h.dimEightPieceOne k := by have he : h.dotGaugeHiggs ![] d = ∑ c : Fin 2 → Fin 4, - (∏ j, IsDerivativeCollection.lightConeCoeffInv 1 (d j) (c j)) • - IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c 1 := + (∏ j, lightConeCoeffInv 1 (d j) (c j)) • + lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c 1 := calc h.dotGaugeHiggs ![] d = h.dotSymbol ![0, 2] d 1 := by rw [h.dotSymbol_right_two, LinearMap.toSpanSingleton_apply, one_smul] _ = _ := by - rw [IsDerivativeCollection.eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 d] + rw [eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 d] simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] rw [he] refine sum_mem fun c _ => ?_ by_cases hc : ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2) · refine Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem - (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ?_) + (∑ j, lightConeWeight (c j)) ?_) rw [dimEightPieceOne] refine Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right ?_)) exact Submodule.mem_iSup_of_mem c (Submodule.mem_iSup_of_mem ⟨rfl, hc⟩ @@ -3651,17 +3115,17 @@ lemma mem_iSup_dimEightPieceOne_right (d : Fin 2 → Fin 1 ⊕ Fin 3) · rw [not_and_or, not_not, not_not] at hc rcases hc with ⟨h20, h13⟩ | ⟨h30, h12⟩ · rcases not_and_or.1 h1 with hd | hd - · rw [Fin.prod_univ_two, h20, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + · rw [Fin.prod_univ_two, h20, lightConeCoeffInv_two_eq_zero (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] exact Submodule.zero_mem _ - · rw [Fin.prod_univ_two, h13, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + · rw [Fin.prod_univ_two, h13, lightConeCoeffInv_three_eq_zero (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] exact Submodule.zero_mem _ · rcases not_and_or.1 h2 with hd | hd - · rw [Fin.prod_univ_two, h30, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + · rw [Fin.prod_univ_two, h30, lightConeCoeffInv_three_eq_zero (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] exact Submodule.zero_mem _ - · rw [Fin.prod_univ_two, h12, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + · rw [Fin.prod_univ_two, h12, lightConeCoeffInv_two_eq_zero (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] exact Submodule.zero_mem _ @@ -3670,18 +3134,18 @@ lemma mem_iSup_dimEightPieceOne_mixed (d : Fin 2 → Fin 1 ⊕ Fin 3) (h1 : ¬(d 0 = Sum.inr 2 ∧ d 1 = Sum.inr 0)) (h2 : ¬(d 0 = Sum.inr 0 ∧ d 1 = Sum.inr 2)) : h.dotGaugeHiggs ![d 0] ![d 1] ∈ ⨆ k, h.dimEightPieceOne k := by have he : h.dotGaugeHiggs ![d 0] ![d 1] = ∑ c : Fin 2 → Fin 4, - (∏ j, IsDerivativeCollection.lightConeCoeffInv 1 (d j) (c j)) • - IsDerivativeCollection.lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c 1 := + (∏ j, lightConeCoeffInv 1 (d j) (c j)) • + lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c 1 := calc h.dotGaugeHiggs ![d 0] ![d 1] = h.dotSymbol ![1, 1] d 1 := by rw [h.dotSymbol_one_one, LinearMap.toSpanSingleton_apply, one_smul] _ = _ := by - rw [IsDerivativeCollection.eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 d] + rw [eq_sum_lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 d] simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] rw [he] refine sum_mem fun c _ => ?_ by_cases hc : ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2) · refine Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem - (∑ j, IsDerivativeCollection.lightConeWeight (c j)) ?_) + (∑ j, lightConeWeight (c j)) ?_) rw [dimEightPieceOne] refine Submodule.mem_sup_left (Submodule.mem_sup_right ?_) exact Submodule.mem_iSup_of_mem c (Submodule.mem_iSup_of_mem ⟨rfl, hc⟩ @@ -3689,17 +3153,17 @@ lemma mem_iSup_dimEightPieceOne_mixed (d : Fin 2 → Fin 1 ⊕ Fin 3) · rw [not_and_or, not_not, not_not] at hc rcases hc with ⟨h20, h13⟩ | ⟨h30, h12⟩ · rcases not_and_or.1 h1 with hd | hd - · rw [Fin.prod_univ_two, h20, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + · rw [Fin.prod_univ_two, h20, lightConeCoeffInv_two_eq_zero (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] exact Submodule.zero_mem _ - · rw [Fin.prod_univ_two, h13, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + · rw [Fin.prod_univ_two, h13, lightConeCoeffInv_three_eq_zero (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] exact Submodule.zero_mem _ · rcases not_and_or.1 h2 with hd | hd - · rw [Fin.prod_univ_two, h30, IsDerivativeCollection.lightConeCoeffInv_three_eq_zero + · rw [Fin.prod_univ_two, h30, lightConeCoeffInv_three_eq_zero (μ := d 0) 1 (by simpa using hd), zero_mul, zero_smul] exact Submodule.zero_mem _ - · rw [Fin.prod_univ_two, h12, IsDerivativeCollection.lightConeCoeffInv_two_eq_zero + · rw [Fin.prod_univ_two, h12, lightConeCoeffInv_two_eq_zero (μ := d 1) 1 (by simpa using hd), mul_zero, zero_smul] exact Submodule.zero_mem _ @@ -3709,15 +3173,15 @@ lemma dimEightPieceOne_le_gaugeInvariant (k : ℤ) : rw [← h.iSup_range_dotSymbol_eight_eq, dimEightPieceOne] refine sup_le (sup_le (sup_le ?_ ?_) ?_) ?_ · exact iSup₂_le fun c _ => - (IsDerivativeCollection.range_lightConeDeriv_le_iSup_range (n := 2) + (range_lightConeDeriv_le_iSup_range (n := 2) (h.dotSymbol ![2, 0]) 1 c).trans (le_sup_of_le_left (le_sup_of_le_left le_sup_left)) · exact iSup₂_le fun c _ => - (IsDerivativeCollection.range_lightConeDeriv_le_iSup_range (n := 2) + (range_lightConeDeriv_le_iSup_range (n := 2) (h.dotSymbol ![0, 2]) 1 c).trans (le_sup_of_le_left (le_sup_of_le_left le_sup_right)) · exact iSup₂_le fun c _ => - (IsDerivativeCollection.range_lightConeDeriv_le_iSup_range (n := 2) + (range_lightConeDeriv_le_iSup_range (n := 2) (h.dotSymbol ![1, 1]) 1 c).trans (le_sup_of_le_left le_sup_right) · split_ifs with hk @@ -3831,16 +3295,16 @@ lemma dimEightWeightDecompositionLE_piece_zero_eq : (ℂ ∙ h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2] ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0]))) ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by - have h1 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero_notMixed + have h1 := iSup_range_lightConeDeriv_pair_weight_zero_notMixed (h.dotSymbol ![2, 0]) 1 - have h2 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero_notMixed + have h2 := iSup_range_lightConeDeriv_pair_weight_zero_notMixed (h.dotSymbol ![0, 2]) 1 - have h3 := IsDerivativeCollection.iSup_range_lightConeDeriv_pair_weight_zero_notMixed + have h3 := iSup_range_lightConeDeriv_pair_weight_zero_notMixed (h.dotSymbol ![1, 1]) 1 - simp only [IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, Matrix.cons_val_zero, Matrix.cons_val_one, @@ -3948,45 +3412,45 @@ noncomputable def dimSixWeightDecompositionLELE : monomials and the square of the inner product. -/ noncomputable def dimEightPieceTwo (k : ℤ) : Submodule ℂ B := if k = 4 then - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] ⊔ - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] ⊔ - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] + ℂ ∙ lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] ⊔ + ℂ ∙ lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] ⊔ + ℂ ∙ lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] else if k = 2 then - ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) ⊔ - ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) ⊔ - ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) + ℂ ∙ (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) ⊔ + ℂ ∙ (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) ⊔ + ℂ ∙ (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) else if k = 0 then - ((ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) ⊔ - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] ⊔ ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2]) ⊔ - (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) ⊔ - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] ⊔ ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2]) ⊔ - (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) ⊔ - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] ⊔ ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2])) ⊔ + ((ℂ ∙ (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) ⊔ + ℂ ∙ lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] ⊔ ℂ ∙ lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2]) ⊔ + (ℂ ∙ (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) ⊔ + ℂ ∙ lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] ⊔ ℂ ∙ lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2]) ⊔ + (ℂ ∙ (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) ⊔ + ℂ ∙ lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] ⊔ ℂ ∙ lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2])) ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) else if k = -2 then - ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) ⊔ - ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) ⊔ - ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) + ℂ ∙ (lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) ⊔ + ℂ ∙ (lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) ⊔ + ℂ ∙ (lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) else if k = -4 then - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] ⊔ - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] ⊔ - ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] + ℂ ∙ lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] ⊔ + ℂ ∙ lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] ⊔ + ℂ ∙ lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] else ⊥ /-- Each piece is a boost eigenspace slice of its weight. -/ lemma dimEightPieceTwo_le (k : ℤ) : h.dimEightPieceTwo k ≤ boostWeightSubmodule repLorentz 2 k := by have hL := fun (c : Fin 2 → Fin 4) (k : ℤ) - (hk : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k) => - IsDerivativeCollection.lightConeDot_mem (h.dotSymbol ![2, 0]) + (hk : (∑ j, lightConeWeight (c j)) = k) => + lightConeDot_mem (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 c hk have hR := fun (c : Fin 2 → Fin 4) (k : ℤ) - (hk : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k) => - IsDerivativeCollection.lightConeDot_mem (h.dotSymbol ![0, 2]) + (hk : (∑ j, lightConeWeight (c j)) = k) => + lightConeDot_mem (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 c hk have hM := fun (c : Fin 2 → Fin 4) (k : ℤ) - (hk : (∑ j, IsDerivativeCollection.lightConeWeight (c j)) = k) => - IsDerivativeCollection.lightConeDot_mem (h.dotSymbol ![1, 1]) + (hk : (∑ j, lightConeWeight (c j)) = k) => + lightConeDot_mem (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 c hk rw [dimEightPieceTwo] split_ifs with h4 h2 h0 hm2 hm4 @@ -4047,92 +3511,92 @@ noncomputable def dimEightWeightDecompositionLELE : piece_le := h.dimEightPieceTwo_le piece_eq_bot := h.dimEightPieceTwo_eq_bot iSup_piece := by - have hL00 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hL00 : lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 4 ?_ rw [dimEightPieceTwo, if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) - have hL03 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hL03 : lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 2 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) - have hL01 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hL01 : lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _))))) - have hL33 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hL33 : lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))))) - have hL22 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hL22 : lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) - have hL13 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hL13 : lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem (-2) ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) - have hL11 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hL11 : lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem (-4) ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) - have hR00 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hR00 : lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 4 ?_ rw [dimEightPieceTwo, if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) - have hR03 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hR03 : lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 2 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) - have hR01 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hR01 : lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _))))) - have hR33 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hR33 : lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))))) - have hR22 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hR22 : lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) - have hR13 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hR13 : lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem (-2) ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) - have hR11 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hR11 : lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem (-4) ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) - have hM00 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hM00 : lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 4 ?_ rw [dimEightPieceTwo, if_pos rfl] exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - have hM03 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hM03 : lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 2 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - have hM01 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hM01 : lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)))) - have hM33 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hM33 : lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)))) - have hM22 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hM22 : lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem 0 ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) - have hM13 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hM13 : lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem (-2) ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos rfl] exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - have hM11 : IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by + have hM11 : lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] ∈ ⨆ k, h.dimEightPieceTwo k := by refine Submodule.mem_iSup_of_mem (-4) ?_ rw [dimEightPieceTwo, if_neg (by decide), if_neg (by decide), if_neg (by decide), if_neg (by decide), if_pos rfl] @@ -4145,22 +3609,22 @@ noncomputable def dimEightWeightDecompositionLELE : + h.dotGaugeHiggs ![Sum.inl 0, Sum.inr 1] ![] - h.dotGaugeHiggs ![Sum.inr 1, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] - + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) - + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) - - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] - + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + + (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] + + (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4175,22 +3639,22 @@ noncomputable def dimEightWeightDecompositionLELE : - h.dotGaugeHiggs ![Sum.inl 0, Sum.inr 1] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] - - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) - + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) - - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] - - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + - (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] + - (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4202,18 +3666,18 @@ noncomputable def dimEightWeightDecompositionLELE : (Submodule.smul_mem _ _ hL01)) hL33) (Submodule.smul_mem _ _ hL13)) (Submodule.smul_mem _ _ hL11) · rw [show h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] - (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] - (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4222,17 +3686,17 @@ noncomputable def dimEightWeightDecompositionLELE : module] exact add_mem (sub_mem (Submodule.smul_mem _ _ hL00) (Submodule.smul_mem _ _ hL01)) (Submodule.smul_mem _ _ hL11) - · rw [show h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] = IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + · rw [show h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] = lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4245,22 +3709,22 @@ noncomputable def dimEightWeightDecompositionLELE : + h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr 1] - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] - + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) - + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) - - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] - + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + + (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] + + (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4275,22 +3739,22 @@ noncomputable def dimEightWeightDecompositionLELE : - h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inr 1] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] - - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) - + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) - - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] - - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + - (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] + - (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4302,18 +3766,18 @@ noncomputable def dimEightWeightDecompositionLELE : (Submodule.smul_mem _ _ hR01)) hR33) (Submodule.smul_mem _ _ hR13)) (Submodule.smul_mem _ _ hR11) · rw [show h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] - (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] - (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4322,17 +3786,17 @@ noncomputable def dimEightWeightDecompositionLELE : module] exact add_mem (sub_mem (Submodule.smul_mem _ _ hR00) (Submodule.smul_mem _ _ hR01)) (Submodule.smul_mem _ _ hR11) - · rw [show h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] = IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + · rw [show h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] = lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4345,22 +3809,22 @@ noncomputable def dimEightWeightDecompositionLELE : + h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr 1] - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] - + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) - + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) - - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] - + (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] + + (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] + + (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4375,22 +3839,22 @@ noncomputable def dimEightWeightDecompositionLELE : - h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inr 1] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] - - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) - + (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) - - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] - - (2⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] + - (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 0]) + + (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] + - (2⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 3] - lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 1]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4402,18 +3866,18 @@ noncomputable def dimEightWeightDecompositionLELE : (Submodule.smul_mem _ _ hM01)) hM33) (Submodule.smul_mem _ _ hM13)) (Submodule.smul_mem _ _ hM11) · rw [show h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2] - = (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] - (4⁻¹ : ℂ) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) - + (4⁻¹ : ℂ) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0] - (4⁻¹ : ℂ) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + + (4⁻¹ : ℂ) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4422,17 +3886,17 @@ noncomputable def dimEightWeightDecompositionLELE : module] exact add_mem (sub_mem (Submodule.smul_mem _ _ hM00) (Submodule.smul_mem _ _ hM01)) (Submodule.smul_mem _ _ hM11) - · rw [show h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] = IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + · rw [show h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] = lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4457,20 +3921,20 @@ lemma dimEightWeightDecompositionLELE_piece_zero_eq : (ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] ⊔ ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0])) ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by - have hL1 : (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0])) + have hL1 : (ℂ ∙ (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0])) = ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0] + rw [show lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0] = (2 : ℂ) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] - h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4478,54 +3942,54 @@ lemma dimEightWeightDecompositionLELE_piece_zero_eq : LinearMap.toSpanSingleton_apply, one_smul] module] exact Submodule.span_singleton_smul_eq (by norm_num : (2 : ℂ) ≠ 0).isUnit _ - have hL2 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] = h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + have hL2 : (ℂ ∙ lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] := by + rw [show lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3] = h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, Matrix.cons_val_zero, Matrix.cons_val_one, LinearMap.toSpanSingleton_apply, one_smul]] - have hL3 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] = h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + have hL3 : (ℂ ∙ lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] := by + rw [show lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] = h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, Matrix.cons_val_zero, Matrix.cons_val_one, LinearMap.toSpanSingleton_apply, one_smul]] - have hR1 : (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0])) + have hR1 : (ℂ ∙ (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0])) = ℂ ∙ (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0] + rw [show lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0] = (2 : ℂ) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] - h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4533,54 +3997,54 @@ lemma dimEightWeightDecompositionLELE_piece_zero_eq : LinearMap.toSpanSingleton_apply, one_smul] module] exact Submodule.span_singleton_smul_eq (by norm_num : (2 : ℂ) ≠ 0).isUnit _ - have hR2 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] = h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + have hR2 : (ℂ ∙ lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] := by + rw [show lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3] = h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, Matrix.cons_val_zero, Matrix.cons_val_one, LinearMap.toSpanSingleton_apply, one_smul]] - have hR3 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] = h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + have hR3 : (ℂ ∙ lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] := by + rw [show lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] = h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, Matrix.cons_val_zero, Matrix.cons_val_one, LinearMap.toSpanSingleton_apply, one_smul]] - have hM1 : (ℂ ∙ (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0])) + have hM1 : (ℂ ∙ (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0])) = ℂ ∙ (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0] + rw [show lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0] = (2 : ℂ) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4588,35 +4052,35 @@ lemma dimEightWeightDecompositionLELE_piece_zero_eq : LinearMap.toSpanSingleton_apply, one_smul] module] exact Submodule.span_singleton_smul_eq (by norm_num : (2 : ℂ) ≠ 0).isUnit _ - have hM2 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] = h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + have hM2 : (ℂ ∙ lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] := by + rw [show lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3] = h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, Matrix.cons_val_zero, Matrix.cons_val_one, LinearMap.toSpanSingleton_apply, one_smul]] - have hM3 : (ℂ ∙ IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] := by - rw [show IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] = h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] from by - simp only [IsDerivativeCollection.lightConeDot, IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_three, - IsDerivativeCollection.lightConeDeriv_pair_three_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_three, - IsDerivativeCollection.lightConeDeriv_pair_three_one, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + have hM3 : (ℂ ∙ lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2]) = ℂ ∙ h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] := by + rw [show lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] = h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] from by + simp only [lightConeDot, lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_three, + lightConeDeriv_pair_three_zero, + lightConeDeriv_pair_one_three, + lightConeDeriv_pair_three_one, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4812,25 +4276,25 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) (aM • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] - h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1]) + bM • h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0] + cM • h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2]) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]))) from by module, ← e0, ← e1, ← e2] module - have hsplit0 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 0] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 0] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 1] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 1] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 1])) + - ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 0]) - + ((bL + cL - aL) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![3, 3])) + - (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 0]) - + ((bR + cR - aR) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![3, 3])) + - (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 0]) - + ((bM + cM - aM) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by + have hsplit0 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 0] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 0] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 1] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 1] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 1])) + + ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 0]) + + ((bL + cL - aL) / 3) • (lightConeDot (h.dotSymbol ![2, 0]) 0 ![2, 2] + lightConeDot (h.dotSymbol ![2, 0]) 0 ![3, 3])) + + (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 0]) + + ((bR + cR - aR) / 3) • (lightConeDot (h.dotSymbol ![0, 2]) 0 ![2, 2] + lightConeDot (h.dotSymbol ![0, 2]) 0 ![3, 3])) + + (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 0]) + + ((bM + cM - aM) / 3) • (lightConeDot (h.dotSymbol ![1, 1]) 0 ![2, 2] + lightConeDot (h.dotSymbol ![1, 1]) 0 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by rw [ekform] - simp only [IsDerivativeCollection.lightConeDot, - IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDot, + lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((0 : Fin 3) + 1) = 1 from rfl, show ((0 : Fin 3) + 2) = 2 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4840,49 +4304,49 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) have hcomp0 := eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule (a := 4) (b := -4) (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem - (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![0, 0] (by decide))) - (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![0, 0] (by decide)))) - (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![0, 0] (by decide))))) (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem - (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![1, 1] (by decide))) - (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![1, 1] (by decide)))) - (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![1, 1] (by decide))))) (add_mem (add_mem (add_mem (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bL + cL - aL) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![3, 3] (by decide))))) (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bR + cR - aR) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![3, 3] (by decide)))))) (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bM + cM - aM) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![3, 3] (by decide)))))) (Submodule.smul_mem _ q (mem_boostWeightSubmodule.2 fun t ht => by rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] @@ -4894,18 +4358,18 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) rw [show (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 0, Sum.inr 0] ![]) + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 0, Sum.inr 0]) + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 0] ![Sum.inr 0])) - = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 0] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 0] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 1] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 1] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 1]))) from by - simp only [IsDerivativeCollection.lightConeDot, - IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 0 ![0, 0] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 0 ![0, 0] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 0 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 0 ![1, 1] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 0 ![1, 1] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 0 ![1, 1]))) from by + simp only [lightConeDot, + lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((0 : Fin 3) + 1) = 1 from rfl, show ((0 : Fin 3) + 2) = 2 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4914,25 +4378,25 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) module] rw [hcomp0.1, hcomp0.2] simp - have hsplit1 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 0] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 0] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 1] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 1] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 1])) + - ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 0]) - + ((bL + cL - aL) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![3, 3])) + - (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 0]) - + ((bR + cR - aR) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![3, 3])) + - (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 0]) - + ((bM + cM - aM) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by + have hsplit1 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 0] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 0] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 1] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 1] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 1])) + + ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 0]) + + ((bL + cL - aL) / 3) • (lightConeDot (h.dotSymbol ![2, 0]) 1 ![2, 2] + lightConeDot (h.dotSymbol ![2, 0]) 1 ![3, 3])) + + (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 0]) + + ((bR + cR - aR) / 3) • (lightConeDot (h.dotSymbol ![0, 2]) 1 ![2, 2] + lightConeDot (h.dotSymbol ![0, 2]) 1 ![3, 3])) + + (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 0]) + + ((bM + cM - aM) / 3) • (lightConeDot (h.dotSymbol ![1, 1]) 1 ![2, 2] + lightConeDot (h.dotSymbol ![1, 1]) 1 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by rw [ekform] - simp only [IsDerivativeCollection.lightConeDot, - IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDot, + lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -4942,49 +4406,49 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) have hcomp1 := eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule (a := 4) (b := -4) (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem - (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![0, 0] (by decide))) - (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![0, 0] (by decide)))) - (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![0, 0] (by decide))))) (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem - (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![1, 1] (by decide))) - (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![1, 1] (by decide)))) - (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![1, 1] (by decide))))) (add_mem (add_mem (add_mem (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bL + cL - aL) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![3, 3] (by decide))))) (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bR + cR - aR) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![3, 3] (by decide)))))) (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bM + cM - aM) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![3, 3] (by decide)))))) (Submodule.smul_mem _ q (mem_boostWeightSubmodule.2 fun t ht => by rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] @@ -4996,18 +4460,18 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) rw [show (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 1, Sum.inr 1] ![]) + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 1, Sum.inr 1]) + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 1] ![Sum.inr 1])) - = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 0] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 0] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 1] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 1] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 1]))) from by - simp only [IsDerivativeCollection.lightConeDot, - IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 1 ![0, 0] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 1 ![0, 0] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 1 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 1 ![1, 1] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 1 ![1, 1] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 1 ![1, 1]))) from by + simp only [lightConeDot, + lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -5016,25 +4480,25 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) module] rw [hcomp1.1, hcomp1.2] simp - have hsplit2 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1])) + - ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) - + ((bL + cL - aL) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3])) + - (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) - + ((bR + cR - aR) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3])) + - (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) - + ((bM + cM - aM) / 3) • (IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] + IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by + have hsplit2 : x = ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1])) + + ((((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 0]) + + ((bL + cL - aL) / 3) • (lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] + lightConeDot (h.dotSymbol ![2, 0]) 2 ![3, 3])) + + (((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 0]) + + ((bR + cR - aR) / 3) • (lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] + lightConeDot (h.dotSymbol ![0, 2]) 2 ![3, 3])) + + (((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 1] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 0]) + + ((bM + cM - aM) / 3) • (lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] + lightConeDot (h.dotSymbol ![1, 1]) 2 ![3, 3])) + q • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![])) := by rw [ekform] - simp only [IsDerivativeCollection.lightConeDot, - IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + simp only [lightConeDot, + lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, @@ -5044,49 +4508,49 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) have hcomp2 := eq_zero_and_eq_zero_of_add_add_mem_boostWeightSubmodule (a := 4) (b := -4) (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem - (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![0, 0] (by decide))) - (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![0, 0] (by decide)))) - (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (lightConeDot_mem (k := 4) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![0, 0] (by decide))))) (Submodule.smul_mem _ (4⁻¹ : ℂ) (add_mem (add_mem - (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) + (Submodule.smul_mem _ ((2 * aL + bL + cL) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![1, 1] (by decide))) - (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) + (Submodule.smul_mem _ ((2 * aR + bR + cR) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![1, 1] (by decide)))) - (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (IsDerivativeCollection.lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) + (Submodule.smul_mem _ ((2 * aM + bM + cM) / 3) (lightConeDot_mem (k := -4) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![1, 1] (by decide))))) (add_mem (add_mem (add_mem (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aL - ((bL + cL - aL) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bL + cL - aL) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![3, 3] (by decide))))) (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aR - ((bR + cR - aR) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bR + cR - aR) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![3, 3] (by decide)))))) (add_mem (Submodule.smul_mem _ ((4⁻¹ : ℂ) * (aM - ((bM + cM - aM) / 3))) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![0, 1] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![1, 0] (by decide)))) (Submodule.smul_mem _ ((bM + cM - aM) / 3) (add_mem - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![2, 2] (by decide)) - (IsDerivativeCollection.lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) + (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![3, 3] (by decide)))))) (Submodule.smul_mem _ q (mem_boostWeightSubmodule.2 fun t ht => by rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_nil] @@ -5098,18 +4562,18 @@ theorem mem_span_metric_of_invariant (x : B) (hx : ∀ g, rep g x = x) rw [show (((2 * aL + bL + cL) / 3) • (h.dotGaugeHiggs ![Sum.inl 0, Sum.inl 0] ![] + h.dotGaugeHiggs ![Sum.inr 2, Sum.inr 2] ![]) + ((2 * aR + bR + cR) / 3) • (h.dotGaugeHiggs ![] ![Sum.inl 0, Sum.inl 0] + h.dotGaugeHiggs ![] ![Sum.inr 2, Sum.inr 2]) + ((2 * aM + bM + cM) / 3) • (h.dotGaugeHiggs ![Sum.inl 0] ![Sum.inl 0] + h.dotGaugeHiggs ![Sum.inr 2] ![Sum.inr 2])) - = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] + - ((2 * aR + bR + cR) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] + - ((2 * aM + bM + cM) / 3) • IsDerivativeCollection.lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1]))) from by - simp only [IsDerivativeCollection.lightConeDot, - IsDerivativeCollection.lightConeDeriv_pair_zero_zero, - IsDerivativeCollection.lightConeDeriv_pair_one_one, - IsDerivativeCollection.lightConeDeriv_pair_zero_one, - IsDerivativeCollection.lightConeDeriv_pair_one_zero, - IsDerivativeCollection.lightConeDeriv_pair_two_two, - IsDerivativeCollection.lightConeDeriv_pair_three_three, + = (2 : ℂ) • (((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![0, 0] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![0, 0] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![0, 0])) + ((4⁻¹ : ℂ) • (((2 * aL + bL + cL) / 3) • lightConeDot (h.dotSymbol ![2, 0]) 2 ![1, 1] + + ((2 * aR + bR + cR) / 3) • lightConeDot (h.dotSymbol ![0, 2]) 2 ![1, 1] + + ((2 * aM + bM + cM) / 3) • lightConeDot (h.dotSymbol ![1, 1]) 2 ![1, 1]))) from by + simp only [lightConeDot, + lightConeDeriv_pair_zero_zero, + lightConeDeriv_pair_one_one, + lightConeDeriv_pair_zero_one, + lightConeDeriv_pair_one_zero, + lightConeDeriv_pair_two_two, + lightConeDeriv_pair_three_three, show ((2 : Fin 3) + 1) = 0 from rfl, show ((2 : Fin 3) + 2) = 1 from rfl, LinearMap.add_apply, LinearMap.sub_apply, h.dotSymbol_left_two, h.dotSymbol_right_two, h.dotSymbol_one_one, diff --git a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/DerivSubmodule.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean similarity index 95% rename from Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/DerivSubmodule.lean rename to Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean index 3a8bead01..3376ab5a3 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/AlgebraValued/DerivSubmodule.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.Basic /-! # The derivative submodules of the Higgs sector @@ -194,6 +194,13 @@ noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : (d' := h.barHiggsSubmoduleGaugeWeight n)) _ (by rw [derivSubmodule]) +/-- The gauge weights occurring in the Higgs derivative submodules: the two Higgs + weights `(0, 0, ∓1, -3)` and the two conjugate-Higgs weights `(0, 0, ±1, 3)`. -/ +lemma derivSubmoduleGaugeWeight_supp (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).supp + = {((0, 0, -1, -3) : GaugeWeight), (0, 0, 1, -3), (0, 0, 1, 3), (0, 0, -1, 3)} := + rfl + end IsHiggsSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean new file mode 100644 index 000000000..0fe8e8dfd --- /dev/null +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +/-! +# The mass-weight grading of the Higgs sector, in derivative submodules + +The mass-weight submodules of the Higgs sector are described in +`IsHiggsSector.Basic` in terms of the Higgs and conjugate-Higgs submodules +separately. Since the two always occur together, the description is cleaner in terms +of the derivative submodules `derivSubmodule n = higgsSubmodule n ⊔ barHiggsSubmodule n`: +a Higgs tower with `n` derivatives has weight `2 * (1 + n)`, only even weights are +non-zero, and the weights up to eight are the partitions of the weight into such +towers. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace IsHiggsSector + +set_option linter.unusedVariables false + +variable {B : Type} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} + {hrep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) + +/-- The derivative submodule sits in the mass-weight submodule of weight `2 * (1 + n)`. -/ +lemma derivSubmodule_le_massWeightSubmodule (n : ℕ) : + h.derivSubmodule n ≤ h.massWeightSubmodule (2 * (1 + n)) := + sup_le (h.massWeightSubmodule_higgsSubmodule_le n) + (h.massWeightSubmodule_barHiggsSubmodule_le n) + +/-- The weight recursion, with the single-symbol part written as a derivative + submodule. -/ +lemma massWeightSubmodule_eq_derivSubmodule (i : ℕ) (hi : 0 < i) : + h.massWeightSubmodule i + = (⨆ k ∈ Finset.univ.filter (fun k : Fin i => 2 * (1 + (k : ℕ)) = i), + h.derivSubmodule (k : ℕ)) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin i × Fin i => (p.1 : ℕ) + (p.2 : ℕ) = i), + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := + h.massWeightSubmodule_eq i hi + +/-- Weight two is the underived Higgs symbols. -/ +lemma massWeightSubmodule_two_eq_deriv : + h.massWeightSubmodule 2 = h.derivSubmodule 0 := + h.massWeightSubmodule_two_eq + +/-- Weight four. -/ +lemma massWeightSubmodule_four_eq_deriv : + h.massWeightSubmodule 4 + = h.derivSubmodule 1 ⊔ h.derivSubmodule 0 * h.derivSubmodule 0 := by + rw [h.massWeightSubmodule_four_eq] + simp only [derivSubmodule, Submodule.sup_mul, Submodule.mul_sup, + h.barHiggsSubmodule_comm_higgsSubmodule 0 0] + simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] + +/-- Higgs and conjugate-Higgs submodules commute past a third factor. -/ +lemma barHiggs_higgs_left_comm (n1 n2 : ℕ) (C : Submodule ℂ B) : + h.barHiggsSubmodule n1 * (h.higgsSubmodule n2 * C) + = h.higgsSubmodule n2 * (h.barHiggsSubmodule n1 * C) := + Commute.left_comm (h.barHiggsSubmodule_comm_higgsSubmodule n1 n2) C + +set_option maxHeartbeats 2000000 in +/-- Weight six. -/ +lemma massWeightSubmodule_six_eq_deriv : + h.massWeightSubmodule 6 + = h.derivSubmodule 2 ⊔ h.derivSubmodule 1 * h.derivSubmodule 0 + ⊔ h.derivSubmodule 0 * h.derivSubmodule 0 * h.derivSubmodule 0 := by + rw [h.massWeightSubmodule_six_eq] + simp only [derivSubmodule, Submodule.sup_mul, Submodule.mul_sup, + barHiggsSubmodule_comm_higgsSubmodule, mul_assoc, h.barHiggs_higgs_left_comm] + simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] + +set_option maxHeartbeats 4000000 in +/-- Weight eight. -/ +lemma massWeightSubmodule_eight_eq_deriv : + h.massWeightSubmodule 8 + = h.derivSubmodule 3 ⊔ h.derivSubmodule 2 * h.derivSubmodule 0 + ⊔ h.derivSubmodule 1 * h.derivSubmodule 1 + ⊔ h.derivSubmodule 1 * h.derivSubmodule 0 * h.derivSubmodule 0 + ⊔ h.derivSubmodule 0 * h.derivSubmodule 0 * h.derivSubmodule 0 + * h.derivSubmodule 0 := by + rw [h.massWeightSubmodule_eight_eq] + simp only [derivSubmodule, Submodule.sup_mul, Submodule.mul_sup, + barHiggsSubmodule_comm_higgsSubmodule, mul_assoc, h.barHiggs_higgs_left_comm] + simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] + +end IsHiggsSector + +end StandardModel diff --git a/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean new file mode 100644 index 000000000..d833dbff6 --- /dev/null +++ b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean @@ -0,0 +1,51 @@ +/- +Copyright (c) 2026 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.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.RightHanded +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +/-! +# The boost weights of a Weyl spinor + +Along the `z`-axis the `SL(2,ℂ)` boost is the diagonal matrix `diag (t, t⁻¹)`, so both +Weyl bases are bases of boost eigenvectors: the first component carries weight `+1` and +the second weight `-1`. A Weyl spinor is a half-vector. + +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups + +/-- **The boost weight of a Weyl-spinor index.** Along the `z`-axis the `SL(2,ℂ)` boost is + the diagonal matrix `diag (t, t⁻¹)`, so the first spinor component carries weight `+1` and + the second weight `-1`; a Weyl spinor is a half-vector. -/ +def weylWeight (k : Fin 2) : ℤ := if k = 0 then 1 else -1 + +/-- The negated Weyl weight, which is what a dual spinor index carries, is `±1`. -/ +lemma neg_weylWeight_mem (k : Fin 2) : -(weylWeight k) ∈ ({-1, 1} : Finset ℤ) := by + fin_cases k <;> simp [weylWeight] + +/-- The right-handed Weyl basis diagonalises the `z`-boost, with weights `±1`. -/ +lemma rightHandedWeyl_rep_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) (k : Fin 2) : + Fermion.RightHandedWeyl.rep (SL2C.boostAxis 2 t ht) (Fermion.RightHandedWeyl.basis k) + = ((t : ℝ) : ℂ) ^ (weylWeight k) • Fermion.RightHandedWeyl.basis k := by + rw [Fermion.RightHandedWeyl.rep_apply_basis] + fin_cases k <;> + simp [weylWeight, Fin.sum_univ_two] + +/-- The left-handed Weyl basis diagonalises the `z`-boost, with weights `±1`. -/ +lemma leftHandedWeyl_rep_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) (k : Fin 2) : + Fermion.LeftHandedWeyl.rep (SL2C.boostAxis 2 t ht) (Fermion.LeftHandedWeyl.basis k) + = ((t : ℝ) : ℂ) ^ (weylWeight k) • Fermion.LeftHandedWeyl.basis k := by + rw [Fermion.LeftHandedWeyl.rep_apply_basis] + fin_cases k <;> + simp [weylWeight, Fin.sum_univ_two] + +end Lorentz diff --git a/Physlib/Relativity/LightConeDeriv.lean b/Physlib/Relativity/LightConeDeriv.lean new file mode 100644 index 000000000..2521612f4 --- /dev/null +++ b/Physlib/Relativity/LightConeDeriv.lean @@ -0,0 +1,571 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Boosts.WeightGrading +/-! +# Light-cone derivative symbols + +A family of symbols indexed by tuples of spacetime directions can be re-read in the +light-cone basis along a boost axis: `lightConeCoeff` gives the four light-cone +directions `D₀ - Dᵢ`, `D₀ + Dᵢ` and the two transverse ones, `lightConeCoeffInv` the +inverse change of basis, and `lightConeDeriv` the symbol read in that basis. The point +of the change of basis is `lightConeDeriv_mem`: a light-cone symbol is a boost +eigenvector, of weight `∑ j, lightConeWeight (c j)` — `+2` for `D₀ - Dᵢ`, `-2` for +`D₀ + Dᵢ`, and `0` for the transverse directions — on top of whatever weight its +argument already carries. + +The hypothesis the development runs on is `RotatesIndices`: every index of the symbol +map is a Lorentz vector index. + +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups Lorentz.BoostWeight + +variable {B : Type} [Ring B] [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {W : Type} [AddCommGroup W] [Module ℂ W] {repW : Representation ℂ SL(2,ℂ) W} + +/-- **One shape's worth of the rotation law**: every derivative index of `F` is a Lorentz + vector index. This is all the boost-weight development below uses, so it is taken as a + hypothesis; `IsDerivativeCollection.rotatesIndices` supplies it for each partition. -/ +abbrev RotatesIndices (repW : Representation ℂ SL(2,ℂ) W) + (repLorentz : Representation ℂ SL(2,ℂ) B) {n : ℕ} + (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) : Prop := + ∀ (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin 3) (w : W), + repLorentz g (F d w) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (j : Fin n), (((SL2C.toLorentzGroup g).1 (a j) (d j) : ℝ) : ℂ)) • F a (repW g w) + +/-- The four light-cone directions along the `i`-th axis, written as coefficient vectors on + the coordinate directions: `D₀ - Dᵢ`, `D₀ + Dᵢ`, and the two transverse directions. -/ +def lightConeCoeff (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℂ := + if κ = 0 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then -1 else 0) + else if κ = 1 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then 1 else 0) + else if κ = 2 then (if μ = Sum.inr (i + 1) then 1 else 0) + else (if μ = Sum.inr (i + 2) then 1 else 0) + +/-- The boost weight carried by each light-cone direction: `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ`, and `0` for the two transverse directions. -/ +def lightConeWeight (κ : Fin 4) : ℤ := if κ = 0 then 2 else if κ = 1 then -2 else 0 + +/-- **The light-cone directions are eigenvectors of the boost.** Along the `i`-th axis + `D₀ - Dᵢ` is scaled by `t²`, `D₀ + Dᵢ` by `t⁻²`, and the two transverse directions are + fixed. -/ +lemma sum_boostAxis_lightConeCoeff (i : Fin 3) (κ : Fin 4) (ν : Fin 1 ⊕ Fin 3) + {t : ℝ} (ht : t ≠ 0) : + ∑ μ : Fin 1 ⊕ Fin 3, + (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 ν μ : ℝ) : ℂ) * lightConeCoeff i κ μ + = ((t : ℝ) : ℂ) ^ (lightConeWeight κ) * lightConeCoeff i κ ν := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + rw [show SL2C.toLorentzGroup (SL2C.boostAxis i t ht) = LorentzGroup.boostAxis i t ht from rfl] + rcases ν with a | j + · rw [Subsingleton.elim a 0] + fin_cases i <;> fin_cases κ + all_goals + simp [lightConeCoeff, lightConeWeight, Fintype.sum_sum_type, + LorentzGroup.boostAxis_apply] + all_goals try field_simp + all_goals try ring + · fin_cases i <;> fin_cases j <;> fin_cases κ + all_goals + simp [lightConeCoeff, lightConeWeight, Fintype.sum_sum_type, + LorentzGroup.boostAxis_apply] + all_goals try field_simp + all_goals try ring + +/-- The coordinate directions written back in the light-cone basis: `D₀` and `Dᵢ` are the + half-sum and half-difference of `D₀ ∓ Dᵢ`, and the transverse directions are themselves. -/ +noncomputable def lightConeCoeffInv (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℂ := + if μ = Sum.inl 0 then (if κ = 0 then 2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr i then (if κ = 0 then -2⁻¹ else if κ = 1 then 2⁻¹ else 0) + else if μ = Sum.inr (i + 1) then (if κ = 2 then 1 else 0) + else (if κ = 3 then 1 else 0) + +/-- The inverse coefficient toward the first transverse direction vanishes off it. -/ +lemma lightConeCoeffInv_two_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} + (hμ : μ ≠ Sum.inr (i + 1)) : lightConeCoeffInv i μ 2 = 0 := by + simp [lightConeCoeffInv, hμ] + +/-- The inverse coefficient toward the second transverse direction vanishes off it. -/ +lemma lightConeCoeffInv_three_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} + (hμ : μ ≠ Sum.inr (i + 2)) : lightConeCoeffInv i μ 3 = 0 := by + rcases μ with a | m + · rw [Subsingleton.elim a 0] + simp [lightConeCoeffInv] + · fin_cases i <;> fin_cases m <;> simp_all [lightConeCoeffInv] + +/-- The inverse coefficient of the first transverse direction is supported on its own + light-cone index. -/ +lemma lightConeCoeffInv_transverse_one_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} {κ : Fin 4} + (hμ : μ = Sum.inr (i + 1)) (hκ : κ ≠ 2) : lightConeCoeffInv i μ κ = 0 := by + subst hμ + fin_cases i <;> fin_cases κ <;> simp_all [lightConeCoeffInv] + +/-- The light-cone basis is a basis: the two coefficient matrices are inverse. -/ +lemma sum_lightConeCoeffInv_mul (i : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + ∑ κ : Fin 4, lightConeCoeffInv i μ κ * lightConeCoeff i κ ν = if μ = ν then 1 else 0 := by + rcases μ with a | j + · rw [Subsingleton.elim a 0] + rcases ν with a' | j' + · rw [Subsingleton.elim a' 0] + fin_cases i <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] <;> norm_num + · fin_cases i <;> fin_cases j' <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] + · rcases ν with a' | j' + · rw [Subsingleton.elim a' 0] + fin_cases i <;> fin_cases j <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] + · fin_cases i <;> fin_cases j <;> fin_cases j' <;> + simp [lightConeCoeff, lightConeCoeffInv, Fin.sum_univ_four] <;> norm_num + +/-- The scalar behind `lightConeDeriv_mem`: the boost acts on a light-cone multi-index + slot by slot, so the product of the per-slot eigenvalues factors out. -/ +lemma sum_prod_lightConeCoeff (i : Fin 3) {n : ℕ} (c : Fin n → Fin 4) + (a : Fin n → Fin 1 ⊕ Fin 3) {t : ℝ} (ht : t ≠ 0) : + ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) + = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * ∏ j, lightConeCoeff i (c j) (a j) := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have hzpow : ∀ (s : Finset (Fin n)) (g : Fin n → ℤ), + ∏ j ∈ s, ((t : ℝ) : ℂ) ^ (g j) = ((t : ℝ) : ℂ) ^ (∑ j ∈ s, g j) := by + intro s g + induction s using Finset.induction with + | empty => simp + | insert a s ha ih => rw [Finset.prod_insert ha, Finset.sum_insert ha, ih, zpow_add₀ htc] + calc ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) + = ∑ d : Fin n → Fin 1 ⊕ Fin 3, ∏ j, (lightConeCoeff i (c j) (d j) * + (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (d j) : ℝ) : ℂ)) := + Finset.sum_congr rfl fun d _ => (Finset.prod_mul_distrib).symm + _ = ∏ j, ∑ μ : Fin 1 ⊕ Fin 3, (lightConeCoeff i (c j) μ * + (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) μ : ℝ) : ℂ)) := by + rw [Finset.prod_univ_sum, Fintype.piFinset_univ] + _ = ∏ j, (((t : ℝ) : ℂ) ^ (lightConeWeight (c j)) * lightConeCoeff i (c j) (a j)) := by + refine Finset.prod_congr rfl fun j _ => ?_ + simp_rw [mul_comm (lightConeCoeff i (c j) _)] + exact sum_boostAxis_lightConeCoeff i (c j) (a j) ht + _ = (∏ j, ((t : ℝ) : ℂ) ^ (lightConeWeight (c j))) * ∏ j, lightConeCoeff i (c j) (a j) := + Finset.prod_mul_distrib + _ = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * ∏ j, lightConeCoeff i (c j) (a j) := by + rw [hzpow] + +/-- **The symbol with its derivative indices in the light-cone basis.** Each slot `j` of the + multi-index carries a light-cone direction `c j` instead of a coordinate direction, so the + symbol is an eigenvector of the boost along the `i`-th axis, of weight + `∑ j, lightConeWeight (c j)`. -/ +noncomputable def lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (i : Fin 3) (c : Fin n → Fin 4) : W →ₗ[ℂ] B := + ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • F d + +/-- **A one-slot light-cone symbol**, written out as a combination of coordinate symbols. -/ +lemma lightConeDeriv_single (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) (κ : Fin 4) : + lightConeDeriv F i ![κ] = ∑ μ : Fin 1 ⊕ Fin 3, lightConeCoeff i κ μ • F ![μ] := by + rw [lightConeDeriv] + refine Fintype.sum_equiv (Equiv.funUnique (Fin 1) (Fin 1 ⊕ Fin 3)) _ _ fun d => ?_ + have hd : d = ![d 0] := by + funext j + fin_cases j + rfl + simp only [Fin.prod_univ_one, Matrix.cons_val_zero, Equiv.funUnique_apply, + Fin.default_eq_zero] + rw [← hd] + +/-- The light-cone combination `D₀ - Dᵢ` on one slot. -/ +lemma lightConeDeriv_zero (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0] = F ![Sum.inl 0] - F ![Sum.inr i] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff, Fintype.sum_sum_type] <;> module + +/-- The light-cone combination `D₀ + Dᵢ` on one slot. -/ +lemma lightConeDeriv_one (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1] = F ![Sum.inl 0] + F ![Sum.inr i] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff, Fintype.sum_sum_type] + +/-- The first transverse direction on one slot. -/ +lemma lightConeDeriv_two (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![2] = F ![Sum.inr (i + 1)] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff] + +/-- The second transverse direction on one slot. -/ +lemma lightConeDeriv_three (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3] = F ![Sum.inr (i + 2)] := by + rw [lightConeDeriv_single] + fin_cases i <;> + simp [lightConeCoeff] + +/-- **A two-slot light-cone symbol**, written out as a double sum over coordinate + symbols. -/ +lemma lightConeDeriv_pair (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) + (κ₀ κ₁ : Fin 4) : + lightConeDeriv F i ![κ₀, κ₁] = ∑ μ : Fin 1 ⊕ Fin 3, ∑ ν : Fin 1 ⊕ Fin 3, + (lightConeCoeff i κ₀ μ * lightConeCoeff i κ₁ ν) • F ![μ, ν] := + calc lightConeDeriv F i ![κ₀, κ₁] + = ∑ p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + (lightConeCoeff i κ₀ p.1 * lightConeCoeff i κ₁ p.2) • F ![p.1, p.2] := by + rw [lightConeDeriv] + refine Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 1 ⊕ Fin 3) _ _ fun d => ?_ + have hd : ![d 0, d 1] = d := by + funext j + fin_cases j <;> rfl + rw [Fin.prod_univ_two] + simp only [piFinTwoEquiv_apply, Matrix.cons_val_zero, Matrix.cons_val_one, hd] + _ = _ := Fintype.sum_prod_type _ + +/-- The `(D₀ - Dᵢ)(D₀ + Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_zero_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0, 1] = F ![Sum.inl 0, Sum.inl 0] + F ![Sum.inl 0, Sum.inr i] + - F ![Sum.inr i, Sum.inl 0] - F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul] + module + +/-- The `(D₀ + Dᵢ)(D₀ - Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_one_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1, 0] = F ![Sum.inl 0, Sum.inl 0] - F ![Sum.inl 0, Sum.inr i] + + F ![Sum.inr i, Sum.inl 0] - F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul, neg_ite] + module + +/-- Both slots on the first transverse direction. -/ +lemma lightConeDeriv_pair_two_two (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![2, 2] = F ![Sum.inr (i + 1), Sum.inr (i + 1)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- The first then second transverse directions. -/ +lemma lightConeDeriv_pair_two_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![2, 3] = F ![Sum.inr (i + 1), Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- The second then first transverse directions. -/ +lemma lightConeDeriv_pair_three_two (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 2] = F ![Sum.inr (i + 2), Sum.inr (i + 1)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- Both slots on the second transverse direction. -/ +lemma lightConeDeriv_pair_three_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 3] = F ![Sum.inr (i + 2), Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff] + +/-- The `(D₀ - Dᵢ)(D₀ - Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_zero_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0, 0] = F ![Sum.inl 0, Sum.inl 0] - F ![Sum.inl 0, Sum.inr i] + - F ![Sum.inr i, Sum.inl 0] + F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul, neg_ite] + module + +/-- The `(D₀ + Dᵢ)(D₀ + Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_one_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1, 1] = F ![Sum.inl 0, Sum.inl 0] + F ![Sum.inl 0, Sum.inr i] + + F ![Sum.inr i, Sum.inl 0] + F ![Sum.inr i, Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul] + module + +/-- The `(D₀ - Dᵢ)` then second transverse slot pair. -/ +lemma lightConeDeriv_pair_zero_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![0, 3] = F ![Sum.inl 0, Sum.inr (i + 2)] + - F ![Sum.inr i, Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_ite_eq', ite_smul] + module + +/-- The second transverse then `(D₀ - Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_three_zero (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 0] = F ![Sum.inr (i + 2), Sum.inl 0] + - F ![Sum.inr (i + 2), Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul, neg_ite] + module + +/-- The `(D₀ + Dᵢ)` then second transverse slot pair. -/ +lemma lightConeDeriv_pair_one_three (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![1, 3] = F ![Sum.inl 0, Sum.inr (i + 2)] + + F ![Sum.inr i, Sum.inr (i + 2)] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_ite_eq', ite_smul] + +/-- The second transverse then `(D₀ + Dᵢ)` slot pair. -/ +lemma lightConeDeriv_pair_three_one (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + lightConeDeriv F i ![3, 1] = F ![Sum.inr (i + 2), Sum.inl 0] + + F ![Sum.inr (i + 2), Sum.inr i] := by + rw [lightConeDeriv_pair] + simp [lightConeCoeff, Fintype.sum_sum_type, Finset.sum_add_distrib, Finset.sum_ite_eq', + ite_smul] + +/-- **The two-slot light-cone indices of weight zero**: the two mixed null pairs and the + four transverse pairs. -/ +lemma iSup_range_lightConeDeriv_pair_weight_zero + (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ)), + LinearMap.range (lightConeDeriv F i c)) + = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ + LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ + (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![2, 3]))) ⊔ + (LinearMap.range (lightConeDeriv F i ![3, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![3, 3])) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) + (sup_le (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) (sup_le ?_ ?_)) + · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := + ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ + rw [Fin.sum_univ_two] at hc + fin_cases κ₀ + · fin_cases κ₁ + · exact absurd hc (by decide) + · exact le_sup_of_le_left (le_sup_of_le_left le_sup_left) + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · fin_cases κ₁ + · exact le_sup_of_le_left (le_sup_of_le_left le_sup_right) + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · fin_cases κ₁ + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_left) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_right) + · fin_cases κ₁ + · exact absurd hc (by decide) + · exact absurd hc (by decide) + · exact le_sup_of_le_right le_sup_left + · exact le_sup_of_le_right le_sup_right + · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl + · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 3] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl + +/-- **The weight-zero light-cone pairs avoiding the mixed transverse indices**: the two + null pairs and the two repeated transverse pairs. -/ +lemma iSup_range_lightConeDeriv_pair_weight_zero_notMixed + (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ) ∧ + ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), + LinearMap.range (lightConeDeriv F i c)) + = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ + LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ + (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![3, 3]))) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) + (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) + · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := + ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ + obtain ⟨hw, h23, h32⟩ := hc + rw [Fin.sum_univ_two] at hw + fin_cases κ₀ + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact le_sup_of_le_left le_sup_left + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact le_sup_of_le_left le_sup_right + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact le_sup_of_le_right le_sup_left + · exact absurd (by decide) h23 + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd (by decide) h32 + · exact le_sup_of_le_right le_sup_right + · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl + · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl + +/-- **The weight-zero light-cone pairs whose slots hit the first transverse direction + together or not at all**: the two null pairs and the two repeated transverse pairs. -/ +lemma iSup_range_lightConeDeriv_pair_weight_zero_sync + (F : (Fin 2 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 2 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ) ∧ + ((c 0 = 2) ↔ (c 1 = 2))), + LinearMap.range (lightConeDeriv F i c)) + = ((LinearMap.range (lightConeDeriv F i ![0, 1]) ⊔ + LinearMap.range (lightConeDeriv F i ![1, 0])) ⊔ + (LinearMap.range (lightConeDeriv F i ![2, 2]) ⊔ + LinearMap.range (lightConeDeriv F i ![3, 3]))) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) + (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) + · obtain ⟨κ₀, κ₁, rfl⟩ : ∃ κ₀ κ₁, c = ![κ₀, κ₁] := + ⟨c 0, c 1, funext fun j => by fin_cases j <;> rfl⟩ + obtain ⟨hw, hsync⟩ := hc + rw [Fin.sum_univ_two] at hw + fin_cases κ₀ + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact le_sup_of_le_left le_sup_left + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact le_sup_of_le_left le_sup_right + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact le_sup_of_le_right le_sup_left + · exact absurd hsync (by decide) + · fin_cases κ₁ + · exact absurd hw (by decide) + · exact absurd hw (by decide) + · exact absurd hsync (by decide) + · exact le_sup_of_le_right le_sup_right + · exact le_iSup₂_of_le ![0, 1] (by decide) le_rfl + · exact le_iSup₂_of_le ![1, 0] (by decide) le_rfl + · exact le_iSup₂_of_le ![2, 2] (by decide) le_rfl + · exact le_iSup₂_of_le ![3, 3] (by decide) le_rfl + +/-- **The one-slot light-cone symbols of weight zero** are the two transverse directions: + the join of the weight-zero ranges on a single slot is the join of the ranges of the two + transverse symbols. -/ +lemma iSup_range_lightConeDeriv_single_weight_zero + (F : (Fin 1 → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) : + (⨆ (c : Fin 1 → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = (0 : ℤ)), + LinearMap.range (lightConeDeriv F i c)) + = LinearMap.range (F ![Sum.inr (i + 1)]) ⊔ LinearMap.range (F ![Sum.inr (i + 2)]) := by + refine le_antisymm (iSup₂_le fun c hc => ?_) (sup_le ?_ ?_) + · obtain ⟨κ, rfl⟩ : ∃ κ, c = ![κ] := ⟨c 0, funext fun j => by fin_cases j; rfl⟩ + rw [Fin.sum_univ_one] at hc + fin_cases κ + · simp [lightConeWeight] at hc + · simp [lightConeWeight] at hc + · exact le_sup_of_le_left (le_of_eq (congrArg LinearMap.range (lightConeDeriv_two F i))) + · exact le_sup_of_le_right (le_of_eq (congrArg LinearMap.range (lightConeDeriv_three F i))) + · exact le_iSup₂_of_le ![2] (by simp [lightConeWeight]) + (le_of_eq (by rw [lightConeDeriv_two])) + · exact le_iSup₂_of_le ![3] (by simp [lightConeWeight]) + (le_of_eq (by rw [lightConeDeriv_three])) + +/-- The scalar behind `f_eq_sum_lightConeDeriv`: the two coefficient matrices are inverse + slot by slot, hence inverse on multi-indices. -/ +lemma sum_prod_lightConeCoeffInv (i : Fin 3) {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) : + ∑ c : Fin n → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j)) = if d = e then 1 else 0 := by + calc ∑ c : Fin n → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j)) + = ∑ c : Fin n → Fin 4, + ∏ j, (lightConeCoeffInv i (d j) (c j) * lightConeCoeff i (c j) (e j)) := + Finset.sum_congr rfl fun c _ => (Finset.prod_mul_distrib).symm + _ = ∏ j, ∑ κ : Fin 4, (lightConeCoeffInv i (d j) κ * lightConeCoeff i κ (e j)) := by + rw [Finset.prod_univ_sum, Fintype.piFinset_univ] + _ = ∏ j, (if d j = e j then (1 : ℂ) else 0) := + Finset.prod_congr rfl fun j _ => sum_lightConeCoeffInv_mul i (d j) (e j) + _ = if d = e then 1 else 0 := by + by_cases hde : d = e + · subst hde + simp + · rw [if_neg hde] + obtain ⟨j, hj⟩ := Function.ne_iff.1 hde + exact Finset.prod_eq_zero (Finset.mem_univ j) (if_neg hj) + +/-- **The coordinate symbols in the light-cone basis.** The change of basis is invertible, + so the two families span the same submodule. -/ +lemma eq_sum_lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) (i : Fin 3) + (d : Fin n → Fin 1 ⊕ Fin 3) : + F d = ∑ c : Fin n → Fin 4, + (∏ j, lightConeCoeffInv i (d j) (c j)) • lightConeDeriv F i c := by + simp only [lightConeDeriv, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + simp only [← Finset.sum_smul, sum_prod_lightConeCoeffInv i d, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + +/-- **The light-cone symbols have definite boost weight.** Each derivative slot contributes + the weight of its light-cone direction, on top of the weight the argument carries in + `W`. -/ +lemma lightConeDeriv_mem {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (hF : RotatesIndices repW repLorentz F) + (i : Fin 3) (c : Fin n → Fin 4) {b : ℤ} {w : W} + (hwm : w ∈ boostWeightSubmodule repW i b) : + lightConeDeriv F i c w ∈ + boostWeightSubmodule repLorentz i ((∑ j, lightConeWeight (c j)) + b) := by + intro t ht + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have key : repLorentz (SL2C.boostAxis i t ht) (lightConeDeriv F i c w) + = ((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) • + lightConeDeriv F i c (repW (SL2C.boostAxis i t ht) w) := by + have hstep : ∀ x : Fin n → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • repLorentz (SL2C.boostAxis i t ht) (F x w) + = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) (x j) : ℝ) : ℂ))) • + F a (repW (SL2C.boostAxis i t ht) w) := by + intro x + rw [hF, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + simp only [lightConeDeriv, LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply, + map_sum, map_smul] + rw [Finset.smul_sum] + simp only [hstep] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul, smul_smul] + congr 1 + exact sum_prod_lightConeCoeff i c a ht + rw [key, hwm t ht, map_smul, smul_smul, + show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, ← zpow_add₀ htc] + +/-- The range of a light-cone symbol over a Lorentz-scalar argument lies in the + boost-weight space of its total slot weight. -/ +lemma range_lightConeDeriv_le {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) + (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) + (i : Fin 3) (c : Fin n → Fin 4) : + LinearMap.range (lightConeDeriv F i c) ≤ + boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + rintro x ⟨w, rfl⟩ + simpa using lightConeDeriv_mem F hF i c (b := 0) (w := w) + (mem_boostWeightSubmodule.2 fun t ht => by simp) + +/-- The range of a light-cone symbol lies in the join of the coordinate ranges. -/ +lemma range_lightConeDeriv_le_iSup_range {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W →ₗ[ℂ] B) + (i : Fin 3) (c : Fin n → Fin 4) : + LinearMap.range (lightConeDeriv F i c) ≤ ⨆ d, LinearMap.range (F d) := by + rintro x ⟨w, rfl⟩ + rw [lightConeDeriv] + simp only [LinearMap.coe_sum, Finset.sum_apply, LinearMap.smul_apply] + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (LinearMap.mem_range_self _ w)) + +/-- **The value of a two-slot light-cone symbol at `1`**, for a family over `ℂ`. -/ +noncomputable def lightConeDot (F : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) (i : Fin 3) + (c : Fin 2 → Fin 4) : B := + lightConeDeriv F i c (1 : ℂ) + +/-- A light-cone symbol value is a boost eigenvector of its total slot weight. -/ +lemma lightConeDot_mem (F : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ →ₗ[ℂ] B) + (hF : RotatesIndices (1 : Representation ℂ SL(2,ℂ) ℂ) repLorentz F) (i : Fin 3) + (c : Fin 2 → Fin 4) {k : ℤ} (hk : (∑ j, lightConeWeight (c j)) = k) : + lightConeDot F i c ∈ boostWeightSubmodule repLorentz i k := + hk ▸ range_lightConeDeriv_le (n := 2) F hF i c ⟨1, rfl⟩ + +end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 125ebd693..34b7169c3 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -15,7 +15,7 @@ public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim -public import Physlib.Particles.StandardModel.HiggsBoson.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps @@ -183,7 +183,7 @@ coefficients can be settled by `decide`. -/ -/-- Integer mirror of `IsDerivativeCollection.lightConeCoeff`. -/ +/-- Integer mirror of `lightConeCoeff`. -/ def lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : ℤ := if κ = 0 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then -1 else 0) else if κ = 1 then (if μ = Sum.inl 0 then 1 else if μ = Sum.inr i then 1 else 0) @@ -196,7 +196,7 @@ lemma coe_lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : rw [lightConeCoeffZ, lightConeCoeff] split_ifs <;> norm_num -/-- Rational mirror of `IsDerivativeCollection.lightConeCoeffInv`: entries `0`, `±2⁻¹` +/-- Rational mirror of `lightConeCoeffInv`: entries `0`, `±2⁻¹` and `1`, so ℚ-valued (like `lightConeTransition`) rather than integer. -/ def lightConeCoeffInvQ (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : ℚ := if μ = Sum.inl 0 then (if κ = 0 then 2⁻¹ else if κ = 1 then 2⁻¹ else 0) From 7e823d37e30ac8235c9daac66dbcd76b512b4c7f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 28 Aug 2026 15:24:12 +0100 Subject: [PATCH 230/254] feat: More simplifications --- Physlib.lean | 2 + .../GaugeGroup/GaugeWeightDecomposition.lean | 177 ++++++++ .../GaugeWeightDecomposition.lean | 79 ++++ .../MassWeight/GaugeWeightDecomposition.lean | 124 ++++-- .../IsHiggsSector/DerivSubmodule/Basic.lean | 39 +- .../BoostWeightDecomposition.lean | 389 ++++++++++++++++++ .../GaugeWeightDecomposition.lean | 65 +++ 7 files changed, 812 insertions(+), 63 deletions(-) create mode 100644 Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean diff --git a/Physlib.lean b/Physlib.lean index c61cf4607..930fca764 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -258,6 +258,8 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebr public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index d25510a86..b629c388d 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Mathematics.ConjModule +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Mathlib.LinearAlgebra.Eigenspace.Basic public import Mathlib.Analysis.Real.Pi.Irrational /-! @@ -46,6 +47,8 @@ be confined to the zero-weight piece. - `GaugeWeightDecomposition.piece_eq_inf` : the pieces are cut out of `V` by the torus alone. - `GaugeWeightDecomposition.mem_zero_of_invariant` : a gauge-invariant element lies in the zero-weight piece. +- `GaugeWeightDecomposition.pieceBoostWeightDecomposition` : a gauge weight piece inherits a + boost weight decomposition, when the gauge and Lorentz actions commute. ## iii. Table of contents @@ -55,6 +58,7 @@ be confined to the zero-weight piece. - D. Joins - E. Products - F. Invariants +- G. Compatibility with the boost weight decomposition -/ @@ -841,5 +845,178 @@ lemma mem_zero_of_invariant (d : GaugeWeightDecomposition rep V) {x : B} (hx : x rw [Module.End.mem_eigenspace_iff, GaugeWeight.zero_coord, zpow_zero, one_smul] exact hV _ +/-! +## G. Compatibility with the boost weight decomposition + +The gauge group acts on the value indices of an operator and the Lorentz group on its +spacetime indices, so in every representation met here the two actions commute. Given that, a +submodule carrying both a gauge weight decomposition and a boost weight decomposition passes +the second one down to each piece of the first. + +The content is that a boost-homogeneous component of a vector of pure gauge weight again has +that gauge weight. A torus generator commutes with the boosts, so it preserves every boost +weight space; the boost weight spaces are independent, so the weight-`k` component of a +scaled vector is the scaled weight-`k` component; and the eigenvector equations defining the +gauge weight therefore descend to every component. The lattice identity `piece_eq_inf` then +places each component back in the gauge weight piece. + +Meets do not distribute over suprema in a submodule lattice, so the independence is what makes +the argument work; it is isolated in `biSup_inf_eigenspace_le` and its two corollaries, which +know nothing about either group. +-/ + +section BoostWeight + +open MatrixGroups +open Lorentz.BoostWeight (WeightDecomposition boostWeightSubmodule mem_boostWeightSubmodule + boostWeightSubmodule_iSupIndep) + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} {i : Fin 3} + +/-- **Refining a finite independent decomposition by a commuting operator.** If the pieces `p` + sit inside an independent family `P` of `T`-invariant submodules, then an eigenvector of `T` + in the join of the pieces is the sum of eigenvectors, one in each piece. -/ +lemma biSup_inf_eigenspace_le {ι : Type*} {P p : ι → Submodule ℂ B} (hpP : ∀ j, p j ≤ P j) + (hP : iSupIndep P) {T : Module.End ℂ B} (hT : ∀ j, (P j).map T ≤ P j) (c : ℂ) + (s : Finset ι) : + (⨆ j ∈ s, p j) ⊓ Module.End.eigenspace T c + ≤ ⨆ j ∈ s, (p j ⊓ Module.End.eigenspace T c) := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert a s ha ih => + rw [Finset.iSup_insert, Finset.iSup_insert] + rintro x ⟨hx, hxE⟩ + obtain ⟨u, hu, v, hv, rfl⟩ := Submodule.mem_sup.mp hx + have hvP : v ∈ ⨆ j ∈ s, P j := (iSup₂_mono fun j _ => hpP j) hv + have hTv : T v ∈ ⨆ j ∈ s, P j := by + have hmap : (⨆ j ∈ s, P j).map T ≤ ⨆ j ∈ s, P j := by + simp only [Submodule.map_iSup] + exact iSup₂_mono fun j _ => hT j + exact hmap ⟨v, hvP, rfl⟩ + have hzero : (T u - c • u) + (T v - c • v) = 0 := by + have hsum : T (u + v) = c • (u + v) := Module.End.mem_eigenspace_iff.mp hxE + rw [map_add, smul_add] at hsum + rw [show (T u - c • u) + (T v - c • v) = (T u + T v) - (c • u + c • v) from by abel, + hsum, sub_self] + have hdisj : Disjoint (P a) (⨆ j ∈ s, P j) := + (hP a).mono_right (iSup₂_le fun j hj => + le_iSup₂_of_le j (show j ≠ a from fun hja => ha (hja ▸ hj)) le_rfl) + have hu0 : T u - c • u = 0 := by + refine Submodule.disjoint_def.mp hdisj _ (sub_mem (hT a ⟨u, hpP a hu, rfl⟩) + (Submodule.smul_mem _ _ (hpP a hu))) ?_ + rw [show T u - c • u = -(T v - c • v) from by rw [eq_neg_iff_add_eq_zero]; exact hzero] + exact neg_mem (sub_mem hTv (Submodule.smul_mem _ _ hvP)) + have hv0 : T v - c • v = 0 := by rwa [hu0, zero_add] at hzero + refine Submodule.mem_sup.mpr ⟨u, ⟨hu, Module.End.mem_eigenspace_iff.mpr (by + rwa [sub_eq_zero] at hu0)⟩, v, ih ⟨hv, Module.End.mem_eigenspace_iff.mpr (by + rwa [sub_eq_zero] at hv0)⟩, rfl⟩ + +/-- **Refining an independent decomposition by a commuting operator.** The form of + `biSup_inf_eigenspace_le` for a family vanishing off a finite set of indices. -/ +lemma iSup_inf_eigenspace_le {ι : Type*} {P p : ι → Submodule ℂ B} {s : Finset ι} + (hpP : ∀ j, p j ≤ P j) (hbot : ∀ j ∉ s, p j = ⊥) (hP : iSupIndep P) + {T : Module.End ℂ B} (hT : ∀ j, (P j).map T ≤ P j) (c : ℂ) : + (⨆ j, p j) ⊓ Module.End.eigenspace T c + ≤ ⨆ j, (p j ⊓ Module.End.eigenspace T c) := by + classical + have hs : (⨆ j, p j) = ⨆ j ∈ s, p j := by + refine le_antisymm (iSup_le fun j => ?_) (iSup₂_le fun j _ => le_iSup p j) + by_cases hj : j ∈ s + · exact le_iSup₂_of_le j hj le_rfl + · rw [hbot j hj] + exact bot_le + rw [hs] + exact (biSup_inf_eigenspace_le hpP hP hT c s).trans + (iSup₂_le fun j _ => le_iSup (fun j => p j ⊓ Module.End.eigenspace T c) j) + +/-- **Refining an independent decomposition by a family of commuting operators.** A joint + eigenvector of finitely many operators preserving each member of an independent family is a + sum of joint eigenvectors, one in each piece. -/ +lemma iSup_inf_iInf_eigenspace_le {ι κ : Type*} [Fintype κ] {P p : ι → Submodule ℂ B} + {s : Finset ι} (hpP : ∀ j, p j ≤ P j) (hbot : ∀ j ∉ s, p j = ⊥) (hP : iSupIndep P) + {T : κ → Module.End ℂ B} (hT : ∀ a j, (P j).map (T a) ≤ P j) (c : κ → ℂ) : + (⨆ j, p j) ⊓ ⨅ a, Module.End.eigenspace (T a) (c a) + ≤ ⨆ j, (p j ⊓ ⨅ a, Module.End.eigenspace (T a) (c a)) := by + classical + have key : ∀ (S : Finset κ) (q : ι → Submodule ℂ B), (∀ j, q j ≤ P j) → + (∀ j ∉ s, q j = ⊥) → + (⨆ j, q j) ⊓ (⨅ a ∈ S, Module.End.eigenspace (T a) (c a)) + ≤ ⨆ j, (q j ⊓ ⨅ a ∈ S, Module.End.eigenspace (T a) (c a)) := by + intro S + induction S using Finset.induction_on with + | empty => + intro q _ _ + simp + | @insert a S ha ih => + intro q hq hqbot + simp only [Finset.iInf_insert, ← inf_assoc] + refine le_trans (inf_le_inf_right _ (iSup_inf_eigenspace_le hq hqbot hP + (fun j => hT a j) (c a))) ?_ + exact ih (fun j => q j ⊓ Module.End.eigenspace (T a) (c a)) + (fun j => inf_le_left.trans (hq j)) + (fun j hj => by rw [hqbot j hj, bot_inf_eq]) + have huniv : (⨅ a ∈ (Finset.univ : Finset κ), Module.End.eigenspace (T a) (c a)) + = ⨅ a, Module.End.eigenspace (T a) (c a) := by simp + rw [← huniv] + exact key Finset.univ p hpP hbot + +/-- **A gauge transformation preserves every boost weight space**, when the gauge action and + the Lorentz action commute. The boosts are what cut out the weight space, and the two + actions may be exchanged past them. -/ +lemma boostWeightSubmodule_map_le + (hcomm : ∀ (g : GaugeGroupI) (Λ : SL(2,ℂ)) (x : B), + rep g (repLorentz Λ x) = repLorentz Λ (rep g x)) (g : GaugeGroupI) (k : ℤ) : + (boostWeightSubmodule repLorentz i k).map (rep g) + ≤ boostWeightSubmodule repLorentz i k := by + rintro _ ⟨y, hy, rfl⟩ + refine mem_boostWeightSubmodule.mpr fun t ht => ?_ + rw [← hcomm, mem_boostWeightSubmodule.mp hy t ht, map_smul] + +/-- **A gauge weight piece inherits the boost weight decomposition.** If `V` carries both a + gauge weight decomposition and a boost weight decomposition, and the two actions commute, + then the weight-`w` gauge piece is decomposed by its intersections with the boost pieces. -/ +noncomputable def pieceBoostWeightDecomposition (d : GaugeWeightDecomposition rep V) + (b : WeightDecomposition repLorentz i V) + (hcomm : ∀ (g : GaugeGroupI) (Λ : SL(2,ℂ)) (x : B), + rep g (repLorentz Λ x) = repLorentz Λ (rep g x)) (w : GaugeWeight) : + WeightDecomposition repLorentz i (d.piece w) where + piece k := b.piece k ⊓ d.piece w + supp := b.supp + piece_le k := inf_le_left.trans (b.piece_le k) + piece_eq_bot k hk := by rw [b.piece_eq_bot k hk, bot_inf_eq] + iSup_piece := by + refine le_antisymm (iSup_le fun k => inf_le_right) ?_ + have hpiece : ∀ k, b.piece k ≤ V := fun k => + le_of_le_of_eq (le_iSup b.piece k) b.iSup_piece + have hkey := iSup_inf_iInf_eigenspace_le (P := boostWeightSubmodule repLorentz i) + (p := b.piece) (s := b.supp) b.piece_le b.piece_eq_bot + (boostWeightSubmodule_iSupIndep (i := i) repLorentz) + (T := fun j => rep (gaugeTorusGen j)) + (hT := fun j k => boostWeightSubmodule_map_le hcomm (gaugeTorusGen j) k) + (c := fun j => (expI : ℂ) ^ w.coord j) + rw [b.iSup_piece] at hkey + refine le_trans (le_of_eq (d.piece_eq_inf w)) (hkey.trans (iSup_mono fun k => ?_)) + refine le_inf inf_le_left ?_ + rw [d.piece_eq_inf] + exact inf_le_inf (hpiece k) le_rfl + +/-- The pieces of the inherited boost weight decomposition. -/ +@[simp] +lemma pieceBoostWeightDecomposition_piece (d : GaugeWeightDecomposition rep V) + (b : WeightDecomposition repLorentz i V) + (hcomm : ∀ (g : GaugeGroupI) (Λ : SL(2,ℂ)) (x : B), + rep g (repLorentz Λ x) = repLorentz Λ (rep g x)) (w : GaugeWeight) (k : ℤ) : + (pieceBoostWeightDecomposition d b hcomm w).piece k = b.piece k ⊓ d.piece w := rfl + +/-- The support of the inherited boost weight decomposition. -/ +lemma pieceBoostWeightDecomposition_supp (d : GaugeWeightDecomposition rep V) + (b : WeightDecomposition repLorentz i V) + (hcomm : ∀ (g : GaugeGroupI) (Λ : SL(2,ℂ)) (x : B), + rep g (repLorentz Λ x) = repLorentz Λ (rep g x)) (w : GaugeWeight) : + (pieceBoostWeightDecomposition d b hcomm w).supp = b.supp := rfl + +end BoostWeight + end GaugeWeightDecomposition end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean index a7b4793a1..36d4114a8 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean @@ -288,6 +288,85 @@ lemma derivSubmoduleGaugeWeight_supp (n : ℕ) : rw [hstep] decide +/-! + +## G. The pieces of the decomposition + +-/ + +/-- **The pieces of the gauge weight decomposition.** The weight-`w` piece is the join, + over the derivative slots and the two covector indices, of the lines spanned by those + weight vectors whose weight is `w`. -/ +lemma derivSubmoduleGaugeWeight_piece (n : ℕ) (w : GaugeWeight) : + (h.derivSubmoduleGaugeWeight n).piece w + = ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (k : Fin 4 ⊕ Fin 4 ⊕ Fin 4), + (if w = adjWeight k then ℂ ∙ h.adjVec l μ ν k else ⊥) := rfl + +/-- The piece at a root weight: the `+` combination for that root alone. -/ +lemma derivSubmoduleGaugeWeight_piece_rootWeight (n : ℕ) (r : Fin 4) : + (h.derivSubmoduleGaugeWeight n).piece (GaugeAlgebra.rootWeight r) + = ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inl r) := by + rw [h.derivSubmoduleGaugeWeight_piece] + refine iSup_congr fun l => iSup_congr fun μ => iSup_congr fun ν => ?_ + rw [iSup_sum, iSup_sum] + have h1 : ∀ a b : Fin 4, + (GaugeAlgebra.rootWeight a = adjWeight (Sum.inl b)) ↔ b = a := by decide + have h2 : ∀ a b : Fin 4, + ¬ (GaugeAlgebra.rootWeight a = adjWeight (Sum.inr (Sum.inl b))) := by decide + have h3 : ∀ a c : Fin 4, + ¬ (GaugeAlgebra.rootWeight a = adjWeight (Sum.inr (Sum.inr c))) := by decide + simp only [h1, h2, h3, if_false, iSup_bot, sup_bot_eq] + refine le_antisymm (iSup_le fun i => ?_) (le_iSup_of_le r (by simp)) + split_ifs with hi + · subst hi + exact le_rfl + · exact bot_le + +/-- The piece at the opposite of a root weight: the `-` combination for that root. -/ +lemma derivSubmoduleGaugeWeight_piece_neg_rootWeight (n : ℕ) (r : Fin 4) : + (h.derivSubmoduleGaugeWeight n).piece (-(GaugeAlgebra.rootWeight r)) + = ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl r)) := by + rw [h.derivSubmoduleGaugeWeight_piece] + refine iSup_congr fun l => iSup_congr fun μ => iSup_congr fun ν => ?_ + rw [iSup_sum, iSup_sum] + have h1 : ∀ a b : Fin 4, ¬ (-(GaugeAlgebra.rootWeight a) = adjWeight (Sum.inl b)) := by decide + have h2 : ∀ a b : Fin 4, + (-(GaugeAlgebra.rootWeight a) = adjWeight (Sum.inr (Sum.inl b))) ↔ b = a := by + decide + have h3 : ∀ a c : Fin 4, + ¬ (-(GaugeAlgebra.rootWeight a) = adjWeight (Sum.inr (Sum.inr c))) := by decide + simp only [h1, h2, h3, if_false, iSup_bot, bot_sup_eq, sup_bot_eq] + refine le_antisymm (iSup_le fun i => ?_) (le_iSup_of_le r (by simp)) + split_ifs with hi + · subst hi + exact le_rfl + · exact bot_le + +/-- The weight-zero piece: the two `su(3)` Cartan generators, the `su(2)` Cartan + generator and the `u(1)` generator, the only directions the torus fixes. -/ +lemma derivSubmoduleGaugeWeight_piece_zero' (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece 0 + = ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inr c)) := by + rw [h.derivSubmoduleGaugeWeight_piece] + refine iSup_congr fun l => iSup_congr fun μ => iSup_congr fun ν => ?_ + rw [iSup_sum, iSup_sum] + have h1 : ∀ b : Fin 4, ¬ ((0 : GaugeWeight) = adjWeight (Sum.inl b)) := by decide + have h2 : ∀ b : Fin 4, ¬ ((0 : GaugeWeight) = adjWeight (Sum.inr (Sum.inl b))) := by decide + have h3 : ∀ c : Fin 4, ((0 : GaugeWeight) = adjWeight (Sum.inr (Sum.inr c))) := by decide + simp only [h1, h2, if_false, iSup_bot, bot_sup_eq] + exact iSup_congr fun c => if_pos (h3 c) + +/-- Every other weight has a trivial piece. -/ +lemma derivSubmoduleGaugeWeight_piece_eq_bot (n : ℕ) {w : GaugeWeight} + (hw : w ∉ (h.derivSubmoduleGaugeWeight n).supp) : + (h.derivSubmoduleGaugeWeight n).piece w = ⊥ := + (h.derivSubmoduleGaugeWeight n).piece_eq_bot w hw + end IsGaugeSector diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean index 2439f9868..ed89cf783 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean @@ -178,48 +178,108 @@ lemma massWeightSubmoduleGaugeWeightSix_piece_zero : ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c)) := h.derivSubmoduleGaugeWeight_piece_zero 1 -/-- The weight-zero piece at mass weight eight: the twice-differentiated field strength - on the four fixed directions, joined with the products of two undifferentiated field - strengths whose gauge weights cancel. The nine surviving splittings pair each of the - eight roots with its opposite, and the fixed directions with themselves. -/ +/-- Any two weight pieces of a gauge derivative submodule commute: the gauge sector is + bosonic, and every piece sits inside the derivative submodule. -/ +lemma piece_mul_comm (n : ℕ) (w w' : GaugeWeight) : + (h.derivSubmoduleGaugeWeight n).piece w * (h.derivSubmoduleGaugeWeight n).piece w' + = (h.derivSubmoduleGaugeWeight n).piece w' * (h.derivSubmoduleGaugeWeight n).piece w := by + have hle : ∀ v : GaugeWeight, + (h.derivSubmoduleGaugeWeight n).piece v ≤ h.derivSubmodule n := fun v => by + conv_rhs => rw [← (h.derivSubmoduleGaugeWeight n).iSup_piece] + exact le_iSup _ v + refine le_antisymm (Submodule.mul_le.mpr fun x hx y hy => ?_) + (Submodule.mul_le.mpr fun x hx y hy => ?_) <;> + · rw [(h.commute_of_mem_derivSubmodule (hle _ hx) (hle _ hy)).eq] + exact Submodule.mul_mem_mul hy hx + +/-- The weight-zero piece at mass weight eight, written out in the weight vectors + themselves: the twice-differentiated field strength on the four fixed directions of + the adjoint, joined with the four products pairing a root vector against its + opposite and the product of the fixed directions with themselves. -/ lemma massWeightSubmoduleGaugeWeightEight_piece_zero : (h.massWeightSubmoduleGaugeWeightEight).piece 0 + = (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), + ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c))) + ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inl 0)) + * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 0))) + ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inl 1)) + * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 1))) + ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inl 2)) + * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 2))) + ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inl 3)) + * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 3))) + ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inr c))) + * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4), ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inr c)))))))) := by + have h5 : (h.massWeightSubmoduleGaugeWeightEight).piece 0 = (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 4), ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c))) ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (2, -1, 0, 0) * (h.derivSubmoduleGaugeWeight 0).piece (-2, 1, 0, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (1, 1, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (1, 1, 0, 0) * (h.derivSubmoduleGaugeWeight 0).piece (-1, -1, 0, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (-1, 2, 0, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (-1, 2, 0, 0) * (h.derivSubmoduleGaugeWeight 0).piece (1, -2, 0, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, 2, 0) + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, 2, 0) * (h.derivSubmoduleGaugeWeight 0).piece (0, 0, -2, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (-2, 1, 0, 0) - * (h.derivSubmoduleGaugeWeight 0).piece (2, -1, 0, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (-1, -1, 0, 0) - * (h.derivSubmoduleGaugeWeight 0).piece (1, 1, 0, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (1, -2, 0, 0) - * (h.derivSubmoduleGaugeWeight 0).piece (-1, 2, 0, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, -2, 0) - * (h.derivSubmoduleGaugeWeight 0).piece (0, 0, 2, 0) - ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, 0, 0) - * (h.derivSubmoduleGaugeWeight 0).piece (0, 0, 0, 0)))))))))) := by - show (h.derivSubmoduleGaugeWeight 2).piece 0 - ⊔ GaugeWeightDecomposition.piece repGauge - (h.derivSubmodule 0 * h.derivSubmodule 0) 0 = _ - rw [h.derivSubmoduleGaugeWeight_piece_zero 2, - GaugeWeightDecomposition.mul_piece_eq_sub 0, h.derivSubmoduleGaugeWeight_supp 0] - simp only [Finset.iSup_insert, Finset.iSup_singleton, - show (0 : GaugeWeight) - (2, -1, 0, 0) = (-2, 1, 0, 0) from by decide, - show (0 : GaugeWeight) - (1, 1, 0, 0) = (-1, -1, 0, 0) from by decide, - show (0 : GaugeWeight) - (-1, 2, 0, 0) = (1, -2, 0, 0) from by decide, - show (0 : GaugeWeight) - (0, 0, 2, 0) = (0, 0, -2, 0) from by decide, - show (0 : GaugeWeight) - (-2, 1, 0, 0) = (2, -1, 0, 0) from by decide, - show (0 : GaugeWeight) - (-1, -1, 0, 0) = (1, 1, 0, 0) from by decide, - show (0 : GaugeWeight) - (1, -2, 0, 0) = (-1, 2, 0, 0) from by decide, - show (0 : GaugeWeight) - (0, 0, -2, 0) = (0, 0, 2, 0) from by decide, - show (0 : GaugeWeight) - (0, 0, 0, 0) = (0, 0, 0, 0) from by decide] + ⊔ ((h.derivSubmoduleGaugeWeight 0).piece (0, 0, 0, 0) + * (h.derivSubmoduleGaugeWeight 0).piece (0, 0, 0, 0)))))) := by + show (h.derivSubmoduleGaugeWeight 2).piece 0 + ⊔ GaugeWeightDecomposition.piece repGauge + (h.derivSubmodule 0 * h.derivSubmodule 0) 0 = _ + rw [h.derivSubmoduleGaugeWeight_piece_zero 2, + GaugeWeightDecomposition.mul_piece_eq_sub 0, h.derivSubmoduleGaugeWeight_supp 0] + simp only [Finset.iSup_insert, Finset.iSup_singleton, + show (0 : GaugeWeight) - (2, -1, 0, 0) = (-2, 1, 0, 0) from by decide, + show (0 : GaugeWeight) - (1, 1, 0, 0) = (-1, -1, 0, 0) from by decide, + show (0 : GaugeWeight) - (-1, 2, 0, 0) = (1, -2, 0, 0) from by decide, + show (0 : GaugeWeight) - (0, 0, 2, 0) = (0, 0, -2, 0) from by decide, + show (0 : GaugeWeight) - (-2, 1, 0, 0) = (2, -1, 0, 0) from by decide, + show (0 : GaugeWeight) - (-1, -1, 0, 0) = (1, 1, 0, 0) from by decide, + show (0 : GaugeWeight) - (1, -2, 0, 0) = (-1, 2, 0, 0) from by decide, + show (0 : GaugeWeight) - (0, 0, -2, 0) = (0, 0, 2, 0) from by decide, + show (0 : GaugeWeight) - (0, 0, 0, 0) = (0, 0, 0, 0) from by decide] + rw [h.piece_mul_comm 0 (-2, 1, 0, 0) (2, -1, 0, 0), + h.piece_mul_comm 0 (-1, -1, 0, 0) (1, 1, 0, 0), + h.piece_mul_comm 0 (1, -2, 0, 0) (-1, 2, 0, 0), + h.piece_mul_comm 0 (0, 0, -2, 0) (0, 0, 2, 0)] + congr 1 + have key : ∀ a b c d e : Submodule ℂ B, + a ⊔ (b ⊔ (c ⊔ (d ⊔ (a ⊔ (b ⊔ (c ⊔ (d ⊔ e))))))) + = a ⊔ (b ⊔ (c ⊔ (d ⊔ e))) := by + intro a b c d e + simp [sup_left_comm] + exact key _ _ _ _ _ + have e0 : ((2, -1, 0, 0) : GaugeWeight) = GaugeAlgebra.rootWeight 0 := rfl + have e1 : ((1, 1, 0, 0) : GaugeWeight) = GaugeAlgebra.rootWeight 1 := rfl + have e2 : ((-1, 2, 0, 0) : GaugeWeight) = GaugeAlgebra.rootWeight 2 := rfl + have e3 : ((0, 0, 2, 0) : GaugeWeight) = GaugeAlgebra.rootWeight 3 := rfl + have f0 : ((-2, 1, 0, 0) : GaugeWeight) = -(GaugeAlgebra.rootWeight 0) := by decide + have f1 : ((-1, -1, 0, 0) : GaugeWeight) = -(GaugeAlgebra.rootWeight 1) := by decide + have f2 : ((1, -2, 0, 0) : GaugeWeight) = -(GaugeAlgebra.rootWeight 2) := by decide + have f3 : ((0, 0, -2, 0) : GaugeWeight) = -(GaugeAlgebra.rootWeight 3) := by decide + have z0 : ((0, 0, 0, 0) : GaugeWeight) = 0 := rfl + rw [h5, e0, e1, e2, e3, f0, f1, f2, f3, z0, + h.derivSubmoduleGaugeWeight_piece_rootWeight, + h.derivSubmoduleGaugeWeight_piece_rootWeight, + h.derivSubmoduleGaugeWeight_piece_rootWeight, + h.derivSubmoduleGaugeWeight_piece_rootWeight, + h.derivSubmoduleGaugeWeight_piece_neg_rootWeight, + h.derivSubmoduleGaugeWeight_piece_neg_rootWeight, + h.derivSubmoduleGaugeWeight_piece_neg_rootWeight, + h.derivSubmoduleGaugeWeight_piece_neg_rootWeight, + h.derivSubmoduleGaugeWeight_piece_zero'] end IsGaugeSector diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean index 3376ab5a3..7223157e6 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean @@ -12,8 +12,10 @@ public import Physlib.Particles.StandardModel.IsHiggsSector.Basic The Higgs symbols and their conjugates carrying a fixed number `n` of derivatives span the submodule `derivSubmodule n`. The Higgs is bosonic, so these submodules commute with one another, and since neither the gauge nor the Lorentz action changes the number -of derivatives they are closed under both. Finally the gauge weight decompositions of -the Higgs and conjugate-Higgs submodules join to one of `derivSubmodule n`. +of derivatives they are closed under both. + +The gauge and boost weight decompositions of these submodules live in +`GaugeWeightDecomposition.lean` and `BoostWeightDecomposition.lean`. -/ @@ -34,7 +36,8 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} - {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH massWeightPoly) @@ -146,7 +149,8 @@ lemma derivSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : lemma derivSubmodule_map_rep (n : ℕ) (g : GaugeGroupI) : (h.derivSubmodule n).map (rep g) = h.derivSubmodule n := le_antisymm (h.derivSubmodule_map_rep_le n g) fun b hb => - ⟨rep g⁻¹ b, h.derivSubmodule_map_rep_le n g⁻¹ ⟨b, hb, rfl⟩, rep.self_inv_apply g b⟩ + ⟨rep g⁻¹ b, h.derivSubmodule_map_rep_le n g⁻¹ ⟨b, hb, rfl⟩, + rep.self_inv_apply g b⟩ /-- The derivative submodules are closed under the Lorentz action: the Lorentz group only mixes the derivative indices within a fixed number of derivatives. -/ @@ -174,33 +178,6 @@ lemma derivSubmodule_map_repLorentz (n : ℕ) (Λ : SL(2,ℂ)) : ⟨repLorentz Λ⁻¹ b, h.derivSubmodule_map_repLorentz_le n Λ⁻¹ ⟨b, hb, rfl⟩, repLorentz.self_inv_apply Λ b⟩ -/-! - -## The gauge weight decomposition - --/ - -/-- **The gauge weight decomposition of the Higgs derivative submodules**: the join of - the decompositions of the Higgs and conjugate-Higgs submodules, whose weights are - `(0, 0, ∓1, -3)` and `(0, 0, ±1, 3)` respectively. - - This is an instance: its statement mentions `h`, so unification against the goal - recovers the sector and with it the rest of the structure's implicit data. -/ -@[implicit_reducible] -noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : - GaugeWeightDecomposition rep (h.derivSubmodule n) := - GaugeWeightDecomposition.copy - (GaugeWeightDecomposition.sup (d := h.higgsSubmoduleGaugeWeight n) - (d' := h.barHiggsSubmoduleGaugeWeight n)) - _ (by rw [derivSubmodule]) - -/-- The gauge weights occurring in the Higgs derivative submodules: the two Higgs - weights `(0, 0, ∓1, -3)` and the two conjugate-Higgs weights `(0, 0, ±1, 3)`. -/ -lemma derivSubmoduleGaugeWeight_supp (n : ℕ) : - (h.derivSubmoduleGaugeWeight n).supp - = {((0, 0, -1, -3) : GaugeWeight), (0, 0, 1, -3), (0, 0, 1, 3), (0, 0, -1, 3)} := - rfl - end IsHiggsSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean new file mode 100644 index 000000000..e38eb9971 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -0,0 +1,389 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +/-! +# The boost weight decomposition of the Higgs sector + +The boost-weight analogue of `GaugeWeightDecomposition.lean`. There the Higgs symbols were +split by their *gauge* weight, the value index doing all the work; here they are split by +their *boost* weight along a spatial axis, the derivative slots doing all the work and the +value index sitting inert. + +This is the simplest of the three sectors. The Higgs symbols `H n l φ` and `barH n l φ` +carry only the `n` covariant-derivative slots — there is no extra covector index to pack +alongside them, as there is for the field strength of the gauge sector — so +`IsLorentzCovDerivTransforms` is literally `RotatesIndices` for each of the two families. +And the value space is *Lorentz trivial*: `IsHiggsSector.repLorentz_H` runs through +`Representation.trivial ℂ SL(2,ℂ) HiggsVec` and `repLorentz_barH` through its conjugate, +so the dual value index carries boost weight `0` and contributes nothing — unlike the +Weyl-spinor value index of the fermion sector. + +So the whole weight is carried by the derivative slots. Reading the `n` slots in the +light-cone basis of the `i`-th axis produces the symbols `lightConeHiggs i c φ` and +`lightConeBarHiggs i c φ`, and these are boost eigenvectors: a slot of type `c j` +contributes `lightConeWeight (c j)` — `+2` for `D₀ - Dᵢ`, `-2` for `D₀ + Dᵢ` and `0` for +the two transverse directions — so the total weight is `∑ j, lightConeWeight (c j)`. +Joining the Higgs and conjugate-Higgs decompositions gives `derivSubmoduleBoostWeight`, a +`Lorentz.BoostWeight.WeightDecomposition` of `h.derivSubmodule n` along every axis. The +weights that occur are the achievable slot sums: even integers of absolute value at most +`2 * n`. + +-/ + +@[expose] public section + +namespace Lorentz.BoostWeight.WeightDecomposition + +open MatrixGroups + +variable {K : Type*} [Field K] [Algebra ℝ K] {M : Type*} [AddCommGroup M] [Module K M] + +/-- **The weight decomposition of a space the Lorentz group acts trivially on**: everything + sits in weight zero. `IsHiggsSector.trivialWeightDecomposition` is the case `M = K`; the + Higgs value spaces need the same statement for the (conjugate) dual of `HiggsVec`. -/ +noncomputable def ofTrivialAction (rep : Representation K SL(2,ℂ) M) + (htriv : ∀ (g : SL(2,ℂ)) (x : M), rep g x = x) (i : Fin 3) : + WeightDecomposition rep i ⊤ where + piece k := if k = 0 then ⊤ else ⊥ + supp := {0} + piece_le k := by + by_cases hk : k = 0 + · subst hk + rw [if_pos rfl] + intro x _ t ht + rw [htriv, zpow_zero, one_smul] + · rw [if_neg hk] + exact bot_le + piece_eq_bot k hk := if_neg (by simpa using hk) + iSup_piece := le_antisymm le_top (le_iSup_of_le 0 (by rw [if_pos rfl])) + +/-- The pieces of a trivial action: everything in weight zero, nothing elsewhere. -/ +@[simp] +lemma ofTrivialAction_piece (rep : Representation K SL(2,ℂ) M) + (htriv : ∀ (g : SL(2,ℂ)) (x : M), rep g x = x) (i : Fin 3) (k : ℤ) : + (ofTrivialAction rep htriv i).piece k = if k = 0 then ⊤ else ⊥ := rfl + +/-- The support of a trivial action is `{0}`. -/ +@[simp] +lemma ofTrivialAction_supp (rep : Representation K SL(2,ℂ) M) + (htriv : ∀ (g : SL(2,ℂ)) (x : M), rep g x = x) (i : Fin 3) : + (ofTrivialAction rep htriv i).supp = {0} := rfl + +end Lorentz.BoostWeight.WeightDecomposition + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight + +namespace IsHiggsSector + +set_option linter.unusedVariables false + +variable {B : Type} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} + {hrep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) + +/-! + +## A. The Higgs symbols rotate their derivative indices + +-/ + +include h in +/-- **Every derivative slot of a Higgs symbol is a Lorentz vector index.** This is the + structure field `repLorentz_H`, read as the hypothesis the light-cone machinery runs + on; the value index transforms by the dual of the *trivial* representation, i.e. not at + all. -/ +lemma rotatesIndices_H (n : ℕ) : + RotatesIndices (Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual repLorentz (H n) := + fun g l φ => h.repLorentz_H g n l φ + +include h in +/-- **Every derivative slot of a conjugate-Higgs symbol is a Lorentz vector index.** The + value index transforms by the dual of the conjugate of the trivial representation, which + again is the identity. -/ +lemma rotatesIndices_barH (n : ℕ) : + RotatesIndices (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual repLorentz (barH n) := + fun g l φ => h.repLorentz_barH g n l φ + +/-! + +## B. The value spaces are Lorentz trivial + +-/ + +/-- **The Higgs value space carries boost weight zero.** The dual of the trivial + representation on `HiggsVec` acts as the identity, so the whole of + `Module.Dual ℂ HiggsVec` sits in weight `0`. -/ +noncomputable def higgsValueWeight (i : Fin 3) : + WeightDecomposition (Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual i ⊤ := + WeightDecomposition.ofTrivialAction _ Representation.trivial_dual_apply i + +/-- **The conjugate-Higgs value space carries boost weight zero.** -/ +noncomputable def barHiggsValueWeight (i : Fin 3) : + WeightDecomposition (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual i ⊤ := + WeightDecomposition.ofTrivialAction _ Representation.conj_trivial_dual_apply i + +/-- Every value index of the Higgs has boost weight zero. -/ +lemma mem_boostWeightSubmodule_higgsValue (i : Fin 3) (φ : Module.Dual ℂ HiggsVec) : + φ ∈ boostWeightSubmodule (Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual i 0 := + fun t ht => by rw [Representation.trivial_dual_apply, zpow_zero, one_smul] + +/-- Every value index of the conjugate Higgs has boost weight zero. -/ +lemma mem_boostWeightSubmodule_barHiggsValue (i : Fin 3) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + φ ∈ boostWeightSubmodule (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual i 0 := + fun t ht => by rw [Representation.conj_trivial_dual_apply, zpow_zero, one_smul] + +/-! + +## C. The light-cone Higgs symbols and their boost weights + +-/ + +/-- **The light-cone Higgs symbols.** The `n` covariant-derivative slots of `H n` are read + in the light-cone basis of the `i`-th spatial axis, `c j` naming the light-cone direction + of the `j`-th slot. -/ +noncomputable def lightConeHiggs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul + H barH massWeightPoly) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) + (φ : Module.Dual ℂ HiggsVec) : B := + lightConeDeriv (H n) i c φ + +/-- **The light-cone conjugate-Higgs symbols.** -/ +noncomputable def lightConeBarHiggs (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : B := + lightConeDeriv (barH n) i c φ + +/-- **The light-cone Higgs symbols have definite boost weight.** Each of the `n` slots + contributes the weight of its light-cone direction: `+2` for `D₀ - Dᵢ`, `-2` for + `D₀ + Dᵢ` and `0` for the two transverse directions. The value index is inert, so no + further contribution appears. -/ +lemma lightConeHiggs_mem {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) + (φ : Module.Dual ℂ HiggsVec) : + h.lightConeHiggs i c φ ∈ + boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + rw [lightConeHiggs] + simpa using lightConeDeriv_mem (H n) (h.rotatesIndices_H n) i c + (mem_boostWeightSubmodule_higgsValue i φ) + +/-- **The light-cone conjugate-Higgs symbols have definite boost weight**, carried entirely + by the derivative slots. -/ +lemma lightConeBarHiggs_mem {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + h.lightConeBarHiggs i c φ ∈ + boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + rw [lightConeBarHiggs] + simpa using lightConeDeriv_mem (barH n) (h.rotatesIndices_barH n) i c + (mem_boostWeightSubmodule_barHiggsValue i φ) + +include h in +/-- The range of a light-cone Higgs symbol map lies in one boost weight space. -/ +lemma range_lightConeDeriv_H_le {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) : + LinearMap.range (lightConeDeriv (H n) i c) + ≤ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + rintro _ ⟨φ, rfl⟩ + exact h.lightConeHiggs_mem i c φ + +include h in +/-- The range of a light-cone conjugate-Higgs symbol map lies in one boost weight space. -/ +lemma range_lightConeDeriv_barH_le {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) : + LinearMap.range (lightConeDeriv (barH n) i c) + ≤ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + rintro _ ⟨φ, rfl⟩ + exact h.lightConeBarHiggs_mem i c φ + +/-! + +## D. The boost weight decomposition of the two submodules + +-/ + +/-- The ranges of the Higgs symbol maps, joined over the derivative indices, are the Higgs + submodule. -/ +lemma iSup_range_H (n : ℕ) : + (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (H n d)) = h.higgsSubmodule n := by + rw [higgsSubmodule] + +/-- The ranges of the conjugate-Higgs symbol maps, joined over the derivative indices, are + the conjugate-Higgs submodule. -/ +lemma iSup_range_barH (n : ℕ) : + (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (barH n d)) = h.barHiggsSubmodule n := by + rw [barHiggsSubmodule] + +/-- **The boost weight decomposition of the Higgs submodules**, along any spatial axis and + for any number of covariant derivatives: the derivative slots carry all the weight. -/ +noncomputable def higgsSubmoduleBoostWeight (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i (h.higgsSubmodule n) := + (IsDerivativeCollection.boostDecomp (H n) (h.rotatesIndices_H n) i + (higgsValueWeight i)).copy (h.iSup_range_H n) + +/-- **The boost weight decomposition of the conjugate-Higgs submodules.** -/ +noncomputable def barHiggsSubmoduleBoostWeight (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i (h.barHiggsSubmodule n) := + (IsDerivativeCollection.boostDecomp (barH n) (h.rotatesIndices_barH n) i + (barHiggsValueWeight i)).copy (h.iSup_range_barH n) + +/-- The weight-`k` piece of the Higgs submodule is the join of the light-cone symbol ranges + whose slots have total weight `k`. -/ +lemma higgsSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : + (h.higgsSubmoduleBoostWeight n i).piece k + = ⨆ (c : Fin n → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), + LinearMap.range (lightConeDeriv (H n) i c) := by + show (⨆ c : Fin n → Fin 4, + ((higgsValueWeight i).piece (k - ∑ j, lightConeWeight (c j))).map + (lightConeDeriv (H n) i c)) = _ + refine iSup_congr fun c => ?_ + by_cases hc : (∑ j, lightConeWeight (c j)) = k + · rw [show k - (∑ j, lightConeWeight (c j)) = 0 from by omega, higgsValueWeight, + WeightDecomposition.ofTrivialAction_piece, if_pos rfl, Submodule.map_top, iSup_pos hc] + · rw [higgsValueWeight, WeightDecomposition.ofTrivialAction_piece, if_neg (by omega), + Submodule.map_bot, iSup_neg hc] + +/-- The weight-`k` piece of the conjugate-Higgs submodule is the join of the light-cone + symbol ranges whose slots have total weight `k`. -/ +lemma barHiggsSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : + (h.barHiggsSubmoduleBoostWeight n i).piece k + = ⨆ (c : Fin n → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), + LinearMap.range (lightConeDeriv (barH n) i c) := by + show (⨆ c : Fin n → Fin 4, + ((barHiggsValueWeight i).piece (k - ∑ j, lightConeWeight (c j))).map + (lightConeDeriv (barH n) i c)) = _ + refine iSup_congr fun c => ?_ + by_cases hc : (∑ j, lightConeWeight (c j)) = k + · rw [show k - (∑ j, lightConeWeight (c j)) = 0 from by omega, barHiggsValueWeight, + WeightDecomposition.ofTrivialAction_piece, if_pos rfl, Submodule.map_top, iSup_pos hc] + · rw [barHiggsValueWeight, WeightDecomposition.ofTrivialAction_piece, if_neg (by omega), + Submodule.map_bot, iSup_neg hc] + +/-! + +## E. The boost weight decomposition of the Higgs derivative submodules + +-/ + +/-- **The boost weight decomposition of the Higgs derivative submodules**, along any spatial + axis and for any number of covariant derivatives: the join of the Higgs and + conjugate-Higgs decompositions. -/ +noncomputable def derivSubmoduleBoostWeight (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (n : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i (h.derivSubmodule n) := + ((h.higgsSubmoduleBoostWeight n i).sup + (h.barHiggsSubmoduleBoostWeight n i)).copy (by rw [derivSubmodule]) + +/-- **The weight-`k` piece of the Higgs derivative submodule** is spanned by the light-cone + Higgs and conjugate-Higgs symbols whose `n` slots have total weight `k`. -/ +lemma derivSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : + (h.derivSubmoduleBoostWeight n i).piece k + = (⨆ (c : Fin n → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), + LinearMap.range (lightConeDeriv (H n) i c)) + ⊔ ⨆ (c : Fin n → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), + LinearMap.range (lightConeDeriv (barH n) i c) := by + show (h.higgsSubmoduleBoostWeight n i).piece k + ⊔ (h.barHiggsSubmoduleBoostWeight n i).piece k = _ + rw [h.higgsSubmoduleBoostWeight_piece n i k, h.barHiggsSubmoduleBoostWeight_piece n i k] + +/-- The Higgs boost weights are the totals of the light-cone weights of the `n` derivative + slots. -/ +lemma higgsSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) : + (h.higgsSubmoduleBoostWeight n i).supp + = (Finset.univ ×ˢ ({0} : Finset ℤ)).image + fun p : (Fin n → Fin 4) × ℤ => (∑ j, lightConeWeight (p.1 j)) + p.2 := rfl + +/-- The conjugate-Higgs boost weights are the same totals. -/ +lemma barHiggsSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) : + (h.barHiggsSubmoduleBoostWeight n i).supp + = (Finset.univ ×ˢ ({0} : Finset ℤ)).image + fun p : (Fin n → Fin 4) × ℤ => (∑ j, lightConeWeight (p.1 j)) + p.2 := rfl + +/-- **The boost weights occurring in the Higgs derivative submodules**: the totals of the + light-cone weights of the `n` derivative slots. They do not depend on the axis. -/ +lemma derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) : + (h.derivSubmoduleBoostWeight n i).supp + = (Finset.univ : Finset (Fin n → Fin 4)).image + fun c => ∑ j, lightConeWeight (c j) := by + have hsup : (h.derivSubmoduleBoostWeight n i).supp + = (h.higgsSubmoduleBoostWeight n i).supp + ∪ (h.barHiggsSubmoduleBoostWeight n i).supp := rfl + rw [hsup, h.higgsSubmoduleBoostWeight_supp n i, h.barHiggsSubmoduleBoostWeight_supp n i] + ext k + simp [Finset.mem_image] + +/-- Every boost weight occurring in a Higgs derivative submodule is even: each slot + contributes `+2`, `-2` or `0`. -/ +lemma two_dvd_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : ℤ} + (hk : k ∈ (h.derivSubmoduleBoostWeight n i).supp) : (2 : ℤ) ∣ k := by + have hw : ∀ κ : Fin 4, + lightConeWeight κ = 2 ∨ lightConeWeight κ = -2 ∨ lightConeWeight κ = 0 := by + intro κ + simp only [lightConeWeight] + split_ifs <;> simp + rw [h.derivSubmoduleBoostWeight_supp n i, Finset.mem_image] at hk + obtain ⟨c, -, rfl⟩ := hk + refine Finset.dvd_sum fun j _ => ?_ + rcases hw (c j) with hj | hj | hj <;> rw [hj] <;> norm_num + +/-- Every boost weight occurring in a Higgs derivative submodule has absolute value at most + `2 * n`: the `n` slots contribute at most `2` each. -/ +lemma abs_le_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : ℤ} + (hk : k ∈ (h.derivSubmoduleBoostWeight n i).supp) : |k| ≤ 2 * n := by + have hw : ∀ κ : Fin 4, + lightConeWeight κ = 2 ∨ lightConeWeight κ = -2 ∨ lightConeWeight κ = 0 := by + intro κ + simp only [lightConeWeight] + split_ifs <;> simp + rw [h.derivSubmoduleBoostWeight_supp n i, Finset.mem_image] at hk + obtain ⟨c, -, rfl⟩ := hk + calc |∑ j, lightConeWeight (c j)| + ≤ ∑ j, |lightConeWeight (c j)| := Finset.abs_sum_le_sum_abs _ _ + _ ≤ ∑ _j : Fin n, (2 : ℤ) := Finset.sum_le_sum fun j _ => by + rcases hw (c j) with hj | hj | hj <;> rw [hj] <;> norm_num + _ = 2 * n := by + rw [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + ring + +/-! + +## F. The occurring weights in low order + +-/ + +/-- The boost weights of the underived Higgs: no slots, so only `0`. -/ +lemma derivSubmoduleBoostWeight_supp_zero (i : Fin 3) : + (h.derivSubmoduleBoostWeight 0 i).supp = {0} := by + rw [h.derivSubmoduleBoostWeight_supp 0 i] + decide + +/-- The boost weights of the once-derived Higgs: one slot, so `-2`, `0` or `2`. -/ +lemma derivSubmoduleBoostWeight_supp_one (i : Fin 3) : + (h.derivSubmoduleBoostWeight 1 i).supp = {-2, 0, 2} := by + rw [h.derivSubmoduleBoostWeight_supp 1 i] + decide + +/-- The boost weights of the twice-derived Higgs: two slots, so `-4` to `4`. -/ +lemma derivSubmoduleBoostWeight_supp_two (i : Fin 3) : + (h.derivSubmoduleBoostWeight 2 i).supp = {-4, -2, 0, 2, 4} := by + rw [h.derivSubmoduleBoostWeight_supp 2 i] + decide + +end IsHiggsSector + +end StandardModel + +end diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean new file mode 100644 index 000000000..9d1e0ecaa --- /dev/null +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +/-! +# The gauge weight decomposition of the Higgs sector + +The Higgs and conjugate-Higgs submodules carrying `n` derivatives each come with a gauge +weight decomposition, and the two join to one of `derivSubmodule n`. The weights that +occur are the two Higgs weights `(0, 0, ∓1, -3)` and the two conjugate-Higgs weights +`(0, 0, ±1, 3)`; they do not depend on the number of derivatives. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace IsHiggsSector + +set_option linter.unusedVariables false + +variable {B : Type} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} + {hrep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) + +/-- **The gauge weight decomposition of the Higgs derivative submodules**: the join of + the decompositions of the Higgs and conjugate-Higgs submodules, whose weights are + `(0, 0, ∓1, -3)` and `(0, 0, ±1, 3)` respectively. + + This is an instance: its statement mentions `h`, so unification against the goal + recovers the sector and with it the rest of the structure's implicit data. -/ +@[implicit_reducible] +noncomputable instance derivSubmoduleGaugeWeight (n : ℕ) : + GaugeWeightDecomposition rep (h.derivSubmodule n) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.sup (d := h.higgsSubmoduleGaugeWeight n) + (d' := h.barHiggsSubmoduleGaugeWeight n)) + _ (by rw [derivSubmodule]) + +/-- The gauge weights occurring in the Higgs derivative submodules: the two Higgs + weights `(0, 0, ∓1, -3)` and the two conjugate-Higgs weights `(0, 0, ±1, 3)`. -/ +lemma derivSubmoduleGaugeWeight_supp (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).supp + = {((0, 0, -1, -3) : GaugeWeight), (0, 0, 1, -3), (0, 0, 1, 3), (0, 0, -1, 3)} := + rfl + +end IsHiggsSector + +end StandardModel From 65d253eb68b9e8269f45f513502586ea347539d6 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 28 Aug 2026 19:07:57 +0400 Subject: [PATCH 231/254] refactor(IsQuadLorentz): remove eq_sum_pow_boostAverageTransition_smul --- .../Invariants/IsQuadLorentz.lean | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 5133bc34f..2f0e4eccf 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -530,46 +530,6 @@ lemma eq_sum_boostAverageTransition_smul {x : B} push_cast rw [mul_assoc, Finset.sum_mul] -include hT in -/-- Iterated averaged rounds: an element of weight zero along all three axes - re-expands through every power of the boost-average matrix applied to its - coefficients. -/ -lemma eq_sum_pow_boostAverageTransition_smul {x : B} - (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) - (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) (n : ℕ) : - x = ∑ d, (∑ e, (((boostAverageTransition ^ n) d e : ℚ) : ℂ) * c e) • T d := by - induction n with - | zero => - rw [hx] - refine Finset.sum_congr rfl fun d _ => ?_ - congr 1 - rw [pow_zero] - simp [Matrix.one_apply, apply_ite (fun q : ℚ => (q : ℂ)), ite_mul, Finset.sum_ite_eq] - | succ n ih => - rw [hT.eq_sum_boostAverageTransition_smul - (fun d => ∑ e, (((boostAverageTransition ^ n) d e : ℚ) : ℂ) * c e) ih hw] - refine Finset.sum_congr rfl fun d _ => ?_ - congr 1 - rw [pow_succ'] - calc ∑ e, ((boostAverageTransition d e : ℚ) : ℂ) - * ∑ f, (((boostAverageTransition ^ n) e f : ℚ) : ℂ) * c f - = ∑ e, ∑ f, ((boostAverageTransition d e : ℚ) : ℂ) - * ((((boostAverageTransition ^ n) e f : ℚ) : ℂ) * c f) := - Finset.sum_congr rfl fun e _ => by rw [Finset.mul_sum] - _ = ∑ f, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) - * (((boostAverageTransition ^ n) e f : ℚ) : ℂ)) * c f := by - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun f _ => ?_ - rw [Finset.sum_mul] - exact Finset.sum_congr rfl fun e _ => (mul_assoc _ _ _).symm - _ = ∑ e, (((boostAverageTransition * boostAverageTransition ^ n) d e : ℚ) : ℂ) - * c e := by - refine Finset.sum_congr rfl fun f _ => ?_ - congr 1 - rw [Matrix.mul_apply] - push_cast - rfl - /-! ## D. Sieving the span along the three boost axes From 1c49eb3bc0c0b027c42883118f3fc8854e95649e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 28 Aug 2026 21:31:00 +0400 Subject: [PATCH 232/254] refactor(IsQuadLorentz): clean up a proof for a lemma in section E.1 --- .../Invariants/IsQuadLorentz.lean | 46 ++++++++----------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index f145eb444..4a5f2ed5e 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -869,34 +869,24 @@ lemma sum_prod_transitionZ_coeffZ_eq_zero (c' : Fin 4 → Fin 4) = -∑ s, lightConeWeight (c'' s) := fun c'' => by rw [← Finset.sum_neg_distrib] exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c'' s) - have hrei : (∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => - (∑ s, lightConeWeight (c'' s)) = 0), - (∏ s, lightConeTransitionZ 1 2 (c' s) (c'' s)) * - (∏ s, lightConeCoeffZ 2 (c'' s) (d s))) - = ∑ c'' ∈ Finset.univ.filter (fun c'' : Fin 4 → Fin 4 => - (∑ s, lightConeWeight (c'' s)) = 0), - ((∏ s, lightConeTransitionZ 1 2 (c' s) (swap01 (c'' s))) * - (∏ s, lightConeCoeffZ 2 (swap01 (c'' s)) (d s))) := by - refine Finset.sum_nbij' (i := fun c'' => fun s => swap01 (c'' s)) - (j := fun c'' => fun s => swap01 (c'' s)) ?_ ?_ ?_ ?_ ?_ - · intro c'' hc'' - refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ - rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] - · intro c'' hc'' - refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ - rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] - · intro c'' _ - funext s - rw [swap01_swap01] - · intro c'' _ - funext s - rw [swap01_swap01] - · intro c'' _ - simp only [swap01_swap01] - have hkey := hrei.trans ((Finset.sum_congr rfl fun c'' _ => hswap c'').trans - (Finset.mul_sum _ _ _).symm) - rw [hsgn] at hkey - omega + refine Finset.sum_involution (fun c'' _ => fun s => swap01 (c'' s)) ?_ ?_ ?_ ?_ + · intro c'' _ + simp only + rw [hswap c'', hsgn, neg_one_mul] + exact add_neg_cancel _ + · intro c'' _ hne heq + refine hne ?_ + have hpt : ∀ s, swap01 (c'' s) = c'' s := fun s => congrFun heq s + have h := hswap c'' + rw [hsgn] at h + simp only [hpt, neg_one_mul] at h + exact eq_zero_of_neg_eq h.symm + · intro c'' hc'' + refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ + rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] + · intro c'' _ + funext s + exact swap01_swap01 (c'' s) /-! From a50bc712fa8b5f1bb7794004080e58ee62b9709f Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 29 Aug 2026 10:21:42 +0400 Subject: [PATCH 233/254] refactor(IsQuadLorentz): share a cancellation lemma between sections E.1 and E.2 --- .../Invariants/IsQuadLorentz.lean | 95 ++++++++----------- 1 file changed, 42 insertions(+), 53 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 4a5f2ed5e..9c40ddd69 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -796,6 +796,41 @@ lemma lightConeWeight_swap01 (κ : Fin 4) : lightConeWeight (swap01 κ) = -lightConeWeight κ := by fin_cases κ <;> rfl +/-- Null-swap cancellation: a function of light-cone multi-indices which the null swap + negates sums to zero over the weight-zero multi-indices. The swap preserves the + weight-zero condition because it negates the total weight, so it is an involution of + the summation set pairing each term with its negative. Torsion-freeness is needed + because the involution does have fixed points — the multi-indices whose entries are + all transverse — and their terms vanish only because `x = -x` forces `x = 0`. Used + along both axes, in the sign-involution cases of + `sum_prod_transitionZ_coeffZ_eq_zero` and + `weightZeroTransition_eq_zero_of_not_isPairedOrDistinct`. -/ +lemma sum_weightZero_eq_zero_of_swap01_neg {M : Type*} [AddCommGroup M] + [IsAddTorsionFree M] (f : (Fin 4 → Fin 4) → M) + (hf : ∀ c, f (fun s => swap01 (c s)) = -f c) : + ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => + (∑ s, lightConeWeight (c s)) = 0), f c = 0 := by + refine Finset.sum_involution (fun c _ => fun s => swap01 (c s)) ?_ ?_ ?_ ?_ + · intro c _ + rw [hf c] + exact add_neg_cancel _ + · intro c _ hne heq + refine hne ?_ + have h := hf c + rw [heq] at h + refine two_nsmul_eq_zero.mp ?_ + rw [two_nsmul] + exact eq_neg_iff_add_eq_zero.mp h + · intro c hc + refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ + rw [show (∑ s, lightConeWeight (swap01 (c s))) = -∑ s, lightConeWeight (c s) from by + rw [← Finset.sum_neg_distrib] + exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c s), + (Finset.mem_filter.1 hc).2, neg_zero] + · intro c _ + funext s + exact swap01_swap01 (c s) + /-- The slot identity of the sign involution: swapping the null directions of the inner index multiplies the slot factor by the sign `nuZ`. -/ lemma transitionZ_swap01_mul_coeffZ : @@ -865,28 +900,8 @@ lemma sum_prod_transitionZ_coeffZ_eq_zero (c' : Fin 4 → Fin 4) intro c'' simp only [← Finset.prod_mul_distrib] exact Finset.prod_congr rfl fun s _ => transitionZ_swap01_mul_coeffZ (c' s) (c'' s) (d s) - have hwt : ∀ c'' : Fin 4 → Fin 4, (∑ s, lightConeWeight (swap01 (c'' s))) - = -∑ s, lightConeWeight (c'' s) := fun c'' => by - rw [← Finset.sum_neg_distrib] - exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c'' s) - refine Finset.sum_involution (fun c'' _ => fun s => swap01 (c'' s)) ?_ ?_ ?_ ?_ - · intro c'' _ - simp only - rw [hswap c'', hsgn, neg_one_mul] - exact add_neg_cancel _ - · intro c'' _ hne heq - refine hne ?_ - have hpt : ∀ s, swap01 (c'' s) = c'' s := fun s => congrFun heq s - have h := hswap c'' - rw [hsgn] at h - simp only [hpt, neg_one_mul] at h - exact eq_zero_of_neg_eq h.symm - · intro c'' hc'' - refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ - rw [hwt, (Finset.mem_filter.1 hc'').2, neg_zero] - · intro c'' _ - funext s - exact swap01_swap01 (c'' s) + refine sum_weightZero_eq_zero_of_swap01_neg _ fun c'' => ?_ + rw [hswap c'', hsgn, neg_one_mul] /-! @@ -955,37 +970,11 @@ lemma weightZeroTransition_eq_zero_of_not_isPairedOrDistinct (i : Fin 3) push_cast rw [← Finset.prod_mul_distrib] exact Finset.prod_congr rfl fun s _ => invQ_swap01_mul_coeffZ_swap01 i (e s) (c s) (d s) - have hwt : ∀ c : Fin 4 → Fin 4, (∑ s, lightConeWeight (swap01 (c s))) - = -∑ s, lightConeWeight (c s) := fun c => by - rw [← Finset.sum_neg_distrib] - exact Finset.sum_congr rfl fun s _ => lightConeWeight_swap01 (c s) - have hrei : weightZeroTransition i d e - = ∑ c ∈ Finset.univ.filter (fun c : Fin 4 → Fin 4 => - (∑ s, lightConeWeight (c s)) = 0), - ∏ s, lightConeCoeffInvQ i (e s) (swap01 (c s)) * - (lightConeCoeffZ i (swap01 (c s)) (d s) : ℚ) := by - rw [weightZeroTransition_eq_sum_lightCone] - refine Finset.sum_nbij' (i := fun c => fun s => swap01 (c s)) - (j := fun c => fun s => swap01 (c s)) ?_ ?_ ?_ ?_ ?_ - · intro c hc - exact Finset.mem_filter.2 ⟨Finset.mem_univ _, by - rw [hwt, (Finset.mem_filter.1 hc).2, neg_zero]⟩ - · intro c hc - exact Finset.mem_filter.2 ⟨Finset.mem_univ _, by - rw [hwt, (Finset.mem_filter.1 hc).2, neg_zero]⟩ - · intro c _ - funext s - rw [swap01_swap01] - · intro c _ - funext s - rw [swap01_swap01] - · intro c _ - simp only [swap01_swap01] - have hkey := hrei.trans ((Finset.sum_congr rfl fun c _ => hswap c).trans - (Finset.mul_sum _ _ _).symm) - rw [← weightZeroTransition_eq_sum_lightCone, hsgn] at hkey - push_cast at hkey - linarith [hkey] + rw [weightZeroTransition_eq_sum_lightCone] + refine sum_weightZero_eq_zero_of_swap01_neg _ fun c => ?_ + rw [hswap c, hsgn] + push_cast + ring · push Not at hA obtain ⟨s₀, hs₀⟩ := hA rw [weightZeroTransition_eq_sum_lightCone] From 55d7fb65eb846739968ea94df2d5487d356323bb Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 29 Aug 2026 18:35:36 +0400 Subject: [PATCH 234/254] refactor(IsQuadLorentz): relocate cyclic axis rotation --- .../StandardModel/IsHiggsSector/Basic.lean | 48 +--------- .../Invariants/IsQuadLorentz.lean | 12 +-- Physlib/Relativity/SL2C/AxisRotations.lean | 89 +++++++++++++++++-- 3 files changed, 89 insertions(+), 60 deletions(-) diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean index 430f92768..93e31504a 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Relativity.LightConeDeriv +public import Physlib.Relativity.SL2C.AxisRotations public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition @@ -77,7 +78,7 @@ So we must have that `(u+v+w) TT = (u+v+w) M / 4`, and hence namespace StandardModel -open TensorProduct Matrix MatrixGroups Lorentz +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.SL2C /-- The pair of symbol maps `H`, `barH` in the algebra `B` is an *algebra-valued Higgs* for @@ -4106,51 +4107,6 @@ the extreme boost-weight components along each axis tie that mean to the coeffic -/ -/-- The cyclic permutation of the coordinate directions: time is fixed and the spatial - directions rotate `x → y → z → x`. -/ -def cycDir : Fin 1 ⊕ Fin 3 → Fin 1 ⊕ Fin 3 := Sum.map id (· + 1) - -@[simp] lemma cycDir_inl : cycDir (Sum.inl 0) = Sum.inl 0 := rfl - -@[simp] lemma cycDir_inr (m : Fin 3) : cycDir (Sum.inr m) = Sum.inr (m + 1) := rfl - -/-- Composing the cyclic direction with a two-slot index vector. -/ -lemma cycDir_comp_two (μ ν : Fin 1 ⊕ Fin 3) : - (fun j => cycDir (![μ, ν] j)) = ![cycDir μ, cycDir ν] := by - funext j - fin_cases j <;> rfl - -/-- Composing the cyclic direction with a one-slot index vector. -/ -lemma cycDir_comp_one (μ : Fin 1 ⊕ Fin 3) : - (fun j => cycDir (![μ] j)) = ![cycDir μ] := by - funext j - fin_cases j - rfl - -/-- Composing the cyclic direction with the empty index vector. -/ -lemma cycDir_comp_nil : (fun j : Fin 0 => cycDir (![] j)) = ![] := by - funext j - exact j.elim0 - -/-- **The cyclic rotation** `x → y → z → x` as an element of `SL(2,ℂ)`: the rotation by - `2π/3` about the diagonal spatial axis. -/ -noncomputable def rotationCycle : SL(2,ℂ) := - ⟨(2 : ℂ)⁻¹ • !![1 - Complex.I, -(1 + Complex.I); 1 - Complex.I, 1 + Complex.I], by - rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin] - simp [Complex.ext_iff] - norm_num⟩ - -/-- **The Lorentz matrix of the cyclic rotation is the permutation matrix of `cycDir`.** -/ -lemma toLorentzGroup_rotationCycle_apply (a b : Fin 1 ⊕ Fin 3) : - (SL2C.toLorentzGroup rotationCycle).1 a b = if a = cycDir b then 1 else 0 := by - refine Complex.ofReal_injective ?_ - rw [SL2C.toLorentzGroup_eq_trace, PauliMatrix.trace_pauliSelfAdjoint'_mul_apply] - rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - simp [rotationCycle, cycDir, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.mul_apply, Matrix.conjTranspose_apply, Fin.sum_univ_two, - Complex.ext_iff] <;> - norm_num - /-- **The cyclic rotation acts on inner-product monomials by cycling every derivative index.** -/ lemma repLorentz_rotationCycle_dotGaugeHiggs {n1 n2 : ℕ} diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 9c40ddd69..01ac50db1 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -15,7 +15,8 @@ public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim -public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Relativity.LightConeDeriv +public import Physlib.Relativity.SL2C.AxisRotations public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps @@ -47,7 +48,7 @@ collapses the iterated rounds to the projector onto the four contractions (H, I, namespace Lorentz -open TensorProduct Matrix MatrixGroups Lorentz +open TensorProduct Matrix MatrixGroups Lorentz SL2C /-! @@ -106,8 +107,7 @@ weight `∑ j, lightConeWeight (c j)`. -/ -open StandardModel.IsHiggsSector StandardModel.IsHiggsSector.IsDerivativeCollection - BoostWeight +open BoostWeight /-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ noncomputable def lightCone (hT : IsQuadLorentz B repLorentz T) (i : Fin 3) (c : Fin 4 → Fin 4) : B := @@ -1114,10 +1114,6 @@ lemma boostAverageTransition_cycDir (d e : Fin 4 → Fin 1 ⊕ Fin 3) : exact (Fintype.sum_equiv (Equiv.addRight (1 : Fin 3)) _ _ fun i => (weightZeroTransition_cycDir i d e).symm).symm -/-- The cyclic rotation of directions has order three. -/ -lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ)) = μ := by - decide - /-- Rotating the column index moves a double rotation to the row index. -/ lemma boostAverageTransition_cycDir_right (d e : Fin 4 → Fin 1 ⊕ Fin 3) : boostAverageTransition d (fun s => cycDir (e s)) diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean index a4b8022ff..c82c5ab61 100644 --- a/Physlib/Relativity/SL2C/AxisRotations.lean +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -9,16 +9,19 @@ public import Physlib.Relativity.SL2C.Basic /-! # Coordinate-axis rotations in `SL(2,ℂ)` -This file defines chosen `SL(2,ℂ)` rotations carrying the `z`-axis to a selected coordinate axis. -The spatial-axis convention is `0 = x`, `1 = y`, and `2 = z`; consequently, the rotation associated -with axis `2` is the identity. +This file defines chosen `SL(2,ℂ)` rotations associated with the spatial coordinate axes. The +spatial-axis convention is `0 = x`, `1 = y`, and `2 = z`. -Conjugation by these rotations transports a matrix written in the diagonal `z`-axis basis to -the corresponding coordinate-axis basis. This provides the common change of basis used by -coordinate-axis boosts and later constructions based on diagonal representatives. +The cyclic rotation is the rotation by `2π/3` about the diagonal spatial axis. Its Lorentz matrix +fixes time and permutes the spatial directions as `x → y → z → x`. The rotations from the `z`-axis +to a selected coordinate axis provide the common change of basis used by coordinate-axis boosts +and later constructions based on diagonal representatives. The main declarations are: +- `Lorentz.cycDir`, the cyclic permutation of Lorentz direction labels; +- `rotationCycle`, the cyclic rotation in `SL(2,ℂ)`; +- `toLorentzGroup_rotationCycle_apply`, its Lorentz matrix; - `rotationZToAxis`, the indexed family of rotations; - `rotationZToAxis_zero_apply` and its companions, their matrix entries; - `rotationZToAxis_zero_mul_diagonal_mul_inv` and its companions, their action on a @@ -27,6 +30,80 @@ The main declarations are: @[expose] public section +/-! + +## A. The cyclic coordinate rotation + +-/ + +namespace Lorentz + +/-- The cyclic permutation of Lorentz direction labels: time is fixed and the spatial +directions rotate as `x → y → z → x`. -/ +def cycDir : Fin 1 ⊕ Fin 3 → Fin 1 ⊕ Fin 3 := Sum.map id (· + 1) + +/-- The cyclic permutation fixes the time direction. -/ +@[simp] lemma cycDir_inl : cycDir (Sum.inl 0) = Sum.inl 0 := rfl + +/-- The cyclic permutation advances a spatial direction by one. -/ +@[simp] lemma cycDir_inr (m : Fin 3) : cycDir (Sum.inr m) = Sum.inr (m + 1) := rfl + +/-- Composing the cyclic permutation with a two-slot index vector rotates both entries. -/ +lemma cycDir_comp_two (μ ν : Fin 1 ⊕ Fin 3) : + (fun j => cycDir (![μ, ν] j)) = ![cycDir μ, cycDir ν] := by + funext j + fin_cases j <;> rfl + +/-- Composing the cyclic permutation with a one-slot index vector rotates its entry. -/ +lemma cycDir_comp_one (μ : Fin 1 ⊕ Fin 3) : + (fun j => cycDir (![μ] j)) = ![cycDir μ] := by + funext j + fin_cases j + rfl + +/-- Composing the cyclic permutation with the empty index vector is the empty vector. -/ +lemma cycDir_comp_nil : (fun j : Fin 0 => cycDir (![] j)) = ![] := by + funext j + exact j.elim0 + +/-- The cyclic permutation of Lorentz direction labels has order three. -/ +lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ)) = μ := by + decide + +namespace SL2C + +open Matrix MatrixGroups + +/-- The cyclic rotation `x → y → z → x` in `SL(2,ℂ)`, realized as the rotation by +`2π/3` about the diagonal spatial axis. -/ +noncomputable def rotationCycle : SL(2,ℂ) := + ⟨(2 : ℂ)⁻¹ • !![1 - Complex.I, -(1 + Complex.I); 1 - Complex.I, 1 + Complex.I], by + rw [Matrix.det_smul, Matrix.det_fin_two_of, Fintype.card_fin] + simp [Complex.ext_iff] + norm_num⟩ + +/-- The Lorentz matrix of `rotationCycle`: it is the permutation matrix associated with +`cycDir`. -/ +lemma toLorentzGroup_rotationCycle_apply (a b : Fin 1 ⊕ Fin 3) : + (toLorentzGroup rotationCycle).1 a b = if a = cycDir b then 1 else 0 := by + refine Complex.ofReal_injective ?_ + rw [toLorentzGroup_eq_trace, PauliMatrix.trace_pauliSelfAdjoint'_mul_apply] + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + simp [rotationCycle, cycDir, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.mul_apply, Matrix.conjTranspose_apply, Fin.sum_univ_two, + Complex.ext_iff] <;> + norm_num + +end SL2C + +end Lorentz + +/-! + +## B. Rotations from the `z`-axis + +-/ + namespace Lorentz.SL2C open Matrix MatrixGroups From 85f63a9d4f83aa1bf3cf2b3ad1c9772e4e824ea1 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 29 Aug 2026 19:56:55 +0400 Subject: [PATCH 235/254] refactor(IsQuadLorentz): prove cyclic direction order analytically --- Physlib/Relativity/SL2C/AxisRotations.lean | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean index c82c5ab61..2710630ed 100644 --- a/Physlib/Relativity/SL2C/AxisRotations.lean +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -68,7 +68,14 @@ lemma cycDir_comp_nil : (fun j : Fin 0 => cycDir (![] j)) = ![] := by /-- The cyclic permutation of Lorentz direction labels has order three. -/ lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ)) = μ := by - decide + rintro (μ | μ) + · rfl + · simp only [cycDir, Sum.map_inr] + congr 1 + calc + (μ + 1 + 1) + 1 = μ + ((1 + 1 + 1) : Fin 3) := by ac_rfl + _ = μ + 0 := rfl + _ = μ := add_zero μ namespace SL2C From 6e51fbd44d5434b37ac5f39df213025ad52c1ffe Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 29 Aug 2026 21:52:51 +0400 Subject: [PATCH 236/254] refactor(IsQuadLorentz): remove decide from light-cone weight range proofs --- .../Invariants/IsQuadLorentz.lean | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 01ac50db1..eb5acd678 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -332,16 +332,31 @@ lemma eq_sum_monoComponent (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : rw [Finset.filter_comm, monoComponent] exact Finset.sum_filter_of_ne fun c _ => hne c +/-- The total light-cone weight of four slots is even and lies between `-8` and `8`. -/ +lemma sum_lightConeWeight_mem (c : Fin 4 → Fin 4) : + (∑ s, lightConeWeight (c s)) ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ) := by + have hweight (κ : Fin 4) : + ∃ q : ℤ, -1 ≤ q ∧ q ≤ 1 ∧ lightConeWeight κ = 2 * q := by + fin_cases κ + · exact ⟨1, by norm_num [lightConeWeight]⟩ + · exact ⟨-1, by norm_num [lightConeWeight]⟩ + · exact ⟨0, by norm_num [lightConeWeight]⟩ + · exact ⟨0, by norm_num [lightConeWeight]⟩ + obtain ⟨q0, hq0_lower, hq0_upper, hq0⟩ := hweight (c 0) + obtain ⟨q1, hq1_lower, hq1_upper, hq1⟩ := hweight (c 1) + obtain ⟨q2, hq2_lower, hq2_upper, hq2⟩ := hweight (c 2) + obtain ⟨q3, hq3_lower, hq3_upper, hq3⟩ := hweight (c 3) + rw [Fin.sum_univ_four, hq0, hq1, hq2, hq3] + simp only [Finset.mem_insert, Finset.mem_singleton] + omega + set_option maxRecDepth 10000 in /-- A component is the sum of its weight components over the full weight set: as `eq_sum_monoComponent` but over the fixed weight set common to all components. -/ lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) : T e = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.monoComponent i e m := by - have hall : ∀ c : Fin 4 → Fin 4, - (∑ s, lightConeWeight (c s)) ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ) := by - decide rw [hT.eq_sum_lightCone i e] - exact (Finset.sum_fiberwise_of_maps_to (fun c _ => hall c) _).symm + exact (Finset.sum_fiberwise_of_maps_to (fun c _ => sum_lightConeWeight_mem c) _).symm /-! @@ -720,10 +735,8 @@ set_option maxRecDepth 10000 in lemma lightCone_eq_sum_boostComponent (i j : Fin 3) (c : Fin 4 → Fin 4) : hT.lightCone i c = ∑ m ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ), hT.boostComponent i j c m := by - have hall : ∀ c' : Fin 4 → Fin 4, - (∑ s, lightConeWeight (c' s)) ∈ ({-8, -6, -4, -2, 0, 2, 4, 6, 8} : Finset ℤ) := by decide rw [hT.lightCone_eq_sum_lightCone i j c] - exact (Finset.sum_fiberwise_of_maps_to (fun c' _ => hall c') _).symm + exact (Finset.sum_fiberwise_of_maps_to (fun c' _ => sum_lightConeWeight_mem c') _).symm /-- The tied pieces along the third axis: for each generator of the doubly-weight-zero part, the span of its weight-`m` component along the last axis. -/ From 4f17db48e1c2b1ceeca1273702db18873fb06cc2 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 30 Aug 2026 19:18:30 +0400 Subject: [PATCH 237/254] refactor(IsQuadLorentz): prove cyclic and orbit lemmas analytically --- .../LorentzGroup/Invariants/IsQuadLorentz.lean | 14 ++++++++++++-- Physlib/Relativity/SL2C/AxisRotations.lean | 5 +++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index eb5acd678..5448976bf 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -1368,7 +1368,11 @@ lemma isPairedOrDistinct_of_mem_rotationSubset : lemma isPairedOrDistinct_cycDir : ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, IsPairedOrDistinct d → IsPairedOrDistinct (fun s => cycDir (d s)) := by - decide +kernel + rintro d (⟨h01, h23⟩ | ⟨h02, h13⟩ | ⟨h03, h12⟩ | hinj) + · exact Or.inl ⟨congrArg cycDir h01, congrArg cycDir h23⟩ + · exact Or.inr (Or.inl ⟨congrArg cycDir h02, congrArg cycDir h13⟩) + · exact Or.inr (Or.inr (Or.inl ⟨congrArg cycDir h03, congrArg cycDir h12⟩)) + · exact Or.inr (Or.inr (Or.inr (cycDir_injective.comp hinj))) /-- The multiplicity with which `d` appears among the three rotations of `e`. -/ def rotationOrbitCoeff (e d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := @@ -1399,7 +1403,13 @@ lemma cycDir_orbit_distinct : ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, (fun s => cycDir (d s)) ≠ d → ((fun s => cycDir (cycDir (d s))) ≠ d ∧ (fun s => cycDir (cycDir (d s))) ≠ (fun s => cycDir (d s))) := by - decide +kernel + intro d hd + constructor + · refine fun h => hd (funext fun s => ?_) + have h3 := congrArg cycDir (congrFun h s) + rw [cycDir_cycDir_cycDir] at h3 + exact h3.symm + · exact fun h => hd (funext fun s => cycDir_injective (congrFun h s)) /-- The orbit indicator of a good index vanishes on every bad index. -/ lemma rotationOrbitCoeff_eq_zero {r d : Fin 4 → Fin 1 ⊕ Fin 3} diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean index 2710630ed..b230c190c 100644 --- a/Physlib/Relativity/SL2C/AxisRotations.lean +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -77,6 +77,11 @@ lemma cycDir_cycDir_cycDir : ∀ μ : Fin 1 ⊕ Fin 3, cycDir (cycDir (cycDir μ _ = μ + 0 := rfl _ = μ := add_zero μ +/-- The cyclic permutation of Lorentz direction labels is injective: applying it twice +more returns the original label. -/ +lemma cycDir_injective : Function.Injective cycDir := + Function.LeftInverse.injective (g := fun μ => cycDir (cycDir μ)) cycDir_cycDir_cycDir + namespace SL2C open Matrix MatrixGroups From 9e52761b974e10c2774c147f141bc380989e4de4 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 30 Aug 2026 20:01:32 +0400 Subject: [PATCH 238/254] refactor(SL2C): relocate a lemma to AxisRotations --- .../LorentzGroup/Invariants/IsQuadLorentz.lean | 13 ------------- Physlib/Relativity/SL2C/AxisRotations.lean | 13 +++++++++++++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 5448976bf..b757bde92 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -1398,19 +1398,6 @@ lemma rotationOrbitCoeff_orbitRepOf : = if (fun s => cycDir (d s)) = d then 3 else 1 := by decide +kernel -/-- An index not fixed by the rotation has three distinct rotations. -/ -lemma cycDir_orbit_distinct : - ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, (fun s => cycDir (d s)) ≠ d → - ((fun s => cycDir (cycDir (d s))) ≠ d - ∧ (fun s => cycDir (cycDir (d s))) ≠ (fun s => cycDir (d s))) := by - intro d hd - constructor - · refine fun h => hd (funext fun s => ?_) - have h3 := congrArg cycDir (congrFun h s) - rw [cycDir_cycDir_cycDir] at h3 - exact h3.symm - · exact fun h => hd (funext fun s => cycDir_injective (congrFun h s)) - /-- The orbit indicator of a good index vanishes on every bad index. -/ lemma rotationOrbitCoeff_eq_zero {r d : Fin 4 → Fin 1 ⊕ Fin 3} (hr : IsPairedOrDistinct r) (hd : ¬IsPairedOrDistinct d) : diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean index b230c190c..afc25c11d 100644 --- a/Physlib/Relativity/SL2C/AxisRotations.lean +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -82,6 +82,19 @@ more returns the original label. -/ lemma cycDir_injective : Function.Injective cycDir := Function.LeftInverse.injective (g := fun μ => cycDir (cycDir μ)) cycDir_cycDir_cycDir +/-- An index not fixed by the rotation has three distinct rotations. -/ +lemma cycDir_orbit_distinct : + ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, (fun s => cycDir (d s)) ≠ d → + ((fun s => cycDir (cycDir (d s))) ≠ d + ∧ (fun s => cycDir (cycDir (d s))) ≠ (fun s => cycDir (d s))) := by + intro d hd + constructor + · refine fun h => hd (funext fun s => ?_) + have h3 := congrArg cycDir (congrFun h s) + rw [cycDir_cycDir_cycDir] at h3 + exact h3.symm + · exact fun h => hd (funext fun s => cycDir_injective (congrFun h s)) + namespace SL2C open Matrix MatrixGroups From 91398ccaba67fba42d53ef3782805bcd1a4939de Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 30 Aug 2026 20:33:40 +0400 Subject: [PATCH 239/254] refactor(SL2C): generalize a lemma to an arbitrary index type --- Physlib/Relativity/SL2C/AxisRotations.lean | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean index afc25c11d..0383b59b6 100644 --- a/Physlib/Relativity/SL2C/AxisRotations.lean +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -83,8 +83,8 @@ lemma cycDir_injective : Function.Injective cycDir := Function.LeftInverse.injective (g := fun μ => cycDir (cycDir μ)) cycDir_cycDir_cycDir /-- An index not fixed by the rotation has three distinct rotations. -/ -lemma cycDir_orbit_distinct : - ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, (fun s => cycDir (d s)) ≠ d → +lemma cycDir_orbit_distinct {ι : Type*} : + ∀ d : ι → Fin 1 ⊕ Fin 3, (fun s => cycDir (d s)) ≠ d → ((fun s => cycDir (cycDir (d s))) ≠ d ∧ (fun s => cycDir (cycDir (d s))) ≠ (fun s => cycDir (d s))) := by intro d hd From a5ed4f9feeff69636fc1aa93c46d1db4a9909737 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 31 Aug 2026 05:52:41 +0100 Subject: [PATCH 240/254] feat: Add section to IsQuadLorentz --- .../Invariants/IsQuadLorentz.lean | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index b757bde92..a9098e94c 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -2616,6 +2616,112 @@ theorem exists_smul_contraction_of_invariant {x : B} (hx : x ∈ hT.span) (mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv) +/-! + +## J.3. The classification modulo a Lorentz-stable submodule + +A Lorentz-stable submodule can be divided out: the quotient representation carries the +images of the components as a quadruple Lorentz tensor again, so the classification +applies verbatim in the quotient and lifts to a classification modulo the submodule. + +-/ + +/-- The representation induced on the quotient by a Lorentz-stable submodule. -/ +noncomputable def quotRep (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + Representation ℂ SL(2,ℂ) (B ⧸ S) where + toFun g := S.mapQ S (repLorentz g) fun y hy => hS g y hy + map_one' := by + ext y + simp only [LinearMap.coe_comp, Function.comp_apply, Submodule.mkQ_apply, + Submodule.mapQ_apply, map_one, Module.End.one_apply] + map_mul' g₁ g₂ := by + ext y + simp only [LinearMap.coe_comp, Function.comp_apply, Submodule.mkQ_apply, + Submodule.mapQ_apply, map_mul, Module.End.mul_apply] + +@[simp] +lemma quotRep_mkQ (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (g : SL(2,ℂ)) (y : B) : + quotRep (repLorentz := repLorentz) S hS g (S.mkQ y) = S.mkQ (repLorentz g y) := rfl + +include hT in +/-- The images of the components in the quotient by a Lorentz-stable submodule again + form a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_quotRep (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + IsQuadLorentz (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + (fun l => S.mkQ (T l)) where + repLorentz_T g l := by + rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The quotient map carries the outer contraction to the outer contraction of the + images. -/ +lemma mkQ_outerContraction (S : Submodule ℂ B) : + S.mkQ (outerContraction (T := T)) = outerContraction (T := fun l => S.mkQ (T l)) := by + rw [outerContraction, outerContraction, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + +/-- The quotient map carries the inner contraction to the inner contraction of the + images. -/ +lemma mkQ_innerContraction (S : Submodule ℂ B) : + S.mkQ (innerContraction (T := T)) = innerContraction (T := fun l => S.mkQ (T l)) := by + rw [innerContraction, innerContraction, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + +/-- The quotient map carries the split contraction to the split contraction of the + images. -/ +lemma mkQ_splitContraction (S : Submodule ℂ B) : + S.mkQ (splitContraction (T := T)) = splitContraction (T := fun l => S.mkQ (T l)) := by + rw [splitContraction, splitContraction, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + +/-- The quotient map carries the Levi-Civita contraction to the Levi-Civita contraction + of the images. -/ +lemma mkQ_epsilonContraction (S : Submodule ℂ B) : + S.mkQ (epsilonContraction (T := T)) = epsilonContraction (T := fun l => S.mkQ (T l)) := by + rw [epsilonContraction, epsilonContraction, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + +include hT in +/-- The classification of the Lorentz invariants modulo a stable submodule: an + element of the span of the components together with a Lorentz-stable submodule `S`, + fixed by the Lorentz group, is a linear combination of the four contractions up to an + error in `S`. The classification is applied in the quotient by `S`, where the images + of the components form a quadruple Lorentz tensor again. -/ +lemma exists_smul_contraction_of_invariant_subset {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a₁ a₂ a₃ a₄ : ℂ, ∃ y ∈ S, + x = a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) + y := by + have hT' := hT.isQuadLorentz_quotRep S hS + -- the class of `x` lies in the span of the images of the components + have hmk : S.mkQ x ∈ hT'.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hT'.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + -- and is invariant for the quotient action + have hinv' : ∀ g : SL(2,ℂ), + quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := by + intro g + rw [quotRep_mkQ, hinv g] + obtain ⟨a₁, a₂, a₃, a₄, hcomb⟩ := hT'.exists_smul_contraction_of_invariant hmk hinv' + rw [← mkQ_outerContraction, ← mkQ_innerContraction, ← mkQ_splitContraction, + ← mkQ_epsilonContraction] at hcomb + refine ⟨a₁, a₂, a₃, a₄, x - (a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T)), ?_, by abel⟩ + have hker : x - (a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T)) + ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, hcomb] + simp only [map_add, map_smul] + abel + rwa [Submodule.ker_mkQ] at hker end IsQuadLorentz From 74c3ca4c85a14494a3f552ad09612e5bcd77ca29 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 31 Aug 2026 09:01:41 +0400 Subject: [PATCH 241/254] refactor(IsQuadLorentz): remove decide from the odd count case --- .../Invariants/IsQuadLorentz.lean | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index a9098e94c..5e0b1c48e 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -852,7 +852,40 @@ lemma transitionZ_swap01_mul_coeffZ : = nuZ a μ * (lightConeTransitionZ 1 2 a κ * lightConeCoeffZ 2 κ μ) := by decide -set_option maxRecDepth 40000 in +/-- Weight balance is a parity constraint on the null slots: a weight-zero light-cone + multi-index uses the two null directions equally often, and so uses an even number of + them. -/ +lemma even_card_null_of_sum_lightConeWeight_eq_zero (c : Fin 4 → Fin 4) + (hc : (∑ s, lightConeWeight (c s)) = 0) : + Even (Finset.univ.filter fun s => c s = 0 ∨ c s = 1).card := by + have hw (κ : Fin 4) : + lightConeWeight κ = 2 * (if κ = 0 then 1 else 0) - 2 * (if κ = 1 then 1 else 0) := by + fin_cases κ <;> simp [lightConeWeight] + have hsum : (2 : ℤ) * ((Finset.univ.filter fun s => c s = 0).card : ℤ) + - 2 * ((Finset.univ.filter fun s => c s = 1).card : ℤ) = 0 := by + rw [← hc] + simp only [hw, Finset.sum_sub_distrib, ← Finset.mul_sum, Finset.sum_boole] + have hdisj : Disjoint (Finset.univ.filter fun s : Fin 4 => c s = 0) + (Finset.univ.filter fun s : Fin 4 => c s = 1) := + Finset.disjoint_filter.2 fun s _ h0 h1 => by simp [h0] at h1 + have hunion : (Finset.univ.filter fun s => c s = 0 ∨ c s = 1).card + = (Finset.univ.filter fun s => c s = 0).card + + (Finset.univ.filter fun s => c s = 1).card := by + rw [Finset.filter_or, Finset.card_union_of_disjoint hdisj] + rw [hunion] + exact ⟨(Finset.univ.filter fun s => c s = 0).card, by omega⟩ + +/-- The axis-`2` coefficients are sector-block-diagonal: where a slot factor is nonzero, + the inner light-cone index is null exactly when the outer direction lies in the null + sector. The transverse directions match one to one instead. -/ +lemma null_iff_of_lightConeCoeffZ_ne_zero (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) + (h : lightConeCoeffZ 2 κ μ ≠ 0) : + (μ = Sum.inl 0 ∨ μ = Sum.inr 2) ↔ (κ = 0 ∨ κ = 1) := by + rcases μ with a | j + · rw [Subsingleton.elim a 0] at h ⊢ + fin_cases κ <;> simp_all [lightConeCoeffZ] + · fin_cases j <;> fin_cases κ <;> simp_all [lightConeCoeffZ] + /-- The odd-count case: if the number of null-sector indices of `d` is odd, every weight-zero inner index hits a vanishing coefficient. -/ lemma exists_coeffZ_eq_zero_of_odd : @@ -860,7 +893,13 @@ lemma exists_coeffZ_eq_zero_of_odd : Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card → ∀ c'' : Fin 4 → Fin 4, (∑ s, lightConeWeight (c'' s)) = 0 → ∃ s, lightConeCoeffZ 2 (c'' s) (d s) = 0 := by - decide + intro d hodd c'' hc'' + by_contra hne + push Not at hne + rw [Finset.filter_congr fun s _ => + null_iff_of_lightConeCoeffZ_ne_zero (c'' s) (d s) (hne s)] at hodd + exact (Nat.not_even_iff_odd.2 hodd) + (even_card_null_of_sum_lightConeWeight_eq_zero c'' hc'') set_option maxRecDepth 40000 in /-- The parity of the sign involution: over a weight-zero generator, a component that From 3033ce9ee2e5dadb5f54bf8a9d9eaf267ffe5039 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 31 Aug 2026 09:08:47 +0100 Subject: [PATCH 242/254] refactor: Some more TODOs --- Physlib.lean | 11 + Physlib/Meta/Basic.lean | 14 +- Physlib/Meta/TODO/Basic.lean | 109 ++- .../StandardModel/GaugeAlgebra/Basis.lean | 71 ++ .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 173 ++++ .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 653 ++++++++++++++ .../GaugeGroup/Invariants/IsU1BiAdjoint.lean | 171 ++++ .../GaugeGroup/SU2PermDecomposition.lean | 13 + .../GaugeGroup/SU3PermDecomposition.lean | 426 +++++++++ .../MassWeight/GaugeWeightDecomposition.lean | 765 ++++++++++++++++ .../StandardModel/IsGaugeSector/Basic.lean | 48 + .../IsGaugeSector/MassWeight/BiAdjoint.lean | 304 +++++++ .../MassWeight/GaugeWeightDecomposition.lean | 77 +- .../MassWeight/SU2PermDecomposition.lean | 846 ++++++++++++++++++ .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 478 ++++++++++ .../LorentzGroup/Invariants/IsBiLorentz.lean | 747 ++++++++++++++++ .../Invariants/IsLeftRightWeyl.lean | 566 ++++++++++++ .../Invariants/IsSingleLorentz.lean | 446 +++++++++ scripts/MetaPrograms/TODO_to_yml.lean | 16 +- scripts/insert_todo.py | 215 +++++ scripts/todos.py | 38 +- 21 files changed, 6122 insertions(+), 65 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/SU2PermDecomposition.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean create mode 100644 scripts/insert_todo.py diff --git a/Physlib.lean b/Physlib.lean index 930fca764..7fab34fe6 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -224,7 +224,11 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDer public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsU1BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic @@ -268,7 +272,9 @@ public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.Gau public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.Basic public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.BiAdjoint public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.SU2PermDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic @@ -450,6 +456,11 @@ public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Relativity.LorentzGroup.Boosts.Basic public import Physlib.Relativity.LorentzGroup.Boosts.Generalized public import Physlib.Relativity.LorentzGroup.FermionicParity +public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl +public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.IsLeftRightWeyl +public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.IsSingleLorentz public import Physlib.Relativity.LorentzGroup.Orthochronous.Basic public import Physlib.Relativity.LorentzGroup.Proper public import Physlib.Relativity.LorentzGroup.Restricted.Basic diff --git a/Physlib/Meta/Basic.lean b/Physlib/Meta/Basic.lean index af79d34ec..e302e3b88 100644 --- a/Physlib/Meta/Basic.lean +++ b/Physlib/Meta/Basic.lean @@ -98,9 +98,17 @@ variable {m} [Monad m] [MonadEnv m] [MonadLiftT BaseIO m] def toRelativeFilePath (c : Name) : System.FilePath := System.FilePath.join "." c.toFilePath -/-- Turns a name, which represents a module, into a link to github. -/ -def toGitHubLink (c : Name) (line : Nat) : String := - s!"https://github.com/leanprover-community/physlib/blob/master/{c.toFilePath}#L{line}" +/-- The fragment of a github link naming a line, or a range of lines, of a file. +This is `#L82` for a single line, and `#L201-L223` for a range of lines. A value of +`endLine` which is not after `line` is taken to mean that only `line` is named. -/ +def gitHubLineFragment (line : Nat) (endLine : Nat := 0) : String := + if line < endLine then s!"#L{line}-L{endLine}" else s!"#L{line}" + +/-- Turns a name, which represents a module, into a link to github. The optional +`endLine` makes the link name the range of lines `line` to `endLine`. -/ +def toGitHubLink (c : Name) (line : Nat) (endLine : Nat := 0) : String := + s!"https://github.com/leanprover-community/physlib/blob/master/{c.toFilePath}" ++ + gitHubLineFragment line endLine /-- Given a name, returns the line number. -/ def lineNumber (c : Name) : m Nat := do diff --git a/Physlib/Meta/TODO/Basic.lean b/Physlib/Meta/TODO/Basic.lean index 76d33d90d..b2cfee2b7 100644 --- a/Physlib/Meta/TODO/Basic.lean +++ b/Physlib/Meta/TODO/Basic.lean @@ -10,6 +10,49 @@ public meta import Lean.Elab.Command # Basic underlying structure for TODOs. +A `TODO "..."` command records a note about the module it appears in. + +A TODO item can also record the range of lines of code that the note is about. This is +done with an optional `(lines := ...)` clause, which comes between `TODO` and the string: + +- `TODO (lines := 82) "..."` refers to line `82` of the module. +- `TODO (lines := 201-223) "..."` refers to lines `201` to `223` of the module. + +A TODO item written without such a clause refers to the line the command itself is on, +which is the behaviour of every TODO item written before ranges of lines existed. + +The ranges are rendered in the form used by links into GitHub, so `#L82` for a single +line and `#L201-L223` for a range of lines. + +## Note on the syntax + +The clause is written `(lines := 201-223)` rather than `#L201-L223` because the latter +would need `#L` and `-L` as new tokens for the whole of Physlib, and `-L` in particular +already occurs in Physlib as the negation of a term whose name starts with `L`. + +## Writing one from the editor + +Selecting the lines a note is about and running the task `Physlib: TODO about selection` +from the command palette writes the command for you, and puts the cursor between the +quotes of the note ready to type. It goes at the nearest position below the selection at +which a command is legal, which is not in general the line below the selection: a `TODO` +inside a term, a tactic block, a docstring or a `/- -/` comment does not parse, so the +placement steps down past any of those, and past the end of the enclosing declaration. +The line range in the clause is the range that was selected, not where the command ended +up. + +The command goes below the selection rather than above it so that the lines it names are +still the lines it was written about: the clause counts lines of the file, and a command +inserted above the selection would push the selection down. + +The task is defined in `.vscode/tasks.json` and calls `scripts/insert_todo.py`, which can +also be run directly. To reach it with one keystroke, bind the task in `keybindings.json`: + +``` +{ "key": "cmd+shift+t", "command": "workbench.action.tasks.runTask", + "args": "Physlib: TODO about selection" } +``` + -/ @[expose] public section @@ -23,8 +66,12 @@ structure todoInfo where content : String /-- The file name where the note came from. -/ fileName : Name - /-- The line from where the note came from. -/ + /-- The line from where the note came from. If the note carries a range of lines, + this is the first line of that range. -/ line : Nat + /-- The last line of the range of lines the note is about. For a note which does not + carry a range of lines this is equal to `line`. -/ + endLine : Nat := line /-- The tag of the TODO item -/ tag : String @@ -36,29 +83,49 @@ meta initialize todoExtension : SimplePersistentEnvExtension todoInfo (Array tod addImportedFn := fun es => es.foldl (· ++ ·) #[] } +/-- Syntax for the optional range of lines of a `TODO ...` command. This is +`(lines := 82)` for a single line, and `(lines := 201-223)` for a range of lines. -/ +syntax todoLines := "(" &"lines" " := " num ("-" num)? ")" + /-- Syntax for the `TODO ...` command. -/ -syntax (name := todo_comment) "TODO " str : command +syntax (name := todo_comment) "TODO " (todoLines)? str : command + +/-- The first and last line of the range of lines of a `TODO ...` command, read off from +the optional `(lines := ...)` clause. The argument `line` is the line the command itself +is on, and is the answer when no such clause is present. -/ +meta def todoLinesOfSyntax (stx : Syntax) (line : Nat) : + Elab.Command.CommandElabM (Nat × Nat) := do + if stx.getNumArgs == 0 then + return (line, line) + let clause := stx[0] + let some first := clause[3].isNatLit? | + throwError "Invalid range of lines for the `TODO` command" + let lastStx := clause[4] + if lastStx.getNumArgs == 0 then + return (first, first) + let some last := lastStx[1].isNatLit? | + throwError "Invalid range of lines for the `TODO` command" + if last < first then + throwError "The `TODO` command was given a range of lines ending before it starts" + return (first, last) /-- Elaborator for the `TODO ...` command -/ @[command_elab todo_comment] -meta def elabTODO : Elab.Command.CommandElab := fun stx => - match stx with - | `(TODO $s) => do - let str : String := s.getString - let tag : String := toString (String.hash str) - let pos := stx.getPos? - match pos with - | some pos => do - let env ← getEnv - let fileMap ← getFileMap - let filePos := fileMap.toPosition pos - let line := filePos.line - let modName := env.mainModule - let todoInfo : todoInfo := { content := str, fileName := modName, line := line, tag := tag } - modifyEnv fun env => todoExtension.addEntry env todoInfo - Elab.Command.liftTermElabM <| Lean.Elab.Term.addTermInfo' s - (Lean.mkStrLit s!"TODO tag: {tag}") (expectedType? := none) - | none => throwError "Invalid syntax for `TODO` command" - | _ => throwError "Invalid syntax for `TODO` command" +meta def elabTODO : Elab.Command.CommandElab := fun stx => do + let some str := stx[2].isStrLit? | + throwError "Invalid syntax for `TODO` command" + let some pos := stx.getPos? | + throwError "Invalid syntax for `TODO` command" + let tag : String := toString (String.hash str) + let env ← getEnv + let fileMap ← getFileMap + let commandLine := (fileMap.toPosition pos).line + let (line, endLine) ← todoLinesOfSyntax stx[1] commandLine + let modName := env.mainModule + let todoInfo : todoInfo := { + content := str, fileName := modName, line := line, endLine := endLine, tag := tag} + modifyEnv fun env => todoExtension.addEntry env todoInfo + Elab.Command.liftTermElabM <| Lean.Elab.Term.addTermInfo' stx[2] + (Lean.mkStrLit s!"TODO tag: {tag}") (expectedType? := none) end Physlib diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean index 914b0df6f..e97f1b027 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean @@ -736,6 +736,77 @@ lemma adjoint_dualMap_coord (g : GaugeGroupI) (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : rw [← h] simp [Matrix.mulVec, dotProduct] +/-! + +## H. Orthogonality of the adjoint matrix + +The adjoint action preserves the trace pairing of the standard basis, so `adjointMatrix` +is an orthogonal matrix. Multiplicativity turns the star of a group element into the +transpose of its matrix, and the two combine to the orthogonality relation. + +-/ + +/-- The matrix of the adjoint action turns a product in the gauge group into the + product of the corresponding matrices. -/ +lemma adjointMatrix_mul (g h : GaugeGroupI) : + GaugeAlgebra.adjointMatrix (g * h) + = GaugeAlgebra.adjointMatrix g * GaugeAlgebra.adjointMatrix h := by + rw [← GaugeAlgebra.toMatrix_adjoint, ← GaugeAlgebra.toMatrix_adjoint, + ← GaugeAlgebra.toMatrix_adjoint, map_mul, LinearMap.toMatrix_mul] + +/-- The matrix of the adjoint action of the identity is the identity matrix. -/ +lemma adjointMatrix_one : GaugeAlgebra.adjointMatrix (1 : GaugeGroupI) = 1 := by + rw [← GaugeAlgebra.toMatrix_adjoint, map_one, LinearMap.toMatrix_one] + +/-- The star of a gauge group element is its inverse. -/ +lemma gaugeGroup_mul_star_self (g : GaugeGroupI) : g * star g = 1 := by + refine GaugeGroupI.ext ?_ ?_ ?_ + · rw [map_mul, GaugeGroupI.star_toSU3, map_one, Matrix.star_eq_inv, mul_inv_cancel] + · rw [map_mul, GaugeGroupI.star_toSU2, map_one, Matrix.star_eq_inv, mul_inv_cancel] + · rw [map_mul, GaugeGroupI.star_toU1, map_one, Unitary.mul_star_self] + +/-- The matrix of the adjoint action of the star of a gauge group element is the + transpose of the matrix of the adjoint action, since the trace pairing is symmetric + under moving the conjugation from one argument to the other. -/ +lemma adjointMatrix_star (g : GaugeGroupI) : + GaugeAlgebra.adjointMatrix (star g) = (GaugeAlgebra.adjointMatrix g)ᵀ := by + have key : ∀ {m : ℕ} (X Y U : Matrix (Fin m) (Fin m) ℂ), + Matrix.trace (X * (star U * Y * U)) = Matrix.trace (Y * (U * X * star U)) := by + intro m X Y U + calc Matrix.trace (X * (star U * Y * U)) + = Matrix.trace (X * star U * Y * U) := by simp only [mul_assoc] + _ = Matrix.trace (U * (X * star U * Y)) := Matrix.trace_mul_comm _ _ + _ = Matrix.trace (U * X * star U * Y) := by simp only [mul_assoc] + _ = Matrix.trace (Y * (U * X * star U)) := Matrix.trace_mul_comm _ _ + ext a b + match a, b with + | Sum.inl a, Sum.inl b => + simp only [Matrix.transpose_apply, GaugeAlgebra.adjointMatrix_inl_inl, + GaugeGroupI.star_toSU3, Matrix.specialUnitaryGroup.coe_star, star_star] + rw [key] + | Sum.inl a, Sum.inr x => simp + | Sum.inr x, Sum.inl b => simp + | Sum.inr (Sum.inl i), Sum.inr (Sum.inl j) => + simp only [Matrix.transpose_apply, GaugeAlgebra.adjointMatrix_inr_inl_inr_inl, + GaugeGroupI.star_toSU2, Matrix.specialUnitaryGroup.coe_star, star_star] + rw [key] + | Sum.inr (Sum.inl i), Sum.inr (Sum.inr u) => simp + | Sum.inr (Sum.inr u), Sum.inr (Sum.inl j) => simp + | Sum.inr (Sum.inr u), Sum.inr (Sum.inr v) => simp + +/-- The matrix of the adjoint action is orthogonal. -/ +lemma adjointMatrix_mul_transpose (g : GaugeGroupI) : + GaugeAlgebra.adjointMatrix g * (GaugeAlgebra.adjointMatrix g)ᵀ = 1 := by + rw [← adjointMatrix_star, ← adjointMatrix_mul, gaugeGroup_mul_star_self, + adjointMatrix_one] + +/-- The matrix of the adjoint action of the inverse of a gauge group element is the + transpose of the matrix of the adjoint action. -/ +lemma adjointMatrix_inv_apply (g : GaugeGroupI) (a b : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + adjointMatrix g⁻¹ a b = adjointMatrix g b a := by + rw [inv_eq_of_mul_eq_one_right (gaugeGroup_mul_star_self g), adjointMatrix_star, + Matrix.transpose_apply] + end GaugeAlgebra end diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean new file mode 100644 index 000000000..ba105eec1 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -0,0 +1,173 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeAlgebra.Basis +/-! +# Gauge tensors carrying two `su(2)` adjoint indices + +`IsSU2BiAdjoint B repGauge T` says that a family `T`, indexed by two `su(2)` adjoint +indices and valued in a module `B` carrying a representation of the gauge group +`GaugeGroupI`, transforms as a tensor `T^{a₁ a₂}` in the `su(2)` factor of the adjoint +representation. + +This is the gauge analogue of `IsQuadLorentz`. The field strength of the `W` bosons +carries one `su(2)` adjoint index, so a product of two field strengths carries two, and +the proposition here records how such a product transforms. + +Section A gives the proposition and the span of its components, section B the +orthogonality of the `su(2)` block of `adjointMatrix`, and section C the trace +contraction, which is the natural gauge invariant built from two adjoint indices. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. Bi-adjoint `su(2)` families and the span of their components + +-/ + +/-- A family `T` of elements of `B`, indexed by two `su(2)` adjoint indices, transforms + as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group. -/ +structure IsSU2BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 3) → B) : Prop where + repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 3), + repGauge g (T l) = ∑ a : Fin 2 → Fin 3, + (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (a i))) + (Sum.inr (Sum.inl (l i))) : ℝ) : ℂ)) • T a + +namespace IsSU2BiAdjoint +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 3) → B} + (hT : IsSU2BiAdjoint B repGauge T) + +/-- The span of all the components. -/ +def span (hT : IsSU2BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 3) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 2 → Fin 3) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. Orthogonality of the adjoint matrix + +Orthogonality of `adjointMatrix` is proved where the matrix is defined, in +`GaugeAlgebra.Basis`. All that is needed here is the row orthonormality of the block +belonging to this gauge factor, which is what makes the trace contraction of section C +gauge invariant. + +-/ + +/-- The rows of the `su(2)` block of the adjoint matrix are orthonormal. -/ +lemma sum_adjointMatrix_row_mul (g : GaugeGroupI) (c d : Fin 3) : + ∑ a : Fin 3, GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl a)) * + GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl d)) (Sum.inr (Sum.inl a)) + = if c = d then 1 else 0 := by + have h : (GaugeAlgebra.adjointMatrix g * (GaugeAlgebra.adjointMatrix g)ᵀ) + (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl d)) = (1 : Matrix (Fin 8 ⊕ Fin 3 ⊕ Fin 1) + (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ) (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl d)) := by + rw [GaugeAlgebra.adjointMatrix_mul_transpose] + rw [Matrix.mul_apply, Fintype.sum_sum_type] at h + simpa [Fintype.sum_sum_type, Matrix.one_apply] using h + +TODO (lines := 90-102) "Move this to where `adjointMatrix` is + defined." + +/-! + +## C. The trace contraction + +-/ + +/-- A sum over families of two `su(2)` adjoint indices is a double sum. -/ +lemma sum_pi_two {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin 3) → M) : + ∑ d : Fin 2 → Fin 3, F d = ∑ x : Fin 3, ∑ y : Fin 3, F ![x, y] := by + rw [show (∑ d : Fin 2 → Fin 3, F d) = ∑ p : Fin 3 × Fin 3, F ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 3) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +/-- The trace contraction of a bi-adjoint family: the Kronecker contraction of the two + `su(2)` adjoint indices. -/ +def traceContraction (hT : IsSU2BiAdjoint B repGauge T) : B := ∑ a : Fin 3, T ![a, a] + +/-- The trace contraction written as a sum over all pairs of adjoint indices weighted by + the Kronecker delta. -/ +lemma traceContraction_eq_sum (hT : IsSU2BiAdjoint B repGauge T) : + hT.traceContraction + = ∑ d : Fin 2 → Fin 3, (if d 0 = d 1 then (1 : ℂ) else 0) • T d := by + rw [sum_pi_two] + simp [traceContraction, ite_smul] + +/-- The trace contraction lies in the span of the components. -/ +lemma traceContraction_mem_span (hT : IsSU2BiAdjoint B repGauge T) : + hT.traceContraction ∈ hT.span := by + rw [traceContraction] + exact sum_mem fun d _ => + Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _) + +/-- The trace contraction of a bi-adjoint family is gauge invariant. -/ +lemma repGauge_traceContraction (hT : IsSU2BiAdjoint B repGauge T) (g : GaugeGroupI) : + repGauge g hT.traceContraction = hT.traceContraction := by + have step : repGauge g hT.traceContraction + = ∑ b : Fin 2 → Fin 3, (if b 0 = b 1 then (1 : ℂ) else 0) • T b := by + show repGauge g (∑ c : Fin 3, T ![c, c]) = _ + rw [map_sum] + have h1 : ∀ c : Fin 3, repGauge g (T ![c, c]) + = ∑ b : Fin 2 → Fin 3, + ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (b 0))) (Sum.inr (Sum.inl c)) * + GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (b 1))) + (Sum.inr (Sum.inl c)) : ℝ) : ℂ) • T b := by + intro c + rw [hT.repGauge_T g ![c, c]] + refine Finset.sum_congr rfl fun b _ => ?_ + congr 1 + simp [Fin.prod_univ_two] + simp only [h1] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [← Complex.ofReal_sum, sum_adjointMatrix_row_mul] + simp [apply_ite] + rw [step, ← hT.traceContraction_eq_sum] + + +TODO (lines := 166-167) "Give the gauge weight decomposition of + `Span` in the SU(2) case." + +end IsSU2BiAdjoint + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean new file mode 100644 index 000000000..0c2a710cf --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -0,0 +1,653 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeAlgebra.Basis +public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition +/-! +# Gauge tensors carrying two `su(3)` adjoint indices + +`IsSU3BiAdjoint B repGauge T` says that a family `T`, indexed by two `su(3)` adjoint +indices and valued in a module `B` carrying a representation of the gauge group +`GaugeGroupI`, transforms as a tensor `T^{a₁ a₂}` in the `su(3)` factor of the adjoint +representation. + +This is the gauge analogue of `IsQuadLorentz`. The field strength of the gluons carries +one `su(3)` adjoint index, so a product of two field strengths carries two, and the +proposition here records how such a product transforms. + +Section A gives the proposition and the span of its components, section B the +orthogonality of the `su(3)` block of `adjointMatrix`, section C the trace +contraction, which is the natural gauge invariant built from two adjoint indices, and +section D the gauge weight decomposition of the span. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. Bi-adjoint `su(3)` families and the span of their components + +-/ + +/-- A family `T` of elements of `B`, indexed by two `su(3)` adjoint indices, transforms + as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group. -/ +structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 8) → B) : Prop where + repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 8), + repGauge g (T l) = ∑ a : Fin 2 → Fin 8, + (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inl (a i)) + (Sum.inl (l i)) : ℝ) : ℂ)) • T a + +namespace IsSU3BiAdjoint +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 8) → B} + (hT : IsSU3BiAdjoint B repGauge T) + +/-- The span of all the components. -/ +def span (hT : IsSU3BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 8) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 2 → Fin 8) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. Orthogonality of the adjoint matrix + +Orthogonality of `adjointMatrix` is proved where the matrix is defined, in +`GaugeAlgebra.Basis`. All that is needed here is the row orthonormality of the block +belonging to this gauge factor, which is what makes the trace contraction of section C +gauge invariant. + +-/ + +/-- The rows of the `su(3)` block of the adjoint matrix are orthonormal. -/ +lemma sum_adjointMatrix_row_mul (g : GaugeGroupI) (c d : Fin 8) : + ∑ a : Fin 8, GaugeAlgebra.adjointMatrix g (Sum.inl c) (Sum.inl a) * + GaugeAlgebra.adjointMatrix g (Sum.inl d) (Sum.inl a) + = if c = d then 1 else 0 := by + have h : (GaugeAlgebra.adjointMatrix g * (GaugeAlgebra.adjointMatrix g)ᵀ) + (Sum.inl c) (Sum.inl d) = (1 : Matrix (Fin 8 ⊕ Fin 3 ⊕ Fin 1) + (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ) (Sum.inl c) (Sum.inl d) := by + rw [GaugeAlgebra.adjointMatrix_mul_transpose] + rw [Matrix.mul_apply, Fintype.sum_sum_type] at h + simpa [Fintype.sum_sum_type, Matrix.one_apply] using h + +TODO (lines := 92-104) "Move this to where `adjointMatrix` is defined." + +/-! + +## C. The trace contraction + +-/ + +/-- A sum over families of two `su(3)` adjoint indices is a double sum. -/ +lemma sum_pi_two {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin 8) → M) : + ∑ d : Fin 2 → Fin 8, F d = ∑ x : Fin 8, ∑ y : Fin 8, F ![x, y] := by + rw [show (∑ d : Fin 2 → Fin 8, F d) = ∑ p : Fin 8 × Fin 8, F ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 8) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +/-- The trace contraction of a bi-adjoint family: the Kronecker contraction of the two + `su(3)` adjoint indices. -/ +def traceContraction (hT : IsSU3BiAdjoint B repGauge T) : B := ∑ a : Fin 8, T ![a, a] + +/-- The trace contraction written as a sum over all pairs of adjoint indices weighted by + the Kronecker delta. -/ +lemma traceContraction_eq_sum (hT : IsSU3BiAdjoint B repGauge T) : + hT.traceContraction + = ∑ d : Fin 2 → Fin 8, (if d 0 = d 1 then (1 : ℂ) else 0) • T d := by + rw [sum_pi_two] + simp [traceContraction, ite_smul] + +/-- The trace contraction lies in the span of the components. -/ +lemma traceContraction_mem_span (hT : IsSU3BiAdjoint B repGauge T) : + hT.traceContraction ∈ hT.span := by + rw [traceContraction] + exact sum_mem fun d _ => + Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _) + +/-- The trace contraction of a bi-adjoint family is gauge invariant. -/ +lemma repGauge_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (g : GaugeGroupI) : + repGauge g hT.traceContraction = hT.traceContraction := by + have step : repGauge g hT.traceContraction + = ∑ b : Fin 2 → Fin 8, (if b 0 = b 1 then (1 : ℂ) else 0) • T b := by + show repGauge g (∑ c : Fin 8, T ![c, c]) = _ + rw [map_sum] + have h1 : ∀ c : Fin 8, repGauge g (T ![c, c]) + = ∑ b : Fin 2 → Fin 8, + ((GaugeAlgebra.adjointMatrix g (Sum.inl (b 0)) (Sum.inl c) * + GaugeAlgebra.adjointMatrix g (Sum.inl (b 1)) (Sum.inl c) : ℝ) : ℂ) • T b := by + intro c + rw [hT.repGauge_T g ![c, c]] + refine Finset.sum_congr rfl fun b _ => ?_ + congr 1 + simp [Fin.prod_univ_two] + simp only [h1] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [← Complex.ofReal_sum, sum_adjointMatrix_row_mul] + simp [apply_ite] + rw [step, ← hT.traceContraction_eq_sum] + + +end IsSU3BiAdjoint + +/-! + +## D. The gauge weight decomposition of the span + +The Gell-Mann basis vectors are not eigenvectors of the gauge torus, so the components +`T d` do not carry a definite gauge weight. The eigenvectors appear only after passing to +the weight basis of the `su(3)` adjoint: for each of the three root directions the two +complex combinations `x₁ ± i x₂` of the paired Gell-Mann coordinates, and the two Cartan +directions as they stand. That is eight coordinate vectors, recorded in `wtCoeff`, with +weights `wtWeight`. + +With two adjoint indices a weight vector is a product of two of these, contracted against +`T` by `biVec`, and its weight is the sum of the two individual weights. There are sixty +four such products, they span the same subspace as the components, and joining their +lines one weight at a time gives `gaugeWeightDecomposition`. + +The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an +algebra and records multiplicativity of the representation, neither of which +`IsSU3BiAdjoint` needs, so both appear as extra arguments here. + +-/ + +namespace IsSU3BiAdjoint + +set_option linter.unusedVariables false + +/-! + +## D.1. The weight basis of the `su(3)` adjoint + +-/ + +/-- The index type of the `su(3)` adjoint weight basis: three positive roots, three + negative roots and two Cartan directions. -/ +abbrev WeightIdx : Type := Fin 3 ⊕ Fin 3 ⊕ Fin 2 + +/-- The pairs of Gell-Mann indices making up the three root directions of `su(3)`. -/ +def rootPair : Fin 3 → Fin 8 × Fin 8 + | 0 => (0, 1) + | 1 => (3, 4) + | 2 => (5, 6) + +/-- The gauge weight of each `su(3)` root direction. -/ +def rootWt : Fin 3 → GaugeWeight + | 0 => (2, -1, 0, 0) + | 1 => (1, 1, 0, 0) + | 2 => (-1, 2, 0, 0) + +/-- The Gell-Mann indices of the two Cartan directions of `su(3)`. -/ +def cartanId : Fin 2 → Fin 8 + | 0 => 2 + | 1 => 7 + +/-- The root directions here are the `su(3)` root directions of the full gauge algebra. -/ +lemma rootIdx_castSucc (r : Fin 3) : + GaugeAlgebra.rootIdx r.castSucc + = (Sum.inl (rootPair r).1, Sum.inl (rootPair r).2) := by + fin_cases r <;> rfl + +/-- The root weights here are the `su(3)` root weights of the full gauge algebra. -/ +lemma rootWeight_castSucc (r : Fin 3) : + GaugeAlgebra.rootWeight r.castSucc = rootWt r := by + fin_cases r <;> rfl + +/-- The Cartan directions here are the `su(3)` Cartan directions of the full gauge + algebra. -/ +lemma cartanIdx_castSucc (c : Fin 2) : + GaugeAlgebra.cartanIdx c.castSucc.castSucc = Sum.inl (cartanId c) := by + fin_cases c <;> rfl + +/-- Every Gell-Mann index is either one of the two members of a root pair or a Cartan + index. -/ +lemma exists_rootPair_or_cartanId (a : Fin 8) : + (∃ r : Fin 3, a = (rootPair r).1) ∨ (∃ r : Fin 3, a = (rootPair r).2) + ∨ ∃ c : Fin 2, a = cartanId c := by + revert a + decide + +/-! + +## D.2. The adjoint matrix of a torus generator in the weight basis + +-/ + +/-- A standard coordinate functional evaluated on a standard basis vector. -/ +lemma coord_stdBasis_apply (b a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + GaugeAlgebra.stdBasis.coord b (GaugeAlgebra.stdBasis a) = if a = b then 1 else 0 := by + simp [Module.Basis.coord_apply, Module.Basis.repr_self, Finsupp.single_apply] + +/-- The entries of the adjoint matrix, read off the dual adjoint action of the inverse on + the standard coordinate functionals. -/ +lemma dualMap_coord_apply (g : GaugeGroupI) (a b : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + (GaugeAlgebra.adjointMap g⁻¹).dualMap (GaugeAlgebra.stdBasis.coord b) + (GaugeAlgebra.stdBasis a) + = GaugeAlgebra.adjointMatrix g a b := by + have h1 : GaugeAlgebra.adjointMap g⁻¹ (GaugeAlgebra.stdBasis a) + = ∑ c, GaugeAlgebra.adjointMatrix g⁻¹ c a • GaugeAlgebra.stdBasis c := + GaugeAlgebra.adjoint_stdBasis g⁻¹ a + rw [LinearMap.dualMap_apply, h1, map_sum] + simp only [map_smul, smul_eq_mul, coord_stdBasis_apply, mul_ite, mul_one, mul_zero, + Finset.sum_ite_eq', Finset.mem_univ, if_true] + rw [GaugeAlgebra.adjointMatrix_inv_apply] + +/-- The first column of a root pair: the torus rotates the two columns of the adjoint + matrix belonging to a root direction into each other. -/ +lemma adjointMatrix_rootPair_fst (i : Fin 4) (r : Fin 3) (a : Fin 8) : + GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (rootPair r).1) + = ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).re * + (if a = (rootPair r).1 then 1 else 0) + - ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).im * + (if a = (rootPair r).2 then 1 else 0) := by + obtain ⟨p1, -⟩ := GaugeAlgebra.dualMap_pair_of_entry + (GaugeAlgebra.coord_rootIdx_fst r.castSucc) + (GaugeAlgebra.coord_rootIdx_snd r.castSucc) + (GaugeAlgebra.rootEntry_adjointMap r.castSucc i) + simp only [rootIdx_castSucc, rootWeight_castSucc] at p1 + have e := LinearMap.congr_fun p1 (GaugeAlgebra.stdBasis (Sum.inl a)) + rw [dualMap_coord_apply] at e + rw [e] + simp [Finsupp.single_apply] + +/-- The second column of a root pair. -/ +lemma adjointMatrix_rootPair_snd (i : Fin 4) (r : Fin 3) (a : Fin 8) : + GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (rootPair r).2) + = ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).im * + (if a = (rootPair r).1 then 1 else 0) + + ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).re * + (if a = (rootPair r).2 then 1 else 0) := by + obtain ⟨-, p2⟩ := GaugeAlgebra.dualMap_pair_of_entry + (GaugeAlgebra.coord_rootIdx_fst r.castSucc) + (GaugeAlgebra.coord_rootIdx_snd r.castSucc) + (GaugeAlgebra.rootEntry_adjointMap r.castSucc i) + simp only [rootIdx_castSucc, rootWeight_castSucc] at p2 + have e := LinearMap.congr_fun p2 (GaugeAlgebra.stdBasis (Sum.inl a)) + rw [dualMap_coord_apply] at e + rw [e] + simp [Finsupp.single_apply] + +/-- The torus fixes the Cartan columns of the adjoint matrix. -/ +lemma adjointMatrix_cartanId (i : Fin 4) (c : Fin 2) (a : Fin 8) : + GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (cartanId c)) + = if a = cartanId c then 1 else 0 := by + have p := GaugeAlgebra.dualMap_coord_cartanIdx c.castSucc.castSucc i + simp only [cartanIdx_castSucc] at p + have e := LinearMap.congr_fun p (GaugeAlgebra.stdBasis (Sum.inl a)) + rw [dualMap_coord_apply] at e + rw [e] + simp [Finsupp.single_apply] + +/-! + +## D.3. The weight vectors of one adjoint index + +-/ + +/-- The coordinates of the `su(3)` adjoint weight basis in the Gell-Mann basis: for each + root the two combinations `x₁ ± i x₂` of the paired coordinates, and for each Cartan + direction the coordinate itself. -/ +noncomputable def wtCoeff : WeightIdx → Fin 8 → ℂ + | Sum.inl r, a => (if a = (rootPair r).1 then 1 else 0) + + Complex.I * (if a = (rootPair r).2 then 1 else 0) + | Sum.inr (Sum.inl r), a => (if a = (rootPair r).1 then 1 else 0) + - Complex.I * (if a = (rootPair r).2 then 1 else 0) + | Sum.inr (Sum.inr c), a => if a = cartanId c then 1 else 0 + +/-- The gauge weight carried by each `su(3)` adjoint weight vector. -/ +def wtWeight : WeightIdx → GaugeWeight + | Sum.inl r => rootWt r + | Sum.inr (Sum.inl r) => -(rootWt r) + | Sum.inr (Sum.inr _) => 0 + +/-- The coordinate vector of a single Gell-Mann direction. -/ +def unitVec (a : Fin 8) : Fin 8 → ℂ := fun x => if x = a then 1 else 0 + +/-- The action of a gauge transformation on the coordinates of one `su(3)` adjoint + index. -/ +noncomputable def rowAct (g : GaugeGroupI) (c : Fin 8 → ℂ) : Fin 8 → ℂ := fun a => + ∑ x : Fin 8, ((GaugeAlgebra.adjointMatrix g (Sum.inl a) (Sum.inl x) : ℝ) : ℂ) * c x + +/-- Collapsing a sum against the two Kronecker deltas of a root pair. -/ +lemma sum_mul_pair (f : Fin 8 → ℂ) (b₁ b₂ : Fin 8) (s : ℂ) : + ∑ x : Fin 8, f x * ((if x = b₁ then (1 : ℂ) else 0) + s * (if x = b₂ then 1 else 0)) + = f b₁ + s * f b₂ := by + have h : ∀ x : Fin 8, + f x * ((if x = b₁ then (1 : ℂ) else 0) + s * (if x = b₂ then 1 else 0)) + = (if x = b₁ then f x else 0) + (if x = b₂ then s * f x else 0) := by + intro x + split_ifs <;> ring + simp only [h] + simp [Finset.sum_add_distrib] + +/-- The complex pair identity behind the positive root eigenvectors. -/ +lemma pair_add_eq (z u v : ℂ) : + (z.re : ℂ) * u - (z.im : ℂ) * v + Complex.I * ((z.im : ℂ) * u + (z.re : ℂ) * v) + = z * (u + Complex.I * v) := by + conv_rhs => rw [← Complex.re_add_im z] + ring_nf + rw [Complex.I_sq] + ring + +/-- The complex pair identity behind the negative root eigenvectors. -/ +lemma pair_sub_eq (z u v : ℂ) : + (z.re : ℂ) * u - (z.im : ℂ) * v - Complex.I * ((z.im : ℂ) * u + (z.re : ℂ) * v) + = (starRingEnd ℂ) z * (u - Complex.I * v) := by + rw [show (starRingEnd ℂ) z = (z.re : ℂ) - (z.im : ℂ) * Complex.I by + rw [Complex.ext_iff]; simp] + ring_nf + rw [Complex.I_sq] + ring + +/-- Each weight vector of the `su(3)` adjoint is an eigenvector of every torus + generator, at the character of its weight. -/ +lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : + rowAct (gaugeTorusGen i) (wtCoeff k) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k) i) • wtCoeff k := by + funext a + match k with + | Sum.inl r => + show ∑ x : Fin 8, _ = _ + rw [show (fun x => wtCoeff (Sum.inl r) x) = fun x => + (if x = (rootPair r).1 then (1 : ℂ) else 0) + + Complex.I * (if x = (rootPair r).2 then 1 else 0) from rfl] + rw [sum_mul_pair] + simp only [adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, + Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] + show _ = ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i) * _ + rw [pair_add_eq] + rfl + | Sum.inr (Sum.inl r) => + show ∑ x : Fin 8, _ = _ + rw [show (fun x => wtCoeff (Sum.inr (Sum.inl r)) x) = fun x => + (if x = (rootPair r).1 then (1 : ℂ) else 0) + + (-Complex.I) * (if x = (rootPair r).2 then 1 else 0) from by + funext x; show _ = _; ring] + rw [sum_mul_pair] + simp only [adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, + Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] + rw [show ((expI : ℂ) ^ GaugeWeight.coord (wtWeight (Sum.inr (Sum.inl r) : WeightIdx)) i) + = (starRingEnd ℂ) ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i) from by + rw [starRingEnd_expI_zpow] + congr 1 + show GaugeWeight.coord (-(rootWt r)) i = _ + rw [GaugeWeight.coord_neg]] + rw [show ∀ x y z : ℂ, x - y + -Complex.I * z = x - y - Complex.I * z from + fun x y z => by ring] + rw [pair_sub_eq] + show _ = _ * wtCoeff (Sum.inr (Sum.inl r)) a + rfl + | Sum.inr (Sum.inr c) => + show ∑ x : Fin 8, _ = _ + have hz : ((expI : ℂ) ^ GaugeWeight.coord (wtWeight (Sum.inr (Sum.inr c) : WeightIdx)) i) + = 1 := by + show ((expI : ℂ) ^ GaugeWeight.coord (0 : GaugeWeight) i) = 1 + simp + rw [hz] + simp only [wtCoeff, adjointMatrix_cartanId, Pi.smul_apply, smul_eq_mul, one_mul] + simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero] + simp + +TODO (lines := 379-430) "Fix the errors within these lemmas." + +/-! + +## D.4. The bi-adjoint weight vectors and their span + +-/ + +section Decomposition + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 8) → B} + +/-- The element of `B` obtained by contracting the two `su(3)` adjoint indices of `T` + against a pair of coordinate vectors. -/ +noncomputable def biVec (hT : IsSU3BiAdjoint B repGauge T) (c₀ c₁ : Fin 8 → ℂ) : B := + ∑ d : Fin 2 → Fin 8, (c₀ (d 0) * c₁ (d 1)) • T d + +variable (hT : IsSU3BiAdjoint B repGauge T) + +/-- Contracting against a scaled coordinate vector on the left. -/ +lemma biVec_smul_left (z : ℂ) (c₀ c₁ : Fin 8 → ℂ) : + hT.biVec (z • c₀) c₁ = z • hT.biVec c₀ c₁ := by + simp only [biVec, Finset.smul_sum, Pi.smul_apply, smul_eq_mul, smul_smul, mul_assoc] + +/-- Contracting against a scaled coordinate vector on the right. -/ +lemma biVec_smul_right (z : ℂ) (c₀ c₁ : Fin 8 → ℂ) : + hT.biVec c₀ (z • c₁) = z • hT.biVec c₀ c₁ := by + simp only [biVec, Finset.smul_sum, Pi.smul_apply, smul_eq_mul, smul_smul] + exact Finset.sum_congr rfl fun d _ => by ring_nf + +/-- Contracting against a sum of coordinate vectors on the left. -/ +lemma biVec_add_left (c₀ c₀' c₁ : Fin 8 → ℂ) : + hT.biVec (c₀ + c₀') c₁ = hT.biVec c₀ c₁ + hT.biVec c₀' c₁ := by + simp only [biVec, Pi.add_apply, add_mul, add_smul, Finset.sum_add_distrib] + +/-- Contracting against a difference of coordinate vectors on the left. -/ +lemma biVec_sub_left (c₀ c₀' c₁ : Fin 8 → ℂ) : + hT.biVec (c₀ - c₀') c₁ = hT.biVec c₀ c₁ - hT.biVec c₀' c₁ := by + simp only [biVec, Pi.sub_apply, sub_mul, sub_smul, Finset.sum_sub_distrib] + +/-- Contracting against a sum of coordinate vectors on the right. -/ +lemma biVec_add_right (c₀ c₁ c₁' : Fin 8 → ℂ) : + hT.biVec c₀ (c₁ + c₁') = hT.biVec c₀ c₁ + hT.biVec c₀ c₁' := by + simp only [biVec, Pi.add_apply, mul_add, add_smul, Finset.sum_add_distrib] + +/-- Contracting against a difference of coordinate vectors on the right. -/ +lemma biVec_sub_right (c₀ c₁ c₁' : Fin 8 → ℂ) : + hT.biVec c₀ (c₁ - c₁') = hT.biVec c₀ c₁ - hT.biVec c₀ c₁' := by + simp only [biVec, Pi.sub_apply, mul_sub, sub_smul, Finset.sum_sub_distrib] + +/-- Contracting against two single Gell-Mann directions returns a component of `T`. -/ +lemma biVec_unitVec (a b : Fin 8) : hT.biVec (unitVec a) (unitVec b) = T ![a, b] := by + rw [biVec, sum_pi_two] + simp [unitVec, ite_smul] + +/-- Every bi-adjoint weight vector transforms by the product of the two characters. -/ +lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 8 → ℂ) : + repGauge g (hT.biVec c₀ c₁) = hT.biVec (rowAct g c₀) (rowAct g c₁) := by + have step : ∀ d : Fin 2 → Fin 8, repGauge g ((c₀ (d 0) * c₁ (d 1)) • T d) + = ∑ a : Fin 2 → Fin 8, + ((c₀ (d 0) * c₁ (d 1)) * + (((GaugeAlgebra.adjointMatrix g (Sum.inl (a 0)) (Sum.inl (d 0)) : ℝ) : ℂ) * + ((GaugeAlgebra.adjointMatrix g (Sum.inl (a 1)) (Sum.inl (d 1)) : ℝ) : ℂ))) + • T a := by + intro d + rw [map_smul, hT.repGauge_T g d, Finset.smul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [smul_smul, Fin.prod_univ_two] + simp only [biVec, rowAct] + rw [map_sum] + simp only [step] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons] + rw [Finset.sum_mul_sum] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by ring + +/-- **The bi-adjoint weight vectors are simultaneous eigenvectors of the gauge torus**, + at the character of the sum of the two individual weights. -/ +lemma repGauge_biVec_wtCoeff (k₀ k₁ : WeightIdx) (i : Fin 4) : + repGauge (gaugeTorusGen i) (hT.biVec (wtCoeff k₀) (wtCoeff k₁)) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k₀ + wtWeight k₁) i) + • hT.biVec (wtCoeff k₀) (wtCoeff k₁) := by + rw [hT.repGauge_biVec, rowAct_wtCoeff, rowAct_wtCoeff, hT.biVec_smul_left, + hT.biVec_smul_right, smul_smul, GaugeWeight.coord_add, + zpow_add₀ expI_ne_zero] + +/-- The join of the lines spanned by the bi-adjoint weight vectors. -/ +noncomputable def wtSpan (hT : IsSU3BiAdjoint B repGauge T) : Submodule ℂ B := + ⨆ k : WeightIdx × WeightIdx, ℂ ∙ hT.biVec (wtCoeff k.1) (wtCoeff k.2) + +/-- The Gell-Mann coordinate vector of the first member of a root pair, in the weight + basis. -/ +lemma unitVec_rootPair_fst (r : Fin 3) : + unitVec (rootPair r).1 + = (2 : ℂ)⁻¹ • (wtCoeff (Sum.inl r) + wtCoeff (Sum.inr (Sum.inl r))) := by + funext x + simp only [unitVec, wtCoeff, Pi.add_apply, Pi.smul_apply, smul_eq_mul] + ring + +/-- The Gell-Mann coordinate vector of the second member of a root pair, in the weight + basis. -/ +lemma unitVec_rootPair_snd (r : Fin 3) : + unitVec (rootPair r).2 + = (-(Complex.I / 2)) • (wtCoeff (Sum.inl r) - wtCoeff (Sum.inr (Sum.inl r))) := by + funext x + simp only [unitVec, wtCoeff, Pi.sub_apply, Pi.smul_apply, smul_eq_mul] + ring_nf + rw [Complex.I_sq] + ring + +/-- A Cartan direction is already a weight vector. -/ +lemma unitVec_cartanId (c : Fin 2) : + unitVec (cartanId c) = wtCoeff (Sum.inr (Sum.inr c)) := rfl + +/-- Contracting a weight vector against a single Gell-Mann direction stays in the join of + the weight lines. -/ +lemma biVec_wtCoeff_unitVec_mem (k : WeightIdx) (b : Fin 8) : + hT.biVec (wtCoeff k) (unitVec b) ∈ hT.wtSpan := by + have hgen : ∀ k' : WeightIdx, hT.biVec (wtCoeff k) (wtCoeff k') ∈ hT.wtSpan := + fun k' => Submodule.mem_iSup_of_mem (k, k') (Submodule.mem_span_singleton_self _) + rcases exists_rootPair_or_cartanId b with ⟨r, rfl⟩ | ⟨r, rfl⟩ | ⟨c, rfl⟩ + · rw [unitVec_rootPair_fst, hT.biVec_smul_right, hT.biVec_add_right] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ (hgen _) (hgen _)) + · rw [unitVec_rootPair_snd, hT.biVec_smul_right, hT.biVec_sub_right] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ (hgen _) (hgen _)) + · rw [unitVec_cartanId] + exact hgen _ + +/-- Every component of `T` lies in the join of the weight lines. -/ +lemma biVec_unitVec_mem (a b : Fin 8) : + hT.biVec (unitVec a) (unitVec b) ∈ hT.wtSpan := by + rcases exists_rootPair_or_cartanId a with ⟨r, rfl⟩ | ⟨r, rfl⟩ | ⟨c, rfl⟩ + · rw [unitVec_rootPair_fst, hT.biVec_smul_left, hT.biVec_add_left] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ + (hT.biVec_wtCoeff_unitVec_mem _ _) (hT.biVec_wtCoeff_unitVec_mem _ _)) + · rw [unitVec_rootPair_snd, hT.biVec_smul_left, hT.biVec_sub_left] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ + (hT.biVec_wtCoeff_unitVec_mem _ _) (hT.biVec_wtCoeff_unitVec_mem _ _)) + · rw [unitVec_cartanId] + exact hT.biVec_wtCoeff_unitVec_mem _ _ + +/-- **The weight vectors span the components.** The change of basis from the Gell-Mann + basis to the weight basis is invertible, so nothing is lost. -/ +lemma span_eq_wtSpan : hT.span = hT.wtSpan := by + refine le_antisymm (iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr ?_) + (iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).mpr ?_) + · have hd : T d = T ![d 0, d 1] := by + congr 1 + funext j + fin_cases j <;> simp + rw [hd, ← hT.biVec_unitVec] + exact hT.biVec_unitVec_mem _ _ + · rw [span, biVec] + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## D.5. The decomposition + +-/ + +/-- **The gauge weight decomposition of the span of a bi-adjoint `su(3)` family.** The + span is the join of the lines through the sixty four products of weight vectors, and + each of those carries the sum of the two weights. -/ +@[implicit_reducible] +noncomputable def gaugeWeightDecomposition (hT : IsSU3BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hmul fun k : WeightIdx × WeightIdx => + GaugeWeightDecomposition.spanSingleton hmul + (hT.biVec (wtCoeff k.1) (wtCoeff k.2)) (wtWeight k.1 + wtWeight k.2) + (hT.repGauge_biVec_wtCoeff k.1 k.2)) + _ hT.span_eq_wtSpan + +/-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through + those products of weight vectors whose weights sum to `w`. -/ +lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : + (hT.gaugeWeightDecomposition hmul).piece w + = ⨆ k : WeightIdx × WeightIdx, + (if w = wtWeight k.1 + wtWeight k.2 then + ℂ ∙ hT.biVec (wtCoeff k.1) (wtCoeff k.2) else ⊥) := rfl + +/-- The support of the decomposition, before evaluation. -/ +lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = Finset.univ.biUnion fun k : WeightIdx × WeightIdx => + ({wtWeight k.1 + wtWeight k.2} : Finset GaugeWeight) := rfl + +/-- **The gauge weights carried by a bi-adjoint `su(3)` family**: the nineteen weights of + the tensor square of the `su(3)` adjoint. Every one of them has vanishing weak isospin + and hypercharge, since the family carries colour only. -/ +lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = {((0, 0, 0, 0) : GaugeWeight), (2, -1, 0, 0), (1, 1, 0, 0), (-1, 2, 0, 0), + (-2, 1, 0, 0), (-1, -1, 0, 0), (1, -2, 0, 0), (4, -2, 0, 0), (3, 0, 0, 0), + (3, -3, 0, 0), (2, 2, 0, 0), (0, 3, 0, 0), (-2, 4, 0, 0), (-3, 3, 0, 0), + (-4, 2, 0, 0), (-3, 0, 0, 0), (-2, -2, 0, 0), (0, -3, 0, 0), (2, -4, 0, 0)} := by + rw [hT.gaugeWeightDecomposition_supp_eq hmul] + decide + +/-- **The trace contraction lies in the zero-weight piece.** It is gauge invariant, so in + particular the torus fixes it. -/ +lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : + hT.traceContraction ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ hT.traceContraction_mem_span + hT.repGauge_traceContraction + + +TODO (lines := 640-641) "Give the + expclit form of the zero peice of the decomposition." + +end Decomposition + +end IsSU3BiAdjoint + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean new file mode 100644 index 000000000..7e69ec6af --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean @@ -0,0 +1,171 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeAlgebra.Basis +/-! +# Gauge tensors carrying two `u(1)` adjoint indices + +`IsU1BiAdjoint B repGauge T` says that a family `T`, indexed by two `u(1)` adjoint +indices and valued in a module `B` carrying a representation of the gauge group +`GaugeGroupI`, transforms as a tensor `T^{a₁ a₂}` in the `u(1)` factor of the adjoint +representation. + +This is the gauge analogue of `IsQuadLorentz`. The field strength of the `B` boson +carries one `u(1)` adjoint index, so a product of two field strengths carries two, and +the proposition here records how such a product transforms. The `u(1)` factor is +one dimensional and the adjoint action of the gauge group on it is trivial, so this +proposition says that the components of `T` are already gauge invariant. + +Section A gives the proposition and the span of its components, section B the +orthogonality of the `u(1)` block of `adjointMatrix`, and section C the trace +contraction, which is the natural gauge invariant built from two adjoint indices. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. Bi-adjoint `u(1)` families and the span of their components + +-/ + +/-- A family `T` of elements of `B`, indexed by two `u(1)` adjoint indices, transforms + as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group. -/ +structure IsU1BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 1) → B) : Prop where + repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 1), + repGauge g (T l) = ∑ a : Fin 2 → Fin 1, + (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr (a i))) + (Sum.inr (Sum.inr (l i))) : ℝ) : ℂ)) • T a + +namespace IsU1BiAdjoint +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 1) → B} + (hT : IsU1BiAdjoint B repGauge T) + +/-- The span of all the components. -/ +def span (hT : IsU1BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 1) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 2 → Fin 1) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. Orthogonality of the adjoint matrix + +The adjoint action of the gauge group on the `u(1)` factor is trivial, so the `u(1)` +entry of `adjointMatrix` is `1` and the corresponding one by one block is orthogonal. +This is what makes the trace contraction of section C gauge invariant. + +-/ + +/-- The adjoint action of the gauge group on the `u(1)` factor is trivial. -/ +lemma adjointMatrix_u1 (g : GaugeGroupI) (c d : Fin 1) : + GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr c)) (Sum.inr (Sum.inr d)) = 1 := rfl + +/-- The rows of the `u(1)` block of the adjoint matrix are orthonormal. -/ +lemma sum_adjointMatrix_row_mul (g : GaugeGroupI) (c d : Fin 1) : + ∑ a : Fin 1, GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr c)) (Sum.inr (Sum.inr a)) * + GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr d)) (Sum.inr (Sum.inr a)) + = if c = d then 1 else 0 := by + rw [Subsingleton.elim c d] + simp + +/-! + +## C. The trace contraction + +-/ + +/-- A sum over families of two `u(1)` adjoint indices is a double sum. -/ +lemma sum_pi_two {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin 1) → M) : + ∑ d : Fin 2 → Fin 1, F d = ∑ x : Fin 1, ∑ y : Fin 1, F ![x, y] := by + rw [show (∑ d : Fin 2 → Fin 1, F d) = ∑ p : Fin 1 × Fin 1, F ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 1) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +/-- The trace contraction of a bi-adjoint family: the Kronecker contraction of the two + `u(1)` adjoint indices. -/ +def traceContraction (hT : IsU1BiAdjoint B repGauge T) : B := ∑ a : Fin 1, T ![a, a] + +/-- The trace contraction written as a sum over all pairs of adjoint indices weighted by + the Kronecker delta. -/ +lemma traceContraction_eq_sum (hT : IsU1BiAdjoint B repGauge T) : + hT.traceContraction + = ∑ d : Fin 2 → Fin 1, (if d 0 = d 1 then (1 : ℂ) else 0) • T d := by + rw [sum_pi_two] + simp [traceContraction, ite_smul] + +/-- The trace contraction lies in the span of the components. -/ +lemma traceContraction_mem_span (hT : IsU1BiAdjoint B repGauge T) : + hT.traceContraction ∈ hT.span := by + rw [traceContraction] + exact sum_mem fun d _ => + Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _) + +/-- The trace contraction of a bi-adjoint family is gauge invariant. -/ +lemma repGauge_traceContraction (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGroupI) : + repGauge g hT.traceContraction = hT.traceContraction := by + have step : repGauge g hT.traceContraction + = ∑ b : Fin 2 → Fin 1, (if b 0 = b 1 then (1 : ℂ) else 0) • T b := by + show repGauge g (∑ c : Fin 1, T ![c, c]) = _ + rw [map_sum] + have h1 : ∀ c : Fin 1, repGauge g (T ![c, c]) + = ∑ b : Fin 2 → Fin 1, + ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr (b 0))) (Sum.inr (Sum.inr c)) * + GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr (b 1))) + (Sum.inr (Sum.inr c)) : ℝ) : ℂ) • T b := by + intro c + rw [hT.repGauge_T g ![c, c]] + refine Finset.sum_congr rfl fun b _ => ?_ + congr 1 + simp + simp only [h1] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [← Complex.ofReal_sum, sum_adjointMatrix_row_mul] + simp [apply_ite] + rw [step, ← hT.traceContraction_eq_sum] + +TODO (lines := 164-165) "Add here the + lemma that the every element of `span` is invariant under the gauge group + action." + +end IsU1BiAdjoint + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean index a665b0691..382bf9fb7 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean @@ -198,6 +198,19 @@ def copy (d : SU2PermDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : lemma copy_piece (d : SU2PermDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : (d.copy W hW).piece = d.piece := rfl +/-- The zero submodule carries the trivial decomposition, with every grade empty. This is + the unit for `sup`, and the decomposition of every submodule that turns out to vanish. -/ +def bot : SU2PermDecomposition rep (⊥ : Submodule ℂ B) where + piece _ := ⊥ + piece_le k x hx := by + rw [Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by simp + +@[simp] +lemma bot_piece (k : ZMod 4) : (bot (rep := rep)).piece k = ⊥ := rfl + /-! ## D. Joins diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean new file mode 100644 index 000000000..933435779 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean @@ -0,0 +1,426 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.Basic +public import Mathlib.LinearAlgebra.Eigenspace.Basic +/-! +# `SU(3)` permutation decompositions + +## i. Overview + +An `SU(3)` permutation decomposition of a submodule `V` is a `ZMod 3`-indexed family of +subspaces whose supremum is `V`, the grade-`k` piece scaled by `ω ^ k` under the `SU(3)` +element + + `su3Perm = !![0, 0, 1; 1, 0, 0; 0, 1, 0]`, + +the cyclic colour rotation. On a colour triplet it sends `(a, b, c)` to `(c, a, b)`, +cycling the three colours and so cycling the three colour weights that the first two +coordinates of a `GaugeWeight` record. + +`su3Perm` is the lift to `SU(3)` of a three-cycle in the Weyl group `S₃`. A three-cycle is +an even permutation, so its permutation matrix already has determinant `1`: unlike the +`SU(2)` transposition, which has to be twisted by a sign to land in `SU(2)`, the cyclic +matrix needs no phase correction at all. + +`su3Perm` cubes to `1`, so it has order three in `SU(3)` and `rep gaugeSU3Perm` satisfies +`T ^ 3 = 1`. Its spectrum is therefore contained in the cube roots of unity, and the index +group is `ZMod 3` with eigenvalue `ω ^ k` for `ω = exp (2 π i / 3)` — multiplicative in +`k`, which is what makes the grading add under multiplication, exactly as gauge weights do +in `GaugeWeightDecomposition`. Because `ZMod 3` is finite there is no support field: the +finiteness that `GaugeWeightDecomposition.supp` has to record is automatic here. + +The three grades separate the colour directions. A colour triplet splits into the three +lines spanned by `e_r + ω ^ (-k) • e_g + ω ^ (-2 * k) • e_b`, one in each grade, and a +colour contraction, being cyclically symmetric, lands in grade `0`. The grading group has +to be `ZMod 3` rather than the `ZMod 4` of the `SU(2)` file precisely because the element +used here has order three: on `ZMod 4` the character `k ↦ ω ^ k` would not be well defined. + +## ii. A warning: grade zero is weaker than invariance + +Like the colour weight, this is a *sieve* rather than a characterization. +`mem_zero_of_invariant` says an invariant element has grade zero, and there is no converse. +What it buys is a genuine sharpening of the colour weight in `GaugeWeightDecomposition`, +whose weight-zero piece cannot separate the colour singlet from the neutral components of a +higher multiplet — the Cartan-neutral part of the adjoint is three dimensional, not one. +Because `su3Perm` cycles the three colours it acts on the colour-weight-zero subspace, and +its grade-`1` and grade-`2` parts are thrown away by this sieve. + +The sieve cannot be pushed further by grading alone. A grading sees only the cyclic group +generated by the element it uses, and the invariants of a `ZMod 3` subgroup of `SU(3)` are +far larger than the `SU(3)` invariants. Even combining this grading with the full colour +weight only reaches the normalizer of the maximal torus; cutting the remainder down needs +the continuous symmetry, not another grading. + +## iii. Key results + +- `su3Perm` : the `SU(3)` cyclic Weyl element `!![0, 0, 1; 1, 0, 0; 0, 1, 0]`, and + `gaugeSU3Perm` its image in the gauge group. +- `su3Omega` : the primitive cube root of unity `exp (2 π i / 3)`. +- `su3PermSign` : the character `k ↦ ω ^ k` on `ZMod 3`, injective and multiplicative. +- `SU3PermDecomposition` : a `ZMod 3`-graded family of pure-sign subspaces with supremum `V`. +- `SU3PermDecomposition.sup` : two decompositions combine gradewise into one of `V ⊔ V'`. +- `SU3PermDecomposition.mul` : grades add under multiplication, decomposing `V * V'`. +- `SU3PermDecomposition.mem_zero_of_invariant` : a gauge-invariant element has grade zero. + +## iv. Table of contents + +- A. The `SU(3)` cyclic Weyl element +- B. The cube-root character of `ZMod 3` +- C. `SU(3)` permutation decompositions +- D. Joins +- E. Products +- F. Invariants + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. The `SU(3)` cyclic Weyl element + +-/ + +/-- The `SU(3)` cyclic permutation element `!![0, 0, 1; 1, 0, 0; 0, 1, 0]`. On a colour + triplet it sends `(a, b, c)` to `(c, a, b)`, cycling the three colours; it cubes to `1`, + so it has order three in `SU(3)`. A three-cycle is even, so the plain permutation matrix + already has determinant `1`. -/ +noncomputable def su3Perm : specialUnitaryGroup (Fin 3) ℂ := + ⟨!![0, 0, 1; 1, 0, 0; 0, 1, 0], by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_three, star_eq_conjTranspose, + Matrix.conjTranspose_apply] + · simp [Matrix.det_fin_three]⟩ + +/-- The underlying matrix of the cyclic element. -/ +lemma su3Perm_coe : + (su3Perm : specialUnitaryGroup (Fin 3) ℂ).1 = !![0, 0, 1; 1, 0, 0; 0, 1, 0] := rfl + +/-- The inverse cyclic element is the transpose `!![0, 1, 0; 0, 0, 1; 1, 0, 0]`, the + three-cycle running the other way. -/ +lemma su3Perm_inv_coe : + (su3Perm⁻¹ : specialUnitaryGroup (Fin 3) ℂ).1 = !![0, 1, 0; 0, 0, 1; 1, 0, 0] := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star, su3Perm_coe] + ext a b + fin_cases a <;> fin_cases b <;> simp + +/-- The cyclic element cubes to the identity, so it has order three in `SU(3)`. This is why + the grading group below is `ZMod 3`. -/ +lemma su3Perm_pow_three : su3Perm ^ 3 = 1 := by + ext a b + rw [SubmonoidClass.coe_pow, su3Perm_coe] + fin_cases a <;> fin_cases b <;> + simp [pow_succ, Matrix.mul_apply, Fin.sum_univ_three] + +/-- The cyclic element as a gauge transformation: trivial on isospin and hypercharge. -/ +noncomputable def gaugeSU3Perm : GaugeGroupI := ⟨su3Perm, 1, 1⟩ + +/-! + +## B. The cube-root character of `ZMod 3` + +-/ + +/-- The primitive cube root of unity `ω = exp (2 π i / 3)`. -/ +noncomputable def su3Omega : ℂ := Complex.exp (2 * (Real.pi : ℂ) * Complex.I / 3) + +/-- `ω` is a primitive cube root of unity. -/ +lemma su3Omega_isPrimitiveRoot : IsPrimitiveRoot su3Omega 3 := by + have h := Complex.isPrimitiveRoot_exp 3 (by norm_num) + simpa [su3Omega] using h + +/-- `ω` cubes to one. -/ +@[simp] lemma su3Omega_pow_three : su3Omega ^ 3 = 1 := + su3Omega_isPrimitiveRoot.pow_eq_one + +/-- `ω` is nonzero, being a value of the complex exponential. -/ +lemma su3Omega_ne_zero : su3Omega ≠ 0 := Complex.exp_ne_zero _ + +/-- Powers of `ω` only see the exponent modulo three. -/ +lemma su3Omega_pow_mod (m : ℕ) : su3Omega ^ (m % 3) = su3Omega ^ m := by + conv_rhs => rw [← Nat.div_add_mod m 3] + rw [pow_add, pow_mul, su3Omega_pow_three, one_pow, one_mul] + +/-- The cube root of unity `ω ^ k` attached to a grade `k : ZMod 3`: the eigenvalue of the + cyclic element on the `k` piece of a decomposition. -/ +noncomputable def su3PermSign (k : ZMod 3) : ℂ := su3Omega ^ k.val + +/-- The grade-zero sign is `1`. -/ +@[simp] lemma su3PermSign_zero : su3PermSign 0 = 1 := by + rw [su3PermSign, show (0 : ZMod 3).val = 0 from by decide, pow_zero] + +/-- The grade-one sign is `ω`. -/ +@[simp] lemma su3PermSign_one : su3PermSign 1 = su3Omega := by + rw [su3PermSign, show (1 : ZMod 3).val = 1 from by decide, pow_one] + +/-- The grade-two sign is `ω ^ 2`. -/ +@[simp] lemma su3PermSign_two : su3PermSign 2 = su3Omega ^ 2 := by + rw [su3PermSign, show (2 : ZMod 3).val = 2 from by decide] + +/-- The sign is a character: grades add under multiplication because the cube roots of + unity multiply. -/ +lemma su3PermSign_add (k l : ZMod 3) : + su3PermSign (k + l) = su3PermSign k * su3PermSign l := by + rw [su3PermSign, su3PermSign, su3PermSign, ZMod.val_add, su3Omega_pow_mod, pow_add] + +/-- Every sign is nonzero, being a root of unity. -/ +lemma su3PermSign_ne_zero (k : ZMod 3) : su3PermSign k ≠ 0 := + pow_ne_zero _ su3Omega_ne_zero + +/-- The three cube roots of unity are distinct, so the pieces of a decomposition sit in + eigenspaces at distinct eigenvalues and are automatically independent. -/ +lemma su3PermSign_injective : Function.Injective su3PermSign := by + intro k l hkl + simp only [su3PermSign] at hkl + exact ZMod.val_injective 3 + (su3Omega_isPrimitiveRoot.pow_inj (ZMod.val_lt k) (ZMod.val_lt l) hkl) + +/-! + +## C. `SU(3)` permutation decompositions + +-/ + +variable {B : Type*} [Ring B] [Algebra ℂ B] + +/-- An `SU(3)` permutation decomposition of a submodule `V`: a `ZMod 3`-graded family of + subspaces of pure sign under the cyclic element `gaugeSU3Perm`, whose supremum is `V`. + + Unlike `GaugeWeightDecomposition` there is no support field — `ZMod 3` is finite, so the + finiteness condition is automatic. The three grades carry the three cube roots of + unity. -/ +structure SU3PermDecomposition (rep : Representation ℂ GaugeGroupI B) + (V : Submodule ℂ B) where + /-- The grade `k` piece of the decomposition. -/ + piece : ZMod 3 → Submodule ℂ B + /-- Each piece is of pure sign under the cyclic element. -/ + piece_le : ∀ k, ∀ x, x ∈ piece k → rep gaugeSU3Perm x = su3PermSign k • x + /-- The pieces exhaust `V`. -/ + iSup_piece : (⨆ k, piece k) = V + +namespace SU3PermDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} + +/-- The grade-`k` piece lies in the `su3PermSign k` eigenspace of the cyclic element. This + is `piece_le` phrased as an inequality of submodules. -/ +lemma piece_le_eigenspace (d : SU3PermDecomposition rep V) (k : ZMod 3) : + d.piece k ≤ Module.End.eigenspace (rep gaugeSU3Perm) (su3PermSign k) := + fun _ hy => Module.End.mem_eigenspace_iff.mpr (d.piece_le k _ hy) + +/-- Transport a decomposition along an equality of submodules. -/ +def copy (d : SU3PermDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + SU3PermDecomposition rep W where + piece := d.piece + piece_le := d.piece_le + iSup_piece := by rw [d.iSup_piece, hW] + +/-- Copying leaves the pieces unchanged. -/ +@[simp] +lemma copy_piece (d : SU3PermDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + (d.copy W hW).piece = d.piece := rfl + +/-- The zero submodule carries the trivial decomposition, with every grade empty. This is + the unit for `sup`, and the decomposition of every submodule that turns out to vanish. -/ +def bot : SU3PermDecomposition rep (⊥ : Submodule ℂ B) where + piece _ := ⊥ + piece_le k x hx := by + rw [Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by simp + +/-- Every piece of the trivial decomposition is the zero submodule. -/ +@[simp] +lemma bot_piece (k : ZMod 3) : (bot (rep := rep)).piece k = ⊥ := rfl + +/-! + +## D. Joins + +-/ + +/-- The join of two decompositions: the pieces and suprema combine gradewise, decomposing + `V ⊔ V'`. -/ +noncomputable def sup (d : SU3PermDecomposition rep V) (d' : SU3PermDecomposition rep V') : + SU3PermDecomposition rep (V ⊔ V') where + piece k := d.piece k ⊔ d'.piece k + piece_le k x hx := + Module.End.mem_eigenspace_iff.mp + (sup_le (d.piece_le_eigenspace k) (d'.piece_le_eigenspace k) hx) + iSup_piece := by + rw [iSup_sup_eq, d.iSup_piece, d'.iSup_piece] + +/-- The pieces of a join are the joins of the pieces. -/ +@[simp] +lemma sup_piece (d : SU3PermDecomposition rep V) (d' : SU3PermDecomposition rep V') + (k : ZMod 3) : (d.sup d').piece k = d.piece k ⊔ d'.piece k := rfl + +/-! + +## E. Products + +-/ + +/-- The product of two decompositions: grades add under multiplication, so the grade-`k` + piece of `V * V'` is spanned by the products of pieces whose grades sum to `k`. + + Multiplicativity of the representation is a hypothesis rather than a field: a + `Representation` records only a linear action. -/ +noncomputable def mul (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU3PermDecomposition rep V) (d' : SU3PermDecomposition rep V') : + SU3PermDecomposition rep (V * V') where + piece k := ⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, d.piece k₁ * d'.piece k₂ + piece_le k x hx := by + have key : (⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, d.piece k₁ * d'.piece k₂) + ≤ Module.End.eigenspace (rep gaugeSU3Perm) (su3PermSign k) := by + refine iSup_le fun k₁ => iSup_le fun k₂ => iSup_le fun hk => ?_ + refine Submodule.mul_le.mpr fun m hm n hn => ?_ + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [hmul, d.piece_le k₁ m hm, d'.piece_le k₂ n hn, smul_mul_smul_comm, + ← su3PermSign_add, hk] + exact Module.End.mem_eigenspace_iff.mp (key hx) + iSup_piece := by + refine le_antisymm (iSup_le fun k => iSup_le fun k₁ => iSup_le fun k₂ => + iSup_le fun _ => ?_) ?_ + · exact mul_le_mul' ((le_iSup d.piece k₁).trans d.iSup_piece.le) + ((le_iSup d'.piece k₂).trans d'.iSup_piece.le) + · have hV : (⨆ k₁, d.piece k₁) * (⨆ k₂, d'.piece k₂) = V * V' := by + rw [d.iSup_piece, d'.iSup_piece] + rw [← hV, Submodule.iSup_mul] + refine iSup_le fun k₁ => ?_ + rw [Submodule.mul_iSup] + refine iSup_le fun k₂ => ?_ + exact le_iSup_of_le (k₁ + k₂) + (le_iSup_of_le k₁ (le_iSup_of_le k₂ (le_iSup_of_le rfl le_rfl))) + +/-- The grade-`k` piece of a product, as a double join over pairs of grades summing to + `k`. -/ +lemma mul_piece (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU3PermDecomposition rep V) (d' : SU3PermDecomposition rep V') (k : ZMod 3) : + (d.mul hmul d').piece k = ⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, d.piece k₁ * d'.piece k₂ := rfl + +/-- The grade-`k` piece of a product, with the second grade solved for: the double join + collapses to a single one. -/ +lemma mul_piece_eq_sub + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU3PermDecomposition rep V) (d' : SU3PermDecomposition rep V') (k : ZMod 3) : + (d.mul hmul d').piece k = ⨆ k₁, d.piece k₁ * d'.piece (k - k₁) := by + rw [mul_piece] + refine le_antisymm (iSup_le fun k₁ => iSup_le fun k₂ => iSup_le fun hk => ?_) ?_ + · exact le_iSup_of_le k₁ (by rw [eq_sub_of_add_eq' hk]) + · exact iSup_le fun k₁ => + le_iSup_of_le k₁ (le_iSup_of_le (k - k₁) (le_iSup_of_le (add_sub_cancel k₁ k) le_rfl)) + +/-- The grade-`k` piece of a product, written out. `ZMod 3` has three elements, so the + join is a three-term one. -/ +lemma mul_piece_eq (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU3PermDecomposition rep V) (d' : SU3PermDecomposition rep V') (k : ZMod 3) : + (d.mul hmul d').piece k + = d.piece 0 * d'.piece k ⊔ d.piece 1 * d'.piece (k - 1) + ⊔ d.piece 2 * d'.piece (k - 2) := by + have hcases : ∀ j : ZMod 3, j = 0 ∨ j = 1 ∨ j = 2 := by decide + rw [mul_piece_eq_sub] + refine le_antisymm (iSup_le fun k₁ => ?_) (sup_le (sup_le ?_ ?_) ?_) + · rcases hcases k₁ with rfl | rfl | rfl + · rw [sub_zero] + exact le_sup_of_le_left le_sup_left + · exact le_sup_of_le_left le_sup_right + · exact le_sup_right + · exact le_iSup_of_le 0 (by rw [sub_zero]) + · exact le_iSup_of_le 1 le_rfl + · exact le_iSup_of_le 2 le_rfl + +/-- The unit submodule has grade zero: the identity of `B` is fixed by every gauge + transformation, provided the representation preserves the unit. -/ +noncomputable def one (hone : ∀ g : GaugeGroupI, rep g 1 = 1) : + SU3PermDecomposition rep (1 : Submodule ℂ B) where + piece k := if k = 0 then 1 else ⊥ + piece_le := by + intro k x hx + rcases eq_or_ne k 0 with rfl | hk + · rw [if_pos rfl, Submodule.one_eq_span, Submodule.mem_span_singleton] at hx + obtain ⟨c, rfl⟩ := hx + rw [map_smul, hone, su3PermSign_zero, one_smul] + · rw [if_neg hk, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + refine le_antisymm (iSup_le fun k => ?_) (le_iSup_of_le 0 (le_of_eq (if_pos rfl).symm)) + by_cases hk : k = 0 + · rw [if_pos hk] + · rw [if_neg hk] + exact bot_le + +/-- The unit decomposition is concentrated in grade zero. -/ +@[simp] +lemma one_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) (k : ZMod 3) : + (one (B := B) (rep := rep) hone).piece k = if k = 0 then 1 else ⊥ := rfl + +/-- Powers of a decomposed submodule: grades add, so `V ^ n` inherits a decomposition, built + by iterating `mul` from `one`. -/ +noncomputable def pow (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU3PermDecomposition rep V) : + (n : ℕ) → SU3PermDecomposition rep (V ^ n) + | 0 => (one hone).copy _ (pow_zero V) + | (n + 1) => ((pow hone hmul d n).mul hmul d).copy _ (pow_succ V n) + +/-- The zeroth power decomposition is the unit one. -/ +@[simp] +lemma pow_zero_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU3PermDecomposition rep V) (k : ZMod 3) : + (d.pow hone hmul 0).piece k = if k = 0 then 1 else ⊥ := rfl + +/-- The pieces of a successor power, unfolded one step of `mul`. -/ +@[simp] +lemma pow_succ_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) + (d : SU3PermDecomposition rep V) (n : ℕ) (k : ZMod 3) : + (d.pow hone hmul (n + 1)).piece k + = ⨆ k₁, ⨆ k₂, ⨆ _ : k₁ + k₂ = k, (d.pow hone hmul n).piece k₁ * d.piece k₂ := rfl + +/-! + +## F. Invariants + +-/ + +/-- A gauge-invariant element has grade zero. Only invariance under the single cyclic + element `gaugeSU3Perm` is used: the other pieces lie in eigenspaces at `ω` and `ω ^ 2`, + both distinct from `1`. + + There is no converse; see the warning in the module docstring. -/ +lemma mem_zero_of_invariant (d : SU3PermDecomposition rep V) {x : B} (hx : x ∈ V) + (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ d.piece 0 := by + have hdisj : Disjoint + (Module.End.eigenspace (rep gaugeSU3Perm) (su3PermSign 0)) + (⨆ k, ⨆ _ : k ≠ (0 : ZMod 3), d.piece k) := + (((Module.End.eigenspaces_iSupIndep (rep gaugeSU3Perm : Module.End ℂ B)).comp + su3PermSign_injective) 0).mono_right (iSup₂_mono fun k _ => d.piece_le_eigenspace k) + have key : (⨆ k, d.piece k) + ⊓ Module.End.eigenspace (rep gaugeSU3Perm) (su3PermSign 0) ≤ d.piece 0 := by + rw [iSup_split_single d.piece 0, sup_inf_assoc_of_le _ (d.piece_le_eigenspace 0)] + exact sup_le le_rfl (hdisj.symm.le_bot.trans bot_le) + refine key ⟨?_, Module.End.mem_eigenspace_iff.mpr ?_⟩ + · rw [d.iSup_piece] + exact hx + · rw [su3PermSign_zero, one_smul] + exact hV _ + +end SU3PermDecomposition +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean index 27463b2d9..0af265a0e 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean @@ -107,6 +107,771 @@ noncomputable def massWeightSubmoduleGaugeWeightEight : (d' := h.derivSubmoduleGaugeWeight 1)) _ h.massWeightSubmodule_eight_eq +/-! + +## The weight-zero pieces + +-/ + +/-- Every gauge weight carried by a fermion symbol has nonzero hypercharge: each of the + ten species has a fixed nonzero hypercharge, independent of colour, isospin and + family, and the barred species carry the negative of the unbarred one. So the zero + weight never occurs. -/ +lemma zero_not_mem_fermionGaugeWeights : (0 : GaugeWeight) ∉ fermionGaugeWeights := by + decide + +/-- The weight-zero piece of the fermion derivative submodules is trivial: unlike + the gauge sector, no single fermion symbol is a gauge singlet, since every one of the + ten species carries a fixed nonzero hypercharge. A gauge-invariant combination needs + at least two fermion insertions, which is why it is the mass weights six and eight, + the products of two towers, that carry the interesting weight-zero content. -/ +lemma derivSubmoduleGaugeWeight_piece_zero (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece 0 = ⊥ := + (h.derivSubmoduleGaugeWeight n).piece_eq_zero_of_not_mem_supp 0 + (h.derivSubmoduleGaugeWeight_supp n ▸ zero_not_mem_fermionGaugeWeights) + +/-- The weight-zero piece at mass weight 1: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightOne_piece_zero : + (h.massWeightSubmoduleGaugeWeightOne).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight 2: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightTwo_piece_zero : + (h.massWeightSubmoduleGaugeWeightTwo).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight three: the underived fermion towers carry no + gauge singlet, since every fermion symbol has nonzero hypercharge. -/ +lemma massWeightSubmoduleGaugeWeightThree_piece_zero : + (h.massWeightSubmoduleGaugeWeightThree).piece 0 = ⊥ := + h.derivSubmoduleGaugeWeight_piece_zero 0 + +/-- The weight-zero piece at mass weight 4: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightFour_piece_zero : + (h.massWeightSubmoduleGaugeWeightFour).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight five: the once-derived fermion towers carry no + gauge singlet, since every fermion symbol has nonzero hypercharge. -/ +lemma massWeightSubmoduleGaugeWeightFive_piece_zero : + (h.massWeightSubmoduleGaugeWeightFive).piece 0 = ⊥ := + h.derivSubmoduleGaugeWeight_piece_zero 1 + +/-- The weight-zero piece at mass weight seven: the twice-derived fermion towers carry + no gauge singlet, since every fermion symbol has nonzero hypercharge. -/ +lemma massWeightSubmoduleGaugeWeightSeven_piece_zero : + (h.massWeightSubmoduleGaugeWeightSeven).piece 0 = ⊥ := + h.derivSubmoduleGaugeWeight_piece_zero 2 + +/-! + +### Infrastructure for the product weights six and eight + +Mass weights six and eight are products of two fermion towers, and their weight-zero +piece is genuinely nontrivial: it is spanned by pairing each species with its own +conjugate (a mass term). Splitting the product decomposition down to the ten species +and discarding the non-conjugate pairings, whose hypercharges never cancel, takes the +infrastructure developed here. + +-/ + +/-- If the left factor of a product decomposition is a join `VA ⊔ VB`, its weight-`w` + piece splits along the join. -/ +lemma piece_sup_mul {VA VB VC : Submodule ℂ B} + (dA : GaugeWeightDecomposition repGauge VA) (dB : GaugeWeightDecomposition repGauge VB) + (dC : GaugeWeightDecomposition repGauge VC) (w : GaugeWeight) : + (GaugeWeightDecomposition.mul (d := GaugeWeightDecomposition.sup (d := dA) (d' := dB)) + (d' := dC)).piece w + = (GaugeWeightDecomposition.mul (d := dA) (d' := dC)).piece w + ⊔ (GaugeWeightDecomposition.mul (d := dB) (d' := dC)).piece w := + GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := GaugeWeightDecomposition.sup (d := dA) (d' := dB)) + (d' := dC)) + (d' := GaugeWeightDecomposition.sup (d := GaugeWeightDecomposition.mul (d := dA) (d' := dC)) + (d' := GaugeWeightDecomposition.mul (d := dB) (d' := dC))) + (Submodule.sup_mul VA VB VC) w + +/-- If the right factor of a product decomposition is a join `VA ⊔ VB`, its weight-`w` + piece splits along the join. -/ +lemma piece_mul_sup {VA VB VC : Submodule ℂ B} + (dC : GaugeWeightDecomposition repGauge VC) (dA : GaugeWeightDecomposition repGauge VA) + (dB : GaugeWeightDecomposition repGauge VB) (w : GaugeWeight) : + (GaugeWeightDecomposition.mul (d := dC) + (d' := GaugeWeightDecomposition.sup (d := dA) (d' := dB))).piece w + = (GaugeWeightDecomposition.mul (d := dC) (d' := dA)).piece w + ⊔ (GaugeWeightDecomposition.mul (d := dC) (d' := dB)).piece w := + GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := dC) + (d' := GaugeWeightDecomposition.sup (d := dA) (d' := dB))) + (d' := GaugeWeightDecomposition.sup (d := GaugeWeightDecomposition.mul (d := dC) (d' := dA)) + (d' := GaugeWeightDecomposition.mul (d := dC) (d' := dB))) + (Submodule.mul_sup VC VA VB) w + +/-- Two decompositions with constant, non-cancelling hypercharge across their whole + supports have a trivial product at weight zero: a weight from one can never cancel + a weight from the other. -/ +lemma mul_piece_zero_eq_bot_of_hypercharge {V V' : Submodule ℂ B} + {dV : GaugeWeightDecomposition repGauge V} {dV' : GaugeWeightDecomposition repGauge V'} + {hc hc' : ℤ} (hV : ∀ w ∈ dV.supp, w.2.2.2 = hc) (hV' : ∀ w ∈ dV'.supp, w.2.2.2 = hc') + (hne : hc + hc' ≠ 0) : + (GaugeWeightDecomposition.mul (d := dV) (d' := dV')).piece 0 = ⊥ := by + rw [show (GaugeWeightDecomposition.mul (d := dV) (d' := dV')).piece 0 + = GaugeWeightDecomposition.piece repGauge (V * V') 0 from rfl, + GaugeWeightDecomposition.mul_piece_eq_sub (d := dV) (d' := dV') 0] + refine le_antisymm (iSup₂_le fun w1 hw1 => ?_) bot_le + have h1 := hV w1 hw1 + have h2 : (0 : GaugeWeight) - w1 ∉ dV'.supp := by + intro hmem + have h2' := hV' _ hmem + have e : ((0 : GaugeWeight) - w1).2.2.2 = -(w1.2.2.2) := by + rw [zero_sub, ← GaugeWeight.coord_three, ← GaugeWeight.coord_three, GaugeWeight.coord_neg] + rw [e, h1] at h2' + omega + rw [dV'.piece_eq_zero_of_not_mem_supp _ h2, Submodule.mul_bot] + +/-- The `d` symbols carry hypercharge `2` (the negative of the down-singlet's `-2`), + independent of colour and family. -/ +lemma rangeGaugeWeight_d_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_d f l).supp, w.2.2.2 = 2 := by + rw [h.rangeGaugeWeight_d_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [DownSinglet.valueGaugeWeight] + +/-- The `bard` symbols carry hypercharge `-2`, independent of colour and family. -/ +lemma rangeGaugeWeight_bard_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_bard f l).supp, w.2.2.2 = -2 := by + rw [h.rangeGaugeWeight_bard_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [DownSinglet.valueGaugeWeight] + +/-- The `u` symbols carry hypercharge `-4`, independent of colour and family. -/ +lemma rangeGaugeWeight_u_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_u f l).supp, w.2.2.2 = -4 := by + rw [h.rangeGaugeWeight_u_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [UpSinglet.valueGaugeWeight] + +/-- The `baru` symbols carry hypercharge `4`, independent of colour and family. -/ +lemma rangeGaugeWeight_baru_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_baru f l).supp, w.2.2.2 = 4 := by + rw [h.rangeGaugeWeight_baru_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [UpSinglet.valueGaugeWeight] + +/-- The `Q` symbols carry hypercharge `-1`, independent of colour, isospin and + family. -/ +lemma rangeGaugeWeight_Q_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_Q f l).supp, w.2.2.2 = -1 := by + rw [h.rangeGaugeWeight_Q_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [QuarkDoublet.valueGaugeWeight] + +/-- The `barQ` symbols carry hypercharge `1`, independent of colour, isospin and + family. -/ +lemma rangeGaugeWeight_barQ_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_barQ f l).supp, w.2.2.2 = 1 := by + rw [h.rangeGaugeWeight_barQ_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [QuarkDoublet.valueGaugeWeight] + +/-- The `L` symbols carry hypercharge `3`, independent of isospin and family. -/ +lemma rangeGaugeWeight_L_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_L f l).supp, w.2.2.2 = 3 := by + rw [h.rangeGaugeWeight_L_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [LeptonDoublet.valueGaugeWeight] + +/-- The `barL` symbols carry hypercharge `-3`, independent of isospin and family. -/ +lemma rangeGaugeWeight_barL_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_barL f l).supp, w.2.2.2 = -3 := by + rw [h.rangeGaugeWeight_barL_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [LeptonDoublet.valueGaugeWeight] + +/-- The `e` symbols carry hypercharge `6`, independent of family. -/ +lemma rangeGaugeWeight_e_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_e f l).supp, w.2.2.2 = 6 := by + rw [h.rangeGaugeWeight_e_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [LeptonSinglet.valueGaugeWeight] + +/-- The `bare` symbols carry hypercharge `-6`, independent of family. -/ +lemma rangeGaugeWeight_bare_hc {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + ∀ w ∈ (h.rangeGaugeWeight_bare f l).supp, w.2.2.2 = -6 := by + rw [h.rangeGaugeWeight_bare_supp] + rintro w hw + simp only [Finset.mem_image, Finset.mem_univ, true_and] at hw + obtain ⟨j, rfl⟩ := hw + simp [LeptonSinglet.valueGaugeWeight] + +/-- The gauge weight decomposition of one family's full set of symbols at fixed + derivative slots, matching the recipe of `derivSubmodule` itself: the join of the + ten species' ranges. -/ +@[implicit_reducible] +noncomputable def speciesGaugeWeight (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + GaugeWeightDecomposition repGauge + (LinearMap.range (d f l) ⊔ LinearMap.range (bard f l) ⊔ + LinearMap.range (u f l) ⊔ LinearMap.range (baru f l) ⊔ + LinearMap.range (Q f l) ⊔ LinearMap.range (barQ f l) ⊔ + LinearMap.range (L f l) ⊔ LinearMap.range (barL f l) ⊔ + LinearMap.range (e f l) ⊔ LinearMap.range (bare f l)) := + GaugeWeightDecomposition.sup (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := h.rangeGaugeWeight_d f l) + (d' := h.rangeGaugeWeight_bard f l)) + (d' := h.rangeGaugeWeight_u f l)) + (d' := h.rangeGaugeWeight_baru f l)) + (d' := h.rangeGaugeWeight_Q f l)) + (d' := h.rangeGaugeWeight_barQ f l)) + (d' := h.rangeGaugeWeight_L f l)) + (d' := h.rangeGaugeWeight_barL f l)) + (d' := h.rangeGaugeWeight_e f l)) + (d' := h.rangeGaugeWeight_bare f l) + +/-- The weight-zero piece of the product of two families' full symbol sets collapses + to the ten conjugate pairings: every other combination of species has hypercharges + that cannot cancel. -/ +lemma speciesGaugeWeight_mul_piece_zero {n m : ℕ} (f f' : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) : + (GaugeWeightDecomposition.mul (d := h.speciesGaugeWeight f l) + (d' := h.speciesGaugeWeight f' l')).piece 0 + = + (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_d f l) + (d' := h.rangeGaugeWeight_bard f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_bard f l) + (d' := h.rangeGaugeWeight_d f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_u f l) + (d' := h.rangeGaugeWeight_baru f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_baru f l) + (d' := h.rangeGaugeWeight_u f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_Q f l) + (d' := h.rangeGaugeWeight_barQ f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_barQ f l) + (d' := h.rangeGaugeWeight_Q f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_L f l) + (d' := h.rangeGaugeWeight_barL f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_barL f l) + (d' := h.rangeGaugeWeight_L f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_e f l) + (d' := h.rangeGaugeWeight_bare f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_bare f l) + (d' := h.rangeGaugeWeight_e f' l')).piece 0 := by + simp only [piece_sup_mul, piece_mul_sup, + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_d_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bard_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_u_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_baru_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_Q_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barQ_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_L_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_barL_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_e_hc f l) + (h.rangeGaugeWeight_e_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_d_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_bard_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_u_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_baru_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_Q_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_barQ_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_L_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_barL_hc f' l') (by decide), + mul_piece_zero_eq_bot_of_hypercharge (h.rangeGaugeWeight_bare_hc f l) + (h.rangeGaugeWeight_bare_hc f' l') (by decide), + bot_sup_eq, sup_bot_eq] + ac_rfl + +/-- The zero-index derivative slot collapses a supremum over it to its value: there + is nothing to derive with respect to. -/ +lemma iSup_fin_zero_eq {α : Type} [CompleteLattice α] (F : (Fin 0 → Fin 1 ⊕ Fin 3) → α) : + ⨆ l, F l = F ![] := + le_antisymm (iSup_le fun l => by rw [Subsingleton.elim l ![]]) (le_iSup F ![]) + +/-- The underived derivative submodule as a join over families alone, the trivial + derivative slot dropped. -/ +lemma derivSubmodule_zero_eq : + h.derivSubmodule 0 = ⨆ (f : Fin 3), + (LinearMap.range (d f ![]) ⊔ + LinearMap.range (bard f ![]) ⊔ + LinearMap.range (u f ![]) ⊔ + LinearMap.range (baru f ![]) ⊔ + LinearMap.range (Q f ![]) ⊔ + LinearMap.range (barQ f ![]) ⊔ + LinearMap.range (L f ![]) ⊔ + LinearMap.range (barL f ![]) ⊔ + LinearMap.range (e f ![]) ⊔ + LinearMap.range (bare f ![])) := by + show (⨆ (_ : Fin 3) (_ : Fin 0 → Fin 1 ⊕ Fin 3), _) = _ + exact iSup_congr fun f => iSup_fin_zero_eq _ + +/-- The weight-zero piece at mass weight six, written out in the mass terms + themselves: the join, over pairs of families, of the ten ways to pair each + species with its own conjugate. Every other pairing of species has hypercharges + that cannot cancel, by `speciesGaugeWeight_mul_piece_zero`. -/ +lemma massWeightSubmoduleGaugeWeightSix_piece_zero : + (h.massWeightSubmoduleGaugeWeightSix).piece 0 + = ⨆ (f : Fin 3) (f' : Fin 3), + (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_d f ![]) + (d' := h.rangeGaugeWeight_bard f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_bard f ![]) + (d' := h.rangeGaugeWeight_d f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_u f ![]) + (d' := h.rangeGaugeWeight_baru f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_baru f ![]) + (d' := h.rangeGaugeWeight_u f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_Q f ![]) + (d' := h.rangeGaugeWeight_barQ f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_barQ f ![]) + (d' := h.rangeGaugeWeight_Q f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_L f ![]) + (d' := h.rangeGaugeWeight_barL f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_barL f ![]) + (d' := h.rangeGaugeWeight_L f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_e f ![]) + (d' := h.rangeGaugeWeight_bare f' ![])).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_bare f ![]) + (d' := h.rangeGaugeWeight_e f' ![])).piece 0 := by + have hprod : h.derivSubmodule 0 * h.derivSubmodule 0 + = ⨆ (f : Fin 3) (f' : Fin 3), + (LinearMap.range (d f ![]) ⊔ + LinearMap.range (bard f ![]) ⊔ + LinearMap.range (u f ![]) ⊔ + LinearMap.range (baru f ![]) ⊔ + LinearMap.range (Q f ![]) ⊔ + LinearMap.range (barQ f ![]) ⊔ + LinearMap.range (L f ![]) ⊔ + LinearMap.range (barL f ![]) ⊔ + LinearMap.range (e f ![]) ⊔ + LinearMap.range (bare f ![])) + * (LinearMap.range (d f' ![]) ⊔ + LinearMap.range (bard f' ![]) ⊔ + LinearMap.range (u f' ![]) ⊔ + LinearMap.range (baru f' ![]) ⊔ + LinearMap.range (Q f' ![]) ⊔ + LinearMap.range (barQ f' ![]) ⊔ + LinearMap.range (L f' ![]) ⊔ + LinearMap.range (barL f' ![]) ⊔ + LinearMap.range (e f' ![]) ⊔ + LinearMap.range (bare f' ![])) := by + rw [h.derivSubmodule_zero_eq, Submodule.iSup_mul] + exact iSup_congr fun f => Submodule.mul_iSup _ _ + show (GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 0)).piece 0 = _ + rw [GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 0)) + (d' := GaugeWeightDecomposition.iSup hrepGauge_mul (fun f => + GaugeWeightDecomposition.iSup hrepGauge_mul (fun f' => + GaugeWeightDecomposition.mul (d := h.speciesGaugeWeight f ![]) + (d' := h.speciesGaugeWeight f' ![])))) + hprod 0] + simp only [GaugeWeightDecomposition.piece_iSup] + exact iSup_congr fun f => iSup_congr fun f' => + h.speciesGaugeWeight_mul_piece_zero f f' ![] ![] + +/-- The weight-zero piece at mass weight eight, written out in the kinetic terms + themselves: the join, over pairs of families and a once-derived slot, of the ten + ways to pair each species with its own conjugate. Every other pairing of species has + hypercharges that cannot cancel, by `speciesGaugeWeight_mul_piece_zero`. -/ +lemma massWeightSubmoduleGaugeWeightEight_piece_zero : + (h.massWeightSubmoduleGaugeWeightEight).piece 0 + = ⨆ (f : Fin 3) (f' : Fin 3) (l' : Fin 1 → Fin 1 ⊕ Fin 3), + (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_d f ![]) + (d' := h.rangeGaugeWeight_bard f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_bard f ![]) + (d' := h.rangeGaugeWeight_d f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_u f ![]) + (d' := h.rangeGaugeWeight_baru f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_baru f ![]) + (d' := h.rangeGaugeWeight_u f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_Q f ![]) + (d' := h.rangeGaugeWeight_barQ f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_barQ f ![]) + (d' := h.rangeGaugeWeight_Q f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_L f ![]) + (d' := h.rangeGaugeWeight_barL f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_barL f ![]) + (d' := h.rangeGaugeWeight_L f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_e f ![]) + (d' := h.rangeGaugeWeight_bare f' l')).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := h.rangeGaugeWeight_bare f ![]) + (d' := h.rangeGaugeWeight_e f' l')).piece 0 := by + have hprod : h.derivSubmodule 0 * h.derivSubmodule 1 + = ⨆ (f : Fin 3) (f' : Fin 3) (l' : Fin 1 → Fin 1 ⊕ Fin 3), + (LinearMap.range (d f ![]) ⊔ + LinearMap.range (bard f ![]) ⊔ + LinearMap.range (u f ![]) ⊔ + LinearMap.range (baru f ![]) ⊔ + LinearMap.range (Q f ![]) ⊔ + LinearMap.range (barQ f ![]) ⊔ + LinearMap.range (L f ![]) ⊔ + LinearMap.range (barL f ![]) ⊔ + LinearMap.range (e f ![]) ⊔ + LinearMap.range (bare f ![])) + * (LinearMap.range (d f' l') ⊔ + LinearMap.range (bard f' l') ⊔ + LinearMap.range (u f' l') ⊔ + LinearMap.range (baru f' l') ⊔ + LinearMap.range (Q f' l') ⊔ + LinearMap.range (barQ f' l') ⊔ + LinearMap.range (L f' l') ⊔ + LinearMap.range (barL f' l') ⊔ + LinearMap.range (e f' l') ⊔ + LinearMap.range (bare f' l')) := by + rw [h.derivSubmodule_zero_eq, + show h.derivSubmodule 1 = ⨆ (f' : Fin 3) (l' : Fin 1 → Fin 1 ⊕ Fin 3), + (LinearMap.range (d f' l') ⊔ + LinearMap.range (bard f' l') ⊔ + LinearMap.range (u f' l') ⊔ + LinearMap.range (baru f' l') ⊔ + LinearMap.range (Q f' l') ⊔ + LinearMap.range (barQ f' l') ⊔ + LinearMap.range (L f' l') ⊔ + LinearMap.range (barL f' l') ⊔ + LinearMap.range (e f' l') ⊔ + LinearMap.range (bare f' l')) from rfl, + Submodule.iSup_mul] + exact iSup_congr fun f => by + rw [Submodule.mul_iSup] + exact iSup_congr fun f' => Submodule.mul_iSup _ _ + show (GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 1)).piece 0 = _ + rw [GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 1)) + (d' := GaugeWeightDecomposition.iSup hrepGauge_mul (fun f => + GaugeWeightDecomposition.iSup hrepGauge_mul (fun f' => + GaugeWeightDecomposition.iSup hrepGauge_mul (fun l' => + GaugeWeightDecomposition.mul (d := h.speciesGaugeWeight f ![]) + (d' := h.speciesGaugeWeight f' l'))))) + hprod 0] + simp only [GaugeWeightDecomposition.piece_iSup] + exact iSup_congr fun f => iSup_congr fun f' => iSup_congr fun l' => + h.speciesGaugeWeight_mul_piece_zero f f' ![] l' + +/-! + +## Invariants modulo a gauge-stable submodule + +A submodule `S` closed under the gauge action can be discarded from a gauge-invariant +element: if `x` is gauge invariant and lies in a fermionic submodule joined with `S`, then +its fermionic part has to vanish and `x` already lies in `S`. The reason is the one behind +`derivSubmoduleGaugeWeight_piece_zero`: every one of the ten species carries a fixed nonzero +hypercharge, so no nonzero fermionic element is a gauge singlet. + +The argument runs one weight at a time. Split off a piece of weight `w`, so that `x = a + y` +with `a` of pure weight `w` and `y` in the join of the remaining pieces with `S`. The +hypercharge generator `g` fixes `x` and scales `a` by some `c ≠ 1`, so +`(c - 1) • x = c • y - g y`, which lies in that smaller join because both the pieces and `S` +are stable under `g`. Dividing by `c - 1` deletes the weight `w`, and the induction closes on +the empty support. Only the hypercharge generator is needed, since it alone separates every +fermion weight from zero. + +This is the fermionic analogue of `exists_smul_contraction_of_invariant_subset` for the +Lorentz group. + +-/ + +/-- The one-weight-at-a-time refinement. Let `S` be closed under the gauge action and let `s` + be a finite set of gauge weights each of which is seen by the `i`-th torus generator, in + the sense that its `i`-th coordinate is nonzero. Then a gauge-invariant element of the join + of the weight-`w` pieces for `w ∈ s` with `S` already lies in `S`. -/ +lemma mem_of_invariant_of_mem_biSup_piece_sup {V S : Submodule ℂ B} + (dV : GaugeWeightDecomposition repGauge V) + (hS : ∀ (g : GaugeGroupI) (y : B), y ∈ S → repGauge g y ∈ S) (i : Fin 4) : + ∀ (s : Finset GaugeWeight), (∀ w ∈ s, w.coord i ≠ 0) → + ∀ x ∈ (⨆ w ∈ s, dV.piece w) ⊔ S, (∀ g : GaugeGroupI, repGauge g x = x) → x ∈ S := by + intro s + induction s using Finset.induction_on with + | empty => + intro _ x hx _ + simpa using hx + | @insert w₀ s' hw₀ ih => + intro hs x hx hinv + rw [Finset.iSup_insert, sup_assoc] at hx + obtain ⟨a, ha, y, hy, rfl⟩ := Submodule.mem_sup.mp hx + have hc1 : ((expI : ℂ) ^ w₀.coord i) ≠ 1 := by + intro hcc + exact hs w₀ (Finset.mem_insert_self w₀ s') + (expI_zpow_injective (show (expI : ℂ) ^ w₀.coord i = (expI : ℂ) ^ (0 : ℤ) by + rw [zpow_zero]; exact hcc)) + have hpiece : ∀ w, ∀ z ∈ dV.piece w, repGauge (gaugeTorusGen i) z ∈ dV.piece w := by + intro w z hz + rw [dV.piece_le w z hz i] + exact (dV.piece w).smul_mem _ hz + have hmap : Submodule.map (repGauge (gaugeTorusGen i)) ((⨆ w ∈ s', dV.piece w) ⊔ S) + ≤ (⨆ w ∈ s', dV.piece w) ⊔ S := by + rw [Submodule.map_sup] + refine sup_le (le_sup_of_le_left ?_) (le_sup_of_le_right ?_) + · simp only [Submodule.map_iSup] + exact iSup₂_le fun w hw => le_iSup₂_of_le w hw + (Submodule.map_le_iff_le_comap.mpr fun z hz => hpiece w z hz) + · exact Submodule.map_le_iff_le_comap.mpr fun z hz => hS _ z hz + have hsum : ((expI : ℂ) ^ w₀.coord i) • a + repGauge (gaugeTorusGen i) y = a + y := by + have hg := hinv (gaugeTorusGen i) + rwa [map_add, dV.piece_le w₀ a ha i] at hg + have hkey : ((expI : ℂ) ^ w₀.coord i - 1) • (a + y) + = ((expI : ℂ) ^ w₀.coord i) • y - repGauge (gaugeTorusGen i) y := by + rw [sub_smul, one_smul, smul_add, ← hsum] + abel + have hmem : (a + y) ∈ (⨆ w ∈ s', dV.piece w) ⊔ S := by + have h1 : ((expI : ℂ) ^ w₀.coord i - 1) • (a + y) ∈ (⨆ w ∈ s', dV.piece w) ⊔ S := by + rw [hkey] + exact Submodule.sub_mem _ (Submodule.smul_mem _ _ hy) (hmap ⟨y, hy, rfl⟩) + have h2 := Submodule.smul_mem _ (((expI : ℂ) ^ w₀.coord i - 1)⁻¹) h1 + rwa [smul_smul, inv_mul_cancel₀ (sub_ne_zero.mpr hc1), one_smul] at h2 + exact ih (fun w hw => hs w (Finset.mem_insert_of_mem hw)) (a + y) hmem hinv + +/-- A gauge-invariant element of `h.derivSubmodule n ⊔ S`, for any submodule `S` closed under + the gauge action, already lies in `S`. The fermionic part carries no gauge singlet, since + each of the ten species has a fixed nonzero hypercharge, so it cannot survive; what is left + is the part in `S`. Compare `derivSubmoduleGaugeWeight_piece_zero`. -/ +lemma mem_of_invariant_of_mem_derivSubmodule_sup {n : ℕ} {S : Submodule ℂ B} + (hS : ∀ (g : GaugeGroupI) (y : B), y ∈ S → repGauge g y ∈ S) + {x : B} (hx : x ∈ h.derivSubmodule n ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ S := by + refine mem_of_invariant_of_mem_biSup_piece_sup (h.derivSubmoduleGaugeWeight n) hS 3 + (h.derivSubmoduleGaugeWeight n).supp ?_ x ?_ hinv + · have hhc : ∀ w ∈ fermionGaugeWeights, w.2.2.2 ≠ 0 := by decide + intro w hw + rw [GaugeWeight.coord_three] + exact hhc w (h.derivSubmoduleGaugeWeight_supp n ▸ hw) + · refine sup_le_sup_right + (le_trans (le_of_eq (h.derivSubmoduleGaugeWeight n).iSup_piece.symm) ?_) S hx + refine iSup_le fun w => ?_ + by_cases hw : w ∈ (h.derivSubmoduleGaugeWeight n).supp + · exact le_iSup₂_of_le w hw le_rfl + · rw [(h.derivSubmoduleGaugeWeight n).piece_eq_bot w hw] + exact bot_le + +/-- Mass weight one contributes nothing to a join: the submodule is trivial, so no invariance + hypothesis is needed. -/ +lemma mem_of_mem_massWeightSubmoduleOne_sup {S : Submodule ℂ B} + {x : B} (hx : x ∈ h.massWeightSubmodule 1 ⊔ S) : x ∈ S := by + rwa [h.massWeightSubmodule_one_eq, bot_sup_eq] at hx + +/-- Mass weight two contributes nothing to a join: the submodule is trivial, so no invariance + hypothesis is needed. -/ +lemma mem_of_mem_massWeightSubmoduleTwo_sup {S : Submodule ℂ B} + {x : B} (hx : x ∈ h.massWeightSubmodule 2 ⊔ S) : x ∈ S := by + rwa [h.massWeightSubmodule_two_eq, bot_sup_eq] at hx + +/-- Mass weight four contributes nothing to a join: the submodule is trivial, so no + invariance hypothesis is needed. -/ +lemma mem_of_mem_massWeightSubmoduleFour_sup {S : Submodule ℂ B} + {x : B} (hx : x ∈ h.massWeightSubmodule 4 ⊔ S) : x ∈ S := by + rwa [h.massWeightSubmodule_four_eq, bot_sup_eq] at hx + +/-- A gauge-invariant element of `h.massWeightSubmodule 3 ⊔ S`, for `S` closed under the + gauge action, lies in `S`: mass weight three is the underived fermion towers, which carry + no gauge singlet. -/ +lemma mem_of_invariant_of_mem_massWeightSubmoduleThree_sup {S : Submodule ℂ B} + (hS : ∀ (g : GaugeGroupI) (y : B), y ∈ S → repGauge g y ∈ S) + {x : B} (hx : x ∈ h.massWeightSubmodule 3 ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ S := + h.mem_of_invariant_of_mem_derivSubmodule_sup hS + (by rwa [h.massWeightSubmodule_three_eq] at hx) hinv + +/-- A gauge-invariant element of `h.massWeightSubmodule 5 ⊔ S`, for `S` closed under the + gauge action, lies in `S`: mass weight five is the once-derived fermion towers, which carry + no gauge singlet. -/ +lemma mem_of_invariant_of_mem_massWeightSubmoduleFive_sup {S : Submodule ℂ B} + (hS : ∀ (g : GaugeGroupI) (y : B), y ∈ S → repGauge g y ∈ S) + {x : B} (hx : x ∈ h.massWeightSubmodule 5 ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ S := + h.mem_of_invariant_of_mem_derivSubmodule_sup hS + (by rwa [h.massWeightSubmodule_five_eq] at hx) hinv + +/-- A gauge-invariant element of `h.massWeightSubmodule 7 ⊔ S`, for `S` closed under the + gauge action, lies in `S`: mass weight seven is the twice-derived fermion towers, which + carry no gauge singlet. -/ +lemma mem_of_invariant_of_mem_massWeightSubmoduleSeven_sup {S : Submodule ℂ B} + (hS : ∀ (g : GaugeGroupI) (y : B), y ∈ S → repGauge g y ∈ S) + {x : B} (hx : x ∈ h.massWeightSubmodule 7 ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ S := + h.mem_of_invariant_of_mem_derivSubmodule_sup hS + (by rwa [h.massWeightSubmodule_seven_eq] at hx) hinv + end IsFermionSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean index 6e2347b2c..028464a8d 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Relativity.IsLorentzDeriv public import Mathlib.Algebra.Polynomial.AlgebraMap /-! @@ -79,6 +80,53 @@ def gaugeAlgebra (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLore (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), Set.range (F l μ ν)) +/-! + +## The individual gauge-group contributions to the field strength + +The field-strength symbol family `F` packages together the contributions of the three +factors of the gauge group. Evaluating it on the coordinate of `GaugeAlgebra.stdBasis` +dual to a Gell-Mann direction, a Pauli direction, or the `u(1)` direction isolates the +gluon, `W`-boson, and hypercharge contributions individually. + +-/ + +set_option linter.unusedVariables false in +/-- The gluon contribution to the field strength (and its covariant derivatives): the + field-strength symbol evaluated on the coordinate dual to the `a`-th Gell-Mann + direction of the standard basis of the gauge algebra, i.e. the `su(3)` factor. -/ +noncomputable def gluonField (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (a : Fin 8) : B := + F l μ ν (GaugeAlgebra.stdBasis.coord (Sum.inl a)) + +@[inherit_doc gluonField] +scoped[StandardModel.IsGaugeSector] notation "𝐆" => gluonField + +set_option linter.unusedVariables false in +/-- The `W`-boson contribution to the field strength (and its covariant derivatives): + the field-strength symbol evaluated on the coordinate dual to the `i`-th Pauli + direction of the standard basis of the gauge algebra, i.e. the `su(2)` factor. -/ +noncomputable def wField (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (i : Fin 3) : B := + F l μ ν (GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inl i))) + +@[inherit_doc wField] +scoped[StandardModel.IsGaugeSector] notation "𝐖" => wField + +set_option linter.unusedVariables false in +/-- The hypercharge contribution to the field strength (and its covariant derivatives), + i.e. the `B`-boson contribution: the field-strength symbol evaluated on the coordinate + dual to the single basis direction of the `u(1)` factor of the standard basis of the + gauge algebra. -/ +noncomputable def hyperchargeField (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul F massWeightPoly) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : B := + F l μ ν (GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inr 0))) + +@[inherit_doc hyperchargeField] +scoped[StandardModel.IsGaugeSector] notation "𝐁" => hyperchargeField /-! diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean new file mode 100644 index 000000000..45fc41e46 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean @@ -0,0 +1,304 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsU1BiAdjoint +public import Mathlib.RepresentationTheory.Invariants +/-! +# Products of two field strengths as bi-adjoint gauge tensors + +A single field-strength symbol of the gauge sector carries one adjoint index of the gauge +algebra, so a product of two of them carries two. Restricting the value index to one +factor of the gauge group turns such a product into a family indexed by two adjoint +indices of that factor, and the gauge transformation law of the sector says exactly that +these families are bi-adjoint in the sense of `IsSU3BiAdjoint`, `IsSU2BiAdjoint` and +`IsU1BiAdjoint`. + +The gauge invariant those propositions supply is the trace contraction, the Kronecker +contraction of the two adjoint indices; for the underived field strength it is the +familiar kinetic pairing of two field strengths. Its mass weight is the sum of the mass +weights of the two factors, so it lies in the corresponding mass-weight submodule, and it +is gauge invariant, so it lies in the zero-weight piece of the gauge weight decomposition +of that submodule. + +- A. The gauge transformation of the gauge-factor field strengths +- B. Products of two field strengths as bi-adjoint families +- C. The trace contractions and their mass weights +- D. The underived trace contractions at mass weight eight + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups Lorentz + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +/-! + +## A. The gauge transformation of the gauge-factor field strengths + +-/ + +include h in +/-- The field-strength symbol evaluated on a standard-basis coordinate transforms under + the gauge group through the column of `adjointMatrix` indexed by that coordinate. -/ +lemma repGauge_F_coord (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (c : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + repGauge g (F l μ ν (GaugeAlgebra.stdBasis.coord c)) + = ∑ b, ((GaugeAlgebra.adjointMatrix g b c : ℝ) : ℂ) • + F l μ ν (GaugeAlgebra.stdBasis.coord b) := by + rw [h.repGauge_F g l μ ν, + show GaugeAlgebra.adjointMap g⁻¹ + = (GaugeAlgebra.adjoint g⁻¹ : GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) from rfl, + GaugeAlgebra.adjoint_dualMap_coord, map_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [map_smul, GaugeAlgebra.adjointMatrix_inv_apply, Complex.coe_smul] + +/-- The gluon field strength transforms in the adjoint representation of the `su(3)` + factor of the gauge group. -/ +lemma repGauge_gluonField (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (c : Fin 8) : + repGauge g (h.gluonField l μ ν c) + = ∑ a : Fin 8, ((GaugeAlgebra.adjointMatrix g (Sum.inl a) (Sum.inl c) : ℝ) : ℂ) • + h.gluonField l μ ν a := by + rw [gluonField, h.repGauge_F_coord g l μ ν (Sum.inl c), Fintype.sum_sum_type, + Fintype.sum_sum_type] + simp [gluonField] + +/-- The `W`-boson field strength transforms in the adjoint representation of the `su(2)` + factor of the gauge group. -/ +lemma repGauge_wField (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (c : Fin 3) : + repGauge g (h.wField l μ ν c) + = ∑ i : Fin 3, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl i)) + (Sum.inr (Sum.inl c)) : ℝ) : ℂ) • h.wField l μ ν i := by + rw [wField, h.repGauge_F_coord g l μ ν (Sum.inr (Sum.inl c)), Fintype.sum_sum_type, + Fintype.sum_sum_type] + simp [wField] + +/-- The hypercharge field strength is gauge invariant: the adjoint action of the gauge + group on the `u(1)` factor of the gauge algebra is trivial. -/ +lemma repGauge_hyperchargeField (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + repGauge g (h.hyperchargeField l μ ν) = h.hyperchargeField l μ ν := by + rw [hyperchargeField, h.repGauge_F_coord g l μ ν (Sum.inr (Sum.inr 0)), + Fintype.sum_sum_type, Fintype.sum_sum_type] + simp + +/-! + +## B. Products of two field strengths as bi-adjoint families + +-/ + +/-- A product of two gluon field strengths, viewed as a family indexed by the two `su(3)` + adjoint indices it carries, is a bi-adjoint `su(3)` tensor. -/ +lemma isSU3BiAdjoint_gluonField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + IsSU3BiAdjoint B repGauge + (fun a : Fin 2 → Fin 8 => h.gluonField l μ ν (a 0) * h.gluonField l' μ' ν' (a 1)) := by + refine ⟨fun g d => ?_⟩ + rw [hrepGauge_mul, h.repGauge_gluonField, h.repGauge_gluonField, + Fintype.sum_mul_sum, IsSU3BiAdjoint.sum_pi_two] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm] + simp [Fin.prod_univ_two] + +/-- A product of two `W`-boson field strengths, viewed as a family indexed by the two + `su(2)` adjoint indices it carries, is a bi-adjoint `su(2)` tensor. -/ +lemma isSU2BiAdjoint_wField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + IsSU2BiAdjoint B repGauge + (fun a : Fin 2 → Fin 3 => h.wField l μ ν (a 0) * h.wField l' μ' ν' (a 1)) := by + refine ⟨fun g d => ?_⟩ + rw [hrepGauge_mul, h.repGauge_wField, h.repGauge_wField, + Fintype.sum_mul_sum, IsSU2BiAdjoint.sum_pi_two] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm] + simp [Fin.prod_univ_two] + +/-- A product of two hypercharge field strengths, viewed as a family indexed by the two + `u(1)` adjoint indices it carries, is a bi-adjoint `u(1)` tensor. -/ +lemma isU1BiAdjoint_hyperchargeField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + IsU1BiAdjoint B repGauge + (fun _ : Fin 2 → Fin 1 => h.hyperchargeField l μ ν * h.hyperchargeField l' μ' ν') := by + refine ⟨fun g d => ?_⟩ + rw [hrepGauge_mul, h.repGauge_hyperchargeField, h.repGauge_hyperchargeField] + simp + +/-! + +## C. The trace contractions and their mass weights + +-/ + +/-- The trace contraction of a product of two gluon field strengths is the Kronecker + contraction of the two `su(3)` adjoint indices. -/ +lemma traceContraction_gluonField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').traceContraction + = ∑ a : Fin 8, h.gluonField l μ ν a * h.gluonField l' μ' ν' a := by + simp [IsSU3BiAdjoint.traceContraction] + +/-- The trace contraction of a product of two `W`-boson field strengths is the Kronecker + contraction of the two `su(2)` adjoint indices. -/ +lemma traceContraction_wField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').traceContraction + = ∑ i : Fin 3, h.wField l μ ν i * h.wField l' μ' ν' i := by + simp [IsSU2BiAdjoint.traceContraction] + +/-- The trace contraction of a product of two hypercharge field strengths is that + product itself, the `u(1)` factor being one dimensional. -/ +lemma traceContraction_hyperchargeField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').traceContraction + = h.hyperchargeField l μ ν * h.hyperchargeField l' μ' ν' := by + simp [IsU1BiAdjoint.traceContraction] + +/-- Every field-strength symbol lies in the derivative submodule of its own number of + covariant derivatives. -/ +lemma F_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : F l μ ν φ ∈ h.derivSubmodule n := by + rw [derivSubmodule] + exact Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.subset_span ⟨φ, rfl⟩))) + +/-- A product of two field-strength symbols with `n` and `m` covariant derivatives has + mass weight the sum of the two individual mass weights. -/ +lemma F_mul_F_mem_massWeightSubmodule {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℝ GaugeAlgebra) : + F l μ ν φ * F l' μ' ν' φ' + ∈ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) := + h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul + (h.derivSubmodule_le_massWeightSubmodule n (h.F_mem_derivSubmodule l μ ν φ)) + (h.derivSubmodule_le_massWeightSubmodule m (h.F_mem_derivSubmodule l' μ' ν' φ'))) + +/-- The gluon trace contraction is a gauge invariant of the expected mass weight: it lies + in the mass-weight submodule of weight the sum of the two individual mass weights, and + it is fixed by the whole gauge group. -/ +lemma traceContraction_gluonField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').traceContraction + ∈ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) ⊓ repGauge.invariants := by + refine Submodule.mem_inf.mpr ⟨?_, ?_⟩ + · rw [h.traceContraction_gluonField_mul] + exact Submodule.sum_mem _ fun a _ => h.F_mul_F_mem_massWeightSubmodule l μ ν _ l' μ' ν' _ + · exact (Representation.mem_invariants _ _).mpr fun g => + IsSU3BiAdjoint.repGauge_traceContraction _ g + +/-- The `W`-boson trace contraction is a gauge invariant of the expected mass weight. -/ +lemma traceContraction_wField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').traceContraction + ∈ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) ⊓ repGauge.invariants := by + refine Submodule.mem_inf.mpr ⟨?_, ?_⟩ + · rw [h.traceContraction_wField_mul] + exact Submodule.sum_mem _ fun i _ => h.F_mul_F_mem_massWeightSubmodule l μ ν _ l' μ' ν' _ + · exact (Representation.mem_invariants _ _).mpr fun g => + IsSU2BiAdjoint.repGauge_traceContraction _ g + +/-- The hypercharge trace contraction is a gauge invariant of the expected mass weight. -/ +lemma traceContraction_hyperchargeField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').traceContraction + ∈ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) ⊓ repGauge.invariants := by + refine Submodule.mem_inf.mpr ⟨?_, ?_⟩ + · rw [h.traceContraction_hyperchargeField_mul] + exact h.F_mul_F_mem_massWeightSubmodule l μ ν _ l' μ' ν' _ + · exact (Representation.mem_invariants _ _).mpr fun g => + IsU1BiAdjoint.repGauge_traceContraction _ g + +/-! + +## D. The underived trace contractions at mass weight eight + +The product of two underived field strengths has mass weight eight, the `F · F` half of +`massWeightSubmodule_eight_eq`. Each of the three trace contractions there is a gauge +invariant, so by `GaugeWeightDecomposition.mem_zero_of_invariant` each lies in the +zero-weight piece of the gauge weight decomposition of mass weight eight, computed by +`massWeightSubmoduleGaugeWeightEight_piece_zero`. + +-/ + +/-- The trace contraction of two underived gluon field strengths lies in the mass-weight + eight submodule and is gauge invariant. -/ +lemma traceContraction_gluonField_mul_mem_eight (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU3BiAdjoint_gluonField_mul ![] μ ν ![] μ' ν').traceContraction + ∈ h.massWeightSubmodule 8 ⊓ repGauge.invariants := by + have hmem := h.traceContraction_gluonField_mul_mem (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ ν + (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ' ν' + rwa [show 2 * (2 + 0) + 2 * (2 + 0) = 8 from by norm_num] at hmem + +/-- The trace contraction of two underived `W`-boson field strengths lies in the + mass-weight eight submodule and is gauge invariant. -/ +lemma traceContraction_wField_mul_mem_eight (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU2BiAdjoint_wField_mul ![] μ ν ![] μ' ν').traceContraction + ∈ h.massWeightSubmodule 8 ⊓ repGauge.invariants := by + have hmem := h.traceContraction_wField_mul_mem (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ ν + (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ' ν' + rwa [show 2 * (2 + 0) + 2 * (2 + 0) = 8 from by norm_num] at hmem + +/-- The trace contraction of two underived hypercharge field strengths lies in the + mass-weight eight submodule and is gauge invariant. -/ +lemma traceContraction_hyperchargeField_mul_mem_eight (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isU1BiAdjoint_hyperchargeField_mul ![] μ ν ![] μ' ν').traceContraction + ∈ h.massWeightSubmodule 8 ⊓ repGauge.invariants := by + have hmem := h.traceContraction_hyperchargeField_mul_mem (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ ν + (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ' ν' + rwa [show 2 * (2 + 0) + 2 * (2 + 0) = 8 from by norm_num] at hmem + +/-- The trace contraction of two underived gluon field strengths lies in the zero-weight + piece of the gauge weight decomposition of mass weight eight. -/ +lemma traceContraction_gluonField_mul_mem_piece_zero (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU3BiAdjoint_gluonField_mul ![] μ ν ![] μ' ν').traceContraction + ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ + (Submodule.mem_inf.mp (h.traceContraction_gluonField_mul_mem_eight μ ν μ' ν')).1 + fun g => IsSU3BiAdjoint.repGauge_traceContraction _ g + +/-- The trace contraction of two underived `W`-boson field strengths lies in the + zero-weight piece of the gauge weight decomposition of mass weight eight. -/ +lemma traceContraction_wField_mul_mem_piece_zero (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU2BiAdjoint_wField_mul ![] μ ν ![] μ' ν').traceContraction + ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ + (Submodule.mem_inf.mp (h.traceContraction_wField_mul_mem_eight μ ν μ' ν')).1 + fun g => IsSU2BiAdjoint.repGauge_traceContraction _ g + +/-- The trace contraction of two underived hypercharge field strengths lies in the + zero-weight piece of the gauge weight decomposition of mass weight eight. -/ +lemma traceContraction_hyperchargeField_mul_mem_piece_zero (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isU1BiAdjoint_hyperchargeField_mul ![] μ ν ![] μ' ν').traceContraction + ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ + (Submodule.mem_inf.mp (h.traceContraction_hyperchargeField_mul_mem_eight μ ν μ' ν')).1 + fun g => IsU1BiAdjoint.repGauge_traceContraction _ g + +end IsGaugeSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean index ed89cf783..e83ce9734 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/GaugeWeightDecomposition.lean @@ -192,35 +192,62 @@ lemma piece_mul_comm (n : ℕ) (w w' : GaugeWeight) : · rw [(h.commute_of_mem_derivSubmodule (hle _ hx) (hle _ hy)).eq] exact Submodule.mul_mem_mul hy hx -/-- The weight-zero piece at mass weight eight, written out in the weight vectors - themselves: the twice-differentiated field strength on the four fixed directions of - the adjoint, joined with the four products pairing a root vector against its - opposite and the product of the fixed directions with themselves. -/ +/-! + +## The gauge-component pieces + +At mass weight eight the weight-zero content splits by gauge group factor. A product +of two underived symbols has weight zero exactly when the two weights are opposite, so +the contributions are indexed by the root directions: the roots `0`, `1` and `2` are the +`su(3)` roots and give the gluon contribution, the root `3` is the `su(2)` root and +gives the isospin contribution, and the weight-zero directions pair with themselves to +give the neutral contribution of the two `su(3)` Cartan directions, the `su(2)` Cartan +direction and hypercharge. + +-/ + +/-- The span of the underived raising vectors along the `r`-th root direction. -/ +noncomputable def rootRaisingSpan (r : Fin 4) : Submodule ℂ B := + ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inl r) + +/-- The span of the underived lowering vectors along the `r`-th root direction. -/ +noncomputable def rootLoweringSpan (r : Fin 4) : Submodule ℂ B := + ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl r)) + +/-- The span of the underived weight-zero vectors: the two `su(3)` Cartan directions, + the `su(2)` Cartan direction and the `u(1)` direction. -/ +noncomputable def cartanSpan : Submodule ℂ B := + ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 4), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inr c)) + +/-- The gluon contribution to the weight-zero piece: the three products pairing an + `su(3)` raising vector against the matching lowering vector. -/ +noncomputable def gluonRootPart : Submodule ℂ B := + h.rootRaisingSpan 0 * h.rootLoweringSpan 0 + ⊔ (h.rootRaisingSpan 1 * h.rootLoweringSpan 1 + ⊔ h.rootRaisingSpan 2 * h.rootLoweringSpan 2) + +/-- The isospin contribution to the weight-zero piece: the single product pairing the + `su(2)` raising vector against the matching lowering vector. -/ +noncomputable def isospinRootPart : Submodule ℂ B := + h.rootRaisingSpan 3 * h.rootLoweringSpan 3 + +/-- The neutral contribution to the weight-zero piece: the products of the weight-zero + directions with themselves, namely the two `su(3)` Cartan directions, the `su(2)` + Cartan direction and hypercharge. -/ +noncomputable def neutralCartanPart : Submodule ℂ B := h.cartanSpan * h.cartanSpan + +/-- The weight-zero piece at mass weight eight, split into the contributions of the + three gauge group factors: the twice-differentiated field strength on the four fixed + directions of the adjoint, joined with the gluon, isospin and neutral parts. -/ lemma massWeightSubmoduleGaugeWeightEight_piece_zero : (h.massWeightSubmoduleGaugeWeightEight).piece 0 = (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 4), ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c))) - ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inl 0)) - * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 0))) - ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inl 1)) - * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 1))) - ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inl 2)) - * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 2))) - ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inl 3)) - * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), - ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inl 3))) - ⊔ (((⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) - (c : Fin 4), ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inr c))) - * ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) - (c : Fin 4), ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inr c)))))))) := by + ⊔ (h.gluonRootPart ⊔ (h.isospinRootPart ⊔ h.neutralCartanPart)) := by have h5 : (h.massWeightSubmoduleGaugeWeightEight).piece 0 = (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 4), @@ -280,6 +307,8 @@ lemma massWeightSubmoduleGaugeWeightEight_piece_zero : h.derivSubmoduleGaugeWeight_piece_neg_rootWeight, h.derivSubmoduleGaugeWeight_piece_neg_rootWeight, h.derivSubmoduleGaugeWeight_piece_zero'] + simp only [gluonRootPart, isospinRootPart, neutralCartanPart, rootRaisingSpan, + rootLoweringSpan, cartanSpan, sup_assoc] end IsGaugeSector diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/SU2PermDecomposition.lean new file mode 100644 index 000000000..6a9ca1178 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/SU2PermDecomposition.lean @@ -0,0 +1,846 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition +/-! +# The `SU(2)` permutation decomposition of the neutral gauge sector + +The gauge weight decomposition of a gauge mass-weight submodule already isolates its +weight-zero piece: the field strength evaluated on the four directions of the adjoint +that the gauge torus fixes, namely the two `su(3)` Cartan generators, the `su(2)` Cartan +generator and hypercharge. The gauge weight cannot see any further into that piece, +because the torus fixes all four directions alike. + +The Weyl element `gaugeSU2Perm` does see further. It is trivial on colour and on +hypercharge, so it fixes the two `su(3)` Cartan directions and the `u(1)` direction; on +isospin it is the reflection sending the Cartan generator to its negative, so it negates +the neutral `W`. The weight-zero piece therefore carries an `SU2PermDecomposition` +concentrated in the grades `0` and `2`: grade `0` is the colour-neutral and hypercharge +content, grade `2` is the neutral `W` alone. This is exactly the separation that the +gauge weight is blind to, and it is what lets a `Z`-like combination be told apart from +a photon-like one by a grading. + +The grades `1` and `3`, at the eigenvalues `± i`, are empty on that piece. They are the +odd-isospin-degree grades, and the field strength is linear in a real adjoint direction, +so nothing in the gauge sector reaches them. + +Mass weight eight is the one weight whose weight-zero piece is more than a piece of a +derivative submodule: it also holds the products pairing a raising vector against the +matching lowering vector, and the products of two weight-zero vectors. The colour +products are fixed outright, and the products of two weight-zero vectors are graded by +adding the grades of their factors. The isospin products need care, because the Weyl +element exchanges the two isospin root vectors rather than scaling them; it is their +symmetric and antisymmetric combinations that are graded, in grades zero and two. + +## Table of contents + +- A. The Weyl element on the coordinate functionals of the adjoint +- B. The Weyl element on the field-strength symbols +- C. The decomposition of the weight-zero piece of the derivative submodules +- D. The graded pieces +- E. The gauge-factor parts at mass weight eight +- F. Transport along the mass weights + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups GaugeAlgebra + +/-! + +## A. The Weyl element on the coordinate functionals of the adjoint + +The Weyl element acts on the gauge algebra by conjugation, trivially on the colour and +hypercharge factors and by the reflection `!![0, -1; 1, 0]` on isospin. In the standard +basis this is diagonal with entries `± 1`: everything is fixed except the `σ¹` and `σ³` +directions, which are negated. + +-/ + +/-- The colour block of the inverse Weyl element is the identity matrix: `gaugeSU2Perm` + is trivial on `SU(3)`. -/ +lemma toSU3_inv_gaugeSU2Perm : + ((GaugeGroupI.toSU3 gaugeSU2Perm⁻¹ : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 3) (Fin 3) ℂ) = 1 := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + simp [gaugeSU2Perm, GaugeGroupI.toSU3] + +/-- The isospin block of the inverse Weyl element is `!![0, 1; -1, 0]`. -/ +lemma toSU2_inv_gaugeSU2Perm : + ((GaugeGroupI.toSU2 gaugeSU2Perm⁻¹ : specialUnitaryGroup (Fin 2) ℂ) : + Matrix (Fin 2) (Fin 2) ℂ) = !![0, 1; -1, 0] := by + rw [map_inv] + exact su2Perm_inv_coe + +/-- The Weyl element leaves the colour block of a gauge algebra element alone. -/ +lemma adjointMap_inv_gaugeSU2Perm_toSU3Matrix (x : GaugeAlgebra) : + (adjointMap gaugeSU2Perm⁻¹ x).toSU3Matrix = x.toSU3Matrix := by + rw [adjointMap_toSU3Matrix, toSU3_inv_gaugeSU2Perm, one_mul, star_one, mul_one] + +/-- The Weyl element leaves the hypercharge value of a gauge algebra element alone. -/ +lemma adjointMap_inv_gaugeSU2Perm_toU1Value (x : GaugeAlgebra) : + (adjointMap gaugeSU2Perm⁻¹ x).toU1Value = x.toU1Value := rfl + +/-- The Weyl element conjugates the isospin block by `!![0, 1; -1, 0]`, which exchanges + the two diagonal entries and negates the two off-diagonal ones. -/ +lemma adjointMap_inv_gaugeSU2Perm_toSU2Matrix (x : GaugeAlgebra) : + (adjointMap gaugeSU2Perm⁻¹ x).toSU2Matrix + = !![x.toSU2Matrix 1 1, -x.toSU2Matrix 1 0; + -x.toSU2Matrix 0 1, x.toSU2Matrix 0 0] := by + rw [adjointMap_toSU2Matrix, toSU2_inv_gaugeSU2Perm] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, Matrix.star_eq_conjTranspose, + Matrix.conjTranspose_apply, Matrix.vecMul, dotProduct] + +/-- The Weyl element fixes the colour Cartan directions and hypercharge: the three + weight-zero directions of the adjoint on which it acts trivially. -/ +lemma dualMap_coord_cartanIdx_ne_two {c : Fin 4} (hc : c ≠ 2) : + (adjointMap gaugeSU2Perm⁻¹).dualMap (stdBasis.coord (cartanIdx c)) + = stdBasis.coord (cartanIdx c) := by + refine LinearMap.ext fun x => ?_ + have h3 := adjointMap_inv_gaugeSU2Perm_toSU3Matrix x + have h1 := adjointMap_inv_gaugeSU2Perm_toU1Value x + fin_cases c + · simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, + gellMannCoeff, h3] + · simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, + gellMannCoeff, h3] + · exact absurd rfl hc + · simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, h1] + +/-- The Weyl element negates the isospin Cartan direction: a Weyl reflection sends the + Cartan generator of `su(2)` to its negative. -/ +lemma dualMap_coord_cartanIdx_two : + (adjointMap gaugeSU2Perm⁻¹).dualMap (stdBasis.coord (cartanIdx 2)) + = -stdBasis.coord (cartanIdx 2) := by + refine LinearMap.ext fun x => ?_ + have htr : Matrix.trace x.toSU2Matrix = 0 := x.2.1.2.2 + rw [Matrix.trace_fin_two] at htr + have h11 : x.toSU2Matrix 1 1 = -x.toSU2Matrix 0 0 := by linear_combination htr + simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, + pauliCoeff, adjointMap_inv_gaugeSU2Perm_toSU2Matrix, LinearMap.neg_apply] + simp [h11] + +/-- The Weyl element fixes every colour coordinate functional, Cartan or not: it is + trivial on `SU(3)`. -/ +lemma dualMap_coord_inl (a : Fin 8) : + (adjointMap gaugeSU2Perm⁻¹).dualMap (stdBasis.coord (Sum.inl a)) + = stdBasis.coord (Sum.inl a) := by + refine LinearMap.ext fun x => ?_ + simp only [LinearMap.dualMap_apply, stdBasis_coord_apply, stdCoeff, + adjointMap_inv_gaugeSU2Perm_toSU3Matrix] + +/-- The Weyl element negates the first isospin coordinate functional: the reflection + turns the `σ¹` direction around. -/ +lemma dualMap_coord_inr_inl_zero : + (adjointMap gaugeSU2Perm⁻¹).dualMap (stdBasis.coord (Sum.inr (Sum.inl 0))) + = -stdBasis.coord (Sum.inr (Sum.inl 0)) := by + refine LinearMap.ext fun x => ?_ + have h10 : x.toSU2Matrix 1 0 = (starRingEnd ℂ) (x.toSU2Matrix 0 1) := + entry_symm_of_star_eq x.2.1.2.1 0 1 + simp only [LinearMap.dualMap_apply, stdBasis_coord_apply, stdCoeff, pauliCoeff, + adjointMap_inv_gaugeSU2Perm_toSU2Matrix, LinearMap.neg_apply] + simp [h10] + +/-- The Weyl element fixes the second isospin coordinate functional: the `σ²` direction + is the axis of the reflection. -/ +lemma dualMap_coord_inr_inl_one : + (adjointMap gaugeSU2Perm⁻¹).dualMap (stdBasis.coord (Sum.inr (Sum.inl 1))) + = stdBasis.coord (Sum.inr (Sum.inl 1)) := by + refine LinearMap.ext fun x => ?_ + have h10 : x.toSU2Matrix 1 0 = (starRingEnd ℂ) (x.toSU2Matrix 0 1) := + entry_symm_of_star_eq x.2.1.2.1 0 1 + simp only [LinearMap.dualMap_apply, stdBasis_coord_apply, stdCoeff, pauliCoeff, + adjointMap_inv_gaugeSU2Perm_toSU2Matrix] + simp [h10] + +/-- The grade carried by each weight-zero direction of the adjoint under the Weyl + element: the two colour Cartan directions and hypercharge are fixed and so have grade + zero, while the isospin Cartan direction is negated and so has grade two. -/ +def cartanSU2PermGrade : Fin 4 → ZMod 4 + | 0 => 0 + | 1 => 0 + | 2 => 2 + | 3 => 0 + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +/-! + +## B. The Weyl element on the field-strength symbols + +-/ + +include h in +/-- The Weyl element fixes the field strength evaluated on a colour Cartan direction or + on hypercharge. -/ +lemma repGauge_gaugeSU2Perm_F_cartanIdx_ne_two {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) {c : Fin 4} (hc : c ≠ 2) : + repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (cartanIdx c))) + = F l μ ν (stdBasis.coord (cartanIdx c)) := + h.repGauge_fixed gaugeSU2Perm l μ ν _ (dualMap_coord_cartanIdx_ne_two hc) + +include h in +/-- The Weyl element negates the field strength evaluated on the isospin Cartan + direction: the neutral `W` is odd. -/ +lemma repGauge_gaugeSU2Perm_F_cartanIdx_two {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (cartanIdx 2))) + = -F l μ ν (stdBasis.coord (cartanIdx 2)) := by + rw [h.repGauge_F, dualMap_coord_cartanIdx_two, map_neg] + +include h in +/-- The field strength on each weight-zero direction of the adjoint is an eigenvector of + the Weyl element, at the sign recorded by `cartanSU2PermGrade`. -/ +lemma repGauge_gaugeSU2Perm_F_cartanIdx {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (c : Fin 4) : + repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (cartanIdx c))) + = su2PermSign (cartanSU2PermGrade c) • F l μ ν (stdBasis.coord (cartanIdx c)) := by + rcases eq_or_ne c 2 with rfl | hc + · rw [h.repGauge_gaugeSU2Perm_F_cartanIdx_two l μ ν, + show cartanSU2PermGrade 2 = 2 from by decide, su2PermSign_two, neg_one_smul] + · have hg : cartanSU2PermGrade c = 0 := by revert hc; fin_cases c <;> decide + rw [h.repGauge_gaugeSU2Perm_F_cartanIdx_ne_two l μ ν hc, hg, su2PermSign_zero, + one_smul] + +include h in +/-- The Weyl element fixes the field strength on any colour direction of the adjoint. -/ +lemma repGauge_gaugeSU2Perm_F_inl {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (a : Fin 8) : + repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (Sum.inl a))) + = F l μ ν (stdBasis.coord (Sum.inl a)) := + h.repGauge_fixed gaugeSU2Perm l μ ν _ (dualMap_coord_inl a) + +/-- The Weyl element fixes the colour raising vectors of the adjoint: an isospin + reflection leaves colour alone. -/ +lemma repGauge_gaugeSU2Perm_adjVec_inl {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) {r : Fin 4} (hr : r ≠ 3) : + repGauge gaugeSU2Perm (h.adjVec l μ ν (Sum.inl r)) + = h.adjVec l μ ν (Sum.inl r) := by + have key : ∀ a b : Fin 8, repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (Sum.inl a)) + + Complex.I • F l μ ν (stdBasis.coord (Sum.inl b))) + = F l μ ν (stdBasis.coord (Sum.inl a)) + + Complex.I • F l μ ν (stdBasis.coord (Sum.inl b)) := fun a b => by + rw [map_add, map_smul, h.repGauge_gaugeSU2Perm_F_inl, h.repGauge_gaugeSU2Perm_F_inl] + fin_cases r + · exact key 0 1 + · exact key 3 4 + · exact key 5 6 + · exact absurd rfl hr + +/-- The Weyl element fixes the colour lowering vectors of the adjoint. -/ +lemma repGauge_gaugeSU2Perm_adjVec_inr_inl {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) {r : Fin 4} (hr : r ≠ 3) : + repGauge gaugeSU2Perm (h.adjVec l μ ν (Sum.inr (Sum.inl r))) + = h.adjVec l μ ν (Sum.inr (Sum.inl r)) := by + have key : ∀ a b : Fin 8, repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (Sum.inl a)) + - Complex.I • F l μ ν (stdBasis.coord (Sum.inl b))) + = F l μ ν (stdBasis.coord (Sum.inl a)) + - Complex.I • F l μ ν (stdBasis.coord (Sum.inl b)) := fun a b => by + rw [map_sub, map_smul, h.repGauge_gaugeSU2Perm_F_inl, h.repGauge_gaugeSU2Perm_F_inl] + fin_cases r + · exact key 0 1 + · exact key 3 4 + · exact key 5 6 + · exact absurd rfl hr + +/-- The Weyl element sends the isospin raising vector to minus the lowering vector: it + is the reflection exchanging the two isospin roots. -/ +lemma repGauge_gaugeSU2Perm_adjVec_isospin_raising {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + repGauge gaugeSU2Perm (h.adjVec l μ ν (Sum.inl 3)) + = -h.adjVec l μ ν (Sum.inr (Sum.inl 3)) := by + show repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 0))) + + Complex.I • F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 1)))) + = -(F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 0))) + - Complex.I • F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 1)))) + rw [map_add, map_smul, h.repGauge_F, h.repGauge_F, dualMap_coord_inr_inl_zero, + dualMap_coord_inr_inl_one, map_neg] + module + +/-- The Weyl element sends the isospin lowering vector to minus the raising vector. -/ +lemma repGauge_gaugeSU2Perm_adjVec_isospin_lowering {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + repGauge gaugeSU2Perm (h.adjVec l μ ν (Sum.inr (Sum.inl 3))) + = -h.adjVec l μ ν (Sum.inl 3) := by + show repGauge gaugeSU2Perm (F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 0))) + - Complex.I • F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 1)))) + = -(F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 0))) + + Complex.I • F l μ ν (stdBasis.coord (Sum.inr (Sum.inl 1)))) + rw [map_sub, map_smul, h.repGauge_F, h.repGauge_F, dualMap_coord_inr_inl_zero, + dualMap_coord_inr_inl_one, map_neg] + module + +/-- Every weight vector of the adjoint lies in the derivative submodule it is built + from. -/ +lemma adjVec_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (k : Fin 4 ⊕ Fin 4 ⊕ Fin 4) : + h.adjVec l μ ν k ∈ h.derivSubmodule n := by + have hF : ∀ φ, F l μ ν φ ∈ h.derivSubmodule n := fun φ => by + rw [derivSubmodule] + exact Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.subset_span ⟨φ, rfl⟩))) + match k with + | Sum.inl r => exact Submodule.add_mem _ (hF _) (Submodule.smul_mem _ _ (hF _)) + | Sum.inr (Sum.inl r) => exact Submodule.sub_mem _ (hF _) (Submodule.smul_mem _ _ (hF _)) + | Sum.inr (Sum.inr c) => exact hF _ + +/-- Any two weight vectors of the adjoint commute: the gauge sector is bosonic. -/ +lemma adjVec_commute {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (k : Fin 4 ⊕ Fin 4 ⊕ Fin 4) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (k' : Fin 4 ⊕ Fin 4 ⊕ Fin 4) : + Commute (h.adjVec l μ ν k) (h.adjVec l' μ' ν' k') := + h.commute_of_mem_derivSubmodule (h.adjVec_mem_derivSubmodule l μ ν k) + (h.adjVec_mem_derivSubmodule l' μ' ν' k') + +/-! + +## C. The decomposition of the weight-zero piece of the derivative submodules + +-/ + +/-- The `SU(2)` permutation decomposition of the weight-zero piece of a gauge derivative + submodule: the reusable core of this file. The weight-zero piece is spanned by the + field strength on the four fixed directions of the adjoint, and each of those four + spans is graded by `cartanSU2PermGrade`. -/ +noncomputable def derivSubmoduleGaugeWeightPieceZeroSU2Perm (n : ℕ) : + SU2PermDecomposition repGauge ((h.derivSubmoduleGaugeWeight n).piece 0) where + piece k := ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4) (_ : cartanSU2PermGrade c = k), + ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c)) + piece_le := by + intro k x hx + have key : (⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (c : Fin 4) (_ : cartanSU2PermGrade c = k), + ℂ ∙ F l μ ν (stdBasis.coord (cartanIdx c))) + ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) (su2PermSign k) := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => + iSup_le fun hc => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [h.repGauge_gaugeSU2Perm_F_cartanIdx l μ ν c, hc] + exact Module.End.mem_eigenspace_iff.mp (key hx) + iSup_piece := by + rw [h.derivSubmoduleGaugeWeight_piece_zero n] + refine le_antisymm (iSup_le fun k => iSup_le fun l => iSup_le fun μ => + iSup_le fun ν => iSup_le fun c => iSup_le fun _ => ?_) ?_ + · exact le_iSup_of_le l (le_iSup_of_le μ (le_iSup_of_le ν (le_iSup_of_le c le_rfl))) + · refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => ?_ + exact le_iSup_of_le (cartanSU2PermGrade c) (le_iSup_of_le l (le_iSup_of_le μ + (le_iSup_of_le ν (le_iSup_of_le c (le_iSup_of_le rfl le_rfl))))) + +/-! + +## D. The graded pieces + +-/ + +/-- The grade-zero piece of the core decomposition: the two colour Cartan directions of + the field strength together with hypercharge. -/ +lemma derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_zero (n : ℕ) : + (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm n).piece 0 + = ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + (ℂ ∙ h.gluonField l μ ν 2 ⊔ ℂ ∙ h.gluonField l μ ν 7 + ⊔ ℂ ∙ h.hyperchargeField l μ ν) := by + have hzero : ∀ c : Fin 4, cartanSU2PermGrade c = 0 → c = 0 ∨ c = 1 ∨ c = 3 := by decide + refine iSup_congr fun l => iSup_congr fun μ => iSup_congr fun ν => ?_ + refine le_antisymm (iSup_le fun c => iSup_le fun hc => ?_) (sup_le (sup_le ?_ ?_) ?_) + · rcases hzero c hc with rfl | rfl | rfl + · exact le_sup_of_le_left (le_sup_of_le_left le_rfl) + · exact le_sup_of_le_left (le_sup_of_le_right le_rfl) + · exact le_sup_right + · exact le_iSup_of_le 0 (le_iSup_of_le (by decide) le_rfl) + · exact le_iSup_of_le 1 (le_iSup_of_le (by decide) le_rfl) + · exact le_iSup_of_le 3 (le_iSup_of_le (by decide) le_rfl) + +/-- The grade-two piece of the core decomposition: the neutral `W` alone. This is the + content of the weight-zero piece that the gauge weight cannot see. -/ +lemma derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_two (n : ℕ) : + (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm n).piece 2 + = ⨆ (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.wField l μ ν 2 := by + have htwo : ∀ c : Fin 4, cartanSU2PermGrade c = 2 → c = 2 := by decide + refine iSup_congr fun l => iSup_congr fun μ => iSup_congr fun ν => ?_ + refine le_antisymm (iSup_le fun c => iSup_le fun hc => ?_) + (le_iSup_of_le 2 (le_iSup_of_le (by decide) le_rfl)) + rcases htwo c hc with rfl + exact le_rfl + +/-- The grade-one piece of the core decomposition is trivial: the field strength is + linear in a real adjoint direction, so it never reaches the odd grades. -/ +lemma derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_one (n : ℕ) : + (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm n).piece 1 = ⊥ := by + have hne : ∀ c : Fin 4, cartanSU2PermGrade c ≠ 1 := by decide + exact le_antisymm (iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => + iSup_le fun hc => absurd hc (hne c)) bot_le + +/-- The grade-three piece of the core decomposition is trivial, for the same reason as + the grade-one piece. -/ +lemma derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_three (n : ℕ) : + (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm n).piece 3 = ⊥ := by + have hne : ∀ c : Fin 4, cartanSU2PermGrade c ≠ 3 := by decide + exact le_antisymm (iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => + iSup_le fun hc => absurd hc (hne c)) bot_le + +/-! + +## E. The gauge-factor parts at mass weight eight + +At mass weight eight the weight-zero content acquires, beyond the twice-derived field +strength, the products pairing a raising vector against the matching lowering vector and +the products of two weight-zero vectors. The colour products are fixed outright, the +products of two weight-zero vectors are graded by adding the grades of their factors, and +the isospin products need care: the Weyl element exchanges the two isospin root vectors +rather than scaling them, so it is the symmetric and antisymmetric combinations of the +isospin products that are graded, in grades zero and two respectively. + +-/ + +/-- A submodule fixed pointwise by the Weyl element is concentrated in grade zero. -/ +noncomputable def su2PermOfFixed (V : Submodule ℂ B) + (hV : V ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) 1) : + SU2PermDecomposition repGauge V where + piece k := if k = 0 then V else ⊥ + piece_le := by + intro k x hx + rcases eq_or_ne k 0 with rfl | hk + · rw [if_pos rfl] at hx + rw [su2PermSign_zero] + exact Module.End.mem_eigenspace_iff.mp (hV hx) + · rw [if_neg hk, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + refine le_antisymm (iSup_le fun k => ?_) (le_iSup_of_le 0 (le_of_eq (if_pos rfl).symm)) + by_cases hk : k = 0 + · rw [if_pos hk] + · rw [if_neg hk] + exact bot_le + +/-- The pieces of a fixed submodule: the submodule itself in grade zero, nothing + elsewhere. -/ +@[simp] +lemma su2PermOfFixed_piece (V : Submodule ℂ B) + (hV : V ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) 1) (k : ZMod 4) : + (su2PermOfFixed V hV).piece k = if k = 0 then V else ⊥ := rfl + +/-- The colour raising vectors are fixed by the Weyl element. -/ +lemma rootRaisingSpan_le_eigenspace {r : Fin 4} (hr : r ≠ 3) : + h.rootRaisingSpan r ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) 1 := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.repGauge_gaugeSU2Perm_adjVec_inl l μ ν hr, one_smul]) + +/-- The colour lowering vectors are fixed by the Weyl element. -/ +lemma rootLoweringSpan_le_eigenspace {r : Fin 4} (hr : r ≠ 3) : + h.rootLoweringSpan r ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) 1 := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + exact Module.End.mem_eigenspace_iff.mpr + (by rw [h.repGauge_gaugeSU2Perm_adjVec_inr_inl l μ ν hr, one_smul]) + +/-- The colour contribution to the weight-zero piece at mass weight eight is fixed by the + Weyl element: both factors of each product are colour vectors. -/ +lemma gluonRootPart_le_eigenspace : + h.gluonRootPart ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) 1 := by + have key : ∀ r : Fin 4, r ≠ 3 → h.rootRaisingSpan r * h.rootLoweringSpan r + ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) 1 := by + intro r hr + refine Submodule.mul_le.mpr fun x hx y hy => Module.End.mem_eigenspace_iff.mpr ?_ + rw [hrepGauge_mul, + Module.End.mem_eigenspace_iff.mp (h.rootRaisingSpan_le_eigenspace hr hx), + Module.End.mem_eigenspace_iff.mp (h.rootLoweringSpan_le_eigenspace hr hy), + one_smul, one_smul, one_smul] + exact sup_le (key 0 (by decide)) (sup_le (key 1 (by decide)) (key 2 (by decide))) + +/-- The colour contribution to the weight-zero piece at mass weight eight, concentrated + in grade zero. -/ +noncomputable def gluonRootPartSU2Perm : + SU2PermDecomposition repGauge h.gluonRootPart := + su2PermOfFixed h.gluonRootPart h.gluonRootPart_le_eigenspace + +/-- The colour contribution sits in grade zero. -/ +@[simp] +lemma gluonRootPartSU2Perm_piece_zero : + h.gluonRootPartSU2Perm.piece 0 = h.gluonRootPart := rfl + +/-- The colour contribution has no grade-two part. -/ +@[simp] +lemma gluonRootPartSU2Perm_piece_two : h.gluonRootPartSU2Perm.piece 2 = ⊥ := rfl + +/-- The symmetric isospin products: the grade-zero part of the isospin contribution to + the weight-zero piece at mass weight eight. -/ +noncomputable def isospinSymmPart : Submodule ℂ B := + ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (l' : Fin 0 → Fin 1 ⊕ Fin 3) (μ' : Fin 1 ⊕ Fin 3) (ν' : Fin 1 ⊕ Fin 3), + ℂ ∙ (h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3)) + + h.adjVec l' μ' ν' (Sum.inl 3) * h.adjVec l μ ν (Sum.inr (Sum.inl 3))) + +/-- The antisymmetric isospin products: the grade-two part of the isospin contribution to + the weight-zero piece at mass weight eight. -/ +noncomputable def isospinAntisymmPart : Submodule ℂ B := + ⨆ (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) + (l' : Fin 0 → Fin 1 ⊕ Fin 3) (μ' : Fin 1 ⊕ Fin 3) (ν' : Fin 1 ⊕ Fin 3), + ℂ ∙ (h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3)) + - h.adjVec l' μ' ν' (Sum.inl 3) * h.adjVec l μ ν (Sum.inr (Sum.inl 3))) + +/-- A generator of the symmetric isospin part. -/ +lemma mem_isospinSymmPart (l l' : Fin 0 → Fin 1 ⊕ Fin 3) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3)) + + h.adjVec l' μ' ν' (Sum.inl 3) * h.adjVec l μ ν (Sum.inr (Sum.inl 3)) + ∈ h.isospinSymmPart := + Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ (Submodule.mem_iSup_of_mem ν + (Submodule.mem_iSup_of_mem l' (Submodule.mem_iSup_of_mem μ' + (Submodule.mem_iSup_of_mem ν' (Submodule.mem_span_singleton_self _)))))) + +/-- A generator of the antisymmetric isospin part. -/ +lemma mem_isospinAntisymmPart (l l' : Fin 0 → Fin 1 ⊕ Fin 3) + (μ ν μ' ν' : Fin 1 ⊕ Fin 3) : + h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3)) + - h.adjVec l' μ' ν' (Sum.inl 3) * h.adjVec l μ ν (Sum.inr (Sum.inl 3)) + ∈ h.isospinAntisymmPart := + Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ (Submodule.mem_iSup_of_mem ν + (Submodule.mem_iSup_of_mem l' (Submodule.mem_iSup_of_mem μ' + (Submodule.mem_iSup_of_mem ν' (Submodule.mem_span_singleton_self _)))))) + +/-- A raising vector lies in the isospin raising span. -/ +lemma adjVec_mem_rootRaisingSpan_three (l : Fin 0 → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : h.adjVec l μ ν (Sum.inl 3) ∈ h.rootRaisingSpan 3 := + Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.mem_span_singleton_self _))) + +/-- A lowering vector lies in the isospin lowering span. -/ +lemma adjVec_mem_rootLoweringSpan_three (l : Fin 0 → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + h.adjVec l μ ν (Sum.inr (Sum.inl 3)) ∈ h.rootLoweringSpan 3 := + Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.mem_span_singleton_self _))) + +/-- The isospin contribution written out on generators: the products of one raising + vector with one lowering vector. -/ +lemma isospinRootPart_eq : + h.isospinRootPart + = ⨆ (l' : Fin 0 → Fin 1 ⊕ Fin 3) (μ' : Fin 1 ⊕ Fin 3) (ν' : Fin 1 ⊕ Fin 3) + (l : Fin 0 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ (h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3))) := by + rw [isospinRootPart, rootRaisingSpan, rootLoweringSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup, Submodule.span_mul_span, + Set.singleton_mul_singleton] + +/-- The symmetric isospin part sits inside the isospin contribution. -/ +lemma isospinSymmPart_le : h.isospinSymmPart ≤ h.isospinRootPart := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun l' => + iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + exact Submodule.add_mem _ + (Submodule.mul_mem_mul (h.adjVec_mem_rootRaisingSpan_three l μ ν) + (h.adjVec_mem_rootLoweringSpan_three l' μ' ν')) + (Submodule.mul_mem_mul (h.adjVec_mem_rootRaisingSpan_three l' μ' ν') + (h.adjVec_mem_rootLoweringSpan_three l μ ν)) + +/-- The antisymmetric isospin part sits inside the isospin contribution. -/ +lemma isospinAntisymmPart_le : h.isospinAntisymmPart ≤ h.isospinRootPart := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun l' => + iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + exact Submodule.sub_mem _ + (Submodule.mul_mem_mul (h.adjVec_mem_rootRaisingSpan_three l μ ν) + (h.adjVec_mem_rootLoweringSpan_three l' μ' ν')) + (Submodule.mul_mem_mul (h.adjVec_mem_rootRaisingSpan_three l' μ' ν') + (h.adjVec_mem_rootLoweringSpan_three l μ ν)) + +/-- The symmetric isospin products are fixed by the Weyl element: it exchanges the two + products being added, and the two factors of each commute. -/ +lemma isospinSymmPart_le_eigenspace : + h.isospinSymmPart ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) 1 := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun l' => + iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [one_smul, map_add, hrepGauge_mul, hrepGauge_mul, + h.repGauge_gaugeSU2Perm_adjVec_isospin_raising, + h.repGauge_gaugeSU2Perm_adjVec_isospin_lowering, + h.repGauge_gaugeSU2Perm_adjVec_isospin_raising, + h.repGauge_gaugeSU2Perm_adjVec_isospin_lowering, neg_mul_neg, neg_mul_neg, + (h.adjVec_commute l μ ν (Sum.inr (Sum.inl 3)) l' μ' ν' (Sum.inl 3)).eq, + (h.adjVec_commute l' μ' ν' (Sum.inr (Sum.inl 3)) l μ ν (Sum.inl 3)).eq] + exact add_comm _ _ + +/-- The antisymmetric isospin products are negated by the Weyl element: it exchanges the + two products being subtracted. -/ +lemma isospinAntisymmPart_le_eigenspace : + h.isospinAntisymmPart ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) (-1) := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun l' => + iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [neg_one_smul, map_sub, hrepGauge_mul, hrepGauge_mul, + h.repGauge_gaugeSU2Perm_adjVec_isospin_raising, + h.repGauge_gaugeSU2Perm_adjVec_isospin_lowering, + h.repGauge_gaugeSU2Perm_adjVec_isospin_raising, + h.repGauge_gaugeSU2Perm_adjVec_isospin_lowering, neg_mul_neg, neg_mul_neg, + (h.adjVec_commute l μ ν (Sum.inr (Sum.inl 3)) l' μ' ν' (Sum.inl 3)).eq, + (h.adjVec_commute l' μ' ν' (Sum.inr (Sum.inl 3)) l μ ν (Sum.inl 3)).eq, neg_sub] + +/-- The isospin contribution to the weight-zero piece at mass weight eight, split into + its symmetric part in grade zero and its antisymmetric part in grade two. The Weyl + element exchanges the two isospin root vectors, so neither of the two products it + exchanges is an eigenvector on its own, only their sum and difference are. -/ +noncomputable def isospinRootPartSU2Perm : + SU2PermDecomposition repGauge h.isospinRootPart where + piece k := + if k = 0 then h.isospinSymmPart else if k = 2 then h.isospinAntisymmPart else ⊥ + piece_le := by + intro k x hx + rcases eq_or_ne k 0 with rfl | hk0 + · rw [if_pos rfl] at hx + rw [su2PermSign_zero] + exact Module.End.mem_eigenspace_iff.mp (h.isospinSymmPart_le_eigenspace hx) + · rcases eq_or_ne k 2 with rfl | hk2 + · rw [if_neg hk0, if_pos rfl] at hx + rw [su2PermSign_two] + exact Module.End.mem_eigenspace_iff.mp (h.isospinAntisymmPart_le_eigenspace hx) + · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) ?_ + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [if_pos rfl] + exact h.isospinSymmPart_le + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [if_neg (by decide), if_pos rfl] + exact h.isospinAntisymmPart_le + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · refine le_trans ?_ (sup_le (le_iSup _ (0 : ZMod 4)) (le_iSup _ (2 : ZMod 4))) + rw [if_pos rfl, if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl, + h.isospinRootPart_eq] + refine iSup_le fun l' => iSup_le fun μ' => iSup_le fun ν' => iSup_le fun l => + iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le, Set.singleton_subset_iff] + have hs := Submodule.mem_sup_left (S := h.isospinSymmPart) + (T := h.isospinAntisymmPart) (h.mem_isospinSymmPart l l' μ ν μ' ν') + have ha := Submodule.mem_sup_right (S := h.isospinSymmPart) + (T := h.isospinAntisymmPart) (h.mem_isospinAntisymmPart l l' μ ν μ' ν') + have hsum := Submodule.smul_mem _ (2⁻¹ : ℂ) (Submodule.add_mem _ hs ha) + rwa [show (2⁻¹ : ℂ) • + ((h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3)) + + h.adjVec l' μ' ν' (Sum.inl 3) * h.adjVec l μ ν (Sum.inr (Sum.inl 3))) + + (h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3)) + - h.adjVec l' μ' ν' (Sum.inl 3) * h.adjVec l μ ν (Sum.inr (Sum.inl 3)))) + = h.adjVec l μ ν (Sum.inl 3) * h.adjVec l' μ' ν' (Sum.inr (Sum.inl 3)) + from by module] at hsum + +/-- The graded pieces of the isospin contribution. -/ +lemma isospinRootPartSU2Perm_piece (k : ZMod 4) : + (h.isospinRootPartSU2Perm).piece k + = if k = 0 then h.isospinSymmPart + else if k = 2 then h.isospinAntisymmPart else ⊥ := rfl + +/-- The grade-zero part of the isospin contribution is the symmetric part. -/ +@[simp] +lemma isospinRootPartSU2Perm_piece_zero : + h.isospinRootPartSU2Perm.piece 0 = h.isospinSymmPart := rfl + +/-- The grade-two part of the isospin contribution is the antisymmetric part. -/ +@[simp] +lemma isospinRootPartSU2Perm_piece_two : + h.isospinRootPartSU2Perm.piece 2 = h.isospinAntisymmPart := rfl + +/-- The neutral contribution to the weight-zero piece at mass weight eight: the products + of two weight-zero vectors, whose grades add. -/ +noncomputable def neutralCartanPartSU2Perm : + SU2PermDecomposition repGauge h.neutralCartanPart := + SU2PermDecomposition.copy + (SU2PermDecomposition.mul hrepGauge_mul + ((h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 0).copy h.cartanSpan + (h.derivSubmoduleGaugeWeight_piece_zero' 0).symm) + ((h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 0).copy h.cartanSpan + (h.derivSubmoduleGaugeWeight_piece_zero' 0).symm)) + _ rfl + +/-! + +## F. Transport along the mass weights + +-/ + +/-- Mass weight one: the weight-zero piece is trivial, so is every grade. -/ +noncomputable def massWeightSubmoduleGaugeWeightOneSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightOne).piece 0) := + SU2PermDecomposition.copy (SU2PermDecomposition.bot (rep := repGauge)) _ rfl + +/-- Mass weight two: the weight-zero piece is trivial, so is every grade. -/ +noncomputable def massWeightSubmoduleGaugeWeightTwoSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightTwo).piece 0) := + SU2PermDecomposition.copy (SU2PermDecomposition.bot (rep := repGauge)) _ rfl + +/-- Mass weight three: the weight-zero piece is trivial, so is every grade. -/ +noncomputable def massWeightSubmoduleGaugeWeightThreeSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightThree).piece 0) := + SU2PermDecomposition.copy (SU2PermDecomposition.bot (rep := repGauge)) _ rfl + +/-- Mass weight four: the weight-zero piece is the underived field strength on the four + fixed directions of the adjoint, graded by `cartanSU2PermGrade`. -/ +noncomputable def massWeightSubmoduleGaugeWeightFourSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightFour).piece 0) := + SU2PermDecomposition.copy (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 0) _ rfl + +/-- Mass weight five: the weight-zero piece is trivial, so is every grade. -/ +noncomputable def massWeightSubmoduleGaugeWeightFiveSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightFive).piece 0) := + SU2PermDecomposition.copy (SU2PermDecomposition.bot (rep := repGauge)) _ rfl + +/-- Mass weight six: the weight-zero piece is the once-derived field strength on the + four fixed directions of the adjoint, graded by `cartanSU2PermGrade`. -/ +noncomputable def massWeightSubmoduleGaugeWeightSixSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightSix).piece 0) := + SU2PermDecomposition.copy (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 1) _ rfl + +/-- Mass weight seven: the weight-zero piece is trivial, so is every grade. -/ +noncomputable def massWeightSubmoduleGaugeWeightSevenSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightSeven).piece 0) := + SU2PermDecomposition.copy (SU2PermDecomposition.bot (rep := repGauge)) _ rfl + +/-- Mass weight eight: the twice-derived field strength on the four fixed directions of + the adjoint, joined with the colour, isospin and neutral products. The colour products + are fixed outright, while the isospin and neutral products contribute to grade two as + well as to grade zero. -/ +noncomputable def massWeightSubmoduleGaugeWeightEightSU2Perm : + SU2PermDecomposition repGauge ((h.massWeightSubmoduleGaugeWeightEight).piece 0) := + SU2PermDecomposition.copy + (SU2PermDecomposition.sup + ((h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 2).copy _ + (h.derivSubmoduleGaugeWeight_piece_zero 2).symm) + (SU2PermDecomposition.sup h.gluonRootPartSU2Perm + (SU2PermDecomposition.sup h.isospinRootPartSU2Perm h.neutralCartanPartSU2Perm))) + _ h.massWeightSubmoduleGaugeWeightEight_piece_zero + +/-- Every grade at mass weight one is trivial. -/ +lemma massWeightSubmoduleGaugeWeightOneSU2Perm_piece (k : ZMod 4) : + (h.massWeightSubmoduleGaugeWeightOneSU2Perm).piece k = ⊥ := rfl + +/-- Every grade at mass weight two is trivial. -/ +lemma massWeightSubmoduleGaugeWeightTwoSU2Perm_piece (k : ZMod 4) : + (h.massWeightSubmoduleGaugeWeightTwoSU2Perm).piece k = ⊥ := rfl + +/-- Every grade at mass weight three is trivial. -/ +lemma massWeightSubmoduleGaugeWeightThreeSU2Perm_piece (k : ZMod 4) : + (h.massWeightSubmoduleGaugeWeightThreeSU2Perm).piece k = ⊥ := rfl + +/-- Every grade at mass weight five is trivial. -/ +lemma massWeightSubmoduleGaugeWeightFiveSU2Perm_piece (k : ZMod 4) : + (h.massWeightSubmoduleGaugeWeightFiveSU2Perm).piece k = ⊥ := rfl + +/-- Every grade at mass weight seven is trivial. -/ +lemma massWeightSubmoduleGaugeWeightSevenSU2Perm_piece (k : ZMod 4) : + (h.massWeightSubmoduleGaugeWeightSevenSU2Perm).piece k = ⊥ := rfl + +/-- The grade-zero piece at mass weight four: the two colour Cartan directions of the + underived field strength together with hypercharge. -/ +lemma massWeightSubmoduleGaugeWeightFourSU2Perm_piece_zero : + (h.massWeightSubmoduleGaugeWeightFourSU2Perm).piece 0 + = ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + (ℂ ∙ h.gluonField ![] μ ν 2 ⊔ ℂ ∙ h.gluonField ![] μ ν 7 + ⊔ ℂ ∙ h.hyperchargeField ![] μ ν) := by + show (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 0).piece 0 = _ + rw [h.derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_zero 0] + exact le_antisymm (iSup_le fun l => by rw [Subsingleton.elim l ![]]) + (le_iSup (fun l : Fin 0 → Fin 1 ⊕ Fin 3 => + ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + (ℂ ∙ h.gluonField l μ ν 2 ⊔ ℂ ∙ h.gluonField l μ ν 7 + ⊔ ℂ ∙ h.hyperchargeField l μ ν)) ![]) + +/-- The grade-two piece at mass weight four: the neutral `W` of the underived field + strength alone. -/ +lemma massWeightSubmoduleGaugeWeightFourSU2Perm_piece_two : + (h.massWeightSubmoduleGaugeWeightFourSU2Perm).piece 2 + = ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), ℂ ∙ h.wField ![] μ ν 2 := by + show (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 0).piece 2 = _ + rw [h.derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_two 0] + exact le_antisymm (iSup_le fun l => by rw [Subsingleton.elim l ![]]) + (le_iSup (fun l : Fin 0 → Fin 1 ⊕ Fin 3 => + ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), ℂ ∙ h.wField l μ ν 2) ![]) + +/-- The grade-zero piece at mass weight six: the two colour Cartan directions of the + once-derived field strength together with hypercharge. -/ +lemma massWeightSubmoduleGaugeWeightSixSU2Perm_piece_zero : + (h.massWeightSubmoduleGaugeWeightSixSU2Perm).piece 0 + = ⨆ (l : Fin 1 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + (ℂ ∙ h.gluonField l μ ν 2 ⊔ ℂ ∙ h.gluonField l μ ν 7 + ⊔ ℂ ∙ h.hyperchargeField l μ ν) := + h.derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_zero 1 + +/-- The grade-two piece at mass weight six: the neutral `W` of the once-derived field + strength alone. -/ +lemma massWeightSubmoduleGaugeWeightSixSU2Perm_piece_two : + (h.massWeightSubmoduleGaugeWeightSixSU2Perm).piece 2 + = ⨆ (l : Fin 1 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.wField l μ ν 2 := + h.derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_two 1 + +/-- The graded pieces at mass weight eight, split into the four contributions: the + twice-derived field strength, the colour products, the isospin products and the + neutral products. -/ +lemma massWeightSubmoduleGaugeWeightEightSU2Perm_piece (k : ZMod 4) : + (h.massWeightSubmoduleGaugeWeightEightSU2Perm).piece k + = (h.derivSubmoduleGaugeWeightPieceZeroSU2Perm 2).piece k + ⊔ (h.gluonRootPartSU2Perm.piece k + ⊔ (h.isospinRootPartSU2Perm.piece k + ⊔ h.neutralCartanPartSU2Perm.piece k)) := rfl + +/-- The grade-zero piece at mass weight eight: the colour Cartan directions and + hypercharge of the twice-derived field strength, the colour products, the symmetric + isospin products, and the even part of the neutral products. -/ +lemma massWeightSubmoduleGaugeWeightEightSU2Perm_piece_zero : + (h.massWeightSubmoduleGaugeWeightEightSU2Perm).piece 0 + = (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + (ℂ ∙ h.gluonField l μ ν 2 ⊔ ℂ ∙ h.gluonField l μ ν 7 + ⊔ ℂ ∙ h.hyperchargeField l μ ν)) + ⊔ (h.gluonRootPart + ⊔ (h.isospinSymmPart ⊔ h.neutralCartanPartSU2Perm.piece 0)) := by + rw [h.massWeightSubmoduleGaugeWeightEightSU2Perm_piece 0, + h.derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_zero 2, + h.gluonRootPartSU2Perm_piece_zero, h.isospinRootPartSU2Perm_piece_zero] + +/-- The grade-two piece at mass weight eight: the neutral `W` of the twice-derived field + strength, the antisymmetric isospin products, and the odd part of the neutral + products. The colour products contribute nothing. -/ +lemma massWeightSubmoduleGaugeWeightEightSU2Perm_piece_two : + (h.massWeightSubmoduleGaugeWeightEightSU2Perm).piece 2 + = (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.wField l μ ν 2) + ⊔ (h.isospinAntisymmPart ⊔ h.neutralCartanPartSU2Perm.piece 2) := by + rw [h.massWeightSubmoduleGaugeWeightEightSU2Perm_piece 2, + h.derivSubmoduleGaugeWeightPieceZeroSU2Perm_piece_two 2, + h.gluonRootPartSU2Perm_piece_two, h.isospinRootPartSU2Perm_piece_two, bot_sup_eq] + +end IsGaugeSector + +end StandardModel diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean new file mode 100644 index 000000000..86a7b86a0 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -0,0 +1,478 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Invariants.IsLeftRightWeyl +/-! +# Lorentz invariants of two left-handed Weyl indices + +`IsBiLeftWeyl repLorentz T` says that a family `T`, indexed by two left-handed Weyl +indices and valued in a module `B` carrying a representation of `SL(2,ℂ)`, transforms as +a tensor `T^{α₁ α₂}`. This is the shape of a fermion mass term: a Dirac or Majorana mass +contracts two Weyl spinors of the same handedness with the antisymmetric symbol `ε`, +`ψ^α χ_α = ε_{α β} ψ^α χ^β`. + +Two spinor indices of the same handedness admit exactly one invariant contraction, the +`ε` contraction, because `SL(2,ℂ)` preserves the determinant and nothing else on a pair +of fundamental indices. The main theorem `exists_smul_epsilonContraction_of_invariant` +says accordingly that every Lorentz invariant in the span of the components is a scalar +multiple of `epsilonContraction`, and `repLorentz_epsilonContraction` checks that this +contraction really is invariant. + +The proof is the same-handedness twin of `IsLeftRightWeyl`, and reuses its Weyl weight +bases. The only change is in the endgame: averaging the weight-zero projection over the +three axes now gives `M = 2 - swap`, whose eigenvalue `3` is simple and carried by the +antisymmetric line, so the linear certificate `(3 λ - 1) / 2` in `M / 3` collapses an +invariant onto the antisymmetrisation of its coefficients, which is the `ε` contraction. + +The section headings tell the story: the weight basis of a pair of left-handed indices +(A), the tensors and the span of their components (B), the weight grading of the span +(C), the weight-zero round and its average over the three axes (D), the `ε` contraction +and the linear certificate which produces it (E), and the classification modulo a +Lorentz-stable submodule (F). +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule + mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) + +/-! + +## A. The weight basis of a pair of left-handed indices + +Both indices are graded by the same Weyl weight basis of `IsLeftRightWeyl`, so the +weight basis of the pair is the tensor square of it and the weight is `pairWeight`. + +-/ + +/-- The axis-`i` weight basis of a pair of left-handed indices. -/ +def biLeftCoeff (i : Fin 3) (κ α : Fin 2 × Fin 2) : ℂ := + weylCoeff i κ.1 α.1 * weylCoeff i κ.2 α.2 + +/-- The standard basis of a pair of left-handed indices written back in the axis-`i` + weight basis. -/ +noncomputable def biLeftCoeffInv (i : Fin 3) (α κ : Fin 2 × Fin 2) : ℂ := + weylCoeffInv i α.1 κ.1 * weylCoeffInv i α.2 κ.2 + +/-- The pair weight basis is a basis: the two coefficient matrices are inverse. -/ +lemma sum_biLeftCoeffInv_mul (i : Fin 3) (α β : Fin 2 × Fin 2) : + ∑ κ : Fin 2 × Fin 2, biLeftCoeffInv i α κ * biLeftCoeff i κ β + = if α = β then 1 else 0 := by + have hfac : (∑ κ₁, weylCoeffInv i α.1 κ₁ * weylCoeff i κ₁ β.1) + * (∑ κ₂, weylCoeffInv i α.2 κ₂ * weylCoeff i κ₂ β.2) + = ∑ κ : Fin 2 × Fin 2, biLeftCoeffInv i α κ * biLeftCoeff i κ β := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun κ₁ _ => Finset.sum_congr rfl fun κ₂ _ => by + simp only [biLeftCoeff, biLeftCoeffInv] + ring + rw [← hfac, sum_weylCoeffInv_mul, sum_weylCoeffInv_mul] + obtain ⟨α₁, α₂⟩ := α + obtain ⟨β₁, β₂⟩ := β + by_cases h1 : α₁ = β₁ <;> by_cases h2 : α₂ = β₂ <;> simp [h1, h2, Prod.mk.injEq] + +/-- The pair weight basis diagonalises the axis-`i` boost, with the weight + `pairWeight`. -/ +lemma sum_boostAxis_biLeftCoeff (i : Fin 3) (κ a : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : + ∑ l : Fin 2 × Fin 2, biLeftCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 * (SL2C.boostAxis i t ht).1 a.2 l.2) + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * biLeftCoeff i κ a := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have hfac : (∑ l₁, (SL2C.boostAxis i t ht).1 a.1 l₁ * weylCoeff i κ.1 l₁) + * (∑ l₂, (SL2C.boostAxis i t ht).1 a.2 l₂ * weylCoeff i κ.2 l₂) + = ∑ l : Fin 2 × Fin 2, biLeftCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 * (SL2C.boostAxis i t ht).1 a.2 l.2) := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun l₁ _ => Finset.sum_congr rfl fun l₂ _ => by + simp only [biLeftCoeff] + ring + rw [← hfac, sum_boostAxis_weylCoeff i κ.1 a.1 ht, sum_boostAxis_weylCoeff i κ.2 a.2 ht, + pairWeight, biLeftCoeff, zpow_add₀ htc] + ring + +/-! + +## B. Bi-left-handed Weyl tensors and the span of their components + +-/ + +/-- A family `T` of elements of `B`, indexed by two left-handed Weyl indices, transforms + as a tensor `T^{α₁ α₂}` under the representation `repLorentz` of `SL(2,ℂ)`. -/ +structure IsBiLeftWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : Fin 2 × Fin 2 → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin 2 × Fin 2), (g.1 a.1 l.1 * g.1 a.2 l.2) • T a + +namespace IsBiLeftWeyl +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : Fin 2 × Fin 2 → B} + (hT : IsBiLeftWeyl B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsBiLeftWeyl B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- The span of the components is exactly the set of linear combinations of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : Fin 2 × Fin 2 → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : Fin 2 × Fin 2 → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq'] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## C. The weight grading of the span + +-/ + +/-- The axis-`i` weight component of `T` at the pair `κ` of Weyl weight indices. -/ +noncomputable def weightVec (hT : IsBiLeftWeyl B repLorentz T) (i : Fin 3) + (κ : Fin 2 × Fin 2) : B := + ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a • T a + +/-- Each weight component lies in the span of the components. -/ +lemma weightVec_mem_span (i : Fin 3) (κ : Fin 2 × Fin 2) : + hT.weightVec i κ ∈ hT.span := + sum_mem fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _)) + +/-- Each generator is recovered from the weight components along any axis. -/ +lemma eq_sum_weightVec (i : Fin 3) (α : Fin 2 × Fin 2) : + T α = ∑ κ : Fin 2 × Fin 2, biLeftCoeffInv i α κ • hT.weightVec i κ := by + calc T α = ∑ β : Fin 2 × Fin 2, + (∑ κ : Fin 2 × Fin 2, biLeftCoeffInv i α κ * biLeftCoeff i κ β) • T β := by + simp only [sum_biLeftCoeffInv_mul, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + _ = _ := by + simp only [weightVec, Finset.smul_sum, smul_smul, Finset.sum_smul] + rw [Finset.sum_comm] + +/-- The weight components along any axis span the same space as the components. -/ +lemma span_eq_weightVec (hT : IsBiLeftWeyl B repLorentz T) (i : Fin 3) : + hT.span = ⨆ κ, ℂ ∙ hT.weightVec i κ := by + rw [span] + refine le_antisymm (iSup_le fun α => ?_) (iSup_le fun κ => ?_) + · rw [Submodule.span_singleton_le_iff_mem, hT.eq_sum_weightVec i α] + exact sum_mem fun κ _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem κ (Submodule.mem_span_singleton_self _)) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.weightVec_mem_span i κ + +/-- The weight components are boost eigenvectors: along axis `i` the component at `κ` + has boost weight `pairWeight κ`. -/ +lemma weightVec_mem_boostWeightSubmodule (i : Fin 3) (κ : Fin 2 × Fin 2) : + hT.weightVec i κ ∈ boostWeightSubmodule repLorentz i (pairWeight κ) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hstep : ∀ l : Fin 2 × Fin 2, + biLeftCoeff i κ l • repLorentz (SL2C.boostAxis i t ht) (T l) + = ∑ a : Fin 2 × Fin 2, (biLeftCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 + * (SL2C.boostAxis i t ht).1 a.2 l.2)) • T a := by + intro l + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.boostAxis i t ht) (hT.weightVec i κ) + = ∑ l : Fin 2 × Fin 2, biLeftCoeff i κ l + • repLorentz (SL2C.boostAxis i t ht) (T l) := by + simp only [weightVec, map_sum, map_smul] + _ = ∑ a : Fin 2 × Fin 2, (∑ l : Fin 2 × Fin 2, biLeftCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 + * (SL2C.boostAxis i t ht).1 a.2 l.2)) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 2 × Fin 2, + (((t : ℝ) : ℂ) ^ (pairWeight κ) * biLeftCoeff i κ a) • T a := + Finset.sum_congr rfl fun a _ => by rw [sum_boostAxis_biLeftCoeff i κ a ht] + _ = (algebraMap ℝ ℂ) t ^ (pairWeight κ) • hT.weightVec i κ := by + rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, weightVec, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-- The axis-`i` weight-`m` component of the generator `T α`: the weight-`m` partial sum + of `eq_sum_weightVec`. -/ +noncomputable def monoComponent (i : Fin 3) (α : Fin 2 × Fin 2) (m : ℤ) : B := + ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = m), + biLeftCoeffInv i α κ • hT.weightVec i κ + +/-- The weight components are homogeneous of the stated weight. -/ +lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (α : Fin 2 × Fin 2) (m : ℤ) : + hT.monoComponent i α m ∈ boostWeightSubmodule repLorentz i m := by + refine sum_mem fun κ hκ => Submodule.smul_mem _ _ ?_ + exact (show pairWeight κ = m from (Finset.mem_filter.1 hκ).2) ▸ + hT.weightVec_mem_boostWeightSubmodule i κ + +/-- A component is the sum of its weight components over the three possible weights. -/ +lemma eq_sum_monoComponent_univ (i : Fin 3) (α : Fin 2 × Fin 2) : + T α = ∑ m ∈ ({-2, 0, 2} : Finset ℤ), hT.monoComponent i α m := by + rw [hT.eq_sum_weightVec i α] + exact (Finset.sum_fiberwise_of_maps_to (fun κ _ => pairWeight_mem κ) _).symm + +/-! + +## D. The weight-zero round and its average over the axes + +-/ + +/-- The matrix of the axis-`i` weight-zero projection in the `T`-basis: the coefficient + of `T β` in the re-expansion of `monoComponent i α 0` through the weight basis. -/ +noncomputable def weightZeroTransition (i : Fin 3) (β α : Fin 2 × Fin 2) : ℂ := + ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), + biLeftCoeffInv i α κ * biLeftCoeff i κ β + +/-- The weight-zero component re-expanded in the `T`-basis: `monoComponent i α 0` is the + `α`-th column of `weightZeroTransition` applied to the generators. -/ +lemma monoComponent_zero_eq (i : Fin 3) (α : Fin 2 × Fin 2) : + hT.monoComponent i α 0 + = ∑ β : Fin 2 × Fin 2, weightZeroTransition i β α • T β := by + rw [monoComponent] + simp only [weightVec, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [← Finset.sum_smul, weightZeroTransition] + +include hT in +/-- One round of the recursion along one axis: an element of weight zero along axis `i` + expanded in the generators re-expands with the weight-zero transition matrix applied + to its coefficients. -/ +lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} + (c : Fin 2 × Fin 2 → ℂ) (hx : x = ∑ α, c α • T α) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ β, (∑ α, weightZeroTransition i β α * c α) • T β := by + have hsum : x = ∑ m ∈ ({-2, 0, 2} : Finset ℤ), + ∑ α, c α • hT.monoComponent i α m := by + rw [hx] + calc ∑ α, c α • T α + = ∑ α, c α • ∑ m ∈ ({-2, 0, 2} : Finset ℤ), hT.monoComponent i α m := + Finset.sum_congr rfl fun α _ => by rw [← hT.eq_sum_monoComponent_univ i α] + _ = _ := by + simp only [Finset.smul_sum] + exact Finset.sum_comm + have hx0 : x = ∑ α, c α • hT.monoComponent i α 0 := + eq_component_zero_of_mem_boostWeightSubmodule + (w := fun m => ∑ α, c α • hT.monoComponent i α m) hw + (fun m _ => sum_mem fun α _ => Submodule.smul_mem _ _ + (hT.monoComponent_mem_boostWeightSubmodule i α m)) + (by decide) hsum + calc x = ∑ α, c α • hT.monoComponent i α 0 := hx0 + _ = ∑ α, c α • ∑ β, weightZeroTransition i β α • T β := + Finset.sum_congr rfl fun α _ => by rw [hT.monoComponent_zero_eq i α] + _ = ∑ β, (∑ α, weightZeroTransition i β α * c α) • T β := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [← Finset.sum_smul] + exact congrArg (· • T β) (Finset.sum_congr rfl fun α _ => mul_comm _ _) + +/-- The closed form of the summed weight-zero transition: twice the identity minus the + swap of the two indices. -/ +def transitionEntry (β α : Fin 2 × Fin 2) : ℂ := + 2 * (if β.1 = α.1 then 1 else 0) * (if β.2 = α.2 then 1 else 0) + - (if β.1 = α.2 then 1 else 0) * (if β.2 = α.1 then 1 else 0) + +/-- The sum over the three axes of the weight-zero transitions has the closed form + `transitionEntry`. -/ +lemma sum_weightZeroTransition_eq (β α : Fin 2 × Fin 2) : + ∑ i : Fin 3, weightZeroTransition i β α = transitionEntry β α := by + simp only [weightZeroTransition, sum_weightZeroFilter, Fin.sum_univ_three] + obtain ⟨β₁, β₂⟩ := β + obtain ⟨α₁, α₂⟩ := α + fin_cases β₁ <;> fin_cases β₂ <;> fin_cases α₁ <;> fin_cases α₂ <;> + simp [transitionEntry, biLeftCoeff, biLeftCoeffInv, weylCoeff, weylCoeffInv] <;> + norm_num [Complex.ext_iff] + +include hT in +/-- One averaged round of the recursion: an element of weight zero along all three axes + re-expands with a third of the summed transition matrix applied to its + coefficients. -/ +lemma eq_sum_transitionEntry_smul {x : B} (c : Fin 2 × Fin 2 → ℂ) + (hx : x = ∑ α, c α • T α) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ β, ((3 : ℂ)⁻¹ * ∑ α, transitionEntry β α * c α) • T β := by + have hround : ∀ i : Fin 3, + x = ∑ β, (∑ α, weightZeroTransition i β α * c α) • T β := + fun i => hT.eq_sum_weightZeroTransition_smul i c hx (hw i) + have h3 : (3 : ℂ) • x = ∑ i : Fin 3, x := by + rw [Fin.sum_univ_three, show (3 : ℂ) = 1 + 1 + 1 from by norm_num, + add_smul, add_smul, one_smul] + calc x = (3 : ℂ)⁻¹ • ((3 : ℂ) • x) := by rw [smul_smul]; norm_num + _ = (3 : ℂ)⁻¹ • ∑ i : Fin 3, x := by rw [h3] + _ = (3 : ℂ)⁻¹ • ∑ i : Fin 3, ∑ β, + (∑ α, weightZeroTransition i β α * c α) • T β := + congrArg (fun y => (3 : ℂ)⁻¹ • y) (Finset.sum_congr rfl fun i _ => hround i) + _ = ∑ β, ((3 : ℂ)⁻¹ * ∑ α, transitionEntry β α * c α) • T β := by + rw [Finset.sum_comm, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [← Finset.sum_smul, smul_smul] + congr 1 + rw [show (∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α) + = ∑ α, transitionEntry β α * c α from by + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun α _ => by + rw [← Finset.sum_mul, sum_weightZeroTransition_eq]] + +/-! + +## E. The epsilon contraction and the linear certificate + +The summed transition is `2 - swap`, so a third of it fixes exactly the antisymmetric +line. The linear certificate `(3 λ - 1) / 2` therefore collapses an invariant onto the +antisymmetrisation of its coefficients, which is a multiple of the `ε` contraction. + +-/ + +/-- The `ε` symbol on a pair of same-handedness spinor indices, in the convention of + `Fermion.metricRaw`. -/ +def epsZ (α : Fin 2 × Fin 2) : ℤ := + if α = (0, 1) then 1 else if α = (1, 0) then -1 else 0 + +/-- The `ε` contraction `ε_{α β} T^{α β}`, the only invariant contraction of two + same-handedness Weyl indices, and the shape of a fermion mass term. -/ +noncomputable def epsilonContraction : B := + ∑ α : Fin 2 × Fin 2, ((epsZ α : ℤ) : ℂ) • T α + +/-- The `ε` contraction written out: the antisymmetric combination of the two mixed + components. -/ +lemma epsilonContraction_eq : + epsilonContraction (T := T) = T (0, 1) - T (1, 0) := by + rw [epsilonContraction] + simp [Fintype.sum_prod_type, Fin.sum_univ_two, epsZ] + module + +include hT in +/-- The `ε` contraction is Lorentz invariant: the antisymmetric combination picks out + the determinant of the `SL(2,ℂ)` matrix, which is one. -/ +lemma repLorentz_epsilonContraction (g : SL(2,ℂ)) : + repLorentz g (epsilonContraction (T := T)) = epsilonContraction (T := T) := by + have hdet : g.1 0 0 * g.1 1 1 - g.1 0 1 * g.1 1 0 = 1 := by + have h := g.2 + rwa [Matrix.det_fin_two] at h + rw [epsilonContraction_eq, map_sub, hT.repLorentz_T, hT.repLorentz_T] + simp only [Fintype.sum_prod_type, Fin.sum_univ_two] + match_scalars + · ring + · linear_combination hdet + · linear_combination -hdet + · ring + +/-- The action of the summed transition matrix on a coefficient vector is twice the + vector minus its swap. -/ +lemma sum_transitionEntry_mul (c : Fin 2 × Fin 2 → ℂ) (β : Fin 2 × Fin 2) : + ∑ α, transitionEntry β α * c α = 2 * c β - c β.swap := by + obtain ⟨β₁, β₂⟩ := β + fin_cases β₁ <;> fin_cases β₂ <;> + simp [transitionEntry, Fintype.sum_prod_type, Fin.sum_univ_two] <;> ring + +/-- The antisymmetrisation of a coefficient vector is a multiple of the `ε` + contraction. -/ +lemma sum_antisymm_smul (c : Fin 2 × Fin 2 → ℂ) : + ∑ β : Fin 2 × Fin 2, ((2 : ℂ)⁻¹ * (c β - c β.swap)) • T β + = ((2 : ℂ)⁻¹ * (c (0, 1) - c (1, 0))) • epsilonContraction (T := T) := by + rw [epsilonContraction_eq] + simp only [Fintype.sum_prod_type, Fin.sum_univ_two, Prod.swap_prod_mk] + module + +include hT in +/-- The classification of the Lorentz invariants: every element of the span of the + components fixed by the Lorentz group is a scalar multiple of the `ε` contraction. -/ +theorem exists_smul_epsilonContraction_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, x = a • epsilonContraction (T := T) := by + obtain ⟨c, hc⟩ := (hT.mem_span_iff x).1 hx + have hw := mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv + have h1 : x = ∑ β, ((3 : ℂ)⁻¹ * (2 * c β - c β.swap)) • T β := by + rw [hT.eq_sum_transitionEntry_smul c hc hw] + exact Finset.sum_congr rfl fun β _ => by rw [sum_transitionEntry_mul] + refine ⟨(2 : ℂ)⁻¹ * (c (0, 1) - c (1, 0)), ?_⟩ + rw [← sum_antisymm_smul c] + calc x = (3 / 2 : ℂ) • x - (1 / 2 : ℂ) • x := by module + _ = ∑ β : Fin 2 × Fin 2, ((2 : ℂ)⁻¹ * (c β - c β.swap)) • T β := by + nth_rewrite 1 [h1] + nth_rewrite 1 [hc] + simp only [Finset.smul_sum, smul_smul, ← Finset.sum_sub_distrib, ← sub_smul] + refine Finset.sum_congr rfl fun β _ => ?_ + congr 1 + ring + +/-! + +## F. The classification modulo a Lorentz-stable submodule + +A Lorentz-stable submodule can be divided out: the quotient representation carries the +images of the components as a bi-left-handed tensor again, so the classification applies +verbatim in the quotient and lifts to a classification modulo the submodule. The +quotient representation itself is the one built in `IsQuadLorentz`. + +-/ + +include hT in +/-- The images of the components in the quotient by a Lorentz-stable submodule again + form a bi-left-handed Weyl tensor. -/ +lemma isBiLeftWeyl_quotRep (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + IsBiLeftWeyl (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + (fun l => S.mkQ (T l)) where + repLorentz_T g l := by + rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The quotient map carries the `ε` contraction to the `ε` contraction of the + images. -/ +lemma mkQ_epsilonContraction (S : Submodule ℂ B) : + S.mkQ (epsilonContraction (T := T)) + = epsilonContraction (T := fun l => S.mkQ (T l)) := by + rw [epsilonContraction, epsilonContraction, map_sum] + exact Finset.sum_congr rfl fun α _ => map_smul _ _ _ + +include hT in +/-- The classification of the Lorentz invariants modulo a stable submodule: an element + of the span of the components together with a Lorentz-stable submodule `S`, fixed by + the Lorentz group, is a multiple of the `ε` contraction up to an error in `S`. -/ +lemma exists_smul_epsilonContraction_of_invariant_subset {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, ∃ y ∈ S, x = a • epsilonContraction (T := T) + y := by + have hT' := hT.isBiLeftWeyl_quotRep S hS + have hmk : S.mkQ x ∈ hT'.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hT'.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ g : SL(2,ℂ), + quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := by + intro g + rw [quotRep_mkQ, hinv g] + obtain ⟨a, hcomb⟩ := hT'.exists_smul_epsilonContraction_of_invariant hmk hinv' + rw [← mkQ_epsilonContraction] at hcomb + refine ⟨a, x - a • epsilonContraction (T := T), ?_, by abel⟩ + have hker : x - a • epsilonContraction (T := T) ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, hcomb, map_smul] + abel + rwa [Submodule.ker_mkQ] at hker + +end IsBiLeftWeyl + +end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean new file mode 100644 index 000000000..362301a36 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean @@ -0,0 +1,747 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Invariants.IsQuadLorentz +public meta import Mathlib.Data.Fintype.Sum +public meta import Mathlib.Data.Fintype.Pi +/-! +# Lorentz invariants among two four-vector indices + +`IsBiLorentz repLorentz T` says that a family `T`, indexed by two four-vector indices +and valued in a module `B` carrying a representation of `SL(2,ℂ)`, transforms as a +tensor `T^{μ₁ μ₂}`. + +With only two indices there is a single invariant contraction, the metric trace +`g^{μν} T_{μν}`: the Levi-Civita symbol needs four indices, and the two double metric +contractions of the four-index case collapse to one. The main theorem +`exists_smul_metricContraction_of_invariant` says accordingly that every Lorentz +invariant in the span of the components is a scalar multiple of `metricContraction`. + +The proof is the two-index shadow of `IsQuadLorentz`, and reuses its light-cone +coefficient mirrors, sector data and integer slot matrices throughout. The section +headings tell the story: the light-cone basis along one axis (B) grades the span by +boost weight, the weight-zero projection of a generator gives one round of the +recursion and averaging the three axes gives the round matrix `M` (C), whose integer +mirror on the sixteen components has the closed form of section D, and the cubic +certificate `λ(λ - 4)(λ - 10)` of section E collapses the iterated rounds onto the +rank-one projector to the metric trace (F). + +No rotation averaging is needed here, unlike the four-index case: for two indices the +three weight-zero conditions already cut the sixteen components down to a single line, +and the round matrix is small enough to be handled directly. +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open IsQuadLorentz (lightConeCoeffZ coe_lightConeCoeffZ lightConeCoeffInvQ + coe_lightConeCoeffInvQ lightConeCoeffInvZ coe_lightConeCoeffInvZ sectorIndex + sectorWeight lightConeWeight_eq_sectorWeight slotTransition slotTransitionZ + slotTransitionZ_eq_sum eq_component_zero_of_mem_boostWeightSubmodule + mem_boostWeightSubmodule_zero_of_invariant etaZ quotRep quotRep_mkQ) + +/-! + +## A. Bi-Lorentz tensors and the span of their components + +-/ + +/-- A family `T` of elements of `B`, indexed by two four-vector indices, transforms as + a tensor `T^{μ₁ μ₂}` under the representation `repLorentz` of `SL(2,ℂ)`. -/ +structure IsBiLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin 2 → (Fin 1 ⊕ Fin 3)) → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin 2 → Fin 1 ⊕ Fin 3), + (∏ (i : Fin 2), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a + +namespace IsBiLorentz +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 2 → (Fin 1 ⊕ Fin 3)) → B} + (hT : IsBiLorentz B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsBiLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → (Fin 1 ⊕ Fin 3)) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 2 → (Fin 1 ⊕ Fin 3)) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq'] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. The light-cone basis along one axis + +Along a spatial axis `i` the coordinate components recombine into the light-cone +components `lightCone i c`, which span the same space and are homogeneous of boost +weight `∑ j, lightConeWeight (c j)`. + +-/ + +/-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ +noncomputable def lightCone (hT : IsBiLorentz B repLorentz T) (i : Fin 3) + (c : Fin 2 → Fin 4) : B := + ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • T d + +/-- Each light-cone component lies in the span of the coordinate components. -/ +lemma lightCone_mem_span (i : Fin 3) (c : Fin 2 → Fin 4) : hT.lightCone i c ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-- Each generator is recovered from the light-cone components along any axis. -/ +lemma eq_sum_lightCone (i : Fin 3) (d : Fin 2 → Fin 1 ⊕ Fin 3) : + T d = ∑ c : Fin 2 → Fin 4, + (∏ j, lightConeCoeffInv i (d j) (c j)) • hT.lightCone i c := by + calc T d = ∑ e : Fin 2 → Fin 1 ⊕ Fin 3, + (∑ c : Fin 2 → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j))) • T e := by + simp only [sum_prod_lightConeCoeffInv, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + _ = _ := by + simp only [lightCone, Finset.smul_sum, smul_smul, Finset.sum_smul] + rw [Finset.sum_comm] + +/-- The light-cone components along any axis span the same space as the components. -/ +lemma span_eq_lightCone (hT : IsBiLorentz B repLorentz T) (i : Fin 3) : + hT.span = ⨆ c, ℂ ∙ hT.lightCone i c := by + rw [span] + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun c => ?_) + · rw [Submodule.span_singleton_le_iff_mem, hT.eq_sum_lightCone i d] + exact sum_mem fun c _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem c (Submodule.mem_span_singleton_self _)) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.lightCone_mem_span i c + +/-- The light-cone components are boost eigenvectors: along axis `i` the component at + `c` has boost weight the total light-cone weight of `c`. -/ +lemma lightCone_mem_boostWeightSubmodule (i : Fin 3) (c : Fin 2 → Fin 4) : + hT.lightCone i c ∈ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hstep : ∀ x : Fin 2 → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) + = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + intro x + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) + = ∑ x : Fin 2 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) := by + simp only [lightCone, map_sum, map_smul] + _ = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, + (∑ x : Fin 2 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, (((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * + (∏ j, lightConeCoeff i (c j) (a j))) • T a := by + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + exact sum_prod_lightConeCoeff i c a ht + _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by + rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, lightCone, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-! + +## C. The weight-zero round and its average over the axes + +## C.1. The boost-weight components of a generator + +Each generator `T e` is the sum of its boost-weight components `monoComponent i e m`, +and the possible weights are the five even numbers between `-4` and `4`. + +-/ + +/-- The axis-`i` weight-`m` component of the generator `T e`: the weight-`m` partial + sum of `eq_sum_lightCone`. -/ +noncomputable def monoComponent (i : Fin 3) (e : Fin 2 → Fin 1 ⊕ Fin 3) (m : ℤ) : B := + ∑ c ∈ Finset.univ.filter (fun c : Fin 2 → Fin 4 => (∑ s, lightConeWeight (c s)) = m), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c + +/-- The weight components are homogeneous of the stated weight. -/ +lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (e : Fin 2 → Fin 1 ⊕ Fin 3) + (m : ℤ) : hT.monoComponent i e m ∈ boostWeightSubmodule repLorentz i m := by + refine sum_mem fun c hc => Submodule.smul_mem _ _ ?_ + exact (show (∑ s, lightConeWeight (c s)) = m from (Finset.mem_filter.1 hc).2) ▸ + hT.lightCone_mem_boostWeightSubmodule i c + +/-- The total light-cone weight of two slots is even and lies between `-4` and `4`. -/ +lemma sum_lightConeWeight_mem (c : Fin 2 → Fin 4) : + (∑ s, lightConeWeight (c s)) ∈ ({-4, -2, 0, 2, 4} : Finset ℤ) := by + have hweight (κ : Fin 4) : + ∃ q : ℤ, -1 ≤ q ∧ q ≤ 1 ∧ lightConeWeight κ = 2 * q := by + fin_cases κ + · exact ⟨1, by norm_num [lightConeWeight]⟩ + · exact ⟨-1, by norm_num [lightConeWeight]⟩ + · exact ⟨0, by norm_num [lightConeWeight]⟩ + · exact ⟨0, by norm_num [lightConeWeight]⟩ + obtain ⟨q0, hq0_lower, hq0_upper, hq0⟩ := hweight (c 0) + obtain ⟨q1, hq1_lower, hq1_upper, hq1⟩ := hweight (c 1) + rw [Fin.sum_univ_two, hq0, hq1] + simp only [Finset.mem_insert, Finset.mem_singleton] + omega + +/-- A component is the sum of its weight components over the five possible weights. -/ +lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 2 → Fin 1 ⊕ Fin 3) : + T e = ∑ m ∈ ({-4, -2, 0, 2, 4} : Finset ℤ), hT.monoComponent i e m := by + rw [hT.eq_sum_lightCone i e] + exact (Finset.sum_fiberwise_of_maps_to (fun c _ => sum_lightConeWeight_mem c) _).symm + +/-! + +## C.2. The weight-zero transition matrix + +The matrix of the axis-`i` weight-zero projection in the `T`-basis: a sum over balanced +sector patterns of the per-slot sector matrices of `IsQuadLorentz`. + +-/ + +/-- The matrix of the axis-`i` weight-zero projection in the `T`-basis: the + coefficient of `T d` in the re-expansion of `monoComponent i e 0` through the + light-cone basis, as the sum over the three balanced sector patterns of the product + of the two per-slot sector matrices. -/ +def weightZeroTransition (i : Fin 3) (d e : Fin 2 → Fin 1 ⊕ Fin 3) : ℚ := + ∑ w ∈ Finset.univ.filter (fun w : Fin 2 → Fin 3 => (∑ s, sectorWeight (w s)) = 0), + ∏ s, slotTransition i (w s) (e s) (d s) + +/-- Weight-zero light-cone sums over two slots are balanced-sector convolutions: a sum + over the weight-zero light-cone monomials of a product of slot factors regroups as + the sum over balanced sector patterns of the product of the slotwise sector sums. -/ +lemma sum_weightZero_eq_sum_sector {R : Type*} [CommSemiring R] (f : Fin 2 → Fin 4 → R) : + ∑ c ∈ Finset.univ.filter (fun c : Fin 2 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, f s (c s) + = ∑ w ∈ Finset.univ.filter (fun w : Fin 2 → Fin 3 => (∑ s, sectorWeight (w s)) = 0), + ∏ s, ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = w s), + f s κ' := by + have hmaps : ∀ c ∈ Finset.univ.filter + (fun c : Fin 2 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + (fun s => sectorIndex (c s)) ∈ Finset.univ.filter + (fun w : Fin 2 → Fin 3 => (∑ s, sectorWeight (w s)) = 0) := by + intro c hc + simp only [Finset.mem_filter, Finset.mem_univ, true_and] at hc ⊢ + rw [← hc] + exact (Finset.sum_congr rfl fun s _ => lightConeWeight_eq_sectorWeight (c s)).symm + rw [← Finset.sum_fiberwise_of_maps_to hmaps] + refine Finset.sum_congr rfl fun w hw => ?_ + have hw0 : (∑ s, sectorWeight (w s)) = 0 := (Finset.mem_filter.1 hw).2 + have hfiber : (Finset.univ.filter + (fun c : Fin 2 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0)).filter + (fun c => (fun s => sectorIndex (c s)) = w) + = Fintype.piFinset + (fun s => Finset.univ.filter (fun κ : Fin 4 => sectorIndex κ = w s)) := by + ext c + simp only [Finset.mem_filter, Finset.mem_univ, true_and, Fintype.mem_piFinset, + funext_iff] + constructor + · rintro ⟨-, hcw⟩ s + exact hcw s + · intro hcw + refine ⟨?_, hcw⟩ + rw [show (∑ s, lightConeWeight (c s)) = ∑ s, sectorWeight (w s) from + Finset.sum_congr rfl fun s _ => by rw [lightConeWeight_eq_sectorWeight, hcw s]] + exact hw0 + rw [hfiber] + exact (Finset.prod_univ_sum + (fun s => Finset.univ.filter fun κ' : Fin 4 => sectorIndex κ' = w s) + (fun s κ' => f s κ')).symm + +/-- The weight-zero transition as a light-cone sum: the sector convolution expands to + the sum over weight-zero light-cone monomials of the composite slot coefficients. -/ +lemma weightZeroTransition_eq_sum_lightCone (i : Fin 3) (d e : Fin 2 → Fin 1 ⊕ Fin 3) : + weightZeroTransition i d e + = ∑ c ∈ Finset.univ.filter + (fun c : Fin 2 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) := by + rw [weightZeroTransition] + exact (sum_weightZero_eq_sum_sector + (fun s κ => lightConeCoeffInvQ i (e s) κ * (lightConeCoeffZ i κ (d s) : ℚ))).symm + +/-- The weight-zero component re-expanded in the `T`-basis: `monoComponent i e 0` + is the `e`-th column of `weightZeroTransition` applied to the generators. -/ +lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 2 → Fin 1 ⊕ Fin 3) : + hT.monoComponent i e 0 + = ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := by + rw [monoComponent] + simp only [lightCone, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [weightZeroTransition_eq_sum_lightCone] + push_cast + simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] + +/-! + +## C.3. The boost average and iterated rounds + +An element of weight zero along all three axes re-expands through the average of the +three weight-zero transitions, and hence through any power of it. + +-/ + +/-- The boost-average matrix `M`: the matrix of `3⁻¹(π₀⁰ + π₁⁰ + π₂⁰)` in the + `T`-basis — the average over the three axes of the weight-zero transition matrices. + Its powers drive the endgame recursion. -/ +def boostAverageTransition : + Matrix (Fin 2 → Fin 1 ⊕ Fin 3) (Fin 2 → Fin 1 ⊕ Fin 3) ℚ := + Matrix.of fun d e => (3⁻¹ : ℚ) * ∑ i : Fin 3, weightZeroTransition i d e + +include hT in +/-- One round of the recursion along one axis: an element of weight zero along axis + `i` expanded in the generators re-expands with the weight-zero transition matrix + applied to its coefficients. -/ +lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} + (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + have hsum : x = ∑ m ∈ ({-4, -2, 0, 2, 4} : Finset ℤ), + ∑ e, c e • hT.monoComponent i e m := by + rw [hx] + calc ∑ e, c e • T e + = ∑ e, c e • ∑ m ∈ ({-4, -2, 0, 2, 4} : Finset ℤ), hT.monoComponent i e m := + Finset.sum_congr rfl fun e _ => by rw [← hT.eq_sum_monoComponent_univ i e] + _ = _ := by + simp only [Finset.smul_sum] + exact Finset.sum_comm + have hx0 : x = ∑ e, c e • hT.monoComponent i e 0 := + eq_component_zero_of_mem_boostWeightSubmodule + (w := fun m => ∑ e, c e • hT.monoComponent i e m) hw + (fun m _ => sum_mem fun e _ => Submodule.smul_mem _ _ + (hT.monoComponent_mem_boostWeightSubmodule i e m)) + (by decide) hsum + calc x = ∑ e, c e • hT.monoComponent i e 0 := hx0 + _ = ∑ e, c e • ∑ d, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := + Finset.sum_congr rfl fun e _ => by rw [hT.monoComponent_zero_eq i e] + _ = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + exact Finset.sum_congr rfl fun e _ => mul_comm _ _ + +include hT in +/-- One averaged round of the recursion: an element of weight zero along all three + axes re-expands with the boost-average matrix `M` applied to its coefficients. -/ +lemma eq_sum_boostAverageTransition_smul {x : B} + (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) * c e) • T d := by + have hround : ∀ i : Fin 3, + x = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := + fun i => hT.eq_sum_weightZeroTransition_smul i c hx (hw i) + have h3 : (3 : ℂ) • x = ∑ i : Fin 3, x := by + rw [Fin.sum_univ_three, show (3 : ℂ) = 1 + 1 + 1 from by norm_num, + add_smul, add_smul, one_smul] + calc x = (3⁻¹ : ℂ) • ((3 : ℂ) • x) := by rw [smul_smul]; norm_num + _ = (3⁻¹ : ℂ) • ∑ i : Fin 3, x := by rw [h3] + _ = (3⁻¹ : ℂ) • ∑ i : Fin 3, ∑ d, + (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := + congrArg (fun y => (3⁻¹ : ℂ) • y) (Finset.sum_congr rfl fun i _ => hround i) + _ = ∑ d, (∑ e, ((boostAverageTransition d e : ℚ) : ℂ) * c e) • T d := by + rw [Finset.sum_comm, Finset.smul_sum] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul, smul_smul] + congr 1 + rw [Finset.sum_comm, Finset.mul_sum] + refine Finset.sum_congr rfl fun e _ => ?_ + simp only [boostAverageTransition, Matrix.of_apply] + push_cast + rw [mul_assoc, Finset.sum_mul] + +/-! + +## D. The averaged round as an integer matrix + +Twelve times the boost average is an integer matrix on the sixteen components, and it +has a short closed form which the kernel can evaluate cheaply. + +-/ + +/-- Integer mirror of the weight-zero transition: four times its value, as the + balanced-sector convolution of the integer slot matrices of `IsQuadLorentz`. -/ +def weightZeroTransitionZ (i : Fin 3) (d e : Fin 2 → Fin 1 ⊕ Fin 3) : ℤ := + ∑ w ∈ Finset.univ.filter (fun w : Fin 2 → Fin 3 => (∑ s, sectorWeight (w s)) = 0), + ∏ s, slotTransitionZ i (w s) (e s) (d s) + +/-- The integer weight-zero transition as a light-cone sum. -/ +lemma weightZeroTransitionZ_eq_sum_lightCone (i : Fin 3) (d e : Fin 2 → Fin 1 ⊕ Fin 3) : + weightZeroTransitionZ i d e + = ∑ c ∈ Finset.univ.filter + (fun c : Fin 2 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvZ i (e s) (c s) * lightConeCoeffZ i (c s) (d s) := by + rw [weightZeroTransitionZ] + simp only [slotTransitionZ_eq_sum] + exact (sum_weightZero_eq_sum_sector + (fun s κ => lightConeCoeffInvZ i (e s) κ * lightConeCoeffZ i κ (d s))).symm + +/-- The integer mirror casts to four times the weight-zero transition. -/ +lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 2 → Fin 1 ⊕ Fin 3) : + ((weightZeroTransitionZ i d e : ℤ) : ℚ) = 4 * weightZeroTransition i d e := by + rw [weightZeroTransitionZ_eq_sum_lightCone, weightZeroTransition_eq_sum_lightCone] + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + calc ∏ s, ((lightConeCoeffInvZ i (e s) (c s) : ℤ) : ℚ) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) + = ∏ s, 2 * (lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ)) := by + refine Finset.prod_congr rfl fun s _ => ?_ + rw [coe_lightConeCoeffInvZ] + ring + _ = 4 * ∏ s, lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) := by + rw [Finset.prod_mul_distrib, Finset.prod_const] + norm_num [Finset.card_univ] + +/-- Twelve times the boost average, as an integer matrix on the sixteen components. -/ +def boostAverageZ : Matrix (Fin 2 → Fin 1 ⊕ Fin 3) (Fin 2 → Fin 1 ⊕ Fin 3) ℤ := + Matrix.of fun d e => ∑ i : Fin 3, weightZeroTransitionZ i d e + +/-- The integer mirror casts to twelve times the boost average. -/ +lemma coe_boostAverageZ (d e : Fin 2 → Fin 1 ⊕ Fin 3) : + ((boostAverageZ d e : ℤ) : ℚ) = 12 * boostAverageTransition d e := by + rw [boostAverageZ, boostAverageTransition, Matrix.of_apply, Matrix.of_apply] + push_cast + simp only [coe_weightZeroTransitionZ] + rw [← Finset.mul_sum] + ring + +/-- The closed form of the integer averaged round. A pair of equal indices talks only + to pairs of equal indices, with the time-time entry `6`, the mixed time-space entries + `-2` and the space-space diagonal entry `10`; a pair with exactly one time index + carries `2` on itself and `-2` on its transpose; and a pair of distinct space indices + carries `4` on itself. -/ +def boostAverageEntry (d e : Fin 2 → Fin 1 ⊕ Fin 3) : ℤ := + if d 0 = d 1 then + (if e 0 = e 1 then + (if d 0 = Sum.inl 0 then (if e 0 = Sum.inl 0 then 6 else -2) + else if e 0 = Sum.inl 0 then -2 else if d 0 = e 0 then 10 else 0) + else 0) + else if d 0 = Sum.inl 0 ∨ d 1 = Sum.inl 0 then + (if e 0 = d 0 ∧ e 1 = d 1 then 2 else if e 0 = d 1 ∧ e 1 = d 0 then -2 else 0) + else (if e 0 = d 0 ∧ e 1 = d 1 then 4 else 0) + +/-- The integer averaged round agrees with its closed form. -/ +lemma boostAverageZ_eq : boostAverageZ = Matrix.of boostAverageEntry := by + ext d e + revert d e + decide +kernel + +/-! + +## E. The certificate polynomial and the trace projector + +The averaged round has eigenvalues `12`, `10`, `4` and `0` on the sixteen components, +with the eigenvalue `12` — the invariant one — simple. The cubic `λ(λ - 4)(λ - 10)` +therefore collapses it to a rank-one matrix, the outer square of the metric. + +-/ + +/-- The certificate polynomial applied to the integer averaged round. -/ +def Q : Matrix (Fin 2 → Fin 1 ⊕ Fin 3) (Fin 2 → Fin 1 ⊕ Fin 3) ℤ := + boostAverageZ * (boostAverageZ - 4) * (boostAverageZ - 10) + +/-- The closed form of the first factor pair `M(M - 4)`: it is supported on the pairs + of equal indices, where it is the difference of a multiple of the metric outer square + and a multiple of the identity on the space-space block. -/ +def boostAverageSqEntry (d e : Fin 2 → Fin 1 ⊕ Fin 3) : ℤ := + if d 0 = d 1 ∧ e 0 = e 1 then + (if d 0 = Sum.inl 0 then (if e 0 = Sum.inl 0 then 24 else -24) + else if e 0 = Sum.inl 0 then -24 else if d 0 = e 0 then 64 else 4) + else 0 + +set_option maxRecDepth 20000 in +/-- The certificate collapses to the projector: applying the cubic certificate to the + integer averaged round yields `48` times the outer square of the metric. Verified + through a materialised intermediate product, so each kernel step is a single + multiplication of matrices with cheap entries. -/ +lemma Q_explicit : + Q = Matrix.of fun d e : Fin 2 → Fin 1 ⊕ Fin 3 => + 48 * (etaZ (d 0) (d 1) * etaZ (e 0) (e 1)) := by + have h1 : boostAverageZ * (boostAverageZ - 4) = Matrix.of boostAverageSqEntry := by + rw [boostAverageZ_eq] + ext a b + revert a b + decide +kernel + rw [Q, h1, boostAverageZ_eq] + ext a b + revert a b + decide +kernel + +/-- The certificate polynomial expanded into powers. -/ +lemma Q_eq_poly : Q = boostAverageZ ^ 3 - (14 : ℤ) • boostAverageZ ^ 2 + + (40 : ℤ) • boostAverageZ := by + rw [Q] + noncomm_ring + +/-! + +## F. The classification of the Lorentz invariants + +## F.1. The metric contraction + +-/ + +/-- The metric contraction `g^{μν} T_{μν}`, the only invariant contraction of two + four-vector indices. -/ +noncomputable def metricContraction : B := + ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 1) : ℤ) : ℂ) • T d + +/-! + +## F.2. Iterating the averaged round + +-/ + +include hT in +/-- One averaged round in integer form: the averaged round acts by the integer matrix + `boostAverageZ` with the overall `12⁻¹` normalisation. -/ +lemma eq_sum_boostAverageZ_smul {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ) + (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, ((12 : ℂ)⁻¹ * ∑ e, ((boostAverageZ d e : ℤ) : ℂ) * c e) • T d := by + rw [hT.eq_sum_boostAverageTransition_smul c hx hw] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun e _ => ?_ + have hb := congrArg (fun q : ℚ => (q : ℂ)) (coe_boostAverageZ d e) + push_cast at hb ⊢ + rw [hb] + ring + +include hT in +/-- Iterated averaged rounds in integer form: `n` rounds act by the `n`-th power of the + integer matrix with the `12⁻ⁿ` normalisation. -/ +lemma eq_sum_pow_boostAverageZ_smul {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ) + (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) (n : ℕ) : + x = ∑ d, (((12 : ℂ) ^ n)⁻¹ * ∑ e, (((boostAverageZ ^ n) d e : ℤ) : ℂ) * c e) + • T d := by + induction n with + | zero => + rw [hx] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + rw [pow_zero, pow_zero] + simp [Matrix.one_apply, apply_ite (fun q : ℤ => (q : ℂ)), ite_mul, Finset.sum_ite_eq] + | succ n ih => + rw [hT.eq_sum_boostAverageZ_smul + (fun d => ((12 : ℂ) ^ n)⁻¹ * ∑ e, (((boostAverageZ ^ n) d e : ℤ) : ℂ) * c e) + ih hw] + refine Finset.sum_congr rfl fun d _ => ?_ + congr 1 + calc (12 : ℂ)⁻¹ * ∑ f, ((boostAverageZ d f : ℤ) : ℂ) + * (((12 : ℂ) ^ n)⁻¹ * ∑ e, (((boostAverageZ ^ n) f e : ℤ) : ℂ) * c e) + = ((12 : ℂ) ^ (n + 1))⁻¹ * ∑ f, ((boostAverageZ d f : ℤ) : ℂ) + * ∑ e, (((boostAverageZ ^ n) f e : ℤ) : ℂ) * c e := by + rw [Finset.mul_sum, Finset.mul_sum] + refine Finset.sum_congr rfl fun f _ => ?_ + rw [pow_succ] + field_simp + _ = ((12 : ℂ) ^ (n + 1))⁻¹ + * ∑ e, (((boostAverageZ * boostAverageZ ^ n) d e : ℤ) : ℂ) * c e := by + congr 1 + calc ∑ f, ((boostAverageZ d f : ℤ) : ℂ) + * ∑ e, (((boostAverageZ ^ n) f e : ℤ) : ℂ) * c e + = ∑ f, ∑ e, ((boostAverageZ d f : ℤ) : ℂ) + * ((((boostAverageZ ^ n) f e : ℤ) : ℂ) * c e) := + Finset.sum_congr rfl fun f _ => by rw [Finset.mul_sum] + _ = ∑ e, (∑ f, ((boostAverageZ d f : ℤ) : ℂ) + * (((boostAverageZ ^ n) f e : ℤ) : ℂ)) * c e := by + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun e _ => ?_ + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun f _ => (mul_assoc _ _ _).symm + _ = ∑ e, (((boostAverageZ * boostAverageZ ^ n) d e : ℤ) : ℂ) * c e := by + refine Finset.sum_congr rfl fun e _ => ?_ + congr 1 + rw [Matrix.mul_apply] + push_cast + rfl + _ = ((12 : ℂ) ^ (n + 1))⁻¹ + * ∑ e, (((boostAverageZ ^ (n + 1)) d e : ℤ) : ℂ) * c e := by + rw [← pow_succ' boostAverageZ n] + +/-! + +## F.3. The certificate round + +-/ + +include hT in +/-- The certificate round: applying the certificate polynomial of the averaged round + to the coefficients reproduces `x` — the combination of three iterated rounds + weighted by the certificate coefficients. -/ +lemma eq_sum_Q_smul {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ) + (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, ((192 : ℂ)⁻¹ * ∑ e, ((Q d e : ℤ) : ℂ) * c e) • T d := by + have h1 := hT.eq_sum_pow_boostAverageZ_smul c hx hw 1 + have h2 := hT.eq_sum_pow_boostAverageZ_smul c hx hw 2 + have h3 := hT.eq_sum_pow_boostAverageZ_smul c hx hw 3 + simp only [pow_one] at h1 + have key : (9 : ℂ) • x - (21 / 2 : ℂ) • x + (5 / 2 : ℂ) • x + = ∑ d, ((192 : ℂ)⁻¹ * ∑ e, ((Q d e : ℤ) : ℂ) * c e) • T d := by + nth_rewrite 1 [h3] + nth_rewrite 1 [h2] + nth_rewrite 1 [h1] + simp only [Finset.smul_sum, smul_smul] + rw [← Finset.sum_sub_distrib, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun d _ => ?_ + simp only [← sub_smul, ← add_smul] + congr 1 + have hQc : ∀ e, ((Q d e : ℤ) : ℂ) + = (((boostAverageZ ^ 3) d e : ℤ) : ℂ) + - 14 * (((boostAverageZ ^ 2) d e : ℤ) : ℂ) + + 40 * ((boostAverageZ d e : ℤ) : ℂ) := fun e => by + rw [Q_eq_poly] + push_cast [Matrix.sub_apply, Matrix.add_apply, Matrix.smul_apply, smul_eq_mul] + ring + have hsplit : ∑ e, ((Q d e : ℤ) : ℂ) * c e + = (∑ e, (((boostAverageZ ^ 3) d e : ℤ) : ℂ) * c e) + - 14 * (∑ e, (((boostAverageZ ^ 2) d e : ℤ) : ℂ) * c e) + + 40 * (∑ e, ((boostAverageZ d e : ℤ) : ℂ) * c e) := by + simp only [hQc, Finset.mul_sum, ← Finset.sum_sub_distrib, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun e _ => by ring + rw [hsplit] + field_simp + ring_nf + calc x = (9 : ℂ) • x - (21 / 2 : ℂ) • x + (5 / 2 : ℂ) • x := by module + _ = _ := key + +include hT in +/-- The projector round: an element of the span of the components which has boost + weight zero along all three axes is the corresponding multiple of the metric + contraction. -/ +lemma eq_smul_metricContraction {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ) + (hx : x = ∑ e, c e • T e) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ((4 : ℂ)⁻¹ * ∑ e, ((etaZ (e 0) (e 1) : ℤ) : ℂ) * c e) + • metricContraction (T := T) := by + rw [hT.eq_sum_Q_smul c hx hw, metricContraction, Finset.smul_sum] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [smul_smul] + congr 1 + have hP : ∀ e, ((Q d e : ℤ) : ℂ) + = 48 * ((etaZ (d 0) (d 1) : ℤ) : ℂ) * ((etaZ (e 0) (e 1) : ℤ) : ℂ) := fun e => by + rw [Q_explicit, Matrix.of_apply] + push_cast + ring + rw [show (∑ e, ((Q d e : ℤ) : ℂ) * c e) + = 48 * ((etaZ (d 0) (d 1) : ℤ) : ℂ) + * ∑ e, ((etaZ (e 0) (e 1) : ℤ) : ℂ) * c e from by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun e _ => by rw [hP e]; ring] + field_simp + ring + +/-! + +## F.4. The classification + +-/ + +include hT in +/-- The classification of the Lorentz invariants: every element of the span of the + components fixed by the Lorentz group is a scalar multiple of the metric + contraction. -/ +theorem exists_smul_metricContraction_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, x = a • metricContraction (T := T) := by + obtain ⟨c, hc⟩ := (hT.mem_span_iff x).1 hx + exact ⟨_, hT.eq_smul_metricContraction c hc + (mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv)⟩ + +/-! + +## G. The classification modulo a Lorentz-stable submodule + +A Lorentz-stable submodule can be divided out: the quotient representation carries the +images of the components as a bi-Lorentz tensor again, so the classification applies +verbatim in the quotient and lifts to a classification modulo the submodule. The +quotient representation itself is the one built in `IsQuadLorentz`. + +-/ + +include hT in +/-- The images of the components in the quotient by a Lorentz-stable submodule again + form a bi-Lorentz tensor. -/ +lemma isBiLorentz_quotRep (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + IsBiLorentz (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + (fun l => S.mkQ (T l)) where + repLorentz_T g l := by + rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The quotient map carries the metric contraction to the metric contraction of the + images. -/ +lemma mkQ_metricContraction (S : Submodule ℂ B) : + S.mkQ (metricContraction (T := T)) + = metricContraction (T := fun l => S.mkQ (T l)) := by + rw [metricContraction, metricContraction, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + +include hT in +/-- The classification of the Lorentz invariants modulo a stable submodule: an element + of the span of the components together with a Lorentz-stable submodule `S`, fixed by + the Lorentz group, is a multiple of the metric contraction up to an error in `S`. -/ +lemma exists_smul_metricContraction_of_invariant_subset {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, ∃ y ∈ S, x = a • metricContraction (T := T) + y := by + have hT' := hT.isBiLorentz_quotRep S hS + have hmk : S.mkQ x ∈ hT'.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hT'.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ g : SL(2,ℂ), + quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := by + intro g + rw [quotRep_mkQ, hinv g] + obtain ⟨a, hcomb⟩ := hT'.exists_smul_metricContraction_of_invariant hmk hinv' + rw [← mkQ_metricContraction] at hcomb + refine ⟨a, x - a • metricContraction (T := T), ?_, by abel⟩ + have hker : x - a • metricContraction (T := T) ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, hcomb, map_smul] + abel + rwa [Submodule.ker_mkQ] at hker + +end IsBiLorentz + +end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean new file mode 100644 index 000000000..dbace2ec6 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -0,0 +1,566 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Invariants.IsQuadLorentz +public import Physlib.Relativity.Fermions.Weyl.BoostWeight +/-! +# Lorentz invariants of a left-handed and a right-handed Weyl index + +`IsLeftRightWeyl repLorentz T` says that a family `T`, indexed by one left-handed and +one right-handed Weyl index and valued in a module `B` carrying a representation of +`SL(2,ℂ)`, transforms as a bispinor `T^{α α'}`: the left index by the matrix of +`SL(2,ℂ)` itself and the right index by its complex conjugate. + +The pair of a left-handed and a right-handed index carries the `(1/2, 1/2)` +representation, which is the four-vector representation. A single four-vector index has +no invariant contraction, and the main theorem `eq_zero_of_invariant` confirms this from +scratch on the spinor side: every Lorentz invariant in the span of the components is +zero. + +The proof follows `IsBiLorentz`, with the light-cone basis replaced by the Weyl weight +bases of section A. Along a spatial axis `i` the `SL(2,ℂ)` boost is the conjugate of +the diagonal `z`-boost by `rotationZToAxis i`, so the columns of that rotation are boost +eigenvectors of weight `±1`; the four products of a left and a right eigenvector then +carry the weights `2`, `0`, `0` and `-2`. Averaging the weight-zero projection over the +three axes gives a matrix `M` with `M ^ 2 = 2 M` and no eigenvalue `3`, so the quadratic +certificate `3 λ ^ 2 - 2 λ` in `M / 3` annihilates every invariant. + +The section headings tell the story: the Weyl weight bases along one axis (A), the +tensor of two of them and the span of the components (B, C), the weight grading of the +span (D), the weight-zero round and its average over the three axes (E), and the +quadratic certificate which kills every invariant (F), also modulo a Lorentz-stable +submodule (G). +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule + mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) + +/-! + +## A. The Weyl weight bases along a spatial axis + +Along the `z`-axis the `SL(2,ℂ)` boost is `diag (t, t⁻¹)`, so the standard Weyl basis +already diagonalises it, with the weights `weylWeight`. Along a general axis the boost +is the conjugate of the `z`-boost by `rotationZToAxis`, so the columns of that rotation +are the boost eigenvectors; they are recorded here cleared of their `√2` normalisation, +which makes no difference to an eigenvector. A right-handed index sees the complex +conjugate of the boost, so its weight basis is the entrywise conjugate. + +-/ + +/-- The axis-`i` Weyl weight basis of a left-handed index, written as coefficient + vectors on the standard Weyl basis. -/ +def weylCoeff (i : Fin 3) (κ α : Fin 2) : ℂ := + if i = 0 then (if κ = 0 then 1 else if α = 0 then -1 else 1) + else if i = 1 then (if κ = α then 1 else Complex.I) + else (if κ = α then 1 else 0) + +/-- The axis-`i` Weyl weight basis of a right-handed index: the entrywise conjugate of + the left-handed one. -/ +def weylCoeffC (i : Fin 3) (κ α : Fin 2) : ℂ := + if i = 0 then (if κ = 0 then 1 else if α = 0 then -1 else 1) + else if i = 1 then (if κ = α then 1 else -Complex.I) + else (if κ = α then 1 else 0) + +/-- The standard Weyl basis of a left-handed index written back in the axis-`i` weight + basis. -/ +noncomputable def weylCoeffInv (i : Fin 3) (α κ : Fin 2) : ℂ := + if i = 0 then (if κ = 0 then 2⁻¹ else if α = 0 then -2⁻¹ else 2⁻¹) + else if i = 1 then (if κ = α then 2⁻¹ else -(2⁻¹ * Complex.I)) + else (if κ = α then 1 else 0) + +/-- The standard Weyl basis of a right-handed index written back in the axis-`i` weight + basis. -/ +noncomputable def weylCoeffInvC (i : Fin 3) (α κ : Fin 2) : ℂ := + if i = 0 then (if κ = 0 then 2⁻¹ else if α = 0 then -2⁻¹ else 2⁻¹) + else if i = 1 then (if κ = α then 2⁻¹ else 2⁻¹ * Complex.I) + else (if κ = α then 1 else 0) + +/-- The left-handed weight basis is a basis: the two coefficient matrices are + inverse. -/ +lemma sum_weylCoeffInv_mul (i : Fin 3) (α β : Fin 2) : + ∑ κ, weylCoeffInv i α κ * weylCoeff i κ β = if α = β then 1 else 0 := by + fin_cases i <;> fin_cases α <;> fin_cases β <;> + simp [weylCoeff, weylCoeffInv, Fin.sum_univ_two] <;> + norm_num [Complex.ext_iff] + +/-- The right-handed weight basis is a basis: the two coefficient matrices are + inverse. -/ +lemma sum_weylCoeffInvC_mul (i : Fin 3) (α β : Fin 2) : + ∑ κ, weylCoeffInvC i α κ * weylCoeffC i κ β = if α = β then 1 else 0 := by + fin_cases i <;> fin_cases α <;> fin_cases β <;> + simp [weylCoeffC, weylCoeffInvC, Fin.sum_univ_two] <;> + norm_num [Complex.ext_iff] + +/-- The matrix of an axis boost is Hermitian, so conjugating an entry transposes it. -/ +lemma star_boostAxis_apply (i : Fin 3) (t : ℝ) (ht : t ≠ 0) (β α : Fin 2) : + star ((SL2C.boostAxis i t ht).1 β α) = (SL2C.boostAxis i t ht).1 α β := by + have h := SL2C.boostAxis_conjTranspose i t ht + have h2 := congrFun (congrFun h α) β + rwa [Matrix.conjTranspose_apply] at h2 + +/-- The left-handed weight basis diagonalises the axis-`i` boost, with the weights + `weylWeight`. -/ +lemma sum_boostAxis_weylCoeff (i : Fin 3) (κ β : Fin 2) {t : ℝ} (ht : t ≠ 0) : + ∑ α, (SL2C.boostAxis i t ht).1 β α * weylCoeff i κ α + = ((t : ℝ) : ℂ) ^ (weylWeight κ) * weylCoeff i κ β := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + fin_cases i <;> fin_cases κ <;> fin_cases β + all_goals simp [SL2C.boostAxis, weylCoeff, weylWeight, Fin.sum_univ_two] + all_goals try field_simp + all_goals try simp only [Complex.I_sq] + all_goals try ring + +/-- The right-handed weight basis diagonalises the conjugate of the axis-`i` boost, + with the weights `weylWeight`. -/ +lemma sum_boostAxis_weylCoeffC (i : Fin 3) (κ β : Fin 2) {t : ℝ} (ht : t ≠ 0) : + ∑ α, star ((SL2C.boostAxis i t ht).1 β α) * weylCoeffC i κ α + = ((t : ℝ) : ℂ) ^ (weylWeight κ) * weylCoeffC i κ β := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + simp only [star_boostAxis_apply] + fin_cases i <;> fin_cases κ <;> fin_cases β + all_goals simp [SL2C.boostAxis, weylCoeffC, weylWeight, Fin.sum_univ_two] + all_goals try field_simp + all_goals try simp only [Complex.I_sq] + all_goals try ring + +/-! + +## B. The weight basis of a left-right pair + +The two indices are graded independently, so the weight basis of the pair is the tensor +product of the two, and its weight is the sum of the two Weyl weights. + +-/ + +/-- The boost weight of a pair of Weyl weight indices: the sum of the two. -/ +def pairWeight (κ : Fin 2 × Fin 2) : ℤ := weylWeight κ.1 + weylWeight κ.2 + +/-- The pair weight takes the values `-2`, `0` and `2`. -/ +lemma pairWeight_mem (κ : Fin 2 × Fin 2) : pairWeight κ ∈ ({-2, 0, 2} : Finset ℤ) := by + revert κ + decide + +/-- The weight-zero pairs are the two mixed pairs. -/ +lemma sum_weightZeroFilter {M : Type*} [AddCommMonoid M] (f : Fin 2 × Fin 2 → M) : + ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), f κ + = f (0, 1) + f (1, 0) := by + rw [show (Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0)) + = {(0, 1), (1, 0)} from by decide, Finset.sum_insert (by decide), + Finset.sum_singleton] + +/-- The axis-`i` weight basis of a left-right pair of indices. -/ +def pairCoeff (i : Fin 3) (κ α : Fin 2 × Fin 2) : ℂ := + weylCoeff i κ.1 α.1 * weylCoeffC i κ.2 α.2 + +/-- The standard basis of a left-right pair written back in the axis-`i` weight + basis. -/ +noncomputable def pairCoeffInv (i : Fin 3) (α κ : Fin 2 × Fin 2) : ℂ := + weylCoeffInv i α.1 κ.1 * weylCoeffInvC i α.2 κ.2 + +/-- The pair weight basis is a basis: the two coefficient matrices are inverse. -/ +lemma sum_pairCoeffInv_mul (i : Fin 3) (α β : Fin 2 × Fin 2) : + ∑ κ : Fin 2 × Fin 2, pairCoeffInv i α κ * pairCoeff i κ β + = if α = β then 1 else 0 := by + have hfac : (∑ κ₁, weylCoeffInv i α.1 κ₁ * weylCoeff i κ₁ β.1) + * (∑ κ₂, weylCoeffInvC i α.2 κ₂ * weylCoeffC i κ₂ β.2) + = ∑ κ : Fin 2 × Fin 2, pairCoeffInv i α κ * pairCoeff i κ β := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun κ₁ _ => Finset.sum_congr rfl fun κ₂ _ => by + simp only [pairCoeff, pairCoeffInv] + ring + rw [← hfac, sum_weylCoeffInv_mul, sum_weylCoeffInvC_mul] + obtain ⟨α₁, α₂⟩ := α + obtain ⟨β₁, β₂⟩ := β + by_cases h1 : α₁ = β₁ <;> by_cases h2 : α₂ = β₂ <;> simp [h1, h2, Prod.mk.injEq] + +/-- The pair weight basis diagonalises the axis-`i` boost, with the weight + `pairWeight`. -/ +lemma sum_boostAxis_pairCoeff (i : Fin 3) (κ a : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : + ∑ l : Fin 2 × Fin 2, pairCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 * star ((SL2C.boostAxis i t ht).1 a.2 l.2)) + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * pairCoeff i κ a := by + have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht + have hfac : (∑ l₁, (SL2C.boostAxis i t ht).1 a.1 l₁ * weylCoeff i κ.1 l₁) + * (∑ l₂, star ((SL2C.boostAxis i t ht).1 a.2 l₂) * weylCoeffC i κ.2 l₂) + = ∑ l : Fin 2 × Fin 2, pairCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 + * star ((SL2C.boostAxis i t ht).1 a.2 l.2)) := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun l₁ _ => Finset.sum_congr rfl fun l₂ _ => by + simp only [pairCoeff] + ring + rw [← hfac, sum_boostAxis_weylCoeff i κ.1 a.1 ht, sum_boostAxis_weylCoeffC i κ.2 a.2 ht, + pairWeight, pairCoeff, zpow_add₀ htc] + ring + +/-! + +## C. Left-right bispinors and the span of their components + +-/ + +/-- A family `T` of elements of `B`, indexed by one left-handed and one right-handed + Weyl index, transforms as a bispinor `T^{α α'}` under the representation `repLorentz` + of `SL(2,ℂ)`. -/ +structure IsLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : Fin 2 × Fin 2 → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin 2 × Fin 2), + (g.1 a.1 l.1 * star (g.1 a.2 l.2)) • T a + +namespace IsLeftRightWeyl +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : Fin 2 × Fin 2 → B} + (hT : IsLeftRightWeyl B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsLeftRightWeyl B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- The span of the components is exactly the set of linear combinations of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : Fin 2 × Fin 2 → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : Fin 2 × Fin 2 → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq'] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## D. The weight grading of the span + +-/ + +/-- The axis-`i` weight component of `T` at the pair `κ` of Weyl weight indices. -/ +noncomputable def weightVec (hT : IsLeftRightWeyl B repLorentz T) (i : Fin 3) + (κ : Fin 2 × Fin 2) : B := + ∑ a : Fin 2 × Fin 2, pairCoeff i κ a • T a + +/-- Each weight component lies in the span of the components. -/ +lemma weightVec_mem_span (i : Fin 3) (κ : Fin 2 × Fin 2) : + hT.weightVec i κ ∈ hT.span := + sum_mem fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _)) + +/-- Each generator is recovered from the weight components along any axis. -/ +lemma eq_sum_weightVec (i : Fin 3) (α : Fin 2 × Fin 2) : + T α = ∑ κ : Fin 2 × Fin 2, pairCoeffInv i α κ • hT.weightVec i κ := by + calc T α = ∑ β : Fin 2 × Fin 2, + (∑ κ : Fin 2 × Fin 2, pairCoeffInv i α κ * pairCoeff i κ β) • T β := by + simp only [sum_pairCoeffInv_mul, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + _ = _ := by + simp only [weightVec, Finset.smul_sum, smul_smul, Finset.sum_smul] + rw [Finset.sum_comm] + +/-- The weight components along any axis span the same space as the components. -/ +lemma span_eq_weightVec (hT : IsLeftRightWeyl B repLorentz T) (i : Fin 3) : + hT.span = ⨆ κ, ℂ ∙ hT.weightVec i κ := by + rw [span] + refine le_antisymm (iSup_le fun α => ?_) (iSup_le fun κ => ?_) + · rw [Submodule.span_singleton_le_iff_mem, hT.eq_sum_weightVec i α] + exact sum_mem fun κ _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem κ (Submodule.mem_span_singleton_self _)) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.weightVec_mem_span i κ + +/-- The weight components are boost eigenvectors: along axis `i` the component at `κ` + has boost weight `pairWeight κ`. -/ +lemma weightVec_mem_boostWeightSubmodule (i : Fin 3) (κ : Fin 2 × Fin 2) : + hT.weightVec i κ ∈ boostWeightSubmodule repLorentz i (pairWeight κ) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hstep : ∀ l : Fin 2 × Fin 2, + pairCoeff i κ l • repLorentz (SL2C.boostAxis i t ht) (T l) + = ∑ a : Fin 2 × Fin 2, (pairCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 + * star ((SL2C.boostAxis i t ht).1 a.2 l.2))) • T a := by + intro l + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.boostAxis i t ht) (hT.weightVec i κ) + = ∑ l : Fin 2 × Fin 2, pairCoeff i κ l + • repLorentz (SL2C.boostAxis i t ht) (T l) := by + simp only [weightVec, map_sum, map_smul] + _ = ∑ a : Fin 2 × Fin 2, (∑ l : Fin 2 × Fin 2, pairCoeff i κ l + * ((SL2C.boostAxis i t ht).1 a.1 l.1 + * star ((SL2C.boostAxis i t ht).1 a.2 l.2))) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 2 × Fin 2, + (((t : ℝ) : ℂ) ^ (pairWeight κ) * pairCoeff i κ a) • T a := + Finset.sum_congr rfl fun a _ => by rw [sum_boostAxis_pairCoeff i κ a ht] + _ = (algebraMap ℝ ℂ) t ^ (pairWeight κ) • hT.weightVec i κ := by + rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, weightVec, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-- The axis-`i` weight-`m` component of the generator `T α`: the weight-`m` partial sum + of `eq_sum_weightVec`. -/ +noncomputable def monoComponent (i : Fin 3) (α : Fin 2 × Fin 2) (m : ℤ) : B := + ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = m), + pairCoeffInv i α κ • hT.weightVec i κ + +/-- The weight components are homogeneous of the stated weight. -/ +lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (α : Fin 2 × Fin 2) (m : ℤ) : + hT.monoComponent i α m ∈ boostWeightSubmodule repLorentz i m := by + refine sum_mem fun κ hκ => Submodule.smul_mem _ _ ?_ + exact (show pairWeight κ = m from (Finset.mem_filter.1 hκ).2) ▸ + hT.weightVec_mem_boostWeightSubmodule i κ + +/-- A component is the sum of its weight components over the three possible weights. -/ +lemma eq_sum_monoComponent_univ (i : Fin 3) (α : Fin 2 × Fin 2) : + T α = ∑ m ∈ ({-2, 0, 2} : Finset ℤ), hT.monoComponent i α m := by + rw [hT.eq_sum_weightVec i α] + exact (Finset.sum_fiberwise_of_maps_to (fun κ _ => pairWeight_mem κ) _).symm + +/-! + +## E. The weight-zero round and its average over the axes + +-/ + +/-- The matrix of the axis-`i` weight-zero projection in the `T`-basis: the coefficient + of `T β` in the re-expansion of `monoComponent i α 0` through the weight basis. -/ +noncomputable def weightZeroTransition (i : Fin 3) (β α : Fin 2 × Fin 2) : ℂ := + ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), + pairCoeffInv i α κ * pairCoeff i κ β + +/-- The weight-zero component re-expanded in the `T`-basis: `monoComponent i α 0` is the + `α`-th column of `weightZeroTransition` applied to the generators. -/ +lemma monoComponent_zero_eq (i : Fin 3) (α : Fin 2 × Fin 2) : + hT.monoComponent i α 0 + = ∑ β : Fin 2 × Fin 2, weightZeroTransition i β α • T β := by + rw [monoComponent] + simp only [weightVec, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [← Finset.sum_smul, weightZeroTransition] + +include hT in +/-- One round of the recursion along one axis: an element of weight zero along axis `i` + expanded in the generators re-expands with the weight-zero transition matrix applied + to its coefficients. -/ +lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} + (c : Fin 2 × Fin 2 → ℂ) (hx : x = ∑ α, c α • T α) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ β, (∑ α, weightZeroTransition i β α * c α) • T β := by + have hsum : x = ∑ m ∈ ({-2, 0, 2} : Finset ℤ), + ∑ α, c α • hT.monoComponent i α m := by + rw [hx] + calc ∑ α, c α • T α + = ∑ α, c α • ∑ m ∈ ({-2, 0, 2} : Finset ℤ), hT.monoComponent i α m := + Finset.sum_congr rfl fun α _ => by rw [← hT.eq_sum_monoComponent_univ i α] + _ = _ := by + simp only [Finset.smul_sum] + exact Finset.sum_comm + have hx0 : x = ∑ α, c α • hT.monoComponent i α 0 := + eq_component_zero_of_mem_boostWeightSubmodule + (w := fun m => ∑ α, c α • hT.monoComponent i α m) hw + (fun m _ => sum_mem fun α _ => Submodule.smul_mem _ _ + (hT.monoComponent_mem_boostWeightSubmodule i α m)) + (by decide) hsum + calc x = ∑ α, c α • hT.monoComponent i α 0 := hx0 + _ = ∑ α, c α • ∑ β, weightZeroTransition i β α • T β := + Finset.sum_congr rfl fun α _ => by rw [hT.monoComponent_zero_eq i α] + _ = ∑ β, (∑ α, weightZeroTransition i β α * c α) • T β := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [← Finset.sum_smul] + exact congrArg (· • T β) (Finset.sum_congr rfl fun α _ => mul_comm _ _) + +/-- The closed form of the summed weight-zero transition: twice the identity minus the + outer product of the two diagonal indicators. -/ +def transitionEntry (β α : Fin 2 × Fin 2) : ℂ := + 2 * (if β.1 = α.1 then 1 else 0) * (if β.2 = α.2 then 1 else 0) + - (if β.1 = β.2 then 1 else 0) * (if α.1 = α.2 then 1 else 0) + +/-- The sum over the three axes of the weight-zero transitions has the closed form + `transitionEntry`. -/ +lemma sum_weightZeroTransition_eq (β α : Fin 2 × Fin 2) : + ∑ i : Fin 3, weightZeroTransition i β α = transitionEntry β α := by + simp only [weightZeroTransition, sum_weightZeroFilter, Fin.sum_univ_three] + obtain ⟨β₁, β₂⟩ := β + obtain ⟨α₁, α₂⟩ := α + fin_cases β₁ <;> fin_cases β₂ <;> fin_cases α₁ <;> fin_cases α₂ <;> + simp [transitionEntry, pairCoeff, pairCoeffInv, weylCoeff, weylCoeffC, + weylCoeffInv, weylCoeffInvC] <;> + norm_num [Complex.ext_iff] + +include hT in +/-- One averaged round of the recursion: an element of weight zero along all three axes + re-expands with a third of the summed transition matrix applied to its + coefficients. -/ +lemma eq_sum_transitionEntry_smul {x : B} (c : Fin 2 × Fin 2 → ℂ) + (hx : x = ∑ α, c α • T α) + (hw : ∀ i : Fin 3, x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ β, ((3 : ℂ)⁻¹ * ∑ α, transitionEntry β α * c α) • T β := by + have hround : ∀ i : Fin 3, + x = ∑ β, (∑ α, weightZeroTransition i β α * c α) • T β := + fun i => hT.eq_sum_weightZeroTransition_smul i c hx (hw i) + have h3 : (3 : ℂ) • x = ∑ i : Fin 3, x := by + rw [Fin.sum_univ_three, show (3 : ℂ) = 1 + 1 + 1 from by norm_num, + add_smul, add_smul, one_smul] + calc x = (3 : ℂ)⁻¹ • ((3 : ℂ) • x) := by rw [smul_smul]; norm_num + _ = (3 : ℂ)⁻¹ • ∑ i : Fin 3, x := by rw [h3] + _ = (3 : ℂ)⁻¹ • ∑ i : Fin 3, ∑ β, + (∑ α, weightZeroTransition i β α * c α) • T β := + congrArg (fun y => (3 : ℂ)⁻¹ • y) (Finset.sum_congr rfl fun i _ => hround i) + _ = ∑ β, ((3 : ℂ)⁻¹ * ∑ α, transitionEntry β α * c α) • T β := by + rw [Finset.sum_comm, Finset.smul_sum] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [← Finset.sum_smul, smul_smul] + congr 1 + rw [show (∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α) + = ∑ α, transitionEntry β α * c α from by + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun α _ => by + rw [← Finset.sum_mul, sum_weightZeroTransition_eq]] + +/-! + +## F. The quadratic certificate and the classification + +The summed transition `M` satisfies `M ^ 2 = 2 M`, so a third of it has eigenvalues +`2/3` and `0` and never the eigenvalue `1` that an invariant would need. The +certificate `3 λ ^ 2 - 2 λ` therefore annihilates every invariant. + +-/ + +/-- The action of the summed transition matrix on a coefficient vector. -/ +noncomputable def applyTransition (c : Fin 2 × Fin 2 → ℂ) (β : Fin 2 × Fin 2) : ℂ := + ∑ α, transitionEntry β α * c α + +/-- The action of the summed transition matrix is homogeneous. -/ +lemma applyTransition_const_mul (k : ℂ) (c : Fin 2 × Fin 2 → ℂ) (β : Fin 2 × Fin 2) : + applyTransition (fun γ => k * c γ) β = k * applyTransition c β := by + simp only [applyTransition, Finset.mul_sum] + exact Finset.sum_congr rfl fun α _ => by ring + +/-- The summed transition matrix squares to twice itself. -/ +lemma sum_transitionEntry_mul (β α : Fin 2 × Fin 2) : + ∑ γ : Fin 2 × Fin 2, transitionEntry β γ * transitionEntry γ α + = 2 * transitionEntry β α := by + obtain ⟨β₁, β₂⟩ := β + obtain ⟨α₁, α₂⟩ := α + fin_cases β₁ <;> fin_cases β₂ <;> fin_cases α₁ <;> fin_cases α₂ <;> + simp [transitionEntry, Fintype.sum_prod_type, Fin.sum_univ_two] <;> norm_num + +/-- Two rounds of the summed transition are twice one round. -/ +lemma applyTransition_applyTransition (c : Fin 2 × Fin 2 → ℂ) (β : Fin 2 × Fin 2) : + applyTransition (applyTransition c) β = 2 * applyTransition c β := by + calc applyTransition (applyTransition c) β + = ∑ α, (∑ γ, transitionEntry β γ * transitionEntry γ α) * c α := by + simp only [applyTransition, Finset.mul_sum, Finset.sum_mul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun α _ => + Finset.sum_congr rfl fun γ _ => (mul_assoc _ _ _).symm + _ = ∑ α, (2 * transitionEntry β α) * c α := + Finset.sum_congr rfl fun α _ => by rw [sum_transitionEntry_mul] + _ = 2 * applyTransition c β := by + simp only [applyTransition, Finset.mul_sum] + exact Finset.sum_congr rfl fun α _ => by ring + +include hT in +/-- The classification of the Lorentz invariants: a left-handed and a right-handed Weyl + index carry the four-vector representation, which has no invariant contraction, so + every element of the span of the components fixed by the Lorentz group is zero. -/ +theorem eq_zero_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by + obtain ⟨c, hc⟩ := (hT.mem_span_iff x).1 hx + have hw := mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv + have h1 := hT.eq_sum_transitionEntry_smul c hc hw + have h2 := hT.eq_sum_transitionEntry_smul + (fun β => (3 : ℂ)⁻¹ * applyTransition c β) h1 hw + have h2' : x = ∑ β, ((9 : ℂ)⁻¹ * (2 * applyTransition c β)) • T β := by + rw [h2] + refine Finset.sum_congr rfl fun β _ => ?_ + congr 1 + rw [show (∑ α, transitionEntry β α * ((3 : ℂ)⁻¹ * applyTransition c α)) + = applyTransition (fun γ => (3 : ℂ)⁻¹ * applyTransition c γ) β from rfl, + applyTransition_const_mul, applyTransition_applyTransition] + ring + have h1' : x = ∑ β, ((3 : ℂ)⁻¹ * applyTransition c β) • T β := h1 + calc x = (3 : ℂ) • x - (2 : ℂ) • x := by module + _ = ∑ β, ((3 : ℂ) * ((9 : ℂ)⁻¹ * (2 * applyTransition c β)) + - (2 : ℂ) * ((3 : ℂ)⁻¹ * applyTransition c β)) • T β := by + nth_rewrite 1 [h2'] + nth_rewrite 1 [h1'] + simp only [Finset.smul_sum, smul_smul, ← Finset.sum_sub_distrib, ← sub_smul] + _ = 0 := by + refine Finset.sum_eq_zero fun β _ => ?_ + rw [show (3 : ℂ) * ((9 : ℂ)⁻¹ * (2 * applyTransition c β)) + - (2 : ℂ) * ((3 : ℂ)⁻¹ * applyTransition c β) = 0 from by ring, zero_smul] + +/-! + +## G. The classification modulo a Lorentz-stable submodule + +A Lorentz-stable submodule can be divided out: the quotient representation carries the +images of the components as a bispinor again, so the classification applies verbatim in +the quotient and lifts to a classification modulo the submodule. The quotient +representation itself is the one built in `IsQuadLorentz`. + +-/ + +include hT in +/-- The images of the components in the quotient by a Lorentz-stable submodule again + form a left-right bispinor. -/ +lemma isLeftRightWeyl_quotRep (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + IsLeftRightWeyl (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + (fun l => S.mkQ (T l)) where + repLorentz_T g l := by + rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +include hT in +/-- The classification of the Lorentz invariants modulo a stable submodule: an element + of the span of the components together with a Lorentz-stable submodule `S`, fixed by + the Lorentz group, already lies in `S`. -/ +lemma mem_of_invariant_of_mem_sup {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hT' := hT.isLeftRightWeyl_quotRep S hS + have hmk : S.mkQ x ∈ hT'.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hT'.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ g : SL(2,ℂ), + quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := by + intro g + rw [quotRep_mkQ, hinv g] + have hzero := hT'.eq_zero_of_invariant hmk hinv' + rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + +end IsLeftRightWeyl + +end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean new file mode 100644 index 000000000..7d64b4e80 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean @@ -0,0 +1,446 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Invariants.IsQuadLorentz +public meta import Mathlib.Data.Fintype.Sum +public meta import Mathlib.Data.Fintype.Pi +/-! +# Lorentz invariants of a single four-vector index + +`IsSingleLorentz repLorentz T` says that a family `T`, indexed by a single four-vector +index and valued in a module `B` carrying a representation of `SL(2,ℂ)`, transforms as +a vector `T^{μ}`. + +One index admits no invariant contraction at all: the metric needs two indices and the +Levi-Civita symbol four. The main theorem `eq_zero_of_invariant` says accordingly that +every Lorentz invariant in the span of the components is zero. + +The proof is the one-index shadow of `IsBiLorentz`, and is short enough to do without +the certificate polynomial that the two- and four-index cases need. Along a spatial +axis the four light-cone components carry boost weights `2`, `-2`, `0` and `0`, and the +two weight-zero ones are the directions transverse to both time and that axis. An +invariant has boost weight zero along every axis, so one round of the weight-zero +projection along axis `i` kills every coefficient outside the transverse pair of that +axis; running the three axes in turn leaves nothing, because no direction is transverse +to all three axes at once. + +The section headings tell the story: the light-cone basis along one axis (B) grades the +span by boost weight, the weight-zero projection of a generator is the transverse +projector (C), and chaining the three axes annihilates an invariant (D), which then +also holds modulo a Lorentz-stable submodule (E). +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open IsQuadLorentz (lightConeCoeffZ coe_lightConeCoeffZ lightConeCoeffInvQ + coe_lightConeCoeffInvQ lightConeCoeffInvZ coe_lightConeCoeffInvZ + eq_component_zero_of_mem_boostWeightSubmodule + mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) + +/-! + +## A. Single Lorentz tensors and the span of their components + +-/ + +/-- A family `T` of elements of `B`, indexed by a single four-vector index, transforms + as a vector `T^{μ}` under the representation `repLorentz` of `SL(2,ℂ)`. -/ +structure IsSingleLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin 1 → (Fin 1 ⊕ Fin 3)) → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin 1 → Fin 1 ⊕ Fin 3), + (∏ (i : Fin 1), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a + +namespace IsSingleLorentz +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 1 → (Fin 1 ⊕ Fin 3)) → B} + (hT : IsSingleLorentz B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsSingleLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- The span of the components is exactly the set of linear combinations of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 1 → (Fin 1 ⊕ Fin 3)) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 1 → (Fin 1 ⊕ Fin 3)) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq'] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. The light-cone basis along one axis + +Along a spatial axis `i` the coordinate components recombine into the light-cone +components `lightCone i c`, which span the same space and are homogeneous of boost +weight `∑ j, lightConeWeight (c j)`. + +-/ + +/-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ +noncomputable def lightCone (hT : IsSingleLorentz B repLorentz T) (i : Fin 3) + (c : Fin 1 → Fin 4) : B := + ∑ d : Fin 1 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • T d + +/-- Each light-cone component lies in the span of the coordinate components. -/ +lemma lightCone_mem_span (i : Fin 3) (c : Fin 1 → Fin 4) : hT.lightCone i c ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-- Each generator is recovered from the light-cone components along any axis. -/ +lemma eq_sum_lightCone (i : Fin 3) (d : Fin 1 → Fin 1 ⊕ Fin 3) : + T d = ∑ c : Fin 1 → Fin 4, + (∏ j, lightConeCoeffInv i (d j) (c j)) • hT.lightCone i c := by + calc T d = ∑ e : Fin 1 → Fin 1 ⊕ Fin 3, + (∑ c : Fin 1 → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j))) • T e := by + simp only [sum_prod_lightConeCoeffInv, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + _ = _ := by + simp only [lightCone, Finset.smul_sum, smul_smul, Finset.sum_smul] + rw [Finset.sum_comm] + +/-- The light-cone components along any axis span the same space as the components. -/ +lemma span_eq_lightCone (hT : IsSingleLorentz B repLorentz T) (i : Fin 3) : + hT.span = ⨆ c, ℂ ∙ hT.lightCone i c := by + rw [span] + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun c => ?_) + · rw [Submodule.span_singleton_le_iff_mem, hT.eq_sum_lightCone i d] + exact sum_mem fun c _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem c (Submodule.mem_span_singleton_self _)) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.lightCone_mem_span i c + +/-- The light-cone components are boost eigenvectors: along axis `i` the component at + `c` has boost weight the total light-cone weight of `c`. -/ +lemma lightCone_mem_boostWeightSubmodule (i : Fin 3) (c : Fin 1 → Fin 4) : + hT.lightCone i c ∈ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hstep : ∀ x : Fin 1 → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) + = ∑ a : Fin 1 → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + intro x + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) + = ∑ x : Fin 1 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) := by + simp only [lightCone, map_sum, map_smul] + _ = ∑ a : Fin 1 → Fin 1 ⊕ Fin 3, + (∑ x : Fin 1 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 1 → Fin 1 ⊕ Fin 3, (((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * + (∏ j, lightConeCoeff i (c j) (a j))) • T a := by + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + exact sum_prod_lightConeCoeff i c a ht + _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by + rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, lightCone, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-! + +## C. The weight-zero round along one axis + +## C.1. The boost-weight components of a generator + +Each generator `T e` is the sum of its boost-weight components `monoComponent i e m`, +and with one index the possible weights are just `-2`, `0` and `2`. + +-/ + +/-- The axis-`i` weight-`m` component of the generator `T e`: the weight-`m` partial + sum of `eq_sum_lightCone`. -/ +noncomputable def monoComponent (i : Fin 3) (e : Fin 1 → Fin 1 ⊕ Fin 3) (m : ℤ) : B := + ∑ c ∈ Finset.univ.filter (fun c : Fin 1 → Fin 4 => (∑ s, lightConeWeight (c s)) = m), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c + +/-- The weight components are homogeneous of the stated weight. -/ +lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (e : Fin 1 → Fin 1 ⊕ Fin 3) + (m : ℤ) : hT.monoComponent i e m ∈ boostWeightSubmodule repLorentz i m := by + refine sum_mem fun c hc => Submodule.smul_mem _ _ ?_ + exact (show (∑ s, lightConeWeight (c s)) = m from (Finset.mem_filter.1 hc).2) ▸ + hT.lightCone_mem_boostWeightSubmodule i c + +/-- The light-cone weight of a single slot is `-2`, `0` or `2`. -/ +lemma sum_lightConeWeight_mem (c : Fin 1 → Fin 4) : + (∑ s, lightConeWeight (c s)) ∈ ({-2, 0, 2} : Finset ℤ) := by + have hweight : ∀ κ : Fin 4, lightConeWeight κ ∈ ({-2, 0, 2} : Finset ℤ) := by decide + rw [Fin.sum_univ_one] + exact hweight (c 0) + +/-- A component is the sum of its weight components over the three possible weights. -/ +lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 1 → Fin 1 ⊕ Fin 3) : + T e = ∑ m ∈ ({-2, 0, 2} : Finset ℤ), hT.monoComponent i e m := by + rw [hT.eq_sum_lightCone i e] + exact (Finset.sum_fiberwise_of_maps_to (fun c _ => sum_lightConeWeight_mem c) _).symm + +/-! + +## C.2. The weight-zero transition matrix + +The matrix of the axis-`i` weight-zero projection in the `T`-basis, and its integer +mirror, whose closed form is the projector onto the two transverse directions. + +-/ + +/-- The matrix of the axis-`i` weight-zero projection in the `T`-basis: the coefficient + of `T d` in the re-expansion of `monoComponent i e 0` through the light-cone basis. -/ +def weightZeroTransition (i : Fin 3) (d e : Fin 1 → Fin 1 ⊕ Fin 3) : ℚ := + ∑ c ∈ Finset.univ.filter (fun c : Fin 1 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvQ i (e s) (c s) * (lightConeCoeffZ i (c s) (d s) : ℚ) + +/-- The weight-zero component re-expanded in the `T`-basis: `monoComponent i e 0` is the + `e`-th column of `weightZeroTransition` applied to the generators. -/ +lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 1 → Fin 1 ⊕ Fin 3) : + hT.monoComponent i e 0 + = ∑ d : Fin 1 → Fin 1 ⊕ Fin 3, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := by + rw [monoComponent] + simp only [lightCone, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [weightZeroTransition] + push_cast + simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] + +/-- Integer mirror of the weight-zero transition: twice its value. -/ +def weightZeroTransitionZ (i : Fin 3) (d e : Fin 1 → Fin 1 ⊕ Fin 3) : ℤ := + ∑ c ∈ Finset.univ.filter (fun c : Fin 1 → Fin 4 => (∑ s, lightConeWeight (c s)) = 0), + ∏ s, lightConeCoeffInvZ i (e s) (c s) * lightConeCoeffZ i (c s) (d s) + +/-- The integer mirror casts to twice the weight-zero transition. -/ +lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 1 → Fin 1 ⊕ Fin 3) : + ((weightZeroTransitionZ i d e : ℤ) : ℚ) = 2 * weightZeroTransition i d e := by + rw [weightZeroTransitionZ, weightZeroTransition] + push_cast + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + calc ∏ s, ((lightConeCoeffInvZ i (e s) (c s) : ℤ) : ℚ) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) + = ∏ s, 2 * (lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ)) := by + refine Finset.prod_congr rfl fun s _ => ?_ + rw [coe_lightConeCoeffInvZ] + ring + _ = 2 * ∏ s, lightConeCoeffInvQ i (e s) (c s) + * ((lightConeCoeffZ i (c s) (d s) : ℤ) : ℚ) := by + rw [Finset.prod_mul_distrib, Finset.prod_const] + norm_num [Finset.card_univ] + +/-- The closed form of the integer weight-zero transition: twice the projector onto the + two directions transverse to both the time direction and the axis `i`. -/ +lemma weightZeroTransitionZ_eq (i : Fin 3) (d e : Fin 1 → Fin 1 ⊕ Fin 3) : + weightZeroTransitionZ i d e + = if e 0 = d 0 ∧ (d 0 = Sum.inr (i + 1) ∨ d 0 = Sum.inr (i + 2)) then 2 else 0 := by + revert i + revert d e + decide + +/-- The closed form of the weight-zero transition: the projector onto the two + directions transverse to both the time direction and the axis `i`. -/ +lemma weightZeroTransition_eq (i : Fin 3) (d e : Fin 1 → Fin 1 ⊕ Fin 3) : + weightZeroTransition i d e + = if e 0 = d 0 ∧ (d 0 = Sum.inr (i + 1) ∨ d 0 = Sum.inr (i + 2)) then 1 else 0 := by + have h := coe_weightZeroTransitionZ i d e + rw [weightZeroTransitionZ_eq] at h + split_ifs at h ⊢ <;> push_cast at h <;> linarith + +/-! + +## C.3. The transverse support of one round + +-/ + +include hT in +/-- One round of the recursion along one axis: an element of weight zero along axis `i` + expanded in the generators re-expands with the weight-zero transition matrix applied + to its coefficients. -/ +lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} + (c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + have hsum : x = ∑ m ∈ ({-2, 0, 2} : Finset ℤ), + ∑ e, c e • hT.monoComponent i e m := by + rw [hx] + calc ∑ e, c e • T e + = ∑ e, c e • ∑ m ∈ ({-2, 0, 2} : Finset ℤ), hT.monoComponent i e m := + Finset.sum_congr rfl fun e _ => by rw [← hT.eq_sum_monoComponent_univ i e] + _ = _ := by + simp only [Finset.smul_sum] + exact Finset.sum_comm + have hx0 : x = ∑ e, c e • hT.monoComponent i e 0 := + eq_component_zero_of_mem_boostWeightSubmodule + (w := fun m => ∑ e, c e • hT.monoComponent i e m) hw + (fun m _ => sum_mem fun e _ => Submodule.smul_mem _ _ + (hT.monoComponent_mem_boostWeightSubmodule i e m)) + (by decide) hsum + calc x = ∑ e, c e • hT.monoComponent i e 0 := hx0 + _ = ∑ e, c e • ∑ d, ((weightZeroTransition i d e : ℚ) : ℂ) • T d := + Finset.sum_congr rfl fun e _ => by rw [hT.monoComponent_zero_eq i e] + _ = ∑ d, (∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e) • T d := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Finset.sum_smul] + congr 1 + exact Finset.sum_congr rfl fun e _ => mul_comm _ _ + +/-- The weight-zero transition acting on a coefficient vector keeps the coefficients at + the two directions transverse to the axis `i` and discards the rest. -/ +lemma sum_weightZeroTransition_mul (i : Fin 3) (d : Fin 1 → Fin 1 ⊕ Fin 3) + (c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ) : + ∑ e, ((weightZeroTransition i d e : ℚ) : ℂ) * c e + = if d 0 = Sum.inr (i + 1) ∨ d 0 = Sum.inr (i + 2) then c d else 0 := by + by_cases htr : d 0 = Sum.inr (i + 1) ∨ d 0 = Sum.inr (i + 2) + · rw [if_pos htr] + have hterm : ∀ e : Fin 1 → Fin 1 ⊕ Fin 3, + ((weightZeroTransition i d e : ℚ) : ℂ) * c e = if e = d then c e else 0 := by + intro e + rw [weightZeroTransition_eq] + by_cases he : e = d + · subst he + simp [htr] + · have h0 : e 0 ≠ d 0 := fun h => + he (funext fun j => by rw [Subsingleton.elim j 0]; exact h) + simp [h0, he] + simp only [hterm, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · rw [if_neg htr] + refine Finset.sum_eq_zero fun e _ => ?_ + rw [weightZeroTransition_eq, if_neg (fun h => htr h.2)] + simp + +include hT in +/-- One round in support form: an element of weight zero along axis `i` re-expands with + every coefficient outside the transverse pair of that axis set to zero. -/ +lemma eq_sum_transverse_smul (i : Fin 3) {x : B} + (c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ d, (if d 0 = Sum.inr (i + 1) ∨ d 0 = Sum.inr (i + 2) then c d else 0) • T d := by + rw [hT.eq_sum_weightZeroTransition_smul i c hx hw] + exact Finset.sum_congr rfl fun d _ => by rw [sum_weightZeroTransition_mul] + +/-! + +## D. The classification of the Lorentz invariants + +No direction is transverse to all three axes, so chaining the three rounds of section +C.3 annihilates every invariant. + +-/ + +/-- No four-vector direction is transverse to all three spatial axes at once. -/ +lemma not_transverse_all (μ : Fin 1 ⊕ Fin 3) : + ¬((μ = Sum.inr ((0 : Fin 3) + 1) ∨ μ = Sum.inr ((0 : Fin 3) + 2)) ∧ + (μ = Sum.inr ((1 : Fin 3) + 1) ∨ μ = Sum.inr ((1 : Fin 3) + 2)) ∧ + (μ = Sum.inr ((2 : Fin 3) + 1) ∨ μ = Sum.inr ((2 : Fin 3) + 2))) := by + revert μ + decide + +include hT in +/-- The classification of the Lorentz invariants: a single four-vector index carries no + invariant contraction, so every element of the span of the components fixed by the + Lorentz group is zero. -/ +theorem eq_zero_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by + obtain ⟨c, hc⟩ := (hT.mem_span_iff x).1 hx + have hw := mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv + have h0 := hT.eq_sum_transverse_smul 0 c hc (hw 0) + have h1 := hT.eq_sum_transverse_smul 1 + (fun d => if d 0 = Sum.inr ((0 : Fin 3) + 1) ∨ d 0 = Sum.inr ((0 : Fin 3) + 2) + then c d else 0) h0 (hw 1) + have h2 := hT.eq_sum_transverse_smul 2 + (fun d => if d 0 = Sum.inr ((1 : Fin 3) + 1) ∨ d 0 = Sum.inr ((1 : Fin 3) + 2) + then (if d 0 = Sum.inr ((0 : Fin 3) + 1) ∨ d 0 = Sum.inr ((0 : Fin 3) + 2) + then c d else 0) else 0) h1 (hw 2) + rw [h2] + refine Finset.sum_eq_zero fun d _ => ?_ + by_cases h2t : d 0 = Sum.inr ((2 : Fin 3) + 1) ∨ d 0 = Sum.inr ((2 : Fin 3) + 2) + · rw [if_pos h2t] + by_cases h1t : d 0 = Sum.inr ((1 : Fin 3) + 1) ∨ d 0 = Sum.inr ((1 : Fin 3) + 2) + · rw [if_pos h1t] + by_cases h0t : d 0 = Sum.inr ((0 : Fin 3) + 1) ∨ d 0 = Sum.inr ((0 : Fin 3) + 2) + · exact absurd ⟨h0t, h1t, h2t⟩ (not_transverse_all (d 0)) + · rw [if_neg h0t, zero_smul] + · rw [if_neg h1t, zero_smul] + · rw [if_neg h2t, zero_smul] + +/-! + +## E. The classification modulo a Lorentz-stable submodule + +A Lorentz-stable submodule can be divided out: the quotient representation carries the +images of the components as a single Lorentz tensor again, so the classification +applies verbatim in the quotient and lifts to a classification modulo the submodule. +The quotient representation itself is the one built in `IsQuadLorentz`. + +-/ + +include hT in +/-- The images of the components in the quotient by a Lorentz-stable submodule again + form a single Lorentz tensor. -/ +lemma isSingleLorentz_quotRep (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + IsSingleLorentz (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + (fun l => S.mkQ (T l)) where + repLorentz_T g l := by + rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +include hT in +/-- The classification of the Lorentz invariants modulo a stable submodule: an element + of the span of the components together with a Lorentz-stable submodule `S`, fixed by + the Lorentz group, already lies in `S`. -/ +lemma mem_of_invariant_of_mem_sup {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hT' := hT.isSingleLorentz_quotRep S hS + have hmk : S.mkQ x ∈ hT'.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hT'.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ g : SL(2,ℂ), + quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := by + intro g + rw [quotRep_mkQ, hinv g] + have hzero := hT'.eq_zero_of_invariant hmk hinv' + rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + +end IsSingleLorentz + +end Lorentz diff --git a/scripts/MetaPrograms/TODO_to_yml.lean b/scripts/MetaPrograms/TODO_to_yml.lean index bdb18f9d1..fc2539336 100644 --- a/scripts/MetaPrograms/TODO_to_yml.lean +++ b/scripts/MetaPrograms/TODO_to_yml.lean @@ -162,6 +162,9 @@ structure FullTODOInfo where fileName : Name name : Name line : Nat + /- The last line of the range of lines the item is about. `0`, and any value which is + not after `line`, means that the item is about the single line `line`. -/ + endLine : Nat := 0 isInformalDef : Bool isInformalLemma : Bool isSemiFormalResult : Bool @@ -169,14 +172,18 @@ structure FullTODOInfo where category : PhyslibCategory tag : String -/-- Converts a `FullTODOInfo` to an entry in a YAML code. -/ +/-- Converts a `FullTODOInfo` to an entry in a YAML code. + +The `endLine` key is written only for an item which is about a range of lines, so that +items about a single line keep exactly the entry they had before ranges existed. -/ def FullTODOInfo.toYAML (todo : FullTODOInfo) : MetaM String := do let content := todo.content let contentIndent := content.replace "\n" "\n " + let endLine := if todo.line < todo.endLine then s!"\n endLine: {todo.endLine}" else "" return s!" - file: {todo.fileName} - githubLink: {Name.toGitHubLink todo.fileName todo.line} - line: {todo.line} + githubLink: {Name.toGitHubLink todo.fileName todo.line todo.endLine} + line: {todo.line}{endLine} isInformalDef: {todo.isInformalDef} isInformalLemma: {todo.isInformalLemma} isSemiFormalResult: {todo.isSemiFormalResult} @@ -194,7 +201,8 @@ def FullTODOInfo.toYAML (todo : FullTODOInfo) : MetaM String := do -/ def FullTODOInfo.ofTODO (t : todoInfo) : FullTODOInfo := - {content := t.content, fileName := t.fileName, line := t.line, name := t.fileName, + {content := t.content, fileName := t.fileName, line := t.line, endLine := t.endLine, + name := t.fileName, isInformalDef := false, isInformalLemma := false, isSemiFormalResult := false, category := PhyslibCategory.ofFileName t.fileName, tag := t.tag} diff --git a/scripts/insert_todo.py b/scripts/insert_todo.py new file mode 100644 index 000000000..188c2f2f5 --- /dev/null +++ b/scripts/insert_todo.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python3 +"""Insert a `TODO` command below a line or a range of lines of a Lean file. + +The `TODO` command is a top-level Lean command, so it cannot be dropped just anywhere: +placing it inside a term, a tactic block, a docstring or a `/- -/` comment is a parse +error. This script finds the nearest safe top-level position below the target and puts +the command there, so an editor can offer "add a TODO about this block" on a selection. + +The command goes below the target rather than above it so that the lines it names stay +where they are: the `(lines := ...)` clause counts lines of the file the command is +written into, and inserting above the target would push the target down. + +Usage: + + python scripts/insert_todo.py FILE START [END] [--text "..."] + +`START` and `END` are 1-indexed line numbers of the code the note is about; `END` +defaults to `START`. With no `--text` an empty string is inserted, ready to type into. +The point between the quotes of the note is printed on stdout as `LINE:COLUMN`, and with +`--goto` the cursor of the running editor is put there. +""" + +from __future__ import annotations + +import argparse +import os +import re +import sys + +# A top-level command starts in column zero with one of these. Attributes and +# docstrings are top-level too: they begin the declaration they attach to, so a command +# may be inserted above them but not below them. +DECL_START = re.compile( + r"^(@\[|/--|/-!|private\b|protected\b|noncomputable\b|partial\b|unsafe\b|meta\b" + r"|public\b|def\b|abbrev\b|lemma\b|theorem\b|example\b|instance\b|structure\b" + r"|class\b|inductive\b|namespace\b|section\b|end\b|open\b|variable\b|universe\b" + r"|set_option\b|attribute\b|macro\b|syntax\b|notation\b|scoped\b|TODO\b)" +) + +# The header of a Lean file. Imports come before every command, so a `TODO` may not be +# inserted among them however close to the target they are. +HEADER = re.compile(r"^(module\b|prelude\b|((public|meta)\s+)*import\b)") + + +def block_comments(lines: list[str]) -> tuple[set[int], set[int]]: + """The 0-indexed lines that sit inside a `/- ... -/` block, and the lines on which a + `/-- ... -/` docstring closes. A docstring attaches to the declaration below it, + whereas a `/- -/` comment or a `/-! -/` module docstring stands on its own.""" + inside: set[int] = set() + doc_ends: set[int] = set() + depth = 0 + doc = False + for i, line in enumerate(lines): + if depth > 0: + inside.add(i) + else: + opener = line.find("/-") + doc = opener != -1 and line.startswith("/--", opener) + closes = line.count("-/") + was, depth = depth, max(0, depth + line.count("/-") - closes) + if doc and depth == 0 and (was > 0 or closes): + doc_ends.add(i) + return inside, doc_ends + + +def attaches_below(line: str, is_doc_end: bool) -> bool: + """Whether a line belongs to the declaration beneath it, so that nothing may be + inserted between the two: a docstring, an attribute, or a `... in` prefix.""" + stripped = line.strip() + return is_doc_end or stripped.startswith("@[") or stripped.endswith(" in") + + +def first_command_line(lines: list[str], inside: set[int]) -> int: + """The 0-indexed line before which no command may go, that is, the line after the + last `import` of the file.""" + last = -1 + for i, line in enumerate(lines): + if i in inside or not line.strip() or line.lstrip().startswith(("--", "/-")): + continue + if not HEADER.match(line): + break + last = i + return last + 1 + + +def safe_insertion_line(lines: list[str], target: int) -> int: + """A 0-indexed line below `target` (0-indexed) at which a command may be inserted. + + Walks down from the target to the first line that begins a top-level command, + refusing to stop among the imports, inside a block comment, or below an attribute or + docstring that attaches to the command found. The end of the file is always safe. + """ + inside, doc_ends = block_comments(lines) + for i in range(max(target + 1, first_command_line(lines, inside)), len(lines)): + if i in inside or not DECL_START.match(lines[i]): + continue + j = i - 1 + while j >= 0 and not lines[j].strip(): + j -= 1 + if j < 0 or not attaches_below(lines[j], j in doc_ends): + return i + return len(lines) + + +def render(start: int, end: int, text: str) -> str: + """The `TODO` command for a line or a range of lines.""" + escaped = text.replace("\\", "\\\\").replace('"', '\\"') + if end > start: + return f'TODO (lines := {start}-{end}) "{escaped}"\n' + return f'TODO (lines := {start}) "{escaped}"\n' + + +def goto(path: str, line: int, column: int, settle: float) -> None: + """Put the cursor at `line`, `column` of `path` in the running editor. + + The `vscode://` URL is handed straight to the window that is already open, which + costs a few tens of milliseconds. The `code` command would do the same thing by + starting a second copy of VS Code's command line interface, which on this machine + takes the better part of a second, most of the time this script spends. + + The pause first is not politeness: VS Code has to notice that the file changed on + disk and reload it, and a cursor placed before that lands in the old text and is + then dragged along by the insertion. `--settle-ms` tunes it. + """ + import subprocess + import time + from urllib.parse import quote + + time.sleep(settle) + url = f"vscode://file{quote(os.path.abspath(path))}:{line}:{column}" + opener = ["open", "-g", url] if sys.platform == "darwin" else ["xdg-open", url] + try: + failed = subprocess.run(opener, check=False).returncode != 0 + except OSError: + failed = True + if failed: + print(f"could not open {url}, cursor not moved", file=sys.stderr) + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("file") + ap.add_argument("start", type=int, help="first line the note is about (1-indexed)") + ap.add_argument("end", type=int, nargs="?", help="last line (defaults to start)") + ap.add_argument("--text", default="", help="the note itself") + ap.add_argument( + "--from-selection", + action="store_true", + help="read the editor selection from PHYSLIB_TODO_SELECTION and treat `start` " + "as the line the cursor is on, so that the range covers the whole selection", + ) + ap.add_argument( + "--goto", + action="store_true", + help="put the cursor of the running editor between the quotes of the note", + ) + ap.add_argument( + "--settle-ms", + type=int, + default=120, + help="with `--goto`, how long to let VS Code reload the file before the cursor " + "is moved into it (default 120)", + ) + ap.add_argument( + "--dry-run", action="store_true", help="print the result instead of writing" + ) + args = ap.parse_args() + + start = args.start + end = args.end if args.end is not None else start + + if args.from_selection: + # An editor gives the cursor line, which sits at one end of the selection, and + # the selected text, whose line count gives the other end. + selection = os.environ.get("PHYSLIB_TODO_SELECTION", "") + span = selection.count("\n") if selection else 0 + end = args.start + start = max(1, args.start - span) + if end < start: + start, end = end, start + + with open(args.file, encoding="utf-8") as fh: + lines = fh.readlines() + if not 1 <= start <= len(lines): + print(f"{args.file}: line {start} is out of range", file=sys.stderr) + return 1 + end = min(end, len(lines)) + if lines and not lines[-1].endswith("\n"): + lines[-1] += "\n" + + at = safe_insertion_line(lines, end - 1) + command = render(start, end, args.text) + # Keep the note a paragraph of its own, without doubling a blank line already there. + before = ["\n"] if at > 0 and lines[at - 1].strip() else [] + after = ["\n"] if at < len(lines) and lines[at].strip() else [] + + new = lines[:at] + before + [command] + after + lines[at:] + if args.dry_run: + sys.stdout.writelines(new) + return 0 + + with open(args.file, "w", encoding="utf-8") as fh: + fh.writelines(new) + + # The cursor belongs between the quotes, after any text already written there. + line = at + len(before) + 1 + column = command.rindex('"') + 1 + print(f"{line}:{column}") + if args.goto: + goto(args.file, line, column, args.settle_ms / 1000) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/todos.py b/scripts/todos.py index b557f9aaf..e021da465 100644 --- a/scripts/todos.py +++ b/scripts/todos.py @@ -30,7 +30,10 @@ # subproject with its own `--TODO` convention and is out of scope. EXCLUDE = re.compile(r"(^|/)(Meta|scripts)/") -CMD_START = re.compile(r'^\s*TODO\s+"') # TODO "..." (Lean command) +# TODO "..." and TODO (lines := 82) "..." / TODO (lines := 201-223) "..." (Lean command) +CMD_START = re.compile( + r'^\s*TODO\s*(?:\(\s*lines\s*:=\s*(\d+)\s*(?:-\s*(\d+)\s*)?\)\s*)?"' +) DOC_LINE = re.compile(r"^\s*/-!\s*TODO:\s*") # /-! TODO: ... -/ LOOSE = re.compile(r"todo", re.I) @@ -81,7 +84,11 @@ def read_blobs(repo, ref, paths): def parse_file(path, text): - """Yield (path, line, kind, content) items, coalescing wrapped ones.""" + """Yield (path, line, endline, kind, content) items, coalescing wrapped ones. + + `line`/`endline` are the lines of code the item is about: the range given by a + `(lines := ...)` clause, or the line the item is written on when it has none. + """ lines = text.splitlines() items, unclassified = [], [] i = 0 @@ -89,8 +96,11 @@ def parse_file(path, text): line = lines[i] # --- TODO "..." command; the string may span several lines ----------- - if CMD_START.match(line): + cmd = CMD_START.match(line) + if cmd: start = i + first = int(cmd.group(1)) if cmd.group(1) else start + 1 + last = int(cmd.group(2)) if cmd.group(2) else first body = line[line.index('"') + 1:] while '"' not in body.replace('\\"', ""): i += 1 @@ -99,7 +109,7 @@ def parse_file(path, text): body += " " + lines[i].strip() if '"' in body: body = body[:body.rindex('"')] - items.append((path, start + 1, "cmd", " ".join(body.split()))) + items.append((path, first, last, "cmd", " ".join(body.split()))) i += 1 continue @@ -114,7 +124,7 @@ def parse_file(path, text): break body += " " + nxt i += 1 - items.append((path, start + 1, "doc", " ".join(body.split()))) + items.append((path, start + 1, start + 1, "doc", " ".join(body.split()))) i += 1 continue @@ -165,8 +175,8 @@ def key(content): def group_by_dir(items): by_dir = {} - for path, line, _, content in sorted(items): - by_dir.setdefault(path.rsplit("/", 1)[0], []).append((path, line, content)) + for path, line, last, _, content in sorted(items): + by_dir.setdefault(path.rsplit("/", 1)[0], []).append((path, line, last, content)) return by_dir @@ -177,14 +187,14 @@ def emit_terminal(items, unknown, meta, plain): for directory, group in sorted(group_by_dir(items).items()): if plain: - for path, _, content in group: + for path, _, _, content in group: print(f"{path} | {content}") continue print(directory.replace("Physlib/", "")) - for path, line, content in group: + for path, line, last, content in group: name = path.rsplit("/", 1)[1] head, *rest = textwrap.wrap(content, 62) or [""] - label = f"{name}:{line}" + label = f"{name}:{line}-{last}" if last > line else f"{name}:{line}" print(f" {label:<34} {head}") for cont in rest: print(f" {'':<34} {cont}") @@ -215,10 +225,12 @@ def emit_md(items, meta, repo_url, link_ref): ] for directory, group in sorted(group_by_dir(items).items()): out += [f"### `{directory.replace('Physlib/', '')}`", ""] - for path, line, content in group: + for path, line, last, content in group: name = path.rsplit("/", 1)[1] - link = f"{repo_url}/blob/{link_ref}/{path}#L{line}" - out.append(f"- {md_escape(content)}  [`{name}:{line}`]({link})") + anchor = f"L{line}-L{last}" if last > line else f"L{line}" + label = f"{name}:{line}-{last}" if last > line else f"{name}:{line}" + link = f"{repo_url}/blob/{link_ref}/{path}#{anchor}" + out.append(f"- {md_escape(content)}  [`{label}`]({link})") out.append("") return "\n".join(out) From 90f08f640564309d72a655b221e4dd0d45125520 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 31 Aug 2026 09:45:08 +0100 Subject: [PATCH 243/254] feat: more code --- .gitignore | 1 - .vscode/tasks.json | 64 +++ .../Fermions/JetAlgebra/Basic.lean | 4 - .../GaugeAlgebra/JetGaugeAlgebra.lean | 5 +- .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 467 +++++++++++++++++- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 96 +++- .../GaugeGroup/Invariants/IsU1BiAdjoint.lean | 35 +- .../GaugeGroup/MaurerCartan.lean | 1 - .../GaugeGroup/MaurerCartan/Truncation.lean | 1 - .../IsHiggsSector/MassWeight/Basic.lean | 8 + .../StandardModel/JetAlgebra/JetDeriv.lean | 3 - .../Fermions/Weyl/DualLeftHanded.lean | 1 - TODO-howto.md | 60 +++ scripts/todos.py | 91 +++- 14 files changed, 767 insertions(+), 70 deletions(-) create mode 100644 .vscode/tasks.json create mode 100644 TODO-howto.md diff --git a/.gitignore b/.gitignore index 303b4807a..6947eb849 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /lake-packages/* .lake/* .DS_Store -.vscode # Python bytecode (e.g. from scripts/check_golf.py) __pycache__/ *.pyc diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..316bf3a41 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,64 @@ +{ + "version": "2.0.0", + "tasks": [ + { + // Select the lines a note is about, then run this task from the command + // palette (cmd + shift + p, "Tasks: Run Task"). The TODO command is written + // at the nearest safe top-level position below the selection, carrying the + // selected line range, and the cursor is put between its quotes ready to type. + // + // The tasks run the script as a process rather than through a shell: a shell task + // starts a login shell first, which costs longer than the whole job. + "label": "Physlib: TODO about selection", + "type": "process", + "command": "python3", + "args": [ + "scripts/insert_todo.py", + "${file}", + "${lineNumber}", + "--from-selection", + "--goto" + ], + "options": { + "cwd": "${workspaceFolder}", + "env": { + "PHYSLIB_TODO_SELECTION": "${selectedText}" + } + }, + "presentation": { + "reveal": "silent", + "panel": "shared", + "clear": true, + "echo": false, + "showReuseMessage": false + }, + "problemMatcher": [] + }, + { + // The same, for a note about the single line the cursor is on. + "label": "Physlib: TODO about this line", + "type": "process", + "command": "python3", + "args": ["scripts/insert_todo.py", "${file}", "${lineNumber}", "--goto"], + "options": { "cwd": "${workspaceFolder}" }, + "presentation": { + "reveal": "silent", + "panel": "shared", + "clear": true, + "echo": false, + "showReuseMessage": false + }, + "problemMatcher": [] + }, + { + // List the TODO items this branch introduces. + "label": "Physlib: list TODOs", + "type": "shell", + "command": "python3", + "args": ["scripts/todos.py"], + "options": { "cwd": "${workspaceFolder}" }, + "presentation": { "reveal": "always", "panel": "shared", "clear": true }, + "problemMatcher": [] + } + ] +} diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean index 1c66ecb01..f45156512 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean @@ -86,10 +86,6 @@ open TensorProduct -/ -TODO "Move FermionSpace to a seperate file by itself." - -TODO "For FermionSpace define the infinitismal action." - /-- The total target space of the Standard Model fermions: the direct sum of three generations each of the lepton doublet, the charged-lepton singlet, the quark doublet, and the up- and down-type quark singlets. The three generations of a species sit together, so diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index d5ee00574..f71698749 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -59,8 +59,7 @@ The derivative acts on brackets via the Leibniz rule: -/ @[expose] public section -TODO "Make the API here match what is in the doc-string." -TODO "Add discussion about the basis." + namespace StandardModel open MvPowerSeries Matrix @@ -724,8 +723,6 @@ lemma eval_iteratedDeriv_bracket_congr (w : Multiset (Fin 1 ⊕ Fin 3)) -/ -TODO "Define the basis of the jet gauge algebra." - /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean index ba105eec1..68896ffc3 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis +public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition /-! # Gauge tensors carrying two `su(2)` adjoint indices @@ -19,8 +20,9 @@ carries one `su(2)` adjoint index, so a product of two field strengths carries t the proposition here records how such a product transforms. Section A gives the proposition and the span of its components, section B the -orthogonality of the `su(2)` block of `adjointMatrix`, and section C the trace -contraction, which is the natural gauge invariant built from two adjoint indices. +orthogonality of the `su(2)` block of `adjointMatrix`, section C the trace contraction, +which is the natural gauge invariant built from two adjoint indices, and section D the +gauge weight decomposition of the span. -/ @[expose] public section @@ -45,6 +47,9 @@ structure IsSU2BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (a i))) (Sum.inr (Sum.inl (l i))) : ℝ) : ℂ)) • T a +TODO (lines := 43-47) "we could probably make this just be about + the action of the SU(2) factor." + namespace IsSU2BiAdjoint set_option linter.unusedVariables false @@ -164,9 +169,463 @@ lemma repGauge_traceContraction (hT : IsSU2BiAdjoint B repGauge T) (g : GaugeGro simp [apply_ite] rw [step, ← hT.traceContraction_eq_sum] +TODO (lines := 170-171) "Make a corresponding + file to this one for IsSU2BiFundamental." + +end IsSU2BiAdjoint + +/-! + +## D. The gauge weight decomposition of the span + +The Pauli basis vectors are not eigenvectors of the gauge torus, so the components `T d` +do not carry a definite gauge weight. The eigenvectors appear only after passing to the +weight basis of the `su(2)` adjoint: for the one root direction the two complex +combinations `x₁ ± i x₂` of the paired Pauli coordinates, and the Cartan direction as it +stands. That is three coordinate vectors, recorded in `wtCoeff`, with weights `wtWeight`. + +With two adjoint indices a weight vector is a product of two of these, contracted against +`T` by `biVec`, and its weight is the sum of the two individual weights. There are nine +such products, they span the same subspace as the components, and joining their lines one +weight at a time gives `gaugeWeightDecomposition`. + +The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an +algebra and records multiplicativity of the representation, neither of which +`IsSU2BiAdjoint` needs, so both appear as extra arguments here. + +-/ + +namespace IsSU2BiAdjoint + +set_option linter.unusedVariables false + +/-! + +## D.1. The weight basis of the `su(2)` adjoint + +-/ + +/-- The index type of the `su(2)` adjoint weight basis: the positive root, the negative + root and the Cartan direction. -/ +abbrev WeightIdx : Type := Fin 1 ⊕ Fin 1 ⊕ Fin 1 + +/-- The pair of Pauli indices making up the root direction of `su(2)`. -/ +def rootPair : Fin 3 × Fin 3 := (0, 1) + +/-- The gauge weight of the `su(2)` root direction. -/ +def rootWt : GaugeWeight := (0, 0, 2, 0) + +/-- The Pauli index of the Cartan direction of `su(2)`. -/ +def cartanId : Fin 3 := 2 + +/-- The root direction here is the `su(2)` root direction of the full gauge algebra. -/ +lemma rootIdx_three : + GaugeAlgebra.rootIdx 3 + = (Sum.inr (Sum.inl rootPair.1), Sum.inr (Sum.inl rootPair.2)) := rfl + +/-- The root weight here is the `su(2)` root weight of the full gauge algebra. -/ +lemma rootWeight_three : GaugeAlgebra.rootWeight 3 = rootWt := rfl + +/-- The Cartan direction here is the `su(2)` Cartan direction of the full gauge + algebra. -/ +lemma cartanIdx_two : GaugeAlgebra.cartanIdx 2 = Sum.inr (Sum.inl cartanId) := rfl + +/-- Every Pauli index is either one of the two members of the root pair or the Cartan + index. -/ +lemma eq_rootPair_or_cartanId (a : Fin 3) : + a = rootPair.1 ∨ a = rootPair.2 ∨ a = cartanId := by + revert a + decide + +/-! + +## D.2. The adjoint matrix of a torus generator in the weight basis + +-/ + +/-- A standard coordinate functional evaluated on a standard basis vector. -/ +lemma coord_stdBasis_apply (b a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + GaugeAlgebra.stdBasis.coord b (GaugeAlgebra.stdBasis a) = if a = b then 1 else 0 := by + simp [Module.Basis.coord_apply, Module.Basis.repr_self, Finsupp.single_apply] + +/-- The entries of the adjoint matrix, read off the dual adjoint action of the inverse on + the standard coordinate functionals. -/ +lemma dualMap_coord_apply (g : GaugeGroupI) (a b : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + (GaugeAlgebra.adjointMap g⁻¹).dualMap (GaugeAlgebra.stdBasis.coord b) + (GaugeAlgebra.stdBasis a) + = GaugeAlgebra.adjointMatrix g a b := by + have h1 : GaugeAlgebra.adjointMap g⁻¹ (GaugeAlgebra.stdBasis a) + = ∑ c, GaugeAlgebra.adjointMatrix g⁻¹ c a • GaugeAlgebra.stdBasis c := + GaugeAlgebra.adjoint_stdBasis g⁻¹ a + rw [LinearMap.dualMap_apply, h1, map_sum] + simp only [map_smul, smul_eq_mul, coord_stdBasis_apply, mul_ite, mul_one, mul_zero, + Finset.sum_ite_eq', Finset.mem_univ, if_true] + rw [GaugeAlgebra.adjointMatrix_inv_apply] + +/-- The first column of the root pair: the torus rotates the two columns of the adjoint + matrix belonging to the root direction into each other. -/ +lemma adjointMatrix_rootPair_fst (i : Fin 4) (a : Fin 3) : + GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inr (Sum.inl a)) + (Sum.inr (Sum.inl rootPair.1)) + = ((expI : ℂ) ^ GaugeWeight.coord rootWt i).re * + (if a = rootPair.1 then 1 else 0) + - ((expI : ℂ) ^ GaugeWeight.coord rootWt i).im * + (if a = rootPair.2 then 1 else 0) := by + obtain ⟨p1, -⟩ := GaugeAlgebra.dualMap_pair_of_entry + (GaugeAlgebra.coord_rootIdx_fst 3) + (GaugeAlgebra.coord_rootIdx_snd 3) + (GaugeAlgebra.rootEntry_adjointMap 3 i) + simp only [rootIdx_three, rootWeight_three] at p1 + have e := LinearMap.congr_fun p1 (GaugeAlgebra.stdBasis (Sum.inr (Sum.inl a))) + rw [dualMap_coord_apply] at e + rw [e] + simp [Finsupp.single_apply] + +/-- The second column of the root pair. -/ +lemma adjointMatrix_rootPair_snd (i : Fin 4) (a : Fin 3) : + GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inr (Sum.inl a)) + (Sum.inr (Sum.inl rootPair.2)) + = ((expI : ℂ) ^ GaugeWeight.coord rootWt i).im * + (if a = rootPair.1 then 1 else 0) + + ((expI : ℂ) ^ GaugeWeight.coord rootWt i).re * + (if a = rootPair.2 then 1 else 0) := by + obtain ⟨-, p2⟩ := GaugeAlgebra.dualMap_pair_of_entry + (GaugeAlgebra.coord_rootIdx_fst 3) + (GaugeAlgebra.coord_rootIdx_snd 3) + (GaugeAlgebra.rootEntry_adjointMap 3 i) + simp only [rootIdx_three, rootWeight_three] at p2 + have e := LinearMap.congr_fun p2 (GaugeAlgebra.stdBasis (Sum.inr (Sum.inl a))) + rw [dualMap_coord_apply] at e + rw [e] + simp [Finsupp.single_apply] + +/-- The torus fixes the Cartan column of the adjoint matrix. -/ +lemma adjointMatrix_cartanId (i : Fin 4) (a : Fin 3) : + GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inr (Sum.inl a)) + (Sum.inr (Sum.inl cartanId)) + = if a = cartanId then 1 else 0 := by + have p := GaugeAlgebra.dualMap_coord_cartanIdx 2 i + simp only [cartanIdx_two] at p + have e := LinearMap.congr_fun p (GaugeAlgebra.stdBasis (Sum.inr (Sum.inl a))) + rw [dualMap_coord_apply] at e + rw [e] + simp [Finsupp.single_apply] + +/-! + +## D.3. The weight vectors of one adjoint index + +-/ + +/-- The coordinates of the `su(2)` adjoint weight basis in the Pauli basis: for the root + the two combinations `x₁ ± i x₂` of the paired coordinates, and for the Cartan + direction the coordinate itself. -/ +noncomputable def wtCoeff : WeightIdx → Fin 3 → ℂ + | Sum.inl _, a => (if a = rootPair.1 then 1 else 0) + + Complex.I * (if a = rootPair.2 then 1 else 0) + | Sum.inr (Sum.inl _), a => (if a = rootPair.1 then 1 else 0) + - Complex.I * (if a = rootPair.2 then 1 else 0) + | Sum.inr (Sum.inr _), a => if a = cartanId then 1 else 0 + +/-- The gauge weight carried by each `su(2)` adjoint weight vector. -/ +def wtWeight : WeightIdx → GaugeWeight + | Sum.inl _ => rootWt + | Sum.inr (Sum.inl _) => -rootWt + | Sum.inr (Sum.inr _) => 0 + +/-- The coordinate vector of a single Pauli direction. -/ +def unitVec (a : Fin 3) : Fin 3 → ℂ := fun x => if x = a then 1 else 0 + +/-- The action of a gauge transformation on the coordinates of one `su(2)` adjoint + index. -/ +noncomputable def rowAct (g : GaugeGroupI) (c : Fin 3 → ℂ) : Fin 3 → ℂ := fun a => + ∑ x : Fin 3, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl a)) + (Sum.inr (Sum.inl x)) : ℝ) : ℂ) * c x + +/-- Collapsing a sum against the two Kronecker deltas of the root pair. -/ +lemma sum_mul_pair (f : Fin 3 → ℂ) (b₁ b₂ : Fin 3) (s : ℂ) : + ∑ x : Fin 3, f x * ((if x = b₁ then (1 : ℂ) else 0) + s * (if x = b₂ then 1 else 0)) + = f b₁ + s * f b₂ := by + have h : ∀ x : Fin 3, + f x * ((if x = b₁ then (1 : ℂ) else 0) + s * (if x = b₂ then 1 else 0)) + = (if x = b₁ then f x else 0) + (if x = b₂ then s * f x else 0) := by + intro x + split_ifs <;> ring + simp only [h] + simp [Finset.sum_add_distrib] + +/-- The complex pair identity behind the positive root eigenvector. -/ +lemma pair_add_eq (z u v : ℂ) : + (z.re : ℂ) * u - (z.im : ℂ) * v + Complex.I * ((z.im : ℂ) * u + (z.re : ℂ) * v) + = z * (u + Complex.I * v) := by + conv_rhs => rw [← Complex.re_add_im z] + ring_nf + rw [Complex.I_sq] + ring + +/-- The complex pair identity behind the negative root eigenvector. -/ +lemma pair_sub_eq (z u v : ℂ) : + (z.re : ℂ) * u - (z.im : ℂ) * v - Complex.I * ((z.im : ℂ) * u + (z.re : ℂ) * v) + = (starRingEnd ℂ) z * (u - Complex.I * v) := by + rw [show (starRingEnd ℂ) z = (z.re : ℂ) - (z.im : ℂ) * Complex.I by + rw [Complex.ext_iff]; simp] + ring_nf + rw [Complex.I_sq] + ring + +/-- Each weight vector of the `su(2)` adjoint is an eigenvector of every torus generator, + at the character of its weight. -/ +lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : + rowAct (gaugeTorusGen i) (wtCoeff k) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k) i) • wtCoeff k := by + funext a + match k with + | Sum.inl r => + show ∑ x : Fin 3, _ = _ + simp only [wtCoeff] + rw [sum_mul_pair, adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + simp only [wtCoeff, wtWeight, Pi.smul_apply, smul_eq_mul, + apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, + Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] + exact pair_add_eq _ _ _ + | Sum.inr (Sum.inl r) => + show ∑ x : Fin 3, _ = _ + have hneg : ∀ x : Fin 3, wtCoeff (Sum.inr (Sum.inl r)) x + = (if x = rootPair.1 then (1 : ℂ) else 0) + + (-Complex.I) * (if x = rootPair.2 then 1 else 0) := by + intro x + simp only [wtCoeff] + ring + simp only [hneg] + rw [sum_mul_pair, adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + simp only [wtWeight, Pi.smul_apply, smul_eq_mul, + apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, + Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] + rw [show ((expI : ℂ) ^ GaugeWeight.coord (-rootWt) i) + = (starRingEnd ℂ) ((expI : ℂ) ^ GaugeWeight.coord rootWt i) from by + rw [starRingEnd_expI_zpow, GaugeWeight.coord_neg]] + simp only [show ∀ x y : ℂ, x + -Complex.I * y = x - Complex.I * y from + fun x y => by ring] + exact pair_sub_eq _ _ _ + | Sum.inr (Sum.inr c) => + show ∑ x : Fin 3, _ = _ + simp only [wtCoeff, wtWeight, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', + Finset.mem_univ, if_true, adjointMatrix_cartanId, Pi.smul_apply, smul_eq_mul, + GaugeWeight.zero_coord, zpow_zero, + apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero] + +/-! + +## D.4. The bi-adjoint weight vectors and their span + +-/ + +section Decomposition + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 3) → B} + +/-- The element of `B` obtained by contracting the two `su(2)` adjoint indices of `T` + against a pair of coordinate vectors. -/ +noncomputable def biVec (hT : IsSU2BiAdjoint B repGauge T) (c₀ c₁ : Fin 3 → ℂ) : B := + ∑ d : Fin 2 → Fin 3, (c₀ (d 0) * c₁ (d 1)) • T d + +variable (hT : IsSU2BiAdjoint B repGauge T) + +/-- Contracting against a scaled coordinate vector on the left. -/ +lemma biVec_smul_left (z : ℂ) (c₀ c₁ : Fin 3 → ℂ) : + hT.biVec (z • c₀) c₁ = z • hT.biVec c₀ c₁ := by + simp only [biVec, Finset.smul_sum, Pi.smul_apply, smul_eq_mul, smul_smul, mul_assoc] + +/-- Contracting against a scaled coordinate vector on the right. -/ +lemma biVec_smul_right (z : ℂ) (c₀ c₁ : Fin 3 → ℂ) : + hT.biVec c₀ (z • c₁) = z • hT.biVec c₀ c₁ := by + simp only [biVec, Finset.smul_sum, Pi.smul_apply, smul_eq_mul, smul_smul] + exact Finset.sum_congr rfl fun d _ => by ring_nf + +/-- Contracting against a sum of coordinate vectors on the left. -/ +lemma biVec_add_left (c₀ c₀' c₁ : Fin 3 → ℂ) : + hT.biVec (c₀ + c₀') c₁ = hT.biVec c₀ c₁ + hT.biVec c₀' c₁ := by + simp only [biVec, Pi.add_apply, add_mul, add_smul, Finset.sum_add_distrib] + +/-- Contracting against a difference of coordinate vectors on the left. -/ +lemma biVec_sub_left (c₀ c₀' c₁ : Fin 3 → ℂ) : + hT.biVec (c₀ - c₀') c₁ = hT.biVec c₀ c₁ - hT.biVec c₀' c₁ := by + simp only [biVec, Pi.sub_apply, sub_mul, sub_smul, Finset.sum_sub_distrib] + +/-- Contracting against a sum of coordinate vectors on the right. -/ +lemma biVec_add_right (c₀ c₁ c₁' : Fin 3 → ℂ) : + hT.biVec c₀ (c₁ + c₁') = hT.biVec c₀ c₁ + hT.biVec c₀ c₁' := by + simp only [biVec, Pi.add_apply, mul_add, add_smul, Finset.sum_add_distrib] + +/-- Contracting against a difference of coordinate vectors on the right. -/ +lemma biVec_sub_right (c₀ c₁ c₁' : Fin 3 → ℂ) : + hT.biVec c₀ (c₁ - c₁') = hT.biVec c₀ c₁ - hT.biVec c₀ c₁' := by + simp only [biVec, Pi.sub_apply, mul_sub, sub_smul, Finset.sum_sub_distrib] + +/-- Contracting against two single Pauli directions returns a component of `T`. -/ +lemma biVec_unitVec (a b : Fin 3) : hT.biVec (unitVec a) (unitVec b) = T ![a, b] := by + rw [biVec, sum_pi_two] + simp [unitVec, ite_smul] + +/-- Every bi-adjoint weight vector transforms by the product of the two characters. -/ +lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 3 → ℂ) : + repGauge g (hT.biVec c₀ c₁) = hT.biVec (rowAct g c₀) (rowAct g c₁) := by + have step : ∀ d : Fin 2 → Fin 3, repGauge g ((c₀ (d 0) * c₁ (d 1)) • T d) + = ∑ a : Fin 2 → Fin 3, + ((c₀ (d 0) * c₁ (d 1)) * + (((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (a 0))) + (Sum.inr (Sum.inl (d 0))) : ℝ) : ℂ) * + ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (a 1))) + (Sum.inr (Sum.inl (d 1))) : ℝ) : ℂ))) + • T a := by + intro d + rw [map_smul, hT.repGauge_T g d, Finset.smul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [smul_smul, Fin.prod_univ_two] + simp only [biVec, rowAct] + rw [map_sum] + simp only [step] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [Finset.sum_mul_sum] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by ring + +/-- The bi-adjoint weight vectors are simultaneous eigenvectors of the gauge torus, + at the character of the sum of the two individual weights. -/ +lemma repGauge_biVec_wtCoeff (k₀ k₁ : WeightIdx) (i : Fin 4) : + repGauge (gaugeTorusGen i) (hT.biVec (wtCoeff k₀) (wtCoeff k₁)) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k₀ + wtWeight k₁) i) + • hT.biVec (wtCoeff k₀) (wtCoeff k₁) := by + rw [hT.repGauge_biVec, rowAct_wtCoeff, rowAct_wtCoeff, hT.biVec_smul_left, + hT.biVec_smul_right, smul_smul, GaugeWeight.coord_add, + zpow_add₀ expI_ne_zero] + +/-- The join of the lines spanned by the bi-adjoint weight vectors. -/ +noncomputable def wtSpan (hT : IsSU2BiAdjoint B repGauge T) : Submodule ℂ B := + ⨆ k : WeightIdx × WeightIdx, ℂ ∙ hT.biVec (wtCoeff k.1) (wtCoeff k.2) + +/-- The Pauli coordinate vector of the first member of the root pair, in the weight + basis. -/ +lemma unitVec_rootPair_fst : + unitVec rootPair.1 + = (2 : ℂ)⁻¹ • (wtCoeff (Sum.inl 0) + wtCoeff (Sum.inr (Sum.inl 0))) := by + funext x + simp only [unitVec, wtCoeff, Pi.add_apply, Pi.smul_apply, smul_eq_mul] + ring + +/-- The Pauli coordinate vector of the second member of the root pair, in the weight + basis. -/ +lemma unitVec_rootPair_snd : + unitVec rootPair.2 + = (-(Complex.I / 2)) • (wtCoeff (Sum.inl 0) - wtCoeff (Sum.inr (Sum.inl 0))) := by + funext x + simp only [unitVec, wtCoeff, Pi.sub_apply, Pi.smul_apply, smul_eq_mul] + ring_nf + rw [Complex.I_sq] + ring + +/-- The Cartan direction is already a weight vector. -/ +lemma unitVec_cartanId : unitVec cartanId = wtCoeff (Sum.inr (Sum.inr 0)) := rfl + +/-- Contracting a weight vector against a single Pauli direction stays in the join of the + weight lines. -/ +lemma biVec_wtCoeff_unitVec_mem (k : WeightIdx) (b : Fin 3) : + hT.biVec (wtCoeff k) (unitVec b) ∈ hT.wtSpan := by + have hgen : ∀ k' : WeightIdx, hT.biVec (wtCoeff k) (wtCoeff k') ∈ hT.wtSpan := + fun k' => Submodule.mem_iSup_of_mem (k, k') (Submodule.mem_span_singleton_self _) + rcases eq_rootPair_or_cartanId b with rfl | rfl | rfl + · rw [unitVec_rootPair_fst, hT.biVec_smul_right, hT.biVec_add_right] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ (hgen _) (hgen _)) + · rw [unitVec_rootPair_snd, hT.biVec_smul_right, hT.biVec_sub_right] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ (hgen _) (hgen _)) + · rw [unitVec_cartanId] + exact hgen _ + +/-- Every component of `T` lies in the join of the weight lines. -/ +lemma biVec_unitVec_mem (a b : Fin 3) : + hT.biVec (unitVec a) (unitVec b) ∈ hT.wtSpan := by + rcases eq_rootPair_or_cartanId a with rfl | rfl | rfl + · rw [unitVec_rootPair_fst, hT.biVec_smul_left, hT.biVec_add_left] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ + (hT.biVec_wtCoeff_unitVec_mem _ _) (hT.biVec_wtCoeff_unitVec_mem _ _)) + · rw [unitVec_rootPair_snd, hT.biVec_smul_left, hT.biVec_sub_left] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ + (hT.biVec_wtCoeff_unitVec_mem _ _) (hT.biVec_wtCoeff_unitVec_mem _ _)) + · rw [unitVec_cartanId] + exact hT.biVec_wtCoeff_unitVec_mem _ _ + +/-- The weight vectors span the components. The change of basis from the Pauli basis + to the weight basis is invertible, so nothing is lost. -/ +lemma span_eq_wtSpan : hT.span = hT.wtSpan := by + refine le_antisymm (iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr ?_) + (iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).mpr ?_) + · have hd : T d = T ![d 0, d 1] := by + congr 1 + funext j + fin_cases j <;> simp + rw [hd, ← hT.biVec_unitVec] + exact hT.biVec_unitVec_mem _ _ + · rw [span, biVec] + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## D.5. The decomposition + +-/ -TODO (lines := 166-167) "Give the gauge weight decomposition of - `Span` in the SU(2) case." +/-- The gauge weight decomposition of the span of a bi-adjoint `su(2)` family. The + span is the join of the lines through the nine products of weight vectors, and each of + those carries the sum of the two weights. -/ +@[implicit_reducible] +noncomputable def gaugeWeightDecomposition (hT : IsSU2BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hmul fun k : WeightIdx × WeightIdx => + GaugeWeightDecomposition.spanSingleton hmul + (hT.biVec (wtCoeff k.1) (wtCoeff k.2)) (wtWeight k.1 + wtWeight k.2) + (hT.repGauge_biVec_wtCoeff k.1 k.2)) + _ hT.span_eq_wtSpan + +/-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through + those products of weight vectors whose weights sum to `w`. -/ +lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : + (hT.gaugeWeightDecomposition hmul).piece w + = ⨆ k : WeightIdx × WeightIdx, + (if w = wtWeight k.1 + wtWeight k.2 then + ℂ ∙ hT.biVec (wtCoeff k.1) (wtCoeff k.2) else ⊥) := rfl + +/-- The support of the decomposition, before evaluation. -/ +lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = Finset.univ.biUnion fun k : WeightIdx × WeightIdx => + ({wtWeight k.1 + wtWeight k.2} : Finset GaugeWeight) := rfl + +/-- The gauge weights carried by a bi-adjoint `su(2)` family: the five weights of the + tensor square of the `su(2)` adjoint. Every one of them has vanishing colour and + hypercharge, since the family carries weak isospin only. -/ +lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = {((0, 0, 0, 0) : GaugeWeight), (0, 0, 4, 0), (0, 0, 2, 0), (0, 0, -2, 0), + (0, 0, -4, 0)} := by + rw [hT.gaugeWeightDecomposition_supp_eq hmul] + decide + +/-- The trace contraction lies in the zero-weight piece. It is gauge invariant, so in + particular the torus fixes it. -/ +lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : + hT.traceContraction ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ hT.traceContraction_mem_span + hT.repGauge_traceContraction + +end Decomposition end IsSU2BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 0c2a710cf..3e28f1727 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -385,10 +385,11 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : funext a match k with | Sum.inl r => - show ∑ x : Fin 8, _ = _ - rw [show (fun x => wtCoeff (Sum.inl r) x) = fun x => - (if x = (rootPair r).1 then (1 : ℂ) else 0) - + Complex.I * (if x = (rootPair r).2 then 1 else 0) from rfl] + have hw : ∀ x : Fin 8, wtCoeff (Sum.inl r) x + = (if x = (rootPair r).1 then (1 : ℂ) else 0) + + Complex.I * (if x = (rootPair r).2 then 1 else 0) := fun _ => rfl + show ∑ x : Fin 8, _ * wtCoeff (Sum.inl r) x = _ + simp only [hw] rw [sum_mul_pair] simp only [adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, @@ -397,11 +398,15 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : rw [pair_add_eq] rfl | Sum.inr (Sum.inl r) => - show ∑ x : Fin 8, _ = _ - rw [show (fun x => wtCoeff (Sum.inr (Sum.inl r)) x) = fun x => - (if x = (rootPair r).1 then (1 : ℂ) else 0) - + (-Complex.I) * (if x = (rootPair r).2 then 1 else 0) from by - funext x; show _ = _; ring] + have hw : ∀ x : Fin 8, wtCoeff (Sum.inr (Sum.inl r)) x + = (if x = (rootPair r).1 then (1 : ℂ) else 0) + + (-Complex.I) * (if x = (rootPair r).2 then 1 else 0) := by + intro x + show (if x = (rootPair r).1 then (1 : ℂ) else 0) + - Complex.I * (if x = (rootPair r).2 then 1 else 0) = _ + ring + show ∑ x : Fin 8, _ * wtCoeff (Sum.inr (Sum.inl r)) x = _ + simp only [hw] rw [sum_mul_pair] simp only [adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, @@ -418,17 +423,17 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : show _ = _ * wtCoeff (Sum.inr (Sum.inl r)) a rfl | Sum.inr (Sum.inr c) => - show ∑ x : Fin 8, _ = _ - have hz : ((expI : ℂ) ^ GaugeWeight.coord (wtWeight (Sum.inr (Sum.inr c) : WeightIdx)) i) - = 1 := by + have hw : ∀ x : Fin 8, wtCoeff (Sum.inr (Sum.inr c)) x + = if x = cartanId c then (1 : ℂ) else 0 := fun _ => rfl + have hz : ((expI : ℂ) ^ GaugeWeight.coord + (wtWeight (Sum.inr (Sum.inr c) : WeightIdx)) i) = 1 := by show ((expI : ℂ) ^ GaugeWeight.coord (0 : GaugeWeight) i) = 1 simp + show ∑ x : Fin 8, _ * wtCoeff (Sum.inr (Sum.inr c)) x = _ rw [hz] - simp only [wtCoeff, adjointMatrix_cartanId, Pi.smul_apply, smul_eq_mul, one_mul] + simp only [hw, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', Finset.mem_univ, + if_true, adjointMatrix_cartanId, one_smul] simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero] - simp - -TODO (lines := 379-430) "Fix the errors within these lemmas." /-! @@ -633,8 +638,63 @@ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : (3, -3, 0, 0), (2, 2, 0, 0), (0, 3, 0, 0), (-2, 4, 0, 0), (-3, 3, 0, 0), (-4, 2, 0, 0), (-3, 0, 0, 0), (-2, -2, 0, 0), (0, -3, 0, 0), (2, -4, 0, 0)} := by rw [hT.gaugeWeightDecomposition_supp_eq hmul] + decide +kernel + +/-! + +## D.6. The zero-weight piece + +A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight +piece, which makes that piece worth describing explicitly. A product of two weight vectors +has weight zero exactly when the two weights cancel: a root against its negative, in +either order, or any two Cartan directions. That is ten lines, the multiplicity of the +zero weight in the tensor square of the `su(3)` adjoint. + +-/ + +/-- Two `su(3)` adjoint weight vectors have cancelling weights precisely when they are a + root and its negative, in either order, or two Cartan directions. -/ +lemma wtWeight_add_eq_zero_iff (k : WeightIdx × WeightIdx) : + wtWeight k.1 + wtWeight k.2 = 0 + ↔ (∃ r : Fin 3, k = (Sum.inl r, Sum.inr (Sum.inl r))) + ∨ (∃ r : Fin 3, k = (Sum.inr (Sum.inl r), Sum.inl r)) + ∨ ∃ c₀ c₁ : Fin 2, k = (Sum.inr (Sum.inr c₀), Sum.inr (Sum.inr c₁)) := by + revert k decide +/-- The line through a product of two weight vectors whose weights cancel lies in the + zero-weight piece. -/ +lemma span_biVec_le_piece_zero (hmul : IsMulRep repGauge) {k₀ k₁ : WeightIdx} + (h : wtWeight k₀ + wtWeight k₁ = 0) : + ℂ ∙ hT.biVec (wtCoeff k₀) (wtCoeff k₁) + ≤ (hT.gaugeWeightDecomposition hmul).piece 0 := by + rw [hT.gaugeWeightDecomposition_piece hmul] + exact le_iSup_of_le (k₀, k₁) (le_of_eq (if_pos h.symm).symm) + +/-- The zero-weight piece of the gauge weight decomposition, explicitly: the join of the + ten lines through the products of two weight vectors of opposite weight, one for each + root against its negative in either order and one for each pair of Cartan directions. -/ +lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).piece 0 + = (⨆ r : Fin 3, ℂ ∙ hT.biVec (wtCoeff (Sum.inl r)) (wtCoeff (Sum.inr (Sum.inl r)))) + ⊔ (⨆ r : Fin 3, ℂ ∙ hT.biVec (wtCoeff (Sum.inr (Sum.inl r))) (wtCoeff (Sum.inl r))) + ⊔ ⨆ c₀ : Fin 2, ⨆ c₁ : Fin 2, ℂ ∙ hT.biVec (wtCoeff (Sum.inr (Sum.inr c₀))) + (wtCoeff (Sum.inr (Sum.inr c₁))) := by + refine le_antisymm ?_ (sup_le (sup_le (iSup_le fun r => ?_) (iSup_le fun r => ?_)) + (iSup_le fun c₀ => iSup_le fun c₁ => ?_)) + · rw [hT.gaugeWeightDecomposition_piece hmul] + refine iSup_le fun k => ?_ + split_ifs with hk + · rcases (wtWeight_add_eq_zero_iff k).1 hk.symm with + ⟨r, rfl⟩ | ⟨r, rfl⟩ | ⟨c₀, c₁, rfl⟩ + · exact le_sup_of_le_left (le_sup_of_le_left (le_iSup_of_le r le_rfl)) + · exact le_sup_of_le_left (le_sup_of_le_right (le_iSup_of_le r le_rfl)) + · exact le_sup_of_le_right (le_iSup_of_le c₀ (le_iSup_of_le c₁ le_rfl)) + · exact bot_le + · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) + · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) + · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) + /-- **The trace contraction lies in the zero-weight piece.** It is gauge invariant, so in particular the torus fixes it. -/ lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : @@ -642,10 +702,6 @@ lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : GaugeWeightDecomposition.mem_zero_of_invariant _ hT.traceContraction_mem_span hT.repGauge_traceContraction - -TODO (lines := 640-641) "Give the - expclit form of the zero peice of the decomposition." - end Decomposition end IsSU3BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean index 7e69ec6af..f27ee4b27 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean @@ -21,8 +21,9 @@ one dimensional and the adjoint action of the gauge group on it is trivial, so t proposition says that the components of `T` are already gauge invariant. Section A gives the proposition and the span of its components, section B the -orthogonality of the `u(1)` block of `adjointMatrix`, and section C the trace -contraction, which is the natural gauge invariant built from two adjoint indices. +orthogonality of the `u(1)` block of `adjointMatrix`, section C the trace +contraction, which is the natural gauge invariant built from two adjoint indices, and +section D the gauge invariance of every element of the span. -/ @[expose] public section @@ -162,9 +163,33 @@ lemma repGauge_traceContraction (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGrou simp [apply_ite] rw [step, ← hT.traceContraction_eq_sum] -TODO (lines := 164-165) "Add here the - lemma that the every element of `span` is invariant under the gauge group - action." +/-! + +## D. Gauge invariance of the whole span + +The `u(1)` adjoint index takes a single value and the gauge group acts trivially on it, +so every component of `T` is itself gauge invariant, and hence so is every linear +combination of the components. + +-/ + +/-- Every component of a bi-adjoint `u(1)` family is gauge invariant. -/ +lemma repGauge_T_self (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGroupI) + (l : Fin 2 → Fin 1) : repGauge g (T l) = T l := by + rw [hT.repGauge_T g l, Fintype.sum_unique, + Subsingleton.elim (default : Fin 2 → Fin 1) l] + simp only [adjointMatrix_u1, Complex.ofReal_one, Finset.prod_const_one, one_smul] + +/-- Every element of the span of the components of a bi-adjoint `u(1)` family is gauge + invariant. -/ +lemma repGauge_of_mem_span (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGroupI) {x : B} + (hx : x ∈ hT.span) : repGauge g x = x := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx + rw [map_sum] + exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hT.repGauge_T_self g d] + +TODO (lines := 185-190) "Write the spanned version + of this result, similar to in `IsQuadLorentz`." end IsU1BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean index 3c1fc4112..d61b2f81b 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean @@ -56,7 +56,6 @@ open MvPowerSeries -TODO "Define the symmetrized maurerCartan forms." /-- The `U(1)` Maurer–Cartan form of a jet of gauge transformations in the direction `ν`: the series `i (∂_ν u) ū` for `u` the hypercharge factor of the diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean index 09500ce38..bb9e71d67 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -132,7 +132,6 @@ lemma symmetrizedMaurerCartanCoeff_injective : Function.Injective symmetrizedMau exact ext_of_eval_iteratedDeriv fun s => hall s.card s μ rfl exact Subtype.ext (maurerCartanForm_injOn_truncationKer_zero U.2 V.2 hmc) -TODO "The below code needs cleaning up and moving to the correct place." /-! ## The symmetrized data through the radial Maurer–Cartan component diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean index 0fe8e8dfd..69c0ab782 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean @@ -102,6 +102,14 @@ lemma massWeightSubmodule_eight_eq_deriv : barHiggsSubmodule_comm_higgsSubmodule, mul_assoc, h.barHiggs_higgs_left_comm] simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] + +TODO (lines := 104-105) "In a new file, give the gauge weight decomposition + on each of the mass-weight submodules. Copy what is in + the IsHiggSector.Basic file (which will eventually be overwritten). + In fact complete the guage argument which is there in this new formulation. + The best way is probably to develop the general code in `IsSU2BiFundamental` file + and then directly appply it here." + end IsHiggsSector end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean index 73e5ef88b..8e1549152 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -276,9 +276,6 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : -/ -TODO "Define the iterated derivative, and show that the iterated derivatives span - the adjoin to give the whole algebra." - end JetAlgebra end StandardModel diff --git a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean index 96025fd99..74e99f1ba 100644 --- a/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean +++ b/Physlib/Relativity/Fermions/Weyl/DualLeftHanded.lean @@ -32,7 +32,6 @@ Although a different index convention is used there. namespace Fermion noncomputable section -TODO "Relate `DualLeftHandedWeyl` to `LeftHandedWeyl` via `Module.dual`." /-- The module in which dual-left handed fermions live. This is equivalent to `Fin 2 → ℂ`. -/ structure DualLeftHandedWeyl where diff --git a/TODO-howto.md b/TODO-howto.md new file mode 100644 index 000000000..6fff8fcc3 --- /dev/null +++ b/TODO-howto.md @@ -0,0 +1,60 @@ +# How to write and work through TODO items + +A `TODO "…"` command records a note about the module it appears in. It can carry the +range of lines the note is about, written `TODO (lines := 379-430) "…"`, which is what +makes a note point at a block of code rather than at wherever the note happens to sit. + +The command itself is documented in `Physlib/Meta/TODO/Basic.lean`. This file is about +the editor and command-line side: how to write one without typing it out, how to list +what is outstanding, and how to hand the outstanding items to Claude. + +## Writing one from VS Code + +Select the lines the note is about and run the task **`Physlib: TODO about selection`** +from the command palette (`cmd + shift + p`, then "Tasks: Run Task"). + +## Listing what is outstanding + +``` +python3 scripts/todos.py # to the terminal +python3 scripts/todos.py --md todos.md # regenerate the committed list +python3 scripts/todos.py --head some-branch # read a ref instead of the working tree +``` + +This lists the TODO items **this branch introduces**, by scanning the working tree and +the merge-base with the same matcher and subtracting the sets, so a note that was +already on `master` is not reported and moving one around is not churn. Each entry shows +the range of code it is about, and where the note itself sits when that differs: + +``` +IsSU3BiAdjoint.lean:379-430 (at 431) Fix the errors within these lemmas. +``` + +Regenerate `todos.md` and commit it in the same commit that adds or resolves a TODO. + +## Handing the outstanding items to Claude + +Set it as a session goal with `/goal`, so Claude keeps working until they are all done +and keeps checking back for ones added in the meantime: + +``` +/goal There are a number of TODO items added in this branch. The outstanding ones can +be found from: python3.12 ./scripts/todos.py — run this script to find the TODO items. +Here we only care about those with explicit line ranges, for example 66-164. + +These TODO items correspond to tasks. Do these tasks. +- Where possible do them in parallel with different runners. +- Use the fastest model possible which will do the tasks effectively. +- Once done, delete the corresponding TODO item from the code. +I will add more TODO items, so you should periodically check for new tasks to do. +``` + +Two things make this work in practice. Restricting it to items with explicit line ranges +picks out the ones that name a concrete block of code, which are the ones specific enough +to act on. And because the notes are attached to line ranges rather than to positions in +a list, you can keep adding them while Claude works: new ones are picked up on the next +run of the script. + +One caveat: parallel runners must not be given the same file. Two agents editing one file +will clobber each other, so the work is split one runner per file, and tasks that touch a +shared destination are done in sequence afterwards. diff --git a/scripts/todos.py b/scripts/todos.py index e021da465..b6e5522f6 100644 --- a/scripts/todos.py +++ b/scripts/todos.py @@ -21,6 +21,7 @@ import subprocess import sys import textwrap +from typing import NamedTuple DEFAULT_MASTER = "upstream/master" DEFAULT_ROOT = "Physlib" @@ -50,6 +51,31 @@ ) +class Todo(NamedTuple): + """One TODO item: the code it is about, and where the note itself is written. + + `line` and `endline` are the range given by a `(lines := ...)` clause, or the + line the note is written on when it carries no clause. `at` is always the line + the note itself is on: since `scripts/insert_todo.py` writes a note *below* the + code it is about, the two are usually different. + """ + + path: str + line: int + endline: int + kind: str + content: str + at: int + + def lines(self): + """The range of code, as it is written in a `(lines := ...)` clause.""" + return f"{self.line}-{self.endline}" if self.endline > self.line else f"{self.line}" + + def label(self, name): + """`name` and the code range, saying where the note is when that differs.""" + return f"{name}:{self.lines()}" + (f" (at {self.at})" if self.at != self.line else "") + + def git(repo, *args): out = subprocess.run(["git", "-C", repo, *args], capture_output=True, check=True) return out.stdout.decode("utf-8", "replace") @@ -109,7 +135,8 @@ def parse_file(path, text): body += " " + lines[i].strip() if '"' in body: body = body[:body.rindex('"')] - items.append((path, first, last, "cmd", " ".join(body.split()))) + items.append(Todo(path, first, last, "cmd", + " ".join(body.split()), start + 1)) i += 1 continue @@ -124,12 +151,13 @@ def parse_file(path, text): break body += " " + nxt i += 1 - items.append((path, start + 1, start + 1, "doc", " ".join(body.split()))) + items.append(Todo(path, start + 1, start + 1, "doc", + " ".join(body.split()), start + 1)) i += 1 continue if LOOSE.search(line) and not NOISE.search(line): - unclassified.append((path, i + 1, "?", line.strip())) + unclassified.append(Todo(path, i + 1, i + 1, "?", line.strip(), i + 1)) i += 1 return items, unclassified @@ -175,8 +203,8 @@ def key(content): def group_by_dir(items): by_dir = {} - for path, line, last, _, content in sorted(items): - by_dir.setdefault(path.rsplit("/", 1)[0], []).append((path, line, last, content)) + for todo in sorted(items): + by_dir.setdefault(todo.path.rsplit("/", 1)[0], []).append(todo) return by_dir @@ -187,23 +215,22 @@ def emit_terminal(items, unknown, meta, plain): for directory, group in sorted(group_by_dir(items).items()): if plain: - for path, _, _, content in group: - print(f"{path} | {content}") + for todo in group: + print(f"{todo.path} | {todo.content}") continue print(directory.replace("Physlib/", "")) - for path, line, last, content in group: - name = path.rsplit("/", 1)[1] - head, *rest = textwrap.wrap(content, 62) or [""] - label = f"{name}:{line}-{last}" if last > line else f"{name}:{line}" - print(f" {label:<34} {head}") + for todo in group: + label = todo.label(todo.path.rsplit("/", 1)[1]) + head, *rest = textwrap.wrap(todo.content, 56) or [""] + print(f" {label:<40} {head}") for cont in rest: - print(f" {'':<34} {cont}") + print(f" {'':<40} {cont}") print() if unknown: - print(f"UNCLASSIFIED ({len(unknown)}) - matched /todo/i, no known form:") - for path, line, _, content in sorted(unknown): - print(f" {path}:{line} {content[:70]}") + print(f"UNCLASSIFIED ({len(unknown)}) - new here, matched /todo/i, no known form:") + for todo in sorted(unknown): + print(f" {todo.path}:{todo.line} {todo.content[:70]}") def md_escape(text): @@ -225,12 +252,16 @@ def emit_md(items, meta, repo_url, link_ref): ] for directory, group in sorted(group_by_dir(items).items()): out += [f"### `{directory.replace('Physlib/', '')}`", ""] - for path, line, last, content in group: - name = path.rsplit("/", 1)[1] - anchor = f"L{line}-L{last}" if last > line else f"L{line}" - label = f"{name}:{line}-{last}" if last > line else f"{name}:{line}" - link = f"{repo_url}/blob/{link_ref}/{path}#{anchor}" - out.append(f"- {md_escape(content)}  [`{label}`]({link})") + for todo in group: + name = todo.path.rsplit("/", 1)[1] + anchor = f"L{todo.line}-L{todo.endline}" if todo.endline > todo.line \ + else f"L{todo.line}" + link = f"{repo_url}/blob/{link_ref}/{todo.path}" + row = (f"- {md_escape(todo.content)} " + f" [`{name}:{todo.lines()}`]({link}#{anchor})") + if todo.at != todo.line: # where to go to edit the note itself + row += f"  [`@{todo.at}`]({link}#L{todo.at})" + out.append(row) out.append("") return "\n".join(out) @@ -261,10 +292,18 @@ def main(): args.head or "HEAD").strip() items, unknown, nfiles = scan(args.repo, args.head, args.root) - base_items, _, _ = scan(args.repo, base, args.root) - - base_keys = {key(c) for *_, c in base_items} - items = [it for it in items if key(it[3]) not in base_keys] + base_items, base_unknown, _ = scan(args.repo, base, args.root) + + base_keys = {key(todo.content) for todo in base_items} + items = [todo for todo in items if key(todo.content) not in base_keys] + + # The unclassified lines are subtracted too, so that section only ever reports a + # loose TODO this branch itself introduced. A loose line counts as pre-existing if + # its wording is anywhere at the merge-base, in either form: a stray `-- todo:` + # rewritten as a `TODO` command is not new work. Only this list is widened that + # way; the items above stay keyed against the items at the base alone. + loose_keys = base_keys | {key(todo.content) for todo in base_unknown} + unknown = [todo for todo in unknown if key(todo.content) not in loose_keys] meta = {"base": base, "head": head_sha, "date": date, "files": nfiles} From 4e903a77a2b82a16546867ba9cbaa8b4aa3a4cea Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 31 Aug 2026 12:53:46 +0400 Subject: [PATCH 244/254] refactor(IsQuadLorentz): remove decide from the sector-compatible sign case --- .../Invariants/IsQuadLorentz.lean | 185 +++++++++++++++++- 1 file changed, 178 insertions(+), 7 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 5e0b1c48e..bdc016cd8 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -790,6 +790,119 @@ instance : DecidablePred IsPairedOrDistinct := fun d => inferInstanceAs (Decidable ((d 0 = d 1 ∧ d 2 = d 3) ∨ (d 0 = d 2 ∧ d 1 = d 3) ∨ (d 0 = d 3 ∧ d 1 = d 2) ∨ Function.Injective d)) +/-- A slot whose fibre has even size shares its direction letter with another slot: the + fibre is nonempty, so an even fibre has at least two elements. -/ +lemma exists_ne_eq_of_even_card (d : Fin 4 → Fin 1 ⊕ Fin 3) + (h : ∀ μ, Even (Finset.univ.filter fun s => d s = μ).card) (s : Fin 4) : + ∃ t, t ≠ s ∧ d t = d s := by + have hmem : s ∈ Finset.univ.filter fun t => d t = d s := by simp + have hpos : 0 < (Finset.univ.filter fun t => d t = d s).card := + Finset.card_pos.2 ⟨s, hmem⟩ + have h1 : 1 < (Finset.univ.filter fun t => d t = d s).card := by + have := Nat.even_iff.1 (h (d s)); omega + obtain ⟨a, ha, b, hb, hab⟩ := Finset.one_lt_card.1 h1 + simp only [Finset.mem_filter, Finset.mem_univ, true_and] at ha hb + rcases eq_or_ne a s with rfl | hne + · exact ⟨b, Ne.symm hab, hb⟩ + · exact ⟨a, hne, ha⟩ + +/-- **Paired-or-distinct is a parity condition on the multiplicities.** Counting how often + each of the four direction letters occurs among the four slots, the surviving patterns are + exactly those whose four multiplicities share a parity: all even gives four of a kind or + two pairs, and all odd forces every multiplicity to be one, four odd numbers summing to + four only as `1 + 1 + 1 + 1`. Both fours are used, four slots and four letters. -/ +lemma isPairedOrDistinct_iff_card_parity (d : Fin 4 → Fin 1 ⊕ Fin 3) : + IsPairedOrDistinct d ↔ + (∀ μ, Even (Finset.univ.filter fun s => d s = μ).card) ∨ + (∀ μ, Odd (Finset.univ.filter fun s => d s = μ).card) := by + constructor + · rintro (⟨h1, h2⟩ | ⟨h1, h2⟩ | ⟨h1, h2⟩ | hinj) + · exact Or.inl fun μ => by + rw [Nat.even_iff, Finset.card_filter, Fin.sum_univ_four, h1, h2]; split_ifs <;> rfl + · exact Or.inl fun μ => by + rw [Nat.even_iff, Finset.card_filter, Fin.sum_univ_four, h1, h2]; split_ifs <;> rfl + · exact Or.inl fun μ => by + rw [Nat.even_iff, Finset.card_filter, Fin.sum_univ_four, h1, h2]; split_ifs <;> rfl + · refine Or.inr fun μ => ?_ + have hbij : Function.Bijective d := + (Fintype.bijective_iff_injective_and_card d).2 ⟨hinj, by simp⟩ + obtain ⟨s, hs⟩ := hbij.surjective μ + have hsingle : (Finset.univ.filter fun t => d t = μ) = {s} := by + ext t + simp only [Finset.mem_filter, Finset.mem_univ, true_and, Finset.mem_singleton] + exact ⟨fun h => hbij.injective (h.trans hs.symm), fun h => h ▸ hs⟩ + rw [hsingle, Finset.card_singleton] + exact Nat.odd_iff.2 rfl + · rintro (heven | hodd) + · -- all fibres even: slot 0 has a partner, and the complementary pair must agree + obtain ⟨k, hk0, hk⟩ := exists_ne_eq_of_even_card d heven 0 + have pair : ∀ a b c e : Fin 4, (∀ t : Fin 4, t = a ∨ t = b ∨ t = c ∨ t = e) → + d a = d b → c ≠ e → d c = d e := by + intro a b c e hall hab hce + by_contra hne + obtain ⟨t, ht, htc⟩ := exists_ne_eq_of_even_card d heven c + obtain ⟨u, hu, hue⟩ := exists_ne_eq_of_even_card d heven e + have hdc : d c = d a := by + rcases hall t with rfl | rfl | rfl | rfl + · exact htc.symm + · exact htc.symm.trans hab.symm + · exact absurd rfl ht + · exact absurd htc.symm hne + have hde : d e = d a := by + rcases hall u with rfl | rfl | rfl | rfl + · exact hue.symm + · exact hue.symm.trans hab.symm + · exact absurd hue hne + · exact absurd rfl hu + exact hne (hdc.trans hde.symm) + fin_cases k + · exact absurd rfl hk0 + · exact Or.inl ⟨hk.symm, + pair 0 1 2 3 (by intro t; fin_cases t <;> simp) hk.symm (by omega)⟩ + · exact Or.inr (Or.inl ⟨hk.symm, + pair 0 2 1 3 (by intro t; fin_cases t <;> simp) hk.symm (by omega)⟩) + · exact Or.inr (Or.inr (Or.inl ⟨hk.symm, + pair 0 3 1 2 (by intro t; fin_cases t <;> simp) hk.symm (by omega)⟩)) + · -- all fibres odd: each is exactly 1, so `d` is injective + have hsum : ∑ μ : Fin 1 ⊕ Fin 3, + (Finset.univ.filter fun s => d s = μ).card = 4 := by + rw [← Finset.card_eq_sum_card_fiberwise (fun s _ => Finset.mem_univ (d s))] + simp + rw [Fintype.sum_sum_type, Fin.sum_univ_one, Fin.sum_univ_three] at hsum + have h0 := Nat.odd_iff.1 (hodd (Sum.inl 0)) + have h1 := Nat.odd_iff.1 (hodd (Sum.inr 0)) + have h2 := Nat.odd_iff.1 (hodd (Sum.inr 1)) + have h3 := Nat.odd_iff.1 (hodd (Sum.inr 2)) + have hone : ∀ μ, (Finset.univ.filter fun s => d s = μ).card = 1 := by + intro μ + rcases μ with a | j + · rw [Subsingleton.elim a 0]; omega + · fin_cases j + · exact (by omega : (Finset.univ.filter fun s => d s = Sum.inr 0).card = 1) + · exact (by omega : (Finset.univ.filter fun s => d s = Sum.inr 1).card = 1) + · exact (by omega : (Finset.univ.filter fun s => d s = Sum.inr 2).card = 1) + refine Or.inr (Or.inr (Or.inr fun s t hst => ?_)) + by_contra hne + have h2le : 1 < (Finset.univ.filter fun r => d r = d s).card := + Finset.one_lt_card.2 ⟨s, by simp, t, by simp [hst], hne⟩ + rw [hone] at h2le + omega + +/-- Parity is the only obstruction: two index vectors whose multiplicities agree in parity + are paired-or-distinct together. -/ +lemma isPairedOrDistinct_congr_of_card_parity {d e : Fin 4 → Fin 1 ⊕ Fin 3} + (h : ∀ μ, (Finset.univ.filter fun s => d s = μ).card % 2 + = (Finset.univ.filter fun s => e s = μ).card % 2) : + IsPairedOrDistinct d ↔ IsPairedOrDistinct e := by + rw [isPairedOrDistinct_iff_card_parity, isPairedOrDistinct_iff_card_parity] + constructor + · rintro (hh | hh) + · exact Or.inl fun μ => Nat.even_iff.2 (by have := h μ; have := Nat.even_iff.1 (hh μ); omega) + · exact Or.inr fun μ => Nat.odd_iff.2 (by have := h μ; have := Nat.odd_iff.1 (hh μ); omega) + · rintro (hh | hh) + · exact Or.inl fun μ => Nat.even_iff.2 (by have := h μ; have := Nat.even_iff.1 (hh μ); omega) + · exact Or.inr fun μ => Nat.odd_iff.2 (by have := h μ; have := Nat.odd_iff.1 (hh μ); omega) + /-- The swap of the two null light-cone directions. -/ def swap01 : Fin 4 → Fin 4 := fun κ => if κ = 0 then 1 else if κ = 1 then 0 else κ @@ -991,7 +1104,63 @@ lemma invQ_swap01_mul_coeffZ_swap01 : * (lightConeCoeffInvQ i μ κ * (lightConeCoeffZ i κ ν : ℚ)) := by decide +kernel -set_option maxRecDepth 100000 in +/-- Sector compatibility transfers every multiplicity parity. Off the null sector the two + index vectors agree slotwise, so those fibres are equal; the null-sector supports coincide, + so the two null multiplicities have equal totals, and the axis parity then pins the other. -/ +lemma card_mod_two_congr_of_sameSlotSector (i : Fin 3) {d e : Fin 4 → Fin 1 ⊕ Fin 3} + (hs : ∀ s, SameSlotSector i (e s) (d s)) + (hi : (Finset.univ.filter fun s => d s = Sum.inr i).card % 2 + = (Finset.univ.filter fun s => e s = Sum.inr i).card % 2) (μ : Fin 1 ⊕ Fin 3) : + (Finset.univ.filter fun s => d s = μ).card % 2 + = (Finset.univ.filter fun s => e s = μ).card % 2 := by + have hsplit : ∀ f : Fin 4 → Fin 1 ⊕ Fin 3, + (Finset.univ.filter fun s => f s = Sum.inl 0 ∨ f s = Sum.inr i).card + = (Finset.univ.filter fun s => f s = Sum.inl 0).card + + (Finset.univ.filter fun s => f s = Sum.inr i).card := by + intro f + rw [Finset.filter_or, Finset.card_union_of_disjoint] + exact Finset.disjoint_filter.2 fun s _ h0 h1 => by rw [h0] at h1; simp at h1 + have hsupp : (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr i) + = (Finset.univ.filter fun s => e s = Sum.inl 0 ∨ e s = Sum.inr i) := by + ext s + simp only [Finset.mem_filter, Finset.mem_univ, true_and] + rcases hs s with ⟨he, hd⟩ | hed + · exact ⟨fun _ => he, fun _ => hd⟩ + · rw [← hed] + have htot : (Finset.univ.filter fun s => d s = Sum.inl 0).card + + (Finset.univ.filter fun s => d s = Sum.inr i).card + = (Finset.univ.filter fun s => e s = Sum.inl 0).card + + (Finset.univ.filter fun s => e s = Sum.inr i).card := by + rw [← hsplit d, ← hsplit e, hsupp] + by_cases hμ0 : μ = Sum.inl 0 + · subst hμ0; omega + by_cases hμi : μ = Sum.inr i + · subst hμi; exact hi + have hfil : (Finset.univ.filter fun s => d s = μ) + = (Finset.univ.filter fun s => e s = μ) := by + ext s + simp only [Finset.mem_filter, Finset.mem_univ, true_and] + rcases hs s with ⟨he, hd⟩ | hed + · constructor + · rintro rfl; rcases hd with h | h; exacts [(hμ0 h).elim, (hμi h).elim] + · rintro rfl; rcases he with h | h; exacts [(hμ0 h).elim, (hμi h).elim] + · rw [← hed] + rw [hfil] + +/-- The total null-swap sign counts the axis-`i` slots of both index vectors: `nuSignZ` is a + product of two slot signs, so the product over slots splits into two powers of `-1`. -/ +lemma prod_nuSignZ_eq_pow (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : + (∏ s, nuSignZ i (e s) (d s)) + = (-1 : ℤ) ^ ((Finset.univ.filter fun s => e s = Sum.inr i).card + + (Finset.univ.filter fun s => d s = Sum.inr i).card) := by + have key : ∀ f : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ s, (if f s = Sum.inr i then (-1 : ℤ) else 1)) + = (-1 : ℤ) ^ (Finset.univ.filter fun s => f s = Sum.inr i).card := by + intro f + rw [Finset.prod_ite, Finset.prod_const, Finset.prod_const, one_pow, mul_one] + simp only [nuSignZ] + rw [Finset.prod_mul_distrib, key e, key d, ← pow_add] + /-- The sign of a sector-compatible parity mismatch: a paired-or-distinct column index against a bad row index with all slots sector-compatible carries sign `-1`. -/ lemma prod_nuSignZ_eq_neg_one : @@ -999,12 +1168,14 @@ lemma prod_nuSignZ_eq_neg_one : ∀ d : Fin 4 → Fin 1 ⊕ Fin 3, ¬IsPairedOrDistinct d → (∀ s, SameSlotSector i (e s) (d s)) → (∏ s, nuSignZ i (e s) (d s)) = -1 := by - suffices h1 : ∀ i : Fin 3, ∀ e ∈ {e : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct e}, - ∀ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | ¬IsPairedOrDistinct d}, - (∀ s, SameSlotSector i (e s) (d s)) → (∏ s, nuSignZ i (e s) (d s)) = -1 by - intro i e he d hd hs - exact h1 i e he d hd hs - decide +kernel + intro i e he d hd hs + rw [prod_nuSignZ_eq_pow] + refine Odd.neg_one_pow ?_ + rw [Nat.odd_iff] + by_contra hpar + refine hd ((isPairedOrDistinct_congr_of_card_parity + (card_mod_two_congr_of_sameSlotSector i hs ?_)).2 he) + omega /-- Support of the weight-zero transition: the transition out of a paired-or-distinct index vanishes on every bad index. -/ From ad132b80c114eedddb264b2cdbd485530d1db985 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 31 Aug 2026 15:23:35 +0100 Subject: [PATCH 245/254] feat: lots more group theory --- Physlib.lean | 5 + Physlib/Mathematics/ConjModule.lean | 64 + .../StandardModel/GaugeAlgebra/Basis.lean | 25 + .../GaugeAlgebra/InfinitesimalAction.lean | 53 - .../GaugeAlgebra/RootDecomposition.lean | 313 ++- .../GaugeGroup/GaugeWeightDecomposition.lean | 4 + .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 159 +- .../Invariants/IsSU2BiFundamental.lean | 562 ++++ .../Invariants/IsSU2QuadFundamental.lean | 966 +++++++ .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 1263 ++++++++- .../Invariants/IsSU3BiFundamental.lean | 426 +++ .../GaugeGroup/Invariants/IsU1BiAdjoint.lean | 11 +- .../GaugeGroup/SU3PermDecomposition.lean | 829 +++++- .../IsGaugeSector/MassWeight/BiAdjoint.lean | 408 ++- .../IsHiggsSector/MassWeight/Basic.lean | 8 - .../MassWeight/GaugeWeightDecomposition.lean | 1057 +++++++ .../StandardModel/IsStandardModel/Basic.lean | 369 +++ .../IsStandardModel/CovStandardModel.lean | 2484 +++++++++++++++++ scripts/todos.py | 10 +- 19 files changed, 8787 insertions(+), 229 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean create mode 100644 Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean diff --git a/Physlib.lean b/Physlib.lean index 7fab34fe6..508038e7d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -225,7 +225,10 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Lorent public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2QuadFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsU1BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition @@ -265,6 +268,7 @@ public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition @@ -285,6 +289,7 @@ public import Physlib.Particles.StandardModel.IsCovStandardModel.FermionGaugeSec public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.Basic public import Physlib.Particles.StandardModel.IsCovStandardModel.MixedSector.Basic public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic +public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic diff --git a/Physlib/Mathematics/ConjModule.lean b/Physlib/Mathematics/ConjModule.lean index c7ab5678a..d3897a29f 100644 --- a/Physlib/Mathematics/ConjModule.lean +++ b/Physlib/Mathematics/ConjModule.lean @@ -7,6 +7,7 @@ module public import Mathlib.Algebra.Module.Equiv.Defs public import Mathlib.Algebra.Star.Module +public import Mathlib.LinearAlgebra.Complex.Module public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.Tactic.Ring public import Mathlib.RepresentationTheory.Basic @@ -328,6 +329,69 @@ lemma tensorEquiv_symm_conjEquiv_tmul (m : M) (n : N) : rw [LinearEquiv.symm_apply_eq, tensorEquiv_tmul] simp +/-! + +## Endomorphisms of the conjugate module + +An endomorphism of `M` is read on `ConjModule M` through `conjEquiv`. Conjugating twists +nothing at the level of the additive group, so the structural identities hold +definitionally; only the real-scalar one needs an argument. + +-/ + +/-- A linear endomorphism read on the conjugate module: the same underlying map, + through the identity `conjEquiv`. Conjugating twists nothing at the level of the + additive group, so all structural identities (`comp`, `add`, `neg`, sums) hold + definitionally. -/ +def endConj {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) : + ConjModule M →ₗ[k] ConjModule M where + toFun v := conjEquiv (k := k) (M := M) (f ((conjEquiv (k := k) (M := M)).symm v)) + map_add' v w := f.map_add v w + map_smul' a v := f.map_smul (star a) v + +@[simp] +lemma endConj_apply {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) (v : ConjModule M) : + ConjModule.endConj f v = + conjEquiv (k := k) (M := M) (f ((conjEquiv (k := k) (M := M)).symm v)) := rfl + +lemma endConj_id {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] : + ConjModule.endConj (LinearMap.id : M →ₗ[k] M) = LinearMap.id := rfl + +lemma endConj_comp {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f g : M →ₗ[k] M) : + ConjModule.endConj (f ∘ₗ g) = ConjModule.endConj f ∘ₗ ConjModule.endConj g := rfl + +lemma endConj_add {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f g : M →ₗ[k] M) : + ConjModule.endConj (f + g) = ConjModule.endConj f + ConjModule.endConj g := rfl + +lemma endConj_neg {k : Type*} [CommRing k] [StarRing k] {M : Type*} + [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) : + ConjModule.endConj (-f) = -ConjModule.endConj f := rfl + +lemma endConj_multiset_sum {k : Type*} [CommRing k] [StarRing k] + {M : Type*} [AddCommGroup M] [Module k M] (S : Multiset (M →ₗ[k] M)) : + ConjModule.endConj S.sum = (S.map ConjModule.endConj).sum := by + induction S using Multiset.induction_on with + | empty => rfl + | cons f S ih => + rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, + ConjModule.endConj_add, ih] + +/-- Conjugation of endomorphisms commutes with real scalars: the star on the + conjugated complex scalar is invisible on the reals. -/ +lemma endConj_real_smul {M : Type*} [AddCommGroup M] [Module ℂ M] + (r : ℝ) (f : M →ₗ[ℂ] M) : + ConjModule.endConj (r • f) = r • ConjModule.endConj f := by + refine LinearMap.ext fun v => ?_ + show (algebraMap ℝ ℂ r) • (f ((conjEquiv (k := ℂ) (M := M)).symm v)) + = (starRingEnd ℂ) (algebraMap ℝ ℂ r) • (f ((conjEquiv (k := ℂ) (M := M)).symm v)) + rw [show (starRingEnd ℂ) (algebraMap ℝ ℂ r) = algebraMap ℝ ℂ r from + Complex.conj_ofReal r] + end ConjModule end diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean index e97f1b027..9f4f978c0 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basis.lean @@ -800,6 +800,31 @@ lemma adjointMatrix_mul_transpose (g : GaugeGroupI) : rw [← adjointMatrix_star, ← adjointMatrix_mul, gaugeGroup_mul_star_self, adjointMatrix_one] +/-- The rows of the `su(3)` block of the adjoint matrix are orthonormal. The matrix is + block diagonal, so orthogonality of the whole matrix restricts to each block. -/ +lemma sum_adjointMatrix_inl_row_mul (g : GaugeGroupI) (c d : Fin 8) : + ∑ a : Fin 8, adjointMatrix g (Sum.inl c) (Sum.inl a) * + adjointMatrix g (Sum.inl d) (Sum.inl a) = if c = d then 1 else 0 := by + have h : (adjointMatrix g * (adjointMatrix g)ᵀ) (Sum.inl c) (Sum.inl d) + = (1 : Matrix (Fin 8 ⊕ Fin 3 ⊕ Fin 1) (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ) + (Sum.inl c) (Sum.inl d) := by + rw [adjointMatrix_mul_transpose] + rw [Matrix.mul_apply, Fintype.sum_sum_type] at h + simpa [Fintype.sum_sum_type, Matrix.one_apply] using h + +/-- The rows of the `su(2)` block of the adjoint matrix are orthonormal. -/ +lemma sum_adjointMatrix_inr_inl_row_mul (g : GaugeGroupI) (c d : Fin 3) : + ∑ a : Fin 3, adjointMatrix g (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl a)) * + adjointMatrix g (Sum.inr (Sum.inl d)) (Sum.inr (Sum.inl a)) + = if c = d then 1 else 0 := by + have h : (adjointMatrix g * (adjointMatrix g)ᵀ) + (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl d)) + = (1 : Matrix (Fin 8 ⊕ Fin 3 ⊕ Fin 1) (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ) + (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl d)) := by + rw [adjointMatrix_mul_transpose] + rw [Matrix.mul_apply, Fintype.sum_sum_type] at h + simpa [Fintype.sum_sum_type, Matrix.one_apply] using h + /-- The matrix of the adjoint action of the inverse of a gauge group element is the transpose of the matrix of the adjoint action. -/ lemma adjointMatrix_inv_apply (g : GaugeGroupI) (a b : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean index 665caa967..e52150bd0 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean @@ -367,59 +367,6 @@ end MatterCovariance section ConjugateAction -/-- A linear endomorphism read on the conjugate module: the same underlying map, - through the identity `conjEquiv`. Conjugating twists nothing at the level of the - additive group, so all structural identities (`comp`, `add`, `neg`, sums) hold - definitionally. -/ -def _root_.ConjModule.endConj {k : Type*} [CommRing k] [StarRing k] {M : Type*} - [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) : - ConjModule M →ₗ[k] ConjModule M where - toFun v := conjEquiv (k := k) (M := M) (f ((conjEquiv (k := k) (M := M)).symm v)) - map_add' v w := f.map_add v w - map_smul' a v := f.map_smul (star a) v - -@[simp] -lemma _root_.ConjModule.endConj_apply {k : Type*} [CommRing k] [StarRing k] {M : Type*} - [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) (v : ConjModule M) : - ConjModule.endConj f v = - conjEquiv (k := k) (M := M) (f ((conjEquiv (k := k) (M := M)).symm v)) := rfl - -lemma _root_.ConjModule.endConj_id {k : Type*} [CommRing k] [StarRing k] {M : Type*} - [AddCommGroup M] [Module k M] : - ConjModule.endConj (LinearMap.id : M →ₗ[k] M) = LinearMap.id := rfl - -lemma _root_.ConjModule.endConj_comp {k : Type*} [CommRing k] [StarRing k] {M : Type*} - [AddCommGroup M] [Module k M] (f g : M →ₗ[k] M) : - ConjModule.endConj (f ∘ₗ g) = ConjModule.endConj f ∘ₗ ConjModule.endConj g := rfl - -lemma _root_.ConjModule.endConj_add {k : Type*} [CommRing k] [StarRing k] {M : Type*} - [AddCommGroup M] [Module k M] (f g : M →ₗ[k] M) : - ConjModule.endConj (f + g) = ConjModule.endConj f + ConjModule.endConj g := rfl - -lemma _root_.ConjModule.endConj_neg {k : Type*} [CommRing k] [StarRing k] {M : Type*} - [AddCommGroup M] [Module k M] (f : M →ₗ[k] M) : - ConjModule.endConj (-f) = -ConjModule.endConj f := rfl - -lemma _root_.ConjModule.endConj_multiset_sum {k : Type*} [CommRing k] [StarRing k] - {M : Type*} [AddCommGroup M] [Module k M] (S : Multiset (M →ₗ[k] M)) : - ConjModule.endConj S.sum = (S.map ConjModule.endConj).sum := by - induction S using Multiset.induction_on with - | empty => rfl - | cons f S ih => - rw [Multiset.sum_cons, Multiset.map_cons, Multiset.sum_cons, - ConjModule.endConj_add, ih] - -/-- Conjugation of endomorphisms commutes with real scalars: the star on the - conjugated complex scalar is invisible on the reals. -/ -lemma _root_.ConjModule.endConj_real_smul {M : Type*} [AddCommGroup M] [Module ℂ M] - (r : ℝ) (f : M →ₗ[ℂ] M) : - ConjModule.endConj (r • f) = r • ConjModule.endConj f := by - refine LinearMap.ext fun v => ?_ - show (algebraMap ℝ ℂ r) • (f ((conjEquiv (k := ℂ) (M := M)).symm v)) - = (starRingEnd ℂ) (algebraMap ℝ ℂ r) • (f ((conjEquiv (k := ℂ) (M := M)).symm v)) - rw [show (starRingEnd ℂ) (algebraMap ℝ ℂ r) = algebraMap ℝ ℂ r from - Complex.conj_ofReal r] - /-- **The conjugate of an infinitesimal action**: the same maps, read on the conjugate module — the generators of the conjugate representation. -/ noncomputable def actionConj (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) : diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean index 44c18c266..11c3837c2 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean @@ -14,11 +14,21 @@ The gauge torus acts on the gauge algebra by conjugation with a diagonal matrix, scales the matrix entry `(j, k)` of the `su(3)` and `su(2)` blocks by `d j * star (d k)`. Off the diagonal this makes the real and imaginary parts of an entry a rotating pair — the root directions, recorded by `rootIdx`, `rootEntry` and `rootWeight` — while the -diagonal directions and the `u(1)` generator are fixed, and are recorded by `cartanIdx`. +diagonal directions and the `u(1)` generator are fixed, and are recorded by `cartanIdx`, +which is assembled from the Cartan indices `su3CartanId` and `su2CartanId` of the +individual factors. This is the adjoint analogue of the weights carried by the matter representations, and is what the gauge sector's gauge weight decomposition is built from. +Section E makes that last sentence a theorem. A gauge weight is a character of the torus, +so the real Lie algebra carries no gauge weight decomposition of its own; but for any +complex algebra receiving the dual adjoint action, `adjointDecomposition` decomposes the +span of the resulting symbols, and its pieces are a single root line at each of the eight +nonzero weights and the span of the four Cartan symbols at weight zero. That is the sense +in which the root decomposition and the gauge weight decomposition of the adjoint are the +same thing. + -/ @[expose] public section @@ -174,6 +184,12 @@ basis indices whose coordinate functionals are the real part and minus the imagi part of one matrix entry — together with Cartan directions on which the torus acts trivially; the `u(1)` generator is also fixed. +The Cartan directions are named one factor at a time first, by `su3CartanId` in the +Gell-Mann indices and `su2CartanId` in the Pauli indices, and `cartanIdx` assembles those +with the `u(1)` generator into the four weight-zero directions of the whole algebra. The +factorwise names are the ones the bi-adjoint files use, each of which sees a single +factor; they are reducible, so they behave exactly like the index literals they name. + -/ namespace GaugeAlgebra @@ -199,12 +215,20 @@ def rootEntry : Fin 4 → GaugeAlgebra → ℂ | 2, x => x.toSU3Matrix 1 2 | 3, x => x.toSU2Matrix 0 1 +/-- The Gell-Mann indices of the two Cartan directions of `su(3)`. -/ +abbrev su3CartanId : Fin 2 → Fin 8 + | 0 => 2 + | 1 => 7 + +/-- The Pauli index of the Cartan direction of `su(2)`. -/ +abbrev su2CartanId : Fin 3 := 2 + /-- The four weight-zero directions: the two `su(3)` Cartan generators, the `su(2)` Cartan generator and the `u(1)` generator. -/ def cartanIdx : Fin 4 → (Fin 8 ⊕ Fin 3 ⊕ Fin 1) - | 0 => Sum.inl 2 - | 1 => Sum.inl 7 - | 2 => Sum.inr (Sum.inl 2) + | 0 => Sum.inl (su3CartanId 0) + | 1 => Sum.inl (su3CartanId 1) + | 2 => Sum.inr (Sum.inl su2CartanId) | 3 => Sum.inr (Sum.inr 0) lemma coord_rootIdx_fst (r : Fin 4) (x : GaugeAlgebra) : @@ -259,8 +283,285 @@ lemma dualMap_coord_cartanIdx (c : Fin 4) (i : Fin 4) : have h1 : (adjointMap (gaugeTorusGen i)⁻¹ x).toU1Value = x.toU1Value := adjointMap_toU1Value _ _ fin_cases c <;> - simp only [LinearMap.dualMap_apply, cartanIdx, stdBasis_coord_apply, stdCoeff, - gellMannCoeff, pauliCoeff, h3, h2, h1] + simp only [LinearMap.dualMap_apply, cartanIdx, su3CartanId, su2CartanId, + stdBasis_coord_apply, stdCoeff, gellMannCoeff, pauliCoeff, h3, h2, h1] + +end GaugeAlgebra + +/-! + +## E. The root decomposition as a gauge weight decomposition + +A gauge weight is a character of the torus, so the vectors carrying one are complex, +whereas the gauge algebra is a real Lie algebra and `GaugeWeightDecomposition` asks for a +complex algebra. The relation is therefore not a statement about `GaugeAlgebra`, which +carries no gauge weight decomposition at all, but about any complex algebra receiving the +dual adjoint action: a real-linear map `F` out of `Module.Dual ℝ GaugeAlgebra` +intertwining the gauge action with the coadjoint one, which is how the field strength of +the gauge sector meets the adjoint. + +For such an `F` the root data of section D is exactly a gauge weight decomposition of the +span of the symbols. Each root contributes the two combinations `F φ₁ ± i F φ₂` of its +paired coordinate symbols, of weights `± rootWeight r`, and each Cartan direction +contributes its symbol, of weight zero; `exists_rootIdx_or_cartanIdx` says these twelve +vectors are enough, and `adjointDecomposition` joins their lines one weight at a time. + +The pieces are the identification itself. `adjointDecomposition_piece_rootWeight` and +`adjointDecomposition_piece_neg_rootWeight` give a single root line at each of the eight +nonzero weights, and `adjointDecomposition_piece_zero` gives the span of the four Cartan +symbols at weight zero: the root directions are the nonzero-weight pieces and the Cartan +directions are the zero-weight piece. + +-/ + +namespace GaugeAlgebra + +variable {B : Type*} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} + {F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + +/-- A real scalar acts on a complex algebra through its complex image. -/ +lemma real_smul_eq_complex_smul (r : ℝ) (b : B) : r • b = ((r : ℂ)) • b := by + rw [← Complex.coe_algebraMap, algebraMap_smul] + +/-- A coadjoint symbol map: a real-linear map from the dual of the gauge algebra into a + complex algebra which intertwines the gauge action with the dual adjoint action. The + field strength of the gauge sector is one such map. -/ +def IsCoadjointSymbol (rep : Representation ℂ GaugeGroupI B) + (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : Prop := + ∀ (g : GaugeGroupI) (φ : Module.Dual ℝ GaugeAlgebra), + rep g (F φ) = F ((adjointMap g⁻¹).dualMap φ) + +/-- The index type of the adjoint weight vectors: four positive roots, four negative + roots and four Cartan directions. -/ +abbrev AdjIdx : Type := Fin 4 ⊕ Fin 4 ⊕ Fin 4 + +/-- The gauge weight carried by each adjoint weight vector. -/ +def adjWeight : AdjIdx → GaugeWeight + | Sum.inl r => rootWeight r + | Sum.inr (Sum.inl r) => -(rootWeight r) + | Sum.inr (Sum.inr _) => 0 + +/-- The weight vectors of the adjoint in the image of a coadjoint symbol map: for each + root the two combinations of its paired coordinate symbols, and for each Cartan + direction the symbol itself. -/ +noncomputable def adjVec (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : AdjIdx → B + | Sum.inl r => F (stdBasis.coord (rootIdx r).1) + + Complex.I • F (stdBasis.coord (rootIdx r).2) + | Sum.inr (Sum.inl r) => F (stdBasis.coord (rootIdx r).1) + - Complex.I • F (stdBasis.coord (rootIdx r).2) + | Sum.inr (Sum.inr c) => F (stdBasis.coord (cartanIdx c)) + +/-- A weight vector carries zero gauge weight exactly when it is a Cartan direction; the + eight root directions all carry a nonzero weight. -/ +lemma adjWeight_eq_zero_iff (k : AdjIdx) : + adjWeight k = 0 ↔ ∃ c : Fin 4, k = Sum.inr (Sum.inr c) := by + revert k + decide + +/-- The root and Cartan directions exhaust the standard basis: every standard index is + one of the two members of a root pair, or a Cartan index. -/ +lemma exists_rootIdx_or_cartanIdx (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + (∃ r : Fin 4, a = (rootIdx r).1) ∨ (∃ r : Fin 4, a = (rootIdx r).2) + ∨ ∃ c : Fin 4, a = cartanIdx c := by + revert a + decide + +/-- The positive combination of a rotating pair of symbols is scaled by the rotation. -/ +lemma rep_pair_add (hF : IsCoadjointSymbol rep F) (g : GaugeGroupI) + (φ₁ φ₂ : Module.Dual ℝ GaugeAlgebra) (z : ℂ) + (h1 : (adjointMap g⁻¹).dualMap φ₁ = z.re • φ₁ - z.im • φ₂) + (h2 : (adjointMap g⁻¹).dualMap φ₂ = z.im • φ₁ + z.re • φ₂) : + rep g (F φ₁ + Complex.I • F φ₂) = z • (F φ₁ + Complex.I • F φ₂) := by + rw [map_add, map_smul, hF, hF, h1, h2, map_sub, map_add, map_smul, map_smul, + map_smul, map_smul, real_smul_eq_complex_smul z.re, real_smul_eq_complex_smul z.im, + real_smul_eq_complex_smul z.im, real_smul_eq_complex_smul z.re] + conv_rhs => rw [← Complex.re_add_im z] + match_scalars <;> · ring_nf; try rw [Complex.I_sq]; try ring + +/-- The negative combination of a rotating pair of symbols is scaled by the conjugate + rotation. -/ +lemma rep_pair_sub (hF : IsCoadjointSymbol rep F) (g : GaugeGroupI) + (φ₁ φ₂ : Module.Dual ℝ GaugeAlgebra) (z : ℂ) + (h1 : (adjointMap g⁻¹).dualMap φ₁ = z.re • φ₁ - z.im • φ₂) + (h2 : (adjointMap g⁻¹).dualMap φ₂ = z.im • φ₁ + z.re • φ₂) : + rep g (F φ₁ - Complex.I • F φ₂) + = (starRingEnd ℂ z) • (F φ₁ - Complex.I • F φ₂) := by + rw [map_sub, map_smul, hF, hF, h1, h2, map_sub, map_add, map_smul, map_smul, + map_smul, map_smul, real_smul_eq_complex_smul z.re, real_smul_eq_complex_smul z.im, + real_smul_eq_complex_smul z.im, real_smul_eq_complex_smul z.re] + rw [show (starRingEnd ℂ) z = (z.re : ℂ) - (z.im : ℂ) * Complex.I by + rw [Complex.ext_iff]; simp] + match_scalars <;> · ring_nf; try rw [Complex.I_sq]; try ring + +/-- A symbol at a fixed coordinate functional is itself fixed. -/ +lemma rep_fixed (hF : IsCoadjointSymbol rep F) (g : GaugeGroupI) + (φ : Module.Dual ℝ GaugeAlgebra) (h1 : (adjointMap g⁻¹).dualMap φ = φ) : + rep g (F φ) = F φ := by + rw [hF, h1] + +/-- Each adjoint weight vector is a simultaneous eigenvector of the four torus + generators, at the character of its weight. -/ +lemma rep_adjVec (hF : IsCoadjointSymbol rep F) (k : AdjIdx) (i : Fin 4) : + rep (gaugeTorusGen i) (adjVec F k) + = ((expI : ℂ) ^ GaugeWeight.coord (adjWeight k) i) • adjVec F k := by + match k with + | Sum.inl r => + show rep (gaugeTorusGen i) (F (stdBasis.coord (rootIdx r).1) + + Complex.I • F (stdBasis.coord (rootIdx r).2)) = _ + obtain ⟨p1, p2⟩ := dualMap_pair_of_entry (coord_rootIdx_fst r) (coord_rootIdx_snd r) + (rootEntry_adjointMap r i) + exact rep_pair_add hF _ _ _ _ p1 p2 + | Sum.inr (Sum.inl r) => + show rep (gaugeTorusGen i) (F (stdBasis.coord (rootIdx r).1) + - Complex.I • F (stdBasis.coord (rootIdx r).2)) = _ + obtain ⟨p1, p2⟩ := dualMap_pair_of_entry (coord_rootIdx_fst r) (coord_rootIdx_snd r) + (rootEntry_adjointMap r i) + rw [rep_pair_sub hF _ _ _ _ p1 p2] + congr 1 + rw [show GaugeWeight.coord (adjWeight (Sum.inr (Sum.inl r) : AdjIdx)) i + = -(GaugeWeight.coord (rootWeight r) i) from by + simp [adjWeight, GaugeWeight.coord_neg]] + rw [← Complex.star_def, star_expI_zpow] + | Sum.inr (Sum.inr c) => + show rep (gaugeTorusGen i) (F (stdBasis.coord (cartanIdx c))) = _ + rw [rep_fixed hF _ _ (dualMap_coord_cartanIdx c i)] + show _ = ((expI : ℂ) ^ GaugeWeight.coord (0 : GaugeWeight) i) • _ + simp [adjVec] + +/-- The first symbol of a root pair, recovered from the two weight vectors. -/ +lemma symbol_rootIdx_fst (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (r : Fin 4) : + F (stdBasis.coord (rootIdx r).1) + = (2 : ℂ)⁻¹ • (adjVec F (Sum.inl r) + adjVec F (Sum.inr (Sum.inl r))) := by + show _ = (2 : ℂ)⁻¹ • ((F (stdBasis.coord (rootIdx r).1) + + Complex.I • F (stdBasis.coord (rootIdx r).2)) + + (F (stdBasis.coord (rootIdx r).1) + - Complex.I • F (stdBasis.coord (rootIdx r).2))) + match_scalars <;> · field_simp; try ring + +/-- The second symbol of a root pair, recovered from the two weight vectors. -/ +lemma symbol_rootIdx_snd (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (r : Fin 4) : + F (stdBasis.coord (rootIdx r).2) + = (-(Complex.I / 2)) • (adjVec F (Sum.inl r) - adjVec F (Sum.inr (Sum.inl r))) := by + show _ = (-(Complex.I / 2)) • ((F (stdBasis.coord (rootIdx r).1) + + Complex.I • F (stdBasis.coord (rootIdx r).2)) + - (F (stdBasis.coord (rootIdx r).1) + - Complex.I • F (stdBasis.coord (rootIdx r).2))) + match_scalars <;> · ring_nf; try rw [Complex.I_sq]; try ring + +/-- Every standard coordinate symbol lies in the join of the twelve weight lines. -/ +lemma symbol_mem_iSup (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (a : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : + F (stdBasis.coord a) ∈ ⨆ k : AdjIdx, Submodule.span ℂ {adjVec F k} := by + have hmem : ∀ k : AdjIdx, adjVec F k ∈ ⨆ k : AdjIdx, Submodule.span ℂ {adjVec F k} := + fun k => Submodule.mem_iSup_of_mem k (Submodule.mem_span_singleton_self _) + rcases exists_rootIdx_or_cartanIdx a with ⟨r, rfl⟩ | ⟨r, rfl⟩ | ⟨c, rfl⟩ + · rw [symbol_rootIdx_fst] + exact Submodule.smul_mem _ _ (Submodule.add_mem _ (hmem _) (hmem _)) + · rw [symbol_rootIdx_snd] + exact Submodule.smul_mem _ _ (Submodule.sub_mem _ (hmem _) (hmem _)) + · exact hmem (Sum.inr (Sum.inr c)) + +/-- The span of the symbols is the join of the twelve weight lines. -/ +lemma span_range_eq_iSup (F : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + Submodule.span ℂ (Set.range F) = ⨆ k : AdjIdx, Submodule.span ℂ {adjVec F k} := by + refine le_antisymm (Submodule.span_le.mpr ?_) (iSup_le fun k => ?_) + · rintro x ⟨φ, rfl⟩ + rw [← stdBasis.sum_dual_apply_smul_coord φ, map_sum] + refine Submodule.sum_mem _ fun a _ => ?_ + rw [map_smul, real_smul_eq_complex_smul] + exact Submodule.smul_mem _ _ (symbol_mem_iSup F a) + · refine (Submodule.span_singleton_le_iff_mem _ _).mpr ?_ + have hFm : ∀ φ, F φ ∈ Submodule.span ℂ (Set.range F) := + fun φ => Submodule.subset_span ⟨φ, rfl⟩ + match k with + | Sum.inl r => exact Submodule.add_mem _ (hFm _) (Submodule.smul_mem _ _ (hFm _)) + | Sum.inr (Sum.inl r) => + exact Submodule.sub_mem _ (hFm _) (Submodule.smul_mem _ _ (hFm _)) + | Sum.inr (Sum.inr c) => exact hFm _ + +/-- The root decomposition read as a gauge weight decomposition: the span of the symbols + of a coadjoint map, joined out of the twelve root and Cartan lines. -/ +@[implicit_reducible] +noncomputable def adjointDecomposition (hmul : IsMulRep rep) + (hF : IsCoadjointSymbol rep F) : + GaugeWeightDecomposition rep (Submodule.span ℂ (Set.range F)) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hmul fun k => + GaugeWeightDecomposition.spanSingleton hmul (adjVec F k) (adjWeight k) + (fun i => rep_adjVec hF k i)) + _ (span_range_eq_iSup F) + +/-- The gauge weights of the adjoint: the six `su(3)` roots, the two `su(2)` roots and + the zero weight of the Cartan and `u(1)` directions. Every one of them has vanishing + hypercharge. -/ +lemma adjointDecomposition_supp (hmul : IsMulRep rep) (hF : IsCoadjointSymbol rep F) : + (adjointDecomposition hmul hF).supp + = {((2, -1, 0, 0) : GaugeWeight), (1, 1, 0, 0), (-1, 2, 0, 0), (0, 0, 2, 0), + (-2, 1, 0, 0), (-1, -1, 0, 0), (1, -2, 0, 0), (0, 0, -2, 0), (0, 0, 0, 0)} := by + show Finset.univ.biUnion (fun k : AdjIdx => ({adjWeight k} : Finset GaugeWeight)) = _ + decide + +/-- The pieces of the decomposition: the weight-`w` piece is the join of the weight lines + whose weight is `w`. -/ +lemma adjointDecomposition_piece (hmul : IsMulRep rep) (hF : IsCoadjointSymbol rep F) + (w : GaugeWeight) : + (adjointDecomposition hmul hF).piece w + = ⨆ k : AdjIdx, if w = adjWeight k then Submodule.span ℂ {adjVec F k} else ⊥ := rfl + +/-- The piece at a root weight is the line of that root alone. -/ +lemma adjointDecomposition_piece_rootWeight (hmul : IsMulRep rep) + (hF : IsCoadjointSymbol rep F) (r : Fin 4) : + (adjointDecomposition hmul hF).piece (rootWeight r) + = Submodule.span ℂ {adjVec F (Sum.inl r)} := by + rw [adjointDecomposition_piece, iSup_sum, iSup_sum] + have h1 : ∀ a b : Fin 4, (rootWeight a = adjWeight (Sum.inl b)) ↔ b = a := by decide + have h2 : ∀ a b : Fin 4, ¬ (rootWeight a = adjWeight (Sum.inr (Sum.inl b))) := by decide + have h3 : ∀ a c : Fin 4, ¬ (rootWeight a = adjWeight (Sum.inr (Sum.inr c))) := by decide + simp only [h1, h2, h3, if_false, iSup_bot, sup_bot_eq] + refine le_antisymm (iSup_le fun b => ?_) (le_iSup_of_le r (by simp)) + split_ifs with hb + · subst hb + exact le_rfl + · exact bot_le + +/-- The piece at the opposite of a root weight is the line of the opposite root. -/ +lemma adjointDecomposition_piece_neg_rootWeight (hmul : IsMulRep rep) + (hF : IsCoadjointSymbol rep F) (r : Fin 4) : + (adjointDecomposition hmul hF).piece (-(rootWeight r)) + = Submodule.span ℂ {adjVec F (Sum.inr (Sum.inl r))} := by + rw [adjointDecomposition_piece, iSup_sum, iSup_sum] + have h1 : ∀ a b : Fin 4, ¬ (-(rootWeight a) = adjWeight (Sum.inl b)) := by decide + have h2 : ∀ a b : Fin 4, + (-(rootWeight a) = adjWeight (Sum.inr (Sum.inl b))) ↔ b = a := by decide + have h3 : ∀ a c : Fin 4, + ¬ (-(rootWeight a) = adjWeight (Sum.inr (Sum.inr c))) := by decide + simp only [h1, h2, h3, if_false, iSup_bot, bot_sup_eq, sup_bot_eq] + refine le_antisymm (iSup_le fun b => ?_) (le_iSup_of_le r (by simp)) + split_ifs with hb + · subst hb + exact le_rfl + · exact bot_le + +/-- The weight-zero piece is the span of the four Cartan symbols: the two `su(3)` Cartan + generators, the `su(2)` Cartan generator and the `u(1)` generator. -/ +lemma adjointDecomposition_piece_zero (hmul : IsMulRep rep) + (hF : IsCoadjointSymbol rep F) : + (adjointDecomposition hmul hF).piece 0 + = ⨆ c : Fin 4, Submodule.span ℂ {F (stdBasis.coord (cartanIdx c))} := by + rw [adjointDecomposition_piece, iSup_sum, iSup_sum] + have h1 : ∀ b : Fin 4, ¬ ((0 : GaugeWeight) = adjWeight (Sum.inl b)) := by decide + have h2 : ∀ b : Fin 4, + ¬ ((0 : GaugeWeight) = adjWeight (Sum.inr (Sum.inl b))) := by decide + have h3 : ∀ c : Fin 4, ((0 : GaugeWeight) = adjWeight (Sum.inr (Sum.inr c))) := by decide + simp only [h1, h2, if_false, iSup_bot, bot_sup_eq] + exact iSup_congr fun c => if_pos (h3 c) + +/-- Every weight outside the nine is absent from the adjoint. -/ +lemma adjointDecomposition_piece_eq_bot (hmul : IsMulRep rep) + (hF : IsCoadjointSymbol rep F) {w : GaugeWeight} + (hw : w ∉ (adjointDecomposition hmul hF).supp) : + (adjointDecomposition hmul hF).piece w = ⊥ := + (adjointDecomposition hmul hF).piece_eq_bot w hw end GaugeAlgebra diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index b629c388d..17f25fedb 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -34,6 +34,10 @@ four gradings are simultaneously realizable. An invariant operator is fixed by t group, so in particular by these four elements, so it carries zero weight and the search can be confined to the zero-weight piece. +In the adjoint representation this grading is the root decomposition of the gauge algebra. +That identification cannot be made here, since the file recording the root data imports +this one; it is `GaugeAlgebra.adjointDecomposition` in +`Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition`. ## ii. Key results diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean index 68896ffc3..7f184ad62 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -19,21 +19,68 @@ This is the gauge analogue of `IsQuadLorentz`. The field strength of the `W` bos carries one `su(2)` adjoint index, so a product of two field strengths carries two, and the proposition here records how such a product transforms. -Section A gives the proposition and the span of its components, section B the -orthogonality of the `su(2)` block of `adjointMatrix`, section C the trace contraction, -which is the natural gauge invariant built from two adjoint indices, and section D the -gauge weight decomposition of the span. +Section A records the adjoint matrix of the `SU(2)` factor, through which the +transformation law is phrased, section B gives the proposition and the span of its +components, section C the trace contraction, which is the natural gauge invariant built +from two adjoint indices, and section D the gauge weight decomposition of the span. -/ @[expose] public section namespace StandardModel -open Matrix +open Matrix PauliMatrix /-! -## A. Bi-adjoint `su(2)` families and the span of their components +## A. The adjoint matrix of the `SU(2)` factor + +An `su(2)` adjoint index is acted on by the `SU(2)` factor of the gauge group alone, +through the trace pairing of the Pauli basis with the Pauli basis conjugated by the +`SU(2)` matrix. That pairing is recorded here as `su2AdjointMatrix`, a matrix built from +an element of `SU(2)` and nothing else, so that the transformation law below can be +stated without mentioning the other two factors of the gauge group. It is the `su(2)` +block of `GaugeAlgebra.adjointMatrix`, and inherits from it the orthonormality of its +rows. + +-/ + +/-- The adjoint matrix of an element of `SU(2)`: the trace pairing of the Pauli basis of + `su(2)` with the Pauli basis conjugated by that element. -/ +noncomputable def su2AdjointMatrix (U : specialUnitaryGroup (Fin 2) ℂ) : + Matrix (Fin 3) (Fin 3) ℝ := + Matrix.of fun i j => + 2⁻¹ * (Matrix.trace (pauliMatrix (Sum.inr i) * + (U.1 * pauliMatrix (Sum.inr j) * star U.1))).re + +/-- The entries of the adjoint matrix of an element of `SU(2)`. -/ +@[simp] +lemma su2AdjointMatrix_apply (U : specialUnitaryGroup (Fin 2) ℂ) (i j : Fin 3) : + su2AdjointMatrix U i j + = 2⁻¹ * (Matrix.trace (pauliMatrix (Sum.inr i) * + (U.1 * pauliMatrix (Sum.inr j) * star U.1))).re := rfl + +/-- The adjoint matrix of the `SU(2)` factor of a gauge group element is the `su(2)` + block of the adjoint matrix of the gauge algebra. -/ +lemma su2AdjointMatrix_toSU2 (g : GaugeGroupI) (i j : Fin 3) : + su2AdjointMatrix (GaugeGroupI.toSU2 g) i j + = GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl i)) (Sum.inr (Sum.inl j)) := rfl + +/-- The rows of the adjoint matrix of an element of `SU(2)` are orthonormal, the adjoint + action preserving the trace pairing of the Pauli basis. -/ +lemma sum_su2AdjointMatrix_row_mul (U : specialUnitaryGroup (Fin 2) ℂ) (c d : Fin 3) : + ∑ a : Fin 3, su2AdjointMatrix U c a * su2AdjointMatrix U d a + = if c = d then 1 else 0 := + GaugeAlgebra.sum_adjointMatrix_inr_inl_row_mul (1, U, 1) c d + +/-! + +## B. Bi-adjoint `su(2)` families and the span of their components + +The transformation law carries one factor of `su2AdjointMatrix` per index, with the +summed index in the row slot, exactly as `IsSU2BiFundamental` carries one factor of the +fundamental matrix per index. It is the `SU(2)` factor alone, and is the law obeyed by +the `W`-boson field strengths of `IsGaugeSector`. -/ @@ -44,11 +91,7 @@ structure IsSU2BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (T : (Fin 2 → Fin 3) → B) : Prop where repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 3), repGauge g (T l) = ∑ a : Fin 2 → Fin 3, - (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (a i))) - (Sum.inr (Sum.inl (l i))) : ℝ) : ℂ)) • T a - -TODO (lines := 43-47) "we could probably make this just be about - the action of the SU(2) factor." + (∏ i : Fin 2, ((su2AdjointMatrix (GaugeGroupI.toSU2 g) (a i) (l i) : ℝ) : ℂ)) • T a namespace IsSU2BiAdjoint set_option linter.unusedVariables false @@ -84,32 +127,6 @@ lemma mem_span_iff (x : B) : /-! -## B. Orthogonality of the adjoint matrix - -Orthogonality of `adjointMatrix` is proved where the matrix is defined, in -`GaugeAlgebra.Basis`. All that is needed here is the row orthonormality of the block -belonging to this gauge factor, which is what makes the trace contraction of section C -gauge invariant. - --/ - -/-- The rows of the `su(2)` block of the adjoint matrix are orthonormal. -/ -lemma sum_adjointMatrix_row_mul (g : GaugeGroupI) (c d : Fin 3) : - ∑ a : Fin 3, GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl a)) * - GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl d)) (Sum.inr (Sum.inl a)) - = if c = d then 1 else 0 := by - have h : (GaugeAlgebra.adjointMatrix g * (GaugeAlgebra.adjointMatrix g)ᵀ) - (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl d)) = (1 : Matrix (Fin 8 ⊕ Fin 3 ⊕ Fin 1) - (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ) (Sum.inr (Sum.inl c)) (Sum.inr (Sum.inl d)) := by - rw [GaugeAlgebra.adjointMatrix_mul_transpose] - rw [Matrix.mul_apply, Fintype.sum_sum_type] at h - simpa [Fintype.sum_sum_type, Matrix.one_apply] using h - -TODO (lines := 90-102) "Move this to where `adjointMatrix` is - defined." - -/-! - ## C. The trace contraction -/ @@ -152,9 +169,8 @@ lemma repGauge_traceContraction (hT : IsSU2BiAdjoint B repGauge T) (g : GaugeGro rw [map_sum] have h1 : ∀ c : Fin 3, repGauge g (T ![c, c]) = ∑ b : Fin 2 → Fin 3, - ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (b 0))) (Sum.inr (Sum.inl c)) * - GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (b 1))) - (Sum.inr (Sum.inl c)) : ℝ) : ℂ) • T b := by + ((su2AdjointMatrix (GaugeGroupI.toSU2 g) (b 0) c * + su2AdjointMatrix (GaugeGroupI.toSU2 g) (b 1) c : ℝ) : ℂ) • T b := by intro c rw [hT.repGauge_T g ![c, c]] refine Finset.sum_congr rfl fun b _ => ?_ @@ -165,13 +181,10 @@ lemma repGauge_traceContraction (hT : IsSU2BiAdjoint B repGauge T) (g : GaugeGro refine Finset.sum_congr rfl fun b _ => ?_ rw [← Finset.sum_smul] congr 1 - rw [← Complex.ofReal_sum, sum_adjointMatrix_row_mul] + rw [← Complex.ofReal_sum, sum_su2AdjointMatrix_row_mul] simp [apply_ite] rw [step, ← hT.traceContraction_eq_sum] -TODO (lines := 170-171) "Make a corresponding - file to this one for IsSU2BiFundamental." - end IsSU2BiAdjoint /-! @@ -183,6 +196,10 @@ do not carry a definite gauge weight. The eigenvectors appear only after passing weight basis of the `su(2)` adjoint: for the one root direction the two complex combinations `x₁ ± i x₂` of the paired Pauli coordinates, and the Cartan direction as it stands. That is three coordinate vectors, recorded in `wtCoeff`, with weights `wtWeight`. +The Cartan direction is named in the gauge algebra itself, as `GaugeAlgebra.su2CartanId`, +since the Cartan directions of the whole algebra are assembled from it and its `su(3)` +companions; the root pair is recorded here and matched with that of the whole algebra +below. With two adjoint indices a weight vector is a product of two of these, contracted against `T` by `biVec`, and its weight is the sum of the two individual weights. There are nine @@ -215,9 +232,6 @@ def rootPair : Fin 3 × Fin 3 := (0, 1) /-- The gauge weight of the `su(2)` root direction. -/ def rootWt : GaugeWeight := (0, 0, 2, 0) -/-- The Pauli index of the Cartan direction of `su(2)`. -/ -def cartanId : Fin 3 := 2 - /-- The root direction here is the `su(2)` root direction of the full gauge algebra. -/ lemma rootIdx_three : GaugeAlgebra.rootIdx 3 @@ -228,18 +242,18 @@ lemma rootWeight_three : GaugeAlgebra.rootWeight 3 = rootWt := rfl /-- The Cartan direction here is the `su(2)` Cartan direction of the full gauge algebra. -/ -lemma cartanIdx_two : GaugeAlgebra.cartanIdx 2 = Sum.inr (Sum.inl cartanId) := rfl +lemma cartanIdx_two : GaugeAlgebra.cartanIdx 2 = Sum.inr (Sum.inl GaugeAlgebra.su2CartanId) := rfl /-- Every Pauli index is either one of the two members of the root pair or the Cartan index. -/ lemma eq_rootPair_or_cartanId (a : Fin 3) : - a = rootPair.1 ∨ a = rootPair.2 ∨ a = cartanId := by + a = rootPair.1 ∨ a = rootPair.2 ∨ a = GaugeAlgebra.su2CartanId := by revert a decide /-! -## D.2. The adjoint matrix of a torus generator in the weight basis +## D.2. The `SU(2)` adjoint matrix of a torus generator in the weight basis -/ @@ -262,15 +276,15 @@ lemma dualMap_coord_apply (g : GaugeGroupI) (a b : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : Finset.sum_ite_eq', Finset.mem_univ, if_true] rw [GaugeAlgebra.adjointMatrix_inv_apply] -/-- The first column of the root pair: the torus rotates the two columns of the adjoint - matrix belonging to the root direction into each other. -/ -lemma adjointMatrix_rootPair_fst (i : Fin 4) (a : Fin 3) : - GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inr (Sum.inl a)) - (Sum.inr (Sum.inl rootPair.1)) +/-- The first column of the root pair: the torus rotates the two columns of the `SU(2)` + adjoint matrix belonging to the root direction into each other. -/ +lemma su2AdjointMatrix_rootPair_fst (i : Fin 4) (a : Fin 3) : + su2AdjointMatrix (GaugeGroupI.toSU2 (gaugeTorusGen i)) a rootPair.1 = ((expI : ℂ) ^ GaugeWeight.coord rootWt i).re * (if a = rootPair.1 then 1 else 0) - ((expI : ℂ) ^ GaugeWeight.coord rootWt i).im * (if a = rootPair.2 then 1 else 0) := by + rw [su2AdjointMatrix_toSU2] obtain ⟨p1, -⟩ := GaugeAlgebra.dualMap_pair_of_entry (GaugeAlgebra.coord_rootIdx_fst 3) (GaugeAlgebra.coord_rootIdx_snd 3) @@ -282,13 +296,13 @@ lemma adjointMatrix_rootPair_fst (i : Fin 4) (a : Fin 3) : simp [Finsupp.single_apply] /-- The second column of the root pair. -/ -lemma adjointMatrix_rootPair_snd (i : Fin 4) (a : Fin 3) : - GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inr (Sum.inl a)) - (Sum.inr (Sum.inl rootPair.2)) +lemma su2AdjointMatrix_rootPair_snd (i : Fin 4) (a : Fin 3) : + su2AdjointMatrix (GaugeGroupI.toSU2 (gaugeTorusGen i)) a rootPair.2 = ((expI : ℂ) ^ GaugeWeight.coord rootWt i).im * (if a = rootPair.1 then 1 else 0) + ((expI : ℂ) ^ GaugeWeight.coord rootWt i).re * (if a = rootPair.2 then 1 else 0) := by + rw [su2AdjointMatrix_toSU2] obtain ⟨-, p2⟩ := GaugeAlgebra.dualMap_pair_of_entry (GaugeAlgebra.coord_rootIdx_fst 3) (GaugeAlgebra.coord_rootIdx_snd 3) @@ -299,11 +313,11 @@ lemma adjointMatrix_rootPair_snd (i : Fin 4) (a : Fin 3) : rw [e] simp [Finsupp.single_apply] -/-- The torus fixes the Cartan column of the adjoint matrix. -/ -lemma adjointMatrix_cartanId (i : Fin 4) (a : Fin 3) : - GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inr (Sum.inl a)) - (Sum.inr (Sum.inl cartanId)) - = if a = cartanId then 1 else 0 := by +/-- The torus fixes the Cartan column of the `SU(2)` adjoint matrix. -/ +lemma su2AdjointMatrix_cartanId (i : Fin 4) (a : Fin 3) : + su2AdjointMatrix (GaugeGroupI.toSU2 (gaugeTorusGen i)) a GaugeAlgebra.su2CartanId + = if a = GaugeAlgebra.su2CartanId then 1 else 0 := by + rw [su2AdjointMatrix_toSU2] have p := GaugeAlgebra.dualMap_coord_cartanIdx 2 i simp only [cartanIdx_two] at p have e := LinearMap.congr_fun p (GaugeAlgebra.stdBasis (Sum.inr (Sum.inl a))) @@ -325,7 +339,7 @@ noncomputable def wtCoeff : WeightIdx → Fin 3 → ℂ + Complex.I * (if a = rootPair.2 then 1 else 0) | Sum.inr (Sum.inl _), a => (if a = rootPair.1 then 1 else 0) - Complex.I * (if a = rootPair.2 then 1 else 0) - | Sum.inr (Sum.inr _), a => if a = cartanId then 1 else 0 + | Sum.inr (Sum.inr _), a => if a = GaugeAlgebra.su2CartanId then 1 else 0 /-- The gauge weight carried by each `su(2)` adjoint weight vector. -/ def wtWeight : WeightIdx → GaugeWeight @@ -339,8 +353,7 @@ def unitVec (a : Fin 3) : Fin 3 → ℂ := fun x => if x = a then 1 else 0 /-- The action of a gauge transformation on the coordinates of one `su(2)` adjoint index. -/ noncomputable def rowAct (g : GaugeGroupI) (c : Fin 3 → ℂ) : Fin 3 → ℂ := fun a => - ∑ x : Fin 3, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl a)) - (Sum.inr (Sum.inl x)) : ℝ) : ℂ) * c x + ∑ x : Fin 3, ((su2AdjointMatrix (GaugeGroupI.toSU2 g) a x : ℝ) : ℂ) * c x /-- Collapsing a sum against the two Kronecker deltas of the root pair. -/ lemma sum_mul_pair (f : Fin 3 → ℂ) (b₁ b₂ : Fin 3) (s : ℂ) : @@ -383,7 +396,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : | Sum.inl r => show ∑ x : Fin 3, _ = _ simp only [wtCoeff] - rw [sum_mul_pair, adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + rw [sum_mul_pair, su2AdjointMatrix_rootPair_fst, su2AdjointMatrix_rootPair_snd] simp only [wtCoeff, wtWeight, Pi.smul_apply, smul_eq_mul, apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] @@ -397,7 +410,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : simp only [wtCoeff] ring simp only [hneg] - rw [sum_mul_pair, adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + rw [sum_mul_pair, su2AdjointMatrix_rootPair_fst, su2AdjointMatrix_rootPair_snd] simp only [wtWeight, Pi.smul_apply, smul_eq_mul, apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] @@ -410,7 +423,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : | Sum.inr (Sum.inr c) => show ∑ x : Fin 3, _ = _ simp only [wtCoeff, wtWeight, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', - Finset.mem_univ, if_true, adjointMatrix_cartanId, Pi.smul_apply, smul_eq_mul, + Finset.mem_univ, if_true, su2AdjointMatrix_cartanId, Pi.smul_apply, smul_eq_mul, GaugeWeight.zero_coord, zpow_zero, apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero] @@ -475,10 +488,8 @@ lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 3 → ℂ) : have step : ∀ d : Fin 2 → Fin 3, repGauge g ((c₀ (d 0) * c₁ (d 1)) • T d) = ∑ a : Fin 2 → Fin 3, ((c₀ (d 0) * c₁ (d 1)) * - (((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (a 0))) - (Sum.inr (Sum.inl (d 0))) : ℝ) : ℂ) * - ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inl (a 1))) - (Sum.inr (Sum.inl (d 1))) : ℝ) : ℂ))) + (((su2AdjointMatrix (GaugeGroupI.toSU2 g) (a 0) (d 0) : ℝ) : ℂ) * + ((su2AdjointMatrix (GaugeGroupI.toSU2 g) (a 1) (d 1) : ℝ) : ℂ))) • T a := by intro d rw [map_smul, hT.repGauge_T g d, Finset.smul_sum] @@ -531,7 +542,7 @@ lemma unitVec_rootPair_snd : ring /-- The Cartan direction is already a weight vector. -/ -lemma unitVec_cartanId : unitVec cartanId = wtCoeff (Sum.inr (Sum.inr 0)) := rfl +lemma unitVec_cartanId : unitVec GaugeAlgebra.su2CartanId = wtCoeff (Sum.inr (Sum.inr 0)) := rfl /-- Contracting a weight vector against a single Pauli direction stays in the join of the weight lines. -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean new file mode 100644 index 000000000..dc9083525 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean @@ -0,0 +1,562 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition +/-! +# Gauge tensors carrying two `su(2)` fundamental indices + +`IsSU2BiFundamental B repGauge T` says that a family `T`, indexed by two `su(2)` +fundamental indices and valued in a module `B` carrying a representation of the gauge +group `GaugeGroupI`, transforms as a tensor `T^{a₁ a₂}` in the `su(2)` factor of the +fundamental representation. + +This is the doublet analogue of `IsSU2BiAdjoint`. The Higgs carries one `su(2)` +fundamental index, so a product of two Higgs symbols carries two, and the proposition +here records how such a product transforms. + +Two things separate it from the adjoint case. The fundamental representation matrix +`GaugeGroupI.toSU2` has complex entries, where `GaugeAlgebra.adjointMatrix` is real, so +the transformation law is stated over `ℂ` throughout. And the natural invariant built +from two fundamental indices is not a trace: a doublet index has nowhere to be +contracted against another doublet index except through the antisymmetric symbol `ε`, +whose invariance is the statement that the determinant of an `SU(2)` matrix is one. + +Section A gives the proposition and the span of its components, section B the epsilon +contraction, which is the natural gauge invariant built from two fundamental indices, +and section C the gauge weight decomposition of the span. Section D grades the zero-weight +piece of that decomposition by the Weyl element of the `SU(2)` factor, which the gauge +weight alone cannot split, and the two gradings together leave the epsilon contraction +spanning the gauge invariants. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. Bi-fundamental `su(2)` families and the span of their components + +The transformation law carries one factor of the fundamental matrix `GaugeGroupI.toSU2 g` +per index, with the summed index in the row slot, exactly as `IsSU2BiAdjoint` carries one +factor of `GaugeAlgebra.adjointMatrix g` per index. Since `toSU2` is a monoid +homomorphism this is an action. It is the `SU(2)` factor alone, and is the law obeyed by +the conjugate Higgs doublet symbols of `IsHiggsSector` once their hypercharge character +is set aside, the Higgs symbols themselves obeying the complex conjugate law. + +The element `g` still ranges over the whole of `GaugeGroupI`, and that is what makes the +proposition say more than a statement about `SU(2)` would. The right-hand side sees only +`GaugeGroupI.toSU2 g`, so taking `g` in the colour or hypercharge factor forces that +factor to fix every component. Section C reads that off as the vanishing of the colour and +hypercharge coordinates of every weight, and `GaugeWeightDecomposition` is stated for +representations of `GaugeGroupI`, which a bare `SU(2)` representation cannot supply. What +is genuinely about `SU(2)` alone is the invariance of the antisymmetric symbol in section +B, and that is stated for an arbitrary element of `specialUnitaryGroup (Fin 2) ℂ`. + +-/ + +/-- A family `T` of elements of `B`, indexed by two `su(2)` fundamental indices, + transforms as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge + group. -/ +structure IsSU2BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 2) → B) : Prop where + repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 2), + repGauge g (T l) = ∑ a : Fin 2 → Fin 2, + (∏ i : Fin 2, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a + +TODO (lines := 71-74) "I think we could make this whole file + about just the action of the SU(2) factor." + +namespace IsSU2BiFundamental +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) + +/-- The span of all the components. -/ +def span (hT : IsSU2BiFundamental B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 2) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 2 → Fin 2) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. The epsilon contraction + +A doublet index has nowhere to be contracted against another doublet index except through +the antisymmetric symbol, so there is exactly one contraction to make here. That symbol is +not new: Physlib writes a Levi-Civita symbol as the generalized Kronecker delta of a +multi-index against the identity, which is what `euclidLeviCivita` is in four dimensions +and what `epsilon` is here in two. Its invariance is the statement that the determinant of +an `SU(2)` matrix is one, and that is what makes the contraction gauge invariant. + +-/ + +/-- A sum over families of two `su(2)` fundamental indices is a double sum. -/ +lemma sum_pi_two {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin 2) → M) : + ∑ d : Fin 2 → Fin 2, F d = ∑ x : Fin 2, ∑ y : Fin 2, F ![x, y] := by + rw [show (∑ d : Fin 2 → Fin 2, F d) = ∑ p : Fin 2 × Fin 2, F ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 2) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +/-- The antisymmetric symbol on a pair of `su(2)` fundamental indices: the Levi-Civita + symbol of `Fin 2`, written the way Physlib writes every Levi-Civita symbol, as the + generalized Kronecker delta of the pair against the identity. It is normalized so that + its value on the increasing pair is one. -/ +def epsilon (a b : Fin 2) : ℂ := + (KroneckerDelta.generalizedKroneckerDelta ![a, b] (id : Fin 2 → Fin 2) : ℤ) + +/-- The antisymmetric symbol vanishes on the repeated lower index. -/ +@[simp] lemma epsilon_zero_zero : epsilon 0 0 = 0 := by + simp [epsilon, KroneckerDelta.generalizedKroneckerDelta, Matrix.det_fin_two] + +/-- The antisymmetric symbol on the increasing pair. -/ +@[simp] lemma epsilon_zero_one : epsilon 0 1 = 1 := by + simp [epsilon, KroneckerDelta.generalizedKroneckerDelta, Matrix.det_fin_two] + +/-- The antisymmetric symbol on the decreasing pair. -/ +@[simp] lemma epsilon_one_zero : epsilon 1 0 = -1 := by + simp [epsilon, KroneckerDelta.generalizedKroneckerDelta, Matrix.det_fin_two] + +/-- The antisymmetric symbol vanishes on the repeated upper index. -/ +@[simp] lemma epsilon_one_one : epsilon 1 1 = 0 := by + simp [epsilon, KroneckerDelta.generalizedKroneckerDelta, Matrix.det_fin_two] + +/-- The antisymmetric symbol is invariant under the fundamental representation of an + element of `SU(2)`, because the determinant of an `SU(2)` matrix is one. This is the + whole `SU(2)` content of the section, and needs no mention of the gauge group. -/ +lemma sum_epsilon_mul (U : specialUnitaryGroup (Fin 2) ℂ) (b c : Fin 2) : + ∑ x : Fin 2, ∑ y : Fin 2, epsilon x y * (U.1 b x * U.1 c y) = epsilon b c := by + have hdet : U.1 0 0 * U.1 1 1 - U.1 0 1 * U.1 1 0 = 1 := by + rw [← Matrix.det_fin_two] + exact (Matrix.mem_specialUnitaryGroup_iff.mp U.2).2 + fin_cases b <;> fin_cases c <;> + simp only [Fin.zero_eta, Fin.mk_one, Fin.isValue, Fin.sum_univ_two, + epsilon_zero_zero, epsilon_zero_one, epsilon_one_zero, epsilon_one_one] + · ring + · linear_combination hdet + · linear_combination -hdet + · ring + +/-- The epsilon contraction of a bi-fundamental family: the antisymmetric contraction of + the two `su(2)` fundamental indices. -/ +def epsilonContraction (hT : IsSU2BiFundamental B repGauge T) : B := + T ![0, 1] - T ![1, 0] + +/-- The epsilon contraction written as a sum over all pairs of fundamental indices + weighted by the antisymmetric symbol. -/ +lemma epsilonContraction_eq_sum (hT : IsSU2BiFundamental B repGauge T) : + hT.epsilonContraction = ∑ d : Fin 2 → Fin 2, epsilon (d 0) (d 1) • T d := by + rw [sum_pi_two] + simp [epsilonContraction, Fin.sum_univ_two, sub_eq_add_neg] + +/-- The epsilon contraction lies in the span of the components. -/ +lemma epsilonContraction_mem_span (hT : IsSU2BiFundamental B repGauge T) : + hT.epsilonContraction ∈ hT.span := by + rw [epsilonContraction] + exact sub_mem (Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _)) + (Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _)) + +/-- The epsilon contraction of a bi-fundamental family is gauge invariant. -/ +lemma repGauge_epsilonContraction (hT : IsSU2BiFundamental B repGauge T) + (g : GaugeGroupI) : + repGauge g hT.epsilonContraction = hT.epsilonContraction := by + have step : repGauge g hT.epsilonContraction + = ∑ b : Fin 2 → Fin 2, epsilon (b 0) (b 1) • T b := by + rw [hT.epsilonContraction_eq_sum, map_sum] + have h1 : ∀ d : Fin 2 → Fin 2, repGauge g (epsilon (d 0) (d 1) • T d) + = ∑ b : Fin 2 → Fin 2, + (epsilon (d 0) (d 1) * ((GaugeGroupI.toSU2 g).1 (b 0) (d 0) * + (GaugeGroupI.toSU2 g).1 (b 1) (d 1))) • T b := by + intro d + rw [map_smul, hT.repGauge_T g d, Finset.smul_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [smul_smul, Fin.prod_univ_two] + simp only [h1] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + exact sum_epsilon_mul (GaugeGroupI.toSU2 g) (b 0) (b 1) + rw [step, ← hT.epsilonContraction_eq_sum] + +end IsSU2BiFundamental + +/-! + +## C. The gauge weight decomposition of the span + +Unlike the adjoint case, no change of basis is needed here. The gauge torus is diagonal +in the fundamental representation of the `SU(2)` factor, so the two basis doublet +directions are already weight vectors, with weights `+1` and `-1` in the isospin +normalization `2T₃`. A component `T d` therefore carries the definite weight `wtWeight d`, +the sum of the weights of its two indices, and the span of the components is already the +join of four weight lines. + +The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an +algebra and records multiplicativity of the representation, neither of which +`IsSU2BiFundamental` needs, so both appear as extra arguments here. + +-/ + +namespace IsSU2BiFundamental + +set_option linter.unusedVariables false + +/-! + +## C.1. The gauge torus in the fundamental representation + +-/ + +/-- The gauge weight carried by one `su(2)` fundamental index: weak isospin only, with + the two components of a doublet carrying `2T₃ = ±1`. -/ +def fundWeight (s : Fin 2) : GaugeWeight := (0, 0, isoWeight s, 0) + +/-- The gauge torus acts diagonally on a fundamental index, by the character of the + weight of that index. Only the isospin generator acts nontrivially. -/ +lemma toSU2_gaugeTorusGen_apply (i : Fin 4) (a b : Fin 2) : + (GaugeGroupI.toSU2 (gaugeTorusGen i)).1 a b + = if a = b then (expI : ℂ) ^ GaugeWeight.coord (fundWeight a) i else 0 := by + fin_cases i <;> fin_cases a <;> fin_cases b <;> + simp [gaugeTorusGen, GaugeGroupI.toSU2, su2ExpI_coe, fundWeight, isoWeight, + expI_inv_eq_star] + +/-- The gauge weight carried by a component of a bi-fundamental family: the sum of the + weights of its two indices. -/ +def wtWeight (l : Fin 2 → Fin 2) : GaugeWeight := fundWeight (l 0) + fundWeight (l 1) + +/-! + +## C.2. The components are weight vectors + +-/ + +section Weights + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 2) → B} + +/-- Every component of a bi-fundamental family is a simultaneous eigenvector of the gauge + torus, at the character of the sum of the weights of its two indices. -/ +lemma repGauge_gaugeTorusGen (hT : IsSU2BiFundamental B repGauge T) (l : Fin 2 → Fin 2) + (i : Fin 4) : + repGauge (gaugeTorusGen i) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by + rw [hT.repGauge_T (gaugeTorusGen i) l, Finset.sum_eq_single l] + · congr 1 + rw [Fin.prod_univ_two, toSU2_gaugeTorusGen_apply, toSU2_gaugeTorusGen_apply, + if_pos rfl, if_pos rfl, wtWeight, GaugeWeight.coord_add, + zpow_add₀ expI_ne_zero] + · intro a _ hal + have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by + by_contra hc + simp only [not_or, ne_eq, not_not] at hc + exact hal (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) + rw [Fin.prod_univ_two, toSU2_gaugeTorusGen_apply, toSU2_gaugeTorusGen_apply] + rcases h with h | h + · rw [if_neg h, zero_mul, zero_smul] + · rw [if_neg h, mul_zero, zero_smul] + · intro hl + exact absurd (Finset.mem_univ l) hl + +end Weights + +/-! + +## C.3. The decomposition + +-/ + +section Decomposition + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 2) → B} + +variable (hT : IsSU2BiFundamental B repGauge T) + +/-- The gauge weight decomposition of the span of a bi-fundamental `su(2)` family. The + span is the join of the lines through the four components, and each of those carries the + sum of the weights of its two indices. -/ +@[implicit_reducible] +noncomputable def gaugeWeightDecomposition (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hmul fun d : Fin 2 → Fin 2 => + GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) + (hT.repGauge_gaugeTorusGen d)) + _ rfl + +/-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through + those components whose weight is `w`. -/ +lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : + (hT.gaugeWeightDecomposition hmul).piece w + = ⨆ d : Fin 2 → Fin 2, (if w = wtWeight d then ℂ ∙ T d else ⊥) := rfl + +/-- The support of the decomposition, before evaluation. -/ +lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = Finset.univ.biUnion fun d : Fin 2 → Fin 2 => + ({wtWeight d} : Finset GaugeWeight) := rfl + +/-- The gauge weights carried by a bi-fundamental `su(2)` family: the three weights of the + tensor square of the `su(2)` fundamental. Every one of them has vanishing colour and + hypercharge, since the family carries weak isospin only. -/ +lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = {((0, 0, 2, 0) : GaugeWeight), (0, 0, 0, 0), (0, 0, -2, 0)} := by + rw [hT.gaugeWeightDecomposition_supp_eq hmul] + decide + +/-! + +## C.4. The zero-weight piece + +A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight +piece, which makes that piece worth describing explicitly. The weight of a component is +the sum of the isospin weights of its two indices, each `±1`, so it vanishes exactly when +the two indices differ. That leaves the two mixed components, and the zero-weight piece is +the plane they span, the multiplicity of the zero weight in the tensor square of the +`su(2)` fundamental. + +-/ + +/-- A component of a bi-fundamental family carries vanishing gauge weight precisely when + its two indices differ, the isospin weights `+1` and `-1` then cancelling. -/ +lemma wtWeight_eq_zero_iff (l : Fin 2 → Fin 2) : + wtWeight l = 0 ↔ l = ![0, 1] ∨ l = ![1, 0] := by + revert l + decide + +/-- The zero-weight piece of the gauge weight decomposition, explicitly: the plane spanned + by the two mixed components. -/ +lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).piece 0 = ℂ ∙ T ![0, 1] ⊔ ℂ ∙ T ![1, 0] := by + rw [hT.gaugeWeightDecomposition_piece hmul] + refine le_antisymm (iSup_le fun d => ?_) (sup_le ?_ ?_) + · split_ifs with hd + · rcases (wtWeight_eq_zero_iff d).1 hd.symm with rfl | rfl + · exact le_sup_left + · exact le_sup_right + · exact bot_le + · exact le_iSup_of_le ![0, 1] (le_of_eq (if_pos (by decide)).symm) + · exact le_iSup_of_le ![1, 0] (le_of_eq (if_pos (by decide)).symm) + +/-- The epsilon contraction lies in the zero-weight piece. It is gauge invariant, so in + particular the torus fixes it. -/ +lemma epsilonContraction_mem_piece_zero (hmul : IsMulRep repGauge) : + hT.epsilonContraction ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ hT.epsilonContraction_mem_span + hT.repGauge_epsilonContraction + +/-! + +## D. The `SU(2)` permutation decomposition of the zero-weight piece + +The gauge weight cannot separate the two mixed components: they carry the same weight, and +section C.4 leaves the zero-weight piece as the plane they span. The Weyl element of the +`SU(2)` factor does separate them. Its fundamental matrix `!![0, -1; 1, 0]` exchanges the +two doublet directions, so it exchanges the two mixed components and negates them, and its +eigenvectors on that plane are their antisymmetric combination, which is the epsilon +contraction, at eigenvalue `1`, and their symmetric combination, the neutral component of +the isospin triplet, at eigenvalue `-1`. + +The grading is therefore concentrated in the grades zero and two, as it must be for a +product of an even number of doublets. Grade zero is in general only a sieve, since +`SU2PermDecomposition.mem_zero_of_invariant` has no converse, but here the two gradings +together are sharp: the zero-weight piece is a plane and grade zero is a line in it, so +every gauge invariant in the span of the components is a multiple of the epsilon +contraction. The ten-dimensional zero-weight piece of `IsSU3BiAdjoint` is what a sieve +looks like when it is not sharp. + +-/ + +/-- The fundamental matrix of the Weyl element of the `SU(2)` factor, which exchanges the + two doublet directions and negates one of them. -/ +lemma toSU2_gaugeSU2Perm_apply (a b : Fin 2) : + (GaugeGroupI.toSU2 gaugeSU2Perm).1 a b = !![0, -1; 1, 0] a b := rfl + +/-- The Weyl element sends the first mixed component to minus the second. -/ +lemma repGauge_gaugeSU2Perm_zero_one (hT : IsSU2BiFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 1]) = -T ![1, 0] := by + rw [hT.repGauge_T gaugeSU2Perm ![0, 1], sum_pi_two] + simp [Fin.sum_univ_two, Fin.prod_univ_two, toSU2_gaugeSU2Perm_apply] + +/-- The Weyl element sends the second mixed component to minus the first. -/ +lemma repGauge_gaugeSU2Perm_one_zero (hT : IsSU2BiFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![1, 0]) = -T ![0, 1] := by + rw [hT.repGauge_T gaugeSU2Perm ![1, 0], sum_pi_two] + simp [Fin.sum_univ_two, Fin.prod_univ_two, toSU2_gaugeSU2Perm_apply] + +/-- The symmetric combination of the two mixed components: the neutral component of the + isospin triplet in the tensor square of the `su(2)` fundamental, and the partner of the + epsilon contraction under the Weyl element. -/ +def neutralTriplet (hT : IsSU2BiFundamental B repGauge T) : B := T ![0, 1] + T ![1, 0] + +/-- The Weyl element negates the neutral triplet combination, exchanging the two mixed + components and carrying a sign as it does so. -/ +lemma repGauge_gaugeSU2Perm_neutralTriplet : + repGauge gaugeSU2Perm hT.neutralTriplet = -hT.neutralTriplet := by + rw [neutralTriplet, map_add, hT.repGauge_gaugeSU2Perm_zero_one, + hT.repGauge_gaugeSU2Perm_one_zero] + abel + +/-- Replacing two elements by their antisymmetric and symmetric combinations spans the + same submodule, since two is invertible. -/ +lemma sup_span_sub_add (a b : B) : ℂ ∙ (a - b) ⊔ ℂ ∙ (a + b) = ℂ ∙ a ⊔ ℂ ∙ b := by + have hmem : ∀ x y : B, x ∈ ℂ ∙ x ⊔ ℂ ∙ y ∧ y ∈ ℂ ∙ x ⊔ ℂ ∙ y := fun x y => + ⟨Submodule.mem_sup_left (Submodule.mem_span_singleton_self _), + Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)⟩ + refine le_antisymm (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · exact sub_mem (hmem a b).1 (hmem a b).2 + · exact add_mem (hmem a b).1 (hmem a b).2 + · have h : (2⁻¹ : ℂ) • ((a - b) + (a + b)) ∈ ℂ ∙ (a - b) ⊔ ℂ ∙ (a + b) := + Submodule.smul_mem _ _ (add_mem (hmem (a - b) (a + b)).1 (hmem (a - b) (a + b)).2) + rwa [show (2⁻¹ : ℂ) • ((a - b) + (a + b)) = a from by module] at h + · have h : (2⁻¹ : ℂ) • ((a + b) - (a - b)) ∈ ℂ ∙ (a - b) ⊔ ℂ ∙ (a + b) := + Submodule.smul_mem _ _ (sub_mem (hmem (a - b) (a + b)).2 (hmem (a - b) (a + b)).1) + rwa [show (2⁻¹ : ℂ) • ((a + b) - (a - b)) = b from by module] at h + +/-- The epsilon contraction and the neutral triplet combination span the zero-weight + piece, being the antisymmetric and symmetric combinations of the two mixed components. -/ +lemma sup_span_epsilonContraction_neutralTriplet : + ℂ ∙ hT.epsilonContraction ⊔ ℂ ∙ hT.neutralTriplet + = ℂ ∙ T ![0, 1] ⊔ ℂ ∙ T ![1, 0] := + sup_span_sub_add _ _ + +/-- The grade `k` piece of the `SU(2)` permutation decomposition of the zero-weight piece: + the epsilon contraction in grade zero, the neutral triplet combination in grade two, and + nothing in the odd grades, which carry the odd-degree terms alone. -/ +noncomputable def zeroPiece (hT : IsSU2BiFundamental B repGauge T) (k : ZMod 4) : + Submodule ℂ B := + if k = 0 then ℂ ∙ hT.epsilonContraction + else if k = 2 then ℂ ∙ hT.neutralTriplet else ⊥ + +/-- The grade zero piece: the line through the epsilon contraction. -/ +@[simp] lemma zeroPiece_zero : hT.zeroPiece 0 = ℂ ∙ hT.epsilonContraction := by + rw [zeroPiece, if_pos rfl] + +/-- The grade one piece is empty. -/ +@[simp] lemma zeroPiece_one : hT.zeroPiece 1 = ⊥ := by + rw [zeroPiece, if_neg (by decide), if_neg (by decide)] + +/-- The grade two piece: the line through the neutral triplet combination. -/ +@[simp] lemma zeroPiece_two : hT.zeroPiece 2 = ℂ ∙ hT.neutralTriplet := by + rw [zeroPiece, if_neg (by decide), if_pos rfl] + +/-- The grade three piece is empty. -/ +@[simp] lemma zeroPiece_three : hT.zeroPiece 3 = ⊥ := by + rw [zeroPiece, if_neg (by decide), if_neg (by decide)] + +/-- Each graded piece is of pure sign under the Weyl element. -/ +lemma zeroPiece_le_eigenspace (k : ZMod 4) : + hT.zeroPiece k ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) (su2PermSign k) := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + rcases hcases k with rfl | rfl | rfl | rfl + · rw [hT.zeroPiece_zero, Submodule.span_singleton_le_iff_mem] + exact Module.End.mem_eigenspace_iff.mpr + (by rw [su2PermSign_zero, one_smul, hT.repGauge_epsilonContraction]) + · rw [hT.zeroPiece_one] + exact bot_le + · rw [hT.zeroPiece_two, Submodule.span_singleton_le_iff_mem] + exact Module.End.mem_eigenspace_iff.mpr + (by rw [su2PermSign_two, neg_one_smul, hT.repGauge_gaugeSU2Perm_neutralTriplet]) + · rw [hT.zeroPiece_three] + exact bot_le + +/-- The graded pieces exhaust the zero-weight piece. -/ +lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : + (⨆ k : ZMod 4, hT.zeroPiece k) = (hT.gaugeWeightDecomposition hmul).piece 0 := by + rw [hT.gaugeWeightDecomposition_piece_zero hmul, + ← hT.sup_span_epsilonContraction_neutralTriplet] + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) (sup_le ?_ ?_) + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [hT.zeroPiece_zero] + exact le_sup_left + · rw [hT.zeroPiece_one] + exact bot_le + · rw [hT.zeroPiece_two] + exact le_sup_right + · rw [hT.zeroPiece_three] + exact bot_le + · exact le_iSup_of_le 0 (le_of_eq hT.zeroPiece_zero.symm) + · exact le_iSup_of_le 2 (le_of_eq hT.zeroPiece_two.symm) + +/-- The `SU(2)` permutation decomposition of the zero-weight piece of the gauge weight + decomposition: the Weyl element grades the plane the gauge weight cannot split, putting + the epsilon contraction in grade zero and the neutral triplet combination in grade + two. -/ +noncomputable def zeroPieceSU2Perm (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) : + SU2PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) where + piece := hT.zeroPiece + piece_le k x hx := Module.End.mem_eigenspace_iff.mp (hT.zeroPiece_le_eigenspace k hx) + iSup_piece := hT.iSup_zeroPiece hmul + +/-- The pieces of the decomposition are the graded pieces. -/ +@[simp] lemma zeroPieceSU2Perm_piece (hmul : IsMulRep repGauge) (k : ZMod 4) : + (hT.zeroPieceSU2Perm hmul).piece k = hT.zeroPiece k := rfl + +/-- The epsilon contraction lies in the grade zero piece: it is gauge invariant, so in + particular the Weyl element fixes it. -/ +lemma epsilonContraction_mem_zeroPiece_zero (hmul : IsMulRep repGauge) : + hT.epsilonContraction ∈ hT.zeroPiece 0 := + SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) + (hT.epsilonContraction_mem_piece_zero hmul) hT.repGauge_epsilonContraction + +/-- Every gauge invariant in the span of the components is a multiple of the epsilon + contraction. The gauge weight cuts the span down to the plane of the two mixed + components, and the Weyl element cuts that plane down to the line through their + antisymmetric combination. -/ +lemma exists_smul_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, x = c • hT.epsilonContraction := by + have hmem : x ∈ hT.zeroPiece 0 := + SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv + rw [hT.zeroPiece_zero] at hmem + obtain ⟨c, hc⟩ := Submodule.mem_span_singleton.1 hmem + exact ⟨c, hc.symm⟩ + +end Decomposition + +end IsSU2BiFundamental + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean new file mode 100644 index 000000000..58412af9b --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean @@ -0,0 +1,966 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental +/-! +# Gauge tensors carrying four `su(2)` fundamental indices + +`IsSU2QuadFundamental B repGauge T` says that a family `T`, indexed by four `su(2)` +fundamental indices and valued in a module `B` carrying a representation of the gauge +group `GaugeGroupI`, transforms as a tensor `T^{a₁ a₂ a₃ a₄}` in the `su(2)` factor of the +fundamental representation. + +This is the four-index analogue of `IsSU2BiFundamental`, whose antisymmetric symbol and +proof of its invariance are used here rather than repeated. A conjugate Higgs symbol +carries one `su(2)` fundamental index, so a product of four of them is such a family, and +the quartic sector of `IsHiggsSector` runs the argument below in that special case. Nothing +here mentions the Higgs: every statement is about an arbitrary family with four fundamental +indices. + +Two indices admit one contraction; four admit three, one for each way of pairing the +indices off. They do not span a three-dimensional space of contractions. The Schouten +identity, which says that antisymmetrizing three indices of a two-dimensional space +vanishes, gives one linear relation between the three, so exactly two of them are +independent, and the third is the difference of the other two. + +Section A gives the proposition, the span of its components, and the way a linear +combination of the components transforms. Section B builds the three double epsilon +contractions, proves each gauge invariant, and proves the Schouten relation between them. +Section C is the gauge weight decomposition of the span, whose zero-weight piece is the +join of the six lines through the components with two indices of each value. Section D +grades that piece by the Weyl element of the `SU(2)` factor, leaving a grade zero spanned +by three symmetric combinations. +Section E removes the one direction that survives both gradings, the neutral state of the +isospin-two multiplet, by averaging over the cyclic group generated by a third of a turn +about the diagonal isospin axis, and so cuts the invariants down to the plane spanned by +two of the epsilon contractions. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix +open IsSU2BiFundamental (epsilon sum_epsilon_mul fundWeight) +open IsSU2BiFundamental (toSU2_gaugeTorusGen_apply toSU2_gaugeSU2Perm_apply) +open IsSU2BiFundamental (sup_span_sub_add) + +/-! + +## A. Quad-fundamental `su(2)` families and the span of their components + +The transformation law carries one factor of the fundamental matrix `GaugeGroupI.toSU2 g` +per index, with the summed index in the row slot, exactly as in `IsSU2BiFundamental`. Since +`toSU2` is a monoid homomorphism this is an action, and it is the `SU(2)` factor alone. + +The element `g` still ranges over the whole of `GaugeGroupI`, and that asymmetry is what +makes the proposition say more than a statement about `SU(2)` would. The right-hand side +sees only `GaugeGroupI.toSU2 g`, so taking `g` in the colour or hypercharge factor forces +that factor to fix every component; section C reads that off as the vanishing of the colour +and hypercharge coordinates of every weight. `GaugeWeightDecomposition` is in any case +stated for representations of `GaugeGroupI`, which a bare `SU(2)` representation cannot +supply. + +Everything after section A is phrased through `repGauge_sum`, which says how a linear +combination of the components transforms: the coefficients move by the fourfold tensor +power of the fundamental matrix, and the components stay where they are. Each later +statement is then a statement about coefficient families, which are functions to `ℂ` and so +can be computed with. + +-/ + +/-- A family `T` of elements of `B`, indexed by four `su(2)` fundamental indices, + transforms as a tensor `T^{a₁ a₂ a₃ a₄}` under the representation `repGauge` of the gauge + group. -/ +structure IsSU2QuadFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 4 → Fin 2) → B) : Prop where + repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 4 → Fin 2), + repGauge g (T l) = ∑ a : Fin 4 → Fin 2, + (∏ i : Fin 4, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a + +TODO (lines := 82-85) "This should just be about the action of + the SU(2) part, along with the rest of the content of this file." + +namespace IsSU2QuadFundamental +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) + +/-- The span of all the components. -/ +def span (hT : IsSU2QuadFundamental B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 4 → Fin 2) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 4 → Fin 2) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-- Every component lies in the span. -/ +lemma mem_span (d : Fin 4 → Fin 2) : T d ∈ hT.span := + Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) + +/-- A sum over families of four `su(2)` fundamental indices is a fourfold sum. -/ +lemma sum_pi_four {M : Type*} [AddCommMonoid M] (F : (Fin 4 → Fin 2) → M) : + ∑ d : Fin 4 → Fin 2, F d + = ∑ x : Fin 2, ∑ y : Fin 2, ∑ z : Fin 2, ∑ w : Fin 2, F ![x, y, z, w] := by + rw [show (∑ d : Fin 4 → Fin 2, F d) + = ∑ p : Fin 2 × Fin 2 × Fin 2 × Fin 2, F ![p.1, p.2.1, p.2.2.1, p.2.2.2] from + Fintype.sum_equiv + { toFun := fun d => (d 0, d 1, d 2, d 3) + invFun := fun p => ![p.1, p.2.1, p.2.2.1, p.2.2.2] + left_inv := fun d => by funext i; fin_cases i <;> simp + right_inv := fun p => by simp } _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp] + simp only [Fintype.sum_prod_type] + +/-- A gauge transformation moves a linear combination of the components to the combination + whose coefficients have been moved by the fourfold tensor power of the fundamental + matrix. -/ +lemma repGauge_sum (hT : IsSU2QuadFundamental B repGauge T) (g : GaugeGroupI) + (c : (Fin 4 → Fin 2) → ℂ) : + repGauge g (∑ l : Fin 4 → Fin 2, c l • T l) + = ∑ a : Fin 4 → Fin 2, + (∑ l : Fin 4 → Fin 2, c l * ∏ i, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a := by + rw [map_sum] + have h1 : ∀ l : Fin 4 → Fin 2, repGauge g (c l • T l) + = ∑ a : Fin 4 → Fin 2, + (c l * ∏ i, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a := by + intro l + rw [map_smul, hT.repGauge_T g l, Finset.smul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [smul_smul] + simp only [h1] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul] + +/-- A linear combination of the components whose coefficient family is fixed by every + `SU(2)` matrix is gauge invariant. -/ +lemma repGauge_sum_eq_self (hT : IsSU2QuadFundamental B repGauge T) + (c : (Fin 4 → Fin 2) → ℂ) + (hc : ∀ (U : specialUnitaryGroup (Fin 2) ℂ) (a : Fin 4 → Fin 2), + ∑ l : Fin 4 → Fin 2, c l * ∏ i, U.1 (a i) (l i) = c a) + (g : GaugeGroupI) : + repGauge g (∑ l : Fin 4 → Fin 2, c l • T l) = ∑ l : Fin 4 → Fin 2, c l • T l := by + rw [hT.repGauge_sum g c] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [hc (GaugeGroupI.toSU2 g) a] + +/-! + +## B. The three epsilon pairings + +A doublet index has nowhere to be contracted against another doublet index except through +the antisymmetric symbol, so a contraction of four doublet indices is a choice of a pairing +of the four. There are three such pairings, and hence three double contractions. The symbol +and its invariance are those of `IsSU2BiFundamental`: the invariance is the statement that +the determinant of an `SU(2)` matrix is one, and it needs no mention of the gauge group. + +The three contractions are not independent. Antisymmetrizing three indices of a +two-dimensional space gives zero, and writing that out is the Schouten identity, one linear +relation holding pointwise in the four indices. Two of the three pairings are therefore +independent, and the third is the difference of the other two. Section E shows that these +two exhaust the gauge invariants in the span of the components, so the count here is sharp. + +-/ + +/-- The coefficient family of the contraction pairing the first index with the second and + the third with the fourth. -/ +def epsilonPair₁₂ (l : Fin 4 → Fin 2) : ℂ := epsilon (l 0) (l 1) * epsilon (l 2) (l 3) + +/-- The coefficient family of the contraction pairing the first index with the third and + the second with the fourth. -/ +def epsilonPair₁₃ (l : Fin 4 → Fin 2) : ℂ := epsilon (l 0) (l 2) * epsilon (l 1) (l 3) + +/-- The coefficient family of the contraction pairing the first index with the fourth and + the second with the third. -/ +def epsilonPair₁₄ (l : Fin 4 → Fin 2) : ℂ := epsilon (l 0) (l 3) * epsilon (l 1) (l 2) + +/-- The Schouten identity: antisymmetrizing three indices of a two-dimensional space gives + zero, which written out is a linear relation between the three ways of pairing four + indices off. -/ +lemma epsilon_schouten (a b c d : Fin 2) : + epsilon a b * epsilon c d - epsilon a c * epsilon b d + epsilon a d * epsilon b c = 0 := by + fin_cases a <;> fin_cases b <;> fin_cases c <;> fin_cases d <;> norm_num + +/-- The third pairing is the difference of the other two, pointwise in the four indices. -/ +lemma epsilonPair₁₄_eq (l : Fin 4 → Fin 2) : + epsilonPair₁₄ l = epsilonPair₁₃ l - epsilonPair₁₂ l := by + have h := epsilon_schouten (l 0) (l 1) (l 2) (l 3) + rw [epsilonPair₁₄, epsilonPair₁₃, epsilonPair₁₂] + linear_combination h + +/-- The first two pairings are linearly independent as coefficient families, each + vanishing on a family of indices where the other takes the value one. With the Schouten + relation this pins the span of the three pairings down to a plane. -/ +lemma epsilonPair_linearIndependent : + LinearIndependent ℂ ![epsilonPair₁₂, epsilonPair₁₃] := by + rw [LinearIndependent.pair_iff] + intro s t hst + have h1 := congrFun hst ![0, 1, 0, 1] + have h2 := congrFun hst ![0, 0, 1, 1] + simp only [Pi.add_apply, Pi.smul_apply, Pi.zero_apply, smul_eq_mul, epsilonPair₁₂, + epsilonPair₁₃, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons, + IsSU2BiFundamental.epsilon_zero_zero, IsSU2BiFundamental.epsilon_zero_one, + IsSU2BiFundamental.epsilon_one_one] at h1 h2 + constructor + · linear_combination h1 + · linear_combination h2 + +/-- The first pairing is invariant under the fundamental representation of an `SU(2)` + element: the sum over the four indices factors into the two epsilon contractions, each of + which is invariant. -/ +lemma sum_epsilonPair₁₂_mul (U : specialUnitaryGroup (Fin 2) ℂ) (a : Fin 4 → Fin 2) : + ∑ l : Fin 4 → Fin 2, epsilonPair₁₂ l * ∏ i, U.1 (a i) (l i) = epsilonPair₁₂ a := by + have key : ∑ l : Fin 4 → Fin 2, epsilonPair₁₂ l * ∏ i, U.1 (a i) (l i) + = (∑ x : Fin 2, ∑ y : Fin 2, epsilon x y * (U.1 (a 0) x * U.1 (a 1) y)) + * (∑ z : Fin 2, ∑ w : Fin 2, epsilon z w * (U.1 (a 2) z * U.1 (a 3) w)) := by + rw [sum_pi_four] + simp only [epsilonPair₁₂, Fin.prod_univ_four, Fin.sum_univ_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] + ring + rw [key, sum_epsilon_mul, sum_epsilon_mul, epsilonPair₁₂] + +/-- The second pairing is invariant under the fundamental representation of an `SU(2)` + element, by the same factorization with the indices interleaved. -/ +lemma sum_epsilonPair₁₃_mul (U : specialUnitaryGroup (Fin 2) ℂ) (a : Fin 4 → Fin 2) : + ∑ l : Fin 4 → Fin 2, epsilonPair₁₃ l * ∏ i, U.1 (a i) (l i) = epsilonPair₁₃ a := by + have key : ∑ l : Fin 4 → Fin 2, epsilonPair₁₃ l * ∏ i, U.1 (a i) (l i) + = (∑ x : Fin 2, ∑ z : Fin 2, epsilon x z * (U.1 (a 0) x * U.1 (a 2) z)) + * (∑ y : Fin 2, ∑ w : Fin 2, epsilon y w * (U.1 (a 1) y * U.1 (a 3) w)) := by + rw [sum_pi_four] + simp only [epsilonPair₁₃, Fin.prod_univ_four, Fin.sum_univ_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] + ring + rw [key, sum_epsilon_mul, sum_epsilon_mul, epsilonPair₁₃] + +/-- The third pairing is invariant under the fundamental representation of an `SU(2)` + element. -/ +lemma sum_epsilonPair₁₄_mul (U : specialUnitaryGroup (Fin 2) ℂ) (a : Fin 4 → Fin 2) : + ∑ l : Fin 4 → Fin 2, epsilonPair₁₄ l * ∏ i, U.1 (a i) (l i) = epsilonPair₁₄ a := by + have key : ∑ l : Fin 4 → Fin 2, epsilonPair₁₄ l * ∏ i, U.1 (a i) (l i) + = (∑ x : Fin 2, ∑ w : Fin 2, epsilon x w * (U.1 (a 0) x * U.1 (a 3) w)) + * (∑ y : Fin 2, ∑ z : Fin 2, epsilon y z * (U.1 (a 1) y * U.1 (a 2) z)) := by + rw [sum_pi_four] + simp only [epsilonPair₁₄, Fin.prod_univ_four, Fin.sum_univ_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] + ring + rw [key, sum_epsilon_mul, sum_epsilon_mul, epsilonPair₁₄] + +/-- The contraction pairing the first index with the second and the third with the + fourth. -/ +def epsilonContraction₁₂ (hT : IsSU2QuadFundamental B repGauge T) : B := + T ![0, 1, 0, 1] - T ![0, 1, 1, 0] - T ![1, 0, 0, 1] + T ![1, 0, 1, 0] + +/-- The contraction pairing the first index with the third and the second with the + fourth. -/ +def epsilonContraction₁₃ (hT : IsSU2QuadFundamental B repGauge T) : B := + T ![0, 0, 1, 1] - T ![0, 1, 1, 0] - T ![1, 0, 0, 1] + T ![1, 1, 0, 0] + +/-- The contraction pairing the first index with the fourth and the second with the + third. -/ +def epsilonContraction₁₄ (hT : IsSU2QuadFundamental B repGauge T) : B := + T ![0, 0, 1, 1] - T ![0, 1, 0, 1] - T ![1, 0, 1, 0] + T ![1, 1, 0, 0] + +/-- The first contraction written as a sum over all families of four fundamental indices + weighted by its pairing. -/ +lemma epsilonContraction₁₂_eq_sum (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₂ = ∑ l : Fin 4 → Fin 2, epsilonPair₁₂ l • T l := by + rw [sum_pi_four] + simp [epsilonContraction₁₂, epsilonPair₁₂, Fin.sum_univ_two] + abel + +/-- The second contraction written as a sum over all families of four fundamental indices + weighted by its pairing. -/ +lemma epsilonContraction₁₃_eq_sum (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₃ = ∑ l : Fin 4 → Fin 2, epsilonPair₁₃ l • T l := by + rw [sum_pi_four] + simp [epsilonContraction₁₃, epsilonPair₁₃, Fin.sum_univ_two] + abel + +/-- The third contraction written as a sum over all families of four fundamental indices + weighted by its pairing. -/ +lemma epsilonContraction₁₄_eq_sum (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₄ = ∑ l : Fin 4 → Fin 2, epsilonPair₁₄ l • T l := by + rw [sum_pi_four] + simp [epsilonContraction₁₄, epsilonPair₁₄, Fin.sum_univ_two] + abel + +/-- The first contraction is gauge invariant. -/ +lemma repGauge_epsilonContraction₁₂ (hT : IsSU2QuadFundamental B repGauge T) + (g : GaugeGroupI) : + repGauge g hT.epsilonContraction₁₂ = hT.epsilonContraction₁₂ := by + rw [hT.epsilonContraction₁₂_eq_sum] + exact hT.repGauge_sum_eq_self _ sum_epsilonPair₁₂_mul g + +/-- The second contraction is gauge invariant. -/ +lemma repGauge_epsilonContraction₁₃ (hT : IsSU2QuadFundamental B repGauge T) + (g : GaugeGroupI) : + repGauge g hT.epsilonContraction₁₃ = hT.epsilonContraction₁₃ := by + rw [hT.epsilonContraction₁₃_eq_sum] + exact hT.repGauge_sum_eq_self _ sum_epsilonPair₁₃_mul g + +/-- The third contraction is gauge invariant. -/ +lemma repGauge_epsilonContraction₁₄ (hT : IsSU2QuadFundamental B repGauge T) + (g : GaugeGroupI) : + repGauge g hT.epsilonContraction₁₄ = hT.epsilonContraction₁₄ := by + rw [hT.epsilonContraction₁₄_eq_sum] + exact hT.repGauge_sum_eq_self _ sum_epsilonPair₁₄_mul g + +/-- The Schouten relation between the three contractions: the third is the difference of + the other two, so the three span a plane and not a three-dimensional space. -/ +lemma epsilonContraction₁₄_eq_sub (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₄ = hT.epsilonContraction₁₃ - hT.epsilonContraction₁₂ := by + rw [epsilonContraction₁₄, epsilonContraction₁₃, epsilonContraction₁₂] + abel + +/-- The first contraction lies in the span of the components. -/ +lemma epsilonContraction₁₂_mem_span (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₂ ∈ hT.span := by + rw [epsilonContraction₁₂] + exact add_mem (sub_mem (sub_mem (hT.mem_span _) (hT.mem_span _)) (hT.mem_span _)) + (hT.mem_span _) + +/-- The second contraction lies in the span of the components. -/ +lemma epsilonContraction₁₃_mem_span (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₃ ∈ hT.span := by + rw [epsilonContraction₁₃] + exact add_mem (sub_mem (sub_mem (hT.mem_span _) (hT.mem_span _)) (hT.mem_span _)) + (hT.mem_span _) + +/-- The third contraction lies in the span of the components. -/ +lemma epsilonContraction₁₄_mem_span (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₄ ∈ hT.span := by + rw [epsilonContraction₁₄] + exact add_mem (sub_mem (sub_mem (hT.mem_span _) (hT.mem_span _)) (hT.mem_span _)) + (hT.mem_span _) + +end IsSU2QuadFundamental + +/-! + +## C. The gauge weight decomposition of the span + +No change of basis is needed. The gauge torus is diagonal in the fundamental representation +of the `SU(2)` factor, so the two basis doublet directions are already weight vectors, with +weights `+1` and `-1` in the isospin normalization `2T₃`. A component `T d` therefore +carries the definite weight `wtWeight d`, the sum of the weights of its four indices, and +the span of the components is already the join of sixteen weight lines. + +The weights that occur are those of the fourth tensor power of the `su(2)` fundamental, +`±4`, `±2` and `0` in isospin, with vanishing colour and hypercharge. The zero-weight piece +is spanned by the six components carrying two indices of each value, the multiplicity of +the zero weight in that tensor power. + +The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an +algebra and records multiplicativity of the representation, neither of which +`IsSU2QuadFundamental` needs, so both appear as extra arguments here. + +-/ + +namespace IsSU2QuadFundamental + +set_option linter.unusedVariables false + +/-! + +## C.1. The gauge torus in the fundamental representation + +-/ + +/-- The gauge torus acts on a fundamental index by the character of the weight of that + index, the off-diagonal entries vanishing. -/ +lemma toSU2_gaugeTorusGen_diag (i : Fin 4) (a : Fin 2) : + (GaugeGroupI.toSU2 (gaugeTorusGen i)).1 a a + = (expI : ℂ) ^ GaugeWeight.coord (fundWeight a) i := by + rw [toSU2_gaugeTorusGen_apply, if_pos rfl] + +/-- The gauge weight carried by a component of a quad-fundamental family: the sum of the + weights of its four indices. -/ +def wtWeight (l : Fin 4 → Fin 2) : GaugeWeight := + fundWeight (l 0) + fundWeight (l 1) + fundWeight (l 2) + fundWeight (l 3) + +/-! + +## C.2. The components are weight vectors + +-/ + +section Weights + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 4 → Fin 2) → B} + +/-- Every component of a quad-fundamental family is a simultaneous eigenvector of the gauge + torus, at the character of the sum of the weights of its four indices. -/ +lemma repGauge_gaugeTorusGen (hT : IsSU2QuadFundamental B repGauge T) (l : Fin 4 → Fin 2) + (i : Fin 4) : + repGauge (gaugeTorusGen i) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by + rw [hT.repGauge_T (gaugeTorusGen i) l, Finset.sum_eq_single l] + · congr 1 + simp only [Fin.prod_univ_four, toSU2_gaugeTorusGen_diag, wtWeight, + GaugeWeight.coord_add] + rw [zpow_add₀ expI_ne_zero, zpow_add₀ expI_ne_zero, zpow_add₀ expI_ne_zero] + · intro a _ hal + obtain ⟨j, hj⟩ := Function.ne_iff.1 hal + rw [Finset.prod_eq_zero (Finset.mem_univ j) + (by rw [toSU2_gaugeTorusGen_apply, if_neg hj]), zero_smul] + · intro hl + exact absurd (Finset.mem_univ l) hl + +end Weights + +/-! + +## C.3. The decomposition + +-/ + +section Decomposition + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 4 → Fin 2) → B} + +variable (hT : IsSU2QuadFundamental B repGauge T) + +/-- The gauge weight decomposition of the span of a quad-fundamental `su(2)` family. The + span is the join of the lines through the sixteen components, and each of those carries + the sum of the weights of its four indices. -/ +@[implicit_reducible] +noncomputable def gaugeWeightDecomposition (hT : IsSU2QuadFundamental B repGauge T) + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hmul fun d : Fin 4 → Fin 2 => + GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) + (hT.repGauge_gaugeTorusGen d)) + _ rfl + +/-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through + those components whose weight is `w`. -/ +lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : + (hT.gaugeWeightDecomposition hmul).piece w + = ⨆ d : Fin 4 → Fin 2, (if w = wtWeight d then ℂ ∙ T d else ⊥) := rfl + +/-- The support of the decomposition, before evaluation. -/ +lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = Finset.univ.biUnion fun d : Fin 4 → Fin 2 => + ({wtWeight d} : Finset GaugeWeight) := rfl + +/-- The gauge weights carried by a quad-fundamental `su(2)` family: the five weights of the + fourth tensor power of the `su(2)` fundamental. Every one of them has vanishing colour + and hypercharge, since the family carries weak isospin only. -/ +lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = {((0, 0, 4, 0) : GaugeWeight), (0, 0, 2, 0), (0, 0, 0, 0), (0, 0, -2, 0), + (0, 0, -4, 0)} := by + rw [hT.gaugeWeightDecomposition_supp_eq hmul] + decide + +/-! + +## C.4. The zero-weight piece + +A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight +piece, which makes that piece worth describing explicitly. The weight of a component is the +sum of the isospin weights of its four indices, each `±1`, so it vanishes exactly when two +of the indices are `0` and two are `1`. That leaves six components, and the zero-weight +piece is the join of the six lines through them. + +-/ + +/-- A component of a quad-fundamental family carries vanishing gauge weight precisely when + two of its indices are `0` and two are `1`, the isospin weights then cancelling in + pairs. -/ +lemma wtWeight_eq_zero_iff (l : Fin 4 → Fin 2) : + wtWeight l = 0 ↔ l = ![0, 0, 1, 1] ∨ l = ![1, 1, 0, 0] ∨ l = ![0, 1, 0, 1] + ∨ l = ![1, 0, 1, 0] ∨ l = ![0, 1, 1, 0] ∨ l = ![1, 0, 0, 1] := by + revert l + decide + +/-- The zero-weight piece of the gauge weight decomposition, explicitly: the join of the + six lines through the components with two indices of each value, grouped into the three + pairs that the Weyl element of section D exchanges. -/ +lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).piece 0 + = ((ℂ ∙ T ![0, 0, 1, 1] ⊔ ℂ ∙ T ![1, 1, 0, 0]) + ⊔ (ℂ ∙ T ![0, 1, 0, 1] ⊔ ℂ ∙ T ![1, 0, 1, 0])) + ⊔ (ℂ ∙ T ![0, 1, 1, 0] ⊔ ℂ ∙ T ![1, 0, 0, 1]) := by + rw [hT.gaugeWeightDecomposition_piece hmul] + refine le_antisymm (iSup_le fun d => ?_) (sup_le (sup_le (sup_le ?_ ?_) + (sup_le ?_ ?_)) (sup_le ?_ ?_)) + · split_ifs with hd + · rcases (wtWeight_eq_zero_iff d).1 hd.symm with rfl | rfl | rfl | rfl | rfl | rfl + · exact le_sup_of_le_left (le_sup_of_le_left le_sup_left) + · exact le_sup_of_le_left (le_sup_of_le_left le_sup_right) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_left) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_right) + · exact le_sup_of_le_right le_sup_left + · exact le_sup_of_le_right le_sup_right + · exact bot_le + · exact le_iSup_of_le ![0, 0, 1, 1] (le_of_eq (if_pos (by decide)).symm) + · exact le_iSup_of_le ![1, 1, 0, 0] (le_of_eq (if_pos (by decide)).symm) + · exact le_iSup_of_le ![0, 1, 0, 1] (le_of_eq (if_pos (by decide)).symm) + · exact le_iSup_of_le ![1, 0, 1, 0] (le_of_eq (if_pos (by decide)).symm) + · exact le_iSup_of_le ![0, 1, 1, 0] (le_of_eq (if_pos (by decide)).symm) + · exact le_iSup_of_le ![1, 0, 0, 1] (le_of_eq (if_pos (by decide)).symm) + +/-- The first contraction lies in the zero-weight piece. It is gauge invariant, so in + particular the torus fixes it. -/ +lemma epsilonContraction₁₂_mem_piece_zero (hmul : IsMulRep repGauge) : + hT.epsilonContraction₁₂ ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ hT.epsilonContraction₁₂_mem_span + hT.repGauge_epsilonContraction₁₂ + +/-- The second contraction lies in the zero-weight piece. -/ +lemma epsilonContraction₁₃_mem_piece_zero (hmul : IsMulRep repGauge) : + hT.epsilonContraction₁₃ ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ hT.epsilonContraction₁₃_mem_span + hT.repGauge_epsilonContraction₁₃ + +/-! + +## D. The `SU(2)` permutation decomposition of the zero-weight piece + +The gauge weight cannot separate the six zero-weight components: they all carry the same +weight. The Weyl element of the `SU(2)` factor separates them into three pairs. Its +fundamental matrix `!![0, -1; 1, 0]` exchanges the two doublet directions and carries a +sign with each `1` it meets, and a zero-weight component meets two of them, so the two +signs cancel and the Weyl element simply exchanges each component with the one obtained by +flipping all four of its indices. + +Each of the three pairs is therefore graded into a grade-zero symmetric combination and a +grade-two antisymmetric one, and the grading of the whole zero-weight piece is the join of +the three. The grading is concentrated in the grades zero and two, as it must be for an +even number of doublet indices, and grade zero is the join of the three symmetric +combinations. Two of the three epsilon contractions are differences of those, so the sieve +is not yet sharp; section E closes the gap. + +-/ + +/-- The Weyl grading of the plane spanned by a pair of vectors that the Weyl element + exchanges: their sum has grade zero and their difference grade two. -/ +noncomputable def swapPairSU2Perm {u v : B} (huv : repGauge gaugeSU2Perm u = v) + (hvu : repGauge gaugeSU2Perm v = u) : + SU2PermDecomposition repGauge (ℂ ∙ u ⊔ ℂ ∙ v) where + piece k := if k = 0 then ℂ ∙ (u + v) else if k = 2 then ℂ ∙ (u - v) else ⊥ + piece_le := by + intro k z hz + rcases eq_or_ne k 0 with rfl | hk0 + · rw [if_pos rfl] at hz + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.mp hz + rw [map_smul, map_add, huv, hvu, su2PermSign_zero] + module + · rcases eq_or_ne k 2 with rfl | hk2 + · rw [if_neg hk0, if_pos rfl] at hz + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.mp hz + rw [map_smul, map_sub, huv, hvu, su2PermSign_two] + module + · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hz + subst hz + simp + iSup_piece := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) ?_ + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [if_pos rfl, Submodule.span_singleton_le_iff_mem] + exact add_mem (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [if_neg (by decide), if_pos rfl, Submodule.span_singleton_le_iff_mem] + exact sub_mem (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [← sup_span_sub_add u v] + refine sup_le (le_iSup_of_le 2 (le_of_eq ?_)) (le_iSup_of_le 0 (le_of_eq ?_)) + · rw [if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl] + · rw [if_pos rfl] + +/-- The Weyl element exchanges the two components of the first zero-weight pair. -/ +lemma repGauge_gaugeSU2Perm_fst₁ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 0, 1, 1]) = T ![1, 1, 0, 0] := by + rw [hT.repGauge_T gaugeSU2Perm ![0, 0, 1, 1], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] + +/-- The Weyl element exchanges the two components of the first zero-weight pair, the other + way round. -/ +lemma repGauge_gaugeSU2Perm_snd₁ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![1, 1, 0, 0]) = T ![0, 0, 1, 1] := by + rw [hT.repGauge_T gaugeSU2Perm ![1, 1, 0, 0], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] + +/-- The Weyl element exchanges the two components of the second zero-weight pair. -/ +lemma repGauge_gaugeSU2Perm_fst₂ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 1, 0, 1]) = T ![1, 0, 1, 0] := by + rw [hT.repGauge_T gaugeSU2Perm ![0, 1, 0, 1], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] + +/-- The Weyl element exchanges the two components of the second zero-weight pair, the other + way round. -/ +lemma repGauge_gaugeSU2Perm_snd₂ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![1, 0, 1, 0]) = T ![0, 1, 0, 1] := by + rw [hT.repGauge_T gaugeSU2Perm ![1, 0, 1, 0], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] + +/-- The Weyl element exchanges the two components of the third zero-weight pair. -/ +lemma repGauge_gaugeSU2Perm_fst₃ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 1, 1, 0]) = T ![1, 0, 0, 1] := by + rw [hT.repGauge_T gaugeSU2Perm ![0, 1, 1, 0], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] + +/-- The Weyl element exchanges the two components of the third zero-weight pair, the other + way round. -/ +lemma repGauge_gaugeSU2Perm_snd₃ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![1, 0, 0, 1]) = T ![0, 1, 1, 0] := by + rw [hT.repGauge_T gaugeSU2Perm ![1, 0, 0, 1], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] + +/-- The symmetric combination of the first zero-weight pair. -/ +def symComb₁ (hT : IsSU2QuadFundamental B repGauge T) : B := + T ![0, 0, 1, 1] + T ![1, 1, 0, 0] + +/-- The symmetric combination of the second zero-weight pair. -/ +def symComb₂ (hT : IsSU2QuadFundamental B repGauge T) : B := + T ![0, 1, 0, 1] + T ![1, 0, 1, 0] + +/-- The symmetric combination of the third zero-weight pair. -/ +def symComb₃ (hT : IsSU2QuadFundamental B repGauge T) : B := + T ![0, 1, 1, 0] + T ![1, 0, 0, 1] + +/-- The second epsilon contraction is the difference of the first and third symmetric + combinations. -/ +lemma epsilonContraction₁₃_eq_sub (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₃ = hT.symComb₁ - hT.symComb₃ := by + rw [epsilonContraction₁₃, symComb₁, symComb₃] + abel + +/-- The first epsilon contraction is the difference of the second and third symmetric + combinations. -/ +lemma epsilonContraction₁₂_eq_sub (hT : IsSU2QuadFundamental B repGauge T) : + hT.epsilonContraction₁₂ = hT.symComb₂ - hT.symComb₃ := by + rw [epsilonContraction₁₂, symComb₂, symComb₃] + abel + +/-- The `SU(2)` permutation decomposition of the zero-weight piece of the gauge weight + decomposition: the Weyl element grades the six-dimensional space the gauge weight cannot + split, one pair at a time. -/ +noncomputable def zeroPieceSU2Perm (hT : IsSU2QuadFundamental B repGauge T) + (hmul : IsMulRep repGauge) : + SU2PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) := + SU2PermDecomposition.copy + (((swapPairSU2Perm hT.repGauge_gaugeSU2Perm_fst₁ + hT.repGauge_gaugeSU2Perm_snd₁).sup + (swapPairSU2Perm hT.repGauge_gaugeSU2Perm_fst₂ + hT.repGauge_gaugeSU2Perm_snd₂)).sup + (swapPairSU2Perm hT.repGauge_gaugeSU2Perm_fst₃ + hT.repGauge_gaugeSU2Perm_snd₃)) + _ (hT.gaugeWeightDecomposition_piece_zero hmul) + +/-- The grade-zero piece of the Weyl grading: the join of the three symmetric + combinations. -/ +lemma zeroPieceSU2Perm_piece_zero (hmul : IsMulRep repGauge) : + (hT.zeroPieceSU2Perm hmul).piece 0 + = (ℂ ∙ hT.symComb₁ ⊔ ℂ ∙ hT.symComb₂) ⊔ ℂ ∙ hT.symComb₃ := rfl + +/-- Every gauge invariant in the span of the components lies in the join of the three + symmetric combinations. This is what the two gradings alone can see, and it is one + dimension larger than the truth. -/ +lemma mem_symComb_of_invariant (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ (ℂ ∙ hT.symComb₁ ⊔ ℂ ∙ hT.symComb₂) ⊔ ℂ ∙ hT.symComb₃ := by + rw [← hT.zeroPieceSU2Perm_piece_zero hmul] + exact SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv + + +/-! + +## E. Cutting the sieve down to the epsilon contractions + +The two gradings together leave the join of the three symmetric combinations, while section +B produced only two independent contractions inside it. The direction left over is the sum +of all three, the neutral state of the isospin-two multiplet in the fourth tensor power of +the fundamental, and no grading can discard it: a grading sees only an abelian subgroup, +and that state is fixed by the whole gauge torus and by the Weyl element alike. + +The continuous symmetry does discard it. The rotation by a third of a turn about the +diagonal isospin axis cycles the three isospin axes, and the neutral states of the +isospin-two multiplet about three orthogonal axes sum to zero, being the three traceless +diagonal quadratic forms `diag (2, -1, -1)`, `diag (-1, 2, -1)` and `diag (-1, -1, 2)`. +Averaging over the cyclic group generated by that rotation therefore annihilates the extra +direction, while fixing the two contractions, and an invariant element is its own average. +This is the argument the Higgs sector runs at mass weight eight, where the same three +directions appear as the quartic monomials and the Fierz identity closes the orbit. + +-/ + +/-- The coefficient family of the neutral state of the isospin-two multiplet: the + indicator of the six components carrying two indices of each value. -/ +def symCoeff (l : Fin 4 → Fin 2) : ℂ := + if (l 0).val + (l 1).val + (l 2).val + (l 3).val = 2 then 1 else 0 + +/-- A sum over families weighted by that indicator, written out: the second elementary + symmetric function of the four pairs of matrix entries. -/ +lemma sum_symCoeff_mul (M : Matrix (Fin 2) (Fin 2) ℂ) (b : Fin 4 → Fin 2) : + ∑ l : Fin 4 → Fin 2, symCoeff l * ∏ i, M (b i) (l i) + = M (b 0) 0 * M (b 1) 0 * M (b 2) 1 * M (b 3) 1 + + M (b 0) 0 * M (b 1) 1 * M (b 2) 0 * M (b 3) 1 + + M (b 0) 0 * M (b 1) 1 * M (b 2) 1 * M (b 3) 0 + + M (b 0) 1 * M (b 1) 0 * M (b 2) 0 * M (b 3) 1 + + M (b 0) 1 * M (b 1) 0 * M (b 2) 1 * M (b 3) 0 + + M (b 0) 1 * M (b 1) 1 * M (b 2) 0 * M (b 3) 0 := by + rw [sum_pi_four] + simp only [symCoeff, Fin.sum_univ_two, Fin.prod_univ_four, Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.cons_val_three, + Matrix.tail_cons, Fin.val_zero, Fin.val_one] + norm_num + ring + +/-- The `SU(2)` matrix of the rotation by a third of a turn about the diagonal isospin + axis, namely `(1 - i (σ₁ + σ₂ + σ₃)) / 2`. -/ +noncomputable def cycMat : Matrix (Fin 2) (Fin 2) ℂ := + !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; (1 - Complex.I) / 2, (1 + Complex.I) / 2] + +/-- The square of that matrix, the rotation by two thirds of a turn. -/ +noncomputable def cycMatSq : Matrix (Fin 2) (Fin 2) ℂ := + !![(-1 - Complex.I) / 2, (-1 - Complex.I) / 2; (1 - Complex.I) / 2, (-1 + Complex.I) / 2] + +/-- The rotation by a third of a turn is a special unitary matrix. -/ +lemma cycMat_mem : cycMat ∈ specialUnitaryGroup (Fin 2) ℂ := by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [cycMat, Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply, map_div₀, map_ofNat, Complex.ext_iff] <;> norm_num + · rw [cycMat, Matrix.det_fin_two_of] + simp [Complex.ext_iff] + norm_num + +/-- The rotation by a third of a turn, as an element of the gauge group: trivial on colour + and hypercharge. -/ +noncomputable def cycGauge : GaugeGroupI := ⟨1, ⟨cycMat, cycMat_mem⟩, 1⟩ + +/-- The fundamental matrix of the rotation. -/ +lemma toSU2_cycGauge : (GaugeGroupI.toSU2 cycGauge).1 = cycMat := rfl + +/-- The fundamental matrix of its square. -/ +lemma toSU2_cycGauge_mul_self : + (GaugeGroupI.toSU2 (cycGauge * cycGauge)).1 = cycMatSq := by + have h : (GaugeGroupI.toSU2 (cycGauge * cycGauge)).1 = cycMat * cycMat := by + rw [map_mul] + rfl + rw [h] + ext a b + fin_cases a <;> fin_cases b <;> + simp [cycMat, cycMatSq, Matrix.mul_apply, Fin.sum_univ_two, Complex.ext_iff] <;> + norm_num + +set_option maxHeartbeats 1000000 in +/-- The averaging identity, in coefficients. The neutral state of the isospin-two multiplet + about the three isospin axes sums to zero, and the three summands here are that state + about the third axis and its two images under the rotation. -/ +lemma symCoeff_add_cyc_add_cycSq (a : Fin 4 → Fin 2) : + symCoeff a + (∑ l : Fin 4 → Fin 2, symCoeff l * ∏ i, cycMat (a i) (l i)) + + ∑ l : Fin 4 → Fin 2, symCoeff l * ∏ i, cycMatSq (a i) (l i) = 0 := by + obtain ⟨a₀, a₁, a₂, a₃, rfl⟩ : ∃ a₀ a₁ a₂ a₃, a = ![a₀, a₁, a₂, a₃] := + ⟨a 0, a 1, a 2, a 3, by funext i; fin_cases i <;> rfl⟩ + rw [sum_symCoeff_mul, sum_symCoeff_mul] + fin_cases a₀ <;> fin_cases a₁ <;> fin_cases a₂ <;> fin_cases a₃ <;> + simp [symCoeff, cycMat, cycMatSq, Complex.ext_iff] <;> norm_num + +/-- The neutral state of the isospin-two multiplet, as a linear combination of the + components: the sum of the three symmetric combinations. -/ +lemma sum_symCoeff_smul (hT : IsSU2QuadFundamental B repGauge T) : + ∑ l : Fin 4 → Fin 2, symCoeff l • T l + = hT.symComb₁ + hT.symComb₂ + hT.symComb₃ := by + rw [sum_pi_four, symComb₁, symComb₂, symComb₃] + simp [symCoeff, Fin.sum_univ_two] + abel + +/-- Averaging over the cyclic group generated by the rotation by a third of a turn about + the diagonal isospin axis. -/ +noncomputable def cycAverage (repGauge : Representation ℂ GaugeGroupI B) : B →ₗ[ℂ] B := + LinearMap.id + repGauge cycGauge + repGauge (cycGauge * cycGauge) + +/-- The average, written out. -/ +lemma cycAverage_apply (x : B) : + cycAverage repGauge x + = x + repGauge cycGauge x + repGauge (cycGauge * cycGauge) x := rfl + +/-- Averaging annihilates the neutral state of the isospin-two multiplet. -/ +lemma cycAverage_symComb_sum (hT : IsSU2QuadFundamental B repGauge T) : + cycAverage repGauge (hT.symComb₁ + hT.symComb₂ + hT.symComb₃) = 0 := by + rw [← hT.sum_symCoeff_smul, cycAverage_apply, hT.repGauge_sum cycGauge symCoeff, + hT.repGauge_sum (cycGauge * cycGauge) symCoeff] + simp only [toSU2_cycGauge, toSU2_cycGauge_mul_self] + rw [← Finset.sum_add_distrib, ← Finset.sum_add_distrib] + refine Finset.sum_eq_zero fun a _ => ?_ + rw [← add_smul, ← add_smul, symCoeff_add_cyc_add_cycSq a, zero_smul] + +/-- Averaging fixes a gauge invariant three times over. -/ +lemma cycAverage_of_invariant {x : B} (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + cycAverage repGauge x = (3 : ℂ) • x := by + rw [cycAverage_apply, hinv, hinv] + module + +/-- Averaging sends the third symmetric combination to minus the sum of the two epsilon + contractions. The three averages are then all in the plane the contractions span. -/ +lemma cycAverage_symComb₃ (hT : IsSU2QuadFundamental B repGauge T) : + cycAverage repGauge hT.symComb₃ + = -(hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃) := by + have h0 := hT.cycAverage_symComb_sum + rw [map_add, map_add] at h0 + have e1 : cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃ + = (3 : ℂ) • hT.epsilonContraction₁₃ := by + rw [← map_sub, ← hT.epsilonContraction₁₃_eq_sub, + cycAverage_of_invariant hT.repGauge_epsilonContraction₁₃] + have e2 : cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃ + = (3 : ℂ) • hT.epsilonContraction₁₂ := by + rw [← map_sub, ← hT.epsilonContraction₁₂_eq_sub, + cycAverage_of_invariant hT.repGauge_epsilonContraction₁₂] + have h5 : (3 : ℂ) • cycAverage repGauge hT.symComb₃ + = (3 : ℂ) • (-(hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃)) := by + rw [show ((3 : ℂ) • cycAverage repGauge hT.symComb₃) + = (cycAverage repGauge hT.symComb₁ + cycAverage repGauge hT.symComb₂ + + cycAverage repGauge hT.symComb₃) + - (cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃) + - (cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃) + from by module, h0, e1, e2] + module + have h7 : ((3 : ℂ)⁻¹ * 3) • cycAverage repGauge hT.symComb₃ + = ((3 : ℂ)⁻¹ * 3) • (-(hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃)) := by + rw [mul_smul, mul_smul, h5] + rwa [show ((3 : ℂ)⁻¹ * 3) = 1 from by norm_num, one_smul, one_smul] at h7 + +/-- Averaging sends the first symmetric combination into the plane spanned by the two + epsilon contractions. -/ +lemma cycAverage_symComb₁ (hT : IsSU2QuadFundamental B repGauge T) : + cycAverage repGauge hT.symComb₁ + = (3 : ℂ) • hT.epsilonContraction₁₃ + - (hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃) := by + have e1 : cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃ + = (3 : ℂ) • hT.epsilonContraction₁₃ := by + rw [← map_sub, ← hT.epsilonContraction₁₃_eq_sub, + cycAverage_of_invariant hT.repGauge_epsilonContraction₁₃] + have h3 := hT.cycAverage_symComb₃ + have hsplit : cycAverage repGauge hT.symComb₁ + = (cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃) + + cycAverage repGauge hT.symComb₃ := by module + rw [hsplit, e1, h3] + module + +/-- Averaging sends the second symmetric combination into the plane spanned by the two + epsilon contractions. -/ +lemma cycAverage_symComb₂ (hT : IsSU2QuadFundamental B repGauge T) : + cycAverage repGauge hT.symComb₂ + = (3 : ℂ) • hT.epsilonContraction₁₂ + - (hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃) := by + have e2 : cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃ + = (3 : ℂ) • hT.epsilonContraction₁₂ := by + rw [← map_sub, ← hT.epsilonContraction₁₂_eq_sub, + cycAverage_of_invariant hT.repGauge_epsilonContraction₁₂] + have h3 := hT.cycAverage_symComb₃ + have hsplit : cycAverage repGauge hT.symComb₂ + = (cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃) + + cycAverage repGauge hT.symComb₃ := by module + rw [hsplit, e2, h3] + module + +/-- Every gauge invariant in the span of the components is a combination of two of the + three epsilon contractions. The gauge weight cuts the span down to the six components of + vanishing weight, the Weyl element cuts those down to the three symmetric combinations, + and averaging over the rotation cuts those down to the plane of the contractions. -/ +lemma mem_sup_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := by + have hmem := hT.mem_symComb_of_invariant hmul hx hinv + have hI₁₂ : hT.epsilonContraction₁₂ + ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := + Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + have hI₁₃ : hT.epsilonContraction₁₃ + ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := + Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have hmap : Submodule.map (cycAverage repGauge) + ((ℂ ∙ hT.symComb₁ ⊔ ℂ ∙ hT.symComb₂) ⊔ ℂ ∙ hT.symComb₃) + ≤ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := by + simp only [Submodule.map_sup, Submodule.map_span, Set.image_singleton] + refine sup_le (sup_le ?_ ?_) ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · rw [hT.cycAverage_symComb₁] + exact sub_mem (Submodule.smul_mem _ _ hI₁₃) (add_mem hI₁₂ hI₁₃) + · rw [hT.cycAverage_symComb₂] + exact sub_mem (Submodule.smul_mem _ _ hI₁₂) (add_mem hI₁₂ hI₁₃) + · rw [hT.cycAverage_symComb₃] + exact neg_mem (add_mem hI₁₂ hI₁₃) + have hfin := hmap ⟨x, hmem, rfl⟩ + rw [cycAverage_of_invariant hinv] at hfin + have hfin' := Submodule.smul_mem _ ((3 : ℂ)⁻¹) hfin + rwa [smul_smul, show ((3 : ℂ)⁻¹ * 3) = 1 from by norm_num, one_smul] at hfin' + +/-- Every gauge invariant in the span of the components is a linear combination of two of + the three epsilon contractions, written out. -/ +lemma exists_smul_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c₁ c₂ : ℂ, x = c₁ • hT.epsilonContraction₁₂ + c₂ • hT.epsilonContraction₁₃ := by + obtain ⟨y, hy, z, hz, rfl⟩ := + Submodule.mem_sup.1 (hT.mem_sup_epsilonContraction_of_invariant hmul hx hinv) + obtain ⟨c₁, rfl⟩ := Submodule.mem_span_singleton.1 hy + obtain ⟨c₂, rfl⟩ := Submodule.mem_span_singleton.1 hz + exact ⟨c₁, c₂, rfl⟩ + +/-- The gauge invariants in the span of the components are exactly the combinations of the + first two epsilon contractions. The three sieves of sections C, D and E bound them from + above, and the contractions are themselves invariant and in the span, which bounds them + from below. -/ +lemma mem_span_and_invariant_iff (hmul : IsMulRep repGauge) (x : B) : + (x ∈ hT.span ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ x ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := by + refine ⟨fun h => hT.mem_sup_epsilonContraction_of_invariant hmul h.1 h.2, fun hx => ?_⟩ + obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.1 hx + obtain ⟨c₁, rfl⟩ := Submodule.mem_span_singleton.1 hy + obtain ⟨c₂, rfl⟩ := Submodule.mem_span_singleton.1 hz + refine ⟨add_mem (Submodule.smul_mem _ _ hT.epsilonContraction₁₂_mem_span) + (Submodule.smul_mem _ _ hT.epsilonContraction₁₃_mem_span), fun g => ?_⟩ + rw [map_add, map_smul, map_smul, hT.repGauge_epsilonContraction₁₂ g, + hT.repGauge_epsilonContraction₁₃ g] + +end Decomposition + +end IsSU2QuadFundamental + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 3e28f1727..91e85017b 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition /-! # Gauge tensors carrying two `su(3)` adjoint indices @@ -19,10 +20,14 @@ This is the gauge analogue of `IsQuadLorentz`. The field strength of the gluons one `su(3)` adjoint index, so a product of two field strengths carries two, and the proposition here records how such a product transforms. -Section A gives the proposition and the span of its components, section B the -orthogonality of the `su(3)` block of `adjointMatrix`, section C the trace +Section A gives the proposition and the span of its components, section B the trace contraction, which is the natural gauge invariant built from two adjoint indices, and -section D the gauge weight decomposition of the span. +section C the gauge weight decomposition of the span. Section D grades the zero-weight +piece of that decomposition by the cyclic colour rotation, which is what the gauge weight +alone cannot do, and section E upgrades that grading to the isotypic decomposition of the +whole Weyl group `S₃`, in which the trace contraction lands in the trivial isotype. The row +orthonormality of the `su(3)` block of `adjointMatrix` that section B rests on is proved +where the matrix is defined, in `GaugeAlgebra.Basis`. -/ @[expose] public section @@ -81,32 +86,7 @@ lemma mem_span_iff (x : B) : /-! -## B. Orthogonality of the adjoint matrix - -Orthogonality of `adjointMatrix` is proved where the matrix is defined, in -`GaugeAlgebra.Basis`. All that is needed here is the row orthonormality of the block -belonging to this gauge factor, which is what makes the trace contraction of section C -gauge invariant. - --/ - -/-- The rows of the `su(3)` block of the adjoint matrix are orthonormal. -/ -lemma sum_adjointMatrix_row_mul (g : GaugeGroupI) (c d : Fin 8) : - ∑ a : Fin 8, GaugeAlgebra.adjointMatrix g (Sum.inl c) (Sum.inl a) * - GaugeAlgebra.adjointMatrix g (Sum.inl d) (Sum.inl a) - = if c = d then 1 else 0 := by - have h : (GaugeAlgebra.adjointMatrix g * (GaugeAlgebra.adjointMatrix g)ᵀ) - (Sum.inl c) (Sum.inl d) = (1 : Matrix (Fin 8 ⊕ Fin 3 ⊕ Fin 1) - (Fin 8 ⊕ Fin 3 ⊕ Fin 1) ℝ) (Sum.inl c) (Sum.inl d) := by - rw [GaugeAlgebra.adjointMatrix_mul_transpose] - rw [Matrix.mul_apply, Fintype.sum_sum_type] at h - simpa [Fintype.sum_sum_type, Matrix.one_apply] using h - -TODO (lines := 92-104) "Move this to where `adjointMatrix` is defined." - -/-! - -## C. The trace contraction +## B. The trace contraction -/ @@ -160,7 +140,7 @@ lemma repGauge_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (g : GaugeGro refine Finset.sum_congr rfl fun b _ => ?_ rw [← Finset.sum_smul] congr 1 - rw [← Complex.ofReal_sum, sum_adjointMatrix_row_mul] + rw [← Complex.ofReal_sum, GaugeAlgebra.sum_adjointMatrix_inl_row_mul] simp [apply_ite] rw [step, ← hT.traceContraction_eq_sum] @@ -169,14 +149,17 @@ end IsSU3BiAdjoint /-! -## D. The gauge weight decomposition of the span +## C. The gauge weight decomposition of the span The Gell-Mann basis vectors are not eigenvectors of the gauge torus, so the components `T d` do not carry a definite gauge weight. The eigenvectors appear only after passing to the weight basis of the `su(3)` adjoint: for each of the three root directions the two complex combinations `x₁ ± i x₂` of the paired Gell-Mann coordinates, and the two Cartan directions as they stand. That is eight coordinate vectors, recorded in `wtCoeff`, with -weights `wtWeight`. +weights `wtWeight`. The two Cartan directions are named in the gauge algebra itself, as +`GaugeAlgebra.su3CartanId`, since the Cartan directions of the whole algebra are +assembled from them; the root pairs are recorded here and matched with those of the whole +algebra in C.1. With two adjoint indices a weight vector is a product of two of these, contracted against `T` by `biVec`, and its weight is the sum of the two individual weights. There are sixty @@ -195,7 +178,7 @@ set_option linter.unusedVariables false /-! -## D.1. The weight basis of the `su(3)` adjoint +## C.1. The weight basis of the `su(3)` adjoint -/ @@ -215,11 +198,6 @@ def rootWt : Fin 3 → GaugeWeight | 1 => (1, 1, 0, 0) | 2 => (-1, 2, 0, 0) -/-- The Gell-Mann indices of the two Cartan directions of `su(3)`. -/ -def cartanId : Fin 2 → Fin 8 - | 0 => 2 - | 1 => 7 - /-- The root directions here are the `su(3)` root directions of the full gauge algebra. -/ lemma rootIdx_castSucc (r : Fin 3) : GaugeAlgebra.rootIdx r.castSucc @@ -234,20 +212,20 @@ lemma rootWeight_castSucc (r : Fin 3) : /-- The Cartan directions here are the `su(3)` Cartan directions of the full gauge algebra. -/ lemma cartanIdx_castSucc (c : Fin 2) : - GaugeAlgebra.cartanIdx c.castSucc.castSucc = Sum.inl (cartanId c) := by + GaugeAlgebra.cartanIdx c.castSucc.castSucc = Sum.inl (GaugeAlgebra.su3CartanId c) := by fin_cases c <;> rfl /-- Every Gell-Mann index is either one of the two members of a root pair or a Cartan index. -/ lemma exists_rootPair_or_cartanId (a : Fin 8) : (∃ r : Fin 3, a = (rootPair r).1) ∨ (∃ r : Fin 3, a = (rootPair r).2) - ∨ ∃ c : Fin 2, a = cartanId c := by + ∨ ∃ c : Fin 2, a = GaugeAlgebra.su3CartanId c := by revert a decide /-! -## D.2. The adjoint matrix of a torus generator in the weight basis +## C.2. The adjoint matrix of a torus generator in the weight basis -/ @@ -307,8 +285,8 @@ lemma adjointMatrix_rootPair_snd (i : Fin 4) (r : Fin 3) (a : Fin 8) : /-- The torus fixes the Cartan columns of the adjoint matrix. -/ lemma adjointMatrix_cartanId (i : Fin 4) (c : Fin 2) (a : Fin 8) : - GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (cartanId c)) - = if a = cartanId c then 1 else 0 := by + GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (GaugeAlgebra.su3CartanId c)) + = if a = GaugeAlgebra.su3CartanId c then 1 else 0 := by have p := GaugeAlgebra.dualMap_coord_cartanIdx c.castSucc.castSucc i simp only [cartanIdx_castSucc] at p have e := LinearMap.congr_fun p (GaugeAlgebra.stdBasis (Sum.inl a)) @@ -318,7 +296,7 @@ lemma adjointMatrix_cartanId (i : Fin 4) (c : Fin 2) (a : Fin 8) : /-! -## D.3. The weight vectors of one adjoint index +## C.3. The weight vectors of one adjoint index -/ @@ -330,7 +308,7 @@ noncomputable def wtCoeff : WeightIdx → Fin 8 → ℂ + Complex.I * (if a = (rootPair r).2 then 1 else 0) | Sum.inr (Sum.inl r), a => (if a = (rootPair r).1 then 1 else 0) - Complex.I * (if a = (rootPair r).2 then 1 else 0) - | Sum.inr (Sum.inr c), a => if a = cartanId c then 1 else 0 + | Sum.inr (Sum.inr c), a => if a = GaugeAlgebra.su3CartanId c then 1 else 0 /-- The gauge weight carried by each `su(3)` adjoint weight vector. -/ def wtWeight : WeightIdx → GaugeWeight @@ -424,7 +402,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : rfl | Sum.inr (Sum.inr c) => have hw : ∀ x : Fin 8, wtCoeff (Sum.inr (Sum.inr c)) x - = if x = cartanId c then (1 : ℂ) else 0 := fun _ => rfl + = if x = GaugeAlgebra.su3CartanId c then (1 : ℂ) else 0 := fun _ => rfl have hz : ((expI : ℂ) ^ GaugeWeight.coord (wtWeight (Sum.inr (Sum.inr c) : WeightIdx)) i) = 1 := by show ((expI : ℂ) ^ GaugeWeight.coord (0 : GaugeWeight) i) = 1 @@ -437,7 +415,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : /-! -## D.4. The bi-adjoint weight vectors and their span +## C.4. The bi-adjoint weight vectors and their span -/ @@ -485,6 +463,11 @@ lemma biVec_sub_right (c₀ c₁ c₁' : Fin 8 → ℂ) : hT.biVec c₀ (c₁ - c₁') = hT.biVec c₀ c₁ - hT.biVec c₀ c₁' := by simp only [biVec, Pi.sub_apply, mul_sub, sub_smul, Finset.sum_sub_distrib] +/-- Negating both coordinate vectors leaves the contraction unchanged: the two signs + cancel against each other. -/ +lemma biVec_neg_neg (c₀ c₁ : Fin 8 → ℂ) : hT.biVec (-c₀) (-c₁) = hT.biVec c₀ c₁ := by + simp only [biVec, Pi.neg_apply, neg_mul_neg] + /-- Contracting against two single Gell-Mann directions returns a component of `T`. -/ lemma biVec_unitVec (a b : Fin 8) : hT.biVec (unitVec a) (unitVec b) = T ![a, b] := by rw [biVec, sum_pi_two] @@ -551,7 +534,7 @@ lemma unitVec_rootPair_snd (r : Fin 3) : /-- A Cartan direction is already a weight vector. -/ lemma unitVec_cartanId (c : Fin 2) : - unitVec (cartanId c) = wtCoeff (Sum.inr (Sum.inr c)) := rfl + unitVec (GaugeAlgebra.su3CartanId c) = wtCoeff (Sum.inr (Sum.inr c)) := rfl /-- Contracting a weight vector against a single Gell-Mann direction stays in the join of the weight lines. -/ @@ -597,7 +580,7 @@ lemma span_eq_wtSpan : hT.span = hT.wtSpan := by /-! -## D.5. The decomposition +## C.5. The decomposition -/ @@ -642,7 +625,7 @@ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : /-! -## D.6. The zero-weight piece +## C.6. The zero-weight piece A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight piece, which makes that piece worth describing explicitly. A product of two weight vectors @@ -702,6 +685,1186 @@ lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : GaugeWeightDecomposition.mem_zero_of_invariant _ hT.traceContraction_mem_span hT.repGauge_traceContraction +/-! + +## C.7. The ten zero-weight products written out + +Each of the ten lines of the previous section is the line through an explicit element of +`B`: for each of the three roots the raising vector paired with the matching lowering +vector and the same pair in the other order, and the four products of two Cartan +directions. Expanding the weight vectors in the Gell-Mann basis writes each of the ten as +a combination of the components of `T`, and the zero-weight piece is the span of the ten +element set they form. + +-/ + +/-- The weight vector of a positive root, in terms of the two Gell-Mann coordinate + directions of its root pair. -/ +lemma wtCoeff_inl (r : Fin 3) : + wtCoeff (Sum.inl r) = unitVec (rootPair r).1 + Complex.I • unitVec (rootPair r).2 := by + funext x + simp [wtCoeff, unitVec] + +/-- The weight vector of a negative root, in terms of the two Gell-Mann coordinate + directions of its root pair. -/ +lemma wtCoeff_inr_inl (r : Fin 3) : + wtCoeff (Sum.inr (Sum.inl r)) + = unitVec (rootPair r).1 - Complex.I • unitVec (rootPair r).2 := by + funext x + simp [wtCoeff, unitVec] + +/-- The raising vector of a root paired with the matching lowering vector. -/ +noncomputable def posNegProd (hT : IsSU3BiAdjoint B repGauge T) (r : Fin 3) : B := + hT.biVec (wtCoeff (Sum.inl r)) (wtCoeff (Sum.inr (Sum.inl r))) + +/-- The lowering vector of a root paired with the matching raising vector. -/ +noncomputable def negPosProd (hT : IsSU3BiAdjoint B repGauge T) (r : Fin 3) : B := + hT.biVec (wtCoeff (Sum.inr (Sum.inl r))) (wtCoeff (Sum.inl r)) + +/-- The product of two Cartan directions. -/ +noncomputable def cartanProd (hT : IsSU3BiAdjoint B repGauge T) (c₀ c₁ : Fin 2) : B := + hT.biVec (wtCoeff (Sum.inr (Sum.inr c₀))) (wtCoeff (Sum.inr (Sum.inr c₁))) + +/-- The raising-lowering product of a root, written out in the components of `T`. -/ +lemma posNegProd_eq (r : Fin 3) : + hT.posNegProd r + = T ![(rootPair r).1, (rootPair r).1] + T ![(rootPair r).2, (rootPair r).2] + + Complex.I • (T ![(rootPair r).2, (rootPair r).1] + - T ![(rootPair r).1, (rootPair r).2]) := by + rw [posNegProd, wtCoeff_inl, wtCoeff_inr_inl, hT.biVec_add_left, hT.biVec_smul_left, + hT.biVec_sub_right, hT.biVec_sub_right, hT.biVec_smul_right, hT.biVec_smul_right, + hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, smul_sub, + smul_smul, Complex.I_mul_I, neg_one_smul, smul_sub] + abel + +/-- The lowering-raising product of a root, written out in the components of `T`. -/ +lemma negPosProd_eq (r : Fin 3) : + hT.negPosProd r + = T ![(rootPair r).1, (rootPair r).1] + T ![(rootPair r).2, (rootPair r).2] + + Complex.I • (T ![(rootPair r).1, (rootPair r).2] + - T ![(rootPair r).2, (rootPair r).1]) := by + rw [negPosProd, wtCoeff_inl, wtCoeff_inr_inl, hT.biVec_sub_left, hT.biVec_smul_left, + hT.biVec_add_right, hT.biVec_add_right, hT.biVec_smul_right, hT.biVec_smul_right, + hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, smul_add, + smul_smul, Complex.I_mul_I, neg_one_smul, smul_sub] + abel + +/-- A product of two Cartan directions is a single component of `T`: the Cartan + directions are already Gell-Mann coordinate directions. -/ +lemma cartanProd_eq (c₀ c₁ : Fin 2) : + hT.cartanProd c₀ c₁ + = T ![GaugeAlgebra.su3CartanId c₀, GaugeAlgebra.su3CartanId c₁] := by + rw [cartanProd, ← unitVec_cartanId, ← unitVec_cartanId, hT.biVec_unitVec] + +/-- The zero-weight piece of the gauge weight decomposition, fully explicitly: the span + of the ten products of two weight vectors of opposite weight. -/ +lemma gaugeWeightDecomposition_piece_zero_span (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).piece 0 + = Submodule.span ℂ + {hT.posNegProd 0, hT.posNegProd 1, hT.posNegProd 2, + hT.negPosProd 0, hT.negPosProd 1, hT.negPosProd 2, + hT.cartanProd 0 0, hT.cartanProd 0 1, hT.cartanProd 1 0, hT.cartanProd 1 1} := by + refine le_antisymm ?_ ?_ + · rw [hT.gaugeWeightDecomposition_piece_zero hmul] + refine sup_le (sup_le (iSup_le fun r => ?_) (iSup_le fun r => ?_)) + (iSup_le fun c₀ => iSup_le fun c₁ => ?_) + · refine (Submodule.span_singleton_le_iff_mem _ _).mpr (Submodule.subset_span ?_) + fin_cases r <;> simp [posNegProd] + · refine (Submodule.span_singleton_le_iff_mem _ _).mpr (Submodule.subset_span ?_) + fin_cases r <;> simp [negPosProd] + · refine (Submodule.span_singleton_le_iff_mem _ _).mpr (Submodule.subset_span ?_) + fin_cases c₀ <;> fin_cases c₁ <;> simp [cartanProd] + · rw [Submodule.span_le] + intro x hx + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hx + have hmem : ∀ k₀ k₁ : WeightIdx, wtWeight k₀ + wtWeight k₁ = 0 → + hT.biVec (wtCoeff k₀) (wtCoeff k₁) + ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := fun k₀ k₁ h => + (Submodule.span_singleton_le_iff_mem _ _).mp (hT.span_biVec_le_piece_zero hmul h) + rcases hx with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + · exact hmem (Sum.inl 0) (Sum.inr (Sum.inl 0)) (by simp [wtWeight]) + · exact hmem (Sum.inl 1) (Sum.inr (Sum.inl 1)) (by simp [wtWeight]) + · exact hmem (Sum.inl 2) (Sum.inr (Sum.inl 2)) (by simp [wtWeight]) + · exact hmem (Sum.inr (Sum.inl 0)) (Sum.inl 0) (by simp [wtWeight]) + · exact hmem (Sum.inr (Sum.inl 1)) (Sum.inl 1) (by simp [wtWeight]) + · exact hmem (Sum.inr (Sum.inl 2)) (Sum.inl 2) (by simp [wtWeight]) + · exact hmem (Sum.inr (Sum.inr 0)) (Sum.inr (Sum.inr 0)) (by simp [wtWeight]) + · exact hmem (Sum.inr (Sum.inr 0)) (Sum.inr (Sum.inr 1)) (by simp [wtWeight]) + · exact hmem (Sum.inr (Sum.inr 1)) (Sum.inr (Sum.inr 0)) (by simp [wtWeight]) + · exact hmem (Sum.inr (Sum.inr 1)) (Sum.inr (Sum.inr 1)) (by simp [wtWeight]) + +/-! + +## D. The `SU(3)` permutation decomposition of the zero-weight piece + +The gauge weight cannot see inside its own zero-weight piece: the torus fixes all ten of +the products above. The cyclic colour rotation `gaugeSU3Perm` does see inside it. It +normalises the torus and sends each weight to another weight, fixing the weight zero, so +it acts on the zero-weight piece, and `SU3PermDecomposition` grades that action by the +cube roots of unity. + +Sections D.1 and D.2 compute the action, first on the Gell-Mann coordinate directions and +then on the weight vectors: the six root directions are permuted in two three-cycles, +while the two Cartan directions are rotated into each other and are diagonalised by the +combinations `x₂ ∓ i x₇`. Section D.3 transfers this to the ten products, section D.4 +grades a three-cycle by the cube roots of unity, and section D.5 assembles the +decomposition. + +This grading is a sieve, not a classification: `SU3PermDecomposition` records that grade +zero is necessary for gauge invariance but proves no converse. It is also only half of the +Weyl group of `SU(3)`. Section E adds the other half, and the decomposition built here is +the scaffolding that the isotypic decomposition there is assembled from, rather than the +end of the story. + +## D.1. The cyclic colour rotation on the Gell-Mann directions + +Conjugation by the cyclic matrix permutes the matrix units, hence the Gell-Mann matrices, +up to signs; only the two diagonal ones are mixed, by a rotation through `2 π / 3`. + +-/ + +/-- The star of the cyclic colour matrix is the permutation matrix of the inverse + three-cycle. -/ +lemma star_su3PermMatrix : + star !![(0 : ℂ), 0, 1; 1, 0, 0; 0, 1, 0] = !![(0 : ℂ), 1, 0; 0, 0, 1; 1, 0, 0] := by + ext i j + fin_cases i <;> fin_cases j <;> simp + +/-- An entry of the `su(3)` block of an adjoint matrix is a Gell-Mann coordinate of the + conjugated Gell-Mann matrix. -/ +lemma adjointMatrix_inl_inl_eq_gellMannCoeff (g : GaugeGroupI) (a b : Fin 8) : + GaugeAlgebra.adjointMatrix g (Sum.inl a) (Sum.inl b) + = gellMannCoeff (g.toSU3.1 * gellMannMatrix b * star g.toSU3.1) a := by + have hmem := GaugeAlgebra.conj_mem g.toSU3.2.1 + (gellMannMatrix_selfAdjoint b) (gellMannMatrix_trace b) + rw [GaugeAlgebra.adjointMatrix_inl_inl, gellMannCoeff_eq_trace hmem.1 hmem.2] + +/-- The conjugate of each Gell-Mann matrix by the cyclic colour rotation. -/ +noncomputable def permGellMann : Fin 8 → Matrix (Fin 3) (Fin 3) ℂ + | 0 => !![0, 0, 0; 0, 0, 1; 0, 1, 0] + | 1 => !![0, 0, 0; 0, 0, -Complex.I; 0, Complex.I, 0] + | 2 => !![0, 0, 0; 0, 1, 0; 0, 0, -1] + | 3 => !![0, 1, 0; 1, 0, 0; 0, 0, 0] + | 4 => !![0, Complex.I, 0; -Complex.I, 0, 0; 0, 0, 0] + | 5 => !![0, 0, 1; 0, 0, 0; 1, 0, 0] + | 6 => !![0, 0, Complex.I; 0, 0, 0; -Complex.I, 0, 0] + | 7 => !![((-2 * (Real.sqrt 3)⁻¹ : ℝ) : ℂ), 0, 0; + 0, (((Real.sqrt 3)⁻¹ : ℝ) : ℂ), 0; + 0, 0, (((Real.sqrt 3)⁻¹ : ℝ) : ℂ)] + +/-- Conjugating a Gell-Mann matrix by the cyclic colour rotation. -/ +lemma conj_gellMannMatrix_gaugeSU3Perm (b : Fin 8) : + gaugeSU3Perm.toSU3.1 * gellMannMatrix b * star gaugeSU3Perm.toSU3.1 = permGellMann b := by + rw [show gaugeSU3Perm.toSU3.1 = !![(0 : ℂ), 0, 1; 1, 0, 0; 0, 1, 0] from rfl, + star_su3PermMatrix] + fin_cases b <;> ext i j <;> fin_cases i <;> fin_cases j <;> + simp [permGellMann, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, + gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, + gellMannMatrix_seven, Matrix.mul_apply, Fin.sum_univ_three] + all_goals ring + +/-- The coordinates of the image of each Gell-Mann direction under the cyclic colour + rotation: the six directions of the root pairs are permuted up to sign, and the two + Cartan directions are rotated into each other. -/ +noncomputable def permCol : Fin 8 → Fin 8 → ℂ + | 0 => unitVec 5 + | 1 => unitVec 6 + | 2 => -(2 : ℂ)⁻¹ • unitVec 2 + (((Real.sqrt 3 : ℝ) : ℂ) / 2) • unitVec 7 + | 3 => unitVec 0 + | 4 => -unitVec 1 + | 5 => unitVec 3 + | 6 => -unitVec 4 + | 7 => -((((Real.sqrt 3 : ℝ) : ℂ) / 2) • unitVec 2) - (2 : ℂ)⁻¹ • unitVec 7 + +/-- The row action on a Gell-Mann coordinate direction is a column of the adjoint + matrix. -/ +lemma rowAct_unitVec (g : GaugeGroupI) (b a : Fin 8) : + rowAct g (unitVec b) a + = ((GaugeAlgebra.adjointMatrix g (Sum.inl a) (Sum.inl b) : ℝ) : ℂ) := by + simp [rowAct, unitVec, mul_ite] + +/-- The cyclic colour rotation on the Gell-Mann coordinate directions. -/ +lemma rowAct_gaugeSU3Perm_unitVec (b : Fin 8) : + rowAct gaugeSU3Perm (unitVec b) = permCol b := by + have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by + rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + funext a + rw [rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, conj_gellMannMatrix_gaugeSU3Perm] + fin_cases b <;> fin_cases a <;> simp [permGellMann, gellMannCoeff, permCol, unitVec] + all_goals first + | ring1 + | linear_combination (-(1 : ℂ) / 6) * h3 + +/-! + +## D.2. The cyclic colour rotation on the weight vectors + +The six root weight vectors are permuted in two three-cycles, `wtCycle j` for `j = 0, 1`. +The two Cartan weight vectors are not permuted but rotated, and the combinations +`x₂ ∓ i x₇` recorded in `cartanVec` diagonalise the rotation, at the eigenvalues `ω` and +`ω ^ 2`. + +-/ + +/-- The row action is additive in the coordinate vector. -/ +lemma rowAct_add (g : GaugeGroupI) (c c' : Fin 8 → ℂ) : + rowAct g (c + c') = rowAct g c + rowAct g c' := by + funext a + simp only [rowAct, Pi.add_apply, mul_add, Finset.sum_add_distrib] + +/-- The row action is additive on differences of coordinate vectors. -/ +lemma rowAct_sub (g : GaugeGroupI) (c c' : Fin 8 → ℂ) : + rowAct g (c - c') = rowAct g c - rowAct g c' := by + funext a + simp only [rowAct, Pi.sub_apply, mul_sub, Finset.sum_sub_distrib] + +/-- The row action is homogeneous in the coordinate vector. -/ +lemma rowAct_smul (g : GaugeGroupI) (z : ℂ) (c : Fin 8 → ℂ) : + rowAct g (z • c) = z • rowAct g c := by + funext a + simp only [rowAct, Pi.smul_apply, smul_eq_mul, Finset.mul_sum] + exact Finset.sum_congr rfl fun x _ => by ring + +/-- The six root weight indices arranged in the two three-cycles along which the cyclic + colour rotation moves them. -/ +def wtCycle : Fin 2 → Fin 3 → WeightIdx + | 0, 0 => Sum.inl 0 + | 0, 1 => Sum.inl 2 + | 0, 2 => Sum.inr (Sum.inl 1) + | 1, 0 => Sum.inl 1 + | 1, 1 => Sum.inr (Sum.inl 0) + | 1, 2 => Sum.inr (Sum.inl 2) + +/-- The cyclic colour rotation moves the root weight vectors one step along their + cycle. -/ +lemma rowAct_gaugeSU3Perm_wtCoeff (j : Fin 2) (i : Fin 3) : + rowAct gaugeSU3Perm (wtCoeff (wtCycle j i)) = wtCoeff (wtCycle j (i + 1)) := by + fin_cases j <;> fin_cases i <;> + simp [wtCycle, wtCoeff_inl, wtCoeff_inr_inl, rootPair, rowAct_add, rowAct_sub, + rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol] + all_goals module + +/-- The two eigenvectors of the cyclic colour rotation in the Cartan plane. -/ +noncomputable def cartanVec : Fin 2 → Fin 8 → ℂ + | 0 => wtCoeff (Sum.inr (Sum.inr 0)) - Complex.I • wtCoeff (Sum.inr (Sum.inr 1)) + | 1 => wtCoeff (Sum.inr (Sum.inr 0)) + Complex.I • wtCoeff (Sum.inr (Sum.inr 1)) + +/-- The grade of each Cartan eigenvector. -/ +def cartanGrade : Fin 2 → ZMod 3 + | 0 => 1 + | 1 => 2 + +/-- The cube root of unity `ω = exp (2 π i / 3)`, written out. -/ +lemma su3Omega_eq : su3Omega = -2⁻¹ + ((Real.sqrt 3 / 2 : ℝ) : ℂ) * Complex.I := by + have h : (2 * (Real.pi : ℂ) * Complex.I / 3) + = ((2 * Real.pi / 3 : ℝ) : ℂ) * Complex.I := by + push_cast + ring + rw [su3Omega, h, Complex.exp_mul_I, ← Complex.ofReal_cos, ← Complex.ofReal_sin, + show (2 * Real.pi / 3 : ℝ) = Real.pi - Real.pi / 3 by ring, + Real.cos_pi_sub, Real.sin_pi_sub, Real.cos_pi_div_three, Real.sin_pi_div_three] + push_cast + ring + +/-- The square of `ω`, written out. -/ +lemma su3Omega_sq : su3Omega ^ 2 = -2⁻¹ - ((Real.sqrt 3 / 2 : ℝ) : ℂ) * Complex.I := by + have h3 : ((Real.sqrt 3 : ℝ) : ℂ) ^ 2 = 3 := by + rw [← Complex.ofReal_pow, Real.sq_sqrt (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + rw [su3Omega_eq] + push_cast + linear_combination (((Real.sqrt 3 : ℝ) : ℂ) ^ 2 / 4) * Complex.I_sq + (-(1 : ℂ) / 4) * h3 + +/-- The grade-one sign, written out. -/ +lemma su3PermSign_one_eq : + su3PermSign 1 = -2⁻¹ + ((Real.sqrt 3 / 2 : ℝ) : ℂ) * Complex.I := by + rw [su3PermSign_one, su3Omega_eq] + +/-- The grade-two sign, written out. -/ +lemma su3PermSign_two_eq : + su3PermSign 2 = -2⁻¹ - ((Real.sqrt 3 / 2 : ℝ) : ℂ) * Complex.I := by + rw [su3PermSign_two, su3Omega_sq] + +/-- The cyclic colour rotation scales each Cartan eigenvector by the cube root of unity + of its grade. -/ +lemma rowAct_gaugeSU3Perm_cartanVec (c : Fin 2) : + rowAct gaugeSU3Perm (cartanVec c) = su3PermSign (cartanGrade c) • cartanVec c := by + fin_cases c <;> + simp only [cartanVec, cartanGrade, ← unitVec_cartanId, GaugeAlgebra.su3CartanId, + rowAct_sub, rowAct_add, rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol, + su3PermSign_one_eq, su3PermSign_two_eq] <;> + match_scalars + all_goals ring_nf + all_goals try simp only [Complex.I_sq] + all_goals ring1 + +/-- The first Cartan weight vector in terms of the two eigenvectors. -/ +lemma wtCoeff_cartan_zero : + wtCoeff (Sum.inr (Sum.inr 0)) = (2 : ℂ)⁻¹ • (cartanVec 0 + cartanVec 1) := by + simp only [cartanVec] + module + +/-- The second Cartan weight vector in terms of the two eigenvectors. -/ +lemma wtCoeff_cartan_one : + wtCoeff (Sum.inr (Sum.inr 1)) = (Complex.I / 2) • (cartanVec 0 - cartanVec 1) := by + simp only [cartanVec] + match_scalars + all_goals first + | ring1 + | linear_combination Complex.I_sq + +/-! + +## D.3. The ten zero-weight products under the rotation + +Pairing each weight vector of a cycle with the opposite weight vector turns the two +three-cycles of weight vectors into two three-cycles of zero-weight products, `prodCycle 0` +and `prodCycle 1`. The four Cartan products are not permuted: written in the eigenbasis +`cartanVec` they are scaled, by the product of the two eigenvalues. + +-/ + +/-- The six root products of weight zero, arranged in the two three-cycles along which the + cyclic colour rotation moves them. -/ +noncomputable def prodCycle (hT : IsSU3BiAdjoint B repGauge T) : Fin 2 → Fin 3 → B + | 0, i => hT.biVec (wtCoeff (wtCycle 0 i)) (wtCoeff (wtCycle 1 (i + 1))) + | 1, i => hT.biVec (wtCoeff (wtCycle 1 (i + 1))) (wtCoeff (wtCycle 0 i)) + +/-- The forward cycle starts at the first raising-lowering product. -/ +lemma prodCycle_zero_zero : hT.prodCycle 0 0 = hT.posNegProd 0 := rfl + +/-- The forward cycle continues with the third raising-lowering product. -/ +lemma prodCycle_zero_one : hT.prodCycle 0 1 = hT.posNegProd 2 := rfl + +/-- The forward cycle closes on the second lowering-raising product. -/ +lemma prodCycle_zero_two : hT.prodCycle 0 2 = hT.negPosProd 1 := rfl + +/-- The reverse cycle starts at the first lowering-raising product. -/ +lemma prodCycle_one_zero : hT.prodCycle 1 0 = hT.negPosProd 0 := rfl + +/-- The reverse cycle continues with the third lowering-raising product. -/ +lemma prodCycle_one_one : hT.prodCycle 1 1 = hT.negPosProd 2 := rfl + +/-- The reverse cycle closes on the second raising-lowering product. -/ +lemma prodCycle_one_two : hT.prodCycle 1 2 = hT.posNegProd 1 := rfl + +/-- The cyclic colour rotation moves each root product one step along its cycle. -/ +lemma repGauge_gaugeSU3Perm_prodCycle (j : Fin 2) (i : Fin 3) : + repGauge gaugeSU3Perm (hT.prodCycle j i) = hT.prodCycle j (i + 1) := by + fin_cases j <;> + simp only [prodCycle, hT.repGauge_biVec, rowAct_gaugeSU3Perm_wtCoeff] + +/-- The two weight vectors of a root product carry opposite weights. -/ +lemma wtWeight_wtCycle_add (i : Fin 3) : + wtWeight (wtCycle 0 i) + wtWeight (wtCycle 1 (i + 1)) = 0 := by + revert i + decide + +/-- The same pair of weight vectors in the other order. -/ +lemma wtWeight_wtCycle_add' (i : Fin 3) : + wtWeight (wtCycle 1 (i + 1)) + wtWeight (wtCycle 0 i) = 0 := by + revert i + decide + +/-- Every root product lies in the zero-weight piece. -/ +lemma prodCycle_mem_piece_zero (hmul : IsMulRep repGauge) (j : Fin 2) (i : Fin 3) : + hT.prodCycle j i ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := by + fin_cases j + · exact (Submodule.span_singleton_le_iff_mem _ _).mp + (hT.span_biVec_le_piece_zero hmul (wtWeight_wtCycle_add i)) + · exact (Submodule.span_singleton_le_iff_mem _ _).mp + (hT.span_biVec_le_piece_zero hmul (wtWeight_wtCycle_add' i)) + +/-- The products of two Cartan eigenvectors. -/ +noncomputable def cartanEigenProd (hT : IsSU3BiAdjoint B repGauge T) (a b : Fin 2) : B := + hT.biVec (cartanVec a) (cartanVec b) + +/-- A product of two Cartan eigenvectors is scaled by the cube root of unity of the sum of + the two grades. -/ +lemma repGauge_gaugeSU3Perm_cartanEigenProd (a b : Fin 2) : + repGauge gaugeSU3Perm (hT.cartanEigenProd a b) + = su3PermSign (cartanGrade a + cartanGrade b) • hT.cartanEigenProd a b := by + rw [cartanEigenProd, hT.repGauge_biVec, rowAct_gaugeSU3Perm_cartanVec, + rowAct_gaugeSU3Perm_cartanVec, hT.biVec_smul_left, hT.biVec_smul_right, smul_smul, + su3PermSign_add] + +/-- Every product of two Cartan eigenvectors lies in the zero-weight piece. -/ +lemma cartanEigenProd_mem_piece_zero (hmul : IsMulRep repGauge) (a b : Fin 2) : + hT.cartanEigenProd a b ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := by + have hbase : ∀ c₀ c₁ : Fin 2, hT.biVec (wtCoeff (Sum.inr (Sum.inr c₀))) + (wtCoeff (Sum.inr (Sum.inr c₁))) ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + fun c₀ c₁ => (Submodule.span_singleton_le_iff_mem _ _).mp + (hT.span_biVec_le_piece_zero hmul (by simp [wtWeight])) + have hc : ∀ c : Fin 2, c = 0 ∨ c = 1 := by decide + rcases hc a with rfl | rfl <;> rcases hc b with rfl | rfl <;> + simp only [cartanEigenProd, cartanVec, hT.biVec_add_left, hT.biVec_sub_left, + hT.biVec_smul_left, hT.biVec_add_right, hT.biVec_sub_right, hT.biVec_smul_right] + all_goals + repeat' first + | exact hbase _ _ + | apply add_mem + | apply sub_mem + | apply Submodule.smul_mem + +/-! + +## D.4. The graded combinations of a three-cycle + +A three-cycle `x` of elements of `B` has three graded combinations, one for each cube root +of unity: `cycleEigen x k` is scaled by `ω ^ k`, and the three of them span the same +subspace as the cycle, by the inverse of the Vandermonde matrix of the cube roots of unity. + +-/ + +/-- The grade `k` combination of a three-cycle. -/ +noncomputable def cycleEigen (x : Fin 3 → B) (k : ZMod 3) : B := + x 0 + su3PermSign (2 * k) • x 1 + su3PermSign k • x 2 + +/-- The grade zero combination of a three-cycle is the plain sum of its three members: + the character is trivial there. -/ +lemma cycleEigen_zero_eq (x : Fin 3 → B) : cycleEigen x 0 = x 0 + x 1 + x 2 := by + simp [cycleEigen, su3PermSign_zero] + +/-- The cube roots of unity sum to zero. -/ +lemma su3Omega_add : 1 + su3Omega + su3Omega ^ 2 = 0 := by + rw [su3Omega_sq, su3Omega_eq] + ring + +/-- The cyclic element scales the grade `k` combination of a three-cycle by `ω ^ k`. -/ +lemma repGauge_cycleEigen (x : Fin 3 → B) + (hx : ∀ i : Fin 3, repGauge gaugeSU3Perm (x i) = x (i + 1)) (k : ZMod 3) : + repGauge gaugeSU3Perm (cycleEigen x k) = su3PermSign k • cycleEigen x k := by + have h3k : k + 2 * k = 0 := by + have h : (3 : ZMod 3) * k = 0 := by + rw [show (3 : ZMod 3) = 0 from rfl, zero_mul] + linear_combination h + have h2k : k + k = 2 * k := by ring + rw [cycleEigen, map_add, map_add, map_smul, map_smul, hx 0, hx 1, hx 2, + show (0 : Fin 3) + 1 = 1 from rfl, show (1 : Fin 3) + 1 = 2 from rfl, + show (2 : Fin 3) + 1 = 0 from rfl, smul_add, smul_add, smul_smul, smul_smul, + ← su3PermSign_add, ← su3PermSign_add, h3k, h2k, su3PermSign_zero, one_smul] + abel + +/-- The three graded combinations sum to three times the first member of the cycle. -/ +lemma cycleEigen_sum_zero (x : Fin 3 → B) : + cycleEigen x 0 + cycleEigen x 1 + cycleEigen x 2 = (3 : ℂ) • x 0 := by + simp only [cycleEigen, show (2 : ZMod 3) * 0 = 0 from rfl, show (2 : ZMod 3) * 1 = 2 from rfl, + show (2 : ZMod 3) * 2 = 1 from rfl, su3PermSign_zero, su3PermSign_one, su3PermSign_two] + match_scalars + all_goals first + | ring1 + | linear_combination su3Omega_add + +/-- Weighting the graded combinations by the cube roots of unity picks out the second + member of the cycle. -/ +lemma cycleEigen_sum_one (x : Fin 3 → B) : + cycleEigen x 0 + su3Omega • cycleEigen x 1 + su3Omega ^ 2 • cycleEigen x 2 + = (3 : ℂ) • x 1 := by + simp only [cycleEigen, show (2 : ZMod 3) * 0 = 0 from rfl, show (2 : ZMod 3) * 1 = 2 from rfl, + show (2 : ZMod 3) * 2 = 1 from rfl, su3PermSign_zero, su3PermSign_one, su3PermSign_two] + match_scalars + all_goals first + | ring1 + | linear_combination su3Omega_add + | linear_combination (2 : ℂ) * su3Omega_pow_three + | linear_combination su3Omega_add + su3Omega * su3Omega_pow_three + +/-- Weighting by the other cube root of unity picks out the third member of the cycle. -/ +lemma cycleEigen_sum_two (x : Fin 3 → B) : + cycleEigen x 0 + su3Omega ^ 2 • cycleEigen x 1 + su3Omega • cycleEigen x 2 + = (3 : ℂ) • x 2 := by + simp only [cycleEigen, show (2 : ZMod 3) * 0 = 0 from rfl, show (2 : ZMod 3) * 1 = 2 from rfl, + show (2 : ZMod 3) * 2 = 1 from rfl, su3PermSign_zero, su3PermSign_one, su3PermSign_two] + match_scalars + all_goals first + | ring1 + | linear_combination su3Omega_add + | linear_combination (2 : ℂ) * su3Omega_pow_three + | linear_combination su3Omega_add + su3Omega * su3Omega_pow_three + +/-- Every member of a three-cycle lies in the join of the lines through its three graded + combinations. -/ +lemma cycle_mem_iSup (x : Fin 3 → B) (i : Fin 3) : + x i ∈ ⨆ k : ZMod 3, ℂ ∙ cycleEigen x k := by + have hmem : ∀ k : ZMod 3, cycleEigen x k ∈ ⨆ k : ZMod 3, ℂ ∙ cycleEigen x k := + fun k => Submodule.mem_iSup_of_mem k (Submodule.mem_span_singleton_self _) + have hcomb : ∀ z₀ z₁ z₂ : ℂ, + z₀ • cycleEigen x 0 + z₁ • cycleEigen x 1 + z₂ • cycleEigen x 2 + ∈ ⨆ k : ZMod 3, ℂ ∙ cycleEigen x k := fun z₀ z₁ z₂ => + add_mem (add_mem (Submodule.smul_mem _ _ (hmem 0)) (Submodule.smul_mem _ _ (hmem 1))) + (Submodule.smul_mem _ _ (hmem 2)) + have hthree : ∀ y : B, (3 : ℂ) • y ∈ (⨆ k : ZMod 3, ℂ ∙ cycleEigen x k) → + y ∈ ⨆ k : ZMod 3, ℂ ∙ cycleEigen x k := by + intro y hy + have h := Submodule.smul_mem _ ((3 : ℂ)⁻¹) hy + rwa [smul_smul, inv_mul_cancel₀ (by norm_num : (3 : ℂ) ≠ 0), one_smul] at h + have hi : i = 0 ∨ i = 1 ∨ i = 2 := by + revert i + decide + rcases hi with rfl | rfl | rfl + · refine hthree _ ?_ + rw [← cycleEigen_sum_zero x] + simpa using hcomb 1 1 1 + · refine hthree _ ?_ + rw [← cycleEigen_sum_one x] + simpa using hcomb 1 su3Omega (su3Omega ^ 2) + · refine hthree _ ?_ + rw [← cycleEigen_sum_two x] + simpa using hcomb 1 (su3Omega ^ 2) su3Omega + +/-! + +## D.5. The decomposition + +The grade `k` piece holds one line from each of the two cycles of root products, together +with those products of Cartan eigenvectors whose two grades sum to `k`. That is four of the +ten lines in grade zero and three in each of the grades one and two. + +-/ + +/-- The grade `k` piece of the `SU(3)` permutation decomposition of the zero-weight + piece. -/ +noncomputable def zeroPiece (hT : IsSU3BiAdjoint B repGauge T) (k : ZMod 3) : Submodule ℂ B := + ℂ ∙ cycleEigen (hT.prodCycle 0) k ⊔ ℂ ∙ cycleEigen (hT.prodCycle 1) k + ⊔ ⨆ (a : Fin 2) (b : Fin 2) (_ : cartanGrade a + cartanGrade b = k), + ℂ ∙ hT.cartanEigenProd a b + +/-- Each graded piece is of pure sign under the cyclic colour rotation. -/ +lemma zeroPiece_le_eigenspace (k : ZMod 3) : + hT.zeroPiece k ≤ Module.End.eigenspace (repGauge gaugeSU3Perm) (su3PermSign k) := by + refine sup_le (sup_le ?_ ?_) (iSup_le fun a => iSup_le fun b => iSup_le fun hab => ?_) + · rw [Submodule.span_le, Set.singleton_subset_iff] + exact Module.End.mem_eigenspace_iff.mpr + (repGauge_cycleEigen _ (hT.repGauge_gaugeSU3Perm_prodCycle 0) k) + · rw [Submodule.span_le, Set.singleton_subset_iff] + exact Module.End.mem_eigenspace_iff.mpr + (repGauge_cycleEigen _ (hT.repGauge_gaugeSU3Perm_prodCycle 1) k) + · rw [Submodule.span_le, Set.singleton_subset_iff] + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [hT.repGauge_gaugeSU3Perm_cartanEigenProd, hab] + +/-- Every product of two Cartan directions lies in the join of the graded pieces. -/ +lemma cartanProd_mem_iSup_zeroPiece (c₀ c₁ : Fin 2) : + hT.cartanProd c₀ c₁ ∈ ⨆ k : ZMod 3, hT.zeroPiece k := by + have hbase : ∀ a b : Fin 2, + hT.biVec (cartanVec a) (cartanVec b) ∈ ⨆ k : ZMod 3, hT.zeroPiece k := fun a b => + Submodule.mem_iSup_of_mem (cartanGrade a + cartanGrade b) + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem a (Submodule.mem_iSup_of_mem b + (Submodule.mem_iSup_of_mem rfl (Submodule.mem_span_singleton_self _))))) + have hc : ∀ c : Fin 2, c = 0 ∨ c = 1 := by decide + rcases hc c₀ with rfl | rfl <;> rcases hc c₁ with rfl | rfl <;> + simp only [cartanProd, wtCoeff_cartan_zero, wtCoeff_cartan_one, hT.biVec_add_left, + hT.biVec_sub_left, hT.biVec_smul_left, hT.biVec_add_right, hT.biVec_sub_right, + hT.biVec_smul_right] + all_goals + repeat' first + | exact hbase _ _ + | apply add_mem + | apply sub_mem + | apply Submodule.smul_mem + +/-- The graded pieces exhaust the zero-weight piece. -/ +lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : + (⨆ k : ZMod 3, hT.zeroPiece k) = (hT.gaugeWeightDecomposition hmul).piece 0 := by + have hcyc : ∀ (j : Fin 2) (i : Fin 3), + hT.prodCycle j i ∈ ⨆ k : ZMod 3, hT.zeroPiece k := by + intro j i + have hle : (⨆ k : ZMod 3, ℂ ∙ cycleEigen (hT.prodCycle j) k) + ≤ ⨆ k : ZMod 3, hT.zeroPiece k := by + refine iSup_mono fun k => ?_ + fin_cases j + · exact le_sup_of_le_left le_sup_left + · exact le_sup_of_le_left le_sup_right + exact hle (cycle_mem_iSup (hT.prodCycle j) i) + refine le_antisymm (iSup_le fun k => ?_) ?_ + · refine sup_le (sup_le ?_ ?_) (iSup_le fun a => iSup_le fun b => iSup_le fun _ => ?_) + · exact (Submodule.span_singleton_le_iff_mem _ _).mpr + (add_mem (add_mem (hT.prodCycle_mem_piece_zero hmul 0 0) + (Submodule.smul_mem _ _ (hT.prodCycle_mem_piece_zero hmul 0 1))) + (Submodule.smul_mem _ _ (hT.prodCycle_mem_piece_zero hmul 0 2))) + · exact (Submodule.span_singleton_le_iff_mem _ _).mpr + (add_mem (add_mem (hT.prodCycle_mem_piece_zero hmul 1 0) + (Submodule.smul_mem _ _ (hT.prodCycle_mem_piece_zero hmul 1 1))) + (Submodule.smul_mem _ _ (hT.prodCycle_mem_piece_zero hmul 1 2))) + · exact (Submodule.span_singleton_le_iff_mem _ _).mpr + (hT.cartanEigenProd_mem_piece_zero hmul a b) + · rw [hT.gaugeWeightDecomposition_piece_zero_span hmul, Submodule.span_le] + intro x hx + simp only [Set.mem_insert_iff, Set.mem_singleton_iff] at hx + rcases hx with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + · exact hcyc 0 0 + · exact hcyc 1 2 + · exact hcyc 0 1 + · exact hcyc 1 0 + · exact hcyc 0 2 + · exact hcyc 1 1 + · exact hT.cartanProd_mem_iSup_zeroPiece 0 0 + · exact hT.cartanProd_mem_iSup_zeroPiece 0 1 + · exact hT.cartanProd_mem_iSup_zeroPiece 1 0 + · exact hT.cartanProd_mem_iSup_zeroPiece 1 1 + +/-- The `SU(3)` permutation decomposition of the zero-weight piece of the gauge weight + decomposition: the cyclic colour rotation grades the ten dimensions the gauge weight + cannot separate. Grade zero is necessary for gauge invariance but not sufficient; + `zeroPiece_zero` says more about what a further reduction would need. -/ +noncomputable def zeroPieceSU3Perm (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) : + SU3PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) where + piece := hT.zeroPiece + piece_le k x hx := Module.End.mem_eigenspace_iff.mp (hT.zeroPiece_le_eigenspace k hx) + iSup_piece := hT.iSup_zeroPiece hmul + +/-- The pieces of the decomposition are the graded pieces. -/ +@[simp] +lemma zeroPieceSU3Perm_piece (hmul : IsMulRep repGauge) (k : ZMod 3) : + (hT.zeroPieceSU3Perm hmul).piece k = hT.zeroPiece k := rfl + +/-- The grade zero piece, written out: one line from each cycle of root products, together + with the two mixed products of Cartan eigenvectors. + + The four generators, written out in the components of `T`. The three root pairs are + `rootPair 0 = (0, 1)`, `rootPair 1 = (3, 4)`, `rootPair 2 = (5, 6)`, and the two Cartan + directions are `GaugeAlgebra.su3CartanId 0 = 2`, `GaugeAlgebra.su3CartanId 1 = 7`. + + `cycleEigen (hT.prodCycle 0) 0` unfolds, by `cycleEigen`, `prodCycle_zero_zero`, + `prodCycle_zero_one`, `prodCycle_zero_two`, `posNegProd_eq` and `negPosProd_eq`, to + `T ![0, 0] + T ![1, 1] + T ![3, 3] + T ![4, 4] + T ![5, 5] + T ![6, 6]` + `+ Complex.I • (T ![1, 0] - T ![0, 1] + T ![3, 4] - T ![4, 3] + T ![6, 5] - T ![5, 6])`. + + `cycleEigen (hT.prodCycle 1) 0` unfolds the same way, with `prodCycle_one_zero`, + `prodCycle_one_one`, `prodCycle_one_two` in place of the forward cycle, to + `T ![0, 0] + T ![1, 1] + T ![3, 3] + T ![4, 4] + T ![5, 5] + T ![6, 6]` + `+ Complex.I • (T ![0, 1] - T ![1, 0] + T ![4, 3] - T ![3, 4] + T ![5, 6] - T ![6, 5])`, + the same six diagonal terms with the antisymmetric part negated. + + `hT.cartanEigenProd 0 1` and `hT.cartanEigenProd 1 0` unfold, by `cartanEigenProd`, + `cartanVec` and the bilinearity of `biVec` (`biVec_add_left`, `biVec_sub_left`, + `biVec_smul_left`, `biVec_add_right`, `biVec_sub_right`, `biVec_smul_right`), to + `cartanProd 0 0 + cartanProd 1 1 ± Complex.I • (cartanProd 0 1 - cartanProd 1 0)`, + the sign matching the order of the two arguments, which `cartanProd_eq` writes as + `T ![2, 2] + T ![7, 7] + Complex.I • (T ![2, 7] - T ![7, 2])` and + `T ![2, 2] + T ![7, 7] + Complex.I • (T ![7, 2] - T ![2, 7])` respectively. + + Grade zero is necessary for a gauge invariant to land here, not sufficient: + `SU3PermDecomposition.mem_zero_of_invariant` has no converse, and combining the gauge + weight decomposition with this `SU(3)` permutation decomposition only reaches the cyclic + subgroup of the Weyl group. Section E cuts these four lines down to two, the trivial + isotype of the whole Weyl group, by separating the two combinations of them that the + transposition fixes from the two it negates. That is as far as a finite group takes the + argument; deciding which elements of those two lines are genuinely gauge invariant needs + the continuous part of `GaugeGroupI` — for instance averaging a general element of the + piece over the gauge orbit, the way `IsQuadLorentz` uses boost and rotation averages to + pin down its own Lorentz invariants. -/ +lemma zeroPiece_zero : + hT.zeroPiece 0 + = ℂ ∙ cycleEigen (hT.prodCycle 0) 0 ⊔ ℂ ∙ cycleEigen (hT.prodCycle 1) 0 + ⊔ (ℂ ∙ hT.cartanEigenProd 0 1 ⊔ ℂ ∙ hT.cartanEigenProd 1 0) := by + have hgrade : ∀ a b : Fin 2, cartanGrade a + cartanGrade b = 0 → + (a = 0 ∧ b = 1) ∨ (a = 1 ∧ b = 0) := by decide + rw [zeroPiece] + refine congrArg _ (le_antisymm (iSup_le fun a => iSup_le fun b => iSup_le fun hab => ?_) + (sup_le ?_ ?_)) + · rcases hgrade a b hab with ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact le_sup_left + · exact le_sup_right + · exact le_iSup_of_le 0 (le_iSup_of_le 1 (le_iSup_of_le (by decide) le_rfl)) + · exact le_iSup_of_le 1 (le_iSup_of_le 0 (le_iSup_of_le (by decide) le_rfl)) + +/-- The grade one piece, written out: one line from each cycle of root products, together + with the square of the second Cartan eigenvector. -/ +lemma zeroPiece_one : + hT.zeroPiece 1 + = ℂ ∙ cycleEigen (hT.prodCycle 0) 1 ⊔ ℂ ∙ cycleEigen (hT.prodCycle 1) 1 + ⊔ ℂ ∙ hT.cartanEigenProd 1 1 := by + have hgrade : ∀ a b : Fin 2, cartanGrade a + cartanGrade b = 1 → a = 1 ∧ b = 1 := by decide + rw [zeroPiece] + refine congrArg _ (le_antisymm (iSup_le fun a => iSup_le fun b => iSup_le fun hab => ?_) + (le_iSup_of_le 1 (le_iSup_of_le 1 (le_iSup_of_le (by decide) le_rfl)))) + obtain ⟨rfl, rfl⟩ := hgrade a b hab + exact le_rfl + +/-- The grade two piece, written out: one line from each cycle of root products, together + with the square of the first Cartan eigenvector. -/ +lemma zeroPiece_two : + hT.zeroPiece 2 + = ℂ ∙ cycleEigen (hT.prodCycle 0) 2 ⊔ ℂ ∙ cycleEigen (hT.prodCycle 1) 2 + ⊔ ℂ ∙ hT.cartanEigenProd 0 0 := by + have hgrade : ∀ a b : Fin 2, cartanGrade a + cartanGrade b = 2 → a = 0 ∧ b = 0 := by decide + rw [zeroPiece] + refine congrArg _ (le_antisymm (iSup_le fun a => iSup_le fun b => iSup_le fun hab => ?_) + (le_iSup_of_le 0 (le_iSup_of_le 0 (le_iSup_of_le (by decide) le_rfl)))) + obtain ⟨rfl, rfl⟩ := hgrade a b hab + exact le_rfl + +/-! + +## E. The `S₃` isotypic decomposition of the zero-weight piece + +The cyclic rotation generates half of the Weyl group `S₃` of `SU(3)`; the transposition +`gaugeSU3Transp` reaches the other half, and it does not preserve the cyclic grading. +Conjugating the three-cycle by it inverts the three-cycle, so it carries grade `k` to grade +`-k`: it fixes grade zero and exchanges grades one and two. What replaces the grading is +the isotypic decomposition `SU3WeylDecomposition`, whose three pieces are the trivial, sign +and standard isotypes of `S₃`. + +Section E.1 computes the transposition, first on the Gell-Mann coordinate directions and +then on the weight vectors. Unlike the cyclic rotation it mixes nothing: it fixes the first +root pair up to the sign of its second member, exchanges the other two root pairs, and +negates the first Cartan direction while fixing the second. On the weight vectors it +therefore exchanges the raising and lowering vectors of the first root, exchanges the other +two roots, and exchanges the two Cartan eigenvectors up to a sign. Section E.2 transfers +this to the ten products: the two cycles of root products are exchanged, each running +backwards, and the four products of Cartan eigenvectors are exchanged in pairs. Grade zero +is stable under the transposition as a result, which is the hypothesis that +`SU3PermDecomposition.toWeyl` needs. Section E.3 names the four combinations of the grade +zero generators that the transposition fixes or negates, and section E.4 assembles the +isotypic decomposition and places the trace contraction in its trivial piece. + +The sharpening is real but finite. The trivial isotype is the join of two of the four lines +of grade zero, so this sieve discards the sign isotype — spanned by the two antisymmetric +combinations, which vanish for `T` symmetric in its two indices but not in general — as +well as the two nonzero grades. It remains a sieve: +`SU3WeylDecomposition.mem_triv_of_invariant` has no converse, and `S₃` is finite, so the +gauge weight and the Weyl group together decide invariance under the normaliser of the +torus and nothing more. `rootTriv_add_cartanTriv` measures what is left over: the trace +contraction is half the sum of the two generators of the trivial isotype, and nothing here +says anything about the other combinations of those two generators. Deciding which of them +are gauge invariant needs the continuous part of `GaugeGroupI`, not another finite group. + +## E.1. The transposition on the Gell-Mann directions and the weight vectors + +Conjugation by the transposition matrix permutes the matrix units by the transposition of +the first two colours, so it permutes the Gell-Mann matrices up to signs, this time without +mixing any two of them. + +-/ + +/-- The transposition colour matrix is real and symmetric, so it is its own star. -/ +lemma star_su3TranspMatrix : + star !![(0 : ℂ), -1, 0; -1, 0, 0; 0, 0, -1] = !![(0 : ℂ), -1, 0; -1, 0, 0; 0, 0, -1] := by + ext i j + fin_cases i <;> fin_cases j <;> simp + +/-- The conjugate of each Gell-Mann matrix by the transposition: the sign of the + transposition cancels between the two factors, leaving conjugation by the permutation + matrix of the transposition of the first two colours. -/ +noncomputable def transpGellMann : Fin 8 → Matrix (Fin 3) (Fin 3) ℂ + | 0 => gellMannMatrix 0 + | 1 => -gellMannMatrix 1 + | 2 => -gellMannMatrix 2 + | 3 => gellMannMatrix 5 + | 4 => gellMannMatrix 6 + | 5 => gellMannMatrix 3 + | 6 => gellMannMatrix 4 + | 7 => gellMannMatrix 7 + +/-- Conjugating a Gell-Mann matrix by the transposition. -/ +lemma conj_gellMannMatrix_gaugeSU3Transp (b : Fin 8) : + gaugeSU3Transp.toSU3.1 * gellMannMatrix b * star gaugeSU3Transp.toSU3.1 + = transpGellMann b := by + rw [show gaugeSU3Transp.toSU3.1 = !![(0 : ℂ), -1, 0; -1, 0, 0; 0, 0, -1] from su3Transp_coe, + star_su3TranspMatrix] + fin_cases b <;> ext i j <;> fin_cases i <;> fin_cases j <;> + simp [transpGellMann, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, + gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, + gellMannMatrix_seven, Matrix.mul_apply, Fin.sum_univ_three] + +/-- The coordinates of the image of each Gell-Mann direction under the transposition: the + first root pair is fixed up to the sign of its second member, the other two root pairs + are exchanged, and of the two Cartan directions the first is negated and the second + fixed. -/ +noncomputable def transpCol : Fin 8 → Fin 8 → ℂ + | 0 => unitVec 0 + | 1 => -unitVec 1 + | 2 => -unitVec 2 + | 3 => unitVec 5 + | 4 => unitVec 6 + | 5 => unitVec 3 + | 6 => unitVec 4 + | 7 => unitVec 7 + +/-- The transposition on the Gell-Mann coordinate directions. -/ +lemma rowAct_gaugeSU3Transp_unitVec (b : Fin 8) : + rowAct gaugeSU3Transp (unitVec b) = transpCol b := by + have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by + rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + funext a + rw [rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, + conj_gellMannMatrix_gaugeSU3Transp] + fin_cases b <;> fin_cases a <;> + simp [transpGellMann, gellMannCoeff, transpCol, unitVec, gellMannMatrix_zero, + gellMannMatrix_one, gellMannMatrix_two, gellMannMatrix_three, gellMannMatrix_four, + gellMannMatrix_five, gellMannMatrix_six, gellMannMatrix_seven] + all_goals first + | linear_combination ((1 : ℂ) / 3) * h3 + | norm_num + +/-- The transposition moves each root weight vector into the other cycle, sending the + member at index `i` there to the member at index `1 - i`. -/ +lemma rowAct_gaugeSU3Transp_wtCoeff (j : Fin 2) (i : Fin 3) : + rowAct gaugeSU3Transp (wtCoeff (wtCycle j i)) = wtCoeff (wtCycle (j + 1) (1 - i)) := by + fin_cases j <;> fin_cases i <;> + simp [wtCycle, wtCoeff_inl, wtCoeff_inr_inl, rootPair, rowAct_add, rowAct_sub, + rowAct_smul, rowAct_gaugeSU3Transp_unitVec, transpCol] + all_goals module + +/-- The transposition exchanges the two Cartan eigenvectors, up to a sign. It cannot fix + them: they are the grade one and grade two eigenvectors of the cyclic rotation, and the + transposition inverts grades. -/ +lemma rowAct_gaugeSU3Transp_cartanVec (c : Fin 2) : + rowAct gaugeSU3Transp (cartanVec c) = -cartanVec (c + 1) := by + fin_cases c <;> + simp [cartanVec, ← unitVec_cartanId, GaugeAlgebra.su3CartanId, rowAct_sub, + rowAct_add, rowAct_smul, rowAct_gaugeSU3Transp_unitVec, transpCol] + all_goals module + +/-! + +## E.2. The transposition on the zero-weight products + +The transposition exchanges the two cycles of root products, reversing the direction of +travel, and exchanges the four products of Cartan eigenvectors in pairs. In particular it +exchanges the two grade zero cycle sums, and exchanges the two mixed Cartan products, which +is what makes the grade zero piece stable under it. + +-/ + +/-- The transposition exchanges the two cycles of root products, reversing each. -/ +lemma repGauge_gaugeSU3Transp_prodCycle (j : Fin 2) (i : Fin 3) : + repGauge gaugeSU3Transp (hT.prodCycle j i) = hT.prodCycle (j + 1) (-i) := by + fin_cases j <;> fin_cases i <;> + simp only [prodCycle, hT.repGauge_biVec, rowAct_gaugeSU3Transp_wtCoeff] <;> + rfl + +/-- The transposition exchanges the two Cartan eigenvectors in each product. The two signs + it picks up, one from each factor, cancel. -/ +lemma repGauge_gaugeSU3Transp_cartanEigenProd (a b : Fin 2) : + repGauge gaugeSU3Transp (hT.cartanEigenProd a b) + = hT.cartanEigenProd (a + 1) (b + 1) := by + rw [cartanEigenProd, hT.repGauge_biVec, rowAct_gaugeSU3Transp_cartanVec, + rowAct_gaugeSU3Transp_cartanVec, hT.biVec_neg_neg, cartanEigenProd] + +/-- The transposition exchanges the two grade zero cycle sums. -/ +lemma repGauge_gaugeSU3Transp_cycleEigen_zero (j : Fin 2) : + repGauge gaugeSU3Transp (cycleEigen (hT.prodCycle j) 0) + = cycleEigen (hT.prodCycle (j + 1)) 0 := by + rw [cycleEigen_zero_eq, cycleEigen_zero_eq, map_add, map_add, + hT.repGauge_gaugeSU3Transp_prodCycle, hT.repGauge_gaugeSU3Transp_prodCycle, + hT.repGauge_gaugeSU3Transp_prodCycle, show (-0 : Fin 3) = 0 from rfl, + show (-1 : Fin 3) = 2 from rfl, show (-2 : Fin 3) = 1 from rfl] + abel + +/-- Each grade zero cycle sum lies in the grade zero piece. -/ +lemma cycleEigen_mem_zeroPiece_zero (j : Fin 2) : + cycleEigen (hT.prodCycle j) 0 ∈ hT.zeroPiece 0 := by + rw [zeroPiece] + fin_cases j + · exact Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_span_singleton_self _)) + · exact Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _)) + +/-- A product of two Cartan eigenvectors whose grades cancel lies in the grade zero + piece. -/ +lemma cartanEigenProd_mem_zeroPiece_zero {a b : Fin 2} + (hab : cartanGrade a + cartanGrade b = 0) : + hT.cartanEigenProd a b ∈ hT.zeroPiece 0 := + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem a (Submodule.mem_iSup_of_mem b + (Submodule.mem_iSup_of_mem hab (Submodule.mem_span_singleton_self _)))) + +/-! + +## E.3. The symmetric and antisymmetric combinations of grade zero + +The transposition exchanges the two grade zero cycle sums, and exchanges the two mixed +Cartan products. Their sums are therefore fixed by it and their differences negated, which +is exactly the split of grade zero into the trivial and the sign isotype. Written in the +components of `T` the two symmetric combinations are the symmetric part of the trace: twice +the six root diagonal terms, and twice the two Cartan diagonal terms. The two antisymmetric +combinations are the corresponding antisymmetric parts, and vanish when `T` is symmetric in +its two indices. + +-/ + +/-- The symmetric combination of the two cycles of root products, spanning one line of the + trivial isotype. -/ +noncomputable def rootTriv (hT : IsSU3BiAdjoint B repGauge T) : B := + cycleEigen (hT.prodCycle 0) 0 + cycleEigen (hT.prodCycle 1) 0 + +/-- The antisymmetric combination of the two cycles of root products, spanning one line of + the sign isotype. -/ +noncomputable def rootSign (hT : IsSU3BiAdjoint B repGauge T) : B := + cycleEigen (hT.prodCycle 0) 0 - cycleEigen (hT.prodCycle 1) 0 + +/-- The symmetric combination of the two mixed products of Cartan eigenvectors, spanning + the other line of the trivial isotype. -/ +noncomputable def cartanTriv (hT : IsSU3BiAdjoint B repGauge T) : B := + hT.cartanEigenProd 0 1 + hT.cartanEigenProd 1 0 + +/-- The antisymmetric combination of the two mixed products of Cartan eigenvectors, + spanning the other line of the sign isotype. -/ +noncomputable def cartanSign (hT : IsSU3BiAdjoint B repGauge T) : B := + hT.cartanEigenProd 0 1 - hT.cartanEigenProd 1 0 + +/-- The transposition fixes the symmetric root combination. -/ +lemma repGauge_gaugeSU3Transp_rootTriv : + repGauge gaugeSU3Transp hT.rootTriv = hT.rootTriv := by + rw [rootTriv, map_add, hT.repGauge_gaugeSU3Transp_cycleEigen_zero, + hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + show cycleEigen (hT.prodCycle 1) 0 + cycleEigen (hT.prodCycle 0) 0 = _ + abel + +/-- The transposition negates the antisymmetric root combination. -/ +lemma repGauge_gaugeSU3Transp_rootSign : + repGauge gaugeSU3Transp hT.rootSign = -hT.rootSign := by + rw [rootSign, map_sub, hT.repGauge_gaugeSU3Transp_cycleEigen_zero, + hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + show cycleEigen (hT.prodCycle 1) 0 - cycleEigen (hT.prodCycle 0) 0 = _ + abel + +/-- The transposition fixes the symmetric Cartan combination. -/ +lemma repGauge_gaugeSU3Transp_cartanTriv : + repGauge gaugeSU3Transp hT.cartanTriv = hT.cartanTriv := by + rw [cartanTriv, map_add, hT.repGauge_gaugeSU3Transp_cartanEigenProd, + hT.repGauge_gaugeSU3Transp_cartanEigenProd] + show hT.cartanEigenProd 1 0 + hT.cartanEigenProd 0 1 = _ + abel + +/-- The transposition negates the antisymmetric Cartan combination. -/ +lemma repGauge_gaugeSU3Transp_cartanSign : + repGauge gaugeSU3Transp hT.cartanSign = -hT.cartanSign := by + rw [cartanSign, map_sub, hT.repGauge_gaugeSU3Transp_cartanEigenProd, + hT.repGauge_gaugeSU3Transp_cartanEigenProd] + show hT.cartanEigenProd 1 0 - hT.cartanEigenProd 0 1 = _ + abel + +/-- The symmetric root combination, written out in the components of `T`: twice the six + diagonal components of the root directions. -/ +lemma rootTriv_eq : + hT.rootTriv = (2 : ℂ) • (T ![0, 0] + T ![1, 1] + T ![3, 3] + T ![4, 4] + + T ![5, 5] + T ![6, 6]) := by + rw [rootTriv, cycleEigen_zero_eq, cycleEigen_zero_eq] + simp only [prodCycle_zero_zero, prodCycle_zero_one, prodCycle_zero_two, + prodCycle_one_zero, prodCycle_one_one, prodCycle_one_two, hT.posNegProd_eq, + hT.negPosProd_eq, rootPair] + module + +/-- The antisymmetric root combination, written out in the components of `T`: the + antisymmetric part of the same six components. -/ +lemma rootSign_eq : + hT.rootSign = (2 * Complex.I) • (T ![1, 0] - T ![0, 1] + T ![3, 4] - T ![4, 3] + + T ![6, 5] - T ![5, 6]) := by + rw [rootSign, cycleEigen_zero_eq, cycleEigen_zero_eq] + simp only [prodCycle_zero_zero, prodCycle_zero_one, prodCycle_zero_two, + prodCycle_one_zero, prodCycle_one_one, prodCycle_one_two, hT.posNegProd_eq, + hT.negPosProd_eq, rootPair] + module + +/-- The symmetric Cartan combination, written out in the components of `T`: twice the two + diagonal components of the Cartan directions. -/ +lemma cartanTriv_eq : hT.cartanTriv = (2 : ℂ) • (T ![2, 2] + T ![7, 7]) := by + have hc : ∀ a b : Fin 2, hT.biVec (wtCoeff (Sum.inr (Sum.inr a))) + (wtCoeff (Sum.inr (Sum.inr b))) + = T ![GaugeAlgebra.su3CartanId a, GaugeAlgebra.su3CartanId b] := + fun a b => hT.cartanProd_eq a b + simp only [cartanTriv, cartanEigenProd, cartanVec, hT.biVec_add_left, hT.biVec_sub_left, + hT.biVec_smul_left, hT.biVec_add_right, hT.biVec_sub_right, hT.biVec_smul_right, hc] + match_scalars + all_goals ring_nf + all_goals try simp only [Complex.I_sq] + all_goals ring1 + +/-- The antisymmetric Cartan combination, written out in the components of `T`: the + antisymmetric part of the two mixed Cartan components. -/ +lemma cartanSign_eq : hT.cartanSign = (2 * Complex.I) • (T ![2, 7] - T ![7, 2]) := by + have hc : ∀ a b : Fin 2, hT.biVec (wtCoeff (Sum.inr (Sum.inr a))) + (wtCoeff (Sum.inr (Sum.inr b))) + = T ![GaugeAlgebra.su3CartanId a, GaugeAlgebra.su3CartanId b] := + fun a b => hT.cartanProd_eq a b + simp only [cartanSign, cartanEigenProd, cartanVec, hT.biVec_add_left, hT.biVec_sub_left, + hT.biVec_smul_left, hT.biVec_add_right, hT.biVec_sub_right, hT.biVec_smul_right, hc] + match_scalars + all_goals ring1 + +/-- The two symmetric combinations sum to twice the trace contraction: between them they + cover the eight diagonal components, six from the root directions and two from the Cartan + directions. -/ +lemma rootTriv_add_cartanTriv : + hT.rootTriv + hT.cartanTriv = (2 : ℂ) • hT.traceContraction := by + rw [hT.rootTriv_eq, hT.cartanTriv_eq, traceContraction, Fin.sum_univ_eight] + module + +/-! + +## E.4. The isotypic decomposition + +Symmetrizing and antisymmetrizing over the transposition carry the grade zero piece into +the two symmetric and the two antisymmetric lines respectively, which is enough for three +things at once: grade zero is stable under the transposition, so `toWeyl` applies; the +trivial piece of the resulting decomposition is the join of the two symmetric lines; and +the sign piece is the join of the two antisymmetric ones. The standard piece is the join of +the two nonzero grades, which the transposition exchanges. + +-/ + +/-- Symmetrizing an element of the grade zero piece over the transposition lands in the + join of the two symmetric lines. -/ +lemma add_transp_mem_triv {x : B} (hx : x ∈ hT.zeroPiece 0) : + x + repGauge gaugeSU3Transp x ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by + have key : hT.zeroPiece 0 ≤ Submodule.comap + (LinearMap.id + (repGauge gaugeSU3Transp : Module.End ℂ B)) + (ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv) := by + rw [hT.zeroPiece_zero] + refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem, Submodule.mem_comap, + LinearMap.add_apply, LinearMap.id_apply] + · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + show cycleEigen (hT.prodCycle 1) 0 + cycleEigen (hT.prodCycle 0) 0 ∈ _ + rw [add_comm] + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + show hT.cartanEigenProd 1 0 + hT.cartanEigenProd 0 1 ∈ _ + rw [add_comm] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have h := key hx + rwa [Submodule.mem_comap, LinearMap.add_apply, LinearMap.id_apply] at h + +/-- Antisymmetrizing an element of the grade zero piece over the transposition lands in the + join of the two antisymmetric lines. -/ +lemma sub_transp_mem_sign {x : B} (hx : x ∈ hT.zeroPiece 0) : + x - repGauge gaugeSU3Transp x ∈ ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign := by + have key : hT.zeroPiece 0 ≤ Submodule.comap + (LinearMap.id - (repGauge gaugeSU3Transp : Module.End ℂ B)) + (ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign) := by + rw [hT.zeroPiece_zero] + refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_singleton_le_iff_mem, Submodule.mem_comap, + LinearMap.sub_apply, LinearMap.id_apply] + · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) + · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + show cycleEigen (hT.prodCycle 1) 0 - cycleEigen (hT.prodCycle 0) 0 ∈ _ + rw [← neg_sub] + exact Submodule.mem_sup_left (neg_mem (Submodule.mem_span_singleton_self _)) + · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + show hT.cartanEigenProd 1 0 - hT.cartanEigenProd 0 1 ∈ _ + rw [← neg_sub] + exact Submodule.mem_sup_right (neg_mem (Submodule.mem_span_singleton_self _)) + have h := key hx + rwa [Submodule.mem_comap, LinearMap.sub_apply, LinearMap.id_apply] at h + +/-- The two symmetric lines lie inside the grade zero piece. -/ +lemma sup_span_triv_le_zeroPiece_zero : + ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv ≤ hT.zeroPiece 0 := by + refine sup_le ?_ ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact add_mem (hT.cycleEigen_mem_zeroPiece_zero 0) (hT.cycleEigen_mem_zeroPiece_zero 1) + · exact add_mem (hT.cartanEigenProd_mem_zeroPiece_zero (by decide)) + (hT.cartanEigenProd_mem_zeroPiece_zero (by decide)) + +/-- The two antisymmetric lines lie inside the grade zero piece. -/ +lemma sup_span_sign_le_zeroPiece_zero : + ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign ≤ hT.zeroPiece 0 := by + refine sup_le ?_ ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact sub_mem (hT.cycleEigen_mem_zeroPiece_zero 0) (hT.cycleEigen_mem_zeroPiece_zero 1) + · exact sub_mem (hT.cartanEigenProd_mem_zeroPiece_zero (by decide)) + (hT.cartanEigenProd_mem_zeroPiece_zero (by decide)) + +/-- The transposition preserves the grade zero piece: an element and its symmetrization + both lie there, so the image of the element does too. -/ +lemma repGauge_gaugeSU3Transp_mem_zeroPiece_zero {x : B} (hx : x ∈ hT.zeroPiece 0) : + repGauge gaugeSU3Transp x ∈ hT.zeroPiece 0 := by + have h := hT.sup_span_triv_le_zeroPiece_zero (hT.add_transp_mem_triv hx) + simpa using sub_mem h hx + +/-- The `S₃` isotypic decomposition of the zero-weight piece of the gauge weight + decomposition: the whole Weyl group of `SU(3)` sorting the ten dimensions that the gauge + weight cannot separate. It is the cyclic decomposition upgraded by + `SU3PermDecomposition.toWeyl`, whose hypothesis is met because the transposition + exchanges the two grade zero cycle sums and the two mixed Cartan products. -/ +noncomputable def zeroPieceSU3Weyl (hT : IsSU3BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) : + SU3WeylDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) := + (hT.zeroPieceSU3Perm hmul).toWeyl fun _ hx => + hT.repGauge_gaugeSU3Transp_mem_zeroPiece_zero hx + +/-- The trivial isotype piece, written out: the join of the two symmetric lines. Two of the + four dimensions of grade zero survive here; the other two are of sign isotype. -/ +lemma zeroPieceSU3Weyl_isotypic_triv (hmul : IsMulRep repGauge) : + (hT.zeroPieceSU3Weyl hmul).isotypic .triv + = ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by + rw [zeroPieceSU3Weyl, SU3PermDecomposition.toWeyl_isotypic_triv, zeroPieceSU3Perm_piece] + refine le_antisymm ?_ ?_ + · rintro x ⟨hx0, hxR⟩ + have hR : repGauge gaugeSU3Transp x = x := by + simpa using Module.End.mem_eigenspace_iff.mp hxR + have h := hT.add_transp_mem_triv hx0 + rw [hR] at h + have h2 := Submodule.smul_mem _ ((2 : ℂ)⁻¹) h + rwa [show (2 : ℂ)⁻¹ • (x + x) = x from by module] at h2 + · refine sup_le ?_ ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact ⟨hT.sup_span_triv_le_zeroPiece_zero + (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)), + Module.End.mem_eigenspace_iff.mpr + (by rw [one_smul]; exact hT.repGauge_gaugeSU3Transp_rootTriv)⟩ + · exact ⟨hT.sup_span_triv_le_zeroPiece_zero + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)), + Module.End.mem_eigenspace_iff.mpr + (by rw [one_smul]; exact hT.repGauge_gaugeSU3Transp_cartanTriv)⟩ + +/-- The sign isotype piece, written out: the join of the two antisymmetric lines. This is + the part of grade zero that the cyclic grading alone cannot discard. -/ +lemma zeroPieceSU3Weyl_isotypic_sign (hmul : IsMulRep repGauge) : + (hT.zeroPieceSU3Weyl hmul).isotypic .sign + = ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign := by + rw [zeroPieceSU3Weyl, SU3PermDecomposition.toWeyl_isotypic_sign, zeroPieceSU3Perm_piece] + refine le_antisymm ?_ ?_ + · rintro x ⟨hx0, hxR⟩ + have hR : repGauge gaugeSU3Transp x = -x := by + simpa using Module.End.mem_eigenspace_iff.mp hxR + have h := hT.sub_transp_mem_sign hx0 + rw [hR] at h + have h2 := Submodule.smul_mem _ ((2 : ℂ)⁻¹) h + rwa [show (2 : ℂ)⁻¹ • (x - -x) = x from by module] at h2 + · refine sup_le ?_ ?_ <;> rw [Submodule.span_singleton_le_iff_mem] + · exact ⟨hT.sup_span_sign_le_zeroPiece_zero + (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)), + Module.End.mem_eigenspace_iff.mpr + (by rw [neg_one_smul]; exact hT.repGauge_gaugeSU3Transp_rootSign)⟩ + · exact ⟨hT.sup_span_sign_le_zeroPiece_zero + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)), + Module.End.mem_eigenspace_iff.mpr + (by rw [neg_one_smul]; exact hT.repGauge_gaugeSU3Transp_cartanSign)⟩ + +/-- The standard isotype piece: the join of the two nonzero grades, which the transposition + exchanges and which therefore pair into two-dimensional irreducibles. -/ +lemma zeroPieceSU3Weyl_isotypic_std (hmul : IsMulRep repGauge) : + (hT.zeroPieceSU3Weyl hmul).isotypic .std = hT.zeroPiece 1 ⊔ hT.zeroPiece 2 := rfl + +/-- The trace contraction is of trivial isotype: it is gauge invariant, so in particular + the whole Weyl group fixes it. This is strictly stronger than lying in grade zero, which + is the join of the trivial and the sign isotype. -/ +lemma traceContraction_mem_isotypic_triv (hmul : IsMulRep repGauge) : + hT.traceContraction ∈ (hT.zeroPieceSU3Weyl hmul).isotypic .triv := + SU3WeylDecomposition.mem_triv_of_invariant _ (hT.traceContraction_mem_piece_zero hmul) + hT.repGauge_traceContraction + +/-- The trace contraction lies in the join of the two symmetric lines: of the ten + dimensions of the zero-weight piece, the gauge weight and the Weyl group together confine + it to two. By `rootTriv_add_cartanTriv` it is half the sum of the two generators, so it is + one particular element of that join; which other elements of the join are gauge invariant + is not decided here. -/ +lemma traceContraction_mem_span_triv (hmul : IsMulRep repGauge) : + hT.traceContraction ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by + rw [← hT.zeroPieceSU3Weyl_isotypic_triv hmul] + exact hT.traceContraction_mem_isotypic_triv hmul + end Decomposition end IsSU3BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean new file mode 100644 index 000000000..526746ef8 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean @@ -0,0 +1,426 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition +/-! +# Gauge tensors carrying two `su(3)` fundamental indices + +`IsSU3BiFundamental B repGauge T` says that a family `T`, indexed by two `su(3)` +fundamental indices and valued in a module `B` carrying a representation of the gauge +group `GaugeGroupI`, transforms as a tensor `T^{a₁ a₂}` in the `su(3)` factor of the +fundamental representation. + +This is the colour analogue of `IsSU2BiFundamental`, and the two files agree until the +moment an invariant is asked for. Two `su(2)` doublet indices can be contracted, through +the antisymmetric symbol `ε`, because the doublet is pseudo-real. Two colour triplet +indices cannot. The invariant tensors of `SU(3)` are `ε_{abc}`, which needs three +fundamental indices, and `δ^a_b`, which needs one fundamental index and one +anti-fundamental one; `3 ⊗ 3 = 6 ⊕ 3̄` contains no singlet. So the analogue of +`epsilonContraction` is not merely missing from this file: it does not exist. + +Section A gives the proposition and the span of its components. Section B replaces the +epsilon contraction of the doublet case by the theorem that stands in its place: the centre +`ℤ₃` of `SU(3)` scales a two-index tensor by `ω²`, so an invariant pairing of two colour +triplet indices vanishes, and so does every gauge invariant in the span of the components. +Section C is the gauge weight decomposition of the span, and it reaches the same conclusion +from the torus alone: no sum of two colour weights of the triplet vanishes, so the +zero-weight piece is `⊥`. + +There is no section D. The `SU(2)` file grades its zero-weight piece by the Weyl element +because the gauge weight leaves a plane it cannot split; here the gauge weight leaves +nothing at all, and `SU3PermDecomposition` has nothing to refine. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix + +/-! + +## A. Bi-fundamental `su(3)` families and the span of their components + +The transformation law carries one factor of the fundamental matrix `GaugeGroupI.toSU3 g` +per index, with the summed index in the row slot, exactly as `IsSU2BiFundamental` carries +one factor of `GaugeGroupI.toSU2 g` per index. Since `toSU3` is a monoid homomorphism this +is an action. It is the `SU(3)` factor alone, and is the law obeyed by a product of two +colour triplet symbols once their weak isospin and hypercharge characters are set aside. + +The element `g` still ranges over the whole of `GaugeGroupI`, and that is what makes the +proposition say more than a statement about `SU(3)` would. The right-hand side sees only +`GaugeGroupI.toSU3 g`, so taking `g` in the weak isospin or hypercharge factor forces that +factor to fix every component. Section C reads that off as the vanishing of the isospin and +hypercharge coordinates of every weight, and `GaugeWeightDecomposition` is stated for +representations of `GaugeGroupI`, which a bare `SU(3)` representation cannot supply. + +-/ + +/-- A family `T` of elements of `B`, indexed by two `su(3)` fundamental indices, + transforms as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge + group. -/ +structure IsSU3BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 3) → B) : Prop where + repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 3), + repGauge g (T l) = ∑ a : Fin 2 → Fin 3, + (∏ i : Fin 2, (GaugeGroupI.toSU3 g).1 (a i) (l i)) • T a + +TODO (lines := 63-73) "Make a file IsSU3FunAntiFun, which + is the analogue of IsSU2BiFundamental, and which contains the invariant + δ^a_b." + +namespace IsSU3BiFundamental +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3BiFundamental B repGauge T) + +/-- The span of all the components. -/ +def span (hT : IsSU3BiFundamental B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 3) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 2 → Fin 3) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +end IsSU3BiFundamental + +/-! + +## B. The absence of a two-index invariant + +Here the file parts company with `IsSU2BiFundamental`. There the two doublet indices are +contracted by the antisymmetric symbol, and its invariance is the statement that an `SU(2)` +matrix has determinant one. Nothing plays that role for two colour triplet indices: the +invariant tensors of `SU(3)` are the three-index `ε_{abc}` and the mixed `δ^a_b`, and +`3 ⊗ 3 = 6 ⊕ 3̄` has no singlet in it. + +That is a theorem rather than an absence, and the centre of `SU(3)` proves it. The scalar +matrix `ω • 1`, with `ω` the primitive cube root of unity already used by +`SU3PermDecomposition`, lies in `SU(3)` precisely because `ω ^ 3 = 1` is the determinant +condition. It scales a tensor carrying `k` fundamental indices by `ω ^ k`, so an invariant +one forces `3 ∣ k`, and `k = 2` fails. This is triality: a colour singlet is built from +three quarks, or from a quark and an antiquark, never from two quarks. + +The same element settles the question for the family itself, with no hypothesis beyond the +transformation law: every gauge invariant in the span of the components is zero. Section C +reaches that conclusion again from the gauge torus alone, at the price of the extra +assumptions that a gauge weight decomposition carries. + +-/ + +/-- The primitive cube root of unity has modulus one, so it is inverted by conjugation. -/ +lemma su3Omega_mul_star : su3Omega * star su3Omega = 1 := by + have hnorm : ‖su3Omega‖ = 1 := + Complex.norm_eq_one_of_pow_eq_one su3Omega_pow_three (by norm_num) + rw [show star su3Omega = (starRingEnd ℂ) su3Omega from rfl, Complex.mul_conj] + simp [Complex.normSq_eq_norm_sq, hnorm] + +/-- The square of the primitive cube root of unity is not one. -/ +lemma su3Omega_pow_two_ne_one : su3Omega ^ 2 ≠ 1 := + su3Omega_isPrimitiveRoot.pow_ne_one_of_pos_of_lt (by norm_num) (by norm_num) + +/-- The generator `ω • 1` of the centre `ℤ₃` of `SU(3)`. It is a scalar matrix, so it + commutes with everything, and it lies in the special unitary group because the + determinant condition on a scalar matrix in three dimensions is exactly `ω ^ 3 = 1`. -/ +noncomputable def su3Centre : specialUnitaryGroup (Fin 3) ℂ := + ⟨Matrix.diagonal ![su3Omega, su3Omega, su3Omega], + Matrix.mem_specialUnitaryGroup_diagonal _ + (fun i => by fin_cases i <;> simpa using su3Omega_mul_star) + (by simp [Fin.prod_univ_three, ← pow_three'])⟩ + +/-- The central element acts on a colour index by the scalar `ω`. -/ +lemma su3Centre_apply (a b : Fin 3) : + (su3Centre : specialUnitaryGroup (Fin 3) ℂ).1 a b = if a = b then su3Omega else 0 := by + fin_cases a <;> fin_cases b <;> simp [su3Centre] + +/-- The generator of the centre `ℤ₃` of the colour factor, as an element of the gauge + group. -/ +noncomputable def gaugeSU3Centre : GaugeGroupI := ⟨su3Centre, 1, 1⟩ + +/-- The colour part of the central gauge element is the central element of `SU(3)`. -/ +lemma toSU3_gaugeSU3Centre : GaugeGroupI.toSU3 gaugeSU3Centre = su3Centre := rfl + +namespace IsSU3BiFundamental +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 3) → B} + +/-- Contracting a coefficient family against the central element in both colour indices + multiplies it by `ω ^ 2`, since the central element is `ω` times the identity. -/ +lemma sum_mul_prod_su3Centre (c : (Fin 2 → Fin 3) → ℂ) (a : Fin 2 → Fin 3) : + ∑ d : Fin 2 → Fin 3, c d * ∏ i : Fin 2, (su3Centre.1 (a i) (d i)) + = su3Omega ^ 2 * c a := by + rw [Finset.sum_eq_single a] + · rw [Fin.prod_univ_two, su3Centre_apply, su3Centre_apply, if_pos rfl, if_pos rfl] + ring + · intro d _ hda + have h : a 0 ≠ d 0 ∨ a 1 ≠ d 1 := by + by_contra hc + simp only [not_or, ne_eq, not_not] at hc + exact hda (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) + rw [Fin.prod_univ_two, su3Centre_apply, su3Centre_apply] + rcases h with h | h + · rw [if_neg h, zero_mul, mul_zero] + · rw [if_neg h, mul_zero, mul_zero] + · intro ha + exact absurd (Finset.mem_univ a) ha + +/-- There is no invariant pairing of two `su(3)` fundamental indices: a coefficient family + left unchanged by contraction against two fundamental matrices is zero. Only the centre is + used, and that is the sharp form of the obstruction, the number of indices, two, not being + a multiple of the order three of the centre. -/ +lemma eq_zero_of_sum_mul_prod (c : (Fin 2 → Fin 3) → ℂ) + (hc : ∀ (U : specialUnitaryGroup (Fin 3) ℂ) (a : Fin 2 → Fin 3), + ∑ d : Fin 2 → Fin 3, c d * ∏ i : Fin 2, (U.1 (a i) (d i)) = c a) : + c = 0 := by + funext a + have h := hc su3Centre a + rw [sum_mul_prod_su3Centre] at h + have h0 : (su3Omega ^ 2 - 1) * c a = 0 := by + rw [sub_mul, one_mul, h, sub_self] + rcases mul_eq_zero.1 h0 with h1 | h1 + · exact absurd (sub_eq_zero.1 h1) su3Omega_pow_two_ne_one + · exact h1 + +/-- The centre of the colour factor scales every component of a bi-fundamental family by + `ω ^ 2`, one factor of `ω` for each of its two colour indices. -/ +lemma repGauge_gaugeSU3Centre (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 → Fin 3) : + repGauge gaugeSU3Centre (T l) = (su3Omega ^ 2) • T l := by + rw [hT.repGauge_T gaugeSU3Centre l, Finset.sum_eq_single l] + · rw [Fin.prod_univ_two, toSU3_gaugeSU3Centre, su3Centre_apply, su3Centre_apply, + if_pos rfl, if_pos rfl, sq] + · intro a _ hal + have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by + by_contra hc + simp only [not_or, ne_eq, not_not] at hc + exact hal (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) + rw [Fin.prod_univ_two, toSU3_gaugeSU3Centre, su3Centre_apply, su3Centre_apply] + rcases h with h | h + · rw [if_neg h, zero_mul, zero_smul] + · rw [if_neg h, mul_zero, zero_smul] + · intro hl + exact absurd (Finset.mem_univ l) hl + +/-- Every gauge invariant in the span of the components of a bi-fundamental family + vanishes. The central element scales the whole span by `ω ^ 2`, an invariant element is + fixed as well, and `ω ^ 2 - 1` is not zero. -/ +lemma eq_zero_of_invariant (hT : IsSU3BiFundamental B repGauge T) {x : B} + (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x = 0 := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx + have hscale : repGauge gaugeSU3Centre (∑ d, c d • T d) = (su3Omega ^ 2) • ∑ d, c d • T d := by + rw [map_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [map_smul, hT.repGauge_gaugeSU3Centre d, smul_comm] + rw [hinv gaugeSU3Centre] at hscale + have h0 : (su3Omega ^ 2 - 1) • (∑ d, c d • T d) = 0 := by + rw [sub_smul, one_smul, ← hscale, sub_self] + have hne : su3Omega ^ 2 - 1 ≠ 0 := sub_ne_zero.2 su3Omega_pow_two_ne_one + have := congrArg (fun y => (su3Omega ^ 2 - 1)⁻¹ • y) h0 + simpa [inv_smul_smul₀ hne] using this + +end IsSU3BiFundamental + +/-! + +## C. The gauge weight decomposition of the span + +The gauge torus is diagonal in the fundamental representation of the `SU(3)` factor, so the +three basis colour directions are already weight vectors, carrying the three colour weights +`colourWeight` of the triplet. A component `T d` therefore carries the definite weight +`wtWeight d`, the sum of the weights of its two indices, and the span of the components is +already the join of nine weight lines. Six weights occur: the three weights of the +symmetric `6` that are not shared, and the three weights of the `3̄`, each of which occurs +twice, once from the `6` and once from the `3̄`. + +The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an +algebra and records multiplicativity of the representation, neither of which +`IsSU3BiFundamental` needs, so both appear as extra arguments here. + +-/ + +namespace IsSU3BiFundamental + +set_option linter.unusedVariables false + +/-! + +## C.1. The gauge torus in the fundamental representation + +-/ + +/-- The gauge weight carried by one `su(3)` fundamental index: colour only, the three + colours carrying the three colour weights of the triplet. -/ +def fundWeight (c : Fin 3) : GaugeWeight := ((colourWeight c).1, (colourWeight c).2, 0, 0) + +/-- The gauge torus acts diagonally on a colour index, by the character of the weight of + that index. Only the two colour generators act nontrivially. -/ +lemma toSU3_gaugeTorusGen_apply (i : Fin 4) (a b : Fin 3) : + (GaugeGroupI.toSU3 (gaugeTorusGen i)).1 a b + = if a = b then (expI : ℂ) ^ GaugeWeight.coord (fundWeight a) i else 0 := by + fin_cases i <;> fin_cases a <;> fin_cases b <;> + simp [gaugeTorusGen, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, fundWeight, + colourWeight, expI_inv_eq_star] + +/-- The gauge weight carried by a component of a bi-fundamental family: the sum of the + weights of its two indices. -/ +def wtWeight (l : Fin 2 → Fin 3) : GaugeWeight := fundWeight (l 0) + fundWeight (l 1) + +/-! + +## C.2. The components are weight vectors + +-/ + +section Weights + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 3) → B} + +/-- Every component of a bi-fundamental family is a simultaneous eigenvector of the gauge + torus, at the character of the sum of the weights of its two indices. -/ +lemma repGauge_gaugeTorusGen (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 → Fin 3) + (i : Fin 4) : + repGauge (gaugeTorusGen i) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by + rw [hT.repGauge_T (gaugeTorusGen i) l, Finset.sum_eq_single l] + · congr 1 + rw [Fin.prod_univ_two, toSU3_gaugeTorusGen_apply, toSU3_gaugeTorusGen_apply, + if_pos rfl, if_pos rfl, wtWeight, GaugeWeight.coord_add, + zpow_add₀ expI_ne_zero] + · intro a _ hal + have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by + by_contra hc + simp only [not_or, ne_eq, not_not] at hc + exact hal (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) + rw [Fin.prod_univ_two, toSU3_gaugeTorusGen_apply, toSU3_gaugeTorusGen_apply] + rcases h with h | h + · rw [if_neg h, zero_mul, zero_smul] + · rw [if_neg h, mul_zero, zero_smul] + · intro hl + exact absurd (Finset.mem_univ l) hl + +end Weights + +/-! + +## C.3. The decomposition + +-/ + +section Decomposition + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 3) → B} + +variable (hT : IsSU3BiFundamental B repGauge T) + +/-- The gauge weight decomposition of the span of a bi-fundamental `su(3)` family. The span + is the join of the lines through the nine components, and each of those carries the sum of + the weights of its two indices. -/ +@[implicit_reducible] +noncomputable def gaugeWeightDecomposition (hT : IsSU3BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hmul fun d : Fin 2 → Fin 3 => + GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) + (hT.repGauge_gaugeTorusGen d)) + _ rfl + +/-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through + those components whose weight is `w`. -/ +lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : + (hT.gaugeWeightDecomposition hmul).piece w + = ⨆ d : Fin 2 → Fin 3, (if w = wtWeight d then ℂ ∙ T d else ⊥) := rfl + +/-- The support of the decomposition, before evaluation. -/ +lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = Finset.univ.biUnion fun d : Fin 2 → Fin 3 => + ({wtWeight d} : Finset GaugeWeight) := rfl + +/-- The gauge weights carried by a bi-fundamental `su(3)` family: the six weights of the + tensor square of the `su(3)` fundamental, three of them carried twice. Every one of them + has vanishing weak isospin and hypercharge, since the family carries colour only. -/ +lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = {((2, 0, 0, 0) : GaugeWeight), (-2, 2, 0, 0), (0, -2, 0, 0), + (0, 1, 0, 0), (1, -1, 0, 0), (-1, 0, 0, 0)} := by + rw [hT.gaugeWeightDecomposition_supp_eq hmul] + decide + +/-! + +## C.4. The zero-weight piece is trivial + +A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight +piece, and here that piece is `⊥`. The weight of a component is the sum of two colour +weights of the triplet, and no such sum vanishes: the three colour weights are nonzero, and +no one of them is the negative of another, since the negatives of the triplet weights are +the weights of the antitriplet. That is the weight-theoretic form of the statement that +`3 ⊗ 3` contains no singlet, and it recovers the conclusion of section B for a +representation that carries a gauge weight decomposition. + +-/ + +/-- No component of a bi-fundamental family carries vanishing gauge weight: a sum of two + colour weights of the triplet is never zero. -/ +lemma wtWeight_ne_zero (l : Fin 2 → Fin 3) : wtWeight l ≠ 0 := by + revert l + decide + +/-- The zero-weight piece of the gauge weight decomposition is trivial, no component + carrying vanishing colour weight. -/ +lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).piece 0 = ⊥ := by + rw [hT.gaugeWeightDecomposition_piece hmul] + refine le_antisymm (iSup_le fun d => ?_) bot_le + rw [if_neg fun h => wtWeight_ne_zero d h.symm] + +/-- The gauge torus alone already forbids an invariant: an element of the span fixed by + the four torus generators is zero. Compared with `eq_zero_of_invariant` this asks less of + the element, invariance under the torus rather than under the whole gauge group, and more + of `B`, which has to carry a gauge weight decomposition. -/ +lemma eq_zero_of_gaugeTorusGen_invariant (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ hT.span) (hinv : ∀ i : Fin 4, repGauge (gaugeTorusGen i) x = x) : x = 0 := by + have hmem : x ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := by + rw [GaugeWeightDecomposition.piece_eq_inf] + refine ⟨hx, Submodule.mem_iInf _ |>.mpr fun i => ?_⟩ + rw [Module.End.mem_eigenspace_iff, GaugeWeight.zero_coord, zpow_zero, one_smul] + exact hinv i + rw [hT.gaugeWeightDecomposition_piece_zero hmul] at hmem + exact (Submodule.mem_bot ℂ).mp hmem + +end Decomposition + +end IsSU3BiFundamental + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean index f27ee4b27..a5eb4283e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis +public import Mathlib.RepresentationTheory.Invariants /-! # Gauge tensors carrying two `u(1)` adjoint indices @@ -169,7 +170,8 @@ lemma repGauge_traceContraction (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGrou The `u(1)` adjoint index takes a single value and the gauge group acts trivially on it, so every component of `T` is itself gauge invariant, and hence so is every linear -combination of the components. +combination of the components. At the level of submodules this says that the span sits +inside the invariants of `repGauge`. -/ @@ -188,8 +190,11 @@ lemma repGauge_of_mem_span (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGroupI) { rw [map_sum] exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hT.repGauge_T_self g d] -TODO (lines := 185-190) "Write the spanned version - of this result, similar to in `IsQuadLorentz`." +/-- The span of the components of a bi-adjoint `u(1)` family lies in the gauge + invariants: the submodule form of `repGauge_of_mem_span`. -/ +lemma span_le_invariants (hT : IsU1BiAdjoint B repGauge T) : + hT.span ≤ repGauge.invariants := + fun _ hx => (Representation.mem_invariants _ _).2 fun g => hT.repGauge_of_mem_span g hx end IsU1BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean index 933435779..f51003e0e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Mathlib.LinearAlgebra.Eigenspace.Basic +public import Mathlib.LinearAlgebra.Matrix.Permutation /-! # `SU(3)` permutation decompositions @@ -40,6 +41,50 @@ colour contraction, being cyclically symmetric, lands in grade `0`. The grading to be `ZMod 3` rather than the `ZMod 4` of the `SU(2)` file precisely because the element used here has order three: on `ZMod 4` the character `k ↦ ω ^ k` would not be well defined. +The three-cycle generates only the alternating subgroup `A₃` of the Weyl group `S₃` of +`SU(3)`. The whole of `S₃` is available here too: `su3Weyl` sends a permutation `σ` to its +permutation matrix scaled by the sign of `σ`, which lands in `SU(3)` because the dimension +is odd, and is a group homomorphism because both factors are multiplicative. It is +injective, so `S₃` sits inside `SU(3)` as a genuine subgroup — a point on which `SU(3)` +differs from `SU(2)`, whose Weyl group lifts only to an element of order four. +`su3Transp = !![0, -1, 0; -1, 0, 0; 0, 0, -1]` is the lift of the transposition `(0 1)`; it +squares to `1`, and `t c t = c⁻¹` for `c` the three-cycle. + +That last relation is why the file cannot simply carry on grading. A grading by a group is +a decomposition into simultaneous eigenspaces, so it sees only characters of an abelian +group; `S₃` is not abelian, and of its three irreducible representations — the trivial one, +the sign one, and a two-dimensional standard one — the last is not one dimensional and has +no character to grade by. Concretely `t c t = c⁻¹` says that conjugating by the +transposition inverts the three-cycle, so `rep gaugeSU3Transp` carries the grade-`k` piece +to the grade-`(-k)` piece: it does not preserve the grading, it permutes it, exchanging +grades `1` and `2` and fixing only grade `0`. This is `SU3PermDecomposition.mapTransp`. + +What replaces the grading is the isotypic decomposition. Writing `T` for the three-cycle +and `R` for the transposition, the three isotypic subspaces of `B` are + + `triv = {x | T x = x and R x = x}`, `sign = {x | T x = x and R x = -x}`, + `std = {x | x + T x + T ^ 2 x = 0}`, + +and `su3WeylIsotypic_iSup` proves they span `B` while `su3WeylIsotypic_iSupIndep` proves +they are independent, so `B` is their internal direct sum. The last of the three is the +kernel of the symmetrizer `1 + T + T ^ 2` of the cyclic subgroup, three times the projection +onto the vectors that the three-cycle fixes; over `ℂ` every representation of a finite group +is semisimple, and these statements are that semisimplicity made explicit for `S₃`. +`SU3WeylDecomposition` is the sieve version, a family of subspaces of pure isotype with +supremum `V`, and `SU3WeylDecomposition.ofStable` builds one for every `V` stable under the +two elements. + +Comparing with the grading: grade `0` is the part the three-cycle fixes and splits into +`triv` and `sign` by the sign of the transposition, while grades `1` and `2`, which the +transposition exchanges, together make up the standard piece. That pairing of a `ZMod 3` +orbit into a two-dimensional irreducible is Clifford theory for `A₃ ⊴ S₃` written out by +hand, and it is `SU3PermDecomposition.toWeyl` in the other direction. An isotypic +decomposition is not a grading and does not pretend to be one: there is no analogue of +`SU3PermDecomposition.mul`, because the tensor square of the standard representation +contains all three irreducibles at once. What does survive is the quotient `S₃ ⧸ A₃`, under +which `triv` and `sign` multiply by the rule of signs; see `su3WeylIsotypic_mul_triv_triv` +and its two companions. + ## ii. A warning: grade zero is weaker than invariance Like the colour weight, this is a *sieve* rather than a characterization. @@ -56,28 +101,53 @@ far larger than the `SU(3)` invariants. Even combining this grading with the ful weight only reaches the normalizer of the maximal torus; cutting the remainder down needs the continuous symmetry, not another grading. +Passing to the whole Weyl group sharpens the sieve, but by a finite amount, and it does not +close that gap. `SU3WeylDecomposition.mem_triv_of_invariant` says an invariant element is +of trivial isotype, which is strictly stronger than having grade zero: the sign isotype is +discarded too, and it is genuinely occupied — the three-cycle fixes a two-dimensional space +of root vectors in the adjoint, and the transposition splits it one dimension into `triv` +and one into `sign`. But `S₃` is a finite group, and the invariants of a finite subgroup +remain far larger than the `SU(3)` invariants; the `SU(3)`-invariance of the colour +contraction of three triplets, for instance, is not decided by any of this. Grading by the +torus and sieving by the Weyl group together decide exactly what happens on the normalizer +of the maximal torus, and no more. The argument that closes the remaining gap has to be a +continuous one. + ## iii. Key results - `su3Perm` : the `SU(3)` cyclic Weyl element `!![0, 0, 1; 1, 0, 0; 0, 1, 0]`, and `gaugeSU3Perm` its image in the gauge group. +- `su3Weyl` : the Weyl group `S₃` as a subgroup of `SU(3)`, with `su3Transp` the lift of a + transposition and `gaugeSU3Weyl` the version landing in the gauge group. - `su3Omega` : the primitive cube root of unity `exp (2 π i / 3)`. - `su3PermSign` : the character `k ↦ ω ^ k` on `ZMod 3`, injective and multiplicative. - `SU3PermDecomposition` : a `ZMod 3`-graded family of pure-sign subspaces with supremum `V`. - `SU3PermDecomposition.sup` : two decompositions combine gradewise into one of `V ⊔ V'`. - `SU3PermDecomposition.mul` : grades add under multiplication, decomposing `V * V'`. - `SU3PermDecomposition.mem_zero_of_invariant` : a gauge-invariant element has grade zero. +- `SU3PermDecomposition.mapTransp` : the transposition carries a decomposition to one of the + image submodule, with the grades inverted. +- `su3WeylIsotypic` : the three isotypic subspaces of `S₃`, spanning `B` by + `su3WeylIsotypic_iSup` and independent by `su3WeylIsotypic_iSupIndep`. +- `SU3WeylDecomposition` : a family of subspaces of pure isotype with supremum `V`, built for + every `S₃`-stable `V` by `SU3WeylDecomposition.ofStable`. +- `SU3WeylDecomposition.mem_triv_of_invariant` : a gauge-invariant element is of trivial + isotype, strictly finer than having grade zero. ## iv. Table of contents - A. The `SU(3)` cyclic Weyl element -- B. The cube-root character of `ZMod 3` -- C. `SU(3)` permutation decompositions -- D. Joins -- E. Products -- F. Invariants +- B. The Weyl group `S₃` inside `SU(3)` +- C. The cube-root character of `ZMod 3` +- D. `SU(3)` permutation decompositions +- E. Joins +- F. Products +- G. Invariants +- H. The transposition on the cyclic grades +- I. The isotypic subspaces of `S₃` +- J. `S₃` isotypic decompositions -/ - @[expose] public section namespace StandardModel @@ -130,7 +200,137 @@ noncomputable def gaugeSU3Perm : GaugeGroupI := ⟨su3Perm, 1, 1⟩ /-! -## B. The cube-root character of `ZMod 3` +## B. The Weyl group `S₃` inside `SU(3)` + +-/ + +/-- The Weyl group `S₃` of `SU(3)`, lifted into `SU(3)` itself: a permutation `σ` goes to + its permutation matrix scaled by the sign of `σ`. Both factors are multiplicative in `σ`, + so this is a group homomorphism, and the determinant comes out right because the dimension + is odd — scaling a `3 × 3` matrix by `-1` multiplies its determinant by `-1`, cancelling + the determinant of an odd permutation matrix. No such lift exists for `SU(2)`, where the + Weyl group reaches only an element of order four. -/ +noncomputable def su3Weyl : Equiv.Perm (Fin 3) →* specialUnitaryGroup (Fin 3) ℂ where + toFun σ := ⟨((Equiv.Perm.sign σ : ℤ) : ℂ) • Matrix.permMatrixHom σ, by + have hs : ((Equiv.Perm.sign σ : ℤ) : ℂ) * ((Equiv.Perm.sign σ : ℤ) : ℂ) = 1 := by + rcases Int.units_eq_one_or (Equiv.Perm.sign σ) with h | h <;> rw [h] <;> norm_num + have hstar : (Matrix.permMatrixHom σ : Matrix (Fin 3) (Fin 3) ℂ)ᴴ + = Matrix.permMatrixHom σ⁻¹ := by + simp [Matrix.permMatrixHom_apply] + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff, star_eq_conjTranspose, Matrix.conjTranspose_smul, + star_intCast, hstar, Matrix.smul_mul, Matrix.mul_smul, smul_smul, hs, one_smul, + ← map_mul, mul_inv_cancel, map_one] + · rw [Matrix.det_smul, Matrix.permMatrixHom_apply, Matrix.det_permutation, + Equiv.Perm.sign_inv, Fintype.card_fin] + have h4 : ((Equiv.Perm.sign σ : ℤ) : ℂ) ^ 3 * ((Equiv.Perm.sign σ : ℤ) : ℂ) + = (((Equiv.Perm.sign σ : ℤ) : ℂ) * ((Equiv.Perm.sign σ : ℤ) : ℂ)) + * (((Equiv.Perm.sign σ : ℤ) : ℂ) * ((Equiv.Perm.sign σ : ℤ) : ℂ)) := by ring + rw [h4, hs, one_mul]⟩ + map_one' := by apply Subtype.ext; simp + map_mul' σ τ := by apply Subtype.ext; simp [smul_smul, mul_comm] + +/-- The matrix of the lift of a permutation. -/ +lemma su3Weyl_coe (σ : Equiv.Perm (Fin 3)) : + (su3Weyl σ : specialUnitaryGroup (Fin 3) ℂ).1 + = ((Equiv.Perm.sign σ : ℤ) : ℂ) • Matrix.permMatrixHom σ := rfl + +/-- The lift is injective, so the Weyl group `S₃` is a genuine subgroup of `SU(3)`. A + permutation whose lift is the identity fixes every index, because the diagonal entry at + `i` of the lift is a nonzero sign when `σ` fixes `i` and is `0` otherwise. -/ +lemma su3Weyl_injective : Function.Injective su3Weyl := by + refine (injective_iff_map_eq_one su3Weyl).mpr fun σ hσ => ?_ + have h := Subtype.ext_iff.mp hσ + simp only [su3Weyl_coe, Matrix.permMatrixHom_apply, OneMemClass.coe_one] at h + have hs : ((Equiv.Perm.sign σ : ℤ) : ℂ) ≠ 0 := by + rcases Int.units_eq_one_or (Equiv.Perm.sign σ) with hσ' | hσ' <;> rw [hσ'] <;> norm_num + refine Equiv.ext fun i => ?_ + have hi := congrFun (congrFun h i) (σ⁻¹ i) + simp [Equiv.Perm.permMatrix, PEquiv.toMatrix_apply, Matrix.one_apply] at hi + by_cases h' : i = σ.symm i + · simpa using congrArg σ h' + · rw [if_neg h'] at hi + exact absurd hi hs + +/-- The cyclic element is the lift of the three-cycle `finRotate 3`, which is even and so + needs no sign. -/ +lemma su3Perm_eq_su3Weyl : su3Perm = su3Weyl (finRotate 3) := by + apply Subtype.ext + rw [su3Weyl_coe, su3Perm_coe] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.permMatrixHom_apply, Equiv.Perm.permMatrix, PEquiv.toMatrix_apply] <;> + decide + +/-- The `SU(3)` transposition Weyl element, the lift of the transposition `(0 1)`. It is + minus the permutation matrix of the transposition: negating a `3 × 3` matrix flips the + sign of its determinant, which is exactly the correction an odd permutation needs. Being + minus an involution it is again an involution, unlike the `SU(2)` Weyl element, which + squares to `-1`. -/ +noncomputable def su3Transp : specialUnitaryGroup (Fin 3) ℂ := su3Weyl (Equiv.swap 0 1) + +/-- The underlying matrix of the transposition element. -/ +lemma su3Transp_coe : + (su3Transp : specialUnitaryGroup (Fin 3) ℂ).1 = !![0, -1, 0; -1, 0, 0; 0, 0, -1] := by + rw [su3Transp, su3Weyl_coe] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.permMatrixHom_apply, Equiv.Perm.permMatrix, PEquiv.toMatrix_apply, + Equiv.swap_apply_def] + +/-- The transposition element squares to the identity, so it has order two in `SU(3)`. -/ +lemma su3Transp_mul_self : su3Transp * su3Transp = 1 := by + rw [su3Transp, ← map_mul, + show (Equiv.swap (0 : Fin 3) 1) * Equiv.swap (0 : Fin 3) 1 = 1 from by decide, map_one] + +/-- The defining relation of `S₃`: conjugating the three-cycle by the transposition inverts + it. This is what stops the two elements from being graded by a single abelian group. -/ +lemma su3Transp_mul_su3Perm_mul_su3Transp : + su3Transp * su3Perm * su3Transp = su3Perm⁻¹ := by + rw [su3Transp, su3Perm_eq_su3Weyl, ← map_mul, ← map_mul, ← map_inv] + congr 1 + decide + +/-- The Weyl group as gauge transformations: trivial on isospin and hypercharge. -/ +noncomputable def gaugeSU3Weyl : Equiv.Perm (Fin 3) →* GaugeGroupI where + toFun σ := (su3Weyl σ, 1, 1) + map_one' := by simp [Prod.ext_iff] + map_mul' σ τ := by simp [map_mul] + +/-- The cyclic gauge element is the lift of the three-cycle. -/ +lemma gaugeSU3Perm_eq_gaugeSU3Weyl : gaugeSU3Perm = gaugeSU3Weyl (finRotate 3) := by + rw [gaugeSU3Perm, gaugeSU3Weyl] + simp [su3Perm_eq_su3Weyl] + +/-- The transposition as a gauge transformation: trivial on isospin and hypercharge. -/ +noncomputable def gaugeSU3Transp : GaugeGroupI := ⟨su3Transp, 1, 1⟩ + +/-- The transposition gauge element is the lift of the transposition `(0 1)`. -/ +lemma gaugeSU3Transp_eq_gaugeSU3Weyl : gaugeSU3Transp = gaugeSU3Weyl (Equiv.swap 0 1) := rfl + +/-- The cyclic gauge element has order three. -/ +lemma gaugeSU3Perm_pow_three : gaugeSU3Perm ^ 3 = 1 := by + rw [gaugeSU3Perm_eq_gaugeSU3Weyl, ← map_pow, + show (finRotate 3) ^ 3 = 1 from by decide, map_one] + +/-- The transposition gauge element is an involution. -/ +lemma gaugeSU3Transp_mul_self : gaugeSU3Transp * gaugeSU3Transp = 1 := by + rw [gaugeSU3Transp_eq_gaugeSU3Weyl, ← map_mul, + show (Equiv.swap (0 : Fin 3) 1) * Equiv.swap (0 : Fin 3) 1 = 1 from by decide, map_one] + +/-- The `S₃` relation between the two gauge elements, in the form used below: moving the + three-cycle past the transposition replaces it by its square. -/ +lemma gaugeSU3Perm_mul_gaugeSU3Transp : + gaugeSU3Perm * gaugeSU3Transp = gaugeSU3Transp * gaugeSU3Perm * gaugeSU3Perm := by + rw [gaugeSU3Perm_eq_gaugeSU3Weyl, gaugeSU3Transp_eq_gaugeSU3Weyl, ← map_mul, ← map_mul, + ← map_mul] + congr 1 + decide + +/-! + +## C. The cube-root character of `ZMod 3` -/ @@ -188,9 +388,31 @@ lemma su3PermSign_injective : Function.Injective su3PermSign := by exact ZMod.val_injective 3 (su3Omega_isPrimitiveRoot.pow_inj (ZMod.val_lt k) (ZMod.val_lt l) hkl) +/-- Negating a grade squares its sign, because `-k = k + k` in `ZMod 3`. The Weyl group acts + on the grades by negation, so this is the sign seen after applying the transposition. -/ +lemma su3PermSign_neg (k : ZMod 3) : su3PermSign (-k) = su3PermSign k * su3PermSign k := by + have h : ∀ j : ZMod 3, -j = j + j := by decide + rw [h, su3PermSign_add] + +/-- The three powers of the sign at a nonzero grade sum to zero. This is the orthogonality of + the character `k ↦ ω ^ k` against the trivial one, and it is why the symmetrizer of the + cyclic subgroup kills everything of nonzero grade. -/ +lemma su3PermSign_symmetrizer {k : ZMod 3} (hk : k ≠ 0) : + 1 + su3PermSign k + su3PermSign k ^ 2 = 0 := by + have hω : 1 + su3Omega + su3Omega ^ 2 = 0 := by + have h := su3Omega_isPrimitiveRoot.geom_sum_eq_zero (by norm_num) + simpa [Finset.sum_range_succ] using h + have hcases : ∀ j : ZMod 3, j = 0 ∨ j = 1 ∨ j = 2 := by decide + rcases hcases k with rfl | rfl | rfl + · exact absurd rfl hk + · rw [su3PermSign_one] + exact hω + · rw [su3PermSign_two] + linear_combination hω + su3Omega * su3Omega_pow_three + /-! -## C. `SU(3)` permutation decompositions +## D. `SU(3)` permutation decompositions -/ @@ -249,7 +471,7 @@ lemma bot_piece (k : ZMod 3) : (bot (rep := rep)).piece k = ⊥ := rfl /-! -## D. Joins +## E. Joins -/ @@ -271,7 +493,7 @@ lemma sup_piece (d : SU3PermDecomposition rep V) (d' : SU3PermDecomposition rep /-! -## E. Products +## F. Products -/ @@ -396,7 +618,7 @@ lemma pow_succ_piece (hone : ∀ g : GaugeGroupI, rep g 1 = 1) /-! -## F. Invariants +## G. Invariants -/ @@ -423,4 +645,589 @@ lemma mem_zero_of_invariant (d : SU3PermDecomposition rep V) {x : B} (hx : x ∈ exact hV _ end SU3PermDecomposition + +/-! + +## H. The transposition on the cyclic grades + +-/ + +/-- The three-cycle acts with order three in any representation of the gauge group. -/ +lemma rep_gaugeSU3Perm_cube (rep : Representation ℂ GaugeGroupI B) (x : B) : + rep gaugeSU3Perm (rep gaugeSU3Perm (rep gaugeSU3Perm x)) = x := by + have h : (rep gaugeSU3Perm : Module.End ℂ B) ^ 3 = 1 := by + rw [← map_pow, gaugeSU3Perm_pow_three, map_one] + have h2 := congrArg (fun f : Module.End ℂ B => f x) h + simpa [pow_succ, Module.End.mul_apply] using h2 + +/-- The transposition acts as an involution in any representation of the gauge group. -/ +lemma rep_gaugeSU3Transp_transp (rep : Representation ℂ GaugeGroupI B) (x : B) : + rep gaugeSU3Transp (rep gaugeSU3Transp x) = x := by + have h : (rep gaugeSU3Transp : Module.End ℂ B) * rep gaugeSU3Transp = 1 := by + rw [← map_mul, gaugeSU3Transp_mul_self, map_one] + have h2 := congrArg (fun f : Module.End ℂ B => f x) h + simpa [Module.End.mul_apply] using h2 + +/-- The `S₃` relation in a representation: moving the three-cycle past the transposition + replaces it by its square. -/ +lemma rep_gaugeSU3Perm_gaugeSU3Transp (rep : Representation ℂ GaugeGroupI B) (x : B) : + rep gaugeSU3Perm (rep gaugeSU3Transp x) + = rep gaugeSU3Transp (rep gaugeSU3Perm (rep gaugeSU3Perm x)) := by + have h : (rep gaugeSU3Perm : Module.End ℂ B) * rep gaugeSU3Transp + = rep gaugeSU3Transp * rep gaugeSU3Perm * rep gaugeSU3Perm := by + rw [← map_mul, ← map_mul, ← map_mul, gaugeSU3Perm_mul_gaugeSU3Transp] + have h2 := congrArg (fun f : Module.End ℂ B => f x) h + simpa [Module.End.mul_apply] using h2 + +/-- The transposition sends a vector of grade `k` to one of grade `-k`. The Weyl group does + not preserve the cyclic grading: it permutes the grades, fixing only grade `0` and + exchanging grades `1` and `2`. -/ +lemma rep_gaugeSU3Perm_transp {rep : Representation ℂ GaugeGroupI B} {x : B} {k : ZMod 3} + (hx : rep gaugeSU3Perm x = su3PermSign k • x) : + rep gaugeSU3Perm (rep gaugeSU3Transp x) + = su3PermSign (-k) • rep gaugeSU3Transp x := by + rw [rep_gaugeSU3Perm_gaugeSU3Transp, hx, map_smul, hx, smul_smul, map_smul, + su3PermSign_neg] + +/-- A supremum over `ZMod 3`, written out as a three-term join. -/ +lemma iSup_zmod_three (f : ZMod 3 → Submodule ℂ B) : (⨆ k, f k) = f 0 ⊔ f 1 ⊔ f 2 := by + have hcases : ∀ j : ZMod 3, j = 0 ∨ j = 1 ∨ j = 2 := by decide + refine le_antisymm (iSup_le fun k => ?_) (sup_le (sup_le ?_ ?_) ?_) + · rcases hcases k with rfl | rfl | rfl + · exact le_sup_of_le_left le_sup_left + · exact le_sup_of_le_left le_sup_right + · exact le_sup_right + · exact le_iSup f 0 + · exact le_iSup f 1 + · exact le_iSup f 2 + +/-- A submodule stable under the transposition is the join of its two eigenparts: the + transposition is an involution and `2` is invertible, so `x` is the sum of `(x + R x) / 2` + and `(x - R x) / 2`. -/ +lemma sup_inf_eigenspace_gaugeSU3Transp (rep : Representation ℂ GaugeGroupI B) + (W : Submodule ℂ B) (hstab : ∀ x ∈ W, rep gaugeSU3Transp x ∈ W) : + W ⊓ Module.End.eigenspace (rep gaugeSU3Transp) 1 + ⊔ W ⊓ Module.End.eigenspace (rep gaugeSU3Transp) (-1) = W := by + refine le_antisymm (sup_le inf_le_left inf_le_left) fun x hx => ?_ + refine Submodule.mem_sup.mpr ⟨(2 : ℂ)⁻¹ • (x + rep gaugeSU3Transp x), + ⟨W.smul_mem _ (W.add_mem hx (hstab x hx)), Module.End.mem_eigenspace_iff.mpr ?_⟩, + (2 : ℂ)⁻¹ • (x - rep gaugeSU3Transp x), + ⟨W.smul_mem _ (W.sub_mem hx (hstab x hx)), Module.End.mem_eigenspace_iff.mpr ?_⟩, by + module⟩ + · rw [map_smul, map_add, rep_gaugeSU3Transp_transp] + module + · rw [map_smul, map_sub, rep_gaugeSU3Transp_transp] + module + +namespace SU3PermDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V : Submodule ℂ B} + +/-- The transposition carries a decomposition of `V` to a decomposition of the image of `V`, + with the grades inverted. There is no way to make this a decomposition of `V` itself: the + Weyl group acts on the cyclic gradings, it does not preserve one. -/ +noncomputable def mapTransp (d : SU3PermDecomposition rep V) : + SU3PermDecomposition rep (V.map (rep gaugeSU3Transp)) where + piece k := (d.piece (-k)).map (rep gaugeSU3Transp) + piece_le k x hx := by + rw [Submodule.mem_map] at hx + obtain ⟨y, hy, rfl⟩ := hx + have h := rep_gaugeSU3Perm_transp (d.piece_le (-k) y hy) + rwa [neg_neg] at h + iSup_piece := by + have h : (⨆ k : ZMod 3, d.piece (-k)) = V := + ((Equiv.neg (ZMod 3)).iSup_comp (g := d.piece)).trans d.iSup_piece + rw [← Submodule.map_iSup, h] + +/-- The pieces of the transported decomposition. -/ +@[simp] +lemma mapTransp_piece (d : SU3PermDecomposition rep V) (k : ZMod 3) : + d.mapTransp.piece k = (d.piece (-k)).map (rep gaugeSU3Transp) := rfl + +end SU3PermDecomposition + +/-! + +## I. The isotypic subspaces of `S₃` + +-/ + +/-- The irreducible representations of the Weyl group `S₃`, up to isomorphism. There are + three of them, of dimensions `1`, `1` and `2`. -/ +inductive SU3WeylIrrep + /-- The trivial representation, on which every permutation acts as the identity. -/ + | triv : SU3WeylIrrep + /-- The sign representation, on which a permutation acts by its sign. -/ + | sign : SU3WeylIrrep + /-- The two-dimensional standard representation. -/ + | std : SU3WeylIrrep +deriving DecidableEq + +/-- The dimension of each irreducible representation of `S₃`. The squares sum to the order + of the group: `1 + 1 + 4 = 6`. -/ +def SU3WeylIrrep.dim : SU3WeylIrrep → ℕ + | .triv => 1 + | .sign => 1 + | .std => 2 + +/-- A supremum over the three irreducibles of `S₃`, written out as a three-term join. -/ +lemma iSup_su3WeylIrrep (f : SU3WeylIrrep → Submodule ℂ B) : + (⨆ r, f r) = f .triv ⊔ f .sign ⊔ f .std := by + refine le_antisymm (iSup_le fun r => ?_) (sup_le (sup_le ?_ ?_) ?_) + · cases r + · exact le_sup_of_le_left le_sup_left + · exact le_sup_of_le_left le_sup_right + · exact le_sup_right + · exact le_iSup f .triv + · exact le_iSup f .sign + · exact le_iSup f .std + +/-- The symmetrizer of the cyclic subgroup `A₃`, namely `1 + T + T ^ 2` for `T` the + three-cycle. It is three times the projection onto the vectors that the three-cycle fixes, + so its kernel is where the three-cycle has no invariant vector at all. -/ +noncomputable def su3Symmetrizer (rep : Representation ℂ GaugeGroupI B) : Module.End ℂ B := + 1 + rep gaugeSU3Perm + rep gaugeSU3Perm ^ 2 + +/-- The symmetrizer applied to an element. -/ +lemma su3Symmetrizer_apply (rep : Representation ℂ GaugeGroupI B) (x : B) : + su3Symmetrizer rep x + = x + rep gaugeSU3Perm x + rep gaugeSU3Perm (rep gaugeSU3Perm x) := by + simp [su3Symmetrizer, sq, Module.End.mul_apply] + +/-- The symmetrizer multiplies a vector fixed by the three-cycle by three. -/ +lemma su3Symmetrizer_apply_of_perm_eq {rep : Representation ℂ GaugeGroupI B} {x : B} + (hx : rep gaugeSU3Perm x = x) : su3Symmetrizer rep x = (3 : ℂ) • x := by + rw [su3Symmetrizer_apply, hx, hx] + module + +/-- The isotypic subspace of `B` for each irreducible representation of `S₃`. The three-cycle + acts as the identity on the trivial and sign parts, and the transposition by `1` and `-1` + respectively; the standard part is the kernel of the symmetrizer of the cyclic subgroup. + + These are the honest isotypic components of `B` viewed as a representation of `S₃`: over + `ℂ` every representation of a finite group is semisimple, and `su3WeylIsotypic_iSup` proves + that these three subspaces span. -/ +noncomputable def su3WeylIsotypic (rep : Representation ℂ GaugeGroupI B) : + SU3WeylIrrep → Submodule ℂ B + | .triv => Module.End.eigenspace (rep gaugeSU3Perm) 1 + ⊓ Module.End.eigenspace (rep gaugeSU3Transp) 1 + | .sign => Module.End.eigenspace (rep gaugeSU3Perm) 1 + ⊓ Module.End.eigenspace (rep gaugeSU3Transp) (-1) + | .std => LinearMap.ker (su3Symmetrizer rep) + +/-- Membership of the trivial isotypic subspace: both Weyl elements act as the identity. -/ +lemma mem_su3WeylIsotypic_triv_iff {rep : Representation ℂ GaugeGroupI B} {x : B} : + x ∈ su3WeylIsotypic rep .triv + ↔ rep gaugeSU3Perm x = x ∧ rep gaugeSU3Transp x = x := by + simp [su3WeylIsotypic] + +/-- Membership of the sign isotypic subspace: the three-cycle acts as the identity and the + transposition by `-1`. -/ +lemma mem_su3WeylIsotypic_sign_iff {rep : Representation ℂ GaugeGroupI B} {x : B} : + x ∈ su3WeylIsotypic rep .sign + ↔ rep gaugeSU3Perm x = x ∧ rep gaugeSU3Transp x = -x := by + simp [su3WeylIsotypic] + +/-- Membership of the standard isotypic subspace: the symmetrizer of the cyclic subgroup + kills the vector. -/ +lemma mem_su3WeylIsotypic_std_iff {rep : Representation ℂ GaugeGroupI B} {x : B} : + x ∈ su3WeylIsotypic rep .std + ↔ x + rep gaugeSU3Perm x + rep gaugeSU3Perm (rep gaugeSU3Perm x) = 0 := by + rw [su3WeylIsotypic, LinearMap.mem_ker, su3Symmetrizer_apply] + +/-- A vector of nonzero grade is of standard isotype: the symmetrizer kills it because the + three values of the character at a nonzero grade sum to zero. This is the half of Clifford + theory that turns the pair of grades `{1, 2}` into the two-dimensional irreducible. -/ +lemma mem_su3WeylIsotypic_std_of_grade {rep : Representation ℂ GaugeGroupI B} {x : B} + {k : ZMod 3} (hk : k ≠ 0) + (hx : rep gaugeSU3Perm x = su3PermSign k • x) : + x ∈ su3WeylIsotypic rep .std := by + rw [mem_su3WeylIsotypic_std_iff, hx, map_smul, hx, smul_smul] + have hsum : x + su3PermSign k • x + (su3PermSign k * su3PermSign k) • x + = (1 + su3PermSign k + su3PermSign k ^ 2) • x := by module + rw [hsum, su3PermSign_symmetrizer hk, zero_smul] + +/-- The trivial and sign isotypic subspaces meet only in zero: the transposition cannot act + both as `1` and as `-1` on a nonzero vector. -/ +lemma su3WeylIsotypic_disjoint_triv_sign (rep : Representation ℂ GaugeGroupI B) : + Disjoint (su3WeylIsotypic rep .triv) (su3WeylIsotypic rep .sign) := by + rw [disjoint_iff_inf_le] + intro x hx + have h1 := (mem_su3WeylIsotypic_triv_iff.mp hx.1).2 + have h2 := (mem_su3WeylIsotypic_sign_iff.mp hx.2).2 + have hxx : (2 : ℂ) • x = 0 := by + rw [two_smul] + exact neg_eq_iff_add_eq_zero.mp (h2.symm.trans h1) + rcases smul_eq_zero.mp hxx with h | h + · norm_num at h + · simpa using h + +/-- The standard isotypic subspace meets the vectors fixed by the three-cycle only in zero: + the symmetrizer multiplies such a vector by three and kills it at the same time. -/ +lemma su3WeylIsotypic_disjoint_std (rep : Representation ℂ GaugeGroupI B) : + Disjoint (Module.End.eigenspace (rep gaugeSU3Perm) 1) (su3WeylIsotypic rep .std) := by + rw [disjoint_iff_inf_le] + intro x hx + have h1 : rep gaugeSU3Perm x = x := by + simpa using Module.End.mem_eigenspace_iff.mp hx.1 + have h2 : su3Symmetrizer rep x = 0 := LinearMap.mem_ker.mp hx.2 + rw [su3Symmetrizer_apply_of_perm_eq h1] at h2 + rcases smul_eq_zero.mp h2 with h | h + · norm_num at h + · simpa using h + +/-- The standard isotypic subspace is disjoint from the join of the other two, which both + consist of vectors fixed by the three-cycle. -/ +lemma su3WeylIsotypic_disjoint_std_sup (rep : Representation ℂ GaugeGroupI B) : + Disjoint (su3WeylIsotypic rep .std) + (su3WeylIsotypic rep .triv ⊔ su3WeylIsotypic rep .sign) := + (su3WeylIsotypic_disjoint_std rep).symm.mono_right (sup_le inf_le_left inf_le_left) + +/-- The trivial isotypic subspace is disjoint from the join of the other two. The symmetrizer + kills the standard part of such a vector and multiplies the other two parts by three, so + the standard part vanishes; the trivial and sign parts are already disjoint. -/ +lemma su3WeylIsotypic_disjoint_triv_sup (rep : Representation ℂ GaugeGroupI B) : + Disjoint (su3WeylIsotypic rep .triv) + (su3WeylIsotypic rep .sign ⊔ su3WeylIsotypic rep .std) := by + rw [disjoint_iff_inf_le] + intro x hx + obtain ⟨b, hb, s, hs, rfl⟩ := Submodule.mem_sup.mp hx.2 + have h1 : su3Symmetrizer rep (b + s) = (3 : ℂ) • (b + s) := + su3Symmetrizer_apply_of_perm_eq (mem_su3WeylIsotypic_triv_iff.mp hx.1).1 + rw [map_add, su3Symmetrizer_apply_of_perm_eq (mem_su3WeylIsotypic_sign_iff.mp hb).1, + LinearMap.mem_ker.mp hs, add_zero, smul_add] at h1 + have hs0 : s = 0 := by + have h2 : (3 : ℂ) • s = 0 := by simpa using sub_eq_zero_of_eq h1.symm + rcases smul_eq_zero.mp h2 with h | h + · norm_num at h + · exact h + subst hs0 + rw [add_zero] at hx ⊢ + exact (su3WeylIsotypic_disjoint_triv_sign rep).le_bot ⟨hx.1, hb⟩ + +/-- The sign isotypic subspace is disjoint from the join of the other two, by the same + argument as for the trivial one: the three-cycle acts as the identity on both. -/ +lemma su3WeylIsotypic_disjoint_sign_sup (rep : Representation ℂ GaugeGroupI B) : + Disjoint (su3WeylIsotypic rep .sign) + (su3WeylIsotypic rep .triv ⊔ su3WeylIsotypic rep .std) := by + rw [disjoint_iff_inf_le] + intro x hx + obtain ⟨a, ha, s, hs, rfl⟩ := Submodule.mem_sup.mp hx.2 + have h1 : su3Symmetrizer rep (a + s) = (3 : ℂ) • (a + s) := + su3Symmetrizer_apply_of_perm_eq (mem_su3WeylIsotypic_sign_iff.mp hx.1).1 + rw [map_add, su3Symmetrizer_apply_of_perm_eq (mem_su3WeylIsotypic_triv_iff.mp ha).1, + LinearMap.mem_ker.mp hs, add_zero, smul_add] at h1 + have hs0 : s = 0 := by + have h2 : (3 : ℂ) • s = 0 := by simpa using sub_eq_zero_of_eq h1.symm + rcases smul_eq_zero.mp h2 with h | h + · norm_num at h + · exact h + subst hs0 + rw [add_zero] at hx ⊢ + exact (su3WeylIsotypic_disjoint_triv_sign rep).symm.le_bot ⟨hx.1, ha⟩ + +/-- The three isotypic subspaces are independent. Together with `su3WeylIsotypic_iSup` this + says that `B` is the internal direct sum of its three isotypic parts, which is the isotypic + decomposition of `B` as a representation of the Weyl group `S₃`. -/ +lemma su3WeylIsotypic_iSupIndep (rep : Representation ℂ GaugeGroupI B) : + iSupIndep (su3WeylIsotypic rep) := by + intro r + cases r + · refine (su3WeylIsotypic_disjoint_triv_sup rep).mono_right (iSup₂_le fun j hj => ?_) + cases j + · exact absurd rfl hj + · exact le_sup_left + · exact le_sup_right + · refine (su3WeylIsotypic_disjoint_sign_sup rep).mono_right (iSup₂_le fun j hj => ?_) + cases j + · exact le_sup_left + · exact absurd rfl hj + · exact le_sup_right + · refine (su3WeylIsotypic_disjoint_std_sup rep).mono_right (iSup₂_le fun j hj => ?_) + cases j + · exact le_sup_left + · exact le_sup_right + · exact absurd rfl hj + +/-- Every element of a submodule stable under both Weyl elements is a sum of three elements + of that submodule, one of each isotype. Symmetrizing over the three-cycle and then over the + transposition produces the trivial and sign parts, and what is left over is killed by the + symmetrizer. Over `ℂ` this is the semisimplicity of representations of a finite group, + written out for `S₃`. -/ +lemma mem_sup_su3WeylIsotypic {rep : Representation ℂ GaugeGroupI B} {V : Submodule ℂ B} + (hc : ∀ x ∈ V, rep gaugeSU3Perm x ∈ V) (ht : ∀ x ∈ V, rep gaugeSU3Transp x ∈ V) + {x : B} (hx : x ∈ V) : + x ∈ V ⊓ su3WeylIsotypic rep .triv ⊔ V ⊓ su3WeylIsotypic rep .sign + ⊔ V ⊓ su3WeylIsotypic rep .std := by + have hyV : (3 : ℂ)⁻¹ • (x + rep gaugeSU3Perm x + rep gaugeSU3Perm (rep gaugeSU3Perm x)) + ∈ V := V.smul_mem _ (V.add_mem (V.add_mem hx (hc x hx)) (hc _ (hc x hx))) + set y := (3 : ℂ)⁻¹ • (x + rep gaugeSU3Perm x + rep gaugeSU3Perm (rep gaugeSU3Perm x)) + with hy + have hTy : rep gaugeSU3Perm y = y := by + rw [hy, map_smul, map_add, map_add, rep_gaugeSU3Perm_cube] + module + have hTRy : rep gaugeSU3Perm (rep gaugeSU3Transp y) = rep gaugeSU3Transp y := by + rw [rep_gaugeSU3Perm_gaugeSU3Transp, hTy, hTy] + have hRyV : rep gaugeSU3Transp y ∈ V := ht y hyV + refine Submodule.mem_sup.mpr ⟨(2 : ℂ)⁻¹ • (y + rep gaugeSU3Transp y) + + (2 : ℂ)⁻¹ • (y - rep gaugeSU3Transp y), + Submodule.mem_sup.mpr ⟨(2 : ℂ)⁻¹ • (y + rep gaugeSU3Transp y), + ⟨V.smul_mem _ (V.add_mem hyV hRyV), ?_⟩, + (2 : ℂ)⁻¹ • (y - rep gaugeSU3Transp y), + ⟨V.smul_mem _ (V.sub_mem hyV hRyV), ?_⟩, rfl⟩, x - y, ⟨V.sub_mem hx hyV, ?_⟩, by + module⟩ + · refine mem_su3WeylIsotypic_triv_iff.mpr ⟨?_, ?_⟩ + · rw [map_smul, map_add, hTy, hTRy] + · rw [map_smul, map_add, rep_gaugeSU3Transp_transp] + module + · refine mem_su3WeylIsotypic_sign_iff.mpr ⟨?_, ?_⟩ + · rw [map_smul, map_sub, hTy, hTRy] + · rw [map_smul, map_sub, rep_gaugeSU3Transp_transp] + module + · refine mem_su3WeylIsotypic_std_iff.mpr ?_ + simp only [map_sub] + rw [hTy, hTy, hy] + module + +/-- The three isotypic subspaces span the whole of `B`. This is the isotypic decomposition + of `B` as a representation of the Weyl group `S₃`. -/ +lemma su3WeylIsotypic_iSup (rep : Representation ℂ GaugeGroupI B) : + (⨆ r, su3WeylIsotypic rep r) = ⊤ := by + refine le_antisymm le_top fun x _ => ?_ + have h := mem_sup_su3WeylIsotypic (V := (⊤ : Submodule ℂ B)) (rep := rep) + (fun _ _ => Submodule.mem_top) (fun _ _ => Submodule.mem_top) (Submodule.mem_top (x := x)) + rw [top_inf_eq, top_inf_eq, top_inf_eq] at h + rw [iSup_su3WeylIrrep] + exact h + +/-- Two vectors of trivial isotype have a product of trivial isotype. -/ +lemma su3WeylIsotypic_mul_triv_triv {rep : Representation ℂ GaugeGroupI B} + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : + su3WeylIsotypic rep .triv * su3WeylIsotypic rep .triv + ≤ su3WeylIsotypic rep .triv := by + refine Submodule.mul_le.mpr fun m hm n hn => ?_ + rw [mem_su3WeylIsotypic_triv_iff] at hm hn ⊢ + exact ⟨by rw [hmul, hm.1, hn.1], by rw [hmul, hm.2, hn.2]⟩ + +/-- A vector of trivial isotype times one of sign isotype has sign isotype. -/ +lemma su3WeylIsotypic_mul_triv_sign {rep : Representation ℂ GaugeGroupI B} + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : + su3WeylIsotypic rep .triv * su3WeylIsotypic rep .sign + ≤ su3WeylIsotypic rep .sign := by + refine Submodule.mul_le.mpr fun m hm n hn => ?_ + rw [mem_su3WeylIsotypic_triv_iff] at hm + rw [mem_su3WeylIsotypic_sign_iff] at hn ⊢ + exact ⟨by rw [hmul, hm.1, hn.1], by rw [hmul, hm.2, hn.2, mul_neg]⟩ + +/-- Two vectors of sign isotype have a product of trivial isotype: the sign character squares + to the trivial one. -/ +lemma su3WeylIsotypic_mul_sign_sign {rep : Representation ℂ GaugeGroupI B} + (hmul : ∀ (g : GaugeGroupI) (x y : B), rep g (x * y) = rep g x * rep g y) : + su3WeylIsotypic rep .sign * su3WeylIsotypic rep .sign + ≤ su3WeylIsotypic rep .triv := by + refine Submodule.mul_le.mpr fun m hm n hn => ?_ + rw [mem_su3WeylIsotypic_sign_iff] at hm hn + rw [mem_su3WeylIsotypic_triv_iff] + exact ⟨by rw [hmul, hm.1, hn.1], by rw [hmul, hm.2, hn.2, neg_mul_neg]⟩ + +/-! + +## J. `S₃` isotypic decompositions + +-/ + +/-- An `S₃` isotypic decomposition of a submodule `V`: a family of subspaces indexed by the + irreducible representations of the Weyl group `S₃`, each of pure isotype, whose supremum + is `V`. + + This is what replaces `SU3PermDecomposition` for the whole Weyl group. It is deliberately + not a grading: `S₃` is not abelian, its standard representation is two dimensional, and + there is no character to grade by. Like `SU3PermDecomposition` it is a sieve — the pieces + are only required to lie inside the isotypic subspaces, not to exhaust them — and + `ofStable` builds the canonical one for any `S₃`-stable `V`. -/ +structure SU3WeylDecomposition (rep : Representation ℂ GaugeGroupI B) + (V : Submodule ℂ B) where + /-- The piece of isotype `r`. -/ + isotypic : SU3WeylIrrep → Submodule ℂ B + /-- Each piece is of pure isotype. -/ + isotypic_le : ∀ r, isotypic r ≤ su3WeylIsotypic rep r + /-- The pieces exhaust `V`. -/ + iSup_isotypic : (⨆ r, isotypic r) = V + +namespace SU3WeylDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V V' : Submodule ℂ B} + +/-- The supremum defining a decomposition, written out as a three-term join. -/ +lemma iSup_isotypic_eq (d : SU3WeylDecomposition rep V) : + d.isotypic .triv ⊔ d.isotypic .sign ⊔ d.isotypic .std = V := by + rw [← iSup_su3WeylIrrep] + exact d.iSup_isotypic + +/-- Transport a decomposition along an equality of submodules. -/ +def copy (d : SU3WeylDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + SU3WeylDecomposition rep W where + isotypic := d.isotypic + isotypic_le := d.isotypic_le + iSup_isotypic := by rw [d.iSup_isotypic, hW] + +/-- Copying leaves the pieces unchanged. -/ +@[simp] +lemma copy_isotypic (d : SU3WeylDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : + (d.copy W hW).isotypic = d.isotypic := rfl + +/-- The zero submodule carries the trivial decomposition, with every isotype empty. -/ +def bot : SU3WeylDecomposition rep (⊥ : Submodule ℂ B) where + isotypic _ := ⊥ + isotypic_le _ := bot_le + iSup_isotypic := by simp + +/-- Every piece of the trivial decomposition is the zero submodule. -/ +@[simp] +lemma bot_isotypic (r : SU3WeylIrrep) : (bot (rep := rep)).isotypic r = ⊥ := rfl + +/-- The join of two decompositions: the pieces combine isotype by isotype, decomposing + `V ⊔ V'`. Unlike products, joins respect the isotypic splitting. -/ +noncomputable def sup (d : SU3WeylDecomposition rep V) (d' : SU3WeylDecomposition rep V') : + SU3WeylDecomposition rep (V ⊔ V') where + isotypic r := d.isotypic r ⊔ d'.isotypic r + isotypic_le r := sup_le (d.isotypic_le r) (d'.isotypic_le r) + iSup_isotypic := by rw [iSup_sup_eq, d.iSup_isotypic, d'.iSup_isotypic] + +/-- The pieces of a join are the joins of the pieces. -/ +@[simp] +lemma sup_isotypic (d : SU3WeylDecomposition rep V) (d' : SU3WeylDecomposition rep V') + (r : SU3WeylIrrep) : (d.sup d').isotypic r = d.isotypic r ⊔ d'.isotypic r := rfl + +/-- The canonical isotypic decomposition of a submodule stable under both Weyl elements: the + piece of isotype `r` is the part of `V` lying in the `r` isotypic subspace of `B`. That + these exhaust `V` is `mem_sup_su3WeylIsotypic`, the semisimplicity of `S₃` over `ℂ`. -/ +noncomputable def ofStable (hc : ∀ x ∈ V, rep gaugeSU3Perm x ∈ V) + (ht : ∀ x ∈ V, rep gaugeSU3Transp x ∈ V) : SU3WeylDecomposition rep V where + isotypic r := V ⊓ su3WeylIsotypic rep r + isotypic_le _ := inf_le_right + iSup_isotypic := by + rw [iSup_su3WeylIrrep] + exact le_antisymm (sup_le (sup_le inf_le_left inf_le_left) inf_le_left) + fun _ hx => mem_sup_su3WeylIsotypic hc ht hx + +/-- The pieces of the canonical decomposition of a stable submodule. -/ +@[simp] +lemma ofStable_isotypic (hc : ∀ x ∈ V, rep gaugeSU3Perm x ∈ V) + (ht : ∀ x ∈ V, rep gaugeSU3Transp x ∈ V) (r : SU3WeylIrrep) : + (ofStable hc ht).isotypic r = V ⊓ su3WeylIsotypic rep r := rfl + +/-- The pieces of a decomposition are independent: they lie inside the isotypic subspaces of + `B`, which are independent. A decomposition is therefore a direct sum decomposition of `V`, + and not merely a covering of it. -/ +lemma iSupIndep_isotypic (d : SU3WeylDecomposition rep V) : iSupIndep d.isotypic := + (su3WeylIsotypic_iSupIndep rep).mono d.isotypic_le + +/-- A gauge-invariant element is of trivial isotype. This is strictly finer than + `SU3PermDecomposition.mem_zero_of_invariant`, which only places it in grade zero: grade + zero is the join of the trivial and sign isotypes, and this discards the sign one as well. + + The proof is the character projection written by hand. The symmetrizer multiplies the + invariant element and the trivial and sign parts by three and kills the standard part, so + the standard part vanishes; the transposition then acts as `1` on the element and on the + trivial part and as `-1` on the sign part, so the sign part vanishes too. + + There is still no converse; see the warning in the module docstring. -/ +lemma mem_triv_of_invariant (d : SU3WeylDecomposition rep V) {x : B} (hx : x ∈ V) + (hV : ∀ g : GaugeGroupI, rep g x = x) : x ∈ d.isotypic .triv := by + rw [← d.iSup_isotypic, iSup_su3WeylIrrep] at hx + obtain ⟨w, hw, s, hs, rfl⟩ := Submodule.mem_sup.mp hx + obtain ⟨a, ha, b, hb, rfl⟩ := Submodule.mem_sup.mp hw + have hta := mem_su3WeylIsotypic_triv_iff.mp (d.isotypic_le .triv ha) + have htb := mem_su3WeylIsotypic_sign_iff.mp (d.isotypic_le .sign hb) + have hts : su3Symmetrizer rep s = 0 := LinearMap.mem_ker.mp (d.isotypic_le .std hs) + have hs0 : s = 0 := by + have hsum : su3Symmetrizer rep (a + b + s) + = su3Symmetrizer rep a + su3Symmetrizer rep b + su3Symmetrizer rep s := by + rw [map_add, map_add] + rw [su3Symmetrizer_apply_of_perm_eq (hV gaugeSU3Perm), + su3Symmetrizer_apply_of_perm_eq hta.1, su3Symmetrizer_apply_of_perm_eq htb.1, hts] at hsum + have h3 : (3 : ℂ) • s = 0 := by + have := hsum + rw [smul_add, smul_add] at this + simpa using sub_eq_zero.mpr this + rcases smul_eq_zero.mp h3 with h | h + · norm_num at h + · exact h + subst hs0 + have hR : rep gaugeSU3Transp (a + b + 0) = a + b + 0 := hV gaugeSU3Transp + rw [add_zero, map_add, htb.2, hta.2] at hR + have hb0 : (2 : ℂ) • b = 0 := by + rw [two_smul] + exact neg_eq_iff_add_eq_zero.mp (add_left_cancel hR) + rcases smul_eq_zero.mp hb0 with h | h + · norm_num at h + · rw [h, add_zero, add_zero] + exact ha + +end SU3WeylDecomposition + +namespace SU3PermDecomposition + +variable {rep : Representation ℂ GaugeGroupI B} {V : Submodule ℂ B} + +/-- The two nonzero grades are of standard isotype. Together with `piece_le_eigenspace` at + grade `0`, this places every cyclic decomposition inside the isotypic picture: grade `0` + is where the trivial and sign isotypes live, and grades `1` and `2`, which the transposition + exchanges, make up the standard one. -/ +lemma piece_le_su3WeylIsotypic_std (d : SU3PermDecomposition rep V) {k : ZMod 3} + (hk : k ≠ 0) : d.piece k ≤ su3WeylIsotypic rep .std := + fun x hx => mem_su3WeylIsotypic_std_of_grade hk (d.piece_le k x hx) + +/-- A cyclic decomposition whose grade-zero piece is stable under the transposition upgrades + to an isotypic decomposition for the whole Weyl group. Grade zero splits into the trivial + and sign pieces according to the sign of the transposition, and grades `1` and `2` join to + give the standard piece. Stability of grade zero is needed and is not automatic: the + transposition inverts grades, so it does preserve the grade-zero eigenspace of `B`, but the + grade-zero piece of a decomposition need only sit inside that eigenspace. -/ +noncomputable def toWeyl (d : SU3PermDecomposition rep V) + (hstab : ∀ x ∈ d.piece 0, rep gaugeSU3Transp x ∈ d.piece 0) : + SU3WeylDecomposition rep V where + isotypic + | .triv => d.piece 0 ⊓ Module.End.eigenspace (rep gaugeSU3Transp) 1 + | .sign => d.piece 0 ⊓ Module.End.eigenspace (rep gaugeSU3Transp) (-1) + | .std => d.piece 1 ⊔ d.piece 2 + isotypic_le r := by + have h0 : d.piece 0 ≤ Module.End.eigenspace (rep gaugeSU3Perm) 1 := by + simpa using d.piece_le_eigenspace 0 + cases r + · exact inf_le_inf_right _ h0 + · exact inf_le_inf_right _ h0 + · exact sup_le (d.piece_le_su3WeylIsotypic_std (by decide)) + (d.piece_le_su3WeylIsotypic_std (by decide)) + iSup_isotypic := by + rw [iSup_su3WeylIrrep] + show d.piece 0 ⊓ Module.End.eigenspace (rep gaugeSU3Transp) 1 + ⊔ d.piece 0 ⊓ Module.End.eigenspace (rep gaugeSU3Transp) (-1) + ⊔ (d.piece 1 ⊔ d.piece 2) = V + rw [sup_inf_eigenspace_gaugeSU3Transp rep _ hstab, ← sup_assoc, ← iSup_zmod_three] + exact d.iSup_piece + +/-- The trivial piece of the upgraded decomposition. -/ +@[simp] +lemma toWeyl_isotypic_triv (d : SU3PermDecomposition rep V) + (hstab : ∀ x ∈ d.piece 0, rep gaugeSU3Transp x ∈ d.piece 0) : + (d.toWeyl hstab).isotypic .triv + = d.piece 0 ⊓ Module.End.eigenspace (rep gaugeSU3Transp) 1 := rfl + +/-- The sign piece of the upgraded decomposition. -/ +@[simp] +lemma toWeyl_isotypic_sign (d : SU3PermDecomposition rep V) + (hstab : ∀ x ∈ d.piece 0, rep gaugeSU3Transp x ∈ d.piece 0) : + (d.toWeyl hstab).isotypic .sign + = d.piece 0 ⊓ Module.End.eigenspace (rep gaugeSU3Transp) (-1) := rfl + +/-- The standard piece of the upgraded decomposition. -/ +@[simp] +lemma toWeyl_isotypic_std (d : SU3PermDecomposition rep V) + (hstab : ∀ x ∈ d.piece 0, rep gaugeSU3Transp x ∈ d.piece 0) : + (d.toWeyl hstab).isotypic .std = d.piece 1 ⊔ d.piece 2 := rfl + +end SU3PermDecomposition + end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean index 45fc41e46..fbf75c563 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean @@ -27,10 +27,18 @@ weights of the two factors, so it lies in the corresponding mass-weight submodul is gauge invariant, so it lies in the zero-weight piece of the gauge weight decomposition of that submodule. +The bi-adjoint subspaces themselves, the spans of the components of these families, are +related to the mass-weight submodules in both directions. Each such span lies inside the +mass-weight submodule of the sum of the two mass weights, and conversely the colour and +isospin generators of the zero-weight piece of mass weight eight lie inside the spans of +the underived gluon and `W`-boson families. + - A. The gauge transformation of the gauge-factor field strengths - B. Products of two field strengths as bi-adjoint families -- C. The trace contractions and their mass weights -- D. The underived trace contractions at mass weight eight +- C. The bi-adjoint spans inside the mass-weight submodules +- D. The trace contractions and their mass weights +- E. The underived trace contractions at mass weight eight +- F. The weight vectors of mass weight eight inside the bi-adjoint spans -/ @@ -151,7 +159,154 @@ lemma isU1BiAdjoint_hyperchargeField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fi /-! -## C. The trace contractions and their mass weights +## C. The bi-adjoint spans inside the mass-weight submodules + +Every component of one of the three families of section B is a product of two +field-strength symbols, one carrying `n` covariant derivatives and one carrying `m`. +Such a product lies in `derivSubmodule n * derivSubmodule m`, and so in the mass-weight +submodule of weight `2 * (2 + n) + 2 * (2 + m)`; a span is the smallest submodule +containing its generators, so the whole bi-adjoint subspace lies there too. + +What holds is an inclusion and not an equality. The mass-weight submodule of that weight +also contains the towers carrying more covariant derivatives, and the products mixing +two different gauge factors, and none of those is a component of any of the three +families. For the `u(1)` family the inclusion sharpens: every component of a bi-adjoint +`u(1)` family is gauge invariant already, so its span meets the mass-weight submodule +inside the gauge invariants. + +-/ + +/-- Every field-strength symbol lies in the derivative submodule of its own number of + covariant derivatives. -/ +lemma F_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : F l μ ν φ ∈ h.derivSubmodule n := by + rw [derivSubmodule] + exact Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.subset_span ⟨φ, rfl⟩))) + +/-- The gluon field strength lies in the derivative submodule of its own number of + covariant derivatives. -/ +lemma gluonField_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (a : Fin 8) : h.gluonField l μ ν a ∈ h.derivSubmodule n := + h.F_mem_derivSubmodule l μ ν _ + +/-- The `W`-boson field strength lies in the derivative submodule of its own number of + covariant derivatives. -/ +lemma wField_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (i : Fin 3) : h.wField l μ ν i ∈ h.derivSubmodule n := + h.F_mem_derivSubmodule l μ ν _ + +/-- The hypercharge field strength lies in the derivative submodule of its own number of + covariant derivatives. -/ +lemma hyperchargeField_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : h.hyperchargeField l μ ν ∈ h.derivSubmodule n := + h.F_mem_derivSubmodule l μ ν _ + +/-- A product of two derivative submodules lies in the mass-weight submodule of the sum + of the two mass weights. -/ +lemma derivSubmodule_mul_le_massWeightSubmodule (n m : ℕ) : + h.derivSubmodule n * h.derivSubmodule m + ≤ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) := + Submodule.mul_le.mpr fun _ hx _ hy => + h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul + (h.derivSubmodule_le_massWeightSubmodule n hx) + (h.derivSubmodule_le_massWeightSubmodule m hy)) + +/-- A product of two field-strength symbols with `n` and `m` covariant derivatives has + mass weight the sum of the two individual mass weights. -/ +lemma F_mul_F_mem_massWeightSubmodule {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℝ GaugeAlgebra) : + F l μ ν φ * F l' μ' ν' φ' + ∈ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) := + h.derivSubmodule_mul_le_massWeightSubmodule n m (Submodule.mul_mem_mul + (h.F_mem_derivSubmodule l μ ν φ) (h.F_mem_derivSubmodule l' μ' ν' φ')) + +/-- The bi-adjoint subspace of a product of two gluon field strengths lies in the + product of the two derivative submodules the factors come from. -/ +lemma isSU3BiAdjoint_gluonField_mul_span_le_derivSubmodule_mul {n m : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').span + ≤ h.derivSubmodule n * h.derivSubmodule m := by + intro x hx + obtain ⟨c, rfl⟩ := + ((h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').mem_span_iff x).1 hx + exact Submodule.sum_mem _ fun d _ => Submodule.smul_mem _ _ + (Submodule.mul_mem_mul (h.gluonField_mem_derivSubmodule l μ ν (d 0)) + (h.gluonField_mem_derivSubmodule l' μ' ν' (d 1))) + +/-- The bi-adjoint subspace of a product of two `W`-boson field strengths lies in the + product of the two derivative submodules the factors come from. -/ +lemma isSU2BiAdjoint_wField_mul_span_le_derivSubmodule_mul {n m : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').span + ≤ h.derivSubmodule n * h.derivSubmodule m := by + intro x hx + obtain ⟨c, rfl⟩ := ((h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').mem_span_iff x).1 hx + exact Submodule.sum_mem _ fun d _ => Submodule.smul_mem _ _ + (Submodule.mul_mem_mul (h.wField_mem_derivSubmodule l μ ν (d 0)) + (h.wField_mem_derivSubmodule l' μ' ν' (d 1))) + +/-- The bi-adjoint subspace of a product of two hypercharge field strengths lies in the + product of the two derivative submodules the factors come from. -/ +lemma isU1BiAdjoint_hyperchargeField_mul_span_le_derivSubmodule_mul {n m : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').span + ≤ h.derivSubmodule n * h.derivSubmodule m := by + intro x hx + obtain ⟨c, rfl⟩ := + ((h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').mem_span_iff x).1 hx + exact Submodule.sum_mem _ fun d _ => Submodule.smul_mem _ _ + (Submodule.mul_mem_mul (h.hyperchargeField_mem_derivSubmodule l μ ν) + (h.hyperchargeField_mem_derivSubmodule l' μ' ν')) + +/-- The bi-adjoint subspace of a product of two gluon field strengths lies in the + mass-weight submodule of the sum of the two mass weights. -/ +lemma isSU3BiAdjoint_gluonField_mul_span_le_massWeightSubmodule {n m : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').span + ≤ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) := + (h.isSU3BiAdjoint_gluonField_mul_span_le_derivSubmodule_mul l μ ν l' μ' ν').trans + (h.derivSubmodule_mul_le_massWeightSubmodule n m) + +/-- The bi-adjoint subspace of a product of two `W`-boson field strengths lies in the + mass-weight submodule of the sum of the two mass weights. -/ +lemma isSU2BiAdjoint_wField_mul_span_le_massWeightSubmodule {n m : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').span + ≤ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) := + (h.isSU2BiAdjoint_wField_mul_span_le_derivSubmodule_mul l μ ν l' μ' ν').trans + (h.derivSubmodule_mul_le_massWeightSubmodule n m) + +/-- The bi-adjoint subspace of a product of two hypercharge field strengths lies in the + mass-weight submodule of the sum of the two mass weights. -/ +lemma isU1BiAdjoint_hyperchargeField_mul_span_le_massWeightSubmodule {n m : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').span + ≤ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) := + (h.isU1BiAdjoint_hyperchargeField_mul_span_le_derivSubmodule_mul l μ ν l' μ' ν').trans + (h.derivSubmodule_mul_le_massWeightSubmodule n m) + +/-- The bi-adjoint subspace of a product of two hypercharge field strengths is a space of + gauge invariants of the expected mass weight, the `u(1)` adjoint action being + trivial. -/ +lemma isU1BiAdjoint_hyperchargeField_mul_span_le_inf {n m : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) + (μ' ν' : Fin 1 ⊕ Fin 3) : + (h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').span + ≤ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) ⊓ repGauge.invariants := + le_inf (h.isU1BiAdjoint_hyperchargeField_mul_span_le_massWeightSubmodule l μ ν l' μ' ν') + (IsU1BiAdjoint.span_le_invariants _) + +/-! + +## D. The trace contractions and their mass weights -/ @@ -179,25 +334,6 @@ lemma traceContraction_hyperchargeField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ = h.hyperchargeField l μ ν * h.hyperchargeField l' μ' ν' := by simp [IsU1BiAdjoint.traceContraction] -/-- Every field-strength symbol lies in the derivative submodule of its own number of - covariant derivatives. -/ -lemma F_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : F l μ ν φ ∈ h.derivSubmodule n := by - rw [derivSubmodule] - exact Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ - (Submodule.mem_iSup_of_mem ν (Submodule.subset_span ⟨φ, rfl⟩))) - -/-- A product of two field-strength symbols with `n` and `m` covariant derivatives has - mass weight the sum of the two individual mass weights. -/ -lemma F_mul_F_mem_massWeightSubmodule {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) - (μ' ν' : Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℝ GaugeAlgebra) : - F l μ ν φ * F l' μ' ν' φ' - ∈ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) := - h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul - (h.derivSubmodule_le_massWeightSubmodule n (h.F_mem_derivSubmodule l μ ν φ)) - (h.derivSubmodule_le_massWeightSubmodule m (h.F_mem_derivSubmodule l' μ' ν' φ'))) - /-- The gluon trace contraction is a gauge invariant of the expected mass weight: it lies in the mass-weight submodule of weight the sum of the two individual mass weights, and it is fixed by the whole gauge group. -/ @@ -235,7 +371,7 @@ lemma traceContraction_hyperchargeField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 /-! -## D. The underived trace contractions at mass weight eight +## E. The underived trace contractions at mass weight eight The product of two underived field strengths has mass weight eight, the `F · F` half of `massWeightSubmodule_eight_eq`. Each of the three trace contractions there is a gauge @@ -299,6 +435,232 @@ lemma traceContraction_hyperchargeField_mul_mem_piece_zero (μ ν μ' ν' : Fin (Submodule.mem_inf.mp (h.traceContraction_hyperchargeField_mul_mem_eight μ ν μ' ν')).1 fun g => IsU1BiAdjoint.repGauge_traceContraction _ g +/-! + +## F. The weight vectors of mass weight eight inside the bi-adjoint spans + +Section C runs from the bi-adjoint side to the mass-weight side. The opposite direction +is available for the parts of the mass-weight submodules that see a single gauge factor. +The gauge weight decomposition of the derivative submodules is built from the weight +vectors `adjVec` of one adjoint index, and on a colour direction such a vector is a +combination of gluon field strengths, on the isospin directions a combination of +`W`-boson field strengths, and on the hypercharge direction the hypercharge field +strength itself. A product of two of them is then a bi-adjoint weight vector of the +matching family, so it lies in the span of that family. + +At mass weight eight this covers the gluon root part and the isospin root part of the +zero-weight piece computed by `massWeightSubmoduleGaugeWeightEight_piece_zero`. It does +not cover the neutral Cartan part, whose generators may pair a Cartan direction of one +gauge factor with a Cartan direction of another, and such a mixed product is a component +of none of the three bi-adjoint families. + +-/ + +/-- The `su(3)` adjoint weight indices read as weight indices of the whole gauge + algebra: the three colour roots and the two colour Cartan directions. -/ +def su3AdjIdx : IsSU3BiAdjoint.WeightIdx → Fin 4 ⊕ Fin 4 ⊕ Fin 4 + | Sum.inl r => Sum.inl r.castSucc + | Sum.inr (Sum.inl r) => Sum.inr (Sum.inl r.castSucc) + | Sum.inr (Sum.inr c) => Sum.inr (Sum.inr c.castSucc.castSucc) + +/-- The `su(2)` adjoint weight indices read as weight indices of the whole gauge + algebra: the isospin root and the isospin Cartan direction. -/ +def su2AdjIdx : IsSU2BiAdjoint.WeightIdx → Fin 4 ⊕ Fin 4 ⊕ Fin 4 + | Sum.inl _ => Sum.inl 3 + | Sum.inr (Sum.inl _) => Sum.inr (Sum.inl 3) + | Sum.inr (Sum.inr _) => Sum.inr (Sum.inr 2) + +/-- A weight vector of the colour part of the adjoint is the matching combination of + gluon field strengths. -/ +lemma sum_wtCoeff_smul_gluonField {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (k : IsSU3BiAdjoint.WeightIdx) : + ∑ a : Fin 8, IsSU3BiAdjoint.wtCoeff k a • h.gluonField l μ ν a + = h.adjVec l μ ν (su3AdjIdx k) := by + match k with + | Sum.inl r => + rw [show h.adjVec l μ ν (su3AdjIdx (Sum.inl r)) + = F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx r.castSucc).1) + + Complex.I • + F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx r.castSucc).2) + from rfl, IsSU3BiAdjoint.rootIdx_castSucc] + simp only [IsSU3BiAdjoint.wtCoeff, add_smul, ite_smul, one_smul, zero_smul, mul_ite, + mul_one, mul_zero, Finset.sum_add_distrib, Finset.sum_ite_eq', Finset.mem_univ, + if_true] + rfl + | Sum.inr (Sum.inl r) => + rw [show h.adjVec l μ ν (su3AdjIdx (Sum.inr (Sum.inl r))) + = F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx r.castSucc).1) + - Complex.I • + F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx r.castSucc).2) + from rfl, IsSU3BiAdjoint.rootIdx_castSucc] + simp only [IsSU3BiAdjoint.wtCoeff, sub_smul, ite_smul, one_smul, zero_smul, mul_ite, + mul_one, mul_zero, Finset.sum_sub_distrib, Finset.sum_ite_eq', Finset.mem_univ, + if_true] + rfl + | Sum.inr (Sum.inr c) => + rw [show h.adjVec l μ ν (su3AdjIdx (Sum.inr (Sum.inr c))) + = F l μ ν (GaugeAlgebra.stdBasis.coord + (GaugeAlgebra.cartanIdx c.castSucc.castSucc)) from rfl, + IsSU3BiAdjoint.cartanIdx_castSucc] + simp only [IsSU3BiAdjoint.wtCoeff, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq', Finset.mem_univ, if_true] + rfl + +/-- A weight vector of the isospin part of the adjoint is the matching combination of + `W`-boson field strengths. -/ +lemma sum_wtCoeff_smul_wField {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (k : IsSU2BiAdjoint.WeightIdx) : + ∑ i : Fin 3, IsSU2BiAdjoint.wtCoeff k i • h.wField l μ ν i + = h.adjVec l μ ν (su2AdjIdx k) := by + match k with + | Sum.inl r => + rw [show h.adjVec l μ ν (su2AdjIdx (Sum.inl r)) + = F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx 3).1) + + Complex.I • F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx 3).2) + from rfl, IsSU2BiAdjoint.rootIdx_three] + simp only [IsSU2BiAdjoint.wtCoeff, add_smul, ite_smul, one_smul, zero_smul, mul_ite, + mul_one, mul_zero, Finset.sum_add_distrib, Finset.sum_ite_eq', Finset.mem_univ, + if_true] + rfl + | Sum.inr (Sum.inl r) => + rw [show h.adjVec l μ ν (su2AdjIdx (Sum.inr (Sum.inl r))) + = F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx 3).1) + - Complex.I • F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.rootIdx 3).2) + from rfl, IsSU2BiAdjoint.rootIdx_three] + simp only [IsSU2BiAdjoint.wtCoeff, sub_smul, ite_smul, one_smul, zero_smul, mul_ite, + mul_one, mul_zero, Finset.sum_sub_distrib, Finset.sum_ite_eq', Finset.mem_univ, + if_true] + rfl + | Sum.inr (Sum.inr c) => + rw [show h.adjVec l μ ν (su2AdjIdx (Sum.inr (Sum.inr c))) + = F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.cartanIdx 2)) from rfl, + IsSU2BiAdjoint.cartanIdx_two] + simp only [IsSU2BiAdjoint.wtCoeff, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq', Finset.mem_univ, if_true] + rfl + +/-- A bi-adjoint weight vector of a product of two gluon field strengths is the product + of the two contracted field strengths. -/ +lemma biVec_gluonField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) (c₀ c₁ : Fin 8 → ℂ) : + (h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').biVec c₀ c₁ + = (∑ a : Fin 8, c₀ a • h.gluonField l μ ν a) + * ∑ b : Fin 8, c₁ b • h.gluonField l' μ' ν' b := by + rw [IsSU3BiAdjoint.biVec, IsSU3BiAdjoint.sum_pi_two, Fintype.sum_mul_sum] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm] + simp + +/-- A bi-adjoint weight vector of a product of two `W`-boson field strengths is the + product of the two contracted field strengths. -/ +lemma biVec_wField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) (c₀ c₁ : Fin 3 → ℂ) : + (h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').biVec c₀ c₁ + = (∑ i : Fin 3, c₀ i • h.wField l μ ν i) + * ∑ j : Fin 3, c₁ j • h.wField l' μ' ν' j := by + rw [IsSU2BiAdjoint.biVec, IsSU2BiAdjoint.sum_pi_two, Fintype.sum_mul_sum] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm] + simp + +/-- A product of two colour weight vectors of the adjoint is a bi-adjoint weight vector + of the corresponding family of two gluon field strengths. -/ +lemma adjVec_mul_adjVec_eq_biVec_gluonField {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (k₀ k₁ : IsSU3BiAdjoint.WeightIdx) : + h.adjVec l μ ν (su3AdjIdx k₀) * h.adjVec l' μ' ν' (su3AdjIdx k₁) + = (h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').biVec + (IsSU3BiAdjoint.wtCoeff k₀) (IsSU3BiAdjoint.wtCoeff k₁) := by + rw [h.biVec_gluonField_mul, h.sum_wtCoeff_smul_gluonField, + h.sum_wtCoeff_smul_gluonField] + +/-- A product of two isospin weight vectors of the adjoint is a bi-adjoint weight vector + of the corresponding family of two `W`-boson field strengths. -/ +lemma adjVec_mul_adjVec_eq_biVec_wField {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (k₀ k₁ : IsSU2BiAdjoint.WeightIdx) : + h.adjVec l μ ν (su2AdjIdx k₀) * h.adjVec l' μ' ν' (su2AdjIdx k₁) + = (h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').biVec + (IsSU2BiAdjoint.wtCoeff k₀) (IsSU2BiAdjoint.wtCoeff k₁) := by + rw [h.biVec_wField_mul, h.sum_wtCoeff_smul_wField, h.sum_wtCoeff_smul_wField] + +/-- A product of two colour weight vectors of the adjoint lies in the bi-adjoint subspace + of the corresponding family of two gluon field strengths. -/ +lemma adjVec_mul_adjVec_mem_isSU3BiAdjoint_span {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (k₀ k₁ : IsSU3BiAdjoint.WeightIdx) : + h.adjVec l μ ν (su3AdjIdx k₀) * h.adjVec l' μ' ν' (su3AdjIdx k₁) + ∈ (h.isSU3BiAdjoint_gluonField_mul l μ ν l' μ' ν').span := by + rw [h.adjVec_mul_adjVec_eq_biVec_gluonField, IsSU3BiAdjoint.span_eq_wtSpan, + IsSU3BiAdjoint.wtSpan] + exact Submodule.mem_iSup_of_mem (k₀, k₁) (Submodule.mem_span_singleton_self _) + +/-- A product of two isospin weight vectors of the adjoint lies in the bi-adjoint + subspace of the corresponding family of two `W`-boson field strengths. -/ +lemma adjVec_mul_adjVec_mem_isSU2BiAdjoint_span {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (k₀ k₁ : IsSU2BiAdjoint.WeightIdx) : + h.adjVec l μ ν (su2AdjIdx k₀) * h.adjVec l' μ' ν' (su2AdjIdx k₁) + ∈ (h.isSU2BiAdjoint_wField_mul l μ ν l' μ' ν').span := by + rw [h.adjVec_mul_adjVec_eq_biVec_wField, IsSU2BiAdjoint.span_eq_wtSpan, + IsSU2BiAdjoint.wtSpan] + exact Submodule.mem_iSup_of_mem (k₀, k₁) (Submodule.mem_span_singleton_self _) + +/-- The hypercharge weight vector of the adjoint is the hypercharge field strength, the + adjoint action of the gauge group on the `u(1)` factor being trivial. -/ +lemma adjVec_hyperchargeIdx {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + h.adjVec l μ ν (Sum.inr (Sum.inr 3)) = h.hyperchargeField l μ ν := rfl + +/-- A product of two hypercharge weight vectors of the adjoint lies in the bi-adjoint + subspace of the corresponding family of two hypercharge field strengths. -/ +lemma adjVec_mul_adjVec_mem_isU1BiAdjoint_span {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + h.adjVec l μ ν (Sum.inr (Sum.inr 3)) * h.adjVec l' μ' ν' (Sum.inr (Sum.inr 3)) + ∈ (h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').span := by + rw [h.adjVec_hyperchargeIdx, h.adjVec_hyperchargeIdx, IsU1BiAdjoint.span] + exact Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + +/-- The gluon contribution to the zero-weight piece of mass weight eight lies in the join + of the bi-adjoint subspaces of the products of two underived gluon field strengths. -/ +lemma gluonRootPart_le_iSup_isSU3BiAdjoint_span : + h.gluonRootPart ≤ ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (μ' : Fin 1 ⊕ Fin 3) + (ν' : Fin 1 ⊕ Fin 3), (h.isSU3BiAdjoint_gluonField_mul ![] μ ν ![] μ' ν').span := by + have key : ∀ r : Fin 3, h.rootRaisingSpan r.castSucc * h.rootLoweringSpan r.castSucc + ≤ ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (μ' : Fin 1 ⊕ Fin 3) + (ν' : Fin 1 ⊕ Fin 3), (h.isSU3BiAdjoint_gluonField_mul ![] μ ν ![] μ' ν').span := by + intro r + rw [rootRaisingSpan, rootLoweringSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun l' => + iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem, Subsingleton.elim l ![], + Subsingleton.elim l' ![]] + exact Submodule.mem_iSup_of_mem μ' (Submodule.mem_iSup_of_mem ν' + (Submodule.mem_iSup_of_mem μ (Submodule.mem_iSup_of_mem ν + (h.adjVec_mul_adjVec_mem_isSU3BiAdjoint_span ![] μ' ν' ![] μ ν + (Sum.inl r) (Sum.inr (Sum.inl r)))))) + rw [gluonRootPart] + exact sup_le (key 0) (sup_le (key 1) (key 2)) + +/-- The isospin contribution to the zero-weight piece of mass weight eight lies in the + join of the bi-adjoint subspaces of the products of two underived `W`-boson field + strengths. -/ +lemma isospinRootPart_le_iSup_isSU2BiAdjoint_span : + h.isospinRootPart ≤ ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (μ' : Fin 1 ⊕ Fin 3) + (ν' : Fin 1 ⊕ Fin 3), (h.isSU2BiAdjoint_wField_mul ![] μ ν ![] μ' ν').span := by + rw [isospinRootPart, rootRaisingSpan, rootLoweringSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun l' => + iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem, Subsingleton.elim l ![], + Subsingleton.elim l' ![]] + exact Submodule.mem_iSup_of_mem μ' (Submodule.mem_iSup_of_mem ν' + (Submodule.mem_iSup_of_mem μ (Submodule.mem_iSup_of_mem ν + (h.adjVec_mul_adjVec_mem_isSU2BiAdjoint_span ![] μ' ν' ![] μ ν + (Sum.inl 0) (Sum.inr (Sum.inl 0)))))) + end IsGaugeSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean index 69c0ab782..0fe8e8dfd 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean @@ -102,14 +102,6 @@ lemma massWeightSubmodule_eight_eq_deriv : barHiggsSubmodule_comm_higgsSubmodule, mul_assoc, h.barHiggs_higgs_left_comm] simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] - -TODO (lines := 104-105) "In a new file, give the gauge weight decomposition - on each of the mass-weight submodules. Copy what is in - the IsHiggSector.Basic file (which will eventually be overwritten). - In fact complete the guage argument which is there in this new formulation. - The best way is probably to develop the general code in `IsSU2BiFundamental` file - and then directly appply it here." - end IsHiggsSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean new file mode 100644 index 000000000..36e9cec4b --- /dev/null +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean @@ -0,0 +1,1057 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsHiggsSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition +/-! +# The gauge weight decomposition of the Higgs mass-weight submodules + +Each mass-weight submodule of the Higgs sector up to weight eight has an explicit +description in terms of the derivative submodules `derivSubmodule n`, and each derivative +submodule carries a gauge weight decomposition. Transporting the latter along the former +decomposes every mass-weight submodule up to weight eight. + +The weights carried by a derivative submodule are the four weights of the Higgs doublet +and its conjugate, `(0, 0, ∓1, -3)` and `(0, 0, ±1, 3)`. Every one of them has +hypercharge `± 3`, so a product of `k` derivative submodules can only reach gauge weight +zero when `k` is even and the Higgs and conjugate-Higgs factors are equally many. This +is what makes the weight-zero pieces small: at mass weight four and six they are spanned +by the isospin-diagonal pairings `∇H^i ∇H̄^i`, and at mass weight eight the quartic +monomials `∇H^i ∇H̄^i ∇H^j ∇H̄^j` join them. + +Section A gives the decompositions themselves, section B reads off the pieces of a single +derivative submodule, section C computes the weight-zero pieces of the products of +derivative submodules that occur, and section D assembles these into the weight-zero piece +of each mass-weight submodule up to weight eight. Section E turns those into a sieve on +the gauge invariants. + +The gauge weight alone cannot finish the job: it cannot separate the isospin singlet +`∇H · ∇H̄` from the neutral component of the isospin triplet, which carries the same +weight. Sections F to H refine the weight-zero pieces by the Weyl element of `SU(2)`, +which does separate the two, and section I removes the one combination that survives both +gradings — the square of the neutral triplet component — by averaging over the cyclic +group generated by a quarter turn about the diagonal isospin axis. Section J assembles +the resulting descriptions of the gauge invariants up to mass weight eight. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace IsHiggsSector + +set_option linter.unusedVariables false + +variable {B : Type} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} + {hrep_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), rep g (b₁ * b₂) = rep g b₁ * rep g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {H : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH + massWeightPoly) + +/-! + +## A. The decompositions + +Every term of the Higgs algebra has even mass weight, so the odd mass-weight submodules +vanish and are decomposed by the empty decomposition. The even ones are built from the +derivative submodules by the descriptions of `MassWeight.Basic`: weight two is a single +derivative submodule, and the higher weights add the products which distribute the mass +weight over several towers. + +-/ + +/-- The odd mass-weight submodules are trivial, so they carry the empty decomposition. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightOdd (n : ℕ) (hn : Odd n) : + GaugeWeightDecomposition rep (h.massWeightSubmodule n) := + GaugeWeightDecomposition.copy (GaugeWeightDecomposition.bot h.rep_mul) _ + (h.massWeightSubmodule_odd_eq_bot n hn) + +/-- Weight one is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightOne : + GaugeWeightDecomposition rep (h.massWeightSubmodule 1) := + h.massWeightSubmoduleGaugeWeightOdd 1 (by decide) + +/-- Weight two is the underived Higgs tower. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightTwo : + GaugeWeightDecomposition rep (h.massWeightSubmodule 2) := + GaugeWeightDecomposition.copy (h.derivSubmoduleGaugeWeight 0) _ + h.massWeightSubmodule_two_eq_deriv + +/-- Weight three is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightThree : + GaugeWeightDecomposition rep (h.massWeightSubmodule 3) := + h.massWeightSubmoduleGaugeWeightOdd 3 (by decide) + +/-- Weight four is the once-derived tower together with the products of two underived + ones. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightFour : + GaugeWeightDecomposition rep (h.massWeightSubmodule 4) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.sup (d := h.derivSubmoduleGaugeWeight 1) + (d' := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 0))) _ + h.massWeightSubmodule_four_eq_deriv + +/-- Weight five is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightFive : + GaugeWeightDecomposition rep (h.massWeightSubmodule 5) := + h.massWeightSubmoduleGaugeWeightOdd 5 (by decide) + +/-- Weight six is the twice-derived tower, the once-derived tower against an underived + one, and the products of three underived ones. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightSix : + GaugeWeightDecomposition rep (h.massWeightSubmodule 6) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup (d := h.derivSubmoduleGaugeWeight 2) + (d' := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 1) + (d' := h.derivSubmoduleGaugeWeight 0))) + (d' := GaugeWeightDecomposition.mul + (d := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 0)) + (d' := h.derivSubmoduleGaugeWeight 0))) _ + h.massWeightSubmodule_six_eq_deriv + +/-- Weight seven is trivial. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightSeven : + GaugeWeightDecomposition rep (h.massWeightSubmodule 7) := + h.massWeightSubmoduleGaugeWeightOdd 7 (by decide) + +/-- Weight eight: the thrice-derived tower, the two ways of splitting the derivatives over + two towers, the once-derived tower against two underived ones, and the products of four + underived ones. -/ +@[implicit_reducible] +noncomputable def massWeightSubmoduleGaugeWeightEight : + GaugeWeightDecomposition rep (h.massWeightSubmodule 8) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.sup (d := h.derivSubmoduleGaugeWeight 3) + (d' := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 2) + (d' := h.derivSubmoduleGaugeWeight 0))) + (d' := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 1) + (d' := h.derivSubmoduleGaugeWeight 1))) + (d' := GaugeWeightDecomposition.mul + (d := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 1) + (d' := h.derivSubmoduleGaugeWeight 0)) + (d' := h.derivSubmoduleGaugeWeight 0))) + (d' := GaugeWeightDecomposition.mul + (d := GaugeWeightDecomposition.mul + (d := GaugeWeightDecomposition.mul (d := h.derivSubmoduleGaugeWeight 0) + (d' := h.derivSubmoduleGaugeWeight 0)) + (d' := h.derivSubmoduleGaugeWeight 0)) + (d' := h.derivSubmoduleGaugeWeight 0))) _ + h.massWeightSubmodule_eight_eq_deriv + +/-! + +## B. The pieces of a derivative submodule + +A derivative submodule is the join of a Higgs and a conjugate-Higgs submodule, and each of +those is concentrated in two weights. The four weights are distinct, so each piece of the +join is the span of one of the four families of symbols, and every other weight — the zero +weight in particular — has vanishing piece. + +-/ + +/-- The weight-`w` piece of a derivative submodule, as the join of the Higgs and + conjugate-Higgs pieces. -/ +lemma derivSubmoduleGaugeWeight_piece_eq (n : ℕ) (w : GaugeWeight) : + (h.derivSubmoduleGaugeWeight n).piece w + = (if w = ((0, 0, -1, -3) : GaugeWeight) then + ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.higgs d 0 + else if w = ((0, 0, 1, -3) : GaugeWeight) then + ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.higgs d 1 + else ⊥) + ⊔ (if w = ((0, 0, 1, 3) : GaugeWeight) then + ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.barHiggs d 0 + else if w = ((0, 0, -1, 3) : GaugeWeight) then + ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.barHiggs d 1 + else ⊥) := rfl + +/-- The piece at the weight of the upper Higgs component. -/ +lemma derivSubmoduleGaugeWeight_piece_higgs_zero (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece (0, 0, -1, -3) + = ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.higgs d 0 := by + rw [h.derivSubmoduleGaugeWeight_piece_eq, if_pos rfl, if_neg (by decide), + if_neg (by decide), sup_bot_eq] + +/-- The piece at the weight of the lower Higgs component. -/ +lemma derivSubmoduleGaugeWeight_piece_higgs_one (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece (0, 0, 1, -3) + = ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.higgs d 1 := by + rw [h.derivSubmoduleGaugeWeight_piece_eq, if_neg (by decide), if_pos rfl, + if_neg (by decide), if_neg (by decide), sup_bot_eq] + +/-- The piece at the weight of the upper conjugate-Higgs component. -/ +lemma derivSubmoduleGaugeWeight_piece_barHiggs_zero (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece (0, 0, 1, 3) + = ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.barHiggs d 0 := by + rw [h.derivSubmoduleGaugeWeight_piece_eq, if_neg (by decide), if_neg (by decide), + if_pos rfl, bot_sup_eq] + +/-- The piece at the weight of the lower conjugate-Higgs component. -/ +lemma derivSubmoduleGaugeWeight_piece_barHiggs_one (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece (0, 0, -1, 3) + = ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), ℂ ∙ h.barHiggs d 1 := by + rw [h.derivSubmoduleGaugeWeight_piece_eq, if_neg (by decide), if_neg (by decide), + if_neg (by decide), if_pos rfl, bot_sup_eq] + +/-- A derivative submodule has no weight-zero content: every Higgs symbol carries + hypercharge. -/ +lemma derivSubmoduleGaugeWeight_piece_zero (n : ℕ) : + (h.derivSubmoduleGaugeWeight n).piece 0 = ⊥ := + (h.derivSubmoduleGaugeWeight n).piece_eq_zero_of_not_mem_supp 0 + (by rw [h.derivSubmoduleGaugeWeight_supp]; decide) + +/-! + +## C. The weight-zero pieces of the products + +Two derivative submodules pair to weight zero exactly by matching a Higgs symbol against a +conjugate-Higgs symbol of the same isospin component, in either order, so the weight-zero +piece of such a product is a join of four spans of pairings `∇H^i ∇H̄^i`. Three of them +cannot reach weight zero at all, because hypercharge is `± 3` on every generator, so an odd +number of factors leaves an odd multiple of three. Four of them reach weight zero on the +three quartic monomials. + +-/ + +/-- The span of the isospin-diagonal pairings of a Higgs symbol carrying `n` derivatives + with a conjugate-Higgs symbol carrying `m` derivatives, at isospin component `i`. -/ +noncomputable def higgsBarHiggsSpan (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (n m : ℕ) (i : Fin 2) : Submodule ℂ B := + ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + ℂ ∙ (h.higgs d i * h.barHiggs d' i) + +/-- The span of the underived quartic monomial pairing the isospin components `i` and + `j`. -/ +noncomputable def quarticSpan (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (i j : Fin 2) : Submodule ℂ B := + ℂ ∙ (h.higgs ![] i * h.barHiggs ![] i * h.higgs ![] j * h.barHiggs ![] j) + +/-- The weight-zero piece of a product of two derivative submodules: the isospin-diagonal + pairings, taken in both orders of the two towers. -/ +lemma derivSubmodule_mul_piece_zero (n m : ℕ) : + GaugeWeightDecomposition.piece rep (h.derivSubmodule n * h.derivSubmodule m) 0 + = h.higgsBarHiggsSpan n m 0 ⊔ h.higgsBarHiggsSpan n m 1 + ⊔ h.higgsBarHiggsSpan m n 0 ⊔ h.higgsBarHiggsSpan m n 1 := by + rw [GaugeWeightDecomposition.mul_piece_eq_sub 0, h.derivSubmoduleGaugeWeight_supp n] + simp only [Finset.iSup_insert, Finset.iSup_singleton, + show (0 : GaugeWeight) - (0, 0, -1, -3) = (0, 0, 1, 3) from by decide, + show (0 : GaugeWeight) - (0, 0, 1, -3) = (0, 0, -1, 3) from by decide, + show (0 : GaugeWeight) - (0, 0, 1, 3) = (0, 0, -1, -3) from by decide, + show (0 : GaugeWeight) - (0, 0, -1, 3) = (0, 0, 1, -3) from by decide, + h.derivSubmoduleGaugeWeight_piece_higgs_zero, + h.derivSubmoduleGaugeWeight_piece_higgs_one, + h.derivSubmoduleGaugeWeight_piece_barHiggs_zero, + h.derivSubmoduleGaugeWeight_piece_barHiggs_one] + have hcomm : ∀ {n1 n2 : ℕ} (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) + (a b : Fin 2), h.barHiggs d1 a * h.higgs d2 b = h.higgs d2 b * h.barHiggs d1 a := + fun d1 d2 a b => ((h.H_comm_barH _ _ _ _ _ _).symm).eq + simp only [Submodule.iSup_mul, Submodule.mul_iSup, Submodule.span_mul_span, + Set.singleton_mul_singleton, hcomm] + simp only [higgsBarHiggsSpan, sup_assoc] + refine congrArg₂ (· ⊔ ·) iSup_comm (congrArg₂ (· ⊔ ·) iSup_comm rfl) + +/-- A product of three derivative submodules has no weight-zero content: the hypercharge of + three Higgs generators is an odd multiple of three. -/ +lemma derivSubmodule_mul_mul_piece_zero (n m k : ℕ) : + GaugeWeightDecomposition.piece rep + (h.derivSubmodule n * h.derivSubmodule m * h.derivSubmodule k) 0 = ⊥ := by + refine GaugeWeightDecomposition.piece_eq_zero_of_not_mem_supp _ 0 ?_ + rw [GaugeWeightDecomposition.mul_supp, GaugeWeightDecomposition.mul_supp, + h.derivSubmoduleGaugeWeight_supp n, h.derivSubmoduleGaugeWeight_supp m, + h.derivSubmoduleGaugeWeight_supp k] + decide + +set_option maxHeartbeats 1000000 in +/-- The weight-zero piece of the product of four underived derivative submodules: the three + quartic monomials, the ones pairing two Higgs symbols against two conjugate ones with + matching isospin. -/ +lemma derivSubmodule_zero_pow_four_piece_zero : + GaugeWeightDecomposition.piece rep + (h.derivSubmodule 0 * h.derivSubmodule 0 * h.derivSubmodule 0 + * h.derivSubmodule 0) 0 + = h.quarticSpan 0 0 ⊔ h.quarticSpan 0 1 ⊔ h.quarticSpan 1 1 := by + have hbh : ∀ (a b : Fin 2), + h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) a * h.higgs ![] b + = h.higgs ![] b * h.barHiggs ![] a := fun a b => (h.H_comm_barH _ _ _ _ _ _).symm.eq + have hbh' : ∀ (a b : Fin 2) (y : B), + h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) a * (h.higgs ![] b * y) + = h.higgs ![] b * (h.barHiggs ![] a * y) := fun a b y => by + rw [← mul_assoc, hbh, mul_assoc] + have hhh : h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 1 * h.higgs ![] 0 + = h.higgs ![] 0 * h.higgs ![] 1 := (h.H_comm_H _ _ _ _ _ _).eq + have hhh' : ∀ y : B, h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 1 * (h.higgs ![] 0 * y) + = h.higgs ![] 0 * (h.higgs ![] 1 * y) := fun y => by rw [← mul_assoc, hhh, mul_assoc] + have hbb : h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 1 * h.barHiggs ![] 0 + = h.barHiggs ![] 0 * h.barHiggs ![] 1 := (h.barH_comm_barH _ _ _ _ _ _).eq + simp +decide only [GaugeWeightDecomposition.mul_piece_eq_sub', + h.derivSubmoduleGaugeWeight_supp 0, Finset.iSup_insert, Finset.iSup_singleton, + h.derivSubmoduleGaugeWeight_piece_eq, if_true, if_false, bot_sup_eq, sup_bot_eq, + Submodule.bot_mul] + simp only [Matrix.empty_eq, ciSup_unique, quarticSpan, Submodule.sup_mul, + Submodule.span_mul_span, Set.singleton_mul_singleton, mul_assoc, hbh, hbh', hhh, + hhh', hbb] + generalize (ℂ ∙ (h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 0 * + (h.higgs ![] 0 * (h.barHiggs ![] 0 * h.barHiggs ![] 0)))) = A + generalize (ℂ ∙ (h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 0 * + (h.higgs ![] 1 * (h.barHiggs ![] 0 * h.barHiggs ![] 1)))) = C + generalize (ℂ ∙ (h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 1 * + (h.higgs ![] 1 * (h.barHiggs ![] 1 * h.barHiggs ![] 1)))) = D + simp only [sup_comm, sup_left_comm, sup_idem, sup_left_idem] + +/-! + +## D. The weight-zero pieces of the mass-weight submodules + +Assembling section C along the descriptions of section A gives the weight-zero piece of +each mass-weight submodule up to weight eight. The odd weights and weight two are trivial, +weight four is the underived pairing, weight six adds the pairings with one derivative on +either factor, and weight eight adds the pairings with two derivatives, those with one +derivative on each factor, and the three quartic monomials. + +-/ + +/-- The weight-zero piece at an odd mass weight: the submodule itself is trivial. -/ +lemma massWeightSubmoduleGaugeWeightOdd_piece_zero (n : ℕ) (hn : Odd n) : + (h.massWeightSubmoduleGaugeWeightOdd n hn).piece 0 = ⊥ := rfl + +/-- The weight-zero piece at mass weight two: a single Higgs symbol carries + hypercharge. -/ +lemma massWeightSubmoduleGaugeWeightTwo_piece_zero : + (h.massWeightSubmoduleGaugeWeightTwo).piece 0 = ⊥ := + h.derivSubmoduleGaugeWeight_piece_zero 0 + +/-- The weight-zero piece at mass weight four: the underived isospin-diagonal pairings. -/ +lemma massWeightSubmoduleGaugeWeightFour_piece_zero : + (h.massWeightSubmoduleGaugeWeightFour).piece 0 + = h.higgsBarHiggsSpan 0 0 0 ⊔ h.higgsBarHiggsSpan 0 0 1 := by + show (h.derivSubmoduleGaugeWeight 1).piece 0 + ⊔ GaugeWeightDecomposition.piece rep (h.derivSubmodule 0 * h.derivSubmodule 0) 0 = _ + rw [h.derivSubmoduleGaugeWeight_piece_zero 1, h.derivSubmodule_mul_piece_zero 0 0, + bot_sup_eq] + simp only [sup_comm, sup_left_comm, sup_idem, sup_left_idem] + +/-- The weight-zero piece at mass weight six: the isospin-diagonal pairings carrying one + derivative, on either of the two factors. -/ +lemma massWeightSubmoduleGaugeWeightSix_piece_zero : + (h.massWeightSubmoduleGaugeWeightSix).piece 0 + = h.higgsBarHiggsSpan 1 0 0 ⊔ h.higgsBarHiggsSpan 1 0 1 + ⊔ h.higgsBarHiggsSpan 0 1 0 ⊔ h.higgsBarHiggsSpan 0 1 1 := by + show ((h.derivSubmoduleGaugeWeight 2).piece 0 + ⊔ GaugeWeightDecomposition.piece rep (h.derivSubmodule 1 * h.derivSubmodule 0) 0) + ⊔ GaugeWeightDecomposition.piece rep + (h.derivSubmodule 0 * h.derivSubmodule 0 * h.derivSubmodule 0) 0 = _ + rw [h.derivSubmoduleGaugeWeight_piece_zero 2, h.derivSubmodule_mul_piece_zero 1 0, + h.derivSubmodule_mul_mul_piece_zero 0 0 0, bot_sup_eq, sup_bot_eq] + +/-- The weight-zero piece at mass weight eight: the isospin-diagonal pairings carrying two + derivatives on one factor or one on each, together with the three quartic monomials. -/ +lemma massWeightSubmoduleGaugeWeightEight_piece_zero : + (h.massWeightSubmoduleGaugeWeightEight).piece 0 + = h.higgsBarHiggsSpan 2 0 0 ⊔ h.higgsBarHiggsSpan 2 0 1 + ⊔ h.higgsBarHiggsSpan 0 2 0 ⊔ h.higgsBarHiggsSpan 0 2 1 + ⊔ (h.higgsBarHiggsSpan 1 1 0 ⊔ h.higgsBarHiggsSpan 1 1 1) + ⊔ (h.quarticSpan 0 0 ⊔ h.quarticSpan 0 1 ⊔ h.quarticSpan 1 1) := by + show ((((h.derivSubmoduleGaugeWeight 3).piece 0 + ⊔ GaugeWeightDecomposition.piece rep + (h.derivSubmodule 2 * h.derivSubmodule 0) 0) + ⊔ GaugeWeightDecomposition.piece rep (h.derivSubmodule 1 * h.derivSubmodule 1) 0) + ⊔ GaugeWeightDecomposition.piece rep + (h.derivSubmodule 1 * h.derivSubmodule 0 * h.derivSubmodule 0) 0) + ⊔ GaugeWeightDecomposition.piece rep + (h.derivSubmodule 0 * h.derivSubmodule 0 * h.derivSubmodule 0 + * h.derivSubmodule 0) 0 = _ + rw [h.derivSubmoduleGaugeWeight_piece_zero 3, h.derivSubmodule_mul_piece_zero 2 0, + h.derivSubmodule_mul_piece_zero 1 1, h.derivSubmodule_mul_mul_piece_zero 1 0 0, + h.derivSubmodule_zero_pow_four_piece_zero, bot_sup_eq, sup_bot_eq] + simp only [sup_assoc, sup_comm, sup_left_comm, sup_idem, sup_left_idem] + +/-! + +## E. The gauge sieve + +A gauge-invariant element is fixed by the gauge torus, so it sits in the weight-zero piece +of any decomposition of a submodule containing it. Section D therefore bounds the +invariants of each mass-weight submodule up to weight eight. The bound is a sieve, not a +characterisation: the gauge torus cannot separate the isospin singlet from the neutral +component of the isospin triplet, and that separation needs the Weyl element of `SU(2)`. + +-/ + +/-- A gauge-invariant term of odd mass weight vanishes. -/ +lemma eq_zero_of_invariant_massWeightSubmodule_odd (n : ℕ) (hn : Odd n) {x : B} + (hx : x ∈ h.massWeightSubmodule n) : x = 0 := + Submodule.mem_bot ℂ |>.mp (h.massWeightSubmodule_odd_eq_bot n hn ▸ hx) + +/-- A gauge-invariant term of mass weight two vanishes: a single Higgs symbol carries + hypercharge, so nothing at that weight is neutral. -/ +lemma eq_zero_of_invariant_massWeightSubmodule_two {x : B} + (hx : x ∈ h.massWeightSubmodule 2) (hg : ∀ g : GaugeGroupI, rep g x = x) : x = 0 := by + have hmem := GaugeWeightDecomposition.mem_zero_of_invariant + h.massWeightSubmoduleGaugeWeightTwo hx hg + rwa [h.massWeightSubmoduleGaugeWeightTwo_piece_zero, Submodule.mem_bot] at hmem + +/-- A gauge-invariant term of mass weight four is a combination of the two underived + isospin-diagonal pairings. -/ +lemma mem_of_invariant_massWeightSubmodule_four {x : B} + (hx : x ∈ h.massWeightSubmodule 4) (hg : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ h.higgsBarHiggsSpan 0 0 0 ⊔ h.higgsBarHiggsSpan 0 0 1 := by + rw [← h.massWeightSubmoduleGaugeWeightFour_piece_zero] + exact GaugeWeightDecomposition.mem_zero_of_invariant _ hx hg + +/-- A gauge-invariant term of mass weight six is a combination of the isospin-diagonal + pairings carrying one derivative, on either factor. -/ +lemma mem_of_invariant_massWeightSubmodule_six {x : B} + (hx : x ∈ h.massWeightSubmodule 6) (hg : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ h.higgsBarHiggsSpan 1 0 0 ⊔ h.higgsBarHiggsSpan 1 0 1 + ⊔ h.higgsBarHiggsSpan 0 1 0 ⊔ h.higgsBarHiggsSpan 0 1 1 := by + rw [← h.massWeightSubmoduleGaugeWeightSix_piece_zero] + exact GaugeWeightDecomposition.mem_zero_of_invariant _ hx hg + +/-- A gauge-invariant term of mass weight eight is a combination of the isospin-diagonal + pairings carrying two derivatives and of the three quartic monomials. -/ +lemma mem_of_invariant_massWeightSubmodule_eight {x : B} + (hx : x ∈ h.massWeightSubmodule 8) (hg : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ h.higgsBarHiggsSpan 2 0 0 ⊔ h.higgsBarHiggsSpan 2 0 1 + ⊔ h.higgsBarHiggsSpan 0 2 0 ⊔ h.higgsBarHiggsSpan 0 2 1 + ⊔ (h.higgsBarHiggsSpan 1 1 0 ⊔ h.higgsBarHiggsSpan 1 1 1) + ⊔ (h.quarticSpan 0 0 ⊔ h.quarticSpan 0 1 ⊔ h.quarticSpan 1 1) := by + rw [← h.massWeightSubmoduleGaugeWeightEight_piece_zero] + exact GaugeWeightDecomposition.mem_zero_of_invariant _ hx hg + +/-! + +## F. The Weyl refinement of the pairing spans + +-/ + +/-- The span of the isospin contractions of a Higgs tower carrying `n` derivatives against + a conjugate tower carrying `m`. -/ +noncomputable def dotSpan (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (n m : ℕ) : Submodule ℂ B := + ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), ℂ ∙ h.dotGaugeHiggs d d' + +/-- The span of the neutral triplet combinations of a Higgs tower carrying `n` derivatives + against a conjugate tower carrying `m`. -/ +noncomputable def tripletSpan (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (n m : ℕ) : Submodule ℂ B := + ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + ℂ ∙ (h.higgs d 0 * h.barHiggs d' 0 - h.higgs d 1 * h.barHiggs d' 1) + +/-- The Weyl grading of the isospin-diagonal pairing span: the symmetric combination is the + isospin contraction, of grade zero, and the antisymmetric one is the neutral triplet + component, of grade two. -/ +noncomputable def higgsBarHiggsSpanSU2Perm (n m : ℕ) : + SU2PermDecomposition rep (h.higgsBarHiggsSpan n m 0 ⊔ h.higgsBarHiggsSpan n m 1) where + piece k := if k = 0 then h.dotSpan n m else if k = 2 then h.tripletSpan n m else ⊥ + piece_le := by + have hzero : h.dotSpan n m + ≤ Module.End.eigenspace (rep gaugeSU2Perm) (su2PermSign 0) := by + rw [dotSpan] + refine iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr ?_ + exact Module.End.mem_eigenspace_iff.mpr + (by rw [su2PermSign_zero, one_smul, h.rep_dotGaugeHiggs]) + have htwo : h.tripletSpan n m + ≤ Module.End.eigenspace (rep gaugeSU2Perm) (su2PermSign 2) := by + rw [tripletSpan] + refine iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr ?_ + exact Module.End.mem_eigenspace_iff.mpr + (by rw [su2PermSign_two, neg_one_smul, h.rep_gaugeSU2Perm_higgsBarHiggs_sub]) + intro k x hx + rcases eq_or_ne k 0 with rfl | hk0 + · rw [if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (hzero hx) + · rcases eq_or_ne k 2 with rfl | hk2 + · rw [if_neg hk0, if_pos rfl] at hx + exact Module.End.mem_eigenspace_iff.mp (htwo hx) + · rw [if_neg hk0, if_neg hk2, Submodule.mem_bot] at hx + subst hx + simp + iSup_piece := by + have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide + refine le_antisymm (iSup_le fun k => ?_) ?_ + · rcases hcases k with rfl | rfl | rfl | rfl + · rw [if_pos rfl, dotSpan] + refine iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr ?_ + rw [dotGaugeHiggs] + exact add_mem + (Submodule.mem_sup_left (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d' (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d' (Submodule.mem_span_singleton_self _)))) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · rw [if_neg (by decide), if_pos rfl, tripletSpan] + refine iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr ?_ + exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d' (Submodule.mem_span_singleton_self _)))) + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d' (Submodule.mem_span_singleton_self _)))) + · rw [if_neg (by decide), if_neg (by decide)] + exact bot_le + · refine le_trans ?_ (sup_le (le_iSup _ (0 : ZMod 4)) (le_iSup _ (2 : ZMod 4))) + rw [if_pos rfl, if_neg (by decide : ¬(2 : ZMod 4) = 0), if_pos rfl, higgsBarHiggsSpan, + higgsBarHiggsSpan] + have hd : ∀ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + h.dotGaugeHiggs d d' ∈ h.dotSpan n m := fun d d' => + Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d' (Submodule.mem_span_singleton_self _)) + have ht : ∀ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + h.higgs d 0 * h.barHiggs d' 0 - h.higgs d 1 * h.barHiggs d' 1 + ∈ h.tripletSpan n m := fun d d' => + Submodule.mem_iSup_of_mem d + (Submodule.mem_iSup_of_mem d' (Submodule.mem_span_singleton_self _)) + have hmem0 : ∀ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + h.higgs d 0 * h.barHiggs d' 0 ∈ h.dotSpan n m ⊔ h.tripletSpan n m := by + intro d d' + rw [show h.higgs d 0 * h.barHiggs d' 0 = (2⁻¹ : ℂ) • (h.dotGaugeHiggs d d' + + (h.higgs d 0 * h.barHiggs d' 0 - h.higgs d 1 * h.barHiggs d' 1)) + from by rw [dotGaugeHiggs]; module] + exact Submodule.smul_mem _ _ (add_mem (Submodule.mem_sup_left (hd d d')) + (Submodule.mem_sup_right (ht d d'))) + have hmem1 : ∀ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + h.higgs d 1 * h.barHiggs d' 1 ∈ h.dotSpan n m ⊔ h.tripletSpan n m := by + intro d d' + rw [show h.higgs d 1 * h.barHiggs d' 1 = (2⁻¹ : ℂ) • (h.dotGaugeHiggs d d' + - (h.higgs d 0 * h.barHiggs d' 0 - h.higgs d 1 * h.barHiggs d' 1)) + from by rw [dotGaugeHiggs]; module] + exact Submodule.smul_mem _ _ (sub_mem (Submodule.mem_sup_left (hd d d')) + (Submodule.mem_sup_right (ht d d'))) + exact sup_le (iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr (hmem0 d d')) + (iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr (hmem1 d d')) + +/-! + +## G. The Weyl grading at mass weights four and six + +-/ + +/-- The Weyl grading of the weight-zero piece at mass weight four. -/ +noncomputable def massWeightSubmoduleGaugeWeightFourSU2Perm : + SU2PermDecomposition rep ((h.massWeightSubmoduleGaugeWeightFour).piece 0) := + SU2PermDecomposition.copy (h.higgsBarHiggsSpanSU2Perm 0 0) _ + h.massWeightSubmoduleGaugeWeightFour_piece_zero + +/-- The Weyl grading of the weight-zero piece at mass weight six. -/ +noncomputable def massWeightSubmoduleGaugeWeightSixSU2Perm : + SU2PermDecomposition rep ((h.massWeightSubmoduleGaugeWeightSix).piece 0) := + SU2PermDecomposition.copy + ((h.higgsBarHiggsSpanSU2Perm 1 0).sup (h.higgsBarHiggsSpanSU2Perm 0 1)) _ + (by rw [h.massWeightSubmoduleGaugeWeightSix_piece_zero, sup_assoc]) + +/-- A gauge-invariant term of mass weight four is a multiple of the underived isospin + contraction. -/ +lemma mem_dotSpan_of_invariant_massWeightSubmodule_four {x : B} + (hx : x ∈ h.massWeightSubmodule 4) (hg : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ h.dotSpan 0 0 := by + have hmem := SU2PermDecomposition.mem_zero_of_invariant + h.massWeightSubmoduleGaugeWeightFourSU2Perm + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hg) hg + rwa [show (h.massWeightSubmoduleGaugeWeightFourSU2Perm).piece 0 = h.dotSpan 0 0 from rfl] + at hmem + +/-- A gauge-invariant term of mass weight six is a combination of the isospin contractions + carrying one derivative, on either factor. -/ +lemma mem_dotSpan_of_invariant_massWeightSubmodule_six {x : B} + (hx : x ∈ h.massWeightSubmodule 6) (hg : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ h.dotSpan 1 0 ⊔ h.dotSpan 0 1 := by + have hmem := SU2PermDecomposition.mem_zero_of_invariant + h.massWeightSubmoduleGaugeWeightSixSU2Perm + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hg) hg + rwa [show (h.massWeightSubmoduleGaugeWeightSixSU2Perm).piece 0 + = h.dotSpan 1 0 ⊔ h.dotSpan 0 1 from rfl] at hmem + +/-! + +## H. The Weyl grading at mass weight eight + +The quartic monomials need their own grading. The Weyl element exchanges the two diagonal +quartics `(H⁰H̄⁰)²` and `(H¹H̄¹)²` and fixes the mixed one `H⁰H̄⁰H¹H̄¹`, so it is the +symmetric combination of the diagonal pair and the mixed monomial that have grade zero, +the antisymmetric combination having grade two. + +-/ + +/-- The span of a single eigenvector of the Weyl element, as a grading concentrated in the + single grade that eigenvector carries. -/ +noncomputable def su2PermSpanSingleton (x : B) (k : ZMod 4) + (hx : rep gaugeSU2Perm x = su2PermSign k • x) : + SU2PermDecomposition rep (ℂ ∙ x) where + piece k' := if k' = k then ℂ ∙ x else ⊥ + piece_le := by + intro k' y hy + split_ifs at hy with hk + · subst hk + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.mp hy + rw [map_smul, hx, smul_comm] + · rw [Submodule.mem_bot] at hy + subst hy + simp + iSup_piece := by + refine le_antisymm (iSup_le fun k' => ?_) (le_iSup_of_le k (by rw [if_pos rfl])) + split_ifs + · exact le_rfl + · exact bot_le + +/-- Replacing two of three lines by their symmetric and antisymmetric combinations spans + the same submodule, since two is invertible. -/ +lemma sup_span_symm_antisymm (a b m : B) : + (ℂ ∙ (a + b) ⊔ ℂ ∙ m) ⊔ ℂ ∙ (a - b) = (ℂ ∙ a ⊔ ℂ ∙ m) ⊔ ℂ ∙ b := by + refine le_antisymm (sup_le (sup_le ?_ ?_) ?_) (sup_le (sup_le ?_ ?_) ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · exact add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · exact Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _)) + · exact sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · have hs : (2⁻¹ : ℂ) • ((a + b) + (a - b)) ∈ (ℂ ∙ (a + b) ⊔ ℂ ∙ m) ⊔ ℂ ∙ (a - b) := + Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + rwa [show (2⁻¹ : ℂ) • ((a + b) + (a - b)) = a from by module] at hs + · exact Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _)) + · have hs : (2⁻¹ : ℂ) • ((a + b) - (a - b)) ∈ (ℂ ∙ (a + b) ⊔ ℂ ∙ m) ⊔ ℂ ∙ (a - b) := + Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + rwa [show (2⁻¹ : ℂ) • ((a + b) - (a - b)) = b from by module] at hs + +/-- The Weyl grading of the span of the three quartic monomials. -/ +noncomputable def quarticSpanSU2Perm : + SU2PermDecomposition rep + (h.quarticSpan 0 0 ⊔ h.quarticSpan 0 1 ⊔ h.quarticSpan 1 1) := + SU2PermDecomposition.copy + (((su2PermSpanSingleton (rep := rep) + (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) 0 + (by rw [su2PermSign_zero, one_smul, h.rep_gaugeSU2Perm_quartic_add])).sup + (su2PermSpanSingleton (rep := rep) + (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1) 0 + (by rw [su2PermSign_zero, one_smul, h.rep_gaugeSU2Perm_quartic_mixed]))).sup + (su2PermSpanSingleton (rep := rep) + (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + - h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) 2 + (by rw [su2PermSign_two, neg_one_smul, h.rep_gaugeSU2Perm_quartic_sub]))) + _ (by simp only [quarticSpan]; exact (sup_span_symm_antisymm _ _ _).symm) + + +/-- The grade-zero piece of the quartic grading: the symmetric diagonal combination and + the mixed monomial. -/ +lemma quarticSpanSU2Perm_piece_zero : + (h.quarticSpanSU2Perm).piece 0 + = ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + ⊔ ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1) := by + simp +decide [quarticSpanSU2Perm, su2PermSpanSingleton, SU2PermDecomposition.copy, + SU2PermDecomposition.sup] + +/-- The grade-zero piece of the Weyl grading of a pairing span. -/ +lemma higgsBarHiggsSpanSU2Perm_piece_zero (n m : ℕ) : + (h.higgsBarHiggsSpanSU2Perm n m).piece 0 = h.dotSpan n m := rfl + +/-- The Weyl grading of the weight-zero piece at mass weight eight. -/ +noncomputable def massWeightSubmoduleGaugeWeightEightSU2Perm : + SU2PermDecomposition rep ((h.massWeightSubmoduleGaugeWeightEight).piece 0) := + SU2PermDecomposition.copy + ((((h.higgsBarHiggsSpanSU2Perm 2 0).sup (h.higgsBarHiggsSpanSU2Perm 0 2)).sup + (h.higgsBarHiggsSpanSU2Perm 1 1)).sup h.quarticSpanSU2Perm) _ + (by rw [h.massWeightSubmoduleGaugeWeightEight_piece_zero]; simp only [sup_assoc]) + +/-- The grade-zero piece of the Weyl grading at mass weight eight. -/ +lemma massWeightSubmoduleGaugeWeightEightSU2Perm_piece_zero : + (h.massWeightSubmoduleGaugeWeightEightSU2Perm).piece 0 + = h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 + ⊔ (ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + ⊔ ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 + * h.barHiggs ![] 1)) := by + show (((h.higgsBarHiggsSpanSU2Perm 2 0).piece 0 ⊔ (h.higgsBarHiggsSpanSU2Perm 0 2).piece 0) + ⊔ (h.higgsBarHiggsSpanSU2Perm 1 1).piece 0) ⊔ (h.quarticSpanSU2Perm).piece 0 = _ + rw [h.quarticSpanSU2Perm_piece_zero] + simp only [h.higgsBarHiggsSpanSU2Perm_piece_zero] + +/-- A gauge-invariant term of mass weight eight lies in the span of the isospin + contractions carrying two derivatives, the symmetric diagonal quartic and the mixed + quartic. This is what the two gradings alone can see. -/ +lemma mem_of_invariant_massWeightSubmodule_eight_perm {x : B} + (hx : x ∈ h.massWeightSubmodule 8) (hg : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 + ⊔ (ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + ⊔ ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 + * h.barHiggs ![] 1)) := by + have hmem := SU2PermDecomposition.mem_zero_of_invariant + h.massWeightSubmoduleGaugeWeightEightSU2Perm + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hg) hg + rwa [h.massWeightSubmoduleGaugeWeightEightSU2Perm_piece_zero] at hmem + +/-! + +## I. Completing the gauge argument at mass weight eight + +The two gradings together leave a two-dimensional quartic sector: the square of the +isospin contraction and the square of the neutral triplet component. Neither grading can +tell the two apart, because a grading sees only an abelian subgroup, and the square of a +neutral triplet component is fixed by the whole gauge torus and by the Weyl element alike. + +The continuous symmetry does tell them apart. The `SU(2)` element implementing a quarter +turn about the diagonal axis cycles the three triplet components `n₃ ↦ n₁ ↦ i n₂`, and the +Fierz identity says that the sum of the three squares is the square of the isospin +contraction. Averaging over the cyclic group generated by that element therefore sends +the triplet square into the span of the contraction square, and an invariant element is +its own average. + +-/ + +/-- The symmetric diagonal quartic and the mixed quartic span the same plane as the square + of the isospin contraction and the square of the neutral triplet component. -/ +lemma sup_quartic_eq_dotSq_sup_tripletSq : + ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + ⊔ ℂ ∙ (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1) + = ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) + ⊔ ℂ ∙ ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) := by + have hHH : ∀ i j, h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * h.higgs ![] j + = h.higgs ![] j * h.higgs ![] i := fun i j => (h.H_comm_H _ _ _ _ _ _).eq + have hbH : ∀ i j, h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * h.higgs ![] j + = h.higgs ![] j * h.barHiggs ![] i := fun i j => (h.H_comm_barH _ _ _ _ _ _).symm.eq + have hbb : ∀ i j, h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * h.barHiggs ![] j + = h.barHiggs ![] j * h.barHiggs ![] i := fun i j => (h.barH_comm_barH _ _ _ _ _ _).eq + have hHH' : ∀ i j (y : B), h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * (h.higgs ![] j * y) + = h.higgs ![] j * (h.higgs ![] i * y) := fun i j y => by rw [← mul_assoc, hHH, mul_assoc] + have hbH' : ∀ i j (y : B), + h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * (h.higgs ![] j * y) + = h.higgs ![] j * (h.barHiggs ![] i * y) := fun i j y => by + rw [← mul_assoc, hbH, mul_assoc] + have hmm : h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] + = (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + + (2 : ℂ) • (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 + * h.barHiggs ![] 1) := by + rw [dotGaugeHiggs] + simp only [add_mul, mul_add, mul_assoc, hHH', hbH', hbb] + match_scalars <;> norm_num + have htt : (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + = (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1) + - (2 : ℂ) • (h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 + * h.barHiggs ![] 1) := by + simp only [sub_mul, mul_sub, mul_assoc, hHH', hbH', hbb] + match_scalars <;> norm_num + refine le_antisymm (sup_le ?_ ?_) (sup_le ?_ ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · rw [show h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 0 * h.barHiggs ![] 0 + + h.higgs ![] 1 * h.barHiggs ![] 1 * h.higgs ![] 1 * h.barHiggs ![] 1 + = (2⁻¹ : ℂ) • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] + + (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + from by rw [hmm, htt]; module] + exact Submodule.smul_mem _ _ (add_mem + (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + · rw [show h.higgs ![] 0 * h.barHiggs ![] 0 * h.higgs ![] 1 * h.barHiggs ![] 1 + = ((4 : ℂ)⁻¹) • (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] + - (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + from by rw [hmm, htt]; module] + exact Submodule.smul_mem _ _ (sub_mem + (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + · rw [hmm] + exact add_mem (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _))) + · rw [htt] + exact sub_mem (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + (Submodule.smul_mem _ _ (Submodule.mem_sup_right + (Submodule.mem_span_singleton_self _))) + +set_option maxHeartbeats 1000000 in +/-- The full gauge argument at mass weight eight: a gauge-invariant term is a combination + of the isospin contractions carrying two derivatives and of the square of the underived + contraction. The square of the neutral triplet component, which neither grading can + discard, is removed by averaging over the cyclic group generated by the quarter turn + about the diagonal isospin axis. -/ +lemma mem_dotSpan_of_invariant_massWeightSubmodule_eight {x : B} + (hx : x ∈ h.massWeightSubmodule 8) (hg : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 + ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + have hspan := h.mem_of_invariant_massWeightSubmodule_eight_perm hx hg + rw [h.sup_quartic_eq_dotSq_sup_tripletSq] at hspan + -- commutation lemmas for sorting quartic monomials + have hHH : ∀ i j, h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * h.higgs ![] j + = h.higgs ![] j * h.higgs ![] i := fun i j => (h.H_comm_H _ _ _ _ _ _).eq + have hbH : ∀ i j, h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * h.higgs ![] j + = h.higgs ![] j * h.barHiggs ![] i := fun i j => (h.H_comm_barH _ _ _ _ _ _).symm.eq + have hbb : ∀ i j, h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * h.barHiggs ![] j + = h.barHiggs ![] j * h.barHiggs ![] i := fun i j => (h.barH_comm_barH _ _ _ _ _ _).eq + have hHH' : ∀ i j (y : B), h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * (h.higgs ![] j * y) + = h.higgs ![] j * (h.higgs ![] i * y) := fun i j y => by rw [← mul_assoc, hHH, mul_assoc] + have hbH' : ∀ i j (y : B), + h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * (h.higgs ![] j * y) + = h.higgs ![] j * (h.barHiggs ![] i * y) := fun i j y => by + rw [← mul_assoc, hbH, mul_assoc] + -- the cyclic `SU(2)` element implementing the quarter turn about the diagonal axis + have hSU : !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; + (1 - Complex.I) / 2, (1 + Complex.I) / 2] ∈ specialUnitaryGroup (Fin 2) ℂ := by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply, map_div₀, map_ofNat, + Complex.ext_iff] <;> norm_num + · rw [Matrix.det_fin_two_of] + simp [Complex.ext_iff] + norm_num + set g : GaugeGroupI := ⟨1, ⟨_, hSU⟩, 1⟩ with hgdef + have hgmat : ((g⁻¹).toSU2 : Matrix (Fin 2) (Fin 2) ℂ) + = !![(1 + Complex.I)/2, (1 + Complex.I)/2; (-1 + Complex.I)/2, (1 - Complex.I)/2] := by + rw [map_inv, ← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + ext a b + fin_cases a <;> fin_cases b <;> + simp [hgdef, GaugeGroupI.toSU2, Complex.conj_I, Complex.ext_iff] + have hU1 : ((g⁻¹).toU1 : ℂ) = 1 := by simp [hgdef, GaugeGroupI.toU1] + have hH0 : rep g (h.higgs ![] 0) + = ((1 + Complex.I)/2) • h.higgs ![] 0 + ((1 + Complex.I)/2) • h.higgs ![] 1 := by + rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hgmat] + simp + have hH1 : rep g (h.higgs ![] 1) + = ((-1 + Complex.I)/2) • h.higgs ![] 0 + ((1 - Complex.I)/2) • h.higgs ![] 1 := by + rw [h.rep_higgsComponent, Fin.sum_univ_two, hU1, hgmat] + simp + have hB0 : rep g (h.barHiggs ![] 0) + = ((1 - Complex.I)/2) • h.barHiggs ![] 0 + ((1 - Complex.I)/2) • h.barHiggs ![] 1 := by + rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hgmat] + simp [map_div₀, Complex.conj_I, map_ofNat] + module + have hB1 : rep g (h.barHiggs ![] 1) + = ((-1 - Complex.I)/2) • h.barHiggs ![] 0 + ((1 + Complex.I)/2) • h.barHiggs ![] 1 := by + rw [h.rep_barHiggsComponent, Fin.sum_univ_two, hU1, hgmat] + simp [map_div₀, Complex.conj_I, map_ofNat] + module + -- the triplet term cycles: `n₃ ↦ n₁ ↦ i n₂`, and the Fierz identity closes the orbit + have hn3 : rep g (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + = h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0 := by + rw [map_sub, h.rep_mul, h.rep_mul, hH0, hB0, hH1, hB1] + simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm] + match_scalars <;> simp [Complex.ext_iff] <;> norm_num + have hn1 : rep g (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + = Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0) := by + rw [map_add, h.rep_mul, h.rep_mul, hH0, hB0, hH1, hB1] + simp only [add_mul, mul_add, smul_mul_assoc, mul_smul_comm, smul_sub] + match_scalars <;> simp [Complex.ext_iff] <;> norm_num + have fierz : (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + + (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + * (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + + (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0)) + * (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0)) + = h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := by + rw [dotGaugeHiggs] + simp only [sub_mul, mul_sub, add_mul, mul_add, smul_mul_assoc, mul_smul_comm, + mul_assoc, hHH', hbH', hbb] + match_scalars <;> simp [Complex.ext_iff] + have hT3 : ∀ y : B, rep (g * g) y = rep g (rep g y) := by + intro y + rw [map_mul] + rfl + have e1 : rep g ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + = (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) + * (h.higgs ![] 0 * h.barHiggs ![] 1 + h.higgs ![] 1 * h.barHiggs ![] 0) := by + rw [h.rep_mul, hn3] + have e2 : rep (g * g) + ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) + = (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 - h.higgs ![] 1 * h.barHiggs ![] 0)) + * (Complex.I • (h.higgs ![] 0 * h.barHiggs ![] 1 + - h.higgs ![] 1 * h.barHiggs ![] 0)) := by + rw [hT3, e1, h.rep_mul, hn1] + have hmm2 : ∀ k : GaugeGroupI, rep k (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) + = h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := fun k => by + rw [h.rep_mul, h.rep_dotGaugeHiggs_invariant] + -- averaging over `{1, g, g²}` projects onto the genuinely invariant span + set T : B →ₗ[ℂ] B := LinearMap.id + rep g + rep (g * g) with hTdef + have hTapp : ∀ y : B, T y = y + rep g y + rep (g * g) y := fun y => rfl + have hmaple : Submodule.map T ((h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1) + ⊔ (ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) + ⊔ ℂ ∙ ((h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1) + * (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)))) + ≤ h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 + ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + simp only [dotSpan, Submodule.map_sup, Submodule.map_iSup, Submodule.map_span, + Set.image_singleton] + refine sup_le (sup_le (sup_le (iSup_le fun d => iSup_le fun d' => ?_) + (iSup_le fun d => iSup_le fun d' => ?_)) (iSup_le fun d => iSup_le fun d' => ?_)) + (sup_le ?_ ?_) <;> + rw [Submodule.span_le, Set.singleton_subset_iff] + · rw [hTapp, h.rep_dotGaugeHiggs_invariant, h.rep_dotGaugeHiggs_invariant] + exact add_mem (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _)))))) + · rw [hTapp, h.rep_dotGaugeHiggs_invariant, h.rep_dotGaugeHiggs_invariant] + exact add_mem (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _))))))) + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _)))))) + · rw [hTapp, h.rep_dotGaugeHiggs_invariant, h.rep_dotGaugeHiggs_invariant] + exact add_mem (add_mem + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (Submodule.mem_span_singleton_self _))))) + · rw [hTapp, hmm2, hmm2] + exact add_mem (add_mem + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + · rw [hTapp, e1, e2, fierz] + exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have hfin := hmaple ⟨x, hspan, rfl⟩ + rw [hTapp, hg, hg] at hfin + have hfin' := Submodule.smul_mem _ ((3 : ℂ)⁻¹) hfin + rwa [show ((3 : ℂ)⁻¹) • (x + x + x) = x from by module] at hfin' + +/-! + +## J. The gauge-invariant submodules up to mass weight eight + +Both inclusions are now available: sections E to I bound the invariants from above, and +the isospin contractions are themselves invariant and of the right mass weight, which +bounds them from below. The two meet, so the gauge-invariant part of each mass-weight +submodule up to weight eight is exactly described. + +-/ + +/-- An isospin contraction has the mass weight of its two towers together. -/ +lemma dotGaugeHiggs_mem_massWeightSubmodule {n1 n2 : ℕ} (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) + (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + h.dotGaugeHiggs d1 d2 ∈ h.massWeightSubmodule (2 * (1 + n1) + 2 * (1 + n2)) := by + have hH : ∀ i, h.higgs d1 i ∈ h.massWeightSubmodule (2 * (1 + n1)) := fun i => + h.massWeightSubmodule_higgsSubmodule_le n1 + (Submodule.mem_iSup_of_mem d1 (LinearMap.mem_range_self _ _)) + have hbH : ∀ i, h.barHiggs d2 i ∈ h.massWeightSubmodule (2 * (1 + n2)) := fun i => + h.massWeightSubmodule_barHiggsSubmodule_le n2 + (Submodule.mem_iSup_of_mem d2 (LinearMap.mem_range_self _ _)) + rw [dotGaugeHiggs] + exact add_mem (h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (hH 0) (hbH 0))) + (h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (hH 1) (hbH 1))) + +/-- The gauge invariants of mass weight four: the underived isospin contraction. -/ +lemma gaugeInvariantOfMassDim_four_eq_dotSpan : + h.gaugeInvariantOfMassDim 4 = h.dotSpan 0 0 := by + refine le_antisymm (fun x hx => + h.mem_dotSpan_of_invariant_massWeightSubmodule_four hx.1 hx.2) ?_ + rw [dotSpan] + refine iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr ⟨?_, fun k => + h.rep_dotGaugeHiggs_invariant k d d'⟩ + exact h.dotGaugeHiggs_mem_massWeightSubmodule d d' + +/-- The gauge invariants of mass weight six: the isospin contractions with one derivative + on either factor. -/ +lemma gaugeInvariantOfMassDim_six_eq_dotSpan : + h.gaugeInvariantOfMassDim 6 = h.dotSpan 1 0 ⊔ h.dotSpan 0 1 := by + refine le_antisymm (fun x hx => + h.mem_dotSpan_of_invariant_massWeightSubmodule_six hx.1 hx.2) (sup_le ?_ ?_) <;> + rw [dotSpan] <;> + refine iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr ⟨?_, fun k => + h.rep_dotGaugeHiggs_invariant k d d'⟩ + · exact h.dotGaugeHiggs_mem_massWeightSubmodule d d' + · exact h.dotGaugeHiggs_mem_massWeightSubmodule d d' + +/-- The gauge invariants of mass weight eight: the isospin contractions with two + derivatives distributed over the two factors, together with the square of the underived + contraction. -/ +lemma gaugeInvariantOfMassDim_eight_eq_dotSpan : + h.gaugeInvariantOfMassDim 8 = h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 + ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + refine le_antisymm (fun x hx => + h.mem_dotSpan_of_invariant_massWeightSubmodule_eight hx.1 hx.2) + (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) + · rw [dotSpan] + exact iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr + ⟨h.dotGaugeHiggs_mem_massWeightSubmodule d d', + fun k => h.rep_dotGaugeHiggs_invariant k d d'⟩ + · rw [dotSpan] + exact iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr + ⟨h.dotGaugeHiggs_mem_massWeightSubmodule d d', + fun k => h.rep_dotGaugeHiggs_invariant k d d'⟩ + · rw [dotSpan] + exact iSup_le fun d => iSup_le fun d' => + (Submodule.span_singleton_le_iff_mem _ _).mpr + ⟨h.dotGaugeHiggs_mem_massWeightSubmodule d d', + fun k => h.rep_dotGaugeHiggs_invariant k d d'⟩ + · refine (Submodule.span_singleton_le_iff_mem _ _).mpr ⟨?_, fun k => ?_⟩ + · exact h.massWeightSubmodule_mul_le 4 4 (Submodule.mul_mem_mul + (h.dotGaugeHiggs_mem_massWeightSubmodule ![] ![]) + (h.dotGaugeHiggs_mem_massWeightSubmodule ![] ![])) + · rw [h.rep_mul, h.rep_dotGaugeHiggs_invariant] + +end IsHiggsSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index a8cdb32d4..9c31cb973 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -180,6 +180,351 @@ structure IsStandardModel (B : Type) [Ring B] [Algebra ℂ B] A_comm_bare : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), Commute (A s μ ψ) (bare i s' φ) + -- *Multiplicativity of the Lorentz action* + -- A `Representation` records only a linear action, so being an algebra map is a + -- separate demand; it is what carries the Lorentz action through products of + -- symbols, as the covariant derivative of a matter field needs + /-- Lorentz transformations act on `B` by algebra maps: the action preserves products, so each + `repLorentz Λ` is an algebra endomorphism of `B`. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + -- **Statistics of the matter symbols** + -- The gauge field is bosonic above; here the matter symbols are typed. The Higgs + -- symbols commute with each other and with every fermion symbol, and the fermion + -- symbols anticommute among themselves. Together with the `A_comm_*` rules these + -- fix the statistics of every symbol of the theory + /-- The Higgs is bosonic: two Higgs symbols commute. -/ + H_comm_H : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ HiggsVec), + Commute (H s φ) (H s' φ') + /-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ + H_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (H s φ) (barH s' φ') + /-- Two conjugate Higgs symbols commute. -/ + barH_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (barH s φ) (barH s' φ') + /-- The Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so it + carries no statistics against the fermions. -/ + H_comm_d : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ DownSinglet), + Commute (H s φ) (d i s' φ') + /-- The Higgs symbols commute with the conjugate down-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + H_comm_bard : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + Commute (H s φ) (bard i s' φ') + /-- The Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ + H_comm_u : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ UpSinglet), + Commute (H s φ) (u i s' φ') + /-- The Higgs symbols commute with the conjugate up-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + H_comm_baru : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + Commute (H s φ) (baru i s' φ') + /-- The Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ + H_comm_Q : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ QuarkDoublet), + Commute (H s φ) (Q i s' φ') + /-- The Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + H_comm_barQ : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + Commute (H s φ) (barQ i s' φ') + /-- The Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ + H_comm_L : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ LeptonDoublet), + Commute (H s φ) (L i s' φ') + /-- The Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + H_comm_barL : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + Commute (H s φ) (barL i s' φ') + /-- The Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ + H_comm_e : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ LeptonSinglet), + Commute (H s φ) (e i s' φ') + /-- The Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + H_comm_bare : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (i : Fin 3) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + Commute (H s φ) (bare i s' φ') + /-- The conjugate Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + barH_comm_d : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ DownSinglet), + Commute (barH s φ) (d i s' φ') + /-- The conjugate Higgs symbols commute with the conjugate down-type quark symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ + barH_comm_bard : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + Commute (barH s φ) (bard i s' φ') + /-- The conjugate Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + barH_comm_u : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ UpSinglet), + Commute (barH s φ) (u i s' φ') + /-- The conjugate Higgs symbols commute with the conjugate up-type quark symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ + barH_comm_baru : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + Commute (barH s φ) (baru i s' φ') + /-- The conjugate Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + barH_comm_Q : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ QuarkDoublet), + Commute (barH s φ) (Q i s' φ') + /-- The conjugate Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ + barH_comm_barQ : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + Commute (barH s φ) (barQ i s' φ') + /-- The conjugate Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + barH_comm_L : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ LeptonDoublet), + Commute (barH s φ) (L i s' φ') + /-- The conjugate Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ + barH_comm_barL : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + Commute (barH s φ) (barL i s' φ') + /-- The conjugate Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ + barH_comm_e : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ LeptonSinglet), + Commute (barH s φ) (e i s' φ') + /-- The conjugate Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ + barH_comm_bare : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (i : Fin 3) (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + Commute (barH s φ) (bare i s' φ') + /-- The down-type quark symbols anticommute among themselves. -/ + d_anticomm_d : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ DownSinglet), + d i s φ * d j s' φ' = -(d j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the conjugate down-type quark symbols. -/ + d_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + d i s φ * bard j s' φ' = -(bard j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the up-type quark symbols. -/ + d_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ UpSinglet), + d i s φ * u j s' φ' = -(u j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ + d_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + d i s φ * baru j s' φ' = -(baru j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the quark doublet symbols. -/ + d_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + d i s φ * Q j s' φ' = -(Q j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ + d_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + d i s φ * barQ j s' φ' = -(barQ j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the lepton doublet symbols. -/ + d_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + d i s φ * L j s' φ' = -(L j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ + d_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + d i s φ * barL j s' φ' = -(barL j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the lepton singlet symbols. -/ + d_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + d i s φ * e j s' φ' = -(e j s' φ' * d i s φ) + /-- The down-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ + d_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + d i s φ * bare j s' φ' = -(bare j s' φ' * d i s φ) + /-- The conjugate down-type quark symbols anticommute among themselves. -/ + bard_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule DownSinglet)), + bard i s φ * bard j s' φ' = -(bard j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the up-type quark symbols. -/ + bard_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ UpSinglet), + bard i s φ * u j s' φ' = -(u j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ + bard_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + bard i s φ * baru j s' φ' = -(baru j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the quark doublet symbols. -/ + bard_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), + bard i s φ * Q j s' φ' = -(Q j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ + bard_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + bard i s φ * barQ j s' φ' = -(barQ j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the lepton doublet symbols. -/ + bard_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), + bard i s φ * L j s' φ' = -(L j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the conjugate lepton doublet symbols. + -/ + bard_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + bard i s φ * barL j s' φ' = -(barL j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the lepton singlet symbols. -/ + bard_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), + bard i s φ * e j s' φ' = -(e j s' φ' * bard i s φ) + /-- The conjugate down-type quark symbols anticommute with the conjugate lepton singlet symbols. + -/ + bard_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + bard i s φ * bare j s' φ' = -(bare j s' φ' * bard i s φ) + /-- The up-type quark symbols anticommute among themselves. -/ + u_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ UpSinglet), + u i s φ * u j s' φ' = -(u j s' φ' * u i s φ) + /-- The up-type quark symbols anticommute with the conjugate up-type quark symbols. -/ + u_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + u i s φ * baru j s' φ' = -(baru j s' φ' * u i s φ) + /-- The up-type quark symbols anticommute with the quark doublet symbols. -/ + u_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + u i s φ * Q j s' φ' = -(Q j s' φ' * u i s φ) + /-- The up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ + u_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + u i s φ * barQ j s' φ' = -(barQ j s' φ' * u i s φ) + /-- The up-type quark symbols anticommute with the lepton doublet symbols. -/ + u_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + u i s φ * L j s' φ' = -(L j s' φ' * u i s φ) + /-- The up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ + u_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + u i s φ * barL j s' φ' = -(barL j s' φ' * u i s φ) + /-- The up-type quark symbols anticommute with the lepton singlet symbols. -/ + u_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + u i s φ * e j s' φ' = -(e j s' φ' * u i s φ) + /-- The up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ + u_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + u i s φ * bare j s' φ' = -(bare j s' φ' * u i s φ) + /-- The conjugate up-type quark symbols anticommute among themselves. -/ + baru_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule UpSinglet)), + baru i s φ * baru j s' φ' = -(baru j s' φ' * baru i s φ) + /-- The conjugate up-type quark symbols anticommute with the quark doublet symbols. -/ + baru_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), + baru i s φ * Q j s' φ' = -(Q j s' φ' * baru i s φ) + /-- The conjugate up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ + baru_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + baru i s φ * barQ j s' φ' = -(barQ j s' φ' * baru i s φ) + /-- The conjugate up-type quark symbols anticommute with the lepton doublet symbols. -/ + baru_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), + baru i s φ * L j s' φ' = -(L j s' φ' * baru i s φ) + /-- The conjugate up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ + baru_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + baru i s φ * barL j s' φ' = -(barL j s' φ' * baru i s φ) + /-- The conjugate up-type quark symbols anticommute with the lepton singlet symbols. -/ + baru_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), + baru i s φ * e j s' φ' = -(e j s' φ' * baru i s φ) + /-- The conjugate up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ + baru_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + baru i s φ * bare j s' φ' = -(bare j s' φ' * baru i s φ) + /-- The quark doublet symbols anticommute among themselves. -/ + Q_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ QuarkDoublet), + Q i s φ * Q j s' φ' = -(Q j s' φ' * Q i s φ) + /-- The quark doublet symbols anticommute with the conjugate quark doublet symbols. -/ + Q_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + Q i s φ * barQ j s' φ' = -(barQ j s' φ' * Q i s φ) + /-- The quark doublet symbols anticommute with the lepton doublet symbols. -/ + Q_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonDoublet), + Q i s φ * L j s' φ' = -(L j s' φ' * Q i s φ) + /-- The quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ + Q_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + Q i s φ * barL j s' φ' = -(barL j s' φ' * Q i s φ) + /-- The quark doublet symbols anticommute with the lepton singlet symbols. -/ + Q_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + Q i s φ * e j s' φ' = -(e j s' φ' * Q i s φ) + /-- The quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ + Q_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + Q i s φ * bare j s' φ' = -(bare j s' φ' * Q i s φ) + /-- The conjugate quark doublet symbols anticommute among themselves. -/ + barQ_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + barQ i s φ * barQ j s' φ' = -(barQ j s' φ' * barQ i s φ) + /-- The conjugate quark doublet symbols anticommute with the lepton doublet symbols. -/ + barQ_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonDoublet), + barQ i s φ * L j s' φ' = -(L j s' φ' * barQ i s φ) + /-- The conjugate quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ + barQ_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + barQ i s φ * barL j s' φ' = -(barL j s' φ' * barQ i s φ) + /-- The conjugate quark doublet symbols anticommute with the lepton singlet symbols. -/ + barQ_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), + barQ i s φ * e j s' φ' = -(e j s' φ' * barQ i s φ) + /-- The conjugate quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ + barQ_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + barQ i s φ * bare j s' φ' = -(bare j s' φ' * barQ i s φ) + /-- The lepton doublet symbols anticommute among themselves. -/ + L_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ LeptonDoublet), + L i s φ * L j s' φ' = -(L j s' φ' * L i s φ) + /-- The lepton doublet symbols anticommute with the conjugate lepton doublet symbols. -/ + L_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + L i s φ * barL j s' φ' = -(barL j s' φ' * L i s φ) + /-- The lepton doublet symbols anticommute with the lepton singlet symbols. -/ + L_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + L i s φ * e j s' φ' = -(e j s' φ' * L i s φ) + /-- The lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ + L_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + L i s φ * bare j s' φ' = -(bare j s' φ' * L i s φ) + /-- The conjugate lepton doublet symbols anticommute among themselves. -/ + barL_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + barL i s φ * barL j s' φ' = -(barL j s' φ' * barL i s φ) + /-- The conjugate lepton doublet symbols anticommute with the lepton singlet symbols. -/ + barL_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), + barL i s φ * e j s' φ' = -(e j s' φ' * barL i s φ) + /-- The conjugate lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ + barL_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) + , + barL i s φ * bare j s' φ' = -(bare j s' φ' * barL i s φ) + /-- The lepton singlet symbols anticommute among themselves. -/ + e_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ LeptonSinglet), + e i s φ * e j s' φ' = -(e j s' φ' * e i s φ) + /-- The lepton singlet symbols anticommute with the conjugate lepton singlet symbols. -/ + e_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + e i s φ * bare j s' φ' = -(bare j s' φ' * e i s φ) + /-- The conjugate lepton singlet symbols anticommute among themselves. -/ + bare_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + bare i s φ * bare j s' φ' = -(bare j s' φ' * bare i s φ) set_option linter.unusedVariables false namespace IsStandardModel @@ -1682,6 +2027,30 @@ theorem invariant_mem_adjoin_covDeriv {x : B} · exact Or.inl (Or.inr h1) · exact Or.inr h2 + +TODO (lines := 2029-2030) "Prove the Lorentz transformation laws of the covariant + towers, the last thing missing from the construction of `IsCovStandardModel` in + CovStandardModel.lean: with them, `isCovStandardModel_of_lorentzCovDeriv` loses its + thirteen hypotheses. What is needed is that `IsGaugeField.covDerivIter` and + `IsGaugeField.iteratedCovDerivAdjoint` satisfy `IsLorentzCovDerivTransforms`, given + the Lorentz laws of the bare symbols — the `repLorentz_*` fields above and + `lorentz_apply` of `IsGaugeField`. Three ingredients. First, the Lorentz mixing of the + derivative slots should be written as an operator on multiset-indexed families defined + by recursion on the multiset — peel a direction `a`, replace it by every direction `b` + weighted by the Lorentz matrix entry, mix the rest — rather than as a sum over ordered + tuples; peeling two directions commutes, so the recursion is well defined on a + multiset, and it agrees with the tuple form of `IsLorentzDerivTransforms`. Second, + that operator is a morphism for the Leibniz convolution over `Multiset.antidiagonal`, + by induction on the multiset using `Multiset.antidiagonal_cons`; this is what carries + the law through `actionFamConv` and `bracketFamConv`, both of which are, after + expansion in a basis, scalar combinations of convolutions of products in the algebra. + Third — and this is not yet recorded anywhere — the gauge-algebra action on each value + space must commute with the Lorentz action on it, since the correction term of a + covariant derivative acts on the value index by `act` while the Lorentz group acts on + it by the species representation. That is true because the two act on different tensor + factors, but it needs a lemma for each of the ten fermion species (for the Higgs it is + trivial, the Lorentz representation being trivial)." + end IsStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean new file mode 100644 index 000000000..1231fbd42 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean @@ -0,0 +1,2484 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsCovStandardModel.Basic +public import Physlib.Particles.StandardModel.IsStandardModel.Basic +/-! +# From the jet Standard Model to its covariant form + +## i. Overview + +`IsStandardModel` records the Standard Model in terms of the *bare* symbols +`[∂_s A_μ^a]`, `[∂_s H^i]`, `[∂_s ψ^α]`, on which the whole jet gauge group +`JetGaugeGroupI` acts — a gauge transformation together with all of its derivatives at +the base point. The covariant form of the theory, `IsCovStandardModel`, is written +instead in terms of the covariant towers `∇_l F_{μν}`, `∇_l H`, `∇_l ψ`, on which only +the global gauge group `GaugeGroupI` acts. + +This file builds the bridge, in two halves. + +The first half names the covariant generators of an `IsStandardModel` in the +ordered-tuple indexing used by `IsCovStandardModel`, assembles the subalgebra they +generate, and proves the *reduction theorem*: inside the field algebra, invariance +under the full jet gauge group is exactly membership of the covariant subalgebra +together with invariance under the global gauge group. Adjoining the Lorentz condition, +which the reduction leaves untouched, gives the statement in the form used for +classifying Lagrangians. + +The second half constructs the structure `IsCovStandardModel` itself for those towers. +The gauge equivariance of the towers is section E; their mass weights are section I, +which grades the algebra by the weight eigenspaces of `massWeightPoly` and pushes the +grading through the recursion defining a covariant derivative; their statistics are +section J, which reads them off the statistics of the bare symbols because each term +of a tower carries exactly one bare matter symbol. What is *not* proved here is the +Lorentz transformation law of a covariant tower, which +`isCovStandardModel_of_lorentzCovDeriv` therefore takes as thirteen explicit +hypotheses. They are not further assumptions about the model: each follows from the +Lorentz law `IsStandardModel` records for the corresponding bare symbols, together +with the fact that the gauge-algebra action on the value space commutes with the +Lorentz action on it. Proving them is the one thing that remains; the `TODO` at the +end of [`Basic.lean`](Basic.lean) says what the proof needs. + +## ii. Key results + +- `IsStandardModel.repGlobal` : the global gauge action, the jet action restricted + along the constant jets. +- `IsStandardModel.covAlgebra` : the subalgebra generated by the covariant towers. +- `IsStandardModel.repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero` : pure gauge + jets fix the covariant subalgebra pointwise. +- `IsStandardModel.forall_repJet_eq_iff` : the reduction theorem for the gauge group. +- `IsStandardModel.forall_repJet_and_repLorentz_eq_iff` : the reduction theorem for the + gauge group together with the Lorentz group. +- `IsStandardModel.repGlobal_covF`, `IsStandardModel.repGlobal_covDerivH` and their + companions : the covariant towers are equivariant for the global gauge group. +- `IsStandardModel.covF_commute_of_mem_covAlgebra` : the field-strength tower is + central in the covariant algebra. +- `IsStandardModel.covDerivIter_mem_massWeightEigenspace` and + `IsStandardModel.iteratedCovDerivAdjoint_mem_massWeightEigenspace` : a covariant + tower is a mass-weight eigenvector, of the weight its species and derivative order + predict. +- `IsStandardModel.commute_covDerivIter_covDerivIter` and + `IsStandardModel.anticommute_covDerivIter_covDerivIter` : the statistics of a pair of + towers is the statistics of the pair of bare families. +- `IsStandardModel.isCovStandardModel_of_lorentzCovDeriv` : the covariant form of the + theory, modulo the Lorentz laws of the towers. + +## iii. Table of contents + +- A. The global gauge action +- B. The covariant generators and the covariant algebra + - B.1. The generating set indexed by lists +- C. Pure gauge jets fix the covariant algebra +- D. The reduction theorem +- E. The covariant generators are globally equivariant +- F. The field-strength tower is central in the covariant algebra +- G. Multiplicativity of the global gauge and Lorentz actions +- H. Sums of products: the two family pairings +- I. The mass weights of the covariant towers + - I.1. The mass weights, species by species +- J. The statistics of the covariant towers + - J.1. The statistics, species by species +- K. The covariant form of the theory + +## iv. References + +The classification of jet-gauge invariants that section D consumes is +`IsStandardModel.invariant_mem_adjoin_covDeriv`, proved in +[`IsStandardModel/Basic.lean`](Basic.lean); the splitting of a gauge jet into a pure +jet and a constant jet is `JetGaugeGroupI.eq_truncationProjZero_mul_ofConstant`. The +target structure and its three sectors are +[`IsCovStandardModel/Basic.lean`](../IsCovStandardModel/Basic.lean), +[`IsGaugeSector/Basic.lean`](../IsGaugeSector/Basic.lean), +[`IsHiggsSector/Basic.lean`](../IsHiggsSector/Basic.lean) and +[`IsFermionSector/Basic.lean`](../IsFermionSector/Basic.lean). + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace IsStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + {H : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ HiggsVec →ₗ[ℂ] B} + {barH : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {d : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ DownSinglet →ₗ[ℂ] B} + {bard : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B} + {u : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ UpSinglet →ₗ[ℂ] B} + {baru : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B} + {Q : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B} + {barQ : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B} + {L : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B} + {barL : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B} + {e : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B} + {bare : Fin 3 → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B} + (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) + +/-! + +## A. The global gauge action + +A global (constant) gauge transformation is a jet with no derivatives, so the global +gauge group sits inside the jet gauge group as the constant jets. Restricting the jet +action along that inclusion gives the action of the global gauge group on the algebra. + +-/ + +/-- The action of the global gauge group on the algebra: the jet action restricted + along the inclusion of the constant jets. -/ +noncomputable def repGlobal (repJet : Representation ℂ JetGaugeGroupI B) : + Representation ℂ GaugeGroupI B := + MonoidHom.comp repJet JetGaugeGroupI.ofConstant + +/-- The global gauge action is the jet action at the corresponding constant jet. -/ +@[simp] +lemma repGlobal_apply (repJet : Representation ℂ JetGaugeGroupI B) (g : GaugeGroupI) + (b : B) : repGlobal repJet g b = repJet (JetGaugeGroupI.ofConstant g) b := rfl + +/-! + +## B. The covariant generators and the covariant algebra + +The covariant towers of section B and section D of `IsStandardModel.Basic` are indexed +there by multisets (for the field strength, by lists) of directions. `IsCovStandardModel` +indexes them by ordered tuples `Fin n → (Fin 1 ⊕ Fin 3)`; `covF` is the field-strength +tower in that indexing, and the matter towers already carry it. + +-/ + +/-- The covariant derivatives of the field strength in the ordered-tuple indexing used + by `IsCovStandardModel`. -/ +noncomputable def covF (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + h.covDerivFieldStrength (List.ofFn l) μ ν + +/-- The covariant generators of the Standard Model: the field-strength tower, the Higgs + towers and their conjugates, and the ten fermion towers and their conjugates. -/ +def covGenerators (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) : Set B := + (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + Set.range (h.covF l μ ν)) ∪ + (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l)) + +/-- The covariant subalgebra: the algebra generated by the covariant towers. This is + the `IsCovStandardModel.fieldAlgebra` of the covariant form of the theory. -/ +def covAlgebra (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) : Subalgebra ℂ B := + Algebra.adjoin ℂ h.covGenerators + +/-! + +### B.1. The generating set indexed by lists + +The classification theorem `invariant_mem_adjoin_covDeriv` produces the field-strength +tower indexed by lists. Since every list is `List.ofFn` of its own accessor, the two +generating sets coincide. + +-/ + +/-- The covariant generating set, with the field-strength tower indexed by lists rather + than by ordered tuples. -/ +def covGeneratorsList (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) : Set B := + (⋃ (l : List (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + Set.range (h.covDerivFieldStrength l μ ν)) ∪ + (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (h.covDerivD i l) ∪ Set.range (h.covDerivBarD i l) ∪ + Set.range (h.covDerivU i l) ∪ Set.range (h.covDerivBarU i l) ∪ + Set.range (h.covDerivQ i l) ∪ Set.range (h.covDerivBarQ i l) ∪ + Set.range (h.covDerivL i l) ∪ Set.range (h.covDerivBarL i l) ∪ + Set.range (h.covDerivE i l) ∪ Set.range (h.covDerivBarE i l)) + +/-- The two indexings of the covariant generating set agree. -/ +lemma covGenerators_eq_covGeneratorsList : h.covGenerators = h.covGeneratorsList := by + rw [covGenerators, covGeneratorsList] + congr 1 + congr 1 + ext x + simp only [Set.mem_iUnion, Set.mem_range] + constructor + · rintro ⟨n, l, μ, ν, φ, rfl⟩ + exact ⟨List.ofFn l, μ, ν, φ, rfl⟩ + · rintro ⟨l, μ, ν, φ, rfl⟩ + refine ⟨l.length, l.get, μ, ν, φ, ?_⟩ + rw [covF, List.ofFn_get] + +/-! + +## C. Pure gauge jets fix the covariant algebra + +Section F of `IsStandardModel.Basic` shows that a gauge jet with trivial base-point +value fixes every covariant generator. The jet action is multiplicative, so it fixes +the whole algebra those generators span. + +-/ + +include h in +/-- Gauge jets fix the scalars: the action is multiplicative, hence unital, and + complex-linear. -/ +lemma repJet_algebraMap (U : JetGaugeGroupI) (c : ℂ) : + repJet U (algebraMap ℂ B c) = algebraMap ℂ B c := by + have hone : repJet U (1 : B) = 1 := by + obtain ⟨v, hv⟩ : ∃ v, repJet U v = 1 := + ⟨repJet U⁻¹ 1, by + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one repJet, + Module.End.one_apply]⟩ + have h1 := h.repJet_A.gauge_mul U v 1 + rw [mul_one, hv, one_mul] at h1 + exact h1.symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] + +include h in +/-- Pure gauge jets fix the covariant generators: this is section F of + `IsStandardModel.Basic` together with the field-strength case of section D. -/ +lemma repJet_eq_of_mem_covGenerators_of_mem_truncationKer_zero + (U : JetGaugeGroupI.truncationKer 0) {x : B} (hx : x ∈ h.covGenerators) : + repJet U.1 x = x := by + rw [covGenerators] at hx + rcases hx with hx | hx + · rcases hx with hx | hx + · simp only [Set.mem_iUnion, Set.mem_range] at hx + obtain ⟨n, l, μ, ν, φ, rfl⟩ := hx + exact h.repJet_covDerivFieldStrength_of_mem_truncationKer_zero U _ μ ν φ + · simp only [Set.mem_iUnion] at hx + obtain ⟨n, l, hx⟩ := hx + rcases hx with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · exact h.repJet_covDerivH_of_mem_truncationKer_zero l U φ + · exact h.repJet_covDerivBarH_of_mem_truncationKer_zero l U φ + · simp only [Set.mem_iUnion] at hx + obtain ⟨i, n, l, hx⟩ := hx + rcases hx with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) + · exact h.repJet_covDerivD_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivBarD_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivU_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivBarU_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivQ_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivBarQ_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivL_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivBarL_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivE_of_mem_truncationKer_zero i l U φ + · exact h.repJet_covDerivBarE_of_mem_truncationKer_zero i l U φ + +include h in +/-- Pure gauge jets fix the covariant algebra pointwise: they fix its generators, and + the jet action is an algebra map. -/ +lemma repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero + (U : JetGaugeGroupI.truncationKer 0) {x : B} (hx : x ∈ h.covAlgebra) : + repJet U.1 x = x := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact h.repJet_eq_of_mem_covGenerators_of_mem_truncationKer_zero U hb + | algebraMap c => exact h.repJet_algebraMap U.1 c + | add a b _ _ iha ihb => rw [map_add, iha, ihb] + | mul a b _ _ iha ihb => rw [h.repJet_A.gauge_mul, iha, ihb] + +/-! + +## D. The reduction theorem + +Every gauge jet splits as a pure jet times a constant jet. On the covariant algebra the +pure part acts trivially, so only the constant part — the global gauge group — is left. +In the other direction the classification of section G of `IsStandardModel.Basic` puts +every jet-invariant of the field algebra inside the covariant algebra. Together: on the +field algebra, jet invariance is membership of the covariant algebra plus global +invariance. + +-/ + +include h in +/-- The reduction of jet gauge invariance to global gauge invariance: an element of the + field algebra is invariant under the whole jet gauge group exactly when it lies in + the covariant algebra and is invariant under the global gauge group. -/ +theorem forall_repJet_eq_iff {x : B} (hx : x ∈ h.fieldAlgebra) : + (∀ U : JetGaugeGroupI, repJet U x = x) ↔ + x ∈ h.covAlgebra ∧ ∀ g : GaugeGroupI, repGlobal repJet g x = x := by + constructor + · intro hinv + refine ⟨?_, fun g => hinv _⟩ + rw [covAlgebra, covGenerators_eq_covGeneratorsList, covGeneratorsList] + exact h.invariant_mem_adjoin_covDeriv hx hinv + · rintro ⟨hmem, hglob⟩ U + have hU := JetGaugeGroupI.eq_truncationProjZero_mul_ofConstant U + calc repJet U x + = repJet ((JetGaugeGroupI.truncationProjZero U : JetGaugeGroupI) * + JetGaugeGroupI.ofConstant U.eval) x := by rw [← hU] + _ = repJet (JetGaugeGroupI.truncationProjZero U : JetGaugeGroupI) + (repJet (JetGaugeGroupI.ofConstant U.eval) x) := by + rw [map_mul]; rfl + _ = repJet (JetGaugeGroupI.truncationProjZero U : JetGaugeGroupI) x := by + rw [show repJet (JetGaugeGroupI.ofConstant U.eval) x = x from hglob U.eval] + _ = x := h.repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero + (JetGaugeGroupI.truncationProjZero U) hmem + +include h in +/-- The reduction theorem in the form used for Lagrangians: for an element of the field + algebra, invariance under the full jet gauge group together with the Lorentz group is + membership of the covariant algebra together with invariance under the global gauge + group and the Lorentz group. The Lorentz condition is carried through unchanged. -/ +theorem forall_repJet_and_repLorentz_eq_iff {x : B} (hx : x ∈ h.fieldAlgebra) : + ((∀ U : JetGaugeGroupI, repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) ↔ + (x ∈ h.covAlgebra ∧ (∀ g : GaugeGroupI, repGlobal repJet g x = x) ∧ + ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) := by + rw [h.forall_repJet_eq_iff hx, and_assoc] + +/-! + +## E. The covariant generators are globally equivariant + +Section E of `IsStandardModel.Basic` shows that a gauge jet acts on a covariant tower +through the base-point Taylor coefficient of its representation alone. Evaluated on a +constant jet, that coefficient is the corresponding action of the global gauge group, +so each covariant tower is equivariant for `repGlobal` in the (contragredient of the) +global representation of its species. These are exactly the `repGauge_*` obligations of +`IsGaugeSector`, `IsHiggsSector` and `IsFermionSector`. + +-/ + +/-- The zeroth Taylor coefficient of a jet representation at a constant jet is the + underlying action of the global gauge group. -/ +lemma repCoeff_zero_ofConstant {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {repG : Representation ℂ GaugeGroupI V} {g : GaugeGroupI} + (hg : rep (JetGaugeGroupI.ofConstant g) = TensorProduct.map LinearMap.id (repG g)) : + IsGaugeField.repCoeff rep (JetGaugeGroupI.ofConstant g) 0 = repG g := by + refine LinearMap.ext fun v => ?_ + simp only [IsGaugeField.repCoeff, LinearMap.coe_comp, Function.comp_apply, + jetIteratedDeriv_zero, LinearMap.id_coe, id_eq, jetOfConstant_apply, hg, + TensorProduct.map_tmul, LinearMap.id_apply, jetEval_tmul, map_one, one_smul] + +/-- At an inverse constant jet the dual representation coefficient is the + contragredient action of the global gauge group. -/ +lemma repDualCoeff_zero_ofConstant_inv {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {repG : Representation ℂ GaugeGroupI V} (g : GaugeGroupI) + (hg : ∀ g' : GaugeGroupI, + rep (JetGaugeGroupI.ofConstant g') = TensorProduct.map LinearMap.id (repG g')) : + IsGaugeField.repDualCoeff rep (JetGaugeGroupI.ofConstant g)⁻¹ 0 = repG.dual g := by + rw [show ((JetGaugeGroupI.ofConstant g)⁻¹ : JetGaugeGroupI) = + JetGaugeGroupI.ofConstant g⁻¹ from (map_inv JetGaugeGroupI.ofConstant g).symm, + IsGaugeField.repDualCoeff, repCoeff_zero_ofConstant (hg g⁻¹)] + rfl + +/-- At an inverse constant jet the dual coefficient of a conjugate representation is the + contragredient of the conjugate action of the global gauge group. -/ +lemma repDualCoeff_repConj_zero_ofConstant_inv {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {repG : Representation ℂ GaugeGroupI V} (g : GaugeGroupI) + (hg : ∀ g' : GaugeGroupI, + rep (JetGaugeGroupI.ofConstant g') = TensorProduct.map LinearMap.id (repG g')) : + IsGaugeField.repDualCoeff (repConj rep) (JetGaugeGroupI.ofConstant g)⁻¹ 0 = + repG.conj.dual g := by + rw [show ((JetGaugeGroupI.ofConstant g)⁻¹ : JetGaugeGroupI) = + JetGaugeGroupI.ofConstant g⁻¹ from (map_inv JetGaugeGroupI.ofConstant g).symm, + IsGaugeField.repDualCoeff, GaugeAlgebra.repCoeff_repConj, + repCoeff_zero_ofConstant (hg g⁻¹)] + rfl + +/-- At an inverse constant jet the dual adjoint coefficient is the contragredient + adjoint action of the global gauge group. -/ +lemma adjointDualCoeff_zero_ofConstant_inv (g : GaugeGroupI) : + adjointDualCoeff (JetGaugeGroupI.ofConstant g)⁻¹ 0 = + (GaugeAlgebra.adjointMap g⁻¹).dualMap := by + rw [adjointDualCoeff_zero, map_inv, JetGaugeGroupI.eval_ofConstant] + rfl + +include h in +/-- The covariant derivatives of the field strength are equivariant for the global gauge + group, in the contragredient adjoint representation. -/ +lemma repGlobal_covF (g : GaugeGroupI) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repGlobal repJet g (h.covF l μ ν φ) = + h.covF l μ ν ((GaugeAlgebra.adjointMap g⁻¹).dualMap φ) := by + rw [repGlobal_apply] + refine (h.repJet_covDerivFieldStrength (JetGaugeGroupI.ofConstant g) + (List.ofFn l) μ ν φ).trans ?_ + rw [adjointDualCoeff_zero_ofConstant_inv] + rfl + +include h in +/-- The covariant derivatives of the Higgs field are equivariant for the global gauge + group, in the contragredient of the Higgs representation. -/ +lemma repGlobal_covDerivH (g : GaugeGroupI) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : + repGlobal repJet g (h.covDerivH l φ) = + h.covDerivH l (HiggsVec.repGaugeGroupI.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivH l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_zero_ofConstant_inv g HiggsVec.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the conjugate Higgs field are equivariant for the + global gauge group, in the contragredient of the conjugate Higgs representation. -/ +lemma repGlobal_covDerivBarH (g : GaugeGroupI) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + repGlobal repJet g (h.covDerivBarH l φ) = + h.covDerivBarH l (HiggsVec.repGaugeGroupI.conj.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivBarH l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_repConj_zero_ofConstant_inv g HiggsVec.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the down-type quarks are equivariant for the global + gauge group. -/ +lemma repGlobal_covDerivD (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) : + repGlobal repJet g (h.covDerivD i l φ) = + h.covDerivD i l (DownSinglet.repGaugeGroupI.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivD i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_zero_ofConstant_inv g DownSinglet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the conjugate down-type quarks are equivariant for the + global gauge group. -/ +lemma repGlobal_covDerivBarD (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + repGlobal repJet g (h.covDerivBarD i l φ) = + h.covDerivBarD i l (DownSinglet.repGaugeGroupI.conj.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivBarD i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_repConj_zero_ofConstant_inv g DownSinglet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the up-type quarks are equivariant for the global + gauge group. -/ +lemma repGlobal_covDerivU (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) : + repGlobal repJet g (h.covDerivU i l φ) = + h.covDerivU i l (UpSinglet.repGaugeGroupI.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivU i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_zero_ofConstant_inv g UpSinglet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the conjugate up-type quarks are equivariant for the + global gauge group. -/ +lemma repGlobal_covDerivBarU (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + repGlobal repJet g (h.covDerivBarU i l φ) = + h.covDerivBarU i l (UpSinglet.repGaugeGroupI.conj.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivBarU i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_repConj_zero_ofConstant_inv g UpSinglet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the quark doublets are equivariant for the global + gauge group. -/ +lemma repGlobal_covDerivQ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) : + repGlobal repJet g (h.covDerivQ i l φ) = + h.covDerivQ i l (QuarkDoublet.repGaugeGroupI.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivQ i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_zero_ofConstant_inv g QuarkDoublet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the conjugate quark doublets are equivariant for the + global gauge group. -/ +lemma repGlobal_covDerivBarQ (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + repGlobal repJet g (h.covDerivBarQ i l φ) = + h.covDerivBarQ i l (QuarkDoublet.repGaugeGroupI.conj.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivBarQ i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_repConj_zero_ofConstant_inv g QuarkDoublet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the lepton doublets are equivariant for the global + gauge group. -/ +lemma repGlobal_covDerivL (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet) : + repGlobal repJet g (h.covDerivL i l φ) = + h.covDerivL i l (LeptonDoublet.repGaugeGroupI.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivL i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_zero_ofConstant_inv g LeptonDoublet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the conjugate lepton doublets are equivariant for the + global gauge group. -/ +lemma repGlobal_covDerivBarL (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + repGlobal repJet g (h.covDerivBarL i l φ) = + h.covDerivBarL i l (LeptonDoublet.repGaugeGroupI.conj.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivBarL i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_repConj_zero_ofConstant_inv g LeptonDoublet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the lepton singlets are equivariant for the global + gauge group. -/ +lemma repGlobal_covDerivE (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonSinglet) : + repGlobal repJet g (h.covDerivE i l φ) = + h.covDerivE i l (LeptonSinglet.repGaugeGroupI.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivE i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_zero_ofConstant_inv g LeptonSinglet.repJetGaugeGroupI_ofConstant] + +include h in +/-- The covariant derivatives of the conjugate lepton singlets are equivariant for the + global gauge group. -/ +lemma repGlobal_covDerivBarE (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + repGlobal repJet g (h.covDerivBarE i l φ) = + h.covDerivBarE i l (LeptonSinglet.repGaugeGroupI.conj.dual g φ) := by + rw [repGlobal_apply, h.repJet_covDerivBarE i l (JetGaugeGroupI.ofConstant g) φ, + repDualCoeff_repConj_zero_ofConstant_inv g LeptonSinglet.repJetGaugeGroupI_ofConstant] + +/-! + +## F. The field-strength tower is central in the covariant algebra + +The gauge field is bosonic, so its symbols commute with each other and with every +matter symbol. Every covariant generator is a polynomial in those symbols, so the +covariant generators all commute with the gauge-field symbols; and the field-strength +tower, being itself a polynomial in the gauge-field symbols, therefore commutes with +the whole covariant algebra. This discharges the `F_comm_F` obligation of +`IsGaugeSector` and the `F_comm_*` obligations of `IsCovStandardModel` at once. + +-/ + +/-- The covariant derivatives of the field strength are polynomials in the gauge-field + symbols. -/ +lemma covF_mem_adjoin_gaugeSymbols (h : IsStandardModel B repJet repLorentz massWeightPoly + H barH A d bard u baru Q barQ L barL e bare) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + h.covF l μ ν φ ∈ Algebra.adjoin ℂ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (ρ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = A s ρ ψ} := + IsGaugeField.iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols + (List.ofFn l) μ ν φ + +include h in +/-- Every covariant generator commutes with every gauge-field symbol: the covariant + towers are polynomials in the gauge-field and matter symbols, and the gauge field is + bosonic. -/ +lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) + (ρ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) {y : B} + (hy : y ∈ h.covGenerators) : Commute y (A p ρ ψ) := by + rw [covGenerators] at hy + rcases hy with hy | hy + · rcases hy with hy | hy + · simp only [Set.mem_iUnion, Set.mem_range] at hy + obtain ⟨n, l, μ, ν, φ, rfl⟩ := hy + refine IsGaugeField.commute_of_mem_adjoin ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν φ) + rintro x' ⟨s', ρ', ψ', rfl⟩ + exact h.A_comm_A s' p ρ' ρ ψ' ψ + · simp only [Set.mem_iUnion] at hy + obtain ⟨n, l, hy⟩ := hy + rcases hy with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (HiggsVec.gaugeAlgebraAction) H n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_H p ρ ψ s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_barH p ρ ψ s' φ').symm + · simp only [Set.mem_iUnion] at hy + obtain ⟨i, n, l, hy⟩ := hy + rcases hy with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_d p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_bard p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (UpSinglet.gaugeAlgebraAction) (u i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_u p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_baru p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (QuarkDoublet.gaugeAlgebraAction) (Q i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_Q p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_barQ p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (LeptonDoublet.gaugeAlgebraAction) (L i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_L p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_barL p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (LeptonSinglet.gaugeAlgebraAction) (e i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_e p ρ ψ i s' φ').symm + · refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l 0 φ) + rintro x' (⟨s', ρ', ψ', rfl⟩ | ⟨s', φ', rfl⟩) + · exact h.A_comm_A s' p ρ' ρ ψ' ψ + · exact (h.A_comm_bare p ρ ψ i s' φ').symm + +include h in +/-- The field-strength tower commutes with every covariant generator. -/ +lemma covF_commute_of_mem_covGenerators {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) {y : B} + (hy : y ∈ h.covGenerators) : Commute (h.covF l μ ν ψ) y := + IsGaugeField.commute_of_mem_adjoin + (fun b hb => by + obtain ⟨s', ρ', ψ', rfl⟩ := hb + exact (h.commute_gaugeSymbol_of_mem_covGenerators s' ρ' ψ' hy).symm) + (h.covF_mem_adjoin_gaugeSymbols l μ ν ψ) + +include h in +/-- The field-strength tower is central in the covariant algebra: commutation with the + generators extends to the algebra they generate. -/ +lemma covF_commute_of_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) {x : B} + (hx : x ∈ h.covAlgebra) : Commute (h.covF l μ ν ψ) x := + (IsGaugeField.commute_of_mem_adjoin + (fun _ hb => (h.covF_commute_of_mem_covGenerators l μ ν ψ hb).symm) hx).symm + +/-! + +## G. Multiplicativity of the global gauge and Lorentz actions + +`IsCovStandardModel` takes the multiplicativity of the two actions on `B` as explicit +arguments. For the gauge action it is the `gauge_mul` field of `IsGaugeField`, read +along the inclusion of the constant jets; for the Lorentz action it is the structure +field `repLorentz_mul`. + +-/ + +include h in +/-- The global gauge action is multiplicative: it is the jet action at a constant jet, + and the jet action is an algebra map. -/ +lemma repGlobal_mul (g : GaugeGroupI) (b₁ b₂ : B) : + repGlobal repJet g (b₁ * b₂) = repGlobal repJet g b₁ * repGlobal repJet g b₂ := + h.repJet_A.gauge_mul _ b₁ b₂ + +/-! + +## H. Sums of products: the two family pairings + +Both correction terms of a covariant derivative — the action pairing `act` on a matter +family and the gauge-algebra bracket on an adjoint family — are, after expansion in a +basis, finite sums of scalar multiples of products of the two families' components. So +each lands in any submodule of `B` containing all those products. This is the only +property of the two pairings used in sections I and J. + +-/ + +/-- The action pairing of two families lands in any submodule containing the products + of their components: expanded in bases of the gauge algebra and of the value space it + is a finite sum of scalar multiples of such products. -/ +lemma actionFam_apply_mem_submodule {V : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} {M : Submodule ℂ B} + {f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {g : Module.Dual ℂ V →ₗ[ℂ] B} + (hfg : ∀ ψ χ, f ψ * g χ ∈ M) (φ : Module.Dual ℂ V) : + IsGaugeField.actionFam act f g φ ∈ M := by + rw [IsGaugeField.actionFam, + IsGaugeField.dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) f, + IsGaugeField.dualPairEquivC_symm_eq_sum (Module.finBasis ℂ V) g] + simp only [map_sum, LinearMap.sum_apply, IsGaugeField.tensorAction_tmul, + IsGaugeField.dualPairEquivC_tmul] + exact sum_mem fun i _ => sum_mem fun j _ => M.smul_mem _ (hfg _ _) + +/-- The bracket pairing of two adjoint families lands in any submodule containing the + products of their components: expanded in a basis of the gauge algebra it is the + finite sum of the structure constants against those products. -/ +lemma bracketFam_apply_mem_submodule {M : Submodule ℂ B} + {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hfg : ∀ ψ χ, f ψ * g χ ∈ M) (φ : Module.Dual ℝ GaugeAlgebra) : + IsGaugeField.bracketFam f g φ ∈ M := by + rw [IsGaugeField.bracketFam_apply_eq_sum] + refine sum_mem fun j _ => sum_mem fun k _ => ?_ + rw [← algebraMap_smul ℂ] + exact M.smul_mem _ (hfg _ _) + +/-! + +## I. The mass weights of the covariant towers + +`massWeightPoly` is pinned down on the bare symbols only, while a covariant tower is a +sum of products of them. The weight-`w` eigenspace of `massWeightPoly` is a submodule, +and the product of a weight-`w` and a weight-`w'` element has weight `w + w'`; the +recursion defining a covariant derivative adds one derivative on one branch and one +gauge-field factor on the other, which cost the same two units of weight. Both towers +are therefore eigenvectors, of the weights `IsGaugeSector`, `IsHiggsSector` and +`IsFermionSector` demand. + +-/ + +/-- The weight-`w` part of the algebra: the elements on which the mass-weight algebra + map is the monomial `X ^ w`. -/ +noncomputable def massWeightEigenspace (massWeightPoly : B →ₐ[ℂ] Polynomial B) (w : ℕ) : + Submodule ℂ B := + LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial w : B →ₗ[B] Polynomial B).restrictScalars ℂ) + +/-- Membership of the weight-`w` part is the eigenvector equation itself. -/ +lemma mem_massWeightEigenspace_iff {w : ℕ} {b : B} : + b ∈ massWeightEigenspace massWeightPoly w ↔ + massWeightPoly b = Polynomial.monomial w b := by + rw [massWeightEigenspace, LinearMap.mem_ker] + simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, LinearMap.coe_restrictScalars, + sub_eq_zero] + +/-- The mass weight is additive on products: `massWeightPoly` is an algebra map and + monomials multiply by adding their degrees. -/ +lemma mul_mem_massWeightEigenspace {w w' : ℕ} {b b' : B} + (hb : b ∈ massWeightEigenspace massWeightPoly w) + (hb' : b' ∈ massWeightEigenspace massWeightPoly w') : + b * b' ∈ massWeightEigenspace massWeightPoly (w + w') := by + rw [mem_massWeightEigenspace_iff] at hb hb' ⊢ + rw [map_mul, hb, hb', Polynomial.monomial_mul_monomial] + +/-- The mass weight of a matter covariant tower: if every gauge-field symbol has weight + `2 * (1 + |p|)` and every symbol of the matter family `F` has weight `c + 2 * |t|`, + then the `n`-fold covariant derivative of `F` at the derivative multiset `s` has + weight `c + 2 * n + 2 * |s|`. Each covariant derivative costs two units of weight, + whether it lands on the derivative index or brings down a gauge-field factor. -/ +lemma covDerivIter_mem_massWeightEigenspace {V : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) (c : ℕ) + (hA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), + A p μ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p))) + (hF : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + F t χ ∈ massWeightEigenspace massWeightPoly (c + 2 * Multiset.card t)) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + IsGaugeField.covDerivIter A act F n l s φ ∈ + massWeightEigenspace massWeightPoly (c + 2 * n + 2 * Multiset.card s) := by + induction n generalizing s φ with + | zero => + rw [IsGaugeField.covDerivIter_zero] + simpa using hF s φ + | succ n ih => + rw [IsGaugeField.covDerivIter_succ, IsGaugeField.covDerivAction_apply] + refine add_mem ?_ ?_ + · have hstep := ih (fun i => l i.succ) (l 0 ::ₘ s) φ + rwa [Multiset.card_cons, + show c + 2 * n + 2 * (Multiset.card s + 1) + = c + 2 * (n + 1) + 2 * Multiset.card s from by ring] at hstep + · rw [IsGaugeField.actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle : Multiset.card p.1 + Multiset.card p.2 = Multiset.card s := by + rw [← Multiset.card_add, Multiset.mem_antidiagonal.mp hp] + simp only [Function.comp_apply] + refine actionFam_apply_mem_submodule (fun ψ χ => ?_) _ + have hmul := mul_mem_massWeightEigenspace (hA p.1 (l 0) ψ) + (ih (fun i => l i.succ) p.2 χ) + rwa [show 2 * (1 + Multiset.card p.1) + (c + 2 * n + 2 * Multiset.card p.2) + = c + 2 * (n + 1) + 2 * Multiset.card s from by omega] at hmul + +/-- The mass weight of the bare field strength: two gauge-field symbols, or one with an + extra derivative, in either case weight `4 + 2 * |s|`. -/ +lemma fieldStrength_mem_massWeightEigenspace + (hA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), + A p μ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p))) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + IsGaugeField.fieldStrength A μ ν s φ ∈ + massWeightEigenspace massWeightPoly (4 + 2 * Multiset.card s) := by + rw [IsGaugeField.fieldStrength_apply] + refine add_mem (sub_mem ?_ ?_) ?_ + · have hstep := hA (μ ::ₘ s) ν φ + rwa [Multiset.card_cons, + show 2 * (1 + (Multiset.card s + 1)) = 4 + 2 * Multiset.card s from by ring] at hstep + · have hstep := hA (ν ::ₘ s) μ φ + rwa [Multiset.card_cons, + show 2 * (1 + (Multiset.card s + 1)) = 4 + 2 * Multiset.card s from by ring] at hstep + · rw [IsGaugeField.commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle : Multiset.card p.1 + Multiset.card p.2 = Multiset.card s := by + rw [← Multiset.card_add, Multiset.mem_antidiagonal.mp hp] + simp only [Function.comp_apply] + refine bracketFam_apply_mem_submodule (fun ψ χ => ?_) _ + have hmul := mul_mem_massWeightEigenspace (hA p.1 μ ψ) (hA p.2 ν χ) + rwa [show 2 * (1 + Multiset.card p.1) + 2 * (1 + Multiset.card p.2) + = 4 + 2 * Multiset.card s from by omega] at hmul + +/-- The mass weight of an adjoint covariant tower: the adjoint analogue of + `covDerivIter_mem_massWeightEigenspace`, with the bracket pairing in place of the + action pairing. -/ +lemma iteratedCovDerivAdjoint_mem_massWeightEigenspace (c : ℕ) + (hA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), + A p μ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p))) + (G : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (hG : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ GaugeAlgebra), + G t χ ∈ massWeightEigenspace massWeightPoly (c + 2 * Multiset.card t)) + (l : List (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + IsGaugeField.iteratedCovDerivAdjoint A l G s φ ∈ + massWeightEigenspace massWeightPoly (c + 2 * l.length + 2 * Multiset.card s) := by + induction l generalizing s φ with + | nil => + rw [show IsGaugeField.iteratedCovDerivAdjoint A ([] : List (Fin 1 ⊕ Fin 3)) G = G + from rfl] + simpa using hG s φ + | cons ρ l ih => + rw [show IsGaugeField.iteratedCovDerivAdjoint A (ρ :: l) G + = IsGaugeField.covDerivAdjoint A (IsGaugeField.iteratedCovDerivAdjoint A l G) ρ + from rfl, IsGaugeField.covDerivAdjoint_apply] + refine add_mem ?_ ?_ + · have hstep := ih (ρ ::ₘ s) φ + rwa [Multiset.card_cons, + show c + 2 * l.length + 2 * (Multiset.card s + 1) + = c + 2 * (ρ :: l).length + 2 * Multiset.card s from by + rw [List.length_cons]; ring] at hstep + · rw [IsGaugeField.bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle : Multiset.card p.1 + Multiset.card p.2 = Multiset.card s := by + rw [← Multiset.card_add, Multiset.mem_antidiagonal.mp hp] + simp only [Function.comp_apply] + refine bracketFam_apply_mem_submodule (fun ψ χ => ?_) _ + have hmul := mul_mem_massWeightEigenspace (hA p.1 ρ ψ) (ih p.2 χ) + rw [List.length_cons] + rwa [show 2 * (1 + Multiset.card p.1) + (c + 2 * l.length + 2 * Multiset.card p.2) + = c + 2 * (l.length + 1) + 2 * Multiset.card s from by omega] at hmul + +/-- The mass weight of a matter covariant tower at the empty derivative multiset: the + form in which the sector structures ask for it. -/ +lemma covDerivIter_zero_mem_massWeightEigenspace {V : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) (c : ℕ) + (hA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), + A p μ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p))) + (hF : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + F t χ ∈ massWeightEigenspace massWeightPoly (c + 2 * Multiset.card t)) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + IsGaugeField.covDerivIter A act F n l 0 φ ∈ + massWeightEigenspace massWeightPoly (c + 2 * n) := by + have hmem := covDerivIter_mem_massWeightEigenspace act F c hA hF n l 0 φ + rwa [Multiset.card_zero, mul_zero, add_zero] at hmem + +/-- The mass weight of an adjoint covariant tower along an ordered tuple, at the empty + derivative multiset. -/ +lemma iteratedCovDerivAdjoint_ofFn_zero_mem_massWeightEigenspace (c : ℕ) + (hA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), + A p μ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p))) + (G : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (hG : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ GaugeAlgebra), + G t χ ∈ massWeightEigenspace massWeightPoly (c + 2 * Multiset.card t)) + {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + IsGaugeField.iteratedCovDerivAdjoint A (List.ofFn l) G 0 φ ∈ + massWeightEigenspace massWeightPoly (c + 2 * n) := by + have hmem := iteratedCovDerivAdjoint_mem_massWeightEigenspace c hA G hG (List.ofFn l) 0 φ + rwa [List.length_ofFn, Multiset.card_zero, mul_zero, add_zero] at hmem + + +/-! + +### I.1. The mass weights, species by species + +The two towers of section I, evaluated at the empty derivative multiset, give the +mass weights that `IsGaugeSector`, `IsHiggsSector` and `IsFermionSector` demand: +`2 * (2 + n)` for the field strength, `2 * (1 + n)` for the Higgs, and `3 + 2 * n` +for the fermions. + +-/ + +include h in +/-- The mass weight of the field-strength tower is `2 * (2 + n)`: mass dimension `2 + n`. -/ +lemma massWeight_covF {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + massWeightPoly (h.covF l μ ν φ) = + Polynomial.monomial (2 * (2 + n)) (h.covF l μ ν φ) := by + have hA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), + A p ρ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p)) := + fun p ρ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p ρ ψ) + rw [show 2 * (2 + n) = 4 + 2 * n from by ring] + exact mem_massWeightEigenspace_iff.mp + (iteratedCovDerivAdjoint_ofFn_zero_mem_massWeightEigenspace 4 hA + (IsGaugeField.fieldStrength A μ ν) + (fun t χ => fieldStrength_mem_massWeightEigenspace hA μ ν t χ) l φ) + +include h in +/-- The mass weight of the Higgs tower is `2 * (1 + n)`. -/ +lemma massWeight_covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : + massWeightPoly (h.covDerivH l φ) = + Polynomial.monomial (2 * (1 + n)) (h.covDerivH l φ) := by + rw [show 2 * (1 + n) = 2 + 2 * n from by ring] + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace HiggsVec.gaugeAlgebraAction H 2 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr + (by rw [show 2 + 2 * Multiset.card t = 2 * (1 + Multiset.card t) from by ring] + exact h.massWeight_H t χ)) n l φ) + +include h in +/-- The mass weight of the conjugate Higgs tower is `2 * (1 + n)`. -/ +lemma massWeight_covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + massWeightPoly (h.covDerivBarH l φ) = + Polynomial.monomial (2 * (1 + n)) (h.covDerivBarH l φ) := by + rw [show 2 * (1 + n) = 2 + 2 * n from by ring] + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH 2 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr + (by rw [show 2 + 2 * Multiset.card t = 2 * (1 + Multiset.card t) from by ring] + exact h.massWeight_barH t χ)) n l φ) + +include h in +/-- The mass weight of the down-type quark tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : + massWeightPoly (h.covDerivD i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivD i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace DownSinglet.gaugeAlgebraAction (d i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_d i t χ)) n l φ) + +include h in +/-- The mass weight of the conjugate down-type quark tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + massWeightPoly (h.covDerivBarD i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivBarD i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_bard i t χ)) n l φ) + +include h in +/-- The mass weight of the up-type quark tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : + massWeightPoly (h.covDerivU i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivU i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace UpSinglet.gaugeAlgebraAction (u i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_u i t χ)) n l φ) + +include h in +/-- The mass weight of the conjugate up-type quark tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + massWeightPoly (h.covDerivBarU i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivBarU i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_baru i t χ)) n l φ) + +include h in +/-- The mass weight of the quark doublet tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : + massWeightPoly (h.covDerivQ i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivQ i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace QuarkDoublet.gaugeAlgebraAction (Q i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_Q i t χ)) n l φ) + +include h in +/-- The mass weight of the conjugate quark doublet tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + massWeightPoly (h.covDerivBarQ i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivBarQ i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_barQ i t χ)) n l φ) + +include h in +/-- The mass weight of the lepton doublet tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : + massWeightPoly (h.covDerivL i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivL i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace LeptonDoublet.gaugeAlgebraAction (L i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_L i t χ)) n l φ) + +include h in +/-- The mass weight of the conjugate lepton doublet tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + massWeightPoly (h.covDerivBarL i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivBarL i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_barL i t χ)) n l φ) + +include h in +/-- The mass weight of the lepton singlet tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : + massWeightPoly (h.covDerivE i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivE i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace LeptonSinglet.gaugeAlgebraAction (e i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_e i t χ)) n l φ) + +include h in +/-- The mass weight of the conjugate lepton singlet tower is `3 + 2 * n`. -/ +lemma massWeight_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + massWeightPoly (h.covDerivBarE i l φ) = + Polynomial.monomial (3 + 2 * n) (h.covDerivBarE i l φ) := by + exact mem_massWeightEigenspace_iff.mp + (covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) 3 + (fun p μ ψ => mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ)) + (fun t χ => mem_massWeightEigenspace_iff.mpr (h.massWeight_bare i t χ)) n l φ) + +/-! + +## J. The statistics of the covariant towers + +Every covariant tower is a polynomial in the gauge-field symbols and the bare symbols +of its own species, and each of its terms carries exactly one of the latter. So the +statistics of a pair of towers is decided by the statistics of the pair of bare +families: two towers whose bare symbols commute with the gauge field and with each +other commute, and two towers whose bare symbols commute with the gauge field and +anticommute with each other anticommute. + +-/ + +/-- Anything commuting with every gauge-field symbol and with every symbol of a matter + family commutes with every symbol of that family's covariant tower. -/ +lemma commute_covDerivIter {V : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) {y : B} + (hyA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), Commute (A p μ ψ) y) + (hyF : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), Commute (F t χ) y) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + Commute (IsGaugeField.covDerivIter A act F n l s φ) y := by + refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols act F n l s φ) + rintro x (⟨p, μ, ψ, rfl⟩ | ⟨t, χ, rfl⟩) + · exact hyA p μ ψ + · exact hyF t χ + +/-- Two covariant towers whose bare families commute with the gauge field and with each + other commute. -/ +lemma commute_covDerivIter_covDerivIter {V W : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] [AddCommGroup W] [Module ℂ W] [FiniteDimensional ℂ W] + (act₁ : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F₁ : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (act₂ : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℂ] W) + (F₂ : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] B) + (hAA : ∀ (p p' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (A p μ ψ) (A p' μ' ψ')) + (hAF₁ : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (t : Multiset (Fin 1 ⊕ Fin 3)) + (χ : Module.Dual ℂ V), Commute (A p μ ψ) (F₁ t χ)) + (hAF₂ : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (t : Multiset (Fin 1 ⊕ Fin 3)) + (χ : Module.Dual ℂ W), Commute (A p μ ψ) (F₂ t χ)) + (hF₁F₂ : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V) + (t' : Multiset (Fin 1 ⊕ Fin 3)) (χ' : Module.Dual ℂ W), + Commute (F₁ t χ) (F₂ t' χ')) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) (m : ℕ) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ W) : + Commute (IsGaugeField.covDerivIter A act₁ F₁ n l s φ) + (IsGaugeField.covDerivIter A act₂ F₂ m l' s' φ') := by + refine commute_covDerivIter act₁ F₁ (fun p μ ψ => ?_) (fun t χ => ?_) n l s φ + · exact (commute_covDerivIter act₂ F₂ (fun p' μ' ψ' => hAA p' p μ' μ ψ' ψ) + (fun t' χ' => (hAF₂ p μ ψ t' χ').symm) m l' s' φ').symm + · exact (commute_covDerivIter act₂ F₂ (fun p' μ' ψ' => hAF₁ p' μ' ψ' t χ) + (fun t' χ' => (hF₁F₂ t χ t' χ').symm) m l' s' φ').symm + +/-- The elements of the algebra anticommuting with a fixed element. It is a submodule, + which is what lets the anticommutation of a tower be checked term by term. -/ +def anticommuteSubmodule (x : B) : Submodule ℂ B where + carrier := {y : B | x * y = -(y * x)} + add_mem' {a b} ha hb := by + simp only [Set.mem_setOf_eq] at ha hb ⊢ + rw [mul_add, add_mul, ha, hb, neg_add] + zero_mem' := by simp + smul_mem' c y hy := by + simp only [Set.mem_setOf_eq] at hy ⊢ + rw [mul_smul_comm, hy, smul_neg, smul_mul_assoc] + +/-- Membership of the anticommutant is the anticommutation relation itself. -/ +lemma mem_anticommuteSubmodule_iff {x y : B} : + y ∈ anticommuteSubmodule x ↔ x * y = -(y * x) := Iff.rfl + +omit [Algebra ℂ B] in +/-- Anticommutation is symmetric in its two arguments. -/ +lemma anticomm_symm {a b : B} (hab : a * b = -(b * a)) : b * a = -(a * b) := by + rw [hab, neg_neg] + +/-- Multiplying an anticommuting element on the left by a commuting one keeps it + anticommuting. -/ +lemma mul_mem_anticommuteSubmodule {x a b : B} (ha : Commute x a) + (hb : b ∈ anticommuteSubmodule x) : a * b ∈ anticommuteSubmodule x := by + rw [mem_anticommuteSubmodule_iff] at hb ⊢ + rw [← mul_assoc, ha.eq, mul_assoc, hb, mul_neg, mul_assoc] + +/-- Anything commuting with every gauge-field symbol and anticommuting with every + symbol of a matter family anticommutes with every symbol of that family's covariant + tower: each term of the tower is a product of gauge-field symbols with a single bare + symbol of the family. -/ +lemma anticommute_covDerivIter {V : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) {x : B} + (hxA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), Commute x (A p μ ψ)) + (hxF : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + x * F t χ = -(F t χ * x)) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + x * IsGaugeField.covDerivIter A act F n l s φ + = -(IsGaugeField.covDerivIter A act F n l s φ * x) := by + have key : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V), + IsGaugeField.covDerivIter A act F n l s φ ∈ anticommuteSubmodule x := by + intro n + induction n with + | zero => exact fun l s φ => hxF s φ + | succ n ih => + intro l s φ + rw [IsGaugeField.covDerivIter_succ, IsGaugeField.covDerivAction_apply] + refine add_mem (ih _ _ _) ?_ + rw [IsGaugeField.actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun z hz => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hz + simp only [Function.comp_apply] + exact actionFam_apply_mem_submodule + (fun ψ χ => mul_mem_anticommuteSubmodule (hxA p.1 (l 0) ψ) (ih _ p.2 χ)) _ + exact key n l s φ + +/-- Two covariant towers whose bare families commute with the gauge field and + anticommute with each other anticommute. -/ +lemma anticommute_covDerivIter_covDerivIter {V W : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] [AddCommGroup W] [Module ℂ W] [FiniteDimensional ℂ W] + (act₁ : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F₁ : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (act₂ : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℂ] W) + (F₂ : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] B) + (hAA : ∀ (p p' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (A p μ ψ) (A p' μ' ψ')) + (hAF₁ : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (t : Multiset (Fin 1 ⊕ Fin 3)) + (χ : Module.Dual ℂ V), Commute (A p μ ψ) (F₁ t χ)) + (hAF₂ : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (t : Multiset (Fin 1 ⊕ Fin 3)) + (χ : Module.Dual ℂ W), Commute (A p μ ψ) (F₂ t χ)) + (hF₁F₂ : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V) + (t' : Multiset (Fin 1 ⊕ Fin 3)) (χ' : Module.Dual ℂ W), + F₁ t χ * F₂ t' χ' = -(F₂ t' χ' * F₁ t χ)) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) (m : ℕ) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ W) : + IsGaugeField.covDerivIter A act₁ F₁ n l s φ * + IsGaugeField.covDerivIter A act₂ F₂ m l' s' φ' = + -(IsGaugeField.covDerivIter A act₂ F₂ m l' s' φ' * + IsGaugeField.covDerivIter A act₁ F₁ n l s φ) := by + have step := anticommute_covDerivIter act₁ F₁ + (fun p μ ψ => (commute_covDerivIter act₂ F₂ (fun p' μ' ψ' => hAA p' p μ' μ ψ' ψ) + (fun t' χ' => (hAF₂ p μ ψ t' χ').symm) m l' s' φ')) + (fun t χ => anticomm_symm (anticommute_covDerivIter act₂ F₂ + (fun p μ ψ => (hAF₁ p μ ψ t χ).symm) (fun t' χ' => hF₁F₂ t χ t' χ') m l' s' φ')) + n l s φ + exact anticomm_symm step + + + +/-! + +### J.1. The statistics, species by species + +The field-strength tower is central; the Higgs towers are bosonic and commute with +everything; the fermion towers anticommute with one another. These are exactly the +commutation obligations of `IsCovStandardModel` and of its three sector structures. + +-/ + +include h in +/-- The field-strength tower commutes with every matter covariant tower whose bare family commutes + with the gauge-field symbols. -/ +lemma commute_covF_covDerivIter {V : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (hAF : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (t : Multiset (Fin 1 ⊕ Fin 3)) + (χ : Module.Dual ℂ V), Commute (A p μ ψ) (F t χ)) + {k : ℕ} (l : Fin k → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (n : ℕ) (l' : Fin n → (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + Commute (h.covF l μ ν ψ) (IsGaugeField.covDerivIter A act F n l' s φ) := by + refine IsGaugeField.commute_of_mem_adjoin ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν ψ) + rintro x ⟨p, ρ, ψ', rfl⟩ + exact (commute_covDerivIter act F (fun p' μ' ψ'' => h.A_comm_A p' p μ' ρ ψ'' ψ') + (fun t χ => (hAF p ρ ψ' t χ).symm) n l' s φ).symm + +include h in +/-- Two field-strength towers commute: both are polynomials in the gauge-field symbols, and the + gauge field is bosonic. -/ +lemma covF_comm_covF {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra) : + Commute (h.covF l μ ν ψ) (h.covF l' μ' ν' ψ') := by + refine IsGaugeField.commute_of_mem_adjoin ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν ψ) + rintro x ⟨p, ρ, ψ₁, rfl⟩ + refine (IsGaugeField.commute_of_mem_adjoin ?_ + (h.covF_mem_adjoin_gaugeSymbols l' μ' ν' ψ')).symm + rintro y ⟨q, σ, ψ₂, rfl⟩ + exact h.A_comm_A q p σ ρ ψ₂ ψ₁ + +include h in +/-- The field-strength tower commutes with the Higgs tower. -/ +lemma covF_comm_covH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : + Commute (h.covF l μ ν ψ) (h.covDerivH l' φ) := + h.commute_covF_covDerivIter HiggsVec.gaugeAlgebraAction H h.A_comm_H l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the conjugate Higgs tower. -/ +lemma covF_comm_covBarH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + Commute (h.covF l μ ν ψ) (h.covDerivBarH l' φ) := + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + h.A_comm_barH l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the down-type quark tower. -/ +lemma covF_comm_covD {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : + Commute (h.covF l μ ν ψ) (h.covDerivD i l' φ) := + h.commute_covF_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the conjugate down-type quark tower. -/ +lemma covF_comm_covBarD {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + Commute (h.covF l μ ν ψ) (h.covDerivBarD i l' φ) := + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the up-type quark tower. -/ +lemma covF_comm_covU {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : + Commute (h.covF l μ ν ψ) (h.covDerivU i l' φ) := + h.commute_covF_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the conjugate up-type quark tower. -/ +lemma covF_comm_covBarU {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + Commute (h.covF l μ ν ψ) (h.covDerivBarU i l' φ) := + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the quark doublet tower. -/ +lemma covF_comm_covQ {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : + Commute (h.covF l μ ν ψ) (h.covDerivQ i l' φ) := + h.commute_covF_covDerivIter QuarkDoublet.gaugeAlgebraAction (Q i) + (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the conjugate quark doublet tower. -/ +lemma covF_comm_covBarQ {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + Commute (h.covF l μ ν ψ) (h.covDerivBarQ i l' φ) := + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the lepton doublet tower. -/ +lemma covF_comm_covL {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : + Commute (h.covF l μ ν ψ) (h.covDerivL i l' φ) := + h.commute_covF_covDerivIter LeptonDoublet.gaugeAlgebraAction (L i) + (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the conjugate lepton doublet tower. -/ +lemma covF_comm_covBarL {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + Commute (h.covF l μ ν ψ) (h.covDerivBarL i l' φ) := + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) + (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the lepton singlet tower. -/ +lemma covF_comm_covE {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : + Commute (h.covF l μ ν ψ) (h.covDerivE i l' φ) := + h.commute_covF_covDerivIter LeptonSinglet.gaugeAlgebraAction (e i) + (fun p μ ψ t χ => h.A_comm_e p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- The field-strength tower commutes with the conjugate lepton singlet tower. -/ +lemma covF_comm_covBarE {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (i : Fin 3) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + Commute (h.covF l μ ν ψ) (h.covDerivBarE i l' φ) := + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) + (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) l μ ν ψ m l' 0 φ + +include h in +/-- Two Higgs towers commute. -/ +lemma covH_comm_covH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ HiggsVec) : + Commute (h.covDerivH l φ) (h.covDerivH l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H HiggsVec.gaugeAlgebraAction H + h.A_comm_A h.A_comm_H h.A_comm_H (fun t χ t' χ' => h.H_comm_H t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the conjugate Higgs tower. -/ +lemma covH_comm_covBarH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule HiggsVec)) : + Commute (h.covDerivH l φ) (h.covDerivBarH l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH h.A_comm_A h.A_comm_H h.A_comm_barH + (fun t χ t' χ' => h.H_comm_barH t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two conjugate Higgs towers commute. -/ +lemma covBarH_comm_covBarH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule HiggsVec)) : + Commute (h.covDerivBarH l φ) (h.covDerivBarH l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH h.A_comm_A h.A_comm_barH + h.A_comm_barH (fun t χ t' χ' => h.barH_comm_barH t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the down-type quark tower. -/ +lemma covH_comm_covD {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ DownSinglet) : + Commute (h.covDerivH l φ) (h.covDerivD i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H DownSinglet.gaugeAlgebraAction + (d i) h.A_comm_A h.A_comm_H (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) + (fun t χ t' χ' => h.H_comm_d t χ i t' χ') n l 0 φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the conjugate down-type quark tower. -/ +lemma covH_comm_covBarD {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : + Commute (h.covDerivH l φ) (h.covDerivBarD i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) h.A_comm_A h.A_comm_H + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun t χ t' χ' => h.H_comm_bard t χ i t' χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the up-type quark tower. -/ +lemma covH_comm_covU {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ UpSinglet) : + Commute (h.covDerivH l φ) (h.covDerivU i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H UpSinglet.gaugeAlgebraAction (u i) + h.A_comm_A h.A_comm_H (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) + (fun t χ t' χ' => h.H_comm_u t χ i t' χ') n l 0 φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the conjugate up-type quark tower. -/ +lemma covH_comm_covBarU {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : + Commute (h.covDerivH l φ) (h.covDerivBarU i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) h.A_comm_A h.A_comm_H + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun t χ t' χ' => h.H_comm_baru t χ i t' χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the quark doublet tower. -/ +lemma covH_comm_covQ {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ QuarkDoublet) : + Commute (h.covDerivH l φ) (h.covDerivQ i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H QuarkDoublet.gaugeAlgebraAction + (Q i) h.A_comm_A h.A_comm_H (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) + (fun t χ t' χ' => h.H_comm_Q t χ i t' χ') n l 0 φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the conjugate quark doublet tower. -/ +lemma covH_comm_covBarQ {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + Commute (h.covDerivH l φ) (h.covDerivBarQ i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) h.A_comm_A h.A_comm_H + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) (fun t χ t' χ' => h.H_comm_barQ t χ i t' χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the lepton doublet tower. -/ +lemma covH_comm_covL {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ LeptonDoublet) : + Commute (h.covDerivH l φ) (h.covDerivL i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H LeptonDoublet.gaugeAlgebraAction + (L i) h.A_comm_A h.A_comm_H (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) + (fun t χ t' χ' => h.H_comm_L t χ i t' χ') n l 0 φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the conjugate lepton doublet tower. -/ +lemma covH_comm_covBarL {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + Commute (h.covDerivH l φ) (h.covDerivBarL i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) h.A_comm_A h.A_comm_H + (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) (fun t χ t' χ' => h.H_comm_barL t χ i t' χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the lepton singlet tower. -/ +lemma covH_comm_covE {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ LeptonSinglet) : + Commute (h.covDerivH l φ) (h.covDerivE i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H LeptonSinglet.gaugeAlgebraAction + (e i) h.A_comm_A h.A_comm_H (fun p μ ψ t χ => h.A_comm_e p μ ψ i t χ) + (fun t χ t' χ' => h.H_comm_e t χ i t' χ') n l 0 φ m l' 0 φ' + +include h in +/-- The Higgs tower commutes with the conjugate lepton singlet tower. -/ +lemma covH_comm_covBarE {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + Commute (h.covDerivH l φ) (h.covDerivBarE i l' φ') := + commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction H + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) h.A_comm_A h.A_comm_H + (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) (fun t χ t' χ' => h.H_comm_bare t χ i t' χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the down-type quark tower. -/ +lemma covBarH_comm_covD {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ DownSinglet) : + Commute (h.covDerivBarH l φ) (h.covDerivD i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + DownSinglet.gaugeAlgebraAction (d i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_d t χ i t' χ') n l 0 φ m + l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the conjugate down-type quark tower. -/ +lemma covBarH_comm_covBarD {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : + Commute (h.covDerivBarH l φ) (h.covDerivBarD i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_bard t χ i t' χ') n l + 0 φ m l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the up-type quark tower. -/ +lemma covBarH_comm_covU {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ UpSinglet) : + Commute (h.covDerivBarH l φ) (h.covDerivU i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + UpSinglet.gaugeAlgebraAction (u i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_u t χ i t' χ') n l 0 φ m + l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the conjugate up-type quark tower. -/ +lemma covBarH_comm_covBarU {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : + Commute (h.covDerivBarH l φ) (h.covDerivBarU i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_baru t χ i t' χ') n l + 0 φ m l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the quark doublet tower. -/ +lemma covBarH_comm_covQ {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ QuarkDoublet) : + Commute (h.covDerivBarH l φ) (h.covDerivQ i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + QuarkDoublet.gaugeAlgebraAction (Q i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_Q t χ i t' χ') n l 0 φ m + l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the conjugate quark doublet tower. -/ +lemma covBarH_comm_covBarQ {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + Commute (h.covDerivBarH l φ) (h.covDerivBarQ i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_barQ t χ i t' χ') n l + 0 φ m l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the lepton doublet tower. -/ +lemma covBarH_comm_covL {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ LeptonDoublet) : + Commute (h.covDerivBarH l φ) (h.covDerivL i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + LeptonDoublet.gaugeAlgebraAction (L i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_L t χ i t' χ') n l 0 φ m + l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the conjugate lepton doublet tower. -/ +lemma covBarH_comm_covBarL {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + Commute (h.covDerivBarH l φ) (h.covDerivBarL i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_barL t χ i t' χ') n l + 0 φ m l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the lepton singlet tower. -/ +lemma covBarH_comm_covE {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ LeptonSinglet) : + Commute (h.covDerivBarH l φ) (h.covDerivE i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + LeptonSinglet.gaugeAlgebraAction (e i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_e p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_e t χ i t' χ') n l 0 φ m + l' 0 φ' + +include h in +/-- The conjugate Higgs tower commutes with the conjugate lepton singlet tower. -/ +lemma covBarH_comm_covBarE {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + Commute (h.covDerivBarH l φ) (h.covDerivBarE i l' φ') := + commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) barH + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) h.A_comm_A h.A_comm_barH + (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) (fun t χ t' χ' => h.barH_comm_bare t χ i t' χ') n l + 0 φ m l' 0 φ' + +include h in +/-- Two down-type quark towers anticommute. -/ +lemma covD_anticomm_covD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ DownSinglet) : + h.covDerivD i l φ * h.covDerivD j l' φ' = + -(h.covDerivD j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + DownSinglet.gaugeAlgebraAction (d j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_d p μ ψ j t χ) (fun t χ t' χ' => h.d_anticomm_d i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the conjugate down-type quark tower. -/ +lemma covD_anticomm_covBarD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : + h.covDerivD i l φ * h.covDerivBarD j l' φ' = + -(h.covDerivBarD j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bard p μ ψ j t χ) + (fun t χ t' χ' => h.d_anticomm_bard i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the up-type quark tower. -/ +lemma covD_anticomm_covU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ UpSinglet) : + h.covDerivD i l φ * h.covDerivU j l' φ' = + -(h.covDerivU j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + UpSinglet.gaugeAlgebraAction (u j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_u p μ ψ j t χ) (fun t χ t' χ' => h.d_anticomm_u i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the conjugate up-type quark tower. -/ +lemma covD_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : + h.covDerivD i l φ * h.covDerivBarU j l' φ' = + -(h.covDerivBarU j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_baru p μ ψ j t χ) + (fun t χ t' χ' => h.d_anticomm_baru i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the quark doublet tower. -/ +lemma covD_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivD i l φ * h.covDerivQ j l' φ' = + -(h.covDerivQ j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + QuarkDoublet.gaugeAlgebraAction (Q j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_Q p μ ψ j t χ) (fun t χ t' χ' => h.d_anticomm_Q i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the conjugate quark doublet tower. -/ +lemma covD_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + h.covDerivD i l φ * h.covDerivBarQ j l' φ' = + -(h.covDerivBarQ j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ j t χ) + (fun t χ t' χ' => h.d_anticomm_barQ i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the lepton doublet tower. -/ +lemma covD_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivD i l φ * h.covDerivL j l' φ' = + -(h.covDerivL j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + LeptonDoublet.gaugeAlgebraAction (L j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_L p μ ψ j t χ) (fun t χ t' χ' => h.d_anticomm_L i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the conjugate lepton doublet tower. -/ +lemma covD_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivD i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.d_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the lepton singlet tower. -/ +lemma covD_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivD i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) (fun t χ t' χ' => h.d_anticomm_e i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The down-type quark tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covD_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivD i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivD i l φ) := + anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (d i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.d_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two conjugate down-type quark towers anticommute. -/ +lemma covBarD_anticomm_covBarD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : + h.covDerivBarD i l φ * h.covDerivBarD j l' φ' = + -(h.covDerivBarD j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bard p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_bard i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the up-type quark tower. -/ +lemma covBarD_anticomm_covU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ UpSinglet) : + h.covDerivBarD i l φ * h.covDerivU j l' φ' = + -(h.covDerivU j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) UpSinglet.gaugeAlgebraAction (u j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_u p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_u i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the conjugate up-type quark tower. -/ +lemma covBarD_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : + h.covDerivBarD i l φ * h.covDerivBarU j l' φ' = + -(h.covDerivBarU j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_baru p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_baru i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the quark doublet tower. -/ +lemma covBarD_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivBarD i l φ * h.covDerivQ j l' φ' = + -(h.covDerivQ j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) QuarkDoublet.gaugeAlgebraAction (Q j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_Q p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_Q i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the conjugate quark doublet tower. -/ +lemma covBarD_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + h.covDerivBarD i l φ * h.covDerivBarQ j l' φ' = + -(h.covDerivBarQ j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_barQ i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the lepton doublet tower. -/ +lemma covBarD_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivBarD i l φ * h.covDerivL j l' φ' = + -(h.covDerivL j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) LeptonDoublet.gaugeAlgebraAction (L j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_L p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_L i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the conjugate lepton doublet tower. -/ +lemma covBarD_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivBarD i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the lepton singlet tower. -/ +lemma covBarD_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivBarD i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_e i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate down-type quark tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covBarD_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivBarD i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivBarD i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (bard i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.bard_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two up-type quark towers anticommute. -/ +lemma covU_anticomm_covU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ UpSinglet) : + h.covDerivU i l φ * h.covDerivU j l' φ' = + -(h.covDerivU j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + UpSinglet.gaugeAlgebraAction (u j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_u p μ ψ j t χ) (fun t χ t' χ' => h.u_anticomm_u i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The up-type quark tower anticommutes with the conjugate up-type quark tower. -/ +lemma covU_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : + h.covDerivU i l φ * h.covDerivBarU j l' φ' = + -(h.covDerivBarU j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_baru p μ ψ j t χ) + (fun t χ t' χ' => h.u_anticomm_baru i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The up-type quark tower anticommutes with the quark doublet tower. -/ +lemma covU_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivU i l φ * h.covDerivQ j l' φ' = + -(h.covDerivQ j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + QuarkDoublet.gaugeAlgebraAction (Q j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_Q p μ ψ j t χ) (fun t χ t' χ' => h.u_anticomm_Q i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The up-type quark tower anticommutes with the conjugate quark doublet tower. -/ +lemma covU_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + h.covDerivU i l φ * h.covDerivBarQ j l' φ' = + -(h.covDerivBarQ j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ j t χ) + (fun t χ t' χ' => h.u_anticomm_barQ i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The up-type quark tower anticommutes with the lepton doublet tower. -/ +lemma covU_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivU i l φ * h.covDerivL j l' φ' = + -(h.covDerivL j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + LeptonDoublet.gaugeAlgebraAction (L j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_L p μ ψ j t χ) (fun t χ t' χ' => h.u_anticomm_L i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The up-type quark tower anticommutes with the conjugate lepton doublet tower. -/ +lemma covU_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivU i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.u_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The up-type quark tower anticommutes with the lepton singlet tower. -/ +lemma covU_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivU i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) (fun t χ t' χ' => h.u_anticomm_e i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The up-type quark tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covU_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivU i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivU i l φ) := + anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (u i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.u_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two conjugate up-type quark towers anticommute. -/ +lemma covBarU_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : + h.covDerivBarU i l φ * h.covDerivBarU j l' φ' = + -(h.covDerivBarU j l' φ' * h.covDerivBarU i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_baru p μ ψ j t χ) + (fun t χ t' χ' => h.baru_anticomm_baru i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate up-type quark tower anticommutes with the quark doublet tower. -/ +lemma covBarU_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivBarU i l φ * h.covDerivQ j l' φ' = + -(h.covDerivQ j l' φ' * h.covDerivBarU i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) QuarkDoublet.gaugeAlgebraAction (Q j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_Q p μ ψ j t χ) + (fun t χ t' χ' => h.baru_anticomm_Q i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate up-type quark tower anticommutes with the conjugate quark doublet tower. -/ +lemma covBarU_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + h.covDerivBarU i l φ * h.covDerivBarQ j l' φ' = + -(h.covDerivBarQ j l' φ' * h.covDerivBarU i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ j t χ) + (fun t χ t' χ' => h.baru_anticomm_barQ i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate up-type quark tower anticommutes with the lepton doublet tower. -/ +lemma covBarU_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivBarU i l φ * h.covDerivL j l' φ' = + -(h.covDerivL j l' φ' * h.covDerivBarU i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) LeptonDoublet.gaugeAlgebraAction (L j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_L p μ ψ j t χ) + (fun t χ t' χ' => h.baru_anticomm_L i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate up-type quark tower anticommutes with the conjugate lepton doublet tower. -/ +lemma covBarU_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivBarU i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivBarU i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.baru_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate up-type quark tower anticommutes with the lepton singlet tower. -/ +lemma covBarU_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivBarU i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivBarU i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) + (fun t χ t' χ' => h.baru_anticomm_e i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate up-type quark tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covBarU_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivBarU i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivBarU i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (baru i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.baru_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two quark doublet towers anticommute. -/ +lemma covQ_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivQ i l φ * h.covDerivQ j l' φ' = + -(h.covDerivQ j l' φ' * h.covDerivQ i l φ) := + anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (Q i) + QuarkDoublet.gaugeAlgebraAction (Q j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_Q p μ ψ j t χ) (fun t χ t' χ' => h.Q_anticomm_Q i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The quark doublet tower anticommutes with the conjugate quark doublet tower. -/ +lemma covQ_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + h.covDerivQ i l φ * h.covDerivBarQ j l' φ' = + -(h.covDerivBarQ j l' φ' * h.covDerivQ i l φ) := + anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (Q i) + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ j t χ) + (fun t χ t' χ' => h.Q_anticomm_barQ i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The quark doublet tower anticommutes with the lepton doublet tower. -/ +lemma covQ_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivQ i l φ * h.covDerivL j l' φ' = + -(h.covDerivL j l' φ' * h.covDerivQ i l φ) := + anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (Q i) + LeptonDoublet.gaugeAlgebraAction (L j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_L p μ ψ j t χ) (fun t χ t' χ' => h.Q_anticomm_L i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The quark doublet tower anticommutes with the conjugate lepton doublet tower. -/ +lemma covQ_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivQ i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivQ i l φ) := + anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (Q i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.Q_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The quark doublet tower anticommutes with the lepton singlet tower. -/ +lemma covQ_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivQ i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivQ i l φ) := + anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (Q i) + LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) (fun t χ t' χ' => h.Q_anticomm_e i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The quark doublet tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covQ_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivQ i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivQ i l φ) := + anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (Q i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.Q_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two conjugate quark doublet towers anticommute. -/ +lemma covBarQ_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : + h.covDerivBarQ i l φ * h.covDerivBarQ j l' φ' = + -(h.covDerivBarQ j l' φ' * h.covDerivBarQ i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (barQ i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ j t χ) + (fun t χ t' χ' => h.barQ_anticomm_barQ i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate quark doublet tower anticommutes with the lepton doublet tower. -/ +lemma covBarQ_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivBarQ i l φ * h.covDerivL j l' φ' = + -(h.covDerivL j l' φ' * h.covDerivBarQ i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (barQ i) LeptonDoublet.gaugeAlgebraAction (L j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_L p μ ψ j t χ) + (fun t χ t' χ' => h.barQ_anticomm_L i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate quark doublet tower anticommutes with the conjugate lepton doublet tower. -/ +lemma covBarQ_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivBarQ i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivBarQ i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (barQ i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.barQ_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate quark doublet tower anticommutes with the lepton singlet tower. -/ +lemma covBarQ_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivBarQ i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivBarQ i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (barQ i) LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) + (fun t χ t' χ' => h.barQ_anticomm_e i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate quark doublet tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covBarQ_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivBarQ i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivBarQ i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (barQ i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.barQ_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two lepton doublet towers anticommute. -/ +lemma covL_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivL i l φ * h.covDerivL j l' φ' = + -(h.covDerivL j l' φ' * h.covDerivL i l φ) := + anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (L i) + LeptonDoublet.gaugeAlgebraAction (L j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_L p μ ψ j t χ) (fun t χ t' χ' => h.L_anticomm_L i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The lepton doublet tower anticommutes with the conjugate lepton doublet tower. -/ +lemma covL_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivL i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivL i l φ) := + anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (L i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.L_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The lepton doublet tower anticommutes with the lepton singlet tower. -/ +lemma covL_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivL i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivL i l φ) := + anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (L i) + LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) (fun t χ t' χ' => h.L_anticomm_e i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The lepton doublet tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covL_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivL i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivL i l φ) := + anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (L i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.L_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two conjugate lepton doublet towers anticommute. -/ +lemma covBarL_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : + h.covDerivBarL i l φ * h.covDerivBarL j l' φ' = + -(h.covDerivBarL j l' φ' * h.covDerivBarL i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (barL i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_barL p μ ψ j t χ) + (fun t χ t' χ' => h.barL_anticomm_barL i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate lepton doublet tower anticommutes with the lepton singlet tower. -/ +lemma covBarL_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivBarL i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivBarL i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (barL i) LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) + (fun t χ t' χ' => h.barL_anticomm_e i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- The conjugate lepton doublet tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covBarL_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivBarL i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivBarL i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (barL i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.barL_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two lepton singlet towers anticommute. -/ +lemma covE_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonSinglet) + (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivE i l φ * h.covDerivE j l' φ' = + -(h.covDerivE j l' φ' * h.covDerivE i l φ) := + anticommute_covDerivIter_covDerivIter LeptonSinglet.gaugeAlgebraAction (e i) + LeptonSinglet.gaugeAlgebraAction (e j) h.A_comm_A (fun p μ ψ t χ => h.A_comm_e p μ ψ i t χ) + (fun p μ ψ t χ => h.A_comm_e p μ ψ j t χ) (fun t χ t' χ' => h.e_anticomm_e i j t t' χ χ') n l 0 + φ m l' 0 φ' + +include h in +/-- The lepton singlet tower anticommutes with the conjugate lepton singlet tower. -/ +lemma covE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivE i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivE i l φ) := + anticommute_covDerivIter_covDerivIter LeptonSinglet.gaugeAlgebraAction (e i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_e p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.e_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + +include h in +/-- Two conjugate lepton singlet towers anticommute. -/ +lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : + h.covDerivBarE i l φ * h.covDerivBarE j l' φ' = + -(h.covDerivBarE j l' φ' * h.covDerivBarE i l φ) := + anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (bare i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare j) h.A_comm_A + (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) (fun p μ ψ t χ => h.A_comm_bare p μ ψ j t χ) + (fun t χ t' χ' => h.bare_anticomm_bare i j t t' χ χ') n l 0 φ m l' 0 φ' + + +/-! + +## K. The covariant form of the theory + +Everything above assembles into an `IsCovStandardModel` for the covariant towers, +acted on by the global gauge group and the Lorentz group — except for the Lorentz +transformation laws of the towers themselves, which are taken here as explicit +hypotheses. They are *not* new assumptions about the model: they are theorems about +`IsGaugeField.covDerivIter` and `IsGaugeField.iteratedCovDerivAdjoint` which follow +from the Lorentz laws that `IsStandardModel` already records for the bare symbols, and +which remain to be proved. See the `TODO` at the end of [`Basic.lean`](Basic.lean) for +what that proof needs. + +-/ + +include h in +/-- The covariant form of the Standard Model, modulo the Lorentz transformation laws + of the covariant towers. Every gauge-equivariance, mass-weight and commutation + obligation of `IsCovStandardModel` is discharged from `IsStandardModel`; the + thirteen `hLorentz` arguments are the Lorentz laws of the towers, which follow from + the bare Lorentz laws recorded by `IsStandardModel` but are not yet proved, and are + therefore passed in. -/ +theorem isCovStandardModel_of_lorentzCovDeriv + (hLorentzF : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (h.covF l μ ν φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • h.covF p a b φ) + (hLorentzH : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {_n} l => h.covDerivH l)) + (hLorentzBarH : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj (fun {_n} l => h.covDerivBarH l)) + (hLorentzD : ∀ i, IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup + (fun {_n} l => h.covDerivD i l)) + (hLorentzBarD : ∀ i, IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarD i l)) + (hLorentzU : ∀ i, IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup + (fun {_n} l => h.covDerivU i l)) + (hLorentzBarU : ∀ i, IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarU i l)) + (hLorentzQ : ∀ i, IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup + (fun {_n} l => h.covDerivQ i l)) + (hLorentzBarQ : ∀ i, IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarQ i l)) + (hLorentzL : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup + (fun {_n} l => h.covDerivL i l)) + (hLorentzBarL : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarL i l)) + (hLorentzE : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup + (fun {_n} l => h.covDerivE i l)) + (hLorentzBarE : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarE i l)) : + IsCovStandardModel B (repGlobal repJet) h.repGlobal_mul repLorentz h.repLorentz_mul + massWeightPoly (fun {_n} l => h.covDerivH l) (fun {_n} l => h.covDerivBarH l) + (fun {_n} l μ ν => h.covF l μ ν) + (fun {_n} i l => h.covDerivD i l) (fun {_n} i l => h.covDerivBarD i l) + (fun {_n} i l => h.covDerivU i l) (fun {_n} i l => h.covDerivBarU i l) + (fun {_n} i l => h.covDerivQ i l) (fun {_n} i l => h.covDerivBarQ i l) + (fun {_n} i l => h.covDerivL i l) (fun {_n} i l => h.covDerivBarL i l) + (fun {_n} i l => h.covDerivE i l) (fun {_n} i l => h.covDerivBarE i l) where + isHiggsSector := + { H_equivariant := fun g φ _n l => h.repGlobal_covDerivH g l φ + barH_equivariant := fun g φ _n l => h.repGlobal_covDerivBarH g l φ + H_comm_H := fun φ ψ _n₁ _n₂ l₁ l₂ => h.covH_comm_covH l₁ l₂ φ ψ + H_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => h.covH_comm_covBarH l₁ l₂ φ ψ + barH_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => h.covBarH_comm_covBarH l₁ l₂ φ ψ + H_massWeight := fun φ _n l => h.massWeight_covDerivH l φ + barH_massWeight := fun φ _n l => h.massWeight_covDerivBarH l φ + repLorentz_H := hLorentzH + repLorentz_barH := hLorentzBarH } + isGaugeSector := + { repGauge_F := fun g {_n} l μ ν φ => h.repGlobal_covF g l μ ν φ + repLorentz_F := hLorentzF + massWeight_F := fun {_n} l μ ν φ => h.massWeight_covF l μ ν φ + F_comm_F := fun {_n _m} l μ ν ψ l' μ' ν' ψ' => + h.covF_comm_covF l l' μ ν μ' ν' ψ ψ' } + isFermionSector := + { repGauge_d := fun g i {_n} l φ => h.repGlobal_covDerivD g i l φ + repGauge_bard := fun g i {_n} l φ => h.repGlobal_covDerivBarD g i l φ + repGauge_u := fun g i {_n} l φ => h.repGlobal_covDerivU g i l φ + repGauge_baru := fun g i {_n} l φ => h.repGlobal_covDerivBarU g i l φ + repGauge_Q := fun g i {_n} l φ => h.repGlobal_covDerivQ g i l φ + repGauge_barQ := fun g i {_n} l φ => h.repGlobal_covDerivBarQ g i l φ + repGauge_L := fun g i {_n} l φ => h.repGlobal_covDerivL g i l φ + repGauge_barL := fun g i {_n} l φ => h.repGlobal_covDerivBarL g i l φ + repGauge_e := fun g i {_n} l φ => h.repGlobal_covDerivE g i l φ + repGauge_bare := fun g i {_n} l φ => h.repGlobal_covDerivBarE g i l φ + repLorentz_d := hLorentzD + repLorentz_bard := hLorentzBarD + repLorentz_u := hLorentzU + repLorentz_baru := hLorentzBarU + repLorentz_Q := hLorentzQ + repLorentz_barQ := hLorentzBarQ + repLorentz_L := hLorentzL + repLorentz_barL := hLorentzBarL + repLorentz_e := hLorentzE + repLorentz_bare := hLorentzBarE + massWeight_d := fun i {_n} l φ => h.massWeight_covDerivD i l φ + massWeight_bard := fun i {_n} l φ => h.massWeight_covDerivBarD i l φ + massWeight_u := fun i {_n} l φ => h.massWeight_covDerivU i l φ + massWeight_baru := fun i {_n} l φ => h.massWeight_covDerivBarU i l φ + massWeight_Q := fun i {_n} l φ => h.massWeight_covDerivQ i l φ + massWeight_barQ := fun i {_n} l φ => h.massWeight_covDerivBarQ i l φ + massWeight_L := fun i {_n} l φ => h.massWeight_covDerivL i l φ + massWeight_barL := fun i {_n} l φ => h.massWeight_covDerivBarL i l φ + massWeight_e := fun i {_n} l φ => h.massWeight_covDerivE i l φ + massWeight_bare := fun i {_n} l φ => h.massWeight_covDerivBarE i l φ + d_anticomm_d := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covD i j l l' φ φ' + d_anticomm_bard := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covBarD i j l l' φ φ' + d_anticomm_u := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covU i j l l' φ φ' + d_anticomm_baru := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covBarU i j l l' φ φ' + d_anticomm_Q := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covQ i j l l' φ φ' + d_anticomm_barQ := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covBarQ i j l l' φ φ' + d_anticomm_L := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covL i j l l' φ φ' + d_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covBarL i j l l' φ φ' + d_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covE i j l l' φ φ' + d_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covD_anticomm_covBarE i j l l' φ φ' + bard_anticomm_bard := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covBarD i j l l' φ φ' + bard_anticomm_u := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covU i j l l' φ φ' + bard_anticomm_baru := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covBarU i j l l' φ φ' + bard_anticomm_Q := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covQ i j l l' φ φ' + bard_anticomm_barQ := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covBarQ i j l l' φ φ' + bard_anticomm_L := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covL i j l l' φ φ' + bard_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covBarL i j l l' φ φ' + bard_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covE i j l l' φ φ' + bard_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covBarD_anticomm_covBarE i j l l' φ φ' + u_anticomm_u := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covU i j l l' φ φ' + u_anticomm_baru := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covBarU i j l l' φ φ' + u_anticomm_Q := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covQ i j l l' φ φ' + u_anticomm_barQ := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covBarQ i j l l' φ φ' + u_anticomm_L := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covL i j l l' φ φ' + u_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covBarL i j l l' φ φ' + u_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covE i j l l' φ φ' + u_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covU_anticomm_covBarE i j l l' φ φ' + baru_anticomm_baru := fun i j {_n _m} l l' φ φ' => h.covBarU_anticomm_covBarU i j l l' φ φ' + baru_anticomm_Q := fun i j {_n _m} l l' φ φ' => h.covBarU_anticomm_covQ i j l l' φ φ' + baru_anticomm_barQ := fun i j {_n _m} l l' φ φ' => h.covBarU_anticomm_covBarQ i j l l' φ φ' + baru_anticomm_L := fun i j {_n _m} l l' φ φ' => h.covBarU_anticomm_covL i j l l' φ φ' + baru_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covBarU_anticomm_covBarL i j l l' φ φ' + baru_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covBarU_anticomm_covE i j l l' φ φ' + baru_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covBarU_anticomm_covBarE i j l l' φ φ' + Q_anticomm_Q := fun i j {_n _m} l l' φ φ' => h.covQ_anticomm_covQ i j l l' φ φ' + Q_anticomm_barQ := fun i j {_n _m} l l' φ φ' => h.covQ_anticomm_covBarQ i j l l' φ φ' + Q_anticomm_L := fun i j {_n _m} l l' φ φ' => h.covQ_anticomm_covL i j l l' φ φ' + Q_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covQ_anticomm_covBarL i j l l' φ φ' + Q_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covQ_anticomm_covE i j l l' φ φ' + Q_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covQ_anticomm_covBarE i j l l' φ φ' + barQ_anticomm_barQ := fun i j {_n _m} l l' φ φ' => h.covBarQ_anticomm_covBarQ i j l l' φ φ' + barQ_anticomm_L := fun i j {_n _m} l l' φ φ' => h.covBarQ_anticomm_covL i j l l' φ φ' + barQ_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covBarQ_anticomm_covBarL i j l l' φ φ' + barQ_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covBarQ_anticomm_covE i j l l' φ φ' + barQ_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covBarQ_anticomm_covBarE i j l l' φ φ' + L_anticomm_L := fun i j {_n _m} l l' φ φ' => h.covL_anticomm_covL i j l l' φ φ' + L_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covL_anticomm_covBarL i j l l' φ φ' + L_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covL_anticomm_covE i j l l' φ φ' + L_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covL_anticomm_covBarE i j l l' φ φ' + barL_anticomm_barL := fun i j {_n _m} l l' φ φ' => h.covBarL_anticomm_covBarL i j l l' φ φ' + barL_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covBarL_anticomm_covE i j l l' φ φ' + barL_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covBarL_anticomm_covBarE i j l l' φ φ' + e_anticomm_e := fun i j {_n _m} l l' φ φ' => h.covE_anticomm_covE i j l l' φ φ' + e_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covE_anticomm_covBarE i j l l' φ φ' + bare_anticomm_bare := fun i j {_n _m} l l' φ φ' => h.covBarE_anticomm_covBarE i j l l' φ φ' } + F_comm_H := fun {_n _m} l μ ν ψ l' φ => h.covF_comm_covH l μ ν ψ l' φ + F_comm_barH := fun {_n _m} l μ ν ψ l' φ => h.covF_comm_covBarH l μ ν ψ l' φ + F_comm_d := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covD l μ ν ψ i l' φ + F_comm_bard := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covBarD l μ ν ψ i l' φ + F_comm_u := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covU l μ ν ψ i l' φ + F_comm_baru := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covBarU l μ ν ψ i l' φ + F_comm_Q := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covQ l μ ν ψ i l' φ + F_comm_barQ := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covBarQ l μ ν ψ i l' φ + F_comm_L := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covL l μ ν ψ i l' φ + F_comm_barL := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covBarL l μ ν ψ i l' φ + F_comm_e := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covE l μ ν ψ i l' φ + F_comm_bare := fun {_n _m} l μ ν ψ i l' φ => h.covF_comm_covBarE l μ ν ψ i l' φ + H_comm_d := fun {_n _m} l φ i l' φ' => h.covH_comm_covD i l l' φ φ' + H_comm_bard := fun {_n _m} l φ i l' φ' => h.covH_comm_covBarD i l l' φ φ' + H_comm_u := fun {_n _m} l φ i l' φ' => h.covH_comm_covU i l l' φ φ' + H_comm_baru := fun {_n _m} l φ i l' φ' => h.covH_comm_covBarU i l l' φ φ' + H_comm_Q := fun {_n _m} l φ i l' φ' => h.covH_comm_covQ i l l' φ φ' + H_comm_barQ := fun {_n _m} l φ i l' φ' => h.covH_comm_covBarQ i l l' φ φ' + H_comm_L := fun {_n _m} l φ i l' φ' => h.covH_comm_covL i l l' φ φ' + H_comm_barL := fun {_n _m} l φ i l' φ' => h.covH_comm_covBarL i l l' φ φ' + H_comm_e := fun {_n _m} l φ i l' φ' => h.covH_comm_covE i l l' φ φ' + H_comm_bare := fun {_n _m} l φ i l' φ' => h.covH_comm_covBarE i l l' φ φ' + barH_comm_d := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covD i l l' φ φ' + barH_comm_bard := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covBarD i l l' φ φ' + barH_comm_u := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covU i l l' φ φ' + barH_comm_baru := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covBarU i l l' φ φ' + barH_comm_Q := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covQ i l l' φ φ' + barH_comm_barQ := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covBarQ i l l' φ φ' + barH_comm_L := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covL i l l' φ φ' + barH_comm_barL := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covBarL i l l' φ φ' + barH_comm_e := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covE i l l' φ φ' + barH_comm_bare := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covBarE i l l' φ φ' + +TODO (lines := 2313-2336) "These should be proved results." + +end IsStandardModel + +end StandardModel diff --git a/scripts/todos.py b/scripts/todos.py index b6e5522f6..f2efb3069 100644 --- a/scripts/todos.py +++ b/scripts/todos.py @@ -164,7 +164,15 @@ def parse_file(path, text): def list_files_worktree(repo, root): - paths = git(repo, "ls-files", "--", root).splitlines() + """Tracked files, plus new ones not yet added to the index. + + A file that has just been written is exactly where a fresh TODO is most likely to + be, and `git ls-files` alone lists only what is tracked, so a note in a new file + would be reported by no run of this script until someone remembered to `git add` it. + """ + tracked = git(repo, "ls-files", "--", root).splitlines() + new = git(repo, "ls-files", "--others", "--exclude-standard", "--", root).splitlines() + paths = sorted(set(tracked) | set(new)) return [p for p in paths if p.endswith(".lean") and not EXCLUDE.search(p)] From b3afd51600150774845dcb202685a724e670da60 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Fri, 28 Aug 2026 10:30:10 -0400 Subject: [PATCH 246/254] feat: Add ClassicalFieldTheory generic jet-algebra and gauge-theory layer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds Physlib/ClassicalFieldTheory, a self-contained generalisation of the jet-algebra machinery of the Standard Model to an arbitrary gauge group: - JetAlgebra/: jets, jet component spaces, and the `IsFieldAlgebra` typeclass unifying bosonic (symmetric) and fermionic (exterior) field algebras, with jet derivatives, Lorentz, gauge and mass-weight actions. - GaugeTheory/GaugeJet: the `GaugeJet` class of jets of a gauge group (evaluation, constants, derivative, adjoint, Maurer–Cartan form), with the Taylor–Leibniz and truncation extensions. - GaugeTheory/GaugeBoson, GaugeField, Matter: gauge bosons valued in a Lie algebra, the `IsGaugeField` transformation law, covariant derivatives, and `MatterField` bundling the data of a matter field. Supporting lemmas in Mathematics/MultisetAntidiagonal and the multiset basis of DerivAlgebraReal. Two duplicate root-namespace declarations in the old Standard Model files are dropped in favour of the generic ones. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017JtScjMeuHHQSbNfQxqhpx --- Physlib.lean | 96 +- .../GaugeTheory/GaugeBoson/Basic.lean | 271 ++++ .../GaugeTheory/GaugeBoson/GaugeAction.lean | 603 +++++++++ .../GaugeTheory/GaugeBoson/IsGaugeField.lean | 93 ++ .../GaugeTheory/GaugeBoson/JetDeriv.lean | 377 ++++++ .../GaugeTheory/GaugeBoson/LorentzAction.lean | 313 +++++ .../GaugeTheory/GaugeBoson/MassDim.lean | 154 +++ .../GaugeTheory/GaugeField/Basic.lean | 1139 +++++++++++++++++ .../GaugeTheory/GaugeField/FieldStrength.lean | 190 +++ .../GaugeField/TransformsInAdjoint.lean | 264 ++++ .../GaugeTheory/GaugeJet.lean | 249 ++++ .../GaugeTheory/Matter/Charge.lean | 118 ++ .../GaugeTheory/Matter/CovariantDeriv.lean | 707 ++++++++++ .../GaugeTheory/Matter/MatterField.lean | 136 ++ .../JetAlgebra/FieldAlgebra/Basic.lean | 175 +++ .../FieldAlgebra/ConstantGaugeAction.lean | 104 ++ .../JetAlgebra/FieldAlgebra/GaugeAction.lean | 171 +++ .../JetAlgebra/FieldAlgebra/JetDeriv.lean | 295 +++++ .../FieldAlgebra/JetDerivClass.lean | 65 + .../FieldAlgebra/JetDerivConstruction.lean | 268 ++++ .../FieldAlgebra/LorentzAction.lean | 184 +++ .../JetAlgebra/FieldAlgebra/MassDim.lean | 128 ++ .../JetAlgebra/FieldAlgebra/Prod.lean | 119 ++ .../JetAlgebra/FieldAlgebra/Statistics.lean | 280 ++++ .../ClassicalFieldTheory/JetAlgebra/Jet.lean | 137 ++ .../JetAlgebra/JetComponentSpace/Basic.lean | 406 ++++++ .../JetComponentSpace/GaugeAction.lean | 487 +++++++ Physlib/Mathematics/MultisetAntidiagonal.lean | 154 +++ .../Matter/FermionicAlgebra/Prod.lean | 7 +- .../JetComponentSpace/CovariantDeriv.lean | 11 +- Physlib/Relativity/DerivAlgebra.lean | 70 +- 31 files changed, 7719 insertions(+), 52 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/JetDeriv.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LorentzAction.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/MassDim.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/Matter/MatterField.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/GaugeAction.lean create mode 100644 Physlib/Mathematics/MultisetAntidiagonal.lean diff --git a/Physlib.lean b/Physlib.lean index 508038e7d..857b9f46f 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -1,5 +1,31 @@ module +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.MassDim +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.FieldStrength +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeJet +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.Charge +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDerivClass +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDerivConstruction +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.MassDim +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Prod +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics +public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.Local.Variation public import Physlib.ClassicalMechanics.Basic public import Physlib.ClassicalMechanics.DampedHarmonicOscillator.Basic @@ -206,9 +232,12 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.Lin public import Physlib.Particles.StandardModel.AnomalyCancellation.Permutations public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.JetDeriv @@ -216,7 +245,11 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra. public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.MassDim public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetComponentSpace public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invariants @@ -234,8 +267,35 @@ public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.HiggsBoson.EffectivePotential +public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.Potential +public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.FermionGaugeSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators +public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight +public import Physlib.Particles.StandardModel.IsCovStandardModel.MixedSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.BiAdjoint +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.SU2PermDecomposition +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel public import Physlib.Particles.StandardModel.JetAlgebra.Basic public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.JetAlgebra.Invariants @@ -256,40 +316,6 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction -public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition -public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsFermionSector.Basic -public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic -public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition -public import Physlib.Particles.StandardModel.IsGaugeSector.Basic -public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic -public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.BiAdjoint -public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.SU2PermDecomposition -public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition -public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic -public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators -public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight -public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors -public import Physlib.Particles.StandardModel.IsCovStandardModel.FermionGaugeSector.Basic -public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.Basic -public import Physlib.Particles.StandardModel.IsCovStandardModel.MixedSector.Basic -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic -public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic @@ -457,9 +483,9 @@ public import Physlib.Relativity.LorentzAlgebra.ExponentialMap public import Physlib.Relativity.LorentzGroup.Basic public import Physlib.Relativity.LorentzGroup.Boosts.Apply public import Physlib.Relativity.LorentzGroup.Boosts.Axis -public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Relativity.LorentzGroup.Boosts.Basic public import Physlib.Relativity.LorentzGroup.Boosts.Generalized +public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Relativity.LorentzGroup.FermionicParity public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean new file mode 100644 index 000000000..f5ddaac56 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean @@ -0,0 +1,271 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeJet +public import Physlib.Relativity.DerivAlgebra +public import Physlib.Mathematics.SymmetricAlgebra +public import Mathlib.LinearAlgebra.Dual.Lemmas + +/-! +# The jet algebra of the gauge bosons of a gauge theory + +## i. Overview + +The gauge bosons of a gauge theory with Lie algebra `𝔤` are jointly one bosonic field valued in +`Lorentz.CoVector ⊗[ℝ] GaugeAlgebra`: a spacetime covector with values in the gauge +algebra. Its *jet algebra* — the algebra in which the gauge-boson part of a Lagrangian +lives — is the free commutative algebra on the component functions `∂_s A_μ^φ` and is +built here in the same way as the `BBoson` jet algebra, but non-abelian and **without a +basis of the gauge algebra**: the adjoint index is carried by an abstract covector +`φ : Module.Dual ℝ GaugeAlgebra` throughout, following the dual-family formulation of +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField`. For the Standard Model, `𝔤` is +`GaugeAlgebra`; see `Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic`. + +Following the split promised for this directory, the structure is: +1. this file — the target space, the jet component space, and the jet algebra with its + generators; +2. `LorentzAction` — the action of the Lorentz group; +3. `GaugeAction` — the action of the jet gauge group; +4. `JetDeriv` — the formal total derivative; +5. `MassDim` — the mass-dimension grading. + +## ii. Key results + +- `GaugeBoson` : the target space of the gauge-boson field. +- `GaugeBoson.repLorentzGroup` : the Lorentz action on the target space. +- `GaugeBoson.repGaugeGroupI` : the global (adjoint) gauge action on the target space. +- `GaugeBoson.JetComponentSpace` : the span of the component functions `∂_s A_μ^φ`. +- `GaugeJetAlgebra` : the jet algebra of the gauge bosons. +- `GaugeJetAlgebra.ofComponent`, `GaugeJetAlgebra.ofA` : the generators. + +## iii. Table of contents + +- A. The target space of the gauge-boson field + - A.1. Linear structure + - A.2. The Lorentz action on the target space + - A.3. The global gauge action on the target space +- B. The jet component space + - B.1. The component covectors +- C. The jet algebra + - C.1. The generators + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + + +open TensorProduct + +/-! + +## A. The target space of the gauge-boson field + +-/ + +variable (𝔤) in +/-- The target vector space of the gauge-boson field: a spacetime covector + with values in the gauge algebra. Its components are the fields `A_μ^a`; here the + adjoint index is kept abstract, as the gauge-algebra factor. -/ +@[ext] +structure GaugeBoson where + /-- The underlying covector-valued gauge algebra element. -/ + val : Lorentz.CoVector ⊗[ℝ] 𝔤 + +namespace GaugeBoson + +/-! + +### A.1. Linear structure + +-/ + +variable (𝔤) in +/-- Identifies a gauge boson with its underlying tensor-product value. -/ +def valEquiv : (GaugeBoson 𝔤) ≃ Lorentz.CoVector ⊗[ℝ] 𝔤 where + toFun := val + invFun := fun m => ⟨m⟩ + +noncomputable instance : AddCommGroup (GaugeBoson 𝔤) := Equiv.addCommGroup (valEquiv 𝔤) + +noncomputable instance : Module ℝ (GaugeBoson 𝔤) := Equiv.module ℝ (valEquiv 𝔤) + +variable (𝔤) in +/-- The linear identification with the underlying tensor product. -/ +def valLinEquiv : (GaugeBoson 𝔤) ≃ₗ[ℝ] Lorentz.CoVector ⊗[ℝ] 𝔤 where + toFun := val + invFun := fun m => ⟨m⟩ + map_add' := by intros; rfl + map_smul' := by intros; rfl + +@[simp] +lemma valLinEquiv_apply (v : (GaugeBoson 𝔤)) : (valLinEquiv 𝔤) v = v.val := rfl + +lemma valLinEquiv_symm_apply (m : Lorentz.CoVector ⊗[ℝ] 𝔤) : + (valLinEquiv 𝔤).symm m = ⟨m⟩ := rfl + +@[simp] +lemma val_add (v₁ v₂ : (GaugeBoson 𝔤)) : (v₁ + v₂).val = v₁.val + v₂.val := rfl + +@[simp] +lemma val_smul (r : ℝ) (v : (GaugeBoson 𝔤)) : (r • v).val = r • v.val := rfl + +instance : Module.Finite ℝ (GaugeBoson 𝔤) := + Module.Finite.equiv (valLinEquiv 𝔤).symm + +/-! + +### A.2. The Lorentz action on the target space + +-/ + +open Matrix MatrixGroups + +variable (𝔤) in +/-- The Lorentz action on the gauge-boson target space: the covector action on the + spacetime index, and the trivial action on the gauge-algebra factor. -/ +noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) (GaugeBoson 𝔤) where + toFun Λ := (valLinEquiv 𝔤).symm.toLinearMap ∘ₗ + TensorProduct.map (Lorentz.CoVector.sl2Rep Λ) LinearMap.id ∘ₗ + (valLinEquiv 𝔤).toLinearMap + map_one' := by + refine LinearMap.ext fun v => ?_ + simp [Module.End.one_eq_id] + map_mul' Λ₁ Λ₂ := by + refine LinearMap.ext fun v => ?_ + simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + Module.End.mul_apply, LinearEquiv.apply_symm_apply, map_mul] + congr 1 + rw [← LinearMap.comp_apply, ← TensorProduct.map_comp, LinearMap.id_comp] + rfl + +/-! + +### A.3. The global gauge action on the target space + +-/ + +/-- The global gauge action on the gauge-boson target space: the adjoint action on the + gauge-algebra factor, and the trivial action on the spacetime index. -/ +noncomputable def repValue {G₀ : Type} [Monoid G₀] (ρ : Representation ℝ G₀ 𝔤) : + Representation ℝ G₀ (GaugeBoson 𝔤) where + toFun g := (valLinEquiv 𝔤).symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id (ρ g) ∘ₗ + (valLinEquiv 𝔤).toLinearMap + map_one' := by + refine LinearMap.ext fun v => ?_ + simp [Module.End.one_eq_id] + map_mul' g₁ g₂ := by + refine LinearMap.ext fun v => ?_ + simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + Module.End.mul_apply, LinearEquiv.apply_symm_apply, map_mul] + congr 1 + rw [← LinearMap.comp_apply, ← TensorProduct.map_comp, LinearMap.id_comp] + rfl + +/-! + +## B. The jet component space + +-/ + +variable (𝔤) in +/-- The jet component space of the gauge-boson field: the span of the component functions + `∂_s A_μ^φ`. The `DerivAlgebraReal` factor carries the derivative label `s`, and the + dual factor the spacetime and adjoint indices — the latter as an abstract covector on + the gauge algebra, with no basis chosen. Unlike a matter field, the gauge boson is real, + so there is no conjugate half. -/ +abbrev JetComponentSpace : Type := + DerivAlgebraReal ⊗[ℝ] Module.Dual ℝ (GaugeBoson 𝔤) + +/-! + +### B.1. The component covectors + +-/ + +variable (𝔤) in +/-- The covector on the gauge-boson target space pairing the spacetime index against a + covector `ω` and the adjoint index against `φ`. -/ +noncomputable def componentDual : + Module.Dual ℝ Lorentz.CoVector →ₗ[ℝ] + Module.Dual ℝ 𝔤 →ₗ[ℝ] Module.Dual ℝ (GaugeBoson 𝔤) where + toFun ω := (Module.Dual.transpose (M := (GaugeBoson 𝔤)) (valLinEquiv 𝔤).toLinearMap).comp + ((TensorProduct.dualDistrib ℝ Lorentz.CoVector 𝔤).comp + (TensorProduct.mk ℝ (Module.Dual ℝ Lorentz.CoVector) (Module.Dual ℝ 𝔤) ω)) + map_add' ω₁ ω₂ := by + refine LinearMap.ext fun φ => ?_ + simp [TensorProduct.add_tmul] + map_smul' r ω := by + refine LinearMap.ext fun φ => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, TensorProduct.mk_apply, + RingHom.id_apply, LinearMap.smul_apply] + rw [← TensorProduct.smul_tmul', map_smul, map_smul] + +@[simp] +lemma componentDual_apply_val_tmul (ω : Module.Dual ℝ Lorentz.CoVector) + (φ : Module.Dual ℝ 𝔤) (v : Lorentz.CoVector) (a : 𝔤) : + (componentDual 𝔤) ω φ ⟨v ⊗ₜ[ℝ] a⟩ = ω v * φ a := by + simp [componentDual, Module.Dual.transpose_apply, valLinEquiv_symm_apply] + +end GaugeBoson + +/-! + +## C. The jet algebra + +-/ + +variable (𝔤) in +/-- **The jet algebra of the gauge bosons**: the free commutative algebra + on the component functions `∂_s A_μ^φ` of the gauge-boson field, realized as the + symmetric algebra on the jet component space. The commutativity of the product is the + Bose statistics of the gauge fields. -/ +abbrev GaugeJetAlgebra : Type := SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤) + +namespace GaugeJetAlgebra + +/-! + +### C.1. The generators + +-/ + +variable (𝔤) in +/-- The undifferentiated component function `A^φ` of the gauge-boson field along a + covector `φ` on the target space. -/ +noncomputable def ofComponent : Module.Dual ℝ (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤) := + (SymmetricAlgebra.ι ℝ _).comp + (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ (GaugeBoson 𝔤)) 1) + +lemma ofComponent_apply (φ : Module.Dual ℝ (GaugeBoson 𝔤)) : + (ofComponent 𝔤) φ = SymmetricAlgebra.ι ℝ _ ((1 : DerivAlgebraReal) ⊗ₜ[ℝ] φ) := rfl + +variable (𝔤) in +/-- **The component function `A_μ^φ` of the gauge-boson field**: the spacetime index `μ` + paired against the Lorentz coordinate basis, the adjoint index against the abstract + covector `φ` on the gauge algebra. These are the generators the ambient theory sees; + no basis of the gauge algebra is involved. -/ +noncomputable def ofA (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] (GaugeJetAlgebra 𝔤) := + (ofComponent 𝔤).comp ((GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ)) + +lemma ofA_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (ofA 𝔤) μ φ = (ofComponent 𝔤) ((GaugeBoson.componentDual 𝔤) + (Lorentz.CoVector.basis.dualBasis μ) φ) := rfl + +/-- The jet algebra is generated by the component functions. -/ +@[simp] +lemma adjoin_ι_eq_top : + Algebra.adjoin ℝ (Set.range (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤))) = ⊤ := + SymmetricAlgebra.adjoin_range_ι + +end GaugeJetAlgebra + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean new file mode 100644 index 000000000..02103597b --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean @@ -0,0 +1,603 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.Mathematics.MultisetAntidiagonal + +/-! +# The gauge action on the gauge-boson jet algebra + +## i. Overview + +A jet of gauge transformations `U` acts on the gauge field by +`A_μ ↦ Ad_U A_μ + mc(U)_μ`, so on a component function `∂_s A_μ^φ` it acts affinely: the +linear part is the all-orders Leibniz convolution of the Taylor coefficients of `Ad(U⁻¹)` +against lower component functions, and the constant part is the Taylor coefficient of the +Maurer–Cartan form of `U⁻¹`. The action extends to the whole jet algebra as the +substitution homomorphism determined by this affine action on the generators. + +The heart of the file is the *Taylor–Leibniz theorem* for the adjoint action +(`JetGaugeAlgebra.eval_iteratedDeriv_adjointMap`): the base-point Taylor coefficients of +`Ad_U Y` are the convolution of the coefficients of `Ad_U` — the `adjointCoeff` of the +covariance machinery — with those of `Y`. Multiplicativity of the transport and the +cocycle identity for the Maurer–Cartan shift are both corollaries. + +## ii. Key results + +- `JetGaugeAlgebra.eval_iteratedDeriv_adjointMap` : the Taylor–Leibniz theorem for the + adjoint action on jets. +- `IsGaugeField.adjointCoeff_mul` : the Taylor coefficients of `Ad` are multiplicative up + to convolution. +- `GaugeJetAlgebra.transport` : the linear part of the gauge action on the component + space. +- `GaugeJetAlgebra.mcShift` : the Maurer–Cartan shift. +- `GaugeJetAlgebra.repJetGaugeGroupI` : the action of the jet gauge group on the jet + algebra. +- `GaugeJetAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofA` : the transformation law of + the derivative generators, in the form used by `IsGaugeField`. + +## iii. Table of contents + +- A. Taylor–Leibniz for jets + - A.1. The scalar Leibniz rule for iterated derivatives + - A.2. The matrix Leibniz rule at the base point +- B. The Taylor–Leibniz theorem for the adjoint action + - B.1. Collapsing convolutions against constants + - B.2. The theorem + - B.3. Multiplicativity of the adjoint Taylor coefficients +- C. The transport on the component space +- D. The Maurer–Cartan shift +- E. The action of the jet gauge group + - E.1. The transformation law of the generators + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable [GaugeJet G 𝔤 G₀ 𝔤J] +variable [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] + +set_option maxHeartbeats 1000000 + + +open TensorProduct MvPowerSeries + +/-! + +## C. The (transport G 𝔤) on the component space + +-/ + +namespace GaugeBoson + +variable (G 𝔤) in +/-- The adjoint (transport G 𝔤) on the gauge-boson target space at `p` derivatives: the adjoint + Taylor coefficient on the gauge-algebra factor, the identity on the spacetime index. -/ +noncomputable def adjointTransport (U : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : + (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤) := + (valLinEquiv 𝔤).symm.toLinearMap ∘ₗ + TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff U p) ∘ₗ + (valLinEquiv 𝔤).toLinearMap + +lemma adjointTransport_mk_tmul (U : G) (p : Multiset (Fin 1 ⊕ Fin 3)) + (v : Lorentz.CoVector) (a : 𝔤) : + (adjointTransport G 𝔤) U p ⟨v ⊗ₜ[ℝ] a⟩ = ⟨v ⊗ₜ[ℝ] IsGaugeField.adjointCoeff U p a⟩ := rfl + +/-- The adjoint (transport G 𝔤) at the identity: only the base point survives. -/ +lemma adjointTransport_one (p : Multiset (Fin 1 ⊕ Fin 3)) : + (adjointTransport G 𝔤) 1 p = if p = 0 then LinearMap.id else 0 := by + rw [adjointTransport, IsGaugeField.adjointCoeff_one] + rcases eq_or_ne p 0 with rfl | hp + · rw [if_pos rfl, if_pos rfl, TensorProduct.map_id] + refine LinearMap.ext fun v => ?_ + simp + · rw [if_neg hp, if_neg hp] + refine LinearMap.ext fun v => ?_ + rw [show TensorProduct.map (LinearMap.id (M := Lorentz.CoVector)) + (0 : 𝔤 →ₗ[ℝ] 𝔤) = 0 from by + refine TensorProduct.ext' fun x a => ?_ + rw [TensorProduct.map_tmul, LinearMap.zero_apply, TensorProduct.tmul_zero] + rfl] + simp + +/-- The adjoint (transport G 𝔤) of a product: the antidiagonal convolution of transports. -/ +lemma adjointTransport_mul (U V : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : + (adjointTransport G 𝔤) (U * V) p + = (p.antidiagonal.map fun r => + (adjointTransport G 𝔤) U r.1 ∘ₗ (adjointTransport G 𝔤) V r.2).sum := by + refine LinearMap.ext fun v => ?_ + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : (GaugeBoson 𝔤)) = 0 from rfl, map_zero] + refine (Multiset.sum_eq_zero fun x hx => ?_).symm + obtain ⟨r, hr, rfl⟩ := Multiset.mem_map.mp hx + simp + | tmul x a => + apply (valLinEquiv 𝔤).injective + rw [adjointTransport_mk_tmul, map_multiset_sum, Multiset.map_map, valLinEquiv_apply, + show ((⟨x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff (U * V) p a⟩ : (GaugeBoson 𝔤))).val + = x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff (U * V) p a from rfl, + IsGaugeField.adjointCoeff_mul, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.tmul_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.comp_apply, adjointTransport_mk_tmul, + valLinEquiv_apply] + | add m₁ m₂ h₁ h₂ => + rw [show (⟨m₁ + m₂⟩ : (GaugeBoson 𝔤)) = (⟨m₁⟩ : (GaugeBoson 𝔤)) + ⟨m₂⟩ from rfl, map_add, h₁, + h₂, ← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + exact (map_add _ _ _).symm + +/-- The dual (transport G 𝔤) carries a component covector to the component covector of the + transported adjoint index: the spacetime slot is untouched. -/ +lemma dualMap_adjointTransport_componentDual (U : G) + (p : Multiset (Fin 1 ⊕ Fin 3)) (ω : Module.Dual ℝ Lorentz.CoVector) + (φ : Module.Dual ℝ 𝔤) : + ((adjointTransport G 𝔤) U p).dualMap ((componentDual 𝔤) ω φ) + = (componentDual 𝔤) ω (φ ∘ₗ IsGaugeField.adjointCoeff U p) := by + refine LinearMap.ext fun v => ?_ + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : (GaugeBoson 𝔤)) = 0 from rfl, map_zero, map_zero] + | tmul x a => + rw [LinearMap.dualMap_apply, adjointTransport_mk_tmul, + componentDual_apply_val_tmul, componentDual_apply_val_tmul] + rfl + | add m₁ m₂ h₁ h₂ => + rw [show (⟨m₁ + m₂⟩ : (GaugeBoson 𝔤)) = (⟨m₁⟩ : (GaugeBoson 𝔤)) + ⟨m₂⟩ from rfl, map_add, + map_add, h₁, h₂] + +end GaugeBoson + +namespace GaugeJetAlgebra + +variable (G 𝔤) in +/-- The value of the (transport G 𝔤) on the derivative symbol at `s`: the all-orders Leibniz + convolution of the dual adjoint transports against lower derivative symbols. -/ +noncomputable def transportFun (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson.JetComponentSpace 𝔤) := + (s.antidiagonal.map fun p => + (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ (GaugeBoson 𝔤)) + (DerivAlgebraReal.basisMultiset p.2)).comp + (((GaugeBoson.adjointTransport G 𝔤) U p.1).dualMap)).sum + +variable (G 𝔤) in +/-- **The linear part of the gauge action on the jet component space**: on a component + function `∂_s A^ψ` it is the all-orders Leibniz convolution of the Taylor coefficients + of the adjoint action of `U` against the lower component functions. -/ +noncomputable def transport (U : G) : + (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] (GaugeBoson.JetComponentSpace 𝔤) := + TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ ((transportFun G 𝔤) U)) + +lemma transport_basis_tmul (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ψ : Module.Dual ℝ (GaugeBoson 𝔤)) : + (transport G 𝔤) U (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + = (s.antidiagonal.map fun p => + DerivAlgebraReal.basisMultiset p.2 ⊗ₜ[ℝ] + ((GaugeBoson.adjointTransport G 𝔤) U p.1).dualMap ψ).sum := by + rw [transport, TensorProduct.lift.tmul, Module.Basis.constr_basis, transportFun, + Multiset.sum_linearMap_apply, Multiset.map_map] + rfl + +/-- Two maps out of the jet component space agree if they agree on the components + `∂_s A^ψ` with `s` a derivative multiset and `ψ` an arbitrary covector. -/ +lemma _root_.GaugeBoson.JetComponentSpace.ext_of_basis + {M : Type*} [AddCommMonoid M] [Module ℝ M] + {F G : (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] M} + (h : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ (GaugeBoson 𝔤)), + F (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + = G (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ)) : F = G := by + refine LinearMap.ext fun x => ?_ + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb] + | tmul a ψ => + have ha : a ∈ Submodule.span ℝ + (Set.range DerivAlgebraReal.basisMultiset) := by + rw [DerivAlgebraReal.basisMultiset.span_eq]; trivial + induction ha using Submodule.span_induction with + | mem b hb => obtain ⟨s, rfl⟩ := hb; exact h s ψ + | zero => rw [TensorProduct.zero_tmul, map_zero, map_zero] + | add b c _ _ hb hc => rw [TensorProduct.add_tmul, map_add, map_add, hb, hc] + | smul c b _ hb => rw [← TensorProduct.smul_tmul', map_smul, map_smul, hb] + +/-- The (transport G 𝔤) of the identity is the identity. -/ +lemma transport_one : (transport G 𝔤) (1 : G) = LinearMap.id := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + rw [transport_basis_tmul, + Multiset.map_congr rfl (fun p hp => by rw [GaugeBoson.adjointTransport_one]), + Multiset.sum_antidiagonal_eq_of_fst_ne_zero s + (fun p => DerivAlgebraReal.basisMultiset p.2 ⊗ₜ[ℝ] + ((if p.1 = 0 then LinearMap.id else 0) : + (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤)).dualMap ψ) + (fun p hp => by + rw [if_neg hp, show ((0 : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤))).dualMap ψ = 0 from + LinearMap.ext fun v => by simp, TensorProduct.tmul_zero]), + if_pos rfl, LinearMap.id_apply, + show (LinearMap.id : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤)).dualMap ψ = ψ from + LinearMap.ext fun v => rfl] + +/-- **The (transport G 𝔤) is an anti-homomorphism**: the (transport G 𝔤) of a product is the reverse + composite. Composed with the inverse, it becomes the linear part of the gauge + representation. -/ +lemma transport_mul (U V : G) : + (transport G 𝔤) (U * V) = (transport G 𝔤) V ∘ₗ (transport G 𝔤) U := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + have hdual : ∀ (p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3)), + ((GaugeBoson.adjointTransport G 𝔤) (U * V) p.1).dualMap ψ + = (p.1.antidiagonal.map fun r => + ((GaugeBoson.adjointTransport G 𝔤) V r.2).dualMap + (((GaugeBoson.adjointTransport G 𝔤) U r.1).dualMap ψ)).sum := by + intro p + rw [GaugeBoson.adjointTransport_mul] + refine LinearMap.ext fun v => ?_ + rw [LinearMap.dualMap_apply, Multiset.sum_linearMap_apply, Multiset.map_map, + map_multiset_sum, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + rfl + have hLHS : (transport G 𝔤) (U * V) (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + = (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + DerivAlgebraReal.basisMultiset p.2 ⊗ₜ[ℝ] + ((GaugeBoson.adjointTransport G 𝔤) V q.2).dualMap + (((GaugeBoson.adjointTransport G 𝔤) U q.1).dualMap ψ)).sum).sum := by + rw [transport_basis_tmul] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [hdual p, Multiset.tmul_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl) + have hRHS : ((transport G 𝔤) V ∘ₗ (transport G 𝔤) U) + (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + = (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun q => + DerivAlgebraReal.basisMultiset q.2 ⊗ₜ[ℝ] + ((GaugeBoson.adjointTransport G 𝔤) V q.1).dualMap + (((GaugeBoson.adjointTransport G 𝔤) U p.1).dualMap ψ)).sum).sum := by + rw [LinearMap.comp_apply, transport_basis_tmul, map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + exact transport_basis_tmul V p.2 _ + rw [hLHS, hRHS] + exact Multiset.sum_antidiagonal_assoc s fun a b c => + DerivAlgebraReal.basisMultiset c ⊗ₜ[ℝ] + ((GaugeBoson.adjointTransport G 𝔤) V b).dualMap + (((GaugeBoson.adjointTransport G 𝔤) U a).dualMap ψ) + +end GaugeJetAlgebra + +/-! + +## D. The Maurer–Cartan shift + +-/ + +namespace GaugeJetAlgebra + +variable (G 𝔤) in +/-- The Taylor coefficient of the Maurer–Cartan form of `U` at the derivative multiset + `s`, packaged as a gauge boson: the spacetime index runs over the coordinate + directions, the adjoint index over the base-point Taylor coefficients of the + Maurer–Cartan form. -/ +noncomputable def mcBosonCoeff (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (GaugeBoson 𝔤) := + ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s (GaugeJet.mc 𝔤 (G := G) U μ))⟩ + +@[simp] +lemma mcBosonCoeff_one (s : Multiset (Fin 1 ⊕ Fin 3)) : (mcBosonCoeff G 𝔤) 1 s = 0 := by + rw [show (0 : (GaugeBoson 𝔤)) = ⟨0⟩ from rfl, mcBosonCoeff] + congr 1 + refine Finset.sum_eq_zero fun μ _ => ?_ + rw [show GaugeJet.mc 𝔤 (G := G) 1 μ = 0 from GaugeJet.mc_one (G := G) (𝔤 := 𝔤) μ, map_zero, + map_zero, TensorProduct.tmul_zero] + +/-- The Maurer–Cartan Taylor coefficients of a product: the cocycle identity, with the + adjoint (transport G 𝔤) convoluted in by the Taylor–Leibniz theorem. -/ +lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (mcBosonCoeff G 𝔤) (U * V) s + = (mcBosonCoeff G 𝔤) U s + + (s.antidiagonal.map fun p => + (GaugeBoson.adjointTransport G 𝔤) U p.1 ((mcBosonCoeff G 𝔤) V p.2)).sum := by + apply (GaugeBoson.valLinEquiv 𝔤).injective + have hE : ∀ (W : G) (t : Multiset (Fin 1 ⊕ Fin 3)), + (GaugeBoson.valLinEquiv 𝔤) ((mcBosonCoeff G 𝔤) W t) + = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 t + (GaugeJet.mc 𝔤 (G := G) W μ)) := fun W t => rfl + have hB : ∀ p q : Multiset (Fin 1 ⊕ Fin 3), + (GaugeBoson.valLinEquiv 𝔤) ((GaugeBoson.adjointTransport G 𝔤) U p ((mcBosonCoeff G 𝔤) V q)) + = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + IsGaugeField.adjointCoeff U p (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q (GaugeJet.mc 𝔤 (G := G) V μ))) := by + intro p q + rw [show (GaugeBoson.valLinEquiv 𝔤) ((GaugeBoson.adjointTransport G 𝔤) U p + ((mcBosonCoeff G 𝔤) V q)) + = TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff U p) + ((GaugeBoson.valLinEquiv 𝔤) ((mcBosonCoeff G 𝔤) V q)) from by + rw [GaugeBoson.adjointTransport] + simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + LinearEquiv.apply_symm_apply], + hE, map_sum] + exact Finset.sum_congr rfl fun μ _ => by + rw [TensorProduct.map_tmul, LinearMap.id_apply] + have hA : (GaugeBoson.valLinEquiv 𝔤) ((mcBosonCoeff G 𝔤) (U * V) s) + = ∑ μ, (Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s (GaugeJet.mc 𝔤 (G := G) U μ)) + + (s.antidiagonal.map fun p => + Lorentz.CoVector.basis μ ⊗ₜ[ℝ] + IsGaugeField.adjointCoeff U p.1 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.2 (GaugeJet.mc 𝔤 (G := G) V μ)))).sum) := by + rw [hE] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [show GaugeJet.mc 𝔤 (G := G) (U * V) μ + = GaugeJet.mc 𝔤 (G := G) U μ + GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.mc 𝔤 + (G := G) V μ) from + GaugeJet.mc_cocycle (G := G) (𝔤 := 𝔤) U V μ, + map_add, map_add, + show GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.mc 𝔤 (G := G) V μ) + = GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.mc 𝔤 (G := G) V μ) from rfl, + GaugeJetLeibniz.evalLie_iteratedDeriv_adjoint, TensorProduct.tmul_add, + Multiset.tmul_sum, Multiset.map_map] + exact congrArg (fun z => _ + z) + (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => rfl)) + rw [hA, Finset.sum_add_distrib, map_add, map_multiset_sum, Multiset.map_map, ← hE, + ← Multiset.sum_map_finsetSum] + congr 1 + +variable (G 𝔤) in +/-- **The Maurer–Cartan shift**: the linear functional on the component space pairing a + component `∂_s A^ψ` with the Taylor coefficient of the Maurer–Cartan form of `U`. It is + the constant part of the affine gauge action. -/ +noncomputable def mcShift (U : G) : (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] ℝ := + TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ fun s => + Module.Dual.eval ℝ (GaugeBoson 𝔤) ((mcBosonCoeff G 𝔤) U s)) + +lemma mcShift_basis_tmul (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) + (ψ : Module.Dual ℝ (GaugeBoson 𝔤)) : + (mcShift G 𝔤) U (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + = ψ ((mcBosonCoeff G 𝔤) U s) := by + rw [mcShift, TensorProduct.lift.tmul, Module.Basis.constr_basis] + rfl + +@[simp] +lemma mcShift_one : (mcShift G 𝔤) (1 : G) = 0 := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + rw [mcShift_basis_tmul, mcBosonCoeff_one, map_zero, LinearMap.zero_apply] + +/-- **The cocycle identity for the Maurer–Cartan shift.** -/ +lemma mcShift_mul (U V : G) : + (mcShift G 𝔤) (U * V) = (mcShift G 𝔤) V ∘ₗ (transport G 𝔤) U + (mcShift G 𝔤) U := by + refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ + rw [LinearMap.add_apply, LinearMap.comp_apply, mcShift_basis_tmul, mcBosonCoeff_mul, + map_add, add_comm] + congr 1 + · rw [map_multiset_sum, Multiset.map_map, transport_basis_tmul, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, Function.comp_apply, mcShift_basis_tmul] + rfl + · exact (mcShift_basis_tmul U s ψ).symm + +/-! + +## E. The action of the jet gauge group + +-/ + +variable (G 𝔤) in +/-- The affine action of a jet of gauge transformations on the generators of the jet + algebra: the transported component plus the Maurer–Cartan shift, both of `U⁻¹` — the + contragredient convention for an action on component functions. -/ +noncomputable def gaugeGen (U : G) : + (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤) := + (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤)).comp ((transport G 𝔤) U⁻¹) + + (Algebra.linearMap ℝ (GaugeJetAlgebra 𝔤)).comp ((mcShift G 𝔤) U⁻¹) + +lemma gaugeGen_apply (U : G) (x : (GaugeBoson.JetComponentSpace 𝔤)) : + (gaugeGen G 𝔤) U x = SymmetricAlgebra.ι ℝ _ ((transport G 𝔤) U⁻¹ x) + + algebraMap ℝ (GaugeJetAlgebra 𝔤) ((mcShift G 𝔤) U⁻¹ x) := rfl + +variable (G 𝔤) in +/-- **The action of the jet gauge group on the gauge-boson jet algebra**: the substitution + homomorphism determined by the affine action on the generators, `∂_s A^ψ` going to its + transported convolution plus the Maurer–Cartan shift of `U⁻¹`. -/ +noncomputable def repJet : Representation ℝ G (GaugeJetAlgebra 𝔤) where + toFun U := (SymmetricAlgebra.lift ((gaugeGen G 𝔤) U)).toLinearMap + map_one' := by + suffices h : SymmetricAlgebra.lift ((gaugeGen G 𝔤) 1) = AlgHom.id ℝ (GaugeJetAlgebra 𝔤) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + show SymmetricAlgebra.lift ((gaugeGen G 𝔤) 1) (SymmetricAlgebra.ι ℝ _ x) + = AlgHom.id ℝ (GaugeJetAlgebra 𝔤) (SymmetricAlgebra.ι ℝ _ x) + rw [SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, inv_one, transport_one, + mcShift_one, LinearMap.id_apply, LinearMap.zero_apply, map_zero, add_zero] + rfl + map_mul' U V := by + suffices h : SymmetricAlgebra.lift ((gaugeGen G 𝔤) (U * V)) + = (SymmetricAlgebra.lift ((gaugeGen G 𝔤) U)).comp (SymmetricAlgebra.lift + ((gaugeGen G 𝔤) V)) by + rw [h]; rfl + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + show SymmetricAlgebra.lift ((gaugeGen G 𝔤) (U * V)) (SymmetricAlgebra.ι ℝ _ x) + = ((SymmetricAlgebra.lift ((gaugeGen G 𝔤) U)).comp (SymmetricAlgebra.lift ((gaugeGen G 𝔤) V))) + (SymmetricAlgebra.ι ℝ _ x) + rw [SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, AlgHom.comp_apply, + SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, map_add, + SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, AlgHom.commutes, + mul_inv_rev, transport_mul, mcShift_mul, LinearMap.comp_apply, + LinearMap.add_apply, LinearMap.comp_apply, map_add, add_assoc] + +variable (G 𝔤) in +/-- The action of `U` as an algebra homomorphism: a jet of gauge transformations acts on + a Lagrangian term factor by factor. -/ +noncomputable def repJetAlgHom (U : G) : + (GaugeJetAlgebra 𝔤) →ₐ[ℝ] (GaugeJetAlgebra 𝔤) := + SymmetricAlgebra.lift ((gaugeGen G 𝔤) U) + +@[simp] +lemma repJet_ι (U : G) (x : (GaugeBoson.JetComponentSpace 𝔤)) : + (repJet G 𝔤) U (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.ι ℝ _ ((transport G 𝔤) U⁻¹ x) + + algebraMap ℝ (GaugeJetAlgebra 𝔤) ((mcShift G 𝔤) U⁻¹ x) := by + rw [show (repJet G 𝔤) U (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.lift ((gaugeGen G 𝔤) U) (SymmetricAlgebra.ι ℝ _ x) from rfl, + SymmetricAlgebra.lift_ι_apply, gaugeGen_apply] + +@[simp] +lemma repJet_apply_one (U : G) : + (repJet G 𝔤) U (1 : (GaugeJetAlgebra 𝔤)) = 1 := by + rw [show (repJet G 𝔤) U (1 : (GaugeJetAlgebra 𝔤)) + = SymmetricAlgebra.lift ((gaugeGen G 𝔤) U) 1 from rfl, map_one] + +lemma repJet_apply_mul (U : G) (x y : (GaugeJetAlgebra 𝔤)) : + (repJet G 𝔤) U (x * y) = (repJet G 𝔤) U x * (repJet G 𝔤) U y := by + rw [show (repJet G 𝔤) U (x * y) + = SymmetricAlgebra.lift ((gaugeGen G 𝔤) U) (x * y) from rfl, map_mul] + rfl + +@[simp] +lemma repJet_algebraMap (U : G) (r : ℝ) : + (repJet G 𝔤) U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) + = algebraMap ℝ (GaugeJetAlgebra 𝔤) r := by + rw [show (repJet G 𝔤) U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) + = SymmetricAlgebra.lift ((gaugeGen G 𝔤) U) (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) from rfl, + AlgHom.commutes] + +/-! + +### E.1. The transformation law of the generators + +-/ + +/-- The component covector at `μ` picks the `μ`-th Maurer–Cartan Taylor coefficient out + of the shift. -/ +lemma componentDual_dualBasis_mcBosonCoeff (W : G) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ) φ ((mcBosonCoeff G 𝔤) W s) + = φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s + (GaugeJet.mc 𝔤 (G := G) W μ))) := by + have hsum : (mcBosonCoeff G 𝔤) W s + = ∑ ν, (⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s + (GaugeJet.mc 𝔤 (G := G) W ν))⟩ : (GaugeBoson 𝔤)) := by + apply (GaugeBoson.valLinEquiv 𝔤).injective + rw [map_sum] + rfl + rw [hsum, map_sum] + rw [Finset.sum_congr rfl fun ν _ => GaugeBoson.componentDual_apply_val_tmul _ _ _ _] + rw [Finset.sum_congr rfl fun ν _ => by + rw [Module.Basis.dualBasis_apply_self, ite_mul, one_mul, zero_mul]] + rw [Finset.sum_ite_eq' Finset.univ μ + (fun ν => φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s + (GaugeJet.mc 𝔤 (G := G) W ν)))), if_pos (Finset.mem_univ μ)] + +/-- **The transformation law of the derivative generators**, in the form used by + `IsGaugeField`: a jet of gauge transformations acts on `∂_s A_μ^φ` by the all-orders + Leibniz convolution of the adjoint Taylor coefficients of `U⁻¹` against lower + generators, plus the Taylor coefficient of the Maurer–Cartan form of `U⁻¹`. -/ +theorem repJet_iteratedJetDeriv_ofA (U : G) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (repJet G 𝔤) U ((iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ)) + = (s.antidiagonal.map fun p => + (iteratedJetDeriv 𝔤) p.2 ((ofA 𝔤) μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + + algebraMap ℝ (GaugeJetAlgebra 𝔤) + (φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s + (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))) := by + rw [iteratedJetDeriv_ofA, repJet_ι, transport_basis_tmul, mcShift_basis_tmul, + componentDual_dualBasis_mcBosonCoeff, map_multiset_sum, Multiset.map_map] + congr 1 + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, GaugeBoson.dualMap_adjointTransport_componentDual, + iteratedJetDeriv_ofA] + rfl + +/-! + +### E.2. The complexified action + +-/ + +variable (G 𝔤) in +/-- The action of the jet gauge group on the complexified gauge-boson jet algebra, by + base change. -/ +noncomputable def complexRepJet : + Representation ℂ G (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) where + toFun U := LinearMap.baseChange ℂ ((repJet G 𝔤) U) + map_one' := by + rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] + map_mul' U V := by + rw [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp, Module.End.mul_eq_comp] + +@[simp] +lemma complexRepJet_tmul (U : G) (z : ℂ) (x : (GaugeJetAlgebra 𝔤)) : + (complexRepJet G 𝔤) U (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] (repJet G 𝔤) U x := rfl + +lemma complexRepJet_apply_mul (U : G) + (x y : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : + (complexRepJet G 𝔤) U (x * y) + = (complexRepJet G 𝔤) U x * (complexRepJet G 𝔤) U y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => rw [add_mul, map_add, map_add, h₁, h₂, add_mul] + | tmul z₁ a₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => rw [mul_add, map_add, map_add, h₁, h₂, mul_add] + | tmul z₂ a₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, complexRepJet_tmul, + complexRepJet_tmul, complexRepJet_tmul, + repJet_apply_mul, Algebra.TensorProduct.tmul_mul_tmul] + +/-- The iterated complexified derivative of a real element is the complexification of the + iterated real derivative. -/ +lemma iteratedD_complexJetDeriv_one_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : (GaugeJetAlgebra 𝔤)) : + Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s ((1 : ℂ) ⊗ₜ[ℝ] x) + = (1 : ℂ) ⊗ₜ[ℝ] (iteratedJetDeriv 𝔤) s x := by + induction s using Multiset.induction_on generalizing x with + | empty => rw [Lorentz.iteratedD_zero, iteratedJetDeriv_zero]; rfl + | cons μ s ih => + rw [Lorentz.iteratedD_cons, LinearMap.comp_apply, ih, complexJetDeriv_tmul, + iteratedJetDeriv_cons, LinearMap.comp_apply] + +/-- A real scalar in the complexified jet algebra is the corresponding complex scalar. -/ +lemma one_tmul_algebraMap (r : ℝ) : + (1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) + = algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) ((r : ℝ) : ℂ) := by + rw [Algebra.algebraMap_eq_smul_one, TensorProduct.tmul_smul, + Algebra.algebraMap_eq_smul_one, + show ((r : ℝ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra 𝔤)))) + = (((r : ℝ) : ℂ)) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra 𝔤))) from + (algebraMap_smul ℂ r _).symm, Algebra.TensorProduct.one_def] + +/-- **The transformation law of the derivative generators on the complexification**: the + form consumed by the `IsGaugeField` structure of the ambient Lagrangian theory. -/ +theorem complexRepJet_iteratedD_one_tmul_ofA (U : G) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (complexRepJet G 𝔤) U (Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s + ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ φ)) + = (s.antidiagonal.map fun p => + Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm p.2 + ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + + algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) + (((φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s + (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ))) : ℝ)) : ℂ) := by + rw [iteratedD_complexJetDeriv_one_tmul, complexRepJet_tmul, + repJet_iteratedJetDeriv_ofA, TensorProduct.tmul_add, Multiset.tmul_sum, + Multiset.map_map, one_tmul_algebraMap] + congr 1 + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [Function.comp_apply, iteratedD_complexJetDeriv_one_tmul]) + +end GaugeJetAlgebra + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean new file mode 100644 index 000000000..6864b926b --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +/-! +# The gauge-boson jet algebra is a gauge field + +The symbols `∂_s A_μ^φ` of the algebra of gauge-boson jets, complexified, satisfy the +transformation laws `IsGaugeField` of a gauge field: the Lorentz law from `IsLorentzDeriv`, and +the gauge law from the action of the jet gauge group constructed in `GaugeAction`. This holds +for any `GaugeJet` with the Taylor–Leibniz rule `GaugeJetLeibniz`. +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable [GaugeJet G 𝔤 G₀ 𝔤J] +variable [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] + +set_option maxHeartbeats 1000000 + + +namespace GaugeJetAlgebra + +open TensorProduct Matrix MatrixGroups + +/-! + +## A. The gauge-field structure + +-/ + +/-! + +### A.1. The gauge-field derivative symbols + +-/ + +variable (𝔤) in +/-- The gauge-field derivative symbols of the complexified gauge-boson jet algebra, as a + family over the derivative multiset, the spacetime index and the dual of the gauge + algebra — the form consumed by the abstract covariance machinery. -/ +noncomputable def gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤) := + (Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s).restrictScalars ℝ ∘ₗ + (TensorProduct.mk ℝ ℂ (GaugeJetAlgebra 𝔤) 1).comp ((ofA 𝔤) μ) + +@[simp] +lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (gaugeField 𝔤) s μ φ = Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s + ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ φ) := rfl + +/-! + +### A.2. The `IsGaugeField` instance + +-/ + +/-- **The complexified gauge-boson jet algebra is a gauge field**: its derivative symbols + are those of a Lorentz covector, transform under the jet gauge group by the all-orders + Leibniz convolution of the adjoint Taylor coefficients plus the Maurer–Cartan shift, and + the gauge action is multiplicative. -/ +theorem isGaugeField : + IsGaugeField (complexRepLorentzGroup 𝔤) (complexRepJet G 𝔤) (gaugeField 𝔤) where + lorentz_apply Λ n l μ φ := by + calc (complexRepLorentzGroup 𝔤) Λ ((gaugeField 𝔤) (List.ofFn l) μ φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm (List.ofFn p) + ((complexRepLorentzGroup 𝔤) Λ ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ φ)) := + Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn complexJetDeriv_comm Λ l + ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ φ) + _ = _ := by + refine Finset.sum_congr rfl fun p _ => ?_ + rw [complexRepLorentzGroup_one_tmul_ofA, map_sum] + refine congrArg (HSMul.hSMul _) (Finset.sum_congr rfl fun a _ => ?_) + rw [map_smul] + rfl + gauge_apply_deriv U s μ φ := complexRepJet_iteratedD_one_tmul_ofA U s μ φ + gauge_mul U b₁ b₂ := complexRepJet_apply_mul U b₁ b₂ + + +end GaugeJetAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/JetDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/JetDeriv.lean new file mode 100644 index 000000000..bdd3c6f76 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/JetDeriv.lean @@ -0,0 +1,377 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic + +/-! +# The formal total derivative on the gauge-boson jet algebra + +## i. Overview + +The formal total spacetime derivative extends from the component functions of the gauge +bosons to their whole jet algebra as a derivation: it is +`SymmetricAlgebra.derivationOfLinear` applied to the shift `∂_s A_μ^φ ↦ ∂_{s + {ν}} A_μ^φ` +on the jet component space, which is right multiplication by the derivative symbol `∂_ν` +on the `DerivAlgebraReal` factor. + +The four directional derivatives commute and iterate along a multiset of directions. The +jet algebra is generated by the gauge fields and their iterated derivatives, and the +derivative extends to the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra` by base change, where +the ambient Lagrangian theory uses it. + +## ii. Key results + +- `GaugeBoson.JetComponentSpace.jetDeriv` : the derivative shift on the component space. +- `GaugeJetAlgebra.jetDeriv` : the formal total derivative, a derivation. +- `GaugeJetAlgebra.iteratedJetDeriv` : the iterated derivative along a multiset. +- `GaugeJetAlgebra.iteratedJetDeriv_ofA` : `∂_s A_μ^φ` as a generator. +- `GaugeJetAlgebra.adjoin_iteratedJetDeriv_eq_top` : the algebra is generated by the + gauge fields and their derivatives. +- `GaugeJetAlgebra.complexJetDeriv` : the derivative on the complexification. + +## iii. Table of contents + +- A. The derivative on the jet component space +- B. The total derivative on the jet algebra +- C. The iterated total derivative +- D. Generation by the gauge fields and their derivatives +- E. The derivative on the complexification + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + + +open TensorProduct + +/-! + +## A. The derivative on the jet component space + +-/ + +namespace GaugeBoson + +variable (𝔤) in +/-- The derivative of components in the jet component space, in the direction `ν`: the + shift `∂_s A_μ^φ ↦ ∂_{s + {ν}} A_μ^φ` of the derivative label, i.e. right multiplication + by the degree-one symbol `∂_ν` on the `DerivAlgebraReal` factor. -/ +noncomputable def JetComponentSpace.jetDeriv (ν : Fin 1 ⊕ Fin 3) : + (JetComponentSpace 𝔤) →ₗ[ℝ] (JetComponentSpace 𝔤) := + TensorProduct.map + (LinearMap.mulRight ℝ + (DerivAlgebraReal.basisMultiset ({ν} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id + +@[simp] +lemma JetComponentSpace.jetDeriv_tmul (ν : Fin 1 ⊕ Fin 3) (a : DerivAlgebraReal) + (φ : Module.Dual ℝ (GaugeBoson 𝔤)) : + (JetComponentSpace.jetDeriv 𝔤) ν (a ⊗ₜ[ℝ] φ) + = (a * DerivAlgebraReal.basisMultiset + ({ν} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℝ] φ := rfl + +/-- Total derivatives commute on the component space: the derivative labels live in a + symmetric algebra. -/ +lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + ((JetComponentSpace.jetDeriv 𝔤) μ).comp ((JetComponentSpace.jetDeriv 𝔤) ν) + = ((JetComponentSpace.jetDeriv 𝔤) ν).comp ((JetComponentSpace.jetDeriv 𝔤) μ) := by + have hmul : ∀ b c : DerivAlgebraReal, + (LinearMap.mulRight ℝ b).comp (LinearMap.mulRight ℝ c) + = LinearMap.mulRight ℝ (c * b) := + fun b c => LinearMap.ext fun x => by + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.mulRight_apply, + mul_assoc] + rw [JetComponentSpace.jetDeriv, JetComponentSpace.jetDeriv, ← TensorProduct.map_comp, + ← TensorProduct.map_comp, hmul, hmul, mul_comm] + +end GaugeBoson + +namespace GaugeJetAlgebra + +/-! + +## B. The total derivative on the jet algebra + +-/ + +variable (𝔤) in +/-- The formal total spacetime derivative on the gauge-boson jet algebra in the direction + `ν`: the derivation extending the shift `∂_s A_μ^φ ↦ ∂_{s + {ν}} A_μ^φ` of the component + functions. -/ +noncomputable def jetDeriv (ν : Fin 1 ⊕ Fin 3) : (GaugeJetAlgebra 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤) := + SymmetricAlgebra.derivationOfLinear ((GaugeBoson.JetComponentSpace.jetDeriv 𝔤) ν) + +@[simp] +lemma jetDeriv_ι (ν : Fin 1 ⊕ Fin 3) (x : (GaugeBoson.JetComponentSpace 𝔤)) : + (jetDeriv 𝔤) ν (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.ι ℝ _ ((GaugeBoson.JetComponentSpace.jetDeriv 𝔤) ν x) := + SymmetricAlgebra.derivationOfLinear_ι _ x + +@[simp] +lemma jetDeriv_one (ν : Fin 1 ⊕ Fin 3) : (jetDeriv 𝔤) ν (1 : (GaugeJetAlgebra 𝔤)) = 0 := + SymmetricAlgebra.derivationOfLinear_one _ + +@[simp] +lemma jetDeriv_algebraMap (ν : Fin 1 ⊕ Fin 3) (r : ℝ) : + (jetDeriv 𝔤) ν (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) = 0 := + SymmetricAlgebra.derivationOfLinear_algebraMap _ r + +/-- The total derivative is a derivation: the Leibniz rule. -/ +lemma jetDeriv_mul (ν : Fin 1 ⊕ Fin 3) (x y : (GaugeJetAlgebra 𝔤)) : + (jetDeriv 𝔤) ν (x * y) = (jetDeriv 𝔤) ν x * y + x * (jetDeriv 𝔤) ν y := + SymmetricAlgebra.derivationOfLinear_mul _ x y + +/-- Mixed partials agree on the jet algebra. -/ +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : (GaugeJetAlgebra 𝔤)) : + (jetDeriv 𝔤) μ ((jetDeriv 𝔤) ν x) = (jetDeriv 𝔤) ν ((jetDeriv 𝔤) μ x) := + SymmetricAlgebra.derivationOfLinear_comm_apply + (GaugeBoson.JetComponentSpace.jetDeriv_comm μ ν) x + +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + ((jetDeriv 𝔤) μ).comp ((jetDeriv 𝔤) ν) = ((jetDeriv 𝔤) ν).comp ((jetDeriv 𝔤) μ) := + LinearMap.ext fun x => jetDeriv_comm_apply μ ν x + +/-! + +## C. The iterated total derivative + +-/ + +instance : RightCommutative + (fun (D : (GaugeJetAlgebra 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤)) (μ : Fin 1 ⊕ Fin 3) => + D.comp ((jetDeriv 𝔤) μ)) where + right_comm D μ ν := by + show (D.comp ((jetDeriv 𝔤) μ)).comp ((jetDeriv 𝔤) ν) = (D.comp ((jetDeriv 𝔤) ν)).comp + ((jetDeriv 𝔤) μ) + rw [LinearMap.comp_assoc, LinearMap.comp_assoc, jetDeriv_comm] + +variable (𝔤) in +/-- The iterated total derivative `∂_s` along a multiset `s` of directions, well defined + because the directional derivatives commute. -/ +noncomputable def iteratedJetDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : + (GaugeJetAlgebra 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤) := + s.foldl (fun D μ => D.comp ((jetDeriv 𝔤) μ)) LinearMap.id + +@[simp] +lemma iteratedJetDeriv_zero : + (iteratedJetDeriv 𝔤) (0 : Multiset (Fin 1 ⊕ Fin 3)) = LinearMap.id := rfl + +/-- Any initial map factors out of the fold defining the iterated derivative. -/ +lemma foldl_comp_eq (s : Multiset (Fin 1 ⊕ Fin 3)) : + ∀ D : (GaugeJetAlgebra 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤), + s.foldl (fun D μ => D.comp ((jetDeriv 𝔤) μ)) D = D ∘ₗ (iteratedJetDeriv 𝔤) s := by + induction s using Multiset.induction_on with + | empty => + intro D + rw [iteratedJetDeriv_zero] + rfl + | cons ν t ih => + intro D + rw [iteratedJetDeriv, Multiset.foldl_cons, Multiset.foldl_cons, ih, ih, + LinearMap.id_comp, LinearMap.comp_assoc] + +lemma iteratedJetDeriv_cons (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (iteratedJetDeriv 𝔤) (μ ::ₘ s) = (jetDeriv 𝔤) μ ∘ₗ (iteratedJetDeriv 𝔤) s := by + rw [iteratedJetDeriv, Multiset.foldl_cons, foldl_comp_eq, LinearMap.id_comp] + +@[simp] +lemma iteratedJetDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + (iteratedJetDeriv 𝔤) ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = (jetDeriv 𝔤) μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, iteratedJetDeriv_cons, + iteratedJetDeriv_zero, LinearMap.comp_id] + +/-- Differentiating along `s + t` is differentiating along `t` and then along `s`. -/ +lemma iteratedJetDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + (iteratedJetDeriv 𝔤) (s + t) = (iteratedJetDeriv 𝔤) t ∘ₗ (iteratedJetDeriv 𝔤) s := by + induction t using Multiset.induction_on with + | empty => rw [add_zero, iteratedJetDeriv_zero, LinearMap.id_comp] + | cons μ t ih => + rw [show s + μ ::ₘ t = μ ::ₘ (s + t) from by + rw [← Multiset.singleton_add, ← Multiset.singleton_add, ← add_assoc, + add_comm s ({μ} : Multiset (Fin 1 ⊕ Fin 3)), add_assoc], + iteratedJetDeriv_cons, ih, iteratedJetDeriv_cons, LinearMap.comp_assoc] + +/-- On a component function the iterated derivative writes the derivative symbol `∂_s` + into the derivative label. -/ +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (a : DerivAlgebraReal) + (φ : Module.Dual ℝ (GaugeBoson 𝔤)) : + (iteratedJetDeriv 𝔤) s (SymmetricAlgebra.ι ℝ _ (a ⊗ₜ[ℝ] φ)) + = SymmetricAlgebra.ι ℝ _ + ((a * DerivAlgebraReal.basisMultiset s) ⊗ₜ[ℝ] φ) := by + induction s using Multiset.induction_on generalizing a with + | empty => + rw [iteratedJetDeriv_zero, LinearMap.id_apply, + DerivAlgebraReal.basisMultiset_nil, mul_one] + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, ih, jetDeriv_ι, + GaugeBoson.JetComponentSpace.jetDeriv_tmul, mul_assoc, + DerivAlgebraReal.basisMultiset_mul, + show s + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ s from by + rw [add_comm, Multiset.singleton_add]] + +/-- **The derivative generator `∂_s A_μ^φ`**: the iterated derivative of the gauge-field + component function. -/ +lemma iteratedJetDeriv_ofA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ) + = SymmetricAlgebra.ι ℝ _ + (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] + (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ) φ) := by + rw [ofA_apply, ofComponent_apply, iteratedJetDeriv_ι, one_mul] + +/-! + +## D. Generation by the gauge fields and their derivatives + +-/ + +/-- Every covector on the gauge-boson target space decomposes along the Lorentz coordinate + directions into component covectors: the spacetime index is expanded in the coordinate + basis, while the adjoint index stays abstract. -/ +lemma _root_.GaugeBoson.dual_eq_sum_componentDual + (ψ : Module.Dual ℝ (GaugeBoson 𝔤)) : + ψ = ∑ μ, (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ) + (ψ ∘ₗ (GaugeBoson.valLinEquiv 𝔤).symm.toLinearMap ∘ₗ + TensorProduct.mk ℝ Lorentz.CoVector 𝔤 (Lorentz.CoVector.basis μ)) := by + refine LinearMap.ext fun v => ?_ + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : (GaugeBoson 𝔤)) = 0 from rfl] + simp + | tmul x a => + rw [LinearMap.sum_apply] + have hx : (⟨x ⊗ₜ[ℝ] a⟩ : (GaugeBoson 𝔤)) + = ∑ μ, Lorentz.CoVector.basis.dualBasis μ x • + (⟨Lorentz.CoVector.basis μ ⊗ₜ[ℝ] a⟩ : (GaugeBoson 𝔤)) := by + apply (GaugeBoson.valLinEquiv 𝔤).injective + rw [map_sum] + conv_lhs => + rw [GaugeBoson.valLinEquiv_apply, + show (⟨x ⊗ₜ[ℝ] a⟩ : (GaugeBoson 𝔤)).val = x ⊗ₜ[ℝ] a from rfl, + ← Lorentz.CoVector.basis.sum_repr x, TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_smul, GaugeBoson.valLinEquiv_apply, + show (⟨Lorentz.CoVector.basis μ ⊗ₜ[ℝ] a⟩ : (GaugeBoson 𝔤)).val + = Lorentz.CoVector.basis μ ⊗ₜ[ℝ] a from rfl, ← TensorProduct.smul_tmul', + Module.Basis.dualBasis_apply] + conv_lhs => rw [hx, map_sum] + refine Finset.sum_congr rfl fun μ _ => ?_ + rw [map_smul, GaugeBoson.componentDual_apply_val_tmul, smul_eq_mul] + rfl + | add m₁ m₂ h₁ h₂ => + simp only [show (⟨m₁ + m₂⟩ : (GaugeBoson 𝔤)) = (⟨m₁⟩ : (GaugeBoson 𝔤)) + ⟨m₂⟩ from rfl, + map_add, LinearMap.sum_apply] at h₁ h₂ ⊢ + rw [h₁, h₂, ← Finset.sum_add_distrib] + +set_option maxHeartbeats 1000000 in +/-- **The jet algebra is generated by the gauge fields and their derivatives.** Every + element is a polynomial in the derivative generators `∂_s A_μ^φ` — nothing else is + available to write down for the gauge sector of a Lagrangian. -/ +theorem adjoin_iteratedJetDeriv_eq_top : + Algebra.adjoin ℝ + (⋃ s : Multiset (Fin 1 ⊕ Fin 3), ⋃ μ : Fin 1 ⊕ Fin 3, + Set.range (fun φ : Module.Dual ℝ 𝔤 => (iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ))) + = (⊤ : Subalgebra ℝ (GaugeJetAlgebra 𝔤)) := by + set S : Set (GaugeJetAlgebra 𝔤) := + ⋃ s : Multiset (Fin 1 ⊕ Fin 3), ⋃ μ : Fin 1 ⊕ Fin 3, + Set.range (fun φ : Module.Dual ℝ 𝔤 => (iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ)) + with hS + /- The derivative generators lie in the adjoined set. -/ + have hgen : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), + SymmetricAlgebra.ι ℝ _ (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] + (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ) φ) + ∈ Algebra.adjoin ℝ S := by + intro s μ φ + rw [← iteratedJetDeriv_ofA, hS] + exact Algebra.subset_adjoin + (Set.mem_iUnion.mpr ⟨s, Set.mem_iUnion.mpr ⟨μ, ⟨φ, rfl⟩⟩⟩) + /- Any covector slot: expand the spacetime index in the coordinate basis. -/ + have hcomp : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ (GaugeBoson 𝔤)), + SymmetricAlgebra.ι ℝ _ (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + ∈ Algebra.adjoin ℝ S := by + intro s ψ + rw [show DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ + = ∑ μ, DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] + (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ) + (ψ ∘ₗ (GaugeBoson.valLinEquiv 𝔤).symm.toLinearMap ∘ₗ + TensorProduct.mk ℝ Lorentz.CoVector 𝔤 + (Lorentz.CoVector.basis μ)) from by + conv_lhs => rw [GaugeBoson.dual_eq_sum_componentDual ψ] + rw [TensorProduct.tmul_sum], map_sum] + exact Subalgebra.sum_mem _ fun μ _ => hgen s μ _ + /- The derivative monomials span the `DerivAlgebraReal` factor. -/ + refine top_le_iff.mp ?_ + rw [← adjoin_ι_eq_top] + refine Algebra.adjoin_le ?_ + rintro _ ⟨x, rfl⟩ + induction x using TensorProduct.induction_on with + | zero => rw [map_zero]; exact zero_mem _ + | add y z hy hz => rw [map_add]; exact add_mem hy hz + | tmul a ψ => + have ha : a ∈ Submodule.span ℝ (Set.range DerivAlgebraReal.basisMultiset) := by + rw [DerivAlgebraReal.basisMultiset.span_eq]; trivial + induction ha using Submodule.span_induction with + | mem b hb => obtain ⟨s, rfl⟩ := hb; exact hcomp s ψ + | zero => rw [TensorProduct.zero_tmul, map_zero]; exact zero_mem _ + | add b c _ _ hb hc => rw [TensorProduct.add_tmul, map_add]; exact add_mem hb hc + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul] + exact Subalgebra.smul_mem _ hb c + +/-! + +## E. The derivative on the complexification + +-/ + +variable (𝔤) in +/-- The formal total derivative on the complexified gauge-boson jet algebra, by base + change. This is the derivative the ambient Lagrangian theory uses. -/ +noncomputable def complexJetDeriv (ν : Fin 1 ⊕ Fin 3) : + ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤) →ₗ[ℂ] ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤) := + LinearMap.baseChange ℂ ((jetDeriv 𝔤) ν) + +@[simp] +lemma complexJetDeriv_tmul (ν : Fin 1 ⊕ Fin 3) (z : ℂ) (x : (GaugeJetAlgebra 𝔤)) : + (complexJetDeriv 𝔤) ν (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] (jetDeriv 𝔤) ν x := rfl + +set_option maxHeartbeats 1000000 in +/-- The Leibniz rule on the complexification. -/ +lemma complexJetDeriv_mul (ν : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : + (complexJetDeriv 𝔤) ν (x * y) + = (complexJetDeriv 𝔤) ν x * y + x * (complexJetDeriv 𝔤) ν y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => + rw [add_mul, map_add, map_add, h₁, h₂, add_mul, add_mul] + abel + | tmul z₁ a₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => + rw [mul_add, map_add, map_add, h₁, h₂, mul_add, mul_add] + abel + | tmul z₂ a₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, complexJetDeriv_tmul, complexJetDeriv_tmul, + complexJetDeriv_tmul, jetDeriv_mul, TensorProduct.tmul_add, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul] + +/-- The complexified total derivatives commute. -/ +lemma complexJetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + ((complexJetDeriv 𝔤) μ).comp ((complexJetDeriv 𝔤) ν) + = ((complexJetDeriv 𝔤) ν).comp ((complexJetDeriv 𝔤) μ) := by + rw [complexJetDeriv, complexJetDeriv, ← LinearMap.baseChange_comp, + ← LinearMap.baseChange_comp, jetDeriv_comm] + +end GaugeJetAlgebra + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LorentzAction.lean new file mode 100644 index 000000000..18fcc2a34 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LorentzAction.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.Relativity.IsLorentzDeriv + +/-! +# The Lorentz action on the gauge-boson jet algebra + +## i. Overview + +The Lorentz group acts on the jet algebra of the gauge bosons by the symmetric-algebra +functor applied to its action on the jet component space: the derivative labels transform +in `DerivAlgebraReal` and the target index contragrediently through the covector action on +`GaugeBoson`. The formal total derivative is a Lorentz vector for this action; on the +complexification this is packaged as a `Lorentz.IsLorentzDeriv` instance, giving access to +the boost-weight machinery. + +## ii. Key results + +- `GaugeBoson.JetComponentSpace.repLorentzGroup` : the Lorentz action on the component + space. +- `GaugeJetAlgebra.repLorentzGroup` : the Lorentz action on the jet algebra. +- `GaugeJetAlgebra.repLorentzGroup_jetDeriv` : the total derivative is a Lorentz vector. +- `GaugeJetAlgebra.complexRepLorentzGroup` : the action on the complexification. +- `GaugeJetAlgebra.instIsLorentzDeriv` : the `Lorentz.IsLorentzDeriv` instance. + +## iii. Table of contents + +- A. The Lorentz action on the component space + - A.1. Covariance of the derivative shift +- B. The Lorentz action on the jet algebra +- C. Lorentz covariance of the total derivative +- D. The complexified action + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + +set_option maxHeartbeats 1000000 + + +open TensorProduct Matrix MatrixGroups + +/-! + +## A. The Lorentz action on the component space + +-/ + +namespace GaugeBoson + +variable (𝔤) in +/-- The Lorentz action on the jet component space of the gauge bosons: the derivative + label transforms in `DerivAlgebraReal`, the target index contragrediently. -/ +noncomputable def JetComponentSpace.repLorentzGroup : + Representation ℝ SL(2,ℂ) (JetComponentSpace 𝔤) := + DerivAlgebraReal.repLorentzGroup.tprod (GaugeBoson.repLorentzGroup 𝔤).dual + +/-! + +### A.1. Covariance of the derivative shift + +-/ + +/-- The Lorentz action on the singleton derivative symbol: the derivative slot transforms + by the columns of the Lorentz matrix. -/ +lemma _root_.DerivAlgebraReal.repLorentzGroup_basis_singleton + (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + DerivAlgebraReal.repLorentzGroup Λ + (DerivAlgebraReal.basisMultiset ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • + DerivAlgebraReal.basisMultiset ({a} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [DerivAlgebraReal.basisMultiset_singleton, + DerivAlgebraReal.repLorentzGroup_apply_ι, Lorentz.CoVector.sl2Rep_dual_dualBasis, + map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, DerivAlgebraReal.basisMultiset_singleton] + +/-- **The derivative shift is a Lorentz vector on the component space**: appending `∂_μ` + and then acting is acting and then appending the transformed `∂_μ`. -/ +lemma JetComponentSpace.repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (v : (JetComponentSpace 𝔤)) : + (JetComponentSpace.repLorentzGroup 𝔤) Λ ((JetComponentSpace.jetDeriv 𝔤) μ v) = + ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • + (JetComponentSpace.jetDeriv 𝔤) a ((JetComponentSpace.repLorentzGroup 𝔤) Λ v) := by + induction v using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul q f => + rw [JetComponentSpace.jetDeriv_tmul, + show (JetComponentSpace.repLorentzGroup 𝔤) Λ + ((q * DerivAlgebraReal.basisMultiset + ({μ} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℝ] f) + = (DerivAlgebraReal.repLorentzGroup Λ + (q * DerivAlgebraReal.basisMultiset + ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) ⊗ₜ[ℝ] + ((GaugeBoson.repLorentzGroup 𝔤).dual Λ f) from rfl, + DerivAlgebraReal.repLorentzGroup_apply_mul, + DerivAlgebraReal.repLorentzGroup_basis_singleton, Finset.mul_sum, + TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [mul_smul_comm, ← TensorProduct.smul_tmul', + show (JetComponentSpace.repLorentzGroup 𝔤) Λ (q ⊗ₜ[ℝ] f) + = (DerivAlgebraReal.repLorentzGroup Λ q) ⊗ₜ[ℝ] + ((GaugeBoson.repLorentzGroup 𝔤).dual Λ f) from rfl, + JetComponentSpace.jetDeriv_tmul] + +end GaugeBoson + +namespace GaugeJetAlgebra + +/-! + +## B. The Lorentz action on the jet algebra + +-/ + +variable (𝔤) in +/-- **The Lorentz action on the gauge-boson jet algebra**: the symmetric-algebra functor + applied to the Lorentz action on the jet component space. -/ +noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) (GaugeJetAlgebra 𝔤) where + toFun Λ := + (SymmetricAlgebra.map ((GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤) Λ)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, SymmetricAlgebra.map_id, AlgHom.toLinearMap_id] + map_mul' Λ₁ Λ₂ := by + simp only [map_mul, Module.End.mul_eq_comp, ← SymmetricAlgebra.map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : (GaugeJetAlgebra 𝔤)) : + (repLorentzGroup 𝔤) Λ x = + SymmetricAlgebra.map ((GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤) Λ) x := rfl + +@[simp] +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + (repLorentzGroup 𝔤) Λ (1 : (GaugeJetAlgebra 𝔤)) = 1 := by + simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : (GaugeJetAlgebra 𝔤)) : + (repLorentzGroup 𝔤) Λ (x * y) = (repLorentzGroup 𝔤) Λ x * (repLorentzGroup 𝔤) Λ y := by + simp [repLorentzGroup_apply] + +@[simp] +lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (v : (GaugeBoson.JetComponentSpace 𝔤)) : + (repLorentzGroup 𝔤) Λ (SymmetricAlgebra.ι ℝ _ v) = + SymmetricAlgebra.ι ℝ _ ((GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤) Λ v) := by + rw [repLorentzGroup_apply, SymmetricAlgebra.map_apply_ι] + +/-! + +## C. Lorentz covariance of the total derivative + +-/ + +/-- **The total derivative on the gauge-boson jet algebra is a Lorentz vector.** -/ +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : (GaugeJetAlgebra 𝔤)) : + (repLorentzGroup 𝔤) Λ ((jetDeriv 𝔤) μ x) = + ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • + (jetDeriv 𝔤) a ((repLorentzGroup 𝔤) Λ x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => + rw [jetDeriv_algebraMap, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, repLorentzGroup_ι, repLorentzGroup_ι, + GaugeBoson.JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + +/-! + +## D. The complexified action + +-/ + +variable (𝔤) in +/-- The Lorentz action on the complexified gauge-boson jet algebra, by base change. -/ +noncomputable def complexRepLorentzGroup : + Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) where + toFun Λ := LinearMap.baseChange ℂ ((repLorentzGroup 𝔤) Λ) + map_one' := by + rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] + map_mul' Λ₁ Λ₂ := by + rw [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp, Module.End.mul_eq_comp] + +@[simp] +lemma complexRepLorentzGroup_tmul (Λ : SL(2,ℂ)) (z : ℂ) (x : (GaugeJetAlgebra 𝔤)) : + (complexRepLorentzGroup 𝔤) Λ (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] (repLorentzGroup 𝔤) Λ x := rfl + +lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : + (complexRepLorentzGroup 𝔤) Λ (x * y) + = (complexRepLorentzGroup 𝔤) Λ x * (complexRepLorentzGroup 𝔤) Λ y := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x₁ x₂ h₁ h₂ => rw [add_mul, map_add, map_add, h₁, h₂, add_mul] + | tmul z₁ a₁ => + induction y using TensorProduct.induction_on with + | zero => simp + | add y₁ y₂ h₁ h₂ => rw [mul_add, map_add, map_add, h₁, h₂, mul_add] + | tmul z₂ a₂ => + rw [Algebra.TensorProduct.tmul_mul_tmul, complexRepLorentzGroup_tmul, + complexRepLorentzGroup_tmul, complexRepLorentzGroup_tmul, + repLorentzGroup_apply_mul, Algebra.TensorProduct.tmul_mul_tmul] + +/-- **The complexified total derivative is a Lorentz vector.** -/ +lemma complexRepLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (x : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : + (complexRepLorentzGroup 𝔤) Λ ((complexJetDeriv 𝔤) μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + (complexJetDeriv 𝔤) a ((complexRepLorentzGroup 𝔤) Λ x) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul z a => + rw [complexJetDeriv_tmul, complexRepLorentzGroup_tmul, repLorentzGroup_jetDeriv, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [TensorProduct.tmul_smul, complexRepLorentzGroup_tmul, complexJetDeriv_tmul, + show ((((Lorentz.SL2C.toLorentzGroup Λ).1 c μ : ℝ)) : ℂ) + = algebraMap ℝ ℂ ((Lorentz.SL2C.toLorentzGroup Λ).1 c μ) from rfl, + algebraMap_smul] + +/-- The complexified total derivatives form a Lorentz derivative, giving access to the + boost-weight machinery. -/ +instance instIsLorentzDeriv : + Lorentz.IsLorentzDeriv (complexRepLorentzGroup 𝔤) (complexJetDeriv 𝔤) where + rep_deriv := complexRepLorentzGroup_jetDeriv _ _ _ + +/-! + +## E. The Lorentz law of the gauge-field generators + +-/ + +/-- The contragredient Lorentz action passes through a component covector to its spacetime + slot: the adjoint index is Lorentz-inert. -/ +lemma _root_.GaugeBoson.repLorentzGroup_dual_componentDual (Λ : SL(2,ℂ)) + (ω : Module.Dual ℝ Lorentz.CoVector) (φ : Module.Dual ℝ 𝔤) : + (GaugeBoson.repLorentzGroup 𝔤).dual Λ ((GaugeBoson.componentDual 𝔤) ω φ) + = (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.sl2Rep.dual Λ ω) φ := by + refine LinearMap.ext fun v => ?_ + obtain ⟨m⟩ := v + induction m using TensorProduct.induction_on with + | zero => + rw [show (⟨0⟩ : (GaugeBoson 𝔤)) = 0 from rfl, map_zero, map_zero] + | tmul x a => + rw [Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply, + show (GaugeBoson.repLorentzGroup 𝔤) Λ⁻¹ (⟨x ⊗ₜ[ℝ] a⟩ : (GaugeBoson 𝔤)) + = ⟨(Lorentz.CoVector.sl2Rep Λ⁻¹ x) ⊗ₜ[ℝ] a⟩ from rfl, + GaugeBoson.componentDual_apply_val_tmul, GaugeBoson.componentDual_apply_val_tmul, + Representation.dual_apply, Module.Dual.transpose_apply, LinearMap.comp_apply] + | add m₁ m₂ h₁ h₂ => + rw [show (⟨m₁ + m₂⟩ : (GaugeBoson 𝔤)) = (⟨m₁⟩ : (GaugeBoson 𝔤)) + ⟨m₂⟩ from rfl, map_add, + map_add, h₁, h₂] + +/-- **The gauge field is a Lorentz covector**: the generator `A_μ^φ` mixes into the `A_a^φ` + by the columns of the Lorentz matrix, with the adjoint index untouched. -/ +lemma repLorentzGroup_ofA (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (repLorentzGroup 𝔤) Λ ((ofA 𝔤) μ φ) + = ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • (ofA 𝔤) a φ := by + rw [ofA_apply, ofComponent_apply, repLorentzGroup_ι, + show (GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤) Λ + ((1 : DerivAlgebraReal) ⊗ₜ[ℝ] (GaugeBoson.componentDual 𝔤) + (Lorentz.CoVector.basis.dualBasis μ) φ) + = (DerivAlgebraReal.repLorentzGroup Λ (1 : DerivAlgebraReal)) ⊗ₜ[ℝ] + ((GaugeBoson.repLorentzGroup 𝔤).dual Λ ((GaugeBoson.componentDual 𝔤) + (Lorentz.CoVector.basis.dualBasis μ) φ)) from rfl, + DerivAlgebraReal.repLorentzGroup_apply_one, + GaugeBoson.repLorentzGroup_dual_componentDual, + Lorentz.CoVector.sl2Rep_dual_dualBasis, map_sum, LinearMap.sum_apply, + TensorProduct.tmul_sum, map_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_smul, LinearMap.smul_apply, TensorProduct.tmul_smul, map_smul, ofA_apply, + ofComponent_apply] + +/-- The Lorentz law of the gauge-field generators on the complexification. -/ +lemma complexRepLorentzGroup_one_tmul_ofA (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (complexRepLorentzGroup 𝔤) Λ ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ φ) + = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) a φ) := by + rw [complexRepLorentzGroup_tmul, repLorentzGroup_ofA, TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [TensorProduct.tmul_smul, + show ((((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ)) : ℂ) + = algebraMap ℝ ℂ ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) from rfl, + algebraMap_smul] + +end GaugeJetAlgebra + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/MassDim.lean new file mode 100644 index 000000000..285329f4f --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/MassDim.lean @@ -0,0 +1,154 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv + +/-! +# Mass dimension on the gauge-boson jet algebra + +## i. Overview + +The mass dimension of the gauge bosons is tracked multiplicatively through the +*mass-weight scaling*: the algebra endomorphism multiplying each generator `∂_s A_μ^φ` by +`c ^ (2 + 2 |s|)` — the gauge field has mass dimension one, i.e. mass weight two, and each +derivative adds mass weight two. A monomial of total mass weight `n` is scaled by `c ^ n`, +so the scaling records the mass-weight grading of the jet algebra. This mirrors +`Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.MassDim`, on the real, single-half +component space of the gauge bosons. + +## ii. Key results + +- `GaugeBoson.JetComponentSpace.massWeightScale` : the scaling on the component space. +- `GaugeJetAlgebra.massWeightScale` : the mass-weight scaling. +- `GaugeJetAlgebra.massWeightScale_ofA` : the gauge field carries mass weight two. +- `GaugeJetAlgebra.massWeightScale_jetDeriv` : a derivative adds mass weight two. +- `GaugeJetAlgebra.massWeightScale_iteratedJetDeriv` : `∂_s` adds mass weight `2 |s|`. + +## iii. Table of contents + +- A. The mass-weight scaling on the component space +- B. The mass-weight scaling on the jet algebra +- C. The mass weight of the gauge field and its derivatives + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + + +open TensorProduct + +/-! + +## A. The mass-weight scaling on the component space + +-/ + +namespace GaugeBoson + +variable (𝔤) in +/-- The mass-weight scaling on the jet component space of the gauge bosons: the generator + `∂_s A_μ^φ` is scaled by `c ^ (2 + 2 |s|)`, through the derivative-degree scaling + `DerivAlgebraReal.gradeScale` on the derivative label. -/ +noncomputable def JetComponentSpace.massWeightScale (c : ℝ) : + (JetComponentSpace 𝔤) →ₗ[ℝ] (JetComponentSpace 𝔤) := + c ^ 2 • TensorProduct.map (DerivAlgebraReal.gradeScale (c ^ 2)).toLinearMap LinearMap.id + +lemma JetComponentSpace.massWeightScale_tmul (c : ℝ) (a : DerivAlgebraReal) + (φ : Module.Dual ℝ (GaugeBoson 𝔤)) : + (JetComponentSpace.massWeightScale 𝔤) c (a ⊗ₜ[ℝ] φ) + = c ^ 2 • (DerivAlgebraReal.gradeScale (c ^ 2) a ⊗ₜ[ℝ] φ) := rfl + +/-- **The derivative shift carries mass weight two** on the component space. -/ +lemma JetComponentSpace.massWeightScale_jetDeriv (c : ℝ) (μ : Fin 1 ⊕ Fin 3) + (v : (JetComponentSpace 𝔤)) : + (JetComponentSpace.massWeightScale 𝔤) c ((JetComponentSpace.jetDeriv 𝔤) μ v) + = c ^ 2 • (JetComponentSpace.jetDeriv 𝔤) μ ((JetComponentSpace.massWeightScale 𝔤) c v) := by + induction v using TensorProduct.induction_on with + | zero => simp only [map_zero, smul_zero] + | add x y hx hy => simp only [map_add, hx, hy, smul_add] + | tmul a φ => + rw [JetComponentSpace.jetDeriv_tmul, JetComponentSpace.massWeightScale_tmul, map_mul, + DerivAlgebraReal.basisMultiset_singleton, + DerivAlgebraReal.gradeScale_ι, ← DerivAlgebraReal.basisMultiset_singleton, + JetComponentSpace.massWeightScale_tmul, map_smul, JetComponentSpace.jetDeriv_tmul, + mul_smul_comm, TensorProduct.smul_tmul', smul_smul, smul_smul, mul_comm (c ^ 2)] + rfl + +end GaugeBoson + +namespace GaugeJetAlgebra + +/-! + +## B. The mass-weight scaling on the jet algebra + +-/ + +variable (𝔤) in +/-- **The mass-weight scaling on the gauge-boson jet algebra**: the algebra endomorphism + scaling the generator `∂_s A_μ^φ` by `c ^ (2 + 2 |s|)`, the functorial lift of the + scaling on the jet component space. -/ +noncomputable def massWeightScale (c : ℝ) : (GaugeJetAlgebra 𝔤) →ₐ[ℝ] (GaugeJetAlgebra 𝔤) := + SymmetricAlgebra.map ((GaugeBoson.JetComponentSpace.massWeightScale 𝔤) c) + +@[simp] +lemma massWeightScale_ι (c : ℝ) (x : (GaugeBoson.JetComponentSpace 𝔤)) : + (massWeightScale 𝔤) c (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.ι ℝ _ ((GaugeBoson.JetComponentSpace.massWeightScale 𝔤) c x) := + SymmetricAlgebra.map_apply_ι _ x + +/-! + +## C. The mass weight of the gauge field and its derivatives + +-/ + +/-- **The gauge field carries mass weight two** — mass dimension one. -/ +@[simp] +lemma massWeightScale_ofA (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (massWeightScale 𝔤) c ((ofA 𝔤) μ φ) = c ^ 2 • (ofA 𝔤) μ φ := by + rw [ofA_apply, ofComponent_apply, massWeightScale_ι, + GaugeBoson.JetComponentSpace.massWeightScale_tmul, map_one, map_smul] + +/-- **A total derivative adds mass weight two.** -/ +lemma massWeightScale_jetDeriv (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (x : (GaugeJetAlgebra 𝔤)) : + (massWeightScale 𝔤) c ((jetDeriv 𝔤) μ x) = c ^ 2 • (jetDeriv 𝔤) μ + ((massWeightScale 𝔤) c x) := by + induction x using SymmetricAlgebra.induction with + | algebraMap r => rw [jetDeriv_algebraMap, map_zero, AlgHom.commutes, jetDeriv_algebraMap, + smul_zero] + | ι v => + rw [jetDeriv_ι, massWeightScale_ι, massWeightScale_ι, jetDeriv_ι, ← map_smul] + exact congrArg (SymmetricAlgebra.ι ℝ _) + (GaugeBoson.JetComponentSpace.massWeightScale_jetDeriv c μ v) + | mul a b ha hb => + simp only [jetDeriv_mul, map_add, map_mul, ha, hb, smul_add, smul_mul_assoc, + mul_smul_comm] + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + +/-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ +lemma massWeightScale_iteratedJetDeriv (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : (GaugeJetAlgebra 𝔤)) : + (massWeightScale 𝔤) c ((iteratedJetDeriv 𝔤) s x) + = c ^ (2 * Multiset.card s) • (iteratedJetDeriv 𝔤) s ((massWeightScale 𝔤) c x) := by + induction s using Multiset.induction_on generalizing x with + | empty => simp + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, massWeightScale_jetDeriv, + show (massWeightScale 𝔤) c ((iteratedJetDeriv 𝔤) s x) + = c ^ (2 * Multiset.card s) • (iteratedJetDeriv 𝔤) s ((massWeightScale 𝔤) c x) from ih x, + map_smul, LinearMap.comp_apply, smul_smul, ← pow_add] + congr 2 + rw [Multiset.card_cons] + ring + +end GaugeJetAlgebra + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean new file mode 100644 index 000000000..f5124a3d4 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean @@ -0,0 +1,1139 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeJet +public import Physlib.Mathematics.MultisetAntidiagonal +public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.Relativity.Tensors.ComplexTensor.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic +public import Physlib.Relativity.Tensors.RealTensor.Vector.Representation +public import Physlib.Relativity.SL2C.Basic +/-! +# Algebra valued gauge bosons + +This file is stated for any `GaugeJet G 𝔤 G₀ 𝔤J` (jets of a gauge group `G₀` with Lie +algebra `𝔤`); the Standard Model is the instance in +`Physlib.Particles.StandardModel.GaugeGroup.Jet.GaugeJet`. + +An algebra `B` (for instance a jet algebra of Lagrangian terms) may contain a family of +elements playing the role of the gauge-field symbols `[∂_s A_μ^a]`. This file defines +what it means for such a family to *be* a set of gauge bosons: the structure +`IsGaugeField` records the transformation laws that the physicists' gauge field +satisfies, with nothing postulated beyond them. + +## The physics + +Let `A_μ^a` be a gauge field for the gauge group `G`, with `μ` a spacetime (covector) +index and `a` an adjoint index. Under a gauge transformation `g` the field transforms as + + `A_μ ↦ Ad_g A_μ + mc(g)_μ`, + +where `mc(g)_μ = i (∂_μ g) g⁻¹` is the Maurer–Cartan form. The symbols `[∂_s A_μ^a]` +are coordinate functions on the space of field configurations, so the induced (left) +action is the pullback along `g⁻¹`: one substitutes `g⁻¹` into the field law and +differentiates `s` times with the Leibniz rule: + + `g • [∂_s A_μ^a] = ∑_{x+y=s} C(x,y) (∂_x (Ad_{g⁻¹})^a_b)| [∂_y A_μ^b]` + ` + (∂_s mc(g⁻¹)_μ^a)|`, + +where `C(x,y)` is the multinomial coefficient of the splitting and `|` denotes +evaluation at the base point. All the data on the right is carried by the *jet* of the +gauge transformation, which is why the gauge representation below is a representation +of the jet group `G` and not merely of its value group `G₀`. + +## The formalization dictionary + +* `A μ φ` is the symbol `A_μ^a` contracted with a dual adjoint vector `φ`; the + derivative symbols `[∂_s A_μ^a]` are its images `iteratedD D deriv_comm s (A μ φ)` under the + total derivative `D`. +* `∂_x (Ad_{g⁻¹})^a_b|` acting on the dual index is `adjointDualCoeff g⁻¹ x φ`: + include the constant algebra element into jets, act by the adjoint of `g⁻¹`, + differentiate `x` times, evaluate at the base point, and pair with `φ`. +* The sum `∑_{x+y=s} C(x,y)` is the sum over `s.antidiagonal`: a splitting `(x, y)` + occurs in the antidiagonal of the multiset `s` with multiplicity exactly `C(x,y)`. +* `(∂_s mc(g⁻¹)_μ)|` is `JetGaugeAlgebra.eval (iteratedDeriv s (maurerCartanForm g⁻¹ μ))`, + a constant algebra element, paired with `φ` and embedded in `B` as a scalar. + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +open Matrix MatrixGroups TensorProduct MvPowerSeries +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable [GaugeJet G 𝔤 G₀ 𝔤J] + + +/-- The physicists' `∂_x (Ad_{U})^a_b|` acting on the dual adjoint index of a + gauge-field symbol: precomposition of `φ` with the constant inclusion into jets, + followed by the adjoint action of `U`, `x` formal derivatives, and evaluation at + the base point. For `x = 0` this is the dual (contragredient) adjoint action of + the value `U₀`; for `x ≠ 0` it sees the derivatives of the gauge transformation. -/ +noncomputable def adjointDualCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] Module.Dual ℝ 𝔤 := + ((GaugeJet.evalLie G (𝔤 := 𝔤)).toLinearMap ∘ₗ GaugeJet.iteratedDeriv G 𝔤 x ∘ₗ + GaugeJet.adjoint 𝔤 (G := G) U ∘ₗ GaugeJet.ofConstantLie G (𝔤 := 𝔤)).dualMap + +/-- The zeroth dual adjoint coefficient is the dual of the adjoint action of the + base-point value of the gauge jet. -/ +lemma adjointDualCoeff_zero (U : G) : + adjointDualCoeff (𝔤 := 𝔤) U 0 = (GaugeJet.adjointValue G (𝔤 := 𝔤) + (GaugeJet.eval 𝔤 (G := G) U)).dualMap := by + rw [adjointDualCoeff] + refine congrArg LinearMap.dualMap (LinearMap.ext fun a => ?_) + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, + GaugeJet.iteratedDeriv_zero, LinearMap.id_coe, id_eq] + exact GaugeJet.evalLie_adjoint_ofConstantLie U a + +/-- For a gauge jet whose value at the base point is the identity, the zeroth dual + adjoint coefficient is trivial: the base-point adjoint action `Ad_{U₀}` is the + identity. -/ +lemma adjointDualCoeff_zero_of_eval_eq_one {U : G} (hU : (GaugeJet.eval 𝔤 (G := G) U) = 1) : + adjointDualCoeff (𝔤 := 𝔤) U 0 = LinearMap.id := by + rw [adjointDualCoeff_zero, hU, map_one, Module.End.one_eq_id, LinearMap.dualMap_id] + +/-- The dual adjoint coefficient at a single derivative: since + `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆` (`GaugeJet.deriv_adjoint`) and constants + have vanishing derivative, the once-derived coefficient is minus the underived + coefficient precomposed (on the dual index) with `ad` of the base-point + Maurer–Cartan form. This is what cancels the Leibniz cross terms of + `gauge_apply_deriv` against the commutator cross terms in the field strength. -/ +lemma adjointDualCoeff_singleton (U : G) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + adjointDualCoeff U {μ} φ = + -adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U μ))) := by + refine LinearMap.ext fun a => ?_ + simp only [adjointDualCoeff, LinearMap.dualMap_apply, LinearMap.neg_apply, + LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, + GaugeJet.iteratedDeriv_singleton, GaugeJet.iteratedDeriv_zero, + LinearMap.id_coe, id_eq] + rw [GaugeJet.deriv_adjoint (G := G) (𝔤 := 𝔤), + GaugeJet.deriv_ofConstantLie (G := G) (𝔤 := 𝔤), map_zero, zero_sub, map_neg, + map_neg, LieHom.map_lie] + simp + +section Truncation + +variable [GaugeJetTruncation G 𝔤 G₀ 𝔤J] + +/-- **Deep kernels kill the positive dual adjoint coefficients**: for a jet trivial to + order `n`, all derivatives of the adjoint action up to order `n` vanish. -/ +lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {U : G} {n : ℕ} + (hU : U ∈ GaugeJetTruncation.truncationKer 𝔤 (G := G) n) {x : Multiset (Fin 1 ⊕ Fin 3)} + (hx : x ≠ 0) (hxn : x.card ≤ n) : adjointDualCoeff (𝔤 := 𝔤) U x = 0 := by + refine LinearMap.ext fun φ => LinearMap.ext fun b => ?_ + simp only [LinearMap.zero_apply] + show φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 x + (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) b)))) = 0 + rw [GaugeJetTruncation.evalLie_iteratedDeriv_adjoint_ofConstantLie_eq_zero hU hx hxn b, + map_zero] + +end Truncation + +open Lorentz + +/-- The family `A` of symbols in the algebra `B` is a gauge field for the total + derivative `D`, the Lorentz representation `repLorentz` and the gauge representation + `repGauge`, when it satisfies the transformation laws of the physicists' gauge field: + + * it presupposes (as arguments, not fields) that `D` is a Lorentz derivative — the + instance `Lorentz.IsLorentzDeriv repLorentz D` — and that its components commute + (`deriv_comm`), as total derivatives do; + * the symbol `A_μ^a` carries one covector index, transforming through the columns of + the Lorentz matrix (`lorentz_A`); + * under a gauge jet `U` the derivative symbols `[∂_s A_μ^a]` transform by the + Leibniz expansion of `A_μ ↦ Ad_{U⁻¹} A_μ + mc(U⁻¹)_μ` (`gauge_A`) — the adjoint + convolution plus the inhomogeneous Maurer–Cartan shift. The inverse makes the + action a left action, exactly as in `φ'(x) = φ(Λ⁻¹ x)`. -/ +structure IsGaugeField (repLorentz : Representation ℂ SL(2,ℂ) B) + (repGauge : Representation ℂ G B) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : Prop where + /-- The gauge-field symbol carries one covector Lorentz index. -/ + lorentz_apply : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), + repLorentz Λ (A (List.ofFn l) μ φ) = + ∑ (p : Fin n → (Fin 1 ⊕ Fin 3)), + (∏ (i : Fin n), (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • A (List.ofFn p) a φ + /-- The gauge transformation of the derivative symbols `[∂_s A_μ^a]`: the Leibniz + convolution of the dual adjoint action of `U⁻¹` against lower derivative symbols + (the multiset antidiagonal carries the multinomial coefficients), plus the + base-point value of the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ + gauge_apply_deriv : ∀ (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), + repGauge U (A s μ φ) = + (s.antidiagonal.map fun p => (A p.2 μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + + algebraMap ℂ B + (φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s + (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))) + /-- The gauge action preserves products: gauge transformations act on the algebra of + local expressions as algebra homomorphisms. -/ + gauge_mul : ∀ (U : G) (b₁ b₂ : B), + repGauge U (b₁ * b₂) = repGauge U b₁ * repGauge U b₂ + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ G B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + +/-- The canonical equivalence, through finite-dimensional duality, between + algebra-valued fields `B ⊗ 𝔤` and their component families `φ ↦ A^φ`: the element + `b ⊗ a` corresponds to the family `φ ↦ φ(a) b`. -/ +noncomputable def dualPairEquiv : + (B ⊗[ℝ] 𝔤) ≃ₗ[ℝ] (Module.Dual ℝ 𝔤 →ₗ[ℝ] B) := + TensorProduct.comm ℝ B 𝔤 ≪≫ₗ + TensorProduct.congr (Module.evalEquiv ℝ 𝔤) (LinearEquiv.refl ℝ B) ≪≫ₗ + dualTensorHomEquiv ℝ (Module.Dual ℝ 𝔤) B + +/-- The bracket of two algebra-valued fields: multiplication in `B` on the first + factors, the Lie bracket of the gauge algebra on the second, so that on pure + tensors `⁅b₁ ⊗ a₁, b₂ ⊗ a₂⁆ = (b₁ b₂) ⊗ ⁅a₁, a₂⁆`. -/ +noncomputable def tensorBracket : + (B ⊗[ℝ] 𝔤) →ₗ[ℝ] (B ⊗[ℝ] 𝔤) →ₗ[ℝ] B ⊗[ℝ] 𝔤 := + TensorProduct.curry + ((TensorProduct.map (TensorProduct.lift (LinearMap.mul ℝ B)) + (TensorProduct.lift (LinearMap.mk₂ ℝ (fun a b => ⁅a, b⁆) + (fun a a' b => add_lie a a' b) (fun t a b => smul_lie t a b) + (fun a b b' => lie_add a b b') (fun t a b => lie_smul t a b)))) ∘ₗ + (TensorProduct.tensorTensorTensorComm ℝ B 𝔤 B 𝔤).toLinearMap) + +/-- The commutator term `⁅A_μ, A_ν⁆` of the field strength, as a component family: + the physicists' `f^a_{bc} A_μ^b A_ν^c` contracted with a dual adjoint vector, but + basis-free — the two fields are assembled into `B ⊗ 𝔤` by `dualPairEquiv.symm`, + bracketed there by `tensorBracket`, and read back out as components. -/ +noncomputable def commutator + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + dualPairEquiv (tensorBracket (dualPairEquiv.symm (A 0 μ)) (dualPairEquiv.symm (A 0 ν))) + +/-- The gauge transformation of the underived symbol `A_μ^φ`: the special case `s = 0` + of `gauge_apply_deriv`, with no Leibniz convolution left over — the dual adjoint + action of the value of `U⁻¹` plus the Maurer–Cartan shift. -/ +lemma repGauge_apply (hA : IsGaugeField repLorentz repGauge A) (U : G) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repGauge U (A 0 μ φ) = A 0 μ (adjointDualCoeff U⁻¹ ∅ φ) + + algebraMap ℂ B (φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ))) := by + simpa [show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using + hA.gauge_apply_deriv U 0 μ φ + + +/-- The gauge transformation of the once-derived symbol `∂_ρ A_σ`: the case `s = {ρ}` + of `gauge_apply_deriv` — the two Leibniz splittings of one derivative, plus the + base-point value of the derived Maurer–Cartan form. -/ +lemma repGauge_deriv_apply (hA : IsGaugeField repLorentz repGauge A) + (U : G) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repGauge U (A {ρ} σ φ) = + A {ρ} σ (adjointDualCoeff U⁻¹ 0 φ) + A 0 σ (adjointDualCoeff U⁻¹ {ρ} φ) + + algebraMap ℂ B (φ (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.deriv G 𝔤 ρ (GaugeJet.mc 𝔤 (G := G) U⁻¹ σ)))) := by + have hanti : ({ρ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = + {((0 : Multiset (Fin 1 ⊕ Fin 3)), ({ρ} : Multiset (Fin 1 ⊕ Fin 3))), + (({ρ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by + rw [show ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = ρ ::ₘ 0 from rfl, + Multiset.antidiagonal_cons, Multiset.antidiagonal_zero] + simp + have h := hA.gauge_apply_deriv U {ρ} σ φ + rw [hanti] at h + simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, + Multiset.sum_cons, Multiset.sum_singleton, + GaugeJet.iteratedDeriv_singleton] at h + refine h.trans ?_ + abel + +/-! + +## Pure-tensor computations for `dualPairEquiv` and `tensorBracket` + +-/ + +@[simp] +lemma dualPairEquiv_tmul (b : B) (a : 𝔤) (φ : Module.Dual ℝ 𝔤) : + dualPairEquiv (b ⊗ₜ[ℝ] a) φ = φ a • b := by + simp [dualPairEquiv, dualTensorHomEquiv, Module.evalEquiv_apply] + +@[simp] +lemma tensorBracket_tmul (b₁ b₂ : B) (a₁ a₂ : 𝔤) : + tensorBracket (b₁ ⊗ₜ[ℝ] a₁) (b₂ ⊗ₜ[ℝ] a₂) = (b₁ * b₂) ⊗ₜ[ℝ] ⁅a₁, a₂⁆ := by + simp [tensorBracket, TensorProduct.tensorTensorTensorComm_tmul] + +lemma dualPairEquiv_map_left (Φ : B →ₗ[ℝ] B) (t : B ⊗[ℝ] 𝔤) + (φ : Module.Dual ℝ 𝔤) : + dualPairEquiv ((TensorProduct.map Φ LinearMap.id) t) φ = Φ (dualPairEquiv t φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +lemma dualPairEquiv_map_right (T : 𝔤 →ₗ[ℝ] 𝔤) + (t : B ⊗[ℝ] 𝔤) (φ : Module.Dual ℝ 𝔤) : + dualPairEquiv ((TensorProduct.map LinearMap.id T) t) φ = + dualPairEquiv t (T.dualMap φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +lemma dualPairEquiv_one_tmul (c : 𝔤) (φ : Module.Dual ℝ 𝔤) : + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] c) φ = algebraMap ℂ B (φ c) := by + rw [dualPairEquiv_tmul, Algebra.algebraMap_eq_smul_one, + show ((φ c : ℝ) : ℂ) = algebraMap ℝ ℂ (φ c) from rfl, algebraMap_smul] + +lemma symm_comp_left (Φ : B →ₗ[ℝ] B) (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + dualPairEquiv.symm (Φ ∘ₗ f) = + (TensorProduct.map Φ LinearMap.id) (dualPairEquiv.symm f) := by + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquiv_map_left, LinearEquiv.apply_symm_apply] + rfl + +lemma symm_comp_right (T : 𝔤 →ₗ[ℝ] 𝔤) + (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + dualPairEquiv.symm (f ∘ₗ T.dualMap) = + (TensorProduct.map LinearMap.id T) (dualPairEquiv.symm f) := by + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquiv_map_right, LinearEquiv.apply_symm_apply] + rfl + +lemma tensorBracket_map_left (Φ : B →ₗ[ℝ] B) + (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) (s t : B ⊗[ℝ] 𝔤) : + tensorBracket ((TensorProduct.map Φ LinearMap.id) s) + ((TensorProduct.map Φ LinearMap.id) t) = + (TensorProduct.map Φ LinearMap.id) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hΦ] + | add x y hx hy => + simp only [map_add] + rw [hx, hy] + | add x y hx hy => simp [hx, hy] + +lemma tensorBracket_map_right (T : 𝔤 →ₗ[ℝ] 𝔤) + (hT : ∀ a b, T ⁅a, b⁆ = ⁅T a, T b⁆) (s t : B ⊗[ℝ] 𝔤) : + tensorBracket ((TensorProduct.map LinearMap.id T) s) + ((TensorProduct.map LinearMap.id T) t) = + (TensorProduct.map LinearMap.id T) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hT] + | add x y hx hy => + simp only [map_add] + rw [hx, hy] + | add x y hx hy => simp [hx, hy] + +lemma tensorBracket_one_right (c : 𝔤) (s : B ⊗[ℝ] 𝔤) : + tensorBracket s ((1 : B) ⊗ₜ[ℝ] c) = + -(TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ 𝔤 c)) s := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b a => + rw [tensorBracket_tmul, mul_one, ← lie_skew, TensorProduct.tmul_neg] + simp + | add x y hx hy => + simp only [map_add, LinearMap.add_apply] + rw [hx, hy] + abel + +lemma tensorBracket_one_left (c : 𝔤) (t : B ⊗[ℝ] 𝔤) : + tensorBracket ((1 : B) ⊗ₜ[ℝ] c) t = + (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ 𝔤 c)) t := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +/-! + +## The gauge transformation of the commutator + +-/ + +set_option maxHeartbeats 1000000 in +/-- The gauge transformation law of the commutator term: writing the field law as + `A_μ ↦ Ad₀ A_μ + c_μ` with `Ad₀` the base-point adjoint of `U₀⁻¹` and + `c_μ = mc(U⁻¹)_μ|₀` the constant Maurer–Cartan shift, bilinearity of the bracket + gives + + `⁅A_μ, A_ν⁆ ↦ Ad₀ ⁅A_μ, A_ν⁆ + ⁅Ad₀ A_μ, c_ν⁆ + ⁅c_μ, Ad₀ A_ν⁆ + ⁅c_μ, c_ν⁆`: + + the adjoint-transported commutator, two cross terms linear in the field (the + bracket against `c` acting on the dual index through `ad`), and the constant + commutator of the two Maurer–Cartan shifts. Uses that the gauge action is by + algebra homomorphisms (`gauge_mul`) and that the base-point adjoint transport is a + morphism of Lie algebras. -/ +lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A) + (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repGauge U (commutator A μ ν φ) = + commutator A μ ν (adjointDualCoeff U⁻¹ 0 φ) + - A 0 μ (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)))) + + A 0 ν (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))) + + algebraMap ℂ B (φ ⁅GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ), + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)⁆) := by + -- the linear maps and constants of the transformation law + set Φ : B →ₗ[ℝ] B := (repGauge U).restrictScalars ℝ with hΦdef + set T₀ : 𝔤 →ₗ[ℝ] 𝔤 := + (GaugeJet.evalLie G (𝔤 := 𝔤)).toLinearMap ∘ₗ GaugeJet.iteratedDeriv G 𝔤 0 ∘ₗ + GaugeJet.adjoint 𝔤 (G := G) U⁻¹ ∘ₗ GaugeJet.ofConstantLie G (𝔤 := 𝔤) with hT₀def + set cμ : 𝔤 := GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ) with hcμ + set cν : 𝔤 := GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν) with hcν + set s : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 μ) with hs + set t : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 ν) with ht + have hcoeff : adjointDualCoeff U⁻¹ 0 = T₀.dualMap := by rw [hT₀def]; rfl + -- the base-point adjoint transport is a Lie algebra morphism + have hT₀lie : ∀ a b : 𝔤, T₀ ⁅a, b⁆ = ⁅T₀ a, T₀ b⁆ := by + intro a b + simp [hT₀def, GaugeJet.ofConstantLie_lie (G := G) (𝔤 := 𝔤), + GaugeJet.adjoint_lie (G := G) (𝔤 := 𝔤), + LieHom.map_lie] + -- the transformed component families in tensor form + have hfam : ∀ (ρ : Fin 1 ⊕ Fin 3), + Φ ∘ₗ A 0 ρ = A 0 ρ ∘ₗ T₀.dualMap + + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)) := by + intro ρ + refine LinearMap.ext fun ψ => ?_ + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hA.repGauge_apply U ρ ψ, dualPairEquiv_one_tmul, ← hcoeff] + rfl + have hsμ : (TensorProduct.map Φ LinearMap.id) s = + (TensorProduct.map LinearMap.id T₀) s + (1 : B) ⊗ₜ[ℝ] cμ := by + rw [hs, ← symm_comp_left, hfam μ, map_add, symm_comp_right, + LinearEquiv.symm_apply_apply, hcμ] + have htν : (TensorProduct.map Φ LinearMap.id) t = + (TensorProduct.map LinearMap.id T₀) t + (1 : B) ⊗ₜ[ℝ] cν := by + rw [ht, ← symm_comp_left, hfam ν, map_add, symm_comp_right, + LinearEquiv.symm_apply_apply, hcν] + -- record the pairing identities, then make the local definitions opaque + have hcomm_pair : dualPairEquiv (tensorBracket s t) = commutator A μ ν := by + rw [hs, ht]; rfl + have hπs : dualPairEquiv s = A 0 μ := by + rw [hs]; exact dualPairEquiv.apply_symm_apply _ + have hπt : dualPairEquiv t = A 0 ν := by + rw [ht]; exact dualPairEquiv.apply_symm_apply _ + have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => + hA.gauge_mul U b₁ b₂ + clear_value Φ T₀ cμ cν s t + -- the tensor-level transformation of the bracket + have htensor : (TensorProduct.map Φ LinearMap.id) (tensorBracket s t) = + (TensorProduct.map LinearMap.id T₀) (tensorBracket s t) + - (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ 𝔤 cν)) + ((TensorProduct.map LinearMap.id T₀) s) + + (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ 𝔤 cμ)) + ((TensorProduct.map LinearMap.id T₀) t) + + (1 : B) ⊗ₜ[ℝ] ⁅cμ, cν⁆ := by + refine (tensorBracket_map_left Φ hΦmul s t).symm.trans + ((congrArg₂ (fun X Y => tensorBracket X Y) hsμ htν).trans ?_) + simp only [map_add, LinearMap.add_apply] + rw [tensorBracket_map_right T₀ hT₀lie, tensorBracket_one_right, + tensorBracket_one_left, tensorBracket_tmul, one_mul] + abel + -- read the tensor identity back through the pairing + have hread := congrArg (fun z => dualPairEquiv z φ) htensor + simp only [map_add, map_sub, LinearMap.add_apply, LinearMap.sub_apply, + dualPairEquiv_map_left, dualPairEquiv_map_right, + dualPairEquiv_one_tmul] at hread + rw [show repGauge U (commutator A μ ν φ) = Φ (dualPairEquiv (tensorBracket s t) φ) from by + rw [← hcomm_pair, hΦdef]; rfl, + hread, hcoeff, hcomm_pair, hπs, hπt] + rfl + +/-! + +## Second derivatives of the gauge field + +-/ + +/-- The dual adjoint coefficient at two derivatives: iterating + `∂ (Ad_U x) = Ad_U (∂ x) − ⁅ω(U), Ad_U x⁆` once more, the twice-derived coefficient + decomposes into the underived coefficient against `ad` of the derived Maurer–Cartan + form, and the once-derived coefficient against `ad` of the Maurer–Cartan form + itself. This is the two-derivative analogue of `adjointDualCoeff_singleton`. -/ +lemma _root_.adjointDualCoeff_pair (U : G) + (ρ μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + adjointDualCoeff U (ρ ::ₘ {μ}) φ = + -adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.deriv G 𝔤 ρ (GaugeJet.mc 𝔤 (G := G) U μ)))) + - adjointDualCoeff U {ρ} (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.mc 𝔤 (G := G) U μ))) := by + refine LinearMap.ext fun a => ?_ + have hderiv : ∀ τ : Fin 1 ⊕ Fin 3, + GaugeJet.deriv G 𝔤 τ (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)) = + -⁅GaugeJet.mc 𝔤 (G := G) U τ, + GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)⁆ := + fun τ => by rw [GaugeJet.deriv_adjoint (G := G) (𝔤 := 𝔤), + GaugeJet.deriv_ofConstantLie (G := G) (𝔤 := 𝔤), map_zero, zero_sub] + have hkey : GaugeJet.iteratedDeriv G 𝔤 (ρ ::ₘ {μ}) + (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)) = + -⁅GaugeJet.deriv G 𝔤 ρ (GaugeJet.mc 𝔤 (G := G) U μ), + GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)⁆ + + ⁅GaugeJet.mc 𝔤 (G := G) U μ, ⁅GaugeJet.mc 𝔤 (G := G) U ρ, + GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)⁆⁆ := by + rw [GaugeJet.iteratedDeriv_cons, LinearMap.comp_apply, + GaugeJet.iteratedDeriv_singleton, hderiv μ, map_neg, + GaugeJet.deriv_bracket (G := G) (𝔤 := 𝔤), hderiv ρ, lie_neg] + abel + simp only [adjointDualCoeff, LinearMap.dualMap_apply, LinearMap.sub_apply, + LinearMap.neg_apply, LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, + GaugeJet.iteratedDeriv_zero, GaugeJet.iteratedDeriv_singleton, + LinearMap.id_coe, id_eq] + rw [hkey, map_add, map_neg, LieHom.map_lie, LieHom.map_lie, LieHom.map_lie, + hderiv ρ, map_neg, LieHom.map_lie] + simp only [map_add, map_neg, LieAlgebra.ad_apply] + abel + +/-- The gauge transformation of the twice-derived symbol `∂_ρ ∂_σ A_τ`: the case + `s = ρ ::ₘ {σ}` of `gauge_apply_deriv` — the four Leibniz splittings of two + derivatives, plus the base-point value of the twice-derived Maurer–Cartan form. -/ +lemma repGauge_deriv_deriv_apply (hA : IsGaugeField repLorentz repGauge A) + (U : G) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repGauge U (A (ρ ::ₘ {σ}) τ φ) = + A (ρ ::ₘ {σ}) τ (adjointDualCoeff U⁻¹ 0 φ) + + A {ρ} τ (adjointDualCoeff U⁻¹ {σ} φ) + + A {σ} τ (adjointDualCoeff U⁻¹ {ρ} φ) + + A 0 τ (adjointDualCoeff U⁻¹ (ρ ::ₘ {σ}) φ) + + algebraMap ℂ B (φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.deriv G 𝔤 ρ + (GaugeJet.deriv G 𝔤 σ (GaugeJet.mc 𝔤 (G := G) U⁻¹ τ))))) := by + have hanti₁ : ({σ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = + {((0 : Multiset (Fin 1 ⊕ Fin 3)), ({σ} : Multiset (Fin 1 ⊕ Fin 3))), + (({σ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by + rw [show ({σ} : Multiset (Fin 1 ⊕ Fin 3)) = σ ::ₘ 0 from rfl, + Multiset.antidiagonal_cons, Multiset.antidiagonal_zero] + simp + have hanti : (ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3))).antidiagonal = + {(({ρ} : Multiset (Fin 1 ⊕ Fin 3)), ({σ} : Multiset (Fin 1 ⊕ Fin 3))), + ((0 : Multiset (Fin 1 ⊕ Fin 3)), ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3))), + (({σ} : Multiset (Fin 1 ⊕ Fin 3)), ({ρ} : Multiset (Fin 1 ⊕ Fin 3))), + (ρ ::ₘ ({σ} : Multiset (Fin 1 ⊕ Fin 3)), (0 : Multiset (Fin 1 ⊕ Fin 3)))} := by + rw [Multiset.antidiagonal_cons, hanti₁] + simp [Multiset.insert_eq_cons] + have h := hA.gauge_apply_deriv U (ρ ::ₘ {σ}) τ φ + rw [hanti] at h + simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, + Multiset.sum_cons, Multiset.sum_singleton, GaugeJet.iteratedDeriv_cons, + LinearMap.comp_apply, GaugeJet.iteratedDeriv_singleton] at h + refine h.trans ?_ + abel + +/-! + +## The bracket of general component families + +-/ + +/-- The bracket of two arbitrary component families, generalizing `commutator` (which + is the case of two field symbols): assemble into `B ⊗ 𝔤` by `dualPairEquiv.symm`, + bracket by `tensorBracket`, read back out as components. -/ +noncomputable def bracketFam (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + dualPairEquiv (tensorBracket (dualPairEquiv.symm f) (dualPairEquiv.symm g)) + +lemma commutator_eq_bracketFam + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : commutator A μ ν = bracketFam (A 0 μ) (A 0 ν) := rfl + +/-- **The derived commutator family**: the `s`-derivative of the commutator term, given + by the Leibniz convolution of the derivative symbols over the multiset antidiagonal. + With the derivative symbols as primitives this convolution is the definition; for + `s = 0` it is the commutator itself (`commutatorFam_zero`). -/ +noncomputable def commutatorFam + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + (s.antidiagonal.map fun p => bracketFam (A p.1 μ) (A p.2 ν)).sum + +lemma commutatorFam_zero + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : commutatorFam A μ ν 0 = commutator A μ ν := by + rw [commutatorFam, Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton, commutator_eq_bracketFam] + +lemma bracketFam_add_left (f₁ f₂ g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam (f₁ + f₂) g = bracketFam f₁ g + bracketFam f₂ g := by + simp only [bracketFam, map_add, LinearMap.add_apply] + +lemma bracketFam_add_right (f g₁ g₂ : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam f (g₁ + g₂) = bracketFam f g₁ + bracketFam f g₂ := by + simp only [bracketFam, map_add] + +/-- The bracket of two component families expanded through a basis of the gauge + algebra: the physicists' `f^a_{bc} f^b g^c`, with `φ⁅e_j, e_k⁆` the structure + constants contracted with the dual vector. -/ +lemma bracketFam_apply_eq_sum (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (φ : Module.Dual ℝ 𝔤) : + bracketFam f g φ = ∑ j, ∑ k, + φ ⁅Module.Free.chooseBasis ℝ 𝔤 j, + Module.Free.chooseBasis ℝ 𝔤 k⁆ • + (f ((Module.Free.chooseBasis ℝ 𝔤).coord j) * + g ((Module.Free.chooseBasis ℝ 𝔤).coord k)) := by + classical + set bv := Module.Free.chooseBasis ℝ 𝔤 with hbv + have hdual : ∀ ψ : Module.Dual ℝ 𝔤, ∑ j, ψ (bv j) • bv.coord j = ψ := by + intro ψ + refine LinearMap.ext fun x => ?_ + conv_rhs => rw [← bv.sum_repr x, map_sum] + simp only [LinearMap.sum_apply, LinearMap.smul_apply, Module.Basis.coord_apply, + smul_eq_mul, map_smul] + exact Finset.sum_congr rfl fun j _ => mul_comm _ _ + have hbasis : ∀ h : Module.Dual ℝ 𝔤 →ₗ[ℝ] B, + dualPairEquiv.symm h = ∑ j, h (bv.coord j) ⊗ₜ[ℝ] bv j := by + intro h + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun ψ => ?_ + calc h ψ = h (∑ j, ψ (bv j) • bv.coord j) := by rw [hdual] + _ = ∑ j, ψ (bv j) • h (bv.coord j) := by + rw [map_sum] + exact Finset.sum_congr rfl fun j _ => map_smul h _ _ + _ = dualPairEquiv (∑ j, h (bv.coord j) ⊗ₜ[ℝ] bv j) ψ := by simp + rw [bracketFam, hbasis f, hbasis g] + simp [tensorBracket_tmul, dualPairEquiv_tmul] + rw [Finset.sum_comm] + +/-- The bracket of families against a common Lie-algebra morphism on the dual index. -/ +lemma bracketFam_comp_dualMap (T : 𝔤 →ₗ[ℝ] 𝔤) + (hT : ∀ a b, T ⁅a, b⁆ = ⁅T a, T b⁆) (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam (f ∘ₗ T.dualMap) (g ∘ₗ T.dualMap) = bracketFam f g ∘ₗ T.dualMap := by + refine LinearMap.ext fun φ => ?_ + show dualPairEquiv (tensorBracket (dualPairEquiv.symm (f ∘ₗ T.dualMap)) + (dualPairEquiv.symm (g ∘ₗ T.dualMap))) φ = bracketFam f g (T.dualMap φ) + rw [symm_comp_right, symm_comp_right, tensorBracket_map_right T hT, + dualPairEquiv_map_right] + rfl + +/-- `tensorBracket` is a derivation in the algebra factor: for `Δ` satisfying the + Leibniz rule on `B`, applying `Δ ⊗ id` to a bracket distributes over the two + arguments. -/ +lemma tensorBracket_map_left_derivation (Δ : B →ₗ[ℝ] B) + (hΔ : ∀ b₁ b₂, Δ (b₁ * b₂) = Δ b₁ * b₂ + b₁ * Δ b₂) (s t : B ⊗[ℝ] 𝔤) : + (TensorProduct.map Δ LinearMap.id) (tensorBracket s t) = + tensorBracket ((TensorProduct.map Δ LinearMap.id) s) t + + tensorBracket s ((TensorProduct.map Δ LinearMap.id) t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hΔ, TensorProduct.add_tmul] + | add x y hx hy => + simp only [map_add, hx, hy] + abel + | add x y hx hy => + simp only [map_add, LinearMap.add_apply, hx, hy] + abel + +/-- `tensorBracket` under a relative derivation on the Lie factor: if + `T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆`, the two mixed brackets sum to the + `T₁`-image of the bracket. This is how the once-derived adjoint transport + distributes over the commutator. -/ +lemma tensorBracket_map_right_derivation (T₀ T₁ : 𝔤 →ₗ[ℝ] 𝔤) + (hT : ∀ a b, T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆) (s t : B ⊗[ℝ] 𝔤) : + tensorBracket ((TensorProduct.map LinearMap.id T₁) s) + ((TensorProduct.map LinearMap.id T₀) t) + + tensorBracket ((TensorProduct.map LinearMap.id T₀) s) + ((TensorProduct.map LinearMap.id T₁) t) = + (TensorProduct.map LinearMap.id T₁) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hT, TensorProduct.tmul_add] + | add x y hx hy => + simp only [map_add] + rw [← hx, ← hy] + abel + | add x y hx hy => + simp only [map_add, LinearMap.add_apply] + rw [← hx, ← hy] + abel + +/-- The family-level form of `tensorBracket_map_right_derivation`: a relative + derivation on the dual index distributes over the bracket of families. -/ +lemma bracketFam_dualMap_derivation (T₀ T₁ : 𝔤 →ₗ[ℝ] 𝔤) + (hT : ∀ a b, T₁ ⁅a, b⁆ = ⁅T₁ a, T₀ b⁆ + ⁅T₀ a, T₁ b⁆) + (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam (f ∘ₗ T₁.dualMap) (g ∘ₗ T₀.dualMap) + + bracketFam (f ∘ₗ T₀.dualMap) (g ∘ₗ T₁.dualMap) = + bracketFam f g ∘ₗ T₁.dualMap := by + refine LinearMap.ext fun φ => ?_ + show dualPairEquiv (tensorBracket (dualPairEquiv.symm (f ∘ₗ T₁.dualMap)) + (dualPairEquiv.symm (g ∘ₗ T₀.dualMap))) φ + + dualPairEquiv (tensorBracket (dualPairEquiv.symm (f ∘ₗ T₀.dualMap)) + (dualPairEquiv.symm (g ∘ₗ T₁.dualMap))) φ = + bracketFam f g (T₁.dualMap φ) + rw [symm_comp_right, symm_comp_right, symm_comp_right, symm_comp_right, + ← LinearMap.add_apply, ← map_add, tensorBracket_map_right_derivation T₀ T₁ hT, + dualPairEquiv_map_right] + rfl + +set_option maxHeartbeats 1000000 in +/-- The gauge transformation of the bracket of two component families with affine + transformation laws `f ↦ f' + φ(c_f)·1` and `g ↦ g' + φ(c_g)·1`: the bracket of the + transformed families, two `ad` cross terms, and the constant bracket `⁅c_f, c_g⁆`. + Pure bilinearity, with `tensorBracket_one_left/right` computing the cross terms; + `repGauge_commutator` is the special case of two field symbols. -/ +lemma repGauge_bracketFam (hA : IsGaugeField repLorentz repGauge A) + (U : G) {f g f' g' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + {cf cg : 𝔤} + (hf : ∀ ψ : Module.Dual ℝ 𝔤, + repGauge U (f ψ) = f' ψ + algebraMap ℂ B (ψ cf)) + (hg : ∀ ψ : Module.Dual ℝ 𝔤, + repGauge U (g ψ) = g' ψ + algebraMap ℂ B (ψ cg)) + (φ : Module.Dual ℝ 𝔤) : + repGauge U (bracketFam f g φ) = + bracketFam f' g' φ + + g' (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 cf) + - f' (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 cg) + + algebraMap ℂ B (φ ⁅cf, cg⁆) := by + set Φ : B →ₗ[ℝ] B := (repGauge U).restrictScalars ℝ with hΦdef + have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => + hA.gauge_mul U b₁ b₂ + set s : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm f with hs + set t : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm g with ht + set s' : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm f' with hs' + set t' : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm g' with ht' + have hfm : (TensorProduct.map Φ LinearMap.id) s = s' + (1 : B) ⊗ₜ[ℝ] cf := by + rw [hs, hs', ← symm_comp_left, + show Φ ∘ₗ f = f' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cf) from + LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hf ψ, dualPairEquiv_one_tmul], + map_add, LinearEquiv.symm_apply_apply] + have hgm : (TensorProduct.map Φ LinearMap.id) t = t' + (1 : B) ⊗ₜ[ℝ] cg := by + rw [ht, ht', ← symm_comp_left, + show Φ ∘ₗ g = g' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cg) from + LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hg ψ, dualPairEquiv_one_tmul], + map_add, LinearEquiv.symm_apply_apply] + have hbra : dualPairEquiv (tensorBracket s t) = bracketFam f g := by + rw [hs, ht]; rfl + have hbra' : dualPairEquiv (tensorBracket s' t') = bracketFam f' g' := by + rw [hs', ht']; rfl + have hπs' : dualPairEquiv s' = f' := by + rw [hs']; exact dualPairEquiv.apply_symm_apply _ + have hπt' : dualPairEquiv t' = g' := by + rw [ht']; exact dualPairEquiv.apply_symm_apply _ + clear_value Φ s t s' t' + have htensor : (TensorProduct.map Φ LinearMap.id) (tensorBracket s t) = + tensorBracket s' t' + + (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ 𝔤 cf)) t' + - (TensorProduct.map LinearMap.id (LieAlgebra.ad ℝ 𝔤 cg)) s' + + (1 : B) ⊗ₜ[ℝ] ⁅cf, cg⁆ := by + refine (tensorBracket_map_left Φ hΦmul s t).symm.trans + ((congrArg₂ (fun X Y => tensorBracket X Y) hfm hgm).trans ?_) + simp only [map_add, LinearMap.add_apply] + rw [tensorBracket_one_right, tensorBracket_one_left, tensorBracket_tmul, one_mul] + abel + have hread := congrArg (fun z => dualPairEquiv z φ) htensor + simp only [map_add, map_sub, LinearMap.add_apply, LinearMap.sub_apply, + dualPairEquiv_map_left, dualPairEquiv_map_right, dualPairEquiv_one_tmul] at hread + rw [show repGauge U (bracketFam f g φ) = Φ (dualPairEquiv (tensorBracket s t) φ) from by + rw [hbra, hΦdef]; rfl, + hread, hbra', hπs', hπt'] + rfl + + +/-! + +## Multiset combinatorics for iterated Leibniz sums + +The convolution sums of the iterated transformation laws are indexed by the multiset +antidiagonal. The two lemmas below are the coassociativity and cocommutativity-exchange +of this "comultiplication": a sum over splittings-of-splittings does not depend on the +grouping. Both are proven by a cons-induction with the summand universally quantified, +so that the inductive hypothesis absorbs the modified summands. + +-/ + +/-- Every derived commutator term is a polynomial in derivative symbols of order at + most that of the derivative: each Leibniz splitting contributes a product of two + lower-order symbols. -/ +lemma commutatorFam_mem + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + commutatorFam A ν lam s' φ ∈ + Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), p.card ≤ s'.card ∧ b = A p μ φ} := by + classical + rw [commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle := Multiset.mem_antidiagonal.mp hp + rw [Function.comp_apply, bracketFam_apply_eq_sum] + refine Subalgebra.sum_mem _ fun j _ => Subalgebra.sum_mem _ fun k _ => ?_ + rw [← algebraMap_smul ℂ (φ ⁅Module.Free.chooseBasis ℝ 𝔤 j, + Module.Free.chooseBasis ℝ 𝔤 k⁆)] + refine Subalgebra.smul_mem _ ?_ _ + refine mul_mem + (Algebra.subset_adjoin ⟨p.1, ν, (Module.Free.chooseBasis ℝ 𝔤).coord j, ?_, rfl⟩) + (Algebra.subset_adjoin ⟨p.2, lam, (Module.Free.chooseBasis ℝ 𝔤).coord k, ?_, rfl⟩) + · exact hle ▸ Multiset.card_le_card (Multiset.le_add_right _ _) + · exact hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) + + +/-! + +## Iterated Leibniz expansions + +-/ + +lemma bracketFam_zero_left (g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam 0 g = 0 := by + simp [bracketFam] + +lemma bracketFam_zero_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam f 0 = 0 := by + simp [bracketFam] + +lemma bracketFam_sum_left (S : Multiset (Module.Dual ℝ 𝔤 →ₗ[ℝ] B)) + (g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam S.sum g = (S.map fun f => bracketFam f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [bracketFam_zero_left] + | cons f S ih => simp [bracketFam_add_left, ih] + +lemma bracketFam_sum_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (S : Multiset (Module.Dual ℝ 𝔤 →ₗ[ℝ] B)) : + bracketFam f S.sum = (S.map fun g => bracketFam f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [bracketFam_zero_right] + | cons g S ih => simp [bracketFam_add_right, ih] + +/-! + +## The all-orders transport, coefficient, and structural identities + +-/ + +/-- The all-orders derivation property of the base-point adjoint transport: the + transport of a bracket is the antidiagonal convolution of transports, by the + iterated Leibniz rule for the jet bracket. -/ +lemma _root_.adjointTransport_bracket (U : G) + (x : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤) : + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 x + (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) ⁅a, b⁆))) = + (x.antidiagonal.map fun p => + ⁅GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a))), + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.2 + (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) b)))⁆).sum := by + rw [GaugeJet.ofConstantLie_lie (G := G) (𝔤 := 𝔤), GaugeJet.adjoint_lie (G := G) (𝔤 := 𝔤), + GaugeJet.iteratedDeriv_bracket, map_multiset_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [Function.comp_apply, LieHom.map_lie]) + +/-- `tensorBracket` under an antidiagonal family of transports on the Lie factor: + if `T x` distributes over the bracket as the antidiagonal convolution of the + `T m`, so does `id ⊗ T x` over `tensorBracket`. -/ +lemma tensorBracket_map_right_antidiagonal + (T : Multiset (Fin 1 ⊕ Fin 3) → 𝔤 →ₗ[ℝ] 𝔤) + (x : Multiset (Fin 1 ⊕ Fin 3)) + (hT : ∀ a b : 𝔤, T x ⁅a, b⁆ = + (x.antidiagonal.map fun p => ⁅T p.1 a, T p.2 b⁆).sum) + (s t : B ⊗[ℝ] 𝔤) : + (x.antidiagonal.map fun p => + tensorBracket ((TensorProduct.map LinearMap.id (T p.1)) s) + ((TensorProduct.map LinearMap.id (T p.2)) t)).sum = + (TensorProduct.map LinearMap.id (T x)) (tensorBracket s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => + simp only [tensorBracket_tmul, TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [hT, Multiset.tmul_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + simp) + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by rw [map_add, map_add]), + Multiset.sum_map_add, hy, hz, ← map_add, ← map_add] + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by + rw [map_add, map_add, LinearMap.add_apply]), + Multiset.sum_map_add, hy, hz, ← map_add, ← LinearMap.add_apply, ← map_add] + +/-- The bracket of families against an iterated dual adjoint coefficient: the + antidiagonal convolution — the all-orders form of `bracketFam_comp_dualMap` and + `bracketFam_dualMap_derivation`. -/ +lemma bracketFam_adjointDualCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) + (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) (φ : Module.Dual ℝ 𝔤) : + bracketFam f g (adjointDualCoeff U x φ) = + (x.antidiagonal.map fun p => + bracketFam (f ∘ₗ adjointDualCoeff U p.1) (g ∘ₗ adjointDualCoeff U p.2) φ).sum := by + set T : Multiset (Fin 1 ⊕ Fin 3) → 𝔤 →ₗ[ℝ] 𝔤 := fun m => + (GaugeJet.evalLie G (𝔤 := 𝔤)).toLinearMap ∘ₗ GaugeJet.iteratedDeriv G 𝔤 m ∘ₗ + GaugeJet.adjoint 𝔤 (G := G) U ∘ₗ GaugeJet.ofConstantLie G (𝔤 := 𝔤) with hTdef + have hcoeff : ∀ m, adjointDualCoeff U m = (T m).dualMap := fun m => rfl + have hT : ∀ a b : 𝔤, T x ⁅a, b⁆ = + (x.antidiagonal.map fun p => ⁅T p.1 a, T p.2 b⁆).sum := by + intro a b + simp only [hTdef, LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + exact adjointTransport_bracket U x a b + rw [hcoeff x, + show bracketFam f g ((T x).dualMap φ) = + dualPairEquiv ((TensorProduct.map LinearMap.id (T x)) (tensorBracket + (dualPairEquiv.symm f) (dualPairEquiv.symm g))) φ from + (dualPairEquiv_map_right (T x) _ φ).symm, + ← tensorBracket_map_right_antidiagonal T x hT, map_multiset_sum, + Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + simp only [Function.comp_apply] + rw [← symm_comp_right, ← symm_comp_right, hcoeff p.1, hcoeff p.2] + rfl + +/-- The all-orders decomposition of the dual adjoint coefficient with one extra + derivative — the generalization of `adjointDualCoeff_singleton` and + `adjointDualCoeff_pair`: differentiating the adjoint once produces minus the + bracket with the Maurer–Cartan form, and the remaining derivatives distribute over + it by the Leibniz rule. -/ +lemma _root_.adjointDualCoeff_cons (U : G) + (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + adjointDualCoeff U (μ ::ₘ x) φ = + -((x.antidiagonal.map fun p => + adjointDualCoeff U p.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U μ))))).sum) := by + refine LinearMap.ext fun a => ?_ + have hkey : GaugeJet.iteratedDeriv G 𝔤 (μ ::ₘ x) + (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)) = + -((x.antidiagonal.map fun p => + ⁅GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.mc 𝔤 (G := G) U μ), + GaugeJet.iteratedDeriv G 𝔤 p.2 + (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a))⁆).sum) := by + rw [show (μ ::ₘ x : Multiset (Fin 1 ⊕ Fin 3)) = x + {μ} from by + rw [add_comm, Multiset.singleton_add], + GaugeJet.iteratedDeriv_add, LinearMap.comp_apply, + GaugeJet.iteratedDeriv_singleton, GaugeJet.deriv_adjoint (G := G) (𝔤 := 𝔤), + GaugeJet.deriv_ofConstantLie (G := G) (𝔤 := 𝔤), map_zero, zero_sub, map_neg, + GaugeJet.iteratedDeriv_bracket] + simp only [adjointDualCoeff, LinearMap.dualMap_apply, LinearMap.neg_apply, + LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap] + rw [hkey, map_neg, map_neg, map_multiset_sum, map_multiset_sum, + Multiset.map_map, Multiset.map_map, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_)) + simp only [Function.comp_apply, LieHom.map_lie] + rfl + +/-- The all-orders structural equation of the Maurer–Cartan form, at the base point: + the `s`-th derivative of `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`, with the bracket + expanded by the iterated Leibniz rule. -/ +lemma _root_.eval_iteratedDeriv_maurerCartan_structure + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (μ ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U ν)) = + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (ν ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U μ)) + - (s.antidiagonal.map fun p => + ⁅GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U μ)), + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.2 + (GaugeJet.mc 𝔤 (G := G) U ν))⁆).sum := by + have hconv : ∀ (κ : Fin 1 ⊕ Fin 3) (z : 𝔤J), + GaugeJet.iteratedDeriv G 𝔤 s (GaugeJet.deriv G 𝔤 κ z) = + GaugeJet.iteratedDeriv G 𝔤 (κ ::ₘ s) z := by + intro κ z + rw [show (κ ::ₘ s : Multiset (Fin 1 ⊕ Fin 3)) = s + {κ} from by + rw [add_comm, Multiset.singleton_add], + GaugeJet.iteratedDeriv_add, LinearMap.comp_apply, + GaugeJet.iteratedDeriv_singleton] + have h0 := congrArg (fun z => GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s z)) + (GaugeJet.mc_structure (G := G) (𝔤 := 𝔤) U μ ν) + simp only [map_add, map_sub, map_zero] at h0 + rw [hconv, hconv, GaugeJet.iteratedDeriv_bracket, map_multiset_sum, + Multiset.map_map] at h0 + rw [Multiset.map_congr rfl (fun p hp => by rw [Function.comp_apply, LieHom.map_lie])] at h0 + refine eq_sub_of_add_eq ?_ + calc GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (μ ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U ν)) + + (s.antidiagonal.map fun p => + ⁅GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U μ)), + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.2 + (GaugeJet.mc 𝔤 (G := G) U ν))⁆).sum + = (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (μ ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U ν)) + - GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (ν ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U μ)) + + (s.antidiagonal.map fun p => + ⁅GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U μ)), + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.2 + (GaugeJet.mc 𝔤 (G := G) U ν))⁆).sum) + + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (ν ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U μ)) := by + abel + _ = GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (ν ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U μ)) := by + rw [h0, zero_add] + +/-! + +## The gauge transformation of iterated derivatives + +-/ + +/-- The `κ ::ₘ s` case of `gauge_apply_deriv` with the extra derivative traced through: + the Leibniz splittings where `κ` stays a derivative, minus (by + `adjointDualCoeff_cons`) the splittings where `κ` hits the adjoint — an `ad` of the + derived Maurer–Cartan form — plus the derived Maurer–Cartan shift. -/ +lemma repGauge_cons_apply (hA : IsGaugeField repLorentz repGauge A) + (U : G) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repGauge U (A (κ ::ₘ s) τ φ) = + (s.antidiagonal.map fun p => + A (κ ::ₘ p.2) τ (adjointDualCoeff U⁻¹ p.1 φ)).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + A p.2 τ (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ κ)))))).sum).sum + + algebraMap ℂ B (φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (κ ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U⁻¹ τ)))) := by + rw [hA.gauge_apply_deriv U (κ ::ₘ s) τ φ] + congr 1 + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + have hsec : (Multiset.map (fun p => + A p.2 τ (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = + -(s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + A p.2 τ (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ κ)))))).sum).sum := by + rw [← Multiset.sum_map_neg''] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) + rw [hsec, sub_eq_add_neg] + +set_option maxHeartbeats 2000000 in +/-- The all-orders gauge transformation of the derived commutator term: the Leibniz + convolution of the transformed commutator, the two `ad` cross-term convolutions, + and the convolution of Maurer–Cartan bracket shifts. This is `repGauge_commutator` + at every derivative order simultaneously; the regrouping of the four-fold splitting + is `Multiset.sum_antidiagonal_exchange`. -/ +lemma repGauge_commutatorFam (hA : IsGaugeField repLorentz repGauge A) + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repGauge U (commutatorFam A μ ν s φ) = + (s.antidiagonal.map fun p => + commutatorFam A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum + + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + A r.2 ν (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))))).sum).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + A q.2 μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.2 (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)))))).sum).sum + + (s.antidiagonal.map fun p => + algebraMap ℂ B (φ ⁅GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)), + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.2 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν))⁆)).sum := by + -- the affine transformation law of the derived symbols, with the Leibniz sum as a map + have hAlaw : ∀ (τ : Fin 1 ⊕ Fin 3) (u : Multiset (Fin 1 ⊕ Fin 3)) + (ψ : Module.Dual ℝ 𝔤), + repGauge U (A u τ ψ) = + ((u.antidiagonal.map fun q => A q.2 τ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 u (GaugeJet.mc 𝔤 (G := G) U⁻¹ τ)))) := by + intro τ u ψ + rw [hA.gauge_apply_deriv U u τ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + -- the convolution triple sum in its two groupings + have hMa : (s.antidiagonal.map fun p => + bracketFam ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) φ).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam (A q.2 μ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [bracketFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [bracketFam_sum_right, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + have hMc : (s.antidiagonal.map fun p => + commutatorFam A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam (A r.1 μ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_congr rfl (fun r hr => by + rw [Function.comp_apply, + bracketFam_adjointDualCoeff U⁻¹ p.1 (A r.1 μ) (A r.2 ν) φ]), + Multiset.sum_map_sum_map] + have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => + bracketFam (A b μ ∘ₗ adjointDualCoeff U⁻¹ a) + (A d ν ∘ₗ adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) + -- the cross-term sums, applied + have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))) = + (p.2.antidiagonal.map fun r => + A r.2 ν (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp] + have hCf : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.2 (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)))) = + (p.1.antidiagonal.map fun q => + A q.2 μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.2 (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp] + -- expand the left side and split the four convolutions + rw [commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map, map_multiset_sum, + Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, Function.comp_apply, + hA.repGauge_bracketFam U (hAlaw μ p.1) (hAlaw ν p.2) φ, hCg p, hCf p]), + Multiset.sum_map_add, Multiset.sum_map_sub, Multiset.sum_map_add, hM] + +end IsGaugeField + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean new file mode 100644 index 000000000..03588a674 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean @@ -0,0 +1,190 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +/-! + +# The field strength + +The field strength is defined as +``` + F_{μν} = ∂_μ A_ν − ∂_ν A_μ + ⁅A_μ, A_ν⁆ +``` +with `⁅·,·⁆` the gauge-algebra bracket, which already carries the physicists' factor +of `i` (on the matrix factors `⁅a, b⁆ = i(ab − ba)`). In terms of the plain matrix +commutator this is `F_{μν} = ∂_μ A_ν − ∂_ν A_μ + i [A_μ, A_ν]`, the sign forced by +the convention `ω_μ(g) = i (∂_μ g) g⁻¹` for the Maurer–Cartan form (equivalently, by +its structural equation `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`): only with this +coefficient do the inhomogeneous terms cancel. With the derivative symbols as +primitives the field strength is itself a family of derivative symbols +`s ↦ [∂_s F_μν]`: the derivative terms shift the multiset index, the commutator term +is the Leibniz convolution `commutatorFam`. It transforms in the adjoint at every +derivative order simultaneously (`repGauge_fieldStrength`, +`transformsInAdjoint_fieldStrength`). + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +open Matrix MatrixGroups TensorProduct +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable [GaugeJet G 𝔤 G₀ 𝔤J] + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ G B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + +/-- The field strength `F_μν = ∂_μ A_ν − ∂_ν A_μ + ⁅A_μ, A_ν⁆` of a family of + gauge-field symbols, as a family of derivative symbols: the `s`-th derivative has + the derivative terms through the shifted symbols `A (μ ::ₘ s) ν`, the commutator + term through the Leibniz convolution `commutatorFam`. This is the physicists' + `F_μν^a = ∂_μ A_ν^a − ∂_ν A_μ^a + f^a_{bc} A_μ^b A_ν^c`: the gauge-algebra bracket + already carries the physicists' factor of `i`, so no explicit factor appears — the + same normalization as in the structural equation of the Maurer–Cartan form, which + is exactly what makes the field strength transform without inhomogeneous terms + (`repGauge_fieldStrength`). -/ +noncomputable def fieldStrength + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + A (μ ::ₘ s) ν - A (ν ::ₘ s) μ + commutatorFam A μ ν s + +@[simp] +lemma fieldStrength_apply + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + fieldStrength A μ ν s φ = A (μ ::ₘ s) ν φ - A (ν ::ₘ s) μ φ + commutatorFam A μ ν s φ := + rfl + +/-- The underived field strength: derivative symbols on singletons, plus the plain + commutator. -/ +lemma fieldStrength_zero + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength A μ ν 0 = A {μ} ν - A {ν} μ + commutator A μ ν := by + rw [fieldStrength, commutatorFam_zero] + rfl + +/-- The antisymmetrized pair of derivative symbols is the field strength minus its + commutator term. -/ +lemma pair_eq_fieldStrength_sub_commutatorFam + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (ν μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + A (ν ::ₘ s) μ - A (μ ::ₘ s) ν = fieldStrength A ν μ s - commutatorFam A ν μ s := by + rw [fieldStrength, add_sub_cancel_right] + + +/-- **The field strength transforms in the adjoint, at every derivative order**: under + a gauge jet `U` every derivative symbol of `F_μν` transforms by the pure Leibniz + convolution of the dual adjoint action over the multiset antidiagonal — the exact + analogue of `gauge_apply_deriv` with *no* Maurer–Cartan shift, since the field + strength transforms homogeneously. The `κ`-into-the-adjoint splittings of the + derivative terms (`repGauge_cons_apply`) cancel the `ad` cross-term convolutions of + the commutator (`repGauge_commutatorFam`) through the coassociativity and swap of + the antidiagonal, and the derived Maurer–Cartan shifts cancel the bracket-shift + convolution through the all-orders structural equation. -/ +theorem repGauge_fieldStrength (hA : IsGaugeField repLorentz repGauge A) + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repGauge U (fieldStrength A μ ν s φ) = + (s.antidiagonal.map fun p => + fieldStrength A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by + have hL : repGauge U (fieldStrength A μ ν s φ) = + repGauge U (A (μ ::ₘ s) ν φ) - repGauge U (A (ν ::ₘ s) μ φ) + + repGauge U (commutatorFam A μ ν s φ) := by + rw [fieldStrength_apply, map_add, map_sub] + have hR : (s.antidiagonal.map fun p => + fieldStrength A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = + (s.antidiagonal.map fun p => + A (μ ::ₘ p.2) ν (adjointDualCoeff U⁻¹ p.1 φ)).sum + - (s.antidiagonal.map fun p => + A (ν ::ₘ p.2) μ (adjointDualCoeff U⁻¹ p.1 φ)).sum + + (s.antidiagonal.map fun p => + commutatorFam A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by + rw [← Multiset.sum_map_sub, ← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [fieldStrength_apply] + have hcancel₁ : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + A p.2 ν (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))))).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + A r.2 ν (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))))).sum).sum := + Multiset.sum_antidiagonal_assoc s (fun a b c => + A c ν (adjointDualCoeff U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 a (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))))) + have hcancel₂ : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + A p.2 μ (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)))))).sum).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + A q.2 μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.2 (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)))))).sum).sum := by + refine (Multiset.sum_antidiagonal_assoc s (fun a b c => + A c μ (adjointDualCoeff U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 a (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν))))))).trans ?_ + exact Multiset.sum_antidiagonal_swap s (fun a b => + (b.antidiagonal.map fun q => + A q.2 μ (adjointDualCoeff U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 a (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν)))))).sum) + set Θ : 𝔤 →+ B := ((algebraMap ℂ B).toAddMonoidHom.comp + ((Complex.ofRealHom : ℝ →+* ℂ).toAddMonoidHom.comp φ.toAddMonoidHom)) with hΘdef + have hΘ : ∀ z : 𝔤, algebraMap ℂ B ((φ z : ℝ) : ℂ) = Θ z := fun z => rfl + have hconst : Θ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (μ ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν))) = + Θ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (ν ::ₘ s) + (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ))) + - (s.antidiagonal.map fun p => + Θ ⁅GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)), + GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 p.2 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ ν))⁆).sum := by + rw [eval_iteratedDeriv_maurerCartan_structure U⁻¹ s μ ν, map_sub, map_multiset_sum, + Multiset.map_map] + congr 1 + rw [hL, repGauge_cons_apply hA U μ s ν φ, repGauge_cons_apply hA U ν s μ φ, + hA.repGauge_commutatorFam U s μ ν φ, hR] + simp only [hΘ] + rw [hconst, hcancel₁, hcancel₂] + abel + +/-- **The field strength is an adjoint gauge tensor**: the packaging of + `repGauge_fieldStrength` as `TransformsInAdjoint` — the base case of the + covariant-derivative recursion `TransformsInAdjoint.covDerivAdjoint`. -/ +theorem transformsInAdjoint_fieldStrength (hA : IsGaugeField repLorentz repGauge A) + (μ ν : Fin 1 ⊕ Fin 3) : TransformsInAdjoint repGauge (fieldStrength A μ ν) := + fun U φ s => hA.repGauge_fieldStrength U s μ ν φ + +/-- The underived transformation law: at `s = 0` the Leibniz convolution collapses to + the homogeneous law — the field strength transforms by the base-point dual adjoint + action of `U⁻¹` on the adjoint index. -/ +lemma repGauge_fieldStrength_zero (hA : IsGaugeField repLorentz repGauge A) + (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repGauge U (fieldStrength A μ ν 0 φ) = + fieldStrength A μ ν 0 (adjointDualCoeff U⁻¹ 0 φ) := by + rw [hA.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, + Multiset.map_singleton, Multiset.sum_singleton] + +end IsGaugeField + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean new file mode 100644 index 000000000..1a1b0e4af --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean @@ -0,0 +1,264 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +/-! + +# Adjoint gauge tensors and the covariant derivative + +A family of derivative symbols is an *adjoint gauge tensor* when all its symbols +transform by the pure Leibniz convolution of the dual adjoint action, with no +inhomogeneous term. The convolution is forced: the gauge group acts on the +derivative symbols by substitution and the chain rule, so `U • [∂_s F^φ]` produces +every splitting `s = x + y` — `x` derivatives hitting the adjoint, `y` remaining on +`F`; the naive law `U • [∂_s F^φ] = F^{(∂_s Ad)^* φ}` holds only at `s = 0`. + +The two theorems of this section: the field strength is an adjoint gauge tensor +(`transformsInAdjoint_fieldStrength`), and adjoint gauge tensors are closed under +the covariant derivative `∇_ρ F = [∂_ρ F] + ⁅A_ρ, F⁆` +(`TransformsInAdjoint.covDerivAdjoint`) — so by recursion every iterated covariant +derivative of the field strength is an adjoint gauge tensor. + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +open Matrix MatrixGroups TensorProduct +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable [GaugeJet G 𝔤 G₀ 𝔤J] + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ G B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + +/-- A family of derivative symbols `F` *transforms in the adjoint* (is an adjoint gauge + tensor) for the gauge representation `repGauge` when each symbol `[∂_s F^φ]` + transforms by the Leibniz convolution of the dual adjoint coefficients against lower + symbols — the shape of `gauge_apply_deriv` with no Maurer–Cartan shift. At `s = 0` + this is the homogeneous law `U • F^φ = F^{Ad₀^* φ}`. -/ +def TransformsInAdjoint (repGauge : Representation ℂ G B) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : Prop := + ∀ (U : G) (φ : Module.Dual ℝ 𝔤) (s : Multiset (Fin 1 ⊕ Fin 3)), + repGauge U (F s φ) = + (s.antidiagonal.map fun p => F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum + +/-- **The derived bracket family** `⁅A_ρ, F⁆`: the `s`-derivative of the bracket of the + gauge field against a family, given by the Leibniz convolution of the derivative + symbols over the multiset antidiagonal. -/ +noncomputable def bracketFamConv + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + (s.antidiagonal.map fun p => bracketFam (A p.1 ρ) (F p.2)).sum + +/-- The covariant derivative `∇_ρ F = [∂_ρ F] + ⁅A_ρ, F⁆` of an adjoint-valued family + of derivative symbols: the extra derivative on the symbol plus the derived bracket + against the gauge field. The gauge-algebra bracket carries the physicists' `i`, so + in matrix terms this is `∂_ρ F + i [A_ρ, F]` — the adjoint-representation covariant + derivative in the same `D = ∂ + i A` convention as the field strength. It preserves + `TransformsInAdjoint` (`TransformsInAdjoint.covDerivAdjoint`). -/ +noncomputable def covDerivAdjoint + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + F (ρ ::ₘ s) + bracketFamConv A ρ F s + +@[simp] +lemma covDerivAdjoint_apply + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + covDerivAdjoint A F ρ s φ = F (ρ ::ₘ s) φ + bracketFamConv A ρ F s φ := rfl + +/-! + +## The iterated covariance of the covariant derivative + +-/ + +/-- If `F` transforms in the adjoint, so do its `κ ::ₘ s`-derived symbols with the + extra derivative traced through `adjointDualCoeff_cons`: the Leibniz splittings + where `κ` stays a derivative, minus the convolution where `κ` hits the adjoint — + an `ad` of the derived Maurer–Cartan form. -/ +lemma TransformsInAdjoint.repGauge_cons + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) + (U : G) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ 𝔤) : + repGauge U (F (κ ::ₘ s) φ) = + (s.antidiagonal.map fun p => + F (κ ::ₘ p.2) (adjointDualCoeff U⁻¹ p.1 φ)).sum + - (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + F p.2 (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q.1 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ κ)))))).sum).sum := by + rw [hF U φ (κ ::ₘ s)] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + have hsec : (Multiset.map (fun p => + F p.2 (adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = + -(s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + F p.2 (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q.1 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ κ)))))).sum).sum := by + rw [← Multiset.sum_map_neg''] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [adjointDualCoeff_cons U⁻¹ κ p.1 φ, map_neg, map_multiset_sum, Multiset.map_map] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => rfl)) + rw [hsec, sub_eq_add_neg] + +set_option maxHeartbeats 2000000 in +/-- The all-orders gauge transformation of the derived bracket `⁅A_ρ, F⁆` against an + adjoint gauge tensor `F`: since `F` transforms homogeneously, only one `ad` + cross-term convolution survives — the analogue of `repGauge_commutatorFam` + with a gauge tensor in the second slot. -/ +lemma TransformsInAdjoint.repGauge_bracketFamConv + (hA : IsGaugeField repLorentz repGauge A) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repGauge U (bracketFamConv A ρ F s φ) = + (s.antidiagonal.map fun p => + bracketFamConv A ρ F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum + + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + F r.2 (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)))))).sum).sum := by + have hAlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ 𝔤), + repGauge U (A u ρ ψ) = + ((u.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 u (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)))) := by + intro u ψ + rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + congr 1 + have hFlaw : ∀ (u : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ 𝔤), + repGauge U (F u ψ) = + ((u.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) ψ + + algebraMap ℂ B (ψ (0 : 𝔤)) := by + intro u ψ + rw [hF U ψ u, Multiset.sum_linearMap_apply, Multiset.map_map] + simp only [map_zero, Complex.ofReal_zero, add_zero] + congr 1 + have hMa : (s.antidiagonal.map fun p => + bracketFam ((p.1.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) φ).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam (A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [bracketFam_sum_left, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply] + rw [bracketFam_sum_right, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply] + have hMc : (s.antidiagonal.map fun p => + bracketFamConv A ρ F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => + bracketFam (A r.1 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, + Multiset.map_congr rfl (fun r hr => by + rw [Function.comp_apply, + bracketFam_adjointDualCoeff U⁻¹ p.1 (A r.1 ρ) (F r.2) φ]), + Multiset.sum_map_sum_map] + have hM := hMa.trans ((Multiset.sum_antidiagonal_exchange s fun a b c d => + bracketFam (A b ρ ∘ₗ adjointDualCoeff U⁻¹ a) + (F d ∘ₗ adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) + have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)))) = + (p.2.antidiagonal.map fun r => + F r.2 (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)))))).sum := by + intro p + rw [Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) + simp only [Function.comp_apply, LinearMap.coe_comp] + rw [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, map_multiset_sum, + Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, Function.comp_apply, + hA.repGauge_bracketFam U (hAlaw p.1) (hFlaw p.2) φ, hCg p, map_zero, + LinearMap.comp_zero, map_zero, sub_zero, lie_zero, map_zero, + Complex.ofReal_zero, map_zero, add_zero]), + Multiset.sum_map_add, hM] + +set_option maxHeartbeats 2000000 in +/-- **Adjoint gauge tensors are closed under the covariant derivative**: if `F` + transforms in the adjoint, so does `∇_ρ F = [∂_ρ F] + ⁅A_ρ, F⁆`. The single + inhomogeneous convolution of `[∂_{ρ ::ₘ s} F]` + (`TransformsInAdjoint.repGauge_cons`) cancels the single `ad` cross-term + convolution of `⁅A_ρ, F⁆` (`TransformsInAdjoint.repGauge_bracketFamConv`) + through the coassociativity of the antidiagonal; no structural equation is needed. + Together with `transformsInAdjoint_fieldStrength` this makes every iterated + covariant derivative of the field strength an adjoint gauge tensor, by recursion. -/ +theorem TransformsInAdjoint.covDerivAdjoint + (hA : IsGaugeField repLorentz repGauge A) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) (ρ : Fin 1 ⊕ Fin 3) : + TransformsInAdjoint repGauge (IsGaugeField.covDerivAdjoint A F ρ) := by + intro U φ s + have hL : repGauge U (IsGaugeField.covDerivAdjoint A F ρ s φ) = + repGauge U (F (ρ ::ₘ s) φ) + repGauge U (bracketFamConv A ρ F s φ) := by + rw [covDerivAdjoint_apply, map_add] + have hR : (s.antidiagonal.map fun p => + IsGaugeField.covDerivAdjoint A F ρ p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum = + (s.antidiagonal.map fun p => + F (ρ ::ₘ p.2) (adjointDualCoeff U⁻¹ p.1 φ)).sum + + (s.antidiagonal.map fun p => + bracketFamConv A ρ F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by + rw [← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [covDerivAdjoint_apply] + have hcancel : (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + F p.2 (adjointDualCoeff U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 q.1 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)))))).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun r => + F r.2 (adjointDualCoeff U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 p.1 + (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)))))).sum).sum := + Multiset.sum_antidiagonal_assoc s (fun a b c => + F c (adjointDualCoeff U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (GaugeJet.evalLie G (𝔤 := 𝔤) + (GaugeJet.iteratedDeriv G 𝔤 a (GaugeJet.mc 𝔤 (G := G) U⁻¹ ρ)))))) + rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv hA U s ρ φ, + hR, hcancel] + abel + +end IsGaugeField + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean new file mode 100644 index 000000000..c21b5bb23 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean @@ -0,0 +1,249 @@ +/- +Copyright (c) 2026 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 Mathlib.Algebra.Lie.Basic +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.Algebra.Group.Subgroup.Basic +public import Physlib.Relativity.DerivAlgebra +/-! +# Jets of a gauge group + +## i. Overview + +A gauge transformation is a spacetime-dependent element of the gauge group `G₀`; what a +local Lagrangian sees of it is its *jet* at the base point. The jet gauge transformations +form a group `G`, and their infinitesimal counterparts a Lie algebra `𝔤J` over `ℝ`, with the +value at the base point given by `eval : G →* G₀` and `evalLie : 𝔤J →ₗ⁅ℝ⁆ 𝔤`. + +This file records, as the class `GaugeJet G 𝔤 G₀ 𝔤J`, exactly the structure of this +situation that the transformation laws of gauge fields and matter fields use: + +* the inclusion of constants and evaluation at the base point, on the group and on the + Lie algebra; +* the formal spacetime derivatives `deriv μ` on `𝔤J`, commuting, satisfying the Leibniz + rule for the bracket, and killing constants; +* the adjoint action of `G` on `𝔤J`, by Lie algebra automorphisms; +* the Maurer–Cartan form `mc U μ = i (∂_μ U) U⁻¹`, with its flatness equation + `mc_structure` and the Leibniz rule `deriv_adjoint` for the adjoint action. + +For the Standard Model, `G₀ = SU(3) × SU(2) × U(1)` and `G` is the same group with +coefficients in the ring of formal power series in the spacetime coordinates +(`StandardModel.JetGaugeGroupI`); nothing here depends on that choice. + +## ii. Key results + +- `GaugeJet` : the class. +- `GaugeJet.iteratedDeriv` : the iterated derivative `∂_s` on `𝔤J` along a multiset of + directions, with `iteratedDeriv_cons`, `iteratedDeriv_add` and the iterated Leibniz rule + `iteratedDeriv_bracket`. +- `GaugeJetLeibniz` : the Taylor–Leibniz rule for the adjoint action, the input to the + gauge action on the algebra of gauge-boson symbols. +- `GaugeJetTruncation` : the filtration of `G` by the order to which a jet is trivial, with + the vanishing of the derivatives of the adjoint action on its members. + +-/ + +@[expose] public section + +/-- **Jets of a gauge group.** A gauge group `G₀` with Lie algebra `𝔤`, its group of jets `G` + with Lie algebra of jets `𝔤J`, evaluation at the base point, formal derivatives, the adjoint + action and the Maurer–Cartan form, subject to the identities used by the transformation + laws of gauge and matter fields. -/ +class GaugeJet (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + (G₀ : outParam Type) [Group G₀] (𝔤J : outParam Type) [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] where + /-- Evaluation of a gauge jet at the base point. -/ + eval : G →* G₀ + /-- A constant gauge transformation as a jet. -/ + ofConstant : G₀ →* G + eval_ofConstant : ∀ g, eval (ofConstant g) = g + /-- Evaluation of a Lie algebra jet at the base point. -/ + evalLie : 𝔤J →ₗ⁅ℝ⁆ 𝔤 + /-- A constant Lie algebra element as a jet. -/ + ofConstantLie : 𝔤 →ₗ[ℝ] 𝔤J + ofConstantLie_lie : ∀ a b, ofConstantLie ⁅a, b⁆ = ⁅ofConstantLie a, ofConstantLie b⁆ + /-- The formal derivative in the direction `μ`. -/ + deriv : (Fin 1 ⊕ Fin 3) → 𝔤J →ₗ[ℝ] 𝔤J + deriv_comm : ∀ (μ ν : Fin 1 ⊕ Fin 3) (a : 𝔤J), deriv μ (deriv ν a) = deriv ν (deriv μ a) + deriv_bracket : ∀ (μ : Fin 1 ⊕ Fin 3) (x y : 𝔤J), + deriv μ ⁅x, y⁆ = ⁅deriv μ x, y⁆ + ⁅x, deriv μ y⁆ + deriv_ofConstantLie : ∀ (μ : Fin 1 ⊕ Fin 3) (a : 𝔤), deriv μ (ofConstantLie a) = 0 + /-- The adjoint action of the jet group on the jet Lie algebra. -/ + adjoint : Representation ℝ G 𝔤J + adjoint_lie : ∀ (U : G) (x y : 𝔤J), adjoint U ⁅x, y⁆ = ⁅adjoint U x, adjoint U y⁆ + /-- The Maurer–Cartan form `i (∂_μ U) U⁻¹` of a gauge jet. -/ + mc : G → (Fin 1 ⊕ Fin 3) → 𝔤J + mc_one : ∀ μ, mc 1 μ = 0 + /-- The Maurer–Cartan form is a cocycle for the adjoint action. -/ + mc_cocycle : ∀ (U V : G) (μ : Fin 1 ⊕ Fin 3), mc (U * V) μ = mc U μ + adjoint U (mc V μ) + /-- The Maurer–Cartan form is flat. -/ + mc_structure : ∀ (U : G) (μ ν : Fin 1 ⊕ Fin 3), + deriv μ (mc U ν) - deriv ν (mc U μ) + ⁅mc U μ, mc U ν⁆ = 0 + /-- The Leibniz rule for the adjoint action. -/ + deriv_adjoint : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J), + deriv μ (adjoint U x) = adjoint U (deriv μ x) - ⁅mc U μ, adjoint U x⁆ + /-- The adjoint representation of the value group on its Lie algebra. -/ + adjointValue : Representation ℝ G₀ 𝔤 + /-- At the base point, the adjoint action of a jet on a constant is the adjoint action of + its value. -/ + evalLie_adjoint_ofConstantLie : ∀ (U : G) (a : 𝔤), + evalLie (adjoint U (ofConstantLie a)) = adjointValue (eval U) a + +namespace GaugeJet + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + [GaugeJet G 𝔤 G₀ 𝔤J] + +/-- A constant jet evaluates to its constant. -/ +lemma evalLie_ofConstantLie (a : 𝔤) : evalLie G (𝔤 := 𝔤) (ofConstantLie G a) = a := by + have h := evalLie_adjoint_ofConstantLie (G := G) (𝔤 := 𝔤) 1 a + simp only [map_one, Module.End.one_apply] at h + exact h + +/-- A jet with trivial value acts trivially on constants at the base point. -/ +lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : G} (hU : eval 𝔤 U = 1) (a : 𝔤) : + evalLie G (adjoint 𝔤 U (ofConstantLie G a)) = a := by + rw [evalLie_adjoint_ofConstantLie, hU, map_one, Module.End.one_apply] + +/-! + +## A. The iterated derivative + +-/ + +/-- Post-composition with `deriv` is right-commutative, since formal derivatives + commute (`deriv_comm`). This is what allows iterated derivatives to be indexed by a + `Multiset` of directions. -/ +instance instRightCommutativeCompDeriv : RightCommutative + (fun (D : 𝔤J →ₗ[ℝ] 𝔤J) (μ : Fin 1 ⊕ Fin 3) => D.comp (deriv (G := G) (𝔤 := 𝔤) μ)) where + right_comm D μ ν := by + refine LinearMap.ext fun a => ?_ + exact congrArg D (deriv_comm (G := G) (𝔤 := 𝔤) μ ν a) + +variable (G 𝔤) in +/-- The iterated formal derivative on the jet Lie algebra, in the (unordered, since + derivatives commute) directions given by the multiset `μs`. -/ +noncomputable def iteratedDeriv (μs : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤J →ₗ[ℝ] 𝔤J := + μs.foldl (fun D μ => D.comp (deriv (G := G) (𝔤 := 𝔤) μ)) LinearMap.id + +@[simp] +lemma iteratedDeriv_zero : iteratedDeriv G 𝔤 (0 : Multiset (Fin 1 ⊕ Fin 3)) = LinearMap.id := by + simp [iteratedDeriv] + +lemma iteratedDeriv_cons (μ : Fin 1 ⊕ Fin 3) (μs : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedDeriv G 𝔤 (μ ::ₘ μs) = (deriv (G := G) (𝔤 := 𝔤) μ).comp (iteratedDeriv G 𝔤 μs) := by + have h : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (D : 𝔤J →ₗ[ℝ] 𝔤J), + s.foldl (fun D μ => D.comp (deriv (G := G) (𝔤 := 𝔤) μ)) D + = D.comp (iteratedDeriv G 𝔤 s) := by + intro s + induction s using Multiset.induction_on with + | empty => intro D; simp [iteratedDeriv] + | cons κ t ih => + intro D + rw [iteratedDeriv, Multiset.foldl_cons, Multiset.foldl_cons, ih, ih] + simp [LinearMap.comp_assoc] + rw [iteratedDeriv, Multiset.foldl_cons, h] + simp + +/-- The iterated derivative is additive in the multiset of directions: deriving + along `s + t` is deriving along `t` and then along `s`. -/ +lemma iteratedDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedDeriv G 𝔤 (s + t) = (iteratedDeriv G 𝔤 s).comp (iteratedDeriv G 𝔤 t) := by + induction s using Multiset.induction_on with + | empty => simp [iteratedDeriv_zero] + | cons μ s ih => + rw [Multiset.cons_add, iteratedDeriv_cons, iteratedDeriv_cons, ih, + LinearMap.comp_assoc] + +@[simp] +lemma iteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + iteratedDeriv G 𝔤 ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = deriv (G := G) (𝔤 := 𝔤) μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, iteratedDeriv_cons, + iteratedDeriv_zero, LinearMap.comp_id] + +/-- The iterated Leibniz rule for the bracket: the iterated derivative of a bracket + is the antidiagonal convolution of iterated derivatives of the two arguments. -/ +lemma iteratedDeriv_bracket (s : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤J) : + iteratedDeriv G 𝔤 s ⁅a, b⁆ = + (s.antidiagonal.map fun p => ⁅iteratedDeriv G 𝔤 p.1 a, iteratedDeriv G 𝔤 p.2 b⁆).sum := by + induction s using Multiset.induction_on with + | empty => simp [Multiset.antidiagonal_zero] + | cons κ s ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, ih, map_multiset_sum, + Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by + rw [Function.comp_apply, deriv_bracket, + show deriv (G := G) (𝔤 := 𝔤) κ (iteratedDeriv G 𝔤 p.1 a) + = iteratedDeriv G 𝔤 (κ ::ₘ p.1) a from by + rw [iteratedDeriv_cons]; rfl, + show deriv (G := G) (𝔤 := 𝔤) κ (iteratedDeriv G 𝔤 p.2 b) + = iteratedDeriv G 𝔤 (κ ::ₘ p.2) b from by + rw [iteratedDeriv_cons]; rfl]), + Multiset.sum_map_add] + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + abel + +/-- The iterated derivative of a constant jet vanishes for a nonempty multiset of + directions. -/ +lemma iteratedDeriv_ofConstantLie_of_ne_zero {p : Multiset (Fin 1 ⊕ Fin 3)} (hp : p ≠ 0) + (a : 𝔤) : iteratedDeriv G 𝔤 p (ofConstantLie G a) = 0 := by + induction p using Multiset.induction_on with + | empty => exact absurd rfl hp + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply] + rcases eq_or_ne t 0 with rfl | ht + · rw [iteratedDeriv_zero, LinearMap.id_apply, deriv_ofConstantLie] + · rw [ih ht, map_zero] + +end GaugeJet + +/-! + +## B. The Taylor–Leibniz rule for the adjoint action + +-/ + +/-- **The Taylor–Leibniz rule for the adjoint action**: the base-point Taylor coefficients + of `Ad_U Y` are the antidiagonal convolution of the Taylor coefficients of `Ad_U` — the + `evalLie ∘ ∂_p ∘ Ad_U ∘ ofConstantLie` of the covariance machinery — with those of `Y`. + This is what makes the gauge action on the algebra of gauge-boson symbols a + representation; for a matrix group it is the Leibniz rule for products of matrices of + power series. -/ +class GaugeJetLeibniz (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + (G₀ : outParam Type) [Group G₀] (𝔤J : outParam Type) [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + [GaugeJet G 𝔤 G₀ 𝔤J] where + evalLie_iteratedDeriv_adjoint : ∀ (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J), + GaugeJet.evalLie G (𝔤 := 𝔤) (G₀ := G₀) (𝔤J := 𝔤J) + (GaugeJet.iteratedDeriv G 𝔤 x (GaugeJet.adjoint 𝔤 (G := G) (G₀ := G₀) (𝔤J := 𝔤J) U Y)) + = (x.antidiagonal.map fun p => GaugeJet.evalLie G (𝔤 := 𝔤) (G₀ := G₀) (𝔤J := 𝔤J) + (GaugeJet.iteratedDeriv G 𝔤 p.1 (GaugeJet.adjoint 𝔤 (G := G) (G₀ := G₀) (𝔤J := 𝔤J) U + (GaugeJet.ofConstantLie G (𝔤 := 𝔤) (G₀ := G₀) (𝔤J := 𝔤J) + (GaugeJet.evalLie G (𝔤 := 𝔤) (G₀ := G₀) (𝔤J := 𝔤J) + (GaugeJet.iteratedDeriv G 𝔤 p.2 Y)))))).sum + +/-! + +## C. Truncation + +-/ + +/-- **The truncation filtration of the jet gauge group**: `truncationKer n` is the subgroup + of jets trivial to order `n`. What is used of it is that on a jet trivial to order `n` all + derivatives of the adjoint action + of order between `1` and `n` vanish at the base point. -/ +class GaugeJetTruncation (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + (G₀ : outParam Type) [Group G₀] (𝔤J : outParam Type) [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + [GaugeJet G 𝔤 G₀ 𝔤J] where + /-- The subgroup of jets trivial to order `n`. -/ + truncationKer : ℕ → Subgroup G + evalLie_iteratedDeriv_adjoint_ofConstantLie_eq_zero : ∀ {U : G} {n : ℕ}, + U ∈ truncationKer n → ∀ {x : Multiset (Fin 1 ⊕ Fin 3)}, x ≠ 0 → x.card ≤ n → + ∀ b : 𝔤, GaugeJet.evalLie (G := G) (𝔤 := 𝔤) (G₀ := G₀) (𝔤J := 𝔤J) + (GaugeJet.iteratedDeriv G 𝔤 x + (GaugeJet.adjoint (G := G) (𝔤 := 𝔤) (G₀ := G₀) (𝔤J := 𝔤J) U + (GaugeJet.ofConstantLie (G := G) (𝔤 := 𝔤) (G₀ := G₀) (𝔤J := 𝔤J) b))) = 0 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean new file mode 100644 index 000000000..067fd4897 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +/-! +# Charged matter fields under `U(1)` jets + +## i. Overview + +A field valued in a complex vector space `V` with integer charge `n` transforms under a +`U(1)` gauge transformation `U = e^{iχ}` by `ψ ↦ U^n ψ`. On jets this is multiplication of the +jet-ring factor of `JetRing ⊗[ℂ] V` by the unitary power series `U^n`; the action is +manifestly fibrewise. `MatterField.charged` packages a Lorentz representation, a charge and +a mass weight into a matter field for the jet gauge group `unitary JetRing` of `U(1)`. + +## ii. Key results + +- `MatterField.chargeRep` : the charge-`n` action of `U(1)` jets on the jets of a field. +- `MatterField.chargeRep_smul` : the action is fibrewise. +- `MatterField.charged` : the matter field of charge `n`. + +## iii. Table of contents + +- A. Powers of a unitary jet +- B. The charge action on jets +- C. Charged matter fields + +-/ + +@[expose] public section + +namespace MatterField + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. Powers of a unitary jet + +-/ + +/-- The unitary power series `U ^ n` of a `U(1)` jet, for an integer charge `n`. -/ +noncomputable def chargePow (n : ℤ) (U : unitary JetRing) : JetRing := + ((Unitary.toUnits U ^ n : JetRingˣ) : JetRing) + +lemma chargePow_one (n : ℤ) : chargePow n 1 = 1 := by + simp [chargePow] + +lemma chargePow_mul (n : ℤ) (U W : unitary JetRing) : + chargePow n (U * W) = chargePow n U * chargePow n W := by + simp [chargePow, mul_zpow] + +/-! + +## B. The charge action on jets + +-/ + +/-- **The charge-`n` action of `U(1)` jets on the jets of a `V`-valued field**: + multiplication of the jet-ring factor by `U ^ n`. -/ +noncomputable def chargeRep (n : ℤ) (V : Type) [AddCommGroup V] [Module ℂ V] : + Representation ℂ (unitary JetRing) (JetRing ⊗[ℂ] V) where + toFun U := LinearMap.rTensor V (LinearMap.mulLeft ℂ (chargePow n U)) + map_one' := by + rw [chargePow_one, LinearMap.mulLeft_one, LinearMap.rTensor_id] + rfl + map_mul' U W := by + rw [chargePow_mul, + show LinearMap.mulLeft ℂ (chargePow n U * chargePow n W) + = (LinearMap.mulLeft ℂ (chargePow n U)) ∘ₗ (LinearMap.mulLeft ℂ (chargePow n W)) from + LinearMap.ext fun z => mul_assoc _ _ z, + LinearMap.rTensor_comp] + rfl + +lemma chargeRep_tmul (n : ℤ) (U : unitary JetRing) (f : JetRing) (v : V) : + chargeRep n V U (f ⊗ₜ[ℂ] v) = (chargePow n U * f) ⊗ₜ[ℂ] v := + LinearMap.rTensor_tmul _ _ _ _ + +/-- **The charge action is fibrewise**: it commutes with multiplication by scalar jets. -/ +lemma chargeRep_smul (n : ℤ) (U : unitary JetRing) (χ : JetRing) (z : JetRing ⊗[ℂ] V) : + chargeRep n V U (χ • z) = χ • chargeRep n V U z := by + induction z using TensorProduct.induction_on with + | zero => simp + | tmul f v => + rw [TensorProduct.smul_tmul', chargeRep_tmul, chargeRep_tmul, TensorProduct.smul_tmul', + smul_eq_mul, smul_eq_mul, mul_left_comm] + | add x y hx hy => rw [smul_add, map_add, map_add, hx, hy, smul_add] + +/-! + +## C. Charged matter fields + +-/ + +/-- **The charged matter field**: a field with values in `V`, Lorentz representation + `repLorentz`, electric charge `n` and mass weight `w`, as a matter field for the jets of + `U(1)`. -/ +noncomputable def charged [Module.Free ℂ V] [Module.Finite ℂ V] + (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : + MatterField (unitary JetRing) where + V := V + repLorentz := repLorentz + repJet := chargeRep n V + repJet_smul := chargeRep_smul n + massWeight := w + +@[simp] +lemma charged_V [Module.Free ℂ V] [Module.Finite ℂ V] + (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : + (charged repLorentz n w).V = V := rfl + +end MatterField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean new file mode 100644 index 000000000..ef6026afc --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean @@ -0,0 +1,707 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +public import Mathlib.LinearAlgebra.Basis.Defs +public import Mathlib.LinearAlgebra.Dimension.Free +/-! + +# Gauge tensors in a general representation + +The adjoint story of `TransformsInAdjoint` generalizes to an arbitrary representation +of the jet gauge group: a matter field valued in a representation space `V` has +symbols `[∂_s ψ^i]` contracted against duals of `V`, and its transformation law is +the Leibniz convolution of the base-point Taylor coefficients of the representation. + +Since the gauge transformations are jets, the representation must act on `V`-valued +jets `JetRing ⊗[ℂ] V` — the value of `rep U` at a constant vector is spacetime +dependent, and the derivative symbols see its Taylor coefficients. This file provides +the toolkit for `V`-valued jets: + +* `jetOfConstant` — the inclusion of constants, `v ↦ 1 ⊗ v`; +* `jetDeriv`/`jetIteratedDeriv` — the formal derivative, acting on the jet factor; +* `jetEval` — evaluation at the base point, `f ⊗ v ↦ (constant coefficient of f) • v`; + +and with them + +* `repDualCoeff rep U x` — the physicists' `∂_x (rep U)^i_j|₀` transposed to the dual + of `V`, the analogue of `adjointDualCoeff` for a general representation; +* `TransformsIn` — the generalization of `TransformsInAdjoint`: the derivative + symbols of the family transform by the Leibniz convolution of `repDualCoeff`, with + no inhomogeneous term. + +## The covariant derivative + +The covariant derivative `∇_ρ F = D_ρ F + (A_ρ acting on the value index)` requires +the *infinitesimal* action of the gauge algebra on the value space — physicists' +`i dρ(T^a)` — which cannot be extracted from the abstract group representation `rep` +(there is no differentiable structure to differentiate it). It is therefore taken as +data: an `ℝ`-bilinear action `act : GaugeAlgebra →ₗ[ℝ] W →ₗ[ℝ] W`. The layer is +built for an arbitrary finite-dimensional real value space `W`, so that the adjoint +case `act = adAction` (the bracket as a bilinear map) literally specializes: +`covDerivAction A adAction F D ρ = covDerivAdjoint A F D ρ` holds definitionally +(`covDerivAction_adAction`). + +The compatibility between `rep` and `act` — the structure `IsInfinitesimalActionOf` — +and the theorem that under it the covariant derivative preserves the gauge tensors live +in `Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction`. + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +open Matrix MatrixGroups TensorProduct MvPowerSeries +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable [GaugeJet G 𝔤 G₀ 𝔤J] +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +namespace IsGaugeField + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ G B} +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ G B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + +/-! + +## The dual representation coefficients and gauge tensors in a representation + +-/ + +/-- The base-point adjoint transport at `x` derivatives, un-dualized: the map on the + gauge algebra whose transpose is `adjointDualCoeff`. -/ +noncomputable def adjointCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + 𝔤 →ₗ[ℝ] 𝔤 := + (GaugeJet.evalLie G (𝔤 := 𝔤)).toLinearMap ∘ₗ GaugeJet.iteratedDeriv G 𝔤 x ∘ₗ + GaugeJet.adjoint 𝔤 (G := G) U ∘ₗ GaugeJet.ofConstantLie G (𝔤 := 𝔤) + +lemma adjointDualCoeff_eq_dualMap (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + adjointDualCoeff (𝔤 := 𝔤) U x = (adjointCoeff U x).dualMap := rfl + +/-- The base-point Taylor coefficient of the representation: include the constant + vector into `V`-valued jets, act by `rep U`, differentiate `x` times, evaluate at + the base point. The composite is complex-linear: the physicists' + `∂_x (rep U)^i_j|₀` as a ℂ-linear map on the value space. -/ +noncomputable def repCoeff (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : V →ₗ[ℂ] V := + jetEval ∘ₗ jetIteratedDeriv x ∘ₗ rep U ∘ₗ jetOfConstant + +/-- The physicists' `∂_x (rep U)^i_j|₀` acting on the complex dual index of a + matter-field symbol: the transpose of `repCoeff`. This is the analogue of + `adjointDualCoeff` for a general representation of the jet gauge group; for `x = 0` + it is the dual (contragredient) action of the value of `U`, and for `x ≠ 0` it sees + the derivatives of the gauge transformation. -/ +noncomputable def repDualCoeff (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ V →ₗ[ℂ] Module.Dual ℂ V := + (repCoeff rep U x).dualMap + +/-- A component family `F`, valued in `B` and indexed by the complex dual of the + representation space `V`, *transforms in* the representation `rep` of the jet gauge + group — with the ambient action `repGauge` on `B` — when each derivative symbol + `[∂_s F^φ]` transforms by the Leibniz convolution of the dual representation + coefficients against lower symbols, with no inhomogeneous term — the generalization + of `TransformsInAdjoint` from the adjoint representation to an arbitrary one, and + the form consumed by `IsStandardModel`. -/ +def _root_.TransformsIn (repGauge : Representation ℂ G B) + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : Prop := + ∀ (U : G) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)), + repGauge U (F s φ) = + (s.antidiagonal.map fun p => F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum + +/-! + +## The covariant derivative through an infinitesimal action + +The covariant derivative `∇_ρ F = [∂_ρ F] + A_ρ · F` requires the *infinitesimal* +action of the gauge algebra on the value space — physicists' `i dρ(T^a)` — which +cannot be extracted from the abstract group representation `rep` (there is no +differentiable structure to differentiate it). It is therefore taken as data: an +action `act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V`, real-linear in the algebra slot (the +gauge algebra is a real Lie algebra) and complex-linear in the value slot, matching +the complex duals indexing the matter families. + +-/ + +section Action + +variable {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} + +/-- The action of an adjoint-valued field on a matter field at the tensor level: + multiplication in `B` on the first factors, the ℂ-linear infinitesimal action `act` + of the gauge algebra on `V` on the second, so that on pure tensors + `(b₁ ⊗ c) · (b₂ ⊗ v) = (b₁ b₂) ⊗ act c v`. -/ +noncomputable def tensorAction (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) : + (B ⊗[ℝ] 𝔤) →ₗ[ℝ] (B ⊗[ℂ] V) →ₗ[ℂ] B ⊗[ℂ] V := + TensorProduct.lift + { toFun := fun b₁ => + { toFun := fun c => TensorProduct.map (LinearMap.mulLeft ℂ b₁) (act c) + map_add' := fun c₁ c₂ => TensorProduct.ext' fun b₂ v => by + simp [TensorProduct.tmul_add] + map_smul' := fun r c => TensorProduct.ext' fun b₂ v => by + simp [TensorProduct.tmul_smul] } + map_add' := fun b₁ b₁' => LinearMap.ext fun c => TensorProduct.ext' fun b₂ v => by + simp [add_mul, TensorProduct.add_tmul] + map_smul' := fun r b₁ => LinearMap.ext fun c => TensorProduct.ext' fun b₂ v => by + simp [TensorProduct.smul_tmul'] } + +@[simp] +lemma tensorAction_tmul (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (b₁ b₂ : B) + (c : 𝔤) (v : V) : + tensorAction act (b₁ ⊗ₜ[ℝ] c) (b₂ ⊗ₜ[ℂ] v) = (b₁ * b₂) ⊗ₜ[ℂ] act c v := rfl + +lemma tensorAction_map_left (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (Φ : B →ₗ[ℂ] B) + (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) (s : B ⊗[ℝ] 𝔤) + (t : B ⊗[ℂ] V) : + tensorAction act ((TensorProduct.map (Φ.restrictScalars ℝ) LinearMap.id) s) + ((TensorProduct.map Φ LinearMap.id) t) = + (TensorProduct.map Φ LinearMap.id) (tensorAction act s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => simp [hΦ] + | add x y hx hy => + simp only [map_add] + rw [hx, hy] + | add x y hx hy => simp [hx, hy] + +lemma tensorAction_one_left (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (c : 𝔤) + (t : B ⊗[ℂ] V) : + tensorAction act ((1 : B) ⊗ₜ[ℝ] c) t = + (TensorProduct.map LinearMap.id (act c)) t := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b a => simp + | add x y hx hy => simp [hx, hy] + +/-- `tensorAction` under an antidiagonal pair of transport families: if the + `V`-transports intertwine `act` with the `𝔤`-transports as an + antidiagonal convolution, so do `id ⊗ ·` over `tensorAction`. -/ +lemma tensorAction_map_right_antidiagonal (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (Tg : Multiset (Fin 1 ⊕ Fin 3) → 𝔤 →ₗ[ℝ] 𝔤) + (Tv : Multiset (Fin 1 ⊕ Fin 3) → V →ₗ[ℂ] V) (x : Multiset (Fin 1 ⊕ Fin 3)) + (hT : ∀ (c : 𝔤) (w : V), Tv x (act c w) = + (x.antidiagonal.map fun p => act (Tg p.1 c) (Tv p.2 w)).sum) + (s : B ⊗[ℝ] 𝔤) (t : B ⊗[ℂ] V) : + (x.antidiagonal.map fun p => + tensorAction act ((TensorProduct.map LinearMap.id (Tg p.1)) s) + ((TensorProduct.map LinearMap.id (Tv p.2)) t)).sum = + (TensorProduct.map LinearMap.id (Tv x)) (tensorAction act s t) := by + induction s using TensorProduct.induction_on with + | zero => simp + | tmul b₁ a₁ => + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b₂ a₂ => + simp only [tensorAction_tmul, TensorProduct.map_tmul, LinearMap.id_coe, id_eq] + rw [hT, Multiset.tmul_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + simp) + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by rw [map_add, map_add]), + Multiset.sum_map_add, hy, hz, ← map_add, ← map_add] + | add y z hy hz => + rw [Multiset.map_congr rfl (fun p hp => by + rw [map_add, map_add, LinearMap.add_apply]), + Multiset.sum_map_add, hy, hz, ← map_add, ← LinearMap.add_apply, ← map_add] + +variable [FiniteDimensional ℂ V] + +/-- The canonical equivalence between matter fields `B ⊗[ℂ] V` and their component + families `φ ↦ F^φ` over the complex dual — `dualPairEquiv` for a general + finite-dimensional complex value space. -/ +noncomputable def dualPairEquivC : (B ⊗[ℂ] V) ≃ₗ[ℂ] (Module.Dual ℂ V →ₗ[ℂ] B) := + TensorProduct.comm ℂ B V ≪≫ₗ + TensorProduct.congr (Module.evalEquiv ℂ V) (LinearEquiv.refl ℂ B) ≪≫ₗ + dualTensorHomEquiv ℂ (Module.Dual ℂ V) B + +@[simp] +lemma dualPairEquivC_tmul (b : B) (v : V) (φ : Module.Dual ℂ V) : + dualPairEquivC (b ⊗ₜ[ℂ] v) φ = φ v • b := by + simp [dualPairEquivC, dualTensorHomEquiv, Module.evalEquiv_apply] + +lemma dualPairEquivC_map_left (Φ : B →ₗ[ℂ] B) (t : B ⊗[ℂ] V) + (φ : Module.Dual ℂ V) : + dualPairEquivC ((TensorProduct.map Φ LinearMap.id) t) φ = + Φ (dualPairEquivC t φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b w => simp + | add x y hx hy => simp [hx, hy] + +lemma dualPairEquivC_map_right (T : V →ₗ[ℂ] V) (t : B ⊗[ℂ] V) + (φ : Module.Dual ℂ V) : + dualPairEquivC ((TensorProduct.map LinearMap.id T) t) φ = + dualPairEquivC t (T.dualMap φ) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul b w => simp + | add x y hx hy => simp [hx, hy] + +lemma symm_comp_left_C (Φ : B →ₗ[ℂ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) : + dualPairEquivC.symm (Φ ∘ₗ g) = + (TensorProduct.map Φ LinearMap.id) (dualPairEquivC.symm g) := by + apply dualPairEquivC.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquivC_map_left, LinearEquiv.apply_symm_apply] + rfl + +lemma symm_comp_right_C (T : V →ₗ[ℂ] V) (g : Module.Dual ℂ V →ₗ[ℂ] B) : + dualPairEquivC.symm (g ∘ₗ T.dualMap) = + (TensorProduct.map LinearMap.id T) (dualPairEquivC.symm g) := by + apply dualPairEquivC.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + rw [dualPairEquivC_map_right, LinearEquiv.apply_symm_apply] + rfl + +/-- The action of an adjoint-indexed component family on a matter one, through the + infinitesimal action `act`: assemble both into fields, act by `tensorAction`, read + back out as components. This is the physicists' `f^a (T_a)^i_j g^j` with `T = act`, + basis-free. -/ +noncomputable def actionFam (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) : + Module.Dual ℂ V →ₗ[ℂ] B := + dualPairEquivC (tensorAction act (dualPairEquiv.symm f) (dualPairEquivC.symm g)) + +lemma actionFam_add_left (f₁ f₂ : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (g : Module.Dual ℂ V →ₗ[ℂ] B) : + actionFam act (f₁ + f₂) g = actionFam act f₁ g + actionFam act f₂ g := by + simp only [actionFam, map_add, LinearMap.add_apply] + +lemma actionFam_add_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (g₁ g₂ : Module.Dual ℂ V →ₗ[ℂ] B) : + actionFam act f (g₁ + g₂) = actionFam act f g₁ + actionFam act f g₂ := by + simp only [actionFam, map_add] + +lemma actionFam_zero_left (g : Module.Dual ℂ V →ₗ[ℂ] B) : + actionFam act 0 g = 0 := by + simp [actionFam] + +lemma actionFam_zero_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + actionFam act f 0 = 0 := by + simp [actionFam] + +lemma actionFam_sum_left (S : Multiset (Module.Dual ℝ 𝔤 →ₗ[ℝ] B)) + (g : Module.Dual ℂ V →ₗ[ℂ] B) : + actionFam act S.sum g = (S.map fun f => actionFam act f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [actionFam_zero_left] + | cons f S ih => simp [actionFam_add_left, ih] + +lemma actionFam_sum_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (S : Multiset (Module.Dual ℂ V →ₗ[ℂ] B)) : + actionFam act f S.sum = (S.map fun g => actionFam act f g).sum := by + induction S using Multiset.induction_on with + | empty => simp [actionFam_zero_right] + | cons g S ih => simp [actionFam_add_right, ih] + +set_option maxHeartbeats 1000000 in +/-- The gauge transformation of the action of an affinely-transforming + adjoint-indexed family on a linearly-transforming matter family: the action of the + transformed families plus one `act`-type cross term. This is `repGauge_bracketFam` + with a homogeneous second slot and the bracket replaced by a general action. -/ +lemma repGauge_actionFam (hA : IsGaugeField repLorentz repGauge A) + (U : G) {f f' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + {g g' : Module.Dual ℂ V →ₗ[ℂ] B} {cf : 𝔤} + (hf : ∀ ψ : Module.Dual ℝ 𝔤, + repGauge U (f ψ) = f' ψ + algebraMap ℂ B (ψ cf)) + (hg : ∀ ψ : Module.Dual ℂ V, repGauge U (g ψ) = g' ψ) + (φ : Module.Dual ℂ V) : + repGauge U (actionFam act f g φ) = + actionFam act f' g' φ + g' (φ ∘ₗ act cf) := by + set Φ : B →ₗ[ℂ] B := repGauge U with hΦdef + have hΦmul : ∀ b₁ b₂ : B, Φ (b₁ * b₂) = Φ b₁ * Φ b₂ := fun b₁ b₂ => + hA.gauge_mul U b₁ b₂ + set s : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm f with hs + set t : B ⊗[ℂ] V := dualPairEquivC.symm g with ht + set s' : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm f' with hs' + set t' : B ⊗[ℂ] V := dualPairEquivC.symm g' with ht' + have hfm : (TensorProduct.map (Φ.restrictScalars ℝ) LinearMap.id) s + = s' + (1 : B) ⊗ₜ[ℝ] cf := by + rw [hs, hs', ← symm_comp_left, + show Φ.restrictScalars ℝ ∘ₗ f = f' + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] cf) from + LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, + LinearMap.restrictScalars_apply] + rw [hf ψ, dualPairEquiv_one_tmul], + map_add, LinearEquiv.symm_apply_apply] + have hgm : (TensorProduct.map Φ LinearMap.id) t = t' := by + rw [ht, ht', ← symm_comp_left_C, + show Φ ∘ₗ g = g' from LinearMap.ext fun ψ => by + simp only [LinearMap.comp_apply, hΦdef] + rw [hg ψ]] + have hact : dualPairEquivC (tensorAction act s t) = actionFam act f g := by + rw [hs, ht]; rfl + have hact' : dualPairEquivC (tensorAction act s' t') = actionFam act f' g' := by + rw [hs', ht']; rfl + have hπt' : dualPairEquivC t' = g' := by + rw [ht']; exact dualPairEquivC.apply_symm_apply _ + clear_value Φ s t s' t' + have htensor : (TensorProduct.map Φ LinearMap.id) (tensorAction act s t) = + tensorAction act s' t' + + (TensorProduct.map LinearMap.id (act cf)) t' := by + refine (tensorAction_map_left act Φ hΦmul s t).symm.trans + ((congrArg₂ (fun X Y => tensorAction act X Y) hfm hgm).trans ?_) + rw [map_add, LinearMap.add_apply, tensorAction_one_left] + have hread := congrArg (fun z => dualPairEquivC z φ) htensor + simp only [map_add, LinearMap.add_apply, dualPairEquivC_map_left, + dualPairEquivC_map_right] at hread + rw [show Φ (actionFam act f g φ) = + Φ (dualPairEquivC (tensorAction act s t) φ) from by rw [hact], + hread, hact', hπt'] + rfl + +/-- The derived action family `A_ρ · F`: the `s`-derivative of the action of the + gauge field on a matter family, given by the Leibniz convolution of the derivative + symbols over the multiset antidiagonal — the matter analogue of `bracketFamConv`. -/ +noncomputable def actionFamConv + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (ρ : Fin 1 ⊕ Fin 3) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ V →ₗ[ℂ] B := + (s.antidiagonal.map fun p => actionFam act (A p.1 ρ) (F p.2)).sum + +/-- The covariant derivative `∇_ρ F = [∂_ρ F] + A_ρ · F` of a matter family of + derivative symbols, in the single direction `ρ`: the extra derivative on the symbol + plus the derived action of the gauge field on the value index. With the physicists' + factor of `i` absorbed into `act` (as it is in the gauge-algebra bracket), this is + `∂_ρ F + i A_ρ^a T_a F` in the `D = ∂ + i A` convention. -/ +noncomputable def covDerivAction + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ V →ₗ[ℂ] B := + F (ρ ::ₘ s) + actionFamConv A act ρ F s + +@[simp] +lemma covDerivAction_apply + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + covDerivAction A act F ρ s φ = F (ρ ::ₘ s) φ + actionFamConv A act ρ F s φ := rfl + +/-- **The iterated covariant derivative** `∇_{l 0} ⋯ ∇_{l (n-1)} F` of a matter family + along an ordered tuple of directions: covariant derivatives do not commute (their + commutator is the action of the field strength), so the iteration is order-dependent + and indexed by `(n : ℕ)` and `l : Fin n → (Fin 1 ⊕ Fin 3)` — the same ordered-tuple + indexing as the derivative labels of `IsHiggsAlgebraValued`. The result is again a + family of derivative symbols; the physical iterated covariant derivative is its + value at the empty multiset. -/ +noncomputable def covDerivIter + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : + (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → + Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B + | 0, _ => F + | n + 1, l => covDerivAction A act (covDerivIter A act F n fun i => l i.succ) (l 0) + +@[simp] +lemma covDerivIter_zero (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (l : Fin 0 → (Fin 1 ⊕ Fin 3)) : + covDerivIter A act F 0 l = F := rfl + +@[simp] +lemma covDerivIter_succ (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + {n : ℕ} (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) : + covDerivIter A act F (n + 1) l = + covDerivAction A act (covDerivIter A act F n fun i => l i.succ) (l 0) := rfl + +/-! + +## The span lemma + +Replacing derivatives of a matter family by covariant derivatives does not change +the generated algebra of symbols: the correction terms are products of gauge-field +components with matter components. Note the statement is about generated +*subalgebras*, not linear spans — `∇_ρ F − ∂_ρ F` is a sum of products `A · F`, +which lies in the algebra generated by the symbols but not in their linear span. + +-/ + +/-- Decomposition of an assembled adjoint-indexed family along a basis of the gauge + algebra: the components against the dual basis, tensored with the basis vectors. -/ +lemma dualPairEquiv_symm_eq_sum {ι : Type*} [Fintype ι] + (bW : Module.Basis ι ℝ 𝔤) + (g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + dualPairEquiv.symm g = ∑ i, g (bW.coord i) ⊗ₜ[ℝ] bW i := by + apply dualPairEquiv.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + symm + rw [map_sum, LinearMap.sum_apply] + simp only [dualPairEquiv_tmul] + have hdual : (∑ i, φ (bW i) • bW.coord i) = φ := by + refine bW.ext fun j => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, + smul_eq_mul] + rw [Finset.sum_eq_single j + (fun i _ hij => by simp [Ne.symm hij]) + (fun h => absurd (Finset.mem_univ j) h)] + simp + calc ∑ i, φ (bW i) • g (bW.coord i) + = g (∑ i, φ (bW i) • bW.coord i) := by rw [map_sum]; simp + _ = g φ := by rw [hdual] + +/-- Decomposition of an assembled matter family along a basis of the value space. -/ +lemma dualPairEquivC_symm_eq_sum {ι : Type*} [Fintype ι] (bW : Module.Basis ι ℂ V) + (g : Module.Dual ℂ V →ₗ[ℂ] B) : + dualPairEquivC.symm g = ∑ i, g (bW.coord i) ⊗ₜ[ℂ] bW i := by + apply dualPairEquivC.injective + rw [LinearEquiv.apply_symm_apply] + refine LinearMap.ext fun φ => ?_ + symm + rw [map_sum, LinearMap.sum_apply] + simp only [dualPairEquivC_tmul] + have hdual : (∑ i, φ (bW i) • bW.coord i) = φ := by + refine bW.ext fun j => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, + smul_eq_mul] + rw [Finset.sum_eq_single j + (fun i _ hij => by simp [Ne.symm hij]) + (fun h => absurd (Finset.mem_univ j) h)] + simp + calc ∑ i, φ (bW i) • g (bW.coord i) + = g (∑ i, φ (bW i) • bW.coord i) := by rw [map_sum]; simp + _ = g φ := by rw [hdual] + +/-- The value of an action of families lies in any subalgebra containing the values + of both families: the action is a finite sum of products of components. -/ +lemma actionFam_apply_mem {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} {P : Subalgebra ℂ B} + {f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} {g : Module.Dual ℂ V →ₗ[ℂ] B} + (hf : ∀ ψ, f ψ ∈ P) (hg : ∀ χ, g χ ∈ P) (φ : Module.Dual ℂ V) : + actionFam act f g φ ∈ P := by + rw [actionFam, dualPairEquiv_symm_eq_sum (Module.finBasis ℝ 𝔤) f, + dualPairEquivC_symm_eq_sum (Module.finBasis ℂ V) g] + simp only [map_sum, LinearMap.sum_apply, tensorAction_tmul, dualPairEquivC_tmul] + refine sum_mem fun i _ => sum_mem fun j _ => ?_ + exact P.smul_mem (mul_mem (hf _) (hg _)) _ + +/-- **Unitriangularity of the covariant matter tower**: the covariant and plain + derivative symbols of a matter family differ by an element of the subalgebra + generated by the gauge-field symbols and the strictly lower-order matter symbols. + Stated at every derivative multiset `s`, as needed for the induction. -/ +lemma covDerivIter_sub_mem (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + covDerivIter A act F n l s φ - F (List.ofFn l + s) φ ∈ + Algebra.adjoin ℂ + ({b : B | ∃ (u : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ 𝔤), b = A u μ ψ} ∪ + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + t.card < n + s.card ∧ b = F t χ}) := by + induction n generalizing s φ with + | zero => + simp only [covDerivIter_zero, List.ofFn_zero, + show ((([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) = 0) from rfl, + zero_add, sub_self] + exact zero_mem _ + | succ n ih => + have hmono : ∀ {k m : ℕ}, k ≤ m → + Algebra.adjoin ℂ + ({b : B | ∃ u μ ψ, b = A u μ ψ} ∪ + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + t.card < k ∧ b = F t χ}) ≤ + Algebra.adjoin ℂ + ({b : B | ∃ u μ ψ, b = A u μ ψ} ∪ + {b : B | ∃ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + t.card < m ∧ b = F t χ}) := by + intro k m hkm + refine Algebra.adjoin_mono (Set.union_subset_union_right _ ?_) + rintro b ⟨t, χ, ht, rfl⟩ + exact ⟨t, χ, by omega, rfl⟩ + have hms : ((List.ofFn l : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) + s = + ((List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) + (l 0 ::ₘ s) := by + rw [List.ofFn_succ, + show (((l 0 :: List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3))) : + Multiset (Fin 1 ⊕ Fin 3)) + = l 0 ::ₘ ((List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) from rfl, + Multiset.cons_add, Multiset.add_cons] + have hsplit : covDerivIter A act F (n + 1) l s φ - + F (List.ofFn l + s) φ = + (covDerivIter A act F n (fun i => l i.succ) (l 0 ::ₘ s) φ - + F (List.ofFn (fun i : Fin n => l i.succ) + (l 0 ::ₘ s)) φ) + + actionFamConv A act (l 0) (covDerivIter A act F n fun i => l i.succ) s φ := by + rw [show covDerivIter A act F (n + 1) l s φ = + covDerivIter A act F n (fun i => l i.succ) (l 0 ::ₘ s) φ + + actionFamConv A act (l 0) + (covDerivIter A act F n fun i => l i.succ) s φ + from rfl, hms] + abel + rw [hsplit] + refine add_mem ?_ ?_ + · refine hmono ?_ (ih (fun i => l i.succ) (l 0 ::ₘ s) φ) + simp only [Multiset.card_cons] + omega + · rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + have hle := Multiset.mem_antidiagonal.mp hp + have h2 : p.2.card ≤ s.card := + hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) + refine actionFam_apply_mem (fun ψ => ?_) (fun χ => ?_) _ + · exact Algebra.subset_adjoin (Or.inl ⟨p.1, l 0, ψ, rfl⟩) + · have h3 : covDerivIter A act F n (fun i => l i.succ) p.2 χ = + (covDerivIter A act F n (fun i => l i.succ) p.2 χ - + F (List.ofFn (fun i : Fin n => l i.succ) + p.2) χ) + + F (List.ofFn (fun i : Fin n => l i.succ) + p.2) χ := by abel + rw [h3] + refine add_mem (hmono ?_ (ih (fun i => l i.succ) p.2 χ)) ?_ + · omega + · refine Algebra.subset_adjoin + (Or.inr ⟨List.ofFn (fun i : Fin n => l i.succ) + p.2, χ, ?_, rfl⟩) + simp only [Multiset.card_add, Multiset.coe_card, List.length_ofFn] + omega + +/-- Every derivative symbol of the covariant tower is a polynomial in the gauge-field + symbols and the matter symbols. -/ +lemma covDerivIter_mem_adjoin_symbols (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + covDerivIter A act F n l s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ 𝔤), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + b = F s φ}) := by + induction n generalizing s φ with + | zero => exact Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩) + | succ n ih => + rw [covDerivIter_succ, covDerivAction_apply] + refine add_mem (ih (fun i => l i.succ) (l 0 ::ₘ s) φ) ?_ + rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + refine multiset_sum_mem _ fun x hx => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + refine actionFam_apply_mem (fun ψ' => ?_) (fun χ => ?_) _ + · exact Algebra.subset_adjoin (Or.inl ⟨p.1, l 0, ψ', rfl⟩) + · exact ih (fun i => l i.succ) p.2 χ + +/-- **The span lemma**: the algebra of symbols generated by the gauge field together + with a matter family's *derivative* symbols equals the one generated by the gauge + field together with the matter family's *covariant* derivative tower. The + correction `∇_ρ − ∂_ρ` is the derived action of the gauge field — a sum of products + of symbols, absorbed by the algebra structure. -/ +theorem adjoin_symbols_eq_adjoin_covDerivIter (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ 𝔤), b = A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + b = F s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ 𝔤), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + b = covDerivIter A act F n l 0 φ}) := by + refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) + · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨s, φ, rfl⟩) + · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) + · -- express a matter symbol through the covariant tower, by strong induction on + -- the order + have main : ∀ n, ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + s.card ≤ n → + F s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ 𝔤), b = A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + b = covDerivIter A act F n l 0 φ}) := by + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro s φ hs + set L := s.toList with hL' + have hL : Multiset.ofList L = s := Multiset.coe_toList _ + have hofFn : List.ofFn L.get = L := List.ofFn_get L + rw [show F s φ = covDerivIter A act F L.length L.get 0 φ - + (covDerivIter A act F L.length L.get 0 φ - + F (List.ofFn L.get + 0) φ) from by + rw [add_zero, hofFn, hL]; abel] + refine sub_mem (Algebra.subset_adjoin (Or.inr ⟨L.length, L.get, φ, rfl⟩)) ?_ + refine SetLike.le_def.mp (Algebra.adjoin_le ?_) + (covDerivIter_sub_mem act F L.length L.get 0 φ) + rintro b (⟨u, μ, ψ, rfl⟩ | ⟨t, χ, htc, rfl⟩) + · exact Algebra.subset_adjoin (Or.inl ⟨u, μ, ψ, rfl⟩) + · have htn : t.card < n := by + have hlen : L.length = s.card := Multiset.length_toList s + simp only [Multiset.card_zero] at htc + omega + exact ih t.card htn t χ (le_refl _) + exact main s.card s φ (le_refl _) + · rintro x (⟨s, μ, ψ, rfl⟩ | ⟨n, l, φ, rfl⟩) + · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) + · exact covDerivIter_mem_adjoin_symbols act F n l 0 φ + +end Action + + +/-! + +## E. Multiplicativity of the adjoint Taylor coefficients + +-/ + +section Leibniz + +variable [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] + +/-- **The adjoint Taylor coefficients are multiplicative up to convolution**: the + coefficient of a product of jets of gauge transformations is the antidiagonal + convolution of the coefficients of the factors. -/ +lemma adjointCoeff_mul (U V : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + adjointCoeff (𝔤 := 𝔤) (U * V) x + = (x.antidiagonal.map fun p => adjointCoeff U p.1 ∘ₗ adjointCoeff V p.2).sum := by + refine LinearMap.ext fun a => ?_ + rw [Multiset.sum_linearMap_apply, Multiset.map_map, + show adjointCoeff (U * V) x a + = GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 x (GaugeJet.adjoint 𝔤 (G := G) U + (GaugeJet.adjoint 𝔤 (G := G) V (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)))) from by + rw [adjointCoeff] + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, map_mul, + Module.End.mul_apply], + GaugeJetLeibniz.evalLie_iteratedDeriv_adjoint] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [Function.comp_apply, LinearMap.comp_apply] + rfl) + +/-- The adjoint Taylor coefficient of the identity: only the base point survives. -/ +lemma adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : + adjointCoeff (𝔤 := 𝔤) (1 : G) p = if p = 0 then LinearMap.id else 0 := by + refine LinearMap.ext fun a => ?_ + rw [adjointCoeff] + simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, map_one, + Module.End.one_apply] + rcases eq_or_ne p 0 with rfl | hp + · rw [GaugeJet.iteratedDeriv_zero, LinearMap.id_apply, GaugeJet.evalLie_ofConstantLie, + if_pos rfl, LinearMap.id_apply] + · rw [GaugeJet.iteratedDeriv_ofConstantLie_of_ne_zero hp, map_zero, if_neg hp, + LinearMap.zero_apply] + +end Leibniz + +end IsGaugeField + + diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/MatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/MatterField.lean new file mode 100644 index 000000000..88f91fdb3 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/MatterField.lean @@ -0,0 +1,136 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.MassDim +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics +/-! +# Matter fields of a gauge theory + +## i. Overview + +A matter field of a gauge theory with (jet) gauge group `G` is specified by the data a +physicist writes down: a finite-dimensional complex vector space `V` in which the field +takes its values, the representation of the Lorentz group on `V`, the action of the jets of +gauge transformations on the jets of the field — which must be *fibrewise*, that is act on the +values of the field over the identity of spacetime — and the mass weight of the field. + +`MatterField G` bundles this data. From it the general theory produces, on any field algebra +`A` over `V` (bosonic or fermionic), the jet gauge action, the global gauge action, the +Lorentz action and the mass-weight scaling. A concrete theory therefore only has to supply +a `MatterField` for each of its fields. + +## ii. Key results + +- `MatterField` : the data of a matter field. +- `MatterField.repJetAlgebra` : the jet gauge action on a field algebra of the field. +- `MatterField.repConstant` : the global gauge action, along `ι : G₀ →* G`. +- `MatterField.repLorentzGroup` : the Lorentz action on a field algebra of the field. +- `MatterField.massWeightScale` : the mass-weight scaling on a field algebra of the field. + +## iii. Table of contents + +- A. The data of a matter field +- B. The bosonic and fermionic jet algebras +- C. The actions on a field algebra of the matter field + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +/-! + +## A. The data of a matter field + +-/ + +/-- **A matter field** of a gauge theory with jet gauge group `G`: a finite-dimensional complex + target space `V`, the Lorentz representation on `V`, a fibrewise action of `G` on the + jets `JetRing ⊗[ℂ] V` of the field, and the mass weight of the field (in the units in + which a derivative has weight `2`). -/ +structure MatterField (G : Type) [Group G] where + /-- The target space of the field. -/ + V : Type + [instAddCommGroup : AddCommGroup V] + [instModule : Module ℂ V] + [instFree : Module.Free ℂ V] + [instFinite : Module.Finite ℂ V] + /-- The representation of the Lorentz group on the target space. -/ + repLorentz : Representation ℂ SL(2,ℂ) V + /-- The action of the jets of gauge transformations on the jets of the field. -/ + repJet : Representation ℂ G (JetRing ⊗[ℂ] V) + /-- The gauge action is fibrewise: it commutes with multiplication by scalar jets. -/ + repJet_smul : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), repJet U (χ • z) = χ • repJet U z + /-- The mass weight of the field. -/ + massWeight : ℕ + +attribute [instance] MatterField.instAddCommGroup MatterField.instModule + MatterField.instFree MatterField.instFinite + +namespace MatterField + +variable {G : Type} [Group G] (M : MatterField G) + +/-! + +## B. The bosonic and fermionic jet algebras + +-/ + +/-- The bosonic jet algebra of a matter field. -/ +abbrev BosonicJetAlgebra : Type := BosonicAlgebra M.V + +/-- The fermionic jet algebra of a matter field. -/ +abbrev FermionicJetAlgebra : Type := FermionicAlgebra M.V + +/-! + +## C. The actions on a field algebra of the matter field + +-/ + +variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra M.V A] + +/-- The jet gauge action on a field algebra of the matter field. -/ +noncomputable def repJetAlgebra : Representation ℂ G A := + FieldAlgebra.repJet M.repJet M.repJet_smul + +/-- The global gauge action on a field algebra of the matter field, along the inclusion + `ι : G₀ →* G` of the constant jets. -/ +noncomputable def repConstant {G₀ : Type} [Group G₀] (ι : G₀ →* G) : Representation ℂ G₀ A := + FieldAlgebra.repConstant ι M.repJet M.repJet_smul + +/-- The Lorentz action on a field algebra of the matter field. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) A := + FieldAlgebra.repLorentzGroup M.repLorentz + +/-- The mass-weight scaling on a field algebra of the matter field. -/ +noncomputable def massWeightScale (c : ℂ) : A →ₐ[ℂ] A := + FieldAlgebra.massWeightScale M.massWeight c + +lemma repJetAlgebra_ι (U : G) (x : JetComponentSpace M.V) : + M.repJetAlgebra A U (FieldAlgebra.ι A x) = + FieldAlgebra.ι A (JetComponentSpace.repJet M.repJet M.repJet_smul U x) := + FieldAlgebra.repJet_ι _ _ U x + +lemma repConstant_apply {G₀ : Type} [Group G₀] (ι : G₀ →* G) (g : G₀) : + M.repConstant A ι g = M.repJetAlgebra A (ι g) := rfl + +lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace M.V) : + M.repLorentzGroup A Λ (FieldAlgebra.ι A x) = + FieldAlgebra.ι A (JetComponentSpace.repLorentzGroup M.repLorentz Λ x) := + FieldAlgebra.repLorentzGroup_ι _ Λ x + +lemma massWeightScale_ι (c : ℂ) (x : JetComponentSpace M.V) : + M.massWeightScale A c (FieldAlgebra.ι A x) = + FieldAlgebra.ι A (JetComponentSpace.massWeightScale M.massWeight c x) := + FieldAlgebra.massWeightScale_ι _ c x + +end MatterField diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean new file mode 100644 index 000000000..dbf05da16 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean @@ -0,0 +1,175 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic +/-! +# The field algebra of a matter field + +## i. Overview + +For a matter field valued in a complex vector space `V`, its *field algebra* is the algebra +generated by the component functions `∂_s ψ_α` and their conjugates `∂_s ψ̄_α` — the jet +component space `JetComponentSpace V` — subject to the statistics of the field: the +symmetric algebra for a bosonic field (`BosonicAlgebra V`), the exterior algebra for a +fermionic one (`FermionicAlgebra V`). + +Everything that only uses the universal property of the algebra — the gauge and Lorentz +actions, the total derivative and its iterates, the mass-weight scaling — is the same for +both. This file isolates that universal property as the class `IsFieldAlgebra V A`: an +algebra `A` with an inclusion `ι` of the component functions, functorial in endomorphisms +of the component space, generated by `ι`, and with the induction principle that follows. +The two concrete algebras are instances, and the sibling files `GaugeAction`, +`LorentzAction`, `JetDeriv` and `MassDim` are stated once for any `[IsFieldAlgebra V A]`. + +Only the statistics themselves — the commutation relations of the generators, and the +construction (not the properties) of the total derivative — live in the files of the two +concrete algebras. + +## ii. Key results + +- `IsFieldAlgebra` : the universal property of a field algebra. +- `FieldAlgebra.ι`, `FieldAlgebra.map` : the generators and functoriality, with `map_ι`, + `map_id`, `map_comp_map` and the induction principle `FieldAlgebra.induction`. +- `FieldAlgebra.adjoin_ι_eq_top` : the algebra is generated by the component functions. +- `FieldAlgebra.ofField`, `FieldAlgebra.ofConjField` : the field and its conjugate. + +## iii. Table of contents + +- A. The universal property of a field algebra +- B. The field and its conjugate + +-/ + +@[expose] public section + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The universal property of a field algebra + +-/ + +/-- **A field algebra** of a `V`-valued matter field: a `ℂ`-algebra `A` generated by the + component functions `JetComponentSpace V`, functorially in endomorphisms of the component + space. The symmetric algebra (bosons) and the exterior algebra (fermions) are the two + instances; the class records exactly what is used to build the gauge and Lorentz + actions, the total derivative and the mass-weight scaling on `A`. -/ +class IsFieldAlgebra (V : outParam Type) [AddCommGroup V] [Module ℂ V] + (A : Type) [Ring A] [Algebra ℂ A] where + /-- The inclusion of the component functions as generators. -/ + ι : JetComponentSpace V →ₗ[ℂ] A + /-- Functoriality: an endomorphism of the component space induces an algebra + endomorphism. -/ + map : (JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) → (A →ₐ[ℂ] A) + map_ι : ∀ (f : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) (x : JetComponentSpace V), + map f (ι x) = ι (f x) + map_id : map LinearMap.id = AlgHom.id ℂ A + map_comp_map : ∀ (f g : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V), + (map g).comp (map f) = map (g ∘ₗ f) + /-- The induction principle: a property of the scalars and the generators, closed under + products and sums, holds everywhere. -/ + induction : ∀ {motive : A → Prop}, + (∀ r, motive (algebraMap ℂ A r)) → (∀ x, motive (ι x)) → + (∀ a b, motive a → motive b → motive (a * b)) → + (∀ a b, motive a → motive b → motive (a + b)) → ∀ a, motive a + adjoin_ι_eq_top : Algebra.adjoin ℂ (Set.range ι) = ⊤ + +namespace FieldAlgebra + +variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] + +/-- The inclusion of the component functions as the generators of the field algebra. -/ +abbrev ι : JetComponentSpace V →ₗ[ℂ] A := IsFieldAlgebra.ι + +/-- **Functoriality of the field algebra** in the component space: an endomorphism of the + component space induces an algebra endomorphism of the field algebra. -/ +abbrev map (f : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) : A →ₐ[ℂ] A := + IsFieldAlgebra.map f + +@[simp] +lemma map_ι (f : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) (x : JetComponentSpace V) : + map A f (ι A x) = ι A (f x) := + IsFieldAlgebra.map_ι f x + +@[simp] +lemma map_id : map A (LinearMap.id : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) + = AlgHom.id ℂ A := + IsFieldAlgebra.map_id + +lemma map_comp_map (f g : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) : + (map A g).comp (map A f) = map A (g ∘ₗ f) := + IsFieldAlgebra.map_comp_map f g + +/-- **The field algebra is generated by the component functions.** Every element is a + polynomial in the degree-one elements — the symbols `∂_s ψ_α` and `∂_s ψ̄_α` themselves. + This is the algebraic form of "every Lagrangian term is a polynomial in the component + functions". -/ +@[simp] +lemma adjoin_ι_eq_top : Algebra.adjoin ℂ (Set.range (ι (V := V) A)) = ⊤ := + IsFieldAlgebra.adjoin_ι_eq_top + +variable {A} + +/-- **The induction principle of the field algebra**: a property holding on the scalars and + the generators, and closed under products and sums, holds everywhere. -/ +@[elab_as_elim] +theorem induction {motive : A → Prop} + (algebraMap : ∀ r, motive (algebraMap ℂ A r)) + (ι : ∀ x, motive (FieldAlgebra.ι A x)) + (mul : ∀ a b, motive a → motive b → motive (a * b)) + (add : ∀ a b, motive a → motive b → motive (a + b)) + (a : A) : motive a := + IsFieldAlgebra.induction algebraMap ι mul add a + +/-! + +## B. The field and its conjugate + +The undifferentiated component functions sit inside the field algebra as the two +inclusions below. A component function is a *covector* on the target space: `ofField φ` is +the component of the field `ψ` along `φ`, the element written `ψ_α` when `φ` is the `α`-th +coordinate. The conjugate field is a covector on `ConjModule V`, whose scalar action is +twisted by complex conjugation — that twist is exactly the statement that `ψ̄` transforms +by the conjugate of the representation carried by `ψ`. + +Every other generator of the algebra is an iterated derivative of one of these, which is +the content of `FieldAlgebra.adjoin_iteratedJetDeriv_eq_top`. + +-/ + +variable (A) + +/-- **The component function `ψ_φ` of the matter field** along the covector `φ` on `V`: the + undifferentiated generator, sitting at the empty derivative label in the unconjugated half + of the component space. -/ +noncomputable def ofField : Module.Dual ℂ V →ₗ[ℂ] A := + (ι A).comp + ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ V) 1)) + +/-- **The component function `ψ̄_φ` of the conjugate matter field** along the covector `φ` + on `ConjModule V`: the undifferentiated generator in the conjugate half of the component + space. -/ +noncomputable def ofConjField : Module.Dual ℂ (ConjModule V) →ₗ[ℂ] A := + (ι A).comp + ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule V)) 1)) + +lemma ofField_apply (φ : Module.Dual ℂ V) : + ofField A φ = ι A + (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := rfl + +lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule V)) : + ofConjField A φ = ι A + ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace V) := rfl + +end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean new file mode 100644 index 000000000..8b9c47aa9 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.GaugeAction +/-! +# Constant gauge transformations on a field algebra + +## i. Overview + +A jet gauge group `G` contains the constant — that is, global — gauge transformations as +the image of a homomorphism `ι : G₀ →* G` from the value group `G₀` (for the Standard Model, +`JetGaugeGroupI.ofConstant`). Restricting the jet gauge action `FieldAlgebra.repJet` along +`ι` gives the action of the global gauge group on the field algebra, which is diagonal in +the derivative label: it is the action whose invariants the classification theorems +describe. + +## ii. Key results + +- `FieldAlgebra.repConstant` : the action of the constant gauge transformations. +- `FieldAlgebra.repConstant_ofField`, `FieldAlgebra.repConstant_ofConjField` : on the + undifferentiated field it is the contragredient of the value. + +-/ + +@[expose] public section + +namespace FieldAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] +variable {G : Type} [Group G] {G₀ : Type} [Group G₀] (ι : G₀ →* G) + +/-- The action of the constant — that is, global — gauge transformations on the field + algebra: the restriction of the jet gauge action along the inclusion `ι : G₀ →* G` of the + constant jets. -/ +noncomputable def repConstant + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ G₀ A := + (repJet rep hlin).comp ι + +lemma repConstant_apply + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : G₀) (x : A) : + repConstant ι rep hlin g x = + repJet rep hlin (ι g) x := rfl + +@[simp] +lemma repConstant_apply_one + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : G₀) : + repConstant ι rep hlin g (1 : A) = 1 := + repJet_apply_one rep hlin _ + +lemma repConstant_apply_mul + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : G₀) (x y : A) : + repConstant ι rep hlin g (x * y) = + repConstant ι rep hlin g x * repConstant ι rep hlin g y := + repJet_apply_mul rep hlin _ x y + +/-- A constant gauge transformation acts on the undifferentiated field by the + contragredient of its value — which for a constant jet is the transformation itself. -/ +lemma repConstant_ofField + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : G₀) (φ : Module.Dual ℂ V) : + repConstant ι rep hlin g (ofField A φ) = + ofField A (Module.Dual.transpose + (jetEval ∘ₗ (rep (ι g⁻¹)).comp jetOfConstant) φ) := by + have h : (ι g)⁻¹ = ι g⁻¹ := + (map_inv ι g).symm + rw [repConstant_apply, repJet_ofField, h] + +/-- A constant gauge transformation acts on the undifferentiated conjugate field by the + conjugate contragredient of its value. -/ +lemma repConstant_ofConjField + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (g : G₀) (φ : Module.Dual ℂ (ConjModule V)) : + repConstant ι rep hlin g (ofConjField A φ) = + ofConjField A (Module.Dual.transpose + (jetEval ∘ₗ (JetComponentSpace.repConj rep (ι g⁻¹)).comp + jetOfConstant) φ) := by + have h : (ι g)⁻¹ = ι g⁻¹ := + (map_inv ι g).symm + rw [repConstant_apply, repJet_ofConjField, h] + +end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean new file mode 100644 index 000000000..cb78a5f7d --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean @@ -0,0 +1,171 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +/-! +# The gauge action on the field algebra + +## i. Overview + +Given a fibrewise action of a group `G` on the jets `JetRing ⊗[ℂ] V` of a matter +field, the group `G` acts on the field algebra by the algebra +functor applied to the induced action on the jet component space. On a component function +`∂_s φ_α` the action is the all-orders Leibniz rule: each splitting of the derivative +multiset contributes a Taylor coefficient of the gauge jet against a lower component +function. + +Here `G` is any group acting fibrewise on the jets. For the Standard Model, `G` is the jet +gauge group `JetGaugeGroupI`, and the restriction to constant gauge transformations is in +`Physlib.Particles.StandardModel.Matter.FieldAlgebra.GaugeAction`. + +## ii. Key results + +- `FieldAlgebra.repJet` : the jet gauge action on the field algebra. +- `FieldAlgebra.repJetAlgHom` : the action as an algebra homomorphism. +- `FieldAlgebra.repJet_ofField` : `ofField` is gauge equivariant, for the + value of the gauge transformation at the base point. + +## iii. Table of contents + +- A. The action of the group `G` + - A.1. Equivariance of the field and its conjugate + +-/ + +@[expose] public section + +namespace FieldAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] +variable {G : Type*} [Group G] + +/-! + +## A. The action of the group `G` + +-/ + +/-- **The jet gauge action on the field algebra** of a `V`-valued matter field, induced + from a fibrewise action `rep` on the jets of the field: the algebra functor + applied to the gauge action on the jet component space. The hypothesis `hlin` is the + statement that a gauge transformation acts on the *values* of the field, over the + identity on spacetime. -/ +noncomputable def repJet + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ G (A) where + toFun U := + (map A (JetComponentSpace.repJet rep hlin U)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, map_id, AlgHom.toLinearMap_id] + map_mul' U W := by + simp only [map_mul, Module.End.mul_eq_comp, ← map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repJet_apply + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (x : A) : + repJet rep hlin U x = + map A (JetComponentSpace.repJet rep hlin U) x := rfl + +@[simp] +lemma repJet_apply_one + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) : + repJet rep hlin U (1 : A) = 1 := by + simp [repJet_apply] + +lemma repJet_apply_mul + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (x y : A) : + repJet rep hlin U (x * y) = + repJet rep hlin U x * repJet rep hlin U y := by + simp [repJet_apply] + +/-- On a component function the jet gauge action is the action on the component space. -/ +@[simp] +lemma repJet_ι + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (v : JetComponentSpace V) : + repJet rep hlin U (ι A v) = + ι A (JetComponentSpace.repJet rep hlin U v) := by + rw [repJet_apply, map_ι] + +/-- The jet gauge action as an algebra homomorphism: a gauge transformation acts on a + Lagrangian term factor by factor. -/ +noncomputable def repJetAlgHom + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) : A →ₐ[ℂ] A where + toFun := repJet rep hlin U + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repJet_apply_one rep hlin U + map_mul' := repJet_apply_mul rep hlin U + commutes' r := by simp [repJet_apply] + +/-! + +### A.1. Equivariance of the field and its conjugate + +Unlike a derivative generator `∂_s φ_α`, which mixes with lower generators through the +Taylor coefficients of the gauge jet, the undifferentiated generator `φ_α` transforms by +the *value* of the gauge transformation at the base point alone. So `ofField` and +`ofConjField` are equivariant on the nose, for the contragredient of that value. + +-/ + +/-- **`ofField` is gauge equivariant.** The undifferentiated component functions transform + by the contragredient of the value of the gauge transformation at the base point; no + derivative of the gauge jet contributes. -/ +lemma repJet_ofField + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (φ : Module.Dual ℂ V) : + repJet rep hlin U (ofField A φ) = + ofField A (Module.Dual.transpose (jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant) φ) := by + rw [ofField_apply, repJet_ι, ofField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · exact JetComponentSpace.repDual_one_tmul rep hlin U φ + · rw [JetComponentSpace.repJet_snd] + exact map_zero _ + +/-- **`ofConjField` is gauge equivariant**, for the conjugate action `repConj rep` on the + jets of the conjugate field — which is the physicists' `φ̄ ↦ φ̄ U†`. -/ +lemma repJet_ofConjField + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (φ : Module.Dual ℂ (ConjModule V)) : + repJet rep hlin U (ofConjField A φ) = + ofConjField A (Module.Dual.transpose + (jetEval ∘ₗ (JetComponentSpace.repConj rep U⁻¹).comp jetOfConstant) φ) := by + rw [ofConjField_apply, repJet_ι, ofConjField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repJet_fst] + exact map_zero _ + · exact JetComponentSpace.repDual_one_tmul (JetComponentSpace.repConj rep) + (JetComponentSpace.repConj_smul_comm hlin) U φ + +end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean new file mode 100644 index 000000000..b5a7074db --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean @@ -0,0 +1,295 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDerivClass +public import Physlib.Relativity.IsLorentzDeriv +/-! +# The formal total derivative on a field algebra + +## i. Overview + +Everything built on the total derivative `∂_μ` of a field algebra (`HasJetDeriv`), stated +once for any field algebra: the total derivatives commute, so they iterate along a +*multiset* of directions to `∂_s`; the all-orders Leibniz rule; the value of `∂_s` on a +component function; and the generation of the algebra by the field, its conjugate and their +derivatives. + +## ii. Key results + +- `FieldAlgebra.jetDeriv_comm` : the total derivatives in different directions commute. +- `FieldAlgebra.iteratedJetDeriv` : the iterated derivative `∂_s`, with + `iteratedJetDeriv_mul` the all-orders Leibniz rule and `iteratedJetDeriv_ι` its value on + a component function. +- `FieldAlgebra.adjoin_iteratedJetDeriv_eq_top` : the algebra is generated by the field, + its conjugate and their derivatives. +- `FieldAlgebra.map_iteratedJetDeriv_of_map_jetDeriv` : an algebra map commuting with `∂_μ` + commutes with `∂_s`. + +## iii. Table of contents + +- A. Commutation of the total derivatives +- B. The iterated total derivative +- C. Generation by the field and its derivatives +- D. Maps of differential algebras + +-/ + +@[expose] public section + +namespace FieldAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] [HasJetDeriv V A] + +/-! + +## A. Commutation of the total derivatives + +-/ + +/-- **Mixed partials agree.** The derivative labels live in a *symmetric* algebra, so the + total derivatives in different directions commute. -/ +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : A) : + jetDeriv μ (jetDeriv ν x) = jetDeriv ν (jetDeriv μ x) := by + induction x using FieldAlgebra.induction with + | algebraMap r => simp + | ι v => + rw [jetDeriv_ι, jetDeriv_ι, jetDeriv_ι, jetDeriv_ι] + exact congrArg (ι A) + (DFunLike.congr_fun (JetComponentSpace.jetDeriv_comm (V := V) μ ν) v) + | mul x y hx hy => + simp only [jetDeriv_mul, map_add, hx, hy] + abel + | add x y hx hy => simp only [map_add, hx, hy] + +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (jetDeriv (A := A) μ).comp (jetDeriv ν) = (jetDeriv (A := A) ν).comp (jetDeriv μ) := + LinearMap.ext fun x => jetDeriv_comm_apply μ ν x + +/-! + +## B. The iterated total derivative + +-/ + +/-- The iterated total derivative `∂_s = ∂_{ν₁} ⋯ ∂_{νₙ}` along a multiset `s` of + directions. It is well defined on a multiset — i.e. independent of the order in which the + directions are listed — because the directional derivatives commute. -/ +noncomputable def iteratedJetDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : + A →ₗ[ℂ] A := + Lorentz.iteratedD jetDeriv jetDeriv_comm s + +@[simp] +lemma iteratedJetDeriv_zero : + iteratedJetDeriv (0 : Multiset (Fin 1 ⊕ Fin 3)) + = LinearMap.id (R := ℂ) (M := A) := + Lorentz.iteratedD_zero jetDeriv jetDeriv_comm + +lemma iteratedJetDeriv_cons (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (A := A) (μ ::ₘ s) = (jetDeriv μ).comp (iteratedJetDeriv s) := + Lorentz.iteratedD_cons jetDeriv jetDeriv_comm μ s + +/-- The companion of `iteratedJetDeriv_cons`, peeling the extra derivative on the inside. -/ +lemma iteratedJetDeriv_cons' (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (A := A) (μ ::ₘ s) = (iteratedJetDeriv s).comp (jetDeriv μ) := + Lorentz.iteratedD_cons' jetDeriv jetDeriv_comm μ s + +@[simp] +lemma iteratedJetDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + iteratedJetDeriv (A := A) {μ} = jetDeriv μ := + Lorentz.iteratedD_singleton jetDeriv jetDeriv_comm μ + +/-- The iterated derivative is additive in the multiset of directions: differentiating + along `s + t` is differentiating along `t` and then along `s`. -/ +lemma iteratedJetDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + iteratedJetDeriv (A := A) (s + t) + = (iteratedJetDeriv s).comp (iteratedJetDeriv t) := + Lorentz.iteratedD_add jetDeriv jetDeriv_comm s t + +/-- **The all-orders Leibniz rule.** The iterated derivative of a product distributes over + the antidiagonal of the multiset of directions: each way of splitting the derivatives + between the two factors contributes one term. -/ +lemma iteratedJetDeriv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : A) : + iteratedJetDeriv s (x * y) = + (s.antidiagonal.map fun p => + iteratedJetDeriv p.1 x * iteratedJetDeriv p.2 y).sum := + Lorentz.iteratedD_mul jetDeriv jetDeriv_comm jetDeriv_mul s x y + +/-- A nonempty iterated derivative kills the constants. -/ +lemma iteratedJetDeriv_one_of_ne_zero {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s ≠ 0) : + iteratedJetDeriv (A := A) s (1 : A) = 0 := by + obtain ⟨μ, hμ⟩ := Multiset.exists_mem_of_ne_zero hs + obtain ⟨t, rfl⟩ := Multiset.exists_cons_of_mem hμ + rw [iteratedJetDeriv_cons', LinearMap.comp_apply, jetDeriv_one, map_zero] + +/-- **On a component function the iterated derivative is the derivative symbol `∂_s`.** + Both halves of the component space — the field and its conjugate — are multiplied by the + degree-`|s|` element `∂_s` of `DerivAlgebraComplex` in their derivative-label factor, + with the target index untouched. -/ +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpace V) : + iteratedJetDeriv s (ι A x) = + ι A + (TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) + LinearMap.id x.1, + TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) + LinearMap.id x.2) := by + have hmul : ∀ t u : Multiset (Fin 1 ⊕ Fin 3), + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis t)).comp + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis u)) + = LinearMap.mulRight ℂ (DerivAlgebraComplex.basis (u + t)) := fun t u => + LinearMap.ext fun a => by + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.mulRight_apply, mul_assoc, + DerivAlgebraComplex.basis_mul] + have hone : LinearMap.mulRight ℂ (1 : DerivAlgebraComplex) = LinearMap.id := + LinearMap.ext fun a => mul_one a + have hnil : DerivAlgebraComplex.basis (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := + DerivAlgebraComplex.basis_nil + induction s using Multiset.induction_on with + | empty => + rw [iteratedJetDeriv_zero, LinearMap.id_apply, hnil, hone] + simp only [TensorProduct.map_id, LinearMap.id_apply] + | cons μ s ih => + have hs : s + ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ s := by + rw [add_comm, Multiset.singleton_add] + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, ih, jetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.jetDeriv_fst, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, hmul, hs] + · rw [JetComponentSpace.jetDeriv_snd, ← LinearMap.comp_apply, ← TensorProduct.map_comp, + LinearMap.id_comp, hmul, hs] + +/-! + +## C. Generation by the field and its derivatives + +-/ + +/-- The iterated derivative of the field is the generator carrying the derivative symbol + `∂_s`: applying `∂_s` to `ψ_φ` writes the label `s` into the derivative factor. -/ +@[simp] +lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + iteratedJetDeriv s (ofField A φ) = + ι A + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := by + rw [ofField_apply, iteratedJetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, one_mul, LinearMap.id_apply] + · rw [map_zero] + +/-- The iterated derivative of the conjugate field is the conjugate generator carrying the + derivative symbol `∂_s`. -/ +@[simp] +lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule V)) : + iteratedJetDeriv s (ofConjField A φ) = + ι A + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) := by + rw [ofConjField_apply, iteratedJetDeriv_ι] + congr 1 + refine Prod.ext ?_ ?_ + · rw [map_zero] + · rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, one_mul, LinearMap.id_apply] + +/-- **The field algebra is generated by the field, its conjugate, and their + derivatives.** As a `ℂ`-algebra, `A` is the algebra adjoined by the + iterated total derivatives `∂_s ψ_φ` and `∂_s ψ̄_φ` of the undifferentiated component + functions. Physically: every Lagrangian term for a `V`-valued matter field is a + polynomial in the field, its conjugate, and their spacetime derivatives — nothing else is + available to write down. -/ +theorem adjoin_iteratedJetDeriv_eq_top : + Algebra.adjoin ℂ + (⋃ s : Multiset (Fin 1 ⊕ Fin 3), + Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField A φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + iteratedJetDeriv s (ofConjField A φ))) + = (⊤ : Subalgebra ℂ (A)) := by + set S : Set (A) := + ⋃ s : Multiset (Fin 1 ⊕ Fin 3), + Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField A φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + iteratedJetDeriv s (ofConjField A φ)) with hS + /- The two half-inclusions of the component space into the field algebra. -/ + let gField : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] A := + (ι A).comp (LinearMap.inl ℂ _ _) + let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] + A := + (ι A).comp (LinearMap.inr ℂ _ _) + /- On a derivative monomial each half-inclusion is one of the adjoined generators. -/ + have hbasisField : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + gField (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by + intro s φ + have h : gField (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) = iteratedJetDeriv s (ofField A φ) := + (iteratedJetDeriv_ofField s φ).symm + rw [h, hS] + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨s, Or.inl ⟨φ, rfl⟩⟩) + have hbasisConj : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule V)), + gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by + intro s φ + have h : gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) + = iteratedJetDeriv s (ofConjField A φ) := (iteratedJetDeriv_ofConjField s φ).symm + rw [h, hS] + exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨s, Or.inr ⟨φ, rfl⟩⟩) + /- The derivative monomials span, so each half-inclusion lands in the adjoined algebra. -/ + have hhalf : ∀ {W : Type} [AddCommGroup W] [Module ℂ W] + (g : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] A), + (∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (w : W), + g (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] w) ∈ Algebra.adjoin ℂ S) → + ∀ y, g y ∈ Algebra.adjoin ℂ S := by + intro W _ _ g hg y + induction y using TensorProduct.induction_on with + | zero => rw [map_zero]; exact zero_mem _ + | add y z hy hz => rw [map_add]; exact add_mem hy hz + | tmul a w => + have ha : a ∈ Submodule.span ℂ (Set.range DerivAlgebraComplex.basis) := by + rw [DerivAlgebraComplex.basis.span_eq]; trivial + induction ha using Submodule.span_induction with + | mem b hb => obtain ⟨s, rfl⟩ := hb; exact hg s w + | zero => rw [TensorProduct.zero_tmul, map_zero]; exact zero_mem _ + | add b c _ _ hb hc => rw [TensorProduct.add_tmul, map_add]; exact add_mem hb hc + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul] + exact Subalgebra.smul_mem _ hb c + /- Every component function is a sum of its two halves. -/ + refine top_le_iff.mp ?_ + rw [← adjoin_ι_eq_top (V := V)] + refine Algebra.adjoin_le ?_ + rintro _ ⟨x, rfl⟩ + have hx : x = LinearMap.inl ℂ _ _ x.1 + LinearMap.inr ℂ _ _ x.2 := by + refine Prod.ext ?_ ?_ <;> simp + rw [hx, map_add] + exact add_mem (hhalf gField hbasisField x.1) (hhalf gConj hbasisConj x.2) + + +/-! + +## D. Maps of differential algebras + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {B : Type} [Ring B] [Algebra ℂ B] [IsFieldAlgebra W B] [HasJetDeriv W B] + +/-- **An algebra homomorphism commuting with the total derivatives commutes with the + iterated total derivatives.** This is what makes the inclusion of a species + (`BosonicAlgebra.comap_jetDeriv`, `FermionicAlgebra.comap_jetDeriv`) a map of + differential algebras for `∂_s` as well. -/ +lemma map_iteratedJetDeriv_of_map_jetDeriv (g : A →ₐ[ℂ] B) + (hg : ∀ (μ : Fin 1 ⊕ Fin 3) (x : A), g (jetDeriv μ x) = jetDeriv μ (g x)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (x : A) : + g (iteratedJetDeriv s x) = iteratedJetDeriv s (g x) := by + induction s using Multiset.induction_on generalizing x with + | empty => rw [iteratedJetDeriv_zero, LinearMap.id_apply, iteratedJetDeriv_zero, + LinearMap.id_apply] + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, hg, ih, + iteratedJetDeriv_cons, LinearMap.comp_apply] + +end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean new file mode 100644 index 000000000..5e34c145f --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic +/-! +# The total derivative on a field algebra: the interface + +The formal total spacetime derivative `∂_μ` on a field algebra is a derivation extending the +shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the component functions. Its *construction* depends on +the statistics — a derivation of the symmetric algebra for bosons, an even derivation of the +exterior algebra for fermions — but its *properties* do not: the Leibniz rule has the same +form in both cases. This file records those properties as the class `HasJetDeriv`; the +constructions are `BosonicAlgebra.jetDeriv` and `FermionicAlgebra.jetDeriv`, and everything +built on them is in `Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDeriv`. +-/ + +@[expose] public section + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-- **A total derivative on a field algebra**: for each direction `μ` a linear map which is + an (even) derivation and acts on the generators by the shift of the derivative label. -/ +class HasJetDeriv (V : outParam Type) [AddCommGroup V] [Module ℂ V] + (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] where + /-- The total derivative in the direction `μ`. -/ + jetDeriv : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A + jetDeriv_ι : ∀ (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V), + jetDeriv μ (FieldAlgebra.ι A x) = FieldAlgebra.ι A (JetComponentSpace.jetDeriv μ x) + jetDeriv_algebraMap : ∀ (μ : Fin 1 ⊕ Fin 3) (r : ℂ), jetDeriv μ (algebraMap ℂ A r) = 0 + jetDeriv_mul : ∀ (μ : Fin 1 ⊕ Fin 3) (x y : A), + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y + +namespace FieldAlgebra + +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] [HasJetDeriv V A] + +/-- The formal total spacetime derivative on the field algebra in the direction `μ`. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : A →ₗ[ℂ] A := HasJetDeriv.jetDeriv μ + +/-- On a component function the total derivative is the shift of the derivative label. -/ +@[simp] +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDeriv μ (ι A x) = ι A (JetComponentSpace.jetDeriv μ x) := + HasJetDeriv.jetDeriv_ι μ x + +@[simp] +lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : + jetDeriv μ (algebraMap ℂ A r) = 0 := + HasJetDeriv.jetDeriv_algebraMap μ r + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (A := A) μ 1 = 0 := by + rw [← (algebraMap ℂ A).map_one, jetDeriv_algebraMap] + +/-- The total derivative is an (even) derivation: the Leibniz rule holds on the field + algebra, with no Koszul signs. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : A) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := + HasJetDeriv.jetDeriv_mul μ x y + +end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean new file mode 100644 index 000000000..e0dd8b718 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean @@ -0,0 +1,268 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDerivClass +public import Physlib.Relativity.IsLorentzDeriv +public import Mathlib.Algebra.TrivSqZeroExt.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics +/-! +# The total derivative on the bosonic and fermionic algebras: constructions + +## i. Overview + +The construction of the formal total derivative `∂_μ` on the two concrete field algebras, +and the proof that each is a `HasJetDeriv` — after which everything in +`Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDeriv` applies to both. + +* On the bosonic algebra it is the derivation of the symmetric algebra extending the shift + `∂_s φ_α ↦ ∂_{s + {μ}} φ_α` of the component functions. +* On the fermionic algebra it is the *even* derivation of the exterior algebra extending the + same shift, built through the trivial square-zero extension. + +In both cases the Leibniz rule has the same form, with no Koszul signs. The file ends with +the compatibility of each total derivative with the inclusion of a species. + +## ii. Key results + +- `BosonicAlgebra.jetDeriv`, `FermionicAlgebra.jetDeriv` : the constructions. +- `BosonicAlgebra.instHasJetDeriv`, `FermionicAlgebra.instHasJetDeriv`. +- `BosonicAlgebra.comap_jetDeriv`, `FermionicAlgebra.comap_jetDeriv` : the inclusion of a + species is a map of differential algebras. + +-/ + +@[expose] public section + +section Bosonic + +namespace BosonicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The formal total derivative on the bosonic algebra + +-/ + +/-- The formal total spacetime derivative on the bosonic algebra of a `V`-valued matter + field in the direction `μ`: the derivation extending the shift + `∂_s φ_α ↦ ∂_{s + {μ}} φ_α` of the component functions. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : + BosonicAlgebra V →ₗ[ℂ] BosonicAlgebra V := + SymmetricAlgebra.derivationOfLinear (JetComponentSpace.jetDeriv μ) + +/-- On a component function the total derivative is the shift of the derivative label. -/ +@[simp] +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDeriv μ (SymmetricAlgebra.ι ℂ _ x) = + SymmetricAlgebra.ι ℂ _ (JetComponentSpace.jetDeriv μ x) := + SymmetricAlgebra.derivationOfLinear_ι _ x + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (V := V) μ (1 : BosonicAlgebra V) = 0 := + SymmetricAlgebra.derivationOfLinear_one _ + +@[simp] +lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : + jetDeriv (V := V) μ (algebraMap ℂ (BosonicAlgebra V) r) = 0 := + SymmetricAlgebra.derivationOfLinear_algebraMap _ r + +/-- The total derivative is a derivation: the Leibniz rule holds on the bosonic + algebra. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : BosonicAlgebra V) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := + SymmetricAlgebra.derivationOfLinear_mul _ x y + +/-- The total derivative of the bosonic algebra is a total derivative in the sense of + `HasJetDeriv`: the generic theory of `FieldAlgebra.jetDeriv` applies. -/ +noncomputable instance instHasJetDeriv : HasJetDeriv V (BosonicAlgebra V) where + jetDeriv := jetDeriv + jetDeriv_ι := jetDeriv_ι + jetDeriv_algebraMap := jetDeriv_algebraMap + jetDeriv_mul := jetDeriv_mul + +lemma jetDeriv_eq (μ : Fin 1 ⊕ Fin 3) : + FieldAlgebra.jetDeriv (A := BosonicAlgebra V) μ = jetDeriv μ := rfl + +/-! + +## D. Compatibility with the inclusion of a species + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The inclusion of a species is a map of differential algebras.** Pulling back along a + map of target spaces commutes with the total derivative: the two act on different labels + of a component function. -/ +lemma comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra W) : + comap f (FieldAlgebra.jetDeriv μ x) = FieldAlgebra.jetDeriv μ (comap f x) := by + induction x using FieldAlgebra.induction with + | algebraMap r => + rw [FieldAlgebra.jetDeriv_algebraMap, map_zero, AlgHom.commutes, + FieldAlgebra.jetDeriv_algebraMap] + | ι v => + rw [FieldAlgebra.jetDeriv_ι, comap_ι, comap_ι, FieldAlgebra.jetDeriv_ι] + exact congrArg (FieldAlgebra.ι _) + (DFunLike.congr_fun (JetComponentSpace.comap_jetDeriv f μ) v) + | mul a b ha hb => simp only [FieldAlgebra.jetDeriv_mul, map_add, map_mul, ha, hb] + | add a b ha hb => simp only [map_add, ha, hb] + +end BosonicAlgebra + +end Bosonic + +section Fermionic + +namespace FermionicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The formal total derivative on the fermionic algebra + +The formal total spacetime derivative extends from the component functions to the whole +fermionic algebra as an even derivation: `∂_μ (x y) = (∂_μ x) y + x (∂_μ y)`, with no +Koszul signs. + +-/ + +/-- The generator map of the total derivative into the trivial square-zero extension of the + fermionic algebra: `ι x ↦ (ι x, ι (∂_μ x))`. -/ +noncomputable def jetDerivGen (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace V →ₗ[ℂ] TrivSqZeroExt (FermionicAlgebra V) (FermionicAlgebra V) where + toFun x := (ExteriorAlgebra.ι ℂ x, + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x)) + map_add' x y := by + simp only [map_add] + rfl + map_smul' c x := by + simp only [map_smul, RingHom.id_apply] + rfl + +@[simp] +lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl + +@[simp] +lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + (jetDerivGen μ x).snd = ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := rfl + +/-- The generator map squares to zero: degree-one elements of the exterior algebra + anticommute. -/ +lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDerivGen μ x * jetDerivGen μ x = 0 := by + refine TrivSqZeroExt.ext ?_ ?_ + · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, + TrivSqZeroExt.fst_zero] + · rw [TrivSqZeroExt.snd_mul, jetDerivGen_fst, jetDerivGen_snd, TrivSqZeroExt.snd_zero, + smul_eq_mul, op_smul_eq_mul] + exact ExteriorAlgebra.ι_add_mul_swap x (JetComponentSpace.jetDeriv μ x) + +/-- The lift of the total derivative to the trivial square-zero extension of the fermionic + algebra: the algebra homomorphism `x ↦ (x, ∂_μ x)`. -/ +noncomputable def jetDerivHom (μ : Fin 1 ⊕ Fin 3) : + FermionicAlgebra V →ₐ[ℂ] TrivSqZeroExt (FermionicAlgebra V) (FermionicAlgebra V) := + ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ + +@[simp] +lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDerivHom μ (ExteriorAlgebra.ι ℂ x) = jetDerivGen μ x := by + rw [jetDerivHom, ExteriorAlgebra.lift_ι_apply] + +/-- The first component of the square-zero lift is the identity. -/ +@[simp] +lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : + (jetDerivHom μ x).fst = x := by + have h : (TrivSqZeroExt.fstHom ℂ (FermionicAlgebra V) (FermionicAlgebra V)).comp + (jetDerivHom μ) = AlgHom.id ℂ (FermionicAlgebra V) := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) + simp + exact DFunLike.congr_fun h x + +/-- The formal total spacetime derivative on the fermionic algebra of a `V`-valued matter + field in the direction `μ`: the even derivation extending the shift + `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the component functions. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : + FermionicAlgebra V →ₗ[ℂ] FermionicAlgebra V where + toFun x := (jetDerivHom μ x).snd + map_add' x y := congrArg TrivSqZeroExt.snd (map_add (jetDerivHom μ) x y) + map_smul' c x := congrArg TrivSqZeroExt.snd (map_smul (jetDerivHom μ) c x) + +lemma jetDeriv_apply (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : + jetDeriv μ x = (jetDerivHom μ x).snd := rfl + +/-- On a component function the total derivative is the shift of the derivative label. -/ +@[simp] +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : + jetDeriv μ (ExteriorAlgebra.ι ℂ x) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := by + rw [jetDeriv_apply, jetDerivHom_ι, jetDerivGen_snd] + +@[simp] +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (V := V) μ (1 : FermionicAlgebra V) = 0 := + congrArg TrivSqZeroExt.snd (map_one (jetDerivHom (V := V) μ)) + +@[simp] +lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : + jetDeriv (V := V) μ (algebraMap ℂ (FermionicAlgebra V) r) = 0 := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, jetDeriv_one, smul_zero] + +/-- The total derivative is an even derivation: the Leibniz rule holds on the fermionic + algebra with no Koszul signs. -/ +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : FermionicAlgebra V) : + jetDeriv μ (x * y) = jetDeriv μ x * y + x * jetDeriv μ y := by + have h : jetDeriv μ (x * y) = + (jetDerivHom μ x).fst * jetDeriv μ y + jetDeriv μ x * (jetDerivHom μ y).fst := + congrArg TrivSqZeroExt.snd (map_mul (jetDerivHom μ) x y) + rw [jetDerivHom_fst, jetDerivHom_fst] at h + exact h.trans (add_comm _ _) + +/-- The total derivative of the fermionic algebra is a total derivative in the sense of + `HasJetDeriv`: the generic theory of `FieldAlgebra.jetDeriv` applies. -/ +noncomputable instance instHasJetDeriv : HasJetDeriv V (FermionicAlgebra V) where + jetDeriv := jetDeriv + jetDeriv_ι := jetDeriv_ι + jetDeriv_algebraMap := jetDeriv_algebraMap + jetDeriv_mul := jetDeriv_mul + +lemma jetDeriv_eq (μ : Fin 1 ⊕ Fin 3) : + FieldAlgebra.jetDeriv (A := FermionicAlgebra V) μ = jetDeriv μ := rfl + +/-! + +## D. Compatibility with the inclusion of a species + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The inclusion of a species is a map of differential algebras.** Pulling back along a + map of target spaces commutes with the total derivative: the two act on different labels + of a component function. -/ +lemma comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra W) : + comap f (FieldAlgebra.jetDeriv μ x) = FieldAlgebra.jetDeriv μ (comap f x) := by + induction x using FieldAlgebra.induction with + | algebraMap r => + rw [FieldAlgebra.jetDeriv_algebraMap, map_zero, AlgHom.commutes, + FieldAlgebra.jetDeriv_algebraMap] + | ι v => + rw [FieldAlgebra.jetDeriv_ι, comap_ι, comap_ι, FieldAlgebra.jetDeriv_ι] + exact congrArg (FieldAlgebra.ι _) + (DFunLike.congr_fun (JetComponentSpace.comap_jetDeriv f μ) v) + | mul a b ha hb => simp only [FieldAlgebra.jetDeriv_mul, map_add, map_mul, ha, hb] + | add a b ha hb => simp only [map_add, ha, hb] + +end FermionicAlgebra + +end Fermionic diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean new file mode 100644 index 000000000..dfa3414bc --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDeriv +/-! +# The Lorentz action on the field algebra + +## i. Overview + +Given a representation of `SL(2,ℂ)` on the target space `V` of a matter field, the +Lorentz group acts on the field algebra by the algebra functor applied to its +action on the jet component space. On a component function `∂_s φ_α` the derivative labels +transform by the Lorentz matrix and the target index contragrediently by `V`. + +The formal total derivative is a Lorentz vector for this action, which is exactly the +content of the class `Lorentz.IsLorentzDeriv`; the instance is registered here, so all the +boost-weight machinery of `Physlib.Relativity.IsLorentzDeriv` applies to the field +algebra of any matter field. + +## ii. Key results + +- `FieldAlgebra.repLorentzGroup` : the Lorentz action on the field algebra. +- `FieldAlgebra.repLorentzGroupAlgHom` : the action as an algebra homomorphism. +- `FieldAlgebra.repLorentzGroup_ofField` : `ofField` is `SL(2,ℂ)`-equivariant. +- `FieldAlgebra.repLorentzGroup_jetDeriv` : the total derivative is a Lorentz vector. +- `FieldAlgebra.instIsLorentzDeriv` : the resulting `Lorentz.IsLorentzDeriv` instance. + +## iii. Table of contents + +- A. The action of the Lorentz group + - A.1. Equivariance of the field and its conjugate +- B. Lorentz covariance of the total derivative + +-/ + +@[expose] public section + + +namespace FieldAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] + +/-! + +## A. The action of the Lorentz group + +-/ + +/-- **The Lorentz action on the field algebra** of a `V`-valued matter field, induced + from a representation `repV` of `SL(2,ℂ)` on `V`: the algebra functor applied + to the Lorentz action on the jet component space. -/ +noncomputable def repLorentzGroup (repV : Representation ℂ SL(2,ℂ) V) : + Representation ℂ SL(2,ℂ) (A) where + toFun Λ := (map A (JetComponentSpace.repLorentzGroup repV Λ)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, map_id, AlgHom.toLinearMap_id] + map_mul' Λ₁ Λ₂ := by + simp only [map_mul, Module.End.mul_eq_comp, ← map_comp_map, + AlgHom.comp_toLinearMap] + +lemma repLorentzGroup_apply (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (x : A) : + repLorentzGroup repV Λ x = + map A (JetComponentSpace.repLorentzGroup repV Λ) x := rfl + +@[simp] +lemma repLorentzGroup_apply_one (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : + repLorentzGroup repV Λ (1 : A) = 1 := by + simp [repLorentzGroup_apply] + +lemma repLorentzGroup_apply_mul (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (x y : A) : + repLorentzGroup repV Λ (x * y) + = repLorentzGroup repV Λ x * repLorentzGroup repV Λ y := by + simp [repLorentzGroup_apply] + +/-- On a component function the Lorentz action is the action on the component space. -/ +@[simp] +lemma repLorentzGroup_ι (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (v : JetComponentSpace V) : + repLorentzGroup repV Λ (ι A v) = + ι A (JetComponentSpace.repLorentzGroup repV Λ v) := by + rw [repLorentzGroup_apply, map_ι] + +/-- The Lorentz action as an algebra homomorphism: it preserves the product, so a + Lorentz transformation acts on a Lagrangian term factor by factor. -/ +noncomputable def repLorentzGroupAlgHom (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : + A →ₐ[ℂ] A where + toFun := repLorentzGroup repV Λ + map_add' := LinearMap.map_add _ + map_zero' := LinearMap.map_zero _ + map_one' := repLorentzGroup_apply_one repV Λ + map_mul' := repLorentzGroup_apply_mul repV Λ + commutes' r := by simp [repLorentzGroup_apply] + +/-! + +### A.1. Equivariance of the field and its conjugate + +-/ + +/-- **`ofField` is `SL(2,ℂ)`-equivariant.** The undifferentiated component functions carry + the contragredient of the representation on the target space, and no derivative labels + are generated: `ofField` intertwines `repV.dual` with the action on the field + algebra. -/ +@[simp] +lemma repLorentzGroup_ofField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ V) : + repLorentzGroup repV Λ (ofField A φ) = ofField A (repV.dual Λ φ) := by + rw [ofField_apply, repLorentzGroup_ι, ofField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repLorentzGroup_fst_tmul, + DerivAlgebraComplex.repLorentzGroup_apply_one] + rfl + · rw [JetComponentSpace.repLorentzGroup_snd] + exact map_zero _ + +/-- **`ofConjField` is `SL(2,ℂ)`-equivariant**, for the conjugate of the representation on + the target space: the conjugate component functions transform by `star` of the spinor + matrix. -/ +@[simp] +lemma repLorentzGroup_ofConjField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ (ConjModule V)) : + repLorentzGroup repV Λ (ofConjField A φ) = ofConjField A (repV.conj.dual Λ φ) := by + rw [ofConjField_apply, repLorentzGroup_ι, ofConjField_apply] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.repLorentzGroup_fst] + exact map_zero _ + · rw [JetComponentSpace.repLorentzGroup_snd] + show (DerivAlgebraComplex.repLorentzGroup Λ 1) ⊗ₜ[ℂ] (repV.conj.dual Λ φ) = _ + rw [DerivAlgebraComplex.repLorentzGroup_apply_one] + +/-! + +## B. Lorentz covariance of the total derivative + +-/ + +variable [HasJetDeriv V A] + +set_option maxHeartbeats 4000000 in +/-- **The total derivative on the field algebra is a Lorentz vector.** The four + derivations `∂_μ` transform into each other by the columns of the Lorentz matrix of `Λ`, + exactly as the covector index `μ` should. -/ +lemma repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (x : A) : + repLorentzGroup repV Λ (jetDeriv μ x) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + jetDeriv a (repLorentzGroup repV Λ x) := by + induction x using FieldAlgebra.induction with + | algebraMap r => + rw [jetDeriv_algebraMap, map_zero] + refine (Finset.sum_eq_zero fun a _ => ?_).symm + rw [Algebra.algebraMap_eq_smul_one, map_smul, repLorentzGroup_apply_one, map_smul, + jetDeriv_one, smul_zero, smul_zero] + | ι v => + rw [jetDeriv_ι, repLorentzGroup_ι, repLorentzGroup_ι, + JetComponentSpace.repLorentzGroup_jetDeriv, map_sum] + exact Finset.sum_congr rfl fun a _ => by rw [map_smul, jetDeriv_ι] + | mul a b ha hb => + rw [jetDeriv_mul, map_add, repLorentzGroup_apply_mul, repLorentzGroup_apply_mul, ha, hb, + Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib, repLorentzGroup_apply_mul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [jetDeriv_mul, smul_add, smul_mul_assoc, mul_smul_comm] + | add a b ha hb => + rw [map_add, map_add, map_add, ha, hb, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + +/-- The total derivatives on the field algebra form a Lorentz derivative, giving access + to the boost-weight machinery of `Physlib.Relativity.IsLorentzDeriv`. -/ +instance instIsLorentzDeriv (repV : Representation ℂ SL(2,ℂ) V) : + Lorentz.IsLorentzDeriv (repLorentzGroup repV) (jetDeriv (A := A)) where + rep_deriv := repLorentzGroup_jetDeriv repV _ _ _ + +end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean new file mode 100644 index 000000000..dca625555 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean @@ -0,0 +1,128 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDeriv +/-! +# Mass dimension on the field algebra + +## i. Overview + +The mass dimension of a matter field is tracked multiplicatively through the +*mass-weight scaling*: the algebra endomorphism multiplying each generator `∂_s φ_α` by +`c ^ (w + 2 |s|)`, where `w` is the mass weight of the field — twice its mass dimension, +kept integral so the same machinery serves the fermions of dimension `3/2`. A monomial of +total mass weight `n` is scaled by `c ^ n`, so the scaling records the mass-weight grading +of the algebra, and its interaction with the total derivative says that a derivative +carries mass weight two. + +## ii. Key results + +- `FieldAlgebra.massWeightScale` : the mass-weight scaling. +- `FieldAlgebra.massWeightScale_ofField` : the field carries its own mass weight. +- `FieldAlgebra.massWeightScale_jetDeriv` : a derivative adds mass weight two. +- `FieldAlgebra.massWeightScale_iteratedJetDeriv` : `∂_s` adds mass weight `2 |s|`. + +## iii. Table of contents + +- A. The mass-weight scaling +- B. The mass weight of the field and its derivatives + +-/ + +@[expose] public section + + +namespace FieldAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] + +/-! + +## A. The mass-weight scaling + +-/ + +/-- **The mass-weight scaling on the field algebra** of a field of mass weight `w`: + the algebra endomorphism scaling the generator `∂_s φ_α` by `c ^ (w + 2 |s|)`, the + functorial lift of the scaling on the jet component space. -/ +noncomputable def massWeightScale (w : ℕ) (c : ℂ) : A →ₐ[ℂ] A := + map A (JetComponentSpace.massWeightScale w c) + +@[simp] +lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : + massWeightScale w c (ι A x) + = ι A (JetComponentSpace.massWeightScale w c x) := + map_ι A _ x + +/-! + +## B. The mass weight of the field and its derivatives + +-/ + +/-- The undifferentiated field carries its own mass weight. -/ +@[simp] +lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : + massWeightScale w c (ofField A φ) = c ^ w • ofField A φ := by + rw [ofField_apply, massWeightScale_ι, ← map_smul] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.massWeightScale_fst] + simp only [TensorProduct.map_tmul, AlgHom.toLinearMap_apply, map_one, + LinearMap.id_apply, Prod.smul_fst, TensorProduct.smul_tmul'] + · rw [JetComponentSpace.massWeightScale_snd] + simp + +/-- The undifferentiated conjugate field carries the same mass weight as the field. -/ +@[simp] +lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule V)) : + massWeightScale w c (ofConjField A φ) = c ^ w • ofConjField A φ := by + rw [ofConjField_apply, massWeightScale_ι, ← map_smul] + congr 1 + refine Prod.ext ?_ ?_ + · rw [JetComponentSpace.massWeightScale_fst] + simp + · rw [JetComponentSpace.massWeightScale_snd] + simp only [TensorProduct.map_tmul, AlgHom.toLinearMap_apply, map_one, + LinearMap.id_apply, Prod.smul_snd, TensorProduct.smul_tmul'] + +variable [HasJetDeriv V A] + +/-- **A total derivative adds mass weight two**: the scaling intertwines the total + derivative up to a factor `c ^ 2`. -/ +lemma massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : A) : + massWeightScale w c (jetDeriv μ x) = c ^ 2 • jetDeriv μ (massWeightScale w c x) := by + induction x using FieldAlgebra.induction with + | algebraMap r => rw [jetDeriv_algebraMap, map_zero, AlgHom.commutes, jetDeriv_algebraMap, + smul_zero] + | ι v => + rw [jetDeriv_ι, massWeightScale_ι, massWeightScale_ι, jetDeriv_ι, ← map_smul] + exact congrArg (ι A) + (LinearMap.congr_fun (JetComponentSpace.massWeightScale_jetDeriv w c μ) v) + | mul a b ha hb => + simp only [jetDeriv_mul, map_add, map_mul, ha, hb, smul_add, smul_mul_assoc, + mul_smul_comm] + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + +/-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ +lemma massWeightScale_iteratedJetDeriv (w : ℕ) (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : A) : + massWeightScale w c (iteratedJetDeriv s x) + = c ^ (2 * Multiset.card s) • iteratedJetDeriv s (massWeightScale w c x) := by + induction s using Multiset.induction_on generalizing x with + | empty => simp + | cons μ s ih => + rw [iteratedJetDeriv_cons, LinearMap.comp_apply, massWeightScale_jetDeriv, ih, + map_smul, LinearMap.comp_apply, smul_smul, ← pow_add] + congr 2 + rw [Multiset.card_cons] + ring + +end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean new file mode 100644 index 000000000..86a065eca --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 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 Mathlib.LinearAlgebra.CliffordAlgebra.Prod +public import Mathlib.LinearAlgebra.TensorProduct.Prod +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics +/-! +# The field algebras of a direct sum + +## i. Overview + +Two matter fields, valued in `V` and `W`, are jointly a single matter field valued in +`V × W`. For bosonic fields its algebra is the ordinary tensor product of the two bosonic +algebras (`BosonicAlgebra.prodEquiv`); for fermionic fields it is the *graded* tensor +product of the two fermionic algebras with their Fermi-parity grading +(`FermionicAlgebra.prodEquiv`), which is what makes fermions of different species +anticommute. + +## ii. Key results + +- `BosonicAlgebra.prodEquiv` : + `BosonicAlgebra (V × W) ≃ₐ[ℂ] BosonicAlgebra V ⊗[ℂ] BosonicAlgebra W`. +- `FermionicAlgebra.evenOdd` : the Fermi-parity grading. +- `FermionicAlgebra.prodEquiv` : the graded tensor product decomposition. + +-/ + +@[expose] public section + +section Bosonic + +open scoped TensorProduct + + +/-! + +## A. The tensor product decomposition + +-/ + +/-- **The bosonic algebra of a direct sum is the tensor product of the bosonic algebras.** + Two bosonic matter fields taken together are one field valued in the direct sum of their + target spaces, and its bosonic algebra is the tensor product of theirs. The ordinary — + rather than the graded — tensor product is correct here: bosonic generators commute + across species just as they do within one. -/ +noncomputable def BosonicAlgebra.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] : + BosonicAlgebra (V × W) ≃ₐ[ℂ] BosonicAlgebra V ⊗[ℂ] BosonicAlgebra W := + (SymmetricAlgebra.congr (JetComponentSpace.prodEquiv V W)).trans + SymmetricAlgebra.prodEquiv + +end Bosonic + +section Fermionic + +open scoped TensorProduct + +/-- Transport of an exterior algebra along a linear equivalence of the underlying module. -/ +noncomputable def ExteriorAlgebra.congr {R A B : Type*} [CommRing R] [AddCommGroup A] + [Module R A] [AddCommGroup B] [Module R B] (e : A ≃ₗ[R] B) : + ExteriorAlgebra R A ≃ₐ[R] ExteriorAlgebra R B := + CliffordAlgebra.equivOfIsometry ⟨e, fun _ => rfl⟩ + + +variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ℂ W] + +/-! + +## A. The component space of a direct sum + +The splitting `JetComponentSpace.prodEquiv` of the component space of a direct sum lives +with the component space itself, in + `Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic`. + +-/ + +/-! + +## B. The Fermi-parity grading + +-/ + +/-- **The Fermi-parity grading** of the fermionic algebra: the `ZMod 2` grading of the + exterior algebra by the number of component functions in a monomial. An even element + commutes with everything; two odd elements anticommute. -/ +abbrev FermionicAlgebra.evenOdd (V : Type) [AddCommGroup V] [Module ℂ V] : + ZMod 2 → Submodule ℂ (FermionicAlgebra V) := + CliffordAlgebra.evenOdd (0 : QuadraticForm ℂ (JetComponentSpace V)) + +/-! + +## C. The exterior product decomposition + +-/ + +/-- **The fermionic algebra of a direct sum is the exterior product of the fermionic + algebras.** Two matter fields taken together are one field valued in the direct sum of + their target spaces, and its fermionic algebra is the graded tensor product of theirs. + + The tensor product must be the *graded* one `ᵍ⊗`: an ordinary `⊗[ℂ]` would make a + generator of the first field commute with a generator of the second, whereas fermionic + generators anticommute across species just as they do within one. -/ +noncomputable def FermionicAlgebra.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] : + FermionicAlgebra (V × W) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd V ᵍ⊗[ℂ] FermionicAlgebra.evenOdd W) := + (ExteriorAlgebra.congr (JetComponentSpace.prodEquiv V W)).trans <| + (CliffordAlgebra.equivOfIsometry + (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace V × JetComponentSpace W))) + (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace V)).prod + (0 : QuadraticForm ℂ (JetComponentSpace W))) + ⟨LinearEquiv.refl ℂ _, fun _ => by simp⟩).trans + (CliffordAlgebra.prodEquiv _ _) + +end Fermionic diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean new file mode 100644 index 000000000..5b738e579 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean @@ -0,0 +1,280 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic +public import Physlib.Mathematics.SymmetricAlgebra +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +/-! +# The bosonic and fermionic algebras + +## i. Overview + +The two field algebras of a `V`-valued matter field, distinguished by the statistics of the +field: + +* the **bosonic algebra** `BosonicAlgebra V`, the symmetric algebra on the jet component + space — the component functions commute; +* the **fermionic algebra** `FermionicAlgebra V`, the exterior algebra on the jet component + space — the component functions anticommute. + +Both are instances of `IsFieldAlgebra`, so the gauge and Lorentz actions, the total +derivative and the mass-weight scaling of `Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra` +apply to both. This file contains only what is specific to each: the definition, the +`IsFieldAlgebra` instance, the commutation relations of the generators, and the inclusion +of a species `comap` (contravariant in the target space, hence not part of the +single-space interface). + +## ii. Key results + +- `BosonicAlgebra`, `FermionicAlgebra` : the two algebras. +- `BosonicAlgebra.instIsFieldAlgebra`, `FermionicAlgebra.instIsFieldAlgebra`. +- `BosonicAlgebra.ι_mul_ι_comm`, `FermionicAlgebra.ι_sq_zero`, + `FermionicAlgebra.ι_mul_ι_swap` : the statistics. +- `BosonicAlgebra.comap`, `FermionicAlgebra.comap` : the inclusion of a species. + +-/ + +@[expose] public section + +section Bosonic + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The bosonic algebra + +-/ + +/-- The bosonic algebra of a `V`-valued matter field: the symmetric algebra on the space + of component functions `∂_s φ_α` and `∂_s φ̄_α`. The symmetric product is the product of + bosonic fields, its commutativity the Bose statistics. -/ +abbrev BosonicAlgebra (V : Type) [AddCommGroup V] [Module ℂ V] : Type := + SymmetricAlgebra ℂ (JetComponentSpace V) + +namespace BosonicAlgebra + +/-! + +### A.1. The generators of the bosonic algebra + +-/ + +/-- **The bosonic algebra is generated by the component functions.** Every element is a + polynomial in the degree-one elements — the symbols `∂_s φ_α` and `∂_s φ̄_α` themselves. + This is the algebraic form of "every Lagrangian term is a polynomial in the component + functions". -/ +@[simp] +lemma adjoin_ι_eq_top : + Algebra.adjoin ℂ (Set.range (SymmetricAlgebra.ι ℂ (JetComponentSpace V))) = ⊤ := + SymmetricAlgebra.adjoin_range_ι + +/-- Two component functions commute: Bose statistics. -/ +lemma ι_mul_ι_comm (x y : JetComponentSpace V) : + (SymmetricAlgebra.ι ℂ _ x * SymmetricAlgebra.ι ℂ _ y : BosonicAlgebra V) + = SymmetricAlgebra.ι ℂ _ y * SymmetricAlgebra.ι ℂ _ x := + mul_comm _ _ + +/-- The bosonic algebra is a field algebra: the symmetric algebra has the universal + property. -/ +noncomputable instance instIsFieldAlgebra : IsFieldAlgebra V (BosonicAlgebra V) where + ι := SymmetricAlgebra.ι ℂ _ + map := SymmetricAlgebra.map + map_ι f x := SymmetricAlgebra.map_apply_ι f x + map_id := SymmetricAlgebra.map_id + map_comp_map f g := SymmetricAlgebra.map_comp_map g f + induction h1 h2 h3 h4 a := by + induction a using SymmetricAlgebra.induction with + | algebraMap r => exact h1 r + | ι x => exact h2 x + | mul a b ha hb => exact h3 a b ha hb + | add a b ha hb => exact h4 a b ha hb + adjoin_ι_eq_top := SymmetricAlgebra.adjoin_range_ι + +lemma ι_eq : FieldAlgebra.ι (BosonicAlgebra V) = SymmetricAlgebra.ι ℂ (JetComponentSpace V) := rfl + +/-! + +### A.2. Inclusion of a species + +A field valued in `V` that is one *species* among several — i.e. `V` is a summand of a +larger target space `W` — has its bosonic algebra sitting inside the bosonic algebra of +`W`. The inclusion is induced by the *projection* `W →ₗ[ℂ] V`, because component functions +are covectors on the target and therefore transpose. `comap` is that induced map, and it is +functorial and compatible with everything the algebra carries. + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The bosonic algebra is contravariant in the target space.** A linear map + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `BosonicAlgebra W →ₐ[ℂ] BosonicAlgebra V` + by pulling back component functions. Applied to a *projection* out of a multi-species + target space, this is the inclusion of one species' algebra into the whole. -/ +noncomputable def comap (f : V →ₗ[ℂ] W) : BosonicAlgebra W →ₐ[ℂ] BosonicAlgebra V := + SymmetricAlgebra.map (JetComponentSpace.comap f) + +@[simp] +lemma comap_ι (f : V →ₗ[ℂ] W) (x : JetComponentSpace W) : + comap f (FieldAlgebra.ι (BosonicAlgebra W) x) + = FieldAlgebra.ι (BosonicAlgebra V) (JetComponentSpace.comap f x) := + SymmetricAlgebra.map_apply_ι _ x + +@[simp] +lemma comap_id : comap (LinearMap.id : V →ₗ[ℂ] V) = AlgHom.id ℂ (BosonicAlgebra V) := by + rw [comap, JetComponentSpace.comap_id, SymmetricAlgebra.map_id] + +/-- Functoriality: the order reverses, as it must for a contravariant construction. -/ +lemma comap_comp {U : Type} [AddCommGroup U] [Module ℂ U] (f : V →ₗ[ℂ] W) (g : W →ₗ[ℂ] U) : + comap (g.comp f) = (comap f).comp (comap g) := by + rw [comap, comap, comap, JetComponentSpace.comap_comp, ← SymmetricAlgebra.map_comp_map] + +/-- The inclusion sends a component function of the species to the corresponding component + function of the whole. -/ +@[simp] +lemma comap_ofField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ W) : + comap f (FieldAlgebra.ofField (BosonicAlgebra W) φ) + = FieldAlgebra.ofField (BosonicAlgebra V) (φ ∘ₗ f) := by + rw [FieldAlgebra.ofField_apply, comap_ι, FieldAlgebra.ofField_apply] + congr 1 + +/-- The inclusion sends a conjugate component function of the species to the corresponding + conjugate component function of the whole. -/ +@[simp] +lemma comap_ofConjField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ (ConjModule W)) : + comap f (FieldAlgebra.ofConjField (BosonicAlgebra W) φ) + = FieldAlgebra.ofConjField (BosonicAlgebra V) (φ ∘ₗ ConjModule.map f) := by + rw [FieldAlgebra.ofConjField_apply, comap_ι, FieldAlgebra.ofConjField_apply] + congr 1 + +end BosonicAlgebra + +end Bosonic + +section Fermionic + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The fermionic algebra + +-/ + +/-- The fermionic algebra of a `V`-valued matter field: the exterior algebra on the space + of component functions `∂_s ψ_α` and `∂_s ψ̄_α`. The exterior product is the product of + fermionic fields, its anticommutativity the Fermi statistics. -/ +abbrev FermionicAlgebra (V : Type) [AddCommGroup V] [Module ℂ V] : Type := + ExteriorAlgebra ℂ (JetComponentSpace V) + +namespace FermionicAlgebra + +/-! + +### A.1. The generators of the fermionic algebra + +-/ + +/-- **The fermionic algebra is generated by the component functions.** Every element is a + polynomial in the degree-one elements — the symbols `∂_s ψ_α` and `∂_s ψ̄_α` themselves. + This is the algebraic form of "every Lagrangian term is a polynomial in the component + functions". -/ +@[simp] +lemma adjoin_ι_eq_top : + Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace V))) = ⊤ := + CliffordAlgebra.adjoin_range_ι + +/-- A component function squares to zero: no fermionic field appears twice. -/ +lemma ι_sq_zero (x : JetComponentSpace V) : + ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ x = (0 : FermionicAlgebra V) := + ExteriorAlgebra.ι_sq_zero x + +/-- Two component functions anticommute. -/ +lemma ι_mul_ι_swap (x y : JetComponentSpace V) : + (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y : FermionicAlgebra V) + = - (ExteriorAlgebra.ι ℂ y * ExteriorAlgebra.ι ℂ x) := + eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap (R := ℂ) x y) + +/-- The fermionic algebra is a field algebra: the exterior algebra has the universal + property. -/ +noncomputable instance instIsFieldAlgebra : IsFieldAlgebra V (FermionicAlgebra V) where + ι := ExteriorAlgebra.ι ℂ + map := ExteriorAlgebra.map + map_ι f x := ExteriorAlgebra.map_apply_ι f x + map_id := ExteriorAlgebra.map_id + map_comp_map f g := ExteriorAlgebra.map_comp_map f g + induction h1 h2 h3 h4 a := by + induction a using ExteriorAlgebra.induction with + | algebraMap r => exact h1 r + | ι x => exact h2 x + | mul a b ha hb => exact h3 a b ha hb + | add a b ha hb => exact h4 a b ha hb + adjoin_ι_eq_top := CliffordAlgebra.adjoin_range_ι + +lemma ι_eq : FieldAlgebra.ι (FermionicAlgebra V) = ExteriorAlgebra.ι ℂ := rfl + +/-! + +### A.2. Inclusion of a species + +A field valued in `V` that is one *species* among several — i.e. `V` is a summand of a +larger target space `U` — has its fermionic algebra sitting inside the fermionic algebra of +`U`. The inclusion is induced by the *projection* `U →ₗ[ℂ] V`, because component functions +are covectors on the target and therefore transpose. `comap` is that induced map, and it is +functorial and compatible with everything the algebra carries. + +-/ + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The fermionic algebra is contravariant in the target space.** A linear map + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `FermionicAlgebra W →ₐ[ℂ] FermionicAlgebra V` + by pulling back component functions. Applied to a *projection* out of a multi-species target + space, this is the inclusion of one species' algebra into the whole. -/ +noncomputable def comap (f : V →ₗ[ℂ] W) : FermionicAlgebra W →ₐ[ℂ] FermionicAlgebra V := + ExteriorAlgebra.map (JetComponentSpace.comap f) + +@[simp] +lemma comap_ι (f : V →ₗ[ℂ] W) (x : JetComponentSpace W) : + comap f (FieldAlgebra.ι (FermionicAlgebra W) x) + = FieldAlgebra.ι (FermionicAlgebra V) (JetComponentSpace.comap f x) := + ExteriorAlgebra.map_apply_ι _ x + +@[simp] +lemma comap_id : comap (LinearMap.id : V →ₗ[ℂ] V) = AlgHom.id ℂ (FermionicAlgebra V) := by + rw [comap, JetComponentSpace.comap_id, ExteriorAlgebra.map_id] + +/-- Functoriality: the order reverses, as it must for a contravariant construction. -/ +lemma comap_comp {U : Type} [AddCommGroup U] [Module ℂ U] (f : V →ₗ[ℂ] W) (g : W →ₗ[ℂ] U) : + comap (g.comp f) = (comap f).comp (comap g) := by + rw [comap, comap, comap, JetComponentSpace.comap_comp, ← ExteriorAlgebra.map_comp_map] + +/-- The inclusion sends a component function of the species to the corresponding component + function of the whole. -/ +@[simp] +lemma comap_ofField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ W) : + comap f (FieldAlgebra.ofField (FermionicAlgebra W) φ) + = FieldAlgebra.ofField (FermionicAlgebra V) (φ ∘ₗ f) := by + rw [FieldAlgebra.ofField_apply, comap_ι, FieldAlgebra.ofField_apply] + congr 1 + +/-- The inclusion sends a conjugate component function of the species to the corresponding + conjugate component function of the whole. -/ +@[simp] +lemma comap_ofConjField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ (ConjModule W)) : + comap f (FieldAlgebra.ofConjField (FermionicAlgebra W) φ) + = FieldAlgebra.ofConjField (FermionicAlgebra V) (φ ∘ₗ ConjModule.map f) := by + rw [FieldAlgebra.ofConjField_apply, comap_ι, FieldAlgebra.ofConjField_apply] + congr 1 + +end FermionicAlgebra + +end Fermionic diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean new file mode 100644 index 000000000..4491397b8 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean @@ -0,0 +1,137 @@ +/- +Copyright (c) 2026 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.JetRing.Basic +public import Physlib.Relativity.DerivAlgebra +public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.LinearAlgebra.Basis.Defs +public import Mathlib.LinearAlgebra.Dimension.Free +/-! +# `V`-valued jets + +## i. Overview + +The jets of a field valued in a complex vector space `V` are `JetRing ⊗[ℂ] V`. This file +provides the basic toolkit for them, independent of any gauge group: + +* `jetOfConstant` — the inclusion of constants, `v ↦ 1 ⊗ v`; +* `jetDeriv`/`jetIteratedDeriv` — the formal derivative, acting on the jet factor; +* `jetEval` — evaluation at the base point, `f ⊗ v ↦ (constant coefficient of f) • v`. + +-/ + +@[expose] public section + +open TensorProduct MvPowerSeries +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## `V`-valued jets + +-/ + +/-- The constant-coefficient evaluation of a jet, as a `ℂ`-linear map. -/ +noncomputable def _root_.JetRing.constantCoeffₗ : JetRing →ₗ[ℂ] ℂ where + toFun := constantCoeff + map_add' f g := by simp + map_smul' c f := by simp [smul_eq_C_mul] + +@[simp] +lemma _root_.JetRing.constantCoeffₗ_apply (f : JetRing) : + JetRing.constantCoeffₗ f = constantCoeff f := rfl + +/-- The inclusion of constants into `V`-valued jets: `v ↦ 1 ⊗ v`. -/ +noncomputable def jetOfConstant : V →ₗ[ℂ] JetRing ⊗[ℂ] V := + TensorProduct.mk ℂ JetRing V 1 + +@[simp] +lemma jetOfConstant_apply (v : V) : jetOfConstant v = (1 : JetRing) ⊗ₜ[ℂ] v := rfl + +/-- The formal derivative on `V`-valued jets in the direction `μ`, acting on the jet + factor. -/ +noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : + JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V := + LinearMap.rTensor V (pderiv ℂ μ).toLinearMap + +@[simp] +lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : JetRing) (v : V) : + jetDeriv μ (f ⊗ₜ[ℂ] v) = pderiv ℂ μ f ⊗ₜ[ℂ] v := rfl + +/-- Formal derivatives on `V`-valued jets commute, since the partial derivatives of + jets do. -/ +lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (jetDeriv (V := V) μ).comp (jetDeriv ν) = (jetDeriv ν).comp (jetDeriv μ) := by + rw [jetDeriv, jetDeriv, ← LinearMap.rTensor_comp, ← LinearMap.rTensor_comp] + exact congrArg (LinearMap.rTensor V) + (LinearMap.ext fun f => JetRing.pderiv_comm μ ν f) + +/-- Post-composition with `jetDeriv` is right-commutative, which is what allows + iterated derivatives to be indexed by a `Multiset` of directions. -/ +instance : RightCommutative (fun (L : JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V) + (μ : Fin 1 ⊕ Fin 3) => L.comp (jetDeriv μ)) where + right_comm L μ ν := by + refine LinearMap.ext fun x => ?_ + have h := LinearMap.congr_fun (jetDeriv_comm μ ν) x + simp only [LinearMap.coe_comp, Function.comp_apply] at h ⊢ + exact congrArg L h + +/-- The iterated formal derivative on `V`-valued jets, in the (unordered) directions + given by the multiset `μs`. -/ +noncomputable def jetIteratedDeriv (μs : Multiset (Fin 1 ⊕ Fin 3)) : + JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V := + μs.foldl (fun L μ => L.comp (jetDeriv μ)) LinearMap.id + +@[simp] +lemma jetIteratedDeriv_zero : + jetIteratedDeriv (V := V) (0 : Multiset (Fin 1 ⊕ Fin 3)) = LinearMap.id := by + simp [jetIteratedDeriv] + +lemma jetIteratedDeriv_cons (μ : Fin 1 ⊕ Fin 3) (μs : Multiset (Fin 1 ⊕ Fin 3)) : + jetIteratedDeriv (V := V) (μ ::ₘ μs) = (jetDeriv μ).comp (jetIteratedDeriv μs) := by + have h : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (L : JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V), + s.foldl (fun L μ => L.comp (jetDeriv μ)) L = L.comp (jetIteratedDeriv s) := by + intro s + induction s using Multiset.induction_on with + | empty => intro L; simp [jetIteratedDeriv] + | cons κ t ih => + intro L + rw [jetIteratedDeriv, Multiset.foldl_cons, Multiset.foldl_cons, ih, ih] + simp [LinearMap.comp_assoc] + rw [jetIteratedDeriv, Multiset.foldl_cons, h] + simp + +/-- The iterated derivative is additive in the multiset of directions. -/ +lemma jetIteratedDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + jetIteratedDeriv (V := V) (s + t) = + (jetIteratedDeriv s).comp (jetIteratedDeriv t) := by + induction s using Multiset.induction_on with + | empty => simp + | cons μ s ih => + rw [Multiset.cons_add, jetIteratedDeriv_cons, jetIteratedDeriv_cons, ih, + LinearMap.comp_assoc] + +@[simp] +lemma jetIteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : + jetIteratedDeriv (V := V) ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = jetDeriv μ := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, jetIteratedDeriv_cons, + jetIteratedDeriv_zero, LinearMap.comp_id] + +/-- Evaluation of a `V`-valued jet at the base point: + `f ⊗ v ↦ (constant coefficient of f) • v`. This is a retraction of + `jetOfConstant`. -/ +noncomputable def jetEval : JetRing ⊗[ℂ] V →ₗ[ℂ] V := + TensorProduct.lift ((LinearMap.lsmul ℂ V).comp JetRing.constantCoeffₗ) + +@[simp] +lemma jetEval_tmul (f : JetRing) (v : V) : + jetEval (f ⊗ₜ[ℂ] v) = constantCoeff f • v := rfl + +@[simp] +lemma jetEval_jetOfConstant (v : V) : jetEval (jetOfConstant v) = v := by + simp diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/Basic.lean new file mode 100644 index 000000000..7b5bf4542 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/Basic.lean @@ -0,0 +1,406 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.Jet +public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic +public import Physlib.Relativity.IsLorentzDeriv +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.LinearAlgebra.Contraction +public import Mathlib.LinearAlgebra.TensorProduct.Prod +public import Mathlib.LinearAlgebra.Matrix.SpecialLinearGroup +/-! +# The jet component space of a matter field + +## i. Overview + +For a matter field valued in a complex vector space `V`, the *jet component space* is the +span of the derivative symbols `∂_s ψ_α` and their conjugates `∂_s ψ̄_α`: the local +coordinate functions on the space of jets of the field. This file defines that space and +the structure on it that does not involve a gauge group: the Lorentz action, the jet +derivative, functoriality in `V` and the mass-weight scaling. The action of a gauge group +is in `Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction`. + +## ii. Key results + +- `JetComponentSpace` : the space of component functions. +- `JetComponentSpace.repLorentzGroup` : the Lorentz action on the component space. +- `JetComponentSpace.jetDeriv` : the shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the label. +- `JetComponentSpace.jetDeriv_comm` : the shifts in different directions commute. +- `JetComponentSpace.repLorentzGroup_jetDeriv` : the shift is a Lorentz vector. +- `JetComponentSpace.comap` : functoriality, contravariant in the target space. +- `JetComponentSpace.massWeightScale` : the mass-weight scaling. +- `JetComponentSpace.prodEquiv` : the component space of a direct sum. + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +variable {V : Type _} [AddCommGroup V] [Module ℂ V] + + +/-- The space of component functions of a `V`-valued matter field: the span of the +symbols `∂_s ψ_α` and their conjugates `∂_s ψ̄_α`. The first factor holds the +unconjugated symbols, the second the conjugate ones; in each, `DerivAlgebraComplex` +carries the derivative label `s` and the dual factor the target component `α`. -/ +abbrev JetComponentSpace (V : Type _) [AddCommGroup V] [Module ℂ V] := + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) × + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) + +/-! + +## The Lorentz action on the component space + +-/ + +/-- **The Lorentz action on the jet component space.** Under a Lorentz transformation a +matter field transforms as `ψ(x) ↦ ρ(Λ) ψ(Λ⁻¹ x)`, so a derivative symbol `∂_s ψ_α` is +acted on in *both* of its labels: the derivative multiset `s` by the Lorentz action on +covectors, extended to `DerivAlgebraComplex`, and the target index `α` by the +contragredient of `ρ`. + +Unlike the gauge action, this needs no fibrewise-linearity or finite-dimensionality +hypothesis: the two labels transform independently, so the action is simply a tensor +product of representations. The conjugate half is the same with `ρ` replaced by its +conjugate, the symbols `∂_s ψ̄_α` transforming by `star` of the spinor matrix. -/ +noncomputable def JetComponentSpace.repLorentzGroup + (repV : Representation ℂ SL(2,ℂ) V) : + Representation ℂ SL(2,ℂ) (JetComponentSpace V) := + (DerivAlgebraComplex.repLorentzGroup.tprod repV.dual).prod + (DerivAlgebraComplex.repLorentzGroup.tprod repV.conj.dual) + +@[simp] +lemma JetComponentSpace.repLorentzGroup_fst (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (x : JetComponentSpace V) : + (JetComponentSpace.repLorentzGroup repV Λ x).1 + = (DerivAlgebraComplex.repLorentzGroup.tprod repV.dual) Λ x.1 := rfl + +@[simp] +lemma JetComponentSpace.repLorentzGroup_snd (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (x : JetComponentSpace V) : + (JetComponentSpace.repLorentzGroup repV Λ x).2 + = (DerivAlgebraComplex.repLorentzGroup.tprod repV.conj.dual) Λ x.2 := rfl + +/-- On a pure symbol the Lorentz action is diagonal in the two labels: the derivative +label transforms in `DerivAlgebraComplex`, the target index contragrediently. -/ +@[simp] +lemma JetComponentSpace.repLorentzGroup_fst_tmul (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (a : DerivAlgebraComplex) (φ : Module.Dual ℂ V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.repLorentzGroup repV Λ (a ⊗ₜ[ℂ] φ, y)).1 + = DerivAlgebraComplex.repLorentzGroup Λ a ⊗ₜ[ℂ] (φ ∘ₗ repV Λ⁻¹) := rfl + +/-! + +## The jet derivative + +-/ + +/-- the derivative of components in the jet component space, + in the direction `μ`: the shift `∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the derivative label, + and likewise on the conjugate components. + + This is right multiplication by the degree-one element `∂_μ` on the + `DerivAlgebraComplex` factor, leaving the target index untouched. It uses a basis of + the Lorentz covectors — that is what the index `μ` is — but no basis of `V`. -/ +noncomputable def JetComponentSpace.jetDeriv (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace V →ₗ[ℂ] JetComponentSpace V := + LinearMap.prodMap + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id) + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id) + +@[simp] +lemma JetComponentSpace.jetDeriv_fst_tmul (μ : Fin 1 ⊕ Fin 3) + (a : DerivAlgebraComplex) (φ : Module.Dual ℂ V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.jetDeriv μ (a ⊗ₜ[ℂ] φ, y)).1 + = (a * DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℂ] φ := rfl + +@[simp] +lemma JetComponentSpace.jetDeriv_snd_tmul (μ : Fin 1 ⊕ Fin 3) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (a : DerivAlgebraComplex) (φ : Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.jetDeriv μ (x, a ⊗ₜ[ℂ] φ)).2 + = (a * DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) ⊗ₜ[ℂ] φ := rfl + +/-- **Total derivatives commute.** Mixed partials agree because the derivative labels + live in a *symmetric* algebra; no basis of `V` is involved. -/ +lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : + (JetComponentSpace.jetDeriv (V := V) μ).comp (JetComponentSpace.jetDeriv ν) + = (JetComponentSpace.jetDeriv (V := V) ν).comp (JetComponentSpace.jetDeriv μ) := by + have hmul : ∀ b c : DerivAlgebraComplex, + (LinearMap.mulRight ℂ b).comp (LinearMap.mulRight ℂ c) + = LinearMap.mulRight ℂ (c * b) := + fun b c => LinearMap.ext fun x => by + simp only [LinearMap.coe_comp, Function.comp_apply, LinearMap.mulRight_apply, mul_assoc] + rw [JetComponentSpace.jetDeriv, JetComponentSpace.jetDeriv, LinearMap.prodMap_comp, + LinearMap.prodMap_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp, + ← TensorProduct.map_comp, ← TensorProduct.map_comp, hmul, hmul, mul_comm] + +/-- The element being multiplied in is the degree-one derivative symbol `∂_μ`, the image + of the dual basis covector under `SymmetricAlgebra.ι`. -/ +lemma JetComponentSpace.jetDeriv_eq_ι (μ : Fin 1 ⊕ Fin 3) : + JetComponentSpace.jetDeriv (V := V) μ + = LinearMap.prodMap + (TensorProduct.map + (LinearMap.mulRight ℂ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ))) LinearMap.id) + (TensorProduct.map + (LinearMap.mulRight ℂ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + (Lorentz.complexCoBasis.dualBasis μ))) LinearMap.id) := by + rw [JetComponentSpace.jetDeriv, DerivAlgebraComplex.basis_singleton] + +@[simp] +lemma JetComponentSpace.jetDeriv_fst (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace V) : + (JetComponentSpace.jetDeriv μ v).1 + = TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id v.1 := rfl + +@[simp] +lemma JetComponentSpace.jetDeriv_snd (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace V) : + (JetComponentSpace.jetDeriv μ v).2 + = TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id v.2 := rfl + +/-! + +## Lorentz covariance of the jet derivative + +-/ + +/-- The covariance of the derivative-symbol multiplication on one tensor factor of the + component space, for an arbitrary representation on the other factor. -/ +private lemma repLorentzGroup_tprod_mulRight_jetSymbol {W : Type*} [AddCommGroup W] + [Module ℂ W] (ρ : Representation ℂ SL(2,ℂ) W) (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (w : DerivAlgebraComplex ⊗[ℂ] W) : + (DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ + (TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id w) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + TensorProduct.map + (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({a} : Multiset (Fin 1 ⊕ Fin 3)))) + LinearMap.id ((DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ w) := by + have hsym : DerivAlgebraComplex.repLorentzGroup Λ + (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3))) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + DerivAlgebraComplex.basis ({a} : Multiset (Fin 1 ⊕ Fin 3)) := by + rw [DerivAlgebraComplex.basis_singleton, DerivAlgebraComplex.repLorentzGroup_apply_ι, + Lorentz.CoℂModule.SL2CRep_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, DerivAlgebraComplex.basis_singleton] + have hrep : ∀ (q : DerivAlgebraComplex) (f : W), + (DerivAlgebraComplex.repLorentzGroup.tprod ρ) Λ (q ⊗ₜ[ℂ] f) = + (DerivAlgebraComplex.repLorentzGroup Λ q) ⊗ₜ[ℂ] (ρ Λ f) := fun _ _ => rfl + induction w using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => + rw [map_add, map_add, map_add, hx, hy, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun a _ => by rw [map_add, smul_add] + | tmul q f => + rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, hrep, hrep, + DerivAlgebraComplex.repLorentzGroup_apply_mul, hsym, Finset.mul_sum, + TensorProduct.sum_tmul] + exact Finset.sum_congr rfl fun a _ => by + rw [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, + mul_smul_comm, TensorProduct.smul_tmul'] + +/-- **The jet derivative is a Lorentz vector on the component space.** Appending `∂_μ` and + then acting is acting and then appending the transformed `∂_μ`, which is a combination of + the `∂_a`. Both halves of the component space are covered by the same argument: the + derivative label lives in the first tensor factor, and what sits in the second factor — + `repV.dual` or `repV.conj.dual` — plays no role. -/ +lemma JetComponentSpace.repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) + (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace V) : + JetComponentSpace.repLorentzGroup repV Λ (JetComponentSpace.jetDeriv μ v) = + ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + JetComponentSpace.jetDeriv a (JetComponentSpace.repLorentzGroup repV Λ v) := by + refine Prod.ext ?_ ?_ + · simp only [Prod.fst_sum, Prod.smul_fst, JetComponentSpace.repLorentzGroup_fst, + JetComponentSpace.jetDeriv_fst] + exact repLorentzGroup_tprod_mulRight_jetSymbol _ Λ μ v.1 + · simp only [Prod.snd_sum, Prod.smul_snd, JetComponentSpace.repLorentzGroup_snd, + JetComponentSpace.jetDeriv_snd] + exact repLorentzGroup_tprod_mulRight_jetSymbol _ Λ μ v.2 + +/-! + +## Functoriality in the target space + +-/ + +variable {W : Type _} [AddCommGroup W] [Module ℂ W] + +/-- **The component space is contravariant in the target space.** A linear map `f : V →ₗ W` + of target spaces pulls the component functions of a `W`-valued field back to component + functions of a `V`-valued field: a component function is a *covector* on the target, so it + transposes. The derivative label is untouched, and the conjugate half transposes the + conjugate of `f`. -/ +noncomputable def JetComponentSpace.comap (f : V →ₗ[ℂ] W) : + JetComponentSpace W →ₗ[ℂ] JetComponentSpace V := + LinearMap.prodMap + (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + (TensorProduct.map LinearMap.id (Module.Dual.transpose (ConjModule.map f))) + +@[simp] +lemma JetComponentSpace.comap_fst_tmul (f : V →ₗ[ℂ] W) (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ W) (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule W)) : + (JetComponentSpace.comap f (a ⊗ₜ[ℂ] φ, y)).1 = a ⊗ₜ[ℂ] (φ ∘ₗ f) := rfl + +@[simp] +lemma JetComponentSpace.comap_snd_tmul (f : V →ₗ[ℂ] W) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ W) (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ (ConjModule W)) : + (JetComponentSpace.comap f (x, a ⊗ₜ[ℂ] φ)).2 = a ⊗ₜ[ℂ] (φ ∘ₗ ConjModule.map f) := rfl + +@[simp] +lemma JetComponentSpace.comap_id : + JetComponentSpace.comap (LinearMap.id : V →ₗ[ℂ] V) = LinearMap.id := by + rw [JetComponentSpace.comap, + show Module.Dual.transpose (LinearMap.id : V →ₗ[ℂ] V) = LinearMap.id from rfl, + show ConjModule.map (LinearMap.id : V →ₗ[ℂ] V) = LinearMap.id from rfl, + show Module.Dual.transpose (LinearMap.id : ConjModule V →ₗ[ℂ] ConjModule V) + = LinearMap.id from rfl, TensorProduct.map_id, TensorProduct.map_id] + rfl + +/-- Functoriality: pulling back along `g ∘ f` is pulling back along `g` and then along `f`. + The order reverses, as it must for a contravariant construction. -/ +lemma JetComponentSpace.comap_comp {U : Type _} [AddCommGroup U] [Module ℂ U] + (f : V →ₗ[ℂ] W) (g : W →ₗ[ℂ] U) : + JetComponentSpace.comap (g.comp f) + = (JetComponentSpace.comap f).comp (JetComponentSpace.comap g) := by + rw [JetComponentSpace.comap, JetComponentSpace.comap, JetComponentSpace.comap, + LinearMap.prodMap_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp, + LinearMap.id_comp] + rfl + +/-- **The pullback commutes with the jet derivative.** The two act on different tensor + factors — the derivative label and the target index — so an inclusion of species is a map + of differential algebras. -/ +lemma JetComponentSpace.comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) : + (JetComponentSpace.comap f).comp (JetComponentSpace.jetDeriv μ) + = (JetComponentSpace.jetDeriv μ).comp (JetComponentSpace.comap f) := by + rw [JetComponentSpace.comap, JetComponentSpace.jetDeriv, JetComponentSpace.jetDeriv, + LinearMap.prodMap_comp, LinearMap.prodMap_comp, ← TensorProduct.map_comp, + ← TensorProduct.map_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp] + simp only [LinearMap.comp_id, LinearMap.id_comp] + +/-! + +## The mass-weight scaling + +The mass dimension is tracked multiplicatively, through a scaling action: for a field of +*mass weight* `w` — twice the mass dimension, kept integral so that fermions of dimension +`3/2` carry weight `3` — the generator `∂_s φ_α` scales by `c ^ (w + 2 |s|)`, one factor +of `c ^ 2` per derivative. The scaling on the component space below lifts functorially to +the bosonic and fermionic algebras, where it defines their mass-dimension grading. + +-/ + +/-- The mass-weight scaling on the jet component space of a field of mass weight `w` + (twice the mass dimension): the generator `∂_s φ_α` and its conjugate are scaled by + `c ^ (w + 2 |s|)`, through the derivative-degree scaling `DerivAlgebraComplex.gradeScale` + on the derivative label. -/ +noncomputable def JetComponentSpace.massWeightScale (w : ℕ) (c : ℂ) : + JetComponentSpace V →ₗ[ℂ] JetComponentSpace V := + c ^ w • LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id) + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id) + +/-- On an unconjugated component function `∂_s φ_α` the mass-weight scaling is + multiplication by `c ^ (w + 2 |s|)`. -/ +lemma JetComponentSpace.massWeightScale_fst_basis_tmul (w : ℕ) (c : ℂ) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) : + (JetComponentSpace.massWeightScale w c + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, y) : JetComponentSpace V)).1 + = c ^ (w + 2 * Multiset.card s) • (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) := by + simp only [massWeightScale, LinearMap.smul_apply, Prod.smul_fst, LinearMap.prodMap_apply, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, DerivAlgebraComplex.gradeScale_basis, + LinearMap.id_apply, TensorProduct.smul_tmul', ← pow_mul, pow_add, mul_smul, + mul_comm 2 (Multiset.card s)] + +@[simp] +lemma JetComponentSpace.massWeightScale_fst (w : ℕ) (c : ℂ) (v : JetComponentSpace V) : + (JetComponentSpace.massWeightScale w c v).1 + = c ^ w • TensorProduct.map + (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id v.1 := rfl + +@[simp] +lemma JetComponentSpace.massWeightScale_snd (w : ℕ) (c : ℂ) (v : JetComponentSpace V) : + (JetComponentSpace.massWeightScale w c v).2 + = c ^ w • TensorProduct.map + (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id v.2 := rfl + +/-- The derivative-degree scaling intertwines multiplication by a single derivative + symbol up to one factor of the scaling parameter, on either half of the component + space. -/ +private lemma gradeScale_map_mulRight_basis {W : Type*} [AddCommGroup W] [Module ℂ W] + (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : DerivAlgebraComplex ⊗[ℂ] W) : + TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id + (TensorProduct.map (LinearMap.mulRight ℂ + (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) LinearMap.id x) + = c ^ 2 • TensorProduct.map (LinearMap.mulRight ℂ + (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) LinearMap.id + (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap + LinearMap.id x) := by + induction x using TensorProduct.induction_on with + | zero => simp only [map_zero, smul_zero] + | add a b ha hb => simp only [map_add, ha, hb, smul_add] + | tmul a y => + simp only [TensorProduct.map_tmul, LinearMap.mulRight_apply, LinearMap.id_apply, + AlgHom.toLinearMap_apply, map_mul, DerivAlgebraComplex.gradeScale_basis, + Multiset.card_singleton, pow_one, mul_smul_comm, TensorProduct.smul_tmul'] + +/-- **The total derivative carries mass weight two** on the component space: the scaling + intertwines the derivative shift up to a factor `c ^ 2`. -/ +lemma JetComponentSpace.massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : + (JetComponentSpace.massWeightScale (V := V) w c).comp (JetComponentSpace.jetDeriv μ) + = c ^ 2 • (JetComponentSpace.jetDeriv μ).comp + (JetComponentSpace.massWeightScale w c) := by + have key := fun {W : Type _} [AddCommGroup W] [Module ℂ W] + (x : DerivAlgebraComplex ⊗[ℂ] W) => gradeScale_map_mulRight_basis c μ x + refine LinearMap.ext fun v => Prod.ext ?_ ?_ + · simp only [LinearMap.comp_apply, LinearMap.smul_apply, Prod.smul_fst, + JetComponentSpace.massWeightScale_fst, JetComponentSpace.jetDeriv_fst, map_smul] + exact (congrArg (fun z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V => c ^ w • z) + (key v.1)).trans (smul_comm _ _ _) + · simp only [LinearMap.comp_apply, LinearMap.smul_apply, Prod.smul_snd, + JetComponentSpace.massWeightScale_snd, JetComponentSpace.jetDeriv_snd, map_smul] + exact (congrArg (fun z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) => + c ^ w • z) (key v.2)).trans (smul_comm _ _ _) + +/-! + +## The component space of a direct sum + +-/ + +/-- **The component space of a direct sum splits.** The component functions of a + `(V × W)`-valued field are those of a `V`-valued field together with those of a + `W`-valued field: the dual and the conjugate both distribute over the finite product, and + the derivative label is untouched. -/ +noncomputable def JetComponentSpace.prodEquiv (V W : Type) [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] : + JetComponentSpace (V × W) ≃ₗ[ℂ] JetComponentSpace V × JetComponentSpace W := + (LinearEquiv.prodCongr + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (Module.dualProdDualEquivDual ℂ V W).symm) + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (((ConjModule.prodEquiv (k := ℂ) (M := V) (N := W)).symm.dualMap).trans + (Module.dualProdDualEquivDual ℂ (ConjModule V) (ConjModule W)).symm))).trans <| + (LinearEquiv.prodCongr (TensorProduct.prodRight ℂ ℂ _ _ _) + (TensorProduct.prodRight ℂ ℂ _ _ _)).trans + (LinearEquiv.prodProdProdComm ℂ _ _ _ _) diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/GaugeAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/GaugeAction.lean new file mode 100644 index 000000000..634ae62cd --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/GaugeAction.lean @@ -0,0 +1,487 @@ +/- +Copyright (c) 2026 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.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic +/-! +# The gauge action on the jet component space + +## i. Overview + +For a matter field valued in `V` with an action of a group `G` on its jets +`JetRing ⊗[ℂ] V`, this file constructs the induced action of `G` on the jet component +space. Here `G` is any group — for the Standard Model it is the jet gauge group +`JetGaugeGroupI`, but nothing here depends on that. + +The construction needs two hypotheses on the jet action `rep`: + +* `hlin` — that `rep` is *fibrewise*, `rep U (χ • z) = χ • rep U z`, the statement that a + gauge transformation acts on the values of the field over the identity on spacetime. + This is what makes the induced action local (a finite Leibniz convolution) and what + makes `rep` determined by its restriction to constant jets. +* finite dimensionality of `V`, which makes that restriction a *matrix of power series*, + an element of `JetRing ⊗ End V`. + +## ii. Key results + +- `JetComponentSpace.jetCoeff` : the coefficient of a fibrewise action, in `JetRing ⊗ End V`. +- `JetComponentSpace.coeff_mul_of_smul_comm` : the coefficient is multiplicative. +- `JetComponentSpace.symbolAction`, `symbolAction_mul` : its action on symbols, an + anti-homomorphism. +- `JetComponentSpace.repDual` : the induced action on the unconjugated symbols. +- `JetComponentSpace.repConj`, `repConj_smul_comm` : the action on the jets of the + conjugate field. +- `JetComponentSpace.repJet` : the action on the full component space. + +-/ + +@[expose] public section + +namespace JetComponentSpace + +open Matrix MatrixGroups TensorProduct + +variable {V : Type _} [AddCommGroup V] [Module ℂ V] +variable {G : Type*} [Group G] + +/-- **A fibrewise action is determined by its values on constant jets.** If the gauge +action commutes with multiplication by scalar jets — the statement that it acts on the +values of the field, over the identity on spacetime — then its value on a general jet +`f ⊗ₜ v` is the constant-jet value `rep U (1 ⊗ₜ v)` scaled by `f`. -/ +lemma rep_tmul_of_smul_comm + {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (f : JetRing) (v : V) : + rep U (f ⊗ₜ[ℂ] v) = f • rep U (jetOfConstant v) := by + rw [← hlin U f (jetOfConstant v), jetOfConstant_apply, + show f • ((1 : JetRing) ⊗ₜ[ℂ] v) = f ⊗ₜ[ℂ] v from by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one]] + +/-- **The canonical evaluation is a right module map.** Writing `ev` for the canonical +`JetRing ⊗ End V → (V →ₗ JetRing ⊗ V)`, `g ⊗ T ↦ (v ↦ g ⊗ₜ T v)`, multiplying on the +right by `b ⊗ T` applies `T` to the argument and scales the value by `b`. -/ +lemma lift_mul_tmul (x : JetRing ⊗[ℂ] Module.End ℂ V) + (b : JetRing) (T : Module.End ℂ V) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (x * (b ⊗ₜ[ℂ] T)) v + = b • TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) x (T v) := by + induction x using TensorProduct.induction_on with + | zero => + have h0 : (0 : JetRing ⊗[ℂ] Module.End ℂ V) * (b ⊗ₜ[ℂ] T) = 0 := by exact zero_mul (b ⊗ₜ[ℂ] T) + rw [h0] + simp + | tmul a S => + rw [Algebra.TensorProduct.tmul_mul_tmul] + show (a * b) ⊗ₜ[ℂ] (S * T) v = b • (a ⊗ₜ[ℂ] S (T v)) + rw [Module.End.mul_apply, TensorProduct.smul_tmul', smul_eq_mul, mul_comm b a] + | add p q hp hq => + have hd : (p + q) * (b ⊗ₜ[ℂ] T) = p * (b ⊗ₜ[ℂ] T) + q * (b ⊗ₜ[ℂ] T) := by + exact Distrib.right_distrib p q (b ⊗ₜ[ℂ] T) + rw [hd, map_add, LinearMap.add_apply, hp, hq, map_add, LinearMap.add_apply, + smul_add] + +/-- **A fibrewise action is the `JetRing`-linear extension of its coefficient.** If the +element `x` of `JetRing ⊗ End V` records `rep U` on constant jets, then `rep U` agrees +with left multiplication by `x` on every coefficient `y`. -/ +lemma rep_lift_of_smul_comm + {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (x : JetRing ⊗[ℂ] Module.End ℂ V) + (hx : ∀ v : V, TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) x v = rep U (jetOfConstant v)) + (y : JetRing ⊗[ℂ] Module.End ℂ V) (v : V) : + rep U (TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) y v) + = TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (x * y) v := by + induction y using TensorProduct.induction_on with + | zero => + have h0 : x * (0 : JetRing ⊗[ℂ] Module.End ℂ V) = 0 := by exact mul_zero x + rw [h0] + simp + | tmul b T => + rw [lift_mul_tmul x b T v, + show TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (b ⊗ₜ[ℂ] T) v = b ⊗ₜ[ℂ] T v from rfl, + rep_tmul_of_smul_comm hlin U b (T v), hx (T v)] + | add p q hp hq => + have hd : x * (p + q) = x * p + x * q := by exact Distrib.left_distrib x p q + rw [hd, map_add, LinearMap.add_apply, map_add, map_add, LinearMap.add_apply, + hp, hq] + +/-- **The coefficient of a fibrewise action is multiplicative.** Recording `rep` on +constant jets as a family `c` in `JetRing ⊗ End V`, group multiplication becomes +multiplication in that algebra. This is the identity that makes the induced action on +the symbols a representation, and it needs no basis. -/ +lemma coeff_mul_of_smul_comm + {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (c : G → JetRing ⊗[ℂ] Module.End ℂ V) + (hc : ∀ (U : G) (v : V), + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (c U) v = rep U (jetOfConstant v)) + (U W : G) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (c U * c W) v + = rep (U * W) (jetOfConstant v) := by + rw [← rep_lift_of_smul_comm hlin U (c U) (hc U) (c W) v, hc W v, map_mul, + Module.End.mul_apply] + +/-- **The symbol action of a coefficient is an anti-homomorphism.** Let `Θ` send a +coefficient `g ⊗ T` in `JetRing ⊗ End V` to the endomorphism `jetRingAction g ⊗ Tᵀ` of +the symbol space `DerivAlgebraComplex ⊗ Dual V`. Then `Θ` reverses products: the jet-ring +factor is multiplicative (`jetRingAction_mul`, and `JetRing` is commutative) while the +target factor is contravariant (`Module.Dual.transpose_comp`). Composed with `U ↦ U⁻¹` +this is exactly what makes the induced action a representation, with no induction over +the antidiagonal. -/ +lemma symbolAction_mul + (Θ : (JetRing ⊗[ℂ] Module.End ℂ V) →ₗ[ℂ] + Module.End ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V)) + (hΘ : ∀ (g : JetRing) (T : Module.End ℂ V), + Θ (g ⊗ₜ[ℂ] T) = TensorProduct.map (DerivAlgebraComplex.jetRingAction g) + (Module.Dual.transpose T)) + (x y : JetRing ⊗[ℂ] Module.End ℂ V) : + Θ (x * y) = Θ y ∘ₗ Θ x := by + induction x using TensorProduct.induction_on with + | zero => + have h0 : (0 : JetRing ⊗[ℂ] Module.End ℂ V) * y = 0 := by exact zero_mul y + rw [h0, map_zero] + simp + | tmul a S => + induction y using TensorProduct.induction_on with + | zero => + have h0 : (a ⊗ₜ[ℂ] S) * (0 : JetRing ⊗[ℂ] Module.End ℂ V) = 0 := by + exact mul_zero (a ⊗ₜ[ℂ] S) + rw [h0, map_zero] + simp + | tmul b T => + rw [Algebra.TensorProduct.tmul_mul_tmul, hΘ, hΘ, hΘ, + ← TensorProduct.map_comp, ← DerivAlgebraComplex.jetRingAction_mul, + ← Module.Dual.transpose_comp, Module.End.mul_eq_comp, mul_comm a b] + | add p q hp hq => + have hd : (a ⊗ₜ[ℂ] S) * (p + q) = (a ⊗ₜ[ℂ] S) * p + (a ⊗ₜ[ℂ] S) * q := by + exact Distrib.left_distrib (a ⊗ₜ[ℂ] S) p q + rw [hd, map_add, map_add, LinearMap.add_comp, hp, hq] + | add p q hp hq => + have hd : (p + q) * y = p * y + q * y := by exact Distrib.right_distrib p q y + rw [hd, map_add, map_add, LinearMap.comp_add, hp, hq] + +/-- **The coefficient of a linear map, canonically.** For finite-dimensional `V` the +canonical `JetRing ⊗ End V → (V →ₗ JetRing ⊗ V)` is inverted by reassociating the +contraction `Dual V ⊗ (JetRing ⊗ V) ≃ JetRing ⊗ (Dual V ⊗ V) ≃ JetRing ⊗ End V`. This is +the finite-rank input, obtained from `dualTensorHomEquiv` rather than from a basis. -/ +lemma lift_congr_leftComm [Module.Free ℂ V] [Module.Finite ℂ V] + (G : Module.Dual ℂ V ⊗[ℂ] (JetRing ⊗[ℂ] V)) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) + ((TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V)) + (TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V G)) v + = dualTensorHom ℂ V (JetRing ⊗[ℂ] V) G v := by + induction G using TensorProduct.induction_on with + | zero => simp + | tmul phi z => + induction z using TensorProduct.induction_on with + | zero => simp + | tmul g w => + rw [TensorProduct.leftComm_tmul, TensorProduct.congr_tmul, + LinearEquiv.refl_apply] + show g ⊗ₜ[ℂ] (dualTensorHomEquiv ℂ V V (phi ⊗ₜ[ℂ] w)) v = _ + rw [show dualTensorHomEquiv ℂ V V (phi ⊗ₜ[ℂ] w) + = dualTensorHom ℂ V V (phi ⊗ₜ[ℂ] w) from rfl, + dualTensorHom_apply, dualTensorHom_apply, TensorProduct.tmul_smul] + | add z₁ z₂ h₁ h₂ => + rw [TensorProduct.tmul_add, map_add, map_add, map_add, LinearMap.add_apply, + map_add, LinearMap.add_apply, h₁, h₂] + | add G₁ G₂ h₁ h₂ => + rw [map_add, map_add, map_add, LinearMap.add_apply, map_add, + LinearMap.add_apply, h₁, h₂] + +/-- **The conjugate jet action.** Given a gauge action on the jets of a `V`-valued field, +this is the induced action on the jets of the *conjugate* field. + +It is `Representation.conj rep` — the same underlying maps, read on `ConjModule` — carried +across the identification + + `ConjModule (JetRing ⊗[ℂ] V) ≃ₗ[ℂ] JetRing ⊗[ℂ] ConjModule V` + +which is `ConjModule.tensorEquiv` (conjugation is monoidal) followed by +`JetRing.starConjEquiv` on the jet-ring factor (the real structure of the jet ring). On +pure tensors the composite is `f ⊗ₜ v ↦ star f ⊗ₜ v`, so `repConj` carries the conjugate +gauge matrix — the physicists' `ψ̄ ↦ ψ̄ U†`. + +Being a representation is free: `LinearEquiv.conjRingEquiv` is a ring equivalence of +endomorphism rings, hence multiplicative. -/ +noncomputable def repConj (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) : + Representation ℂ G (JetRing ⊗[ℂ] ConjModule V) where + toFun U := LinearEquiv.conjRingEquiv + ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (rep.conj U) + map_one' := by rw [map_one, map_one] + map_mul' U W := by rw [map_mul, map_mul] + + +/-- On pure tensors the conjugate jet action conjugates the jet factor: it is `rep` +evaluated at `star f ⊗ₜ v`, read back through the same identification. -/ +lemma repConj_apply_tmul (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (U : G) (f : JetRing) (v : V) : + repConj rep U (f ⊗ₜ[ℂ] conjEquiv (k := ℂ) (M := V) v) + = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U (star f ⊗ₜ[ℂ] v))) := rfl + +/-- **The identification conjugates the jet-ring action.** Carrying a `V`-valued jet over +to the conjugate side turns multiplication by `star χ` into multiplication by `χ`: the +`star` on the jet-ring factor is exactly what absorbs the conjugation. -/ +lemma tensorEquiv_congr_conjEquiv_smul (χ : JetRing) (y : JetRing ⊗[ℂ] V) : + ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (star χ • y)) + = χ • ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) y) := by + induction y using TensorProduct.induction_on with + | zero => simp + | tmul g w => + rw [TensorProduct.smul_tmul', smul_eq_mul] + simp only [LinearEquiv.trans_apply, ConjModule.tensorEquiv_symm_conjEquiv_tmul, + TensorProduct.congr_tmul, LinearEquiv.refl_apply, JetRing.starConjEquiv_apply, + LinearEquiv.symm_apply_apply, TensorProduct.smul_tmul', smul_eq_mul] + rw [star_mul', star_star, mul_comm] + | add a b ha hb => + rw [smul_add, map_add, map_add, ha, hb, map_add, map_add, smul_add] + +/-- **The conjugate jet action is fibrewise-linear whenever the original is.** This is +what lets the coefficient machinery of `coeff_mul_of_smul_comm` be instantiated at +`ConjModule V`, giving the conjugate half of the symbol action. -/ +lemma repConj_smul_comm + {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] ConjModule V) : + repConj rep U (χ • z) = χ • repConj rep U z := by + have key : ∀ w : JetRing ⊗[ℂ] V, + repConj rep U (((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)) + = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U w)) := by + intro w + show ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + ((rep.conj U) ((((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V))))).symm + (((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)))) = _ + rw [LinearEquiv.symm_apply_apply, Representation.conj_apply, + LinearEquiv.symm_apply_apply] + obtain ⟨y, rfl⟩ : ∃ y : JetRing ⊗[ℂ] V, + z = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) y) := + ⟨(conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V)).symm ((((ConjModule.tensorEquiv (k := ℂ) + (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ + (ConjModule V))))).symm z), by simp⟩ + rw [← tensorEquiv_congr_conjEquiv_smul, key, key, hlin, + tensorEquiv_congr_conjEquiv_smul] + +/-- **The coefficient is determined by its action on constants.** For finite-dimensional +`V` the canonical evaluation `JetRing ⊗ End V → (V →ₗ JetRing ⊗ V)` is injective. -/ +lemma lift_injective [Module.Free ℂ V] [Module.Finite ℂ V] + {x y : JetRing ⊗[ℂ] Module.End ℂ V} + (h : ∀ v : V, TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) x v = TensorProduct.lift ((LinearMap.llcomp ℂ V V + (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) y v) : x = y := by + obtain ⟨G, rfl⟩ := ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V))).surjective x + obtain ⟨G', rfl⟩ := ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V))).surjective y + refine congrArg _ ((dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).injective + (LinearMap.ext fun v => ?_)) + rw [show (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)) G + = dualTensorHom ℂ V (JetRing ⊗[ℂ] V) G from rfl, + show (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)) G' + = dualTensorHom ℂ V (JetRing ⊗[ℂ] V) G' from rfl, + ← lift_congr_leftComm, ← lift_congr_leftComm] + exact h v + +/-- **The coefficient of a fibrewise gauge action.** For finite-dimensional `V`, the +restriction of `rep U` to constant jets is an element of `JetRing ⊗ End V` — a matrix of +power series, obtained canonically from `dualTensorHomEquiv` rather than from a basis. -/ +noncomputable def jetCoeff [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) (U : G) : + JetRing ⊗[ℂ] Module.End ℂ V := + ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing V).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V V))) + ((dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).symm ((rep U).comp jetOfConstant)) + +/-- The coefficient reproduces `rep U` on constant jets. -/ +lemma jetCoeff_spec [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) (U : G) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (jetCoeff rep U) v = rep U (jetOfConstant v) := by + rw [jetCoeff, LinearEquiv.trans_apply, lift_congr_leftComm, + show dualTensorHom ℂ V (JetRing ⊗[ℂ] V) + ((dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).symm ((rep U).comp jetOfConstant)) + = (rep U).comp jetOfConstant from + (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).apply_symm_apply _] + rfl + +/-- **The action of a coefficient on the symbols.** A coefficient `g ⊗ T` acts by +`jetRingAction g` on the derivative label — the Leibniz convolution redistributing +derivatives between the gauge transformation and the field — and by the transpose `Tᵀ` on +the target index. -/ +noncomputable def symbolAction : + (JetRing ⊗[ℂ] Module.End ℂ V) →ₗ[ℂ] + Module.End ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) := + TensorProduct.lift + { toFun := fun g => + { toFun := fun T => TensorProduct.map (DerivAlgebraComplex.jetRingAction g) + (Module.Dual.transpose T) + map_add' := fun T₁ T₂ => by rw [map_add, TensorProduct.map_add_right] + map_smul' := fun c T => by + rw [map_smul, TensorProduct.map_smul_right, RingHom.id_apply] } + map_add' := fun g₁ g₂ => by + refine LinearMap.ext fun T => ?_ + show TensorProduct.map (DerivAlgebraComplex.jetRingAction (g₁ + g₂)) _ = _ + rw [DerivAlgebraComplex.jetRingAction_add, TensorProduct.map_add_left] + rfl + map_smul' := fun c g => by + refine LinearMap.ext fun T => ?_ + show TensorProduct.map (DerivAlgebraComplex.jetRingAction (c • g)) _ = _ + rw [show DerivAlgebraComplex.jetRingAction (c • g) + = c • DerivAlgebraComplex.jetRingAction g from by + rw [Algebra.smul_def, MvPowerSeries.algebraMap_apply, + DerivAlgebraComplex.jetRingAction_mul, DerivAlgebraComplex.jetRingAction_C, + LinearMap.smul_comp, LinearMap.id_comp, Algebra.algebraMap_self_apply], + TensorProduct.map_smul_left] + rfl } + +@[simp] +lemma symbolAction_tmul (g : JetRing) (T : Module.End ℂ V) : + symbolAction (g ⊗ₜ[ℂ] T) + = TensorProduct.map (DerivAlgebraComplex.jetRingAction g) (Module.Dual.transpose T) := + rfl + +/-- **A coefficient acts on the undifferentiated symbol through its value at the base +point.** On `1 ⊗ φ` — the symbol `ψ_φ` carrying no derivatives — only the constant term of +the power-series coefficient survives, so the result is again undifferentiated and the +target index is acted on by the transpose of the base-point value. -/ +lemma symbolAction_one_tmul (c : JetRing ⊗[ℂ] Module.End ℂ V) (φ : Module.Dual ℂ V) : + symbolAction c ((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) + = (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] + Module.Dual.transpose (jetEval ∘ₗ TensorProduct.lift + ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) c) φ := by + induction c using TensorProduct.induction_on with + | zero => simp + | add c₁ c₂ h₁ h₂ => + rw [map_add, LinearMap.add_apply, h₁, h₂, map_add, LinearMap.comp_add, map_add, + LinearMap.add_apply, TensorProduct.tmul_add] + | tmul g T => + rw [symbolAction_tmul, TensorProduct.map_tmul, + DerivAlgebraComplex.jetRingAction_apply_one, TensorProduct.smul_tmul] + congr 1 + refine LinearMap.ext fun v => ?_ + simp [Module.Dual.transpose] + +/-- **The gauge action on the symbols.** Given a fibrewise gauge action on the jets of a +`V`-valued field, this is the induced (contragredient) action on the derivative symbols +`∂_s ψ_α`, which span `DerivAlgebraComplex ⊗ Module.Dual ℂ V`. + +Multiplicativity is bookkeeping: `coeff_mul_of_smul_comm` makes the coefficient +multiplicative, `symbolAction_mul` makes its action an anti-homomorphism, and the inverse +flips that back. -/ +noncomputable def repDual [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ G (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) where + toFun U := symbolAction (jetCoeff rep U⁻¹) + map_one' := by + have h1 : jetCoeff rep (1 : G)⁻¹ = 1 := by + refine lift_injective fun v => ?_ + rw [jetCoeff_spec rep] + show rep (1 : G)⁻¹ ((1 : JetRing) ⊗ₜ[ℂ] v) = (1 : JetRing) ⊗ₜ[ℂ] v + rw [inv_one, map_one] + rfl + rw [h1, Algebra.TensorProduct.one_def, symbolAction_tmul, + DerivAlgebraComplex.jetRingAction_one, + show Module.Dual.transpose (1 : Module.End ℂ V) = LinearMap.id from rfl, + TensorProduct.map_id] + rfl + map_mul' U W := by + have hmul : jetCoeff rep (U * W)⁻¹ = jetCoeff rep W⁻¹ * jetCoeff rep U⁻¹ := by + refine lift_injective fun v => ?_ + rw [jetCoeff_spec, + coeff_mul_of_smul_comm hlin (fun A => jetCoeff rep A) (jetCoeff_spec rep) W⁻¹ U⁻¹ v, + _root_.mul_inv_rev] + rw [hmul, symbolAction_mul symbolAction (fun g T => rfl)] + rfl + +/-- **The undifferentiated symbol transforms by the value of the gauge transformation at +the base point.** No derivative of the gauge jet contributes: the symbol `ψ_φ` is acted on +by the contragredient of `rep U⁻¹` restricted to constant jets and evaluated at the base +point. -/ +lemma repDual_one_tmul [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (φ : Module.Dual ℂ V) : + repDual rep hlin U ((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) + = (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] + Module.Dual.transpose (jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant) φ := by + have h : jetEval ∘ₗ TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (jetCoeff rep U⁻¹) + = jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant := + LinearMap.ext fun v => congrArg jetEval (jetCoeff_spec rep U⁻¹ v) + rw [show repDual rep hlin U = symbolAction (jetCoeff rep U⁻¹) from rfl, + symbolAction_one_tmul, h] + + +/-- **The gauge action on the jet component space.** Given a fibrewise gauge action on the +jets of a `V`-valued field, this is the induced action on the full space of component +functions — the symbols `∂_s ψ_α` together with their conjugates `∂_s ψ̄_α`. + +The unconjugated half is `repDual rep`, the contragredient action on the symbols. The +conjugate half is the *same* construction applied to `repConj rep`, the action on the jets +of the conjugate field; `repConj_smul_comm` supplies the fibrewise-linearity it needs. The +conjugate half therefore carries `star` of the gauge matrix, which is the physicists' +`ψ̄ ↦ ψ̄ U†`. -/ +noncomputable def repJet [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + Representation ℂ G (JetComponentSpace V) := + (repDual rep hlin).prod (repDual (repConj rep) (repConj_smul_comm hlin)) + +@[simp] +lemma repJet_fst [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (x : JetComponentSpace V) : + (repJet rep hlin U x).1 = repDual rep hlin U x.1 := rfl + +@[simp] +lemma repJet_snd [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : G) (x : JetComponentSpace V) : + (repJet rep hlin U x).2 + = repDual (repConj rep) (repConj_smul_comm hlin) U x.2 := rfl + +end JetComponentSpace diff --git a/Physlib/Mathematics/MultisetAntidiagonal.lean b/Physlib/Mathematics/MultisetAntidiagonal.lean new file mode 100644 index 000000000..595d70700 --- /dev/null +++ b/Physlib/Mathematics/MultisetAntidiagonal.lean @@ -0,0 +1,154 @@ +/- +Copyright (c) 2026 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 Mathlib.Algebra.BigOperators.Group.Multiset.Basic +public import Mathlib.Data.Multiset.Antidiagonal +public import Mathlib.LinearAlgebra.TensorProduct.Basic +/-! +# Sums over the antidiagonal of a multiset + +Combinatorial identities for sums indexed by `Multiset.antidiagonal`: associativity and +exchange of nested antidiagonal sums, collapsing a sum whose terms vanish off one slot, and +the interaction with linear maps and tensor products. These are the bookkeeping behind the +all-orders Leibniz rules of the jet calculus. +-/ + +@[expose] public section + +namespace Multiset + +/-- Coassociativity of antidiagonal sums: summing over `s = u + v` and then `u = x + y` + is summing over `s = x + t` and then `t = y + v`. -/ +lemma sum_antidiagonal_assoc {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => h q.1 q.2 p.2).sum).sum = + (s.antidiagonal.map fun p => + (p.2.antidiagonal.map fun q => h p.1 q.1 q.2).sum).sum := by + induction s using Multiset.induction_on generalizing h with + | empty => simp + | cons κ s ih => + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq, + Multiset.sum_map_add] + rw [ih (fun x y v => h x y (κ ::ₘ v)), ih (fun x y v => h x (κ ::ₘ y) v), + ih (fun x y v => h (κ ::ₘ x) y v)] + abel + +/-- The exchange law of doubly-split antidiagonal sums: splitting `s = u + v` and then + `u = x + y`, `v = z + w` is, with the middle parts exchanged, splitting `s = u' + v'` + and then `u' = x + z`, `v' = y + w`. -/ +lemma sum_antidiagonal_exchange {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => h q.1 q.2 r.1 r.2).sum).sum).sum = + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => + (p.2.antidiagonal.map fun r => h q.1 r.1 q.2 r.2).sum).sum).sum := by + induction s using Multiset.induction_on generalizing h with + | empty => simp + | cons κ s ih => + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq, + Multiset.sum_map_add] + rw [ih (fun x y z w => h x y z (κ ::ₘ w)), ih (fun x y z w => h x y (κ ::ₘ z) w), + ih (fun x y z w => h x (κ ::ₘ y) z w), ih (fun x y z w => h (κ ::ₘ x) y z w)] + abel + +/-- A multiset sum of linear maps, applied: the sum of the applications. -/ +lemma sum_linearMap_apply {R M N : Type*} [Semiring R] [AddCommMonoid M] + [AddCommMonoid N] [Module R M] [Module R N] (S : Multiset (M →ₗ[R] N)) (x : M) : + S.sum x = (S.map fun f => f x).sum := by + induction S using Multiset.induction_on with + | empty => simp + | cons f S ih => simp [ih] + +/-- A pure tensor against a multiset sum distributes over the sum. -/ +lemma tmul_sum {R M N : Type*} [CommSemiring R] [AddCommMonoid M] + [AddCommMonoid N] [Module R M] [Module R N] (m : M) (S : Multiset N) : + m ⊗ₜ[R] S.sum = (S.map fun n => m ⊗ₜ[R] n).sum := by + induction S using Multiset.induction_on with + | empty => simp + | cons n S ih => simp [TensorProduct.tmul_add, ih] + +/-- Antidiagonal sums are symmetric under swapping the two parts. -/ +lemma sum_antidiagonal_swap {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => h p.1 p.2).sum = + (s.antidiagonal.map fun p => h p.2 p.1).sum := by + induction s using Multiset.induction_on generalizing h with + | empty => simp + | cons κ s ih => + simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] + rw [ih (fun a b => h a (κ ::ₘ b)), ih (fun a b => h (κ ::ₘ a) b)] + abel + +/-- A multiset sum of negations is the negation of the sum. -/ +lemma sum_map_neg'' {ι M : Type*} [AddCommGroup M] + (s : Multiset ι) (f : ι → M) : + (s.map fun i => -f i).sum = -(s.map f).sum := by + induction s using Multiset.induction_on with + | empty => simp + | cons i s ih => + simp only [Multiset.map_cons, Multiset.sum_cons, ih] + abel + +/-- The exchange of a finite sum with a multiset sum. -/ +lemma sum_map_finsetSum {α β M : Type*} [AddCommMonoid M] + (m : Multiset α) (t : Finset β) (f : β → α → M) : + (m.map fun a => ∑ b ∈ t, f b a).sum = ∑ b ∈ t, (m.map (f b)).sum := by + induction m using Multiset.induction_on with + | empty => simp + | cons a s ih => + rw [Multiset.map_cons, Multiset.sum_cons, ih, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun b _ => by rw [Multiset.map_cons, Multiset.sum_cons] + +/-- A sum over the antidiagonal of a family vanishing off `p.1 = 0` collapses to the + single term at `(0, s)`. -/ +lemma sum_antidiagonal_eq_of_fst_ne_zero {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (F : Multiset ι × Multiset ι → M) + (hF : ∀ p : Multiset ι × Multiset ι, p.1 ≠ 0 → F p = 0) : + (s.antidiagonal.map F).sum = F (0, s) := by + induction s using Multiset.induction_on generalizing F with + | empty => simp [Multiset.antidiagonal_zero] + | cons a t ih => + rw [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, Multiset.map_map, + Multiset.map_map, + show ((t.antidiagonal.map (F ∘ Prod.map (Multiset.cons a) id)).sum) = 0 from + Multiset.sum_eq_zero fun x hx => by + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hx + exact hF _ (Multiset.cons_ne_zero), + add_zero, ih (F ∘ Prod.map id (Multiset.cons a)) fun p hp => hF _ hp] + rfl + +/-- A sum over the antidiagonal of a family vanishing off `p.2 = 0` collapses to the + single term at `(s, 0)`. -/ +lemma sum_antidiagonal_eq_of_snd_ne_zero {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (F : Multiset ι × Multiset ι → M) + (hF : ∀ p : Multiset ι × Multiset ι, p.2 ≠ 0 → F p = 0) : + (s.antidiagonal.map F).sum = F (s, 0) := by + rw [show (s.antidiagonal.map F).sum + = (s.antidiagonal.map fun p => (fun a b => F (b, a)) p.2 p.1).sum from rfl, + ← Multiset.sum_antidiagonal_swap s (fun a b => F (b, a))] + exact Multiset.sum_antidiagonal_eq_of_fst_ne_zero s (fun p => F (p.2, p.1)) + fun p hp => hF _ hp + +/-- The exchange of the second and third slot in a nested antidiagonal sum. -/ +lemma sum_antidiagonal_middle_exchange {ι M : Type*} [AddCommMonoid M] + (s : Multiset ι) (h : Multiset ι → Multiset ι → Multiset ι → M) : + (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => h q.1 q.2 p.2).sum).sum + = (s.antidiagonal.map fun p => + (p.1.antidiagonal.map fun q => h q.1 p.2 q.2).sum).sum := by + rw [Multiset.sum_antidiagonal_assoc s h, + Multiset.sum_antidiagonal_assoc s (fun a b c => h a c b)] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + exact Multiset.sum_antidiagonal_swap p.2 (fun a b => h p.1 a b) + +end Multiset diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index a71cf57d5..79f5bee17 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Prod public import Mathlib.LinearAlgebra.CliffordAlgebra.Prod public import Mathlib.LinearAlgebra.TensorProduct.Prod /-! @@ -46,12 +47,6 @@ which is `CliffordAlgebra.prodEquiv` specialized to the zero quadratic form. open scoped TensorProduct -/-- Transport of an exterior algebra along a linear equivalence of the underlying module. -/ -noncomputable def ExteriorAlgebra.congr {R A B : Type*} [CommRing R] [AddCommGroup A] - [Module R A] [AddCommGroup B] [Module R B] (e : A ≃ₗ[R] B) : - ExteriorAlgebra R A ≃ₐ[R] ExteriorAlgebra R B := - CliffordAlgebra.equivOfIsometry ⟨e, fun _ => rfl⟩ - namespace StandardModel variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ℂ W] diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index 140ae315c..cf251ff09 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.LinearAlgebra.Dimension.Free @@ -66,16 +67,6 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- The constant-coefficient evaluation of a jet, as a `ℂ`-linear map. -/ -noncomputable def _root_.JetRing.constantCoeffₗ : JetRing →ₗ[ℂ] ℂ where - toFun := constantCoeff - map_add' f g := by simp - map_smul' c f := by simp [smul_eq_C_mul] - -@[simp] -lemma _root_.JetRing.constantCoeffₗ_apply (f : JetRing) : - JetRing.constantCoeffₗ f = constantCoeff f := rfl - /-- The inclusion of constants into `V`-valued jets: `v ↦ 1 ⊗ v`. -/ noncomputable def jetOfConstant : V →ₗ[ℂ] JetRing ⊗[ℂ] V := TensorProduct.mk ℂ JetRing V 1 diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index f43ca120b..12d69bbcc 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -12,7 +12,6 @@ public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basis public import Mathlib.Algebra.TrivSqZeroExt.Basic public import Mathlib.Data.Finsupp.Multiset public import Mathlib.Data.Finsupp.Weight -public import Physlib.Particles.StandardModel.Basic public import Mathlib.RingTheory.MvPowerSeries.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic @@ -651,4 +650,73 @@ lemma gradeScale_repLorentzGroup (t : ℝ) (Λ : SL(2,ℂ)) (a : DerivAlgebraRea simp exact DFunLike.congr_fun h a +/-! + +## The multiset basis of `DerivAlgebraReal` + +-/ + +open Module + +/-- The basis of the symmetric algebra of dual real jet slots, indexed by multisets of + spacetime indices. -/ +noncomputable def basisMultiset : + Basis (Multiset (Fin 1 ⊕ Fin 3)) ℝ (SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)) := + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra.reindex Multiset.toFinsupp.toEquiv.symm + +/-- The multiset basis of the dual derivative symbols, as a basis vector of the + symmetric algebra at the corresponding multi-index. -/ +lemma basisMultiset_apply (s : Multiset (Fin 1 ⊕ Fin 3)) : + basisMultiset s = + Lorentz.CoVector.basis.dualBasis.symmetricAlgebra (Multiset.toFinsupp s) := by + rw [basisMultiset, Basis.reindex_apply, Equiv.symm_symm] + rfl + +/-- The multiset basis vectors of the real dual derivative slots multiply by adding the + multisets. -/ +lemma basisMultiset_mul (s t : Multiset (Fin 1 ⊕ Fin 3)) : + basisMultiset s * basisMultiset t = + basisMultiset (s + t) := by + rw [basisMultiset_apply, basisMultiset_apply, + basisMultiset_apply, map_add] + simp only [Basis.symmetricAlgebra, Basis.map_apply, + show ∀ p, (SymmetricAlgebra.equivMvPolynomial + Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv p = + (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm p + from fun _ => rfl, + ← map_mul, MvPolynomial.coe_basisMonomials] + simp only [MvPolynomial.monomial_mul, mul_one] + +/-- The multiset basis of the real dual derivative slots at the empty multiset is the + unit. -/ +lemma basisMultiset_nil : + basisMultiset (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 := by + rw [basisMultiset_apply, + show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 by simp, + Basis.symmetricAlgebra, Basis.map_apply, + show (SymmetricAlgebra.equivMvPolynomial + Lorentz.CoVector.basis.dualBasis).symm.toLinearEquiv + ((MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) 0) = + (SymmetricAlgebra.equivMvPolynomial Lorentz.CoVector.basis.dualBasis).symm + ((MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) 0) from rfl, + show (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (0 : (Fin 1 ⊕ Fin 3) →₀ ℕ) + = 1 from by + rw [MvPolynomial.coe_basisMonomials] + show MvPolynomial.monomial 0 1 = 1 + rw [MvPolynomial.monomial_zero', MvPolynomial.C_1], + map_one] + +/-- The multiset basis of the real dual derivative slots at a singleton index. -/ +lemma basisMultiset_singleton (μ : Fin 1 ⊕ Fin 3) : + basisMultiset ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + (Lorentz.CoVector.basis.dualBasis μ) := by + have h : (MvPolynomial.basisMonomials (Fin 1 ⊕ Fin 3) ℝ) (Finsupp.single μ 1) = + MvPolynomial.X μ := rfl + rw [basisMultiset, Basis.reindex_apply, Equiv.symm_symm, + show Multiset.toFinsupp.toEquiv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = + Finsupp.single μ 1 by simp, + Basis.symmetricAlgebra, Basis.map_apply, h] + simp + end DerivAlgebraReal From ae28a5762291144be0585f69f69b8ba19ce929e8 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 05:27:20 +0100 Subject: [PATCH 247/254] feat: Fill out more group relations --- Physlib.lean | 1 + .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 4 + .../Invariants/IsSU2BiFundamental.lean | 403 +++-- .../Invariants/IsSU2QuadFundamental.lean | 657 ++++---- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 651 +++++++- .../Invariants/IsSU3BiFundamental.lean | 4 - .../Invariants/IsSU3FunAntiFun.lean | 698 +++++++++ .../StandardModel/IsStandardModel/Basic.lean | 1379 ++++++++++++++++- .../IsStandardModel/CovStandardModel.lean | 117 +- 9 files changed, 3385 insertions(+), 529 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean diff --git a/Physlib.lean b/Physlib.lean index 508038e7d..4494de221 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -229,6 +229,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFunda public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2QuadFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiFundamental +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsU1BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean index 7f184ad62..ff7246f18 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -638,6 +638,10 @@ lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : end Decomposition +TODO (lines := 638-639) "Fill in the rest of this file, using + IsSU3BiAdjoint.lean as a template. We should finish with a similar result + at the end." + end IsSU2BiAdjoint end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean index dc9083525..31edb47e5 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean @@ -26,12 +26,21 @@ from two fundamental indices is not a trace: a doublet index has nowhere to be contracted against another doublet index except through the antisymmetric symbol `ε`, whose invariance is the statement that the determinant of an `SU(2)` matrix is one. -Section A gives the proposition and the span of its components, section B the epsilon -contraction, which is the natural gauge invariant built from two fundamental indices, -and section C the gauge weight decomposition of the span. Section D grades the zero-weight -piece of that decomposition by the Weyl element of the `SU(2)` factor, which the gauge -weight alone cannot split, and the two gradings together leave the epsilon contraction -spanning the gauge invariants. +The law itself is `IsSU2BiFundamentalMat`, which relates one element of `SU(2)` to one +linear map on `B` and mentions no other factor of the gauge group, and +`IsSU2BiFundamental` says only that every element of the gauge group obeys that law +through its `SU(2)` part. Everything the file proves about how the components move is +proved at the level of `IsSU2BiFundamentalMat` and instantiated afterwards, so the +mathematics here is `SU(2)` mathematics. What stays about `GaugeGroupI` is the +bookkeeping of the two decompositions: `GaugeWeightDecomposition` and +`SU2PermDecomposition` are supplied only for representations of the gauge group. + +Section A gives the transformation law, the proposition and the span of its components, +section B the epsilon contraction, which is the natural gauge invariant built from two +fundamental indices, and section C the gauge weight decomposition of the span. Section D +grades the zero-weight piece of that decomposition by the Weyl element of the `SU(2)` +factor, which the gauge weight alone cannot split, and the two gradings together leave the +epsilon contraction spanning the gauge invariants. -/ @[expose] public section @@ -44,52 +53,56 @@ open Matrix ## A. Bi-fundamental `su(2)` families and the span of their components -The transformation law carries one factor of the fundamental matrix `GaugeGroupI.toSU2 g` -per index, with the summed index in the row slot, exactly as `IsSU2BiAdjoint` carries one -factor of `GaugeAlgebra.adjointMatrix g` per index. Since `toSU2` is a monoid -homomorphism this is an action. It is the `SU(2)` factor alone, and is the law obeyed by -the conjugate Higgs doublet symbols of `IsHiggsSector` once their hypercharge character -is set aside, the Higgs symbols themselves obeying the complex conjugate law. - -The element `g` still ranges over the whole of `GaugeGroupI`, and that is what makes the -proposition say more than a statement about `SU(2)` would. The right-hand side sees only -`GaugeGroupI.toSU2 g`, so taking `g` in the colour or hypercharge factor forces that -factor to fix every component. Section C reads that off as the vanishing of the colour and -hypercharge coordinates of every weight, and `GaugeWeightDecomposition` is stated for -representations of `GaugeGroupI`, which a bare `SU(2)` representation cannot supply. What -is genuinely about `SU(2)` alone is the invariance of the antisymmetric symbol in section -B, and that is stated for an arbitrary element of `specialUnitaryGroup (Fin 2) ℂ`. +The transformation law carries one factor of the fundamental matrix per index, with the +summed index in the row slot, exactly as `IsSU2BiAdjoint` carries one factor of +`su2AdjointMatrix` per index. It is recorded by `IsSU2BiFundamentalMat`, a relation +between one element of `SU(2)` and one linear map on `B`, in which no other factor of the +gauge group appears. It is the law obeyed by the conjugate Higgs doublet symbols of +`IsHiggsSector` once their hypercharge character is set aside, the Higgs symbols +themselves obeying the complex conjugate law. + +`IsSU2BiFundamental` then says that every gauge transformation obeys that law through its +`SU(2)` part. Since `GaugeGroupI.toSU2` is a monoid homomorphism this is an action. +Quantifying over the whole of `GaugeGroupI` is what makes the proposition say more than a +statement about a single `SU(2)` element would: an element of the colour or hypercharge +factor is sent to `1` in `SU(2)`, so those factors fix every component, and section C +reads that off as the vanishing of the colour and hypercharge coordinates of every weight. -/ +/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` + moves a tensor with two fundamental indices: one factor of `U` per index, with the + summed index in the row slot. -/ +def IsSU2BiFundamentalMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 2) ℂ) (f : B →ₗ[ℂ] B) + (T : (Fin 2 → Fin 2) → B) : Prop := + ∀ l : Fin 2 → Fin 2, + f (T l) = ∑ a : Fin 2 → Fin 2, (∏ i : Fin 2, U.1 (a i) (l i)) • T a + /-- A family `T` of elements of `B`, indexed by two `su(2)` fundamental indices, transforms as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge - group. -/ + group: every gauge transformation moves the components by its `SU(2)` part alone. -/ structure IsSU2BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 2) → B) : Prop where - repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 2), - repGauge g (T l) = ∑ a : Fin 2 → Fin 2, - (∏ i : Fin 2, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a - -TODO (lines := 71-74) "I think we could make this whole file - about just the action of the SU(2) factor." + repGauge_T : ∀ g : GaugeGroupI, + IsSU2BiFundamentalMat (GaugeGroupI.toSU2 g) (repGauge g) T namespace IsSU2BiFundamental set_option linter.unusedVariables false variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} - {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiFundamental B repGauge T) + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} -/-- The span of all the components. -/ -def span (hT : IsSU2BiFundamental B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d +/-- The span of all the components of a family indexed by two `su(2)` fundamental + indices. -/ +def span (T : (Fin 2 → Fin 2) → B) : Submodule ℂ B := ⨆ d, ℂ ∙ T d /-- An element of `B` lies in the span of the components of `T` precisely when it is a linear combination of them. -/ -lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 2) → ℂ), x = ∑ d, c d • T d := by +lemma mem_span_iff {T : (Fin 2 → Fin 2) → B} (x : B) : + x ∈ span T ↔ ∃ (c : (Fin 2 → Fin 2) → ℂ), x = ∑ d, c d • T d := by constructor · intro hx rw [span] at hx @@ -107,6 +120,10 @@ lemma mem_span_iff (x : B) : exact sum_mem fun d _ => Submodule.smul_mem _ _ (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) +/-- Every component lies in the span. -/ +lemma mem_span {T : (Fin 2 → Fin 2) → B} (d : Fin 2 → Fin 2) : T d ∈ span T := + Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) + /-! ## B. The epsilon contraction @@ -118,6 +135,11 @@ multi-index against the identity, which is what `euclidLeviCivita` is in four di and what `epsilon` is here in two. Its invariance is the statement that the determinant of an `SU(2)` matrix is one, and that is what makes the contraction gauge invariant. +The whole section is about `SU(2)`. The contraction is built from the family alone, and +its invariance is proved for an arbitrary element of `specialUnitaryGroup (Fin 2) ℂ` +acting through an arbitrary linear map; gauge invariance is that statement read at +`GaugeGroupI.toSU2 g`. + -/ /-- A sum over families of two `su(2)` fundamental indices is a double sum. -/ @@ -154,8 +176,7 @@ def epsilon (a b : Fin 2) : ℂ := simp [epsilon, KroneckerDelta.generalizedKroneckerDelta, Matrix.det_fin_two] /-- The antisymmetric symbol is invariant under the fundamental representation of an - element of `SU(2)`, because the determinant of an `SU(2)` matrix is one. This is the - whole `SU(2)` content of the section, and needs no mention of the gauge group. -/ + element of `SU(2)`, because the determinant of an `SU(2)` matrix is one. -/ lemma sum_epsilon_mul (U : specialUnitaryGroup (Fin 2) ℂ) (b c : Fin 2) : ∑ x : Fin 2, ∑ y : Fin 2, epsilon x y * (U.1 b x * U.1 c y) = epsilon b c := by have hdet : U.1 0 0 * U.1 1 1 - U.1 0 1 * U.1 1 0 = 1 := by @@ -169,38 +190,37 @@ lemma sum_epsilon_mul (U : specialUnitaryGroup (Fin 2) ℂ) (b c : Fin 2) : · linear_combination -hdet · ring -/-- The epsilon contraction of a bi-fundamental family: the antisymmetric contraction of - the two `su(2)` fundamental indices. -/ -def epsilonContraction (hT : IsSU2BiFundamental B repGauge T) : B := - T ![0, 1] - T ![1, 0] +/-- The epsilon contraction of a family indexed by two `su(2)` fundamental indices: the + antisymmetric contraction of the two indices. -/ +def epsilonContraction (T : (Fin 2 → Fin 2) → B) : B := T ![0, 1] - T ![1, 0] /-- The epsilon contraction written as a sum over all pairs of fundamental indices weighted by the antisymmetric symbol. -/ -lemma epsilonContraction_eq_sum (hT : IsSU2BiFundamental B repGauge T) : - hT.epsilonContraction = ∑ d : Fin 2 → Fin 2, epsilon (d 0) (d 1) • T d := by +lemma epsilonContraction_eq_sum (T : (Fin 2 → Fin 2) → B) : + epsilonContraction T = ∑ d : Fin 2 → Fin 2, epsilon (d 0) (d 1) • T d := by rw [sum_pi_two] simp [epsilonContraction, Fin.sum_univ_two, sub_eq_add_neg] /-- The epsilon contraction lies in the span of the components. -/ -lemma epsilonContraction_mem_span (hT : IsSU2BiFundamental B repGauge T) : - hT.epsilonContraction ∈ hT.span := by +lemma epsilonContraction_mem_span (T : (Fin 2 → Fin 2) → B) : + epsilonContraction T ∈ span T := by rw [epsilonContraction] - exact sub_mem (Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _)) - (Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _)) - -/-- The epsilon contraction of a bi-fundamental family is gauge invariant. -/ -lemma repGauge_epsilonContraction (hT : IsSU2BiFundamental B repGauge T) - (g : GaugeGroupI) : - repGauge g hT.epsilonContraction = hT.epsilonContraction := by - have step : repGauge g hT.epsilonContraction + exact sub_mem (mem_span _) (mem_span _) + +/-- The epsilon contraction is fixed by any linear map moving the components by an + element of `SU(2)`, the antisymmetric symbol being invariant. This is the whole content + of the section, and it mentions no factor of the gauge group. -/ +lemma map_epsilonContraction {T : (Fin 2 → Fin 2) → B} + (hf : IsSU2BiFundamentalMat U f T) : + f (epsilonContraction T) = epsilonContraction T := by + have step : f (epsilonContraction T) = ∑ b : Fin 2 → Fin 2, epsilon (b 0) (b 1) • T b := by - rw [hT.epsilonContraction_eq_sum, map_sum] - have h1 : ∀ d : Fin 2 → Fin 2, repGauge g (epsilon (d 0) (d 1) • T d) + rw [epsilonContraction_eq_sum, map_sum] + have h1 : ∀ d : Fin 2 → Fin 2, f (epsilon (d 0) (d 1) • T d) = ∑ b : Fin 2 → Fin 2, - (epsilon (d 0) (d 1) * ((GaugeGroupI.toSU2 g).1 (b 0) (d 0) * - (GaugeGroupI.toSU2 g).1 (b 1) (d 1))) • T b := by + (epsilon (d 0) (d 1) * (U.1 (b 0) (d 0) * U.1 (b 1) (d 1))) • T b := by intro d - rw [map_smul, hT.repGauge_T g d, Finset.smul_sum] + rw [map_smul, hf d, Finset.smul_sum] refine Finset.sum_congr rfl fun b _ => ?_ rw [smul_smul, Fin.prod_univ_two] simp only [h1] @@ -210,10 +230,16 @@ lemma repGauge_epsilonContraction (hT : IsSU2BiFundamental B repGauge T) congr 1 rw [sum_pi_two] simp only [Matrix.cons_val_zero, Matrix.cons_val_one] - exact sum_epsilon_mul (GaugeGroupI.toSU2 g) (b 0) (b 1) - rw [step, ← hT.epsilonContraction_eq_sum] + exact sum_epsilon_mul U (b 0) (b 1) + rw [step, ← epsilonContraction_eq_sum] -end IsSU2BiFundamental +/-- The epsilon contraction of a bi-fundamental family is gauge invariant: a gauge + transformation moves the components by its `SU(2)` part, which fixes the + contraction. -/ +lemma repGauge_epsilonContraction {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (g : GaugeGroupI) : + repGauge g (epsilonContraction T) = epsilonContraction T := + map_epsilonContraction (hT.repGauge_T g) /-! @@ -226,22 +252,45 @@ normalization `2T₃`. A component `T d` therefore carries the definite weight ` the sum of the weights of its two indices, and the span of the components is already the join of four weight lines. +The `SU(2)` content of the section is `map_of_diagonal`: a family moved by a diagonal +`SU(2)` matrix has every component an eigenvector, at the product of the diagonal entries +at its two indices. The torus generators enter only through `toSU2_gaugeTorusGen_apply`, +which says that their `SU(2)` parts are diagonal with the characters of `fundWeight` on +the diagonal. The decomposition itself is where the gauge group is unavoidable: +`GaugeWeightDecomposition` is defined for a representation of `GaugeGroupI`, and it is +what records that the colour and hypercharge coordinates of every weight vanish. + The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra and records multiplicativity of the representation, neither of which `IsSU2BiFundamental` needs, so both appear as extra arguments here. -/ -namespace IsSU2BiFundamental - -set_option linter.unusedVariables false - /-! -## C.1. The gauge torus in the fundamental representation +## C.1. Diagonal matrices and the gauge torus -/ +/-- A family moved by a diagonal `SU(2)` matrix has every component an eigenvector, at the + product of the diagonal entries at its two indices. -/ +lemma map_of_diagonal {T : (Fin 2 → Fin 2) → B} (hf : IsSU2BiFundamentalMat U f T) + (hU : ∀ a b : Fin 2, a ≠ b → U.1 a b = 0) (l : Fin 2 → Fin 2) : + f (T l) = (U.1 (l 0) (l 0) * U.1 (l 1) (l 1)) • T l := by + rw [hf l, Finset.sum_eq_single l] + · rw [Fin.prod_univ_two] + · intro a _ hal + have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by + by_contra hc + simp only [not_or, ne_eq, not_not] at hc + exact hal (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) + rw [Fin.prod_univ_two] + rcases h with h | h + · rw [hU _ _ h, zero_mul, zero_smul] + · rw [hU _ _ h, mul_zero, zero_smul] + · intro hl + exact absurd (Finset.mem_univ l) hl + /-- The gauge weight carried by one `su(2)` fundamental index: weak isospin only, with the two components of a doublet carrying `2T₃ = ±1`. -/ def fundWeight (s : Fin 2) : GaugeWeight := (0, 0, isoWeight s, 0) @@ -255,6 +304,11 @@ lemma toSU2_gaugeTorusGen_apply (i : Fin 4) (a b : Fin 2) : simp [gaugeTorusGen, GaugeGroupI.toSU2, su2ExpI_coe, fundWeight, isoWeight, expI_inv_eq_star] +/-- The `SU(2)` part of a torus generator has vanishing off-diagonal entries. -/ +lemma toSU2_gaugeTorusGen_offDiag (i : Fin 4) (a b : Fin 2) (hab : a ≠ b) : + (GaugeGroupI.toSU2 (gaugeTorusGen i)).1 a b = 0 := by + rw [toSU2_gaugeTorusGen_apply, if_neg hab] + /-- The gauge weight carried by a component of a bi-fundamental family: the sum of the weights of its two indices. -/ def wtWeight (l : Fin 2 → Fin 2) : GaugeWeight := fundWeight (l 0) + fundWeight (l 1) @@ -265,36 +319,17 @@ def wtWeight (l : Fin 2 → Fin 2) : GaugeWeight := fundWeight (l 0) + fundWeigh -/ -section Weights - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} - {T : (Fin 2 → Fin 2) → B} - /-- Every component of a bi-fundamental family is a simultaneous eigenvector of the gauge torus, at the character of the sum of the weights of its two indices. -/ -lemma repGauge_gaugeTorusGen (hT : IsSU2BiFundamental B repGauge T) (l : Fin 2 → Fin 2) - (i : Fin 4) : +lemma repGauge_gaugeTorusGen {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (l : Fin 2 → Fin 2) (i : Fin 4) : repGauge (gaugeTorusGen i) (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by - rw [hT.repGauge_T (gaugeTorusGen i) l, Finset.sum_eq_single l] - · congr 1 - rw [Fin.prod_univ_two, toSU2_gaugeTorusGen_apply, toSU2_gaugeTorusGen_apply, - if_pos rfl, if_pos rfl, wtWeight, GaugeWeight.coord_add, - zpow_add₀ expI_ne_zero] - · intro a _ hal - have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by - by_contra hc - simp only [not_or, ne_eq, not_not] at hc - exact hal (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) - rw [Fin.prod_univ_two, toSU2_gaugeTorusGen_apply, toSU2_gaugeTorusGen_apply] - rcases h with h | h - · rw [if_neg h, zero_mul, zero_smul] - · rw [if_neg h, mul_zero, zero_smul] - · intro hl - exact absurd (Finset.mem_univ l) hl - -end Weights + rw [map_of_diagonal (hT.repGauge_T (gaugeTorusGen i)) + (toSU2_gaugeTorusGen_offDiag i) l] + congr 1 + rw [toSU2_gaugeTorusGen_apply, toSU2_gaugeTorusGen_apply, if_pos rfl, if_pos rfl, + wtWeight, GaugeWeight.coord_add, zpow_add₀ expI_ne_zero] /-! @@ -308,20 +343,20 @@ variable {B : Type*} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 2) → B} -variable (hT : IsSU2BiFundamental B repGauge T) - /-- The gauge weight decomposition of the span of a bi-fundamental `su(2)` family. The span is the join of the lines through the four components, and each of those carries the sum of the weights of its two indices. -/ @[implicit_reducible] noncomputable def gaugeWeightDecomposition (hT : IsSU2BiFundamental B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge (span T) := GaugeWeightDecomposition.copy (GaugeWeightDecomposition.iSup hmul fun d : Fin 2 → Fin 2 => GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) - (hT.repGauge_gaugeTorusGen d)) + (repGauge_gaugeTorusGen hT d)) _ rfl +variable (hT : IsSU2BiFundamental B repGauge T) + /-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through those components whose weight is `w`. -/ lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : @@ -380,9 +415,11 @@ lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : /-- The epsilon contraction lies in the zero-weight piece. It is gauge invariant, so in particular the torus fixes it. -/ lemma epsilonContraction_mem_piece_zero (hmul : IsMulRep repGauge) : - hT.epsilonContraction ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := - GaugeWeightDecomposition.mem_zero_of_invariant _ hT.epsilonContraction_mem_span - hT.repGauge_epsilonContraction + epsilonContraction T ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ (epsilonContraction_mem_span T) + (repGauge_epsilonContraction hT) + +end Decomposition /-! @@ -390,11 +427,13 @@ lemma epsilonContraction_mem_piece_zero (hmul : IsMulRep repGauge) : The gauge weight cannot separate the two mixed components: they carry the same weight, and section C.4 leaves the zero-weight piece as the plane they span. The Weyl element of the -`SU(2)` factor does separate them. Its fundamental matrix `!![0, -1; 1, 0]` exchanges the -two doublet directions, so it exchanges the two mixed components and negates them, and its +`SU(2)` factor does separate them. Its matrix `!![0, -1; 1, 0]` exchanges the two doublet +directions, so it exchanges the two mixed components and negates them, and its eigenvectors on that plane are their antisymmetric combination, which is the epsilon contraction, at eigenvalue `1`, and their symmetric combination, the neutral component of -the isospin triplet, at eigenvalue `-1`. +the isospin triplet, at eigenvalue `-1`. That much is again `SU(2)`: the Weyl element +enters as the element `su2Perm` of `specialUnitaryGroup (Fin 2) ℂ`, and the gauge group +only through `toSU2_gaugeSU2Perm`, which says that `gaugeSU2Perm` is that element. The grading is therefore concentrated in the grades zero and two, as it must be for a product of an even number of doublets. Grade zero is in general only a sieve, since @@ -406,36 +445,68 @@ looks like when it is not sharp. -/ -/-- The fundamental matrix of the Weyl element of the `SU(2)` factor, which exchanges the - two doublet directions and negates one of them. -/ -lemma toSU2_gaugeSU2Perm_apply (a b : Fin 2) : - (GaugeGroupI.toSU2 gaugeSU2Perm).1 a b = !![0, -1; 1, 0] a b := rfl +/-! + +## D.1. The Weyl element on the two mixed components + +-/ + +/-- The entries of the Weyl element of `SU(2)`, which exchanges the two doublet directions + and negates one of them. -/ +lemma su2Perm_apply (a b : Fin 2) : + (su2Perm : specialUnitaryGroup (Fin 2) ℂ).1 a b = !![0, -1; 1, 0] a b := rfl + +/-- The `SU(2)` part of the Weyl element of the gauge group is the Weyl element of + `SU(2)`. -/ +lemma toSU2_gaugeSU2Perm : GaugeGroupI.toSU2 gaugeSU2Perm = su2Perm := rfl /-- The Weyl element sends the first mixed component to minus the second. -/ -lemma repGauge_gaugeSU2Perm_zero_one (hT : IsSU2BiFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![0, 1]) = -T ![1, 0] := by - rw [hT.repGauge_T gaugeSU2Perm ![0, 1], sum_pi_two] - simp [Fin.sum_univ_two, Fin.prod_univ_two, toSU2_gaugeSU2Perm_apply] +lemma map_su2Perm_zero_one {T : (Fin 2 → Fin 2) → B} + (hf : IsSU2BiFundamentalMat su2Perm f T) : + f (T ![0, 1]) = -T ![1, 0] := by + rw [hf ![0, 1], sum_pi_two] + simp [Fin.sum_univ_two, Fin.prod_univ_two, su2Perm_apply] /-- The Weyl element sends the second mixed component to minus the first. -/ -lemma repGauge_gaugeSU2Perm_one_zero (hT : IsSU2BiFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![1, 0]) = -T ![0, 1] := by - rw [hT.repGauge_T gaugeSU2Perm ![1, 0], sum_pi_two] - simp [Fin.sum_univ_two, Fin.prod_univ_two, toSU2_gaugeSU2Perm_apply] +lemma map_su2Perm_one_zero {T : (Fin 2 → Fin 2) → B} + (hf : IsSU2BiFundamentalMat su2Perm f T) : + f (T ![1, 0]) = -T ![0, 1] := by + rw [hf ![1, 0], sum_pi_two] + simp [Fin.sum_univ_two, Fin.prod_univ_two, su2Perm_apply] /-- The symmetric combination of the two mixed components: the neutral component of the isospin triplet in the tensor square of the `su(2)` fundamental, and the partner of the epsilon contraction under the Weyl element. -/ -def neutralTriplet (hT : IsSU2BiFundamental B repGauge T) : B := T ![0, 1] + T ![1, 0] +def neutralTriplet (T : (Fin 2 → Fin 2) → B) : B := T ![0, 1] + T ![1, 0] /-- The Weyl element negates the neutral triplet combination, exchanging the two mixed components and carrying a sign as it does so. -/ -lemma repGauge_gaugeSU2Perm_neutralTriplet : - repGauge gaugeSU2Perm hT.neutralTriplet = -hT.neutralTriplet := by - rw [neutralTriplet, map_add, hT.repGauge_gaugeSU2Perm_zero_one, - hT.repGauge_gaugeSU2Perm_one_zero] +lemma map_su2Perm_neutralTriplet {T : (Fin 2 → Fin 2) → B} + (hf : IsSU2BiFundamentalMat su2Perm f T) : + f (neutralTriplet T) = -neutralTriplet T := by + rw [neutralTriplet, map_add, map_su2Perm_zero_one hf, map_su2Perm_one_zero hf] abel +/-- The Weyl element of the gauge group sends the first mixed component to minus the + second. -/ +lemma repGauge_gaugeSU2Perm_zero_one {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 1]) = -T ![1, 0] := + map_su2Perm_zero_one (hT.repGauge_T gaugeSU2Perm) + +/-- The Weyl element of the gauge group sends the second mixed component to minus the + first. -/ +lemma repGauge_gaugeSU2Perm_one_zero {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![1, 0]) = -T ![0, 1] := + map_su2Perm_one_zero (hT.repGauge_T gaugeSU2Perm) + +/-- The Weyl element of the gauge group negates the neutral triplet combination. -/ +lemma repGauge_gaugeSU2Perm_neutralTriplet {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + repGauge gaugeSU2Perm (neutralTriplet T) = -neutralTriplet T := + map_su2Perm_neutralTriplet (hT.repGauge_T gaugeSU2Perm) + /-- Replacing two elements by their antisymmetric and symmetric combinations spans the same submodule, since two is invertible. -/ lemma sup_span_sub_add (a b : B) : ℂ ∙ (a - b) ⊔ ℂ ∙ (a + b) = ℂ ∙ a ⊔ ℂ ∙ b := by @@ -453,71 +524,85 @@ lemma sup_span_sub_add (a b : B) : ℂ ∙ (a - b) ⊔ ℂ ∙ (a + b) = ℂ ∙ Submodule.smul_mem _ _ (sub_mem (hmem (a - b) (a + b)).2 (hmem (a - b) (a + b)).1) rwa [show (2⁻¹ : ℂ) • ((a + b) - (a - b)) = b from by module] at h -/-- The epsilon contraction and the neutral triplet combination span the zero-weight - piece, being the antisymmetric and symmetric combinations of the two mixed components. -/ -lemma sup_span_epsilonContraction_neutralTriplet : - ℂ ∙ hT.epsilonContraction ⊔ ℂ ∙ hT.neutralTriplet +/-- The epsilon contraction and the neutral triplet combination span the plane of the two + mixed components, being their antisymmetric and symmetric combinations. -/ +lemma sup_span_epsilonContraction_neutralTriplet (T : (Fin 2 → Fin 2) → B) : + ℂ ∙ epsilonContraction T ⊔ ℂ ∙ neutralTriplet T = ℂ ∙ T ![0, 1] ⊔ ℂ ∙ T ![1, 0] := sup_span_sub_add _ _ +/-! + +## D.2. The grading + +-/ + +section Grading + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + /-- The grade `k` piece of the `SU(2)` permutation decomposition of the zero-weight piece: the epsilon contraction in grade zero, the neutral triplet combination in grade two, and nothing in the odd grades, which carry the odd-degree terms alone. -/ -noncomputable def zeroPiece (hT : IsSU2BiFundamental B repGauge T) (k : ZMod 4) : - Submodule ℂ B := - if k = 0 then ℂ ∙ hT.epsilonContraction - else if k = 2 then ℂ ∙ hT.neutralTriplet else ⊥ +noncomputable def zeroPiece (T : (Fin 2 → Fin 2) → B) (k : ZMod 4) : Submodule ℂ B := + if k = 0 then ℂ ∙ epsilonContraction T + else if k = 2 then ℂ ∙ neutralTriplet T else ⊥ + +variable {T : (Fin 2 → Fin 2) → B} /-- The grade zero piece: the line through the epsilon contraction. -/ -@[simp] lemma zeroPiece_zero : hT.zeroPiece 0 = ℂ ∙ hT.epsilonContraction := by +@[simp] lemma zeroPiece_zero : zeroPiece T 0 = ℂ ∙ epsilonContraction T := by rw [zeroPiece, if_pos rfl] /-- The grade one piece is empty. -/ -@[simp] lemma zeroPiece_one : hT.zeroPiece 1 = ⊥ := by +@[simp] lemma zeroPiece_one : zeroPiece T 1 = ⊥ := by rw [zeroPiece, if_neg (by decide), if_neg (by decide)] /-- The grade two piece: the line through the neutral triplet combination. -/ -@[simp] lemma zeroPiece_two : hT.zeroPiece 2 = ℂ ∙ hT.neutralTriplet := by +@[simp] lemma zeroPiece_two : zeroPiece T 2 = ℂ ∙ neutralTriplet T := by rw [zeroPiece, if_neg (by decide), if_pos rfl] /-- The grade three piece is empty. -/ -@[simp] lemma zeroPiece_three : hT.zeroPiece 3 = ⊥ := by +@[simp] lemma zeroPiece_three : zeroPiece T 3 = ⊥ := by rw [zeroPiece, if_neg (by decide), if_neg (by decide)] /-- Each graded piece is of pure sign under the Weyl element. -/ -lemma zeroPiece_le_eigenspace (k : ZMod 4) : - hT.zeroPiece k ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) (su2PermSign k) := by +lemma zeroPiece_le_eigenspace (hT : IsSU2BiFundamental B repGauge T) (k : ZMod 4) : + zeroPiece T k ≤ Module.End.eigenspace (repGauge gaugeSU2Perm) (su2PermSign k) := by have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide rcases hcases k with rfl | rfl | rfl | rfl - · rw [hT.zeroPiece_zero, Submodule.span_singleton_le_iff_mem] + · rw [zeroPiece_zero, Submodule.span_singleton_le_iff_mem] exact Module.End.mem_eigenspace_iff.mpr - (by rw [su2PermSign_zero, one_smul, hT.repGauge_epsilonContraction]) - · rw [hT.zeroPiece_one] + (by rw [su2PermSign_zero, one_smul, repGauge_epsilonContraction hT]) + · rw [zeroPiece_one] exact bot_le - · rw [hT.zeroPiece_two, Submodule.span_singleton_le_iff_mem] + · rw [zeroPiece_two, Submodule.span_singleton_le_iff_mem] exact Module.End.mem_eigenspace_iff.mpr - (by rw [su2PermSign_two, neg_one_smul, hT.repGauge_gaugeSU2Perm_neutralTriplet]) - · rw [hT.zeroPiece_three] + (by rw [su2PermSign_two, neg_one_smul, repGauge_gaugeSU2Perm_neutralTriplet hT]) + · rw [zeroPiece_three] exact bot_le +variable (hT : IsSU2BiFundamental B repGauge T) + /-- The graded pieces exhaust the zero-weight piece. -/ lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : - (⨆ k : ZMod 4, hT.zeroPiece k) = (hT.gaugeWeightDecomposition hmul).piece 0 := by + (⨆ k : ZMod 4, zeroPiece T k) = (hT.gaugeWeightDecomposition hmul).piece 0 := by rw [hT.gaugeWeightDecomposition_piece_zero hmul, - ← hT.sup_span_epsilonContraction_neutralTriplet] + ← sup_span_epsilonContraction_neutralTriplet T] have hcases : ∀ j : ZMod 4, j = 0 ∨ j = 1 ∨ j = 2 ∨ j = 3 := by decide refine le_antisymm (iSup_le fun k => ?_) (sup_le ?_ ?_) · rcases hcases k with rfl | rfl | rfl | rfl - · rw [hT.zeroPiece_zero] + · rw [zeroPiece_zero] exact le_sup_left - · rw [hT.zeroPiece_one] + · rw [zeroPiece_one] exact bot_le - · rw [hT.zeroPiece_two] + · rw [zeroPiece_two] exact le_sup_right - · rw [hT.zeroPiece_three] + · rw [zeroPiece_three] exact bot_le - · exact le_iSup_of_le 0 (le_of_eq hT.zeroPiece_zero.symm) - · exact le_iSup_of_le 2 (le_of_eq hT.zeroPiece_two.symm) + · exact le_iSup_of_le 0 (le_of_eq zeroPiece_zero.symm) + · exact le_iSup_of_le 2 (le_of_eq zeroPiece_two.symm) /-- The `SU(2)` permutation decomposition of the zero-weight piece of the gauge weight decomposition: the Weyl element grades the plane the gauge weight cannot split, putting @@ -526,36 +611,38 @@ lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : noncomputable def zeroPieceSU2Perm (hT : IsSU2BiFundamental B repGauge T) (hmul : IsMulRep repGauge) : SU2PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) where - piece := hT.zeroPiece - piece_le k x hx := Module.End.mem_eigenspace_iff.mp (hT.zeroPiece_le_eigenspace k hx) + piece := zeroPiece T + piece_le k x hx := Module.End.mem_eigenspace_iff.mp (zeroPiece_le_eigenspace hT k hx) iSup_piece := hT.iSup_zeroPiece hmul /-- The pieces of the decomposition are the graded pieces. -/ @[simp] lemma zeroPieceSU2Perm_piece (hmul : IsMulRep repGauge) (k : ZMod 4) : - (hT.zeroPieceSU2Perm hmul).piece k = hT.zeroPiece k := rfl + (hT.zeroPieceSU2Perm hmul).piece k = zeroPiece T k := rfl /-- The epsilon contraction lies in the grade zero piece: it is gauge invariant, so in particular the Weyl element fixes it. -/ -lemma epsilonContraction_mem_zeroPiece_zero (hmul : IsMulRep repGauge) : - hT.epsilonContraction ∈ hT.zeroPiece 0 := +lemma epsilonContraction_mem_zeroPiece_zero (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) : + epsilonContraction T ∈ zeroPiece T 0 := SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) - (hT.epsilonContraction_mem_piece_zero hmul) hT.repGauge_epsilonContraction + (hT.epsilonContraction_mem_piece_zero hmul) (repGauge_epsilonContraction hT) /-- Every gauge invariant in the span of the components is a multiple of the epsilon contraction. The gauge weight cuts the span down to the plane of the two mixed components, and the Weyl element cuts that plane down to the line through their antisymmetric combination. -/ -lemma exists_smul_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x : B} - (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c : ℂ, x = c • hT.epsilonContraction := by - have hmem : x ∈ hT.zeroPiece 0 := +lemma exists_smul_epsilonContraction_of_invariant (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, x = c • epsilonContraction T := by + have hmem : x ∈ zeroPiece T 0 := SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv - rw [hT.zeroPiece_zero] at hmem + rw [zeroPiece_zero] at hmem obtain ⟨c, hc⟩ := Submodule.mem_span_singleton.1 hmem exact ⟨c, hc.symm⟩ -end Decomposition +end Grading end IsSU2BiFundamental diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean index 58412af9b..8800e6dc9 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean @@ -27,13 +27,24 @@ identity, which says that antisymmetrizing three indices of a two-dimensional sp vanishes, gives one linear relation between the three, so exactly two of them are independent, and the third is the difference of the other two. -Section A gives the proposition, the span of its components, and the way a linear -combination of the components transforms. Section B builds the three double epsilon -contractions, proves each gauge invariant, and proves the Schouten relation between them. -Section C is the gauge weight decomposition of the span, whose zero-weight piece is the -join of the six lines through the components with two indices of each value. Section D -grades that piece by the Weyl element of the `SU(2)` factor, leaving a grade zero spanned -by three symmetric combinations. +As in `IsSU2BiFundamental` the transformation law is `IsSU2QuadFundamentalMat`, a relation +between one element of `SU(2)` and one linear map on `B` in which no other factor of the +gauge group appears, and `IsSU2QuadFundamental` says only that every gauge transformation +obeys that law through its `SU(2)` part. Every statement about how the components move — +the invariance of the three contractions, the diagonal action of the torus, the exchanges +made by the Weyl element and the averaging identity of section E — is proved for an +arbitrary element of `specialUnitaryGroup (Fin 2) ℂ` and read at `GaugeGroupI.toSU2 g` +afterwards. What stays about `GaugeGroupI` is the bookkeeping of the two decompositions, +which `GaugeWeightDecomposition` and `SU2PermDecomposition` supply only for +representations of the gauge group, and the notion of gauge invariance itself. + +Section A gives the transformation law, the proposition, the span of its components, and +the way a linear combination of the components transforms. Section B builds the three +double epsilon contractions, proves each invariant, and proves the Schouten relation +between them. Section C is the gauge weight decomposition of the span, whose zero-weight +piece is the join of the six lines through the components with two indices of each value. +Section D grades that piece by the Weyl element of the `SU(2)` factor, leaving a grade zero +spanned by three symmetric combinations. Section E removes the one direction that survives both gradings, the neutral state of the isospin-two multiplet, by averaging over the cyclic group generated by a third of a turn about the diagonal isospin axis, and so cuts the invariants down to the plane spanned by @@ -46,61 +57,65 @@ namespace StandardModel open Matrix open IsSU2BiFundamental (epsilon sum_epsilon_mul fundWeight) -open IsSU2BiFundamental (toSU2_gaugeTorusGen_apply toSU2_gaugeSU2Perm_apply) -open IsSU2BiFundamental (sup_span_sub_add) +open IsSU2BiFundamental (toSU2_gaugeTorusGen_apply toSU2_gaugeTorusGen_offDiag) +open IsSU2BiFundamental (su2Perm_apply sup_span_sub_add) /-! ## A. Quad-fundamental `su(2)` families and the span of their components -The transformation law carries one factor of the fundamental matrix `GaugeGroupI.toSU2 g` -per index, with the summed index in the row slot, exactly as in `IsSU2BiFundamental`. Since -`toSU2` is a monoid homomorphism this is an action, and it is the `SU(2)` factor alone. - -The element `g` still ranges over the whole of `GaugeGroupI`, and that asymmetry is what -makes the proposition say more than a statement about `SU(2)` would. The right-hand side -sees only `GaugeGroupI.toSU2 g`, so taking `g` in the colour or hypercharge factor forces -that factor to fix every component; section C reads that off as the vanishing of the colour -and hypercharge coordinates of every weight. `GaugeWeightDecomposition` is in any case -stated for representations of `GaugeGroupI`, which a bare `SU(2)` representation cannot -supply. - -Everything after section A is phrased through `repGauge_sum`, which says how a linear -combination of the components transforms: the coefficients move by the fourfold tensor -power of the fundamental matrix, and the components stay where they are. Each later +The transformation law carries one factor of the fundamental matrix per index, with the +summed index in the row slot, exactly as in `IsSU2BiFundamental`. It is recorded by +`IsSU2QuadFundamentalMat`, which relates one element of `SU(2)` to one linear map on `B`. +`IsSU2QuadFundamental` then says that every gauge transformation obeys that law through +its `SU(2)` part; since `GaugeGroupI.toSU2` is a monoid homomorphism this is an action. + +Quantifying over the whole of `GaugeGroupI` is what makes the proposition say more than a +statement about a single `SU(2)` element would: an element of the colour or hypercharge +factor is sent to `1` in `SU(2)`, so those factors fix every component, and section C +reads that off as the vanishing of the colour and hypercharge coordinates of every weight. + +Everything after section A is phrased through `map_sum_smul`, which says how a linear +combination of the components moves under one `SU(2)` matrix: the coefficients move by the +fourfold tensor power of that matrix, and the components stay where they are. Each later statement is then a statement about coefficient families, which are functions to `ℂ` and so can be computed with. -/ +/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` + moves a tensor with four fundamental indices: one factor of `U` per index, with the + summed index in the row slot. -/ +def IsSU2QuadFundamentalMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 2) ℂ) (f : B →ₗ[ℂ] B) + (T : (Fin 4 → Fin 2) → B) : Prop := + ∀ l : Fin 4 → Fin 2, + f (T l) = ∑ a : Fin 4 → Fin 2, (∏ i : Fin 4, U.1 (a i) (l i)) • T a + /-- A family `T` of elements of `B`, indexed by four `su(2)` fundamental indices, transforms as a tensor `T^{a₁ a₂ a₃ a₄}` under the representation `repGauge` of the gauge - group. -/ + group: every gauge transformation moves the components by its `SU(2)` part alone. -/ structure IsSU2QuadFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 4 → Fin 2) → B) : Prop where - repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 4 → Fin 2), - repGauge g (T l) = ∑ a : Fin 4 → Fin 2, - (∏ i : Fin 4, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a - -TODO (lines := 82-85) "This should just be about the action of - the SU(2) part, along with the rest of the content of this file." + repGauge_T : ∀ g : GaugeGroupI, + IsSU2QuadFundamentalMat (GaugeGroupI.toSU2 g) (repGauge g) T namespace IsSU2QuadFundamental set_option linter.unusedVariables false variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} - {T : (Fin 4 → Fin 2) → B} - (hT : IsSU2QuadFundamental B repGauge T) + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} -/-- The span of all the components. -/ -def span (hT : IsSU2QuadFundamental B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d +/-- The span of all the components of a family indexed by four `su(2)` fundamental + indices. -/ +def span (T : (Fin 4 → Fin 2) → B) : Submodule ℂ B := ⨆ d, ℂ ∙ T d /-- An element of `B` lies in the span of the components of `T` precisely when it is a linear combination of them. -/ -lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ (c : (Fin 4 → Fin 2) → ℂ), x = ∑ d, c d • T d := by +lemma mem_span_iff {T : (Fin 4 → Fin 2) → B} (x : B) : + x ∈ span T ↔ ∃ (c : (Fin 4 → Fin 2) → ℂ), x = ∑ d, c d • T d := by constructor · intro hx rw [span] at hx @@ -119,7 +134,7 @@ lemma mem_span_iff (x : B) : (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) /-- Every component lies in the span. -/ -lemma mem_span (d : Fin 4 → Fin 2) : T d ∈ hT.span := +lemma mem_span {T : (Fin 4 → Fin 2) → B} (d : Fin 4 → Fin 2) : T d ∈ span T := Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) /-- A sum over families of four `su(2)` fundamental indices is a fourfold sum. -/ @@ -138,20 +153,18 @@ lemma sum_pi_four {M : Type*} [AddCommMonoid M] (F : (Fin 4 → Fin 2) → M) : fin_cases i <;> simp] simp only [Fintype.sum_prod_type] -/-- A gauge transformation moves a linear combination of the components to the combination - whose coefficients have been moved by the fourfold tensor power of the fundamental - matrix. -/ -lemma repGauge_sum (hT : IsSU2QuadFundamental B repGauge T) (g : GaugeGroupI) +/-- An `SU(2)` matrix moves a linear combination of the components to the combination + whose coefficients have been moved by the fourfold tensor power of that matrix. -/ +lemma map_sum_smul {T : (Fin 4 → Fin 2) → B} (hf : IsSU2QuadFundamentalMat U f T) (c : (Fin 4 → Fin 2) → ℂ) : - repGauge g (∑ l : Fin 4 → Fin 2, c l • T l) + f (∑ l : Fin 4 → Fin 2, c l • T l) = ∑ a : Fin 4 → Fin 2, - (∑ l : Fin 4 → Fin 2, c l * ∏ i, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a := by + (∑ l : Fin 4 → Fin 2, c l * ∏ i, U.1 (a i) (l i)) • T a := by rw [map_sum] - have h1 : ∀ l : Fin 4 → Fin 2, repGauge g (c l • T l) - = ∑ a : Fin 4 → Fin 2, - (c l * ∏ i, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a := by + have h1 : ∀ l : Fin 4 → Fin 2, f (c l • T l) + = ∑ a : Fin 4 → Fin 2, (c l * ∏ i, U.1 (a i) (l i)) • T a := by intro l - rw [map_smul, hT.repGauge_T g l, Finset.smul_sum] + rw [map_smul, hf l, Finset.smul_sum] refine Finset.sum_congr rfl fun a _ => ?_ rw [smul_smul] simp only [h1] @@ -159,17 +172,36 @@ lemma repGauge_sum (hT : IsSU2QuadFundamental B repGauge T) (g : GaugeGroupI) refine Finset.sum_congr rfl fun a _ => ?_ rw [← Finset.sum_smul] +/-- A linear combination of the components whose coefficient family is fixed by an + `SU(2)` matrix is fixed by any map moving the components by that matrix. -/ +lemma map_sum_smul_eq_self {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat U f T) (c : (Fin 4 → Fin 2) → ℂ) + (hc : ∀ a : Fin 4 → Fin 2, + ∑ l : Fin 4 → Fin 2, c l * ∏ i, U.1 (a i) (l i) = c a) : + f (∑ l : Fin 4 → Fin 2, c l • T l) = ∑ l : Fin 4 → Fin 2, c l • T l := by + rw [map_sum_smul hf c] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [hc a] + +/-- A gauge transformation moves a linear combination of the components to the combination + whose coefficients have been moved by the fourfold tensor power of its fundamental + matrix. -/ +lemma repGauge_sum {T : (Fin 4 → Fin 2) → B} (hT : IsSU2QuadFundamental B repGauge T) + (g : GaugeGroupI) (c : (Fin 4 → Fin 2) → ℂ) : + repGauge g (∑ l : Fin 4 → Fin 2, c l • T l) + = ∑ a : Fin 4 → Fin 2, + (∑ l : Fin 4 → Fin 2, c l * ∏ i, (GaugeGroupI.toSU2 g).1 (a i) (l i)) • T a := + map_sum_smul (hT.repGauge_T g) c + /-- A linear combination of the components whose coefficient family is fixed by every `SU(2)` matrix is gauge invariant. -/ -lemma repGauge_sum_eq_self (hT : IsSU2QuadFundamental B repGauge T) - (c : (Fin 4 → Fin 2) → ℂ) +lemma repGauge_sum_eq_self {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (c : (Fin 4 → Fin 2) → ℂ) (hc : ∀ (U : specialUnitaryGroup (Fin 2) ℂ) (a : Fin 4 → Fin 2), ∑ l : Fin 4 → Fin 2, c l * ∏ i, U.1 (a i) (l i) = c a) (g : GaugeGroupI) : - repGauge g (∑ l : Fin 4 → Fin 2, c l • T l) = ∑ l : Fin 4 → Fin 2, c l • T l := by - rw [hT.repGauge_sum g c] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [hc (GaugeGroupI.toSU2 g) a] + repGauge g (∑ l : Fin 4 → Fin 2, c l • T l) = ∑ l : Fin 4 → Fin 2, c l • T l := + map_sum_smul_eq_self (hT.repGauge_T g) c (hc (GaugeGroupI.toSU2 g)) /-! @@ -180,6 +212,9 @@ the antisymmetric symbol, so a contraction of four doublet indices is a choice o of the four. There are three such pairings, and hence three double contractions. The symbol and its invariance are those of `IsSU2BiFundamental`: the invariance is the statement that the determinant of an `SU(2)` matrix is one, and it needs no mention of the gauge group. +Neither does anything else in this section: the three contractions are built from the +family alone and are fixed by every element of `specialUnitaryGroup (Fin 2) ℂ`, gauge +invariance being that statement read at `GaugeGroupI.toSU2 g`. The three contractions are not independent. Antisymmetrizing three indices of a two-dimensional space gives zero, and writing that out is the Schouten identity, one linear @@ -278,93 +313,110 @@ lemma sum_epsilonPair₁₄_mul (U : specialUnitaryGroup (Fin 2) ℂ) (a : Fin 4 /-- The contraction pairing the first index with the second and the third with the fourth. -/ -def epsilonContraction₁₂ (hT : IsSU2QuadFundamental B repGauge T) : B := +def epsilonContraction₁₂ (T : (Fin 4 → Fin 2) → B) : B := T ![0, 1, 0, 1] - T ![0, 1, 1, 0] - T ![1, 0, 0, 1] + T ![1, 0, 1, 0] /-- The contraction pairing the first index with the third and the second with the fourth. -/ -def epsilonContraction₁₃ (hT : IsSU2QuadFundamental B repGauge T) : B := +def epsilonContraction₁₃ (T : (Fin 4 → Fin 2) → B) : B := T ![0, 0, 1, 1] - T ![0, 1, 1, 0] - T ![1, 0, 0, 1] + T ![1, 1, 0, 0] /-- The contraction pairing the first index with the fourth and the second with the third. -/ -def epsilonContraction₁₄ (hT : IsSU2QuadFundamental B repGauge T) : B := +def epsilonContraction₁₄ (T : (Fin 4 → Fin 2) → B) : B := T ![0, 0, 1, 1] - T ![0, 1, 0, 1] - T ![1, 0, 1, 0] + T ![1, 1, 0, 0] /-- The first contraction written as a sum over all families of four fundamental indices weighted by its pairing. -/ -lemma epsilonContraction₁₂_eq_sum (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₂ = ∑ l : Fin 4 → Fin 2, epsilonPair₁₂ l • T l := by +lemma epsilonContraction₁₂_eq_sum (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₂ T = ∑ l : Fin 4 → Fin 2, epsilonPair₁₂ l • T l := by rw [sum_pi_four] simp [epsilonContraction₁₂, epsilonPair₁₂, Fin.sum_univ_two] abel /-- The second contraction written as a sum over all families of four fundamental indices weighted by its pairing. -/ -lemma epsilonContraction₁₃_eq_sum (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₃ = ∑ l : Fin 4 → Fin 2, epsilonPair₁₃ l • T l := by +lemma epsilonContraction₁₃_eq_sum (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₃ T = ∑ l : Fin 4 → Fin 2, epsilonPair₁₃ l • T l := by rw [sum_pi_four] simp [epsilonContraction₁₃, epsilonPair₁₃, Fin.sum_univ_two] abel /-- The third contraction written as a sum over all families of four fundamental indices weighted by its pairing. -/ -lemma epsilonContraction₁₄_eq_sum (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₄ = ∑ l : Fin 4 → Fin 2, epsilonPair₁₄ l • T l := by +lemma epsilonContraction₁₄_eq_sum (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₄ T = ∑ l : Fin 4 → Fin 2, epsilonPair₁₄ l • T l := by rw [sum_pi_four] simp [epsilonContraction₁₄, epsilonPair₁₄, Fin.sum_univ_two] abel +/-- The first contraction is fixed by any linear map moving the components by an element + of `SU(2)`. -/ +lemma map_epsilonContraction₁₂ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat U f T) : + f (epsilonContraction₁₂ T) = epsilonContraction₁₂ T := by + rw [epsilonContraction₁₂_eq_sum] + exact map_sum_smul_eq_self hf _ (sum_epsilonPair₁₂_mul U) + +/-- The second contraction is fixed by any linear map moving the components by an element + of `SU(2)`. -/ +lemma map_epsilonContraction₁₃ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat U f T) : + f (epsilonContraction₁₃ T) = epsilonContraction₁₃ T := by + rw [epsilonContraction₁₃_eq_sum] + exact map_sum_smul_eq_self hf _ (sum_epsilonPair₁₃_mul U) + +/-- The third contraction is fixed by any linear map moving the components by an element + of `SU(2)`. -/ +lemma map_epsilonContraction₁₄ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat U f T) : + f (epsilonContraction₁₄ T) = epsilonContraction₁₄ T := by + rw [epsilonContraction₁₄_eq_sum] + exact map_sum_smul_eq_self hf _ (sum_epsilonPair₁₄_mul U) + /-- The first contraction is gauge invariant. -/ -lemma repGauge_epsilonContraction₁₂ (hT : IsSU2QuadFundamental B repGauge T) - (g : GaugeGroupI) : - repGauge g hT.epsilonContraction₁₂ = hT.epsilonContraction₁₂ := by - rw [hT.epsilonContraction₁₂_eq_sum] - exact hT.repGauge_sum_eq_self _ sum_epsilonPair₁₂_mul g +lemma repGauge_epsilonContraction₁₂ {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (g : GaugeGroupI) : + repGauge g (epsilonContraction₁₂ T) = epsilonContraction₁₂ T := + map_epsilonContraction₁₂ (hT.repGauge_T g) /-- The second contraction is gauge invariant. -/ -lemma repGauge_epsilonContraction₁₃ (hT : IsSU2QuadFundamental B repGauge T) - (g : GaugeGroupI) : - repGauge g hT.epsilonContraction₁₃ = hT.epsilonContraction₁₃ := by - rw [hT.epsilonContraction₁₃_eq_sum] - exact hT.repGauge_sum_eq_self _ sum_epsilonPair₁₃_mul g +lemma repGauge_epsilonContraction₁₃ {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (g : GaugeGroupI) : + repGauge g (epsilonContraction₁₃ T) = epsilonContraction₁₃ T := + map_epsilonContraction₁₃ (hT.repGauge_T g) /-- The third contraction is gauge invariant. -/ -lemma repGauge_epsilonContraction₁₄ (hT : IsSU2QuadFundamental B repGauge T) - (g : GaugeGroupI) : - repGauge g hT.epsilonContraction₁₄ = hT.epsilonContraction₁₄ := by - rw [hT.epsilonContraction₁₄_eq_sum] - exact hT.repGauge_sum_eq_self _ sum_epsilonPair₁₄_mul g +lemma repGauge_epsilonContraction₁₄ {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (g : GaugeGroupI) : + repGauge g (epsilonContraction₁₄ T) = epsilonContraction₁₄ T := + map_epsilonContraction₁₄ (hT.repGauge_T g) +omit [Module ℂ B] in /-- The Schouten relation between the three contractions: the third is the difference of the other two, so the three span a plane and not a three-dimensional space. -/ -lemma epsilonContraction₁₄_eq_sub (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₄ = hT.epsilonContraction₁₃ - hT.epsilonContraction₁₂ := by +lemma epsilonContraction₁₄_eq_sub (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₄ T = epsilonContraction₁₃ T - epsilonContraction₁₂ T := by rw [epsilonContraction₁₄, epsilonContraction₁₃, epsilonContraction₁₂] abel /-- The first contraction lies in the span of the components. -/ -lemma epsilonContraction₁₂_mem_span (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₂ ∈ hT.span := by +lemma epsilonContraction₁₂_mem_span (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₂ T ∈ span T := by rw [epsilonContraction₁₂] - exact add_mem (sub_mem (sub_mem (hT.mem_span _) (hT.mem_span _)) (hT.mem_span _)) - (hT.mem_span _) + exact add_mem (sub_mem (sub_mem (mem_span _) (mem_span _)) (mem_span _)) (mem_span _) /-- The second contraction lies in the span of the components. -/ -lemma epsilonContraction₁₃_mem_span (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₃ ∈ hT.span := by +lemma epsilonContraction₁₃_mem_span (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₃ T ∈ span T := by rw [epsilonContraction₁₃] - exact add_mem (sub_mem (sub_mem (hT.mem_span _) (hT.mem_span _)) (hT.mem_span _)) - (hT.mem_span _) + exact add_mem (sub_mem (sub_mem (mem_span _) (mem_span _)) (mem_span _)) (mem_span _) /-- The third contraction lies in the span of the components. -/ -lemma epsilonContraction₁₄_mem_span (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₄ ∈ hT.span := by +lemma epsilonContraction₁₄_mem_span (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₄ T ∈ span T := by rw [epsilonContraction₁₄] - exact add_mem (sub_mem (sub_mem (hT.mem_span _) (hT.mem_span _)) (hT.mem_span _)) - (hT.mem_span _) - -end IsSU2QuadFundamental + exact add_mem (sub_mem (sub_mem (mem_span _) (mem_span _)) (mem_span _)) (mem_span _) /-! @@ -381,22 +433,38 @@ The weights that occur are those of the fourth tensor power of the `su(2)` funda is spanned by the six components carrying two indices of each value, the multiplicity of the zero weight in that tensor power. +The `SU(2)` content is `map_of_diagonal`: a family moved by a diagonal `SU(2)` matrix has +every component an eigenvector, at the product of the diagonal entries at its four indices. +The torus generators enter only through `toSU2_gaugeTorusGen_apply`, which says that their +`SU(2)` parts are diagonal with the characters of `fundWeight` on the diagonal. The +decomposition itself is where the gauge group is unavoidable: `GaugeWeightDecomposition` is +defined for a representation of `GaugeGroupI`, and it is what records that the colour and +hypercharge coordinates of every weight vanish. + The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra and records multiplicativity of the representation, neither of which `IsSU2QuadFundamental` needs, so both appear as extra arguments here. -/ -namespace IsSU2QuadFundamental - -set_option linter.unusedVariables false - /-! -## C.1. The gauge torus in the fundamental representation +## C.1. Diagonal matrices and the gauge torus -/ +/-- A family moved by a diagonal `SU(2)` matrix has every component an eigenvector, at the + product of the diagonal entries at its four indices. -/ +lemma map_of_diagonal {T : (Fin 4 → Fin 2) → B} (hf : IsSU2QuadFundamentalMat U f T) + (hU : ∀ a b : Fin 2, a ≠ b → U.1 a b = 0) (l : Fin 4 → Fin 2) : + f (T l) = (∏ i : Fin 4, U.1 (l i) (l i)) • T l := by + rw [hf l, Finset.sum_eq_single l] + · intro a _ hal + obtain ⟨j, hj⟩ := Function.ne_iff.1 hal + rw [Finset.prod_eq_zero (Finset.mem_univ j) (hU _ _ hj), zero_smul] + · intro hl + exact absurd (Finset.mem_univ l) hl + /-- The gauge torus acts on a fundamental index by the character of the weight of that index, the off-diagonal entries vanishing. -/ lemma toSU2_gaugeTorusGen_diag (i : Fin 4) (a : Fin 2) : @@ -415,31 +483,18 @@ def wtWeight (l : Fin 4 → Fin 2) : GaugeWeight := -/ -section Weights - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} - {T : (Fin 4 → Fin 2) → B} - /-- Every component of a quad-fundamental family is a simultaneous eigenvector of the gauge torus, at the character of the sum of the weights of its four indices. -/ -lemma repGauge_gaugeTorusGen (hT : IsSU2QuadFundamental B repGauge T) (l : Fin 4 → Fin 2) - (i : Fin 4) : +lemma repGauge_gaugeTorusGen {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (l : Fin 4 → Fin 2) (i : Fin 4) : repGauge (gaugeTorusGen i) (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by - rw [hT.repGauge_T (gaugeTorusGen i) l, Finset.sum_eq_single l] - · congr 1 - simp only [Fin.prod_univ_four, toSU2_gaugeTorusGen_diag, wtWeight, - GaugeWeight.coord_add] - rw [zpow_add₀ expI_ne_zero, zpow_add₀ expI_ne_zero, zpow_add₀ expI_ne_zero] - · intro a _ hal - obtain ⟨j, hj⟩ := Function.ne_iff.1 hal - rw [Finset.prod_eq_zero (Finset.mem_univ j) - (by rw [toSU2_gaugeTorusGen_apply, if_neg hj]), zero_smul] - · intro hl - exact absurd (Finset.mem_univ l) hl - -end Weights + rw [map_of_diagonal (hT.repGauge_T (gaugeTorusGen i)) + (toSU2_gaugeTorusGen_offDiag i) l] + congr 1 + simp only [Fin.prod_univ_four, toSU2_gaugeTorusGen_diag, wtWeight, + GaugeWeight.coord_add] + rw [zpow_add₀ expI_ne_zero, zpow_add₀ expI_ne_zero, zpow_add₀ expI_ne_zero] /-! @@ -451,22 +506,22 @@ section Decomposition variable {B : Type*} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} - {T : (Fin 4 → Fin 2) → B} - -variable (hT : IsSU2QuadFundamental B repGauge T) + {T : (Fin 4 → Fin 2) → B} {f : B →ₗ[ℂ] B} /-- The gauge weight decomposition of the span of a quad-fundamental `su(2)` family. The span is the join of the lines through the sixteen components, and each of those carries the sum of the weights of its four indices. -/ @[implicit_reducible] noncomputable def gaugeWeightDecomposition (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge (span T) := GaugeWeightDecomposition.copy (GaugeWeightDecomposition.iSup hmul fun d : Fin 4 → Fin 2 => GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) - (hT.repGauge_gaugeTorusGen d)) + (repGauge_gaugeTorusGen hT d)) _ rfl +variable (hT : IsSU2QuadFundamental B repGauge T) + /-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through those components whose weight is `w`. -/ lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : @@ -540,26 +595,28 @@ lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : /-- The first contraction lies in the zero-weight piece. It is gauge invariant, so in particular the torus fixes it. -/ lemma epsilonContraction₁₂_mem_piece_zero (hmul : IsMulRep repGauge) : - hT.epsilonContraction₁₂ ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := - GaugeWeightDecomposition.mem_zero_of_invariant _ hT.epsilonContraction₁₂_mem_span - hT.repGauge_epsilonContraction₁₂ + epsilonContraction₁₂ T ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ (epsilonContraction₁₂_mem_span T) + (repGauge_epsilonContraction₁₂ hT) /-- The second contraction lies in the zero-weight piece. -/ lemma epsilonContraction₁₃_mem_piece_zero (hmul : IsMulRep repGauge) : - hT.epsilonContraction₁₃ ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := - GaugeWeightDecomposition.mem_zero_of_invariant _ hT.epsilonContraction₁₃_mem_span - hT.repGauge_epsilonContraction₁₃ + epsilonContraction₁₃ T ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ (epsilonContraction₁₃_mem_span T) + (repGauge_epsilonContraction₁₃ hT) /-! ## D. The `SU(2)` permutation decomposition of the zero-weight piece The gauge weight cannot separate the six zero-weight components: they all carry the same -weight. The Weyl element of the `SU(2)` factor separates them into three pairs. Its -fundamental matrix `!![0, -1; 1, 0]` exchanges the two doublet directions and carries a -sign with each `1` it meets, and a zero-weight component meets two of them, so the two -signs cancel and the Weyl element simply exchanges each component with the one obtained by -flipping all four of its indices. +weight. The Weyl element of the `SU(2)` factor separates them into three pairs. Its matrix +`!![0, -1; 1, 0]` exchanges the two doublet directions and carries a sign with each `1` it +meets, and a zero-weight component meets two of them, so the two signs cancel and the Weyl +element simply exchanges each component with the one obtained by flipping all four of its +indices. That is again `SU(2)`: the exchanges are proved for the element `su2Perm` of +`specialUnitaryGroup (Fin 2) ℂ`, and the gauge group enters only because `gaugeSU2Perm` is +that element. Each of the three pairs is therefore graded into a grade-zero symmetric combination and a grade-two antisymmetric one, and the grading of the whole zero-weight piece is the join of @@ -611,67 +668,108 @@ noncomputable def swapPairSU2Perm {u v : B} (huv : repGauge gaugeSU2Perm u = v) · rw [if_pos rfl] /-- The Weyl element exchanges the two components of the first zero-weight pair. -/ -lemma repGauge_gaugeSU2Perm_fst₁ (hT : IsSU2QuadFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![0, 0, 1, 1]) = T ![1, 1, 0, 0] := by - rw [hT.repGauge_T gaugeSU2Perm ![0, 0, 1, 1], sum_pi_four] - simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] +lemma map_su2Perm_fst₁ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat su2Perm f T) : + f (T ![0, 0, 1, 1]) = T ![1, 1, 0, 0] := by + rw [hf ![0, 0, 1, 1], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, su2Perm_apply] /-- The Weyl element exchanges the two components of the first zero-weight pair, the other way round. -/ -lemma repGauge_gaugeSU2Perm_snd₁ (hT : IsSU2QuadFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![1, 1, 0, 0]) = T ![0, 0, 1, 1] := by - rw [hT.repGauge_T gaugeSU2Perm ![1, 1, 0, 0], sum_pi_four] - simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] +lemma map_su2Perm_snd₁ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat su2Perm f T) : + f (T ![1, 1, 0, 0]) = T ![0, 0, 1, 1] := by + rw [hf ![1, 1, 0, 0], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, su2Perm_apply] /-- The Weyl element exchanges the two components of the second zero-weight pair. -/ -lemma repGauge_gaugeSU2Perm_fst₂ (hT : IsSU2QuadFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![0, 1, 0, 1]) = T ![1, 0, 1, 0] := by - rw [hT.repGauge_T gaugeSU2Perm ![0, 1, 0, 1], sum_pi_four] - simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] +lemma map_su2Perm_fst₂ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat su2Perm f T) : + f (T ![0, 1, 0, 1]) = T ![1, 0, 1, 0] := by + rw [hf ![0, 1, 0, 1], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, su2Perm_apply] /-- The Weyl element exchanges the two components of the second zero-weight pair, the other way round. -/ -lemma repGauge_gaugeSU2Perm_snd₂ (hT : IsSU2QuadFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![1, 0, 1, 0]) = T ![0, 1, 0, 1] := by - rw [hT.repGauge_T gaugeSU2Perm ![1, 0, 1, 0], sum_pi_four] - simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] +lemma map_su2Perm_snd₂ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat su2Perm f T) : + f (T ![1, 0, 1, 0]) = T ![0, 1, 0, 1] := by + rw [hf ![1, 0, 1, 0], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, su2Perm_apply] /-- The Weyl element exchanges the two components of the third zero-weight pair. -/ -lemma repGauge_gaugeSU2Perm_fst₃ (hT : IsSU2QuadFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![0, 1, 1, 0]) = T ![1, 0, 0, 1] := by - rw [hT.repGauge_T gaugeSU2Perm ![0, 1, 1, 0], sum_pi_four] - simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] +lemma map_su2Perm_fst₃ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat su2Perm f T) : + f (T ![0, 1, 1, 0]) = T ![1, 0, 0, 1] := by + rw [hf ![0, 1, 1, 0], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, su2Perm_apply] /-- The Weyl element exchanges the two components of the third zero-weight pair, the other way round. -/ +lemma map_su2Perm_snd₃ {T : (Fin 4 → Fin 2) → B} + (hf : IsSU2QuadFundamentalMat su2Perm f T) : + f (T ![1, 0, 0, 1]) = T ![0, 1, 1, 0] := by + rw [hf ![1, 0, 0, 1], sum_pi_four] + simp [Fin.sum_univ_two, Fin.prod_univ_four, su2Perm_apply] + +/-- The Weyl element of the gauge group exchanges the two components of the first + zero-weight pair. -/ +lemma repGauge_gaugeSU2Perm_fst₁ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 0, 1, 1]) = T ![1, 1, 0, 0] := + map_su2Perm_fst₁ (hT.repGauge_T gaugeSU2Perm) + +/-- The Weyl element of the gauge group exchanges the two components of the first + zero-weight pair, the other way round. -/ +lemma repGauge_gaugeSU2Perm_snd₁ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![1, 1, 0, 0]) = T ![0, 0, 1, 1] := + map_su2Perm_snd₁ (hT.repGauge_T gaugeSU2Perm) + +/-- The Weyl element of the gauge group exchanges the two components of the second + zero-weight pair. -/ +lemma repGauge_gaugeSU2Perm_fst₂ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 1, 0, 1]) = T ![1, 0, 1, 0] := + map_su2Perm_fst₂ (hT.repGauge_T gaugeSU2Perm) + +/-- The Weyl element of the gauge group exchanges the two components of the second + zero-weight pair, the other way round. -/ +lemma repGauge_gaugeSU2Perm_snd₂ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![1, 0, 1, 0]) = T ![0, 1, 0, 1] := + map_su2Perm_snd₂ (hT.repGauge_T gaugeSU2Perm) + +/-- The Weyl element of the gauge group exchanges the two components of the third + zero-weight pair. -/ +lemma repGauge_gaugeSU2Perm_fst₃ (hT : IsSU2QuadFundamental B repGauge T) : + repGauge gaugeSU2Perm (T ![0, 1, 1, 0]) = T ![1, 0, 0, 1] := + map_su2Perm_fst₃ (hT.repGauge_T gaugeSU2Perm) + +/-- The Weyl element of the gauge group exchanges the two components of the third + zero-weight pair, the other way round. -/ lemma repGauge_gaugeSU2Perm_snd₃ (hT : IsSU2QuadFundamental B repGauge T) : - repGauge gaugeSU2Perm (T ![1, 0, 0, 1]) = T ![0, 1, 1, 0] := by - rw [hT.repGauge_T gaugeSU2Perm ![1, 0, 0, 1], sum_pi_four] - simp [Fin.sum_univ_two, Fin.prod_univ_four, toSU2_gaugeSU2Perm_apply] + repGauge gaugeSU2Perm (T ![1, 0, 0, 1]) = T ![0, 1, 1, 0] := + map_su2Perm_snd₃ (hT.repGauge_T gaugeSU2Perm) /-- The symmetric combination of the first zero-weight pair. -/ -def symComb₁ (hT : IsSU2QuadFundamental B repGauge T) : B := - T ![0, 0, 1, 1] + T ![1, 1, 0, 0] +def symComb₁ (T : (Fin 4 → Fin 2) → B) : B := T ![0, 0, 1, 1] + T ![1, 1, 0, 0] /-- The symmetric combination of the second zero-weight pair. -/ -def symComb₂ (hT : IsSU2QuadFundamental B repGauge T) : B := - T ![0, 1, 0, 1] + T ![1, 0, 1, 0] +def symComb₂ (T : (Fin 4 → Fin 2) → B) : B := T ![0, 1, 0, 1] + T ![1, 0, 1, 0] /-- The symmetric combination of the third zero-weight pair. -/ -def symComb₃ (hT : IsSU2QuadFundamental B repGauge T) : B := - T ![0, 1, 1, 0] + T ![1, 0, 0, 1] +def symComb₃ (T : (Fin 4 → Fin 2) → B) : B := T ![0, 1, 1, 0] + T ![1, 0, 0, 1] +omit [Algebra ℂ B] in /-- The second epsilon contraction is the difference of the first and third symmetric combinations. -/ -lemma epsilonContraction₁₃_eq_sub (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₃ = hT.symComb₁ - hT.symComb₃ := by +lemma epsilonContraction₁₃_eq_sub (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₃ T = symComb₁ T - symComb₃ T := by rw [epsilonContraction₁₃, symComb₁, symComb₃] abel +omit [Algebra ℂ B] in /-- The first epsilon contraction is the difference of the second and third symmetric combinations. -/ -lemma epsilonContraction₁₂_eq_sub (hT : IsSU2QuadFundamental B repGauge T) : - hT.epsilonContraction₁₂ = hT.symComb₂ - hT.symComb₃ := by +lemma epsilonContraction₁₂_eq_sub (T : (Fin 4 → Fin 2) → B) : + epsilonContraction₁₂ T = symComb₂ T - symComb₃ T := by rw [epsilonContraction₁₂, symComb₂, symComb₃] abel @@ -682,31 +780,31 @@ noncomputable def zeroPieceSU2Perm (hT : IsSU2QuadFundamental B repGauge T) (hmul : IsMulRep repGauge) : SU2PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) := SU2PermDecomposition.copy - (((swapPairSU2Perm hT.repGauge_gaugeSU2Perm_fst₁ - hT.repGauge_gaugeSU2Perm_snd₁).sup - (swapPairSU2Perm hT.repGauge_gaugeSU2Perm_fst₂ - hT.repGauge_gaugeSU2Perm_snd₂)).sup - (swapPairSU2Perm hT.repGauge_gaugeSU2Perm_fst₃ - hT.repGauge_gaugeSU2Perm_snd₃)) + (((swapPairSU2Perm (repGauge_gaugeSU2Perm_fst₁ hT) + (repGauge_gaugeSU2Perm_snd₁ hT)).sup + (swapPairSU2Perm (repGauge_gaugeSU2Perm_fst₂ hT) + (repGauge_gaugeSU2Perm_snd₂ hT))).sup + (swapPairSU2Perm (repGauge_gaugeSU2Perm_fst₃ hT) + (repGauge_gaugeSU2Perm_snd₃ hT))) _ (hT.gaugeWeightDecomposition_piece_zero hmul) /-- The grade-zero piece of the Weyl grading: the join of the three symmetric combinations. -/ lemma zeroPieceSU2Perm_piece_zero (hmul : IsMulRep repGauge) : (hT.zeroPieceSU2Perm hmul).piece 0 - = (ℂ ∙ hT.symComb₁ ⊔ ℂ ∙ hT.symComb₂) ⊔ ℂ ∙ hT.symComb₃ := rfl + = (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := rfl /-- Every gauge invariant in the span of the components lies in the join of the three symmetric combinations. This is what the two gradings alone can see, and it is one dimension larger than the truth. -/ -lemma mem_symComb_of_invariant (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) +lemma mem_symComb_of_invariant (hT : IsSU2QuadFundamental B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - x ∈ (ℂ ∙ hT.symComb₁ ⊔ ℂ ∙ hT.symComb₂) ⊔ ℂ ∙ hT.symComb₃ := by + x ∈ (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := by rw [← hT.zeroPieceSU2Perm_piece_zero hmul] exact SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv - /-! ## E. Cutting the sieve down to the epsilon contractions @@ -726,6 +824,13 @@ direction, while fixing the two contractions, and an invariant element is its ow This is the argument the Higgs sector runs at mass weight eight, where the same three directions appear as the quartic monomials and the Fierz identity closes the orbit. +The rotation is the element `cycSU2` of `specialUnitaryGroup (Fin 2) ℂ`, and the identity +that makes the argument work, `map_symCoeff_smul_add`, is proved for arbitrary maps moving +the components by it and by its square. The gauge group enters at the end, in the notion of +invariance being sieved: `cycAverage` averages the representation over the cyclic subgroup +generated by `cycGauge`, and an invariant element is fixed by every gauge element and so is +three times its own average. + -/ /-- The coefficient family of the neutral state of the isospin-two multiplet: the @@ -772,25 +877,29 @@ lemma cycMat_mem : cycMat ∈ specialUnitaryGroup (Fin 2) ℂ := by simp [Complex.ext_iff] norm_num -/-- The rotation by a third of a turn, as an element of the gauge group: trivial on colour - and hypercharge. -/ -noncomputable def cycGauge : GaugeGroupI := ⟨1, ⟨cycMat, cycMat_mem⟩, 1⟩ +/-- The rotation by a third of a turn, as an element of `SU(2)`. -/ +noncomputable def cycSU2 : specialUnitaryGroup (Fin 2) ℂ := ⟨cycMat, cycMat_mem⟩ -/-- The fundamental matrix of the rotation. -/ -lemma toSU2_cycGauge : (GaugeGroupI.toSU2 cycGauge).1 = cycMat := rfl +/-- The matrix of the rotation. -/ +lemma cycSU2_coe : (cycSU2 : specialUnitaryGroup (Fin 2) ℂ).1 = cycMat := rfl -/-- The fundamental matrix of its square. -/ -lemma toSU2_cycGauge_mul_self : - (GaugeGroupI.toSU2 (cycGauge * cycGauge)).1 = cycMatSq := by - have h : (GaugeGroupI.toSU2 (cycGauge * cycGauge)).1 = cycMat * cycMat := by - rw [map_mul] - rfl +/-- The matrix of the square of the rotation. -/ +lemma cycSU2_mul_self_coe : + (cycSU2 * cycSU2 : specialUnitaryGroup (Fin 2) ℂ).1 = cycMatSq := by + have h : (cycSU2 * cycSU2 : specialUnitaryGroup (Fin 2) ℂ).1 = cycMat * cycMat := rfl rw [h] ext a b fin_cases a <;> fin_cases b <;> simp [cycMat, cycMatSq, Matrix.mul_apply, Fin.sum_univ_two, Complex.ext_iff] <;> norm_num +/-- The rotation by a third of a turn, as an element of the gauge group: trivial on colour + and hypercharge. -/ +noncomputable def cycGauge : GaugeGroupI := ⟨1, cycSU2, 1⟩ + +/-- The `SU(2)` part of the rotation as a gauge element is the rotation. -/ +lemma toSU2_cycGauge : GaugeGroupI.toSU2 cycGauge = cycSU2 := rfl + set_option maxHeartbeats 1000000 in /-- The averaging identity, in coefficients. The neutral state of the isospin-two multiplet about the three isospin axes sums to zero, and the three summands here are that state @@ -806,13 +915,28 @@ lemma symCoeff_add_cyc_add_cycSq (a : Fin 4 → Fin 2) : /-- The neutral state of the isospin-two multiplet, as a linear combination of the components: the sum of the three symmetric combinations. -/ -lemma sum_symCoeff_smul (hT : IsSU2QuadFundamental B repGauge T) : +lemma sum_symCoeff_smul (T : (Fin 4 → Fin 2) → B) : ∑ l : Fin 4 → Fin 2, symCoeff l • T l - = hT.symComb₁ + hT.symComb₂ + hT.symComb₃ := by + = symComb₁ T + symComb₂ T + symComb₃ T := by rw [sum_pi_four, symComb₁, symComb₂, symComb₃] simp [symCoeff, Fin.sum_univ_two] abel +/-- The averaging identity, on the family. The neutral state of the isospin-two multiplet + is annihilated by the sum of the identity with any two maps moving the components by the + rotation and by its square. -/ +lemma map_symCoeff_smul_add {T : (Fin 4 → Fin 2) → B} {f₁ f₂ : B →ₗ[ℂ] B} + (hf₁ : IsSU2QuadFundamentalMat cycSU2 f₁ T) + (hf₂ : IsSU2QuadFundamentalMat (cycSU2 * cycSU2) f₂ T) : + (∑ l : Fin 4 → Fin 2, symCoeff l • T l) + + f₁ (∑ l : Fin 4 → Fin 2, symCoeff l • T l) + + f₂ (∑ l : Fin 4 → Fin 2, symCoeff l • T l) = 0 := by + rw [map_sum_smul hf₁ symCoeff, map_sum_smul hf₂ symCoeff] + simp only [cycSU2_coe, cycSU2_mul_self_coe] + rw [← Finset.sum_add_distrib, ← Finset.sum_add_distrib] + refine Finset.sum_eq_zero fun a _ => ?_ + rw [← add_smul, ← add_smul, symCoeff_add_cyc_add_cycSq a, zero_smul] + /-- Averaging over the cyclic group generated by the rotation by a third of a turn about the diagonal isospin axis. -/ noncomputable def cycAverage (repGauge : Representation ℂ GaugeGroupI B) : B →ₗ[ℂ] B := @@ -825,13 +949,10 @@ lemma cycAverage_apply (x : B) : /-- Averaging annihilates the neutral state of the isospin-two multiplet. -/ lemma cycAverage_symComb_sum (hT : IsSU2QuadFundamental B repGauge T) : - cycAverage repGauge (hT.symComb₁ + hT.symComb₂ + hT.symComb₃) = 0 := by - rw [← hT.sum_symCoeff_smul, cycAverage_apply, hT.repGauge_sum cycGauge symCoeff, - hT.repGauge_sum (cycGauge * cycGauge) symCoeff] - simp only [toSU2_cycGauge, toSU2_cycGauge_mul_self] - rw [← Finset.sum_add_distrib, ← Finset.sum_add_distrib] - refine Finset.sum_eq_zero fun a _ => ?_ - rw [← add_smul, ← add_smul, symCoeff_add_cyc_add_cycSq a, zero_smul] + cycAverage repGauge (symComb₁ T + symComb₂ T + symComb₃ T) = 0 := by + rw [← sum_symCoeff_smul T, cycAverage_apply] + exact map_symCoeff_smul_add (hT.repGauge_T cycGauge) + (hT.repGauge_T (cycGauge * cycGauge)) /-- Averaging fixes a gauge invariant three times over. -/ lemma cycAverage_of_invariant {x : B} (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : @@ -842,63 +963,63 @@ lemma cycAverage_of_invariant {x : B} (hinv : ∀ g : GaugeGroupI, repGauge g x /-- Averaging sends the third symmetric combination to minus the sum of the two epsilon contractions. The three averages are then all in the plane the contractions span. -/ lemma cycAverage_symComb₃ (hT : IsSU2QuadFundamental B repGauge T) : - cycAverage repGauge hT.symComb₃ - = -(hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃) := by - have h0 := hT.cycAverage_symComb_sum + cycAverage repGauge (symComb₃ T) + = -(epsilonContraction₁₂ T + epsilonContraction₁₃ T) := by + have h0 := cycAverage_symComb_sum hT rw [map_add, map_add] at h0 - have e1 : cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃ - = (3 : ℂ) • hT.epsilonContraction₁₃ := by - rw [← map_sub, ← hT.epsilonContraction₁₃_eq_sub, - cycAverage_of_invariant hT.repGauge_epsilonContraction₁₃] - have e2 : cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃ - = (3 : ℂ) • hT.epsilonContraction₁₂ := by - rw [← map_sub, ← hT.epsilonContraction₁₂_eq_sub, - cycAverage_of_invariant hT.repGauge_epsilonContraction₁₂] - have h5 : (3 : ℂ) • cycAverage repGauge hT.symComb₃ - = (3 : ℂ) • (-(hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃)) := by - rw [show ((3 : ℂ) • cycAverage repGauge hT.symComb₃) - = (cycAverage repGauge hT.symComb₁ + cycAverage repGauge hT.symComb₂ - + cycAverage repGauge hT.symComb₃) - - (cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃) - - (cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃) + have e1 : cycAverage repGauge (symComb₁ T) - cycAverage repGauge (symComb₃ T) + = (3 : ℂ) • epsilonContraction₁₃ T := by + rw [← map_sub, ← epsilonContraction₁₃_eq_sub, + cycAverage_of_invariant (repGauge_epsilonContraction₁₃ hT)] + have e2 : cycAverage repGauge (symComb₂ T) - cycAverage repGauge (symComb₃ T) + = (3 : ℂ) • epsilonContraction₁₂ T := by + rw [← map_sub, ← epsilonContraction₁₂_eq_sub, + cycAverage_of_invariant (repGauge_epsilonContraction₁₂ hT)] + have h5 : (3 : ℂ) • cycAverage repGauge (symComb₃ T) + = (3 : ℂ) • (-(epsilonContraction₁₂ T + epsilonContraction₁₃ T)) := by + rw [show ((3 : ℂ) • cycAverage repGauge (symComb₃ T)) + = (cycAverage repGauge (symComb₁ T) + cycAverage repGauge (symComb₂ T) + + cycAverage repGauge (symComb₃ T)) + - (cycAverage repGauge (symComb₁ T) - cycAverage repGauge (symComb₃ T)) + - (cycAverage repGauge (symComb₂ T) - cycAverage repGauge (symComb₃ T)) from by module, h0, e1, e2] module - have h7 : ((3 : ℂ)⁻¹ * 3) • cycAverage repGauge hT.symComb₃ - = ((3 : ℂ)⁻¹ * 3) • (-(hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃)) := by + have h7 : ((3 : ℂ)⁻¹ * 3) • cycAverage repGauge (symComb₃ T) + = ((3 : ℂ)⁻¹ * 3) • (-(epsilonContraction₁₂ T + epsilonContraction₁₃ T)) := by rw [mul_smul, mul_smul, h5] rwa [show ((3 : ℂ)⁻¹ * 3) = 1 from by norm_num, one_smul, one_smul] at h7 /-- Averaging sends the first symmetric combination into the plane spanned by the two epsilon contractions. -/ lemma cycAverage_symComb₁ (hT : IsSU2QuadFundamental B repGauge T) : - cycAverage repGauge hT.symComb₁ - = (3 : ℂ) • hT.epsilonContraction₁₃ - - (hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃) := by - have e1 : cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃ - = (3 : ℂ) • hT.epsilonContraction₁₃ := by - rw [← map_sub, ← hT.epsilonContraction₁₃_eq_sub, - cycAverage_of_invariant hT.repGauge_epsilonContraction₁₃] - have h3 := hT.cycAverage_symComb₃ - have hsplit : cycAverage repGauge hT.symComb₁ - = (cycAverage repGauge hT.symComb₁ - cycAverage repGauge hT.symComb₃) - + cycAverage repGauge hT.symComb₃ := by module + cycAverage repGauge (symComb₁ T) + = (3 : ℂ) • epsilonContraction₁₃ T + - (epsilonContraction₁₂ T + epsilonContraction₁₃ T) := by + have e1 : cycAverage repGauge (symComb₁ T) - cycAverage repGauge (symComb₃ T) + = (3 : ℂ) • epsilonContraction₁₃ T := by + rw [← map_sub, ← epsilonContraction₁₃_eq_sub, + cycAverage_of_invariant (repGauge_epsilonContraction₁₃ hT)] + have h3 := cycAverage_symComb₃ hT + have hsplit : cycAverage repGauge (symComb₁ T) + = (cycAverage repGauge (symComb₁ T) - cycAverage repGauge (symComb₃ T)) + + cycAverage repGauge (symComb₃ T) := by module rw [hsplit, e1, h3] module /-- Averaging sends the second symmetric combination into the plane spanned by the two epsilon contractions. -/ lemma cycAverage_symComb₂ (hT : IsSU2QuadFundamental B repGauge T) : - cycAverage repGauge hT.symComb₂ - = (3 : ℂ) • hT.epsilonContraction₁₂ - - (hT.epsilonContraction₁₂ + hT.epsilonContraction₁₃) := by - have e2 : cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃ - = (3 : ℂ) • hT.epsilonContraction₁₂ := by - rw [← map_sub, ← hT.epsilonContraction₁₂_eq_sub, - cycAverage_of_invariant hT.repGauge_epsilonContraction₁₂] - have h3 := hT.cycAverage_symComb₃ - have hsplit : cycAverage repGauge hT.symComb₂ - = (cycAverage repGauge hT.symComb₂ - cycAverage repGauge hT.symComb₃) - + cycAverage repGauge hT.symComb₃ := by module + cycAverage repGauge (symComb₂ T) + = (3 : ℂ) • epsilonContraction₁₂ T + - (epsilonContraction₁₂ T + epsilonContraction₁₃ T) := by + have e2 : cycAverage repGauge (symComb₂ T) - cycAverage repGauge (symComb₃ T) + = (3 : ℂ) • epsilonContraction₁₂ T := by + rw [← map_sub, ← epsilonContraction₁₂_eq_sub, + cycAverage_of_invariant (repGauge_epsilonContraction₁₂ hT)] + have h3 := cycAverage_symComb₃ hT + have hsplit : cycAverage repGauge (symComb₂ T) + = (cycAverage repGauge (symComb₂ T) - cycAverage repGauge (symComb₃ T)) + + cycAverage repGauge (symComb₃ T) := by module rw [hsplit, e2, h3] module @@ -906,26 +1027,27 @@ lemma cycAverage_symComb₂ (hT : IsSU2QuadFundamental B repGauge T) : three epsilon contractions. The gauge weight cuts the span down to the six components of vanishing weight, the Weyl element cuts those down to the three symmetric combinations, and averaging over the rotation cuts those down to the plane of the contractions. -/ -lemma mem_sup_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x : B} - (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - x ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := by - have hmem := hT.mem_symComb_of_invariant hmul hx hinv - have hI₁₂ : hT.epsilonContraction₁₂ - ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := +lemma mem_sup_epsilonContraction_of_invariant (hT : IsSU2QuadFundamental B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := by + have hmem := mem_symComb_of_invariant hT hmul hx hinv + have hI₁₂ : epsilonContraction₁₂ T + ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) - have hI₁₃ : hT.epsilonContraction₁₃ - ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := + have hI₁₃ : epsilonContraction₁₃ T + ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) have hmap : Submodule.map (cycAverage repGauge) - ((ℂ ∙ hT.symComb₁ ⊔ ℂ ∙ hT.symComb₂) ⊔ ℂ ∙ hT.symComb₃) - ≤ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := by + ((ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T) + ≤ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := by simp only [Submodule.map_sup, Submodule.map_span, Set.image_singleton] refine sup_le (sup_le ?_ ?_) ?_ <;> rw [Submodule.span_singleton_le_iff_mem] - · rw [hT.cycAverage_symComb₁] + · rw [cycAverage_symComb₁ hT] exact sub_mem (Submodule.smul_mem _ _ hI₁₃) (add_mem hI₁₂ hI₁₃) - · rw [hT.cycAverage_symComb₂] + · rw [cycAverage_symComb₂ hT] exact sub_mem (Submodule.smul_mem _ _ hI₁₂) (add_mem hI₁₂ hI₁₃) - · rw [hT.cycAverage_symComb₃] + · rw [cycAverage_symComb₃ hT] exact neg_mem (add_mem hI₁₂ hI₁₃) have hfin := hmap ⟨x, hmem, rfl⟩ rw [cycAverage_of_invariant hinv] at hfin @@ -934,11 +1056,13 @@ lemma mem_sup_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x : B} /-- Every gauge invariant in the span of the components is a linear combination of two of the three epsilon contractions, written out. -/ -lemma exists_smul_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x : B} - (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c₁ c₂ : ℂ, x = c₁ • hT.epsilonContraction₁₂ + c₂ • hT.epsilonContraction₁₃ := by +lemma exists_smul_epsilonContraction_of_invariant + (hT : IsSU2QuadFundamental B repGauge T) (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c₁ c₂ : ℂ, + x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T := by obtain ⟨y, hy, z, hz, rfl⟩ := - Submodule.mem_sup.1 (hT.mem_sup_epsilonContraction_of_invariant hmul hx hinv) + Submodule.mem_sup.1 (mem_sup_epsilonContraction_of_invariant hT hmul hx hinv) obtain ⟨c₁, rfl⟩ := Submodule.mem_span_singleton.1 hy obtain ⟨c₂, rfl⟩ := Submodule.mem_span_singleton.1 hz exact ⟨c₁, c₂, rfl⟩ @@ -947,17 +1071,18 @@ lemma exists_smul_epsilonContraction_of_invariant (hmul : IsMulRep repGauge) {x first two epsilon contractions. The three sieves of sections C, D and E bound them from above, and the contractions are themselves invariant and in the span, which bounds them from below. -/ -lemma mem_span_and_invariant_iff (hmul : IsMulRep repGauge) (x : B) : - (x ∈ hT.span ∧ ∀ g : GaugeGroupI, repGauge g x = x) - ↔ x ∈ ℂ ∙ hT.epsilonContraction₁₂ ⊔ ℂ ∙ hT.epsilonContraction₁₃ := by - refine ⟨fun h => hT.mem_sup_epsilonContraction_of_invariant hmul h.1 h.2, fun hx => ?_⟩ +lemma mem_span_and_invariant_iff (hT : IsSU2QuadFundamental B repGauge T) + (hmul : IsMulRep repGauge) (x : B) : + (x ∈ span T ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ x ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := by + refine ⟨fun h => mem_sup_epsilonContraction_of_invariant hT hmul h.1 h.2, fun hx => ?_⟩ obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.1 hx obtain ⟨c₁, rfl⟩ := Submodule.mem_span_singleton.1 hy obtain ⟨c₂, rfl⟩ := Submodule.mem_span_singleton.1 hz - refine ⟨add_mem (Submodule.smul_mem _ _ hT.epsilonContraction₁₂_mem_span) - (Submodule.smul_mem _ _ hT.epsilonContraction₁₃_mem_span), fun g => ?_⟩ - rw [map_add, map_smul, map_smul, hT.repGauge_epsilonContraction₁₂ g, - hT.repGauge_epsilonContraction₁₃ g] + refine ⟨add_mem (Submodule.smul_mem _ _ (epsilonContraction₁₂_mem_span T)) + (Submodule.smul_mem _ _ (epsilonContraction₁₃_mem_span T)), fun g => ?_⟩ + rw [map_add, map_smul, map_smul, repGauge_epsilonContraction₁₂ hT g, + repGauge_epsilonContraction₁₃ hT g] end Decomposition diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 91e85017b..2568609bb 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition +public import Mathlib.Algebra.TrivSqZeroExt.Basic /-! # Gauge tensors carrying two `su(3)` adjoint indices @@ -25,9 +26,20 @@ contraction, which is the natural gauge invariant built from two adjoint indices section C the gauge weight decomposition of the span. Section D grades the zero-weight piece of that decomposition by the cyclic colour rotation, which is what the gauge weight alone cannot do, and section E upgrades that grading to the isotypic decomposition of the -whole Weyl group `S₃`, in which the trace contraction lands in the trivial isotype. The row -orthonormality of the `su(3)` block of `adjointMatrix` that section B rests on is proved -where the matrix is defined, in `GaugeAlgebra.Basis`. +whole Weyl group `S₃`, in which the trace contraction lands in the trivial isotype. Those +four sections are all built from the normaliser of the torus, and they stop two dimensions +short. Section F leaves the normaliser behind: a quarter turn in the `SU(2)` of the first +two colours carries a Cartan direction to a root direction, which no element of the +normaliser does, and that cuts the two lines section E leaves down to the one line through +the trace contraction. So `mem_span_and_invariant_iff` says the gauge invariants in the +span are exactly the multiples of the trace contraction, the single singlet of `8 ⊗ 8`. +Sections F.4 and F.5 shed the hypotheses that classification is stated under. The trivial +square-zero extension of a module is an algebra on which every representation acts by +algebra maps, so the classification needs no algebra structure and no multiplicativity at +all, and it then descends to the quotient by a gauge-stable submodule, which is +`mem_span_sup_invariant_iff`. The row orthonormality of the `su(3)` block of +`adjointMatrix` that section B rests on is proved where the matrix is defined, in +`GaugeAlgebra.Basis`. -/ @[expose] public section @@ -52,6 +64,11 @@ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inl (a i)) (Sum.inl (l i)) : ℝ) : ℂ)) • T a +TODO (lines := 56-60) "The `g` in this expression should only + be the `SU(3)` part of this gauge group, and this hypothesis should + only be about how that part acts. The same is true for + every other result in this file." + namespace IsSU3BiAdjoint set_option linter.unusedVariables false @@ -223,6 +240,9 @@ lemma exists_rootPair_or_cartanId (a : Fin 8) : revert a decide +TODO (lines := 195-235) "All of these should be in a more general file + in the GaugeAlgebra section." + /-! ## C.2. The adjoint matrix of a torus generator in the weight basis @@ -1351,10 +1371,9 @@ lemma zeroPieceSU3Perm_piece (hmul : IsMulRep repGauge) (k : ZMod 3) : subgroup of the Weyl group. Section E cuts these four lines down to two, the trivial isotype of the whole Weyl group, by separating the two combinations of them that the transposition fixes from the two it negates. That is as far as a finite group takes the - argument; deciding which elements of those two lines are genuinely gauge invariant needs - the continuous part of `GaugeGroupI` — for instance averaging a general element of the - piece over the gauge orbit, the way `IsQuadLorentz` uses boost and rotation averages to - pin down its own Lorentz invariants. -/ + argument; section F leaves the normaliser of the torus behind and cuts those two lines + down to one, by a quarter turn in the `SU(2)` of the first two colours, which carries a + Cartan direction to a root direction outright. -/ lemma zeroPiece_zero : hT.zeroPiece 0 = ℂ ∙ cycleEigen (hT.prodCycle 0) 0 ⊔ ℂ ∙ cycleEigen (hT.prodCycle 1) 0 @@ -1428,8 +1447,9 @@ well as the two nonzero grades. It remains a sieve: gauge weight and the Weyl group together decide invariance under the normaliser of the torus and nothing more. `rootTriv_add_cartanTriv` measures what is left over: the trace contraction is half the sum of the two generators of the trivial isotype, and nothing here -says anything about the other combinations of those two generators. Deciding which of them -are gauge invariant needs the continuous part of `GaugeGroupI`, not another finite group. +says anything about the other combinations of those two generators. Which of them are gauge +invariant is settled in section F, by an element of `SU(3)` that does not normalise the +torus; no finite group settles it. ## E.1. The transposition on the Gell-Mann directions and the weight vectors @@ -1859,12 +1879,623 @@ lemma traceContraction_mem_isotypic_triv (hmul : IsMulRep repGauge) : dimensions of the zero-weight piece, the gauge weight and the Weyl group together confine it to two. By `rootTriv_add_cartanTriv` it is half the sum of the two generators, so it is one particular element of that join; which other elements of the join are gauge invariant - is not decided here. -/ + is settled in section F, where the answer turns out to be only its own multiples. -/ lemma traceContraction_mem_span_triv (hmul : IsMulRep repGauge) : hT.traceContraction ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by rw [← hT.zeroPieceSU3Weyl_isotypic_triv hmul] exact hT.traceContraction_mem_isotypic_triv hmul +/-! + +## F. Closing the gap with a quarter turn + +Everything from section C to section E is a sieve built from the normaliser of the torus, +and all of it stops at two dimensions because it must: `rootTriv` and `cartanTriv` are +separately fixed by the torus and by the whole Weyl group, so no element of `N(T)` can tell +a general combination of the two from the trace contraction. The tensor square `8 ⊗ 8` of +the `su(3)` adjoint decomposes as `1 ⊕ 8 ⊕ 8 ⊕ 10 ⊕ 10̄ ⊕ 27` and so carries exactly one +singlet: the truth is one dimension, and reaching it needs an element of the gauge group +that does not normalise the torus. + +Section F.1 exhibits one, and the choice is forced by the Gell-Mann conventions. The +directions `0`, `1` and `2`, that is `λ₁`, `λ₂` and `λ₃`, span an `su(2)` acting on the +first two colours, and the adjoint action of the matching `SU(2)` subgroup on that triple +is the rotation group `SO(3)`. A quarter turn there carries the Cartan direction `λ₃` to a +root direction outright, which is exactly what no element of `N(T)` can do. Two turns are +needed, one landing on `λ₁` and one on `λ₂`, because the Weyl group preserves the split of +the six root directions into those two classes. Section F.2 computes what the two turns do +to `rootTriv` and to `cartanTriv`: they move weight between the six root diagonal terms and +the two Cartan ones while preserving the total, which is `2 • traceContraction`. Section +F.3 turns that into the statement that the gauge invariants in the span are exactly the +multiples of the trace contraction. + +## F.1. A quarter turn in the `SU(2)` of the first two colours + +Written in the first two colours a quarter turn is the block `!![u, v; -conj v, conj u]` +with `u` and `v` of equal modulus. Taking `u = (1 + i) / 2` keeps every entry a Gaussian +rational, so no square roots enter, and the two values `v = (1 - i) / 2` and +`v = (1 + i) / 2` give the two turns wanted. The conjugate of `λ₃` by such a block is +`-2 u v` off the diagonal and nothing on it, since `u` and `v` have equal modulus; the +conjugate of `λ₈` is `λ₈`, since `λ₈` is a multiple of the identity on the first two +colours. + +-/ + +/-- The matrix of a quarter turn in the `SU(2)` subgroup of the first two colours: the + block `!![u, v; -conj v, conj u]` at `u = (1 + i) / 2`, with the third colour fixed. -/ +noncomputable def su3TurnMatrix (v : ℂ) : Matrix (Fin 3) (Fin 3) ℂ := + !![(1 + Complex.I) / 2, v, 0; -(starRingEnd ℂ) v, (1 - Complex.I) / 2, 0; 0, 0, 1] + +/-- The star of a quarter turn matrix is the quarter turn matrix of the opposite turn. -/ +lemma star_su3TurnMatrix (v : ℂ) : + star (su3TurnMatrix v) + = !![(1 - Complex.I) / 2, -v, 0; (starRingEnd ℂ) v, (1 + Complex.I) / 2, 0; 0, 0, 1] := by + ext i j + fin_cases i <;> fin_cases j <;> simp [su3TurnMatrix, Complex.ext_iff] + +/-- A quarter turn matrix lies in `SU(3)` precisely when its off-diagonal entry has the + same modulus as its diagonal one. Unitarity is the length of each row, and the + determinant is that same length. -/ +lemma su3TurnMatrix_mem {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + su3TurnMatrix v ∈ specialUnitaryGroup (Fin 3) ℂ := by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff, star_su3TurnMatrix] + ext i j + fin_cases i <;> fin_cases j <;> + simp [su3TurnMatrix, Matrix.mul_apply, Fin.sum_univ_three] + all_goals first + | ring1 + | linear_combination hv - (1 / 4 : ℂ) * Complex.I_sq + · rw [Matrix.det_fin_three] + simp [su3TurnMatrix] + all_goals first + | ring1 + | linear_combination hv - (1 / 4 : ℂ) * Complex.I_sq + +/-- A quarter turn as an element of `SU(3)`. -/ +noncomputable def su3Turn (v : ℂ) (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + specialUnitaryGroup (Fin 3) ℂ := ⟨su3TurnMatrix v, su3TurnMatrix_mem hv⟩ + +/-- A quarter turn as a gauge transformation: trivial on isospin and hypercharge. -/ +noncomputable def gaugeSU3Turn (v : ℂ) (hv : v * (starRingEnd ℂ) v = 2⁻¹) : GaugeGroupI := + ⟨su3Turn v hv, 1, 1⟩ + +/-- Conjugating the first Cartan direction by a quarter turn: the diagonal of the result + cancels, since the two entries of the turn have the same modulus, and what is left is a + combination of the two members of the first root pair. -/ +lemma conj_gellMannMatrix_two_gaugeSU3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + (gaugeSU3Turn v hv).toSU3.1 * gellMannMatrix 2 * star (gaugeSU3Turn v hv).toSU3.1 + = !![0, -((1 + Complex.I) * v), 0; + -((1 - Complex.I) * (starRingEnd ℂ) v), 0, 0; + 0, 0, 0] := by + rw [show (gaugeSU3Turn v hv).toSU3.1 = su3TurnMatrix v from rfl, star_su3TurnMatrix] + ext i j + fin_cases i <;> fin_cases j <;> + simp [su3TurnMatrix, gellMannMatrix_two, Matrix.mul_apply, Fin.sum_univ_three] + all_goals first + | ring1 + | linear_combination hv - (1 / 4 : ℂ) * Complex.I_sq + | linear_combination -hv + (1 / 4 : ℂ) * Complex.I_sq + | linear_combination hv + (1 / 4 : ℂ) * Complex.I_sq + | linear_combination -hv - (1 / 4 : ℂ) * Complex.I_sq + +/-- A quarter turn fixes the diagonal matrix behind the second Cartan direction: on the + first two colours that matrix is a multiple of the identity, and the third colour is + fixed. -/ +lemma conj_diag_su3TurnMatrix {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + su3TurnMatrix v * !![1, 0, 0; 0, 1, 0; 0, 0, -2] * star (su3TurnMatrix v) + = !![1, 0, 0; 0, 1, 0; 0, 0, -2] := by + rw [star_su3TurnMatrix] + ext i j + fin_cases i <;> fin_cases j <;> + simp [su3TurnMatrix, Matrix.mul_apply, Fin.sum_univ_three] + all_goals first + | ring1 + | linear_combination hv - (1 / 4 : ℂ) * Complex.I_sq + +/-- Conjugating the second Cartan direction by a quarter turn leaves it alone. -/ +lemma conj_gellMannMatrix_seven_gaugeSU3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + (gaugeSU3Turn v hv).toSU3.1 * gellMannMatrix 7 * star (gaugeSU3Turn v hv).toSU3.1 + = gellMannMatrix 7 := by + rw [show (gaugeSU3Turn v hv).toSU3.1 = su3TurnMatrix v from rfl, gellMannMatrix_seven, + Matrix.mul_smul, Matrix.smul_mul, conj_diag_su3TurnMatrix hv] + +/-- The first quarter turn, at `v = (1 - i) / 2`: it carries `λ₃` to `-λ₁`. -/ +noncomputable def gaugeSU3TurnFst : GaugeGroupI := + gaugeSU3Turn ((1 - Complex.I) / 2) + (by rw [map_div₀, map_sub, map_one, Complex.conj_I, map_ofNat] + linear_combination (-1 / 4 : ℂ) * Complex.I_sq) + +/-- The second quarter turn, at `v = (1 + i) / 2`: it carries `λ₃` to `λ₂`. -/ +noncomputable def gaugeSU3TurnSnd : GaugeGroupI := + gaugeSU3Turn ((1 + Complex.I) / 2) + (by rw [map_div₀, map_add, map_one, Complex.conj_I, map_ofNat] + linear_combination (-1 / 4 : ℂ) * Complex.I_sq) + +/-- The first quarter turn on the first Cartan coordinate direction: it lands on the first + member of the first root pair, up to sign. This is the step no element of the normaliser + of the torus can take. -/ +lemma rowAct_gaugeSU3TurnFst_unitVec_two : + rowAct gaugeSU3TurnFst (unitVec 2) = -unitVec 0 := by + funext a + rw [gaugeSU3TurnFst, rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, + conj_gellMannMatrix_two_gaugeSU3Turn] + fin_cases a <;> simp [gellMannCoeff, unitVec] + all_goals norm_num + +/-- The second quarter turn on the first Cartan coordinate direction: it lands on the + second member of the first root pair. The two turns are both needed, since the Weyl group + never mixes the two members of a root pair with each other. -/ +lemma rowAct_gaugeSU3TurnSnd_unitVec_two : + rowAct gaugeSU3TurnSnd (unitVec 2) = unitVec 1 := by + funext a + rw [gaugeSU3TurnSnd, rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, + conj_gellMannMatrix_two_gaugeSU3Turn] + fin_cases a <;> simp [gellMannCoeff, unitVec] + all_goals norm_num + +/-- A quarter turn fixes the second Cartan coordinate direction. -/ +lemma rowAct_gaugeSU3Turn_unitVec_seven {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + rowAct (gaugeSU3Turn v hv) (unitVec 7) = unitVec 7 := by + have h3 : Real.sqrt 3 ≠ 0 := ne_of_gt (Real.sqrt_pos.mpr (by norm_num)) + funext a + rw [rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, + conj_gellMannMatrix_seven_gaugeSU3Turn hv] + fin_cases a <;> simp [gellMannCoeff, gellMannMatrix_seven, unitVec] + field_simp + rw [← Complex.ofReal_pow, Real.sq_sqrt (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + +/-- The first quarter turn fixes the second Cartan coordinate direction. -/ +lemma rowAct_gaugeSU3TurnFst_unitVec_seven : + rowAct gaugeSU3TurnFst (unitVec 7) = unitVec 7 := by + rw [gaugeSU3TurnFst] + exact rowAct_gaugeSU3Turn_unitVec_seven _ + +/-- The second quarter turn fixes the second Cartan coordinate direction. -/ +lemma rowAct_gaugeSU3TurnSnd_unitVec_seven : + rowAct gaugeSU3TurnSnd (unitVec 7) = unitVec 7 := by + rw [gaugeSU3TurnSnd] + exact rowAct_gaugeSU3Turn_unitVec_seven _ + + +/-! + +## F.2. The two turns on the two trivial lines + +`cartanTriv` is twice the sum of the two Cartan diagonal components `T ![2, 2]` and +`T ![7, 7]`, and `rootTriv` twice the sum of the six root ones. A quarter turn fixes +`T ![7, 7]` and carries `T ![2, 2]` to a root diagonal component, so it moves the weight +`2 • (T ![2, 2] - T ![0, 0])` out of `cartanTriv` and exactly the same weight into +`rootTriv`, leaving their sum `2 • traceContraction` alone, as it must, that sum being +gauge invariant. This is the mixing no element of the normaliser of the torus can produce, +and it is what a bare grading cannot see. + +One turn ties one root diagonal component to the Cartan pair; the six of them are reached +by pushing the two base relations through the cyclic colour rotation of section D. +`cartanTurn` records the three directions that rotation moves `λ₃` through, one Cartan +direction of each of the three colour pairs, and `biVec_cartanTurn_sum` says that the three +products they make add up to `3 / 2` times the Cartan pair. So the six root diagonal +components sum to three times that pair, and the trace contraction, which is the six of +them plus the pair, to four times it. + +-/ + +/-- The first quarter turn on the Cartan pair of diagonal components: the second is fixed, + and the first is carried to the diagonal component of the first root direction. -/ +lemma repGauge_gaugeSU3TurnFst_cartanPair (hT : IsSU3BiAdjoint B repGauge T) : + repGauge gaugeSU3TurnFst (T ![2, 2] + T ![7, 7]) = T ![0, 0] + T ![7, 7] := by + rw [← hT.biVec_unitVec 2 2, ← hT.biVec_unitVec 7 7, map_add, hT.repGauge_biVec, + hT.repGauge_biVec, rowAct_gaugeSU3TurnFst_unitVec_two, + rowAct_gaugeSU3TurnFst_unitVec_seven, hT.biVec_neg_neg, hT.biVec_unitVec, + hT.biVec_unitVec] + +/-- The second quarter turn on the Cartan pair of diagonal components. -/ +lemma repGauge_gaugeSU3TurnSnd_cartanPair (hT : IsSU3BiAdjoint B repGauge T) : + repGauge gaugeSU3TurnSnd (T ![2, 2] + T ![7, 7]) = T ![1, 1] + T ![7, 7] := by + rw [← hT.biVec_unitVec 2 2, ← hT.biVec_unitVec 7 7, map_add, hT.repGauge_biVec, + hT.repGauge_biVec, rowAct_gaugeSU3TurnSnd_unitVec_two, + rowAct_gaugeSU3TurnSnd_unitVec_seven, hT.biVec_unitVec, hT.biVec_unitVec] + +/-- The first quarter turn on the symmetric Cartan combination: one of its two diagonal + components becomes a root one, so it leaves the line it spans. -/ +lemma repGauge_gaugeSU3TurnFst_cartanTriv : + repGauge gaugeSU3TurnFst hT.cartanTriv = (2 : ℂ) • (T ![0, 0] + T ![7, 7]) := by + rw [hT.cartanTriv_eq, map_smul, hT.repGauge_gaugeSU3TurnFst_cartanPair] + +/-- The second quarter turn on the symmetric Cartan combination. -/ +lemma repGauge_gaugeSU3TurnSnd_cartanTriv : + repGauge gaugeSU3TurnSnd hT.cartanTriv = (2 : ℂ) • (T ![1, 1] + T ![7, 7]) := by + rw [hT.cartanTriv_eq, map_smul, hT.repGauge_gaugeSU3TurnSnd_cartanPair] + +/-- The first quarter turn on the symmetric root combination: it gains exactly the weight + the symmetric Cartan combination loses, the two together summing to twice the gauge + invariant trace contraction. -/ +lemma repGauge_gaugeSU3TurnFst_rootTriv : + repGauge gaugeSU3TurnFst hT.rootTriv + = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![0, 0]) := by + have hr : hT.rootTriv = (2 : ℂ) • hT.traceContraction - hT.cartanTriv := + eq_sub_of_add_eq hT.rootTriv_add_cartanTriv + rw [hr, map_sub, map_smul, hT.repGauge_traceContraction, + hT.repGauge_gaugeSU3TurnFst_cartanTriv, hT.cartanTriv_eq] + module + +/-- The second quarter turn on the symmetric root combination. -/ +lemma repGauge_gaugeSU3TurnSnd_rootTriv : + repGauge gaugeSU3TurnSnd hT.rootTriv + = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![1, 1]) := by + have hr : hT.rootTriv = (2 : ℂ) • hT.traceContraction - hT.cartanTriv := + eq_sub_of_add_eq hT.rootTriv_add_cartanTriv + rw [hr, map_sub, map_smul, hT.repGauge_traceContraction, + hT.repGauge_gaugeSU3TurnSnd_cartanTriv, hT.cartanTriv_eq] + module + +/-- The three coordinate directions the cyclic colour rotation moves the first Cartan + direction through: one Cartan direction for each of the three colour pairs. -/ +noncomputable def cartanTurn : Fin 3 → Fin 8 → ℂ + | 0 => unitVec 2 + | 1 => (-(2 : ℂ)⁻¹) • unitVec 2 + (((Real.sqrt 3 : ℝ) : ℂ) / 2) • unitVec 7 + | 2 => (-(2 : ℂ)⁻¹) • unitVec 2 - (((Real.sqrt 3 : ℝ) : ℂ) / 2) • unitVec 7 + +/-- The cycle starts at the first Cartan coordinate direction. -/ +lemma cartanTurn_zero : cartanTurn 0 = unitVec 2 := rfl + +/-- The cyclic colour rotation moves each of the three directions one step along the + cycle. -/ +lemma rowAct_gaugeSU3Perm_cartanTurn (i : Fin 3) : + rowAct gaugeSU3Perm (cartanTurn i) = cartanTurn (i + 1) := by + have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by + rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + fin_cases i + · show rowAct gaugeSU3Perm (cartanTurn 0) = cartanTurn 1 + simp only [cartanTurn, rowAct_gaugeSU3Perm_unitVec, permCol] + · show rowAct gaugeSU3Perm (cartanTurn 1) = cartanTurn 2 + simp only [cartanTurn, rowAct_add, rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol] + match_scalars + all_goals first + | ring1 + | linear_combination (-(1 : ℂ) / 4) * h3 + · show rowAct gaugeSU3Perm (cartanTurn 2) = cartanTurn 0 + simp only [cartanTurn, rowAct_sub, rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol] + match_scalars + all_goals first + | ring1 + | linear_combination ((1 : ℂ) / 4) * h3 + +/-- The three products the cycle makes add up to `3 / 2` times the Cartan pair: the three + Cartan directions of the three colour pairs are not independent, and what survives the + sum is the pair of diagonal components the torus already sees. -/ +lemma biVec_cartanTurn_sum : + hT.biVec (cartanTurn 0) (cartanTurn 0) + hT.biVec (cartanTurn 1) (cartanTurn 1) + + hT.biVec (cartanTurn 2) (cartanTurn 2) + = ((3 : ℂ) / 2) • (T ![2, 2] + T ![7, 7]) := by + have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by + rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + simp only [cartanTurn, hT.biVec_add_left, hT.biVec_sub_left, hT.biVec_smul_left, + hT.biVec_add_right, hT.biVec_sub_right, hT.biVec_smul_right, hT.biVec_unitVec] + match_scalars + all_goals first + | ring1 + | linear_combination ((1 : ℂ) / 2) * h3 + +/-- A multiple of the Cartan pair that is gauge invariant is a quarter of the same multiple + of the trace contraction. The two quarter turns tie the first two root diagonal + components to the Cartan pair, and the cyclic colour rotation carries those two relations + to the remaining four. -/ +lemma smul_traceContraction_eq_of_invariant (f : ℂ) + (hinv : ∀ g : GaugeGroupI, repGauge g (f • (T ![2, 2] + T ![7, 7])) + = f • (T ![2, 2] + T ![7, 7])) : + f • hT.traceContraction = (4 : ℂ) • (f • (T ![2, 2] + T ![7, 7])) := by + have hperm : ∀ c₀ c₁ : Fin 8 → ℂ, f • hT.biVec c₀ c₀ = f • hT.biVec c₁ c₁ → + f • hT.biVec (rowAct gaugeSU3Perm c₀) (rowAct gaugeSU3Perm c₀) + = f • hT.biVec (rowAct gaugeSU3Perm c₁) (rowAct gaugeSU3Perm c₁) := by + intro c₀ c₁ h + have h' := congrArg (repGauge gaugeSU3Perm) h + rwa [map_smul, map_smul, hT.repGauge_biVec, hT.repGauge_biVec] at h' + have hbase : ∀ g : GaugeGroupI, ∀ y : B, + repGauge g (T ![2, 2] + T ![7, 7]) = y + T ![7, 7] → f • y = f • T ![2, 2] := by + intro g y hg + have h := hinv g + rw [map_smul, hg, smul_add, smul_add] at h + exact add_right_cancel h + have hA0 : f • hT.biVec (unitVec 0) (unitVec 0) + = f • hT.biVec (cartanTurn 0) (cartanTurn 0) := by + rw [cartanTurn_zero, hT.biVec_unitVec, hT.biVec_unitVec] + exact hbase _ _ hT.repGauge_gaugeSU3TurnFst_cartanPair + have hB0 : f • hT.biVec (unitVec 1) (unitVec 1) + = f • hT.biVec (cartanTurn 0) (cartanTurn 0) := by + rw [cartanTurn_zero, hT.biVec_unitVec, hT.biVec_unitVec] + exact hbase _ _ hT.repGauge_gaugeSU3TurnSnd_cartanPair + have hA1 : f • hT.biVec (unitVec 5) (unitVec 5) + = f • hT.biVec (cartanTurn 1) (cartanTurn 1) := by + have h := hperm _ _ hA0 + rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + show ((0 : Fin 3) + 1) = 1 from rfl, show permCol 0 = unitVec 5 from rfl] at h + have hB1 : f • hT.biVec (unitVec 6) (unitVec 6) + = f • hT.biVec (cartanTurn 1) (cartanTurn 1) := by + have h := hperm _ _ hB0 + rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + show ((0 : Fin 3) + 1) = 1 from rfl, show permCol 1 = unitVec 6 from rfl] at h + have hA2 : f • hT.biVec (unitVec 3) (unitVec 3) + = f • hT.biVec (cartanTurn 2) (cartanTurn 2) := by + have h := hperm _ _ hA1 + rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + show ((1 : Fin 3) + 1) = 2 from rfl, show permCol 5 = unitVec 3 from rfl] at h + have hB2 : f • hT.biVec (unitVec 4) (unitVec 4) + = f • hT.biVec (cartanTurn 2) (cartanTurn 2) := by + have h := hperm _ _ hB1 + rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + show ((1 : Fin 3) + 1) = 2 from rfl, show permCol 6 = -unitVec 4 from rfl, + hT.biVec_neg_neg] at h + simp only [hT.biVec_unitVec] at hA0 hB0 hA1 hB1 hA2 hB2 + rw [traceContraction, Fin.sum_univ_eight, smul_add, smul_add, smul_add, smul_add, + smul_add, smul_add, smul_add, hA0, hB0, hA1, hB1, hA2, hB2] + linear_combination (norm := module) (2 * f) • hT.biVec_cartanTurn_sum + + +/-! + +## F.3. The gauge invariants in the span + +A gauge invariant in the span is of trivial isotype by section E, so it is a combination +`a • rootTriv + b • cartanTriv`. Subtracting the right multiple of the trace contraction +leaves a multiple of `cartanTriv` alone, still gauge invariant, and F.2 says such a multiple +is a multiple of the trace contraction as well. So the two lines the finite group left +collapse to one, which is the one singlet of `8 ⊗ 8`, and the containment of section B +becomes an equality. + +-/ + +/-- Every gauge invariant in the span of the components is a multiple of the trace + contraction. The gauge weight, the cyclic colour rotation and the Weyl group cut the span + down to the two lines through `rootTriv` and `cartanTriv`, and the quarter turns of F.1 + cut those two down to one. -/ +lemma exists_smul_traceContraction_of_invariant (hT : IsSU3BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, x = c • hT.traceContraction := by + have hmem : x ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by + rw [← hT.zeroPieceSU3Weyl_isotypic_triv hmul] + exact SU3WeylDecomposition.mem_triv_of_invariant _ + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv + obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.1 hmem + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + obtain ⟨b, rfl⟩ := Submodule.mem_span_singleton.1 hz + have hrt := hT.rootTriv_add_cartanTriv + have hct := hT.cartanTriv_eq + have hE : ((b - a) * 2) • (T ![2, 2] + T ![7, 7]) + = (a • hT.rootTriv + b • hT.cartanTriv) - (2 * a) • hT.traceContraction := by + linear_combination (norm := module) (-a) • hrt + (a - b) • hct + have hinvC : ∀ g : GaugeGroupI, + repGauge g (((b - a) * 2) • (T ![2, 2] + T ![7, 7])) + = ((b - a) * 2) • (T ![2, 2] + T ![7, 7]) := by + intro g + rw [hE, map_sub, map_smul, hinv g, hT.repGauge_traceContraction] + have hkey := hT.smul_traceContraction_eq_of_invariant ((b - a) * 2) hinvC + exact ⟨2 * a + (b - a) / 2, by + linear_combination (norm := module) a • hrt + (b - a) • hct + (-1 / 4 : ℂ) • hkey⟩ + +/-- The gauge invariants in the span of the components are exactly the multiples of the + trace contraction. The three sieves of sections C, D and E together with the quarter turns + of section F bound them from above, and the trace contraction is itself invariant and in + the span, which bounds them from below. This is the one singlet of `8 ⊗ 8`. -/ +lemma mem_span_and_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) + (x : B) : + (x ∈ hT.span ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ x ∈ ℂ ∙ hT.traceContraction := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_invariant hmul h.1 h.2 + exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ + · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx + exact ⟨Submodule.smul_mem _ _ hT.traceContraction_mem_span, + fun g => by rw [map_smul, hT.repGauge_traceContraction]⟩ + +/-! + +## F.4. The trivial square-zero extension of a module + +Section F.3 asks for a ring: `IsMulRep` is a statement about multiplication, and the +decomposition machinery of sections C to E is set up in an algebra. The conclusion asks +for none of that, and the gap can be closed once and for all. The trivial square-zero +extension `TrivSqZeroExt ℂ M` of a module `M` is a commutative `ℂ`-algebra built from the +module structure alone, a representation on `M` extends to it by acting trivially on the +scalar part, and that extension acts by algebra maps for free. So F.3 holds in the +extension, and the injection of `M` carries the conclusion back: +`exists_smul_traceContraction_of_invariant_module` is F.3 with the algebra structure and +the multiplicativity hypothesis both removed. + +-/ + +section SquareZero + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {U : (Fin 2 → Fin 8) → M} + +/-- The opposite scalar action on a complex vector space, which the square-zero extension + needs to be a ring. Since `ℂ` is commutative it is the given action read through `unop`, + and it is given a low priority so that the action of `ℂ` on itself is unaffected. -/ +noncomputable local instance (priority := 100) opModule : Module ℂᵐᵒᵖ M := + Module.compHom M ((RingHom.id ℂ).fromOpposite fun x y => mul_comm x y) + +/-- The two scalar actions of `ℂ` on a complex vector space commute. -/ +local instance (priority := 100) smulCommClassOpModule : SMulCommClass ℂ ℂᵐᵒᵖ M := + ⟨fun a b m => smul_comm a b.unop m⟩ + +/-- The opposite scalar action agrees with the given one, `ℂ` being commutative. -/ +local instance (priority := 100) isCentralScalarOpModule : IsCentralScalar ℂ M := + ⟨fun _ _ => rfl⟩ + +/-- The linear map of the square-zero extension induced by a linear map of the module: the + identity on the scalar part and the given map on the module part. -/ +def sqZeroMap (f : M →ₗ[ℂ] M) : TrivSqZeroExt ℂ M →ₗ[ℂ] TrivSqZeroExt ℂ M where + toFun u := TrivSqZeroExt.inl u.fst + TrivSqZeroExt.inr (f u.snd) + map_add' u v := by + refine TrivSqZeroExt.ext ?_ ?_ <;> simp + map_smul' c u := by + refine TrivSqZeroExt.ext ?_ ?_ <;> simp + +/-- The induced map leaves the scalar part alone. -/ +@[simp] +lemma fst_sqZeroMap (f : M →ₗ[ℂ] M) (u : TrivSqZeroExt ℂ M) : + (sqZeroMap f u).fst = u.fst := by + simp [sqZeroMap] + +/-- The induced map acts by the given map on the module part. -/ +@[simp] +lemma snd_sqZeroMap (f : M →ₗ[ℂ] M) (u : TrivSqZeroExt ℂ M) : + (sqZeroMap f u).snd = f u.snd := by + simp [sqZeroMap] + +/-- The representation carried by the square-zero extension: trivial on the scalar part + and the given representation on the module part. -/ +def sqZeroRep (ρ : Representation ℂ GaugeGroupI M) : + Representation ℂ GaugeGroupI (TrivSqZeroExt ℂ M) where + toFun g := sqZeroMap (ρ g) + map_one' := by + refine LinearMap.ext fun u => TrivSqZeroExt.ext ?_ ?_ <;> simp + map_mul' g₁ g₂ := by + refine LinearMap.ext fun u => TrivSqZeroExt.ext ?_ ?_ <;> simp [Module.End.mul_apply] + +/-- The extended representation on the image of the module is the given one. -/ +@[simp] +lemma sqZeroRep_inr (ρ : Representation ℂ GaugeGroupI M) (g : GaugeGroupI) (m : M) : + sqZeroRep ρ g (TrivSqZeroExt.inr m) = TrivSqZeroExt.inr (ρ g m) := by + refine TrivSqZeroExt.ext ?_ ?_ <;> simp [sqZeroRep] + +/-- The extended representation acts by algebra maps, whatever the representation it + extends: the product of the extension is built from the module structure, which the + representation is linear for. -/ +lemma isMulRep_sqZeroRep (ρ : Representation ℂ GaugeGroupI M) : IsMulRep (sqZeroRep ρ) := by + intro g u v + refine TrivSqZeroExt.ext ?_ ?_ + · simp [sqZeroRep] + · simp [sqZeroRep, TrivSqZeroExt.snd_mul, op_smul_eq_smul] + +/-- The images of the components in the square-zero extension again form a bi-adjoint + family. -/ +lemma isSU3BiAdjoint_sqZeroRep (hU : IsSU3BiAdjoint M ρ U) : + IsSU3BiAdjoint (TrivSqZeroExt ℂ M) (sqZeroRep ρ) fun l => TrivSqZeroExt.inr (U l) where + repGauge_T g l := by + rw [sqZeroRep_inr, hU.repGauge_T g l] + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +/-- The trace contraction of the images is the image of the trace contraction. -/ +lemma traceContraction_sqZeroRep (hU : IsSU3BiAdjoint M ρ U) : + hU.isSU3BiAdjoint_sqZeroRep.traceContraction = TrivSqZeroExt.inr hU.traceContraction := by + simp only [traceContraction, TrivSqZeroExt.inr_sum] + +/-- The image of an element of the span lies in the span of the images. -/ +lemma inr_mem_span_sqZeroRep (hU : IsSU3BiAdjoint M ρ U) {x : M} (hx : x ∈ hU.span) : + TrivSqZeroExt.inr x ∈ hU.isSU3BiAdjoint_sqZeroRep.span := by + obtain ⟨c, rfl⟩ := (hU.mem_span_iff x).1 hx + refine (hU.isSU3BiAdjoint_sqZeroRep.mem_span_iff _).2 ⟨c, ?_⟩ + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +/-- Every gauge invariant in the span of the components is a multiple of the trace + contraction, for a family valued in a mere module. Neither an algebra structure on the + target nor multiplicativity of the representation is needed: the square-zero extension + supplies both, and the injection of the module reflects the conclusion back. -/ +lemma exists_smul_traceContraction_of_invariant_module (hU : IsSU3BiAdjoint M ρ U) {x : M} + (hx : x ∈ hU.span) (hinv : ∀ g : GaugeGroupI, ρ g x = x) : + ∃ c : ℂ, x = c • hU.traceContraction := by + obtain ⟨c, hc⟩ := hU.isSU3BiAdjoint_sqZeroRep.exists_smul_traceContraction_of_invariant + (isMulRep_sqZeroRep ρ) (hU.inr_mem_span_sqZeroRep hx) + (fun g => by rw [sqZeroRep_inr, hinv g]) + refine ⟨c, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ + rw [hc, hU.traceContraction_sqZeroRep, TrivSqZeroExt.inr_smul] + +end SquareZero + +/-! + +## F.5. The gauge invariants modulo a gauge-stable submodule + +A gauge-stable submodule can be divided out: the quotient representation carries the +images of the components as a bi-adjoint family again, so F.4 applies verbatim in the +quotient and lifts to a classification modulo the submodule. Stability of the submodule is +what makes the quotient representation exist, and it cannot be dropped: for an unstable +line `ℂ ∙ v` the only invariant of the line is `0`, while an invariant of the sum may well +lie outside the span. The error term is invariant for free, since it is the difference of +two invariants. + +-/ + +section Quotient + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {U : (Fin 2 → Fin 8) → M} + +/-- The representation induced on the quotient by a gauge-stable submodule. -/ +noncomputable def quotRep (ρ : Representation ℂ GaugeGroupI M) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + Representation ℂ GaugeGroupI (M ⧸ S) where + toFun g := S.mapQ S (ρ g) fun y hy => hS g y hy + map_one' := by + ext y + simp only [LinearMap.coe_comp, Function.comp_apply, Submodule.mkQ_apply, + Submodule.mapQ_apply, map_one, Module.End.one_apply] + map_mul' g₁ g₂ := by + ext y + simp only [LinearMap.coe_comp, Function.comp_apply, Submodule.mkQ_apply, + Submodule.mapQ_apply, map_mul, Module.End.mul_apply] + +/-- The quotient representation on a class is the class of the representation. -/ +@[simp] +lemma quotRep_mkQ (S : Submodule ℂ M) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) + (g : GaugeGroupI) (y : M) : quotRep ρ S hS g (S.mkQ y) = S.mkQ (ρ g y) := rfl + +/-- The images of the components in the quotient by a gauge-stable submodule again form a + bi-adjoint family. -/ +lemma isSU3BiAdjoint_quotRep (hU : IsSU3BiAdjoint M ρ U) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + IsSU3BiAdjoint (M ⧸ S) (quotRep ρ S hS) fun l => S.mkQ (U l) where + repGauge_T g l := by + rw [quotRep_mkQ, hU.repGauge_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The quotient map carries the trace contraction to the trace contraction of the + images. -/ +lemma mkQ_traceContraction (hU : IsSU3BiAdjoint M ρ U) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + S.mkQ hU.traceContraction = (hU.isSU3BiAdjoint_quotRep S hS).traceContraction := by + simp only [traceContraction, map_sum] + +end Quotient + +/-- The gauge invariants of the span of the components together with a gauge-stable + submodule `S`: such an element is a multiple of the trace contraction up to an error in + `S`, and the error is gauge invariant as well, being the difference of two invariants. + Stability of `S` is needed, and not just convenient: for an unstable line the only + invariant of the line is zero, while the sum can carry invariants outside the span. The + classification is applied in the quotient by `S`, where the images of the components + form a bi-adjoint family again. -/ +lemma mem_span_sup_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) + (x : B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) (hx : x ∈ hT.span ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y + ∧ ∀ g : GaugeGroupI, repGauge g y = y := by + have hmk : S.mkQ x ∈ (hT.isSU3BiAdjoint_quotRep S hS).span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine ((hT.isSU3BiAdjoint_quotRep S hS).mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ g : GaugeGroupI, quotRep repGauge S hS g (S.mkQ x) = S.mkQ x := + fun g => by rw [quotRep_mkQ, hinv g] + obtain ⟨c, hc⟩ := + (hT.isSU3BiAdjoint_quotRep S hS).exists_smul_traceContraction_of_invariant_module hmk hinv' + rw [← hT.mkQ_traceContraction S hS] at hc + refine ⟨c, x - c • hT.traceContraction, ?_, by abel, fun g => ?_⟩ + · have hker : x - c • hT.traceContraction ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, map_smul, hc, sub_self] + rwa [Submodule.ker_mkQ] at hker + · rw [map_sub, map_smul, hinv g, hT.repGauge_traceContraction] + end Decomposition end IsSU3BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean index 526746ef8..05c796259 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean @@ -71,10 +71,6 @@ structure IsSU3BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] repGauge g (T l) = ∑ a : Fin 2 → Fin 3, (∏ i : Fin 2, (GaugeGroupI.toSU3 g).1 (a i) (l i)) • T a -TODO (lines := 63-73) "Make a file IsSU3FunAntiFun, which - is the analogue of IsSU2BiFundamental, and which contains the invariant - δ^a_b." - namespace IsSU3BiFundamental set_option linter.unusedVariables false diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean new file mode 100644 index 000000000..def2c8dce --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean @@ -0,0 +1,698 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition +/-! +# Gauge tensors carrying an `su(3)` fundamental and an anti-fundamental index + +`IsSU3FunAntiFun B repGauge T` says that a family `T`, indexed by one `su(3)` fundamental +colour index and one anti-fundamental colour index, and valued in a module `B` carrying a +representation of the gauge group `GaugeGroupI`, transforms as a tensor `T^{a}{}_{b}` in +the `su(3)` factor. + +This is the case that `IsSU3BiFundamental` shows is unavailable to two fundamental indices. +There the centre `ℤ₃` of `SU(3)` scales a tensor carrying `k` fundamental indices by +`ω ^ k`, and two is not a multiple of three, so every gauge invariant in the span of the +components vanishes. Lowering the second index is precisely the escape: the centre then +contributes `ω * ω⁻¹ = 1` and the Kronecker delta `δ^{a}{}_{b}` survives. That is +`3 ⊗ 3̄ = 8 ⊕ 1` against `3 ⊗ 3 = 6 ⊕ 3̄`, and it is why a colour singlet is built from a +quark and an antiquark and not from two quarks. + +The invariant here also reaches deeper into the group than the `SU(2)` one does. The +epsilon contraction of `IsSU2BiFundamental` is invariant because an `SU(2)` matrix has +determinant one, so it uses the `S` of `SU(2)`; the delta contraction is invariant because +a unitary matrix satisfies `U * star U = 1`, so it uses only the `U`, and it would be an +invariant of the full unitary group. + +The law itself is `IsSU3FunAntiFunMat`, which relates one element of `SU(3)` to one linear +map on `B` and mentions no other factor of the gauge group, and `IsSU3FunAntiFun` says only +that every element of the gauge group obeys that law through its `SU(3)` part. Every +statement about how the components move is proved at the level of `IsSU3FunAntiFunMat` and +instantiated afterwards, so the mathematics is `SU(3)` mathematics. What stays about +`GaugeGroupI` is the bookkeeping of the two decompositions, `GaugeWeightDecomposition` and +`SU3PermDecomposition` being supplied only for representations of the gauge group. + +Section A gives the transformation law, the proposition and the span of its components, +section B the delta contraction, which is the invariant the bi-fundamental case lacks, and +section C the gauge weight decomposition of the span, whose zero-weight piece is the space +spanned by the three diagonal components, three dimensional because the zero weight occurs +twice in the adjoint and once in the singlet. Section D grades that piece by the cyclic Weyl element +of the `SU(3)` factor, which the gauge weight alone cannot split, and the two gradings +together leave the delta contraction spanning the gauge invariants. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix ComplexConjugate + +/-! + +## A. Mixed `su(3)` families and the span of their components + +The transformation law carries one factor of the fundamental matrix for the upper index and +one factor of its complex conjugate for the lower one, with the summed index in the row slot +in both cases. The conjugate is what the lower index means: a fundamental index moves by +`U`, and the anti-fundamental representation is the complex conjugate of the fundamental, so +its index moves by `conj U`. It is recorded by `IsSU3FunAntiFunMat`, a relation between one +element of `SU(3)` and one linear map on `B`, in which no other factor of the gauge group +appears. + +`IsSU3FunAntiFun` then says that every gauge transformation obeys that law through its +`SU(3)` part. Since `GaugeGroupI.toSU3` is a monoid homomorphism this is an action. +Quantifying over the whole of `GaugeGroupI` is what makes the proposition say more than a +statement about a single `SU(3)` element would: an element of the isospin or hypercharge +factor is sent to `1` in `SU(3)`, so those factors fix every component, and section C reads +that off as the vanishing of the isospin and hypercharge coordinates of every weight. + +-/ + +/-- The linear map `f` moves the components of the family `T` as the `SU(3)` matrix `U` + moves a tensor with one fundamental and one anti-fundamental colour index: a factor of + `U` for the fundamental index, a factor of its complex conjugate for the anti-fundamental + one, with the summed index in the row slot. -/ +def IsSU3FunAntiFunMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 3) ℂ) (f : B →ₗ[ℂ] B) + (T : (Fin 2 → Fin 3) → B) : Prop := + ∀ l : Fin 2 → Fin 3, + f (T l) = ∑ a : Fin 2 → Fin 3, (U.1 (a 0) (l 0) * conj (U.1 (a 1) (l 1))) • T a + +/-- A family `T` of elements of `B`, indexed by one `su(3)` fundamental colour index and one + anti-fundamental one, transforms as a tensor `T^{a}{}_{b}` under the representation + `repGauge` of the gauge group: every gauge transformation moves the components by its + `SU(3)` part alone. -/ +structure IsSU3FunAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 3) → B) : Prop where + repGauge_T : ∀ g : GaugeGroupI, + IsSU3FunAntiFunMat (GaugeGroupI.toSU3 g) (repGauge g) T + +namespace IsSU3FunAntiFun +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + +/-- The span of all the components of a family indexed by one `su(3)` fundamental colour + index and one anti-fundamental one. -/ +def span (T : (Fin 2 → Fin 3) → B) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff {T : (Fin 2 → Fin 3) → B} (x : B) : + x ∈ span T ↔ ∃ (c : (Fin 2 → Fin 3) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 2 → Fin 3) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-- Every component lies in the span. -/ +lemma mem_span {T : (Fin 2 → Fin 3) → B} (d : Fin 2 → Fin 3) : T d ∈ span T := + Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _) + +/-! + +## B. The delta contraction + +An anti-fundamental index has exactly one place to be contracted, against a fundamental +one, and the tensor that does it is the Kronecker delta. Its invariance is the statement +that `U * star U = 1`, the row of `U` at one index dotted with the conjugate row at another +giving `1` or `0` according to whether the indices agree. Only unitarity is used, not the +determinant condition, so the delta contraction is an invariant of `U(3)` and not merely of +`SU(3)`. + +The contraction itself is the sum of the three diagonal components, and the whole section +is about `SU(3)`: it is built from the family alone, and its invariance is proved for an +arbitrary element of `specialUnitaryGroup (Fin 3) ℂ` acting through an arbitrary linear +map, gauge invariance being that statement read at `GaugeGroupI.toSU3 g`. + +-/ + +/-- A sum over families of two colour indices is a double sum. -/ +lemma sum_pi_two {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin 3) → M) : + ∑ d : Fin 2 → Fin 3, F d = ∑ x : Fin 3, ∑ y : Fin 3, F ![x, y] := by + rw [show (∑ d : Fin 2 → Fin 3, F d) = ∑ p : Fin 3 × Fin 3, F ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 3) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +/-- The rows of a unitary matrix are orthonormal: a row dotted with the conjugate of another + row is `1` when the rows agree and `0` when they do not. This is the invariance of the + Kronecker delta, and it is the whole content of the section. -/ +lemma sum_mul_conj (U : specialUnitaryGroup (Fin 3) ℂ) (b c : Fin 3) : + ∑ x : Fin 3, U.1 b x * conj (U.1 c x) = if b = c then 1 else 0 := by + have hU : U.1 * (U.1)ᴴ = 1 := by + have h := Matrix.mem_unitaryGroup_iff.mp (Matrix.mem_specialUnitaryGroup_iff.mp U.2).1 + rwa [Matrix.star_eq_conjTranspose] at h + have h := congrFun (congrFun hU b) c + rw [Matrix.mul_apply] at h + simpa [Matrix.conjTranspose_apply, Matrix.one_apply, RCLike.star_def] using h + +/-- The delta contraction of a family carrying one fundamental and one anti-fundamental + colour index: the trace of the family, the sum of its three diagonal components. -/ +def deltaContraction (T : (Fin 2 → Fin 3) → B) : B := ∑ a : Fin 3, T ![a, a] + +/-- The delta contraction written as a sum over all pairs of colour indices weighted by the + Kronecker delta. -/ +lemma deltaContraction_eq_sum (T : (Fin 2 → Fin 3) → B) : + deltaContraction T + = ∑ d : Fin 2 → Fin 3, (if d 0 = d 1 then (1 : ℂ) else 0) • T d := by + rw [sum_pi_two] + simp [deltaContraction] + +/-- The delta contraction lies in the span of the components. -/ +lemma deltaContraction_mem_span (T : (Fin 2 → Fin 3) → B) : + deltaContraction T ∈ span T := + sum_mem fun a _ => mem_span _ + +/-- The delta contraction is fixed by any linear map moving the components by an element of + `SU(3)`, the Kronecker delta being invariant under a unitary matrix. This is the theorem + that `IsSU3BiFundamental` has no analogue of. -/ +lemma map_deltaContraction {T : (Fin 2 → Fin 3) → B} (hf : IsSU3FunAntiFunMat U f T) : + f (deltaContraction T) = deltaContraction T := by + have step : f (deltaContraction T) + = ∑ b : Fin 2 → Fin 3, (if b 0 = b 1 then (1 : ℂ) else 0) • T b := by + rw [deltaContraction, map_sum] + have h1 : ∀ c : Fin 3, f (T ![c, c]) + = ∑ b : Fin 2 → Fin 3, (U.1 (b 0) c * conj (U.1 (b 1) c)) • T b := by + intro c + rw [hf ![c, c]] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + simp only [h1] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_smul] + congr 1 + exact sum_mul_conj U (b 0) (b 1) + rw [step, ← deltaContraction_eq_sum] + +/-- The delta contraction of a mixed family is gauge invariant: a gauge transformation moves + the components by its `SU(3)` part, which fixes the contraction. -/ +lemma repGauge_deltaContraction {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun B repGauge T) (g : GaugeGroupI) : + repGauge g (deltaContraction T) = deltaContraction T := + map_deltaContraction (hT.repGauge_T g) + +/-! + +## C. The gauge weight decomposition of the span + +The gauge torus is diagonal in the fundamental representation of the `SU(3)` factor, so the +three basis colour directions are already weight vectors, carrying the three colour weights +`colourWeight` of the triplet, and the anti-fundamental index carries the negatives of those +weights. A component `T d` therefore carries the definite weight `wtWeight d`, the weight of +its upper index minus the weight of its lower one, and the span of the components is already +the join of nine weight lines. + +The `SU(3)` content of the section is `map_of_diagonal`: a family moved by a diagonal `SU(3)` +matrix has every component an eigenvector, at the diagonal entry of its upper index times the +conjugate of the diagonal entry of its lower one. The torus generators enter only through +`toSU3_gaugeTorusGen_apply`, which says that their `SU(3)` parts are diagonal with the +characters of `fundWeight` on the diagonal. The decomposition itself is where the gauge group +is unavoidable: `GaugeWeightDecomposition` is defined for a representation of `GaugeGroupI`, +and it is what records that the isospin and hypercharge coordinates of every weight vanish. + +The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra +and records multiplicativity of the representation, neither of which `IsSU3FunAntiFun` needs, +so both appear as extra arguments here. + +-/ + +/-! + +## C.1. Diagonal matrices and the gauge torus + +-/ + +/-- A family moved by a diagonal `SU(3)` matrix has every component an eigenvector, at the + diagonal entry of its upper index times the conjugate of the diagonal entry of its lower + one. -/ +lemma map_of_diagonal {T : (Fin 2 → Fin 3) → B} (hf : IsSU3FunAntiFunMat U f T) + (hU : ∀ a b : Fin 3, a ≠ b → U.1 a b = 0) (l : Fin 2 → Fin 3) : + f (T l) = (U.1 (l 0) (l 0) * conj (U.1 (l 1) (l 1))) • T l := by + rw [hf l, Finset.sum_eq_single l] + · intro a _ hal + have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by + by_contra hc + simp only [not_or, ne_eq, not_not] at hc + exact hal (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) + rcases h with h | h + · rw [hU _ _ h, zero_mul, zero_smul] + · rw [hU _ _ h, map_zero, mul_zero, zero_smul] + · intro hl + exact absurd (Finset.mem_univ l) hl + +/-- The gauge weight carried by one `su(3)` fundamental colour index: colour only, the three + colours carrying the three colour weights of the triplet. -/ +def fundWeight (c : Fin 3) : GaugeWeight := ((colourWeight c).1, (colourWeight c).2, 0, 0) + +/-- The gauge weight carried by one `su(3)` anti-fundamental colour index: the negative of + the weight of the fundamental index of the same colour, the weights of the antitriplet + being the negatives of those of the triplet. -/ +def antiFundWeight (c : Fin 3) : GaugeWeight := -fundWeight c + +/-- The exponents of an anti-fundamental colour index are the negated exponents of the + fundamental one. -/ +lemma antiFundWeight_coord (c : Fin 3) (i : Fin 4) : + GaugeWeight.coord (antiFundWeight c) i = -GaugeWeight.coord (fundWeight c) i := by + rw [antiFundWeight, GaugeWeight.coord_neg] + +/-- The gauge torus acts diagonally on a fundamental colour index, by the character of the + weight of that index. Only the two colour generators act nontrivially. -/ +lemma toSU3_gaugeTorusGen_apply (i : Fin 4) (a b : Fin 3) : + (GaugeGroupI.toSU3 (gaugeTorusGen i)).1 a b + = if a = b then (expI : ℂ) ^ GaugeWeight.coord (fundWeight a) i else 0 := by + fin_cases i <;> fin_cases a <;> fin_cases b <;> + simp [gaugeTorusGen, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, fundWeight, + colourWeight, expI_inv_eq_star] + +/-- The `SU(3)` part of a torus generator has vanishing off-diagonal entries. -/ +lemma toSU3_gaugeTorusGen_offDiag (i : Fin 4) (a b : Fin 3) (hab : a ≠ b) : + (GaugeGroupI.toSU3 (gaugeTorusGen i)).1 a b = 0 := by + rw [toSU3_gaugeTorusGen_apply, if_neg hab] + +/-- The gauge weight carried by a component of a mixed family: the weight of its upper index + plus the weight of its lower one, which is the difference of two colour weights. -/ +def wtWeight (l : Fin 2 → Fin 3) : GaugeWeight := fundWeight (l 0) + antiFundWeight (l 1) + +/-! + +## C.2. The components are weight vectors + +-/ + +/-- Every component of a mixed family is a simultaneous eigenvector of the gauge torus, at + the character of the weight of its upper index minus that of its lower one. -/ +lemma repGauge_gaugeTorusGen {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun B repGauge T) (l : Fin 2 → Fin 3) (i : Fin 4) : + repGauge (gaugeTorusGen i) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by + rw [map_of_diagonal (hT.repGauge_T (gaugeTorusGen i)) + (toSU3_gaugeTorusGen_offDiag i) l] + congr 1 + rw [toSU3_gaugeTorusGen_apply, toSU3_gaugeTorusGen_apply, if_pos rfl, if_pos rfl, + starRingEnd_expI_zpow, wtWeight, GaugeWeight.coord_add, antiFundWeight_coord, + zpow_add₀ expI_ne_zero] + +/-! + +## C.3. The decomposition + +-/ + +section Decomposition + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : (Fin 2 → Fin 3) → B} + +/-- The gauge weight decomposition of the span of a mixed `su(3)` family. The span is the + join of the lines through the nine components, and each of those carries the weight of its + upper index minus that of its lower one. -/ +@[implicit_reducible] +noncomputable def gaugeWeightDecomposition (hT : IsSU3FunAntiFun B repGauge T) + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge (span T) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.iSup hmul fun d : Fin 2 → Fin 3 => + GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) + (repGauge_gaugeTorusGen hT d)) + _ rfl + +variable (hT : IsSU3FunAntiFun B repGauge T) + +/-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through + those components whose weight is `w`. -/ +lemma gaugeWeightDecomposition_piece (hmul : IsMulRep repGauge) (w : GaugeWeight) : + (hT.gaugeWeightDecomposition hmul).piece w + = ⨆ d : Fin 2 → Fin 3, (if w = wtWeight d then ℂ ∙ T d else ⊥) := rfl + +/-- The support of the decomposition, before evaluation. -/ +lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = Finset.univ.biUnion fun d : Fin 2 → Fin 3 => + ({wtWeight d} : Finset GaugeWeight) := rfl + +/-- The gauge weights carried by a mixed `su(3)` family: the zero weight and the six roots + of `su(3)`, which are the weights of `3 ⊗ 3̄ = 8 ⊕ 1`. Every one of them has vanishing + isospin and hypercharge, since the family carries colour only. -/ +lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).supp + = {((0, 0, 0, 0) : GaugeWeight), (2, -1, 0, 0), (1, 1, 0, 0), + (-2, 1, 0, 0), (-1, 2, 0, 0), (-1, -1, 0, 0), (1, -2, 0, 0)} := by + rw [hT.gaugeWeightDecomposition_supp_eq hmul] + decide + +/-! + +## C.4. The zero-weight piece + +A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight piece, +which makes that piece worth describing explicitly. The weight of a component is the +difference of the colour weights of its two indices, so it vanishes exactly when the two +indices agree: the three colour weights are distinct. That leaves the three diagonal +components, and the zero-weight piece is the three dimensional space they span, the +multiplicity of the zero weight in `3 ⊗ 3̄` being the rank two of `su(3)` plus one for the +singlet. + +-/ + +/-- A component of a mixed family carries vanishing gauge weight precisely when its two + colour indices agree, the two colour weights then cancelling. -/ +lemma wtWeight_eq_zero_iff (l : Fin 2 → Fin 3) : wtWeight l = 0 ↔ l 0 = l 1 := by + revert l + decide + +/-- The zero-weight piece of the gauge weight decomposition, explicitly: the space spanned + by the three diagonal components. -/ +lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).piece 0 = ⨆ a : Fin 3, ℂ ∙ T ![a, a] := by + rw [hT.gaugeWeightDecomposition_piece hmul] + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun a => ?_) + · split_ifs with hd + · have hdd : d = ![d 0, d 0] := + funext fun j => by fin_cases j <;> simp [(wtWeight_eq_zero_iff d).1 hd.symm] + rw [congrArg T hdd] + exact le_iSup_of_le (d 0) le_rfl + · exact bot_le + · refine le_iSup_of_le ![a, a] (le_of_eq (if_pos ?_).symm) + exact ((wtWeight_eq_zero_iff ![a, a]).2 (by simp)).symm + +/-- The delta contraction lies in the zero-weight piece. It is gauge invariant, so in + particular the torus fixes it. -/ +lemma deltaContraction_mem_piece_zero (hmul : IsMulRep repGauge) : + deltaContraction T ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := + GaugeWeightDecomposition.mem_zero_of_invariant _ (deltaContraction_mem_span T) + (repGauge_deltaContraction hT) + +end Decomposition + +/-! + +## D. The `SU(3)` permutation decomposition of the zero-weight piece + +The gauge weight cannot separate the three diagonal components: they all carry weight zero, +and section C.4 leaves the zero-weight piece as the space they span. The cyclic Weyl element +of the `SU(3)` factor does separate them. Its matrix `!![0, 0, 1; 1, 0, 0; 0, 1, 0]` cycles +the three colours, so it cycles the three diagonal components, and its eigenvectors on that +space are their three discrete Fourier combinations: the plain sum, which is the delta +contraction, at eigenvalue `1`, and the two twisted sums, at eigenvalues `ω` and `ω ^ 2`, +which are the two Cartan directions of the octet. The conjugate on the lower index costs +nothing in this section, a permutation matrix being real. That much is again `SU(3)`: the +Weyl element enters as the element `su3Perm` of `specialUnitaryGroup (Fin 3) ℂ`, and the +gauge group only through `toSU3_gaugeSU3Perm`. + +Grade zero is in general only a sieve, since `SU3PermDecomposition.mem_zero_of_invariant` +has no converse, but here the two gradings together are sharp: the zero-weight piece is +three dimensional and grade zero is a line in it, so every gauge invariant in the span of +the components is a multiple of the delta contraction. That is the singlet of +`3 ⊗ 3̄ = 8 ⊕ 1`, counted exactly once, and it is the conclusion the bi-fundamental case +cannot reach, its zero-weight piece being `⊥`. + +-/ + +/-! + +## D.1. The cyclic Weyl element on the diagonal components + +-/ + +/-- The entries of the cyclic Weyl element of `SU(3)`. -/ +lemma su3Perm_apply (a b : Fin 3) : + (su3Perm : specialUnitaryGroup (Fin 3) ℂ).1 a b = !![0, 0, 1; 1, 0, 0; 0, 1, 0] a b := rfl + +/-- The `SU(3)` part of the cyclic Weyl element of the gauge group is the cyclic Weyl + element of `SU(3)`. -/ +lemma toSU3_gaugeSU3Perm : GaugeGroupI.toSU3 gaugeSU3Perm = su3Perm := rfl + +/-- The cyclic element sends the first diagonal component to the second. -/ +lemma map_su3Perm_zero {T : (Fin 2 → Fin 3) → B} (hf : IsSU3FunAntiFunMat su3Perm f T) : + f (T ![0, 0]) = T ![1, 1] := by + rw [hf ![0, 0], sum_pi_two] + simp [Fin.sum_univ_three, su3Perm_apply] + +/-- The cyclic element sends the second diagonal component to the third. -/ +lemma map_su3Perm_one {T : (Fin 2 → Fin 3) → B} (hf : IsSU3FunAntiFunMat su3Perm f T) : + f (T ![1, 1]) = T ![2, 2] := by + rw [hf ![1, 1], sum_pi_two] + simp [Fin.sum_univ_three, su3Perm_apply] + +/-- The cyclic element sends the third diagonal component to the first. -/ +lemma map_su3Perm_two {T : (Fin 2 → Fin 3) → B} (hf : IsSU3FunAntiFunMat su3Perm f T) : + f (T ![2, 2]) = T ![0, 0] := by + rw [hf ![2, 2], sum_pi_two] + simp [Fin.sum_univ_three, su3Perm_apply] + +omit [Module ℂ B] in +/-- The delta contraction as the sum of the three diagonal components. -/ +lemma deltaContraction_eq_add (T : (Fin 2 → Fin 3) → B) : + deltaContraction T = T ![0, 0] + T ![1, 1] + T ![2, 2] := by + rw [deltaContraction, Fin.sum_univ_three] + +/-- The grade one combination of the three diagonal components. -/ +noncomputable def octetOne (T : (Fin 2 → Fin 3) → B) : B := + T ![0, 0] + su3Omega ^ 2 • T ![1, 1] + su3Omega • T ![2, 2] + +/-- The grade two combination of the three diagonal components. -/ +noncomputable def octetTwo (T : (Fin 2 → Fin 3) → B) : B := + T ![0, 0] + su3Omega • T ![1, 1] + su3Omega ^ 2 • T ![2, 2] + +/-- The cyclic element multiplies the grade one combination by `ω`. -/ +lemma map_su3Perm_octetOne {T : (Fin 2 → Fin 3) → B} + (hf : IsSU3FunAntiFunMat su3Perm f T) : + f (octetOne T) = su3Omega • octetOne T := by + rw [octetOne, map_add, map_add, map_smul, map_smul, map_su3Perm_zero hf, + map_su3Perm_one hf, map_su3Perm_two hf] + match_scalars <;> + first + | ring1 + | linear_combination (-1 : ℂ) * su3Omega_pow_three + +/-- The cyclic element multiplies the grade two combination by `ω ^ 2`. -/ +lemma map_su3Perm_octetTwo {T : (Fin 2 → Fin 3) → B} + (hf : IsSU3FunAntiFunMat su3Perm f T) : + f (octetTwo T) = su3Omega ^ 2 • octetTwo T := by + rw [octetTwo, map_add, map_add, map_smul, map_smul, map_su3Perm_zero hf, + map_su3Perm_one hf, map_su3Perm_two hf] + match_scalars <;> + first + | ring1 + | linear_combination (-1 : ℂ) * su3Omega_pow_three + | linear_combination (-su3Omega) * su3Omega_pow_three + +/-! + +## D.2. The Fourier combinations span the diagonal components + +-/ + +/-- The three cube roots of unity sum to zero, so the three colours enter the delta + contraction and the two octet combinations with the characters of `ZMod 3`. -/ +lemma su3Omega_geom_sum : 1 + su3Omega + su3Omega ^ 2 = 0 := by + have h := su3PermSign_symmetrizer (k := 1) (by decide) + rwa [su3PermSign_one] at h + +/-- The three graded combinations recover three times the first diagonal component. -/ +lemma sum_octet_zero (T : (Fin 2 → Fin 3) → B) : + deltaContraction T + octetOne T + octetTwo T = (3 : ℂ) • T ![0, 0] := by + rw [deltaContraction_eq_add, octetOne, octetTwo] + match_scalars + · ring1 + · linear_combination su3Omega_geom_sum + · linear_combination su3Omega_geom_sum + +/-- The three graded combinations, twisted once, recover three times the second diagonal + component. -/ +lemma sum_octet_one (T : (Fin 2 → Fin 3) → B) : + deltaContraction T + su3Omega • octetOne T + su3Omega ^ 2 • octetTwo T + = (3 : ℂ) • T ![1, 1] := by + rw [deltaContraction_eq_add, octetOne, octetTwo] + match_scalars + · linear_combination su3Omega_geom_sum + · linear_combination (2 : ℂ) * su3Omega_pow_three + · linear_combination su3Omega_geom_sum + su3Omega * su3Omega_pow_three + +/-- The three graded combinations, twisted twice, recover three times the third diagonal + component. -/ +lemma sum_octet_two (T : (Fin 2 → Fin 3) → B) : + deltaContraction T + su3Omega ^ 2 • octetOne T + su3Omega • octetTwo T + = (3 : ℂ) • T ![2, 2] := by + rw [deltaContraction_eq_add, octetOne, octetTwo] + match_scalars + · linear_combination su3Omega_geom_sum + · linear_combination su3Omega_geom_sum + su3Omega * su3Omega_pow_three + · linear_combination (2 : ℂ) * su3Omega_pow_three + +/-- The delta contraction and the two octet combinations span the space of the three + diagonal components, being their three discrete Fourier combinations. -/ +lemma sup_span_octet (T : (Fin 2 → Fin 3) → B) : + ℂ ∙ deltaContraction T ⊔ ℂ ∙ octetOne T ⊔ ℂ ∙ octetTwo T + = ⨆ a : Fin 3, ℂ ∙ T ![a, a] := by + set W := ℂ ∙ deltaContraction T ⊔ ℂ ∙ octetOne T ⊔ ℂ ∙ octetTwo T + have hdiag : ∀ a : Fin 3, T ![a, a] ∈ ⨆ b : Fin 3, ℂ ∙ T ![b, b] := fun a => + Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _) + have hd : deltaContraction T ∈ W := + Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_span_singleton_self _)) + have h1 : octetOne T ∈ W := + Submodule.mem_sup_left (Submodule.mem_sup_right (Submodule.mem_span_singleton_self _)) + have h2 : octetTwo T ∈ W := + Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) + have hthird : ∀ x : B, (3 : ℂ) • x ∈ W → x ∈ W := by + intro x hx + have h := Submodule.smul_mem W (3⁻¹ : ℂ) hx + rwa [smul_smul, inv_mul_cancel₀ (by norm_num : (3 : ℂ) ≠ 0), one_smul] at h + have hzero : T ![0, 0] ∈ W := + hthird _ (by rw [← sum_octet_zero]; exact add_mem (add_mem hd h1) h2) + have hone : T ![1, 1] ∈ W := + hthird _ (by + rw [← sum_octet_one] + exact add_mem (add_mem hd (Submodule.smul_mem _ _ h1)) (Submodule.smul_mem _ _ h2)) + have htwo : T ![2, 2] ∈ W := + hthird _ (by + rw [← sum_octet_two] + exact add_mem (add_mem hd (Submodule.smul_mem _ _ h1)) (Submodule.smul_mem _ _ h2)) + refine le_antisymm (sup_le (sup_le ?_ ?_) ?_) (iSup_le fun a => ?_) <;> + rw [Submodule.span_singleton_le_iff_mem] + · rw [deltaContraction_eq_add] + exact add_mem (add_mem (hdiag 0) (hdiag 1)) (hdiag 2) + · rw [octetOne] + exact add_mem (add_mem (hdiag 0) (Submodule.smul_mem _ _ (hdiag 1))) + (Submodule.smul_mem _ _ (hdiag 2)) + · rw [octetTwo] + exact add_mem (add_mem (hdiag 0) (Submodule.smul_mem _ _ (hdiag 1))) + (Submodule.smul_mem _ _ (hdiag 2)) + · fin_cases a + · exact hzero + · exact hone + · exact htwo + +/-! + +## D.3. The grading + +-/ + +section Grading + +variable {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + +/-- The grade `k` piece of the `SU(3)` permutation decomposition of the zero-weight piece: + the delta contraction in grade zero, and the two octet combinations in grades one and + two. -/ +noncomputable def zeroPiece (T : (Fin 2 → Fin 3) → B) (k : ZMod 3) : Submodule ℂ B := + if k = 0 then ℂ ∙ deltaContraction T + else if k = 1 then ℂ ∙ octetOne T else ℂ ∙ octetTwo T + +variable {T : (Fin 2 → Fin 3) → B} + +/-- The grade zero piece: the line through the delta contraction. -/ +@[simp] lemma zeroPiece_zero : zeroPiece T 0 = ℂ ∙ deltaContraction T := by + rw [zeroPiece, if_pos rfl] + +/-- The grade one piece: the line through the first octet combination. -/ +@[simp] lemma zeroPiece_one : zeroPiece T 1 = ℂ ∙ octetOne T := by + rw [zeroPiece, if_neg (by decide), if_pos rfl] + +/-- The grade two piece: the line through the second octet combination. -/ +@[simp] lemma zeroPiece_two : zeroPiece T 2 = ℂ ∙ octetTwo T := by + rw [zeroPiece, if_neg (by decide), if_neg (by decide)] + +/-- Each graded piece is of pure sign under the cyclic Weyl element. -/ +lemma zeroPiece_le_eigenspace (hT : IsSU3FunAntiFun B repGauge T) (k : ZMod 3) : + zeroPiece T k ≤ Module.End.eigenspace (repGauge gaugeSU3Perm) (su3PermSign k) := by + have hcases : ∀ j : ZMod 3, j = 0 ∨ j = 1 ∨ j = 2 := by decide + rcases hcases k with rfl | rfl | rfl + · rw [zeroPiece_zero, Submodule.span_singleton_le_iff_mem] + exact Module.End.mem_eigenspace_iff.mpr + (by rw [su3PermSign_zero, one_smul, repGauge_deltaContraction hT]) + · rw [zeroPiece_one, Submodule.span_singleton_le_iff_mem] + exact Module.End.mem_eigenspace_iff.mpr + (by rw [su3PermSign_one, map_su3Perm_octetOne (hT.repGauge_T gaugeSU3Perm)]) + · rw [zeroPiece_two, Submodule.span_singleton_le_iff_mem] + exact Module.End.mem_eigenspace_iff.mpr + (by rw [su3PermSign_two, map_su3Perm_octetTwo (hT.repGauge_T gaugeSU3Perm)]) + +variable (hT : IsSU3FunAntiFun B repGauge T) + +/-- The graded pieces exhaust the zero-weight piece. -/ +lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : + (⨆ k : ZMod 3, zeroPiece T k) = (hT.gaugeWeightDecomposition hmul).piece 0 := by + rw [hT.gaugeWeightDecomposition_piece_zero hmul, ← sup_span_octet T] + have hcases : ∀ j : ZMod 3, j = 0 ∨ j = 1 ∨ j = 2 := by decide + refine le_antisymm (iSup_le fun k => ?_) (sup_le (sup_le ?_ ?_) ?_) + · rcases hcases k with rfl | rfl | rfl + · rw [zeroPiece_zero] + exact le_sup_of_le_left le_sup_left + · rw [zeroPiece_one] + exact le_sup_of_le_left le_sup_right + · rw [zeroPiece_two] + exact le_sup_right + · exact le_iSup_of_le 0 (le_of_eq zeroPiece_zero.symm) + · exact le_iSup_of_le 1 (le_of_eq zeroPiece_one.symm) + · exact le_iSup_of_le 2 (le_of_eq zeroPiece_two.symm) + +/-- The `SU(3)` permutation decomposition of the zero-weight piece of the gauge weight + decomposition: the cyclic Weyl element grades the space the gauge weight cannot split, + putting the delta contraction in grade zero and the two octet combinations in grades one + and two. -/ +noncomputable def zeroPieceSU3Perm (hT : IsSU3FunAntiFun B repGauge T) + (hmul : IsMulRep repGauge) : + SU3PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) where + piece := zeroPiece T + piece_le k x hx := Module.End.mem_eigenspace_iff.mp (zeroPiece_le_eigenspace hT k hx) + iSup_piece := hT.iSup_zeroPiece hmul + +/-- The pieces of the decomposition are the graded pieces. -/ +@[simp] lemma zeroPieceSU3Perm_piece (hmul : IsMulRep repGauge) (k : ZMod 3) : + (hT.zeroPieceSU3Perm hmul).piece k = zeroPiece T k := rfl + +/-- The delta contraction lies in the grade zero piece: it is gauge invariant, so in + particular the cyclic Weyl element fixes it. -/ +lemma deltaContraction_mem_zeroPiece_zero (hT : IsSU3FunAntiFun B repGauge T) + (hmul : IsMulRep repGauge) : + deltaContraction T ∈ zeroPiece T 0 := + SU3PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU3Perm hmul) + (hT.deltaContraction_mem_piece_zero hmul) (repGauge_deltaContraction hT) + +/-- Every gauge invariant in the span of the components is a multiple of the delta + contraction. The gauge weight cuts the span down to the space of the three diagonal + components, and the cyclic Weyl element cuts that space down to the line through their + sum. This is the statement that `3 ⊗ 3̄` contains exactly one singlet, and it is what + `IsSU3BiFundamental.eq_zero_of_invariant` denies to two fundamental indices. -/ +lemma exists_smul_deltaContraction_of_invariant (hT : IsSU3FunAntiFun B repGauge T) + (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, x = c • deltaContraction T := by + have hmem : x ∈ zeroPiece T 0 := + SU3PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU3Perm hmul) + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv + rw [zeroPiece_zero] at hmem + obtain ⟨c, hc⟩ := Submodule.mem_span_singleton.1 hmem + exact ⟨c, hc.symm⟩ + +end Grading + +end IsSU3FunAntiFun + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index 9c31cb973..1646d0988 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -19,6 +19,13 @@ down to the covariant version. In the covariant version we will do the work with the invariants. +Before the structure's own sections, the file develops the Lorentz-transformation +machinery the covariant towers need: the mixing operator on multiset-indexed families +of derivative symbols, its compatibility with the Leibniz convolution, the commutation +of the infinitesimal gauge action with the Lorentz action on each value space, and, +from those, the Lorentz laws of `IsGaugeField.covDerivIter` and of +`IsGaugeField.iteratedCovDerivAdjoint` of the field strength. + -/ @[expose] public section @@ -526,6 +533,1235 @@ structure IsStandardModel (B : Type) [Ring B] [Algebra ℂ B] (φ φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), bare i s φ * bare j s' φ' = -(bare j s' φ' * bare i s φ) +/-! + +## The Lorentz mixing of derivative slots + +A Lorentz transformation mixes every derivative slot of a symbol through a column of +the Lorentz matrix. For symbols indexed by an ordered tuple that mixing is a sum over +tuples, but the covariant derivative symbols carry multisets of directions, where no +ordering is available. The mixing is therefore written here as an operator on +multiset-indexed families: peel one direction `a`, replace it by every direction `b` +weighted by the entry `Λ_{b a}`, and mix what is left. Peeling two directions commutes, +so the recursion descends to multisets, and `lorentzMix_ofFn` identifies the operator +with the tuple form used by `IsLorentzDerivTransforms`. + +-/ + +section LorentzMix + +variable {M N : Type*} [AddCommMonoid M] [Module ℂ M] [AddCommMonoid N] [Module ℂ N] + +/-- One peeling step of the Lorentz mixing: the direction `a` is removed from the + multiset index of the family and put back as every direction `b`, weighted by the + Lorentz matrix entry `Λ_{b a}`. -/ +noncomputable def lorentzMixStep (Λ : SL(2,ℂ)) (a : Fin 1 ⊕ Fin 3) + (G : Multiset (Fin 1 ⊕ Fin 3) → M) : Multiset (Fin 1 ⊕ Fin 3) → M := + fun t => ∑ b, (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) • G (b ::ₘ t) + +/-- Peeling two directions commutes, so the mixing is well defined on a multiset. -/ +instance (Λ : SL(2,ℂ)) : LeftCommutative (lorentzMixStep (M := M) Λ) where + left_comm a₁ a₂ G := by + funext t + simp only [lorentzMixStep, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => ?_ + rw [mul_comm, Multiset.cons_swap] + +/-- The Lorentz mixing of a multiset-indexed family along a multiset `s` of directions: + every direction of `s` is peeled and replaced by all directions, weighted by the + corresponding column of the Lorentz matrix. -/ +noncomputable def lorentzMix (Λ : SL(2,ℂ)) (G : Multiset (Fin 1 ⊕ Fin 3) → M) + (s : Multiset (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3) → M := + s.foldr (lorentzMixStep Λ) G + +variable (Λ : SL(2,ℂ)) (G : Multiset (Fin 1 ⊕ Fin 3) → M) + +/-- Mixing no directions is the identity. -/ +@[simp] +lemma lorentzMix_zero : lorentzMix Λ G 0 = G := Multiset.foldr_zero _ _ + +/-- Mixing along `a ::ₘ s` peels `a` after mixing along `s`. -/ +lemma lorentzMix_cons (a : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ G (a ::ₘ s) = lorentzMixStep Λ a (lorentzMix Λ G s) := + Multiset.foldr_cons _ _ _ _ + +/-- The peeling step of `lorentzMix_cons`, written out. -/ +lemma lorentzMix_cons_apply (a : Fin 1 ⊕ Fin 3) (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ G (a ::ₘ s) t = + ∑ b, (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) • lorentzMix Λ G s (b ::ₘ t) := by + rw [lorentzMix_cons]; rfl + +/-- Mixing along a sum of multisets is mixing twice. -/ +lemma lorentzMix_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ G (s + t) = lorentzMix Λ (lorentzMix Λ G t) s := by + induction s using Multiset.induction_on with + | empty => rw [zero_add, lorentzMix_zero] + | cons a s ih => rw [Multiset.cons_add, lorentzMix_cons, ih, lorentzMix_cons] + +/-- The mixing operator agrees with the tuple form of the Lorentz law: along an + ordered tuple of directions it is the sum over all tuples with one Lorentz matrix + factor per slot. -/ +lemma lorentzMix_ofFn {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ G (List.ofFn l) t = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + G ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) + t) := by + induction n generalizing t with + | zero => + rw [List.ofFn_zero, show ((([] : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) = 0) + from rfl, lorentzMix_zero, Fintype.sum_unique] + simp [List.ofFn_zero, show ((([] : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) = 0) from rfl] + | succ n ih => + have hcons : ∀ (a : Fin 1 ⊕ Fin 3) (p : Fin n → (Fin 1 ⊕ Fin 3)), + ((List.ofFn (Fin.cons a p) : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) = + a ::ₘ ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) := by + intro a p + rw [List.ofFn_succ] + simp only [Fin.cons_zero, Fin.cons_succ] + rfl + rw [show ((List.ofFn l : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) = + l 0 ::ₘ ((List.ofFn fun i : Fin n => l i.succ : List (Fin 1 ⊕ Fin 3)) : + Multiset (Fin 1 ⊕ Fin 3)) from by rw [List.ofFn_succ]; rfl, + lorentzMix_cons_apply] + rw [← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => (Fin 1 ⊕ Fin 3)) + (fun p : Fin (n + 1) → (Fin 1 ⊕ Fin 3) => + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + G ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) + t)), + Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [ih (fun i => l i.succ) (a ::ₘ t), Finset.smul_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + show (((SL2C.toLorentzGroup Λ).1 a (l 0) : ℝ) : ℂ) • + ((∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + G ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) + (a ::ₘ t))) = + (∏ i, (((SL2C.toLorentzGroup Λ).1 + ((Fin.cons a p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) i) (l i) : ℝ) : ℂ)) • + G ((List.ofFn (Fin.cons a p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) : + List (Fin 1 ⊕ Fin 3)) + t) + rw [Fin.prod_univ_succ, hcons a p, smul_smul] + simp only [Fin.cons_zero, Fin.cons_succ] + congr 1 + rw [Multiset.cons_add, add_comm _ (a ::ₘ t), Multiset.cons_add, add_comm t] + +/-- Evaluating a mixed family away from the empty multiset is mixing the translated + family at the empty multiset. -/ +lemma lorentzMix_apply_add (Λ : SL(2,ℂ)) (s : Multiset (Fin 1 ⊕ Fin 3)) : + ∀ (G : Multiset (Fin 1 ⊕ Fin 3) → M) (t : Multiset (Fin 1 ⊕ Fin 3)), + lorentzMix Λ G s t = lorentzMix Λ (fun r => G (r + t)) s 0 := by + induction s using Multiset.induction_on with + | empty => intro G t; rw [lorentzMix_zero, lorentzMix_zero, zero_add] + | cons a s ih => + intro G t + rw [lorentzMix_cons_apply, lorentzMix_cons_apply] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [ih G (b ::ₘ t), ih (fun r => G (r + t)) (b ::ₘ 0)] + congr 2 + funext r + congr 1 + rw [show (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = {b} from rfl, + ← Multiset.singleton_add, add_assoc] + +/-- The mixing operator is additive in the family. -/ +lemma lorentzMix_add_fam (Λ : SL(2,ℂ)) (G₁ G₂ : Multiset (Fin 1 ⊕ Fin 3) → M) + (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ (fun r => G₁ r + G₂ r) s t = + lorentzMix Λ G₁ s t + lorentzMix Λ G₂ s t := by + induction s using Multiset.induction_on generalizing t with + | empty => rw [lorentzMix_zero, lorentzMix_zero, lorentzMix_zero] + | cons a s ih => + rw [lorentzMix_cons_apply, lorentzMix_cons_apply, lorentzMix_cons_apply, + ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun b _ => by rw [ih, smul_add] + +/-- The mixing operator commutes with any linear map applied to the values. -/ +lemma lorentzMix_map (Φ : M →ₗ[ℂ] N) (Λ : SL(2,ℂ)) (G : Multiset (Fin 1 ⊕ Fin 3) → M) + (s t : Multiset (Fin 1 ⊕ Fin 3)) : + Φ (lorentzMix Λ G s t) = lorentzMix Λ (fun r => Φ (G r)) s t := by + induction s using Multiset.induction_on generalizing t with + | empty => rw [lorentzMix_zero, lorentzMix_zero] + | cons a s ih => + rw [lorentzMix_cons_apply, lorentzMix_cons_apply, map_sum] + exact Finset.sum_congr rfl fun b _ => by rw [map_smul, ih] + +/-- The mixing operator is homogeneous in the family. -/ +lemma lorentzMix_smul_fam (Λ : SL(2,ℂ)) (c : ℂ) (G : Multiset (Fin 1 ⊕ Fin 3) → M) + (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ (fun r => c • G r) s t = c • lorentzMix Λ G s t := + (lorentzMix_map (c • LinearMap.id) Λ G s t).symm + +/-- The mixing operator commutes with finite sums of families. -/ +lemma lorentzMix_sum_fam {ι : Type*} [Fintype ι] (Λ : SL(2,ℂ)) + (H : ι → Multiset (Fin 1 ⊕ Fin 3) → M) (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ (fun r => ∑ i, H i r) s t = ∑ i, lorentzMix Λ (H i) s t := by + induction s using Multiset.induction_on generalizing t with + | empty => simp only [lorentzMix_zero] + | cons a s ih => + rw [lorentzMix_cons_apply] + simp only [lorentzMix_cons_apply, ih, Finset.smul_sum] + rw [Finset.sum_comm] + +end LorentzMix + +section LorentzMixGroup + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + +/-- The mixing operator commutes with negation of the family. -/ +lemma lorentzMix_neg_fam (Λ : SL(2,ℂ)) (G : Multiset (Fin 1 ⊕ Fin 3) → M) + (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ (fun r => -G r) s t = -lorentzMix Λ G s t := by + rw [show (fun r => -G r) = fun r => (-1 : ℂ) • G r from + funext fun r => by rw [neg_one_smul], lorentzMix_smul_fam, neg_one_smul] + +/-- The mixing operator is additive in the family, in subtracted form. -/ +lemma lorentzMix_sub_fam (Λ : SL(2,ℂ)) (G₁ G₂ : Multiset (Fin 1 ⊕ Fin 3) → M) + (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ (fun r => G₁ r - G₂ r) s t = + lorentzMix Λ G₁ s t - lorentzMix Λ G₂ s t := by + simp only [sub_eq_add_neg] + rw [lorentzMix_add_fam Λ G₁ (fun r => -G₂ r), lorentzMix_neg_fam] + +end LorentzMixGroup + + +/-! + +## The Leibniz convolution and the mixing operator + +The correction terms of a covariant derivative are Leibniz convolutions over the +multiset antidiagonal: a gauge-field symbol carrying `x` derivatives against a matter +symbol carrying `y`, summed over all splittings `s = x + y`. Expanded in bases of the +gauge algebra and of the value space, both `actionFamConv` and `bracketFamConv` are +scalar combinations of such convolutions of plain products in `B`, which is why +`lorentzMix_derivConv` — the mixing operator is a morphism for the convolution — is +what carries a Lorentz law through a covariant derivative. + +-/ + +section DerivConv + +variable {B : Type} [Ring B] [Algebra ℂ B] + +omit [Algebra ℂ B] in +/-- A finite sum inside a multiset sum may be taken outside. -/ +lemma multiset_sum_map_sum {α ι : Type*} [Fintype ι] (m : Multiset α) (F : ι → α → B) : + (m.map fun x => ∑ i, F i x).sum = ∑ i, (m.map (F i)).sum := by + induction m using Multiset.induction_on with + | empty => simp + | cons x m ih => + rw [Multiset.map_cons, Multiset.sum_cons, ih, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun i _ => by rw [Multiset.map_cons, Multiset.sum_cons] + +/-- The Leibniz convolution of two families of derivative symbols: the sum over the + splittings of the multiset of the products of the two symbols. -/ +noncomputable def derivConv (f g : Multiset (Fin 1 ⊕ Fin 3) → B) + (s : Multiset (Fin 1 ⊕ Fin 3)) : B := + (s.antidiagonal.map fun p => f p.1 * g p.2).sum + +omit [Algebra ℂ B] in +/-- One derivative peeled off a convolution lands on one factor or the other. -/ +lemma derivConv_cons (f g : Multiset (Fin 1 ⊕ Fin 3) → B) (a : Fin 1 ⊕ Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + derivConv f g (a ::ₘ s) = + derivConv f (fun r => g (r + {a})) s + derivConv (fun r => f (r + {a})) g s := by + rw [derivConv, derivConv, derivConv, Multiset.antidiagonal_cons, Multiset.map_add, + Multiset.sum_add, Multiset.map_map, Multiset.map_map] + congr 1 + · exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => by + simp [← Multiset.singleton_add, add_comm]) + · exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => by + simp [← Multiset.singleton_add, add_comm]) + +/-- The convolution is linear in its right-hand family. -/ +lemma derivConv_sum_right {ι : Type*} [Fintype ι] (f : Multiset (Fin 1 ⊕ Fin 3) → B) + (c : ι → ℂ) (g : ι → Multiset (Fin 1 ⊕ Fin 3) → B) (s : Multiset (Fin 1 ⊕ Fin 3)) : + derivConv f (fun r => ∑ i, c i • g i r) s = ∑ i, c i • derivConv f (g i) s := by + rw [derivConv] + rw [Multiset.map_congr rfl fun p _ => show + f p.1 * (∑ i, c i • g i p.2) = ∑ i, c i • (f p.1 * g i p.2) from by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun i _ => by rw [mul_smul_comm]] + rw [multiset_sum_map_sum] + exact Finset.sum_congr rfl fun i _ => by + rw [derivConv, Multiset.smul_sum, Multiset.map_map] + rfl + +/-- The convolution is linear in its left-hand family. -/ +lemma derivConv_sum_left {ι : Type*} [Fintype ι] (g : Multiset (Fin 1 ⊕ Fin 3) → B) + (c : ι → ℂ) (f : ι → Multiset (Fin 1 ⊕ Fin 3) → B) (s : Multiset (Fin 1 ⊕ Fin 3)) : + derivConv (fun r => ∑ i, c i • f i r) g s = ∑ i, c i • derivConv (f i) g s := by + rw [derivConv] + rw [Multiset.map_congr rfl fun p _ => show + (∑ i, c i • f i p.1) * g p.2 = ∑ i, c i • (f i p.1 * g p.2) from by + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun i _ => by rw [smul_mul_assoc]] + rw [multiset_sum_map_sum] + exact Finset.sum_congr rfl fun i _ => by + rw [derivConv, Multiset.smul_sum, Multiset.map_map] + rfl + +/-- The Lorentz mixing operator is a morphism for the Leibniz convolution: mixing the + two factors separately and convolving is the same as convolving and then mixing. -/ +lemma lorentzMix_derivConv (Λ : SL(2,ℂ)) (s : Multiset (Fin 1 ⊕ Fin 3)) : + ∀ (f g : Multiset (Fin 1 ⊕ Fin 3) → B), + derivConv (fun x => lorentzMix Λ f x 0) (fun y => lorentzMix Λ g y 0) s = + lorentzMix Λ (derivConv f g) s 0 := by + induction s using Multiset.induction_on with + | empty => simp [derivConv] + | cons a s ih => + intro f g + have hshift : ∀ (h : Multiset (Fin 1 ⊕ Fin 3) → B) (r : Multiset (Fin 1 ⊕ Fin 3)), + lorentzMix Λ h (r + {a}) 0 = + ∑ b, (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) • + lorentzMix Λ (fun q => h (q + {b})) r 0 := by + intro h r + rw [lorentzMix_add] + rw [show lorentzMix Λ h {a} = fun q => + ∑ b, (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) • h (q + {b}) from by + funext q + rw [show ({a} : Multiset (Fin 1 ⊕ Fin 3)) = a ::ₘ 0 from rfl, + lorentzMix_cons_apply] + exact Finset.sum_congr rfl fun b _ => by + rw [lorentzMix_zero, ← Multiset.singleton_add, add_comm]] + rw [lorentzMix_sum_fam] + exact Finset.sum_congr rfl fun b _ => by rw [lorentzMix_smul_fam] + rw [derivConv_cons, lorentzMix_cons_apply] + rw [show (fun r => lorentzMix Λ g (r + {a}) 0) = fun r => + ∑ b, (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) • + lorentzMix Λ (fun q => g (q + {b})) r 0 from funext fun r => hshift g r, + show (fun r => lorentzMix Λ f (r + {a}) 0) = fun r => + ∑ b, (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) • + lorentzMix Λ (fun q => f (q + {b})) r 0 from funext fun r => hshift f r, + derivConv_sum_right, derivConv_sum_left, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [ih f (fun q => g (q + {b})), ih (fun q => f (q + {b})) g, ← smul_add] + congr 1 + rw [lorentzMix_apply_add Λ s (derivConv f g) (b ::ₘ 0), + show (fun r => derivConv f g (r + (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))))) = + fun r => derivConv f (fun q => g (q + {b})) r + + derivConv (fun q => f (q + {b})) g r from + funext fun r => by + rw [show r + (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = b ::ₘ r from by + rw [show (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = {b} from rfl, + ← Multiset.singleton_add, add_comm], derivConv_cons], + lorentzMix_add_fam] + +end DerivConv + +/-! + +## The gauge action commutes with the Lorentz action on the value spaces + +The correction term of a covariant derivative acts on the value index of a matter +symbol by the infinitesimal gauge action, while a Lorentz transformation acts on it by +the species representation. The two commute, because they act on different tensor +factors: the Lorentz group acts on the Weyl factor and the gauge algebra on the +colour and weak factors. That is what lets the contragredient Lorentz action be pulled +out of a covariant derivative symbol, in `IsGaugeField.actionFam_comp_dual` below. + +-/ + +section GaugeLorentzComm + +/-- An endomorphism of the second tensor factor commutes with one of the first. -/ +lemma lTensor_map_id_comm {W X : Type} [AddCommGroup W] [Module ℂ W] [AddCommGroup X] + [Module ℂ X] (f : X →ₗ[ℂ] X) (g : W →ₗ[ℂ] W) (t : W ⊗[ℂ] X) : + (LinearMap.lTensor W f) (TensorProduct.map g LinearMap.id t) = + TensorProduct.map g LinearMap.id ((LinearMap.lTensor W f) t) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul x y => simp + | add x y hx hy => simp [hx, hy] + +/-- Reassociating and recombining the last two tensor factors commutes with an + endomorphism of the first: the shape needed for the quark doublet, whose gauge action + is read on the combined colour–weak factor. -/ +lemma congr_assoc_map_id_comm {W X Y Z : Type} [AddCommGroup W] [Module ℂ W] + [AddCommGroup X] [Module ℂ X] [AddCommGroup Y] [Module ℂ Y] [AddCommGroup Z] + [Module ℂ Z] (E : X ⊗[ℂ] Y ≃ₗ[ℂ] Z) (g : W →ₗ[ℂ] W) (t : (W ⊗[ℂ] X) ⊗[ℂ] Y) : + (TensorProduct.congr (LinearEquiv.refl ℂ W) E) (TensorProduct.assoc ℂ W X Y + (TensorProduct.map (TensorProduct.map g LinearMap.id) LinearMap.id t)) = + TensorProduct.map g LinearMap.id + ((TensorProduct.congr (LinearEquiv.refl ℂ W) E) (TensorProduct.assoc ℂ W X Y t)) := by + induction t using TensorProduct.induction_on with + | zero => simp + | tmul x y => + induction x using TensorProduct.induction_on with + | zero => simp + | tmul a b => simp + | add p q hp hq => simp only [TensorProduct.add_tmul, map_add, hp, hq] + | add p q hp hq => simp only [map_add, hp, hq] + +/-- The infinitesimal gauge action on the Higgs commutes with the Lorentz action, which + is trivial. -/ +lemma HiggsVec.gaugeAlgebraAction_comm_repLorentz (c : GaugeAlgebra) (Λ : SL(2,ℂ)) + (v : HiggsVec) : + HiggsVec.gaugeAlgebraAction c ((Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ v) = + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ (HiggsVec.gaugeAlgebraAction c v) := by + simp + +/-- The infinitesimal gauge action on the down-type singlet acts on the colour factor, + the Lorentz action on the Weyl factor, so the two commute. -/ +lemma DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (c : GaugeAlgebra) + (Λ : SL(2,ℂ)) (v : DownSinglet) : + DownSinglet.gaugeAlgebraAction c (DownSinglet.repLorentzGroup Λ v) = + DownSinglet.repLorentzGroup Λ (DownSinglet.gaugeAlgebraAction c v) := + DownSinglet.valLinEquiv.injective + (lTensor_map_id_comm _ (Fermion.RightHandedWeyl.rep Λ) (DownSinglet.valLinEquiv v)) + +/-- The infinitesimal gauge action on the up-type singlet acts on the colour factor, + the Lorentz action on the Weyl factor, so the two commute. -/ +lemma UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (c : GaugeAlgebra) (Λ : SL(2,ℂ)) + (v : UpSinglet) : + UpSinglet.gaugeAlgebraAction c (UpSinglet.repLorentzGroup Λ v) = + UpSinglet.repLorentzGroup Λ (UpSinglet.gaugeAlgebraAction c v) := + UpSinglet.valLinEquiv.injective + (lTensor_map_id_comm _ (Fermion.RightHandedWeyl.rep Λ) (UpSinglet.valLinEquiv v)) + +/-- The infinitesimal gauge action on the lepton doublet acts on the weak factor, the + Lorentz action on the Weyl factor, so the two commute. -/ +lemma LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (c : GaugeAlgebra) + (Λ : SL(2,ℂ)) (v : LeptonDoublet) : + LeptonDoublet.gaugeAlgebraAction c (LeptonDoublet.repLorentzGroup Λ v) = + LeptonDoublet.repLorentzGroup Λ (LeptonDoublet.gaugeAlgebraAction c v) := + LeptonDoublet.valLinEquiv.injective + (lTensor_map_id_comm _ (Fermion.LeftHandedWeyl.rep Λ) (LeptonDoublet.valLinEquiv v)) + +/-- The infinitesimal gauge action on the charged-lepton singlet is a scalar, so it + commutes with the Lorentz action. -/ +lemma LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (c : GaugeAlgebra) + (Λ : SL(2,ℂ)) (v : LeptonSinglet) : + LeptonSinglet.gaugeAlgebraAction c (LeptonSinglet.repLorentzGroup Λ v) = + LeptonSinglet.repLorentzGroup Λ (LeptonSinglet.gaugeAlgebraAction c v) := by + show (Complex.I * (-(6 : ℂ) * c.toU1Value)) • (LeptonSinglet.repLorentzGroup Λ v) = + LeptonSinglet.repLorentzGroup Λ ((Complex.I * (-(6 : ℂ) * c.toU1Value)) • v) + rw [map_smul] + +/-- The infinitesimal gauge action on the quark doublet acts on the combined + colour–weak factor, the Lorentz action on the Weyl factor, so the two commute. -/ +lemma QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (c : GaugeAlgebra) + (Λ : SL(2,ℂ)) (v : QuarkDoublet) : + QuarkDoublet.gaugeAlgebraAction c (QuarkDoublet.repLorentzGroup Λ v) = + QuarkDoublet.repLorentzGroup Λ (QuarkDoublet.gaugeAlgebraAction c v) := by + have hg : ∀ x : QuarkDoublet, QuarkDoublet.colourWeakValLinEquiv + (QuarkDoublet.gaugeAlgebraAction c x) = + LinearMap.lTensor Fermion.LeftHandedWeyl + (Matrix.toLpLinAlgEquiv 2 (QuarkDoublet.actionMatrix c)) + (QuarkDoublet.colourWeakValLinEquiv x) := fun x => by + rw [show QuarkDoublet.gaugeAlgebraAction c x = + QuarkDoublet.colourWeakEnd (QuarkDoublet.actionMatrix c) x from rfl, + QuarkDoublet.colourWeakEnd_apply_mk, LinearEquiv.apply_symm_apply] + rfl + have hl : ∀ x : QuarkDoublet, QuarkDoublet.colourWeakValLinEquiv + (QuarkDoublet.repLorentzGroup Λ x) = + TensorProduct.map (Fermion.LeftHandedWeyl.rep Λ) LinearMap.id + (QuarkDoublet.colourWeakValLinEquiv x) := by + intro x + have h1 : QuarkDoublet.valLinEquiv (QuarkDoublet.repLorentzGroup Λ x) = + TensorProduct.map (TensorProduct.map (Fermion.LeftHandedWeyl.rep Λ) LinearMap.id) + LinearMap.id (QuarkDoublet.valLinEquiv x) := rfl + simp only [QuarkDoublet.colourWeakValLinEquiv, LinearEquiv.trans_apply, h1] + exact congr_assoc_map_id_comm _ _ _ + refine QuarkDoublet.colourWeakValLinEquiv.injective ?_ + rw [hg (QuarkDoublet.repLorentzGroup Λ v), hl v, + hl (QuarkDoublet.gaugeAlgebraAction c v), hg v] + exact lTensor_map_id_comm _ _ _ + +/-- Conjugation preserves the commutation of the gauge action with the Lorentz + action: both are read on the conjugate module through the same underlying maps. -/ +lemma actionConj_comm_repConj {V : Type} [AddCommGroup V] [Module ℂ V] + (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (rep : Representation ℂ SL(2,ℂ) V) + (h : ∀ (c : GaugeAlgebra) (Λ : SL(2,ℂ)) (v : V), act c (rep Λ v) = rep Λ (act c v)) + (c : GaugeAlgebra) (Λ : SL(2,ℂ)) (v : ConjModule V) : + GaugeAlgebra.actionConj act c (rep.conj Λ v) = + rep.conj Λ (GaugeAlgebra.actionConj act c v) := + congrArg (conjEquiv (k := ℂ) (M := V)) (h c Λ _) + +end GaugeLorentzComm + +/-! + +## The Lorentz law of the covariant matter towers + +The covariant derivative of a matter family adds one ordered derivative slot and a +Leibniz correction `A_ρ · F`. Under a Lorentz transformation the new slot mixes by its +own column of the Lorentz matrix, the plain derivative slots mix by `lorentzMix`, and +the value index transforms by the contragredient of the species representation. The +proof runs by induction on the number of covariant slots: the correction term is +handled by `repLorentz_actionFamConv`, which expands it in bases into convolutions of +products in `B` and applies `lorentzMix_derivConv`, and the contragredient action is +pulled through the correction by `actionFamConv_comp_dual`, which is where the +commutation of the gauge action with the Lorentz action is used. + +-/ + +namespace IsGaugeField + +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} + +/-- The action of families expanded in bases of the gauge algebra and the value space. -/ +lemma actionFam_apply_eq_sum {ι κ : Type} [Fintype ι] [Fintype κ] + (bg : Module.Basis ι ℝ GaugeAlgebra) (bv : Module.Basis κ ℂ V) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) + (φ : Module.Dual ℂ V) : + actionFam act f g φ = + ∑ j, ∑ k, φ (act (bg j) (bv k)) • (f (bg.coord j) * g (bv.coord k)) := by + rw [actionFam, dualPairEquiv_symm_eq_sum bg f, dualPairEquivC_symm_eq_sum bv g] + simp only [map_sum, LinearMap.sum_apply, tensorAction_tmul, dualPairEquivC_tmul] + rw [Finset.sum_comm] + +/-- The derived action family expanded in bases. -/ +lemma actionFamConv_eq_sum {ι κ : Type} [Fintype ι] [Fintype κ] + (bg : Module.Basis ι ℝ GaugeAlgebra) (bv : Module.Basis κ ℂ V) + (ρ : Fin 1 ⊕ Fin 3) (G : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + actionFamConv A act ρ G s φ = + ∑ j, ∑ k, φ (act (bg j) (bv k)) • + derivConv (fun x => A x ρ (bg.coord j)) (fun y => G y (bv.coord k)) s := by + rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + rw [Multiset.map_congr rfl fun p _ => actionFam_apply_eq_sum bg bv (A p.1 ρ) (G p.2) φ] + rw [multiset_sum_map_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [multiset_sum_map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [derivConv, Multiset.smul_sum, Multiset.map_map] + rfl + +/-- Rotating a triple sum so that the innermost index comes first. -/ +lemma sum_comm₃ {α β γ M : Type*} [Fintype α] [Fintype β] [Fintype γ] [AddCommMonoid M] + (X : α → β → γ → M) : (∑ a, ∑ b, ∑ c, X a b c) = ∑ c, ∑ a, ∑ b, X a b c := + (Finset.sum_congr rfl fun _ _ => Finset.sum_comm).trans Finset.sum_comm + +/-- The derived action family is linear in the matter family. -/ +lemma actionFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c : ι → ℂ) + (H : ι → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + actionFamConv A act ρ (fun t => ∑ i, c i • H i t) s φ = + ∑ i, c i • actionFamConv A act ρ (H i) s φ := by + classical + set bg := Module.finBasis ℝ GaugeAlgebra with hbg + set bv := Module.finBasis ℂ V with hbv + have hin : ∀ j k, derivConv (fun x => A x ρ (bg.coord j)) + (fun y => (∑ i, c i • H i y) (bv.coord k)) s = + ∑ i, c i • derivConv (fun x => A x ρ (bg.coord j)) + (fun y => H i y (bv.coord k)) s := by + intro j k + rw [← derivConv_sum_right] + simp only [LinearMap.sum_apply, LinearMap.smul_apply] + have hrhs : ∀ i, c i • actionFamConv A act ρ (H i) s φ = + ∑ j, ∑ k, (φ (act (bg j) (bv k)) * c i) • + derivConv (fun x => A x ρ (bg.coord j)) (fun y => H i y (bv.coord k)) s := by + intro i + rw [actionFamConv_eq_sum bg bv, Finset.smul_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun k _ => by rw [smul_smul, mul_comm] + rw [actionFamConv_eq_sum bg bv] + simp only [hin, Finset.smul_sum, smul_smul, hrhs] + exact sum_comm₃ _ + +omit [FiniteDimensional ℂ V] in +/-- A dual vector is the sum of its coordinates against the dual basis. -/ +lemma dual_eq_sum_coord {κ : Type} [Fintype κ] (bv : Module.Basis κ ℂ V) + (ψ : Module.Dual ℂ V) : ∑ k, ψ (bv k) • bv.coord k = ψ := by + refine bv.ext fun j => ?_ + rw [LinearMap.sum_apply] + simp only [LinearMap.smul_apply, Module.Basis.coord_apply, Module.Basis.repr_self, + smul_eq_mul] + rw [Finset.sum_eq_single j + (fun k _ hk => by rw [Finsupp.single_eq_of_ne hk, mul_zero]) + (fun h => absurd (Finset.mem_univ j) h)] + simp + +omit [FiniteDimensional ℂ V] in +/-- The twist of the value index past the gauge action: an endomorphism commuting with + the gauge action may be moved from the dual basis onto the dual vector. -/ +lemma dual_twist {κ : Type} [Fintype κ] (bv : Module.Basis κ ℂ V) (T : V →ₗ[ℂ] V) + (hT : ∀ (c : GaugeAlgebra) (v : V), act c (T v) = T (act c v)) + (c : GaugeAlgebra) (φ : Module.Dual ℂ V) : + ∑ k, φ (act c (bv k)) • T.dualMap (bv.coord k) = + ∑ k, (T.dualMap φ) (act c (bv k)) • bv.coord k := by + have h1 : ∑ k, φ (act c (bv k)) • T.dualMap (bv.coord k) + = T.dualMap (∑ k, φ (act c (bv k)) • bv.coord k) := by + rw [map_sum] + exact Finset.sum_congr rfl fun k _ => (map_smul _ _ _).symm + rw [h1, show (∑ k, φ (act c (bv k)) • bv.coord k) = φ ∘ₗ act c from + dual_eq_sum_coord bv (φ ∘ₗ act c), + show (∑ k, (T.dualMap φ) (act c (bv k)) • bv.coord k) = (T.dualMap φ) ∘ₗ act c from + dual_eq_sum_coord bv ((T.dualMap φ) ∘ₗ act c)] + exact LinearMap.ext fun v => congrArg φ (hT c v) + +/-- The contragredient action may be pulled out of an action of families, provided the + gauge action commutes with it on the value space. -/ +lemma actionFam_comp_dual (T : V →ₗ[ℂ] V) + (hT : ∀ (c : GaugeAlgebra) (v : V), act c (T v) = T (act c v)) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) + (φ : Module.Dual ℂ V) : + actionFam act f (g ∘ₗ T.dualMap) φ = actionFam act f g (T.dualMap φ) := by + classical + set bg := Module.finBasis ℝ GaugeAlgebra with hbg + set bv := Module.finBasis ℂ V with hbv + rw [actionFam_apply_eq_sum bg bv, actionFam_apply_eq_sum bg bv] + refine Finset.sum_congr rfl fun j _ => ?_ + have key : ∀ (α : Fin (Module.finrank ℂ V) → ℂ) + (v : Fin (Module.finrank ℂ V) → Module.Dual ℂ V), + ∑ k, α k • (f (bg.coord j) * g (v k)) = f (bg.coord j) * g (∑ k, α k • v k) := by + intro α v + rw [map_sum, Finset.mul_sum] + exact Finset.sum_congr rfl fun k _ => by rw [map_smul, mul_smul_comm] + simp only [LinearMap.comp_apply] + rw [key (fun k => φ (act (bg j) (bv k))) (fun k => T.dualMap (bv.coord k)), + key (fun k => (T.dualMap φ) (act (bg j) (bv k))) (fun k => bv.coord k), + dual_twist bv T hT] + +/-- The contragredient action may be pulled out of a derived action family. -/ +lemma actionFamConv_comp_dual (T : V →ₗ[ℂ] V) + (hT : ∀ (c : GaugeAlgebra) (v : V), act c (T v) = T (act c v)) (ρ : Fin 1 ⊕ Fin 3) + (K : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + actionFamConv A act ρ (fun t => K t ∘ₗ T.dualMap) s φ = + actionFamConv A act ρ K s (T.dualMap φ) := by + rw [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, actionFamConv, + Multiset.sum_linearMap_apply, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => + actionFam_comp_dual T hT (A p.1 ρ) (K p.2) φ) + +section LorentzLaws + +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable {rep : Representation ℂ SL(2,ℂ) V} + +/-- Every multiset of directions is the underlying multiset of an ordered tuple. -/ +lemma exists_ofFn_eq (x : Multiset (Fin 1 ⊕ Fin 3)) : + ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), + x = ((List.ofFn l : List (Fin 1 ⊕ Fin 3)) : Multiset (Fin 1 ⊕ Fin 3)) := + ⟨x.toList.length, x.toList.get, by rw [List.ofFn_get, Multiset.coe_toList]⟩ + +/-- The Lorentz law of the gauge-field symbols, in the multiset form. -/ +lemma repLorentz_apply_mix (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) + (x : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (χ : Module.Dual ℝ GaugeAlgebra) : + repLorentz Λ (A x μ χ) = + lorentzMix Λ (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • A t a χ) x 0 := by + obtain ⟨n, l, rfl⟩ := exists_ofFn_eq x + rw [hA.lorentz_apply Λ n l μ χ, lorentzMix_ofFn] + exact Finset.sum_congr rfl fun p _ => by rw [add_zero] + +omit [FiniteDimensional ℂ V] in +/-- The Lorentz law of a family of derivative symbols, in the multiset form. -/ +lemma isLorentzDerivTransforms_mix + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hF : IsLorentzDerivTransforms repLorentz rep F) (Λ : SL(2,ℂ)) + (x : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V) : + repLorentz Λ (F x χ) = lorentzMix Λ (fun t => F t (rep.dual Λ χ)) x 0 := by + obtain ⟨n, l, rfl⟩ := exists_ofFn_eq x + rw [hF Λ n l χ, lorentzMix_ofFn] + exact Finset.sum_congr rfl fun p _ => by rw [add_zero] + +/-- The Lorentz law of a Leibniz convolution: the mixing operator is a morphism for the + convolution, so a convolution of two families with Lorentz laws has one too. -/ +lemma repLorentz_derivConv + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (Λ : SL(2,ℂ)) (f f' g g' : Multiset (Fin 1 ⊕ Fin 3) → B) + (hf : ∀ x, repLorentz Λ (f x) = lorentzMix Λ f' x 0) + (hg : ∀ y, repLorentz Λ (g y) = lorentzMix Λ g' y 0) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + repLorentz Λ (derivConv f g s) = lorentzMix Λ (derivConv f' g') s 0 := by + rw [derivConv, map_multiset_sum, Multiset.map_map, ← lorentzMix_derivConv, derivConv] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => by + rw [Function.comp_apply, hmul, hf, hg]) + +/-- The Lorentz law of the derived action family: the derivative slots mix, the + direction of the gauge field mixes by its own column, and the value index is carried + by the transformed matter family. -/ +lemma repLorentz_actionFamConv + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + (G G' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (hG : ∀ y χ, repLorentz Λ (G y χ) = lorentzMix Λ (fun t => G' t χ) y 0) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + repLorentz Λ (actionFamConv A act ρ G s φ) = + ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • + lorentzMix Λ (fun t => actionFamConv A act a G' t φ) s 0 := by + classical + set bg := Module.finBasis ℝ GaugeAlgebra with hbg + set bv := Module.finBasis ℂ V with hbv + rw [actionFamConv_eq_sum bg bv] + simp only [map_sum] + have hterm : ∀ (j : Fin (Module.finrank ℝ GaugeAlgebra)) + (k : Fin (Module.finrank ℂ V)), + repLorentz Λ (φ (act (bg j) (bv k)) • + derivConv (fun x => A x ρ (bg.coord j)) (fun y => G y (bv.coord k)) s) = + ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • (φ (act (bg j) (bv k)) • + lorentzMix Λ (derivConv (fun x => A x a (bg.coord j)) + (fun y => G' y (bv.coord k))) s 0) := by + intro j k + rw [map_smul, repLorentz_derivConv hmul Λ _ + (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • A t a (bg.coord j)) _ + (fun t => G' t (bv.coord k)) + (fun x => repLorentz_apply_mix hA Λ x ρ (bg.coord j)) + (fun y => hG y (bv.coord k))] + rw [show derivConv + (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • A t a (bg.coord j)) + (fun y => G' y (bv.coord k)) = + fun r => ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • + derivConv (fun x => A x a (bg.coord j)) (fun y => G' y (bv.coord k)) r from + funext fun r => derivConv_sum_left _ _ _ _, lorentzMix_sum_fam, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [lorentzMix_smul_fam, smul_comm] + simp only [hterm] + rw [sum_comm₃ (fun j k a => (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • + (φ (act (bg j) (bv k)) • lorentzMix Λ (derivConv (fun x => A x a (bg.coord j)) + (fun y => G' y (bv.coord k))) s 0))] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [show (fun t => actionFamConv A act a G' t φ) = fun t => + ∑ j, ∑ k, φ (act (bg j) (bv k)) • + derivConv (fun x => A x a (bg.coord j)) (fun y => G' y (bv.coord k)) t from + funext fun t => actionFamConv_eq_sum bg bv a G' t φ, + lorentzMix_sum_fam, Finset.smul_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [lorentzMix_sum_fam, Finset.smul_sum] + exact Finset.sum_congr rfl fun k _ => by rw [lorentzMix_smul_fam] + +/-- The Lorentz law of the iterated covariant derivative of a matter family: the + ordered covariant slots mix by their own columns and the multiset of plain derivative + slots mixes by `lorentzMix`, while the value index transforms contragradiently. -/ +lemma repLorentz_covDerivIter + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) + (hcomm : ∀ (c : GaugeAlgebra) (Λ : SL(2,ℂ)) (v : V), + act c (rep Λ v) = rep Λ (act c v)) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (hF : IsLorentzDerivTransforms repLorentz rep F) (Λ : SL(2,ℂ)) : + ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V), + repLorentz Λ (covDerivIter A act F n l s φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => covDerivIter A act F n p t (rep.dual Λ φ)) s 0 := by + have hT : ∀ (c : GaugeAlgebra) (v : V), act c (rep Λ⁻¹ v) = rep Λ⁻¹ (act c v) := + fun c v => hcomm c Λ⁻¹ v + intro n + induction n with + | zero => + intro l s φ + rw [Fintype.sum_unique] + simp only [covDerivIter_zero, Finset.univ_eq_empty, Finset.prod_empty, one_smul] + exact isLorentzDerivTransforms_mix hF Λ s φ + | succ n ih => + intro l s φ + have hG : ∀ (y : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + repLorentz Λ (covDerivIter A act F n (fun i => l i.succ) y χ) = + lorentzMix Λ (fun t => (∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + (covDerivIter A act F n p t ∘ₗ (rep Λ⁻¹).dualMap)) χ) y 0 := by + intro y χ + rw [show (fun t => (∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + (covDerivIter A act F n p t ∘ₗ (rep Λ⁻¹).dualMap)) χ) = + fun t => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + covDerivIter A act F n p t (rep.dual Λ χ) from funext fun t => by + simp only [LinearMap.sum_apply, LinearMap.smul_apply, LinearMap.comp_apply] + rfl, lorentzMix_sum_fam, ih (fun i => l i.succ) y χ] + exact Finset.sum_congr rfl fun p _ => (lorentzMix_smul_fam _ _ _ _ _).symm + have hconv : ∀ (b : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)), + actionFamConv A act b (fun r => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + (covDerivIter A act F n p r ∘ₗ (rep Λ⁻¹).dualMap)) t φ = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + actionFamConv A act b (covDerivIter A act F n p) t (rep.dual Λ φ) := by + intro b t + rw [actionFamConv_sum_fam b + (fun p : Fin n → (Fin 1 ⊕ Fin 3) => + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ))) + (fun p r => covDerivIter A act F n p r ∘ₗ (rep Λ⁻¹).dualMap) t φ] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [actionFamConv_comp_dual (rep Λ⁻¹) hT b (covDerivIter A act F n p) t φ] + rfl + rw [covDerivIter_succ, covDerivAction_apply, map_add, + ih (fun i => l i.succ) (l 0 ::ₘ s) φ, + repLorentz_actionFamConv hmul hA Λ (l 0) _ _ hG s φ] + -- the two terms, both as sums over a direction and a lower tuple + have hterm₁ : ∀ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => covDerivIter A act F n p t (rep.dual Λ φ)) + (l 0 ::ₘ s) 0 = + ∑ b, ((∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) * + (((SL2C.toLorentzGroup Λ).1 b (l 0) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => covDerivIter A act F n p (b ::ₘ t) + (rep.dual Λ φ)) s 0 := by + intro p + rw [lorentzMix_cons_apply, Finset.smul_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [lorentzMix_apply_add Λ s _ (b ::ₘ 0), smul_smul, + show (fun r => (fun t => covDerivIter A act F n p t (rep.dual Λ φ)) + (r + (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))))) = + fun r => covDerivIter A act F n p (b ::ₘ r) (rep.dual Λ φ) from + funext fun r => by + rw [show r + (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = b ::ₘ r from by + rw [show (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = {b} from rfl, + ← Multiset.singleton_add, add_comm]]] + have hterm₂ : ∀ b : Fin 1 ⊕ Fin 3, + (((SL2C.toLorentzGroup Λ).1 b (l 0) : ℝ) : ℂ) • + lorentzMix Λ (fun t => actionFamConv A act b + (fun r => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + (covDerivIter A act F n p r ∘ₗ (rep Λ⁻¹).dualMap)) t φ) s 0 = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + ((((SL2C.toLorentzGroup Λ).1 b (l 0) : ℝ) : ℂ) * + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ))) • + lorentzMix Λ (fun t => actionFamConv A act b + (covDerivIter A act F n p) t (rep.dual Λ φ)) s 0 := by + intro b + rw [show (fun t => actionFamConv A act b + (fun r => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + (covDerivIter A act F n p r ∘ₗ (rep Λ⁻¹).dualMap)) t φ) = + fun t => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + actionFamConv A act b (covDerivIter A act F n p) t (rep.dual Λ φ) from + funext fun t => hconv b t, lorentzMix_sum_fam, Finset.smul_sum] + exact Finset.sum_congr rfl fun p _ => by rw [lorentzMix_smul_fam, smul_smul] + simp only [hterm₁, hterm₂] + rw [Finset.sum_comm (γ := Fin n → (Fin 1 ⊕ Fin 3)), ← Finset.sum_add_distrib] + rw [← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => (Fin 1 ⊕ Fin 3)) + (fun q : Fin (n + 1) → (Fin 1 ⊕ Fin 3) => + (∏ i, (((SL2C.toLorentzGroup Λ).1 (q i) (l i) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => covDerivIter A act F (n + 1) q t (rep.dual Λ φ)) + s 0), + Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun p _ => ?_ + show _ = (∏ i, (((SL2C.toLorentzGroup Λ).1 + ((Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) i) (l i) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => covDerivIter A act F (n + 1) + (Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) t (rep.dual Λ φ)) s 0 + rw [Fin.prod_univ_succ] + simp only [Fin.cons_zero, Fin.cons_succ] + rw [show (fun t => covDerivIter A act F (n + 1) + (Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) t (rep.dual Λ φ)) = + fun t => covDerivIter A act F n p (b ::ₘ t) (rep.dual Λ φ) + + actionFamConv A act b (covDerivIter A act F n p) t (rep.dual Λ φ) from + funext fun t => by + rw [covDerivIter_succ] + simp only [Fin.cons_zero, Fin.cons_succ] + rw [covDerivAction_apply], lorentzMix_add_fam, smul_add, mul_comm] + +/-- The iterated covariant derivative of a matter family transforms as the covariant + derivatives of a Lorentz-covariant field, given the Lorentz law of the bare symbols, + the Lorentz law of the gauge field, and the commutation of the infinitesimal gauge + action with the Lorentz action on the value space. -/ +theorem isLorentzCovDerivTransforms_covDerivIter + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) + (hcomm : ∀ (c : GaugeAlgebra) (Λ : SL(2,ℂ)) (v : V), + act c (rep Λ v) = rep Λ (act c v)) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + (hF : IsLorentzDerivTransforms repLorentz rep F) : + IsLorentzCovDerivTransforms repLorentz rep + (fun {n} l => covDerivIter A act F n l 0) := by + intro Λ n l φ + rw [repLorentz_covDerivIter hmul hA hcomm F hF Λ n l 0 φ] + simp only [lorentzMix_zero] + +end LorentzLaws + +end IsGaugeField + +/-! + +## The Lorentz law of the covariant field-strength tower + +The covariant derivative of an adjoint family is the same shape as that of a matter +family, with the action of the gauge field on the value index replaced by the bracket +`⁅A_ρ, ·⁆`; the gauge index carries no Lorentz weight, so no contragredient twist +appears and the induction is the matter one with `bracketFamConv` in place of +`actionFamConv`. What is new is the seed: the field strength itself carries two +covector indices, and its Lorentz law (`repLorentz_fieldStrength_mix`) mixes both, +the derivative terms through `repLorentz_apply_mix` and the commutator term through +the bracket convolution. + +-/ + +namespace IsGaugeField + +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} + +/-- The derived bracket family expanded in a basis of the gauge algebra. -/ +lemma bracketFamConv_eq_sum (ρ : Fin 1 ⊕ Fin 3) + (G : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + bracketFamConv A ρ G s φ = + ∑ j, ∑ k, ((φ ⁅Module.Free.chooseBasis ℝ GaugeAlgebra j, + Module.Free.chooseBasis ℝ GaugeAlgebra k⁆ : ℝ) : ℂ) • + derivConv (fun x => A x ρ ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord j)) + (fun y => G y ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord k)) s := by + rw [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + rw [Multiset.map_congr rfl fun p _ => bracketFam_apply_eq_sum (A p.1 ρ) (G p.2) φ] + rw [multiset_sum_map_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [multiset_sum_map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [derivConv, Multiset.smul_sum, Multiset.map_map] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => (Complex.coe_smul _ _).symm) + +/-- The derived bracket family is linear in the second family. -/ +lemma bracketFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c : ι → ℂ) + (H : ι → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + bracketFamConv A ρ (fun t => ∑ i, c i • H i t) s φ = + ∑ i, c i • bracketFamConv A ρ (H i) s φ := by + classical + have hin : ∀ j k, derivConv + (fun x => A x ρ ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord j)) + (fun y => (∑ i, c i • H i y) + ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord k)) s = + ∑ i, c i • derivConv + (fun x => A x ρ ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord j)) + (fun y => H i y ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord k)) s := by + intro j k + rw [← derivConv_sum_right] + simp only [LinearMap.sum_apply, LinearMap.smul_apply] + have hrhs : ∀ i, c i • bracketFamConv A ρ (H i) s φ = + ∑ j, ∑ k, (((φ ⁅Module.Free.chooseBasis ℝ GaugeAlgebra j, + Module.Free.chooseBasis ℝ GaugeAlgebra k⁆ : ℝ) : ℂ) * c i) • + derivConv (fun x => A x ρ ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord j)) + (fun y => H i y ((Module.Free.chooseBasis ℝ GaugeAlgebra).coord k)) s := by + intro i + rw [bracketFamConv_eq_sum, Finset.smul_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun k _ => by rw [smul_smul, mul_comm] + rw [bracketFamConv_eq_sum] + simp only [hin, Finset.smul_sum, smul_smul, hrhs] + exact sum_comm₃ _ + +/-- The Lorentz law of the derived bracket family. -/ +lemma repLorentz_bracketFamConv + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + (G G' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (hG : ∀ y χ, repLorentz Λ (G y χ) = lorentzMix Λ (fun t => G' t χ) y 0) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + repLorentz Λ (bracketFamConv A ρ G s φ) = + ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • + lorentzMix Λ (fun t => bracketFamConv A a G' t φ) s 0 := by + classical + rw [bracketFamConv_eq_sum] + set bg := Module.Free.chooseBasis ℝ GaugeAlgebra with hbg + simp only [map_sum] + have hterm : ∀ (j k : Module.Free.ChooseBasisIndex ℝ GaugeAlgebra), + repLorentz Λ (((φ ⁅bg j, bg k⁆ : ℝ) : ℂ) • + derivConv (fun x => A x ρ (bg.coord j)) (fun y => G y (bg.coord k)) s) = + ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • (((φ ⁅bg j, bg k⁆ : ℝ) : ℂ) • + lorentzMix Λ (derivConv (fun x => A x a (bg.coord j)) + (fun y => G' y (bg.coord k))) s 0) := by + intro j k + rw [map_smul, repLorentz_derivConv hmul Λ _ + (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • A t a (bg.coord j)) _ + (fun t => G' t (bg.coord k)) + (fun x => repLorentz_apply_mix hA Λ x ρ (bg.coord j)) + (fun y => hG y (bg.coord k))] + rw [show derivConv + (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • A t a (bg.coord j)) + (fun y => G' y (bg.coord k)) = + fun r => ∑ a, (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • + derivConv (fun x => A x a (bg.coord j)) (fun y => G' y (bg.coord k)) r from + funext fun r => derivConv_sum_left _ _ _ _, lorentzMix_sum_fam, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [lorentzMix_smul_fam, smul_comm] + simp only [hterm] + rw [sum_comm₃ (fun j k a => (((SL2C.toLorentzGroup Λ).1 a ρ : ℝ) : ℂ) • + (((φ ⁅bg j, bg k⁆ : ℝ) : ℂ) • lorentzMix Λ (derivConv (fun x => A x a (bg.coord j)) + (fun y => G' y (bg.coord k))) s 0))] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [show (fun t => bracketFamConv A a G' t φ) = fun t => + ∑ j, ∑ k, ((φ ⁅bg j, bg k⁆ : ℝ) : ℂ) • + derivConv (fun x => A x a (bg.coord j)) (fun y => G' y (bg.coord k)) t from + funext fun t => bracketFamConv_eq_sum a G' t φ, + lorentzMix_sum_fam, Finset.smul_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [lorentzMix_sum_fam, Finset.smul_sum] + exact Finset.sum_congr rfl fun k _ => by rw [lorentzMix_smul_fam] + +/-- The iterated covariant derivative in the adjoint is linear in the seed family. -/ +lemma iteratedCovDerivAdjoint_sum_fam {ι : Type} [Fintype ι] (c : ι → ℂ) + (H : ι → Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + ∀ (l : List (Fin 1 ⊕ Fin 3)) (x : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra), + iteratedCovDerivAdjoint A l (fun t => ∑ i, c i • H i t) x φ = + ∑ i, c i • iteratedCovDerivAdjoint A l (H i) x φ := by + intro l + induction l with + | nil => + intro x φ + simp only [iteratedCovDerivAdjoint, LinearMap.sum_apply, LinearMap.smul_apply] + | cons ρ l ih => + intro x φ + have hfam : iteratedCovDerivAdjoint A l (fun t => ∑ i, c i • H i t) = + fun t => ∑ i, c i • iteratedCovDerivAdjoint A l (H i) t := + funext fun t => LinearMap.ext fun χ => by + rw [ih t χ] + simp only [LinearMap.sum_apply, LinearMap.smul_apply] + show covDerivAdjoint A (iteratedCovDerivAdjoint A l + (fun t => ∑ i, c i • H i t)) ρ x φ = _ + rw [covDerivAdjoint_apply, hfam, bracketFamConv_sum_fam] + simp only [LinearMap.sum_apply, LinearMap.smul_apply] + rw [← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun i _ => by rw [← smul_add]; rfl + +/-- The Lorentz law of the iterated covariant derivative in the adjoint: the covariant + slots mix by their own columns and the seed family is replaced by its transform. -/ +lemma repLorentz_iteratedCovDerivAdjoint + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) + (F F' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (hF : ∀ x χ, repLorentz Λ (F x χ) = lorentzMix Λ (fun t => F' t χ) x 0) : + ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (x : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (iteratedCovDerivAdjoint A (List.ofFn l) F x φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => + iteratedCovDerivAdjoint A (List.ofFn p) F' t φ) x 0 := by + intro n + induction n with + | zero => + intro l x φ + rw [Fintype.sum_unique] + simp only [List.ofFn_zero, Finset.univ_eq_empty, Finset.prod_empty, one_smul] + exact hF x φ + | succ n ih => + intro l x φ + have hG : ∀ (y : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (iteratedCovDerivAdjoint A + (List.ofFn fun i : Fin n => l i.succ) F y χ) = + lorentzMix Λ (fun t => (∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + iteratedCovDerivAdjoint A (List.ofFn p) F' t) χ) y 0 := by + intro y χ + rw [show (fun t => (∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + iteratedCovDerivAdjoint A (List.ofFn p) F' t) χ) = + fun t => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + iteratedCovDerivAdjoint A (List.ofFn p) F' t χ from funext fun t => by + simp only [LinearMap.sum_apply, LinearMap.smul_apply], + lorentzMix_sum_fam, ih (fun i => l i.succ) y χ] + exact Finset.sum_congr rfl fun p _ => (lorentzMix_smul_fam _ _ _ _ _).symm + rw [show (List.ofFn l) = l 0 :: List.ofFn (fun i : Fin n => l i.succ) from + List.ofFn_succ] + show repLorentz Λ (covDerivAdjoint A (iteratedCovDerivAdjoint A + (List.ofFn fun i : Fin n => l i.succ) F) (l 0) x φ) = _ + rw [covDerivAdjoint_apply, map_add, ih (fun i => l i.succ) (l 0 ::ₘ x) φ, + repLorentz_bracketFamConv hmul hA Λ (l 0) _ _ hG x φ] + have hterm₁ : ∀ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' t φ) + (l 0 ::ₘ x) 0 = + ∑ b, ((∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) * + (((SL2C.toLorentzGroup Λ).1 b (l 0) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' + (b ::ₘ t) φ) x 0 := by + intro p + rw [lorentzMix_cons_apply, Finset.smul_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [lorentzMix_apply_add Λ x _ (b ::ₘ 0), smul_smul, + show (fun r => (fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' t φ) + (r + (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))))) = + fun r => iteratedCovDerivAdjoint A (List.ofFn p) F' (b ::ₘ r) φ from + funext fun r => by + rw [show r + (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = b ::ₘ r from by + rw [show (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = {b} from rfl, + ← Multiset.singleton_add, add_comm]]] + have hterm₂ : ∀ b : Fin 1 ⊕ Fin 3, + (((SL2C.toLorentzGroup Λ).1 b (l 0) : ℝ) : ℂ) • + lorentzMix Λ (fun t => bracketFamConv A b + (fun r => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + iteratedCovDerivAdjoint A (List.ofFn p) F' r) t φ) x 0 = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + ((((SL2C.toLorentzGroup Λ).1 b (l 0) : ℝ) : ℂ) * + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ))) • + lorentzMix Λ (fun t => bracketFamConv A b + (iteratedCovDerivAdjoint A (List.ofFn p) F') t φ) x 0 := by + intro b + rw [show (fun t => bracketFamConv A b + (fun r => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + iteratedCovDerivAdjoint A (List.ofFn p) F' r) t φ) = + fun t => ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i.succ) : ℝ) : ℂ)) • + bracketFamConv A b (iteratedCovDerivAdjoint A (List.ofFn p) F') t φ from + funext fun t => bracketFamConv_sum_fam b _ _ t φ, + lorentzMix_sum_fam, Finset.smul_sum] + exact Finset.sum_congr rfl fun p _ => by rw [lorentzMix_smul_fam, smul_smul] + simp only [hterm₁, hterm₂] + rw [Finset.sum_comm (γ := Fin n → (Fin 1 ⊕ Fin 3)), ← Finset.sum_add_distrib] + rw [← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => (Fin 1 ⊕ Fin 3)) + (fun q : Fin (n + 1) → (Fin 1 ⊕ Fin 3) => + (∏ i, (((SL2C.toLorentzGroup Λ).1 (q i) (l i) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => + iteratedCovDerivAdjoint A (List.ofFn q) F' t φ) x 0), + Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun p _ => ?_ + show _ = (∏ i, (((SL2C.toLorentzGroup Λ).1 + ((Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) i) (l i) : ℝ) : ℂ)) • + lorentzMix Λ (fun t => iteratedCovDerivAdjoint A + (List.ofFn (Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3))) F' t φ) x 0 + rw [Fin.prod_univ_succ] + simp only [Fin.cons_zero, Fin.cons_succ] + rw [show (fun t => iteratedCovDerivAdjoint A + (List.ofFn (Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3))) F' t φ) = + fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' (b ::ₘ t) φ + + bracketFamConv A b (iteratedCovDerivAdjoint A (List.ofFn p) F') t φ from + funext fun t => by + rw [show (List.ofFn (Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3))) = + b :: List.ofFn p from by + rw [List.ofFn_succ] + simp only [Fin.cons_zero, Fin.cons_succ]] + rfl, lorentzMix_add_fam, smul_add, mul_comm] + +/-- The Lorentz law of the field strength: both covector indices mix by their columns, + and the derivative slots mix by `lorentzMix`. -/ +lemma repLorentz_fieldStrength_mix + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) + (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + repLorentz Λ (fieldStrength A μ ν x φ) = + lorentzMix Λ (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • fieldStrength A a b t φ) x 0 := by + have hcons : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (b : Fin 1 ⊕ Fin 3), + r + (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = b ::ₘ r := by + intro r b + rw [show (b ::ₘ (0 : Multiset (Fin 1 ⊕ Fin 3))) = {b} from rfl, + ← Multiset.singleton_add, add_comm] + -- the derivative terms + have hA1 : ∀ κ σ : Fin 1 ⊕ Fin 3, repLorentz Λ (A (κ ::ₘ x) σ φ) = + lorentzMix Λ (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a κ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b σ : ℝ) : ℂ) • A (a ::ₘ t) b φ) x 0 := by + intro κ σ + rw [repLorentz_apply_mix hA Λ (κ ::ₘ x) σ φ, lorentzMix_cons_apply, + lorentzMix_sum_fam] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [lorentzMix_smul_fam, lorentzMix_apply_add Λ x + (fun t => ∑ b, (((SL2C.toLorentzGroup Λ).1 b σ : ℝ) : ℂ) • A t b φ) (a ::ₘ 0)] + congr 2 + funext r + rw [hcons r a] + -- the commutator term + have hbc : ∀ (κ σ : Fin 1 ⊕ Fin 3) (t : Multiset (Fin 1 ⊕ Fin 3)), + commutatorFam A κ σ t = bracketFamConv A κ (fun r => A r σ) t := fun _ _ _ => rfl + have hC : repLorentz Λ (commutatorFam A μ ν x φ) = + lorentzMix Λ (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • commutatorFam A a b t φ) x 0 := by + have hG : ∀ (y : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (A y ν χ) = lorentzMix Λ (fun t => + (∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • A t b) χ) y 0 := by + intro y χ + rw [repLorentz_apply_mix hA Λ y ν χ] + congr 1 + rw [hbc μ ν x, repLorentz_bracketFamConv hmul hA Λ μ (fun r => A r ν) + (fun t => ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • A t b) hG x φ, + lorentzMix_sum_fam] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [lorentzMix_smul_fam] + congr 2 + funext t + rw [bracketFamConv_sum_fam a _ (fun b r => A r b) t φ] + exact Finset.sum_congr rfl fun b _ => by rw [hbc a b t] + -- the index swap of the second derivative term + have hswap : ∀ t : Multiset (Fin 1 ⊕ Fin 3), + (∑ a, (((SL2C.toLorentzGroup Λ).1 a ν : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b μ : ℝ) : ℂ) • A (a ::ₘ t) b φ) = + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • A (b ::ₘ t) a φ := by + intro t + simp only [Finset.smul_sum] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => smul_comm _ _ _ + -- assemble + rw [show (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • fieldStrength A a b t φ) = + fun t => ((∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • A (a ::ₘ t) b φ) - + (∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • A (b ::ₘ t) a φ)) + + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • commutatorFam A a b t φ from + funext fun t => by + simp only [fieldStrength_apply, smul_sub, smul_add, Finset.sum_sub_distrib, + Finset.sum_add_distrib], + lorentzMix_add_fam, lorentzMix_sub_fam, fieldStrength_apply, map_add, map_sub, + hA1 μ ν, hA1 ν μ, hC] + rw [show (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a ν : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b μ : ℝ) : ℂ) • A (a ::ₘ t) b φ) = + fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • A (b ::ₘ t) a φ from + funext hswap] + +/-- The Lorentz law of the covariant tower of the field strength: the covariant slots + mix by their own columns and the two covector indices of the field strength mix by + theirs. -/ +lemma repLorentz_iteratedCovDerivAdjoint_fieldStrength + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) (n : ℕ) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + repLorentz Λ (iteratedCovDerivAdjoint A (List.ofFn l) (fieldStrength A μ ν) 0 φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • + iteratedCovDerivAdjoint A (List.ofFn p) (fieldStrength A a b) 0 φ := by + have hF' : ∀ (y : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℝ GaugeAlgebra), + repLorentz Λ (fieldStrength A μ ν y χ) = + lorentzMix Λ (fun t => (∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • fieldStrength A a b t) χ) + y 0 := by + intro y χ + rw [repLorentz_fieldStrength_mix hmul hA Λ μ ν y χ] + congr 1 + rw [repLorentz_iteratedCovDerivAdjoint hmul hA Λ (fieldStrength A μ ν) + (fun t => ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • fieldStrength A a b t) hF' n l 0 φ] + simp only [lorentzMix_zero] + refine Finset.sum_congr rfl fun p _ => ?_ + congr 1 + rw [iteratedCovDerivAdjoint_sum_fam + (fun a => (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ)) + (fun a t => ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • fieldStrength A a b t) + (List.ofFn p) 0 φ] + exact Finset.sum_congr rfl fun a _ => by + rw [iteratedCovDerivAdjoint_sum_fam + (fun b => (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ)) + (fun b t => fieldStrength A a b t) (List.ofFn p) 0 φ] + +end IsGaugeField + set_option linter.unusedVariables false namespace IsStandardModel @@ -2028,28 +3264,127 @@ theorem invariant_mem_adjoin_covDeriv {x : B} · exact Or.inr h2 -TODO (lines := 2029-2030) "Prove the Lorentz transformation laws of the covariant - towers, the last thing missing from the construction of `IsCovStandardModel` in - CovStandardModel.lean: with them, `isCovStandardModel_of_lorentzCovDeriv` loses its - thirteen hypotheses. What is needed is that `IsGaugeField.covDerivIter` and - `IsGaugeField.iteratedCovDerivAdjoint` satisfy `IsLorentzCovDerivTransforms`, given - the Lorentz laws of the bare symbols — the `repLorentz_*` fields above and - `lorentz_apply` of `IsGaugeField`. Three ingredients. First, the Lorentz mixing of the - derivative slots should be written as an operator on multiset-indexed families defined - by recursion on the multiset — peel a direction `a`, replace it by every direction `b` - weighted by the Lorentz matrix entry, mix the rest — rather than as a sum over ordered - tuples; peeling two directions commutes, so the recursion is well defined on a - multiset, and it agrees with the tuple form of `IsLorentzDerivTransforms`. Second, - that operator is a morphism for the Leibniz convolution over `Multiset.antidiagonal`, - by induction on the multiset using `Multiset.antidiagonal_cons`; this is what carries - the law through `actionFamConv` and `bracketFamConv`, both of which are, after - expansion in a basis, scalar combinations of convolutions of products in the algebra. - Third — and this is not yet recorded anywhere — the gauge-algebra action on each value - space must commute with the Lorentz action on it, since the correction term of a - covariant derivative acts on the value index by `act` while the Lorentz group acts on - it by the species representation. That is true because the two act on different tensor - factors, but it needs a lemma for each of the ten fermion species (for the Higgs it is - trivial, the Lorentz representation being trivial)." +/-! + +## H. The Lorentz laws of the covariant matter towers + +Each covariant matter tower is an iterated covariant derivative of the corresponding +bare family, so `IsGaugeField.isLorentzCovDerivTransforms_covDerivIter` turns the bare +Lorentz law recorded by `IsStandardModel` into the covariant one. The commutation of +the infinitesimal gauge action with the Lorentz action, which that theorem needs, is +the species lemma proved above; for the conjugate towers it is transported by +`actionConj_comm_repConj`. + +-/ + +include h in +/-- The covariant tower of the Higgs transforms as a Lorentz scalar. -/ +lemma repLorentz_covDerivH : + IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {_n} l => h.covDerivH l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + HiggsVec.gaugeAlgebraAction_comm_repLorentz H h.repLorentz_H + +include h in +/-- The covariant tower of the conjugate Higgs transforms as a Lorentz scalar. -/ +lemma repLorentz_covDerivBarH : + IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj + (fun {_n} l => h.covDerivBarH l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + (actionConj_comm_repConj HiggsVec.gaugeAlgebraAction _ + HiggsVec.gaugeAlgebraAction_comm_repLorentz) barH h.repLorentz_barH + +include h in +/-- The covariant tower of the down-type quarks transforms as a right-handed Weyl + spinor. -/ +lemma repLorentz_covDerivD (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup + (fun {_n} l => h.covDerivD i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (d i) (h.repLorentz_d i) + +include h in +/-- The covariant tower of the conjugate down-type quarks transforms in the conjugate + Weyl representation. -/ +lemma repLorentz_covDerivBarD (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarD i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + (actionConj_comm_repConj DownSinglet.gaugeAlgebraAction _ + DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (bard i) (h.repLorentz_bard i) + +include h in +/-- The covariant tower of the up-type quarks transforms as a right-handed Weyl spinor. -/ +lemma repLorentz_covDerivU (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup + (fun {_n} l => h.covDerivU i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (u i) (h.repLorentz_u i) + +include h in +/-- The covariant tower of the conjugate up-type quarks transforms in the conjugate Weyl + representation. -/ +lemma repLorentz_covDerivBarU (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarU i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + (actionConj_comm_repConj UpSinglet.gaugeAlgebraAction _ + UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (baru i) (h.repLorentz_baru i) + +include h in +/-- The covariant tower of the quark doublets transforms as a left-handed Weyl spinor. -/ +lemma repLorentz_covDerivQ (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup + (fun {_n} l => h.covDerivQ i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (Q i) (h.repLorentz_Q i) + +include h in +/-- The covariant tower of the conjugate quark doublets transforms in the conjugate Weyl + representation. -/ +lemma repLorentz_covDerivBarQ (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarQ i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + (actionConj_comm_repConj QuarkDoublet.gaugeAlgebraAction _ + QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup) (barQ i) (h.repLorentz_barQ i) + +include h in +/-- The covariant tower of the lepton doublets transforms as a left-handed Weyl spinor. -/ +lemma repLorentz_covDerivL (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup + (fun {_n} l => h.covDerivL i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (L i) (h.repLorentz_L i) + +include h in +/-- The covariant tower of the conjugate lepton doublets transforms in the conjugate Weyl + representation. -/ +lemma repLorentz_covDerivBarL (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarL i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + (actionConj_comm_repConj LeptonDoublet.gaugeAlgebraAction _ + LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup) (barL i) (h.repLorentz_barL i) + +include h in +/-- The covariant tower of the lepton singlets transforms as a right-handed Weyl spinor. -/ +lemma repLorentz_covDerivE (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup + (fun {_n} l => h.covDerivE i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (e i) (h.repLorentz_e i) + +include h in +/-- The covariant tower of the conjugate lepton singlets transforms in the conjugate Weyl + representation. -/ +lemma repLorentz_covDerivBarE (i : Fin 3) : + IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup.conj + (fun {_n} l => h.covDerivBarE i l) := + IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + (actionConj_comm_repConj LeptonSinglet.gaugeAlgebraAction _ + LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (bare i) (h.repLorentz_bare i) end IsStandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean index 1231fbd42..a8d3e38fa 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean @@ -33,14 +33,11 @@ The gauge equivariance of the towers is section E; their mass weights are sectio which grades the algebra by the weight eigenspaces of `massWeightPoly` and pushes the grading through the recursion defining a covariant derivative; their statistics are section J, which reads them off the statistics of the bare symbols because each term -of a tower carries exactly one bare matter symbol. What is *not* proved here is the -Lorentz transformation law of a covariant tower, which -`isCovStandardModel_of_lorentzCovDeriv` therefore takes as thirteen explicit -hypotheses. They are not further assumptions about the model: each follows from the -Lorentz law `IsStandardModel` records for the corresponding bare symbols, together -with the fact that the gauge-algebra action on the value space commutes with the -Lorentz action on it. Proving them is the one thing that remains; the `TODO` at the -end of [`Basic.lean`](Basic.lean) says what the proof needs. +of a tower carries exactly one bare matter symbol. Their Lorentz transformation laws +are section H of [`Basic.lean`](Basic.lean): each follows from the Lorentz law +`IsStandardModel` records for the corresponding bare symbols, together with the fact +that the gauge-algebra action on the value space commutes with the Lorentz action on +it. So `isCovStandardModel` is unconditional. ## ii. Key results @@ -63,8 +60,8 @@ end of [`Basic.lean`](Basic.lean) says what the proof needs. - `IsStandardModel.commute_covDerivIter_covDerivIter` and `IsStandardModel.anticommute_covDerivIter_covDerivIter` : the statistics of a pair of towers is the statistics of the pair of bare families. -- `IsStandardModel.isCovStandardModel_of_lorentzCovDeriv` : the covariant form of the - theory, modulo the Lorentz laws of the towers. +- `IsStandardModel.repLorentz_covF` : the Lorentz law of the field-strength tower. +- `IsStandardModel.isCovStandardModel` : the covariant form of the theory. ## iii. Table of contents @@ -2285,55 +2282,34 @@ lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ## K. The covariant form of the theory Everything above assembles into an `IsCovStandardModel` for the covariant towers, -acted on by the global gauge group and the Lorentz group — except for the Lorentz -transformation laws of the towers themselves, which are taken here as explicit -hypotheses. They are *not* new assumptions about the model: they are theorems about -`IsGaugeField.covDerivIter` and `IsGaugeField.iteratedCovDerivAdjoint` which follow -from the Lorentz laws that `IsStandardModel` already records for the bare symbols, and -which remain to be proved. See the `TODO` at the end of [`Basic.lean`](Basic.lean) for -what that proof needs. +acted on by the global gauge group and the Lorentz group. The Lorentz laws of the +matter towers are section H of [`Basic.lean`](Basic.lean); the one for the +field-strength tower is `repLorentz_covF` just below, which is +`IsGaugeField.repLorentz_iteratedCovDerivAdjoint_fieldStrength` read in the +ordered-tuple indexing. -/ include h in -/-- The covariant form of the Standard Model, modulo the Lorentz transformation laws - of the covariant towers. Every gauge-equivariance, mass-weight and commutation - obligation of `IsCovStandardModel` is discharged from `IsStandardModel`; the - thirteen `hLorentz` arguments are the Lorentz laws of the towers, which follow from - the bare Lorentz laws recorded by `IsStandardModel` but are not yet proved, and are - therefore passed in. -/ -theorem isCovStandardModel_of_lorentzCovDeriv - (hLorentzF : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - repLorentz Λ (h.covF l μ ν φ) = - ∑ p : Fin n → (Fin 1 ⊕ Fin 3), - (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • - ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • h.covF p a b φ) - (hLorentzH : IsLorentzCovDerivTransforms repLorentz - (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {_n} l => h.covDerivH l)) - (hLorentzBarH : IsLorentzCovDerivTransforms repLorentz - (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj (fun {_n} l => h.covDerivBarH l)) - (hLorentzD : ∀ i, IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup - (fun {_n} l => h.covDerivD i l)) - (hLorentzBarD : ∀ i, IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup.conj - (fun {_n} l => h.covDerivBarD i l)) - (hLorentzU : ∀ i, IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup - (fun {_n} l => h.covDerivU i l)) - (hLorentzBarU : ∀ i, IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup.conj - (fun {_n} l => h.covDerivBarU i l)) - (hLorentzQ : ∀ i, IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup - (fun {_n} l => h.covDerivQ i l)) - (hLorentzBarQ : ∀ i, IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup.conj - (fun {_n} l => h.covDerivBarQ i l)) - (hLorentzL : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup - (fun {_n} l => h.covDerivL i l)) - (hLorentzBarL : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup.conj - (fun {_n} l => h.covDerivBarL i l)) - (hLorentzE : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup - (fun {_n} l => h.covDerivE i l)) - (hLorentzBarE : ∀ i, IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup.conj - (fun {_n} l => h.covDerivBarE i l)) : +/-- The Lorentz law of the covariant field-strength tower: the covariant derivative + slots mix by their own columns of the Lorentz matrix, and the two covector indices + of the field strength mix by theirs. -/ +lemma repLorentz_covF (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + repLorentz Λ (h.covF l μ ν φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ∑ a, (((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + ∑ b, (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ) • h.covF p a b φ := + IsGaugeField.repLorentz_iteratedCovDerivAdjoint_fieldStrength h.repLorentz_mul + h.repJet_A Λ n l μ ν φ + +include h in +/-- The covariant form of the Standard Model. Every gauge-equivariance, Lorentz, + mass-weight and commutation obligation of `IsCovStandardModel` is discharged from + `IsStandardModel`: the Lorentz laws of the matter towers are section H of + `Basic.lean`, the one of the field-strength tower is `repLorentz_covF`. -/ +theorem isCovStandardModel : IsCovStandardModel B (repGlobal repJet) h.repGlobal_mul repLorentz h.repLorentz_mul massWeightPoly (fun {_n} l => h.covDerivH l) (fun {_n} l => h.covDerivBarH l) (fun {_n} l μ ν => h.covF l μ ν) @@ -2350,11 +2326,11 @@ theorem isCovStandardModel_of_lorentzCovDeriv barH_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => h.covBarH_comm_covBarH l₁ l₂ φ ψ H_massWeight := fun φ _n l => h.massWeight_covDerivH l φ barH_massWeight := fun φ _n l => h.massWeight_covDerivBarH l φ - repLorentz_H := hLorentzH - repLorentz_barH := hLorentzBarH } + repLorentz_H := h.repLorentz_covDerivH + repLorentz_barH := h.repLorentz_covDerivBarH } isGaugeSector := { repGauge_F := fun g {_n} l μ ν φ => h.repGlobal_covF g l μ ν φ - repLorentz_F := hLorentzF + repLorentz_F := h.repLorentz_covF massWeight_F := fun {_n} l μ ν φ => h.massWeight_covF l μ ν φ F_comm_F := fun {_n _m} l μ ν ψ l' μ' ν' ψ' => h.covF_comm_covF l l' μ ν μ' ν' ψ ψ' } @@ -2369,16 +2345,16 @@ theorem isCovStandardModel_of_lorentzCovDeriv repGauge_barL := fun g i {_n} l φ => h.repGlobal_covDerivBarL g i l φ repGauge_e := fun g i {_n} l φ => h.repGlobal_covDerivE g i l φ repGauge_bare := fun g i {_n} l φ => h.repGlobal_covDerivBarE g i l φ - repLorentz_d := hLorentzD - repLorentz_bard := hLorentzBarD - repLorentz_u := hLorentzU - repLorentz_baru := hLorentzBarU - repLorentz_Q := hLorentzQ - repLorentz_barQ := hLorentzBarQ - repLorentz_L := hLorentzL - repLorentz_barL := hLorentzBarL - repLorentz_e := hLorentzE - repLorentz_bare := hLorentzBarE + repLorentz_d := h.repLorentz_covDerivD + repLorentz_bard := h.repLorentz_covDerivBarD + repLorentz_u := h.repLorentz_covDerivU + repLorentz_baru := h.repLorentz_covDerivBarU + repLorentz_Q := h.repLorentz_covDerivQ + repLorentz_barQ := h.repLorentz_covDerivBarQ + repLorentz_L := h.repLorentz_covDerivL + repLorentz_barL := h.repLorentz_covDerivBarL + repLorentz_e := h.repLorentz_covDerivE + repLorentz_bare := h.repLorentz_covDerivBarE massWeight_d := fun i {_n} l φ => h.massWeight_covDerivD i l φ massWeight_bard := fun i {_n} l φ => h.massWeight_covDerivBarD i l φ massWeight_u := fun i {_n} l φ => h.massWeight_covDerivU i l φ @@ -2477,7 +2453,10 @@ theorem isCovStandardModel_of_lorentzCovDeriv barH_comm_e := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covE i l l' φ φ' barH_comm_bare := fun {_n _m} l φ i l' φ' => h.covBarH_comm_covBarE i l l' φ φ' -TODO (lines := 2313-2336) "These should be proved results." +TODO (lines := 2454-2455) "Below this I would be expecting + the explicit form of the invariance lemmas, relating + invariance of the algebra generaged by `IsStandardModel` to the + (global) invariance of the algebra generated by `IsCovStandardModel`." end IsStandardModel From a7a3214b0188c721ea295718a3447aa4904428d3 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 06:08:13 +0100 Subject: [PATCH 248/254] feat: Finish the IsSU3BiAdjoint result --- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 819 +++++++++++++----- 1 file changed, 597 insertions(+), 222 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 2568609bb..0f697d7c3 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -21,9 +21,25 @@ This is the gauge analogue of `IsQuadLorentz`. The field strength of the gluons one `su(3)` adjoint index, so a product of two field strengths carries two, and the proposition here records how such a product transforms. -Section A gives the proposition and the span of its components, section B the trace -contraction, which is the natural gauge invariant built from two adjoint indices, and -section C the gauge weight decomposition of the span. Section D grades the zero-weight +The transformation law itself is `IsSU3BiAdjointMat`, which relates one element of +`SU(3)` to one linear map on `B` and mentions no other factor of the gauge group, through +`su3AdjointMatrix`, the adjoint matrix of an `SU(3)` element alone. `IsSU3BiAdjoint` says +that every gauge transformation obeys that law through its `SU(3)` part. Everything the +file proves about how the components move is proved at the level of `IsSU3BiAdjointMat` +and instantiated afterwards, so the mathematics here is `SU(3)` mathematics; the elements +that do the work, `su3Perm`, `su3Transp`, `su3TurnFst` and `su3TurnSnd`, all live in +`SU(3)`. What stays about `GaugeGroupI` is the bookkeeping of the decompositions, which +`GaugeWeightDecomposition`, `SU3PermDecomposition` and `SU3WeylDecomposition` supply only +for representations of the gauge group, and the notion of gauge invariance itself. Section +A.3 records `repSU3`, the colour part of a representation, for which a bi-adjoint family +is again bi-adjoint; reading the classification of section F there sharpens it to +invariance under the colour factor alone, and the two notions of invariance then turn out +to agree on the span. + +Section A gives the adjoint matrix of the `SU(3)` factor, the proposition and the span of +its components, section B the trace contraction, which is the natural gauge invariant +built from two adjoint indices, and section C the gauge weight decomposition of the +span. Section D grades the zero-weight piece of that decomposition by the cyclic colour rotation, which is what the gauge weight alone cannot do, and section E upgrades that grading to the isotypic decomposition of the whole Weyl group `S₃`, in which the trace contraction lands in the trivial isotype. Those @@ -37,9 +53,9 @@ Sections F.4 and F.5 shed the hypotheses that classification is stated under. Th square-zero extension of a module is an algebra on which every representation acts by algebra maps, so the classification needs no algebra structure and no multiplicativity at all, and it then descends to the quotient by a gauge-stable submodule, which is -`mem_span_sup_invariant_iff`. The row orthonormality of the `su(3)` block of -`adjointMatrix` that section B rests on is proved where the matrix is defined, in -`GaugeAlgebra.Basis`. +`mem_span_sup_invariant_iff`. The row orthonormality of `su3AdjointMatrix` that section B +rests on is inherited from the `su(3)` block of `adjointMatrix`, and proved where that +matrix is defined, in `GaugeAlgebra.Basis`. -/ @[expose] public section @@ -50,24 +66,158 @@ open Matrix /-! -## A. Bi-adjoint `su(3)` families and the span of their components +## A. The `SU(3)` adjoint matrix and bi-adjoint families + +An `su(3)` adjoint index is acted on by the `SU(3)` factor of the gauge group alone. That +action is recorded in A.1 as `su3AdjointMatrix`, a matrix built from an element of `SU(3)` +and nothing else, and A.2 phrases the transformation law through it, so that no other +factor of the gauge group appears in the law. + +## A.1. The adjoint matrix of the `SU(3)` factor + +The matrix is the trace pairing of the Gell-Mann basis of `su(3)` with the Gell-Mann basis +conjugated by the `SU(3)` element. It is the `su(3)` block of `GaugeAlgebra.adjointMatrix`, +definitionally so, and inherits from it the orthonormality of its rows. -/ +/-- The adjoint matrix of an element of `SU(3)`: the trace pairing of the Gell-Mann basis + of `su(3)` with the Gell-Mann basis conjugated by that element. -/ +noncomputable def su3AdjointMatrix (U : specialUnitaryGroup (Fin 3) ℂ) : + Matrix (Fin 8) (Fin 8) ℝ := + Matrix.of fun i j => + 2⁻¹ * (Matrix.trace (gellMannMatrix i * (U.1 * gellMannMatrix j * star U.1))).re + +/-- The entries of the adjoint matrix of an element of `SU(3)`. -/ +@[simp] +lemma su3AdjointMatrix_apply (U : specialUnitaryGroup (Fin 3) ℂ) (i j : Fin 8) : + su3AdjointMatrix U i j + = 2⁻¹ * (Matrix.trace (gellMannMatrix i * + (U.1 * gellMannMatrix j * star U.1))).re := rfl + +/-- The adjoint matrix of the `SU(3)` factor of a gauge group element is the `su(3)` + block of the adjoint matrix of the gauge algebra. -/ +lemma su3AdjointMatrix_toSU3 (g : GaugeGroupI) (i j : Fin 8) : + su3AdjointMatrix (GaugeGroupI.toSU3 g) i j + = GaugeAlgebra.adjointMatrix g (Sum.inl i) (Sum.inl j) := rfl + +/-- The rows of the adjoint matrix of an element of `SU(3)` are orthonormal, the adjoint + action preserving the trace pairing of the Gell-Mann basis. -/ +lemma sum_su3AdjointMatrix_row_mul (U : specialUnitaryGroup (Fin 3) ℂ) (c d : Fin 8) : + ∑ a : Fin 8, su3AdjointMatrix U c a * su3AdjointMatrix U d a + = if c = d then 1 else 0 := + GaugeAlgebra.sum_adjointMatrix_inl_row_mul (U, 1, 1) c d + +/-- An entry of the adjoint matrix of an element of `SU(3)` is a Gell-Mann coordinate of + the conjugated Gell-Mann matrix. -/ +lemma su3AdjointMatrix_eq_gellMannCoeff (U : specialUnitaryGroup (Fin 3) ℂ) (a b : Fin 8) : + su3AdjointMatrix U a b = gellMannCoeff (U.1 * gellMannMatrix b * star U.1) a := by + have hmem := GaugeAlgebra.conj_mem U.2.1 + (gellMannMatrix_selfAdjoint b) (gellMannMatrix_trace b) + rw [su3AdjointMatrix_apply, gellMannCoeff_eq_trace hmem.1 hmem.2] + +/-! + +## A.2. Bi-adjoint `su(3)` families and the span of their components + +The transformation law carries one factor of `su3AdjointMatrix` per index, with the summed +index in the row slot. It is recorded by `IsSU3BiAdjointMat`, a relation between one +element of `SU(3)` and one linear map on `B` in which no other factor of the gauge group +appears, and it is the law obeyed by the gluon field strengths of `IsGaugeSector`. + +`IsSU3BiAdjoint` then says that every gauge transformation obeys that law through its +`SU(3)` part. Since `GaugeGroupI.toSU3` is a monoid homomorphism this is an action. +Quantifying over the whole of `GaugeGroupI` is what makes the proposition say more than a +statement about a single `SU(3)` element would: an element of the isospin or hypercharge +factor is sent to `1` in `SU(3)`, so those factors fix every component, and section C +reads that off as the vanishing of the isospin and hypercharge coordinates of every +weight. + +-/ + +/-- The linear map `f` moves the components of the family `T` as the `SU(3)` matrix `U` + moves a tensor with two adjoint indices: one factor of `su3AdjointMatrix U` per index, + with the summed index in the row slot. -/ +def IsSU3BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 3) ℂ) (f : B →ₗ[ℂ] B) + (T : (Fin 2 → Fin 8) → B) : Prop := + ∀ l : Fin 2 → Fin 8, + f (T l) = ∑ a : Fin 2 → Fin 8, + (∏ i : Fin 2, ((su3AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) • T a + /-- A family `T` of elements of `B`, indexed by two `su(3)` adjoint indices, transforms - as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group. -/ + as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group: every + gauge transformation moves the components by its `SU(3)` part alone. -/ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 8) → B) : Prop where - repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 8), - repGauge g (T l) = ∑ a : Fin 2 → Fin 8, - (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inl (a i)) - (Sum.inl (l i)) : ℝ) : ℂ)) • T a + repGauge_T : ∀ g : GaugeGroupI, + IsSU3BiAdjointMat (GaugeGroupI.toSU3 g) (repGauge g) T + +/-! + +## A.3. The colour part of a representation -TODO (lines := 56-60) "The `g` in this expression should only - be the `SU(3)` part of this gauge group, and this hypothesis should - only be about how that part acts. The same is true for - every other result in this file." +Reading a representation of the gauge group at the colour factor of its argument alone +gives `repSU3`, again a representation of the whole gauge group. Every construction stated +for a representation of `GaugeGroupI` therefore applies to it verbatim, and a bi-adjoint +family for `repGauge` is a bi-adjoint family for `repSU3 repGauge`, with the same span and +the same trace contraction. That is what lets section F.3 sharpen its classification from +gauge invariance to invariance under the colour factor alone, which is the weaker +hypothesis `∀ U : SU(3), repGauge (U, 1, 1) x = x`; the two turn out to agree on the span. + +`repSU3` is machinery for that transport and nothing more. The statements themselves are +written with the colour transformation `(U, 1, 1)` spelled out, so that reading one needs +no unfolding, and `repSU3_invariant_iff_su3` is the bridge between the two spellings. + +-/ + +/-- The colour part of a representation of the gauge group: the representation reading + only the `SU(3)` factor of its argument and sending the isospin and hypercharge factors + to the identity. -/ +noncomputable def repSU3 {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) : Representation ℂ GaugeGroupI B where + toFun g := repGauge (GaugeGroupI.toSU3 g, 1, 1) + map_one' := by + have h1 : ((GaugeGroupI.toSU3 1, 1, 1) : GaugeGroupI) = 1 := by + simp [Prod.ext_iff] + rw [h1, map_one] + map_mul' g h := by + have hgh : ((GaugeGroupI.toSU3 (g * h), 1, 1) : GaugeGroupI) + = ((GaugeGroupI.toSU3 g, 1, 1) : GaugeGroupI) * (GaugeGroupI.toSU3 h, 1, 1) := by + simp [map_mul] + rw [hgh, map_mul] + +/-- The colour part of a representation acts by the representation itself, at the gauge + transformation with the same colour factor and nothing else. -/ +lemma repSU3_apply {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (g : GaugeGroupI) : + repSU3 repGauge g = repGauge (GaugeGroupI.toSU3 g, 1, 1) := rfl + +/-- The colour part of a representation acts by algebra maps whenever the representation + does, each of its values being a value of that representation. -/ +lemma isMulRep_repSU3 {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} (hmul : IsMulRep repGauge) : + IsMulRep (repSU3 repGauge) := + fun g x y => hmul (GaugeGroupI.toSU3 g, 1, 1) x y + +/-- Invariance under the colour part of a representation is invariance under the gauge + transformations that are trivial on isospin and hypercharge. The colour part reads only + the colour factor of its argument, and every element of `SU(3)` is the colour factor of + such a transformation. -/ +lemma repSU3_invariant_iff_su3 {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (x : B) : + (∀ g : GaugeGroupI, repSU3 repGauge g x = x) + ↔ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x := + ⟨fun h U => h (U, 1, 1), fun h g => h (GaugeGroupI.toSU3 g)⟩ + +/-- A submodule is stable under the colour part of a representation precisely when it is + stable under the gauge transformations trivial on isospin and hypercharge. -/ +lemma repSU3_stable_iff_su3 {B : Type*} [AddCommGroup B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) : + (∀ g : GaugeGroupI, ∀ y ∈ S, repSU3 repGauge g y ∈ S) + ↔ ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S := + ⟨fun h U => h (U, 1, 1), fun h g => h (GaugeGroupI.toSU3 g)⟩ namespace IsSU3BiAdjoint set_option linter.unusedVariables false @@ -77,6 +227,14 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {T : (Fin 2 → Fin 8) → B} (hT : IsSU3BiAdjoint B repGauge T) +/-- A bi-adjoint family for a representation is a bi-adjoint family for its colour part: + the transformation law reads only the colour factor to begin with. The span and the + trace contraction do not mention the representation, so every statement of this file + transports along this and is read at the colour factor alone. -/ +lemma toRepSU3 (hT : IsSU3BiAdjoint B repGauge T) : + IsSU3BiAdjoint B (repSU3 repGauge) T where + repGauge_T g := hT.repGauge_T (GaugeGroupI.toSU3 g, 1, 1) + /-- The span of all the components. -/ def span (hT : IsSU3BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d @@ -136,19 +294,22 @@ lemma traceContraction_mem_span (hT : IsSU3BiAdjoint B repGauge T) : exact sum_mem fun d _ => Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _) -/-- The trace contraction of a bi-adjoint family is gauge invariant. -/ -lemma repGauge_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (g : GaugeGroupI) : - repGauge g hT.traceContraction = hT.traceContraction := by - have step : repGauge g hT.traceContraction +/-- The trace contraction of a bi-adjoint family is fixed by any linear map moving the + components by an `SU(3)` matrix: the rows of `su3AdjointMatrix` are orthonormal, so the + Kronecker delta contracting the two indices is carried to itself. -/ +lemma map_traceContraction (hT : IsSU3BiAdjoint B repGauge T) + {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat U f T) : + f hT.traceContraction = hT.traceContraction := by + have step : f hT.traceContraction = ∑ b : Fin 2 → Fin 8, (if b 0 = b 1 then (1 : ℂ) else 0) • T b := by - show repGauge g (∑ c : Fin 8, T ![c, c]) = _ + show f (∑ c : Fin 8, T ![c, c]) = _ rw [map_sum] - have h1 : ∀ c : Fin 8, repGauge g (T ![c, c]) + have h1 : ∀ c : Fin 8, f (T ![c, c]) = ∑ b : Fin 2 → Fin 8, - ((GaugeAlgebra.adjointMatrix g (Sum.inl (b 0)) (Sum.inl c) * - GaugeAlgebra.adjointMatrix g (Sum.inl (b 1)) (Sum.inl c) : ℝ) : ℂ) • T b := by + ((su3AdjointMatrix U (b 0) c * su3AdjointMatrix U (b 1) c : ℝ) : ℂ) • T b := by intro c - rw [hT.repGauge_T g ![c, c]] + rw [hf ![c, c]] refine Finset.sum_congr rfl fun b _ => ?_ congr 1 simp [Fin.prod_univ_two] @@ -157,10 +318,16 @@ lemma repGauge_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (g : GaugeGro refine Finset.sum_congr rfl fun b _ => ?_ rw [← Finset.sum_smul] congr 1 - rw [← Complex.ofReal_sum, GaugeAlgebra.sum_adjointMatrix_inl_row_mul] + rw [← Complex.ofReal_sum, sum_su3AdjointMatrix_row_mul] simp [apply_ite] rw [step, ← hT.traceContraction_eq_sum] +/-- The trace contraction of a bi-adjoint family is gauge invariant: every gauge + transformation acts on it through its `SU(3)` part alone. -/ +lemma repGauge_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (g : GaugeGroupI) : + repGauge g hT.traceContraction = hT.traceContraction := + hT.map_traceContraction (hT.repGauge_T g) + end IsSU3BiAdjoint @@ -240,7 +407,7 @@ lemma exists_rootPair_or_cartanId (a : Fin 8) : revert a decide -TODO (lines := 195-235) "All of these should be in a more general file +TODO (lines := 330-370) "All of these should be in a more general file in the GaugeAlgebra section." /-! @@ -270,12 +437,13 @@ lemma dualMap_coord_apply (g : GaugeGroupI) (a b : Fin 8 ⊕ Fin 3 ⊕ Fin 1) : /-- The first column of a root pair: the torus rotates the two columns of the adjoint matrix belonging to a root direction into each other. -/ -lemma adjointMatrix_rootPair_fst (i : Fin 4) (r : Fin 3) (a : Fin 8) : - GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (rootPair r).1) +lemma su3AdjointMatrix_rootPair_fst (i : Fin 4) (r : Fin 3) (a : Fin 8) : + su3AdjointMatrix (GaugeGroupI.toSU3 (gaugeTorusGen i)) a (rootPair r).1 = ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).re * (if a = (rootPair r).1 then 1 else 0) - ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).im * (if a = (rootPair r).2 then 1 else 0) := by + rw [su3AdjointMatrix_toSU3] obtain ⟨p1, -⟩ := GaugeAlgebra.dualMap_pair_of_entry (GaugeAlgebra.coord_rootIdx_fst r.castSucc) (GaugeAlgebra.coord_rootIdx_snd r.castSucc) @@ -287,12 +455,13 @@ lemma adjointMatrix_rootPair_fst (i : Fin 4) (r : Fin 3) (a : Fin 8) : simp [Finsupp.single_apply] /-- The second column of a root pair. -/ -lemma adjointMatrix_rootPair_snd (i : Fin 4) (r : Fin 3) (a : Fin 8) : - GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (rootPair r).2) +lemma su3AdjointMatrix_rootPair_snd (i : Fin 4) (r : Fin 3) (a : Fin 8) : + su3AdjointMatrix (GaugeGroupI.toSU3 (gaugeTorusGen i)) a (rootPair r).2 = ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).im * (if a = (rootPair r).1 then 1 else 0) + ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i).re * (if a = (rootPair r).2 then 1 else 0) := by + rw [su3AdjointMatrix_toSU3] obtain ⟨-, p2⟩ := GaugeAlgebra.dualMap_pair_of_entry (GaugeAlgebra.coord_rootIdx_fst r.castSucc) (GaugeAlgebra.coord_rootIdx_snd r.castSucc) @@ -304,9 +473,10 @@ lemma adjointMatrix_rootPair_snd (i : Fin 4) (r : Fin 3) (a : Fin 8) : simp [Finsupp.single_apply] /-- The torus fixes the Cartan columns of the adjoint matrix. -/ -lemma adjointMatrix_cartanId (i : Fin 4) (c : Fin 2) (a : Fin 8) : - GaugeAlgebra.adjointMatrix (gaugeTorusGen i) (Sum.inl a) (Sum.inl (GaugeAlgebra.su3CartanId c)) +lemma su3AdjointMatrix_cartanId (i : Fin 4) (c : Fin 2) (a : Fin 8) : + su3AdjointMatrix (GaugeGroupI.toSU3 (gaugeTorusGen i)) a (GaugeAlgebra.su3CartanId c) = if a = GaugeAlgebra.su3CartanId c then 1 else 0 := by + rw [su3AdjointMatrix_toSU3] have p := GaugeAlgebra.dualMap_coord_cartanIdx c.castSucc.castSucc i simp only [cartanIdx_castSucc] at p have e := LinearMap.congr_fun p (GaugeAlgebra.stdBasis (Sum.inl a)) @@ -339,10 +509,11 @@ def wtWeight : WeightIdx → GaugeWeight /-- The coordinate vector of a single Gell-Mann direction. -/ def unitVec (a : Fin 8) : Fin 8 → ℂ := fun x => if x = a then 1 else 0 -/-- The action of a gauge transformation on the coordinates of one `su(3)` adjoint +/-- The action of an element of `SU(3)` on the coordinates of one `su(3)` adjoint index. -/ -noncomputable def rowAct (g : GaugeGroupI) (c : Fin 8 → ℂ) : Fin 8 → ℂ := fun a => - ∑ x : Fin 8, ((GaugeAlgebra.adjointMatrix g (Sum.inl a) (Sum.inl x) : ℝ) : ℂ) * c x +noncomputable def rowAct (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 8 → ℂ) : + Fin 8 → ℂ := fun a => + ∑ x : Fin 8, ((su3AdjointMatrix U a x : ℝ) : ℂ) * c x /-- Collapsing a sum against the two Kronecker deltas of a root pair. -/ lemma sum_mul_pair (f : Fin 8 → ℂ) (b₁ b₂ : Fin 8) (s : ℂ) : @@ -378,7 +549,7 @@ lemma pair_sub_eq (z u v : ℂ) : /-- Each weight vector of the `su(3)` adjoint is an eigenvector of every torus generator, at the character of its weight. -/ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : - rowAct (gaugeTorusGen i) (wtCoeff k) + rowAct (GaugeGroupI.toSU3 (gaugeTorusGen i)) (wtCoeff k) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k) i) • wtCoeff k := by funext a match k with @@ -389,7 +560,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : show ∑ x : Fin 8, _ * wtCoeff (Sum.inl r) x = _ simp only [hw] rw [sum_mul_pair] - simp only [adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + simp only [su3AdjointMatrix_rootPair_fst, su3AdjointMatrix_rootPair_snd] simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] show _ = ((expI : ℂ) ^ GaugeWeight.coord (rootWt r) i) * _ @@ -406,7 +577,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : show ∑ x : Fin 8, _ * wtCoeff (Sum.inr (Sum.inl r)) x = _ simp only [hw] rw [sum_mul_pair] - simp only [adjointMatrix_rootPair_fst, adjointMatrix_rootPair_snd] + simp only [su3AdjointMatrix_rootPair_fst, su3AdjointMatrix_rootPair_snd] simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero, Complex.ofReal_sub, Complex.ofReal_add, Complex.ofReal_mul] rw [show ((expI : ℂ) ^ GaugeWeight.coord (wtWeight (Sum.inr (Sum.inl r) : WeightIdx)) i) @@ -430,7 +601,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : show ∑ x : Fin 8, _ * wtCoeff (Sum.inr (Sum.inr c)) x = _ rw [hz] simp only [hw, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', Finset.mem_univ, - if_true, adjointMatrix_cartanId, one_smul] + if_true, su3AdjointMatrix_cartanId, one_smul] simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero] /-! @@ -493,17 +664,21 @@ lemma biVec_unitVec (a b : Fin 8) : hT.biVec (unitVec a) (unitVec b) = T ![a, b] rw [biVec, sum_pi_two] simp [unitVec, ite_smul] -/-- Every bi-adjoint weight vector transforms by the product of the two characters. -/ -lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 8 → ℂ) : - repGauge g (hT.biVec c₀ c₁) = hT.biVec (rowAct g c₀) (rowAct g c₁) := by - have step : ∀ d : Fin 2 → Fin 8, repGauge g ((c₀ (d 0) * c₁ (d 1)) • T d) +/-- A map moving the components by an `SU(3)` matrix moves a contraction against a pair + of coordinate vectors by the row action of that matrix on each of them. This is the whole + content of the transformation law in coordinate form, and it mentions no other factor of + the gauge group. -/ +lemma map_biVec (hT : IsSU3BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 3) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat U f T) (c₀ c₁ : Fin 8 → ℂ) : + f (hT.biVec c₀ c₁) = hT.biVec (rowAct U c₀) (rowAct U c₁) := by + have step : ∀ d : Fin 2 → Fin 8, f ((c₀ (d 0) * c₁ (d 1)) • T d) = ∑ a : Fin 2 → Fin 8, ((c₀ (d 0) * c₁ (d 1)) * - (((GaugeAlgebra.adjointMatrix g (Sum.inl (a 0)) (Sum.inl (d 0)) : ℝ) : ℂ) * - ((GaugeAlgebra.adjointMatrix g (Sum.inl (a 1)) (Sum.inl (d 1)) : ℝ) : ℂ))) + (((su3AdjointMatrix U (a 0) (d 0) : ℝ) : ℂ) * + ((su3AdjointMatrix U (a 1) (d 1) : ℝ) : ℂ))) • T a := by intro d - rw [map_smul, hT.repGauge_T g d, Finset.smul_sum] + rw [map_smul, hf d, Finset.smul_sum] refine Finset.sum_congr rfl fun a _ => ?_ rw [smul_smul, Fin.prod_univ_two] simp only [biVec, rowAct] @@ -518,6 +693,13 @@ lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 8 → ℂ) : rw [Finset.sum_mul_sum] exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by ring +/-- Every gauge transformation moves a contraction against a pair of coordinate vectors + by the row action of its `SU(3)` part. -/ +lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 8 → ℂ) : + repGauge g (hT.biVec c₀ c₁) + = hT.biVec (rowAct (GaugeGroupI.toSU3 g) c₀) (rowAct (GaugeGroupI.toSU3 g) c₁) := + hT.map_biVec (hT.repGauge_T g) c₀ c₁ + /-- **The bi-adjoint weight vectors are simultaneous eigenvectors of the gauge torus**, at the character of the sum of the two individual weights. -/ lemma repGauge_biVec_wtCoeff (k₀ k₁ : WeightIdx) (i : Fin 4) : @@ -850,14 +1032,8 @@ lemma star_su3PermMatrix : ext i j fin_cases i <;> fin_cases j <;> simp -/-- An entry of the `su(3)` block of an adjoint matrix is a Gell-Mann coordinate of the - conjugated Gell-Mann matrix. -/ -lemma adjointMatrix_inl_inl_eq_gellMannCoeff (g : GaugeGroupI) (a b : Fin 8) : - GaugeAlgebra.adjointMatrix g (Sum.inl a) (Sum.inl b) - = gellMannCoeff (g.toSU3.1 * gellMannMatrix b * star g.toSU3.1) a := by - have hmem := GaugeAlgebra.conj_mem g.toSU3.2.1 - (gellMannMatrix_selfAdjoint b) (gellMannMatrix_trace b) - rw [GaugeAlgebra.adjointMatrix_inl_inl, gellMannCoeff_eq_trace hmem.1 hmem.2] +/-- The `SU(3)` part of the cyclic colour gauge transformation is the cyclic element. -/ +lemma toSU3_gaugeSU3Perm : GaugeGroupI.toSU3 gaugeSU3Perm = su3Perm := rfl /-- The conjugate of each Gell-Mann matrix by the cyclic colour rotation. -/ noncomputable def permGellMann : Fin 8 → Matrix (Fin 3) (Fin 3) ℂ @@ -873,10 +1049,9 @@ noncomputable def permGellMann : Fin 8 → Matrix (Fin 3) (Fin 3) ℂ 0, 0, (((Real.sqrt 3)⁻¹ : ℝ) : ℂ)] /-- Conjugating a Gell-Mann matrix by the cyclic colour rotation. -/ -lemma conj_gellMannMatrix_gaugeSU3Perm (b : Fin 8) : - gaugeSU3Perm.toSU3.1 * gellMannMatrix b * star gaugeSU3Perm.toSU3.1 = permGellMann b := by - rw [show gaugeSU3Perm.toSU3.1 = !![(0 : ℂ), 0, 1; 1, 0, 0; 0, 1, 0] from rfl, - star_su3PermMatrix] +lemma conj_gellMannMatrix_su3Perm (b : Fin 8) : + su3Perm.1 * gellMannMatrix b * star su3Perm.1 = permGellMann b := by + rw [su3Perm_coe, star_su3PermMatrix] fin_cases b <;> ext i j <;> fin_cases i <;> fin_cases j <;> simp [permGellMann, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, @@ -898,19 +1073,19 @@ noncomputable def permCol : Fin 8 → Fin 8 → ℂ /-- The row action on a Gell-Mann coordinate direction is a column of the adjoint matrix. -/ -lemma rowAct_unitVec (g : GaugeGroupI) (b a : Fin 8) : - rowAct g (unitVec b) a - = ((GaugeAlgebra.adjointMatrix g (Sum.inl a) (Sum.inl b) : ℝ) : ℂ) := by - simp [rowAct, unitVec, mul_ite] +lemma rowAct_unitVec (U : specialUnitaryGroup (Fin 3) ℂ) (b a : Fin 8) : + rowAct U (unitVec b) a = ((su3AdjointMatrix U a b : ℝ) : ℂ) := by + simp only [rowAct, unitVec, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', + Finset.mem_univ, if_true] /-- The cyclic colour rotation on the Gell-Mann coordinate directions. -/ -lemma rowAct_gaugeSU3Perm_unitVec (b : Fin 8) : - rowAct gaugeSU3Perm (unitVec b) = permCol b := by +lemma rowAct_su3Perm_unitVec (b : Fin 8) : + rowAct su3Perm (unitVec b) = permCol b := by have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] norm_num funext a - rw [rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, conj_gellMannMatrix_gaugeSU3Perm] + rw [rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, conj_gellMannMatrix_su3Perm] fin_cases b <;> fin_cases a <;> simp [permGellMann, gellMannCoeff, permCol, unitVec] all_goals first | ring1 @@ -928,20 +1103,20 @@ The two Cartan weight vectors are not permuted but rotated, and the combinations -/ /-- The row action is additive in the coordinate vector. -/ -lemma rowAct_add (g : GaugeGroupI) (c c' : Fin 8 → ℂ) : - rowAct g (c + c') = rowAct g c + rowAct g c' := by +lemma rowAct_add (U : specialUnitaryGroup (Fin 3) ℂ) (c c' : Fin 8 → ℂ) : + rowAct U (c + c') = rowAct U c + rowAct U c' := by funext a simp only [rowAct, Pi.add_apply, mul_add, Finset.sum_add_distrib] /-- The row action is additive on differences of coordinate vectors. -/ -lemma rowAct_sub (g : GaugeGroupI) (c c' : Fin 8 → ℂ) : - rowAct g (c - c') = rowAct g c - rowAct g c' := by +lemma rowAct_sub (U : specialUnitaryGroup (Fin 3) ℂ) (c c' : Fin 8 → ℂ) : + rowAct U (c - c') = rowAct U c - rowAct U c' := by funext a simp only [rowAct, Pi.sub_apply, mul_sub, Finset.sum_sub_distrib] /-- The row action is homogeneous in the coordinate vector. -/ -lemma rowAct_smul (g : GaugeGroupI) (z : ℂ) (c : Fin 8 → ℂ) : - rowAct g (z • c) = z • rowAct g c := by +lemma rowAct_smul (U : specialUnitaryGroup (Fin 3) ℂ) (z : ℂ) (c : Fin 8 → ℂ) : + rowAct U (z • c) = z • rowAct U c := by funext a simp only [rowAct, Pi.smul_apply, smul_eq_mul, Finset.mul_sum] exact Finset.sum_congr rfl fun x _ => by ring @@ -958,11 +1133,11 @@ def wtCycle : Fin 2 → Fin 3 → WeightIdx /-- The cyclic colour rotation moves the root weight vectors one step along their cycle. -/ -lemma rowAct_gaugeSU3Perm_wtCoeff (j : Fin 2) (i : Fin 3) : - rowAct gaugeSU3Perm (wtCoeff (wtCycle j i)) = wtCoeff (wtCycle j (i + 1)) := by +lemma rowAct_su3Perm_wtCoeff (j : Fin 2) (i : Fin 3) : + rowAct su3Perm (wtCoeff (wtCycle j i)) = wtCoeff (wtCycle j (i + 1)) := by fin_cases j <;> fin_cases i <;> simp [wtCycle, wtCoeff_inl, wtCoeff_inr_inl, rootPair, rowAct_add, rowAct_sub, - rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol] + rowAct_smul, rowAct_su3Perm_unitVec, permCol] all_goals module /-- The two eigenvectors of the cyclic colour rotation in the Cartan plane. -/ @@ -1008,11 +1183,11 @@ lemma su3PermSign_two_eq : /-- The cyclic colour rotation scales each Cartan eigenvector by the cube root of unity of its grade. -/ -lemma rowAct_gaugeSU3Perm_cartanVec (c : Fin 2) : - rowAct gaugeSU3Perm (cartanVec c) = su3PermSign (cartanGrade c) • cartanVec c := by +lemma rowAct_su3Perm_cartanVec (c : Fin 2) : + rowAct su3Perm (cartanVec c) = su3PermSign (cartanGrade c) • cartanVec c := by fin_cases c <;> simp only [cartanVec, cartanGrade, ← unitVec_cartanId, GaugeAlgebra.su3CartanId, - rowAct_sub, rowAct_add, rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol, + rowAct_sub, rowAct_add, rowAct_smul, rowAct_su3Perm_unitVec, permCol, su3PermSign_one_eq, su3PermSign_two_eq] <;> match_scalars all_goals ring_nf @@ -1069,11 +1244,23 @@ lemma prodCycle_one_one : hT.prodCycle 1 1 = hT.negPosProd 2 := rfl /-- The reverse cycle closes on the second raising-lowering product. -/ lemma prodCycle_one_two : hT.prodCycle 1 2 = hT.posNegProd 1 := rfl +/-- Every gauge transformation acts through its `SU(3)` part; for the cyclic colour + rotation that part is `su3Perm`. -/ +lemma repGauge_T_gaugeSU3Perm (hT : IsSU3BiAdjoint B repGauge T) : + IsSU3BiAdjointMat su3Perm (repGauge gaugeSU3Perm) T := hT.repGauge_T gaugeSU3Perm + +/-- A map moving the components by the cyclic colour rotation moves each root product one + step along its cycle. -/ +lemma map_su3Perm_prodCycle {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Perm f T) + (j : Fin 2) (i : Fin 3) : + f (hT.prodCycle j i) = hT.prodCycle j (i + 1) := by + fin_cases j <;> + simp only [prodCycle, hT.map_biVec hf, rowAct_su3Perm_wtCoeff] + /-- The cyclic colour rotation moves each root product one step along its cycle. -/ lemma repGauge_gaugeSU3Perm_prodCycle (j : Fin 2) (i : Fin 3) : - repGauge gaugeSU3Perm (hT.prodCycle j i) = hT.prodCycle j (i + 1) := by - fin_cases j <;> - simp only [prodCycle, hT.repGauge_biVec, rowAct_gaugeSU3Perm_wtCoeff] + repGauge gaugeSU3Perm (hT.prodCycle j i) = hT.prodCycle j (i + 1) := + hT.map_su3Perm_prodCycle hT.repGauge_T_gaugeSU3Perm j i /-- The two weight vectors of a root product carry opposite weights. -/ lemma wtWeight_wtCycle_add (i : Fin 3) : @@ -1100,14 +1287,22 @@ lemma prodCycle_mem_piece_zero (hmul : IsMulRep repGauge) (j : Fin 2) (i : Fin 3 noncomputable def cartanEigenProd (hT : IsSU3BiAdjoint B repGauge T) (a b : Fin 2) : B := hT.biVec (cartanVec a) (cartanVec b) +/-- A map moving the components by the cyclic colour rotation scales a product of two + Cartan eigenvectors by the cube root of unity of the sum of the two grades. -/ +lemma map_su3Perm_cartanEigenProd {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Perm f T) + (a b : Fin 2) : + f (hT.cartanEigenProd a b) + = su3PermSign (cartanGrade a + cartanGrade b) • hT.cartanEigenProd a b := by + rw [cartanEigenProd, hT.map_biVec hf, rowAct_su3Perm_cartanVec, + rowAct_su3Perm_cartanVec, hT.biVec_smul_left, hT.biVec_smul_right, smul_smul, + su3PermSign_add] + /-- A product of two Cartan eigenvectors is scaled by the cube root of unity of the sum of the two grades. -/ lemma repGauge_gaugeSU3Perm_cartanEigenProd (a b : Fin 2) : repGauge gaugeSU3Perm (hT.cartanEigenProd a b) - = su3PermSign (cartanGrade a + cartanGrade b) • hT.cartanEigenProd a b := by - rw [cartanEigenProd, hT.repGauge_biVec, rowAct_gaugeSU3Perm_cartanVec, - rowAct_gaugeSU3Perm_cartanVec, hT.biVec_smul_left, hT.biVec_smul_right, smul_smul, - su3PermSign_add] + = su3PermSign (cartanGrade a + cartanGrade b) • hT.cartanEigenProd a b := + hT.map_su3Perm_cartanEigenProd hT.repGauge_T_gaugeSU3Perm a b /-- Every product of two Cartan eigenvectors lies in the zero-weight piece. -/ lemma cartanEigenProd_mem_piece_zero (hmul : IsMulRep repGauge) (a b : Fin 2) : @@ -1151,10 +1346,12 @@ lemma su3Omega_add : 1 + su3Omega + su3Omega ^ 2 = 0 := by rw [su3Omega_sq, su3Omega_eq] ring -/-- The cyclic element scales the grade `k` combination of a three-cycle by `ω ^ k`. -/ -lemma repGauge_cycleEigen (x : Fin 3 → B) - (hx : ∀ i : Fin 3, repGauge gaugeSU3Perm (x i) = x (i + 1)) (k : ZMod 3) : - repGauge gaugeSU3Perm (cycleEigen x k) = su3PermSign k • cycleEigen x k := by +/-- A linear map moving a three-cycle one step along itself scales the grade `k` + combination by `ω ^ k`. Nothing here is about the gauge group at all: it is the + character of a cyclic action of order three. -/ +lemma map_cycleEigen {f : B →ₗ[ℂ] B} (x : Fin 3 → B) + (hx : ∀ i : Fin 3, f (x i) = x (i + 1)) (k : ZMod 3) : + f (cycleEigen x k) = su3PermSign k • cycleEigen x k := by have h3k : k + 2 * k = 0 := by have h : (3 : ZMod 3) * k = 0 := by rw [show (3 : ZMod 3) = 0 from rfl, zero_mul] @@ -1256,10 +1453,10 @@ lemma zeroPiece_le_eigenspace (k : ZMod 3) : refine sup_le (sup_le ?_ ?_) (iSup_le fun a => iSup_le fun b => iSup_le fun hab => ?_) · rw [Submodule.span_le, Set.singleton_subset_iff] exact Module.End.mem_eigenspace_iff.mpr - (repGauge_cycleEigen _ (hT.repGauge_gaugeSU3Perm_prodCycle 0) k) + (map_cycleEigen _ (hT.repGauge_gaugeSU3Perm_prodCycle 0) k) · rw [Submodule.span_le, Set.singleton_subset_iff] exact Module.End.mem_eigenspace_iff.mpr - (repGauge_cycleEigen _ (hT.repGauge_gaugeSU3Perm_prodCycle 1) k) + (map_cycleEigen _ (hT.repGauge_gaugeSU3Perm_prodCycle 1) k) · rw [Submodule.span_le, Set.singleton_subset_iff] refine Module.End.mem_eigenspace_iff.mpr ?_ rw [hT.repGauge_gaugeSU3Perm_cartanEigenProd, hab] @@ -1478,12 +1675,14 @@ noncomputable def transpGellMann : Fin 8 → Matrix (Fin 3) (Fin 3) ℂ | 6 => gellMannMatrix 4 | 7 => gellMannMatrix 7 +/-- The `SU(3)` part of the transposition gauge transformation is the transposition + element. -/ +lemma toSU3_gaugeSU3Transp : GaugeGroupI.toSU3 gaugeSU3Transp = su3Transp := rfl + /-- Conjugating a Gell-Mann matrix by the transposition. -/ -lemma conj_gellMannMatrix_gaugeSU3Transp (b : Fin 8) : - gaugeSU3Transp.toSU3.1 * gellMannMatrix b * star gaugeSU3Transp.toSU3.1 - = transpGellMann b := by - rw [show gaugeSU3Transp.toSU3.1 = !![(0 : ℂ), -1, 0; -1, 0, 0; 0, 0, -1] from su3Transp_coe, - star_su3TranspMatrix] +lemma conj_gellMannMatrix_su3Transp (b : Fin 8) : + su3Transp.1 * gellMannMatrix b * star su3Transp.1 = transpGellMann b := by + rw [su3Transp_coe, star_su3TranspMatrix] fin_cases b <;> ext i j <;> fin_cases i <;> fin_cases j <;> simp [transpGellMann, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, @@ -1504,14 +1703,14 @@ noncomputable def transpCol : Fin 8 → Fin 8 → ℂ | 7 => unitVec 7 /-- The transposition on the Gell-Mann coordinate directions. -/ -lemma rowAct_gaugeSU3Transp_unitVec (b : Fin 8) : - rowAct gaugeSU3Transp (unitVec b) = transpCol b := by +lemma rowAct_su3Transp_unitVec (b : Fin 8) : + rowAct su3Transp (unitVec b) = transpCol b := by have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] norm_num funext a - rw [rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, - conj_gellMannMatrix_gaugeSU3Transp] + rw [rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, + conj_gellMannMatrix_su3Transp] fin_cases b <;> fin_cases a <;> simp [transpGellMann, gellMannCoeff, transpCol, unitVec, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, gellMannMatrix_three, gellMannMatrix_four, @@ -1522,21 +1721,21 @@ lemma rowAct_gaugeSU3Transp_unitVec (b : Fin 8) : /-- The transposition moves each root weight vector into the other cycle, sending the member at index `i` there to the member at index `1 - i`. -/ -lemma rowAct_gaugeSU3Transp_wtCoeff (j : Fin 2) (i : Fin 3) : - rowAct gaugeSU3Transp (wtCoeff (wtCycle j i)) = wtCoeff (wtCycle (j + 1) (1 - i)) := by +lemma rowAct_su3Transp_wtCoeff (j : Fin 2) (i : Fin 3) : + rowAct su3Transp (wtCoeff (wtCycle j i)) = wtCoeff (wtCycle (j + 1) (1 - i)) := by fin_cases j <;> fin_cases i <;> simp [wtCycle, wtCoeff_inl, wtCoeff_inr_inl, rootPair, rowAct_add, rowAct_sub, - rowAct_smul, rowAct_gaugeSU3Transp_unitVec, transpCol] + rowAct_smul, rowAct_su3Transp_unitVec, transpCol] all_goals module /-- The transposition exchanges the two Cartan eigenvectors, up to a sign. It cannot fix them: they are the grade one and grade two eigenvectors of the cyclic rotation, and the transposition inverts grades. -/ -lemma rowAct_gaugeSU3Transp_cartanVec (c : Fin 2) : - rowAct gaugeSU3Transp (cartanVec c) = -cartanVec (c + 1) := by +lemma rowAct_su3Transp_cartanVec (c : Fin 2) : + rowAct su3Transp (cartanVec c) = -cartanVec (c + 1) := by fin_cases c <;> simp [cartanVec, ← unitVec_cartanId, GaugeAlgebra.su3CartanId, rowAct_sub, - rowAct_add, rowAct_smul, rowAct_gaugeSU3Transp_unitVec, transpCol] + rowAct_add, rowAct_smul, rowAct_su3Transp_unitVec, transpCol] all_goals module /-! @@ -1550,30 +1749,56 @@ is what makes the grade zero piece stable under it. -/ -/-- The transposition exchanges the two cycles of root products, reversing each. -/ -lemma repGauge_gaugeSU3Transp_prodCycle (j : Fin 2) (i : Fin 3) : - repGauge gaugeSU3Transp (hT.prodCycle j i) = hT.prodCycle (j + 1) (-i) := by +/-- Every gauge transformation acts through its `SU(3)` part; for the transposition that + part is `su3Transp`. -/ +lemma repGauge_T_gaugeSU3Transp (hT : IsSU3BiAdjoint B repGauge T) : + IsSU3BiAdjointMat su3Transp (repGauge gaugeSU3Transp) T := + hT.repGauge_T gaugeSU3Transp + +/-- A map moving the components by the transposition exchanges the two cycles of root + products, reversing each. -/ +lemma map_su3Transp_prodCycle {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Transp f T) + (j : Fin 2) (i : Fin 3) : + f (hT.prodCycle j i) = hT.prodCycle (j + 1) (-i) := by fin_cases j <;> fin_cases i <;> - simp only [prodCycle, hT.repGauge_biVec, rowAct_gaugeSU3Transp_wtCoeff] <;> + simp only [prodCycle, hT.map_biVec hf, rowAct_su3Transp_wtCoeff] <;> rfl -/-- The transposition exchanges the two Cartan eigenvectors in each product. The two signs - it picks up, one from each factor, cancel. -/ +/-- The transposition exchanges the two cycles of root products, reversing each. -/ +lemma repGauge_gaugeSU3Transp_prodCycle (j : Fin 2) (i : Fin 3) : + repGauge gaugeSU3Transp (hT.prodCycle j i) = hT.prodCycle (j + 1) (-i) := + hT.map_su3Transp_prodCycle hT.repGauge_T_gaugeSU3Transp j i + +/-- A map moving the components by the transposition exchanges the two Cartan + eigenvectors in each product. The two signs it picks up, one from each factor, cancel. -/ +lemma map_su3Transp_cartanEigenProd {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3Transp f T) (a b : Fin 2) : + f (hT.cartanEigenProd a b) = hT.cartanEigenProd (a + 1) (b + 1) := by + rw [cartanEigenProd, hT.map_biVec hf, rowAct_su3Transp_cartanVec, + rowAct_su3Transp_cartanVec, hT.biVec_neg_neg, cartanEigenProd] + +/-- The transposition exchanges the two Cartan eigenvectors in each product. -/ lemma repGauge_gaugeSU3Transp_cartanEigenProd (a b : Fin 2) : repGauge gaugeSU3Transp (hT.cartanEigenProd a b) - = hT.cartanEigenProd (a + 1) (b + 1) := by - rw [cartanEigenProd, hT.repGauge_biVec, rowAct_gaugeSU3Transp_cartanVec, - rowAct_gaugeSU3Transp_cartanVec, hT.biVec_neg_neg, cartanEigenProd] + = hT.cartanEigenProd (a + 1) (b + 1) := + hT.map_su3Transp_cartanEigenProd hT.repGauge_T_gaugeSU3Transp a b + +/-- A map moving the components by the transposition exchanges the two grade zero cycle + sums. -/ +lemma map_su3Transp_cycleEigen_zero {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3Transp f T) (j : Fin 2) : + f (cycleEigen (hT.prodCycle j) 0) = cycleEigen (hT.prodCycle (j + 1)) 0 := by + rw [cycleEigen_zero_eq, cycleEigen_zero_eq, map_add, map_add, + hT.map_su3Transp_prodCycle hf, hT.map_su3Transp_prodCycle hf, + hT.map_su3Transp_prodCycle hf, show (-0 : Fin 3) = 0 from rfl, + show (-1 : Fin 3) = 2 from rfl, show (-2 : Fin 3) = 1 from rfl] + abel /-- The transposition exchanges the two grade zero cycle sums. -/ lemma repGauge_gaugeSU3Transp_cycleEigen_zero (j : Fin 2) : repGauge gaugeSU3Transp (cycleEigen (hT.prodCycle j) 0) - = cycleEigen (hT.prodCycle (j + 1)) 0 := by - rw [cycleEigen_zero_eq, cycleEigen_zero_eq, map_add, map_add, - hT.repGauge_gaugeSU3Transp_prodCycle, hT.repGauge_gaugeSU3Transp_prodCycle, - hT.repGauge_gaugeSU3Transp_prodCycle, show (-0 : Fin 3) = 0 from rfl, - show (-1 : Fin 3) = 2 from rfl, show (-2 : Fin 3) = 1 from rfl] - abel + = cycleEigen (hT.prodCycle (j + 1)) 0 := + hT.map_su3Transp_cycleEigen_zero hT.repGauge_T_gaugeSU3Transp j /-- Each grade zero cycle sum lies in the grade zero piece. -/ lemma cycleEigen_mem_zeroPiece_zero (j : Fin 2) : @@ -1627,37 +1852,61 @@ noncomputable def cartanTriv (hT : IsSU3BiAdjoint B repGauge T) : B := noncomputable def cartanSign (hT : IsSU3BiAdjoint B repGauge T) : B := hT.cartanEigenProd 0 1 - hT.cartanEigenProd 1 0 +/-- A map moving the components by the transposition fixes the symmetric root + combination. -/ +lemma map_su3Transp_rootTriv {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Transp f T) : + f hT.rootTriv = hT.rootTriv := by + rw [rootTriv, map_add, hT.map_su3Transp_cycleEigen_zero hf, + hT.map_su3Transp_cycleEigen_zero hf] + show cycleEigen (hT.prodCycle 1) 0 + cycleEigen (hT.prodCycle 0) 0 = _ + abel + /-- The transposition fixes the symmetric root combination. -/ lemma repGauge_gaugeSU3Transp_rootTriv : - repGauge gaugeSU3Transp hT.rootTriv = hT.rootTriv := by - rw [rootTriv, map_add, hT.repGauge_gaugeSU3Transp_cycleEigen_zero, - hT.repGauge_gaugeSU3Transp_cycleEigen_zero] - show cycleEigen (hT.prodCycle 1) 0 + cycleEigen (hT.prodCycle 0) 0 = _ + repGauge gaugeSU3Transp hT.rootTriv = hT.rootTriv := + hT.map_su3Transp_rootTriv hT.repGauge_T_gaugeSU3Transp + +/-- A map moving the components by the transposition negates the antisymmetric root + combination. -/ +lemma map_su3Transp_rootSign {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Transp f T) : + f hT.rootSign = -hT.rootSign := by + rw [rootSign, map_sub, hT.map_su3Transp_cycleEigen_zero hf, + hT.map_su3Transp_cycleEigen_zero hf] + show cycleEigen (hT.prodCycle 1) 0 - cycleEigen (hT.prodCycle 0) 0 = _ abel /-- The transposition negates the antisymmetric root combination. -/ lemma repGauge_gaugeSU3Transp_rootSign : - repGauge gaugeSU3Transp hT.rootSign = -hT.rootSign := by - rw [rootSign, map_sub, hT.repGauge_gaugeSU3Transp_cycleEigen_zero, - hT.repGauge_gaugeSU3Transp_cycleEigen_zero] - show cycleEigen (hT.prodCycle 1) 0 - cycleEigen (hT.prodCycle 0) 0 = _ + repGauge gaugeSU3Transp hT.rootSign = -hT.rootSign := + hT.map_su3Transp_rootSign hT.repGauge_T_gaugeSU3Transp + +/-- A map moving the components by the transposition fixes the symmetric Cartan + combination. -/ +lemma map_su3Transp_cartanTriv {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Transp f T) : + f hT.cartanTriv = hT.cartanTriv := by + rw [cartanTriv, map_add, hT.map_su3Transp_cartanEigenProd hf, + hT.map_su3Transp_cartanEigenProd hf] + show hT.cartanEigenProd 1 0 + hT.cartanEigenProd 0 1 = _ abel /-- The transposition fixes the symmetric Cartan combination. -/ lemma repGauge_gaugeSU3Transp_cartanTriv : - repGauge gaugeSU3Transp hT.cartanTriv = hT.cartanTriv := by - rw [cartanTriv, map_add, hT.repGauge_gaugeSU3Transp_cartanEigenProd, - hT.repGauge_gaugeSU3Transp_cartanEigenProd] - show hT.cartanEigenProd 1 0 + hT.cartanEigenProd 0 1 = _ + repGauge gaugeSU3Transp hT.cartanTriv = hT.cartanTriv := + hT.map_su3Transp_cartanTriv hT.repGauge_T_gaugeSU3Transp + +/-- A map moving the components by the transposition negates the antisymmetric Cartan + combination. -/ +lemma map_su3Transp_cartanSign {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Transp f T) : + f hT.cartanSign = -hT.cartanSign := by + rw [cartanSign, map_sub, hT.map_su3Transp_cartanEigenProd hf, + hT.map_su3Transp_cartanEigenProd hf] + show hT.cartanEigenProd 1 0 - hT.cartanEigenProd 0 1 = _ abel /-- The transposition negates the antisymmetric Cartan combination. -/ lemma repGauge_gaugeSU3Transp_cartanSign : - repGauge gaugeSU3Transp hT.cartanSign = -hT.cartanSign := by - rw [cartanSign, map_sub, hT.repGauge_gaugeSU3Transp_cartanEigenProd, - hT.repGauge_gaugeSU3Transp_cartanEigenProd] - show hT.cartanEigenProd 1 0 - hT.cartanEigenProd 0 1 = _ - abel + repGauge gaugeSU3Transp hT.cartanSign = -hT.cartanSign := + hT.map_su3Transp_cartanSign hT.repGauge_T_gaugeSU3Transp /-- The symmetric root combination, written out in the components of `T`: twice the six diagonal components of the root directions. -/ @@ -1730,24 +1979,25 @@ the two nonzero grades, which the transposition exchanges. /-- Symmetrizing an element of the grade zero piece over the transposition lands in the join of the two symmetric lines. -/ -lemma add_transp_mem_triv {x : B} (hx : x ∈ hT.zeroPiece 0) : - x + repGauge gaugeSU3Transp x ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by +lemma map_add_mem_triv {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Transp f T) + {x : B} (hx : x ∈ hT.zeroPiece 0) : + x + f x ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by have key : hT.zeroPiece 0 ≤ Submodule.comap - (LinearMap.id + (repGauge gaugeSU3Transp : Module.End ℂ B)) + (LinearMap.id + (f : Module.End ℂ B)) (ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv) := by rw [hT.zeroPiece_zero] refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> rw [Submodule.span_singleton_le_iff_mem, Submodule.mem_comap, LinearMap.add_apply, LinearMap.id_apply] - · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + · rw [hT.map_su3Transp_cycleEigen_zero hf] exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) - · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + · rw [hT.map_su3Transp_cycleEigen_zero hf] show cycleEigen (hT.prodCycle 1) 0 + cycleEigen (hT.prodCycle 0) 0 ∈ _ rw [add_comm] exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) - · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + · rw [hT.map_su3Transp_cartanEigenProd hf] exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + · rw [hT.map_su3Transp_cartanEigenProd hf] show hT.cartanEigenProd 1 0 + hT.cartanEigenProd 0 1 ∈ _ rw [add_comm] exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) @@ -1756,24 +2006,25 @@ lemma add_transp_mem_triv {x : B} (hx : x ∈ hT.zeroPiece 0) : /-- Antisymmetrizing an element of the grade zero piece over the transposition lands in the join of the two antisymmetric lines. -/ -lemma sub_transp_mem_sign {x : B} (hx : x ∈ hT.zeroPiece 0) : - x - repGauge gaugeSU3Transp x ∈ ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign := by +lemma map_sub_mem_sign {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat su3Transp f T) + {x : B} (hx : x ∈ hT.zeroPiece 0) : + x - f x ∈ ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign := by have key : hT.zeroPiece 0 ≤ Submodule.comap - (LinearMap.id - (repGauge gaugeSU3Transp : Module.End ℂ B)) + (LinearMap.id - (f : Module.End ℂ B)) (ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign) := by rw [hT.zeroPiece_zero] refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) <;> rw [Submodule.span_singleton_le_iff_mem, Submodule.mem_comap, LinearMap.sub_apply, LinearMap.id_apply] - · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + · rw [hT.map_su3Transp_cycleEigen_zero hf] exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) - · rw [hT.repGauge_gaugeSU3Transp_cycleEigen_zero] + · rw [hT.map_su3Transp_cycleEigen_zero hf] show cycleEigen (hT.prodCycle 1) 0 - cycleEigen (hT.prodCycle 0) 0 ∈ _ rw [← neg_sub] exact Submodule.mem_sup_left (neg_mem (Submodule.mem_span_singleton_self _)) - · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + · rw [hT.map_su3Transp_cartanEigenProd hf] exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - · rw [hT.repGauge_gaugeSU3Transp_cartanEigenProd] + · rw [hT.map_su3Transp_cartanEigenProd hf] show hT.cartanEigenProd 1 0 - hT.cartanEigenProd 0 1 ∈ _ rw [← neg_sub] exact Submodule.mem_sup_right (neg_mem (Submodule.mem_span_singleton_self _)) @@ -1800,7 +2051,8 @@ lemma sup_span_sign_le_zeroPiece_zero : both lie there, so the image of the element does too. -/ lemma repGauge_gaugeSU3Transp_mem_zeroPiece_zero {x : B} (hx : x ∈ hT.zeroPiece 0) : repGauge gaugeSU3Transp x ∈ hT.zeroPiece 0 := by - have h := hT.sup_span_triv_le_zeroPiece_zero (hT.add_transp_mem_triv hx) + have h := hT.sup_span_triv_le_zeroPiece_zero + (hT.map_add_mem_triv hT.repGauge_T_gaugeSU3Transp hx) simpa using sub_mem h hx /-- The `S₃` isotypic decomposition of the zero-weight piece of the gauge weight @@ -1824,7 +2076,7 @@ lemma zeroPieceSU3Weyl_isotypic_triv (hmul : IsMulRep repGauge) : · rintro x ⟨hx0, hxR⟩ have hR : repGauge gaugeSU3Transp x = x := by simpa using Module.End.mem_eigenspace_iff.mp hxR - have h := hT.add_transp_mem_triv hx0 + have h := hT.map_add_mem_triv hT.repGauge_T_gaugeSU3Transp hx0 rw [hR] at h have h2 := Submodule.smul_mem _ ((2 : ℂ)⁻¹) h rwa [show (2 : ℂ)⁻¹ • (x + x) = x from by module] at h2 @@ -1848,7 +2100,7 @@ lemma zeroPieceSU3Weyl_isotypic_sign (hmul : IsMulRep repGauge) : · rintro x ⟨hx0, hxR⟩ have hR : repGauge gaugeSU3Transp x = -x := by simpa using Module.End.mem_eigenspace_iff.mp hxR - have h := hT.sub_transp_mem_sign hx0 + have h := hT.map_sub_mem_sign hT.repGauge_T_gaugeSU3Transp hx0 rw [hR] at h have h2 := Submodule.smul_mem _ ((2 : ℂ)⁻¹) h rwa [show (2 : ℂ)⁻¹ • (x - -x) = x from by module] at h2 @@ -1964,12 +2216,12 @@ noncomputable def gaugeSU3Turn (v : ℂ) (hv : v * (starRingEnd ℂ) v = 2⁻¹) /-- Conjugating the first Cartan direction by a quarter turn: the diagonal of the result cancels, since the two entries of the turn have the same modulus, and what is left is a combination of the two members of the first root pair. -/ -lemma conj_gellMannMatrix_two_gaugeSU3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : - (gaugeSU3Turn v hv).toSU3.1 * gellMannMatrix 2 * star (gaugeSU3Turn v hv).toSU3.1 +lemma conj_gellMannMatrix_two_su3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + (su3Turn v hv).1 * gellMannMatrix 2 * star (su3Turn v hv).1 = !![0, -((1 + Complex.I) * v), 0; -((1 - Complex.I) * (starRingEnd ℂ) v), 0, 0; 0, 0, 0] := by - rw [show (gaugeSU3Turn v hv).toSU3.1 = su3TurnMatrix v from rfl, star_su3TurnMatrix] + rw [show (su3Turn v hv).1 = su3TurnMatrix v from rfl, star_su3TurnMatrix] ext i j fin_cases i <;> fin_cases j <;> simp [su3TurnMatrix, gellMannMatrix_two, Matrix.mul_apply, Fin.sum_univ_three] @@ -1995,69 +2247,82 @@ lemma conj_diag_su3TurnMatrix {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) | linear_combination hv - (1 / 4 : ℂ) * Complex.I_sq /-- Conjugating the second Cartan direction by a quarter turn leaves it alone. -/ -lemma conj_gellMannMatrix_seven_gaugeSU3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : - (gaugeSU3Turn v hv).toSU3.1 * gellMannMatrix 7 * star (gaugeSU3Turn v hv).toSU3.1 +lemma conj_gellMannMatrix_seven_su3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + (su3Turn v hv).1 * gellMannMatrix 7 * star (su3Turn v hv).1 = gellMannMatrix 7 := by - rw [show (gaugeSU3Turn v hv).toSU3.1 = su3TurnMatrix v from rfl, gellMannMatrix_seven, + rw [show (su3Turn v hv).1 = su3TurnMatrix v from rfl, gellMannMatrix_seven, Matrix.mul_smul, Matrix.smul_mul, conj_diag_su3TurnMatrix hv] /-- The first quarter turn, at `v = (1 - i) / 2`: it carries `λ₃` to `-λ₁`. -/ -noncomputable def gaugeSU3TurnFst : GaugeGroupI := - gaugeSU3Turn ((1 - Complex.I) / 2) +noncomputable def su3TurnFst : specialUnitaryGroup (Fin 3) ℂ := + su3Turn ((1 - Complex.I) / 2) (by rw [map_div₀, map_sub, map_one, Complex.conj_I, map_ofNat] linear_combination (-1 / 4 : ℂ) * Complex.I_sq) /-- The second quarter turn, at `v = (1 + i) / 2`: it carries `λ₃` to `λ₂`. -/ -noncomputable def gaugeSU3TurnSnd : GaugeGroupI := - gaugeSU3Turn ((1 + Complex.I) / 2) +noncomputable def su3TurnSnd : specialUnitaryGroup (Fin 3) ℂ := + su3Turn ((1 + Complex.I) / 2) (by rw [map_div₀, map_add, map_one, Complex.conj_I, map_ofNat] linear_combination (-1 / 4 : ℂ) * Complex.I_sq) +/-- The first quarter turn as a gauge transformation: trivial on isospin and + hypercharge. -/ +noncomputable def gaugeSU3TurnFst : GaugeGroupI := ⟨su3TurnFst, 1, 1⟩ + +/-- The second quarter turn as a gauge transformation. -/ +noncomputable def gaugeSU3TurnSnd : GaugeGroupI := ⟨su3TurnSnd, 1, 1⟩ + +/-- The `SU(3)` part of the first quarter turn gauge transformation. -/ +lemma toSU3_gaugeSU3TurnFst : GaugeGroupI.toSU3 gaugeSU3TurnFst = su3TurnFst := rfl + +/-- The `SU(3)` part of the second quarter turn gauge transformation. -/ +lemma toSU3_gaugeSU3TurnSnd : GaugeGroupI.toSU3 gaugeSU3TurnSnd = su3TurnSnd := rfl + /-- The first quarter turn on the first Cartan coordinate direction: it lands on the first member of the first root pair, up to sign. This is the step no element of the normaliser of the torus can take. -/ -lemma rowAct_gaugeSU3TurnFst_unitVec_two : - rowAct gaugeSU3TurnFst (unitVec 2) = -unitVec 0 := by +lemma rowAct_su3TurnFst_unitVec_two : + rowAct su3TurnFst (unitVec 2) = -unitVec 0 := by funext a - rw [gaugeSU3TurnFst, rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, - conj_gellMannMatrix_two_gaugeSU3Turn] + rw [su3TurnFst, rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, + conj_gellMannMatrix_two_su3Turn] fin_cases a <;> simp [gellMannCoeff, unitVec] all_goals norm_num /-- The second quarter turn on the first Cartan coordinate direction: it lands on the second member of the first root pair. The two turns are both needed, since the Weyl group never mixes the two members of a root pair with each other. -/ -lemma rowAct_gaugeSU3TurnSnd_unitVec_two : - rowAct gaugeSU3TurnSnd (unitVec 2) = unitVec 1 := by +lemma rowAct_su3TurnSnd_unitVec_two : + rowAct su3TurnSnd (unitVec 2) = unitVec 1 := by funext a - rw [gaugeSU3TurnSnd, rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, - conj_gellMannMatrix_two_gaugeSU3Turn] + rw [su3TurnSnd, rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, + conj_gellMannMatrix_two_su3Turn] fin_cases a <;> simp [gellMannCoeff, unitVec] all_goals norm_num /-- A quarter turn fixes the second Cartan coordinate direction. -/ -lemma rowAct_gaugeSU3Turn_unitVec_seven {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : - rowAct (gaugeSU3Turn v hv) (unitVec 7) = unitVec 7 := by +lemma rowAct_su3Turn_unitVec_seven {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : + rowAct (su3Turn v hv) (unitVec 7) = unitVec 7 := by have h3 : Real.sqrt 3 ≠ 0 := ne_of_gt (Real.sqrt_pos.mpr (by norm_num)) funext a - rw [rowAct_unitVec, adjointMatrix_inl_inl_eq_gellMannCoeff, - conj_gellMannMatrix_seven_gaugeSU3Turn hv] + rw [rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, + conj_gellMannMatrix_seven_su3Turn hv] fin_cases a <;> simp [gellMannCoeff, gellMannMatrix_seven, unitVec] field_simp rw [← Complex.ofReal_pow, Real.sq_sqrt (by norm_num : (0 : ℝ) ≤ 3)] norm_num /-- The first quarter turn fixes the second Cartan coordinate direction. -/ -lemma rowAct_gaugeSU3TurnFst_unitVec_seven : - rowAct gaugeSU3TurnFst (unitVec 7) = unitVec 7 := by - rw [gaugeSU3TurnFst] - exact rowAct_gaugeSU3Turn_unitVec_seven _ +lemma rowAct_su3TurnFst_unitVec_seven : + rowAct su3TurnFst (unitVec 7) = unitVec 7 := by + rw [su3TurnFst] + exact rowAct_su3Turn_unitVec_seven _ /-- The second quarter turn fixes the second Cartan coordinate direction. -/ -lemma rowAct_gaugeSU3TurnSnd_unitVec_seven : - rowAct gaugeSU3TurnSnd (unitVec 7) = unitVec 7 := by - rw [gaugeSU3TurnSnd] - exact rowAct_gaugeSU3Turn_unitVec_seven _ +lemma rowAct_su3TurnSnd_unitVec_seven : + rowAct su3TurnSnd (unitVec 7) = unitVec 7 := by + rw [su3TurnSnd] + exact rowAct_su3Turn_unitVec_seven _ /-! @@ -2084,52 +2349,102 @@ them plus the pair, to four times it. /-- The first quarter turn on the Cartan pair of diagonal components: the second is fixed, and the first is carried to the diagonal component of the first root direction. -/ -lemma repGauge_gaugeSU3TurnFst_cartanPair (hT : IsSU3BiAdjoint B repGauge T) : - repGauge gaugeSU3TurnFst (T ![2, 2] + T ![7, 7]) = T ![0, 0] + T ![7, 7] := by - rw [← hT.biVec_unitVec 2 2, ← hT.biVec_unitVec 7 7, map_add, hT.repGauge_biVec, - hT.repGauge_biVec, rowAct_gaugeSU3TurnFst_unitVec_two, - rowAct_gaugeSU3TurnFst_unitVec_seven, hT.biVec_neg_neg, hT.biVec_unitVec, +lemma map_su3TurnFst_cartanPair (hT : IsSU3BiAdjoint B repGauge T) {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3TurnFst f T) : + f (T ![2, 2] + T ![7, 7]) = T ![0, 0] + T ![7, 7] := by + rw [← hT.biVec_unitVec 2 2, ← hT.biVec_unitVec 7 7, map_add, hT.map_biVec hf, + hT.map_biVec hf, rowAct_su3TurnFst_unitVec_two, + rowAct_su3TurnFst_unitVec_seven, hT.biVec_neg_neg, hT.biVec_unitVec, hT.biVec_unitVec] +/-- Every gauge transformation acts through its `SU(3)` part; for the first quarter turn + that part is `su3TurnFst`. -/ +lemma repGauge_T_gaugeSU3TurnFst (hT : IsSU3BiAdjoint B repGauge T) : + IsSU3BiAdjointMat su3TurnFst (repGauge gaugeSU3TurnFst) T := + hT.repGauge_T gaugeSU3TurnFst + +/-- Every gauge transformation acts through its `SU(3)` part; for the second quarter turn + that part is `su3TurnSnd`. -/ +lemma repGauge_T_gaugeSU3TurnSnd (hT : IsSU3BiAdjoint B repGauge T) : + IsSU3BiAdjointMat su3TurnSnd (repGauge gaugeSU3TurnSnd) T := + hT.repGauge_T gaugeSU3TurnSnd + +/-- The first quarter turn on the Cartan pair of diagonal components. -/ +lemma repGauge_gaugeSU3TurnFst_cartanPair (hT : IsSU3BiAdjoint B repGauge T) : + repGauge gaugeSU3TurnFst (T ![2, 2] + T ![7, 7]) = T ![0, 0] + T ![7, 7] := + hT.map_su3TurnFst_cartanPair hT.repGauge_T_gaugeSU3TurnFst + +/-- The second quarter turn on the Cartan pair of diagonal components: the second is + fixed, and the first is carried to the diagonal component of the second root + direction. -/ +lemma map_su3TurnSnd_cartanPair (hT : IsSU3BiAdjoint B repGauge T) {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3TurnSnd f T) : + f (T ![2, 2] + T ![7, 7]) = T ![1, 1] + T ![7, 7] := by + rw [← hT.biVec_unitVec 2 2, ← hT.biVec_unitVec 7 7, map_add, hT.map_biVec hf, + hT.map_biVec hf, rowAct_su3TurnSnd_unitVec_two, + rowAct_su3TurnSnd_unitVec_seven, hT.biVec_unitVec, hT.biVec_unitVec] + /-- The second quarter turn on the Cartan pair of diagonal components. -/ lemma repGauge_gaugeSU3TurnSnd_cartanPair (hT : IsSU3BiAdjoint B repGauge T) : - repGauge gaugeSU3TurnSnd (T ![2, 2] + T ![7, 7]) = T ![1, 1] + T ![7, 7] := by - rw [← hT.biVec_unitVec 2 2, ← hT.biVec_unitVec 7 7, map_add, hT.repGauge_biVec, - hT.repGauge_biVec, rowAct_gaugeSU3TurnSnd_unitVec_two, - rowAct_gaugeSU3TurnSnd_unitVec_seven, hT.biVec_unitVec, hT.biVec_unitVec] + repGauge gaugeSU3TurnSnd (T ![2, 2] + T ![7, 7]) = T ![1, 1] + T ![7, 7] := + hT.map_su3TurnSnd_cartanPair hT.repGauge_T_gaugeSU3TurnSnd /-- The first quarter turn on the symmetric Cartan combination: one of its two diagonal components becomes a root one, so it leaves the line it spans. -/ +lemma map_su3TurnFst_cartanTriv {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3TurnFst f T) : + f hT.cartanTriv = (2 : ℂ) • (T ![0, 0] + T ![7, 7]) := by + rw [hT.cartanTriv_eq, map_smul, hT.map_su3TurnFst_cartanPair hf] + +/-- The first quarter turn on the symmetric Cartan combination. -/ lemma repGauge_gaugeSU3TurnFst_cartanTriv : - repGauge gaugeSU3TurnFst hT.cartanTriv = (2 : ℂ) • (T ![0, 0] + T ![7, 7]) := by - rw [hT.cartanTriv_eq, map_smul, hT.repGauge_gaugeSU3TurnFst_cartanPair] + repGauge gaugeSU3TurnFst hT.cartanTriv = (2 : ℂ) • (T ![0, 0] + T ![7, 7]) := + hT.map_su3TurnFst_cartanTriv hT.repGauge_T_gaugeSU3TurnFst + +/-- The second quarter turn on the symmetric Cartan combination. -/ +lemma map_su3TurnSnd_cartanTriv {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3TurnSnd f T) : + f hT.cartanTriv = (2 : ℂ) • (T ![1, 1] + T ![7, 7]) := by + rw [hT.cartanTriv_eq, map_smul, hT.map_su3TurnSnd_cartanPair hf] /-- The second quarter turn on the symmetric Cartan combination. -/ lemma repGauge_gaugeSU3TurnSnd_cartanTriv : - repGauge gaugeSU3TurnSnd hT.cartanTriv = (2 : ℂ) • (T ![1, 1] + T ![7, 7]) := by - rw [hT.cartanTriv_eq, map_smul, hT.repGauge_gaugeSU3TurnSnd_cartanPair] + repGauge gaugeSU3TurnSnd hT.cartanTriv = (2 : ℂ) • (T ![1, 1] + T ![7, 7]) := + hT.map_su3TurnSnd_cartanTriv hT.repGauge_T_gaugeSU3TurnSnd /-- The first quarter turn on the symmetric root combination: it gains exactly the weight the symmetric Cartan combination loses, the two together summing to twice the gauge invariant trace contraction. -/ +lemma map_su3TurnFst_rootTriv {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3TurnFst f T) : + f hT.rootTriv = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![0, 0]) := by + have hr : hT.rootTriv = (2 : ℂ) • hT.traceContraction - hT.cartanTriv := + eq_sub_of_add_eq hT.rootTriv_add_cartanTriv + rw [hr, map_sub, map_smul, hT.map_traceContraction hf, + hT.map_su3TurnFst_cartanTriv hf, hT.cartanTriv_eq] + module + +/-- The first quarter turn on the symmetric root combination. -/ lemma repGauge_gaugeSU3TurnFst_rootTriv : repGauge gaugeSU3TurnFst hT.rootTriv - = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![0, 0]) := by + = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![0, 0]) := + hT.map_su3TurnFst_rootTriv hT.repGauge_T_gaugeSU3TurnFst + +/-- The second quarter turn on the symmetric root combination. -/ +lemma map_su3TurnSnd_rootTriv {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat su3TurnSnd f T) : + f hT.rootTriv = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![1, 1]) := by have hr : hT.rootTriv = (2 : ℂ) • hT.traceContraction - hT.cartanTriv := eq_sub_of_add_eq hT.rootTriv_add_cartanTriv - rw [hr, map_sub, map_smul, hT.repGauge_traceContraction, - hT.repGauge_gaugeSU3TurnFst_cartanTriv, hT.cartanTriv_eq] + rw [hr, map_sub, map_smul, hT.map_traceContraction hf, + hT.map_su3TurnSnd_cartanTriv hf, hT.cartanTriv_eq] module /-- The second quarter turn on the symmetric root combination. -/ lemma repGauge_gaugeSU3TurnSnd_rootTriv : repGauge gaugeSU3TurnSnd hT.rootTriv - = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![1, 1]) := by - have hr : hT.rootTriv = (2 : ℂ) • hT.traceContraction - hT.cartanTriv := - eq_sub_of_add_eq hT.rootTriv_add_cartanTriv - rw [hr, map_sub, map_smul, hT.repGauge_traceContraction, - hT.repGauge_gaugeSU3TurnSnd_cartanTriv, hT.cartanTriv_eq] - module + = hT.rootTriv + (2 : ℂ) • (T ![2, 2] - T ![1, 1]) := + hT.map_su3TurnSnd_rootTriv hT.repGauge_T_gaugeSU3TurnSnd /-- The three coordinate directions the cyclic colour rotation moves the first Cartan direction through: one Cartan direction for each of the three colour pairs. -/ @@ -2143,22 +2458,22 @@ lemma cartanTurn_zero : cartanTurn 0 = unitVec 2 := rfl /-- The cyclic colour rotation moves each of the three directions one step along the cycle. -/ -lemma rowAct_gaugeSU3Perm_cartanTurn (i : Fin 3) : - rowAct gaugeSU3Perm (cartanTurn i) = cartanTurn (i + 1) := by +lemma rowAct_su3Perm_cartanTurn (i : Fin 3) : + rowAct su3Perm (cartanTurn i) = cartanTurn (i + 1) := by have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] norm_num fin_cases i - · show rowAct gaugeSU3Perm (cartanTurn 0) = cartanTurn 1 - simp only [cartanTurn, rowAct_gaugeSU3Perm_unitVec, permCol] - · show rowAct gaugeSU3Perm (cartanTurn 1) = cartanTurn 2 - simp only [cartanTurn, rowAct_add, rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol] + · show rowAct su3Perm (cartanTurn 0) = cartanTurn 1 + simp only [cartanTurn, rowAct_su3Perm_unitVec, permCol] + · show rowAct su3Perm (cartanTurn 1) = cartanTurn 2 + simp only [cartanTurn, rowAct_add, rowAct_smul, rowAct_su3Perm_unitVec, permCol] match_scalars all_goals first | ring1 | linear_combination (-(1 : ℂ) / 4) * h3 - · show rowAct gaugeSU3Perm (cartanTurn 2) = cartanTurn 0 - simp only [cartanTurn, rowAct_sub, rowAct_smul, rowAct_gaugeSU3Perm_unitVec, permCol] + · show rowAct su3Perm (cartanTurn 2) = cartanTurn 0 + simp only [cartanTurn, rowAct_sub, rowAct_smul, rowAct_su3Perm_unitVec, permCol] match_scalars all_goals first | ring1 @@ -2190,11 +2505,12 @@ lemma smul_traceContraction_eq_of_invariant (f : ℂ) = f • (T ![2, 2] + T ![7, 7])) : f • hT.traceContraction = (4 : ℂ) • (f • (T ![2, 2] + T ![7, 7])) := by have hperm : ∀ c₀ c₁ : Fin 8 → ℂ, f • hT.biVec c₀ c₀ = f • hT.biVec c₁ c₁ → - f • hT.biVec (rowAct gaugeSU3Perm c₀) (rowAct gaugeSU3Perm c₀) - = f • hT.biVec (rowAct gaugeSU3Perm c₁) (rowAct gaugeSU3Perm c₁) := by + f • hT.biVec (rowAct su3Perm c₀) (rowAct su3Perm c₀) + = f • hT.biVec (rowAct su3Perm c₁) (rowAct su3Perm c₁) := by intro c₀ c₁ h have h' := congrArg (repGauge gaugeSU3Perm) h - rwa [map_smul, map_smul, hT.repGauge_biVec, hT.repGauge_biVec] at h' + rwa [map_smul, map_smul, hT.map_biVec hT.repGauge_T_gaugeSU3Perm, + hT.map_biVec hT.repGauge_T_gaugeSU3Perm] at h' have hbase : ∀ g : GaugeGroupI, ∀ y : B, repGauge g (T ![2, 2] + T ![7, 7]) = y + T ![7, 7] → f • y = f • T ![2, 2] := by intro g y hg @@ -2212,22 +2528,22 @@ lemma smul_traceContraction_eq_of_invariant (f : ℂ) have hA1 : f • hT.biVec (unitVec 5) (unitVec 5) = f • hT.biVec (cartanTurn 1) (cartanTurn 1) := by have h := hperm _ _ hA0 - rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + rwa [rowAct_su3Perm_unitVec, rowAct_su3Perm_cartanTurn, show ((0 : Fin 3) + 1) = 1 from rfl, show permCol 0 = unitVec 5 from rfl] at h have hB1 : f • hT.biVec (unitVec 6) (unitVec 6) = f • hT.biVec (cartanTurn 1) (cartanTurn 1) := by have h := hperm _ _ hB0 - rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + rwa [rowAct_su3Perm_unitVec, rowAct_su3Perm_cartanTurn, show ((0 : Fin 3) + 1) = 1 from rfl, show permCol 1 = unitVec 6 from rfl] at h have hA2 : f • hT.biVec (unitVec 3) (unitVec 3) = f • hT.biVec (cartanTurn 2) (cartanTurn 2) := by have h := hperm _ _ hA1 - rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + rwa [rowAct_su3Perm_unitVec, rowAct_su3Perm_cartanTurn, show ((1 : Fin 3) + 1) = 2 from rfl, show permCol 5 = unitVec 3 from rfl] at h have hB2 : f • hT.biVec (unitVec 4) (unitVec 4) = f • hT.biVec (cartanTurn 2) (cartanTurn 2) := by have h := hperm _ _ hB1 - rwa [rowAct_gaugeSU3Perm_unitVec, rowAct_gaugeSU3Perm_cartanTurn, + rwa [rowAct_su3Perm_unitVec, rowAct_su3Perm_cartanTurn, show ((1 : Fin 3) + 1) = 2 from rfl, show permCol 6 = -unitVec 4 from rfl, hT.biVec_neg_neg] at h simp only [hT.biVec_unitVec] at hA0 hB0 hA1 hB1 hA2 hB2 @@ -2293,6 +2609,39 @@ lemma mem_span_and_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMu exact ⟨Submodule.smul_mem _ _ hT.traceContraction_mem_span, fun g => by rw [map_smul, hT.repGauge_traceContraction]⟩ +/-- The sharper reading of the classification: invariance under the colour factor alone + already forces a member of the span to be a multiple of the trace contraction. The + family is bi-adjoint for the colour part of the representation as well, with the same + span and the same trace contraction, so this is the statement above read there, and it + is stronger because its hypothesis is weaker. -/ +lemma exists_smul_traceContraction_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + ∃ c : ℂ, x = c • hT.traceContraction := + hT.toRepSU3.exists_smul_traceContraction_of_invariant (isMulRep_repSU3 hmul) hx + ((repSU3_invariant_iff_su3 repGauge x).2 hinv) + +/-- The colour invariants in the span of the components are exactly the multiples of the + trace contraction, the isospin and hypercharge factors adding nothing. -/ +lemma mem_span_and_su3_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) (x : B) : + (x ∈ hT.span ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) + ↔ x ∈ ℂ ∙ hT.traceContraction := by + rw [← repSU3_invariant_iff_su3 repGauge x] + exact hT.toRepSU3.mem_span_and_invariant_iff (isMulRep_repSU3 hmul) x + +/-- Inside the span of the components the two notions of invariance agree: a vector fixed + by the colour factor is fixed by the whole gauge group. One direction is free, a colour + transformation being a gauge transformation; the other is the classification, the colour + invariants being multiples of the trace contraction and that being gauge invariant. -/ +lemma su3_invariant_iff_invariant (hT : IsSU3BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) : + (∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) + ↔ ∀ g : GaugeGroupI, repGauge g x = x := by + refine ⟨fun h g => ?_, fun h U => h (U, 1, 1)⟩ + obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_su3_invariant hmul hx h + rw [map_smul, hT.repGauge_traceContraction] + /-! ## F.4. The trivial square-zero extension of a module @@ -2407,6 +2756,15 @@ lemma exists_smul_traceContraction_of_invariant_module (hU : IsSU3BiAdjoint M ρ refine ⟨c, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ rw [hc, hU.traceContraction_sqZeroRep, TrivSqZeroExt.inr_smul] +/-- The same classification for a family valued in a mere module, read at the colour + factor alone. -/ +lemma exists_smul_traceContraction_of_su3_invariant_module (hU : IsSU3BiAdjoint M ρ U) + {x : M} (hx : x ∈ hU.span) + (hinv : ∀ V : specialUnitaryGroup (Fin 3) ℂ, ρ (V, 1, 1) x = x) : + ∃ c : ℂ, x = c • hU.traceContraction := + hU.toRepSU3.exists_smul_traceContraction_of_invariant_module hx + ((repSU3_invariant_iff_su3 ρ x).2 hinv) + end SquareZero /-! @@ -2496,6 +2854,23 @@ lemma mem_span_sup_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMu rwa [Submodule.ker_mkQ] at hker · rw [map_sub, map_smul, hinv g, hT.repGauge_traceContraction] +/-- The same statement modulo a colour-stable submodule, read at the colour factor alone: + a vector of the span joined with `S` that the colour factor fixes is a multiple of the + trace contraction up to an error in `S`, and the error is fixed by the colour factor + too. -/ +lemma mem_span_sup_su3_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) (x : B) (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S) + (hx : x ∈ hT.span ⊔ S) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y + ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) y = y := by + obtain ⟨c, y, hyS, hxy, hyinv⟩ := + hT.toRepSU3.mem_span_sup_invariant_iff (isMulRep_repSU3 hmul) x S + ((repSU3_stable_iff_su3 repGauge S).2 hS) hx + ((repSU3_invariant_iff_su3 repGauge x).2 hinv) + exact ⟨c, y, hyS, hxy, (repSU3_invariant_iff_su3 repGauge y).1 hyinv⟩ + end Decomposition end IsSU3BiAdjoint From 03e6893fd7be3b4e8a0f7a27d1a4fd47a574186c Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 06:32:01 +0100 Subject: [PATCH 249/254] feat: Improve the TODOs --- scripts/insert_todo.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/scripts/insert_todo.py b/scripts/insert_todo.py index 188c2f2f5..35bb9b6c1 100644 --- a/scripts/insert_todo.py +++ b/scripts/insert_todo.py @@ -15,9 +15,11 @@ python scripts/insert_todo.py FILE START [END] [--text "..."] `START` and `END` are 1-indexed line numbers of the code the note is about; `END` -defaults to `START`. With no `--text` an empty string is inserted, ready to type into. -The point between the quotes of the note is printed on stdout as `LINE:COLUMN`, and with -`--goto` the cursor of the running editor is put there. +defaults to `START`. A blank line, or a pair of them, is a place in the file rather than +a piece of code, so a note taken there is written without a `(lines := ...)` clause and +refers to where it sits. With no `--text` an empty string is inserted, ready to type +into. The point between the quotes of the note is printed on stdout as `LINE:COLUMN`, +and with `--goto` the cursor of the running editor is put there. """ from __future__ import annotations @@ -102,9 +104,25 @@ def safe_insertion_line(lines: list[str], target: int) -> int: return len(lines) -def render(start: int, end: int, text: str) -> str: - """The `TODO` command for a line or a range of lines.""" +def names_lines(lines: list[str], start: int, end: int) -> bool: + """Whether a note about lines `start` to `end` (1-indexed) should say so. + + One or two blank lines are a gap between declarations rather than any code, so a + note taken there is about the place and not about what is written on it. Naming + those lines would only pin the note to nothing; without a `(lines := ...)` clause it + refers to the line the command is on, which is exactly that place. + """ + if end - start > 1: + return True + return any(lines[i - 1].strip() for i in range(start, end + 1)) + + +def render(start: int | None, end: int, text: str) -> str: + """The `TODO` command for a line or a range of lines, or, when `start` is `None`, + one that names no lines at all.""" escaped = text.replace("\\", "\\\\").replace('"', '\\"') + if start is None: + return f'TODO "{escaped}"\n' if end > start: return f'TODO (lines := {start}-{end}) "{escaped}"\n' return f'TODO (lines := {start}) "{escaped}"\n' @@ -189,7 +207,7 @@ def main() -> int: lines[-1] += "\n" at = safe_insertion_line(lines, end - 1) - command = render(start, end, args.text) + command = render(start if names_lines(lines, start, end) else None, end, args.text) # Keep the note a paragraph of its own, without doubling a blank line already there. before = ["\n"] if at > 0 and lines[at - 1].strip() else [] after = ["\n"] if at < len(lines) and lines[at].strip() else [] From 77e44f2f2243c0b8a75caece56e694267e0b2567 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 08:30:22 +0100 Subject: [PATCH 250/254] feat: Fix SU3 Bi Adjoint --- .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 1012 +++++++++++++++-- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 299 +++-- 2 files changed, 1134 insertions(+), 177 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean index ff7246f18..3469e8875 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -7,6 +7,8 @@ module public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition +public import Mathlib.Algebra.TrivSqZeroExt.Basic /-! # Gauge tensors carrying two `su(2)` adjoint indices @@ -19,10 +21,42 @@ This is the gauge analogue of `IsQuadLorentz`. The field strength of the `W` bos carries one `su(2)` adjoint index, so a product of two field strengths carries two, and the proposition here records how such a product transforms. -Section A records the adjoint matrix of the `SU(2)` factor, through which the -transformation law is phrased, section B gives the proposition and the span of its -components, section C the trace contraction, which is the natural gauge invariant built -from two adjoint indices, and section D the gauge weight decomposition of the span. +The transformation law itself is `IsSU2BiAdjointMat`, which relates one element of +`SU(2)` to one linear map on `B` and mentions no other factor of the gauge group, through +`su2AdjointMatrix`, the adjoint matrix of an `SU(2)` element alone. `IsSU2BiAdjoint` says +that the isospin transformation `(1, U, 1)` obeys that law with the matrix of `U`, for +every `U` in `SU(2)`, and it says nothing whatever about the colour and hypercharge +factors: those may move the components as they please. So the mathematics here is `SU(2)` +mathematics twice over, in the law and in the hypothesis, and the conclusions are about +invariance under the isospin factor. + +Two things follow that are worth stating at the outset. The gauge weight decomposition +must know how all four torus generators act, and only `gaugeTorusGen 2` is an isospin +transformation, so the decomposition cannot be built for `repGauge`. It is built instead +for `repSU2 repGauge` of section A.3, the isospin part of the representation, which sends +the colour and hypercharge generators to the identity and so gives them weight zero by +construction rather than by hypothesis. And the trace contraction is fixed by the isospin +factor only; the statements that need it to be gauge invariant, `mem_span_and_invariant_iff`, +`su2_invariant_iff_invariant` and `mem_span_sup_invariant_iff`, take that invariance as an +explicit hypothesis, since nothing here proves it. + +Section A gives the adjoint matrix of the `SU(2)` factor, the proposition and the span of +its components, section B the trace contraction, which is the natural isospin invariant +built from two adjoint indices, and section C the gauge weight decomposition of the span, +for the isospin part of the representation, ending with the zero-weight piece, the three +lines the torus alone cannot separate. Section D classifies the isospin invariants. The +`SU(2)` Weyl element is a half turn about the Cartan axis, and it cuts the three lines to +two; a third of a turn about the diagonal axis of the three Pauli directions, which is not +in the normaliser of the torus, cuts those two down to the one line through the trace +contraction. So `mem_span_and_su2_invariant_iff` says the isospin invariants in the span +are exactly the multiples of the trace contraction, the single singlet of `3 ⊗ 3`. +Sections D.4 and D.5 shed the hypotheses that classification is stated under. The trivial +square-zero extension of a module is an algebra on which every representation acts by +algebra maps, so the classification needs no algebra structure and no multiplicativity at +all, and it then descends to the quotient by a stable submodule, which is +`mem_span_sup_su2_invariant_iff`. The row orthonormality of `su2AdjointMatrix` that +section B rests on is inherited from the `su(2)` block of `adjointMatrix`, and proved +where that matrix is defined, in `GaugeAlgebra.Basis`. -/ @[expose] public section @@ -33,15 +67,20 @@ open Matrix PauliMatrix /-! -## A. The adjoint matrix of the `SU(2)` factor +## A. The `SU(2)` adjoint matrix and bi-adjoint families -An `su(2)` adjoint index is acted on by the `SU(2)` factor of the gauge group alone, -through the trace pairing of the Pauli basis with the Pauli basis conjugated by the -`SU(2)` matrix. That pairing is recorded here as `su2AdjointMatrix`, a matrix built from -an element of `SU(2)` and nothing else, so that the transformation law below can be -stated without mentioning the other two factors of the gauge group. It is the `su(2)` -block of `GaugeAlgebra.adjointMatrix`, and inherits from it the orthonormality of its -rows. +An `su(2)` adjoint index is acted on by the `SU(2)` factor of the gauge group alone. That +action is recorded in A.1 as `su2AdjointMatrix`, a matrix built from an element of `SU(2)` +and nothing else, A.2 phrases the transformation law through it, so that no other factor +of the gauge group appears in the law nor in the hypothesis, and A.3 reads a +representation of the gauge group at its isospin factor alone. + +## A.1. The adjoint matrix of the `SU(2)` factor + +The matrix is the trace pairing of the Pauli basis of `su(2)` with the Pauli basis +conjugated by the `SU(2)` element. It is the `su(2)` block of +`GaugeAlgebra.adjointMatrix`, definitionally so, and inherits from it the orthonormality +of its rows. -/ @@ -75,23 +114,112 @@ lemma sum_su2AdjointMatrix_row_mul (U : specialUnitaryGroup (Fin 2) ℂ) (c d : /-! -## B. Bi-adjoint `su(2)` families and the span of their components +## A.2. Bi-adjoint `su(2)` families and the span of their components The transformation law carries one factor of `su2AdjointMatrix` per index, with the summed index in the row slot, exactly as `IsSU2BiFundamental` carries one factor of the -fundamental matrix per index. It is the `SU(2)` factor alone, and is the law obeyed by -the `W`-boson field strengths of `IsGaugeSector`. +fundamental matrix per index. It is recorded by `IsSU2BiAdjointMat`, a relation between +one element of `SU(2)` and one linear map on `B` in which no other factor of the gauge +group appears, and it is the law obeyed by the `W`-boson field strengths of +`IsGaugeSector`. + +`IsSU2BiAdjoint` then says that the gauge transformation `(1, U, 1)` obeys that law with +the matrix of `U`, for every `U` in `SU(2)`. Since `U ↦ (1, U, 1)` is a monoid +homomorphism this is an action of `SU(2)`, and it is all that is assumed: a gauge +transformation with a nontrivial colour or hypercharge factor is not mentioned, and may +move the components arbitrarily. So nothing here forces the colour and hypercharge +coordinates of a weight to vanish; section C gets that instead from `repSU2`, which sends +the colour and hypercharge generators to the identity outright. -/ +/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` + moves a tensor with two adjoint indices: one factor of `su2AdjointMatrix U` per index, + with the summed index in the row slot. -/ +def IsSU2BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 2) ℂ) (f : B →ₗ[ℂ] B) + (T : (Fin 2 → Fin 3) → B) : Prop := + ∀ l : Fin 2 → Fin 3, + f (T l) = ∑ a : Fin 2 → Fin 3, + (∏ i : Fin 2, ((su2AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) • T a + /-- A family `T` of elements of `B`, indexed by two `su(2)` adjoint indices, transforms - as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group. -/ + as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group: an + isospin transformation moves the components by the `SU(2)` element it is built from. + Nothing is asked of the colour or hypercharge factors. -/ structure IsSU2BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 3) → B) : Prop where - repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 3), - repGauge g (T l) = ∑ a : Fin 2 → Fin 3, - (∏ i : Fin 2, ((su2AdjointMatrix (GaugeGroupI.toSU2 g) (a i) (l i) : ℝ) : ℂ)) • T a + repGauge_T : ∀ g : specialUnitaryGroup (Fin 2) ℂ, + IsSU2BiAdjointMat g (repGauge (1, g, 1)) T + +/-! + +## A.3. The isospin part of a representation + +Reading a representation of the gauge group at the isospin factor of its argument alone +gives `repSU2`, again a representation of the whole gauge group. Every construction stated +for a representation of `GaugeGroupI` therefore applies to it verbatim, and a bi-adjoint +family for `repGauge` is a bi-adjoint family for `repSU2 repGauge`, with the same span and +the same trace contraction. Invariance under it is invariance under the isospin factor, +`∀ U : SU(2), repGauge (1, U, 1) x = x`, which is exactly what the transformation law +constrains. + +`repSU2` carries the weight bookkeeping of section C, which needs a representation of the +whole gauge group and is not available for `repGauge` itself, and it transports the +statements of section D that are proved for a representation of `GaugeGroupI`. The +statements themselves are written with the isospin transformation `(1, U, 1)` spelled out, +so that reading one needs no unfolding, and `repSU2_invariant_iff_su2` is the bridge +between the two spellings. + +-/ + +/-- The isospin part of a representation of the gauge group: the representation reading + only the `SU(2)` factor of its argument and sending the colour and hypercharge factors + to the identity. -/ +noncomputable def repSU2 {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) : Representation ℂ GaugeGroupI B where + toFun g := repGauge (1, GaugeGroupI.toSU2 g, 1) + map_one' := by + have h1 : ((1, GaugeGroupI.toSU2 1, 1) : GaugeGroupI) = 1 := by + simp [Prod.ext_iff] + rw [h1, map_one] + map_mul' g h := by + have hgh : ((1, GaugeGroupI.toSU2 (g * h), 1) : GaugeGroupI) + = ((1, GaugeGroupI.toSU2 g, 1) : GaugeGroupI) * (1, GaugeGroupI.toSU2 h, 1) := by + simp [map_mul] + rw [hgh, map_mul] + +/-- The isospin part of a representation acts by the representation itself, at the gauge + transformation with the same isospin factor and nothing else. -/ +lemma repSU2_apply {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (g : GaugeGroupI) : + repSU2 repGauge g = repGauge (1, GaugeGroupI.toSU2 g, 1) := rfl + +/-- The isospin part of a representation acts by algebra maps whenever the representation + does, each of its values being a value of that representation. -/ +lemma isMulRep_repSU2 {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} (hmul : IsMulRep repGauge) : + IsMulRep (repSU2 repGauge) := + fun g x y => hmul (1, GaugeGroupI.toSU2 g, 1) x y + +/-- Invariance under the isospin part of a representation is invariance under the gauge + transformations that are trivial on colour and hypercharge. The isospin part reads only + the isospin factor of its argument, and every element of `SU(2)` is the isospin factor + of such a transformation. -/ +lemma repSU2_invariant_iff_su2 {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (x : B) : + (∀ g : GaugeGroupI, repSU2 repGauge g x = x) + ↔ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x := + ⟨fun h U => h (1, U, 1), fun h g => h (GaugeGroupI.toSU2 g)⟩ + +/-- A submodule is stable under the isospin part of a representation precisely when it is + stable under the gauge transformations trivial on colour and hypercharge. -/ +lemma repSU2_stable_iff_su2 {B : Type*} [AddCommGroup B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) : + (∀ g : GaugeGroupI, ∀ y ∈ S, repSU2 repGauge g y ∈ S) + ↔ ∀ U : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, U, 1) y ∈ S := + ⟨fun h U => h (1, U, 1), fun h g => h (GaugeGroupI.toSU2 g)⟩ namespace IsSU2BiAdjoint set_option linter.unusedVariables false @@ -101,6 +229,14 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {T : (Fin 2 → Fin 3) → B} (hT : IsSU2BiAdjoint B repGauge T) +/-- A bi-adjoint family for a representation is a bi-adjoint family for its isospin part: + the transformation law reads only the isospin factor to begin with. The span and the + trace contraction do not mention the representation, so every statement of this file + transports along this and is read at the isospin factor alone. -/ +lemma toRepSU2 (hT : IsSU2BiAdjoint B repGauge T) : + IsSU2BiAdjoint B (repSU2 repGauge) T where + repGauge_T g := hT.repGauge_T g + /-- The span of all the components. -/ def span (hT : IsSU2BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d @@ -127,7 +263,7 @@ lemma mem_span_iff (x : B) : /-! -## C. The trace contraction +## B. The trace contraction -/ @@ -160,19 +296,22 @@ lemma traceContraction_mem_span (hT : IsSU2BiAdjoint B repGauge T) : exact sum_mem fun d _ => Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _) -/-- The trace contraction of a bi-adjoint family is gauge invariant. -/ -lemma repGauge_traceContraction (hT : IsSU2BiAdjoint B repGauge T) (g : GaugeGroupI) : - repGauge g hT.traceContraction = hT.traceContraction := by - have step : repGauge g hT.traceContraction +/-- The trace contraction of a bi-adjoint family is fixed by any linear map moving the + components by an `SU(2)` matrix: the rows of `su2AdjointMatrix` are orthonormal, so the + Kronecker delta contracting the two indices is carried to itself. -/ +lemma map_traceContraction (hT : IsSU2BiAdjoint B repGauge T) + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU2BiAdjointMat U f T) : + f hT.traceContraction = hT.traceContraction := by + have step : f hT.traceContraction = ∑ b : Fin 2 → Fin 3, (if b 0 = b 1 then (1 : ℂ) else 0) • T b := by - show repGauge g (∑ c : Fin 3, T ![c, c]) = _ + show f (∑ c : Fin 3, T ![c, c]) = _ rw [map_sum] - have h1 : ∀ c : Fin 3, repGauge g (T ![c, c]) + have h1 : ∀ c : Fin 3, f (T ![c, c]) = ∑ b : Fin 2 → Fin 3, - ((su2AdjointMatrix (GaugeGroupI.toSU2 g) (b 0) c * - su2AdjointMatrix (GaugeGroupI.toSU2 g) (b 1) c : ℝ) : ℂ) • T b := by + ((su2AdjointMatrix U (b 0) c * su2AdjointMatrix U (b 1) c : ℝ) : ℂ) • T b := by intro c - rw [hT.repGauge_T g ![c, c]] + rw [hf ![c, c]] refine Finset.sum_congr rfl fun b _ => ?_ congr 1 simp [Fin.prod_univ_two] @@ -185,11 +324,26 @@ lemma repGauge_traceContraction (hT : IsSU2BiAdjoint B repGauge T) (g : GaugeGro simp [apply_ite] rw [step, ← hT.traceContraction_eq_sum] +/-- The trace contraction of a bi-adjoint family is fixed by the isospin factor. That is + all the transformation law constrains: the colour and hypercharge factors are free to + move the trace contraction, and in general they do. -/ +lemma repGauge_traceContraction (hT : IsSU2BiAdjoint B repGauge T) + (U : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, U, 1) hT.traceContraction = hT.traceContraction := + hT.map_traceContraction (hT.repGauge_T U) + +/-- The trace contraction is fixed by the isospin factor, under the name spelling out + which factor is meant. This is `repGauge_traceContraction`. -/ +lemma repGauge_su2_traceContraction (hT : IsSU2BiAdjoint B repGauge T) + (U : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, U, 1) hT.traceContraction = hT.traceContraction := + hT.repGauge_traceContraction U + end IsSU2BiAdjoint /-! -## D. The gauge weight decomposition of the span +## C. The gauge weight decomposition of the span The Pauli basis vectors are not eigenvectors of the gauge torus, so the components `T d` do not carry a definite gauge weight. The eigenvectors appear only after passing to the @@ -206,6 +360,14 @@ With two adjoint indices a weight vector is a product of two of these, contracte such products, they span the same subspace as the components, and joining their lines one weight at a time gives `gaugeWeightDecomposition`. +That decomposition is for `repSU2 repGauge`, not for `repGauge`. A decomposition must say +how all four torus generators act, and of the four only `gaugeTorusGen 2` is an isospin +transformation, so the transformation law says nothing about the other three. The isospin +part sends them to the identity, so it fixes every weight vector there and their colour +and hypercharge coordinates vanish for that reason. This is why +`gaugeWeightDecomposition_supp` still lists only the five weights of the tensor square of +the `su(2)` adjoint, all of them of the form `(0, 0, k, 0)`. + The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra and records multiplicativity of the representation, neither of which `IsSU2BiAdjoint` needs, so both appear as extra arguments here. @@ -218,7 +380,7 @@ set_option linter.unusedVariables false /-! -## D.1. The weight basis of the `su(2)` adjoint +## C.1. The weight basis of the `su(2)` adjoint -/ @@ -253,7 +415,7 @@ lemma eq_rootPair_or_cartanId (a : Fin 3) : /-! -## D.2. The `SU(2)` adjoint matrix of a torus generator in the weight basis +## C.2. The `SU(2)` adjoint matrix of a torus generator in the weight basis -/ @@ -327,7 +489,7 @@ lemma su2AdjointMatrix_cartanId (i : Fin 4) (a : Fin 3) : /-! -## D.3. The weight vectors of one adjoint index +## C.3. The weight vectors of one adjoint index -/ @@ -350,10 +512,11 @@ def wtWeight : WeightIdx → GaugeWeight /-- The coordinate vector of a single Pauli direction. -/ def unitVec (a : Fin 3) : Fin 3 → ℂ := fun x => if x = a then 1 else 0 -/-- The action of a gauge transformation on the coordinates of one `su(2)` adjoint +/-- The action of an element of `SU(2)` on the coordinates of one `su(2)` adjoint index. -/ -noncomputable def rowAct (g : GaugeGroupI) (c : Fin 3 → ℂ) : Fin 3 → ℂ := fun a => - ∑ x : Fin 3, ((su2AdjointMatrix (GaugeGroupI.toSU2 g) a x : ℝ) : ℂ) * c x +noncomputable def rowAct (U : specialUnitaryGroup (Fin 2) ℂ) (c : Fin 3 → ℂ) : + Fin 3 → ℂ := fun a => + ∑ x : Fin 3, ((su2AdjointMatrix U a x : ℝ) : ℂ) * c x /-- Collapsing a sum against the two Kronecker deltas of the root pair. -/ lemma sum_mul_pair (f : Fin 3 → ℂ) (b₁ b₂ : Fin 3) (s : ℂ) : @@ -389,7 +552,7 @@ lemma pair_sub_eq (z u v : ℂ) : /-- Each weight vector of the `su(2)` adjoint is an eigenvector of every torus generator, at the character of its weight. -/ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : - rowAct (gaugeTorusGen i) (wtCoeff k) + rowAct (GaugeGroupI.toSU2 (gaugeTorusGen i)) (wtCoeff k) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k) i) • wtCoeff k := by funext a match k with @@ -429,7 +592,7 @@ lemma rowAct_wtCoeff (i : Fin 4) (k : WeightIdx) : /-! -## D.4. The bi-adjoint weight vectors and their span +## C.4. The bi-adjoint weight vectors and their span -/ @@ -477,22 +640,31 @@ lemma biVec_sub_right (c₀ c₁ c₁' : Fin 3 → ℂ) : hT.biVec c₀ (c₁ - c₁') = hT.biVec c₀ c₁ - hT.biVec c₀ c₁' := by simp only [biVec, Pi.sub_apply, mul_sub, sub_smul, Finset.sum_sub_distrib] +/-- Negating both coordinate vectors leaves the contraction unchanged: the two signs + cancel against each other. -/ +lemma biVec_neg_neg (c₀ c₁ : Fin 3 → ℂ) : hT.biVec (-c₀) (-c₁) = hT.biVec c₀ c₁ := by + simp only [biVec, Pi.neg_apply, neg_mul_neg] + /-- Contracting against two single Pauli directions returns a component of `T`. -/ lemma biVec_unitVec (a b : Fin 3) : hT.biVec (unitVec a) (unitVec b) = T ![a, b] := by rw [biVec, sum_pi_two] simp [unitVec, ite_smul] -/-- Every bi-adjoint weight vector transforms by the product of the two characters. -/ -lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 3 → ℂ) : - repGauge g (hT.biVec c₀ c₁) = hT.biVec (rowAct g c₀) (rowAct g c₁) := by - have step : ∀ d : Fin 2 → Fin 3, repGauge g ((c₀ (d 0) * c₁ (d 1)) • T d) +/-- A map moving the components by an `SU(2)` matrix moves a contraction against a pair + of coordinate vectors by the row action of that matrix on each of them. This is the + whole content of the transformation law in coordinate form, and it mentions no other + factor of the gauge group. -/ +lemma map_biVec (hT : IsSU2BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 2) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU2BiAdjointMat U f T) (c₀ c₁ : Fin 3 → ℂ) : + f (hT.biVec c₀ c₁) = hT.biVec (rowAct U c₀) (rowAct U c₁) := by + have step : ∀ d : Fin 2 → Fin 3, f ((c₀ (d 0) * c₁ (d 1)) • T d) = ∑ a : Fin 2 → Fin 3, ((c₀ (d 0) * c₁ (d 1)) * - (((su2AdjointMatrix (GaugeGroupI.toSU2 g) (a 0) (d 0) : ℝ) : ℂ) * - ((su2AdjointMatrix (GaugeGroupI.toSU2 g) (a 1) (d 1) : ℝ) : ℂ))) + (((su2AdjointMatrix U (a 0) (d 0) : ℝ) : ℂ) * + ((su2AdjointMatrix U (a 1) (d 1) : ℝ) : ℂ))) • T a := by intro d - rw [map_smul, hT.repGauge_T g d, Finset.smul_sum] + rw [map_smul, hf d, Finset.smul_sum] refine Finset.sum_congr rfl fun a _ => ?_ rw [smul_smul, Fin.prod_univ_two] simp only [biVec, rowAct] @@ -507,13 +679,31 @@ lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 3 → ℂ) : rw [Finset.sum_mul_sum] exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by ring -/-- The bi-adjoint weight vectors are simultaneous eigenvectors of the gauge torus, - at the character of the sum of the two individual weights. -/ -lemma repGauge_biVec_wtCoeff (k₀ k₁ : WeightIdx) (i : Fin 4) : - repGauge (gaugeTorusGen i) (hT.biVec (wtCoeff k₀) (wtCoeff k₁)) +/-- An isospin transformation moves a contraction against a pair of coordinate vectors + by the row action of its `SU(2)` element. -/ +lemma repGauge_su2_biVec (U : specialUnitaryGroup (Fin 2) ℂ) (c₀ c₁ : Fin 3 → ℂ) : + repGauge (1, U, 1) (hT.biVec c₀ c₁) = hT.biVec (rowAct U c₀) (rowAct U c₁) := + hT.map_biVec (hT.repGauge_T U) c₀ c₁ + +/-- The isospin part of the representation moves a contraction against a pair of + coordinate vectors by the row action of the `SU(2)` factor of its argument. Unlike the + representation itself, the isospin part is constrained at every gauge transformation, + which is what lets the weight decomposition be built for it. -/ +lemma repSU2_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 3 → ℂ) : + repSU2 repGauge g (hT.biVec c₀ c₁) + = hT.biVec (rowAct (GaugeGroupI.toSU2 g) c₀) (rowAct (GaugeGroupI.toSU2 g) c₁) := + hT.repGauge_su2_biVec (GaugeGroupI.toSU2 g) c₀ c₁ + +/-- The bi-adjoint weight vectors are simultaneous eigenvectors of the gauge torus in the + isospin part of the representation, at the character of the sum of the two individual + weights. The colour and hypercharge generators have trivial isospin factor, so the + isospin part fixes every weight vector at those, matching the vanishing colour and + hypercharge coordinates of the weights. -/ +lemma repSU2_biVec_wtCoeff (k₀ k₁ : WeightIdx) (i : Fin 4) : + repSU2 repGauge (gaugeTorusGen i) (hT.biVec (wtCoeff k₀) (wtCoeff k₁)) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k₀ + wtWeight k₁) i) • hT.biVec (wtCoeff k₀) (wtCoeff k₁) := by - rw [hT.repGauge_biVec, rowAct_wtCoeff, rowAct_wtCoeff, hT.biVec_smul_left, + rw [hT.repSU2_biVec, rowAct_wtCoeff, rowAct_wtCoeff, hT.biVec_smul_left, hT.biVec_smul_right, smul_smul, GaugeWeight.coord_add, zpow_add₀ expI_ne_zero] @@ -588,21 +778,27 @@ lemma span_eq_wtSpan : hT.span = hT.wtSpan := by /-! -## D.5. The decomposition +## C.5. The decomposition -/ -/-- The gauge weight decomposition of the span of a bi-adjoint `su(2)` family. The - span is the join of the lines through the nine products of weight vectors, and each of - those carries the sum of the two weights. -/ +/-- The gauge weight decomposition of the span of a bi-adjoint `su(2)` family, for the + isospin part of the representation. The span is the join of the lines through the nine + products of weight vectors, and each of those carries the sum of the two weights. + + The decomposition is for `repSU2 repGauge` and not for `repGauge` itself because a + decomposition must know how all four torus generators act, and the transformation law + constrains only the isospin factor: of the four generators only `gaugeTorusGen 2` is an + isospin transformation. The isospin part sends the other three to the identity, so their + weights vanish by construction. -/ @[implicit_reducible] noncomputable def gaugeWeightDecomposition (hT : IsSU2BiAdjoint B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition (repSU2 repGauge) hT.span := GaugeWeightDecomposition.copy - (GaugeWeightDecomposition.iSup hmul fun k : WeightIdx × WeightIdx => - GaugeWeightDecomposition.spanSingleton hmul + (GaugeWeightDecomposition.iSup (isMulRep_repSU2 hmul) fun k : WeightIdx × WeightIdx => + GaugeWeightDecomposition.spanSingleton (isMulRep_repSU2 hmul) (hT.biVec (wtCoeff k.1) (wtCoeff k.2)) (wtWeight k.1 + wtWeight k.2) - (hT.repGauge_biVec_wtCoeff k.1 k.2)) + (hT.repSU2_biVec_wtCoeff k.1 k.2)) _ hT.span_eq_wtSpan /-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through @@ -621,7 +817,8 @@ lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : /-- The gauge weights carried by a bi-adjoint `su(2)` family: the five weights of the tensor square of the `su(2)` adjoint. Every one of them has vanishing colour and - hypercharge, since the family carries weak isospin only. -/ + hypercharge, the isospin part of the representation sending the colour and hypercharge + generators to the identity. -/ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : (hT.gaugeWeightDecomposition hmul).supp = {((0, 0, 0, 0) : GaugeWeight), (0, 0, 4, 0), (0, 0, 2, 0), (0, 0, -2, 0), @@ -629,18 +826,701 @@ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : rw [hT.gaugeWeightDecomposition_supp_eq hmul] decide -/-- The trace contraction lies in the zero-weight piece. It is gauge invariant, so in - particular the torus fixes it. -/ +/-! + +## C.6. The zero-weight piece + +An isospin invariant built from `T` is fixed by the isospin part of the representation at +the torus, so it lies in the zero-weight piece, which makes that piece worth describing +explicitly. A product of two weight vectors +has weight zero exactly when the two weights cancel: the root against its negative, in +either order, or the Cartan direction against itself. That is three lines, the +multiplicity of the zero weight in the tensor square of the `su(2)` adjoint. + +-/ + +/-- Two `su(2)` adjoint weight vectors have cancelling weights precisely when they are the + root and its negative, in either order, or the Cartan direction twice. -/ +lemma wtWeight_add_eq_zero_iff (k : WeightIdx × WeightIdx) : + wtWeight k.1 + wtWeight k.2 = 0 + ↔ k = (Sum.inl 0, Sum.inr (Sum.inl 0)) ∨ k = (Sum.inr (Sum.inl 0), Sum.inl 0) + ∨ k = (Sum.inr (Sum.inr 0), Sum.inr (Sum.inr 0)) := by + revert k + decide + +/-- The line through a product of two weight vectors whose weights cancel lies in the + zero-weight piece. -/ +lemma span_biVec_le_piece_zero (hmul : IsMulRep repGauge) {k₀ k₁ : WeightIdx} + (h : wtWeight k₀ + wtWeight k₁ = 0) : + ℂ ∙ hT.biVec (wtCoeff k₀) (wtCoeff k₁) + ≤ (hT.gaugeWeightDecomposition hmul).piece 0 := by + rw [hT.gaugeWeightDecomposition_piece hmul] + exact le_iSup_of_le (k₀, k₁) (le_of_eq (if_pos h.symm).symm) + +/-- The raising vector paired with the lowering vector. -/ +noncomputable def posNegProd (hT : IsSU2BiAdjoint B repGauge T) : B := + hT.biVec (wtCoeff (Sum.inl 0)) (wtCoeff (Sum.inr (Sum.inl 0))) + +/-- The lowering vector paired with the raising vector. -/ +noncomputable def negPosProd (hT : IsSU2BiAdjoint B repGauge T) : B := + hT.biVec (wtCoeff (Sum.inr (Sum.inl 0))) (wtCoeff (Sum.inl 0)) + +/-- The Cartan direction paired with itself. -/ +noncomputable def cartanProd (hT : IsSU2BiAdjoint B repGauge T) : B := + hT.biVec (wtCoeff (Sum.inr (Sum.inr 0))) (wtCoeff (Sum.inr (Sum.inr 0))) + +/-- The zero-weight piece of the gauge weight decomposition, explicitly: the join of the + three lines through the products of two weight vectors of opposite weight. -/ +lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : + (hT.gaugeWeightDecomposition hmul).piece 0 + = ℂ ∙ hT.posNegProd ⊔ ℂ ∙ hT.negPosProd ⊔ ℂ ∙ hT.cartanProd := by + refine le_antisymm ?_ (sup_le (sup_le ?_ ?_) ?_) + · rw [hT.gaugeWeightDecomposition_piece hmul] + refine iSup_le fun k => ?_ + split_ifs with hk + · rcases (wtWeight_add_eq_zero_iff k).1 hk.symm with rfl | rfl | rfl + · exact le_sup_of_le_left (le_sup_of_le_left le_rfl) + · exact le_sup_of_le_left (le_sup_of_le_right le_rfl) + · exact le_sup_of_le_right le_rfl + · exact bot_le + · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) + · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) + · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) + +/-- The weight vector of the positive root, in terms of the two Pauli coordinate + directions of the root pair. -/ +lemma wtCoeff_inl : + wtCoeff (Sum.inl 0) = unitVec rootPair.1 + Complex.I • unitVec rootPair.2 := by + funext x + simp [wtCoeff, unitVec] + +/-- The weight vector of the negative root, in terms of the two Pauli coordinate + directions of the root pair. -/ +lemma wtCoeff_inr_inl : + wtCoeff (Sum.inr (Sum.inl 0)) + = unitVec rootPair.1 - Complex.I • unitVec rootPair.2 := by + funext x + simp [wtCoeff, unitVec] + +/-- The raising-lowering product, written out in the components of `T`. -/ +lemma posNegProd_eq : + hT.posNegProd + = T ![0, 0] + T ![1, 1] + Complex.I • (T ![1, 0] - T ![0, 1]) := by + rw [posNegProd, wtCoeff_inl, wtCoeff_inr_inl, hT.biVec_add_left, hT.biVec_smul_left, + hT.biVec_sub_right, hT.biVec_sub_right, hT.biVec_smul_right, hT.biVec_smul_right, + hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, smul_sub, + smul_smul, Complex.I_mul_I, neg_one_smul, smul_sub] + simp only [rootPair] + abel + +/-- The lowering-raising product, written out in the components of `T`. -/ +lemma negPosProd_eq : + hT.negPosProd + = T ![0, 0] + T ![1, 1] + Complex.I • (T ![0, 1] - T ![1, 0]) := by + rw [negPosProd, wtCoeff_inl, wtCoeff_inr_inl, hT.biVec_sub_left, hT.biVec_smul_left, + hT.biVec_add_right, hT.biVec_add_right, hT.biVec_smul_right, hT.biVec_smul_right, + hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, hT.biVec_unitVec, smul_add, + smul_smul, Complex.I_mul_I, neg_one_smul, smul_sub] + simp only [rootPair] + abel + +/-- The two orders of the root product add to twice the pair of diagonal components of + the root pair, the imaginary parts cancelling. -/ +lemma posNegProd_add_negPosProd : + hT.posNegProd + hT.negPosProd = (2 : ℂ) • (T ![0, 0] + T ![1, 1]) := by + rw [hT.posNegProd_eq, hT.negPosProd_eq] + module + +/-- The Cartan product is a single component of `T`: the Cartan direction is already a + Pauli coordinate direction. -/ +lemma cartanProd_eq : hT.cartanProd = T ![2, 2] := by + rw [cartanProd, ← unitVec_cartanId, hT.biVec_unitVec] + +/-- The trace contraction lies in the zero-weight piece. The isospin factor fixes it, so + in particular the isospin part of the representation fixes it at the torus. -/ lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : hT.traceContraction ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := GaugeWeightDecomposition.mem_zero_of_invariant _ hT.traceContraction_mem_span - hT.repGauge_traceContraction + ((repSU2_invariant_iff_su2 repGauge _).2 hT.repGauge_traceContraction) -end Decomposition +/-! + +## D. The isospin invariants in the span + +The gauge weight decomposition sees only the torus, and the zero-weight piece it leaves is +three lines wide. Two further elements of `SU(2)` cut that down to one. The Weyl element +is the half turn about the Cartan axis; it exchanges the two orders of the root product +and so leaves two lines. A third of a turn about the diagonal axis of the three Pauli +directions is not in the normaliser of the torus at all, and it cuts the remaining two +lines to the single line through the trace contraction. Everything used is an isospin +transformation, so what is classified is the invariants of the isospin factor; the +statements about gauge invariance are the corollaries got by restricting a gauge invariant +to those transformations, and where they read the other way they carry the invariance of +the trace contraction as a hypothesis. D.3 states the classification under the hypotheses +the decomposition machinery needs, an algebra structure on `B` and a multiplicative +representation. D.4 removes both by reading the classification in the trivial square-zero +extension of a module, and D.5 pushes it down a quotient by a stable submodule, +classifying the invariants of the span joined with that submodule. + +## D.1. The Weyl reflection on the zero-weight products + +The `SU(2)` Weyl element `su2Perm` acts on the Pauli directions as the half turn about the +Cartan axis, negating the two members of the root pair and the Cartan direction itself. +On the weight vectors it therefore exchanges the root with its negative, up to a sign that +cancels between the two indices of a product. So it exchanges the two orders of the root +product and fixes the Cartan product, and an isospin invariant in the zero-weight piece is +a combination of the sum of the two orders and the Cartan product alone. + +-/ + +/-- The row action on a Pauli coordinate direction is a column of the adjoint matrix. -/ +lemma rowAct_unitVec (U : specialUnitaryGroup (Fin 2) ℂ) (b a : Fin 3) : + rowAct U (unitVec b) a = ((su2AdjointMatrix U a b : ℝ) : ℂ) := by + simp only [rowAct, unitVec, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', + Finset.mem_univ, if_true] + +/-- The conjugate transpose of the `SU(2)` Weyl element. -/ +lemma star_su2Perm_coe : + star (su2Perm : specialUnitaryGroup (Fin 2) ℂ).1 = !![0, 1; -1, 0] := by + rw [su2Perm_coe] + ext a b + fin_cases a <;> fin_cases b <;> simp + +/-- The adjoint matrix of the `SU(2)` Weyl element: the half turn about the Cartan axis, + which fixes the second member of the root pair and negates the other two Pauli + directions. -/ +lemma su2AdjointMatrix_su2Perm : + su2AdjointMatrix su2Perm = !![-1, 0, 0; 0, 1, 0; 0, 0, -1] := by + ext a b + rw [su2AdjointMatrix_apply, star_su2Perm_coe, su2Perm_coe] + fin_cases a <;> fin_cases b <;> + simp only [pauliMatrix, Matrix.trace_fin_two, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply] <;> + norm_num + +/-- The exchange of the root with its negative on the weight indices, the Cartan + direction being fixed. -/ +def weylSwap : WeightIdx → WeightIdx + | Sum.inl _ => Sum.inr (Sum.inl 0) + | Sum.inr (Sum.inl _) => Sum.inl 0 + | Sum.inr (Sum.inr _) => Sum.inr (Sum.inr 0) + +/-- The Weyl element negates every weight vector of the `su(2)` adjoint, after exchanging + the root with its negative. -/ +lemma rowAct_su2Perm_wtCoeff (k : WeightIdx) : + rowAct su2Perm (wtCoeff k) = -wtCoeff (weylSwap k) := by + funext a + have hrow : rowAct su2Perm (wtCoeff k) a + = ∑ x : Fin 3, ((su2AdjointMatrix su2Perm a x : ℝ) : ℂ) * wtCoeff k x := rfl + rw [hrow, Fin.sum_univ_three, su2AdjointMatrix_su2Perm] + match k with + | Sum.inl _ => fin_cases a <;> simp [wtCoeff, weylSwap, rootPair] + | Sum.inr (Sum.inl _) => fin_cases a <;> simp [wtCoeff, weylSwap, rootPair] + | Sum.inr (Sum.inr _) => fin_cases a <;> + simp [wtCoeff, weylSwap, GaugeAlgebra.su2CartanId] + +/-- The Weyl element carries a product of two weight vectors to the product of the + exchanged pair: the sign it puts on each of the two vectors cancels against the + other. -/ +lemma map_su2Perm_biVec_wtCoeff (hT : IsSU2BiAdjoint B repGauge T) {f : B →ₗ[ℂ] B} + (hf : IsSU2BiAdjointMat su2Perm f T) (k₀ k₁ : WeightIdx) : + f (hT.biVec (wtCoeff k₀) (wtCoeff k₁)) + = hT.biVec (wtCoeff (weylSwap k₀)) (wtCoeff (weylSwap k₁)) := by + rw [hT.map_biVec hf, rowAct_su2Perm_wtCoeff, rowAct_su2Perm_wtCoeff, hT.biVec_neg_neg] + +/-- The Weyl element exchanges the two orders of the root product. -/ +lemma repGauge_su2Perm_posNegProd : + repGauge (1, su2Perm, 1) hT.posNegProd = hT.negPosProd := + hT.map_su2Perm_biVec_wtCoeff (hT.repGauge_T su2Perm) (Sum.inl 0) + (Sum.inr (Sum.inl 0)) + +/-- The Weyl element exchanges the two orders of the root product, the other way. -/ +lemma repGauge_su2Perm_negPosProd : + repGauge (1, su2Perm, 1) hT.negPosProd = hT.posNegProd := + hT.map_su2Perm_biVec_wtCoeff (hT.repGauge_T su2Perm) (Sum.inr (Sum.inl 0)) + (Sum.inl 0) + +/-- The Weyl element fixes the Cartan product, negating the Cartan direction twice. -/ +lemma repGauge_su2Perm_cartanProd : + repGauge (1, su2Perm, 1) hT.cartanProd = hT.cartanProd := + hT.map_su2Perm_biVec_wtCoeff (hT.repGauge_T su2Perm) (Sum.inr (Sum.inr 0)) + (Sum.inr (Sum.inr 0)) + +/-- An isospin invariant in the zero-weight piece is a combination of the pair of + diagonal components of the root pair and the diagonal Cartan component. The Weyl element + exchanges the two orders of the root product, so only their sum survives, and that sum + is twice the pair of diagonal components. -/ +lemma exists_eq_of_mem_piece_zero (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ (hT.gaugeWeightDecomposition hmul).piece 0) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : + ∃ f e : ℂ, x = f • (T ![0, 0] + T ![1, 1]) + e • T ![2, 2] := by + rw [hT.gaugeWeightDecomposition_piece_zero hmul] at hx + obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx + obtain ⟨y, hy, w, hw, rfl⟩ := Submodule.mem_sup.1 hu + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + obtain ⟨b, rfl⟩ := Submodule.mem_span_singleton.1 hw + obtain ⟨e, rfl⟩ := Submodule.mem_span_singleton.1 hz + have hkey := hinv su2Perm + rw [map_add, map_add, map_smul, map_smul, map_smul, + hT.repGauge_su2Perm_posNegProd, hT.repGauge_su2Perm_negPosProd, + hT.repGauge_su2Perm_cartanProd] at hkey + refine ⟨a + b, e, ?_⟩ + linear_combination (norm := module) (-1 / 2 : ℂ) • hkey + + ((a + b) / 2 : ℂ) • hT.posNegProd_add_negPosProd + e • hT.cartanProd_eq + +/-! + +## D.2. A third of a turn about the diagonal axis + +The gauge weight and the Weyl reflection are both read off the normaliser of the gauge +torus, and between them they leave two lines: the pair of diagonal components of the root +pair and the diagonal Cartan component. Nothing in the normaliser separates those, because +the normaliser preserves the Cartan axis, and the two lines differ precisely in how much +of each lies along it. + +The element `su2Cyc` leaves the normaliser behind. Its adjoint action is a third of a turn +about the diagonal axis of the three Pauli directions, which cycles them, carrying the +Cartan direction to a root direction. Applied to an invariant it ties the three diagonal +components of `T` to each other, and that cuts the two lines down to the one through the +trace contraction. -TODO (lines := 638-639) "Fill in the rest of this file, using - IsSU3BiAdjoint.lean as a template. We should finish with a similar result - at the end." +-/ + +/-- The `SU(2)` element `(1 + i(σ₁ + σ₂ + σ₃))/2`. A third of a turn about the diagonal + axis of the three Pauli directions, it lies outside the normaliser of the gauge torus: + it carries the Cartan direction to a root direction, which no element of the normaliser + does. -/ +noncomputable def su2Cyc : specialUnitaryGroup (Fin 2) ℂ := + ⟨!![(1 + Complex.I) / 2, (1 + Complex.I) / 2; + (-1 + Complex.I) / 2, (1 - Complex.I) / 2], by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + ext a b + fin_cases a <;> fin_cases b <;> + simp [Matrix.mul_apply, Fin.sum_univ_two, star_eq_conjTranspose, + Matrix.conjTranspose_apply, map_div₀, Complex.conj_I, map_ofNat] <;> + ring_nf <;> + simp [Complex.I_sq] <;> + ring + · simp [Matrix.det_fin_two, Complex.ext_iff] + norm_num⟩ + +/-- The underlying matrix of the third of a turn. -/ +lemma su2Cyc_coe : + (su2Cyc : specialUnitaryGroup (Fin 2) ℂ).1 + = !![(1 + Complex.I) / 2, (1 + Complex.I) / 2; + (-1 + Complex.I) / 2, (1 - Complex.I) / 2] := rfl + +/-- The conjugate transpose of the third of a turn. -/ +lemma star_su2Cyc_coe : + star (su2Cyc : specialUnitaryGroup (Fin 2) ℂ).1 + = !![(1 - Complex.I) / 2, (-1 - Complex.I) / 2; + (1 - Complex.I) / 2, (1 + Complex.I) / 2] := by + rw [su2Cyc_coe] + ext a b + fin_cases a <;> fin_cases b <;> simp <;> ring + +/-- The adjoint matrix of the third of a turn: the cyclic permutation of the three Pauli + directions. -/ +lemma su2AdjointMatrix_su2Cyc : + su2AdjointMatrix su2Cyc = !![0, 1, 0; 0, 0, 1; 1, 0, 0] := by + ext a b + rw [su2AdjointMatrix_apply, star_su2Cyc_coe, su2Cyc_coe] + fin_cases a <;> fin_cases b <;> + simp only [pauliMatrix, Matrix.trace_fin_two, Matrix.mul_apply, Fin.sum_univ_two, + Matrix.cons_val', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply] <;> + norm_num [Complex.ext_iff] + +/-- The third of a turn as a gauge transformation: trivial on colour and hypercharge. -/ +noncomputable def gaugeSU2Cyc : GaugeGroupI := ⟨1, su2Cyc, 1⟩ + +/-- The isospin factor of the third of a turn read as a gauge transformation is the third + of a turn itself. -/ +lemma toSU2_gaugeSU2Cyc : GaugeGroupI.toSU2 gaugeSU2Cyc = su2Cyc := rfl + +/-- The cycle of Pauli indices induced by the third of a turn. -/ +def cycIdx : Fin 3 → Fin 3 + | 0 => 2 + | 1 => 0 + | 2 => 1 + +/-- The third of a turn carries each Pauli coordinate direction to the next one in the + cycle. -/ +lemma rowAct_su2Cyc_unitVec (b : Fin 3) : + rowAct su2Cyc (unitVec b) = unitVec (cycIdx b) := by + funext a + rw [rowAct_unitVec, su2AdjointMatrix_su2Cyc] + fin_cases b <;> fin_cases a <;> simp [cycIdx, unitVec] + +/-- A map moving the components by the third of a turn cycles the diagonal components of + `T`. -/ +lemma map_su2Cyc_diag (hT : IsSU2BiAdjoint B repGauge T) {f : B →ₗ[ℂ] B} + (hf : IsSU2BiAdjointMat su2Cyc f T) (b : Fin 3) : + f (T ![b, b]) = T ![cycIdx b, cycIdx b] := by + rw [← hT.biVec_unitVec b b, hT.map_biVec hf, rowAct_su2Cyc_unitVec, + hT.biVec_unitVec] + +/-- The third of a turn cycles the diagonal components of `T`. -/ +lemma repGauge_su2Cyc_diag (hT : IsSU2BiAdjoint B repGauge T) (b : Fin 3) : + repGauge (1, su2Cyc, 1) (T ![b, b]) = T ![cycIdx b, cycIdx b] := + hT.map_su2Cyc_diag (hT.repGauge_T su2Cyc) b + +/-! + +## D.3. The classification + +An isospin invariant in the span is fixed by the isospin part of the representation at the +torus, so it lies in the zero-weight piece, and the Weyl element then writes it as a +combination of the pair of diagonal components of the root pair and the diagonal Cartan +component. The third of a turn forces the three diagonal components to enter that +combination on the same footing, which leaves the single line through the trace +contraction: the one singlet of `3 ⊗ 3`. + +`mem_span_and_su2_invariant_iff` is the classification proper. Its gauge counterpart +`mem_span_and_invariant_iff` needs the trace contraction to be gauge invariant, and takes +that as a hypothesis: the transformation law leaves the colour and hypercharge factors +free, so they may scale the trace contraction, and then the multiples of it are not gauge +invariants at all. The same hypothesis is what `su2_invariant_iff_invariant` needs to +upgrade isospin invariance in the span to gauge invariance; without it that statement is +false. + +-/ + +/-- Every isospin invariant in the span of the components is a multiple of the trace + contraction. The gauge weight and the Weyl element cut the span down to the two lines + through the pair of root diagonal components and the Cartan one, and the third of a turn + cuts those two down to one. Only the isospin factor is used, which is all the + transformation law constrains. -/ +lemma exists_smul_traceContraction_of_su2_invariant (hT : IsSU2BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : + ∃ c : ℂ, x = c • hT.traceContraction := by + obtain ⟨f, e, rfl⟩ := hT.exists_eq_of_mem_piece_zero hmul + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx + ((repSU2_invariant_iff_su2 repGauge x).2 hinv)) hinv + have hc0 : repGauge (1, su2Cyc, 1) (T ![0, 0]) = T ![2, 2] := + hT.repGauge_su2Cyc_diag 0 + have hc1 : repGauge (1, su2Cyc, 1) (T ![1, 1]) = T ![0, 0] := + hT.repGauge_su2Cyc_diag 1 + have hc2 : repGauge (1, su2Cyc, 1) (T ![2, 2]) = T ![1, 1] := + hT.repGauge_su2Cyc_diag 2 + have hcyc := hinv su2Cyc + rw [map_add, map_smul, map_smul, map_add, hc0, hc1, hc2] at hcyc + have h1 : (f - e) • (T ![2, 2] - T ![1, 1]) = 0 := by + linear_combination (norm := module) hcyc + have h2 : (f - e) • (T ![1, 1] - T ![0, 0]) = 0 := by + have h := congrArg (repGauge (1, su2Cyc, 1)) h1 + rwa [map_smul, map_sub, hc2, hc1, map_zero] at h + refine ⟨(2 * f + e) / 3, ?_⟩ + rw [traceContraction, Fin.sum_univ_three] + linear_combination (norm := module) (-2 / 3 : ℂ) • h1 + (-1 / 3 : ℂ) • h2 + +/-- Every gauge invariant in the span of the components is a multiple of the trace + contraction. A gauge invariant is in particular fixed by the transformations trivial on + colour and hypercharge, and those alone already force the conclusion. -/ +lemma exists_smul_traceContraction_of_invariant (hT : IsSU2BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, x = c • hT.traceContraction := + hT.exists_smul_traceContraction_of_su2_invariant hmul hx fun U => hinv (1, U, 1) + +/-- The isospin invariants in the span of the components are exactly the multiples of the + trace contraction. The gauge weight, the Weyl element and the third of a turn bound them + from above, and the trace contraction is itself isospin invariant and in the span, which + bounds them from below. This is the one singlet of `3 ⊗ 3`. -/ +lemma mem_span_and_su2_invariant_iff (hT : IsSU2BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) (x : B) : + (x ∈ hT.span ∧ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) + ↔ x ∈ ℂ ∙ hT.traceContraction := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_su2_invariant hmul h.1 h.2 + exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ + · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx + exact ⟨Submodule.smul_mem _ _ hT.traceContraction_mem_span, + fun U => by rw [map_smul, hT.repGauge_traceContraction]⟩ + +/-- The gauge invariants in the span of the components are exactly the multiples of the + trace contraction, once the trace contraction is known to be gauge invariant. That + hypothesis cannot be dropped: the transformation law says nothing about the colour and + hypercharge factors, so they may well move the trace contraction, and then the + right-hand side has invariants that the left-hand side has not. Where the two factors do + fix it, as they do for the `W`-boson field strengths, the hypothesis is supplied from + the transformation law of the underlying field. -/ +lemma mem_span_and_invariant_iff (hT : IsSU2BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) (x : B) + (htc : ∀ g : GaugeGroupI, repGauge g hT.traceContraction = hT.traceContraction) : + (x ∈ hT.span ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ x ∈ ℂ ∙ hT.traceContraction := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_invariant hmul h.1 h.2 + exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ + · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx + exact ⟨Submodule.smul_mem _ _ hT.traceContraction_mem_span, + fun g => by rw [map_smul, htc]⟩ + +/-- Inside the span of the components the two notions of invariance agree, provided the + trace contraction is gauge invariant: a vector fixed by the isospin factor is then fixed + by the whole gauge group. One direction is free, an isospin transformation being a gauge + transformation; the other is the classification, the isospin invariants being multiples + of the trace contraction. The hypothesis `htc` is exactly what the transformation law no + longer supplies, and without it the statement is false, the colour and hypercharge + factors being unconstrained. -/ +lemma su2_invariant_iff_invariant (hT : IsSU2BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) + (htc : ∀ g : GaugeGroupI, repGauge g hT.traceContraction = hT.traceContraction) + {x : B} (hx : x ∈ hT.span) : + (∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) + ↔ ∀ g : GaugeGroupI, repGauge g x = x := by + refine ⟨fun h g => ?_, fun h U => h (1, U, 1)⟩ + obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_su2_invariant hmul hx h + rw [map_smul, htc] + +/-! + +## D.4. The trivial square-zero extension of a module + +Section D.3 asks for a ring: `IsMulRep` is a statement about multiplication, and the +decomposition machinery of section C is set up in an algebra. The conclusion asks for none +of that, and the gap can be closed once and for all. The trivial square-zero extension +`TrivSqZeroExt ℂ M` of a module `M` is a commutative `ℂ`-algebra built from the module +structure alone, a representation on `M` extends to it by acting trivially on the scalar +part, and that extension acts by algebra maps for free. So D.3 holds in the extension, and +the injection of `M` carries the conclusion back: +`exists_smul_traceContraction_of_su2_invariant_module` and its gauge corollary +`exists_smul_traceContraction_of_invariant_module` are D.3 with the algebra structure and +the multiplicativity hypothesis both removed. + +-/ + +section SquareZero + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {U : (Fin 2 → Fin 3) → M} + +/-- The opposite scalar action on a complex vector space, which the square-zero extension + needs to be a ring. Since `ℂ` is commutative it is the given action read through `unop`, + and it is given a low priority so that the action of `ℂ` on itself is unaffected. -/ +noncomputable local instance (priority := 100) opModule : Module ℂᵐᵒᵖ M := + Module.compHom M ((RingHom.id ℂ).fromOpposite fun x y => mul_comm x y) + +/-- The two scalar actions of `ℂ` on a complex vector space commute. -/ +local instance (priority := 100) smulCommClassOpModule : SMulCommClass ℂ ℂᵐᵒᵖ M := + ⟨fun a b m => smul_comm a b.unop m⟩ + +/-- The opposite scalar action agrees with the given one, `ℂ` being commutative. -/ +local instance (priority := 100) isCentralScalarOpModule : IsCentralScalar ℂ M := + ⟨fun _ _ => rfl⟩ + +/-- The linear map of the square-zero extension induced by a linear map of the module: the + identity on the scalar part and the given map on the module part. -/ +def sqZeroMap (f : M →ₗ[ℂ] M) : TrivSqZeroExt ℂ M →ₗ[ℂ] TrivSqZeroExt ℂ M where + toFun u := TrivSqZeroExt.inl u.fst + TrivSqZeroExt.inr (f u.snd) + map_add' u v := by + refine TrivSqZeroExt.ext ?_ ?_ <;> simp + map_smul' c u := by + refine TrivSqZeroExt.ext ?_ ?_ <;> simp + +/-- The induced map leaves the scalar part alone. -/ +@[simp] +lemma fst_sqZeroMap (f : M →ₗ[ℂ] M) (u : TrivSqZeroExt ℂ M) : + (sqZeroMap f u).fst = u.fst := by + simp [sqZeroMap] + +/-- The induced map acts by the given map on the module part. -/ +@[simp] +lemma snd_sqZeroMap (f : M →ₗ[ℂ] M) (u : TrivSqZeroExt ℂ M) : + (sqZeroMap f u).snd = f u.snd := by + simp [sqZeroMap] + +/-- The representation carried by the square-zero extension: trivial on the scalar part + and the given representation on the module part. -/ +def sqZeroRep (ρ : Representation ℂ GaugeGroupI M) : + Representation ℂ GaugeGroupI (TrivSqZeroExt ℂ M) where + toFun g := sqZeroMap (ρ g) + map_one' := by + refine LinearMap.ext fun u => TrivSqZeroExt.ext ?_ ?_ <;> simp + map_mul' g₁ g₂ := by + refine LinearMap.ext fun u => TrivSqZeroExt.ext ?_ ?_ <;> simp [Module.End.mul_apply] + +/-- The extended representation on the image of the module is the given one. -/ +@[simp] +lemma sqZeroRep_inr (ρ : Representation ℂ GaugeGroupI M) (g : GaugeGroupI) (m : M) : + sqZeroRep ρ g (TrivSqZeroExt.inr m) = TrivSqZeroExt.inr (ρ g m) := by + refine TrivSqZeroExt.ext ?_ ?_ <;> simp [sqZeroRep] + +/-- The extended representation acts by algebra maps, whatever the representation it + extends: the product of the extension is built from the module structure, which the + representation is linear for. -/ +lemma isMulRep_sqZeroRep (ρ : Representation ℂ GaugeGroupI M) : IsMulRep (sqZeroRep ρ) := by + intro g u v + refine TrivSqZeroExt.ext ?_ ?_ + · simp [sqZeroRep] + · simp [sqZeroRep, TrivSqZeroExt.snd_mul, op_smul_eq_smul] + +/-- The images of the components in the square-zero extension again form a bi-adjoint + family. -/ +lemma isSU2BiAdjoint_sqZeroRep (hU : IsSU2BiAdjoint M ρ U) : + IsSU2BiAdjoint (TrivSqZeroExt ℂ M) (sqZeroRep ρ) fun l => TrivSqZeroExt.inr (U l) where + repGauge_T g l := by + rw [sqZeroRep_inr, hU.repGauge_T g l] + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +/-- The trace contraction of the images is the image of the trace contraction. -/ +lemma traceContraction_sqZeroRep (hU : IsSU2BiAdjoint M ρ U) : + hU.isSU2BiAdjoint_sqZeroRep.traceContraction = TrivSqZeroExt.inr hU.traceContraction := by + simp only [traceContraction, TrivSqZeroExt.inr_sum] + +/-- The image of an element of the span lies in the span of the images. -/ +lemma inr_mem_span_sqZeroRep (hU : IsSU2BiAdjoint M ρ U) {x : M} (hx : x ∈ hU.span) : + TrivSqZeroExt.inr x ∈ hU.isSU2BiAdjoint_sqZeroRep.span := by + obtain ⟨c, rfl⟩ := (hU.mem_span_iff x).1 hx + refine (hU.isSU2BiAdjoint_sqZeroRep.mem_span_iff _).2 ⟨c, ?_⟩ + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +/-- Every gauge invariant in the span of the components is a multiple of the trace + contraction, for a family valued in a mere module. Neither an algebra structure on the + target nor multiplicativity of the representation is needed: the square-zero extension + supplies both, and the injection of the module reflects the conclusion back. -/ +lemma exists_smul_traceContraction_of_invariant_module (hU : IsSU2BiAdjoint M ρ U) {x : M} + (hx : x ∈ hU.span) (hinv : ∀ g : GaugeGroupI, ρ g x = x) : + ∃ c : ℂ, x = c • hU.traceContraction := by + obtain ⟨c, hc⟩ := hU.isSU2BiAdjoint_sqZeroRep.exists_smul_traceContraction_of_invariant + (isMulRep_sqZeroRep ρ) (hU.inr_mem_span_sqZeroRep hx) + (fun g => by rw [sqZeroRep_inr, hinv g]) + refine ⟨c, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ + rw [hc, hU.traceContraction_sqZeroRep, TrivSqZeroExt.inr_smul] + +/-- The same classification for a family valued in a mere module, read at the isospin + factor alone. -/ +lemma exists_smul_traceContraction_of_su2_invariant_module (hU : IsSU2BiAdjoint M ρ U) + {x : M} (hx : x ∈ hU.span) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ρ (1, V, 1) x = x) : + ∃ c : ℂ, x = c • hU.traceContraction := + hU.toRepSU2.exists_smul_traceContraction_of_invariant_module hx + ((repSU2_invariant_iff_su2 ρ x).2 hinv) + +end SquareZero + +/-! + +## D.5. The invariants modulo a stable submodule + +A stable submodule can be divided out: the quotient representation carries the images of +the components as a bi-adjoint family again, so D.4 applies verbatim in the quotient and +lifts to a classification modulo the submodule. Stability of the submodule is what makes +the quotient representation exist, and it cannot be dropped: for an unstable line `ℂ ∙ v` +the only invariant of the line is `0`, while an invariant of the sum may well lie outside +the span. The error term is invariant for free, since it is the difference of two +invariants. + +`mem_span_sup_su2_invariant_iff` is the isospin form, stable and invariant meaning under +`repGauge (1, U, 1)` throughout, and it is the form the transformation law supports. +`mem_span_sup_invariant_iff`, the gauge form, asks in addition that the trace contraction +be gauge invariant, for the reason given in D.3: that is what makes the error term a gauge +invariant rather than merely an isospin invariant. + +-/ + +section Quotient + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {U : (Fin 2 → Fin 3) → M} + +/-- The representation induced on the quotient by a gauge-stable submodule. -/ +noncomputable def quotRep (ρ : Representation ℂ GaugeGroupI M) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + Representation ℂ GaugeGroupI (M ⧸ S) where + toFun g := S.mapQ S (ρ g) fun y hy => hS g y hy + map_one' := by + ext y + simp only [LinearMap.coe_comp, Function.comp_apply, Submodule.mkQ_apply, + Submodule.mapQ_apply, map_one, Module.End.one_apply] + map_mul' g₁ g₂ := by + ext y + simp only [LinearMap.coe_comp, Function.comp_apply, Submodule.mkQ_apply, + Submodule.mapQ_apply, map_mul, Module.End.mul_apply] + +/-- The quotient representation on a class is the class of the representation. -/ +@[simp] +lemma quotRep_mkQ (S : Submodule ℂ M) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) + (g : GaugeGroupI) (y : M) : quotRep ρ S hS g (S.mkQ y) = S.mkQ (ρ g y) := rfl + +/-- The images of the components in the quotient by a gauge-stable submodule again form a + bi-adjoint family. -/ +lemma isSU2BiAdjoint_quotRep (hU : IsSU2BiAdjoint M ρ U) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + IsSU2BiAdjoint (M ⧸ S) (quotRep ρ S hS) fun l => S.mkQ (U l) where + repGauge_T g l := by + rw [quotRep_mkQ, hU.repGauge_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The quotient map carries the trace contraction to the trace contraction of the + images. -/ +lemma mkQ_traceContraction (hU : IsSU2BiAdjoint M ρ U) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + S.mkQ hU.traceContraction = (hU.isSU2BiAdjoint_quotRep S hS).traceContraction := by + simp only [traceContraction, map_sum] + +end Quotient + +/-- The gauge invariants of the span of the components together with a gauge-stable + submodule `S`: such an element is a multiple of the trace contraction up to an error in + `S`, and the error is gauge invariant as well, being the difference of two invariants. + Stability of `S` is needed, and not just convenient: for an unstable line the only + invariant of the line is zero, while the sum can carry invariants outside the span. The + gauge invariance `htc` of the trace contraction is a hypothesis for the same reason as + in `mem_span_and_invariant_iff`: the transformation law constrains the isospin factor + only, so it is what makes the error term gauge invariant rather than merely isospin + invariant. The classification is applied in the quotient by `S`, where the images of the + components form a bi-adjoint family again. -/ +lemma mem_span_sup_invariant_iff (hT : IsSU2BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) + (x : B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (htc : ∀ g : GaugeGroupI, repGauge g hT.traceContraction = hT.traceContraction) + (hx : x ∈ hT.span ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y + ∧ ∀ g : GaugeGroupI, repGauge g y = y := by + have hmk : S.mkQ x ∈ (hT.isSU2BiAdjoint_quotRep S hS).span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine ((hT.isSU2BiAdjoint_quotRep S hS).mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ g : GaugeGroupI, quotRep repGauge S hS g (S.mkQ x) = S.mkQ x := + fun g => by rw [quotRep_mkQ, hinv g] + obtain ⟨c, hc⟩ := + (hT.isSU2BiAdjoint_quotRep S hS).exists_smul_traceContraction_of_invariant_module hmk hinv' + rw [← hT.mkQ_traceContraction S hS] at hc + refine ⟨c, x - c • hT.traceContraction, ?_, by abel, fun g => ?_⟩ + · have hker : x - c • hT.traceContraction ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, map_smul, hc, sub_self] + rwa [Submodule.ker_mkQ] at hker + · rw [map_sub, map_smul, hinv g, htc g] + +/-- The same statement modulo an isospin-stable submodule, read at the isospin factor + alone: a vector of the span joined with `S` that the isospin factor fixes is a multiple + of the trace contraction up to an error in `S`, and the error is fixed by the isospin + factor too. -/ +lemma mem_span_sup_su2_invariant_iff (hT : IsSU2BiAdjoint B repGauge T) + (hmul : IsMulRep repGauge) (x : B) (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, U, 1) y ∈ S) + (hx : x ∈ hT.span ⊔ S) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y + ∧ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) y = y := by + obtain ⟨c, y, hyS, hxy, hyinv⟩ := + hT.toRepSU2.mem_span_sup_invariant_iff (isMulRep_repSU2 hmul) x S + ((repSU2_stable_iff_su2 repGauge S).2 hS) + ((repSU2_invariant_iff_su2 repGauge _).2 hT.repGauge_traceContraction) hx + ((repSU2_invariant_iff_su2 repGauge x).2 hinv) + exact ⟨c, y, hyS, hxy, (repSU2_invariant_iff_su2 repGauge y).1 hyinv⟩ + +end Decomposition end IsSU2BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 0f697d7c3..9874fb346 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -151,8 +151,8 @@ def IsSU3BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 8) → B) : Prop where - repGauge_T : ∀ g : GaugeGroupI, - IsSU3BiAdjointMat (GaugeGroupI.toSU3 g) (repGauge g) T + repGauge_T : ∀ g : specialUnitaryGroup (Fin 3) ℂ, + IsSU3BiAdjointMat g (repGauge (g, 1, 1)) T /-! @@ -219,6 +219,18 @@ lemma repSU3_stable_iff_su3 {B : Type*} [AddCommGroup B] [Module ℂ B] ↔ ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S := ⟨fun h U => h (U, 1, 1), fun h g => h (GaugeGroupI.toSU3 g)⟩ +/-- The colour part of a representation agrees with the representation at the cyclic + colour rotation, that rotation being trivial on isospin and hypercharge. -/ +lemma repSU3_gaugeSU3Perm {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) : + repSU3 repGauge gaugeSU3Perm = repGauge gaugeSU3Perm := rfl + +/-- The colour part of a representation agrees with the representation at the colour + transposition, that transposition being trivial on isospin and hypercharge. -/ +lemma repSU3_gaugeSU3Transp {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) : + repSU3 repGauge gaugeSU3Transp = repGauge gaugeSU3Transp := rfl + namespace IsSU3BiAdjoint set_option linter.unusedVariables false @@ -233,7 +245,7 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] transports along this and is read at the colour factor alone. -/ lemma toRepSU3 (hT : IsSU3BiAdjoint B repGauge T) : IsSU3BiAdjoint B (repSU3 repGauge) T where - repGauge_T g := hT.repGauge_T (GaugeGroupI.toSU3 g, 1, 1) + repGauge_T g := hT.repGauge_T g /-- The span of all the components. -/ def span (hT : IsSU3BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d @@ -322,11 +334,20 @@ lemma map_traceContraction (hT : IsSU3BiAdjoint B repGauge T) simp [apply_ite] rw [step, ← hT.traceContraction_eq_sum] -/-- The trace contraction of a bi-adjoint family is gauge invariant: every gauge - transformation acts on it through its `SU(3)` part alone. -/ -lemma repGauge_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (g : GaugeGroupI) : - repGauge g hT.traceContraction = hT.traceContraction := - hT.map_traceContraction (hT.repGauge_T g) +/-- The trace contraction of a bi-adjoint family is fixed by the colour factor. That is + all the transformation law constrains: the isospin and hypercharge factors are free to + move the trace contraction, and in general they do. -/ +lemma repGauge_traceContraction (hT : IsSU3BiAdjoint B repGauge T) + (U : specialUnitaryGroup (Fin 3) ℂ) : + repGauge (U, 1, 1) hT.traceContraction = hT.traceContraction := + hT.map_traceContraction (hT.repGauge_T U) + +/-- The trace contraction is fixed by the colour factor, under the name spelling out which + factor is meant. This is `repGauge_traceContraction`. -/ +lemma repGauge_su3_traceContraction (hT : IsSU3BiAdjoint B repGauge T) + (U : specialUnitaryGroup (Fin 3) ℂ) : + repGauge (U, 1, 1) hT.traceContraction = hT.traceContraction := + hT.repGauge_traceContraction U end IsSU3BiAdjoint @@ -407,7 +428,7 @@ lemma exists_rootPair_or_cartanId (a : Fin 8) : revert a decide -TODO (lines := 330-370) "All of these should be in a more general file +TODO (lines := 362-402) "All of these should be in a more general file in the GaugeAlgebra section." /-! @@ -693,20 +714,31 @@ lemma map_biVec (hT : IsSU3BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin rw [Finset.sum_mul_sum] exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by ring -/-- Every gauge transformation moves a contraction against a pair of coordinate vectors - by the row action of its `SU(3)` part. -/ -lemma repGauge_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 8 → ℂ) : - repGauge g (hT.biVec c₀ c₁) +/-- A colour transformation moves a contraction against a pair of coordinate vectors by + the row action of its `SU(3)` element. -/ +lemma repGauge_su3_biVec (U : specialUnitaryGroup (Fin 3) ℂ) (c₀ c₁ : Fin 8 → ℂ) : + repGauge (U, 1, 1) (hT.biVec c₀ c₁) = hT.biVec (rowAct U c₀) (rowAct U c₁) := + hT.map_biVec (hT.repGauge_T U) c₀ c₁ + +/-- The colour part of the representation moves a contraction against a pair of coordinate + vectors by the row action of the `SU(3)` factor of its argument. Unlike the + representation itself, the colour part is constrained at every gauge transformation, + which is what lets the weight decomposition be built for it. -/ +lemma repSU3_biVec (g : GaugeGroupI) (c₀ c₁ : Fin 8 → ℂ) : + repSU3 repGauge g (hT.biVec c₀ c₁) = hT.biVec (rowAct (GaugeGroupI.toSU3 g) c₀) (rowAct (GaugeGroupI.toSU3 g) c₁) := - hT.map_biVec (hT.repGauge_T g) c₀ c₁ - -/-- **The bi-adjoint weight vectors are simultaneous eigenvectors of the gauge torus**, - at the character of the sum of the two individual weights. -/ -lemma repGauge_biVec_wtCoeff (k₀ k₁ : WeightIdx) (i : Fin 4) : - repGauge (gaugeTorusGen i) (hT.biVec (wtCoeff k₀) (wtCoeff k₁)) + hT.repGauge_su3_biVec (GaugeGroupI.toSU3 g) c₀ c₁ + +/-- The bi-adjoint weight vectors are simultaneous eigenvectors of the gauge torus in the + colour part of the representation, at the character of the sum of the two individual + weights. The isospin and hypercharge generators have trivial colour factor, so the colour + part fixes every weight vector at those, matching the vanishing isospin and hypercharge + coordinates of the weights. -/ +lemma repSU3_biVec_wtCoeff (k₀ k₁ : WeightIdx) (i : Fin 4) : + repSU3 repGauge (gaugeTorusGen i) (hT.biVec (wtCoeff k₀) (wtCoeff k₁)) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k₀ + wtWeight k₁) i) • hT.biVec (wtCoeff k₀) (wtCoeff k₁) := by - rw [hT.repGauge_biVec, rowAct_wtCoeff, rowAct_wtCoeff, hT.biVec_smul_left, + rw [hT.repSU3_biVec, rowAct_wtCoeff, rowAct_wtCoeff, hT.biVec_smul_left, hT.biVec_smul_right, smul_smul, GaugeWeight.coord_add, zpow_add₀ expI_ne_zero] @@ -786,17 +818,23 @@ lemma span_eq_wtSpan : hT.span = hT.wtSpan := by -/ -/-- **The gauge weight decomposition of the span of a bi-adjoint `su(3)` family.** The - span is the join of the lines through the sixty four products of weight vectors, and - each of those carries the sum of the two weights. -/ +/-- The gauge weight decomposition of the span of a bi-adjoint `su(3)` family, for the + colour part of the representation. The span is the join of the lines through the sixty + four products of weight vectors, and each of those carries the sum of the two weights. + + The decomposition is for `repSU3 repGauge` and not for `repGauge` itself because a + decomposition must know how all four torus generators act, and the transformation law + constrains only the colour factor: of the four generators only `gaugeTorusGen 0` and + `gaugeTorusGen 1` are colour transformations. The colour part sends the other two to the + identity, so their weights vanish by construction. -/ @[implicit_reducible] noncomputable def gaugeWeightDecomposition (hT : IsSU3BiAdjoint B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition (repSU3 repGauge) hT.span := GaugeWeightDecomposition.copy - (GaugeWeightDecomposition.iSup hmul fun k : WeightIdx × WeightIdx => - GaugeWeightDecomposition.spanSingleton hmul + (GaugeWeightDecomposition.iSup (isMulRep_repSU3 hmul) fun k : WeightIdx × WeightIdx => + GaugeWeightDecomposition.spanSingleton (isMulRep_repSU3 hmul) (hT.biVec (wtCoeff k.1) (wtCoeff k.2)) (wtWeight k.1 + wtWeight k.2) - (hT.repGauge_biVec_wtCoeff k.1 k.2)) + (hT.repSU3_biVec_wtCoeff k.1 k.2)) _ hT.span_eq_wtSpan /-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through @@ -813,9 +851,10 @@ lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : = Finset.univ.biUnion fun k : WeightIdx × WeightIdx => ({wtWeight k.1 + wtWeight k.2} : Finset GaugeWeight) := rfl -/-- **The gauge weights carried by a bi-adjoint `su(3)` family**: the nineteen weights of - the tensor square of the `su(3)` adjoint. Every one of them has vanishing weak isospin - and hypercharge, since the family carries colour only. -/ +/-- The gauge weights carried by a bi-adjoint `su(3)` family: the nineteen weights of the + tensor square of the `su(3)` adjoint. Every one of them has vanishing weak isospin and + hypercharge, the colour part of the representation sending the isospin and hypercharge + generators to the identity. -/ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : (hT.gaugeWeightDecomposition hmul).supp = {((0, 0, 0, 0) : GaugeWeight), (2, -1, 0, 0), (1, 1, 0, 0), (-1, 2, 0, 0), @@ -880,12 +919,12 @@ lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) · exact hT.span_biVec_le_piece_zero hmul (by simp [wtWeight]) -/-- **The trace contraction lies in the zero-weight piece.** It is gauge invariant, so in - particular the torus fixes it. -/ +/-- The trace contraction lies in the zero-weight piece. It is fixed by the colour factor, + so in particular the colour part of the representation fixes it at the torus. -/ lemma traceContraction_mem_piece_zero (hmul : IsMulRep repGauge) : hT.traceContraction ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := GaugeWeightDecomposition.mem_zero_of_invariant _ hT.traceContraction_mem_span - hT.repGauge_traceContraction + ((repSU3_invariant_iff_su3 repGauge _).2 hT.repGauge_traceContraction) /-! @@ -1247,7 +1286,7 @@ lemma prodCycle_one_two : hT.prodCycle 1 2 = hT.posNegProd 1 := rfl /-- Every gauge transformation acts through its `SU(3)` part; for the cyclic colour rotation that part is `su3Perm`. -/ lemma repGauge_T_gaugeSU3Perm (hT : IsSU3BiAdjoint B repGauge T) : - IsSU3BiAdjointMat su3Perm (repGauge gaugeSU3Perm) T := hT.repGauge_T gaugeSU3Perm + IsSU3BiAdjointMat su3Perm (repGauge gaugeSU3Perm) T := hT.repGauge_T su3Perm /-- A map moving the components by the cyclic colour rotation moves each root product one step along its cycle. -/ @@ -1526,9 +1565,11 @@ lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : cannot separate. Grade zero is necessary for gauge invariance but not sufficient; `zeroPiece_zero` says more about what a further reduction would need. -/ noncomputable def zeroPieceSU3Perm (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) : - SU3PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) where + SU3PermDecomposition (repSU3 repGauge) ((hT.gaugeWeightDecomposition hmul).piece 0) where piece := hT.zeroPiece - piece_le k x hx := Module.End.mem_eigenspace_iff.mp (hT.zeroPiece_le_eigenspace k hx) + piece_le k x hx := by + rw [repSU3_gaugeSU3Perm] + exact Module.End.mem_eigenspace_iff.mp (hT.zeroPiece_le_eigenspace k hx) iSup_piece := hT.iSup_zeroPiece hmul /-- The pieces of the decomposition are the graded pieces. -/ @@ -1753,7 +1794,7 @@ is what makes the grade zero piece stable under it. part is `su3Transp`. -/ lemma repGauge_T_gaugeSU3Transp (hT : IsSU3BiAdjoint B repGauge T) : IsSU3BiAdjointMat su3Transp (repGauge gaugeSU3Transp) T := - hT.repGauge_T gaugeSU3Transp + hT.repGauge_T su3Transp /-- A map moving the components by the transposition exchanges the two cycles of root products, reversing each. -/ @@ -2062,16 +2103,18 @@ lemma repGauge_gaugeSU3Transp_mem_zeroPiece_zero {x : B} (hx : x ∈ hT.zeroPiec exchanges the two grade zero cycle sums and the two mixed Cartan products. -/ noncomputable def zeroPieceSU3Weyl (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) : - SU3WeylDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) := - (hT.zeroPieceSU3Perm hmul).toWeyl fun _ hx => - hT.repGauge_gaugeSU3Transp_mem_zeroPiece_zero hx + SU3WeylDecomposition (repSU3 repGauge) ((hT.gaugeWeightDecomposition hmul).piece 0) := + (hT.zeroPieceSU3Perm hmul).toWeyl fun _ hx => by + rw [repSU3_gaugeSU3Transp] + exact hT.repGauge_gaugeSU3Transp_mem_zeroPiece_zero hx /-- The trivial isotype piece, written out: the join of the two symmetric lines. Two of the four dimensions of grade zero survive here; the other two are of sign isotype. -/ lemma zeroPieceSU3Weyl_isotypic_triv (hmul : IsMulRep repGauge) : (hT.zeroPieceSU3Weyl hmul).isotypic .triv = ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by - rw [zeroPieceSU3Weyl, SU3PermDecomposition.toWeyl_isotypic_triv, zeroPieceSU3Perm_piece] + rw [zeroPieceSU3Weyl, SU3PermDecomposition.toWeyl_isotypic_triv, zeroPieceSU3Perm_piece, + repSU3_gaugeSU3Transp] refine le_antisymm ?_ ?_ · rintro x ⟨hx0, hxR⟩ have hR : repGauge gaugeSU3Transp x = x := by @@ -2095,7 +2138,8 @@ lemma zeroPieceSU3Weyl_isotypic_triv (hmul : IsMulRep repGauge) : lemma zeroPieceSU3Weyl_isotypic_sign (hmul : IsMulRep repGauge) : (hT.zeroPieceSU3Weyl hmul).isotypic .sign = ℂ ∙ hT.rootSign ⊔ ℂ ∙ hT.cartanSign := by - rw [zeroPieceSU3Weyl, SU3PermDecomposition.toWeyl_isotypic_sign, zeroPieceSU3Perm_piece] + rw [zeroPieceSU3Weyl, SU3PermDecomposition.toWeyl_isotypic_sign, zeroPieceSU3Perm_piece, + repSU3_gaugeSU3Transp] refine le_antisymm ?_ ?_ · rintro x ⟨hx0, hxR⟩ have hR : repGauge gaugeSU3Transp x = -x := by @@ -2119,13 +2163,13 @@ lemma zeroPieceSU3Weyl_isotypic_sign (hmul : IsMulRep repGauge) : lemma zeroPieceSU3Weyl_isotypic_std (hmul : IsMulRep repGauge) : (hT.zeroPieceSU3Weyl hmul).isotypic .std = hT.zeroPiece 1 ⊔ hT.zeroPiece 2 := rfl -/-- The trace contraction is of trivial isotype: it is gauge invariant, so in particular - the whole Weyl group fixes it. This is strictly stronger than lying in grade zero, which - is the join of the trivial and the sign isotype. -/ +/-- The trace contraction is of trivial isotype: it is fixed by the colour factor, so in + particular the whole Weyl group fixes it. This is strictly stronger than lying in grade + zero, which is the join of the trivial and the sign isotype. -/ lemma traceContraction_mem_isotypic_triv (hmul : IsMulRep repGauge) : hT.traceContraction ∈ (hT.zeroPieceSU3Weyl hmul).isotypic .triv := SU3WeylDecomposition.mem_triv_of_invariant _ (hT.traceContraction_mem_piece_zero hmul) - hT.repGauge_traceContraction + ((repSU3_invariant_iff_su3 repGauge _).2 hT.repGauge_traceContraction) /-- The trace contraction lies in the join of the two symmetric lines: of the ten dimensions of the zero-weight piece, the gauge weight and the Weyl group together confine @@ -2361,13 +2405,13 @@ lemma map_su3TurnFst_cartanPair (hT : IsSU3BiAdjoint B repGauge T) {f : B →ₗ that part is `su3TurnFst`. -/ lemma repGauge_T_gaugeSU3TurnFst (hT : IsSU3BiAdjoint B repGauge T) : IsSU3BiAdjointMat su3TurnFst (repGauge gaugeSU3TurnFst) T := - hT.repGauge_T gaugeSU3TurnFst + hT.repGauge_T su3TurnFst /-- Every gauge transformation acts through its `SU(3)` part; for the second quarter turn that part is `su3TurnSnd`. -/ lemma repGauge_T_gaugeSU3TurnSnd (hT : IsSU3BiAdjoint B repGauge T) : IsSU3BiAdjointMat su3TurnSnd (repGauge gaugeSU3TurnSnd) T := - hT.repGauge_T gaugeSU3TurnSnd + hT.repGauge_T su3TurnSnd /-- The first quarter turn on the Cartan pair of diagonal components. -/ lemma repGauge_gaugeSU3TurnFst_cartanPair (hT : IsSU3BiAdjoint B repGauge T) : @@ -2496,13 +2540,15 @@ lemma biVec_cartanTurn_sum : | ring1 | linear_combination ((1 : ℂ) / 2) * h3 -/-- A multiple of the Cartan pair that is gauge invariant is a quarter of the same multiple - of the trace contraction. The two quarter turns tie the first two root diagonal +/-- A multiple of the Cartan pair that the colour factor fixes is a quarter of the same + multiple of the trace contraction. The two quarter turns tie the first two root diagonal components to the Cartan pair, and the cyclic colour rotation carries those two relations - to the remaining four. -/ + to the remaining four. All four elements used are colour transformations, which is all + the transformation law constrains. -/ lemma smul_traceContraction_eq_of_invariant (f : ℂ) - (hinv : ∀ g : GaugeGroupI, repGauge g (f • (T ![2, 2] + T ![7, 7])) - = f • (T ![2, 2] + T ![7, 7])) : + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, + repGauge (U, 1, 1) (f • (T ![2, 2] + T ![7, 7])) + = f • (T ![2, 2] + T ![7, 7])) : f • hT.traceContraction = (4 : ℂ) • (f • (T ![2, 2] + T ![7, 7])) := by have hperm : ∀ c₀ c₁ : Fin 8 → ℂ, f • hT.biVec c₀ c₀ = f • hT.biVec c₁ c₁ → f • hT.biVec (rowAct su3Perm c₀) (rowAct su3Perm c₀) @@ -2511,20 +2557,20 @@ lemma smul_traceContraction_eq_of_invariant (f : ℂ) have h' := congrArg (repGauge gaugeSU3Perm) h rwa [map_smul, map_smul, hT.map_biVec hT.repGauge_T_gaugeSU3Perm, hT.map_biVec hT.repGauge_T_gaugeSU3Perm] at h' - have hbase : ∀ g : GaugeGroupI, ∀ y : B, - repGauge g (T ![2, 2] + T ![7, 7]) = y + T ![7, 7] → f • y = f • T ![2, 2] := by - intro g y hg - have h := hinv g + have hbase : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y : B, + repGauge (U, 1, 1) (T ![2, 2] + T ![7, 7]) = y + T ![7, 7] → f • y = f • T ![2, 2] := by + intro U y hg + have h := hinv U rw [map_smul, hg, smul_add, smul_add] at h exact add_right_cancel h have hA0 : f • hT.biVec (unitVec 0) (unitVec 0) = f • hT.biVec (cartanTurn 0) (cartanTurn 0) := by rw [cartanTurn_zero, hT.biVec_unitVec, hT.biVec_unitVec] - exact hbase _ _ hT.repGauge_gaugeSU3TurnFst_cartanPair + exact hbase su3TurnFst _ hT.repGauge_gaugeSU3TurnFst_cartanPair have hB0 : f • hT.biVec (unitVec 1) (unitVec 1) = f • hT.biVec (cartanTurn 0) (cartanTurn 0) := by rw [cartanTurn_zero, hT.biVec_unitVec, hT.biVec_unitVec] - exact hbase _ _ hT.repGauge_gaugeSU3TurnSnd_cartanPair + exact hbase su3TurnSnd _ hT.repGauge_gaugeSU3TurnSnd_cartanPair have hA1 : f • hT.biVec (unitVec 5) (unitVec 5) = f • hT.biVec (cartanTurn 1) (cartanTurn 1) := by have h := hperm _ _ hA0 @@ -2554,29 +2600,41 @@ lemma smul_traceContraction_eq_of_invariant (f : ℂ) /-! -## F.3. The gauge invariants in the span +## F.3. The colour invariants in the span -A gauge invariant in the span is of trivial isotype by section E, so it is a combination +A colour invariant in the span is of trivial isotype by section E, so it is a combination `a • rootTriv + b • cartanTriv`. Subtracting the right multiple of the trace contraction -leaves a multiple of `cartanTriv` alone, still gauge invariant, and F.2 says such a multiple -is a multiple of the trace contraction as well. So the two lines the finite group left -collapse to one, which is the one singlet of `8 ⊗ 8`, and the containment of section B -becomes an equality. +leaves a multiple of `cartanTriv` alone, still fixed by the colour factor, and F.2 says +such a multiple is a multiple of the trace contraction as well. So the two lines the finite +group left collapse to one, which is the one singlet of `8 ⊗ 8`, and the containment of +section B becomes an equality. + +`mem_span_and_su3_invariant_iff` is the classification proper, and its hypothesis is +invariance under the colour factor, which is all the transformation law constrains. Its +gauge counterpart `mem_span_and_invariant_iff` needs the trace contraction to be gauge +invariant, and takes that as a hypothesis: the transformation law leaves the isospin and +hypercharge factors free, so they may scale the trace contraction, and then the multiples +of it are not gauge invariants at all. The same hypothesis is what +`su3_invariant_iff_invariant` needs to upgrade colour invariance in the span to gauge +invariance; without it that statement is false. -/ -/-- Every gauge invariant in the span of the components is a multiple of the trace +/-- Every colour invariant in the span of the components is a multiple of the trace contraction. The gauge weight, the cyclic colour rotation and the Weyl group cut the span down to the two lines through `rootTriv` and `cartanTriv`, and the quarter turns of F.1 - cut those two down to one. -/ -lemma exists_smul_traceContraction_of_invariant (hT : IsSU3BiAdjoint B repGauge T) + cut those two down to one. Only the colour factor is used, which is all the + transformation law constrains. -/ +lemma exists_smul_traceContraction_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) - (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : ∃ c : ℂ, x = c • hT.traceContraction := by + have hinv' : ∀ g : GaugeGroupI, repSU3 repGauge g x = x := + (repSU3_invariant_iff_su3 repGauge x).2 hinv have hmem : x ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by rw [← hT.zeroPieceSU3Weyl_isotypic_triv hmul] exact SU3WeylDecomposition.mem_triv_of_invariant _ - (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv') hinv' obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.1 hmem obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy obtain ⟨b, rfl⟩ := Submodule.mem_span_singleton.1 hz @@ -2585,62 +2643,75 @@ lemma exists_smul_traceContraction_of_invariant (hT : IsSU3BiAdjoint B repGauge have hE : ((b - a) * 2) • (T ![2, 2] + T ![7, 7]) = (a • hT.rootTriv + b • hT.cartanTriv) - (2 * a) • hT.traceContraction := by linear_combination (norm := module) (-a) • hrt + (a - b) • hct - have hinvC : ∀ g : GaugeGroupI, - repGauge g (((b - a) * 2) • (T ![2, 2] + T ![7, 7])) + have hinvC : ∀ U : specialUnitaryGroup (Fin 3) ℂ, + repGauge (U, 1, 1) (((b - a) * 2) • (T ![2, 2] + T ![7, 7])) = ((b - a) * 2) • (T ![2, 2] + T ![7, 7]) := by - intro g - rw [hE, map_sub, map_smul, hinv g, hT.repGauge_traceContraction] + intro U + rw [hE, map_sub, map_smul, hinv U, hT.repGauge_traceContraction] have hkey := hT.smul_traceContraction_eq_of_invariant ((b - a) * 2) hinvC exact ⟨2 * a + (b - a) / 2, by linear_combination (norm := module) a • hrt + (b - a) • hct + (-1 / 4 : ℂ) • hkey⟩ -/-- The gauge invariants in the span of the components are exactly the multiples of the - trace contraction. The three sieves of sections C, D and E together with the quarter turns - of section F bound them from above, and the trace contraction is itself invariant and in - the span, which bounds them from below. This is the one singlet of `8 ⊗ 8`. -/ -lemma mem_span_and_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) - (x : B) : - (x ∈ hT.span ∧ ∀ g : GaugeGroupI, repGauge g x = x) - ↔ x ∈ ℂ ∙ hT.traceContraction := by - refine ⟨fun h => ?_, fun hx => ?_⟩ - · obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_invariant hmul h.1 h.2 - exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ - · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx - exact ⟨Submodule.smul_mem _ _ hT.traceContraction_mem_span, - fun g => by rw [map_smul, hT.repGauge_traceContraction]⟩ - -/-- The sharper reading of the classification: invariance under the colour factor alone - already forces a member of the span to be a multiple of the trace contraction. The - family is bi-adjoint for the colour part of the representation as well, with the same - span and the same trace contraction, so this is the statement above read there, and it - is stronger because its hypothesis is weaker. -/ -lemma exists_smul_traceContraction_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) +/-- Every gauge invariant in the span of the components is a multiple of the trace + contraction. A gauge invariant is in particular fixed by the transformations trivial on + isospin and hypercharge, and those alone already force the conclusion. -/ +lemma exists_smul_traceContraction_of_invariant (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) - (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : ∃ c : ℂ, x = c • hT.traceContraction := - hT.toRepSU3.exists_smul_traceContraction_of_invariant (isMulRep_repSU3 hmul) hx - ((repSU3_invariant_iff_su3 repGauge x).2 hinv) + hT.exists_smul_traceContraction_of_su3_invariant hmul hx fun U => hinv (U, 1, 1) /-- The colour invariants in the span of the components are exactly the multiples of the - trace contraction, the isospin and hypercharge factors adding nothing. -/ + trace contraction. The three sieves of sections C, D and E together with the quarter turns + of section F bound them from above, and the trace contraction is itself fixed by the + colour factor and in the span, which bounds them from below. This is the one singlet of + `8 ⊗ 8`. -/ lemma mem_span_and_su3_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) (x : B) : (x ∈ hT.span ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) ↔ x ∈ ℂ ∙ hT.traceContraction := by - rw [← repSU3_invariant_iff_su3 repGauge x] - exact hT.toRepSU3.mem_span_and_invariant_iff (isMulRep_repSU3 hmul) x + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_su3_invariant hmul h.1 h.2 + exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ + · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx + exact ⟨Submodule.smul_mem _ _ hT.traceContraction_mem_span, + fun U => by rw [map_smul, hT.repGauge_traceContraction]⟩ -/-- Inside the span of the components the two notions of invariance agree: a vector fixed - by the colour factor is fixed by the whole gauge group. One direction is free, a colour - transformation being a gauge transformation; the other is the classification, the colour - invariants being multiples of the trace contraction and that being gauge invariant. -/ +/-- The gauge invariants in the span of the components are exactly the multiples of the + trace contraction, once the trace contraction is known to be gauge invariant. That + hypothesis cannot be dropped: the transformation law says nothing about the isospin and + hypercharge factors, so they may well move the trace contraction, and then the right-hand + side has invariants that the left-hand side has not. Where the two factors do fix it, as + they do for the gluon field strengths, the hypothesis is supplied from the transformation + law of the underlying field. -/ +lemma mem_span_and_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) + (x : B) + (htc : ∀ g : GaugeGroupI, repGauge g hT.traceContraction = hT.traceContraction) : + (x ∈ hT.span ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ x ∈ ℂ ∙ hT.traceContraction := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_invariant hmul h.1 h.2 + exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ + · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx + exact ⟨Submodule.smul_mem _ _ hT.traceContraction_mem_span, + fun g => by rw [map_smul, htc]⟩ + +/-- Inside the span of the components the two notions of invariance agree, provided the + trace contraction is gauge invariant: a vector fixed by the colour factor is then fixed + by the whole gauge group. One direction is free, a colour transformation being a gauge + transformation; the other is the classification, the colour invariants being multiples of + the trace contraction. The hypothesis `htc` is exactly what the transformation law no + longer supplies, and without it the statement is false, the isospin and hypercharge + factors being unconstrained. -/ lemma su3_invariant_iff_invariant (hT : IsSU3BiAdjoint B repGauge T) - (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ hT.span) : + (hmul : IsMulRep repGauge) + (htc : ∀ g : GaugeGroupI, repGauge g hT.traceContraction = hT.traceContraction) + {x : B} (hx : x ∈ hT.span) : (∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) ↔ ∀ g : GaugeGroupI, repGauge g x = x := by refine ⟨fun h g => ?_, fun h U => h (U, 1, 1)⟩ obtain ⟨c, rfl⟩ := hT.exists_smul_traceContraction_of_su3_invariant hmul hx h - rw [map_smul, hT.repGauge_traceContraction] + rw [map_smul, htc] /-! @@ -2828,11 +2899,16 @@ end Quotient `S`, and the error is gauge invariant as well, being the difference of two invariants. Stability of `S` is needed, and not just convenient: for an unstable line the only invariant of the line is zero, while the sum can carry invariants outside the span. The - classification is applied in the quotient by `S`, where the images of the components + gauge invariance `htc` of the trace contraction is a hypothesis for the same reason as in + `mem_span_and_invariant_iff`: the transformation law constrains the colour factor only, + so it is what makes the error term gauge invariant rather than merely colour invariant. + The classification is applied in the quotient by `S`, where the images of the components form a bi-adjoint family again. -/ lemma mem_span_sup_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) (x : B) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) (hx : x ∈ hT.span ⊔ S) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (htc : ∀ g : GaugeGroupI, repGauge g hT.traceContraction = hT.traceContraction) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y ∧ ∀ g : GaugeGroupI, repGauge g y = y := by @@ -2852,7 +2928,7 @@ lemma mem_span_sup_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMu · have hker : x - c • hT.traceContraction ∈ LinearMap.ker S.mkQ := by rw [LinearMap.mem_ker, map_sub, map_smul, hc, sub_self] rwa [Submodule.ker_mkQ] at hker - · rw [map_sub, map_smul, hinv g, hT.repGauge_traceContraction] + · rw [map_sub, map_smul, hinv g, htc g] /-- The same statement modulo a colour-stable submodule, read at the colour factor alone: a vector of the span joined with `S` that the colour factor fixes is a multiple of the @@ -2867,7 +2943,8 @@ lemma mem_span_sup_su3_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) y = y := by obtain ⟨c, y, hyS, hxy, hyinv⟩ := hT.toRepSU3.mem_span_sup_invariant_iff (isMulRep_repSU3 hmul) x S - ((repSU3_stable_iff_su3 repGauge S).2 hS) hx + ((repSU3_stable_iff_su3 repGauge S).2 hS) + ((repSU3_invariant_iff_su3 repGauge _).2 hT.repGauge_traceContraction) hx ((repSU3_invariant_iff_su3 repGauge x).2 hinv) exact ⟨c, y, hyS, hxy, (repSU3_invariant_iff_su3 repGauge y).1 hyinv⟩ From d37d196d823fe674fac3ea5fd8d59118b16138a3 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 09:09:10 +0100 Subject: [PATCH 251/254] feat: Some updates --- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 177 +++++++++++------- .../IsCovStandardModel/Generators.lean | 2 +- .../IsCovStandardModel/Sectors.lean | 62 ++++++ .../IsGaugeSector/MassWeight/BiAdjoint.lean | 52 +++-- 4 files changed, 207 insertions(+), 86 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 9874fb346..3b90e828c 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -24,22 +24,29 @@ proposition here records how such a product transforms. The transformation law itself is `IsSU3BiAdjointMat`, which relates one element of `SU(3)` to one linear map on `B` and mentions no other factor of the gauge group, through `su3AdjointMatrix`, the adjoint matrix of an `SU(3)` element alone. `IsSU3BiAdjoint` says -that every gauge transformation obeys that law through its `SU(3)` part. Everything the -file proves about how the components move is proved at the level of `IsSU3BiAdjointMat` -and instantiated afterwards, so the mathematics here is `SU(3)` mathematics; the elements -that do the work, `su3Perm`, `su3Transp`, `su3TurnFst` and `su3TurnSnd`, all live in -`SU(3)`. What stays about `GaugeGroupI` is the bookkeeping of the decompositions, which -`GaugeWeightDecomposition`, `SU3PermDecomposition` and `SU3WeylDecomposition` supply only -for representations of the gauge group, and the notion of gauge invariance itself. Section -A.3 records `repSU3`, the colour part of a representation, for which a bi-adjoint family -is again bi-adjoint; reading the classification of section F there sharpens it to -invariance under the colour factor alone, and the two notions of invariance then turn out -to agree on the span. +that the colour transformation `(U, 1, 1)` obeys that law with the matrix of `U`, for every +`U` in `SU(3)`, and it says nothing whatever about the isospin and hypercharge factors: +those may move the components as they please. So the mathematics here is `SU(3)` +mathematics twice over, in the law and in the hypothesis, and the conclusions are about +invariance under the colour factor. The elements that do the work, `su3Perm`, `su3Transp`, +`su3TurnFst` and `su3TurnSnd`, all live in `SU(3)`. + +Two things follow that are worth stating at the outset. The gauge weight decomposition must +know how all four torus generators act, and only `gaugeTorusGen 0` and `gaugeTorusGen 1` +are colour transformations, so the decomposition cannot be built for `repGauge`. It is +built instead for `repSU3 repGauge` of section A.3, the colour part of the representation, +which sends the isospin and hypercharge generators to the identity and so gives them weight +zero by construction rather than by hypothesis; the permutation and Weyl decompositions of +sections D and E are read there too. And the trace contraction is fixed by the colour +factor only; the statements that need it to be gauge invariant, +`mem_span_and_invariant_iff`, `su3_invariant_iff_invariant` and +`mem_span_sup_invariant_iff`, take that invariance as an explicit hypothesis, since nothing +here proves it. Section A gives the adjoint matrix of the `SU(3)` factor, the proposition and the span of -its components, section B the trace contraction, which is the natural gauge invariant -built from two adjoint indices, and section C the gauge weight decomposition of the -span. Section D grades the zero-weight +its components, section B the trace contraction, which is the natural colour invariant +built from two adjoint indices, and section C the gauge weight decomposition of the span, +for the colour part of the representation. Section D grades the zero-weight piece of that decomposition by the cyclic colour rotation, which is what the gauge weight alone cannot do, and section E upgrades that grading to the isotypic decomposition of the whole Weyl group `S₃`, in which the trace contraction lands in the trivial isotype. Those @@ -47,15 +54,15 @@ four sections are all built from the normaliser of the torus, and they stop two short. Section F leaves the normaliser behind: a quarter turn in the `SU(2)` of the first two colours carries a Cartan direction to a root direction, which no element of the normaliser does, and that cuts the two lines section E leaves down to the one line through -the trace contraction. So `mem_span_and_invariant_iff` says the gauge invariants in the -span are exactly the multiples of the trace contraction, the single singlet of `8 ⊗ 8`. -Sections F.4 and F.5 shed the hypotheses that classification is stated under. The trivial -square-zero extension of a module is an algebra on which every representation acts by -algebra maps, so the classification needs no algebra structure and no multiplicativity at -all, and it then descends to the quotient by a gauge-stable submodule, which is -`mem_span_sup_invariant_iff`. The row orthonormality of `su3AdjointMatrix` that section B -rests on is inherited from the `su(3)` block of `adjointMatrix`, and proved where that -matrix is defined, in `GaugeAlgebra.Basis`. +the trace contraction. So `mem_span_and_su3_invariant_iff` says the colour invariants in +the span are exactly the multiples of the trace contraction, the single singlet of +`8 ⊗ 8`. Sections F.4 and F.5 shed the hypotheses that classification is stated under. The +trivial square-zero extension of a module is an algebra on which every representation acts +by algebra maps, so the classification needs no algebra structure and no multiplicativity +at all, and it then descends to the quotient by a stable submodule, which is +`mem_span_sup_su3_invariant_iff`. The row orthonormality of `su3AdjointMatrix` that +section B rests on is inherited from the `su(3)` block of `adjointMatrix`, and proved where +that matrix is defined, in `GaugeAlgebra.Basis`. -/ @[expose] public section @@ -125,13 +132,13 @@ index in the row slot. It is recorded by `IsSU3BiAdjointMat`, a relation between element of `SU(3)` and one linear map on `B` in which no other factor of the gauge group appears, and it is the law obeyed by the gluon field strengths of `IsGaugeSector`. -`IsSU3BiAdjoint` then says that every gauge transformation obeys that law through its -`SU(3)` part. Since `GaugeGroupI.toSU3` is a monoid homomorphism this is an action. -Quantifying over the whole of `GaugeGroupI` is what makes the proposition say more than a -statement about a single `SU(3)` element would: an element of the isospin or hypercharge -factor is sent to `1` in `SU(3)`, so those factors fix every component, and section C -reads that off as the vanishing of the isospin and hypercharge coordinates of every -weight. +`IsSU3BiAdjoint` then says that the gauge transformation `(U, 1, 1)` obeys that law with +the matrix of `U`, for every `U` in `SU(3)`. Since `U ↦ (U, 1, 1)` is a monoid homomorphism +this is an action of `SU(3)`, and it is all that is assumed: a gauge transformation with a +nontrivial isospin or hypercharge factor is not mentioned, and may move the components +arbitrarily. So nothing here forces the isospin and hypercharge coordinates of a weight to +vanish; section C gets that instead from `repSU3`, which sends the isospin and hypercharge +generators to the identity outright. -/ @@ -146,8 +153,9 @@ def IsSU3BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] (∏ i : Fin 2, ((su3AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) • T a /-- A family `T` of elements of `B`, indexed by two `su(3)` adjoint indices, transforms - as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group: every - gauge transformation moves the components by its `SU(3)` part alone. -/ + as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group: a colour + transformation moves the components by the `SU(3)` element it is built from. Nothing is + asked of the isospin or hypercharge factors. -/ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 8) → B) : Prop where @@ -162,13 +170,19 @@ Reading a representation of the gauge group at the colour factor of its argument gives `repSU3`, again a representation of the whole gauge group. Every construction stated for a representation of `GaugeGroupI` therefore applies to it verbatim, and a bi-adjoint family for `repGauge` is a bi-adjoint family for `repSU3 repGauge`, with the same span and -the same trace contraction. That is what lets section F.3 sharpen its classification from -gauge invariance to invariance under the colour factor alone, which is the weaker -hypothesis `∀ U : SU(3), repGauge (U, 1, 1) x = x`; the two turn out to agree on the span. - -`repSU3` is machinery for that transport and nothing more. The statements themselves are -written with the colour transformation `(U, 1, 1)` spelled out, so that reading one needs -no unfolding, and `repSU3_invariant_iff_su3` is the bridge between the two spellings. +the same trace contraction. Invariance under it is invariance under the colour factor, +`∀ U : SU(3), repGauge (U, 1, 1) x = x`, which is exactly what the transformation law +constrains. + +`repSU3` carries the weight bookkeeping of section C and the permutation and Weyl +bookkeeping of sections D and E, all of which need a representation of the whole gauge +group and none of which is available for `repGauge` itself, and it transports the +statements of section F that are proved for a representation of `GaugeGroupI`. The +statements themselves are written with the colour transformation `(U, 1, 1)` spelled out, +so that reading one needs no unfolding, and `repSU3_invariant_iff_su3` is the bridge +between the two spellings. The cyclic rotation and the transposition of sections D and E +are colour transformations, so the two representations agree at them outright, which is +`repSU3_gaugeSU3Perm` and `repSU3_gaugeSU3Transp`. -/ @@ -371,6 +385,14 @@ With two adjoint indices a weight vector is a product of two of these, contracte four such products, they span the same subspace as the components, and joining their lines one weight at a time gives `gaugeWeightDecomposition`. +That decomposition is for `repSU3 repGauge`, not for `repGauge`. A decomposition must say +how all four torus generators act, and of the four only `gaugeTorusGen 0` and +`gaugeTorusGen 1` are colour transformations, so the transformation law says nothing about +the other two. The colour part sends them to the identity, so it fixes every weight vector +there and their isospin and hypercharge coordinates vanish for that reason. This is why +`gaugeWeightDecomposition_supp` still lists only the nineteen weights of the tensor square +of the `su(3)` adjoint, all of them of the form `(m, n, 0, 0)`. + The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra and records multiplicativity of the representation, neither of which `IsSU3BiAdjoint` needs, so both appear as extra arguments here. @@ -428,7 +450,7 @@ lemma exists_rootPair_or_cartanId (a : Fin 8) : revert a decide -TODO (lines := 362-402) "All of these should be in a more general file +TODO (lines := 405-445) "All of these should be in a more general file in the GaugeAlgebra section." /-! @@ -797,7 +819,7 @@ lemma biVec_unitVec_mem (a b : Fin 8) : · rw [unitVec_cartanId] exact hT.biVec_wtCoeff_unitVec_mem _ _ -/-- **The weight vectors span the components.** The change of basis from the Gell-Mann +/-- The weight vectors span the components. The change of basis from the Gell-Mann basis to the weight basis is invertible, so nothing is lost. -/ lemma span_eq_wtSpan : hT.span = hT.wtSpan := by refine le_antisymm (iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr ?_) @@ -868,8 +890,9 @@ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : ## C.6. The zero-weight piece -A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight -piece, which makes that piece worth describing explicitly. A product of two weight vectors +A colour invariant built from `T` is fixed by the colour part of the representation at the +torus, so it lies in the zero-weight piece, which makes that piece worth describing +explicitly. A product of two weight vectors has weight zero exactly when the two weights cancel: a root against its negative, in either order, or any two Cartan directions. That is ten lines, the multiplicity of the zero weight in the tensor square of the `su(3)` adjoint. @@ -1042,7 +1065,10 @@ The gauge weight cannot see inside its own zero-weight piece: the torus fixes al the products above. The cyclic colour rotation `gaugeSU3Perm` does see inside it. It normalises the torus and sends each weight to another weight, fixing the weight zero, so it acts on the zero-weight piece, and `SU3PermDecomposition` grades that action by the -cube roots of unity. +cube roots of unity. Like the gauge weight decomposition it is recorded for the colour +part `repSU3 repGauge`, which is where the transformation law constrains every gauge +transformation; the rotation itself is a colour transformation, so the two representations +agree at it and the action computed below is the action of `repGauge gaugeSU3Perm`. Sections D.1 and D.2 compute the action, first on the Gell-Mann coordinate directions and then on the weight vectors: the six root directions are permuted in two three-cycles, @@ -1052,7 +1078,7 @@ grades a three-cycle by the cube roots of unity, and section D.5 assembles the decomposition. This grading is a sieve, not a classification: `SU3PermDecomposition` records that grade -zero is necessary for gauge invariance but proves no converse. It is also only half of the +zero is necessary for colour invariance but proves no converse. It is also only half of the Weyl group of `SU(3)`. Section E adds the other half, and the decomposition built here is the scaffolding that the isotypic decomposition there is assembled from, rather than the end of the story. @@ -1561,9 +1587,10 @@ lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : · exact hT.cartanProd_mem_iSup_zeroPiece 1 1 /-- The `SU(3)` permutation decomposition of the zero-weight piece of the gauge weight - decomposition: the cyclic colour rotation grades the ten dimensions the gauge weight - cannot separate. Grade zero is necessary for gauge invariance but not sufficient; - `zeroPiece_zero` says more about what a further reduction would need. -/ + decomposition, for the colour part of the representation: the cyclic colour rotation + grades the ten dimensions the gauge weight cannot separate. Grade zero is necessary for + colour invariance but not sufficient; `zeroPiece_zero` says more about what a further + reduction would need. -/ noncomputable def zeroPieceSU3Perm (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) : SU3PermDecomposition (repSU3 repGauge) ((hT.gaugeWeightDecomposition hmul).piece 0) where piece := hT.zeroPiece @@ -1603,7 +1630,7 @@ lemma zeroPieceSU3Perm_piece (hmul : IsMulRep repGauge) (k : ZMod 3) : `T ![2, 2] + T ![7, 7] + Complex.I • (T ![2, 7] - T ![7, 2])` and `T ![2, 2] + T ![7, 7] + Complex.I • (T ![7, 2] - T ![2, 7])` respectively. - Grade zero is necessary for a gauge invariant to land here, not sufficient: + Grade zero is necessary for a colour invariant to land here, not sufficient: `SU3PermDecomposition.mem_zero_of_invariant` has no converse, and combining the gauge weight decomposition with this `SU(3)` permutation decomposition only reaches the cyclic subgroup of the Weyl group. Section E cuts these four lines down to two, the trivial @@ -1685,9 +1712,9 @@ well as the two nonzero grades. It remains a sieve: gauge weight and the Weyl group together decide invariance under the normaliser of the torus and nothing more. `rootTriv_add_cartanTriv` measures what is left over: the trace contraction is half the sum of the two generators of the trivial isotype, and nothing here -says anything about the other combinations of those two generators. Which of them are gauge -invariant is settled in section F, by an element of `SU(3)` that does not normalise the -torus; no finite group settles it. +says anything about the other combinations of those two generators. Which of them are +colour invariant is settled in section F, by an element of `SU(3)` that does not normalise +the torus; no finite group settles it. ## E.1. The transposition on the Gell-Mann directions and the weight vectors @@ -2097,10 +2124,11 @@ lemma repGauge_gaugeSU3Transp_mem_zeroPiece_zero {x : B} (hx : x ∈ hT.zeroPiec simpa using sub_mem h hx /-- The `S₃` isotypic decomposition of the zero-weight piece of the gauge weight - decomposition: the whole Weyl group of `SU(3)` sorting the ten dimensions that the gauge - weight cannot separate. It is the cyclic decomposition upgraded by - `SU3PermDecomposition.toWeyl`, whose hypothesis is met because the transposition - exchanges the two grade zero cycle sums and the two mixed Cartan products. -/ + decomposition, for the colour part of the representation: the whole Weyl group of `SU(3)` + sorting the ten dimensions that the gauge weight cannot separate. It is the cyclic + decomposition upgraded by `SU3PermDecomposition.toWeyl`, whose hypothesis is met because + the transposition exchanges the two grade zero cycle sums and the two mixed Cartan + products. -/ noncomputable def zeroPieceSU3Weyl (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMulRep repGauge) : SU3WeylDecomposition (repSU3 repGauge) ((hT.gaugeWeightDecomposition hmul).piece 0) := @@ -2174,8 +2202,9 @@ lemma traceContraction_mem_isotypic_triv (hmul : IsMulRep repGauge) : /-- The trace contraction lies in the join of the two symmetric lines: of the ten dimensions of the zero-weight piece, the gauge weight and the Weyl group together confine it to two. By `rootTriv_add_cartanTriv` it is half the sum of the two generators, so it is - one particular element of that join; which other elements of the join are gauge invariant - is settled in section F, where the answer turns out to be only its own multiples. -/ + one particular element of that join; which other elements of the join are colour + invariant is settled in section F, where the answer turns out to be only its own + multiples. -/ lemma traceContraction_mem_span_triv (hmul : IsMulRep repGauge) : hT.traceContraction ∈ ℂ ∙ hT.rootTriv ⊔ ℂ ∙ hT.cartanTriv := by rw [← hT.zeroPieceSU3Weyl_isotypic_triv hmul] @@ -2202,8 +2231,9 @@ needed, one landing on `λ₁` and one on `λ₂`, because the Weyl group preser the six root directions into those two classes. Section F.2 computes what the two turns do to `rootTriv` and to `cartanTriv`: they move weight between the six root diagonal terms and the two Cartan ones while preserving the total, which is `2 • traceContraction`. Section -F.3 turns that into the statement that the gauge invariants in the span are exactly the -multiples of the trace contraction. +F.3 turns that into the statement that the colour invariants in the span are exactly the +multiples of the trace contraction, and reads off what the gauge invariants are once the +trace contraction is known to be gauge invariant. ## F.1. A quarter turn in the `SU(2)` of the first two colours @@ -2724,7 +2754,8 @@ extension `TrivSqZeroExt ℂ M` of a module `M` is a commutative `ℂ`-algebra b module structure alone, a representation on `M` extends to it by acting trivially on the scalar part, and that extension acts by algebra maps for free. So F.3 holds in the extension, and the injection of `M` carries the conclusion back: -`exists_smul_traceContraction_of_invariant_module` is F.3 with the algebra structure and +`exists_smul_traceContraction_of_su3_invariant_module` and its gauge corollary +`exists_smul_traceContraction_of_invariant_module` are F.3 with the algebra structure and the multiplicativity hypothesis both removed. -/ @@ -2840,15 +2871,21 @@ end SquareZero /-! -## F.5. The gauge invariants modulo a gauge-stable submodule - -A gauge-stable submodule can be divided out: the quotient representation carries the -images of the components as a bi-adjoint family again, so F.4 applies verbatim in the -quotient and lifts to a classification modulo the submodule. Stability of the submodule is -what makes the quotient representation exist, and it cannot be dropped: for an unstable -line `ℂ ∙ v` the only invariant of the line is `0`, while an invariant of the sum may well -lie outside the span. The error term is invariant for free, since it is the difference of -two invariants. +## F.5. The invariants modulo a stable submodule + +A stable submodule can be divided out: the quotient representation carries the images of +the components as a bi-adjoint family again, so F.4 applies verbatim in the quotient and +lifts to a classification modulo the submodule. Stability of the submodule is what makes +the quotient representation exist, and it cannot be dropped: for an unstable line `ℂ ∙ v` +the only invariant of the line is `0`, while an invariant of the sum may well lie outside +the span. The error term is invariant for free, since it is the difference of two +invariants. + +`mem_span_sup_su3_invariant_iff` is the colour form, stable and invariant meaning under +`repGauge (U, 1, 1)` throughout, and it is the form the transformation law supports. +`mem_span_sup_invariant_iff`, the gauge form, asks in addition that the trace contraction +be gauge invariant, for the reason given in F.3: that is what makes the error term a gauge +invariant rather than merely a colour invariant. -/ diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean index 3f9eedee0..be9508356 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean @@ -157,7 +157,7 @@ inductive GeneratorClass where | higgs : GeneratorClass /-- The fermion class: the fermion towers and their conjugates. -/ | fermion : GeneratorClass -deriving DecidableEq +deriving DecidableEq, Fintype /-- The class of a covariant generator. -/ def Generators.kind : Generators → GeneratorClass diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean index db034c0f1..8921f1c16 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean @@ -999,6 +999,68 @@ lemma sectorMassWeight_pair_le {c₁ c₂ : GeneratorClass} (hne : c₁ ≠ c₂ (Submodule.mem_iSup_of_mem (classWeight_ne_zero h2) ?_))) exact h.list_prod_mem_mul_of_forall_kind hne hM₁ hM₂ hone₁ hone₂ hmul₁ hmul₂ hcomm gl hgl +/-! + +## Invariance in terms of sectors + +Both actions preserve every weight part of every sector +(`repGauge_mem_sectorMassWeight`, `repLorentz_mem_sectorMassWeight`), and the +weight-`w` submodule is the join of those parts +(`massWeightSubmodule_eq_iSup_sectorMassWeight`), so an element of the weight-`w` +submodule is a sum of sector pieces and each action carries one such sum to +another. Reading off from that alone that the pieces are themselves invariant is +not possible: it needs the pieces to be determined by their sum, that is, needs +the family of weight parts to be independent, and that is the hypothesis of +`sector_invariant_of_iSupIndep`. + +-/ + +/-- An element of the weight-`w` submodule fixed by both actions is a sum of + weight-`w` sector pieces, each of them fixed by both actions, provided the weight + parts of the sectors are independent. Independence is what turns the two + decompositions `x = ∑ s, f s` and `x = ∑ s, repGauge g (f s)` into an equality + piece by piece; without it the pieces are not determined by their sum. -/ +lemma sector_invariant_of_iSupIndep {w : ℕ} + (hind : iSupIndep fun S : Finset GeneratorClass => h.sectorMassWeight S w) + (x : B) (x_gauge_invariant : ∀ g, repGauge g x = x) + (x_lorentz_invariant : ∀ g, repLorentz g x = x) + (x_mass_dim : x ∈ h.massWeightSubmodule w) : + ∃ f : Finset GeneratorClass → B, + x = ∑ s, f s ∧ (∀ s, f s ∈ h.sectorMassWeight s w ∧ + (∀ g, repGauge g (f s) = (f s)) ∧ (∀ g, repLorentz g (f s) = (f s))) := by + rw [h.massWeightSubmodule_eq_iSup_sectorMassWeight w] at x_mass_dim + obtain ⟨c, hc, hcx⟩ := (Submodule.mem_iSup_iff_exists_finsupp _ x).mp x_mass_dim + have hsum : ∑ s, c s = x := by + rw [← hcx, Finsupp.sum_fintype _ _ fun _ => rfl] + have huniq := (iSupIndep_iff_finsetSum_eq_imp_eq + fun S : Finset GeneratorClass => h.sectorMassWeight S w).mp hind + have key : ∀ T : Module.End ℂ B, (∀ s, T (c s) ∈ h.sectorMassWeight s w) → + T x = x → ∀ s, T (c s) = c s := by + intro T hT hTx s + refine huniq Finset.univ (fun t => T (c t)) (fun t => c t) + (fun t _ => ⟨hT t, hc t⟩) ?_ s (Finset.mem_univ s) + rw [← map_sum, hsum, hTx] + exact ⟨fun s => c s, hsum.symm, fun s => ⟨hc s, + fun g => key (repGauge g) (fun t => h.repGauge_mem_sectorMassWeight g (hc t)) + (x_gauge_invariant g) s, + fun Λ => key (repLorentz Λ) (fun t => h.repLorentz_mem_sectorMassWeight Λ (hc t)) + (x_lorentz_invariant Λ) s⟩⟩ + +/-- An element of the field algebra of weight `w` fixed by both actions is a sum of + weight-`w` sector pieces, each of them fixed by both actions. -/ +lemma sector_invariant {w : ℕ} (x : B) (hx : x ∈ h.fieldAlgebra) + (x_gauge_invariant : ∀ g, repGauge g x = x) + (x_lorentz_invariant : ∀ g, repLorentz g x = x) + (x_mass_dim : x ∈ h.massWeightSubmodule w) : + ∃ f : Finset GeneratorClass → B, + x = ∑ s, f s ∧ (∀ s, f s ∈ h.sectorMassWeight s w ∧ + (∀ g, repGauge g (f s) = (f s)) ∧ (∀ g, repLorentz g (f s) = (f s))) := by + -- Open. `sector_invariant_of_iSupIndep` closes this given + -- `iSupIndep fun S => h.sectorMassWeight S w`, and that independence is the whole + -- of what is missing; it does not follow from `IsCovStandardModel`, whose axioms + -- are all equations and so survive quotients that the independence does not. + sorry + end IsCovStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean index fbf75c563..a12ab357d 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean @@ -121,32 +121,50 @@ lemma repGauge_hyperchargeField (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 -/ -/-- A product of two gluon field strengths, viewed as a family indexed by the two `su(3)` - adjoint indices it carries, is a bi-adjoint `su(3)` tensor. -/ -lemma isSU3BiAdjoint_gluonField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) - (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : - IsSU3BiAdjoint B repGauge +/-- A gauge transformation moves a product of two gluon field strengths as the `SU(3)` + factor of that gauge group element moves a tensor with two `su(3)` adjoint indices. -/ +lemma isSU3BiAdjointMat_gluonField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (g : GaugeGroupI) : + IsSU3BiAdjointMat (GaugeGroupI.toSU3 g) (repGauge g) (fun a : Fin 2 → Fin 8 => h.gluonField l μ ν (a 0) * h.gluonField l' μ' ν' (a 1)) := by - refine ⟨fun g d => ?_⟩ + intro d rw [hrepGauge_mul, h.repGauge_gluonField, h.repGauge_gluonField, Fintype.sum_mul_sum, IsSU3BiAdjoint.sum_pi_two] refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ rw [smul_mul_smul_comm] simp [Fin.prod_univ_two] -/-- A product of two `W`-boson field strengths, viewed as a family indexed by the two - `su(2)` adjoint indices it carries, is a bi-adjoint `su(2)` tensor. -/ -lemma isSU2BiAdjoint_wField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) +/-- A product of two gluon field strengths, viewed as a family indexed by the two `su(3)` + adjoint indices it carries, is a bi-adjoint `su(3)` tensor. -/ +lemma isSU3BiAdjoint_gluonField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : - IsSU2BiAdjoint B repGauge + IsSU3BiAdjoint B repGauge + (fun a : Fin 2 → Fin 8 => h.gluonField l μ ν (a 0) * h.gluonField l' μ' ν' (a 1)) := + ⟨fun U => h.isSU3BiAdjointMat_gluonField_mul l μ ν l' μ' ν' (U, 1, 1)⟩ + +/-- A gauge transformation moves a product of two `W`-boson field strengths as the `SU(2)` + factor of that gauge group element moves a tensor with two `su(2)` adjoint indices. -/ +lemma isSU2BiAdjointMat_wField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (g : GaugeGroupI) : + IsSU2BiAdjointMat (GaugeGroupI.toSU2 g) (repGauge g) (fun a : Fin 2 → Fin 3 => h.wField l μ ν (a 0) * h.wField l' μ' ν' (a 1)) := by - refine ⟨fun g d => ?_⟩ + intro d rw [hrepGauge_mul, h.repGauge_wField, h.repGauge_wField, Fintype.sum_mul_sum, IsSU2BiAdjoint.sum_pi_two] refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ rw [smul_mul_smul_comm] simp [Fin.prod_univ_two] +/-- A product of two `W`-boson field strengths, viewed as a family indexed by the two + `su(2)` adjoint indices it carries, is a bi-adjoint `su(2)` tensor. -/ +lemma isSU2BiAdjoint_wField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : + IsSU2BiAdjoint B repGauge + (fun a : Fin 2 → Fin 3 => h.wField l μ ν (a 0) * h.wField l' μ' ν' (a 1)) := + ⟨fun U => h.isSU2BiAdjointMat_wField_mul l μ ν l' μ' ν' (1, U, 1)⟩ + /-- A product of two hypercharge field strengths, viewed as a family indexed by the two `u(1)` adjoint indices it carries, is a bi-adjoint `u(1)` tensor. -/ lemma isU1BiAdjoint_hyperchargeField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) @@ -345,7 +363,8 @@ lemma traceContraction_gluonField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 ⊕ F · rw [h.traceContraction_gluonField_mul] exact Submodule.sum_mem _ fun a _ => h.F_mul_F_mem_massWeightSubmodule l μ ν _ l' μ' ν' _ · exact (Representation.mem_invariants _ _).mpr fun g => - IsSU3BiAdjoint.repGauge_traceContraction _ g + IsSU3BiAdjoint.map_traceContraction _ + (h.isSU3BiAdjointMat_gluonField_mul l μ ν l' μ' ν' g) /-- The `W`-boson trace contraction is a gauge invariant of the expected mass weight. -/ lemma traceContraction_wField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) @@ -356,7 +375,8 @@ lemma traceContraction_wField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3 · rw [h.traceContraction_wField_mul] exact Submodule.sum_mem _ fun i _ => h.F_mul_F_mem_massWeightSubmodule l μ ν _ l' μ' ν' _ · exact (Representation.mem_invariants _ _).mpr fun g => - IsSU2BiAdjoint.repGauge_traceContraction _ g + IsSU2BiAdjoint.map_traceContraction _ + (h.isSU2BiAdjointMat_wField_mul l μ ν l' μ' ν' g) /-- The hypercharge trace contraction is a gauge invariant of the expected mass weight. -/ lemma traceContraction_hyperchargeField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) @@ -415,7 +435,8 @@ lemma traceContraction_gluonField_mul_mem_piece_zero (μ ν μ' ν' : Fin 1 ⊕ ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 := GaugeWeightDecomposition.mem_zero_of_invariant _ (Submodule.mem_inf.mp (h.traceContraction_gluonField_mul_mem_eight μ ν μ' ν')).1 - fun g => IsSU3BiAdjoint.repGauge_traceContraction _ g + fun g => IsSU3BiAdjoint.map_traceContraction _ + (h.isSU3BiAdjointMat_gluonField_mul ![] μ ν ![] μ' ν' g) /-- The trace contraction of two underived `W`-boson field strengths lies in the zero-weight piece of the gauge weight decomposition of mass weight eight. -/ @@ -424,7 +445,8 @@ lemma traceContraction_wField_mul_mem_piece_zero (μ ν μ' ν' : Fin 1 ⊕ Fin ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 := GaugeWeightDecomposition.mem_zero_of_invariant _ (Submodule.mem_inf.mp (h.traceContraction_wField_mul_mem_eight μ ν μ' ν')).1 - fun g => IsSU2BiAdjoint.repGauge_traceContraction _ g + fun g => IsSU2BiAdjoint.map_traceContraction _ + (h.isSU2BiAdjointMat_wField_mul ![] μ ν ![] μ' ν' g) /-- The trace contraction of two underived hypercharge field strengths lies in the zero-weight piece of the gauge weight decomposition of mass weight eight. -/ From a4906cca094c11eeafdca19ea651da8d35fe8dfd Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 10:58:21 +0100 Subject: [PATCH 252/254] feat: Generalize gauge arguments --- .../Invariants/IsSU2BiFundamental.lean | 345 ++++++++++++++---- .../Invariants/IsSU3BiFundamental.lean | 277 ++++++++++---- .../GaugeGroup/Invariants/IsU1BiAdjoint.lean | 312 +++++++++++++--- .../IsGaugeSector/MassWeight/BiAdjoint.lean | 39 +- 4 files changed, 761 insertions(+), 212 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean index 31edb47e5..df3df28d8 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition /-! # Gauge tensors carrying two `su(2)` fundamental indices @@ -27,20 +28,37 @@ contracted against another doublet index except through the antisymmetric symbol whose invariance is the statement that the determinant of an `SU(2)` matrix is one. The law itself is `IsSU2BiFundamentalMat`, which relates one element of `SU(2)` to one -linear map on `B` and mentions no other factor of the gauge group, and -`IsSU2BiFundamental` says only that every element of the gauge group obeys that law -through its `SU(2)` part. Everything the file proves about how the components move is -proved at the level of `IsSU2BiFundamentalMat` and instantiated afterwards, so the -mathematics here is `SU(2)` mathematics. What stays about `GaugeGroupI` is the -bookkeeping of the two decompositions: `GaugeWeightDecomposition` and -`SU2PermDecomposition` are supplied only for representations of the gauge group. - -Section A gives the transformation law, the proposition and the span of its components, -section B the epsilon contraction, which is the natural gauge invariant built from two -fundamental indices, and section C the gauge weight decomposition of the span. Section D +linear map on `B` and mentions no other factor of the gauge group. `IsSU2BiFundamental` +says that the isospin transformation `(1, U, 1)` obeys that law with the matrix of `U`, +for every `U` in `SU(2)`, and it says nothing whatever about the colour and hypercharge +factors: those may move the components as they please. So the mathematics here is `SU(2)` +mathematics twice over, in the law and in the hypothesis, and the conclusions are about +invariance under the isospin factor. + +Two things follow that are worth stating at the outset. The gauge weight decomposition +must know how all four torus generators act, and only `gaugeTorusGen 2` is an isospin +transformation, so the decomposition cannot be built for `repGauge`. It is built instead +for `repSU2 repGauge`, the isospin part of the representation, which sends the colour and +hypercharge generators to the identity and so gives them weight zero by construction +rather than by hypothesis; `gaugeWeightDecomposition_supp` still lists exactly the three +weights of the tensor square of the `su(2)` fundamental. And the epsilon contraction is +fixed by the isospin factor only, which is why `repGauge_epsilonContraction` speaks of +`repGauge (1, U, 1)`: the hypercharge factor by itself is enough to scale the contraction, +so no statement about a general gauge transformation is available. + +`repSU2` is not declared here. It is declared in `IsSU2BiAdjoint`, the file that first +needed it, and this file imports that one for it: the two constrain the same factor of the +gauge group in the same way, and a second copy of the definition in the same namespace +would collide with the first. The import is heavier than the borrowing warrants, and the +proper home for `repSU2` and its companions is a file both can lean on. + +Section A gives the transformation law, the proposition, the isospin part of a +representation and the span of the components, section B the epsilon contraction, which is +the natural isospin invariant built from two fundamental indices, and section C the gauge +weight decomposition of the span, for the isospin part of the representation. Section D grades the zero-weight piece of that decomposition by the Weyl element of the `SU(2)` factor, which the gauge weight alone cannot split, and the two gradings together leave the -epsilon contraction spanning the gauge invariants. +epsilon contraction spanning the isospin invariants. -/ @[expose] public section @@ -53,6 +71,12 @@ open Matrix ## A. Bi-fundamental `su(2)` families and the span of their components +A.1 gives the transformation law and the proposition, A.2 reads a representation of the +gauge group at the isospin factor of its argument alone, and A.3 the span of the +components. + +## A.1. The transformation law and the proposition + The transformation law carries one factor of the fundamental matrix per index, with the summed index in the row slot, exactly as `IsSU2BiAdjoint` carries one factor of `su2AdjointMatrix` per index. It is recorded by `IsSU2BiFundamentalMat`, a relation @@ -61,12 +85,13 @@ gauge group appears. It is the law obeyed by the conjugate Higgs doublet symbols `IsHiggsSector` once their hypercharge character is set aside, the Higgs symbols themselves obeying the complex conjugate law. -`IsSU2BiFundamental` then says that every gauge transformation obeys that law through its -`SU(2)` part. Since `GaugeGroupI.toSU2` is a monoid homomorphism this is an action. -Quantifying over the whole of `GaugeGroupI` is what makes the proposition say more than a -statement about a single `SU(2)` element would: an element of the colour or hypercharge -factor is sent to `1` in `SU(2)`, so those factors fix every component, and section C -reads that off as the vanishing of the colour and hypercharge coordinates of every weight. +`IsSU2BiFundamental` then says that the gauge transformation `(1, U, 1)` obeys that law +with the matrix of `U`, for every `U` in `SU(2)`. Since `U ↦ (1, U, 1)` is a monoid +homomorphism this is an action of `SU(2)`, and it is all that is assumed: a gauge +transformation with a nontrivial colour or hypercharge factor is not mentioned, and may +move the components arbitrarily. So nothing here forces the colour and hypercharge +coordinates of a weight to vanish; section C gets that instead from `repSU2`, which sends +the colour and hypercharge generators to the identity outright. -/ @@ -81,20 +106,68 @@ def IsSU2BiFundamentalMat {B : Type*} [AddCommMonoid B] [Module ℂ B] /-- A family `T` of elements of `B`, indexed by two `su(2)` fundamental indices, transforms as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge - group: every gauge transformation moves the components by its `SU(2)` part alone. -/ + group: an isospin transformation moves the components by the `SU(2)` element it is built + from. Nothing is asked of the colour or hypercharge factors. -/ structure IsSU2BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 2) → B) : Prop where - repGauge_T : ∀ g : GaugeGroupI, - IsSU2BiFundamentalMat (GaugeGroupI.toSU2 g) (repGauge g) T + repGauge_T : ∀ g : specialUnitaryGroup (Fin 2) ℂ, + IsSU2BiFundamentalMat g (repGauge (1, g, 1)) T namespace IsSU2BiFundamental set_option linter.unusedVariables false +/-! + +## A.2. The isospin part of a representation + +Reading a representation of the gauge group at the isospin factor of its argument alone +gives `repSU2`, again a representation of the whole gauge group. It is declared in +`IsSU2BiAdjoint`, the file that first needed it, and imported here rather than repeated, +along with `repSU2_apply`, `isMulRep_repSU2`, `repSU2_invariant_iff_su2` and +`repSU2_stable_iff_su2`. Every construction stated for a representation of `GaugeGroupI` +applies to it verbatim, and a bi-fundamental family for `repGauge` is a bi-fundamental +family for `repSU2 repGauge`, with the same span and the same epsilon contraction. +Invariance under it is invariance under the isospin factor, +`∀ U : SU(2), repGauge (1, U, 1) x = x`, which is exactly what the transformation law +constrains. + +`repSU2` carries the weight bookkeeping of section C and the Weyl grading of section D, +both of which ask how a gauge transformation acts and are not available for `repGauge` +itself. The statements are written with the isospin transformation `(1, U, 1)` spelled +out, so that reading one needs no unfolding, and `repSU2_invariant_iff_su2` is the bridge +between the two spellings. + +All that is added here is the reading of `repSU2` at the Weyl element, which the adjoint +file has no use for; it sits in this file's own namespace, `repSU2` itself being a +`StandardModel` declaration. + +-/ + +/-- The isospin part of a representation agrees with it at the Weyl element, which is an + isospin transformation to begin with. -/ +lemma repSU2_gaugeSU2Perm {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) : + repSU2 repGauge gaugeSU2Perm = repGauge gaugeSU2Perm := rfl + +/-! + +## A.3. The span of the components + +-/ + variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} +/-- A bi-fundamental family for a representation is a bi-fundamental family for its + isospin part: the transformation law reads only the isospin factor to begin with. The + span and the epsilon contraction do not mention the representation, so every statement + of this file transports along this and is read at the isospin factor alone. -/ +lemma toRepSU2 {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiFundamental B repGauge T) : + IsSU2BiFundamental B (repSU2 repGauge) T where + repGauge_T g := hT.repGauge_T g + /-- The span of all the components of a family indexed by two `su(2)` fundamental indices. -/ def span (T : (Fin 2 → Fin 2) → B) : Submodule ℂ B := ⨆ d, ℂ ∙ T d @@ -133,12 +206,14 @@ the antisymmetric symbol, so there is exactly one contraction to make here. That not new: Physlib writes a Levi-Civita symbol as the generalized Kronecker delta of a multi-index against the identity, which is what `euclidLeviCivita` is in four dimensions and what `epsilon` is here in two. Its invariance is the statement that the determinant of -an `SU(2)` matrix is one, and that is what makes the contraction gauge invariant. +an `SU(2)` matrix is one, and that is what makes the contraction isospin invariant. The whole section is about `SU(2)`. The contraction is built from the family alone, and its invariance is proved for an arbitrary element of `specialUnitaryGroup (Fin 2) ℂ` -acting through an arbitrary linear map; gauge invariance is that statement read at -`GaugeGroupI.toSU2 g`. +acting through an arbitrary linear map; isospin invariance is that statement read at the +isospin transformation `(1, U, 1)`. Isospin invariance is all there is: the law says +nothing about the colour and hypercharge factors, and the hypercharge factor by itself +can scale the contraction, so no statement about a general gauge transformation holds. -/ @@ -233,13 +308,22 @@ lemma map_epsilonContraction {T : (Fin 2 → Fin 2) → B} exact sum_epsilon_mul U (b 0) (b 1) rw [step, ← epsilonContraction_eq_sum] -/-- The epsilon contraction of a bi-fundamental family is gauge invariant: a gauge - transformation moves the components by its `SU(2)` part, which fixes the - contraction. -/ +/-- The epsilon contraction of a bi-fundamental family is fixed by the isospin factor: an + isospin transformation moves the components by the `SU(2)` element it is built from, + which fixes the contraction. That is all the transformation law constrains, the colour + and hypercharge factors being free to move the contraction. -/ lemma repGauge_epsilonContraction {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (U : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, U, 1) (epsilonContraction T) = epsilonContraction T := + map_epsilonContraction (hT.repGauge_T U) + +/-- The isospin part of the representation fixes the epsilon contraction, at every gauge + transformation. This is `repGauge_epsilonContraction` read through `repSU2`, and it is + what the two decompositions of sections C and D consume. -/ +lemma repSU2_epsilonContraction {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiFundamental B repGauge T) (g : GaugeGroupI) : - repGauge g (epsilonContraction T) = epsilonContraction T := - map_epsilonContraction (hT.repGauge_T g) + repSU2 repGauge g (epsilonContraction T) = epsilonContraction T := + (repSU2_invariant_iff_su2 repGauge _).2 (repGauge_epsilonContraction hT) g /-! @@ -256,9 +340,15 @@ The `SU(2)` content of the section is `map_of_diagonal`: a family moved by a dia `SU(2)` matrix has every component an eigenvector, at the product of the diagonal entries at its two indices. The torus generators enter only through `toSU2_gaugeTorusGen_apply`, which says that their `SU(2)` parts are diagonal with the characters of `fundWeight` on -the diagonal. The decomposition itself is where the gauge group is unavoidable: -`GaugeWeightDecomposition` is defined for a representation of `GaugeGroupI`, and it is -what records that the colour and hypercharge coordinates of every weight vanish. +the diagonal. + +The decomposition is for `repSU2 repGauge` and not for `repGauge` itself. A decomposition +must know how all four torus generators act, and of the four only `gaugeTorusGen 2` is an +isospin transformation, so the transformation law says nothing about the other three. The +isospin part sends them to the identity, so it fixes every component there and their +colour and hypercharge coordinates vanish for that reason. This is why +`gaugeWeightDecomposition_supp` still lists only the three weights of the tensor square of +the `su(2)` fundamental, all of them of the form `(0, 0, k, 0)`. The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra and records multiplicativity of the representation, neither of which @@ -319,14 +409,25 @@ def wtWeight (l : Fin 2 → Fin 2) : GaugeWeight := fundWeight (l 0) + fundWeigh -/ +/-- An isospin transformation built from a diagonal `SU(2)` element scales every component + of a bi-fundamental family, by the product of the diagonal entries at its two indices. + This is `map_of_diagonal` read at the transformation law. -/ +lemma repGauge_su2_of_diagonal {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (U : specialUnitaryGroup (Fin 2) ℂ) + (hU : ∀ a b : Fin 2, a ≠ b → U.1 a b = 0) (l : Fin 2 → Fin 2) : + repGauge (1, U, 1) (T l) = (U.1 (l 0) (l 0) * U.1 (l 1) (l 1)) • T l := + map_of_diagonal (hT.repGauge_T U) hU l + /-- Every component of a bi-fundamental family is a simultaneous eigenvector of the gauge - torus, at the character of the sum of the weights of its two indices. -/ -lemma repGauge_gaugeTorusGen {T : (Fin 2 → Fin 2) → B} + torus in the isospin part of the representation, at the character of the sum of the + weights of its two indices. The colour and hypercharge generators have trivial isospin + factor, so the isospin part fixes every component at those, matching the vanishing + colour and hypercharge coordinates of the weights. -/ +lemma repSU2_gaugeTorusGen {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiFundamental B repGauge T) (l : Fin 2 → Fin 2) (i : Fin 4) : - repGauge (gaugeTorusGen i) (T l) + repSU2 repGauge (gaugeTorusGen i) (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by - rw [map_of_diagonal (hT.repGauge_T (gaugeTorusGen i)) - (toSU2_gaugeTorusGen_offDiag i) l] + rw [repSU2_apply, hT.repGauge_su2_of_diagonal _ (toSU2_gaugeTorusGen_offDiag i) l] congr 1 rw [toSU2_gaugeTorusGen_apply, toSU2_gaugeTorusGen_apply, if_pos rfl, if_pos rfl, wtWeight, GaugeWeight.coord_add, zpow_add₀ expI_ne_zero] @@ -343,16 +444,23 @@ variable {B : Type*} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 2) → B} -/-- The gauge weight decomposition of the span of a bi-fundamental `su(2)` family. The - span is the join of the lines through the four components, and each of those carries the - sum of the weights of its two indices. -/ +/-- The gauge weight decomposition of the span of a bi-fundamental `su(2)` family, for the + isospin part of the representation. The span is the join of the lines through the four + components, and each of those carries the sum of the weights of its two indices. + + The decomposition is for `repSU2 repGauge` and not for `repGauge` itself because a + decomposition must know how all four torus generators act, and the transformation law + constrains only the isospin factor: of the four generators only `gaugeTorusGen 2` is an + isospin transformation. The isospin part sends the other three to the identity, so their + weights vanish by construction. -/ @[implicit_reducible] noncomputable def gaugeWeightDecomposition (hT : IsSU2BiFundamental B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge (span T) := + (hmul : IsMulRep repGauge) : + GaugeWeightDecomposition (repSU2 repGauge) (span T) := GaugeWeightDecomposition.copy - (GaugeWeightDecomposition.iSup hmul fun d : Fin 2 → Fin 2 => - GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) - (repGauge_gaugeTorusGen hT d)) + (GaugeWeightDecomposition.iSup (isMulRep_repSU2 hmul) fun d : Fin 2 → Fin 2 => + GaugeWeightDecomposition.spanSingleton (isMulRep_repSU2 hmul) (T d) (wtWeight d) + (repSU2_gaugeTorusGen hT d)) _ rfl variable (hT : IsSU2BiFundamental B repGauge T) @@ -371,7 +479,8 @@ lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : /-- The gauge weights carried by a bi-fundamental `su(2)` family: the three weights of the tensor square of the `su(2)` fundamental. Every one of them has vanishing colour and - hypercharge, since the family carries weak isospin only. -/ + hypercharge, the isospin part of the representation sending the colour and hypercharge + generators to the identity. -/ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : (hT.gaugeWeightDecomposition hmul).supp = {((0, 0, 2, 0) : GaugeWeight), (0, 0, 0, 0), (0, 0, -2, 0)} := by @@ -382,8 +491,9 @@ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : ## C.4. The zero-weight piece -A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight -piece, which makes that piece worth describing explicitly. The weight of a component is +An isospin invariant built from `T` is fixed by the isospin part of the representation at +the torus, so it lies in the zero-weight piece, which makes that piece worth describing +explicitly. The weight of a component is the sum of the isospin weights of its two indices, each `±1`, so it vanishes exactly when the two indices differ. That leaves the two mixed components, and the zero-weight piece is the plane they span, the multiplicity of the zero weight in the tensor square of the @@ -412,12 +522,12 @@ lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : · exact le_iSup_of_le ![0, 1] (le_of_eq (if_pos (by decide)).symm) · exact le_iSup_of_le ![1, 0] (le_of_eq (if_pos (by decide)).symm) -/-- The epsilon contraction lies in the zero-weight piece. It is gauge invariant, so in - particular the torus fixes it. -/ +/-- The epsilon contraction lies in the zero-weight piece. The isospin factor fixes it, so + in particular the isospin part of the representation fixes it at the torus. -/ lemma epsilonContraction_mem_piece_zero (hmul : IsMulRep repGauge) : epsilonContraction T ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := GaugeWeightDecomposition.mem_zero_of_invariant _ (epsilonContraction_mem_span T) - (repGauge_epsilonContraction hT) + (repSU2_epsilonContraction hT) end Decomposition @@ -436,13 +546,24 @@ enters as the element `su2Perm` of `specialUnitaryGroup (Fin 2) ℂ`, and the ga only through `toSU2_gaugeSU2Perm`, which says that `gaugeSU2Perm` is that element. The grading is therefore concentrated in the grades zero and two, as it must be for a -product of an even number of doublets. Grade zero is in general only a sieve, since +product of an even number of doublets. It is built for `repSU2 repGauge`, as is the gauge +weight decomposition it grades, and nothing is lost by that: `gaugeSU2Perm` is an isospin +transformation, so the isospin part of the representation acts at it exactly as the +representation itself does. Grade zero is in general only a sieve, since `SU2PermDecomposition.mem_zero_of_invariant` has no converse, but here the two gradings together are sharp: the zero-weight piece is a plane and grade zero is a line in it, so -every gauge invariant in the span of the components is a multiple of the epsilon +every isospin invariant in the span of the components is a multiple of the epsilon contraction. The ten-dimensional zero-weight piece of `IsSU3BiAdjoint` is what a sieve looks like when it is not sharp. +`mem_span_and_su2_invariant_iff` of D.3 is the classification proper. Its gauge +counterpart `mem_span_and_invariant_iff` needs the epsilon contraction to be gauge +invariant and takes that as a hypothesis: the transformation law leaves the colour and +hypercharge factors free, so they may scale the contraction, and then the multiples of it +are not gauge invariants at all. The same hypothesis is what `su2_invariant_iff_invariant` +needs to upgrade isospin invariance in the span to gauge invariance; without it that +statement is false. + -/ /-! @@ -488,24 +609,31 @@ lemma map_su2Perm_neutralTriplet {T : (Fin 2 → Fin 2) → B} abel /-- The Weyl element of the gauge group sends the first mixed component to minus the - second. -/ + second. It is an isospin transformation, so the transformation law reaches it. -/ lemma repGauge_gaugeSU2Perm_zero_one {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiFundamental B repGauge T) : repGauge gaugeSU2Perm (T ![0, 1]) = -T ![1, 0] := - map_su2Perm_zero_one (hT.repGauge_T gaugeSU2Perm) + map_su2Perm_zero_one (hT.repGauge_T su2Perm) /-- The Weyl element of the gauge group sends the second mixed component to minus the first. -/ lemma repGauge_gaugeSU2Perm_one_zero {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiFundamental B repGauge T) : repGauge gaugeSU2Perm (T ![1, 0]) = -T ![0, 1] := - map_su2Perm_one_zero (hT.repGauge_T gaugeSU2Perm) + map_su2Perm_one_zero (hT.repGauge_T su2Perm) /-- The Weyl element of the gauge group negates the neutral triplet combination. -/ lemma repGauge_gaugeSU2Perm_neutralTriplet {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiFundamental B repGauge T) : repGauge gaugeSU2Perm (neutralTriplet T) = -neutralTriplet T := - map_su2Perm_neutralTriplet (hT.repGauge_T gaugeSU2Perm) + map_su2Perm_neutralTriplet (hT.repGauge_T su2Perm) + +/-- The Weyl element of the gauge group fixes the epsilon contraction, being an isospin + transformation. -/ +lemma repGauge_gaugeSU2Perm_epsilonContraction {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + repGauge gaugeSU2Perm (epsilonContraction T) = epsilonContraction T := + repGauge_epsilonContraction hT su2Perm /-- Replacing two elements by their antisymmetric and symmetric combinations spans the same submodule, since two is invertible. -/ @@ -574,7 +702,7 @@ lemma zeroPiece_le_eigenspace (hT : IsSU2BiFundamental B repGauge T) (k : ZMod 4 rcases hcases k with rfl | rfl | rfl | rfl · rw [zeroPiece_zero, Submodule.span_singleton_le_iff_mem] exact Module.End.mem_eigenspace_iff.mpr - (by rw [su2PermSign_zero, one_smul, repGauge_epsilonContraction hT]) + (by rw [su2PermSign_zero, one_smul, repGauge_gaugeSU2Perm_epsilonContraction hT]) · rw [zeroPiece_one] exact bot_le · rw [zeroPiece_two, Submodule.span_singleton_le_iff_mem] @@ -606,42 +734,119 @@ lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : /-- The `SU(2)` permutation decomposition of the zero-weight piece of the gauge weight decomposition: the Weyl element grades the plane the gauge weight cannot split, putting - the epsilon contraction in grade zero and the neutral triplet combination in grade - two. -/ + the epsilon contraction in grade zero and the neutral triplet combination in grade two. + It is stated for the isospin part of the representation, as the decomposition it grades + is, though the two agree at the Weyl element. -/ noncomputable def zeroPieceSU2Perm (hT : IsSU2BiFundamental B repGauge T) (hmul : IsMulRep repGauge) : - SU2PermDecomposition repGauge ((hT.gaugeWeightDecomposition hmul).piece 0) where + SU2PermDecomposition (repSU2 repGauge) + ((hT.gaugeWeightDecomposition hmul).piece 0) where piece := zeroPiece T - piece_le k x hx := Module.End.mem_eigenspace_iff.mp (zeroPiece_le_eigenspace hT k hx) + piece_le k x hx := by + rw [repSU2_gaugeSU2Perm] + exact Module.End.mem_eigenspace_iff.mp (zeroPiece_le_eigenspace hT k hx) iSup_piece := hT.iSup_zeroPiece hmul /-- The pieces of the decomposition are the graded pieces. -/ @[simp] lemma zeroPieceSU2Perm_piece (hmul : IsMulRep repGauge) (k : ZMod 4) : (hT.zeroPieceSU2Perm hmul).piece k = zeroPiece T k := rfl -/-- The epsilon contraction lies in the grade zero piece: it is gauge invariant, so in - particular the Weyl element fixes it. -/ +/-- The epsilon contraction lies in the grade zero piece: the isospin factor fixes it, so + in particular the Weyl element does. -/ lemma epsilonContraction_mem_zeroPiece_zero (hT : IsSU2BiFundamental B repGauge T) (hmul : IsMulRep repGauge) : epsilonContraction T ∈ zeroPiece T 0 := SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) - (hT.epsilonContraction_mem_piece_zero hmul) (repGauge_epsilonContraction hT) + (hT.epsilonContraction_mem_piece_zero hmul) (repSU2_epsilonContraction hT) -/-- Every gauge invariant in the span of the components is a multiple of the epsilon +/-! + +## D.3. The classification + +-/ + +/-- Every isospin invariant in the span of the components is a multiple of the epsilon contraction. The gauge weight cuts the span down to the plane of the two mixed components, and the Weyl element cuts that plane down to the line through their - antisymmetric combination. -/ -lemma exists_smul_epsilonContraction_of_invariant (hT : IsSU2BiFundamental B repGauge T) - (hmul : IsMulRep repGauge) {x : B} - (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + antisymmetric combination. Only the isospin factor is used, which is all the + transformation law constrains. -/ +lemma exists_smul_epsilonContraction_of_su2_invariant + (hT : IsSU2BiFundamental B repGauge T) (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ span T) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : ∃ c : ℂ, x = c • epsilonContraction T := by + have hinv' : ∀ g : GaugeGroupI, repSU2 repGauge g x = x := + (repSU2_invariant_iff_su2 repGauge x).2 hinv have hmem : x ∈ zeroPiece T 0 := SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) - (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv') hinv' rw [zeroPiece_zero] at hmem obtain ⟨c, hc⟩ := Submodule.mem_span_singleton.1 hmem exact ⟨c, hc.symm⟩ +/-- Every gauge invariant in the span of the components is a multiple of the epsilon + contraction. A gauge invariant is in particular fixed by the transformations trivial on + colour and hypercharge, and those alone already force the conclusion. -/ +lemma exists_smul_epsilonContraction_of_invariant (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, x = c • epsilonContraction T := + hT.exists_smul_epsilonContraction_of_su2_invariant hmul hx fun U => hinv (1, U, 1) + +/-- The isospin invariants in the span of the components are exactly the multiples of the + epsilon contraction. The gauge weight and the Weyl element bound them from above, and + the epsilon contraction is itself isospin invariant and in the span, which bounds them + from below. This is the one singlet of `2 ⊗ 2`. -/ +lemma mem_span_and_su2_invariant_iff (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) (x : B) : + (x ∈ span T ∧ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) + ↔ x ∈ ℂ ∙ epsilonContraction T := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_epsilonContraction_of_su2_invariant hmul h.1 h.2 + exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ + · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx + exact ⟨Submodule.smul_mem _ _ (epsilonContraction_mem_span T), + fun U => by rw [map_smul, repGauge_epsilonContraction hT]⟩ + +/-- The gauge invariants in the span of the components are exactly the multiples of the + epsilon contraction, once the epsilon contraction is known to be gauge invariant. That + hypothesis cannot be dropped: the transformation law says nothing about the colour and + hypercharge factors, and the hypercharge factor by itself can scale the contraction, + after which the right-hand side has invariants that the left-hand side has not. Where + the two factors do fix it, as they do for a product of a Higgs doublet with its + conjugate, the hypothesis is supplied from the transformation law of the underlying + field. -/ +lemma mem_span_and_invariant_iff (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) (x : B) + (hec : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction T) = epsilonContraction T) : + (x ∈ span T ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ x ∈ ℂ ∙ epsilonContraction T := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_epsilonContraction_of_invariant hmul h.1 h.2 + exact Submodule.mem_span_singleton.2 ⟨c, rfl⟩ + · obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hx + exact ⟨Submodule.smul_mem _ _ (epsilonContraction_mem_span T), + fun g => by rw [map_smul, hec]⟩ + +/-- Inside the span of the components the two notions of invariance agree, provided the + epsilon contraction is gauge invariant: a vector fixed by the isospin factor is then + fixed by the whole gauge group. One direction is free, an isospin transformation being a + gauge transformation; the other is the classification, the isospin invariants being + multiples of the epsilon contraction. The hypothesis `hec` is exactly what the + transformation law no longer supplies, and without it the statement is false, the colour + and hypercharge factors being unconstrained. -/ +lemma su2_invariant_iff_invariant (hT : IsSU2BiFundamental B repGauge T) + (hmul : IsMulRep repGauge) + (hec : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction T) = epsilonContraction T) + {x : B} (hx : x ∈ span T) : + (∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) + ↔ ∀ g : GaugeGroupI, repGauge g x = x := by + refine ⟨fun h g => ?_, fun h U => h (1, U, 1)⟩ + obtain ⟨c, rfl⟩ := hT.exists_smul_epsilonContraction_of_su2_invariant hmul hx h + rw [map_smul, hec] + end Grading end IsSU2BiFundamental diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean index 05c796259..699f246b8 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint /-! # Gauge tensors carrying two `su(3)` fundamental indices @@ -15,6 +16,14 @@ fundamental indices and valued in a module `B` carrying a representation of the group `GaugeGroupI`, transforms as a tensor `T^{a₁ a₂}` in the `su(3)` factor of the fundamental representation. +The transformation law itself is `IsSU3BiFundamentalMat`, which relates one element of +`SU(3)` to one linear map on `B` and mentions no other factor of the gauge group. +`IsSU3BiFundamental` says that the colour transformation `(U, 1, 1)` obeys that law with +the matrix of `U`, for every `U` in `SU(3)`, and it says nothing whatever about the isospin +and hypercharge factors: those may move the components as they please. So the mathematics +here is `SU(3)` mathematics twice over, in the law and in the hypothesis, and the +conclusions are about invariance under the colour factor. + This is the colour analogue of `IsSU2BiFundamental`, and the two files agree until the moment an invariant is asked for. Two `su(2)` doublet indices can be contracted, through the antisymmetric symbol `ε`, because the doublet is pseudo-real. Two colour triplet @@ -23,13 +32,22 @@ fundamental indices, and `δ^a_b`, which needs one fundamental index and one anti-fundamental one; `3 ⊗ 3 = 6 ⊕ 3̄` contains no singlet. So the analogue of `epsilonContraction` is not merely missing from this file: it does not exist. -Section A gives the proposition and the span of its components. Section B replaces the -epsilon contraction of the doublet case by the theorem that stands in its place: the centre -`ℤ₃` of `SU(3)` scales a two-index tensor by `ω²`, so an invariant pairing of two colour -triplet indices vanishes, and so does every gauge invariant in the span of the components. -Section C is the gauge weight decomposition of the span, and it reaches the same conclusion -from the torus alone: no sum of two colour weights of the triplet vanishes, so the -zero-weight piece is `⊥`. +Section A gives the transformation law, the proposition and the span of its components. +Section B replaces the epsilon contraction of the doublet case by the theorem that stands +in its place: the centre `ℤ₃` of `SU(3)` scales a two-index tensor by `ω²`, so an invariant +pairing of two colour triplet indices vanishes, and so does every element of the span that +the colour factor fixes. Section C is the gauge weight decomposition of the span, and it +reaches the same conclusion from the colour torus alone: no sum of two colour weights of +the triplet vanishes, so the zero-weight piece is `⊥`. + +That decomposition is for `repSU3 repGauge`, the colour part of the representation, which +is defined where the bi-adjoint case needs it, in `IsSU3BiAdjoint`, and imported here. A +decomposition must say how all four torus generators act, and of the four only +`gaugeTorusGen 0` and `gaugeTorusGen 1` are colour transformations, so the transformation +law says nothing about the other two. The colour part sends them to the identity, so their +weights vanish by construction rather than by hypothesis, and +`gaugeWeightDecomposition_supp` still lists the same six weights, all of the form +`(m, n, 0, 0)`. There is no section D. The `SU(2)` file grades its zero-weight piece by the Weyl element because the gauge weight leaves a plane it cannot split; here the gauge weight leaves @@ -46,30 +64,66 @@ open Matrix ## A. Bi-fundamental `su(3)` families and the span of their components -The transformation law carries one factor of the fundamental matrix `GaugeGroupI.toSU3 g` -per index, with the summed index in the row slot, exactly as `IsSU2BiFundamental` carries -one factor of `GaugeGroupI.toSU2 g` per index. Since `toSU3` is a monoid homomorphism this -is an action. It is the `SU(3)` factor alone, and is the law obeyed by a product of two -colour triplet symbols once their weak isospin and hypercharge characters are set aside. +-/ + +/-! + +## A.1. The transformation law and the proposition -The element `g` still ranges over the whole of `GaugeGroupI`, and that is what makes the -proposition say more than a statement about `SU(3)` would. The right-hand side sees only -`GaugeGroupI.toSU3 g`, so taking `g` in the weak isospin or hypercharge factor forces that -factor to fix every component. Section C reads that off as the vanishing of the isospin and -hypercharge coordinates of every weight, and `GaugeWeightDecomposition` is stated for -representations of `GaugeGroupI`, which a bare `SU(3)` representation cannot supply. +The transformation law carries one factor of the fundamental matrix per index, with the +summed index in the row slot, exactly as `IsSU2BiFundamental` carries one factor of the +`SU(2)` fundamental matrix per index. It is recorded by `IsSU3BiFundamentalMat`, a relation +between one element of `SU(3)` and one linear map on `B`, in which no other factor of the +gauge group appears. It is the law obeyed by a product of two colour triplet symbols once +their weak isospin and hypercharge characters are set aside. + +`IsSU3BiFundamental` then says that the colour transformation `(U, 1, 1)` obeys that law +with the matrix of `U`, for every `U` in `SU(3)`. Since `U ↦ (U, 1, 1)` is a monoid +homomorphism this is an action of `SU(3)`, and it is all that is assumed: a gauge +transformation with a nontrivial isospin or hypercharge factor is not mentioned, and may +move the components arbitrarily. Nothing here forces the isospin and hypercharge +coordinates of a weight to vanish; section C gets that instead from `repSU3`, which sends +the isospin and hypercharge generators to the identity outright. -/ +/-- The linear map `f` moves the components of the family `T` as the `SU(3)` matrix `U` + moves a tensor with two fundamental indices: one factor of `U` per index, with the + summed index in the row slot. -/ +def IsSU3BiFundamentalMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 3) ℂ) (f : B →ₗ[ℂ] B) + (T : (Fin 2 → Fin 3) → B) : Prop := + ∀ l : Fin 2 → Fin 3, + f (T l) = ∑ a : Fin 2 → Fin 3, (∏ i : Fin 2, U.1 (a i) (l i)) • T a + /-- A family `T` of elements of `B`, indexed by two `su(3)` fundamental indices, transforms as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge - group. -/ + group: a colour transformation moves the components by the `SU(3)` element it is built + from. Nothing is asked of the isospin or hypercharge factors. -/ structure IsSU3BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 3) → B) : Prop where - repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 3), - repGauge g (T l) = ∑ a : Fin 2 → Fin 3, - (∏ i : Fin 2, (GaugeGroupI.toSU3 g).1 (a i) (l i)) • T a + repGauge_T : ∀ g : specialUnitaryGroup (Fin 3) ℂ, + IsSU3BiFundamentalMat g (repGauge (g, 1, 1)) T + +/-! + +## A.2. The colour part of a representation, and the span + +Reading a representation of the gauge group at the colour factor of its argument alone +gives `repSU3`, again a representation of the whole gauge group; it is defined in +`IsSU3BiAdjoint`, together with `repSU3_apply`, `isMulRep_repSU3`, the bridge +`repSU3_invariant_iff_su3` between invariance under it and invariance under the colour +factor, and the stability bridge `repSU3_stable_iff_su3`. A bi-fundamental family for +`repGauge` is a bi-fundamental family for `repSU3 repGauge`, with the same span, which is +`toRepSU3`. + +That transport is what carries section C, whose gauge weight decomposition needs a +representation of the whole gauge group knowing all four torus generators, something the +transformation law cannot supply. The statements themselves are written with the colour +transformation `(U, 1, 1)` spelled out, so that reading one needs no unfolding. + +-/ namespace IsSU3BiFundamental set_option linter.unusedVariables false @@ -79,6 +133,14 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {T : (Fin 2 → Fin 3) → B} (hT : IsSU3BiFundamental B repGauge T) +/-- A bi-fundamental family for a representation is a bi-fundamental family for its colour + part: the transformation law reads only the colour factor to begin with. The span does + not mention the representation, so every statement of this file transports along this and + is read at the colour factor alone. -/ +lemma toRepSU3 (hT : IsSU3BiFundamental B repGauge T) : + IsSU3BiFundamental B (repSU3 repGauge) T where + repGauge_T g := hT.repGauge_T g + /-- The span of all the components. -/ def span (hT : IsSU3BiFundamental B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d @@ -123,9 +185,12 @@ one forces `3 ∣ k`, and `k = 2` fails. This is triality: a colour singlet is b three quarks, or from a quark and an antiquark, never from two quarks. The same element settles the question for the family itself, with no hypothesis beyond the -transformation law: every gauge invariant in the span of the components is zero. Section C -reaches that conclusion again from the gauge torus alone, at the price of the extra -assumptions that a gauge weight decomposition carries. +transformation law: every element of the span of the components that the colour factor +fixes is zero. The centre is a colour element, so the argument sees only what the +transformation law constrains, and the conclusion is drawn from invariance under the colour +factor alone rather than under the whole gauge group. Section C reaches that conclusion +again from the gauge torus alone, at the price of the extra assumptions that a gauge weight +decomposition carries. -/ @@ -155,7 +220,7 @@ lemma su3Centre_apply (a b : Fin 3) : fin_cases a <;> fin_cases b <;> simp [su3Centre] /-- The generator of the centre `ℤ₃` of the colour factor, as an element of the gauge - group. -/ + group: the colour transformation `(su3Centre, 1, 1)`. -/ noncomputable def gaugeSU3Centre : GaugeGroupI := ⟨su3Centre, 1, 1⟩ /-- The colour part of the central gauge element is the central element of `SU(3)`. -/ @@ -205,42 +270,60 @@ lemma eq_zero_of_sum_mul_prod (c : (Fin 2 → Fin 3) → ℂ) · exact absurd (sub_eq_zero.1 h1) su3Omega_pow_two_ne_one · exact h1 -/-- The centre of the colour factor scales every component of a bi-fundamental family by - `ω ^ 2`, one factor of `ω` for each of its two colour indices. -/ -lemma repGauge_gaugeSU3Centre (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 → Fin 3) : - repGauge gaugeSU3Centre (T l) = (su3Omega ^ 2) • T l := by - rw [hT.repGauge_T gaugeSU3Centre l, Finset.sum_eq_single l] - · rw [Fin.prod_univ_two, toSU3_gaugeSU3Centre, su3Centre_apply, su3Centre_apply, - if_pos rfl, if_pos rfl, sq] +/-- Any linear map moving the components of a bi-fundamental family by the central element + scales every one of them by `ω ^ 2`, one factor of `ω` for each of its two colour + indices. -/ +lemma map_su3Centre {f : B →ₗ[ℂ] B} (hf : IsSU3BiFundamentalMat su3Centre f T) + (l : Fin 2 → Fin 3) : f (T l) = (su3Omega ^ 2) • T l := by + rw [hf l, Finset.sum_eq_single l] + · rw [Fin.prod_univ_two, su3Centre_apply, su3Centre_apply, if_pos rfl, if_pos rfl, sq] · intro a _ hal have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by by_contra hc simp only [not_or, ne_eq, not_not] at hc exact hal (funext fun j => by fin_cases j <;> simp [hc.1, hc.2]) - rw [Fin.prod_univ_two, toSU3_gaugeSU3Centre, su3Centre_apply, su3Centre_apply] + rw [Fin.prod_univ_two, su3Centre_apply, su3Centre_apply] rcases h with h | h · rw [if_neg h, zero_mul, zero_smul] · rw [if_neg h, mul_zero, zero_smul] · intro hl exact absurd (Finset.mem_univ l) hl -/-- Every gauge invariant in the span of the components of a bi-fundamental family - vanishes. The central element scales the whole span by `ω ^ 2`, an invariant element is - fixed as well, and `ω ^ 2 - 1` is not zero. -/ -lemma eq_zero_of_invariant (hT : IsSU3BiFundamental B repGauge T) {x : B} - (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x = 0 := by - obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx - have hscale : repGauge gaugeSU3Centre (∑ d, c d • T d) = (su3Omega ^ 2) • ∑ d, c d • T d := by +/-- The centre of the colour factor scales every component of a bi-fundamental family by + `ω ^ 2`. This is `map_su3Centre` read at the colour transformation the transformation + law speaks about. -/ +lemma repGauge_su3Centre (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 → Fin 3) : + repGauge (su3Centre, 1, 1) (T l) = (su3Omega ^ 2) • T l := + map_su3Centre (hT.repGauge_T su3Centre) l + +/-- Any linear map moving the components of a bi-fundamental family by the central element + and fixing a linear combination of them kills that combination: it scales the whole span + by `ω ^ 2`, and `ω ^ 2 - 1` is not zero. -/ +lemma eq_zero_of_map_su3Centre_invariant {f : B →ₗ[ℂ] B} + (hf : IsSU3BiFundamentalMat su3Centre f T) (c : (Fin 2 → Fin 3) → ℂ) + (hinv : f (∑ d, c d • T d) = ∑ d, c d • T d) : ∑ d, c d • T d = 0 := by + have hscale : f (∑ d, c d • T d) = (su3Omega ^ 2) • ∑ d, c d • T d := by rw [map_sum, Finset.smul_sum] refine Finset.sum_congr rfl fun d _ => ?_ - rw [map_smul, hT.repGauge_gaugeSU3Centre d, smul_comm] - rw [hinv gaugeSU3Centre] at hscale + rw [map_smul, map_su3Centre hf d, smul_comm] + rw [hinv] at hscale have h0 : (su3Omega ^ 2 - 1) • (∑ d, c d • T d) = 0 := by rw [sub_smul, one_smul, ← hscale, sub_self] have hne : su3Omega ^ 2 - 1 ≠ 0 := sub_ne_zero.2 su3Omega_pow_two_ne_one have := congrArg (fun y => (su3Omega ^ 2 - 1)⁻¹ • y) h0 simpa [inv_smul_smul₀ hne] using this +/-- Every element of the span of the components of a bi-fundamental family that the colour + factor fixes vanishes. The central element scales the whole span by `ω ^ 2`, an element + the colour factor fixes is scaled by one as well, and `ω ^ 2 - 1` is not zero. The centre + is a colour element, so the hypothesis asks for invariance under the colour factor alone, + and invariance under the whole gauge group is a special case of it. -/ +lemma eq_zero_of_invariant (hT : IsSU3BiFundamental B repGauge T) {x : B} + (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : x = 0 := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx + exact eq_zero_of_map_su3Centre_invariant (hT.repGauge_T su3Centre) c (hinv su3Centre) + end IsSU3BiFundamental /-! @@ -255,6 +338,14 @@ already the join of nine weight lines. Six weights occur: the three weights of t symmetric `6` that are not shared, and the three weights of the `3̄`, each of which occurs twice, once from the `6` and once from the `3̄`. +The decomposition is for `repSU3 repGauge` and not for `repGauge` itself, because a +decomposition must know how all four torus generators act, and the transformation law +constrains only the colour factor: of the four generators only `gaugeTorusGen 0` and +`gaugeTorusGen 1` are colour transformations. The colour part sends the other two to the +identity, so their weights vanish by construction. This is why +`gaugeWeightDecomposition_supp` still lists only the six weights of the tensor square of +the `su(3)` fundamental, all of them of the form `(m, n, 0, 0)`. + The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra and records multiplicativity of the representation, neither of which `IsSU3BiFundamental` needs, so both appear as extra arguments here. @@ -300,13 +391,14 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 3) → B} -/-- Every component of a bi-fundamental family is a simultaneous eigenvector of the gauge - torus, at the character of the sum of the weights of its two indices. -/ -lemma repGauge_gaugeTorusGen (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 → Fin 3) - (i : Fin 4) : - repGauge (gaugeTorusGen i) (T l) - = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by - rw [hT.repGauge_T (gaugeTorusGen i) l, Finset.sum_eq_single l] +/-- Any linear map moving the components of a bi-fundamental family by the colour part of + a torus generator scales every one of them by the character of the sum of the weights of + its two indices. -/ +lemma map_gaugeTorusGen {f : B →ₗ[ℂ] B} {i : Fin 4} + (hf : IsSU3BiFundamentalMat (GaugeGroupI.toSU3 (gaugeTorusGen i)) f T) + (l : Fin 2 → Fin 3) : + f (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by + rw [hf l, Finset.sum_eq_single l] · congr 1 rw [Fin.prod_univ_two, toSU3_gaugeTorusGen_apply, toSU3_gaugeTorusGen_apply, if_pos rfl, if_pos rfl, wtWeight, GaugeWeight.coord_add, @@ -323,6 +415,24 @@ lemma repGauge_gaugeTorusGen (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 · intro hl exact absurd (Finset.mem_univ l) hl +/-- Every component of a bi-fundamental family is a simultaneous eigenvector of the gauge + torus for the colour part of the representation, at the character of the sum of the + weights of its two indices. -/ +lemma repSU3_gaugeTorusGen (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 → Fin 3) + (i : Fin 4) : + repSU3 repGauge (gaugeTorusGen i) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := + map_gaugeTorusGen (hT.repGauge_T (GaugeGroupI.toSU3 (gaugeTorusGen i))) l + +/-- The colour part of a torus generator scales every component of a bi-fundamental family + by the character of the sum of the weights of its two indices. This is + `repSU3_gaugeTorusGen` with the colour transformation spelled out. -/ +lemma repGauge_gaugeTorusGen (hT : IsSU3BiFundamental B repGauge T) (l : Fin 2 → Fin 3) + (i : Fin 4) : + repGauge (GaugeGroupI.toSU3 (gaugeTorusGen i), 1, 1) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := + hT.repSU3_gaugeTorusGen l i + end Weights /-! @@ -339,16 +449,22 @@ variable {B : Type*} [Ring B] [Algebra ℂ B] variable (hT : IsSU3BiFundamental B repGauge T) -/-- The gauge weight decomposition of the span of a bi-fundamental `su(3)` family. The span - is the join of the lines through the nine components, and each of those carries the sum of - the weights of its two indices. -/ +/-- The gauge weight decomposition of the span of a bi-fundamental `su(3)` family, for the + colour part of the representation. The span is the join of the lines through the nine + components, and each of those carries the sum of the weights of its two indices. + + The decomposition is for `repSU3 repGauge` and not for `repGauge` itself because a + decomposition must know how all four torus generators act, and the transformation law + constrains only the colour factor: of the four generators only `gaugeTorusGen 0` and + `gaugeTorusGen 1` are colour transformations. The colour part sends the other two to the + identity, so their weights vanish by construction. -/ @[implicit_reducible] noncomputable def gaugeWeightDecomposition (hT : IsSU3BiFundamental B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge hT.span := + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition (repSU3 repGauge) hT.span := GaugeWeightDecomposition.copy - (GaugeWeightDecomposition.iSup hmul fun d : Fin 2 → Fin 3 => - GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) - (hT.repGauge_gaugeTorusGen d)) + (GaugeWeightDecomposition.iSup (isMulRep_repSU3 hmul) fun d : Fin 2 → Fin 3 => + GaugeWeightDecomposition.spanSingleton (isMulRep_repSU3 hmul) (T d) (wtWeight d) + (hT.repSU3_gaugeTorusGen d)) _ rfl /-- The pieces of the decomposition: the weight-`w` piece is the join of the lines through @@ -365,7 +481,8 @@ lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : /-- The gauge weights carried by a bi-fundamental `su(3)` family: the six weights of the tensor square of the `su(3)` fundamental, three of them carried twice. Every one of them - has vanishing weak isospin and hypercharge, since the family carries colour only. -/ + has vanishing weak isospin and hypercharge, the colour part of the representation sending + the isospin and hypercharge generators to the identity. -/ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : (hT.gaugeWeightDecomposition hmul).supp = {((2, 0, 0, 0) : GaugeWeight), (-2, 2, 0, 0), (0, -2, 0, 0), @@ -377,13 +494,13 @@ lemma gaugeWeightDecomposition_supp (hmul : IsMulRep repGauge) : ## C.4. The zero-weight piece is trivial -A gauge invariant built from `T` is fixed by the torus, so it lies in the zero-weight -piece, and here that piece is `⊥`. The weight of a component is the sum of two colour -weights of the triplet, and no such sum vanishes: the three colour weights are nonzero, and -no one of them is the negative of another, since the negatives of the triplet weights are -the weights of the antitriplet. That is the weight-theoretic form of the statement that -`3 ⊗ 3` contains no singlet, and it recovers the conclusion of section B for a -representation that carries a gauge weight decomposition. +A colour invariant built from `T` is fixed by the colour part of the representation at the +torus, so it lies in the zero-weight piece, and here that piece is `⊥`. The weight of a +component is the sum of two colour weights of the triplet, and no such sum vanishes: the +three colour weights are nonzero, and no one of them is the negative of another, since the +negatives of the triplet weights are the weights of the antitriplet. That is the +weight-theoretic form of the statement that `3 ⊗ 3` contains no singlet, and it recovers +the conclusion of section B for a representation that carries a gauge weight decomposition. -/ @@ -401,12 +518,14 @@ lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : refine le_antisymm (iSup_le fun d => ?_) bot_le rw [if_neg fun h => wtWeight_ne_zero d h.symm] -/-- The gauge torus alone already forbids an invariant: an element of the span fixed by - the four torus generators is zero. Compared with `eq_zero_of_invariant` this asks less of - the element, invariance under the torus rather than under the whole gauge group, and more - of `B`, which has to carry a gauge weight decomposition. -/ +/-- The gauge torus alone already forbids an invariant: an element of the span fixed by the + colour parts of the four torus generators is zero. Compared with `eq_zero_of_invariant` + this asks less of the element, invariance under the torus rather than under the whole + colour factor, and more of `B`, which has to carry a gauge weight decomposition. -/ lemma eq_zero_of_gaugeTorusGen_invariant (hmul : IsMulRep repGauge) {x : B} - (hx : x ∈ hT.span) (hinv : ∀ i : Fin 4, repGauge (gaugeTorusGen i) x = x) : x = 0 := by + (hx : x ∈ hT.span) + (hinv : ∀ i : Fin 4, repGauge (GaugeGroupI.toSU3 (gaugeTorusGen i), 1, 1) x = x) : + x = 0 := by have hmem : x ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := by rw [GaugeWeightDecomposition.piece_eq_inf] refine ⟨hx, Submodule.mem_iInf _ |>.mpr fun i => ?_⟩ @@ -415,6 +534,24 @@ lemma eq_zero_of_gaugeTorusGen_invariant (hmul : IsMulRep repGauge) {x : B} rw [hT.gaugeWeightDecomposition_piece_zero hmul] at hmem exact (Submodule.mem_bot ℂ).mp hmem +/-- The two colour torus generators alone already forbid an invariant: an element of the + span fixed by both is zero. The isospin and hypercharge generators are trivial on colour, + so the colour part of the representation fixes everything at them and they ask for + nothing. -/ +lemma eq_zero_of_colourTorus_invariant (hmul : IsMulRep repGauge) {x : B} + (hx : x ∈ hT.span) (h₀ : repGauge (su3ExpIOne, 1, 1) x = x) + (h₁ : repGauge (su3ExpITwo, 1, 1) x = x) : x = 0 := by + have hone : repGauge ((1 : specialUnitaryGroup (Fin 3) ℂ), 1, 1) x = x := by + rw [show ((1 : specialUnitaryGroup (Fin 3) ℂ), (1 : specialUnitaryGroup (Fin 2) ℂ), + (1 : unitary ℂ)) = (1 : GaugeGroupI) from rfl, map_one] + rfl + refine hT.eq_zero_of_gaugeTorusGen_invariant hmul hx fun i => ?_ + fin_cases i + · exact h₀ + · exact h₁ + · exact hone + · exact hone + end Decomposition end IsSU3BiFundamental diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean index a5eb4283e..c9dea5bad 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Mathlib.RepresentationTheory.Invariants /-! # Gauge tensors carrying two `u(1)` adjoint indices @@ -17,14 +18,32 @@ representation. This is the gauge analogue of `IsQuadLorentz`. The field strength of the `B` boson carries one `u(1)` adjoint index, so a product of two field strengths carries two, and -the proposition here records how such a product transforms. The `u(1)` factor is -one dimensional and the adjoint action of the gauge group on it is trivial, so this -proposition says that the components of `T` are already gauge invariant. - -Section A gives the proposition and the span of its components, section B the -orthogonality of the `u(1)` block of `adjointMatrix`, section C the trace -contraction, which is the natural gauge invariant built from two adjoint indices, and -section D the gauge invariance of every element of the span. +the proposition here records how such a product transforms. + +The transformation law itself is `IsU1BiAdjointMat`, which relates one element of `U(1)` +to one linear map on `B` and mentions no other factor of the gauge group, through +`u1AdjointMatrix`, the adjoint matrix of a `U(1)` element alone. `IsU1BiAdjoint` says +that the hypercharge transformation `(1, 1, u)` obeys that law with the matrix of `u`, +for every `u` in `U(1)`, and it says nothing whatever about the colour and isospin +factors: those may move the components as they please. + +The `u(1)` factor is abelian and one dimensional, so its adjoint action is trivial: +`u1AdjointMatrix` is the one by one matrix `1`, and the law reduces to `f (T l) = T l`. +So the components of `T`, and every element of their span, are fixed by the hypercharge +factor. What is no longer claimed is that they are fixed by the colour and isospin +factors, about which the law says nothing; the statements that need that, here +`span_le_invariants`, take the law at every gauge element as an explicit hypothesis, +in the way that `htc` is a hypothesis in `IsSU2BiAdjoint` and `IsSU3BiAdjoint`. The +hypothesis-free form is `span_le_repU1_invariants`, for `repU1 repGauge`, the +hypercharge part of the representation, which sends the colour and isospin factors to +the identity outright. + +Section A gives the adjoint matrix of the `U(1)` factor, the transformation law, the +span of the components and the hypercharge part of a representation, section B the +orthogonality of the `u(1)` block of `adjointMatrix`, section C the trace contraction, +which is the natural invariant built from two adjoint indices, and section D the +invariance of the span, under the hypercharge factor outright and under the whole gauge +group once the law is known at every gauge element. -/ @[expose] public section @@ -35,19 +54,166 @@ open Matrix /-! -## A. Bi-adjoint `u(1)` families and the span of their components +## A. The `U(1)` adjoint matrix and bi-adjoint families + +A `u(1)` adjoint index is acted on by the `U(1)` factor of the gauge group alone. That +action is recorded in A.1 as `u1AdjointMatrix`, a matrix built from an element of `U(1)` +and nothing else, A.2 phrases the transformation law through it, so that no other factor +of the gauge group appears in the law nor in the hypothesis, and A.3 reads a +representation of the gauge group at its hypercharge factor alone. + +## A.1. The adjoint matrix of the `U(1)` factor + +The `u(1)` factor is abelian, so it acts trivially on its own algebra and the matrix is +the one by one matrix `1`, whatever the element of `U(1)`. It is the `u(1)` block of +`GaugeAlgebra.adjointMatrix`, definitionally so, and its single row is of unit length. + +-/ + +/-- The adjoint matrix of an element of `U(1)`: the one by one matrix `1`, the `u(1)` + factor being abelian and so acting trivially on its own algebra. -/ +def u1AdjointMatrix (_u : unitary ℂ) : Matrix (Fin 1) (Fin 1) ℝ := Matrix.of fun _ _ => 1 + +/-- The single entry of the adjoint matrix of an element of `U(1)` is `1`. -/ +@[simp] +lemma u1AdjointMatrix_apply (u : unitary ℂ) (i j : Fin 1) : + u1AdjointMatrix u i j = 1 := rfl + +/-- The adjoint matrix of the `U(1)` factor of a gauge group element is the `u(1)` block + of the adjoint matrix of the gauge algebra. -/ +lemma u1AdjointMatrix_toU1 (g : GaugeGroupI) (i j : Fin 1) : + u1AdjointMatrix (GaugeGroupI.toU1 g) i j + = GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr i)) (Sum.inr (Sum.inr j)) := rfl + +/-- The rows of the adjoint matrix of an element of `U(1)` are orthonormal: there is a + single row and it is of unit length. -/ +lemma sum_u1AdjointMatrix_row_mul (u : unitary ℂ) (c d : Fin 1) : + ∑ a : Fin 1, u1AdjointMatrix u c a * u1AdjointMatrix u d a = if c = d then 1 else 0 := by + rw [Subsingleton.elim c d] + simp + +/-! + +## A.2. Bi-adjoint `u(1)` families and the span of their components + +The transformation law carries one factor of `u1AdjointMatrix` per index, with the summed +index in the row slot, exactly as `IsSU2BiAdjoint` carries one factor of the `SU(2)` +adjoint matrix per index. It is recorded by `IsU1BiAdjointMat`, a relation between one +element of `U(1)` and one linear map on `B` in which no other factor of the gauge group +appears, and it is the law obeyed by the hypercharge field strengths of `IsGaugeSector`. + +Since the matrix is `1` and there is a single family of two `u(1)` indices, the law says +no more and no less than that the map fixes each component, which is +`isU1BiAdjointMat_iff`. + +`IsU1BiAdjoint` then says that the gauge transformation `(1, 1, u)` obeys that law with +the matrix of `u`, for every `u` in `U(1)`. Since `u ↦ (1, 1, u)` is a monoid +homomorphism this is an action of `U(1)`, and it is all that is assumed: a gauge +transformation with a nontrivial colour or isospin factor is not mentioned, and may move +the components arbitrarily. -/ +/-- The linear map `f` moves the components of the family `T` as the `U(1)` element `u` + moves a tensor with two adjoint indices: one factor of `u1AdjointMatrix u` per index, + with the summed index in the row slot. -/ +def IsU1BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (u : unitary ℂ) (f : B →ₗ[ℂ] B) + (T : (Fin 2 → Fin 1) → B) : Prop := + ∀ l : Fin 2 → Fin 1, + f (T l) = ∑ a : Fin 2 → Fin 1, + (∏ i : Fin 2, ((u1AdjointMatrix u (a i) (l i) : ℝ) : ℂ)) • T a + +/-- The `u(1)` transformation law says exactly that the map fixes every component: the + adjoint matrix is `1`, and there is a single family of two `u(1)` indices to sum + over. -/ +lemma isU1BiAdjointMat_iff {B : Type*} [AddCommMonoid B] [Module ℂ B] + (u : unitary ℂ) (f : B →ₗ[ℂ] B) (T : (Fin 2 → Fin 1) → B) : + IsU1BiAdjointMat u f T ↔ ∀ l : Fin 2 → Fin 1, f (T l) = T l := by + refine forall_congr' fun l => ?_ + rw [Fintype.sum_unique, Subsingleton.elim (default : Fin 2 → Fin 1) l] + simp + +/-- A linear map obeying the `u(1)` transformation law fixes every component of the + family, the adjoint action of the `u(1)` factor being trivial. -/ +lemma IsU1BiAdjointMat.map_T {B : Type*} [AddCommMonoid B] [Module ℂ B] {u : unitary ℂ} + {f : B →ₗ[ℂ] B} {T : (Fin 2 → Fin 1) → B} (hf : IsU1BiAdjointMat u f T) + (l : Fin 2 → Fin 1) : f (T l) = T l := + (isU1BiAdjointMat_iff u f T).1 hf l + /-- A family `T` of elements of `B`, indexed by two `u(1)` adjoint indices, transforms - as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group. -/ + as a tensor `T^{a₁ a₂}` under the representation `repGauge` of the gauge group: a + hypercharge transformation moves the components by the `U(1)` element it is built from. + Nothing is asked of the colour or isospin factors. -/ structure IsU1BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 1) → B) : Prop where - repGauge_T : ∀ (g : GaugeGroupI) (l : Fin 2 → Fin 1), - repGauge g (T l) = ∑ a : Fin 2 → Fin 1, - (∏ i : Fin 2, ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr (a i))) - (Sum.inr (Sum.inr (l i))) : ℝ) : ℂ)) • T a + repGauge_T : ∀ g : unitary ℂ, IsU1BiAdjointMat g (repGauge (1, 1, g)) T + +/-! + +## A.3. The hypercharge part of a representation + +Reading a representation of the gauge group at the hypercharge factor of its argument +alone gives `repU1`, again a representation of the whole gauge group. Every construction +stated for a representation of `GaugeGroupI` therefore applies to it verbatim, and a +bi-adjoint family for `repGauge` is a bi-adjoint family for `repU1 repGauge`, with the +same span and the same trace contraction. Invariance under it is invariance under the +hypercharge factor, `∀ u : U(1), repGauge (1, 1, u) x = x`, which is exactly what the +transformation law constrains. + +The statements of section D are written with the hypercharge transformation `(1, 1, u)` +spelled out, so that reading one needs no unfolding, and `repU1_invariant_iff_u1` is the +bridge between the two spellings. + +-/ + +/-- The hypercharge part of a representation of the gauge group: the representation + reading only the `U(1)` factor of its argument and sending the colour and isospin + factors to the identity. -/ +noncomputable def repU1 {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) : Representation ℂ GaugeGroupI B where + toFun g := repGauge (1, 1, GaugeGroupI.toU1 g) + map_one' := by + have h1 : ((1, 1, GaugeGroupI.toU1 1) : GaugeGroupI) = 1 := by + simp [Prod.ext_iff] + rw [h1, map_one] + map_mul' g h := by + have hgh : ((1, 1, GaugeGroupI.toU1 (g * h)) : GaugeGroupI) + = ((1, 1, GaugeGroupI.toU1 g) : GaugeGroupI) * (1, 1, GaugeGroupI.toU1 h) := by + simp [map_mul] + rw [hgh, map_mul] + +/-- The hypercharge part of a representation acts by the representation itself, at the + gauge transformation with the same hypercharge factor and nothing else. -/ +lemma repU1_apply {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (g : GaugeGroupI) : + repU1 repGauge g = repGauge (1, 1, GaugeGroupI.toU1 g) := rfl + +/-- The hypercharge part of a representation acts by algebra maps whenever the + representation does, each of its values being a value of that representation. -/ +lemma isMulRep_repU1 {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} (hmul : IsMulRep repGauge) : + IsMulRep (repU1 repGauge) := + fun g x y => hmul (1, 1, GaugeGroupI.toU1 g) x y + +/-- Invariance under the hypercharge part of a representation is invariance under the + gauge transformations that are trivial on colour and isospin. The hypercharge part + reads only the hypercharge factor of its argument, and every element of `U(1)` is the + hypercharge factor of such a transformation. -/ +lemma repU1_invariant_iff_u1 {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (x : B) : + (∀ g : GaugeGroupI, repU1 repGauge g x = x) + ↔ ∀ u : unitary ℂ, repGauge (1, 1, u) x = x := + ⟨fun h u => h (1, 1, u), fun h g => h (GaugeGroupI.toU1 g)⟩ + +/-- A submodule is stable under the hypercharge part of a representation precisely when + it is stable under the gauge transformations trivial on colour and isospin. -/ +lemma repU1_stable_iff_u1 {B : Type*} [AddCommGroup B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) : + (∀ g : GaugeGroupI, ∀ y ∈ S, repU1 repGauge g y ∈ S) + ↔ ∀ u : unitary ℂ, ∀ y ∈ S, repGauge (1, 1, u) y ∈ S := + ⟨fun h u => h (1, 1, u), fun h g => h (GaugeGroupI.toU1 g)⟩ namespace IsU1BiAdjoint set_option linter.unusedVariables false @@ -57,6 +223,14 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {T : (Fin 2 → Fin 1) → B} (hT : IsU1BiAdjoint B repGauge T) +/-- A bi-adjoint family for a representation is a bi-adjoint family for its hypercharge + part: the transformation law reads only the hypercharge factor to begin with. The span + and the trace contraction do not mention the representation, so every statement of this + file transports along this and is read at the hypercharge factor alone. -/ +lemma toRepU1 (hT : IsU1BiAdjoint B repGauge T) : + IsU1BiAdjoint B (repU1 repGauge) T where + repGauge_T g := hT.repGauge_T g + /-- The span of all the components. -/ def span (hT : IsU1BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d @@ -86,8 +260,9 @@ lemma mem_span_iff (x : B) : ## B. Orthogonality of the adjoint matrix The adjoint action of the gauge group on the `u(1)` factor is trivial, so the `u(1)` -entry of `adjointMatrix` is `1` and the corresponding one by one block is orthogonal. -This is what makes the trace contraction of section C gauge invariant. +entry of `adjointMatrix` is `1`, for every gauge group element and not only for a +hypercharge one, and the corresponding one by one block is orthogonal. This is the +`GaugeGroupI` reading of section A.1. -/ @@ -138,63 +313,80 @@ lemma traceContraction_mem_span (hT : IsU1BiAdjoint B repGauge T) : exact sum_mem fun d _ => Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _) -/-- The trace contraction of a bi-adjoint family is gauge invariant. -/ -lemma repGauge_traceContraction (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGroupI) : - repGauge g hT.traceContraction = hT.traceContraction := by - have step : repGauge g hT.traceContraction - = ∑ b : Fin 2 → Fin 1, (if b 0 = b 1 then (1 : ℂ) else 0) • T b := by - show repGauge g (∑ c : Fin 1, T ![c, c]) = _ - rw [map_sum] - have h1 : ∀ c : Fin 1, repGauge g (T ![c, c]) - = ∑ b : Fin 2 → Fin 1, - ((GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr (b 0))) (Sum.inr (Sum.inr c)) * - GaugeAlgebra.adjointMatrix g (Sum.inr (Sum.inr (b 1))) - (Sum.inr (Sum.inr c)) : ℝ) : ℂ) • T b := by - intro c - rw [hT.repGauge_T g ![c, c]] - refine Finset.sum_congr rfl fun b _ => ?_ - congr 1 - simp - simp only [h1] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun b _ => ?_ - rw [← Finset.sum_smul] - congr 1 - rw [← Complex.ofReal_sum, sum_adjointMatrix_row_mul] - simp [apply_ite] - rw [step, ← hT.traceContraction_eq_sum] +/-- The trace contraction of a bi-adjoint family is fixed by any linear map moving the + components by a `U(1)` matrix, such a map fixing each component already. -/ +lemma map_traceContraction (hT : IsU1BiAdjoint B repGauge T) + {u : unitary ℂ} {f : B →ₗ[ℂ] B} (hf : IsU1BiAdjointMat u f T) : + f hT.traceContraction = hT.traceContraction := by + rw [traceContraction, map_sum] + exact Finset.sum_congr rfl fun a _ => hf.map_T _ + +/-- The trace contraction of a bi-adjoint family is fixed by the hypercharge factor. That + is all the transformation law constrains: the colour and isospin factors are free to + move the trace contraction, and nothing here says that they do not. -/ +lemma repGauge_traceContraction (hT : IsU1BiAdjoint B repGauge T) (u : unitary ℂ) : + repGauge (1, 1, u) hT.traceContraction = hT.traceContraction := + hT.map_traceContraction (hT.repGauge_T u) + +/-- The trace contraction is fixed by the hypercharge factor, under the name spelling out + which factor is meant. This is `repGauge_traceContraction`. -/ +lemma repGauge_u1_traceContraction (hT : IsU1BiAdjoint B repGauge T) (u : unitary ℂ) : + repGauge (1, 1, u) hT.traceContraction = hT.traceContraction := + hT.repGauge_traceContraction u /-! -## D. Gauge invariance of the whole span +## D. Invariance of the whole span -The `u(1)` adjoint index takes a single value and the gauge group acts trivially on it, -so every component of `T` is itself gauge invariant, and hence so is every linear +The `u(1)` adjoint index takes a single value and the `U(1)` factor acts trivially on it, +so every component of `T` is fixed by that factor, and hence so is every linear combination of the components. At the level of submodules this says that the span sits -inside the invariants of `repGauge`. +inside the invariants of `repU1 repGauge`, the hypercharge part of the representation. + +Invariance under the whole gauge group is a different matter, and does not follow: the +colour and isospin factors are outside the transformation law and may move the components +as they please. Where they do not, as for the hypercharge field strengths of +`IsGaugeSector`, the law holds at every gauge element, and `span_le_invariants` takes +that as its hypothesis. -/ -/-- Every component of a bi-adjoint `u(1)` family is gauge invariant. -/ -lemma repGauge_T_self (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGroupI) - (l : Fin 2 → Fin 1) : repGauge g (T l) = T l := by - rw [hT.repGauge_T g l, Fintype.sum_unique, - Subsingleton.elim (default : Fin 2 → Fin 1) l] - simp only [adjointMatrix_u1, Complex.ofReal_one, Finset.prod_const_one, one_smul] - -/-- Every element of the span of the components of a bi-adjoint `u(1)` family is gauge - invariant. -/ -lemma repGauge_of_mem_span (hT : IsU1BiAdjoint B repGauge T) (g : GaugeGroupI) {x : B} - (hx : x ∈ hT.span) : repGauge g x = x := by +/-- Every component of a bi-adjoint `u(1)` family is fixed by the hypercharge factor. -/ +lemma repGauge_T_self (hT : IsU1BiAdjoint B repGauge T) (u : unitary ℂ) + (l : Fin 2 → Fin 1) : repGauge (1, 1, u) (T l) = T l := (hT.repGauge_T u).map_T l + +/-- Every element of the span of the components of a bi-adjoint `u(1)` family is fixed by + any linear map obeying the transformation law. -/ +lemma map_of_mem_span (hT : IsU1BiAdjoint B repGauge T) {u : unitary ℂ} {f : B →ₗ[ℂ] B} + (hf : IsU1BiAdjointMat u f T) {x : B} (hx : x ∈ hT.span) : f x = x := by obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx rw [map_sum] - exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hT.repGauge_T_self g d] + exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hf.map_T d] + +/-- Every element of the span of the components of a bi-adjoint `u(1)` family is fixed by + the hypercharge factor. -/ +lemma repGauge_of_mem_span (hT : IsU1BiAdjoint B repGauge T) (u : unitary ℂ) {x : B} + (hx : x ∈ hT.span) : repGauge (1, 1, u) x = x := + hT.map_of_mem_span (hT.repGauge_T u) hx + +/-- The span of the components of a bi-adjoint `u(1)` family lies in the invariants of + the hypercharge part of the representation: the submodule form of + `repGauge_of_mem_span`. -/ +lemma span_le_repU1_invariants (hT : IsU1BiAdjoint B repGauge T) : + hT.span ≤ (repU1 repGauge).invariants := + fun _ hx => (Representation.mem_invariants _ _).2 fun g => + hT.repGauge_of_mem_span (GaugeGroupI.toU1 g) hx /-- The span of the components of a bi-adjoint `u(1)` family lies in the gauge - invariants: the submodule form of `repGauge_of_mem_span`. -/ -lemma span_le_invariants (hT : IsU1BiAdjoint B repGauge T) : + invariants, once the transformation law is known to hold at every gauge element and not + only at the hypercharge ones. The hypothesis cannot be dropped: `IsU1BiAdjoint` says + nothing about the colour and isospin factors, so they may move the components. Where + they do not, as for the hypercharge field strengths, the hypothesis is supplied from + the transformation law of the underlying field. -/ +lemma span_le_invariants (hT : IsU1BiAdjoint B repGauge T) + (hmat : ∀ g : GaugeGroupI, IsU1BiAdjointMat (GaugeGroupI.toU1 g) (repGauge g) T) : hT.span ≤ repGauge.invariants := - fun _ hx => (Representation.mem_invariants _ _).2 fun g => hT.repGauge_of_mem_span g hx + fun _ hx => (Representation.mem_invariants _ _).2 fun g => hT.map_of_mem_span (hmat g) hx end IsU1BiAdjoint diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean index a12ab357d..b508b703b 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean @@ -165,15 +165,24 @@ lemma isSU2BiAdjoint_wField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (fun a : Fin 2 → Fin 3 => h.wField l μ ν (a 0) * h.wField l' μ' ν' (a 1)) := ⟨fun U => h.isSU2BiAdjointMat_wField_mul l μ ν l' μ' ν' (1, U, 1)⟩ +/-- A gauge transformation moves a product of two hypercharge field strengths as the + `U(1)` factor of that gauge group element moves a tensor with two `u(1)` adjoint + indices. -/ +lemma isU1BiAdjointMat_hyperchargeField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) + (g : GaugeGroupI) : + IsU1BiAdjointMat (GaugeGroupI.toU1 g) (repGauge g) + (fun _ : Fin 2 → Fin 1 => h.hyperchargeField l μ ν * h.hyperchargeField l' μ' ν') := + (isU1BiAdjointMat_iff _ _ _).2 fun _ => by + rw [hrepGauge_mul, h.repGauge_hyperchargeField, h.repGauge_hyperchargeField] + /-- A product of two hypercharge field strengths, viewed as a family indexed by the two `u(1)` adjoint indices it carries, is a bi-adjoint `u(1)` tensor. -/ lemma isU1BiAdjoint_hyperchargeField_mul {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : IsU1BiAdjoint B repGauge - (fun _ : Fin 2 → Fin 1 => h.hyperchargeField l μ ν * h.hyperchargeField l' μ' ν') := by - refine ⟨fun g d => ?_⟩ - rw [hrepGauge_mul, h.repGauge_hyperchargeField, h.repGauge_hyperchargeField] - simp + (fun _ : Fin 2 → Fin 1 => h.hyperchargeField l μ ν * h.hyperchargeField l' μ' ν') := + ⟨fun u => h.isU1BiAdjointMat_hyperchargeField_mul l μ ν l' μ' ν' (1, 1, u)⟩ /-! @@ -188,9 +197,12 @@ containing its generators, so the whole bi-adjoint subspace lies there too. What holds is an inclusion and not an equality. The mass-weight submodule of that weight also contains the towers carrying more covariant derivatives, and the products mixing two different gauge factors, and none of those is a component of any of the three -families. For the `u(1)` family the inclusion sharpens: every component of a bi-adjoint -`u(1)` family is gauge invariant already, so its span meets the mass-weight submodule -inside the gauge invariants. +families. For the `u(1)` family the inclusion sharpens, so that its span meets the +mass-weight submodule inside the gauge invariants. That sharpening does not come from +`IsU1BiAdjoint`, which constrains the hypercharge factor alone; it comes from +`repGauge_hyperchargeField`, the transformation law of the hypercharge field strength +itself, which fixes it under every gauge element and so makes every component of the +family gauge invariant. -/ @@ -312,15 +324,16 @@ lemma isU1BiAdjoint_hyperchargeField_mul_span_le_massWeightSubmodule {n m : ℕ} (h.derivSubmodule_mul_le_massWeightSubmodule n m) /-- The bi-adjoint subspace of a product of two hypercharge field strengths is a space of - gauge invariants of the expected mass weight, the `u(1)` adjoint action being - trivial. -/ + gauge invariants of the expected mass weight, each hypercharge field strength being + fixed by the whole gauge group on its own. -/ lemma isU1BiAdjoint_hyperchargeField_mul_span_le_inf {n m : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) : (h.isU1BiAdjoint_hyperchargeField_mul l μ ν l' μ' ν').span ≤ h.massWeightSubmodule (2 * (2 + n) + 2 * (2 + m)) ⊓ repGauge.invariants := le_inf (h.isU1BiAdjoint_hyperchargeField_mul_span_le_massWeightSubmodule l μ ν l' μ' ν') - (IsU1BiAdjoint.span_le_invariants _) + (IsU1BiAdjoint.span_le_invariants _ + fun g => h.isU1BiAdjointMat_hyperchargeField_mul l μ ν l' μ' ν' g) /-! @@ -387,7 +400,8 @@ lemma traceContraction_hyperchargeField_mul_mem {n m : ℕ} (l : Fin n → Fin 1 · rw [h.traceContraction_hyperchargeField_mul] exact h.F_mul_F_mem_massWeightSubmodule l μ ν _ l' μ' ν' _ · exact (Representation.mem_invariants _ _).mpr fun g => - IsU1BiAdjoint.repGauge_traceContraction _ g + IsU1BiAdjoint.map_traceContraction _ + (h.isU1BiAdjointMat_hyperchargeField_mul l μ ν l' μ' ν' g) /-! @@ -455,7 +469,8 @@ lemma traceContraction_hyperchargeField_mul_mem_piece_zero (μ ν μ' ν' : Fin ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 := GaugeWeightDecomposition.mem_zero_of_invariant _ (Submodule.mem_inf.mp (h.traceContraction_hyperchargeField_mul_mem_eight μ ν μ' ν')).1 - fun g => IsU1BiAdjoint.repGauge_traceContraction _ g + fun g => IsU1BiAdjoint.map_traceContraction _ + (h.isU1BiAdjointMat_hyperchargeField_mul ![] μ ν ![] μ' ν' g) /-! From 9d99d3cd1a6f9e3432299c5d01af7712d90eed44 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 13:56:52 +0100 Subject: [PATCH 253/254] feat: Full theorem for the gauge sector --- Physlib.lean | 2 + .../GaugeGroup/Invariants/IsSU2Adjoint.lean | 442 ++++ .../GaugeGroup/Invariants/IsSU3Adjoint.lean | 594 +++++ .../GaugeGroup/Invariants/IsU1BiAdjoint.lean | 34 +- .../IsGaugeSector/MassWeight/BiAdjoint.lean | 1916 +++++++++++++++++ .../Invariants/IsQuadLorentz.lean | 469 +++- 6 files changed, 3429 insertions(+), 28 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean diff --git a/Physlib.lean b/Physlib.lean index f29978f25..ca53b9d01 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -257,9 +257,11 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDer public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2QuadFundamental +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3Adjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean new file mode 100644 index 000000000..8873b5faa --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean @@ -0,0 +1,442 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint +/-! +# Gauge tensors carrying one `su(2)` adjoint index + +`IsSU2Adjoint B repGauge T` says that a family `T`, indexed by a single `su(2)` adjoint +index and valued in a module `B` carrying a representation of the gauge group +`GaugeGroupI`, transforms as a tensor `T^a` in the `su(2)` factor of the adjoint +representation. + +This is the one index companion of `IsSU2BiAdjoint`. The field strength of the `W` bosons +carries one `su(2)` adjoint index, so a single field strength, or any expression built +linearly from one, transforms in this way, and the proposition here records that law. + +The law itself is `IsSU2AdjointMat`, which relates one element of `SU(2)` to one linear +map on `B` and mentions no other factor of the gauge group, through `su2AdjointMatrix`, +the adjoint matrix of an `SU(2)` element alone. `IsSU2Adjoint` says that the isospin +transformation `(1, U, 1)` obeys that law with the matrix of `U`, for every `U` in +`SU(2)`, and it says nothing whatever about the colour and hypercharge factors: those may +move the components as they please. + +The point of the file is that a single adjoint index carries no invariant at all. The +adjoint representation of `SU(2)` is the vector representation of the rotation group and +contains no singlet, so `eq_zero_of_su2_invariant`: an element of the span of the +components fixed by the isospin factor is zero. The proof is a single finite average. The +three isospin flips `su2Flip`, the elements `i σ₁`, `i σ₂` and `i σ₃`, are the half turns +about the three isospin axes, and they and the identity form the Klein four-group of the +rotation group. A half turn about an axis fixes that axis and reverses the other two, so +the four adjoint matrices sum to zero, and averaging an invariant over the four gives +four times the invariant on one side and zero on the other. + +That average is the torus step and the Weyl step of the `su(3)` story rolled into one. +`su2Flip 2` fixes the Cartan direction and reverses the two root directions, which is what +a torus average would give; `su2Flip 0` and `su2Flip 1` reverse the Cartan direction, which +is the Weyl reflection, `su2Flip 1` being the Weyl element `su2Perm` up to a sign. That is +recorded in `su2AdjointMatrix_su2Flip_one`, which reads the sign off the existing +`su2AdjointMatrix_su2Perm`. Nothing beyond a module structure on `B` is used anywhere: no +algebra structure, no multiplicativity hypothesis and no gauge weight decomposition. + +Section A gives the transformation law, the proposition and the span of the components, +and section B the contraction of the single index against a coordinate vector, through +which the law reads as the row action `IsSU2BiAdjoint.rowAct` on coordinate vectors. +Section C introduces the three flips and computes the average, and section D draws the +conclusion, in D.1 for the span itself and in D.2 for the span joined with a stable +submodule, which is the form `mem_span_sup_su2_invariant_iff` a peeling argument needs. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix PauliMatrix IsSU2BiAdjoint + +/-! + +## A. The transformation law and the span of the components + +An `su(2)` adjoint index is acted on by the `SU(2)` factor of the gauge group alone, +through `su2AdjointMatrix`, the matrix of `IsSU2BiAdjoint` section A.1. The law carries +one factor of that matrix, with the summed index in the row slot, exactly as each of the +two indices of a bi-adjoint family does. + +-/ + +/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` + moves a tensor with one adjoint index: one factor of `su2AdjointMatrix U`, with the + summed index in the row slot. -/ +def IsSU2AdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 2) ℂ) (f : B →ₗ[ℂ] B) (T : Fin 3 → B) : Prop := + ∀ l : Fin 3, f (T l) = ∑ a : Fin 3, ((su2AdjointMatrix U a l : ℝ) : ℂ) • T a + +/-- A family `T` of elements of `B`, indexed by one `su(2)` adjoint index, transforms as a + tensor `T^a` under the representation `repGauge` of the gauge group: an isospin + transformation moves the components by the `SU(2)` element it is built from. Nothing is + asked of the colour or hypercharge factors. -/ +structure IsSU2Adjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (T : Fin 3 → B) : Prop where + repGauge_T : ∀ g : specialUnitaryGroup (Fin 2) ℂ, + IsSU2AdjointMat g (repGauge (1, g, 1)) T + +namespace IsSU2Adjoint + +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : Fin 3 → B} + (hT : IsSU2Adjoint B repGauge T) + +/-- An adjoint family for a representation is an adjoint family for its isospin part: the + transformation law reads only the isospin factor to begin with. -/ +lemma toRepSU2 (hT : IsSU2Adjoint B repGauge T) : + IsSU2Adjoint B (repSU2 repGauge) T where + repGauge_T g := hT.repGauge_T g + +/-- The span of all the components. -/ +def span (hT : IsSU2Adjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ c : Fin 3 → ℂ, x = ∑ d, c d • T d := by + constructor + · intro hx + rw [IsSU2Adjoint.span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : Fin 3 → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. The contraction against a coordinate vector + +Contracting the single index of `T` against a coordinate vector gives `adjVec`, and the +span of the components is exactly the set of such contractions. The transformation law +says that a map moving the components by an `SU(2)` matrix moves a contraction by the row +action of that matrix on the coordinate vector, so all the work of the file happens on +coordinate vectors, where `IsSU2BiAdjoint.rowAct` and its lemmas already live. + +-/ + +/-- The element of `B` obtained by contracting the `su(2)` adjoint index of `T` against a + coordinate vector. -/ +noncomputable def adjVec (hT : IsSU2Adjoint B repGauge T) (c : Fin 3 → ℂ) : B := + ∑ a : Fin 3, c a • T a + +/-- Contracting against the zero coordinate vector. -/ +@[simp] +lemma adjVec_zero : hT.adjVec 0 = 0 := by + simp [adjVec] + +/-- Contracting against a sum of coordinate vectors. -/ +lemma adjVec_add (c c' : Fin 3 → ℂ) : + hT.adjVec (c + c') = hT.adjVec c + hT.adjVec c' := by + simp only [adjVec, Pi.add_apply, add_smul, Finset.sum_add_distrib] + +/-- Contracting against a scaled coordinate vector. -/ +lemma adjVec_smul (z : ℂ) (c : Fin 3 → ℂ) : + hT.adjVec (z • c) = z • hT.adjVec c := by + simp only [adjVec, Finset.smul_sum, Pi.smul_apply, smul_eq_mul, smul_smul] + +/-- Contracting against a single Pauli direction returns a component of `T`. -/ +lemma adjVec_unitVec (a : Fin 3) : hT.adjVec (unitVec a) = T a := by + simp [adjVec, unitVec, ite_smul] + +/-- The span of the components is the set of contractions. -/ +lemma mem_span_iff_exists_adjVec (x : B) : + x ∈ hT.span ↔ ∃ c : Fin 3 → ℂ, x = hT.adjVec c := + hT.mem_span_iff x + +/-- Every contraction lies in the span of the components. -/ +lemma adjVec_mem_span (c : Fin 3 → ℂ) : hT.adjVec c ∈ hT.span := + (hT.mem_span_iff_exists_adjVec _).2 ⟨c, rfl⟩ + +/-- A map moving the components by an `SU(2)` matrix moves a contraction by the row action + of that matrix on the coordinate vector. This is the whole content of the transformation + law in coordinate form, and it mentions no other factor of the gauge group. -/ +lemma map_adjVec (hT : IsSU2Adjoint B repGauge T) {U : specialUnitaryGroup (Fin 2) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU2AdjointMat U f T) (c : Fin 3 → ℂ) : + f (hT.adjVec c) = hT.adjVec (rowAct U c) := by + have step : ∀ l : Fin 3, f (c l • T l) + = ∑ a : Fin 3, (c l * ((su2AdjointMatrix U a l : ℝ) : ℂ)) • T a := by + intro l + rw [map_smul, hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul] + show f (∑ l : Fin 3, c l • T l) = ∑ a : Fin 3, rowAct U c a • T a + rw [map_sum] + simp only [step] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul] + congr 1 + exact Finset.sum_congr rfl fun l _ => mul_comm _ _ + +/-- The isospin factor of the gauge group moves a contraction by the row action of its + `SU(2)` element on the coordinate vector. -/ +lemma repGauge_su2_adjVec (U : specialUnitaryGroup (Fin 2) ℂ) (c : Fin 3 → ℂ) : + repGauge (1, U, 1) (hT.adjVec c) = hT.adjVec (rowAct U c) := + hT.map_adjVec (hT.repGauge_T U) c + +end IsSU2Adjoint + +/-! + +## C. The isospin flips and the average over the Klein four-group + +The elements `i σ₁`, `i σ₂` and `i σ₃` of `SU(2)` are the half turns about the three +isospin axes. C.1 records them, C.2 computes their adjoint matrices, which are diagonal +with a single `1` and two `-1`, and C.3 averages: the four signs attached to a Pauli +direction, one for the identity and one for each flip, are `1`, `1`, `-1`, `-1` in some +order, so they sum to zero and the average of the row action over the four elements is +zero outright. + +There is no second average to do. The adjoint representation of `SU(2)` is three +dimensional, the Cartan direction is one of the three Pauli directions and the two flips +about the other two axes reverse it; a half turn about a perpendicular axis is the Weyl +reflection of `SU(2)`, so the Weyl step is inside the same average as the torus step. + +## C.1. The three isospin flips + +-/ + +/-- The matrix of the `k`-th isospin flip, the half turn `i σ` about the `k`-th isospin + axis. It is unitary, and its determinant is `1` because `i ^ 2` cancels the determinant + `-1` of a Pauli matrix. -/ +noncomputable def su2FlipMatrix : Fin 3 → Matrix (Fin 2) (Fin 2) ℂ + | 0 => !![0, Complex.I; Complex.I, 0] + | 1 => !![0, 1; -1, 0] + | 2 => !![Complex.I, 0; 0, -Complex.I] + +/-- The star of the `k`-th isospin flip, which is its inverse and its negative, the Pauli + matrices being self-adjoint. -/ +noncomputable def su2FlipStarMatrix : Fin 3 → Matrix (Fin 2) (Fin 2) ℂ + | 0 => !![0, -Complex.I; -Complex.I, 0] + | 1 => !![0, -1; 1, 0] + | 2 => !![-Complex.I, 0; 0, Complex.I] + +/-- The `k`-th isospin flip as an element of `SU(2)`. The three flips and the identity are + the Klein four-group of half turns inside the rotation group. -/ +noncomputable def su2Flip (k : Fin 3) : specialUnitaryGroup (Fin 2) ℂ := + ⟨su2FlipMatrix k, by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + fin_cases k <;> ext a b <;> fin_cases a <;> fin_cases b <;> + simp [su2FlipMatrix, Matrix.mul_apply, Fin.sum_univ_two] + · fin_cases k <;> simp [su2FlipMatrix, Matrix.det_fin_two_of]⟩ + +/-- The underlying matrix of an isospin flip. -/ +lemma su2Flip_coe (k : Fin 3) : (su2Flip k).1 = su2FlipMatrix k := rfl + +/-- The star of an isospin flip. -/ +lemma star_su2FlipMatrix (k : Fin 3) : + star (su2FlipMatrix k) = su2FlipStarMatrix k := by + fin_cases k <;> ext a b <;> fin_cases a <;> fin_cases b <;> + simp [su2FlipMatrix, su2FlipStarMatrix] + +/-! + +## C.2. The adjoint matrices of the flips + +-/ + +/-- The sign by which the `k`-th isospin flip scales each Pauli direction: `1` on its own + axis and `-1` on the other two, a half turn fixing its axis and reversing the plane + perpendicular to it. -/ +def su2FlipSign : Fin 3 → Fin 3 → ℝ + | 0 => ![1, -1, -1] + | 1 => ![-1, 1, -1] + | 2 => ![-1, -1, 1] + +/-- The adjoint matrix of an isospin flip is diagonal, with the sign of each Pauli + direction on the diagonal. -/ +lemma su2AdjointMatrix_su2Flip (k : Fin 3) (a b : Fin 3) : + su2AdjointMatrix (su2Flip k) a b = if a = b then su2FlipSign k b else 0 := by + rw [su2AdjointMatrix_apply, su2Flip_coe, star_su2FlipMatrix] + fin_cases k <;> fin_cases a <;> fin_cases b <;> + simp only [su2FlipMatrix, su2FlipStarMatrix, su2FlipSign, pauliMatrix, + Matrix.trace_fin_two, Matrix.mul_apply, Fin.sum_univ_two, Matrix.cons_val', + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.empty_val', + Matrix.cons_val_fin_one, Matrix.of_apply] <;> + norm_num [Complex.ext_iff] + +/-- The flip about the second isospin axis has the adjoint matrix of the `SU(2)` Weyl + element `su2Perm`, that element being the same half turn up to a sign. This is the + sign check that the Weyl step of the argument is already inside the average of C.3. -/ +lemma su2AdjointMatrix_su2Flip_one : + su2AdjointMatrix (su2Flip 1) = su2AdjointMatrix su2Perm := by + rw [su2AdjointMatrix_su2Perm] + ext a b + rw [su2AdjointMatrix_su2Flip] + fin_cases a <;> fin_cases b <;> simp [su2FlipSign] + +/-- The row action of an isospin flip on a coordinate vector scales each coordinate by the + sign of its Pauli direction. -/ +lemma rowAct_su2Flip_apply (k : Fin 3) (c : Fin 3 → ℂ) (a : Fin 3) : + rowAct (su2Flip k) c a = ((su2FlipSign k a : ℝ) : ℂ) * c a := by + show ∑ x : Fin 3, ((su2AdjointMatrix (su2Flip k) a x : ℝ) : ℂ) * c x = _ + simp only [su2AdjointMatrix_su2Flip, apply_ite (fun r : ℝ => (r : ℂ)), + Complex.ofReal_zero, ite_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, + if_true] + +/-! + +## C.3. The average + +-/ + +/-- Averaging the row action over the Klein four-group of half turns, the three isospin + flips together with the identity, gives zero: each Pauli direction is fixed by the + identity and by the flip about its own axis and reversed by the other two flips, so its + four signs cancel. This is the vector representation of the rotation group having no + invariant vector, in coordinate form. -/ +lemma sum_rowAct_su2Flip (c : Fin 3 → ℂ) : + c + rowAct (su2Flip 0) c + rowAct (su2Flip 1) c + rowAct (su2Flip 2) c = 0 := by + funext a + simp only [Pi.add_apply, Pi.zero_apply, rowAct_su2Flip_apply] + fin_cases a <;> simp [su2FlipSign] + +/-! + +## D. A single adjoint index carries no invariant + +The average of section C is all that is needed. An isospin invariant of the span is +unchanged by each of the three flips, so four times it is the contraction of the averaged +coordinate vector, and that vector is zero. That is `eq_zero_of_su2_invariant`, and it is +the statement that the adjoint representation of `SU(2)` contains no singlet, in the form +the components of a family can carry it. + +Section D.2 divides out a stable submodule. The quotient carries the images of the +components as an adjoint family again, so D.1 applies there verbatim, and an invariant of +the span joined with a stable `S` lies in `S` itself. That is the form a peeling argument +wants: an `su(2)` adjoint index contributes nothing to the invariants, so it may be +dropped from the sum and the rest of the argument continued in `S`. + +## D.1. The vanishing + +-/ + +namespace IsSU2Adjoint + +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : Fin 3 → B} + (hT : IsSU2Adjoint B repGauge T) + +/-- An isospin invariant in the span of the components of an adjoint family is zero: the + adjoint representation of `SU(2)` contains no singlet. Averaging the invariant over the + Klein four-group of isospin flips leaves it unchanged on one side and annihilates its + coordinate vector on the other. -/ +theorem eq_zero_of_su2_invariant (hT : IsSU2Adjoint B repGauge T) {x : B} + (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : + x = 0 := by + obtain ⟨c, hc⟩ := (hT.mem_span_iff_exists_adjVec x).1 hx + have e : ∀ k : Fin 3, x = hT.adjVec (rowAct (su2Flip k) c) := fun k => by + rw [← hT.repGauge_su2_adjVec, ← hc, hinv] + have h4 : (4 : ℂ) • x = hT.adjVec (c + rowAct (su2Flip 0) c + + rowAct (su2Flip 1) c + rowAct (su2Flip 2) c) := by + rw [hT.adjVec_add, hT.adjVec_add, hT.adjVec_add, ← hc, ← e 0, ← e 1, ← e 2] + module + rw [sum_rowAct_su2Flip, hT.adjVec_zero] at h4 + have h := congrArg (fun y : B => (4 : ℂ)⁻¹ • y) h4 + simpa [smul_smul] using h + +/-- The same for a gauge invariant, gauge invariance being invariance under the isospin + factor and more. -/ +theorem eq_zero_of_invariant (hT : IsSU2Adjoint B repGauge T) {x : B} + (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x = 0 := + hT.eq_zero_of_su2_invariant hx fun U => hinv (1, U, 1) + +/-! + +## D.2. The invariants modulo a stable submodule + +-/ + +/-- The images of the components in the quotient by a gauge-stable submodule again form + an adjoint family. -/ +lemma isSU2Adjoint_quotRep (hT : IsSU2Adjoint B repGauge T) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : + IsSU2Adjoint (B ⧸ S) (quotRep repGauge S hS) fun l => S.mkQ (T l) where + repGauge_T g l := by + rw [quotRep_mkQ, hT.repGauge_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- An isospin invariant of the span of the components joined with an isospin-stable + submodule `S` lies in `S` itself. The classification is applied in the quotient by `S`, + where the images of the components form an adjoint family again and D.1 says that the + class of the invariant is zero. The invariance is carried along for free: it is a + hypothesis on the element, and the conclusion is about that same element. Stability of + `S` is needed, and not just convenient: it is what makes the quotient representation + exist. -/ +theorem mem_of_mem_span_sup_su2_invariant (hT : IsSU2Adjoint B repGauge T) (x : B) + (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, U, 1) y ∈ S) + (hx : x ∈ hT.span ⊔ S) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : + x ∈ S := by + have hS' : ∀ g : GaugeGroupI, ∀ y ∈ S, repSU2 repGauge g y ∈ S := + (repSU2_stable_iff_su2 repGauge S).2 hS + have hquot := hT.toRepSU2.isSU2Adjoint_quotRep S hS' + have hmk : S.mkQ x ∈ hquot.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hquot.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ U : specialUnitaryGroup (Fin 2) ℂ, + quotRep (repSU2 repGauge) S hS' (1, U, 1) (S.mkQ x) = S.mkQ x := by + intro U + rw [quotRep_mkQ, (repSU2_invariant_iff_su2 repGauge x).2 hinv (1, U, 1)] + exact (Submodule.Quotient.mk_eq_zero S).1 + (hquot.eq_zero_of_su2_invariant hmk hinv') + +/-- The isospin invariants of the span of the components joined with an isospin-stable + submodule are exactly the isospin invariants of the submodule: an `su(2)` adjoint index + contributes nothing at all, so the join may be replaced by `S` and the invariance + carried across unchanged. -/ +theorem mem_span_sup_su2_invariant_iff (hT : IsSU2Adjoint B repGauge T) (x : B) + (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, U, 1) y ∈ S) : + (x ∈ hT.span ⊔ S ∧ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) + ↔ x ∈ S ∧ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x := by + constructor + · rintro ⟨hx, hinv⟩ + exact ⟨hT.mem_of_mem_span_sup_su2_invariant x S hS hx hinv, hinv⟩ + · rintro ⟨hx, hinv⟩ + exact ⟨Submodule.mem_sup_right hx, hinv⟩ + +/-- The gauge form of the same statement, for a gauge-stable submodule and a gauge + invariant. -/ +theorem mem_of_mem_span_sup_invariant (hT : IsSU2Adjoint B repGauge T) (x : B) + (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ S := + hT.mem_of_mem_span_sup_su2_invariant x S (fun U => hS (1, U, 1)) hx + fun U => hinv (1, U, 1) + +end IsSU2Adjoint + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean new file mode 100644 index 000000000..b8d1cecc8 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean @@ -0,0 +1,594 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint +/-! +# Gauge tensors carrying one `su(3)` adjoint index + +`IsSU3Adjoint B repGauge T` says that a family `T`, indexed by a single `su(3)` adjoint +index and valued in a module `B` carrying a representation of the gauge group +`GaugeGroupI`, transforms as a tensor `T^a` in the `su(3)` factor of the adjoint +representation. + +This is the one index companion of `IsSU3BiAdjoint`. The field strength of the gluons +carries one `su(3)` adjoint index, so a single field strength, or any expression built +linearly from one, transforms in this way, and the proposition here records that law. + +The law itself is `IsSU3AdjointMat`, which relates one element of `SU(3)` to one linear +map on `B` and mentions no other factor of the gauge group, through `su3AdjointMatrix`, +the adjoint matrix of an `SU(3)` element alone. `IsSU3Adjoint` says that the colour +transformation `(U, 1, 1)` obeys that law with the matrix of `U`, for every `U` in +`SU(3)`, and it says nothing whatever about the isospin and hypercharge factors: those +may move the components as they please. + +The point of the file is that a single adjoint index carries no invariant at all. The +adjoint representation of `SU(3)` contains no singlet, so `eq_zero_of_su3_invariant`: an +element of the span of the components fixed by the colour factor is zero. The route to +`IsSU3BiFundamental`'s vanishing, the centre of `SU(3)`, is unavailable here, the centre +acting trivially on the adjoint. What replaces it is the torus and the Weyl group, in the +concrete form of two finite averages, and neither needs an algebra structure on `B`, a +multiplicativity hypothesis on `repGauge` or the gauge weight decomposition. + +Section A gives the transformation law, the proposition and the span of the components, +and section B the contraction of the single index against a coordinate vector, through +which the law reads as the row action `IsSU3BiAdjoint.rowAct` on coordinate vectors. +Section C is the torus step: the three colour flips `su3Flip`, the diagonal sign matrices +of `SU(3)`, scale each Gell-Mann direction by a sign, and together with the identity they +average to four times the projection onto the two Cartan directions. So a colour +invariant is a combination of the two Cartan components `T 2` and `T 7` alone, which is +the statement that its gauge weight vanishes, got here without any weight bookkeeping. +Section D is the Weyl step: the cyclic colour rotation `su3Perm` scales the two Cartan +eigenvectors `IsSU3BiAdjoint.cartanVec` by `ω` and `ω ^ 2`, so the three powers of the +rotation average to zero on the Cartan plane, there being no cube root of unity summing +to a nonzero multiple of itself. Section E puts the two averages together: three times a +colour invariant of the span is the contraction of the annihilated coordinate vector, so +it vanishes, and section E.2 transports that to the quotient by a stable submodule, which +is the form `mem_span_sup_su3_invariant_iff` a peeling argument needs. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix IsSU3BiAdjoint + +/-! + +## A. The transformation law and the span of the components + +An `su(3)` adjoint index is acted on by the `SU(3)` factor of the gauge group alone, +through `su3AdjointMatrix`, the matrix of `IsSU3BiAdjoint` section A.1. The law carries +one factor of that matrix, with the summed index in the row slot, exactly as each of the +two indices of a bi-adjoint family does. + +-/ + +/-- The linear map `f` moves the components of the family `T` as the `SU(3)` matrix `U` + moves a tensor with one adjoint index: one factor of `su3AdjointMatrix U`, with the + summed index in the row slot. -/ +def IsSU3AdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] + (U : specialUnitaryGroup (Fin 3) ℂ) (f : B →ₗ[ℂ] B) (T : Fin 8 → B) : Prop := + ∀ l : Fin 8, f (T l) = ∑ a : Fin 8, ((su3AdjointMatrix U a l : ℝ) : ℂ) • T a + +/-- A family `T` of elements of `B`, indexed by one `su(3)` adjoint index, transforms as a + tensor `T^a` under the representation `repGauge` of the gauge group: a colour + transformation moves the components by the `SU(3)` element it is built from. Nothing is + asked of the isospin or hypercharge factors. -/ +structure IsSU3Adjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (T : Fin 8 → B) : Prop where + repGauge_T : ∀ g : specialUnitaryGroup (Fin 3) ℂ, + IsSU3AdjointMat g (repGauge (g, 1, 1)) T + +namespace IsSU3Adjoint + +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : Fin 8 → B} + (hT : IsSU3Adjoint B repGauge T) + +/-- An adjoint family for a representation is an adjoint family for its colour part: the + transformation law reads only the colour factor to begin with. -/ +lemma toRepSU3 (hT : IsSU3Adjoint B repGauge T) : + IsSU3Adjoint B (repSU3 repGauge) T where + repGauge_T g := hT.repGauge_T g + +/-- The span of all the components. -/ +def span (hT : IsSU3Adjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- An element of `B` lies in the span of the components of `T` precisely when it is a + linear combination of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ c : Fin 8 → ℂ, x = ∑ d, c d • T d := by + constructor + · intro hx + rw [IsSU3Adjoint.span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : Fin 8 → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## B. The contraction against a coordinate vector + +Contracting the single index of `T` against a coordinate vector gives `adjVec`, and the +span of the components is exactly the set of such contractions. The transformation law +says that a map moving the components by an `SU(3)` matrix moves a contraction by the row +action of that matrix on the coordinate vector, so all the work of the file happens on +coordinate vectors, where `IsSU3BiAdjoint.rowAct` and its lemmas already live. + +-/ + +/-- The element of `B` obtained by contracting the `su(3)` adjoint index of `T` against a + coordinate vector. -/ +noncomputable def adjVec (hT : IsSU3Adjoint B repGauge T) (c : Fin 8 → ℂ) : B := + ∑ a : Fin 8, c a • T a + +/-- Contracting against the zero coordinate vector. -/ +@[simp] +lemma adjVec_zero : hT.adjVec 0 = 0 := by + simp [adjVec] + +/-- Contracting against a sum of coordinate vectors. -/ +lemma adjVec_add (c c' : Fin 8 → ℂ) : + hT.adjVec (c + c') = hT.adjVec c + hT.adjVec c' := by + simp only [adjVec, Pi.add_apply, add_smul, Finset.sum_add_distrib] + +/-- Contracting against a scaled coordinate vector. -/ +lemma adjVec_smul (z : ℂ) (c : Fin 8 → ℂ) : + hT.adjVec (z • c) = z • hT.adjVec c := by + simp only [adjVec, Finset.smul_sum, Pi.smul_apply, smul_eq_mul, smul_smul] + +/-- Contracting against a single Gell-Mann direction returns a component of `T`. -/ +lemma adjVec_unitVec (a : Fin 8) : hT.adjVec (unitVec a) = T a := by + simp [adjVec, unitVec, ite_smul] + +/-- The span of the components is the set of contractions. -/ +lemma mem_span_iff_exists_adjVec (x : B) : + x ∈ hT.span ↔ ∃ c : Fin 8 → ℂ, x = hT.adjVec c := + hT.mem_span_iff x + +/-- Every contraction lies in the span of the components. -/ +lemma adjVec_mem_span (c : Fin 8 → ℂ) : hT.adjVec c ∈ hT.span := + (hT.mem_span_iff_exists_adjVec _).2 ⟨c, rfl⟩ + +/-- A map moving the components by an `SU(3)` matrix moves a contraction by the row action + of that matrix on the coordinate vector. This is the whole content of the transformation + law in coordinate form, and it mentions no other factor of the gauge group. -/ +lemma map_adjVec (hT : IsSU3Adjoint B repGauge T) {U : specialUnitaryGroup (Fin 3) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU3AdjointMat U f T) (c : Fin 8 → ℂ) : + f (hT.adjVec c) = hT.adjVec (rowAct U c) := by + have step : ∀ l : Fin 8, f (c l • T l) + = ∑ a : Fin 8, (c l * ((su3AdjointMatrix U a l : ℝ) : ℂ)) • T a := by + intro l + rw [map_smul, hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul] + show f (∑ l : Fin 8, c l • T l) = ∑ a : Fin 8, rowAct U c a • T a + rw [map_sum] + simp only [step] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul] + congr 1 + exact Finset.sum_congr rfl fun l _ => mul_comm _ _ + +/-- The colour factor of the gauge group moves a contraction by the row action of its + `SU(3)` element on the coordinate vector. -/ +lemma repGauge_su3_adjVec (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 8 → ℂ) : + repGauge (U, 1, 1) (hT.adjVec c) = hT.adjVec (rowAct U c) := + hT.map_adjVec (hT.repGauge_T U) c + +end IsSU3Adjoint + +/-! + +## C. The torus step: the colour flips and the Cartan directions + +C.1 records two facts about the Gell-Mann coordinates that the step rests on: the +coordinates of a Gell-Mann matrix are a Kronecker delta, and the coordinates are +homogeneous for a real scaling of the matrix. C.2 introduces the three colour flips +`su3Flip`, the diagonal matrices of `SU(3)` with one entry `1` and two entries `-1`, and +computes their adjoint matrices: conjugation by a diagonal sign matrix scales each +Gell-Mann matrix by a sign, so the adjoint matrix is diagonal, with the sign +`su3FlipSign` on the diagonal. + +The three flips and the identity form the Klein four-group of diagonal sign matrices, and +C.3 is what that buys: the four signs attached to a Gell-Mann direction sum to `4` on the +two Cartan directions and to `0` on the six root directions, since each root direction +sees the product of two different diagonal entries and that product is negative for +exactly two of the four elements. Averaging over the four is therefore four times the +projection onto the Cartan plane. This is the finite substitute for the gauge weight +decomposition: a colour invariant has vanishing gauge weight, and the conclusion here, +`exists_cartan_of_su3_invariant`, is precisely that its coordinate vector may be taken +supported on the two Cartan indices `2` and `7`. + +## C.1. Two facts about the Gell-Mann coordinates + +-/ + +/-- The Gell-Mann coordinates of a Gell-Mann matrix are a Kronecker delta: the Gell-Mann + matrices are a basis and the coordinates read off the coefficients in it. -/ +lemma gellMannCoeff_gellMannMatrix (a b : Fin 8) : + gellMannCoeff (gellMannMatrix b) a = if a = b then 1 else 0 := by + have h3 : Real.sqrt 3 ^ 2 = 3 := Real.sq_sqrt (by norm_num) + fin_cases a <;> fin_cases b <;> + simp [gellMannCoeff, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, + gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, + gellMannMatrix_seven] + linear_combination h3 / 3 + +/-- The Gell-Mann coordinates are homogeneous for a real scaling of the matrix, each of + them being a real linear function of the entries. -/ +lemma gellMannCoeff_real_smul (s : ℝ) (M : Matrix (Fin 3) (Fin 3) ℂ) (a : Fin 8) : + gellMannCoeff ((s : ℂ) • M) a = s * gellMannCoeff M a := by + fin_cases a <;> simp [gellMannCoeff, Matrix.smul_apply] <;> ring + +/-! + +## C.2. The three colour flips and their adjoint matrices + +-/ + +/-- The matrix of the `k`-th colour flip: the diagonal matrix fixing the colour `k` and + reversing the other two. Its determinant is the product of one `1` and two `-1`, so it + is `1`, and it is its own star and its own inverse. -/ +noncomputable def su3FlipMatrix : Fin 3 → Matrix (Fin 3) (Fin 3) ℂ + | 0 => !![1, 0, 0; 0, -1, 0; 0, 0, -1] + | 1 => !![-1, 0, 0; 0, 1, 0; 0, 0, -1] + | 2 => !![-1, 0, 0; 0, -1, 0; 0, 0, 1] + +/-- The `k`-th colour flip as an element of `SU(3)`. The three flips and the identity are + the Klein four-group of diagonal sign matrices inside `SU(3)`. -/ +noncomputable def su3Flip (k : Fin 3) : specialUnitaryGroup (Fin 3) ℂ := + ⟨su3FlipMatrix k, by + rw [Matrix.mem_specialUnitaryGroup_iff] + refine ⟨?_, ?_⟩ + · rw [Matrix.mem_unitaryGroup_iff] + fin_cases k <;> ext a b <;> fin_cases a <;> fin_cases b <;> + simp [su3FlipMatrix, Matrix.mul_apply, Fin.sum_univ_three] + · fin_cases k <;> simp [su3FlipMatrix, Matrix.det_fin_three]⟩ + +/-- The underlying matrix of a colour flip. -/ +lemma su3Flip_coe (k : Fin 3) : (su3Flip k).1 = su3FlipMatrix k := rfl + +/-- A colour flip is its own star, its entries being real. -/ +lemma star_su3FlipMatrix (k : Fin 3) : star (su3FlipMatrix k) = su3FlipMatrix k := by + fin_cases k <;> ext a b <;> fin_cases a <;> fin_cases b <;> simp [su3FlipMatrix] + +/-- The sign by which the `k`-th colour flip scales each Gell-Mann direction: the product + of the two diagonal entries of the flip that the direction pairs, which is `1` on the + two Cartan directions and on the root pair not involving the colour `k`, and `-1` on the + four remaining root directions. -/ +def su3FlipSign : Fin 3 → Fin 8 → ℝ + | 0 => ![-1, -1, 1, -1, -1, 1, 1, 1] + | 1 => ![-1, -1, 1, 1, 1, -1, -1, 1] + | 2 => ![1, 1, 1, -1, -1, -1, -1, 1] + +set_option maxHeartbeats 1000000 in +/-- Conjugating a Gell-Mann matrix by a colour flip scales it by the sign of that + direction: conjugation by a diagonal matrix multiplies the entry in row `i` and column + `j` by the product of the `i`-th and `j`-th diagonal entries, and each Gell-Mann matrix + is supported where that product is constant. -/ +lemma conj_gellMannMatrix_su3Flip (k : Fin 3) (b : Fin 8) : + (su3Flip k).1 * gellMannMatrix b * star (su3Flip k).1 + = ((su3FlipSign k b : ℝ) : ℂ) • gellMannMatrix b := by + rw [su3Flip_coe, star_su3FlipMatrix] + fin_cases k <;> fin_cases b <;> ext i j <;> fin_cases i <;> fin_cases j <;> + simp [su3FlipMatrix, su3FlipSign, gellMannMatrix_zero, gellMannMatrix_one, + gellMannMatrix_two, gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, + gellMannMatrix_six, gellMannMatrix_seven, Matrix.mul_apply, Fin.sum_univ_three] + +/-- The adjoint matrix of a colour flip is diagonal, with the sign of each Gell-Mann + direction on the diagonal. -/ +lemma su3AdjointMatrix_su3Flip (k : Fin 3) (a b : Fin 8) : + su3AdjointMatrix (su3Flip k) a b = if a = b then su3FlipSign k b else 0 := by + rw [su3AdjointMatrix_eq_gellMannCoeff, conj_gellMannMatrix_su3Flip, + gellMannCoeff_real_smul, gellMannCoeff_gellMannMatrix] + split_ifs <;> ring + +/-- The row action of a colour flip on a coordinate vector scales each coordinate by the + sign of its Gell-Mann direction. -/ +lemma rowAct_su3Flip_apply (k : Fin 3) (c : Fin 8 → ℂ) (a : Fin 8) : + rowAct (su3Flip k) c a = ((su3FlipSign k a : ℝ) : ℂ) * c a := by + show ∑ x : Fin 8, ((su3AdjointMatrix (su3Flip k) a x : ℝ) : ℂ) * c x = _ + simp only [su3AdjointMatrix_su3Flip, apply_ite (fun r : ℝ => (r : ℂ)), + Complex.ofReal_zero, ite_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, + if_true] + +/-! + +## C.3. The average over the Klein four-group + +-/ + +/-- The coordinate vector of a combination of the two Cartan directions, the Gell-Mann + directions `2` and `7`. -/ +noncomputable def cartanCoord (α β : ℂ) : Fin 8 → ℂ := α • unitVec 2 + β • unitVec 7 + +/-- Averaging the row action over the Klein four-group of diagonal sign matrices, the + three colour flips together with the identity, is four times the projection onto the + Cartan plane: the four signs attached to a root direction cancel in pairs, while those + attached to a Cartan direction are all `1`. -/ +lemma sum_rowAct_su3Flip (c : Fin 8 → ℂ) : + c + rowAct (su3Flip 0) c + rowAct (su3Flip 1) c + rowAct (su3Flip 2) c + = (4 : ℂ) • cartanCoord (c 2) (c 7) := by + funext a + simp only [Pi.add_apply, Pi.smul_apply, rowAct_su3Flip_apply, cartanCoord, unitVec, + smul_eq_mul] + fin_cases a <;> simp [su3FlipSign] <;> ring + +namespace IsSU3Adjoint + +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : Fin 8 → B} + (hT : IsSU3Adjoint B repGauge T) + +/-- Contracting against a Cartan coordinate vector gives a combination of the two Cartan + components of `T`. -/ +lemma adjVec_cartanCoord (α β : ℂ) : + hT.adjVec (cartanCoord α β) = α • T 2 + β • T 7 := by + rw [cartanCoord, hT.adjVec_add, hT.adjVec_smul, hT.adjVec_smul, hT.adjVec_unitVec, + hT.adjVec_unitVec] + +/-- A colour invariant in the span of the components is a combination of the two Cartan + components alone. Averaging the invariant over the Klein four-group of colour flips + replaces its coordinate vector by four times the Cartan part of that vector, and an + invariant is unchanged by the average. This is the vanishing of the gauge weight of an + invariant, read off a finite average rather than the torus. -/ +lemma exists_cartan_of_su3_invariant (hT : IsSU3Adjoint B repGauge T) {x : B} + (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + ∃ α β : ℂ, x = hT.adjVec (cartanCoord α β) := by + obtain ⟨c, hc⟩ := (hT.mem_span_iff_exists_adjVec x).1 hx + have e : ∀ k : Fin 3, x = hT.adjVec (rowAct (su3Flip k) c) := fun k => by + rw [← hT.repGauge_su3_adjVec, ← hc, hinv] + refine ⟨c 2, c 7, ?_⟩ + have h4 : (4 : ℂ) • x = hT.adjVec (c + rowAct (su3Flip 0) c + + rowAct (su3Flip 1) c + rowAct (su3Flip 2) c) := by + rw [hT.adjVec_add, hT.adjVec_add, hT.adjVec_add, ← hc, ← e 0, ← e 1, ← e 2] + module + rw [sum_rowAct_su3Flip, hT.adjVec_smul] at h4 + have h := congrArg (fun y : B => (4 : ℂ)⁻¹ • y) h4 + simpa [smul_smul] using h + +end IsSU3Adjoint + +/-! + +## D. The Weyl step: the cyclic rotation on the Cartan plane + +The Klein four-group leaves the Cartan plane untouched, so it cannot be what makes an +invariant vanish; the element that moves the Cartan plane is the cyclic colour rotation +`su3Perm`, which normalises the torus and rotates the plane through `2 π / 3`. Its two +eigenvectors there are `IsSU3BiAdjoint.cartanVec`, at the eigenvalues `ω` and `ω ^ 2`, +and neither eigenvalue is `1`: the Cartan plane is the two-dimensional reflection +representation of the Weyl group `S₃` and carries no invariant vector. + +The form in which that is used below is the vanishing of the symmetriser +`1 + P + P ^ 2` of the cyclic subgroup on the Cartan plane, which is +`SU3PermDecomposition`'s `su3PermSign_symmetrizer`, the statement that the three powers of +a nontrivial cube root of unity sum to zero. D.1 rewrites the two Cartan coordinate +directions in the eigenbasis and D.2 applies the symmetriser. + +## D.1. The Cartan coordinate directions in the eigenbasis + +-/ + +/-- The Gell-Mann direction `2` in the eigenbasis of the cyclic colour rotation. -/ +lemma unitVec_two_eq_cartanVec : + unitVec 2 = (2 : ℂ)⁻¹ • (cartanVec 0 + cartanVec 1) := by + rw [show (2 : Fin 8) = GaugeAlgebra.su3CartanId 0 from rfl, unitVec_cartanId, + wtCoeff_cartan_zero] + +/-- The Gell-Mann direction `7` in the eigenbasis of the cyclic colour rotation. -/ +lemma unitVec_seven_eq_cartanVec : + unitVec 7 = (Complex.I / 2) • (cartanVec 0 - cartanVec 1) := by + rw [show (7 : Fin 8) = GaugeAlgebra.su3CartanId 1 from rfl, unitVec_cartanId, + wtCoeff_cartan_one] + +/-- A Cartan coordinate vector in the eigenbasis of the cyclic colour rotation. -/ +lemma cartanCoord_eq_cartanVec (α β : ℂ) : + cartanCoord α β = (α / 2 + β * Complex.I / 2) • cartanVec 0 + + (α / 2 - β * Complex.I / 2) • cartanVec 1 := by + rw [cartanCoord, unitVec_two_eq_cartanVec, unitVec_seven_eq_cartanVec] + module + +/-! + +## D.2. The symmetriser of the cyclic rotation on the Cartan plane + +-/ + +/-- The symmetriser of the cyclic colour rotation kills each Cartan eigenvector: the + eigenvalue is a nontrivial cube root of unity, and the three powers of such a root sum + to zero. -/ +lemma su3Perm_symmetrizer_cartanVec (i : Fin 2) : + cartanVec i + rowAct su3Perm (cartanVec i) + + rowAct su3Perm (rowAct su3Perm (cartanVec i)) = 0 := by + have hgrade : cartanGrade i ≠ 0 := by fin_cases i <;> decide + have hsum := su3PermSign_symmetrizer hgrade + rw [rowAct_su3Perm_cartanVec, rowAct_smul, rowAct_su3Perm_cartanVec, smul_smul] + have hcomb : cartanVec i + su3PermSign (cartanGrade i) • cartanVec i + + (su3PermSign (cartanGrade i) * su3PermSign (cartanGrade i)) • cartanVec i + = (1 + su3PermSign (cartanGrade i) + su3PermSign (cartanGrade i) ^ 2) + • cartanVec i := by + module + rw [hcomb, hsum, zero_smul] + +/-- The symmetriser of the cyclic colour rotation kills every Cartan coordinate vector, + the Cartan plane being spanned by the two eigenvectors. -/ +lemma su3Perm_symmetrizer_cartanCoord (α β : ℂ) : + cartanCoord α β + rowAct su3Perm (cartanCoord α β) + + rowAct su3Perm (rowAct su3Perm (cartanCoord α β)) = 0 := by + have h0 := su3Perm_symmetrizer_cartanVec 0 + have h1 := su3Perm_symmetrizer_cartanVec 1 + rw [cartanCoord_eq_cartanVec, rowAct_add, rowAct_smul, rowAct_smul, rowAct_add, + rowAct_smul, rowAct_smul] + have hcomb : ∀ z w : ℂ, + (z • cartanVec 0 + w • cartanVec 1) + + (z • rowAct su3Perm (cartanVec 0) + w • rowAct su3Perm (cartanVec 1)) + + (z • rowAct su3Perm (rowAct su3Perm (cartanVec 0)) + + w • rowAct su3Perm (rowAct su3Perm (cartanVec 1))) + = z • (cartanVec 0 + rowAct su3Perm (cartanVec 0) + + rowAct su3Perm (rowAct su3Perm (cartanVec 0))) + + w • (cartanVec 1 + rowAct su3Perm (cartanVec 1) + + rowAct su3Perm (rowAct su3Perm (cartanVec 1))) := by + intro z w + module + rw [hcomb, h0, h1, smul_zero, smul_zero, add_zero] + +/-! + +## E. A single adjoint index carries no invariant + +The two averages of sections C and D are all that is needed. A colour invariant of the +span has a Cartan coordinate vector by section C, and the symmetriser of the cyclic +rotation kills that vector by section D, while an invariant is unchanged by each of the +three powers of the rotation; so three times the invariant is the contraction of the +zero coordinate vector. That is `eq_zero_of_su3_invariant`, and it is the statement that +the adjoint representation of `SU(3)` contains no singlet, in the form the components of +a family can carry it. Nothing beyond a module structure on `B` is used: there is no +algebra, no multiplicativity hypothesis and no gauge weight decomposition anywhere in the +argument. + +Section E.2 divides out a stable submodule. The quotient carries the images of the +components as an adjoint family again, so E.1 applies there verbatim, and an invariant of +the span joined with a stable `S` lies in `S` itself. That is the form a peeling argument +wants: an `su(3)` adjoint index contributes nothing to the invariants, so it may be +dropped from the sum and the rest of the argument continued in `S`. + +## E.1. The vanishing + +-/ + +namespace IsSU3Adjoint + +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {T : Fin 8 → B} + (hT : IsSU3Adjoint B repGauge T) + +/-- A colour invariant in the span of the components of an adjoint family is zero: the + adjoint representation of `SU(3)` contains no singlet. The colour flips of section C + push the invariant onto the Cartan plane and the cyclic colour rotation of section D + has no invariant vector there, the two eigenvalues being the nontrivial cube roots of + unity. The route used for a pair of fundamental indices, the centre of `SU(3)`, is not + available: the centre acts trivially on the adjoint. -/ +theorem eq_zero_of_su3_invariant (hT : IsSU3Adjoint B repGauge T) {x : B} + (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + x = 0 := by + obtain ⟨α, β, hd⟩ := hT.exists_cartan_of_su3_invariant hx hinv + have e1 : x = hT.adjVec (rowAct su3Perm (cartanCoord α β)) := by + rw [← hT.repGauge_su3_adjVec, ← hd, hinv] + have e2 : x + = hT.adjVec (rowAct su3Perm (rowAct su3Perm (cartanCoord α β))) := by + rw [← hT.repGauge_su3_adjVec, ← e1, hinv] + have h3 : (3 : ℂ) • x = hT.adjVec (cartanCoord α β + + rowAct su3Perm (cartanCoord α β) + + rowAct su3Perm (rowAct su3Perm (cartanCoord α β))) := by + rw [hT.adjVec_add, hT.adjVec_add, ← hd, ← e1, ← e2] + module + rw [su3Perm_symmetrizer_cartanCoord, hT.adjVec_zero] at h3 + have h := congrArg (fun y : B => (3 : ℂ)⁻¹ • y) h3 + simpa [smul_smul] using h + +/-- The same for a gauge invariant, gauge invariance being invariance under the colour + factor and more. -/ +theorem eq_zero_of_invariant (hT : IsSU3Adjoint B repGauge T) {x : B} + (hx : x ∈ hT.span) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x = 0 := + hT.eq_zero_of_su3_invariant hx fun U => hinv (U, 1, 1) + +/-! + +## E.2. The invariants modulo a stable submodule + +-/ + +/-- The images of the components in the quotient by a gauge-stable submodule again form + an adjoint family. -/ +lemma isSU3Adjoint_quotRep (hT : IsSU3Adjoint B repGauge T) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : + IsSU3Adjoint (B ⧸ S) (quotRep repGauge S hS) fun l => S.mkQ (T l) where + repGauge_T g l := by + rw [quotRep_mkQ, hT.repGauge_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- A colour invariant of the span of the components joined with a colour-stable + submodule `S` lies in `S` itself. The classification is applied in the quotient by `S`, + where the images of the components form an adjoint family again and E.1 says that the + class of the invariant is zero. The invariance is carried along for free: it is a + hypothesis on the element, and the conclusion is about that same element. Stability of + `S` is needed, and not just convenient: it is what makes the quotient representation + exist. -/ +theorem mem_of_mem_span_sup_su3_invariant (hT : IsSU3Adjoint B repGauge T) (x : B) + (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S) + (hx : x ∈ hT.span ⊔ S) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + x ∈ S := by + have hS' : ∀ g : GaugeGroupI, ∀ y ∈ S, repSU3 repGauge g y ∈ S := + (repSU3_stable_iff_su3 repGauge S).2 hS + have hquot := hT.toRepSU3.isSU3Adjoint_quotRep S hS' + have hmk : S.mkQ x ∈ hquot.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hquot.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ U : specialUnitaryGroup (Fin 3) ℂ, + quotRep (repSU3 repGauge) S hS' (U, 1, 1) (S.mkQ x) = S.mkQ x := by + intro U + rw [quotRep_mkQ, (repSU3_invariant_iff_su3 repGauge x).2 hinv (U, 1, 1)] + exact (Submodule.Quotient.mk_eq_zero S).1 + (hquot.eq_zero_of_su3_invariant hmk hinv') + +/-- The colour invariants of the span of the components joined with a colour-stable + submodule are exactly the colour invariants of the submodule: an `su(3)` adjoint index + contributes nothing at all, so the join may be replaced by `S` and the invariance + carried across unchanged. -/ +theorem mem_span_sup_su3_invariant_iff (hT : IsSU3Adjoint B repGauge T) (x : B) + (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S) : + (x ∈ hT.span ⊔ S ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) + ↔ x ∈ S ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x := by + constructor + · rintro ⟨hx, hinv⟩ + exact ⟨hT.mem_of_mem_span_sup_su3_invariant x S hS hx hinv, hinv⟩ + · rintro ⟨hx, hinv⟩ + exact ⟨Submodule.mem_sup_right hx, hinv⟩ + +/-- The gauge form of the same statement, for a gauge-stable submodule and a gauge + invariant. -/ +theorem mem_of_mem_span_sup_invariant (hT : IsSU3Adjoint B repGauge T) (x : B) + (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ S := + hT.mem_of_mem_span_sup_su3_invariant x S (fun U => hS (U, 1, 1)) hx + fun U => hinv (U, 1, 1) + +end IsSU3Adjoint + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean index c9dea5bad..488c300ea 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean @@ -34,7 +34,7 @@ factor. What is no longer claimed is that they are fixed by the colour and isosp factors, about which the law says nothing; the statements that need that, here `span_le_invariants`, take the law at every gauge element as an explicit hypothesis, in the way that `htc` is a hypothesis in `IsSU2BiAdjoint` and `IsSU3BiAdjoint`. The -hypothesis-free form is `span_le_repU1_invariants`, for `repU1 repGauge`, the +hypothesis-free form is `span_le_repU1Factor_invariants`, for `repU1Factor repGauge`, the hypercharge part of the representation, which sends the colour and isospin factors to the identity outright. @@ -155,15 +155,15 @@ structure IsU1BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] ## A.3. The hypercharge part of a representation Reading a representation of the gauge group at the hypercharge factor of its argument -alone gives `repU1`, again a representation of the whole gauge group. Every construction +alone gives `repU1Factor`, again a representation of the whole gauge group. Every construction stated for a representation of `GaugeGroupI` therefore applies to it verbatim, and a -bi-adjoint family for `repGauge` is a bi-adjoint family for `repU1 repGauge`, with the +bi-adjoint family for `repGauge` is a bi-adjoint family for `repU1Factor repGauge`, with the same span and the same trace contraction. Invariance under it is invariance under the hypercharge factor, `∀ u : U(1), repGauge (1, 1, u) x = x`, which is exactly what the transformation law constrains. The statements of section D are written with the hypercharge transformation `(1, 1, u)` -spelled out, so that reading one needs no unfolding, and `repU1_invariant_iff_u1` is the +spelled out, so that reading one needs no unfolding, and `repU1Factor_invariant_iff_u1` is the bridge between the two spellings. -/ @@ -171,7 +171,7 @@ bridge between the two spellings. /-- The hypercharge part of a representation of the gauge group: the representation reading only the `U(1)` factor of its argument and sending the colour and isospin factors to the identity. -/ -noncomputable def repU1 {B : Type*} [AddCommMonoid B] [Module ℂ B] +noncomputable def repU1Factor {B : Type*} [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) : Representation ℂ GaugeGroupI B where toFun g := repGauge (1, 1, GaugeGroupI.toU1 g) map_one' := by @@ -186,32 +186,32 @@ noncomputable def repU1 {B : Type*} [AddCommMonoid B] [Module ℂ B] /-- The hypercharge part of a representation acts by the representation itself, at the gauge transformation with the same hypercharge factor and nothing else. -/ -lemma repU1_apply {B : Type*} [AddCommMonoid B] [Module ℂ B] +lemma repU1Factor_apply {B : Type*} [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (g : GaugeGroupI) : - repU1 repGauge g = repGauge (1, 1, GaugeGroupI.toU1 g) := rfl + repU1Factor repGauge g = repGauge (1, 1, GaugeGroupI.toU1 g) := rfl /-- The hypercharge part of a representation acts by algebra maps whenever the representation does, each of its values being a value of that representation. -/ -lemma isMulRep_repU1 {B : Type*} [Ring B] [Algebra ℂ B] +lemma isMulRep_repU1Factor {B : Type*} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} (hmul : IsMulRep repGauge) : - IsMulRep (repU1 repGauge) := + IsMulRep (repU1Factor repGauge) := fun g x y => hmul (1, 1, GaugeGroupI.toU1 g) x y /-- Invariance under the hypercharge part of a representation is invariance under the gauge transformations that are trivial on colour and isospin. The hypercharge part reads only the hypercharge factor of its argument, and every element of `U(1)` is the hypercharge factor of such a transformation. -/ -lemma repU1_invariant_iff_u1 {B : Type*} [AddCommMonoid B] [Module ℂ B] +lemma repU1Factor_invariant_iff_u1 {B : Type*} [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (x : B) : - (∀ g : GaugeGroupI, repU1 repGauge g x = x) + (∀ g : GaugeGroupI, repU1Factor repGauge g x = x) ↔ ∀ u : unitary ℂ, repGauge (1, 1, u) x = x := ⟨fun h u => h (1, 1, u), fun h g => h (GaugeGroupI.toU1 g)⟩ /-- A submodule is stable under the hypercharge part of a representation precisely when it is stable under the gauge transformations trivial on colour and isospin. -/ -lemma repU1_stable_iff_u1 {B : Type*} [AddCommGroup B] [Module ℂ B] +lemma repU1Factor_stable_iff_u1 {B : Type*} [AddCommGroup B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) : - (∀ g : GaugeGroupI, ∀ y ∈ S, repU1 repGauge g y ∈ S) + (∀ g : GaugeGroupI, ∀ y ∈ S, repU1Factor repGauge g y ∈ S) ↔ ∀ u : unitary ℂ, ∀ y ∈ S, repGauge (1, 1, u) y ∈ S := ⟨fun h u => h (1, 1, u), fun h g => h (GaugeGroupI.toU1 g)⟩ @@ -228,7 +228,7 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] and the trace contraction do not mention the representation, so every statement of this file transports along this and is read at the hypercharge factor alone. -/ lemma toRepU1 (hT : IsU1BiAdjoint B repGauge T) : - IsU1BiAdjoint B (repU1 repGauge) T where + IsU1BiAdjoint B (repU1Factor repGauge) T where repGauge_T g := hT.repGauge_T g /-- The span of all the components. -/ @@ -341,7 +341,7 @@ lemma repGauge_u1_traceContraction (hT : IsU1BiAdjoint B repGauge T) (u : unitar The `u(1)` adjoint index takes a single value and the `U(1)` factor acts trivially on it, so every component of `T` is fixed by that factor, and hence so is every linear combination of the components. At the level of submodules this says that the span sits -inside the invariants of `repU1 repGauge`, the hypercharge part of the representation. +inside the invariants of `repU1Factor repGauge`, the hypercharge part of the representation. Invariance under the whole gauge group is a different matter, and does not follow: the colour and isospin factors are outside the transformation law and may move the components @@ -372,8 +372,8 @@ lemma repGauge_of_mem_span (hT : IsU1BiAdjoint B repGauge T) (u : unitary ℂ) { /-- The span of the components of a bi-adjoint `u(1)` family lies in the invariants of the hypercharge part of the representation: the submodule form of `repGauge_of_mem_span`. -/ -lemma span_le_repU1_invariants (hT : IsU1BiAdjoint B repGauge T) : - hT.span ≤ (repU1 repGauge).invariants := +lemma span_le_repU1Factor_invariants (hT : IsU1BiAdjoint B repGauge T) : + hT.span ≤ (repU1Factor repGauge).invariants := fun _ hx => (Representation.mem_invariants _ _).2 fun g => hT.repGauge_of_mem_span (GaugeGroupI.toU1 g) hx diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean index b508b703b..fbc975eea 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean @@ -9,6 +9,9 @@ public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeig public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsU1BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3Adjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint +public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz public import Mathlib.RepresentationTheory.Invariants /-! # Products of two field strengths as bi-adjoint gauge tensors @@ -39,6 +42,28 @@ the underived gluon and `W`-boson families. - D. The trace contractions and their mass weights - E. The underived trace contractions at mass weight eight - F. The weight vectors of mass weight eight inside the bi-adjoint spans +- G. The gauge invariants of mass weight eight +- H. The Lorentz classification of the mass-weight eight invariants +- I. The spans as invariants of mass weight eight +- J. The classifications as equivalences + +Putting the two directions together classifies the gauge invariants of mass weight eight +modulo any gauge-stable submodule: such an invariant is a combination of the three +underived trace contractions and the twice-derived hypercharge field strengths. What +carries an unpaired non-abelian adjoint index contributes nothing, by `IsSU3Adjoint` and +`IsSU2Adjoint`, and needs no hypothesis. +Mass weight eight has exactly two shapes, a product of two underived symbols and a single +twice-derived one, and both carry four covector indices and no others, so both are +quadruple Lorentz tensors and the Lorentz classification cuts the combinations down +further, to the four Lorentz contractions of each of the four families. + +Both classifications are one-directional as stated, and section I supplies the converse: +each of the two spans consists of invariants of mass weight eight already, the gauge one +because its generators are fixed by the gauge group and carry the right mass weight, and +the Lorentz one because it sits inside the gauge span and is spanned by contractions that +`IsQuadLorentz` shows to be Lorentz invariant. Section J puts the two directions together +as the equivalences `mem_massWeightSubmodule_eight_sup_and_invariant_iff` and +`mem_massWeightSubmodule_eight_sup_and_gauge_lorentz_invariant_iff`. -/ @@ -698,6 +723,1897 @@ lemma isospinRootPart_le_iSup_isSU2BiAdjoint_span : (h.adjVec_mul_adjVec_mem_isSU2BiAdjoint_span ![] μ' ν' ![] μ ν (Sum.inl 0) (Sum.inr (Sum.inl 0)))))) +/-! + +## G. The gauge invariants of mass weight eight + +A gauge invariant of mass weight eight lies in the zero-weight piece of the gauge weight +decomposition, and `massWeightSubmoduleGaugeWeightEight_piece_zero` splits that piece into +four parts: the twice-derived symbols on the four weight-zero directions of the adjoint, +the gluon root part, the isospin root part and the neutral part. Section F puts the two +root parts inside the joins of the bi-adjoint subspaces of the underived gluon and +`W`-boson families. The neutral part splits further by gauge group factor: a colour Cartan +direction against a colour Cartan direction is a bi-adjoint weight vector of a gluon +family, the isospin Cartan direction against itself of a `W`-boson family, and hypercharge +against itself of a hypercharge family; what is left pairs a weight-zero direction of one +factor with a weight-zero direction of another. + +The three joins are peeled off one at a time by +`IsSU3BiAdjoint.mem_span_sup_invariant_iff` and its `su(2)` twin, each time with the joins +not yet peeled off adjoined to the stable submodule `S`. That is what those sup lemmas +are for, and it is why no independence of the four parts is needed. Each join is itself +gauge stable, so the enlarged submodule stays stable, and the remainder is gauge invariant +for free, being the difference of two invariants. The `u(1)` join needs no classification +at all: a hypercharge field strength is fixed by the whole gauge group, so each of those +subspaces is already the line through its own trace contraction. + +What is left over carries an unpaired adjoint index of a non-abelian factor: a +twice-derived symbol on a colour or isospin Cartan direction, and a mixed neutral product, +which pairs a weight-zero direction of one factor with a weight-zero direction of another. +Neither contributes to a gauge invariant, the adjoint representation of `su(3)` and of +`su(2)` having no invariant vector, and `IsSU3Adjoint` and `IsSU2Adjoint` say exactly +that. Section G.5 assembles the families and kills both parts, so nothing about them has +to be assumed. + +The twice-derived hypercharge field strengths are the one part of the twice-derived tower +that survives: hypercharge is fixed by the whole gauge group at every derivative order, so +those are genuine gauge invariants of mass weight eight, and they are not combinations of +trace contractions. They are the second summand of the conclusion. + +The hypothesis is membership of the zero-weight piece joined with `S`. An element of the +mass-weight submodule joined with `S` need not have its mass-weight eight part invariant, +so nothing places it in the zero-weight piece directly; `mem_piece_zero_sup_of_invariant` +of section G.4 supplies that step for any gauge-stable `S`, and +`exists_mem_of_invariant_massWeightSubmodule_eight_sup` is the resulting statement about +`massWeightSubmodule 8 ⊔ S`. + +-/ + +/-! + +## G.1. Peeling a join of bi-adjoint subspaces + +-/ + +/-- A linear map obeying the `su(3)` bi-adjoint transformation law carries the span of the + components into itself: each component goes to a combination of components. -/ +lemma isSU3BiAdjoint_span_stable {T : (Fin 2 → Fin 8) → B} + (hT : IsSU3BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat U f T) {y : B} (hy : y ∈ hT.span) : f y ∈ hT.span := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [map_smul, hf d] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ ?_) + exact Submodule.mem_iSup_of_mem b (Submodule.mem_span_singleton_self _) + +/-- A linear map obeying the `su(2)` bi-adjoint transformation law carries the span of the + components into itself. -/ +lemma isSU2BiAdjoint_span_stable {T : (Fin 2 → Fin 3) → B} + (hT : IsSU2BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU2BiAdjointMat U f T) {y : B} (hy : y ∈ hT.span) : f y ∈ hT.span := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [map_smul, hf d] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ ?_) + exact Submodule.mem_iSup_of_mem b (Submodule.mem_span_singleton_self _) + +/-- Peeling a finite join of `su(3)` bi-adjoint subspaces off a gauge-stable submodule: + a gauge invariant of the join together with `S` is a combination of the trace + contractions of the families plus a gauge-invariant remainder in `S`. -/ +lemma exists_mem_of_invariant_biSup_isSU3BiAdjoint_span {ι : Type} [DecidableEq ι] + {T : ι → (Fin 2 → Fin 8) → B} (hT : ∀ i, IsSU3BiAdjoint B repGauge (T i)) + (hmat : ∀ (i : ι) (g : GaugeGroupI), + IsSU3BiAdjointMat (GaugeGroupI.toSU3 g) (repGauge g) (T i)) + (hmul : IsMulRep repGauge) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) (s : Finset ι) {x : B} + (hx : x ∈ (⨆ i ∈ s, (hT i).span) ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x - y ∈ ⨆ i ∈ s, ℂ ∙ (hT i).traceContraction := by + induction s using Finset.induction_on generalizing x with + | empty => + rw [show (⨆ i ∈ (∅ : Finset ι), (hT i).span) = ⊥ from by simp, bot_sup_eq] at hx + exact ⟨x, hx, hinv, by simp⟩ + | insert a s ha ih => + rw [Finset.iSup_insert, sup_assoc] at hx + have hstab : ∀ g : GaugeGroupI, ∀ y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S, + repGauge g y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S := by + intro g y hy + have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) + ≤ Submodule.comap (repGauge g) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + sup_le (iSup_le fun i => iSup_le fun hi => fun z hz => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem i + (Submodule.mem_iSup_of_mem hi + (isSU3BiAdjoint_span_stable (hT i) (hmat i g) hz)))) + fun z hz => Submodule.mem_sup_right (hS g z hz) + exact key hy + obtain ⟨c, y', hy', hxy', hy'inv⟩ := + (hT a).mem_span_sup_invariant_iff hmul x _ hstab + (fun g => IsSU3BiAdjoint.map_traceContraction _ (hmat a g)) hx hinv + obtain ⟨y, hyS, hyinv, hy'y⟩ := ih hy' hy'inv + refine ⟨y, hyS, hyinv, ?_⟩ + rw [Finset.iSup_insert, show x - y = c • (hT a).traceContraction + (y' - y) from by + rw [hxy']; abel] + exact Submodule.add_mem _ + (Submodule.mem_sup_left (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right hy'y) + +/-- Peeling a finite join of `su(2)` bi-adjoint subspaces off a gauge-stable submodule: + a gauge invariant of the join together with `S` is a combination of the trace + contractions of the families plus a gauge-invariant remainder in `S`. -/ +lemma exists_mem_of_invariant_biSup_isSU2BiAdjoint_span {ι : Type} [DecidableEq ι] + {T : ι → (Fin 2 → Fin 3) → B} (hT : ∀ i, IsSU2BiAdjoint B repGauge (T i)) + (hmat : ∀ (i : ι) (g : GaugeGroupI), + IsSU2BiAdjointMat (GaugeGroupI.toSU2 g) (repGauge g) (T i)) + (hmul : IsMulRep repGauge) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) (s : Finset ι) {x : B} + (hx : x ∈ (⨆ i ∈ s, (hT i).span) ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x - y ∈ ⨆ i ∈ s, ℂ ∙ (hT i).traceContraction := by + induction s using Finset.induction_on generalizing x with + | empty => + rw [show (⨆ i ∈ (∅ : Finset ι), (hT i).span) = ⊥ from by simp, bot_sup_eq] at hx + exact ⟨x, hx, hinv, by simp⟩ + | insert a s ha ih => + rw [Finset.iSup_insert, sup_assoc] at hx + have hstab : ∀ g : GaugeGroupI, ∀ y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S, + repGauge g y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S := by + intro g y hy + have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) + ≤ Submodule.comap (repGauge g) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + sup_le (iSup_le fun i => iSup_le fun hi => fun z hz => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem i + (Submodule.mem_iSup_of_mem hi + (isSU2BiAdjoint_span_stable (hT i) (hmat i g) hz)))) + fun z hz => Submodule.mem_sup_right (hS g z hz) + exact key hy + obtain ⟨c, y', hy', hxy', hy'inv⟩ := + (hT a).mem_span_sup_invariant_iff hmul x _ hstab + (fun g => IsSU2BiAdjoint.map_traceContraction _ (hmat a g)) hx hinv + obtain ⟨y, hyS, hyinv, hy'y⟩ := ih hy' hy'inv + refine ⟨y, hyS, hyinv, ?_⟩ + rw [Finset.iSup_insert, show x - y = c • (hT a).traceContraction + (y' - y) from by + rw [hxy']; abel] + exact Submodule.add_mem _ + (Submodule.mem_sup_left (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right hy'y) + +/-- The subspace of a bi-adjoint `u(1)` family is the line through its trace contraction: + there is a single pair of `u(1)` adjoint indices, and the trace contraction is the + component it names. -/ +lemma isU1BiAdjoint_span_eq_span_traceContraction {T : (Fin 2 → Fin 1) → B} + (hT : IsU1BiAdjoint B repGauge T) : hT.span = ℂ ∙ hT.traceContraction := by + have htc : hT.traceContraction = T ![0, 0] := by + show ∑ a : Fin 1, T ![a, a] = _ + simp + show (⨆ d, ℂ ∙ T d) = _ + rw [htc] + exact le_antisymm (iSup_le fun d => by rw [Subsingleton.elim d ![0, 0]]) + (le_iSup (fun d => ℂ ∙ T d) ![0, 0]) + +/-- Peeling a join of `u(1)` bi-adjoint subspaces off a submodule needs no classification: + every component of such a family is fixed by the whole gauge group once the + transformation law holds at every gauge element, so the join is a join of lines through + the trace contractions and the remainder is invariant for free. -/ +lemma exists_mem_of_invariant_iSup_isU1BiAdjoint_span {ι : Type} + {T : ι → (Fin 2 → Fin 1) → B} (hT : ∀ i, IsU1BiAdjoint B repGauge (T i)) + (hmat : ∀ (i : ι) (g : GaugeGroupI), + IsU1BiAdjointMat (GaugeGroupI.toU1 g) (repGauge g) (T i)) + (S : Submodule ℂ B) {x : B} (hx : x ∈ (⨆ i, (hT i).span) ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x - y ∈ ⨆ i, ℂ ∙ (hT i).traceContraction := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + have huinv : ∀ g : GaugeGroupI, repGauge g u = u := by + intro g + refine Submodule.iSup_induction (motive := fun v => repGauge g v = v) + (fun i => (hT i).span) hu (fun i v hv => (hT i).map_of_mem_span (hmat i g) hv) + (map_zero _) fun v w hv hw => by rw [map_add, hv, hw] + refine ⟨z, hz, fun g => ?_, ?_⟩ + · have hg := hinv g + rw [← huz, map_add, huinv g, add_right_inj] at hg + exact hg + · rw [← huz, add_sub_cancel_right] + refine Submodule.iSup_induction (motive := fun v => v ∈ ⨆ i, ℂ ∙ (hT i).traceContraction) + (fun i => (hT i).span) hu (fun i v hv => ?_) (Submodule.zero_mem _) + fun v w hv hw => Submodule.add_mem _ hv hw + rw [isU1BiAdjoint_span_eq_span_traceContraction (hT i)] at hv + exact Submodule.mem_iSup_of_mem i hv + +/-! + +## G.2. The neutral part split by gauge group factor + +-/ + +/-- The span of the underived colour Cartan vectors: the two weight-zero directions of the + `su(3)` factor of the gauge algebra. -/ +noncomputable def colourCartanSpan : Submodule ℂ B := + ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 2), + ℂ ∙ h.adjVec (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ ν + (Sum.inr (Sum.inr c.castSucc.castSucc)) + +/-- The span of the underived isospin Cartan vectors: the weight-zero direction of the + `su(2)` factor of the gauge algebra. -/ +noncomputable def isospinCartanSpan : Submodule ℂ B := + ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ ν (Sum.inr (Sum.inr 2)) + +/-- The span of the underived hypercharge vectors: the `u(1)` direction of the gauge + algebra, which carries weight zero on its own. -/ +noncomputable def hyperchargeCartanSpan : Submodule ℂ B := + ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + ℂ ∙ h.adjVec (![] : Fin 0 → Fin 1 ⊕ Fin 3) μ ν (Sum.inr (Sum.inr 3)) + +/-- The weight-zero directions of the adjoint split by gauge group factor: the two colour + Cartan directions, the isospin Cartan direction and hypercharge. -/ +lemma cartanSpan_le_sup : + h.cartanSpan + ≤ h.colourCartanSpan ⊔ (h.isospinCartanSpan ⊔ h.hyperchargeCartanSpan) := by + rw [cartanSpan, colourCartanSpan, isospinCartanSpan, hyperchargeCartanSpan] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => ?_ + rw [Subsingleton.elim l ![]] + fin_cases c + · refine le_sup_of_le_left (le_iSup_of_le μ ?_) + refine le_iSup_of_le ν ?_ + exact le_iSup_of_le (0 : Fin 2) le_rfl + · refine le_sup_of_le_left (le_iSup_of_le μ ?_) + refine le_iSup_of_le ν ?_ + exact le_iSup_of_le (1 : Fin 2) le_rfl + · refine le_sup_of_le_right (le_sup_of_le_left (le_iSup_of_le μ ?_)) + exact le_iSup_of_le ν le_rfl + · refine le_sup_of_le_right (le_sup_of_le_right (le_iSup_of_le μ ?_)) + exact le_iSup_of_le ν le_rfl + +/-- The index of a product of two underived field strengths: the two covector indices of + the first factor followed by the two covector indices of the second, read as one family + of four four-vector indices so that the Lorentz classification applies to it. -/ +abbrev EightIdx : Type := Fin 4 → Fin 1 ⊕ Fin 3 + +/-- The join, over all pairs of covector indices, of the bi-adjoint subspaces of the + products of two underived gluon field strengths. -/ +noncomputable def gluonPairSpan : Submodule ℂ B := + ⨆ p : EightIdx, + (h.isSU3BiAdjoint_gluonField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)).span + +/-- The join, over all pairs of covector indices, of the bi-adjoint subspaces of the + products of two underived `W`-boson field strengths. -/ +noncomputable def wPairSpan : Submodule ℂ B := + ⨆ p : EightIdx, + (h.isSU2BiAdjoint_wField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)).span + +/-- The join, over all pairs of covector indices, of the bi-adjoint subspaces of the + products of two underived hypercharge field strengths. -/ +noncomputable def hyperchargePairSpan : Submodule ℂ B := + ⨆ p : EightIdx, + (h.isU1BiAdjoint_hyperchargeField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)).span + +/-- The mixed neutral products: a weight-zero direction of one gauge group factor against + a weight-zero direction of another. Such a product carries an unpaired adjoint index of + each of the two factors, so it is a component of none of the three bi-adjoint + families. -/ +noncomputable def mixedCartanPart : Submodule ℂ B := + h.colourCartanSpan * (h.isospinCartanSpan ⊔ h.hyperchargeCartanSpan) + ⊔ ((h.isospinCartanSpan ⊔ h.hyperchargeCartanSpan) * h.colourCartanSpan + ⊔ (h.isospinCartanSpan * h.hyperchargeCartanSpan + ⊔ h.hyperchargeCartanSpan * h.isospinCartanSpan)) + +/-- A product of two colour Cartan directions is a bi-adjoint weight vector of a family of + two gluon field strengths. -/ +lemma colourCartanSpan_mul_self_le : h.colourCartanSpan * h.colourCartanSpan + ≤ h.gluonPairSpan := by + rw [colourCartanSpan, gluonPairSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun c => iSup_le fun μ' => + iSup_le fun ν' => iSup_le fun c' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem] + exact Submodule.mem_iSup_of_mem ![μ', ν', μ, ν] + (h.adjVec_mul_adjVec_mem_isSU3BiAdjoint_span ![] μ' ν' ![] μ ν + (Sum.inr (Sum.inr c')) (Sum.inr (Sum.inr c))) + +/-- A product of two isospin Cartan directions is a bi-adjoint weight vector of a family + of two `W`-boson field strengths. -/ +lemma isospinCartanSpan_mul_self_le : h.isospinCartanSpan * h.isospinCartanSpan + ≤ h.wPairSpan := by + rw [isospinCartanSpan, wPairSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem] + exact Submodule.mem_iSup_of_mem ![μ', ν', μ, ν] + (h.adjVec_mul_adjVec_mem_isSU2BiAdjoint_span ![] μ' ν' ![] μ ν + (Sum.inr (Sum.inr 0)) (Sum.inr (Sum.inr 0))) + +/-- A product of two hypercharge directions is a component of a family of two hypercharge + field strengths. -/ +lemma hyperchargeCartanSpan_mul_self_le : + h.hyperchargeCartanSpan * h.hyperchargeCartanSpan ≤ h.hyperchargePairSpan := by + rw [hyperchargeCartanSpan, hyperchargePairSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem] + exact Submodule.mem_iSup_of_mem ![μ', ν', μ, ν] + (h.adjVec_mul_adjVec_mem_isU1BiAdjoint_span ![] μ' ν' ![] μ ν) + +/-- The gluon contribution to the zero-weight piece lies in the join of the bi-adjoint + subspaces of the products of two underived gluon field strengths. -/ +lemma gluonRootPart_le_gluonPairSpan : h.gluonRootPart ≤ h.gluonPairSpan := + h.gluonRootPart_le_iSup_isSU3BiAdjoint_span.trans + (iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => + le_iSup (fun p : EightIdx => + (h.isSU3BiAdjoint_gluonField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)).span) + ![μ, ν, μ', ν']) + +/-- The isospin contribution to the zero-weight piece lies in the join of the bi-adjoint + subspaces of the products of two underived `W`-boson field strengths. -/ +lemma isospinRootPart_le_wPairSpan : h.isospinRootPart ≤ h.wPairSpan := + h.isospinRootPart_le_iSup_isSU2BiAdjoint_span.trans + (iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => + le_iSup (fun p : EightIdx => + (h.isSU2BiAdjoint_wField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)).span) + ![μ, ν, μ', ν']) + +/-- The neutral contribution to the zero-weight piece splits by gauge group factor: the + products pairing a factor with itself lie in the matching bi-adjoint subspaces, and what + is left is the mixed part, carrying an unpaired adjoint index of two different + factors. -/ +lemma neutralCartanPart_le : + h.neutralCartanPart + ≤ h.mixedCartanPart ⊔ (h.gluonPairSpan ⊔ (h.wPairSpan ⊔ h.hyperchargePairSpan)) := by + have hmono : ∀ P P' Q Q' : Submodule ℂ B, P ≤ P' → Q ≤ Q' → P * Q ≤ P' * Q' := + fun _ _ _ _ hp hq => Submodule.mul_le.mpr fun _ hx _ hy => + Submodule.mul_mem_mul (hp hx) (hq hy) + have expand : ∀ P Q P' Q' : Submodule ℂ B, + (P ⊔ Q) * (P' ⊔ Q') = (P * P' ⊔ Q * P') ⊔ (P * Q' ⊔ Q * Q') := fun P Q P' Q' => by + rw [Submodule.mul_sup, Submodule.sup_mul, Submodule.sup_mul] + rw [neutralCartanPart] + refine le_trans (hmono _ _ _ _ h.cartanSpan_le_sup h.cartanSpan_le_sup) ?_ + rw [mixedCartanPart, expand] + refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) + · exact le_sup_of_le_right (le_sup_of_le_left h.colourCartanSpan_mul_self_le) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_left) + · exact le_sup_of_le_left le_sup_left + · rw [expand] + refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) + · exact le_sup_of_le_right (le_sup_of_le_right + (le_sup_of_le_left h.isospinCartanSpan_mul_self_le)) + · exact le_sup_of_le_left (le_sup_of_le_right (le_sup_of_le_right le_sup_right)) + · exact le_sup_of_le_left (le_sup_of_le_right (le_sup_of_le_right le_sup_left)) + · exact le_sup_of_le_right (le_sup_of_le_right + (le_sup_of_le_right h.hyperchargeCartanSpan_mul_self_le)) + +/-- The twice-derived hypercharge field strengths, indexed by the two derivative slots and + the two covector indices. The hypercharge field strength is fixed by the whole gauge + group at every derivative order, so these are genuine gauge invariants of mass weight + eight, and they are not products of two field strengths. -/ +noncomputable def hyperchargeDerivSpan : Submodule ℂ B := + ⨆ d : EightIdx, ℂ ∙ h.hyperchargeField ![d 0, d 1] (d 2) (d 3) + +/-- The twice-derived symbols on the colour and isospin Cartan directions: the part of the + twice-derived tower that carries an unpaired adjoint index of a non-abelian factor. -/ +noncomputable def derivCartanNonAbelianPart : Submodule ℂ B := + ⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 3), + ℂ ∙ h.adjVec l μ ν (Sum.inr (Sum.inr c.castSucc)) + +/-- A vector of two covector indices is the tuple of its own two entries. -/ +lemma etaExpand_two (l : Fin 2 → Fin 1 ⊕ Fin 3) : ![l 0, l 1] = l := by + funext i + fin_cases i <;> simp + +/-- The twice-derived hypercharge field strengths are fixed pointwise by the gauge group, + the adjoint action on the `u(1)` factor being trivial. -/ +lemma repGauge_of_mem_hyperchargeDerivSpan (g : GaugeGroupI) {y : B} + (hy : y ∈ h.hyperchargeDerivSpan) : repGauge g y = y := by + rw [hyperchargeDerivSpan] at hy + refine Submodule.iSup_induction (motive := fun v => repGauge g v = v) _ hy + (fun d v hv => ?_) (map_zero _) fun v w hv hw => by rw [map_add, hv, hw] + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hv + rw [map_smul, h.repGauge_hyperchargeField] + +/-- The twice-derived hypercharge span is stable under the gauge group. -/ +lemma hyperchargeDerivSpan_stable (g : GaugeGroupI) {y : B} + (hy : y ∈ h.hyperchargeDerivSpan) : repGauge g y ∈ h.hyperchargeDerivSpan := by + rw [h.repGauge_of_mem_hyperchargeDerivSpan g hy] + exact hy + +/-- Splitting off a submodule the gauge group fixes pointwise: the remainder is gauge + invariant for free, being the difference of two invariants. -/ +lemma exists_mem_of_invariant_sup_fixed (V S : Submodule ℂ B) + (hV : ∀ g : GaugeGroupI, ∀ v ∈ V, repGauge g v = v) {x : B} (hx : x ∈ V ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) ∧ x - y ∈ V := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + refine ⟨z, hz, fun g => ?_, ?_⟩ + · have hg := hinv g + rw [← huz, map_add, hV g u hu, add_right_inj] at hg + exact hg + · rw [← huz, add_sub_cancel_right] + exact hu + +/-- The zero-weight piece of mass weight eight, bounded by the parts carrying an unpaired + non-abelian adjoint index on the one side, and the three bi-adjoint joins together with + the twice-derived hypercharge span on the other. -/ +lemma massWeightSubmoduleGaugeWeightEight_piece_zero_le : + (h.massWeightSubmoduleGaugeWeightEight).piece 0 + ≤ (h.derivCartanNonAbelianPart ⊔ h.mixedCartanPart) + ⊔ (h.gluonPairSpan ⊔ (h.wPairSpan ⊔ (h.hyperchargePairSpan + ⊔ h.hyperchargeDerivSpan))) := by + rw [h.massWeightSubmoduleGaugeWeightEight_piece_zero] + refine sup_le ?_ (sup_le ?_ (sup_le ?_ ?_)) + · refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => ?_ + rw [Submodule.span_singleton_le_iff_mem] + have hcart : ∀ c' : Fin 3, F l μ ν (GaugeAlgebra.stdBasis.coord + (GaugeAlgebra.cartanIdx c'.castSucc)) ∈ h.derivCartanNonAbelianPart := by + intro c' + exact Submodule.mem_iSup_of_mem l (Submodule.mem_iSup_of_mem μ + (Submodule.mem_iSup_of_mem ν (Submodule.mem_iSup_of_mem c' + (Submodule.mem_span_singleton_self _)))) + fin_cases c + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (hcart 0)) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (hcart 1)) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left (hcart 2)) + · refine Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_sup_right ?_))) + refine Submodule.mem_iSup_of_mem ![l 0, l 1, μ, ν] ?_ + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three, etaExpand_two] + exact Submodule.mem_span_singleton_self _ + · exact le_sup_of_le_right (le_sup_of_le_left h.gluonRootPart_le_gluonPairSpan) + · exact le_sup_of_le_right (le_sup_of_le_right + (le_sup_of_le_left h.isospinRootPart_le_wPairSpan)) + · refine h.neutralCartanPart_le.trans (sup_le (le_sup_of_le_left le_sup_right) ?_) + exact sup_le (le_sup_of_le_right le_sup_left) (sup_le + (le_sup_of_le_right (le_sup_of_le_right le_sup_left)) + (le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_left)))) + +/-! + +## G.5. The unpaired non-abelian adjoint indices + +A twice-derived symbol on a colour or isospin Cartan direction carries one unpaired +adjoint index of a non-abelian factor, and `IsSU3Adjoint` and `IsSU2Adjoint` say that such +a family has no gauge invariant in its span at all. Their sup forms therefore push a gauge +invariant of such a span joined with a stable submodule into the stable submodule: the +whole contribution of those directions to an invariant is nothing. Peeling a finite join +of them off works as for the bi-adjoint families, and needs the same stability, which each +span has because the transformation law holds at every gauge element. + +-/ + +/-- The gluon field strengths at fixed derivative slots and covector indices form a family + of one `su(3)` adjoint index. -/ +lemma isSU3Adjoint_gluonField {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + IsSU3Adjoint B repGauge (fun a : Fin 8 => h.gluonField l μ ν a) where + repGauge_T U c := h.repGauge_gluonField (U, 1, 1) l μ ν c + +/-- The transformation law of the gluon family at every gauge element, not only at the + colour ones. -/ +lemma isSU3AdjointMat_gluonField {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) (g : GaugeGroupI) : + IsSU3AdjointMat (GaugeGroupI.toSU3 g) (repGauge g) + (fun a : Fin 8 => h.gluonField l μ ν a) := + fun c => h.repGauge_gluonField g l μ ν c + +/-- The `W`-boson field strengths at fixed derivative slots and covector indices form a + family of one `su(2)` adjoint index. -/ +lemma isSU2Adjoint_wField {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + IsSU2Adjoint B repGauge (fun i : Fin 3 => h.wField l μ ν i) where + repGauge_T U c := h.repGauge_wField (1, U, 1) l μ ν c + +/-- The transformation law of the `W`-boson family at every gauge element. -/ +lemma isSU2AdjointMat_wField {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (g : GaugeGroupI) : + IsSU2AdjointMat (GaugeGroupI.toSU2 g) (repGauge g) + (fun i : Fin 3 => h.wField l μ ν i) := + fun c => h.repGauge_wField g l μ ν c + +/-- A linear map obeying the `su(3)` adjoint transformation law carries the span of the + components into itself. -/ +lemma isSU3Adjoint_span_stable {T : Fin 8 → B} (hT : IsSU3Adjoint B repGauge T) + {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} (hf : IsSU3AdjointMat U f T) + {y : B} (hy : y ∈ hT.span) : f y ∈ hT.span := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [map_smul, hf d] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ ?_) + exact Submodule.mem_iSup_of_mem b (Submodule.mem_span_singleton_self _) + +/-- A linear map obeying the `su(2)` adjoint transformation law carries the span of the + components into itself. -/ +lemma isSU2Adjoint_span_stable {T : Fin 3 → B} (hT : IsSU2Adjoint B repGauge T) + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} (hf : IsSU2AdjointMat U f T) + {y : B} (hy : y ∈ hT.span) : f y ∈ hT.span := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [map_smul, hf d] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ ?_) + exact Submodule.mem_iSup_of_mem b (Submodule.mem_span_singleton_self _) + +/-- A finite join of indexed suprema over a `Finset.univ` is the plain supremum. -/ +lemma biSup_univ {ι : Type} [Fintype ι] (f : ι → Submodule ℂ B) : + (⨆ i ∈ (Finset.univ : Finset ι), f i) = ⨆ i, f i := by simp + +/-- Peeling a finite join of `su(3)` adjoint subspaces off a colour-stable submodule: a + colour invariant of the join together with `S` lies in `S`, the adjoint representation + of `su(3)` having no invariant vector. Only colour stability is needed, and each adjoint + span has it from the transformation law itself. -/ +lemma mem_of_su3_invariant_biSup_isSU3Adjoint_span {ι : Type} [DecidableEq ι] + {T : ι → Fin 8 → B} (hT : ∀ i, IsSU3Adjoint B repGauge (T i)) (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S) + (s : Finset ι) {x : B} (hx : x ∈ (⨆ i ∈ s, (hT i).span) ⊔ S) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : x ∈ S := by + induction s using Finset.induction_on generalizing x with + | empty => + rwa [show (⨆ i ∈ (∅ : Finset ι), (hT i).span) = ⊥ from by simp, bot_sup_eq] at hx + | insert a s ha ih => + rw [Finset.iSup_insert, sup_assoc] at hx + have hstab : ∀ U : specialUnitaryGroup (Fin 3) ℂ, + ∀ y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S, + repGauge (U, 1, 1) y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S := by + intro U y hy + have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) + ≤ Submodule.comap (repGauge (U, 1, 1)) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + sup_le (iSup_le fun i => iSup_le fun hi => fun z hz => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem i + (Submodule.mem_iSup_of_mem hi + (isSU3Adjoint_span_stable (hT i) ((hT i).repGauge_T U) hz)))) + fun z hz => Submodule.mem_sup_right (hS U z hz) + exact key hy + exact ih ((hT a).mem_of_mem_span_sup_su3_invariant x _ hstab hx hinv) hinv + +/-- Peeling a finite join of `su(2)` adjoint subspaces off an isospin-stable submodule. -/ +lemma mem_of_su2_invariant_biSup_isSU2Adjoint_span {ι : Type} [DecidableEq ι] + {T : ι → Fin 3 → B} (hT : ∀ i, IsSU2Adjoint B repGauge (T i)) (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, U, 1) y ∈ S) + (s : Finset ι) {x : B} (hx : x ∈ (⨆ i ∈ s, (hT i).span) ⊔ S) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : x ∈ S := by + induction s using Finset.induction_on generalizing x with + | empty => + rwa [show (⨆ i ∈ (∅ : Finset ι), (hT i).span) = ⊥ from by simp, bot_sup_eq] at hx + | insert a s ha ih => + rw [Finset.iSup_insert, sup_assoc] at hx + have hstab : ∀ U : specialUnitaryGroup (Fin 2) ℂ, + ∀ y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S, + repGauge (1, U, 1) y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S := by + intro U y hy + have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) + ≤ Submodule.comap (repGauge (1, U, 1)) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + sup_le (iSup_le fun i => iSup_le fun hi => fun z hz => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem i + (Submodule.mem_iSup_of_mem hi + (isSU2Adjoint_span_stable (hT i) ((hT i).repGauge_T U) hz)))) + fun z hz => Submodule.mem_sup_right (hS U z hz) + exact key hy + exact ih ((hT a).mem_of_mem_span_sup_su2_invariant x _ hstab hx hinv) hinv + +/-- The `W`-boson field strengths are fixed by the colour factor of the gauge group: the + adjoint action on the `su(2)` block reads the isospin factor alone. -/ +lemma repGauge_su3_wField (U : specialUnitaryGroup (Fin 3) ℂ) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) (i : Fin 3) : + repGauge (U, 1, 1) (h.wField l μ ν i) = h.wField l μ ν i := by + rw [h.repGauge_wField (U, 1, 1) l μ ν i] + have hM : ∀ j : Fin 3, GaugeAlgebra.adjointMatrix ((U, 1, 1) : GaugeGroupI) + (Sum.inr (Sum.inl j)) (Sum.inr (Sum.inl i)) = if j = i then 1 else 0 := by + intro j + have h1 : GaugeAlgebra.adjointMatrix ((U, 1, 1) : GaugeGroupI) + (Sum.inr (Sum.inl j)) (Sum.inr (Sum.inl i)) + = GaugeAlgebra.adjointMatrix (1 : GaugeGroupI) + (Sum.inr (Sum.inl j)) (Sum.inr (Sum.inl i)) := rfl + rw [h1, GaugeAlgebra.adjointMatrix_one, Matrix.one_apply] + simp + simp only [hM] + simp + +/-- The two neutral underived directions that pair with a colour index in the mixed + neutral products: the isospin Cartan direction and hypercharge. -/ +noncomputable def neutralVec (μ ν : Fin 1 ⊕ Fin 3) : Fin 2 → B + | 0 => h.wField ![] μ ν GaugeAlgebra.su2CartanId + | 1 => h.hyperchargeField ![] μ ν + +/-- The neutral directions are fixed by the colour factor of the gauge group. -/ +lemma repGauge_su3_neutralVec (U : specialUnitaryGroup (Fin 3) ℂ) (μ ν : Fin 1 ⊕ Fin 3) + (j : Fin 2) : repGauge (U, 1, 1) (h.neutralVec μ ν j) = h.neutralVec μ ν j := by + fin_cases j + · exact h.repGauge_su3_wField U ![] μ ν GaugeAlgebra.su2CartanId + · exact h.repGauge_hyperchargeField (U, 1, 1) ![] μ ν + +/-- The index of a twice-derived symbol: the two derivative slots and the two covector + indices. -/ +abbrev DerivIdx : Type := + (Fin 2 → Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) + +/-- The index of a mixed neutral product: the two covector indices of the colour factor, + the two of the neutral factor, and which of the two neutral directions it is. -/ +abbrev MixIdx : Type := + (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × Fin 2 + +/-- The index of a family carrying one unpaired `su(3)` adjoint index at mass weight + eight: a twice-derived gluon tower, or an underived gluon field strength against a + neutral underived factor on either side. -/ +abbrev ColourIdx : Type := DerivIdx ⊕ (MixIdx ⊕ MixIdx) + +/-- The families carrying one unpaired `su(3)` adjoint index. -/ +noncomputable def colourFamily : ColourIdx → Fin 8 → B + | Sum.inl p => fun a => h.gluonField p.1 p.2.1 p.2.2 a + | Sum.inr (Sum.inl q) => + fun a => h.gluonField ![] q.1 q.2.1 a * h.neutralVec q.2.2.1 q.2.2.2.1 q.2.2.2.2 + | Sum.inr (Sum.inr q) => + fun a => h.neutralVec q.2.2.1 q.2.2.2.1 q.2.2.2.2 * h.gluonField ![] q.1 q.2.1 a + +/-- Each of those families is an `su(3)` adjoint family: the colour factor moves the gluon + index and fixes the neutral factor. -/ +lemma isSU3Adjoint_colourFamily (i : ColourIdx) : + IsSU3Adjoint B repGauge (h.colourFamily i) := by + rcases i with p | (q | q) + · exact h.isSU3Adjoint_gluonField p.1 p.2.1 p.2.2 + · refine ⟨fun U c => ?_⟩ + show repGauge (U, 1, 1) (h.gluonField ![] q.1 q.2.1 c + * h.neutralVec q.2.2.1 q.2.2.2.1 q.2.2.2.2) = _ + rw [hrepGauge_mul, h.repGauge_gluonField (U, 1, 1), h.repGauge_su3_neutralVec, + Finset.sum_mul] + exact Finset.sum_congr rfl fun a _ => by rw [smul_mul_assoc]; rfl + · refine ⟨fun U c => ?_⟩ + show repGauge (U, 1, 1) (h.neutralVec q.2.2.1 q.2.2.2.1 q.2.2.2.2 + * h.gluonField ![] q.1 q.2.1 c) = _ + rw [hrepGauge_mul, h.repGauge_gluonField (U, 1, 1), h.repGauge_su3_neutralVec, + Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [mul_smul_comm]; rfl + +/-- The index of a family carrying one unpaired `su(2)` adjoint index at mass weight + eight: a twice-derived `W`-boson tower, or an underived `W`-boson field strength against + an underived hypercharge field strength on either side. -/ +abbrev IsospinIdx : Type := DerivIdx ⊕ (EightIdx ⊕ EightIdx) + +/-- The families carrying one unpaired `su(2)` adjoint index. -/ +noncomputable def isospinFamily : IsospinIdx → Fin 3 → B + | Sum.inl p => fun i => h.wField p.1 p.2.1 p.2.2 i + | Sum.inr (Sum.inl q) => + fun i => h.wField ![] (q 0) (q 1) i * h.hyperchargeField ![] (q 2) (q 3) + | Sum.inr (Sum.inr q) => + fun i => h.hyperchargeField ![] (q 2) (q 3) * h.wField ![] (q 0) (q 1) i + +/-- Each of those families is an `su(2)` adjoint family: the isospin factor moves the + `W`-boson index and fixes hypercharge. -/ +lemma isSU2Adjoint_isospinFamily (i : IsospinIdx) : + IsSU2Adjoint B repGauge (h.isospinFamily i) := by + rcases i with p | (q | q) + · exact h.isSU2Adjoint_wField p.1 p.2.1 p.2.2 + · refine ⟨fun U c => ?_⟩ + show repGauge (1, U, 1) (h.wField ![] (q 0) (q 1) c + * h.hyperchargeField ![] (q 2) (q 3)) = _ + rw [hrepGauge_mul, h.repGauge_wField (1, U, 1), h.repGauge_hyperchargeField, + Finset.sum_mul] + exact Finset.sum_congr rfl fun a _ => by rw [smul_mul_assoc]; rfl + · refine ⟨fun U c => ?_⟩ + show repGauge (1, U, 1) (h.hyperchargeField ![] (q 2) (q 3) + * h.wField ![] (q 0) (q 1) c) = _ + rw [hrepGauge_mul, h.repGauge_wField (1, U, 1), h.repGauge_hyperchargeField, + Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [mul_smul_comm]; rfl + +/-- The `su(2)` adjoint families of mass weight eight are fixed by the colour factor, + every one of their factors being. -/ +lemma repGauge_su3_isospinFamily (U : specialUnitaryGroup (Fin 3) ℂ) (i : IsospinIdx) + (a : Fin 3) : repGauge (U, 1, 1) (h.isospinFamily i a) = h.isospinFamily i a := by + rcases i with p | (q | q) + · exact h.repGauge_su3_wField U p.1 p.2.1 p.2.2 a + · show repGauge (U, 1, 1) (h.wField ![] (q 0) (q 1) a + * h.hyperchargeField ![] (q 2) (q 3)) = _ + rw [hrepGauge_mul, h.repGauge_su3_wField, h.repGauge_hyperchargeField] + rfl + · show repGauge (U, 1, 1) (h.hyperchargeField ![] (q 2) (q 3) + * h.wField ![] (q 0) (q 1) a) = _ + rw [hrepGauge_mul, h.repGauge_su3_wField, h.repGauge_hyperchargeField] + rfl + +/-- The join of the `su(2)` adjoint spans is fixed pointwise by the colour factor. -/ +lemma repGauge_su3_of_mem_isospinJoin (U : specialUnitaryGroup (Fin 3) ℂ) {y : B} + (hy : y ∈ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) : + repGauge (U, 1, 1) y = y := by + refine Submodule.iSup_induction (motive := fun v => repGauge (U, 1, 1) v = v) _ hy + (fun i v hv => ?_) (map_zero _) fun v w hv hw => by rw [map_add, hv, hw] + obtain ⟨c, rfl⟩ := ((h.isSU2Adjoint_isospinFamily i).mem_span_iff v).1 hv + rw [map_sum] + exact Finset.sum_congr rfl fun d _ => by + rw [map_smul, h.repGauge_su3_isospinFamily U i d] + +/-- A gauge invariant of the join of all the unpaired non-abelian adjoint spans together + with a gauge-stable submodule lies in the submodule: the colour families are killed + first, with the isospin ones held in the colour-stable tail, and the isospin families + after that. -/ +lemma mem_of_invariant_nonAbelianUnpaired_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} + (hx : x ∈ ((⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ S := by + classical + rw [sup_assoc] at hx + have hSI : ∀ U : specialUnitaryGroup (Fin 3) ℂ, + ∀ y ∈ (⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) ⊔ S, + repGauge (U, 1, 1) y + ∈ (⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) ⊔ S := by + intro U y hy + have key : ((⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) ⊔ S) + ≤ Submodule.comap (repGauge (U, 1, 1)) + ((⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) ⊔ S) := + sup_le (fun z hz => show repGauge (U, 1, 1) z + ∈ (⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) ⊔ S from by + rw [h.repGauge_su3_of_mem_isospinJoin U hz] + exact Submodule.mem_sup_left hz) + fun z hz => Submodule.mem_sup_right (hS (U, 1, 1) z hz) + exact key hy + have hx₁ : x ∈ (⨆ i ∈ (Finset.univ : Finset ColourIdx), + (h.isSU3Adjoint_colourFamily i).span) + ⊔ ((⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) ⊔ S) := by + rw [biSup_univ] + exact hx + have hx₂ := mem_of_su3_invariant_biSup_isSU3Adjoint_span + (fun i : ColourIdx => h.isSU3Adjoint_colourFamily i) _ hSI Finset.univ hx₁ + fun U => hinv (U, 1, 1) + have hx₃ : x ∈ (⨆ i ∈ (Finset.univ : Finset IsospinIdx), + (h.isSU2Adjoint_isospinFamily i).span) ⊔ S := by + rw [biSup_univ] + exact hx₂ + exact mem_of_su2_invariant_biSup_isSU2Adjoint_span + (fun i : IsospinIdx => h.isSU2Adjoint_isospinFamily i) S + (fun U y hy => hS (1, U, 1) y hy) Finset.univ hx₃ fun U => hinv (1, U, 1) + +/-- The twice-derived symbols on the colour and isospin Cartan directions lie in the joins + of the single-adjoint spans. -/ +lemma derivCartanNonAbelianPart_le : + h.derivCartanNonAbelianPart + ≤ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := by + rw [derivCartanNonAbelianPart] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => ?_ + rw [Submodule.span_singleton_le_iff_mem] + have hglu : ∀ a : Fin 8, h.gluonField l μ ν a + ∈ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := fun a => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem (Sum.inl (l, μ, ν)) + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + have hw : ∀ i : Fin 3, h.wField l μ ν i + ∈ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := fun i => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem (Sum.inl (l, μ, ν)) + (Submodule.mem_iSup_of_mem i (Submodule.mem_span_singleton_self _))) + fin_cases c + · exact hglu (GaugeAlgebra.su3CartanId 0) + · exact hglu (GaugeAlgebra.su3CartanId 1) + · exact hw GaugeAlgebra.su2CartanId + +/-- A colour Cartan weight vector is the gluon field strength on the matching Cartan + direction of `su(3)`. -/ +lemma adjVec_colourCartan {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (c : Fin 2) : + h.adjVec l μ ν (Sum.inr (Sum.inr c.castSucc.castSucc)) + = h.gluonField l μ ν (GaugeAlgebra.su3CartanId c) := by + show F l μ ν (GaugeAlgebra.stdBasis.coord + (GaugeAlgebra.cartanIdx c.castSucc.castSucc)) = _ + rw [IsSU3BiAdjoint.cartanIdx_castSucc] + rfl + +/-- The mixed neutral products lie in the joins of the single-adjoint spans: each of them + pairs a weight-zero direction of one factor with a weight-zero direction of another, so + one non-abelian adjoint index is left unpaired. -/ +lemma mixedCartanPart_le : + h.mixedCartanPart + ≤ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := by + have hcol : ∀ (q : MixIdx) (a : Fin 8), h.colourFamily (Sum.inr (Sum.inl q)) a + ∈ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := fun q a => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem (Sum.inr (Sum.inl q)) + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + have hcol' : ∀ (q : MixIdx) (a : Fin 8), h.colourFamily (Sum.inr (Sum.inr q)) a + ∈ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := fun q a => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem (Sum.inr (Sum.inr q)) + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + have hiso : ∀ (q : EightIdx) (a : Fin 3), h.isospinFamily (Sum.inr (Sum.inl q)) a + ∈ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := fun q a => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem (Sum.inr (Sum.inl q)) + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + have hiso' : ∀ (q : EightIdx) (a : Fin 3), h.isospinFamily (Sum.inr (Sum.inr q)) a + ∈ (⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span := fun q a => + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem (Sum.inr (Sum.inr q)) + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + rw [mixedCartanPart, Submodule.mul_sup, Submodule.sup_mul] + refine sup_le (sup_le ?_ ?_) (sup_le (sup_le ?_ ?_) (sup_le ?_ ?_)) + · rw [colourCartanSpan, isospinCartanSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => + iSup_le fun c => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem, h.adjVec_colourCartan] + exact hcol (μ', ν', μ, ν, 0) (GaugeAlgebra.su3CartanId c) + · rw [colourCartanSpan, hyperchargeCartanSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => + iSup_le fun c => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem, h.adjVec_colourCartan] + exact hcol (μ', ν', μ, ν, 1) (GaugeAlgebra.su3CartanId c) + · rw [colourCartanSpan, isospinCartanSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun c => iSup_le fun μ' => + iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem, h.adjVec_colourCartan] + exact hcol' (μ, ν, μ', ν', 0) (GaugeAlgebra.su3CartanId c) + · rw [colourCartanSpan, hyperchargeCartanSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun c => iSup_le fun μ' => + iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem, h.adjVec_colourCartan] + exact hcol' (μ, ν, μ', ν', 1) (GaugeAlgebra.su3CartanId c) + · rw [isospinCartanSpan, hyperchargeCartanSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem] + exact hiso ![μ', ν', μ, ν] GaugeAlgebra.su2CartanId + · rw [isospinCartanSpan, hyperchargeCartanSpan] + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun μ => iSup_le fun ν => iSup_le fun μ' => iSup_le fun ν' => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton, + Submodule.span_singleton_le_iff_mem] + exact hiso' ![μ, ν, μ', ν'] GaugeAlgebra.su2CartanId + +/-! + +## G.4. The sup form of the zero-weight step + +`GaugeWeightDecomposition.mem_zero_of_invariant` places an invariant of `V` in the +zero-weight piece, but an element of `V ⊔ S` need not have its `V`-part invariant, so it +does not apply. Dividing by the gauge-stable `S` repairs that, at the cost of a target +that is only a module: the decomposition carries `IsMulRep` as a field and the quotient of +a ring by a submodule is no ring. Section F.4 of `IsSU3BiAdjoint` closes exactly that gap. +The trivial square-zero extension of a module is an algebra built from the module +structure alone, a representation extends to it acting trivially on the scalar part, and +the extension is multiplicative for free. Transporting the decomposition along the +composite of the quotient map with the injection of the module therefore gives a +decomposition to which `mem_zero_of_invariant` applies, and the injectivity of the two +maps carries the conclusion back. + +-/ + +/-- Transport of a gauge weight decomposition along an equivariant linear map into an + algebra: the pieces of the image are the images of the pieces, the eigenvector + equations being carried along by equivariance. -/ +@[implicit_reducible] +noncomputable def mapGaugeWeightDecomposition {N : Type} [Ring N] [Algebra ℂ N] + {rep' : Representation ℂ GaugeGroupI N} {V : Submodule ℂ B} + (d : GaugeWeightDecomposition repGauge V) (f : B →ₗ[ℂ] N) + (hf : ∀ (g : GaugeGroupI) (b : B), f (repGauge g b) = rep' g (f b)) + (hmul : IsMulRep rep') : GaugeWeightDecomposition rep' (V.map f) where + piece w := (d.piece w).map f + supp := d.supp + rep_mul := hmul + piece_le w x hx i := by + obtain ⟨b, hb, rfl⟩ := hx + rw [← hf, d.piece_le w b hb i, map_smul] + piece_eq_bot w hw := by rw [d.piece_eq_bot w hw, Submodule.map_bot] + iSup_piece := by rw [← Submodule.map_iSup, d.iSup_piece] + +section SquareZero + +variable {M : Type} [AddCommGroup M] [Module ℂ M] + +/-- The opposite scalar action on a complex vector space, which the square-zero extension + needs to be a ring. Since `ℂ` is commutative it is the given action read through `unop`, + and it is given a low priority so that the action of `ℂ` on itself is unaffected. -/ +noncomputable local instance (priority := 100) opModule : Module ℂᵐᵒᵖ M := + Module.compHom M ((RingHom.id ℂ).fromOpposite fun x y => mul_comm x y) + +/-- The two scalar actions of `ℂ` on a complex vector space commute. -/ +local instance (priority := 100) smulCommClassOpModule : SMulCommClass ℂ ℂᵐᵒᵖ M := + ⟨fun a b m => smul_comm a b.unop m⟩ + +/-- The opposite scalar action agrees with the given one, `ℂ` being commutative. -/ +local instance (priority := 100) isCentralScalarOpModule : IsCentralScalar ℂ M := + ⟨fun _ _ => rfl⟩ + +/-- A gauge invariant of `V ⊔ S`, for a gauge-stable `S`, lies in the zero-weight piece of + `V` joined with `S`. Nothing is asked of `S` beyond stability: the argument runs in the + square-zero extension of the quotient by `S`, where the transported decomposition still + makes sense. -/ +lemma mem_piece_zero_sup_of_invariant {V : Submodule ℂ B} + (d : GaugeWeightDecomposition repGauge V) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} (hx : x ∈ V ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ d.piece 0 ⊔ S := by + set ρ := IsSU3BiAdjoint.quotRep repGauge S hS with hρ + set f : B →ₗ[ℂ] TrivSqZeroExt ℂ (B ⧸ S) := + (TrivSqZeroExt.inrHom ℂ (B ⧸ S)).comp S.mkQ with hfdef + have hfapply : ∀ b : B, f b = TrivSqZeroExt.inr (S.mkQ b) := fun b => rfl + have hf : ∀ (g : GaugeGroupI) (b : B), + f (repGauge g b) = IsSU3BiAdjoint.sqZeroRep ρ g (f b) := by + intro g b + rw [hfapply, hfapply, IsSU3BiAdjoint.sqZeroRep_inr, hρ, + IsSU3BiAdjoint.quotRep_mkQ] + obtain ⟨u, hu, s, hs, hus⟩ := Submodule.mem_sup.1 hx + have hfs : f s = 0 := by + rw [hfapply, Submodule.mkQ_apply, (Submodule.Quotient.mk_eq_zero S).2 hs] + simp + have hfx : f x ∈ V.map f := by + rw [← hus, map_add, hfs, add_zero] + exact Submodule.mem_map_of_mem hu + have hfinv : ∀ g : GaugeGroupI, IsSU3BiAdjoint.sqZeroRep ρ g (f x) = f x := by + intro g + rw [← hf, hinv g] + obtain ⟨v, hv, hvx⟩ := GaugeWeightDecomposition.mem_zero_of_invariant + (mapGaugeWeightDecomposition d f hf (IsSU3BiAdjoint.isMulRep_sqZeroRep ρ)) hfx hfinv + have hxv : x - v ∈ S := by + have hq : S.mkQ (x - v) = 0 := by + rw [map_sub, sub_eq_zero] + exact (TrivSqZeroExt.inr_injective (R := ℂ) (by rw [← hfapply, ← hfapply, hvx])).symm + rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + rw [show x = v + (x - v) from by abel] + exact Submodule.add_mem _ (Submodule.mem_sup_left hv) (Submodule.mem_sup_right hxv) + +end SquareZero + +/-! + +## G.3. The invariants of mass weight eight + +-/ + +/-- The span of the three underived trace contractions, over all pairs of covector + indices: the gauge invariants of mass weight eight that the bi-adjoint classification + produces. -/ +noncomputable def traceContractionEightSpan : Submodule ℂ B := + (⨆ p : EightIdx, ℂ ∙ (h.isSU3BiAdjoint_gluonField_mul ![] (p 0) (p 1) ![] (p 2) + (p 3)).traceContraction) + ⊔ ((⨆ p : EightIdx, ℂ ∙ (h.isSU2BiAdjoint_wField_mul ![] (p 0) (p 1) ![] (p 2) + (p 3)).traceContraction) + ⊔ ⨆ p : EightIdx, ℂ ∙ (h.isU1BiAdjoint_hyperchargeField_mul ![] (p 0) (p 1) ![] + (p 2) (p 3)).traceContraction) + +/-- The join of the gluon bi-adjoint subspaces is stable under the gauge group: each + family obeys the transformation law at every gauge element. -/ +lemma gluonPairSpan_stable (g : GaugeGroupI) {y : B} (hy : y ∈ h.gluonPairSpan) : + repGauge g y ∈ h.gluonPairSpan := by + have key : h.gluonPairSpan ≤ Submodule.comap (repGauge g) h.gluonPairSpan := by + rw [gluonPairSpan] + exact iSup_le fun p z hz => Submodule.mem_iSup_of_mem p + (isSU3BiAdjoint_span_stable _ + (h.isSU3BiAdjointMat_gluonField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g) hz) + exact key hy + +/-- The join of the `W`-boson bi-adjoint subspaces is stable under the gauge group. -/ +lemma wPairSpan_stable (g : GaugeGroupI) {y : B} (hy : y ∈ h.wPairSpan) : + repGauge g y ∈ h.wPairSpan := by + have key : h.wPairSpan ≤ Submodule.comap (repGauge g) h.wPairSpan := by + rw [wPairSpan] + exact iSup_le fun p z hz => Submodule.mem_iSup_of_mem p + (isSU2BiAdjoint_span_stable _ + (h.isSU2BiAdjointMat_wField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g) hz) + exact key hy + +/-- The join of the hypercharge bi-adjoint subspaces is fixed pointwise by the gauge + group: each hypercharge field strength is, and so is every product of two of them. -/ +lemma repGauge_of_mem_hyperchargePairSpan (g : GaugeGroupI) {y : B} + (hy : y ∈ h.hyperchargePairSpan) : repGauge g y = y := by + rw [hyperchargePairSpan] at hy + refine Submodule.iSup_induction (motive := fun v => repGauge g v = v) _ hy + (fun p v hv => IsU1BiAdjoint.map_of_mem_span _ + (h.isU1BiAdjointMat_hyperchargeField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g) hv) + (map_zero _) fun v w hv hw => by rw [map_add, hv, hw] + +/-- The join of the hypercharge bi-adjoint subspaces is stable under the gauge group. -/ +lemma hyperchargePairSpan_stable (g : GaugeGroupI) {y : B} + (hy : y ∈ h.hyperchargePairSpan) : repGauge g y ∈ h.hyperchargePairSpan := by + rw [h.repGauge_of_mem_hyperchargePairSpan g hy] + exact hy + +/-- The gauge invariants of mass weight eight modulo any gauge-stable submodule: such an + invariant is a combination of the three underived trace contractions and the + twice-derived hypercharge field strengths, plus a gauge-invariant remainder in `S`. + Everything carrying an unpaired non-abelian adjoint index is killed first, contributing + nothing at all; the three bi-adjoint joins are then peeled off one at a time, each time + with the remaining ones joined to `S`, which stays gauge stable because each join is; + and the twice-derived hypercharge span is split off last, being fixed pointwise by the + gauge group. -/ +theorem exists_mem_of_invariant_piece_zero_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} + (hx : x ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x - y ∈ h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan := by + have hS₃ : ∀ g : GaugeGroupI, ∀ y ∈ h.hyperchargeDerivSpan ⊔ S, + repGauge g y ∈ h.hyperchargeDerivSpan ⊔ S := by + intro g y hy + have key : (h.hyperchargeDerivSpan ⊔ S) + ≤ Submodule.comap (repGauge g) (h.hyperchargeDerivSpan ⊔ S) := + sup_le (fun z hz => Submodule.mem_sup_left (h.hyperchargeDerivSpan_stable g hz)) + fun z hz => Submodule.mem_sup_right (hS g z hz) + exact key hy + have hS₂ : ∀ g : GaugeGroupI, ∀ y ∈ h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S), + repGauge g y ∈ h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S) := by + intro g y hy + have key : (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)) + ≤ Submodule.comap (repGauge g) + (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)) := + sup_le (fun z hz => Submodule.mem_sup_left (h.hyperchargePairSpan_stable g hz)) + fun z hz => Submodule.mem_sup_right (hS₃ g z hz) + exact key hy + have hS₁ : ∀ g : GaugeGroupI, ∀ y ∈ h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)), + repGauge g y ∈ h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)) := by + intro g y hy + have key : (h.wPairSpan ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S))) + ≤ Submodule.comap (repGauge g) (h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S))) := + sup_le (fun z hz => Submodule.mem_sup_left (h.wPairSpan_stable g hz)) + fun z hz => Submodule.mem_sup_right (hS₂ g z hz) + exact key hy + have hS₀ : ∀ g : GaugeGroupI, ∀ y ∈ h.gluonPairSpan ⊔ (h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S))), + repGauge g y ∈ h.gluonPairSpan ⊔ (h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S))) := by + intro g y hy + have key : (h.gluonPairSpan ⊔ (h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)))) + ≤ Submodule.comap (repGauge g) (h.gluonPairSpan ⊔ (h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)))) := + sup_le (fun z hz => Submodule.mem_sup_left (h.gluonPairSpan_stable g hz)) + fun z hz => Submodule.mem_sup_right (hS₁ g z hz) + exact key hy + have hle : (h.massWeightSubmoduleGaugeWeightEight).piece 0 ⊔ S + ≤ ((⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span) + ⊔ ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span) + ⊔ (h.gluonPairSpan ⊔ (h.wPairSpan + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)))) := by + refine sup_le (h.massWeightSubmoduleGaugeWeightEight_piece_zero_le.trans + (sup_le ?_ ?_)) ?_ + · exact (sup_le h.derivCartanNonAbelianPart_le h.mixedCartanPart_le).trans le_sup_left + · exact sup_le (le_sup_of_le_right le_sup_left) + (sup_le (le_sup_of_le_right (le_sup_of_le_right le_sup_left)) + (sup_le (le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_left))) + (le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right + (le_sup_of_le_right le_sup_left)))))) + · exact le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right + (le_sup_of_le_right le_sup_right))) + have hxT := h.mem_of_invariant_nonAbelianUnpaired_sup _ hS₀ (hle hx) hinv + have hxG : x ∈ (⨆ p ∈ (Finset.univ : Finset EightIdx), + (h.isSU3BiAdjoint_gluonField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)).span) + ⊔ (h.wPairSpan ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S))) := by + rw [biSup_univ] + exact hxT + obtain ⟨y₁, hy₁, hy₁inv, hxy₁⟩ := + exists_mem_of_invariant_biSup_isSU3BiAdjoint_span + (fun p : EightIdx => + h.isSU3BiAdjoint_gluonField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)) + (fun p g => h.isSU3BiAdjointMat_gluonField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g) + hrepGauge_mul _ hS₁ Finset.univ hxG hinv + rw [biSup_univ] at hxy₁ + have hyW : y₁ ∈ (⨆ p ∈ (Finset.univ : Finset EightIdx), + (h.isSU2BiAdjoint_wField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)).span) + ⊔ (h.hyperchargePairSpan ⊔ (h.hyperchargeDerivSpan ⊔ S)) := by + rw [biSup_univ] + exact hy₁ + obtain ⟨y₂, hy₂, hy₂inv, hy₁y₂⟩ := + exists_mem_of_invariant_biSup_isSU2BiAdjoint_span + (fun p : EightIdx => h.isSU2BiAdjoint_wField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)) + (fun p g => h.isSU2BiAdjointMat_wField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g) + hrepGauge_mul _ hS₂ Finset.univ hyW hy₁inv + rw [biSup_univ] at hy₁y₂ + obtain ⟨y₃, hy₃, hy₃inv, hy₂y₃⟩ := + exists_mem_of_invariant_iSup_isU1BiAdjoint_span + (fun p : EightIdx => + h.isU1BiAdjoint_hyperchargeField_mul ![] (p 0) (p 1) ![] (p 2) (p 3)) + (fun p g => + h.isU1BiAdjointMat_hyperchargeField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g) + (h.hyperchargeDerivSpan ⊔ S) hy₂ hy₂inv + obtain ⟨y₄, hy₄, hy₄inv, hy₃y₄⟩ := + exists_mem_of_invariant_sup_fixed h.hyperchargeDerivSpan S + (fun g v hv => h.repGauge_of_mem_hyperchargeDerivSpan g hv) hy₃ hy₃inv + refine ⟨y₄, hy₄, hy₄inv, ?_⟩ + rw [show x - y₄ = x - y₁ + (y₁ - y₂ + (y₂ - y₃ + (y₃ - y₄))) from by abel, + traceContractionEightSpan] + exact Submodule.add_mem _ (Submodule.mem_sup_left (Submodule.mem_sup_left hxy₁)) + (Submodule.add_mem _ (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_sup_left hy₁y₂))) + (Submodule.add_mem _ (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_sup_right hy₂y₃))) + (Submodule.mem_sup_right hy₃y₄))) + +/-- The sup form at the mass-weight submodule: a gauge invariant of + `massWeightSubmodule 8 ⊔ S`, for `S` gauge stable and absorbing the parts that carry an + unpaired non-abelian adjoint index, is a combination of the three underived trace + contractions and the twice-derived hypercharge field strengths plus a gauge-invariant + remainder in `S`. The weight-eight part of such an element need not itself be invariant, + and `mem_piece_zero_sup_of_invariant` is what places the element in the zero-weight + piece all the same. -/ +theorem exists_mem_of_invariant_massWeightSubmodule_eight_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 8 ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x - y ∈ h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan := + h.exists_mem_of_invariant_piece_zero_sup S hS + (mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightEight S hS hx hinv) + hinv + +/-- The gauge invariants of the mass-weight eight submodule itself, the case `x ∈ V` of + the sup form. -/ +theorem exists_mem_of_invariant_massWeightSubmodule_eight (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 8) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x - y ∈ h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan := + h.exists_mem_of_invariant_massWeightSubmodule_eight_sup S hS + (Submodule.mem_sup_left hx) hinv + +/-- An element of a finite join of lines is a linear combination of the vectors spanning + them. -/ +lemma exists_sum_of_mem_iSup_span_singleton {ι : Type} [Fintype ι] [DecidableEq ι] + (v : ι → B) {x : B} (hx : x ∈ ⨆ i, ℂ ∙ v i) : ∃ c : ι → ℂ, x = ∑ i, c i • v i := by + refine Submodule.iSup_induction (motive := fun z => ∃ c : ι → ℂ, z = ∑ i, c i • v i) + (fun i => ℂ ∙ v i) hx (fun i z hz => ?_) ⟨0, by simp⟩ ?_ + · obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hz + exact ⟨fun j => if j = i then a else 0, by + simp only [ite_smul, zero_smul, Finset.sum_ite_eq', Finset.mem_univ, if_true]⟩ + · rintro z w ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + +/-- The explicit form of `exists_mem_of_invariant_massWeightSubmodule_eight`: a gauge + invariant of mass weight eight is a combination of the three underived trace + contractions and the twice-derived hypercharge field strengths, one coefficient for each + family of four covector indices, plus a gauge-invariant remainder in `S`. -/ +theorem exists_sum_smul_traceContraction_of_invariant (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 8 ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ cG cW cB cD : EightIdx → ℂ, ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x = ∑ p, cG p • (h.isSU3BiAdjoint_gluonField_mul ![] (p 0) (p 1) ![] (p 2) + (p 3)).traceContraction + + (∑ p, cW p • (h.isSU2BiAdjoint_wField_mul ![] (p 0) (p 1) ![] (p 2) + (p 3)).traceContraction + + (∑ p, cB p • (h.isU1BiAdjoint_hyperchargeField_mul ![] (p 0) (p 1) ![] + (p 2) (p 3)).traceContraction + + (∑ p, cD p • h.hyperchargeField ![p 0, p 1] (p 2) (p 3) + y))) := by + obtain ⟨y, hyS, hyinv, hxy⟩ := + h.exists_mem_of_invariant_massWeightSubmodule_eight_sup S hS hx hinv + rw [traceContractionEightSpan, hyperchargeDerivSpan] at hxy + obtain ⟨u, hu, t, ht, hut⟩ := Submodule.mem_sup.1 hxy + obtain ⟨a, ha, v, hv, hav⟩ := Submodule.mem_sup.1 hu + obtain ⟨w, hw, z, hz, hwz⟩ := Submodule.mem_sup.1 hv + obtain ⟨cG, rfl⟩ := exists_sum_of_mem_iSup_span_singleton _ ha + obtain ⟨cW, rfl⟩ := exists_sum_of_mem_iSup_span_singleton _ hw + obtain ⟨cB, rfl⟩ := exists_sum_of_mem_iSup_span_singleton _ hz + obtain ⟨cD, rfl⟩ := exists_sum_of_mem_iSup_span_singleton _ ht + refine ⟨cG, cW, cB, cD, y, hyS, hyinv, ?_⟩ + rw [← hav, ← hwz] at hut + rw [sub_eq_iff_eq_add.mp hut.symm] + abel + +/-! + +## H. The Lorentz classification of the mass-weight eight invariants + +A product of two underived field-strength symbols carries four covector indices and +nothing else, so as a family indexed by those four it is a quadruple Lorentz tensor in the +sense of `IsQuadLorentz`. The transformation law is the Lorentz mirror of section B: +`repLorentz_F` at no covariant derivatives moves each covector index by the Lorentz matrix +of the `SL(2,ℂ)` element, and `hrepLorentz_mul` carries that through the product. + +The three trace contractions of section D are sums of such products over a gauge index, +and a finite sum of quadruple Lorentz tensors is one again, so each of the three is a +quadruple Lorentz tensor in its own right. So is the twice-derived hypercharge field +strength, whose two derivative slots and two covector indices are four four-vector indices +as well. Each of the four spans is exactly the join of the lines that section G produces, +which is what lets the two classifications be composed: the gauge classification puts an +invariant of mass weight eight into the join of the four spans together with `S`, and the +Lorentz sup lemma peels those spans off one at a time, exactly as the bi-adjoint sup +lemmas did for the gauge group. The remainder stays gauge invariant at each step because +the components of the four families are, so everything in their spans is. + +What is left is a combination of the four Lorentz contractions of each family: the outer, +inner and split metric contractions and the Levi-Civita contraction. The physical +expectation is that the first three collapse to one, the metric contraction of `F` with +itself, because `F` is antisymmetric in its two covector indices. That collapse is not +available here: `IsGaugeSector` does not assert the antisymmetry, its four fields being +the gauge law, the Lorentz law, the mass weight and commutativity, and none of them +relates `F l μ ν φ` to `F l ν μ φ`. All four contractions therefore survive. + +-/ + +include h in +/-- The Lorentz transformation of an underived field-strength symbol: the general law of + `IsGaugeSector` at no covariant derivatives, where the sum over the derivative slots is + a single term, written with the two covector rotations gathered into one coefficient. -/ +lemma repLorentz_F_underived (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + repLorentz Λ (F ![] μ ν φ) + = ∑ a : Fin 1 ⊕ Fin 3, ∑ b : Fin 1 ⊕ Fin 3, + ((((SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) * + (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ)) • F ![] a b φ := by + rw [h.repLorentz_F Λ 0 ![] μ ν φ, + Finset.sum_eq_single (![] : Fin 0 → Fin 1 ⊕ Fin 3) + (fun b _ hb => absurd (Subsingleton.elim b ![]) hb) + (fun hb => absurd (Finset.mem_univ _) hb), Fin.prod_univ_zero, one_smul] + exact Finset.sum_congr rfl fun a _ => by + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun b _ => by rw [smul_smul] + +include h in +/-- A product of two underived field-strength symbols, viewed as a family indexed by the + four covector indices it carries, is a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_F_mul (φ ψ : Module.Dual ℝ GaugeAlgebra) : + IsQuadLorentz B repLorentz + (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => F ![] (d 0) (d 1) φ * F ![] (d 2) (d 3) ψ) where + repLorentz_T g l := by + rw [hrepLorentz_mul, h.repLorentz_F_underived g (l 0) (l 1) φ, + h.repLorentz_F_underived g (l 2) (l 3) ψ, IsQuadLorentz.sum_pi_four, + Fintype.sum_mul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [show (∑ x : Fin 1 ⊕ Fin 3, (∑ b : Fin 1 ⊕ Fin 3, + ((((SL2C.toLorentzGroup g).1 a (l 0) : ℝ) : ℂ) * + (((SL2C.toLorentzGroup g).1 b (l 1) : ℝ) : ℂ)) • F ![] a b φ) * + ∑ y : Fin 1 ⊕ Fin 3, ((((SL2C.toLorentzGroup g).1 x (l 2) : ℝ) : ℂ) * + (((SL2C.toLorentzGroup g).1 y (l 3) : ℝ) : ℂ)) • F ![] x y ψ) + = ∑ x : Fin 1 ⊕ Fin 3, ∑ b : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, + (((((SL2C.toLorentzGroup g).1 a (l 0) : ℝ) : ℂ) * + (((SL2C.toLorentzGroup g).1 b (l 1) : ℝ) : ℂ)) • F ![] a b φ) * + (((((SL2C.toLorentzGroup g).1 x (l 2) : ℝ) : ℂ) * + (((SL2C.toLorentzGroup g).1 y (l 3) : ℝ) : ℂ)) • F ![] x y ψ) from + Finset.sum_congr rfl fun x _ => Fintype.sum_mul_sum _ _, Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => Finset.sum_congr rfl fun x _ => + Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm] + simp only [Fin.prod_univ_four, Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + ring_nf + +/-- A finite sum of quadruple Lorentz tensors is a quadruple Lorentz tensor: the + transformation law is linear in the family. -/ +lemma isQuadLorentz_sum {ι : Type} [Fintype ι] {T : ι → (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : ∀ i, IsQuadLorentz B repLorentz (T i)) : + IsQuadLorentz B repLorentz (fun d => ∑ i, T i d) where + repLorentz_T g l := by + have hstep : ∀ i, repLorentz g (T i l) = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, + (∏ j : Fin 4, (((SL2C.toLorentzGroup g).1 (a j) (l j) : ℝ) : ℂ)) • T i a := + fun i => (hT i).repLorentz_T g l + rw [map_sum] + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- The span of the components of a quadruple Lorentz tensor is stable under the Lorentz + group: each component goes to a combination of components. -/ +lemma isQuadLorentz_span_stable {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) (g : SL(2,ℂ)) {y : B} (hy : y ∈ hT.span) : + repLorentz g y ∈ hT.span := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [map_smul, hT.repLorentz_T g d] + exact Submodule.smul_mem _ _ (Submodule.sum_mem _ fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + +/-- A quadruple Lorentz tensor whose components are gauge invariant has a span of gauge + invariants; in particular its four Lorentz contractions are gauge invariant. -/ +lemma repGauge_of_mem_isQuadLorentz_span {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) + (hTinv : ∀ (g : GaugeGroupI) (d : Fin 4 → Fin 1 ⊕ Fin 3), repGauge g (T d) = T d) + (g : GaugeGroupI) {y : B} (hy : y ∈ hT.span) : repGauge g y = y := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hTinv g d] + +/-- The gluon trace contraction of two underived field strengths, read as a family of + four four-vector indices, is a quadruple Lorentz tensor: it is a sum over the colour + index of products of two underived field-strength symbols. -/ +lemma isQuadLorentz_gluonTrace : IsQuadLorentz B repLorentz (fun d : EightIdx => + (h.isSU3BiAdjoint_gluonField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)).traceContraction) := by + rw [show (fun d : EightIdx => + (h.isSU3BiAdjoint_gluonField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)).traceContraction) + = fun d : EightIdx => ∑ a : Fin 8, + F ![] (d 0) (d 1) (GaugeAlgebra.stdBasis.coord (Sum.inl a)) + * F ![] (d 2) (d 3) (GaugeAlgebra.stdBasis.coord (Sum.inl a)) from + funext fun d => h.traceContraction_gluonField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)] + exact isQuadLorentz_sum fun a => h.isQuadLorentz_F_mul _ _ + +/-- The `W`-boson trace contraction of two underived field strengths, read as a family of + four four-vector indices, is a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_wTrace : IsQuadLorentz B repLorentz (fun d : EightIdx => + (h.isSU2BiAdjoint_wField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)).traceContraction) := by + rw [show (fun d : EightIdx => + (h.isSU2BiAdjoint_wField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)).traceContraction) + = fun d : EightIdx => ∑ i : Fin 3, + F ![] (d 0) (d 1) (GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inl i))) + * F ![] (d 2) (d 3) (GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inl i))) from + funext fun d => h.traceContraction_wField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)] + exact isQuadLorentz_sum fun i => h.isQuadLorentz_F_mul _ _ + +/-- The hypercharge trace contraction of two underived field strengths, read as a family + of four four-vector indices, is a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_hyperchargeTrace : IsQuadLorentz B repLorentz (fun d : EightIdx => + (h.isU1BiAdjoint_hyperchargeField_mul ![] (d 0) (d 1) ![] (d 2) + (d 3)).traceContraction) := by + rw [show (fun d : EightIdx => + (h.isU1BiAdjoint_hyperchargeField_mul ![] (d 0) (d 1) ![] (d 2) + (d 3)).traceContraction) + = fun d : EightIdx => + F ![] (d 0) (d 1) (GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inr 0))) + * F ![] (d 2) (d 3) (GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inr 0))) from + funext fun d => h.traceContraction_hyperchargeField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)] + exact h.isQuadLorentz_F_mul _ _ + +/-- A sum over families of two covector indices is a double sum. -/ +lemma sum_pi_two_cov {M : Type*} [AddCommMonoid M] (f : (Fin 2 → Fin 1 ⊕ Fin 3) → M) : + ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, f d + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, f ![x, y] := by + rw [show (∑ d : Fin 2 → Fin 1 ⊕ Fin 3, f d) + = ∑ p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), f ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 1 ⊕ Fin 3) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +include h in +/-- The Lorentz transformation of a twice-derived field-strength symbol, with the four + covector rotations gathered into one coefficient: the two derivative slots and the two + covector indices all rotate. -/ +lemma repLorentz_F_twice (Λ : SL(2,ℂ)) (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + repLorentz Λ (F l μ ν φ) + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, + ∑ w : Fin 1 ⊕ Fin 3, + ((((SL2C.toLorentzGroup Λ).1 x (l 0) : ℝ) : ℂ) * + (((SL2C.toLorentzGroup Λ).1 y (l 1) : ℝ) : ℂ) * + (((SL2C.toLorentzGroup Λ).1 z μ : ℝ) : ℂ) * + (((SL2C.toLorentzGroup Λ).1 w ν : ℝ) : ℂ)) • F ![x, y] z w φ := by + rw [h.repLorentz_F Λ 2 l μ ν φ, sum_pi_two_cov] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [Finset.smul_sum] + refine Finset.sum_congr rfl fun z _ => ?_ + rw [smul_smul, Finset.smul_sum] + refine Finset.sum_congr rfl fun w _ => ?_ + rw [smul_smul] + congr 1 + simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + +include h in +/-- A twice-derived field-strength symbol, viewed as a family indexed by its two + derivative slots and its two covector indices, is a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_F_deriv_two (φ : Module.Dual ℝ GaugeAlgebra) : + IsQuadLorentz B repLorentz + (fun d : Fin 4 → Fin 1 ⊕ Fin 3 => F ![d 0, d 1] (d 2) (d 3) φ) where + repLorentz_T g l := by + rw [h.repLorentz_F_twice g ![l 0, l 1] (l 2) (l 3) φ, IsQuadLorentz.sum_pi_four] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => + Finset.sum_congr rfl fun z _ => Finset.sum_congr rfl fun w _ => ?_ + simp only [Fin.prod_univ_four, Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + +/-- The twice-derived hypercharge field strengths, read as a family of four four-vector + indices, form a quadruple Lorentz tensor. This is the second shape of mass weight + eight: a single field-strength symbol carrying two covariant derivatives. -/ +lemma isQuadLorentz_hyperchargeDeriv : IsQuadLorentz B repLorentz + (fun d : EightIdx => h.hyperchargeField ![d 0, d 1] (d 2) (d 3)) := + h.isQuadLorentz_F_deriv_two _ + +/-- The span of the four Lorentz contractions of a quadruple Lorentz tensor: the outer, + inner and split metric contractions and the Levi-Civita contraction. -/ +noncomputable def quadContractionSpan (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : Submodule ℂ B := + ℂ ∙ IsQuadLorentz.outerContraction (T := T) + ⊔ (ℂ ∙ IsQuadLorentz.innerContraction (T := T) + ⊔ (ℂ ∙ IsQuadLorentz.splitContraction (T := T) + ⊔ ℂ ∙ IsQuadLorentz.epsilonContraction (T := T))) + +/-- Peeling the span of a quadruple Lorentz tensor off a Lorentz-stable submodule. The + remainder is Lorentz invariant by the sup lemma of `IsQuadLorentz`, and gauge invariant + as well whenever the components of the family are, the four contractions then being + gauge invariant along with everything else in the span. -/ +lemma exists_mem_of_invariant_isQuadLorentz_span_sup {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) + (hTinv : ∀ (g : GaugeGroupI) (d : Fin 4 → Fin 1 ⊕ Fin 3), repGauge g (T d) = T d) + (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ hT.span ⊔ S) (hLinv : ∀ g : SL(2,ℂ), repLorentz g x = x) + (hGinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) + ∧ (∀ g : GaugeGroupI, repGauge g y = y) ∧ x - y ∈ quadContractionSpan T := by + obtain ⟨a₁, a₂, a₃, a₄, y, hyS, hxy, hyinv⟩ := + (hT.mem_span_sup_invariant_iff x S hS).1 ⟨hx, hLinv⟩ + have hz : ∀ g : GaugeGroupI, + repGauge g (a₁ • IsQuadLorentz.outerContraction (T := T) + + a₂ • IsQuadLorentz.innerContraction (T := T) + + a₃ • IsQuadLorentz.splitContraction (T := T) + + a₄ • IsQuadLorentz.epsilonContraction (T := T)) + = a₁ • IsQuadLorentz.outerContraction (T := T) + + a₂ • IsQuadLorentz.innerContraction (T := T) + + a₃ • IsQuadLorentz.splitContraction (T := T) + + a₄ • IsQuadLorentz.epsilonContraction (T := T) := + fun g => repGauge_of_mem_isQuadLorentz_span hT hTinv g + (hT.smul_contraction_mem_span a₁ a₂ a₃ a₄) + refine ⟨y, hyS, hyinv, fun g => ?_, ?_⟩ + · have hg := hGinv g + rw [hxy, map_add, hz g, add_right_inj] at hg + exact hg + · rw [hxy, add_sub_cancel_right, quadContractionSpan] + exact Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ + (Submodule.mem_sup_left (Submodule.smul_mem _ _ + (Submodule.mem_span_singleton_self _))) + (Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.smul_mem _ _ + (Submodule.mem_span_singleton_self _))))) + (Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_sup_left + (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _)))))) + (Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _))))) + +/-- The span of the three underived trace contractions is the join of the spans of the + three quadruple Lorentz families they form. -/ +lemma traceContractionEightSpan_eq : + h.traceContractionEightSpan = (h.isQuadLorentz_gluonTrace).span + ⊔ ((h.isQuadLorentz_wTrace).span ⊔ (h.isQuadLorentz_hyperchargeTrace).span) := rfl + +/-- The span of the four Lorentz contractions of each of the three underived + trace-contraction families: the gauge and Lorentz invariants of mass weight eight that + the two classifications together produce. -/ +noncomputable def lorentzContractionEightSpan : Submodule ℂ B := + quadContractionSpan (fun d : EightIdx => + (h.isSU3BiAdjoint_gluonField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)).traceContraction) + ⊔ (quadContractionSpan (fun d : EightIdx => + (h.isSU2BiAdjoint_wField_mul ![] (d 0) (d 1) ![] (d 2) (d 3)).traceContraction) + ⊔ (quadContractionSpan (fun d : EightIdx => + (h.isU1BiAdjoint_hyperchargeField_mul ![] (d 0) (d 1) ![] (d 2) + (d 3)).traceContraction) + ⊔ quadContractionSpan (fun d : EightIdx => + h.hyperchargeField ![d 0, d 1] (d 2) (d 3)))) + +/-- The gauge and Lorentz invariants of mass weight eight, modulo a submodule `S` stable + under both groups and absorbing the parts that carry an unpaired non-abelian adjoint + index. The gauge classification of section G puts such an invariant in the join of the + three trace-contraction spans and the twice-derived hypercharge span together with `S`; + each of those four is the span of a quadruple Lorentz tensor, so the Lorentz sup lemma + peels them off one at a time, leaving a combination of the four Lorentz contractions of + each family. The remainders stay gauge invariant because the components of the four + families are. -/ +theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 8 ⊔ S) + (hGinv : ∀ g : GaugeGroupI, repGauge g x = x) + (hLinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) + ∧ x - y ∈ h.lorentzContractionEightSpan := by + obtain ⟨y₀, hy₀S, hy₀G, hxy₀⟩ := + h.exists_mem_of_invariant_massWeightSubmodule_eight_sup S hS hx hGinv + rw [h.traceContractionEightSpan_eq] at hxy₀ + have hS₃ : ∀ g : SL(2,ℂ), ∀ y ∈ (h.isQuadLorentz_hyperchargeDeriv).span ⊔ S, + repLorentz g y ∈ (h.isQuadLorentz_hyperchargeDeriv).span ⊔ S := by + intro g y hy + have key : ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S) + ≤ Submodule.comap (repLorentz g) + ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S) := + sup_le (fun z hz => Submodule.mem_sup_left (isQuadLorentz_span_stable _ g hz)) + fun z hz => Submodule.mem_sup_right (hSL g z hz) + exact key hy + have hS₂ : ∀ g : SL(2,ℂ), ∀ y ∈ (h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S), + repLorentz g y ∈ (h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S) := by + intro g y hy + have key : ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S)) + ≤ Submodule.comap (repLorentz g) ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S)) := + sup_le (fun z hz => Submodule.mem_sup_left (isQuadLorentz_span_stable _ g hz)) + fun z hz => Submodule.mem_sup_right (hS₃ g z hz) + exact key hy + have hS₁ : ∀ g : SL(2,ℂ), ∀ y ∈ (h.isQuadLorentz_wTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S)), + repLorentz g y ∈ (h.isQuadLorentz_wTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S)) := by + intro g y hy + have key : ((h.isQuadLorentz_wTrace).span ⊔ ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S))) + ≤ Submodule.comap (repLorentz g) ((h.isQuadLorentz_wTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S))) := + sup_le (fun z hz => Submodule.mem_sup_left (isQuadLorentz_span_stable _ g hz)) + fun z hz => Submodule.mem_sup_right (hS₂ g z hz) + exact key hy + have hx₁ : x ∈ (h.isQuadLorentz_gluonTrace).span ⊔ ((h.isQuadLorentz_wTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S))) := by + rw [show x = x - y₀ + y₀ from by abel] + refine Submodule.add_mem _ ?_ (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_sup_right (Submodule.mem_sup_right hy₀S)))) + have hle : ((h.isQuadLorentz_gluonTrace).span ⊔ ((h.isQuadLorentz_wTrace).span + ⊔ (h.isQuadLorentz_hyperchargeTrace).span)) + ⊔ (h.isQuadLorentz_hyperchargeDeriv).span + ≤ (h.isQuadLorentz_gluonTrace).span ⊔ ((h.isQuadLorentz_wTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeTrace).span + ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S))) := + sup_le (sup_le le_sup_left (sup_le (le_sup_of_le_right le_sup_left) + (le_sup_of_le_right (le_sup_of_le_right le_sup_left)))) + (le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_left))) + exact hle hxy₀ + obtain ⟨y₁, hy₁, hy₁L, hy₁G, hxy₁⟩ := + exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_gluonTrace + (fun g d => IsSU3BiAdjoint.map_traceContraction _ + (h.isSU3BiAdjointMat_gluonField_mul ![] (d 0) (d 1) ![] (d 2) (d 3) g)) + _ hS₁ hx₁ hLinv hGinv + obtain ⟨y₂, hy₂, hy₂L, hy₂G, hxy₂⟩ := + exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_wTrace + (fun g d => IsSU2BiAdjoint.map_traceContraction _ + (h.isSU2BiAdjointMat_wField_mul ![] (d 0) (d 1) ![] (d 2) (d 3) g)) + _ hS₂ hy₁ hy₁L hy₁G + obtain ⟨y₃, hy₃, hy₃L, hy₃G, hxy₃⟩ := + exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_hyperchargeTrace + (fun g d => IsU1BiAdjoint.map_traceContraction _ + (h.isU1BiAdjointMat_hyperchargeField_mul ![] (d 0) (d 1) ![] (d 2) (d 3) g)) + _ hS₃ hy₂ hy₂L hy₂G + obtain ⟨y₄, hy₄, hy₄L, hy₄G, hxy₄⟩ := + exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_hyperchargeDeriv + (fun g d => h.repGauge_hyperchargeField g ![d 0, d 1] (d 2) (d 3)) + S hSL hy₃ hy₃L hy₃G + refine ⟨y₄, hy₄, hy₄G, hy₄L, ?_⟩ + rw [show x - y₄ = x - y₁ + (y₁ - y₂ + (y₂ - y₃ + (y₃ - y₄))) from by abel, + lorentzContractionEightSpan] + exact Submodule.add_mem _ (Submodule.mem_sup_left hxy₁) + (Submodule.add_mem _ (Submodule.mem_sup_right (Submodule.mem_sup_left hxy₂)) + (Submodule.add_mem _ (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_sup_left hxy₃))) + (Submodule.mem_sup_right (Submodule.mem_sup_right + (Submodule.mem_sup_right hxy₄))))) + +/-- The Minkowski symbol is symmetric, being diagonal. -/ +lemma etaZ_comm (μ ν : Fin 1 ⊕ Fin 3) : + IsQuadLorentz.etaZ μ ν = IsQuadLorentz.etaZ ν μ := by + revert μ ν + decide + +/-- A family of four four-vector indices written as a fourfold sum, with the four indices + read off the tuple. -/ +lemma sum_quad {M : Type*} [AddCommMonoid M] + (f : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → M) : + (∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, + ∑ w : Fin 1 ⊕ Fin 3, f x y z w) + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, + ∑ w : Fin 1 ⊕ Fin 3, f y x z w := by + rw [Finset.sum_comm] + +/-- The outer contraction of a quadruple Lorentz tensor antisymmetric in its first two + indices vanishes: the metric is symmetric in the pair the outer contraction ties + together, so exchanging the two indices carries the sum to minus itself. -/ +lemma outerContraction_eq_zero_of_swap {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hswap : ∀ x y z w : Fin 1 ⊕ Fin 3, T ![y, x, z, w] = - T ![x, y, z, w]) : + IsQuadLorentz.outerContraction (T := T) = 0 := by + have h1 : IsQuadLorentz.outerContraction (T := T) + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, + ∑ w : Fin 1 ⊕ Fin 3, + ((IsQuadLorentz.etaZ x y * IsQuadLorentz.etaZ z w : ℤ) : ℂ) • T ![x, y, z, w] := by + rw [IsQuadLorentz.outerContraction, IsQuadLorentz.sum_pi_four] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + have h3 : ∀ x y z w : Fin 1 ⊕ Fin 3, + ((IsQuadLorentz.etaZ y x * IsQuadLorentz.etaZ z w : ℤ) : ℂ) • T ![y, x, z, w] + = -(((IsQuadLorentz.etaZ x y * IsQuadLorentz.etaZ z w : ℤ) : ℂ) • + T ![x, y, z, w]) := by + intro x y z w + rw [hswap x y z w, smul_neg, etaZ_comm y x] + have h4 : IsQuadLorentz.outerContraction (T := T) + = - IsQuadLorentz.outerContraction (T := T) := by + conv_lhs => rw [h1, sum_quad fun x y z w => + ((IsQuadLorentz.etaZ x y * IsQuadLorentz.etaZ z w : ℤ) : ℂ) • T ![x, y, z, w]] + rw [h1, ← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl fun y _ => ?_ + rw [← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl fun z _ => ?_ + rw [← Finset.sum_neg_distrib] + exact Finset.sum_congr rfl fun w _ => h3 x y z w + have h5 : (2 : ℂ) • IsQuadLorentz.outerContraction (T := T) = 0 := by + rw [two_smul] + nth_rewrite 1 [h4] + exact neg_add_cancel _ + calc IsQuadLorentz.outerContraction (T := T) + = ((2 : ℂ)⁻¹ * 2) • IsQuadLorentz.outerContraction (T := T) := by + rw [inv_mul_cancel₀ (by norm_num : (2 : ℂ) ≠ 0), one_smul] + _ = (2 : ℂ)⁻¹ • ((2 : ℂ) • IsQuadLorentz.outerContraction (T := T)) := by rw [mul_smul] + _ = 0 := by rw [h5, smul_zero] + +/-- The split contraction of a quadruple Lorentz tensor antisymmetric in its first two + indices is minus the inner one: exchanging the first two indices exchanges the two + metric pairings and changes the sign of the tensor. -/ +lemma splitContraction_eq_neg_innerContraction_of_swap + {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hswap : ∀ x y z w : Fin 1 ⊕ Fin 3, T ![y, x, z, w] = - T ![x, y, z, w]) : + IsQuadLorentz.splitContraction (T := T) + = - IsQuadLorentz.innerContraction (T := T) := by + have h1 : IsQuadLorentz.splitContraction (T := T) + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, + ∑ w : Fin 1 ⊕ Fin 3, + ((IsQuadLorentz.etaZ x w * IsQuadLorentz.etaZ y z : ℤ) : ℂ) • T ![x, y, z, w] := by + rw [IsQuadLorentz.splitContraction, IsQuadLorentz.sum_pi_four] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + have h2 : IsQuadLorentz.innerContraction (T := T) + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, + ∑ w : Fin 1 ⊕ Fin 3, + ((IsQuadLorentz.etaZ x z * IsQuadLorentz.etaZ y w : ℤ) : ℂ) • T ![x, y, z, w] := by + rw [IsQuadLorentz.innerContraction, IsQuadLorentz.sum_pi_four] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + have h3 : ∀ x y z w : Fin 1 ⊕ Fin 3, + ((IsQuadLorentz.etaZ y w * IsQuadLorentz.etaZ x z : ℤ) : ℂ) • T ![y, x, z, w] + = -(((IsQuadLorentz.etaZ x z * IsQuadLorentz.etaZ y w : ℤ) : ℂ) • + T ![x, y, z, w]) := by + intro x y z w + rw [hswap x y z w, smul_neg, mul_comm (IsQuadLorentz.etaZ y w)] + conv_lhs => rw [h1, sum_quad fun x y z w => + ((IsQuadLorentz.etaZ x w * IsQuadLorentz.etaZ y z : ℤ) : ℂ) • T ![x, y, z, w]] + rw [h2, ← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl fun y _ => ?_ + rw [← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl fun z _ => ?_ + rw [← Finset.sum_neg_distrib] + exact Finset.sum_congr rfl fun w _ => h3 x y z w + + +/-! + +## I. The spans as invariants of mass weight eight + +Sections G and H run one way: a gauge invariant, or a gauge and Lorentz invariant, of mass +weight eight is a combination of the generators of a span, up to a remainder in `S`. The +converse is that the span is made of such invariants to begin with, and it is what turns +each classification into an equivalence. + +Nothing new is needed for it. The generators of the trace-contraction span are gauge +invariant by the three bi-adjoint transformation laws of section B, and those of the +twice-derived hypercharge span by `repGauge_hyperchargeField`, which fixes the hypercharge +field strength at every derivative order; their mass weights are those of section E and of +`derivSubmodule`. The Lorentz contraction span is smaller still, each of its four blocks +being spanned by the four contractions of a quadruple Lorentz family, and a contraction is +a combination of the components of its family with the constant coefficients `etaZ` and +`epsilonSignZ`, so it lies in the span of those components. Gauge invariance and mass +weight therefore pass to it from the gauge spans, and Lorentz invariance comes from +`IsQuadLorentz` directly. + +## I.1. The contractions inside the span of the components + +-/ + +/-- A quadruple Lorentz family whose components all lie in a submodule has its whole span + of components there. -/ +lemma isQuadLorentz_span_le {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) (V : Submodule ℂ B) (hV : ∀ d, T d ∈ V) : + hT.span ≤ V := + iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).2 (hV d) + +/-- The span of the four Lorentz contractions of a quadruple Lorentz family lies in the + span of its components: each contraction is a combination of components with constant + coefficients. -/ +lemma quadContractionSpan_le_span {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) : quadContractionSpan T ≤ hT.span := + sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 hT.outerContraction_mem_span) + (sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 hT.innerContraction_mem_span) + (sup_le ((Submodule.span_singleton_le_iff_mem _ _).2 hT.splitContraction_mem_span) + ((Submodule.span_singleton_le_iff_mem _ _).2 hT.epsilonContraction_mem_span))) + +/-- The span of the four Lorentz contractions of a quadruple Lorentz family is a space of + Lorentz invariants, the four contractions being invariant by section I.6 of + `IsQuadLorentz`. -/ +lemma quadContractionSpan_le_lorentzInvariants {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) : + quadContractionSpan T ≤ repLorentz.invariants := by + refine sup_le ?_ (sup_le ?_ (sup_le ?_ ?_)) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 hT.repLorentz_outerContraction) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 hT.repLorentz_innerContraction) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 hT.repLorentz_splitContraction) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 hT.repLorentz_epsilonContraction) + +/-! + +## I.2. The gauge spans are gauge invariants of mass weight eight + +-/ + +/-- The span of the three underived trace contractions is a space of gauge invariants: + each generator is fixed by the gauge group, by the bi-adjoint law of its family. -/ +lemma traceContractionEightSpan_le_invariants : + h.traceContractionEightSpan ≤ repGauge.invariants := by + rw [traceContractionEightSpan] + refine sup_le (iSup_le fun p => ?_) (sup_le (iSup_le fun p => ?_) (iSup_le fun p => ?_)) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 fun g => IsSU3BiAdjoint.map_traceContraction _ + (h.isSU3BiAdjointMat_gluonField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g)) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 fun g => IsSU2BiAdjoint.map_traceContraction _ + (h.isSU2BiAdjointMat_wField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g)) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 fun g => IsU1BiAdjoint.map_traceContraction _ + (h.isU1BiAdjointMat_hyperchargeField_mul ![] (p 0) (p 1) ![] (p 2) (p 3) g)) + +/-- The twice-derived hypercharge span is a space of gauge invariants, its generators + being fixed pointwise by the whole gauge group. -/ +lemma hyperchargeDerivSpan_le_invariants : + h.hyperchargeDerivSpan ≤ repGauge.invariants := + fun _ hy => (Representation.mem_invariants _ _).2 fun g => + h.repGauge_of_mem_hyperchargeDerivSpan g hy + +/-- The span of the three underived trace contractions lies in the mass-weight eight + submodule: each generator does, by section E. -/ +lemma traceContractionEightSpan_le_massWeightSubmodule : + h.traceContractionEightSpan ≤ h.massWeightSubmodule 8 := by + rw [traceContractionEightSpan] + refine sup_le (iSup_le fun p => ?_) (sup_le (iSup_le fun p => ?_) (iSup_le fun p => ?_)) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_inf.1 + (h.traceContraction_gluonField_mul_mem_eight (p 0) (p 1) (p 2) (p 3))).1 + · exact (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_inf.1 + (h.traceContraction_wField_mul_mem_eight (p 0) (p 1) (p 2) (p 3))).1 + · exact (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_inf.1 + (h.traceContraction_hyperchargeField_mul_mem_eight (p 0) (p 1) (p 2) (p 3))).1 + +/-- The twice-derived hypercharge span lies in the mass-weight eight submodule: a + field-strength symbol with two covariant derivatives has mass weight `2 * (2 + 2)`. -/ +lemma hyperchargeDerivSpan_le_massWeightSubmodule : + h.hyperchargeDerivSpan ≤ h.massWeightSubmodule 8 := by + rw [hyperchargeDerivSpan] + refine iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).2 ?_ + have hmem := h.derivSubmodule_le_massWeightSubmodule 2 + (h.hyperchargeField_mem_derivSubmodule ![d 0, d 1] (d 2) (d 3)) + rwa [show 2 * (2 + 2) = 8 from by norm_num] at hmem + +/-- The span the gauge classification of section G produces is a space of gauge invariants + of mass weight eight: the converse of that classification. -/ +lemma traceContractionEightSpan_sup_hyperchargeDerivSpan_le : + h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan + ≤ h.massWeightSubmodule 8 ⊓ repGauge.invariants := + sup_le (le_inf h.traceContractionEightSpan_le_massWeightSubmodule + h.traceContractionEightSpan_le_invariants) + (le_inf h.hyperchargeDerivSpan_le_massWeightSubmodule + h.hyperchargeDerivSpan_le_invariants) + +/-! + +## I.3. The Lorentz contraction span + +-/ + +/-- The twice-derived hypercharge span is the span of the components of the twice-derived + quadruple Lorentz family. -/ +lemma hyperchargeDerivSpan_eq : + h.hyperchargeDerivSpan = (h.isQuadLorentz_hyperchargeDeriv).span := rfl + +/-- The Lorentz contraction span sits inside the span the gauge classification produces: + each of its four blocks is spanned by the four contractions of a quadruple Lorentz + family whose components generate the matching block of the gauge span. -/ +lemma lorentzContractionEightSpan_le_traceContractionEightSpan_sup : + h.lorentzContractionEightSpan + ≤ h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan := by + rw [lorentzContractionEightSpan, h.traceContractionEightSpan_eq, + h.hyperchargeDerivSpan_eq] + refine sup_le ((quadContractionSpan_le_span h.isQuadLorentz_gluonTrace).trans ?_) + (sup_le ((quadContractionSpan_le_span h.isQuadLorentz_wTrace).trans ?_) + (sup_le ((quadContractionSpan_le_span h.isQuadLorentz_hyperchargeTrace).trans ?_) + ((quadContractionSpan_le_span h.isQuadLorentz_hyperchargeDeriv).trans ?_))) + · exact le_sup_of_le_left le_sup_left + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_left) + · exact le_sup_of_le_left (le_sup_of_le_right le_sup_right) + · exact le_sup_right + +/-- The Lorentz contraction span is a space of gauge invariants: it lies in the gauge + span, whose generators the gauge group fixes. -/ +lemma lorentzContractionEightSpan_le_invariants : + h.lorentzContractionEightSpan ≤ repGauge.invariants := + h.lorentzContractionEightSpan_le_traceContractionEightSpan_sup.trans + (sup_le h.traceContractionEightSpan_le_invariants + h.hyperchargeDerivSpan_le_invariants) + +/-- The Lorentz contraction span lies in the mass-weight eight submodule, for the same + reason. -/ +lemma lorentzContractionEightSpan_le_massWeightSubmodule : + h.lorentzContractionEightSpan ≤ h.massWeightSubmodule 8 := + h.lorentzContractionEightSpan_le_traceContractionEightSpan_sup.trans + (sup_le h.traceContractionEightSpan_le_massWeightSubmodule + h.hyperchargeDerivSpan_le_massWeightSubmodule) + +/-- The Lorentz contraction span is a space of Lorentz invariants: each of its four blocks + is spanned by the four contractions of a quadruple Lorentz family, and those are fixed + by the Lorentz group. -/ +lemma lorentzContractionEightSpan_le_lorentzInvariants : + h.lorentzContractionEightSpan ≤ repLorentz.invariants := by + rw [lorentzContractionEightSpan] + exact sup_le (quadContractionSpan_le_lorentzInvariants h.isQuadLorentz_gluonTrace) + (sup_le (quadContractionSpan_le_lorentzInvariants h.isQuadLorentz_wTrace) + (sup_le (quadContractionSpan_le_lorentzInvariants h.isQuadLorentz_hyperchargeTrace) + (quadContractionSpan_le_lorentzInvariants h.isQuadLorentz_hyperchargeDeriv))) + +/-! + +## J. The classifications as equivalences + +The two directions meet. Forwards, sections G and H put an invariant of mass weight eight +in the span up to a remainder in `S`; backwards, section I says the span is made of such +invariants, so the remainder plus the span element is one again. Splitting `x` as +`(x - y) + y` is all the backward direction takes. + +-/ + +/-- The gauge classification of mass weight eight as an equivalence: an element of + `massWeightSubmodule 8 ⊔ S` is gauge invariant exactly when it is a combination of the + three underived trace contractions and the twice-derived hypercharge field strengths up + to a gauge-invariant remainder in `S`. Forwards this is + `exists_mem_of_invariant_massWeightSubmodule_eight_sup`; backwards it splits `x` as + `(x - y) + y`, both summands gauge invariant and both of mass weight eight or in `S`. -/ +theorem mem_massWeightSubmodule_eight_sup_and_invariant_iff (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) (x : B) : + (x ∈ h.massWeightSubmodule 8 ⊔ S ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ x - y ∈ h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan := by + refine ⟨fun hx => + h.exists_mem_of_invariant_massWeightSubmodule_eight_sup S hS hx.1 hx.2, ?_⟩ + rintro ⟨y, hyS, hyinv, hxy⟩ + obtain ⟨hmem, hinv⟩ := Submodule.mem_inf.1 + (h.traceContractionEightSpan_sup_hyperchargeDerivSpan_le hxy) + refine ⟨?_, fun g => ?_⟩ + · have hsum : x - y + y ∈ h.massWeightSubmodule 8 ⊔ S := + Submodule.add_mem _ (Submodule.mem_sup_left hmem) (Submodule.mem_sup_right hyS) + simpa using hsum + · have hstep : repGauge g (x - y + y) = x - y + y := by + rw [map_add, (Representation.mem_invariants _ _).1 hinv g, hyinv g] + simpa using hstep + +/-- The gauge and Lorentz classification of mass weight eight as an equivalence: an + element of `massWeightSubmodule 8 ⊔ S` is fixed by both groups exactly when it is a + combination of the four Lorentz contractions of the four families of section H up to a + remainder in `S` fixed by both groups. Forwards this is + `exists_mem_of_gauge_and_lorentz_invariant`; backwards it splits `x` as `(x - y) + y`, + the first summand invariant and of mass weight eight by section I. -/ +theorem mem_massWeightSubmodule_eight_sup_and_gauge_lorentz_invariant_iff + (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (x : B) : + (x ∈ h.massWeightSubmodule 8 ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) + ∧ x - y ∈ h.lorentzContractionEightSpan := by + refine ⟨fun hx => + h.exists_mem_of_gauge_and_lorentz_invariant S hS hSL hx.1 hx.2.1 hx.2.2, ?_⟩ + rintro ⟨y, hyS, hyG, hyL, hxy⟩ + have hmem := h.lorentzContractionEightSpan_le_massWeightSubmodule hxy + have hG := (Representation.mem_invariants _ _).1 + (h.lorentzContractionEightSpan_le_invariants hxy) + have hL := (Representation.mem_invariants _ _).1 + (h.lorentzContractionEightSpan_le_lorentzInvariants hxy) + refine ⟨?_, fun g => ?_, fun g => ?_⟩ + · have hsum : x - y + y ∈ h.massWeightSubmodule 8 ⊔ S := + Submodule.add_mem _ (Submodule.mem_sup_left hmem) (Submodule.mem_sup_right hyS) + simpa using hsum + · have hstep : repGauge g (x - y + y) = x - y + y := by rw [map_add, hG g, hyG g] + simpa using hstep + · have hstep : repLorentz g (x - y + y) = x - y + y := by rw [map_add, hL g, hyL g] + simpa using hstep + end IsGaugeSector end StandardModel diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index bdc016cd8..2934c54ea 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -34,7 +34,14 @@ as a tensor `T^{μ₁ μ₂ μ₃ μ₄}`. The main theorem `exists_smul_contraction_of_invariant` classifies the Lorentz invariants in the span of the components: every invariant element is a linear combination of the outer, inner and split metric contractions and the Levi-Civita -contraction. +contraction. The four contractions are themselves Lorentz invariant +(`repLorentz_outerContraction` and its three companions): the metric ones because +`Λ η Λᵀ = η` is what defines the Lorentz group, the Levi-Civita one because the +transformations coming from `SL(2,ℂ)` are proper. That is what makes the error term of +the classification modulo a Lorentz-stable submodule invariant as well +(`exists_smul_contraction_of_invariant_subset`), the error being the difference of two +invariants, and it is what turns both classifications into the equivalences +`mem_span_and_invariant_iff` and `mem_span_sup_invariant_iff`. The section headings tell the story: the light-cone bases (B) grade the span by boost weight, the weight-zero projection of a generator gives the recursion rounds (C), a @@ -42,6 +49,8 @@ sieve along the three axes (D) cuts an invariant down to the tied pieces support paired-or-distinct indices (E), rotation averaging reduces to `22` orbit sums (F) on which the boost average is an explicit integer matrix (G), and a polynomial certificate collapses the iterated rounds to the projector onto the four contractions (H, I, J). +The two symbols the contractions are built from are shown invariant in I.5 and the +contractions themselves in I.6. -/ @[expose] public section @@ -2525,6 +2534,30 @@ noncomputable def splitContraction : B := noncomputable def epsilonContraction : B := ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : ℂ) • T d +include hT in +/-- The outer contraction lies in the span of the components. -/ +lemma outerContraction_mem_span : outerContraction (T := T) ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +include hT in +/-- The inner contraction lies in the span of the components. -/ +lemma innerContraction_mem_span : innerContraction (T := T) ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +include hT in +/-- The split contraction lies in the span of the components. -/ +lemma splitContraction_mem_span : splitContraction (T := T) ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +include hT in +/-- The Levi-Civita contraction lies in the span of the components. -/ +lemma epsilonContraction_mem_span : epsilonContraction (T := T) ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + /-! ## I.2. Orbit coordinates and the projector factorisation @@ -2738,6 +2771,377 @@ theorem exists_smul_contraction_of_eq_sum_orbitRep {x : B} (c : Fin 22 → ℂ) · rfl /-! +## I.5. The metric and the Levi-Civita sign under a Lorentz transformation + +The four contractions are built from two integer symbols, the metric `etaZ` and the +Levi-Civita sign `epsilonSignZ`, and the invariance of the contractions is the +invariance of those symbols. For the metric that is the defining property +`Λ η Λᵀ = η` of the Lorentz group, read entrywise. For the Levi-Civita sign it is the +transformation law of a determinant, `∑_d ε d ∏ᵢ Λ (a i) (d i) = det Λ * ε a`, which +holds because `ε` is the determinant of the Kronecker matrix of a multi-index against +the standard listing of the four directions; the sign is then invariant for the proper +transformations, and those coming from `SL(2,ℂ)` are proper. + +-/ + +/-- A sum over families of four four-vector indices is a fourfold sum. -/ +lemma sum_pi_four {M : Type*} [AddCommMonoid M] (F : (Fin 4 → Fin 1 ⊕ Fin 3) → M) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, F d + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, + ∑ w : Fin 1 ⊕ Fin 3, F ![x, y, z, w] := by + rw [show (∑ d : Fin 4 → Fin 1 ⊕ Fin 3, F d) + = ∑ p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + F ![p.1, p.2.1, p.2.2.1, p.2.2.2] from + Fintype.sum_equiv + { toFun := fun d => (d 0, d 1, d 2, d 3) + invFun := fun p => ![p.1, p.2.1, p.2.2.1, p.2.2.2] + left_inv := fun d => by funext i; fin_cases i <;> simp + right_inv := fun p => by simp } _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp] + simp only [Fintype.sum_prod_type] + +/-- The integer metric is the Minkowski matrix. -/ +lemma etaZ_cast (μ ν : Fin 1 ⊕ Fin 3) : ((etaZ μ ν : ℤ) : ℝ) = minkowskiMatrix μ ν := by + rcases eq_or_ne μ ν with rfl | h + · match μ with + | Sum.inl i => fin_cases i; simp [etaZ, minkowskiSignZ] + | Sum.inr i => simp [etaZ, minkowskiSignZ] + · simp [etaZ, h] + +/-- The metric is carried to itself by a Lorentz matrix: this is `Λ η Λᵀ = η`, the + defining property of the Lorentz group, read on the entry `(a, b)`. -/ +lemma sum_etaZ_mul (Λ : LorentzGroup 3) (a b : Fin 1 ⊕ Fin 3) : + ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ((etaZ x y : ℤ) : ℂ) + * (((Λ.1 a x : ℝ) : ℂ) * ((Λ.1 b y : ℝ) : ℂ)) + = ((etaZ a b : ℤ) : ℂ) := by + have hR : ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, + ((etaZ x y : ℤ) : ℝ) * (Λ.1 a x * Λ.1 b y) = ((etaZ a b : ℤ) : ℝ) := by + have h := congrFun (congrFun + (LorentzGroup.mul_minkowskiMatrix_mul_transpose (Λ := Λ)) a) b + simp only [Matrix.mul_apply, Matrix.transpose_apply] at h + rw [etaZ_cast, ← h, Finset.sum_comm] + refine Finset.sum_congr rfl fun y _ => ?_ + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun x _ => by rw [etaZ_cast]; ring + have hC := congrArg (fun r : ℝ => (r : ℂ)) hR + push_cast at hC ⊢ + exact hC + +/-- The outer pairing of two metrics is carried to itself by a Lorentz matrix: the + fourfold sum factors into two copies of `sum_etaZ_mul`. -/ +lemma sum_outerPair_mul (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (d i) : ℝ) : ℂ) + = ((etaZ (a 0) (a 1) * etaZ (a 2) (a 3) : ℤ) : ℂ) := by + have key : ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (d i) : ℝ) : ℂ) + = (∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ((etaZ x y : ℤ) : ℂ) + * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 1) y : ℝ) : ℂ))) + * (∑ z : Fin 1 ⊕ Fin 3, ∑ w : Fin 1 ⊕ Fin 3, ((etaZ z w : ℤ) : ℂ) + * (((Λ.1 (a 2) z : ℝ) : ℂ) * ((Λ.1 (a 3) w : ℝ) : ℂ))) := by + rw [sum_pi_four] + have hterm : ∀ x y z w : Fin 1 ⊕ Fin 3, + ((etaZ (![x, y, z, w] 0) (![x, y, z, w] 1) + * etaZ (![x, y, z, w] 2) (![x, y, z, w] 3) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (![x, y, z, w] i) : ℝ) : ℂ) + = (((etaZ x y : ℤ) : ℂ) * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 1) y : ℝ) : ℂ))) + * (((etaZ z w : ℤ) : ℂ) + * (((Λ.1 (a 2) z : ℝ) : ℂ) * ((Λ.1 (a 3) w : ℝ) : ℂ))) := by + intro x y z w + simp only [Fin.prod_univ_four, Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] + push_cast + ring + simp only [hterm, ← Finset.mul_sum, ← Finset.sum_mul] + rw [key, sum_etaZ_mul, sum_etaZ_mul] + push_cast + ring + +/-- The inner pairing of two metrics is carried to itself by a Lorentz matrix, by the + same factorisation with the indices interleaved. -/ +lemma sum_innerPair_mul (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 2) * etaZ (d 1) (d 3) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (d i) : ℝ) : ℂ) + = ((etaZ (a 0) (a 2) * etaZ (a 1) (a 3) : ℤ) : ℂ) := by + have key : ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 2) * etaZ (d 1) (d 3) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (d i) : ℝ) : ℂ) + = (∑ x : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, ((etaZ x z : ℤ) : ℂ) + * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 2) z : ℝ) : ℂ))) + * (∑ y : Fin 1 ⊕ Fin 3, ∑ w : Fin 1 ⊕ Fin 3, ((etaZ y w : ℤ) : ℂ) + * (((Λ.1 (a 1) y : ℝ) : ℂ) * ((Λ.1 (a 3) w : ℝ) : ℂ))) := by + rw [sum_pi_four] + have hterm : ∀ x y z w : Fin 1 ⊕ Fin 3, + ((etaZ (![x, y, z, w] 0) (![x, y, z, w] 2) + * etaZ (![x, y, z, w] 1) (![x, y, z, w] 3) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (![x, y, z, w] i) : ℝ) : ℂ) + = (((etaZ x z : ℤ) : ℂ) * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 2) z : ℝ) : ℂ))) + * (((etaZ y w : ℤ) : ℂ) + * (((Λ.1 (a 1) y : ℝ) : ℂ) * ((Λ.1 (a 3) w : ℝ) : ℂ))) := by + intro x y z w + simp only [Fin.prod_univ_four, Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] + push_cast + ring + simp only [hterm, ← Finset.mul_sum, ← Finset.sum_mul] + rw [key, sum_etaZ_mul, sum_etaZ_mul] + push_cast + ring + +/-- The split pairing of two metrics is carried to itself by a Lorentz matrix. -/ +lemma sum_splitPair_mul (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 3) * etaZ (d 1) (d 2) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (d i) : ℝ) : ℂ) + = ((etaZ (a 0) (a 3) * etaZ (a 1) (a 2) : ℤ) : ℂ) := by + have key : ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 3) * etaZ (d 1) (d 2) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (d i) : ℝ) : ℂ) + = (∑ x : Fin 1 ⊕ Fin 3, ∑ w : Fin 1 ⊕ Fin 3, ((etaZ x w : ℤ) : ℂ) + * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 3) w : ℝ) : ℂ))) + * (∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, ((etaZ y z : ℤ) : ℂ) + * (((Λ.1 (a 1) y : ℝ) : ℂ) * ((Λ.1 (a 2) z : ℝ) : ℂ))) := by + rw [sum_pi_four] + have hterm : ∀ x y z w : Fin 1 ⊕ Fin 3, + ((etaZ (![x, y, z, w] 0) (![x, y, z, w] 3) + * etaZ (![x, y, z, w] 1) (![x, y, z, w] 2) : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (![x, y, z, w] i) : ℝ) : ℂ) + = (((etaZ x w : ℤ) : ℂ) * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 3) w : ℝ) : ℂ))) + * (((etaZ y z : ℤ) : ℂ) + * (((Λ.1 (a 1) y : ℝ) : ℂ) * ((Λ.1 (a 2) z : ℝ) : ℂ))) := by + intro x y z w + simp only [Fin.prod_univ_four, Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.cons_val_two, Matrix.cons_val_three, Matrix.tail_cons] + push_cast + ring + simp only [hterm, ← Finset.mul_sum, ← Finset.sum_mul] + rw [key, sum_etaZ_mul, sum_etaZ_mul] + push_cast + ring + +set_option maxRecDepth 100000 in +/-- The Levi-Civita sign is a determinant: it is the determinant of the Kronecker + matrix of the multi-index against the standard listing of the four directions. A + finite check over the `256` multi-indices. -/ +lemma det_delta_eq_epsilonSignZ_int (b : Fin 4 → Fin 1 ⊕ Fin 3) : + (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => + if b (finSumFinEquiv μ) = ν then (1 : ℤ) else 0).det = epsilonSignZ b := by + revert b + decide + +/-- The determinant form of the Levi-Civita sign over any commutative ring, the integer + identity carried along the ring map from `ℤ`. -/ +lemma det_delta_eq_epsilonSignZ {R : Type*} [CommRing R] (b : Fin 4 → Fin 1 ⊕ Fin 3) : + (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => + if b (finSumFinEquiv μ) = ν then (1 : R) else 0).det = ((epsilonSignZ b : ℤ) : R) := by + have h := RingHom.map_det (Int.castRingHom R) + (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => if b (finSumFinEquiv μ) = ν then (1 : ℤ) else 0) + simp only [Int.coe_castRingHom, RingHom.mapMatrix_apply] at h + rw [← det_delta_eq_epsilonSignZ_int b, h] + congr 1 + ext μ ν + by_cases hbν : b (finSumFinEquiv μ) = ν <;> simp [Matrix.map_apply, hbν] + +/-- The Leibniz formula with the permutation moving the column index. -/ +lemma det_eq_sum_perm_prod {R : Type*} [CommRing R] + (X : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) R) : + X.det = ∑ σ : Equiv.Perm (Fin 1 ⊕ Fin 3), + ((Equiv.Perm.sign σ : ℤ) : R) * ∏ μ, X μ (σ μ) := by + rw [← Matrix.det_transpose X, Matrix.det_apply'] + rfl + +/-- The Levi-Civita sign transforms by the determinant: contracting it against four rows + of a matrix returns the determinant times the sign of the rows. Both sides are the + determinant of the matrix whose rows are those of `M` selected by `a`, the left one + after expanding each row in the standard directions and the right one after the + product rule for determinants. -/ +lemma sum_epsilonSignZ_mul_prod {R : Type*} [CommRing R] + (M : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) R) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : R) * ∏ i, M (a i) (d i) + = M.det * ((epsilonSignZ a : ℤ) : R) := by + classical + have hre : ∀ (σ : Equiv.Perm (Fin 1 ⊕ Fin 3)) (d : Fin 4 → Fin 1 ⊕ Fin 3), + (∏ μ, (if d (finSumFinEquiv μ) = σ μ then (1 : R) else 0)) + = ∏ i, (if d i = σ (finSumFinEquiv.symm i) then (1 : R) else 0) := by + intro σ d + rw [← Equiv.prod_comp finSumFinEquiv + (fun i => if d i = σ (finSumFinEquiv.symm i) then (1 : R) else 0)] + exact Finset.prod_congr rfl fun μ _ => by rw [Equiv.symm_apply_apply] + have hprod : ∀ (σ : Equiv.Perm (Fin 1 ⊕ Fin 3)) (d : Fin 4 → Fin 1 ⊕ Fin 3), + (∏ μ, (if d (finSumFinEquiv μ) = σ μ then (1 : R) else 0)) * ∏ i, M (a i) (d i) + = ∏ i, ((if d i = σ (finSumFinEquiv.symm i) then (1 : R) else 0) + * M (a i) (d i)) := by + intro σ d + rw [hre σ d, ← Finset.prod_mul_distrib] + calc ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : R) * ∏ i, M (a i) (d i) + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ∑ σ : Equiv.Perm (Fin 1 ⊕ Fin 3), + ((Equiv.Perm.sign σ : ℤ) : R) + * ∏ i, ((if d i = σ (finSumFinEquiv.symm i) then (1 : R) else 0) + * M (a i) (d i)) := by + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← det_delta_eq_epsilonSignZ (R := R) d, det_eq_sum_perm_prod, Finset.sum_mul] + refine Finset.sum_congr rfl fun σ _ => ?_ + simp only [Matrix.of_apply] + rw [mul_assoc, hprod σ d] + _ = ∑ σ : Equiv.Perm (Fin 1 ⊕ Fin 3), ((Equiv.Perm.sign σ : ℤ) : R) + * ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ∏ i, ((if d i = σ (finSumFinEquiv.symm i) then (1 : R) else 0) + * M (a i) (d i)) := by + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun σ _ => by rw [Finset.mul_sum] + _ = ∑ σ : Equiv.Perm (Fin 1 ⊕ Fin 3), ((Equiv.Perm.sign σ : ℤ) : R) + * ∏ i, M (a i) (σ (finSumFinEquiv.symm i)) := by + refine Finset.sum_congr rfl fun σ _ => ?_ + congr 1 + have hpi := Finset.sum_prod_piFinset (ι := Fin 4) (κ := Fin 1 ⊕ Fin 3) Finset.univ + (fun i ν => (if ν = σ (finSumFinEquiv.symm i) then (1 : R) else 0) * M (a i) ν) + rw [Fintype.piFinset_univ] at hpi + rw [hpi] + exact Finset.prod_congr rfl fun i _ => by simp + _ = M.det * ((epsilonSignZ a : ℤ) : R) := by + rw [mul_comm, ← det_delta_eq_epsilonSignZ (R := R) a, ← Matrix.det_mul, + det_eq_sum_perm_prod] + refine Finset.sum_congr rfl fun σ _ => ?_ + congr 1 + rw [← Equiv.prod_comp finSumFinEquiv + (fun i => M (a i) (σ (finSumFinEquiv.symm i)))] + refine Finset.prod_congr rfl fun μ _ => ?_ + rw [Equiv.symm_apply_apply, Matrix.mul_apply] + simp + +/-- The Levi-Civita sign is carried to itself by a proper Lorentz matrix: the + determinant factor of `sum_epsilonSignZ_mul_prod` is one. -/ +lemma sum_epsilonSignZ_mul (Λ : LorentzGroup 3) (hΛ : Λ.1.det = 1) + (a : Fin 4 → Fin 1 ⊕ Fin 3) : + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : ℂ) + * ∏ i, ((Λ.1 (a i) (d i) : ℝ) : ℂ) + = ((epsilonSignZ a : ℤ) : ℂ) := by + have hdet : (Complex.ofRealHom.mapMatrix Λ.1).det = 1 := by + rw [← RingHom.map_det, hΛ] + simp + have h := sum_epsilonSignZ_mul_prod (Complex.ofRealHom.mapMatrix Λ.1) a + rw [hdet, one_mul] at h + rw [← h] + rfl + +/-! + +## I.6. The four contractions are Lorentz invariant + +A linear map moving the components by a Lorentz matrix fixes any combination of the +components whose coefficient family that matrix fixes, and I.5 says the four coefficient +families are fixed. The statements are made for an arbitrary such map, so that they can +be read in the quotient of J.3 as well as for `repLorentz`; the Levi-Civita one asks in +addition that the matrix be proper, which the matrices coming from `SL(2,ℂ)` are. + +-/ + +/-- A linear map moving the components by a Lorentz matrix fixes every combination of + the components whose coefficient family that matrix fixes. -/ +lemma map_sum_smul_eq_self {f : B →ₗ[ℂ] B} {Λ : LorentzGroup 3} + (hf : ∀ l : Fin 4 → Fin 1 ⊕ Fin 3, f (T l) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (∏ i, ((Λ.1 (a i) (l i) : ℝ) : ℂ)) • T a) + (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) + (hc : ∀ a : Fin 4 → Fin 1 ⊕ Fin 3, + ∑ l : Fin 4 → Fin 1 ⊕ Fin 3, c l * ∏ i, ((Λ.1 (a i) (l i) : ℝ) : ℂ) = c a) : + f (∑ l : Fin 4 → Fin 1 ⊕ Fin 3, c l • T l) + = ∑ l : Fin 4 → Fin 1 ⊕ Fin 3, c l • T l := by + rw [map_sum] + have h1 : ∀ l : Fin 4 → Fin 1 ⊕ Fin 3, f (c l • T l) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (c l * ∏ i, ((Λ.1 (a i) (l i) : ℝ) : ℂ)) • T a := by + intro l + rw [map_smul, hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + simp only [h1] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul, hc a] + +/-- The outer contraction is fixed by any linear map moving the components by a Lorentz + matrix. -/ +lemma map_outerContraction {f : B →ₗ[ℂ] B} {Λ : LorentzGroup 3} + (hf : ∀ l : Fin 4 → Fin 1 ⊕ Fin 3, f (T l) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (∏ i, ((Λ.1 (a i) (l i) : ℝ) : ℂ)) • T a) : + f (outerContraction (T := T)) = outerContraction (T := T) := by + rw [outerContraction] + exact map_sum_smul_eq_self hf _ (sum_outerPair_mul Λ) + +/-- The inner contraction is fixed by any linear map moving the components by a Lorentz + matrix. -/ +lemma map_innerContraction {f : B →ₗ[ℂ] B} {Λ : LorentzGroup 3} + (hf : ∀ l : Fin 4 → Fin 1 ⊕ Fin 3, f (T l) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (∏ i, ((Λ.1 (a i) (l i) : ℝ) : ℂ)) • T a) : + f (innerContraction (T := T)) = innerContraction (T := T) := by + rw [innerContraction] + exact map_sum_smul_eq_self hf _ (sum_innerPair_mul Λ) + +/-- The split contraction is fixed by any linear map moving the components by a Lorentz + matrix. -/ +lemma map_splitContraction {f : B →ₗ[ℂ] B} {Λ : LorentzGroup 3} + (hf : ∀ l : Fin 4 → Fin 1 ⊕ Fin 3, f (T l) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (∏ i, ((Λ.1 (a i) (l i) : ℝ) : ℂ)) • T a) : + f (splitContraction (T := T)) = splitContraction (T := T) := by + rw [splitContraction] + exact map_sum_smul_eq_self hf _ (sum_splitPair_mul Λ) + +/-- The Levi-Civita contraction is fixed by any linear map moving the components by a + proper Lorentz matrix. Properness cannot be dropped: an improper matrix negates the + Levi-Civita sign, and with it the contraction. -/ +lemma map_epsilonContraction {f : B →ₗ[ℂ] B} {Λ : LorentzGroup 3} (hΛ : Λ.1.det = 1) + (hf : ∀ l : Fin 4 → Fin 1 ⊕ Fin 3, f (T l) + = ∑ a : Fin 4 → Fin 1 ⊕ Fin 3, (∏ i, ((Λ.1 (a i) (l i) : ℝ) : ℂ)) • T a) : + f (epsilonContraction (T := T)) = epsilonContraction (T := T) := by + rw [epsilonContraction] + exact map_sum_smul_eq_self hf _ (sum_epsilonSignZ_mul Λ hΛ) + +include hT in +/-- The outer contraction is Lorentz invariant. -/ +lemma repLorentz_outerContraction (g : SL(2,ℂ)) : + repLorentz g (outerContraction (T := T)) = outerContraction (T := T) := + map_outerContraction (Λ := SL2C.toLorentzGroup g) (hT.repLorentz_T g) + +include hT in +/-- The inner contraction is Lorentz invariant. -/ +lemma repLorentz_innerContraction (g : SL(2,ℂ)) : + repLorentz g (innerContraction (T := T)) = innerContraction (T := T) := + map_innerContraction (Λ := SL2C.toLorentzGroup g) (hT.repLorentz_T g) + +include hT in +/-- The split contraction is Lorentz invariant. -/ +lemma repLorentz_splitContraction (g : SL(2,ℂ)) : + repLorentz g (splitContraction (T := T)) = splitContraction (T := T) := + map_splitContraction (Λ := SL2C.toLorentzGroup g) (hT.repLorentz_T g) + +include hT in +/-- The Levi-Civita contraction is Lorentz invariant, the Lorentz matrix of an element + of `SL(2,ℂ)` being proper. -/ +lemma repLorentz_epsilonContraction (g : SL(2,ℂ)) : + repLorentz g (epsilonContraction (T := T)) = epsilonContraction (T := T) := + map_epsilonContraction (Λ := SL2C.toLorentzGroup g) (SL2C.toLorentzGroup_det_one g) + (hT.repLorentz_T g) + +include hT in +/-- A linear combination of the four contractions is Lorentz invariant. -/ +lemma repLorentz_smul_contraction (a₁ a₂ a₃ a₄ : ℂ) (g : SL(2,ℂ)) : + repLorentz g (a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T)) + = a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) := by + simp only [map_add, map_smul, hT.repLorentz_outerContraction, + hT.repLorentz_innerContraction, hT.repLorentz_splitContraction, + hT.repLorentz_epsilonContraction] + +include hT in +/-- A linear combination of the four contractions lies in the span of the components. -/ +lemma smul_contraction_mem_span (a₁ a₂ a₃ a₄ : ℂ) : + a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) ∈ hT.span := + add_mem (add_mem (add_mem (Submodule.smul_mem _ _ hT.outerContraction_mem_span) + (Submodule.smul_mem _ _ hT.innerContraction_mem_span)) + (Submodule.smul_mem _ _ hT.splitContraction_mem_span)) + (Submodule.smul_mem _ _ hT.epsilonContraction_mem_span) + +/-! + ## J. The classification of the Lorentz invariants ## J.1. Graded extraction along the sieve @@ -2825,6 +3229,21 @@ theorem exists_smul_contraction_of_invariant {x : B} (hx : x ∈ hT.span) exact hT.exists_smul_contraction_of_eq_sum_orbitRep c hc (mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv) +include hT in +/-- The classification read as an equivalence: an element of the span of the components + is fixed by the Lorentz group exactly when it is a linear combination of the four + contractions. The forward direction is the classification, the backward one the + invariance of the four contractions of I.6. -/ +theorem mem_span_and_invariant_iff (x : B) : + (x ∈ hT.span ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ ∃ a₁ a₂ a₃ a₄ : ℂ, + x = a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) := by + refine ⟨fun h => hT.exists_smul_contraction_of_invariant h.1 h.2, ?_⟩ + rintro ⟨a₁, a₂, a₃, a₄, rfl⟩ + exact ⟨hT.smul_contraction_mem_span a₁ a₂ a₃ a₄, + hT.repLorentz_smul_contraction a₁ a₂ a₃ a₄⟩ + /-! @@ -2833,6 +3252,11 @@ theorem exists_smul_contraction_of_invariant {x : B} (hx : x ∈ hT.span) A Lorentz-stable submodule can be divided out: the quotient representation carries the images of the components as a quadruple Lorentz tensor again, so the classification applies verbatim in the quotient and lifts to a classification modulo the submodule. +Stability of the submodule is what makes the quotient representation exist, and it +cannot be dropped: for an unstable line the only invariant of the line is `0`, while an +invariant of the sum may well lie outside the span. The error term is invariant for +free, being the difference of two invariants, the element and the combination of the +four contractions, which I.6 shows to be invariant. -/ @@ -2898,14 +3322,16 @@ include hT in /-- The classification of the Lorentz invariants modulo a stable submodule: an element of the span of the components together with a Lorentz-stable submodule `S`, fixed by the Lorentz group, is a linear combination of the four contractions up to an - error in `S`. The classification is applied in the quotient by `S`, where the images + error in `S`, and the error is Lorentz invariant as well, being the difference of two + invariants. The classification is applied in the quotient by `S`, where the images of the components form a quadruple Lorentz tensor again. -/ lemma exists_smul_contraction_of_invariant_subset {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a₁ a₂ a₃ a₄ : ℂ, ∃ y ∈ S, x = a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) - + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) + y := by + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) + y + ∧ ∀ g : SL(2,ℂ), repLorentz g y = y := by have hT' := hT.isQuadLorentz_quotRep S hS -- the class of `x` lies in the span of the images of the components have hmk : S.mkQ x ∈ hT'.span := by @@ -2924,14 +3350,35 @@ lemma exists_smul_contraction_of_invariant_subset {x : B} (S : Submodule ℂ B) rw [← mkQ_outerContraction, ← mkQ_innerContraction, ← mkQ_splitContraction, ← mkQ_epsilonContraction] at hcomb refine ⟨a₁, a₂, a₃, a₄, x - (a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) - + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T)), ?_, by abel⟩ - have hker : x - (a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) - + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T)) - ∈ LinearMap.ker S.mkQ := by - rw [LinearMap.mem_ker, map_sub, hcomb] - simp only [map_add, map_smul] - abel - rwa [Submodule.ker_mkQ] at hker + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T)), ?_, by abel, + fun g => ?_⟩ + · have hker : x - (a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T)) + ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, hcomb] + simp only [map_add, map_smul] + abel + rwa [Submodule.ker_mkQ] at hker + · rw [map_sub, hinv g, hT.repLorentz_smul_contraction a₁ a₂ a₃ a₄ g] + +include hT in +/-- The classification modulo a stable submodule read as an equivalence: a vector of the + span joined with a Lorentz-stable submodule `S` is fixed by the Lorentz group exactly + when it is a linear combination of the four contractions up to an invariant error in + `S`. The forward direction is `exists_smul_contraction_of_invariant_subset`, the + backward one the invariance of the four contractions of I.6. -/ +theorem mem_span_sup_invariant_iff (x : B) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + (x ∈ hT.span ⊔ S ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ ∃ a₁ a₂ a₃ a₄ : ℂ, ∃ y ∈ S, + x = a₁ • outerContraction (T := T) + a₂ • innerContraction (T := T) + + a₃ • splitContraction (T := T) + a₄ • epsilonContraction (T := T) + y + ∧ ∀ g : SL(2,ℂ), repLorentz g y = y := by + refine ⟨fun h => hT.exists_smul_contraction_of_invariant_subset S hS h.1 h.2, ?_⟩ + rintro ⟨a₁, a₂, a₃, a₄, y, hyS, rfl, hyinv⟩ + refine ⟨add_mem (Submodule.mem_sup_left (hT.smul_contraction_mem_span a₁ a₂ a₃ a₄)) + (Submodule.mem_sup_right hyS), fun g => ?_⟩ + rw [map_add, hT.repLorentz_smul_contraction a₁ a₂ a₃ a₄ g, hyinv g] end IsQuadLorentz From 8e5a2b21d42734c06b0af708672d2e5e5ee3cbd9 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:58:17 +0100 Subject: [PATCH 254/254] feat: Mass Dim LT 8 for IsGaugeSector --- Physlib.lean | 4 +- .../GaugeTheory/GaugeField/FieldStrength.lean | 55 ++ .../StandardModel/IsGaugeSector/Basic.lean | 4 + .../{BiAdjoint.lean => MassDimEight.lean} | 0 .../MassWeight/MassDimLTEight.lean | 525 ++++++++++++++++++ .../StandardModel/IsStandardModel/Basic.lean | 84 +++ .../IsStandardModel/CovStandardModel.lean | 11 +- .../LorentzGroup/Invariants/IsTriLorentz.lean | 471 ++++++++++++++++ 8 files changed, 1152 insertions(+), 2 deletions(-) rename Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/{BiAdjoint.lean => MassDimEight.lean} (100%) create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean diff --git a/Physlib.lean b/Physlib.lean index ca53b9d01..9785c54d3 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -290,8 +290,9 @@ public import Physlib.Particles.StandardModel.IsGaugeSector.Basic public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic -public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.BiAdjoint public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.MassDimEight +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.SU2PermDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition @@ -495,6 +496,7 @@ public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz public import Physlib.Relativity.LorentzGroup.Invariants.IsLeftRightWeyl public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz public import Physlib.Relativity.LorentzGroup.Invariants.IsSingleLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.IsTriLorentz public import Physlib.Relativity.LorentzGroup.Orthochronous.Basic public import Physlib.Relativity.LorentzGroup.Proper public import Physlib.Relativity.LorentzGroup.Restricted.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean index 03588a674..050751e41 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean @@ -84,6 +84,61 @@ lemma pair_eq_fieldStrength_sub_commutatorFam A (ν ::ₘ s) μ - A (μ ::ₘ s) ν = fieldStrength A ν μ s - commutatorFam A ν μ s := by rw [fieldStrength, add_sub_cancel_right] +/-! + +## The antisymmetry of the field strength + +The field strength is antisymmetric in its two covector indices as soon as the +symbols of the gauge field commute with one another in `B`: the two derivative terms +swap outright, and the commutator term swaps by the antisymmetry of the gauge-algebra +bracket, once the two factors of each product may be exchanged. + +-/ + +/-- The bracket of two component families with commuting values is antisymmetric: in + the basis expansion the structure constants are antisymmetric in the two gauge + indices, and the two field factors of each term may be exchanged. -/ +lemma bracketFam_swap_of_commute {f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (hfg : ∀ φ ψ, Commute (f φ) (g ψ)) : + bracketFam g f = - bracketFam f g := by + refine LinearMap.ext fun φ => ?_ + rw [LinearMap.neg_apply, bracketFam_apply_eq_sum, bracketFam_apply_eq_sum] + set bv := Module.Free.chooseBasis ℝ 𝔤 with hbv + have hstep : ∀ j k, φ ⁅bv j, bv k⁆ • (g (bv.coord j) * f (bv.coord k)) = + -(φ ⁅bv k, bv j⁆ • (f (bv.coord k) * g (bv.coord j))) := by + intro j k + rw [(hfg (bv.coord k) (bv.coord j)).eq, ← lie_skew (bv k) (bv j), map_neg, + neg_smul, neg_neg] + rw [Finset.sum_congr rfl fun j _ => Finset.sum_congr rfl fun k _ => hstep j k] + simp only [Finset.sum_neg_distrib] + exact congrArg Neg.neg Finset.sum_comm + +/-- The derived commutator term is antisymmetric in its two directions when the symbols + of the gauge field commute: swapping the two parts of the antidiagonal matches the + Leibniz convolution with the swapped one termwise. -/ +lemma commutatorFam_swap + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (hA : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ 𝔤), Commute (A s μ ψ) (A s' μ' ψ')) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + commutatorFam A ν μ s = - commutatorFam A μ ν s := by + rw [commutatorFam, commutatorFam, + Multiset.sum_antidiagonal_swap s (fun a b => bracketFam (A a ν) (A b μ)), + ← Multiset.sum_map_neg''] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => + bracketFam_swap_of_commute fun φ ψ => hA _ _ _ _ _ _) + +/-- The field strength is antisymmetric in its two covector indices when the symbols of + the gauge field commute: the two derivative terms swap outright, the commutator term + by `commutatorFam_swap`. -/ +lemma fieldStrength_swap + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (hA : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ 𝔤), Commute (A s μ ψ) (A s' μ' ψ')) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + fieldStrength A ν μ s = - fieldStrength A μ ν s := by + rw [fieldStrength, fieldStrength, commutatorFam_swap A hA μ ν s] + abel /-- **The field strength transforms in the adjoint, at every derivative order**: under a gauge jet `U` every derivative symbol of `F_μν` transforms by the pure Leibniz diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean index 028464a8d..2ef7f02d7 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/Basic.lean @@ -57,6 +57,10 @@ structure IsGaugeSector (B : Type) [Ring B] [Algebra ℂ B] (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin m → Fin 1 ⊕ Fin 3) (μ' ν' : Fin 1 ⊕ Fin 3) (ψ' : Module.Dual ℝ GaugeAlgebra), Commute (F l μ ν ψ) (F l' μ' ν' ψ') + -- The field strength is antisymmetric in its two covector indices. + F_antisymm : ∀ {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), + F l ν μ φ = - F l μ ν φ namespace IsGaugeSector diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean similarity index 100% rename from Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/BiAdjoint.lean rename to Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean new file mode 100644 index 000000000..9fb04e6eb --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean @@ -0,0 +1,525 @@ +/- +Copyright (c) 2026 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.Particles.StandardModel.IsGaugeSector.MassWeight.Basic +public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.IsTriLorentz +/-! +# The invariants below mass weight eight + +Mass weight eight is the first weight of the gauge sector carrying a gauge and Lorentz +invariant. Below it there is nothing: the odd weights and weight two are trivial +submodules, weight four is a single underived field strength and weight six a single +once-derived one, and neither of those two carries an invariant. + +Weight four fails on parity of a different kind. An underived field strength carries two +covector indices and one adjoint index, so at a fixed gauge direction it is a bi-Lorentz +tensor, whose only invariant contraction is the metric trace. That trace vanishes, the +metric being symmetric in the pair of indices in which `IsGaugeSector.F_antisymm` says +the field strength is antisymmetric. Weight six fails on counting: a once-derived field +strength carries three covector indices, and three indices admit no invariant contraction +at all, the metric tying two and the Levi-Civita symbol four. + +Neither argument needs the gauge group. The vanishing at weight four holds at every gauge +direction separately, the colour and isospin ones included, so no appeal to +`IsSU3Adjoint` or `IsSU2Adjoint` is required and Lorentz invariance alone does the work. +What the gauge algebra does contribute is finiteness: a field-strength symbol is +evaluated on a covector of the gauge algebra, and expanding that covector in the dual of +the standard basis writes each derivative submodule inside a finite join of Lorentz +spans, one for each of the twelve basis directions, which is what the peeling arguments +consume. + +- A. The symbols on the standard basis of the gauge algebra +- B. Sums over tuples of covector indices +- C. The field-strength symbols as Lorentz families +- D. The vanishing of the metric trace of an antisymmetric family +- E. Peeling Lorentz spans off a stable submodule +- F. Mass weight four +- G. Mass weight six +- H. The classification below mass weight eight + +The final statement `mem_massWeightSubmodule_lt_eight_sup_and_gauge_lorentz_invariant_iff` +needs `0 < w` as well as `w < 8`: at `w = 0` the mass-weight submodule contains the +scalars, so `1` is an invariant of weight zero lying in no `S`. + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups Lorentz + +namespace IsGaugeSector + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {hrepGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul + F massWeightPoly) + +/-! + +## A. The symbols on the standard basis of the gauge algebra + +The gauge algebra is finite dimensional, so a covector on it is the combination of the +coordinates of the standard basis with its own values on that basis. A field-strength +symbol evaluated on an arbitrary covector is therefore a combination of the twelve +symbols evaluated on those coordinates. + +-/ + +/-- A field-strength symbol lies in the span of the twelve symbols evaluated on the + coordinates of the standard basis of the gauge algebra. -/ +lemma F_mem_iSup_span_coord {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + F l μ ν φ ∈ ⨆ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + ℂ ∙ F l μ ν (GaugeAlgebra.stdBasis.coord c) := by + have hF : F l μ ν φ + = ∑ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + φ (GaugeAlgebra.stdBasis c) • F l μ ν (GaugeAlgebra.stdBasis.coord c) := by + conv_lhs => rw [← GaugeAlgebra.stdBasis.sum_dual_apply_smul_coord φ] + rw [map_sum] + exact Finset.sum_congr rfl fun c _ => map_smul _ _ _ + rw [hF] + refine Submodule.sum_mem _ fun c _ => ?_ + exact Submodule.mem_iSup_of_mem c + (Submodule.smul_of_tower_mem _ _ (Submodule.mem_span_singleton_self _)) + +/-! + +## B. Sums over tuples of covector indices + +A Lorentz family is indexed by a tuple of covector indices, while the transformation law +of `IsGaugeSector` presents its sums one index at a time. These three lemmas turn a sum +over tuples into an iterated sum and back. + +-/ + +/-- A sum over families of one covector index is a single sum. -/ +lemma sum_cov_one {M : Type*} [AddCommMonoid M] (f : (Fin 1 → Fin 1 ⊕ Fin 3) → M) : + ∑ d : Fin 1 → Fin 1 ⊕ Fin 3, f d = ∑ x : Fin 1 ⊕ Fin 3, f ![x] := + Fintype.sum_equiv (Equiv.funUnique (Fin 1) (Fin 1 ⊕ Fin 3)) _ _ fun d => by + congr 1 + funext i + fin_cases i + simp + +/-- A sum over families of two covector indices is a double sum. -/ +lemma sum_cov_two {M : Type*} [AddCommMonoid M] (f : (Fin 2 → Fin 1 ⊕ Fin 3) → M) : + ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, f d + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, f ![x, y] := by + rw [show (∑ d : Fin 2 → Fin 1 ⊕ Fin 3, f d) + = ∑ p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), f ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin 1 ⊕ Fin 3) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +/-- A sum over families of three covector indices is a triple sum. -/ +lemma sum_cov_three {M : Type*} [AddCommMonoid M] (f : (Fin 3 → Fin 1 ⊕ Fin 3) → M) : + ∑ d : Fin 3 → Fin 1 ⊕ Fin 3, f d + = ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ∑ z : Fin 1 ⊕ Fin 3, f ![x, y, z] := by + rw [show (∑ d : Fin 3 → Fin 1 ⊕ Fin 3, f d) + = ∑ p : (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3) × (Fin 1 ⊕ Fin 3), + f ![p.1, p.2.1, p.2.2] from + Fintype.sum_equiv + { toFun := fun d => (d 0, d 1, d 2) + invFun := fun p => ![p.1, p.2.1, p.2.2] + left_inv := fun d => by funext i; fin_cases i <;> simp + right_inv := fun p => by simp } _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp] + simp only [Fintype.sum_prod_type] + +/-! + +## C. The field-strength symbols as Lorentz families + +An underived field-strength symbol carries two covector indices and nothing else, and a +once-derived one carries three, its derivative slot included. Read as families indexed by +those indices they are a bi-Lorentz and a triple Lorentz tensor, the transformation law +of `IsGaugeSector` moving every index by the Lorentz matrix of the `SL(2,ℂ)` element. + +-/ + +include h in +/-- An underived field-strength symbol, viewed as a family indexed by its two covector + indices, is a bi-Lorentz tensor. -/ +lemma isBiLorentz_F_underived (φ : Module.Dual ℝ GaugeAlgebra) : + IsBiLorentz B repLorentz + (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => F ![] (d 0) (d 1) φ) where + repLorentz_T g l := by + rw [h.repLorentz_F g 0 ![] (l 0) (l 1) φ, + Finset.sum_eq_single (![] : Fin 0 → Fin 1 ⊕ Fin 3) + (fun b _ hb => absurd (Subsingleton.elim b ![]) hb) + (fun hb => absurd (Finset.mem_univ _) hb), + Fin.prod_univ_zero, one_smul, sum_cov_two] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [Finset.smul_sum] + refine Finset.sum_congr rfl fun y _ => ?_ + rw [smul_smul] + simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + +include h in +/-- A once-derived field-strength symbol, viewed as a family indexed by its derivative + slot and its two covector indices, is a triple Lorentz tensor. -/ +lemma isTriLorentz_F_deriv_one (φ : Module.Dual ℝ GaugeAlgebra) : + IsTriLorentz B repLorentz + (fun d : Fin 3 → Fin 1 ⊕ Fin 3 => F ![d 0] (d 1) (d 2) φ) where + repLorentz_T g l := by + rw [h.repLorentz_F g 1 ![l 0] (l 1) (l 2) φ, sum_cov_one, sum_cov_three] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [Finset.smul_sum] + refine Finset.sum_congr rfl fun y _ => ?_ + rw [smul_smul, Finset.smul_sum] + refine Finset.sum_congr rfl fun z _ => ?_ + rw [smul_smul] + simp only [Fin.prod_univ_one, Fin.prod_univ_three, Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons] + +/-! + +## D. The vanishing of the metric trace of an antisymmetric family + +Two covector indices admit a single invariant contraction, the metric trace, and the +metric is diagonal, so that trace is the sum of the components on the diagonal. A family +antisymmetric in its two indices has every diagonal component equal to its own negative, +hence zero, and the trace vanishes with them. + +-/ + +/-- The metric trace of a bi-Lorentz family antisymmetric in its two indices vanishes: + the metric is diagonal, and the diagonal components of such a family are zero. -/ +lemma metricContraction_eq_zero_of_antisymm {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hswap : ∀ x y : Fin 1 ⊕ Fin 3, T ![y, x] = - T ![x, y]) : + IsBiLorentz.metricContraction (T := T) = 0 := by + rw [IsBiLorentz.metricContraction] + refine Finset.sum_eq_zero fun d _ => ?_ + rcases eq_or_ne (d 0) (d 1) with heq | hne + · have hs := hswap (d 0) (d 1) + rw [heq] at hs + have hexp : (![d 1, d 1] : Fin 2 → Fin 1 ⊕ Fin 3) = d := by + funext i + fin_cases i <;> simp [heq] + rw [hexp] at hs + have htwo : (2 : ℂ) • T d = 0 := by + rw [two_smul] + exact add_eq_zero_iff_eq_neg.2 hs + rw [show T d = 0 from by simpa using htwo, smul_zero] + · rw [show IsQuadLorentz.etaZ (d 0) (d 1) = 0 from by simp [IsQuadLorentz.etaZ, hne]] + simp + +/-! + +## E. Peeling Lorentz spans off a stable submodule + +Both classifications come in a form relative to a Lorentz-stable submodule `S`: an +invariant of the span of a family together with `S` is a contraction of the family up to +a remainder in `S`. When the contraction vanishes, or when there is none, the invariant +lies in `S` outright. The spans themselves are Lorentz stable, so a finite join of them +can be peeled one summand at a time, each step enlarging `S` by the summands not yet +peeled. + +-/ + +/-- The span of the components of a bi-Lorentz family is stable under the Lorentz group: + each component goes to a combination of components. -/ +lemma isBiLorentz_span_stable {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : IsBiLorentz B repLorentz T) (g : SL(2,ℂ)) {y : B} (hy : y ∈ hT.span) : + repLorentz g y ∈ hT.span := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [map_smul, hT.repLorentz_T g d] + exact Submodule.smul_mem _ _ (Submodule.sum_mem _ fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + +/-- The span of the components of a triple Lorentz family is stable under the Lorentz + group. -/ +lemma isTriLorentz_span_stable {T : (Fin 3 → Fin 1 ⊕ Fin 3) → B} + (hT : IsTriLorentz B repLorentz T) (g : SL(2,ℂ)) {y : B} (hy : y ∈ hT.span) : + repLorentz g y ∈ hT.span := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun d _ => ?_ + rw [map_smul, hT.repLorentz_T g d] + exact Submodule.smul_mem _ _ (Submodule.sum_mem _ fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _))) + +/-- A Lorentz invariant of the span of a bi-Lorentz family with vanishing metric trace, + together with a Lorentz-stable submodule, already lies in that submodule. -/ +lemma mem_of_lorentz_invariant_isBiLorentz_span_sup {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : IsBiLorentz B repLorentz T) + (hzero : IsBiLorentz.metricContraction (T := T) = 0) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ hT.span ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + obtain ⟨a, y, hy, hxy⟩ := + hT.exists_smul_metricContraction_of_invariant_subset S hS hx hinv + rwa [hxy, hzero, smul_zero, zero_add] + +/-- Peeling a finite join of the spans of bi-Lorentz families with vanishing metric + traces off a Lorentz-stable submodule: a Lorentz invariant of the join together with + `S` lies in `S`. -/ +lemma mem_of_lorentz_invariant_biSup_isBiLorentz_span {ι : Type} [DecidableEq ι] + {T : ι → (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : ∀ i, IsBiLorentz B repLorentz (T i)) + (hzero : ∀ i, IsBiLorentz.metricContraction (T := T i) = 0) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (s : Finset ι) {x : B} + (hx : x ∈ (⨆ i ∈ s, (hT i).span) ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + induction s using Finset.induction_on generalizing x with + | empty => + rw [show (⨆ i ∈ (∅ : Finset ι), (hT i).span) = ⊥ from by simp, bot_sup_eq] at hx + exact hx + | insert a s ha ih => + rw [Finset.iSup_insert, sup_assoc] at hx + have hstab : ∀ g : SL(2,ℂ), ∀ y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S, + repLorentz g y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S := by + intro g y hy + have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) + ≤ Submodule.comap (repLorentz g) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + sup_le (iSup_le fun i => iSup_le fun hi => fun z hz => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem i + (Submodule.mem_iSup_of_mem hi (isBiLorentz_span_stable (hT i) g hz)))) + fun z hz => Submodule.mem_sup_right (hS g z hz) + exact key hy + exact ih (mem_of_lorentz_invariant_isBiLorentz_span_sup (hT a) (hzero a) _ hstab hx + hinv) hinv + +/-- Peeling a finite join of the spans of triple Lorentz families off a Lorentz-stable + submodule: three covector indices carry no invariant contraction at all, so a Lorentz + invariant of the join together with `S` lies in `S`. -/ +lemma mem_of_lorentz_invariant_biSup_isTriLorentz_span {ι : Type} [DecidableEq ι] + {T : ι → (Fin 3 → Fin 1 ⊕ Fin 3) → B} (hT : ∀ i, IsTriLorentz B repLorentz (T i)) + (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (s : Finset ι) + {x : B} (hx : x ∈ (⨆ i ∈ s, (hT i).span) ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + induction s using Finset.induction_on generalizing x with + | empty => + rw [show (⨆ i ∈ (∅ : Finset ι), (hT i).span) = ⊥ from by simp, bot_sup_eq] at hx + exact hx + | insert a s ha ih => + rw [Finset.iSup_insert, sup_assoc] at hx + have hstab : ∀ g : SL(2,ℂ), ∀ y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S, + repLorentz g y ∈ (⨆ i ∈ s, (hT i).span) ⊔ S := by + intro g y hy + have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) + ≤ Submodule.comap (repLorentz g) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + sup_le (iSup_le fun i => iSup_le fun hi => fun z hz => + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem i + (Submodule.mem_iSup_of_mem hi (isTriLorentz_span_stable (hT i) g hz)))) + fun z hz => Submodule.mem_sup_right (hS g z hz) + exact key hy + exact ih ((hT a).mem_of_invariant_of_mem_sup _ hstab hx hinv) hinv + +/-- A join over a finite index type is the join over its universal finite set. -/ +lemma iSup_eq_biSup_univ {ι : Type} [Fintype ι] (f : ι → Submodule ℂ B) : + ⨆ i, f i = ⨆ i ∈ (Finset.univ : Finset ι), f i := by simp + +/-! + +## F. Mass weight four + +Mass weight four is the underived field strength. At each of the twelve directions of the +standard basis of the gauge algebra it is a bi-Lorentz family, whose metric trace vanishes +by the antisymmetry of the field strength in its two covector indices, so section E peels +the twelve spans off and leaves nothing behind. No gauge hypothesis enters: the vanishing +holds at the colour and isospin directions just as at the hypercharge one. + +-/ + +include h in +/-- The metric trace of the underived field-strength symbols at a fixed direction of the + gauge algebra vanishes, the symbol being antisymmetric in its two covector indices. -/ +lemma metricContraction_F_underived_eq_zero (φ : Module.Dual ℝ GaugeAlgebra) : + IsBiLorentz.metricContraction + (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => F ![] (d 0) (d 1) φ) = 0 := + metricContraction_eq_zero_of_antisymm fun x y => by + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + exact h.F_antisymm ![] x y φ + +include h in +/-- The underived field strengths lie in the join, over the twelve directions of the + standard basis of the gauge algebra, of the spans of the bi-Lorentz families they + form. -/ +lemma derivSubmodule_zero_le_iSup_span : + h.derivSubmodule 0 ≤ ⨆ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + (h.isBiLorentz_F_underived (GaugeAlgebra.stdBasis.coord c)).span := by + rw [derivSubmodule] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le] + rintro x ⟨φ, rfl⟩ + rw [SetLike.mem_coe, Subsingleton.elim l ![]] + have hle : (⨆ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + ℂ ∙ F ![] μ ν (GaugeAlgebra.stdBasis.coord c)) + ≤ ⨆ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + (h.isBiLorentz_F_underived (GaugeAlgebra.stdBasis.coord c)).span := by + refine iSup_mono fun c => ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine Submodule.mem_iSup_of_mem ![μ, ν] ?_ + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + exact Submodule.mem_span_singleton_self _ + exact hle (F_mem_iSup_span_coord ![] μ ν φ) + +include h in +/-- Mass weight four carries no Lorentz invariant modulo a Lorentz-stable submodule: a + Lorentz invariant of `massWeightSubmodule 4 ⊔ S` lies in `S`. -/ +theorem mem_of_lorentz_invariant_massWeightSubmodule_four_sup (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 4 ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + refine mem_of_lorentz_invariant_biSup_isBiLorentz_span + (fun c => h.isBiLorentz_F_underived (GaugeAlgebra.stdBasis.coord c)) + (fun c => h.metricContraction_F_underived_eq_zero _) S hSL Finset.univ ?_ hinv + rw [h.massWeightSubmodule_four_eq] at hx + refine sup_le_sup_right ?_ S hx + rw [← iSup_eq_biSup_univ] + exact h.derivSubmodule_zero_le_iSup_span + +/-! + +## G. Mass weight six + +Mass weight six is the once-derived field strength, a triple Lorentz family at each +direction of the standard basis. Three covector indices carry no invariant contraction at +all, so `IsTriLorentz` needs no antisymmetry and no gauge input either: the twelve spans +peel off and the invariant is left in `S`. + +-/ + +/-- A family of one covector index is the tuple of its own entry. -/ +lemma etaExpand_cov_one (l : Fin 1 → Fin 1 ⊕ Fin 3) : ![l 0] = l := by + funext i + fin_cases i + rfl + +include h in +/-- The once-derived field strengths lie in the join, over the twelve directions of the + standard basis of the gauge algebra, of the spans of the triple Lorentz families they + form. -/ +lemma derivSubmodule_one_le_iSup_span : + h.derivSubmodule 1 ≤ ⨆ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + (h.isTriLorentz_F_deriv_one (GaugeAlgebra.stdBasis.coord c)).span := by + rw [derivSubmodule] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le] + rintro x ⟨φ, rfl⟩ + rw [SetLike.mem_coe] + have hle : (⨆ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + ℂ ∙ F l μ ν (GaugeAlgebra.stdBasis.coord c)) + ≤ ⨆ c : Fin 8 ⊕ Fin 3 ⊕ Fin 1, + (h.isTriLorentz_F_deriv_one (GaugeAlgebra.stdBasis.coord c)).span := by + refine iSup_mono fun c => ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine Submodule.mem_iSup_of_mem ![l 0, μ, ν] ?_ + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, etaExpand_cov_one] + exact Submodule.mem_span_singleton_self _ + exact hle (F_mem_iSup_span_coord l μ ν φ) + +include h in +/-- Mass weight six carries no Lorentz invariant modulo a Lorentz-stable submodule: a + Lorentz invariant of `massWeightSubmodule 6 ⊔ S` lies in `S`. -/ +theorem mem_of_lorentz_invariant_massWeightSubmodule_six_sup (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 6 ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + refine mem_of_lorentz_invariant_biSup_isTriLorentz_span + (fun c => h.isTriLorentz_F_deriv_one (GaugeAlgebra.stdBasis.coord c)) + S hSL Finset.univ ?_ hinv + rw [h.massWeightSubmodule_six_eq] at hx + refine sup_le_sup_right ?_ S hx + rw [← iSup_eq_biSup_univ] + exact h.derivSubmodule_one_le_iSup_span + +/-! + +## H. The classification below mass weight eight + +The seven weights between zero and eight are now settled: weights one, two, three, five +and seven are trivial submodules, weight four is section F and weight six section G. So +between weight zero and weight eight there is no invariant beyond what `S` already +supplies, and the equivalence records it. + +The lower bound `0 < w` cannot be dropped. Weight zero contains the scalars by +`one_le_massWeightSubmodule_zero`, and `1` is fixed by both groups, the two +representations being multiplicative, without lying in any given `S`. + +-/ + +include h in +/-- Between mass weight zero and mass weight eight there is no Lorentz invariant: a + Lorentz invariant of `massWeightSubmodule w ⊔ S` for `0 < w < 8` lies in `S`. The five + odd or small weights are trivial submodules, and weights four and six are sections F + and G. -/ +theorem mem_of_lorentz_invariant_massWeightSubmodule_lt_eight_sup (w : ℕ) (hw0 : 0 < w) + (hw : w < 8) (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule w ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + interval_cases w + · rwa [h.massWeightSubmodule_one_eq, bot_sup_eq] at hx + · rwa [h.massWeightSubmodule_two_eq, bot_sup_eq] at hx + · rwa [h.massWeightSubmodule_three_eq, bot_sup_eq] at hx + · exact h.mem_of_lorentz_invariant_massWeightSubmodule_four_sup S hSL hx hinv + · rwa [h.massWeightSubmodule_five_eq, bot_sup_eq] at hx + · exact h.mem_of_lorentz_invariant_massWeightSubmodule_six_sup S hSL hx hinv + · rwa [h.massWeightSubmodule_seven_eq, bot_sup_eq] at hx + +set_option linter.unusedVariables false in +/-- The classification below mass weight eight as an equivalence, in the shape of + `mem_massWeightSubmodule_eight_sup_and_gauge_lorentz_invariant_iff`: an element of + `massWeightSubmodule w ⊔ S` for `0 < w < 8` is fixed by both groups exactly when it is + itself an element of `S` fixed by both groups. The span of invariants that the weight + eight statement leaves over is here the trivial one, so `x - y` lies in it exactly when + `x = y`. Gauge stability of `S` is not needed, and neither is gauge invariance of `x`: + the forward direction is + `mem_of_lorentz_invariant_massWeightSubmodule_lt_eight_sup`, which uses the Lorentz + group alone. -/ +theorem mem_massWeightSubmodule_lt_eight_sup_and_gauge_lorentz_invariant_iff (w : ℕ) + (hw0 : 0 < w) (hw : w < 8) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (x : B) : + (x ∈ h.massWeightSubmodule w ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) + ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) + ∧ x = y := by + constructor + · rintro ⟨hx, hG, hL⟩ + exact ⟨x, h.mem_of_lorentz_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw S hSL + hx hL, hG, hL, rfl⟩ + · rintro ⟨y, hyS, hyG, hyL, rfl⟩ + exact ⟨Submodule.mem_sup_right hyS, hyG, hyL⟩ + +set_option linter.unusedVariables false in +/-- The same classification without the existential: below mass weight eight an element + of `massWeightSubmodule w ⊔ S` fixed by both groups is an element of `S` fixed by both + groups, and conversely. -/ +theorem mem_massWeightSubmodule_lt_eight_sup_and_gauge_lorentz_invariant_iff_mem (w : ℕ) + (hw0 : 0 < w) (hw : w < 8) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (x : B) : + (x ∈ h.massWeightSubmodule w ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ (x ∈ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) := by + refine ⟨fun hx => ⟨h.mem_of_lorentz_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw + S hSL hx.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ + +end IsGaugeSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index 1646d0988..b0c5703f0 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -1760,6 +1760,77 @@ lemma repLorentz_iteratedCovDerivAdjoint_fieldStrength (fun b => (((SL2C.toLorentzGroup Λ).1 b ν : ℝ) : ℂ)) (fun b t => fieldStrength A a b t) (List.ofFn p) 0 φ] +/-! + +## The antisymmetry of the field strength + +The field strength is antisymmetric in its two covector indices as soon as the +symbols of the gauge field commute with one another in `B`: the two derivative terms +swap outright, and the commutator term swaps by the antisymmetry of the gauge-algebra +bracket, once the two factors of each product may be exchanged. The covariant tower +inherits the antisymmetry, the iterated covariant derivative being linear in the +family it differentiates. + +-/ + +/-- The bracket of two component families with commuting values is antisymmetric: in + the basis expansion the structure constants are antisymmetric in the two gauge + indices, and the two field factors of each term may be exchanged. -/ +lemma bracketFam_swap_of_commute {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hfg : ∀ φ ψ, Commute (f φ) (g ψ)) : + bracketFam g f = - bracketFam f g := by + refine LinearMap.ext fun φ => ?_ + rw [LinearMap.neg_apply, bracketFam_apply_eq_sum, bracketFam_apply_eq_sum] + set bv := Module.Free.chooseBasis ℝ GaugeAlgebra with hbv + have hstep : ∀ j k, φ ⁅bv j, bv k⁆ • (g (bv.coord j) * f (bv.coord k)) = + -(φ ⁅bv k, bv j⁆ • (f (bv.coord k) * g (bv.coord j))) := by + intro j k + rw [(hfg (bv.coord k) (bv.coord j)).eq, ← lie_skew (bv k) (bv j), map_neg, + neg_smul, neg_neg] + rw [Finset.sum_congr rfl fun j _ => Finset.sum_congr rfl fun k _ => hstep j k] + simp only [Finset.sum_neg_distrib] + exact congrArg Neg.neg Finset.sum_comm + +/-- The derived commutator term is antisymmetric in its two directions when the symbols + of the gauge field commute: swapping the two parts of the antidiagonal matches the + Leibniz convolution with the swapped one termwise. -/ +lemma commutatorFam_swap + (hA : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (A s μ ψ) (A s' μ' ψ')) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + commutatorFam A ν μ s = - commutatorFam A μ ν s := by + rw [commutatorFam, commutatorFam, + Multiset.sum_antidiagonal_swap s (fun a b => bracketFam (A a ν) (A b μ)), + ← Multiset.sum_map_neg''] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => + bracketFam_swap_of_commute fun φ ψ => hA _ _ _ _ _ _) + +/-- The field strength is antisymmetric in its two covector indices when the symbols of + the gauge field commute: the two derivative terms swap outright, the commutator term + by `commutatorFam_swap`. -/ +lemma fieldStrength_swap + (hA : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (A s μ ψ) (A s' μ' ψ')) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + fieldStrength A ν μ s = - fieldStrength A μ ν s := by + rw [fieldStrength, fieldStrength, commutatorFam_swap hA μ ν s] + abel + +/-- The iterated covariant derivative is odd in the family it differentiates: the case + of a one-element index in `iteratedCovDerivAdjoint_sum_fam`. -/ +lemma iteratedCovDerivAdjoint_neg_fam + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (l : List (Fin 1 ⊕ Fin 3)) (x : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + iteratedCovDerivAdjoint A l (fun t => - F t) x φ = + - iteratedCovDerivAdjoint A l F x φ := by + have h1 : (fun t => - F t) = fun t => ∑ _i : Fin 1, (-1 : ℂ) • F t := by + funext t + simp + rw [h1, iteratedCovDerivAdjoint_sum_fam (A := A) (fun _ : Fin 1 => (-1 : ℂ)) + (fun _ => F) l x φ] + simp + end IsGaugeField set_option linter.unusedVariables false @@ -2772,6 +2843,19 @@ noncomputable def covDerivFieldStrength (h : IsStandardModel B repJet repLorentz Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := IsGaugeField.iteratedCovDerivAdjoint A l (IsGaugeField.fieldStrength A μ ν) 0 +/-- The covariant tower of the field strength is antisymmetric in its two covector + indices: the field strength itself is (`IsGaugeField.fieldStrength_swap`, using that + the gauge-field symbols commute), and the iterated covariant derivative is odd in the + family it differentiates. -/ +lemma covDerivFieldStrength_swap (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + h.covDerivFieldStrength l ν μ φ = - h.covDerivFieldStrength l μ ν φ := by + rw [covDerivFieldStrength, covDerivFieldStrength, + show IsGaugeField.fieldStrength A ν μ = + fun t => - IsGaugeField.fieldStrength A μ ν t from + funext fun t => IsGaugeField.fieldStrength_swap h.A_comm_A μ ν t, + IsGaugeField.iteratedCovDerivAdjoint_neg_fam] + include h in /-- **Gauge covariance of the covariant derivatives of the field strength**: every derivative symbol of the tower transforms in the adjoint, with no inhomogeneous diff --git a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean index a8d3e38fa..a67c62bab 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean @@ -161,6 +161,14 @@ noncomputable def covF (h : IsStandardModel B repJet repLorentz massWeightPoly H (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := h.covDerivFieldStrength (List.ofFn l) μ ν +/-- The field-strength tower is antisymmetric in its two covector indices: the + ordered-tuple indexing of `covDerivFieldStrength_swap`. -/ +lemma covF_swap (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + d bard u baru Q barQ L barL e bare) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + h.covF l ν μ φ = - h.covF l μ ν φ := + h.covDerivFieldStrength_swap (List.ofFn l) μ ν φ + /-- The covariant generators of the Standard Model: the field-strength tower, the Higgs towers and their conjugates, and the ten fermion towers and their conjugates. -/ def covGenerators (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A @@ -2333,7 +2341,8 @@ theorem isCovStandardModel : repLorentz_F := h.repLorentz_covF massWeight_F := fun {_n} l μ ν φ => h.massWeight_covF l μ ν φ F_comm_F := fun {_n _m} l μ ν ψ l' μ' ν' ψ' => - h.covF_comm_covF l l' μ ν μ' ν' ψ ψ' } + h.covF_comm_covF l l' μ ν μ' ν' ψ ψ' + F_antisymm := fun {_n} l μ ν φ => h.covF_swap l μ ν φ } isFermionSector := { repGauge_d := fun g i {_n} l φ => h.repGlobal_covDerivD g i l φ repGauge_bard := fun g i {_n} l φ => h.repGlobal_covDerivBarD g i l φ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean new file mode 100644 index 000000000..2235504bb --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean @@ -0,0 +1,471 @@ +/- +Copyright (c) 2026 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.LorentzGroup.Invariants.IsQuadLorentz +public meta import Mathlib.Data.Fintype.Sum +public meta import Mathlib.Data.Fintype.Pi +/-! +# Lorentz invariants of three four-vector indices + +`IsTriLorentz repLorentz T` says that a family `T`, indexed by three four-vector +indices and valued in a module `B` carrying a representation of `SL(2,ℂ)`, transforms +as a tensor `T^{μ₁ μ₂ μ₃}`. + +Three indices admit no invariant contraction at all: the metric ties two indices and the +Levi-Civita symbol four, so an odd number of indices can be tied by neither. The main +theorem `eq_zero_of_invariant` says accordingly that every Lorentz invariant in the span +of the components is zero. + +The proof needs neither the sieve nor the certificate polynomial of the two- and +four-index cases, because one axis already does all the work. Along a spatial axis the +four light-cone directions carry boost weights `2`, `-2`, `0` and `0`, and the two of +weight zero are the two directions transverse to both time and that axis. A light-cone +multi-index of total weight zero therefore has its `+2` and `-2` slots in bijection, so +an odd number of its three slots is transverse. The half turn about the axis is the +Lorentz transformation fixing time and the axis and negating the two transverse +directions, so it acts on such a multi-index by `(-1)` to an odd power, namely by `-1`. +An invariant has boost weight zero, hence is a combination of these multi-indices, hence +is negated by the half turn; being invariant it is also fixed by it, and so is zero. + +The section headings tell the story: the half turn about an axis and its sign on the +light-cone directions (A), triple Lorentz tensors and the span of their components (B), +the light-cone basis along one axis grading that span by boost weight (C), the +weight-zero part of a generator (D), the half turn negating every invariant (E), which +then also holds modulo a Lorentz-stable submodule (F). +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule + mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) + +/-! + +## A. The half turn about a spatial axis + +The half turn about the axis `i` is the rotation by `π` about it: it fixes time and the +axis itself and negates the two transverse directions. On the light-cone basis along the +same axis it is therefore diagonal, with sign `1` on the two directions of boost weight +`±2` and sign `-1` on the two transverse ones. + +-/ + +namespace SL2C + +/-- The half turn about the axis `i`: the rotation by `π` about the `i`-th spatial + axis, written in `SL(2,ℂ)`. -/ +noncomputable def halfTurn : Fin 3 → SL(2,ℂ) + | 0 => ⟨!![0, -Complex.I; -Complex.I, 0], by + rw [Matrix.det_fin_two_of] + simp [Complex.I_mul_I]⟩ + | 1 => ⟨!![0, -1; 1, 0], by + rw [Matrix.det_fin_two_of] + simp⟩ + | 2 => ⟨!![-Complex.I, 0; 0, Complex.I], by + rw [Matrix.det_fin_two_of] + simp [Complex.I_mul_I]⟩ + +/-- The matrix entries of the half turn about the `x`-axis. -/ +@[simp] lemma halfTurn_zero_apply (j k : Fin 2) : + (halfTurn 0).1 j k = (!![0, -Complex.I; -Complex.I, 0]) j k := rfl + +/-- The matrix entries of the half turn about the `y`-axis. -/ +@[simp] lemma halfTurn_one_apply (j k : Fin 2) : + (halfTurn 1).1 j k = (!![0, -1; 1, 0] : Matrix (Fin 2) (Fin 2) ℂ) j k := rfl + +/-- The matrix entries of the half turn about the `z`-axis. -/ +@[simp] lemma halfTurn_two_apply (j k : Fin 2) : + (halfTurn 2).1 j k = (!![-Complex.I, 0; 0, Complex.I]) j k := rfl + +/-- The Lorentz matrix of the half turn about the axis `i` is diagonal: it fixes the + time direction and the axis, and negates the two transverse directions. -/ +lemma toLorentzGroup_halfTurn_apply (i : Fin 3) (a b : Fin 1 ⊕ Fin 3) : + (toLorentzGroup (halfTurn i)).1 a b = + if a = b then (if b = Sum.inl 0 ∨ b = Sum.inr i then 1 else -1) else 0 := by + refine Complex.ofReal_injective ?_ + rw [toLorentzGroup_eq_trace, PauliMatrix.trace_pauliSelfAdjoint'_mul_apply] + fin_cases i <;> + rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + simp [PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, Matrix.mul_apply, + Matrix.conjTranspose_apply, Fin.sum_univ_two, Complex.ext_iff] + +end SL2C + +/-- The sign by which the half turn about an axis acts on each of the four light-cone + directions along that axis: `1` on the two of boost weight `±2`, `-1` on the two + transverse ones. -/ +def lightConeSign (κ : Fin 4) : ℤ := if κ = 0 ∨ κ = 1 then 1 else -1 + +/-- The half turn about the axis `i` acts on each light-cone direction along that axis + by its sign. -/ +lemma sum_halfTurn_lightConeCoeff (i : Fin 3) (κ : Fin 4) (ν : Fin 1 ⊕ Fin 3) : + ∑ μ : Fin 1 ⊕ Fin 3, lightConeCoeff i κ μ * + (((SL2C.toLorentzGroup (SL2C.halfTurn i)).1 ν μ : ℝ) : ℂ) + = ((lightConeSign κ : ℤ) : ℂ) * lightConeCoeff i κ ν := by + simp only [SL2C.toLorentzGroup_halfTurn_apply] + rcases ν with a | j + · rw [Subsingleton.elim a 0] + fin_cases i <;> fin_cases κ <;> + simp [lightConeCoeff, lightConeSign, Fintype.sum_sum_type] + · fin_cases i <;> fin_cases j <;> fin_cases κ <;> + simp [lightConeCoeff, lightConeSign, Fintype.sum_sum_type] + +/-- The scalar behind the action of the half turn on a light-cone multi-index: the half + turn acts slot by slot, so the product of the per-slot signs factors out. -/ +lemma sum_prod_halfTurn_lightConeCoeff (i : Fin 3) {n : ℕ} (c : Fin n → Fin 4) + (a : Fin n → Fin 1 ⊕ Fin 3) : + ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.halfTurn i)).1 (a j) (d j) : ℝ) : ℂ)) + = ((∏ j, lightConeSign (c j) : ℤ) : ℂ) * ∏ j, lightConeCoeff i (c j) (a j) := by + calc ∑ d : Fin n → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.halfTurn i)).1 (a j) (d j) : ℝ) : ℂ)) + = ∑ d : Fin n → Fin 1 ⊕ Fin 3, ∏ j, (lightConeCoeff i (c j) (d j) * + (((SL2C.toLorentzGroup (SL2C.halfTurn i)).1 (a j) (d j) : ℝ) : ℂ)) := + Finset.sum_congr rfl fun d _ => (Finset.prod_mul_distrib).symm + _ = ∏ j, ∑ μ : Fin 1 ⊕ Fin 3, (lightConeCoeff i (c j) μ * + (((SL2C.toLorentzGroup (SL2C.halfTurn i)).1 (a j) μ : ℝ) : ℂ)) := by + rw [Finset.prod_univ_sum, Fintype.piFinset_univ] + _ = ∏ j, (((lightConeSign (c j) : ℤ) : ℂ) * lightConeCoeff i (c j) (a j)) := + Finset.prod_congr rfl fun j _ => sum_halfTurn_lightConeCoeff i (c j) (a j) + _ = (∏ j, ((lightConeSign (c j) : ℤ) : ℂ)) * ∏ j, lightConeCoeff i (c j) (a j) := + Finset.prod_mul_distrib + _ = ((∏ j, lightConeSign (c j) : ℤ) : ℂ) * ∏ j, lightConeCoeff i (c j) (a j) := by + push_cast + rfl + +/-- A light-cone multi-index of three slots and total boost weight zero has an odd + number of transverse slots, so the half turn acts on it by `-1`. -/ +lemma prod_lightConeSign_of_sum_lightConeWeight_eq_zero (c : Fin 3 → Fin 4) + (hc : (∑ j, lightConeWeight (c j)) = 0) : ∏ j, lightConeSign (c j) = -1 := by + revert c + decide + +/-! + +## B. Triple Lorentz tensors and the span of their components + +The hypothesis on the family and the space its components span, which is where the +invariants to be classified live. + +-/ + +/-- A family `T` of elements of `B`, indexed by three four-vector indices, transforms as + a tensor `T^{μ₁ μ₂ μ₃}` under the representation `repLorentz` of `SL(2,ℂ)`. -/ +structure IsTriLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin 3 → (Fin 1 ⊕ Fin 3)) → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin 3 → Fin 1 ⊕ Fin 3), + (∏ (i : Fin 3), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a + +namespace IsTriLorentz +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 3 → (Fin 1 ⊕ Fin 3)) → B} + (hT : IsTriLorentz B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsTriLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- The span of the components is exactly the set of linear combinations of them. -/ +lemma mem_span_iff (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 3 → (Fin 1 ⊕ Fin 3)) → ℂ), x = ∑ d, c d • T d := by + constructor + · intro hx + rw [span] at hx + refine Submodule.iSup_induction + (motive := fun y => ∃ c : (Fin 3 → (Fin 1 ⊕ Fin 3)) → ℂ, y = ∑ d, c d • T d) + (fun d => ℂ ∙ T d) hx ?_ ?_ ?_ + · intro d y hy + obtain ⟨a, rfl⟩ := Submodule.mem_span_singleton.1 hy + refine ⟨fun e => if e = d then a else 0, ?_⟩ + simp [ite_smul, Finset.sum_ite_eq'] + · exact ⟨0, by simp⟩ + · rintro y z ⟨c₁, rfl⟩ ⟨c₂, rfl⟩ + exact ⟨c₁ + c₂, by simp [add_smul, Finset.sum_add_distrib]⟩ + · rintro ⟨c, rfl⟩ + exact sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-! + +## C. The light-cone basis along one axis + +Along a spatial axis `i` the coordinate components recombine into the light-cone +components `lightCone i c`, which span the same space, are homogeneous of boost weight +`∑ j, lightConeWeight (c j)`, and are negated by the half turn about the axis exactly +when an odd number of their slots is transverse. + +-/ + +/-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ +noncomputable def lightCone (hT : IsTriLorentz B repLorentz T) (i : Fin 3) + (c : Fin 3 → Fin 4) : B := + ∑ d : Fin 3 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (d j)) • T d + +/-- Each light-cone component lies in the span of the coordinate components. -/ +lemma lightCone_mem_span (i : Fin 3) (c : Fin 3 → Fin 4) : hT.lightCone i c ∈ hT.span := + sum_mem fun d _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem d (Submodule.mem_span_singleton_self _)) + +/-- Each generator is recovered from the light-cone components along any axis. -/ +lemma eq_sum_lightCone (i : Fin 3) (d : Fin 3 → Fin 1 ⊕ Fin 3) : + T d = ∑ c : Fin 3 → Fin 4, + (∏ j, lightConeCoeffInv i (d j) (c j)) • hT.lightCone i c := by + calc T d = ∑ e : Fin 3 → Fin 1 ⊕ Fin 3, + (∑ c : Fin 3 → Fin 4, (∏ j, lightConeCoeffInv i (d j) (c j)) * + (∏ j, lightConeCoeff i (c j) (e j))) • T e := by + simp only [sum_prod_lightConeCoeffInv, ite_smul, one_smul, zero_smul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + _ = _ := by + simp only [lightCone, Finset.smul_sum, smul_smul, Finset.sum_smul] + rw [Finset.sum_comm] + +/-- The light-cone components along any axis span the same space as the components. -/ +lemma span_eq_lightCone (hT : IsTriLorentz B repLorentz T) (i : Fin 3) : + hT.span = ⨆ c, ℂ ∙ hT.lightCone i c := by + rw [span] + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun c => ?_) + · rw [Submodule.span_singleton_le_iff_mem, hT.eq_sum_lightCone i d] + exact sum_mem fun c _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem c (Submodule.mem_span_singleton_self _)) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.lightCone_mem_span i c + +/-- The light-cone components are boost eigenvectors: along axis `i` the component at + `c` has boost weight the total light-cone weight of `c`. -/ +lemma lightCone_mem_boostWeightSubmodule (i : Fin 3) (c : Fin 3 → Fin 4) : + hT.lightCone i c ∈ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by + refine mem_boostWeightSubmodule.2 fun t ht => ?_ + have hstep : ∀ x : Fin 3 → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) + = ∑ a : Fin 3 → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + intro x + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) + = ∑ x : Fin 3 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.boostAxis i t ht) (T x) := by + simp only [lightCone, map_sum, map_smul] + _ = ∑ a : Fin 3 → Fin 1 ⊕ Fin 3, + (∑ x : Fin 3 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 3 → Fin 1 ⊕ Fin 3, (((t : ℝ) : ℂ) ^ (∑ j, lightConeWeight (c j)) * + (∏ j, lightConeCoeff i (c j) (a j))) • T a := by + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + exact sum_prod_lightConeCoeff i c a ht + _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by + rw [show (algebraMap ℝ ℂ) t = ((t : ℝ) : ℂ) from rfl, lightCone, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-- The half turn about the axis `i` acts on the light-cone component at `c` by the + product of the signs of its slots. -/ +lemma repLorentz_halfTurn_lightCone (i : Fin 3) (c : Fin 3 → Fin 4) : + repLorentz (SL2C.halfTurn i) (hT.lightCone i c) + = ((∏ j, lightConeSign (c j) : ℤ) : ℂ) • hT.lightCone i c := by + have hstep : ∀ x : Fin 3 → Fin 1 ⊕ Fin 3, + (∏ j, lightConeCoeff i (c j) (x j)) • repLorentz (SL2C.halfTurn i) (T x) + = ∑ a : Fin 3 → Fin 1 ⊕ Fin 3, + ((∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.halfTurn i)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + intro x + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz (SL2C.halfTurn i) (hT.lightCone i c) + = ∑ x : Fin 3 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) • + repLorentz (SL2C.halfTurn i) (T x) := by + simp only [lightCone, map_sum, map_smul] + _ = ∑ a : Fin 3 → Fin 1 ⊕ Fin 3, + (∑ x : Fin 3 → Fin 1 ⊕ Fin 3, (∏ j, lightConeCoeff i (c j) (x j)) * + (∏ j, (((SL2C.toLorentzGroup (SL2C.halfTurn i)).1 (a j) + (x j) : ℝ) : ℂ))) • T a := by + simp only [hstep] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + _ = ∑ a : Fin 3 → Fin 1 ⊕ Fin 3, (((∏ j, lightConeSign (c j) : ℤ) : ℂ) * + (∏ j, lightConeCoeff i (c j) (a j))) • T a := + Finset.sum_congr rfl fun a _ => by + rw [sum_prod_halfTurn_lightConeCoeff i c a] + _ = ((∏ j, lightConeSign (c j) : ℤ) : ℂ) • hT.lightCone i c := by + rw [lightCone, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => (smul_smul _ _ _).symm + +/-! + +## D. The weight-zero part of a generator + +Each generator `T e` is the sum of its boost-weight components `monoComponent i e m`, +and an element of the span of weight zero along the axis `i` is the corresponding +combination of the weight-zero ones alone. Those are built from light-cone multi-indices +of total weight zero, so the half turn about the axis negates them. + +-/ + +/-- The axis-`i` weight-`m` component of the generator `T e`: the weight-`m` partial + sum of `eq_sum_lightCone`. -/ +noncomputable def monoComponent (i : Fin 3) (e : Fin 3 → Fin 1 ⊕ Fin 3) (m : ℤ) : B := + ∑ c ∈ Finset.univ.filter (fun c : Fin 3 → Fin 4 => (∑ s, lightConeWeight (c s)) = m), + (∏ s, lightConeCoeffInv i (e s) (c s)) • hT.lightCone i c + +/-- The weight components are homogeneous of the stated weight. -/ +lemma monoComponent_mem_boostWeightSubmodule (i : Fin 3) (e : Fin 3 → Fin 1 ⊕ Fin 3) + (m : ℤ) : hT.monoComponent i e m ∈ boostWeightSubmodule repLorentz i m := by + refine sum_mem fun c hc => Submodule.smul_mem _ _ ?_ + exact (show (∑ s, lightConeWeight (c s)) = m from (Finset.mem_filter.1 hc).2) ▸ + hT.lightCone_mem_boostWeightSubmodule i c + +/-- The total light-cone weight of three slots is one of the seven even numbers between + `-6` and `6`. -/ +lemma sum_lightConeWeight_mem (c : Fin 3 → Fin 4) : + (∑ s, lightConeWeight (c s)) ∈ ({-6, -4, -2, 0, 2, 4, 6} : Finset ℤ) := by + revert c + decide + +/-- A component is the sum of its weight components over the seven possible weights. -/ +lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 3 → Fin 1 ⊕ Fin 3) : + T e = ∑ m ∈ ({-6, -4, -2, 0, 2, 4, 6} : Finset ℤ), hT.monoComponent i e m := by + rw [hT.eq_sum_lightCone i e] + exact (Finset.sum_fiberwise_of_maps_to (fun c _ => sum_lightConeWeight_mem c) _).symm + +include hT in +/-- The weight-zero round along one axis: an element of weight zero along axis `i` + expanded in the generators re-expands in their weight-zero components alone. -/ +lemma eq_sum_monoComponent_zero (i : Fin 3) {x : B} + (c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ) (hx : x = ∑ e, c e • T e) + (hw : x ∈ boostWeightSubmodule repLorentz i 0) : + x = ∑ e, c e • hT.monoComponent i e 0 := by + have hsum : x = ∑ m ∈ ({-6, -4, -2, 0, 2, 4, 6} : Finset ℤ), + ∑ e, c e • hT.monoComponent i e m := by + rw [hx] + calc ∑ e, c e • T e + = ∑ e, c e • ∑ m ∈ ({-6, -4, -2, 0, 2, 4, 6} : Finset ℤ), + hT.monoComponent i e m := + Finset.sum_congr rfl fun e _ => by rw [← hT.eq_sum_monoComponent_univ i e] + _ = _ := by + simp only [Finset.smul_sum] + exact Finset.sum_comm + exact eq_component_zero_of_mem_boostWeightSubmodule + (w := fun m => ∑ e, c e • hT.monoComponent i e m) hw + (fun m _ => sum_mem fun e _ => Submodule.smul_mem _ _ + (hT.monoComponent_mem_boostWeightSubmodule i e m)) + (by decide) hsum + +/-- The half turn about the axis `i` negates the weight-zero component of a generator: + every light-cone multi-index contributing to it has an odd number of transverse + slots. -/ +lemma repLorentz_halfTurn_monoComponent_zero (i : Fin 3) (e : Fin 3 → Fin 1 ⊕ Fin 3) : + repLorentz (SL2C.halfTurn i) (hT.monoComponent i e 0) = -hT.monoComponent i e 0 := by + rw [monoComponent, map_sum, ← neg_one_smul (R := ℂ), Finset.smul_sum] + refine Finset.sum_congr rfl fun c hc => ?_ + rw [map_smul, hT.repLorentz_halfTurn_lightCone i c, + prod_lightConeSign_of_sum_lightConeWeight_eq_zero c (Finset.mem_filter.1 hc).2, + smul_smul, smul_smul] + norm_num [mul_comm] + +/-! + +## E. The classification of the Lorentz invariants + +One axis suffices. An invariant has boost weight zero along it, so section D writes it +through the weight-zero components alone, and the half turn about that same axis negates +those. The invariant is therefore both fixed and negated by one Lorentz transformation, +and so is zero. + +-/ + +include hT in +/-- The classification of the Lorentz invariants: three four-vector indices carry no + invariant contraction, so every element of the span of the components fixed by the + Lorentz group is zero. -/ +theorem eq_zero_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by + obtain ⟨c, hc⟩ := (hT.mem_span_iff x).1 hx + have hw := mem_boostWeightSubmodule_zero_of_invariant (repLorentz := repLorentz) hinv + have h0 : x = ∑ e, c e • hT.monoComponent 2 e 0 := + hT.eq_sum_monoComponent_zero 2 c hc (hw 2) + have hneg : repLorentz (SL2C.halfTurn 2) x = -x := by + calc repLorentz (SL2C.halfTurn 2) x + = ∑ e, c e • repLorentz (SL2C.halfTurn 2) (hT.monoComponent 2 e 0) := by + conv_lhs => rw [h0] + rw [map_sum] + exact Finset.sum_congr rfl fun e _ => map_smul _ _ _ + _ = ∑ e, c e • -hT.monoComponent 2 e 0 := + Finset.sum_congr rfl fun e _ => by + rw [hT.repLorentz_halfTurn_monoComponent_zero 2 e] + _ = -x := by + rw [h0] + simp + have hself : x = -x := by + conv_lhs => rw [← hinv (SL2C.halfTurn 2)] + exact hneg + have htwo : (2 : ℂ) • x = 0 := by + rw [two_smul] + exact add_eq_zero_iff_eq_neg.2 hself + simpa using htwo + +/-! + +## F. The classification modulo a Lorentz-stable submodule + +A Lorentz-stable submodule can be divided out: the quotient representation carries the +images of the components as a triple Lorentz tensor again, so the classification applies +verbatim in the quotient and lifts to a classification modulo the submodule. The +quotient representation itself is the one built in `IsQuadLorentz`. + +-/ + +include hT in +/-- The images of the components in the quotient by a Lorentz-stable submodule again + form a triple Lorentz tensor. -/ +lemma isTriLorentz_quotRep (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + IsTriLorentz (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + (fun l => S.mkQ (T l)) where + repLorentz_T g l := by + rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +include hT in +/-- The classification of the Lorentz invariants modulo a stable submodule: an element + of the span of the components together with a Lorentz-stable submodule `S`, fixed by + the Lorentz group, already lies in `S`. -/ +lemma mem_of_invariant_of_mem_sup {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ hT.span ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hT' := hT.isTriLorentz_quotRep S hS + have hmk : S.mkQ x ∈ hT'.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hT'.mem_span_iff _).2 ⟨c, ?_⟩ + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero, hc, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + have hinv' : ∀ g : SL(2,ℂ), + quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := by + intro g + rw [quotRep_mkQ, hinv g] + have hzero := hT'.eq_zero_of_invariant hmk hinv' + rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + +end IsTriLorentz + +end Lorentz